workflow-persistence-host-integration 分支逐文件说明

这页按文件解释当前分支的最终修改。重点是 workflow 的可观测日志、执行方式、取消行为、Desktop 状态同步、child agent 权限和 saved workflow 加载方式。

34逐文件说明条目
Workerfile-backed workflow 可终止执行
No esbuildsaved workflow 不再依赖 bundler
Terminal wins旧 running 更新不能覆盖终态
读取方式:每个卡片对应一个文件,先说明这个文件承担的变化,再列出具体影响。路径保留原始仓库路径,方便直接定位。

文档

docs/packages/agent/async-subagents.md

docschanged

把 async subagent 的权限说明改成当前真实行为:child session 创建时完成预授权,通常不会进入等待权限状态。

  • waiting_permission 分支标记为保留场景。
  • 说明 parent deny 继续传递,child 中的 ask 会转成 allow。

docs/packages/agent/subagents.md

docschanged

重写 approvalRouting 当前语义,避免文档继续暗示运行时会把 child approval 转发给 parent。

  • 明确当前 async subagent 采用创建时预授权。
  • 保留 surface-to-parent 等配置名,但说明它们现在不代表运行时审批转发。

docs/packages/agent/workflows.md

docschanged

更新 workflow 的核心 contract:自包含 inline/session script 在 worker 内用 node:vm 执行,trusted .mjs saved workflow 用 Node ESM 加载,不在 app 里引入 esbuild。

  • 说明 worker 是可终止执行单元,node:vm 限制默认全局对象,但不包装成安全沙箱。
  • 把 saved workflow 默认文件名改成 .mjs,同时兼容自包含 .js / .ts
  • 补充 api.agent() child 权限沿用 async subagent 的预授权规则。

docs/packages/cli/headless.md

docschanged

同步 headless 文档中的 child 权限描述,说明 child session 在创建时收窄权限,不等待运行时审批。

docs/packages/cli/tui/session-store.md

docschanged

更新 TUI session store 的权限说明:TUI overlay 处理 parent session 的 pending permission,async subagent 通常不再往 overlay 塞 child permission。

Agent Runtime

packages/agent/src/agent.ts

changed

把 workflow data dir 的加载改成异步,并在 session 创建、加载、fork 前等待它完成。

  • 避免 saved workflow 还没加载完,session 就开始访问 registry。
  • 加载失败会写 agent 日志,错误继续向上抛出。

packages/agent/src/session/orchestrator/tool-call-runner.ts

changed

给 tool 执行 metadata 增加 isWorkflowAgentSession 标记,让工具能识别 workflow child agent。

packages/agent/src/tool/builtin/exec/tool.ts

changed

把 workflow child agent 当作 child agent 处理:即使传了 runInBackground,也会以前台命令执行。

  • 防止 workflow child agent 再开 background task,降低 workflow 卡住和通知丢失的概率。
  • 继续保留普通 parent session 的 background exec 行为。

packages/agent/src/workflows/agent-runner.ts

changed

强化 api.agent() 的 child agent 创建逻辑和可观测性。

  • 记录 child session 创建、run started、tool event、完成、失败和停止请求。
  • 传入 narrowed tool definition overrides,移除不适合 child 的能力。
  • 根据 parent permission 生成 child permission,deny 继续传递,ask 转成 allow,humanApprovalMode 设为 never。
  • 固定 deny waitbrowser,并禁止 workflow / agent 递归工具。

Workflow Runtime

packages/agent/src/workflows/diagnostics.ts

added

新增 workflow 统一日志工具,输出 [dimcode][workflow][area] 格式,并提供错误和值的摘要函数。

packages/agent/src/workflows/artifact-store.ts

changed

给 workflow artifact 的写入、复制和保存加入 begin / done / failed 日志。

  • 日志包含 sessionId、workflowRunId、workflowName、路径、耗时和错误摘要。
  • 方便定位 script 是否已经落盘、meta 是否写入、save 卡在哪一步。

packages/agent/src/workflows/loader.ts

changed

移除 esbuild 加载路径,改成 Node 原生 ESM 加载和自包含脚本加载。

  • .mjs 走 Node dynamic import,并用 mtime 避免缓存旧模块。
  • .js / .ts 作为自包含 workflow script,用 inline runtime 读取 contract,实际执行走 worker 内 node:vm
  • loader 变成 async,并为导入、编译、normalize 加日志。

packages/agent/src/workflows/run-manager.ts

changed

这是本分支的核心 runtime 修改,集中处理 workflow 生命周期、worker 执行、取消、日志和错误码。

  • 为 start / run / prepare / artifact / execute / api.phase / api.log / api.agent / terminal event / parent notification 增加日志。
  • inline workflow 不再把 artifact 文件重新交给 module loader,而是复用已编译 module,并保留 run artifact。
  • file-backed workflow 进入 worker_threads.Worker 执行,cancel 时终止 worker。
  • worker 通过消息把 phase、log、agent request 回传主线程,主线程继续负责 session、permission 和 child agent。
  • workflow error code 会保留到 parent model notification,格式为 <error code="WORKFLOW_*">
  • save 默认文件名改成 .mjs,并允许 .mjs / .js / .ts

packages/agent/src/workflows/script-runtime.ts

changed

