@zhushanwen/subagent-engine-sdk 0.2.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.cjs +88 -0
- package/dist/best-effort.d.cts +14 -0
- package/dist/best-effort.d.ts +14 -0
- package/dist/best-effort.js +8 -0
- package/dist/chunk-2DIMPZCQ.js +0 -0
- package/dist/chunk-365AUV6N.js +67 -0
- package/dist/chunk-3K2P2CM2.js +127 -0
- package/dist/chunk-75QEMUGV.js +58 -0
- package/dist/chunk-7I4XGL5J.js +95 -0
- package/dist/chunk-A75XDJIC.js +227 -0
- package/dist/chunk-DSQ7JQKM.js +39 -0
- package/dist/chunk-EJMF63R5.js +19 -0
- package/dist/chunk-GT6YLLN4.js +46 -0
- package/dist/chunk-HYES77BR.js +109 -0
- package/dist/chunk-JSBRDJBE.js +30 -0
- package/dist/chunk-LEOBWKRM.js +128 -0
- package/dist/chunk-N3RL6OVM.js +38 -0
- package/dist/chunk-OPMY4G4M.js +27 -0
- package/dist/chunk-PPEPBVCC.js +120 -0
- package/dist/chunk-PYO3YR7W.js +16 -0
- package/dist/chunk-RDH3ZOV6.js +46 -0
- package/dist/chunk-RULLX6C6.js +11 -0
- package/dist/chunk-X24SFZYW.js +6646 -0
- package/dist/chunk-YFSN3D5N.js +216 -0
- package/dist/chunk-ZOFFJNJD.js +136 -0
- package/dist/chunk-ZXEAW25V.js +132 -0
- package/dist/cli-entry.cjs +119 -0
- package/dist/cli-entry.d.cts +24 -0
- package/dist/cli-entry.d.ts +24 -0
- package/dist/cli-entry.js +8 -0
- package/dist/contract-types-sSlgppBC.d.cts +352 -0
- package/dist/contract-types-sSlgppBC.d.ts +352 -0
- package/dist/data-dir.cjs +117 -0
- package/dist/data-dir.d.cts +20 -0
- package/dist/data-dir.d.ts +20 -0
- package/dist/data-dir.js +12 -0
- package/dist/env.cjs +205 -0
- package/dist/env.d.cts +73 -0
- package/dist/env.d.ts +73 -0
- package/dist/env.js +16 -0
- package/dist/error-codes-DHco5-i_.d.cts +118 -0
- package/dist/error-codes-Dhss2Kmk.d.ts +118 -0
- package/dist/error-message.cjs +40 -0
- package/dist/error-message.d.cts +3 -0
- package/dist/error-message.d.ts +3 -0
- package/dist/error-message.js +7 -0
- package/dist/index.cjs +8375 -0
- package/dist/index.d.cts +23 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.js +268 -0
- package/dist/journal-io.cjs +70 -0
- package/dist/journal-io.d.cts +12 -0
- package/dist/journal-io.d.ts +12 -0
- package/dist/journal-io.js +7 -0
- package/dist/journal-replay.cjs +256 -0
- package/dist/journal-replay.d.cts +45 -0
- package/dist/journal-replay.d.ts +45 -0
- package/dist/journal-replay.js +17 -0
- package/dist/kill-chain.cjs +221 -0
- package/dist/kill-chain.d.cts +74 -0
- package/dist/kill-chain.d.ts +74 -0
- package/dist/kill-chain.js +23 -0
- package/dist/logger.cjs +84 -0
- package/dist/logger.d.cts +24 -0
- package/dist/logger.d.ts +24 -0
- package/dist/logger.js +11 -0
- package/dist/logs/stderr-rotation.cjs +151 -0
- package/dist/logs/stderr-rotation.d.cts +37 -0
- package/dist/logs/stderr-rotation.d.ts +37 -0
- package/dist/logs/stderr-rotation.js +23 -0
- package/dist/nesting-guard.cjs +95 -0
- package/dist/nesting-guard.d.cts +65 -0
- package/dist/nesting-guard.d.ts +65 -0
- package/dist/nesting-guard.js +15 -0
- package/dist/node-executor.cjs +180 -0
- package/dist/node-executor.d.cts +63 -0
- package/dist/node-executor.d.ts +63 -0
- package/dist/node-executor.js +16 -0
- package/dist/paths.cjs +55 -0
- package/dist/paths.d.cts +8 -0
- package/dist/paths.d.ts +8 -0
- package/dist/paths.js +15 -0
- package/dist/port-contract.cjs +35 -0
- package/dist/port-contract.d.cts +88 -0
- package/dist/port-contract.d.ts +88 -0
- package/dist/port-contract.js +7 -0
- package/dist/protocol/index.cjs +400 -0
- package/dist/protocol/index.d.cts +685 -0
- package/dist/protocol/index.d.ts +685 -0
- package/dist/protocol/index.js +89 -0
- package/dist/relay-env.cjs +71 -0
- package/dist/relay-env.d.cts +37 -0
- package/dist/relay-env.d.ts +37 -0
- package/dist/relay-env.js +23 -0
- package/dist/schema-emulation.cjs +6680 -0
- package/dist/schema-emulation.d.cts +39 -0
- package/dist/schema-emulation.d.ts +39 -0
- package/dist/schema-emulation.js +11 -0
- package/dist/spawn.cjs +200 -0
- package/dist/spawn.d.cts +80 -0
- package/dist/spawn.d.ts +80 -0
- package/dist/spawn.js +16 -0
- package/dist/ui-channels.cjs +120 -0
- package/dist/ui-channels.d.cts +60 -0
- package/dist/ui-channels.d.ts +60 -0
- package/dist/ui-channels.js +9 -0
- package/dist/ui-types.cjs +18 -0
- package/dist/ui-types.d.cts +62 -0
- package/dist/ui-types.d.ts +62 -0
- package/dist/ui-types.js +1 -0
- package/package.json +58 -0
- package/src/best-effort.ts +37 -0
- package/src/cli-entry.ts +77 -0
- package/src/data-dir.ts +88 -0
- package/src/env.ts +265 -0
- package/src/error-message.ts +22 -0
- package/src/index.ts +63 -0
- package/src/journal-io.ts +82 -0
- package/src/journal-replay.ts +432 -0
- package/src/kill-chain.ts +265 -0
- package/src/logger.ts +105 -0
- package/src/logs/stderr-rotation.ts +166 -0
- package/src/nesting-guard.ts +140 -0
- package/src/node-executor.ts +272 -0
- package/src/paths.ts +48 -0
- package/src/port-contract.ts +117 -0
- package/src/protocol/contract-types.ts +378 -0
- package/src/protocol/engine-protocol.ts +81 -0
- package/src/protocol/error-codes.ts +179 -0
- package/src/protocol/frames.ts +145 -0
- package/src/protocol/index.ts +12 -0
- package/src/protocol/methods.ts +229 -0
- package/src/protocol/reverse-channels.ts +274 -0
- package/src/protocol/schema.ts +154 -0
- package/src/relay-env.ts +60 -0
- package/src/schema-emulation.ts +192 -0
- package/src/spawn.ts +246 -0
- package/src/ui-channels.ts +219 -0
- package/src/ui-types.ts +84 -0
|
@@ -0,0 +1,352 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 双向可赋值断言:`type _A = AssertMutuallyAssignable<CoreX, SdkX>` 结果必须为 true。
|
|
3
|
+
* 任一方向不可赋值(字段缺失 / 可选性漂移 / 联合分支不齐)结果为 never → 编译失败。
|
|
4
|
+
* 用法(core 侧 W2 挂靠):
|
|
5
|
+
* import type { AssertMutuallyAssignable } from "@zhushanwen/subagent-engine-sdk";
|
|
6
|
+
* type _CoreSdkAgentEvent = AssertMutuallyAssignable<CoreAgentEvent, SdkAgentEvent>;
|
|
7
|
+
* const _assert: _CoreSdkAgentEvent = true;
|
|
8
|
+
*/
|
|
9
|
+
type AssertMutuallyAssignable<A, B> = [A] extends [B] ? [B] extends [A] ? true : never : never;
|
|
10
|
+
/** token 用量(message_end 单条消息增量)。← core execution/types.ts AgentUsage。 */
|
|
11
|
+
interface AgentUsage {
|
|
12
|
+
input: number;
|
|
13
|
+
output: number;
|
|
14
|
+
cacheRead: number;
|
|
15
|
+
cacheWrite: number;
|
|
16
|
+
/** 本 message 的成本(USD)。无成本数据时缺省。 */
|
|
17
|
+
cost?: number;
|
|
18
|
+
}
|
|
19
|
+
interface AgentUsageTotal extends AgentUsage {
|
|
20
|
+
/** 四项之和。投影时不再手工求和。 */
|
|
21
|
+
total: number;
|
|
22
|
+
/** 累计成本(USD)。无成本数据时为 0。 */
|
|
23
|
+
cost: number;
|
|
24
|
+
}
|
|
25
|
+
/** tool 调用结果(tool_end 携带,含 structured-output 的 details)。 */
|
|
26
|
+
interface ToolCallResult {
|
|
27
|
+
content?: unknown[];
|
|
28
|
+
details?: unknown;
|
|
29
|
+
}
|
|
30
|
+
/** tool 调用(导出的纯净数据形状,不含内部状态机)。 */
|
|
31
|
+
interface ToolCall {
|
|
32
|
+
toolName: string;
|
|
33
|
+
args?: unknown;
|
|
34
|
+
result?: ToolCallResult;
|
|
35
|
+
isError?: boolean;
|
|
36
|
+
}
|
|
37
|
+
/** 内部 ToolCall:追加 _status 进行中标记与 startedTs(reducer 内部态,跨边界导出前 strip)。 */
|
|
38
|
+
interface InternalToolCall extends ToolCall {
|
|
39
|
+
_status: "running" | "done" | "failed";
|
|
40
|
+
/** tool_start 到达时的墙钟时间戳(Date.now(),ms)。 */
|
|
41
|
+
startedTs: number;
|
|
42
|
+
}
|
|
43
|
+
/** 一个 turn 的完整内容(reducer turns[] 的元素)。 */
|
|
44
|
+
interface Turn {
|
|
45
|
+
/** 本 turn assistant 正文(text_delta 流式累积,完整)。 */
|
|
46
|
+
text: string;
|
|
47
|
+
/** 本 turn 推理(thinking_delta 流式累积,完整)。 */
|
|
48
|
+
thinking: string;
|
|
49
|
+
/** 本 turn 工具调用(InternalToolCall:含完整 result + _status 进行中标记)。 */
|
|
50
|
+
toolCalls: InternalToolCall[];
|
|
51
|
+
/** 本 turn message_end 的 token 增量(聚合得 usage 总量)。 */
|
|
52
|
+
usageDelta?: AgentUsage;
|
|
53
|
+
/** turn_end 是否已到达。false=正在进行;true=已闭合。 */
|
|
54
|
+
closed: boolean;
|
|
55
|
+
/** turn_end 到达时的墙钟时间戳(Date.now(),ms)。 */
|
|
56
|
+
closedTs?: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* 引擎事件(8 种,协议 event.params.event 逐字序列化——「事件与 handle 序列化逐字
|
|
60
|
+
* 兼容」不变量 3 的类型面)。语义锚点 = pi(ACP 词汇对照见 core execution/types.ts 注释)。
|
|
61
|
+
*/
|
|
62
|
+
type AgentEvent = {
|
|
63
|
+
type: "tool_start";
|
|
64
|
+
toolName: string;
|
|
65
|
+
args?: unknown;
|
|
66
|
+
} | {
|
|
67
|
+
type: "tool_end";
|
|
68
|
+
toolName: string;
|
|
69
|
+
args?: unknown;
|
|
70
|
+
result?: ToolCallResult;
|
|
71
|
+
isError?: boolean;
|
|
72
|
+
} | {
|
|
73
|
+
type: "text_delta";
|
|
74
|
+
delta: string;
|
|
75
|
+
} | {
|
|
76
|
+
type: "thinking_delta";
|
|
77
|
+
delta: string;
|
|
78
|
+
} | {
|
|
79
|
+
type: "turn_end";
|
|
80
|
+
summary?: string;
|
|
81
|
+
} | {
|
|
82
|
+
type: "message_end";
|
|
83
|
+
usage?: AgentUsage;
|
|
84
|
+
error?: string;
|
|
85
|
+
} | {
|
|
86
|
+
type: "compaction";
|
|
87
|
+
} | {
|
|
88
|
+
type: "error";
|
|
89
|
+
message: string;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* EngineHandle 的持久化形态(JSON v1)。协议 run 终态应答 / interact / read 的
|
|
93
|
+
* handle 载荷(引擎不持有宿主运行时引用,data 即全部)。
|
|
94
|
+
*/
|
|
95
|
+
interface EngineHandleData {
|
|
96
|
+
v: 1;
|
|
97
|
+
/** 引擎 id('pi' | 'zcode' | ...)。 */
|
|
98
|
+
engineId: string;
|
|
99
|
+
/** 引擎自定义定位键值。pi = { recordId?, sessionFile? };zcode = { sessionId, dbPath }。 */
|
|
100
|
+
sessionRef: Record<string, string>;
|
|
101
|
+
/** 隔离池定位。pi 无池化恒 'shared'。 */
|
|
102
|
+
poolKey: string;
|
|
103
|
+
/** journal 绝对路径(read 第②级数据源;宿主读前校验前缀白名单)。缺省 = 无 journal。 */
|
|
104
|
+
journalPath?: string;
|
|
105
|
+
/** probe 实测版本(漂移排查锚点)。 */
|
|
106
|
+
engineVersion?: string;
|
|
107
|
+
/** 适配器版本(golden 样本对齐排查)。 */
|
|
108
|
+
adapterVersion: string;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* [v1.x] 冷续 resume 锚点——EngineHandleData 定位键的投影子集(诊断字段
|
|
112
|
+
* v/engineVersion/adapterVersion 不属锚点语义,不随锚点走)。两处消费:
|
|
113
|
+
* - run.params.chat.resume(宿主 → 引擎:冷续重开已 idle 的 session,pi 消费
|
|
114
|
+
* sessionRef.sessionFile —— 对照 core SpawnResumeOpts.sessionFile 的锚点面);
|
|
115
|
+
* - host/roundLifecycle 载荷 anchor(引擎 → 宿主:轮次终态时回填当前锚点,
|
|
116
|
+
* 宿主据此刷新冷续依据——pi 定位键形态同 EngineHandleData.sessionRef 注释)。
|
|
117
|
+
* 类型层与 EngineHandleData 定位形态的对照由测试断言(Pick 可赋值闭包)锁定。
|
|
118
|
+
*/
|
|
119
|
+
interface ResumeAnchor {
|
|
120
|
+
/** 引擎定位键(pi = { recordId?, sessionFile? };zcode = { sessionId, dbPath })。 */
|
|
121
|
+
sessionRef: Record<string, string>;
|
|
122
|
+
/** 隔离池定位(锚点补全 handle 重建所需;pi 无池化恒 'shared')。 */
|
|
123
|
+
poolKey: string;
|
|
124
|
+
/** journal 绝对路径(read 降级链第②级数据源;无 journal 缺省)。 */
|
|
125
|
+
journalPath?: string;
|
|
126
|
+
}
|
|
127
|
+
/** Turn → ReplayedTurn:剥离内部态(closed 恒 true——重放物无进行时语义)。 */
|
|
128
|
+
interface ReplayedTurn {
|
|
129
|
+
text: string;
|
|
130
|
+
thinking: string;
|
|
131
|
+
/** 导出的纯净形状(ToolCall,无 _status/startedTs)。 */
|
|
132
|
+
toolCalls: ToolCall[];
|
|
133
|
+
closed: true;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* session 历史的引擎中立视图(协议 read 应答)。降级链三级:①引擎原生读取 →
|
|
137
|
+
* ②宿主 event journal 重放 → ③outcome-only。source 字段是 GUI 降级标记数据源。
|
|
138
|
+
*/
|
|
139
|
+
interface SessionView {
|
|
140
|
+
engineId: string;
|
|
141
|
+
sessionId?: string;
|
|
142
|
+
/** turns[] 派生数据(重放/重建产物)。 */
|
|
143
|
+
turns: ReplayedTurn[];
|
|
144
|
+
/** 各 turn usageDelta 聚合。 */
|
|
145
|
+
usage?: AgentUsageTotal;
|
|
146
|
+
source: "native" | "journal" | "outcome-only";
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* 引擎能力声明(11 位)。三级:native / emulated / unsupported。
|
|
150
|
+
* 声明的是本仓 subagent 链路实际接通的能力,不是引擎 RPC 层的理论能力。
|
|
151
|
+
* 同步权威 = manifest(注册期直读);握手应答仅诊断(§3.3「同步成员清单」)。
|
|
152
|
+
*/
|
|
153
|
+
interface EngineCapabilities {
|
|
154
|
+
/** native: --json-schema/--output-schema/env 注入。 */
|
|
155
|
+
schemaEnforcement: "native" | "emulated";
|
|
156
|
+
/** 注意区分「引擎 RPC 层有此能力」与「subagent 链路已接通」。 */
|
|
157
|
+
steer: "native" | "emulated" | "unsupported";
|
|
158
|
+
/** interact 控制面(message/close/cancel + idle)。 */
|
|
159
|
+
conversation: "native" | "unsupported";
|
|
160
|
+
/** 决定 persona 路由策略(file/flag/prompt 通道)。 */
|
|
161
|
+
personaInjection: "file" | "flag" | "prompt";
|
|
162
|
+
/** 粗粒度引擎:GUI 显示降级为阶段态。 */
|
|
163
|
+
eventGranularity: "stream" | "coarse";
|
|
164
|
+
/** emulated = worktree 隔离(无 OS sandbox 的引擎用文件写维度隔离补齐)。 */
|
|
165
|
+
sandbox: "native" | "emulated" | "none";
|
|
166
|
+
/** 重建历史的能力(read 降级链第①级保真度上限)。 */
|
|
167
|
+
sessionRead: "full" | "partial" | "outcome-only";
|
|
168
|
+
resume: "native" | "cold" | "unsupported";
|
|
169
|
+
/** 优雅中断 or 只能杀进程(公共杀链兜底)。 */
|
|
170
|
+
interrupt: "native" | "kill-only";
|
|
171
|
+
/** kimi headless 固定 auto = ignored;GUI 据此隐藏/提示。 */
|
|
172
|
+
permissionMode: "native" | "fixed" | "ignored";
|
|
173
|
+
/** maxTurns 轮数上限执行能力位(pi=true / zcode=false)。 */
|
|
174
|
+
maxTurns: boolean;
|
|
175
|
+
}
|
|
176
|
+
/** 引擎探针报告(probe 应答)。ok=false 时 error 必填(恢复指引)。 */
|
|
177
|
+
interface ProbeReport {
|
|
178
|
+
ok: boolean;
|
|
179
|
+
/** 实测版本(探测不到时为空串)。 */
|
|
180
|
+
engineVersion: string;
|
|
181
|
+
/** 二进制存在/版本解析/干跑回归逐项。 */
|
|
182
|
+
checks: Array<{
|
|
183
|
+
name: string;
|
|
184
|
+
ok: boolean;
|
|
185
|
+
detail?: string;
|
|
186
|
+
}>;
|
|
187
|
+
/** engine_probe_failed 的恢复指引(ok=false 时必填)。 */
|
|
188
|
+
error?: {
|
|
189
|
+
code: string;
|
|
190
|
+
recovery: string;
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* interact 的 action(交互控制面)。interrupt: true = steer(抢占)/ false|缺省 =
|
|
195
|
+
* followUp(排队);不支持抢占的引擎忽略。
|
|
196
|
+
*/
|
|
197
|
+
type InteractAction = {
|
|
198
|
+
kind: "message";
|
|
199
|
+
payload: string;
|
|
200
|
+
interrupt?: boolean;
|
|
201
|
+
} | {
|
|
202
|
+
kind: "close";
|
|
203
|
+
payload?: {
|
|
204
|
+
force: boolean;
|
|
205
|
+
};
|
|
206
|
+
} | {
|
|
207
|
+
kind: "cancel";
|
|
208
|
+
};
|
|
209
|
+
/** interact 的结果(失败码 = engine_session_not_resumable / engine_capability_unsupported 等)。 */
|
|
210
|
+
type InteractResult = {
|
|
211
|
+
ok: true;
|
|
212
|
+
delivered: true;
|
|
213
|
+
} | {
|
|
214
|
+
ok: false;
|
|
215
|
+
code: string;
|
|
216
|
+
message: string;
|
|
217
|
+
};
|
|
218
|
+
/** 失败分诊结构化标签。unknown(含缺省)= 可重试(语义守恒)。 */
|
|
219
|
+
type AgentFailureKind = "stale_context" | "schema_deterministic" | "unknown";
|
|
220
|
+
/**
|
|
221
|
+
* AgentOutcome.usage 字段型(← core orchestration/models/types.ts AgentUsage 结构等价;
|
|
222
|
+
* SDK 改名消歧——core 的两个同名 AgentUsage 分属 execution 与 orchestration 域)。
|
|
223
|
+
*/
|
|
224
|
+
interface AgentOutcomeUsage {
|
|
225
|
+
input: number;
|
|
226
|
+
output: number;
|
|
227
|
+
cacheRead: number;
|
|
228
|
+
cacheWrite: number;
|
|
229
|
+
cost: number;
|
|
230
|
+
contextTokens: number;
|
|
231
|
+
turns: number;
|
|
232
|
+
}
|
|
233
|
+
/** 单次 tool 调用记录(workflow trace 形态)。 */
|
|
234
|
+
interface ToolCallEntry {
|
|
235
|
+
/** Tool name. */
|
|
236
|
+
name: string;
|
|
237
|
+
/** Args preview string. */
|
|
238
|
+
input: string;
|
|
239
|
+
}
|
|
240
|
+
/** worktree 句柄(结构等价副本;core 权威定义在 execution/types.ts:349)。 */
|
|
241
|
+
interface WorktreeHandle {
|
|
242
|
+
/** checkout 目录(子 agent 工作目录)。 */
|
|
243
|
+
readonly path: string;
|
|
244
|
+
readonly branch: string;
|
|
245
|
+
readonly baseCommit: string;
|
|
246
|
+
/** 主仓库根目录(cleanup/scan 需要)。 */
|
|
247
|
+
readonly mainCwd: string;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* 一次引擎执行的终态(协议 run 终态应答的 outcome 载荷)。锚定 core
|
|
251
|
+
* orchestration AgentResult 并追加引擎层字段(engineId / engineFallback / exitCode)。
|
|
252
|
+
*/
|
|
253
|
+
interface AgentOutcome {
|
|
254
|
+
content: string;
|
|
255
|
+
/** 失败分诊标签。产出侧 = 引擎;缺省 = unknown = 可重试。 */
|
|
256
|
+
failureKind?: AgentFailureKind;
|
|
257
|
+
/** native 引擎直传 / 仿真层 ajv 产出(D4 硬分流:native 路径宿主不做二次校验)。 */
|
|
258
|
+
parsedOutput?: unknown;
|
|
259
|
+
usage?: AgentOutcomeUsage;
|
|
260
|
+
durationMs?: number;
|
|
261
|
+
/** 错误码前缀格式(`<code>: <detail>`,错误规格见协议 error-codes)。 */
|
|
262
|
+
error?: string;
|
|
263
|
+
/** 引擎语义 session id。 */
|
|
264
|
+
sessionId?: string;
|
|
265
|
+
sessionFile?: string;
|
|
266
|
+
/** 仅诊断——目录可能已被 finalize 清理,不得作为 cwd 复用。 */
|
|
267
|
+
worktreePath?: string;
|
|
268
|
+
toolCalls?: ToolCallEntry[];
|
|
269
|
+
/** 实际执行引擎(fallback 后可能 ≠ 请求值)。 */
|
|
270
|
+
engineId: string;
|
|
271
|
+
/** fallback 留痕(record 同步投影,GUI 警告条数据源)。 */
|
|
272
|
+
engineFallback?: {
|
|
273
|
+
from: string;
|
|
274
|
+
reason: string;
|
|
275
|
+
};
|
|
276
|
+
/** null = 被信号杀死(杀链/abort 合成终态的判据)。 */
|
|
277
|
+
exitCode?: number | null;
|
|
278
|
+
}
|
|
279
|
+
/**
|
|
280
|
+
* 引擎模型目录条目(manifest `modelCatalog.models` 条目形态,设计 §3.4 示例)。
|
|
281
|
+
* 协议面 = initialize 应答 models? 与 listModels 应答 models 的元素型;
|
|
282
|
+
* manifest 解析与生成(gen:model-catalog)归 W4/W5 实装。
|
|
283
|
+
*/
|
|
284
|
+
interface ModelCatalogEntry {
|
|
285
|
+
id: string;
|
|
286
|
+
aliases?: string[];
|
|
287
|
+
canonicalRef?: string;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* 单次 agent 调用的任务声明——引擎面子集(协议 run.params.task;core 全量
|
|
291
|
+
* AgentCallOpts 22 字段留 core,core 侧反向 re-export 保消费面)。
|
|
292
|
+
*
|
|
293
|
+
* 字段裁决(对照 core orchestration/models/types.ts AgentCallOpts,2026-09-09):
|
|
294
|
+
* - 入选 = 引擎消费面:任务语义(prompt/schema/thinkingLevel/skill/skillPath/agent/persona 注入)、
|
|
295
|
+
* 轮次预算(maxTurns/graceTurns/conversation/idleTimeoutMs)、隔离与权限(worktree/
|
|
296
|
+
* fork/forkSource/denyTools/permissionMode)、诊断(description/scene);
|
|
297
|
+
* - 排除并改挂 run.params.ctx(协议层已单列,task 内双写会分叉):model(→ctx.model)、
|
|
298
|
+
* schemaEnv(→ctx.schemaEnv)、cwd(→ctx.cwd)、engineFallback(→ctx.engineFallback);
|
|
299
|
+
* - 排除(宿主侧消费,无引擎语义):engine(路由决策已完成,收到的引擎即选中值)、
|
|
300
|
+
* timeoutMs(宿主超时链 mergeTimeoutSignal → cancel 帧,非引擎参数)、returnMeta
|
|
301
|
+
* (core 注释明确「dropped at the pi boundary」,非引擎消费)。
|
|
302
|
+
*
|
|
303
|
+
* W2 实装 EngineClient run 帧时以本类型为 params.task;core 侧全量 → 子集的方向性
|
|
304
|
+
* 收窄(多余字段宿主自持不透传)不构成类型漂移(断言方向见 contract-closure 测试样板)。
|
|
305
|
+
*/
|
|
306
|
+
interface AgentCallOpts {
|
|
307
|
+
/** The task prompt to send to the agent. */
|
|
308
|
+
prompt: string;
|
|
309
|
+
/** Optional JSON schema for structured output(引擎按 capabilities.schemaEnforcement 分流)。 */
|
|
310
|
+
schema?: Record<string, unknown>;
|
|
311
|
+
/** Thinking level override("high" | "medium" | "low" 等引擎自解释词表)。 */
|
|
312
|
+
thinkingLevel?: string;
|
|
313
|
+
/** Scene name passed through for model-selection hints. */
|
|
314
|
+
scene?: string;
|
|
315
|
+
/** Turn 上限(turn limiter)。未传或 <=0 = 不限。 */
|
|
316
|
+
maxTurns?: number;
|
|
317
|
+
/** Turn limiter 宽限轮数:超 maxTurns 后允许继续的轮数。 */
|
|
318
|
+
graceTurns?: number;
|
|
319
|
+
/** Skill name to load(引擎解析为 SKILL.md 注入)。 */
|
|
320
|
+
skill?: string;
|
|
321
|
+
/** Resolved absolute path to the skill directory or SKILL.md file. */
|
|
322
|
+
skillPath?: string;
|
|
323
|
+
/** Human-readable description for logging and debugging(slug 源字段)。 */
|
|
324
|
+
description?: string;
|
|
325
|
+
/** Agent ref (absolute .md path)——身份解析锚点。 */
|
|
326
|
+
agent?: string;
|
|
327
|
+
/** System prompt injection CONTENT(非文件路径)。 */
|
|
328
|
+
appendSystemPrompt?: string[];
|
|
329
|
+
/** Inherit parent session context (fork mode)。与 worktree(文件隔离)独立。 */
|
|
330
|
+
fork?: boolean;
|
|
331
|
+
/**
|
|
332
|
+
* [v1.x 增量] fork-from 显式分叉源 session 文件绝对路径(断联 subagent 接续场景,
|
|
333
|
+
* 宿主点名任意已有 session 文件;fork=true 则由引擎用主 session 作源,两者互斥——
|
|
334
|
+
* 本字段存在时优先)。字段名对齐引擎侧既有 SpawnRunParams.forkSource(pi 引擎经
|
|
335
|
+
* `--fork <path>` 消费)。可选增量、负向兼容:无此概念的引擎(zcode)按未知可选
|
|
336
|
+
* 字段忽略,行为与不传一致;宿主能力门(capability-gate)仍按 steer/conversation
|
|
337
|
+
* 通道族预检,不依赖引擎对本字段的支持声明。
|
|
338
|
+
*/
|
|
339
|
+
forkSource?: string;
|
|
340
|
+
/** Filesystem isolation: 新建 worktree | 复用外部已创建 worktree | 不隔离。 */
|
|
341
|
+
worktree?: boolean | WorktreeHandle;
|
|
342
|
+
/** 可持续对话模式:true = 轮次完成进 idle 态等待 message 续聊。 */
|
|
343
|
+
conversation?: boolean;
|
|
344
|
+
/** 空闲超时毫秒数(仅 conversation 模式有意义)。显式 0/负 = 禁用 idle GC。 */
|
|
345
|
+
idleTimeoutMs?: number;
|
|
346
|
+
/** 工具 denylist(各引擎做语法映射)。 */
|
|
347
|
+
denyTools?: string[];
|
|
348
|
+
/** 中立权限模式(映射按各引擎 capabilities.permissionMode)。 */
|
|
349
|
+
permissionMode?: string;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
export type { AgentCallOpts as A, EngineCapabilities as E, InteractAction as I, ModelCatalogEntry as M, ProbeReport as P, ReplayedTurn as R, SessionView as S, ToolCall as T, WorktreeHandle as W, AgentEvent as a, AgentFailureKind as b, AgentOutcome as c, AgentOutcomeUsage as d, AgentUsage as e, AgentUsageTotal as f, AssertMutuallyAssignable as g, EngineHandleData as h, InteractResult as i, InternalToolCall as j, ResumeAnchor as k, ToolCallEntry as l, ToolCallResult as m, Turn as n };
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/data-dir.ts
|
|
21
|
+
var data_dir_exports = {};
|
|
22
|
+
__export(data_dir_exports, {
|
|
23
|
+
XYZ_DATA_DIR_ENV: () => XYZ_DATA_DIR_ENV,
|
|
24
|
+
resetDataDirWarnForTests: () => resetDataDirWarnForTests,
|
|
25
|
+
resolveEngineDataDir: () => resolveEngineDataDir
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(data_dir_exports);
|
|
28
|
+
|
|
29
|
+
// src/logger.ts
|
|
30
|
+
var SINK_SLOT_KEY = /* @__PURE__ */ Symbol.for("@zhushanwen/subagent-engine-sdk.logger-sink");
|
|
31
|
+
function getSinkSlot() {
|
|
32
|
+
let slot = Reflect.get(globalThis, SINK_SLOT_KEY);
|
|
33
|
+
if (!slot) {
|
|
34
|
+
slot = { current: void 0 };
|
|
35
|
+
Reflect.set(globalThis, SINK_SLOT_KEY, slot);
|
|
36
|
+
}
|
|
37
|
+
return slot;
|
|
38
|
+
}
|
|
39
|
+
var CONSOLE_SINK = {
|
|
40
|
+
log(level, component, message, data) {
|
|
41
|
+
const line = `[${component}] ${message}`;
|
|
42
|
+
if (level === "error") {
|
|
43
|
+
if (data === void 0) console.error(line);
|
|
44
|
+
else console.error(line, data);
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
if (level === "warn") {
|
|
48
|
+
if (data === void 0) console.warn(line);
|
|
49
|
+
else console.warn(line, data);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
function currentSink() {
|
|
55
|
+
return getSinkSlot().current ?? CONSOLE_SINK;
|
|
56
|
+
}
|
|
57
|
+
var facadeCache = /* @__PURE__ */ new Map();
|
|
58
|
+
function getLogger(component) {
|
|
59
|
+
const existing = facadeCache.get(component);
|
|
60
|
+
if (existing) return existing;
|
|
61
|
+
const facade = {
|
|
62
|
+
debug(msg, data) {
|
|
63
|
+
currentSink().log("debug", component, msg, data);
|
|
64
|
+
},
|
|
65
|
+
warn(msg, data) {
|
|
66
|
+
currentSink().log("warn", component, msg, data);
|
|
67
|
+
},
|
|
68
|
+
error(msg, data) {
|
|
69
|
+
currentSink().log("error", component, msg, data);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
facadeCache.set(component, facade);
|
|
73
|
+
return facade;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// src/data-dir.ts
|
|
77
|
+
var logger = getLogger("subagents");
|
|
78
|
+
var XYZ_DATA_DIR_ENV = "XYZ_AGENT_DATA_DIR";
|
|
79
|
+
var WARNED_SLOT_KEY = /* @__PURE__ */ Symbol.for("@zhushanwen/subagent-engine-sdk.data-dir-warned");
|
|
80
|
+
function getWarnedSlot() {
|
|
81
|
+
let slot = Reflect.get(globalThis, WARNED_SLOT_KEY);
|
|
82
|
+
if (!slot) {
|
|
83
|
+
slot = { current: false };
|
|
84
|
+
Reflect.set(globalThis, WARNED_SLOT_KEY, slot);
|
|
85
|
+
}
|
|
86
|
+
return slot;
|
|
87
|
+
}
|
|
88
|
+
function resetDataDirWarnForTests() {
|
|
89
|
+
getWarnedSlot().current = false;
|
|
90
|
+
}
|
|
91
|
+
function resolveEngineDataDir(env, opts = {}) {
|
|
92
|
+
const fromEnv = env[XYZ_DATA_DIR_ENV]?.trim();
|
|
93
|
+
if (fromEnv !== void 0 && fromEnv !== "") return fromEnv;
|
|
94
|
+
const fallback = opts.fallbackDataRoot?.trim();
|
|
95
|
+
if (fallback === void 0 || fallback === "") {
|
|
96
|
+
throw new Error(
|
|
97
|
+
`[subagent-engine-sdk] engine_not_found: ${XYZ_DATA_DIR_ENV} is not set and no fallback data root was injected. Recovery: the host must inject ${XYZ_DATA_DIR_ENV} into the engine process env (xyz-agent runtime / pi extension host do this at spawn), or pass { fallbackDataRoot } when calling resolveEngineDataDir from a host that resolves the data root itself.`
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
if (!getWarnedSlot().current) {
|
|
101
|
+
getWarnedSlot().current = true;
|
|
102
|
+
const warn = opts.warn ?? defaultWarn;
|
|
103
|
+
warn(
|
|
104
|
+
`[engine-data-dir] ${XYZ_DATA_DIR_ENV} is not set; engine journal/pool fall back to the injected data root (${fallback}). The xyz-agent host normally injects this env \u2014 if you are running inside xyz-agent, check the runtime spawn env; standalone installs intentionally use the injected root.`
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
return fallback;
|
|
108
|
+
}
|
|
109
|
+
function defaultWarn(msg) {
|
|
110
|
+
logger.warn(msg);
|
|
111
|
+
}
|
|
112
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
113
|
+
0 && (module.exports = {
|
|
114
|
+
XYZ_DATA_DIR_ENV,
|
|
115
|
+
resetDataDirWarnForTests,
|
|
116
|
+
resolveEngineDataDir
|
|
117
|
+
});
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** xyz-agent 数据目录 env 名(与 packages/shared/src/paths.ts 的 SSOT 变量同名)。 */
|
|
2
|
+
declare const XYZ_DATA_DIR_ENV = "XYZ_AGENT_DATA_DIR";
|
|
3
|
+
/** 测试隔离专用:重置 warn-once 标记(生产禁用)。 */
|
|
4
|
+
declare function resetDataDirWarnForTests(): void;
|
|
5
|
+
/**
|
|
6
|
+
* 解析引擎数据目录(journal 落盘 / 隔离池的根):
|
|
7
|
+
* 1. env[XYZ_AGENT_DATA_DIR](宿主注入,权威通道);
|
|
8
|
+
* 2. 缺失 + opts.fallbackDataRoot 显式传入(宿主解析过的数据根)→ 用之 + warn 一次
|
|
9
|
+
* (非权威通道回退必须可观测——journal 落点变化不留静默漂移);
|
|
10
|
+
* 3. 两者皆缺 → 抛错(engine_not_found 语义:错误含 env 名、期望值示例与恢复动作;
|
|
11
|
+
* impl-plan §2.9「缺 env 且无注入 → 显式报错(附期望路径)」)。
|
|
12
|
+
*
|
|
13
|
+
* 每次调用重新解析(env 读取是零成本操作,不缓存路径防测试/宿主切换时读到旧值)。
|
|
14
|
+
*/
|
|
15
|
+
declare function resolveEngineDataDir(env: NodeJS.ProcessEnv, opts?: {
|
|
16
|
+
fallbackDataRoot?: string;
|
|
17
|
+
warn?: (msg: string) => void;
|
|
18
|
+
}): string;
|
|
19
|
+
|
|
20
|
+
export { XYZ_DATA_DIR_ENV, resetDataDirWarnForTests, resolveEngineDataDir };
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** xyz-agent 数据目录 env 名(与 packages/shared/src/paths.ts 的 SSOT 变量同名)。 */
|
|
2
|
+
declare const XYZ_DATA_DIR_ENV = "XYZ_AGENT_DATA_DIR";
|
|
3
|
+
/** 测试隔离专用:重置 warn-once 标记(生产禁用)。 */
|
|
4
|
+
declare function resetDataDirWarnForTests(): void;
|
|
5
|
+
/**
|
|
6
|
+
* 解析引擎数据目录(journal 落盘 / 隔离池的根):
|
|
7
|
+
* 1. env[XYZ_AGENT_DATA_DIR](宿主注入,权威通道);
|
|
8
|
+
* 2. 缺失 + opts.fallbackDataRoot 显式传入(宿主解析过的数据根)→ 用之 + warn 一次
|
|
9
|
+
* (非权威通道回退必须可观测——journal 落点变化不留静默漂移);
|
|
10
|
+
* 3. 两者皆缺 → 抛错(engine_not_found 语义:错误含 env 名、期望值示例与恢复动作;
|
|
11
|
+
* impl-plan §2.9「缺 env 且无注入 → 显式报错(附期望路径)」)。
|
|
12
|
+
*
|
|
13
|
+
* 每次调用重新解析(env 读取是零成本操作,不缓存路径防测试/宿主切换时读到旧值)。
|
|
14
|
+
*/
|
|
15
|
+
declare function resolveEngineDataDir(env: NodeJS.ProcessEnv, opts?: {
|
|
16
|
+
fallbackDataRoot?: string;
|
|
17
|
+
warn?: (msg: string) => void;
|
|
18
|
+
}): string;
|
|
19
|
+
|
|
20
|
+
export { XYZ_DATA_DIR_ENV, resetDataDirWarnForTests, resolveEngineDataDir };
|
package/dist/data-dir.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import {
|
|
2
|
+
XYZ_DATA_DIR_ENV,
|
|
3
|
+
resetDataDirWarnForTests,
|
|
4
|
+
resolveEngineDataDir
|
|
5
|
+
} from "./chunk-GT6YLLN4.js";
|
|
6
|
+
import "./chunk-75QEMUGV.js";
|
|
7
|
+
import "./chunk-JSBRDJBE.js";
|
|
8
|
+
export {
|
|
9
|
+
XYZ_DATA_DIR_ENV,
|
|
10
|
+
resetDataDirWarnForTests,
|
|
11
|
+
resolveEngineDataDir
|
|
12
|
+
};
|