@zhushanwen/pi-subagent-workflow 8.14.4 → 8.14.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -2,9 +2,17 @@
2
2
 
3
3
  Pi 的 subagent + workflow 合并包:任务委派 + 多 agent 编排(chain / parallel / scatter-gather / map-reduce),单包统一执行链 + 分层配额(ADR-030)。
4
4
 
5
+ ## 工具面(3 tools)
6
+
7
+ | 工具 | action 集合 | 关键参数 |
8
+ |------|------------|---------|
9
+ | `subagent` | `start` / `list` / `cancel` / `message` / `close` / `fork-from`(6 个) | start:`task` + `slug`(≤35 字符)必填,`agent`(.md 绝对路径,缺省 general-purpose)、`model`、`engine`、`fork`、`worktree`、`collect`、`maxTurns`、`idleTimeoutMs` 等 16 字段拍平顶层;`message` / `close` / `cancel` / `fork-from`:`subagentId` 必填(`message` 另需 `text`) |
10
+ | `workflow` | `run` / `status` / `abort`(3 个) | 见「Workflow 生命周期」节 |
11
+ | `workflow-script` | `generate` / `lint` / `save` / `delete` / `list`(5 个) | `generate`:`script` + `name`(可选 `description`);`save`:`name`(可 `newName` 改名);`lint` / `delete`:`name` |
12
+
5
13
  ## 内置 Agents
6
14
 
7
- 按「读/写 × 视角」正交切分,10 个角色零重叠(C1 起随 `@zhushanwen/subagent-core` 的 `agents/` 资产分发,`<available_subagents>` 的 `<location>` 指向 core 包目录):
15
+ 按「读/写 × 视角」正交切分,10 个角色零重叠(C1 起随 `@zhushanwen/subagent-core` 的 `agents/` 资产分发,`<available_subagents>` 的 `<location>` 指向 core 包 `agents/` 内各 agent `.md` 的绝对路径):
8
16
 
9
17
  | Agent | 角色 | 读/写 |
10
18
  |-------|------|-------|
