@zhushanwen/subagent-engine-sdk 0.6.1 → 0.7.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.
- package/dist/best-effort.d.cts +1 -1
- package/dist/best-effort.d.ts +1 -1
- package/dist/{chunk-W3BKI2BP.js → chunk-3WC36CHI.js} +1 -1
- package/dist/{chunk-CNQTJJF5.js → chunk-HERD6RIR.js} +12 -1
- package/dist/{chunk-QOEXD2FT.js → chunk-RCT7L777.js} +36 -1
- package/dist/{chunk-WMDMXP2F.js → chunk-SFNTX7Q3.js} +0 -4
- package/dist/{chunk-AIG5LSGK.js → chunk-SGAIDL63.js} +5 -0
- package/dist/{chunk-63ZNJHM5.js → chunk-W23PAAGX.js} +3 -1
- package/dist/{contract-types-DaULkdpG.d.cts → contract-types-DiWyGRXr.d.cts} +78 -13
- package/dist/{contract-types-DaULkdpG.d.ts → contract-types-DiWyGRXr.d.ts} +78 -13
- package/dist/index.cjs +89 -8
- package/dist/index.d.cts +39 -5
- package/dist/index.d.ts +39 -5
- package/dist/index.js +45 -10
- package/dist/journal-io.d.cts +1 -1
- package/dist/journal-io.d.ts +1 -1
- package/dist/journal-replay.cjs +5 -0
- package/dist/journal-replay.d.cts +1 -1
- package/dist/journal-replay.d.ts +1 -1
- package/dist/journal-replay.js +1 -1
- package/dist/kill-chain.cjs +38 -2
- package/dist/kill-chain.d.cts +38 -3
- package/dist/kill-chain.d.ts +38 -3
- package/dist/kill-chain.js +8 -5
- package/dist/node-executor.js +2 -2
- package/dist/port-contract.d.cts +9 -4
- package/dist/port-contract.d.ts +9 -4
- package/dist/protocol/index.cjs +3 -7
- package/dist/protocol/index.d.cts +132 -12
- package/dist/protocol/index.d.ts +132 -12
- package/dist/protocol/index.js +2 -6
- package/dist/spawn.cjs +81 -5
- package/dist/spawn.d.cts +13 -2
- package/dist/spawn.d.ts +13 -2
- package/dist/spawn.js +6 -1
- package/package.json +1 -1
- package/dist/error-codes-C9BOUI5H.d.ts +0 -118
- package/dist/error-codes-CFTOAxva.d.cts +0 -118
package/dist/best-effort.d.cts
CHANGED
|
@@ -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 链:
|
|
7
|
+
* - error:关键步骤抛错但需继续后续清理(如 finalizeRecord 的 B9 链:completeLegacyClosed
|
|
8
8
|
* 抛错后仍要执行 finalized/cleanup,错误需可见但不阻断)
|
|
9
9
|
*
|
|
10
10
|
* 错误对象优先取 message(避免打印巨大堆栈/对象),其他类型原样传入。
|
package/dist/best-effort.d.ts
CHANGED
|
@@ -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 链:
|
|
7
|
+
* - error:关键步骤抛错但需继续后续清理(如 finalizeRecord 的 B9 链:completeLegacyClosed
|
|
8
8
|
* 抛错后仍要执行 finalized/cleanup,错误需可见但不阻断)
|
|
9
9
|
*
|
|
10
10
|
* 错误对象优先取 message(避免打印巨大堆栈/对象),其他类型原样传入。
|
|
@@ -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
|
|
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-
|
|
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
|
-
* 引擎事件(
|
|
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
|
-
* 事件类型词表(协议事件全集
|
|
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
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
*
|
|
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
|
|
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
|
-
* 引擎事件(
|
|
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
|
-
* 事件类型词表(协议事件全集
|
|
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
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
322
|
-
*
|
|
323
|
-
*
|
|
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
|
|
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 };
|