@zhushanwen/subagent-core 0.7.1 → 0.9.0

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.
Files changed (176) hide show
  1. package/dist/{chunk-VURUAGMM.js → chunk-LZJOEDGQ.js} +603 -154
  2. package/dist/engine-discovery-scan-Da4Dkzsi.d.cts +818 -0
  3. package/dist/engine-discovery-scan-Da4Dkzsi.d.ts +818 -0
  4. package/dist/execution/engine/engine-discovery-scan.cjs +325 -154
  5. package/dist/execution/engine/engine-discovery-scan.d.cts +1 -2
  6. package/dist/execution/engine/engine-discovery-scan.d.ts +1 -2
  7. package/dist/execution/engine/engine-discovery-scan.js +1 -1
  8. package/dist/execution/relay-env.js +5 -4
  9. package/dist/index.cjs +9799 -7954
  10. package/dist/index.d.cts +1896 -1360
  11. package/dist/index.d.ts +1896 -1360
  12. package/dist/index.js +8952 -7513
  13. package/dist.bundle/index.cjs +7897 -6054
  14. package/package.json +5 -5
  15. package/src/__tests__/manifest-store.test.ts +16 -15
  16. package/src/__tests__/record-store-last-line.test.ts +12 -0
  17. package/src/__tests__/robustness-medium-batch1.test.ts +10 -14
  18. package/src/__tests__/robustness-medium-batch2.test.ts +7 -2
  19. package/src/core/logger.ts +1 -1
  20. package/src/execution/__tests__/alive-store.test.ts +117 -1
  21. package/src/execution/__tests__/batch-finalized.test.ts +206 -0
  22. package/src/execution/__tests__/chat-engine-routing.test.ts +117 -1
  23. package/src/execution/__tests__/{cold-resurrect.test.ts → cold-lookup.test.ts} +133 -33
  24. package/src/execution/__tests__/collect-coordinator-service.test.ts +7 -5
  25. package/src/execution/__tests__/conversation-continuation.test.ts +1452 -0
  26. package/src/execution/__tests__/delivery-methods.test.ts +90 -176
  27. package/src/execution/__tests__/dialog-queue.test.ts +70 -3
  28. package/src/execution/__tests__/dispose-manifest-recovery.test.ts +475 -0
  29. package/src/execution/__tests__/execute-and-await-worktree.test.ts +3 -3
  30. package/src/execution/__tests__/execute-nesting.test.ts +8 -5
  31. package/src/execution/__tests__/execution-record.test.ts +8 -148
  32. package/src/execution/__tests__/finalize-record.test.ts +295 -129
  33. package/src/execution/__tests__/get-record-for-action-restart.test.ts +21 -29
  34. package/src/execution/__tests__/helpers/fake-engine-port.ts +13 -68
  35. package/src/execution/__tests__/helpers/legacy-sidecar.ts +33 -0
  36. package/src/execution/__tests__/helpers/subagent-service-mocks.ts +9 -5
  37. package/src/execution/__tests__/idle-gc.test.ts +60 -0
  38. package/src/execution/__tests__/inflight-production-wiring.test.ts +223 -0
  39. package/src/execution/__tests__/lifecycle-manager.test.ts +3 -254
  40. package/src/execution/__tests__/manifest-store-tmp-recovery.test.ts +43 -22
  41. package/src/execution/__tests__/model-config-service.test.ts +111 -0
  42. package/src/execution/__tests__/nested-visibility-env-propagation.test.ts +10 -6
  43. package/src/execution/__tests__/nested-visibility.test.ts +13 -1
  44. package/src/execution/__tests__/notify-ledger.test.ts +42 -1
  45. package/src/execution/__tests__/rebuild-indexes.test.ts +329 -0
  46. package/src/execution/__tests__/record-binding.test.ts +613 -0
  47. package/src/execution/__tests__/record-origin.test.ts +318 -0
  48. package/src/execution/__tests__/record-store-intent-api.test.ts +600 -0
  49. package/src/execution/__tests__/record-store-orphan-revive.test.ts +71 -3
  50. package/src/execution/__tests__/record-store.test.ts +72 -54
  51. package/src/execution/__tests__/recursive-visibility-baseline.test.ts +8 -5
  52. package/src/execution/__tests__/round-supervisor-workflow-origin.test.ts +205 -0
  53. package/src/execution/__tests__/run-orchestration-write-lease.test.ts +293 -0
  54. package/src/execution/__tests__/run-orchestration.test.ts +199 -0
  55. package/src/execution/__tests__/session-file-gc.test.ts +35 -4
  56. package/src/execution/__tests__/session-reconstructor.test.ts +78 -0
  57. package/src/execution/__tests__/state-marker.test.ts +288 -0
  58. package/src/execution/__tests__/stream-sink-retirement.test.ts +8 -5
  59. package/src/execution/__tests__/subagent-actions-core.test.ts +67 -16
  60. package/src/execution/__tests__/subagent-service-multiproc-guard.test.ts +0 -1
  61. package/src/execution/__tests__/subagent-service-notify-gate.test.ts +27 -11
  62. package/src/execution/__tests__/subagent-service-parent-guard.test.ts +17 -11
  63. package/src/execution/__tests__/subagent-service-recovery-bounds.test.ts +130 -53
  64. package/src/execution/__tests__/subagent-service.test.ts +17 -215
  65. package/src/execution/__tests__/subprocess-agent-runner-no-progress-killall.test.ts +138 -0
  66. package/src/execution/__tests__/subprocess-agent-runner.test.ts +105 -660
  67. package/src/execution/__tests__/sync-collect-recovery.test.ts +23 -16
  68. package/src/execution/__tests__/terminal-write-latency.test.ts +79 -0
  69. package/src/execution/__tests__/workflow-agent-dispatch.test.ts +782 -0
  70. package/src/execution/alive-store.ts +37 -28
  71. package/src/execution/{cold-resurrect.ts → cold-lookup.ts} +48 -45
  72. package/src/execution/config.ts +1 -1
  73. package/src/execution/conversation-continuation.ts +541 -0
  74. package/src/execution/dialog-queue.ts +60 -12
  75. package/src/execution/engine/__tests__/common/capability-gate.test.ts +1 -1
  76. package/src/execution/engine/__tests__/common/journal-wiring.test.ts +16 -1
  77. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/fake-engine-protocol.mjs +17 -51
  78. package/src/execution/engine/__tests__/conformance/__fixtures__/engine-protocol/smoke-run.fixture.json +0 -5
  79. package/src/execution/engine/__tests__/conformance/engine-conformance.live.test.ts +1 -1
  80. package/src/execution/engine/__tests__/conformance/protocol-blackbox.test.ts +5 -9
  81. package/src/execution/engine/__tests__/conformance/registry-fork-filter.test.ts +55 -53
  82. package/src/execution/engine/__tests__/engine-discovery-scan.test.ts +0 -3
  83. package/src/execution/engine/__tests__/engine-discovery.test.ts +0 -3
  84. package/src/execution/engine/__tests__/inflight-snapshot.test.ts +180 -0
  85. package/src/execution/engine/__tests__/model-prompt.test.ts +0 -3
  86. package/src/execution/engine/__tests__/registry.test.ts +0 -1
  87. package/src/execution/engine/__tests__/routing.test.ts +0 -1
  88. package/src/execution/engine/__tests__/run-failure-worktree-cleanup.test.ts +0 -3
  89. package/src/execution/engine/client/__tests__/__fixtures__/fake-engine.mjs +0 -3
  90. package/src/execution/engine/client/__tests__/engine-client-reap.test.ts +212 -0
  91. package/src/execution/engine/client/__tests__/mirror.test.ts +73 -1
  92. package/src/execution/engine/client/__tests__/protocol-closure.test.ts +2 -9
  93. package/src/execution/engine/client/__tests__/remote-engine.test.ts +46 -12
  94. package/src/execution/engine/client/engine-client.ts +111 -26
  95. package/src/execution/engine/client/mirror.ts +9 -0
  96. package/src/execution/engine/client/remote-engine.ts +52 -34
  97. package/src/execution/engine/client/reverse-router.ts +6 -27
  98. package/src/execution/engine/common/__tests__/run-signals.test.ts +79 -0
  99. package/src/execution/engine/common/capability-gate.ts +27 -0
  100. package/src/execution/engine/common/data-dir.ts +3 -2
  101. package/src/execution/engine/common/errors.ts +1 -1
  102. package/src/execution/engine/common/journal-wiring.ts +18 -9
  103. package/src/execution/engine/common/run-signals.ts +83 -0
  104. package/src/execution/engine/d8-compat.ts +1 -1
  105. package/src/execution/engine/host/__tests__/host-bridge.test.ts +3 -18
  106. package/src/execution/engine/host/host-bridge.ts +26 -41
  107. package/src/execution/engine/host/pi-host-binding.ts +5 -5
  108. package/src/execution/engine/host/spawned-children.ts +1 -1
  109. package/src/execution/engine/inflight-snapshot.ts +92 -0
  110. package/src/execution/engine/port.ts +52 -54
  111. package/src/execution/engine/types.ts +11 -14
  112. package/src/execution/execution-record.ts +15 -47
  113. package/src/execution/finalize-record.ts +94 -197
  114. package/src/execution/idle-gc.ts +9 -3
  115. package/src/execution/lifecycle-manager.ts +25 -361
  116. package/src/execution/lifecycle-predicates.ts +22 -19
  117. package/src/execution/manifest-store.ts +40 -42
  118. package/src/execution/model-config-service.ts +1 -1
  119. package/src/execution/notifier.ts +39 -1
  120. package/src/execution/notify-host.ts +13 -4
  121. package/src/execution/path-encoding.ts +6 -0
  122. package/src/execution/record-entry.ts +20 -2
  123. package/src/execution/record-store.ts +925 -160
  124. package/src/execution/relay-env.ts +8 -3
  125. package/src/execution/round-supervisor/domain.ts +17 -5
  126. package/src/execution/round-supervisor/service-binding.test.ts +89 -53
  127. package/src/execution/round-supervisor/service-binding.ts +71 -21
  128. package/src/execution/round-supervisor/supervisor.ts +23 -9
  129. package/src/execution/service/record-access.ts +547 -0
  130. package/src/execution/service/record-lifecycle.ts +542 -0
  131. package/src/execution/service/run-orchestration.ts +1647 -0
  132. package/src/execution/service/service-bootstrap.ts +111 -0
  133. package/src/execution/service/service-constants.ts +27 -0
  134. package/src/execution/service/session-baselines.ts +401 -0
  135. package/src/execution/service/sync-collect-domain.ts +442 -0
  136. package/src/execution/service/workflow-dispatch.ts +567 -0
  137. package/src/execution/session-file-gc.ts +11 -8
  138. package/src/execution/session-reconstructor.ts +44 -1
  139. package/src/execution/sessions-index.ts +20 -3
  140. package/src/execution/settled-watchdog.ts +86 -43
  141. package/src/execution/state-marker.ts +516 -0
  142. package/src/execution/stream-sink.ts +1 -1
  143. package/src/execution/subagent-actions-core.ts +53 -31
  144. package/src/execution/subagent-service.ts +643 -2955
  145. package/src/execution/subprocess-agent-runner.ts +46 -323
  146. package/src/execution/types.ts +60 -43
  147. package/src/execution/ui-request-handler-factory.ts +5 -0
  148. package/src/execution/worktree-manager.ts +1 -1
  149. package/src/execution/worktree-registry.ts +12 -8
  150. package/src/index.ts +16 -5
  151. package/src/orchestration/__tests__/agent-call-catch-fallback.test.ts +2 -3
  152. package/src/orchestration/__tests__/agent-call-stream.test.ts +24 -49
  153. package/src/orchestration/__tests__/error-recovery-terminal-hardening.test.ts +4 -4
  154. package/src/orchestration/__tests__/file-run-store.test.ts +5 -7
  155. package/src/orchestration/__tests__/lifecycle-abort-broadcast-signal.test.ts +2 -3
  156. package/src/orchestration/__tests__/run-snapshot.test.ts +27 -43
  157. package/src/orchestration/__tests__/worker-message-pump-workflow-dispatch.test.ts +274 -0
  158. package/src/orchestration/execute-agent-call.ts +1 -1
  159. package/src/orchestration/file-run-store.ts +1 -1
  160. package/src/orchestration/models/ports.ts +20 -13
  161. package/src/orchestration/models/types.ts +11 -13
  162. package/src/orchestration/run-snapshot.ts +18 -22
  163. package/src/orchestration/worker-message-pump.ts +33 -57
  164. package/src/shared/atomic-write.ts +10 -8
  165. package/dist/chunk-T2SYBW3I.js +0 -24
  166. package/dist/engine-discovery-scan-ocpM8FmI.d.cts +0 -1608
  167. package/dist/engine-discovery-scan-ocpM8FmI.d.ts +0 -1608
  168. package/src/execution/__tests__/chat-round-first-round-watchdog.test.ts +0 -255
  169. package/src/execution/__tests__/finalized-marker.test.ts +0 -104
  170. package/src/execution/__tests__/lifecycle-manager-lock.test.ts +0 -211
  171. package/src/execution/__tests__/subprocess-agent-runner-routing.test.ts +0 -488
  172. package/src/execution/__tests__/subprocess-agent-runner-timeout.test.ts +0 -75
  173. package/src/execution/__tests__/tombstone-store.test.ts +0 -73
  174. package/src/execution/engine/__tests__/conformance/chat-round-protocol.test.ts +0 -230
  175. package/src/execution/finalized-marker.ts +0 -70
  176. package/src/execution/tombstone-store.ts +0 -72
