@migor/agentia 0.2.0 → 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.
Files changed (191) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +144 -0
  3. package/README.md +202 -76
  4. package/dist/AGENTS.md +811 -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 +10 -4
  40. package/dist/engine/replay.js +57 -27
  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/engine/spec.d.ts +61 -0
  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 +60 -35
  67. package/dist/index.js +38 -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}/spec.d.ts +16 -2
  98. package/dist/runtime/spec.js +28 -0
  99. package/dist/runtime/spec.js.map +1 -0
  100. package/dist/{run → runtime}/systemPrompt.d.ts +12 -0
  101. package/dist/{run → runtime}/systemPrompt.js +16 -3
  102. package/dist/runtime/systemPrompt.js.map +1 -0
  103. package/dist/{run → runtime}/types.js.map +1 -1
  104. package/dist/{run → store}/fsStore.d.ts +15 -0
  105. package/dist/{run → store}/fsStore.js +43 -1
  106. package/dist/store/fsStore.js.map +1 -0
  107. package/dist/{run → store}/redisStore.d.ts +23 -1
  108. package/dist/{run → store}/redisStore.js +33 -6
  109. package/dist/store/redisStore.js.map +1 -0
  110. package/dist/{run → store}/sqliteStore.js +22 -1
  111. package/dist/store/sqliteStore.js.map +1 -0
  112. package/dist/{run → store}/store.d.ts +25 -3
  113. package/dist/store/store.js +63 -0
  114. package/dist/store/store.js.map +1 -0
  115. package/dist/toolkit/asset.d.ts +7 -6
  116. package/dist/toolkit/asset.js +7 -6
  117. package/dist/toolkit/asset.js.map +1 -1
  118. package/dist/toolkit/collect.d.ts +20 -7
  119. package/dist/toolkit/collect.js +21 -7
  120. package/dist/toolkit/collect.js.map +1 -1
  121. package/dist/toolkit/discover.d.ts +21 -1
  122. package/dist/toolkit/discover.js +59 -12
  123. package/dist/toolkit/discover.js.map +1 -1
  124. package/dist/toolkit/middleware.d.ts +10 -10
  125. package/dist/toolkit/middleware.js +17 -4
  126. package/dist/toolkit/middleware.js.map +1 -1
  127. package/dist/toolkit/module.d.ts +100 -34
  128. package/dist/toolkit/module.js +112 -36
  129. package/dist/toolkit/module.js.map +1 -1
  130. package/dist/toolkit/prompt.d.ts +4 -6
  131. package/dist/toolkit/prompt.js +11 -10
  132. package/dist/toolkit/prompt.js.map +1 -1
  133. package/dist/toolkit/skill.d.ts +14 -16
  134. package/dist/toolkit/skill.js +32 -25
  135. package/dist/toolkit/skill.js.map +1 -1
  136. package/dist/toolkit/subagent.d.ts +10 -12
  137. package/dist/toolkit/subagent.js +23 -21
  138. package/dist/toolkit/subagent.js.map +1 -1
  139. package/dist/toolkit/tool.d.ts +19 -11
  140. package/dist/toolkit/tool.js +11 -8
  141. package/dist/toolkit/tool.js.map +1 -1
  142. package/dist/toolkit/zod.d.ts +4 -3
  143. package/dist/toolkit/zod.js +2 -1
  144. package/dist/toolkit/zod.js.map +1 -1
  145. package/dist/transport/async.d.ts +133 -0
  146. package/dist/transport/async.js +415 -0
  147. package/dist/transport/async.js.map +1 -0
  148. package/dist/transport/http.d.ts +146 -0
  149. package/dist/transport/http.js +387 -0
  150. package/dist/transport/http.js.map +1 -0
  151. package/dist/{run → transport}/scheduler.d.ts +9 -1
  152. package/dist/transport/scheduler.js +133 -0
  153. package/dist/transport/scheduler.js.map +1 -0
  154. package/dist/transport/sse.d.ts +43 -0
  155. package/dist/transport/sse.js +51 -0
  156. package/dist/transport/sse.js.map +1 -0
  157. package/dist/{run → transport}/transport.d.ts +1 -1
  158. package/dist/{run → transport}/transport.js +1 -1
  159. package/dist/transport/transport.js.map +1 -0
  160. package/package.json +24 -9
  161. package/dist/engine/context.js +0 -146
  162. package/dist/engine/context.js.map +0 -1
  163. package/dist/run/async.d.ts +0 -59
  164. package/dist/run/async.js +0 -185
  165. package/dist/run/async.js.map +0 -1
  166. package/dist/run/context.d.ts +0 -16
  167. package/dist/run/context.js.map +0 -1
  168. package/dist/run/fsStore.js.map +0 -1
  169. package/dist/run/http.d.ts +0 -47
  170. package/dist/run/http.js +0 -119
  171. package/dist/run/http.js.map +0 -1
  172. package/dist/run/memory.js.map +0 -1
  173. package/dist/run/openai.js +0 -181
  174. package/dist/run/openai.js.map +0 -1
  175. package/dist/run/otlp.js.map +0 -1
  176. package/dist/run/redisStore.js.map +0 -1
  177. package/dist/run/run.js +0 -129
  178. package/dist/run/run.js.map +0 -1
  179. package/dist/run/scheduler.js +0 -85
  180. package/dist/run/scheduler.js.map +0 -1
  181. package/dist/run/spec.js.map +0 -1
  182. package/dist/run/sqliteStore.js.map +0 -1
  183. package/dist/run/store.js +0 -28
  184. package/dist/run/store.js.map +0 -1
  185. package/dist/run/systemPrompt.js.map +0 -1
  186. package/dist/run/transport.js.map +0 -1
  187. /package/dist/{run → integrations}/otlp.d.ts +0 -0
  188. /package/dist/{run → integrations}/otlp.js +0 -0
  189. /package/dist/{run → runtime}/types.d.ts +0 -0
  190. /package/dist/{run → runtime}/types.js +0 -0
  191. /package/dist/{run → store}/sqliteStore.d.ts +0 -0
@@ -5,7 +5,7 @@
5
5
  * Provider 三态:useValue / useClass / useFactory(+deps)。
6
6
  * 依赖以字符串 token 显式声明,靠工厂解析期惰性求值;无构造器参数反射。
7
7
  * 容器按 app 粒度单例缓存;run 作用域的黑板/上下文不经过 DI,而由
8
- * RunContext(AsyncLocalStorage) 在 executeRun 内注入(见 run/context.ts)。
8
+ * RunContext(AsyncLocalStorage) 在 executeRun 内注入(见 runtime/context.ts)。
9
9
  */
10
10
  export type Token = string;
11
11
  export interface ValueProvider<T = unknown> {
@@ -20,7 +20,13 @@ export interface ClassProvider<T = unknown> {
20
20
  }
21
21
  export interface FactoryProvider<T = unknown> {
22
22
  provide: Token;
23
- useFactory: (...deps: unknown[]) => T;
23
+ /**
24
+ * 工厂函数。形参用 `never[]` 而非 `unknown[]` —— 函数参数是**逆变**的,
25
+ * 写 `(...deps: unknown[]) => T` 会拒掉一切带类型形参的正常工厂
26
+ * (`(cfg: Config) => T` 不可赋值)。`never` 是最小类型,任何形参列表都能赋值,
27
+ * 与 `ClassProvider.useClass` 的 `new (...args: never[])` 保持一致。
28
+ */
29
+ useFactory: (...deps: never[]) => T;
24
30
  /** 与 useFactory 形参一一对应的依赖 token */
25
31
  deps?: Token[];
26
32
  }
@@ -33,6 +39,8 @@ export declare class Container {
33
39
  private resolving;
34
40
  /** 覆盖式注册(后注册覆盖先注册;同一 app 内同 token 重复注册视为升级) */
35
41
  register(...providers: Provider[]): this;
42
+ /** token 的全部传递下游(直接或间接依赖它的 token),用于注册时传递失效缓存 */
43
+ private dependentsOf;
36
44
  has(token: Token): boolean;
37
45
  resolve<T = unknown>(token: Token): T;
38
46
  /** 调试辅助 */
@@ -2,9 +2,7 @@ export function isProvider(p) {
2
2
  return (typeof p === 'object' &&
3
3
  p !== null &&
4
4
  typeof p.provide === 'string' &&
5
- ('useValue' in p ||
6
- 'useClass' in p ||
7
- 'useFactory' in p));
5
+ ('useValue' in p || 'useClass' in p || 'useFactory' in p));
8
6
  }
9
7
  export class Container {
10
8
  bindings = new Map();
@@ -18,9 +16,34 @@ export class Container {
18
16
  throw new Error(`非法 provider: ${JSON.stringify(p)}`);
19
17
  }
20
18
  this.bindings.set(p.provide, p);
19
+ // 已解析过的缓存必须一起失效:否则「后注册覆盖先注册」只在首次 resolve 前成立
20
+ // (重复 module 装配是常见场景,升级了 provider 却仍拿到旧实例)。
21
+ // 传递失效:依赖它的下游若已解析并缓存,也必须一起失效 —— 否则拿到的是
22
+ // 「旧依赖构造出来的」旧实例,升级对下游完全不可见。
23
+ this.cache.delete(p.provide);
24
+ for (const dep of this.dependentsOf(p.provide))
25
+ this.cache.delete(dep);
21
26
  }
22
27
  return this;
23
28
  }
29
+ /** token 的全部传递下游(直接或间接依赖它的 token),用于注册时传递失效缓存 */
30
+ dependentsOf(root) {
31
+ const out = new Set();
32
+ const queue = [root];
33
+ while (queue.length > 0) {
34
+ const cur = queue.shift();
35
+ for (const [token, binding] of this.bindings) {
36
+ if (token === root || out.has(token))
37
+ continue;
38
+ const deps = binding.deps;
39
+ if (deps?.includes(cur)) {
40
+ out.add(token);
41
+ queue.push(token);
42
+ }
43
+ }
44
+ }
45
+ return out;
46
+ }
24
47
  has(token) {
25
48
  return this.bindings.has(token);
26
49
  }
@@ -49,6 +72,7 @@ export class Container {
49
72
  }
50
73
  else {
51
74
  const deps = (binding.deps ?? []).map((d) => this.resolve(d));
75
+ // 工厂形参声明为 never[](见 FactoryProvider 注释):调用点按实际 deps 断言
52
76
  value = binding.useFactory(...deps);
53
77
  }
54
78
  }
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/container/container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/container/container.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Agentia —— 中断信号合成(零依赖)。
3
+ *
4
+ * 一条 run 的中断可能来自多个源头:调用方显式传入、HTTP 客户端断开、
5
+ * AsyncRunner 的 runTimeoutMs 超时、宿主停机。任一触发都应中止本次 run。
6
+ *
7
+ * Node 18 没有 `AbortSignal.any`,这里手写兜底(Node 20.3+ 才有)。
8
+ */
9
+ /** 合成多个中断源:任一已中止 / 后中止即中止;忽略 undefined;全空返回**永不中止**的 signal。 */
10
+ export declare function combineSignals(...signals: Array<AbortSignal | undefined>): AbortSignal;
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Agentia —— 中断信号合成(零依赖)。
3
+ *
4
+ * 一条 run 的中断可能来自多个源头:调用方显式传入、HTTP 客户端断开、
5
+ * AsyncRunner 的 runTimeoutMs 超时、宿主停机。任一触发都应中止本次 run。
6
+ *
7
+ * Node 18 没有 `AbortSignal.any`,这里手写兜底(Node 20.3+ 才有)。
8
+ */
9
+ /** 合成多个中断源:任一已中止 / 后中止即中止;忽略 undefined;全空返回**永不中止**的 signal。 */
10
+ export function combineSignals(...signals) {
11
+ const real = signals.filter((s) => s !== undefined);
12
+ // 单源直接复用,避免多包一层 listener
13
+ if (real.length === 1)
14
+ return real[0];
15
+ const ac = new AbortController();
16
+ for (const s of real) {
17
+ if (s.aborted) {
18
+ ac.abort(s.reason);
19
+ break;
20
+ }
21
+ }
22
+ if (!ac.signal.aborted) {
23
+ for (const s of real)
24
+ s.addEventListener('abort', () => ac.abort(s.reason), { once: true });
25
+ }
26
+ return ac.signal;
27
+ }
28
+ //# sourceMappingURL=abort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../src/core/abort.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,GAAG,OAAuC;IACvE,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;IACtE,yBAAyB;IACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,IAAI,IAAI;YAAE,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;AACnB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Agentia —— 类型化黑板(**可选**,靠 TS 声明合并扩展)。core 层:纯类型、零依赖。
3
+ *
4
+ * 不扩展时(默认空前接口):键回落 `string`、值回落 `unknown`、种子回落
5
+ * `Record<string, unknown>` —— 与旧版逐字一致,既有代码零改动。
6
+ *
7
+ * 扩展后,`RunContext.get/set/has/delete/keys` 与 `run({ blackboard })` 种子
8
+ * 都会得到**键补全 + 拼写检查 + 值类型**:
9
+ *
10
+ * ```ts
11
+ * // 在你自己项目的任意 .ts / .d.ts 里写一次(全局生效)
12
+ * declare module '@migor/agentia' {
13
+ * interface Blackboard {
14
+ * profile: { name: string; vip: boolean };
15
+ * turnCount: number;
16
+ * }
17
+ * }
18
+ * // 之后:
19
+ * ctx.get('profile') // { name: string; vip: boolean } | undefined
20
+ * ctx.set('turnCount', 1); // ✓ 值类型不对会报错
21
+ * ctx.get('profil') // ✗ 编译期报错(键不存在)
22
+ * ```
23
+ *
24
+ * 动态键(键是运行时算出来的 `string`)拿不到字面量联合,需自行断言:
25
+ * `ctx.get(key as BlackboardKey)`。
26
+ *
27
+ * 说明:类型定义在 core(纯数据),而读写它的 `RunContext`(含 ALS 传播)
28
+ * 留在 runtime —— 契约下沉、机制留层,避免 runtime 的类型被 store 反向依赖。
29
+ */
30
+ export interface Blackboard {
31
+ }
32
+ /** 黑板键:扩展过 `Blackboard` → 其键联合;未扩展 → `string`(向后兼容) */
33
+ export type BlackboardKey = [keyof Blackboard] extends [never] ? string : keyof Blackboard;
34
+ /** 键对应的值类型:未扩展 / 未知键 → `unknown` */
35
+ export type BlackboardValue<K> = K extends keyof Blackboard ? Blackboard[K] : unknown;
36
+ /** blackboard 种子:扩展过 `Blackboard` → `Partial<Blackboard>`(键有补全);未扩展 → `Record<string, unknown>` */
37
+ export type BlackboardSeed = [keyof Blackboard] extends [never] ? Record<string, unknown> : Partial<Blackboard>;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=blackboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blackboard.js","sourceRoot":"","sources":["../../src/core/blackboard.ts"],"names":[],"mappings":""}
@@ -1,2 +1,4 @@
1
1
  /** 任意值 → 字符串:string 原样,其余 JSON.stringify,循环引用等异常回落 String()。 */
2
2
  export declare function stringifySafe(x: unknown): string;
3
+ /** 截断到上限字符、超长加省略标记 `…(+N)`。trace 展示(engine/loop)与 replay 共用同一格式。 */
4
+ export declare function truncateWithMark(s: string, n: number): string;
package/dist/core/json.js CHANGED
@@ -9,4 +9,8 @@ export function stringifySafe(x) {
9
9
  return String(x);
10
10
  }
11
11
  }
12
+ /** 截断到上限字符、超长加省略标记 `…(+N)`。trace 展示(engine/loop)与 replay 共用同一格式。 */
13
+ export function truncateWithMark(s, n) {
14
+ return s.length > n ? `${s.slice(0, n)}…(+${s.length - n})` : s;
15
+ }
12
16
  //# sourceMappingURL=json.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,CAAS;IACnD,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SpanError } from './trace.js';
2
+ /**
3
+ * Agentia —— run 生命周期数据模型(spec §6.1)。
4
+ *
5
+ * 放在 core 的理由:`RunStatus` / `RunMeta` 是纯数据,只依赖 `core/trace`。
6
+ * store / transport / runtime 都要读它,下沉 core 后三者都不必再向上引 runtime
7
+ * (此前 `store → runtime` 是未声明的兄弟层依赖,见 AGENTS.md 分层约定)。
8
+ */
9
+ export type RunStatus = 'queued' | 'running' | 'succeeded' | 'failed';
10
+ export interface RunMeta {
11
+ runId: string;
12
+ status: RunStatus;
13
+ idempotencyKey?: string;
14
+ createdAt: number;
15
+ startedAt?: number;
16
+ finishedAt?: number;
17
+ error?: SpanError;
18
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/core/run.ts"],"names":[],"mappings":""}
@@ -14,12 +14,12 @@ import { stringifySafe } from './json.js';
14
14
  */
15
15
  export function validateJsonSchema(schema, input) {
16
16
  // zod 可选接入(toolkit/zod.ts 的 fromZod 挂的隐藏字段):存在则先走 zod 校验,
17
- // 失败即回「$.: <首条错误>」(含 zod 路径);通过后再叠加 JSON Schema 子集校验。
17
+ // 失败即回「$: <首条错误>」(含 zod 路径,前缀与原生分支的 `$` 路径一致);通过后再叠加 JSON Schema 子集校验。
18
18
  const zv = schema.__zodValidate;
19
19
  if (typeof zv === 'function') {
20
20
  const err = zv(input);
21
21
  if (err)
22
- return `$.: ${err}`;
22
+ return `$: ${err}`;
23
23
  }
24
24
  return check(schema, input, '$');
25
25
  }
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@ import type { SpanError, SpanId, SpanKind, SpanStatus, Trace, Usage } from './tr
3
3
  /**
4
4
  * Agentia —— 工具定义。
5
5
  * v1 用裸 JSON Schema,不引 zod。
6
- * run 执行体可接收第二参 ctx(ToolRunContext),供子 agent/嵌套单元把
7
- * 自己的 llm.turn 递归挂进当前 trace(unit span 的父由 engine 给定)。
6
+ * run 执行体可接收第二参 ctx(ToolRunContext),供子 agent/嵌套能力把
7
+ * 自己的 llm.turn 递归挂进当前 trace(capability span 的父由 engine 给定)。
8
8
  */
9
9
  /** JSON Schema 对象子集,供工具的 input_schema */
10
10
  export interface JsonSchema {
@@ -16,8 +16,31 @@ export interface JsonSchema {
16
16
  [key: string]: unknown;
17
17
  }
18
18
  /**
19
- * engine 的 TraceRecorder 面向子单元的最小结构面(core 不依赖 engine)。
20
- * 需要开嵌套 span 的单元(如 @SubAgent)通过 ctx.recorder 记账,
19
+ * 泛型 schema:在普通 JSON Schema 上挂一个**纯类型**的幻影字段,把「校验通过后的
20
+ * 结果类型」带进类型系统 —— 框架据此推导 `AgentRunResult.typed` 与 `@Tool` 方法的
21
+ * 入参类型。运行时**不存在**该字段(见 toolkit/zod.ts 的 fromZod)。
22
+ *
23
+ * 不是必须的:直接给裸 JsonSchema(旧写法)时回落 unknown/any,行为与之前逐字一致。
24
+ */
25
+ export interface TypedSchema<T> extends JsonSchema {
26
+ /** 幻影字段(永不在运行时出现):仅用于类型推导,勿读取 */
27
+ readonly __typed?: T;
28
+ }
29
+ /**
30
+ * 从 schema 提取「结果类型」:`TypedSchema<T>` → `T`;普通 `JsonSchema` → `unknown`
31
+ * (与 typed 字段旧语义一致)。用于 `runAgent` / `executeRun` / `app.run` 的返回值。
32
+ */
33
+ export type SchemaType<S> = S extends TypedSchema<infer T> ? T : unknown;
34
+ /**
35
+ * 装饰器方法入参类型:与 SchemaType 同源,但**未给出具体类型时回落 any** ——
36
+ * 这样「裸 JsonSchema」与「fromZod(...) 没写 <T>」两种既有写法都不被破坏
37
+ * (不校验方法签名),只有 `fromZod<T>()` 明确了 T 后才开始校验
38
+ * 「方法签名 vs schema」的一致性。
39
+ */
40
+ export type SchemaInput<S> = S extends TypedSchema<infer T> ? (unknown extends T ? any : T) : any;
41
+ /**
42
+ * engine 的 TraceRecorder 面向子能力的最小结构面(core 不依赖 engine)。
43
+ * 需要开嵌套 span 的能力(如 @SubAgent)通过 ctx.recorder 记账,
21
44
  * 其余工具可完全忽略它。
22
45
  */
23
46
  export interface RecorderBackend {
@@ -44,23 +67,55 @@ export interface ModelClient {
44
67
  system?: string | Anthropic.TextBlockParam[];
45
68
  tools?: Anthropic.Tool[];
46
69
  messages: Anthropic.MessageParam[];
70
+ /**
71
+ * 中断信号(可选):实现须转发给底层请求,否则调用方无法中止在飞 run。
72
+ *
73
+ * ⚠️ **自定义 client 的常见坑**:`signal` 在**本契约里是 params 的一个字段**,但多数厂商
74
+ * SDK 把「传输层的 signal」放在**请求选项**里(如 `@anthropic-ai/sdk` 的
75
+ * `stream(body, options?)` —— `signal` 只在 `RequestOptions` 里认)。若把本 params 原样
76
+ * 交给 SDK,signal 会被**静默丢弃**,中止失效且**没有任何报错**。
77
+ * 参考实现:`integrations/anthropic.ts` 的 `splitSignal()`(把 signal 摘出来搬到 options),
78
+ * 以及 `integrations/openai.ts`(手写 fetch,直接透传)。
79
+ * 门禁:`tests/integrations/anthropic.test.ts`(零 key 本地假端点,abort 后必须断开)。
80
+ */
81
+ signal?: AbortSignal;
47
82
  }): {
48
83
  on(event: 'text', cb: (delta: string) => void): void;
49
84
  finalMessage(): Promise<Anthropic.Message>;
50
85
  };
51
86
  };
52
87
  }
