@namzu/sdk 46.0.0 → 48.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (768) hide show
  1. package/CHANGELOG.md +351 -8
  2. package/README.md +7 -8
  3. package/dist/advisory/history.d.ts.map +1 -1
  4. package/dist/advisory/history.js +21 -1
  5. package/dist/advisory/history.js.map +1 -1
  6. package/dist/advisory/index.d.ts +1 -1
  7. package/dist/advisory/index.d.ts.map +1 -1
  8. package/dist/advisory/index.js +1 -1
  9. package/dist/advisory/index.js.map +1 -1
  10. package/dist/advisory/registry.d.ts +17 -0
  11. package/dist/advisory/registry.d.ts.map +1 -1
  12. package/dist/advisory/registry.js +26 -0
  13. package/dist/advisory/registry.js.map +1 -1
  14. package/dist/agents/PipelineAgent.d.ts +2 -46
  15. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  16. package/dist/agents/PipelineAgent.js +2 -242
  17. package/dist/agents/PipelineAgent.js.map +1 -1
  18. package/dist/agents/QueryAgent.d.ts +21 -0
  19. package/dist/agents/QueryAgent.d.ts.map +1 -0
  20. package/dist/agents/QueryAgent.js +214 -0
  21. package/dist/agents/QueryAgent.js.map +1 -0
  22. package/dist/agents/ReactiveAgent.d.ts +4 -16
  23. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  24. package/dist/agents/ReactiveAgent.js +4 -183
  25. package/dist/agents/ReactiveAgent.js.map +1 -1
  26. package/dist/agents/RouterAgent.d.ts +2 -20
  27. package/dist/agents/RouterAgent.d.ts.map +1 -1
  28. package/dist/agents/RouterAgent.js +2 -266
  29. package/dist/agents/RouterAgent.js.map +1 -1
  30. package/dist/agents/SupervisorAgent.d.ts +3 -43
  31. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  32. package/dist/agents/SupervisorAgent.js +3 -418
  33. package/dist/agents/SupervisorAgent.js.map +1 -1
  34. package/dist/agents/defineAgent.d.ts +2 -1
  35. package/dist/agents/defineAgent.d.ts.map +1 -1
  36. package/dist/agents/defineAgent.js +6 -1
  37. package/dist/agents/defineAgent.js.map +1 -1
  38. package/dist/agents/examples/PipelineAgent.d.ts +46 -0
  39. package/dist/agents/examples/PipelineAgent.d.ts.map +1 -0
  40. package/dist/agents/examples/PipelineAgent.js +242 -0
  41. package/dist/agents/examples/PipelineAgent.js.map +1 -0
  42. package/dist/agents/examples/RouterAgent.d.ts +22 -0
  43. package/dist/agents/examples/RouterAgent.d.ts.map +1 -0
  44. package/dist/agents/examples/RouterAgent.js +268 -0
  45. package/dist/agents/examples/RouterAgent.js.map +1 -0
  46. package/dist/agents/examples/SupervisorAgent.d.ts +45 -0
  47. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -0
  48. package/dist/agents/examples/SupervisorAgent.js +406 -0
  49. package/dist/agents/examples/SupervisorAgent.js.map +1 -0
  50. package/dist/agents/explore.d.ts +6 -3
  51. package/dist/agents/explore.d.ts.map +1 -1
  52. package/dist/agents/explore.js +6 -3
  53. package/dist/agents/explore.js.map +1 -1
  54. package/dist/agents/forward-options.d.ts +11 -0
  55. package/dist/agents/forward-options.d.ts.map +1 -0
  56. package/dist/agents/forward-options.js +15 -0
  57. package/dist/agents/forward-options.js.map +1 -0
  58. package/dist/agents/index.d.ts +1 -0
  59. package/dist/agents/index.d.ts.map +1 -1
  60. package/dist/agents/index.js +2 -0
  61. package/dist/agents/index.js.map +1 -1
  62. package/dist/agents/runAgent.d.ts +19 -8
  63. package/dist/agents/runAgent.d.ts.map +1 -1
  64. package/dist/agents/runAgent.js +99 -29
  65. package/dist/agents/runAgent.js.map +1 -1
  66. package/dist/authorization/command-line.d.ts +2 -0
  67. package/dist/authorization/command-line.d.ts.map +1 -1
  68. package/dist/authorization/command-line.js +2 -2
  69. package/dist/authorization/command-line.js.map +1 -1
  70. package/dist/authorization/gate.d.ts +8 -0
  71. package/dist/authorization/gate.d.ts.map +1 -1
  72. package/dist/authorization/gate.js +12 -1
  73. package/dist/authorization/gate.js.map +1 -1
  74. package/dist/authorization/program.d.ts +151 -0
  75. package/dist/authorization/program.d.ts.map +1 -0
  76. package/dist/authorization/program.js +713 -0
  77. package/dist/authorization/program.js.map +1 -0
  78. package/dist/authorization/reexec-wrapper.d.ts +106 -0
  79. package/dist/authorization/reexec-wrapper.d.ts.map +1 -0
  80. package/dist/authorization/reexec-wrapper.js +532 -0
  81. package/dist/authorization/reexec-wrapper.js.map +1 -0
  82. package/dist/authorization/rules.d.ts +9 -0
  83. package/dist/authorization/rules.d.ts.map +1 -1
  84. package/dist/authorization/rules.js +8 -1
  85. package/dist/authorization/rules.js.map +1 -1
  86. package/dist/authorization/shell-lexer.d.ts +19 -4
  87. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  88. package/dist/authorization/shell-lexer.js +91 -65
  89. package/dist/authorization/shell-lexer.js.map +1 -1
  90. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  91. package/dist/bridge/sse/mapper.js +6 -0
  92. package/dist/bridge/sse/mapper.js.map +1 -1
  93. package/dist/capabilities/index.d.ts +54 -0
  94. package/dist/capabilities/index.d.ts.map +1 -0
  95. package/dist/capabilities/index.js +92 -0
  96. package/dist/capabilities/index.js.map +1 -0
  97. package/dist/config/registry.d.ts +2 -1
  98. package/dist/config/registry.d.ts.map +1 -1
  99. package/dist/config/registry.js +3 -2
  100. package/dist/config/registry.js.map +1 -1
  101. package/dist/connector/index.d.ts +4 -4
  102. package/dist/connector/index.d.ts.map +1 -1
  103. package/dist/connector/index.js +3 -3
  104. package/dist/connector/index.js.map +1 -1
  105. package/dist/connector/mcp/adapter.d.ts +16 -1
  106. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  107. package/dist/connector/mcp/adapter.js +71 -4
  108. package/dist/connector/mcp/adapter.js.map +1 -1
  109. package/dist/connector/mcp/client.d.ts +32 -4
  110. package/dist/connector/mcp/client.d.ts.map +1 -1
  111. package/dist/connector/mcp/client.js +383 -5
  112. package/dist/connector/mcp/client.js.map +1 -1
  113. package/dist/connector/mcp/discovery.d.ts +24 -1
  114. package/dist/connector/mcp/discovery.d.ts.map +1 -1
  115. package/dist/connector/mcp/discovery.js +44 -0
  116. package/dist/connector/mcp/discovery.js.map +1 -1
  117. package/dist/connector/mcp/era.d.ts.map +1 -1
  118. package/dist/connector/mcp/era.js +7 -0
  119. package/dist/connector/mcp/era.js.map +1 -1
  120. package/dist/connector/mcp/index.d.ts +2 -0
  121. package/dist/connector/mcp/index.d.ts.map +1 -1
  122. package/dist/connector/mcp/index.js +11 -0
  123. package/dist/connector/mcp/index.js.map +1 -1
  124. package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
  125. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
  126. package/dist/connector/mcp/mcp-toolset.js +399 -0
  127. package/dist/connector/mcp/mcp-toolset.js.map +1 -0
  128. package/dist/connector/mcp/streamable-http.d.ts +15 -0
  129. package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
  130. package/dist/connector/mcp/streamable-http.js +281 -6
  131. package/dist/connector/mcp/streamable-http.js.map +1 -1
  132. package/dist/connector/tools/index.d.ts +2 -2
  133. package/dist/connector/tools/index.d.ts.map +1 -1
  134. package/dist/connector/tools/index.js +1 -1
  135. package/dist/connector/tools/index.js.map +1 -1
  136. package/dist/connector/tools/router.d.ts +15 -13
  137. package/dist/connector/tools/router.d.ts.map +1 -1
  138. package/dist/connector/tools/router.js +30 -51
  139. package/dist/connector/tools/router.js.map +1 -1
  140. package/dist/contracts/a2a.d.ts +2 -2
  141. package/dist/directory/derive-supervisor.d.ts +2 -2
  142. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  143. package/dist/directory/derive-supervisor.js +6 -7
  144. package/dist/directory/derive-supervisor.js.map +1 -1
  145. package/dist/directory/derive.d.ts.map +1 -1
  146. package/dist/directory/derive.js +5 -5
  147. package/dist/directory/derive.js.map +1 -1
  148. package/dist/execution/code-runtime/types.d.ts +2 -2
  149. package/dist/execution/code-runtime/types.js +1 -1
  150. package/dist/invariants/index.d.ts +2 -1
  151. package/dist/invariants/index.d.ts.map +1 -1
  152. package/dist/invariants/index.js +3 -2
  153. package/dist/invariants/index.js.map +1 -1
  154. package/dist/manager/agent/lifecycle.d.ts +1 -0
  155. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  156. package/dist/manager/agent/lifecycle.js +146 -18
  157. package/dist/manager/agent/lifecycle.js.map +1 -1
  158. package/dist/manager/connector/environment.d.ts +6 -0
  159. package/dist/manager/connector/environment.d.ts.map +1 -1
  160. package/dist/manager/connector/environment.js +11 -4
  161. package/dist/manager/connector/environment.js.map +1 -1
  162. package/dist/manager/connector/index.d.ts +2 -2
  163. package/dist/manager/connector/index.d.ts.map +1 -1
  164. package/dist/manager/connector/index.js +2 -2
  165. package/dist/manager/connector/index.js.map +1 -1
  166. package/dist/manager/connector/tenant.d.ts +6 -0
  167. package/dist/manager/connector/tenant.d.ts.map +1 -1
  168. package/dist/manager/connector/tenant.js +11 -4
  169. package/dist/manager/connector/tenant.js.map +1 -1
  170. package/dist/manager/index.d.ts +2 -2
  171. package/dist/manager/index.d.ts.map +1 -1
  172. package/dist/manager/index.js +2 -2
  173. package/dist/manager/index.js.map +1 -1
  174. package/dist/manager/resident/initiative.d.ts +6 -6
  175. package/dist/manager/resident/learning-observation.d.ts +4 -4
  176. package/dist/manager/resident/learning.d.ts +36 -36
  177. package/dist/manager/resident/outbox.d.ts +4 -4
  178. package/dist/manager/session/attribution.d.ts +22 -0
  179. package/dist/manager/session/attribution.d.ts.map +1 -0
  180. package/dist/manager/session/attribution.js +64 -0
  181. package/dist/manager/session/attribution.js.map +1 -0
  182. package/dist/manager/session/turn-recorder.d.ts +14 -0
  183. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  184. package/dist/manager/session/turn-recorder.js +208 -55
  185. package/dist/manager/session/turn-recorder.js.map +1 -1
  186. package/dist/peers/address.d.ts +36 -0
  187. package/dist/peers/address.d.ts.map +1 -0
  188. package/dist/peers/address.js +52 -0
  189. package/dist/peers/address.js.map +1 -0
  190. package/dist/peers/client.d.ts +47 -0
  191. package/dist/peers/client.d.ts.map +1 -0
  192. package/dist/peers/client.js +132 -0
  193. package/dist/peers/client.js.map +1 -0
  194. package/dist/peers/dir.d.ts +88 -0
  195. package/dist/peers/dir.d.ts.map +1 -0
  196. package/dist/peers/dir.js +139 -0
  197. package/dist/peers/dir.js.map +1 -0
  198. package/dist/peers/endpoint.d.ts +144 -0
  199. package/dist/peers/endpoint.d.ts.map +1 -0
  200. package/dist/peers/endpoint.js +420 -0
  201. package/dist/peers/endpoint.js.map +1 -0
  202. package/dist/peers/envelope.d.ts +42 -0
  203. package/dist/peers/envelope.d.ts.map +1 -0
  204. package/dist/peers/envelope.js +110 -0
  205. package/dist/peers/envelope.js.map +1 -0
  206. package/dist/peers/index.d.ts +30 -0
  207. package/dist/peers/index.d.ts.map +1 -0
  208. package/dist/peers/index.js +22 -0
  209. package/dist/peers/index.js.map +1 -0
  210. package/dist/peers/protocol.d.ts +645 -0
  211. package/dist/peers/protocol.d.ts.map +1 -0
  212. package/dist/peers/protocol.js +151 -0
  213. package/dist/peers/protocol.js.map +1 -0
  214. package/dist/peers/record.d.ts +71 -0
  215. package/dist/peers/record.d.ts.map +1 -0
  216. package/dist/peers/record.js +45 -0
  217. package/dist/peers/record.js.map +1 -0
  218. package/dist/peers/registry.d.ts +54 -0
  219. package/dist/peers/registry.d.ts.map +1 -0
  220. package/dist/peers/registry.js +213 -0
  221. package/dist/peers/registry.js.map +1 -0
  222. package/dist/plugin/define.d.ts +24 -0
  223. package/dist/plugin/define.d.ts.map +1 -0
  224. package/dist/plugin/define.js +42 -0
  225. package/dist/plugin/define.js.map +1 -0
  226. package/dist/plugin/index.d.ts +2 -0
  227. package/dist/plugin/index.d.ts.map +1 -1
  228. package/dist/plugin/index.js +1 -0
  229. package/dist/plugin/index.js.map +1 -1
  230. package/dist/plugin/lifecycle.d.ts +27 -3
  231. package/dist/plugin/lifecycle.d.ts.map +1 -1
  232. package/dist/plugin/lifecycle.js +242 -92
  233. package/dist/plugin/lifecycle.js.map +1 -1
  234. package/dist/plugin/resolver.d.ts +2 -2
  235. package/dist/plugin/resolver.d.ts.map +1 -1
  236. package/dist/plugin/resolver.js.map +1 -1
  237. package/dist/plugin/shell-hook.d.ts.map +1 -1
  238. package/dist/plugin/shell-hook.js +17 -3
  239. package/dist/plugin/shell-hook.js.map +1 -1
  240. package/dist/probe/errors.d.ts +2 -1
  241. package/dist/probe/errors.d.ts.map +1 -1
  242. package/dist/probe/errors.js +3 -2
  243. package/dist/probe/errors.js.map +1 -1
  244. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  245. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  246. package/dist/prompt/coding-agent-doctrine.js +11 -6
  247. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  248. package/dist/prompt/contributions.d.ts +4 -1
  249. package/dist/prompt/contributions.d.ts.map +1 -1
  250. package/dist/prompt/contributions.js +7 -2
  251. package/dist/prompt/contributions.js.map +1 -1
  252. package/dist/prompt/index.d.ts +1 -1
  253. package/dist/prompt/index.d.ts.map +1 -1
  254. package/dist/prompt/index.js +1 -1
  255. package/dist/prompt/index.js.map +1 -1
  256. package/dist/provider/collect-chat-completion.d.ts +6 -1
  257. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  258. package/dist/provider/collect-chat-completion.js +88 -10
  259. package/dist/provider/collect-chat-completion.js.map +1 -1
  260. package/dist/provider/mock.d.ts.map +1 -1
  261. package/dist/provider/mock.js +23 -6
  262. package/dist/provider/mock.js.map +1 -1
  263. package/dist/provider/registry.d.ts +2 -1
  264. package/dist/provider/registry.d.ts.map +1 -1
  265. package/dist/provider/registry.js +3 -2
  266. package/dist/provider/registry.js.map +1 -1
  267. package/dist/provider/tool-call-framing.d.ts +164 -0
  268. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  269. package/dist/provider/tool-call-framing.js +163 -0
  270. package/dist/provider/tool-call-framing.js.map +1 -0
  271. package/dist/public-runtime.d.ts +24 -11
  272. package/dist/public-runtime.d.ts.map +1 -1
  273. package/dist/public-runtime.js +45 -9
  274. package/dist/public-runtime.js.map +1 -1
  275. package/dist/public-tools.d.ts +6 -4
  276. package/dist/public-tools.d.ts.map +1 -1
  277. package/dist/public-tools.js +8 -3
  278. package/dist/public-tools.js.map +1 -1
  279. package/dist/public-types.d.ts +13 -2
  280. package/dist/public-types.d.ts.map +1 -1
  281. package/dist/read-model/registry.d.ts +2 -1
  282. package/dist/read-model/registry.d.ts.map +1 -1
  283. package/dist/read-model/registry.js +3 -2
  284. package/dist/read-model/registry.js.map +1 -1
  285. package/dist/registry/ManagedRegistry.d.ts +30 -0
  286. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  287. package/dist/registry/ManagedRegistry.js +45 -6
  288. package/dist/registry/ManagedRegistry.js.map +1 -1
  289. package/dist/registry/collision.d.ts +57 -0
  290. package/dist/registry/collision.d.ts.map +1 -0
  291. package/dist/registry/collision.js +41 -0
  292. package/dist/registry/collision.js.map +1 -0
  293. package/dist/registry/command/index.d.ts +5 -3
  294. package/dist/registry/command/index.d.ts.map +1 -1
  295. package/dist/registry/command/index.js +6 -4
  296. package/dist/registry/command/index.js.map +1 -1
  297. package/dist/registry/index.d.ts +3 -4
  298. package/dist/registry/index.d.ts.map +1 -1
  299. package/dist/registry/index.js +2 -2
  300. package/dist/registry/index.js.map +1 -1
  301. package/dist/registry/plugin/index.d.ts.map +1 -1
  302. package/dist/registry/plugin/index.js +14 -1
  303. package/dist/registry/plugin/index.js.map +1 -1
  304. package/dist/registry/tool/callable.d.ts +7 -7
  305. package/dist/registry/tool/callable.d.ts.map +1 -1
  306. package/dist/registry/tool/callable.js +6 -7
  307. package/dist/registry/tool/callable.js.map +1 -1
  308. package/dist/registry/tool/execute.d.ts +14 -77
  309. package/dist/registry/tool/execute.d.ts.map +1 -1
  310. package/dist/registry/tool/execute.js +15 -727
  311. package/dist/registry/tool/execute.js.map +1 -1
  312. package/dist/registry/tool/portable.d.ts +25 -0
  313. package/dist/registry/tool/portable.d.ts.map +1 -1
  314. package/dist/registry/tool/portable.js +50 -0
  315. package/dist/registry/tool/portable.js.map +1 -1
  316. package/dist/registry/tool/presentation.d.ts +6 -5
  317. package/dist/registry/tool/presentation.d.ts.map +1 -1
  318. package/dist/registry/tool/presentation.js +3 -3
  319. package/dist/registry/tool/presentation.js.map +1 -1
  320. package/dist/runtime/bidi/session.d.ts +5 -4
  321. package/dist/runtime/bidi/session.d.ts.map +1 -1
  322. package/dist/runtime/bidi/session.js +18 -1
  323. package/dist/runtime/bidi/session.js.map +1 -1
  324. package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
  325. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  326. package/dist/runtime/query/executor/tool-call-admission.js +189 -5
  327. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  328. package/dist/runtime/query/executor.d.ts +33 -3
  329. package/dist/runtime/query/executor.d.ts.map +1 -1
  330. package/dist/runtime/query/executor.js +86 -10
  331. package/dist/runtime/query/executor.js.map +1 -1
  332. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  333. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  334. package/dist/runtime/query/file-evidence-replay.js +8 -7
  335. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  336. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  337. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  338. package/dist/runtime/query/fork/prepare.js +4 -0
  339. package/dist/runtime/query/fork/prepare.js.map +1 -1
  340. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  341. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  342. package/dist/runtime/query/guardrail-presets.js +4 -3
  343. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  344. package/dist/runtime/query/index.d.ts +23 -10
  345. package/dist/runtime/query/index.d.ts.map +1 -1
  346. package/dist/runtime/query/index.js +149 -70
  347. package/dist/runtime/query/index.js.map +1 -1
  348. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/index.js +8 -1
  350. package/dist/runtime/query/iteration/index.js.map +1 -1
  351. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  352. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  353. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  354. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  355. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  356. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  357. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  358. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  359. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  360. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  361. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  362. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  363. package/dist/runtime/query/iteration/tool-input.js +291 -0
  364. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  365. package/dist/runtime/query/observation-context.d.ts +2 -2
  366. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  367. package/dist/runtime/query/observation-context.js.map +1 -1
  368. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  369. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  370. package/dist/runtime/query/prelude-lease.js +121 -0
  371. package/dist/runtime/query/prelude-lease.js.map +1 -0
  372. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  373. package/dist/runtime/query/prepare-turn.js +386 -187
  374. package/dist/runtime/query/prepare-turn.js.map +1 -1
  375. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  376. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  377. package/dist/runtime/query/prompt.d.ts +2 -2
  378. package/dist/runtime/query/prompt.d.ts.map +1 -1
  379. package/dist/runtime/query/prompt.js +1 -1
  380. package/dist/runtime/query/prompt.js.map +1 -1
  381. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  382. package/dist/runtime/query/resume-session.js +37 -2
  383. package/dist/runtime/query/resume-session.js.map +1 -1
  384. package/dist/runtime/query/review-policy.d.ts +22 -3
  385. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  386. package/dist/runtime/query/review-policy.js +84 -6
  387. package/dist/runtime/query/review-policy.js.map +1 -1
  388. package/dist/runtime/query/tooling.d.ts +3 -2
  389. package/dist/runtime/query/tooling.d.ts.map +1 -1
  390. package/dist/runtime/query/tooling.js.map +1 -1
  391. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  392. package/dist/runtime/query/turn-state.js +5 -0
  393. package/dist/runtime/query/turn-state.js.map +1 -1
  394. package/dist/runtime/system-events.d.ts +112 -0
  395. package/dist/runtime/system-events.d.ts.map +1 -0
  396. package/dist/runtime/system-events.js +183 -0
  397. package/dist/runtime/system-events.js.map +1 -0
  398. package/dist/scheduler/delegating.d.ts +2 -1
  399. package/dist/scheduler/delegating.d.ts.map +1 -1
  400. package/dist/scheduler/delegating.js +3 -2
  401. package/dist/scheduler/delegating.js.map +1 -1
  402. package/dist/scheduler/local.d.ts.map +1 -1
  403. package/dist/scheduler/local.js +2 -0
  404. package/dist/scheduler/local.js.map +1 -1
  405. package/dist/session/retention/archive.js +1 -1
  406. package/dist/session/retention/archive.js.map +1 -1
  407. package/dist/skills/index.d.ts +1 -1
  408. package/dist/skills/index.d.ts.map +1 -1
  409. package/dist/skills/index.js +1 -1
  410. package/dist/skills/index.js.map +1 -1
  411. package/dist/skills/registry.d.ts +12 -0
  412. package/dist/skills/registry.d.ts.map +1 -1
  413. package/dist/skills/registry.js +19 -0
  414. package/dist/skills/registry.js.map +1 -1
  415. package/dist/store/evidence/index-page.d.ts +2 -2
  416. package/dist/store/session/disk.d.ts.map +1 -1
  417. package/dist/store/session/disk.js +2 -0
  418. package/dist/store/session/disk.js.map +1 -1
  419. package/dist/store/session-log/conformance.d.ts +1 -1
  420. package/dist/store/session-log/conformance.d.ts.map +1 -1
  421. package/dist/store/session-log/conformance.js +49 -8
  422. package/dist/store/session-log/conformance.js.map +1 -1
  423. package/dist/store/session-log/core.d.ts +8 -3
  424. package/dist/store/session-log/core.d.ts.map +1 -1
  425. package/dist/store/session-log/core.js +2 -1
  426. package/dist/store/session-log/core.js.map +1 -1
  427. package/dist/store/session-log/fold.d.ts +12 -0
  428. package/dist/store/session-log/fold.d.ts.map +1 -1
  429. package/dist/store/session-log/fold.js +57 -7
  430. package/dist/store/session-log/fold.js.map +1 -1
  431. package/dist/store/session-log/index.d.ts +2 -2
  432. package/dist/store/session-log/index.d.ts.map +1 -1
  433. package/dist/store/session-log/index.js +1 -1
  434. package/dist/store/session-log/index.js.map +1 -1
  435. package/dist/test-support/toolset.d.ts +19 -0
  436. package/dist/test-support/toolset.d.ts.map +1 -0
  437. package/dist/test-support/toolset.js +20 -0
  438. package/dist/test-support/toolset.js.map +1 -0
  439. package/dist/tools/builtins/bash.d.ts +29 -0
  440. package/dist/tools/builtins/bash.d.ts.map +1 -1
  441. package/dist/tools/builtins/bash.js +19 -9
  442. package/dist/tools/builtins/bash.js.map +1 -1
  443. package/dist/tools/builtins/browser-url.d.ts +1 -1
  444. package/dist/tools/builtins/browser-url.js +1 -1
  445. package/dist/tools/builtins/browser.d.ts +6 -6
  446. package/dist/tools/builtins/browser.js +2 -2
  447. package/dist/tools/builtins/browser.js.map +1 -1
  448. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  449. package/dist/tools/builtins/computer-use.js +19 -11
  450. package/dist/tools/builtins/computer-use.js.map +1 -1
  451. package/dist/tools/builtins/edit.d.ts.map +1 -1
  452. package/dist/tools/builtins/edit.js +9 -1
  453. package/dist/tools/builtins/edit.js.map +1 -1
  454. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  455. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  456. package/dist/tools/builtins/json-string-hint.js +17 -0
  457. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  458. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  459. package/dist/tools/builtins/search-tools.js +7 -15
  460. package/dist/tools/builtins/search-tools.js.map +1 -1
  461. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  462. package/dist/tools/builtins/write-file.js +11 -0
  463. package/dist/tools/builtins/write-file.js.map +1 -1
  464. package/dist/tools/command-shell.d.ts +10 -0
  465. package/dist/tools/command-shell.d.ts.map +1 -1
  466. package/dist/tools/command-shell.js +45 -1
  467. package/dist/tools/command-shell.js.map +1 -1
  468. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  469. package/dist/tools/coordinator/agent.js +5 -0
  470. package/dist/tools/coordinator/agent.js.map +1 -1
  471. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
  472. package/dist/tools/coordinator/ask-user-question.js +26 -13
  473. package/dist/tools/coordinator/ask-user-question.js.map +1 -1
  474. package/dist/tools/coordinator/index.d.ts.map +1 -1
  475. package/dist/tools/coordinator/index.js +5 -0
  476. package/dist/tools/coordinator/index.js.map +1 -1
  477. package/dist/tools/coordinator/question-options.d.ts +78 -0
  478. package/dist/tools/coordinator/question-options.d.ts.map +1 -0
  479. package/dist/tools/coordinator/question-options.js +153 -0
  480. package/dist/tools/coordinator/question-options.js.map +1 -0
  481. package/dist/tools/defineTool.d.ts +10 -0
  482. package/dist/tools/defineTool.d.ts.map +1 -1
  483. package/dist/tools/defineTool.js +17 -0
  484. package/dist/tools/defineTool.js.map +1 -1
  485. package/dist/tools/memory/search.d.ts.map +1 -1
  486. package/dist/tools/memory/search.js +4 -1
  487. package/dist/tools/memory/search.js.map +1 -1
  488. package/dist/tools/memory/update.d.ts.map +1 -1
  489. package/dist/tools/memory/update.js +8 -5
  490. package/dist/tools/memory/update.js.map +1 -1
  491. package/dist/tools/render-nonce.d.ts +47 -0
  492. package/dist/tools/render-nonce.d.ts.map +1 -0
  493. package/dist/tools/render-nonce.js +63 -0
  494. package/dist/tools/render-nonce.js.map +1 -0
  495. package/dist/tools/roster.d.ts +46 -19
  496. package/dist/tools/roster.d.ts.map +1 -1
  497. package/dist/tools/roster.js +63 -33
  498. package/dist/tools/roster.js.map +1 -1
  499. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  500. package/dist/tools/schedules/schedule-tool.js +94 -14
  501. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  502. package/dist/tools/schedules/types.d.ts +52 -6
  503. package/dist/tools/schedules/types.d.ts.map +1 -1
  504. package/dist/tools/trusted-read-only.d.ts +9 -5
  505. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  506. package/dist/tools/trusted-read-only.js +14 -10
  507. package/dist/tools/trusted-read-only.js.map +1 -1
  508. package/dist/tools/untrusted-envelope.d.ts +67 -28
  509. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  510. package/dist/tools/untrusted-envelope.js +108 -59
  511. package/dist/tools/untrusted-envelope.js.map +1 -1
  512. package/dist/toolsets/combine.d.ts +44 -0
  513. package/dist/toolsets/combine.d.ts.map +1 -0
  514. package/dist/toolsets/combine.js +153 -0
  515. package/dist/toolsets/combine.js.map +1 -0
  516. package/dist/toolsets/manager.d.ts +201 -0
  517. package/dist/toolsets/manager.d.ts.map +1 -0
  518. package/dist/toolsets/manager.js +837 -0
  519. package/dist/toolsets/manager.js.map +1 -0
  520. package/dist/toolsets/source-glob.d.ts +15 -0
  521. package/dist/toolsets/source-glob.d.ts.map +1 -0
  522. package/dist/toolsets/source-glob.js +23 -0
  523. package/dist/toolsets/source-glob.js.map +1 -0
  524. package/dist/toolsets/toolset.d.ts +20 -0
  525. package/dist/toolsets/toolset.d.ts.map +1 -0
  526. package/dist/toolsets/toolset.js +28 -0
  527. package/dist/toolsets/toolset.js.map +1 -0
  528. package/dist/toolsets/types.d.ts +128 -0
  529. package/dist/toolsets/types.d.ts.map +1 -0
  530. package/dist/toolsets/types.js +33 -0
  531. package/dist/toolsets/types.js.map +1 -0
  532. package/dist/toolsets/wrappers.d.ts +59 -0
  533. package/dist/toolsets/wrappers.d.ts.map +1 -0
  534. package/dist/toolsets/wrappers.js +165 -0
  535. package/dist/toolsets/wrappers.js.map +1 -0
  536. package/dist/types/agent/base.d.ts +27 -16
  537. package/dist/types/agent/base.d.ts.map +1 -1
  538. package/dist/types/agent/index.d.ts +1 -0
  539. package/dist/types/agent/index.d.ts.map +1 -1
  540. package/dist/types/agent/index.js +1 -0
  541. package/dist/types/agent/index.js.map +1 -1
  542. package/dist/types/agent/pipeline.d.ts +2 -0
  543. package/dist/types/agent/pipeline.d.ts.map +1 -1
  544. package/dist/types/agent/query.d.ts +117 -0
  545. package/dist/types/agent/query.d.ts.map +1 -0
  546. package/dist/types/agent/query.js +2 -0
  547. package/dist/types/agent/query.js.map +1 -0
  548. package/dist/types/agent/reactive.d.ts +2 -129
  549. package/dist/types/agent/reactive.d.ts.map +1 -1
  550. package/dist/types/agent/router.d.ts +2 -0
  551. package/dist/types/agent/router.d.ts.map +1 -1
  552. package/dist/types/agent/scheduler.d.ts +6 -1
  553. package/dist/types/agent/scheduler.d.ts.map +1 -1
  554. package/dist/types/agent/supervisor.d.ts +5 -2
  555. package/dist/types/agent/supervisor.d.ts.map +1 -1
  556. package/dist/types/agent/task.d.ts +19 -1
  557. package/dist/types/agent/task.d.ts.map +1 -1
  558. package/dist/types/agent/task.js.map +1 -1
  559. package/dist/types/authorization/index.d.ts +49 -12
  560. package/dist/types/authorization/index.d.ts.map +1 -1
  561. package/dist/types/authorization/index.js +6 -0
  562. package/dist/types/authorization/index.js.map +1 -1
  563. package/dist/types/connector/mcp.d.ts +45 -0
  564. package/dist/types/connector/mcp.d.ts.map +1 -1
  565. package/dist/types/errors/index.d.ts +15 -0
  566. package/dist/types/errors/index.d.ts.map +1 -1
  567. package/dist/types/errors/index.js.map +1 -1
  568. package/dist/types/hitl/index.d.ts +57 -0
  569. package/dist/types/hitl/index.d.ts.map +1 -1
  570. package/dist/types/hitl/index.js.map +1 -1
  571. package/dist/types/message/index.d.ts +130 -9
  572. package/dist/types/message/index.d.ts.map +1 -1
  573. package/dist/types/message/index.js +4 -1
  574. package/dist/types/message/index.js.map +1 -1
  575. package/dist/types/plugin/index.d.ts +22 -4
  576. package/dist/types/plugin/index.d.ts.map +1 -1
  577. package/dist/types/plugin/index.js +1 -0
  578. package/dist/types/plugin/index.js.map +1 -1
  579. package/dist/types/provider/chat.d.ts +5 -0
  580. package/dist/types/provider/chat.d.ts.map +1 -1
  581. package/dist/types/provider/config.d.ts +8 -3
  582. package/dist/types/provider/config.d.ts.map +1 -1
  583. package/dist/types/provider/stream.d.ts +39 -0
  584. package/dist/types/provider/stream.d.ts.map +1 -1
  585. package/dist/types/sandbox/index.d.ts +1 -1
  586. package/dist/types/session/events.d.ts +14 -3
  587. package/dist/types/session/events.d.ts.map +1 -1
  588. package/dist/types/session/events.js.map +1 -1
  589. package/dist/types/session/sub-session.d.ts +2 -0
  590. package/dist/types/session/sub-session.d.ts.map +1 -1
  591. package/dist/types/tool/index.d.ts +152 -91
  592. package/dist/types/tool/index.d.ts.map +1 -1
  593. package/dist/types/tool/index.js.map +1 -1
  594. package/dist/types/toolset/index.d.ts +10 -40
  595. package/dist/types/toolset/index.d.ts.map +1 -1
  596. package/package.json +1 -1
  597. package/src/advisory/history.ts +27 -2
  598. package/src/advisory/index.ts +1 -1
  599. package/src/advisory/registry.ts +33 -0
  600. package/src/agents/AGENTS.md +14 -7
  601. package/src/agents/PipelineAgent.ts +2 -303
  602. package/src/agents/QueryAgent.ts +269 -0
  603. package/src/agents/ReactiveAgent.ts +6 -216
  604. package/src/agents/RouterAgent.ts +2 -337
  605. package/src/agents/SupervisorAgent.ts +3 -476
  606. package/src/agents/defineAgent.ts +13 -2
  607. package/src/agents/examples/PipelineAgent.ts +302 -0
  608. package/src/agents/examples/RouterAgent.ts +338 -0
  609. package/src/agents/examples/SupervisorAgent.ts +472 -0
  610. package/src/agents/explore.ts +6 -3
  611. package/src/agents/forward-options.ts +37 -0
  612. package/src/agents/index.ts +2 -0
  613. package/src/agents/runAgent.ts +144 -37
  614. package/src/authorization/command-line.ts +2 -2
  615. package/src/authorization/gate.ts +21 -1
  616. package/src/authorization/program.ts +773 -0
  617. package/src/authorization/reexec-wrapper.ts +589 -0
  618. package/src/authorization/rules.ts +18 -1
  619. package/src/authorization/shell-lexer.ts +104 -59
  620. package/src/bridge/sse/mapper.ts +6 -0
  621. package/src/capabilities/index.ts +157 -0
  622. package/src/config/registry.ts +4 -1
  623. package/src/connector/index.ts +9 -2
  624. package/src/connector/mcp/adapter.ts +73 -3
  625. package/src/connector/mcp/client.ts +425 -6
  626. package/src/connector/mcp/discovery.ts +60 -0
  627. package/src/connector/mcp/era.ts +7 -0
  628. package/src/connector/mcp/index.ts +13 -0
  629. package/src/connector/mcp/mcp-toolset.ts +515 -0
  630. package/src/connector/mcp/streamable-http.ts +302 -5
  631. package/src/connector/tools/index.ts +2 -2
  632. package/src/connector/tools/router.ts +35 -58
  633. package/src/directory/derive-supervisor.ts +12 -8
  634. package/src/directory/derive.ts +8 -5
  635. package/src/execution/code-runtime/types.ts +2 -2
  636. package/src/invariants/index.ts +4 -1
  637. package/src/manager/agent/lifecycle.ts +167 -19
  638. package/src/manager/connector/environment.ts +17 -4
  639. package/src/manager/connector/index.ts +2 -2
  640. package/src/manager/connector/tenant.ts +17 -4
  641. package/src/manager/index.ts +2 -2
  642. package/src/manager/session/attribution.ts +79 -0
  643. package/src/manager/session/turn-recorder.ts +211 -55
  644. package/src/peers/address.ts +58 -0
  645. package/src/peers/client.ts +202 -0
  646. package/src/peers/dir.ts +176 -0
  647. package/src/peers/endpoint.ts +564 -0
  648. package/src/peers/envelope.ts +121 -0
  649. package/src/peers/index.ts +96 -0
  650. package/src/peers/protocol.ts +196 -0
  651. package/src/peers/record.ts +56 -0
  652. package/src/peers/registry.ts +241 -0
  653. package/src/plugin/define.ts +68 -0
  654. package/src/plugin/index.ts +2 -0
  655. package/src/plugin/lifecycle.ts +286 -106
  656. package/src/plugin/resolver.ts +6 -3
  657. package/src/plugin/shell-hook.ts +21 -5
  658. package/src/probe/errors.ts +4 -1
  659. package/src/prompt/coding-agent-doctrine.ts +22 -10
  660. package/src/prompt/contributions.ts +12 -2
  661. package/src/prompt/index.ts +1 -0
  662. package/src/provider/collect-chat-completion.ts +96 -11
  663. package/src/provider/mock.ts +24 -6
  664. package/src/provider/registry.ts +4 -1
  665. package/src/provider/tool-call-framing.ts +226 -0
  666. package/src/public-runtime.ts +136 -7
  667. package/src/public-tools.ts +24 -4
  668. package/src/public-types.ts +60 -6
  669. package/src/read-model/registry.ts +7 -2
  670. package/src/registry/ManagedRegistry.ts +57 -6
  671. package/src/registry/collision.ts +64 -0
  672. package/src/registry/command/index.ts +7 -3
  673. package/src/registry/index.ts +3 -9
  674. package/src/registry/plugin/index.ts +14 -1
  675. package/src/registry/tool/callable.ts +8 -9
  676. package/src/registry/tool/execute.ts +16 -846
  677. package/src/registry/tool/portable.ts +59 -0
  678. package/src/registry/tool/presentation.ts +6 -5
  679. package/src/runtime/bidi/session.ts +24 -5
  680. package/src/runtime/query/executor/tool-call-admission.ts +228 -6
  681. package/src/runtime/query/executor.ts +110 -12
  682. package/src/runtime/query/file-evidence-replay.ts +8 -7
  683. package/src/runtime/query/fork/prepare.ts +6 -1
  684. package/src/runtime/query/guardrail-presets.ts +4 -3
  685. package/src/runtime/query/index.ts +199 -101
  686. package/src/runtime/query/iteration/index.ts +13 -3
  687. package/src/runtime/query/iteration/phases/compaction.ts +1 -1
  688. package/src/runtime/query/iteration/phases/context.ts +2 -2
  689. package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
  690. package/src/runtime/query/iteration/stream-turn.ts +390 -136
  691. package/src/runtime/query/iteration/tool-input.ts +284 -0
  692. package/src/runtime/query/observation-context.ts +2 -2
  693. package/src/runtime/query/prelude-lease.ts +132 -0
  694. package/src/runtime/query/prepare-turn.ts +477 -198
  695. package/src/runtime/query/prompt-cache.ts +2 -2
  696. package/src/runtime/query/prompt.ts +4 -4
  697. package/src/runtime/query/resume-session.ts +42 -3
  698. package/src/runtime/query/review-policy.ts +87 -9
  699. package/src/runtime/query/tooling.ts +3 -6
  700. package/src/runtime/query/turn-state.ts +4 -0
  701. package/src/runtime/system-events.ts +246 -0
  702. package/src/scheduler/delegating.ts +7 -2
  703. package/src/scheduler/local.ts +2 -0
  704. package/src/session/retention/archive.ts +1 -1
  705. package/src/skills/index.ts +1 -1
  706. package/src/skills/registry.ts +25 -0
  707. package/src/store/session/disk.ts +3 -0
  708. package/src/store/session-log/conformance.ts +51 -8
  709. package/src/store/session-log/core.ts +10 -4
  710. package/src/store/session-log/fold.ts +33 -7
  711. package/src/store/session-log/index.ts +2 -0
  712. package/src/test-support/toolset.ts +23 -0
  713. package/src/tools/builtins/bash.ts +27 -10
  714. package/src/tools/builtins/browser-url.ts +1 -1
  715. package/src/tools/builtins/browser.ts +2 -2
  716. package/src/tools/builtins/computer-use.ts +21 -11
  717. package/src/tools/builtins/edit.ts +12 -2
  718. package/src/tools/builtins/json-string-hint.ts +16 -0
  719. package/src/tools/builtins/search-tools.ts +7 -20
  720. package/src/tools/builtins/write-file.ts +12 -0
  721. package/src/tools/command-shell.ts +46 -1
  722. package/src/tools/coordinator/agent.ts +6 -0
  723. package/src/tools/coordinator/ask-user-question.ts +29 -15
  724. package/src/tools/coordinator/index.ts +6 -0
  725. package/src/tools/coordinator/question-options.ts +195 -0
  726. package/src/tools/defineTool.ts +28 -0
  727. package/src/tools/memory/search.ts +4 -1
  728. package/src/tools/memory/update.ts +8 -5
  729. package/src/tools/render-nonce.ts +69 -0
  730. package/src/tools/roster.ts +84 -33
  731. package/src/tools/schedules/schedule-tool.ts +107 -14
  732. package/src/tools/schedules/types.ts +52 -6
  733. package/src/tools/trusted-read-only.ts +19 -10
  734. package/src/tools/untrusted-envelope.ts +121 -57
  735. package/src/toolsets/combine.ts +181 -0
  736. package/src/toolsets/manager.ts +996 -0
  737. package/src/toolsets/source-glob.ts +22 -0
  738. package/src/toolsets/toolset.ts +31 -0
  739. package/src/toolsets/types.ts +154 -0
  740. package/src/toolsets/wrappers.ts +191 -0
  741. package/src/types/agent/base.ts +29 -16
  742. package/src/types/agent/index.ts +1 -0
  743. package/src/types/agent/pipeline.ts +2 -0
  744. package/src/types/agent/query.ts +129 -0
  745. package/src/types/agent/reactive.ts +5 -142
  746. package/src/types/agent/router.ts +2 -0
  747. package/src/types/agent/scheduler.ts +6 -1
  748. package/src/types/agent/supervisor.ts +5 -2
  749. package/src/types/agent/task.ts +21 -1
  750. package/src/types/authorization/index.ts +12 -0
  751. package/src/types/connector/mcp.ts +46 -0
  752. package/src/types/errors/index.ts +15 -0
  753. package/src/types/hitl/index.ts +57 -0
  754. package/src/types/message/index.ts +135 -7
  755. package/src/types/plugin/index.ts +44 -21
  756. package/src/types/provider/chat.ts +5 -0
  757. package/src/types/provider/config.ts +8 -3
  758. package/src/types/provider/stream.ts +39 -0
  759. package/src/types/sandbox/index.ts +1 -1
  760. package/src/types/session/events.ts +14 -3
  761. package/src/types/session/sub-session.ts +2 -0
  762. package/src/types/tool/index.ts +154 -105
  763. package/src/types/toolset/index.ts +10 -47
  764. package/dist/registry/toolset/catalog.d.ts +0 -42
  765. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  766. package/dist/registry/toolset/catalog.js +0 -234
  767. package/dist/registry/toolset/catalog.js.map +0 -1
  768. package/src/registry/toolset/catalog.ts +0 -308
