Skip to content

[Grok/dsh 44] 监控事件与会话唤醒 #176

Description

@Blackman99

Parent

#132

Ticket: 44

Status: ready-for-agent

User Stories: 46, 47(见父规格)

What to build

用户运行监控脚本,状态变化以受控事件到达正确会话,并能检查、停止及诊断监控。

Acceptance criteria

  • 按参考处理事件来源、输出保留、超时、持续监控和手动停止,明确会话归属。
  • 高频输出、脚本失败、事件同时到达、用户输入与唤醒竞争不造成无限回合或通知重复。
  • 监控结束与任务视图/状态行一致,异常即时可见;不默认产生未说明的额外提供商调用。
  • 用真实监控进程和受控状态变化验证完整行为与清理,并补齐文档和发布元数据。

Blocked by

Delivery contract

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

Activity

  1. Blackman99 commented on Sep 25, 2026

    @Blackman99
    OwnerAuthor

    已实现并推送到 rewrite/grok-dsh-20260920:ab67660 (已 rebase 到 #190、#205 之上,两边改动都保留)。

    内容

    • 新增 dsh 插件 rust-acp-monitor.mjs:模型侧 monitor 工具,名称、参数、描述、上限与文案按参考实现(pinned source rev e8563f8 的 grok-build monitor)对齐:timeout_ms 默认/上限 36,000,000,超过上限必须 persistent;200ms 轮询、行裁剪、500/3000 字节截断、1 MiB 缓冲;令牌桶 10 个、每 2s 补 1 个、抑制提示;连续抑制 30s 自动停止;<monitor-event> 包装与多事件分组格式;用户停止提示 “This task was killed by the user — do not restart it.”。
    • 执行仍由 dsh 负责:脚本经 dsh bash 执行器启动(会话沙箱、工作目录、托管环境),权限门按 bash 调用处理,并注册为 ctx.jobs 的 monitor 任务,因此 job_output/job_list/job_kill 可用,会话结束时随之停止;退出由 dsh 自身的完成通知报告一次。
    • 唤醒:空闲会话按事件唤醒,沿用 dsh “无用户消息最多连续 3 次唤醒”的预算;忙碌时仅在有工具调用运行(或其他消息本来就会延长该轮)时把事件并入下一步,模型正在写回答时到达的事件先暂存,轮次结束后合并为一次唤醒(取消后则等待下一条用户消息),避免事件造成预算外的模型请求。
    • Rust 客户端:◎ Monitor event · … 记录轮次(同一步领取的多条通知合并到一个轮次,回放一致)、状态行 “N monitor(s)”、任务面板 “Commands and monitors” 行(超时/persistent、事件数)与 x 停止、开始/结束提示、/new/切换/退出的停止提示。
    • 与参考实现的差异(已在代码与文档中注明):刷屏自动停止时同时结束进程;stderr 并入事件流;子代理不提供该工具;只在交互式客户端启用(CODSH_MONITOR=1),纯 -p、编辑器 ACP、共享服务器不提供。
    • 文档:帮助文本、README.md、README.zh.md、CONTEXT.md、changeset(codsh-cli minor、codsh-bundle minor)。

    验证(Linux,rebase 后重新运行)

    • pnpm run typecheck:通过。
    • TMPDIR=/tmp pnpm test:97 个文件中 95 通过、1 失败、1 跳过;2509 通过 / 1 失败 / 5 跳过。唯一失败是已知的 reference-evidence.spec 5s 超时,与本改动无关。新增 scripts/rust-monitor.spec.mjs 共 28 项全部通过,含真实 dsh + 无密钥 mock 模型的端到端用例(空闲唤醒次数、忙碌注入、超时、persistent + job_kill、上限报错、刷屏停止且不超过唤醒预算、任务面板停止、dsh 退出时进程被清理、未开启时不提供工具)。
    • cargo fmt --check:通过。
    • cargo clippy ... -D warnings:仅有已知的 2 个既有错误(tail_marker 未使用、filesystem_sandbox.rs 多余的 return),无新增。
    • cargo test --workspace:1658 通过 / 4 失败 / 2 忽略;4 个失败均为已知既有问题(filesystem_sandbox 2 个、voice::substitute_route…、privacy::drafts_stay_local…)。
    • PTY:新增 rust-monitor-pty-test.py(事件唤醒轮次、状态行、任务面板行与 x 停止且不再唤醒、模型在下一步被告知、自然退出的一次事件 + 一次完成唤醒、/new 与退出后无残留进程、纯 -p 无该工具)通过,并已加入 test:rust:pty;回归运行 background、scheduler、scheduler-restart、subagent PTY 均通过。

    未验证

    • macOS / Windows 未运行。
    • 未接入真实模型提供方(全部使用无密钥 mock 模型与临时 HOME)。
    • 未运行参考二进制;对齐依据为 pinned source rev e8563f8 的源码。

    main、npm 发布与默认入口均未改动。

    后续:正文提及 #176 的未关闭 issue 只有 #211,它仍依赖另外 22 个未关闭的 issue,因此本次没有解除阻塞的后续工单。

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions