@migor/agentia 0.2.1 → 0.2.2
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/LICENSE +21 -0
- package/README.en.md +144 -0
- package/README.md +202 -76
- package/dist/AGENTS.md +811 -0
- package/dist/container/container.d.ts +10 -2
- package/dist/container/container.js +27 -3
- package/dist/container/container.js.map +1 -1
- package/dist/core/abort.d.ts +10 -0
- package/dist/core/abort.js +28 -0
- package/dist/core/abort.js.map +1 -0
- package/dist/core/blackboard.d.ts +37 -0
- package/dist/core/blackboard.js +2 -0
- package/dist/core/blackboard.js.map +1 -0
- package/dist/core/json.d.ts +2 -0
- package/dist/core/json.js +4 -0
- package/dist/core/json.js.map +1 -1
- package/dist/core/run.d.ts +18 -0
- package/dist/core/run.js +2 -0
- package/dist/core/run.js.map +1 -0
- package/dist/core/schema.js +2 -2
- package/dist/core/schema.js.map +1 -1
- package/dist/core/tool.d.ts +62 -7
- package/dist/core/trace.d.ts +20 -4
- package/dist/engine/budget.d.ts +49 -0
- package/dist/engine/budget.js +30 -0
- package/dist/engine/budget.js.map +1 -0
- package/dist/engine/concurrency.d.ts +43 -0
- package/dist/engine/concurrency.js +95 -0
- package/dist/engine/concurrency.js.map +1 -0
- package/dist/engine/errors.d.ts +2 -0
- package/dist/engine/errors.js +7 -0
- package/dist/engine/errors.js.map +1 -1
- package/dist/engine/loop.d.ts +35 -10
- package/dist/engine/loop.js +336 -66
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/policy.d.ts +9 -1
- package/dist/engine/policy.js +8 -5
- package/dist/engine/policy.js.map +1 -1
- package/dist/engine/replay.d.ts +8 -5
- package/dist/engine/replay.js +30 -29
- package/dist/engine/replay.js.map +1 -1
- package/dist/engine/retry.d.ts +47 -0
- package/dist/engine/retry.js +51 -0
- package/dist/engine/retry.js.map +1 -0
- package/dist/engine/spec.d.ts +61 -0
- package/dist/{run → engine}/spec.js +4 -1
- package/dist/engine/spec.js.map +1 -0
- package/dist/engine/tracer.d.ts +9 -0
- package/dist/engine/tracer.js +57 -1
- package/dist/engine/tracer.js.map +1 -1
- package/dist/engine/{context.d.ts → trimming.d.ts} +19 -20
- package/dist/engine/trimming.js +238 -0
- package/dist/engine/trimming.js.map +1 -0
- package/dist/engine/types.d.ts +109 -13
- package/dist/engine/types.js +9 -1
- package/dist/engine/types.js.map +1 -1
- package/dist/engine/usage.d.ts +28 -2
- package/dist/engine/usage.js +39 -6
- package/dist/engine/usage.js.map +1 -1
- package/dist/eval/defineEval.d.ts +73 -0
- package/dist/eval/defineEval.js +44 -0
- package/dist/eval/defineEval.js.map +1 -0
- package/dist/eval/scripted.d.ts +26 -0
- package/dist/eval/scripted.js +43 -0
- package/dist/eval/scripted.js.map +1 -0
- package/dist/index.d.ts +60 -35
- package/dist/index.js +38 -20
- package/dist/index.js.map +1 -1
- package/dist/integrations/anthropic.d.ts +53 -0
- package/dist/integrations/anthropic.js +24 -0
- package/dist/integrations/anthropic.js.map +1 -0
- package/dist/integrations/mcp.d.ts +79 -0
- package/dist/integrations/mcp.js +108 -0
- package/dist/integrations/mcp.js.map +1 -0
- package/dist/integrations/metrics.d.ts +131 -0
- package/dist/integrations/metrics.js +488 -0
- package/dist/integrations/metrics.js.map +1 -0
- package/dist/{run → integrations}/openai.d.ts +12 -5
- package/dist/integrations/openai.js +386 -0
- package/dist/integrations/openai.js.map +1 -0
- package/dist/integrations/otlp.js.map +1 -0
- package/dist/integrations/report.d.ts +78 -0
- package/dist/integrations/report.js +257 -0
- package/dist/integrations/report.js.map +1 -0
- package/dist/runtime/context.d.ts +25 -0
- package/dist/{run → runtime}/context.js +8 -1
- package/dist/runtime/context.js.map +1 -0
- package/dist/{run → runtime}/memory.d.ts +1 -1
- package/dist/{run → runtime}/memory.js +3 -1
- package/dist/runtime/memory.js.map +1 -0
- package/dist/{run → runtime}/run.d.ts +22 -5
- package/dist/runtime/run.js +218 -0
- package/dist/runtime/run.js.map +1 -0
- package/dist/runtime/session.d.ts +27 -0
- package/dist/runtime/session.js +16 -0
- package/dist/runtime/session.js.map +1 -0
- package/dist/{run → runtime}/spec.d.ts +16 -2
- package/dist/runtime/spec.js +28 -0
- package/dist/runtime/spec.js.map +1 -0
- package/dist/{run → runtime}/systemPrompt.d.ts +12 -0
- package/dist/{run → runtime}/systemPrompt.js +16 -3
- package/dist/runtime/systemPrompt.js.map +1 -0
- package/dist/{run → runtime}/types.js.map +1 -1
- package/dist/{run → store}/fsStore.d.ts +15 -0
- package/dist/{run → store}/fsStore.js +43 -1
- package/dist/store/fsStore.js.map +1 -0
- package/dist/{run → store}/redisStore.d.ts +19 -1
- package/dist/{run → store}/redisStore.js +33 -6
- package/dist/store/redisStore.js.map +1 -0
- package/dist/{run → store}/sqliteStore.js +22 -1
- package/dist/store/sqliteStore.js.map +1 -0
- package/dist/{run → store}/store.d.ts +25 -3
- package/dist/store/store.js +63 -0
- package/dist/store/store.js.map +1 -0
- package/dist/toolkit/asset.d.ts +7 -6
- package/dist/toolkit/asset.js +7 -6
- package/dist/toolkit/asset.js.map +1 -1
- package/dist/toolkit/collect.d.ts +20 -7
- package/dist/toolkit/collect.js +21 -7
- package/dist/toolkit/collect.js.map +1 -1
- package/dist/toolkit/discover.d.ts +21 -1
- package/dist/toolkit/discover.js +59 -12
- package/dist/toolkit/discover.js.map +1 -1
- package/dist/toolkit/middleware.d.ts +10 -10
- package/dist/toolkit/middleware.js +17 -4
- package/dist/toolkit/middleware.js.map +1 -1
- package/dist/toolkit/module.d.ts +100 -34
- package/dist/toolkit/module.js +112 -36
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/prompt.d.ts +4 -6
- package/dist/toolkit/prompt.js +11 -10
- package/dist/toolkit/prompt.js.map +1 -1
- package/dist/toolkit/skill.d.ts +14 -16
- package/dist/toolkit/skill.js +32 -25
- package/dist/toolkit/skill.js.map +1 -1
- package/dist/toolkit/subagent.d.ts +10 -12
- package/dist/toolkit/subagent.js +23 -21
- package/dist/toolkit/subagent.js.map +1 -1
- package/dist/toolkit/tool.d.ts +19 -11
- package/dist/toolkit/tool.js +11 -8
- package/dist/toolkit/tool.js.map +1 -1
- package/dist/toolkit/zod.d.ts +4 -3
- package/dist/toolkit/zod.js +2 -1
- package/dist/toolkit/zod.js.map +1 -1
- package/dist/transport/async.d.ts +133 -0
- package/dist/transport/async.js +415 -0
- package/dist/transport/async.js.map +1 -0
- package/dist/transport/http.d.ts +146 -0
- package/dist/transport/http.js +387 -0
- package/dist/transport/http.js.map +1 -0
- package/dist/{run → transport}/scheduler.d.ts +9 -1
- package/dist/transport/scheduler.js +133 -0
- package/dist/transport/scheduler.js.map +1 -0
- package/dist/transport/sse.d.ts +43 -0
- package/dist/transport/sse.js +51 -0
- package/dist/transport/sse.js.map +1 -0
- package/dist/{run → transport}/transport.d.ts +1 -1
- package/dist/{run → transport}/transport.js +1 -1
- package/dist/transport/transport.js.map +1 -0
- package/package.json +24 -9
- package/dist/engine/context.js +0 -146
- package/dist/engine/context.js.map +0 -1
- package/dist/run/async.d.ts +0 -59
- package/dist/run/async.js +0 -201
- package/dist/run/async.js.map +0 -1
- package/dist/run/context.d.ts +0 -16
- package/dist/run/context.js.map +0 -1
- package/dist/run/fsStore.js.map +0 -1
- package/dist/run/http.d.ts +0 -47
- package/dist/run/http.js +0 -119
- package/dist/run/http.js.map +0 -1
- package/dist/run/memory.js.map +0 -1
- package/dist/run/openai.js +0 -181
- package/dist/run/openai.js.map +0 -1
- package/dist/run/otlp.js.map +0 -1
- package/dist/run/redisStore.js.map +0 -1
- package/dist/run/run.js +0 -129
- package/dist/run/run.js.map +0 -1
- package/dist/run/scheduler.js +0 -85
- package/dist/run/scheduler.js.map +0 -1
- package/dist/run/spec.js.map +0 -1
- package/dist/run/sqliteStore.js.map +0 -1
- package/dist/run/store.js +0 -28
- package/dist/run/store.js.map +0 -1
- package/dist/run/systemPrompt.js.map +0 -1
- package/dist/run/transport.js.map +0 -1
- /package/dist/{run → integrations}/otlp.d.ts +0 -0
- /package/dist/{run → integrations}/otlp.js +0 -0
- /package/dist/{run → runtime}/types.d.ts +0 -0
- /package/dist/{run → runtime}/types.js +0 -0
- /package/dist/{run → store}/sqliteStore.d.ts +0 -0
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** 缺省积压上限:8 MiB —— 一条 8 MiB 都没被读走的流,已经不是「慢」而是「断了」 */
|
|
2
|
+
export const SSE_DEFAULT_MAX_BUFFERED_BYTES = 8 * 1024 * 1024;
|
|
3
|
+
export function sseWriter(res, opts = {}) {
|
|
4
|
+
const limitBytes = opts.maxBufferedBytes ?? SSE_DEFAULT_MAX_BUFFERED_BYTES;
|
|
5
|
+
let closed = false;
|
|
6
|
+
res.writeHead(200, {
|
|
7
|
+
'content-type': 'text/event-stream; charset=utf-8',
|
|
8
|
+
'cache-control': 'no-cache, no-transform',
|
|
9
|
+
connection: 'keep-alive',
|
|
10
|
+
// 关掉 nginx 一类反代的响应缓冲(否则事件被攒着一起发,流式就没意义了)
|
|
11
|
+
'x-accel-buffering': 'no',
|
|
12
|
+
});
|
|
13
|
+
/** 未落盘字节数;假 res(测试替身)没有该属性时按 0 处理 */
|
|
14
|
+
const buffered = () => (typeof res.writableLength === 'number' ? res.writableLength : 0);
|
|
15
|
+
const emit = (frame) => {
|
|
16
|
+
if (closed)
|
|
17
|
+
return;
|
|
18
|
+
const pending = buffered();
|
|
19
|
+
if (pending > limitBytes) {
|
|
20
|
+
// 下游消费不动:先收口,再通知(通知抛错也不改变「已收口」这个事实)
|
|
21
|
+
closed = true;
|
|
22
|
+
try {
|
|
23
|
+
opts.onBackpressure?.({ bufferedBytes: pending, limitBytes });
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
/* 通知是副作用,不该把收口变崩溃 */
|
|
27
|
+
}
|
|
28
|
+
res.end();
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
res.write(frame);
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
get closed() {
|
|
35
|
+
return closed;
|
|
36
|
+
},
|
|
37
|
+
event(name, data) {
|
|
38
|
+
emit(`event: ${name}\ndata: ${JSON.stringify(data)}\n\n`);
|
|
39
|
+
},
|
|
40
|
+
comment(text) {
|
|
41
|
+
emit(`: ${text}\n\n`);
|
|
42
|
+
},
|
|
43
|
+
close() {
|
|
44
|
+
if (closed)
|
|
45
|
+
return;
|
|
46
|
+
closed = true;
|
|
47
|
+
res.end();
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=sse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/transport/sse.ts"],"names":[],"mappings":"AAwCA,qDAAqD;AACrD,MAAM,CAAC,MAAM,8BAA8B,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9D,MAAM,UAAU,SAAS,CAAC,GAAmB,EAAE,IAAI,GAAqB,EAAE;IACxE,MAAM,UAAU,GAAG,IAAI,CAAC,gBAAgB,IAAI,8BAA8B,CAAC;IAC3E,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE;QACjB,cAAc,EAAE,kCAAkC;QAClD,eAAe,EAAE,wBAAwB;QACzC,UAAU,EAAE,YAAY;QACxB,yCAAyC;QACzC,mBAAmB,EAAE,IAAI;KAC1B,CAAC,CAAC;IAEH,qCAAqC;IACrC,MAAM,QAAQ,GAAG,GAAW,EAAE,CAAC,CAAC,OAAO,GAAG,CAAC,cAAc,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjG,MAAM,IAAI,GAAG,CAAC,KAAa,EAAQ,EAAE;QACnC,IAAI,MAAM;YAAE,OAAO;QACnB,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;YACzB,oCAAoC;YACpC,MAAM,GAAG,IAAI,CAAC;YACd,IAAI,CAAC;gBACH,IAAI,CAAC,cAAc,EAAE,CAAC,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACP,qBAAqB;YACvB,CAAC;YACD,GAAG,CAAC,GAAG,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC,CAAC;IAEF,OAAO;QACL,IAAI,MAAM;YACR,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,KAAK,CAAC,IAAY,EAAE,IAAa;YAC/B,IAAI,CAAC,UAAU,IAAI,WAAW,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC5D,CAAC;QACD,OAAO,CAAC,IAAY;YAClB,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,CAAC;QACxB,CAAC;QACD,KAAK;YACH,IAAI,MAAM;gBAAE,OAAO;YACnB,MAAM,GAAG,IAAI,CAAC;YACd,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { AppCallable } from './async.js';
|
|
2
|
-
import type { RunInvocationOptions } from '
|
|
2
|
+
import type { RunInvocationOptions } from '../engine/spec.js';
|
|
3
3
|
/**
|
|
4
4
|
* Agentia —— 同步 RPC 传输(spec §6.3 同步请求 / §6.6 v1 边界)。
|
|
5
5
|
* 纯适配层:把「任意任务入参 → messages」接 app.run。宿主(HTTP 路由 /
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport/transport.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAEtD;;;;;GAKG;AAEH,gCAAgC;AAChC,MAAM,UAAU,OAAO,CACrB,GAAgB,EAChB,KAAc,EACd,IAA2B;IAE3B,OAAO,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;AACjD,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,iBAAiB,CAC/B,GAAgB;IAEhB,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACpD,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@migor/agentia",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.2.2",
|
|
4
|
+
"description": "面向应用开发的声明式 agent 服务开发框架:装饰器 + DI 声明四类能力,主 agent 编排执行;每次 run 产出结构化结果与可观测调用树(trace、成本、指标),交付可直接上线的服务。",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"types": "dist/index.d.ts",
|
|
@@ -9,6 +9,11 @@
|
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
11
|
"repository": "retrychx/agentia",
|
|
12
|
+
"homepage": "https://agentia-web.pages.dev",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/retrychx/agentia/issues"
|
|
15
|
+
},
|
|
16
|
+
"license": "MIT",
|
|
12
17
|
"keywords": [
|
|
13
18
|
"agent",
|
|
14
19
|
"llm",
|
|
@@ -28,17 +33,27 @@
|
|
|
28
33
|
"packages/*"
|
|
29
34
|
],
|
|
30
35
|
"scripts": {
|
|
31
|
-
"build": "tsc -p tsconfig.json",
|
|
32
|
-
"build:cli": "tsc -p packages/cli/tsconfig.json",
|
|
33
|
-
"
|
|
34
|
-
"
|
|
36
|
+
"build": "tsc -p tsconfig.json && node scripts/copy-assets.mjs",
|
|
37
|
+
"build:cli": "npm run build -w @migor/trace-view && tsc -p packages/cli/tsconfig.json && node packages/cli/scripts/copy-assets.mjs",
|
|
38
|
+
"build:website": "npm run build -w @migor/trace-view && npm run build -w @migor/website",
|
|
39
|
+
"deploy:website": "npm run build:website && npx --yes wrangler@4.131.0 pages deploy packages/website/dist --project-name=agentia-web",
|
|
40
|
+
"prepublishOnly": "node scripts/check-release.mjs && npm run build",
|
|
35
41
|
"dev": "tsx watch src/index.ts",
|
|
36
42
|
"typecheck": "tsc --noEmit -p tsconfig.json",
|
|
37
|
-
"
|
|
38
|
-
"
|
|
43
|
+
"typecheck:tests": "tsc --noEmit -p tsconfig.tests.json",
|
|
44
|
+
"typecheck:types": "tsc --noEmit -p tsconfig.types.json",
|
|
45
|
+
"lint": "biome check .",
|
|
46
|
+
"lint:fix": "biome check --write .",
|
|
47
|
+
"format": "biome format --write .",
|
|
48
|
+
"test": "node --import tsx --test \"tests/**/*.test.ts\" && node --test \"packages/cli/test/*.test.mjs\" && node --test \"packages/trace-view/test/*.test.js\"",
|
|
49
|
+
"e2e": "npm run build && npm run build:cli && tsx scripts/e2e-cli.ts && tsx scripts/e2e-examples.ts",
|
|
50
|
+
"e2e:examples": "npm run build && tsx scripts/e2e-examples.ts",
|
|
51
|
+
"e2e:live": "tsx scripts/e2e-live.ts",
|
|
52
|
+
"e2e:mcp": "npm run build:cli && tsx scripts/e2e-mcp.ts"
|
|
39
53
|
},
|
|
40
54
|
"devDependencies": {
|
|
41
|
-
"@
|
|
55
|
+
"@biomejs/biome": "^2.5.13",
|
|
56
|
+
"@types/node": "^26.5.1",
|
|
42
57
|
"tsx": "^4.19.0",
|
|
43
58
|
"typescript": "^7.0.2",
|
|
44
59
|
"zod": "^4.6.1"
|
package/dist/engine/context.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Agentia —— 长上下文策略的纯函数层(spec §5/§6:compaction / context editing 分清)。
|
|
3
|
-
*
|
|
4
|
-
* 三策略不混:
|
|
5
|
-
* - **context editing**(`trimToolPairs`):清旧 tool_use→tool_result 对,不掉内容、不额外调模型;
|
|
6
|
-
* - **compaction**(`compactMessages`):把旧消息前缀做**服务端摘要**(摘要器由上层注入,可走模型),
|
|
7
|
-
* 只保留最近 N 条 + 一段摘要 —— 新的消息数组仍保证角色交替合法;
|
|
8
|
-
* - **客户端剪裁** = 子 agent 的独立上下文(见 toolkit/subagent.ts)。
|
|
9
|
-
*
|
|
10
|
-
* 不在此自研 token 计数黑名单:`estimateMessages` 只是预算策略的默认启发式
|
|
11
|
-
* (CJK 感知估算,明确标注为估算),上层可注入真实 count_tokens 结果。
|
|
12
|
-
*/
|
|
13
|
-
/**
|
|
14
|
-
* 默认估算(仅预算决策用,非精确记账):CJK 字符按 ~1.5 字/token,
|
|
15
|
-
* 其余(ASCII/拉丁)按 ~4 字符/token。纯字符/4 对中文系统性高估,
|
|
16
|
-
* 会让预算护栏过早触发压缩。
|
|
17
|
-
*/
|
|
18
|
-
export function defaultEstimateTokens(text) {
|
|
19
|
-
let cjk = 0;
|
|
20
|
-
for (const ch of text) {
|
|
21
|
-
const cp = ch.codePointAt(0);
|
|
22
|
-
if ((cp >= 0x3400 && cp <= 0x9fff) || // CJK 统一表意文字(扩展A + 基本区)
|
|
23
|
-
(cp >= 0xf900 && cp <= 0xfaff) || // 兼容表意文字
|
|
24
|
-
(cp >= 0x20000 && cp <= 0x2a6df) || // 扩展B
|
|
25
|
-
(cp >= 0x3000 && cp <= 0x30ff) || // 日文假名 + CJK 标点
|
|
26
|
-
(cp >= 0xff00 && cp <= 0xffef) // 全角字符
|
|
27
|
-
) {
|
|
28
|
-
cjk++;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
const other = text.length - cjk; // 非 BMP 字符按 UTF-16 长度计,属可接受偏差
|
|
32
|
-
return Math.max(1, Math.ceil(cjk / 1.5 + other / 4));
|
|
33
|
-
}
|
|
34
|
-
export function isToolResultMessage(msg) {
|
|
35
|
-
if (msg.role !== 'user')
|
|
36
|
-
return false;
|
|
37
|
-
if (typeof msg.content === 'string')
|
|
38
|
-
return false;
|
|
39
|
-
return msg.content.length > 0 && msg.content.every((b) => b.type === 'tool_result');
|
|
40
|
-
}
|
|
41
|
-
function hasToolUse(msg) {
|
|
42
|
-
if (msg.role !== 'assistant')
|
|
43
|
-
return false;
|
|
44
|
-
if (typeof msg.content === 'string')
|
|
45
|
-
return false;
|
|
46
|
-
return msg.content.some((b) => b.type === 'tool_use');
|
|
47
|
-
}
|
|
48
|
-
function contentToText(content) {
|
|
49
|
-
if (typeof content === 'string')
|
|
50
|
-
return content;
|
|
51
|
-
return content
|
|
52
|
-
.map((b) => {
|
|
53
|
-
switch (b.type) {
|
|
54
|
-
case 'text':
|
|
55
|
-
return b.text;
|
|
56
|
-
case 'tool_use':
|
|
57
|
-
return `${b.name}(${JSON.stringify(b.input)})`;
|
|
58
|
-
case 'tool_result':
|
|
59
|
-
return JSON.stringify(b.content);
|
|
60
|
-
default:
|
|
61
|
-
return JSON.stringify(b);
|
|
62
|
-
}
|
|
63
|
-
})
|
|
64
|
-
.join('\n');
|
|
65
|
-
}
|
|
66
|
-
function contentTokens(content, estimate) {
|
|
67
|
-
if (typeof content === 'string')
|
|
68
|
-
return estimate(content);
|
|
69
|
-
let n = 0;
|
|
70
|
-
for (const b of content) {
|
|
71
|
-
n += 1; // block 自身开销
|
|
72
|
-
n += estimate(contentToText([b]));
|
|
73
|
-
}
|
|
74
|
-
return n;
|
|
75
|
-
}
|
|
76
|
-
/** 整组消息的估算 token(含每条 role 开销)。 */
|
|
77
|
-
export function estimateMessages(messages, estimate = defaultEstimateTokens) {
|
|
78
|
-
let n = 0;
|
|
79
|
-
for (const m of messages) {
|
|
80
|
-
n += estimate(m.role);
|
|
81
|
-
n += contentTokens(m.content, estimate);
|
|
82
|
-
}
|
|
83
|
-
return n;
|
|
84
|
-
}
|
|
85
|
-
/** 把消息渲染成可喂给摘要器的纯文本(role: content)。 */
|
|
86
|
-
export function renderMessages(messages) {
|
|
87
|
-
return messages.map((m) => `${m.role}: ${contentToText(m.content)}`).join('\n\n');
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* context editing:丢弃旧的 tool_use→tool_result 对(超出 keepRecent 的),
|
|
91
|
-
* 保留最近 N 对以及所有非工具消息。逐对整体移除,保角色交替合法。
|
|
92
|
-
* 返回原数组引用(若无需裁剪)或新数组。
|
|
93
|
-
*/
|
|
94
|
-
export function trimToolPairs(messages, opts = {}) {
|
|
95
|
-
const keep = Math.max(0, opts.keepRecent ?? 1);
|
|
96
|
-
const pairs = [];
|
|
97
|
-
for (let i = 0; i + 1 < messages.length; i++) {
|
|
98
|
-
if (hasToolUse(messages[i]) && isToolResultMessage(messages[i + 1])) {
|
|
99
|
-
pairs.push([i, i + 1]);
|
|
100
|
-
i += 1;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
if (pairs.length <= keep)
|
|
104
|
-
return messages; // 无需裁剪(或本就留得下)
|
|
105
|
-
// 丢掉最旧的 (pairs.length - keep) 对,最近的 keep 对与所有非工具消息保留
|
|
106
|
-
const drop = new Set();
|
|
107
|
-
for (let k = 0; k < pairs.length - keep; k++) {
|
|
108
|
-
drop.add(pairs[k][0]);
|
|
109
|
-
drop.add(pairs[k][1]);
|
|
110
|
-
}
|
|
111
|
-
const out = messages.filter((_, i) => !drop.has(i));
|
|
112
|
-
return out.length === messages.length ? messages : out;
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* compaction:把 messages 里“除最近 keepRecent 条”的旧前缀做摘要,替换成一段
|
|
116
|
-
* 摘要消息,尾部保留。产出保证:
|
|
117
|
-
* - 不拆散 (assistant tool_use → user tool_result) 对 —— cut 落到对中间时整体后移;
|
|
118
|
-
* - 角色交替合法 —— 尾段首条是普通 user 时摘要并入之;否则摘要以 user 角色放最前。
|
|
119
|
-
*/
|
|
120
|
-
export async function compactMessages(messages, opts) {
|
|
121
|
-
const keepRecent = Math.max(1, opts.keepRecent ?? 20);
|
|
122
|
-
if (messages.length <= keepRecent)
|
|
123
|
-
return messages;
|
|
124
|
-
let cut = messages.length - keepRecent;
|
|
125
|
-
// cut 若落在一对 tool_result 的开头(前一条是带 tool_use 的 assistant),整对后移进保留段
|
|
126
|
-
while (cut > 1 && cut < messages.length && isToolResultMessage(messages[cut])) {
|
|
127
|
-
cut -= 1;
|
|
128
|
-
}
|
|
129
|
-
const prefix = messages.slice(0, cut);
|
|
130
|
-
const tail = messages.slice(cut);
|
|
131
|
-
const summary = await opts.summarize(renderMessages(prefix));
|
|
132
|
-
const label = `[此前对话摘要]\n${summary}`;
|
|
133
|
-
if (tail.length === 0)
|
|
134
|
-
return [{ role: 'user', content: label }];
|
|
135
|
-
const [first, ...rest] = tail;
|
|
136
|
-
if (first.role === 'user' && !isToolResultMessage(first)) {
|
|
137
|
-
// 并入首条普通 user 消息,保持 user→assistant 交替
|
|
138
|
-
const merged = typeof first.content === 'string'
|
|
139
|
-
? { ...first, content: `${label}\n\n${first.content}` }
|
|
140
|
-
: { ...first, content: [{ type: 'text', text: label }, ...first.content] };
|
|
141
|
-
return [merged, ...rest];
|
|
142
|
-
}
|
|
143
|
-
// 尾段以 assistant 开头:摘要作首条 user(user→assistant 交替合法)
|
|
144
|
-
return [{ role: 'user', content: label }, ...tail];
|
|
145
|
-
}
|
|
146
|
-
//# sourceMappingURL=context.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/engine/context.ts"],"names":[],"mappings":"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"}
|
package/dist/run/async.d.ts
DELETED
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import type Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import type { ModelClient } from '../core/tool.js';
|
|
3
|
-
import type { AgentRunResult } from '../engine/types.js';
|
|
4
|
-
import type { RunStatus } from './types.js';
|
|
5
|
-
import type { RunInvocationOptions } from './spec.js';
|
|
6
|
-
import type { MaybePromise, TaskRecord, TaskStore } from './store.js';
|
|
7
|
-
export interface AsyncRunnerOptions {
|
|
8
|
-
client?: ModelClient;
|
|
9
|
-
store?: TaskStore;
|
|
10
|
-
/** 同时执行的任务上限;缺省不限。超出部分排队等槽位(状态保持 queued) */
|
|
11
|
-
concurrency?: number;
|
|
12
|
-
}
|
|
13
|
-
/** 应用最小调用面(agent 装配无关,避免 run 层向上依赖 toolkit) */
|
|
14
|
-
export interface AppCallable {
|
|
15
|
-
readonly name: string;
|
|
16
|
-
run(messages: Anthropic.MessageParam[], opts?: RunInvocationOptions): Promise<{
|
|
17
|
-
run: {
|
|
18
|
-
runId: string;
|
|
19
|
-
status: RunStatus;
|
|
20
|
-
};
|
|
21
|
-
result: AgentRunResult;
|
|
22
|
-
}>;
|
|
23
|
-
}
|
|
24
|
-
export declare class AsyncRunner {
|
|
25
|
-
#private;
|
|
26
|
-
private readonly app;
|
|
27
|
-
readonly store: TaskStore;
|
|
28
|
-
private readonly client?;
|
|
29
|
-
private readonly concurrency;
|
|
30
|
-
private running;
|
|
31
|
-
private readonly waitQueue;
|
|
32
|
-
constructor(app: AppCallable, opts?: AsyncRunnerOptions);
|
|
33
|
-
/**
|
|
34
|
-
* 提交一次异步任务。入参可为 string / messages / {prompt|text|messages}。
|
|
35
|
-
* 幂等键存在且上一任务未失败 → 直接返回既有记录(去重);失败的同键可产生新任务。
|
|
36
|
-
* 同步门面:同步 store 下立即去重并返回快照;异步 store 下 save 在后台完成、
|
|
37
|
-
* 去重推迟到执行前(见 #execute),返回新建任务的提交时刻快照。
|
|
38
|
-
*/
|
|
39
|
-
submit(input: unknown, opts?: {
|
|
40
|
-
idempotencyKey?: string;
|
|
41
|
-
source?: string;
|
|
42
|
-
options?: RunInvocationOptions;
|
|
43
|
-
}): TaskRecord;
|
|
44
|
-
/** 查任务当前记录(异步 store 下返回 Promise,调用方 await) */
|
|
45
|
-
poll(taskId: string): MaybePromise<TaskRecord | undefined>;
|
|
46
|
-
byIdempotency(key: string): MaybePromise<TaskRecord | undefined>;
|
|
47
|
-
list(): MaybePromise<TaskRecord[]>;
|
|
48
|
-
/** 等到任务终态;超时抛错。 */
|
|
49
|
-
awaitTask(taskId: string, opts?: {
|
|
50
|
-
timeoutMs?: number;
|
|
51
|
-
intervalMs?: number;
|
|
52
|
-
}): Promise<TaskRecord>;
|
|
53
|
-
/**
|
|
54
|
-
* 宿主重启续跑:把 store 里 queued | running 的记录重新派发执行
|
|
55
|
-
* (running 视为进程中断)。返回重派数量(异步 store 下返回 Promise<number>)。
|
|
56
|
-
* 幂等键去重照常生效。
|
|
57
|
-
*/
|
|
58
|
-
resumePending(): number | Promise<number>;
|
|
59
|
-
}
|
package/dist/run/async.js
DELETED
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import { classifyError } from '../engine/errors.js';
|
|
2
|
-
import { normalizeMessages } from './spec.js';
|
|
3
|
-
import { InMemoryTaskStore } from './store.js';
|
|
4
|
-
/**
|
|
5
|
-
* Agentia —— 异步任务宿主(spec §6.3 异步 / §6.5 确定性 / §6.6 换宿主不换语义)。
|
|
6
|
-
*
|
|
7
|
-
* - submit 即回(queued),后台驱动状态机 queued → running → succeeded/failed;
|
|
8
|
-
* - **at-least-once 去重**:同一 idempotencyKey 重复 submit,若上一任务仍在
|
|
9
|
-
* queued/running/succeeded 则直接返回既有记录,不重复执行(失败可重试新任务);
|
|
10
|
-
* - run 记录落 TaskStore(v1 InMemoryTaskStore),trace 随 result 一同保留;
|
|
11
|
-
* DB/队列宿主只需实现 TaskStore。
|
|
12
|
-
*
|
|
13
|
-
* 异步 TaskStore(R6,TaskStore 方法返回 MaybePromise):
|
|
14
|
-
* - 内部执行路径(#execute / awaitTask / resumePending)全部 await 化,两种 store 通吃;
|
|
15
|
-
* - submit/poll/byIdempotency/list 是**同步门面**,为同步 store 保持原有用法与返回类型
|
|
16
|
-
* (http/scheduler/既有调用方零改动)。接异步 store 时:submit 的即时去重无法进行
|
|
17
|
-
* (推迟到 #execute:同键已有 succeeded 记录则采纳其结果、不重复执行),poll 等
|
|
18
|
-
* 返回 Promise 需调用方自行 await。
|
|
19
|
-
*/
|
|
20
|
-
/** store 返回值可能是同步值或 Promise —— 区分用(同步门面只在同步值上工作) */
|
|
21
|
-
function isThenable(x) {
|
|
22
|
-
return !!x && typeof x.then === 'function';
|
|
23
|
-
}
|
|
24
|
-
export class AsyncRunner {
|
|
25
|
-
app;
|
|
26
|
-
store;
|
|
27
|
-
client;
|
|
28
|
-
concurrency;
|
|
29
|
-
running = 0;
|
|
30
|
-
waitQueue = [];
|
|
31
|
-
constructor(app, opts = {}) {
|
|
32
|
-
this.app = app;
|
|
33
|
-
this.app = app;
|
|
34
|
-
this.store = opts.store ?? new InMemoryTaskStore();
|
|
35
|
-
this.client = opts.client;
|
|
36
|
-
this.concurrency = opts.concurrency ?? Number.POSITIVE_INFINITY;
|
|
37
|
-
if (!(this.concurrency > 0)) {
|
|
38
|
-
throw new Error(`concurrency 必须为正数,收到 ${opts.concurrency}`);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* 提交一次异步任务。入参可为 string / messages / {prompt|text|messages}。
|
|
43
|
-
* 幂等键存在且上一任务未失败 → 直接返回既有记录(去重);失败的同键可产生新任务。
|
|
44
|
-
* 同步门面:同步 store 下立即去重并返回快照;异步 store 下 save 在后台完成、
|
|
45
|
-
* 去重推迟到执行前(见 #execute),返回新建任务的提交时刻快照。
|
|
46
|
-
*/
|
|
47
|
-
submit(input, opts = {}) {
|
|
48
|
-
const messages = normalizeMessages(input);
|
|
49
|
-
if (opts.idempotencyKey) {
|
|
50
|
-
const existing = this.store.byIdempotency(opts.idempotencyKey);
|
|
51
|
-
// 异步 store 返回 Promise —— 同步门面无法 await,去重交给 #execute
|
|
52
|
-
if (existing && !isThenable(existing) && existing.status !== 'failed') {
|
|
53
|
-
return { ...existing }; // at-least-once 去重:不重复执行
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const rec = {
|
|
57
|
-
taskId: InMemoryTaskStore.nextTaskId(),
|
|
58
|
-
status: 'queued',
|
|
59
|
-
idempotencyKey: opts.idempotencyKey,
|
|
60
|
-
spec: { messages, options: opts.options, source: opts.source ?? 'async' },
|
|
61
|
-
createdAt: Date.now(),
|
|
62
|
-
};
|
|
63
|
-
const saved = this.store.save(rec);
|
|
64
|
-
if (isThenable(saved)) {
|
|
65
|
-
// 异步落库失败:尽力把任务标记为 failed 重存,避免静默吞错 / unhandled rejection
|
|
66
|
-
saved.catch((e) => {
|
|
67
|
-
rec.status = 'failed';
|
|
68
|
-
rec.error = classifyError(e);
|
|
69
|
-
rec.finishedAt = Date.now();
|
|
70
|
-
void Promise.resolve(this.store.save(rec)).catch(() => { });
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
void this.#execute(rec);
|
|
74
|
-
// 返回浅拷贝:记录会被后台状态机原地推进,调用方拿到的是提交时刻的快照
|
|
75
|
-
return { ...rec };
|
|
76
|
-
}
|
|
77
|
-
/** 查任务当前记录(异步 store 下返回 Promise,调用方 await) */
|
|
78
|
-
poll(taskId) {
|
|
79
|
-
return this.store.get(taskId);
|
|
80
|
-
}
|
|
81
|
-
byIdempotency(key) {
|
|
82
|
-
return this.store.byIdempotency(key);
|
|
83
|
-
}
|
|
84
|
-
list() {
|
|
85
|
-
return this.store.list();
|
|
86
|
-
}
|
|
87
|
-
/** 等到任务终态;超时抛错。 */
|
|
88
|
-
async awaitTask(taskId, opts = {}) {
|
|
89
|
-
const timeoutMs = opts.timeoutMs ?? 30_000;
|
|
90
|
-
const intervalMs = opts.intervalMs ?? 5;
|
|
91
|
-
const start = Date.now();
|
|
92
|
-
for (;;) {
|
|
93
|
-
const rec = await this.store.get(taskId);
|
|
94
|
-
if (!rec)
|
|
95
|
-
throw new Error(`task 不存在: ${taskId}`);
|
|
96
|
-
if (rec.status === 'succeeded' || rec.status === 'failed')
|
|
97
|
-
return rec;
|
|
98
|
-
if (Date.now() - start > timeoutMs) {
|
|
99
|
-
throw new Error(`task ${taskId} 等待超时(${rec.status})`);
|
|
100
|
-
}
|
|
101
|
-
await new Promise((r) => setTimeout(r, intervalMs));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* 宿主重启续跑:把 store 里 queued | running 的记录重新派发执行
|
|
106
|
-
* (running 视为进程中断)。返回重派数量(异步 store 下返回 Promise<number>)。
|
|
107
|
-
* 幂等键去重照常生效。
|
|
108
|
-
*/
|
|
109
|
-
resumePending() {
|
|
110
|
-
const listed = this.store.list();
|
|
111
|
-
if (isThenable(listed))
|
|
112
|
-
return listed.then((recs) => this.#redispatch(recs));
|
|
113
|
-
return this.#redispatch(listed);
|
|
114
|
-
}
|
|
115
|
-
#redispatch(recs) {
|
|
116
|
-
const pending = recs.filter((r) => r.status === 'queued' || r.status === 'running');
|
|
117
|
-
for (const rec of pending) {
|
|
118
|
-
rec.status = 'queued'; // 重新入队,由 #execute 统一推进
|
|
119
|
-
void this.#execute(rec);
|
|
120
|
-
}
|
|
121
|
-
return pending.length;
|
|
122
|
-
}
|
|
123
|
-
async #execute(rec) {
|
|
124
|
-
// 顶层容错:异步 store(网络客户端)任何一处 reject 都不得逃逸成
|
|
125
|
-
// unhandled rejection(Node ≥15 默认终止进程)——任务标记失败尽力落库。
|
|
126
|
-
try {
|
|
127
|
-
// 异步 store 的幂等去重在此补齐(submit 同步门面无法 await):
|
|
128
|
-
// 同键已有 succeeded 记录 → 采纳其结果,不重复执行;queued/running 不采纳 ——
|
|
129
|
-
// 重复执行本就是 at-least-once 允许的行为。同步 store 下 submit 已完成去重,
|
|
130
|
-
// 这里查到的一般是 rec 自身(taskId 相同,直接放行)。
|
|
131
|
-
// 注意(load-bearing):该去重依赖 store.save 先写记录、后写 idem 索引的顺序
|
|
132
|
-
// (见 redisStore 头注释)——索引指向自身时上面的 taskId 相等判断放行。
|
|
133
|
-
if (rec.idempotencyKey) {
|
|
134
|
-
const existing = await this.store.byIdempotency(rec.idempotencyKey);
|
|
135
|
-
if (existing && existing.taskId !== rec.taskId && existing.status === 'succeeded') {
|
|
136
|
-
rec.status = 'succeeded';
|
|
137
|
-
rec.runId = existing.runId;
|
|
138
|
-
rec.result = existing.result;
|
|
139
|
-
rec.error = existing.error;
|
|
140
|
-
rec.finishedAt = Date.now();
|
|
141
|
-
await this.store.save(rec);
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
await this.#acquireSlot();
|
|
146
|
-
try {
|
|
147
|
-
rec.status = 'running';
|
|
148
|
-
rec.startedAt = Date.now();
|
|
149
|
-
await this.store.save(rec);
|
|
150
|
-
try {
|
|
151
|
-
const callOpts = {
|
|
152
|
-
...(rec.spec.options ?? {}),
|
|
153
|
-
client: rec.spec.options?.client ?? this.client,
|
|
154
|
-
idempotencyKey: rec.idempotencyKey,
|
|
155
|
-
rethrow: false, // 硬失败也以 failed 记录落库
|
|
156
|
-
};
|
|
157
|
-
const out = await this.app.run(rec.spec.messages, callOpts);
|
|
158
|
-
rec.runId = out.run.runId;
|
|
159
|
-
rec.status = out.run.status;
|
|
160
|
-
rec.result = out.result;
|
|
161
|
-
rec.error = out.result.error;
|
|
162
|
-
}
|
|
163
|
-
catch (e) {
|
|
164
|
-
rec.error = classifyError(e);
|
|
165
|
-
rec.status = 'failed';
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
finally {
|
|
169
|
-
rec.finishedAt = Date.now();
|
|
170
|
-
// 落库失败不遮罩、槽位必须释放
|
|
171
|
-
await Promise.resolve(this.store.save(rec)).catch(() => { });
|
|
172
|
-
this.#releaseSlot();
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
catch (e) {
|
|
176
|
-
rec.status = 'failed';
|
|
177
|
-
rec.error = classifyError(e);
|
|
178
|
-
rec.finishedAt = Date.now();
|
|
179
|
-
await Promise.resolve(this.store.save(rec)).catch(() => { });
|
|
180
|
-
console.error(`[agentia] task ${rec.taskId} 执行异常:`, e);
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
/** 并发槽位:超限则排队等待(任务记录保持 queued,由 store 可见) */
|
|
184
|
-
#acquireSlot() {
|
|
185
|
-
if (this.running < this.concurrency) {
|
|
186
|
-
this.running++;
|
|
187
|
-
return Promise.resolve();
|
|
188
|
-
}
|
|
189
|
-
return new Promise((resolve) => this.waitQueue.push(resolve));
|
|
190
|
-
}
|
|
191
|
-
#releaseSlot() {
|
|
192
|
-
const next = this.waitQueue.shift();
|
|
193
|
-
if (next) {
|
|
194
|
-
next(); // 槽位直接移交给等待者,running 计数不变
|
|
195
|
-
}
|
|
196
|
-
else {
|
|
197
|
-
this.running--;
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
//# sourceMappingURL=async.js.map
|
package/dist/run/async.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"async.js","sourceRoot":"","sources":["../../src/run/async.ts"],"names":[],"mappings":"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"}
|
package/dist/run/context.d.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import type { Run } from './run.js';
|
|
2
|
-
/** 在指定 ctx 下执行(executeRun 内部使用);当前上下文对外以 current() 读取 */
|
|
3
|
-
export declare function withRunContext<T>(ctx: RunContext, fn: () => T | Promise<T>): Promise<T>;
|
|
4
|
-
export declare class RunContext {
|
|
5
|
-
readonly run: Run;
|
|
6
|
-
private readonly blackboard;
|
|
7
|
-
constructor(run: Run);
|
|
8
|
-
/** 当前 run 的上下文。不在 run 内调用时返回 undefined。 */
|
|
9
|
-
static current(): RunContext | undefined;
|
|
10
|
-
get runId(): string;
|
|
11
|
-
get<T>(key: string): T | undefined;
|
|
12
|
-
set(key: string, value: unknown): this;
|
|
13
|
-
has(key: string): boolean;
|
|
14
|
-
delete(key: string): boolean;
|
|
15
|
-
keys(): string[];
|
|
16
|
-
}
|
package/dist/run/context.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/run/context.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;;;;;;;;GASG;AACH,MAAM,KAAK,GAAG,IAAI,iBAAiB,EAAc,CAAC;AAElD,yDAAyD;AACzD,MAAM,UAAU,cAAc,CAAI,GAAe,EAAE,EAAwB;IACzE,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAe,CAAC;AAC1C,CAAC;AAED,MAAM,OAAO,UAAU;IAGA,GAAG;IAFP,UAAU,GAAG,IAAI,GAAG,EAAmB,CAAC;IAEzD,YAAqB,GAAQ;mBAAR,GAAG;IAAQ,CAAC;IAEjC,2CAA2C;IAC3C,MAAM,CAAC,OAAO;QACZ,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;IACxB,CAAC;IAED,GAAG,CAAI,GAAW;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAkB,CAAC;IACnD,CAAC;IACD,GAAG,CAAC,GAAW,EAAE,KAAc;QAC7B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,GAAG,CAAC,GAAW;QACb,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IACD,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACrC,CAAC;CACF"}
|
package/dist/run/fsStore.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fsStore.js","sourceRoot":"","sources":["../../src/run/fsStore.ts"],"names":[],"mappings":"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"}
|
package/dist/run/http.d.ts
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
-
import type { SpanError, Trace } from '../core/trace.js';
|
|
3
|
-
import type { AgentStopReason } from '../engine/types.js';
|
|
4
|
-
import { AsyncRunner } from './async.js';
|
|
5
|
-
import type { AppCallable } from './async.js';
|
|
6
|
-
import type { RunInvocationOptions } from './spec.js';
|
|
7
|
-
import type { RunStatus } from './types.js';
|
|
8
|
-
/**
|
|
9
|
-
* Agentia —— HTTP 宿主(spec §6.6:换宿主不换语义,roadmap R3)。
|
|
10
|
-
*
|
|
11
|
-
* 只产出一个 (req, res) handler,不做 listen —— 交给用户
|
|
12
|
-
* `http.createServer(createHttpHandler(app)).listen(...)`,可挂进任意 Node HTTP 框架。
|
|
13
|
-
*
|
|
14
|
-
* 端点契约(全部 JSON):
|
|
15
|
-
* - POST /run 同步 RPC。body = RunInput(string / messages / {prompt|text|messages}),
|
|
16
|
-
* 走 normalizeMessages 规整后同步执行;200 { runId, status, stopReason,
|
|
17
|
-
* finalText, typed?, trace, error? }。status=failed 也照返 200
|
|
18
|
-
* (rethrow:false 语义:硬失败以 error 字段返回,不用 HTTP 错误码表达);
|
|
19
|
-
* 输入无法规整为 messages → 400 { error }。
|
|
20
|
-
* - POST /tasks 异步任务。body { input, idempotencyKey?, options? } →
|
|
21
|
-
* AsyncRunner.submit → 202 TaskRecord(queued,幂等键去重照常生效)。
|
|
22
|
-
* - GET /tasks/<id> 轮询任务记录 → 200 TaskRecord;不存在 → 404。
|
|
23
|
-
*
|
|
24
|
-
* 方法不符 405;路径不符 404;body 非法 JSON 400。runner 缺省内部 new AsyncRunner(app)。
|
|
25
|
-
*/
|
|
26
|
-
/** POST /run 的响应形态 */
|
|
27
|
-
export interface RunHttpResponse {
|
|
28
|
-
runId: string;
|
|
29
|
-
status: RunStatus;
|
|
30
|
-
stopReason: AgentStopReason;
|
|
31
|
-
finalText: string;
|
|
32
|
-
/** 结构化结果(R2 起应用可携带;无则省略) */
|
|
33
|
-
typed?: unknown;
|
|
34
|
-
trace: Trace;
|
|
35
|
-
error?: SpanError;
|
|
36
|
-
}
|
|
37
|
-
/** POST /tasks 的请求体形态 */
|
|
38
|
-
export interface TaskSubmitBody {
|
|
39
|
-
input: unknown;
|
|
40
|
-
idempotencyKey?: string;
|
|
41
|
-
options?: RunInvocationOptions;
|
|
42
|
-
}
|
|
43
|
-
export interface HttpHandlerOptions {
|
|
44
|
-
/** 异步任务宿主;缺省 new AsyncRunner(app)(InMemoryTaskStore) */
|
|
45
|
-
runner?: AsyncRunner;
|
|
46
|
-
}
|
|
47
|
-
export declare function createHttpHandler(app: AppCallable, opts?: HttpHandlerOptions): (req: IncomingMessage, res: ServerResponse) => Promise<void>;
|