@@ -1,15 +1,17 @@
1
1
  import { SpanStatusCode } from '@opentelemetry/api';
2
2
  import { assertHostedWebSearchSupported, assertNativeStructuredOutputSupported, } from '../../../provider/capabilities.js';
3
- import { isProviderRequestError } from '../../../provider/errors.js';
3
+ import { ProviderRequestError, isProviderRequestError } from '../../../provider/errors.js';
4
4
  import { StreamTextAccumulator } from '../../../provider/stream-text.js';
5
+ import { INTERLEAVED_TOOL_INPUT_PARSE_ERROR, ToolCallIndexer, describeToolCallFramingViolation, describeToolCallInterleaving, isUnindexedFragment, toolCallFramingViolation, } from '../../../provider/tool-call-framing.js';
5
6
  import { GENAI, NAMZU, chatSpanName, parentContext } from '../../../telemetry/attributes.js';
6
7
  import { recordModelDuration, recordTimeToFirstToken, recordTokenUsage, } from '../../../telemetry/metrics.js';
7
8
  import { getTracer } from '../../../telemetry/runtime-accessors.js';
8
9
  import { mergeTokenUsage } from '../../../types/common/index.js';
9
10
  import { NamzuError } from '../../../types/errors/index.js';
10
11
  import { ProviderError } from '../../../types/provider/errors.js';
