@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
@@ -1,73 +1,17 @@
1
- import { SpanStatusCode, context as otelContext, trace } from '@opentelemetry/api'
2
- import { assertStrictSchema } from '../../provider/strict-schema.js'
3
- import { GENAI, NAMZU, toolSpanName } from '../../telemetry/attributes.js'
4
- import { recordToolCall } from '../../telemetry/metrics.js'
5
- import { getTracer } from '../../telemetry/runtime-accessors.js'
6
- import { isTrustedReadOnly } from '../../tools/trusted-read-only.js'
7
- import type { ToolResultGuardrailSpec } from '../../types/guardrail/index.js'
8
- import { PLAN_MODE_REFUSAL } from '../../types/permission/index.js'
9
- import type {
10
- LLMToolSchema,
11
- PreparedToolExecution,
12
- ToolAvailability,
13
- ToolContext,
14
- ToolDefinition,
15
- ToolExecutionResult,
16
- ToolPreparationResult,
17
- ToolRegistryConfig,
18
- ToolTierConfig,
19
- } from '../../types/tool/index.js'
20
- import { toErrorMessage } from '../../utils/error.js'
21
- import { cloneJsonValue as clonePreparedInput } from '../../utils/json-snapshot.js'
22
- import { ManagedRegistry } from '../ManagedRegistry.js'
23
- import { renderToolSchema, toolWireSchema } from './schema.js'
24
- import { ToolResultHalted, screenToolResult } from './screen.js'
1
+ import { RegistryCollisionError } from '../collision.js'
25
2
 
26
- export type { ToolExecutionResult }
27
-
28
- /** Options for an independent registry membership and availability snapshot. */
29
- export interface ToolRegistryForkOptions {
30
- /**
31
- * Defer currently active tools outside this exact list. Omission preserves
32
- * every availability; an empty list defers every active tool. Listed tools
33
- * that are already deferred or suspended keep that state. Names must be
34
- * unique, valid registered names; a misspelling is refused.
35
- */
36
- readonly deferExcept?: readonly string[]
37
- }
38
-
39
- // Tokens too generic to identify a tool by name — ignored when matching a
40
- // batched `search_tools` query so they can't activate the whole catalog
41
- // (every bridged tool name shares the `clawtool` prefix, for instance).
42
- // Generic CRUD verbs are stopped too: a query like "list deals" must rank
43
- // by "deals", not token-match every `list_*` tool in the deferred catalog.
44
- const SEARCH_STOP_TOKENS = new Set([
45
- 'clawtool',
46
- 'tool',
47
- 'tools',
48
- 'mcp',
49
- 'the',
50
- 'and',
51
- 'for',
52
- 'use',
53
- 'list',
54
- 'read',
55
- 'create',
56
- 'update',
57
- 'get',
58
- 'find',
59
- 'delete',
60
- 'search',
61
- ])
62
-
63
- // Weighted-scoring weights mirroring ToolCatalog.searchTools (the richer,
64
- // otherwise-unused catalog scorer): exact name 12, name substring 8,
65
- // description 5 — extended here with argument-name indexing (3), following
66
- // argument names are searched too, not only the tool's own name.
67
- const SEARCH_WEIGHT_NAME_EXACT = 12
68
- const SEARCH_WEIGHT_NAME_PARTIAL = 8
69
- const SEARCH_WEIGHT_DESCRIPTION = 5
70
- const SEARCH_WEIGHT_ARGUMENT = 3
3
+ /**
4
+ * Tool naming and a handful of small, stateless rendering helpers this file
5
+ * used to share with `ToolRegistry`.
6
+ *
7
+ * `ToolRegistry` itself — registration, availability, the execution
8
+ * pipeline — is gone (plan.md v3 §2): a runtime-owned `ToolManager`
9
+ * (`toolsets/manager.ts`) resolves toolsets instead, and carries its own
10
+ * copy of the pipeline this file used to define. What's left here is what
11
+ * had no toolset/manager analogue to move to: a tool name has to be valid
12
+ * regardless of which mechanism resolves it, and `describeWithOutput`/
13
+ * `toolDiscoveryHint` are pure string formatting `ToolManager` still calls.
14
+ */
71
15
 
72
16
  /**
73
17
  * What a tool name may be, everywhere it comes from.
@@ -113,11 +57,13 @@ export function assertToolName(name: string): void {
113
57
  * shadowing-by-name the only way to say "I do not want this tool", which is
114
58
  * precisely what now throws.
115
59
  */
