Skip to content

[Grok/dsh 51] 工作流运行视图与暂停恢复 #183

Description

@Blackman99

Parent

#132

Ticket: 51

Status: ready-for-agent

User Stories: 47, 49, 62(见父规格)

What to build

用户在运行列表查看阶段、子代理与结果,并按显示名称暂停、恢复、提高允许的预算或停止流程。

Acceptance criteria

  • 同名重复启动、唯一显示名、原始脚本/参数固定及已提交结果恢复按参考处理。
  • 同进程暂停可恢复;预算停止仅按明确提高上限继续;主进程重启后的不支持恢复明确拒绝。
  • UI、工具、非 TUI 文本视图对阶段、取消、失败一致,完成事件送达正确会话且去重;复用公共事件通路但不依赖完整后台 shell 功能,不能声称未提交副作用 exactly-once。
  • 暂停和实际子代理停止、继续后的结果及进程重启场景通过外部行为测试。

Blocked by

Delivery contract

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

Activity

  1. Blackman99 commented on Sep 25, 2026

    @Blackman99
    OwnerAuthor

    Ticket 51 / #183 已合入 rewrite/grok-dsh-20260920 的 9833087。

    行为

    • 交互式会话里,workflow 工具调用在引擎开始执行脚本后立即返回 Workflow 'name' started in the background.,运行在会话后台继续;同名重复启动得到会话内唯一的显示名(name、name-2……),跨会话互不影响。一个会话最多同时 4 个活动运行。
    • 每个运行在 <会话目录>/workflows/<run id>/ 保存 run.json、启动时固定不变的 script.rhai 与 launch.json(args),以及引擎的 journal.jsonl。
    • /workflow / /workflow runs 按参考格式列出阶段、子代理计数、耗时和目标;/workflow pause|resume|stop <名称>(也支持 /workflow <名称> pause)按显示名控制运行;模型也可用工具的 pause / stop / resume source 按名称或 run id 控制。TUI 通过控制通道发送,回复显示在提示行;/tasks 增加 Workflows 区域,状态行统计活动工作流,工具块标题随状态变化(恢复后重新显示运行中)。
    • 暂停/停止会取消真实子代理并结束引擎;同进程内恢复用原始脚本和 args 重新启动引擎并重放 journal:已完成的代理调用直接复用记录结果,被取消或失败的步骤重新执行(未完成步骤的副作用可能重复,不声明恰好一次)。预算停止只能在显式提高绝对 agent_budget 后继续,否则明确拒绝。
    • 主进程重启后,运行仍会被列出,原本活动的运行标记为 interrupted,所有恢复都以“由更早的 codsh 进程启动、进程重启即终止”为理由明确拒绝,且不会重复报告。
    • 运行完成、失败、取消或预算停止时,所属会话每次启动/恢复只收到一条完成通知(复用 background 插件的公共通知路径:空闲时唤醒回合,忙碌时下一回合,取消丢弃时重新放回);模型自己发起的暂停/停止不再回报给它。
    • 纯文本 -p 会随回合结束,因此在 -p 下工具等待运行结束并返回与通知相同的运行块,取消提示会停止运行。
    • 按名称启动已保存的工作流、/workflow save、每次运行的可编辑脚本副本仍以明确错误拒绝。

    验证(全部只在 Linux 上)

    • cargo test -p codsh-rust:581 通过 / 3 失败(2 个既有的 filesystem_sandbox 失败,1 个既有的 voice 假服务器偶发失败),新增 engine journal 恢复、控制通道、面板与 /workflow 回复测试。
    • cargo test --workspace --exclude codsh-rust:1043 通过。
    • cargo clippy -p codsh-rust --all-targets -- -A dead_code -A clippy::needless_return 无警告;cargo fmt --check 通过。
    • pnpm test:2444 通过 / 1 失败(既有的 reference-evidence.spec 超时)。其中 scripts/rust-workflow.spec.mjs 28/28,覆盖:跨会话唯一命名与文本视图、4 个运行上限、用户与模型停止、真实子代理停止后的暂停与 journal 恢复结果、预算恢复、SIGKILL 后 session/resume 的重启拒绝、-p 等待与取消。
    • PTY(release 二进制):rust-workflow-pty-test.py(后台启动、完成通知回合、/workflow runs、/tasks Workflows 区域、按名称暂停/恢复/停止且引擎和子代理退出、语法错误、-p 与并发上限)以及 scheduler、subagent、background、worktree、queue、plan、plugin-content 的 PTY 测试全部通过。

    未验证

    • macOS 和 Windows 均未运行。

    未实现 / 已知限制

    • 恢复只在启动运行的同一 dsh 进程内有效;进程重启后不可恢复(按参考行为明确拒绝)。
    • 未提交的副作用不保证恰好一次:恢复时被取消或未完成的步骤会重新执行。
    • 按名称启动、/workflow save、工作流目录与可编辑脚本投影留给 [Grok/dsh 52] 个人与项目工作流目录 #184。
    • 子代理结果的 tokens_used 仍为 0(dsh 不回传)。

    main、npm 和默认版本都没有改动。

    解除阻塞的后续

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