@namzu/sdk 45.1.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 (767) hide show
  1. package/CHANGELOG.md +436 -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 +13 -2
  71. package/dist/authorization/gate.d.ts.map +1 -1
  72. package/dist/authorization/gate.js +37 -5
  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 +27 -1
  85. package/dist/authorization/rules.js.map +1 -1
  86. package/dist/authorization/shell-lexer.d.ts +39 -0
  87. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  88. package/dist/authorization/shell-lexer.js +113 -69
  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/pricing/catalogue.generated.d.ts.map +1 -1
  231. package/dist/pricing/catalogue.generated.js +28 -4
  232. package/dist/pricing/catalogue.generated.js.map +1 -1
  233. package/dist/probe/errors.d.ts +2 -1
  234. package/dist/probe/errors.d.ts.map +1 -1
  235. package/dist/probe/errors.js +3 -2
  236. package/dist/probe/errors.js.map +1 -1
  237. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  238. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  239. package/dist/prompt/coding-agent-doctrine.js +11 -6
  240. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  241. package/dist/prompt/contributions.d.ts +4 -1
  242. package/dist/prompt/contributions.d.ts.map +1 -1
  243. package/dist/prompt/contributions.js +7 -2
  244. package/dist/prompt/contributions.js.map +1 -1
  245. package/dist/prompt/index.d.ts +1 -1
  246. package/dist/prompt/index.d.ts.map +1 -1
  247. package/dist/prompt/index.js +1 -1
  248. package/dist/prompt/index.js.map +1 -1
  249. package/dist/provider/collect-chat-completion.d.ts +6 -1
  250. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  251. package/dist/provider/collect-chat-completion.js +88 -10
  252. package/dist/provider/collect-chat-completion.js.map +1 -1
  253. package/dist/provider/mock.d.ts.map +1 -1
  254. package/dist/provider/mock.js +23 -6
  255. package/dist/provider/mock.js.map +1 -1
  256. package/dist/provider/registry.d.ts +2 -1
  257. package/dist/provider/registry.d.ts.map +1 -1
  258. package/dist/provider/registry.js +3 -2
  259. package/dist/provider/registry.js.map +1 -1
  260. package/dist/provider/tool-call-framing.d.ts +164 -0
  261. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  262. package/dist/provider/tool-call-framing.js +163 -0
  263. package/dist/provider/tool-call-framing.js.map +1 -0
  264. package/dist/public-runtime.d.ts +27 -14
  265. package/dist/public-runtime.d.ts.map +1 -1
  266. package/dist/public-runtime.js +49 -11
  267. package/dist/public-runtime.js.map +1 -1
  268. package/dist/public-tools.d.ts +9 -6
  269. package/dist/public-tools.d.ts.map +1 -1
  270. package/dist/public-tools.js +13 -5
  271. package/dist/public-tools.js.map +1 -1
  272. package/dist/public-types.d.ts +16 -5
  273. package/dist/public-types.d.ts.map +1 -1
  274. package/dist/read-model/registry.d.ts +2 -1
  275. package/dist/read-model/registry.d.ts.map +1 -1
  276. package/dist/read-model/registry.js +3 -2
  277. package/dist/read-model/registry.js.map +1 -1
  278. package/dist/registry/ManagedRegistry.d.ts +30 -0
  279. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  280. package/dist/registry/ManagedRegistry.js +45 -6
  281. package/dist/registry/ManagedRegistry.js.map +1 -1
  282. package/dist/registry/collision.d.ts +57 -0
  283. package/dist/registry/collision.d.ts.map +1 -0
  284. package/dist/registry/collision.js +41 -0
  285. package/dist/registry/collision.js.map +1 -0
  286. package/dist/registry/command/index.d.ts +5 -3
  287. package/dist/registry/command/index.d.ts.map +1 -1
  288. package/dist/registry/command/index.js +6 -4
  289. package/dist/registry/command/index.js.map +1 -1
  290. package/dist/registry/index.d.ts +3 -4
  291. package/dist/registry/index.d.ts.map +1 -1
  292. package/dist/registry/index.js +2 -2
  293. package/dist/registry/index.js.map +1 -1
  294. package/dist/registry/plugin/index.d.ts.map +1 -1
  295. package/dist/registry/plugin/index.js +14 -1
  296. package/dist/registry/plugin/index.js.map +1 -1
  297. package/dist/registry/tool/callable.d.ts +22 -0
  298. package/dist/registry/tool/callable.d.ts.map +1 -0
  299. package/dist/registry/tool/callable.js +28 -0
  300. package/dist/registry/tool/callable.js.map +1 -0
  301. package/dist/registry/tool/execute.d.ts +14 -77
  302. package/dist/registry/tool/execute.d.ts.map +1 -1
  303. package/dist/registry/tool/execute.js +15 -720
  304. package/dist/registry/tool/execute.js.map +1 -1
  305. package/dist/registry/tool/portable.d.ts +25 -0
  306. package/dist/registry/tool/portable.d.ts.map +1 -1
  307. package/dist/registry/tool/portable.js +50 -0
  308. package/dist/registry/tool/portable.js.map +1 -1
  309. package/dist/registry/tool/presentation.d.ts +6 -5
  310. package/dist/registry/tool/presentation.d.ts.map +1 -1
  311. package/dist/registry/tool/presentation.js +3 -3
  312. package/dist/registry/tool/presentation.js.map +1 -1
  313. package/dist/runtime/bidi/session.d.ts +5 -4
  314. package/dist/runtime/bidi/session.d.ts.map +1 -1
  315. package/dist/runtime/bidi/session.js +18 -1
  316. package/dist/runtime/bidi/session.js.map +1 -1
  317. package/dist/runtime/query/executor/tool-call-admission.d.ts +82 -13
  318. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  319. package/dist/runtime/query/executor/tool-call-admission.js +227 -17
  320. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  321. package/dist/runtime/query/executor.d.ts +37 -5
  322. package/dist/runtime/query/executor.d.ts.map +1 -1
  323. package/dist/runtime/query/executor.js +103 -14
  324. package/dist/runtime/query/executor.js.map +1 -1
  325. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  326. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  327. package/dist/runtime/query/file-evidence-replay.js +8 -7
  328. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  329. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  330. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  331. package/dist/runtime/query/fork/prepare.js +4 -0
  332. package/dist/runtime/query/fork/prepare.js.map +1 -1
  333. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  334. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  335. package/dist/runtime/query/guardrail-presets.js +4 -3
  336. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  337. package/dist/runtime/query/index.d.ts +23 -10
  338. package/dist/runtime/query/index.d.ts.map +1 -1
  339. package/dist/runtime/query/index.js +149 -70
  340. package/dist/runtime/query/index.js.map +1 -1
  341. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  342. package/dist/runtime/query/iteration/index.js +8 -1
  343. package/dist/runtime/query/iteration/index.js.map +1 -1
  344. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  345. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  346. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  347. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  348. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  350. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  351. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  352. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  353. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  354. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  355. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  356. package/dist/runtime/query/iteration/tool-input.js +291 -0
  357. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  358. package/dist/runtime/query/observation-context.d.ts +2 -2
  359. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  360. package/dist/runtime/query/observation-context.js.map +1 -1
  361. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  362. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  363. package/dist/runtime/query/prelude-lease.js +121 -0
  364. package/dist/runtime/query/prelude-lease.js.map +1 -0
  365. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  366. package/dist/runtime/query/prepare-turn.js +386 -187
  367. package/dist/runtime/query/prepare-turn.js.map +1 -1
  368. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  369. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  370. package/dist/runtime/query/prompt.d.ts +2 -2
  371. package/dist/runtime/query/prompt.d.ts.map +1 -1
  372. package/dist/runtime/query/prompt.js +1 -1
  373. package/dist/runtime/query/prompt.js.map +1 -1
  374. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  375. package/dist/runtime/query/resume-session.js +37 -2
  376. package/dist/runtime/query/resume-session.js.map +1 -1
  377. package/dist/runtime/query/review-policy.d.ts +65 -3
  378. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  379. package/dist/runtime/query/review-policy.js +143 -22
  380. package/dist/runtime/query/review-policy.js.map +1 -1
  381. package/dist/runtime/query/tooling.d.ts +3 -2
  382. package/dist/runtime/query/tooling.d.ts.map +1 -1
  383. package/dist/runtime/query/tooling.js.map +1 -1
  384. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  385. package/dist/runtime/query/turn-state.js +5 -0
  386. package/dist/runtime/query/turn-state.js.map +1 -1
  387. package/dist/runtime/system-events.d.ts +112 -0
  388. package/dist/runtime/system-events.d.ts.map +1 -0
  389. package/dist/runtime/system-events.js +183 -0
  390. package/dist/runtime/system-events.js.map +1 -0
  391. package/dist/scheduler/delegating.d.ts +2 -1
  392. package/dist/scheduler/delegating.d.ts.map +1 -1
  393. package/dist/scheduler/delegating.js +3 -2
  394. package/dist/scheduler/delegating.js.map +1 -1
  395. package/dist/skills/index.d.ts +1 -1
  396. package/dist/skills/index.d.ts.map +1 -1
  397. package/dist/skills/index.js +1 -1
  398. package/dist/skills/index.js.map +1 -1
  399. package/dist/skills/registry.d.ts +18 -0
  400. package/dist/skills/registry.d.ts.map +1 -1
  401. package/dist/skills/registry.js +20 -0
  402. package/dist/skills/registry.js.map +1 -1
  403. package/dist/store/evidence/index-page.d.ts +2 -2
  404. package/dist/store/session-log/conformance.d.ts +1 -1
  405. package/dist/store/session-log/conformance.d.ts.map +1 -1
  406. package/dist/store/session-log/conformance.js +49 -8
  407. package/dist/store/session-log/conformance.js.map +1 -1
  408. package/dist/store/session-log/core.d.ts +8 -3
  409. package/dist/store/session-log/core.d.ts.map +1 -1
  410. package/dist/store/session-log/core.js +2 -1
  411. package/dist/store/session-log/core.js.map +1 -1
  412. package/dist/store/session-log/fold.d.ts +12 -0
  413. package/dist/store/session-log/fold.d.ts.map +1 -1
  414. package/dist/store/session-log/fold.js +57 -7
  415. package/dist/store/session-log/fold.js.map +1 -1
  416. package/dist/store/session-log/index.d.ts +2 -2
  417. package/dist/store/session-log/index.d.ts.map +1 -1
  418. package/dist/store/session-log/index.js +1 -1
  419. package/dist/store/session-log/index.js.map +1 -1
  420. package/dist/test-support/toolset.d.ts +19 -0
  421. package/dist/test-support/toolset.d.ts.map +1 -0
  422. package/dist/test-support/toolset.js +20 -0
  423. package/dist/test-support/toolset.js.map +1 -0
  424. package/dist/tools/builtins/bash.d.ts +29 -0
  425. package/dist/tools/builtins/bash.d.ts.map +1 -1
  426. package/dist/tools/builtins/bash.js +19 -9
  427. package/dist/tools/builtins/bash.js.map +1 -1
  428. package/dist/tools/builtins/browser-url.d.ts +1 -1
  429. package/dist/tools/builtins/browser-url.js +1 -1
  430. package/dist/tools/builtins/browser.d.ts +6 -6
  431. package/dist/tools/builtins/computer-use-coordinates.d.ts +65 -0
  432. package/dist/tools/builtins/computer-use-coordinates.d.ts.map +1 -0
  433. package/dist/tools/builtins/computer-use-coordinates.js +123 -0
  434. package/dist/tools/builtins/computer-use-coordinates.js.map +1 -0
  435. package/dist/tools/builtins/computer-use-image.d.ts +77 -0
  436. package/dist/tools/builtins/computer-use-image.d.ts.map +1 -0
  437. package/dist/tools/builtins/computer-use-image.js +223 -0
  438. package/dist/tools/builtins/computer-use-image.js.map +1 -0
  439. package/dist/tools/builtins/computer-use.d.ts +519 -14
  440. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  441. package/dist/tools/builtins/computer-use.js +1196 -183
  442. package/dist/tools/builtins/computer-use.js.map +1 -1
  443. package/dist/tools/builtins/edit.d.ts.map +1 -1
  444. package/dist/tools/builtins/edit.js +9 -1
  445. package/dist/tools/builtins/edit.js.map +1 -1
  446. package/dist/tools/builtins/index.d.ts +2 -1
  447. package/dist/tools/builtins/index.d.ts.map +1 -1
  448. package/dist/tools/builtins/index.js +1 -1
  449. package/dist/tools/builtins/index.js.map +1 -1
  450. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  451. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  452. package/dist/tools/builtins/json-string-hint.js +17 -0
  453. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  454. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  455. package/dist/tools/builtins/search-tools.js +7 -15
  456. package/dist/tools/builtins/search-tools.js.map +1 -1
  457. package/dist/tools/builtins/skill.d.ts +74 -0
  458. package/dist/tools/builtins/skill.d.ts.map +1 -1
  459. package/dist/tools/builtins/skill.js +214 -174
  460. package/dist/tools/builtins/skill.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 +12 -0
  482. package/dist/tools/defineTool.d.ts.map +1 -1
  483. package/dist/tools/defineTool.js +24 -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/present.d.ts.map +1 -1
  500. package/dist/tools/schedules/present.js +2 -0
  501. package/dist/tools/schedules/present.js.map +1 -1
  502. package/dist/tools/schedules/schedule-tool.d.ts +6 -5
  503. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  504. package/dist/tools/schedules/schedule-tool.js +208 -37
  505. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  506. package/dist/tools/schedules/types.d.ts +120 -6
  507. package/dist/tools/schedules/types.d.ts.map +1 -1
  508. package/dist/tools/trusted-read-only.d.ts +9 -5
  509. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  510. package/dist/tools/trusted-read-only.js +14 -10
  511. package/dist/tools/trusted-read-only.js.map +1 -1
  512. package/dist/tools/untrusted-envelope.d.ts +67 -28
  513. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  514. package/dist/tools/untrusted-envelope.js +108 -59
  515. package/dist/tools/untrusted-envelope.js.map +1 -1
  516. package/dist/toolsets/combine.d.ts +44 -0
  517. package/dist/toolsets/combine.d.ts.map +1 -0
  518. package/dist/toolsets/combine.js +153 -0
  519. package/dist/toolsets/combine.js.map +1 -0
  520. package/dist/toolsets/manager.d.ts +201 -0
  521. package/dist/toolsets/manager.d.ts.map +1 -0
  522. package/dist/toolsets/manager.js +837 -0
  523. package/dist/toolsets/manager.js.map +1 -0
  524. package/dist/toolsets/source-glob.d.ts +15 -0
  525. package/dist/toolsets/source-glob.d.ts.map +1 -0
  526. package/dist/toolsets/source-glob.js +23 -0
  527. package/dist/toolsets/source-glob.js.map +1 -0
  528. package/dist/toolsets/toolset.d.ts +20 -0
  529. package/dist/toolsets/toolset.d.ts.map +1 -0
  530. package/dist/toolsets/toolset.js +28 -0
  531. package/dist/toolsets/toolset.js.map +1 -0
  532. package/dist/toolsets/types.d.ts +128 -0
  533. package/dist/toolsets/types.d.ts.map +1 -0
  534. package/dist/toolsets/types.js +33 -0
  535. package/dist/toolsets/types.js.map +1 -0
  536. package/dist/toolsets/wrappers.d.ts +59 -0
  537. package/dist/toolsets/wrappers.d.ts.map +1 -0
  538. package/dist/toolsets/wrappers.js +165 -0
  539. package/dist/toolsets/wrappers.js.map +1 -0
  540. package/dist/types/agent/base.d.ts +27 -16
  541. package/dist/types/agent/base.d.ts.map +1 -1
  542. package/dist/types/agent/index.d.ts +1 -0
  543. package/dist/types/agent/index.d.ts.map +1 -1
  544. package/dist/types/agent/index.js +1 -0
  545. package/dist/types/agent/index.js.map +1 -1
  546. package/dist/types/agent/pipeline.d.ts +2 -0
  547. package/dist/types/agent/pipeline.d.ts.map +1 -1
  548. package/dist/types/agent/query.d.ts +117 -0
  549. package/dist/types/agent/query.d.ts.map +1 -0
  550. package/dist/types/agent/query.js +2 -0
  551. package/dist/types/agent/query.js.map +1 -0
  552. package/dist/types/agent/reactive.d.ts +2 -129
  553. package/dist/types/agent/reactive.d.ts.map +1 -1
  554. package/dist/types/agent/router.d.ts +2 -0
  555. package/dist/types/agent/router.d.ts.map +1 -1
  556. package/dist/types/agent/supervisor.d.ts +5 -2
  557. package/dist/types/agent/supervisor.d.ts.map +1 -1
  558. package/dist/types/authorization/index.d.ts +70 -12
  559. package/dist/types/authorization/index.d.ts.map +1 -1
  560. package/dist/types/authorization/index.js +11 -0
  561. package/dist/types/authorization/index.js.map +1 -1
  562. package/dist/types/computer-use/index.d.ts +176 -0
  563. package/dist/types/computer-use/index.d.ts.map +1 -1
  564. package/dist/types/computer-use/index.js.map +1 -1
  565. package/dist/types/connector/mcp.d.ts +32 -0
  566. package/dist/types/connector/mcp.d.ts.map +1 -1
  567. package/dist/types/errors/index.d.ts +15 -0
  568. package/dist/types/errors/index.d.ts.map +1 -1
  569. package/dist/types/errors/index.js.map +1 -1
  570. package/dist/types/hitl/index.d.ts +57 -0
  571. package/dist/types/hitl/index.d.ts.map +1 -1
  572. package/dist/types/hitl/index.js.map +1 -1
  573. package/dist/types/message/index.d.ts +130 -9
  574. package/dist/types/message/index.d.ts.map +1 -1
  575. package/dist/types/message/index.js +4 -1
  576. package/dist/types/message/index.js.map +1 -1
  577. package/dist/types/plugin/index.d.ts +22 -4
  578. package/dist/types/plugin/index.d.ts.map +1 -1
  579. package/dist/types/plugin/index.js +1 -0
  580. package/dist/types/plugin/index.js.map +1 -1
  581. package/dist/types/provider/chat.d.ts +5 -0
  582. package/dist/types/provider/chat.d.ts.map +1 -1
  583. package/dist/types/provider/config.d.ts +8 -3
  584. package/dist/types/provider/config.d.ts.map +1 -1
  585. package/dist/types/provider/stream.d.ts +39 -0
  586. package/dist/types/provider/stream.d.ts.map +1 -1
  587. package/dist/types/sandbox/index.d.ts +1 -1
  588. package/dist/types/session/events.d.ts +14 -3
  589. package/dist/types/session/events.d.ts.map +1 -1
  590. package/dist/types/session/events.js.map +1 -1
  591. package/dist/types/tool/index.d.ts +171 -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 +3 -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 +46 -5
  616. package/src/authorization/program.ts +773 -0
  617. package/src/authorization/reexec-wrapper.ts +589 -0
  618. package/src/authorization/rules.ts +36 -1
  619. package/src/authorization/shell-lexer.ts +136 -63
  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 +58 -3
  625. package/src/connector/mcp/client.ts +20 -4
  626. package/src/connector/mcp/discovery.ts +60 -0
  627. package/src/connector/mcp/index.ts +13 -0
  628. package/src/connector/mcp/mcp-toolset.ts +515 -0
  629. package/src/connector/tools/index.ts +2 -2
  630. package/src/connector/tools/router.ts +35 -58
  631. package/src/directory/derive-supervisor.ts +12 -8
  632. package/src/directory/derive.ts +8 -5
  633. package/src/execution/code-runtime/types.ts +2 -2
  634. package/src/invariants/index.ts +4 -1
  635. package/src/manager/agent/lifecycle.ts +9 -0
  636. package/src/manager/connector/environment.ts +17 -4
  637. package/src/manager/connector/index.ts +2 -2
  638. package/src/manager/connector/tenant.ts +17 -4
  639. package/src/manager/index.ts +2 -2
  640. package/src/manager/session/attribution.ts +79 -0
  641. package/src/manager/session/turn-recorder.ts +211 -55
  642. package/src/peers/address.ts +58 -0
  643. package/src/peers/client.ts +202 -0
  644. package/src/peers/dir.ts +176 -0
  645. package/src/peers/endpoint.ts +564 -0
  646. package/src/peers/envelope.ts +121 -0
  647. package/src/peers/index.ts +96 -0
  648. package/src/peers/protocol.ts +196 -0
  649. package/src/peers/record.ts +56 -0
  650. package/src/peers/registry.ts +241 -0
  651. package/src/plugin/define.ts +68 -0
  652. package/src/plugin/index.ts +2 -0
  653. package/src/plugin/lifecycle.ts +286 -106
  654. package/src/plugin/resolver.ts +6 -3
  655. package/src/plugin/shell-hook.ts +21 -5
  656. package/src/pricing/catalogue.generated.ts +28 -4
  657. package/src/pricing/rates.source.json +27 -6
  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 +152 -9
  667. package/src/public-tools.ts +43 -5
  668. package/src/public-types.ts +65 -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 +36 -0
  676. package/src/registry/tool/execute.ts +16 -839
  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 +288 -22
  681. package/src/runtime/query/executor.ts +129 -16
  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 +190 -24
  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/skills/index.ts +1 -1
  704. package/src/skills/registry.ts +33 -0
  705. package/src/store/session-log/conformance.ts +51 -8
  706. package/src/store/session-log/core.ts +10 -4
  707. package/src/store/session-log/fold.ts +33 -7
  708. package/src/store/session-log/index.ts +2 -0
  709. package/src/test-support/toolset.ts +23 -0
  710. package/src/tools/builtins/bash.ts +27 -10
  711. package/src/tools/builtins/browser-url.ts +1 -1
  712. package/src/tools/builtins/computer-use-coordinates.ts +144 -0
  713. package/src/tools/builtins/computer-use-image.ts +278 -0
  714. package/src/tools/builtins/computer-use.ts +1495 -191
  715. package/src/tools/builtins/edit.ts +12 -2
  716. package/src/tools/builtins/index.ts +7 -1
  717. package/src/tools/builtins/json-string-hint.ts +16 -0
  718. package/src/tools/builtins/search-tools.ts +7 -20
  719. package/src/tools/builtins/skill.ts +304 -174
  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 +38 -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/present.ts +2 -0
  732. package/src/tools/schedules/schedule-tool.ts +238 -39
  733. package/src/tools/schedules/types.ts +120 -6
  734. package/src/tools/trusted-read-only.ts +19 -10
  735. package/src/tools/untrusted-envelope.ts +121 -57
  736. package/src/toolsets/combine.ts +181 -0
  737. package/src/toolsets/manager.ts +996 -0
  738. package/src/toolsets/source-glob.ts +22 -0
  739. package/src/toolsets/toolset.ts +31 -0
  740. package/src/toolsets/types.ts +154 -0
  741. package/src/toolsets/wrappers.ts +191 -0
  742. package/src/types/agent/base.ts +29 -16
  743. package/src/types/agent/index.ts +1 -0
  744. package/src/types/agent/pipeline.ts +2 -0
  745. package/src/types/agent/query.ts +129 -0
  746. package/src/types/agent/reactive.ts +5 -142
  747. package/src/types/agent/router.ts +2 -0
  748. package/src/types/agent/supervisor.ts +5 -2
  749. package/src/types/authorization/index.ts +33 -0
  750. package/src/types/computer-use/index.ts +202 -0
  751. package/src/types/connector/mcp.ts +32 -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/tool/index.ts +173 -105
  762. package/src/types/toolset/index.ts +10 -47
  763. package/dist/registry/toolset/catalog.d.ts +0 -42
  764. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  765. package/dist/registry/toolset/catalog.js +0 -234
  766. package/dist/registry/toolset/catalog.js.map +0 -1
  767. package/src/registry/toolset/catalog.ts +0 -308
