@migor/agentia 0.10.1 → 0.10.3
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/CHANGELOG.md +917 -34
- package/README.en.md +6 -4
- package/README.md +4 -3
- package/dist/AGENTS.md +106 -33
- package/dist/core/limits.d.ts +33 -1
- package/dist/core/limits.js +37 -1
- package/dist/core/limits.js.map +1 -1
- package/dist/core/run.d.ts +2 -2
- package/dist/core/timeout.d.ts +5 -5
- package/dist/core/timeout.js +5 -5
- package/dist/core/tool.d.ts +2 -2
- package/dist/core/trace.d.ts +10 -1
- package/dist/core/trace.js +10 -1
- package/dist/core/trace.js.map +1 -1
- package/dist/engine/concurrency.d.ts +1 -1
- package/dist/engine/concurrency.js +1 -1
- package/dist/engine/errors.d.ts +2 -2
- package/dist/engine/errors.js +2 -2
- package/dist/engine/loop-result.d.ts +2 -2
- package/dist/engine/loop.js +91 -56
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/mcp-server-http.js +69 -36
- package/dist/engine/mcp-server-http.js.map +1 -1
- package/dist/engine/mcp-server-stdio.d.ts +0 -13
- package/dist/engine/mcp-server-stdio.js +42 -25
- package/dist/engine/mcp-server-stdio.js.map +1 -1
- package/dist/engine/mcp-server.d.ts +15 -0
- package/dist/engine/mcp-server.js +39 -8
- package/dist/engine/mcp-server.js.map +1 -1
- package/dist/engine/resume-input.d.ts +1 -1
- package/dist/engine/resume-input.js +1 -1
- package/dist/engine/retry.d.ts +15 -0
- package/dist/engine/retry.js +51 -2
- package/dist/engine/retry.js.map +1 -1
- package/dist/engine/span-scope.d.ts +15 -0
- package/dist/engine/span-scope.js +8 -1
- package/dist/engine/span-scope.js.map +1 -1
- package/dist/engine/spec.d.ts +5 -1
- package/dist/engine/spec.js.map +1 -1
- package/dist/engine/tracer.d.ts +8 -4
- package/dist/engine/tracer.js +24 -17
- package/dist/engine/tracer.js.map +1 -1
- package/dist/engine/turn.d.ts +2 -2
- package/dist/engine/turn.js +19 -4
- package/dist/engine/turn.js.map +1 -1
- package/dist/engine/types.d.ts +8 -3
- package/dist/eval/export.js +2 -2
- package/dist/eval/export.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/integrations/anthropic.d.ts +1 -1
- package/dist/integrations/anthropic.js +1 -1
- package/dist/integrations/anthropic.js.map +1 -1
- package/dist/integrations/file-sink.d.ts +2 -2
- package/dist/integrations/file-sink.js +2 -2
- package/dist/integrations/mcp-http.js +15 -88
- package/dist/integrations/mcp-http.js.map +1 -1
- package/dist/integrations/mcp-protocol.d.ts +86 -10
- package/dist/integrations/mcp-protocol.js +147 -1
- package/dist/integrations/mcp-protocol.js.map +1 -1
- package/dist/integrations/mcp-stdio.js +87 -52
- package/dist/integrations/mcp-stdio.js.map +1 -1
- package/dist/integrations/mcp.d.ts +1 -1
- package/dist/integrations/mcp.js +19 -3
- package/dist/integrations/mcp.js.map +1 -1
- package/dist/integrations/metrics-otlp.d.ts +1 -1
- package/dist/integrations/metrics-otlp.js +8 -2
- package/dist/integrations/metrics-otlp.js.map +1 -1
- package/dist/integrations/metrics-render.js +1 -1
- package/dist/integrations/metrics-render.js.map +1 -1
- package/dist/integrations/metrics-state.d.ts +2 -2
- package/dist/integrations/metrics-state.js +4 -4
- package/dist/integrations/metrics-state.js.map +1 -1
- package/dist/integrations/metrics.d.ts +2 -2
- package/dist/integrations/openai.d.ts +4 -1
- package/dist/integrations/openai.js +25 -6
- package/dist/integrations/openai.js.map +1 -1
- package/dist/integrations/otlp.d.ts +29 -6
- package/dist/integrations/otlp.js +128 -7
- package/dist/integrations/otlp.js.map +1 -1
- package/dist/integrations/report.d.ts +14 -2
- package/dist/integrations/report.js +39 -6
- package/dist/integrations/report.js.map +1 -1
- package/dist/runtime/memory.d.ts +5 -0
- package/dist/runtime/memory.js.map +1 -1
- package/dist/store/fsStore.js +9 -5
- package/dist/store/fsStore.js.map +1 -1
- package/dist/store/record.d.ts +2 -2
- package/dist/store/record.js +1 -1
- package/dist/store/sqliteStore.d.ts +2 -2
- package/dist/store/sqliteStore.js +3 -3
- package/dist/store/sqliteStore.js.map +1 -1
- package/dist/store/store.d.ts +32 -6
- package/dist/store/store.js +36 -5
- package/dist/store/store.js.map +1 -1
- package/dist/toolkit/collect.d.ts +11 -5
- package/dist/toolkit/collect.js +10 -4
- package/dist/toolkit/collect.js.map +1 -1
- package/dist/toolkit/module.js +78 -1
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/prompt.d.ts +1 -1
- package/dist/toolkit/prompt.js +2 -2
- package/dist/toolkit/prompt.js.map +1 -1
- package/dist/toolkit/subagent.js +17 -3
- package/dist/toolkit/subagent.js.map +1 -1
- package/dist/transport/approval-policy.js +1 -1
- package/dist/transport/approval-policy.js.map +1 -1
- package/dist/transport/approval-supervisor.d.ts +8 -0
- package/dist/transport/approval-supervisor.js +23 -3
- package/dist/transport/approval-supervisor.js.map +1 -1
- package/dist/transport/async.d.ts +5 -4
- package/dist/transport/async.js +166 -145
- package/dist/transport/async.js.map +1 -1
- package/dist/transport/http-endpoints.js +1 -1
- package/dist/transport/http-route.js +2 -2
- package/dist/transport/http-route.js.map +1 -1
- package/dist/transport/http-shapes.d.ts +1 -1
- package/dist/transport/http-shapes.js +1 -1
- package/dist/transport/resume-scanner.d.ts +7 -0
- package/dist/transport/resume-scanner.js +40 -9
- package/dist/transport/resume-scanner.js.map +1 -1
- package/dist/transport/run-call-options.d.ts +77 -0
- package/dist/transport/run-call-options.js +76 -0
- package/dist/transport/run-call-options.js.map +1 -0
- package/dist/transport/run-outcome.d.ts +109 -0
- package/dist/transport/run-outcome.js +100 -0
- package/dist/transport/run-outcome.js.map +1 -0
- package/dist/transport/scheduler.js +5 -0
- package/dist/transport/scheduler.js.map +1 -1
- package/dist/transport/signal-supervisor.d.ts +10 -2
- package/dist/transport/signal-supervisor.js +15 -2
- package/dist/transport/signal-supervisor.js.map +1 -1
- package/dist/transport/wake-policy.d.ts +1 -1
- package/package.json +2 -2
|
@@ -21,24 +21,34 @@ import { randomUUID } from 'node:crypto';
|
|
|
21
21
|
*/
|
|
22
22
|
/** http 侧请求 body 上限(固定 1 MiB,与 HTTP 宿主缺省一致;不公开成旋钮) */
|
|
23
23
|
const MAX_BODY_BYTES = 1024 * 1024;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
24
|
+
/**
|
|
25
|
+
* 下面这一组(`sendJson` / `readBody` / `jsonRpcIdOf` / `startListening` / `closeOwnServer`)
|
|
26
|
+
* 2026-10-11 从 `startHttpTransport` 里提到**模块级**:它们是纯件(只看传入的 `req` / `res` /
|
|
27
|
+
* `server`,不碰那条连接的闭包状态),留在闭包里那一个函数有 **192 行 / 占文件 87%**
|
|
28
|
+
* 〔**修前**读数,文件 220 行 —— 那是定阈值当天的全仓最高比例〕。见
|
|
29
|
+
* `tests/architecture/method-size.test.ts` 头注的读数表。
|
|
30
|
+
* ⚠️ **别把「修后多少」写在这里** —— 那是个会腐烂的比例(头部注释改动就会动分母),
|
|
31
|
+
* 能现算:把那个上限临时改成 0 跑一次就是全表。搬迁是**逐字**的,判据与注释一并搬走。
|
|
32
|
+
*/
|
|
33
|
+
/** 回 JSON。⚠️ 客户端已走时静默返回:写了也没人收,而 `writeHead` 会抛 `ERR_STREAM_WRITE_AFTER_END`。 */
|
|
34
|
+
function sendJson(res, status, body) {
|
|
35
|
+
if (res.writableEnded || res.destroyed)
|
|
36
|
+
return; // 客户端已走:写了也没人收
|
|
37
|
+
const payload = JSON.stringify(body);
|
|
38
|
+
res.writeHead(status, {
|
|
39
|
+
'content-type': 'application/json; charset=utf-8',
|
|
40
|
+
'content-length': Buffer.byteLength(payload),
|
|
41
|
+
});
|
|
42
|
+
res.end(payload);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 读请求体;**超过上限 / 连接中断都返回 `null`**(调用方回 413,不区分是哪一种)。
|
|
46
|
+
*
|
|
47
|
+
* 四个事件都听着是为了**不挂死**:`data` 攒、`end` 收口、`error` 与 `close` 都是「不会再有
|
|
48
|
+
* 数据了」—— 只盯 `end` 的话,客户端中途断开会让这个 Promise 永远不 settle(在飞连接泄漏)。
|
|
49
|
+
*/
|
|
50
|
+
function readBody(req) {
|
|
51
|
+
return new Promise((resolvePromise) => {
|
|
42
52
|
const chunks = [];
|
|
43
53
|
let size = 0;
|
|
44
54
|
let done = false;
|
|
@@ -60,6 +70,42 @@ export function startHttpTransport(core, opts) {
|
|
|
60
70
|
req.on('error', () => finish(null));
|
|
61
71
|
req.on('close', () => finish(null));
|
|
62
72
|
});
|
|
73
|
+
}
|
|
74
|
+
/** 报文里的 JSON-RPC `id`(兜底那一支要用它回 `-32603`);**不是数字 / 字符串 / null 就回 null** */
|
|
75
|
+
function jsonRpcIdOf(msg) {
|
|
76
|
+
const rawId = msg.id;
|
|
77
|
+
return typeof rawId === 'number' || typeof rawId === 'string' || rawId === null ? rawId : null;
|
|
78
|
+
}
|
|
79
|
+
/** 起监听并算出对外 URL(端口 0 = 让内核挑一个;拿不到地址则返回 `undefined`) */
|
|
80
|
+
function startListening(server, port, host, path) {
|
|
81
|
+
return new Promise((resolvePromise, rejectPromise) => {
|
|
82
|
+
server.once('error', rejectPromise);
|
|
83
|
+
server.listen(port, host, () => {
|
|
84
|
+
const addr = server.address();
|
|
85
|
+
resolvePromise(addr !== null && typeof addr === 'object'
|
|
86
|
+
? `http://${host}:${addr.port}${path}`
|
|
87
|
+
: undefined);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* 关掉自有 server。
|
|
93
|
+
* ⚠️ 仍在飞的连接会吊住 `close` 的回调(Node ≥ 18.2 有 `closeAllConnections`;旧版没有则
|
|
94
|
+
* 靠 `abortAll` 之后工具自行收尾 —— 读 signal 的工具会退出,连接随之结束)。
|
|
95
|
+
*/
|
|
96
|
+
function closeOwnServer(server) {
|
|
97
|
+
return new Promise((resolvePromise) => {
|
|
98
|
+
server.close(() => resolvePromise());
|
|
99
|
+
server.closeAllConnections?.();
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
export function startHttpTransport(core, opts) {
|
|
103
|
+
const host = opts.host ?? '127.0.0.1';
|
|
104
|
+
const path = opts.path ?? '/mcp';
|
|
105
|
+
const shared = opts.server !== undefined;
|
|
106
|
+
const server = opts.server ?? createServer();
|
|
107
|
+
/** initialize 响应发的会话 id(生成的 uuid;无状态 server 只发不校验 —— 宽容是有意的) */
|
|
108
|
+
const sessionId = randomUUID();
|
|
63
109
|
const onRequest = async (req, res) => {
|
|
64
110
|
const pathname = new URL(req.url ?? '/', 'http://localhost').pathname;
|
|
65
111
|
if (pathname !== path) {
|
|
@@ -76,7 +122,7 @@ export function startHttpTransport(core, opts) {
|
|
|
76
122
|
// ② 在**方法 / 路径判定之前**:未鉴权一律 401,不泄露 endpoint 存在性。
|
|
77
123
|
// 宿主的分支顺序是「免鉴权组的 405 先于鉴权,其余先鉴权再判方法与路径」
|
|
78
124
|
// (`transport/http-route.ts`),此前这里把 DELETE/405 摆在鉴权前面,
|
|
79
|
-
// 于是未鉴权能拿到 `405 allow: POST, DELETE` 与 `DELETE → 200`(2026-09-27
|
|
125
|
+
// 于是未鉴权能拿到 `405 allow: POST, DELETE` 与 `DELETE → 200`(2026-09-27 ref-mcp-reverse-bridge)。
|
|
80
126
|
// 自己这条 path 的判定不在此列:它只是「这个请求是不是我的」,别的路径原样交回宿主。
|
|
81
127
|
if (opts.auth) {
|
|
82
128
|
try {
|
|
@@ -158,8 +204,7 @@ export function startHttpTransport(core, opts) {
|
|
|
158
204
|
// 一读就抛)、或惰性 client 构造失败(默认 `createAnthropicClient()` 缺 API key)。
|
|
159
205
|
// 这些是**请求级**的意外 ⇒ 该回一条 JSON-RPC 错误并继续服务,而不是退出进程。
|
|
160
206
|
console.error('[agentia:mcp-server] 请求处理异常:', e);
|
|
161
|
-
const
|
|
162
|
-
const id = typeof rawId === 'number' || typeof rawId === 'string' || rawId === null ? rawId : null;
|
|
207
|
+
const id = jsonRpcIdOf(msg);
|
|
163
208
|
if (res.headersSent) {
|
|
164
209
|
res.end(); // 响应头已定(200 已发):只能收口,状态码改不了了
|
|
165
210
|
}
|
|
@@ -177,15 +222,8 @@ export function startHttpTransport(core, opts) {
|
|
|
177
222
|
let url;
|
|
178
223
|
const ready = shared
|
|
179
224
|
? Promise.resolve()
|
|
180
|
-
:
|
|
181
|
-
|
|
182
|
-
server.listen(opts.port ?? 0, host, () => {
|
|
183
|
-
const addr = server.address();
|
|
184
|
-
if (addr !== null && typeof addr === 'object') {
|
|
185
|
-
url = `http://${host}:${addr.port}${path}`;
|
|
186
|
-
}
|
|
187
|
-
resolvePromise();
|
|
188
|
-
});
|
|
225
|
+
: startListening(server, opts.port ?? 0, host, path).then((u) => {
|
|
226
|
+
url = u;
|
|
189
227
|
});
|
|
190
228
|
let closed = false;
|
|
191
229
|
return {
|
|
@@ -203,12 +241,7 @@ export function startHttpTransport(core, opts) {
|
|
|
203
241
|
server.off('request', onRequest);
|
|
204
242
|
return Promise.resolve();
|
|
205
243
|
}
|
|
206
|
-
return
|
|
207
|
-
server.close(() => resolvePromise());
|
|
208
|
-
// 仍在飞的连接会吊住 close 的回调(Node ≥ 18.2 有 closeAllConnections;旧版没有则
|
|
209
|
-
// 靠 abortAll 之后工具自行收尾 —— 读 signal 的工具会退出,连接随之结束)
|
|
210
|
-
server.closeAllConnections?.();
|
|
211
|
-
});
|
|
244
|
+
return closeOwnServer(server);
|
|
212
245
|
},
|
|
213
246
|
};
|
|
214
247
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-http.js","sourceRoot":"","sources":["../../src/engine/mcp-server-http.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,sDAAsD;AACtD,MAAM,cAAc,GAAG,IAAI,GAAG,IAAI,CAAC;AAEnC
|
|
1
|
+
{"version":3,"file":"mcp-server-http.js","sourceRoot":"","sources":["../../src/engine/mcp-server-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,2 @@
|
|
|
1
1
|
import type { McpCore, McpServer } from './mcp-server.js';
|
|
2
|
-
/**
|
|
3
|
-
* Agentia —— MCP 反向桥的 **stdio 传输**(2026-09-28 自 `mcp-server.ts` 切出,
|
|
4
|
-
* 与正向桥 `integrations/mcp-stdio.ts` 同款排布:桥居中、传输各居其文件)。
|
|
5
|
-
*
|
|
6
|
-
* 形状:stdin/stdout **换行分隔 JSON-RPC**(每行一个完整报文);日志只去 stderr
|
|
7
|
-
* —— stdout 是协议面,往里写一个字节都会污染报文流。
|
|
8
|
-
*
|
|
9
|
-
* **依赖方向(单向,运行期无环)**:本文件从 `mcp-server.js` 只取**类型**
|
|
10
|
-
* (`McpCore` / `McpServer`,编译期擦除),协议与执行**由 `core` 注入**。
|
|
11
|
-
* ⚠️ 与正向桥的差别(那边的 `mcp.ts ↔ mcp-stdio.ts` 是一条**真实的值环**:桥 re-export
|
|
12
|
-
* 连接器、连接器反向 import 桥的共享 helper,靠 ESM 的函数提升与调用时机侥幸无恙)——
|
|
13
|
-
* 这里刻意做成注入式:无环是**构造性**的,不靠运气。
|
|
14
|
-
*/
|
|
15
2
|
export declare function startStdioTransport(core: McpCore): McpServer;
|
|
@@ -12,15 +12,52 @@ import { frameLimitText, MAX_FRAME_CHARS } from '../core/line-framing.js';
|
|
|
12
12
|
* 连接器、连接器反向 import 桥的共享 helper,靠 ESM 的函数提升与调用时机侥幸无恙)——
|
|
13
13
|
* 这里刻意做成注入式:无环是**构造性**的,不靠运气。
|
|
14
14
|
*/
|
|
15
|
+
/**
|
|
16
|
+
* 派发一行(2026-10-11 自 `onData` 里提到模块级:它是纯件 —— 只依赖这一行、`core` 与
|
|
17
|
+
* 「还开着吗」这一个读数,留在闭包里 `startStdioTransport` 有 **88 行 / 占文件 85%**
|
|
18
|
+
* 〔**修前**读数,文件 104 行〕。⚠️ **别把「修后多少」写在这里** —— 那是个会腐烂的比例,
|
|
19
|
+
* 能现算:把 `tests/architecture/method-size.test.ts` 的上限临时改成 0 跑一次就是全表)。
|
|
20
|
+
*
|
|
21
|
+
* 两个刻意的处置(搬迁时一字未改):
|
|
22
|
+
* ① **坏 JSON 由协议侧定义形状**回 `-32700` —— 传输层不该知道 JSON-RPC 的错误码
|
|
23
|
+
* (见 `McpCore.rpcError`);
|
|
24
|
+
* ② 分派自身抛错**吞掉**:`callTool` 内部已兜住工具错,真漏出来的也不许把 server 带崩。
|
|
25
|
+
*/
|
|
26
|
+
function dispatchLine(line, core, isClosed) {
|
|
27
|
+
let msg;
|
|
28
|
+
try {
|
|
29
|
+
msg = JSON.parse(line);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
process.stdout.write(`${JSON.stringify(core.rpcError(null, -32700, '行不是合法 JSON'))}\n`);
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const ac = new AbortController();
|
|
36
|
+
const signal = core.trackCall(ac);
|
|
37
|
+
void core
|
|
38
|
+
.dispatch(msg, signal)
|
|
39
|
+
.then((resp) => {
|
|
40
|
+
if (resp !== null && !isClosed()) {
|
|
41
|
+
process.stdout.write(`${JSON.stringify(resp)}\n`);
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
.catch(() => {
|
|
45
|
+
/* 分派自身不该抛(callTool 内部已兜住);真抛了也不许把 server 带崩 */
|
|
46
|
+
})
|
|
47
|
+
.finally(() => core.untrackCall(ac));
|
|
48
|
+
}
|
|
15
49
|
export function startStdioTransport(core) {
|
|
16
50
|
// stdout 的 error **必须吞**:宿主先关读端、stdin 仍开着时,下一次应答写入就是异步
|
|
17
|
-
// `write EPIPE` —— 未捕获会把 server 打成栈回溯 + exit 1(2026-09-27
|
|
51
|
+
// `write EPIPE` —— 未捕获会把 server 打成栈回溯 + exit 1(2026-09-27 ref-mcp-reverse-bridge),而它只是
|
|
18
52
|
// 「对端没了」的次生现象,不是根因。正向连接器对子进程 stdin 是同一处置
|
|
19
53
|
// (`integrations/mcp-stdio.ts` 的 `p.stdin?.on('error', () => {})`),方向对称。
|
|
20
54
|
// 吞掉 ≠ 静默:真该知道的人(宿主)已经从自己的管道拿到 EOF 了。
|
|
21
|
-
|
|
55
|
+
// 监听器挂在**进程级** stdout 上 ⇒ close 时必须摘掉,否则多次 createMcpServer 会累积
|
|
56
|
+
// (stdin 的 data 监听是 per-close 摘的,stdout 这条漏了 —— 深度评审 2026-10-13 低等项)。
|
|
57
|
+
const onStdoutError = () => {
|
|
22
58
|
/* EPIPE:对端已走 */
|
|
23
|
-
}
|
|
59
|
+
};
|
|
60
|
+
process.stdout.on('error', onStdoutError);
|
|
24
61
|
let buf = '';
|
|
25
62
|
let closed = false;
|
|
26
63
|
/**
|
|
@@ -63,28 +100,7 @@ export function startStdioTransport(core) {
|
|
|
63
100
|
buf = buf.slice(nl + 1);
|
|
64
101
|
if (line.trim() === '')
|
|
65
102
|
continue;
|
|
66
|
-
|
|
67
|
-
try {
|
|
68
|
-
msg = JSON.parse(line);
|
|
69
|
-
}
|
|
70
|
-
catch {
|
|
71
|
-
// 坏报文由**协议侧**定义形状:传输层不该知道 JSON-RPC 的错误码(见 McpCore.rpcError)
|
|
72
|
-
process.stdout.write(`${JSON.stringify(core.rpcError(null, -32700, '行不是合法 JSON'))}\n`);
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
const ac = new AbortController();
|
|
76
|
-
const signal = core.trackCall(ac);
|
|
77
|
-
void core
|
|
78
|
-
.dispatch(msg, signal)
|
|
79
|
-
.then((resp) => {
|
|
80
|
-
if (resp !== null && !closed) {
|
|
81
|
-
process.stdout.write(`${JSON.stringify(resp)}\n`);
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
.catch(() => {
|
|
85
|
-
/* 分派自身不该抛(callTool 内部已兜住);真抛了也不许把 server 带崩 */
|
|
86
|
-
})
|
|
87
|
-
.finally(() => core.untrackCall(ac));
|
|
103
|
+
dispatchLine(line, core, () => closed);
|
|
88
104
|
}
|
|
89
105
|
};
|
|
90
106
|
process.stdin.setEncoding('utf8');
|
|
@@ -98,6 +114,7 @@ export function startStdioTransport(core) {
|
|
|
98
114
|
closed = true;
|
|
99
115
|
core.abortAll();
|
|
100
116
|
process.stdin.off('data', onData);
|
|
117
|
+
process.stdout.off('error', onStdoutError); // 进程级监听:不摘会随多次 create 累积
|
|
101
118
|
process.stdin.pause(); // 摘掉读端,宿主进程的事件循环不再被我们吊住
|
|
102
119
|
return Promise.resolve();
|
|
103
120
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-stdio.js","sourceRoot":"","sources":["../../src/engine/mcp-server-stdio.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1E;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CAAC,IAAa;IAC/C,uDAAuD;IACvD,
|
|
1
|
+
{"version":3,"file":"mcp-server-stdio.js","sourceRoot":"","sources":["../../src/engine/mcp-server-stdio.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { IncomingMessage, Server } from 'node:http';
|
|
2
2
|
import type { AgentTool, ModelClient } from '../core/tool.js';
|
|
3
3
|
import type { TraceSink } from '../core/trace.js';
|
|
4
|
+
import type { TraceLimits } from './tracer.js';
|
|
4
5
|
/**
|
|
5
6
|
* Agentia —— **MCP 反向桥**(R8-P5):把 app 的能力菜单暴露成 MCP server
|
|
6
7
|
* (正向桥 `integrations/mcp.ts` 是把外部 MCP server 的工具接进来,本文件是反方向)。
|
|
@@ -35,6 +36,8 @@ import type { TraceSink } from '../core/trace.js';
|
|
|
35
36
|
* metrics 的 `capabilityKindOf` 把它归为 `capability:<name>` 标签,自动进能力指标),
|
|
36
37
|
* 并按 `tool-events.ts` 的口径记同名 `tool.input` / `tool.output` 事件(账目形状与引擎
|
|
37
38
|
* 一致);收尾 snapshot 投递 `opts.sinks`(sink 抛错吞掉 + `console.warn`,观测不击穿业务)。
|
|
39
|
+
* 入站链路(SEP-414):`params._meta.traceparent` 合法时记成 run 根的一条 `links`
|
|
40
|
+
* (与 HTTP 宿主的 `traceparent` 头同款缝合;缺失 / 畸形静默当作孤立根)。
|
|
38
41
|
* `tools/list` / `initialize` 不建 trace。
|
|
39
42
|
*
|
|
40
43
|
* **不做(YAGNI,与正向桥同款清单)**:resources / prompts / sampling(server 反向请求模型)/
|
|
@@ -67,6 +70,18 @@ export interface McpServerOptions {
|
|
|
67
70
|
client?: ModelClient;
|
|
68
71
|
/** trace 出口:每次 `tools/call` 收尾投递(抛错被吞,观测不击穿业务) */
|
|
69
72
|
sinks?: TraceSink[];
|
|
73
|
+
/**
|
|
74
|
+
* 每次 `tools/call` 那棵 trace 的事件数闸(语义与引擎 `traceLimits` **同款**:
|
|
75
|
+
* 超限停记 + run 根两笔 `trace.truncated` 簿记;缺省 = 不限)。子 agent 类工具
|
|
76
|
+
* 在桥内长跑时,没有这道闸 trace 体积就无界。坏值在**构造期**抛 TypeError
|
|
77
|
+
* (与 run 入口的 `resolveTraceLimits` 同一个判定器)。
|
|
78
|
+
*/
|
|
79
|
+
traceLimits?: TraceLimits;
|
|
80
|
+
/**
|
|
81
|
+
* 事件正文截断上限;语义与引擎 `maxEventChars` **同款**(`false` = 不截断,
|
|
82
|
+
* 缺省 = 引擎缺省 `DEFAULT_EVENT_CHARS`)。透传给 tool.input / tool.output 的载荷装配。
|
|
83
|
+
*/
|
|
84
|
+
maxEventChars?: number | false;
|
|
70
85
|
/**
|
|
71
86
|
* 单次 `tools/call` 的工具执行超时(毫秒),语义与引擎 `toolTimeoutMs` **同款**:
|
|
72
87
|
* 非正数 / 不设 = 不限;超时 = **放弃等待**(abort `abandoned` 通知工具自行收尾,
|
|
@@ -2,7 +2,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { stringifySafe } from '../core/json.js';
|
|
3
3
|
import { validateJsonSchema } from '../core/schema.js';
|
|
4
4
|
import { TIMED_OUT, isTimeoutError, withTimeout } from '../core/timeout.js';
|
|
5
|
-
import { TOOL_INPUT_EVENT, TOOL_OUTPUT_EVENT } from '../core/trace.js';
|
|
5
|
+
import { TOOL_INPUT_EVENT, TOOL_OUTPUT_EVENT, parseTraceparent } from '../core/trace.js';
|
|
6
6
|
import { DEFAULT_PROTOCOL_VERSION } from '../integrations/mcp.js';
|
|
7
7
|
import { createAnthropicClient } from '../integrations/anthropic.js';
|
|
8
8
|
import { classifyError } from './errors.js';
|
|
@@ -10,7 +10,7 @@ import { startHttpTransport } from './mcp-server-http.js';
|
|
|
10
10
|
import { startStdioTransport } from './mcp-server-stdio.js';
|
|
11
11
|
import { buildToolRunContext } from './tool-context.js';
|
|
12
12
|
import { toolInputPayload, toolOutputPayload } from './tool-events.js';
|
|
13
|
-
import { TraceRecorder } from './tracer.js';
|
|
13
|
+
import { TraceRecorder, resolveTraceLimits } from './tracer.js';
|
|
14
14
|
/** serverInfo.version 刻意不写真版本字面量(与 DEFAULT_CLIENT_INFO 同纪律,release-surface 按精确版本串计数) */
|
|
15
15
|
const SERVER_INFO_VERSION = '0.0.0';
|
|
16
16
|
/** 造一条 JSON-RPC 错误应答 */
|
|
@@ -21,6 +21,22 @@ function rpcError(id, code, message) {
|
|
|
21
21
|
function rpcResult(id, result) {
|
|
22
22
|
return { jsonrpc: '2.0', id, result };
|
|
23
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* 入站链路(SEP-414):从 `tools/call` 的 params 里取 `_meta.traceparent` 并解析。
|
|
26
|
+
*
|
|
27
|
+
* 纪律(与 HTTP 宿主的 `traceparent` 头同款,见 transport/http-endpoints.ts):
|
|
28
|
+
* `_meta` 缺失 / 非对象、`traceparent` 非字符串或畸形,一律**静默当作「没有上游上下文」**
|
|
29
|
+
* —— 链路到不到是观测行为,不该因为一个坏 `_meta` 把一次工具调用打成协议错误;
|
|
30
|
+
* 也**不造空 TraceContext**(空上下文会把 span 变成孤儿 —— MCP Python SDK 的
|
|
31
|
+
* `extract_trace_context` docstring 给的就是这个理由)。
|
|
32
|
+
*/
|
|
33
|
+
function metaTraceContext(params) {
|
|
34
|
+
const meta = params._meta;
|
|
35
|
+
if (typeof meta !== 'object' || meta === null || Array.isArray(meta))
|
|
36
|
+
return undefined;
|
|
37
|
+
const tp = meta.traceparent;
|
|
38
|
+
return typeof tp === 'string' ? parseTraceparent(tp) : undefined;
|
|
39
|
+
}
|
|
24
40
|
/**
|
|
25
41
|
* 执行一次 `tools/call`:造一棵 trace(run 根 + capability span + tool.input/tool.output
|
|
26
42
|
* 事件),收尾投递 sinks,然后把结果映射成 MCP 形状。
|
|
@@ -28,15 +44,27 @@ function rpcResult(id, result) {
|
|
|
28
44
|
* 独立成顶层函数(而不是 `createMcpServer` 闭包里的一支):它是本文件里最大的一块,
|
|
29
45
|
* 且**只依赖 `deps` 三件**,不碰装配期的任何状态 —— 拆前它藏在 441 行的闭包里无名可分。
|
|
30
46
|
*/
|
|
31
|
-
async function callTool(tool, args, signal, deps
|
|
32
|
-
|
|
33
|
-
|
|
47
|
+
async function callTool(tool, args, signal, deps,
|
|
48
|
+
/** 入站链路(SEP-414):调用方经 `params._meta.traceparent` 带来的上游 span;undefined = 孤立根 */
|
|
49
|
+
link) {
|
|
50
|
+
const { sinks, toolTimeoutMs, maxEventChars } = deps;
|
|
51
|
+
const recorder = new TraceRecorder({
|
|
52
|
+
...(deps.traceLimits?.maxEvents !== undefined ? { maxEvents: deps.traceLimits.maxEvents } : {}),
|
|
53
|
+
});
|
|
34
54
|
const rootId = recorder.begin('run', 'mcp.tools/call', null);
|
|
55
|
+
// 与引擎 run 入口(loop.ts 的 traceContext)同形状:上游被**链接**而不是被继承成
|
|
56
|
+
// 父 span —— 这棵 trace 永远自洽(`traceId == runId` 不变),因果关系仍然可查
|
|
57
|
+
if (link) {
|
|
58
|
+
recorder.addLink(rootId, {
|
|
59
|
+
traceId: link.traceId,
|
|
60
|
+
...(link.spanId ? { spanId: link.spanId } : {}),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
35
63
|
const capId = recorder.begin('capability', tool.name, rootId);
|
|
36
64
|
// tool_use_id 与引擎同义(同名工具并行时靠 id 配对入参/出参事件)
|
|
37
65
|
const use = { type: 'tool_use', id: randomUUID(), name: tool.name, input: args };
|
|
38
66
|
const startedAt = Date.now();
|
|
39
|
-
recorder.event(capId, TOOL_INPUT_EVENT, toolInputPayload(use));
|
|
67
|
+
recorder.event(capId, TOOL_INPUT_EVENT, toolInputPayload(use, maxEventChars));
|
|
40
68
|
// 超时「放弃等待」的通知信号(与引擎 executeOneTool 同款:判超时分支里 abort)
|
|
41
69
|
const abandonAc = new AbortController();
|
|
42
70
|
const toolCtx = buildToolRunContext({
|
|
@@ -80,7 +108,7 @@ async function callTool(tool, args, signal, deps) {
|
|
|
80
108
|
spanError = err;
|
|
81
109
|
}
|
|
82
110
|
}
|
|
83
|
-
recorder.event(capId, TOOL_OUTPUT_EVENT, toolOutputPayload({ use, ok, errorKind, startedAt, now: Date.now(), content }));
|
|
111
|
+
recorder.event(capId, TOOL_OUTPUT_EVENT, toolOutputPayload({ use, ok, errorKind, startedAt, now: Date.now(), content, maxEventChars }));
|
|
84
112
|
recorder.end(capId, ok
|
|
85
113
|
? {}
|
|
86
114
|
: {
|
|
@@ -173,7 +201,7 @@ async function dispatch(msg, signal, deps) {
|
|
|
173
201
|
if (badInput !== null) {
|
|
174
202
|
return rpcError(id, -32602, `工具 ${name} 的入参不满足 inputSchema:${badInput}`);
|
|
175
203
|
}
|
|
176
|
-
return rpcResult(id, await callTool(tool, (rawArgs ?? {}), signal, deps));
|
|
204
|
+
return rpcResult(id, await callTool(tool, (rawArgs ?? {}), signal, deps, metaTraceContext(params)));
|
|
177
205
|
}
|
|
178
206
|
default:
|
|
179
207
|
return rpcError(id, -32601, `method not found: ${method}`);
|
|
@@ -204,6 +232,9 @@ export function createMcpServer(app, opts) {
|
|
|
204
232
|
serverInfo: { name: opts.name ?? 'agentia', version: SERVER_INFO_VERSION },
|
|
205
233
|
sinks: opts.sinks ?? [],
|
|
206
234
|
toolTimeoutMs: opts.toolTimeoutMs,
|
|
235
|
+
// 构造期校验(坏值响亮抛 TypeError,与 run 入口同一个判定器)
|
|
236
|
+
traceLimits: resolveTraceLimits(opts.traceLimits, 'createMcpServer'),
|
|
237
|
+
maxEventChars: opts.maxEventChars,
|
|
207
238
|
clientOf: () => {
|
|
208
239
|
cachedClient ??= opts.client ?? createAnthropicClient();
|
|
209
240
|
return cachedClient;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/engine/mcp-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAG5E,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/engine/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,7 @@ export declare function tailToolUses(messages: MessageParam[]): ToolUseBlock[];
|
|
|
26
26
|
/** 取 MessageParam(请求侧)里的文本块拼成的文本(恢复模式收尾时用) */
|
|
27
27
|
export declare function textOfParam(message: MessageParam): string;
|
|
28
28
|
/**
|
|
29
|
-
* run 事件 → **一条 user 文本消息**(2026-09-28
|
|
29
|
+
* run 事件 → **一条 user 文本消息**(2026-09-28 ref-run-event-input 的 B1:外部永远不能构造 block ——
|
|
30
30
|
* 进来的只有文本,投毒面只到「内容注入」为止)。
|
|
31
31
|
*
|
|
32
32
|
* `eventId` **不进正文**:它是投递簿记(幂等去重依据),不是内容 —— 模型不需要知道
|
|
@@ -37,7 +37,7 @@ export function textOfParam(message) {
|
|
|
37
37
|
.join('\n');
|
|
38
38
|
}
|
|
39
39
|
/**
|
|
40
|
-
* run 事件 → **一条 user 文本消息**(2026-09-28
|
|
40
|
+
* run 事件 → **一条 user 文本消息**(2026-09-28 ref-run-event-input 的 B1:外部永远不能构造 block ——
|
|
41
41
|
* 进来的只有文本,投毒面只到「内容注入」为止)。
|
|
42
42
|
*
|
|
43
43
|
* `eventId` **不进正文**:它是投递簿记(幂等去重依据),不是内容 —— 模型不需要知道
|
package/dist/engine/retry.d.ts
CHANGED
|
@@ -40,6 +40,21 @@ export declare const DEFAULT_RETRY: {
|
|
|
40
40
|
readonly jitter: 0.2;
|
|
41
41
|
};
|
|
42
42
|
export type ResolvedRetry = Required<RetryOptions>;
|
|
43
|
+
/**
|
|
44
|
+
* 校验 `RetryOptions` 的四个数值旋钮 —— **响亮抛 TypeError**,与 client 层
|
|
45
|
+
* `resolveMaxRetries`(integrations/adapter-options.ts)同一条纪律。
|
|
46
|
+
*
|
|
47
|
+
* 坏值的真实后果(2026-10-13 深评 A1,实测):
|
|
48
|
+
* - `maxAttempts: NaN` ⇒ `!(NaN >= 1)` 成立 ⇒ **重试被静默关闭**(run 根快照记
|
|
49
|
+
* `config.retry.maxAttempts: 0`,看着像用户主动关的);
|
|
50
|
+
* - `baseDelayMs: NaN` ⇒ `backoffDelay` 算出 NaN ⇒ `sleep` 的 `assertTimerDelay` 抛
|
|
51
|
+
* RangeError —— 它曾被 turn.ts 退避处的裸 catch 吞成「用户取消」(配置错被谎报);
|
|
52
|
+
* - 延迟超 2^31-1ms ⇒ 被 Node 静默钳到 1ms(远期退避变热重试,单源上限见 core/timeout.ts)。
|
|
53
|
+
*
|
|
54
|
+
* `0` 各有合法读法(`maxAttempts: 0` = 关闭、`baseDelayMs: 0` = 不退避、`jitter: 0` =
|
|
55
|
+
* 不加抖动),不在被拒之列 —— 各旋钮的 0 语义登记在 `core/limits.ts`。
|
|
56
|
+
*/
|
|
57
|
+
export declare function validateRetryOptions(o: RetryOptions | false | undefined): void;
|
|
43
58
|
/** 归一重试配置:`undefined` → 缺省策略(**缺省开启**);`false` → null(关闭)。 */
|
|
44
59
|
export declare function resolveRetry(o: RetryOptions | false | undefined): ResolvedRetry | null;
|
|
45
60
|
/**
|
package/dist/engine/retry.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { zeroClauseOf } from '../core/limits.js';
|
|
2
|
+
import { MAX_TIMER_DELAY_MS, interruptibleSleep } from '../core/timeout.js';
|
|
2
3
|
import { classifyError } from './errors.js';
|
|
3
4
|
/** 缺省重试参数(不含两个函数字段 —— 它们在 resolveRetry 里注入) */
|
|
4
5
|
export const DEFAULT_RETRY = {
|
|
@@ -23,10 +24,54 @@ function definedOnly(o) {
|
|
|
23
24
|
}
|
|
24
25
|
return out;
|
|
25
26
|
}
|
|
27
|
+
/**
|
|
28
|
+
* 校验 `RetryOptions` 的四个数值旋钮 —— **响亮抛 TypeError**,与 client 层
|
|
29
|
+
* `resolveMaxRetries`(integrations/adapter-options.ts)同一条纪律。
|
|
30
|
+
*
|
|
31
|
+
* 坏值的真实后果(2026-10-13 深评 A1,实测):
|
|
32
|
+
* - `maxAttempts: NaN` ⇒ `!(NaN >= 1)` 成立 ⇒ **重试被静默关闭**(run 根快照记
|
|
33
|
+
* `config.retry.maxAttempts: 0`,看着像用户主动关的);
|
|
34
|
+
* - `baseDelayMs: NaN` ⇒ `backoffDelay` 算出 NaN ⇒ `sleep` 的 `assertTimerDelay` 抛
|
|
35
|
+
* RangeError —— 它曾被 turn.ts 退避处的裸 catch 吞成「用户取消」(配置错被谎报);
|
|
36
|
+
* - 延迟超 2^31-1ms ⇒ 被 Node 静默钳到 1ms(远期退避变热重试,单源上限见 core/timeout.ts)。
|
|
37
|
+
*
|
|
38
|
+
* `0` 各有合法读法(`maxAttempts: 0` = 关闭、`baseDelayMs: 0` = 不退避、`jitter: 0` =
|
|
39
|
+
* 不加抖动),不在被拒之列 —— 各旋钮的 0 语义登记在 `core/limits.ts`。
|
|
40
|
+
*/
|
|
41
|
+
export function validateRetryOptions(o) {
|
|
42
|
+
if (o === false || o === undefined)
|
|
43
|
+
return;
|
|
44
|
+
const { maxAttempts, baseDelayMs, maxDelayMs, jitter } = o;
|
|
45
|
+
if (maxAttempts !== undefined && (!Number.isSafeInteger(maxAttempts) || maxAttempts < 0)) {
|
|
46
|
+
throw new TypeError(`retry.maxAttempts 必须是非负安全整数(${zeroClauseOf('RetryOptions.maxAttempts')}),收到 ${String(maxAttempts)} —— ` +
|
|
47
|
+
'NaN / Infinity / 负数 / 小数都会让「重试几次」变成猜的(`!(NaN >= 1)` 成立 ⇒ 重试被静默关闭)');
|
|
48
|
+
}
|
|
49
|
+
for (const [name, v] of [
|
|
50
|
+
['retry.baseDelayMs', baseDelayMs],
|
|
51
|
+
['retry.maxDelayMs', maxDelayMs],
|
|
52
|
+
]) {
|
|
53
|
+
if (v === undefined)
|
|
54
|
+
continue;
|
|
55
|
+
if (typeof v !== 'number' || !Number.isFinite(v) || v < 0 || v > MAX_TIMER_DELAY_MS) {
|
|
56
|
+
throw new TypeError(`${name} 必须是 0 ~ ${MAX_TIMER_DELAY_MS}ms 的有限数` +
|
|
57
|
+
`(${zeroClauseOf(name === 'retry.baseDelayMs' ? 'RetryOptions.baseDelayMs' : 'RetryOptions.maxDelayMs')}),` +
|
|
58
|
+
`收到 ${String(v)} —— NaN 会让退避算成 NaN,超上限会被 Node 钳到 1ms(远期变热重试)`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (jitter !== undefined &&
|
|
62
|
+
(typeof jitter !== 'number' || !Number.isFinite(jitter) || jitter < 0 || jitter > 1)) {
|
|
63
|
+
throw new TypeError(`retry.jitter 必须是 0 ~ 1 的有限数(${zeroClauseOf('RetryOptions.jitter')}),收到 ${String(jitter)} —— ` +
|
|
64
|
+
'>1 会把退避拉成负数再被静默钳回 0(抖动与退避一起失效)');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
26
67
|
/** 归一重试配置:`undefined` → 缺省策略(**缺省开启**);`false` → null(关闭)。 */
|
|
27
68
|
export function resolveRetry(o) {
|
|
28
69
|
if (o === false)
|
|
29
70
|
return null;
|
|
71
|
+
// 数值旋钮坏值响亮失败(见 validateRetryOptions 头注)。runAgent 入口另有一次同款
|
|
72
|
+
// 校验(配置错不收成「失败的 run」);这里保留是因为直连 agentLoop / runAgentScoped
|
|
73
|
+
// 的路径不经过 run 入口。
|
|
74
|
+
validateRetryOptions(o);
|
|
30
75
|
// 用 definedOnly 兜住显式 undefined,否则旧写法会把缺省覆盖掉:
|
|
31
76
|
// `maxAttempts: undefined` → `!(undefined >= 1)` 成立 → **重试被静默关闭**,
|
|
32
77
|
// 而 run 根快照记的是 config.retry.maxAttempts: 0(看起来像用户主动关的);
|
|
@@ -55,7 +100,11 @@ export function backoffDelay(attempt, r) {
|
|
|
55
100
|
const exp = r.baseDelayMs * 2 ** Math.max(0, attempt - 1);
|
|
56
101
|
const capped = Math.min(exp, r.maxDelayMs);
|
|
57
102
|
const jitter = r.jitter > 0 ? capped * r.jitter * (Math.random() * 2 - 1) : 0;
|
|
58
|
-
|
|
103
|
+
// 上界再封一道:`capped ≤ maxDelayMs ≤ 2^31-1` 由入口校验保证,但正向抖动还能把它
|
|
104
|
+
// 推过 Node 定时器的物理上限(maxDelayMs 贴上限 + jitter=1 ⇒ 最多 2 倍)——超上限
|
|
105
|
+
// 的 setTimeout 会被钳到 1ms(远期退避变热重试),这里在交付给 sleep 之前夹住。
|
|
106
|
+
// ⚠️ 用 Math.min 而不是 clampTimerDelay:后者会把 NaN 读成 0,而 NaN 是必须响亮的坏值。
|
|
107
|
+
return Math.min(Math.max(0, Math.round(capped + jitter)), MAX_TIMER_DELAY_MS);
|
|
59
108
|
}
|
|
60
109
|
/**
|
|
61
110
|
* 可被 signal 中断的 sleep(退避期间收到取消就不必再等)。
|
package/dist/engine/retry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/engine/retry.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/engine/retry.ts"],"names":[],"mappings":"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"}
|