@@ -1,1608 +0,0 @@
1
- import { WorktreeHandle, AgentFailureKind, AgentOutcomeUsage, ToolCallEntry, Turn, ToolCall, AgentUsageTotal, EngineHandleData, EngineCapabilities, ProbeReport, AgentEvent, ResumeAnchor, HostRoundLifecycleParams, AgentOutcome, InteractAction, InteractResult, SessionView, ModelCatalogEntry } from '@zhushanwen/subagent-engine-sdk';
2
- import { ChildProcess } from 'node:child_process';
3
- import { GuiRenderResult } from '@xyz-agent/extension-protocol';
4
-
5
- /**
6
- * Workflow Extension — Engine 共享类型
7
- *
8
- * Engine 层全局基础类型。零 infra 依赖——不 import 任何 infra 文件,
9
- * 可独立编译测试(D-12 三层架构,AC-1)。
10
- *
11
- * 核心内容:
12
- * - 状态机:RunStatus = "running" | "done"(2 态,一次性生命周期,FR-3)
13
- * + DoneReason(completed/failed/aborted/budget_limited/time_limited)
14
- * - AgentCallOpts / AgentResult(单次 agent 调用的输入/输出,宿主面 SSOT 留守本地)
15
- * + AgentUsage / ToolCallEntry / AgentFailureKind(自 SDK re-export,S4 簇 3 收编)
16
- * - ExecutionTraceNode / TracePatch / ToolCallEntry / WorkerLogEntry(trace 数据)
17
- *
18
- * 层归属:Engine(数据结构 + 不变式守卫)。
19
- */
20
-
21
- /**
22
- * 状态机:2 态(D-12 / FR-3,一次性生命周期——run 不可挂起)。
23
- *
24
- * running → done
25
- *
26
- * `done` 是唯一终态,具体原因由 DoneReason 区分。
27
- */
28
- type RunStatus = "running" | "done";
29
- /** 终态原因。done 时必有(WorkflowRun 不变式)。 */
30
- type DoneReason = "completed" | "failed" | "aborted" | "budget_limited" | "time_limited" | "invalid_args";
31
- /**
32
- * slug 最大长度(D6 合流迁入本文件,原权威定义在已删除的 execution/execute-options-mapper.ts)。
33
- * 历史值 20 偏紧——描述性 slug 如 "audit-structured-output"(23)/ "fix-subagent-wf-tools"(21)
34
- * 会撞上限,放宽到 35 兼顾「短到能塞进 TUI 标题行」与「容纳合理描述性 kebab-case 名」。
35
- * 放本文件的原因:约束对象是 AgentCallOpts.description(slug 的源字段,见下方 slug 派生说明),
36
- * 与字段同文件;worker-message-pump(live record slug 截断)与壳侧 tool schema maxLength 共享引用。
37
- */
38
- declare const SLUG_MAX_LENGTH = 35;
39
- /**
40
- * 单次 agent 调用的任务声明(D6 任务形状合流后的单一形状)。
41
- *
42
- * [D6 合流裁决] 本类型 = 原 AgentCallOpts(workflow 调用方声明,18 字段)与原
43
- * AgentTaskSpec(engine 中立任务声明,已删除)的合流形态,从模型脚本 agent() API
44
- * 到 EnginePort.run 直达 pi 边界一次映射——SAR 链路上的 ExecuteOptions/AgentTaskSpec
45
- * 中间态消除(设计 docs/design/subagent-dual-track-convergence.md §3.3 D6 / 终态四)。
46
- *
47
- * 终态命名按变化轴裁定为 AgentCallOpts,理由:
48
- * - 字段演进的首要驱动轴是「调用方要表达的任务语义」(agent() API 是唯一生产写入方,
49
- * 合流字段中 prompt/description/skill/skillPath/schemaEnv/thinkingLevel 等多数派
50
- * 已是调用方命名);
51
- * - 原 AgentTaskSpec 的中立重命名层(task/slug/effort/persona)与调用方命名是
52
- * 形式同构、语义同构的假差异(prompt≡task、slug=description 截断、effort≡thinkingLevel、
53
- * persona≡skillPath+appendSystemPrompt 平铺),按「消假差异」原则并入调用方命名;
54
- * - 持久化兼容反向锁定 prompt 形态:jsonl run 快照的 AgentCall.opts 与 worker 消息
55
- * opts 均以 prompt 字段落盘,改名会破坏旧快照重水合。
56
- *
57
- * 引擎中立字段的并入方式(可选字段,原 AgentTaskSpec 独有字段去向):
58
- * - graceTurns / conversation / idleTimeoutMs / denyTools / permissionMode:可选并入;
59
- * - persona.agentRef:裁撤(无生产写入方、无消费者——pi 走 agent 字段解析身份);
60
- * - requires:裁撤(P4 形状预留、无生产写入方;且并入需 import EngineCapabilities
61
- * 形成 orchestration↔engine 类型环)。将来能力依赖声明下钻时在本形状上加回。
62
- *
63
- * D-12 仅重组执行编排,AgentCallOpts 形状保持兼容。
64
- */
65
- interface AgentCallOpts {
66
- /** The task prompt to send to the agent. */
67
- prompt: string;
68
- /**
69
- * Optional JSON schema for structured output.
70
- * When provided, the schema is passed via PI_WORKFLOW_SCHEMA env to the subprocess,
71
- * which activates the structured-output tool + turn_end hook.
72
- * The tool's execute validates model output against the schema.
73
- * On success, `parsedOutput` on the result is set to `tool_execution_end.result.details`
74
- * (the validated, parsed data object — not the raw tool call args).
75
- */
76
- schema?: Record<string, unknown>;
77
- /**
78
- * Model to use (e.g. "router-openai/glm-5.1").
79
- * When omitted, pi's default model is used.
80
- */
81
- model?: string;
82
- /**
83
- * Thinking level override (e.g. "high", "medium", "low").
84
- * M2: Added to align with subagent path's ExecuteOptions.thinkingLevel.
85
- * When omitted, agent .md frontmatter thinkingLevel is used (via resolveIdentity/getAgentConfig).
86
- */
87
- thinkingLevel?: string;
88
- /** Scene name passed through to the worker for model-selection hints. */
89
- scene?: string;
90
- /**
91
- * Wall-clock timeout in milliseconds. When > 0, aborts the subprocess
92
- * if it runs longer than this, regardless of external signal.
93
- * Per-call,归 AgentCall 实体(G-027)。
94
- */
95
- timeoutMs?: number;
96
- /**
97
- * Turn 上限(turn limiter 用)。
98
- *
99
- * [预算语义对齐] 未传或 <=0 = 不限 turn;此时也不按 turns 估算 spawn watchdog——
100
- * 仅当 env XYZ_SUBAGENT_SPAWN_WATCHDOG_MS 设置时才按绝对时限挂 watchdog(见
101
- * session-runner.resolveSpawnWatchdogMs)。pi 边界直出为 ExecuteOptions.maxTurns
102
- * → runSpawn(D6 合流后无中间映射层)。
103
- */
104
- maxTurns?: number;
105
- /**
106
- * Turn limiter 的宽限轮数(原 AgentTaskSpec.graceTurns 并入):超 maxTurns 后
107
- * 允许继续的轮数(等待在途工具收尾)。pi 引擎消费;workflow agent() 无写入方,
108
- * chat 域(ExecuteOptions.graceTurns 同名透传)经 host-task-spec 填充。
109
- */
110
- graceTurns?: number;
111
- /**
112
- * Skill name to load (e.g. "code-review"). Resolved to SKILL.md path
113
- * and injected via --skill flag in the subprocess.
114
- */
115
- skill?: string;
116
- /**
117
- * Resolved absolute path to the skill directory or SKILL.md file.
118
- * Set by agent-opts-resolver when opts.skill is present.
119
- */
120
- skillPath?: string;
121
- /** Human-readable description for logging and debugging. */
122
- description?: string;
123
- /**
124
- * Agent ref (absolute .md path). Resolved by resolveIdentity via getAgentConfig,
125
- * which injects the agent's systemPrompt/model/tools/thinkingLevel. Not handled by
126
- * resolveAgentOpts (single-responsibility: agent ref ownership belongs to resolveIdentity,
127
- * M2 fix — previously overlapped causing double-injection + model-tier confusion).
128
- */
129
- agent?: string;
130
- /**
131
- * System prompt injection CONTENT (not file paths).
132
- * Set by agent-opts-resolver: schema structured-output instruction string.
133
- * Agent systemPrompt is NOT included here (handled by resolveIdentity/agentConfig).
134
- * pi 边界直出为 ExecuteOptions.appendSystemPrompt(同名同义透传,D6 合流后无中间映射层)。
135
- */
136
- appendSystemPrompt?: string[];
137
- /**
138
- * Schema JSON for PI_WORKFLOW_SCHEMA env var.
139
- * Set by agent-opts-resolver when opts.schema is present (值 = stringifySchemaCached
140
- * compact,与 schema 派生等值); passed as env var to activate the structured-output
141
- * tool + hook. pi 边界直出时 schema 派生优先、本字段兜底(解耦形态通道,生产不可达)。
142
- */
143
- schemaEnv?: string;
144
- /**
145
- * Per-call 工作目录(ADR-029 决策 1)。传给 child_process.spawn 的 cwd option。
146
- *
147
- * 用于 worktree 隔离:传入 worktree 绝对路径,spawn 的 pi 子进程绑定到该目录,
148
- * 其内部的 createAgentSession/ResourceLoader/bash 工具都在该目录运行。
149
- * undefined 时 spawn 继承 workflow 进程的 cwd(向后兼容)。
150
- */
151
- cwd?: string;
152
- /** Inherit parent session context (fork mode). Independent of worktree (file isolation). */
153
- fork?: boolean;
154
- /**
155
- * fork-from 显式分叉源 session 文件(fork-from 断联恢复通道的唯一 lossless 载体)。
156
- * 来源 = ExecuteOptions.forkFromSessionFile(host-task-spec 映射时的唯一改名点——
157
- * 本形状起与 SDK 协议字段、引擎侧 SpawnRunParams.forkSource 三层同名,降低跨层
158
- * 双名漂移面)。区别于 fork:true(主 session 作分叉源):本字段点名任意已有
159
- * session 文件。chat 域唯一写入方 = fork-from action。
160
- */
161
- forkSource?: string;
162
- /**
163
- * 执行引擎 id(P4 D9 三层优先级的第一层:调用参数级,workflow step 显式指定)。
164
- * 仅限「必须某引擎独有能力」的场景使用并注释原因(D9③ workflow 脚本不写死
165
- * engine——环境差异由 frontmatter/全局默认承载);透传链 worker-script-builder
166
- * agent() → execute-agent-call → SAR 路由层。
167
- */
168
- engine?: string;
169
- /** Filesystem isolation: when true, creates a new git worktree for the agent. Independent of fork.
170
- * [D6 合流] 类型扩展为 boolean | WorktreeHandle(原 AgentTaskSpec.worktree 的超集)——
171
- * WorktreeHandle 形态仅在 chat 域(复用外部已创建的 worktree)出现,workflow agent()
172
- * 恒传 boolean。 */
173
- worktree?: boolean | WorktreeHandle;
174
- /** When true, agent() resolves {value, sessionFile, worktreePath, error} instead of a bare value.
175
- * Worker-layer flag only — not consumed by any engine (dropped at the pi boundary). */
176
- returnMeta?: boolean;
177
- /**
178
- * 可持续对话模式(原 AgentTaskSpec.conversation 并入):true = record 标记 chatMode,
179
- * 轮次完成进 idle 态等待 message 续聊。chat 域(ExecuteOptions.conversation 同名)经
180
- * host-task-spec 填充;workflow agent() 无写入方。
181
- */
182
- conversation?: boolean;
183
- /**
184
- * 空闲超时毫秒数(原 AgentTaskSpec.idleTimeoutMs 并入,仅 conversation 模式有意义)。
185
- * 优先级:参数 > env XYZ_SUBAGENT_IDLE_TIMEOUT_MS > 默认 300000ms;显式 0/负 = 禁用
186
- * idle GC。chat 域经 host-task-spec 填充。
187
- */
188
- idleTimeoutMs?: number;
189
- /**
190
- * 工具 denylist(原 AgentTaskSpec.denyTools 并入,中立新增面):各引擎做语法映射
191
- * (zcode buildZcodeArgv 消费;pi 链路暂无对应面)。无 workflow 写入方,预留形状。
192
- */
193
- denyTools?: string[];
194
- /**
195
- * 中立权限模式(原 AgentTaskSpec.permissionMode 并入,预留形状):映射按各引擎
196
- * capabilities.permissionMode。无生产写入方/消费者。
197
- */
198
- permissionMode?: string;
199
- }
200
-
201
- /**
202
- * 单次 agent 调用的结果(统一形态)。
203
- *
204
- * Engine 直接消费 SubprocessAgentRunner 返回值;callCache replay 时 worker
205
- * 取 parsedOutput ?? content(见 worker-script-builder.ts 消息处理)。
206
- */
207
- interface AgentResult$1 {
208
- /** Raw text output from the agent. */
209
- content: string;
210
- /**
211
- * [D5-③] 失败分诊结构化标签(AgentFailureKind)。产出侧唯一识别点 =
212
- * execution/engine/inproc pi 引擎目录/output-collector.ts(collectResult 对最终 error
213
- * 分类后写入,经 agent-result-mapper / AgentOutcome 透传到本形态);消费侧
214
- * execute-agent-call 读本字段分诊,不再扫 error 文案子串。
215
- *
216
- * 仅在 error !== undefined 时有意义(成功时缺省);缺省视为 unknown = 可重试
217
- * (语义守恒,见 AgentFailureKind)。
218
- */
219
- failureKind?: AgentFailureKind;
220
- /**
221
- * Parsed structured output.
222
- * Present when `schema` was provided and the output was valid JSON.
223
- * Source: tool_execution_end.result.details(validated data object)。
224
- */
225
- parsedOutput?: unknown;
226
- /** Token and cost usage accumulated across all assistant turns. */
227
- usage?: AgentOutcomeUsage;
228
- /** Wall-clock duration in milliseconds. */
229
- durationMs?: number;
230
- /** True when the pi process exited with code 0. */
231
- error?: string;
232
- /**
233
- * Pi session ID for the subagent process (uuidv7).
234
- * Present when pi emits a session header (default in --mode json).
235
- * Can be used to locate the session JSONL file for post-run inspection (G-017)。
236
- */
237
- sessionId?: string;
238
- /**
239
- * Session JSONL 绝对路径(不含目录的文件名在 subagents 侧 AgentResult.sessionFile)。
240
- * 由 mapToWorkflowAgentResult 从 subagents AgentResult 透传——让 workflow 编排层
241
- * 继承 subagent 执行管道产出的 session 文件路径,overlay/GUI 可直接定位。
242
- * 窗口期内可能 undefined(session 尚未创建成功)。
243
- */
244
- sessionFile?: string;
245
- /**
246
- * Absolute path of the git worktree used for filesystem isolation (set when
247
- * worktree isolation is active). Injected by executeAndAwait from record.worktreeHandle.path.
248
- *
249
- * ⚠️ Diagnostic only, may not exist: executeAndAwait's finalizeRecord cleans up the
250
- * worktree (git worktree remove --force) before returning, so by the time this field
251
- * reaches the caller the directory has typically been deleted. Use it only for log/trace
252
- * correlation (e.g. attributing a session jsonl to its worktree origin) — never as a cwd
253
- * for a subsequent agent or filesystem operation (would ENOENT).
254
- */
255
- worktreePath?: string;
256
- /** All tool calls collected from JSONL stream (FR-7). */
257
- toolCalls?: ToolCallEntry[];
258
- }
259
- /**
260
- * 执行追踪节点(事件流 D-10 单一来源)。
261
- */
262
- interface ExecutionTraceNode {
263
- stepIndex: number;
264
- agent: string;
265
- task: string;
266
- model: string;
267
- status: "pending" | "running" | "completed" | "failed";
268
- /** Phase name for TUI grouping. Set from explicit opts.phase or global _currentPhase. */
269
- phase?: string;
270
- startedAt?: string;
271
- completedAt?: string;
272
- result?: AgentResult$1;
273
- error?: string;
274
- /**
275
- * Pi session ID (uuidv7) for the subagent process.
276
- * Used to locate the session JSONL for post-run inspection.
277
- */
278
- sessionId?: string;
279
- /**
280
- * Session JSONL 绝对路径。finalizeCall 从 result.sessionFile 透传。
281
- * 持久化到快照(serializeRun),跨 session 重水合后保留。
282
- */
283
- sessionFile?: string;
284
- /**
285
- * Live 执行进度对象(running 时存在,done 时由 dispatchAgentCall 清除)。
286
- *
287
- * 挂在 node 上(D-10 单源延伸:AgentCall.traceNode 与 Trace.nodes 共享同一引用)。
288
- * TUI 通过 trace.toArray() 读 node.live,派生 getEventLog/getCurrentActivity 实时展示。
289
- * 不持久化(序列化时 strip;重跑时由 dispatchAgentCall 重建)。
290
- */
291
- live?: ExecutionRecord;
292
- }
293
- /**
294
- * Trace.update 用的 patch(字段全可选)。
295
- *
296
- * 不变式:只改单个 node 的 status/result/error/completedAt/sessionId。
297
- * callId 不存在时 update 为 no-op(D-10)。
298
- */
299
- interface TracePatch {
300
- status?: "pending" | "running" | "completed" | "failed";
301
- result?: AgentResult$1;
302
- error?: string;
303
- completedAt?: string;
304
- sessionId?: string;
305
- sessionFile?: string;
306
- }
307
- /**
308
- * Worker console.* 捕获条目(run 级诊断,仅展示在 TUI widget,不泄漏到 input area)。
309
- */
310
- interface WorkerLogEntry {
311
- level: "log" | "warn" | "error" | "info";
312
- message: string;
313
- }
314
-
315
- /**
316
- * ModelRegistry 的最小接口(duck-typed,测试可 mock)。
317
- * 字段结构与 Pi SDK 的 ctx.modelRegistry 对齐。
318
- */
319
- interface ModelRegistryLike {
320
- /** 返回所有已配置鉴权的可用模型。 */
321
- getAvailable(): ModelInfo[];
322
- /** 按 (provider, modelId) 查找。 */
323
- find(provider: string, modelId: string): ModelInfo | undefined;
324
- /** 校验模型鉴权是否就绪。 */
325
- hasConfiguredAuth(model: unknown): boolean;
326
- }
327
- /**
328
- * 模型信息(registry 返回元素 / ctx.model 鸭子类型兼容)。
329
- * ctx.model(SDK Model<Api>)是此类型的超集,运行时直接当 ModelInfo 用。
330
- */
331
- interface ModelInfo {
332
- id: string;
333
- name: string;
334
- provider: string;
335
- reasoning: boolean;
336
- thinkingLevelMap?: Record<string, unknown>;
337
- contextWindow?: number;
338
- }
339
- /** agent .md frontmatter 解析结果。 */
340
- interface AgentConfig {
341
- /** agent 名(文件名 basename)。 */
342
- name: string;
343
- /** system prompt(markdown 正文)。 */
344
- systemPrompt: string;
345
- /** tool allowlist(三层过滤之一)。 */
346
- tools?: string[];
347
- /** 默认模型 override("provider/modelId")。agent 作者显式指定。 */
348
- model?: string;
349
- /** 默认 thinkingLevel override。 */
350
- thinkingLevel?: string;
351
- /** 默认 background 模式(true 时无显式 wait 走 background)。 */
352
- defaultBackground?: boolean;
353
- /**
354
- * 执行引擎 id(agent .md frontmatter engine 字段,D9 per-agent 主通道)。
355
- * 解析期已对注册表校验(未注册 id 在 agent-registry 抛 EngineNotFoundError);
356
- * 执行侧(P4 路由层)按 调用参数 > 本字段 > 全局默认 三层取值。
357
- */
358
- engine?: string;
359
- }
360
- /** 解析结果(model 实例 + 生效的 thinkingLevel)。 */
361
- interface ResolvedModel {
362
- model: ModelInfo;
363
- thinkingLevel: string | undefined;
364
- }
365
-
366
- /**
367
- * 未显式指定 agent 时的兜底名。
368
- *
369
- * 必须是真实存在、可被 agentRegistry 发现的 agent(用户 agentDir 内置的通用 agent)。
370
- * Service 层(resolveIdentity)与 TUI 层(extractAgentName)共用此常量,保证
371
- * 「调用时显示的名」与「实际加载的 agent.md」一致。
372
- *
373
- * [HISTORICAL] 旧实现两处各硬编码:service 用 "default"(虚构名),format 用
374
- * "worker"(真实但不是兜底语义,worker agent 已在 2026-08 agent 重构中删除)。
375
- * 导致不传 agent 时,block 标题显示 worker,但实际执行兜底逻辑不一致。统一为
376
- * general-purpose 后名实相符。
377
- */
378
- declare const DEFAULT_AGENT_NAME = "general-purpose";
379
- /**
380
- * 唯一执行状态。所有路径共用。v4 B-1 两态收敛:旧 idle 折入 running、
381
- * 旧 cancelled 折入 closed(closedReason='cancelled' 区分)。
382
- *
383
- * running = 活跃态。含两种子态(由派生谓词区分,见 lifecycle-predicates.ts):
384
- * - 对话模式等待续聊(旧 idle):进程可能保活(isIdle=hasIdleTimer)或已回收
385
- * 待冷路径 resume(isResumable=running && 无活进程句柄)。
386
- * - 正在执行(有活进程句柄)。
387
- *
388
- * closed = 统一终态(done/failed/crashed/cancelled 合并)。具体关闭原因由
389
- * {@link ClosedReason} 子枚举表达(如 user-close / gc / cancelled / parent-shutdown)。
390
- * ExecutionRecord.closedReason 携带 L2 原因,投影层按需派生对外语义(error / ended)。
391
- */
392
- type ExecutionStatus = "running" | "closed";
393
- /**
394
- * closed 终态的 L2 关闭原因子枚举。
395
- *
396
- * 与 ExecutionStatus="closed" 配合使用,表达「为什么关闭」:
397
- * parent-shutdown — 父进程 session_shutdown 时回收子进程
398
- * parent-fork — 父进程 fork 新 session 时清理旧子进程
399
- * parent-new — 父进程创建新 subagent 时清理旧子进程
400
- * user-close — 用户手动 close action(含对话模式 close)
401
- * cancelled — 用户取消(close(force:true) / cancelBackground)
402
- * gc — 通用完成/失败(一次执行自然结束、超时、错误等无专属 reason 的终态)
403
- * disconnected — .finalized sidecar 存在但无 reason 内容(磁盘重建兜底):
404
- * 正常结束但死因不可考——旧格式 sidecar(v8.5 前写入的是空文件)、
405
- * 或外部工具手工创建。替代旧的误导性 "gc" 兜底(自然完成 vs 断联
406
- * 不分),message/fork-from 据此给出可行动指引。
407
- */
408
- type ClosedReason = 'parent-shutdown' | 'parent-fork' | 'parent-new' | 'user-close' | 'cancelled' | 'gc' | 'disconnected';
409
- /**
410
- * [v8.5 D] 透明重生守卫拒绝专用错误:messageHandler 的 endedMessageGuard 必须原样
411
- * 透传本类错误(自带完整行动语言),不得按 A1 分流规则改写——否则 worktree/异进程
412
- * 占用文案会被「fork-from 指引」覆盖,误导 agent 走已被判死的通道。
413
- */
414
- declare class ResurrectDeniedError extends Error {
415
- }
416
- /** ClosedReason 全枚举值(运行时守卫用——防御性解析外部输入时校验成员资格)。 */
417
- declare const CLOSED_REASONS: readonly ClosedReason[];
418
- /**
419
- * 终态三态对外语义(U3 C-outcome 一等披露)。
420
- *
421
- * 由 completeRecord 唯一写入点按 deriveOutcome 一次计算(判定顺序:cancelled 优先
422
- * → error 非空 → completed),消费方(project/list/notify 文案/渲染器)只读本字段,
423
- * 不再各自手写成败推导 switch(三处同构 switch 已随 U3 收敛删除)。
424
- *
425
- * [D6 显式取舍] parent-shutdown/parent-fork/parent-new 合成关闭(subagent-service
426
- * disposeAllRecords 合成 result 恒写 error:"closed due to ...")落 "failed"——语义为
427
- * 「父进程关闭时子 agent 未完成即失败」,选定行为而非疏漏,勿当 bug 改回 cancelled。
428
- */
429
- type ExecutionOutcome = "completed" | "failed" | "cancelled";
430
- /**
431
- * 对外投影的 outcome 联合:含历史 record(outcome 字段诞生前的存量数据)兼容态。
432
- * 投影层(projectOutcome 唯一出口)对无 outcome 字段的 closed record 按
433
- * deriveOutcome(closedReason, error) 兜底派生;"closed-legacy" 预留给连派生输入都
434
- * 不足以判读的存量形态,消费方必须处理该成员(不得因未知值崩溃)。
435
- */
436
- type ProjectedOutcome = ExecutionOutcome | "closed-legacy";
437
- /**
438
- * 对外四态(设计决策 10 细则 3):内部 ExecutionStatus(v4 B-1 两态)收敛为 agent
439
- * 可理解的状态语义。真实映射只有两条:
440
- * running → active / closed → ended(closed 统一终态,含 cancelled)。
441
- * mapExternalState 不消费 ClosedReason——closed 恒映射 ended。
442
- *
443
- * waiting / error 是历史多态映射(idle→waiting / failed+crashed→error)的遗留声明:
444
- * 对外四态联合契约不变,但当前状态机不产生这两个值。
445
- *
446
- * 原始 ExecutionStatus 进 list item 的 status 字段供调试;state 是对外主字段。
447
- * 映射实现见 subagent-actions.ts mapExternalState——未来内部加态必须扩展该处,
448
- * 漏加会在 default 分支编译报错,不影响对外契约。
449
- */
450
- type ExternalState = "active" | "waiting" | "ended" | "error";
451
- /** 执行模式。background = 调用方立即拿 handle 返回,子 agent 在 detached promise 里跑。 */
452
- type ExecutionMode = "background";
453
-
454
- /**
455
- * eventLog 条目(getEventLog 派生产出的元素)。所有字段 readonly。
456
- *
457
- * text_output / thinking 类型已移除——它们是 100 字切片的碎片副产物,
458
- * 现在完整内容收口在 record.turns[] 里,eventLog 只承载离散语义事件
459
- * (tool 调用 / turn 边界 / error)。
460
- */
461
- interface AgentEventLogEntry {
462
- readonly type: "tool_start" | "tool_end" | "turn_end" | "error";
463
- readonly label: string;
464
- /** 事件发生的墙钟时间戳(Date.now(),ms)。由 getEventLog 从 turns[] 派生时记录。 */
465
- readonly ts: number;
466
- readonly status?: "running" | "done" | "failed";
467
- }
468
- /**
469
- * [STEP3] displayItem:从 turns[] 派生的展示项(对齐 nicobailon getDisplayItems)。
470
- *
471
- * 与 eventLog 的区别:eventLog 承载离散语义事件(tool_start/tool_end/turn_end),
472
- * displayItem 承载「可渲染单元」(toolCall 含完整 name+args 供 formatToolCall 格式化;
473
- * text 含 assistant 正文)。renderResult compact 分支改用 displayItems 后,
474
- * 行格式与 nicobailon 完全一致(→ formatToolCall)。
475
- */
476
- interface DisplayItem {
477
- readonly type: "toolCall" | "text";
478
- /** toolCall:tool 名称(bash/read/edit...);text:无。 */
479
- readonly name?: string;
480
- /** toolCall:tool 原始 args(供 formatToolCall 提取路径/命令);text:无。 */
481
- readonly args?: Record<string, unknown>;
482
- /** toolCall:执行状态(running 时无✓/✗标记);text:正文文本。 */
483
- readonly status?: "running" | "done" | "failed";
484
- /** text:assistant 正文(compact 时取首行/截断)。 */
485
- readonly text?: string;
486
- }
487
- /** 一次 session 执行的完整结果。collectResult 产出,写入 Record.outcome。 */
488
- interface AgentResult {
489
- text: string;
490
- turns: number;
491
- durationMs: number;
492
- success: boolean;
493
- error?: string;
494
- /**
495
- * [D5-③] 失败分诊结构化标签(类型 SSOT 在 orchestration/models/types.ts 的
496
- * AgentFailureKind——消费语义「unknown=可重试」与其文档同源)。collectResult 对
497
- * 最终 error 分类后写入;缺省 = unknown(可重试)。type-only 引用零运行时依赖。
498
- */
499
- failureKind?: AgentFailureKind;
500
- sessionId: string;
501
- toolCalls: ToolCall[];
502
- usage?: AgentUsageTotal;
503
- /** /resume /fork 可恢复的 session 文件名(不含目录)。 */
504
- sessionFile?: string;
505
- /** schema 模式下,structured-output tool 的 result.details(已通过 schema 校验)。 */
506
- parsedOutput?: unknown;
507
- }
508
-
509
- /** alive marker:子进程存活标记,用于心跳检测和 crash 推断。 */
510
- interface AliveMarker {
511
- readonly pid: number;
512
- readonly id: string;
513
- readonly startedAt: number;
514
- }
515
- /** git diff patch 结果。 */
516
- interface PatchResult {
517
- readonly patchFile: string;
518
- readonly failed: boolean;
519
- /** patch 是否实际写入 patchFile。true=diff 非空且写盘成功;false=空 diff 或写失败。
520
- * 调用方据此回填 record.patchFile,避免悬空路径(`git apply` 不存在的文件)。 */
521
- readonly written: boolean;
522
- }
523
- /** fork depth 超限错误。 */
524
- declare class ForkDepthExceededError extends Error {
525
- constructor(message: string);
526
- }
527
- /** worktree 有未提交变更错误。 */
528
- declare class DirtyWorktreeError extends Error {
529
- constructor(message: string);
530
- }
531
- /**
532
- * 所有执行路径的唯一状态源。
533
- *
534
- * 收口设计:一次执行的完整内容(text/thinking/toolCalls/usage)按 turn 收口在
535
- * `turns: Turn[]` 里。eventLog / currentActivity / result 文本均从 turns[] 派生
536
- * (getEventLog / getCurrentActivity / getFullText),不再独立存储切片或缓冲。
537
- *
538
- * 生命周期:createRecord() 创建 → updateFromEvent() 实时更新(累积进 turns)→
539
- * completeRecord() 冻结 → archive 立即移出内存(读时从 session.jsonl 重建)。
540
- *
541
- * TUI 永远拿 RecordSnapshot(.slice() 快照),不直接持此可变对象。
542
- */
543
- interface ExecutionRecord {
544
- /** 唯一 ID(sync: "run-N",bg: "bg-N-xxx")。 */
545
- readonly id: string;
546
- readonly agent: string;
547
- readonly model: string;
548
- readonly thinkingLevel: string | undefined;
549
- readonly mode: ExecutionMode;
550
- readonly task: string;
551
- /**
552
- * 人类可读的短标签(≤35 字符),简述本次 subagent「在做什么」。
553
- * 区别于 agent(类型名)/ task(完整 prompt)。旧持久化 record 反序列化时缺失兜底空串。
554
- */
555
- readonly slug: string;
556
- readonly startedAt: number;
557
- /** 根 Pi session ID(session 隔离过滤用)。递归链上所有层 record 同值。 */
558
- readonly rootSessionId: string | undefined;
559
- /** 直接父 subagent record ID(层级树构建用)。顶层 record 为 undefined。 */
560
- readonly parentRecordId: string | undefined;
561
- /** subagent 递归深度。顶层(主 session 直接创建)=0,每层嵌套 +1。 */
562
- readonly depth: number;
563
- /**
564
- * 对话模式标志(可持续对话 subagent)。true = 轮次完成进 idle 态(保留 record +
565
- * worktree)等待续聊,而非一次性终态化。
566
- * undefined/false = 一次性模式(默认,行为完全不变)。
567
- * 向后兼容:旧 record / 旧 session 文件无此字段,按一次性模式处理。
568
- */
569
- readonly chatMode?: boolean;
570
- /**
571
- * 执行态信号(residual-fixes 设计):true = 该 record 无活进程驱动(轮终 idle /
572
- * 重建孤儿兜底),处于「可续聊/等续聊」态——不是后台真在跑。轮终迁移
573
- * (doFinalizeRoundToIdle)置 true,冷路径续轮(进程启动)清除;GUI 侧
574
- * streaming/waiting 细分与 hasRunning 判据消费。缺省 falsy = 有进程或旧数据。
575
- */
576
- resumable?: boolean;
577
- /**
578
- * 空闲超时毫秒数(仅 chatMode 有意义)。覆盖默认 5min idle timeout。
579
- * 优先级:参数 > env XYZ_SUBAGENT_IDLE_TIMEOUT_MS > 默认 300000ms。
580
- * 向后兼容:旧 record 无此字段,按默认值处理。
581
- */
582
- readonly idleTimeoutMs?: number;
583
- /**
584
- * 实际执行引擎 id(P4 路由留痕,D9①)。创建时确定不可变;缺省(存量 record)
585
- * = pi 投影(消费方零迁移)。持久化经 subagent-record entry。
586
- */
587
- readonly engine?: string;
588
- /**
589
- * 引擎 fallback 留痕(D9①:probe 失败路由回默认引擎)。GUI 警告条数据源;
590
- * 缺省 = 无 fallback。持久化经 subagent-record entry。
591
- */
592
- readonly engineFallback?: {
593
- from: string;
594
- reason: string;
595
- };
596
- /**
597
- * 引擎自描述定位符(U2:非 pi run resolve 后回填、终态迁移落 entry 前——run 前
598
- * 缺省不可用)。sessionRef 整体透传(失败终态 sessionId 缺失时仍回填已有部分,
599
- * 读侧①级降②级的防御形态);journalPath 为 retarget 后实际落盘路径。pi 分支不
600
- * 回填(sessionFile 即定位符)。持久化经 subagent-record entry。
601
- */
602
- engineHandle?: {
603
- sessionRef: Record<string, string>;
604
- journalPath?: string;
605
- poolKey: string;
606
- };
607
- /**
608
- * 同步收集模式标记(subagent-sync-collect 设计 §3.1.3,U1 foundation 契约)。
609
- * 创建时确定不可变;undefined = async(缺省语义,旧记录零迁移)。持久化经
610
- * subagent-record entry(record-entry.ts 序列化白名单,entry 唯一写点)。
611
- * 消费方:U2 collectCoordinator 路由(sync→批缓冲)、U5 E1 重建投影。
612
- * U2 接线点:service.createRecordForMode 从 ExecuteOptions.collect 读入 identity。
613
- */
614
- readonly collectMode?: "sync";
615
- status: ExecutionStatus;
616
- /** L2 关闭原因子枚举(仅 status="closed" 时有意义)。表达「为什么关闭」。
617
- * 由 tryTransition(record, "closed", reason) 写入;投影层按需派生对外语义。
618
- * 向后兼容:旧 record 无此字段,按 gc 处理(通用完成/失败)。 */
619
- closedReason?: ClosedReason;
620
- /**
621
- * 终态三态对外语义(U3 C-outcome)。completeRecord 唯一写入点按 deriveOutcome
622
- * 一次计算,消费方只读本字段不再自行推导。向后兼容:旧 record / 磁盘重建
623
- * record 无此字段,投影层按 projectOutcome 兜底(closed-legacy 语义)。
624
- */
625
- outcome?: ExecutionOutcome;
626
- /**
627
- * 离开批的终局标记(subagent-sync-collect 设计 §3.1.3,U1 foundation 契约)。
628
- * 两出口统一落标:① 批闭合 flush 写账成功后;② E9 dispose 逐条转 async 写账后
629
- * (均 appendEntry 持久化,U3/U5 写点)。undefined = 未离开批 / 旧记录零迁移。
630
- * 消费方:U5 E1 重建扫描只收「collectMode=sync 且无本标记」的成员(防双重通知)。
631
- */
632
- batchFinalized?: boolean;
633
- /** 完整执行内容,按 turn 组织。createRecord 初始化为 [空 turn]。 */
634
- turns: Turn[];
635
- /** turn 计数(= turns.filter(closed).length,冗余存储供投影直接读)。 */
636
- turnCount: number;
637
- totalTokens: number;
638
- /** 运行期最近一次 error 事件的消息(getEventLog 派生 error 条目用)。 */
639
- lastError: string | undefined;
640
- /**
641
- * 对话轮次计数(仅 chatMode 有意义)。首轮运行时 = 0;每完成一轮(finalizeRoundToIdle
642
- * 进 idle)+1。undefined 时视为 0。非 chatMode 不自增。
643
- */
644
- round?: number;
645
- /**
646
- * [增量通知] 当前轮次增量的 turns[] 起始下标(仅 chatMode 有意义;内存态记账,D4 不持久化)。
647
- *
648
- * - 生命周期:undefined 视为 0(首轮增量 = 全量,与改造前首轮通知逐字节一致,向后兼容旧
649
- * record);唯一写点 onRoundSettled 第 5 步(notify 之后推进),唯一读点同回调第 2 步
650
- * (`getFullTextFrom(record, record.roundBaseTurnIndex ?? 0)`)。非 chatMode 恒
651
- * undefined(onRoundSettled 是 session-runner chatMode 分支专属回调)。
652
- * - D1 滞后空 turn 防丢文本(防御性):pi 当前事件序下该形态不可达——带 usage 的
653
- * message_end 恒先于 turn_end(@earendil-works/pi-agent-core dist/agent-loop.js
654
- * :240/:253/:547 三处 message_end emit 均在 :131 正常路径 turn_end 之前),settle 时
655
- * turn 全闭合。防 pi 未来事件序变化:若 settle 时刻末 turn 是滞后 message_end 开出的
656
- * 空 turn(execution-record.ts message_end 分支经 currentTurn,需同时过两层 usage 守卫:
657
- * session-runner.ts 转发层 `if (msg?.usage)`(bare message_end 不转发)+ execution-record.ts
658
- * 累积层 `if (event.usage)`(bare message_end 不开 turn)),推进公式
659
- * nextRoundBaseTurnIndex 把它留在下一轮增量内(新轮首个 text_delta 经 currentTurn 复用该
660
- * 空 turn,复用累积被 slice 覆盖);直用 turns.length 推进会把下轮首段文本挤出 slice
661
- * 范围静默丢失。
662
- * - D4 不持久化:磁盘重建走 createRecord(turns 仅为初始 [emptyTurn()]),base=0 对空 turn
663
- * 的增量派生等价为空、天然产出仅新轮增量,持久化是死数据。故不写 manifest、不参与重建。
664
- * - pi 内部序锚定依据(R1 mitigation):@earendil-works/pi-agent-core 0.84.2
665
- * dist/agent-loop.js :108-111(error/aborted stopReason 也先 emit turn_end 再 agent_end)
666
- * 与 :131(正常路径 turn_end 收尾);agent_settled 在 agent_end 之后 emit,故未闭合
667
- * turn 只可能来自滞后事件。pi 升级若改变 turn_end/agent_end 时序,onRoundSettled 推进前
668
- * 的观测哨(末 turn 未闭合且 text 非空 → logger.warn)会留痕。
669
- */
670
- roundBaseTurnIndex?: number;
671
- /**
672
- * record 进入 idle 态的时间戳(ms)。finalizeRoundToIdle 设值;GC 定时器据此计算
673
- * 剩余 TTL。undefined = 非 idle 态(running/closed/cancelled)或旧 record 缺失字段。
674
- */
675
- idleSince?: number;
676
- /**
677
- * close 优雅关闭标志(M2-B3)。chatMode record 运行中调 `close {force:false}` 时置 true;
678
- * runAndFinalize 的 done 分流检查此标志——true 则终态化为 done(而非进 idle),并清标志。
679
- * undefined/false = 正常 idle 分流(对话模式轮次完成进 idle 等续聊)。
680
- * 仅 chatMode + running 时有意义;force:true(立即终止)不走此标志。
681
- */
682
- closeAfterRound?: boolean;
683
- endedAt: number | undefined;
684
- result: string | undefined;
685
- error: string | undefined;
686
- /** 完整 AgentResult(含 usage/toolCalls,完成时填)。 */
687
- agentResult: AgentResult | undefined;
688
- /** session jsonl 文件名。session 创建成功后由 session-runner.run() 回填(窗口期内 undefined)。 */
689
- sessionFile?: string;
690
- /**
691
- * [V2 决策 3] 子进程 pid(spawn 后由 session-runner 回填到内存 record)。
692
- *
693
- * 用于 lifecycle-manager 孤儿扫描(V2 §5.2 职责 4:父进程重启时按持久化 pid 扫收
694
- * 上次崩溃遗留的孤儿)。本字段仅在内存记账,持久化留 Step 5(record
695
- * 文件写入 pid + 启动时 scanOrphanProcesses 消费)。undefined = 尚未 spawn / 已退出。
696
- * 向后兼容:旧 record 无此字段,按无 pid 处理(孤儿扫描跳过)。
697
- */
698
- pid?: number;
699
- /** [MF#3] worktree 模式下子 agent 改动的 patch 文件路径(worktree 外,供调用方应用)。 */
700
- patchFile?: string;
701
- /** worktree 隔离时的 handle(仅 worktree:true 时存在;fork alone 无此字段)。 */
702
- worktreeHandle?: WorktreeHandle;
703
- /**
704
- * [review round2] 该 record 创建时启用了 worktree 隔离(跨重启磁盘重建时从 session
705
- * entry 的 worktree 标志恢复)。handle 本体不可序列化——跨重启后 worktreeHandle 恒
706
- * undefined,续聊(冷路径 resume)须拒绝(防 cwd 静默回落主 repo 破坏隔离)。仅内存
707
- * record 使用,与持久化无关;execute() 新建 record 不设(有真 handle 时无意义)。
708
- */
709
- hadWorktree?: boolean;
710
- controller: AbortController | undefined;
711
- }
712
- /**
713
- * Tool 返回的 details(内层扁平结构)。
714
- * 由 project(record) 唯一产出——sync/bg 两路径字段一致。
715
- * 含 mode + sessionFile(供外层 SubagentToolResult 分组 + spinner 判断)。
716
- *
717
- * 分层(spec FR-3):此为**内层**,不感知 action/外层分组。
718
- * 外层 SubagentToolResult 由 adapter 包裹产出(加 action/subagentId/sessionFile + 分组)。
719
- */
720
- interface SubagentToolDetails {
721
- status: ExecutionStatus;
722
- /**
723
- * 终态三态对外语义(U3 C-outcome,projectOutcome 唯一出口)。running → undefined;
724
- * 历史数据无 outcome 字段时兜底派生(见 ProjectedOutcome)。
725
- */
726
- outcome?: ProjectedOutcome;
727
- mode: ExecutionMode;
728
- agent: string;
729
- model: string;
730
- thinkingLevel: string | undefined;
731
- /** 短标签(≤35 字符),来自 record.slug。旧 record 反序列化时为空串。 */
732
- slug: string;
733
- turns: number;
734
- totalTokens: number;
735
- elapsedSeconds: number;
736
- eventLog: AgentEventLogEntry[];
737
- /** [STEP3] 从 turns[] 派生的展示项(对齐 nicobailon getDisplayItems)。 */
738
- displayItems: DisplayItem[];
739
- result?: string;
740
- error?: string;
741
- /** running 时的当前活动行(tool/thinking/text 优先级)。 */
742
- currentActivity?: {
743
- type: "tool" | "text" | "thinking";
744
- label: string;
745
- };
746
- /** schema 模式下,structured-output tool 的 result.details(对齐 workflow agent-pool)。 */
747
- parsedOutput?: unknown;
748
- /** session jsonl 文件名(不含目录)。窗口期内可能 undefined(session 尚未创建成功)。 */
749
- sessionFile?: string;
750
- /** [MF#3] worktree 模式下子 agent 改动的 patch 文件路径(worktree 外,供调用方应用)。 */
751
- patchFile?: string;
752
- }
753
- /** Hub.execute 的入参(sync/bg 共用)。mode 由 Hub 内部判定,不暴露给调用方。 */
754
- interface ExecuteOptions {
755
- task: string;
756
- /**
757
- * 短标签(≤35 字符),简述本次执行用途,展示在 TUI。必填。
758
- * workflow 内 agent() 调用时从 AgentCallOpts.description 透传而来。
759
- */
760
- slug: string;
761
- agent?: string;
762
- model?: string;
763
- thinkingLevel?: string;
764
- skillPath?: string;
765
- appendSystemPrompt?: string[];
766
- schema?: Record<string, unknown>;
767
- /** D-A6 bridge: workflow schemaEnv 经 ExecuteOptions 透传到 runSpawn childEnv。 */
768
- schemaEnv?: string;
769
- /**
770
- * Turn 上限 limiter。显式 0/负 = 显式不限:压过 SPAWN_WATCHDOG_ENV 兑底不挂
771
- * watchdog(SP-6 参数 > env,U5);undefined 未传才由 env 兑底。
772
- */
773
- maxTurns?: number;
774
- graceTurns?: number;
775
- /** sync 模式来自 Pi tool 框架;background 模式 hub 忽略,自建 controller。 */
776
- signal?: AbortSignal;
777
- /** 主 agent 当前模型(模型解析第三层兼底)。execute 调用方从 ctx.model 传入。 */
778
- ctxModel?: ModelInfo;
779
- /** background 完成回调(sync 不调)。 */
780
- onComplete?: (record: RecordSnapshot) => void;
781
- /** 是否继承父会话上下文(fork 模式,只继承上下文)。 */
782
- fork?: boolean;
783
- /**
784
- * [v8.5 B] fork-from 显式指定继承源 session 文件(非主 session)。
785
- * 与 fork:true 的区别:fork:true 用主 session 作 --fork 源;本字段用任意已有
786
- * session 文件(断联 subagent 接续场景)作源。优先级高于 fork;传了本字段时
787
- * fork 取值不影响 spawn 参数。仅 pi 引擎支持(同 fork)。仅 background tool
788
- * 层 fork-from action 使用;workflow / executeAndAwait 不消费。
789
- */
790
- forkFromSessionFile?: string;
791
- /** 文件系统隔离:true=创建新 git worktree,WorktreeHandle=复用外部已创建的;undefined=不隔离(parent cwd)。 */
792
- worktree?: boolean | WorktreeHandle;
793
- /** 覆盖执行 cwd(默认 mainCwd)。 */
794
- cwd?: string;
795
- /**
796
- * 可持续对话模式(决策 8:独立 chatMode 标志,不扩展 ExecutionMode)。
797
- * true = record 标记 chatMode,轮次完成进 idle 态(保留 record + worktree,等待 message 续聊);
798
- * undefined/false = 一次性模式(默认,行为完全不变)。service.execute 透传到 createRecordForMode。
799
- */
800
- conversation?: boolean;
801
- /**
802
- * 同步收集模式(subagent-sync-collect 设计 §3.1.3,U1 foundation 契约)。
803
- * undefined = config collectSync.default(缺省 "async",新 session 生效)。
804
- * schema 层枚举限 "async"|"sync";运行时宽收 string 与 engine 字段同风格
805
- * (非法值 ≠ "sync" 按 async 处理)。
806
- * "sync" + conversation:true 组合在 startHandler E4 校验即拒
807
- * (immediate throw,不产生半启动 record)。
808
- * U2 接线点:service.createRecordForMode 读入 createRecord identity.collectMode
809
- * (U1 打通类型与 startHandler 透传,record 落点归 U2)。
810
- */
811
- collect?: string;
812
- /**
813
- * 空闲超时毫秒数(仅 conversation 模式有意义)。覆盖默认 5min idle timeout。
814
- * 优先级:参数 > env XYZ_SUBAGENT_IDLE_TIMEOUT_MS > 默认 300000ms。
815
- * 显式传 0/负数 = 禁用 idle GC(不挂 timer;旧实现 0 会落成 setTimeout(0) 立即 kill)。
816
- */
817
- idleTimeoutMs?: number;
818
- /**
819
- * 实际执行引擎 id(P4 路由留痕):pi 引擎由 PiEngine.run 在还原 opts 时写入;
820
- * 缺省(历史调用方不设)= pi 投影。createRecordForMode 读入 record identity。
821
- */
822
- engine?: string;
823
- /**
824
- * 引擎 fallback 留痕(D9①:probe 失败路由回默认引擎时由路由层写入)。
825
- * from = 请求引擎 id,reason 恒 'engine_probe_failed'(GUI 警告条数据源)。
826
- */
827
- engineFallback?: {
828
- from: string;
829
- reason: string;
830
- };
831
- }
832
- /**
833
- * execute 返回值。
834
- * background: { mode:"background", subagentId, sessionFile, details } —— 立即返回。
835
- * subagentId 供后续 cancel/list 用;sessionFile 窗口期可能 undefined。
836
- */
837
- type ExecutionHandle = {
838
- mode: "background";
839
- subagentId: string;
840
- sessionFile: string | undefined;
841
- details: SubagentToolDetails;
842
- };
843
- /** list 的 item 结构。 */
844
- interface SubagentListItem {
845
- subagentId: string;
846
- agent: string;
847
- /** 短标签(≤35 字符),来自 record.slug。旧 record 反序列化时为空串。 */
848
- slug: string;
849
- /** 对外四态(决策 10 细则 3,主字段)。由 mapExternalState(status) 派生。 */
850
- state: ExternalState;
851
- /** 原始内部状态(调试用,供 details 展示)。 */
852
- status: ExecutionStatus;
853
- mode: ExecutionMode;
854
- /** 运行秒数(running 态实时计算,终态 endedAt-startedAt)。 */
855
- duration: number;
856
- model: string;
857
- totalTokens: number;
858
- /** session jsonl 文件名(窗口期内可能 undefined)。 */
859
- sessionFile?: string;
860
- /** 直接父 subagent record ID(顶层 record 为 undefined)。[v4 A-6] 从
861
- * record.parentRecordId 派生,配合 A-5 直接父守卫(message/close 仅作用于直接子)。 */
862
- parent?: string;
863
- /** 可冷路径 resume(running 且无活进程句柄)。[v4 A-6] B-1「可续聊」对外表达,
864
- * agent 据 list 判断哪些 running subagent 实际可续聊(vs 正在忙)。 */
865
- resumable?: boolean;
866
- /**
867
- * 终态三态对外语义(U3 C-outcome 一等披露,projectOutcome 唯一出口):
868
- * completed / failed / cancelled,历史 record 无 outcome 字段时兜底派生,
869
- * 不可判读的存量形态为 "closed-legacy"。GUI pane / agent 据此判读成败,
870
- * 无需翻 error 字段原文(S5)。
871
- */
872
- outcome?: ProjectedOutcome;
873
- }
874
- /** background 启动的内层响应(挂在 SubagentToolResult.bgResponse)。 */
875
- interface BgResponse {
876
- status: "running";
877
- mode: "background";
878
- /** 启动提示文案("detached, will notify on completion")。 */
879
- message: string;
880
- /**
881
- * 终态三态语义(U3 C-outcome 对外 JSON 契约完备位)。start 时点 record 尚未终态,
882
- * 恒 undefined(JSON.stringify 落键省略);终态成败语义经 list items[].outcome
883
- * 披露。旧字段 status/mode/message 原样保留(向后兼容)。
884
- */
885
- outcome?: ProjectedOutcome;
886
- /**
887
- * 通知投递契约回显位(U1 预置,U2 通知账本的契约声明)。恒值
888
- * "ledger+at-least-once":主 agent 在当前 run 结束或有限延迟内收到完成通知,
889
- * 送达保证为 at-least-once + notifyId 幂等可识别。字段与填充由 U1 负责,
890
- * 值语义由 U2(execution/notify-ledger.ts)兑现。
891
- */
892
- notifyContract: "ledger+at-least-once";
893
- /**
894
- * 同步收集登记回显段(subagent-sync-collect 设计 §3.1.1 交互样例,U1 foundation)。
895
- * 仅 resolved 模式为 sync 时附带(async 响应字节零变化,G3):mode = 生效模式;
896
- * pendingSyncCount = 当前未闭合批的 sync 成员总数(含本条;跨轮派发续累不重置,
897
- * 与 D2 隐式批一致)。
898
- */
899
- collect?: {
900
- mode: "sync";
901
- pendingSyncCount: number;
902
- };
903
- }
904
- /** list 的内层响应(挂在 SubagentToolResult.listResponse)。 */
905
- interface ListResponse {
906
- /** items 中 status==="running" 的计数(受 limit 截断如实反映,非全局总数)。 */
907
- running: number;
908
- items: SubagentListItem[];
909
- }
910
- /** cancel 的内层响应(挂在 SubagentToolResult.cancelResponse)。 */
911
- interface CancelResponse {
912
- cancelled: true;
913
- }
914
- /**
915
- * message 的内层响应(挂在 SubagentToolResult.messageResponse,决策 10 瘦身)。
916
- *
917
- * [R1 删除记录] 旧 PendingMessage(在途消息缓存条目,消费确认制,设计决策 6 状态×
918
- * interrupt 映射)已随 deliverToRunning 一并删除——SP-5 upgrade 后无生产调用方,
919
- * 配套三段消费链(push / message_start shift / redeliverPending 补投)全部不可达。
920
- * 详见 subagent-service.ts 的删除记录注释。
921
- */
922
- interface MessageResponse {
923
- delivered: true;
924
- }
925
- /** close 的内层响应(挂在 SubagentToolResult.closeResponse,决策 10 瘦身)。 */
926
- interface CloseResponse {
927
- closed: true;
928
- }
929
- /**
930
- * Tool 外层出参(renderResult + LLM content JSON 同源)。
931
- * adapter 唯一产出:领域对象(bg/list/cancel/message/close 五选一)+ action/subagentId/sessionFile。
932
- *
933
- * - background 启动 → bgResponse(subagentId 有值;sessionFile 窗口期可能 undefined)
934
- * - list → listResponse(最外层 subagentId/sessionFile 为 null,sessionFile 在各 item 内)
935
- * - cancel → cancelResponse(subagentId 有值;sessionFile 无意义,可为 null)
936
- * - message → messageResponse(subagentId 有值;sessionFile 无意义,可为 null)
937
- * - close → closeResponse(subagentId 有值;sessionFile 无意义,可为 null)
938
- */
939
- type SubagentToolResult = {
940
- action: "start";
941
- subagentId: string;
942
- sessionFile: string | null;
943
- slug: string; /** registry 全等回显(U1):放行即与 registry 条目全等,"provider/id" 形态。 */
944
- model: string;
945
- bgResponse: BgResponse;
946
- __gui__?: GuiRenderResult;
947
- } | {
948
- action: "list";
949
- subagentId: null;
950
- sessionFile: null;
951
- listResponse: ListResponse;
952
- __gui__?: GuiRenderResult;
953
- } | {
954
- action: "cancel";
955
- subagentId: string;
956
- sessionFile: null;
957
- cancelResponse: CancelResponse;
958
- __gui__?: GuiRenderResult;
959
- } | {
960
- action: "message";
961
- subagentId: string;
962
- sessionFile: null;
963
- messageResponse: MessageResponse;
964
- __gui__?: GuiRenderResult;
965
- } | {
966
- action: "close";
967
- subagentId: string;
968
- sessionFile: null;
969
- closeResponse: CloseResponse;
970
- __gui__?: GuiRenderResult;
971
- } | {
972
- action: "fork-from";
973
- subagentId: string;
974
- sessionFile: string | null;
975
- forkFromResponse: ForkFromResponse;
976
- __gui__?: GuiRenderResult;
977
- };
978
- /** fork-from 的内层响应:新 subagent id + 作为继承源的旧记录 session 文件。
979
- * [v8.5 B] 断联恢复通道——新 subagent 以 --fork 方式继承旧会话历史,源文件只读
980
- * 不续写(pi fork 建 branched session,copy-on-write)。 */
981
- interface ForkFromResponse {
982
- /** 新 subagent record id(接续对话用 action:'message')。 */
983
- newSubagentId: string;
984
- /** 作为继承源的旧 subagent session jsonl 绝对路径。 */
985
- sourceSessionFile: string;
986
- }
987
- /** /subagents list 左列展示单元。来自内存(running) 或 session.jsonl 重建(终态)。 */
988
- interface SubagentRecord {
989
- id: string;
990
- agent: string;
991
- /** 任务提示词(详情面板置顶展示)。磁盘/内存源均有。 */
992
- task: string;
993
- /** 短标签(≤35 字符)。磁盘重建源旧文件可能缺失→兜底空串。 */
994
- slug: string;
995
- status: ExecutionStatus;
996
- /** L2 关闭原因子枚举(仅 status="closed" 时有意义)。SP-1 新增。 */
997
- closedReason?: ClosedReason;
998
- /** 终态三态对外语义(U3 C-outcome)。磁盘重建源一等直读;无字段的存量兜底走 projectOutcome。 */
999
- outcome?: ExecutionOutcome;
1000
- mode: ExecutionMode;
1001
- startedAt: number;
1002
- /** 根 Pi session ID(session 隔离过滤用)。递归链上所有层 record 同值。 */
1003
- rootSessionId: string | undefined;
1004
- /** 直接父 subagent record ID(层级树构建用)。顶层 record 为 undefined。 */
1005
- parentRecordId: string | undefined;
1006
- /** subagent 递归深度。顶层 =0,每层嵌套 +1。 */
1007
- depth: number;
1008
- endedAt: number | undefined;
1009
- turns: number;
1010
- totalTokens: number;
1011
- model: string;
1012
- thinkingLevel: string | undefined;
1013
- eventLog: AgentEventLogEntry[];
1014
- /** [STEP3] 从 turns[] 派生的展示项(对齐 nicobailon getDisplayItems)。 */
1015
- displayItems: DisplayItem[];
1016
- /** running 时的当前活动行(仅内存源;磁盘重建无此数据)。streaming 可观测性用。 */
1017
- currentActivity?: {
1018
- type: "tool" | "text" | "thinking";
1019
- label: string;
1020
- };
1021
- result?: string;
1022
- error?: string;
1023
- sessionFile?: string;
1024
- /** [MF#3] worktree 模式下子 agent 改动的 patch 文件路径(worktree 外,供调用方应用)。 */
1025
- patchFile?: string;
1026
- /**
1027
- * [review round2] 创建时启用 worktree 隔离(磁盘重建源从 session entry 恢复;内存源由
1028
- * recordToSubagent 从 worktreeHandle 投影)。getRecordForAction 跨重启重建时据此拒绝续聊。
1029
- */
1030
- worktree?: boolean;
1031
- /**
1032
- * 对话轮次计数(仅 chatMode idle record 有意义)。round 仅在内存维护(doFinalizeRoundToIdle
1033
- * 递增),跨重启不恢复(round 无磁盘持久化);非对话模式 / 非 idle record 为 undefined。内存源由 recordToSubagent 从
1034
- * ExecutionRecord.round 投影。
1035
- */
1036
- round?: number;
1037
- /**
1038
- * 对话模式标志(与 ExecutionRecord.chatMode 同义;投影给 GUI 侧 streaming/waiting/done
1039
- * 细分判据——one-shot 轮终(chatMode 非 true + result 有值)显示完成态,chat 轮终显示
1040
- * 等续聊。内存源由 recordToSubagent 投影,磁盘源经 subagent-record entry 重建)。
1041
- */
1042
- chatMode?: boolean;
1043
- /**
1044
- * 执行态信号(与 ExecutionRecord.resumable 同义):true = 无活进程驱动的 running
1045
- * (轮终 idle / 重建孤儿兜底),GUI 侧据此排除「真在跑」判定。
1046
- */
1047
- resumable?: boolean;
1048
- /** 外部 Pi 实例(进程隔离模式下由外部启动的子进程)。 */
1049
- externalInstance?: AliveMarker;
1050
- /** fork 模式下的 worktree handle。 */
1051
- worktreeHandle?: WorktreeHandle;
1052
- /**
1053
- * 实际执行引擎 id(P4 路由留痕)。缺省 = pi 投影(存量 record 零迁移);
1054
- * GUI 警告条/引擎标记的数据源之一。
1055
- */
1056
- engine?: string;
1057
- /** 引擎 fallback 留痕(D9①:probe 失败路由回默认引擎)。GUI 警告条数据源。 */
1058
- engineFallback?: {
1059
- from: string;
1060
- reason: string;
1061
- };
1062
- /**
1063
- * 引擎自描述定位符(U1:EngineHandleData 的持久化消费面子集,引擎无关——
1064
- * sessionRef 整体透传不枚举内部键)。read 降级链①②级的数据源(runtime
1065
- * subagent-engine-history);缺省 = pi(走 JSONL 直读链)。
1066
- */
1067
- engineHandle?: {
1068
- sessionRef: Record<string, string>;
1069
- journalPath?: string;
1070
- poolKey: string;
1071
- };
1072
- /**
1073
- * 同步收集模式标记(与 ExecutionRecord.collectMode 同源投影/重建,U1 foundation)。
1074
- * 缺省(存量 record)= async 投影,消费方零迁移。
1075
- */
1076
- collectMode?: "sync";
1077
- /**
1078
- * 离开批终局标记(与 ExecutionRecord.batchFinalized 同源投影/重建,U1 foundation)。
1079
- * 缺省 = 未离开批;U5 E1 重建扫描据此排除已离场成员。
1080
- */
1081
- batchFinalized?: boolean;
1082
- }
1083
- /**
1084
- * 同步收集(sync collect)配置节类型(subagent-sync-collect 设计 §3.1.3,U1 foundation)。
1085
- * 权威默认值在 config.ts DEFAULT_COLLECT_SYNC;坏值 sanitize 回默认不炸启动(E5,
1086
- * 与 maxConcurrent 同判)。类型定义于 types.ts(避免 config → types 反向依赖成环),
1087
- * config.ts re-export。
1088
- */
1089
- interface CollectSyncConfig {
1090
- /** start 未显式传 collect 时的缺省模式。新 session 生效(与 engine 配置时机一致)。 */
1091
- default: "async" | "sync";
1092
- /** 批通知单条目结果正文预算(字符):超出截断并接 session_read 指针行。flush 时热读。 */
1093
- perItemChars: number;
1094
- /** 批通知结果正文总量预算(字符):Σ 超限时统一收紧 effectivePerItem(U4 算法)。flush 时热读。 */
1095
- totalChars: number;
1096
- }
1097
- /**
1098
- * 全局配置(~/.pi/agent/subagents/config.json)。
1099
- *
1100
- * 模型解析已退化为「主 agent model 优先,仅 override 时查 registry」——
1101
- * 不再有 category/fallback/yolo 字段。config.json 只保留 maxConcurrent
1102
- * (pool 大小)。旧 config.json 中的 categories/fallback 等字段读取时忽略。
1103
- */
1104
- interface SubagentsGlobalConfig {
1105
- version: number;
1106
- maxConcurrent: number;
1107
- /**
1108
- * 全局默认执行引擎(D9 三层优先级的最底层:调用参数 > agent frontmatter > 本值)。
1109
- * 缺省 'pi'(P4 路由层 DEFAULT_ENGINE_ID)。加载期只做类型校验,注册表校验归路由层。
1110
- */
1111
- defaultEngine?: string;
1112
- /** 引擎路由策略(D9①):strict=true 时一切 probe 失败直接报错(不 fallback)。 */
1113
- engineRouting?: {
1114
- strict: boolean;
1115
- };
1116
- /**
1117
- * 同步收集配置节(subagent-sync-collect 设计 §3.1.3,U1 foundation)。
1118
- * 整节缺省 = DEFAULT_COLLECT_SYNC(config.ts);逐字段 sanitize 回默认(E5)。
1119
- */
1120
- collectSync?: CollectSyncConfig;
1121
- }
1122
- /**
1123
- * Record 的只读视图。store.snapshot() 返回。
1124
- * TUI 拿到此类型,保证不会回写 Core 状态。
1125
- *
1126
- * 不含 eventLog——snapshot 的消费点(cancel 判 mode/status、hasRunning 判 mode、
1127
- * toNotifyRecord 取 result/error)均不读 eventLog。需要 eventLog 的场景用 project()
1128
- * 投影的 SubagentToolDetails。需要完整内容用 record.turns[](Core 内部)。
1129
- */
1130
- interface RecordSnapshot {
1131
- readonly id: string;
1132
- readonly agent: string;
1133
- readonly model: string;
1134
- readonly thinkingLevel: string | undefined;
1135
- readonly mode: ExecutionMode;
1136
- readonly task: string;
1137
- /** 短标签(≤35 字符)。来自 record.slug。 */
1138
- readonly slug: string;
1139
- readonly status: ExecutionStatus;
1140
- /** 对话模式标志(与 ExecutionRecord.chatMode 同源)。cancel 别名判定用。 */
1141
- readonly chatMode?: boolean;
1142
- readonly turns: number;
1143
- readonly totalTokens: number;
1144
- readonly startedAt: number;
1145
- readonly endedAt: number | undefined;
1146
- readonly result: string | undefined;
1147
- readonly error: string | undefined;
1148
- readonly sessionFile: string | undefined;
1149
- }
1150
-
1151
- /**
1152
- * 引擎会话句柄(run 返回、interact/read 入参)。
1153
- *
1154
- * 契约三条(D1):不透明(上层不解构——唯一例外是 record 持久化层序列化 data 字段与
1155
- * read 降级链)、可持久化(data 是纯 JSON,主会话 reload 后 read/interact 仍可用)、
1156
- * 自描述(data 含 engineId + 引擎 session 定位符 + pool key + adapter 版本)。
1157
- *
1158
- * 对进程已死的 handle 调 interact 必须返回 engine_session_not_resumable(指向 cold
1159
- * resume 路径),而非笼统失败——由各引擎 interact 实现保证。
1160
- */
1161
- interface EngineHandle {
1162
- /** 持久化数据。上层不得解构其内部字段(见契约三条)。 */
1163
- readonly data: EngineHandleData;
1164
- }
1165
-
1166
- /**
1167
- * subagent text_delta streaming sink。
1168
- *
1169
- * background subagent 执行期间,session-runner 的 agentEvent 出口把每个 text_delta
1170
- * 传到 SubagentStream.onDelta。本模块做 100ms 时间窗合并后,通过 StreamSink.setWidget
1171
- * 转发到 RPC stdout(经 ctx.ui.setWidget → extension_ui_request 通道)。
1172
- *
1173
- * SubagentStream 是一个生命周期对象——内聚 buffer/timer 状态 + onDelta/dispose 方法。
1174
- * 调用方(subagent-service)创建后只需在 text_delta 时调 onDelta、终态时调 dispose,
1175
- * 不需要拆散 push/clear 两个函数跨层透传。
1176
- *
1177
- * 设计要点:
1178
- * - leading edge:第一个 delta 立即 flush(前端尽快看到开始)
1179
- * - trailing edge:后续 delta 追加 buffer,timer 到期后 flush
1180
- * - 每次 flush 把 buffer 的累积文本 split("\n") 截尾 MAX_WIDGET_LINES 行传给 setWidget
1181
- * - dispose 清除 widget + 清 timer
1182
- */
1183
-
1184
- /** UI streaming sink 的最小接口(ctx.ui.setWidget 的 duck-typed 子集)。
1185
- *
1186
- * 当前只有一个 adapter(index.ts session_start 包装 ctx.ui.setWidget)。
1187
- * 保留接口而非裸函数类型,因为 StreamSink 的语义是「UI sink 契约」——
1188
- * 测试 mock 和未来可能的第二 sink(如写文件)都走此契约。 */
1189
- interface StreamSink {
1190
- setWidget(key: string, lines: string[] | undefined): void;
1191
- }
1192
- /**
1193
- * subagent text_delta streaming 生命周期对象。
1194
- *
1195
- * 创建后:
1196
- * - `onDelta(delta)`:session-runner 每次 text_delta 调
1197
- * - `dispose()`:subagent 终态时调,清除 widget + 清 timer
1198
- *
1199
- * buffer/timer 状态全部内聚在此对象,调用方不需要关心合并逻辑。
1200
- */
1201
- declare class SubagentStream {
1202
- private readonly widgetKey;
1203
- private readonly sink;
1204
- private buffer;
1205
- private timer;
1206
- private hasFlushed;
1207
- private disposed;
1208
- constructor(recordId: string, sink: StreamSink);
1209
- /** 接收一个 text_delta 增量。空串静默丢弃(不消耗 leading edge)。 */
1210
- onDelta(delta: string): void;
1211
- /** 终态清理:清除 widget + 清 timer(幂等)。 */
1212
- dispose(): void;
1213
- private flush;
1214
- }
1215
-
1216
- /**
1217
- * run 的运行期上下文。任务声明(AgentCallOpts,D6 合流后的单一形状)与运行期句柄
1218
- * 分离——signal/ctxModel/onComplete 从 ExecuteOptions 移出(设计 §3.3.5 删字段去向),
1219
- * 因为它们是宿主注入的运行期对象,不属于跨引擎持久化的任务声明。
1220
- *
1221
- * 常驻进程友好(D1):onEvent 回调式(而非迭代器式)+ AbortSignal——引擎内部换常驻
1222
- * server 实现(未来 driver host)时接口不动。
1223
- */
1224
- interface RunContext {
1225
- /** = record.id(bg-N-xxx / run-N)——journal 文件名与池引用计数 key(P2 消费)。 */
1226
- taskId: string;
1227
- /** D5 隔离池(宿主分配,设计 §3.3.9;pi 无池化恒 'shared')。 */
1228
- poolKey: string;
1229
- /** abort 分级入口(D1:引擎原生中断 → 公共杀链兜底)。 */
1230
- signal?: AbortSignal;
1231
- /** 事件流出口(host 消费后统一落 journal,D6 第②级)。 */
1232
- onEvent?: (event: AgentEvent) => void;
1233
- /**
1234
- * model 解析第三层兜底(现有 D-008 语义不变)——**pi 链路专属兜底**:经
1235
- * taskSpecToExecuteOptions → resolveModel 第三层消费(PiEngine 直通)。自带
1236
- * provider 体系与缺省模型的引擎(如 zcode:requested > 引擎缺省常量链)按自身
1237
- * 默认链解析,不消费本字段(zcode 侧在「ctx 有模型但被忽略」时出声留痕,
1238
- * zcode-engine.warnIgnoredCtxModel)。
1239
- */
1240
- ctxModel?: ModelInfo;
1241
- /**
1242
- * text_delta streaming 通道(宿主侧 UI widget)。与 onEvent 平行的 text_delta 出口:
1243
- * background 路径 onEvent=undefined 但流式仍需送达(双通道互斥设计,见 session-runner
1244
- * agentEvent 出口注释)。pi 回填期承载 AgentRunner port 的 stream 透传(行为零变化),
1245
- * 语义上是宿主设施而非引擎专有——未来引擎的 text_delta 同样可走此通道。
1246
- */
1247
- stream?: SubagentStream;
1248
- /**
1249
- * [P1 pi 回填透传] 调用方已持有的 schema 激活预编码值(AgentCallOpts.schemaEnv 直传
1250
- * 形态)。生产路径中 resolveAgentOpts 恒耦合产出 schema+schemaEnv(值 = JSON.stringify
1251
- * (schema)),引擎从 task.schema 派生即可逐字节等值;解耦形态(有 schemaEnv 无
1252
- * schema)生产不可达、仅见于直构调用,派生无源——本字段是其唯一透交通道。
1253
- * 引擎在 task.schema 存在时忽略此值(派生优先,设计 §3.3.5 删字段去向)。
1254
- */
1255
- schemaEnv?: string;
1256
- /**
1257
- * [P4 D9①] 引擎 fallback 留痕(probe 失败路由回默认引擎)。路由层(routing.ts)
1258
- * 产出,引擎投影到 outcome.engineFallback(zcode 等无 record 通路的引擎以此留痕;
1259
- * pi 引擎另经 ExecuteOptions 投影进 record)。
1260
- */
1261
- engineFallback?: {
1262
- from: string;
1263
- reason: string;
1264
- };
1265
- /**
1266
- * [P4 对齐点③] 引擎声明实际隔离池 key(journal 落盘路径权威)。宿主创建 journal
1267
- * writer 时只能用缺省占位 poolKey(pi 恒 'shared'),非池化稳定的引擎(zcode 按
1268
- * provider+model 池化)在 prepare 期确定 poolKey 后回调本方法重定向 writer——
1269
- * 保证 journal 落盘路径与 handle.poolKey 同源(单一权威,不再两边推导)。
1270
- * 契约:必须在首个事件 emit 之前调用(zcode coarse 事件在终态后合成,天然满足;
1271
- * 未来流式引擎需在事件出口前调用)。
1272
- */
1273
- onPoolResolved?: (poolKey: string) => void;
1274
- /**
1275
- * [R4 §3.4 不变量 3] 运行中句柄回填通道:引擎在「session/create 应答到达后」
1276
- * 立即回调(早于 run resolve——stream 引擎的 run 生命周期远长于会话建立)。
1277
- * 与 onPoolResolved 分立两个时点:poolKey 在 prepare 期(onPoolResolved,连接
1278
- * 建立前即可知),sessionRef 在 create 应答后(本回调)。编排层收到后立即回填
1279
- * record.engineHandle 并落 entry——运行中的 GUI 经 entry 重建 record 即拿到
1280
- * ①②级读取钥匙,不再等 run resolve 后的终态回填。可选回调:不支持运行中回填
1281
- * 的引擎(spawn 单轮、终态即回填)不调用,宿主语义不受影响。
1282
- */
1283
- onHandleReady?: (partial: Pick<EngineHandleData, "sessionRef" | "poolKey">) => void;
1284
- /**
1285
- * [U0 D10] 引擎 spawn 的子进程句柄注册钩子(宿主终止链记账)。引擎在 spawn 成功后
1286
- * 同步回调(与 pi runSpawn 的 spawnedChildren.set 同构时机);宿主据此把 child 注册进
1287
- * session-runner 的 spawnedChildren Map(cancel SIGTERM / dispose 收割兜底 / killAll
1288
- * 全量清理对非 pi 引擎 record 生效)。close/error 后由宿主按句守卫移除。可选:引擎
1289
- * 内部不 spawn 进程(如未来常驻 driver host 实现)时不调用,宿主记账自然为空。
1290
- *
1291
- * 边界声明(R1 D6):本钩子只用于 per-record 一次性 spawn(一任务一进程模态)。
1292
- * 引擎持有的常驻进程(跨任务共享,如 app-server 常驻连接)不经本钩子注册、不进
1293
- * spawnedChildren Map——其生命周期完全归引擎 dispose 管理(防 per-record 重复
1294
- * SIGTERM / 单任务 abort 误杀共享进程)。
1295
- */
1296
- onChildSpawned?: (child: ChildProcess) => void;
1297
- /**
1298
- * [W3 v1.x] chat 会话形态参数(协议 run.params.chat 的 RunContext 承载位):
1299
- * - recordId:core 预建 record 的关联键(引擎据此上报首轮 runId 键之外的反向
1300
- * 载荷与 interact 定位)——task.conversation === true 的 chat 轮必传;
1301
- * - resume:冷续锚点(重开已 idle 的 session 续聊;pi 消费 sessionRef.sessionFile
1302
- * ——对照协议化设计前 SpawnResumeOpts.sessionFile 的锚点面)。
1303
- * 类型权威 = SDK RunChatParams(remote-engine 直传,结构互证由 implements 关系
1304
- * 在 typecheck 期承载)。非 chat 轮不传,wire 上不出现该键。
1305
- */
1306
- chat?: {
1307
- recordId: string;
1308
- resume?: ResumeAnchor;
1309
- };
1310
- /**
1311
- * [W3 v1.x] host/roundLifecycle 轮次生命周期消费口(第 9 反向通道,settled/idle/
1312
- * failed 三相位;关联键 runId|recordId 互斥)。首轮(run 会话形态)经 run 作用域
1313
- * 路由到达(runId 键);续聊轮(interact)无 runId——经 EnginePort
1314
- * registerChatRoundRoute 的 recordId 键路由到达(见下)。消费语义(arm/disarm/
1315
- * settled 交棒)归宿主编排层(settled-watchdog 协议事件面接线,W4 三入口)。
1316
- */
1317
- onRoundLifecycle?: (phase: HostRoundLifecycleParams) => void;
1318
- }
1319
- /**
1320
- * [W3 v1.x] chat 轮次反向通道路由(recordId 键)——interact 续聊轮的 streamDelta /
1321
- * roundLifecycle 分发目标(协议关联键裁定 D1-A:续聊轮无独立 runId)。与 run 作用域
1322
- * RunRoute 同构的薄消费面;注册/注销时机归宿主 chat 编排(轮开始注册、record 终态注销)。
1323
- */
1324
- interface ChatRoundRoute {
1325
- onStreamDelta?: (delta: string) => void | Promise<void>;
1326
- onRoundLifecycle?: (phase: HostRoundLifecycleParams) => void | Promise<void>;
1327
- }
1328
- /**
1329
- * run 的返回:终态 + 可持久化 handle。
1330
- *
1331
- * handle 语义(设计 §3.3.5 run 错误语义三条):prepare 期错误(credential_missing /
1332
- * model_not_available / prompt_too_large)在进程创建前 reject、不产生 handle;运行中
1333
- * 失败不 reject——合成 error outcome + 正常 handle 返回(record 必须收尾);abort 走
1334
- * 完杀链后同前(exitCode=null + error 含杀链标记)。
1335
- */
1336
- interface EngineRunResult {
1337
- handle: EngineHandle;
1338
- outcome: AgentOutcome;
1339
- }
1340
- /**
1341
- * subagent 执行引擎的唯一契约点(D1)。实现方:PiEngine(回填)/ ZcodeEngine(P3)/
1342
- * 未来各引擎适配器。上层(工具面/workflow 引擎/GUI)只消费中立类型,不感知引擎。
1343
- *
1344
- * 贯穿纪律(设计 §3.3.1):宿主编排——引擎只当单 agent 执行器,六家原生多 agent 机制
1345
- * 一律禁用不依赖。
1346
- */
1347
- interface EnginePort {
1348
- /** 注册表 key('pi' | 'zcode' | ...)。 */
1349
- readonly id: string;
1350
- /** D3(同步无副作用——调用前拒绝的判据)。 */
1351
- capabilities(): EngineCapabilities;
1352
- /** D7(factory 初始化 + 版本变化检测触发;opts.force 跳过缓存强探)。 */
1353
- probe(opts?: {
1354
- force?: boolean;
1355
- }): Promise<ProbeReport>;
1356
- /** D1 主语义:fire-to-completion。[D6 合流] task = AgentCallOpts(单一任务形状,
1357
- * 原 AgentTaskSpec 已并入——字段裁定见 orchestration/models/types.ts)。 */
1358
- run(task: AgentCallOpts, ctx: RunContext): Promise<EngineRunResult>;
1359
- /**
1360
- * D1 可选面:交互控制面。pi 首期原生实现(现有 chatMode 行为直通);不支持
1361
- * conversation 的引擎返回 engine_capability_unsupported(同步拒绝、不创建进程)。
1362
- */
1363
- interact(handle: EngineHandle, action: InteractAction): Promise<InteractResult>;
1364
- /** D6 三级降级链:①引擎原生读取 → ②宿主 event journal(P2)→ ③outcome-only。 */
1365
- read(handle: EngineHandle): Promise<SessionView>;
1366
- /**
1367
- * [W3 v1.x] 可选面:chat 轮次反向通道路由注册(recordId 键)。interact 续聊轮的
1368
- * streamDelta / roundLifecycle 按 recordId 关联(无 runId,D1-A),引擎进程发射后
1369
- * 经协议客户端分发到本路由。与 validateModel/listModels 同款的 additively-optional
1370
- * 演进:宿主 feature-detect(`typeof registerChatRoundRoute === "function"`),
1371
- * 未实现的引擎(不支持 chat 域或旧客户端)续聊轮 delta/生命周期静默不可达——
1372
- * conversation gate 已在派发前拦住无 chat 能力的引擎,本缺省只在「能力声明与
1373
- * 客户端实现错位」的诊断形态出现。返回注销函数(record 终态时宿主调用)。
1374
- */
1375
- registerChatRoundRoute?(recordId: string, route: ChatRoundRoute): () => void;
1376
- /**
1377
- * [U7] 可选面:模型可发现性——引擎自带 provider/model 体系时(如 zcode 的 v2 桌面
1378
- * 登录态),列出当前环境实际可用的模型清单(带凭据校验),供 system prompt 引擎段
1379
- * 与 GUI 引擎选择器消费。省略/返回 null = 「与主 agent 模型体系一致」(pi 的语义:
1380
- * system prompt 已有 <available_provider_models> 段,无需引擎再列)。
1381
- * engine-neutral:未来引擎(AcpEngine 等)实现本方法即自动获得注入与展示,宿主
1382
- * 侧零改动。
1383
- */
1384
- listModels?(): Array<{
1385
- id: string;
1386
- name?: string;
1387
- }> | null;
1388
- /**
1389
- * [u-h2 D2-2] 可选面:派发同步期 model 校验(引擎 registry 单源裁决)。实现引擎复用其
1390
- * prepare 期同一校验函数(zcode: resolveZcodeModelRef——同一函数两处消费,canonicalRef
1391
- * 归一化与短名缺省 provider 决策不产生双实现漂移);校验失败同步 throw(编排层包装为
1392
- * 「引擎与模型不配套」错误,见 engine/model-validation.ts)。
1393
- *
1394
- * modelRef undefined = 查询引擎缺省模型(D2-1:主 agent 的 pi id 不透传给非 pi 引擎,
1395
- * 缺省语义归引擎——zcode 落 ZCODE_FALLBACK_DEFAULT_MODEL)。返回 canonical ref 供
1396
- * record.model 留痕。[W3 契约变更④] 协议化后 canonicalRef 允许**无斜杠**形态
1397
- * (引擎原样返回的 ref)——core 侧按 provider=""/id=ref/整串进 name 拆分留痕
1398
- * (splitEngineModelRef 单一权威),不落 "<ref>/" 畸形。
1399
- *
1400
- * 未实现:model 透传,引擎自身 prepare 期校验兜底(现状语义);pi 不实现(pi 链走
1401
- * 既有三层解析 + assertCanonicalModelRef 裁决,搬迁是大重构,设计 D2-2 被否②)。
1402
- */
1403
- validateModel?(modelRef: string | undefined): {
1404
- canonicalRef: string;
1405
- };
1406
- /**
1407
- * [R1 D6] 可选停机面:释放引擎持有的常驻资源(如 app-server 常驻进程 / 长连接)。
1408
- * 幂等契约(§3.4 不变量 4):重复调用无副作用;dispose 后首个 run 自动重建(与
1409
- * 「进程死后重建」同一代码路径)。可选成员保持向后兼容——无常驻资源的引擎(pi
1410
- * 现状 spawn 单轮)不必实现。等待策略(D6①「触发不等待」):宿主收割入口
1411
- * (registry disposeEngines → killAllSpawnedChildren)只同步调用拿 Promise 不
1412
- * await,引擎实现须自行保证同步面(立即 fire close 帧 + 同步 SIGTERM)在返回
1413
- * Promise 前完成;grace→SIGKILL 升级序列属异步面(promise 段)。
1414
- */
1415
- dispose?(): Promise<void>;
1416
- }
1417
-
1418
- /** 引擎工厂:惰性创建引擎实例(getEngine 首次取用时执行)。 */
1419
- type EngineFactory = () => EnginePort;
1420
- /**
1421
- * 引擎包 manifest 注册期快照(session_start 扫描所得,非握手缓存——设计 §3.3「同步
1422
- * 成员清单」单一同步源原则)。descriptor 携带,cli 形态 port(RemoteEngine)的同步
1423
- * 成员(capabilities/listModels/validateModel)直读本快照。
1424
- *
1425
- * 与 client/remote-engine.ts 的 RemoteEngineManifestSnapshot 是结构闭包(后者多出
1426
- * core 中立类型包装;漂移由 protocol-closure 同族结构互证断言守卫)。
1427
- */
1428
- interface EngineManifestSnapshot {
1429
- /** manifest `capabilities`(同步能力位权威,注册期读,无缓存)。 */
1430
- capabilities: EngineCapabilities;
1431
- /**
1432
- * manifest `modelCatalog` 三态(W4 §2.4:缺省 = 不注入保持 undefined;null 合法等价
1433
- * 省略;`models: []` 仅作者显式声明)。解析器不得把省略填成 `[]`——否则「无枚举面」
1434
- * 语义不可达。
1435
- */
1436
- modelCatalog?: {
1437
- dynamic: boolean;
1438
- models: ModelCatalogEntry[];
1439
- } | null;
1440
- /** manifest `displayName`(可选,缺省 = id;D4 缺省引擎回落序的排序键)。 */
1441
- displayName?: string;
1442
- }
1443
- /** cli 形态 descriptor(目标形态):引擎 CLI 启动参数 + manifest 快照 + port 装配器。 */
1444
- interface CliEngineDescriptor {
1445
- kind: "cli";
1446
- /** 引擎 CLI 命令(发现器解析后的绝对路径/可执行名;不依赖 PATH)。 */
1447
- command: string;
1448
- /** 引擎 CLI 参数(不含 command 本身)。 */
1449
- args: readonly string[];
1450
- /** manifest `capabilities`(同步能力位权威——gate 同步消费,无缓存)。 */
1451
- capabilities: EngineCapabilities;
1452
- /**
1453
- * cli 形态 EnginePort 实例装配器(core 侧接线通道,非 manifest 面)。生产 = W4
1454
- * 发现器装载 descriptor 时装配(W2 `RemoteEngine` + `EngineClient` + 宿主侧参数
1455
- * dataDir/hostKind/engineConfig 等——registry 不越权猜宿主形态)。必须构造同步、
1456
- * 不 throw(§3.5.3 代理形态:缺包/坏包的失败推迟到首次协议调用)。
1457
- */
1458
- portFactory: EngineFactory;
1459
- /** manifest 快照余项(modelCatalog/displayName;capabilities 已提升为直读字段)。 */
1460
- manifest?: Omit<EngineManifestSnapshot, "capabilities">;
1461
- }
1462
- /**
1463
- * 缺省引擎 id(D4 重定义:**配置的缺省引擎 id**——config defaultEngine 未配置时的
1464
- * 归一名,不再表达「内置 pi 永久兜底」)。配置值不在已发现清单 → warn + 回落第一个
1465
- * 可用引擎(manifest displayName 稳定序,D4);全不可用 → 派发期 engine_not_found
1466
- * (「未发现任何引擎包」+ 安装指引)。
1467
- */
1468
- declare const DEFAULT_ENGINE_ID = "pi";
1469
- /**
1470
- * defaultEngine 缺省归一(单一权威源):空白 / undefined 归一到缺省引擎('pi')。
1471
- * 引擎感知检测 diff 与状态段渲染必须对同一读取结果给出同一引擎 id——若两处各自
1472
- * 内联归一,一致性只靠注释人工耦合,漂移即两处说谎;故收敛到本函数供各处调用。
1473
- * sanitize 保证透传值非空,但可能带首尾空格,故 trim 后再判。
1474
- */
1475
- declare function normalizeEngineId(engine: string | undefined): string;
1476
-
1477
- /** 单个引擎包的检查产物。 */
1478
- type PackageInspection = {
1479
- status: "ok";
1480
- entry: DiscoveredEngine;
1481
- } | {
1482
- status: "skip";
1483
- reason: string;
1484
- } | {
1485
- status: "unusable";
1486
- id: string | undefined;
1487
- reason: string;
1488
- };
1489
- /** 发现成功的引擎条目(装载序;同 id 后者覆盖前者)。 */
1490
- interface DiscoveredEngine {
1491
- id: string;
1492
- /** 发现源标签(env 名 / 宿主根 source / node-modules / config.json)。 */
1493
- source: string;
1494
- /** L3 显式 config(initialize.engineConfig 透传;L1/L2 manifest 发现无此项)。 */
1495
- engineConfig?: Record<string, string>;
1496
- descriptor: CliEngineDescriptor;
1497
- }
1498
- /**
1499
- * 检查单个候选包目录(读 package.json → manifest 字段级解析 → bin 可执行验证)。
1500
- * 三态:ok(装载)/ skip(必需字段缺失/不可解析——warn 跳过该包)/ unusable
1501
- * (protocol 不兼容、bin 不可执行——标记不可用,不进清单)。
1502
- */
1503
- declare function inspectEnginePackage(pkgDir: string, source: string, hostKind: string, env: NodeJS.ProcessEnv): PackageInspection;
1504
-
1505
- /** L1 引擎发现根 env(设计 §3.4;值形态 = path.delimiter 分隔的绝对路径列表)。 */
1506
- declare const ENGINE_ROOTS_ENV = "XYZ_AGENT_ENGINE_ROOTS";
1507
- /** L1 env 根解析:path.delimiter 分隔;空段跳过;非绝对路径丢弃 + warn;去重(大小写敏感)。 */
1508
- declare function parseEngineRootsEnv(env: NodeJS.ProcessEnv): string[];
1509
- /**
1510
- * L2 根推导:宿主进程入口(process.argv[1])所在目录逐级上溯的 node_modules——与
1511
- * createRequire(<宿主入口>) 的 require.resolve 候选目录链同构(「宿主 node_modules
1512
- * require.resolve」的扫描化:零枚举发现要求扫目录而非 resolve 具体包名)。打包态
1513
- * (staged 扩展 / Bun standalone 无 node_modules 结构)与 zsw vendor 态自然为空——
1514
- * 规格明确两态 L2 无效。argv[1] 不可得(嵌入式 / worker)→ L2 缺席。
1515
- */
1516
- declare function deriveNodeModuleRoots(argvEntry?: string | undefined): string[];
1517
-
1518
- /** 日志级别。对齐 @zhushanwen/pi-extension-logger 的 LogLevel(三值,无 info)。 */
1519
- type LogLevel = "debug" | "warn" | "error";
1520
- /** core logger 接口。与 pi-extension-logger 的 ExtensionLogger 结构兼容——
1521
- * u0-log 批次替换是纯 import 源替换,调用面(方法名/参数序)逐文件等价。 */
1522
- interface CoreLogger {
1523
- debug(msg: string, data?: unknown): void;
1524
- warn(msg: string, data?: unknown): void;
1525
- error(msg: string, data?: unknown): void;
1526
- }
1527
- declare function getLogger(component: string): CoreLogger;
1528
-
1529
- /** 发现根条目:dir 为扫描根路径;source 是宿主提供的语义标签(遮蔽报告透传用)。
1530
- * source 不枚举封闭集——core 只透传不解释(宿主如 pi 壳用 user-pi/npm/npm-dev)。 */
1531
- interface DiscoveryRoot {
1532
- dir: string;
1533
- source: string;
1534
- }
1535
- interface HostServices {
1536
- /** 数据根目录:引擎隔离池 / journal / record 派生存放的锚点。
1537
- * pi 壳返回 getAgentDir()(独立 pi 用户 journal 不漂目录);zsw 壳返回 zsw 数据根。 */
1538
- dataRoot(): string;
1539
- /** 结构化日志:对齐现 getLogger 调用面(level/component/message/data)。缺省 sink 按级分化:
1540
- * warn/error 走 console、debug no-op(对齐 pi-extension-logger 语义,见 NULL_HOST.log)。 */
1541
- log(level: LogLevel, component: string, message: string, data?: unknown): void;
1542
- /** agent/skill/workflow/引擎包 资源发现根(可选端口,缺席 = 调用方降级)。宿主只提供根列表
1543
- * (按优先级低→高);扫描 / 同名遮蔽(last-writer-wins)/ 遮蔽报告语义归 core 统一。
1544
- *
1545
- * engines kind(W4,设计 §3.4 L1 第二通道):引擎包发现根——dir 下一级(及 org 分组
1546
- * 二级)子项 = 候选引擎包目录,命中 package.json `xyz-agent.subagentEngine` manifest
1547
- * 即发现。打包态主通道是 env `XYZ_AGENT_ENGINE_ROOTS`(W9 注入),此端口承载宿主
1548
- * 自身模块域(如 pi 宿主包 node_modules 的引擎包 dependencies 安装位)。 */
1549
- discoveryRoots?(): {
1550
- agents?: DiscoveryRoot[];
1551
- skills?: DiscoveryRoot[];
1552
- workflows?: DiscoveryRoot[];
1553
- engines?: DiscoveryRoot[];
1554
- };
1555
- }
1556
- /** core 缺省数据根(~/.subagent-core,homedir 推导——禁止写死绝对路径,排查规则)。
1557
- * 供无自有数据根的轻宿主显式采用;core 自身不静默兜底到该值。 */
1558
- declare const DEFAULT_DATA_ROOT: string;
1559
- declare function configureCore(host: HostServices): void;
1560
- declare function getHostServices(): HostServices;
1561
-
1562
- /** 扫描结果(诊断面:skip/unusable 逐包留痕原因,对应 A12 负面场景)。 */
1563
- interface DiscoveryScanResult {
1564
- discovered: DiscoveredEngine[];
1565
- skipped: Array<{
1566
- pkgDir: string;
1567
- reason: string;
1568
- }>;
1569
- unusable: Array<{
1570
- pkgDir: string;
1571
- id: string | undefined;
1572
- reason: string;
1573
- }>;
1574
- }
1575
- interface DiscoverEnginesOptions {
1576
- /** 宿主种类(EngineClient pidfile 实例维度命名段:pi 壳 'pi'、runtime 'runtime')。 */
1577
- hostKind: string;
1578
- /** L3 显式配置目录(<dir>/subagents/config.json 的 engines 段)。缺省 = 无 L3。 */
1579
- agentDir?: string;
1580
- /** 引擎数据根(EngineClient dataDir;缺省 portFactory 执行期 getEngineDataDir 解析)。 */
1581
- dataDir?: string;
1582
- /** env 覆盖(L1 根读取;缺省 process.env——测试注入隔离宿主 env)。 */
1583
- env?: NodeJS.ProcessEnv;
1584
- /** L2 覆盖(测试注入;缺省 = 宿主入口上溯 node_modules 链)。 */
1585
- nodeModuleRoots?: string[];
1586
- /** 附加发现根(调用方/测试追加的 L1 根,语义同 HostServices.engines)。 */
1587
- extraRoots?: DiscoveryRoot[];
1588
- }
1589
- /** 纯扫描(不装载注册表)。装载序 = L1 env → L1 宿主/附加根 → L2 → L3(后者覆盖前者)。 */
1590
- declare function scanEngines(opts: DiscoverEnginesOptions): DiscoveryScanResult;
1591
- /**
1592
- * 扫描 + 装载:descriptor 经 registerEngineDescriptor 进注册表(幂等覆盖——重复扫描
1593
- * 安全)。装载覆盖既有注册(含过渡期 inproc pi/zcode——auto 模式下 cli descriptor
1594
- * 胜出即设计 D3 语义)时 debug 留痕。
1595
- */
1596
- declare function discoverAndRegisterEngines(opts: DiscoverEnginesOptions): DiscoveryScanResult;
1597
- /**
1598
- * 历史发现装载的引擎 id 快照(投影源计算消费面,见 engine-discovery.ts)。
1599
- */
1600
- declare function loadedDiscoveryIds(): string[];
1601
- /**
1602
- * hasEngine 的补扫面(§3.4 发现时机:快照未命中触发一次同步补扫,只读 manifest
1603
- * 不握手)。消费方 = agent 解析期/路由期的存在性校验接线(宿主侧注入 hasEngineFn
1604
- * 时用本函数替代裸 hasEngine)——「装了包 → 下次解析即可用」。
1605
- */
1606
- declare function ensureEngineDiscovered(id: string, opts: DiscoverEnginesOptions): boolean;
1607
-
1608
- export { type SubagentToolResult as $, type AgentEventLogEntry as A, type BgResponse as B, type ClosedReason as C, type DiscoverEnginesOptions as D, type EnginePort as E, type ForkFromResponse as F, CLOSED_REASONS as G, type CoreLogger as H, DEFAULT_AGENT_NAME as I, DEFAULT_DATA_ROOT as J, DEFAULT_ENGINE_ID as K, type ListResponse as L, type ModelRegistryLike as M, DirtyWorktreeError as N, type EngineHandle as O, type ProjectedOutcome as P, type EngineRunResult as Q, type RecordSnapshot as R, type SubagentRecord as S, type TracePatch as T, ForkDepthExceededError as U, type HostServices as V, type WorkerLogEntry as W, type LogLevel as X, ResurrectDeniedError as Y, type RunContext as Z, SLUG_MAX_LENGTH as _, type ExecutionRecord as a, configureCore as a0, getHostServices as a1, getLogger as a2, normalizeEngineId as a3, type DiscoveredEngine as a4, type DiscoveryScanResult as a5, ENGINE_ROOTS_ENV as a6, type PackageInspection as a7, deriveNodeModuleRoots as a8, discoverAndRegisterEngines as a9, ensureEngineDiscovered as aa, inspectEnginePackage as ab, loadedDiscoveryIds as ac, parseEngineRootsEnv as ad, scanEngines as ae, type ExecutionOutcome as b, type ExecutionStatus as c, type ExecuteOptions as d, SubagentStream as e, type AgentResult$1 as f, type AgentResult as g, type SubagentsGlobalConfig as h, type ModelInfo as i, type AgentConfig as j, type ResolvedModel as k, type StreamSink as l, type ExecutionHandle as m, type ExecutionMode as n, type PatchResult as o, type AgentCallOpts as p, type ExecutionTraceNode as q, type RunStatus as r, type DoneReason as s, type DisplayItem as t, type CancelResponse as u, type CloseResponse as v, type MessageResponse as w, type ExternalState as x, type SubagentListItem as y, type DiscoveryRoot as z };