@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,36 +1,31 @@
1
1
  import type Anthropic from '@anthropic-ai/sdk';
2
- import type { AgentTool } from '../core/tool.js';
2
+ import type { AgentTool, JsonSchema, ModelPricing, SchemaType } from '../core/tool.js';
3
3
  import type { SystemParam } from '../engine/types.js';
4
- import { SystemPrompt } from '../run/systemPrompt.js';
5
- import type { RunInvocationOptions } from '../run/spec.js';
4
+ import { SystemPrompt } from '../runtime/systemPrompt.js';
5
+ import type { RunInvocationOptions } from '../engine/spec.js';
6
+ import type { SessionStore } from '../runtime/session.js';
6
7
  import type { AgentRunResult } from '../engine/types.js';
8
+ import type { TraceSink } from '../core/trace.js';
7
9
  import { Container } from '../container/container.js';
8
10
  import type { Provider, Token } from '../container/container.js';
9
- import type { UnitMiddleware } from './middleware.js';
11
+ import type { CapabilityMiddleware } from './middleware.js';
10
12
  import type { ContextPolicy } from '../engine/types.js';
13
+ import type { RetryOptions } from '../engine/retry.js';
11
14
  /**
12
- * Agentia —— 应用装配(spec §4/§6:主 agent + 可调工具菜单)。
13
- *
14
- * createApp 组装:DI 容器注册 providers(手动和/或 discover 目录发现)→
15
- * 从容器实例自动扫描 @Tool / @SubAgent / @Skill / @Prompt 收集成本 app 的工具菜单
16
- * → agent.run(messages) 带着菜单走 executeRun。装配期统一静态校验(§7):
17
- * 菜单查重、tools 引用存在性、toolSources 指向。
18
- * 主 agent 的 system 可由 SystemPrompt 实例给出(内部 build({cache:true})
19
- * 打稳定前缀 breakpoint),也接受已拼好的 SystemParam 原样透传。
20
- */
21
- /**
22
- * 能力包(roadmap R5):第三方包把「单元 providers + 中间件」打包成 AgentModule 分发,
15
+ * 能力包(roadmap R5):第三方包把「能力 providers + 中间件」打包成 AgentModule 分发,
23
16
  * 应用侧经 AppOptions.modules 一次性装配。模块的 providers 先于应用级 providers 注册
24
17
  *(同 token 应用级覆盖模块级);中间件拼接顺序同样模块在前。
25
18
  */
26
19
  export interface AgentModule {
27
- /** 模块携带的 DI providers(单元类 / 值 / 工厂) */
20
+ /** 模块携带的 DI providers(能力类 / 值 / 工厂) */
28
21
  providers: Provider[];
29
- /** 模块级单元调用中间件(拼在应用级 middleware 之前,即更外层) */
30
- middleware?: UnitMiddleware[];
22
+ /** 模块级能力调用中间件(拼在应用级 middleware 之前,即更外层) */
23
+ middleware?: CapabilityMiddleware[];
31
24
  }
32
25
  /** 定义能力包:identity 函数,仅给第三方包一个类型锚点与导出约定 */
33
26
  export declare function defineModule(m: AgentModule): AgentModule;
