@dexto/core 1.7.2 → 1.8.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 (533) hide show
  1. package/dist/agent/DextoAgent.cjs +157 -62
  2. package/dist/agent/DextoAgent.d.ts +71 -17
  3. package/dist/agent/DextoAgent.d.ts.map +1 -1
  4. package/dist/agent/DextoAgent.js +161 -63
  5. package/dist/agent/agent-options.d.ts +6 -10
  6. package/dist/agent/agent-options.d.ts.map +1 -1
  7. package/dist/agent/agentCard.js +1 -1
  8. package/dist/agent/error-codes.js +1 -1
  9. package/dist/agent/errors.js +1 -1
  10. package/dist/agent/index.d.ts +1 -0
  11. package/dist/agent/index.d.ts.map +1 -1
  12. package/dist/agent/index.js +1 -1
  13. package/dist/agent/schemas.d.ts +2 -2
  14. package/dist/agent/schemas.js +1 -1
  15. package/dist/agent/state-manager.js +1 -1
  16. package/dist/approval/error-codes.cjs +1 -1
  17. package/dist/approval/error-codes.d.ts +1 -1
  18. package/dist/approval/error-codes.d.ts.map +1 -1
  19. package/dist/approval/error-codes.js +2 -2
  20. package/dist/approval/errors.cjs +2 -5
  21. package/dist/approval/errors.d.ts.map +1 -1
  22. package/dist/approval/errors.js +3 -6
  23. package/dist/approval/factory.cjs +19 -4
  24. package/dist/approval/factory.d.ts +4 -1
  25. package/dist/approval/factory.d.ts.map +1 -1
  26. package/dist/approval/factory.js +19 -5
  27. package/dist/approval/index.d.ts +1 -1
  28. package/dist/approval/index.d.ts.map +1 -1
  29. package/dist/approval/index.js +1 -1
  30. package/dist/approval/manager.cjs +168 -26
  31. package/dist/approval/manager.d.ts +46 -12
  32. package/dist/approval/manager.d.ts.map +1 -1
  33. package/dist/approval/manager.js +177 -29
  34. package/dist/approval/schemas.cjs +26 -26
  35. package/dist/approval/schemas.d.ts +29 -29
  36. package/dist/approval/schemas.d.ts.map +1 -1
  37. package/dist/approval/schemas.js +23 -23
  38. package/dist/approval/types.cjs +5 -5
  39. package/dist/approval/types.d.ts +18 -18
  40. package/dist/approval/types.d.ts.map +1 -1
  41. package/dist/approval/types.js +6 -6
  42. package/dist/{chunk-PTJYTZNU.js → chunk-C6A6W6XS.js} +1 -44
  43. package/dist/config/index.cjs +75 -0
  44. package/dist/config/index.d.ts +15 -0
  45. package/dist/config/index.d.ts.map +1 -0
  46. package/dist/config/index.js +50 -0
  47. package/dist/context/compaction/overflow.js +1 -1
  48. package/dist/context/compaction/strategies/noop.js +1 -1
  49. package/dist/context/compaction/strategies/reactive-overflow-compaction.js +1 -1
  50. package/dist/context/content-clone.cjs +131 -0
  51. package/dist/context/content-clone.d.ts +7 -0
  52. package/dist/context/content-clone.d.ts.map +1 -0
  53. package/dist/context/content-clone.js +104 -0
  54. package/dist/context/error-codes.js +1 -1
  55. package/dist/context/errors.js +1 -1
  56. package/dist/context/index.cjs +2 -0
  57. package/dist/context/index.d.ts +1 -0
  58. package/dist/context/index.d.ts.map +1 -1
  59. package/dist/context/index.js +2 -1
  60. package/dist/context/manager.cjs +44 -33
  61. package/dist/context/manager.d.ts +7 -7
  62. package/dist/context/manager.d.ts.map +1 -1
  63. package/dist/context/manager.js +45 -34
  64. package/dist/context/media-helpers.js +1 -1
  65. package/dist/context/schemas.cjs +77 -0
  66. package/dist/context/schemas.d.ts +5 -0
  67. package/dist/context/schemas.d.ts.map +1 -0
  68. package/dist/context/schemas.js +53 -0
  69. package/dist/context/types.js +1 -1
  70. package/dist/context/utils.cjs +70 -69
  71. package/dist/context/utils.d.ts +3 -3
  72. package/dist/context/utils.d.ts.map +1 -1
  73. package/dist/context/utils.js +71 -70
  74. package/dist/errors/DextoBaseError.js +1 -1
  75. package/dist/errors/DextoRuntimeError.js +1 -1
  76. package/dist/errors/DextoValidationError.js +1 -1
  77. package/dist/errors/index.js +1 -1
  78. package/dist/errors/result-bridge.js +1 -1
  79. package/dist/errors/types.js +1 -1
  80. package/dist/events/index.cjs +9 -1
  81. package/dist/events/index.d.ts +20 -8
  82. package/dist/events/index.d.ts.map +1 -1
  83. package/dist/events/index.js +10 -2
  84. package/dist/hooks/builtins/content-policy.js +1 -1
  85. package/dist/hooks/builtins/response-sanitizer.js +1 -1
  86. package/dist/hooks/error-codes.js +1 -1
  87. package/dist/hooks/index.js +1 -1
  88. package/dist/hooks/manager.cjs +1 -1
  89. package/dist/hooks/manager.d.ts +2 -2
  90. package/dist/hooks/manager.d.ts.map +1 -1
  91. package/dist/hooks/manager.js +2 -2
  92. package/dist/hooks/types.d.ts +2 -2
  93. package/dist/hooks/types.d.ts.map +1 -1
  94. package/dist/index.browser.js +1 -1
  95. package/dist/index.cjs +2 -0
  96. package/dist/index.d.ts +1 -0
  97. package/dist/index.d.ts.map +1 -1
  98. package/dist/index.js +2 -1
  99. package/dist/llm/curation-config.js +1 -1
  100. package/dist/llm/curation.js +1 -1
  101. package/dist/llm/error-codes.js +1 -1
  102. package/dist/llm/errors.js +1 -1
  103. package/dist/llm/executor/index.cjs +32 -0
  104. package/dist/llm/executor/index.d.ts +2 -0
  105. package/dist/llm/executor/index.d.ts.map +1 -0
  106. package/dist/llm/executor/index.js +11 -0
  107. package/dist/llm/executor/provider-options.js +1 -1
  108. package/dist/llm/executor/stream-processor.cjs +28 -139
  109. package/dist/llm/executor/stream-processor.d.ts +2 -13
  110. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  111. package/dist/llm/executor/stream-processor.js +29 -140
  112. package/dist/{session/history/memory.cjs → llm/executor/tool-definitions.cjs} +21 -33
  113. package/dist/llm/executor/tool-definitions.d.ts +4 -0
  114. package/dist/llm/executor/tool-definitions.d.ts.map +1 -0
  115. package/dist/llm/executor/tool-definitions.js +22 -0
  116. package/dist/llm/executor/tool-output-truncator.js +1 -1
  117. package/dist/llm/executor/turn-executor.cjs +1093 -458
  118. package/dist/llm/executor/turn-executor.d.ts +269 -43
  119. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  120. package/dist/llm/executor/turn-executor.js +1079 -405
  121. package/dist/llm/executor/types.d.ts +6 -0
  122. package/dist/llm/executor/types.d.ts.map +1 -1
  123. package/dist/llm/formatters/vercel.js +1 -1
  124. package/dist/llm/index.cjs +2 -0
  125. package/dist/llm/index.d.ts +1 -0
  126. package/dist/llm/index.d.ts.map +1 -1
  127. package/dist/llm/index.js +2 -1
  128. package/dist/llm/providers/codex-app-server.cjs +22 -2
  129. package/dist/llm/providers/codex-app-server.d.ts.map +1 -1
  130. package/dist/llm/providers/codex-app-server.js +23 -3
  131. package/dist/llm/providers/codex-base-url.js +1 -1
  132. package/dist/llm/providers/local/ai-sdk-adapter.js +1 -1
  133. package/dist/llm/providers/local/downloader.js +1 -1
  134. package/dist/llm/providers/local/error-codes.js +1 -1
  135. package/dist/llm/providers/local/errors.js +1 -1
  136. package/dist/llm/providers/local/gpu-detector.js +1 -1
  137. package/dist/llm/providers/local/index.js +1 -1
  138. package/dist/llm/providers/local/node-llama-provider.js +1 -1
  139. package/dist/llm/providers/local/ollama-provider.js +1 -1
  140. package/dist/llm/providers/local/registry.js +1 -1
  141. package/dist/llm/providers/local/schemas.js +1 -1
  142. package/dist/llm/providers/openrouter-model-registry.js +1 -1
  143. package/dist/llm/reasoning/anthropic-betas.js +1 -1
  144. package/dist/llm/reasoning/anthropic-thinking.js +1 -1
  145. package/dist/llm/reasoning/openai-reasoning-effort.js +1 -1
  146. package/dist/llm/reasoning/profile.js +1 -1
  147. package/dist/llm/reasoning/profiles/anthropic.js +1 -1
  148. package/dist/llm/reasoning/profiles/bedrock.js +1 -1
  149. package/dist/llm/reasoning/profiles/google.js +1 -1
  150. package/dist/llm/reasoning/profiles/openai-compatible.js +1 -1
  151. package/dist/llm/reasoning/profiles/openai.js +1 -1
  152. package/dist/llm/reasoning/profiles/openrouter.js +1 -1
  153. package/dist/llm/reasoning/profiles/shared.js +1 -1
  154. package/dist/llm/reasoning/profiles/vertex.js +1 -1
  155. package/dist/llm/registry/auto-update.js +1 -1
  156. package/dist/llm/registry/index.js +1 -1
  157. package/dist/llm/registry/models.generated.js +1 -1
  158. package/dist/llm/registry/models.manual.js +1 -1
  159. package/dist/llm/registry/sync.js +1 -1
  160. package/dist/llm/resolver.js +1 -1
  161. package/dist/llm/schemas.js +1 -1
  162. package/dist/llm/services/factory.cjs +5 -4
  163. package/dist/llm/services/factory.d.ts +3 -3
  164. package/dist/llm/services/factory.d.ts.map +1 -1
  165. package/dist/llm/services/factory.js +6 -5
  166. package/dist/llm/services/types.d.ts +10 -1
  167. package/dist/llm/services/types.d.ts.map +1 -1
  168. package/dist/llm/services/vercel.cjs +23 -8
  169. package/dist/llm/services/vercel.d.ts +11 -7
  170. package/dist/llm/services/vercel.d.ts.map +1 -1
  171. package/dist/llm/services/vercel.js +24 -9
  172. package/dist/llm/types.js +1 -1
  173. package/dist/llm/usage-metadata.cjs +20 -3
  174. package/dist/llm/usage-metadata.d.ts +1 -0
  175. package/dist/llm/usage-metadata.d.ts.map +1 -1
  176. package/dist/llm/usage-metadata.js +19 -3
  177. package/dist/llm/usage-scope.js +1 -1
  178. package/dist/llm/usage-summary.js +1 -1
  179. package/dist/llm/validation.js +1 -1
  180. package/dist/logger/browser.js +1 -1
  181. package/dist/logger/default-logger-factory.js +1 -1
  182. package/dist/logger/factory.js +1 -1
  183. package/dist/logger/index.js +1 -1
  184. package/dist/logger/logger.js +1 -1
  185. package/dist/logger/v2/dexto-logger.js +1 -1
  186. package/dist/logger/v2/error-codes.js +1 -1
  187. package/dist/logger/v2/errors.js +1 -1
  188. package/dist/logger/v2/schemas.js +1 -1
  189. package/dist/logger/v2/test-utils.js +1 -1
  190. package/dist/logger/v2/transport-factory.js +1 -1
  191. package/dist/logger/v2/transports/console-transport.js +1 -1
  192. package/dist/logger/v2/transports/file-transport.js +1 -1
  193. package/dist/logger/v2/transports/silent-transport.js +1 -1
  194. package/dist/logger/v2/types.js +1 -1
  195. package/dist/mcp/bundled-config.js +1 -1
  196. package/dist/mcp/error-codes.js +1 -1
  197. package/dist/mcp/errors.js +1 -1
  198. package/dist/mcp/index.js +1 -1
  199. package/dist/mcp/manager.js +1 -1
  200. package/dist/mcp/mcp-client.js +1 -1
  201. package/dist/mcp/resolver.js +1 -1
  202. package/dist/mcp/schemas.js +1 -1
  203. package/dist/memory/error-codes.js +1 -1
  204. package/dist/memory/errors.js +1 -1
  205. package/dist/memory/index.js +1 -1
  206. package/dist/memory/manager.cjs +7 -27
  207. package/dist/memory/manager.d.ts +4 -12
  208. package/dist/memory/manager.d.ts.map +1 -1
  209. package/dist/memory/manager.js +8 -28
  210. package/dist/memory/schemas.js +1 -1
  211. package/dist/prompts/error-codes.js +1 -1
  212. package/dist/prompts/errors.js +1 -1
  213. package/dist/prompts/index.js +1 -1
  214. package/dist/prompts/name-validation.js +1 -1
  215. package/dist/prompts/prompt-manager.cjs +9 -38
  216. package/dist/prompts/prompt-manager.d.ts +2 -10
  217. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  218. package/dist/prompts/prompt-manager.js +10 -39
  219. package/dist/prompts/providers/config-prompt-provider.cjs +8 -87
  220. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  221. package/dist/prompts/providers/config-prompt-provider.js +9 -88
  222. package/dist/prompts/providers/custom-prompt-provider.cjs +21 -22
  223. package/dist/prompts/providers/custom-prompt-provider.d.ts +19 -4
  224. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  225. package/dist/prompts/providers/custom-prompt-provider.js +22 -23
  226. package/dist/prompts/providers/mcp-prompt-provider.js +1 -1
  227. package/dist/prompts/schemas.cjs +2 -24
  228. package/dist/prompts/schemas.d.ts +0 -52
  229. package/dist/prompts/schemas.d.ts.map +1 -1
  230. package/dist/prompts/schemas.js +3 -25
  231. package/dist/prompts/types.d.ts +5 -32
  232. package/dist/prompts/types.d.ts.map +1 -1
  233. package/dist/prompts/utils.js +1 -1
  234. package/dist/resources/agent-resources-provider.js +1 -1
  235. package/dist/resources/error-codes.js +1 -1
  236. package/dist/resources/errors.js +1 -1
  237. package/dist/resources/handlers/blob-handler.cjs +14 -11
  238. package/dist/resources/handlers/blob-handler.d.ts +4 -4
  239. package/dist/resources/handlers/blob-handler.d.ts.map +1 -1
  240. package/dist/resources/handlers/blob-handler.js +15 -12
  241. package/dist/resources/handlers/factory.cjs +3 -3
  242. package/dist/resources/handlers/factory.js +4 -4
  243. package/dist/resources/handlers/filesystem-handler.js +1 -1
  244. package/dist/resources/handlers/types.d.ts +2 -2
  245. package/dist/resources/handlers/types.d.ts.map +1 -1
  246. package/dist/resources/index.js +1 -1
  247. package/dist/resources/manager.cjs +10 -7
  248. package/dist/resources/manager.d.ts +4 -4
  249. package/dist/resources/manager.d.ts.map +1 -1
  250. package/dist/resources/manager.js +11 -8
  251. package/dist/resources/reference-parser.js +1 -1
  252. package/dist/resources/schemas.cjs +1 -1
  253. package/dist/resources/schemas.d.ts +2 -2
  254. package/dist/resources/schemas.js +2 -2
  255. package/dist/runtime/host-runtime.js +1 -1
  256. package/dist/runtime/index.cjs +3 -0
  257. package/dist/runtime/index.d.ts +2 -0
  258. package/dist/runtime/index.d.ts.map +1 -1
  259. package/dist/runtime/index.js +3 -1
  260. package/dist/runtime/run-context.js +1 -1
  261. package/dist/search/index.js +1 -1
  262. package/dist/search/search-service.cjs +6 -13
  263. package/dist/search/search-service.d.ts +5 -3
  264. package/dist/search/search-service.d.ts.map +1 -1
  265. package/dist/search/search-service.js +7 -14
  266. package/dist/session/chat-session.cjs +264 -108
  267. package/dist/session/chat-session.d.ts +75 -21
  268. package/dist/session/chat-session.d.ts.map +1 -1
  269. package/dist/session/chat-session.js +268 -108
  270. package/dist/session/error-codes.js +1 -1
  271. package/dist/session/errors.js +1 -1
  272. package/dist/session/index.cjs +19 -2
  273. package/dist/session/index.d.ts +4 -3
  274. package/dist/session/index.d.ts.map +1 -1
  275. package/dist/session/index.js +19 -3
  276. package/dist/session/message-queue.cjs +82 -51
  277. package/dist/session/message-queue.d.ts +13 -8
  278. package/dist/session/message-queue.d.ts.map +1 -1
  279. package/dist/session/message-queue.js +83 -52
  280. package/dist/session/queue-clone.cjs +50 -0
  281. package/dist/session/queue-clone.d.ts +5 -0
  282. package/dist/session/queue-clone.d.ts.map +1 -0
  283. package/dist/session/queue-clone.js +25 -0
  284. package/dist/session/schemas.cjs +74 -2
  285. package/dist/session/schemas.d.ts +94 -0
  286. package/dist/session/schemas.d.ts.map +1 -1
  287. package/dist/session/schemas.js +69 -2
  288. package/dist/session/session-manager.cjs +107 -123
  289. package/dist/session/session-manager.d.ts +7 -6
  290. package/dist/session/session-manager.d.ts.map +1 -1
  291. package/dist/session/session-manager.js +108 -124
  292. package/dist/session/title-generator.cjs +14 -26
  293. package/dist/session/title-generator.d.ts +4 -6
  294. package/dist/session/title-generator.d.ts.map +1 -1
  295. package/dist/session/title-generator.js +16 -28
  296. package/dist/session/types.cjs +28 -0
  297. package/dist/session/types.d.ts +5 -1
  298. package/dist/session/types.d.ts.map +1 -1
  299. package/dist/session/types.js +19 -0
  300. package/dist/{session/history/factory.cjs → skills/index.cjs} +9 -9
  301. package/dist/skills/index.d.ts +4 -0
  302. package/dist/skills/index.d.ts.map +1 -0
  303. package/dist/skills/index.js +7 -0
  304. package/dist/skills/skill-manager.cjs +76 -0
  305. package/dist/skills/skill-manager.d.ts +13 -0
  306. package/dist/skills/skill-manager.d.ts.map +1 -0
  307. package/dist/skills/skill-manager.js +53 -0
  308. package/dist/skills/types.d.ts +24 -0
  309. package/dist/skills/types.d.ts.map +1 -0
  310. package/dist/skills/workspace-skill-source.cjs +120 -0
  311. package/dist/skills/workspace-skill-source.d.ts +16 -0
  312. package/dist/skills/workspace-skill-source.d.ts.map +1 -0
  313. package/dist/skills/workspace-skill-source.js +97 -0
  314. package/dist/storage/approvals/types.cjs +38 -0
  315. package/dist/storage/approvals/types.d.ts +54 -0
  316. package/dist/storage/approvals/types.d.ts.map +1 -0
  317. package/dist/storage/approvals/types.js +14 -0
  318. package/dist/storage/artifacts/types.d.ts +73 -0
  319. package/dist/storage/artifacts/types.d.ts.map +1 -0
  320. package/dist/storage/conversation/database.cjs +233 -0
  321. package/dist/storage/conversation/database.d.ts +38 -0
  322. package/dist/storage/conversation/database.d.ts.map +1 -0
  323. package/dist/storage/conversation/database.js +210 -0
  324. package/dist/storage/conversation/types.cjs +16 -0
  325. package/dist/storage/conversation/types.d.ts +21 -0
  326. package/dist/storage/conversation/types.d.ts.map +1 -0
  327. package/dist/storage/conversation/types.js +0 -0
  328. package/dist/storage/database/types.d.ts +4 -0
  329. package/dist/storage/database/types.d.ts.map +1 -1
  330. package/dist/storage/error-codes.js +1 -1
  331. package/dist/storage/errors.cjs +6 -6
  332. package/dist/storage/errors.d.ts +2 -2
  333. package/dist/storage/errors.js +7 -7
  334. package/dist/storage/index.cjs +42 -5
  335. package/dist/storage/index.d.ts +19 -8
  336. package/dist/storage/index.d.ts.map +1 -1
  337. package/dist/storage/index.js +39 -4
  338. package/dist/storage/memories/types.cjs +16 -0
  339. package/dist/storage/memories/types.d.ts +17 -0
  340. package/dist/storage/memories/types.d.ts.map +1 -0
  341. package/dist/storage/memories/types.js +0 -0
  342. package/dist/storage/message-queue/types.cjs +16 -0
  343. package/dist/storage/message-queue/types.d.ts +15 -0
  344. package/dist/storage/message-queue/types.d.ts.map +1 -0
  345. package/dist/storage/message-queue/types.js +0 -0
  346. package/dist/storage/prompts/types.cjs +16 -0
  347. package/dist/storage/prompts/types.d.ts +14 -0
  348. package/dist/storage/prompts/types.d.ts.map +1 -0
  349. package/dist/storage/prompts/types.js +0 -0
  350. package/dist/storage/runtime-events/types.cjs +16 -0
  351. package/dist/storage/runtime-events/types.d.ts +19 -0
  352. package/dist/storage/runtime-events/types.d.ts.map +1 -0
  353. package/dist/storage/runtime-events/types.js +0 -0
  354. package/dist/storage/sessions/types.cjs +16 -0
  355. package/dist/storage/sessions/types.d.ts +19 -0
  356. package/dist/storage/sessions/types.d.ts.map +1 -0
  357. package/dist/storage/sessions/types.js +0 -0
  358. package/dist/storage/stores/backend.cjs +702 -0
  359. package/dist/storage/stores/backend.d.ts +303 -0
  360. package/dist/storage/stores/backend.d.ts.map +1 -0
  361. package/dist/storage/stores/backend.js +677 -0
  362. package/dist/storage/stores/in-memory.cjs +510 -0
  363. package/dist/storage/stores/in-memory.d.ts +11 -0
  364. package/dist/storage/stores/in-memory.d.ts.map +1 -0
  365. package/dist/storage/stores/in-memory.js +487 -0
  366. package/dist/storage/stores/types.cjs +16 -0
  367. package/dist/storage/stores/types.d.ts +36 -0
  368. package/dist/storage/stores/types.d.ts.map +1 -0
  369. package/dist/storage/stores/types.js +0 -0
  370. package/dist/storage/tool-executions/types.cjs +127 -0
  371. package/dist/storage/tool-executions/types.d.ts +193 -0
  372. package/dist/storage/tool-executions/types.d.ts.map +1 -0
  373. package/dist/storage/tool-executions/types.js +96 -0
  374. package/dist/storage/tool-preferences/types.cjs +16 -0
  375. package/dist/storage/tool-preferences/types.d.ts +29 -0
  376. package/dist/storage/tool-preferences/types.d.ts.map +1 -0
  377. package/dist/storage/tool-preferences/types.js +0 -0
  378. package/dist/storage/tool-state/types.cjs +16 -0
  379. package/dist/storage/tool-state/types.d.ts +20 -0
  380. package/dist/storage/tool-state/types.d.ts.map +1 -0
  381. package/dist/storage/tool-state/types.js +0 -0
  382. package/dist/storage/workspaces/types.cjs +16 -0
  383. package/dist/storage/workspaces/types.d.ts +19 -0
  384. package/dist/storage/workspaces/types.d.ts.map +1 -0
  385. package/dist/storage/workspaces/types.js +0 -0
  386. package/dist/systemPrompt/contributors.cjs +10 -14
  387. package/dist/systemPrompt/contributors.d.ts +3 -3
  388. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  389. package/dist/systemPrompt/contributors.js +11 -15
  390. package/dist/systemPrompt/error-codes.js +1 -1
  391. package/dist/systemPrompt/errors.js +1 -1
  392. package/dist/systemPrompt/in-built-prompts.js +1 -1
  393. package/dist/systemPrompt/index.js +1 -1
  394. package/dist/systemPrompt/manager.js +1 -1
  395. package/dist/systemPrompt/registry.js +1 -1
  396. package/dist/systemPrompt/schemas.js +1 -1
  397. package/dist/telemetry/decorators.js +1 -1
  398. package/dist/telemetry/error-codes.js +1 -1
  399. package/dist/telemetry/errors.js +1 -1
  400. package/dist/telemetry/exporters.js +1 -1
  401. package/dist/telemetry/index.js +1 -1
  402. package/dist/telemetry/schemas.js +1 -1
  403. package/dist/telemetry/telemetry.js +1 -1
  404. package/dist/telemetry/utils.js +1 -1
  405. package/dist/test-utils/in-memory-storage.cjs +9 -17
  406. package/dist/test-utils/in-memory-storage.js +9 -16
  407. package/dist/test-utils/session-state-stores.cjs +21 -24
  408. package/dist/test-utils/session-state-stores.js +22 -24
  409. package/dist/tools/{confirmation → approval}/allowed-tools-provider/factory.cjs +1 -1
  410. package/dist/tools/{confirmation → approval}/allowed-tools-provider/factory.d.ts +2 -2
  411. package/dist/tools/approval/allowed-tools-provider/factory.d.ts.map +1 -0
  412. package/dist/tools/{confirmation → approval}/allowed-tools-provider/factory.js +2 -2
  413. package/dist/tools/approval/allowed-tools-provider/in-memory.d.ts.map +1 -0
  414. package/dist/tools/{confirmation → approval}/allowed-tools-provider/in-memory.js +1 -1
  415. package/dist/tools/approval/allowed-tools-provider/storage.cjs +66 -0
  416. package/dist/tools/{confirmation → approval}/allowed-tools-provider/storage.d.ts +4 -10
  417. package/dist/tools/approval/allowed-tools-provider/storage.d.ts.map +1 -0
  418. package/dist/tools/approval/allowed-tools-provider/storage.js +43 -0
  419. package/dist/tools/approval/allowed-tools-provider/types.cjs +16 -0
  420. package/dist/tools/approval/allowed-tools-provider/types.d.ts.map +1 -0
  421. package/dist/tools/approval/allowed-tools-provider/types.js +0 -0
  422. package/dist/tools/approval/session-tool-policy.cjs +269 -0
  423. package/dist/tools/approval/session-tool-policy.d.ts +43 -0
  424. package/dist/tools/approval/session-tool-policy.d.ts.map +1 -0
  425. package/dist/tools/approval/session-tool-policy.js +245 -0
  426. package/dist/tools/define-tool.js +1 -1
  427. package/dist/tools/display-types.js +1 -1
  428. package/dist/tools/error-codes.cjs +3 -3
  429. package/dist/tools/error-codes.d.ts +4 -4
  430. package/dist/tools/error-codes.d.ts.map +1 -1
  431. package/dist/tools/error-codes.js +4 -4
  432. package/dist/tools/errors.cjs +12 -12
  433. package/dist/tools/errors.d.ts +6 -6
  434. package/dist/tools/errors.d.ts.map +1 -1
  435. package/dist/tools/errors.js +13 -13
  436. package/dist/tools/index.cjs +3 -0
  437. package/dist/tools/index.d.ts +3 -0
  438. package/dist/tools/index.d.ts.map +1 -1
  439. package/dist/tools/index.js +3 -1
  440. package/dist/tools/pattern-utils.js +1 -1
  441. package/dist/tools/presentation/tool-presentation.cjs +182 -0
  442. package/dist/tools/presentation/tool-presentation.d.ts +51 -0
  443. package/dist/tools/presentation/tool-presentation.d.ts.map +1 -0
  444. package/dist/tools/presentation/tool-presentation.js +159 -0
  445. package/dist/tools/presentation.js +1 -1
  446. package/dist/tools/schemas.cjs +5 -10
  447. package/dist/tools/schemas.d.ts +1 -4
  448. package/dist/tools/schemas.d.ts.map +1 -1
  449. package/dist/tools/schemas.js +6 -11
  450. package/dist/tools/session-tool-preferences-store.cjs +12 -28
  451. package/dist/tools/session-tool-preferences-store.d.ts +4 -7
  452. package/dist/tools/session-tool-preferences-store.d.ts.map +1 -1
  453. package/dist/tools/session-tool-preferences-store.js +12 -29
  454. package/dist/tools/tool-call-metadata.js +1 -1
  455. package/dist/tools/tool-manager.cjs +871 -834
  456. package/dist/tools/tool-manager.d.ts +94 -96
  457. package/dist/tools/tool-manager.d.ts.map +1 -1
  458. package/dist/tools/tool-manager.js +876 -833
  459. package/dist/tools/types.d.ts +10 -14
  460. package/dist/tools/types.d.ts.map +1 -1
  461. package/dist/utils/api-key-resolver.js +1 -1
  462. package/dist/utils/async-context.js +1 -1
  463. package/dist/utils/debug.js +1 -1
  464. package/dist/utils/defer.js +1 -1
  465. package/dist/utils/env.js +1 -1
  466. package/dist/utils/error-conversion.js +1 -1
  467. package/dist/utils/execution-context.js +1 -1
  468. package/dist/utils/fs-walk.js +1 -1
  469. package/dist/utils/path.js +1 -1
  470. package/dist/utils/redactor.js +1 -1
  471. package/dist/utils/result.js +1 -1
  472. package/dist/utils/safe-stringify.js +1 -1
  473. package/dist/utils/schema.js +1 -1
  474. package/dist/utils/service-initializer.cjs +37 -33
  475. package/dist/utils/service-initializer.d.ts +9 -5
  476. package/dist/utils/service-initializer.d.ts.map +1 -1
  477. package/dist/utils/service-initializer.js +38 -34
  478. package/dist/utils/zod-schema-converter.js +1 -1
  479. package/dist/workspace/error-codes.cjs +5 -1
  480. package/dist/workspace/error-codes.d.ts +4 -0
  481. package/dist/workspace/error-codes.d.ts.map +1 -1
  482. package/dist/workspace/error-codes.js +6 -2
  483. package/dist/workspace/errors.cjs +43 -0
  484. package/dist/workspace/errors.d.ts +9 -0
  485. package/dist/workspace/errors.d.ts.map +1 -1
  486. package/dist/workspace/errors.js +44 -1
  487. package/dist/workspace/index.d.ts +1 -1
  488. package/dist/workspace/index.d.ts.map +1 -1
  489. package/dist/workspace/index.js +1 -1
  490. package/dist/workspace/manager.cjs +21 -29
  491. package/dist/workspace/manager.d.ts +6 -6
  492. package/dist/workspace/manager.d.ts.map +1 -1
  493. package/dist/workspace/manager.js +22 -30
  494. package/dist/workspace/types.d.ts +47 -0
  495. package/dist/workspace/types.d.ts.map +1 -1
  496. package/package.json +114 -2
  497. package/dist/approval/session-approval-store.cjs +0 -91
  498. package/dist/approval/session-approval-store.d.ts +0 -37
  499. package/dist/approval/session-approval-store.d.ts.map +0 -1
  500. package/dist/approval/session-approval-store.js +0 -68
  501. package/dist/session/history/database.cjs +0 -232
  502. package/dist/session/history/database.d.ts +0 -41
  503. package/dist/session/history/database.d.ts.map +0 -1
  504. package/dist/session/history/database.js +0 -209
  505. package/dist/session/history/factory.d.ts +0 -11
  506. package/dist/session/history/factory.d.ts.map +0 -1
  507. package/dist/session/history/factory.js +0 -8
  508. package/dist/session/history/memory.d.ts +0 -22
  509. package/dist/session/history/memory.d.ts.map +0 -1
  510. package/dist/session/history/memory.js +0 -34
  511. package/dist/session/history/types.d.ts +0 -26
  512. package/dist/session/history/types.d.ts.map +0 -1
  513. package/dist/session/message-queue-store.cjs +0 -75
  514. package/dist/session/message-queue-store.d.ts +0 -16
  515. package/dist/session/message-queue-store.d.ts.map +0 -1
  516. package/dist/session/message-queue-store.js +0 -52
  517. package/dist/storage/storage-manager.cjs +0 -209
  518. package/dist/storage/storage-manager.d.ts +0 -77
  519. package/dist/storage/storage-manager.d.ts.map +0 -1
  520. package/dist/storage/storage-manager.js +0 -186
  521. package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts.map +0 -1
  522. package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts.map +0 -1
  523. package/dist/tools/confirmation/allowed-tools-provider/storage.cjs +0 -69
  524. package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts.map +0 -1
  525. package/dist/tools/confirmation/allowed-tools-provider/storage.js +0 -46
  526. package/dist/tools/confirmation/allowed-tools-provider/types.d.ts.map +0 -1
  527. /package/dist/{session/history → skills}/types.cjs +0 -0
  528. /package/dist/{session/history → skills}/types.js +0 -0
  529. /package/dist/{tools/confirmation/allowed-tools-provider → storage/artifacts}/types.cjs +0 -0
  530. /package/dist/{tools/confirmation/allowed-tools-provider → storage/artifacts}/types.js +0 -0
  531. /package/dist/tools/{confirmation → approval}/allowed-tools-provider/in-memory.cjs +0 -0
  532. /package/dist/tools/{confirmation → approval}/allowed-tools-provider/in-memory.d.ts +0 -0
  533. /package/dist/tools/{confirmation → approval}/allowed-tools-provider/types.d.ts +0 -0
