@zhushanwen/subagent-engine-sdk 0.10.1 → 0.12.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/{chunk-AF2ETADP.js → chunk-2L3I2TWJ.js} +5 -10
- package/dist/{chunk-HSNDUHFH.js → chunk-3MCOZY3Z.js} +32 -4
- package/dist/{chunk-LM7P7OTA.js → chunk-7R6HYT2A.js} +60 -4
- package/dist/{chunk-JZN76I3S.js → chunk-NVF3PADP.js} +29 -1
- package/dist/{chunk-NTOLHLCL.js → chunk-QGXILDWB.js} +1 -1
- package/dist/{chunk-CNCFMPEH.js → chunk-TJMS3YOR.js} +1 -1
- package/dist/{chunk-SGAIDL63.js → chunk-U5MBAKS5.js} +21 -7
- package/dist/cli-entry.d.cts +1 -1
- package/dist/cli-entry.d.ts +1 -1
- package/dist/{contract-types-jSa1g28F.d.cts → contract-types-C1scOS_M.d.cts} +218 -21
- package/dist/{contract-types-jSa1g28F.d.ts → contract-types-C1scOS_M.d.ts} +218 -21
- package/dist/env.cjs +5 -10
- package/dist/env.d.cts +6 -17
- package/dist/env.d.ts +6 -17
- package/dist/env.js +1 -1
- package/dist/{error-codes-f-UO4a8D.d.cts → error-codes-CgcjlmeD.d.cts} +42 -6
- package/dist/{error-codes-DnFru4L4.d.ts → error-codes-o4rNd1Ee.d.ts} +42 -6
- package/dist/index.cjs +178 -103
- package/dist/index.d.cts +29 -41
- package/dist/index.d.ts +29 -41
- package/dist/index.js +54 -57
- package/dist/journal-io.d.cts +1 -1
- package/dist/journal-io.d.ts +1 -1
- package/dist/journal-replay.cjs +24 -7
- package/dist/journal-replay.d.cts +41 -7
- package/dist/journal-replay.d.ts +41 -7
- package/dist/journal-replay.js +7 -1
- package/dist/kill-chain.d.cts +5 -5
- package/dist/kill-chain.d.ts +5 -5
- package/dist/kill-chain.js +2 -2
- package/dist/logger.d.cts +1 -1
- package/dist/logger.d.ts +1 -1
- package/dist/logs/stderr-rotation.d.cts +4 -4
- package/dist/logs/stderr-rotation.d.ts +4 -4
- package/dist/{methods-BLxg4ZFr.d.cts → methods-BzvzcCrB.d.cts} +5 -5
- package/dist/{methods-C2zvZqhP.d.ts → methods-CPMc4cvF.d.ts} +5 -5
- package/dist/node-executor.cjs +1 -1
- package/dist/node-executor.d.cts +4 -4
- package/dist/node-executor.d.ts +4 -4
- package/dist/node-executor.js +2 -2
- package/dist/port-contract.d.cts +9 -9
- package/dist/port-contract.d.ts +9 -9
- package/dist/protocol/index.cjs +103 -5
- package/dist/protocol/index.d.cts +59 -16
- package/dist/protocol/index.d.ts +59 -16
- package/dist/protocol/index.js +30 -2
- package/dist/server/index.cjs +1 -1
- package/dist/server/index.d.cts +10 -10
- package/dist/server/index.d.ts +10 -10
- package/dist/server/index.js +1 -1
- package/dist/spawn.cjs +32 -3
- package/dist/spawn.d.cts +34 -8
- package/dist/spawn.d.ts +34 -8
- package/dist/spawn.js +5 -3
- package/dist/ui-types.d.cts +2 -2
- package/dist/ui-types.d.ts +2 -2
- package/package.json +13 -2
- package/dist/chunk-GSW3DMN6.js +0 -39
- package/dist/relay-env.cjs +0 -71
- package/dist/relay-env.d.cts +0 -37
- package/dist/relay-env.d.ts +0 -37
- package/dist/relay-env.js +0 -23
|
@@ -13,8 +13,6 @@ var ENGINE_ENV_DENY_LIST = [
|
|
|
13
13
|
"TAIJI_AGENT_PACKAGED",
|
|
14
14
|
"TAIJI_RUNTIME_TOKEN",
|
|
15
15
|
"TAIJI_AGENT_API_KEY",
|
|
16
|
-
"TAIJI_SUBAGENT_RELAY_SESSION_ID",
|
|
17
|
-
"TAIJI_SUBAGENT_RELAY_RECORD_ID",
|
|
18
16
|
// 预设回落事实(env 名 SSOT = shared PRESET_FALLBACK_ENV_KEYS):「本进程本次运行」
|
|
19
17
|
// 事实只对 runtime 直接 spawn 的 pi 成立,引擎一跳继承会造成子 agent pi 假披露
|
|
20
18
|
"TAIJI_PRESET_FALLBACK_FROM",
|
|
@@ -25,9 +23,11 @@ var ENGINE_ENV_L0_INFRA_KEYS = [
|
|
|
25
23
|
"TAIJI_AGENT_ENGINE_NODE",
|
|
26
24
|
"ELECTRON_RUN_AS_NODE",
|
|
27
25
|
"TAIJI_AGENT_SUBAGENT",
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
26
|
+
// [M3] control 两键(键名 SSOT = src/control-env.ts):runtime 注入主 pi 与引擎的
|
|
27
|
+
// L0 基础设施键,嵌套 task pi 经引擎出站 env 继承同值。刻意不进 ENGINE_ENV_DENY_LIST:
|
|
28
|
+
// 引擎/嵌套 extension 是合法读者(transport 选择谓词 + engine_open 归属键)。
|
|
29
|
+
"TAIJI_SUBAGENT_CONTROL_SOCKET",
|
|
30
|
+
"TAIJI_SUBAGENT_CONTROL_ROOT_SESSION_ID"
|
|
31
31
|
];
|
|
32
32
|
var ENV_PREFIX_SHAPE_RE = /^[A-Za-z0-9_]+$/;
|
|
33
33
|
function deleteEnvKeysCaseInsensitive(env, names) {
|
|
@@ -81,11 +81,6 @@ function injectL0InfraKeys(env, opts) {
|
|
|
81
81
|
if (opts.engineNode !== void 0) env.TAIJI_AGENT_ENGINE_NODE = opts.engineNode;
|
|
82
82
|
if (opts.electronRunAsNode === true) env.ELECTRON_RUN_AS_NODE = "1";
|
|
83
83
|
env.TAIJI_AGENT_SUBAGENT = "1";
|
|
84
|
-
if (opts.relay !== void 0) {
|
|
85
|
-
env.TAIJI_SUBAGENT_RELAY_SOCKET = opts.relay.socket;
|
|
86
|
-
env.TAIJI_SUBAGENT_RELAY_NODE = opts.relay.node;
|
|
87
|
-
env.TAIJI_SUBAGENT_RELAY_SCRIPT = opts.relay.script;
|
|
88
|
-
}
|
|
89
84
|
if (opts.identityEnv !== void 0) {
|
|
90
85
|
for (const [key, value] of Object.entries(opts.identityEnv)) {
|
|
91
86
|
if (value !== void 0) env[key] = value;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
killChain,
|
|
3
3
|
safeKill
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TJMS3YOR.js";
|
|
5
5
|
import {
|
|
6
6
|
getLogger
|
|
7
7
|
} from "./chunk-NXNNXGTY.js";
|
|
@@ -58,13 +58,40 @@ function resolveHostRequestTimeoutMs(opts) {
|
|
|
58
58
|
}
|
|
59
59
|
return parsed;
|
|
60
60
|
}
|
|
61
|
-
function killOwnProcessGroup() {
|
|
61
|
+
function killOwnProcessGroup(deps = {}) {
|
|
62
62
|
const pid = process.pid;
|
|
63
|
+
const kill = deps.killFn ?? ((targetPid, signal) => process.kill(targetPid, signal));
|
|
64
|
+
if ((deps.platform ?? process.platform) === "win32") {
|
|
65
|
+
const fallbackSelfKill = (reason) => {
|
|
66
|
+
logger.warn(`taskkill self-tree failed (${reason}); falling back to self SIGKILL`);
|
|
67
|
+
try {
|
|
68
|
+
kill(pid, "SIGKILL");
|
|
69
|
+
} catch (err) {
|
|
70
|
+
logger.warn(
|
|
71
|
+
`self SIGKILL fallback failed (${String(err)}); descendant pi may linger until runtime sweep`
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
const spawnFn = deps.spawnFn ?? ((command, args, options) => spawn(command, [...args], options));
|
|
76
|
+
try {
|
|
77
|
+
const child = spawnFn("taskkill", ["/PID", String(pid), "/T", "/F"], {
|
|
78
|
+
stdio: "ignore",
|
|
79
|
+
windowsHide: true
|
|
80
|
+
});
|
|
81
|
+
child.on("error", (err) => {
|
|
82
|
+
fallbackSelfKill(String(err));
|
|
83
|
+
});
|
|
84
|
+
child.unref?.();
|
|
85
|
+
} catch (err) {
|
|
86
|
+
fallbackSelfKill(`spawn threw: ${String(err)}`);
|
|
87
|
+
}
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
63
90
|
try {
|
|
64
|
-
|
|
91
|
+
kill(-pid, "SIGKILL");
|
|
65
92
|
} catch (err) {
|
|
66
93
|
logger.warn(`process-group kill failed (${String(err)}), falling back to self kill`);
|
|
67
|
-
|
|
94
|
+
kill(pid, "SIGKILL");
|
|
68
95
|
}
|
|
69
96
|
}
|
|
70
97
|
function armEngineSelfDestruct(opts) {
|
|
@@ -133,6 +160,7 @@ export {
|
|
|
133
160
|
spawnEngineChild,
|
|
134
161
|
DEFAULT_ENGINE_HOST_REQUEST_TIMEOUT_MS,
|
|
135
162
|
ENGINE_HOST_REQUEST_TIMEOUT_ENV,
|
|
163
|
+
killOwnProcessGroup,
|
|
136
164
|
armEngineSelfDestruct,
|
|
137
165
|
pumpNdjsonLines
|
|
138
166
|
};
|
|
@@ -30,12 +30,39 @@ var REVERSE_CHANNEL_TIMEOUT_CLASS = {
|
|
|
30
30
|
"host/askUser": "interaction"
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
// src/protocol/control-protocol.ts
|
|
34
|
+
var SUBAGENT_CONTROL_PROTOCOL_VERSION = 1;
|
|
35
|
+
var SUBAGENT_CONTROL_FRAME_KINDS = {
|
|
36
|
+
hello: "hello",
|
|
37
|
+
helloOk: "hello_ok",
|
|
38
|
+
helloReject: "hello_reject",
|
|
39
|
+
engineOpen: "engine_open",
|
|
40
|
+
engineOpened: "engine_opened",
|
|
41
|
+
engineOpenFailed: "engine_open_failed",
|
|
42
|
+
engineFrame: "engine_frame",
|
|
43
|
+
engineClose: "engine_close",
|
|
44
|
+
engineClosed: "engine_closed",
|
|
45
|
+
error: "error"
|
|
46
|
+
};
|
|
47
|
+
function isSubagentControlFrameKind(value) {
|
|
48
|
+
return typeof value === "string" && Object.values(SUBAGENT_CONTROL_FRAME_KINDS).includes(value);
|
|
49
|
+
}
|
|
50
|
+
var SUBAGENT_CONTROL_CLOSED_REASONS = {
|
|
51
|
+
engineExit: "engine_exit",
|
|
52
|
+
engineSignal: "engine_signal",
|
|
53
|
+
killedByControl: "killed_by_control",
|
|
54
|
+
openTimeout: "open_timeout"
|
|
55
|
+
};
|
|
56
|
+
function isSubagentControlClosedReason(value) {
|
|
57
|
+
return typeof value === "string" && Object.values(SUBAGENT_CONTROL_CLOSED_REASONS).includes(value);
|
|
58
|
+
}
|
|
59
|
+
|
|
33
60
|
// src/protocol/contract-types.ts
|
|
34
61
|
var AGENT_EVENT_TYPE_NAMES = [
|
|
35
62
|
"tool_start",
|
|
36
63
|
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 tool 起始占位(显示降级),turn 结构不受损
|
|
37
64
|
"tool_end",
|
|
38
|
-
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 result,turn
|
|
65
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 result,turn 收尾由 turn_end/message_end 承担
|
|
39
66
|
"text_delta",
|
|
40
67
|
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺正文增量,不产生半解析状态
|
|
41
68
|
"thinking_delta",
|
|
@@ -43,16 +70,35 @@ var AGENT_EVENT_TYPE_NAMES = [
|
|
|
43
70
|
"turn_end",
|
|
44
71
|
// noop-safe: 旧宿主 default 分支零写入——丢弃则该 turn 滞留进行态,journal 重放仍按序重建
|
|
45
72
|
"message_end",
|
|
46
|
-
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 usage
|
|
73
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 usage 聚合与结束计量,已累积内容不回滚
|
|
47
74
|
"compaction",
|
|
48
75
|
// noop-safe: 事件无载荷且现行 reducer 即直接 return——丢弃与处理零差异
|
|
49
76
|
"activity",
|
|
50
77
|
// noop-safe: 纯活性信号,双侧 reducer 恒 no-op(协议语义见 AgentEvent 头注),丢弃零差异
|
|
51
78
|
"error",
|
|
52
79
|
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺 lastError 诊断留痕,已写状态不回滚
|
|
53
|
-
"armed"
|
|
80
|
+
"armed",
|
|
54
81
|
// noop-safe: 旧宿主无武装等待窗消费点(fail-fast 属宿主新增逻辑),丢弃仅缺武装留痕,schema 强制第一道防线(引擎自查断言)不受损
|
|
82
|
+
"auto_retry"
|
|
83
|
+
// noop-safe: 旧宿主 default 分支零写入——丢弃仅缺重试边界留痕(journal 不可查失败尝试轨迹),轮成败判定与 turns/usage 计账不受损(P5 计账锚在引擎侧收尾快照,不依赖宿主消费本帧)
|
|
55
84
|
];
|
|
85
|
+
var _EventVocabSyncLock = true;
|
|
86
|
+
var FAILURE_CAUSE_CLOSED_KINDS = [
|
|
87
|
+
"rate_limited",
|
|
88
|
+
"protocol_unsupported",
|
|
89
|
+
"turn_budget_exhausted",
|
|
90
|
+
"timeout",
|
|
91
|
+
"no_deliverable",
|
|
92
|
+
"cancelled"
|
|
93
|
+
];
|
|
94
|
+
var FAILURE_CAUSE_KIND_VOCAB_LOCK = true;
|
|
95
|
+
var FAILURE_CAUSE_KINDS_BY_CLASS = {
|
|
96
|
+
provider: ["rate_limited", "protocol_unsupported"],
|
|
97
|
+
harness: ["turn_budget_exhausted", "timeout"],
|
|
98
|
+
agent: ["no_deliverable"],
|
|
99
|
+
user: ["cancelled"]
|
|
100
|
+
};
|
|
101
|
+
var FAILURE_CAUSE_KINDS_BY_CLASS_LOCK = true;
|
|
56
102
|
|
|
57
103
|
// src/protocol/schema.ts
|
|
58
104
|
var ANY_JSON = {};
|
|
@@ -125,7 +171,7 @@ var notificationFrameSchema = {
|
|
|
125
171
|
type: {
|
|
126
172
|
type: "string",
|
|
127
173
|
// 事件 enum 从词表 SSOT 派生(U2 词表锁:union⟷词表互证后,此处不再
|
|
128
|
-
//
|
|
174
|
+
// 手写字面量集合——手写即漂移点,问题点 1 的第三处同步点)
|
|
129
175
|
enum: [...AGENT_EVENT_TYPE_NAMES]
|
|
130
176
|
}
|
|
131
177
|
}
|
|
@@ -187,7 +233,17 @@ export {
|
|
|
187
233
|
PROTOCOL_METHODS,
|
|
188
234
|
REVERSE_CHANNELS,
|
|
189
235
|
REVERSE_CHANNEL_TIMEOUT_CLASS,
|
|
236
|
+
SUBAGENT_CONTROL_PROTOCOL_VERSION,
|
|
237
|
+
SUBAGENT_CONTROL_FRAME_KINDS,
|
|
238
|
+
isSubagentControlFrameKind,
|
|
239
|
+
SUBAGENT_CONTROL_CLOSED_REASONS,
|
|
240
|
+
isSubagentControlClosedReason,
|
|
190
241
|
AGENT_EVENT_TYPE_NAMES,
|
|
242
|
+
_EventVocabSyncLock,
|
|
243
|
+
FAILURE_CAUSE_CLOSED_KINDS,
|
|
244
|
+
FAILURE_CAUSE_KIND_VOCAB_LOCK,
|
|
245
|
+
FAILURE_CAUSE_KINDS_BY_CLASS,
|
|
246
|
+
FAILURE_CAUSE_KINDS_BY_CLASS_LOCK,
|
|
191
247
|
protocolErrorSchema,
|
|
192
248
|
requestFrameSchema,
|
|
193
249
|
successResponseFrameSchema,
|
|
@@ -12,6 +12,30 @@ var SET_MODEL_REQUEST_TIMEOUT_MS = 1e4;
|
|
|
12
12
|
var STDERR_TAIL_CHARS = 400;
|
|
13
13
|
|
|
14
14
|
// src/protocol/error-codes.ts
|
|
15
|
+
var ENGINE_SPAWN_DELIVERY_ERROR_CODES = [
|
|
16
|
+
"engine_prompt_not_delivered",
|
|
17
|
+
"engine_prompt_rejected",
|
|
18
|
+
"engine_spawn_handshake_timeout"
|
|
19
|
+
];
|
|
20
|
+
var ENGINE_TRANSPORT_ERROR_CODES = [
|
|
21
|
+
"engine_transport_unavailable",
|
|
22
|
+
"engine_transport_lost",
|
|
23
|
+
"engine_open_timeout",
|
|
24
|
+
"engine_frame_too_large",
|
|
25
|
+
"engine_backpressure_overflow"
|
|
26
|
+
];
|
|
27
|
+
var ENGINE_SPAWN_DELIVERY_ERROR_RECOVERY = {
|
|
28
|
+
engine_prompt_not_delivered: "The task never reached the child pi (zero stdout after the prompt write, or the engine stdin was unavailable). Re-run the task; if it recurs, inspect the engine/pi logs (the failure carries the delivery diagnostics) and the runtime log.",
|
|
29
|
+
engine_prompt_rejected: "The child pi explicitly rejected the prompt command (success:false). Check the pi-side reason carried in the error detail (busy/queue/extension takeover states are reported by pi itself), then re-run.",
|
|
30
|
+
engine_spawn_handshake_timeout: "The engine spawn handshake did not complete in time. Check the runtime log for a spawn/handshake stall, then restart taiji and re-run the task."
|
|
31
|
+
};
|
|
32
|
+
var ENGINE_TRANSPORT_ERROR_RECOVERY = {
|
|
33
|
+
engine_transport_unavailable: "The runtime control socket is unreachable (connect or hello failed). The runtime side is failing explicitly instead of silently falling back to local spawn \u2014 restart taiji and re-run the task.",
|
|
34
|
+
engine_transport_lost: "The control connection to the runtime was lost mid-flight (runtime restart or crash). In-flight requests were rejected; restart taiji (or wait for the runtime to come back) and re-run the task \u2014 the connection is not retried in place.",
|
|
35
|
+
engine_open_timeout: "The runtime did not finish opening the engine channel in time (spawn/attribution stalled). Check the runtime log (engine opened / kill decision lines), then re-run the task.",
|
|
36
|
+
engine_frame_too_large: "A single frame exceeded the control-plane size limit and the channel was closed without truncation. Shrink the task/result payload (e.g. point the agent at files instead of inlining them) and re-run.",
|
|
37
|
+
engine_backpressure_overflow: "The control-plane write queue overflowed (engine consumed frames too slowly) and the overflowed scope was torn down without dropping frames silently. Re-run the task; if it recurs, reduce concurrent subagent fan-out."
|
|
38
|
+
};
|
|
15
39
|
var SET_MODEL_ERROR_CODES = [
|
|
16
40
|
/** 目标模型不在当前进程快照(子进程模型快照冻结于 spawn 时刻——模型本身有效,
|
|
17
41
|
* 下一轮 spawn 现取目录即可用;宿主按「写覆盖意图」处置,设计 §7.2 快照型失败行)。 */
|
|
@@ -56,7 +80,7 @@ var EngineSdkError = class extends Error {
|
|
|
56
80
|
this.recovery = recovery;
|
|
57
81
|
this.data = data;
|
|
58
82
|
}
|
|
59
|
-
/** 协议 error
|
|
83
|
+
/** 协议 error 帧载荷派生视图。 */
|
|
60
84
|
toStructured() {
|
|
61
85
|
return { code: this.code, message: this.message, recovery: this.recovery, data: this.data };
|
|
62
86
|
}
|
|
@@ -117,6 +141,10 @@ export {
|
|
|
117
141
|
SET_MODEL_STAGE_TIMEOUT_MS,
|
|
118
142
|
SET_MODEL_REQUEST_TIMEOUT_MS,
|
|
119
143
|
STDERR_TAIL_CHARS,
|
|
144
|
+
ENGINE_SPAWN_DELIVERY_ERROR_CODES,
|
|
145
|
+
ENGINE_TRANSPORT_ERROR_CODES,
|
|
146
|
+
ENGINE_SPAWN_DELIVERY_ERROR_RECOVERY,
|
|
147
|
+
ENGINE_TRANSPORT_ERROR_RECOVERY,
|
|
120
148
|
SET_MODEL_ERROR_CODES,
|
|
121
149
|
SET_MODEL_NOT_ACTIVE_CODE,
|
|
122
150
|
ENGINE_PROTOCOL_ERROR_CODES,
|
|
@@ -31,7 +31,8 @@ function createReplayRecord() {
|
|
|
31
31
|
turns: [emptyTurn()],
|
|
32
32
|
turnCount: 0,
|
|
33
33
|
totalTokens: 0,
|
|
34
|
-
lastError: void 0
|
|
34
|
+
lastError: void 0,
|
|
35
|
+
errors: []
|
|
35
36
|
};
|
|
36
37
|
}
|
|
37
38
|
function currentTurn(record) {
|
|
@@ -125,7 +126,11 @@ function applyTurnEnd(record) {
|
|
|
125
126
|
turn.closed = true;
|
|
126
127
|
turn.closedTs = Date.now();
|
|
127
128
|
record.turnCount += 1;
|
|
128
|
-
|
|
129
|
+
}
|
|
130
|
+
function appendErrorFact(record, message) {
|
|
131
|
+
if (!message) return;
|
|
132
|
+
(record.errors ??= []).push({ message, at: Date.now() });
|
|
133
|
+
record.lastError = message;
|
|
129
134
|
}
|
|
130
135
|
function applyMessageEnd(record, event) {
|
|
131
136
|
if (event.usage) {
|
|
@@ -134,11 +139,11 @@ function applyMessageEnd(record, event) {
|
|
|
134
139
|
record.totalTokens += (event.usage.input ?? 0) + (event.usage.output ?? 0) + (event.usage.cacheRead ?? 0) + (event.usage.cacheWrite ?? 0);
|
|
135
140
|
}
|
|
136
141
|
if (event.error) {
|
|
137
|
-
record
|
|
142
|
+
appendErrorFact(record, event.error);
|
|
138
143
|
}
|
|
139
144
|
}
|
|
140
145
|
function applyErrorEvent(record, event) {
|
|
141
|
-
record
|
|
146
|
+
appendErrorFact(record, event.message);
|
|
142
147
|
}
|
|
143
148
|
function updateFromEvent(record, event) {
|
|
144
149
|
switch (event.type) {
|
|
@@ -152,13 +157,13 @@ function updateFromEvent(record, event) {
|
|
|
152
157
|
return applyToolStart(record, event);
|
|
153
158
|
case "tool_end":
|
|
154
159
|
return applyToolEnd(record, event);
|
|
155
|
-
// ── turn_end
|
|
160
|
+
// ── turn_end:结束当前 turn ──
|
|
156
161
|
case "turn_end":
|
|
157
162
|
return applyTurnEnd(record);
|
|
158
163
|
// ── message_end:usage 增量累加 + totalTokens 累加 ──
|
|
159
164
|
case "message_end":
|
|
160
165
|
return applyMessageEnd(record, event);
|
|
161
|
-
// ── error
|
|
166
|
+
// ── error:appendErrorFact 入账(errors 只追加 + lastError 派生)──
|
|
162
167
|
case "error":
|
|
163
168
|
return applyErrorEvent(record, event);
|
|
164
169
|
// ── compaction:不产生数据(不变)──
|
|
@@ -168,10 +173,16 @@ function updateFromEvent(record, event) {
|
|
|
168
173
|
case "activity":
|
|
169
174
|
return;
|
|
170
175
|
// ── armed:武装确认回执([D3 协议版 P6],协议语义见 contract-types)——监控
|
|
171
|
-
// 信号不进 record
|
|
176
|
+
// 信号不进 record 派生视图,消费方 = 宿主等待门 + run 事件 journal(C3 第④步
|
|
172
177
|
// 双侧 reducer no-op 义务的 SDK 侧)
|
|
173
178
|
case "armed":
|
|
174
179
|
return;
|
|
180
|
+
// ── auto_retry:pi 原生重试边界帧([subagent-observability §3.3.1 P5])——
|
|
181
|
+
// 观测面(journal 留痕失败尝试轨迹),不进 record 派生视图:失败尝试的
|
|
182
|
+
// turns/usage 切片与 retryAttempts 计数由引擎收尾快照一次产出(outcome
|
|
183
|
+
// 字段承载),reducer 写入会让失败尝试静默混进 turns 聚合,恰违背 P5 计账。
|
|
184
|
+
case "auto_retry":
|
|
185
|
+
return;
|
|
175
186
|
default: {
|
|
176
187
|
const _exhaustive = event;
|
|
177
188
|
return _exhaustive;
|
|
@@ -226,7 +237,10 @@ function sessionIdFromHandle(handle) {
|
|
|
226
237
|
}
|
|
227
238
|
|
|
228
239
|
export {
|
|
240
|
+
addUsage,
|
|
241
|
+
emptyTurn,
|
|
229
242
|
createReplayRecord,
|
|
243
|
+
appendErrorFact,
|
|
230
244
|
updateFromEvent,
|
|
231
245
|
toReplayedTurn,
|
|
232
246
|
aggregateUsage,
|
package/dist/cli-entry.d.cts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
interface CliProtocolServerSink {
|
|
6
6
|
/** 入站协议帧处理(readline 已拆行 + JSON.parse 后的帧)。 */
|
|
7
7
|
handleFrame(frame: unknown): void;
|
|
8
|
-
/**
|
|
8
|
+
/** 数据范围反向请求(host/log 等;应答分类由各包 server 实现承载)。 */
|
|
9
9
|
reverseRequest(method: string, params: unknown): Promise<unknown>;
|
|
10
10
|
}
|
|
11
11
|
/** runEngineCliEntry 参数。 */
|
package/dist/cli-entry.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
interface CliProtocolServerSink {
|
|
6
6
|
/** 入站协议帧处理(readline 已拆行 + JSON.parse 后的帧)。 */
|
|
7
7
|
handleFrame(frame: unknown): void;
|
|
8
|
-
/**
|
|
8
|
+
/** 数据范围反向请求(host/log 等;应答分类由各包 server 实现承载)。 */
|
|
9
9
|
reverseRequest(method: string, params: unknown): Promise<unknown>;
|
|
10
10
|
}
|
|
11
11
|
/** runEngineCliEntry 参数。 */
|