增强 inline script runtime 的日志、语法处理和 node:vm 预加载。

  • compile begin / done / failed 都会记录脚本长度、hash、workflowName 和错误。
  • 读取 meta 和 default export 时不再使用 new Function
  • meta 里仍禁止 template string,workflow body 允许 template string。

packages/agent/src/workflows/session-catalog.ts

changed

session catalog 查 artifact 时同时返回已编译 module,便于 session workflow 复用,不必重新从 artifact 文件加载。

packages/agent/src/workflows/tool.ts

changed

完善 workflow tool 对模型的说明,并记录 workflow tool start 成功或失败。

  • tool description 现在列出 WorkflowApi 可用字段和方法。
  • 明确 shell work 应通过 api.agent() 让 child agent 执行。
  • 移除具体 sleep 示例,避免把测试脚本写成提示模板。

packages/agent/src/workflows/worker-source.ts

added

新增 worker 内运行的源码字符串,用来执行 file-backed workflow。

  • worker 内部加载 trusted .mjs 或自包含 script;自包含 script 通过 node:vm 执行,不注入 process / require
  • phaselogagent 都通过消息回主线程。
  • api.agent() 先检查 options 可传输,避免 structured clone 错误丢掉 invocation 错误码。

Desktop

packages/desktop/packages/electron-main/src/agent/agent-event-mapper.ts

changed

Desktop main 映射 error 时保留 workflowCodecode,不再统一改成 RUNTIME_ERROR

packages/desktop/packages/electron-main/src/agent/agent-gateway.ts

changed

给 Desktop main 的 workflow API 和事件转发加日志。

  • 覆盖 list、listRuns、getProgress、start、cancel、save、reveal。
  • 转发 workflow started / updated / completed 时记录源事件和映射后的 Desktop event。
  • 日志包含 workflowRunId、状态、数量、耗时和错误摘要。

packages/desktop/packages/renderer/src/components/chat-workspace/ChatWorkspace.vue

changed

给 Workflow 面板和 Activity 停止动作增加 renderer 侧日志。

  • 覆盖 open、close、refresh、start、save、reveal、stop。
  • 每个操作记录 sessionId、workflowRunId、workflowName、耗时和错误摘要。

packages/desktop/packages/renderer/src/components/chat-workspace/InputArea.vue

changed

给 slash workflow 命令增加日志。

  • 无参数时记录打开 workflow panel。
  • 有参数时记录 start begin / done / failed,包括 args 摘要。

packages/desktop/packages/renderer/src/session/bootstrap.ts

changed

renderer bootstrap 处理 workflow 事件时增加日志。

  • 收到、存储、跳过 workflow started / updated / completed 都会记录。
  • completed 事件会保留 error code 和 message 到 store。

packages/desktop/packages/renderer/src/stores/sessions.ts

changed

实现 Desktop terminal wins:已有终态时,旧的 running update 不能覆盖 run 或 progress.run。

  • 保护 completed / failed / cancelled 不被旧 progress 改回 running。
  • 解决 UI 明明收到终态,之后又显示 running 的问题。

测试与构建

packages/agent/package.json

changed

移除 esbuild 依赖,因为 saved workflow 不再通过 bundler 编译加载。

packages/agent/vite.config.ts

changed

从 Rollup external 列表移除 esbuild,和依赖移除保持一致。

packages/agent/src/tool/builtin/exec/tool.test.ts

changedtest

新增测试,确认 workflow child agent 请求 background exec 时仍以前台执行,并使用默认 timeout。

packages/agent/src/workflows/loader.test.ts

changedtest

更新 loader 测试,覆盖异步 loader、自包含 .ts、原生 .mjs helper import 和 data dir source。

packages/agent/src/workflows/run-manager-inline-loader.test.ts

addedtest

新增边界测试,确认 prompt-originated inline workflow 不会通过 module loader 重新加载 artifact 文件。

packages/agent/src/workflows/run-manager.test.ts

changedtest

扩展 workflow manager 测试覆盖新行为。

  • workflow body 允许 template string。
  • inline workflow 看不到宿主 processrequireglobalThis.process
  • inline workflow 内部调用 Function("...") 会失败。
  • 无限循环 inline workflow 可以通过 worker cancel 结束。
  • parent notification 中保留 workflow error code。
  • workflow child agent 移除 background exec schema,并带有预授权 permission。
  • 取消已启动 child agent 时会调用 stopRun。

packages/agent/src/workflows/tool.test.ts

changedtest

新增测试,确认 workflow tool description 明确列出 WorkflowApi,并且不包含具体 sleep 示例。

packages/desktop/packages/electron-main/tests/unit/agent-event-mapper.workflow.test.ts

addedtest

新增 Desktop mapper 测试,确认 workflow completed event 中的 WORKFLOW_SCRIPT_ERROR 可以传到 renderer payload。

packages/desktop/packages/renderer/tests/sessions-store.test.ts

changedtest

新增 terminal wins 测试,确认 completed run 不会被之后到达的 stale running progress 覆盖。

pnpm-lock.yaml

changed

同步移除 agent package 的 esbuild importer 依赖记录。

output/index.html

addedreport

新增本说明页面,用静态 HTML 逐文件介绍 workflow 分支的最终修改,方便直接在浏览器中查看。