@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
@@ -0,0 +1,818 @@
1
+ import { WorktreeHandle, AgentFailureKind, AgentOutcomeUsage, ToolCallEntry, EngineHandleData, EngineCapabilities, ProbeReport, AgentEvent, ResumeAnchor, AgentOutcome, SessionView, ModelCatalogEntry } from '@zhushanwen/subagent-engine-sdk';
2
+ import { ChildProcess } from 'node:child_process';
3
+
4
+ /**
5
+ * Workflow Extension — Engine 共享类型
6
+ *
7
+ * Engine 层全局基础类型。零 infra 依赖——不 import 任何 infra 文件,
8
+ * 可独立编译测试(D-12 三层架构,AC-1)。
9
+ *
10
+ * 核心内容:
11
+ * - 状态机:RunStatus = "running" | "done"(2 态,一次性生命周期,FR-3)
12
+ * + DoneReason(completed/failed/aborted/budget_limited/time_limited)
13
+ * - AgentCallOpts / AgentResult(单次 agent 调用的输入/输出,宿主面 SSOT 留守本地)
14
+ * + AgentUsage / ToolCallEntry / AgentFailureKind(自 SDK re-export,S4 簇 3 收编)
15
+ * - ExecutionTraceNode / TracePatch / ToolCallEntry / WorkerLogEntry(trace 数据)
16
+ *
17
+ * 层归属:Engine(数据结构 + 不变式守卫)。
18
+ */
19
+
20
+ /**
21
+ * 状态机:2 态(D-12 / FR-3,一次性生命周期——run 不可挂起)。
22
+ *
23
+ * running → done
24
+ *
25
+ * `done` 是唯一终态,具体原因由 DoneReason 区分。
26
+ */
27
+ type RunStatus = "running" | "done";
28
+ /** 终态原因。done 时必有(WorkflowRun 不变式)。 */
29
+ type DoneReason = "completed" | "failed" | "aborted" | "budget_limited" | "time_limited" | "invalid_args";
30
+ /**
31
+ * slug 最大长度(D6 合流迁入本文件,原权威定义在已删除的 execution/execute-options-mapper.ts)。
32
+ * 历史值 20 偏紧——描述性 slug 如 "audit-structured-output"(23)/ "fix-subagent-wf-tools"(21)
33
+ * 会撞上限,放宽到 35 兼顾「短到能塞进 TUI 标题行」与「容纳合理描述性 kebab-case 名」。
34
+ * 放本文件的原因:约束对象是 AgentCallOpts.description(slug 的源字段,见下方 slug 派生说明),
35
+ * 与字段同文件;subagent-actions-core(slug 校验)、subagent-service(record slug 截断)
36
+ * 与壳侧 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 {
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;
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
+ /**
286
+ * Trace.update 用的 patch(字段全可选)。
287
+ *
288
+ * 不变式:只改单个 node 的 status/result/error/completedAt/sessionId。
289
+ * callId 不存在时 update 为 no-op(D-10)。
290
+ */
291
+ interface TracePatch {
292
+ status?: "pending" | "running" | "completed" | "failed";
293
+ result?: AgentResult;
294
+ error?: string;
295
+ completedAt?: string;
296
+ sessionId?: string;
297
+ sessionFile?: string;
298
+ }
299
+ /**
300
+ * Worker console.* 捕获条目(run 级诊断,仅展示在 TUI widget,不泄漏到 input area)。
301
+ */
302
+ interface WorkerLogEntry {
303
+ level: "log" | "warn" | "error" | "info";
304
+ message: string;
305
+ }
306
+
307
+ /**
308
+ * ModelRegistry 的最小接口(duck-typed,测试可 mock)。
309
+ * 字段结构与 Pi SDK 的 ctx.modelRegistry 对齐。
310
+ */
311
+ interface ModelRegistryLike {
312
+ /** 返回所有已配置鉴权的可用模型。 */
313
+ getAvailable(): ModelInfo[];
314
+ /** 按 (provider, modelId) 查找。 */
315
+ find(provider: string, modelId: string): ModelInfo | undefined;
316
+ /** 校验模型鉴权是否就绪。 */
317
+ hasConfiguredAuth(model: unknown): boolean;
318
+ }
319
+ /**
320
+ * 模型信息(registry 返回元素 / ctx.model 鸭子类型兼容)。
321
+ * ctx.model(SDK Model<Api>)是此类型的超集,运行时直接当 ModelInfo 用。
322
+ */
323
+ interface ModelInfo {
324
+ id: string;
325
+ name: string;
326
+ provider: string;
327
+ reasoning: boolean;
328
+ thinkingLevelMap?: Record<string, unknown>;
329
+ contextWindow?: number;
330
+ }
331
+ /** agent .md frontmatter 解析结果。 */
332
+ interface AgentConfig {
333
+ /** agent 名(文件名 basename)。 */
334
+ name: string;
335
+ /** system prompt(markdown 正文)。 */
336
+ systemPrompt: string;
337
+ /** tool allowlist(三层过滤之一)。 */
338
+ tools?: string[];
339
+ /** 默认模型 override("provider/modelId")。agent 作者显式指定。 */
340
+ model?: string;
341
+ /** 默认 thinkingLevel override。 */
342
+ thinkingLevel?: string;
343
+ /** 默认 background 模式(true 时无显式 wait 走 background)。 */
344
+ defaultBackground?: boolean;
345
+ /**
346
+ * 执行引擎 id(agent .md frontmatter engine 字段,D9 per-agent 主通道)。
347
+ * 解析期已对注册表校验(未注册 id 在 agent-registry 抛 EngineNotFoundError);
348
+ * 执行侧(P4 路由层)按 调用参数 > 本字段 > 全局默认 三层取值。
349
+ */
350
+ engine?: string;
351
+ }
352
+ /** 解析结果(model 实例 + 生效的 thinkingLevel)。 */
353
+ interface ResolvedModel {
354
+ model: ModelInfo;
355
+ thinkingLevel: string | undefined;
356
+ }
357
+
358
+ /**
359
+ * 引擎会话句柄(run 返回、read 入参;[H1 U5/U6] interact 面退役后不再有 interact
360
+ * 消费方)。
361
+ *
362
+ * 契约三条(D1):不透明(上层不解构——唯一例外是 record 持久化层序列化 data 字段与
363
+ * read 降级链)、可持久化(data 是纯 JSON,主会话 reload 后 read 仍可用)、自描述
364
+ * (data 含 engineId + 引擎 session 定位符 + pool key + adapter 版本)。
365
+ */
366
+ interface EngineHandle {
367
+ /** 持久化数据。上层不得解构其内部字段(见契约三条)。 */
368
+ readonly data: EngineHandleData;
369
+ }
370
+
371
+ /**
372
+ * subagent text_delta streaming sink。
373
+ *
374
+ * background subagent 执行期间,session-runner 的 agentEvent 出口把每个 text_delta
375
+ * 传到 SubagentStream.onDelta。本模块做 100ms 时间窗合并后,通过 StreamSink.setWidget
376
+ * 转发到 RPC stdout(经 ctx.ui.setWidget → extension_ui_request 通道)。
377
+ *
378
+ * SubagentStream 是一个生命周期对象——内聚 buffer/timer 状态 + onDelta/dispose 方法。
379
+ * 调用方(subagent-service)创建后只需在 text_delta 时调 onDelta、终态时调 dispose,
380
+ * 不需要拆散 push/clear 两个函数跨层透传。
381
+ *
382
+ * 设计要点:
383
+ * - leading edge:第一个 delta 立即 flush(前端尽快看到开始)
384
+ * - trailing edge:后续 delta 追加 buffer,timer 到期后 flush
385
+ * - 每次 flush 把 buffer 的累积文本 split("\n") 截尾 MAX_WIDGET_LINES 行传给 setWidget
386
+ * - dispose 清除 widget + 清 timer
387
+ */
388
+
389
+ /** UI streaming sink 的最小接口(ctx.ui.setWidget 的 duck-typed 子集)。
390
+ *
391
+ * 当前只有一个 adapter(index.ts session_start 包装 ctx.ui.setWidget)。
392
+ * 保留接口而非裸函数类型,因为 StreamSink 的语义是「UI sink 契约」——
393
+ * 测试 mock 和未来可能的第二 sink(如写文件)都走此契约。 */
394
+ interface StreamSink {
395
+ setWidget(key: string, lines: string[] | undefined): void;
396
+ }
397
+ /**
398
+ * subagent text_delta streaming 生命周期对象。
399
+ *
400
+ * 创建后:
401
+ * - `onDelta(delta)`:session-runner 每次 text_delta 调
402
+ * - `dispose()`:subagent 终态时调,清除 widget + 清 timer
403
+ *
404
+ * buffer/timer 状态全部内聚在此对象,调用方不需要关心合并逻辑。
405
+ */
406
+ declare class SubagentStream {
407
+ private readonly widgetKey;
408
+ private readonly sink;
409
+ private buffer;
410
+ private timer;
411
+ private hasFlushed;
412
+ private disposed;
413
+ constructor(recordId: string, sink: StreamSink);
414
+ /** 接收一个 text_delta 增量。空串静默丢弃(不消耗 leading edge)。 */
415
+ onDelta(delta: string): void;
416
+ /** 终态清理:清除 widget + 清 timer(幂等)。 */
417
+ dispose(): void;
418
+ private flush;
419
+ }
420
+
421
+ /**
422
+ * run 的运行期上下文。任务声明(AgentCallOpts,D6 合流后的单一形状)与运行期句柄
423
+ * 分离——signal/ctxModel/onComplete 从 ExecuteOptions 移出(设计 §3.3.5 删字段去向),
424
+ * 因为它们是宿主注入的运行期对象,不属于跨引擎持久化的任务声明。
425
+ *
426
+ * 常驻进程友好(D1):onEvent 回调式(而非迭代器式)+ AbortSignal——引擎内部换常驻
427
+ * server 实现(未来 driver host)时接口不动。
428
+ */
429
+ interface RunContext {
430
+ /** = record.id(bg-N-xxx / run-N)——journal 文件名与池引用计数 key(P2 消费)。 */
431
+ taskId: string;
432
+ /** D5 隔离池(宿主分配,设计 §3.3.9;pi 无池化恒 'shared')。 */
433
+ poolKey: string;
434
+ /** abort 分级入口(D1:引擎原生中断 → 公共杀链兜底)。 */
435
+ signal?: AbortSignal;
436
+ /** 事件流出口(host 消费后统一落 journal,D6 第②级)。 */
437
+ onEvent?: (event: AgentEvent) => void;
438
+ /**
439
+ * model 解析第三层兜底(现有 D-008 语义不变)——**pi 链路专属兜底**:经
440
+ * taskSpecToExecuteOptions → resolveModel 第三层消费(PiEngine 直通)。自带
441
+ * provider 体系与缺省模型的引擎(如 zcode:requested > 引擎缺省常量链)按自身
442
+ * 默认链解析,不消费本字段(zcode 侧在「ctx 有模型但被忽略」时出声留痕,
443
+ * zcode-engine.warnIgnoredCtxModel)。
444
+ */
445
+ ctxModel?: ModelInfo;
446
+ /**
447
+ * text_delta streaming 通道(宿主侧 UI widget)。与 onEvent 平行的 text_delta 出口:
448
+ * background 路径 onEvent=undefined 但流式仍需送达(双通道互斥设计,见 session-runner
449
+ * agentEvent 出口注释)。pi 回填期承载 AgentRunner port 的 stream 透传(行为零变化),
450
+ * 语义上是宿主设施而非引擎专有——未来引擎的 text_delta 同样可走此通道。
451
+ */
452
+ stream?: SubagentStream;
453
+ /**
454
+ * [P1 pi 回填透传] 调用方已持有的 schema 激活预编码值(AgentCallOpts.schemaEnv 直传
455
+ * 形态)。生产路径中 resolveAgentOpts 恒耦合产出 schema+schemaEnv(值 = JSON.stringify
456
+ * (schema)),引擎从 task.schema 派生即可逐字节等值;解耦形态(有 schemaEnv 无
457
+ * schema)生产不可达、仅见于直构调用,派生无源——本字段是其唯一透交通道。
458
+ * 引擎在 task.schema 存在时忽略此值(派生优先,设计 §3.3.5 删字段去向)。
459
+ */
460
+ schemaEnv?: string;
461
+ /**
462
+ * [P4 D9①] 引擎 fallback 留痕(probe 失败路由回默认引擎)。路由层(routing.ts)
463
+ * 产出,引擎投影到 outcome.engineFallback(zcode 等无 record 通路的引擎以此留痕;
464
+ * pi 引擎另经 ExecuteOptions 投影进 record)。
465
+ */
466
+ engineFallback?: {
467
+ from: string;
468
+ reason: string;
469
+ };
470
+ /**
471
+ * [F6] 根 session id(SubagentService.sessionRootId 注入)——pi 引擎 relay 归属键
472
+ * SESSION_ID 的权威来源(经 wire ctx.sessionRootId → server 还原 → SpawnRunParams
473
+ * → buildChildEnv)。刻意走 per-run ctx 而非 EngineClient 的进程级 env:客户端按
474
+ * 引擎缓存为惰性单例,进程级 env 在 pi fork 换 sessionId 后会陈旧;per-run ctx 恒
475
+ * 新鲜,且与 RECORD_ID 已有的 per-run 形态一致。additive:undefined/null/空串不
476
+ * 上 wire,zcode 等引擎忽略。
477
+ */
478
+ sessionRootId?: string;
479
+ /**
480
+ * [Option C 协议化] 权威 subagent session 目录(getSubagentSessionDir(agentDir,
481
+ * rootCwd) 宿主推导值)——经 wire ctx.sessionDir 送达 pi 引擎组装 `--session-dir`。
482
+ * 生产注入方 = RemoteEngine(cli 形态引擎的唯一宿主侧适配点,env 同源推导,见
483
+ * remote-engine buildRunParams);编排层显式注入(ctx.sessionDir 有值)时优先于
484
+ * RemoteEngine 自推导。zcode 等不消费 session 目录的引擎忽略本字段。编排层可
485
+ * 不注入;RemoteEngine 缺省以同源 env 推导值补齐后恒上 wire;[LEGACY] fallback
486
+ * 仅旧宿主/独立运行引擎形态可达。
487
+ */
488
+ sessionDir?: string;
489
+ /**
490
+ * [P4 对齐点③] 引擎声明实际隔离池 key(journal 落盘路径权威)。宿主创建 journal
491
+ * writer 时只能用缺省占位 poolKey(pi 恒 'shared'),非池化稳定的引擎(zcode 按
492
+ * provider+model 池化)在 prepare 期确定 poolKey 后回调本方法重定向 writer——
493
+ * 保证 journal 落盘路径与 handle.poolKey 同源(单一权威,不再两边推导)。
494
+ * 契约:必须在首个事件 emit 之前调用(zcode coarse 事件在终态后合成,天然满足;
495
+ * 未来流式引擎需在事件出口前调用)。
496
+ */
497
+ onPoolResolved?: (poolKey: string) => void;
498
+ /**
499
+ * [R4 §3.4 不变量 3] 运行中句柄回填通道:引擎在「session/create 应答到达后」
500
+ * 立即回调(早于 run resolve——stream 引擎的 run 生命周期远长于会话建立)。
501
+ * 与 onPoolResolved 分立两个时点:poolKey 在 prepare 期(onPoolResolved,连接
502
+ * 建立前即可知),sessionRef 在 create 应答后(本回调)。编排层收到后立即回填
503
+ * record.engineHandle 并落 entry——运行中的 GUI 经 entry 重建 record 即拿到
504
+ * ①②级读取钥匙,不再等 run resolve 后的终态回填。可选回调:不支持运行中回填
505
+ * 的引擎(spawn 单轮、终态即回填)不调用,宿主语义不受影响。
506
+ */
507
+ onHandleReady?: (partial: Pick<EngineHandleData, "sessionRef" | "poolKey">) => void;
508
+ /**
509
+ * [U0 D10] 引擎 spawn 的子进程句柄注册钩子(宿主终止链记账)。引擎在 spawn 成功后
510
+ * 同步回调(与 pi runSpawn 的 spawnedChildren.set 同构时机);宿主据此把 child 注册进
511
+ * session-runner 的 spawnedChildren Map(cancel SIGTERM / dispose 收割兜底 / killAll
512
+ * 全量清理对非 pi 引擎 record 生效)。close/error 后由宿主按句守卫移除。可选:引擎
513
+ * 内部不 spawn 进程(如未来常驻 driver host 实现)时不调用,宿主记账自然为空。
514
+ *
515
+ * 边界声明(R1 D6):本钩子只用于 per-record 一次性 spawn(一任务一进程模态)。
516
+ * 引擎持有的常驻进程(跨任务共享,如 app-server 常驻连接)不经本钩子注册、不进
517
+ * spawnedChildren Map——其生命周期完全归引擎 dispose 管理(防 per-record 重复
518
+ * SIGTERM / 单任务 abort 误杀共享进程)。
519
+ */
520
+ onChildSpawned?: (child: ChildProcess) => void;
521
+ /**
522
+ * [W3 v1.x → H1 U6 终态] 会话形态参数(协议 run.params.resume 的 RunContext
523
+ * 承载位,键已随 U6 键切换从 `chat` 泛化为 `resume`):
524
+ * - recordId:core 预建 record 的关联键(引擎据此上报 childSpawned/childStateChanged
525
+ * 的 record 键形态与 handle 锚定)——会话形态轮(task.conversation === true)必传;
526
+ * - resume:续聊锚点(record.sessionFile 续写原文件;pi 消费
527
+ * sessionRef.sessionFile——对照协议化设计前 SpawnResumeOpts.sessionFile 的锚点面)。
528
+ * 类型权威 = SDK RunResumeParams(remote-engine 直传,结构互证由 implements 关系
529
+ * 在 typecheck 期承载)。一次性轮不传,wire 上不出现该键。
530
+ */
531
+ resume?: {
532
+ recordId: string;
533
+ resume?: ResumeAnchor;
534
+ };
535
+ }
536
+ /**
537
+ * run 的返回:终态 + 可持久化 handle。
538
+ *
539
+ * handle 语义(设计 §3.3.5 run 错误语义三条):prepare 期错误(credential_missing /
540
+ * model_not_available / prompt_too_large)在进程创建前 reject、不产生 handle;运行中
541
+ * 失败不 reject——合成 error outcome + 正常 handle 返回(record 必须收尾);abort 走
542
+ * 完杀链后同前(exitCode=null + error 含杀链标记)。
543
+ */
544
+ interface EngineRunResult {
545
+ handle: EngineHandle;
546
+ outcome: AgentOutcome;
547
+ }
548
+ /**
549
+ * subagent 执行引擎的唯一契约点(D1)。实现方:PiEngine(回填)/ ZcodeEngine(P3)/
550
+ * 未来各引擎适配器。上层(工具面/workflow 引擎/GUI)只消费中立类型,不感知引擎。
551
+ *
552
+ * 贯穿纪律(设计 §3.3.1):宿主编排——引擎只当单 agent 执行器,六家原生多 agent 机制
553
+ * 一律禁用不依赖。
554
+ */
555
+ interface EnginePort {
556
+ /** 注册表 key('pi' | 'zcode' | ...)。 */
557
+ readonly id: string;
558
+ /** D3(同步无副作用——调用前拒绝的判据)。 */
559
+ capabilities(): EngineCapabilities;
560
+ /** D7(factory 初始化 + 版本变化检测触发;opts.force 跳过缓存强探)。 */
561
+ probe(opts?: {
562
+ force?: boolean;
563
+ }): Promise<ProbeReport>;
564
+ /** D1 主语义:fire-to-completion。[D6 合流] task = AgentCallOpts(单一任务形状,
565
+ * 原 AgentTaskSpec 已并入——字段裁定见 orchestration/models/types.ts)。会话形态
566
+ * 续聊轮同走本方法(resume 锚点经 ctx.resume 携带,[H1 U6] interact 面退役)。 */
567
+ run(task: AgentCallOpts, ctx: RunContext): Promise<EngineRunResult>;
568
+ /** D6 三级降级链:①引擎原生读取 → ②宿主 event journal(P2)→ ③outcome-only。 */
569
+ read(handle: EngineHandle): Promise<SessionView>;
570
+ /**
571
+ * [U7] 可选面:模型可发现性——引擎自带 provider/model 体系时(如 zcode 的 v2 桌面
572
+ * 登录态),列出当前环境实际可用的模型清单(带凭据校验),供 system prompt 引擎段
573
+ * 与 GUI 引擎选择器消费。省略/返回 null = 「与主 agent 模型体系一致」(pi 的语义:
574
+ * system prompt 已有 <available_provider_models> 段,无需引擎再列)。
575
+ * engine-neutral:未来引擎(AcpEngine 等)实现本方法即自动获得注入与展示,宿主
576
+ * 侧零改动。
577
+ */
578
+ listModels?(): Array<{
579
+ id: string;
580
+ name?: string;
581
+ }> | null;
582
+ /**
583
+ * [u-h2 D2-2] 可选面:派发同步期 model 校验(引擎 registry 单源裁决)。实现引擎复用其
584
+ * prepare 期同一校验函数(zcode: resolveZcodeModelRef——同一函数两处消费,canonicalRef
585
+ * 归一化与短名缺省 provider 决策不产生双实现漂移);校验失败同步 throw(编排层包装为
586
+ * 「引擎与模型不配套」错误,见 engine/model-validation.ts)。
587
+ *
588
+ * modelRef undefined = 查询引擎缺省模型(D2-1:主 agent 的 pi id 不透传给非 pi 引擎,
589
+ * 缺省语义归引擎——zcode 落 ZCODE_FALLBACK_DEFAULT_MODEL)。返回 canonical ref 供
590
+ * record.model 留痕。[W3 契约变更④] 协议化后 canonicalRef 允许**无斜杠**形态
591
+ * (引擎原样返回的 ref)——core 侧按 provider=""/id=ref/整串进 name 拆分留痕
592
+ * (splitEngineModelRef 单一权威),不落 "<ref>/" 畸形。
593
+ *
594
+ * 未实现:model 透传,引擎自身 prepare 期校验兜底(现状语义);pi 不实现(pi 链走
595
+ * 既有三层解析 + assertCanonicalModelRef 裁决,搬迁是大重构,设计 D2-2 被否②)。
596
+ */
597
+ validateModel?(modelRef: string | undefined): {
598
+ canonicalRef: string;
599
+ };
600
+ /**
601
+ * [R1 D6] 可选停机面:释放引擎持有的常驻资源(如 app-server 常驻进程 / 长连接)。
602
+ * 幂等契约(§3.4 不变量 4):重复调用无副作用;dispose 后首个 run 自动重建(与
603
+ * 「进程死后重建」同一代码路径)。可选成员保持向后兼容——无常驻资源的引擎(pi
604
+ * 现状 spawn 单轮)不必实现。等待策略(D6①「触发不等待」):宿主收割入口
605
+ * (registry disposeEngines → killAllSpawnedChildren)只同步调用拿 Promise 不
606
+ * await,引擎实现须自行保证同步面(立即 fire close 帧 + 同步 SIGTERM)在返回
607
+ * Promise 前完成;grace→SIGKILL 升级序列属异步面(promise 段)。
608
+ */
609
+ dispose?(): Promise<void>;
610
+ /**
611
+ * [u7a D5] 可选面:引擎在途任务只读快照(滚动重启推迟谓词的引擎侧输入——
612
+ * 权威源:docs/design/crash-forensics-and-watchdog.md §3.3 D5「推迟判定源 =
613
+ * relay ∪ 引擎池在途 ∪ pi 侧 extension 聚合上报」)。同步纯读、无副作用。
614
+ *
615
+ * 返回 null = 引擎不提供快照;成员缺席(undefined,pi 引擎不实现)= 无引擎侧
616
+ * 在途面——pi 形态的在途由 subagent-workflow extension 聚合上报覆盖(EnginePort
617
+ * 之外的第 4 通道,两通道互不替代)。可选成员保持向后兼容(port.ts 既有扩展
618
+ * 先例:listModels / validateModel / dispose 全为可选成员)。
619
+ *
620
+ * zcode 实现语义(显式裁决):在途 = activeSessions 非空——poolKey 'shared' 的
621
+ * app-server 空闲常驻进程恒活,**禁止按进程存在判定**(会恒真、推迟常态化)。
622
+ */
623
+ inFlightSnapshot?(): {
624
+ inFlight: number;
625
+ } | null;
626
+ }
627
+
628
+ /** 引擎工厂:惰性创建引擎实例(getEngine 首次取用时执行)。 */
629
+ type EngineFactory = () => EnginePort;
630
+ /**
631
+ * 引擎包 manifest 注册期快照(session_start 扫描所得,非握手缓存——设计 §3.3「同步
632
+ * 成员清单」单一同步源原则)。descriptor 携带,cli 形态 port(RemoteEngine)的同步
633
+ * 成员(capabilities/listModels/validateModel)直读本快照。
634
+ *
635
+ * 与 client/remote-engine.ts 的 RemoteEngineManifestSnapshot 是结构闭包(后者多出
636
+ * core 中立类型包装;漂移由 protocol-closure 同族结构互证断言守卫)。
637
+ */
638
+ interface EngineManifestSnapshot {
639
+ /** manifest `capabilities`(同步能力位权威,注册期读,无缓存)。 */
640
+ capabilities: EngineCapabilities;
641
+ /**
642
+ * manifest `modelCatalog` 三态(W4 §2.4:缺省 = 不注入保持 undefined;null 合法等价
643
+ * 省略;`models: []` 仅作者显式声明)。解析器不得把省略填成 `[]`——否则「无枚举面」
644
+ * 语义不可达。
645
+ */
646
+ modelCatalog?: {
647
+ dynamic: boolean;
648
+ models: ModelCatalogEntry[];
649
+ } | null;
650
+ /** manifest `displayName`(可选,缺省 = id;D4 缺省引擎回落序的排序键)。 */
651
+ displayName?: string;
652
+ }
653
+ /** cli 形态 descriptor(目标形态):引擎 CLI 启动参数 + manifest 快照 + port 装配器。 */
654
+ interface CliEngineDescriptor {
655
+ kind: "cli";
656
+ /** 引擎 CLI 命令(发现器解析后的绝对路径/可执行名;不依赖 PATH)。 */
657
+ command: string;
658
+ /** 引擎 CLI 参数(不含 command 本身)。 */
659
+ args: readonly string[];
660
+ /** manifest `capabilities`(同步能力位权威——gate 同步消费,无缓存)。 */
661
+ capabilities: EngineCapabilities;
662
+ /**
663
+ * cli 形态 EnginePort 实例装配器(core 侧接线通道,非 manifest 面)。生产 = W4
664
+ * 发现器装载 descriptor 时装配(W2 `RemoteEngine` + `EngineClient` + 宿主侧参数
665
+ * dataDir/hostKind/engineConfig 等——registry 不越权猜宿主形态)。必须构造同步、
666
+ * 不 throw(§3.5.3 代理形态:缺包/坏包的失败推迟到首次协议调用)。
667
+ */
668
+ portFactory: EngineFactory;
669
+ /** manifest 快照余项(modelCatalog/displayName;capabilities 已提升为直读字段)。 */
670
+ manifest?: Omit<EngineManifestSnapshot, "capabilities">;
671
+ }
672
+ /**
673
+ * 缺省引擎 id(D4 重定义:**配置的缺省引擎 id**——config defaultEngine 未配置时的
674
+ * 归一名,不再表达「内置 pi 永久兜底」)。配置值不在已发现清单 → warn + 回落第一个
675
+ * 可用引擎(manifest displayName 稳定序,D4);全不可用 → 派发期 engine_not_found
676
+ * (「未发现任何引擎包」+ 安装指引)。
677
+ */
678
+ declare const DEFAULT_ENGINE_ID = "pi";
679
+ /**
680
+ * defaultEngine 缺省归一(单一权威源):空白 / undefined 归一到缺省引擎('pi')。
681
+ * 引擎感知检测 diff 与状态段渲染必须对同一读取结果给出同一引擎 id——若两处各自
682
+ * 内联归一,一致性只靠注释人工耦合,漂移即两处说谎;故收敛到本函数供各处调用。
683
+ * sanitize 保证透传值非空,但可能带首尾空格,故 trim 后再判。
684
+ */
685
+ declare function normalizeEngineId(engine: string | undefined): string;
686
+
687
+ /** 单个引擎包的检查产物。 */
688
+ type PackageInspection = {
689
+ status: "ok";
690
+ entry: DiscoveredEngine;
691
+ } | {
692
+ status: "skip";
693
+ reason: string;
694
+ } | {
695
+ status: "unusable";
696
+ id: string | undefined;
697
+ reason: string;
698
+ };
699
+ /** 发现成功的引擎条目(装载序;同 id 后者覆盖前者)。 */
700
+ interface DiscoveredEngine {
701
+ id: string;
702
+ /** 发现源标签(env 名 / 宿主根 source / node-modules / config.json)。 */
703
+ source: string;
704
+ /** L3 显式 config(initialize.engineConfig 透传;L1/L2 manifest 发现无此项)。 */
705
+ engineConfig?: Record<string, string>;
706
+ descriptor: CliEngineDescriptor;
707
+ }
708
+ /**
709
+ * 检查单个候选包目录(读 package.json → manifest 字段级解析 → bin 可执行验证)。
710
+ * 三态:ok(装载)/ skip(必需字段缺失/不可解析——warn 跳过该包)/ unusable
711
+ * (protocol 不兼容、bin 不可执行——标记不可用,不进清单)。
712
+ */
713
+ declare function inspectEnginePackage(pkgDir: string, source: string, hostKind: string, env: NodeJS.ProcessEnv): PackageInspection;
714
+
715
+ /** L1 引擎发现根 env(设计 §3.4;值形态 = path.delimiter 分隔的绝对路径列表)。 */
716
+ declare const ENGINE_ROOTS_ENV = "XYZ_AGENT_ENGINE_ROOTS";
717
+ /** L1 env 根解析:path.delimiter 分隔;空段跳过;非绝对路径丢弃 + warn;去重(大小写敏感)。 */
718
+ declare function parseEngineRootsEnv(env: NodeJS.ProcessEnv): string[];
719
+ /**
720
+ * L2 根推导:宿主进程入口(process.argv[1])所在目录逐级上溯的 node_modules——与
721
+ * createRequire(<宿主入口>) 的 require.resolve 候选目录链同构(「宿主 node_modules
722
+ * require.resolve」的扫描化:零枚举发现要求扫目录而非 resolve 具体包名)。打包态
723
+ * (staged 扩展 / Bun standalone 无 node_modules 结构)与 zsw vendor 态自然为空——
724
+ * 规格明确两态 L2 无效。argv[1] 不可得(嵌入式 / worker)→ L2 缺席。
725
+ */
726
+ declare function deriveNodeModuleRoots(argvEntry?: string | undefined): string[];
727
+
728
+ /** 日志级别。级别集合对齐 pi-extension-logger(其 LogLevel 为包内部类型、含 info 四值;实例 API 仅 debug/warn/error 三方法,core facade 据此收窄为三值)。 */
729
+ type LogLevel = "debug" | "warn" | "error";
730
+ /** core logger 接口。与 pi-extension-logger 的 ExtensionLogger 结构兼容——
731
+ * u0-log 批次替换是纯 import 源替换,调用面(方法名/参数序)逐文件等价。 */
732
+ interface CoreLogger {
733
+ debug(msg: string, data?: unknown): void;
734
+ warn(msg: string, data?: unknown): void;
735
+ error(msg: string, data?: unknown): void;
736
+ }
737
+ declare function getLogger(component: string): CoreLogger;
738
+
739
+ /** 发现根条目:dir 为扫描根路径;source 是宿主提供的语义标签(遮蔽报告透传用)。
740
+ * source 不枚举封闭集——core 只透传不解释(宿主如 pi 壳用 user-pi/npm/npm-dev)。 */
741
+ interface DiscoveryRoot {
742
+ dir: string;
743
+ source: string;
744
+ }
745
+ interface HostServices {
746
+ /** 数据根目录:引擎隔离池 / journal / record 派生存放的锚点。
747
+ * pi 壳返回 getAgentDir()(独立 pi 用户 journal 不漂目录);zsw 壳返回 zsw 数据根。 */
748
+ dataRoot(): string;
749
+ /** 结构化日志:对齐现 getLogger 调用面(level/component/message/data)。缺省 sink 按级分化:
750
+ * warn/error 走 console、debug no-op(对齐 pi-extension-logger 语义,见 NULL_HOST.log)。 */
751
+ log(level: LogLevel, component: string, message: string, data?: unknown): void;
752
+ /** agent/skill/workflow/引擎包 资源发现根(可选端口,缺席 = 调用方降级)。宿主只提供根列表
753
+ * (按优先级低→高);扫描 / 同名遮蔽(last-writer-wins)/ 遮蔽报告语义归 core 统一。
754
+ *
755
+ * engines kind(W4,设计 §3.4 L1 第二通道):引擎包发现根——dir 下一级(及 org 分组
756
+ * 二级)子项 = 候选引擎包目录,命中 package.json `xyz-agent.subagentEngine` manifest
757
+ * 即发现。打包态主通道是 env `XYZ_AGENT_ENGINE_ROOTS`(W9 注入),此端口承载宿主
758
+ * 自身模块域(如 pi 宿主包 node_modules 的引擎包 dependencies 安装位)。 */
759
+ discoveryRoots?(): {
760
+ agents?: DiscoveryRoot[];
761
+ skills?: DiscoveryRoot[];
762
+ workflows?: DiscoveryRoot[];
763
+ engines?: DiscoveryRoot[];
764
+ };
765
+ }
766
+ /** core 缺省数据根(~/.subagent-core,homedir 推导——禁止写死绝对路径,排查规则)。
767
+ * 供无自有数据根的轻宿主显式采用;core 自身不静默兜底到该值。 */
768
+ declare const DEFAULT_DATA_ROOT: string;
769
+ declare function configureCore(host: HostServices): void;
770
+ declare function getHostServices(): HostServices;
771
+
772
+ /** 扫描结果(诊断面:skip/unusable 逐包留痕原因,对应 A12 负面场景)。 */
773
+ interface DiscoveryScanResult {
774
+ discovered: DiscoveredEngine[];
775
+ skipped: Array<{
776
+ pkgDir: string;
777
+ reason: string;
778
+ }>;
779
+ unusable: Array<{
780
+ pkgDir: string;
781
+ id: string | undefined;
782
+ reason: string;
783
+ }>;
784
+ }
785
+ interface DiscoverEnginesOptions {
786
+ /** 宿主种类(EngineClient pidfile 实例维度命名段:pi 壳 'pi'、runtime 'runtime')。 */
787
+ hostKind: string;
788
+ /** L3 显式配置目录(<dir>/subagents/config.json 的 engines 段)。缺省 = 无 L3。 */
789
+ agentDir?: string;
790
+ /** 引擎数据根(EngineClient dataDir;缺省 portFactory 执行期 getEngineDataDir 解析)。 */
791
+ dataDir?: string;
792
+ /** env 覆盖(L1 根读取;缺省 process.env——测试注入隔离宿主 env)。 */
793
+ env?: NodeJS.ProcessEnv;
794
+ /** L2 覆盖(测试注入;缺省 = 宿主入口上溯 node_modules 链)。 */
795
+ nodeModuleRoots?: string[];
796
+ /** 附加发现根(调用方/测试追加的 L1 根,语义同 HostServices.engines)。 */
797
+ extraRoots?: DiscoveryRoot[];
798
+ }
799
+ /** 纯扫描(不装载注册表)。装载序 = L1 env → L1 宿主/附加根 → L2 → L3(后者覆盖前者)。 */
800
+ declare function scanEngines(opts: DiscoverEnginesOptions): DiscoveryScanResult;
801
+ /**
802
+ * 扫描 + 装载:descriptor 经 registerEngineDescriptor 进注册表(幂等覆盖——重复扫描
803
+ * 安全)。装载覆盖既有注册(含过渡期 inproc pi/zcode——auto 模式下 cli descriptor
804
+ * 胜出即设计 D3 语义)时 debug 留痕。
805
+ */
806
+ declare function discoverAndRegisterEngines(opts: DiscoverEnginesOptions): DiscoveryScanResult;
807
+ /**
808
+ * 历史发现装载的引擎 id 快照(投影源计算消费面,见 engine-discovery.ts)。
809
+ */
810
+ declare function loadedDiscoveryIds(): string[];
811
+ /**
812
+ * hasEngine 的补扫面(§3.4 发现时机:快照未命中触发一次同步补扫,只读 manifest
813
+ * 不握手)。消费方 = agent 解析期/路由期的存在性校验接线(宿主侧注入 hasEngineFn
814
+ * 时用本函数替代裸 hasEngine)——「装了包 → 下次解析即可用」。
815
+ */
816
+ declare function ensureEngineDiscovered(id: string, opts: DiscoverEnginesOptions): boolean;
817
+
818
+ export { type AgentConfig as A, parseEngineRootsEnv as B, type CoreLogger as C, type DiscoverEnginesOptions as D, type EnginePort as E, scanEngines as F, type HostServices as H, type LogLevel as L, type ModelInfo as M, type PackageInspection as P, type ResolvedModel as R, SubagentStream as S, type TracePatch as T, type WorkerLogEntry as W, type ModelRegistryLike as a, type AgentResult as b, type StreamSink as c, type AgentCallOpts as d, type ExecutionTraceNode as e, type RunStatus as f, type DoneReason as g, type DiscoveryRoot as h, DEFAULT_DATA_ROOT as i, DEFAULT_ENGINE_ID as j, type EngineHandle as k, type EngineRunResult as l, type RunContext as m, SLUG_MAX_LENGTH as n, configureCore as o, getHostServices as p, getLogger as q, normalizeEngineId as r, type DiscoveredEngine as s, type DiscoveryScanResult as t, ENGINE_ROOTS_ENV as u, deriveNodeModuleRoots as v, discoverAndRegisterEngines as w, ensureEngineDiscovered as x, inspectEnginePackage as y, loadedDiscoveryIds as z };