@@ -0,0 +1,515 @@
1
+ import { createHash } from 'node:crypto'
2
+ import { z } from 'zod'
3
+
4
+ import { NAMZU } from '../../constants/telemetry/index.js'
5
+ import { ToolsetConflictError } from '../../toolsets/combine.js'
6
+ import type { Toolset, ToolsetAvailability } from '../../toolsets/types.js'
7
+ import { deferred } from '../../toolsets/wrappers.js'
8
+ import type { MCPResource, MCPServerCapabilities } from '../../types/connector/index.js'
9
+ import type { ToolContext, ToolDefinition, ToolResult } from '../../types/tool/index.js'
10
+ import type { ToolSource } from '../../types/toolset/index.js'
11
+ import { toErrorMessage } from '../../utils/error.js'
12
+ import { SCOPE_ATTRIBUTE } from '../../utils/log/types.js'
13
+ import { type Logger, resolveLogger } from '../../utils/logger.js'
14
+ import { frameServerResult, mcpToolResultToToolResult, mcpToolToToolDefinition } from './adapter.js'
15
+ import type { MCPClient } from './client.js'
16
+ import { MCPToolDiscovery } from './discovery.js'
17
+ import type { MCPToolDrift } from './policy.js'
18
+ import { mcpPromptToToolDefinition } from './prompt-adapter.js'
19
+ import {
20
+ type MCPReconnectOptions,
21
+ type MCPReconnectPolicySource,
22
+ MCPReconnectSupervisor,
23
+ } from './reconnect.js'
24
+
25
+ /**
26
+ * `mcp__<server>__<rest>`, the one MCP naming convention (plan.md §4,
27
+ * "Names become `mcp__<server>__<tool>` everywhere"). Before this, the CLI's
28
+ * own path minted `mcp_<server>_<tool>` (single underscore, ambiguous the
29
+ * moment either name contains one) while the plugin path already used
30
+ * `mcp__`; this toolset is the one place both now go through.
31
+ *
32
+ * `mcpToolToToolDefinition`/`mcpPromptToToolDefinition` keep their OWN
33
+ * historical naming (`mcp_<server>_<tool>` / `mcp_prompt_<server>_<name>`)
34
+ * for direct adapter users — this module renames what they hand back rather
35
+ * than changing what they produce. The CLI and plugin lifecycle both use
36
+ * this toolset.
37
+ */
38
+ const MCP_TOOLSET_NAME_MAX_LENGTH = 64
39
+
40
+ /**
41
+ * Join `serverName` and `segments` under the `mcp__` convention, shortened
42
+ * deterministically when the result would not fit the wire's 64-character
43
+ * tool-name ceiling.
44
+ *
45
+ * Never refuses a tool silently: a name over the limit is truncated and
46
+ * given an 8-hex-character content hash suffix (`_<hash>`) instead of being
47
+ * dropped, so two overlong names that happen to share a 55-character prefix
48
+ * still end up distinct. The hash is over the FULL untruncated name, so
49
+ * renaming is a pure function of `(serverName, segments)` — the same inputs
50
+ * always shorten to the same output, which is what makes a later call
51
+ * (`callTool`, permission rules keyed by name) able to reconstruct it.
52
+ */
53
+ export function mcpToolsetName(serverName: string, ...segments: readonly string[]): string {
54
+ const full = ['mcp', serverName, ...segments].join('__')
55
+ if (full.length <= MCP_TOOLSET_NAME_MAX_LENGTH) return full
56
+ const hash = createHash('sha256').update(full).digest('hex').slice(0, 8)
57
+ const suffix = `_${hash}`
58
+ return `${full.slice(0, MCP_TOOLSET_NAME_MAX_LENGTH - suffix.length)}${suffix}`
59
+ }
60
+
61
+ export interface MCPToolsetOptions {
62
+ /**
63
+ * `ToolSource.id` for the returned toolset. Defaults to `mcp:<server
64
+ * name>`. A caller composing several servers under one namespace — a
65
+ * plugin's own MCP server, say — passes its own hierarchical id (for
66
+ * instance `plugin:<name>/mcp:<server>`) so the source id says where the
67
+ * connection came from, not only which server it reached.
68
+ */
69
+ readonly id?: string
70
+ /**
71
+ * Names (as the SERVER reports them, before the `mcp__` prefix) this
72
+ * toolset admits from `tools/list` and `prompts/list`. Absent admits
73
+ * everything, matching `MCPToolDiscovery`'s own default.
74
+ */
75
+ readonly allow?: readonly string[]
76
+ /** Names never admitted, even when `allow` lists them. */
77
+ readonly deny?: readonly string[]
78
+ /**
79
+ * In-loop retry budget for every tool this server contributes. See
80
+ * `mcpToolToToolDefinition`'s own `maxRetries` parameter: only a result
81
+ * the adapter already classifies `retrySafety: 'safe'` is ever retried,
82
+ * whatever this is set to.
83
+ */
84
+ readonly maxRetries?: number
85
+ /**
86
+ * The operator marked this server's read-only claims trustworthy. Per
87
+ * server, default `false` — an unmarked server's claim raises the
88
+ * requirement and never lowers it. The owning source carries this decision.
89
+ */
90
+ readonly readOnlyHintTrusted?: boolean
91
+ /**
92
+ * This toolset's own default for the tools and prompts it contributes.
93
+ * Absent means `'active'`. The two resource tools (`list_resources`,
94
+ * `read_resource`) are always `'deferred'` regardless of this — see the
95
+ * "resource tools are always deferred" note on {@link mcpToolset}.
96
+ */
97
+ readonly availability?: ToolsetAvailability
98
+ /**
99
+ * Called when a re-discovery (a `list_changed` notification, or a
100
+ * reconnect) finds a tool set that differs from the previous one — the
101
+ * "rug pull" shape `MCPToolDiscovery` exists to catch. A changed tool's
102
+ * previously admitted definition keeps serving for this toolset's lifetime;
103
+ * added and removed names apply at the next refresh boundary.
104
+ */
105
+ readonly onDrift?: (event: { serverName: string; clientId: string; drift: MCPToolDrift }) => void
106
+ /** Current tool, prompt and resource names refused by this server's policy. */
107
+ readonly onRefused?: (event: {
108
+ serverName: string
109
+ clientId: string
110
+ kind: 'tools' | 'prompts' | 'resources'
111
+ refused: readonly { name: string; reason: 'not_allowed' | 'denied' }[]
112
+ }) => void
113
+ /**
114
+ * How this toolset recovers a dropped connection. `{ enabled: false }`
115
+ * turns this off — for a caller that already runs its own
116
+ * `MCPReconnectSupervisor` against the same client and would otherwise
117
+ * end up with two supervisors racing to reconnect it.
118
+ */
119
+ readonly reconnect?: MCPReconnectOptions | MCPReconnectPolicySource
120
+ readonly logger?: Logger
121
+ }
122
+
123
+ /** Mount both entries: server tools use the configured availability; resource tools stay deferred. */
124
+ export type MCPToolsets = readonly [main: Toolset, resources: Toolset]
125
+
126
+ /** What `list_resources`/`read_resource` need from the enclosing closure. */
127
+ interface ResourceToolsState {
128
+ readonly client: MCPClient
129
+ readonly serverName: string
130
+ admittedUris: ReadonlySet<string>
131
+ }
132
+
133
+ /**
134
+ * Fetch and admit this server's resources, and refresh `state.admittedUris`
135
+ * from the result — the ONLY place that set is ever written, so it can only
136
+ * ever hold a post-policy URI. `list_resources`'s own `execute` below and
137
+ * `mcpToolset`'s `refreshResourceUris` (construction, `resources/list_changed`,
138
+ * reconnection) both call this rather than `client.listResources` directly,
139
+ * which is what used to let a denied resource stay listed and readable: the
140
+ * two callers fetched raw and set `admittedUris` from it with no policy gate
141
+ * at all, unlike `discovery.discoverFrom`/`discoverPromptsFrom`, which both
142
+ * already run everything through `applyNamePolicy`.
143
+ */
144
+ async function refreshAdmittedResources(
145
+ discovery: MCPToolDiscovery,
146
+ state: ResourceToolsState,
147
+ options?: { signal?: AbortSignal },
148
+ ): Promise<MCPResource[]> {
149
+ const resources = await discovery.discoverResourcesFrom(state.client, options)
150
+ state.admittedUris = new Set(resources.map((r) => r.uri))
151
+ return resources
152
+ }
153
+
154
+ function buildResourceTools(
155
+ discovery: MCPToolDiscovery,
156
+ state: ResourceToolsState,
157
+ ): ToolDefinition[] {
158
+ const { client, serverName } = state
159
+
160
+ const listResources: ToolDefinition = {
161
+ name: mcpToolsetName(serverName, 'list_resources'),
162
+ description: `[MCP:${serverName}] List the resources this server publishes. Call this before "${mcpToolsetName(serverName, 'read_resource')}" — only a URI this returns may be read.`,
163
+ inputSchema: z.object({}),
164
+ category: 'network',
165
+ permissions: ['network_access'],
166
+ isReadOnly: () => true,
167
+ isDestructive: () => false,
168
+ isConcurrencySafe: () => true,
169
+ async execute(_input: unknown, context: ToolContext): Promise<ToolResult> {
170
+ try {
171
+ const resources = await refreshAdmittedResources(discovery, state, {
172
+ signal: context.abortSignal,
173
+ })
174
+ const listing = resources.map((r) => ({
175
+ uri: r.uri,
176
+ name: r.name,
177
+ description: r.description,
178
+ mimeType: r.mimeType,
179
+ }))
180
+ return frameServerResult(
181
+ { success: true, output: JSON.stringify(listing, null, 2) },
182
+ serverName,
183
+ 'list_resources',
184
+ )
185
+ } catch (err) {
186
+ return {
187
+ success: false,
188
+ output: '',
189
+ error: `Could not list resources on "${serverName}": ${toErrorMessage(err)}`,
190
+ }
191
+ }
192
+ },
193
+ }
194
+
195
+ const readResource: ToolDefinition = {
196
+ name: mcpToolsetName(serverName, 'read_resource'),
197
+ description: `[MCP:${serverName}] Read one resource this server publishes. "uri" must be one "${mcpToolsetName(serverName, 'list_resources')}" listed.`,
198
+ inputSchema: z.object({
199
+ uri: z.string().describe('A resource URI this server listed via list_resources.'),
200
+ }),
201
+ category: 'network',
202
+ permissions: ['network_access'],
203
+ isReadOnly: () => true,
204
+ isDestructive: () => false,
205
+ isConcurrencySafe: () => true,
206
+ async execute(input: unknown, context: ToolContext): Promise<ToolResult> {
207
+ const { uri } = input as { uri: string }
208
+ // Admission, not merely a lookup: the server does not get to decide
209
+ // what this call may read by returning a resource it never listed.
210
+ // `state.admittedUris` is refreshed by `list_resources` above and by
211
+ // `resources/list_changed` (see `mcpToolset`), so a URI has to have
212
+ // been SEEN, not merely well-formed.
213
+ if (!state.admittedUris.has(uri)) {
214
+ return {
215
+ success: false,
216
+ output: '',
217
+ error: `"${uri}" is not a resource "${serverName}" has listed. Call "${mcpToolsetName(serverName, 'list_resources')}" first.`,
218
+ }
219
+ }
220
+ try {
221
+ const contents = await client.readResource(uri, { signal: context.abortSignal })
222
+ const result = mcpToolResultToToolResult({ content: contents, isError: false })
223
+ return frameServerResult(result, serverName, 'read_resource')
224
+ } catch (err) {
225
+ return {
226
+ success: false,
227
+ output: '',
228
+ error: `Could not read resource "${uri}" from "${serverName}": ${toErrorMessage(err)}`,
229
+ }
230
+ }
231
+ },
232
+ }
233
+
234
+ return [listResources, readResource]
235
+ }
236
+
237
+ /**
238
+ * A connected MCP server as a live {@link Toolset}: its tools, its prompts
239
+ * (through the existing adapters), and its resources as two deferred tools.
240
+ *
241
+ * The ONE path onto a `Toolset` from MCP — the CLI and a plugin both build
242
+ * their server toolsets this way (plan.md §4). `client` must already be
243
+ * connected; this function only discovers and wraps, it never dials.
244
+ *
245
+ * `options.allow`/`options.deny` govern all three surfaces a server can
246
+ * contribute by name — tools, prompts AND resources — through
247
+ * `MCPToolDiscovery`'s `discoverFrom`/`discoverPromptsFrom`/
248
+ * `discoverResourcesFrom`. A denied resource is never listed and never
249
+ * admitted into `read_resource`'s URI set, the same as a denied tool never
250
+ * reaching `tools()`.
251
+ *
252
+ * ## Resource tools are always deferred
253
+ *
254
+ * `mcp__<server>__list_resources` and `mcp__<server>__read_resource` are
255
+ * built with `deferred(...)` regardless of `options.availability` — a
256
+ * server's resource catalogue is usually not worth showing up front the way
257
+ * its tools are. `Toolset.availability` is a whole-toolset default, so this
258
+ * function returns two toolsets to mount together: the main tools and the
259
+ * deferred resource pair. It checks name collisions across both entries
260
+ * before returning and after a notification refresh.
261
+ *
262
+ * ## Change and reconnection
263
+ *
264
+ * `onChange` fires when a `tools/list_changed`, `prompts/list_changed` or
265
+ * `resources/list_changed` notification arrives — each gated on the server
266
+ * having advertised that capability's own `listChanged: true`, so a server
267
+ * that never declared it cannot make this toolset re-fetch by sending the
268
+ * notification anyway — and after every successful reconnection (the
269
+ * server may have restarted with a different tool set, which is not a
270
+ * notification at all, and may have negotiated different capabilities
271
+ * entirely — including resources, which is why whether the two resource
272
+ * tools are currently present is re-checked on every reconnect rather than
273
+ * decided once at construction). `close()` stops the reconnect supervisor
274
+ * this function owns and releases the `onNotification` subscription it
275
+ * registered; pass `reconnect: { enabled: false }` when the caller runs its
276
+ * own supervisor against the same client, to avoid two supervisors racing to
277
+ * reconnect it.
278
+ */
279
+ export async function mcpToolset(
280
+ client: MCPClient,
281
+ options: MCPToolsetOptions = {},
282
+ ): Promise<MCPToolsets> {
283
+ const initial = client.getState()
284
+ if (initial.status !== 'connected') {
285
+ throw new Error(
286
+ `mcpToolset: the MCP client for "${initial.serverName}" must be connected before its toolset is built (status: "${initial.status}").`,
287
+ )
288
+ }
289
+ const serverName = initial.serverName
290
+ const readOnlyHintTrusted = options.readOnlyHintTrusted ?? false
291
+ const log = resolveLogger(options.logger).child({
292
+ [SCOPE_ATTRIBUTE]: 'connector/mcp/mcp-toolset',
293
+ })
294
+ const source: ToolSource = {
295
+ id: options.id ?? `mcp:${serverName}`,
296
+ kind: 'mcp_server',
297
+ name: serverName,
298
+ // The server's own account of how to use it (`instructions`, read off
299
+ // the last `initialize`/discover result) is remote-party text, same as
300
+ // a tool's description — carried here rather than dropped, since a
301
+ // host may choose to surface it (plan.md §4, CLI half).
302
+ ...(initial.serverInstructions !== undefined
303
+ ? { description: initial.serverInstructions }
304
+ : {}),
305
+ mcpServer: { name: serverName, readOnlyHintTrusted },
306
+ }
307
+
308
+ const heldToolNames = new Set<string>()
309
+ const discovery = new MCPToolDiscovery([client], {
310
+ policies: { [serverName]: { allow: options.allow, deny: options.deny } },
311
+ onDrift: (event) => {
312
+ for (const name of event.drift.changed) heldToolNames.add(name)
313
+ options.onDrift?.(event)
314
+ },
315
+ onRefused: options.onRefused,
316
+ logger: options.logger,
317
+ })
318
+
319
+ let toolDefs: ToolDefinition[] = []
320
+ let promptDefs: ToolDefinition[] = []
321
+ let mainTools: ToolDefinition[] = []
322
+ let closed = false
323
+ const listeners = new Set<() => void>()
324
+
325
+ function rebuildMain(): void {
326
+ mainTools = [...toolDefs, ...promptDefs]
327
+ }
328
+
329
+ async function refreshTools(): Promise<void> {
330
+ const discovered = await discovery.discoverFrom(client)
331
+ const previous = new Map(toolDefs.map((definition) => [definition.name, definition]))
332
+ toolDefs = discovered.map((d) => {
333
+ const name = mcpToolsetName(serverName, d.tool.name)
334
+ const admitted = previous.get(name)
335
+ if (admitted && heldToolNames.has(d.tool.name)) return admitted
336
+ const base = mcpToolToToolDefinition(
337
+ d.tool,
338
+ client,
339
+ serverName,
340
+ readOnlyHintTrusted,
341
+ options.maxRetries,
342
+ )
343
+ return { ...base, name }
344
+ })
345
+ for (const name of heldToolNames) {
346
+ if (!discovered.some((entry) => entry.tool.name === name)) heldToolNames.delete(name)
347
+ }
348
+ rebuildMain()
349
+ }
350
+
351
+ async function refreshPrompts(): Promise<void> {
352
+ if (!client.getState().serverCapabilities?.prompts) {
353
+ promptDefs = []
354
+ rebuildMain()
355
+ return
356
+ }
357
+ const prompts = await discovery.discoverPromptsFrom(client)
358
+ promptDefs = prompts.map((p) => {
359
+ const base = mcpPromptToToolDefinition(p, client, serverName)
360
+ return { ...base, name: mcpToolsetName(serverName, 'prompt', p.name) }
361
+ })
362
+ rebuildMain()
363
+ }
364
+
365
+ const resourceState: ResourceToolsState = {
366
+ client,
367
+ serverName,
368
+ admittedUris: new Set(),
369
+ }
370
+
371
+ async function refreshResourceUris(): Promise<void> {
372
+ await refreshAdmittedResources(discovery, resourceState)
373
+ }
374
+
375
+ // The two resource tool DEFINITIONS are built once, unconditionally — they
376
+ // are inert until `resourceTools` (below) actually includes them. Building
377
+ // them up front, rather than only when the server first supports
378
+ // resources, is what lets a reconnect that negotiates the capability for
379
+ // the FIRST time (see `syncResourceCapability`) expose them without
380
+ // rebuilding the toolset this function returns.
381
+ const resourceToolDefs = buildResourceTools(discovery, resourceState)
382
+ let supportsResources = initial.serverCapabilities?.resources !== undefined
383
+ let resourceTools: ToolDefinition[] = supportsResources ? resourceToolDefs : []
384
+
385
+ /**
386
+ * Re-read whether the server currently supports resources and bring
387
+ * `resourceTools`/`admittedUris` into line with that — called at
388
+ * construction and after every reconnect, never relying on a value
389
+ * captured once. A server that stops advertising the capability loses its
390
+ * resource tools from the next `tools()` snapshot; one that gains it for
391
+ * the first time (a restart with a newer build, say) gets them added.
392
+ */
393
+ async function syncResourceCapability(): Promise<void> {
394
+ supportsResources = client.getState().serverCapabilities?.resources !== undefined
395
+ resourceTools = supportsResources ? resourceToolDefs : []
396
+ if (supportsResources) {
397
+ await refreshResourceUris()
398
+ } else {
399
+ resourceState.admittedUris = new Set()
400
+ }
401
+ }
402
+
403
+ await Promise.all([
404
+ refreshTools(),
405
+ refreshPrompts(),
406
+ supportsResources ? refreshResourceUris() : Promise.resolve(),
407
+ ])
408
+
409
+ const assertUnique = (): void => {
410
+ const names = new Set<string>()
411
+ for (const tool of [...mainTools, ...resourceTools]) {
412
+ if (names.has(tool.name)) throw new ToolsetConflictError(tool.name, source, source)
413
+ names.add(tool.name)
414
+ }
415
+ }
416
+ assertUnique()
417
+
418
+ const notify = (): void => {
419
+ assertUnique()
420
+ for (const listener of listeners) listener()
421
+ }
422
+ const onChange = (listener: () => void): (() => void) => {
423
+ listeners.add(listener)
424
+ return () => listeners.delete(listener)
425
+ }
426
+
427
+ // Read fresh on every notification rather than captured once: a
428
+ // reconnect can renegotiate different capabilities, and a stale copy
429
+ // would keep acting on what the PREVIOUS connection advertised.
430
+ const currentCapabilities = (): MCPServerCapabilities | undefined =>
431
+ client.getState().serverCapabilities
432
+
433
+ // A rejection here would otherwise be a genuine unhandled promise
434
+ // rejection: it happens inside a fire-and-forget notification callback,
435
+ // not inside anything a caller of `mcpToolset` is awaiting, so nothing
436
+ // upstream ever gets a chance to catch it. A transient failure on the
437
+ // re-fetch a notification triggers (a network blip, or the connection
438
+ // dropping around the same moment the server notified) is exactly the
439
+ // kind of thing that must be logged, not left to crash the process.
440
+ const onRefreshFailure = (which: string) => (err: unknown) => {
441
+ log.error('Failed to refresh MCP tools after a server notification', {
442
+ [NAMZU.SERVER_NAME]: serverName,
443
+ 'namzu.connector.refresh': which,
444
+ 'exception.message': toErrorMessage(err),
445
+ })
446
+ }
447
+
448
+ const unsubscribeNotifications = client.onNotification((method) => {
449
+ if (closed) return
450
+ if (method === 'notifications/tools/list_changed') {
451
+ if (!currentCapabilities()?.tools?.listChanged) return
452
+ void refreshTools().then(notify).catch(onRefreshFailure('tools'))
453
+ } else if (method === 'notifications/prompts/list_changed') {
454
+ if (!currentCapabilities()?.prompts?.listChanged) return
455
+ void refreshPrompts().then(notify).catch(onRefreshFailure('prompts'))
456
+ } else if (method === 'notifications/resources/list_changed') {
457
+ if (!currentCapabilities()?.resources?.listChanged) return
458
+ void refreshResourceUris().then(notify).catch(onRefreshFailure('resources'))
459
+ }
460
+ })
461
+
462
+ const readReconnectOptions: MCPReconnectPolicySource =
463
+ typeof options.reconnect === 'function'
464
+ ? options.reconnect
465
+ : () => (options.reconnect as MCPReconnectOptions | undefined) ?? {}
466
+ const supervisor = new MCPReconnectSupervisor(client, () => ({
467
+ ...readReconnectOptions(),
468
+ onReconnected: async () => {
469
+ if (closed) return
470
+ // The server may have come back with a different tool set entirely
471
+ // — not a `list_changed` notification, which this reconnected
472
+ // client has not even finished re-subscribing to yet. Re-run every
473
+ // discovery unconditionally, the same as first construction, and
474
+ // re-derive `supportsResources` rather than reuse the value from
475
+ // the FIRST connection: a reconnect can renegotiate capabilities,
476
+ // and a stale copy would keep acting on what the previous
477
+ // connection advertised, the same reasoning `currentCapabilities`
478
+ // above already applies to the `list_changed` gates.
479
+ await Promise.all([refreshTools(), refreshPrompts(), syncResourceCapability()])
480
+ if (closed) return
481
+ notify()
482
+ await readReconnectOptions().onReconnected?.()
483
+ },
484
+ }))
485
+ supervisor.start()
486
+
487
+ const close = async (): Promise<void> => {
488
+ if (closed) return
489
+ closed = true
490
+ unsubscribeNotifications()
491
+ supervisor.stop()
492
+ }
493
+
494
+ const mainToolset: Toolset = {
495
+ source,
496
+ tools: () => mainTools,
497
+ availability: options.availability,
498
+ onChange,
499
+ close,
500
+ }
501
+
502
+ const resourceToolset: Toolset = {
503
+ source,
504
+ // A `let`, not a snapshot: `syncResourceCapability` reassigns this on
505
+ // every reconnect, so a capability that appears or disappears between
506
+ // two calls is visible without rebuilding either returned toolset.
507
+ tools: () => resourceTools,
508
+ onChange,
509
+ close,
510
+ }
511
+
512
+ // Keep these as separate ToolManager entries. A Toolset has one availability
513
+ // for all its tools, so merging them would silently activate the resources.
514
+ return [mainToolset, deferred(resourceToolset)]
515
+ }
@@ -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