@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
@@ -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;
@@ -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;