@migor/agentia 0.10.2 → 0.10.4
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 +969 -64
- package/LICENSE +1 -1
- package/README.en.md +93 -38
- package/README.md +105 -218
- package/dist/AGENTS.md +234 -41
- 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-sink.d.ts +8 -0
- package/dist/core/trace-sink.js +24 -0
- package/dist/core/trace-sink.js.map +1 -0
- package/dist/core/trace.d.ts +12 -2
- 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 +3 -3
- package/dist/engine/loop.js +99 -56
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/mcp-server-http.js +1 -1
- package/dist/engine/mcp-server-http.js.map +1 -1
- package/dist/engine/mcp-server-stdio.js +7 -3
- package/dist/engine/mcp-server-stdio.js.map +1 -1
- package/dist/engine/mcp-server.d.ts +17 -2
- package/dist/engine/mcp-server.js +42 -17
- 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 +13 -5
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.js.map +1 -1
- package/dist/eval/export.js +2 -2
- package/dist/eval/export.js.map +1 -1
- package/dist/eval/harvest.d.ts +4 -1
- package/dist/eval/harvest.js +32 -6
- package/dist/eval/harvest.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.js +5 -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 +0 -16
- package/dist/integrations/file-sink.js +24 -6
- package/dist/integrations/file-sink.js.map +1 -1
- package/dist/integrations/mcp-http.js +4 -3
- package/dist/integrations/mcp-http.js.map +1 -1
- package/dist/integrations/mcp-protocol.d.ts +35 -10
- package/dist/integrations/mcp-protocol.js +19 -1
- package/dist/integrations/mcp-protocol.js.map +1 -1
- package/dist/integrations/mcp-stdio.js +91 -50
- 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 +17 -6
- 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/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/run.d.ts +1 -1
- package/dist/runtime/run.js +19 -17
- package/dist/runtime/run.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 +27 -7
- package/dist/store/store.js +43 -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/discover.js +27 -1
- package/dist/toolkit/discover.js.map +1 -1
- package/dist/toolkit/module.js +183 -50
- 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.d.ts +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 +3 -0
- package/dist/transport/async.js +128 -25
- 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.js +7 -3
- package/dist/transport/run-call-options.js.map +1 -1
- package/dist/transport/scheduler.js +5 -0
- package/dist/transport/scheduler.js.map +1 -1
- package/dist/transport/serve.d.ts +92 -0
- package/dist/transport/serve.js +155 -0
- package/dist/transport/serve.js.map +1 -0
- 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 +23 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resume-scanner.js","sourceRoot":"","sources":["../../src/transport/resume-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"resume-scanner.js","sourceRoot":"","sources":["../../src/transport/resume-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,9 +7,13 @@
|
|
|
7
7
|
*/
|
|
8
8
|
export function buildRunCallOptions(input) {
|
|
9
9
|
const { rec, isResume, sessionStore, client, signal, bridgeTraceEvents } = input;
|
|
10
|
-
|
|
10
|
+
// sessionId 在本层**已被消费**(下面换成 session 注入;没配 sessionStore 的在 submit /
|
|
11
|
+
// 派发处已响亮失败),**不随选项透传**:续跑段刻意不注入 session(见下),若让它原样
|
|
12
|
+
// 进 app.run,会撞上那边「程序内直传 sessionId 不生效」的告警 —— 那是给外部调用方的
|
|
13
|
+
// 出声闸(toolkit/module.ts),内部路径不该踩。
|
|
14
|
+
const { sessionId, ...restOptions } = rec.spec.options ?? {};
|
|
11
15
|
return {
|
|
12
|
-
...
|
|
16
|
+
...restOptions,
|
|
13
17
|
// HITL 恢复段**不注入 session**(2026-09-20,spec §10 当日条):恢复段的
|
|
14
18
|
// rec.spec.messages 是挂起段落库的 suspendedMessages —— 已含 loadSession
|
|
15
19
|
// 拼入的完整会话历史,再注入会让 run 层把 store 历史**再 prepend 一遍**
|
|
@@ -29,7 +33,7 @@ export function buildRunCallOptions(input) {
|
|
|
29
33
|
: {}),
|
|
30
34
|
// HITL 恢复段:审批决定随任务落库,重跑时原样进引擎(进程重启不丢)
|
|
31
35
|
...(rec.approvals !== undefined ? { approvals: rec.approvals } : {}),
|
|
32
|
-
// 事件投入口(2026-09-28
|
|
36
|
+
// 事件投入口(2026-09-28 ref-run-event-input):挂起期间投递的事件随记录进引擎,由它在
|
|
33
37
|
// 未决 tool_use 解决之后注入消息流(为什么不能由宿主直接追加进
|
|
34
38
|
// spec.messages 的末尾:见 signalTask 与 engine/loop.ts 的注入点纪律)
|
|
35
39
|
...(rec.pendingEvents !== undefined && rec.pendingEvents.length > 0
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-call-options.js","sourceRoot":"","sources":["../../src/transport/run-call-options.ts"],"names":[],"mappings":"AAyDA;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAA0B;IAC5D,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,KAAK,CAAC;IACjF,
|
|
1
|
+
{"version":3,"file":"run-call-options.js","sourceRoot":"","sources":["../../src/transport/run-call-options.ts"],"names":[],"mappings":"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"}
|
|
@@ -139,6 +139,11 @@ export class Scheduler {
|
|
|
139
139
|
}
|
|
140
140
|
}
|
|
141
141
|
dispatch(job) {
|
|
142
|
+
// drain 感知(2026-10-13 ref-submenu-name-check):runner 停机后 submit 必抛「正在优雅停机」—— 不设这道闸,
|
|
143
|
+
// 停机窗口里每个 tick 都换一条 console.error(纯刷屏;停机语义本来就是「不再往前推」,
|
|
144
|
+
// 跳过 tick 不是故障,不报)。
|
|
145
|
+
if (this.runner.isDraining)
|
|
146
|
+
return;
|
|
142
147
|
// maxInFlight 闸门(仅周期任务):上一片还在跑就跳过本次 tick —— 否则
|
|
143
148
|
// every(1000) + 60s 任务会每个 tick 都派发,任务无上限堆积。
|
|
144
149
|
// Infinity = 闸门关闭:也不追踪(否则 inFlight 集合随 tick 无界增长)。
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/transport/scheduler.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../../src/transport/scheduler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { type Server } from 'node:http';
|
|
2
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
3
|
+
/**
|
|
4
|
+
* 起服务 + 优雅停机 —— 两个**正交**的宿主原语。
|
|
5
|
+
*
|
|
6
|
+
* 为什么需要它们(2026-10-22,`docs/plans/2026-10-22-serve-graceful-shutdown.md`):
|
|
7
|
+
* 参考宿主(`examples/` 各目录的 `src/main.ts`)里约 35 行是「与业务无关的 server 样板」,而这 35 行藏着
|
|
8
|
+
* 四个**静默错** —— keep-alive 连接不关(`close()` 等满超时)、先 close 再 drain(切断在飞请求)、
|
|
9
|
+
* 二次信号被吞(`if (stopping) return` 拦住信号却不放行默认行为)、超时后不退出
|
|
10
|
+
* (`drain()` 返回 `false` 的契约是「本进程此后不再推进任何任务 ⇒ 宿主必须退出」)。
|
|
11
|
+
* 这四条都不是「多写几行」能解决的,是**必须知道才会写**。
|
|
12
|
+
*
|
|
13
|
+
* ## 边界:这不是「做进程级决策」
|
|
14
|
+
*
|
|
15
|
+
* 判据是**谁发起**,不是「有没有碰 process」:
|
|
16
|
+
* - `createApp()` 里偷偷 `listen` / `process.on('SIGTERM')` ⇒ 越界(框架替宿主决定);
|
|
17
|
+
* - 宿主写 `serve(handler, { port })` / 传 `signals: [...]` ⇒ 不越界,与 Nest 的
|
|
18
|
+
* `app.listen()` / `enableShutdownHooks()` 同构(那边的信号订阅**也是显式 opt-in**,
|
|
19
|
+
* 默认关 —— 官方理由是 listener 占资源、一进程多实例会 listener 泄漏)。
|
|
20
|
+
*
|
|
21
|
+
* ⇒ 本文件**不调用 `process.exit`**(退出码与「关池 / 冲 sink 之后再退」是宿主的编排),
|
|
22
|
+
* 也**不在缺省下订阅任何信号**。
|
|
23
|
+
*/
|
|
24
|
+
/** `serve` 的选项。端口给 0 = 由操作系统分配(测试与容器里常用)。 */
|
|
25
|
+
export interface ServeOptions {
|
|
26
|
+
port: number;
|
|
27
|
+
/** 监听地址;缺省所有接口(Node 默认语义)。 */
|
|
28
|
+
host?: string;
|
|
29
|
+
/** listen backlog;缺省 Node 默认。 */
|
|
30
|
+
backlog?: number;
|
|
31
|
+
}
|
|
32
|
+
export interface Served {
|
|
33
|
+
readonly server: Server;
|
|
34
|
+
/** **实际**端口 —— `port: 0` 时是 OS 分配的那个(日志与 e2e 都靠它)。 */
|
|
35
|
+
readonly port: number;
|
|
36
|
+
/**
|
|
37
|
+
* 停止监听并把连接收干净(`gracefulShutdown` 的最后一步也是它)。
|
|
38
|
+
* 单独给出来是为了「只要关服务器、不要 drain」的手动编排。返回是否干净收口。
|
|
39
|
+
*/
|
|
40
|
+
close(opts?: {
|
|
41
|
+
timeoutMs?: number;
|
|
42
|
+
}): Promise<boolean>;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 起监听并等到**真的在听**才 resolve。
|
|
46
|
+
*
|
|
47
|
+
* `EADDRINUSE` / `EACCES` 直接 reject(不 swallow):boot 阶段静默起不来比崩更难查。
|
|
48
|
+
* 返回前把 `error` 监听摘掉,避免后续运行时错误被这个一次性监听吃掉。
|
|
49
|
+
*/
|
|
50
|
+
export declare function serve(handler: (req: IncomingMessage, res: ServerResponse) => unknown, opts: ServeOptions): Promise<Served>;
|
|
51
|
+
export interface GracefulShutdownOptions {
|
|
52
|
+
server: Server;
|
|
53
|
+
/**
|
|
54
|
+
* 排空业务:通常是 `() => handler.drain({ timeoutMs })`(它返回 `Promise<boolean>`)。
|
|
55
|
+
* 返回 `false` 表示没排干净(语义见 `DrainGate`:此后本进程不再推进任何任务 ⇒ 必须退出);
|
|
56
|
+
* 返回别的(含 `undefined`)按「排干净」处理,方便 `async () => { await closePool() }` 这类写法。
|
|
57
|
+
* 抛错按 `false` 处理,**但仍然会关服务器** —— 业务排空失败不该让监听继续挂着。
|
|
58
|
+
*/
|
|
59
|
+
drain: () => unknown;
|
|
60
|
+
/**
|
|
61
|
+
* 要订阅的信号。**不传 = 不订阅**(框架不做进程级决策)。
|
|
62
|
+
* 传了即「宿主显式认领」—— 与 Nest 的 `enableShutdownHooks()` 同构。
|
|
63
|
+
*/
|
|
64
|
+
signals?: readonly NodeJS.Signals[];
|
|
65
|
+
/** 总预算(drain + 关连接共用一份),缺省 15_000;`<= 0` = 不设时限。 */
|
|
66
|
+
timeoutMs?: number;
|
|
67
|
+
/**
|
|
68
|
+
* 第二次信号时调用(通常是 `() => process.exit(1)`)。
|
|
69
|
+
* **不传时不吞信号**:解除本原语的监听,让 Node 默认行为接管(直接终止)——
|
|
70
|
+
* 参考宿主里那句 `if (stopping) return;` 就是反例:信号已被拦截,默认行为不会发生。
|
|
71
|
+
*/
|
|
72
|
+
onSecondSignal?: (signal: NodeJS.Signals) => void;
|
|
73
|
+
/**
|
|
74
|
+
* 停机**完成后**调用一次(`clean` = 业务排空**且**连接关干净)。
|
|
75
|
+
* 典型实现是 `process.exit(clean ? 0 : 1)` —— 本原语自己不 exit(退出码与「关池 / 冲 sink
|
|
76
|
+
* 之后再退」是宿主的编排),这是留给它的缝。
|
|
77
|
+
* 信号触发与手动 `stop()` 都会调;`stop()` 幂等 ⇒ 只会调一次。
|
|
78
|
+
* ⚠️ 它抛错会从 `stop()` 抛出;信号路径上的 `stop()` 没人 await ⇒ 表现为 unhandled
|
|
79
|
+
* rejection —— 宿主钩子的错必须响,本原语不替宿主擦屁股。
|
|
80
|
+
*/
|
|
81
|
+
onShutdown?: (clean: boolean) => void;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* 停机编排:`drain` → `close()` + 关空闲连接 → 等关闭(超时则强收)。
|
|
85
|
+
*
|
|
86
|
+
* 返回**幂等**的 `stop()`:重复 / 并发调用返回**同一个** in-flight promise(不是第二次返回
|
|
87
|
+
* `false` —— 那会让调用方误以为没排干净)。返回 `true` = 业务已排空**且**连接已干净关闭。
|
|
88
|
+
*
|
|
89
|
+
* ⚠️ 顺序不可参数化:先 `close()` 再 `drain()` 会把在飞请求切断(`close()` 只是不再接受
|
|
90
|
+
* 新连接,已建立的连接仍可写)—— 那就把排空这层保护作废了。
|
|
91
|
+
*/
|
|
92
|
+
export declare function gracefulShutdown(opts: GracefulShutdownOptions): () => Promise<boolean>;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { createServer } from 'node:http';
|
|
2
|
+
import { assertTimerDelay, TIMED_OUT, withTimeout } from '../core/timeout.js';
|
|
3
|
+
/**
|
|
4
|
+
* 起监听并等到**真的在听**才 resolve。
|
|
5
|
+
*
|
|
6
|
+
* `EADDRINUSE` / `EACCES` 直接 reject(不 swallow):boot 阶段静默起不来比崩更难查。
|
|
7
|
+
* 返回前把 `error` 监听摘掉,避免后续运行时错误被这个一次性监听吃掉。
|
|
8
|
+
*/
|
|
9
|
+
export function serve(handler, opts) {
|
|
10
|
+
const server = createServer((req, res) => {
|
|
11
|
+
// handler 允许返回 Promise(`HttpHandler` 就是);这里不收它 —— 收与不收都改变不了
|
|
12
|
+
// 「请求已交给 handler」这个事实,而漏掉的 rejection 由 handler 自己负责(它内部已在
|
|
13
|
+
// 端点层把错误转成响应)。用 `void` 显式表态,免得读代码的人以为忘了 await。
|
|
14
|
+
void handler(req, res);
|
|
15
|
+
});
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const onError = (err) => reject(err);
|
|
18
|
+
server.once('error', onError);
|
|
19
|
+
server.listen({
|
|
20
|
+
port: opts.port,
|
|
21
|
+
...(opts.host ? { host: opts.host } : {}),
|
|
22
|
+
...(opts.backlog ? { backlog: opts.backlog } : {}),
|
|
23
|
+
}, () => {
|
|
24
|
+
server.off('error', onError);
|
|
25
|
+
const addr = server.address();
|
|
26
|
+
resolve({
|
|
27
|
+
server,
|
|
28
|
+
port: typeof addr === 'object' && addr !== null ? addr.port : opts.port,
|
|
29
|
+
close: (o) => closeServer(server, budgetOf(o?.timeoutMs)),
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 停机编排:`drain` → `close()` + 关空闲连接 → 等关闭(超时则强收)。
|
|
36
|
+
*
|
|
37
|
+
* 返回**幂等**的 `stop()`:重复 / 并发调用返回**同一个** in-flight promise(不是第二次返回
|
|
38
|
+
* `false` —— 那会让调用方误以为没排干净)。返回 `true` = 业务已排空**且**连接已干净关闭。
|
|
39
|
+
*
|
|
40
|
+
* ⚠️ 顺序不可参数化:先 `close()` 再 `drain()` 会把在飞请求切断(`close()` 只是不再接受
|
|
41
|
+
* 新连接,已建立的连接仍可写)—— 那就把排空这层保护作废了。
|
|
42
|
+
*/
|
|
43
|
+
export function gracefulShutdown(opts) {
|
|
44
|
+
const timeoutMs = opts.timeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;
|
|
45
|
+
let running;
|
|
46
|
+
const stop = () => {
|
|
47
|
+
running ??= runShutdown(opts.server, opts.drain, timeoutMs, opts.onShutdown);
|
|
48
|
+
return running;
|
|
49
|
+
};
|
|
50
|
+
const signals = opts.signals ?? [];
|
|
51
|
+
if (signals.length > 0) {
|
|
52
|
+
let first = true;
|
|
53
|
+
const onSignal = (signal) => {
|
|
54
|
+
if (!first) {
|
|
55
|
+
// 第二次:交还给调用方或 Node 默认行为 —— **不吞**
|
|
56
|
+
if (opts.onSecondSignal) {
|
|
57
|
+
opts.onSecondSignal(signal);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (const s of signals)
|
|
61
|
+
process.off(s, onSignal);
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
first = false;
|
|
65
|
+
void stop();
|
|
66
|
+
};
|
|
67
|
+
for (const s of signals)
|
|
68
|
+
process.on(s, onSignal);
|
|
69
|
+
}
|
|
70
|
+
return stop;
|
|
71
|
+
}
|
|
72
|
+
/** 缺省停机预算 —— 与 `examples/` 各参考宿主的取值一致 */
|
|
73
|
+
const DEFAULT_SHUTDOWN_TIMEOUT_MS = 15_000;
|
|
74
|
+
/** `timeoutMs` → 绝对截止时刻;`undefined` 取缺省,`<= 0` 表示不设时限(Infinity) */
|
|
75
|
+
function budgetOf(timeoutMs) {
|
|
76
|
+
if (timeoutMs === undefined)
|
|
77
|
+
return Date.now() + DEFAULT_SHUTDOWN_TIMEOUT_MS;
|
|
78
|
+
if (timeoutMs <= 0)
|
|
79
|
+
return Number.POSITIVE_INFINITY;
|
|
80
|
+
assertTimerDelay(timeoutMs, 'gracefulShutdown.timeoutMs');
|
|
81
|
+
return Date.now() + timeoutMs;
|
|
82
|
+
}
|
|
83
|
+
async function runShutdown(server, drain, timeoutMs, onShutdown) {
|
|
84
|
+
const deadline = budgetOf(timeoutMs);
|
|
85
|
+
// 先启动排空并接住迟到失败:有限预算到点后不再等它,继续关服务器。
|
|
86
|
+
// 总预算若只包住 closeServer,drain 永不返回时 stop() 也会永不返回。
|
|
87
|
+
const draining = Promise.resolve()
|
|
88
|
+
.then(drain)
|
|
89
|
+
.then((value) => value !== false, () => false);
|
|
90
|
+
let drained;
|
|
91
|
+
if (deadline === Number.POSITIVE_INFINITY) {
|
|
92
|
+
drained = await draining;
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
const remaining = deadline - Date.now();
|
|
96
|
+
if (remaining <= 0) {
|
|
97
|
+
drained = false;
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
const outcome = await withTimeout(draining, remaining);
|
|
101
|
+
drained = outcome === TIMED_OUT ? false : outcome;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
const closed = await closeServer(server, deadline);
|
|
105
|
+
const clean = drained && closed;
|
|
106
|
+
onShutdown?.(clean);
|
|
107
|
+
return clean;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* 停监听 + 收连接。返回**是否在预算内关干净**。
|
|
111
|
+
*
|
|
112
|
+
* 三步缺一不可:
|
|
113
|
+
* 1. `close()` —— 不再接受新连接(回调在「所有连接结束」时触发);
|
|
114
|
+
* 2. `closeIdleConnections()` —— **为 `engines: ">=18"` 的地板而调**。Node **19.0.0** 起
|
|
115
|
+
* `close()` 自己就会收空闲连接(nodejs/node#43522),官方文档的措辞是「19 之后没必要
|
|
116
|
+
* 再配合调它,但调也无害,且对要支持 <19 的库有用」⇒ 在 22 上这行是冗余的,在 18 上
|
|
117
|
+
* 它是承重的(不调的话 `close()` 会等 keep-alive 挂到 `keepAliveTimeout` = 5s,
|
|
118
|
+
* K8s 里表现成滚动更新卡满 gracePeriod 再被 SIGKILL)。⚠️ 官方建议它**在 `close()`
|
|
119
|
+
* 之后**调,避免两次调用之间新进的连接漏掉 —— 本函数正是这个顺序。
|
|
120
|
+
* ⇒ 这条**无法只用行为断言钉住**(新版运行时自带该行为),测试里还要用调用断言。
|
|
121
|
+
* 3. 预算耗尽 → `closeAllConnections()` 强收(否则旧运行时上 `close()` 可能永不回调)。
|
|
122
|
+
* 裸 TCP / 半开请求在新版运行时也可能被 `close()` 提前收掉;测试按运行时分支,
|
|
123
|
+
* 不再把「只能靠预算强收」误写成跨版本不变量。
|
|
124
|
+
*/
|
|
125
|
+
function closeServer(server, deadline) {
|
|
126
|
+
return new Promise((resolve) => {
|
|
127
|
+
let settled = false;
|
|
128
|
+
let timer;
|
|
129
|
+
const finish = (clean) => {
|
|
130
|
+
if (settled)
|
|
131
|
+
return;
|
|
132
|
+
settled = true;
|
|
133
|
+
if (timer)
|
|
134
|
+
clearTimeout(timer);
|
|
135
|
+
resolve(clean);
|
|
136
|
+
};
|
|
137
|
+
if (deadline !== Number.POSITIVE_INFINITY) {
|
|
138
|
+
const delay = Math.max(0, deadline - Date.now());
|
|
139
|
+
timer = setTimeout(() => {
|
|
140
|
+
server.closeAllConnections?.();
|
|
141
|
+
// 强收之后 close 回调通常会紧跟着触发,但**不依赖它**:预算已耗尽,控制权交回宿主
|
|
142
|
+
finish(false);
|
|
143
|
+
}, delay);
|
|
144
|
+
timer.unref?.(); // 定时器不该把进程留住
|
|
145
|
+
}
|
|
146
|
+
server.close((err) => {
|
|
147
|
+
// 没在 listen 的 server 调 close 会回 ERR_SERVER_NOT_RUNNING —— 对宿主来说
|
|
148
|
+
// 「本来就没开」和「关干净了」是同一件事,不该算失败。
|
|
149
|
+
const code = err?.code;
|
|
150
|
+
finish(code === undefined || code === 'ERR_SERVER_NOT_RUNNING');
|
|
151
|
+
});
|
|
152
|
+
server.closeIdleConnections?.();
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=serve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../../src/transport/serve.ts"],"names":[],"mappings":"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"}
|
|
@@ -45,12 +45,18 @@ export interface SignalSupervisorDeps {
|
|
|
45
45
|
approvals: ApprovalSupervisor;
|
|
46
46
|
/** 派发入口(`AsyncRunner.#dispatch`:停机闸 + 唯一派发点 + 停机窗口里的一次告警) */
|
|
47
47
|
dispatch(rec: TaskRecord): void;
|
|
48
|
+
/**
|
|
49
|
+
* cancel 的 per-task 在飞闸读数(2026-10-13 ref-run-root-close):投递进入前等它收口再重判
|
|
50
|
+
* (否则事件落库与 cancelled 落库互相覆盖,两边都说了假话)。
|
|
51
|
+
* ⚠️ 必须在**入链之前**等:链尾一旦被 cancel 当成「在飞推进」等下去就是死等。
|
|
52
|
+
*/
|
|
53
|
+
cancelInflight?(taskId: string): Promise<unknown> | undefined;
|
|
48
54
|
}
|
|
49
55
|
export declare class SignalSupervisor {
|
|
50
56
|
#private;
|
|
51
57
|
constructor(deps: SignalSupervisorDeps);
|
|
52
58
|
/**
|
|
53
|
-
* 投递一个事件给**挂起**的任务(2026-09-28
|
|
59
|
+
* 投递一个事件给**挂起**的任务(2026-09-28 ref-run-event-input,run 事件投入口;
|
|
54
60
|
* `POST /tasks/:id/events` 的宿主方法侧,与 approve/cancel 对称)。
|
|
55
61
|
*
|
|
56
62
|
* 语义(设计稿 §3 逐条的落点):
|
|
@@ -74,7 +80,9 @@ export declare class SignalSupervisor {
|
|
|
74
80
|
* (两条并发事件是两条不同的输入,共享 = 静默丢一条)。与其它恢复路径
|
|
75
81
|
* (approve / 到期唤醒,各有自己的闸)的竞速:进闸后重读再判挡住绝大多数;
|
|
76
82
|
* 剩下的窄窗口与既有「approve × wakeDue 分闸」同类(那两条按挂起原因天然互斥,
|
|
77
|
-
* 事件两种原因都适用,是这个闸新盖的缝 —— 已记在 spec §10 2026-09-28
|
|
83
|
+
* 事件两种原因都适用,是这个闸新盖的缝 —— 已记在 spec §10 2026-09-28 ref-run-event-input)。
|
|
78
84
|
*/
|
|
79
85
|
signalTask(taskId: string, event: TaskEvent): Promise<TaskRecord>;
|
|
86
|
+
/** 该任务上在飞的事件投递链尾(cancel 的等待依据,2026-10-13 ref-run-root-close) */
|
|
87
|
+
inflightFor(taskId: string): Promise<TaskRecord> | undefined;
|
|
80
88
|
}
|
|
@@ -43,7 +43,7 @@ export class SignalSupervisor {
|
|
|
43
43
|
this.#deps = deps;
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
* 投递一个事件给**挂起**的任务(2026-09-28
|
|
46
|
+
* 投递一个事件给**挂起**的任务(2026-09-28 ref-run-event-input,run 事件投入口;
|
|
47
47
|
* `POST /tasks/:id/events` 的宿主方法侧,与 approve/cancel 对称)。
|
|
48
48
|
*
|
|
49
49
|
* 语义(设计稿 §3 逐条的落点):
|
|
@@ -67,9 +67,18 @@ export class SignalSupervisor {
|
|
|
67
67
|
* (两条并发事件是两条不同的输入,共享 = 静默丢一条)。与其它恢复路径
|
|
68
68
|
* (approve / 到期唤醒,各有自己的闸)的竞速:进闸后重读再判挡住绝大多数;
|
|
69
69
|
* 剩下的窄窗口与既有「approve × wakeDue 分闸」同类(那两条按挂起原因天然互斥,
|
|
70
|
-
* 事件两种原因都适用,是这个闸新盖的缝 —— 已记在 spec §10 2026-09-28
|
|
70
|
+
* 事件两种原因都适用,是这个闸新盖的缝 —— 已记在 spec §10 2026-09-28 ref-run-event-input)。
|
|
71
71
|
*/
|
|
72
72
|
signalTask(taskId, event) {
|
|
73
|
+
// cancel 在飞 ⇒ 等它收口再重走一遍(2026-10-13 ref-run-root-close)。**入链之前**等:
|
|
74
|
+
// 链尾会同步登记进 `#inflight`,cancel 侧的「等在飞推进」正等它 —— 进了链再等
|
|
75
|
+
// cancel,就是两边互等的死锁。
|
|
76
|
+
const settling = this.#deps.cancelInflight?.(taskId);
|
|
77
|
+
if (settling) {
|
|
78
|
+
return Promise.resolve(settling)
|
|
79
|
+
.catch(() => undefined)
|
|
80
|
+
.then(() => this.signalTask(taskId, event));
|
|
81
|
+
}
|
|
73
82
|
// 串行化(**不是** approve 那种「共享在飞那次」):两个并发事件是**两条不同的输入**,
|
|
74
83
|
// 共享在飞那次 = 后一条被静默丢掉;各自读-改-写而不互斥 = 双派发(与 resumePending
|
|
75
84
|
// 的重入闸同一个 bug 类)。排成链:前一次落库完,这一次进闸后重读再判
|
|
@@ -86,6 +95,10 @@ export class SignalSupervisor {
|
|
|
86
95
|
this.#inflight.set(taskId, run);
|
|
87
96
|
return run;
|
|
88
97
|
}
|
|
98
|
+
/** 该任务上在飞的事件投递链尾(cancel 的等待依据,2026-10-13 ref-run-root-close) */
|
|
99
|
+
inflightFor(taskId) {
|
|
100
|
+
return this.#inflight.get(taskId);
|
|
101
|
+
}
|
|
89
102
|
async #signalInner(taskId, event) {
|
|
90
103
|
const rec = await this.#deps.store.get(taskId);
|
|
91
104
|
if (!rec)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signal-supervisor.js","sourceRoot":"","sources":["../../src/transport/signal-supervisor.ts"],"names":[],"mappings":"AA8BA;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,KAAK;IAC9B,MAAM,CAAY;IAC3B,YAAY,MAAiB,EAAE,OAAe;QAC5C,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,uBAAuB,GAAG,GAAG,CAAC;AAEpC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,kBAAkB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"signal-supervisor.js","sourceRoot":"","sources":["../../src/transport/signal-supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 到期唤醒的**纯判定** + 挂起读数 —— durable timer(2026-09-28
|
|
2
|
+
* 到期唤醒的**纯判定** + 挂起读数 —— durable timer(2026-09-28 ref-suspend-state-reason 的 timer 侧)。
|
|
3
3
|
*
|
|
4
4
|
* 从 AsyncRunner 里抽出来的第五个协作件(slot-pool → approval-policy → drain-gate →
|
|
5
5
|
* resume-policy → 这里),与 `approval-policy.ts` 是**明确的一对**:挂起的两个原因各有一套闸,
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@migor/agentia",
|
|
3
|
-
"version": "0.10.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.10.4",
|
|
4
|
+
"description": "Declarative agent service framework for TypeScript: decorators + DI declare four capability kinds, durable runs, and per-run traces, cost and metrics. Zero runtime dependencies.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -16,20 +16,33 @@
|
|
|
16
16
|
"dist",
|
|
17
17
|
"CHANGELOG.md"
|
|
18
18
|
],
|
|
19
|
-
"repository": "
|
|
19
|
+
"repository": "migoric/agentia",
|
|
20
20
|
"homepage": "https://agentia-web.pages.dev",
|
|
21
21
|
"bugs": {
|
|
22
|
-
"url": "https://github.com/
|
|
22
|
+
"url": "https://github.com/migoric/agentia/issues"
|
|
23
23
|
},
|
|
24
24
|
"license": "MIT",
|
|
25
25
|
"keywords": [
|
|
26
26
|
"agent",
|
|
27
|
+
"ai-agent",
|
|
28
|
+
"agent-framework",
|
|
29
|
+
"agent-orchestration",
|
|
27
30
|
"llm",
|
|
31
|
+
"typescript",
|
|
32
|
+
"nodejs",
|
|
28
33
|
"anthropic",
|
|
29
34
|
"claude",
|
|
35
|
+
"openai",
|
|
36
|
+
"mcp",
|
|
37
|
+
"model-context-protocol",
|
|
30
38
|
"framework",
|
|
31
|
-
"
|
|
32
|
-
"decorators"
|
|
39
|
+
"dependency-injection",
|
|
40
|
+
"decorators",
|
|
41
|
+
"observability",
|
|
42
|
+
"tracing",
|
|
43
|
+
"opentelemetry",
|
|
44
|
+
"self-hosted",
|
|
45
|
+
"service-framework"
|
|
33
46
|
],
|
|
34
47
|
"engines": {
|
|
35
48
|
"node": ">=18"
|
|
@@ -69,14 +82,14 @@
|
|
|
69
82
|
"bench:otlp": "tsx scripts/bench-otlp-snapshot.ts"
|
|
70
83
|
},
|
|
71
84
|
"devDependencies": {
|
|
72
|
-
"@anthropic-ai/sdk": "^0.
|
|
85
|
+
"@anthropic-ai/sdk": "^0.134.0",
|
|
73
86
|
"@biomejs/biome": "^2.5.14",
|
|
74
|
-
"@grpc/grpc-js": "^1.14.
|
|
87
|
+
"@grpc/grpc-js": "^1.14.6",
|
|
75
88
|
"@grpc/proto-loader": "^0.8.1",
|
|
76
|
-
"@types/node": "^26.5
|
|
89
|
+
"@types/node": "^26.6.5",
|
|
77
90
|
"c8": "^12.0.0",
|
|
78
91
|
"tsx": "^4.19.0",
|
|
79
92
|
"typescript": "^7.0.2",
|
|
80
|
-
"zod": "^4.6.
|
|
93
|
+
"zod": "^4.6.7"
|
|
81
94
|
}
|
|
82
95
|
}
|