@zhushanwen/subagent-engine-sdk 0.6.1 → 0.7.1

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 (38) hide show
  1. package/dist/best-effort.d.cts +1 -1
  2. package/dist/best-effort.d.ts +1 -1
  3. package/dist/{chunk-W3BKI2BP.js → chunk-3WC36CHI.js} +1 -1
  4. package/dist/{chunk-CNQTJJF5.js → chunk-HERD6RIR.js} +12 -1
  5. package/dist/{chunk-QOEXD2FT.js → chunk-RCT7L777.js} +36 -1
  6. package/dist/{chunk-WMDMXP2F.js → chunk-SFNTX7Q3.js} +0 -4
  7. package/dist/{chunk-AIG5LSGK.js → chunk-SGAIDL63.js} +5 -0
  8. package/dist/{chunk-63ZNJHM5.js → chunk-W23PAAGX.js} +3 -1
  9. package/dist/{contract-types-DaULkdpG.d.cts → contract-types-DiWyGRXr.d.cts} +78 -13
  10. package/dist/{contract-types-DaULkdpG.d.ts → contract-types-DiWyGRXr.d.ts} +78 -13
  11. package/dist/index.cjs +89 -8
  12. package/dist/index.d.cts +39 -5
  13. package/dist/index.d.ts +39 -5
  14. package/dist/index.js +45 -10
  15. package/dist/journal-io.d.cts +1 -1
  16. package/dist/journal-io.d.ts +1 -1
  17. package/dist/journal-replay.cjs +5 -0
  18. package/dist/journal-replay.d.cts +1 -1
  19. package/dist/journal-replay.d.ts +1 -1
  20. package/dist/journal-replay.js +1 -1
  21. package/dist/kill-chain.cjs +38 -2
  22. package/dist/kill-chain.d.cts +38 -3
  23. package/dist/kill-chain.d.ts +38 -3
  24. package/dist/kill-chain.js +8 -5
  25. package/dist/node-executor.js +2 -2
  26. package/dist/port-contract.d.cts +9 -4
  27. package/dist/port-contract.d.ts +9 -4
  28. package/dist/protocol/index.cjs +3 -7
  29. package/dist/protocol/index.d.cts +132 -12
  30. package/dist/protocol/index.d.ts +132 -12
  31. package/dist/protocol/index.js +2 -6
  32. package/dist/spawn.cjs +81 -5
  33. package/dist/spawn.d.cts +13 -2
  34. package/dist/spawn.d.ts +13 -2
  35. package/dist/spawn.js +6 -1
  36. package/package.json +1 -1
  37. package/dist/error-codes-C9BOUI5H.d.ts +0 -118
  38. package/dist/error-codes-CFTOAxva.d.cts +0 -118
@@ -4,7 +4,7 @@ type BestEffortLevel = "debug" | "error";
4
4
  * 吞咽 best-effort IO 的错误,按 level 经共享 logger 记录。
5
5
  *
6
6
  * - debug(默认):次要清理(sidecar/worktree/alive marker),失败属预期路径
7
- * - error:关键步骤抛错但需继续后续清理(如 finalizeRecord 的 B9 链:completeRecord
7
+ * - error:关键步骤抛错但需继续后续清理(如 finalizeRecord 的 B9 链:completeLegacyClosed
8
8
  * 抛错后仍要执行 finalized/cleanup,错误需可见但不阻断)
9
9
  *
10
10
  * 错误对象优先取 message(避免打印巨大堆栈/对象),其他类型原样传入。
@@ -4,7 +4,7 @@ type BestEffortLevel = "debug" | "error";
4
4
  * 吞咽 best-effort IO 的错误,按 level 经共享 logger 记录。
5
5
  *
6
6
  * - debug(默认):次要清理(sidecar/worktree/alive marker),失败属预期路径
7
- * - error:关键步骤抛错但需继续后续清理(如 finalizeRecord 的 B9 链:completeRecord
7
+ * - error:关键步骤抛错但需继续后续清理(如 finalizeRecord 的 B9 链:completeLegacyClosed
8
8
  * 抛错后仍要执行 finalized/cleanup,错误需可见但不阻断)
9
9
  *
10
10
  * 错误对象优先取 message(避免打印巨大堆栈/对象),其他类型原样传入。
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  EngineSdkError
3
- } from "./chunk-WMDMXP2F.js";
3
+ } from "./chunk-SFNTX7Q3.js";
4
4
 
5
5
  // src/node-executor.ts
6
6
  import { spawn } from "child_process";
@@ -1,3 +1,7 @@
1
+ import {
2
+ killChain,
3
+ safeKill
4
+ } from "./chunk-RCT7L777.js";
1
5
  import {
2
6
  getLogger
3
7
  } from "./chunk-75QEMUGV.js";
@@ -5,6 +9,7 @@ import {
5
9
  // src/spawn.ts
6
10
  import { spawn } from "child_process";
7
11
  var logger = getLogger("engine-sdk/spawn");
12
+ var ENGINE_ABORT_KILL_GRACE_MS = 3e4;
8
13
  var FORBIDDEN_OPTION_KEYS = ["detached", "stdio", "stdin", "windowsHide"];
9
14
  function spawnEngineChild(opts) {
10
15
  for (const key of FORBIDDEN_OPTION_KEYS) {
@@ -25,7 +30,12 @@ function spawnEngineChild(opts) {
25
30
  opts.signal.addEventListener(
26
31
  "abort",
27
32
  () => {
28
- child.kill("SIGTERM");
33
+ safeKill(child, "SIGCONT");
34
+ void killChain(child, {
35
+ graceMs: ENGINE_ABORT_KILL_GRACE_MS,
36
+ unrefTimers: true,
37
+ escalationNote: `engine child (pid ${child.pid ?? "unknown"}) abort`
38
+ });
29
39
  },
30
40
  { once: true }
31
41
  );
@@ -119,6 +129,7 @@ function pumpNdjsonLines(stream, onLine) {
119
129
  }
120
130
 
121
131
  export {
132
+ ENGINE_ABORT_KILL_GRACE_MS,
122
133
  spawnEngineChild,
123
134
  DEFAULT_ENGINE_HOST_REQUEST_TIMEOUT_MS,
124
135
  ENGINE_HOST_REQUEST_TIMEOUT_ENV,
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-PYO3YR7W.js";
4
4
  import {
5
5
  engineTimeoutDetail
6
- } from "./chunk-WMDMXP2F.js";
6
+ } from "./chunk-SFNTX7Q3.js";
7
7
  import {
8
8
  getLogger
9
9
  } from "./chunk-75QEMUGV.js";
@@ -39,6 +39,38 @@ function safeKill(child, signal) {
39
39
  );
40
40
  }
41
41
  }
42
+ function probePidAlive(pid) {
43
+ try {
44
+ process.kill(pid, 0);
45
+ return true;
46
+ } catch (err) {
47
+ if (err.code === "ESRCH") return false;
48
+ return void 0;
49
+ }
50
+ }
51
+ function killPidChain(pid, opts = {}) {
52
+ const graceMs = opts.graceMs ?? DEFAULT_KILL_GRACE_MS;
53
+ signalPid(pid, "SIGTERM");
54
+ const escalation = setTimeout(() => {
55
+ if (probePidAlive(pid) === false) return;
56
+ if (opts.note !== void 0) {
57
+ logger.warn(
58
+ `[kill-chain] ${opts.note} still alive ${graceMs / MS_PER_SECOND}s after SIGTERM, escalating to SIGKILL (pid ${pid})`
59
+ );
60
+ }
61
+ signalPid(pid, "SIGKILL");
62
+ }, graceMs);
63
+ if (typeof escalation.unref === "function") escalation.unref();
64
+ }
65
+ function signalPid(pid, signal) {
66
+ try {
67
+ process.kill(pid, signal);
68
+ } catch (err) {
69
+ logger.debug(
70
+ `[kill-chain] ${signal} to pid ${pid} failed (already dead = expected): ${toErrorMessage(err)}`
71
+ );
72
+ }
73
+ }
42
74
  function synthesizeTimeoutOutcome(task, stdoutTail, engineId) {
43
75
  return {
44
76
  content: "",
@@ -122,6 +154,9 @@ export {
122
154
  DEFAULT_KILL_GRACE_MS,
123
155
  HOST_TIMEOUT_ABORT_REASON,
124
156
  killChain,
157
+ safeKill,
158
+ probePidAlive,
159
+ killPidChain,
125
160
  synthesizeTimeoutOutcome,
126
161
  DEFAULT_NATIVE_INTERRUPT_GRACE_MS,
127
162
  abortWithFallback
@@ -17,8 +17,6 @@ var CRASH_REBUILD_BACKOFF_MS = [
17
17
  CRASH_REBUILD_BACKOFF_STEP_3_MS
18
18
  ];
19
19
  var STDERR_TAIL_CHARS = 400;
20
- var ENGINE_EVENT_COALESCE_ENV = "TAIJI_ENGINE_EVENT_COALESCE";
21
- var ENGINE_EVENT_COALESCE_DEFAULT = "0";
22
20
 
23
21
  // src/protocol/error-codes.ts
24
22
  var ENGINE_PROTOCOL_ERROR_CODES = [
@@ -103,8 +101,6 @@ export {
103
101
  CRASH_REBUILD_MAX_ATTEMPTS,
104
102
  CRASH_REBUILD_BACKOFF_MS,
105
103
  STDERR_TAIL_CHARS,
106
- ENGINE_EVENT_COALESCE_ENV,
107
- ENGINE_EVENT_COALESCE_DEFAULT,
108
104
  ENGINE_PROTOCOL_ERROR_CODES,
109
105
  isEngineProtocolErrorCode,
110
106
  ENGINE_ERROR_CODE_PREFIX,
@@ -167,6 +167,11 @@ function updateFromEvent(record, event) {
167
167
  // ── activity:纯活性信号,reducer no-op(协议语义见 contract-types)──
168
168
  case "activity":
169
169
  return;
170
+ // ── armed:武装确认回执([D3 协议版 P6],协议语义见 contract-types)——监控
171
+ // 信号不进 record 投影,消费方 = 宿主等待门 + run 事件 journal(C3 第④步
172
+ // 双侧 reducer no-op 义务的 SDK 侧)
173
+ case "armed":
174
+ return;
170
175
  default: {
171
176
  const _exhaustive = event;
172
177
  return _exhaustive;
@@ -69,8 +69,10 @@ var AGENT_EVENT_TYPE_NAMES = [
69
69
  // noop-safe: 事件无载荷且现行 reducer 即直接 return——丢弃与处理零差异
70
70
  "activity",
71
71
  // noop-safe: 纯活性信号,双侧 reducer 恒 no-op(协议语义见 AgentEvent 头注),丢弃零差异
72
- "error"
72
+ "error",
73
73
  // noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 lastError 诊断留痕,已写状态不回滚
74
+ "armed"
75
+ // noop-safe: 旧宿主无武装等待窗消费点(fail-fast 属宿主新增逻辑),丢弃仅缺武装留痕,schema 强制第一道防线(引擎自查断言)不受损
74
76
  ];
75
77
 
76
78
  // src/protocol/schema.ts
@@ -56,13 +56,20 @@ interface Turn {
56
56
  closedTs?: number;
57
57
  }
58
58
  /**
59
- * 引擎事件(9 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
59
+ * 引擎事件(10 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
60
60
  * 兼容」不变量 3 的类型面)。语义锚点 = pi(ACP 词汇对照见 core execution/assembly/types.ts 注释)。
61
61
  *
62
62
  * activity = 纯活性信号:双侧 reducer no-op、不开 turn、不写状态、不落 journal
63
63
  * (core journal-wiring 对其豁免 append),只承诺「引擎活跃时周期性出现」——供宿主
64
64
  * 无进展守护刷新判活(长工具执行期)。节流属生产者实现细节,不进协议承诺。
65
65
  *
66
+ * armed = [D3 协议版 P6] schema 强制武装确认回执:引擎在启动期武装断言通过 +
67
+ * 孙进程 spawn 成功后上报一次(仅 native 引擎、仅 schema 任务;emulated 引擎无
68
+ * 孙进程 env/扩展依赖,「武装」概念不适用,恒不上报)。宿主是独立信号源(引擎
69
+ * 自查断言之外的第二道防线——监控信号不与施控同源):native schema 任务的 run
70
+ * 在等待窗(宿主侧常量)内未收到本事件即 fail-fast。载荷 = 已核验的武装事实
71
+ * (env 变量名 + 必备扩展包名),经宿主落 run 事件 journal(RunArmedEvent.frame)。
72
+ *
66
73
  * 每个成员的 type 经 `EventName<"…">` 受词表约束(编译锁①,见下方词表节)。
67
74
  */
68
75
  type AgentEvent = {
@@ -95,9 +102,13 @@ type AgentEvent = {
95
102
  } | {
96
103
  type: EventName<"error">;
97
104
  message: string;
105
+ } | {
106
+ type: EventName<"armed">;
107
+ schemaEnvVar: string;
108
+ extensionPkg: string;
98
109
  };
99
110
  /**
100
- * 事件类型词表(协议事件全集 9 种,运行时 SSOT):schema 事件 `type.enum` 从本表
111
+ * 事件类型词表(协议事件全集 10 种,运行时 SSOT):schema 事件 `type.enum` 从本表
101
112
  * 派生(schema.ts),测试取值遍历本表(protocol-schema.test.ts / contract-closure.test.ts)
102
113
  * ——新增事件变体不再手写第三处。
103
114
  *
@@ -118,7 +129,7 @@ type AgentEvent = {
118
129
  * switch never 检查)与 contract-closure 构造冒烟(Record<AgentEventTypeName,…>
119
130
  * 漏键爆红)。不 bump 版本、不改任何引擎(演进政策 additive 面,判据全文见头注)。
120
131
  */
121
- declare const AGENT_EVENT_TYPE_NAMES: readonly ["tool_start", "tool_end", "text_delta", "thinking_delta", "turn_end", "message_end", "compaction", "activity", "error"];
132
+ declare const AGENT_EVENT_TYPE_NAMES: readonly ["tool_start", "tool_end", "text_delta", "thinking_delta", "turn_end", "message_end", "compaction", "activity", "error", "armed"];
122
133
  /** 词表派生的事件名联合(编译锁②/③的词表侧源;schema enum 与测试取值同源)。 */
123
134
  type AgentEventTypeName = (typeof AGENT_EVENT_TYPE_NAMES)[number];
124
135
  /**
@@ -183,10 +194,25 @@ interface SessionView {
183
194
  usage?: AgentUsageTotal;
184
195
  source: "native" | "journal" | "outcome-only";
185
196
  }
197
+ /**
198
+ * 引擎进程形态(manifest `taiji.subagentEngine.processModel` 声明字面量;设计
199
+ * pi-workflow-run-resource-model §3.3 决策 3)。语义:
200
+ * - 'per-window':窗口作用域实例——引擎薄壳进程随派发窗口(workflow run /
201
+ * chat record 轮次)生灭,窗口内复用、窗口收尾 dispose;
202
+ * - 'shared-service':进程级懒加载单例——薄壳(及所辖重服务)随宿主(taiji)
203
+ * 存活,跨一切窗口共享。
204
+ * **不是任务能力字段**——能力字段服务 run 前资格判定,本字段服务宿主的实例
205
+ * 管理(实例挂窗口还是挂注册表单例),刻意不进 EngineCapabilities(混放会让
206
+ * 能力协商面——握手应答对照、gate 位——误消费)。缺省 = 'per-window'
207
+ * (轻壳是引擎适配包的常态,重服务是显式特例),解析侧 engine-manifest.ts 落实。
208
+ */
209
+ type EngineProcessModel = "per-window" | "shared-service";
186
210
  /**
187
211
  * 引擎能力声明(11 位)。三级:native / emulated / unsupported。
188
212
  * 声明的是本仓 subagent 链路实际接通的能力,不是引擎 RPC 层的理论能力。
189
213
  * 同步权威 = manifest(注册期直读);握手应答仅诊断(§3.3「同步成员清单」)。
214
+ * 进程形态声明是独立字段(上方 EngineProcessModel——manifest 契约面,不在本
215
+ * 接口内),两套字段服务不同裁决(任务能力 vs 宿主实例管理)。
190
216
  */
191
217
  interface EngineCapabilities {
192
218
  /** native: --json-schema/--output-schema/env 注入。 */
@@ -297,6 +323,25 @@ interface AgentOutcome {
297
323
  };
298
324
  /** null = 被信号杀死(杀链/abort 合成终态的判据)。 */
299
325
  exitCode?: number | null;
326
+ /**
327
+ * [D5 诊断引用落账] 失败时子进程 stderr tee 文件绝对路径(引擎侧 W11 已有落盘)。
328
+ *
329
+ * 通道裁决(协议演进宪法 ADR-0071 判据链,2026-09-22 一致性审查 P1 修复登记):stderr
330
+ * tee 路径是引擎产生的诊断事实,宿主不可靠推导(文件名格式/dataDir 解析/轮转
331
+ * rename 后的真实名只有引擎知道,两引擎前缀不同——判据③「推导会分叉」)→ 上协议。
332
+ * 承载形态选 run 终态应答(本类型)的字段扩展而非 AgentEvent 词表变体,判据:
333
+ * ① 失败伴随路径的语义本就是终态诊断引用,与终态应答同帧(引擎应答 failed /
334
+ * 进程异常退出路径才上报;成功不报);
335
+ * ② 一 run 一应答,宿主按构造与 ask 一一对应——事件通道虽经 runId 路由具备
336
+ * run 级归属面(2026-09-22 定向复审更正:event 通知帧 params required
337
+ * ["runId","seq","event"],runId=taskId 即 ask 粒度),但终态诊断引用与终态
338
+ * 应答同帧单源直达(outcome → outcomeToWorkflowResult → call.result →
339
+ * agent-settled 载荷),经事件通道中转反而多一跳;
340
+ * ③ additive 可选字段向后兼容(不支持的引擎不设值 = 零行为差;旧宿主未知字段
341
+ * 容忍),不触发事件词表 C3 四步义务(词表/schema enum 零改动)。
342
+ * 仅诊断引用——文件受引擎侧尺寸轮转与过期清理管辖,读侧不得假设其永存。
343
+ */
344
+ stderrTeePath?: string;
300
345
  }
301
346
  /**
302
347
  * 引擎模型目录条目(manifest `modelCatalog.models` 条目形态,设计 §3.4 示例)。
@@ -312,15 +357,35 @@ interface ModelCatalogEntry {
312
357
  * 单次 agent 调用的任务声明——引擎面子集(协议 run.params.task;core 全量
313
358
  * AgentCallOpts 22 字段留 core,core 侧反向 re-export 保消费面)。
314
359
  *
315
- * 字段裁决(对照 core orchestration/models/types.ts AgentCallOpts,2026-09-09):
316
- * - 入选 = 引擎消费面:任务语义(prompt/schema/thinkingLevel/skill/skillPath/agent/persona 注入)、
317
- * 轮次预算(maxTurns/graceTurns/idleTimeoutMs)、隔离与权限(worktree/
318
- * fork/forkSource/denyTools/permissionMode)、诊断(description/scene);
319
- * - 排除并改挂 run.params.ctx(协议层已单列,task 内双写会分叉):model(→ctx.model)、
320
- * schemaEnv(→ctx.schemaEnv)、cwd(→ctx.cwd)、engineFallback(→ctx.engineFallback);
321
- * - 排除(宿主侧消费,无引擎语义):engine(路由决策已完成,收到的引擎即选中值)、
322
- * timeoutMs(宿主超时链 mergeTimeoutSignal → cancel 帧,非引擎参数)、returnMeta
323
- * (core 注释明确「dropped at the pi boundary」,非引擎消费)。
360
+ * 字段归属判据(协议演进宪法 ADR-0071 成文,权威源
361
+ * docs/architecture/subagent-engine-protocolization.md §3.3「协议演进宪法」与
362
+ * docs/adr/decisions.md ADR-0071;
363
+ * 本注释是判据与存量结论的投影,新增字段按决策树依序裁决后在此登记):
364
+ * ① 引擎不消费它任务能否正确完成?能 → 宿主自持不上协议(「正确」含满足字段
365
+ * 声明携带的约束面——轮次预算/超时等约束被引擎忽略即任务语义受损,视为消费);
366
+ * ② 描述「任务是什么」(what) 还是「在什么环境跑/怎么跑」(where/how)?
367
+ * what → task(预算/验收类约束 = 任务自带语义归 task,宿主偏好参数走③);
368
+ * ③ 引擎能否自行推导该环境值且与宿主恒等?能 → 不上协议(推导权归引擎,设计期
369
+ * 以两引擎实装逐一对照验证恒等);不能(推导会分叉)→ run.params.ctx
370
+ * (存疑即视为会分叉,取 ctx 保守侧);
371
+ * ④ 【绝对条款】双写禁令——同一语义不得在 task 与 ctx 各挂一份,取值源必须唯一
372
+ * (机器锁见 contract-closure.test.ts 的 keyof 交集 = never 断言;禁令钉 wire
373
+ * 类型,port-contract.ts 的进程内合回形态不在此列);
374
+ * ⑤ 能力绑定——字段有效性依赖能力位时双向注释互指(先例 streamMode ↔
375
+ * eventGranularity),宿主据此派发前预检。存量不搬家不重判:判据只约束新增。
376
+ *
377
+ * 存量字段结论表(判据 1-3 回判与现状一致):
378
+ * - 判据② task(任务语义):prompt / schema / thinkingLevel / scene /
379
+ * maxTurns / graceTurns / idleTimeoutMs / skill / skillPath / agent /
380
+ * appendSystemPrompt;
381
+ * - 判据② task(隔离与权限随任务声明):worktree / fork / forkSource /
382
+ * denyTools / permissionMode;
383
+ * - 判据② task(诊断元数据):description;
384
+ * - 判据③ ctx(环境值,引擎自推导与宿主不恒等):model / cwd / engineFallback
385
+ * (对照 core orchestration/models/types.ts AgentCallOpts,协议层单列);
386
+ * - 判据① 宿主自持不上协议:engine(路由决策已完成,收到的引擎即选中值)、
387
+ * timeoutMs(宿主超时链 mergeTimeoutSignal → cancel 帧,非引擎参数)、
388
+ * returnMeta(core 注释明确「dropped at the pi boundary」,非引擎消费)。
324
389
  *
325
390
  * W2 实装 EngineClient run 帧时以本类型为 params.task;core 侧全量 → 子集的方向性
326
391
  * 收窄(多余字段宿主自持不透传)不构成类型漂移(断言方向见 contract-closure 测试样板)。
@@ -369,4 +434,4 @@ interface AgentCallOpts {
369
434
  permissionMode?: string;
370
435
  }
371
436
 
372
- export { AGENT_EVENT_TYPE_NAMES as A, type EngineCapabilities as E, type InternalToolCall as I, type ModelCatalogEntry as M, type ProbeReport as P, type ReplayedTurn as R, type SessionView as S, type ToolCall as T, type WorktreeHandle as W, type AgentCallOpts as a, type AgentEvent as b, type AgentEventTypeName as c, type AgentFailureKind as d, type AgentOutcome as e, type AgentOutcomeUsage as f, type AgentUsage as g, type AgentUsageTotal as h, type AssertMutuallyAssignable as i, type EngineHandleData as j, type ResumeAnchor as k, type ToolCallEntry as l, type ToolCallResult as m, type Turn as n };
437
+ export { AGENT_EVENT_TYPE_NAMES as A, type EngineCapabilities as E, type InternalToolCall as I, type ModelCatalogEntry as M, type ProbeReport as P, type ReplayedTurn as R, type SessionView as S, type ToolCall as T, type WorktreeHandle as W, type AgentCallOpts as a, type AgentEvent as b, type AgentEventTypeName as c, type AgentFailureKind as d, type AgentOutcome as e, type AgentOutcomeUsage as f, type AgentUsage as g, type AgentUsageTotal as h, type AssertMutuallyAssignable as i, type EngineHandleData as j, type EngineProcessModel as k, type ResumeAnchor as l, type ToolCallEntry as m, type ToolCallResult as n, type Turn as o };
@@ -56,13 +56,20 @@ interface Turn {
56
56
  closedTs?: number;
57
57
  }
58
58
  /**
59
- * 引擎事件(9 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
59
+ * 引擎事件(10 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
60
60
  * 兼容」不变量 3 的类型面)。语义锚点 = pi(ACP 词汇对照见 core execution/assembly/types.ts 注释)。
61
61
  *
62
62
  * activity = 纯活性信号:双侧 reducer no-op、不开 turn、不写状态、不落 journal
63
63
  * (core journal-wiring 对其豁免 append),只承诺「引擎活跃时周期性出现」——供宿主
64
64
  * 无进展守护刷新判活(长工具执行期)。节流属生产者实现细节,不进协议承诺。
65
65
  *
66
+ * armed = [D3 协议版 P6] schema 强制武装确认回执:引擎在启动期武装断言通过 +
67
+ * 孙进程 spawn 成功后上报一次(仅 native 引擎、仅 schema 任务;emulated 引擎无
68
+ * 孙进程 env/扩展依赖,「武装」概念不适用,恒不上报)。宿主是独立信号源(引擎
69
+ * 自查断言之外的第二道防线——监控信号不与施控同源):native schema 任务的 run
70
+ * 在等待窗(宿主侧常量)内未收到本事件即 fail-fast。载荷 = 已核验的武装事实
71
+ * (env 变量名 + 必备扩展包名),经宿主落 run 事件 journal(RunArmedEvent.frame)。
72
+ *
66
73
  * 每个成员的 type 经 `EventName<"…">` 受词表约束(编译锁①,见下方词表节)。
67
74
  */
68
75
  type AgentEvent = {
@@ -95,9 +102,13 @@ type AgentEvent = {
95
102
  } | {
96
103
  type: EventName<"error">;
97
104
  message: string;
105
+ } | {
106
+ type: EventName<"armed">;
107
+ schemaEnvVar: string;
108
+ extensionPkg: string;
98
109
  };
99
110
  /**
100
- * 事件类型词表(协议事件全集 9 种,运行时 SSOT):schema 事件 `type.enum` 从本表
111
+ * 事件类型词表(协议事件全集 10 种,运行时 SSOT):schema 事件 `type.enum` 从本表
101
112
  * 派生(schema.ts),测试取值遍历本表(protocol-schema.test.ts / contract-closure.test.ts)
102
113
  * ——新增事件变体不再手写第三处。
103
114
  *
@@ -118,7 +129,7 @@ type AgentEvent = {
118
129
  * switch never 检查)与 contract-closure 构造冒烟(Record<AgentEventTypeName,…>
119
130
  * 漏键爆红)。不 bump 版本、不改任何引擎(演进政策 additive 面,判据全文见头注)。
120
131
  */
121
- declare const AGENT_EVENT_TYPE_NAMES: readonly ["tool_start", "tool_end", "text_delta", "thinking_delta", "turn_end", "message_end", "compaction", "activity", "error"];
132
+ declare const AGENT_EVENT_TYPE_NAMES: readonly ["tool_start", "tool_end", "text_delta", "thinking_delta", "turn_end", "message_end", "compaction", "activity", "error", "armed"];
122
133
  /** 词表派生的事件名联合(编译锁②/③的词表侧源;schema enum 与测试取值同源)。 */
123
134
  type AgentEventTypeName = (typeof AGENT_EVENT_TYPE_NAMES)[number];
124
135
  /**
@@ -183,10 +194,25 @@ interface SessionView {
183
194
  usage?: AgentUsageTotal;
184
195
  source: "native" | "journal" | "outcome-only";
185
196
  }
197
+ /**
198
+ * 引擎进程形态(manifest `taiji.subagentEngine.processModel` 声明字面量;设计
199
+ * pi-workflow-run-resource-model §3.3 决策 3)。语义:
200
+ * - 'per-window':窗口作用域实例——引擎薄壳进程随派发窗口(workflow run /
201
+ * chat record 轮次)生灭,窗口内复用、窗口收尾 dispose;
202
+ * - 'shared-service':进程级懒加载单例——薄壳(及所辖重服务)随宿主(taiji)
203
+ * 存活,跨一切窗口共享。
204
+ * **不是任务能力字段**——能力字段服务 run 前资格判定,本字段服务宿主的实例
205
+ * 管理(实例挂窗口还是挂注册表单例),刻意不进 EngineCapabilities(混放会让
206
+ * 能力协商面——握手应答对照、gate 位——误消费)。缺省 = 'per-window'
207
+ * (轻壳是引擎适配包的常态,重服务是显式特例),解析侧 engine-manifest.ts 落实。
208
+ */
209
+ type EngineProcessModel = "per-window" | "shared-service";
186
210
  /**
187
211
  * 引擎能力声明(11 位)。三级:native / emulated / unsupported。
188
212
  * 声明的是本仓 subagent 链路实际接通的能力,不是引擎 RPC 层的理论能力。
189
213
  * 同步权威 = manifest(注册期直读);握手应答仅诊断(§3.3「同步成员清单」)。
214
+ * 进程形态声明是独立字段(上方 EngineProcessModel——manifest 契约面,不在本
215
+ * 接口内),两套字段服务不同裁决(任务能力 vs 宿主实例管理)。
190
216
  */
191
217
  interface EngineCapabilities {
192
218
  /** native: --json-schema/--output-schema/env 注入。 */
@@ -297,6 +323,25 @@ interface AgentOutcome {
297
323
  };
298
324
  /** null = 被信号杀死(杀链/abort 合成终态的判据)。 */
299
325
  exitCode?: number | null;
326
+ /**
327
+ * [D5 诊断引用落账] 失败时子进程 stderr tee 文件绝对路径(引擎侧 W11 已有落盘)。
328
+ *
329
+ * 通道裁决(协议演进宪法 ADR-0071 判据链,2026-09-22 一致性审查 P1 修复登记):stderr
330
+ * tee 路径是引擎产生的诊断事实,宿主不可靠推导(文件名格式/dataDir 解析/轮转
331
+ * rename 后的真实名只有引擎知道,两引擎前缀不同——判据③「推导会分叉」)→ 上协议。
332
+ * 承载形态选 run 终态应答(本类型)的字段扩展而非 AgentEvent 词表变体,判据:
333
+ * ① 失败伴随路径的语义本就是终态诊断引用,与终态应答同帧(引擎应答 failed /
334
+ * 进程异常退出路径才上报;成功不报);
335
+ * ② 一 run 一应答,宿主按构造与 ask 一一对应——事件通道虽经 runId 路由具备
336
+ * run 级归属面(2026-09-22 定向复审更正:event 通知帧 params required
337
+ * ["runId","seq","event"],runId=taskId 即 ask 粒度),但终态诊断引用与终态
338
+ * 应答同帧单源直达(outcome → outcomeToWorkflowResult → call.result →
339
+ * agent-settled 载荷),经事件通道中转反而多一跳;
340
+ * ③ additive 可选字段向后兼容(不支持的引擎不设值 = 零行为差;旧宿主未知字段
341
+ * 容忍),不触发事件词表 C3 四步义务(词表/schema enum 零改动)。
342
+ * 仅诊断引用——文件受引擎侧尺寸轮转与过期清理管辖,读侧不得假设其永存。
343
+ */
344
+ stderrTeePath?: string;
300
345
  }
301
346
  /**
302
347
  * 引擎模型目录条目(manifest `modelCatalog.models` 条目形态,设计 §3.4 示例)。
@@ -312,15 +357,35 @@ interface ModelCatalogEntry {
312
357
  * 单次 agent 调用的任务声明——引擎面子集(协议 run.params.task;core 全量
313
358
  * AgentCallOpts 22 字段留 core,core 侧反向 re-export 保消费面)。
314
359
  *
315
- * 字段裁决(对照 core orchestration/models/types.ts AgentCallOpts,2026-09-09):
316
- * - 入选 = 引擎消费面:任务语义(prompt/schema/thinkingLevel/skill/skillPath/agent/persona 注入)、
317
- * 轮次预算(maxTurns/graceTurns/idleTimeoutMs)、隔离与权限(worktree/
318
- * fork/forkSource/denyTools/permissionMode)、诊断(description/scene);
319
- * - 排除并改挂 run.params.ctx(协议层已单列,task 内双写会分叉):model(→ctx.model)、
320
- * schemaEnv(→ctx.schemaEnv)、cwd(→ctx.cwd)、engineFallback(→ctx.engineFallback);
321
- * - 排除(宿主侧消费,无引擎语义):engine(路由决策已完成,收到的引擎即选中值)、
322
- * timeoutMs(宿主超时链 mergeTimeoutSignal → cancel 帧,非引擎参数)、returnMeta
323
- * (core 注释明确「dropped at the pi boundary」,非引擎消费)。
360
+ * 字段归属判据(协议演进宪法 ADR-0071 成文,权威源
361
+ * docs/architecture/subagent-engine-protocolization.md §3.3「协议演进宪法」与
362
+ * docs/adr/decisions.md ADR-0071;
363
+ * 本注释是判据与存量结论的投影,新增字段按决策树依序裁决后在此登记):
364
+ * ① 引擎不消费它任务能否正确完成?能 → 宿主自持不上协议(「正确」含满足字段
365
+ * 声明携带的约束面——轮次预算/超时等约束被引擎忽略即任务语义受损,视为消费);
366
+ * ② 描述「任务是什么」(what) 还是「在什么环境跑/怎么跑」(where/how)?
367
+ * what → task(预算/验收类约束 = 任务自带语义归 task,宿主偏好参数走③);
368
+ * ③ 引擎能否自行推导该环境值且与宿主恒等?能 → 不上协议(推导权归引擎,设计期
369
+ * 以两引擎实装逐一对照验证恒等);不能(推导会分叉)→ run.params.ctx
370
+ * (存疑即视为会分叉,取 ctx 保守侧);
371
+ * ④ 【绝对条款】双写禁令——同一语义不得在 task 与 ctx 各挂一份,取值源必须唯一
372
+ * (机器锁见 contract-closure.test.ts 的 keyof 交集 = never 断言;禁令钉 wire
373
+ * 类型,port-contract.ts 的进程内合回形态不在此列);
374
+ * ⑤ 能力绑定——字段有效性依赖能力位时双向注释互指(先例 streamMode ↔
375
+ * eventGranularity),宿主据此派发前预检。存量不搬家不重判:判据只约束新增。
376
+ *
377
+ * 存量字段结论表(判据 1-3 回判与现状一致):
378
+ * - 判据② task(任务语义):prompt / schema / thinkingLevel / scene /
379
+ * maxTurns / graceTurns / idleTimeoutMs / skill / skillPath / agent /
380
+ * appendSystemPrompt;
381
+ * - 判据② task(隔离与权限随任务声明):worktree / fork / forkSource /
382
+ * denyTools / permissionMode;
383
+ * - 判据② task(诊断元数据):description;
384
+ * - 判据③ ctx(环境值,引擎自推导与宿主不恒等):model / cwd / engineFallback
385
+ * (对照 core orchestration/models/types.ts AgentCallOpts,协议层单列);
386
+ * - 判据① 宿主自持不上协议:engine(路由决策已完成,收到的引擎即选中值)、
387
+ * timeoutMs(宿主超时链 mergeTimeoutSignal → cancel 帧,非引擎参数)、
388
+ * returnMeta(core 注释明确「dropped at the pi boundary」,非引擎消费)。
324
389
  *
325
390
  * W2 实装 EngineClient run 帧时以本类型为 params.task;core 侧全量 → 子集的方向性
326
391
  * 收窄(多余字段宿主自持不透传)不构成类型漂移(断言方向见 contract-closure 测试样板)。
@@ -369,4 +434,4 @@ interface AgentCallOpts {
369
434
  permissionMode?: string;
370
435
  }
371
436
 
372
- export { AGENT_EVENT_TYPE_NAMES as A, type EngineCapabilities as E, type InternalToolCall as I, type ModelCatalogEntry as M, type ProbeReport as P, type ReplayedTurn as R, type SessionView as S, type ToolCall as T, type WorktreeHandle as W, type AgentCallOpts as a, type AgentEvent as b, type AgentEventTypeName as c, type AgentFailureKind as d, type AgentOutcome as e, type AgentOutcomeUsage as f, type AgentUsage as g, type AgentUsageTotal as h, type AssertMutuallyAssignable as i, type EngineHandleData as j, type ResumeAnchor as k, type ToolCallEntry as l, type ToolCallResult as m, type Turn as n };
437
+ export { AGENT_EVENT_TYPE_NAMES as A, type EngineCapabilities as E, type InternalToolCall as I, type ModelCatalogEntry as M, type ProbeReport as P, type ReplayedTurn as R, type SessionView as S, type ToolCall as T, type WorktreeHandle as W, type AgentCallOpts as a, type AgentEvent as b, type AgentEventTypeName as c, type AgentFailureKind as d, type AgentOutcome as e, type AgentOutcomeUsage as f, type AgentUsage as g, type AgentUsageTotal as h, type AssertMutuallyAssignable as i, type EngineHandleData as j, type EngineProcessModel as k, type ResumeAnchor as l, type ToolCallEntry as m, type ToolCallResult as n, type Turn as o };