@namzu/sdk 46.0.0 → 48.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (768) hide show
  1. package/CHANGELOG.md +351 -8
  2. package/README.md +7 -8
  3. package/dist/advisory/history.d.ts.map +1 -1
  4. package/dist/advisory/history.js +21 -1
  5. package/dist/advisory/history.js.map +1 -1
  6. package/dist/advisory/index.d.ts +1 -1
  7. package/dist/advisory/index.d.ts.map +1 -1
  8. package/dist/advisory/index.js +1 -1
  9. package/dist/advisory/index.js.map +1 -1
  10. package/dist/advisory/registry.d.ts +17 -0
  11. package/dist/advisory/registry.d.ts.map +1 -1
  12. package/dist/advisory/registry.js +26 -0
  13. package/dist/advisory/registry.js.map +1 -1
  14. package/dist/agents/PipelineAgent.d.ts +2 -46
  15. package/dist/agents/PipelineAgent.d.ts.map +1 -1
  16. package/dist/agents/PipelineAgent.js +2 -242
  17. package/dist/agents/PipelineAgent.js.map +1 -1
  18. package/dist/agents/QueryAgent.d.ts +21 -0
  19. package/dist/agents/QueryAgent.d.ts.map +1 -0
  20. package/dist/agents/QueryAgent.js +214 -0
  21. package/dist/agents/QueryAgent.js.map +1 -0
  22. package/dist/agents/ReactiveAgent.d.ts +4 -16
  23. package/dist/agents/ReactiveAgent.d.ts.map +1 -1
  24. package/dist/agents/ReactiveAgent.js +4 -183
  25. package/dist/agents/ReactiveAgent.js.map +1 -1
  26. package/dist/agents/RouterAgent.d.ts +2 -20
  27. package/dist/agents/RouterAgent.d.ts.map +1 -1
  28. package/dist/agents/RouterAgent.js +2 -266
  29. package/dist/agents/RouterAgent.js.map +1 -1
  30. package/dist/agents/SupervisorAgent.d.ts +3 -43
  31. package/dist/agents/SupervisorAgent.d.ts.map +1 -1
  32. package/dist/agents/SupervisorAgent.js +3 -418
  33. package/dist/agents/SupervisorAgent.js.map +1 -1
  34. package/dist/agents/defineAgent.d.ts +2 -1
  35. package/dist/agents/defineAgent.d.ts.map +1 -1
  36. package/dist/agents/defineAgent.js +6 -1
  37. package/dist/agents/defineAgent.js.map +1 -1
  38. package/dist/agents/examples/PipelineAgent.d.ts +46 -0
  39. package/dist/agents/examples/PipelineAgent.d.ts.map +1 -0
  40. package/dist/agents/examples/PipelineAgent.js +242 -0
  41. package/dist/agents/examples/PipelineAgent.js.map +1 -0
  42. package/dist/agents/examples/RouterAgent.d.ts +22 -0
  43. package/dist/agents/examples/RouterAgent.d.ts.map +1 -0
  44. package/dist/agents/examples/RouterAgent.js +268 -0
  45. package/dist/agents/examples/RouterAgent.js.map +1 -0
  46. package/dist/agents/examples/SupervisorAgent.d.ts +45 -0
  47. package/dist/agents/examples/SupervisorAgent.d.ts.map +1 -0
  48. package/dist/agents/examples/SupervisorAgent.js +406 -0
  49. package/dist/agents/examples/SupervisorAgent.js.map +1 -0
  50. package/dist/agents/explore.d.ts +6 -3
  51. package/dist/agents/explore.d.ts.map +1 -1
  52. package/dist/agents/explore.js +6 -3
  53. package/dist/agents/explore.js.map +1 -1
  54. package/dist/agents/forward-options.d.ts +11 -0
  55. package/dist/agents/forward-options.d.ts.map +1 -0
  56. package/dist/agents/forward-options.js +15 -0
  57. package/dist/agents/forward-options.js.map +1 -0
  58. package/dist/agents/index.d.ts +1 -0
  59. package/dist/agents/index.d.ts.map +1 -1
  60. package/dist/agents/index.js +2 -0
  61. package/dist/agents/index.js.map +1 -1
  62. package/dist/agents/runAgent.d.ts +19 -8
  63. package/dist/agents/runAgent.d.ts.map +1 -1
  64. package/dist/agents/runAgent.js +99 -29
  65. package/dist/agents/runAgent.js.map +1 -1
  66. package/dist/authorization/command-line.d.ts +2 -0
  67. package/dist/authorization/command-line.d.ts.map +1 -1
  68. package/dist/authorization/command-line.js +2 -2
  69. package/dist/authorization/command-line.js.map +1 -1
  70. package/dist/authorization/gate.d.ts +8 -0
  71. package/dist/authorization/gate.d.ts.map +1 -1
  72. package/dist/authorization/gate.js +12 -1
  73. package/dist/authorization/gate.js.map +1 -1
  74. package/dist/authorization/program.d.ts +151 -0
  75. package/dist/authorization/program.d.ts.map +1 -0
  76. package/dist/authorization/program.js +713 -0
  77. package/dist/authorization/program.js.map +1 -0
  78. package/dist/authorization/reexec-wrapper.d.ts +106 -0
  79. package/dist/authorization/reexec-wrapper.d.ts.map +1 -0
  80. package/dist/authorization/reexec-wrapper.js +532 -0
  81. package/dist/authorization/reexec-wrapper.js.map +1 -0
  82. package/dist/authorization/rules.d.ts +9 -0
  83. package/dist/authorization/rules.d.ts.map +1 -1
  84. package/dist/authorization/rules.js +8 -1
  85. package/dist/authorization/rules.js.map +1 -1
  86. package/dist/authorization/shell-lexer.d.ts +19 -4
  87. package/dist/authorization/shell-lexer.d.ts.map +1 -1
  88. package/dist/authorization/shell-lexer.js +91 -65
  89. package/dist/authorization/shell-lexer.js.map +1 -1
  90. package/dist/bridge/sse/mapper.d.ts.map +1 -1
  91. package/dist/bridge/sse/mapper.js +6 -0
  92. package/dist/bridge/sse/mapper.js.map +1 -1
  93. package/dist/capabilities/index.d.ts +54 -0
  94. package/dist/capabilities/index.d.ts.map +1 -0
  95. package/dist/capabilities/index.js +92 -0
  96. package/dist/capabilities/index.js.map +1 -0
  97. package/dist/config/registry.d.ts +2 -1
  98. package/dist/config/registry.d.ts.map +1 -1
  99. package/dist/config/registry.js +3 -2
  100. package/dist/config/registry.js.map +1 -1
  101. package/dist/connector/index.d.ts +4 -4
  102. package/dist/connector/index.d.ts.map +1 -1
  103. package/dist/connector/index.js +3 -3
  104. package/dist/connector/index.js.map +1 -1
  105. package/dist/connector/mcp/adapter.d.ts +16 -1
  106. package/dist/connector/mcp/adapter.d.ts.map +1 -1
  107. package/dist/connector/mcp/adapter.js +71 -4
  108. package/dist/connector/mcp/adapter.js.map +1 -1
  109. package/dist/connector/mcp/client.d.ts +32 -4
  110. package/dist/connector/mcp/client.d.ts.map +1 -1
  111. package/dist/connector/mcp/client.js +383 -5
  112. package/dist/connector/mcp/client.js.map +1 -1
  113. package/dist/connector/mcp/discovery.d.ts +24 -1
  114. package/dist/connector/mcp/discovery.d.ts.map +1 -1
  115. package/dist/connector/mcp/discovery.js +44 -0
  116. package/dist/connector/mcp/discovery.js.map +1 -1
  117. package/dist/connector/mcp/era.d.ts.map +1 -1
  118. package/dist/connector/mcp/era.js +7 -0
  119. package/dist/connector/mcp/era.js.map +1 -1
  120. package/dist/connector/mcp/index.d.ts +2 -0
  121. package/dist/connector/mcp/index.d.ts.map +1 -1
  122. package/dist/connector/mcp/index.js +11 -0
  123. package/dist/connector/mcp/index.js.map +1 -1
  124. package/dist/connector/mcp/mcp-toolset.d.ts +133 -0
  125. package/dist/connector/mcp/mcp-toolset.d.ts.map +1 -0
  126. package/dist/connector/mcp/mcp-toolset.js +399 -0
  127. package/dist/connector/mcp/mcp-toolset.js.map +1 -0
  128. package/dist/connector/mcp/streamable-http.d.ts +15 -0
  129. package/dist/connector/mcp/streamable-http.d.ts.map +1 -1
  130. package/dist/connector/mcp/streamable-http.js +281 -6
  131. package/dist/connector/mcp/streamable-http.js.map +1 -1
  132. package/dist/connector/tools/index.d.ts +2 -2
  133. package/dist/connector/tools/index.d.ts.map +1 -1
  134. package/dist/connector/tools/index.js +1 -1
  135. package/dist/connector/tools/index.js.map +1 -1
  136. package/dist/connector/tools/router.d.ts +15 -13
  137. package/dist/connector/tools/router.d.ts.map +1 -1
  138. package/dist/connector/tools/router.js +30 -51
  139. package/dist/connector/tools/router.js.map +1 -1
  140. package/dist/contracts/a2a.d.ts +2 -2
  141. package/dist/directory/derive-supervisor.d.ts +2 -2
  142. package/dist/directory/derive-supervisor.d.ts.map +1 -1
  143. package/dist/directory/derive-supervisor.js +6 -7
  144. package/dist/directory/derive-supervisor.js.map +1 -1
  145. package/dist/directory/derive.d.ts.map +1 -1
  146. package/dist/directory/derive.js +5 -5
  147. package/dist/directory/derive.js.map +1 -1
  148. package/dist/execution/code-runtime/types.d.ts +2 -2
  149. package/dist/execution/code-runtime/types.js +1 -1
  150. package/dist/invariants/index.d.ts +2 -1
  151. package/dist/invariants/index.d.ts.map +1 -1
  152. package/dist/invariants/index.js +3 -2
  153. package/dist/invariants/index.js.map +1 -1
  154. package/dist/manager/agent/lifecycle.d.ts +1 -0
  155. package/dist/manager/agent/lifecycle.d.ts.map +1 -1
  156. package/dist/manager/agent/lifecycle.js +146 -18
  157. package/dist/manager/agent/lifecycle.js.map +1 -1
  158. package/dist/manager/connector/environment.d.ts +6 -0
  159. package/dist/manager/connector/environment.d.ts.map +1 -1
  160. package/dist/manager/connector/environment.js +11 -4
  161. package/dist/manager/connector/environment.js.map +1 -1
  162. package/dist/manager/connector/index.d.ts +2 -2
  163. package/dist/manager/connector/index.d.ts.map +1 -1
  164. package/dist/manager/connector/index.js +2 -2
  165. package/dist/manager/connector/index.js.map +1 -1
  166. package/dist/manager/connector/tenant.d.ts +6 -0
  167. package/dist/manager/connector/tenant.d.ts.map +1 -1
  168. package/dist/manager/connector/tenant.js +11 -4
  169. package/dist/manager/connector/tenant.js.map +1 -1
  170. package/dist/manager/index.d.ts +2 -2
  171. package/dist/manager/index.d.ts.map +1 -1
  172. package/dist/manager/index.js +2 -2
  173. package/dist/manager/index.js.map +1 -1
  174. package/dist/manager/resident/initiative.d.ts +6 -6
  175. package/dist/manager/resident/learning-observation.d.ts +4 -4
  176. package/dist/manager/resident/learning.d.ts +36 -36
  177. package/dist/manager/resident/outbox.d.ts +4 -4
  178. package/dist/manager/session/attribution.d.ts +22 -0
  179. package/dist/manager/session/attribution.d.ts.map +1 -0
  180. package/dist/manager/session/attribution.js +64 -0
  181. package/dist/manager/session/attribution.js.map +1 -0
  182. package/dist/manager/session/turn-recorder.d.ts +14 -0
  183. package/dist/manager/session/turn-recorder.d.ts.map +1 -1
  184. package/dist/manager/session/turn-recorder.js +208 -55
  185. package/dist/manager/session/turn-recorder.js.map +1 -1
  186. package/dist/peers/address.d.ts +36 -0
  187. package/dist/peers/address.d.ts.map +1 -0
  188. package/dist/peers/address.js +52 -0
  189. package/dist/peers/address.js.map +1 -0
  190. package/dist/peers/client.d.ts +47 -0
  191. package/dist/peers/client.d.ts.map +1 -0
  192. package/dist/peers/client.js +132 -0
  193. package/dist/peers/client.js.map +1 -0
  194. package/dist/peers/dir.d.ts +88 -0
  195. package/dist/peers/dir.d.ts.map +1 -0
  196. package/dist/peers/dir.js +139 -0
  197. package/dist/peers/dir.js.map +1 -0
  198. package/dist/peers/endpoint.d.ts +144 -0
  199. package/dist/peers/endpoint.d.ts.map +1 -0
  200. package/dist/peers/endpoint.js +420 -0
  201. package/dist/peers/endpoint.js.map +1 -0
  202. package/dist/peers/envelope.d.ts +42 -0
  203. package/dist/peers/envelope.d.ts.map +1 -0
  204. package/dist/peers/envelope.js +110 -0
  205. package/dist/peers/envelope.js.map +1 -0
  206. package/dist/peers/index.d.ts +30 -0
  207. package/dist/peers/index.d.ts.map +1 -0
  208. package/dist/peers/index.js +22 -0
  209. package/dist/peers/index.js.map +1 -0
  210. package/dist/peers/protocol.d.ts +645 -0
  211. package/dist/peers/protocol.d.ts.map +1 -0
  212. package/dist/peers/protocol.js +151 -0
  213. package/dist/peers/protocol.js.map +1 -0
  214. package/dist/peers/record.d.ts +71 -0
  215. package/dist/peers/record.d.ts.map +1 -0
  216. package/dist/peers/record.js +45 -0
  217. package/dist/peers/record.js.map +1 -0
  218. package/dist/peers/registry.d.ts +54 -0
  219. package/dist/peers/registry.d.ts.map +1 -0
  220. package/dist/peers/registry.js +213 -0
  221. package/dist/peers/registry.js.map +1 -0
  222. package/dist/plugin/define.d.ts +24 -0
  223. package/dist/plugin/define.d.ts.map +1 -0
  224. package/dist/plugin/define.js +42 -0
  225. package/dist/plugin/define.js.map +1 -0
  226. package/dist/plugin/index.d.ts +2 -0
  227. package/dist/plugin/index.d.ts.map +1 -1
  228. package/dist/plugin/index.js +1 -0
  229. package/dist/plugin/index.js.map +1 -1
  230. package/dist/plugin/lifecycle.d.ts +27 -3
  231. package/dist/plugin/lifecycle.d.ts.map +1 -1
  232. package/dist/plugin/lifecycle.js +242 -92
  233. package/dist/plugin/lifecycle.js.map +1 -1
  234. package/dist/plugin/resolver.d.ts +2 -2
  235. package/dist/plugin/resolver.d.ts.map +1 -1
  236. package/dist/plugin/resolver.js.map +1 -1
  237. package/dist/plugin/shell-hook.d.ts.map +1 -1
  238. package/dist/plugin/shell-hook.js +17 -3
  239. package/dist/plugin/shell-hook.js.map +1 -1
  240. package/dist/probe/errors.d.ts +2 -1
  241. package/dist/probe/errors.d.ts.map +1 -1
  242. package/dist/probe/errors.js +3 -2
  243. package/dist/probe/errors.js.map +1 -1
  244. package/dist/prompt/coding-agent-doctrine.d.ts +18 -7
  245. package/dist/prompt/coding-agent-doctrine.d.ts.map +1 -1
  246. package/dist/prompt/coding-agent-doctrine.js +11 -6
  247. package/dist/prompt/coding-agent-doctrine.js.map +1 -1
  248. package/dist/prompt/contributions.d.ts +4 -1
  249. package/dist/prompt/contributions.d.ts.map +1 -1
  250. package/dist/prompt/contributions.js +7 -2
  251. package/dist/prompt/contributions.js.map +1 -1
  252. package/dist/prompt/index.d.ts +1 -1
  253. package/dist/prompt/index.d.ts.map +1 -1
  254. package/dist/prompt/index.js +1 -1
  255. package/dist/prompt/index.js.map +1 -1
  256. package/dist/provider/collect-chat-completion.d.ts +6 -1
  257. package/dist/provider/collect-chat-completion.d.ts.map +1 -1
  258. package/dist/provider/collect-chat-completion.js +88 -10
  259. package/dist/provider/collect-chat-completion.js.map +1 -1
  260. package/dist/provider/mock.d.ts.map +1 -1
  261. package/dist/provider/mock.js +23 -6
  262. package/dist/provider/mock.js.map +1 -1
  263. package/dist/provider/registry.d.ts +2 -1
  264. package/dist/provider/registry.d.ts.map +1 -1
  265. package/dist/provider/registry.js +3 -2
  266. package/dist/provider/registry.js.map +1 -1
  267. package/dist/provider/tool-call-framing.d.ts +164 -0
  268. package/dist/provider/tool-call-framing.d.ts.map +1 -0
  269. package/dist/provider/tool-call-framing.js +163 -0
  270. package/dist/provider/tool-call-framing.js.map +1 -0
  271. package/dist/public-runtime.d.ts +24 -11
  272. package/dist/public-runtime.d.ts.map +1 -1
  273. package/dist/public-runtime.js +45 -9
  274. package/dist/public-runtime.js.map +1 -1
  275. package/dist/public-tools.d.ts +6 -4
  276. package/dist/public-tools.d.ts.map +1 -1
  277. package/dist/public-tools.js +8 -3
  278. package/dist/public-tools.js.map +1 -1
  279. package/dist/public-types.d.ts +13 -2
  280. package/dist/public-types.d.ts.map +1 -1
  281. package/dist/read-model/registry.d.ts +2 -1
  282. package/dist/read-model/registry.d.ts.map +1 -1
  283. package/dist/read-model/registry.js +3 -2
  284. package/dist/read-model/registry.js.map +1 -1
  285. package/dist/registry/ManagedRegistry.d.ts +30 -0
  286. package/dist/registry/ManagedRegistry.d.ts.map +1 -1
  287. package/dist/registry/ManagedRegistry.js +45 -6
  288. package/dist/registry/ManagedRegistry.js.map +1 -1
  289. package/dist/registry/collision.d.ts +57 -0
  290. package/dist/registry/collision.d.ts.map +1 -0
  291. package/dist/registry/collision.js +41 -0
  292. package/dist/registry/collision.js.map +1 -0
  293. package/dist/registry/command/index.d.ts +5 -3
  294. package/dist/registry/command/index.d.ts.map +1 -1
  295. package/dist/registry/command/index.js +6 -4
  296. package/dist/registry/command/index.js.map +1 -1
  297. package/dist/registry/index.d.ts +3 -4
  298. package/dist/registry/index.d.ts.map +1 -1
  299. package/dist/registry/index.js +2 -2
  300. package/dist/registry/index.js.map +1 -1
  301. package/dist/registry/plugin/index.d.ts.map +1 -1
  302. package/dist/registry/plugin/index.js +14 -1
  303. package/dist/registry/plugin/index.js.map +1 -1
  304. package/dist/registry/tool/callable.d.ts +7 -7
  305. package/dist/registry/tool/callable.d.ts.map +1 -1
  306. package/dist/registry/tool/callable.js +6 -7
  307. package/dist/registry/tool/callable.js.map +1 -1
  308. package/dist/registry/tool/execute.d.ts +14 -77
  309. package/dist/registry/tool/execute.d.ts.map +1 -1
  310. package/dist/registry/tool/execute.js +15 -727
  311. package/dist/registry/tool/execute.js.map +1 -1
  312. package/dist/registry/tool/portable.d.ts +25 -0
  313. package/dist/registry/tool/portable.d.ts.map +1 -1
  314. package/dist/registry/tool/portable.js +50 -0
  315. package/dist/registry/tool/portable.js.map +1 -1
  316. package/dist/registry/tool/presentation.d.ts +6 -5
  317. package/dist/registry/tool/presentation.d.ts.map +1 -1
  318. package/dist/registry/tool/presentation.js +3 -3
  319. package/dist/registry/tool/presentation.js.map +1 -1
  320. package/dist/runtime/bidi/session.d.ts +5 -4
  321. package/dist/runtime/bidi/session.d.ts.map +1 -1
  322. package/dist/runtime/bidi/session.js +18 -1
  323. package/dist/runtime/bidi/session.js.map +1 -1
  324. package/dist/runtime/query/executor/tool-call-admission.d.ts +45 -2
  325. package/dist/runtime/query/executor/tool-call-admission.d.ts.map +1 -1
  326. package/dist/runtime/query/executor/tool-call-admission.js +189 -5
  327. package/dist/runtime/query/executor/tool-call-admission.js.map +1 -1
  328. package/dist/runtime/query/executor.d.ts +33 -3
  329. package/dist/runtime/query/executor.d.ts.map +1 -1
  330. package/dist/runtime/query/executor.js +86 -10
  331. package/dist/runtime/query/executor.js.map +1 -1
  332. package/dist/runtime/query/file-evidence-replay.d.ts +1 -1
  333. package/dist/runtime/query/file-evidence-replay.d.ts.map +1 -1
  334. package/dist/runtime/query/file-evidence-replay.js +8 -7
  335. package/dist/runtime/query/file-evidence-replay.js.map +1 -1
  336. package/dist/runtime/query/fork/prepare.d.ts +4 -1
  337. package/dist/runtime/query/fork/prepare.d.ts.map +1 -1
  338. package/dist/runtime/query/fork/prepare.js +4 -0
  339. package/dist/runtime/query/fork/prepare.js.map +1 -1
  340. package/dist/runtime/query/guardrail-presets.d.ts +4 -3
  341. package/dist/runtime/query/guardrail-presets.d.ts.map +1 -1
  342. package/dist/runtime/query/guardrail-presets.js +4 -3
  343. package/dist/runtime/query/guardrail-presets.js.map +1 -1
  344. package/dist/runtime/query/index.d.ts +23 -10
  345. package/dist/runtime/query/index.d.ts.map +1 -1
  346. package/dist/runtime/query/index.js +149 -70
  347. package/dist/runtime/query/index.js.map +1 -1
  348. package/dist/runtime/query/iteration/index.d.ts.map +1 -1
  349. package/dist/runtime/query/iteration/index.js +8 -1
  350. package/dist/runtime/query/iteration/index.js.map +1 -1
  351. package/dist/runtime/query/iteration/phases/compaction.js +1 -1
  352. package/dist/runtime/query/iteration/phases/compaction.js.map +1 -1
  353. package/dist/runtime/query/iteration/phases/context.d.ts +2 -2
  354. package/dist/runtime/query/iteration/phases/context.d.ts.map +1 -1
  355. package/dist/runtime/query/iteration/phases/tool-review.d.ts.map +1 -1
  356. package/dist/runtime/query/iteration/phases/tool-review.js +55 -2
  357. package/dist/runtime/query/iteration/phases/tool-review.js.map +1 -1
  358. package/dist/runtime/query/iteration/stream-turn.d.ts.map +1 -1
  359. package/dist/runtime/query/iteration/stream-turn.js +342 -116
  360. package/dist/runtime/query/iteration/stream-turn.js.map +1 -1
  361. package/dist/runtime/query/iteration/tool-input.d.ts +79 -0
  362. package/dist/runtime/query/iteration/tool-input.d.ts.map +1 -0
  363. package/dist/runtime/query/iteration/tool-input.js +291 -0
  364. package/dist/runtime/query/iteration/tool-input.js.map +1 -0
  365. package/dist/runtime/query/observation-context.d.ts +2 -2
  366. package/dist/runtime/query/observation-context.d.ts.map +1 -1
  367. package/dist/runtime/query/observation-context.js.map +1 -1
  368. package/dist/runtime/query/prelude-lease.d.ts +18 -0
  369. package/dist/runtime/query/prelude-lease.d.ts.map +1 -0
  370. package/dist/runtime/query/prelude-lease.js +121 -0
  371. package/dist/runtime/query/prelude-lease.js.map +1 -0
  372. package/dist/runtime/query/prepare-turn.d.ts.map +1 -1
  373. package/dist/runtime/query/prepare-turn.js +386 -187
  374. package/dist/runtime/query/prepare-turn.js.map +1 -1
  375. package/dist/runtime/query/prompt-cache.d.ts +2 -2
  376. package/dist/runtime/query/prompt-cache.d.ts.map +1 -1
  377. package/dist/runtime/query/prompt.d.ts +2 -2
  378. package/dist/runtime/query/prompt.d.ts.map +1 -1
  379. package/dist/runtime/query/prompt.js +1 -1
  380. package/dist/runtime/query/prompt.js.map +1 -1
  381. package/dist/runtime/query/resume-session.d.ts.map +1 -1
  382. package/dist/runtime/query/resume-session.js +37 -2
  383. package/dist/runtime/query/resume-session.js.map +1 -1
  384. package/dist/runtime/query/review-policy.d.ts +22 -3
  385. package/dist/runtime/query/review-policy.d.ts.map +1 -1
  386. package/dist/runtime/query/review-policy.js +84 -6
  387. package/dist/runtime/query/review-policy.js.map +1 -1
  388. package/dist/runtime/query/tooling.d.ts +3 -2
  389. package/dist/runtime/query/tooling.d.ts.map +1 -1
  390. package/dist/runtime/query/tooling.js.map +1 -1
  391. package/dist/runtime/query/turn-state.d.ts.map +1 -1
  392. package/dist/runtime/query/turn-state.js +5 -0
  393. package/dist/runtime/query/turn-state.js.map +1 -1
  394. package/dist/runtime/system-events.d.ts +112 -0
  395. package/dist/runtime/system-events.d.ts.map +1 -0
  396. package/dist/runtime/system-events.js +183 -0
  397. package/dist/runtime/system-events.js.map +1 -0
  398. package/dist/scheduler/delegating.d.ts +2 -1
  399. package/dist/scheduler/delegating.d.ts.map +1 -1
  400. package/dist/scheduler/delegating.js +3 -2
  401. package/dist/scheduler/delegating.js.map +1 -1
  402. package/dist/scheduler/local.d.ts.map +1 -1
  403. package/dist/scheduler/local.js +2 -0
  404. package/dist/scheduler/local.js.map +1 -1
  405. package/dist/session/retention/archive.js +1 -1
  406. package/dist/session/retention/archive.js.map +1 -1
  407. package/dist/skills/index.d.ts +1 -1
  408. package/dist/skills/index.d.ts.map +1 -1
  409. package/dist/skills/index.js +1 -1
  410. package/dist/skills/index.js.map +1 -1
  411. package/dist/skills/registry.d.ts +12 -0
  412. package/dist/skills/registry.d.ts.map +1 -1
  413. package/dist/skills/registry.js +19 -0
  414. package/dist/skills/registry.js.map +1 -1
  415. package/dist/store/evidence/index-page.d.ts +2 -2
  416. package/dist/store/session/disk.d.ts.map +1 -1
  417. package/dist/store/session/disk.js +2 -0
  418. package/dist/store/session/disk.js.map +1 -1
  419. package/dist/store/session-log/conformance.d.ts +1 -1
  420. package/dist/store/session-log/conformance.d.ts.map +1 -1
  421. package/dist/store/session-log/conformance.js +49 -8
  422. package/dist/store/session-log/conformance.js.map +1 -1
  423. package/dist/store/session-log/core.d.ts +8 -3
  424. package/dist/store/session-log/core.d.ts.map +1 -1
  425. package/dist/store/session-log/core.js +2 -1
  426. package/dist/store/session-log/core.js.map +1 -1
  427. package/dist/store/session-log/fold.d.ts +12 -0
  428. package/dist/store/session-log/fold.d.ts.map +1 -1
  429. package/dist/store/session-log/fold.js +57 -7
  430. package/dist/store/session-log/fold.js.map +1 -1
  431. package/dist/store/session-log/index.d.ts +2 -2
  432. package/dist/store/session-log/index.d.ts.map +1 -1
  433. package/dist/store/session-log/index.js +1 -1
  434. package/dist/store/session-log/index.js.map +1 -1
  435. package/dist/test-support/toolset.d.ts +19 -0
  436. package/dist/test-support/toolset.d.ts.map +1 -0
  437. package/dist/test-support/toolset.js +20 -0
  438. package/dist/test-support/toolset.js.map +1 -0
  439. package/dist/tools/builtins/bash.d.ts +29 -0
  440. package/dist/tools/builtins/bash.d.ts.map +1 -1
  441. package/dist/tools/builtins/bash.js +19 -9
  442. package/dist/tools/builtins/bash.js.map +1 -1
  443. package/dist/tools/builtins/browser-url.d.ts +1 -1
  444. package/dist/tools/builtins/browser-url.js +1 -1
  445. package/dist/tools/builtins/browser.d.ts +6 -6
  446. package/dist/tools/builtins/browser.js +2 -2
  447. package/dist/tools/builtins/browser.js.map +1 -1
  448. package/dist/tools/builtins/computer-use.d.ts.map +1 -1
  449. package/dist/tools/builtins/computer-use.js +19 -11
  450. package/dist/tools/builtins/computer-use.js.map +1 -1
  451. package/dist/tools/builtins/edit.d.ts.map +1 -1
  452. package/dist/tools/builtins/edit.js +9 -1
  453. package/dist/tools/builtins/edit.js.map +1 -1
  454. package/dist/tools/builtins/json-string-hint.d.ts +15 -0
  455. package/dist/tools/builtins/json-string-hint.d.ts.map +1 -0
  456. package/dist/tools/builtins/json-string-hint.js +17 -0
  457. package/dist/tools/builtins/json-string-hint.js.map +1 -0
  458. package/dist/tools/builtins/search-tools.d.ts.map +1 -1
  459. package/dist/tools/builtins/search-tools.js +7 -15
  460. package/dist/tools/builtins/search-tools.js.map +1 -1
  461. package/dist/tools/builtins/write-file.d.ts.map +1 -1
  462. package/dist/tools/builtins/write-file.js +11 -0
  463. package/dist/tools/builtins/write-file.js.map +1 -1
  464. package/dist/tools/command-shell.d.ts +10 -0
  465. package/dist/tools/command-shell.d.ts.map +1 -1
  466. package/dist/tools/command-shell.js +45 -1
  467. package/dist/tools/command-shell.js.map +1 -1
  468. package/dist/tools/coordinator/agent.d.ts.map +1 -1
  469. package/dist/tools/coordinator/agent.js +5 -0
  470. package/dist/tools/coordinator/agent.js.map +1 -1
  471. package/dist/tools/coordinator/ask-user-question.d.ts.map +1 -1
  472. package/dist/tools/coordinator/ask-user-question.js +26 -13
  473. package/dist/tools/coordinator/ask-user-question.js.map +1 -1
  474. package/dist/tools/coordinator/index.d.ts.map +1 -1
  475. package/dist/tools/coordinator/index.js +5 -0
  476. package/dist/tools/coordinator/index.js.map +1 -1
  477. package/dist/tools/coordinator/question-options.d.ts +78 -0
  478. package/dist/tools/coordinator/question-options.d.ts.map +1 -0
  479. package/dist/tools/coordinator/question-options.js +153 -0
  480. package/dist/tools/coordinator/question-options.js.map +1 -0
  481. package/dist/tools/defineTool.d.ts +10 -0
  482. package/dist/tools/defineTool.d.ts.map +1 -1
  483. package/dist/tools/defineTool.js +17 -0
  484. package/dist/tools/defineTool.js.map +1 -1
  485. package/dist/tools/memory/search.d.ts.map +1 -1
  486. package/dist/tools/memory/search.js +4 -1
  487. package/dist/tools/memory/search.js.map +1 -1
  488. package/dist/tools/memory/update.d.ts.map +1 -1
  489. package/dist/tools/memory/update.js +8 -5
  490. package/dist/tools/memory/update.js.map +1 -1
  491. package/dist/tools/render-nonce.d.ts +47 -0
  492. package/dist/tools/render-nonce.d.ts.map +1 -0
  493. package/dist/tools/render-nonce.js +63 -0
  494. package/dist/tools/render-nonce.js.map +1 -0
  495. package/dist/tools/roster.d.ts +46 -19
  496. package/dist/tools/roster.d.ts.map +1 -1
  497. package/dist/tools/roster.js +63 -33
  498. package/dist/tools/roster.js.map +1 -1
  499. package/dist/tools/schedules/schedule-tool.d.ts.map +1 -1
  500. package/dist/tools/schedules/schedule-tool.js +94 -14
  501. package/dist/tools/schedules/schedule-tool.js.map +1 -1
  502. package/dist/tools/schedules/types.d.ts +52 -6
  503. package/dist/tools/schedules/types.d.ts.map +1 -1
  504. package/dist/tools/trusted-read-only.d.ts +9 -5
  505. package/dist/tools/trusted-read-only.d.ts.map +1 -1
  506. package/dist/tools/trusted-read-only.js +14 -10
  507. package/dist/tools/trusted-read-only.js.map +1 -1
  508. package/dist/tools/untrusted-envelope.d.ts +67 -28
  509. package/dist/tools/untrusted-envelope.d.ts.map +1 -1
  510. package/dist/tools/untrusted-envelope.js +108 -59
  511. package/dist/tools/untrusted-envelope.js.map +1 -1
  512. package/dist/toolsets/combine.d.ts +44 -0
  513. package/dist/toolsets/combine.d.ts.map +1 -0
  514. package/dist/toolsets/combine.js +153 -0
  515. package/dist/toolsets/combine.js.map +1 -0
  516. package/dist/toolsets/manager.d.ts +201 -0
  517. package/dist/toolsets/manager.d.ts.map +1 -0
  518. package/dist/toolsets/manager.js +837 -0
  519. package/dist/toolsets/manager.js.map +1 -0
  520. package/dist/toolsets/source-glob.d.ts +15 -0
  521. package/dist/toolsets/source-glob.d.ts.map +1 -0
  522. package/dist/toolsets/source-glob.js +23 -0
  523. package/dist/toolsets/source-glob.js.map +1 -0
  524. package/dist/toolsets/toolset.d.ts +20 -0
  525. package/dist/toolsets/toolset.d.ts.map +1 -0
  526. package/dist/toolsets/toolset.js +28 -0
  527. package/dist/toolsets/toolset.js.map +1 -0
  528. package/dist/toolsets/types.d.ts +128 -0
  529. package/dist/toolsets/types.d.ts.map +1 -0
  530. package/dist/toolsets/types.js +33 -0
  531. package/dist/toolsets/types.js.map +1 -0
  532. package/dist/toolsets/wrappers.d.ts +59 -0
  533. package/dist/toolsets/wrappers.d.ts.map +1 -0
  534. package/dist/toolsets/wrappers.js +165 -0
  535. package/dist/toolsets/wrappers.js.map +1 -0
  536. package/dist/types/agent/base.d.ts +27 -16
  537. package/dist/types/agent/base.d.ts.map +1 -1
  538. package/dist/types/agent/index.d.ts +1 -0
  539. package/dist/types/agent/index.d.ts.map +1 -1
  540. package/dist/types/agent/index.js +1 -0
  541. package/dist/types/agent/index.js.map +1 -1
  542. package/dist/types/agent/pipeline.d.ts +2 -0
  543. package/dist/types/agent/pipeline.d.ts.map +1 -1
  544. package/dist/types/agent/query.d.ts +117 -0
  545. package/dist/types/agent/query.d.ts.map +1 -0
  546. package/dist/types/agent/query.js +2 -0
  547. package/dist/types/agent/query.js.map +1 -0
  548. package/dist/types/agent/reactive.d.ts +2 -129
  549. package/dist/types/agent/reactive.d.ts.map +1 -1
  550. package/dist/types/agent/router.d.ts +2 -0
  551. package/dist/types/agent/router.d.ts.map +1 -1
  552. package/dist/types/agent/scheduler.d.ts +6 -1
  553. package/dist/types/agent/scheduler.d.ts.map +1 -1
  554. package/dist/types/agent/supervisor.d.ts +5 -2
  555. package/dist/types/agent/supervisor.d.ts.map +1 -1
  556. package/dist/types/agent/task.d.ts +19 -1
  557. package/dist/types/agent/task.d.ts.map +1 -1
  558. package/dist/types/agent/task.js.map +1 -1
  559. package/dist/types/authorization/index.d.ts +49 -12
  560. package/dist/types/authorization/index.d.ts.map +1 -1
  561. package/dist/types/authorization/index.js +6 -0
  562. package/dist/types/authorization/index.js.map +1 -1
  563. package/dist/types/connector/mcp.d.ts +45 -0
  564. package/dist/types/connector/mcp.d.ts.map +1 -1
  565. package/dist/types/errors/index.d.ts +15 -0
  566. package/dist/types/errors/index.d.ts.map +1 -1
  567. package/dist/types/errors/index.js.map +1 -1
  568. package/dist/types/hitl/index.d.ts +57 -0
  569. package/dist/types/hitl/index.d.ts.map +1 -1
  570. package/dist/types/hitl/index.js.map +1 -1
  571. package/dist/types/message/index.d.ts +130 -9
  572. package/dist/types/message/index.d.ts.map +1 -1
  573. package/dist/types/message/index.js +4 -1
  574. package/dist/types/message/index.js.map +1 -1
  575. package/dist/types/plugin/index.d.ts +22 -4
  576. package/dist/types/plugin/index.d.ts.map +1 -1
  577. package/dist/types/plugin/index.js +1 -0
  578. package/dist/types/plugin/index.js.map +1 -1
  579. package/dist/types/provider/chat.d.ts +5 -0
  580. package/dist/types/provider/chat.d.ts.map +1 -1
  581. package/dist/types/provider/config.d.ts +8 -3
  582. package/dist/types/provider/config.d.ts.map +1 -1
  583. package/dist/types/provider/stream.d.ts +39 -0
  584. package/dist/types/provider/stream.d.ts.map +1 -1
  585. package/dist/types/sandbox/index.d.ts +1 -1
  586. package/dist/types/session/events.d.ts +14 -3
  587. package/dist/types/session/events.d.ts.map +1 -1
  588. package/dist/types/session/events.js.map +1 -1
  589. package/dist/types/session/sub-session.d.ts +2 -0
  590. package/dist/types/session/sub-session.d.ts.map +1 -1
  591. package/dist/types/tool/index.d.ts +152 -91
  592. package/dist/types/tool/index.d.ts.map +1 -1
  593. package/dist/types/tool/index.js.map +1 -1
  594. package/dist/types/toolset/index.d.ts +10 -40
  595. package/dist/types/toolset/index.d.ts.map +1 -1
  596. package/package.json +1 -1
  597. package/src/advisory/history.ts +27 -2
  598. package/src/advisory/index.ts +1 -1
  599. package/src/advisory/registry.ts +33 -0
  600. package/src/agents/AGENTS.md +14 -7
  601. package/src/agents/PipelineAgent.ts +2 -303
  602. package/src/agents/QueryAgent.ts +269 -0
  603. package/src/agents/ReactiveAgent.ts +6 -216
  604. package/src/agents/RouterAgent.ts +2 -337
  605. package/src/agents/SupervisorAgent.ts +3 -476
  606. package/src/agents/defineAgent.ts +13 -2
  607. package/src/agents/examples/PipelineAgent.ts +302 -0
  608. package/src/agents/examples/RouterAgent.ts +338 -0
  609. package/src/agents/examples/SupervisorAgent.ts +472 -0
  610. package/src/agents/explore.ts +6 -3
  611. package/src/agents/forward-options.ts +37 -0
  612. package/src/agents/index.ts +2 -0
  613. package/src/agents/runAgent.ts +144 -37
  614. package/src/authorization/command-line.ts +2 -2
  615. package/src/authorization/gate.ts +21 -1
  616. package/src/authorization/program.ts +773 -0
  617. package/src/authorization/reexec-wrapper.ts +589 -0
  618. package/src/authorization/rules.ts +18 -1
  619. package/src/authorization/shell-lexer.ts +104 -59
  620. package/src/bridge/sse/mapper.ts +6 -0
  621. package/src/capabilities/index.ts +157 -0
  622. package/src/config/registry.ts +4 -1
  623. package/src/connector/index.ts +9 -2
  624. package/src/connector/mcp/adapter.ts +73 -3
  625. package/src/connector/mcp/client.ts +425 -6
  626. package/src/connector/mcp/discovery.ts +60 -0
  627. package/src/connector/mcp/era.ts +7 -0
  628. package/src/connector/mcp/index.ts +13 -0
  629. package/src/connector/mcp/mcp-toolset.ts +515 -0
  630. package/src/connector/mcp/streamable-http.ts +302 -5
  631. package/src/connector/tools/index.ts +2 -2
  632. package/src/connector/tools/router.ts +35 -58
  633. package/src/directory/derive-supervisor.ts +12 -8
  634. package/src/directory/derive.ts +8 -5
  635. package/src/execution/code-runtime/types.ts +2 -2
  636. package/src/invariants/index.ts +4 -1
  637. package/src/manager/agent/lifecycle.ts +167 -19
  638. package/src/manager/connector/environment.ts +17 -4
  639. package/src/manager/connector/index.ts +2 -2
  640. package/src/manager/connector/tenant.ts +17 -4
  641. package/src/manager/index.ts +2 -2
  642. package/src/manager/session/attribution.ts +79 -0
  643. package/src/manager/session/turn-recorder.ts +211 -55
  644. package/src/peers/address.ts +58 -0
  645. package/src/peers/client.ts +202 -0
  646. package/src/peers/dir.ts +176 -0
  647. package/src/peers/endpoint.ts +564 -0
  648. package/src/peers/envelope.ts +121 -0
  649. package/src/peers/index.ts +96 -0
  650. package/src/peers/protocol.ts +196 -0
  651. package/src/peers/record.ts +56 -0
  652. package/src/peers/registry.ts +241 -0
  653. package/src/plugin/define.ts +68 -0
  654. package/src/plugin/index.ts +2 -0
  655. package/src/plugin/lifecycle.ts +286 -106
  656. package/src/plugin/resolver.ts +6 -3
  657. package/src/plugin/shell-hook.ts +21 -5
  658. package/src/probe/errors.ts +4 -1
  659. package/src/prompt/coding-agent-doctrine.ts +22 -10
  660. package/src/prompt/contributions.ts +12 -2
  661. package/src/prompt/index.ts +1 -0
  662. package/src/provider/collect-chat-completion.ts +96 -11
  663. package/src/provider/mock.ts +24 -6
  664. package/src/provider/registry.ts +4 -1
  665. package/src/provider/tool-call-framing.ts +226 -0
  666. package/src/public-runtime.ts +136 -7
  667. package/src/public-tools.ts +24 -4
  668. package/src/public-types.ts +60 -6
  669. package/src/read-model/registry.ts +7 -2
  670. package/src/registry/ManagedRegistry.ts +57 -6
  671. package/src/registry/collision.ts +64 -0
  672. package/src/registry/command/index.ts +7 -3
  673. package/src/registry/index.ts +3 -9
  674. package/src/registry/plugin/index.ts +14 -1
  675. package/src/registry/tool/callable.ts +8 -9
  676. package/src/registry/tool/execute.ts +16 -846
  677. package/src/registry/tool/portable.ts +59 -0
  678. package/src/registry/tool/presentation.ts +6 -5
  679. package/src/runtime/bidi/session.ts +24 -5
  680. package/src/runtime/query/executor/tool-call-admission.ts +228 -6
  681. package/src/runtime/query/executor.ts +110 -12
  682. package/src/runtime/query/file-evidence-replay.ts +8 -7
  683. package/src/runtime/query/fork/prepare.ts +6 -1
  684. package/src/runtime/query/guardrail-presets.ts +4 -3
  685. package/src/runtime/query/index.ts +199 -101
  686. package/src/runtime/query/iteration/index.ts +13 -3
  687. package/src/runtime/query/iteration/phases/compaction.ts +1 -1
  688. package/src/runtime/query/iteration/phases/context.ts +2 -2
  689. package/src/runtime/query/iteration/phases/tool-review.ts +59 -2
  690. package/src/runtime/query/iteration/stream-turn.ts +390 -136
  691. package/src/runtime/query/iteration/tool-input.ts +284 -0
  692. package/src/runtime/query/observation-context.ts +2 -2
  693. package/src/runtime/query/prelude-lease.ts +132 -0
  694. package/src/runtime/query/prepare-turn.ts +477 -198
  695. package/src/runtime/query/prompt-cache.ts +2 -2
  696. package/src/runtime/query/prompt.ts +4 -4
  697. package/src/runtime/query/resume-session.ts +42 -3
  698. package/src/runtime/query/review-policy.ts +87 -9
  699. package/src/runtime/query/tooling.ts +3 -6
  700. package/src/runtime/query/turn-state.ts +4 -0
  701. package/src/runtime/system-events.ts +246 -0
  702. package/src/scheduler/delegating.ts +7 -2
  703. package/src/scheduler/local.ts +2 -0
  704. package/src/session/retention/archive.ts +1 -1
  705. package/src/skills/index.ts +1 -1
  706. package/src/skills/registry.ts +25 -0
  707. package/src/store/session/disk.ts +3 -0
  708. package/src/store/session-log/conformance.ts +51 -8
  709. package/src/store/session-log/core.ts +10 -4
  710. package/src/store/session-log/fold.ts +33 -7
  711. package/src/store/session-log/index.ts +2 -0
  712. package/src/test-support/toolset.ts +23 -0
  713. package/src/tools/builtins/bash.ts +27 -10
  714. package/src/tools/builtins/browser-url.ts +1 -1
  715. package/src/tools/builtins/browser.ts +2 -2
  716. package/src/tools/builtins/computer-use.ts +21 -11
  717. package/src/tools/builtins/edit.ts +12 -2
  718. package/src/tools/builtins/json-string-hint.ts +16 -0
  719. package/src/tools/builtins/search-tools.ts +7 -20
  720. package/src/tools/builtins/write-file.ts +12 -0
  721. package/src/tools/command-shell.ts +46 -1
  722. package/src/tools/coordinator/agent.ts +6 -0
  723. package/src/tools/coordinator/ask-user-question.ts +29 -15
  724. package/src/tools/coordinator/index.ts +6 -0
  725. package/src/tools/coordinator/question-options.ts +195 -0
  726. package/src/tools/defineTool.ts +28 -0
  727. package/src/tools/memory/search.ts +4 -1
  728. package/src/tools/memory/update.ts +8 -5
  729. package/src/tools/render-nonce.ts +69 -0
  730. package/src/tools/roster.ts +84 -33
  731. package/src/tools/schedules/schedule-tool.ts +107 -14
  732. package/src/tools/schedules/types.ts +52 -6
  733. package/src/tools/trusted-read-only.ts +19 -10
  734. package/src/tools/untrusted-envelope.ts +121 -57
  735. package/src/toolsets/combine.ts +181 -0
  736. package/src/toolsets/manager.ts +996 -0
  737. package/src/toolsets/source-glob.ts +22 -0
  738. package/src/toolsets/toolset.ts +31 -0
  739. package/src/toolsets/types.ts +154 -0
  740. package/src/toolsets/wrappers.ts +191 -0
  741. package/src/types/agent/base.ts +29 -16
  742. package/src/types/agent/index.ts +1 -0
  743. package/src/types/agent/pipeline.ts +2 -0
  744. package/src/types/agent/query.ts +129 -0
  745. package/src/types/agent/reactive.ts +5 -142
  746. package/src/types/agent/router.ts +2 -0
  747. package/src/types/agent/scheduler.ts +6 -1
  748. package/src/types/agent/supervisor.ts +5 -2
  749. package/src/types/agent/task.ts +21 -1
  750. package/src/types/authorization/index.ts +12 -0
  751. package/src/types/connector/mcp.ts +46 -0
  752. package/src/types/errors/index.ts +15 -0
  753. package/src/types/hitl/index.ts +57 -0
  754. package/src/types/message/index.ts +135 -7
  755. package/src/types/plugin/index.ts +44 -21
  756. package/src/types/provider/chat.ts +5 -0
  757. package/src/types/provider/config.ts +8 -3
  758. package/src/types/provider/stream.ts +39 -0
  759. package/src/types/sandbox/index.ts +1 -1
  760. package/src/types/session/events.ts +14 -3
  761. package/src/types/session/sub-session.ts +2 -0
  762. package/src/types/tool/index.ts +154 -105
  763. package/src/types/toolset/index.ts +10 -47
  764. package/dist/registry/toolset/catalog.d.ts +0 -42
  765. package/dist/registry/toolset/catalog.d.ts.map +0 -1
  766. package/dist/registry/toolset/catalog.js +0 -234
  767. package/dist/registry/toolset/catalog.js.map +0 -1
  768. package/src/registry/toolset/catalog.ts +0 -308
