Skip to content

[Grok/dsh 19] 排队、运行中干预与旁路提问 #151

Description

@Blackman99

Parent

#132

Ticket: 19

Status: ready-for-agent

User Stories: 19, 20, 21(见父规格)

What to build

用户在运行期间管理 Queue、按参考规则 Steer 当前回合,并通过支持的旁路提问查看答复而不污染主回合。

Acceptance criteria

  • 队列提交、编辑、删除、重排、立即发送与命令边界按参考行为;dsh 仅收到应执行的消息。
  • 干预在安全边界送达,未消费消息在取消/切换/结束时正确保留,不重复或遗失。
  • 旁路问题与主历史隔离;晚到回复、失败和关闭面板行为明确。
  • 交叉验证屏幕模式切换、待审批、完成通知与快速连续输入,适用文档/Changeset 同步。

Blocked by

Delivery contract

用户于2026-09-20批准当前测试与任务拆分。按父规格的已安装产物/真实终端和公开协议测试验收;实际实现须带适用的文档、Changeset及必要检查。ready-for-agent表示任务已定义,不表示前置任务已完成,也不授权自动开始本轮实施、购买付费资源或发布软件版本。

Activity

  1. self-assigned this
    on Sep 23, 2026
  2. Blackman99 commented on Sep 23, 2026

    @Blackman99
    OwnerAuthor

    按用户2026-09-20的实施授权领取 Ticket19 / #151;本次只记录领取,未启动实施工作者,也不表示已实现。已重新读取 #132 及全部80票正文/评论和实际 blocked-by(native 177 边,无截断,无第二页)。#142/#150/#152/#153 已在 rewrite/grok-dsh-20260920 集成并关闭;当前独立就绪且无人领取的票为 #143、#145、#147、#151、#156、#158、#159、#163、#171。本波并行领取前四张(#143、#145、#147、#151),未领取任何被阻塞后继(含 #175/#179/#202),也未领取本波未选的其他就绪票(#156/#158/#159/#163/#171)。

    实施必须从独立集成树精确基线 065170b46c44491f53abd6f21ed8ac438ba9906a 开始。前置 #137 与 #150 已关闭,同一提交已保留在 rewrite/grok-dsh-20260920;集成证据见 #137 (comment) 与 #150 (comment) 。

    范围按原验收:队列提交、编辑、删除、重排、立即发送与命令边界按参考行为,dsh 仅收到应执行的消息;干预在安全边界送达,未消费消息在取消/切换/结束时正确保留,不重复或遗失;旁路问题与主历史隔离,晚到回复、失败和关闭面板行为明确;交叉验证屏幕模式切换、待审批、完成通知与快速连续输入,适用文档/Changeset 同步。后续实施/审查子代理使用 My CPA - Grok 4.7 Fast(grk-4.7-build-fast,effort xhigh)。仅在实施、独立审查和集成验收通过后关闭。main、现有未跟踪文件及其他工作树不改动;不授权付费资源,#212仍须新的明确最终发布/默认切换批准。

  3. Blackman99 commented on Sep 23, 2026

    @Blackman99
    OwnerAuthor

    Ticket 19 / #151 未集成。隔离集成树 rewrite/grok-dsh-20260920 仍是 065170b46c44491f53abd6f21ed8ac438ba9906a。worker 工作树 /Users/zhaodongsheng/.grok/worktrees/my-projects-codsh/subagent-01a0ce48-f379-71e2-98d3-f2648ed713e4 的 HEAD 6c7f1300beb3cb400dcbe1a8ff1f30ae51fb18e9 是该基线的后代(9460954、936da73、8b58e1c、6c7f130)。四轮审查里前三轮双否;最后一轮对 6c7f130 是一否一过,不能当作批准。未 cherry-pick,未推送,未关闭。工作树保留。

    最后一轮拒绝(approved: false,观察到的 HEAD 与本控制器看到的一致)仍然成立。本控制器在 6c7f130 上核对了源码:

    1. Steer 与 /btw 不满足故事 20 和 21。prompt_queue.rs 的 submit 在 steer 分支以及 open_aside 都返回 Blocked,不调用 dsh;finish_aside 只在 cfg(test) 下存在。没有现场答复、失败或晚到回复。PTY 帧显示 steer 文本被丢弃,/btw 停在 not sent。参考行为是保留 steer 行并在下一个安全间隙注入,以及显示隔离的 /btw 答复。在有真实 ACP 路径之前,不要把这条提示当作功能完成。
    2. drain_follow_up_passes(rust/src/main.rs 约 5481 行)仍只跑 8 轮。成功的 ! 在 release_queued_follow_up 里不设置 release_deferred。八条本地命令之后的 prompt 或 slash 会留下。应在没有模型回合、且仍有未 hold 的行或 pending command 时继续释放,并补一条九行 drain 测试。
    3. 非 Apple 的 Ctrl+O 被文档和 is_send_now_key 注释写成 always-approve,但没有任何按键路径切换权限模式,该键落入 composer。参考行为是非 Apple Terminal 上 Ctrl+O 切换 always-approve,只在 Apple Terminal 上作为 send-now。要么接到现有权限切换并加断言,要么停止声称它会切换。
    4. run_local_shell(rust/src/main.rs 约 5672 行)在 UI 线程上调用 Command::output()。一条不退出的 ! 会卡住绘制、Ctrl+C 和后面的行。需要有界或脱离该进程,使取消仍然有响应。

    通过的那名审查者确认了队列 PTY、合并、窗格编辑、失败 shell hold 和 /minimal 恢复,但没有覆盖上面四条。未跑组合树测试。main 未改。#132 与 #212 不关闭。

  4. added a commit that references this issue on Sep 25, 2026
    e2b56a8
  5. Blackman99 commented on Sep 25, 2026

    @Blackman99
    OwnerAuthor

    已集成到 rewrite/grok-dsh-20260920:e2b56a8a6d5cbd7c6a5e0f25ef6e1dcf55ad9bb2(`feat(rust): queue, send-now, steer, and /btw side questions,基于 7f927ee 快进推送 7f927ee..e2b56a8`,未强推)。

    实现

    • 队列:运行中 Enter 入队(Queued N · next …),按顺序每回合执行一条;回合结束或 Ctrl+C 取消后排空,待审批、压缩中、行内编辑时保持等待,排空无上限。Ctrl+;/Ctrl+' 或空提示 ↑ 打开队列面板:e 原地编辑(Enter 保存、保存为空即删除、Esc 取消)、Enter 立即发送、x/Del 删除、Shift+J/K 重排。忙碌时输入的斜杠命令作为独立行排队(命令边界),/queue 只读列出。[ui] combine_queued_prompts 合并相邻纯文本行。
    • 立即发送 = 取消并发送:Ctrl+Enter/Ctrl+I(Apple Terminal 另加 Ctrl+O,VS Code 系用 Ctrl+L;其他终端不绑定 Ctrl+O),或空提示 Enter 发送队首;被取消回合不显示 [cancelled]。
    • Steer:[ui] follow_up_behavior = "steer" 时纯文本追问经私有控制通道真正送进 dsh 运行中的 agent(agent.steer,下一步边界生效)。通道为 0700 临时目录下的 Unix socket + 256 位一次性 token(常量时间比较,握手后 unlink,dsh 插件启动即从 process.env 删除,工具子进程拿不到)。dsh 报告 claimed/discarded;回合结束、会话销毁时未消费的 steer 从 inbox 收回并回到队列,不重复、不丢失;子代理不会冒充顶层 agent。
    • /btw:同一通道,由 dsh 插件用会话历史副本发起一次无工具模型请求,不写入会话;面板 Esc 关闭(加载中会取消请求),minimal 写入回看区,迟到答复丢弃,失败/断连显示错误;消息中间的 /btw 会被提取。
    • 帮助文本、README.md / README.zh.md、CONTEXT.md、.changeset/rust-queue-steer-btw.md 已同步。

    检查(Linux x86_64,Node 22.23.3)

    • pnpm run typecheck:通过

    • TMPDIR=/tmp pnpm test:85 个文件,2322 通过 / 1 失败。失败的是 scripts/reference-evidence.spec.mjs 的 5s 超时,在未改动的基线 7f927ee 前序(091da92)上同样失败,与本票无关。新增 scripts/rust-control.spec.mjs 9/9 通过。

    • cargo fmt --check:通过

    • cargo clippy --locked --workspace --all-targets --offline -- -D warnings:只剩 filesystem_sandbox.rs 中 Linux 下预先存在的 2 个错误(tail_marker 未使用、多余的 return),基线同样存在;本票代码在其余检查下无警告。

    • cargo test --locked --workspace --offline --no-fail-fast:codsh-rust 494 通过 / 2 失败(filesystem_sandbox 两个用例因 Linux Landlock 不能做网络隔离而拒绝,基线同样失败),以及 498 + 42 + 61 + 2 + 379 全部通过。privacy/voice 两个本地 HTTP 用例在负载下偶发失败,基线上同样偶发。

    • 已安装产物 PTY(npm pack + install + 暂存的原生候选 + 真实 dsh + mock 提供方,trace 校验 dsh 实际收到的内容):新增 scripts/rust-queue-pty-test.py 7 个场景全部通过:

      • 入队/重排/原地编辑/删除后按编辑顺序执行,被删行从未发送;
      • Ctrl+Enter 立即发送跑在旧队列行之前且无 [cancelled],空 Enter 发送队首;
      • steer 模式追问进入同一回合(4 次模型调用,最后一步看到追问),之后不再单独发送;
      • Ctrl+C 取消后队首只执行一次;
      • 待审批期间队列不被消费,拒绝后才执行;
      • 运行中 /minimal 保留队列,快速连续输入保持顺序;
      • /btw 为单独的 purpose=btw 无工具请求,主回合 trace 与后续回合历史都不含问题,Esc 关闭面板。

      已加入 test:rust:pty。rust-cancel-pty-test.py、rust-turn-pty-test.py(去掉 darwin 门槛在 Linux 运行)和 rust-subagent-pty-test.py 通过。

    未验证 / 说明

    • macOS 与 Windows 未运行;本次所有 PTY 都在 Linux 上跑。真实提供方未测,只用了无密钥 mock。
    • 「完成通知」:Rust 客户端目前没有完成通知功能,没有可交叉验证的对象。改为验证了回合完成后的排空和 minimal 下已完成回合的提交。
    • rust-prompt-pty-test.py 在 Linux 上因 CJK 折行断言失败,基线二进制上同样失败,与本票无关。

    main、npm 发布、默认 codsh 均未改动,也未发布任何版本。

    解除阻塞:#175(#170 已关闭)、#179(#142、#153 已关闭)。#202 仍被 #198 阻塞,#211 仍有其他前置。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions