@namzu/sdk 46.0.0 → 48.0.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 (732) hide show
  1. package/CHANGELOG.md +325 -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 +60 -4
  108. package/dist/connector/mcp/adapter.js.map +1 -1
  109. package/dist/connector/mcp/client.d.ts +13 -4
  110. package/dist/connector/mcp/client.d.ts.map +1 -1
  111. package/dist/connector/mcp/client.js +20 -3
  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/index.d.ts +2 -0
  118. package/dist/connector/mcp/index.d.ts.map +1 -1
  119. package/dist/connector/mcp/index.js +11 -0
  120. package/dist/connector/mcp/index.js.map +1 -1
  121. package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
  122. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
  123. package/dist/connector/mcp/mcp-toolset.js +399 -0
  124. package/dist/connector/mcp/mcp-toolset.js.map +1 -0
  125. package/dist/connector/tools/index.d.ts +2 -2
  126. package/dist/connector/tools/index.d.ts.map +1 -1
  127. package/dist/connector/tools/index.js +1 -1
  128. package/dist/connector/tools/index.js.map +1 -1
  129. package/dist/connector/tools/router.d.ts +15 -13
  130. package/dist/connector/tools/router.d.ts.map +1 -1
  131. package/dist/connector/tools/router.js +30 -51
  132. package/dist/connector/tools/router.js.map +1 -1
  133. package/dist/contracts/a2a.d.ts +2 -2
  134. package/dist/directory/derive-supervisor.d.ts +2 -2
  135. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  136. package/dist/directory/derive-supervisor.js +6 -7
  137. package/dist/directory/derive-supervisor.js.map +1 -1
  138. package/dist/directory/derive.d.ts.map +1 -1
  139. package/dist/directory/derive.js +5 -5
  140. package/dist/directory/derive.js.map +1 -1
  141. package/dist/execution/code-runtime/types.d.ts +2 -2
  142. package/dist/execution/code-runtime/types.js +1 -1
  143. package/dist/invariants/index.d.ts +2 -1
  144. package/dist/invariants/index.d.ts.map +1 -1
  145. package/dist/invariants/index.js +3 -2
  146. package/dist/invariants/index.js.map +1 -1
  147. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  148. package/dist/manager/agent/lifecycle.js +9 -0
  149. package/dist/manager/agent/lifecycle.js.map +1 -1
  150. package/dist/manager/connector/environment.d.ts +6 -0
  151. package/dist/manager/connector/environment.d.ts.map +1 -1
  152. package/dist/manager/connector/environment.js +11 -4
  153. package/dist/manager/connector/environment.js.map +1 -1
  154. package/dist/manager/connector/index.d.ts +2 -2
  155. package/dist/manager/connector/index.d.ts.map +1 -1
  156. package/dist/manager/connector/index.js +2 -2
  157. package/dist/manager/connector/index.js.map +1 -1
  158. package/dist/manager/connector/tenant.d.ts +6 -0
  159. package/dist/manager/connector/tenant.d.ts.map +1 -1
  160. package/dist/manager/connector/tenant.js +11 -4
  161. package/dist/manager/connector/tenant.js.map +1 -1
  162. package/dist/manager/index.d.ts +2 -2
  163. package/dist/manager/index.d.ts.map +1 -1
  164. package/dist/manager/index.js +2 -2
  165. package/dist/manager/index.js.map +1 -1
  166. package/dist/manager/resident/learning-observation.d.ts +4 -4
  167. package/dist/manager/resident/learning.d.ts +36 -36
  168. package/dist/manager/session/attribution.d.ts +22 -0
  169. package/dist/manager/session/attribution.d.ts.map +1 -0
  170. package/dist/manager/session/attribution.js +64 -0
  171. package/dist/manager/session/attribution.js.map +1 -0
  172. package/dist/manager/session/turn-recorder.d.ts +14 -0
  173. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  174. package/dist/manager/session/turn-recorder.js +208 -55
  175. package/dist/manager/session/turn-recorder.js.map +1 -1
  176. package/dist/peers/address.d.ts +36 -0
  177. package/dist/peers/address.d.ts.map +1 -0
  178. package/dist/peers/address.js +52 -0
  179. package/dist/peers/address.js.map +1 -0
  180. package/dist/peers/client.d.ts +47 -0
  181. package/dist/peers/client.d.ts.map +1 -0
  182. package/dist/peers/client.js +132 -0
  183. package/dist/peers/client.js.map +1 -0
  184. package/dist/peers/dir.d.ts +88 -0
  185. package/dist/peers/dir.d.ts.map +1 -0
  186. package/dist/peers/dir.js +139 -0
  187. package/dist/peers/dir.js.map +1 -0
  188. package/dist/peers/endpoint.d.ts +144 -0
  189. package/dist/peers/endpoint.d.ts.map +1 -0
  190. package/dist/peers/endpoint.js +420 -0
  191. package/dist/peers/endpoint.js.map +1 -0
  192. package/dist/peers/envelope.d.ts +42 -0
  193. package/dist/peers/envelope.d.ts.map +1 -0
  194. package/dist/peers/envelope.js +110 -0
  195. package/dist/peers/envelope.js.map +1 -0
  196. package/dist/peers/index.d.ts +30 -0
  197. package/dist/peers/index.d.ts.map +1 -0
  198. package/dist/peers/index.js +22 -0
  199. package/dist/peers/index.js.map +1 -0
  200. package/dist/peers/protocol.d.ts +645 -0
  201. package/dist/peers/protocol.d.ts.map +1 -0
  202. package/dist/peers/protocol.js +151 -0
  203. package/dist/peers/protocol.js.map +1 -0
  204. package/dist/peers/record.d.ts +71 -0
  205. package/dist/peers/record.d.ts.map +1 -0
  206. package/dist/peers/record.js +45 -0
  207. package/dist/peers/record.js.map +1 -0
  208. package/dist/peers/registry.d.ts +54 -0
  209. package/dist/peers/registry.d.ts.map +1 -0
  210. package/dist/peers/registry.js +213 -0
  211. package/dist/peers/registry.js.map +1 -0
  212. package/dist/plugin/define.d.ts +24 -0
  213. package/dist/plugin/define.d.ts.map +1 -0
  214. package/dist/plugin/define.js +42 -0
  215. package/dist/plugin/define.js.map +1 -0
  216. package/dist/plugin/index.d.ts +2 -0
  217. package/dist/plugin/index.d.ts.map +1 -1
  218. package/dist/plugin/index.js +1 -0
  219. package/dist/plugin/index.js.map +1 -1
  220. package/dist/plugin/lifecycle.d.ts +27 -3
  221. package/dist/plugin/lifecycle.d.ts.map +1 -1
  222. package/dist/plugin/lifecycle.js +242 -92
  223. package/dist/plugin/lifecycle.js.map +1 -1
  224. package/dist/plugin/resolver.d.ts +2 -2
  225. package/dist/plugin/resolver.d.ts.map +1 -1
  226. package/dist/plugin/resolver.js.map +1 -1
  227. package/dist/plugin/shell-hook.d.ts.map +1 -1
  228. package/dist/plugin/shell-hook.js +17 -3
  229. package/dist/plugin/shell-hook.js.map +1 -1
  230. package/dist/probe/errors.d.ts +2 -1
  231. package/dist/probe/errors.d.ts.map +1 -1
  232. package/dist/probe/errors.js +3 -2
  233. package/dist/probe/errors.js.map +1 -1
  234. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  235. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  236. package/dist/prompt/coding-agent-doctrine.js +11 -6
  237. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  238. package/dist/prompt/contributions.d.ts +4 -1
  239. package/dist/prompt/contributions.d.ts.map +1 -1
  240. package/dist/prompt/contributions.js +7 -2
  241. package/dist/prompt/contributions.js.map +1 -1
  242. package/dist/prompt/index.d.ts +1 -1
  243. package/dist/prompt/index.d.ts.map +1 -1
  244. package/dist/prompt/index.js +1 -1
  245. package/dist/prompt/index.js.map +1 -1
  246. package/dist/provider/collect-chat-completion.d.ts +6 -1
  247. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  248. package/dist/provider/collect-chat-completion.js +88 -10
  249. package/dist/provider/collect-chat-completion.js.map +1 -1
  250. package/dist/provider/mock.d.ts.map +1 -1
  251. package/dist/provider/mock.js +23 -6
  252. package/dist/provider/mock.js.map +1 -1
  253. package/dist/provider/registry.d.ts +2 -1
  254. package/dist/provider/registry.d.ts.map +1 -1
  255. package/dist/provider/registry.js +3 -2
  256. package/dist/provider/registry.js.map +1 -1
  257. package/dist/provider/tool-call-framing.d.ts +164 -0
  258. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  259. package/dist/provider/tool-call-framing.js +163 -0
  260. package/dist/provider/tool-call-framing.js.map +1 -0
  261. package/dist/public-runtime.d.ts +24 -11
  262. package/dist/public-runtime.d.ts.map +1 -1
  263. package/dist/public-runtime.js +45 -9
  264. package/dist/public-runtime.js.map +1 -1
  265. package/dist/public-tools.d.ts +6 -4
  266. package/dist/public-tools.d.ts.map +1 -1
  267. package/dist/public-tools.js +8 -3
  268. package/dist/public-tools.js.map +1 -1
  269. package/dist/public-types.d.ts +13 -2
  270. package/dist/public-types.d.ts.map +1 -1
  271. package/dist/read-model/registry.d.ts +2 -1
  272. package/dist/read-model/registry.d.ts.map +1 -1
  273. package/dist/read-model/registry.js +3 -2
  274. package/dist/read-model/registry.js.map +1 -1
  275. package/dist/registry/ManagedRegistry.d.ts +30 -0
  276. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  277. package/dist/registry/ManagedRegistry.js +45 -6
  278. package/dist/registry/ManagedRegistry.js.map +1 -1
  279. package/dist/registry/collision.d.ts +57 -0
  280. package/dist/registry/collision.d.ts.map +1 -0
  281. package/dist/registry/collision.js +41 -0
  282. package/dist/registry/collision.js.map +1 -0
  283. package/dist/registry/command/index.d.ts +5 -3
  284. package/dist/registry/command/index.d.ts.map +1 -1
  285. package/dist/registry/command/index.js +6 -4
  286. package/dist/registry/command/index.js.map +1 -1
  287. package/dist/registry/index.d.ts +3 -4
  288. package/dist/registry/index.d.ts.map +1 -1
  289. package/dist/registry/index.js +2 -2
  290. package/dist/registry/index.js.map +1 -1
  291. package/dist/registry/plugin/index.d.ts.map +1 -1
  292. package/dist/registry/plugin/index.js +14 -1
  293. package/dist/registry/plugin/index.js.map +1 -1
  294. package/dist/registry/tool/callable.d.ts +7 -7
  295. package/dist/registry/tool/callable.d.ts.map +1 -1
  296. package/dist/registry/tool/callable.js +6 -7
  297. package/dist/registry/tool/callable.js.map +1 -1
  298. package/dist/registry/tool/execute.d.ts +14 -77
  299. package/dist/registry/tool/execute.d.ts.map +1 -1
  300. package/dist/registry/tool/execute.js +15 -727
  301. package/dist/registry/tool/execute.js.map +1 -1
  302. package/dist/registry/tool/portable.d.ts +25 -0
  303. package/dist/registry/tool/portable.d.ts.map +1 -1
  304. package/dist/registry/tool/portable.js +50 -0
  305. package/dist/registry/tool/portable.js.map +1 -1
  306. package/dist/registry/tool/presentation.d.ts +6 -5
  307. package/dist/registry/tool/presentation.d.ts.map +1 -1
  308. package/dist/registry/tool/presentation.js +3 -3
  309. package/dist/registry/tool/presentation.js.map +1 -1
  310. package/dist/runtime/bidi/session.d.ts +5 -4
  311. package/dist/runtime/bidi/session.d.ts.map +1 -1
  312. package/dist/runtime/bidi/session.js +18 -1
  313. package/dist/runtime/bidi/session.js.map +1 -1
  314. package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
  315. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  316. package/dist/runtime/query/executor/tool-call-admission.js +189 -5
  317. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  318. package/dist/runtime/query/executor.d.ts +33 -3
  319. package/dist/runtime/query/executor.d.ts.map +1 -1
  320. package/dist/runtime/query/executor.js +86 -10
  321. package/dist/runtime/query/executor.js.map +1 -1
  322. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  323. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  324. package/dist/runtime/query/file-evidence-replay.js +8 -7
  325. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  326. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  327. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  328. package/dist/runtime/query/fork/prepare.js +4 -0
  329. package/dist/runtime/query/fork/prepare.js.map +1 -1
  330. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  331. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  332. package/dist/runtime/query/guardrail-presets.js +4 -3
  333. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  334. package/dist/runtime/query/index.d.ts +23 -10
  335. package/dist/runtime/query/index.d.ts.map +1 -1
  336. package/dist/runtime/query/index.js +149 -70
  337. package/dist/runtime/query/index.js.map +1 -1
  338. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  339. package/dist/runtime/query/iteration/index.js +8 -1
  340. package/dist/runtime/query/iteration/index.js.map +1 -1
  341. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  342. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  343. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  344. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  345. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  346. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  347. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  348. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  350. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  351. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  352. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  353. package/dist/runtime/query/iteration/tool-input.js +291 -0
  354. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  355. package/dist/runtime/query/observation-context.d.ts +2 -2
  356. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  357. package/dist/runtime/query/observation-context.js.map +1 -1
  358. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  359. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  360. package/dist/runtime/query/prelude-lease.js +121 -0
  361. package/dist/runtime/query/prelude-lease.js.map +1 -0
  362. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  363. package/dist/runtime/query/prepare-turn.js +386 -187
  364. package/dist/runtime/query/prepare-turn.js.map +1 -1
  365. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  366. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  367. package/dist/runtime/query/prompt.d.ts +2 -2
  368. package/dist/runtime/query/prompt.d.ts.map +1 -1
  369. package/dist/runtime/query/prompt.js +1 -1
  370. package/dist/runtime/query/prompt.js.map +1 -1
  371. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  372. package/dist/runtime/query/resume-session.js +37 -2
  373. package/dist/runtime/query/resume-session.js.map +1 -1
  374. package/dist/runtime/query/review-policy.d.ts +22 -3
  375. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  376. package/dist/runtime/query/review-policy.js +84 -6
  377. package/dist/runtime/query/review-policy.js.map +1 -1
  378. package/dist/runtime/query/tooling.d.ts +3 -2
  379. package/dist/runtime/query/tooling.d.ts.map +1 -1
  380. package/dist/runtime/query/tooling.js.map +1 -1
  381. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  382. package/dist/runtime/query/turn-state.js +5 -0
  383. package/dist/runtime/query/turn-state.js.map +1 -1
  384. package/dist/runtime/system-events.d.ts +112 -0
  385. package/dist/runtime/system-events.d.ts.map +1 -0
  386. package/dist/runtime/system-events.js +183 -0
  387. package/dist/runtime/system-events.js.map +1 -0
  388. package/dist/scheduler/delegating.d.ts +2 -1
  389. package/dist/scheduler/delegating.d.ts.map +1 -1
  390. package/dist/scheduler/delegating.js +3 -2
  391. package/dist/scheduler/delegating.js.map +1 -1
  392. package/dist/skills/index.d.ts +1 -1
  393. package/dist/skills/index.d.ts.map +1 -1
  394. package/dist/skills/index.js +1 -1
  395. package/dist/skills/index.js.map +1 -1
  396. package/dist/skills/registry.d.ts +12 -0
  397. package/dist/skills/registry.d.ts.map +1 -1
  398. package/dist/skills/registry.js +19 -0
  399. package/dist/skills/registry.js.map +1 -1
  400. package/dist/store/evidence/index-page.d.ts +2 -2
  401. package/dist/store/session-log/conformance.d.ts +1 -1
  402. package/dist/store/session-log/conformance.d.ts.map +1 -1
  403. package/dist/store/session-log/conformance.js +49 -8
  404. package/dist/store/session-log/conformance.js.map +1 -1
  405. package/dist/store/session-log/core.d.ts +8 -3
  406. package/dist/store/session-log/core.d.ts.map +1 -1
  407. package/dist/store/session-log/core.js +2 -1
  408. package/dist/store/session-log/core.js.map +1 -1
  409. package/dist/store/session-log/fold.d.ts +12 -0
  410. package/dist/store/session-log/fold.d.ts.map +1 -1
  411. package/dist/store/session-log/fold.js +57 -7
  412. package/dist/store/session-log/fold.js.map +1 -1
  413. package/dist/store/session-log/index.d.ts +2 -2
  414. package/dist/store/session-log/index.d.ts.map +1 -1
  415. package/dist/store/session-log/index.js +1 -1
  416. package/dist/store/session-log/index.js.map +1 -1
  417. package/dist/test-support/toolset.d.ts +19 -0
  418. package/dist/test-support/toolset.d.ts.map +1 -0
  419. package/dist/test-support/toolset.js +20 -0
  420. package/dist/test-support/toolset.js.map +1 -0
  421. package/dist/tools/builtins/bash.d.ts +29 -0
  422. package/dist/tools/builtins/bash.d.ts.map +1 -1
  423. package/dist/tools/builtins/bash.js +19 -9
  424. package/dist/tools/builtins/bash.js.map +1 -1
  425. package/dist/tools/builtins/browser-url.d.ts +1 -1
  426. package/dist/tools/builtins/browser-url.js +1 -1
  427. package/dist/tools/builtins/browser.d.ts +6 -6
  428. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  429. package/dist/tools/builtins/computer-use.js +19 -11
  430. package/dist/tools/builtins/computer-use.js.map +1 -1
  431. package/dist/tools/builtins/edit.d.ts.map +1 -1
  432. package/dist/tools/builtins/edit.js +9 -1
  433. package/dist/tools/builtins/edit.js.map +1 -1
  434. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  435. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  436. package/dist/tools/builtins/json-string-hint.js +17 -0
  437. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  438. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  439. package/dist/tools/builtins/search-tools.js +7 -15
  440. package/dist/tools/builtins/search-tools.js.map +1 -1
  441. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  442. package/dist/tools/builtins/write-file.js +11 -0
  443. package/dist/tools/builtins/write-file.js.map +1 -1
  444. package/dist/tools/command-shell.d.ts +10 -0
  445. package/dist/tools/command-shell.d.ts.map +1 -1
  446. package/dist/tools/command-shell.js +45 -1
  447. package/dist/tools/command-shell.js.map +1 -1
  448. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  449. package/dist/tools/coordinator/agent.js +5 -0
  450. package/dist/tools/coordinator/agent.js.map +1 -1
  451. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
  452. package/dist/tools/coordinator/ask-user-question.js +26 -13
  453. package/dist/tools/coordinator/ask-user-question.js.map +1 -1
  454. package/dist/tools/coordinator/index.d.ts.map +1 -1
  455. package/dist/tools/coordinator/index.js +5 -0
  456. package/dist/tools/coordinator/index.js.map +1 -1
  457. package/dist/tools/coordinator/question-options.d.ts +78 -0
  458. package/dist/tools/coordinator/question-options.d.ts.map +1 -0
  459. package/dist/tools/coordinator/question-options.js +153 -0
  460. package/dist/tools/coordinator/question-options.js.map +1 -0
  461. package/dist/tools/defineTool.d.ts +10 -0
  462. package/dist/tools/defineTool.d.ts.map +1 -1
  463. package/dist/tools/defineTool.js +17 -0
  464. package/dist/tools/defineTool.js.map +1 -1
  465. package/dist/tools/memory/search.d.ts.map +1 -1
  466. package/dist/tools/memory/search.js +4 -1
  467. package/dist/tools/memory/search.js.map +1 -1
  468. package/dist/tools/memory/update.d.ts.map +1 -1
  469. package/dist/tools/memory/update.js +8 -5
  470. package/dist/tools/memory/update.js.map +1 -1
  471. package/dist/tools/render-nonce.d.ts +47 -0
  472. package/dist/tools/render-nonce.d.ts.map +1 -0
  473. package/dist/tools/render-nonce.js +63 -0
  474. package/dist/tools/render-nonce.js.map +1 -0
  475. package/dist/tools/roster.d.ts +46 -19
  476. package/dist/tools/roster.d.ts.map +1 -1
  477. package/dist/tools/roster.js +63 -33
  478. package/dist/tools/roster.js.map +1 -1
  479. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  480. package/dist/tools/schedules/schedule-tool.js +94 -14
  481. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  482. package/dist/tools/schedules/types.d.ts +52 -6
  483. package/dist/tools/schedules/types.d.ts.map +1 -1
  484. package/dist/tools/trusted-read-only.d.ts +9 -5
  485. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  486. package/dist/tools/trusted-read-only.js +14 -10
  487. package/dist/tools/trusted-read-only.js.map +1 -1
  488. package/dist/tools/untrusted-envelope.d.ts +67 -28
  489. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  490. package/dist/tools/untrusted-envelope.js +108 -59
  491. package/dist/tools/untrusted-envelope.js.map +1 -1
  492. package/dist/toolsets/combine.d.ts +44 -0
  493. package/dist/toolsets/combine.d.ts.map +1 -0
  494. package/dist/toolsets/combine.js +153 -0
  495. package/dist/toolsets/combine.js.map +1 -0
  496. package/dist/toolsets/manager.d.ts +201 -0
  497. package/dist/toolsets/manager.d.ts.map +1 -0
  498. package/dist/toolsets/manager.js +837 -0
  499. package/dist/toolsets/manager.js.map +1 -0
  500. package/dist/toolsets/source-glob.d.ts +15 -0
  501. package/dist/toolsets/source-glob.d.ts.map +1 -0
  502. package/dist/toolsets/source-glob.js +23 -0
  503. package/dist/toolsets/source-glob.js.map +1 -0
  504. package/dist/toolsets/toolset.d.ts +20 -0
  505. package/dist/toolsets/toolset.d.ts.map +1 -0
  506. package/dist/toolsets/toolset.js +28 -0
  507. package/dist/toolsets/toolset.js.map +1 -0
  508. package/dist/toolsets/types.d.ts +128 -0
  509. package/dist/toolsets/types.d.ts.map +1 -0
  510. package/dist/toolsets/types.js +33 -0
  511. package/dist/toolsets/types.js.map +1 -0
  512. package/dist/toolsets/wrappers.d.ts +59 -0
  513. package/dist/toolsets/wrappers.d.ts.map +1 -0
  514. package/dist/toolsets/wrappers.js +165 -0
  515. package/dist/toolsets/wrappers.js.map +1 -0
  516. package/dist/types/agent/base.d.ts +27 -16
  517. package/dist/types/agent/base.d.ts.map +1 -1
  518. package/dist/types/agent/index.d.ts +1 -0
  519. package/dist/types/agent/index.d.ts.map +1 -1
  520. package/dist/types/agent/index.js +1 -0
  521. package/dist/types/agent/index.js.map +1 -1
  522. package/dist/types/agent/pipeline.d.ts +2 -0
  523. package/dist/types/agent/pipeline.d.ts.map +1 -1
  524. package/dist/types/agent/query.d.ts +117 -0
  525. package/dist/types/agent/query.d.ts.map +1 -0
  526. package/dist/types/agent/query.js +2 -0
  527. package/dist/types/agent/query.js.map +1 -0
  528. package/dist/types/agent/reactive.d.ts +2 -129
  529. package/dist/types/agent/reactive.d.ts.map +1 -1
  530. package/dist/types/agent/router.d.ts +2 -0
  531. package/dist/types/agent/router.d.ts.map +1 -1
  532. package/dist/types/agent/supervisor.d.ts +5 -2
  533. package/dist/types/agent/supervisor.d.ts.map +1 -1
  534. package/dist/types/authorization/index.d.ts +49 -12
  535. package/dist/types/authorization/index.d.ts.map +1 -1
  536. package/dist/types/authorization/index.js +6 -0
  537. package/dist/types/authorization/index.js.map +1 -1
  538. package/dist/types/connector/mcp.d.ts +32 -0
  539. package/dist/types/connector/mcp.d.ts.map +1 -1
  540. package/dist/types/errors/index.d.ts +15 -0
  541. package/dist/types/errors/index.d.ts.map +1 -1
  542. package/dist/types/errors/index.js.map +1 -1
  543. package/dist/types/hitl/index.d.ts +57 -0
  544. package/dist/types/hitl/index.d.ts.map +1 -1
  545. package/dist/types/hitl/index.js.map +1 -1
  546. package/dist/types/message/index.d.ts +130 -9
  547. package/dist/types/message/index.d.ts.map +1 -1
  548. package/dist/types/message/index.js +4 -1
  549. package/dist/types/message/index.js.map +1 -1
  550. package/dist/types/plugin/index.d.ts +22 -4
  551. package/dist/types/plugin/index.d.ts.map +1 -1
  552. package/dist/types/plugin/index.js +1 -0
  553. package/dist/types/plugin/index.js.map +1 -1
  554. package/dist/types/provider/chat.d.ts +5 -0
  555. package/dist/types/provider/chat.d.ts.map +1 -1
  556. package/dist/types/provider/config.d.ts +8 -3
  557. package/dist/types/provider/config.d.ts.map +1 -1
  558. package/dist/types/provider/stream.d.ts +39 -0
  559. package/dist/types/provider/stream.d.ts.map +1 -1
  560. package/dist/types/sandbox/index.d.ts +1 -1
  561. package/dist/types/session/events.d.ts +14 -3
  562. package/dist/types/session/events.d.ts.map +1 -1
  563. package/dist/types/session/events.js.map +1 -1
  564. package/dist/types/tool/index.d.ts +152 -91
  565. package/dist/types/tool/index.d.ts.map +1 -1
  566. package/dist/types/tool/index.js.map +1 -1
  567. package/dist/types/toolset/index.d.ts +10 -40
  568. package/dist/types/toolset/index.d.ts.map +1 -1
  569. package/package.json +1 -1
  570. package/src/advisory/history.ts +27 -2
  571. package/src/advisory/index.ts +1 -1
  572. package/src/advisory/registry.ts +33 -0
  573. package/src/agents/AGENTS.md +14 -7
  574. package/src/agents/PipelineAgent.ts +2 -303
  575. package/src/agents/QueryAgent.ts +269 -0
  576. package/src/agents/ReactiveAgent.ts +6 -216
  577. package/src/agents/RouterAgent.ts +2 -337
  578. package/src/agents/SupervisorAgent.ts +3 -476
  579. package/src/agents/defineAgent.ts +13 -2
  580. package/src/agents/examples/PipelineAgent.ts +302 -0
  581. package/src/agents/examples/RouterAgent.ts +338 -0
  582. package/src/agents/examples/SupervisorAgent.ts +472 -0
  583. package/src/agents/explore.ts +6 -3
  584. package/src/agents/forward-options.ts +37 -0
  585. package/src/agents/index.ts +2 -0
  586. package/src/agents/runAgent.ts +144 -37
  587. package/src/authorization/command-line.ts +2 -2
  588. package/src/authorization/gate.ts +21 -1
  589. package/src/authorization/program.ts +773 -0
  590. package/src/authorization/reexec-wrapper.ts +589 -0
  591. package/src/authorization/rules.ts +18 -1
  592. package/src/authorization/shell-lexer.ts +104 -59
  593. package/src/bridge/sse/mapper.ts +6 -0
  594. package/src/capabilities/index.ts +157 -0
  595. package/src/config/registry.ts +4 -1
  596. package/src/connector/index.ts +9 -2
  597. package/src/connector/mcp/adapter.ts +58 -3
  598. package/src/connector/mcp/client.ts +20 -4
  599. package/src/connector/mcp/discovery.ts +60 -0
  600. package/src/connector/mcp/index.ts +13 -0
  601. package/src/connector/mcp/mcp-toolset.ts +515 -0
  602. package/src/connector/tools/index.ts +2 -2
  603. package/src/connector/tools/router.ts +35 -58
  604. package/src/directory/derive-supervisor.ts +12 -8
  605. package/src/directory/derive.ts +8 -5
  606. package/src/execution/code-runtime/types.ts +2 -2
  607. package/src/invariants/index.ts +4 -1
  608. package/src/manager/agent/lifecycle.ts +9 -0
  609. package/src/manager/connector/environment.ts +17 -4
  610. package/src/manager/connector/index.ts +2 -2
  611. package/src/manager/connector/tenant.ts +17 -4
  612. package/src/manager/index.ts +2 -2
  613. package/src/manager/session/attribution.ts +79 -0
  614. package/src/manager/session/turn-recorder.ts +211 -55
  615. package/src/peers/address.ts +58 -0
  616. package/src/peers/client.ts +202 -0
  617. package/src/peers/dir.ts +176 -0
  618. package/src/peers/endpoint.ts +564 -0
  619. package/src/peers/envelope.ts +121 -0
  620. package/src/peers/index.ts +96 -0
  621. package/src/peers/protocol.ts +196 -0
  622. package/src/peers/record.ts +56 -0
  623. package/src/peers/registry.ts +241 -0
  624. package/src/plugin/define.ts +68 -0
  625. package/src/plugin/index.ts +2 -0
  626. package/src/plugin/lifecycle.ts +286 -106
  627. package/src/plugin/resolver.ts +6 -3
  628. package/src/plugin/shell-hook.ts +21 -5
  629. package/src/probe/errors.ts +4 -1
  630. package/src/prompt/coding-agent-doctrine.ts +22 -10
  631. package/src/prompt/contributions.ts +12 -2
  632. package/src/prompt/index.ts +1 -0
  633. package/src/provider/collect-chat-completion.ts +96 -11
  634. package/src/provider/mock.ts +24 -6
  635. package/src/provider/registry.ts +4 -1
  636. package/src/provider/tool-call-framing.ts +226 -0
  637. package/src/public-runtime.ts +136 -7
  638. package/src/public-tools.ts +24 -4
  639. package/src/public-types.ts +60 -6
  640. package/src/read-model/registry.ts +7 -2
  641. package/src/registry/ManagedRegistry.ts +57 -6
  642. package/src/registry/collision.ts +64 -0
  643. package/src/registry/command/index.ts +7 -3
  644. package/src/registry/index.ts +3 -9
  645. package/src/registry/plugin/index.ts +14 -1
  646. package/src/registry/tool/callable.ts +8 -9
  647. package/src/registry/tool/execute.ts +16 -846
  648. package/src/registry/tool/portable.ts +59 -0
  649. package/src/registry/tool/presentation.ts +6 -5
  650. package/src/runtime/bidi/session.ts +24 -5
  651. package/src/runtime/query/executor/tool-call-admission.ts +228 -6
  652. package/src/runtime/query/executor.ts +110 -12
  653. package/src/runtime/query/file-evidence-replay.ts +8 -7
  654. package/src/runtime/query/fork/prepare.ts +6 -1
  655. package/src/runtime/query/guardrail-presets.ts +4 -3
  656. package/src/runtime/query/index.ts +199 -101
  657. package/src/runtime/query/iteration/index.ts +13 -3
  658. package/src/runtime/query/iteration/phases/compaction.ts +1 -1
  659. package/src/runtime/query/iteration/phases/context.ts +2 -2
  660. package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
  661. package/src/runtime/query/iteration/stream-turn.ts +390 -136
  662. package/src/runtime/query/iteration/tool-input.ts +284 -0
  663. package/src/runtime/query/observation-context.ts +2 -2
  664. package/src/runtime/query/prelude-lease.ts +132 -0
  665. package/src/runtime/query/prepare-turn.ts +477 -198
  666. package/src/runtime/query/prompt-cache.ts +2 -2
  667. package/src/runtime/query/prompt.ts +4 -4
  668. package/src/runtime/query/resume-session.ts +42 -3
  669. package/src/runtime/query/review-policy.ts +87 -9
  670. package/src/runtime/query/tooling.ts +3 -6
  671. package/src/runtime/query/turn-state.ts +4 -0
  672. package/src/runtime/system-events.ts +246 -0
  673. package/src/scheduler/delegating.ts +7 -2
  674. package/src/skills/index.ts +1 -1
  675. package/src/skills/registry.ts +25 -0
  676. package/src/store/session-log/conformance.ts +51 -8
  677. package/src/store/session-log/core.ts +10 -4
  678. package/src/store/session-log/fold.ts +33 -7
  679. package/src/store/session-log/index.ts +2 -0
  680. package/src/test-support/toolset.ts +23 -0
  681. package/src/tools/builtins/bash.ts +27 -10
  682. package/src/tools/builtins/browser-url.ts +1 -1
  683. package/src/tools/builtins/computer-use.ts +21 -11
  684. package/src/tools/builtins/edit.ts +12 -2
  685. package/src/tools/builtins/json-string-hint.ts +16 -0
  686. package/src/tools/builtins/search-tools.ts +7 -20
  687. package/src/tools/builtins/write-file.ts +12 -0
  688. package/src/tools/command-shell.ts +46 -1
  689. package/src/tools/coordinator/agent.ts +6 -0
  690. package/src/tools/coordinator/ask-user-question.ts +29 -15
  691. package/src/tools/coordinator/index.ts +6 -0
  692. package/src/tools/coordinator/question-options.ts +195 -0
  693. package/src/tools/defineTool.ts +28 -0
  694. package/src/tools/memory/search.ts +4 -1
  695. package/src/tools/memory/update.ts +8 -5
  696. package/src/tools/render-nonce.ts +69 -0
  697. package/src/tools/roster.ts +84 -33
  698. package/src/tools/schedules/schedule-tool.ts +107 -14
  699. package/src/tools/schedules/types.ts +52 -6
  700. package/src/tools/trusted-read-only.ts +19 -10
  701. package/src/tools/untrusted-envelope.ts +121 -57
  702. package/src/toolsets/combine.ts +181 -0
  703. package/src/toolsets/manager.ts +996 -0
  704. package/src/toolsets/source-glob.ts +22 -0
  705. package/src/toolsets/toolset.ts +31 -0
  706. package/src/toolsets/types.ts +154 -0
  707. package/src/toolsets/wrappers.ts +191 -0
  708. package/src/types/agent/base.ts +29 -16
  709. package/src/types/agent/index.ts +1 -0
  710. package/src/types/agent/pipeline.ts +2 -0
  711. package/src/types/agent/query.ts +129 -0
  712. package/src/types/agent/reactive.ts +5 -142
  713. package/src/types/agent/router.ts +2 -0
  714. package/src/types/agent/supervisor.ts +5 -2
  715. package/src/types/authorization/index.ts +12 -0
  716. package/src/types/connector/mcp.ts +32 -0
  717. package/src/types/errors/index.ts +15 -0
  718. package/src/types/hitl/index.ts +57 -0
  719. package/src/types/message/index.ts +135 -7
  720. package/src/types/plugin/index.ts +44 -21
  721. package/src/types/provider/chat.ts +5 -0
  722. package/src/types/provider/config.ts +8 -3
  723. package/src/types/provider/stream.ts +39 -0
  724. package/src/types/sandbox/index.ts +1 -1
  725. package/src/types/session/events.ts +14 -3
  726. package/src/types/tool/index.ts +154 -105
  727. package/src/types/toolset/index.ts +10 -47
  728. package/dist/registry/toolset/catalog.d.ts +0 -42
  729. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  730. package/dist/registry/toolset/catalog.js +0 -234
  731. package/dist/registry/toolset/catalog.js.map +0 -1
  732. package/src/registry/toolset/catalog.ts +0 -308
