@migor/agentia 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +151 -0
  3. package/README.md +206 -76
  4. package/dist/AGENTS.md +854 -0
  5. package/dist/container/container.d.ts +10 -2
  6. package/dist/container/container.js +27 -3
  7. package/dist/container/container.js.map +1 -1
  8. package/dist/core/abort.d.ts +10 -0
  9. package/dist/core/abort.js +28 -0
  10. package/dist/core/abort.js.map +1 -0
  11. package/dist/core/blackboard.d.ts +37 -0
  12. package/dist/core/blackboard.js +2 -0
  13. package/dist/core/blackboard.js.map +1 -0
  14. package/dist/core/json.d.ts +2 -0
  15. package/dist/core/json.js +4 -0
  16. package/dist/core/json.js.map +1 -1
  17. package/dist/core/run.d.ts +18 -0
  18. package/dist/core/run.js +2 -0
  19. package/dist/core/run.js.map +1 -0
  20. package/dist/core/schema.js +2 -2
  21. package/dist/core/schema.js.map +1 -1
  22. package/dist/core/tool.d.ts +62 -7
  23. package/dist/core/trace.d.ts +20 -4
  24. package/dist/engine/budget.d.ts +49 -0
  25. package/dist/engine/budget.js +30 -0
  26. package/dist/engine/budget.js.map +1 -0
  27. package/dist/engine/concurrency.d.ts +43 -0
  28. package/dist/engine/concurrency.js +95 -0
  29. package/dist/engine/concurrency.js.map +1 -0
  30. package/dist/engine/errors.d.ts +2 -0
  31. package/dist/engine/errors.js +7 -0
  32. package/dist/engine/errors.js.map +1 -1
  33. package/dist/engine/loop.d.ts +35 -10
  34. package/dist/engine/loop.js +336 -66
  35. package/dist/engine/loop.js.map +1 -1
  36. package/dist/engine/policy.d.ts +9 -1
  37. package/dist/engine/policy.js +8 -5
  38. package/dist/engine/policy.js.map +1 -1
  39. package/dist/engine/replay.d.ts +8 -5
  40. package/dist/engine/replay.js +30 -29
  41. package/dist/engine/replay.js.map +1 -1
  42. package/dist/engine/retry.d.ts +47 -0
  43. package/dist/engine/retry.js +51 -0
  44. package/dist/engine/retry.js.map +1 -0
  45. package/dist/{run → engine}/spec.d.ts +24 -4
  46. package/dist/{run → engine}/spec.js +4 -1
  47. package/dist/engine/spec.js.map +1 -0
  48. package/dist/engine/tracer.d.ts +9 -0
  49. package/dist/engine/tracer.js +57 -1
  50. package/dist/engine/tracer.js.map +1 -1
  51. package/dist/engine/{context.d.ts → trimming.d.ts} +19 -20
  52. package/dist/engine/trimming.js +238 -0
  53. package/dist/engine/trimming.js.map +1 -0
  54. package/dist/engine/types.d.ts +109 -13
  55. package/dist/engine/types.js +9 -1
  56. package/dist/engine/types.js.map +1 -1
  57. package/dist/engine/usage.d.ts +28 -2
  58. package/dist/engine/usage.js +39 -6
  59. package/dist/engine/usage.js.map +1 -1
  60. package/dist/eval/defineEval.d.ts +73 -0
  61. package/dist/eval/defineEval.js +44 -0
  62. package/dist/eval/defineEval.js.map +1 -0
  63. package/dist/eval/scripted.d.ts +26 -0
  64. package/dist/eval/scripted.js +43 -0
  65. package/dist/eval/scripted.js.map +1 -0
  66. package/dist/index.d.ts +62 -35
  67. package/dist/index.js +39 -20
  68. package/dist/index.js.map +1 -1
  69. package/dist/integrations/anthropic.d.ts +53 -0
  70. package/dist/integrations/anthropic.js +24 -0
  71. package/dist/integrations/anthropic.js.map +1 -0
  72. package/dist/integrations/mcp.d.ts +79 -0
  73. package/dist/integrations/mcp.js +108 -0
  74. package/dist/integrations/mcp.js.map +1 -0
  75. package/dist/integrations/metrics.d.ts +131 -0
  76. package/dist/integrations/metrics.js +488 -0
  77. package/dist/integrations/metrics.js.map +1 -0
  78. package/dist/{run → integrations}/openai.d.ts +12 -5
  79. package/dist/integrations/openai.js +386 -0
  80. package/dist/integrations/openai.js.map +1 -0
  81. package/dist/integrations/otlp.js.map +1 -0
  82. package/dist/integrations/report.d.ts +78 -0
  83. package/dist/integrations/report.js +257 -0
  84. package/dist/integrations/report.js.map +1 -0
  85. package/dist/runtime/context.d.ts +25 -0
  86. package/dist/{run → runtime}/context.js +8 -1
  87. package/dist/runtime/context.js.map +1 -0
  88. package/dist/{run → runtime}/memory.d.ts +1 -1
  89. package/dist/{run → runtime}/memory.js +3 -1
  90. package/dist/runtime/memory.js.map +1 -0
  91. package/dist/{run → runtime}/run.d.ts +22 -5
  92. package/dist/runtime/run.js +218 -0
  93. package/dist/runtime/run.js.map +1 -0
  94. package/dist/runtime/session.d.ts +27 -0
  95. package/dist/runtime/session.js +16 -0
  96. package/dist/runtime/session.js.map +1 -0
  97. package/dist/{run → runtime}/systemPrompt.d.ts +12 -0
  98. package/dist/{run → runtime}/systemPrompt.js +16 -3
  99. package/dist/runtime/systemPrompt.js.map +1 -0
  100. package/dist/{run → store}/fsStore.d.ts +15 -0
  101. package/dist/{run → store}/fsStore.js +43 -1
  102. package/dist/store/fsStore.js.map +1 -0
  103. package/dist/{run → store}/redisStore.d.ts +19 -1
  104. package/dist/{run → store}/redisStore.js +33 -6
  105. package/dist/store/redisStore.js.map +1 -0
  106. package/dist/{run → store}/sqliteStore.js +22 -1
  107. package/dist/store/sqliteStore.js.map +1 -0
  108. package/dist/{run → store}/store.d.ts +25 -3
  109. package/dist/store/store.js +63 -0
  110. package/dist/store/store.js.map +1 -0
  111. package/dist/toolkit/asset.d.ts +7 -6
  112. package/dist/toolkit/asset.js +7 -6
  113. package/dist/toolkit/asset.js.map +1 -1
  114. package/dist/toolkit/collect.d.ts +20 -7
  115. package/dist/toolkit/collect.js +21 -7
  116. package/dist/toolkit/collect.js.map +1 -1
  117. package/dist/toolkit/discover.d.ts +21 -1
  118. package/dist/toolkit/discover.js +59 -12
  119. package/dist/toolkit/discover.js.map +1 -1
  120. package/dist/toolkit/env.d.ts +47 -0
  121. package/dist/toolkit/env.js +62 -0
  122. package/dist/toolkit/env.js.map +1 -0
  123. package/dist/toolkit/middleware.d.ts +10 -10
  124. package/dist/toolkit/middleware.js +17 -4
  125. package/dist/toolkit/middleware.js.map +1 -1
  126. package/dist/toolkit/module.d.ts +100 -34
  127. package/dist/toolkit/module.js +112 -36
  128. package/dist/toolkit/module.js.map +1 -1
  129. package/dist/toolkit/prompt.d.ts +4 -6
  130. package/dist/toolkit/prompt.js +11 -10
  131. package/dist/toolkit/prompt.js.map +1 -1
  132. package/dist/toolkit/skill.d.ts +14 -16
  133. package/dist/toolkit/skill.js +32 -25
  134. package/dist/toolkit/skill.js.map +1 -1
  135. package/dist/toolkit/subagent.d.ts +10 -12
  136. package/dist/toolkit/subagent.js +23 -21
  137. package/dist/toolkit/subagent.js.map +1 -1
  138. package/dist/toolkit/tool.d.ts +19 -11
  139. package/dist/toolkit/tool.js +11 -8
  140. package/dist/toolkit/tool.js.map +1 -1
  141. package/dist/toolkit/zod.d.ts +4 -3
  142. package/dist/toolkit/zod.js +2 -1
  143. package/dist/toolkit/zod.js.map +1 -1
  144. package/dist/transport/async.d.ts +133 -0
  145. package/dist/transport/async.js +415 -0
  146. package/dist/transport/async.js.map +1 -0
  147. package/dist/transport/http.d.ts +146 -0
  148. package/dist/transport/http.js +387 -0
  149. package/dist/transport/http.js.map +1 -0
  150. package/dist/{run → transport}/scheduler.d.ts +9 -1
  151. package/dist/transport/scheduler.js +133 -0
  152. package/dist/transport/scheduler.js.map +1 -0
  153. package/dist/transport/sse.d.ts +43 -0
  154. package/dist/transport/sse.js +51 -0
  155. package/dist/transport/sse.js.map +1 -0
  156. package/dist/{run → transport}/transport.d.ts +1 -1
  157. package/dist/{run → transport}/transport.js +1 -1
  158. package/dist/transport/transport.js.map +1 -0
  159. package/package.json +24 -9
  160. package/dist/engine/context.js +0 -146
  161. package/dist/engine/context.js.map +0 -1
  162. package/dist/run/async.d.ts +0 -59
  163. package/dist/run/async.js +0 -201
  164. package/dist/run/async.js.map +0 -1
  165. package/dist/run/context.d.ts +0 -16
  166. package/dist/run/context.js.map +0 -1
  167. package/dist/run/fsStore.js.map +0 -1
  168. package/dist/run/http.d.ts +0 -47
  169. package/dist/run/http.js +0 -119
  170. package/dist/run/http.js.map +0 -1
  171. package/dist/run/memory.js.map +0 -1
  172. package/dist/run/openai.js +0 -181
  173. package/dist/run/openai.js.map +0 -1
  174. package/dist/run/otlp.js.map +0 -1
  175. package/dist/run/redisStore.js.map +0 -1
  176. package/dist/run/run.js +0 -129
  177. package/dist/run/run.js.map +0 -1
  178. package/dist/run/scheduler.js +0 -85
  179. package/dist/run/scheduler.js.map +0 -1
  180. package/dist/run/spec.js.map +0 -1
  181. package/dist/run/sqliteStore.js.map +0 -1
  182. package/dist/run/store.js +0 -28
  183. package/dist/run/store.js.map +0 -1
  184. package/dist/run/systemPrompt.js.map +0 -1
  185. package/dist/run/transport.js.map +0 -1
  186. package/dist/run/types.d.ts +0 -12
  187. package/dist/run/types.js +0 -2
  188. package/dist/run/types.js.map +0 -1
  189. /package/dist/{run → integrations}/otlp.d.ts +0 -0
  190. /package/dist/{run → integrations}/otlp.js +0 -0
  191. /package/dist/{run → store}/sqliteStore.d.ts +0 -0
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Agentia —— 有界并发与超时(C2)。零依赖,供「同一回合的并行工具调用」用。
3
+ */
4
+ /**
5
+ * 有界并发 map:最多 `limit` 个 `fn` 同时在飞,**结果顺序与输入一致**
6
+ * (调用方按序拼 tool_result,模型靠 tool_use_id 配对,顺序改动会打乱可读性)。
7
+ *
8
+ * `limit` 非正数或非有限值一律视为**不限**(= 旧行为 `Promise.all`)。
9
+ */
10
+ export async function mapWithConcurrency(items, limit, fn) {
11
+ const results = new Array(items.length);
12
+ if (items.length === 0)
13
+ return results;
14
+ const width = Number.isFinite(limit) && limit > 0 ? Math.min(Math.floor(limit), items.length) : items.length;
15
+ // 取号自增在同步段完成(`next++` 在读 item 之前),所以 worker 之间不会重号。
16
+ let next = 0;
17
+ const worker = async () => {
18
+ for (;;) {
19
+ const i = next++;
20
+ if (i >= items.length)
21
+ return;
22
+ results[i] = await fn(items[i], i);
23
+ }
24
+ };
25
+ await Promise.all(Array.from({ length: width }, worker));
26
+ return results;
27
+ }
28
+ /** 超时哨兵:区分「超时」与「工具恰好返回了 undefined」 */
29
+ export const TIMED_OUT = Symbol('agentia.timed-out');
30
+ /**
31
+ * 给一个 promise 套超时;超时返回 `TIMED_OUT`。
32
+ *
33
+ * ⚠️ **不取消底层** —— `AgentTool.run` 拿不到 signal(那会破坏现有签名),所以
34
+ * 「超时」的语义是**放弃等待**:副作用可能已经发生,只是我们不等了。
35
+ * 想真停下来的工具请自行读 `ToolRunContext.signal`(框架传了,但**不强制**工具中断
36
+ * —— 见 core/tool.ts 的说明:工具副作用无法回滚)。
37
+ *
38
+ * **超时是硬的**(2026-09-14 收紧,见 `docs/spec.md` §10):判定不看竞速结果,而看**实测耗时**。
39
+ * 原因:`Promise.race` 不是硬保证 —— 两个计时器在同一毫秒内建、又因事件循环被饿住而同批到期时,
40
+ * 列表顺序决定谁先 resolve,**超预算的工具能赢过截止计时器**(实测 `60ms 工具 vs 20ms 预算`
41
+ * 在 8 倍 CPU 超订下 1200 次翻转 1 次,记成 `ok: true`,护栏静默失效)。
42
+ * 代价是语义收紧:`21ms 完成 / 20ms 预算` 由「成功」变「超时」—— 这正确,
43
+ * 「预算」本来就是对**实际耗时**的承诺,不是对调度运气的承诺。
44
+ *
45
+ * `timeoutMs` 非正数 = 不设超时(直接返回原 promise)。
46
+ *
47
+ * ⚠️ **截止计时器绝不可 `unref()`**(2026-09-14 修正,见 `docs/spec.md` §10 ④):
48
+ * 这个计时器的**触发本身就是「被 await 的 promise 得以 settle」的条件**。一旦 unref,
49
+ * 当它是事件循环里唯一的把手时,进程会在它触发前直接退出 —— `await` **永不 settle**。
50
+ * 实测(空事件循环、挂死的 promise,Node 22 与 26 一个样):
51
+ *
52
+ * | 计时器 | 结果 |
53
+ * |---|---|
54
+ * | `unref()` | 进程退出(顶层 await 未 settle),**什么都没返回** |
55
+ * | 不 unref | `settled: TIMED_OUT`,exit 0 |
56
+ *
57
+ * 「兜底计时器不该让宿主为它续命」这条理由对**没人 await 的兜底 tick**(scheduler 的下一拍、
58
+ * SSE 心跳、metrics 刷盘)成立,对**「等待的终点」**不成立:那正是调用方在等的东西。
59
+ */
60
+ export async function withTimeout(p, timeoutMs) {
61
+ if (!(timeoutMs > 0))
62
+ return p;
63
+ const startedAt = Date.now();
64
+ // 在**工具 settle 的那个微任务里**记时间,而不是 `await` 恢复之后再记:
65
+ // 微任务紧跟在 resolve 它的那次回调之后跑,所以这个时刻最贴近「工具真正完成」。
66
+ // 若改成 await 恢复后再测,宿主在「工具完成 → 恢复」之间被饿住会把按时完成的工具误判成超时。
67
+ let settledAt = 0;
68
+ const tracked = p.then((v) => {
69
+ settledAt = Date.now();
70
+ return v;
71
+ }, (e) => {
72
+ settledAt = Date.now();
73
+ throw e;
74
+ });
75
+ let timer;
76
+ try {
77
+ const out = await Promise.race([
78
+ tracked,
79
+ new Promise((resolve) => {
80
+ timer = setTimeout(() => resolve(TIMED_OUT), timeoutMs);
81
+ // ⚠️ 不 unref:它的触发是「这个 await 得以结束」的条件(详见函数头注释的实测表)。
82
+ // unref 过它 ⇒ 空事件循环下进程先退出,await 永不 settle。
83
+ }),
84
+ ]);
85
+ // 竞速只当快路径;最终以实测耗时兜底判定(见上面注释里的翻转样本)。
86
+ if (out === TIMED_OUT)
87
+ return TIMED_OUT;
88
+ return settledAt - startedAt >= timeoutMs ? TIMED_OUT : out;
89
+ }
90
+ finally {
91
+ if (timer)
92
+ clearTimeout(timer);
93
+ }
94
+ }
95
+ //# sourceMappingURL=concurrency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"concurrency.js","sourceRoot":"","sources":["../../src/engine/concurrency.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAmB,EACnB,KAAa,EACb,EAA0C;IAE1C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAI,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACvC,MAAM,KAAK,GACT,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IACjG,oDAAoD;IACpD,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,SAAS,CAAC;YACR,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAC9B,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACrC,CAAC;IACH,CAAC,CAAC;IACF,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC;IACzD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sCAAsC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,CAAa,EACb,SAAiB;IAEjB,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,gDAAgD;IAChD,8CAA8C;IAC9C,qDAAqD;IACrD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,EAAE;QACJ,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,OAAO,CAAC,CAAC;IACX,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,CAAC,CAAC;IACV,CAAC,CACF,CAAC;IACF,IAAI,KAAiC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,OAAO;YACP,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,EAAE;gBACxC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;gBACxD,mDAAmD;gBACnD,0CAA0C;YAC5C,CAAC,CAAC;SACH,CAAC,CAAC;QACH,oCAAoC;QACpC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,SAAS,GAAG,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9D,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC"}
@@ -1,3 +1,5 @@
1
1
  import type { SpanError } from '../core/trace.js';
