环境
- dsh-annotation 1.4.10(npm
@changfenhuang/dsh-annotation)
- 宿主 DSH 0.1.5-rc.2,macOS + Chrome
复现(100%)
- 在一个 agent 正在运行 的会话里(composer 处于 queue/steer 状态),划选助手回复的一段文字 → Annotate
- 输入框里输入文字(如「我做了两项标注(annotation),现在可以发送吗?」)
- 按 Enter
实际
消息发出(走宿主运行中会话的 agent/inbox/spliced 通道),但批注块不在消息里——会话日志(session.v3.jsonl)里该 user/message 的 text 只剩用户输入的文字,没有「我批注了以下 N 处内容…」块,模型自然无法按批注逐条回应。空闲会话同操作一切正常。
期望
批注块与输入的文字一起到达模型。
根因分析(读 1.4.10 client.js)
带文字的 onKeyDown 路径在 capture 阶段 attachAndSend → setDraft 后交回宿主(注释:「已有文字时交回 composer,保留宿主的 Queue / Steer 策略」)。宿主运行中走 accelerated 的 steerQueue 路径,且在 React 重渲染前读取草稿——capture 阶段写入的批注块不在它读到的状态里,整段被丢。纯批注的 Cmd/Ctrl+Enter 路径已经用 stopPropagation + submit('queue') 绕开了同一个宿主限制(运行中可正常送达),但带文字路径没有同样的处理。
本地 workaround(已验证送达)
带文字路径同样接管:attached 后 preventDefault + stopPropagation + submitAttached()(submit('queue')),空闲/运行中都能把「批注块+问题」作为一条消息发出。副作用是不再「保留宿主的 Queue/Steer 策略」,希望上游能以更干净的方式修(运行中接管,或让 steerQueue 路径读取 setDraft 之后的最新草稿)。
证据
会话日志事件:user/message text=「我做了两项标注(annotation),现在可以发送吗?」,同一时刻 agent/inbox/spliced target=next-turn,消息内无批注块。
环境
@changfenhuang/dsh-annotation)复现(100%)
实际
消息发出(走宿主运行中会话的
agent/inbox/spliced通道),但批注块不在消息里——会话日志(session.v3.jsonl)里该user/message的 text 只剩用户输入的文字,没有「我批注了以下 N 处内容…」块,模型自然无法按批注逐条回应。空闲会话同操作一切正常。期望
批注块与输入的文字一起到达模型。
根因分析(读 1.4.10 client.js)
带文字的 onKeyDown 路径在 capture 阶段
attachAndSend → setDraft后交回宿主(注释:「已有文字时交回 composer,保留宿主的 Queue / Steer 策略」)。宿主运行中走 accelerated 的 steerQueue 路径,且在 React 重渲染前读取草稿——capture 阶段写入的批注块不在它读到的状态里,整段被丢。纯批注的 Cmd/Ctrl+Enter 路径已经用stopPropagation + submit('queue')绕开了同一个宿主限制(运行中可正常送达),但带文字路径没有同样的处理。本地 workaround(已验证送达)
带文字路径同样接管:
attached后preventDefault + stopPropagation + submitAttached()(submit('queue')),空闲/运行中都能把「批注块+问题」作为一条消息发出。副作用是不再「保留宿主的 Queue/Steer 策略」,希望上游能以更干净的方式修(运行中接管,或让 steerQueue 路径读取 setDraft 之后的最新草稿)。证据
会话日志事件:
user/messagetext=「我做了两项标注(annotation),现在可以发送吗?」,同一时刻agent/inbox/splicedtarget=next-turn,消息内无批注块。