@migor/agentia 0.10.3 → 0.10.5
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 +572 -30
- package/LICENSE +1 -1
- package/README.en.md +93 -38
- package/README.md +105 -218
- package/dist/AGENTS.md +227 -30
- package/dist/core/limits.d.ts +8 -0
- package/dist/core/limits.js +9 -0
- package/dist/core/limits.js.map +1 -1
- package/dist/core/tool.d.ts +18 -0
- 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 +4 -1
- package/dist/core/trace.js +14 -0
- package/dist/core/trace.js.map +1 -1
- package/dist/engine/forwarded.d.ts +3 -1
- package/dist/engine/forwarded.js +5 -0
- package/dist/engine/forwarded.js.map +1 -1
- package/dist/engine/loop-result.d.ts +1 -1
- package/dist/engine/loop.d.ts +5 -1
- package/dist/engine/loop.js +16 -1
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/mcp-server.d.ts +2 -2
- package/dist/engine/mcp-server.js +3 -9
- package/dist/engine/mcp-server.js.map +1 -1
- package/dist/engine/run-config.js +3 -0
- package/dist/engine/run-config.js.map +1 -1
- package/dist/engine/spec.d.ts +5 -1
- package/dist/engine/spec.js.map +1 -1
- package/dist/engine/tool-context.d.ts +3 -1
- package/dist/engine/tool-context.js +3 -1
- package/dist/engine/tool-context.js.map +1 -1
- package/dist/engine/tool-events.d.ts +6 -2
- package/dist/engine/tool-events.js +17 -3
- package/dist/engine/tool-events.js.map +1 -1
- package/dist/engine/turn.d.ts +5 -1
- package/dist/engine/turn.js +9 -4
- package/dist/engine/turn.js.map +1 -1
- package/dist/engine/types.d.ts +14 -3
- package/dist/engine/types.js +1 -0
- package/dist/engine/types.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 +13 -3
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/file-sink.d.ts +0 -16
- package/dist/integrations/file-sink.js +22 -4
- package/dist/integrations/file-sink.js.map +1 -1
- package/dist/integrations/mcp-stdio.js +63 -42
- package/dist/integrations/mcp-stdio.js.map +1 -1
- package/dist/integrations/metrics-render.js +16 -5
- package/dist/integrations/metrics-render.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/store.d.ts +6 -1
- package/dist/store/store.js +9 -2
- package/dist/store/store.js.map +1 -1
- package/dist/toolkit/capability-loop.d.ts +92 -0
- package/dist/toolkit/capability-loop.js +81 -0
- package/dist/toolkit/capability-loop.js.map +1 -0
- package/dist/toolkit/discover.js +27 -1
- package/dist/toolkit/discover.js.map +1 -1
- package/dist/toolkit/manifest.d.ts +21 -0
- package/dist/toolkit/manifest.js +38 -0
- package/dist/toolkit/manifest.js.map +1 -0
- package/dist/toolkit/module.d.ts +5 -0
- package/dist/toolkit/module.js +113 -49
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/prompt.d.ts +3 -1
- package/dist/toolkit/prompt.js +10 -0
- package/dist/toolkit/prompt.js.map +1 -1
- package/dist/toolkit/skill.d.ts +3 -1
- package/dist/toolkit/skill.js +2 -0
- package/dist/toolkit/skill.js.map +1 -1
- package/dist/toolkit/subagent.d.ts +4 -2
- package/dist/toolkit/subagent.js +2 -0
- package/dist/toolkit/subagent.js.map +1 -1
- package/dist/toolkit/tool.d.ts +3 -1
- package/dist/toolkit/tool.js +2 -0
- package/dist/toolkit/tool.js.map +1 -1
- package/dist/transport/async.d.ts +2 -4
- package/dist/transport/async.js +14 -7
- package/dist/transport/async.js.map +1 -1
- package/dist/transport/http-endpoints.d.ts +13 -0
- package/dist/transport/http-endpoints.js +101 -28
- package/dist/transport/http-endpoints.js.map +1 -1
- package/dist/transport/http-shapes.d.ts +26 -3
- package/dist/transport/http-shapes.js +12 -2
- package/dist/transport/http-shapes.js.map +1 -1
- package/dist/transport/http.d.ts +46 -2
- package/dist/transport/http.js +43 -18
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/run-call-options.js +3 -0
- package/dist/transport/run-call-options.js.map +1 -1
- package/dist/transport/run-options.d.ts +98 -0
- package/dist/transport/run-options.js +121 -0
- package/dist/transport/run-options.js.map +1 -0
- package/dist/transport/run-outcome.js +3 -0
- package/dist/transport/run-outcome.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/package.json +23 -10
|
@@ -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":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AA4C9E;;;;;GAKG;AACH,MAAM,UAAU,KAAK,CACnB,OAA+D,EAC/D,IAAkB;IAElB,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,4DAA4D;QAC5D,0DAA0D;QAC1D,+CAA+C;QAC/C,KAAK,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,CAAC,GAAU,EAAQ,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CACX;YACE,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACnD,EACD,GAAG,EAAE;YACH,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,CAAC;gBACN,MAAM;gBACN,IAAI,EAAE,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;gBACvE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;aAC1D,CAAC,CAAC;QACL,CAAC,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAmCD;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAA6B;IAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,2BAA2B,CAAC;IAChE,IAAI,OAAqC,CAAC;IAE1C,MAAM,IAAI,GAAG,GAAqB,EAAE;QAClC,OAAO,KAAK,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QAC7E,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,IAAI,KAAK,GAAG,IAAI,CAAC;QACjB,MAAM,QAAQ,GAAG,CAAC,MAAsB,EAAQ,EAAE;YAChD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,kCAAkC;gBAClC,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBACxB,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;oBAC5B,OAAO;gBACT,CAAC;gBACD,KAAK,MAAM,CAAC,IAAI,OAAO;oBAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAClD,OAAO;YACT,CAAC;YACD,KAAK,GAAG,KAAK,CAAC;YACd,KAAK,IAAI,EAAE,CAAC;QACd,CAAC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,OAAO;YAAE,OAAO,CAAC,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yCAAyC;AACzC,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAE3C,mEAAmE;AACnE,SAAS,QAAQ,CAAC,SAA6B;IAC7C,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,2BAA2B,CAAC;IAC7E,IAAI,SAAS,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,iBAAiB,CAAC;IACpD,gBAAgB,CAAC,SAAS,EAAE,4BAA4B,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAAc,EACd,KAAuC,EACvC,SAAiB,EACjB,UAAiD;IAEjD,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,mCAAmC;IACnC,iDAAiD;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE;SAC/B,IAAI,CAAC,KAAK,CAAC;SACX,IAAI,CACH,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,EAC1B,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;IACJ,IAAI,OAAgB,CAAC;IACrB,IAAI,QAAQ,KAAK,MAAM,CAAC,iBAAiB,EAAE,CAAC;QAC1C,OAAO,GAAG,MAAM,QAAQ,CAAC;IAC3B,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACxC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;YACnB,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACvD,OAAO,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QACpD,CAAC;IACH,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,OAAO,IAAI,MAAM,CAAC;IAChC,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,SAAS,WAAW,CAAC,MAAc,EAAE,QAAgB;IACnD,OAAO,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACtC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,KAAiC,CAAC;QAEtC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAQ,EAAE;YACtC,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;QAEF,IAAI,QAAQ,KAAK,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACjD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBACtB,MAAM,CAAC,mBAAmB,EAAE,EAAE,CAAC;gBAC/B,gDAAgD;gBAChD,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,EAAE,KAAK,CAAC,CAAC;YACV,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,aAAa;QAChC,CAAC;QAED,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,gEAAgE;YAChE,6BAA6B;YAC7B,MAAM,IAAI,GAAI,GAAyC,EAAE,IAAI,CAAC;YAC9D,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,wBAAwB,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,oBAAoB,EAAE,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;AACL,CAAC"}
|
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.5",
|
|
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
|
}
|