@zhushanwen/subagent-engine-sdk 0.10.1 → 0.12.0

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