@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
@@ -7,7 +7,11 @@ import type {
7
7
  } from '../../types/connector/index.js'
8
8
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
9
9
  import { type Logger, resolveLogger } from '../../utils/logger.js'
10
- import { ConnectorHttpOperation, validateConnectorTimeoutMs } from '../http-operation.js'
10
+ import {
11
+ ConnectorHttpOperation,
12
+ readConnectorResponseBody,
13
+ validateConnectorTimeoutMs,
14
+ } from '../http-operation.js'
11
15
  import { MCPHttpStatusError } from './errors.js'
12
16
  import { refuseMcpHttpRedirect } from './http-redirect.js'
13
17
 
@@ -21,6 +25,23 @@ const DEFAULT_TIMEOUT_MS = 30_000
21
25
  * an unresponsive peer does not accumulate as a dangling request forever.
22
26
  */
23
27
  const SESSION_DELETE_TIMEOUT_MS = 5_000
28
+ /** SSE streams may live for hours; bound each event and read rather than their lifetime. */
29
+ const MAX_SSE_EVENT_CHARS = 1_048_576
30
+ const MAX_SSE_CHUNK_BYTES = 8_388_608
31
+ /** A single event may contain a JSON-RPC batch; bound its dispatch work too. */
32
+ const MAX_RESPONSE_SSE_MESSAGES_PER_EVENT = 256
33
+ const MAX_SUBSCRIPTION_ERROR_BODY_BYTES = 65_536
34
+
35
+ /** A successful HTTP status can still carry a JSON-RPC listen refusal. */
36
+ export class MCPSubscriptionResponseError extends Error {
37
+ readonly bodyText: string
38
+
39
+ constructor(bodyText: string) {
40
+ super('MCP subscriptions/listen returned JSON instead of an SSE response stream')
41
+ this.name = 'MCPSubscriptionResponseError'
42
+ this.bodyText = bodyText
43
+ }
44
+ }
24
45
 
