Skip to content

fix: 插话按了就送达,修掉排到下下轮与快速连按丢字 - #6

Merged
better-er merged 1 commit into
mainfrom
fix/interjection-delivery
Oct 27, 2026
Merged

better-er merged 1 commit into
mainfrom
fix/interjection-delivery

Conversation

@better-er

Copy link
Copy Markdown
Owner

问题

开着暂停时,插话会出两种岔子。

  • 暂停开启后,有概率把插话排到下下条,而不是插进当前这一轮;连续快速多次插话时能稳定复现。
  • 连按得更快时会吞内容,几条插话只剩一条。

原因

  • 浏览器侧拦截挂在 paused 上,而 paused 只在暂停点挂着时为真,放行后立刻变假。
  • 草稿清空时机晚于发送,且以请求返回为准,不是按键时刻。
  • 无暂停点时没有队列,只能把消息交回 dsh 重放;而 dsh 的 InputActions.submit() 写死 submit("queue"),不读 busyEnter,重放一定进等待区。

改动

直接解决问题的:

  • 拦截改挂 enabled,开关开启期间常驻,暂停点在与不在一律问主机,不再由客户端状态猜。放行之后的空档里按回车也走主机,不再被 dsh 排到后面。
  • 按下回车时同步快照文字、发起附件序列化并把文字与图片移出输入框,之后打的内容属于下一条。请求在飞时的重复回车记 deferred,结束后用那时的草稿再走一遍;已交给在飞请求的附件记 claimedRef,同一批图不会被带两次。
  • 主机侧 release 分四种去处:有暂停点就放行并并入该步;无暂停点但在跑就入队,等下一个暂停点直接带走;空闲且有 agent 活引用就 followup 成新 turn;空闲但没有引用则返回未送达,由客户端暂存重试。
  • turn 在暂停点出现前结束时,队列由 agent/status 转 idle 时用 agent.followup() 补发,失败放回队列等下一次派发或暂停点再试。
  • 预放行:队列非空时跳过挂暂停点,直接并入本步;该步 reject 或 next() 抛错时把消息放回。暂停点放行后该步 reject 也对称放回。

顺带处理的:

  • 没送出去的文字与已序列化的图片进 unsentRef,下次按回车优先带出;附件序列化出错时文字仍可暂存,图片提示重新选择。
  • 状态收敛为 enabled、busy、pausePoint、pendingMessages 四个字段,isPaused 由 pausePoint 推出。waiting、pending、ReleaseRequest 分别改名为 pausePoint、pendingMessages、PausePoint。
  • 附件送出后调 conversation.releaseDraftAttachment 释放底层对象与预览 URL,避免每次带图插话都留一份。
  • 文件附件不支持插话,提示改为「已从输入框移除,请重新选择」,不再让用户以为文件还在。
  • composer 处于 adjudicating 或 submitting 时拒绝本次放行并提示稍后再按,避免清掉文字却移不走附件导致重复发送。
  • 找不到 [data-composer-card] 时在控制台告警一次,DSH 改了 composer 结构不会再静默失效。
  • 去掉插件自己的诊断日志,排查改用 dsh 会话日志与浏览器控制台。
  • peerDependencies 补齐实际用到的 dsh-client-connection、dsh-client-ui-conversation、dsh-client-ui-renderer、dsh-client-ui-slots、dsh-llm。
  • README 重写功能与使用节,版本升到 0.1.5。

测试

  • pnpm typecheck、pnpm test 53 项 4 个文件全过、pnpm build 通过。
  • 覆盖无暂停点排队、无引用时返回未送达、空闲有引用直接 followup、重复 idle 推送只补发一次、预放行并入、预放行抛错放回、暂停点放行后该步 reject 放回并补发、补发失败放回、图片经附件服务准入、参数校验、RPC 通道。
  • 浏览器侧已在 3000 tok/s 的假 API 上接入实测通过。回归要点:快速连按回车,多条插话按顺序送达且不并成一条;带图按回车后图片立刻从输入框消失。

兼容性

  • 依赖 dsh 的若干内部接口:serializeDraftAttachments 调用瞬间抓取附件、InputState 的 phase、data-composer-card、InputActions 的草稿动作。升级 dsh 时要复查,composer 标记缺失会打告警。
  • 关闭开关不清空已排队的插话,它们仍会在 turn 结束后作为新 turn 发出。
  • 文件附件仍不支持插话,会被移出输入框并提示重新选择。

检查清单

  • 类型检查
  • 单测
  • 构建与产物
  • 手工回归

@better-er
better-er merged commit 33dd2c3 into main Oct 27, 2026
1 check passed
@better-er
better-er deleted the fix/interjection-delivery branch October 27, 2026 15:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant