@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
@@ -1,7 +1,8 @@
1
- import { scanDecoratedMethods, unitName } from './collect.js';
1
+ import { assertMethodTarget, scanDecoratedMethods, capabilityName } from './collect.js';
2
+ import { isSuccessStopReason } from '../engine/types.js';
2
3
  import { runAgentScoped } from '../engine/loop.js';
3
4
  import { classifyError } from '../engine/errors.js';
4
- import { SystemPrompt } from '../run/systemPrompt.js';
5
+ import { SystemPrompt } from '../runtime/systemPrompt.js';
5
6
  /** 方法函数 → spec(与 @Tool 同款 WeakMap 注册表,零反射) */
6
7
  const skillSpecs = new WeakMap();
7
8
  const EMPTY_SCHEMA = {
@@ -11,48 +12,49 @@ const EMPTY_SCHEMA = {
11
12
  };
12
13
  /** 方法装饰器:登记 skill spec。被装饰方法体由运行时以 (input, skillCtx) 调用。 */
13
14
  export function Skill(spec) {
14
- return function (value, context) {
15
- if (context.kind !== 'method') {
16
- throw new Error(`@Skill 只能修饰类方法,收到 kind=${String(context.kind)}`);
17
- }
15
+ return (value, context) => {
16
+ assertMethodTarget(context, '@Skill');
18
17
  skillSpecs.set(value, spec);
19
18
  };
20
19
  }
21
- /** 把容器实例上所有 @Skill 方法收集成 SkillUnit[](沿原型链)。 */
20
+ /** 把容器实例上所有 @Skill 方法收集成 SkillCapability[](沿原型链)。 */
22
21
  export function collectSkills(instance) {
23
- return scanDecoratedMethods(instance, skillSpecs).map(({ key, fn, spec }) => ({
24
- name: unitName(spec, key, '@Skill'),
22
+ // 动态查表而非捕获 fn:子类「未装饰地 override」时 spec 继承自父类,
23
+ // 实现必须取实例上的(与 @Tool 的 run 同款),否则子类 override 被静默绕过。
24
+ const inst = instance;
25
+ return scanDecoratedMethods(instance, skillSpecs).map(({ key, spec }) => ({
26
+ name: capabilityName(spec, key, '@Skill'),
25
27
  description: spec.description,
26
28
  inputSchema: spec.schema ?? EMPTY_SCHEMA,
27
29
  spec,
28
- invoke: (input, skillCtx) => Reflect.apply(fn, instance, [input, skillCtx]),
30
+ invoke: (input, skillCtx) => Reflect.apply(inst[key], instance, [input, skillCtx]),
29
31
  }));
30
32
  }
31
33
  /**
32
- * 把 SkillUnit 变成主 agent 菜单里的 AgentTool。
34
+ * 把 SkillCapability 变成主 agent 菜单里的 AgentTool。
33
35
  * run(input, ctx) 需要 ToolRunContext(engine 调用时必有);手动直调会抛错提示。
34
- * 开 `unit` span → 构造 SkillContext(llm 闭包挂 unit 下)→ 执行方法体 →
35
- * 返回值字符串化交回;抛错关 unit error 后重抛(引擎包成 is_error,不中断 run)。
36
+ * 开 `capability` span → 构造 SkillContext(llm 闭包挂 capability 下)→ 执行方法体 →
37
+ * 返回值字符串化交回;抛错关 capability error 后重抛(引擎包成 is_error,不中断 run)。
36
38
  */
37
- export function skillToTool(unit, resolveTools) {
38
- const { name, spec } = unit;
39
+ export function skillToTool(capability, resolveTools) {
40
+ const { name, spec } = capability;
39
41
  return {
40
42
  name,
41
43
  description: spec.description,
42
- inputSchema: unit.inputSchema,
44
+ inputSchema: capability.inputSchema,
43
45
  run: async (input, ctx) => {
44
46
  if (!ctx) {
45
47
  throw new Error(`skill "${name}" 只能在主 agent 运行中被调用(engine 会注入 ToolRunContext)`);
46
48
  }
47
49
  const recorder = ctx.recorder;
48
- const unitId = recorder.begin('unit', name, ctx.parentSpanId);
49
- recorder.setAttribute(unitId, 'skill', name);
50
+ const capabilityId = recorder.begin('capability', name, ctx.parentSpanId);
51
+ recorder.setAttribute(capabilityId, 'skill', name);
50
52
  let closed = false;
51
53
  const close = (patch) => {
52
54
  if (closed)
53
55
  return;
54
56
  closed = true;
55
- recorder.end(unitId, patch);
57
+ recorder.end(capabilityId, patch);
56
58
  };
57
59
  const skillCtx = {
58
60
  model: spec.model,
@@ -63,9 +65,7 @@ export function skillToTool(unit, resolveTools) {
63
65
  if (messages.length === 0) {
64
66
  throw new Error(`skill "${name}".llm 需要 prompt 或 messages`);
65
67
  }
66
- const system = opts.system instanceof SystemPrompt
67
- ? opts.system.build({ cache: true })
68
- : opts.system;
68
+ const system = opts.system instanceof SystemPrompt ? opts.system.build({ cache: true }) : opts.system;
69
69
  const loop = await runAgentScoped({
70
70
  client: ctx.client,
71
71
  model: opts.model ?? spec.model,
@@ -75,22 +75,29 @@ export function skillToTool(unit, resolveTools) {
75
75
  messages,
76
76
  tools: spec.tools?.length ? resolveTools() : [],
77
77
  recorder,
78
- parentSpanId: unitId,
78
+ parentSpanId: capabilityId,
79
+ signal: ctx.signal,
80
+ // 价格覆盖透传(F1):子循环用同一模型也要能算成本
81
+ priceOverrides: ctx.priceOverrides,
79
82
  });
80
- if (loop.stopReason !== 'end_turn') {
83
+ if (!isSuccessStopReason(loop.stopReason)) {
81
84
  const report = `skill "${name}".llm ${loop.stopReason}: ${(loop.finalText || loop.error?.message || '').slice(0, 2000)}`;
82
85
  const error = loop.error ?? {
83
86
  type: 'agent_error',
84
87
  message: report,
85
88
  retryable: true,
86
89
  };
90
+ // 先把丰富错误挂到 capability span(loop.error 的 type/retryable 比新造的
91
+ // Error 信息量大),再抛出走外层 catch 的通用收尾 —— 外层 close 幂等,
92
+ // 不会覆盖这里写的 error(与 subagent.ts 同款)。
93
+ close({ status: 'error', error });
87
94
  throw new Error(report);
88
95
  }
89
96
  return { text: loop.finalText, stopReason: loop.stopReason };
90
97
  },
91
98
  };
92
99
  try {
93
- const out = await unit.invoke(input ?? {}, skillCtx);
100
+ const out = await capability.invoke(input ?? {}, skillCtx);
94
101
  close({ status: 'ok' });
95
102
  return out;
96
103
  }
@@ -1 +1 @@
1
- {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/toolkit/skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill.js","sourceRoot":"","sources":["../../src/toolkit/skill.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,9 @@
1
+ import type { CapabilityDecoratorContext } from './collect.js';
1
2
  import type { AgentTool, JsonSchema } from '../core/tool.js';
2
3
  import type { SystemParam } from '../engine/types.js';
3
- import { SystemPrompt } from '../run/systemPrompt.js';
4
+ import { SystemPrompt } from '../runtime/systemPrompt.js';
4
5
  /**
5
- * Agentia —— 子 agent 单元(spec §3/§5:独立 agent 循环 + 裁剪上下文 + 隔离报告)。
6
+ * Agentia —— 子 agent 能力(spec §3/§5:独立 agent 循环 + 裁剪上下文 + 隔离报告)。
6
7
  *
7
8
  * 语义(spec §5):
8
9
  * - 子 agent = **完整独立循环**:自己的 system(role)、自己的工具、自己的 model;
@@ -11,7 +12,7 @@ import { SystemPrompt } from '../run/systemPrompt.js';
11
12
  * - **隔离报告**:它的中间往返全部不进主上下文,唯一回流主 agent 的是
12
13
  * stop_reason=end_turn 的最终文本 —— 以 tool_result 交回(非 end_turn 则抛错 → is_error)。
13
14
  *
14
- * trace:子 agent 是主 trace 里的一个 `unit` span(挂在发起它的 llm.turn 下),
15
+ * trace:子 agent 是主 trace 里的一个 `capability` span(挂在发起它的 llm.turn 下),
15
16
  * 其内部 llm.turn 递归成它的子孙 —— 见 engine/loop.ts 的 runAgentScoped。
16
17
  */
17
18
  export interface SubAgentSpec {
@@ -39,22 +40,19 @@ export interface SubAgentSpec {
39
40
  */
40
41
  resultSchema?: JsonSchema;
41
42
  }
42
- export interface SubAgentUnit {
43
+ export interface SubAgentCapability {
43
44
  name: string;
44
45
  description: string;
45
46
  inputSchema: JsonSchema;
46
47
  spec: SubAgentSpec;
47
48
  }
48
49
  /** 方法装饰器:登记子 agent spec。被装饰方法体不执行 —— 运行时拉起独立循环。 */
49
- export declare function SubAgent(spec: SubAgentSpec): (value: Function, context: {
50
- kind: string;
51
- name: string | symbol;
52
- }) => void;
53
- /** 把容器实例上所有 @SubAgent 方法收集成 SubAgentUnit[](沿原型链)。 */
54
- export declare function collectSubAgents(instance: object): SubAgentUnit[];
50
+ export declare function SubAgent(spec: SubAgentSpec): (value: Function, context: CapabilityDecoratorContext) => void;
51
+ /** 把容器实例上所有 @SubAgent 方法收集成 SubAgentCapability[](沿原型链)。 */
52
+ export declare function collectSubAgents(instance: object): SubAgentCapability[];
55
53
  /**
56
- * 把 SubAgentUnit 变成主 agent 菜单里的 AgentTool。
54
+ * 把 SubAgentCapability 变成主 agent 菜单里的 AgentTool。
57
55
  * run(input, ctx) 需要 ToolRunContext(engine 调用时必有);手动直调会抛错提示。
58
56
  * tools token 列表 → resolveTools() 由装配层给出(该 token 的 @Tool 菜单)。
59
57
  */
60
- export declare function subagentToTool(unit: SubAgentUnit, resolveTools: () => AgentTool[]): AgentTool;
58
+ export declare function subagentToTool(capability: SubAgentCapability, resolveTools: () => AgentTool[]): AgentTool;
@@ -1,22 +1,21 @@
1
- import { scanDecoratedMethods, unitName } from './collect.js';
1
+ import { assertMethodTarget, scanDecoratedMethods, capabilityName } from './collect.js';
2
+ import { isSuccessStopReason } from '../engine/types.js';
2
3
  import { runAgentScoped } from '../engine/loop.js';
3
4
  import { classifyError } from '../engine/errors.js';
4
- import { SystemPrompt } from '../run/systemPrompt.js';
5
+ import { SystemPrompt } from '../runtime/systemPrompt.js';
5
6
  /** 方法函数 → spec(与 @Tool 同款 WeakMap 注册表,零反射) */
6
7
  const subAgentSpecs = new WeakMap();
7
8
  /** 方法装饰器:登记子 agent spec。被装饰方法体不执行 —— 运行时拉起独立循环。 */
8
9
  export function SubAgent(spec) {
9
- return function (value, context) {
10
- if (context.kind !== 'method') {
11
- throw new Error(`@SubAgent 只能修饰类方法,收到 kind=${String(context.kind)}`);
12
- }
10
+ return (value, context) => {
11
+ assertMethodTarget(context, '@SubAgent');
13
12
  subAgentSpecs.set(value, spec);
14
13
  };
15
14
  }
16
- /** 把容器实例上所有 @SubAgent 方法收集成 SubAgentUnit[](沿原型链)。 */
15
+ /** 把容器实例上所有 @SubAgent 方法收集成 SubAgentCapability[](沿原型链)。 */
17
16
  export function collectSubAgents(instance) {
18
17
  return scanDecoratedMethods(instance, subAgentSpecs).map(({ key, spec }) => ({
19
- name: unitName(spec, key, '@SubAgent'),
18
+ name: capabilityName(spec, key, '@SubAgent'),
20
19
  description: spec.description,
21
20
  inputSchema: spec.schema,
22
21
  spec,
@@ -34,29 +33,29 @@ async function resolveSubSystem(spec, task) {
34
33
  return `${spec}\n\n${REPORT_HINT}`;
35
34
  }
36
35
  /**
37
- * 把 SubAgentUnit 变成主 agent 菜单里的 AgentTool。
36
+ * 把 SubAgentCapability 变成主 agent 菜单里的 AgentTool。
38
37
  * run(input, ctx) 需要 ToolRunContext(engine 调用时必有);手动直调会抛错提示。
39
38
  * tools token 列表 → resolveTools() 由装配层给出(该 token 的 @Tool 菜单)。
40
39
  */
41
- export function subagentToTool(unit, resolveTools) {
42
- const { name, spec } = unit;
40
+ export function subagentToTool(capability, resolveTools) {
41
+ const { name, spec } = capability;
43
42
  return {
44
- name: unit.name,
45
- description: unit.description,
46
- inputSchema: unit.inputSchema,
43
+ name: capability.name,
44
+ description: capability.description,
45
+ inputSchema: capability.inputSchema,
47
46
  run: async (input, ctx) => {
48
47
  if (!ctx) {
49
48
  throw new Error(`subagent "${name}" 只能在主 agent 运行中被调用(engine 会注入 ToolRunContext)`);
50
49
  }
51
50
  const recorder = ctx.recorder;
52
- const unitId = recorder.begin('unit', name, ctx.parentSpanId);
53
- recorder.setAttribute(unitId, 'subagent', name);
51
+ const capabilityId = recorder.begin('capability', name, ctx.parentSpanId);
52
+ recorder.setAttribute(capabilityId, 'subagent', name);
54
53
  let closed = false;
55
54
  const close = (patch) => {
56
55
  if (closed)
57
56
  return;
58
57
  closed = true;
59
- recorder.end(unitId, patch);
58
+ recorder.end(capabilityId, patch);
60
59
  };
61
60
  try {
62
61
  const raw = input ?? {};
@@ -72,11 +71,14 @@ export function subagentToTool(unit, resolveTools) {
72
71
  messages: [{ role: 'user', content: JSON.stringify(task) }],
73
72
  tools,
74
73
  recorder,
75
- parentSpanId: unitId,
74
+ parentSpanId: capabilityId,
75
+ signal: ctx.signal,
76
76
  resultSchema: spec.resultSchema,
77
+ // 价格覆盖透传(F1):子 agent 用同一模型也要能算成本
78
+ priceOverrides: ctx.priceOverrides,
77
79
  });
78
- recorder.setAttribute(unitId, 'stop_reason', loop.stopReason);
79
- if (loop.stopReason === 'end_turn') {
80
+ recorder.setAttribute(capabilityId, 'stop_reason', loop.stopReason);
81
+ if (isSuccessStopReason(loop.stopReason)) {
80
82
  close({ status: 'ok' });
81
83
  // 隔离报告:默认只回最终文本。子 agent 提交了结构化结果(resultSchema +
82
84
  // submit_result 校验通过)时,连同报告以结构化 tool_result 交回 —— engine 会把
@@ -98,7 +100,7 @@ export function subagentToTool(unit, resolveTools) {
98
100
  throw new Error(report);
99
101
  }
100
102
  catch (e) {
101
- // runAgentScoped 抛出的请求级异常(此前 unit 未关)在此兜底标记
103
+ // runAgentScoped 抛出的请求级异常(此前 capability 未关)在此兜底标记
102
104
  close({ status: 'error', error: classifyError(e) });
103
105
  throw e;
104
106
  }
@@ -1 +1 @@
1
- {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/toolkit/subagent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"subagent.js","sourceRoot":"","sources":["../../src/toolkit/subagent.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- import type { AgentTool, JsonSchema } from '../core/tool.js';
1
+ import type { AgentTool, JsonSchema, SchemaInput } from '../core/tool.js';
2
+ import type { CapabilityDecoratorContext } from './collect.js';
2
3
  /**
3
4
  * Agentia —— 声明式工具层(spec §4:标准装饰器 + 显式 DI,无 param 反射)。
4
5
  *
@@ -12,25 +13,32 @@ import type { AgentTool, JsonSchema } from '../core/tool.js';
12
13
  * 与 tsgo/esbuild 均兼容。当前 run 作用域经 AsyncLocalStorage 传播,
13
14
  * 方法体内可随时 `RunContext.current()` 读 blackboard/runId。
14
15
  */
15
- export interface ToolSpec {
16
+ export interface ToolSpec<S extends JsonSchema = JsonSchema> {
16
17
  /** 模型可见工具名;缺省取被装饰方法名 */
17
18
  name?: string;
18
19
  description: string;
19
- /** input_schema:v1 用裸 JSON Schema(对应 engine/core 的 JsonSchema) */
20
- schema: JsonSchema;
21
- /** strict 参数校验:需 additionalProperties:false + required 齐全 */
20
+ /**
21
+ * input_schema:v1 用裸 JSON Schema(对应 engine/core 的 JsonSchema)。
22
+ *
23
+ * 传 `fromZod<T>(...)`(TypedSchema<T>)时,被装饰方法的**入参类型会被自动校验**:
24
+ * 签名与 T 不一致直接编译期报错(不用手写 `@Tool<I, O>` 泛型)。
25
+ * 传裸 JsonSchema 时回落 any —— 不校验(旧行为)。
26
+ */
27
+ schema: S;
28
+ /** strict 参数校验(透传给 Anthropic 的 strict 模式) */
22
29
  strict?: boolean;
23
30
  }
24
31
  /**
25
32
  * 方法装饰器:登记 spec。被装饰方法入参即结构化 tool input,
26
33
  * 返回值(或 Promise)即 tool_result。抛错由 engine 包成 is_error,不中断 run。
27
34
  *
28
- * 泛型 <I, O> 可把方法签名与编译期类型绑定(`@Tool<{city:string}, string>({...})`),
29
- * 挡住签名笔误;缺省 any 保持宽松。schema 与 I 的一致性仍由开发者保证(已知边界)。
35
+ * 类型检查由 **schema 驱动**:
36
+ * - `schema: fromZod<T>(…)`(TypedSchema<T>)→ 方法入参必须是 `T`,签名与 schema
37
+ * 不一致直接编译期报错 —— schema 即单一事实来源,不用两处双写;
38
+ * - `schema: {…}`(裸 JsonSchema)→ 入参回落 `any`,不校验(宽松旧行为)。
39
+ *
40
+ * 第二个泛型 `O` 用于显式约束返回值(缺省 `any`,不校验)。
30
41
  */
31
- export declare function Tool<I = any, O = any>(spec: ToolSpec): (value: (input: I) => O | Promise<O>, context: {
32
- kind: string;
33
- name: string | symbol;
34
- }) => void;
42
+ export declare function Tool<S extends JsonSchema = JsonSchema, O = any>(spec: ToolSpec<S>): (value: (input: SchemaInput<S>) => O | Promise<O>, context: CapabilityDecoratorContext) => void;
35
43
  /** 把容器实例上所有 @Tool 方法收集成 AgentTool[](沿原型链,含继承的父类工具)。 */
36
44
  export declare function collectTools(instance: object): AgentTool[];
@@ -1,18 +1,21 @@
1
- import { scanDecoratedMethods, unitName } from './collect.js';
1
+ import { assertMethodTarget, scanDecoratedMethods, capabilityName } from './collect.js';
2
2
  /** 方法函数 → spec。WeakMap 不阻碍 GC,也不要求 globalThis 注册表。 */
3
3
  const toolSpecs = new WeakMap();
4
4
  /**
5
5
  * 方法装饰器:登记 spec。被装饰方法入参即结构化 tool input,
6
6
  * 返回值(或 Promise)即 tool_result。抛错由 engine 包成 is_error,不中断 run。
7
7
  *
8
- * 泛型 <I, O> 可把方法签名与编译期类型绑定(`@Tool<{city:string}, string>({...})`),
9
- * 挡住签名笔误;缺省 any 保持宽松。schema 与 I 的一致性仍由开发者保证(已知边界)。
8
+ * 类型检查由 **schema 驱动**:
9
+ * - `schema: fromZod<T>(…)`(TypedSchema<T>)→ 方法入参必须是 `T`,签名与 schema
10
+ * 不一致直接编译期报错 —— schema 即单一事实来源,不用两处双写;
11
+ * - `schema: {…}`(裸 JsonSchema)→ 入参回落 `any`,不校验(宽松旧行为)。
12
+ *
13
+ * 第二个泛型 `O` 用于显式约束返回值(缺省 `any`,不校验)。
10
14
  */
11
15
  export function Tool(spec) {
12
- return function (value, context) {
13
- if (context.kind !== 'method') {
14
- throw new Error(`@Tool 只能修饰类方法,收到 kind=${String(context.kind)}`);
15
- }
16
+ return (value, context) => {
17
+ assertMethodTarget(context, '@Tool');
18
+ // spec 的 schema 在类型上更精确(S),登记表按擦除后的形态存(与 collect 一致)
16
19
  toolSpecs.set(value, spec);
17
20
  };
18
21
  }
@@ -22,7 +25,7 @@ export function collectTools(instance) {
22
25
  }
23
26
  function buildTool(instance, key, spec) {
24
27
  return {
25
- name: unitName(spec, key, '@Tool'),
28
+ name: capabilityName(spec, key, '@Tool'),
26
29
  description: spec.description,
27
30
  inputSchema: spec.schema,
28
31
  ...(spec.strict ? { strict: true } : {}),
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/toolkit/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAyB9D,sDAAsD;AACtD,MAAM,SAAS,GAAG,IAAI,OAAO,EAAsB,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,IAAI,CAAmB,IAAc;IACnD,OAAO,UACL,KAAmC,EACnC,OAAgD;QAEhD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CACrE,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,GAAoB,EAAE,IAAc;IACvE,OAAO;QACL,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;QAClC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK,CACV,QAAqE,CAAC,GAAG,CAAC,EAC3E,QAAQ,EACR,CAAC,KAAK,CAAC,CACR;KACJ,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../src/toolkit/tool.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAgCxF,sDAAsD;AACtD,MAAM,SAAS,GAAG,IAAI,OAAO,EAAsB,CAAC;AAEpD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,IAAI,CAA6C,IAAiB;IAChF,OAAO,CACL,KAAgD,EAChD,OAAmC,EAC7B,EAAE;QACR,kBAAkB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACrC,qDAAqD;QACrD,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,IAAgB,CAAC,CAAC;IACzC,CAAC,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,OAAO,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,CACrE,SAAS,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,QAAgB,EAAE,GAAoB,EAAE,IAAc;IACvE,OAAO;QACL,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC;QACxC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,WAAW,EAAE,IAAI,CAAC,MAAM;QACxB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE,CACtB,OAAO,CAAC,KAAK,CACV,QAAqE,CAAC,GAAG,CAAC,EAC3E,QAAQ,EACR,CAAC,KAAK,CAAC,CACR;KACJ,CAAC;AACJ,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { JsonSchema } from '../core/tool.js';
1
+ import type { JsonSchema, TypedSchema } from '../core/tool.js';
2
2
  /**
3
3
  * Agentia —— zod 可选接入(R2,duck-typed,框架永不 import zod)。
4
4
  *
@@ -14,7 +14,8 @@ import type { JsonSchema } from '../core/tool.js';
14
14
  * class WeatherTools {
15
15
  * @Tool({
16
16
  * description: '查天气',
17
- * schema: fromZod(z.toJSONSchema(Weather) as JsonSchema, Weather),
17
+ * // 显式给出结果类型 → 方法入参必须与之一致(不一致直接编译期报错)
18
+ * schema: fromZod<z.infer<typeof Weather>>(z.toJSONSchema(Weather) as JsonSchema, Weather),
18
19
  * })
19
20
  * get(input: { city: string; days: number }) { ... }
20
21
  * }
@@ -23,4 +24,4 @@ import type { JsonSchema } from '../core/tool.js';
23
24
  * @param jsonSchema 由 zod 推导的 JSON Schema(发给模型 / 走 JSON Schema 子集校验)
24
25
  * @param zod zod schema 本体(只需带 safeParse),其校验结果优先于 JSON Schema 子集
25
26
  */
26
- export declare function fromZod(jsonSchema: JsonSchema, zod: unknown): JsonSchema;
27
+ export declare function fromZod<T = unknown>(jsonSchema: JsonSchema, zod: unknown): TypedSchema<T>;
@@ -13,7 +13,8 @@
13
13
  * class WeatherTools {
14
14
  * @Tool({
15
15
  * description: '查天气',
16
- * schema: fromZod(z.toJSONSchema(Weather) as JsonSchema, Weather),
16
+ * // 显式给出结果类型 → 方法入参必须与之一致(不一致直接编译期报错)
17
+ * schema: fromZod<z.infer<typeof Weather>>(z.toJSONSchema(Weather) as JsonSchema, Weather),
17
18
  * })
18
19
  * get(input: { city: string; days: number }) { ... }
19
20
  * }
@@ -1 +1 @@
1
- {"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/toolkit/zod.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,OAAO,CAAC,UAAsB,EAAE,GAAY;IAC1D,MAAM,EAAE,GAAG,GAKV,CAAC;IACF,IAAI,OAAO,EAAE,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;IACD,kDAAkD;IAClD,OAAO;QACL,GAAG,UAAU;QACb,aAAa,EAAE,CAAC,KAAc,EAAiB,EAAE;YAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,SAAU,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,OAAO,UAAU,CAAC;YAC9B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../../src/toolkit/zod.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,OAAO,CAAc,UAAsB,EAAE,GAAY;IACvE,MAAM,EAAE,GAAG,GAKV,CAAC;IACF,IAAI,OAAO,EAAE,EAAE,SAAS,KAAK,UAAU,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;IACJ,CAAC;IACD,kDAAkD;IAClD,OAAO;QACL,GAAG,UAAU;QACb,aAAa,EAAE,CAAC,KAAc,EAAiB,EAAE;YAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,SAAU,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACnC,IAAI,CAAC,KAAK;gBAAE,OAAO,UAAU,CAAC;YAC9B,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtD,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,UAAU,CAAC,CAAC;QAC5E,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,133 @@
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 '../core/run.js';
5
+ import type { RunInvocationOptions } from '../engine/spec.js';
6
+ import type { MaybePromise, TaskRecord, TaskStore } from '../store/store.js';
7
+ /**
8
+ * Agentia —— 异步任务宿主(spec §6.3 异步 / §6.5 确定性 / §6.6 换宿主不换语义)。
9
+ *
10
+ * - submit 即回(queued),后台驱动状态机 queued → running → succeeded/failed;
11
+ * - **at-least-once 去重**:同一 idempotencyKey 重复 submit,若上一任务仍在
12
+ * queued/running/succeeded 则直接返回既有记录,不重复执行(失败可重试新任务);
13
+ * - run 记录落 TaskStore(v1 InMemoryTaskStore),trace 随 result 一同保留;
14
+ * DB/队列宿主只需实现 TaskStore。
15
+ *
16
+ * 异步 TaskStore(R6,TaskStore 方法返回 MaybePromise):
17
+ * - 内部执行路径(#execute / awaitTask / resumePending)全部 await 化,两种 store 通吃;
18
+ * - submit/poll/byIdempotency/list 是**同步门面**,为同步 store 保持原有用法与返回类型
19
+ * (http/scheduler/既有调用方零改动)。接异步 store 时:submit 的即时去重无法进行
20
+ * (推迟到 #execute:同键已有 succeeded 记录则采纳其结果、不重复执行),poll 等
21
+ * 返回 Promise 需调用方自行 await。
22
+ */
23
+ /**
24
+ * 任务完成回调(C5)。任务达终态、记录已落库后调用。
25
+ * **抛错被吞**,绝不影响任务状态(与 trace sink / memory 回写同款防护)。
26
+ *
27
+ * webhook 故意**不做进框架**:用本接口 + 你自己的 `fetch` 就能搭(含签名与重试策略),
28
+ * 而那会引入「出站请求 + 重试 + 签名」一整套复杂度。
29
+ */
30
+ export interface TaskSink {
31
+ onFinished(rec: TaskRecord): void | Promise<void>;
32
+ }
33
+ export interface AsyncRunnerOptions {
34
+ client?: ModelClient;
35
+ store?: TaskStore;
36
+ /** 同时执行的任务上限;缺省不限。超出部分排队等槽位(状态保持 queued) */
37
+ concurrency?: number;
38
+ /** 任务完成回调(进程内);见 TaskSink */
39
+ taskSinks?: TaskSink[];
40
+ /**
41
+ * 单任务执行超时(毫秒);缺省 0 = 不限。
42
+ *
43
+ * **超时即中止**:到点会 abort 本次 run 的 signal —— 对尊重 signal 的模型客户端
44
+ * (框架自带的 Anthropic / OpenAI 适配器都转发 signal)是**真中止**,token 不再继续烧;
45
+ * 不尊重 signal 的自定义 client 则仍等价于「放弃等待」(run 在后台跑完、产物丢弃)。
46
+ * 槽位无论如何立即回收;被放弃且仍在跑的任务会让实际并发短暂高于 concurrency。
47
+ */
48
+ runTimeoutMs?: number;
49
+ }
50
+ /** resumePending 的启动扫描选项 */
51
+ export interface ResumePendingOptions {
52
+ /**
53
+ * 他进程任务的「保鲜期」(毫秒);缺省 0 = 不判断,一律重派(重启即续跑)。
54
+ * > 0 时跳过 startedAt/createdAt 距今不足该值的他进程记录 —— 那些任务大概
55
+ * 正在别的进程里跑着,抢过来会重复执行。0 适合单进程部署(旧语义)。
56
+ */
57
+ staleAfterMs?: number;
58
+ }
59
+ /** 应用最小调用面(agent 装配无关,避免 run 层向上依赖 toolkit) */
60
+ export interface AppCallable {
61
+ readonly name: string;
62
+ run(messages: Anthropic.MessageParam[], opts?: RunInvocationOptions): Promise<{
63
+ run: {
64
+ runId: string;
65
+ status: RunStatus;
66
+ };
67
+ result: AgentRunResult;
68
+ }>;
69
+ }
70
+ export declare class AsyncRunner {
71
+ #private;
72
+ private readonly app;
73
+ readonly store: TaskStore;
74
+ /** 本进程标识:写进认领的 TaskRecord.ownerId,供 resumePending 区分他我 */
75
+ readonly ownerId: string;
76
+ private readonly client?;
77
+ private readonly concurrency;
78
+ private readonly runTimeoutMs;
79
+ private running;
80
+ private readonly waitQueue;
81
+ /** 已受理但未达终态的任务数(queued + running)—— /healthz 与 drain 共用 */
82
+ private active;
83
+ private draining;
84
+ private readonly drainWaiters;
85
+ private readonly taskSinks;
86
+ constructor(app: AppCallable, opts?: AsyncRunnerOptions);
87
+ /**
88
+ * 提交一次异步任务。入参可为 string / messages / {prompt|text|messages}。
89
+ * 幂等键存在且上一任务未失败 → 直接返回既有记录(去重);失败的同键可产生新任务。
90
+ * 同步门面:同步 store 下立即去重并返回快照;异步 store 下 save 在后台完成、
91
+ * 去重推迟到执行前(见 #execute),返回新建任务的提交时刻快照。
92
+ */
93
+ submit(input: unknown, opts?: {
94
+ idempotencyKey?: string;
95
+ source?: string;
96
+ options?: RunInvocationOptions;
97
+ }): TaskRecord;
98
+ /** 查任务当前记录(异步 store 下返回 Promise,调用方 await) */
99
+ poll(taskId: string): MaybePromise<TaskRecord | undefined>;
100
+ byIdempotency(key: string): MaybePromise<TaskRecord | undefined>;
101
+ list(): MaybePromise<TaskRecord[]>;
102
+ /** 已受理但未达终态的任务数(queued + running)—— 健康检查与 drain 共用同一口径 */
103
+ get inFlight(): number;
104
+ /** 是否已进入优雅停机(drain 之后为 true)—— HTTP 宿主据此对新单回 503 */
105
+ get isDraining(): boolean;
106
+ /**
107
+ * 优雅停机:停止接单(此后 `submit` 抛错),等待已受理任务排空(或超时)。
108
+ *
109
+ * 返回是否排空干净:超时仍返回 `false`,**未完成的任务留在 store 里**,下次启动由
110
+ * `resumePending` 续跑(所以 drain 不是「丢弃」,是「不再往前推」)。
111
+ * - `timeoutMs` 缺省 0 = 一直等。
112
+ * - 等待的是**所有已受理**的任务(queued 的也在内),不只是正在占槽位的那些。
113
+ */
114
+ drain(opts?: {
115
+ timeoutMs?: number;
116
+ }): Promise<boolean>;
117
+ /** 等到任务终态;超时抛错。 */
118
+ awaitTask(taskId: string, opts?: {
119
+ timeoutMs?: number;
120
+ intervalMs?: number;
121
+ }): Promise<TaskRecord>;
122
+ /**
123
+ * 宿主重启续跑:把 store 里 queued | running 的记录重新派发执行
124
+ * (running 视为进程中断)。返回重派数量(异步 store 下返回 Promise<number>)。
125
+ * 幂等键去重照常生效。
126
+ *
127
+ * 多进程共用一个 store 时靠 `ownerId` 区分他我:
128
+ * - 本进程的记录一律跳过(它还在本进程内存里跑,重派 = 跑两遍);
129
+ * - `staleAfterMs > 0` 时,startedAt/createdAt 距今不足该值的他进程记录也跳过
130
+ * (大概正被那个进程执行)。缺省 0 = 不判断、一律重派(单进程旧语义)。
131
+ */
132
+ resumePending(opts?: ResumePendingOptions): number | Promise<number>;
133
+ }