11
- import { generateMessageId } from '../../../utils/id.js';
12
+ import { generateMessageId, generateToolCallId } from '../../../utils/id.js';
12
13
  import { streamWithProviderRejectedImageRecovery } from './provider-rejected-image.js';
14
+ import { capPartialArguments, classifyUnreadableToolInput, parseToolArguments, } from './tool-input.js';
13
15
  /**
14
16
  * Map a provider's coarse `finishReason` plus the orchestrator's
15
17
  * `forceFinalize` flag onto the per-message {@link MessageStopReason}
@@ -46,8 +48,26 @@ function synthesizeMessageStopReason(finishReason, forceFinalize) {
46
48
  * - Stream ends without `finishReason` (a known vendor-SDK failure mode
47
49
  * dropped message_stop): we still emit `message_completed` from a
48
50
  * finally-style fall-through path with `stopReason: 'refusal'`.
49
- * - `tool_input_delta` with no `toolUseId` registered yet: we drop
50
- * the fragment and log a warning (proxies seen to misorder events).
51
+ * - A tool-call fragment before its call's id or name: kept in the call's
52
+ * buffer, keyed by index, and announced in one `tool_input_delta` right
53
+ * after `tool_input_started`, once both are known. It used to be dropped
54
+ * with a warning, and the call then failed to parse and was reported as
55
+ * cut off.
56
+ * - A call whose id never arrives, on a fragment or on `toolCallEnd`: given
57
+ * one when the stream ends, and announced then. It used to reach the
58
+ * executor with an empty id and none of its arguments. Every call's
59
+ * `tool_input_completed` follows its `tool_input_started`, under the same
60
+ * id, whatever id `toolCallEnd` carries.
61
+ * - A new id on an index another call holds: the stream is refused with a
62
+ * classified `ProviderRequestError` naming the violation. The second
63
+ * call's arguments used to be appended to the first's, and the model was
64
+ * told its call had been cut off.
65
+ * - Arguments that do not parse: classified once the stream has ended, as
66
+ * `truncated` or `malformed` (`ToolInputError`). Only the call the model's
67
+ * last output went to can be `truncated`, and only when the stream reported
68
+ * an output limit, a content filter or nothing at all. A failed parse at
69
+ * `toolCallEnd` defers its `tool_input_completed` to then, because what
70
+ * follows the call and the finish reason arrive after the block closes.
51
71
  * - `chunk.error`: when no tool input is recoverable, we surface as
52
72
  * a thrown error after emitting the message_completed terminator so
53
73
  * consumer cards still close. If a tool-use block was already open,
@@ -135,6 +155,12 @@ sessionId) {
135
155
  const model = '';
136
156
  const text = new StreamTextAccumulator();
137
157
  let finishReason = 'stop';
158
+ // What the stream itself reported, if anything. `finishReason` above
159
+ // defaults to 'stop' for the response; classifying unreadable tool input
160
+ // needs to know a stream that reported nothing from one that finished.
161
+ let reportedFinishReason;
162
+ // Which limit a 'length' finish reached, when it was the context window.
163
+ let finishDetail;
138
164
  let usage = {
139
165
  promptTokens: 0,
140
166
  completionTokens: 0,
@@ -142,7 +168,45 @@ sessionId) {
142
168
  cachedTokens: 0,
143
169
  cacheWriteTokens: 0,
144
170
  };
171
+ // Characters the model streamed so far: text, reasoning and every tool
172
+ // call's arguments. Each call records it as it begins, so a cut-off call's
173
+ // share of the response says whether the call itself or what came before
174
+ // it filled the response.
175
+ let streamedLength = 0;
145
176
  const toolBuckets = new Map();
177
+ // Places a fragment that came without an index; see `ToolCallIndexer`.
178
+ const toolIndexer = new ToolCallIndexer();
179
+ // The call the model's latest output went to, or `undefined` once text,
180
+ // reasoning or a hosted tool followed it. An output limit, a content
181
+ // filter or a dropped stream stops the response wherever it is, so this
182
+ // is the only call one of them can have cut off. Every other call was
183
+ // complete when the model moved on from it.
184
+ let lastOutputCall;
185
+ // Announce a call once its id and name are both known: `tool_input_started`,
186
+ // then, as one delta, whatever arguments arrived before that.
187
+ async function* announceToolCall(bucket) {
188
+ if (bucket.started || !bucket.id || !bucket.name)
189
+ return;
190
+ bucket.started = true;
191
+ await emitEvent({
192
+ type: 'tool_input_started',
193
+ turnId,
194
+ iteration,
195
+ messageId,
196
+ toolUseId: bucket.id,
197
+ toolName: bucket.name,
198
+ });
199
+ yield* drainPending();
200
+ if (bucket.argsBuf) {
201
+ await emitEvent({
202
+ type: 'tool_input_delta',
203
+ turnId,
204
+ toolUseId: bucket.id,
205
+ partialJson: bucket.argsBuf,
206
+ });
207
+ yield* drainPending();
208
+ }
209
+ }
146
210
  // Reasoning blocks, bucketed by stream index exactly like tool calls.
147
211
  // Order matters on replay — a provider wants the assistant turn echoed
148
212
  // verbatim — so the map is drained in index order at the end.
@@ -154,6 +218,8 @@ sessionId) {
154
218
  let replayState;
155
219
  let streamError;
156
220
  let streamCause;
221
+ /** The stream broke tool-call framing; nothing it sent becomes a tool call. */
222
+ let framingViolated = false;
157
223
  const streamParams = {
158
224
  ...params,
159
225
  stream: true,
@@ -266,6 +332,11 @@ sessionId) {
266
332
  recordTimeToFirstToken(params.model, Date.now() - callStartedAt);
267
333
  }