88
+ /**
89
+ * 模型单价(美元 / 1M tokens)。内置表见 `engine/usage.ts`;宿主可用
90
+ * `priceOverrides` 覆盖或追加(非 Anthropic 端点也能算成成本)。
91
+ * 定义在 core 是为了让 `ToolRunContext` 能带上它 —— core 不能依赖 engine。
92
+ */
93
+ export interface ModelPricing {
94
+ in: number;
95
+ out: number;
96
+ }
53
97
  /**
54
98
  * engine 在调用每个工具时注入的执行上下文(spec §9.2:当前 span 句柄随调用传播,
55
99
  * 不用全局单例,保证并行工具调用父子关系准确)。
56
- * - recorder:整条 run 共享的 recorder(新子单元/子 agent 的 span 写它下面);
57
- * - parentSpanId:发起本次调用的上层 span —— 子单元 span 应挂它下面;
100
+ * - recorder:整条 run 共享的 recorder(新子能力/子 agent 的 span 写它下面);
101
+ * - parentSpanId:发起本次调用的上层 span —— 子能力 span 应挂它下面;
58
102
  * - client:与主循环同一注入(子 agent 独立循环复用它)。
59
103
  */
60
104
  export interface ToolRunContext {
61
105
  client: ModelClient;
62
106
  recorder: RecorderBackend;
63
107
  parentSpanId: SpanId;
108
+ /**
109
+ * 本次 run 的中断信号。工具**自行决定**是否尊重(如传给 fetch);框架不会
110
+ * 强制中断工具 —— 工具副作用无法回滚,强行中止只会留下不一致的中间态。
111
+ */
112
+ signal?: AbortSignal;
113
+ /**
114
+ * 宿主的价格覆盖表(见 `engine/usage.ts` 的 `buildPricing`)。嵌套能力
115
+ * (@SubAgent / @Skill)拉起自己的 llm 循环时必须原样传下去,否则自定义定价的
116
+ * 模型在子循环里会退化成"未定价"(成本恒 0,`maxCostUsd` 静默失效)。
117
+ */
118
+ priceOverrides?: Record<string, ModelPricing>;
64
119
  }
