@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
@@ -3,8 +3,16 @@ import {
3
3
  assertHostedWebSearchSupported,
4
4
  assertNativeStructuredOutputSupported,
5
5
  } from '../../../provider/capabilities.js'
6
- import { isProviderRequestError } from '../../../provider/errors.js'
6
+ import { ProviderRequestError, isProviderRequestError } from '../../../provider/errors.js'
7
7
  import { StreamTextAccumulator } from '../../../provider/stream-text.js'
8
+ import {
9
+ INTERLEAVED_TOOL_INPUT_PARSE_ERROR,
10
+ ToolCallIndexer,
11
+ describeToolCallFramingViolation,
12
+ describeToolCallInterleaving,
13
+ isUnindexedFragment,
14
+ toolCallFramingViolation,
15
+ } from '../../../provider/tool-call-framing.js'
8
16
  import { GENAI, NAMZU, chatSpanName, parentContext } from '../../../telemetry/attributes.js'
9
17
  import {
10
18
  recordModelDuration,
@@ -20,6 +28,7 @@ import type {
20
28
  Citation,
21
29
  Message,
22
30
  ReasoningBlock,
31
+ ToolInputError,
23
32
  } from '../../../types/message/index.js'
24
33
  import { ProviderError } from '../../../types/provider/errors.js'
25
34
  import type {
@@ -29,11 +38,56 @@ import type {
29
38
  } from '../../../types/provider/index.js'
30
39
  import type { SessionEvent } from '../../../types/session/index.js'
31
40
  import type { MessageStopReason } from '../../../types/session/stop-reason.js'
32
- import { generateMessageId } from '../../../utils/id.js'
41
+ import { generateMessageId, generateToolCallId } from '../../../utils/id.js'
33
42
  import type { Logger } from '../../../utils/logger.js'
34
43
  import type { EmitEvent } from '../events.js'
35
44
  import type { RequestImageIdentity } from '../request-rich-content.js'
36
45
  import { streamWithProviderRejectedImageRecovery } from './provider-rejected-image.js'
46
+ import {
47
+ type ParsedToolArguments,
48
+ capPartialArguments,
49
+ classifyUnreadableToolInput,
50
+ parseToolArguments,
51
+ } from './tool-input.js'
52
+
53
+ /** One streamed tool call, gathered by its `index`. */
54
+ interface ToolCallBucket {
55
+ id: string
56
+ name: string
57
+ argsBuf: string
58
+ /** `tool_input_started` was emitted: the id and name are both known. */
59
+ started: boolean
60
+ completed: boolean
61
+ /**
62
+ * Parsed input. `null` while the bucket is still streaming.
63
+ * The synthesized
64
+ * `ChatCompletionResponse.toolCalls[].function.arguments` is
65
+ * derived from this — never from the raw buffer — so the
66
+ * downstream executor (`runtime/query/executor.ts`) never has
67
+ * to re-parse an unreadable string. An unreadable tool call is
68
+ * surfaced as `arguments: "{}"` plus `metadata.inputTruncated`
69
+ * and `metadata.inputError` so tool args remain clean while the
70
+ * executor can still return a specific retry hint.
71
+ */
72
+ parsed: unknown | null
73
+ /**
74
+ * A parse that failed at `toolCallEnd`, waiting for the end of the
75
+ * stream, which classifies it. Cleared once classified.
76
+ */
77
+ pendingFailure?: Extract<ParsedToolArguments, { ok: false }>
78
+ inputError?: ToolInputError
79
+ /** Characters the response streamed before this call began. */
80
+ precedingLength: number
81
+ /**
82
+ * A later id-less fragment could not have been told apart between this
83
+ * call and another (see `ToolCallIndexer.interleaving`). Reported
84
+ * `malformed` regardless of what its buffer parses to: it may hold
85
+ * another call's spliced-in fragments, or simply be missing whatever an
86
+ * id-less fragment carried elsewhere instead, and either way it is not
87
+ * what the model sent for this call alone.
88
+ */
89
+ interleaved?: boolean
90
+ }
37
91
 
38
92
  /**
39
93
  * Map a provider's coarse `finishReason` plus the orchestrator's
@@ -81,8 +135,26 @@ export interface StreamingTurnResult {
81
135
  * - Stream ends without `finishReason` (a known vendor-SDK failure mode
82
136
  * dropped message_stop): we still emit `message_completed` from a
83
137
  * finally-style fall-through path with `stopReason: 'refusal'`.
84
- * - `tool_input_delta` with no `toolUseId` registered yet: we drop
85
- * the fragment and log a warning (proxies seen to misorder events).
138
+ * - A tool-call fragment before its call's id or name: kept in the call's
139
+ * buffer, keyed by index, and announced in one `tool_input_delta` right
140
+ * after `tool_input_started`, once both are known. It used to be dropped
141
+ * with a warning, and the call then failed to parse and was reported as
142
+ * cut off.
143
+ * - A call whose id never arrives, on a fragment or on `toolCallEnd`: given
144
+ * one when the stream ends, and announced then. It used to reach the
145
+ * executor with an empty id and none of its arguments. Every call's
146
+ * `tool_input_completed` follows its `tool_input_started`, under the same
147
+ * id, whatever id `toolCallEnd` carries.
148
+ * - A new id on an index another call holds: the stream is refused with a
149
+ * classified `ProviderRequestError` naming the violation. The second
150
+ * call's arguments used to be appended to the first's, and the model was
151
+ * told its call had been cut off.
152
+ * - Arguments that do not parse: classified once the stream has ended, as
153
+ * `truncated` or `malformed` (`ToolInputError`). Only the call the model's
154
+ * last output went to can be `truncated`, and only when the stream reported
155
+ * an output limit, a content filter or nothing at all. A failed parse at
156
+ * `toolCallEnd` defers its `tool_input_completed` to then, because what
157
+ * follows the call and the finish reason arrive after the block closes.
86
158
  * - `chunk.error`: when no tool input is recoverable, we surface as
87
159
  * a thrown error after emitting the message_completed terminator so
88
160
  * consumer cards still close. If a tool-use block was already open,
@@ -198,6 +270,12 @@ export async function* streamProviderTurn(
198
270
  const model = ''
199
271
  const text = new StreamTextAccumulator()
200
272
  let finishReason: ChatCompletionResponse['finishReason'] = 'stop'
273
+ // What the stream itself reported, if anything. `finishReason` above
274
+ // defaults to 'stop' for the response; classifying unreadable tool input
275
+ // needs to know a stream that reported nothing from one that finished.
276
+ let reportedFinishReason: ChatCompletionResponse['finishReason'] | undefined
277
+ // Which limit a 'length' finish reached, when it was the context window.
278
+ let finishDetail: ChatCompletionResponse['finishDetail']
201
279
  let usage: ChatCompletionResponse['usage'] = {
202
280
  promptTokens: 0,
203
281
  completionTokens: 0,
@@ -205,29 +283,44 @@ export async function* streamProviderTurn(
205
283
  cachedTokens: 0,
206
284
  cacheWriteTokens: 0,
207
285
  }
208
- const toolBuckets = new Map<
209
- number,
210
- {
211
- id: string
212
- name: string
213
- argsBuf: string
214
- started: boolean
215
- completed: boolean
216
- /**
217
- * Parsed input. `null` while the bucket is still streaming.
218
- * The synthesized
219
- * `ChatCompletionResponse.toolCalls[].function.arguments` is
220
- * derived from this — never from the raw buffer — so the
221
- * downstream executor (`runtime/query/executor.ts`) never has
222
- * to re-parse a truncated string. A truncated tool call is
223
- * surfaced as `arguments: "{}"` plus `metadata.inputTruncated`
224
- * so tool args remain clean while the executor can still
225
- * return a specific retry hint.
226
- */
227
- parsed: unknown | null
228
- inputTruncated: boolean
286
+ // Characters the model streamed so far: text, reasoning and every tool
287
+ // call's arguments. Each call records it as it begins, so a cut-off call's
288
+ // share of the response says whether the call itself or what came before
289
+ // it filled the response.
290
+ let streamedLength = 0
291
+ const toolBuckets = new Map<number, ToolCallBucket>()
292
+ // Places a fragment that came without an index; see `ToolCallIndexer`.
293
+ const toolIndexer = new ToolCallIndexer()
294
+ // The call the model's latest output went to, or `undefined` once text,
295
+ // reasoning or a hosted tool followed it. An output limit, a content
296
+ // filter or a dropped stream stops the response wherever it is, so this
297
+ // is the only call one of them can have cut off. Every other call was
298
+ // complete when the model moved on from it.
299
+ let lastOutputCall: ToolCallBucket | undefined
300
+ // Announce a call once its id and name are both known: `tool_input_started`,
301
+ // then, as one delta, whatever arguments arrived before that.
302
+ async function* announceToolCall(bucket: ToolCallBucket): AsyncGenerator<SessionEvent, void> {
303
+ if (bucket.started || !bucket.id || !bucket.name) return
304
+ bucket.started = true
305
+ await emitEvent({
306
+ type: 'tool_input_started',
307
+ turnId,
308
+ iteration,
309
+ messageId,
310
+ toolUseId: bucket.id as ToolUseId,
311
+ toolName: bucket.name,
312
+ })
313
+ yield* drainPending()
314
+ if (bucket.argsBuf) {
315
+ await emitEvent({
316
+ type: 'tool_input_delta',
317
+ turnId,
318
+ toolUseId: bucket.id as ToolUseId,
319
+ partialJson: bucket.argsBuf,
320
+ })
321
+ yield* drainPending()
229
322
  }
230
- >()
323
+ }
231
324
  // Reasoning blocks, bucketed by stream index exactly like tool calls.
232
325
  // Order matters on replay — a provider wants the assistant turn echoed
233
326
  // verbatim — so the map is drained in index order at the end.
@@ -249,6 +342,8 @@ export async function* streamProviderTurn(
249
342
 
250
343
  let streamError: string | undefined
251
344
  let streamCause: unknown
345
+ /** The stream broke tool-call framing; nothing it sent becomes a tool call. */
346
+ let framingViolated = false
252
347
 
253
348
  const streamParams = {
254
349
  ...params,
@@ -373,6 +468,10 @@ export async function* streamProviderTurn(
373
468
  }
374
469
 
375
470
  if (chunk.delta.hostedTool) {
471
+ // A hosted tool starting is the model moving on. Its later status
472
+ // changes are not new output: a driver may report the completion
473
+ // only once the response is over.
474
+ if (chunk.delta.hostedTool.status === 'running') lastOutputCall = undefined
376
475
  await emitEvent({
377
476
  type: 'hosted_tool',
378
477
  turnId,
@@ -386,6 +485,9 @@ export async function* streamProviderTurn(
386
485
  const reasoning = chunk.delta.reasoning
387
486
  if (reasoning) {
388
487
  let bucket = reasoningBuckets.get(reasoning.index)
488
+ // A new reasoning block, or more of its text, is the model moving
489
+ // on. A signature or a close is not: it ends a block already begun.
490
+ if (!bucket || reasoning.text) lastOutputCall = undefined
389
491
  if (!bucket) {
390
492
  bucket = { type: reasoning.type ?? 'thinking', text: '' }
391
493
  reasoningBuckets.set(reasoning.index, bucket)
@@ -404,6 +506,7 @@ export async function* streamProviderTurn(
404
506
  if (reasoning.encrypted) bucket.encrypted = reasoning.encrypted
405
507
  if (reasoning.text) {
406
508
  bucket.text += reasoning.text
509
+ streamedLength += reasoning.text.length
407
510
  await emitEvent({
408
511
  type: 'reasoning_delta',
409
512
  turnId,
@@ -429,6 +532,13 @@ export async function* streamProviderTurn(
429
532
  }
430
533
 
431
534
  if (chunk.delta.content) {
535
+ // Text a driver adds of its own, such as a list of sources, comes
536
+ // after the model stopped. It is not the model moving on from a
537
+ // call, and not part of what came before one.
538
+ if (chunk.delta.contentOrigin !== 'driver') {
539
+ streamedLength += chunk.delta.content.length
540
+ lastOutputCall = undefined
541
+ }
432
542
  await emitEvent({
433
543
  type: 'text_delta',
434
544
  turnId,
@@ -441,7 +551,87 @@ export async function* streamProviderTurn(
441
551
  }
442
552
 
443
553
  for (const tc of chunk.delta.toolCalls ?? []) {
444
- let bucket = toolBuckets.get(tc.index)
554
+ if (isUnindexedFragment(tc)) {
555
+ // Neither an id nor an index: never a guess. Evaluated fresh
556
+ // for THIS fragment, not decided once when some call opened —
557
+ // a call's buffer stops accepting text the moment it becomes
558
+ // one complete JSON value, and only the state right now says
559
+ // which open calls still could be this fragment's target.
560
+ const placement = toolIndexer.placeUnindexedFragment((i) => {
561
+ const b = toolBuckets.get(i)
562
+ if (!b || b.completed) return false
563
+ return b.argsBuf === '' || !parseToolArguments(b.argsBuf).ok
564
+ })
565
+ if (typeof placement === 'number') {
566
+ let bucket = toolBuckets.get(placement)
567
+ if (!bucket) {
568
+ bucket = {
569
+ id: '',
570
+ name: '',
571
+ argsBuf: '',
572
+ started: false,
573
+ completed: false,
574
+ parsed: null,
575
+ precedingLength: streamedLength,
576
+ }
577
+ toolBuckets.set(placement, bucket)
578
+ lastOutputCall = bucket
579
+ }
580
+ if (tc.function?.name && !bucket.name) bucket.name = tc.function.name
581
+ const fragment = tc.function?.arguments
582
+ if (fragment) {
583
+ bucket.argsBuf += fragment
584
+ streamedLength += fragment.length
585
+ lastOutputCall = bucket
586
+ }
587
+ if (!bucket.started) {
588
+ yield* announceToolCall(bucket)
589
+ } else if (fragment) {
590
+ await emitEvent({
591
+ type: 'tool_input_delta',
592
+ turnId,
593
+ toolUseId: bucket.id as ToolUseId,
594
+ partialJson: fragment,
595
+ })
596
+ yield* drainPending()
597
+ }
598
+ } else {
599
+ // More than one open call could still have taken this
600
+ // fragment, or none could: every candidate is
601
+ // unreadable, and the fragment itself is attributed to
602
+ // none of them — appending it to a guess is exactly the
603
+ // splice this exists to refuse.
604
+ for (const candidate of placement.candidates) {
605
+ const stuck = toolBuckets.get(candidate.index)
606
+ if (stuck) stuck.interleaved = true
607
+ }
608
+ log.warn('tool-call fragments arrived interleaved with no index', {
609
+ [NAMZU.TURN_ID]: turnId,
610
+ [NAMZU.ITERATION]: iteration,
611
+ 'exception.message': describeToolCallInterleaving({
612
+ kind: 'interleaved_without_index',
613
+ candidates: placement.candidates,
614
+ }),
615
+ })
616
+ }
617
+ continue
618
+ }
619
+ const index = toolIndexer.indexOf(tc)
620
+ let bucket = toolBuckets.get(index)
621
+ const violation = toolCallFramingViolation(bucket, tc, index)
622
+ if (violation) {
623
+ // Refused, not repaired: after either violation no buffer can be
624
+ // trusted to hold one call's arguments, and guessing is what
625
+ // told a model its intact call had been cut off. Thrown so the
626
+ // stream is torn down like any other stream failure; the flag
627
+ // keeps the recovery below from turning it into tool calls.
628
+ framingViolated = true
629
+ throw new ProviderRequestError({
630
+ kind: 'server',
631
+ providerId: provider.id,
632
+ detail: describeToolCallFramingViolation(violation),
633
+ })
634
+ }
445
635
  if (!bucket) {
446
636
  bucket = {
447
637
  id: tc.id ?? '',
@@ -450,76 +640,88 @@ export async function* streamProviderTurn(
450
640
  started: false,
451
641
  completed: false,
452
642
  parsed: null,
453
- inputTruncated: false,
643
+ precedingLength: streamedLength,
454
644
  }
455
- toolBuckets.set(tc.index, bucket)
645
+ toolBuckets.set(index, bucket)
646
+ lastOutputCall = bucket
456
647
  }
457
648
  if (tc.id && !bucket.id) bucket.id = tc.id
458
649
  if (tc.function?.name && !bucket.name) bucket.name = tc.function.name
459
650
 
460
- if (!bucket.started && bucket.id && bucket.name) {
461
- bucket.started = true
651
+ // Arguments belong to the call at their index whether or not its
652
+ // id has arrived yet: the index is what groups a call's fragments.
653
+ // Until the call can be announced they are only buffered, and the
654
+ // announcement carries them.
655
+ const fragment = tc.function?.arguments
656
+ if (fragment) {
657
+ bucket.argsBuf += fragment
658
+ streamedLength += fragment.length
659
+ lastOutputCall = bucket
660
+ }
661
+
662
+ if (!bucket.started) {
663
+ yield* announceToolCall(bucket)
664
+ } else if (fragment) {
462
665
  await emitEvent({
463
- type: 'tool_input_started',
666
+ type: 'tool_input_delta',
464
667
  turnId,
465
- iteration,
466
- messageId,
467
668
  toolUseId: bucket.id as ToolUseId,
468
- toolName: bucket.name,
669
+ partialJson: fragment,
469
670
  })
470
671
  yield* drainPending()
471
672
  }
673
+ }
472
674
 
473
- const fragment = tc.function?.arguments
474
- if (fragment) {
475
- if (!bucket.id) {
476
- log.warn('tool_input_delta arrived before tool id was known; dropping fragment', {
477
- [NAMZU.TURN_ID]: turnId,
478
- 'namzu.runtime.index': tc.index,
479
- 'namzu.runtime.length': fragment.length,
480
- })
481
- } else {
482
- bucket.argsBuf += fragment
675
+ if (chunk.delta.toolCallEnd) {
676
+ const { id: endId } = chunk.delta.toolCallEnd
677
+ const index = toolIndexer.closedIndex(chunk.delta.toolCallEnd)
678
+ const bucket = index === undefined ? undefined : toolBuckets.get(index)
679
+ if (bucket && !bucket.completed) {
680
+ // The block close names the call too; a call whose id no
681
+ // fragment carried is announced by it.
682
+ if (!bucket.id && endId) bucket.id = endId
683
+ yield* announceToolCall(bucket)
684
+ }
685
+ // Settled here only once announced, and always under the id it
686
+ // was announced with, which is the id it runs under. A close
687
+ // with an empty id, or for a call whose name never came, leaves
688
+ // the call to the loop after the stream, which gives it an id
689
+ // and announces it first. The close's own id was used here
690
+ // before: an empty one completed a call that was not yet
691
+ // announced, under an id no other event of the call carried.
692
+ if (bucket?.started && !bucket.completed) {
693
+ bucket.completed = true
694
+ // An interleaved call is never taken at its buffer's word: it
695
+ // may hold another call's spliced-in fragments, or be missing
696
+ // whatever an id-less fragment carried elsewhere instead.
697
+ const parsed = bucket.interleaved
698
+ ? { ok: false as const, parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR }
699
+ : parseToolArguments(bucket.argsBuf)
700
+ if (parsed.ok) {
701
+ bucket.parsed = parsed.value
483
702
  await emitEvent({
484
- type: 'tool_input_delta',
703
+ type: 'tool_input_completed',
485
704
  turnId,
486
705
  toolUseId: bucket.id as ToolUseId,
487
- partialJson: fragment,
706
+ input: parsed.value,
488
707
  })
489
708
  yield* drainPending()
709
+ } else {
710
+ // Whether this call was cut off or malformed is decided by
711
+ // what follows it and how the response ends, and both
712
+ // arrive after the block closes. Its completion is emitted
713
+ // once the stream is over.
714
+ bucket.parsed = {}
715
+ bucket.pendingFailure = parsed
490
716
  }
491
717
  }
492
718
  }
493
719
 
494
- if (chunk.delta.toolCallEnd) {
495
- const { index, id: endId } = chunk.delta.toolCallEnd
496
- const bucket = toolBuckets.get(index)
497
- if (bucket && !bucket.completed) {
498
- bucket.completed = true
499
- let parsed: unknown = {}
500
- try {
501
- parsed = bucket.argsBuf ? JSON.parse(bucket.argsBuf) : {}
502
- } catch (err) {
503
- bucket.inputTruncated = true
504
- log.warn('tool input JSON parse failed at content_block_stop', {
505
- [NAMZU.TURN_ID]: turnId,
506
- 'namzu.runtime.tool_use_id': endId,
507
- 'exception.message': err instanceof Error ? err.message : String(err),
508
- })
509
- }
510
- bucket.parsed = parsed
511
- await emitEvent({
512
- type: 'tool_input_completed',
513
- turnId,
514
- toolUseId: endId as ToolUseId,
515
- input: parsed,
516
- ...(bucket.inputTruncated ? { inputTruncated: true } : {}),
517
- })
518
- yield* drainPending()
519
- }
720
+ if (chunk.finishReason) {
721
+ finishReason = chunk.finishReason
722
+ reportedFinishReason = chunk.finishReason
723
+ finishDetail = chunk.finishReason === 'length' ? chunk.finishDetail : undefined
520
724
  }
521
-
522
- if (chunk.finishReason) finishReason = chunk.finishReason
523
725
  // Merge (per-field max), not last-write-wins: a late usage frame that
524
726
  // omits input/cache tokens must not zero the counts seen earlier in the
525
727
  // stream, which would under-report this turn's accumulated usage.
@@ -573,76 +775,117 @@ export async function* streamProviderTurn(
573
775
  }
574
776
  }
575
777
 
576
- // Flush any tool buckets the provider failed to close (no toolCallEnd
577
- // arrived — defensive against providers that don't yet emit it, and
578
- // the load-bearing path when the provider stream ends with
579
- // `stop_reason: "max_tokens"` mid-`input_json_delta`. In that case
580
- // A provider's stream never sends a block-stop for the open
581
- // tool_use block: the upstream model ran out of completion tokens
582
- // before it could close the JSON literal, so the buffered
583
- // `argsBuf` ends with something like `"content":"…some prefix` —
584
- // not parseable.
778
+ // A call whose id never arrived is still one call: its index grouped its
779
+ // fragments. Only the name its result is filed under is missing, so it is
780
+ // given one, as a driver does for a wire that sends none, and announced.
781
+ for (const bucket of toolBuckets.values()) {
782
+ if (bucket.id || !bucket.name) continue
783
+ bucket.id = generateToolCallId()
784
+ log.warn('tool call arrived without an id; one was assigned', {
785
+ [NAMZU.TURN_ID]: turnId,
786
+ 'namzu.runtime.tool_use_id': bucket.id,
787
+ [GENAI.TOOL_NAME]: bucket.name,
788
+ })
789
+ yield* announceToolCall(bucket)
790
+ }
791
+
792
+ // Settle every tool call the stream left open or unreadable. Two paths
793
+ // arrive here:
794
+ //
795
+ // 1. No `toolCallEnd` came for the call — a driver that never emits one
796
+ // (every call then settles here), or a stream that stopped before
797
+ // the block closed. A buffer that parses is kept.
798
+ // 2. `toolCallEnd` came and the buffer did not parse. Its completion was
799
+ // held back until now, because what it is depends on how the
800
+ // response ended.
585
801
  //
586
- // Two cases coalesce here:
587
- // 1. The buffer parses cleanly (the provider just forgot to emit
588
- // `content_block_stop` but the args are intact) — keep parsed.
589
- // 2. The buffer is truncated mid-literal — `parsed = {}` is the
590
- // safe fallback so the executor's `JSON.parse(arguments)`
591
- // succeeds and downstream consumers don't crash. The PRICE
592
- // we used to pay was the model getting back a generic
593
- // "<field> is required" Zod error and not realising its
594
- // previous tool call was truncated server-side, so it would
595
- // retry with the SAME long input and hit the same cutoff in
596
- // a loop. Detect the truncation case and mark the tool call
597
- // with runtime metadata; the executor surfaces a specific
598
- // "your tool call was cut off by max_tokens — retry with
599
- // shorter input or split into smaller calls" message that the
600
- // model can act on.
802
+ // An unreadable buffer becomes `parsed = {}` — the safe fallback, so the
803
+ // executor's `JSON.parse(arguments)` succeeds and nothing downstream
804
+ // crashes — plus `inputError`. It is `truncated` only for the call the
805
+ // model's last output went to, when the output limit or a content filter
806
+ // stopped the response or it reported nothing at all: whatever stopped
807
+ // the response could cut no other call. Every other unreadable call is
808
+ // `malformed`: the response finished normally, or the model moved on to
809
+ // more output, so it had finished writing the call. The executor turns
810
+ // that into a message the model can act on. Without it the model got a
811
+ // generic "<field> is required" error for a call it did not know was
812
+ // broken, and a cut-off call came back with the same long input, into
813
+ // the same cutoff, in a loop. Calling a malformed call cut off tells the
814
+ // model to send less, which does not fix its JSON.
601
815
  for (const bucket of toolBuckets.values()) {
602
- if (bucket.started && !bucket.completed) {
816
+ let failure = bucket.pendingFailure
817
+ if (!failure) {
818
+ if (!bucket.started || bucket.completed) continue
603
819
  bucket.completed = true
604
- let parsed: unknown = {}
605
- let truncated = false
606
- if (bucket.argsBuf) {
607
- try {
608
- parsed = JSON.parse(bucket.argsBuf)
609
- } catch {
610
- // argsBuf had content but didn't parse — almost
611
- // certainly the max_tokens-mid-literal cutoff. Mark
612
- // the bucket so the executor can return a model-
613
- // readable hint instead of a generic Zod error.
614
- truncated = true
615
- parsed = {}
616
- }
617
- }
618
- bucket.parsed = parsed
619
- bucket.inputTruncated = truncated
620
- if (truncated) {
621
- log.warn('tool input truncated by upstream cutoff (no toolCallEnd, argsBuf unparsable)', {
622
- [NAMZU.TURN_ID]: turnId,
623
- 'namzu.runtime.tool_use_id': bucket.id,
624
- [GENAI.TOOL_NAME]: bucket.name,
625
- 'namzu.runtime.buffer_length': bucket.argsBuf.length,
820
+ const parsed = bucket.interleaved
821
+ ? { ok: false as const, parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR }
822
+ : parseToolArguments(bucket.argsBuf)
823
+ if (parsed.ok) {
824
+ bucket.parsed = parsed.value
825
+ await emitEvent({
826
+ type: 'tool_input_completed',
827
+ turnId,
828
+ toolUseId: bucket.id as ToolUseId,
829
+ input: parsed.value,
626
830
  })
831
+ yield* drainPending()
832
+ continue
627
833
  }
628
- await emitEvent({
629
- type: 'tool_input_completed',
630
- turnId,
631
- toolUseId: bucket.id as ToolUseId,
632
- input: parsed,
633
- ...(truncated ? { inputTruncated: true } : {}),
634
- })
635
- yield* drainPending()
834
+ failure = parsed
636
835
  }
836
+ bucket.pendingFailure = undefined
837
+ bucket.parsed = {}
838
+ // An interleaved call is always `malformed`, never `classifyUnreadableToolInput`'s
839
+ // call: whether it happens to be this response's last output and
840
+ // whether the response was cut off are both beside the point here —
841
+ // the buffer it would be judged by cannot be trusted either way.
842
+ const inputError: ToolInputError = bucket.interleaved
843
+ ? {
844
+ reason: 'malformed',
845
+ parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR,
846
+ length: bucket.argsBuf.length,
847
+ precedingLength: bucket.precedingLength,
848
+ }
849
+ : classifyUnreadableToolInput(
850
+ failure,
851
+ {
852
+ length: bucket.argsBuf.length,
853
+ precedingLength: bucket.precedingLength,
854
+ last: bucket === lastOutputCall,
855
+ },
856
+ reportedFinishReason,
857
+ usage,
858
+ finishDetail,
859
+ )
860
+ bucket.inputError = inputError
861
+ log.warn('tool input could not be read', {
862
+ [NAMZU.TURN_ID]: turnId,
863
+ 'namzu.runtime.tool_use_id': bucket.id,
864
+ [GENAI.TOOL_NAME]: bucket.name,
865
+ 'namzu.runtime.reason': inputError.reason,
866
+ 'namzu.runtime.finish_reason': reportedFinishReason ?? 'none',
867
+ 'namzu.runtime.buffer_length': bucket.argsBuf.length,
868
+ 'exception.message': inputError.parseError,
869
+ })
870
+ await emitEvent({
871
+ type: 'tool_input_completed',
872
+ turnId,
873
+ toolUseId: bucket.id as ToolUseId,
874
+ input: {},
875
+ inputTruncated: true,
876
+ inputError,
877
+ partialArguments: capPartialArguments(bucket.argsBuf),
878
+ })
879
+ yield* drainPending()
637
880
  }
638
881
 
639
882
  // `arguments` MUST be valid JSON for the executor's `JSON.parse`
640
883
  // (`runtime/query/executor.ts:executeSingle`) to succeed. We
641
884
  // always serialise from the bucket's `parsed` object (filled by
642
885
  // either the `toolCallEnd` branch above or the post-stream flush
643
- // loop) instead of re-emitting `argsBuf`. When the provider
644
- // stream truncated mid-input, `metadata.inputTruncated` carries that
645
- // state; the executor parses cleanly and returns a specific
886
+ // loop) instead of re-emitting `argsBuf`. When the arguments could not
887
+ // be read, `metadata.inputTruncated` and `metadata.inputError` carry
888
+ // that state; the executor parses cleanly and returns a specific
646
889
  // model-readable retry hint instead of the generic "Invalid JSON in
647
890
  // tool arguments" intercept.
648
891
  const toolCalls = [...toolBuckets.entries()]
@@ -658,13 +901,23 @@ export async function* streamProviderTurn(
658
901
  // normalized to `{}` above, so without this the only record of
659
902
  // what the model was actually saying is gone — and a
660
903
  // `repairToolCall` hook has nothing to repair.
661
- ...(b.inputTruncated
662
- ? { metadata: { inputTruncated: true, partialArguments: b.argsBuf } }
904
+ ...(b.inputError
905
+ ? {
906
+ metadata: {
907
+ inputTruncated: true,
908
+ partialArguments: b.argsBuf,
909
+ inputError: b.inputError,
910
+ },
911
+ }
663
912
  : {}),
664
913
  }))
665
914
 
915
+ // Not after a framing violation: the calls it would recover are the ones
916
+ // the stream was just refused for garbling.
666
917
  const recoveredToolInputFromStreamError =
667
- streamError !== undefined && toolCalls.some((tc) => tc.id && tc.function.name)
918
+ streamError !== undefined &&
919
+ !framingViolated &&
920
+ toolCalls.some((tc) => tc.id && tc.function.name)
668
921
  const effectiveFinishReason: ChatCompletionResponse['finishReason'] =
669
922
  recoveredToolInputFromStreamError ? 'tool_calls' : finishReason
670
923
 
@@ -752,6 +1005,7 @@ export async function* streamProviderTurn(
752
1005
  ...(citations.length > 0 ? { citations } : {}),
753
1006
  },
754
1007
  finishReason: effectiveFinishReason,
1008
+ ...(effectiveFinishReason === 'length' && finishDetail ? { finishDetail } : {}),
755
1009
  usage,
756
1010
  }
757
1011