268
334
  if (chunk.delta.hostedTool) {
335
+ // A hosted tool starting is the model moving on. Its later status
336
+ // changes are not new output: a driver may report the completion
337
+ // only once the response is over.
338
+ if (chunk.delta.hostedTool.status === 'running')
339
+ lastOutputCall = undefined;
269
340
  await emitEvent({
270
341
  type: 'hosted_tool',
271
342
  turnId,
@@ -279,6 +350,10 @@ sessionId) {
279
350
  const reasoning = chunk.delta.reasoning;
280
351
  if (reasoning) {
281
352
  let bucket = reasoningBuckets.get(reasoning.index);
353
+ // A new reasoning block, or more of its text, is the model moving
354
+ // on. A signature or a close is not: it ends a block already begun.
355
+ if (!bucket || reasoning.text)
356
+ lastOutputCall = undefined;
282
357
  if (!bucket) {
283
358
  bucket = { type: reasoning.type ?? 'thinking', text: '' };
284
359
  reasoningBuckets.set(reasoning.index, bucket);
@@ -300,6 +375,7 @@ sessionId) {
300
375
  bucket.encrypted = reasoning.encrypted;
301
376
  if (reasoning.text) {
302
377
  bucket.text += reasoning.text;
378
+ streamedLength += reasoning.text.length;
303
379
  await emitEvent({
304
380
  type: 'reasoning_delta',
305
381
  turnId,
@@ -324,6 +400,13 @@ sessionId) {
324
400
  }
325
401
  }
326
402
  if (chunk.delta.content) {
403
+ // Text a driver adds of its own, such as a list of sources, comes
404
+ // after the model stopped. It is not the model moving on from a
405
+ // call, and not part of what came before one.
406
+ if (chunk.delta.contentOrigin !== 'driver') {
407
+ streamedLength += chunk.delta.content.length;
408
+ lastOutputCall = undefined;
409
+ }
327
410
  await emitEvent({
328
411
  type: 'text_delta',
329
412
  turnId,
@@ -335,7 +418,92 @@ sessionId) {
335
418
  yield* drainPending();
336
419
  }
337
420
  for (const tc of chunk.delta.toolCalls ?? []) {
338
- let bucket = toolBuckets.get(tc.index);
421
+ if (isUnindexedFragment(tc)) {
422
+ // Neither an id nor an index: never a guess. Evaluated fresh
423
+ // for THIS fragment, not decided once when some call opened —
424
+ // a call's buffer stops accepting text the moment it becomes
425
+ // one complete JSON value, and only the state right now says
426
+ // which open calls still could be this fragment's target.
427
+ const placement = toolIndexer.placeUnindexedFragment((i) => {
428
+ const b = toolBuckets.get(i);
429
+ if (!b || b.completed)
430
+ return false;
431
+ return b.argsBuf === '' || !parseToolArguments(b.argsBuf).ok;
432
+ });
433
+ if (typeof placement === 'number') {
434
+ let bucket = toolBuckets.get(placement);
435
+ if (!bucket) {
436
+ bucket = {
437
+ id: '',
438
+ name: '',
439
+ argsBuf: '',
440
+ started: false,
441
+ completed: false,
442
+ parsed: null,
443
+ precedingLength: streamedLength,
444
+ };
445
+ toolBuckets.set(placement, bucket);
446
+ lastOutputCall = bucket;
447
+ }
448
+ if (tc.function?.name && !bucket.name)
449
+ bucket.name = tc.function.name;
450
+ const fragment = tc.function?.arguments;
451
+ if (fragment) {
452
+ bucket.argsBuf += fragment;
453
+ streamedLength += fragment.length;
454
+ lastOutputCall = bucket;
455
+ }
456
+ if (!bucket.started) {
457
+ yield* announceToolCall(bucket);
458
+ }
459
+ else if (fragment) {
460
+ await emitEvent({
461
+ type: 'tool_input_delta',
462
+ turnId,
463
+ toolUseId: bucket.id,
464
+ partialJson: fragment,
465
+ });
466
+ yield* drainPending();
467
+ }
468
+ }
469
+ else {
470
+ // More than one open call could still have taken this
471
+ // fragment, or none could: every candidate is
472
+ // unreadable, and the fragment itself is attributed to
473
+ // none of them — appending it to a guess is exactly the
474
+ // splice this exists to refuse.
475
+ for (const candidate of placement.candidates) {
476
+ const stuck = toolBuckets.get(candidate.index);
477
+ if (stuck)
478
+ stuck.interleaved = true;
479
+ }
480
+ log.warn('tool-call fragments arrived interleaved with no index', {
481
+ [NAMZU.TURN_ID]: turnId,
482
+ [NAMZU.ITERATION]: iteration,
483
+ 'exception.message': describeToolCallInterleaving({
484
+ kind: 'interleaved_without_index',
485
+ candidates: placement.candidates,
486
+ }),
487
+ });
488
+ }
489
+ continue;
490
+ }
491
+ const index = toolIndexer.indexOf(tc);
492
+ let bucket = toolBuckets.get(index);
493
+ const violation = toolCallFramingViolation(bucket, tc, index);
494
+ if (violation) {
495
+ // Refused, not repaired: after either violation no buffer can be
496
+ // trusted to hold one call's arguments, and guessing is what
497
+ // told a model its intact call had been cut off. Thrown so the
498
+ // stream is torn down like any other stream failure; the flag
499
+ // keeps the recovery below from turning it into tool calls.
500
+ framingViolated = true;
501
+ throw new ProviderRequestError({
502
+ kind: 'server',
503
+ providerId: provider.id,
504
+ detail: describeToolCallFramingViolation(violation),
505
+ });
506
+ }
339
507
  if (!bucket) {
340
508
  bucket = {
341
509
  id: tc.id ?? '',
@@ -344,77 +512,89 @@ sessionId) {
344
512
  started: false,
345
513
  completed: false,
346
514
  parsed: null,
347
- inputTruncated: false,
515
+ precedingLength: streamedLength,
348
516
  };
349
- toolBuckets.set(tc.index, bucket);
517
+ toolBuckets.set(index, bucket);
518
+ lastOutputCall = bucket;
350
519
  }
351
520
  if (tc.id && !bucket.id)
352
521
  bucket.id = tc.id;
353
522
  if (tc.function?.name && !bucket.name)
354
523
  bucket.name = tc.function.name;
355
- if (!bucket.started && bucket.id && bucket.name) {
356
- bucket.started = true;
524
+ // Arguments belong to the call at their index whether or not its
525
+ // id has arrived yet: the index is what groups a call's fragments.
526
+ // Until the call can be announced they are only buffered, and the
527
+ // announcement carries them.
528
+ const fragment = tc.function?.arguments;
529
+ if (fragment) {
530
+ bucket.argsBuf += fragment;
531
+ streamedLength += fragment.length;
532
+ lastOutputCall = bucket;
533
+ }
534
+ if (!bucket.started) {
535
+ yield* announceToolCall(bucket);
536
+ }
537
+ else if (fragment) {
357
538
  await emitEvent({
358
- type: 'tool_input_started',
539
+ type: 'tool_input_delta',
359
540
  turnId,
360
- iteration,
361
- messageId,
362
541
  toolUseId: bucket.id,
363
- toolName: bucket.name,
542
+ partialJson: fragment,
364
543
  });
365
544
  yield* drainPending();
366
545
  }
367
- const fragment = tc.function?.arguments;
368
- if (fragment) {
369
- if (!bucket.id) {
370
- log.warn('tool_input_delta arrived before tool id was known; dropping fragment', {
371
- [NAMZU.TURN_ID]: turnId,
372
- 'namzu.runtime.index': tc.index,
373
- 'namzu.runtime.length': fragment.length,
374
- });
375
- }
376
- else {
377
- bucket.argsBuf += fragment;
546
+ }
547
+ if (chunk.delta.toolCallEnd) {
548
+ const { id: endId } = chunk.delta.toolCallEnd;
549
+ const index = toolIndexer.closedIndex(chunk.delta.toolCallEnd);
550
+ const bucket = index === undefined ? undefined : toolBuckets.get(index);
551
+ if (bucket && !bucket.completed) {
552
+ // The block close names the call too; a call whose id no
553
+ // fragment carried is announced by it.
554
+ if (!bucket.id && endId)
555
+ bucket.id = endId;
556
+ yield* announceToolCall(bucket);
557
+ }
558
+ // Settled here only once announced, and always under the id it
559
+ // was announced with, which is the id it runs under. A close
560
+ // with an empty id, or for a call whose name never came, leaves
561
+ // the call to the loop after the stream, which gives it an id
562
+ // and announces it first. The close's own id was used here
563
+ // before: an empty one completed a call that was not yet
564
+ // announced, under an id no other event of the call carried.
565
+ if (bucket?.started && !bucket.completed) {
566
+ bucket.completed = true;
567
+ // An interleaved call is never taken at its buffer's word: it
568
+ // may hold another call's spliced-in fragments, or be missing
569
+ // whatever an id-less fragment carried elsewhere instead.
570
+ const parsed = bucket.interleaved
571
+ ? { ok: false, parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR }
572
+ : parseToolArguments(bucket.argsBuf);
573
+ if (parsed.ok) {
574
+ bucket.parsed = parsed.value;
378
575
  await emitEvent({
379
- type: 'tool_input_delta',
576
+ type: 'tool_input_completed',
380
577
  turnId,
381
578
  toolUseId: bucket.id,
382
- partialJson: fragment,
579
+ input: parsed.value,
383
580
  });
384
581
  yield* drainPending();
385
582
  }
386
- }
387
- }
388
- if (chunk.delta.toolCallEnd) {
389
- const { index, id: endId } = chunk.delta.toolCallEnd;
390
- const bucket = toolBuckets.get(index);
391
- if (bucket && !bucket.completed) {
392
- bucket.completed = true;
393
- let parsed = {};
394
- try {
395
- parsed = bucket.argsBuf ? JSON.parse(bucket.argsBuf) : {};
396
- }
397
- catch (err) {
398
- bucket.inputTruncated = true;
399
- log.warn('tool input JSON parse failed at content_block_stop', {
400
- [NAMZU.TURN_ID]: turnId,
401
- 'namzu.runtime.tool_use_id': endId,
402
- 'exception.message': err instanceof Error ? err.message : String(err),
403
- });
583
+ else {
584
+ // Whether this call was cut off or malformed is decided by
585
+ // what follows it and how the response ends, and both
586
+ // arrive after the block closes. Its completion is emitted
587
+ // once the stream is over.
588
+ bucket.parsed = {};
589
+ bucket.pendingFailure = parsed;
404
590
  }
405
- bucket.parsed = parsed;
406
- await emitEvent({
407
- type: 'tool_input_completed',
408
- turnId,
409
- toolUseId: endId,
410
- input: parsed,
411
- ...(bucket.inputTruncated ? { inputTruncated: true } : {}),
412
- });
413
- yield* drainPending();
414
591
  }
415
592
  }
416
- if (chunk.finishReason)
593
+ if (chunk.finishReason) {
417
594
  finishReason = chunk.finishReason;
595
+ reportedFinishReason = chunk.finishReason;
596
+ finishDetail = chunk.finishReason === 'length' ? chunk.finishDetail : undefined;
597
+ }
418
598
  // Merge (per-field max), not last-write-wins: a late usage frame that
419
599
  // omits input/cache tokens must not zero the counts seen earlier in the
420
600
  // stream, which would under-report this turn's accumulated usage.
@@ -472,76 +652,111 @@ sessionId) {
472
652
  // Cleanup cannot replace the original stream outcome.
473
653
  }
474
654
  }
475
- // Flush any tool buckets the provider failed to close (no toolCallEnd
476
- // arrived — defensive against providers that don't yet emit it, and
477
- // the load-bearing path when the provider stream ends with
478
- // `stop_reason: "max_tokens"` mid-`input_json_delta`. In that case
479
- // A provider's stream never sends a block-stop for the open
480
- // tool_use block: the upstream model ran out of completion tokens
481
- // before it could close the JSON literal, so the buffered
482
- // `argsBuf` ends with something like `"content":"…some prefix` —
483
- // not parseable.
655
+ // A call whose id never arrived is still one call: its index grouped its
656
+ // fragments. Only the name its result is filed under is missing, so it is
657
+ // given one, as a driver does for a wire that sends none, and announced.
658
+ for (const bucket of toolBuckets.values()) {
659
+ if (bucket.id || !bucket.name)
660
+ continue;
661
+ bucket.id = generateToolCallId();
662
+ log.warn('tool call arrived without an id; one was assigned', {
663
+ [NAMZU.TURN_ID]: turnId,
664
+ 'namzu.runtime.tool_use_id': bucket.id,
665
+ [GENAI.TOOL_NAME]: bucket.name,
666
+ });
667
+ yield* announceToolCall(bucket);
668
+ }
669
+ // Settle every tool call the stream left open or unreadable. Two paths
670
+ // arrive here:
671
+ //
672
+ // 1. No `toolCallEnd` came for the call — a driver that never emits one
673
+ // (every call then settles here), or a stream that stopped before
674
+ // the block closed. A buffer that parses is kept.
675
+ // 2. `toolCallEnd` came and the buffer did not parse. Its completion was
676
+ // held back until now, because what it is depends on how the
677
+ // response ended.
484
678
  //
485
- // Two cases coalesce here:
486
- // 1. The buffer parses cleanly (the provider just forgot to emit
487
- // `content_block_stop` but the args are intact) — keep parsed.
488
- // 2. The buffer is truncated mid-literal — `parsed = {}` is the
489
- // safe fallback so the executor's `JSON.parse(arguments)`
490
- // succeeds and downstream consumers don't crash. The PRICE
491
- // we used to pay was the model getting back a generic
492
- // "<field> is required" Zod error and not realising its
493
- // previous tool call was truncated server-side, so it would
494
- // retry with the SAME long input and hit the same cutoff in
495
- // a loop. Detect the truncation case and mark the tool call
496
- // with runtime metadata; the executor surfaces a specific
497
- // "your tool call was cut off by max_tokens — retry with
498
- // shorter input or split into smaller calls" message that the
499
- // model can act on.
679
+ // An unreadable buffer becomes `parsed = {}` — the safe fallback, so the
680
+ // executor's `JSON.parse(arguments)` succeeds and nothing downstream
681
+ // crashes — plus `inputError`. It is `truncated` only for the call the
682
+ // model's last output went to, when the output limit or a content filter
683
+ // stopped the response or it reported nothing at all: whatever stopped
684
+ // the response could cut no other call. Every other unreadable call is
685
+ // `malformed`: the response finished normally, or the model moved on to
686
+ // more output, so it had finished writing the call. The executor turns
687
+ // that into a message the model can act on. Without it the model got a
688
+ // generic "<field> is required" error for a call it did not know was
689
+ // broken, and a cut-off call came back with the same long input, into
690
+ // the same cutoff, in a loop. Calling a malformed call cut off tells the
691
+ // model to send less, which does not fix its JSON.
500
692
  for (const bucket of toolBuckets.values()) {
501
- if (bucket.started && !bucket.completed) {
693
+ let failure = bucket.pendingFailure;
694
+ if (!failure) {
695
+ if (!bucket.started || bucket.completed)
696
+ continue;
502
697
  bucket.completed = true;
503
- let parsed = {};
504
- let truncated = false;
505
- if (bucket.argsBuf) {
506
- try {
507
- parsed = JSON.parse(bucket.argsBuf);
508
- }
509
- catch {
510
- // argsBuf had content but didn't parse — almost
511
- // certainly the max_tokens-mid-literal cutoff. Mark
512
- // the bucket so the executor can return a model-
513
- // readable hint instead of a generic Zod error.
514
- truncated = true;
515
- parsed = {};
516
- }
517
- }
518
- bucket.parsed = parsed;
519
- bucket.inputTruncated = truncated;
520
- if (truncated) {
521
- log.warn('tool input truncated by upstream cutoff (no toolCallEnd, argsBuf unparsable)', {
522
- [NAMZU.TURN_ID]: turnId,
523
- 'namzu.runtime.tool_use_id': bucket.id,
524
- [GENAI.TOOL_NAME]: bucket.name,
525
- 'namzu.runtime.buffer_length': bucket.argsBuf.length,
698
+ const parsed = bucket.interleaved
699
+ ? { ok: false, parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR }
700
+ : parseToolArguments(bucket.argsBuf);
701
+ if (parsed.ok) {
702
+ bucket.parsed = parsed.value;
703
+ await emitEvent({
704
+ type: 'tool_input_completed',
705
+ turnId,
706
+ toolUseId: bucket.id,
707
+ input: parsed.value,
526
708
  });
709
+ yield* drainPending();
710
+ continue;
527
711
  }
528
- await emitEvent({
529
- type: 'tool_input_completed',
530
- turnId,
531
- toolUseId: bucket.id,
532
- input: parsed,
533
- ...(truncated ? { inputTruncated: true } : {}),
534
- });
535
- yield* drainPending();
712
+ failure = parsed;
536
713
  }
714
+ bucket.pendingFailure = undefined;
715
+ bucket.parsed = {};
716
+ // An interleaved call is always `malformed`, never `classifyUnreadableToolInput`'s
717
+ // call: whether it happens to be this response's last output and
718
+ // whether the response was cut off are both beside the point here —
719
+ // the buffer it would be judged by cannot be trusted either way.
720
+ const inputError = bucket.interleaved
721
+ ? {
722
+ reason: 'malformed',
723
+ parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR,
724
+ length: bucket.argsBuf.length,
725
+ precedingLength: bucket.precedingLength,
726
+ }
727
+ : classifyUnreadableToolInput(failure, {
728
+ length: bucket.argsBuf.length,
729
+ precedingLength: bucket.precedingLength,
730
+ last: bucket === lastOutputCall,
731
+ }, reportedFinishReason, usage, finishDetail);
732
+ bucket.inputError = inputError;
733
+ log.warn('tool input could not be read', {
734
+ [NAMZU.TURN_ID]: turnId,
735
+ 'namzu.runtime.tool_use_id': bucket.id,
736
+ [GENAI.TOOL_NAME]: bucket.name,
737
+ 'namzu.runtime.reason': inputError.reason,
738
+ 'namzu.runtime.finish_reason': reportedFinishReason ?? 'none',
739
+ 'namzu.runtime.buffer_length': bucket.argsBuf.length,
740
+ 'exception.message': inputError.parseError,
741
+ });
742
+ await emitEvent({
743
+ type: 'tool_input_completed',
744
+ turnId,
745
+ toolUseId: bucket.id,
746
+ input: {},
747
+ inputTruncated: true,
748
+ inputError,
749
+ partialArguments: capPartialArguments(bucket.argsBuf),
750
+ });
751
+ yield* drainPending();
537
752
  }
538
753
  // `arguments` MUST be valid JSON for the executor's `JSON.parse`
539
754
  // (`runtime/query/executor.ts:executeSingle`) to succeed. We
540
755
  // always serialise from the bucket's `parsed` object (filled by
541
756
  // either the `toolCallEnd` branch above or the post-stream flush
542
- // loop) instead of re-emitting `argsBuf`. When the provider
543
- // stream truncated mid-input, `metadata.inputTruncated` carries that
544
- // state; the executor parses cleanly and returns a specific
757
+ // loop) instead of re-emitting `argsBuf`. When the arguments could not
758
+ // be read, `metadata.inputTruncated` and `metadata.inputError` carry
759
+ // that state; the executor parses cleanly and returns a specific
545
760
  // model-readable retry hint instead of the generic "Invalid JSON in
546
761
  // tool arguments" intercept.
547
762
  const toolCalls = [...toolBuckets.entries()]
@@ -557,11 +772,21 @@ sessionId) {
557
772
  // normalized to `{}` above, so without this the only record of
558
773
  // what the model was actually saying is gone — and a
559
774
  // `repairToolCall` hook has nothing to repair.
560
- ...(b.inputTruncated
561
- ? { metadata: { inputTruncated: true, partialArguments: b.argsBuf } }
775
+ ...(b.inputError
776
+ ? {
777
+ metadata: {
778
+ inputTruncated: true,
779
+ partialArguments: b.argsBuf,
780
+ inputError: b.inputError,
781
+ },
782
+ }
562
783
  : {}),
563
784
  }));
564
- const recoveredToolInputFromStreamError = streamError !== undefined && toolCalls.some((tc) => tc.id && tc.function.name);
785
+ // Not after a framing violation: the calls it would recover are the ones
786
+ // the stream was just refused for garbling.
787
+ const recoveredToolInputFromStreamError = streamError !== undefined &&
788
+ !framingViolated &&
789
+ toolCalls.some((tc) => tc.id && tc.function.name);
565
790
  const effectiveFinishReason = recoveredToolInputFromStreamError ? 'tool_calls' : finishReason;
566
791
  if (recoveredToolInputFromStreamError) {
567
792
  log.warn('provider stream failed after tool input; surfacing tool call to executor', {
@@ -642,6 +867,7 @@ sessionId) {
642
867
  ...(citations.length > 0 ? { citations } : {}),
643
868
  },
644
869
  finishReason: effectiveFinishReason,
870
+ ...(effectiveFinishReason === 'length' && finishDetail ? { finishDetail } : {}),
645
871
  usage,
646
872
  };
647
873
  // The same numbers as a MEASUREMENT, not only as a span attribute.