25
46
  export class StreamableHttpTransport implements MCPTransport {
26
47
  private messageHandlers: Array<(message: MCPJsonRpcMessage) => void> = []
@@ -202,7 +223,7 @@ export class StreamableHttpTransport implements MCPTransport {
202
223
  // POST capable of poisoning every later request on this connection.
203
224
  if (message.method === 'initialize') this.captureSessionId(response)
204
225
 
205
- await this.dispatchResponseMessages(response, operation, owned.generation)
226
+ await this.dispatchResponseMessages(response, operation, owned.generation, message.id)
206
227
  } finally {
207
228
  // A streamable HTTP send owns one POST; its rejection is delivered to
208
229
  // that caller. It is not evidence that the logical MCP session died.
@@ -213,6 +234,124 @@ export class StreamableHttpTransport implements MCPTransport {
213
234
  }
214
235
  }
215
236
 
237
+ /**
238
+ * Modern MCP subscriptions are long-lived POST response streams. The ordinary
239
+ * `send` has a request deadline and stops at its terminal reply; a
240
+ * subscription may remain open indefinitely. The client owns the initial
241
+ * acknowledgment deadline and this stream's abort signal.
242
+ */
243
+ async sendSubscription(
244
+ message: MCPJsonRpcMessage,
245
+ options: MCPTransportSendOptions,
246
+ onMessage?: (message: MCPJsonRpcMessage) => void,
247
+ ): Promise<void> {
248
+ if (message.method !== 'subscriptions/listen' || message.id === undefined) {
249
+ throw new Error('sendSubscription requires a subscriptions/listen request')
250
+ }
251
+ if (!this.connected) throw new Error('StreamableHttpTransport: not connected')
252
+ const owned = this.beginSend(options.signal)
253
+ try {
254
+ const response = await this.fetchImpl(this.config.url, {
255
+ method: 'POST',
256
+ headers: this.buildHeaders(options.headers),
257
+ body: JSON.stringify(message),
258
+ redirect: 'manual',
259
+ signal: owned.controller.signal,
260
+ })
261
+ refuseMcpHttpRedirect(response, message.method)
262
+ if (!response.ok) {
263
+ throw new MCPHttpStatusError(
264
+ 'StreamableHttpTransport',
265
+ response.status,
266
+ response.statusText,
267
+ await readSubscriptionErrorBody(response, owned.controller.signal, this.timeoutMs),
268
+ )
269
+ }
270
+ const mediaType = (response.headers.get('content-type') ?? '')
271
+ .split(';', 1)[0]
272
+ ?.trim()
273
+ .toLowerCase()
274
+ if (mediaType !== 'text/event-stream' || !response.body) {
275
+ // A 200 JSON response can be a valid in-band JSON-RPC refusal.
276
+ // Read it under the same byte and time bounds as a failed HTTP
277
+ // response, then release its body before retry classification.
278
+ if (mediaType === 'application/json' && response.body) {
279
+ throw new MCPSubscriptionResponseError(
280
+ await readSubscriptionErrorBody(response, owned.controller.signal, this.timeoutMs),
281
+ )
282
+ }
283
+ // Unknown response media types still own a body. Never leave a
284
+ // held POST open while the client schedules its next attempt.
285
+ void response.body?.cancel().catch(() => undefined)
286
+ throw new Error('MCP subscriptions/listen did not return an SSE response stream')
287
+ }
288
+
289
+ const reader = response.body.getReader()
290
+ const decoder = new TextDecoder()
291
+ let buffer = ''
292
+ let previousChunkEndedWithCr = false
293
+ const cancelReader = (): void => {
294
+ void reader.cancel().catch(() => undefined)
295
+ }
296
+ owned.controller.signal.addEventListener('abort', cancelReader, { once: true })
297
+ if (owned.controller.signal.aborted) cancelReader()
298
+ try {
299
+ while (this.connected && owned.generation === this.generation) {
300
+ const { done, value } = await reader.read()
301
+ if (done) break
302
+ if (
303
+ !this.connected ||
304
+ owned.generation !== this.generation ||
305
+ owned.controller.signal.aborted
306
+ )
307
+ break
308
+ if (value.byteLength > MAX_SSE_CHUNK_BYTES) {
309
+ throw new Error('MCP subscription SSE chunk exceeds its size limit')
310
+ }
311
+ const oldLength = buffer.length
312
+ let chunk = decoder.decode(value, { stream: true })
313
+ // SSE permits LF, CRLF, and bare CR. A CRLF split across chunks
314
+ // still counts as one line break, not an empty line.
315
+ if (previousChunkEndedWithCr && chunk.startsWith('\n')) chunk = chunk.slice(1)
316
+ previousChunkEndedWithCr = chunk.endsWith('\r')
317
+ buffer += chunk.replace(/\r\n|\r/g, '\n')
318
+ let searchFrom = Math.max(0, oldLength - 1)
319
+ while (true) {
320
+ const boundary = findSseEventBoundary(buffer, searchFrom)
321
+ if (!boundary) break
322
+ if (boundary.start > MAX_SSE_EVENT_CHARS) {
323
+ throw new Error('MCP subscription SSE event exceeds its size limit')
324
+ }
325
+ const event = buffer.slice(0, boundary.start)
326
+ buffer = buffer.slice(boundary.end)
327
+ searchFrom = 0
328
+ for (const frame of parseSseMessages(event).messages) {
329
+ if (
330
+ !this.connected ||
331
+ owned.generation !== this.generation ||
332
+ owned.controller.signal.aborted
333
+ )
334
+ return
335
+ if (onMessage) onMessage(frame)
336
+ else for (const handler of [...this.messageHandlers]) handler(frame)
337
+ }
338
+ }
339
+ if (buffer.length > MAX_SSE_EVENT_CHARS) {
340
+ throw new Error('MCP subscription SSE event exceeds its size limit')
341
+ }
342
+ }
343
+ // A dangling partial event is not a notification. It cannot be
344
+ // forwarded as a complete JSON-RPC frame when the stream closes.
345
+ } finally {
346
+ owned.controller.signal.removeEventListener('abort', cancelReader)
347
+ cancelReader()
348
+ reader.releaseLock()
349
+ }
350
+ } finally {
351
+ owned.dispose()
352
+ }
353
+ }
354
+
216
355
  onMessage(handler: (message: MCPJsonRpcMessage) => void): void {
217
356
  this.messageHandlers.push(handler)
218
357
  }
@@ -300,22 +439,119 @@ export class StreamableHttpTransport implements MCPTransport {
300
439
  response: Response,
301
440
  operation: ConnectorHttpOperation,
302
441
  generation: number,
442
+ requestId: string | number | undefined,
303
443
  ): Promise<void> {
444
+ const contentType = response.headers.get('content-type') ?? ''
445
+ if (contentType.includes('text/event-stream') && response.body) {
446
+ await this.dispatchSseResponseMessages(response.body, operation, generation, requestId)
447
+ return
448
+ }
304
449
  const text = await operation.run(() => response.text())
305
450
  this.assertCurrent(generation, operation)
306
451
  if (text.trim().length === 0) return
307
452
 
308
- const contentType = response.headers.get('content-type') ?? ''
309
453
  const messages = contentType.includes('text/event-stream')
310
454
  ? this.parseSseAndCaptureEventId(text)
311
455
  : parseJsonMessages(text)
312
456
 
313
457
  for (const message of messages) {
458
+ this.dispatchMessage(message, operation, generation)
459
+ }
460
+ }
461
+
462
+ private dispatchMessage(
463
+ message: MCPJsonRpcMessage,
464
+ operation: ConnectorHttpOperation,
465
+ generation: number,
466
+ ): void {
467
+ this.assertCurrent(generation, operation)
468
+ for (const handler of [...this.messageHandlers]) {
314
469
  this.assertCurrent(generation, operation)
315
- for (const handler of [...this.messageHandlers]) {
470
+ handler(message)
471
+ }
472
+ }
473
+
474
+ /** Dispatch a complete SSE event as it arrives, without waiting for EOF. */
475
+ private async dispatchSseResponseMessages(
476
+ body: ReadableStream<Uint8Array>,
477
+ operation: ConnectorHttpOperation,
478
+ generation: number,
479
+ requestId: string | number | undefined,
480
+ ): Promise<void> {
481
+ const reader = body.getReader()
482
+ const decoder = new TextDecoder()
483
+ let buffer = ''
484
+ let previousChunkEndedWithCr = false
485
+ const dispatchEvent = (event: string): boolean => {
486
+ if (event.length > MAX_SSE_EVENT_CHARS) {
487
+ throw new Error('MCP response SSE event exceeds its size limit')
488
+ }
489
+ if (sseBatchExceedsMessageLimit(event, MAX_RESPONSE_SSE_MESSAGES_PER_EVENT)) {
490
+ throw new Error('MCP response SSE event exceeds its message limit')
491
+ }
492
+ const parsed = parseSseMessages(event)
493
+ if (parsed.lastEventId !== undefined) this.lastEventId = parsed.lastEventId
494
+ if (parsed.messages.length > MAX_RESPONSE_SSE_MESSAGES_PER_EVENT) {
495
+ throw new Error('MCP response SSE event exceeds its message limit')
496
+ }
497
+ for (const message of parsed.messages) {
498
+ this.dispatchMessage(message, operation, generation)
499
+ if (
500
+ requestId !== undefined &&
501
+ message.id === requestId &&
502
+ message.method === undefined &&
503
+ (Object.hasOwn(message, 'result') || Object.hasOwn(message, 'error'))
504
+ ) {
505
+ // The request is complete even if the peer keeps its SSE body open.
506
+ return true
507
+ }
508
+ }
509
+ return false
510
+ }
511
+ const appendChunk = (decoded: string): boolean => {
512
+ if (!decoded) return false
513
+ let chunk = decoded
514
+ // A CRLF split across reads is one line break; LF, CRLF and bare
515
+ // CR all delimit SSE lines.
516
+ if (previousChunkEndedWithCr && chunk.startsWith('\n')) chunk = chunk.slice(1)
517
+ previousChunkEndedWithCr = chunk.endsWith('\r')
518
+ buffer += chunk.replace(/\r\n|\r/g, '\n')
519
+ while (true) {
520
+ const boundary = findSseEventBoundary(buffer, 0)
521
+ if (!boundary) break
522
+ if (boundary.start > MAX_SSE_EVENT_CHARS) {
523
+ throw new Error('MCP response SSE event exceeds its size limit')
524
+ }
525
+ const event = buffer.slice(0, boundary.start)
526
+ buffer = buffer.slice(boundary.end)
527
+ if (dispatchEvent(event)) return true
528
+ }
529
+ if (buffer.length > MAX_SSE_EVENT_CHARS) {
530
+ throw new Error('MCP response SSE event exceeds its size limit')
531
+ }
532
+ return false
533
+ }
534
+ try {
535
+ while (true) {
536
+ const { done, value } = await operation.run(() => reader.read())
316
537
  this.assertCurrent(generation, operation)
317
- handler(message)
538
+ if (done) {
539
+ if (appendChunk(decoder.decode())) return
540
+ // Retain the old whole-body reader's acceptance of a final event
541
+ // without a trailing blank line when the peer actually closes.
542
+ if (buffer.trim()) dispatchEvent(buffer)
543
+ return
544
+ }
545
+ if (value.byteLength > MAX_SSE_CHUNK_BYTES) {
546
+ throw new Error('MCP response SSE chunk exceeds its size limit')
547
+ }
548
+ if (appendChunk(decoder.decode(value, { stream: true }))) return
318
549
  }
550
+ } finally {
551
+ // Cancelling is best effort: a hostile or custom body must not hold
552
+ // send() open after a terminal reply, timeout, or caller abort.
553
+ void reader.cancel().catch(() => undefined)
554
+ reader.releaseLock()
319
555
  }
320
556
  }
321
557
 
@@ -334,6 +570,67 @@ export class StreamableHttpTransport implements MCPTransport {
334
570
  }
335
571
  }
336
572
 
573
+ /** Count only top-level JSON-array separators, skipping nested values and strings. */
574
+ function sseBatchExceedsMessageLimit(event: string, limit: number): boolean {
575
+ const data = event
576
+ .split('\n')
577
+ .filter((line) => line.startsWith('data:'))
578
+ .map((line) => line.slice('data:'.length).trimStart())
579
+ .join('\n')
580
+ .trimStart()
581
+ if (!data.startsWith('[')) return false
582
+ let depth = 0
583
+ let inString = false
584
+ let escaped = false
585
+ let separators = 0
586
+ for (const character of data) {
587
+ if (inString) {
588
+ if (escaped) escaped = false
589
+ else if (character === '\\') escaped = true
590
+ else if (character === '"') inString = false
591
+ continue
592
+ }
593
+ if (character === '"') inString = true
594
+ else if (character === '[' || character === '{') depth++
595
+ else if (character === ']' || character === '}') depth--
596
+ else if (character === ',' && depth === 1 && ++separators >= limit) return true
597
+ }
598
+ return false
599
+ }
600
+
601
+ /** Find an SSE blank line after line endings have been normalized to LF. */
602
+ function findSseEventBoundary(
603
+ value: string,
604
+ from: number,
605
+ ): { start: number; end: number } | undefined {
606
+ const start = value.indexOf('\n\n', from)
607
+ return start < 0 ? undefined : { start, end: start + 2 }
608
+ }
609
+
610
+ /** Keep a rejected listen response useful for diagnosis without buffering an unbounded body. */
611
+ async function readSubscriptionErrorBody(
612
+ response: Response,
613
+ signal: AbortSignal,
614
+ timeoutMs: number,
615
+ ): Promise<string> {
616
+ const operation = new ConnectorHttpOperation(signal, timeoutMs, 'MCP subscription error body')
617
+ try {
618
+ const body = await readConnectorResponseBody(
619
+ response,
620
+ operation,
621
+ MAX_SUBSCRIPTION_ERROR_BODY_BYTES,
622
+ )
623
+ return typeof body === 'string' ? body : (JSON.stringify(body) ?? '')
624
+ } catch {
625
+ // The status is still the answer when a peer sends an unreadable,
626
+ // oversized, or stalled error body.
627
+ return ''
628
+ } finally {
629
+ operation.close()
630
+ void response.body?.cancel().catch(() => undefined)
631
+ }
632
+ }
633
+
337
634
  /**
338
635
  * The body of a failed response, or an empty string.
339
636
  *
@@ -13,5 +13,5 @@ export {
13
13
  } from './adapter.js'
14
14
  export type { ConnectorRouterInput } from './adapter.js'
15
15
 
16
- export { ConnectorToolRouter } from './router.js'
17
- export type { ConnectorToolStrategy, ConnectorToolRouterConfig } from './router.js'
16
+ export { connectorTools } from './router.js'
17
+ export type { ConnectorToolStrategy, ConnectorTools } from './router.js'
@@ -1,5 +1,5 @@
1
1
  import type { ConnectorManager } from '../../manager/connector/lifecycle.js'
2
- import type { ToolDefinition, ToolRegistryContract } from '../../types/tool/index.js'
2
+ import type { ToolDefinition } from '../../types/tool/index.js'
3
3
  import { toErrorMessage } from '../../utils/error.js'
4
4
  import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
5
5
  import { type Logger, resolveLogger } from '../../utils/logger.js'
@@ -7,69 +7,46 @@ import { connectorInstanceToTools, createConnectorRouterTool } from './adapter.j
7
7
 
8
8
  export type ConnectorToolStrategy = 'per-method' | 'router'
9
9
 
10
- export interface ConnectorToolRouterConfig {
11
- manager: ConnectorManager
10
+ export interface ConnectorTools {
12
11
  strategy?: ConnectorToolStrategy
13
12
  log?: Logger
14
13
  }
15
14
 
16
- export class ConnectorToolRouter {
17
- private manager: ConnectorManager
18
- private strategy: ConnectorToolStrategy
19
- private log: Logger
20
-
21
- constructor(config: ConnectorToolRouterConfig) {
22
- this.manager = config.manager
23
- this.strategy = config.strategy ?? 'per-method'
24
- this.log = resolveLogger(config.log).child({ [SCOPE_ATTRIBUTE]: 'connector/tools/router' })
25
- }
26
-
27
- getTools(): ToolDefinition[] {
28
- if (this.strategy === 'router') {
29
- const connected = this.manager.listConnectedInstances()
30
- if (connected.length === 0) return []
31
- return [createConnectorRouterTool(this.manager)]
32
- }
33
-
34
- const tools: ToolDefinition[] = []
35
- for (const instance of this.manager.listConnectedInstances()) {
36
- try {
37
- tools.push(...connectorInstanceToTools(instance.id, this.manager))
38
- } catch (err) {
39
- this.log.error('Failed to create tools for a connector instance', {
40
- 'namzu.connector.instance_id': instance.id,
41
- 'exception.message': toErrorMessage(err),
42
- })
43
- }
44
- }
45
- return tools
15
+ /**
16
+ * Every tool a connector manager's connected instances currently offer.
17
+ *
18
+ * Plain and stateless — a caller wraps the result in `toolset(source, tools)`
19
+ * (`toolsets/toolset.ts`) itself, re-calling this whenever a reconnect or a
20
+ * drift notice (`onMCPToolDrift`-shaped) means the set may have changed. This
21
+ * replaces `ConnectorToolRouter`, whose `registerTools`/`unregisterTools`/
22
+ * `refreshTools` mutated a `ToolRegistryContract` directly (plan.md v3 §2)
23
+ * and had no production caller; a live toolset with its own `onChange` is
24
+ * where that live-refresh story belongs now, not a router bound to a
25
+ * specific registry instance.
26
+ */
27
+ export function connectorTools(
28
+ manager: ConnectorManager,
29
+ config: ConnectorTools = {},
30
+ ): ToolDefinition[] {
31
+ const strategy = config.strategy ?? 'per-method'
32
+ const log = resolveLogger(config.log).child({ [SCOPE_ATTRIBUTE]: 'connector/tools/router' })
33
+
34
+ if (strategy === 'router') {
35
+ const connected = manager.listConnectedInstances()
36
+ if (connected.length === 0) return []
37
+ return [createConnectorRouterTool(manager)]
46
38
  }
47
39
 
48
- registerTools(toolRegistry: ToolRegistryContract): string[] {
49
- const tools = this.getTools()
50
- const names: string[] = []
51
- for (const tool of tools) {
52
- toolRegistry.register(tool)
53
- names.push(tool.name)
40
+ const tools: ToolDefinition[] = []
41
+ for (const instance of manager.listConnectedInstances()) {
42
+ try {
43
+ tools.push(...connectorInstanceToTools(instance.id, manager))
44
+ } catch (err) {
45
+ log.error('Failed to create tools for a connector instance', {
46
+ 'namzu.connector.instance_id': instance.id,
47
+ 'exception.message': toErrorMessage(err),
48
+ })
54
49
  }
55
- this.log.info('Registered connector tools', {
56
- 'namzu.connector.tool_count': names.length,
57
- 'namzu.tool.names': names,
58
- })
59
- return names
60
- }
61
-
62
- unregisterTools(toolRegistry: ToolRegistryContract, toolNames: string[]): void {
63
- for (const name of toolNames) {
64
- toolRegistry.unregister(name)
65
- }
66
- this.log.info('Unregistered connector tools', {
67
- 'namzu.connector.tool_count': toolNames.length,
68
- })
69
- }
70
-
71
- refreshTools(toolRegistry: ToolRegistryContract, previousNames: string[]): string[] {
72
- this.unregisterTools(toolRegistry, previousNames)
73
- return this.registerTools(toolRegistry)
74
50
  }
51
+ return tools
75
52
  }
@@ -1,6 +1,7 @@
1
1
  import { DEFAULT_TIMEOUT_MS, DEFAULT_TOKEN_BUDGET } from '../agents/runAgent.js'
2
2
  import type { AgentIdentity } from '../agents/runAgent.js'
3
- import { ToolRegistry } from '../registry/tool/execute.js'
3
+ import { toolset } from '../toolsets/toolset.js'
4
+ import type { Toolset } from '../toolsets/types.js'
4
5
  import type { SupervisorAgentConfig } from '../types/agent/supervisor.js'
5
6
  import type { LLMProvider } from '../types/provider/index.js'
6
7
 
@@ -44,14 +45,17 @@ export interface DelegatePlan {
44
45
  readonly manifest: DirectoryManifest
45
46
  /** The delegate's own instructions, tools and model, already assembled. */
46
47
  readonly systemPrompt: string
47
- readonly tools: ToolRegistry
48
+ readonly toolsets: readonly Toolset[]
48
49
  readonly model: string
49
50
  }
50
51
 
51
- function toolsOf(manifest: DirectoryManifest): ToolRegistry {
52
- const tools = new ToolRegistry()
53
- for (const entry of manifest.tools) tools.register(entry.definition)
54
- return tools
52
+ function toolsOf(manifest: DirectoryManifest): readonly Toolset[] {
53
+ return [
54
+ toolset(
55
+ 'directory',
56
+ manifest.tools.map((entry) => entry.definition),
57
+ ),
58
+ ]
55
59
  }
56
60
 
57
61
  function delegatePlan(entry: SubAgentEntry, fallbackModel: string): DelegatePlan {
@@ -59,7 +63,7 @@ function delegatePlan(entry: SubAgentEntry, fallbackModel: string): DelegatePlan
59
63
  id: entry.id,
60
64
  manifest: entry.manifest,
61
65
  systemPrompt: entry.manifest.instructions,
62
- tools: toolsOf(entry.manifest),
66
+ toolsets: toolsOf(entry.manifest),
63
67
  // A delegate may name its own model — a cheap one for a narrow job is
64
68
  // the common case — and inherits the supervisor's only when it does
65
69
  // not. Inheriting unconditionally would silently bill every specialist
@@ -114,7 +118,7 @@ export function deriveSupervisorOptions(
114
118
  agentManager: input.agentManager,
115
119
  agentIds: delegates.map((d) => d.id),
116
120
  systemPrompt: manifest.instructions,
117
- tools: toolsOf(manifest),
121
+ toolsets: toolsOf(manifest),
118
122
  // Skills were loaded and then dropped. The manifest reads a whole
119
123
  // `skills/` directory and `SupervisorAgentConfig` takes them, and the
120
124
  // cast that used to close this object meant nobody was told the field
@@ -1,6 +1,5 @@
1
1
  import type { RunAgentOptions } from '../agents/runAgent.js'
2
- import { ToolRegistry } from '../registry/tool/execute.js'
3
-
2
+ import { toolset } from '../toolsets/toolset.js'
4
3
  import type { DeriveTurnOptionsInput, DirectoryManifest } from './types.js'
5
4
 
6
5
  /**
@@ -32,14 +31,18 @@ export function deriveTurnOptions(
32
31
  )
33
32
  }
34
33
 
35
- const tools = new ToolRegistry()
36
- for (const entry of manifest.tools) tools.register(entry.definition)
34
+ const toolsets = [
35
+ toolset(
36
+ 'directory',
37
+ manifest.tools.map((entry) => entry.definition),
38
+ ),
39
+ ]
37
40
 
38
41
  return {
39
42
  provider: input.provider,
40
43
  prompt: input.prompt,
41
44
  model,
42
- tools,
45
+ toolsets,
43
46
  // The one value the project knows and `runAgent` cannot infer. Left
44
47
  // unset it would default to the host's own cwd, pointing the file
45
48
  // tools' containment at the host's source tree rather than at the
@@ -18,7 +18,7 @@
18
18
  * backend that cannot withhold those is not a backend for this.
19
19
  * - **Everything it can do, it does by asking.** The only channel out is a
20
20
  * call back into the host, which is what makes NZ-EXEC-06's dispatch
21
- * through the turn's own `ToolRegistry` possible — the program cannot
21
+ * through the turn's own `ToolManager` possible — the program cannot
22
22
  * reach a tool the turn did not grant, because it cannot reach anything.
23
23
  * - **Bounded.** Wall clock and output, both enforced by the backend
24
24
  * rather than requested of the program.
@@ -57,7 +57,7 @@ export interface HostCallContext {
57
57
  * What the host will answer.
58
58
  *
59
59
  * A function rather than a table, so the host decides per call. NZ-EXEC-06
60
- * makes this the turn's `ToolRegistry` and its permission gate, which is
60
+ * makes this the turn's `ToolManager` and its permission gate, which is
61
61
  * exactly the point: the program's reach is the turn's reach, resolved at
62
62
  * the moment of the call rather than frozen when the program started.
63
63
  */
@@ -9,6 +9,7 @@
9
9
  // worse home than the one it started in.
10
10
 
11
11
  import { ManagedRegistry } from '../registry/ManagedRegistry.js'
12
+ import { RegistryCollisionError } from '../registry/collision.js'
12
13
 
13
14
  /**
14
15
  * What a module's check said about its own claim, the moment it was asked.
@@ -50,12 +51,14 @@ export type InvariantCheck<TContext = unknown> = (
50
51
  * every reference to the other's `id` kept resolving as if it still existed.
51
52
  * Mirrors `ProbeNameCollisionError`.
52
53
  */
53
- export class InvariantNameCollisionError extends Error {
54
+ export class InvariantNameCollisionError extends RegistryCollisionError {
54
55
  readonly moduleName: string
55
56
  readonly invariantName: string
56
57
 
57
58
  constructor(moduleName: string, invariantName: string) {
58
59
  super(
60
+ 'InvariantRegistry',
61
+ `${moduleName}:${invariantName}`,
59
62
  `Invariant "${moduleName}:${invariantName}" is already registered. Two modules picked the same name, or this module registered itself twice — pick a different name, or find the second registration.`,
60
63
  )
61
64
  this.name = 'InvariantNameCollisionError'