@@ -0,0 +1,837 @@
1
+ import { SpanStatusCode, context as otelContext, trace } from '@opentelemetry/api';
2
+ import { isCompactionMessage } from '../compaction/summary.js';
3
+ import { assertStrictSchema } from '../provider/strict-schema.js';
4
+ import { callableToolNames, formatToolNames } from '../registry/tool/callable.js';
5
+ import { assertToolName, describeWithOutput, toolDiscoveryHint } from '../registry/tool/execute.js';
6
+ import { renderToolSchema, toolWireSchema } from '../registry/tool/schema.js';
7
+ import { ToolResultHalted, screenToolResult } from '../registry/tool/screen.js';
8
+ import { GENAI, NAMZU, toolSpanName } from '../telemetry/attributes.js';
9
+ import { recordToolCall } from '../telemetry/metrics.js';
10
+ import { getTracer } from '../telemetry/runtime-accessors.js';
11
+ import { isTrustedReadOnly } from '../tools/trusted-read-only.js';
12
+ import { PLAN_MODE_REFUSAL } from '../types/permission/index.js';
13
+ import { toErrorMessage } from '../utils/error.js';
14
+ import { cloneJsonValue as clonePreparedInput } from '../utils/json-snapshot.js';
15
+ import { SCOPE_ATTRIBUTE } from '../utils/log/types.js';
16
+ import { resolveLogger } from '../utils/logger.js';
17
+ import { ToolsetConflictError } from './combine.js';
18
+ import { toToolSourceRef, toolsetIsReady } from './types.js';
19
+ // Tokens too generic to identify a tool by name — ignored when matching a
20
+ // batched `search_tools` query so they can't activate the whole catalog.
21
+ // Copied from `registry/tool/execute.ts`'s `ToolRegistry.searchByAvailability`
22
+ // (same weights, same stop list); consolidate once that class is removed.
23
+ const SEARCH_STOP_TOKENS = new Set([
24
+ 'clawtool',
25
+ 'tool',
26
+ 'tools',
27
+ 'mcp',
28
+ 'the',
29
+ 'and',
30
+ 'for',
31
+ 'use',
32
+ 'list',
33
+ 'read',
34
+ 'create',
35
+ 'update',
36
+ 'get',
37
+ 'find',
38
+ 'delete',
39
+ 'search',
40
+ ]);
41
+ const SEARCH_WEIGHT_NAME_EXACT = 12;
42
+ const SEARCH_WEIGHT_NAME_PARTIAL = 8;
43
+ const SEARCH_WEIGHT_DESCRIPTION = 5;
44
+ const SEARCH_WEIGHT_ARGUMENT = 3;
45
+ /**
46
+ * The runtime-owned resolver of {@link Toolset}s.
47
+ *
48
+ * It is built once from a fixed list of toolsets and never mutates its own
49
+ * membership: a toolset changing live (`onChange`) is only adopted when the caller calls
50
+ * {@link refresh}, at an iteration boundary the caller chooses — never
51
+ * mid-call. This is what keeps `toLLMTools`'s wire rendering byte-stable
52
+ * between refreshes: `toolWireSchema` (`registry/tool/schema.ts`) memoizes a
53
+ * tool's rendered schema by the object identity of `ToolDefinition.inputSchema`,
54
+ * not by anything owned by whichever object resolved the tool, so returning
55
+ * the SAME `ToolDefinition` object for the same name across calls — which a
56
+ * fixed, never-mutated resolution trivially does — is what keeps the cache
57
+ * hit.
58
+ *
59
+ * Availability has no stored, mutable map (unlike `ToolRegistry.availability`).
60
+ * It is DERIVED: an unready source is suspended; otherwise a tool is
61
+ * deferred iff its owner declared `deferred()` and no source-bound receipt
62
+ * in the turn's post-compaction history has loaded its schema. See
63
+ * {@link ToolManager.availability}.
64
+ *
65
+ * The execution pipeline below (`prepareExecution`/`executePrepared`/
66
+ * `execute`/`executeRetained`) is copied from `ToolRegistry`'s, per plan.md
67
+ * §2: "Diff it line by line; the only permitted changes are where it read
68
+ * `this.availability`, `tool.provenance` or registry identity." Those three
69
+ * substitutions are exactly: `this.availability(name)` (derived, above) for
70
+ * `this.getAvailability(name)`; `this.sourceOf(name)` for `tool.provenance`;
71
+ * and `this.toolsByName` for `this.items`. Every check, in the same order,
72
+ * with the same messages, is unchanged.
73
+ */
74
+ export class ToolManager {
75
+ toolsets;
76
+ resultGuardrails;
77
+ tierConfig;
78
+ messagesAccessor;
79
+ log;
80
+ toolsByName = new Map();
81
+ ownerToolsetByName = new Map();
82
+ defaultAvailabilityByName = new Map();
83
+ /**
84
+ * The object each name's owning toolset returned the LAST time `refresh()`
85
+ * (or construction) observed it — distinct from `toolsByName`, which holds
86
+ * whatever was first admitted under that name and never changes on drift.
87
+ * `refresh()` diffs against this map, not `toolsByName`, so a name that
88
+ * drifted once and has been stable ever since is not reported as drifted
89
+ * again just because some unrelated toolset's change forced a re-walk.
90
+ */
91
+ lastObservedByName = new Map();
92
+ dirty = false;
93
+ unsubscribeToolsetChanges = [];
94
+ disposed = false;
95
+ preparations = new WeakMap();
96
+ constructor(config) {
97
+ this.toolsets = config.toolsets;
98
+ this.resultGuardrails = config.resultGuardrails;
99
+ this.tierConfig = config.tierConfig;
100
+ this.messagesAccessor = config.messages;
101
+ this.log = resolveLogger(undefined).child({
102
+ [SCOPE_ATTRIBUTE]: 'registry',
103
+ [NAMZU.REGISTRY_NAME]: 'ToolManager',
104
+ });
105
+ this.resolveInitial();
106
+ try {
107
+ for (const toolset of this.toolsets) {
108
+ const unsubscribe = toolset.onChange?.(() => {
109
+ if (!this.disposed)
110
+ this.dirty = true;
111
+ });
112
+ if (unsubscribe)
113
+ this.unsubscribeToolsetChanges.push(unsubscribe);
114
+ }
115
+ }
116
+ catch (error) {
117
+ // A later subscription can fail after earlier live toolsets subscribed.
118
+ this.dispose();
119
+ throw error;
120
+ }
121
+ }
122
+ /** Stop observing live toolsets when this manager's owner finishes; the host owns their connections. */
123
+ dispose() {
124
+ if (this.disposed)
125
+ return;
126
+ this.disposed = true;
127
+ for (const unsubscribe of this.unsubscribeToolsetChanges.splice(0).reverse()) {
128
+ try {
129
+ unsubscribe();
130
+ }
131
+ catch (error) {
132
+ // A broken source must not prevent the other listeners (or the
133
+ // turn's recorder) from being released.
134
+ this.log.warn('Toolset change listener cleanup failed', {
135
+ 'exception.message': toErrorMessage(error),
136
+ });
137
+ }
138
+ }
139
+ }
140
+ // ---- Composition / membership ----------------------------------------
141
+ /**
142
+ * First resolution, at construction. Toolset order, then tool order,
143
+ * matching `combineToolsets` (`./combine.ts`) — a name contributed by two
144
+ * sources throws {@link ToolsetConflictError} naming both, because
145
+ * nothing has served anyone yet: unlike {@link refresh}, there is no
146
+ * incumbent to protect by refusing the newcomer instead.
147
+ */
148
+ /**
149
+ * The checks `ToolRegistry.registerOne` used to run before admitting a
150
+ * tool, copied verbatim: a legal name; `enforceModelInput` requires a
151
+ * `modelInputSchema` (nothing to constrain generation against
152
+ * otherwise) and that schema must itself fit the strict-decoding subset
153
+ * `assertStrictSchema` checks (existing is not enough — it also has to
154
+ * be sendable); a declared `tier` must be one `this.tierConfig` lists.
155
+ */
156
+ assertAdmissible(tool) {
157
+ assertToolName(tool.name);
158
+ if (tool.enforceModelInput && !tool.modelInputSchema) {
159
+ throw new Error(`Tool "${tool.name}" enables enforceModelInput but does not define modelInputSchema. Constrained input generation requires an explicit provider-safe model schema.`);
160
+ }
161
+ if (tool.enforceModelInput) {
162
+ assertStrictSchema(tool.name, tool.modelInputSchema);
163
+ }
164
+ if (tool.tier && this.tierConfig) {
165
+ const validIds = this.tierConfig.tiers.map((t) => t.id);
166
+ if (!validIds.includes(tool.tier)) {
167
+ throw new Error(`Tool "${tool.name}" has tier "${tool.tier}" which is not defined. Valid tiers: ${validIds.join(', ')}`);
168
+ }
169
+ }
170
+ }
171
+ resolveInitial() {
172
+ const toolsByName = new Map();
173
+ const ownerToolsetByName = new Map();
174
+ const defaultAvailabilityByName = new Map();
175
+ for (const toolset of this.toolsets) {
176
+ for (const tool of toolset.tools()) {
177
+ // The same admission checks `ToolRegistry.register` used to run
178
+ // (name legality, `enforceModelInput`'s two schema
179
+ // requirements, a declared tier's existence) — moved here
180
+ // rather than dropped when that class went away. "Fail where
181
+ // it can still be attributed" (at construction) instead of at
182
+ // the first request.
183
+ this.assertAdmissible(tool);
184
+ const existingOwner = ownerToolsetByName.get(tool.name);
185
+ if (existingOwner) {
186
+ throw new ToolsetConflictError(tool.name, existingOwner.source, toolset.source);
187
+ }
188
+ toolsByName.set(tool.name, tool);
189
+ ownerToolsetByName.set(tool.name, toolset);
190
+ defaultAvailabilityByName.set(tool.name, toolset.availability ?? 'active');
191
+ }
192
+ }
193
+ this.toolsByName = toolsByName;
194
+ this.ownerToolsetByName = ownerToolsetByName;
195
+ this.defaultAvailabilityByName = defaultAvailabilityByName;
196
+ this.lastObservedByName = new Map(toolsByName);
197
+ }
198
+ /**
199
+ * Re-resolve iff a toolset signalled change (`onChange`) since
200
+ * construction or the last `refresh()` — otherwise returns `undefined`
201
+ * without re-walking anything, so a caller that refreshes every
202
+ * iteration boundary pays nothing on the common case where nothing
203
+ * changed.
204
+ *
205
+ * Three outcomes per name, matching plan.md §2:
206
+ * - A name only ONE current toolset contributes, that nobody served
207
+ * before: `added`.
208
+ * - A name a toolset served before and stopped, with no other toolset
209
+ * now contributing it: `removed`.
210
+ * - A name still contributed by its ORIGINAL owning toolset, under a
211
+ * `ToolDefinition` object different from the one that toolset returned
212
+ * the LAST time it was observed (construction, or the previous
213
+ * `refresh()`): `drifted` — the previously admitted definition keeps
214
+ * serving; the new object is held, not adopted, so `toolWireSchema`'s
215
+ * identity-keyed cache (see the class doc) survives a live toolset's
216
+ * own internal change. Comparing against the last OBSERVATION, not
217
+ * the served object, means a name that drifted once and has been
218
+ * stable since is reported only on the refresh where it actually
219
+ * changed, not again on every later refresh some unrelated toolset's
220
+ * change happens to trigger.
221
+ * - A name some OTHER toolset starts contributing while its incumbent
222
+ * owner still serves it: `refused` — the incumbent wins regardless of
223
+ * toolset order; the newcomer is reported, never applied.
224
+ */
225
+ refresh() {
226
+ if (!this.dirty)
227
+ return undefined;
228
+ this.dirty = false;
229
+ const current = this.toolsets.map((toolset) => ({
230
+ toolset,
231
+ tools: toolset.tools(),
232
+ }));
233
+ const nextToolsByName = new Map();
234
+ const nextOwnerByName = new Map();
235
+ const nextDefaultAvailabilityByName = new Map();
236
+ const nextLastObservedByName = new Map();
237
+ const added = [];
238
+ const drifted = [];
239
+ const refused = [];
240
+ // Pass 1: every incumbent whose OWN owning toolset still offers it
241
+ // keeps its slot — held at its OLD object identity even if the fresh
242
+ // one differs (drift), so a live toolset's own change never bumps an
243
+ // unrelated newcomer ahead of it, and never busts the wire-schema
244
+ // identity cache mid-turn. Drift is judged against the last fresh
245
+ // observation, not the held object, and that observation is updated
246
+ // unconditionally so a name that just drifted is not drifted again
247
+ // next time nothing about it has changed.
248
+ for (const [name, ownerToolset] of this.ownerToolsetByName) {
249
+ const ownerEntry = current.find((entry) => entry.toolset === ownerToolset);
250
+ const freshTool = ownerEntry?.tools.find((tool) => tool.name === name);
251
+ if (!freshTool)
252
+ continue; // handled as `removed` below, unless re-added by pass 2
253
+ const oldTool = this.toolsByName.get(name);
254
+ const lastObserved = this.lastObservedByName.get(name);
255
+ if (lastObserved && freshTool !== lastObserved)
256
+ drifted.push(name);
257
+ nextToolsByName.set(name, oldTool ?? freshTool);
258
+ nextOwnerByName.set(name, ownerToolset);
259
+ nextDefaultAvailabilityByName.set(name, ownerToolset.availability ?? 'active');
260
+ nextLastObservedByName.set(name, freshTool);
261
+ }
262
+ // Pass 2: walk every toolset, in order, for names no incumbent
263
+ // claimed above. First writer among the CURRENTLY offered names wins;
264
+ // anything already claimed here was necessarily claimed by pass 1
265
+ // (an incumbent), so this can only ever refuse a newcomer, never an
266
+ // incumbent.
267
+ for (const { toolset, tools } of current) {
268
+ for (const tool of tools) {
269
+ const claimedBy = nextOwnerByName.get(tool.name);
270
+ if (claimedBy) {
271
+ if (claimedBy !== toolset) {
272
+ refused.push({
273
+ name: tool.name,
274
+ reason: `tool "${tool.name}" is already served by "${claimedBy.source.id}"; "${toolset.source.id}" was refused. Rename it, or wrap the newcomer with prefixed(toolset, prefix).`,
275
+ });
276
+ }
277
+ continue;
278
+ }
279
+ nextToolsByName.set(tool.name, tool);
280
+ nextOwnerByName.set(tool.name, toolset);
281
+ nextDefaultAvailabilityByName.set(tool.name, toolset.availability ?? 'active');
282
+ nextLastObservedByName.set(tool.name, tool);
283
+ added.push(tool.name);
284
+ }
285
+ }
286
+ const removed = [...this.toolsByName.keys()].filter((name) => !nextToolsByName.has(name));
287
+ this.toolsByName = nextToolsByName;
288
+ this.ownerToolsetByName = nextOwnerByName;
289
+ this.defaultAvailabilityByName = nextDefaultAvailabilityByName;
290
+ this.lastObservedByName = nextLastObservedByName;
291
+ return { added, removed, drifted, refused };
292
+ }
293
+ has(name) {
294
+ return this.toolsByName.has(name);
295
+ }
296
+ get(name) {
297
+ return this.toolsByName.get(name);
298
+ }
299
+ listNames() {
300
+ return [...this.toolsByName.keys()];
301
+ }
302
+ /** Where `name` came from. Throws for an unknown name, like {@link getOrThrow}. */
303
+ sourceOf(name) {
304
+ const ownerToolset = this.ownerToolsetByName.get(name);
305
+ if (!ownerToolset) {
306
+ throw new Error(`Not found: "${name}". Available: ${this.listNames().join(', ')}`);
307
+ }
308
+ return toToolSourceRef(ownerToolset.source);
309
+ }
310
+ getOrThrow(name) {
311
+ const tool = this.toolsByName.get(name);
312
+ if (!tool) {
313
+ throw new Error(`Not found: "${name}". Available: ${this.listNames().join(', ')}`);
314
+ }
315
+ return tool;
316
+ }
317
+ // ---- Availability (derived) -------------------------------------------
318
+ /**
319
+ * `'suspended'` when the owning toolset is unready; otherwise `'deferred'`
320
+ * when it declared deferred and no matching receipt exists in the
321
+ * post-compaction history; otherwise `'active'`.
322
+ *
323
+ * Nothing here is stored: this is a pure read of the toolset's own
324
+ * declaration plus a scan of `messages()`, recomputed on every call — the
325
+ * same "safe to call repeatedly, byte-identical between calls" property
326
+ * `toLLMTools` already has. The scan is bounded to the window AFTER the
327
+ * last compaction summary (`compaction/summary.ts`'s
328
+ * `isCompactionMessage` — the one marker a compacted history carries, a
329
+ * system message whose content starts with `COMPACTION_HEADER`):
330
+ * compaction is the one deliberate "forget" boundary a derivation like
331
+ * this one needs, the same way it is the one boundary namzu's own
332
+ * summarisation treats as a reset. A tool message's own `revealedTools`
333
+ * (`types/message/index.ts`) is written by the executor from
334
+ * `ToolResult.reveals`, persisted like any other message field — there is
335
+ * no separate store to keep in sync, restore on resume, or lose across a
336
+ * fork.
337
+ */
338
+ availability(name) {
339
+ const owner = this.ownerToolsetByName.get(name);
340
+ if (owner && !toolsetIsReady(owner))
341
+ return 'suspended';
342
+ const declared = this.defaultAvailabilityByName.get(name) ?? 'active';
343
+ if (declared === 'active')
344
+ return 'active';
345
+ return this.wasRevealed(name) ? 'active' : 'deferred';
346
+ }
347
+ wasRevealed(name) {
348
+ const owner = this.ownerToolsetByName.get(name);
349
+ if (!owner)
350
+ return false;
351
+ const window = postCompactionWindow(this.messagesAccessor());
352
+ for (const message of window) {
353
+ if (message.role === 'tool' &&
354
+ !message.isError &&
355
+ message.revealedTools?.some((receipt) => receipt.name === name &&
356
+ receipt.sourceId === owner.source.id &&
357
+ receipt.sourceKind === owner.source.kind))
358
+ return true;
359
+ }
360
+ return false;
361
+ }
362
+ /** Bind a reveal to the source currently serving the named tool. */
363
+ revealReceipt(name) {
364
+ const source = this.sourceOf(name);
365
+ return { name, sourceId: source.id, sourceKind: source.kind };
366
+ }
367
+ getByAvailability(states, filter) {
368
+ const candidates = filter
369
+ ? filter.map((name) => this.getOrThrow(name))
370
+ : [...this.toolsByName.values()];
371
+ return candidates.filter((tool) => states.includes(this.availability(tool.name)));
372
+ }
373
+ // ---- Discovery ----------------------------------------------------------
374
+ /**
375
+ * Ranked lexical search over deferred tools — same scoring
376
+ * `ToolRegistry.searchDeferred` used (exact name 12 / name-substring 8 /
377
+ * description 5 / argument-name 3, generic tokens stopped), extended
378
+ * with an optional cap so a caller does not have to slice the result
379
+ * itself.
380
+ */
381
+ searchDeferred(query, limit) {
382
+ const results = this.searchByAvailability(query, 'deferred');
383
+ return limit === undefined ? results : results.slice(0, limit);
384
+ }
385
+ searchByAvailability(query, state) {
386
+ const q = query.toLowerCase().trim();
387
+ if (q.length === 0)
388
+ return [];
389
+ const terms = q.split(/\s+/).filter((tok) => tok.length >= 3 && !SEARCH_STOP_TOKENS.has(tok));
390
+ const scored = [];
391
+ for (const tool of this.toolsByName.values()) {
392
+ if (this.availability(tool.name) !== state)
393
+ continue;
394
+ const name = tool.name.toLowerCase();
395
+ const description = tool.description.toLowerCase();
396
+ const argumentNames = listArgumentNames(tool);
397
+ let score = terms.length === 0 && name === q ? SEARCH_WEIGHT_NAME_EXACT : 0;
398
+ for (const term of terms) {
399
+ if (name === term) {
400
+ score += SEARCH_WEIGHT_NAME_EXACT;
401
+ }
402
+ else if (name.includes(term)) {
403
+ score += SEARCH_WEIGHT_NAME_PARTIAL;
404
+ }
405
+ if (description.includes(term)) {
406
+ score += SEARCH_WEIGHT_DESCRIPTION;
407
+ }
408
+ if (argumentNames.some((arg) => arg.includes(term))) {
409
+ score += SEARCH_WEIGHT_ARGUMENT;
410
+ }
411
+ }
412
+ if (score > 0)
413
+ scored.push({ tool, score });
414
+ }
415
+ scored.sort((a, b) => b.score - a.score || a.tool.name.localeCompare(b.tool.name));
416
+ return scored.map((entry) => entry.tool);
417
+ }
418
+ // ---- Rendering to the model ----------------------------------------------
419
+ toLLMTools(names) {
420
+ const tools = this.getByAvailability(['active'], names);
421
+ return tools.map((tool) => {
422
+ let description = tool.description;
423
+ if (this.tierConfig?.labelInDescription && tool.tier) {
424
+ const tierDef = this.tierConfig.tiers.find((t) => t.id === tool.tier);
425
+ if (tierDef)
426
+ description = `[${tierDef.label}] ${description}`;
427
+ }
428
+ return {
429
+ type: 'function',
430
+ function: {
431
+ name: tool.name,
432
+ description: describeWithOutput(description, tool.outputSchema),
433
+ parameters: toolWireSchema(tool),
434
+ },
435
+ };
436
+ });
437
+ }
438
+ toPromptSection(names) {
439
+ const active = this.getByAvailability(['active'], names);
440
+ const deferred = this.getByAvailability(['deferred'], names);
441
+ const parts = [];
442
+ const contractNote = `<tool_runtime_contract>
443
+ 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.
444
+ </tool_runtime_contract>`;
445
+ if (active.length > 0) {
446
+ const entries = active.map((t) => `- ${t.name}`).join('\n');
447
+ parts.push(`<available_tools>\n${entries}\n</available_tools>`);
448
+ }
449
+ if (deferred.length > 0) {
450
+ const entries = deferred
451
+ .map((t) => {
452
+ const hint = toolDiscoveryHint(t.description);
453
+ return hint.length > 0 ? `- ${t.name}: ${hint}` : `- ${t.name}`;
454
+ })
455
+ .join('\n');
456
+ const deferredIntro = this.has('search_tools') &&
457
+ this.availability('search_tools') === 'active' &&
458
+ (!names || names.includes('search_tools'))
459
+ ? 'Use search_tools to load these before use:'
460
+ : 'Deferred tools are discoverable but not executable until the runtime activates them:';
461
+ parts.push(`<deferred_tools>\n${deferredIntro}\n${entries}\n</deferred_tools>`);
462
+ }
463
+ if (parts.length === 0)
464
+ return '';
465
+ return [contractNote, ...parts].join('\n\n');
466
+ }
467
+ toTierGuidance() {
468
+ if (!this.tierConfig?.guidanceTemplate)
469
+ return null;
470
+ return this.tierConfig.guidanceTemplate(this.tierConfig.tiers);
471
+ }
472
+ // ---- Narrow live view for a running tool's own `execute()` --------------
473
+ /** What `ToolContext` gives a running tool: read-only, no mutation. */
474
+ view() {
475
+ return {
476
+ has: (name) => this.has(name),
477
+ availability: (name) => this.availability(name),
478
+ searchDeferred: (query, limit) => this.searchDeferred(query, limit),
479
+ };
480
+ }
481
+ // ---- Execution pipeline ---------------------------------------------
482
+ //
483
+ // Copied from `ToolRegistry` (`registry/tool/execute.ts:475-791`) per
484
+ // plan.md §2. See the class doc for the three permitted substitutions;
485
+ // everything else — order of checks, messages, the WeakMap ownership and
486
+ // staleness re-check, the halt/fail distinction, the explicit parent
487
+ // span — is unchanged.
488
+ prepareExecution(toolName, rawInput) {
489
+ const tool = this.getOrThrow(toolName);
490
+ const parseResult = tool.inputSchema.safeParse(rawInput);
491
+ if (!parseResult.success) {
492
+ return {
493
+ success: false,
494
+ result: this.validationFailure(tool, rawInput, parseResult.error),
495
+ };
496
+ }
497
+ let retainedInput;
498
+ let reviewInput;
499
+ try {
500
+ retainedInput = clonePreparedInput(parseResult.data, false);
501
+ reviewInput = clonePreparedInput(retainedInput, true);
502
+ }
503
+ catch (err) {
504
+ const message = `Tool "${toolName}" produced an input that cannot be safely prepared for review and execution: ${toErrorMessage(err)}`;
505
+ this.log.error('Prepared tool input could not be detached for review and execution', {
506
+ 'namzu.tool.name': toolName,
507
+ 'exception.message': toErrorMessage(err),
508
+ });
509
+ return {
510
+ success: false,
511
+ result: { success: false, output: '', error: message },
512
+ };
513
+ }
514
+ const prepared = Object.freeze({ toolName, input: reviewInput });
515
+ this.preparations.set(prepared, { tool, input: retainedInput });
516
+ return { success: true, prepared };
517
+ }
518
+ async executePrepared(prepared, context) {
519
+ const retained = this.preparations.get(prepared);
520
+ if (!retained) {
521
+ return {
522
+ success: false,
523
+ output: '',
524
+ error: `Tool "${prepared.toolName}" preparation is not owned by this registry or is no longer valid.`,
525
+ };
526
+ }
527
+ if (this.toolsByName.get(prepared.toolName) !== retained.tool) {
528
+ return {
529
+ success: false,
530
+ output: '',
531
+ error: `Tool "${prepared.toolName}" changed after its input was reviewed; prepare the call again.`,
532
+ };
533
+ }
534
+ return this.executeRetained(prepared.toolName, retained.tool, retained.input, context);
535
+ }
536
+ async execute(toolName, rawInput, context) {
537
+ let preparation;
538
+ try {
539
+ preparation = this.prepareExecution(toolName, rawInput);
540
+ }
541
+ catch (err) {
542
+ return this.rejectPreparationWithClosedSpan(toolName, context, err);
543
+ }
544
+ if (!preparation.success)
545
+ return preparation.result;
546
+ return this.executePrepared(preparation.prepared, context);
547
+ }
548
+ rejectPreparationWithClosedSpan(toolName, context, err) {
549
+ const tracer = getTracer();
550
+ const parentCtx = context.parentSpan
551
+ ? trace.setSpan(otelContext.active(), context.parentSpan)
552
+ : otelContext.active();
553
+ return tracer.startActiveSpan(toolSpanName(toolName), {}, parentCtx, async (span) => {
554
+ try {
555
+ span.setAttributes({
556
+ [GENAI.TOOL_NAME]: toolName,
557
+ [GENAI.TOOL_TYPE]: 'function',
558
+ ...(context.toolUseId !== undefined ? { [GENAI.TOOL_CALL_ID]: context.toolUseId } : {}),
559
+ ...toolSpanIdentity(context),
560
+ [NAMZU.TOOL_SUCCESS]: false,
561
+ [NAMZU.TOOL_ERROR]: toErrorMessage(err),
562
+ });
563
+ span.setStatus({
564
+ code: SpanStatusCode.ERROR,
565
+ message: toErrorMessage(err),
566
+ });
567
+ throw err;
568
+ }
569
+ finally {
570
+ span.end();
571
+ }
572
+ });
573
+ }
574
+ async executeRetained(toolName, tool, finalInput, context) {
575
+ const tracer = getTracer();
576
+ // The permitted `tool.provenance` substitution: a lean per-tool source
577
+ // pointer from the OWNING toolset, computed once per call, rather than
578
+ // something stamped onto the shared `ToolDefinition` object.
579
+ const source = this.sourceOf(toolName);
580
+ const parentCtx = context.parentSpan
581
+ ? trace.setSpan(otelContext.active(), context.parentSpan)
582
+ : otelContext.active();
583
+ return tracer.startActiveSpan(toolSpanName(toolName), {}, parentCtx, async (span) => {
584
+ try {
585
+ span.setAttributes({
586
+ [GENAI.TOOL_NAME]: toolName,
587
+ [GENAI.TOOL_TYPE]: 'function',
588
+ ...(context.toolUseId !== undefined ? { [GENAI.TOOL_CALL_ID]: context.toolUseId } : {}),
589
+ ...toolSpanIdentity(context),
590
+ });
591
+ // The permitted `this.getAvailability` substitution: derived,
592
+ // not read off a stored map. See `availability` above.
593
+ const availability = this.availability(toolName);
594
+ if (availability !== 'active') {
595
+ const msg = `Tool "${toolName}" is ${availability} and cannot be executed`;
596
+ this.log.warn(msg);
597
+ span.setAttributes({
598
+ [NAMZU.TOOL_SUCCESS]: false,
599
+ [NAMZU.TOOL_ERROR]: msg,
600
+ });
601
+ span.setStatus({ code: SpanStatusCode.ERROR, message: msg });
602
+ return {
603
+ success: false,
604
+ output: '',
605
+ error: msg,
606
+ };
607
+ }
608
+ const allowed = context.allowedTools;
609
+ if (allowed !== undefined && !allowed.includes(toolName)) {
610
+ const msg = `Tool "${toolName}" is not available on this step. Available: ${formatToolNames(callableToolNames(this, allowed))}`;
611
+ this.log.warn('Blocked a tool outside the step allow-list', {
612
+ [GENAI.TOOL_NAME]: toolName,
613
+ 'namzu.registry.allowed': allowed.length,
614
+ });
615
+ span.setAttributes({
616
+ [NAMZU.TOOL_SUCCESS]: false,
617
+ [NAMZU.TOOL_ERROR]: msg,
618
+ });
619
+ span.setStatus({ code: SpanStatusCode.ERROR, message: msg });
620
+ return {
621
+ success: false,
622
+ output: '',
623
+ error: msg,
624
+ permissionDenied: true,
625
+ };
626
+ }
627
+ const mode = context.permissionContext?.mode ?? 'auto';
628
+ if (mode === 'plan') {
629
+ const isReadOnly = isTrustedReadOnly(tool, finalInput, source);
630
+ if (!isReadOnly) {
631
+ const msg = `plan mode: non-read-only tool "${toolName}" blocked. ${PLAN_MODE_REFUSAL}`;
632
+ span.setAttributes({
633
+ [NAMZU.TOOL_SUCCESS]: false,
634
+ [NAMZU.TOOL_ERROR]: msg,
635
+ });
636
+ span.setStatus({ code: SpanStatusCode.ERROR, message: msg });
637
+ return {
638
+ success: false,
639
+ output: '',
640
+ error: msg,
641
+ permissionDenied: true,
642
+ permissionMessage: msg,
643
+ };
644
+ }
645
+ }
646
+ try {
647
+ this.log.debug('Executing tool', { 'namzu.tool.name': toolName });
648
+ const startedAt = Date.now();
649
+ const runResultGuardrails = context.toolResultGuardrails;
650
+ const produced = await tool.execute(finalInput, context);
651
+ const provenance = sourceToProvenance(source);
652
+ const result = await screenToolResult(this.resultGuardrails ?? runResultGuardrails, produced, {
653
+ toolName,
654
+ input: finalInput,
655
+ ...(provenance ? { provenance } : {}),
656
+ }, this.log);
657
+ const durationMs = Date.now() - startedAt;
658
+ this.log.debug('Tool completed', {
659
+ 'namzu.tool.name': toolName,
660
+ 'namzu.registry.success': result.success,
661
+ });
662
+ span.setAttribute(NAMZU.TOOL_SUCCESS, result.success);
663
+ recordToolCall(toolName, result.success, result.success ? undefined : result.error, durationMs);
664
+ if (!result.success && result.error) {
665
+ span.setAttribute(NAMZU.TOOL_ERROR, result.error);
666
+ span.setStatus({
667
+ code: SpanStatusCode.ERROR,
668
+ message: result.error,
669
+ });
670
+ }
671
+ else {
672
+ span.setStatus({ code: SpanStatusCode.OK });
673
+ }
674
+ return result;
675
+ }
676
+ catch (err) {
677
+ if (err instanceof ToolResultHalted) {
678
+ span.setAttributes({
679
+ [NAMZU.TOOL_SUCCESS]: false,
680
+ [NAMZU.TOOL_ERROR]: err.message,
681
+ });
682
+ span.setStatus({
683
+ code: SpanStatusCode.ERROR,
684
+ message: err.message,
685
+ });
686
+ throw err;
687
+ }
688
+ const errorMessage = toErrorMessage(err);
689
+ this.log.error('Tool execution error', {
690
+ 'namzu.tool.name': toolName,
691
+ 'exception.message': errorMessage,
692
+ });
693
+ span.setAttributes({
694
+ [NAMZU.TOOL_SUCCESS]: false,
695
+ [NAMZU.TOOL_ERROR]: errorMessage,
696
+ });
697
+ span.setStatus({
698
+ code: SpanStatusCode.ERROR,
699
+ message: errorMessage,
700
+ });
701
+ span.recordException(err instanceof Error ? err : new Error(errorMessage));
702
+ return {
703
+ success: false,
704
+ output: '',
705
+ error: `Tool "${toolName}" execution failed: ${errorMessage}`,
706
+ };
707
+ }
708
+ }
709
+ finally {
710
+ span.end();
711
+ }
712
+ });
713
+ }
714
+ validationFailure(tool, rawInput, error) {
715
+ const errorMessage = error.issues
716
+ .map((issue) => `${issue.path.join('.')}: ${issue.message}`)
717
+ .join('; ');
718
+ const isEmptyInput = rawInput === null ||
719
+ rawInput === undefined ||
720
+ (typeof rawInput === 'object' &&
721
+ !Array.isArray(rawInput) &&
722
+ Object.keys(rawInput).length === 0);
723
+ const requiredHint = describeRequiredInput(tool.inputSchema);
724
+ const recoveryHint = tool.validationErrorHint?.trim()
725
+ ? ` ${tool.validationErrorHint.trim()}`
726
+ : '';
727
+ const enrichedMessage = isEmptyInput
728
+ ? `Tool "${tool.name}" was called with no arguments. ${requiredHint}${recoveryHint} Retry the call with the required parameters populated.`
729
+ : `Validation failed for "${tool.name}": ${errorMessage}. ${requiredHint}${recoveryHint}`;
730
+ this.log.error('Tool input validation failed', {
731
+ 'namzu.tool.name': tool.name,
732
+ 'namzu.registry.errors': errorMessage,
733
+ 'namzu.registry.empty': isEmptyInput,
734
+ });
735
+ return { success: false, output: '', error: enrichedMessage };
736
+ }
737
+ }
738
+ /**
739
+ * The session and turn a tool span belongs to, copied from
740
+ * `registry/tool/execute.ts`'s identically named private function.
741
+ */
742
+ function toolSpanIdentity(context) {
743
+ return {
744
+ ...(context.sessionId ? { [GENAI.CONVERSATION_ID]: context.sessionId } : {}),
745
+ ...(context.turnId ? { [NAMZU.TURN_ID]: context.turnId } : {}),
746
+ };
747
+ }
748
+ /** Project a `ToolSourceRef` to the `ToolProvenance` shape `screenToolResult` reads, for MCP-kind sources only. */
749
+ function sourceToProvenance(source) {
750
+ if (source.kind !== 'mcp_server')
751
+ return undefined;
752
+ return {
753
+ server: source.server ?? source.id,
754
+ readOnlyHintTrusted: source.readOnlyHintTrusted ?? false,
755
+ };
756
+ }
757
+ /**
758
+ * Every message after the last compaction summary. `isCompactionMessage`
759
+ * (`compaction/summary.ts`) is the one marker a compacted history carries: a
760
+ * system message whose content starts with `COMPACTION_HEADER`. No such
761
+ * message means nothing has been compacted yet, so the whole history is the
762
+ * window.
763
+ */
764
+ function postCompactionWindow(messages) {
765
+ for (let i = messages.length - 1; i >= 0; i--) {
766
+ const message = messages[i];
767
+ if (message?.role === 'system' && isCompactionMessage(message.content)) {
768
+ return messages.slice(i + 1);
769
+ }
770
+ }
771
+ return messages;
772
+ }
773
+ /**
774
+ * Lower-cased argument (property) names of a tool's input schema, copied
775
+ * from `registry/tool/execute.ts`'s identically named private function
776
+ * (used by `searchByAvailability`'s ranking).
777
+ */
778
+ function listArgumentNames(tool) {
779
+ try {
780
+ const json = tool.modelInputSchema ?? renderToolSchema(tool.inputSchema);
781
+ return [...collectSchemaPropertyNames(json)].map((key) => key.toLowerCase());
782
+ }
783
+ catch {
784
+ return [];
785
+ }
786
+ }
787
+ /**
788
+ * Every property name a schema can accept, including ones that only appear
789
+ * inside a branch. Copied from `registry/tool/execute.ts`'s identically
790
+ * named private function.
791
+ */
792
+ function collectSchemaPropertyNames(schema, names = new Set(), seen = new Set()) {
793
+ if (!schema || typeof schema !== 'object' || Array.isArray(schema))
794
+ return names;
795
+ if (seen.has(schema))
796
+ return names;
797
+ seen.add(schema);
798
+ const record = schema;
799
+ const properties = record.properties;
800
+ if (properties && typeof properties === 'object' && !Array.isArray(properties)) {
801
+ for (const name of Object.keys(properties))
802
+ names.add(name);
803
+ }
804
+ for (const keyword of ['anyOf', 'oneOf', 'allOf']) {
805
+ const branches = record[keyword];
806
+ if (!Array.isArray(branches))
807
+ continue;
808
+ for (const branch of branches)
809
+ collectSchemaPropertyNames(branch, names, seen);
810
+ }
811
+ return names;
812
+ }
813
+ /**
814
+ * Build a one-sentence "Required: <field>: <type>, …" validation hint.
815
+ * Copied from `registry/tool/execute.ts`'s identically named private
816
+ * function.
817
+ */
818
+ function describeRequiredInput(schema) {
819
+ try {
820
+ const json = renderToolSchema(schema);
821
+ const required = json.required ?? [];
822
+ if (required.length === 0)
823
+ return 'No required parameters known.';
824
+ const props = json.properties ?? {};
825
+ const lines = required.map((name) => {
826
+ const def = props[name] ?? {};
827
+ const type = def.type ?? 'value';
828
+ const desc = def.description ? ` — ${def.description}` : '';
829
+ return `${name}: ${type}${desc}`;
830
+ });
831
+ return `Required: ${lines.join(', ')}.`;
832
+ }
833
+ catch {
834
+ return 'Could not introspect required parameters.';
835
+ }
836
+ }
837
+ //# sourceMappingURL=manager.js.map