@@ -66,23 +66,31 @@ __export(tool_manager_exports, {
66
66
  ToolManager: () => ToolManager
67
67
  });
68
68
  module.exports = __toCommonJS(tool_manager_exports);
69
+ var import_node_util = require("node:util");
69
70
  var import_errors = require("./errors.js");
70
- var import_error_codes = require("./error-codes.js");
71
71
  var import_errors2 = require("../errors/index.js");
72
72
  var import_types2 = require("../logger/v2/types.js");
73
73
  var import_schema = require("../utils/schema.js");
74
74
  var import_types3 = require("../approval/types.js");
75
+ var import_schemas = require("../approval/schemas.js");
76
+ var import_session_tool_policy = require("./approval/session-tool-policy.js");
77
+ var import_tool_presentation = require("./presentation/tool-presentation.js");
75
78
  var import_decorators = require("../telemetry/decorators.js");
79
+ var import_types4 = require("../storage/tool-executions/types.js");
76
80
  var import_tool_call_metadata = require("./tool-call-metadata.js");
77
81
  var import_env = require("../utils/env.js");
78
82
  var _ToolManager_decorators, _init;
83
+ function isRecord(value) {
84
+ return typeof value === "object" && value !== null && !Array.isArray(value);
85
+ }
79
86
  _ToolManager_decorators = [(0, import_decorators.InstrumentClass)({
80
87
  prefix: "tool",
81
88
  excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
82
89
  })];