116
- export class ToolNameCollisionError extends Error {
60
+ export class ToolNameCollisionError extends RegistryCollisionError {
117
61
  readonly toolName: string
118
62
 
119
63
  constructor(toolName: string, context: string) {
120
64
  super(
65
+ 'ToolRegistry',
66
+ toolName,
121
67
  `Tool name "${toolName}" is already registered by this host, and ${context} will not replace it. Rename the host tool, or decline the one being mounted with runtimeToolOverrides: { "${toolName}": "disabled" }.`,
122
68
  )
123
69
  this.name = 'ToolNameCollisionError'
@@ -147,682 +93,6 @@ export function describeWithOutput(
147
93
  return `${description}\n\nReturns (JSON Schema): ${JSON.stringify(outputSchema)}`
148
94
  }
149
95
 
150
- export class ToolRegistry extends ManagedRegistry<ToolDefinition> {
151
- private availability: Map<string, ToolAvailability> = new Map()
152
- private tierConfig?: ToolTierConfig
153
- private resultGuardrails?: readonly ToolResultGuardrailSpec[]
154
- private readonly preparations = new WeakMap<
155
- PreparedToolExecution,
156
- { readonly tool: ToolDefinition; readonly input: unknown }
157
- >()
158
-
159
- constructor(config?: ToolRegistryConfig) {
160
- super({
161
- componentName: 'ToolRegistry',
162
- idField: 'name',
163
- logger: config?.logger,
164
- })
165
- this.tierConfig = config?.tierConfig
166
- this.resultGuardrails = config?.resultGuardrails
167
- }
168
-
169
- /**
170
- * Snapshot membership and availability for another turn without changing this
171
- * registry. Discovery, registration and suspension then affect only the fork.
172
- * Definitions, handlers and configuration remain shared; this is not a deep
173
- * clone or an authorization boundary. Prepared executions belong only to the
174
- * registry that prepared them and do not transfer to the fork.
175
- */
176
- fork(options: ToolRegistryForkOptions = {}): ToolRegistry {
177
- let retained: Set<string> | undefined
178
- if (options.deferExcept !== undefined) {
179
- if (!Array.isArray(options.deferExcept))
180
- throw new TypeError('ToolRegistry.fork deferExcept must be an array of tool names.')
181
- retained = new Set()
182
- for (const name of options.deferExcept) {
183
- if (typeof name !== 'string' || !TOOL_NAME_PATTERN.test(name))
184
- throw new TypeError('ToolRegistry.fork deferExcept must contain valid tool names.')
185
- if (retained.has(name))
186
- throw new TypeError(`ToolRegistry.fork deferExcept contains duplicate tool "${name}".`)
187
- this.getOrThrow(name)
188
- retained.add(name)
189
- }
190
- }
191
-
192
- const fork = new ToolRegistry({
193
- logger: this.log,
194
- tierConfig: this.tierConfig,
195
- resultGuardrails: this.resultGuardrails,
196
- })
197
- fork.items = new Map(this.items)
198
- fork.availability = new Map(this.availability)
199
- if (retained) {
200
- for (const name of fork.listNames()) {
201
- if (fork.getAvailability(name) === 'active' && !retained.has(name))
202
- fork.availability.set(name, 'deferred')
203
- }
204
- }
205
- return fork
206
- }
207
-
208
- override register(id: string, tool: ToolDefinition): void
209
- override register(tool: ToolDefinition, initialState?: ToolAvailability): void
210
- override register(tools: ToolDefinition[], initialState?: ToolAvailability): void
211
- override register(
212
- idOrToolOrTools: string | ToolDefinition | ToolDefinition[],
213
- maybeTool?: ToolDefinition | ToolAvailability,
214
- ): void {
215
- if (Array.isArray(idOrToolOrTools)) {
216
- const state = (typeof maybeTool === 'string' ? maybeTool : 'active') as ToolAvailability
217
- for (const tool of idOrToolOrTools) {
218
- this.registerOne(tool.name, tool, state)
219
- }
220
- return
221
- }
222
-
223
- if (typeof idOrToolOrTools === 'string') {
224
- if (!maybeTool || typeof maybeTool === 'string') {
225
- throw new Error('register(id, tool) requires a ToolDefinition argument')
226
- }
227
- this.registerOne(idOrToolOrTools, maybeTool, 'active')
228
- return
229
- }
230
-
231
- const tool = idOrToolOrTools
232
- const state: ToolAvailability = typeof maybeTool === 'string' ? maybeTool : 'active'
233
-
234
- this.registerOne(tool.name, tool, state)
235
- }
236
-
237
- private registerOne(id: string, tool: ToolDefinition, state: ToolAvailability): void {
238
- assertToolName(id)
239
- // A model-facing schema is what the constraint is applied TO, so
240
- // asking for enforcement without one is a request that cannot be
241
- // honoured. Refusing at registration puts the error where the author
242
- // can fix it rather than at the first request.
243
- if (tool.enforceModelInput && !tool.modelInputSchema) {
244
- throw new Error(
245
- `Tool "${id}" enables enforceModelInput but does not define modelInputSchema. Constrained input generation requires an explicit provider-safe model schema.`,
246
- )
247
- }
248
- // …and the schema has to be one a constrained decoder can actually be
249
- // given. The check above asks whether a model schema EXISTS; this asks
250
- // whether it can carry the guarantee the tool just requested.
251
- //
252
- // Both belong here for the reason the comment above already states.
253
- // Strict validation runs against a SUBSET of JSON Schema, and a keyword
254
- // outside it is not degraded — the request is rejected whole, so one
255
- // unexpressible field takes down every other tool in the call. The
256
- // first version of this check lived in a provider driver, which meant
257
- // it fired per request, in one driver, long after the author had moved
258
- // on. A tool that asks for a guarantee its own schema cannot carry is
259
- // wrong at the moment it is declared, whichever model it later meets.
260
- if (tool.enforceModelInput) {
261
- assertStrictSchema(id, tool.modelInputSchema)
262
- }
263
- if (tool.tier && this.tierConfig) {
264
- const validIds = this.tierConfig.tiers.map((t) => t.id)
265
- if (!validIds.includes(tool.tier)) {
266
- throw new Error(
267
- `Tool "${id}" has tier "${tool.tier}" which is not defined. Valid tiers: ${validIds.join(', ')}`,
268
- )
269
- }
270
- }
271
- super.register(id, tool)
272
- this.availability.set(id, state)
273
- }
274
-
275
- override unregister(id: string): boolean {
276
- this.availability.delete(id)
277
- return super.unregister(id)
278
- }
279
-
280
- override clear(): void {
281
- this.availability.clear()
282
- super.clear()
283
- }
284
-
285
- activate(names: string[]): void {
286
- for (const name of names) {
287
- this.getOrThrow(name)
288
- this.availability.set(name, 'active')
289
- this.log.debug('Tool activated', { 'namzu.tool.name': name })
290
- }
291
- }
292
-
293
- defer(names: string[]): void {
294
- for (const name of names) {
295
- this.getOrThrow(name)
296
- this.availability.set(name, 'deferred')
297
- this.log.debug('Tool deferred', { 'namzu.tool.name': name })
298
- }
299
- }
300
-
301
- suspendAll(): void {
302
- for (const name of this.listIds()) {
303
- if (this.getAvailability(name) === 'active') {
304
- this.availability.set(name, 'suspended')
305
- }
306
- }
307
- this.log.info('All active tools suspended')
308
- }
309
-
310
- hasSuspended(): boolean {
311
- for (const state of this.availability.values()) {
312
- if (state === 'suspended') return true
313
- }
314
- return false
315
- }
316
-
317
- getAvailability(name: string): ToolAvailability {
318
- return this.availability.get(name) ?? 'active'
319
- }
320
-
321
- /**
322
- * Ranked lexical search over DEFERRED tools, score-descending (ties broken
323
- * by name) so callers can cap activation at a top-k. Each meaningful query
324
- * term (≥3 chars, not a stop token) is scored against the tool name
325
- * (exact/substring), description, and argument names; only tools with a
326
- * positive score are returned. Description matching is safe here precisely
327
- * because the result is RANKED — the `search_tools` builtin activates only
328
- * the top slice, so a shared word can no longer drag in the whole catalog.
329
- *
330
- * PARKED (phase 5 of the tool-loading plan): an embedding-backed semantic
331
- * upgrade was evaluated and deliberately NOT built — at ≤~35 deferred
332
- * in-house tools with distinct names, weighted lexical scoring sits inside
333
- * the literature's safe zone, and a weak retriever underperforms no
334
- * retriever at all. Revisit only when (a) the deferred catalog grows past
335
- * ~75-100 tools (realistic driver: connector-MCP growth), or (b) telemetry
336
- * shows a search_tools miss-rate above ~10%. Sticky activation is also
337
- * deliberate: activating inserts the schema into the tools array at its
338
- * registry position (a one-time prompt-cache prefix bust); re-defer/TTL
339
- * would churn that prefix repeatedly and is rejected.
340
- */
341
- searchDeferred(query: string): ToolDefinition[] {
342
- return this.searchByAvailability(query, ['deferred'])
343
- }
344
-
345
- /** Active matches use the same ranking, also recognizing exact short or generic names. */
346
- searchActive(query: string): ToolDefinition[] {
347
- return this.searchByAvailability(query, ['active'])
348
- }
349
-
350
- private searchByAvailability(query: string, states: ToolAvailability[]): ToolDefinition[] {
351
- const q = query.toLowerCase().trim()
352
- if (q.length === 0) return []
353
- const terms = q.split(/\s+/).filter((tok) => tok.length >= 3 && !SEARCH_STOP_TOKENS.has(tok))
354
-
355
- const scored: Array<{ tool: ToolDefinition; score: number }> = []
356
- for (const tool of this.getByAvailability(states)) {
357
- const name = tool.name.toLowerCase()
358
- const description = tool.description.toLowerCase()
359
- const argumentNames = listArgumentNames(tool)
360
- let score = terms.length === 0 && name === q ? SEARCH_WEIGHT_NAME_EXACT : 0
361
- for (const term of terms) {
362
- if (name === term) {
363
- score += SEARCH_WEIGHT_NAME_EXACT
364
- } else if (name.includes(term)) {
365
- score += SEARCH_WEIGHT_NAME_PARTIAL
366
- }
367
- if (description.includes(term)) {
368
- score += SEARCH_WEIGHT_DESCRIPTION
369
- }
370
- if (argumentNames.some((arg) => arg.includes(term))) {
371
- score += SEARCH_WEIGHT_ARGUMENT
372
- }
373
- }
374
- if (score > 0) {
375
- scored.push({ tool, score })
376
- }
377
- }
378
-
379
- scored.sort((a, b) => b.score - a.score || a.tool.name.localeCompare(b.tool.name))
380
- return scored.map((entry) => entry.tool)
381
- }
382
-
383
- assignTiers(mapping: Record<string, string>): void {
384
- for (const [toolName, tierId] of Object.entries(mapping)) {
385
- const tool = this.getOrThrow(toolName)
386
- if (this.tierConfig) {
387
- const validIds = this.tierConfig.tiers.map((t) => t.id)
388
- if (!validIds.includes(tierId)) {
389
- throw new Error(
390
- `Tier "${tierId}" for tool "${toolName}" is not defined. Valid tiers: ${validIds.join(', ')}`,
391
- )
392
- }
393
- }
394
- tool.tier = tierId
395
- }
396
- }
397
-
398
- toTierGuidance(): string | null {
399
- if (!this.tierConfig?.guidanceTemplate) return null
400
- return this.tierConfig.guidanceTemplate(this.tierConfig.tiers)
401
- }
402
-
403
- listNames(): string[] {
404
- return this.listIds()
405
- }
406
-
407
- toPromptSection(toolNames?: string[]): string {
408
- const active = this.getByAvailability(['active'], toolNames)
409
- const deferred = this.getByAvailability(['deferred'], toolNames)
410
-
411
- const parts: string[] = []
412
- const contractNote = `<tool_runtime_contract>
413
- Executable tool names, descriptions, and JSON input schemas are attached through the runtime tools parameter. Treat that runtime schema as authoritative; this prompt section is a discoverability summary only.
414
- </tool_runtime_contract>`
415
-
416
- if (active.length > 0) {
417
- // Name-only: every active tool's full description + JSON schema
418
- // already rides the runtime tools parameter on each request —
419
- // repeating descriptions here double-bills the same tokens.
420
- const entries = active.map((t) => `- ${t.name}`).join('\n')
421
- parts.push(`<available_tools>\n${entries}\n</available_tools>`)
422
- }
423
-
424
- if (deferred.length > 0) {
425
- // Name + one-line hint: deferred schemas stay off the wire, so the
426
- // hint is the model's only signal of what a deferred tool does. A
427
- // bare name list caused a real discovery failure in production
428
- // (the agent never found read_document behind search_tools).
429
- const entries = deferred
430
- .map((t) => {
431
- const hint = toolDiscoveryHint(t.description)
432
- return hint.length > 0 ? `- ${t.name}: ${hint}` : `- ${t.name}`
433
- })
434
- .join('\n')
435
- const deferredIntro =
436
- this.has('search_tools') &&
437
- this.getAvailability('search_tools') === 'active' &&
438
- (!toolNames || toolNames.includes('search_tools'))
439
- ? 'Use search_tools to load these before use:'
440
- : 'Deferred tools are discoverable but not executable until the runtime activates them:'
441
- parts.push(`<deferred_tools>\n${deferredIntro}\n${entries}\n</deferred_tools>`)
442
- }
443
-
444
- if (parts.length === 0) return ''
445
- return [contractNote, ...parts].join('\n\n')
446
- }
447
-
448
- toLLMTools(toolNames?: string[]): LLMToolSchema[] {
449
- const toolsToConvert = this.getByAvailability(['active', 'suspended'], toolNames)
450
-
451
- return toolsToConvert.map((tool) => {
452
- let description = tool.description
453
- if (this.tierConfig?.labelInDescription && tool.tier) {
454
- const tierDef = this.tierConfig.tiers.find((t) => t.id === tool.tier)
455
- if (tierDef) {
456
- description = `[${tierDef.label}] ${description}`
457
- }
458
- }
459
- return {
460
- type: 'function' as const,
461
- function: {
462
- name: tool.name,
463
- description: describeWithOutput(description, tool.outputSchema),
464
- parameters: toolWireSchema(tool),
465
- },
466
- }
467
- })
468
- }
469
-
470
- getCallableTools(toolNames?: string[]): ToolDefinition[] {
471
- return this.getByAvailability(['active'], toolNames)
472
- }
473
-
474
- prepareExecution(toolName: string, rawInput: unknown): ToolPreparationResult {
475
- const tool = this.getOrThrow(toolName)
476
- const parseResult = tool.inputSchema.safeParse(rawInput)
477
- if (!parseResult.success) {
478
- return {
479
- success: false,
480
- result: this.validationFailure(tool, rawInput, parseResult.error),
481
- }
482
- }
483
-
484
- let retainedInput: unknown
485
- let reviewInput: unknown
486
- try {
487
- retainedInput = clonePreparedInput(parseResult.data, false)
488
- reviewInput = clonePreparedInput(retainedInput, true)
489
- } catch (err) {
490
- const message = `Tool "${toolName}" produced an input that cannot be safely prepared for review and execution: ${toErrorMessage(err)}`
491
- this.log.error('Prepared tool input could not be detached for review and execution', {
492
- 'namzu.tool.name': toolName,
493
- 'exception.message': toErrorMessage(err),
494
- })
495
- return {
496
- success: false,
497
- result: { success: false, output: '', error: message },
498
- }
499
- }
500
-
501
- const prepared = Object.freeze({ toolName, input: reviewInput })
502
- this.preparations.set(prepared, { tool, input: retainedInput })
503
- return { success: true, prepared }
504
- }
505
-
506
- async executePrepared(
507
- prepared: PreparedToolExecution,
508
- context: ToolContext,
509
- ): Promise<ToolExecutionResult> {
510
- const retained = this.preparations.get(prepared)
511
- if (!retained) {
512
- return {
513
- success: false,
514
- output: '',
515
- error: `Tool "${prepared.toolName}" preparation is not owned by this registry or is no longer valid.`,
516
- }
517
- }
518
- if (this.get(prepared.toolName) !== retained.tool) {
519
- return {
520
- success: false,
521
- output: '',
522
- error: `Tool "${prepared.toolName}" changed after its input was reviewed; prepare the call again.`,
523
- }
524
- }
525
- return this.executeRetained(prepared.toolName, retained.tool, retained.input, context)
526
- }
527
-
528
- async execute(
529
- toolName: string,
530
- rawInput: unknown,
531
- context: ToolContext,
532
- ): Promise<ToolExecutionResult> {
533
- let preparation: ToolPreparationResult
534
- try {
535
- preparation = this.prepareExecution(toolName, rawInput)
536
- } catch (err) {
537
- return this.rejectPreparationWithClosedSpan(toolName, context, err)
538
- }
539
- if (!preparation.success) return preparation.result
540
- return this.executePrepared(preparation.prepared, context)
541
- }
542
-
543
- private rejectPreparationWithClosedSpan(
544
- toolName: string,
545
- context: ToolContext,
546
- err: unknown,
547
- ): Promise<never> {
548
- const tracer = getTracer()
549
- const parentCtx = context.parentSpan
550
- ? trace.setSpan(otelContext.active(), context.parentSpan)
551
- : otelContext.active()
552
- return tracer.startActiveSpan(toolSpanName(toolName), {}, parentCtx, async (span) => {
553
- try {
554
- span.setAttributes({
555
- [GENAI.TOOL_NAME]: toolName,
556
- [GENAI.TOOL_TYPE]: 'function',
557
- ...(context.toolUseId !== undefined ? { [GENAI.TOOL_CALL_ID]: context.toolUseId } : {}),
558
- ...toolSpanIdentity(context),
559
- [NAMZU.TOOL_SUCCESS]: false,
560
- [NAMZU.TOOL_ERROR]: toErrorMessage(err),
561
- })
562
- span.setStatus({ code: SpanStatusCode.ERROR, message: toErrorMessage(err) })
563
- throw err
564
- } finally {
565
- span.end()
566
- }
567
- })
568
- }
569
-
570
- private async executeRetained(
571
- toolName: string,
572
- tool: ToolDefinition,
573
- finalInput: unknown,
574
- context: ToolContext,
575
- ): Promise<ToolExecutionResult> {
576
- const tracer = getTracer()
577
-
578
- // Explicit parent, not the ambient context. Every span-owning body
579
- // upstream is an async generator, and a generator resumes on its
580
- // consumer's async context — so by the time a tool executes, whatever
581
- // `startActiveSpan` established upstream is long gone and this span
582
- // would emit as a root. `context.parentSpan` is threaded through
583
- // `ToolContext`, which already reaches here.
584
- const parentCtx = context.parentSpan
585
- ? trace.setSpan(otelContext.active(), context.parentSpan)
586
- : otelContext.active()
587
-
588
- return tracer.startActiveSpan(toolSpanName(toolName), {}, parentCtx, async (span) => {
589
- try {
590
- // The call id joins this span to the assistant block that asked
591
- // for it. Without it a trace shows that `Bash` ran four times
592
- // this turn and cannot say which span answers which
593
- // `tool_use` — and the id was already in hand here, threaded
594
- // through `ToolContext` for the tools that reply
595
- // asynchronously.
596
- //
597
- // Conditional because `toolUseId` is optional: a host calling
598
- // a tool directly, outside a turn, has no call to correlate to,
599
- // and an attribute set to `undefined` is worse than an absent
600
- // one — it reaches the exporter as a key with no value.
601
- span.setAttributes({
602
- [GENAI.TOOL_NAME]: toolName,
603
- [GENAI.TOOL_TYPE]: 'function',
604
- ...(context.toolUseId !== undefined ? { [GENAI.TOOL_CALL_ID]: context.toolUseId } : {}),
605
- ...toolSpanIdentity(context),
606
- })
607
-
608
- const availability = this.getAvailability(toolName)
609
- if (availability !== 'active') {
610
- const msg = `Tool "${toolName}" is ${availability} and cannot be executed`
611
- this.log.warn(msg)
612
- span.setAttributes({
613
- [NAMZU.TOOL_SUCCESS]: false,
614
- [NAMZU.TOOL_ERROR]: msg,
615
- })
616
- span.setStatus({ code: SpanStatusCode.ERROR, message: msg })
617
- return {
618
- success: false,
619
- output: '',
620
- error: msg,
621
- }
622
- }
623
-
624
- // A turn that was narrowed may only call what it was narrowed to.
625
- //
626
- // This used to be enforced nowhere. `allowedTools` decided which
627
- // schemas went into the request and was then carried into this
628
- // context and read by nothing, so the restriction was a statement
629
- // about the menu rather than about the kitchen: a model that named
630
- // a withheld tool — from earlier context, from a gateway holding
631
- // its own tool list, from a replayed cache prefix — had it run.
632
- // The type says "restrict which tools the model may call"; this is
633
- // the line that makes that true.
634
- //
635
- // Absent means unrestricted. An EMPTY list does not: it is a turn
636
- // that may call nothing, and treating it as "no restriction" is
637
- // the fail-open reading this codebase has already been bitten by
638
- // once, in the delegate roster.
639
- const allowed = context.allowedTools
640
- if (allowed !== undefined && !allowed.includes(toolName)) {
641
- const msg = `Tool "${toolName}" is not available on this step. Available: ${allowed.length > 0 ? allowed.join(', ') : '(none)'}`
642
- this.log.warn('Blocked a tool outside the step allow-list', {
643
- [GENAI.TOOL_NAME]: toolName,
644
- 'namzu.registry.allowed': allowed.length,
645
- })
646
- span.setAttributes({
647
- [NAMZU.TOOL_SUCCESS]: false,
648
- [NAMZU.TOOL_ERROR]: msg,
649
- })
650
- span.setStatus({ code: SpanStatusCode.ERROR, message: msg })
651
- return {
652
- success: false,
653
- output: '',
654
- error: msg,
655
- permissionDenied: true,
656
- }
657
- }
658
-
659
- const mode = context.permissionContext?.mode ?? 'auto'
660
- if (mode === 'plan') {
661
- const isReadOnly = isTrustedReadOnly(tool, finalInput)
662
- if (!isReadOnly) {
663
- // The same words the review-time policy uses, so the model gets one
664
- // instruction whichever door refused it.
665
- const msg = `plan mode: non-read-only tool "${toolName}" blocked. ${PLAN_MODE_REFUSAL}`
666
- span.setAttributes({
667
- [NAMZU.TOOL_SUCCESS]: false,
668
- [NAMZU.TOOL_ERROR]: msg,
669
- })
670
- span.setStatus({ code: SpanStatusCode.ERROR, message: msg })
671
- return {
672
- success: false,
673
- output: '',
674
- error: msg,
675
- permissionDenied: true,
676
- permissionMessage: msg,
677
- }
678
- }
679
- }
680
-
681
- try {
682
- this.log.debug('Executing tool', { 'namzu.tool.name': toolName })
683
- const startedAt = Date.now()
684
- const runResultGuardrails = context.toolResultGuardrails
685
- const produced = await tool.execute(finalInput, context)
686
- // Screened here, which is the only place a result can be
687
- // examined before anything acts on it: the executor applies
688
- // the output budget to what this returns, and compaction
689
- // summarises later still. `provenance` is carried in so a
690
- // screen can tell a connected server's words from a
691
- // first-party tool's — a connector's result is framed with
692
- // the server's name, and a screen reading only the value
693
- // cannot use that.
694
- const result = await screenToolResult(
695
- // Explicit configuration wins, at whichever boundary it
696
- // was made. A registry built WITH `resultGuardrails`
697
- // has stated its policy — including `[]`, which means
698
- // none — and a turn must not overrule it. A registry
699
- // built without one declared none, so the turn's apply;
700
- // that is the ordinary case, since a host assembles a
701
- // registry and hands it to a turn it does not own.
702
- this.resultGuardrails ?? runResultGuardrails,
703
- produced,
704
- {
705
- toolName,
706
- input: finalInput,
707
- ...(tool.provenance ? { provenance: tool.provenance } : {}),
708
- },
709
- this.log,
710
- )
711
- const durationMs = Date.now() - startedAt
712
- this.log.debug('Tool completed', {
713
- 'namzu.tool.name': toolName,
714
- 'namzu.registry.success': result.success,
715
- })
716
-
717
- span.setAttribute(NAMZU.TOOL_SUCCESS, result.success)
718
- recordToolCall(
719
- toolName,
720
- result.success,
721
- result.success ? undefined : result.error,
722
- durationMs,
723
- )
724
- if (!result.success && result.error) {
725
- span.setAttribute(NAMZU.TOOL_ERROR, result.error)
726
- span.setStatus({
727
- code: SpanStatusCode.ERROR,
728
- message: result.error,
729
- })
730
- } else {
731
- span.setStatus({ code: SpanStatusCode.OK })
732
- }
733
-
734
- return result
735
- } catch (err) {
736
- // A terminal refusal must not be converted into a failed
737
- // tool call. Everything below turns an exception into a
738
- // result the model reads and works around, which is what
739
- // `refuse` is for — doing it to a `halt` would silently
740
- // demote the one verdict that says the turn must not
741
- // continue.
742
- if (err instanceof ToolResultHalted) {
743
- span.setAttributes({
744
- [NAMZU.TOOL_SUCCESS]: false,
745
- [NAMZU.TOOL_ERROR]: err.message,
746
- })
747
- span.setStatus({
748
- code: SpanStatusCode.ERROR,
749
- message: err.message,
750
- })
751
- throw err
752
- }
753
- const errorMessage = toErrorMessage(err)
754
- this.log.error('Tool execution error', {
755
- 'namzu.tool.name': toolName,
756
- 'exception.message': errorMessage,
757
- })
758
-
759
- span.setAttributes({
760
- [NAMZU.TOOL_SUCCESS]: false,
761
- [NAMZU.TOOL_ERROR]: errorMessage,
762
- })
763
- span.setStatus({
764
- code: SpanStatusCode.ERROR,
765
- message: errorMessage,
766
- })
767
- span.recordException(err instanceof Error ? err : new Error(errorMessage))
768
-
769
- return {
770
- success: false,
771
- output: '',
772
- error: `Tool "${toolName}" execution failed: ${errorMessage}`,
773
- }
774
- }
775
- } finally {
776
- // The only place this span ends. It used to be ended at three
777
- // early returns and in a finally that opened below them, so
778
- // anything throwing before that try — `getOrThrow` on a name the
779
- // registry does not hold, for one — left the span open and the
780
- // tool's trace unclosed.
781
- span.end()
782
- }
783
- })
784
- }
785
-
786
- private validationFailure(
787
- tool: ToolDefinition,
788
- rawInput: unknown,
789
- error: {
790
- readonly issues: readonly {
791
- readonly path: readonly PropertyKey[]
792
- readonly message: string
793
- }[]
794
- },
795
- ): ToolExecutionResult {
796
- const errorMessage = error.issues
797
- .map((issue) => `${issue.path.join('.')}: ${issue.message}`)
798
- .join('; ')
799
- const isEmptyInput =
800
- rawInput === null ||
801
- rawInput === undefined ||
802
- (typeof rawInput === 'object' &&
803
- !Array.isArray(rawInput) &&
804
- Object.keys(rawInput as Record<string, unknown>).length === 0)
805
- const requiredHint = describeRequiredInput(tool.inputSchema)
806
- const recoveryHint = tool.validationErrorHint?.trim()
807
- ? ` ${tool.validationErrorHint.trim()}`
808
- : ''
809
- const enrichedMessage = isEmptyInput
810
- ? `Tool "${tool.name}" was called with no arguments. ${requiredHint}${recoveryHint} Retry the call with the required parameters populated.`
811
- : `Validation failed for "${tool.name}": ${errorMessage}. ${requiredHint}${recoveryHint}`
812
- this.log.error('Tool input validation failed', {
813
- 'namzu.tool.name': tool.name,
814
- 'namzu.registry.errors': errorMessage,
815
- 'namzu.registry.empty': isEmptyInput,
816
- })
817
- return { success: false, output: '', error: enrichedMessage }
818
- }
819
-
820
- private getByAvailability(states: ToolAvailability[], filter?: string[]): ToolDefinition[] {
821
- const candidates = filter ? filter.map((n) => this.getOrThrow(n)) : this.getAll()
822
- return candidates.filter((t) => states.includes(this.getAvailability(t.name)))
823
- }
824
- }
825
-
826
96
  /**
827
97
  * One-line discoverability hint for a deferred tool: the first sentence of
828
98
  * its description, capped at ~100 chars. Used for the `<deferred_tools>`
@@ -837,96 +107,3 @@ export function toolDiscoveryHint(description: string, maxLength = 100): string
837
107
  if (sentence.length <= maxLength) return sentence
838
108
  return `${sentence.slice(0, maxLength - 1).trimEnd()}…`
839
109
  }
840
-
841
- /**
842
- * Lower-cased argument (property) names of a tool's input schema, used by
843
- * `searchDeferred` ranking. Walks the JSON-Schema rendering (already a
844
- * registration dependency) instead of Zod internals; opaque schemas simply
845
- * contribute no argument matches.
846
- */
847
- function listArgumentNames(tool: ToolDefinition): string[] {
848
- try {
849
- // The model-facing schema when there is one: that is what the model
850
- // was shown, so it is what a search over "which tool takes this
851
- // argument" has to match against.
852
- const json = tool.modelInputSchema ?? renderToolSchema(tool.inputSchema)
853
- return [...collectSchemaPropertyNames(json)].map((key) => key.toLowerCase())
854
- } catch {
855
- return []
856
- }
857
- }
858
-
859
- /**
860
- * Every property name a schema can accept, including the ones that only
861
- * appear inside a branch.
862
- *
863
- * A conditional schema puts its real arguments under `anyOf`/`oneOf`, so
864
- * reading the top-level `properties` alone finds nothing and the tool is
865
- * unfindable by the very argument it takes. `seen` guards a schema that
866
- * refers back to itself.
867
- */
868
- function collectSchemaPropertyNames(
869
- schema: unknown,
870
- names: Set<string> = new Set(),
871
- seen: Set<object> = new Set(),
872
- ): Set<string> {
873
- if (!schema || typeof schema !== 'object' || Array.isArray(schema)) return names
874
- if (seen.has(schema)) return names
875
- seen.add(schema)
876
-
877
- const record = schema as Record<string, unknown>
878
- const properties = record.properties
879
- if (properties && typeof properties === 'object' && !Array.isArray(properties)) {
880
- for (const name of Object.keys(properties)) names.add(name)
881
- }
882
- for (const keyword of ['anyOf', 'oneOf', 'allOf'] as const) {
883
- const branches = record[keyword]
884
- if (!Array.isArray(branches)) continue
885
- for (const branch of branches) collectSchemaPropertyNames(branch, names, seen)
886
- }
887
- return names
888
- }
889
-
890
- /**
891
- * Build a one-sentence "Required: <field>: <type>, <field>: <type>"
892
- * hint from a Zod schema, used to enrich tool-input validation
893
- * errors so the model can self-correct without round-tripping the
894
- * full JSON schema again. Walks the schema's JSON-Schema rendering
895
- * (already a dependency for tool registration) so we don't have to
896
- * branch over Zod's internal type tree.
897
- *
898
- * Returns a fallback string for opaque/non-object schemas — the
899
- * caller still ships the raw Zod issues separately, so the hint
900
- * here is bonus context, not the only signal.
901
- */
902
- function describeRequiredInput(schema: { _def?: unknown }): string {
903
- try {
904
- const json = renderToolSchema(schema as never) as {
905
- properties?: Record<string, { type?: string; description?: string }>
906
- required?: string[]
907
- }
908
- const required = json.required ?? []
909
- if (required.length === 0) return 'No required parameters known.'
910
- const props = json.properties ?? {}
911
- const lines = required.map((name) => {
912
- const def = props[name] ?? {}
913
- const type = def.type ?? 'value'
914
- const desc = def.description ? ` — ${def.description}` : ''
915
- return `${name}: ${type}${desc}`
916
- })
917
- return `Required: ${lines.join(', ')}.`
918
- } catch {
919
- return 'Could not introspect required parameters.'
920
- }
921
- }
922
-
923
- /**
924
- * The session and turn a tool span belongs to. A host calling a tool
925
- * directly may pass a context without them, so each is set only when present.
926
- */
927
- function toolSpanIdentity(context: ToolContext): Record<string, string> {
928
- return {
929
- ...(context.sessionId ? { [GENAI.CONVERSATION_ID]: context.sessionId } : {}),
930
- ...(context.turnId ? { [NAMZU.TURN_ID]: context.turnId } : {}),
931
- }
932
- }