Merge commit 'ecbf75a5e70f662b6420375140cf12eb6bac7860' into worktree/retarget-pr885-20260729

# Conflicts:
#	docs/development.i18n.yaml
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-primitives/src/markdown/CodeBlock.tsx
#	scripts/snapshots/translation-prompt-v4/request-response.expected.json
This commit is contained in:
Tianyi Cui
2026-07-29 21:37:43 +08:00
496 changed files with 6843 additions and 2738 deletions
+2 -2
View File
@@ -1,6 +1,6 @@
# Bilingual-pair consistency record (docs/i18n/README.md): the git blob hash of each
# side as of the last confirmed-consistent state. Both languages carry equal authority;
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
# pnpm run verify-translation-pairing --write packages/workflow/workflow/README.md
README.md: 9d01cfd3d2504d6b5af5a1af6cba735a4abb5795
README.zh.md: 85dc6bb1897678f72eb715514ab85cad7f7b9589
README.zh.md: 20dde758d82b38658c39157f9d72d1f3fba046a9
+14 -14
View File
@@ -2,15 +2,15 @@
[English](README.md) | 中文
workflow seam`ctx.workflows`)执行由模型编写、可扇出 subagent 的编排脚本。该 seam 定义脚本、运行、结果、错误和事件契约;引擎负责决定如何隔离并执行脚本。
工作流 seam`ctx.workflows`)执行由模型编写、可扇出 subagent 的编排脚本。该 seam 定义脚本、运行、结果、错误和事件契约;引擎负责决定如何隔离并执行脚本。
`@deepseek-ai/dsh-workflow-workerthread` 是当前引擎,`@deepseek-ai/dsh-tool-workflow` 是面向模型的消费方。未来的进程或沙箱引擎可以替换实现,而无需更改工具。
## 服务与运行契约
`WorkflowService.start(request): WorkflowRun` 会同步完成足够多的校验,在运行存在前拒绝格式错误的 meta 块、无法解析的脚本、不可用的提供方路由或不受支持的单次运行限制。返回后,`WorkflowRun.result` 绝不拒绝:执行失败以 `stopReason: 'error'` 兑现,取消则在引擎有限的宽限时间内以 `cancelled` 兑现。
`WorkflowService.start(request): WorkflowRun` 会同步完成足够多的校验,在运行创建前拒绝格式错误的 meta 块、无法解析的脚本、不可用的提供方路由或不受支持的单次运行限制。返回后,`WorkflowRun.result` 绝不拒绝:执行失败以 `stopReason: 'error'` 兑现,取消则在引擎有限的宽限时间内以 `cancelled` 兑现。
运行由持有方拥有。引擎插件卸载会阻止新的启动,但不会撤销已接受的运行。持有方必须在每条路径上调用 `dispose()`dispose 会取消剩余工作,并在文档规定的期限内达到或放弃完全停稳。
运行由持有方负责。引擎插件卸载会阻止新的启动,但不会撤销已接受的运行。持有方必须在每条路径上调用 `dispose()`dispose(资源释放)会取消剩余工作,并在文档规定的期限内达到或放弃完全停稳。
`WorkflowStartRequest` 包含 `{ meta, script, args?, subagentProvider?, maxTotalAgents?, parent, signal? }``parent` 把每个子 agent(智能体)归属于调用 agent。`subagentProvider` 可以为该次运行的所有子 agent 指定路由,同时不向脚本公开提供方选择;省略时使用引擎配置的提供方。`maxTotalAgents` 可以为一次运行降低引擎的部署上限,同样对脚本不可见。实现会同步拒绝无效路由和限制。`meta``args` 是普通数据,不是脚本片段。
@@ -18,13 +18,13 @@ workflow seam`ctx.workflows`)执行由模型编写、可扇出 subagent 的
## 事件
工作流事件只供观察。它们携带 `WorkflowRunInfo``id``meta`),而不是实时运行,因此监听器无法取得取消或 dispose(资源释放)权限。
工作流事件只供观察。它们携带 `WorkflowRunInfo``id``meta`),而不是活动运行,因此监听器无法取得取消或 dispose 权限。
- `workflow/start` / `workflow/end` 为运行配对;
- `workflow/phase``workflow/log` 公开脚本叙述;
- `workflow/agent-start` / `workflow/agent-end``seq` 为每次子 agent 调用配对;异步提供方启动被拒绝的子 agent 不会发出其中任何一个事件。
- `workflow/agent-start` / `workflow/agent-end``seq` 为每次子 agent 调用配对;提供方的异步启动调用被拒绝时,该子 agent 不会发出其中任何一个事件。
同进程事件 payload 是以不可变方式借用的值。每个监听器都独立隔离:同步抛出或返回的 promise 被拒绝时,只会记录日志,不会阻塞同级监听器或改变执行。
同进程事件 payload 是以不可变方式借用的值。每个监听器都独立隔离:同步抛出异常或返回的 promise 被拒绝时,只会记录日志,不会阻塞同级监听器或改变执行。
## 失败纪律
@@ -33,10 +33,10 @@ workflow seam`ctx.workflows`)执行由模型编写、可扇出 subagent 的
- `SCRIPT_PARSE` / `META_INVALID`:工作流无法启动;
- `INVALID_ARGUMENT` / `UNSUPPORTED_OPTION` / `UNSUPPORTED_SCHEMA`:钩子调用违反引擎契约;
- `AGENT_CAP` / `ITEM_CAP`:超过已配置的安全上限;
- `AGENT_START`:提供方异步启动被拒绝;
- `AGENT_START`:提供方异步启动调用被拒绝;
- `AGENT_RESULT`:已就绪子 agent 的结果因基础设施故障而拒绝;
- `RESULT_UNSERIALIZABLE`:脚本/worker 值不是普通 JSON 数据;
- `CANCELLED`:取消拥有该运行,待处理和未来的钩子都会拒绝。
- `CANCELLED`:取消会接管该运行,待处理和未来的钩子都会拒绝。
子 agent 若以非完成的结束原因正常兑现,并不属于基础设施异常:`agent()` 返回 `null`,使脚本可以处理普通的子 agent 失败。
@@ -46,14 +46,14 @@ workflow seam`ctx.workflows`)执行由模型编写、可扇出 subagent 的
#### KV Cache 影响
不会直接使缓存失效;具名消费方负责请求前缀的任何变化
不会直接导致 KV Cache 失效;请求前缀的任何变化均由上述消费方负责
## 已知限制与延期工作
## 已知限制与暂缓事项
- **仅支持前台收集**:调用方拥有一个实时运行并等待它;后台启动/轮询、spill 句柄和分离收集均延期处理。
- **没有日志记录或恢复**:脚本、子 agent 进度和中间值均不设检查点,因此进程重启后无法继续运行。
- **仅支持前台收集**:调用方负责一个活动运行并等待它;后台启动轮询、spill 句柄和分离收集均暂缓处理。
- **没有日志或恢复**:脚本、子 agent 进度和中间值均不设检查点,因此进程重启后无法继续运行。
- **没有已保存或嵌套工作流**:该 seam 只启动调用方提供的脚本,工作流脚本不会收到用于递归编排的 `workflow()` 钩子。
- **没有 token 预算词汇**:引擎会限制并发、条目和子 agent,但请求与结果都不会统计跨子 agent 的模型 token。
- **运行由持有方拥有,不由服务跟踪**:卸载引擎不会发现独立的实时句柄;每个消费方都必须 dispose 自己启动的运行。
- **运行由持有方负责,不由服务跟踪**:卸载引擎不会发现独立的活动句柄;每个消费方都必须 dispose 自己启动的运行。
延期的工作流接口见[动态工作流 Agent Note](../../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md)。
暂缓实现的工作流接口见[动态工作流 Agent Noteagent 决策记录)](../../../.agents/notes/implemented/feature/2026-07-05-dynamic-workflows.md)。