83
90
  let _ToolManager = class _ToolManager {
84
- constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger, sessionToolPreferencesStore) {
91
+ constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger, sessionToolPreferencesStore, toolExecutionStore) {
85
92
  this.sessionToolPreferencesStore = sessionToolPreferencesStore;
93
+ this.toolExecutionStore = toolExecutionStore;
86
94
  this.mcpManager = mcpManager;
87
95
  this.approvalManager = approvalManager;
88
96
  this.allowedToolsProvider = allowedToolsProvider;
@@ -90,6 +98,17 @@ let _ToolManager = class _ToolManager {
90
98
  this.agentEventBus = agentEventBus;
91
99
  this.toolPolicies = toolPolicies;
92
100
  this.logger = logger.createChild(import_types2.DextoLogComponent.TOOLS);
101
+ this.sessionToolPolicy = new import_session_tool_policy.SessionToolPolicy(
102
+ sessionToolPreferencesStore,
103
+ this.logger,
104
+ (pattern) => this.normalizeToolPolicyPattern(pattern)
105
+ );
106
+ this.toolPresentation = new import_tool_presentation.ToolPresentation(
107
+ (toolName) => this.agentTools.get(toolName),
108
+ (toolName, args) => this.validateLocalToolArgs(toolName, args),
109
+ (options) => this.buildToolExecutionContext(options),
110
+ this.logger
111
+ );
93
112
  this.setTools(tools);
94
113
  this.toolExecutionContextFactory = () => {
95
114
  throw import_errors.ToolError.configInvalid(
@@ -124,16 +143,8 @@ let _ToolManager = class _ToolManager {
124
143
  toolsCache = {};
125
144
  cacheValid = false;
126
145
  logger;
127
- // Session-level auto-approve tools for skills
128
- // When a skill with allowedTools is invoked, those tools are auto-approved (skip confirmation)
129
- // This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow
130
- sessionAutoApproveTools = /* @__PURE__ */ new Map();
131
- // Session-level auto-approve tools set by users (UI)
132
- sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
133
- sessionDisabledTools = /* @__PURE__ */ new Map();
134
- restoredSessionPreferences = /* @__PURE__ */ new Set();
135
- sessionPreferenceLocks = /* @__PURE__ */ new Map();
136
- globalDisabledTools = [];
146
+ sessionToolPolicy;
147
+ toolPresentation;
137
148
  cleanupHandlers = /* @__PURE__ */ new Set();
138
149
  cleanupStarted = false;
139
150
  resolveLocalToolIdOrAlias(name) {
@@ -156,76 +167,14 @@ let _ToolManager = class _ToolManager {
156
167
  }
157
168
  return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
158
169
  }
159
- async runWithSessionPreferenceLock(sessionId, fn) {
160
- const previousLock = this.sessionPreferenceLocks.get(sessionId) ?? Promise.resolve();
161
- const currentResult = previousLock.catch(() => {
162
- }).then(() => fn());
163
- const currentLock = currentResult.then(
164
- () => void 0,
165
- () => void 0
166
- );
167
- this.sessionPreferenceLocks.set(sessionId, currentLock);
168
- try {
169
- return await currentResult;
170
- } finally {
171
- if (this.sessionPreferenceLocks.get(sessionId) === currentLock) {
172
- this.sessionPreferenceLocks.delete(sessionId);
173
- }
174
- }
175
- }
176
- applySessionToolPreferences(sessionId, preferences) {
177
- if (preferences.userAutoApproveTools.length > 0) {
178
- this.sessionUserAutoApproveTools.set(sessionId, [...preferences.userAutoApproveTools]);
179
- } else {
180
- this.sessionUserAutoApproveTools.delete(sessionId);
181
- }
182
- if (preferences.disabledTools.length > 0) {
183
- this.sessionDisabledTools.set(sessionId, [...preferences.disabledTools]);
184
- } else {
185
- this.sessionDisabledTools.delete(sessionId);
186
- }
187
- }
188
- getSessionToolPreferencesSnapshot(sessionId) {
189
- return {
190
- userAutoApproveTools: [...this.sessionUserAutoApproveTools.get(sessionId) ?? []],
191
- disabledTools: [...this.sessionDisabledTools.get(sessionId) ?? []]
192
- };
193
- }
194
170
  async restoreSessionState(sessionId) {
195
- if (this.restoredSessionPreferences.has(sessionId)) {
196
- return;
197
- }
198
- await this.runWithSessionPreferenceLock(sessionId, async () => {
199
- if (this.restoredSessionPreferences.has(sessionId)) {
200
- return;
201
- }
202
- const preferences = await this.sessionToolPreferencesStore.load(sessionId);
203
- this.applySessionToolPreferences(sessionId, preferences);
204
- this.restoredSessionPreferences.add(sessionId);
205
- this.logger.debug("Restored persisted session tool preferences", {
206
- sessionId,
207
- autoApproveCount: preferences.userAutoApproveTools.length,
208
- disabledCount: preferences.disabledTools.length
209
- });
210
- });
171
+ await this.sessionToolPolicy.restoreSessionState(sessionId);
211
172
  }
212
173
  evictSessionState(sessionId) {
213
- this.sessionAutoApproveTools.delete(sessionId);
214
- this.sessionUserAutoApproveTools.delete(sessionId);
215
- this.sessionDisabledTools.delete(sessionId);
216
- this.restoredSessionPreferences.delete(sessionId);
174
+ this.sessionToolPolicy.evictSessionState(sessionId);
217
175
  }
218
176
  async deleteSessionState(sessionId) {
219
- await this.runWithSessionPreferenceLock(sessionId, async () => {
220
- this.evictSessionState(sessionId);
221
- await this.sessionToolPreferencesStore.delete(sessionId);
222
- });
223
- }
224
- async persistSessionToolPreferences(sessionId) {
225
- await this.sessionToolPreferencesStore.save(
226
- sessionId,
227
- this.getSessionToolPreferencesSnapshot(sessionId)
228
- );
177
+ await this.sessionToolPolicy.deleteSessionState(sessionId);
229
178
  }
230
179
  /**
231
180
  * Initialize the ToolManager and its components
@@ -328,25 +277,14 @@ let _ToolManager = class _ToolManager {
328
277
  // ============= SESSION AUTO-APPROVE TOOLS =============
329
278
  /**
330
279
  * Set session-level auto-approve tools.
331
- * When set, these tools will skip confirmation prompts for this session.
280
+ * When set, these tools will skip approval prompts for this session.
332
281
  * This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
333
282
  *
334
283
  * @param sessionId The session ID
335
284
  * @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
336
285
  */
337
286
  setSessionAutoApproveTools(sessionId, autoApproveTools) {
338
- if (autoApproveTools.length === 0) {
339
- this.clearSessionAutoApproveTools(sessionId);
340
- return;
341
- }
342
- const normalized = autoApproveTools.map(
343
- (pattern) => this.normalizeToolPolicyPattern(pattern)
344
- );
345
- this.sessionAutoApproveTools.set(sessionId, normalized);
346
- this.logger.info(
347
- `Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
348
- );
349
- this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
287
+ this.sessionToolPolicy.setSessionAutoApproveTools(sessionId, autoApproveTools);
350
288
  }
351
289
  /**
352
290
  * Add session-level auto-approve tools.
@@ -356,64 +294,19 @@ let _ToolManager = class _ToolManager {
356
294
  * @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
357
295
  */
358
296
  addSessionAutoApproveTools(sessionId, autoApproveTools) {
359
- if (autoApproveTools.length === 0) {
360
- return;
361
- }
362
- const normalized = autoApproveTools.map(
363
- (pattern) => this.normalizeToolPolicyPattern(pattern)
364
- );
365
- const existing = this.sessionAutoApproveTools.get(sessionId) ?? [];
366
- const merged = [...existing];
367
- const seen = new Set(existing);
368
- for (const toolName of normalized) {
369
- if (seen.has(toolName)) {
370
- continue;
371
- }
372
- merged.push(toolName);
373
- seen.add(toolName);
374
- }
375
- const actuallyAdded = Math.max(0, merged.length - existing.length);
376
- this.sessionAutoApproveTools.set(sessionId, merged);
377
- this.logger.info(
378
- `Session auto-approve tools updated for '${sessionId}': +${actuallyAdded} tools`
379
- );
380
- this.logger.debug(`Auto-approve tools: ${merged.join(", ")}`);
297
+ this.sessionToolPolicy.addSessionAutoApproveTools(sessionId, autoApproveTools);
381
298
  }
382
299
  /**
383
300
  * Set session-level auto-approve tools chosen by the user.
384
301
  */
385
302
  async setSessionUserAutoApproveTools(sessionId, autoApproveTools) {
386
- await this.restoreSessionState(sessionId);
387
- if (autoApproveTools.length === 0) {
388
- await this.clearSessionUserAutoApproveTools(sessionId);
389
- return;
390
- }
391
- const normalized = autoApproveTools.map(
392
- (pattern) => this.normalizeToolPolicyPattern(pattern)
393
- );
394
- await this.runWithSessionPreferenceLock(sessionId, async () => {
395
- this.sessionUserAutoApproveTools.set(sessionId, normalized);
396
- await this.persistSessionToolPreferences(sessionId);
397
- });
398
- this.logger.info(
399
- `Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
400
- );
401
- this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
303
+ await this.sessionToolPolicy.setSessionUserAutoApproveTools(sessionId, autoApproveTools);
402
304
  }
403
305
  /**
404
306
  * Clear session-level auto-approve tools chosen by the user.
405
307
  */
406
308
  async clearSessionUserAutoApproveTools(sessionId) {
407
- await this.restoreSessionState(sessionId);
408
- let hadAutoApprove = false;
409
- await this.runWithSessionPreferenceLock(sessionId, async () => {
410
- hadAutoApprove = this.sessionUserAutoApproveTools.has(sessionId);
411
- this.sessionUserAutoApproveTools.delete(sessionId);
412
- await this.persistSessionToolPreferences(sessionId);
413
- });
414
- if (hadAutoApprove) {
415
- this.logger.info(`Session user auto-approve tools cleared for '${sessionId}'`);
416
- }
309
+ await this.sessionToolPolicy.clearSessionUserAutoApproveTools(sessionId);
417
310
  }
418
311
  /**
419
312
  * Clear session-level auto-approve tools.
@@ -422,49 +315,30 @@ let _ToolManager = class _ToolManager {
422
315
  * @param sessionId The session ID to clear auto-approve tools for
423
316
  */
424
317
  clearSessionAutoApproveTools(sessionId) {
425
- const hadAutoApprove = this.sessionAutoApproveTools.has(sessionId);
426
- this.sessionAutoApproveTools.delete(sessionId);
427
- if (hadAutoApprove) {
428
- this.logger.info(`Session auto-approve tools cleared for '${sessionId}'`);
429
- }
318
+ this.sessionToolPolicy.clearSessionAutoApproveTools(sessionId);
430
319
  }
431
320
  hasSessionUserAutoApproveTools(sessionId) {
432
- return this.sessionUserAutoApproveTools.has(sessionId);
321
+ return this.sessionToolPolicy.hasSessionUserAutoApproveTools(sessionId);
433
322
  }
434
323
  // ============= ENABLED/DISABLED TOOLS =============
435
324
  /**
436
325
  * Set global disabled tools (agent-level preferences).
437
326
  */
438
327
  setGlobalDisabledTools(toolNames) {
439
- this.globalDisabledTools = [...toolNames];
440
- this.logger.info("Global disabled tools updated", {
441
- count: toolNames.length
442
- });
328
+ this.sessionToolPolicy.setGlobalDisabledTools(toolNames);
443
329
  this.agentEventBus.emit("tools:enabled-updated", {
444
330
  scope: "global",
445
- disabledTools: [...this.globalDisabledTools]
331
+ disabledTools: this.sessionToolPolicy.getGlobalDisabledTools()
446
332
  });
447
333
  }
448
334
  getGlobalDisabledTools() {
449
- return [...this.globalDisabledTools];
335
+ return this.sessionToolPolicy.getGlobalDisabledTools();
450
336
  }
451
337
  /**
452
338
  * Set session-level disabled tools (overrides global list).
453
339
  */
454
340
  async setSessionDisabledTools(sessionId, toolNames) {
455
- await this.restoreSessionState(sessionId);
456
- if (toolNames.length === 0) {
457
- await this.clearSessionDisabledTools(sessionId);
458
- return;
459
- }
460
- await this.runWithSessionPreferenceLock(sessionId, async () => {
461
- this.sessionDisabledTools.set(sessionId, [...toolNames]);
462
- await this.persistSessionToolPreferences(sessionId);
463
- });
464
- this.logger.info("Session disabled tools updated", {
465
- sessionId,
466
- count: toolNames.length
467
- });
341
+ await this.sessionToolPolicy.setSessionDisabledTools(sessionId, toolNames);
468
342
  this.agentEventBus.emit("tools:enabled-updated", {
469
343
  scope: "session",
470
344
  sessionId,
@@ -475,37 +349,19 @@ let _ToolManager = class _ToolManager {
475
349
  * Clear session-level disabled tools.
476
350
  */
477
351
  async clearSessionDisabledTools(sessionId) {
478
- await this.restoreSessionState(sessionId);
479
- let hadOverrides = false;
480
- await this.runWithSessionPreferenceLock(sessionId, async () => {
481
- hadOverrides = this.sessionDisabledTools.has(sessionId);
482
- this.sessionDisabledTools.delete(sessionId);
483
- await this.persistSessionToolPreferences(sessionId);
484
- });
485
- if (hadOverrides) {
486
- this.logger.info("Session disabled tools cleared", { sessionId });
487
- }
352
+ await this.sessionToolPolicy.clearSessionDisabledTools(sessionId);
488
353
  }
489
354
  /**
490
355
  * Get disabled tools for a session (session override wins).
491
356
  */
492
357
  getDisabledTools(sessionId) {
493
- if (sessionId && this.sessionDisabledTools.has(sessionId)) {
494
- return this.sessionDisabledTools.get(sessionId) ?? [];
495
- }
496
- return this.globalDisabledTools;
358
+ return this.sessionToolPolicy.getDisabledTools(sessionId);
497
359
  }
498
360
  /**
499
361
  * Filter a tool set based on disabled tools for a session.
500
362
  */
501
363
  filterToolsForSession(toolSet, sessionId) {
502
- const disabled = new Set(this.getDisabledTools(sessionId));
503
- if (disabled.size === 0) {
504
- return toolSet;
505
- }
506
- return Object.fromEntries(
507
- Object.entries(toolSet).filter(([toolName]) => !disabled.has(toolName))
508
- );
364
+ return this.sessionToolPolicy.filterToolsForSession(toolSet, sessionId);
509
365
  }
510
366
  /**
511
367
  * Check if a session has auto-approve tools set.
@@ -514,7 +370,7 @@ let _ToolManager = class _ToolManager {
514
370
  * @returns true if the session has auto-approve tools
515
371
  */
516
372
  hasSessionAutoApproveTools(sessionId) {
517
- return this.sessionAutoApproveTools.has(sessionId);
373
+ return this.sessionToolPolicy.hasSessionAutoApproveTools(sessionId);
518
374
  }
519
375
  /**
520
376
  * Get the auto-approve tools for a session (skill-provided list).
@@ -523,22 +379,19 @@ let _ToolManager = class _ToolManager {
523
379
  * @returns Array of auto-approve tool names, or undefined if none set
524
380
  */
525
381
  getSessionAutoApproveTools(sessionId) {
526
- return this.sessionAutoApproveTools.get(sessionId);
382
+ return this.sessionToolPolicy.getSessionAutoApproveTools(sessionId);
527
383
  }
528
384
  /**
529
385
  * Get the user auto-approve tools for a session.
530
386
  */
531
387
  getSessionUserAutoApproveTools(sessionId) {
532
- return this.sessionUserAutoApproveTools.get(sessionId);
388
+ return this.sessionToolPolicy.getSessionUserAutoApproveTools(sessionId);
533
389
  }
534
390
  /**
535
391
  * Combined auto-approve list for a session.
536
392
  */
537
393
  getCombinedSessionAutoApproveTools(sessionId) {
538
- return [
539
- ...this.sessionAutoApproveTools.get(sessionId) ?? [],
540
- ...this.sessionUserAutoApproveTools.get(sessionId) ?? []
541
- ];
394
+ return this.sessionToolPolicy.getCombinedSessionAutoApproveTools(sessionId);
542
395
  }
543
396
  /**
544
397
  * Check if a tool should be auto-approved for a session.
@@ -549,11 +402,7 @@ let _ToolManager = class _ToolManager {
549
402
  * @returns true if the tool should be auto-approved
550
403
  */
551
404
  isToolAutoApprovedForSession(sessionId, toolName) {
552
- const autoApproveTools = this.getCombinedSessionAutoApproveTools(sessionId);
553
- if (autoApproveTools.length === 0) {
554
- return false;
555
- }
556
- return autoApproveTools.some((pattern) => this.matchesToolPolicy(toolName, pattern));
405
+ return this.sessionToolPolicy.isToolAutoApprovedForSession(sessionId, toolName);
557
406
  }
558
407
  /**
559
408
  * Invalidate the tools cache when tool sources change
@@ -631,149 +480,6 @@ let _ToolManager = class _ToolManager {
631
480
  const tool = this.agentTools.get(toolName);
632
481
  return tool?.approval?.onGranted;
633
482
  }
634
- getToolPreviewFn(toolName) {
635
- const tool = this.agentTools.get(toolName);
636
- return tool?.presentation?.preview;
637
- }
638
- getToolDescribeHeaderFn(toolName) {
639
- const tool = this.agentTools.get(toolName);
640
- return tool?.presentation?.describeHeader;
641
- }
642
- getToolDescribeArgsFn(toolName) {
643
- const tool = this.agentTools.get(toolName);
644
- return tool?.presentation?.describeArgs;
645
- }
646
- getToolDescribeResultFn(toolName) {
647
- const tool = this.agentTools.get(toolName);
648
- return tool?.presentation?.describeResult;
649
- }
650
- buildGenericToolPresentationSnapshot(toolName) {
651
- const toTitleCase = (name) => name.replace(/[_-]+/g, " ").split(" ").filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
652
- const isMcp = toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX);
653
- const fallbackTitle = (() => {
654
- if (!isMcp) {
655
- return toTitleCase(toolName);
656
- }
657
- const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
658
- const parts = actualToolName.split("--");
659
- const toolPart = parts.length >= 2 ? parts.slice(1).join("--") : actualToolName;
660
- return toTitleCase(toolPart);
661
- })();
662
- const snapshot = {
663
- version: 1,
664
- source: {
665
- type: toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) ? "mcp" : "local"
666
- },
667
- header: {
668
- title: fallbackTitle
669
- }
670
- };
671
- if (snapshot.source?.type === "mcp") {
672
- const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
673
- const parts = actualToolName.split("--");
674
- if (parts.length >= 2 && parts[0]) {
675
- snapshot.source.mcpServerName = parts[0];
676
- }
677
- }
678
- return snapshot;
679
- }
680
- getToolPresentationSnapshotForToolCallEvent(toolName, args, toolCallId, sessionId, runContext) {
681
- const fallback = this.buildGenericToolPresentationSnapshot(toolName);
682
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
683
- return fallback;
684
- }
685
- const describeHeader = this.getToolDescribeHeaderFn(toolName);
686
- const describeArgs = this.getToolDescribeArgsFn(toolName);
687
- if (!describeHeader && !describeArgs) {
688
- return fallback;
689
- }
690
- try {
691
- const validatedArgs = this.validateLocalToolArgs(toolName, args);
692
- const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
693
- const isPromiseLike = (value) => {
694
- if (typeof value !== "object" || value === null) {
695
- return false;
696
- }
697
- return typeof value.then === "function";
698
- };
699
- let nextSnapshot = fallback;
700
- if (describeHeader) {
701
- const header = describeHeader(validatedArgs, context);
702
- if (!isPromiseLike(header) && header) {
703
- nextSnapshot = {
704
- ...nextSnapshot,
705
- header: { ...nextSnapshot.header, ...header }
706
- };
707
- }
708
- }
709
- if (describeArgs) {
710
- const argsPresentation = describeArgs(validatedArgs, context);
711
- if (!isPromiseLike(argsPresentation) && argsPresentation) {
712
- nextSnapshot = {
713
- ...nextSnapshot,
714
- args: argsPresentation
715
- };
716
- }
717
- }
718
- return nextSnapshot;
719
- } catch (error) {
720
- this.logger.debug(
721
- `Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
722
- );
723
- return fallback;
724
- }
725
- }
726
- async getToolPresentationSnapshotForCall(toolName, args, toolCallId, sessionId, runContext) {
727
- const fallback = this.buildGenericToolPresentationSnapshot(toolName);
728
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
729
- return fallback;
730
- }
731
- const describeHeader = this.getToolDescribeHeaderFn(toolName);
732
- const describeArgs = this.getToolDescribeArgsFn(toolName);
733
- if (!describeHeader && !describeArgs) {
734
- return fallback;
735
- }
736
- try {
737
- const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
738
- const describedHeader = describeHeader ? await Promise.resolve(describeHeader(args, context)) : null;
739
- const describedArgs = describeArgs ? await Promise.resolve(describeArgs(args, context)) : null;
740
- return {
741
- ...fallback,
742
- ...describedHeader ? { header: { ...fallback.header, ...describedHeader } } : {},
743
- ...describedArgs ? { args: describedArgs } : {}
744
- };
745
- } catch (error) {
746
- this.logger.debug(
747
- `Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
748
- );
749
- return fallback;
750
- }
751
- }
752
- async augmentSnapshotWithResult(toolName, snapshot, result, args, toolCallId, sessionId, runContext) {
753
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
754
- return snapshot;
755
- }
756
- const describeResult = this.getToolDescribeResultFn(toolName);
757
- if (!describeResult) {
758
- return snapshot;
759
- }
760
- try {
761
- const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
762
- const resultPresentation = await Promise.resolve(describeResult(result, args, context));
763
- if (!resultPresentation) {
764
- return snapshot;
765
- }
766
- return {
767
- ...snapshot,
768
- result: resultPresentation
769
- };
770
- } catch (error) {
771
- this.logger.debug(
772
- `Tool result presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
773
- );
774
- return snapshot;
775
- }
776
- }
777
483
  getToolPatternKey(toolName, args) {
778
484
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
779
485
  return null;
@@ -866,14 +572,9 @@ let _ToolManager = class _ToolManager {
866
572
  if (request.metadata.directoryAccess !== void 0) {
867
573
  return false;
868
574
  }
869
- const args = request.metadata.args;
870
- if (typeof args !== "object" || args === null) {
871
- return false;
872
- }
873
- const argsRecord = args;
874
575
  let patternKey;
875
576
  try {
876
- patternKey = getPatternKey(argsRecord);
577
+ patternKey = getPatternKey(request.metadata.args);
877
578
  } catch (error) {
878
579
  this.logger.debug(
879
580
  `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
@@ -1002,22 +703,52 @@ let _ToolManager = class _ToolManager {
1002
703
  };
1003
704
  return this.toolExecutionContextFactory(baseContext);
1004
705
  }
1005
- resolveToolExecutionInvocation(invocationOrSessionId, legacyAbortSignal) {
1006
- if (typeof invocationOrSessionId === "string") {
1007
- return {
1008
- sessionId: invocationOrSessionId,
1009
- abortSignal: legacyAbortSignal,
1010
- hostRuntime: void 0
1011
- };
706
+ resolveToolExecutionInvocation(invocation) {
707
+ if (typeof invocation !== "object" && invocation !== void 0) {
708
+ throw new TypeError("Tool execution invocation must be an object");
709
+ }
710
+ const options = invocation ?? {};
711
+ const sessionId = options.runContext?.sessionId ?? options.sessionId;
712
+ return { ...options, sessionId, hostRuntime: options.runContext?.hostRuntime };
713
+ }
714
+ resolveToolExecutionIdentity(invocation, toolCallId) {
715
+ if (invocation.executionIdentity !== void 0) {
716
+ return invocation.executionIdentity;
717
+ }
718
+ const ids = invocation.runContext?.hostRuntime?.ids;
719
+ if (!ids) {
720
+ return void 0;
721
+ }
722
+ const runId = ids.runId;
723
+ const turnId = ids.turnId;
724
+ const modelStepId = ids.modelStepId;
725
+ if (runId === void 0 || turnId === void 0 || modelStepId === void 0) {
726
+ return void 0;
1012
727
  }
1013
- const invocation = invocationOrSessionId ?? {};
1014
- const sessionId = invocation.runContext?.sessionId ?? invocation.sessionId;
1015
728
  return {
1016
- ...invocation,
1017
- ...invocation.abortSignal === void 0 && legacyAbortSignal !== void 0 ? { abortSignal: legacyAbortSignal } : {},
1018
- sessionId,
1019
- hostRuntime: invocation.runContext?.hostRuntime
729
+ runId,
730
+ turnId,
731
+ modelStepId,
732
+ toolCallId
733
+ };
734
+ }
735
+ assertToolExecutionRecordMatches(input) {
736
+ const expected = {
737
+ identity: input.identity,
738
+ toolName: input.toolName,
739
+ input: input.toolInput
740
+ };
741
+ const actual = {
742
+ identity: input.record.identity,
743
+ toolName: input.record.toolName,
744
+ input: input.record.input
1020
745
  };
746
+ if (!(0, import_node_util.isDeepStrictEqual)(actual, expected)) {
747
+ throw import_errors.ToolError.executionFailed(
748
+ input.toolName,
749
+ "Tool execution record does not match the current tool call"
750
+ );
751
+ }
1021
752
  }
1022
753
  validateLocalToolArgs(toolName, args) {
1023
754
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
@@ -1147,205 +878,782 @@ let _ToolManager = class _ToolManager {
1147
878
  this.cacheValid = true;
1148
879
  return this.toolsCache;
1149
880
  }
1150
- /**
1151
- * Execute a tool by routing based on prefix:
1152
- * - MCP tools: `mcp--...`
1153
- * - Local tools: `Tool.id`
1154
- *
1155
- * @param toolName Tool name (e.g., "edit_file", "mcp--filesystem--read_file")
1156
- * @param args The arguments for the tool
1157
- * @param toolCallId The unique tool call ID for tracking (from LLM or generated for direct calls)
1158
- * @param invocationOrSessionId Optional execution-scoped context for this tool call,
1159
- * or the legacy positional sessionId
1160
- * @param legacyAbortSignal Optional legacy positional abort signal
1161
- */
1162
- async executeTool(toolName, args, toolCallId, invocationOrSessionId, legacyAbortSignal) {
1163
- const { sessionId, abortSignal, runContext, hostRuntime } = this.resolveToolExecutionInvocation(invocationOrSessionId, legacyAbortSignal);
1164
- const { toolArgs: rawToolArgs, meta } = (0, import_tool_call_metadata.extractToolCallMeta)(args);
881
+ async prepareToolCall(input) {
882
+ const sessionId = input.runContext?.sessionId ?? input.sessionId;
883
+ const source = await this.resolveExecutableToolSource(input.toolName);
884
+ if (source === "unknown") {
885
+ return this.createPreparedToolError(
886
+ "unknown-tool",
887
+ input.toolName,
888
+ `Tool '${input.toolName}' not found`
889
+ );
890
+ }
891
+ if (!isRecord(input.input)) {
892
+ return this.createPreparedToolError(
893
+ "invalid-input",
894
+ input.toolName,
895
+ "Invalid arguments: expected an object"
896
+ );
897
+ }
898
+ const { toolArgs: rawToolArgs, meta } = (0, import_tool_call_metadata.extractToolCallMeta)(input.input);
1165
899
  const eventMeta = Object.keys(meta).length > 0 ? meta : void 0;
1166
- let toolArgs = rawToolArgs;
1167
900
  const callDescription = typeof meta.callDescription === "string" ? meta.callDescription : typeof rawToolArgs.description === "string" ? rawToolArgs.description : void 0;
1168
- const backgroundTasksEnabled = (0, import_env.isBackgroundTasksEnabled)();
1169
- this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
1170
- this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
1171
- if (sessionId) {
1172
- const presentationSnapshot = this.getToolPresentationSnapshotForToolCallEvent(
1173
- toolName,
1174
- toolArgs,
1175
- toolCallId,
1176
- sessionId,
1177
- runContext
901
+ let validatedArgs;
902
+ try {
903
+ validatedArgs = this.validateLocalToolArgs(input.toolName, rawToolArgs);
904
+ } catch (error) {
905
+ return this.createPreparedToolError(
906
+ "invalid-input",
907
+ input.toolName,
908
+ error instanceof Error ? error.message : String(error)
1178
909
  );
1179
- this.agentEventBus.emit("llm:tool-call", {
1180
- toolName,
1181
- presentationSnapshot,
1182
- args: toolArgs,
1183
- ...eventMeta !== void 0 ? { meta: eventMeta } : {},
1184
- ...callDescription !== void 0 && { callDescription },
1185
- callId: toolCallId,
1186
- sessionId,
1187
- ...hostRuntime !== void 0 && { hostRuntime }
1188
- });
1189
910
  }
1190
- const {
1191
- requireApproval,
1192
- approvalStatus,
1193
- args: validatedToolArgs,
1194
- presentationSnapshot: callSnapshot
1195
- } = await this.handleToolApproval(
1196
- toolName,
1197
- toolArgs,
1198
- toolCallId,
911
+ const presentationSnapshot = await this.toolPresentation.snapshotForCall({
912
+ toolName: input.toolName,
913
+ args: validatedArgs,
914
+ toolCallId: input.toolCallId,
915
+ ...sessionId !== void 0 ? { sessionId } : {},
916
+ ...input.runContext !== void 0 ? { runContext: input.runContext } : {}
917
+ });
918
+ const call = {
919
+ input: validatedArgs,
920
+ presentationSnapshot,
921
+ source,
922
+ toolCallId: input.toolCallId,
923
+ toolName: input.toolName,
924
+ ...callDescription !== void 0 ? { callDescription } : {},
925
+ ...eventMeta !== void 0 ? { meta: eventMeta } : {}
926
+ };
927
+ const overrideRequest = await this.getToolApprovalOverrideRequest(
928
+ input.toolName,
929
+ validatedArgs,
930
+ input.toolCallId,
1199
931
  sessionId,
1200
- runContext,
1201
- callDescription
1202
- );
1203
- toolArgs = validatedToolArgs;
1204
- this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
1205
- this.logger.info(
1206
- `\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
932
+ input.runContext
1207
933
  );
1208
- if (sessionId) {
1209
- this.agentEventBus.emit("tool:running", {
1210
- toolName,
1211
- toolCallId,
934
+ if (overrideRequest) {
935
+ if (!overrideRequest.directoryAccess) {
936
+ return {
937
+ kind: "approval-required",
938
+ call,
939
+ onGrantedRequestDetails: overrideRequest.onGrantedRequestDetails,
940
+ requestDetails: overrideRequest.requestDetails
941
+ };
942
+ }
943
+ const quickResult2 = await this.classifyQuickApprovalRequirement(
944
+ input.toolName,
945
+ validatedArgs,
1212
946
  sessionId,
1213
- ...hostRuntime !== void 0 && { hostRuntime }
947
+ overrideRequest.directoryAccess
948
+ );
949
+ if (quickResult2 === "ready") {
950
+ return { kind: "ready", call };
951
+ }
952
+ const displayPreview2 = await this.toolPresentation.preview({
953
+ toolName: input.toolName,
954
+ args: validatedArgs,
955
+ toolCallId: input.toolCallId,
956
+ ...sessionId !== void 0 ? { sessionId } : {},
957
+ ...input.runContext !== void 0 ? { runContext: input.runContext } : {}
1214
958
  });
959
+ const suggestedPatterns2 = this.getToolSuggestedPatterns(input.toolName, validatedArgs);
960
+ return {
961
+ kind: "approval-required",
962
+ call,
963
+ onGrantedRequestDetails: overrideRequest.onGrantedRequestDetails,
964
+ requestDetails: {
965
+ ...overrideRequest.requestDetails,
966
+ metadata: {
967
+ ...overrideRequest.requestDetails.metadata,
968
+ presentationSnapshot,
969
+ ...callDescription !== void 0 ? { description: callDescription } : {},
970
+ ...displayPreview2 !== void 0 ? { displayPreview: displayPreview2 } : {},
971
+ ...suggestedPatterns2 !== void 0 ? { suggestedPatterns: suggestedPatterns2 } : {}
972
+ }
973
+ }
974
+ };
1215
975
  }
1216
- const startTime = Date.now();
1217
- if (this.hookManager && this.sessionManager && this.stateManager) {
1218
- const beforePayload = {
1219
- toolName,
1220
- args: toolArgs,
1221
- ...sessionId !== void 0 && { sessionId }
976
+ const quickResult = await this.classifyQuickApprovalRequirement(
977
+ input.toolName,
978
+ validatedArgs,
979
+ sessionId
980
+ );
981
+ if (quickResult === "ready") {
982
+ return { kind: "ready", call };
983
+ }
984
+ const displayPreview = await this.toolPresentation.preview({
985
+ toolName: input.toolName,
986
+ args: validatedArgs,
987
+ toolCallId: input.toolCallId,
988
+ ...sessionId !== void 0 ? { sessionId } : {},
989
+ ...input.runContext !== void 0 ? { runContext: input.runContext } : {}
990
+ });
991
+ const suggestedPatterns = this.getToolSuggestedPatterns(input.toolName, validatedArgs);
992
+ const hostRuntime = input.runContext?.hostRuntime;
993
+ const requestDetails = {
994
+ type: import_types3.ApprovalType.TOOL_APPROVAL,
995
+ ...sessionId !== void 0 ? { sessionId } : {},
996
+ ...hostRuntime !== void 0 ? { hostRuntime } : {},
997
+ metadata: {
998
+ toolName: input.toolName,
999
+ presentationSnapshot,
1000
+ toolCallId: input.toolCallId,
1001
+ args: validatedArgs,
1002
+ ...callDescription !== void 0 ? { description: callDescription } : {},
1003
+ ...displayPreview !== void 0 ? { displayPreview } : {},
1004
+ ...suggestedPatterns !== void 0 ? { suggestedPatterns } : {}
1005
+ }
1006
+ };
1007
+ return {
1008
+ kind: "approval-required",
1009
+ call,
1010
+ onGrantedRequestDetails: requestDetails,
1011
+ requestDetails
1012
+ };
1013
+ }
1014
+ async recordApprovalRequest(prepared, identity) {
1015
+ this.assertOnGrantedRequestMatchesPreparedCall(prepared);
1016
+ const request = await this.approvalManager.recordApprovalRequest(prepared.requestDetails, {
1017
+ ...identity,
1018
+ toolCallId: prepared.call.toolCallId
1019
+ });
1020
+ this.assertRecordedApprovalMatchesPreparedCall(prepared, request);
1021
+ return { prepared, request };
1022
+ }
1023
+ async applyApprovalDecision(recorded, decision, runContext) {
1024
+ if (decision.approvalId !== recorded.request.approvalId) {
1025
+ throw import_errors.ToolError.executionFailed(
1026
+ recorded.prepared.call.toolName,
1027
+ "Approval decision does not match the recorded approval request"
1028
+ );
1029
+ }
1030
+ this.assertOnGrantedRequestMatchesPreparedCall(recorded.prepared);
1031
+ this.assertRecordedApprovalMatchesPreparedCall(recorded.prepared, recorded.request);
1032
+ const record = await this.approvalManager.recordApprovalResponseRecord(
1033
+ decision,
1034
+ recorded.request
1035
+ );
1036
+ if (record.response.status !== import_types3.ApprovalStatus.APPROVED) {
1037
+ return {
1038
+ kind: "terminal",
1039
+ modelVisibleResult: this.createApprovalTerminalResult(
1040
+ recorded.prepared.call,
1041
+ record.response
1042
+ ),
1043
+ response: record.response
1222
1044
  };
1223
- const modifiedPayload = await this.hookManager.executeHooks(
1224
- "beforeToolCall",
1225
- beforePayload,
1226
- {
1227
- sessionManager: this.sessionManager,
1228
- mcpManager: this.mcpManager,
1229
- toolManager: this,
1230
- stateManager: this.stateManager,
1231
- ...runContext !== void 0 && { runContext },
1232
- ...sessionId !== void 0 && { sessionId }
1045
+ }
1046
+ await this.applyApprovalGrantedEffects(recorded.prepared, record.response, runContext);
1047
+ return {
1048
+ kind: "ready",
1049
+ call: {
1050
+ ...recorded.prepared.call,
1051
+ approval: {
1052
+ requireApproval: true,
1053
+ approvalStatus: "approved"
1233
1054
  }
1055
+ },
1056
+ response: record.response
1057
+ };
1058
+ }
1059
+ async requestApprovalDecision(recorded) {
1060
+ return this.approvalManager.requestApprovalDecision(recorded.request);
1061
+ }
1062
+ assertRecordedApprovalMatchesPreparedCall(prepared, request) {
1063
+ const expected = {
1064
+ type: prepared.requestDetails.type,
1065
+ sessionId: prepared.requestDetails.sessionId,
1066
+ hostRuntime: prepared.requestDetails.hostRuntime,
1067
+ metadata: prepared.requestDetails.metadata
1068
+ };
1069
+ const actual = {
1070
+ type: request.type,
1071
+ sessionId: request.sessionId,
1072
+ hostRuntime: request.hostRuntime,
1073
+ metadata: request.metadata
1074
+ };
1075
+ if (!(0, import_node_util.isDeepStrictEqual)(actual, expected)) {
1076
+ throw import_errors.ToolError.executionFailed(
1077
+ prepared.call.toolName,
1078
+ "Recorded approval request does not match the prepared tool call"
1234
1079
  );
1235
- toolArgs = modifiedPayload.args;
1236
- try {
1237
- toolArgs = this.validateLocalToolArgs(toolName, toolArgs);
1238
- } catch (error) {
1239
- this.logger.error(
1240
- `Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
1241
- );
1242
- throw error;
1243
- }
1244
1080
  }
1245
- try {
1246
- let result;
1247
- const registerBackgroundTask = (promise, description) => {
1248
- const fallbackId = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
1249
- return {
1250
- result: {
1251
- taskId: toolCallId ?? fallbackId,
1252
- status: "running",
1253
- description
1254
- },
1255
- promise
1256
- };
1081
+ }
1082
+ assertOnGrantedRequestMatchesPreparedCall(prepared) {
1083
+ const approvalDetails = prepared.requestDetails;
1084
+ const grantedDetails = prepared.onGrantedRequestDetails;
1085
+ const directoryAccess = approvalDetails.type === import_types3.ApprovalType.TOOL_APPROVAL && "directoryAccess" in approvalDetails.metadata ? import_schemas.DirectoryAccessMetadataSchema.parse(approvalDetails.metadata.directoryAccess) : void 0;
1086
+ if (directoryAccess !== void 0) {
1087
+ const expected = {
1088
+ type: import_types3.ApprovalType.DIRECTORY_ACCESS,
1089
+ sessionId: approvalDetails.sessionId,
1090
+ hostRuntime: approvalDetails.hostRuntime,
1091
+ metadata: directoryAccess
1257
1092
  };
1258
- if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
1259
- this.logger.debug(`\u{1F527} Detected MCP tool: '${toolName}'`);
1260
- const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
1261
- if (actualToolName.length === 0) {
1262
- throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
1263
- }
1264
- this.logger.debug(`\u{1F3AF} MCP routing: '${toolName}' -> '${actualToolName}'`);
1265
- const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
1266
- const executeMcpTool = () => runContext === void 0 ? this.mcpManager.executeTool(actualToolName, toolArgs, sessionId) : this.mcpManager.executeTool(
1267
- actualToolName,
1268
- toolArgs,
1269
- sessionId,
1270
- runContext
1093
+ const actual = {
1094
+ type: grantedDetails.type,
1095
+ sessionId: grantedDetails.sessionId,
1096
+ hostRuntime: grantedDetails.hostRuntime,
1097
+ metadata: grantedDetails.metadata
1098
+ };
1099
+ if (!(0, import_node_util.isDeepStrictEqual)(actual, expected)) {
1100
+ throw import_errors.ToolError.executionFailed(
1101
+ prepared.call.toolName,
1102
+ "Approval granted-effects request does not match the prepared tool call"
1271
1103
  );
1272
- if (meta.runInBackground === true && !backgroundTasksEnabled) {
1273
- this.logger.debug(
1274
- "Background tool execution disabled; running synchronously instead.",
1275
- { toolName }
1276
- );
1277
- }
1278
- if (runInBackground) {
1279
- const backgroundSessionId = sessionId;
1280
- const { result: backgroundResult, promise } = registerBackgroundTask(
1281
- executeMcpTool(),
1282
- `MCP tool ${actualToolName}`
1283
- );
1284
- this.agentEventBus.emit("tool:background", {
1285
- toolName,
1286
- toolCallId: backgroundResult.taskId,
1287
- sessionId: backgroundSessionId,
1288
- description: backgroundResult.description,
1289
- promise,
1290
- ...hostRuntime !== void 0 && { hostRuntime },
1291
- ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
1292
- ...meta.notifyOnComplete !== void 0 && {
1293
- notifyOnComplete: meta.notifyOnComplete
1294
- }
1295
- });
1296
- result = backgroundResult;
1297
- } else {
1298
- result = await executeMcpTool();
1299
- }
1300
- } else {
1301
- const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
1302
- if (meta.runInBackground === true && !backgroundTasksEnabled) {
1303
- this.logger.debug(
1304
- "Background tool execution disabled; running synchronously instead.",
1305
- { toolName }
1306
- );
1307
- }
1308
- if (runInBackground) {
1309
- const backgroundSessionId = sessionId;
1310
- const { result: backgroundResult, promise } = registerBackgroundTask(
1311
- this.executeLocalTool(toolName, toolArgs, {
1312
- sessionId: backgroundSessionId,
1313
- abortSignal,
1314
- toolCallId,
1104
+ }
1105
+ return;
1106
+ }
1107
+ if (!(0, import_node_util.isDeepStrictEqual)(grantedDetails, approvalDetails)) {
1108
+ throw import_errors.ToolError.executionFailed(
1109
+ prepared.call.toolName,
1110
+ "Approval granted-effects request does not match the prepared tool call"
1111
+ );
1112
+ }
1113
+ }
1114
+ async applyApprovalGrantedEffects(prepared, response, runContext) {
1115
+ const requestDetails = prepared.onGrantedRequestDetails;
1116
+ const approvalRequestDetails = prepared.requestDetails;
1117
+ const sessionId = approvalRequestDetails.sessionId;
1118
+ const onGranted = this.getToolApprovalOnGrantedFn(prepared.call.toolName);
1119
+ if (onGranted) {
1120
+ const context = this.buildToolExecutionContext({
1121
+ sessionId,
1122
+ toolCallId: prepared.call.toolCallId,
1123
+ runContext
1124
+ });
1125
+ await Promise.resolve(onGranted(response, context, requestDetails));
1126
+ }
1127
+ if (approvalRequestDetails.type === import_types3.ApprovalType.TOOL_APPROVAL && response.data) {
1128
+ await this.handleRememberChoice(
1129
+ prepared.call.toolName,
1130
+ {
1131
+ data: import_schemas.ToolApprovalResponseDataSchema.parse(response.data),
1132
+ ...response.sessionId !== void 0 ? { sessionId: response.sessionId } : {}
1133
+ },
1134
+ sessionId
1135
+ );
1136
+ }
1137
+ }
1138
+ createApprovalTerminalResult(call, response) {
1139
+ return {
1140
+ result: {
1141
+ error: this.formatApprovalTerminalMessage(call.toolName, response)
1142
+ },
1143
+ presentationSnapshot: call.presentationSnapshot,
1144
+ ...call.meta !== void 0 ? { meta: call.meta } : {},
1145
+ requireApproval: true,
1146
+ approvalStatus: "rejected"
1147
+ };
1148
+ }
1149
+ formatApprovalTerminalMessage(toolName, response) {
1150
+ if (response.status === import_types3.ApprovalStatus.CANCELLED && response.reason === import_types3.DenialReason.TIMEOUT) {
1151
+ return `Tool '${toolName}' was not executed because approval timed out${response.timeoutMs !== void 0 ? ` after ${response.timeoutMs}ms` : ""}.`;
1152
+ }
1153
+ const outcome = response.status === import_types3.ApprovalStatus.DENIED ? "approval was denied" : "approval was cancelled";
1154
+ return `Tool '${toolName}' was not executed because ${outcome}${response.message ? `: ${response.message}` : ""}.`;
1155
+ }
1156
+ async resolveExecutableToolSource(toolName) {
1157
+ if (this.agentTools.has(toolName)) {
1158
+ return "local";
1159
+ }
1160
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
1161
+ return "mcp";
1162
+ }
1163
+ return "unknown";
1164
+ }
1165
+ createPreparedToolError(kind, toolName, error) {
1166
+ return {
1167
+ kind: "terminal",
1168
+ reason: kind,
1169
+ modelVisibleResult: {
1170
+ result: { error },
1171
+ presentationSnapshot: this.toolPresentation.buildGenericSnapshot(toolName)
1172
+ }
1173
+ };
1174
+ }
1175
+ createPreparedToolTerminal(reason, toolName, call) {
1176
+ return {
1177
+ kind: "terminal",
1178
+ reason,
1179
+ call,
1180
+ modelVisibleResult: {
1181
+ result: {
1182
+ error: `Tool '${toolName}' was not executed because policy denied it.`
1183
+ },
1184
+ presentationSnapshot: call.presentationSnapshot,
1185
+ ...call.meta !== void 0 ? { meta: call.meta } : {}
1186
+ }
1187
+ };
1188
+ }
1189
+ async getToolApprovalOverrideRequest(toolName, args, toolCallId, sessionId, runContext) {
1190
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
1191
+ return null;
1192
+ }
1193
+ const getApprovalOverride = this.getToolApprovalOverrideFn(toolName);
1194
+ if (!getApprovalOverride) {
1195
+ return null;
1196
+ }
1197
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
1198
+ const approvalRequest = await getApprovalOverride(args, context);
1199
+ if (!approvalRequest) {
1200
+ return null;
1201
+ }
1202
+ const requestDetails = {
1203
+ ...approvalRequest,
1204
+ ...sessionId && !approvalRequest.sessionId ? { sessionId } : {},
1205
+ ...runContext?.hostRuntime !== void 0 && approvalRequest.hostRuntime === void 0 ? { hostRuntime: runContext.hostRuntime } : {}
1206
+ };
1207
+ if (requestDetails.type !== import_types3.ApprovalType.DIRECTORY_ACCESS) {
1208
+ return { requestDetails, onGrantedRequestDetails: requestDetails };
1209
+ }
1210
+ const parseResult = import_schemas.DirectoryAccessMetadataSchema.safeParse(requestDetails.metadata);
1211
+ if (!parseResult.success) {
1212
+ throw import_errors.ToolError.configInvalid(
1213
+ `Tool '${toolName}' returned invalid directory access metadata`
1214
+ );
1215
+ }
1216
+ const directoryAccess = parseResult.data;
1217
+ return {
1218
+ directoryAccess,
1219
+ onGrantedRequestDetails: requestDetails,
1220
+ requestDetails: {
1221
+ type: import_types3.ApprovalType.TOOL_APPROVAL,
1222
+ ...requestDetails.sessionId !== void 0 ? { sessionId: requestDetails.sessionId } : {},
1223
+ ...requestDetails.hostRuntime !== void 0 ? { hostRuntime: requestDetails.hostRuntime } : {},
1224
+ metadata: {
1225
+ toolName,
1226
+ toolCallId,
1227
+ args,
1228
+ directoryAccess
1229
+ }
1230
+ }
1231
+ };
1232
+ }
1233
+ async classifyQuickApprovalRequirement(toolName, args, sessionId, directoryAccess) {
1234
+ if (directoryAccess) {
1235
+ return this.approvalMode === "auto-approve" ? "ready" : "approval-required";
1236
+ }
1237
+ if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
1238
+ return "ready";
1239
+ }
1240
+ if (this.isInAlwaysAllowList(toolName)) {
1241
+ return "ready";
1242
+ }
1243
+ if (await this.allowedToolsProvider.isToolAllowed(toolName, sessionId)) {
1244
+ return "ready";
1245
+ }
1246
+ const patternKey = this.getToolPatternKey(toolName, args);
1247
+ if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey, sessionId)) {
1248
+ return "ready";
1249
+ }
1250
+ if (this.approvalMode === "auto-approve") {
1251
+ return "ready";
1252
+ }
1253
+ return "approval-required";
1254
+ }
1255
+ async executeTool(toolName, args, toolCallId, invocation) {
1256
+ const { sessionId, runContext, hostRuntime } = this.resolveToolExecutionInvocation(invocation);
1257
+ this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
1258
+ this.logger.debug(`Tool args: ${JSON.stringify(args, null, 2)}`);
1259
+ if (toolName === _ToolManager.MCP_TOOL_PREFIX) {
1260
+ throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
1261
+ }
1262
+ const prepared = await this.prepareToolCall({
1263
+ toolName,
1264
+ input: args,
1265
+ toolCallId,
1266
+ ...sessionId !== void 0 ? { sessionId } : {},
1267
+ ...runContext !== void 0 ? { runContext } : {}
1268
+ });
1269
+ if (prepared.kind === "terminal") {
1270
+ this.throwPreparedTerminalResult(toolName, prepared, sessionId);
1271
+ }
1272
+ this.emitPreparedToolCallEvent(prepared.call, sessionId, runContext, hostRuntime);
1273
+ const replayed = await this.replayExistingDirectToolExecution(prepared.call, invocation);
1274
+ if (replayed !== void 0) {
1275
+ return replayed;
1276
+ }
1277
+ if (prepared.kind === "ready") {
1278
+ return this.executePreparedToolCall(prepared.call, invocation, { throwOnError: true });
1279
+ }
1280
+ let applied;
1281
+ try {
1282
+ const recorded = await this.recordApprovalRequest(
1283
+ prepared,
1284
+ this.resolveDirectApprovalIdentity(invocation, toolCallId)
1285
+ );
1286
+ const response = await this.requestApprovalDecision(recorded);
1287
+ applied = await this.applyApprovalDecision(
1288
+ recorded,
1289
+ {
1290
+ approvalId: response.approvalId,
1291
+ status: response.status,
1292
+ ...response.reason !== void 0 ? { reason: response.reason } : {},
1293
+ ...response.message !== void 0 ? { message: response.message } : {},
1294
+ ...response.data !== void 0 ? { data: response.data } : {}
1295
+ },
1296
+ runContext
1297
+ );
1298
+ } catch (error) {
1299
+ await this.recordDirectToolExecutionFailure(prepared.call, invocation, error);
1300
+ throw error;
1301
+ }
1302
+ if (applied.kind === "terminal") {
1303
+ try {
1304
+ this.handleApprovalDenied(toolName, applied.response, sessionId);
1305
+ } catch (error) {
1306
+ await this.recordDirectToolExecutionFailure(prepared.call, invocation, error);
1307
+ throw error;
1308
+ }
1309
+ }
1310
+ return this.executePreparedToolCall(applied.call, invocation, { throwOnError: true });
1311
+ }
1312
+ emitPreparedToolCallEvent(call, sessionId, runContext, hostRuntime) {
1313
+ if (!sessionId) {
1314
+ return;
1315
+ }
1316
+ this.agentEventBus.emit("llm:tool-call", {
1317
+ toolName: call.toolName,
1318
+ presentationSnapshot: this.toolPresentation.snapshotForToolCallEvent({
1319
+ toolName: call.toolName,
1320
+ args: call.input,
1321
+ toolCallId: call.toolCallId,
1322
+ sessionId,
1323
+ ...runContext !== void 0 ? { runContext } : {}
1324
+ }),
1325
+ args: call.input,
1326
+ ...call.meta !== void 0 ? { meta: call.meta } : {},
1327
+ ...call.callDescription !== void 0 ? { callDescription: call.callDescription } : {},
1328
+ callId: call.toolCallId,
1329
+ sessionId,
1330
+ ...hostRuntime !== void 0 && { hostRuntime }
1331
+ });
1332
+ }
1333
+ async replayExistingDirectToolExecution(call, invocation) {
1334
+ const { sessionId } = this.resolveToolExecutionInvocation(invocation);
1335
+ if ((0, import_env.isBackgroundTasksEnabled)() && call.meta?.runInBackground === true && sessionId !== void 0) {
1336
+ return void 0;
1337
+ }
1338
+ const identity = this.resolveToolExecutionIdentity(invocation ?? {}, call.toolCallId);
1339
+ if (identity === void 0) {
1340
+ return void 0;
1341
+ }
1342
+ const executionId = (0, import_types4.createToolExecutionId)(identity);
1343
+ const record = await this.toolExecutionStore.get({ executionId });
1344
+ if (record === void 0) {
1345
+ return void 0;
1346
+ }
1347
+ this.assertToolExecutionRecordMatches({
1348
+ record,
1349
+ identity,
1350
+ toolName: call.toolName,
1351
+ toolInput: call.input
1352
+ });
1353
+ if (record.status === "completed") {
1354
+ this.logger.info("Replaying completed direct tool execution result", {
1355
+ executionId,
1356
+ toolName: call.toolName
1357
+ });
1358
+ return (0, import_types4.completedToolExecutionToResult)(record);
1359
+ }
1360
+ if (record.status === "failed") {
1361
+ throw import_errors.ToolError.executionFailed(
1362
+ call.toolName,
1363
+ `Tool execution already failed: ${executionId}`
1364
+ );
1365
+ }
1366
+ throw import_errors.ToolError.executionFailed(
1367
+ call.toolName,
1368
+ `Tool execution already ${record.status}: ${executionId}`
1369
+ );
1370
+ }
1371
+ async recordDirectToolExecutionFailure(call, invocation, error) {
1372
+ const identity = this.resolveToolExecutionIdentity(invocation ?? {}, call.toolCallId);
1373
+ if (identity === void 0) {
1374
+ return;
1375
+ }
1376
+ const executionId = (0, import_types4.createToolExecutionId)(identity);
1377
+ const started = await this.toolExecutionStore.start({
1378
+ record: {
1379
+ executionId,
1380
+ identity,
1381
+ input: call.input,
1382
+ toolName: call.toolName,
1383
+ status: "running",
1384
+ startedAt: /* @__PURE__ */ new Date(),
1385
+ updatedAt: /* @__PURE__ */ new Date()
1386
+ }
1387
+ });
1388
+ if (started.status === "existing") {
1389
+ this.assertToolExecutionRecordMatches({
1390
+ record: started.record,
1391
+ identity,
1392
+ toolName: call.toolName,
1393
+ toolInput: call.input
1394
+ });
1395
+ if (started.record.status !== "running") {
1396
+ return;
1397
+ }
1398
+ }
1399
+ await this.toolExecutionStore.fail({
1400
+ executionId,
1401
+ completedAt: /* @__PURE__ */ new Date(),
1402
+ error: error instanceof Error ? error.message : String(error)
1403
+ });
1404
+ }
1405
+ resolveDirectApprovalIdentity(invocation, toolCallId) {
1406
+ const executionIdentity = this.resolveToolExecutionIdentity(invocation ?? {}, toolCallId);
1407
+ if (executionIdentity !== void 0) {
1408
+ return {
1409
+ runId: executionIdentity.runId,
1410
+ turnId: executionIdentity.turnId,
1411
+ modelStepId: executionIdentity.modelStepId
1412
+ };
1413
+ }
1414
+ const ids = invocation?.runContext?.hostRuntime?.ids;
1415
+ const runId = ids?.runId;
1416
+ const turnId = ids?.turnId;
1417
+ const modelStepId = ids?.modelStepId;
1418
+ if (runId !== void 0 && turnId !== void 0 && modelStepId !== void 0) {
1419
+ return { runId, turnId, modelStepId };
1420
+ }
1421
+ return {
1422
+ runId: invocation?.sessionId ?? invocation?.runContext?.sessionId ?? "direct",
1423
+ turnId: "direct",
1424
+ modelStepId: "direct"
1425
+ };
1426
+ }
1427
+ throwPreparedTerminalResult(toolName, prepared, sessionId) {
1428
+ if (prepared.reason === "unknown-tool") {
1429
+ throw import_errors.ToolError.notFound(toolName);
1430
+ }
1431
+ if (prepared.reason === "denied") {
1432
+ throw import_errors.ToolError.executionDenied(toolName, sessionId);
1433
+ }
1434
+ if (prepared.reason === "invalid-input") {
1435
+ throw import_errors.ToolError.validationFailed(
1436
+ toolName,
1437
+ this.getPreparedTerminalMessage(prepared.modelVisibleResult)
1438
+ );
1439
+ }
1440
+ throw import_errors.ToolError.executionFailed(
1441
+ toolName,
1442
+ this.getPreparedTerminalMessage(prepared.modelVisibleResult),
1443
+ sessionId
1444
+ );
1445
+ }
1446
+ getPreparedTerminalMessage(result) {
1447
+ const output = result.result;
1448
+ if (isRecord(output) && typeof output.error === "string") {
1449
+ return output.error;
1450
+ }
1451
+ return "Tool call could not be prepared for execution";
1452
+ }
1453
+ async executePreparedToolCall(call, invocation, options) {
1454
+ const { sessionId, abortSignal, runContext, hostRuntime } = this.resolveToolExecutionInvocation(invocation);
1455
+ const durableIdentity = this.resolveToolExecutionIdentity(
1456
+ invocation ?? {},
1457
+ call.toolCallId
1458
+ );
1459
+ const backgroundTasksEnabled = (0, import_env.isBackgroundTasksEnabled)();
1460
+ const willRunInBackground = backgroundTasksEnabled && call.meta?.runInBackground === true && sessionId !== void 0;
1461
+ const executionIdentity = willRunInBackground ? void 0 : durableIdentity;
1462
+ const executionId = executionIdentity === void 0 ? void 0 : (0, import_types4.createToolExecutionId)(executionIdentity);
1463
+ let toolArgs = call.input;
1464
+ this.logger.debug(
1465
+ `\u{1F527} Prepared tool execution requested: '${call.toolName}' (toolCallId: ${call.toolCallId})`
1466
+ );
1467
+ if (executionIdentity !== void 0 && executionId !== void 0) {
1468
+ const started = await this.toolExecutionStore.start({
1469
+ record: {
1470
+ executionId,
1471
+ identity: executionIdentity,
1472
+ input: call.input,
1473
+ toolName: call.toolName,
1474
+ status: "running",
1475
+ startedAt: /* @__PURE__ */ new Date(),
1476
+ updatedAt: /* @__PURE__ */ new Date()
1477
+ }
1478
+ });
1479
+ if (started.status === "existing") {
1480
+ this.assertToolExecutionRecordMatches({
1481
+ record: started.record,
1482
+ identity: executionIdentity,
1483
+ toolName: call.toolName,
1484
+ toolInput: call.input
1485
+ });
1486
+ if (started.record.status === "completed") {
1487
+ this.logger.info("Replaying completed prepared tool execution result", {
1488
+ executionId,
1489
+ toolName: call.toolName
1490
+ });
1491
+ return (0, import_types4.completedToolExecutionToResult)(started.record);
1492
+ }
1493
+ if (started.record.status === "failed") {
1494
+ this.logger.info("Replaying failed prepared tool execution result", {
1495
+ executionId,
1496
+ toolName: call.toolName
1497
+ });
1498
+ if (options?.throwOnError === true) {
1499
+ throw import_errors.ToolError.executionFailed(
1500
+ call.toolName,
1501
+ `Tool execution already failed: ${executionId}`
1502
+ );
1503
+ }
1504
+ return this.createFailedPreparedToolResult(call, started.record.error);
1505
+ }
1506
+ throw import_errors.ToolError.executionFailed(
1507
+ call.toolName,
1508
+ `Tool execution already ${started.record.status}: ${executionId}`
1509
+ );
1510
+ }
1511
+ }
1512
+ const startTime = Date.now();
1513
+ try {
1514
+ this.logger.info(
1515
+ `\u{1F527} Prepared tool execution started for ${call.toolName}, sessionId: ${sessionId ?? "global"}`
1516
+ );
1517
+ if (sessionId) {
1518
+ this.agentEventBus.emit("tool:running", {
1519
+ toolName: call.toolName,
1520
+ toolCallId: call.toolCallId,
1521
+ sessionId,
1522
+ ...hostRuntime !== void 0 && { hostRuntime }
1523
+ });
1524
+ }
1525
+ if (this.hookManager && this.sessionManager && this.stateManager) {
1526
+ const beforePayload = {
1527
+ toolName: call.toolName,
1528
+ args: toolArgs,
1529
+ ...sessionId !== void 0 && { sessionId }
1530
+ };
1531
+ const modifiedPayload = await this.hookManager.executeHooks(
1532
+ "beforeToolCall",
1533
+ beforePayload,
1534
+ {
1535
+ sessionManager: this.sessionManager,
1536
+ mcpManager: this.mcpManager,
1537
+ toolManager: this,
1538
+ stateManager: this.stateManager,
1539
+ ...runContext !== void 0 && { runContext },
1540
+ ...sessionId !== void 0 && { sessionId }
1541
+ }
1542
+ );
1543
+ toolArgs = modifiedPayload.args;
1544
+ try {
1545
+ toolArgs = this.validateLocalToolArgs(call.toolName, toolArgs);
1546
+ } catch (error) {
1547
+ this.logger.error(
1548
+ `Post-hook validation failed for tool '${call.toolName}': a beforeToolCall hook may have set invalid args`
1549
+ );
1550
+ throw error;
1551
+ }
1552
+ }
1553
+ let result;
1554
+ const registerBackgroundTask = (promise, description) => {
1555
+ return {
1556
+ result: {
1557
+ taskId: call.toolCallId,
1558
+ status: "running",
1559
+ description
1560
+ },
1561
+ promise
1562
+ };
1563
+ };
1564
+ if (call.source === "mcp") {
1565
+ const actualToolName = call.toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
1566
+ if (actualToolName.length === 0) {
1567
+ throw import_errors.ToolError.invalidName(
1568
+ call.toolName,
1569
+ "tool name cannot be empty after prefix"
1570
+ );
1571
+ }
1572
+ const executeMcpTool = () => runContext === void 0 ? this.mcpManager.executeTool(actualToolName, toolArgs, sessionId) : this.mcpManager.executeTool(
1573
+ actualToolName,
1574
+ toolArgs,
1575
+ sessionId,
1576
+ runContext
1577
+ );
1578
+ if (call.meta?.runInBackground === true && !backgroundTasksEnabled) {
1579
+ this.logger.debug(
1580
+ "Background tool execution disabled; running synchronously instead.",
1581
+ { toolName: call.toolName }
1582
+ );
1583
+ }
1584
+ if (willRunInBackground) {
1585
+ const backgroundSessionId = sessionId;
1586
+ const { result: backgroundResult, promise } = registerBackgroundTask(
1587
+ executeMcpTool(),
1588
+ `MCP tool ${actualToolName}`
1589
+ );
1590
+ this.agentEventBus.emit("tool:background", {
1591
+ toolName: call.toolName,
1592
+ toolCallId: backgroundResult.taskId,
1593
+ sessionId: backgroundSessionId,
1594
+ description: backgroundResult.description,
1595
+ promise,
1596
+ ...hostRuntime !== void 0 && { hostRuntime },
1597
+ ...call.meta?.timeoutMs !== void 0 && {
1598
+ timeoutMs: call.meta.timeoutMs
1599
+ },
1600
+ ...call.meta?.notifyOnComplete !== void 0 && {
1601
+ notifyOnComplete: call.meta.notifyOnComplete
1602
+ }
1603
+ });
1604
+ result = backgroundResult;
1605
+ } else {
1606
+ result = await executeMcpTool();
1607
+ }
1608
+ } else {
1609
+ if (call.meta?.runInBackground === true && !backgroundTasksEnabled) {
1610
+ this.logger.debug(
1611
+ "Background tool execution disabled; running synchronously instead.",
1612
+ { toolName: call.toolName }
1613
+ );
1614
+ }
1615
+ if (willRunInBackground) {
1616
+ const backgroundSessionId = sessionId;
1617
+ const { result: backgroundResult, promise } = registerBackgroundTask(
1618
+ this.executeLocalTool(call.toolName, toolArgs, {
1619
+ sessionId: backgroundSessionId,
1620
+ abortSignal,
1621
+ toolCallId: call.toolCallId,
1315
1622
  runContext
1316
1623
  }),
1317
- `Tool ${toolName}`
1624
+ `Tool ${call.toolName}`
1318
1625
  );
1319
1626
  this.agentEventBus.emit("tool:background", {
1320
- toolName,
1627
+ toolName: call.toolName,
1321
1628
  toolCallId: backgroundResult.taskId,
1322
1629
  sessionId: backgroundSessionId,
1323
1630
  description: backgroundResult.description,
1324
1631
  promise,
1325
1632
  ...hostRuntime !== void 0 && { hostRuntime },
1326
- ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
1327
- ...meta.notifyOnComplete !== void 0 && {
1328
- notifyOnComplete: meta.notifyOnComplete
1633
+ ...call.meta?.timeoutMs !== void 0 && {
1634
+ timeoutMs: call.meta.timeoutMs
1635
+ },
1636
+ ...call.meta?.notifyOnComplete !== void 0 && {
1637
+ notifyOnComplete: call.meta.notifyOnComplete
1329
1638
  }
1330
1639
  });
1331
1640
  result = backgroundResult;
1332
1641
  } else {
1333
- result = await this.executeLocalTool(toolName, toolArgs, {
1642
+ result = await this.executeLocalTool(call.toolName, toolArgs, {
1334
1643
  sessionId,
1335
1644
  abortSignal,
1336
- toolCallId,
1645
+ toolCallId: call.toolCallId,
1337
1646
  runContext
1338
1647
  });
1339
1648
  }
1340
1649
  }
1341
1650
  const duration = Date.now() - startTime;
1342
- this.logger.debug(`\u{1F3AF} Tool execution completed in ${duration}ms: '${toolName}'`);
1343
- this.logger.info(
1344
- `\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
1651
+ this.logger.debug(
1652
+ `\u{1F3AF} Prepared tool execution completed in ${duration}ms: '${call.toolName}'`
1345
1653
  );
1346
1654
  if (this.hookManager && this.sessionManager && this.stateManager) {
1347
1655
  const afterPayload = {
1348
- toolName,
1656
+ toolName: call.toolName,
1349
1657
  result,
1350
1658
  success: true,
1351
1659
  ...sessionId !== void 0 && { sessionId }
@@ -1364,29 +1672,45 @@ let _ToolManager = class _ToolManager {
1364
1672
  );
1365
1673
  result = modifiedPayload.result;
1366
1674
  }
1367
- const presentationSnapshot = await this.augmentSnapshotWithResult(
1368
- toolName,
1369
- callSnapshot,
1675
+ const presentationSnapshot = await this.toolPresentation.augmentWithResult({
1676
+ toolName: call.toolName,
1677
+ snapshot: call.presentationSnapshot,
1370
1678
  result,
1371
- toolArgs,
1372
- toolCallId,
1373
- sessionId,
1374
- runContext
1375
- );
1376
- return {
1679
+ args: toolArgs,
1680
+ toolCallId: call.toolCallId,
1681
+ ...sessionId !== void 0 ? { sessionId } : {},
1682
+ ...runContext !== void 0 ? { runContext } : {}
1683
+ });
1684
+ const executionResult = {
1377
1685
  result,
1378
1686
  ...presentationSnapshot !== void 0 && { presentationSnapshot },
1379
- ...eventMeta !== void 0 ? { meta: eventMeta } : {},
1380
- ...requireApproval && { requireApproval, approvalStatus }
1687
+ ...call.meta !== void 0 ? { meta: call.meta } : {},
1688
+ ...call.approval !== void 0 ? call.approval : {}
1381
1689
  };
1690
+ if (executionId !== void 0) {
1691
+ await this.toolExecutionStore.complete({
1692
+ executionId,
1693
+ completedAt: /* @__PURE__ */ new Date(),
1694
+ result: executionResult
1695
+ });
1696
+ }
1697
+ return executionResult;
1382
1698
  } catch (error) {
1383
1699
  const duration = Date.now() - startTime;
1384
1700
  this.logger.error(
1385
- `\u274C Tool execution failed for ${toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
1701
+ `\u274C Prepared tool execution failed for ${call.toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
1386
1702
  );
1703
+ const message = error instanceof Error ? error.message : String(error);
1704
+ if (executionId !== void 0) {
1705
+ await this.toolExecutionStore.fail({
1706
+ executionId,
1707
+ completedAt: /* @__PURE__ */ new Date(),
1708
+ error: message
1709
+ });
1710
+ }
1387
1711
  if (this.hookManager && this.sessionManager && this.stateManager) {
1388
1712
  const afterPayload = {
1389
- toolName,
1713
+ toolName: call.toolName,
1390
1714
  result: error instanceof Error ? error.message : String(error),
1391
1715
  success: false,
1392
1716
  ...sessionId !== void 0 && { sessionId }
@@ -1400,9 +1724,20 @@ let _ToolManager = class _ToolManager {
1400
1724
  ...sessionId !== void 0 && { sessionId }
1401
1725
  });
1402
1726
  }
1403
- throw error;
1727
+ if (options?.throwOnError === true) {
1728
+ throw error;
1729
+ }
1730
+ return this.createFailedPreparedToolResult(call, message);
1404
1731
  }
1405
1732
  }
1733
+ createFailedPreparedToolResult(call, error) {
1734
+ return {
1735
+ result: { error },
1736
+ presentationSnapshot: call.presentationSnapshot,
1737
+ ...call.meta !== void 0 ? { meta: call.meta } : {},
1738
+ ...call.approval !== void 0 ? call.approval : {}
1739
+ };
1740
+ }
1406
1741
  /**
1407
1742
  * Check if a tool exists.
1408
1743
  */
@@ -1448,45 +1783,6 @@ let _ToolManager = class _ToolManager {
1448
1783
  }
1449
1784
  return "unknown";
1450
1785
  }
1451
- /**
1452
- * Check if a tool matches a policy pattern
1453
- * Supports both exact matching and suffix matching for MCP tools with server prefixes
1454
- *
1455
- * Examples:
1456
- * - Policy "mcp--read_file" matches "mcp--read_file" (exact)
1457
- * - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
1458
- * - Policy "read_file" matches "read_file" (local tool exact only)
1459
- *
1460
- * @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
1461
- * @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
1462
- * @returns true if the tool matches the policy pattern
1463
- */
1464
- matchesToolPolicy(toolName, policyPattern) {
1465
- if (toolName === policyPattern) {
1466
- return true;
1467
- }
1468
- if (policyPattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
1469
- const baseName = policyPattern.substring(_ToolManager.MCP_TOOL_PREFIX.length);
1470
- if (toolName.endsWith(`--${baseName}`) && toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
1471
- return true;
1472
- }
1473
- }
1474
- return false;
1475
- }
1476
- /**
1477
- * Check if a tool is in the static alwaysDeny list
1478
- * Supports both exact and suffix matching (e.g., "mcp--read_file" matches "mcp--server--read_file")
1479
- * @param toolName The fully qualified tool name to check
1480
- * @returns true if the tool is in the deny list
1481
- */
1482
- isInAlwaysDenyList(toolName) {
1483
- if (!this.toolPolicies?.alwaysDeny) {
1484
- return false;
1485
- }
1486
- return this.toolPolicies.alwaysDeny.some(
1487
- (pattern) => this.matchesToolPolicy(toolName, pattern)
1488
- );
1489
- }
1490
1786
  /**
1491
1787
  * Check if a tool is in the static alwaysAllow list
1492
1788
  * Supports both exact and suffix matching (e.g., "mcp--read_file" matches "mcp--server--read_file")
@@ -1498,250 +1794,9 @@ let _ToolManager = class _ToolManager {
1498
1794
  return false;
1499
1795
  }
1500
1796
  return this.toolPolicies.alwaysAllow.some(
1501
- (pattern) => this.matchesToolPolicy(toolName, pattern)
1797
+ (pattern) => (0, import_session_tool_policy.matchesToolPolicyPattern)(toolName, pattern)
1502
1798
  );
1503
1799
  }
1504
- /**
1505
- * Handle tool approval flow. Checks various precedence levels to determine
1506
- * if a tool should be auto-approved, denied, or requires manual approval.
1507
- */
1508
- async handleToolApproval(toolName, args, toolCallId, sessionId, runContext, callDescription) {
1509
- if (this.isInAlwaysDenyList(toolName)) {
1510
- this.logger.info(
1511
- `Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
1512
- );
1513
- throw import_errors.ToolError.executionDenied(toolName, sessionId);
1514
- }
1515
- const validatedArgs = this.validateLocalToolArgs(toolName, args);
1516
- const presentationSnapshot = await this.getToolPresentationSnapshotForCall(
1517
- toolName,
1518
- validatedArgs,
1519
- toolCallId,
1520
- sessionId,
1521
- runContext
1522
- );
1523
- let directoryAccess;
1524
- let directoryAccessApprovalRequest;
1525
- if (!toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
1526
- const getApprovalOverride = this.getToolApprovalOverrideFn(toolName);
1527
- if (getApprovalOverride) {
1528
- const context = this.buildToolExecutionContext({
1529
- sessionId,
1530
- toolCallId,
1531
- runContext
1532
- });
1533
- const approvalRequest = await getApprovalOverride(validatedArgs, context);
1534
- if (approvalRequest) {
1535
- if (approvalRequest.type === import_types3.ApprovalType.DIRECTORY_ACCESS) {
1536
- const metadata = approvalRequest.metadata;
1537
- if (typeof metadata !== "object" || metadata === null || typeof metadata.path !== "string" || typeof metadata.parentDir !== "string" || typeof metadata.operation !== "string" || typeof metadata.toolName !== "string") {
1538
- throw import_errors.ToolError.configInvalid(
1539
- `Tool '${toolName}' returned invalid directory access metadata`
1540
- );
1541
- }
1542
- directoryAccess = metadata;
1543
- directoryAccessApprovalRequest = approvalRequest;
1544
- } else {
1545
- this.logger.debug(
1546
- `Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
1547
- );
1548
- if (sessionId && !approvalRequest.sessionId) {
1549
- approvalRequest.sessionId = sessionId;
1550
- }
1551
- if (runContext?.hostRuntime !== void 0 && approvalRequest.hostRuntime === void 0) {
1552
- approvalRequest.hostRuntime = runContext.hostRuntime;
1553
- }
1554
- const response = await this.approvalManager.requestApproval(approvalRequest);
1555
- if (response.status === import_types3.ApprovalStatus.APPROVED) {
1556
- const onGranted = this.getToolApprovalOnGrantedFn(toolName);
1557
- if (onGranted) {
1558
- await Promise.resolve(
1559
- onGranted(response, context, approvalRequest)
1560
- );
1561
- }
1562
- this.logger.info(
1563
- `Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
1564
- );
1565
- return {
1566
- requireApproval: true,
1567
- approvalStatus: "approved",
1568
- args: validatedArgs,
1569
- presentationSnapshot
1570
- };
1571
- }
1572
- this.logger.info(
1573
- `Custom approval denied for '${toolName}', type=${approvalRequest.type}, reason=${response.reason ?? "unknown"}`
1574
- );
1575
- throw import_errors.ToolError.executionDenied(toolName, sessionId);
1576
- }
1577
- }
1578
- }
1579
- }
1580
- const quickResult = await this.tryQuickApprovalResolution(
1581
- toolName,
1582
- validatedArgs,
1583
- sessionId,
1584
- directoryAccess
1585
- );
1586
- if (quickResult !== null) {
1587
- return { ...quickResult, args: validatedArgs, presentationSnapshot };
1588
- }
1589
- const manualResult = await this.requestManualApproval(
1590
- toolName,
1591
- validatedArgs,
1592
- toolCallId,
1593
- sessionId,
1594
- runContext,
1595
- directoryAccess,
1596
- directoryAccessApprovalRequest,
1597
- callDescription,
1598
- presentationSnapshot
1599
- );
1600
- return { ...manualResult, args: validatedArgs, presentationSnapshot };
1601
- }
1602
- /**
1603
- * Try to resolve tool approval quickly based on policies and cached permissions.
1604
- * Returns null if manual approval is needed.
1605
- *
1606
- * Precedence order (highest to lowest):
1607
- * 1. Directory access requirement (outside-root paths)
1608
- * 2. Session auto-approve (skill allowed-tools)
1609
- * 3. Static allow list
1610
- * 4. Dynamic "remembered" allowed list
1611
- * 5. Tool approval patterns
1612
- * 6. Approval mode (auto-approve/auto-deny)
1613
- */
1614
- async tryQuickApprovalResolution(toolName, args, sessionId, directoryAccess) {
1615
- if (directoryAccess) {
1616
- if (this.approvalMode === "auto-approve") {
1617
- await this.approvalManager.addApprovedDirectory(
1618
- directoryAccess.parentDir,
1619
- "once",
1620
- sessionId
1621
- );
1622
- return { requireApproval: false };
1623
- }
1624
- return null;
1625
- }
1626
- if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
1627
- this.logger.info(
1628
- `Tool '${toolName}' is in session's auto-approve list \u2013 skipping confirmation (session: ${sessionId})`
1629
- );
1630
- return { requireApproval: false };
1631
- }
1632
- if (this.isInAlwaysAllowList(toolName)) {
1633
- this.logger.info(
1634
- `Tool '${toolName}' is in static allow list \u2013 skipping confirmation (session: ${sessionId ?? "global"})`
1635
- );
1636
- return { requireApproval: false };
1637
- }
1638
- if (await this.allowedToolsProvider.isToolAllowed(toolName, sessionId)) {
1639
- this.logger.info(
1640
- `Tool '${toolName}' already allowed for session '${sessionId ?? "global"}' \u2013 skipping confirmation.`
1641
- );
1642
- return { requireApproval: false };
1643
- }
1644
- const patternKey = this.getToolPatternKey(toolName, args);
1645
- if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey, sessionId)) {
1646
- this.logger.info(
1647
- `Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
1648
- );
1649
- return { requireApproval: false };
1650
- }
1651
- if (this.approvalMode === "auto-approve") {
1652
- this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
1653
- return { requireApproval: false };
1654
- }
1655
- if (this.approvalMode === "auto-deny") {
1656
- this.logger.debug(`\u{1F6AB} Auto-denying tool execution: ${toolName}`);
1657
- throw import_errors.ToolError.executionDenied(toolName, sessionId);
1658
- }
1659
- return null;
1660
- }
1661
- /**
1662
- * Request manual approval from the user for a tool execution.
1663
- * Generates preview, sends approval request, and handles the response.
1664
- */
1665
- async requestManualApproval(toolName, args, toolCallId, sessionId, runContext, directoryAccess, directoryAccessApprovalRequest, callDescription, presentationSnapshot) {
1666
- this.logger.info(
1667
- `Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
1668
- );
1669
- try {
1670
- const displayPreview = await this.generateToolPreview(
1671
- toolName,
1672
- args,
1673
- toolCallId,
1674
- sessionId,
1675
- runContext
1676
- );
1677
- const hostRuntime = runContext?.hostRuntime ?? directoryAccessApprovalRequest?.hostRuntime;
1678
- const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
1679
- const response = await this.approvalManager.requestToolApproval({
1680
- toolName,
1681
- ...presentationSnapshot !== void 0 && { presentationSnapshot },
1682
- toolCallId,
1683
- args,
1684
- ...callDescription !== void 0 && { description: callDescription },
1685
- ...sessionId !== void 0 && { sessionId },
1686
- ...hostRuntime !== void 0 && { hostRuntime },
1687
- ...displayPreview !== void 0 && { displayPreview },
1688
- ...directoryAccess !== void 0 && { directoryAccess },
1689
- ...suggestedPatterns !== void 0 && { suggestedPatterns }
1690
- });
1691
- if (response.status === import_types3.ApprovalStatus.APPROVED && directoryAccessApprovalRequest !== void 0) {
1692
- const onGranted = this.getToolApprovalOnGrantedFn(toolName);
1693
- if (onGranted) {
1694
- const context = this.buildToolExecutionContext({
1695
- sessionId,
1696
- toolCallId,
1697
- runContext
1698
- });
1699
- await Promise.resolve(
1700
- onGranted(response, context, directoryAccessApprovalRequest)
1701
- );
1702
- }
1703
- }
1704
- if (response.status === import_types3.ApprovalStatus.APPROVED && response.data) {
1705
- await this.handleRememberChoice(toolName, response, sessionId);
1706
- }
1707
- if (response.status !== import_types3.ApprovalStatus.APPROVED) {
1708
- this.handleApprovalDenied(toolName, response, sessionId);
1709
- }
1710
- this.logger.info(
1711
- `Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
1712
- );
1713
- return { requireApproval: true, approvalStatus: "approved" };
1714
- } catch (error) {
1715
- this.logger.error(
1716
- `Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
1717
- );
1718
- throw error;
1719
- }
1720
- }
1721
- /**
1722
- * Generate a preview for the tool approval UI if the tool supports it.
1723
- */
1724
- async generateToolPreview(toolName, args, toolCallId, sessionId, runContext) {
1725
- const previewFn = this.getToolPreviewFn(toolName);
1726
- if (!previewFn) {
1727
- return void 0;
1728
- }
1729
- try {
1730
- const context = this.buildToolExecutionContext({ sessionId, toolCallId, runContext });
1731
- const preview = await previewFn(args, context);
1732
- this.logger.debug(`Generated preview for ${toolName}`);
1733
- return preview ?? void 0;
1734
- } catch (previewError) {
1735
- if (previewError instanceof import_errors2.DextoRuntimeError && previewError.code === import_error_codes.ToolErrorCode.VALIDATION_FAILED) {
1736
- this.logger.debug(`Validation failed for ${toolName}: ${previewError.message}`);
1737
- throw previewError;
1738
- }
1739
- this.logger.debug(
1740
- `Preview generation failed for ${toolName}: ${previewError instanceof Error ? previewError.message : String(previewError)}`
1741
- );
1742
- return void 0;
1743
- }
1744
- }
1745
1800
  /**
1746
1801
  * Handle "remember" actions when user approves a tool.
1747
1802
  */
@@ -1773,12 +1828,12 @@ let _ToolManager = class _ToolManager {
1773
1828
  handleApprovalDenied(toolName, response, sessionId) {
1774
1829
  if (response.status === import_types3.ApprovalStatus.CANCELLED && response.reason === import_types3.DenialReason.TIMEOUT) {
1775
1830
  this.logger.info(
1776
- `Tool confirmation timed out for ${toolName}, sessionId: ${sessionId ?? "global"}`
1831
+ `Tool approval timed out for ${toolName}, sessionId: ${sessionId ?? "global"}`
1777
1832
  );
1778
1833
  throw import_errors.ToolError.executionTimeout(toolName, response.timeoutMs ?? 0, sessionId);
1779
1834
  }
1780
1835
  this.logger.info(
1781
- `Tool confirmation denied for ${toolName}, sessionId: ${sessionId ?? "global"}, reason: ${response.reason ?? "unknown"}`
1836
+ `Tool approval denied for ${toolName}, sessionId: ${sessionId ?? "global"}, reason: ${response.reason ?? "unknown"}`
1782
1837
  );
1783
1838
  throw import_errors.ToolError.executionDenied(toolName, sessionId, response.message);
1784
1839
  }
@@ -1791,24 +1846,6 @@ let _ToolManager = class _ToolManager {
1791
1846
  this.invalidateCache();
1792
1847
  this.logger.debug("ToolManager refreshed (including MCP server capabilities)");
1793
1848
  }
1794
- /**
1795
- * Get list of pending confirmation requests
1796
- */
1797
- getPendingConfirmations() {
1798
- return this.approvalManager.getPendingApprovals();
1799
- }
1800
- /**
1801
- * Cancel a pending confirmation request
1802
- */
1803
- cancelConfirmation(approvalId) {
1804
- this.approvalManager.cancelApproval(approvalId);
1805
- }
1806
- /**
1807
- * Cancel all pending confirmation requests
1808
- */
1809
- cancelAllConfirmations() {
1810
- this.approvalManager.cancelAllApprovals();
1811
- }
1812
1849
  };
1813
1850
  _init = __decoratorStart(null);
1814
1851
  _ToolManager = __decorateElement(_init, 0, "ToolManager", _ToolManager_decorators, _ToolManager);