@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.
Files changed (139) hide show
  1. package/dist/best-effort.cjs +88 -0
  2. package/dist/best-effort.d.cts +14 -0
  3. package/dist/best-effort.d.ts +14 -0
  4. package/dist/best-effort.js +8 -0
  5. package/dist/chunk-2DIMPZCQ.js +0 -0
  6. package/dist/chunk-365AUV6N.js +67 -0
  7. package/dist/chunk-3K2P2CM2.js +127 -0
  8. package/dist/chunk-75QEMUGV.js +58 -0
  9. package/dist/chunk-7I4XGL5J.js +95 -0
  10. package/dist/chunk-A75XDJIC.js +227 -0
  11. package/dist/chunk-DSQ7JQKM.js +39 -0
  12. package/dist/chunk-EJMF63R5.js +19 -0
  13. package/dist/chunk-GT6YLLN4.js +46 -0
  14. package/dist/chunk-HYES77BR.js +109 -0
  15. package/dist/chunk-JSBRDJBE.js +30 -0
  16. package/dist/chunk-LEOBWKRM.js +128 -0
  17. package/dist/chunk-N3RL6OVM.js +38 -0
  18. package/dist/chunk-OPMY4G4M.js +27 -0
  19. package/dist/chunk-PPEPBVCC.js +120 -0
  20. package/dist/chunk-PYO3YR7W.js +16 -0
  21. package/dist/chunk-RDH3ZOV6.js +46 -0
  22. package/dist/chunk-RULLX6C6.js +11 -0
  23. package/dist/chunk-X24SFZYW.js +6646 -0
  24. package/dist/chunk-YFSN3D5N.js +216 -0
  25. package/dist/chunk-ZOFFJNJD.js +136 -0
  26. package/dist/chunk-ZXEAW25V.js +132 -0
  27. package/dist/cli-entry.cjs +119 -0
  28. package/dist/cli-entry.d.cts +24 -0
  29. package/dist/cli-entry.d.ts +24 -0
  30. package/dist/cli-entry.js +8 -0
  31. package/dist/contract-types-sSlgppBC.d.cts +352 -0
  32. package/dist/contract-types-sSlgppBC.d.ts +352 -0
  33. package/dist/data-dir.cjs +117 -0
  34. package/dist/data-dir.d.cts +20 -0
  35. package/dist/data-dir.d.ts +20 -0
  36. package/dist/data-dir.js +12 -0
  37. package/dist/env.cjs +205 -0
  38. package/dist/env.d.cts +73 -0
  39. package/dist/env.d.ts +73 -0
  40. package/dist/env.js +16 -0
  41. package/dist/error-codes-DHco5-i_.d.cts +118 -0
  42. package/dist/error-codes-Dhss2Kmk.d.ts +118 -0
  43. package/dist/error-message.cjs +40 -0
  44. package/dist/error-message.d.cts +3 -0
  45. package/dist/error-message.d.ts +3 -0
  46. package/dist/error-message.js +7 -0
  47. package/dist/index.cjs +8375 -0
  48. package/dist/index.d.cts +23 -0
  49. package/dist/index.d.ts +23 -0
  50. package/dist/index.js +268 -0
  51. package/dist/journal-io.cjs +70 -0
  52. package/dist/journal-io.d.cts +12 -0
  53. package/dist/journal-io.d.ts +12 -0
  54. package/dist/journal-io.js +7 -0
  55. package/dist/journal-replay.cjs +256 -0
  56. package/dist/journal-replay.d.cts +45 -0
  57. package/dist/journal-replay.d.ts +45 -0
  58. package/dist/journal-replay.js +17 -0
  59. package/dist/kill-chain.cjs +221 -0
  60. package/dist/kill-chain.d.cts +74 -0
  61. package/dist/kill-chain.d.ts +74 -0
  62. package/dist/kill-chain.js +23 -0
  63. package/dist/logger.cjs +84 -0
  64. package/dist/logger.d.cts +24 -0
  65. package/dist/logger.d.ts +24 -0
  66. package/dist/logger.js +11 -0
  67. package/dist/logs/stderr-rotation.cjs +151 -0
  68. package/dist/logs/stderr-rotation.d.cts +37 -0
  69. package/dist/logs/stderr-rotation.d.ts +37 -0
  70. package/dist/logs/stderr-rotation.js +23 -0
  71. package/dist/nesting-guard.cjs +95 -0
  72. package/dist/nesting-guard.d.cts +65 -0
  73. package/dist/nesting-guard.d.ts +65 -0
  74. package/dist/nesting-guard.js +15 -0
  75. package/dist/node-executor.cjs +180 -0
  76. package/dist/node-executor.d.cts +63 -0
  77. package/dist/node-executor.d.ts +63 -0
  78. package/dist/node-executor.js +16 -0
  79. package/dist/paths.cjs +55 -0
  80. package/dist/paths.d.cts +8 -0
  81. package/dist/paths.d.ts +8 -0
  82. package/dist/paths.js +15 -0
  83. package/dist/port-contract.cjs +35 -0
  84. package/dist/port-contract.d.cts +88 -0
  85. package/dist/port-contract.d.ts +88 -0
  86. package/dist/port-contract.js +7 -0
  87. package/dist/protocol/index.cjs +400 -0
  88. package/dist/protocol/index.d.cts +685 -0
  89. package/dist/protocol/index.d.ts +685 -0
  90. package/dist/protocol/index.js +89 -0
  91. package/dist/relay-env.cjs +71 -0
  92. package/dist/relay-env.d.cts +37 -0
  93. package/dist/relay-env.d.ts +37 -0
  94. package/dist/relay-env.js +23 -0
  95. package/dist/schema-emulation.cjs +6680 -0
  96. package/dist/schema-emulation.d.cts +39 -0
  97. package/dist/schema-emulation.d.ts +39 -0
  98. package/dist/schema-emulation.js +11 -0
  99. package/dist/spawn.cjs +200 -0
  100. package/dist/spawn.d.cts +80 -0
  101. package/dist/spawn.d.ts +80 -0
  102. package/dist/spawn.js +16 -0
  103. package/dist/ui-channels.cjs +120 -0
  104. package/dist/ui-channels.d.cts +60 -0
  105. package/dist/ui-channels.d.ts +60 -0
  106. package/dist/ui-channels.js +9 -0
  107. package/dist/ui-types.cjs +18 -0
  108. package/dist/ui-types.d.cts +62 -0
  109. package/dist/ui-types.d.ts +62 -0
  110. package/dist/ui-types.js +1 -0
  111. package/package.json +58 -0
  112. package/src/best-effort.ts +37 -0
  113. package/src/cli-entry.ts +77 -0
  114. package/src/data-dir.ts +88 -0
  115. package/src/env.ts +265 -0
  116. package/src/error-message.ts +22 -0
  117. package/src/index.ts +63 -0
  118. package/src/journal-io.ts +82 -0
  119. package/src/journal-replay.ts +432 -0
  120. package/src/kill-chain.ts +265 -0
  121. package/src/logger.ts +105 -0
  122. package/src/logs/stderr-rotation.ts +166 -0
  123. package/src/nesting-guard.ts +140 -0
  124. package/src/node-executor.ts +272 -0
  125. package/src/paths.ts +48 -0
  126. package/src/port-contract.ts +117 -0
  127. package/src/protocol/contract-types.ts +378 -0
  128. package/src/protocol/engine-protocol.ts +81 -0
  129. package/src/protocol/error-codes.ts +179 -0
  130. package/src/protocol/frames.ts +145 -0
  131. package/src/protocol/index.ts +12 -0
  132. package/src/protocol/methods.ts +229 -0
  133. package/src/protocol/reverse-channels.ts +274 -0
  134. package/src/protocol/schema.ts +154 -0
  135. package/src/relay-env.ts +60 -0
  136. package/src/schema-emulation.ts +192 -0
  137. package/src/spawn.ts +246 -0
  138. package/src/ui-channels.ts +219 -0
  139. package/src/ui-types.ts +84 -0
