@zhushanwen/subagent-engine-sdk 0.4.0 → 0.5.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.
- package/dist/{chunk-7I4XGL5J.js → chunk-BBWUC2EE.js} +2 -2
- package/dist/{chunk-3K2P2CM2.js → chunk-CNQTJJF5.js} +1 -1
- package/dist/{chunk-DSQ7JQKM.js → chunk-GSW3DMN6.js} +5 -5
- package/dist/{chunk-BBVZK5DL.js → chunk-M3SZTDNQ.js} +20 -20
- package/dist/{chunk-HYES77BR.js → chunk-MSAJXIP4.js} +2 -2
- package/dist/{chunk-FJT23P7T.js → chunk-QOEXD2FT.js} +1 -1
- package/dist/{chunk-LKPVN3N6.js → chunk-W3BKI2BP.js} +3 -3
- package/dist/{chunk-WS4WAZVR.js → chunk-WMDMXP2F.js} +2 -2
- package/dist/{chunk-GT6YLLN4.js → chunk-X24IVQKJ.js} +5 -5
- package/dist/{chunk-365AUV6N.js → chunk-YE472JOO.js} +2 -2
- package/dist/{contract-types-C71Sqq8d.d.cts → contract-types-Dsvy79r3.d.cts} +9 -10
- package/dist/{contract-types-C71Sqq8d.d.ts → contract-types-Dsvy79r3.d.ts} +9 -10
- package/dist/data-dir.cjs +6 -6
- package/dist/data-dir.d.cts +4 -4
- package/dist/data-dir.d.ts +4 -4
- package/dist/data-dir.js +3 -3
- package/dist/env.cjs +20 -20
- package/dist/env.d.cts +12 -5
- package/dist/env.d.ts +12 -5
- package/dist/env.js +1 -1
- package/dist/{error-codes-D5YlWaBx.d.ts → error-codes-DMGeUUUm.d.ts} +12 -12
- package/dist/{error-codes-CiOO3PMg.d.cts → error-codes-pT7RYTqQ.d.cts} +12 -12
- package/dist/index.cjs +42 -42
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +12 -12
- package/dist/journal-io.d.cts +1 -1
- package/dist/journal-io.d.ts +1 -1
- package/dist/journal-replay.d.cts +1 -1
- package/dist/journal-replay.d.ts +1 -1
- package/dist/kill-chain.d.cts +2 -2
- package/dist/kill-chain.d.ts +2 -2
- package/dist/kill-chain.js +2 -2
- package/dist/logs/stderr-rotation.cjs +2 -2
- package/dist/logs/stderr-rotation.d.cts +1 -1
- package/dist/logs/stderr-rotation.d.ts +1 -1
- package/dist/logs/stderr-rotation.js +1 -1
- package/dist/nesting-guard.cjs +2 -2
- package/dist/nesting-guard.d.cts +2 -2
- package/dist/nesting-guard.d.ts +2 -2
- package/dist/nesting-guard.js +1 -1
- package/dist/node-executor.cjs +2 -2
- package/dist/node-executor.d.cts +5 -5
- package/dist/node-executor.d.ts +5 -5
- package/dist/node-executor.js +2 -2
- package/dist/port-contract.d.cts +1 -1
- package/dist/port-contract.d.ts +1 -1
- package/dist/protocol/index.cjs +2 -2
- package/dist/protocol/index.d.cts +5 -5
- package/dist/protocol/index.d.ts +5 -5
- package/dist/protocol/index.js +1 -1
- package/dist/relay-env.cjs +5 -5
- package/dist/relay-env.d.cts +5 -5
- package/dist/relay-env.d.ts +5 -5
- package/dist/relay-env.js +1 -1
- package/dist/spawn.cjs +1 -1
- package/dist/spawn.d.cts +2 -2
- package/dist/spawn.d.ts +2 -2
- package/dist/spawn.js +1 -1
- package/dist/ui-channels.cjs +2 -2
- package/dist/ui-channels.js +1 -1
- package/package.json +2 -4
- package/src/best-effort.ts +0 -37
- package/src/cli-entry.ts +0 -82
- package/src/data-dir.ts +0 -89
- package/src/env.ts +0 -265
- package/src/error-message.ts +0 -22
- package/src/index.ts +0 -63
- package/src/journal-io.ts +0 -82
- package/src/journal-replay.ts +0 -436
- package/src/kill-chain.ts +0 -265
- package/src/logger.ts +0 -105
- package/src/logs/stderr-rotation.ts +0 -166
- package/src/nesting-guard.ts +0 -140
- package/src/node-executor.ts +0 -272
- package/src/paths.ts +0 -48
- package/src/port-contract.ts +0 -150
- package/src/protocol/contract-types.ts +0 -379
- package/src/protocol/engine-protocol.ts +0 -91
- package/src/protocol/error-codes.ts +0 -180
- package/src/protocol/frames.ts +0 -143
- package/src/protocol/index.ts +0 -12
- package/src/protocol/methods.ts +0 -237
- package/src/protocol/reverse-channels.ts +0 -123
- package/src/protocol/schema.ts +0 -185
- package/src/relay-env.ts +0 -60
- package/src/schema-emulation.ts +0 -192
- package/src/spawn.ts +0 -246
- package/src/ui-channels.ts +0 -219
- package/src/ui-types.ts +0 -101
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
// src/protocol/contract-types.ts
|
|
2
|
-
//
|
|
3
|
-
// 引擎面契约类型 SSOT(协议两侧不许各写一份;core 反向 re-export 保上层消费面)。
|
|
4
|
-
// 设计权威源:docs/architecture/subagent-engine-protocolization.md §3.5.1 D7 类型闭包表 +
|
|
5
|
-
// impl-plan §2.1「类型闭包处置」。
|
|
6
|
-
//
|
|
7
|
-
// 搬运口径(逐字对照,结构等价、零 core import):
|
|
8
|
-
// - AgentEvent / AgentUsage / AgentUsageTotal / ToolCallResult / ToolCall /
|
|
9
|
-
// InternalToolCall / Turn ← core execution/assembly/types.ts(2026-09-09 实测 :164-:313)
|
|
10
|
-
// - ReplayedTurn / SessionView / EngineHandleData / EngineCapabilities / ProbeReport /
|
|
11
|
-
// AgentOutcome ← core execution/engine/types.ts
|
|
12
|
-
// - AgentFailureKind / AgentOutcomeUsage(core 名 AgentUsage,orchestration 版)/
|
|
13
|
-
// ToolCallEntry / AgentCallOpts 子集 ← core orchestration/models/types.ts
|
|
14
|
-
// - WorktreeHandle ← core execution/assembly/types.ts:349(SDK 结构等价副本——设计 §3.5.1
|
|
15
|
-
// 点名「AgentCallOpts.worktree 的 WorktreeHandle 即这类副本」)
|
|
16
|
-
//
|
|
17
|
-
// [H1] InteractAction / InteractResult 已随 chat-run 统一退役(U5 删除;
|
|
18
|
-
// docs/architecture/subagent-chat-run-unification.md §3.3 D5——续聊统一为新 run + resume)。
|
|
19
|
-
//
|
|
20
|
-
// core 域类型(ExecutionRecord / Turn 的宿主内部态消费)留 core;SDK 侧一切类型为
|
|
21
|
-
// 结构等价形态,漂移由双向可赋值断言(AssertMutuallyAssignable)在 typecheck 期抓出
|
|
22
|
-
// ——core 侧断言挂靠归 W2(本文件导出该类型助手供其复用),SDK 侧样板见
|
|
23
|
-
// src/__tests__/contract-closure.test.ts。
|
|
24
|
-
|
|
25
|
-
// ============================================================
|
|
26
|
-
// 断言助手(W2 core 侧双向可赋值断言复用)
|
|
27
|
-
// ============================================================
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* 双向可赋值断言:`type _A = AssertMutuallyAssignable<CoreX, SdkX>` 结果必须为 true。
|
|
31
|
-
* 任一方向不可赋值(字段缺失 / 可选性漂移 / 联合分支不齐)结果为 never → 编译失败。
|
|
32
|
-
* 用法(core 侧 W2 挂靠):
|
|
33
|
-
* import type { AssertMutuallyAssignable } from "@zhushanwen/subagent-engine-sdk";
|
|
34
|
-
* type _CoreSdkAgentEvent = AssertMutuallyAssignable<CoreAgentEvent, SdkAgentEvent>;
|
|
35
|
-
* const _assert: _CoreSdkAgentEvent = true;
|
|
36
|
-
*/
|
|
37
|
-
export type AssertMutuallyAssignable<A, B> = [A] extends [B]
|
|
38
|
-
? [B] extends [A]
|
|
39
|
-
? true
|
|
40
|
-
: never
|
|
41
|
-
: never;
|
|
42
|
-
|
|
43
|
-
// ============================================================
|
|
44
|
-
// 事件面(AgentEvent 及其字段型)
|
|
45
|
-
// ============================================================
|
|
46
|
-
|
|
47
|
-
/** token 用量(message_end 单条消息增量)。← core execution/assembly/types.ts AgentUsage。 */
|
|
48
|
-
export interface AgentUsage {
|
|
49
|
-
input: number;
|
|
50
|
-
output: number;
|
|
51
|
-
cacheRead: number;
|
|
52
|
-
cacheWrite: number;
|
|
53
|
-
/** 本 message 的成本(USD)。无成本数据时缺省。 */
|
|
54
|
-
cost?: number;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
export interface AgentUsageTotal extends AgentUsage {
|
|
58
|
-
/** 四项之和。投影时不再手工求和。 */
|
|
59
|
-
total: number;
|
|
60
|
-
/** 累计成本(USD)。无成本数据时为 0。 */
|
|
61
|
-
cost: number;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/** tool 调用结果(tool_end 携带,含 structured-output 的 details)。 */
|
|
65
|
-
export interface ToolCallResult {
|
|
66
|
-
content?: unknown[];
|
|
67
|
-
details?: unknown;
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/** tool 调用(导出的纯净数据形状,不含内部状态机)。 */
|
|
71
|
-
export interface ToolCall {
|
|
72
|
-
toolName: string;
|
|
73
|
-
args?: unknown;
|
|
74
|
-
result?: ToolCallResult;
|
|
75
|
-
isError?: boolean;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/** 内部 ToolCall:追加 _status 进行中标记与 startedTs(reducer 内部态,跨边界导出前 strip)。 */
|
|
79
|
-
export interface InternalToolCall extends ToolCall {
|
|
80
|
-
_status: "running" | "done" | "failed";
|
|
81
|
-
/** tool_start 到达时的墙钟时间戳(Date.now(),ms)。 */
|
|
82
|
-
startedTs: number;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/** 一个 turn 的完整内容(reducer turns[] 的元素)。 */
|
|
86
|
-
export interface Turn {
|
|
87
|
-
/** 本 turn assistant 正文(text_delta 流式累积,完整)。 */
|
|
88
|
-
text: string;
|
|
89
|
-
/** 本 turn 推理(thinking_delta 流式累积,完整)。 */
|
|
90
|
-
thinking: string;
|
|
91
|
-
/** 本 turn 工具调用(InternalToolCall:含完整 result + _status 进行中标记)。 */
|
|
92
|
-
toolCalls: InternalToolCall[];
|
|
93
|
-
/** 本 turn message_end 的 token 增量(聚合得 usage 总量)。 */
|
|
94
|
-
usageDelta?: AgentUsage;
|
|
95
|
-
/** turn_end 是否已到达。false=正在进行;true=已闭合。 */
|
|
96
|
-
closed: boolean;
|
|
97
|
-
/** turn_end 到达时的墙钟时间戳(Date.now(),ms)。 */
|
|
98
|
-
closedTs?: number;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* 引擎事件(9 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
|
|
103
|
-
* 兼容」不变量 3 的类型面)。语义锚点 = pi(ACP 词汇对照见 core execution/assembly/types.ts 注释)。
|
|
104
|
-
*
|
|
105
|
-
* activity = 纯活性信号:双侧 reducer no-op、不开 turn、不写状态、不落 journal
|
|
106
|
-
* (core journal-wiring 对其豁免 append),只承诺「引擎活跃时周期性出现」——供宿主
|
|
107
|
-
* 无进展守护刷新判活(长工具执行期)。节流属生产者实现细节,不进协议承诺。
|
|
108
|
-
*/
|
|
109
|
-
export type AgentEvent =
|
|
110
|
-
| { type: "tool_start"; toolName: string; args?: unknown }
|
|
111
|
-
| { type: "tool_end"; toolName: string; args?: unknown; result?: ToolCallResult; isError?: boolean }
|
|
112
|
-
| { type: "text_delta"; delta: string }
|
|
113
|
-
| { type: "thinking_delta"; delta: string }
|
|
114
|
-
| { type: "turn_end"; summary?: string }
|
|
115
|
-
| { type: "message_end"; usage?: AgentUsage; error?: string }
|
|
116
|
-
| { type: "compaction" }
|
|
117
|
-
| { type: "activity" }
|
|
118
|
-
| { type: "error"; message: string };
|
|
119
|
-
|
|
120
|
-
// ============================================================
|
|
121
|
-
// handle / read 视图
|
|
122
|
-
// ============================================================
|
|
123
|
-
|
|
124
|
-
/**
|
|
125
|
-
* EngineHandle 的持久化形态(JSON v1)。协议 run 终态应答 / read 的
|
|
126
|
-
* handle 载荷(引擎不持有宿主运行时引用,data 即全部)。
|
|
127
|
-
*/
|
|
128
|
-
export interface EngineHandleData {
|
|
129
|
-
v: 1;
|
|
130
|
-
/** 引擎 id('pi' | 'zcode' | ...)。 */
|
|
131
|
-
engineId: string;
|
|
132
|
-
/** 引擎自定义定位键值。pi = { recordId?, sessionFile? };zcode = { sessionId, dbPath }。 */
|
|
133
|
-
sessionRef: Record<string, string>;
|
|
134
|
-
/**
|
|
135
|
-
* journal 绝对路径(read 第②级数据源;宿主读前校验前缀白名单)。缺省 = 无 journal。
|
|
136
|
-
* [池抽象降级 2026-09-13] 原 poolKey 字段已删除——两引擎 poolKey 恒 'shared'
|
|
137
|
-
* (SDK SHARED_POOL_KEY),journal 固定落 engines/<engineId>/shared/,字段零信息量。
|
|
138
|
-
*/
|
|
139
|
-
journalPath?: string;
|
|
140
|
-
/** probe 实测版本(漂移排查锚点)。 */
|
|
141
|
-
engineVersion?: string;
|
|
142
|
-
/** 适配器版本(golden 样本对齐排查)。 */
|
|
143
|
-
adapterVersion: string;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
/**
|
|
147
|
-
* [v1.x] 冷续 resume 锚点——EngineHandleData 定位键的投影子集(诊断字段
|
|
148
|
-
* v/engineVersion/adapterVersion 不属锚点语义,不随锚点走)。消费点:
|
|
149
|
-
* - run.params.resume(宿主 → 引擎:冷续重开已 idle 的 session,pi 消费
|
|
150
|
-
* sessionRef.sessionFile —— 对照 core SpawnResumeOpts.sessionFile 的锚点面)。
|
|
151
|
-
* [H1 U6 已切换] 键切换单批完成(读写端同批),锚点仅经 resume 键携带。
|
|
152
|
-
* 类型层与 EngineHandleData 定位形态的对照由测试断言(Pick 可赋值闭包)锁定。
|
|
153
|
-
*/
|
|
154
|
-
export interface ResumeAnchor {
|
|
155
|
-
/** 引擎定位键(pi = { recordId?, sessionFile? };zcode = { sessionId, dbPath })。 */
|
|
156
|
-
sessionRef: Record<string, string>;
|
|
157
|
-
/** journal 绝对路径(read 降级链第②级数据源;无 journal 缺省)。 */
|
|
158
|
-
journalPath?: string;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/** Turn → ReplayedTurn:剥离内部态(closed 恒 true——重放物无进行时语义)。 */
|
|
162
|
-
export interface ReplayedTurn {
|
|
163
|
-
text: string;
|
|
164
|
-
thinking: string;
|
|
165
|
-
/** 导出的纯净形状(ToolCall,无 _status/startedTs)。 */
|
|
166
|
-
toolCalls: ToolCall[];
|
|
167
|
-
closed: true;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* session 历史的引擎中立视图(协议 read 应答)。降级链三级:①引擎原生读取 →
|
|
172
|
-
* ②宿主 event journal 重放 → ③outcome-only。source 字段是 GUI 降级标记数据源。
|
|
173
|
-
*/
|
|
174
|
-
export interface SessionView {
|
|
175
|
-
engineId: string;
|
|
176
|
-
sessionId?: string;
|
|
177
|
-
/** turns[] 派生数据(重放/重建产物)。 */
|
|
178
|
-
turns: ReplayedTurn[];
|
|
179
|
-
/** 各 turn usageDelta 聚合。 */
|
|
180
|
-
usage?: AgentUsageTotal;
|
|
181
|
-
source: "native" | "journal" | "outcome-only";
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
// ============================================================
|
|
185
|
-
// 能力 / 探针 / 交互
|
|
186
|
-
// ============================================================
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
* 引擎能力声明(11 位)。三级:native / emulated / unsupported。
|
|
190
|
-
* 声明的是本仓 subagent 链路实际接通的能力,不是引擎 RPC 层的理论能力。
|
|
191
|
-
* 同步权威 = manifest(注册期直读);握手应答仅诊断(§3.3「同步成员清单」)。
|
|
192
|
-
*/
|
|
193
|
-
export interface EngineCapabilities {
|
|
194
|
-
/** native: --json-schema/--output-schema/env 注入。 */
|
|
195
|
-
schemaEnforcement: "native" | "emulated";
|
|
196
|
-
/** 注意区分「引擎 RPC 层有此能力」与「subagent 链路已接通」。 */
|
|
197
|
-
steer: "native" | "emulated" | "unsupported";
|
|
198
|
-
/**
|
|
199
|
-
* [H1 D5 语义收窄] resume 能力位(chat 续聊 = 新 run + resume 锚点的承载前提;
|
|
200
|
-
* 原名字沿用——conversation 位保留、语义从「interact 长驻控制面」收窄为
|
|
201
|
-
* 「resume 续聊能力」,gate 判据与消费方不变)。
|
|
202
|
-
* [U6 / 永久会话模型 §3.2.6 要点 4] 新值 "cold" = 冷恢复会话:resume 读通道取
|
|
203
|
-
* 结构化历史 + 新 session 注入(无热 steering)。gate 判据仍是 `=== "unsupported"`
|
|
204
|
-
* 拒绝——"cold" 在 gate 面与 "native" 等价放行,差异只在续聊形态(新 session
|
|
205
|
-
* 注入 vs 原地续写)。
|
|
206
|
-
*/
|
|
207
|
-
conversation: "native" | "cold" | "unsupported";
|
|
208
|
-
/** 决定 persona 路由策略(file/flag/prompt 通道)。 */
|
|
209
|
-
personaInjection: "file" | "flag" | "prompt";
|
|
210
|
-
/** 粗粒度引擎:GUI 显示降级为阶段态。 */
|
|
211
|
-
eventGranularity: "stream" | "coarse";
|
|
212
|
-
/** emulated = worktree 隔离(无 OS sandbox 的引擎用文件写维度隔离补齐)。 */
|
|
213
|
-
sandbox: "native" | "emulated" | "none";
|
|
214
|
-
/** 重建历史的能力(read 降级链第①级保真度上限)。 */
|
|
215
|
-
sessionRead: "full" | "partial" | "outcome-only";
|
|
216
|
-
resume: "native" | "cold" | "unsupported";
|
|
217
|
-
/** 优雅中断 or 只能杀进程(公共杀链兜底)。 */
|
|
218
|
-
interrupt: "native" | "kill-only";
|
|
219
|
-
/** kimi headless 固定 auto = ignored;GUI 据此隐藏/提示。 */
|
|
220
|
-
permissionMode: "native" | "fixed" | "ignored";
|
|
221
|
-
/** maxTurns 轮数上限执行能力位(pi=true / zcode=false)。 */
|
|
222
|
-
maxTurns: boolean;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/** 引擎探针报告(probe 应答)。ok=false 时 error 必填(恢复指引)。 */
|
|
226
|
-
export interface ProbeReport {
|
|
227
|
-
ok: boolean;
|
|
228
|
-
/** 实测版本(探测不到时为空串)。 */
|
|
229
|
-
engineVersion: string;
|
|
230
|
-
/** 二进制存在/版本解析/干跑回归逐项。 */
|
|
231
|
-
checks: Array<{ name: string; ok: boolean; detail?: string }>;
|
|
232
|
-
/** engine_probe_failed 的恢复指引(ok=false 时必填)。 */
|
|
233
|
-
error?: { code: string; recovery: string };
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
// ============================================================
|
|
237
|
-
// 终态 / 任务声明
|
|
238
|
-
// ============================================================
|
|
239
|
-
|
|
240
|
-
/** 失败分诊结构化标签。unknown(含缺省)= 可重试(语义守恒)。 */
|
|
241
|
-
export type AgentFailureKind = "stale_context" | "schema_deterministic" | "unknown";
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* AgentOutcome.usage 字段型(← core orchestration/models/types.ts AgentUsage 结构等价;
|
|
245
|
-
* SDK 改名消歧——core 的两个同名 AgentUsage 分属 execution 与 orchestration 域)。
|
|
246
|
-
*/
|
|
247
|
-
export interface AgentOutcomeUsage {
|
|
248
|
-
input: number;
|
|
249
|
-
output: number;
|
|
250
|
-
cacheRead: number;
|
|
251
|
-
cacheWrite: number;
|
|
252
|
-
cost: number;
|
|
253
|
-
contextTokens: number;
|
|
254
|
-
turns: number;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
|
-
/** 单次 tool 调用记录(workflow trace 形态)。 */
|
|
258
|
-
export interface ToolCallEntry {
|
|
259
|
-
/** Tool name. */
|
|
260
|
-
name: string;
|
|
261
|
-
/** Args preview string. */
|
|
262
|
-
input: string;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
/** worktree 句柄(结构等价副本;core 权威定义在 execution/assembly/types.ts:349)。 */
|
|
266
|
-
export interface WorktreeHandle {
|
|
267
|
-
/** checkout 目录(子 agent 工作目录)。 */
|
|
268
|
-
readonly path: string;
|
|
269
|
-
readonly branch: string;
|
|
270
|
-
readonly baseCommit: string;
|
|
271
|
-
/** 主仓库根目录(cleanup/scan 需要)。 */
|
|
272
|
-
readonly mainCwd: string;
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
/**
|
|
276
|
-
* 一次引擎执行的终态(协议 run 终态应答的 outcome 载荷)。锚定 core
|
|
277
|
-
* orchestration AgentResult 并追加引擎层字段(engineId / engineFallback / exitCode)。
|
|
278
|
-
*/
|
|
279
|
-
export interface AgentOutcome {
|
|
280
|
-
content: string;
|
|
281
|
-
/** 失败分诊标签。产出侧 = 引擎;缺省 = unknown = 可重试。 */
|
|
282
|
-
failureKind?: AgentFailureKind;
|
|
283
|
-
/** native 引擎直传 / 仿真层 ajv 产出(D4 硬分流:native 路径宿主不做二次校验)。 */
|
|
284
|
-
parsedOutput?: unknown;
|
|
285
|
-
usage?: AgentOutcomeUsage;
|
|
286
|
-
durationMs?: number;
|
|
287
|
-
/** 错误码前缀格式(`<code>: <detail>`,错误规格见协议 error-codes)。 */
|
|
288
|
-
error?: string;
|
|
289
|
-
/** 引擎语义 session id。 */
|
|
290
|
-
sessionId?: string;
|
|
291
|
-
sessionFile?: string;
|
|
292
|
-
/** 仅诊断——目录可能已被 finalize 清理,不得作为 cwd 复用。 */
|
|
293
|
-
worktreePath?: string;
|
|
294
|
-
toolCalls?: ToolCallEntry[];
|
|
295
|
-
/** 实际执行引擎(fallback 后可能 ≠ 请求值)。 */
|
|
296
|
-
engineId: string;
|
|
297
|
-
/** fallback 留痕(record 同步投影,GUI 警告条数据源)。 */
|
|
298
|
-
engineFallback?: { from: string; reason: string };
|
|
299
|
-
/** null = 被信号杀死(杀链/abort 合成终态的判据)。 */
|
|
300
|
-
exitCode?: number | null;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
// ============================================================
|
|
304
|
-
// AgentCallOpts 引擎面子集(协议 run.params.task)
|
|
305
|
-
// ============================================================
|
|
306
|
-
|
|
307
|
-
/**
|
|
308
|
-
* 引擎模型目录条目(manifest `modelCatalog.models` 条目形态,设计 §3.4 示例)。
|
|
309
|
-
* 协议面 = initialize 应答 models? 与 listModels 应答 models 的元素型;
|
|
310
|
-
* manifest 解析与生成(gen:model-catalog)归 W4/W5 实装。
|
|
311
|
-
*/
|
|
312
|
-
export interface ModelCatalogEntry {
|
|
313
|
-
id: string;
|
|
314
|
-
aliases?: string[];
|
|
315
|
-
canonicalRef?: string;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
/**
|
|
319
|
-
* 单次 agent 调用的任务声明——引擎面子集(协议 run.params.task;core 全量
|
|
320
|
-
* AgentCallOpts 22 字段留 core,core 侧反向 re-export 保消费面)。
|
|
321
|
-
*
|
|
322
|
-
* 字段裁决(对照 core orchestration/models/types.ts AgentCallOpts,2026-09-09):
|
|
323
|
-
* - 入选 = 引擎消费面:任务语义(prompt/schema/thinkingLevel/skill/skillPath/agent/persona 注入)、
|
|
324
|
-
* 轮次预算(maxTurns/graceTurns/conversation/idleTimeoutMs)、隔离与权限(worktree/
|
|
325
|
-
* fork/forkSource/denyTools/permissionMode)、诊断(description/scene);
|
|
326
|
-
* - 排除并改挂 run.params.ctx(协议层已单列,task 内双写会分叉):model(→ctx.model)、
|
|
327
|
-
* schemaEnv(→ctx.schemaEnv)、cwd(→ctx.cwd)、engineFallback(→ctx.engineFallback);
|
|
328
|
-
* - 排除(宿主侧消费,无引擎语义):engine(路由决策已完成,收到的引擎即选中值)、
|
|
329
|
-
* timeoutMs(宿主超时链 mergeTimeoutSignal → cancel 帧,非引擎参数)、returnMeta
|
|
330
|
-
* (core 注释明确「dropped at the pi boundary」,非引擎消费)。
|
|
331
|
-
*
|
|
332
|
-
* W2 实装 EngineClient run 帧时以本类型为 params.task;core 侧全量 → 子集的方向性
|
|
333
|
-
* 收窄(多余字段宿主自持不透传)不构成类型漂移(断言方向见 contract-closure 测试样板)。
|
|
334
|
-
*/
|
|
335
|
-
export interface AgentCallOpts {
|
|
336
|
-
/** The task prompt to send to the agent. */
|
|
337
|
-
prompt: string;
|
|
338
|
-
/** Optional JSON schema for structured output(引擎按 capabilities.schemaEnforcement 分流)。 */
|
|
339
|
-
schema?: Record<string, unknown>;
|
|
340
|
-
/** Thinking level override("high" | "medium" | "low" 等引擎自解释词表)。 */
|
|
341
|
-
thinkingLevel?: string;
|
|
342
|
-
/** Scene name passed through for model-selection hints. */
|
|
343
|
-
scene?: string;
|
|
344
|
-
/** Turn 上限(turn limiter)。未传或 <=0 = 不限。 */
|
|
345
|
-
maxTurns?: number;
|
|
346
|
-
/** Turn limiter 宽限轮数:超 maxTurns 后允许继续的轮数。 */
|
|
347
|
-
graceTurns?: number;
|
|
348
|
-
/** Skill name to load(引擎解析为 SKILL.md 注入)。 */
|
|
349
|
-
skill?: string;
|
|
350
|
-
/** Resolved absolute path to the skill directory or SKILL.md file. */
|
|
351
|
-
skillPath?: string;
|
|
352
|
-
/** Human-readable description for logging and debugging(slug 源字段)。 */
|
|
353
|
-
description?: string;
|
|
354
|
-
/** Agent ref (absolute .md path)——身份解析锚点。 */
|
|
355
|
-
agent?: string;
|
|
356
|
-
/** System prompt injection CONTENT(非文件路径)。 */
|
|
357
|
-
appendSystemPrompt?: string[];
|
|
358
|
-
/** Inherit parent session context (fork mode)。与 worktree(文件隔离)独立。 */
|
|
359
|
-
fork?: boolean;
|
|
360
|
-
/**
|
|
361
|
-
* [v1.x 增量] fork-from 显式分叉源 session 文件绝对路径(断联 subagent 接续场景,
|
|
362
|
-
* 宿主点名任意已有 session 文件;fork=true 则由引擎用主 session 作源,两者互斥——
|
|
363
|
-
* 本字段存在时优先)。字段名对齐引擎侧既有 SpawnRunParams.forkSource(pi 引擎经
|
|
364
|
-
* `--fork <path>` 消费)。可选增量、负向兼容:无此概念的引擎(zcode)按未知可选
|
|
365
|
-
* 字段忽略,行为与不传一致;宿主能力门(capability-gate)仍按 steer/conversation
|
|
366
|
-
* 通道族预检,不依赖引擎对本字段的支持声明。
|
|
367
|
-
*/
|
|
368
|
-
forkSource?: string;
|
|
369
|
-
/** Filesystem isolation: 新建 worktree | 复用外部已创建 worktree | 不隔离。 */
|
|
370
|
-
worktree?: boolean | WorktreeHandle;
|
|
371
|
-
/** 可持续对话模式:true = 轮次完成进 idle 态等待 message 续聊。 */
|
|
372
|
-
conversation?: boolean;
|
|
373
|
-
/** 空闲超时毫秒数(仅 conversation 模式有意义)。显式 0/负 = 禁用 idle GC。 */
|
|
374
|
-
idleTimeoutMs?: number;
|
|
375
|
-
/** 工具 denylist(各引擎做语法映射)。 */
|
|
376
|
-
denyTools?: string[];
|
|
377
|
-
/** 中立权限模式(映射按各引擎 capabilities.permissionMode)。 */
|
|
378
|
-
permissionMode?: string;
|
|
379
|
-
}
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
// src/protocol/engine-protocol.ts
|
|
2
|
-
//
|
|
3
|
-
// 引擎协议 v1 版本常量与协商(W1 契约根)。设计权威源:
|
|
4
|
-
// docs/architecture/subagent-engine-protocolization.md §3.3 + impl-plan §2.1。
|
|
5
|
-
//
|
|
6
|
-
// 传输 = stdio NDJSON(每行一个 JSON 对象)。stdout 独占协议帧;stderr 常驻排空
|
|
7
|
-
// (内存环形缓冲尾 400 字符,崩溃现场由 engine_crashed 携带,宿主侧不落盘)。
|
|
8
|
-
//
|
|
9
|
-
// 版本协商:ENGINE_PROTOCOL_VERSION = 1;core 支持 >=1 <2;越界 →
|
|
10
|
-
// engine_protocol_mismatch(含双方版本 + 升级指引),该引擎标记不可用,
|
|
11
|
-
// 不影响其他引擎与宿主。
|
|
12
|
-
//
|
|
13
|
-
// [v1.x 增量语义(chat-domain 设计 §3.2 D1-A/§3.3)][H1 后历史叙述——run.params.chat
|
|
14
|
-
// 已随 U6 删除,现唯一会话形态键 = run.params.resume]:chat 域增量(原 run.params.chat
|
|
15
|
-
// 可选参数、host/streamDelta 的 recordId 关联形态)曾以**可选载荷/可选参数**形态向后
|
|
16
|
-
// 兼容,major 不 bump、不引入 minor 协商位:
|
|
17
|
-
// - 新 core × 旧引擎:conversation 请求(resume 续聊形态)被 conversation gate
|
|
18
|
-
// 同步拒(manifest 无 gate 位,
|
|
19
|
-
// A6 方向——engine_capability_unsupported + 升级引擎包指引);run 域零影响;
|
|
20
|
-
// 事件变体增量同政策(例:activity 活性信号变体):新变体以可选载荷形态进
|
|
21
|
-
// union,旧宿主 runtime 对其 no-op(reducer default 分支安全落空 / journal
|
|
22
|
-
// 豁免面不感知),协议版本维持 1、不 bump。
|
|
23
|
-
//
|
|
24
|
-
// [H1 双键过渡(chat-run 统一,docs/architecture/subagent-chat-run-unification.md §3.3
|
|
25
|
-
// D3 + §5 U1 行)][H1 U6 已切换]:run.params.resume 曾与原 run.params.chat 载荷
|
|
26
|
-
// 同形并存(additive 可选,协议版本维持 1);U1 只加键——U2-U5 过渡期 core 恒
|
|
27
|
-
// 构造旧 `chat` 键、pi 引擎恒读 `ctx.chat`。U6 已单批同时切换写端(core 构造
|
|
28
|
-
// resume)与读端(pi 改读)并删 `chat` 键,resume 现为唯一会话形态键——全程不存在
|
|
29
|
-
// 「写新读旧」窗口(错配 = resume 静默失效、每轮新文件、sessionFile 被覆盖)。
|
|
30
|
-
// 同批退役已落地:轮次相位反向通道与 interact 方法已随 U5 删除(D5——续聊轮统一
|
|
31
|
-
// 为新 run + resume 锚点,轮次终态由 run 应答承载)。
|
|
32
|
-
|
|
33
|
-
/** 协议版本(引擎包 manifest `xyz-agent.subagentEngine.protocol` 与 initialize 应答同值)。 */
|
|
34
|
-
export const ENGINE_PROTOCOL_VERSION = 1;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* core 侧支持的协议版本区间(半开区间 [min, max)):当前 = [1, 2)。
|
|
38
|
-
* 引擎版本落在区间外 → engine_protocol_mismatch。
|
|
39
|
-
*/
|
|
40
|
-
export const SUPPORTED_PROTOCOL_RANGE = { min: 1, max: 2 } as const;
|
|
41
|
-
|
|
42
|
-
/** 版本兼容判定(core 握手判据;引擎侧对称用于拒绝过旧/过新宿主)。 */
|
|
43
|
-
export function isProtocolVersionCompatible(version: number): boolean {
|
|
44
|
-
return (
|
|
45
|
-
Number.isInteger(version) &&
|
|
46
|
-
version >= SUPPORTED_PROTOCOL_RANGE.min &&
|
|
47
|
-
version < SUPPORTED_PROTOCOL_RANGE.max
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// ============================================================
|
|
52
|
-
// 量级常量(impl-plan §2.1 逐项写死,双侧同源)
|
|
53
|
-
// ============================================================
|
|
54
|
-
|
|
55
|
-
/** 正向数据面反向请求(帧④数据面类)未应答容忍时长:10s 未答 = 引擎故障 → 杀进程 + 在途 run 失败。 */
|
|
56
|
-
export const REVERSE_REQUEST_TIMEOUT_MS = 10_000;
|
|
57
|
-
|
|
58
|
-
/** initialize 握手超时(ms):超时 → engine_handshake_timeout,该引擎不可用。 */
|
|
59
|
-
export const HANDSHAKE_TIMEOUT_MS = 10_000;
|
|
60
|
-
|
|
61
|
-
/** cancel 后引擎收敛终态的窗口(ms);超时 core 走杀链。 */
|
|
62
|
-
export const CANCEL_SETTLE_GRACE_MS = 3_000;
|
|
63
|
-
|
|
64
|
-
/** engine_crashed 后重建上限与指数退避序列(ms):1s / 2s / 4s,超限标记不可用至宿主重启。 */
|
|
65
|
-
export const CRASH_REBUILD_MAX_ATTEMPTS = 3;
|
|
66
|
-
// 逐档具名(impl-plan §2.1 写死 1s/2s/4s;数组字面量元素会触发 no-magic-numbers,
|
|
67
|
-
// 且具名档位与 core kill-chain 的 MS_PER_SECOND 私有具名常量惯例同型)。
|
|
68
|
-
const CRASH_REBUILD_BACKOFF_STEP_1_MS = 1_000;
|
|
69
|
-
const CRASH_REBUILD_BACKOFF_STEP_2_MS = 2_000;
|
|
70
|
-
const CRASH_REBUILD_BACKOFF_STEP_3_MS = 4_000;
|
|
71
|
-
export const CRASH_REBUILD_BACKOFF_MS = [
|
|
72
|
-
CRASH_REBUILD_BACKOFF_STEP_1_MS,
|
|
73
|
-
CRASH_REBUILD_BACKOFF_STEP_2_MS,
|
|
74
|
-
CRASH_REBUILD_BACKOFF_STEP_3_MS,
|
|
75
|
-
] as const;
|
|
76
|
-
|
|
77
|
-
/** stderr 内存环形缓冲保留的尾部字符数(engine_crashed 帧携带崩溃现场)。 */
|
|
78
|
-
export const STDERR_TAIL_CHARS = 400;
|
|
79
|
-
|
|
80
|
-
/** 事件合并开关 env 名(设计级默认关闭 = 值 "0";A1 要求事件逐字段等价,合并不可开)。 */
|
|
81
|
-
export const ENGINE_EVENT_COALESCE_ENV = "XYZ_ENGINE_EVENT_COALESCE";
|
|
82
|
-
export const ENGINE_EVENT_COALESCE_DEFAULT = "0";
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* 反向请求超时二分(帧④注释,R9-2):
|
|
86
|
-
* - 数据面类(host/log / host/streamDelta / host/handleReady /
|
|
87
|
-
* host/childSpawned / host/childStateChanged):10s 未答 = 引擎故障;
|
|
88
|
-
* - 人机交互类(host/askUser):不设统一超时——core 先回 {ack:true},
|
|
89
|
-
* 结果异步到达;按 ADR-0047「静默 ≠ 卡死」用无进展检测/用户取消,不据此判引擎故障。
|
|
90
|
-
*/
|
|
91
|
-
export type ReverseRequestTimeoutClass = "data-plane" | "interaction";
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
// src/protocol/error-codes.ts
|
|
2
|
-
//
|
|
3
|
-
// 协议错误码表(impl-plan §2.1「错误码表」逐项)+ 结构化错误载体 + kill-chain 消费的
|
|
4
|
-
// 具名错误文案构造器(自 core execution/engine/common/errors.ts 迁入 SDK 的引擎面
|
|
5
|
-
// 子集;core 侧错误 SSOT 留守,双侧错误码词表由测试互证)。
|
|
6
|
-
//
|
|
7
|
-
// 错误码语义与 core 侧处置(设计 §3.3 错误码表):
|
|
8
|
-
// engine_not_found 配置/清单里的 id 无对应包 → 列出已发现引擎 + 配置路径
|
|
9
|
-
// engine_protocol_mismatch 握手版本越界 → 该引擎不可用;升级 core 或引擎包
|
|
10
|
-
// engine_capability_unsupported core 的 gate 同步拦(manifest 少声明被 gate 四类之一)
|
|
11
|
-
// ——core 生成,不属「引擎 error 帧透传」
|
|
12
|
-
// engine_capability_mismatch manifest 声明 ≠ 握手能力位(被 gate 位多声明 → run 失败
|
|
13
|
-
// + 清理前置副作用;非 gate 位不一致 → 仅 warn)
|
|
14
|
-
// engine_model_unknown validateModel 未命中且 dynamic=false → 同步拒(record 不创建)
|
|
15
|
-
// engine_model_mismatch dynamic=true 运行期引擎拒绝 → run 失败 + record 标 failed
|
|
16
|
-
// engine_handshake_timeout initialize 超时(HANDSHAKE_TIMEOUT_MS=10s)→ 引擎不可用
|
|
17
|
-
// engine_crashed 进程意外退出 → 在途 run 失败(附 stderr 尾
|
|
18
|
-
// STDERR_TAIL_CHARS=400 字符);重建最多 3 次退避 1s/2s/4s
|
|
19
|
-
// engine_probe_failed probe 失败 → 既有 fallback 三守卫不变
|
|
20
|
-
// 其余 engine_* 引擎在 error 帧原样给出 → core 透传,文案契约不变
|
|
21
|
-
|
|
22
|
-
/** 协议核心错误码(引擎 error 帧 + core 同步拦截共用的固定词表)。 */
|
|
23
|
-
export const ENGINE_PROTOCOL_ERROR_CODES = [
|
|
24
|
-
"engine_not_found",
|
|
25
|
-
"engine_protocol_mismatch",
|
|
26
|
-
"engine_capability_unsupported",
|
|
27
|
-
"engine_capability_mismatch",
|
|
28
|
-
"engine_model_unknown",
|
|
29
|
-
"engine_model_mismatch",
|
|
30
|
-
"engine_handshake_timeout",
|
|
31
|
-
"engine_crashed",
|
|
32
|
-
"engine_probe_failed",
|
|
33
|
-
] as const;
|
|
34
|
-
|
|
35
|
-
export type EngineProtocolErrorCode = (typeof ENGINE_PROTOCOL_ERROR_CODES)[number];
|
|
36
|
-
|
|
37
|
-
/** unknown → 协议错误码收窄(外部输入携带错误码时的运行时 guard;其余 engine_* 走透传)。 */
|
|
38
|
-
export function isEngineProtocolErrorCode(value: unknown): value is EngineProtocolErrorCode {
|
|
39
|
-
return (
|
|
40
|
-
typeof value === "string" &&
|
|
41
|
-
(ENGINE_PROTOCOL_ERROR_CODES as readonly string[]).includes(value)
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
/** 其余引擎自报错误码的前缀契约(透传面;core 不解释文案)。 */
|
|
46
|
-
export const ENGINE_ERROR_CODE_PREFIX = "engine_";
|
|
47
|
-
|
|
48
|
-
export function isEngineErrorPassthroughCode(value: string): boolean {
|
|
49
|
-
return (
|
|
50
|
-
!isEngineProtocolErrorCode(value) && value.startsWith(ENGINE_ERROR_CODE_PREFIX)
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// ============================================================
|
|
55
|
-
// 结构化错误载体(协议 ProtocolError 的 TS 异常形态)
|
|
56
|
-
// ============================================================
|
|
57
|
-
|
|
58
|
-
import type { ProtocolError } from "./frames.ts";
|
|
59
|
-
import { SUPPORTED_PROTOCOL_RANGE } from "./engine-protocol.ts";
|
|
60
|
-
import type { EngineCapabilities } from "./contract-types.ts";
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* 结构化引擎错误(message 恒为 `<code>: <detail>` 前缀格式——AgentOutcome.error 与
|
|
64
|
-
* 协议 error 帧共用的错误码前缀约定);recovery 指向恢复动作。
|
|
65
|
-
* toStructured() 产出即协议 ProtocolError 形态(error 帧载荷直用)。
|
|
66
|
-
*/
|
|
67
|
-
export class EngineSdkError extends Error {
|
|
68
|
-
readonly code: string;
|
|
69
|
-
readonly recovery: string;
|
|
70
|
-
readonly data?: Record<string, unknown>;
|
|
71
|
-
|
|
72
|
-
constructor(code: string, detail: string, recovery: string, data?: Record<string, unknown>) {
|
|
73
|
-
super(`${code}: ${detail}`);
|
|
74
|
-
this.name = "EngineSdkError";
|
|
75
|
-
this.code = code;
|
|
76
|
-
this.recovery = recovery;
|
|
77
|
-
this.data = data;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/** 协议 error 帧载荷投影。 */
|
|
81
|
-
toStructured(): ProtocolError {
|
|
82
|
-
return { code: this.code, message: this.message, recovery: this.recovery, data: this.data };
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// ============================================================
|
|
87
|
-
// engine_protocol_mismatch 具名构造器(版本协商失败:含双方版本 + 升级指引)
|
|
88
|
-
// ============================================================
|
|
89
|
-
|
|
90
|
-
export function engineProtocolMismatchError(engineVersion: number): EngineSdkError {
|
|
91
|
-
return new EngineSdkError(
|
|
92
|
-
"engine_protocol_mismatch",
|
|
93
|
-
`engine speaks protocol v${engineVersion}, host supports [${SUPPORTED_PROTOCOL_RANGE.min}, ${SUPPORTED_PROTOCOL_RANGE.max})`,
|
|
94
|
-
"Upgrade the engine package (or the host) so both sides speak a protocol version in the supported range, then re-run the task. The engine is marked unavailable until then.",
|
|
95
|
-
{
|
|
96
|
-
engineProtocolVersion: engineVersion,
|
|
97
|
-
supportedMin: SUPPORTED_PROTOCOL_RANGE.min,
|
|
98
|
-
supportedMaxExclusive: SUPPORTED_PROTOCOL_RANGE.max,
|
|
99
|
-
},
|
|
100
|
-
);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// ============================================================
|
|
104
|
-
// [v1.x] conversation gate 位负向:conversation 请求(resume 续聊会话形态)同步拒
|
|
105
|
-
// ============================================================
|
|
106
|
-
|
|
107
|
-
/**
|
|
108
|
-
* [v1.x] resume 会话形态(run.params.resume)的 gate 拒绝具名错误(chat-domain
|
|
109
|
-
* 设计 §3.2 D1-A + 验收 A6:manifest 无 conversation gate 位的引擎收到
|
|
110
|
-
* conversation 请求 → 同步拒;[H1] 文案随 D5 语义收窄——续聊 = resume 续聊)。
|
|
111
|
-
* 文案契约对齐 core capability-gate.ts conversation 分支(错误码
|
|
112
|
-
* engine_capability_unsupported + 「去掉参数 / 修 manifest / 升级引擎包」恢复指引)
|
|
113
|
-
* ——W3 chat 路由切协议客户端时以本构造器替换 core 内联文案,保持两侧一致。
|
|
114
|
-
*/
|
|
115
|
-
export function engineConversationUnsupportedError(engineId: string): EngineSdkError {
|
|
116
|
-
return new EngineSdkError(
|
|
117
|
-
"engine_capability_unsupported",
|
|
118
|
-
`engine '${engineId}' 不支持 resume 续聊(capabilities.conversation = 'unsupported',` +
|
|
119
|
-
`manifest 无 conversation gate 位)`,
|
|
120
|
-
`去掉 conversation 参数(一次性任务默认形态),或修 manifest capabilities / 升级引擎包(若引擎实际支持该能力)`,
|
|
121
|
-
{ engineId, capability: "conversation", declared: "unsupported" },
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
/**
|
|
126
|
-
* [v1.x] resume 会话形态(run.params.resume / task.conversation=true)派发前的同步 gate:
|
|
127
|
-
* manifest conversation 位 unsupported 即抛 engineConversationUnsupportedError——
|
|
128
|
-
* 进程/record 创建前同步拒(A6:run 域不受影响,仅 chat 面被拦)。
|
|
129
|
-
* 判据单源:core 侧 capability-gate.assertTaskShapeSupported 的 conversation 分支
|
|
130
|
-
* 覆盖同一能力位,协议客户端路径(W3 接线)消费本函数,防两处判据漂移。
|
|
131
|
-
*/
|
|
132
|
-
export function assertChatConversationSupported(
|
|
133
|
-
engineId: string,
|
|
134
|
-
capabilities: Pick<EngineCapabilities, "conversation">,
|
|
135
|
-
): void {
|
|
136
|
-
if (capabilities.conversation === "unsupported") {
|
|
137
|
-
throw engineConversationUnsupportedError(engineId);
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
// ============================================================
|
|
142
|
-
// kill-chain 消费的引擎面错误文案(自 core errors.ts 迁入,逐字等价)
|
|
143
|
-
// ============================================================
|
|
144
|
-
|
|
145
|
-
/** 错误回显长度上限(截断长输出,避免错误消息爆炸)。 */
|
|
146
|
-
const DETAIL_ECHO_MAX_CHARS = 200;
|
|
147
|
-
|
|
148
|
-
/** stdout 尾部回显上限(engine_timeout / engine_run_failed 的错误规格载体系数)。 */
|
|
149
|
-
export const STDOUT_TAIL_ECHO_CHARS = 2000;
|
|
150
|
-
|
|
151
|
-
function truncate(text: string, max: number): string {
|
|
152
|
-
return text.length <= max ? text : `${text.slice(0, max)}...`;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/** engine_timeout 的恢复指引(kill-chain 超时杀链收尾文案)。 */
|
|
156
|
-
export const ENGINE_TIMEOUT_RECOVERY =
|
|
157
|
-
"The engine was killed by the host timeout chain. Inspect the captured stdout tail, then re-run with a larger " +
|
|
158
|
-
"timeout, a narrower task, or `engine: pi`.";
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* engine_timeout 的 outcome.error 文案:含 stdout 尾部 2000 字 + 恢复指引
|
|
162
|
-
* (kill-chain synthesizeTimeoutOutcome 消费;与 core errors.ts engineTimeoutDetail 逐字等价)。
|
|
163
|
-
*/
|
|
164
|
-
export function engineTimeoutDetail(stdoutTail: string): string {
|
|
165
|
-
return (
|
|
166
|
-
`host timeout chain exhausted (SIGTERM -> grace -> SIGKILL). ` +
|
|
167
|
-
`Stdout tail (last ${STDOUT_TAIL_ECHO_CHARS} chars): ${truncate(stdoutTail, STDOUT_TAIL_ECHO_CHARS)}. ` +
|
|
168
|
-
`Recovery: ${ENGINE_TIMEOUT_RECOVERY}`
|
|
169
|
-
);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
/** schema_emulation_failed 的终报文案(宿主编排层「重试一次仍失败」后消费)。 */
|
|
173
|
-
export function schemaEmulationFailedDetail(error: string, tail: string): string {
|
|
174
|
-
return (
|
|
175
|
-
`structured output emulation failed after tolerant extraction and one host-side retry: ${error}. ` +
|
|
176
|
-
`Raw output tail: ${truncate(tail, DETAIL_ECHO_MAX_CHARS)}. ` +
|
|
177
|
-
`Recovery: retry with a strengthened prompt or relax the schema; if it still fails switch to a ` +
|
|
178
|
-
`schema-native engine (engine: pi).`
|
|
179
|
-
);
|
|
180
|
-
}
|