@migor/agentia 0.10.5 → 0.10.6

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 (124) hide show
  1. package/CHANGELOG.md +128 -1
  2. package/README.md +1 -1
  3. package/dist/AGENTS.md +9 -1
  4. package/dist/container/container.js +3 -0
  5. package/dist/container/container.js.map +1 -1
  6. package/dist/core/abort.js +6 -1
  7. package/dist/core/abort.js.map +1 -1
  8. package/dist/core/json.js +4 -0
  9. package/dist/core/json.js.map +1 -1
  10. package/dist/core/limits.d.ts +5 -5
  11. package/dist/core/limits.js +5 -5
  12. package/dist/core/limits.js.map +1 -1
  13. package/dist/core/sse.d.ts +0 -13
  14. package/dist/core/sse.js +28 -2
  15. package/dist/core/sse.js.map +1 -1
  16. package/dist/core/timeout.d.ts +8 -0
  17. package/dist/core/timeout.js +19 -1
  18. package/dist/core/timeout.js.map +1 -1
  19. package/dist/core/trace.d.ts +7 -0
  20. package/dist/core/trace.js +7 -0
  21. package/dist/core/trace.js.map +1 -1
  22. package/dist/engine/loop.js +37 -11
  23. package/dist/engine/loop.js.map +1 -1
  24. package/dist/engine/mcp-server.d.ts +17 -1
  25. package/dist/engine/mcp-server.js +36 -2
  26. package/dist/engine/mcp-server.js.map +1 -1
  27. package/dist/engine/policy.js +5 -1
  28. package/dist/engine/policy.js.map +1 -1
  29. package/dist/engine/replay.js +63 -1
  30. package/dist/engine/replay.js.map +1 -1
  31. package/dist/engine/run-config.d.ts +6 -0
  32. package/dist/engine/run-config.js +15 -6
  33. package/dist/engine/run-config.js.map +1 -1
  34. package/dist/engine/spec.d.ts +6 -0
  35. package/dist/engine/spec.js.map +1 -1
  36. package/dist/engine/stop-reason.js +19 -1
  37. package/dist/engine/stop-reason.js.map +1 -1
  38. package/dist/engine/tool-events.d.ts +1 -0
  39. package/dist/engine/tool-events.js +7 -0
  40. package/dist/engine/tool-events.js.map +1 -1
  41. package/dist/engine/tracer.js +10 -3
  42. package/dist/engine/tracer.js.map +1 -1
  43. package/dist/engine/turn.d.ts +4 -12
  44. package/dist/engine/turn.js +89 -8
  45. package/dist/engine/turn.js.map +1 -1
  46. package/dist/engine/types.d.ts +10 -1
  47. package/dist/engine/types.js +1 -0
  48. package/dist/engine/types.js.map +1 -1
  49. package/dist/engine/usage.js +12 -4
  50. package/dist/engine/usage.js.map +1 -1
  51. package/dist/index.d.ts +1 -1
  52. package/dist/index.js +1 -1
  53. package/dist/integrations/anthropic.d.ts +9 -1
  54. package/dist/integrations/anthropic.js +42 -7
  55. package/dist/integrations/anthropic.js.map +1 -1
  56. package/dist/integrations/file-sink.d.ts +1 -0
  57. package/dist/integrations/file-sink.js +35 -32
  58. package/dist/integrations/file-sink.js.map +1 -1
  59. package/dist/integrations/mcp-http.js +33 -9
  60. package/dist/integrations/mcp-http.js.map +1 -1
  61. package/dist/integrations/mcp-protocol.js +33 -16
  62. package/dist/integrations/mcp-protocol.js.map +1 -1
  63. package/dist/integrations/metrics-otlp.js +4 -0
  64. package/dist/integrations/metrics-otlp.js.map +1 -1
  65. package/dist/integrations/metrics.js +17 -2
  66. package/dist/integrations/metrics.js.map +1 -1
  67. package/dist/integrations/openai.d.ts +6 -1
  68. package/dist/integrations/openai.js +45 -8
  69. package/dist/integrations/openai.js.map +1 -1
  70. package/dist/integrations/otlp.js +6 -0
  71. package/dist/integrations/otlp.js.map +1 -1
  72. package/dist/runtime/memory.d.ts +0 -8
  73. package/dist/runtime/memory.js +24 -2
  74. package/dist/runtime/memory.js.map +1 -1
  75. package/dist/runtime/run.js +34 -9
  76. package/dist/runtime/run.js.map +1 -1
  77. package/dist/store/fsStore.d.ts +2 -0
  78. package/dist/store/fsStore.js +38 -5
  79. package/dist/store/fsStore.js.map +1 -1
  80. package/dist/store/record.d.ts +40 -0
  81. package/dist/store/record.js +72 -0
  82. package/dist/store/record.js.map +1 -1
  83. package/dist/store/redisStore.js +15 -4
  84. package/dist/store/redisStore.js.map +1 -1
  85. package/dist/store/sqliteStore.js +39 -14
  86. package/dist/store/sqliteStore.js.map +1 -1
  87. package/dist/store/store.js +10 -4
  88. package/dist/store/store.js.map +1 -1
  89. package/dist/toolkit/module.js +1 -0
  90. package/dist/toolkit/module.js.map +1 -1
  91. package/dist/toolkit/prompt.js +12 -3
  92. package/dist/toolkit/prompt.js.map +1 -1
  93. package/dist/transport/approval-policy.d.ts +1 -1
  94. package/dist/transport/approval-policy.js +18 -3
  95. package/dist/transport/approval-policy.js.map +1 -1
  96. package/dist/transport/approval-supervisor.d.ts +15 -3
  97. package/dist/transport/approval-supervisor.js +37 -11
  98. package/dist/transport/approval-supervisor.js.map +1 -1
  99. package/dist/transport/async.d.ts +1 -0
  100. package/dist/transport/async.js +143 -23
  101. package/dist/transport/async.js.map +1 -1
  102. package/dist/transport/drain-gate.js +13 -1
  103. package/dist/transport/drain-gate.js.map +1 -1
  104. package/dist/transport/http-endpoints.js +7 -0
  105. package/dist/transport/http-endpoints.js.map +1 -1
  106. package/dist/transport/resume-scanner.d.ts +3 -0
  107. package/dist/transport/resume-scanner.js +10 -1
  108. package/dist/transport/resume-scanner.js.map +1 -1
  109. package/dist/transport/run-call-options.js +43 -1
  110. package/dist/transport/run-call-options.js.map +1 -1
  111. package/dist/transport/run-outcome.js +18 -1
  112. package/dist/transport/run-outcome.js.map +1 -1
  113. package/dist/transport/serve.js +10 -0
  114. package/dist/transport/serve.js.map +1 -1
  115. package/dist/transport/signal-supervisor.d.ts +3 -0
  116. package/dist/transport/signal-supervisor.js +5 -1
  117. package/dist/transport/signal-supervisor.js.map +1 -1
  118. package/dist/transport/stream-janitor.d.ts +45 -0
  119. package/dist/transport/stream-janitor.js +137 -0
  120. package/dist/transport/stream-janitor.js.map +1 -0
  121. package/dist/transport/task-wake-gate.d.ts +40 -0
  122. package/dist/transport/task-wake-gate.js +69 -0
  123. package/dist/transport/task-wake-gate.js.map +1 -0
  124. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -5,6 +5,132 @@
5
5
  (0.x 阶段:minor 可含破坏性变更,每个破坏性变更都在对应版本的「迁移」小节里写明)。
6
6
  决策的完整证据链在 `docs/spec.md` §10(带时间线的决策日志)。
7
7
 
8
+ ## [0.10.6] - 2026-11-09
9
+
10
+ ### 变更
11
+
12
+ 本版是一次**正确性收口**,不新增能力面:修掉八类「静默失效」,其中三处会改变调用方能观察到的
13
+ 行为,需要在升级前确认。两包同步 0.10.5 → 0.10.6。
14
+
15
+ - ⚠️ **MCP 反向桥默认不再暴露 `approval: 'required'` 的工具**(安全修)。MCP 没有审批挂起通道,
16
+ 暴露即等于绕过审批。需要这些人批工具的人显式设 `exposeApprovalRequiredTools: true`;
17
+ 被隐藏时构造期会打一行 warn **点名数量**,不静默少工具。
18
+ - ⚠️ **所有出站请求不再跟随重定向**(安全修)。307/308 会把鉴权头与请求体原样转到另一个
19
+ origin。依赖 3xx 跳转的外部端点现在会**报错**而不是静默跟过去,请把最终地址配进去。
20
+ - ⚠️ **坏值从「静默忽略」改成「响亮拒绝」**:`maxEventChars: 0` 现在真的截到空串
21
+ (此前被当成「不限」);`toolTimeoutMs` / `maxEventChars` / `maxToolResultChars` /
22
+ `awaitTask` 的 `timeoutMs`·`intervalMs` / OTLP·metrics 的 `timeoutMs` 在入口校验,
23
+ NaN·负数·小数直接抛。`metricsSink.intervalMs` 的负数与 `0` 同义(立即导出),已写进
24
+ `LIMIT_SEMANTICS` 表。
25
+ - 四条唤醒路径(`approve × signalTask` / `wakeDue × signalTask`)共用一把 per-task 互斥闸,
26
+ 同一任务不再被派发两遍;`cancel` 等同一张表的 tail。
27
+ - 审批决定带作用域:只认 `requestedAt` 与本次挂起匹配的决定,同一 `tool_use_id` 每段只消费一次
28
+ —— 修掉 OpenAI 兼容端点复用 `call_1` 导致的审批绕过。
29
+ - 失败尝试的部分 usage 落账:流中断前已收到的计量挂到错误上并写 `usage.partial`,
30
+ `maxCostUsd` / `maxTotalTokens` 不再系统性少算。
31
+ - 跨进程 SSE 兜底从「每连接一个 5s 定时器」提到 runner 级单例:一拍里每个任务只读一次 store,
32
+ 定时器有登记才存在;`streamTask` 的 `pollMs` 从此是开关(`<= 0` = 该流不参与兜底)。
33
+ - 落库剥离 `client` / `tools` 时留下可读痕迹,恢复段按 taskId 告警一次 —— 此前 per-task 自定义
34
+ client 的任务重启续跑会**静默**打到 runner 的端点。
35
+ - JSON / SQLite / Redis 三条 store 的恢复路径加固(读失败出声、半行写入回滚、迁移事务化、
36
+ SCAN 去重、水合失败跳过回写),详见 `docs/spec.md` §10。
37
+ - 构建面:四个 `package-lock.json` 的 `resolved` 从第三方镜像站改回官方 registry(共 463 处),
38
+ 两个示例 `Dockerfile` 加拉包重试。此前 2026-11-09 镜像站 5xx 让「构建 deploy 示例镜像」连挂
39
+ 两轮(`ER_NO_SUCH_TABLE` / `504`);改后该 job 从 174–368s 降到 20s。⚠️ 它与 `src/` 无关,
40
+ 但影响**从零安装**:`npm ci` 的 tarball 来源现在是官方源(镜像站用户仍可由自己的 npm 配置改写)。
41
+
42
+ ### ⚠️ 行为变更(安全修):MCP 反向桥默认隐藏 HITL 工具(2026-11-07 ref-deep-review-2026-11-07)
43
+
44
+ - **修的是什么**:`createMcpServer` 此前把 `app.tools` 整个交给 MCP 客户端。而
45
+ `@Tool({ approval: 'required' })` 的语义是「调用前必须有人批」,MCP 这条通道**没有**挂起与
46
+ 回调的通道 —— 工具被列出去就等于「审批被绕过」,且没有任何一处会报错。
47
+ - **现在**:默认过滤掉 `approval: 'required'` 的工具;确有需要(例如客户端自己实现了外部审批)
48
+ 显式设 `exposeApprovalRequiredTools: true`。过滤发生时打一行 warn 说明数量与原因 ——
49
+ 「明明写了 `@Tool`,MCP 客户端却看不到」不该靠猜。
50
+ - **迁移**:升级后如果 MCP 客户端少了一批工具,先看启动日志里那行 warn。要恢复旧行为就开那个开关,
51
+ 但请自行确保这些工具的人批在你的客户端侧成立。
52
+
53
+ ### ⚠️ 行为变更(安全修):出站 `fetch` 不跟随重定向
54
+
55
+ - **修的是什么**:默认的 `fetch` 跟 3xx,而 307/308 **保留方法与请求体** —— 一次被中间人控制或
56
+ 被错误配置的重定向,会把 `Authorization` 头与 prompt 原文发到另一个 origin。这条链上没有一个
57
+ 环节会报错,日志里只有一次成功的 `POST`。
58
+ - **现在**:所有出站调用(模型适配器、OTLP/metrics 导出、MCP HTTP)一律 `redirect: 'error'`,
59
+ 收到 3xx 直接失败。
60
+ - **迁移**:如果你的模型网关 / OTLP collector 依赖 301/302/307 跳转,请把最终地址直接配进去。
61
+ 报错信息里带原始状态码与 `Location`,照它改即可。
62
+
63
+ ### 唤醒互斥与取消优先(2026-11-07 ref-deep-review-2026-11-07)
64
+
65
+ - **修的是什么**:`approve` 与 `signalTask`、`wakeDue` 与 `signalTask` 各自凭**同一份** suspended
66
+ 快照判断「该我唤醒」,于是同一任务被派发两遍;两次执行都落库,后写的覆盖前写的,
67
+ 审批决定可能凭空消失,而 usage 记了两份。
68
+ - **现在**:四条唤醒路径共用 `transport/task-wake-gate.ts` 的 per-task 串行闸,同步段一次性登记
69
+ (无 await,无 TOCTOU 窗口);`cancel` 排在同一个 key 的 tail 上,不会插进正在进行的唤醒。
70
+ - **取消优先**:引擎的续跑段与主循环的 approval / deferred 出口统一补 abort 守卫;宿主在
71
+ suspended 分支再判一次取消意图 —— 修掉「cancel 等不到终态、超时定时器到点又跑一遍」。
72
+ - **验证**:`tests/transport/wake-gate.test.ts`、`tests/transport/drain-gate.test.ts`;反向变异
73
+ 确认「摘掉 gates」能复现双派发。
74
+
75
+ ### 审批决定的作用域(2026-11-07 ref-deep-review-2026-11-07)
76
+
77
+ - **修的是什么**:审批决定此前只按 `tool_use_id` 匹配。OpenAI 兼容端点每次都从 `call_1` 开始编号,
78
+ 于是**上一段**挂起时批过的 `call_1`,会被下一段的 `call_1` 当成「已批准」直接放行 ——
79
+ 一次静默的审批绕过。
80
+ - **现在**:`RunAgentOptions.approvalEpoch` 标出本次挂起的身份(异步宿主自动注入
81
+ `TaskRecord.suspendedSince`),只认 `requestedAt` 匹配的决定;同一段内每个 `tool_use_id` 也只
82
+ 消费一次(`consumedApprovals`)。三处判据(写入时的 `requestedAt`、`fillTimeoutDenials` 的
83
+ stale 覆盖、`approvalsComplete(rec, since)`)用的是同一个 epoch。
84
+ - **验证**:`tests/engine/approval-epoch.test.ts`(含「旧决定不得跨段复用」与「同段只消费一次」
85
+ 两条正面用例)。
86
+
87
+ ### 失败尝试的计量落账(2026-11-07 ref-deep-review-2026-11-07)
88
+
89
+ - **修的是什么**:适配器在流中断(网络断、上游 5xx、超时)时把整个 turn 判为失败,而**中断前已
90
+ 收到的** `input_tokens` / `output_tokens` 随之丢掉。重试三次的实际花费是三次之和,
91
+ `maxCostUsd` 只看到最后一次 —— 预算闸系统性偏松。
92
+ - **现在**:适配器把已收到的计量挂到错误对象上,引擎记进失败 turn 的 span 并写 `usage.partial`
93
+ 事件;`usageTotal` 因此包含失败尝试。
94
+ - **验证**:`tests/engine/review-fixes.test.ts` 覆盖「首两次失败 + 第三次成功」的总账。
95
+
96
+ ### 流生命周期与跨进程兜底(2026-11-07 / 2026-11-09 ref-stream-janitor-singleton)
97
+
98
+ - **修的是什么(跨进程)**:任务被另一个副本接管或已落终态时,本进程那条 SSE 不会自己结束 ——
99
+ 客户端永远等不到 `end` / `closed`。此前由 `streamTask` 给**每个订阅**各建一个 5s 定时器去
100
+ `store.get` 判断:N 个并发连接 = N 个定时器 + N/5 QPS,SQLite 下就是 N/5 次读锁;`unref()`
101
+ 只保证不挂住进程,不减读放大。
102
+ - **现在**:`transport/stream-janitor.ts` 改成「组」的形状 —— 一拍里每个**任务**只读一次 store,
103
+ 再把结论分发到该任务的所有订阅;定时器**有登记才存在**,最后一条注销即停。一拍里的意外
104
+ (判据抛错)被 catch 住,不会变成 `unhandledRejection` 打死宿主。
105
+ - **其余收口**:`streamTask` 的 `onDone` 补 rejection 处理(store 抖动不再打死进程);
106
+ SSE 单行复用 8M 码元上限并 flush 尾字节;上限判据改成**切出来的那一帧**(此前判整个 `buf`,
107
+ 一次 read 交付多行大 chunk 会被误报成「单行超限」);MCP HTTP 的 SSE 改增量读
108
+ (server 不关流不再让 `tools/call` 永挂)。
109
+ - **验证**:`tests/transport/stream-janitor.test.ts`(六条故障路径 + 两条结构不变量),
110
+ 行覆盖 100%、分支 89.58%;`tests/core/sse-text-stats.test.ts` 含「单帧 9M 仍要拒」的对照。
111
+
112
+ ### 持久化与恢复(2026-11-07 / 2026-11-09 ref-resume-dropped-refs)
113
+
114
+ - **修的是什么(落库)**:`JSON.stringify` 把 `AbortSignal` 变成 `{}`、把 `ModelClient` 变成
115
+ `{messages:{}}`、把 `tools` 里的 run 函数丢掉。读回后这些空壳会在恢复段被当成真对象使用
116
+ (`combineSignals({})` 直接 TypeError,工具菜单半残)。现在三条 JSON store 统一在落库前剥离。
117
+ - **修的是什么(剥离的副作用)**:剥离之后,「提交时本来没传 `client`」与「传了但被剥掉」在
118
+ 读回时**完全同形**,于是 per-task 自定义 client(典型是 OpenAI 兼容端点)的任务重启续跑时会
119
+ **静默**退回 runner 的端点。现在剥离时记下清单(`__agentiaDroppedRefs`),装配处按 taskId
120
+ 去重告警一次,写明「本段已退回 runner client / 装配菜单」与出路;键在装配前剔除,不进引擎。
121
+ - **其余加固**:FileTaskStore 读失败出声且禁止 compact、半行写入回滚;SQLite 迁移事务化、
122
+ `healRow` 用旧 json 做 CAS;Redis `list()` 对 SCAN 结果去重、单 key 错不再整表 reject;
123
+ Memory 水合失败跳过回写;runtime 的手工 HITL 续跑不再重复 load/append。
124
+ - **验证**:`tests/store/serialize-options.test.ts`(剥离标记三态 + 告警只响一次);
125
+ `tests/transport/resume-scanner.test.ts`。
126
+
127
+ ### 依赖
128
+
129
+ - 官网构建链:`astro` 7.3.8 → 7.4.5、`gsap` 3.15.0 → 3.15.1、`lenis` 1.3.26 → 1.3.27。
130
+ - 开发链:dev-dependencies 组 5 项升级;`@biomejs/biome` 适配到 2.6.4
131
+ (排除文档/YAML 格式化、`useMathMinMax`)。
132
+ - 框架本身**运行时依赖仍为 0**。
133
+
8
134
  ## [0.10.5] - 2026-11-05
9
135
 
10
136
  ### 变更
@@ -4300,7 +4426,8 @@ toolkit 142 / runtime 55 / engine 403 / container 10 / store 55 —— 全绿。
4300
4426
  首个公开发布:`@migor/agentia` + `@migor/cli`(scope `@migor/*`),两包版本同步。
4301
4427
  框架本体单包;CLI 独立成包(workspaces)。
4302
4428
 
4303
- [Unreleased]: https://github.com/migoric/agentia/compare/v0.10.5...HEAD
4429
+ [Unreleased]: https://github.com/migoric/agentia/compare/v0.10.6...HEAD
4430
+ [0.10.6]: https://github.com/migoric/agentia/releases/tag/v0.10.6
4304
4431
  [0.10.5]: https://github.com/migoric/agentia/releases/tag/v0.10.5
4305
4432
  [0.10.4]: https://github.com/migoric/agentia/releases/tag/v0.10.4
4306
4433
  [0.10.3]: https://github.com/migoric/agentia/releases/tag/v0.10.3
package/README.md CHANGED
@@ -43,7 +43,7 @@ npm run dev -- "你的问题" # = tsx src/main.ts,跑一次并
43
43
  - 工程内命令:`npx agentia g tool fetch-weather` / `npx agentia doctor` / `npx agentia --version`;
44
44
  想全局装:`npm i -g @migor/cli`。
45
45
 
46
- > **版本**:`0.10.5`(`@migor/agentia` 与 `@migor/cli` 均已发布到 npm)。
46
+ > **版本**:`0.10.6`(`@migor/agentia` 与 `@migor/cli` 均已发布到 npm)。
47
47
 
48
48
  ## 快速开始
49
49
 
package/dist/AGENTS.md CHANGED
@@ -447,6 +447,7 @@ run 在**文件末尾** —— 取最早那种写法在长跑 dev 环里等于
447
447
  | `memory` | 跨 run 记忆 `{ store, keys }`:run 前水合进 blackboard(用户种子优先)、收尾写回;与 `session` 正交(见 `MemoryStore`) |
448
448
  | `beforeFlush` | `(trace, result) => void \| Promise<void>`:**sinks 冲刷之前**的最后一笔(run 正常收尾后调一次,抛错被吞)。给「**拿到结果才判得出**的结论」用的缝 —— 典型是 `defineEval` 的 score:等 `app.run` 返回再 `attachScore`,`metricsSink` 早在导出那一刻聚完账,分数就永远进不了指标。读 trace 就够的判断不必用它,写进 sinks 里即可(见 §6 判官配方) |
449
449
  | `approvals` | HITL 审批决定(`Record<tool_use_id, ApprovalDecision>`):恢复 `suspended` 的 run 时传入(异步宿主会自动带,见 §6.6「人工审批」);手工续跑「assistant 结尾带 tool_use」的消息历史时也可直接给 |
450
+ | `approvalEpoch` | 续跑段的挂起时刻(= `TaskRecord.suspendedSince`,异步宿主自动注入)。引擎只认 `requestedAt` 与它相等的决定 —— 防止旧挂起留下的同名 `tool_use_id`(OpenAI 兼容端点会复用 `call_1`)自动批准新一次调用;手工续跑省略 = 不做 epoch 过滤(同 run 内仍只消费一次) |
450
451
  | `events` | run 事件(`TaskEvent[]`,`{ eventId?, type, payload }` 全是字符串):挂起期间投递、随 `TaskRecord` 落库的事件,续跑段由引擎在**未决 tool_use 解决之后**渲染成 user 文本消息注入消息流(异步宿主经 `signalTask` 自动带,见 §6.6「事件投递」);手工续跑时也可直接给 |
451
452
 
452
453
  返回 `AgentRunOutput`:`{ run, result }`。`result` 含 `trace` / `stopReason` / `finalText` / `iterations` / `error` / `typed`;
@@ -1018,7 +1019,7 @@ trace 出去之后能干什么:指标、调用树面板、调优报告、生
1018
1019
  | `TraceRecorder` | 内存 recorder(一次 run 一个);`addLink(spanId, { traceId, spanId? })` 记一条跨 trace 链路(见 §6「跨进程关联」) |
1019
1020
  | `parseTraceparent` | 解析 W3C `traceparent` 头 → `{ traceId, spanId? }`;**非法 / 缺头一律返回 `undefined`**(不抛、不打 400)—— 结果直接交给 `traceContext` 选项,见 §6「跨进程关联」 |
1020
1021
  | `createOtlpExporter` | OTLP/JSON 导出,零依赖;选项见下面「`OtlpExporterOptions`」表 |
1021
- | `jsonlTraceSink` | JSONL 文件 sink:`jsonlTraceSink({ path })` → `TraceSink`,一行一条裸 Trace 追加落盘(父目录自动创建、追加不覆盖)—— **`agentia report` / `diff` / `harvest` / `export` / `view` 的输入格式**,见 §6「调优报告」。⚠️ **同一路径进程内幂等**(两次调用返回同一个 sink):两条 sink 对口一个文件会让一次 run 落两行同 traceId,而下面的命令按「一行 = 一次 run」计数 ⇒ 一次 run 被数两次(不报错,比不落盘更难发现)。所以「应用级 `sinks` 与 `registerDefaultTraceSink` 都往 `.agentia/traces.jsonl` 写」是安全的 |
1022
+ | `jsonlTraceSink` | JSONL 文件 sink:`jsonlTraceSink({ path, fsync? })` → `TraceSink`(`fsync: true` 时每次追加后同步落盘;缺省 false 保持旧性能),一行一条裸 Trace 追加落盘(父目录自动创建、追加不覆盖)—— **`agentia report` / `diff` / `harvest` / `export` / `view` 的输入格式**,见 §6「调优报告」。⚠️ **同一路径进程内幂等**(两次调用返回同一个 sink):两条 sink 对口一个文件会让一次 run 落两行同 traceId,而下面的命令按「一行 = 一次 run」计数 ⇒ 一次 run 被数两次(不报错,比不落盘更难发现)。所以「应用级 `sinks` 与 `registerDefaultTraceSink` 都往 `.agentia/traces.jsonl` 写」是安全的 |
1022
1023
  | `TraceRecordEvent` | **增量记账事件**(`onTraceEvent` 的回调参数):`span.begin` / `span.end` / `span.event` / `span.attribute` / `span.link`,每条带单调 `seq`。载荷是**增量 + 此刻的拷贝**(`span.begin` 只给初始形状,属性/事件/链路各走自己的类型);按 `seq` 升序折回必须**逐字等于**收尾时的 trace |
1023
1024
  | `metricsSink` | 指标累加器(Prometheus 文本 / OTLP metrics),满足 `TraceSink` 即接入 —— 见 §6「指标」 |
1024
1025
  | `buildRunReport` | 从一条 trace 生成**调优报告**(能力/模型的耗时、token、成本、错误率排行)—— 见 §6「调优报告」 |
@@ -1520,6 +1521,7 @@ server —— Claude Code / Cursor / 任何 MCP 宿主都能直接调你的 `@To
1520
1521
  - **结果映射与正向桥方向对称**:工具返回 string → `content: [{ type: 'text', text }]`,其他 JSON 化进 text;抛错 → 协议层成功 + `isError: true`(MCP 惯例;正向桥的连接器正好把 `isError` 转回抛错)。
1521
1522
  - **取消是协作式**:客户端断连 / `close()` 会中止该次调用的 `ToolRunContext.signal`;`toolTimeoutMs` 与引擎同款语义(非正数 / 不设 = 不限;超时 = **放弃等待** + abort `abandoned`,该次调用回 `isError`,server 不挂)。
1522
1523
  - **默认 client 是惰性构造的**:`client` 不给时第一次 `tools/call` 才走 `createAnthropicClient()`(与引擎默认同款)—— 纯工具 server 不需要 API key 在场。
1524
+ - **`approval: 'required'` 的工具默认不暴露**(2026-11-07):MCP 没有 HITL 挂起通道,反向桥直接 `tool.run` —— 暴露出去等于绕过人工审批。要暴露请显式设 `exposeApprovalRequiredTools: true`,并理解「MCP 客户端即审批人」;预算类旋钮(`maxTotalTokens` / `maxCostUsd` / `priceOverrides` / `maxToolResultChars` / `traceContent`)会透传给 `ToolRunContext`,否则子 agent 类工具在桥内不受预算约束。
1523
1525
  - **想看一个真用它干活的例子**:`examples/observability-mcp/` 把 `buildRunReport` / `diffTraces` 包成两个只读工具(`report_trace` / `diff_traces`)暴露给任意 MCP 宿主,让 agent 自己查「我上一轮慢在哪」;还带一条**实边界**(工具参数由模型给 ⇒ 只读 trace 根内的文件,realpath 比前缀),以及一条端到端的验收脚本(起真 server ⇐ 出厂连接器 + `mcpTools`)。
1524
1526
 
1525
1527
  ```ts
@@ -1555,6 +1557,12 @@ console.log(mcp.url); // http://127.0.0.1:8787/mcp
1555
1557
  | `traceLimits` | 每次 `tools/call` 那棵 trace 的事件数闸(与引擎 `traceLimits` 同款:超限停记 + run 根留 `trace.truncated` 簿记;缺省 = 不限;坏值构造期抛 TypeError) |
1556
1558
  | `maxEventChars` | 事件正文截断上限(与引擎 `maxEventChars` 同款;`false` = 不截断;缺省 = 引擎缺省) |
1557
1559
  | `toolTimeoutMs` | 单次 `tools/call` 的工具执行超时(毫秒),语义与引擎 `toolTimeoutMs` 同款;非正数 / 不设 = 不限 |
1560
+ | `exposeApprovalRequiredTools` | 是否把 `approval: 'required'` 的工具也暴露出去;**缺省 false**(MCP 没有 HITL 挂起通道,暴露 = 绕过人工审批)。显式打开即表示「MCP 客户端就是审批人」 |
1561
+ | `maxTotalTokens` | 单次 `tools/call` 的累计 token 上限(透传 `ToolRunContext.maxTotalTokens`) |
1562
+ | `maxCostUsd` | 单次 `tools/call` 的累计成本上限(透传 `ToolRunContext.maxCostUsd`) |
1563
+ | `priceOverrides` | 价格覆盖表(透传 `ToolRunContext.priceOverrides`,否则子循环里的自定义模型算不出成本) |
1564
+ | `maxToolResultChars` | 单条工具结果回模型的字符上限(透传 `ToolRunContext.maxToolResultChars`;`false` = 不截断) |
1565
+ | `traceContent` | assistant 文本记录口径(透传 `ToolRunContext.traceContent`;`'full'` = 记 `output.text`) |
1558
1566
  | `auth` | http 侧鉴权钩子:在读 body 之前调用,抛错即 401(原文只进服务端日志);stdio 侧信任父进程、本项不生效 |
1559
1567
  | `name` | `serverInfo.name`(握手回给客户端),缺省 `'agentia'` |
1560
1568
 
@@ -103,6 +103,9 @@ export class Container {
103
103
  // `container: []`,不许引内部任何模块),为几行逻辑破叶子边界不值得。
104
104
  // 逃逸口:确实要注入 Promise **本体**,包一层即可(`useValue: { promise }`)。
105
105
  if (value instanceof Promise) {
106
+ // 抛类型错前先消费 rejection(2026-11-07 深评):一个会 reject 的 async 工厂此前会
107
+ // 留下 unhandledRejection,Node ≥15 默认终止宿主进程 —— 装配错误已经报了,不该再死一次。
108
+ value.catch(() => undefined);
106
109
  throw new TypeError(`provider "${token}" 解析出的是 Promise:容器同步解析,它会被原样缓存成「值」,` +
107
110
  '下游拿到 Promise 而非 await 过的结果(首次属性访问全 undefined、且零报错)。' +
108
111
  '异步初始化请在装配前 await 好再用 useValue 注入;确实要注入 Promise 本体,包一层:useValue: { promise }');
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/container/container.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"container.js","sourceRoot":"","sources":["../../src/container/container.ts"],"names":[],"mappings":"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"}
@@ -13,7 +13,12 @@ export function combineSignals(...signals) {
13
13
  // 去重:同一个源被传两次时,下面的 listeners Map 按源建(后者覆盖前者),
14
14
  // 却对同一源挂了两个同名监听 ⇒ 摘除只摘掉一个,另一个(连闭包)滞留在宿主级
15
15
  // 长寿 signal 上 —— 正是这段代码要防的累积。Set 保序,行为不变。
16
- const real = [...new Set(signals.filter((s) => s !== undefined))];
16
+ // 结构守卫(2026-11-07 深评):持久化 store 反序列化回来的 signal 可能是 `{}`(旧记录),
17
+ // 只判 undefined 会在 `s.addEventListener` 处抛 TypeError。不是合法 AbortSignal 就当没给。
18
+ const real = [
19
+ ...new Set(signals.filter((s) => s !== undefined &&
20
+ typeof s.addEventListener === 'function')),
21
+ ];
17
22
  // 单源直接复用,避免多包一层 listener
18
23
  if (real.length === 1)
19
24
  return real[0];
@@ -1 +1 @@
1
- {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../src/core/abort.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gEAAgE;AAChE,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA2B,CAAC;AAExD,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,GAAG,OAAuC;IACvE,8CAA8C;IAC9C,yCAAyC;IACzC,0CAA0C;IAC1C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAoB,EAAE,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC;IACpF,yBAAyB;IACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,+CAA+C;QAC/C,gDAAgD;QAChD,iDAAiD;QACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;QACrD,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS;gBAAE,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClE,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,GAAS,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACzC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AAC3B,CAAC"}
1
+ {"version":3,"file":"abort.js","sourceRoot":"","sources":["../../src/core/abort.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,gEAAgE;AAChE,MAAM,QAAQ,GAAG,IAAI,OAAO,EAA2B,CAAC;AAExD,gEAAgE;AAChE,MAAM,UAAU,cAAc,CAAC,GAAG,OAAuC;IACvE,8CAA8C;IAC9C,yCAAyC;IACzC,0CAA0C;IAC1C,8DAA8D;IAC9D,2EAA2E;IAC3E,MAAM,IAAI,GAAG;QACX,GAAG,IAAI,GAAG,CACR,OAAO,CAAC,MAAM,CACZ,CAAC,CAAC,EAAoB,EAAE,CACtB,CAAC,KAAK,SAAS;YACf,OAAQ,CAAoC,CAAC,gBAAgB,KAAK,UAAU,CAC/E,CACF;KACF,CAAC;IACF,yBAAyB;IACzB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAEtC,MAAM,EAAE,GAAG,IAAI,eAAe,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;YACd,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACnB,MAAM;QACR,CAAC;IACH,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,+CAA+C;QAC/C,gDAAgD;QAChD,iDAAiD;QACjD,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;QACrD,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,SAAS;gBAAE,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YAClE,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,GAAS,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACzC,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;AAC3B,CAAC"}
package/dist/core/json.js CHANGED
@@ -11,6 +11,10 @@ export function stringifySafe(x) {
11
11
  }
12
12
  /** 截断到上限字符、超长加省略标记 `…(+N)`。trace 展示(engine/loop)与 replay 共用同一格式。 */
13
13
  export function truncateWithMark(s, n) {
14
+ // n <= 0 = 截到零长度(`maxEventChars` / `maxToolResultChars` 的 limits 表口径)。
15
+ // 此前 0 会走 `slice(0,0) + 省略标记`,回给模型的是 `…(+N)` 而不是空串。
16
+ if (n <= 0)
17
+ return '';
14
18
  return s.length > n ? `${s.slice(0, n)}…(+${s.length - n})` : s;
15
19
  }
16
20
  //# sourceMappingURL=json.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,CAAS;IACnD,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,gBAAgB,CAAC,CAAS,EAAE,CAAS;IACnD,uEAAuE;IACvE,oDAAoD;IACpD,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
@@ -164,8 +164,8 @@ export declare const LIMIT_SEMANTICS: readonly [{
164
164
  readonly unit: 'chars';
165
165
  readonly zero: 'disabled';
166
166
  readonly zeroClause: '0 = 截到零长度;false = 不截断';
167
- readonly badValue: 'none';
168
- readonly note: '两个「关掉」的写法语义不同:`false` 才是「不截断」(调试期看全文),`0` 是把正文截成空串。⚠️ 靠 `!= null` 判定透传(真值判定会吃掉 `false`)。';
167
+ readonly badValue: 'throws';
168
+ readonly note: '两个「关掉」的写法语义不同:`false` 才是「不截断」(调试期看全文),`0` 是把正文截成空串(`truncateWithMark` 对 n<=0 返回空串)。⚠️ 靠 `!= null` 判定透传(真值判定会吃掉 `false`)。NaN / 负数 / 小数在第一次模型调用前拒(2026-11-07 深评补登:此前 NaN 让 `s.length > NaN` 恒假 ⇒ 静默不截断)。';
169
169
  }, {
170
170
  readonly knob: 'maxToolResultChars';
171
171
  readonly where: 'engine/tool-events.ts(toolResultBlock / validateMaxToolResultChars)';
@@ -219,9 +219,9 @@ export declare const LIMIT_SEMANTICS: readonly [{
219
219
  readonly where: 'integrations/metrics.ts';
220
220
  readonly unit: 'ms';
221
221
  readonly zero: 'immediate';
222
- readonly zeroClause: '0 = 立即导出';
223
- readonly badValue: 'none';
224
- readonly note: '⚠️ **同名反义**:`Scheduler.every` 的 `intervalMs: 0` 是**配置错误**(抛错),这里却是「关掉定时器、每次累加后立即导出」。两个同名旋钮两种读法 —— 改任何一个之前先看这张表。';
222
+ readonly zeroClause: '0 = 立即导出,负数同 0';
223
+ readonly badValue: 'throws';
224
+ readonly note: '⚠️ **同名反义**:`Scheduler.every` 的 `intervalMs: 0` 是**配置错误**(抛错),这里却是「关掉定时器、每次累加后立即导出」。两个同名旋钮两种读法 —— 改任何一个之前先看这张表。NaN / Infinity / 超 2^31-1ms 在构造期拒(2026-11-07 深评:NaN 此前让定时器与立即导出**同时**不成立 ⇒ 永远不导出,且零信号)。**负数读同 0**(2026-11-09 深评 P3-4:代码判的是 `<= 0`,此前这条读法只在代码里、没进表 ⇒ 同一形状在 `Scheduler.every.intervalMs` 上却是抛错;现在两种口径都写明,负数由 `metrics.test.ts` 钉住)。';
225
225
  }, {
226
226
  readonly knob: 'RetryOptions.baseDelayMs';
227
227
  readonly where: 'engine/retry.ts(resolveRetry)';
@@ -129,8 +129,8 @@ export const LIMIT_SEMANTICS = [
129
129
  unit: 'chars',
130
130
  zero: 'disabled',
131
131
  zeroClause: '0 = 截到零长度;false = 不截断',
132
- badValue: 'none',
133
- note: '两个「关掉」的写法语义不同:`false` 才是「不截断」(调试期看全文),`0` 是把正文截成空串。⚠️ 靠 `!= null` 判定透传(真值判定会吃掉 `false`)。',
132
+ badValue: 'throws',
133
+ note: '两个「关掉」的写法语义不同:`false` 才是「不截断」(调试期看全文),`0` 是把正文截成空串(`truncateWithMark` 对 n<=0 返回空串)。⚠️ 靠 `!= null` 判定透传(真值判定会吃掉 `false`)。NaN / 负数 / 小数在第一次模型调用前拒(2026-11-07 深评补登:此前 NaN 让 `s.length > NaN` 恒假 ⇒ 静默不截断)。',
134
134
  },
135
135
  {
136
136
  knob: 'maxToolResultChars',
@@ -192,9 +192,9 @@ export const LIMIT_SEMANTICS = [
192
192
  where: 'integrations/metrics.ts',
193
193
  unit: 'ms',
194
194
  zero: 'immediate',
195
- zeroClause: '0 = 立即导出',
196
- badValue: 'none',
197
- note: '⚠️ **同名反义**:`Scheduler.every` 的 `intervalMs: 0` 是**配置错误**(抛错),这里却是「关掉定时器、每次累加后立即导出」。两个同名旋钮两种读法 —— 改任何一个之前先看这张表。',
195
+ zeroClause: '0 = 立即导出,负数同 0',
196
+ badValue: 'throws',
197
+ note: '⚠️ **同名反义**:`Scheduler.every` 的 `intervalMs: 0` 是**配置错误**(抛错),这里却是「关掉定时器、每次累加后立即导出」。两个同名旋钮两种读法 —— 改任何一个之前先看这张表。NaN / Infinity / 超 2^31-1ms 在构造期拒(2026-11-07 深评:NaN 此前让定时器与立即导出**同时**不成立 ⇒ 永远不导出,且零信号)。**负数读同 0**(2026-11-09 深评 P3-4:代码判的是 `<= 0`,此前这条读法只在代码里、没进表 ⇒ 同一形状在 `Scheduler.every.intervalMs` 上却是抛错;现在两种口径都写明,负数由 `metrics.test.ts` 钉住)。',
198
198
  },
199
199
  {
200
200
  knob: 'RetryOptions.baseDelayMs',
@@ -1 +1 @@
1
- {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/core/limits.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"limits.js","sourceRoot":"","sources":["../../src/core/limits.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1 @@
1
- /**
2
- * Agentia —— SSE 逐行分帧(**单源**)。
3
- *
4
- * Anthropic 与 OpenAI 兼容端点的事件流都是「一行一条 `data:`」(不需要处理跨行
5
- * payload),两个适配器此前各写了一份**逐字相同**的 `sseLines`。合并的意义不止整洁:
6
- * `finally` 里的 `reader.cancel()` 是「提前 break(abort / `[DONE]`)时底层流仍被回收」
7
- * 的唯一保证 —— 这份代码在两处各存一份,漏改一处就是一处泄漏(读锁不释放,连接挂着)。
8
- *
9
- * 只做分帧,不解释协议:空行照常 yield,是不是 `data:` 前缀、要不要认 `[DONE]`
10
- * 全由调用方判。
11
- *
12
- * core 是叶子层:本文件零 import(只用全局的 `ReadableStream` / `TextDecoder`)。
13
- */
14
1
  export declare function sseLines(body: ReadableStream<Uint8Array>): AsyncGenerator<string>;
package/dist/core/sse.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { frameLimitText, MAX_FRAME_CHARS } from './line-framing.js';
1
2
  /**
2
3
  * Agentia —— SSE 逐行分帧(**单源**)。
3
4
  *
@@ -9,8 +10,18 @@
9
10
  * 只做分帧,不解释协议:空行照常 yield,是不是 `data:` 前缀、要不要认 `[DONE]`
10
11
  * 全由调用方判。
11
12
  *
12
- * core 是叶子层:本文件零 import(只用全局的 `ReadableStream` / `TextDecoder`)。
13
+ * core 是叶子层:只 import 同层的 `line-framing.js`(纯常量),不依赖任何上层。
13
14
  */
15
+ /**
16
+ * 「单帧超限」的错误(归入**上游故障**:server 一档可重试,与适配器的流内错误同口径)。
17
+ *
18
+ * 单源:判据落在**一条切出来的帧**上(见下方,2026-11-09 深评 P3-2)。
19
+ */
20
+ function frameTooLarge() {
21
+ const e = new Error(`SSE 单行超过分帧上限(${frameLimitText()})—— 对端持续发送不带换行的数据,已中止`);
22
+ e.status = 500;
23
+ return e;
24
+ }
14
25
  export async function* sseLines(body) {
15
26
  const reader = body.getReader();
16
27
  const decoder = new TextDecoder();
@@ -21,13 +32,28 @@ export async function* sseLines(body) {
21
32
  if (done)
22
33
  break;
23
34
  buf += decoder.decode(value, { stream: true });
35
+ // 单条 `data:` 行无上限 = 坏 server 持续吐不带换行的字节就能把进程 OOM
36
+ // (2026-11-07 深评)。与 MCP 两条桥共用同一个 8M 码元硬上限。
37
+ //
38
+ // ⚠️ 判据必须是**切出来的那一行**,不是整个 `buf`(2026-11-09 深评 P3-2):此前先判
39
+ // `buf.length` 再切分,一个 9MB 但每行都很短的 chunk 会被误判成「单行超限」(假阳性,
40
+ // 且报的文案与事实相反)。先切后判同时也保住了原意 —— 一次 read 就把整条 9MB 行连
41
+ // 换行一起送来的情形,下面那条 `line.length` 照样拦得住。
24
42
  let idx = buf.indexOf('\n');
25
43
  while (idx >= 0) {
26
- yield buf.slice(0, idx).replace(/\r$/, '');
44
+ const line = buf.slice(0, idx);
45
+ if (line.length > MAX_FRAME_CHARS)
46
+ throw frameTooLarge();
47
+ yield line.replace(/\r$/, '');
27
48
  buf = buf.slice(idx + 1);
28
49
  idx = buf.indexOf('\n');
29
50
  }
51
+ // 切完之后剩下的,才是「还没等到换行」的那一条(跨 read 累积的那一半)
52
+ if (buf.length > MAX_FRAME_CHARS)
53
+ throw frameTooLarge();
30
54
  }
55
+ // 冲掉 TextDecoder 的尾字节(流若在码点中间结束,此前会静默丢掉最后半个字符)。
56
+ buf += decoder.decode();
31
57
  // 末尾没有换行收尾的残行也要交出去(不是所有端点都补 \n)
32
58
  if (buf)
33
59
  yield buf.replace(/\r$/, '');
@@ -1 +1 @@
1
- {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/core/sse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAgC;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;gBAChB,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC3C,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACzB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QACD,gCAAgC;QAChC,IAAI,GAAG;YAAE,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,yCAAyC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"sse.js","sourceRoot":"","sources":["../../src/core/sse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpE;;;;;;;;;;;;GAYG;AACH;;;;GAIG;AACH,SAAS,aAAa;IACpB,MAAM,CAAC,GAAG,IAAI,KAAK,CACjB,gBAAgB,cAAc,EAAE,uBAAuB,CACxD,CAAC;IACD,CAAyB,CAAC,MAAM,GAAG,GAAG,CAAC;IACxC,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAgC;IAC9D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5C,IAAI,IAAI;gBAAE,MAAM;YAChB,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAC/C,iDAAiD;YACjD,2CAA2C;YAC3C,EAAE;YACF,0DAA0D;YAC1D,yDAAyD;YACzD,kDAAkD;YAClD,sCAAsC;YACtC,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC5B,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC;gBAChB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;oBAAE,MAAM,aAAa,EAAE,CAAC;gBACzD,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC9B,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBACzB,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;YACD,wCAAwC;YACxC,IAAI,GAAG,CAAC,MAAM,GAAG,eAAe;gBAAE,MAAM,aAAa,EAAE,CAAC;QAC1D,CAAC;QACD,gDAAgD;QAChD,GAAG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACxB,gCAAgC;QAChC,IAAI,GAAG;YAAE,MAAM,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;YAAS,CAAC;QACT,yCAAyC;QACzC,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,aAAa;QACf,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -121,6 +121,14 @@ export declare function isTimeoutError(e: unknown): boolean;
121
121
  * SSE 心跳、metrics 刷盘)成立,对**「等待的终点」**不成立:那正是调用方在等的东西。
122
122
  */
123
123
  export declare function withTimeout<T>(p: Promise<T>, timeoutMs: number): Promise<T | typeof TIMED_OUT>;
124
+ /**
125
+ * 上游 `Retry-After` → 毫秒(**夹到可兑现区间**;解析不了返回 undefined)。
126
+ *
127
+ * 2026-11-07 深评:引擎层重试此前只看指数退避,client 层读到 header 却在最后一次失败时
128
+ * 丢掉 —— 429 + `Retry-After: 60` 会在限流窗口里热重试。适配器把结果挂到错误上,
129
+ * 引擎用 `max(backoff, retryAfterMs)`。
130
+ */
131
+ export declare function retryAfterMsOf(value: string | null | undefined): number | undefined;
124
132
  /**
125
133
  * 可被 signal 中断的 sleep(**单源**)。
126
134
  *
@@ -66,7 +66,7 @@ export function assertTimerDelay(ms, where) {
66
66
  export function clampTimerDelay(ms) {
67
67
  if (!(ms > 0))
68
68
  return 0; // 含 NaN / 负数:调用点读 0 即「不睡」(见 limits 表)
69
- return ms > MAX_TIMER_DELAY_MS ? MAX_TIMER_DELAY_MS : ms;
69
+ return Math.min(ms, MAX_TIMER_DELAY_MS);
70
70
  }
71
71
  /**
72
72
  * 超时错误(`code === 'timeout'`)。
@@ -192,6 +192,24 @@ export async function withTimeout(p, timeoutMs) {
192
192
  clearTimeout(timer);
193
193
  }
194
194
  }
195
+ /**
196
+ * 上游 `Retry-After` → 毫秒(**夹到可兑现区间**;解析不了返回 undefined)。
197
+ *
198
+ * 2026-11-07 深评:引擎层重试此前只看指数退避,client 层读到 header 却在最后一次失败时
199
+ * 丢掉 —— 429 + `Retry-After: 60` 会在限流窗口里热重试。适配器把结果挂到错误上,
200
+ * 引擎用 `max(backoff, retryAfterMs)`。
201
+ */
202
+ export function retryAfterMsOf(value) {
203
+ if (!value)
204
+ return undefined;
205
+ const secs = Number(value);
206
+ if (Number.isFinite(secs))
207
+ return clampTimerDelay(Math.max(0, Math.round(secs * 1000)));
208
+ const at = Date.parse(value);
209
+ if (Number.isFinite(at))
210
+ return clampTimerDelay(Math.max(0, at - Date.now()));
211
+ return undefined;
212
+ }
195
213
  /**
196
214
  * 可被 signal 中断的 sleep(**单源**)。
197
215
  *
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/core/timeout.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/core/timeout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,sCAAsC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAErD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,aAAa,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,EAAU,EAAE,KAAa;IACxD,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;QACrB,MAAM,IAAI,UAAU,CAClB,GAAG,KAAK,8BAA8B;YACpC,6CAA6C,CAChD,CAAC;IACJ,CAAC;IACD,IAAI,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,GAAG,KAAK,oBAAoB,kBAAkB,oBAAoB,EAAE,MAAM;YACxE,wDAAwD;YACxD,gCAAgC,CACnC,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,EAAU;IACxC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC,CAAC,sCAAsC;IAC/D,OAAO,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,kBAAkB,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,GAAc,SAAS,CAAC;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,OAAO,GAAG,MAAM;IACzC,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,cAAc,CAAC,CAAU;IACvC,IAAI,CAAC,YAAY,YAAY;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,CAAC,GAAG,CAAuC,CAAC;IAClD,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC;AAC3D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,CAAa,EACb,SAAiB;IAEjB,sDAAsD;IACtD,wDAAwD;IACxD,yCAAyC;IACzC,kEAAkE;IAClE,0CAA0C;IAC1C,gBAAgB,CACd,SAAS,EACT,oDAAoD,YAAY,CAAC,gBAAgB,CAAC,GAAG,CACtF,CAAC;IACF,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,qDAAqD;IACrD,2DAA2D;IAC3D,iBAAiB;IACjB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IACpC,gDAAgD;IAChD,8CAA8C;IAC9C,qDAAqD;IACrD,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CACpB,CAAC,CAAC,EAAE,EAAE;QACJ,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC;IACX,CAAC,EACD,CAAC,CAAC,EAAE,EAAE;QACJ,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC9B,MAAM,CAAC,CAAC;IACV,CAAC,CACF,CAAC;IACF,IAAI,KAAiC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAC7B,OAAO;YACP,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,EAAE;gBACxC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC,CAAC;gBACxD,mDAAmD;gBACnD,0CAA0C;YAC5C,CAAC,CAAC;SACH,CAAC,CAAC;QACH,oCAAoC;QACpC,IAAI,GAAG,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,SAAS,GAAG,SAAS,IAAI,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC;IAC9D,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,KAAgC;IAC7D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QAAE,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,UAAU,kBAAkB,CAChC,EAAU,EACV,MAAoB,EACpB,YAAY,GAAG,MAAM;IAErB,mEAAmE;IACnE,4DAA4D;IAC5D,0CAA0C;IAC1C,6CAA6C;IAC7C,gBAAgB,CACd,EAAE,EACF,gCAAgC,YAAY,CAAC,uBAAuB,CAAC,GAAG,CACzE,CAAC;IACF,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,0CAA0C;QAC1C,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,SAAS,OAAO;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,UAAyB;IAClE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAChC,0EAA0E;QAC1E,+DAA+D;QAC/D,iDAAiD;QACjD,mDAAmD;QACnD,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACxF,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAClC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9E,cAAc;IAChB,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC"}
@@ -51,6 +51,13 @@ export declare const TOOL_OUTPUT_EVENT = "tool.output";
51
51
  * **替身值**(不是读数)—— 成本估算会把它读成「真的花了 0」,`maxCostUsd` 因此静默失效。
52
52
  */
53
53
  export declare const USAGE_MISSING_EVENT = "usage.missing";
54
+ /**
55
+ * 失败尝试的**部分 usage** 事件(2026-11-07 深评):模型已经报过 input tokens、随后
56
+ * 流被截断/超时时,这次尝试的账不会进 `recordTurnUsage`(它只处理成功响应)。
57
+ * 适配器把已累积的 usage 挂在错误上,引擎写进该 turn span 并记这条事件 ——
58
+ * 否则 `maxCostUsd` / `maxTotalTokens` 会系统性少算。
59
+ */
60
+ export declare const USAGE_PARTIAL_EVENT = "usage.partial";
54
61
  /**
55
62
  * 「上下文策略在本回合开始前**真的压缩了**历史」事件名(body 带 `{ from, to, model }`)。
56
63
  *
@@ -28,6 +28,13 @@ export const TOOL_OUTPUT_EVENT = 'tool.output';
28
28
  * **替身值**(不是读数)—— 成本估算会把它读成「真的花了 0」,`maxCostUsd` 因此静默失效。
29
29
  */
30
30
  export const USAGE_MISSING_EVENT = 'usage.missing';
31
+ /**
32
+ * 失败尝试的**部分 usage** 事件(2026-11-07 深评):模型已经报过 input tokens、随后
33
+ * 流被截断/超时时,这次尝试的账不会进 `recordTurnUsage`(它只处理成功响应)。
34
+ * 适配器把已累积的 usage 挂在错误上,引擎写进该 turn span 并记这条事件 ——
35
+ * 否则 `maxCostUsd` / `maxTotalTokens` 会系统性少算。
36
+ */
37
+ export const USAGE_PARTIAL_EVENT = 'usage.partial';
31
38
  /**
32
39
  * 「上下文策略在本回合开始前**真的压缩了**历史」事件名(body 带 `{ from, to, model }`)。
33
40
  *
@@ -1 +1 @@
1
- {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/core/trace.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA+BH;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,YAAY,CAAC;AAC7C,MAAM,CAAC,MAAM,iBAAiB,GAAG,aAAa,CAAC;AAE/C;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAEnD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;AAgDrD,sEAAsE;AACtE,MAAM,cAAc,GAAG,6DAA6D,CAAC;AAErF;;;;;;;;GAQG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAgC;IAC/D,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1D,IAAI,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,WAAW,CAAC,EAAU;IACpC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,EAAU;IACnC,OAAO,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,MAAc;IAC/D,OAAO,MAAM,WAAW,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;AAC/D,CAAC;AAyCD,uEAAuE;AACvE,MAAM,UAAU,QAAQ,CAAC,MAAyB,EAAE,OAAc;IAChE,MAAM,GAAG,GAAU;QACjB,WAAW,EAAE,CAAC,MAAM,EAAE,WAAW,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,WAAW;QAC7D,YAAY,EAAE,CAAC,MAAM,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,YAAY;QAChE,eAAe,EAAE,CAAC,MAAM,EAAE,eAAe,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,eAAe;QACzE,mBAAmB,EAAE,CAAC,MAAM,EAAE,mBAAmB,IAAI,CAAC,CAAC,GAAG,OAAO,CAAC,mBAAmB;KACtF,CAAC;IACF,IAAI,MAAM,EAAE,YAAY,IAAI,IAAI,IAAI,OAAO,CAAC,YAAY,IAAI,IAAI,EAAE,CAAC;QACjE,GAAG,CAAC,YAAY;YACd,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC;IACxF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAkBD;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAY,EAAE,KAAY;IACpD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,UAAU,CAAC,CAAC;IACpE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAU;IACzC,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACxD,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,UAAU,CAAC;IAC9D,OAAO,YAAY,CAAC;AACtB,CAAC;AAuDD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAkD,EAClD,MAAmD;IAEnD,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC;IAC1B,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,CAAC,CAAC;QACX,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,CAAC,CAAC;QACZ,CAAC;QAAC,MAAM,CAAC;YACP,QAAQ;QACV,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"trace.js","sourceRoot":"","sources":["../../src/core/trace.ts"],"names":[],"mappings":"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"}