@migor/agentia 0.9.3 → 0.9.5

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 (201) hide show
  1. package/CHANGELOG.md +779 -1
  2. package/README.md +1 -1
  3. package/dist/AGENTS.md +320 -37
  4. package/dist/container/container.js +15 -0
  5. package/dist/container/container.js.map +1 -1
  6. package/dist/core/limits.d.ts +121 -17
  7. package/dist/core/limits.js +133 -16
  8. package/dist/core/limits.js.map +1 -1
  9. package/dist/core/line-framing.d.ts +36 -0
  10. package/dist/core/line-framing.js +39 -0
  11. package/dist/core/line-framing.js.map +1 -0
  12. package/dist/core/message.d.ts +11 -0
  13. package/dist/core/run.d.ts +68 -4
  14. package/dist/core/run.js +27 -1
  15. package/dist/core/run.js.map +1 -1
  16. package/dist/core/schema.js +59 -8
  17. package/dist/core/schema.js.map +1 -1
  18. package/dist/core/timeout.d.ts +43 -1
  19. package/dist/core/timeout.js +76 -3
  20. package/dist/core/timeout.js.map +1 -1
  21. package/dist/core/tool.d.ts +39 -1
  22. package/dist/core/trace.d.ts +40 -1
  23. package/dist/core/trace.js +26 -0
  24. package/dist/core/trace.js.map +1 -1
  25. package/dist/engine/defer.d.ts +49 -0
  26. package/dist/engine/defer.js +72 -0
  27. package/dist/engine/defer.js.map +1 -0
  28. package/dist/engine/forwarded.d.ts +14 -5
  29. package/dist/engine/forwarded.js +4 -1
  30. package/dist/engine/forwarded.js.map +1 -1
  31. package/dist/engine/loop-result.d.ts +65 -7
  32. package/dist/engine/loop-result.js +24 -5
  33. package/dist/engine/loop-result.js.map +1 -1
  34. package/dist/engine/loop.d.ts +2 -0
  35. package/dist/engine/loop.js +157 -17
  36. package/dist/engine/loop.js.map +1 -1
  37. package/dist/engine/mcp-server-http.d.ts +2 -0
  38. package/dist/engine/mcp-server-http.js +215 -0
  39. package/dist/engine/mcp-server-http.js.map +1 -0
  40. package/dist/engine/mcp-server-stdio.d.ts +15 -0
  41. package/dist/engine/mcp-server-stdio.js +106 -0
  42. package/dist/engine/mcp-server-stdio.js.map +1 -0
  43. package/dist/engine/mcp-server.d.ts +134 -0
  44. package/dist/engine/mcp-server.js +232 -0
  45. package/dist/engine/mcp-server.js.map +1 -0
  46. package/dist/engine/menu-drift.d.ts +34 -0
  47. package/dist/engine/menu-drift.js +81 -0
  48. package/dist/engine/menu-drift.js.map +1 -0
  49. package/dist/engine/policy.d.ts +2 -1
  50. package/dist/engine/policy.js +7 -1
  51. package/dist/engine/policy.js.map +1 -1
  52. package/dist/engine/replay.d.ts +2 -1
  53. package/dist/engine/replay.js +3 -2
  54. package/dist/engine/replay.js.map +1 -1
  55. package/dist/engine/resume-input.d.ts +10 -0
  56. package/dist/engine/resume-input.js +11 -0
  57. package/dist/engine/resume-input.js.map +1 -1
  58. package/dist/engine/run-config.d.ts +26 -2
  59. package/dist/engine/run-config.js +60 -0
  60. package/dist/engine/run-config.js.map +1 -1
  61. package/dist/engine/spec.d.ts +33 -4
  62. package/dist/engine/spec.js.map +1 -1
  63. package/dist/engine/tool-context.d.ts +10 -5
  64. package/dist/engine/tool-context.js +5 -1
  65. package/dist/engine/tool-context.js.map +1 -1
  66. package/dist/engine/tracer.d.ts +43 -5
  67. package/dist/engine/tracer.js +73 -10
  68. package/dist/engine/tracer.js.map +1 -1
  69. package/dist/engine/trimming.js +151 -17
  70. package/dist/engine/trimming.js.map +1 -1
  71. package/dist/engine/turn.d.ts +60 -3
  72. package/dist/engine/turn.js +180 -71
  73. package/dist/engine/turn.js.map +1 -1
  74. package/dist/engine/types.d.ts +89 -3
  75. package/dist/engine/types.js +38 -2
  76. package/dist/engine/types.js.map +1 -1
  77. package/dist/engine/usage.d.ts +22 -3
  78. package/dist/engine/usage.js +47 -6
  79. package/dist/engine/usage.js.map +1 -1
  80. package/dist/eval/export.d.ts +48 -0
  81. package/dist/eval/export.js +146 -0
  82. package/dist/eval/export.js.map +1 -0
  83. package/dist/eval/harvest.js +7 -2
  84. package/dist/eval/harvest.js.map +1 -1
  85. package/dist/index.d.ts +8 -5
  86. package/dist/index.js +6 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/integrations/adapter-options.d.ts +22 -0
  89. package/dist/integrations/adapter-options.js +51 -0
  90. package/dist/integrations/adapter-options.js.map +1 -1
  91. package/dist/integrations/anthropic.d.ts +4 -2
  92. package/dist/integrations/anthropic.js +27 -27
  93. package/dist/integrations/anthropic.js.map +1 -1
  94. package/dist/integrations/file-sink.d.ts +20 -0
  95. package/dist/integrations/file-sink.js +27 -0
  96. package/dist/integrations/file-sink.js.map +1 -0
  97. package/dist/integrations/mcp-http.d.ts +3 -3
  98. package/dist/integrations/mcp-http.js +1 -1
  99. package/dist/integrations/mcp-http.js.map +1 -1
  100. package/dist/integrations/mcp-protocol.d.ts +115 -0
  101. package/dist/integrations/mcp-protocol.js +69 -0
  102. package/dist/integrations/mcp-protocol.js.map +1 -0
  103. package/dist/integrations/mcp-stdio.d.ts +3 -3
  104. package/dist/integrations/mcp-stdio.js +17 -3
  105. package/dist/integrations/mcp-stdio.js.map +1 -1
  106. package/dist/integrations/mcp.d.ts +6 -95
  107. package/dist/integrations/mcp.js +24 -66
  108. package/dist/integrations/mcp.js.map +1 -1
  109. package/dist/integrations/metrics-otlp.js +52 -7
  110. package/dist/integrations/metrics-otlp.js.map +1 -1
  111. package/dist/integrations/metrics-render.d.ts +15 -0
  112. package/dist/integrations/metrics-render.js +79 -2
  113. package/dist/integrations/metrics-render.js.map +1 -1
  114. package/dist/integrations/metrics-state.d.ts +99 -1
  115. package/dist/integrations/metrics-state.js +128 -4
  116. package/dist/integrations/metrics-state.js.map +1 -1
  117. package/dist/integrations/metrics.d.ts +62 -6
  118. package/dist/integrations/metrics.js +49 -8
  119. package/dist/integrations/metrics.js.map +1 -1
  120. package/dist/integrations/openai.js +9 -31
  121. package/dist/integrations/openai.js.map +1 -1
  122. package/dist/integrations/otlp.d.ts +3 -3
  123. package/dist/integrations/report.d.ts +7 -0
  124. package/dist/integrations/report.js +20 -1
  125. package/dist/integrations/report.js.map +1 -1
  126. package/dist/runtime/memory.d.ts +61 -1
  127. package/dist/runtime/memory.js +47 -7
  128. package/dist/runtime/memory.js.map +1 -1
  129. package/dist/runtime/run.d.ts +12 -2
  130. package/dist/runtime/run.js +112 -15
  131. package/dist/runtime/run.js.map +1 -1
  132. package/dist/store/fsStore.js +10 -4
  133. package/dist/store/fsStore.js.map +1 -1
  134. package/dist/store/record.d.ts +41 -0
  135. package/dist/store/record.js +54 -0
  136. package/dist/store/record.js.map +1 -0
  137. package/dist/store/redisStore.d.ts +3 -1
  138. package/dist/store/redisStore.js +21 -7
  139. package/dist/store/redisStore.js.map +1 -1
  140. package/dist/store/sqliteStore.d.ts +23 -0
  141. package/dist/store/sqliteStore.js +103 -8
  142. package/dist/store/sqliteStore.js.map +1 -1
  143. package/dist/store/store.d.ts +65 -2
  144. package/dist/store/store.js +5 -2
  145. package/dist/store/store.js.map +1 -1
  146. package/dist/toolkit/capability-cycles.d.ts +50 -0
  147. package/dist/toolkit/capability-cycles.js +88 -0
  148. package/dist/toolkit/capability-cycles.js.map +1 -0
  149. package/dist/toolkit/capability-slice.d.ts +86 -0
  150. package/dist/toolkit/capability-slice.js +98 -0
  151. package/dist/toolkit/capability-slice.js.map +1 -0
  152. package/dist/toolkit/module.d.ts +7 -1
  153. package/dist/toolkit/module.js +65 -32
  154. package/dist/toolkit/module.js.map +1 -1
  155. package/dist/transport/approval-policy.d.ts +1 -1
  156. package/dist/transport/approval-policy.js +8 -4
  157. package/dist/transport/approval-policy.js.map +1 -1
  158. package/dist/transport/async.d.ts +197 -18
  159. package/dist/transport/async.js +871 -85
  160. package/dist/transport/async.js.map +1 -1
  161. package/dist/transport/drain-gate.d.ts +6 -2
  162. package/dist/transport/drain-gate.js +14 -2
  163. package/dist/transport/drain-gate.js.map +1 -1
  164. package/dist/transport/http-endpoints.d.ts +151 -0
  165. package/dist/transport/http-endpoints.js +480 -0
  166. package/dist/transport/http-endpoints.js.map +1 -0
  167. package/dist/transport/http-io.d.ts +66 -0
  168. package/dist/transport/http-io.js +145 -0
  169. package/dist/transport/http-io.js.map +1 -0
  170. package/dist/transport/http-route.d.ts +10 -3
  171. package/dist/transport/http-route.js +18 -3
  172. package/dist/transport/http-route.js.map +1 -1
  173. package/dist/transport/http-shapes.d.ts +11 -0
  174. package/dist/transport/http-shapes.js +31 -1
  175. package/dist/transport/http-shapes.js.map +1 -1
  176. package/dist/transport/http.d.ts +22 -35
  177. package/dist/transport/http.js +110 -467
  178. package/dist/transport/http.js.map +1 -1
  179. package/dist/transport/owner-id.d.ts +29 -0
  180. package/dist/transport/owner-id.js +46 -0
  181. package/dist/transport/owner-id.js.map +1 -0
  182. package/dist/transport/owner-liveness.d.ts +8 -0
  183. package/dist/transport/owner-liveness.js +56 -0
  184. package/dist/transport/owner-liveness.js.map +1 -0
  185. package/dist/transport/resume-policy.d.ts +48 -10
  186. package/dist/transport/resume-policy.js +25 -10
  187. package/dist/transport/resume-policy.js.map +1 -1
  188. package/dist/transport/scheduler.js +23 -24
  189. package/dist/transport/scheduler.js.map +1 -1
  190. package/dist/transport/slot-pool.d.ts +9 -1
  191. package/dist/transport/slot-pool.js +9 -1
  192. package/dist/transport/slot-pool.js.map +1 -1
  193. package/dist/transport/sse.js +8 -0
  194. package/dist/transport/sse.js.map +1 -1
  195. package/dist/transport/task-events.d.ts +34 -3
  196. package/dist/transport/task-events.js +86 -5
  197. package/dist/transport/task-events.js.map +1 -1
  198. package/dist/transport/wake-policy.d.ts +50 -0
  199. package/dist/transport/wake-policy.js +43 -0
  200. package/dist/transport/wake-policy.js.map +1 -0
  201. package/package.json +6 -4
@@ -12,18 +12,28 @@
12
12
  * 规范位置是 text.ts(loop.ts 与 stop-reason.ts 都从那儿取;回本文件取会成环)。
13
13
  */
14
14
  import { validateJsonSchema } from '../core/schema.js';
15
+ import { TOOL_INPUT_EVENT, TOOL_OUTPUT_EVENT } from '../core/trace.js';
15
16
  import { isTimeoutError } from '../core/timeout.js';
16
17
  import { classifyError, isAbortError } from './errors.js';
18
+ import { createDeferRequest } from './defer.js';
17
19
  import { createBudgetGuard } from './budget.js';
18
20
  import { mapWithConcurrency, TIMED_OUT, withTimeout } from './concurrency.js';
19
21
  import { backoffDelay, resolveRetry, retryAllowed, sleep } from './retry.js';
20
22
  import { buildTurnRequest } from './turn-request.js';
21
23
  import { buildToolRunContext } from './tool-context.js';
22
24
  import { withCurrentSpan } from './span-scope.js';
23
- import { toolInputPayload, toolOutputPayload, toolResultBlock } from './tool-events.js';
25
+ import { DEFAULT_EVENT_CHARS, toolInputPayload, toolOutputPayload, toolResultBlock, } from './tool-events.js';
26
+ import { textOf } from './text.js';
27
+ import { truncateWithMark } from '../core/json.js';
24
28
  import { buildPricing, costEstimate, usageFromAnthropic } from './usage.js';
25
- /** 隐藏提交工具名:resultSchema 模式下由 engine 内部追加,不属开发者工具菜单 */
26
- const SUBMIT_RESULT = 'submit_result';
29
+ import { USAGE_MISSING_EVENT } from '../core/trace.js';
30
+ /**
31
+ * 隐藏提交工具名:`resultSchema` 在场时由 engine 内部追加,**不属**开发者工具菜单。
32
+ *
33
+ * 它从不进 `args.tools` —— 所以「当前菜单里有没有这个名字」这个问题要单独处理
34
+ * (见 engine/menu-drift.ts 的 `detectMenuDrift`,那条口径只有一份)。
35
+ */
36
+ export const SUBMIT_RESULT = 'submit_result';
27
37
  /** resultSchema 模式下追加到 system 末尾的指令 */
28
38
  const RESULT_INSTRUCTION = '本任务要求结构化结果:完成必要的信息收集与工具调用后,必须调用 submit_result 工具提交最终结果' +
29
39
  '(input 严格符合该工具的 input_schema);不要仅以普通文本结束作答。';
@@ -131,12 +141,27 @@ export async function checkTurnEntry(ctx, iteration) {
131
141
  return { stopReason: 'budget_exceeded', error: budgetError(args, over) };
132
142
  }
133
143
  }
134
- // 发送前给上下文策略一个机会(编辑/压缩预算超限的历史)
144
+ // 发送前给上下文策略一个机会(编辑/压缩预算超限的历史)。
145
+ //
146
+ // ⚠️ 必须包 try/catch(2026-09-28 修):`beforeTurn` 里可能**走网络**(compaction 的
147
+ // `summarize` 是模型调用),一次 429 / 超时就抛 —— 不接的话整条 run 以「请求失败」收尾,
148
+ // 而上下文压缩对一条 run 而言是**尽力而为**的优化、不是前置条件(代价是历史偏长,不该是 run 死掉)。
149
+ // 降级 = 本回合原样放行,**且出声**(否则「历史一直很长」没人知道为什么,只看到 token 慢慢涨)。
135
150
  if (args.contextPolicy) {
136
- const next = await args.contextPolicy.beforeTurn(messages, {
137
- iteration,
138
- model: args.model,
139
- });
151
+ let next;
152
+ try {
153
+ next = await args.contextPolicy.beforeTurn(messages, {
154
+ iteration,
155
+ model: args.model,
156
+ });
157
+ }
158
+ catch (e) {
159
+ const message = e instanceof Error ? e.message : String(e);
160
+ if (args.parentSpanId) {
161
+ args.recorder.event(args.parentSpanId, 'context.policy_failed', { iteration, message });
162
+ }
163
+ console.warn('[agentia:engine] contextPolicy.beforeTurn 失败,本回合不压缩:', message);
164
+ }
140
165
  if (next && next !== messages) {
141
166
  if (args.parentSpanId) {
142
167
  args.recorder.event(args.parentSpanId, 'context.budget', {
@@ -151,94 +176,139 @@ export async function checkTurnEntry(ctx, iteration) {
151
176
  return null;
152
177
  }
153
178
  /**
154
- * —— 一次逻辑回合:可能含多次尝试(重试);每次尝试开自己的 llm.turn span ——
179
+ * —— 一次逻辑回合:可能含多次尝试(重试)与多次换环(fallback 链,R8-P2);
180
+ * 每次尝试开自己的 llm.turn span ——
155
181
  * 可重试失败按 retryCfg 退避后重试(已吐出文本的尝试不重试,否则会重复输出);
156
- * 不可重试的失败原样抛出,由外层(runAgent / 子 agent 运行器)标记根/capability 并收尾。
182
+ * 重试用尽且错误类可换(`classifyError` 的 retryable 位 —— 与重试共用同一枚举,
183
+ * 分类器改口径时两处不会漂开)且本环**未吐过字**,换链上下一环重试本回合,
184
+ * 新 span 记 `llm.fallback` 事件;不可重试/不可换的失败原样抛出,由外层
185
+ * (runAgent / 子 agent 运行器)标记根/capability 并收尾。
157
186
  */
158
187
  export async function streamTurn(ctx) {
159
188
  const { args } = ctx;
160
189
  const signal = args.signal;
161
190
  const retryCfg = ctx.retryCfg;
191
+ // 链在 run 入口已校验解析(resolveModelChain);直连 agentLoop 的调用方(单测)没给时
192
+ // 退化为单环 —— 与「没配 fallbacks」逐字同语义
193
+ const chain = args.modelChain ?? [{ model: args.model, client: args.client }];
162
194
  let turnId = '';
163
195
  let message;
196
+ let modelUsed;
164
197
  let aborted = false;
165
- let emitted = false; // 本回合是否已吐出过文本(吐过就不能重试,否则会重复输出)
166
- for (let attempt = 1;; attempt++) {
167
- turnId = args.recorder.begin('llm.turn', args.model, args.parentSpanId);
168
- if (attempt > 1)
169
- args.recorder.setAttribute(turnId, 'retry.attempt', attempt);
170
- try {
171
- // 请求装配外移到 turn-request.ts(三个条件展开的「键在场与否」是语义,单测钉住)
172
- const stream = args.client.messages.stream(buildTurnRequest({
173
- model: args.model,
174
- maxTokens: args.maxTokens,
175
- system: ctx.system,
176
- apiTools: ctx.apiTools,
177
- messages: ctx.messages,
178
- signal,
179
- }));
180
- stream.on('text', (delta) => {
181
- emitted = true;
198
+ // 换环原因(从哪环/什么错误类换过来的):写进下一环第一个尝试的 span 事件
199
+ let fallbackFrom = null;
200
+ for (let linkIdx = 0; linkIdx < chain.length; linkIdx++) {
201
+ const link = chain[linkIdx];
202
+ let emitted = false; // 本环是否已吐出过文本(吐过就不能重试也不能换环,否则会重复输出)
203
+ let switchLink = false;
204
+ for (let attempt = 1;; attempt++) {
205
+ turnId = args.recorder.begin('llm.turn', link.model, args.parentSpanId);
206
+ if (fallbackFrom !== null) {
207
+ args.recorder.event(turnId, 'llm.fallback', {
208
+ from: fallbackFrom.from,
209
+ to: link.model,
210
+ errorType: fallbackFrom.errorType,
211
+ });
212
+ fallbackFrom = null;
213
+ }
214
+ if (attempt > 1)
215
+ args.recorder.setAttribute(turnId, 'retry.attempt', attempt);
216
+ try {
217
+ // 请求装配外移到 turn-request.ts(三个条件展开的「键在场与否」是语义,单测钉住)
218
+ const stream = link.client.messages.stream(buildTurnRequest({
219
+ model: link.model,
220
+ maxTokens: args.maxTokens,
221
+ system: ctx.system,
222
+ apiTools: ctx.apiTools,
223
+ messages: ctx.messages,
224
+ signal,
225
+ }));
226
+ stream.on('text', (delta) => {
227
+ emitted = true;
228
+ try {
229
+ args.onText?.(delta);
230
+ }
231
+ catch {
232
+ /* 观测是辅助动作:回调抛错不得影响 run(与 onUnpricedModel 同口径) */
233
+ }
234
+ });
235
+ message = await stream.finalMessage();
236
+ modelUsed = link.model;
237
+ break;
238
+ }
239
+ catch (e) {
240
+ const errInfo = classifyError(e);
241
+ args.recorder.end(turnId, { status: 'error', error: errInfo });
242
+ // 中断:不冒泡、不重试、**不换环**(用户取消不是故障 —— 换厂商再打一发是荒腔)
243
+ if (isAbortError(e) || signal?.aborted) {
244
+ aborted = true;
245
+ break;
246
+ }
247
+ // 可重试:配置允许 + 次数未尽 + 判定可重试 + 本次尝试未产出任何文本
248
+ const canRetry = retryAllowed(retryCfg, attempt, e, emitted);
249
+ // 后半句只为让 TS 收窄:canRetry 为真时 retryCfg 必然非 null(合取的第一项),但**收窄不会
250
+ // 穿过变量**,而下面几行要用 retryCfg 的字段(backoffDelay / onRetry)。语义与抽取前一致。
251
+ if (!canRetry || retryCfg === null) {
252
+ // 换环判定:还有下一环 + 错误类可换(retryable 位 = rate_limit/server/timeout/connection)
253
+ // + 本环没吐过字。api/unknown 是请求本身有病,换模型无用,原样抛。
254
+ if (linkIdx + 1 < chain.length && errInfo.retryable && !emitted) {
255
+ fallbackFrom = { from: link.model, errorType: errInfo.type };
256
+ switchLink = true;
257
+ break;
258
+ }
259
+ throw e; // 冒泡:runAgent 或子 agent 运行器负责收尾
260
+ }
261
+ const delayMs = backoffDelay(attempt, retryCfg);
262
+ args.recorder.event(turnId, 'llm.retry', { attempt, delayMs, error: errInfo.type });
182
263
  try {
183
- args.onText?.(delta);
264
+ retryCfg.onRetry({ attempt, delayMs, error: errInfo });
184
265
  }
185
266
  catch {
186
267
  /* 观测是辅助动作:回调抛错不得影响 run(与 onUnpricedModel 同口径) */
187
268
  }
188
- });
189
- message = await stream.finalMessage();
190
- break;
191
- }
192
- catch (e) {
193
- const errInfo = classifyError(e);
194
- args.recorder.end(turnId, { status: 'error', error: errInfo });
195
- // 中断:不冒泡、不重试 —— 以确定语义收尾
196
- if (isAbortError(e) || signal?.aborted) {
197
- aborted = true;
198
- break;
199
- }
200
- // 可重试:配置允许 + 次数未尽 + 判定可重试 + 本次尝试未产出任何文本
201
- const canRetry = retryAllowed(retryCfg, attempt, e, emitted);
202
- // 后半句只为让 TS 收窄:canRetry 为真时 retryCfg 必然非 null(合取的第一项),但**收窄不会
203
- // 穿过变量**,而下面几行要用 retryCfg 的字段(backoffDelay / onRetry)。语义与抽取前一致。
204
- if (!canRetry || retryCfg === null)
205
- throw e; // 冒泡:runAgent 或子 agent 运行器负责收尾
206
- const delayMs = backoffDelay(attempt, retryCfg);
207
- args.recorder.event(turnId, 'llm.retry', { attempt, delayMs, error: errInfo.type });
208
- try {
209
- retryCfg.onRetry({ attempt, delayMs, error: errInfo });
210
- }
211
- catch {
212
- /* 观测是辅助动作:回调抛错不得影响 run(与 onUnpricedModel 同口径) */
213
- }
214
- try {
215
- await sleep(delayMs, signal);
216
- }
217
- catch {
218
- aborted = true; // 退避期间被取消
219
- break;
269
+ try {
270
+ await sleep(delayMs, signal);
271
+ }
272
+ catch {
273
+ aborted = true; // 退避期间被取消
274
+ break;
275
+ }
220
276
  }
221
277
  }
278
+ if (aborted || message !== undefined || !switchLink)
279
+ break;
222
280
  }
223
- return { turnId, message, aborted };
281
+ return { turnId, message, aborted, model: modelUsed };
224
282
  }
225
283
  /**
226
284
  * 回合记账:usage 换算 + 成本估算(未定价记事件 + 回调)+ 关 llm.turn span + token 属性。
227
285
  * 预算护栏依赖「记账完成后」的 usage 累计,所以本函数必须先于任何 budget.check 调用。
286
+ *
287
+ * `model` 是本回合**实际**成功的模型(TurnOutcome.model):fallback 换环后与 args.model
288
+ * 不同 —— 成本估算与未定价探测按错模型算就是记错账(评审 2026-09-27 ② 的核心教训)。
228
289
  */
229
- export function recordTurnUsage(ctx, turnId, message) {
290
+ export function recordTurnUsage(ctx, turnId, message, model) {
230
291
  const { args } = ctx;
292
+ const billedModel = model ?? args.model;
231
293
  const usage = message.usage ? usageFromAnthropic(message.usage) : undefined;
294
+ // 上游**没给** usage(2026-09-28 外部深评 S2):上面那些 0 是替身值,成本估算会把它
295
+ // 读成「真的只花了 0」⇒ `maxCostUsd` 静默失效、连「算不出」的信号都没有。
296
+ // 记一条事件出声 —— 报告(`usageMissingTurns`)与指标(`model_usage_missing_turns_total`)
297
+ // 各有一处据此计数。**不是** `usage.unpriced`:那个说的是「模型不在价格表里」,
298
+ // 与「上游根本没报计量」是两回事,混在一起会把两条排障方向搅成一团。
299
+ if (usage && message.usage?.unreported) {
300
+ args.recorder.event(turnId, USAGE_MISSING_EVENT, { model: billedModel });
301
+ }
232
302
  if (usage) {
233
- const cost = costEstimate(args.model, usage, ctx.pricing);
303
+ const cost = costEstimate(billedModel, usage, ctx.pricing);
234
304
  usage.costEstimate = cost;
235
305
  // 未定价(F2):模型不在价格表内 → 显式记事件 + 回调,别让 maxCostUsd 静默失效
236
306
  if (cost === undefined) {
237
- args.recorder.event(turnId, 'usage.unpriced', { model: args.model });
238
- if (!ctx.unpricedSeen.has(args.model)) {
239
- ctx.unpricedSeen.add(args.model);
307
+ args.recorder.event(turnId, 'usage.unpriced', { model: billedModel });
308
+ if (!ctx.unpricedSeen.has(billedModel)) {
309
+ ctx.unpricedSeen.add(billedModel);
240
310
  try {
241
- args.onUnpricedModel?.({ model: args.model, spanId: turnId });
311
+ args.onUnpricedModel?.({ model: billedModel, spanId: turnId });
242
312
  }
243
313
  catch {
244
314
  /* 观测是辅助动作:回调抛错不得影响 run */
@@ -251,6 +321,16 @@ export function recordTurnUsage(ctx, turnId, message) {
251
321
  args.recorder.setAttribute(turnId, 'output_tokens', usage?.outputTokens ?? 0);
252
322
  args.recorder.setAttribute(turnId, 'cache_read_tokens', usage?.cacheReadTokens ?? 0);
253
323
  args.recorder.setAttribute(turnId, 'cache_creation_tokens', usage?.cacheCreationTokens ?? 0);
324
+ // R8-P3a:opt-in 记录 assistant 文本。截断过 `maxEventChars` 同一道闸(它管「多长」,
325
+ // traceContent 管「记不记」,缺省走成功出参档 DEFAULT_EVENT_CHARS);纯 tool_use 回合
326
+ // 没有文本块,不记(空字符串属性只会制造「这回合说了什么」的假信号)。
327
+ if (args.traceContent === 'full') {
328
+ const text = textOf(message);
329
+ if (text !== '') {
330
+ const cap = args.maxEventChars ?? DEFAULT_EVENT_CHARS;
331
+ args.recorder.setAttribute(turnId, 'output.text', cap === false ? text : truncateWithMark(text, cap));
332
+ }
333
+ }
254
334
  }
255
335
  /**
256
336
  * —— 执行工具:默认全并行,可由 maxToolConcurrency 收窄(C2);
@@ -287,18 +367,41 @@ export async function executeTurnTools(ctx, turnId, toolUses, overBudget) {
287
367
  const runnable = overBudget
288
368
  ? toolUses.filter((u) => args.resultSchema !== undefined && u.name === SUBMIT_RESULT)
289
369
  : toolUses;
370
+ // 延后请求(durable timer):本回合的收集器 —— 工具经 `ctx.deferUntil` 往它里面记目标时刻。
371
+ // 批跑完再判(并行下「谁先请求」是不定的,所以判据是**批级**的:有一条请求就整批挂起)。
372
+ const defer = createDeferRequest();
290
373
  const results = await mapWithConcurrency(runnable, args.maxToolConcurrency ?? Number.POSITIVE_INFINITY,
291
374
  // 调用期 span 作用域(spec §9.2 出站传播):普通工具与 @Prompt **不建 span**,其
292
375
  // 「当前 span」就是本回合的 llm.turn —— 与 ToolRunContext.parentSpanId 同一个值。
293
376
  // 每次调用一份作用域,并行工具因此互不干扰(run 级只存一个值会被互相覆盖)。
294
- (use) => withCurrentSpan({ traceId: args.recorder.traceId, spanId: turnId }, () => executeOneTool(ctx, turnId, use)));
377
+ (use) => withCurrentSpan({ traceId: args.recorder.traceId, spanId: turnId }, () => executeOneTool(ctx, turnId, use, defer)));
378
+ const wakeAt = defer.earliest();
379
+ if (wakeAt !== undefined) {
380
+ // 整批作废(不推 tool_result —— 协议要求每个 tool_use 都有配对,部分执行 + 部分挂起
381
+ // 会产出残缺历史):assistant 消息(含这批未决 tool_use)在 loop 里留在历史末尾,
382
+ // 醒来后由续跑入口重跑它们。事件记在**本回合**的 span 上,与 approval.requested 平行。
383
+ const pending = defer.ids();
384
+ args.recorder.event(turnId, 'defer.requested', {
385
+ wake_at: wakeAt,
386
+ tool_use_ids: pending,
387
+ // 被丢弃的 tool_result 条数:> pending.length 说明有**没请求延后**的兄弟工具也跑过了,
388
+ // 它们的副作用会在醒来重跑时再来一遍(契约②的代价,见 core/tool.ts)
389
+ discarded: results.length,
390
+ });
391
+ if (results.length > pending.length) {
392
+ console.warn(`[agentia] 延后请求作废整批工具结果:本回合 ${results.length} 条工具已执行,` +
393
+ `其中 ${results.length - pending.length} 条没有请求延后 —— 它们的副作用会在醒来重跑时重复。` +
394
+ '要精确控制就让模型单独调用请求延后的那个工具,或把它做成幂等读。');
395
+ }
396
+ return { kind: 'deferred', wakeAt, pending };
397
+ }
295
398
  return { kind: 'executed', results };
296
399
  }
297
400
  /**
298
401
  * 执行单个工具调用(含隐藏 submit_result 分支),产出该条的 tool_result 块。
299
402
  * 工具的 tool.input / tool.output 事件都记在本回合的 turn span 上(tool_use_id 配对)。
300
403
  */
301
- async function executeOneTool(ctx, turnId, use) {
404
+ async function executeOneTool(ctx, turnId, use, defer) {
302
405
  const { args } = ctx;
303
406
  const tool = args.tools.find((t) => t.name === use.name);
304
407
  // HITL:需审批工具的决定(到达这里说明决定已在 —— 未决的整回合在
@@ -308,7 +411,7 @@ async function executeOneTool(ctx, turnId, use) {
308
411
  // 的完整处理时长,是「哪一步慢」的可信基线。并行工具各记各的(tool_use_id 配对)。
309
412
  const toolStartedAt = Date.now();
310
413
  // tool_use_id 一并记账:同名工具并行时,重放只有靠 id 才能把入参出参正确配对
311
- args.recorder.event(turnId, 'tool.input', toolInputPayload(use, args.maxEventChars));
414
+ args.recorder.event(turnId, TOOL_INPUT_EVENT, toolInputPayload(use, args.maxEventChars));
312
415
  // 审批决定的审计账(HITL):谁、什么时候、以什么理由批/拒,等审批等了多久。
313
416
  // waitedMs 需要 requestedAt(挂起时刻,由宿主在挂起时回填)—— 手工直传
314
417
  // approvals 而没有 requestedAt 时不记 waitedMs(不编造)。
@@ -337,10 +440,16 @@ async function executeOneTool(ctx, turnId, use) {
337
440
  priceOverrides: args.priceOverrides,
338
441
  onUnpricedModel: args.onUnpricedModel,
339
442
  maxEventChars: args.maxEventChars,
443
+ traceContent: args.traceContent,
340
444
  maxTotalTokens: args.maxTotalTokens,
341
445
  maxCostUsd: args.maxCostUsd,
342
446
  toolTimeoutMs: args.toolTimeoutMs,
343
447
  approval: decision,
448
+ // 延后请求口(durable timer):闭包绑死**本条的 tool_use_id** —— 「是谁请求的」
449
+ // 由此决定(工具只拿到一个 `(at) => void`,它不需要也不该知道自己的 id)。
450
+ // 取值非法(非有限 / 不在将来)当场抛 → 走下面既有的 catch,包成 is_error 的
451
+ // tool_result 回给模型(run 照常走,不挂起)—— 见 engine/defer.ts。
452
+ deferUntil: (at) => defer.request(use.id, at),
344
453
  });
345
454
  let ok = true;
346
455
  let content = '';
@@ -435,7 +544,7 @@ async function executeOneTool(ctx, turnId, use) {
435
544
  }
436
545
  }
437
546
  // 记账面外移到 tool-events.ts:截断上限不对称(失败更短)、耗时四路径都记且非负、errorKind 有值才在场
438
- args.recorder.event(turnId, 'tool.output', toolOutputPayload({
547
+ args.recorder.event(turnId, TOOL_OUTPUT_EVENT, toolOutputPayload({
439
548
  use,
440
549
  ok,
441
550
  errorKind,
@@ -1 +1 @@
1
- {"version":3,"file":"turn.js","sourceRoot":"","sources":["../../src/engine/turn.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"turn.js","sourceRoot":"","sources":["../../src/engine/turn.ts"],"names":[],"mappings":"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"}
@@ -2,12 +2,30 @@ import type { CacheControl, MessageParam } from '../core/message.js';
2
2
  import type { AgentTool, ApprovalDecision, JsonSchema, ModelClient, ModelPricing } from '../core/tool.js';
3
3
  import type { SpanError, Trace, TraceContext } from '../core/trace.js';
4
4
  import type { RetryOptions } from './retry.js';
5
+ import type { SuspendedReason, TaskEvent } from '../core/run.js';
5
6
  /**
6
7
  * engine 对模型端的最小结构面(R4 多模型):消息形态见 core/message.js 的自有类型族,
7
8
  * 其他 provider(OpenAI 兼容端点等)只需适配出同一形态。
8
9
  * 定义在 core/tool.js 并从此处转导出。
9
10
  */
10
11
  export type { ModelClient } from '../core/tool.js';
12
+ /**
13
+ * 模型 fallback 链的一环(R8-P2):主环节失败且可换时,按数组序落下一环。
14
+ *
15
+ * - `client` 缺省 = 本次 run 的 client(**同端点换模型**是主用例:主模型 429/超时 →
16
+ * 备用模型);要给别的厂商才显式传另一个 `ModelClient`。
17
+ * - 换环判定与重试判定共用 `classifyError` 的 `retryable` 位(rate_limit / server /
18
+ * timeout / connection 才换;api/unknown 是请求本身有病,换了也没用;aborted 永不换)。
19
+ * - ⚠️ `client` 是进程内对象:走持久化 store 的异步任务在崩溃续跑后读回的是
20
+ * 反序列化空壳 —— run 入口会响亮抛 TypeError(鸭子类型校验),不静默拿死 client 发请求。
21
+ * 要跨重启仍成立的链请只写 `model`(client 由宿主/runner 级配置兜住)。
22
+ */
23
+ export interface ModelFallbackLink {
24
+ /** 备用模型 id(必填,空字符串在 run 入口抛 TypeError) */
25
+ model: string;
26
+ /** 该环用的 client;缺省复用本次 run 的 client */
27
+ client?: ModelClient;
28
+ }
11
29
  export type AgentStopReason =
12
30
  /** 模型自然结束(含 stop_sequence:命中 stop 序列同样是正常收尾) */
13
31
  'end_turn' | 'stop_sequence' | 'max_tokens' | 'refusal' | 'pause_turn' | 'max_iterations'
@@ -27,14 +45,14 @@ export type AgentStopReason =
27
45
  * **不是成功也不是失败**:`isSuccessStopReason` 不含它;trace 状态记 ok
28
46
  * (挂起段本身执行无误,「等人」不该被看板算成失败);宿主据此落库而非收尾。
29
47
  */
30
- | 'awaiting_approval'
48
+ | 'suspended'
31
49
  /** 模型/网关返回了本框架未识别的 stop_reason:保留文本,但按失败收尾 */
32
50
  | 'unknown_stop_reason' | 'error';
33
51
  /**
34
52
  * 是否「正常收尾」:end_turn(自然结束)与 stop_sequence(命中 stop 序列)都算。
35
53
  * run 状态机 / trace 状态 / 子 agent 交回判定共用这一把尺子 —— 三处各写各的
36
54
  * `=== 'end_turn'` 时,新增一个正常收尾原因就会漏改其中一处(stop_sequence 落地时
37
- * 就出现过:loop 判成功、Run 判失败)。
55
+ * 就出现过:loop 判成功、Run 判失败)。判据在 `SUCCESS_STOP_REASON` 表里(表是穷尽式的)。
38
56
  */
39
57
  export declare function isSuccessStopReason(reason: AgentStopReason): boolean;
40
58
  /** 可携带 cache_control 的 system 文本块(见 runtime/systemPrompt.ts) */
@@ -55,7 +73,14 @@ export type SystemParam = string | SystemTextBlock[];
55
73
  * 独立实例,否则状态跨 run 泄漏(见 forRun 说明)。
56
74
  */
57
75
  export interface ContextPolicy {
58
- /** 预算(估算 input tokens);超预算的回合触发降级。供观测/文档用 */
76
+ /**
77
+ * 预算(**估算 messages 的** tokens);超预算的回合触发降级。供观测/文档用。
78
+ *
79
+ * ⚠️ 口径如实(外部深评 E6):估的**只有 `messages`** —— system prompt 与 tools schema
80
+ * 不在这个数里,而它们同样进请求(`policy.ts` 只把 `messages` 喂给 `countTokens`)。
81
+ * 所以它是「对话历史多大」的尺子,不是「这次请求多大」的尺子:真实 input tokens
82
+ * 恒 ≥ 这个数。改口径要连 `usage-guide` 那一行一起改(两边说的必须是同一件事)。
83
+ */
59
84
  readonly budgetTokens?: number;
60
85
  beforeTurn(messages: MessageParam[], info: {
61
86
  iteration: number;
@@ -82,6 +107,39 @@ export interface RunAgentOptions<S extends JsonSchema = JsonSchema> {
82
107
  maxIterations?: number;
83
108
  /** 注入 client(缺省经 createAnthropicClient() 创建,读 ANTHROPIC_API_KEY / ANTHROPIC_BASE_URL env);多模型见 ModelClient */
84
109
  client?: ModelClient;
110
+ /**
111
+ * 模型 fallback 链(R8-P2):主模型本回合**最终**失败(含其 maxRetries 用尽)且错误
112
+ * 可换(`classifyError` 的 retryable 类:rate_limit / server / timeout / connection)时,
113
+ * 按数组序换下一环重试本回合。每一环开自己的 llm.turn span(model 名正确 ⇒ 成本归因
114
+ * 与 `usage.unpriced` 探测天然对),切换在新 span 上记 `llm.fallback` 事件
115
+ * `{ from, to, errorType }`。三条护栏:`aborted` 永不换(用户取消不是故障);
116
+ * 本回合**吐过字不换**(与 retry 的「吐过字不重试」同一护栏,否则会拼出两段回答);
117
+ * **每回合从主环重新起**(fallback 是单回合韧性,不把后续回合钉在备用模型上)。
118
+ * 子 agent / skill 子循环**不继承**本链(它们的 model/client 由能力层显式给)。
119
+ */
120
+ fallbacks?: ModelFallbackLink[];
121
+ /**
122
+ * 记录 assistant 文本进 trace(R8-P3a):`'full'` = 每回合的模型文本落 llm.turn span 的
123
+ * `output.text` 属性(引擎文本口径:多块 `\n` 连接;过 `maxEventChars` 同一道截断闸 ——
124
+ * 那个管「多长」,这个管「记不记」)。缺省不记(现状逐字不变:llm.turn 只记
125
+ * usage/事件,见 `engine/replay.ts` 的有损边界声明)。纯 tool_use 回合不记(无文本块)。
126
+ *
127
+ * ⚠️ 两个代价,开了就要认:① trace 体积显著增大(模型正文进树);
128
+ * ② 模型输出从此进入「要脱敏的面」—— 出库前走脱敏配方(`docs/observability.md` §2.4)。
129
+ * 主要消费者:trace → 训练数据导出与逐字复盘。透传给子 agent / skill 子循环
130
+ * (与 `maxEventChars` 同一条转发纪律:同一棵调用树上口径一致)。
131
+ */
132
+ traceContent?: 'full';
133
+ /**
134
+ * 租户/业务维度归因标签(R8-P4):落 run 根的 `labels.<key>` 属性(trace 侧无基数问题)。
135
+ * 与 `RunSpec.source` 正交不动:source 是框架自己写的**触发来源**审计(sync / async /
136
+ * schedule:<id>),labels 是宿主写的**业务维度**(tenant / plan / …)。
137
+ * 键值都必须是字符串(键非空),否则 run 入口抛 TypeError;可序列化(异步任务随
138
+ * TaskRecord 落库、续跑不丢)。
139
+ * ⚠️ 进 metrics 是**另一个开关**:`metricsSink({ labelKeys })` 显式点名哪些 key 上指标
140
+ * 标签(缺省一个都不上)—— Prometheus 标签基数爆炸是真实事故类,见该选项的注释。
141
+ */
142
+ labels?: Record<string, string>;
85
143
  /** 注入 recorder(run 层复用;不注入则内部新建,traceId 即 runId) */
86
144
  recorder?: import('./tracer.js').TraceRecorder;
87
145
  /** 文本增量回调(终端/SSE 用) */
@@ -210,6 +268,13 @@ export interface RunAgentOptions<S extends JsonSchema = JsonSchema> {
210
268
  * 其 tool_use 在这里**没有**决定 ⇒ 该回合整体挂起(见 AgentTool.approval)。
211
269
  */
212
270
  approvals?: Record<string, ApprovalDecision>;
271
+ /**
272
+ * 挂起期间投递的事件(2026-09-28 ⑥;语义见 `RunInvocationOptions.events`):
273
+ * 续跑段在未决 tool_use 解决之后渲染成 user 文本消息注入消息流,并在 run 根
274
+ * 记 `task.event` 事件留痕(`{ injected, event_type, event_id? }` —— `injected`
275
+ * 的口径是「注入进本段消息流」,不等于「模型已看到」)。
276
+ */
277
+ events?: TaskEvent[];
213
278
  }
214
279
  export interface AgentRunResult<T = unknown> {
215
280
  /** 本次 run 的完整调用树 + usage(traceId == runId) */
@@ -237,4 +302,25 @@ export interface AgentRunResult<T = unknown> {
237
302
  * 宿主(`AsyncRunner`)据此持久化「该批哪些 id」,HTTP 轮询方据此知道该审批什么。
238
303
  */
239
304
  pendingApprovals: string[] | undefined;
305
+ /**
306
+ * 挂起原因(`stopReason === 'suspended'` 时非空):`approval` = 等人工决定、
307
+ * `timer` = 等一个时刻。宿主据此选闸(审批超时 / 到期唤醒)并落 TaskRecord。
308
+ */
309
+ suspendedReason: SuspendedReason | undefined;
310
+ /**
311
+ * 时间挂起的目标时刻(epoch ms):`suspendedReason === 'timer'` 时在场,其余为 undefined
312
+ * (**字段在场**,与 `error` 同一条结果记录约定)。
313
+ *
314
+ * 宿主(`AsyncRunner`)把它落成 `TaskRecord.wakeAt` —— 进程重启后「这条在睡的 run 什么时候
315
+ * 该醒」只靠它(`wake-policy.ts` 的 `timerDue`)。等审批的挂起没有这个时刻(人什么时候
316
+ * 批就是什么时候),所以它恒为 undefined。
317
+ */
318
+ wakeAt: number | undefined;
319
+ /**
320
+ * 本段是否把传入的 `events`(run 事件投入口,2026-09-28 ⑥)**真注入了消息历史**
321
+ * (字段在场)。宿主(`AsyncRunner`)据此清 `TaskRecord.pendingEvents`:注入过 ⇒ 事件
322
+ * 已在历史里,簿记清掉(否则注入后再次挂起的场景会在下次续跑**重复注入**);
323
+ * 续跑入口的再挂起出口在注入点之前返回(false),簿记留住等跑通的那次。
324
+ */
325
+ eventsDelivered: boolean;
240
326
  }
@@ -1,10 +1,46 @@
1
+ /**
2
+ * 「是否算正常收尾」的**分类表**(外部深评 E5)。
3
+ *
4
+ * 为什么是 `Record<AgentStopReason, boolean>` 而不是 `reason === 'end_turn' || …`:
5
+ * `Record` 要求**每个成员都在表里表态**,所以「往联合里加一个新的 stop reason」这件事
6
+ * 会让 `tsc` 当场报缺属性 —— **新增原因而漏改分类**在类型上写不出来。
7
+ * 原先的二值 `||` 链没有任何这种约束:加一个成员,它默认落进「失败」,
8
+ * 而三处消费者(`runtime/run.ts` 的 run 状态、`engine/loop.ts` 的 trace 状态、
9
+ * `toolkit/subagent.ts` 的交回判定)会**各说各话**——`stop_sequence` 落地时就真踩过
10
+ * (loop 判成功、Run 判失败;见 `isSuccessStopReason` 的下游注释)。
11
+ *
12
+ * ⚠️ 别把它改成 `Partial<Record<…>>` / 加 `?? false` 兜底:那样这个守卫就废了
13
+ * (缺的成员会被静默当成 false)。`tests/types/stop-reason.types.ts` 用 `@ts-expect-error`
14
+ * 把「表必须是完整的」这一点钉住 —— 谁把它放宽,那条指令就变成未使用 ⇒ 类型检查红。
15
+ *
16
+ * 语义提醒:这里的「成功」只回答**看板算不算成功**。`suspended` 既不算成功也不算失败
17
+ * (挂起段本身执行无误),所以它在表里是 `false` —— 「不是成功」不等于「失败」,
18
+ * 两种「非成功」的区分由 `stopReason` 自己承担。
19
+ */
20
+ const SUCCESS_STOP_REASON = {
21
+ // —— 正常收尾 ——
22
+ end_turn: true,
23
+ stop_sequence: true, // 命中 stop 序列同样是正常收尾
24
+ // —— 非正常收尾(都带结构化 error,见 engine/stop-reason.ts)——
25
+ max_tokens: false,
26
+ refusal: false,
27
+ pause_turn: false,
28
+ max_iterations: false,
29
+ aborted: false,
30
+ budget_exceeded: false, // 护栏拦下的,不是正常收尾
31
+ tool_use_no_blocks: false,
32
+ unknown_stop_reason: false,
33
+ error: false,
34
+ // —— 既不是成功也不是失败 ——
35
+ suspended: false,
36
+ };
1
37
  /**
2
38
  * 是否「正常收尾」:end_turn(自然结束)与 stop_sequence(命中 stop 序列)都算。
3
39
  * run 状态机 / trace 状态 / 子 agent 交回判定共用这一把尺子 —— 三处各写各的
4
40
  * `=== 'end_turn'` 时,新增一个正常收尾原因就会漏改其中一处(stop_sequence 落地时
5
- * 就出现过:loop 判成功、Run 判失败)。
41
+ * 就出现过:loop 判成功、Run 判失败)。判据在 `SUCCESS_STOP_REASON` 表里(表是穷尽式的)。
6
42
  */
7
43
  export function isSuccessStopReason(reason) {
8
- return reason === 'end_turn' || reason === 'stop_sequence';
44
+ return SUCCESS_STOP_REASON[reason];
9
45
  }
10
46
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"AA+CA;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,eAAe,CAAC;AAC7D,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/engine/types.ts"],"names":[],"mappings":"AAkEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,mBAAmB,GAAqC;IAC5D,aAAa;IACb,QAAQ,EAAE,IAAI;IACd,aAAa,EAAE,IAAI,EAAE,oBAAoB;IACzC,kDAAkD;IAClD,UAAU,EAAE,KAAK;IACjB,OAAO,EAAE,KAAK;IACd,UAAU,EAAE,KAAK;IACjB,cAAc,EAAE,KAAK;IACrB,OAAO,EAAE,KAAK;IACd,eAAe,EAAE,KAAK,EAAE,eAAe;IACvC,kBAAkB,EAAE,KAAK;IACzB,mBAAmB,EAAE,KAAK;IAC1B,KAAK,EAAE,KAAK;IACZ,mBAAmB;IACnB,SAAS,EAAE,KAAK;CACjB,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAAuB;IACzD,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}