@@ -0,0 +1,45 @@
1
+ import { n as Turn, f as AgentUsageTotal, a as AgentEvent, S as SessionView, h as EngineHandleData, R as ReplayedTurn } from './contract-types-sSlgppBC.cjs';
2
+
3
+ /**
4
+ * reducer 的 record 视图(core ExecutionRecord 的结构子集:reducer 只触碰这四个字段)。
5
+ * core ExecutionRecord 满足本视图(W2 断言挂靠点);SDK 内自持 createReplayRecord 产出。
6
+ */
7
+ interface ReplayRecordView {
8
+ turns: Turn[];
9
+ turnCount: number;
10
+ totalTokens: number;
11
+ lastError: string | undefined;
12
+ }
13
+ /** 重放场景的 record 构造(对齐 core eventsToSessionView 内 createRecord 后的 reducer 视图)。 */
14
+ declare function createReplayRecord(): ReplayRecordView;
15
+ /**
16
+ * 从 AgentEvent 更新 record。所有数据收口进 record.turns[]。
17
+ * - text/thinking:流式累积进 currentTurn()(完整内容,非切片)
18
+ * - tool_start/end:push 进 currentTurn().toolCalls(含完整 result)
19
+ * tool_end 跨 turn 扫描找 running 同名 toolCall(兜底滞后事件)
20
+ * - turn_end:闭合当前 turn,记 closedTs(真实墙钟,供 getEventLog);
21
+ * 正常闭合清 lastError(瞬态 error 恢复后不应误判 success=false)
22
+ * - message_end:usage 增量存进末 turn.usageDelta(直接写末 turn,不开新 turn);
23
+ * totalTokens 累加
24
+ * - error:存 record.lastError(getEventLog 派生 error 条目用)
25
+ *
26
+ * 唯一写点——replay 与 live 共用(重放等价性的实现体)。
27
+ *
28
+ * 穷尽性:switch 覆盖 AgentEvent 全部 variant;default 的 `never` 断言保证
29
+ * 新增 variant 时编译期报错(而非静默 no-op)。
30
+ */
31
+ declare function updateFromEvent(record: ReplayRecordView, event: AgentEvent): void;
32
+ /** Turn → ReplayedTurn:剥离内部态(closed 恒 true——重放物无进行时语义,§3.3.6)。 */
33
+ declare function toReplayedTurn(turn: Turn): ReplayedTurn;
34
+ /** 各 turn usageDelta 聚合为 AgentUsageTotal(无任何 usage 数据时 undefined)。 */
35
+ declare function aggregateUsage(turns: readonly Turn[]): AgentUsageTotal | undefined;
36
+ /**
37
+ * 事件流 → SessionView(live reducer 累积 turns——重放等价性的实现体)。
38
+ * journal I/O(replayJournal)不在此层——read 第②级降级编排(core 版
39
+ * replayJournalToSessionView)留 core,引擎侧按需自读 journal 后调本函数。
40
+ */
41
+ declare function eventsToSessionView(events: readonly AgentEvent[], engineId: string, sessionId?: string): SessionView;
42
+ /** handle.sessionRef 的 sessionId 提取(引擎自定义键,运行时 guard)。 */
43
+ declare function sessionIdFromHandle(handle: EngineHandleData): string | undefined;
44
+
45
+ export { type ReplayRecordView, aggregateUsage, createReplayRecord, eventsToSessionView, sessionIdFromHandle, toReplayedTurn, updateFromEvent };
@@ -0,0 +1,45 @@
1
+ import { n as Turn, f as AgentUsageTotal, a as AgentEvent, S as SessionView, h as EngineHandleData, R as ReplayedTurn } from './contract-types-sSlgppBC.js';
2
+
3
+ /**
4
+ * reducer 的 record 视图(core ExecutionRecord 的结构子集:reducer 只触碰这四个字段)。
5
+ * core ExecutionRecord 满足本视图(W2 断言挂靠点);SDK 内自持 createReplayRecord 产出。
6
+ */
7
+ interface ReplayRecordView {
8
+ turns: Turn[];
9
+ turnCount: number;
10
+ totalTokens: number;
11
+ lastError: string | undefined;
12
+ }
13
+ /** 重放场景的 record 构造(对齐 core eventsToSessionView 内 createRecord 后的 reducer 视图)。 */
14
+ declare function createReplayRecord(): ReplayRecordView;
15
+ /**
16
+ * 从 AgentEvent 更新 record。所有数据收口进 record.turns[]。
17
+ * - text/thinking:流式累积进 currentTurn()(完整内容,非切片)
18
+ * - tool_start/end:push 进 currentTurn().toolCalls(含完整 result)
19
+ * tool_end 跨 turn 扫描找 running 同名 toolCall(兜底滞后事件)
20
+ * - turn_end:闭合当前 turn,记 closedTs(真实墙钟,供 getEventLog);
21
+ * 正常闭合清 lastError(瞬态 error 恢复后不应误判 success=false)
22
+ * - message_end:usage 增量存进末 turn.usageDelta(直接写末 turn,不开新 turn);
23
+ * totalTokens 累加
24
+ * - error:存 record.lastError(getEventLog 派生 error 条目用)
25
+ *
26
+ * 唯一写点——replay 与 live 共用(重放等价性的实现体)。
27
+ *
28
+ * 穷尽性:switch 覆盖 AgentEvent 全部 variant;default 的 `never` 断言保证
29
+ * 新增 variant 时编译期报错(而非静默 no-op)。
30
+ */
31
+ declare function updateFromEvent(record: ReplayRecordView, event: AgentEvent): void;
32
+ /** Turn → ReplayedTurn:剥离内部态(closed 恒 true——重放物无进行时语义,§3.3.6)。 */
33
+ declare function toReplayedTurn(turn: Turn): ReplayedTurn;
34
+ /** 各 turn usageDelta 聚合为 AgentUsageTotal(无任何 usage 数据时 undefined)。 */
35
+ declare function aggregateUsage(turns: readonly Turn[]): AgentUsageTotal | undefined;
36
+ /**
37
+ * 事件流 → SessionView(live reducer 累积 turns——重放等价性的实现体)。
38
+ * journal I/O(replayJournal)不在此层——read 第②级降级编排(core 版
39
+ * replayJournalToSessionView)留 core,引擎侧按需自读 journal 后调本函数。
40
+ */
41
+ declare function eventsToSessionView(events: readonly AgentEvent[], engineId: string, sessionId?: string): SessionView;
42
+ /** handle.sessionRef 的 sessionId 提取(引擎自定义键,运行时 guard)。 */
43
+ declare function sessionIdFromHandle(handle: EngineHandleData): string | undefined;
44
+
45
+ export { type ReplayRecordView, aggregateUsage, createReplayRecord, eventsToSessionView, sessionIdFromHandle, toReplayedTurn, updateFromEvent };
@@ -0,0 +1,17 @@
1
+ import {
2
+ aggregateUsage,
3
+ createReplayRecord,
4
+ eventsToSessionView,
5
+ sessionIdFromHandle,
6
+ toReplayedTurn,
7
+ updateFromEvent
8
+ } from "./chunk-A75XDJIC.js";
9
+ import "./chunk-JSBRDJBE.js";
10
+ export {
11
+ aggregateUsage,
12
+ createReplayRecord,
13
+ eventsToSessionView,
14
+ sessionIdFromHandle,
15
+ toReplayedTurn,
16
+ updateFromEvent
17
+ };
@@ -0,0 +1,221 @@
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/kill-chain.ts
21
+ var kill_chain_exports = {};
22
+ __export(kill_chain_exports, {
23
+ DEFAULT_KILL_GRACE_MS: () => DEFAULT_KILL_GRACE_MS,
24
+ DEFAULT_NATIVE_INTERRUPT_GRACE_MS: () => DEFAULT_NATIVE_INTERRUPT_GRACE_MS,
25
+ HOST_TIMEOUT_ABORT_REASON: () => HOST_TIMEOUT_ABORT_REASON,
26
+ STDOUT_TAIL_ECHO_CHARS: () => STDOUT_TAIL_ECHO_CHARS,
27
+ abortWithFallback: () => abortWithFallback,
28
+ killChain: () => killChain,
29
+ synthesizeTimeoutOutcome: () => synthesizeTimeoutOutcome
30
+ });
31
+ module.exports = __toCommonJS(kill_chain_exports);
32
+
33
+ // src/logger.ts
34
+ var SINK_SLOT_KEY = /* @__PURE__ */ Symbol.for("@zhushanwen/subagent-engine-sdk.logger-sink");
35
+ function getSinkSlot() {
36
+ let slot = Reflect.get(globalThis, SINK_SLOT_KEY);
37
+ if (!slot) {
38
+ slot = { current: void 0 };
39
+ Reflect.set(globalThis, SINK_SLOT_KEY, slot);
40
+ }
41
+ return slot;
42
+ }
43
+ var CONSOLE_SINK = {
44
+ log(level, component, message, data) {
45
+ const line = `[${component}] ${message}`;
46
+ if (level === "error") {
47
+ if (data === void 0) console.error(line);
48
+ else console.error(line, data);
49
+ return;
50
+ }
51
+ if (level === "warn") {
52
+ if (data === void 0) console.warn(line);
53
+ else console.warn(line, data);
54
+ return;
55
+ }
56
+ }
57
+ };
58
+ function currentSink() {
59
+ return getSinkSlot().current ?? CONSOLE_SINK;
60
+ }
61
+ var facadeCache = /* @__PURE__ */ new Map();
62
+ function getLogger(component) {
63
+ const existing = facadeCache.get(component);
64
+ if (existing) return existing;
65
+ const facade = {
66
+ debug(msg, data) {
67
+ currentSink().log("debug", component, msg, data);
68
+ },
69
+ warn(msg, data) {
70
+ currentSink().log("warn", component, msg, data);
71
+ },
72
+ error(msg, data) {
73
+ currentSink().log("error", component, msg, data);
74
+ }
75
+ };
76
+ facadeCache.set(component, facade);
77
+ return facade;
78
+ }
79
+
80
+ // src/error-message.ts
81
+ function toErrorMessage(e) {
82
+ if (e instanceof Error) return e.message;
83
+ if (typeof e === "object" && e !== null) {
84
+ try {
85
+ return JSON.stringify(e);
86
+ } catch {
87
+ return String(e);
88
+ }
89
+ }
90
+ return String(e);
91
+ }
92
+
93
+ // src/protocol/error-codes.ts
94
+ var STDOUT_TAIL_ECHO_CHARS = 2e3;
95
+ function truncate(text, max) {
96
+ return text.length <= max ? text : `${text.slice(0, max)}...`;
97
+ }
98
+ var ENGINE_TIMEOUT_RECOVERY = "The engine was killed by the host timeout chain. Inspect the captured stdout tail, then re-run with a larger timeout, a narrower task, or `engine: pi`.";
99
+ function engineTimeoutDetail(stdoutTail) {
100
+ return `host timeout chain exhausted (SIGTERM -> grace -> SIGKILL). Stdout tail (last ${STDOUT_TAIL_ECHO_CHARS} chars): ${truncate(stdoutTail, STDOUT_TAIL_ECHO_CHARS)}. Recovery: ${ENGINE_TIMEOUT_RECOVERY}`;
101
+ }
102
+
103
+ // src/kill-chain.ts
104
+ var logger = getLogger("subagents");
105
+ var MS_PER_SECOND = 1e3;
106
+ var DEFAULT_KILL_GRACE_MS = 5e3;
107
+ var SIGKILL_REAP_TIMEOUT_MS = 1e4;
108
+ var HOST_TIMEOUT_ABORT_REASON = "agent-call-timeout";
109
+ async function killChain(child, opts) {
110
+ if (child.exitCode !== null || child.signalCode !== null) return "terminated";
111
+ const exited = waitForExit(child);
112
+ safeKill(child, "SIGTERM");
113
+ const graceful = await raceTimeout(exited, opts.graceMs, opts.unrefTimers === true);
114
+ if (graceful === "settled") return "terminated";
115
+ if (child.exitCode !== null || child.signalCode !== null) return "terminated";
116
+ if (opts.escalationNote !== void 0) {
117
+ logger.warn(
118
+ `[kill-chain] ${opts.escalationNote} still alive ${opts.graceMs / MS_PER_SECOND}s after SIGTERM, escalating to SIGKILL`
119
+ );
120
+ }
121
+ safeKill(child, "SIGKILL");
122
+ await raceTimeout(exited, SIGKILL_REAP_TIMEOUT_MS, opts.unrefTimers === true);
123
+ return "killed";
124
+ }
125
+ function safeKill(child, signal) {
126
+ try {
127
+ child.kill(signal);
128
+ } catch (err) {
129
+ logger.debug(
130
+ `[kill-chain] ${signal} on exited process: ${toErrorMessage(err)}`
131
+ );
132
+ }
133
+ }
134
+ function synthesizeTimeoutOutcome(task, stdoutTail, engineId) {
135
+ return {
136
+ content: "",
137
+ // slug 进错误信息:单看 outcome(record 之外)也能定位是哪个任务超时
138
+ error: `engine_timeout: [slug=${task.description ?? "unknown"}] ${engineTimeoutDetail(stdoutTail)}`,
139
+ // 被信号杀死:退出码语义为 null(§3.3.5 AgentOutcome.exitCode 注释)
140
+ exitCode: null,
141
+ engineId
142
+ };
143
+ }
144
+ var DEFAULT_NATIVE_INTERRUPT_GRACE_MS = 3e3;
145
+ function abortWithFallback(child, signal, tryNativeInterrupt, opts) {
146
+ const graceMs = opts?.graceMs ?? DEFAULT_KILL_GRACE_MS;
147
+ const nativeGraceMs = opts?.nativeGraceMs ?? DEFAULT_NATIVE_INTERRUPT_GRACE_MS;
148
+ return new Promise((resolve) => {
149
+ let settled = false;
150
+ function finish(result) {
151
+ if (settled) return;
152
+ settled = true;
153
+ signal.removeEventListener("abort", onAbort);
154
+ resolve(result);
155
+ }
156
+ function onExit() {
157
+ finish("terminated");
158
+ }
159
+ function runChain() {
160
+ void (async () => {
161
+ if (tryNativeInterrupt) {
162
+ try {
163
+ await tryNativeInterrupt();
164
+ } catch (err) {
165
+ logger.debug(
166
+ `[kill-chain] native interrupt failed, falling back to kill chain: ${toErrorMessage(err)}`
167
+ );
168
+ }
169
+ const stopped = await raceTimeout(waitForExit(child), nativeGraceMs);
170
+ if (stopped === "settled" || settled) return;
171
+ }
172
+ finish(await killChain(child, { graceMs }));
173
+ })();
174
+ }
175
+ function onAbort() {
176
+ runChain();
177
+ }
178
+ child.once("exit", onExit);
179
+ if (child.exitCode !== null || child.signalCode !== null) {
180
+ finish("terminated");
181
+ return;
182
+ }
183
+ if (signal.aborted) runChain();
184
+ else signal.addEventListener("abort", onAbort, { once: true });
185
+ });
186
+ }
187
+ function waitForExit(child) {
188
+ return new Promise((resolve) => {
189
+ if (child.exitCode !== null || child.signalCode !== null) {
190
+ resolve();
191
+ return;
192
+ }
193
+ child.once("exit", () => resolve());
194
+ });
195
+ }
196
+ function raceTimeout(p, ms, unref = false) {
197
+ return new Promise((resolve) => {
198
+ const timer = setTimeout(() => resolve("timeout"), ms);
199
+ if (unref) timer.unref();
200
+ p.then(
201
+ () => {
202
+ clearTimeout(timer);
203
+ resolve("settled");
204
+ },
205
+ () => {
206
+ clearTimeout(timer);
207
+ resolve("settled");
208
+ }
209
+ );
210
+ });
211
+ }
212
+ // Annotate the CommonJS export names for ESM import in node:
213
+ 0 && (module.exports = {
214
+ DEFAULT_KILL_GRACE_MS,
215
+ DEFAULT_NATIVE_INTERRUPT_GRACE_MS,
216
+ HOST_TIMEOUT_ABORT_REASON,
217
+ STDOUT_TAIL_ECHO_CHARS,
218
+ abortWithFallback,
219
+ killChain,
220
+ synthesizeTimeoutOutcome
221
+ });
@@ -0,0 +1,74 @@
1
+ export { S as STDOUT_TAIL_ECHO_CHARS } from './error-codes-DHco5-i_.cjs';
2
+ import { A as AgentCallOpts, c as AgentOutcome } from './contract-types-sSlgppBC.cjs';
3
+
4
+ /**
5
+ * 可杀子进程的结构形状(Node ChildProcess 的结构子集)。
6
+ * 用结构接口而非 ChildProcess 类型:测试可注入 fake(ChildProcess 全字段构造过重),
7
+ * 且未来 driver host 的常驻进程句柄只要满足此形状即可复用杀链。
8
+ */
9
+ interface KillableChild {
10
+ /** 非 null = 进程已退出(自然退出码)。 */
11
+ readonly exitCode: number | null;
12
+ /** 非 null = 进程被信号杀死。exitCode/signalCode 任一非 null 即已退出。 */
13
+ readonly signalCode: string | null;
14
+ /** 发信号。返回 false = 进程已不存在(kill no-op)。 */
15
+ kill(signal?: NodeJS.Signals | number): boolean;
16
+ once(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
17
+ }
18
+ /** SIGTERM 优雅窗口默认值(ms)。实测校准点:设计 §5 待验证检查点⑤(zcode 对 SIGTERM 的响应时序)。 */
19
+ declare const DEFAULT_KILL_GRACE_MS = 5000;
20
+ /**
21
+ * 宿主超时 abort 的 signal.reason 标记(对齐点④)。mergeTimeoutSignal(SAR 侧超时
22
+ * 合并链)产出;引擎 abort 合成终态时判别「超时 vs 用户 cancel」——超时统一走
23
+ * synthesizeTimeoutOutcome(engine_timeout),cancel 维持中止标记(engine_run_failed)。
24
+ */
25
+ declare const HOST_TIMEOUT_ABORT_REASON = "agent-call-timeout";
26
+ /** killChain 的参数形状。 */
27
+ interface KillChainOptions {
28
+ /**
29
+ * SIGTERM 优雅窗口(ms)。grace 窗口按引擎参数化(D3-① 杀链合一):pi 传 30s
30
+ * ([race-F4] 现状值)、zcode 传 5s(ZCODE_KILL_GRACE_MS)——两引擎现状逐字节保持。
31
+ */
32
+ graceMs: number;
33
+ /**
34
+ * [D3-①] 内部 timer unref。pi 路径现状 = 升级 timer unref(不阻止主进程退出,dispose
35
+ * killAll 兜底);zcode 现状 = ref'd(timer 挂起时进程等待收尸)——各引擎按现状传。
36
+ */
37
+ unrefTimers?: boolean;
38
+ /**
39
+ * SIGKILL 升级时的 warn 留痕载体(如 `child sa-xxx (source: spawn watchdog)`)。
40
+ * 不传则升级静默(zcode 现状)——pi 侧现状有 warn,由调用方组装完整语境。
41
+ */
42
+ escalationNote?: string;
43
+ }
44
+ /**
45
+ * 杀链:SIGTERM → 等待 graceMs → 仍存活则 SIGKILL。
46
+ *
47
+ * @returns 'terminated' = SIGTERM 优雅退出(或进程已自行退出);'killed' = 走了 SIGKILL。
48
+ */
49
+ declare function killChain(child: KillableChild, opts: KillChainOptions): Promise<"terminated" | "killed">;
50
+ /**
51
+ * 合成 engine_timeout 终态(宿主超时杀链走完后的 AgentOutcome)。
52
+ * 含 stdout 尾部 2000 字 + 恢复指引(§3.3.3 第 6 行);exitCode: null = 被信号杀死
53
+ * (AgentOutcome 的杀链判据,§3.3.5)。
54
+ *
55
+ * engineId 参数注入(原 core 版缺省 DEFAULT_ENGINE_ID——SDK 不感知宿主路由缺省值,
56
+ * 调用方必须显式传实际引擎 id)。
57
+ */
58
+ declare function synthesizeTimeoutOutcome(task: AgentCallOpts, stdoutTail: string, engineId: string): AgentOutcome;
59
+ /** 原生中断后的宽限窗口默认值(ms):中断指令送达 → 引擎自行收尾的等待上限。 */
60
+ declare const DEFAULT_NATIVE_INTERRUPT_GRACE_MS = 3000;
61
+ /**
62
+ * abort 两级编排 helper(D1 abort 分级的公共实现):
63
+ * signal abort 时 ①先调引擎原生中断(tryNativeInterrupt,若有)并给宽限窗口,
64
+ * 窗口内未停(或无原生中断——CLI-only 引擎)则 ②走杀链兜底。
65
+ *
66
+ * 进程自然退出时以 'terminated' settle(挂在 exit 事件上,杀链对已退进程是 no-op),
67
+ * 调用方可安全 await;signal 永不 abort 且进程已退时也会 settle,不悬挂。
68
+ */
69
+ declare function abortWithFallback(child: KillableChild, signal: AbortSignal, tryNativeInterrupt?: () => Promise<void>, opts?: {
70
+ graceMs?: number;
71
+ nativeGraceMs?: number;
72
+ }): Promise<"terminated" | "killed">;
73
+
74
+ export { DEFAULT_KILL_GRACE_MS, DEFAULT_NATIVE_INTERRUPT_GRACE_MS, HOST_TIMEOUT_ABORT_REASON, type KillChainOptions, type KillableChild, abortWithFallback, killChain, synthesizeTimeoutOutcome };
@@ -0,0 +1,74 @@
1
+ export { S as STDOUT_TAIL_ECHO_CHARS } from './error-codes-Dhss2Kmk.js';
2
+ import { A as AgentCallOpts, c as AgentOutcome } from './contract-types-sSlgppBC.js';
3
+
4
+ /**
5
+ * 可杀子进程的结构形状(Node ChildProcess 的结构子集)。
6
+ * 用结构接口而非 ChildProcess 类型:测试可注入 fake(ChildProcess 全字段构造过重),
7
+ * 且未来 driver host 的常驻进程句柄只要满足此形状即可复用杀链。
8
+ */
9
+ interface KillableChild {
10
+ /** 非 null = 进程已退出(自然退出码)。 */
11
+ readonly exitCode: number | null;
12
+ /** 非 null = 进程被信号杀死。exitCode/signalCode 任一非 null 即已退出。 */
13
+ readonly signalCode: string | null;
14
+ /** 发信号。返回 false = 进程已不存在(kill no-op)。 */
15
+ kill(signal?: NodeJS.Signals | number): boolean;
16
+ once(event: "exit", listener: (code: number | null, signal: NodeJS.Signals | null) => void): unknown;
17
+ }
18
+ /** SIGTERM 优雅窗口默认值(ms)。实测校准点:设计 §5 待验证检查点⑤(zcode 对 SIGTERM 的响应时序)。 */
19
+ declare const DEFAULT_KILL_GRACE_MS = 5000;
20
+ /**
21
+ * 宿主超时 abort 的 signal.reason 标记(对齐点④)。mergeTimeoutSignal(SAR 侧超时
22
+ * 合并链)产出;引擎 abort 合成终态时判别「超时 vs 用户 cancel」——超时统一走
23
+ * synthesizeTimeoutOutcome(engine_timeout),cancel 维持中止标记(engine_run_failed)。
24
+ */
25
+ declare const HOST_TIMEOUT_ABORT_REASON = "agent-call-timeout";
26
+ /** killChain 的参数形状。 */
27
+ interface KillChainOptions {
28
+ /**
29
+ * SIGTERM 优雅窗口(ms)。grace 窗口按引擎参数化(D3-① 杀链合一):pi 传 30s
30
+ * ([race-F4] 现状值)、zcode 传 5s(ZCODE_KILL_GRACE_MS)——两引擎现状逐字节保持。
31
+ */
32
+ graceMs: number;
33
+ /**
34
+ * [D3-①] 内部 timer unref。pi 路径现状 = 升级 timer unref(不阻止主进程退出,dispose
35
+ * killAll 兜底);zcode 现状 = ref'd(timer 挂起时进程等待收尸)——各引擎按现状传。
36
+ */
37
+ unrefTimers?: boolean;
38
+ /**
39
+ * SIGKILL 升级时的 warn 留痕载体(如 `child sa-xxx (source: spawn watchdog)`)。
40
+ * 不传则升级静默(zcode 现状)——pi 侧现状有 warn,由调用方组装完整语境。
41
+ */
42
+ escalationNote?: string;
43
+ }
44
+ /**
45
+ * 杀链:SIGTERM → 等待 graceMs → 仍存活则 SIGKILL。
46
+ *
47
+ * @returns 'terminated' = SIGTERM 优雅退出(或进程已自行退出);'killed' = 走了 SIGKILL。
48
+ */
49
+ declare function killChain(child: KillableChild, opts: KillChainOptions): Promise<"terminated" | "killed">;
50
+ /**
51
+ * 合成 engine_timeout 终态(宿主超时杀链走完后的 AgentOutcome)。
52
+ * 含 stdout 尾部 2000 字 + 恢复指引(§3.3.3 第 6 行);exitCode: null = 被信号杀死
53
+ * (AgentOutcome 的杀链判据,§3.3.5)。
54
+ *
55
+ * engineId 参数注入(原 core 版缺省 DEFAULT_ENGINE_ID——SDK 不感知宿主路由缺省值,
56
+ * 调用方必须显式传实际引擎 id)。
57
+ */
58
+ declare function synthesizeTimeoutOutcome(task: AgentCallOpts, stdoutTail: string, engineId: string): AgentOutcome;
59
+ /** 原生中断后的宽限窗口默认值(ms):中断指令送达 → 引擎自行收尾的等待上限。 */
60
+ declare const DEFAULT_NATIVE_INTERRUPT_GRACE_MS = 3000;
61
+ /**
62
+ * abort 两级编排 helper(D1 abort 分级的公共实现):
63
+ * signal abort 时 ①先调引擎原生中断(tryNativeInterrupt,若有)并给宽限窗口,
64
+ * 窗口内未停(或无原生中断——CLI-only 引擎)则 ②走杀链兜底。
65
+ *
66
+ * 进程自然退出时以 'terminated' settle(挂在 exit 事件上,杀链对已退进程是 no-op),
67
+ * 调用方可安全 await;signal 永不 abort 且进程已退时也会 settle,不悬挂。
68
+ */
69
+ declare function abortWithFallback(child: KillableChild, signal: AbortSignal, tryNativeInterrupt?: () => Promise<void>, opts?: {
70
+ graceMs?: number;
71
+ nativeGraceMs?: number;
72
+ }): Promise<"terminated" | "killed">;
73
+
74
+ export { DEFAULT_KILL_GRACE_MS, DEFAULT_NATIVE_INTERRUPT_GRACE_MS, HOST_TIMEOUT_ABORT_REASON, type KillChainOptions, type KillableChild, abortWithFallback, killChain, synthesizeTimeoutOutcome };
@@ -0,0 +1,23 @@
1
+ import {
2
+ DEFAULT_KILL_GRACE_MS,
3
+ DEFAULT_NATIVE_INTERRUPT_GRACE_MS,
4
+ HOST_TIMEOUT_ABORT_REASON,
5
+ abortWithFallback,
6
+ killChain,
7
+ synthesizeTimeoutOutcome
8
+ } from "./chunk-LEOBWKRM.js";
9
+ import "./chunk-PYO3YR7W.js";
10
+ import {
11
+ STDOUT_TAIL_ECHO_CHARS
12
+ } from "./chunk-PPEPBVCC.js";
13
+ import "./chunk-75QEMUGV.js";
14
+ import "./chunk-JSBRDJBE.js";
15
+ export {
16
+ DEFAULT_KILL_GRACE_MS,
17
+ DEFAULT_NATIVE_INTERRUPT_GRACE_MS,
18
+ HOST_TIMEOUT_ABORT_REASON,
19
+ STDOUT_TAIL_ECHO_CHARS,
20
+ abortWithFallback,
21
+ killChain,
22
+ synthesizeTimeoutOutcome
23
+ };
@@ -0,0 +1,84 @@
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/logger.ts
21
+ var logger_exports = {};
22
+ __export(logger_exports, {
23
+ configureLoggerSink: () => configureLoggerSink,
24
+ getLogger: () => getLogger,
25
+ resetLoggerSinkForTests: () => resetLoggerSinkForTests
26
+ });
27
+ module.exports = __toCommonJS(logger_exports);
28
+ var SINK_SLOT_KEY = /* @__PURE__ */ Symbol.for("@zhushanwen/subagent-engine-sdk.logger-sink");
29
+ function getSinkSlot() {
30
+ let slot = Reflect.get(globalThis, SINK_SLOT_KEY);
31
+ if (!slot) {
32
+ slot = { current: void 0 };
33
+ Reflect.set(globalThis, SINK_SLOT_KEY, slot);
34
+ }
35
+ return slot;
36
+ }
37
+ var CONSOLE_SINK = {
38
+ log(level, component, message, data) {
39
+ const line = `[${component}] ${message}`;
40
+ if (level === "error") {
41
+ if (data === void 0) console.error(line);
42
+ else console.error(line, data);
43
+ return;
44
+ }
45
+ if (level === "warn") {
46
+ if (data === void 0) console.warn(line);
47
+ else console.warn(line, data);
48
+ return;
49
+ }
50
+ }
51
+ };
52
+ function currentSink() {
53
+ return getSinkSlot().current ?? CONSOLE_SINK;
54
+ }
55
+ function configureLoggerSink(sink) {
56
+ getSinkSlot().current = sink;
57
+ }
58
+ function resetLoggerSinkForTests() {
59
+ getSinkSlot().current = void 0;
60
+ }
61
+ var facadeCache = /* @__PURE__ */ new Map();
62
+ function getLogger(component) {
63
+ const existing = facadeCache.get(component);
64
+ if (existing) return existing;
65
+ const facade = {
66
+ debug(msg, data) {
67
+ currentSink().log("debug", component, msg, data);
68
+ },
69
+ warn(msg, data) {
70
+ currentSink().log("warn", component, msg, data);
71
+ },
72
+ error(msg, data) {
73
+ currentSink().log("error", component, msg, data);
74
+ }
75
+ };
76
+ facadeCache.set(component, facade);
77
+ return facade;
78
+ }
79
+ // Annotate the CommonJS export names for ESM import in node:
80
+ 0 && (module.exports = {
81
+ configureLoggerSink,
82
+ getLogger,
83
+ resetLoggerSinkForTests
84
+ });
@@ -0,0 +1,24 @@
1
+ /**
2
+ * SDK 侧 logger sink(引擎 CLI 注入宿主形态日志出口;core 版对应 HostServices.log)。
3
+ */
4
+ interface LoggerSink {
5
+ log(level: LogLevel, component: string, message: string, data?: unknown): void;
6
+ }
7
+ /** 日志级别。对齐 core logger 的 LogLevel(三值,无 info)。 */
8
+ type LogLevel = "debug" | "warn" | "error";
9
+ /** logger 接口。与 core CoreLogger 结构兼容——迁移调用面(方法名/参数序)逐文件等价。 */
10
+ interface CoreLogger {
11
+ debug(msg: string, data?: unknown): void;
12
+ warn(msg: string, data?: unknown): void;
13
+ error(msg: string, data?: unknown): void;
14
+ }
15
+ /**
16
+ * 注入日志 sink(引擎 CLI 启动早期调用;重复调用后者覆盖——测试切 sink 依赖此语义)。
17
+ * 解析发生在每次 logger 方法调用时,模块顶层已缓存的 logger 透明切换,无加载顺序依赖。
18
+ */
19
+ declare function configureLoggerSink(sink: LoggerSink): void;
20
+ /** 测试隔离专用:清空 sink 配置态(生产禁用)。 */
21
+ declare function resetLoggerSinkForTests(): void;
22
+ declare function getLogger(component: string): CoreLogger;
23
+
24
+ export { type CoreLogger, type LogLevel, type LoggerSink, configureLoggerSink, getLogger, resetLoggerSinkForTests };
@@ -0,0 +1,24 @@
1
+ /**
2
+ * SDK 侧 logger sink(引擎 CLI 注入宿主形态日志出口;core 版对应 HostServices.log)。
3
+ */
4
+ interface LoggerSink {
5
+ log(level: LogLevel, component: string, message: string, data?: unknown): void;
6
+ }
7
+ /** 日志级别。对齐 core logger 的 LogLevel(三值,无 info)。 */
8
+ type LogLevel = "debug" | "warn" | "error";
9
+ /** logger 接口。与 core CoreLogger 结构兼容——迁移调用面(方法名/参数序)逐文件等价。 */
10
+ interface CoreLogger {
11
+ debug(msg: string, data?: unknown): void;
12
+ warn(msg: string, data?: unknown): void;
13
+ error(msg: string, data?: unknown): void;
14
+ }
15
+ /**
16
+ * 注入日志 sink(引擎 CLI 启动早期调用;重复调用后者覆盖——测试切 sink 依赖此语义)。
17
+ * 解析发生在每次 logger 方法调用时,模块顶层已缓存的 logger 透明切换,无加载顺序依赖。
18
+ */
19
+ declare function configureLoggerSink(sink: LoggerSink): void;
20
+ /** 测试隔离专用:清空 sink 配置态(生产禁用)。 */
21
+ declare function resetLoggerSinkForTests(): void;
22
+ declare function getLogger(component: string): CoreLogger;
23
+
24
+ export { type CoreLogger, type LogLevel, type LoggerSink, configureLoggerSink, getLogger, resetLoggerSinkForTests };
package/dist/logger.js ADDED
@@ -0,0 +1,11 @@
1
+ import {
2
+ configureLoggerSink,
3
+ getLogger,
4
+ resetLoggerSinkForTests
5
+ } from "./chunk-75QEMUGV.js";
6
+ import "./chunk-JSBRDJBE.js";
7
+ export {
8
+ configureLoggerSink,
9
+ getLogger,
10
+ resetLoggerSinkForTests
11
+ };