65
120
  export interface AgentTool<I = unknown, O = unknown> {
66
121
  /** 模型可见的唯一名(建议 snake_case) */
@@ -71,7 +126,7 @@ export interface AgentTool<I = unknown, O = unknown> {
71
126
  strict?: boolean;
72
127
  /**
73
128
  * 执行体。入参 = 模型按 schema 解析的结构化 input;
74
- * ctx 由 engine 注入(含 recorder/父 span),需要开嵌套 span 的单元(子 agent)用,
129
+ * ctx 由 engine 注入(含 recorder/父 span),需要开嵌套 span 的能力(子 agent)用,
75
130
  * 普通工具可忽略。抛错会被包成 is_error 的 tool_result 回给模型,不中断 run。
76
131
  */
77
132
  run: (input: I, ctx?: ToolRunContext) => Promise<O> | O;
@@ -4,9 +4,12 @@
4
4
  */
5
5
  export type TraceId = string;
6
6
  export type SpanId = string;
7
- /** span 层级:run=整次运行;unit=对单个单元(tool/skill/prompt/subagent)的调用;llm.turn=unit 内每次模型往返 */
8
- export type SpanKind = 'run' | 'unit' | 'llm.turn' | 'internal';
9
- export type UnitType = 'tool' | 'skill' | 'prompt' | 'subagent';
7
+ /** span 层级:run=整次运行;capability=对能力的调用;llm.turn=每次模型往返。
8
+ * 注意 capability span 只由 skill / subagent 创建(toolkit/skill.ts、toolkit/subagent.ts 里的
9
+ * recorder.begin('capability', …));普通工具与 @Prompt 资产【不建 span】,只记 turn 上的
10
+ * tool.input / tool.output 事件(engine/loop.ts)。 */
11
+ export type SpanKind = 'run' | 'capability' | 'llm.turn';
12
+ export type CapabilityType = 'tool' | 'skill' | 'prompt' | 'subagent';
10
13
  export interface Usage {
11
14
  inputTokens: number;
12
15
  outputTokens: number;
@@ -38,7 +41,12 @@ export interface Span {
38
41
  endedAt?: number;
39
42
  status: SpanStatus;
40
43
  error?: SpanError;
41
- /** unit / llm.turn 的聚合用量 */
44
+ /**
45
+ * usage —— 语义按 kind 区分:
46
+ * - `llm.turn`:该次模型往返的**自身计量**,是 Trace.totalUsage 的唯一来源;
47
+ * - `capability`(skill / subagent):其**子孙 llm.turn 的聚合**,仅供展示(看某个能力花了多少),
48
+ * **不**计入 totalUsage(否则与子孙重复计数)。
49
+ */
42
50
  usage?: Usage;
43
51
  attributes: Record<string, string | number | boolean>;
44
52
  events: SpanEvent[];
@@ -50,3 +58,11 @@ export interface Trace {
50
58
  status: SpanStatus;
51
59
  totalUsage: Usage;
52
60
  }
61
+ /**
62
+ * trace 出口:run 收尾(成功或失败)后,框架把【完整 Trace】交给每个 sink。
63
+ * sink 抛错由框架吞掉,绝不影响 run 结果(与 memory 回写同款防护)。
64
+ * 形状与 OtlpExporter 一致 —— createOtlpExporter() 的返回值天然满足本接口。
65
+ */
66
+ export interface TraceSink {
67
+ export(trace: Trace): void | Promise<void>;
68
+ }
@@ -0,0 +1,49 @@
1
+ import type { Trace } from '../core/trace.js';
2
+ /**
3
+ * Agentia —— 成本硬管控(C1,补 spec §6.4 的欠账)。
4
+ *
5
+ * ⚠️ **与 `createBudgetPolicy` 的分工(文档必须并列讲清,别混)**:
6
+ * - `createBudgetPolicy`(engine/policy.ts)= **发送前**的上下文裁剪:防止历史过长把请求撞成
7
+ * 400、或过早触发压缩。它改的是 messages;
8
+ * - `createBudgetGuard`(本文件)= **记账后**的硬停止:每回合 `llm.turn` 的 usage 落账后累计判断,
9
+ * 超限即把 run 停掉。它不改 messages,目的是**控制花钱**。
10
+ *
11
+ * 两者互补,可以同时用。
12
+ */
13
+ /** 超限快照:记进 run 根的 `budget.exceeded` 事件,也回调给 `onExceed` */
14
+ export interface BudgetSnapshot {
15
+ /** 先触发的那条护栏(**先算 tokens 再算 cost**) */
16
+ kind: 'tokens' | 'cost';
17
+ /** 该护栏的上限 */
18
+ limit: number;
19
+ /** 触发时的实际值(必然 > limit) */
20
+ actual: number;
21
+ /** 累计 token = input + output + cacheRead + cacheCreation */
22
+ totalTokens: number;
23
+ /** 累计成本估算(美元);模型不在价格表内时恒为 0(见 maxCostUsd 说明) */
24
+ costUsd: number;
25
+ }
26
+ export interface BudgetGuardOptions {
27
+ /** 整条 run(含子 agent)的累计 token 上限 */
28
+ maxTotalTokens?: number;
29
+ /**
30
+ * 累计成本上限(美元)。**依赖 span 级 usage 的 `costEstimate`** ——
31
+ * 模型不在 `engine/usage.ts` 的价格表里时成本恒为 0,这条护栏**永远不触发**;
32
+ * 要无条件兜底请用 `maxTotalTokens`。同理,缓存 token 的单价是近似值(见 usage.ts)。
33
+ */
34
+ maxCostUsd?: number;
35
+ /**
36
+ * 超限时的回调(在 `check` 返回前调用)。**抛错会冒泡进引擎** ——
37
+ * 想记日志/告警请自行保证不抛(引擎侧装配的那条已经做了 try 包裹)。
38
+ */
39
+ onExceed?: (snapshot: BudgetSnapshot) => void;
40
+ }
41
+ export interface BudgetGuard {
42
+ /** 每回合记账完成后调用;超限返回 `'tokens' | 'cost'`,否则 `null` */
43
+ check(trace: Trace): 'tokens' | 'cost' | null;
44
+ }
45
+ /**
46
+ * 建一个预算护栏。`check` 只看 **trace.totalUsage**(已由 recorder 按 llm.turn 求和,
47
+ * 子 agent 的往返也在内 —— 所以这是**整条 run** 的口径,不只是主循环)。
48
+ */
49
+ export declare function createBudgetGuard(opts?: BudgetGuardOptions): BudgetGuard;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * 建一个预算护栏。`check` 只看 **trace.totalUsage**(已由 recorder 按 llm.turn 求和,
3
+ * 子 agent 的往返也在内 —— 所以这是**整条 run** 的口径,不只是主循环)。
4
+ */
5
+ export function createBudgetGuard(opts = {}) {
6
+ const { maxTotalTokens, maxCostUsd, onExceed } = opts;
7
+ return {
8
+ check(trace) {
9
+ const u = trace.totalUsage;
10
+ const totalTokens = u.inputTokens + u.outputTokens + u.cacheReadTokens + u.cacheCreationTokens;
11
+ const costUsd = u.costEstimate ?? 0;
12
+ if (maxTotalTokens != null && totalTokens > maxTotalTokens) {
13
+ onExceed?.({
14
+ kind: 'tokens',
15
+ limit: maxTotalTokens,
16
+ actual: totalTokens,
17
+ totalTokens,
18
+ costUsd,
19
+ });
20
+ return 'tokens';
21
+ }
22
+ if (maxCostUsd != null && costUsd > maxCostUsd) {
23
+ onExceed?.({ kind: 'cost', limit: maxCostUsd, actual: costUsd, totalTokens, costUsd });
24
+ return 'cost';
25
+ }
26
+ return null;
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=budget.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"budget.js","sourceRoot":"","sources":["../../src/engine/budget.ts"],"names":[],"mappings":"AAiDA;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAI,GAAuB,EAAE;IAC7D,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IACtD,OAAO;QACL,KAAK,CAAC,KAAY;YAChB,MAAM,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC;YAC3B,MAAM,WAAW,GACf,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,eAAe,GAAG,CAAC,CAAC,mBAAmB,CAAC;YAC7E,MAAM,OAAO,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC;YACpC,IAAI,cAAc,IAAI,IAAI,IAAI,WAAW,GAAG,cAAc,EAAE,CAAC;gBAC3D,QAAQ,EAAE,CAAC;oBACT,IAAI,EAAE,QAAQ;oBACd,KAAK,EAAE,cAAc;oBACrB,MAAM,EAAE,WAAW;oBACnB,WAAW;oBACX,OAAO;iBACR,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC;YAClB,CAAC;YACD,IAAI,UAAU,IAAI,IAAI,IAAI,OAAO,GAAG,UAAU,EAAE,CAAC;gBAC/C,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvF,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Agentia —— 有界并发与超时(C2)。零依赖,供「同一回合的并行工具调用」用。
3
+ */
4
+ /**
5
+ * 有界并发 map:最多 `limit` 个 `fn` 同时在飞,**结果顺序与输入一致**
6
+ * (调用方按序拼 tool_result,模型靠 tool_use_id 配对,顺序改动会打乱可读性)。
7
+ *
8
+ * `limit` 非正数或非有限值一律视为**不限**(= 旧行为 `Promise.all`)。
9
+ */
10
+ export declare function mapWithConcurrency<T, R>(items: readonly T[], limit: number, fn: (item: T, index: number) => Promise<R>): Promise<R[]>;
11
+ /** 超时哨兵:区分「超时」与「工具恰好返回了 undefined」 */
12
+ export declare const TIMED_OUT: unique symbol;
13
+ /**
14
+ * 给一个 promise 套超时;超时返回 `TIMED_OUT`。
15
+ *
16
+ * ⚠️ **不取消底层** —— `AgentTool.run` 拿不到 signal(那会破坏现有签名),所以
17
+ * 「超时」的语义是**放弃等待**:副作用可能已经发生,只是我们不等了。
18
+ * 想真停下来的工具请自行读 `ToolRunContext.signal`(框架传了,但**不强制**工具中断
19
+ * —— 见 core/tool.ts 的说明:工具副作用无法回滚)。
20
+ *
21
+ * **超时是硬的**(2026-09-14 收紧,见 `docs/spec.md` §10):判定不看竞速结果,而看**实测耗时**。
22
+ * 原因:`Promise.race` 不是硬保证 —— 两个计时器在同一毫秒内建、又因事件循环被饿住而同批到期时,
23
+ * 列表顺序决定谁先 resolve,**超预算的工具能赢过截止计时器**(实测 `60ms 工具 vs 20ms 预算`
24
+ * 在 8 倍 CPU 超订下 1200 次翻转 1 次,记成 `ok: true`,护栏静默失效)。
25
+ * 代价是语义收紧:`21ms 完成 / 20ms 预算` 由「成功」变「超时」—— 这正确,
26
+ * 「预算」本来就是对**实际耗时**的承诺,不是对调度运气的承诺。
27
+ *
28
+ * `timeoutMs` 非正数 = 不设超时(直接返回原 promise)。
29
+ *
30
+ * ⚠️ **截止计时器绝不可 `unref()`**(2026-09-14 修正,见 `docs/spec.md` §10 ④):
31
+ * 这个计时器的**触发本身就是「被 await 的 promise 得以 settle」的条件**。一旦 unref,
32
+ * 当它是事件循环里唯一的把手时,进程会在它触发前直接退出 —— `await` **永不 settle**。
33
+ * 实测(空事件循环、挂死的 promise,Node 22 与 26 一个样):
34
+ *
35
+ * | 计时器 | 结果 |
36
+ * |---|---|
37
+ * | `unref()` | 进程退出(顶层 await 未 settle),**什么都没返回** |
38
+ * | 不 unref | `settled: TIMED_OUT`,exit 0 |
39
+ *
40
+ * 「兜底计时器不该让宿主为它续命」这条理由对**没人 await 的兜底 tick**(scheduler 的下一拍、
41
+ * SSE 心跳、metrics 刷盘)成立,对**「等待的终点」**不成立:那正是调用方在等的东西。
42
+ */
43
+ export declare function withTimeout<T>(p: Promise<T>, timeoutMs: number): Promise<T | typeof TIMED_OUT>;