@@ -1,10 +1,13 @@
1
+ import { RegistryCollisionError } from '../registry/collision.js'
1
2
  import type { VetoableEventKind } from '../types/probe/index.js'
2
3
 
3
- export class ProbeNameCollisionError extends Error {
4
+ export class ProbeNameCollisionError extends RegistryCollisionError {
4
5
  readonly probeName: string
5
6
 
6
7
  constructor(probeName: string) {
7
8
  super(
9
+ 'ProbeRegistry',
10
+ probeName,
8
11
  `Probe name "${probeName}" is already registered. Pass { override: true } to replace, or pick a different name.`,
9
12
  )
10
13
  this.name = 'ProbeNameCollisionError'
@@ -97,14 +97,20 @@ When you have understood the task, reply with the plan: what you would change, i
97
97
 
98
98
  /**
99
99
  * Appended after {@link CODING_AGENT_DELEGATION_DOCTRINE} only for a host
100
- * session that has an orchestration mode turned on. See
101
- * {@link CodingAgentDoctrineOptions.orchestrate}: this text is a stronger
100
+ * session that has hypermode (its multi-agent mode) turned on. See
101
+ * {@link CodingAgentDoctrineOptions.hypermode}: this text is a stronger
102
102
  * restatement of the existing delegation rule, not a new capability — it
103
103
  * creates no roster, starts no work by itself, and names no tool the base
104
104
  * doctrine did not already name.
105
105
  */
106
- export const CODING_AGENT_ORCHESTRATE_DOCTRINE = `### Orchestrate mode
107
- This session has orchestrate mode on: treat delegation through \`Agent\` as the default for substantive work, not the exception. Before doing multi-step work yourself, ask whether an independent piece of it — a lookup, a draft, a check — could run as its own delegation, and prefer delegating it when the answer is yes. This changes only how eagerly you reach for \`Agent\` on work you would otherwise do inline; it does not mount a roster or start any delegation by itself. Agents in the same phase are launched in the same response, each with \`run_in_background: true\` when you mean to wait for them together; a phase is never started one agent at a time.`
106
+ export const CODING_AGENT_HYPERMODE_DOCTRINE = `### Hypermode
107
+ This session has hypermode on: treat delegation through \`Agent\` as the default for substantive work, not the exception. Before doing multi-step work yourself, ask whether an independent piece of it — a lookup, a draft, a check — could run as its own delegation, and prefer delegating it when the answer is yes. This changes only how eagerly you reach for \`Agent\` on work you would otherwise do inline; it does not mount a roster or start any delegation by itself. Agents in the same phase are launched in the same response, each with \`run_in_background: true\` when you mean to wait for them together; a phase is never started one agent at a time.`
108
+
109
+ /**
110
+ * @deprecated Renamed {@link CODING_AGENT_HYPERMODE_DOCTRINE}; the mode it
111
+ * describes is now called hypermode. Same value. Removed in the next major.
112
+ */
113
+ export const CODING_AGENT_ORCHESTRATE_DOCTRINE = CODING_AGENT_HYPERMODE_DOCTRINE
108
114
 
109
115
  export const CODING_AGENT_DOCTRINE_CONTRIBUTION_ID = 'namzu.coding-agent-doctrine'
110
116
 
@@ -116,15 +122,21 @@ export interface CodingAgentDoctrineOptions {
116
122
  */
117
123
  delegation?: boolean
118
124
  /**
119
- * Append {@link CODING_AGENT_ORCHESTRATE_DOCTRINE} after the delegation
120
- * rules, for a host session whose operator turned on an orchestration
121
- * mode. Default `false`, and ignored when `delegation` is `false` — a
122
- * sub-agent prompt never carries delegation guidance of any strength.
125
+ * Append {@link CODING_AGENT_HYPERMODE_DOCTRINE} after the delegation
126
+ * rules, for a host session whose operator turned hypermode on. Default
127
+ * `false`, and ignored when `delegation` is `false` — a sub-agent prompt
128
+ * never carries delegation guidance of any strength.
123
129
  * Display/prompt-only: it creates no scheduling, no roster and no kernel
124
130
  * behaviour change, the same guarantee the `workflow`/`phase` labels on
125
131
  * `agent_pending` make. With this left at its default the rendered text
126
132
  * is byte-identical to before this option existed.
127
133
  */
134
+ hypermode?: boolean
135
+ /**
136
+ * @deprecated Renamed {@link CodingAgentDoctrineOptions.hypermode}. Still
137
+ * honoured: either flag set to `true` appends the text. Removed in the
138
+ * next major.
139
+ */
128
140
  orchestrate?: boolean
129
141
  }
130
142
 
@@ -140,8 +152,8 @@ export function codingAgentDoctrineContribution(
140
152
  const text = [
141
153
  CODING_AGENT_WORKING_DOCTRINE,
142
154
  options.delegation === false ? undefined : CODING_AGENT_DELEGATION_DOCTRINE,
143
- options.delegation !== false && options.orchestrate
144
- ? CODING_AGENT_ORCHESTRATE_DOCTRINE
155
+ options.delegation !== false && (options.hypermode || options.orchestrate)
156
+ ? CODING_AGENT_HYPERMODE_DOCTRINE
145
157
  : undefined,
146
158
  ]
147
159
  .filter((part): part is string => Boolean(part))
@@ -1,4 +1,5 @@
1
1
  import { renderSkillsSection } from '../persona/assembler.js'
2
+ import { RegistryCollisionError } from '../registry/collision.js'
2
3
  import type { AgentRuntimeContext } from '../types/agent/base.js'
3
4
  import type { Skill } from '../types/skills/index.js'
4
5
 
@@ -112,11 +113,15 @@ export interface PromptContribution {
112
113
  }
113
114
 
114
115
  /** Two contributions claiming one id. */
115
- export class PromptContributionCollisionError extends Error {
116
+ export class PromptContributionCollisionError extends RegistryCollisionError {
116
117
  readonly details: { id: string }
117
118
 
118
119
  constructor(details: { id: string }) {
119
- super(`A prompt contribution with id "${details.id}" is already registered.`)
120
+ super(
121
+ 'PromptContributionRegistry',
122
+ details.id,
123
+ `A prompt contribution with id "${details.id}" is already registered.`,
124
+ )
120
125
  this.name = 'PromptContributionCollisionError'
121
126
  this.details = details
122
127
  }
@@ -145,6 +150,11 @@ export class PromptContributionRegistry {
145
150
  this.byId.set(contribution.id, contribution)
146
151
  }
147
152
 
153
+ /** Revoke one contribution when its owner is disabled or uninstalled. */
154
+ unregister(id: string): boolean {
155
+ return this.byId.delete(id)
156
+ }
157
+
148
158
  has(id: string): boolean {
149
159
  return this.byId.has(id)
150
160
  }
@@ -16,6 +16,7 @@ export type {
16
16
  export {
17
17
  CODING_AGENT_DELEGATION_DOCTRINE,
18
18
  CODING_AGENT_DOCTRINE_CONTRIBUTION_ID,
19
+ CODING_AGENT_HYPERMODE_DOCTRINE,
19
20
  CODING_AGENT_ORCHESTRATE_DOCTRINE,
20
21
  CODING_AGENT_WORKING_DOCTRINE,
21
22
  PLAN_MODE_DOCTRINE,
@@ -1,8 +1,33 @@
1
1
  import { mergeTokenUsage } from '../types/common/index.js'
2
- import type { ReasoningBlock } from '../types/message/index.js'
2
+ import type { ReasoningBlock, ToolInputError } from '../types/message/index.js'
3
3
  import type { ChatCompletionResponse } from '../types/provider/chat.js'
4
4
  import type { StreamChunk } from '../types/provider/stream.js'
5
5
  import { StreamTextAccumulator } from './stream-text.js'
6
+ import {
7
+ INTERLEAVED_TOOL_INPUT_PARSE_ERROR,
8
+ ToolCallIndexer,
9
+ describeToolCallFramingViolation,
10
+ isUnindexedFragment,
11
+ toolCallFramingViolation,
12
+ } from './tool-call-framing.js'
13
+
14
+ /**
15
+ * Whether a streamed argument buffer could still be receiving more of a
16
+ * call's arguments right now: empty, or not yet a complete JSON value. Used
17
+ * only by `ToolCallIndexer.placeUnindexedFragment` to tell which open calls
18
+ * could still be an id-less fragment's target — not to validate a finished
19
+ * call, so it does not need the offset-finding `parseToolArguments` the turn
20
+ * loop uses for the message a model is shown.
21
+ */
22
+ function canAcceptMoreText(buffer: string): boolean {
23
+ if (!buffer) return true
24
+ try {
25
+ JSON.parse(buffer)
26
+ return false
27
+ } catch {
28
+ return true
29
+ }
30
+ }
6
31
 
7
32
  /**
8
33
  * Drains a {@link StreamChunk} async iterable into the equivalent
@@ -18,7 +43,12 @@ import { StreamTextAccumulator } from './stream-text.js'
18
43
  * - ordinary text is concatenated in delta order; identified public text
19
44
  * items are preserved and explicit final-answer items select the settled text;
20
45
  * - tool calls are bucketed by `index` into the existing
21
- * `Array<{ id, function: { name, arguments } }>` shape;
46
+ * `Array<{ id, function: { name, arguments } }>` shape. Arguments that
47
+ * arrive before the call's id belong to the call at their index and are
48
+ * kept; the id is filled in when it arrives. A stream that puts a second
49
+ * call id on an index is refused with an error naming the violation, as
50
+ * the turn loop refuses it: the second call's arguments used to be
51
+ * appended to the first's, which left one call no tool could run;
22
52
  * - reasoning blocks are bucketed by `index` the same way, because the
23
53
  * assembled message is the thing a caller replays and
24
54
  * {@link ReasoningBlock} is documented as replayed verbatim. This was
@@ -41,6 +71,7 @@ export async function collectChatCompletion(
41
71
  const text = new StreamTextAccumulator()
42
72
  let replayState: unknown
43
73
  let finishReason: ChatCompletionResponse['finishReason'] = 'stop'
74
+ let finishDetail: ChatCompletionResponse['finishDetail']
44
75
  let usage: ChatCompletionResponse['usage'] = {
45
76
  promptTokens: 0,
46
77
  completionTokens: 0,
@@ -49,7 +80,12 @@ export async function collectChatCompletion(
49
80
  cacheWriteTokens: 0,
50
81
  }
51
82
 
52
- const toolBuckets = new Map<number, { id: string; name: string; argsBuf: string }>()
83
+ const toolBuckets = new Map<
84
+ number,
85
+ { id: string; name: string; argsBuf: string; unreadable?: boolean }
86
+ >()
87
+ // Places a fragment that came without an index; see `ToolCallIndexer`.
88
+ const toolIndexer = new ToolCallIndexer()
53
89
  // Same bucketing rule the turn loop uses (`runtime/query/iteration/
54
90
  // stream-turn.ts`), so a message assembled here and a message assembled
55
91
  // there carry the same blocks in the same order.
@@ -81,18 +117,47 @@ export async function collectChatCompletion(
81
117
  }
82
118
 
83
119
  for (const tc of chunk.delta.toolCalls ?? []) {
84
- const bucket = toolBuckets.get(tc.index) ?? {
85
- id: '',
86
- name: '',
87
- argsBuf: '',
120
+ if (isUnindexedFragment(tc)) {
121
+ // Neither an id nor an index: never a guess. Evaluated fresh for
122
+ // THIS fragment, not decided once when some call opened.
123
+ const placement = toolIndexer.placeUnindexedFragment((i) =>
124
+ canAcceptMoreText(toolBuckets.get(i)?.argsBuf ?? ''),
125
+ )
126
+ if (typeof placement === 'number') {
127
+ const bucket = toolBuckets.get(placement) ?? { id: '', name: '', argsBuf: '' }
128
+ if (tc.function?.name) bucket.name = tc.function.name
129
+ if (tc.function?.arguments) bucket.argsBuf += tc.function.arguments
130
+ toolBuckets.set(placement, bucket)
131
+ } else {
132
+ // More than one open call could still have taken this
133
+ // fragment, or none could: every candidate is unreadable, and
134
+ // the fragment itself is attributed to none of them —
135
+ // appending it to a guess is exactly the splice this exists
136
+ // to refuse.
137
+ for (const candidate of placement.candidates) {
138
+ const bucket = toolBuckets.get(candidate.index)
139
+ if (bucket) bucket.unreadable = true
140
+ }
141
+ }
142
+ continue
88
143
  }
89
- if (tc.id) bucket.id = tc.id
144
+ const index = toolIndexer.indexOf(tc)
145
+ const open = toolBuckets.get(index)
146
+ const violation = toolCallFramingViolation(open, tc, index)
147
+ if (violation) {
148
+ throw new Error(`Provider stream error: ${describeToolCallFramingViolation(violation)}`)
149
+ }
150
+ const bucket = open ?? { id: '', name: '', argsBuf: '' }
151
+ if (tc.id && !bucket.id) bucket.id = tc.id
90
152
  if (tc.function?.name) bucket.name = tc.function.name
91
153
  if (tc.function?.arguments) bucket.argsBuf += tc.function.arguments
92
- toolBuckets.set(tc.index, bucket)
154
+ toolBuckets.set(index, bucket)
93
155
  }
94
156
 
95
- if (chunk.finishReason) finishReason = chunk.finishReason
157
+ if (chunk.finishReason) {
158
+ finishReason = chunk.finishReason
159
+ finishDetail = chunk.finishReason === 'length' ? chunk.finishDetail : undefined
160
+ }
96
161
  // Merge (per-field max), not last-write-wins: a late frame that omits
97
162
  // input/cache tokens must not zero the counts captured earlier in the stream.
98
163
  if (chunk.usage) usage = mergeTokenUsage(usage, chunk.usage)
@@ -103,7 +168,26 @@ export async function collectChatCompletion(
103
168
  .map(([, b]) => ({
104
169
  id: b.id,
105
170
  type: 'function' as const,
106
- function: { name: b.name, arguments: b.argsBuf },
171
+ // An interleaved call is never returned with the buffer it
172
+ // accumulated: that buffer may hold another call's spliced-in
173
+ // fragments, or may simply be missing whatever an id-less
174
+ // fragment carried elsewhere instead. Normalized to `{}`, exactly
175
+ // as the turn loop normalizes any other unreadable call.
176
+ function: { name: b.name, arguments: b.unreadable ? '{}' : b.argsBuf },
177
+ ...(b.unreadable
178
+ ? {
179
+ metadata: {
180
+ inputTruncated: true,
181
+ partialArguments: b.argsBuf,
182
+ inputError: {
183
+ reason: 'malformed',
184
+ parseError: INTERLEAVED_TOOL_INPUT_PARSE_ERROR,
185
+ length: b.argsBuf.length,
186
+ precedingLength: 0,
187
+ } satisfies ToolInputError,
188
+ },
189
+ }
190
+ : {}),
107
191
  }))
108
192
 
109
193
  const reasoningBlocks: ReasoningBlock[] = [...reasoningBuckets.entries()]
@@ -122,6 +206,7 @@ export async function collectChatCompletion(
122
206
  ...(replayState !== undefined ? { replayState } : {}),
123
207
  },
124
208
  finishReason,
209
+ ...(finishDetail ? { finishDetail } : {}),
125
210
  usage,
126
211
  }
127
212
  }
@@ -129,8 +129,15 @@ export class MockLLMProvider implements LLMProvider {
129
129
  }
130
130
 
131
131
  // Arguments arrive as JSON fragments, which is what forces the
132
- // consumer's partial-JSON buffering to be exercised.
133
- const args = call.rawArguments ?? JSON.stringify(call.args ?? {})
132
+ // consumer's partial-JSON buffering to be exercised. A truncated
133
+ // call stops halfway, as the output limit stops a real one: it
134
+ // used to send every fragment and only withhold the block close,
135
+ // so the arguments parsed and nothing was truncated at all.
136
+ const fullArgs = call.rawArguments ?? JSON.stringify(call.args ?? {})
137
+ const args =
138
+ call.truncateArguments === true
139
+ ? fullArgs.slice(0, Math.max(1, Math.floor(fullArgs.length / 2)))
140
+ : fullArgs
134
141
  const step = call.argChunkSize ?? Math.max(1, Math.ceil(args.length / 3))
135
142
  for (let i = 0; i < args.length; i += step) {
136
143
  yield {
@@ -143,15 +150,26 @@ export class MockLLMProvider implements LLMProvider {
143
150
  throw new Error(call.throwAfterArguments)
144
151
  }
145
152
 
146
- if (call.truncateArguments !== true) {
147
- yield { id, delta: { toolCallEnd: { index, id: callId } } }
148
- }
153
+ // An output limit stops the response where it is, so nothing the
154
+ // script puts after a truncated call is streamed. It used to go on
155
+ // to the next call, which made the cut call one the model had
156
+ // moved on from: malformed, not truncated.
157
+ if (call.truncateArguments === true) break
158
+ yield { id, delta: { toolCallEnd: { index, id: callId } } }
149
159
  }
150
160
 
151
161
  yield {
152
162
  id,
153
163
  delta: {},
154
- finishReason: turn.finishReason ?? (toolCalls.length > 0 ? 'tool_calls' : 'stop'),
164
+ finishReason:
165
+ turn.finishReason ??
166
+ // A call cut off mid-JSON is what the output limit does, and the
167
+ // finish reason is how a consumer tells that from malformed JSON.
168
+ (toolCalls.some((call) => call.truncateArguments === true)
169
+ ? 'length'
170
+ : toolCalls.length > 0
171
+ ? 'tool_calls'
172
+ : 'stop'),
155
173
  usage: { ...EMPTY_USAGE, ...turn.usage },
156
174
  }
157
175
  }
@@ -1,3 +1,4 @@
1
+ import { RegistryCollisionError } from '../registry/collision.js'
1
2
  import type {
2
3
  LLMProvider,
3
4
  LLMProviderConstructor,
@@ -23,11 +24,13 @@ export class UnknownProviderError extends Error {
23
24
  }
24
25
  }
25
26
 
26
- export class DuplicateProviderError extends Error {
27
+ export class DuplicateProviderError extends RegistryCollisionError {
27
28
  readonly providerType: string
28
29
 
29
30
  constructor(providerType: string) {
30
31
  super(
32
+ 'ProviderRegistry',
33
+ providerType,
31
34
  `Provider type "${providerType}" is already registered. Pass { replace: true } to override an existing registration.`,
32
35
  )
33
36
  this.name = 'DuplicateProviderError'
@@ -0,0 +1,226 @@
1
+ import type { StreamChunk } from '../types/provider/stream.js'
2
+
3
+ type ToolCallDelta = NonNullable<StreamChunk['delta']['toolCalls']>[number]
4
+
5
+ /**
6
+ * A stream that broke tool-call framing: a second call id on an `index`
7
+ * another call holds.
8
+ *
9
+ * The index is what groups a call's fragments, so after this no buffer can be
10
+ * trusted to hold one call's arguments. The second call's arguments used to be
11
+ * appended to the first's; the buffer that reached `JSON.parse` was then not
12
+ * what the model sent, and the model was told its call had been cut off.
13
+ *
14
+ * Nothing else about a call's framing is a violation. Arguments that arrive
15
+ * before the call's id belong to the call at their index and are kept, and a
16
+ * call whose id never arrives is still one call.
17
+ */
18
+ export interface ToolCallFramingViolation {
19
+ readonly kind: 'index_reused'
20
+ readonly index: number
21
+ readonly openId: string
22
+ readonly newId: string
23
+ }
24
+
25
+ /**
26
+ * Whether this tool-call delta puts a new call on an index another call
27
+ * holds, or `undefined` when it does not.
28
+ *
29
+ * The same id repeated on every fragment is fine: some wires send it each
30
+ * time. Only a different one is a second call.
31
+ */
32
+ export function toolCallFramingViolation(
33
+ open: { readonly id: string } | undefined,
34
+ delta: ToolCallDelta,
35
+ /** The index the fragment was placed on, when it came without one. */
36
+ index: number = delta.index,
37
+ ): ToolCallFramingViolation | undefined {
38
+ if (open?.id && delta.id && delta.id !== open.id) {
39
+ return { kind: 'index_reused', index, openId: open.id, newId: delta.id }
40
+ }
41
+ return undefined
42
+ }
43
+
44
+ function hasIndex(index: number | undefined): index is number {
45
+ return typeof index === 'number' && Number.isInteger(index) && index >= 0
46
+ }
47
+
48
+ /**
49
+ * Whether a fragment carries neither an index nor an id — the one shape
50
+ * `ToolCallIndexer.indexOf` cannot place by itself, and the only shape
51
+ * {@link ToolCallIndexer.placeUnindexedFragment} is for. A fragment with
52
+ * either goes through `indexOf` instead, unaffected by anything below.
53
+ */
54
+ export function isUnindexedFragment(delta: {
55
+ readonly index?: number
56
+ readonly id?: string
57
+ }): boolean {
58
+ return !hasIndex(delta.index) && !delta.id
59
+ }
60
+
61
+ /**
62
+ * The index each tool-call fragment of one stream belongs to.
63
+ *
64
+ * A driver sets `index`, and the index is what groups a call's fragments.
65
+ * Some servers leave it out of their `tool_calls` fragments, and a driver
66
+ * that passes the wire value through then sends none. Every such fragment used
67
+ * to land on one `undefined` index: two parallel calls were refused as a
68
+ * reused index, and the turn paused on a stream that had nothing wrong with
69
+ * it but the missing field.
70
+ *
71
+ * A fragment that carries an id, with or without an index, is placed by
72
+ * {@link indexOf}: an id seen before continues its call; a new id names the
73
+ * call the latest fragment went to when that call has no id yet, and starts a
74
+ * call on the next free index otherwise. A fragment that carries an index
75
+ * keeps it, so a well-formed stream is read exactly as before and a real
76
+ * reuse of an index is still refused.
77
+ *
78
+ * A fragment with NEITHER an id nor an index — see
79
+ * {@link isUnindexedFragment} — goes through {@link placeUnindexedFragment}
80
+ * instead, which is never a guess: nothing in such a fragment says which call
81
+ * it continues, so the caller is asked, for every call opened so far,
82
+ * whether it could still be receiving more of its arguments right now, and
83
+ * the fragment is placed only when the answer says exactly one call.
84
+ */
85
+ export class ToolCallIndexer {
86
+ private readonly byId = new Map<string, number>()
87
+ private readonly idOf = new Map<number, string>()
88
+ private readonly named = new Set<number>()
89
+ private readonly opened = new Set<number>()
90
+ private latest: number | undefined
91
+ private next = 0
92
+
93
+ /** The index this id- or index-bearing fragment belongs to. */
94
+ indexOf(delta: { readonly index?: number; readonly id?: string }): number {
95
+ const index = hasIndex(delta.index) ? delta.index : this.placed(delta.id)
96
+ if (delta.id && !this.byId.has(delta.id)) this.byId.set(delta.id, index)
97
+ if (delta.id) {
98
+ this.named.add(index)
99
+ this.idOf.set(index, delta.id)
100
+ }
101
+ this.opened.add(index)
102
+ if (index >= this.next) this.next = index + 1
103
+ this.latest = index
104
+ return index
105
+ }
106
+
107
+ private placed(id: string | undefined): number {
108
+ if (!id) return this.latest ?? this.next
109
+ const known = this.byId.get(id)
110
+ if (known !== undefined) return known
111
+ return this.latest !== undefined && !this.named.has(this.latest) ? this.latest : this.next
112
+ }
113
+
114
+ /**
115
+ * Where a fragment with neither an id nor an index belongs — see
116
+ * {@link isUnindexedFragment}.
117
+ *
118
+ * Evaluated fresh for every such fragment, never decided once and
119
+ * remembered from when a call opened: a call's buffer can go from
120
+ * accepting more text to not (once it completes) and stay that way, so
121
+ * only the state right now, at each fragment, says which calls could
122
+ * still be its target. `canAccept(index)` is asked for every call opened
123
+ * so far and answers exactly that: true while its buffer is empty or is
124
+ * not yet a complete JSON value (it could still be receiving more), false
125
+ * once the buffer already parses as one complete value (nothing more is
126
+ * missing from it).
127
+ *
128
+ * - No call has opened yet: this fragment starts the first one. An id
129
+ * for it, if the stream sends one, arrives on a later fragment and
130
+ * attaches to it — the ordinary "arguments before the id" case,
131
+ * unchanged.
132
+ * - Exactly one open call can still accept: it is unambiguously that
133
+ * one.
134
+ * - Zero, or more than one, open call can: there is no way to tell which
135
+ * one this fragment was for, or none could take it at all. Every call
136
+ * that could have is returned in `candidates` (empty when none could),
137
+ * and the fragment belongs to none of them — appending it to a guess
138
+ * is exactly the splice this method exists to refuse.
139
+ */
140
+ placeUnindexedFragment(
141
+ canAccept: (index: number) => boolean,
142
+ ):
143
+ | number
144
+ | { readonly candidates: ReadonlyArray<{ readonly index: number; readonly id?: string }> } {
145
+ if (this.opened.size === 0) {
146
+ const index = this.next
147
+ this.opened.add(index)
148
+ this.next = index + 1
149
+ this.latest = index
150
+ return index
151
+ }
152
+ const candidates = [...this.opened].filter(canAccept)
153
+ if (candidates.length === 1) {
154
+ const [index] = candidates as [number]
155
+ this.latest = index
156
+ return index
157
+ }
158
+ return {
159
+ candidates: candidates
160
+ .sort((a, b) => a - b)
161
+ .map((index) => ({ index, id: this.idOf.get(index) })),
162
+ }
163
+ }
164
+
165
+ /**
166
+ * The index a block close belongs to: its own, or, when it has none, the
167
+ * call its id names, or the call the latest fragment went to.
168
+ */
169
+ closedIndex(end: { readonly index?: number; readonly id?: string }): number | undefined {
170
+ if (hasIndex(end.index)) return end.index
171
+ return (end.id ? this.byId.get(end.id) : undefined) ?? this.latest
172
+ }
173
+ }
174
+
175
+ /** One sentence naming the violation, for an error's detail. */
176
+ export function describeToolCallFramingViolation(violation: ToolCallFramingViolation): string {
177
+ return `the stream reused tool-call index ${violation.index} for call "${violation.newId}" while call "${violation.openId}" held it`
178
+ }
179
+
180
+ /**
181
+ * A stream sent a fragment with neither an id nor an index while more than
182
+ * one open call could still have been its target, or while none could.
183
+ *
184
+ * {@link ToolCallIndexer.placeUnindexedFragment} places such a fragment only
185
+ * when exactly one open call can still accept more text right now (its
186
+ * buffer empty, or not yet a complete JSON value). Once two calls are both
187
+ * in that state — the ordinary shape of a chat-completions "open" fragment,
188
+ * name and id with empty arguments, sent for one call right after another,
189
+ * before either has streamed any argument text — a later fragment naming
190
+ * neither could belong to either, and there is no field in it that says
191
+ * which. Guessing (placing it on whichever call was merely most recently
192
+ * active) can splice one call's JSON into the other's, and the splice can
193
+ * still happen to parse, so the wrong call runs with no error at all.
194
+ *
195
+ * `candidates` names every call that could have accepted the fragment: more
196
+ * than one when ambiguous, empty when the fragment matched no open call
197
+ * (nothing to route it to, and nothing to blame for it either).
198
+ */
199
+ export interface ToolCallInterleaving {
200
+ readonly kind: 'interleaved_without_index'
201
+ readonly candidates: ReadonlyArray<{ readonly index: number; readonly id?: string }>
202
+ }
203
+
204
+ /** One sentence naming the interleaving, for an error's detail or log line. */
205
+ export function describeToolCallInterleaving(interleaving: ToolCallInterleaving): string {
206
+ if (interleaving.candidates.length === 0) {
207
+ return 'the stream sent a tool-call fragment with neither an index nor an id, and no open call could still have accepted it'
208
+ }
209
+ const names = interleaving.candidates
210
+ .map((c) => (c.id ? `"${c.id}"` : `index ${c.index} (not yet named)`))
211
+ .join(' and ')
212
+ return `the stream sent a tool-call fragment with neither an index nor an id while ${names} could each still have accepted it, with nothing to tell them apart`
213
+ }
214
+
215
+ /**
216
+ * The `ToolInputError.parseError` given to every call an interleaving names.
217
+ * Reported `reason: 'malformed'`, never `'truncated'`: nothing here says the
218
+ * response was cut off, and "the model moved on to more text, reasoning or
219
+ * another call" — the only other case {@link ToolInputError} models — is
220
+ * exactly what opening a second call means. A call this leaves open may
221
+ * genuinely have gone on to carry valid JSON, if by chance no ambiguous
222
+ * fragment ever decided its fate; it is still reported unreadable rather
223
+ * than risk having guessed right by luck on some other stream.
224
+ */
225
+ export const INTERLEAVED_TOOL_INPUT_PARSE_ERROR =
226
+ "its fragments arrived interleaved with another call's, with neither carrying an index to tell them apart"