2
+ /** 是否中断异常(DOMException / 普通 Error 都可能是,靠 name 判定) */
3
+ export declare function isAbortError(e: unknown): boolean;
2
4
  /** 把任意异常分类成 trace 可用的 SpanError(可重试 vs 不可重试)。 */
3
5
  export declare function classifyError(e: unknown): SpanError;
@@ -1,6 +1,13 @@
1
1
  import Anthropic from '@anthropic-ai/sdk';
2
+ /** 是否中断异常(DOMException / 普通 Error 都可能是,靠 name 判定) */
3
+ export function isAbortError(e) {
4
+ return typeof e === 'object' && e !== null && e.name === 'AbortError';
5
+ }
2
6
  /** 把任意异常分类成 trace 可用的 SpanError(可重试 vs 不可重试)。 */
3
7
  export function classifyError(e) {
8
+ if (isAbortError(e)) {
9
+ return { type: 'aborted', message: 'run 已被取消', retryable: false };
10
+ }
4
11
  if (e instanceof Anthropic.RateLimitError) {
5
12
  return { type: 'rate_limit', message: e.message, retryable: true };
6
13
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/engine/errors.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,CAAC,YAAY,SAAS,CAAC,cAAc,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,YAAY,SAAS,CAAC,kBAAkB,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,YAAY,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,YAAY,SAAS,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/engine/errors.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAG1C,qDAAqD;AACrD,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAwB,CAAC,IAAI,KAAK,YAAY,CAAC;AAChG,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACpE,CAAC;IACD,IAAI,CAAC,YAAY,SAAS,CAAC,cAAc,EAAE,CAAC;QAC1C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,YAAY,SAAS,CAAC,kBAAkB,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrE,CAAC;IACD,IAAI,CAAC,YAAY,SAAS,CAAC,mBAAmB,EAAE,CAAC;QAC/C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACjE,CAAC;IACD,IAAI,CAAC,YAAY,SAAS,CAAC,QAAQ,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,GAAG,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;IACzF,CAAC;IACD,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IACnE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC"}
@@ -1,6 +1,7 @@
1
- import Anthropic from '@anthropic-ai/sdk';
2
- import type { AgentTool, JsonSchema, ModelClient, RecorderBackend } from '../core/tool.js';
1
+ import type Anthropic from '@anthropic-ai/sdk';
2
+ import type { AgentTool, JsonSchema, ModelClient, ModelPricing, RecorderBackend, SchemaType } from '../core/tool.js';
3
3
  import type { SpanError, SpanId } from '../core/trace.js';
4
+ import type { RetryOptions } from './retry.js';
4
5
  import type { AgentRunResult, AgentStopReason, ContextPolicy, RunAgentOptions, SystemParam } from './types.js';
5
6
  /**
6
7
  * 缺省模型解析:显式传入 > AGENTIA_MODEL env > 'claude-opus-5'。
@@ -8,23 +9,23 @@ import type { AgentRunResult, AgentStopReason, ContextPolicy, RunAgentOptions, S
8
9
  * export AGENTIA_MODEL=deepseek-… 即可全局覆盖,无需逐处传 model。
9
10
  */
10
11
  export declare function resolveDefaultModel(over?: string): string;
11
- export interface AgentLoopResult {
12
+ export interface AgentLoopResult<T = unknown> {
12
13
  stopReason: AgentStopReason;
13
14
  finalText: string;
14
15
  error?: SpanError;
15
16
  /** 本轮循环自己发起的模型往返次数 */
16
17
  iterations: number;
17
- /** submit_result 校验通过的结构化结果;未提交则为 undefined */
18
- typed?: unknown;
18
+ /** submit_result 校验通过的结构化结果;未提交则为 undefined(类型由 resultSchema 推导) */
19
+ typed?: T;
19
20
  }
20
21
  /** 主入口:开 run 根 span,循环跑在其下。返回完整 trace(traceId 即 runId)。 */
21
- export declare function runAgent(options: RunAgentOptions): Promise<AgentRunResult>;
22
+ export declare function runAgent<S extends JsonSchema = JsonSchema>(options: RunAgentOptions<S>): Promise<AgentRunResult<SchemaType<S>>>;
22
23
  /**
23
- * 嵌套单元(子 agent)入口:不自开 run 根,llm.turn 挂在给定 parentSpanId 下的同一条 trace。
24
+ * 嵌套能力(子 agent)入口:不自开 run 根,llm.turn 挂在给定 parentSpanId 下的同一条 trace。
24
25
  * resultSchema 语义与 runAgent 一致(隐藏 submit_result → AgentLoopResult.typed),
25
26
  * 供子 agent 产出结构化结果(见 toolkit/subagent.ts 的交回逻辑)。
26
27
  */
27
- export declare function runAgentScoped(opts: {
28
+ export declare function runAgentScoped<S extends JsonSchema = JsonSchema>(opts: {
28
29
  client?: ModelClient;
29
30
  system?: SystemParam;
30
31
  messages: Anthropic.MessageParam[];
@@ -35,7 +36,31 @@ export declare function runAgentScoped(opts: {
35
36
  recorder: RecorderBackend;
36
37
  parentSpanId: SpanId;
37
38
  onText?: (delta: string) => void;
39
+ /** 中断信号(由发起它的能力从 ToolRunContext.signal 透传,取消能传播到子 agent) */
40
+ signal?: AbortSignal;
41
+ /** 模型请求重试策略(缺省开启) */
42
+ retry?: RetryOptions | false;
38
43
  contextPolicy?: ContextPolicy;
39
44
  /** 结构化结果 schema:存在时追加隐藏 submit_result 工具(同 RunAgentOptions.resultSchema) */
40
- resultSchema?: JsonSchema;
41
- }): Promise<AgentLoopResult>;
45
+ resultSchema?: S;
46
+ /** 单个工具执行超时(毫秒);同 RunAgentOptions.toolTimeoutMs */
47
+ toolTimeoutMs?: number;
48
+ /** 同回合并行工具上限;同 RunAgentOptions.maxToolConcurrency */
49
+ maxToolConcurrency?: number;
50
+ /** 价格表覆盖(F1):由发起它的能力从 ToolRunContext.priceOverrides 透传 */
51
+ priceOverrides?: Record<string, ModelPricing>;
52
+ /** 未定价模型回调(F2):由发起它的能力透传 */
53
+ onUnpricedModel?: (info: {
54
+ model: string;
55
+ spanId: string;
56
+ }) => void;
57
+ }): Promise<AgentLoopResult<SchemaType<S>>>;
58
+ /**
59
+ * 用 `next` 原地替换 `target` 的全部内容(保持数组引用不变 —— 循环各处持同一数组)。
60
+ *
61
+ * **不要**写回 `target.splice(0, target.length, ...next)`:展开传参受 V8 实参个数上限
62
+ * 约束,`next` 超过约 12 万项即抛 `RangeError: Maximum call stack size exceeded`
63
+ * (实测 12 万 ok、30 万抛)。`next` 来自调用方注入的 `contextPolicy`,长度不受框架
64
+ * 控制,所以用循环逐项写,彻底没有这个上限。
65
+ */
66
+ export declare function replaceMessages(target: Anthropic.MessageParam[], next: readonly Anthropic.MessageParam[]): void;