@@ -33,7 +41,7 @@ Pi 的 subagent + workflow 合并包:任务委派 + 多 agent 编排(chain /
33
41
 
34
42
  orchestrator 是纯协调器角色:拆解任务 → 委派 subagent → 汇总结果,自身不做执行类工作。orchestrator agent 自身也可递归委派子 orchestrator,实现分层任务拆解(深度受 `Depth: N/10` 护栏保护)。
35
43
 
36
- **工具约束(C1/D-5)**:内置模板不携带 `tools:` frontmatter 白名单,subagent 不以 `--tools` 白名单启动——工具约束回归宿主默认工具面,orchestrator 靠角色职责(职责边界段)约束自身只做协调。想要白名单的用户在 `<workspace>/.agents/agents/` 放同名 `.md` 覆写(project 级源稳定遮蔽内置,是唯一逃生门),或沿用 pi CLI 的 `--tools` 白名单(临时验证):
44
+ **工具约束(C1/D-5)**:内置模板不携带 `tools:` frontmatter 白名单,subagent 不以 `--tools` 白名单启动——工具约束回归宿主默认工具面,orchestrator 靠角色职责(职责边界段)约束自身只做协调。想要白名单的用户在 `<workspace>/.agents/agents/` 放同名 `.md` 覆写(发现优先级 project 级最高,稳定遮蔽内置),或临时用 pi CLI 的 `--tools` 白名单验证:
37
45
 
38
46
  ```bash
39
47
  pi --tools todo,goal_control,workflow,subagent,ask_user
@@ -49,13 +57,11 @@ pi --tools todo,goal_control,workflow,subagent,ask_user
49
57
 
50
58
  ### 递归深度
51
59
 
52
- 系统内置 `n = 10` 深度护栏(fork 链 + 嵌套取 max),超过抛 `ForkDepthExceededError`。实测建议控制在 **3-4 层**以内——更深层会因上下文逐层压缩导致信息失真。
60
+ 系统内置 `n = 10` 深度护栏(`MAX_FORK_DEPTH`,fork 链与通用嵌套两个计数器共享上限、取严者生效):fork 链超限抛 `ForkDepthExceededError`,通用嵌套护栏报 `nested_spawn_rejected`。实测建议控制在 **3-4 层**以内——更深层会因上下文逐层压缩导致信息失真。
53
61
 
54
62
  ## Workflow 生命周期(one-shot)
55
63
 
56
- Workflow run 是一次性执行,状态机两态:`running → done`(`done` 唯一终态,reason 区分 completed / aborted / failed / budget_limited / time_limited)。`workflow` tool 仅 3 个 action:`run` / `status` / `abort`。run 的 `name` 接受 `<available_workflows>` 列出的 workflow 名(内置 chain / parallel / map-reduce / scatter-gather / review-fix-loop 或已保存脚本)或 `.js` 绝对路径。
57
-
58
- Runs are one-shot: there is no pause/resume — to stop a run early use abort; for a fresh result start a new run.
64
+ Workflow run 是一次性执行,状态机两态:`running → done`(`done` 唯一终态,reason 区分 completed / aborted / failed / budget_limited / time_limited)。`workflow` tool 仅 3 个 action:`run` / `status` / `abort`。run 的 `name` 接受 `<available_workflows>` 列出的 workflow 名(内置 chain / parallel / map-reduce / scatter-gather / review-fix-loop 或已保存脚本)或 `.js` 绝对路径。一次性执行、无 pause/resume:提前停止只有 abort 一条路,要新结果就重新 run。
59
65
 
60
66
  - **abort 是唯一的提前停止方式**:`{"action":"abort","runId":"<id>"}`(可选 `"error":"<reason>"`)。不存在 pause/resume action,调用会被 pi schema 校验拒绝(`Validation failed for tool "workflow"`);`/workflows pause|resume <id>` 返回 removed 提示
61
67
  - **session 切换/关闭时**,所有 running run 当即作废转 `done,failed`(state.error 为 `Session switched: run terminated` / `Session shutdown: run terminated`),已投入的 token 作废;需要结果就重新 run
@@ -64,7 +70,7 @@ Runs are one-shot: there is no pause/resume — to stop a run early use abort; f
64
70
 
65
71
  ## 性能:sessions-index.json 持久化索引
66
72
 
67
- 冷启动首扫的 identity 探测结论持久化为 `<enc>/sessions-index.json`(stat 戳自校验、tmp(pid)+rename 原子写、60s 节流、损坏/版本不符静默回退全量探测),真实目录(1744 jsonl / 671MB)实测冷扫描中位数 972.8ms → 80.6ms(12.1x,预算 ≤300ms)。可复现验收脚本:`bench/cold-scan.bench.ts`(冷扫描计时 + 输出等价断言)、`bench/concurrent-scan.bench.ts`(3 实例并发 + 随机变异四判定)。
73
+ 冷启动首扫的 identity 探测结论持久化为 `<enc>/sessions-index.json`(`<enc>` = agentDir 下 `subagents/` 内按 cwd 编码的目录段,索引落 sessions 目录同级;stat 戳自校验、tmp(pid+seq)+rename 原子写、60s 节流、损坏/版本不符静默回退全量探测),真实目录(1744 jsonl / 671MB)实测冷扫描中位数 972.8ms → 80.6ms(12.1x,预算 ≤300ms)。可复现验收脚本:`bench/cold-scan.bench.ts`(冷扫描计时 + 输出等价断言)、`bench/concurrent-scan.bench.ts`(3 实例并发 + 随机变异四判定)。
68
74
 
69
75
  ## 安装
70
76
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zhushanwen/pi-subagent-workflow",
3
- "version": "8.14.4",
3
+ "version": "8.14.6",
4
4
  "type": "module",
5
5
  "main": "index.ts",
6
6
  "description": "Unified subagent execution and multi-agent workflow orchestration for Pi — spawned-process agent runtime with sync/background modes, stateful workflow management with persistence, state machine, and execution tracing.",
@@ -55,21 +55,21 @@
55
55
  ]
56
56
  },
57
57
  "dependencies": {
58
- "@zhushanwen/extension-protocol": "0.12.0",
58
+ "@zhushanwen/extension-protocol": "0.13.0",
59
59
  "@zhushanwen/session-delivery": "0.10.1",
60
60
  "@zhushanwen/pi-ext-guards": "0.4.1",
61
61
  "@zhushanwen/pi-extension-logger": "0.6.1",
62
- "@zhushanwen/subagent-core": "0.10.5",
63
- "@zhushanwen/pi-subagent-cli": "0.4.1",
64
- "@zhushanwen/zcode-subagent-cli": "0.3.2"
62
+ "@zhushanwen/pi-subagent-cli": "0.4.2",
63
+ "@zhushanwen/subagent-core": "0.11.0",
64
+ "@zhushanwen/zcode-subagent-cli": "0.4.0"
65
65
  },
66
66
  "peerDependencies": {
67
67
  "@earendil-works/pi-ai": "^0.84.4",
68
68
  "@earendil-works/pi-coding-agent": "^0.84.4",
69
69
  "@earendil-works/pi-tui": "^0.84.4",
70
70
  "typebox": "*",
71
- "@zhushanwen/pi-pending-notifications": "0.7.5",
72
- "@zhushanwen/pi-structured-output": "5.1.8"
71
+ "@zhushanwen/pi-pending-notifications": "0.7.6",
72
+ "@zhushanwen/pi-structured-output": "5.1.9"
73
73
  },
74
74
  "peerDependenciesMeta": {
75
75
  "@earendil-works/pi-coding-agent": {
@@ -16,8 +16,8 @@ config.json 位于 pi agent 目录下的 `subagents/config.json`,随环境不
16
16
  | 环境 | 路径 |
17
17
  |------|------|
18
18
  | 独立 pi CLI | `~/.pi/agent/subagents/config.json` |
19
- | taiji dev | `~/.taiji-dev/pi/agent/subagents/config.json` |
20
- | taiji prod | `~/.taiji/pi/agent/subagents/config.json` |
19
+ | taiji dev | `~/.taiji-dev/agent/subagents/config.json` |
20
+ | taiji prod | `~/.taiji/agent/subagents/config.json` |
21
21
 
22
22
  **动态推导(推荐)**:agentDir 由 pi 核心 `getAgentDir()` 决定(读 `PI_CODING_AGENT_DIR`,默认 `~/.pi/agent`);taiji 通过 `TAIJI_AGENT_DATA_DIR` 隔离数据目录。排查时先查这两个 env 变量组合出实际路径(`<agentDir>/subagents/config.json`),不要假设单一环境——写错环境的配置文件改了也不生效。
23
23
 
@@ -273,6 +273,15 @@ export function setupWorkflowDomain(
273
273
  get eventBus() {
274
274
  return resolveCurrentPi().events;
275
275
  },
276
+ // [reload-closeout D4] pending:unregister 直落权威面:finalizeRun 直接
277
+ // appendEntry 落盘(session JSONL 唯一权威),不经 eventBus emit→内存
278
+ // listener——emit 链在 reload 转换窗/多 extension factory 顺序窗内整链失效,
279
+ // 丢失即注销 entry 永缺位(S1b 事故形态①段)。函数体内现读 current pi
280
+ // (与 log/onRunDone 同款 volatile 形态)——在飞 pump 持有的旧 deps 对象
281
+ // 经属性访问自动路由到新 pi。
282
+ appendEntry: (customType: string, data: unknown) => {
283
+ resolveCurrentPi().appendEntry(customType, data);
284
+ },
276
285
  scheduleTimeBudget: (runId: string, budgetTimeMs: number) =>
277
286
  scheduleTimeBudget(runId, deps, budgetTimeMs),
278
287
  onWorkflowCall: (name: string, args: Record<string, unknown>, parentRun: WorkflowRun) =>
@@ -563,12 +572,15 @@ export function setupWorkflowDomain(
563
572
  get eventBus() { return createLazy(resolveDeps, "eventBus"); },
564
573
  get workerHost() { return createLazy(resolveDeps, "workerHost"); },
565
574
  get runner() { return createLazy(resolveDeps, "runner"); },
566
- // scheduleTimeBudget / onWorkflowCall 不可缺席(ports.ts D-12 regression fix):
567
- // rebuildRuntime 重排 run 级墙钟预算计时器、worker 脚本嵌套 workflow() 调用都经
568
- // 这两个成员消费——lazyDeps 缺席会让消费点拿到 undefined(可选属性静默放行),
569
- // 带时间预算的 run 命中一次错误重试后计时器静默失效。转发形态与其余成员一致。
575
+ // scheduleTimeBudget / onWorkflowCall / appendEntry 不可缺席(ports.ts D-12
576
+ // regression fix 同族):rebuildRuntime 重排 run 级墙钟预算计时器、worker 脚本
577
+ // 嵌套 workflow() 调用、finalizeRun 的 pending:unregister 直落都经这三个成员
578
+ // 消费——lazyDeps 缺席会让消费点拿到 undefined(可选属性静默放行);appendEntry
579
+ // 缺席尤其危险:workflow tool 的 run action 以 lazyDeps 为 deps 启动 run,直落
580
+ // 静默跳过 + emit 已删 = 注销 entry 永缺位。转发形态与其余成员一致。
570
581
  get scheduleTimeBudget() { return createLazy(resolveDeps, "scheduleTimeBudget"); },
571
582
  get onWorkflowCall() { return createLazy(resolveDeps, "onWorkflowCall"); },
583
+ get appendEntry() { return createLazy(resolveDeps, "appendEntry"); },
572
584
  get log() { return createLazy(resolveDeps, "log"); },
573
585
  };
574
586