27
+ /** 注册全局默认 trace sink(观测 / dev 工具用)。createApp 构造期快照合并,已建应用不受后续注册影响。 */
28
+ export declare function registerDefaultTraceSink(sink: TraceSink): void;
34
29
  export interface AppOptions {
35
30
  /** 应用名;同时作为 run 名写入 trace */
36
31
  name?: string;
@@ -39,11 +34,12 @@ export interface AppOptions {
39
34
  /** 能力包:providers 并入(在 providers 之前注册)、middleware 拼接(在 middleware 之前) */
40
35
  modules?: AgentModule[];
41
36
  /**
42
- * 单元目录发现:units/<name>/ 目录约定(一单元一文件夹,index.ts 入口)。
43
- * 给目录路径(相对 cwd)即启动期扫描装配;因动态 import,带 discover 的
44
- * createApp 返回 Promise<AgentApp>。
37
+ * 能力目录发现:`<目录>/<name>/index.ts` 约定(一能力一文件夹)。
38
+ * 给**一个目录**或**一组目录**(数组顺序即装配顺序)——典型布局是四分类目录
39
+ * `src/tools` / `src/skills` / `src/prompts` / `src/subagents`。
40
+ * 启动期扫描装配;因动态 import,带 discover 的 createApp 返回 Promise<AgentApp>。
45
41
  */
46
- discover?: string;
42
+ discover?: string | string[];
47
43
  /** 主 agent system:SystemPrompt 实例(自动打缓存)或拼好的 SystemParam */
48
44
  system: SystemPrompt | SystemParam;
49
45
  /** 缺省模型;不给则走 engine 默认(claude-opus-5) */
@@ -54,39 +50,109 @@ export interface AppOptions {
54
50
  maxIterations?: number;
55
51
  /** 缺省上下文预算策略(compaction / context editing) */
56
52
  contextPolicy?: ContextPolicy;
53
+ /** 缺省模型请求重试策略(可被单次 run 覆盖);见 RunAgentOptions.retry */
54
+ retry?: RetryOptions | false;
55
+ /** 缺省成本硬管控:整条 run 累计 token 上限(可被单次 run 覆盖) */
56
+ maxTotalTokens?: number;
57
+ /** 缺省成本硬管控:累计成本(美元)上限(可被单次 run 覆盖) */
58
+ maxCostUsd?: number;
59
+ /**
60
+ * 价格表覆盖/追加($/1M tokens,可被单次 run 覆盖);见 `RunAgentOptions.priceOverrides`。
61
+ * 给非 Anthropic 端点(DeepSeek / 自建)定价,否则 `maxCostUsd` 会静默不生效。
62
+ */
63
+ priceOverrides?: Record<string, ModelPricing>;
64
+ /** 未定价模型回调(可被单次 run 覆盖);见 `RunAgentOptions.onUnpricedModel` */
65
+ onUnpricedModel?: (info: {
66
+ model: string;
67
+ spanId: string;
68
+ }) => void;
69
+ /** 缺省单个工具执行超时(毫秒,可被单次 run 覆盖);0/不设 = 不限 */
70
+ toolTimeoutMs?: number;
71
+ /** 缺省同回合并行工具上限(可被单次 run 覆盖);不设 = 不限 */
72
+ maxToolConcurrency?: number;
57
73
  /** 只扫这些 token 的 provider 上的 @Tool;缺省扫全部 providers */
58
74
  toolSources?: Token[];
59
- /** 单元调用中间件(洋葱模型,链序 = 注册顺序);装配期包裹整个菜单 */
60
- middleware?: UnitMiddleware[];
75
+ /**
76
+ * 直接追加到主菜单的**裸工具**(`AgentTool[]`)—— 给「构造期才知道有哪些工具」的场景
77
+ * (典型:MCP 桥 `mcpTools()` 的返回值,见 integrations/mcp.ts)。
78
+ *
79
+ * 与装饰器收集来的能力**完全同等**:同样过中间件链、同样进重名查重、同样受
80
+ * `toolSources` 之外的一切装配规则约束(不受 `toolSources` 收窄影响 —— 这是显式追加)。
81
+ * 不经装饰器、不进 DI 容器(它没有 provider token,也不是任何能力的 tools 引用目标)。
82
+ */
83
+ tools?: AgentTool[];
84
+ /** 能力调用中间件(洋葱模型,链序 = 注册顺序);装配期包裹整个菜单 */
85
+ middleware?: CapabilityMiddleware[];
86
+ /** trace 出口(观测):每次 run 收尾投递;与全局默认 sink 合并(本字段在前) */
87
+ sinks?: TraceSink[];
61
88
  }
62
89
  /** 单次调用参数 = 通用调用参数 + 单次可覆盖 system(spec.ts 的 RunInvocationOptions 为单源) */
63
- export interface RunAppOptions extends RunInvocationOptions {
90
+ export interface RunAppOptions<S extends JsonSchema = JsonSchema> extends RunInvocationOptions {
64
91
  /** 单次覆盖 system(volatile 段建议每 run 重建以拾取最新值) */
65
92
  system?: SystemPrompt | SystemParam;
93
+ /**
94
+ * 结构化结果 schema(R2):语义同 `RunAgentOptions.resultSchema`(engine 追加隐藏
95
+ * submit_result 工具,校验通过的结果写入 `result.typed`)。
96
+ * 传 `fromZod<T>(...)` 时 `app.run` 的返回类型自动带上 `typed: T | undefined`。
97
+ */
98
+ resultSchema?: S;
99
+ /**
100
+ * 会话持久化(C4):语义同 `ExecuteRunOptions.session` —— run 开始把历史拼在传入
101
+ * messages 之前,成功收尾把本轮消息 + 回复追加回去。与 `blackboard`(键值黑板)正交。
102
+ *
103
+ * 只在程序内直接 `app.run` 时可用(store 实例不可序列化,因此**不在**
104
+ * transport 的 `RunInvocationOptions` 里 —— 异步宿主不会替你传它)。
105
+ */
106
+ session?: {
107
+ store: SessionStore;
108
+ id: string;
109
+ };
110
+ /**
111
+ * 未定价模型回调(单次覆盖应用级);见 `RunAgentOptions.onUnpricedModel`。
112
+ * 是函数,因此**不在** transport 的 `RunInvocationOptions` 里(异步宿主不替你传)。
113
+ */
114
+ onUnpricedModel?: (info: {
115
+ model: string;
116
+ spanId: string;
117
+ }) => void;
66
118
  }
67
- export interface AgentRunOutput {
68
- run: import('../run/run.js').Run;
69
- result: AgentRunResult;
119
+ export interface AgentRunOutput<T = unknown> {
120
+ run: import('../runtime/run.js').Run;
121
+ result: AgentRunResult<T>;
70
122
  }
123
+ /**
124
+ * Agentia —— 应用装配(spec §4/§6:主 agent + 可调工具菜单)。
125
+ *
126
+ * createApp 组装:DI 容器注册 providers(手动和/或 discover 目录发现)→
127
+ * 从容器实例自动扫描 @Tool / @SubAgent / @Skill / @Prompt 收集成本 app 的工具菜单
128
+ * → agent.run(messages) 带着菜单走 executeRun。装配期统一静态校验(§7):
129
+ * 菜单查重、tools 引用存在性、toolSources 指向。
130
+ * 主 agent 的 system 可由 SystemPrompt 实例给出(内部 build({cache:true})
131
+ * 打稳定前缀 breakpoint),也接受已拼好的 SystemParam 原样透传。
132
+ */
71
133
  export declare class AgentApp {
72
134
  readonly name: string;
73
135
  private readonly di;
74
136
  private readonly system;
75
137
  private readonly base;
76
- private _tools?;
138
+ private _tools;
139
+ private readonly sinks;
77
140
  constructor(opts: AppOptions);
78
141
  /** app 已装配好的工具菜单(构建期即从容器解析,静态稳定) */
79
142
  get tools(): AgentTool[];
80
- /** 容器访问点(后续 trace 拦截器/生命周期回调可用) */
143
+ /** 容器访问点 */
81
144
  get container(): Container;
82
- /** 执行一次主 agent run。system 每 run 从 SystemPrompt 重建,保证 volatile 新鲜。 */
83
- run(messages: Anthropic.MessageParam[], opts?: RunAppOptions): Promise<AgentRunOutput>;
145
+ /**
146
+ * 执行一次主 agent run。system 每 run 从 SystemPrompt 重建,保证 volatile 新鲜。
147
+ * 传 `resultSchema: fromZod<T>(...)` 时返回值 `result.typed` 为 `T | undefined`。
148
+ */
149
+ run<S extends JsonSchema = JsonSchema>(messages: Anthropic.MessageParam[], opts?: RunAppOptions<S>): Promise<AgentRunOutput<SchemaType<S>>>;
84
150
  }
85
151
  /**
86
- * 装配应用。不带 discover 时同步返回 AgentApp;带 discover(单元目录路径)时
152
+ * 装配应用。不带 discover 时同步返回 AgentApp;带 discover(能力目录路径,一个或一组)时
87
153
  * 先扫描装配,返回 Promise<AgentApp>(动态 import 决定)。
88
154
  */
89
155
  export declare function createApp(opts: AppOptions & {
90
- discover: string;
156
+ discover: string | string[];
91
157
  }): Promise<AgentApp>;
92
158
  export declare function createApp(opts: AppOptions): AgentApp;
@@ -1,5 +1,5 @@
1
- import { SystemPrompt } from '../run/systemPrompt.js';
2
- import { executeRun } from '../run/run.js';
1
+ import { SystemPrompt } from '../runtime/systemPrompt.js';
2
+ import { executeRun } from '../runtime/run.js';
3
3
  import { Container } from '../container/container.js';
4
4
  import { discoverProviders } from './discover.js';
5
5
  import { collectTools } from './tool.js';
@@ -11,12 +11,28 @@ import { applyMiddleware } from './middleware.js';
11
11
  export function defineModule(m) {
12
12
  return m;
13
13
  }
14
+ const defaultSinks = [];
15
+ /** 注册全局默认 trace sink(观测 / dev 工具用)。createApp 构造期快照合并,已建应用不受后续注册影响。 */
16
+ export function registerDefaultTraceSink(sink) {
17
+ defaultSinks.push(sink);
18
+ }
19
+ /**
20
+ * Agentia —— 应用装配(spec §4/§6:主 agent + 可调工具菜单)。
21
+ *
22
+ * createApp 组装:DI 容器注册 providers(手动和/或 discover 目录发现)→
23
+ * 从容器实例自动扫描 @Tool / @SubAgent / @Skill / @Prompt 收集成本 app 的工具菜单
24
+ * → agent.run(messages) 带着菜单走 executeRun。装配期统一静态校验(§7):
25
+ * 菜单查重、tools 引用存在性、toolSources 指向。
26
+ * 主 agent 的 system 可由 SystemPrompt 实例给出(内部 build({cache:true})
27
+ * 打稳定前缀 breakpoint),也接受已拼好的 SystemParam 原样透传。
28
+ */
14
29
  export class AgentApp {
15
30
  name;
16
31
  di;
17
32
  system;
18
33
  base;
19
- _tools;
34
+ _tools = [];
35
+ sinks;
20
36
  constructor(opts) {
21
37
  this.name = opts.name ?? 'app';
22
38
  const modules = opts.modules ?? [];
@@ -31,87 +47,127 @@ export class AgentApp {
31
47
  ];
32
48
  this.di = new Container().register(...providerList);
33
49
  this.system = opts.system;
50
+ // trace 出口:应用级 sinks 在前,全局默认 sink 在后(构造期快照,注册表后续变化不影响本应用)
51
+ this.sinks = [...(opts.sinks ?? []), ...defaultSinks];
34
52
  this.base = {
35
53
  model: opts.model,
36
54
  maxTokens: opts.maxTokens,
37
55
  maxIterations: opts.maxIterations,
38
56
  contextPolicy: opts.contextPolicy,
57
+ retry: opts.retry,
58
+ maxTotalTokens: opts.maxTotalTokens,
59
+ maxCostUsd: opts.maxCostUsd,
60
+ priceOverrides: opts.priceOverrides,
61
+ onUnpricedModel: opts.onUnpricedModel,
62
+ toolTimeoutMs: opts.toolTimeoutMs,
63
+ maxToolConcurrency: opts.maxToolConcurrency,
39
64
  };
40
65
  // 先为每个 provider 解析实例并预收集它的 @Tool / @SubAgent / @Skill / @Prompt;
41
66
  // 子 agent / skill 的 tools token 在装配期即解析到该 provider 的 @Tool 菜单(静态校验)。
42
67
  const plainByToken = new Map();
43
- const unitsByToken = new Map();
68
+ const capabilitiesByToken = new Map();
44
69
  const skillsByToken = new Map();
45
70
  const promptsByToken = new Map();
46
71
  for (const p of providerList) {
47
72
  const inst = this.di.resolve(p.provide);
48
73
  plainByToken.set(p.provide, collectTools(inst));
49
- unitsByToken.set(p.provide, collectSubAgents(inst));
74
+ capabilitiesByToken.set(p.provide, collectSubAgents(inst));
50
75
  skillsByToken.set(p.provide, collectSkills(inst));
51
76
  promptsByToken.set(p.provide, collectPrompts(inst));
52
77
  }
78
+ // 能力调用中间件:装配期包裹整个菜单(洋葱模型,对 engine 零侵入);
79
+ // 模块级中间件在前(更外层),应用级在后。
80
+ const middleware = [...modules.flatMap((m) => m.middleware ?? []), ...(opts.middleware ?? [])];
81
+ const wrap = (tools) => middleware.length ? applyMiddleware(tools, middleware) : tools;
82
+ /**
83
+ * 中间件包装**之后**的每 provider 菜单。
84
+ *
85
+ * 嵌套能力(子 agent / skill)解析自身 tools 引用时必须从这里取 —— 若取
86
+ * 「中间件包装之前的原始菜单」,子 agent 内部调用的每一个工具都会绕过中间件
87
+ * (鉴权 / 限流 / 审计 / 结果缓存全部失效),是 spec §10 记录在案的既知问题。
88
+ * 该 map 在 resolveRefTools 的 thunk 被真正调用(运行时)前已填充完毕。
89
+ */
90
+ const wrappedByToken = new Map();
53
91
  // 装配期立即解析 tools 引用(§7 启动期静态校验):引用未注册 provider 在
54
- // createApp 即抛错,不延迟到模型调用该单元的运行时。
92
+ // createApp 即抛错,不延迟到模型调用该能力的运行时。实际取值延迟到运行时
93
+ // (惰性 thunk)—— 那时 wrappedByToken 已就绪。
55
94
  const resolveRefTools = (owner, refs) => {
56
- const resolved = (refs ?? []).flatMap((t) => {
57
- const inner = plainByToken.get(t);
58
- if (!inner) {
95
+ for (const t of refs ?? []) {
96
+ if (!plainByToken.has(t)) {
59
97
  throw new Error(`${owner} tools 引用未注册 provider: "${t}"`);
60
98
  }
61
- return inner;
62
- });
63
- return () => resolved;
64
- };
65
- const sources = opts.toolSources ?? providerList.map((p) => p.provide);
66
- this._tools = sources.flatMap((token) => {
67
- if (!this.di.has(token)) {
68
- throw new Error(`toolSources 指向未注册 provider: "${token}"`);
69
99
  }
100
+ return () => (refs ?? []).flatMap((t) => wrappedByToken.get(t) ?? []);
101
+ };
102
+ const buildSlice = (token) => {
70
103
  const plain = plainByToken.get(token) ?? [];
71
- const subTools = (unitsByToken.get(token) ?? []).map((unit) => subagentToTool(unit, resolveRefTools(`@SubAgent "${unit.name}"`, unit.spec.tools)));
72
- const skillTools = (skillsByToken.get(token) ?? []).map((unit) => skillToTool(unit, resolveRefTools(`@Skill "${unit.name}"`, unit.spec.tools)));
104
+ const subTools = (capabilitiesByToken.get(token) ?? []).map((capability) => subagentToTool(capability, resolveRefTools(`@SubAgent "${capability.name}"`, capability.spec.tools)));
105
+ const skillTools = (skillsByToken.get(token) ?? []).map((capability) => skillToTool(capability, resolveRefTools(`@Skill "${capability.name}"`, capability.spec.tools)));
73
106
  const promptTools = promptsByToken.get(token) ?? [];
74
107
  return [...plain, ...subTools, ...skillTools, ...promptTools];
75
- });
108
+ };
109
+ // 全部 provider 都切片并包装:主菜单只取 sources,但被 toolSources 排除的
110
+ // provider 上的能力仍可被其他能力的 tools 引用(引用是作者显式声明,不受收窄影响)——
111
+ // 因此包装必须覆盖全部 provider,否则 ref 解析会拿到未包装(可绕过中间件)的工具。
112
+ for (const p of providerList) {
113
+ wrappedByToken.set(p.provide, wrap(buildSlice(p.provide)));
114
+ }
115
+ // toolSources 是「取哪些 provider 的能力」的白名单,同一 token 写重只该取一次:
116
+ // 不去重则会 flatMap 收两遍该 provider 的能力,最后撞上「菜单能力重名」——
117
+ // 报错指向能力定义(错误来源),而真正的问题是这份清单里重复写了 token。
118
+ const sources = opts.toolSources
119
+ ? [...new Set(opts.toolSources)]
120
+ : providerList.map((p) => p.provide);
121
+ this._tools = [
122
+ ...sources.flatMap((token) => {
123
+ if (!this.di.has(token)) {
124
+ throw new Error(`toolSources 指向未注册 provider: "${token}"`);
125
+ }
126
+ return wrappedByToken.get(token) ?? [];
127
+ }),
128
+ // 裸工具(AppOptions.tools):与装饰器收集来的能力同等 —— 一样过中间件、
129
+ // 一样进下面的重名查重。**不是旁路**(旁路会绕过鉴权/限流/审计)。
130
+ ...wrap(opts.tools ?? []),
131
+ ];
76
132
  // §7 静态校验(最小落地):菜单统一查重 —— 重名会让模型在歧义菜单里猜,直接报错。
77
133
  const dup = new Map();
78
134
  for (const t of this._tools)
79
135
  dup.set(t.name, (dup.get(t.name) ?? 0) + 1);
80
136
  const dupNames = [...dup.entries()].filter(([, n]) => n > 1).map(([n]) => n);
81
137
  if (dupNames.length > 0) {
82
- throw new Error(`菜单单元重名(tool/skill/subagent/prompt 共用命名空间): ${dupNames.join(', ')}`);
138
+ throw new Error(`菜单能力重名(tool/skill/subagent/prompt 共用命名空间): ${dupNames.join(', ')}`);
83
139
  }
84
- // 孤儿单元告警:toolSources 显式收窄时,被排除 provider 上的单元不可达
140
+ // 孤儿能力告警:toolSources 显式收窄时,被排除 provider 上的能力不在主菜单
141
+ // (模型无法直接调用);但**仍可被其他能力的 tools 引用**(引用是作者显式声明),
142
+ // 所以只是「不在主菜单」而非「不可达」。
85
143
  if (opts.toolSources) {
86
144
  const included = new Set(opts.toolSources);
87
145
  for (const p of providerList) {
88
146
  if (included.has(p.provide))
89
147
  continue;
90
148
  const orphanCount = (plainByToken.get(p.provide)?.length ?? 0) +
91
- (unitsByToken.get(p.provide)?.length ?? 0) +
149
+ (capabilitiesByToken.get(p.provide)?.length ?? 0) +
92
150
  (skillsByToken.get(p.provide)?.length ?? 0) +
93
151
  (promptsByToken.get(p.provide)?.length ?? 0);
94
152
  if (orphanCount > 0) {
95
- console.warn(`[agentia] 孤儿单元告警:provider "${p.provide}" 上的 ${orphanCount} 个单元不在 toolSources 内,不可达`);
153
+ console.warn(`[agentia] 孤儿能力告警:provider "${p.provide}" 上的 ${orphanCount} 个能力不在 toolSources 内,` +
154
+ `不进主菜单(模型无法直接调用);若被其他能力的 tools 引用仍可被调用`);
96
155
  }
97
156
  }
98
157
  }
99
- // 单元调用中间件:装配期包裹整个菜单(洋葱模型,对 engine 零侵入);
100
- // 模块级中间件在前(更外层),应用级在后。
101
- const middleware = [...modules.flatMap((m) => m.middleware ?? []), ...(opts.middleware ?? [])];
102
- if (middleware.length) {
103
- this._tools = applyMiddleware(this._tools, middleware);
104
- }
105
158
  }
106
159
  /** app 已装配好的工具菜单(构建期即从容器解析,静态稳定) */
107
160
  get tools() {
108
- return this._tools ?? [];
161
+ return this._tools;
109
162
  }
110
- /** 容器访问点(后续 trace 拦截器/生命周期回调可用) */
163
+ /** 容器访问点 */
111
164
  get container() {
112
165
  return this.di;
113
166
  }
114
- /** 执行一次主 agent run。system 每 run 从 SystemPrompt 重建,保证 volatile 新鲜。 */
167
+ /**
168
+ * 执行一次主 agent run。system 每 run 从 SystemPrompt 重建,保证 volatile 新鲜。
169
+ * 传 `resultSchema: fromZod<T>(...)` 时返回值 `result.typed` 为 `T | undefined`。
170
+ */
115
171
  run(messages, opts = {}) {
116
172
  const sys = opts.system ?? this.system;
117
173
  const system = sys instanceof SystemPrompt ? sys.build({ cache: true }) : sys;
@@ -128,11 +184,27 @@ export class AgentApp {
128
184
  runName: this.name,
129
185
  idempotencyKey: opts.idempotencyKey,
130
186
  contextPolicy: opts.contextPolicy ?? this.base.contextPolicy,
187
+ retry: opts.retry ?? this.base.retry,
188
+ maxTotalTokens: opts.maxTotalTokens ?? this.base.maxTotalTokens,
189
+ maxCostUsd: opts.maxCostUsd ?? this.base.maxCostUsd,
190
+ priceOverrides: opts.priceOverrides ?? this.base.priceOverrides,
191
+ onUnpricedModel: opts.onUnpricedModel ?? this.base.onUnpricedModel,
192
+ toolTimeoutMs: opts.toolTimeoutMs ?? this.base.toolTimeoutMs,
193
+ maxToolConcurrency: opts.maxToolConcurrency ?? this.base.maxToolConcurrency,
194
+ resultSchema: opts.resultSchema,
195
+ // 提示词版本化(D4):system 是 SystemPrompt 实例时自动带上它的 version
196
+ // (run 根 attribute `system.version`);传已拼好的 SystemParam 则无版本可记。
197
+ systemVersion: sys instanceof SystemPrompt ? sys.version : undefined,
198
+ session: opts.session,
131
199
  rethrow: opts.rethrow,
200
+ sinks: this.sinks,
132
201
  contextInit: (ctx) => {
133
202
  if (seed) {
134
- for (const key of Object.keys(seed))
135
- ctx.set(key, seed[key]);
203
+ // 种子键是运行期字符串,类型上无从与「用户声明的 Blackboard」对齐 ——
204
+ // 走文档里给用户的同一条逃生口:断言为 BlackboardKey。
205
+ const entries = seed;
206
+ for (const key of Object.keys(entries))
207
+ ctx.set(key, entries[key]);
136
208
  }
137
209
  },
138
210
  });
@@ -140,7 +212,11 @@ export class AgentApp {
140
212
  }
141
213
  export function createApp(opts) {
142
214
  if (opts.discover) {
143
- return discoverProviders(opts.discover).then((found) => new AgentApp({ ...opts, providers: [...(opts.providers ?? []), ...found] }));
215
+ return discoverProviders(opts.discover).then(
216
+ // 显式 providers 放在发现结果**之后**:AppOptions.providers 是应用级显式声明,
217
+ // 同 token 时应覆盖「目录里扫出来的」(后注册覆盖先注册)。反过来会让
218
+ // capabilities/ 下一个同名文件夹悄悄顶掉调用方手写的 provider。
219
+ (found) => new AgentApp({ ...opts, providers: [...found, ...(opts.providers ?? [])] }));
144
220
  }
145
221
  return new AgentApp(opts);
146
222
  }
@@ -1 +1 @@
1
- {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/toolkit/module.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"module.js","sourceRoot":"","sources":["../../src/toolkit/module.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
+ import type { CapabilityDecoratorContext } from './collect.js';
1
2
  import type { AgentTool, JsonSchema } from '../core/tool.js';
2
3
  /**
3
- * Agentia —— Prompt 单元(spec §3:纯文本资产 —— 模板/宏/playbook,被选中时注入上下文)。
4
+ * Agentia —— Prompt 能力(spec §3:纯文本资产 —— 模板/宏/playbook,被选中时注入上下文)。
4
5
  *
5
6
  * 运行时本质:把 prompt 编译成主 agent 菜单里一个**无副作用拉取型 AgentTool** ——
6
7
  * 模型判定“这活儿需要该资产”时调用它,返回文本以 tool_result 进上下文。这是
7
- * 我们现成唯一的“被选中”机制(unit 本身不跑循环、不调模型)。
8
+ * 我们现成唯一的“被选中”机制(capability 本身不跑循环、不调模型)。
8
9
  *
9
10
  * 声明形态(标准装饰器下字段装饰器拿不到值/类引用,故只支持方法形态,与
10
11
  * spec §4 草图的 `static brand = '…'` 用 `static method` 同效表达):
@@ -21,10 +22,7 @@ export interface PromptSpec {
21
22
  schema?: JsonSchema;
22
23
  }
23
24
  /** 方法装饰器(实例或 static 均可):登记 prompt spec。返回值 = 资产文本。 */
24
- export declare function Prompt(spec: PromptSpec): (value: Function, context: {
25
- kind: string;
26
- name: string | symbol;
27
- }) => void;
25
+ export declare function Prompt(spec: PromptSpec): (value: Function, context: CapabilityDecoratorContext) => void;
28
26
  /**
29
27
  * 收集容器实例(+ 其类上的静态方法)里所有 @Prompt,产出 AgentTool[]。
30
28
  * 实例方法沿原型链(含继承);静态方法扫描 instance.constructor 自身属性。
@@ -1,4 +1,4 @@
1
- import { scanDecoratedMethods, unitName } from './collect.js';
1
+ import { assertMethodTarget, scanDecoratedMethods, capabilityName } from './collect.js';
2
2
  const promptSpecs = new WeakMap();
3
3
  const EMPTY_SCHEMA = {
4
4
  type: 'object',
@@ -7,10 +7,8 @@ const EMPTY_SCHEMA = {
7
7
  };
8
8
  /** 方法装饰器(实例或 static 均可):登记 prompt spec。返回值 = 资产文本。 */
9
9
  export function Prompt(spec) {
10
- return function (value, context) {
11
- if (context.kind !== 'method') {
12
- throw new Error(`@Prompt 只能修饰方法(static 方法亦可),收到 kind=${String(context.kind)}`);
13
- }
10
+ return (value, context) => {
11
+ assertMethodTarget(context, '@Prompt');
14
12
  promptSpecs.set(value, spec);
15
13
  };
16
14
  }
@@ -20,18 +18,21 @@ export function Prompt(spec) {
20
18
  */
21
19
  export function collectPrompts(instance) {
22
20
  const tools = [];
23
- const pushTool = (name, fn, thisArg, spec) => {
21
+ // 传 key 而非捕获的 fn:子类「未装饰地 override」时 spec 继承自父类,
22
+ // 但实现必须取**实例/类上**的(否则会绕开子类实现,与 @Tool 语义不一致)。
23
+ const pushTool = (name, target, key, spec) => {
24
24
  tools.push({
25
25
  name: spec.name ?? name,
26
26
  description: spec.description,
27
27
  inputSchema: spec.schema ?? EMPTY_SCHEMA,
28
- run: (input) => Reflect.apply(fn, thisArg, [input]),
28
+ run: (input) => Reflect.apply(target[key], target, [input]),
29
29
  });
30
30
  };
31
31
  // 实例方法(沿原型链)
32
32
  const found = scanDecoratedMethods(instance, promptSpecs);
33
- for (const { key, fn, spec } of found) {
34
- pushTool(unitName(spec, key, '@Prompt'), fn, instance, spec);
33
+ const inst = instance;
34
+ for (const { key, spec } of found) {
35
+ pushTool(capabilityName(spec, key, '@Prompt'), inst, key, spec);
35
36
  }
36
37
  // 静态方法(类自身属性);已被实例方法占用的 key 跳过
37
38
  const seen = new Set(found.map((f) => f.key));
@@ -48,7 +49,7 @@ export function collectPrompts(instance) {
48
49
  if (!spec)
49
50
  continue;
50
51
  seen.add(key);
51
- pushTool(key, fn, cls, spec);
52
+ pushTool(key, ctor, key, spec);
52
53
  }
53
54
  }
54
55
  return tools;
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/toolkit/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAyB9D,MAAM,WAAW,GAAG,IAAI,OAAO,EAAwB,CAAC;AAExD,MAAM,YAAY,GAAe;IAC/B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE;IACd,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,sDAAsD;AACtD,MAAM,UAAU,MAAM,CAAC,IAAgB;IACrC,OAAO,UACL,KAAe,EACf,OAAgD;QAEhD,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,uCAAuC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjF,CAAC;QACD,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,EAAY,EAAE,OAAgB,EAAE,IAAgB,EAAQ,EAAE;QACxF,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,MAAM,IAAI,YAAY;YACxC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;SAC7D,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,KAAK,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QACtC,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC/D,CAAC;IAED,+BAA+B;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAa,QAAsC,CAAC,WAAW,CAAC;IACzE,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAyC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,OAAO,EAAE,KAAK,UAAU;gBAAE,SAAS;YACvC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,EAAc,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,QAAQ,CAAC,GAAG,EAAE,EAAc,EAAE,GAAa,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/toolkit/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AA0BxF,MAAM,WAAW,GAAG,IAAI,OAAO,EAAwB,CAAC;AAExD,MAAM,YAAY,GAAe;IAC/B,IAAI,EAAE,QAAQ;IACd,UAAU,EAAE,EAAE;IACd,oBAAoB,EAAE,KAAK;CAC5B,CAAC;AAEF,sDAAsD;AACtD,MAAM,UAAU,MAAM,CAAC,IAAgB;IACrC,OAAO,CAAC,KAAe,EAAE,OAAmC,EAAQ,EAAE;QACpE,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QACvC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,gDAAgD;IAChD,6CAA6C;IAC7C,MAAM,QAAQ,GAAG,CACf,IAAY,EACZ,MAAwC,EACxC,GAAoB,EACpB,IAAgB,EACV,EAAE;QACR,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,WAAW,EAAE,IAAI,CAAC,MAAM,IAAI,YAAY;YACxC,GAAG,EAAE,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAa,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;SACjF,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,aAAa;IACb,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,QAA4C,CAAC;IAC1D,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,KAAK,EAAE,CAAC;QAClC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IAClE,CAAC;IAED,+BAA+B;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAkB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,MAAM,GAAG,GAAa,QAAsC,CAAC,WAAW,CAAC;IACzE,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,GAAyC,CAAC;QACvD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC5B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACrB,IAAI,OAAO,EAAE,KAAK,UAAU;gBAAE,SAAS;YACvC,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,EAAc,CAAC,CAAC;YAC7C,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACd,QAAQ,CAAC,GAAG,EAAE,IAAwC,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,18 +1,19 @@
1
+ import type { CapabilityDecoratorContext } from './collect.js';
1
2
  import type Anthropic from '@anthropic-ai/sdk';
2
3
  import type { AgentTool, JsonSchema } from '../core/tool.js';
3
4
  import type { AgentStopReason } from '../engine/types.js';
4
- import { SystemPrompt } from '../run/systemPrompt.js';
5
+ import { SystemPrompt } from '../runtime/systemPrompt.js';
5
6
  /**
6
- * Agentia —— Skill 单元(spec §3:指令 + 脚本,受限子运行,回产物/结论)。
7
+ * Agentia —— Skill 能力(spec §3:指令 + 脚本,受限子运行,回产物/结论)。
7
8
  *
8
9
  * 与 @SubAgent 的可感知区别:
9
10
  * - 子 agent = **模型自主循环**:你只给 role/任务/工具,走几步、何时停由模型决定;
10
11
  * - Skill = **代码控制的流程**:方法体是确定性脚本,把“要不要调模型、调几次、
11
12
  * 拿结果怎么算”写死在代码里 —— 模型调用只在你显式 `ctx.llm()` 时发生(受限子运行),
12
- * 每次都在 skill 自己的 `unit` span 下开 llm.turn 记账,中间结果可继续加工,
13
+ * 每次都在 skill 自己的 `capability` span 下开 llm.turn 记账,中间结果可继续加工,
13
14
  * 方法返回值即产物/结论,以 tool_result 交回主 agent。
14
15
  *
15
- * trace:skill = 主 trace 里一个 `unit` span(attribute `skill`),内部 ctx.llm() 的
16
+ * trace:skill = 主 trace 里一个 `capability` span(attribute `skill`),内部 ctx.llm() 的
16
17
  * llm.turn 递归成它的子孙 —— 与 @SubAgent 同款 parentSpanId 传播,不双开 run 根。
17
18
  */
18
19
  export interface SkillSpec {
@@ -47,10 +48,10 @@ export interface SkillLlmResult {
47
48
  export interface SkillContext {
48
49
  /** 本次 skill 的缺省模型(spec.model 或 undefined → engine 缺省) */
49
50
  readonly model?: string;
50
- /** 受限子运行:每次调用在 skill unit span 下开一轮独立 agent 循环(无工具则纯文本)。 */
51
+ /** 受限子运行:每次调用在 skill capability span 下开一轮独立 agent 循环(无工具则纯文本)。 */
51
52
  llm(opts: SkillLlmOptions): Promise<SkillLlmResult>;
52
53
  }
53
- export interface SkillUnit {
54
+ export interface SkillCapability {
54
55
  name: string;
55
56
  description: string;
56
57
  inputSchema: JsonSchema;
@@ -59,16 +60,13 @@ export interface SkillUnit {
59
60
  invoke: (input: unknown, skillCtx: SkillContext) => unknown | Promise<unknown>;
60
61
  }
61
62
  /** 方法装饰器:登记 skill spec。被装饰方法体由运行时以 (input, skillCtx) 调用。 */
62
- export declare function Skill(spec: SkillSpec): (value: Function, context: {
63
- kind: string;
64
- name: string | symbol;
65
- }) => void;
66
- /** 把容器实例上所有 @Skill 方法收集成 SkillUnit[](沿原型链)。 */
67
- export declare function collectSkills(instance: object): SkillUnit[];
63
+ export declare function Skill(spec: SkillSpec): (value: Function, context: CapabilityDecoratorContext) => void;
64
+ /** 把容器实例上所有 @Skill 方法收集成 SkillCapability[](沿原型链)。 */
65
+ export declare function collectSkills(instance: object): SkillCapability[];
68
66
  /**
69
- * 把 SkillUnit 变成主 agent 菜单里的 AgentTool。
67
+ * 把 SkillCapability 变成主 agent 菜单里的 AgentTool。
70
68
  * run(input, ctx) 需要 ToolRunContext(engine 调用时必有);手动直调会抛错提示。
71
- * 开 `unit` span → 构造 SkillContext(llm 闭包挂 unit 下)→ 执行方法体 →
72
- * 返回值字符串化交回;抛错关 unit error 后重抛(引擎包成 is_error,不中断 run)。
69
+ * 开 `capability` span → 构造 SkillContext(llm 闭包挂 capability 下)→ 执行方法体 →
70
+ * 返回值字符串化交回;抛错关 capability error 后重抛(引擎包成 is_error,不中断 run)。
73
71
  */
74
- export declare function skillToTool(unit: SkillUnit, resolveTools: () => AgentTool[]): AgentTool;
72
+ export declare function skillToTool(capability: SkillCapability, resolveTools: () => AgentTool[]): AgentTool;