@dexto/core 1.5.8 → 1.6.1

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 (658) hide show
  1. package/README.md +19 -8
  2. package/dist/agent/DextoAgent.cjs +318 -159
  3. package/dist/agent/DextoAgent.d.ts +94 -56
  4. package/dist/agent/DextoAgent.d.ts.map +1 -1
  5. package/dist/agent/DextoAgent.js +315 -156
  6. package/dist/{context/compaction/provider.cjs → agent/agent-options.cjs} +2 -2
  7. package/dist/agent/agent-options.d.ts +53 -0
  8. package/dist/agent/agent-options.d.ts.map +1 -0
  9. package/dist/agent/agentCard.cjs +1 -1
  10. package/dist/agent/errors.cjs +2 -2
  11. package/dist/agent/errors.d.ts.map +1 -1
  12. package/dist/agent/index.cjs +1 -6
  13. package/dist/agent/index.d.ts +3 -2
  14. package/dist/agent/index.d.ts.map +1 -1
  15. package/dist/agent/index.js +1 -7
  16. package/dist/{storage/blob/provider.cjs → agent/runtime-config.cjs} +2 -2
  17. package/dist/agent/runtime-config.d.ts +53 -0
  18. package/dist/agent/runtime-config.d.ts.map +1 -0
  19. package/dist/agent/schemas.cjs +2 -104
  20. package/dist/agent/schemas.d.ts +8 -9197
  21. package/dist/agent/schemas.d.ts.map +1 -1
  22. package/dist/agent/schemas.js +1 -109
  23. package/dist/agent/state-manager.d.ts +5 -5
  24. package/dist/agent/state-manager.d.ts.map +1 -1
  25. package/dist/approval/error-codes.cjs +1 -1
  26. package/dist/approval/error-codes.d.ts +1 -1
  27. package/dist/approval/error-codes.d.ts.map +1 -1
  28. package/dist/approval/error-codes.js +1 -1
  29. package/dist/approval/errors.cjs +5 -5
  30. package/dist/approval/errors.d.ts +2 -2
  31. package/dist/approval/errors.d.ts.map +1 -1
  32. package/dist/approval/errors.js +5 -5
  33. package/dist/approval/index.cjs +8 -8
  34. package/dist/approval/index.d.ts +2 -2
  35. package/dist/approval/index.d.ts.map +1 -1
  36. package/dist/approval/index.js +8 -8
  37. package/dist/approval/manager.cjs +163 -83
  38. package/dist/approval/manager.d.ts +50 -43
  39. package/dist/approval/manager.d.ts.map +1 -1
  40. package/dist/approval/manager.js +161 -81
  41. package/dist/approval/schemas.cjs +47 -32
  42. package/dist/approval/schemas.d.ts +291 -97
  43. package/dist/approval/schemas.d.ts.map +1 -1
  44. package/dist/approval/schemas.js +43 -28
  45. package/dist/approval/types.cjs +1 -1
  46. package/dist/approval/types.d.ts +14 -14
  47. package/dist/approval/types.d.ts.map +1 -1
  48. package/dist/approval/types.js +1 -1
  49. package/dist/context/compaction/index.cjs +2 -23
  50. package/dist/context/compaction/index.d.ts +1 -7
  51. package/dist/context/compaction/index.d.ts.map +1 -1
  52. package/dist/context/compaction/index.js +1 -16
  53. package/dist/context/compaction/strategies/noop.cjs +19 -1
  54. package/dist/context/compaction/strategies/noop.d.ts +13 -3
  55. package/dist/context/compaction/strategies/noop.d.ts.map +1 -1
  56. package/dist/context/compaction/strategies/noop.js +19 -1
  57. package/dist/context/compaction/strategies/{reactive-overflow.cjs → reactive-overflow-compaction.cjs} +67 -64
  58. package/dist/context/compaction/strategies/{reactive-overflow.d.ts → reactive-overflow-compaction.d.ts} +19 -36
  59. package/dist/context/compaction/strategies/reactive-overflow-compaction.d.ts.map +1 -0
  60. package/dist/context/compaction/strategies/{reactive-overflow.js → reactive-overflow-compaction.js} +63 -60
  61. package/dist/context/compaction/types.d.ts +40 -8
  62. package/dist/context/compaction/types.d.ts.map +1 -1
  63. package/dist/context/manager.cjs +4 -2
  64. package/dist/context/manager.d.ts +5 -3
  65. package/dist/context/manager.d.ts.map +1 -1
  66. package/dist/context/manager.js +4 -2
  67. package/dist/context/types.d.ts +3 -0
  68. package/dist/context/types.d.ts.map +1 -1
  69. package/dist/context/utils.cjs +2 -2
  70. package/dist/context/utils.d.ts +14 -14
  71. package/dist/context/utils.d.ts.map +1 -1
  72. package/dist/errors/result-bridge.d.ts +2 -2
  73. package/dist/errors/result-bridge.d.ts.map +1 -1
  74. package/dist/errors/types.cjs +1 -1
  75. package/dist/errors/types.d.ts +3 -3
  76. package/dist/errors/types.d.ts.map +1 -1
  77. package/dist/errors/types.js +1 -1
  78. package/dist/events/index.cjs +11 -1
  79. package/dist/events/index.d.ts +48 -7
  80. package/dist/events/index.d.ts.map +1 -1
  81. package/dist/events/index.js +11 -1
  82. package/dist/{plugins → hooks}/builtins/content-policy.cjs +7 -6
  83. package/dist/hooks/builtins/content-policy.d.ts +24 -0
  84. package/dist/hooks/builtins/content-policy.d.ts.map +1 -0
  85. package/dist/{plugins → hooks}/builtins/content-policy.js +6 -5
  86. package/dist/{plugins → hooks}/builtins/response-sanitizer.cjs +3 -3
  87. package/dist/hooks/builtins/response-sanitizer.d.ts +22 -0
  88. package/dist/hooks/builtins/response-sanitizer.d.ts.map +1 -0
  89. package/dist/{plugins → hooks}/builtins/response-sanitizer.js +2 -2
  90. package/dist/hooks/error-codes.cjs +43 -0
  91. package/dist/hooks/error-codes.d.ts +34 -0
  92. package/dist/hooks/error-codes.d.ts.map +1 -0
  93. package/dist/hooks/error-codes.js +20 -0
  94. package/dist/{storage/cache/providers/memory.cjs → hooks/index.cjs} +15 -18
  95. package/dist/hooks/index.d.ts +14 -0
  96. package/dist/hooks/index.d.ts.map +1 -0
  97. package/dist/hooks/index.js +11 -0
  98. package/dist/hooks/manager.cjs +354 -0
  99. package/dist/hooks/manager.d.ts +103 -0
  100. package/dist/hooks/manager.d.ts.map +1 -0
  101. package/dist/hooks/manager.js +331 -0
  102. package/dist/{plugins → hooks}/types.d.ts +26 -45
  103. package/dist/hooks/types.d.ts.map +1 -0
  104. package/dist/index.browser.cjs +13 -12
  105. package/dist/index.browser.d.ts +5 -5
  106. package/dist/index.browser.d.ts.map +1 -1
  107. package/dist/index.browser.js +8 -7
  108. package/dist/index.cjs +5 -7
  109. package/dist/index.d.ts +2 -3
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -3
  112. package/dist/llm/errors.cjs +1 -1
  113. package/dist/llm/executor/stream-processor.cjs +131 -11
  114. package/dist/llm/executor/stream-processor.d.ts +8 -5
  115. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  116. package/dist/llm/executor/stream-processor.js +131 -11
  117. package/dist/llm/executor/turn-executor.cjs +49 -54
  118. package/dist/llm/executor/turn-executor.d.ts +7 -8
  119. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  120. package/dist/llm/executor/turn-executor.js +49 -54
  121. package/dist/llm/formatters/vercel.cjs +2 -2
  122. package/dist/llm/formatters/vercel.d.ts +2 -2
  123. package/dist/llm/formatters/vercel.d.ts.map +1 -1
  124. package/dist/llm/providers/local/schemas.d.ts +12 -12
  125. package/dist/llm/registry/auto-update.d.ts +2 -2
  126. package/dist/llm/registry/auto-update.d.ts.map +1 -1
  127. package/dist/llm/registry/index.d.ts +3 -3
  128. package/dist/llm/registry/index.d.ts.map +1 -1
  129. package/dist/llm/resolver.cjs +2 -2
  130. package/dist/llm/resolver.d.ts +4 -4
  131. package/dist/llm/resolver.d.ts.map +1 -1
  132. package/dist/llm/schemas.cjs +67 -104
  133. package/dist/llm/schemas.d.ts +10 -149
  134. package/dist/llm/schemas.d.ts.map +1 -1
  135. package/dist/llm/schemas.js +64 -101
  136. package/dist/llm/services/factory.cjs +2 -3
  137. package/dist/llm/services/factory.d.ts +3 -4
  138. package/dist/llm/services/factory.d.ts.map +1 -1
  139. package/dist/llm/services/factory.js +2 -3
  140. package/dist/llm/services/vercel.cjs +8 -15
  141. package/dist/llm/services/vercel.d.ts +6 -7
  142. package/dist/llm/services/vercel.d.ts.map +1 -1
  143. package/dist/llm/services/vercel.js +8 -15
  144. package/dist/llm/validation.cjs +1 -1
  145. package/dist/llm/validation.d.ts +2 -2
  146. package/dist/llm/validation.d.ts.map +1 -1
  147. package/dist/logger/browser.cjs +4 -4
  148. package/dist/logger/browser.d.ts +4 -4
  149. package/dist/logger/browser.d.ts.map +1 -1
  150. package/dist/logger/browser.js +3 -3
  151. package/dist/{context/compaction/providers/noop-provider.cjs → logger/default-logger-factory.cjs} +16 -22
  152. package/dist/logger/default-logger-factory.d.ts +301 -0
  153. package/dist/logger/default-logger-factory.d.ts.map +1 -0
  154. package/dist/logger/default-logger-factory.js +18 -0
  155. package/dist/logger/factory.d.ts +2 -2
  156. package/dist/logger/factory.d.ts.map +1 -1
  157. package/dist/logger/index.cjs +7 -2
  158. package/dist/logger/index.d.ts +5 -3
  159. package/dist/logger/index.d.ts.map +1 -1
  160. package/dist/logger/index.js +8 -2
  161. package/dist/logger/logger.cjs +4 -4
  162. package/dist/logger/logger.d.ts +4 -4
  163. package/dist/logger/logger.d.ts.map +1 -1
  164. package/dist/logger/logger.js +3 -3
  165. package/dist/logger/v2/dexto-logger.cjs +35 -0
  166. package/dist/logger/v2/dexto-logger.d.ts +22 -3
  167. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  168. package/dist/logger/v2/dexto-logger.js +35 -0
  169. package/dist/logger/v2/schemas.d.ts +6 -6
  170. package/dist/logger/v2/test-utils.cjs +2 -0
  171. package/dist/logger/v2/test-utils.d.ts +5 -5
  172. package/dist/logger/v2/test-utils.d.ts.map +1 -1
  173. package/dist/logger/v2/test-utils.js +2 -0
  174. package/dist/logger/v2/transport-factory.d.ts +3 -3
  175. package/dist/logger/v2/transport-factory.d.ts.map +1 -1
  176. package/dist/logger/v2/transports/console-transport.d.ts +2 -2
  177. package/dist/logger/v2/transports/console-transport.d.ts.map +1 -1
  178. package/dist/logger/v2/transports/file-transport.d.ts +2 -2
  179. package/dist/logger/v2/transports/file-transport.d.ts.map +1 -1
  180. package/dist/logger/v2/transports/silent-transport.d.ts +2 -2
  181. package/dist/logger/v2/transports/silent-transport.d.ts.map +1 -1
  182. package/dist/logger/v2/types.cjs +1 -1
  183. package/dist/logger/v2/types.d.ts +22 -9
  184. package/dist/logger/v2/types.d.ts.map +1 -1
  185. package/dist/logger/v2/types.js +1 -1
  186. package/dist/mcp/errors.cjs +2 -2
  187. package/dist/mcp/errors.d.ts.map +1 -1
  188. package/dist/mcp/manager.cjs +16 -11
  189. package/dist/mcp/manager.d.ts +16 -13
  190. package/dist/mcp/manager.d.ts.map +1 -1
  191. package/dist/mcp/manager.js +17 -12
  192. package/dist/mcp/mcp-client.cjs +25 -20
  193. package/dist/mcp/mcp-client.d.ts +5 -5
  194. package/dist/mcp/mcp-client.d.ts.map +1 -1
  195. package/dist/mcp/mcp-client.js +20 -15
  196. package/dist/mcp/resolver.cjs +1 -1
  197. package/dist/mcp/schemas.cjs +5 -5
  198. package/dist/mcp/schemas.d.ts +19 -19
  199. package/dist/mcp/schemas.js +2 -2
  200. package/dist/mcp/types.d.ts +7 -7
  201. package/dist/mcp/types.d.ts.map +1 -1
  202. package/dist/memory/manager.d.ts +2 -2
  203. package/dist/memory/manager.d.ts.map +1 -1
  204. package/dist/memory/schemas.d.ts +2 -2
  205. package/dist/prompts/errors.cjs +3 -3
  206. package/dist/prompts/errors.d.ts.map +1 -1
  207. package/dist/prompts/prompt-manager.d.ts +3 -3
  208. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  209. package/dist/prompts/providers/config-prompt-provider.cjs +15 -29
  210. package/dist/prompts/providers/config-prompt-provider.d.ts +3 -3
  211. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  212. package/dist/prompts/providers/config-prompt-provider.js +15 -29
  213. package/dist/prompts/providers/custom-prompt-provider.d.ts +2 -2
  214. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  215. package/dist/prompts/providers/mcp-prompt-provider.d.ts +2 -2
  216. package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
  217. package/dist/prompts/schemas.d.ts +7 -7
  218. package/dist/resources/{internal-provider.cjs → agent-resources-provider.cjs} +16 -16
  219. package/dist/resources/{internal-provider.d.ts → agent-resources-provider.d.ts} +6 -6
  220. package/dist/resources/agent-resources-provider.d.ts.map +1 -0
  221. package/dist/resources/{internal-provider.js → agent-resources-provider.js} +13 -13
  222. package/dist/resources/errors.cjs +2 -2
  223. package/dist/resources/errors.d.ts.map +1 -1
  224. package/dist/resources/handlers/blob-handler.d.ts +2 -2
  225. package/dist/resources/handlers/blob-handler.d.ts.map +1 -1
  226. package/dist/resources/handlers/factory.d.ts +3 -3
  227. package/dist/resources/handlers/factory.d.ts.map +1 -1
  228. package/dist/resources/handlers/filesystem-handler.d.ts +2 -2
  229. package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
  230. package/dist/resources/index.cjs +7 -9
  231. package/dist/resources/index.d.ts +3 -3
  232. package/dist/resources/index.d.ts.map +1 -1
  233. package/dist/resources/index.js +5 -10
  234. package/dist/resources/manager.cjs +77 -74
  235. package/dist/resources/manager.d.ts +16 -7
  236. package/dist/resources/manager.d.ts.map +1 -1
  237. package/dist/resources/manager.js +77 -74
  238. package/dist/resources/schemas.cjs +6 -26
  239. package/dist/resources/schemas.d.ts +8 -100
  240. package/dist/resources/schemas.d.ts.map +1 -1
  241. package/dist/resources/schemas.js +4 -23
  242. package/dist/search/search-service.d.ts +2 -2
  243. package/dist/search/search-service.d.ts.map +1 -1
  244. package/dist/session/chat-session.cjs +15 -25
  245. package/dist/session/chat-session.d.ts +7 -5
  246. package/dist/session/chat-session.d.ts.map +1 -1
  247. package/dist/session/chat-session.js +16 -26
  248. package/dist/session/errors.cjs +2 -2
  249. package/dist/session/errors.d.ts.map +1 -1
  250. package/dist/session/history/database.cjs +1 -1
  251. package/dist/session/history/database.d.ts +4 -4
  252. package/dist/session/history/database.d.ts.map +1 -1
  253. package/dist/session/history/factory.d.ts +3 -3
  254. package/dist/session/history/factory.d.ts.map +1 -1
  255. package/dist/session/history/memory.d.ts +4 -4
  256. package/dist/session/history/memory.d.ts.map +1 -1
  257. package/dist/session/history/types.d.ts +2 -2
  258. package/dist/session/history/types.d.ts.map +1 -1
  259. package/dist/session/index.cjs +3 -0
  260. package/dist/session/index.d.ts +2 -0
  261. package/dist/session/index.d.ts.map +1 -1
  262. package/dist/session/index.js +2 -0
  263. package/dist/session/message-queue.d.ts +2 -2
  264. package/dist/session/message-queue.d.ts.map +1 -1
  265. package/dist/session/session-manager.cjs +67 -9
  266. package/dist/session/session-manager.d.ts +46 -7
  267. package/dist/session/session-manager.d.ts.map +1 -1
  268. package/dist/session/session-manager.js +67 -9
  269. package/dist/session/title-generator.cjs +2 -2
  270. package/dist/session/title-generator.d.ts +2 -2
  271. package/dist/session/title-generator.d.ts.map +1 -1
  272. package/dist/storage/blob/index.cjs +0 -40
  273. package/dist/storage/blob/index.d.ts +2 -44
  274. package/dist/storage/blob/index.d.ts.map +1 -1
  275. package/dist/storage/blob/index.js +0 -30
  276. package/dist/storage/cache/index.cjs +0 -37
  277. package/dist/storage/cache/index.d.ts +0 -42
  278. package/dist/storage/cache/index.d.ts.map +1 -1
  279. package/dist/storage/cache/index.js +0 -28
  280. package/dist/storage/database/index.cjs +0 -42
  281. package/dist/storage/database/index.d.ts +0 -43
  282. package/dist/storage/database/index.d.ts.map +1 -1
  283. package/dist/storage/database/index.js +0 -37
  284. package/dist/storage/error-codes.cjs +1 -6
  285. package/dist/storage/error-codes.d.ts +2 -7
  286. package/dist/storage/error-codes.d.ts.map +1 -1
  287. package/dist/storage/error-codes.js +1 -6
  288. package/dist/storage/errors.cjs +18 -82
  289. package/dist/storage/errors.d.ts +4 -24
  290. package/dist/storage/errors.d.ts.map +1 -1
  291. package/dist/storage/errors.js +16 -80
  292. package/dist/storage/index.cjs +8 -69
  293. package/dist/storage/index.d.ts +11 -66
  294. package/dist/storage/index.d.ts.map +1 -1
  295. package/dist/storage/index.js +6 -50
  296. package/dist/storage/storage-manager.cjs +9 -25
  297. package/dist/storage/storage-manager.d.ts +11 -15
  298. package/dist/storage/storage-manager.d.ts.map +1 -1
  299. package/dist/storage/storage-manager.js +8 -23
  300. package/dist/storage/types.d.ts +0 -1
  301. package/dist/storage/types.d.ts.map +1 -1
  302. package/dist/systemPrompt/contributors.d.ts +4 -4
  303. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  304. package/dist/systemPrompt/errors.cjs +2 -2
  305. package/dist/systemPrompt/errors.d.ts.map +1 -1
  306. package/dist/systemPrompt/in-built-prompts.cjs +5 -5
  307. package/dist/systemPrompt/in-built-prompts.d.ts +1 -1
  308. package/dist/systemPrompt/in-built-prompts.d.ts.map +1 -1
  309. package/dist/systemPrompt/in-built-prompts.js +5 -5
  310. package/dist/systemPrompt/manager.cjs +1 -5
  311. package/dist/systemPrompt/manager.d.ts +2 -3
  312. package/dist/systemPrompt/manager.d.ts.map +1 -1
  313. package/dist/systemPrompt/manager.js +1 -5
  314. package/dist/systemPrompt/schemas.d.ts +5 -5
  315. package/dist/systemPrompt/types.d.ts +11 -0
  316. package/dist/systemPrompt/types.d.ts.map +1 -1
  317. package/dist/telemetry/index.cjs +3 -0
  318. package/dist/telemetry/index.d.ts +2 -0
  319. package/dist/telemetry/index.d.ts.map +1 -1
  320. package/dist/telemetry/index.js +2 -0
  321. package/dist/telemetry/utils.d.ts +4 -4
  322. package/dist/telemetry/utils.d.ts.map +1 -1
  323. package/dist/test-utils/in-memory-storage.cjs +288 -0
  324. package/dist/test-utils/in-memory-storage.js +252 -0
  325. package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts +3 -3
  326. package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts.map +1 -1
  327. package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts +2 -2
  328. package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts.map +1 -1
  329. package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts +4 -4
  330. package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts.map +1 -1
  331. package/dist/tools/confirmation/allowed-tools-provider/types.d.ts +2 -2
  332. package/dist/tools/confirmation/allowed-tools-provider/types.d.ts.map +1 -1
  333. package/dist/tools/{internal-tools/constants.cjs → define-tool.cjs} +8 -13
  334. package/dist/tools/define-tool.d.ts +11 -0
  335. package/dist/tools/define-tool.d.ts.map +1 -0
  336. package/dist/tools/define-tool.js +7 -0
  337. package/dist/tools/display-types.d.ts +10 -0
  338. package/dist/tools/display-types.d.ts.map +1 -1
  339. package/dist/tools/error-codes.cjs +2 -2
  340. package/dist/tools/error-codes.d.ts +2 -2
  341. package/dist/tools/error-codes.d.ts.map +1 -1
  342. package/dist/tools/error-codes.js +2 -2
  343. package/dist/tools/errors.cjs +11 -23
  344. package/dist/tools/errors.d.ts +4 -10
  345. package/dist/tools/errors.d.ts.map +1 -1
  346. package/dist/tools/errors.js +9 -21
  347. package/dist/tools/index.cjs +6 -9
  348. package/dist/tools/index.d.ts +3 -4
  349. package/dist/tools/index.d.ts.map +1 -1
  350. package/dist/tools/index.js +3 -7
  351. package/dist/{storage/blob/providers/index.cjs → tools/pattern-utils.cjs} +11 -9
  352. package/dist/tools/pattern-utils.d.ts +20 -0
  353. package/dist/tools/pattern-utils.d.ts.map +1 -0
  354. package/dist/tools/pattern-utils.js +10 -0
  355. package/dist/{storage/cache/factory.cjs → tools/presentation.cjs} +26 -15
  356. package/dist/tools/presentation.d.ts +11 -0
  357. package/dist/tools/presentation.d.ts.map +1 -0
  358. package/dist/tools/presentation.js +24 -0
  359. package/dist/tools/schemas.cjs +14 -40
  360. package/dist/tools/schemas.d.ts +6 -50
  361. package/dist/tools/schemas.d.ts.map +1 -1
  362. package/dist/tools/schemas.js +11 -32
  363. package/dist/tools/tool-call-metadata.cjs +3 -3
  364. package/dist/tools/tool-call-metadata.d.ts +1 -1
  365. package/dist/tools/tool-call-metadata.d.ts.map +1 -1
  366. package/dist/tools/tool-call-metadata.js +3 -3
  367. package/dist/tools/tool-manager.cjs +608 -392
  368. package/dist/tools/tool-manager.d.ts +79 -98
  369. package/dist/tools/tool-manager.d.ts.map +1 -1
  370. package/dist/tools/tool-manager.js +608 -396
  371. package/dist/tools/types.d.ts +223 -45
  372. package/dist/tools/types.d.ts.map +1 -1
  373. package/dist/utils/error-conversion.d.ts +2 -2
  374. package/dist/utils/error-conversion.d.ts.map +1 -1
  375. package/dist/utils/path.cjs +10 -1
  376. package/dist/utils/path.d.ts +7 -4
  377. package/dist/utils/path.d.ts.map +1 -1
  378. package/dist/utils/path.js +10 -1
  379. package/dist/utils/result.cjs +1 -1
  380. package/dist/utils/result.d.ts.map +1 -1
  381. package/dist/utils/schema.cjs +9 -5
  382. package/dist/utils/schema.d.ts +4 -2
  383. package/dist/utils/schema.d.ts.map +1 -1
  384. package/dist/utils/schema.js +9 -5
  385. package/dist/utils/service-initializer.cjs +51 -56
  386. package/dist/utils/service-initializer.d.ts +17 -14
  387. package/dist/utils/service-initializer.d.ts.map +1 -1
  388. package/dist/utils/service-initializer.js +51 -56
  389. package/dist/{storage/cache/providers/index.cjs → workspace/error-codes.cjs} +8 -9
  390. package/dist/workspace/error-codes.d.ts +5 -0
  391. package/dist/workspace/error-codes.d.ts.map +1 -0
  392. package/dist/workspace/error-codes.js +7 -0
  393. package/dist/{storage/blob/factory.cjs → workspace/errors.cjs} +20 -14
  394. package/dist/workspace/errors.d.ts +5 -0
  395. package/dist/workspace/errors.d.ts.map +1 -0
  396. package/dist/workspace/errors.js +21 -0
  397. package/dist/{image → workspace}/index.cjs +12 -10
  398. package/dist/workspace/index.d.ts +5 -0
  399. package/dist/workspace/index.d.ts.map +1 -0
  400. package/dist/workspace/index.js +9 -0
  401. package/dist/workspace/manager.cjs +113 -0
  402. package/dist/workspace/manager.d.ts +18 -0
  403. package/dist/workspace/manager.d.ts.map +1 -0
  404. package/dist/workspace/manager.js +90 -0
  405. package/dist/workspace/types.d.ts +14 -0
  406. package/dist/workspace/types.d.ts.map +1 -0
  407. package/package.json +2 -2
  408. package/dist/context/compaction/factory.cjs +0 -57
  409. package/dist/context/compaction/factory.d.ts +0 -17
  410. package/dist/context/compaction/factory.d.ts.map +0 -1
  411. package/dist/context/compaction/factory.js +0 -34
  412. package/dist/context/compaction/provider.d.ts +0 -48
  413. package/dist/context/compaction/provider.d.ts.map +0 -1
  414. package/dist/context/compaction/providers/noop-provider.d.ts +0 -24
  415. package/dist/context/compaction/providers/noop-provider.d.ts.map +0 -1
  416. package/dist/context/compaction/providers/noop-provider.js +0 -24
  417. package/dist/context/compaction/providers/reactive-overflow-provider.cjs +0 -76
  418. package/dist/context/compaction/providers/reactive-overflow-provider.d.ts +0 -51
  419. package/dist/context/compaction/providers/reactive-overflow-provider.d.ts.map +0 -1
  420. package/dist/context/compaction/providers/reactive-overflow-provider.js +0 -52
  421. package/dist/context/compaction/registry.cjs +0 -39
  422. package/dist/context/compaction/registry.d.ts +0 -19
  423. package/dist/context/compaction/registry.d.ts.map +0 -1
  424. package/dist/context/compaction/registry.js +0 -16
  425. package/dist/context/compaction/schemas.cjs +0 -58
  426. package/dist/context/compaction/schemas.d.ts +0 -69
  427. package/dist/context/compaction/schemas.d.ts.map +0 -1
  428. package/dist/context/compaction/schemas.js +0 -34
  429. package/dist/context/compaction/strategies/reactive-overflow.d.ts.map +0 -1
  430. package/dist/image/define-image.cjs +0 -146
  431. package/dist/image/define-image.d.ts +0 -71
  432. package/dist/image/define-image.d.ts.map +0 -1
  433. package/dist/image/define-image.js +0 -121
  434. package/dist/image/index.d.ts +0 -53
  435. package/dist/image/index.d.ts.map +0 -1
  436. package/dist/image/index.js +0 -7
  437. package/dist/image/types.d.ts +0 -246
  438. package/dist/image/types.d.ts.map +0 -1
  439. package/dist/llm/services/test-utils.integration.cjs +0 -237
  440. package/dist/llm/services/test-utils.integration.d.ts +0 -48
  441. package/dist/llm/services/test-utils.integration.d.ts.map +0 -1
  442. package/dist/llm/services/test-utils.integration.js +0 -214
  443. package/dist/plugins/builtins/content-policy.d.ts +0 -26
  444. package/dist/plugins/builtins/content-policy.d.ts.map +0 -1
  445. package/dist/plugins/builtins/response-sanitizer.d.ts +0 -25
  446. package/dist/plugins/builtins/response-sanitizer.d.ts.map +0 -1
  447. package/dist/plugins/error-codes.cjs +0 -43
  448. package/dist/plugins/error-codes.d.ts +0 -34
  449. package/dist/plugins/error-codes.d.ts.map +0 -1
  450. package/dist/plugins/error-codes.js +0 -20
  451. package/dist/plugins/index.cjs +0 -61
  452. package/dist/plugins/index.d.ts +0 -21
  453. package/dist/plugins/index.d.ts.map +0 -1
  454. package/dist/plugins/index.js +0 -30
  455. package/dist/plugins/loader.cjs +0 -171
  456. package/dist/plugins/loader.d.ts +0 -30
  457. package/dist/plugins/loader.d.ts.map +0 -1
  458. package/dist/plugins/loader.js +0 -145
  459. package/dist/plugins/manager.cjs +0 -473
  460. package/dist/plugins/manager.d.ts +0 -106
  461. package/dist/plugins/manager.d.ts.map +0 -1
  462. package/dist/plugins/manager.js +0 -450
  463. package/dist/plugins/registrations/builtins.cjs +0 -51
  464. package/dist/plugins/registrations/builtins.d.ts +0 -17
  465. package/dist/plugins/registrations/builtins.d.ts.map +0 -1
  466. package/dist/plugins/registrations/builtins.js +0 -28
  467. package/dist/plugins/registry.cjs +0 -63
  468. package/dist/plugins/registry.d.ts +0 -101
  469. package/dist/plugins/registry.d.ts.map +0 -1
  470. package/dist/plugins/registry.js +0 -39
  471. package/dist/plugins/schemas.cjs +0 -73
  472. package/dist/plugins/schemas.d.ts +0 -195
  473. package/dist/plugins/schemas.d.ts.map +0 -1
  474. package/dist/plugins/schemas.js +0 -47
  475. package/dist/plugins/types.d.ts.map +0 -1
  476. package/dist/providers/base-registry.cjs +0 -147
  477. package/dist/providers/base-registry.d.ts +0 -147
  478. package/dist/providers/base-registry.d.ts.map +0 -1
  479. package/dist/providers/base-registry.js +0 -123
  480. package/dist/providers/discovery.cjs +0 -109
  481. package/dist/providers/discovery.d.ts +0 -96
  482. package/dist/providers/discovery.d.ts.map +0 -1
  483. package/dist/providers/discovery.js +0 -84
  484. package/dist/providers/index.cjs +0 -24
  485. package/dist/providers/index.d.ts +0 -32
  486. package/dist/providers/index.d.ts.map +0 -1
  487. package/dist/providers/index.js +0 -2
  488. package/dist/resources/internal-provider.d.ts.map +0 -1
  489. package/dist/storage/blob/factory.d.ts +0 -37
  490. package/dist/storage/blob/factory.d.ts.map +0 -1
  491. package/dist/storage/blob/factory.js +0 -15
  492. package/dist/storage/blob/local-blob-store.cjs +0 -496
  493. package/dist/storage/blob/local-blob-store.d.ts +0 -58
  494. package/dist/storage/blob/local-blob-store.d.ts.map +0 -1
  495. package/dist/storage/blob/local-blob-store.js +0 -463
  496. package/dist/storage/blob/memory-blob-store.cjs +0 -326
  497. package/dist/storage/blob/memory-blob-store.d.ts +0 -66
  498. package/dist/storage/blob/memory-blob-store.d.ts.map +0 -1
  499. package/dist/storage/blob/memory-blob-store.js +0 -303
  500. package/dist/storage/blob/provider.d.ts +0 -50
  501. package/dist/storage/blob/provider.d.ts.map +0 -1
  502. package/dist/storage/blob/providers/index.d.ts +0 -8
  503. package/dist/storage/blob/providers/index.d.ts.map +0 -1
  504. package/dist/storage/blob/providers/index.js +0 -7
  505. package/dist/storage/blob/providers/local.cjs +0 -39
  506. package/dist/storage/blob/providers/local.d.ts +0 -17
  507. package/dist/storage/blob/providers/local.d.ts.map +0 -1
  508. package/dist/storage/blob/providers/local.js +0 -16
  509. package/dist/storage/blob/providers/memory.cjs +0 -39
  510. package/dist/storage/blob/providers/memory.d.ts +0 -17
  511. package/dist/storage/blob/providers/memory.d.ts.map +0 -1
  512. package/dist/storage/blob/providers/memory.js +0 -16
  513. package/dist/storage/blob/registry.cjs +0 -50
  514. package/dist/storage/blob/registry.d.ts +0 -42
  515. package/dist/storage/blob/registry.d.ts.map +0 -1
  516. package/dist/storage/blob/registry.js +0 -26
  517. package/dist/storage/blob/schemas.cjs +0 -52
  518. package/dist/storage/blob/schemas.d.ts +0 -85
  519. package/dist/storage/blob/schemas.d.ts.map +0 -1
  520. package/dist/storage/blob/schemas.js +0 -26
  521. package/dist/storage/cache/factory.d.ts +0 -37
  522. package/dist/storage/cache/factory.d.ts.map +0 -1
  523. package/dist/storage/cache/factory.js +0 -15
  524. package/dist/storage/cache/memory-cache-store.cjs +0 -107
  525. package/dist/storage/cache/memory-cache-store.d.ts +0 -26
  526. package/dist/storage/cache/memory-cache-store.d.ts.map +0 -1
  527. package/dist/storage/cache/memory-cache-store.js +0 -84
  528. package/dist/storage/cache/provider.cjs +0 -16
  529. package/dist/storage/cache/provider.d.ts +0 -56
  530. package/dist/storage/cache/provider.d.ts.map +0 -1
  531. package/dist/storage/cache/provider.js +0 -0
  532. package/dist/storage/cache/providers/index.d.ts +0 -8
  533. package/dist/storage/cache/providers/index.d.ts.map +0 -1
  534. package/dist/storage/cache/providers/index.js +0 -7
  535. package/dist/storage/cache/providers/memory.d.ts +0 -17
  536. package/dist/storage/cache/providers/memory.d.ts.map +0 -1
  537. package/dist/storage/cache/providers/memory.js +0 -17
  538. package/dist/storage/cache/providers/redis.cjs +0 -66
  539. package/dist/storage/cache/providers/redis.d.ts +0 -20
  540. package/dist/storage/cache/providers/redis.d.ts.map +0 -1
  541. package/dist/storage/cache/providers/redis.js +0 -33
  542. package/dist/storage/cache/redis-store.cjs +0 -173
  543. package/dist/storage/cache/redis-store.d.ts +0 -32
  544. package/dist/storage/cache/redis-store.d.ts.map +0 -1
  545. package/dist/storage/cache/redis-store.js +0 -150
  546. package/dist/storage/cache/registry.cjs +0 -50
  547. package/dist/storage/cache/registry.d.ts +0 -42
  548. package/dist/storage/cache/registry.d.ts.map +0 -1
  549. package/dist/storage/cache/registry.js +0 -26
  550. package/dist/storage/cache/schemas.cjs +0 -81
  551. package/dist/storage/cache/schemas.d.ts +0 -150
  552. package/dist/storage/cache/schemas.d.ts.map +0 -1
  553. package/dist/storage/cache/schemas.js +0 -55
  554. package/dist/storage/database/factory.cjs +0 -38
  555. package/dist/storage/database/factory.d.ts +0 -39
  556. package/dist/storage/database/factory.d.ts.map +0 -1
  557. package/dist/storage/database/factory.js +0 -15
  558. package/dist/storage/database/memory-database-store.cjs +0 -122
  559. package/dist/storage/database/memory-database-store.d.ts +0 -29
  560. package/dist/storage/database/memory-database-store.d.ts.map +0 -1
  561. package/dist/storage/database/memory-database-store.js +0 -99
  562. package/dist/storage/database/postgres-store.cjs +0 -342
  563. package/dist/storage/database/postgres-store.d.ts +0 -55
  564. package/dist/storage/database/postgres-store.d.ts.map +0 -1
  565. package/dist/storage/database/postgres-store.js +0 -319
  566. package/dist/storage/database/provider.cjs +0 -16
  567. package/dist/storage/database/provider.d.ts +0 -56
  568. package/dist/storage/database/provider.d.ts.map +0 -1
  569. package/dist/storage/database/provider.js +0 -0
  570. package/dist/storage/database/providers/index.cjs +0 -34
  571. package/dist/storage/database/providers/index.d.ts +0 -9
  572. package/dist/storage/database/providers/index.d.ts.map +0 -1
  573. package/dist/storage/database/providers/index.js +0 -9
  574. package/dist/storage/database/providers/memory.cjs +0 -40
  575. package/dist/storage/database/providers/memory.d.ts +0 -16
  576. package/dist/storage/database/providers/memory.d.ts.map +0 -1
  577. package/dist/storage/database/providers/memory.js +0 -17
  578. package/dist/storage/database/providers/postgres.cjs +0 -62
  579. package/dist/storage/database/providers/postgres.d.ts +0 -19
  580. package/dist/storage/database/providers/postgres.d.ts.map +0 -1
  581. package/dist/storage/database/providers/postgres.js +0 -29
  582. package/dist/storage/database/providers/sqlite.cjs +0 -66
  583. package/dist/storage/database/providers/sqlite.d.ts +0 -20
  584. package/dist/storage/database/providers/sqlite.d.ts.map +0 -1
  585. package/dist/storage/database/providers/sqlite.js +0 -33
  586. package/dist/storage/database/registry.cjs +0 -50
  587. package/dist/storage/database/registry.d.ts +0 -42
  588. package/dist/storage/database/registry.d.ts.map +0 -1
  589. package/dist/storage/database/registry.js +0 -26
  590. package/dist/storage/database/schemas.cjs +0 -97
  591. package/dist/storage/database/schemas.d.ts +0 -226
  592. package/dist/storage/database/schemas.d.ts.map +0 -1
  593. package/dist/storage/database/schemas.js +0 -70
  594. package/dist/storage/database/sqlite-store.cjs +0 -270
  595. package/dist/storage/database/sqlite-store.d.ts +0 -33
  596. package/dist/storage/database/sqlite-store.d.ts.map +0 -1
  597. package/dist/storage/database/sqlite-store.js +0 -237
  598. package/dist/storage/schemas.cjs +0 -57
  599. package/dist/storage/schemas.d.ts +0 -347
  600. package/dist/storage/schemas.d.ts.map +0 -1
  601. package/dist/storage/schemas.js +0 -37
  602. package/dist/tools/bash-pattern-utils.cjs +0 -91
  603. package/dist/tools/bash-pattern-utils.d.ts +0 -58
  604. package/dist/tools/bash-pattern-utils.d.ts.map +0 -1
  605. package/dist/tools/bash-pattern-utils.js +0 -64
  606. package/dist/tools/custom-tool-registry.cjs +0 -64
  607. package/dist/tools/custom-tool-registry.d.ts +0 -126
  608. package/dist/tools/custom-tool-registry.d.ts.map +0 -1
  609. package/dist/tools/custom-tool-registry.js +0 -40
  610. package/dist/tools/custom-tool-schema-registry.cjs +0 -164
  611. package/dist/tools/custom-tool-schema-registry.d.ts +0 -86
  612. package/dist/tools/custom-tool-schema-registry.d.ts.map +0 -1
  613. package/dist/tools/custom-tool-schema-registry.js +0 -140
  614. package/dist/tools/internal-tools/constants.d.ts +0 -12
  615. package/dist/tools/internal-tools/constants.d.ts.map +0 -1
  616. package/dist/tools/internal-tools/constants.js +0 -12
  617. package/dist/tools/internal-tools/implementations/ask-user-tool.cjs +0 -57
  618. package/dist/tools/internal-tools/implementations/ask-user-tool.d.ts +0 -18
  619. package/dist/tools/internal-tools/implementations/ask-user-tool.d.ts.map +0 -1
  620. package/dist/tools/internal-tools/implementations/ask-user-tool.js +0 -34
  621. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.cjs +0 -192
  622. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.d.ts +0 -33
  623. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.d.ts.map +0 -1
  624. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.js +0 -169
  625. package/dist/tools/internal-tools/implementations/get-resource-tool.cjs +0 -113
  626. package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts +0 -30
  627. package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts.map +0 -1
  628. package/dist/tools/internal-tools/implementations/get-resource-tool.js +0 -90
  629. package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +0 -140
  630. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +0 -24
  631. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +0 -1
  632. package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +0 -117
  633. package/dist/tools/internal-tools/implementations/list-resources-tool.cjs +0 -91
  634. package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts +0 -24
  635. package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts.map +0 -1
  636. package/dist/tools/internal-tools/implementations/list-resources-tool.js +0 -68
  637. package/dist/tools/internal-tools/implementations/search-history-tool.cjs +0 -61
  638. package/dist/tools/internal-tools/implementations/search-history-tool.d.ts +0 -7
  639. package/dist/tools/internal-tools/implementations/search-history-tool.d.ts.map +0 -1
  640. package/dist/tools/internal-tools/implementations/search-history-tool.js +0 -38
  641. package/dist/tools/internal-tools/index.cjs +0 -26
  642. package/dist/tools/internal-tools/index.d.ts +0 -4
  643. package/dist/tools/internal-tools/index.d.ts.map +0 -1
  644. package/dist/tools/internal-tools/index.js +0 -3
  645. package/dist/tools/internal-tools/provider.cjs +0 -324
  646. package/dist/tools/internal-tools/provider.d.ts +0 -116
  647. package/dist/tools/internal-tools/provider.d.ts.map +0 -1
  648. package/dist/tools/internal-tools/provider.js +0 -301
  649. package/dist/tools/internal-tools/registry.cjs +0 -71
  650. package/dist/tools/internal-tools/registry.d.ts +0 -91
  651. package/dist/tools/internal-tools/registry.d.ts.map +0 -1
  652. package/dist/tools/internal-tools/registry.js +0 -47
  653. /package/dist/{context/compaction/provider.js → agent/agent-options.js} +0 -0
  654. /package/dist/{image/types.js → agent/runtime-config.js} +0 -0
  655. /package/dist/{image → hooks}/types.cjs +0 -0
  656. /package/dist/{plugins → hooks}/types.js +0 -0
  657. /package/dist/{plugins → workspace}/types.cjs +0 -0
  658. /package/dist/{storage/blob/provider.js → workspace/types.js} +0 -0
@@ -66,42 +66,42 @@ __export(tool_manager_exports, {
66
66
  ToolManager: () => ToolManager
67
67
  });
68
68
  module.exports = __toCommonJS(tool_manager_exports);
69
- var import_provider = require("./internal-tools/provider.js");
70
69
  var import_errors = require("./errors.js");
71
70
  var import_error_codes = require("./error-codes.js");
72
71
  var import_errors2 = require("../errors/index.js");
73
72
  var import_types2 = require("../logger/v2/types.js");
73
+ var import_schema = require("../utils/schema.js");
74
74
  var import_types3 = require("../approval/types.js");
75
75
  var import_decorators = require("../telemetry/decorators.js");
76
76
  var import_tool_call_metadata = require("./tool-call-metadata.js");
77
- var import_bash_pattern_utils = require("./bash-pattern-utils.js");
78
77
  var import_env = require("../utils/env.js");
79
78
  var _ToolManager_decorators, _init;
80
79
  _ToolManager_decorators = [(0, import_decorators.InstrumentClass)({
81
80
  prefix: "tool",
82
- excludeMethods: [
83
- "setPluginManager",
84
- "setStateManager",
85
- "getApprovalManager",
86
- "getAllowedToolsProvider"
87
- ]
81
+ excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
88
82
  })];
89
83
  let _ToolManager = class _ToolManager {
90
84
  mcpManager;
91
- internalToolsProvider;
85
+ agentTools = /* @__PURE__ */ new Map();
92
86
  approvalManager;
93
87
  allowedToolsProvider;
94
88
  approvalMode;
95
89
  agentEventBus;
96
90
  toolPolicies;
97
- // Plugin support - set after construction to avoid circular dependencies
98
- pluginManager;
91
+ toolExecutionContextFactory;
92
+ contributorContextFactory;
93
+ // Hook support - set after construction to avoid circular dependencies
94
+ hookManager;
99
95
  sessionManager;
100
96
  stateManager;
101
- // Tool source prefixing - ALL tools get prefixed by source
97
+ workspaceManager;
98
+ currentWorkspace;
99
+ workspaceListenerAttached = false;
100
+ workspaceListenerAbort = new AbortController();
101
+ // Tool naming:
102
+ // - MCP tools are prefixed with `mcp--` for disambiguation.
103
+ // - Local tools use their `Tool.id` as-is (no internal/custom prefixing).
102
104
  static MCP_TOOL_PREFIX = "mcp--";
103
- static INTERNAL_TOOL_PREFIX = "internal--";
104
- static CUSTOM_TOOL_PREFIX = "custom--";
105
105
  // Tool caching for performance
106
106
  toolsCache = {};
107
107
  cacheValid = false;
@@ -114,7 +114,29 @@ let _ToolManager = class _ToolManager {
114
114
  sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
115
115
  sessionDisabledTools = /* @__PURE__ */ new Map();
116
116
  globalDisabledTools = [];
117
- constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, options, logger) {
117
+ cleanupHandlers = /* @__PURE__ */ new Set();
118
+ cleanupStarted = false;
119
+ resolveLocalToolIdOrAlias(name) {
120
+ const direct = this.agentTools.get(name);
121
+ if (direct) return direct.id;
122
+ const lower = name.toLowerCase();
123
+ for (const tool of this.agentTools.values()) {
124
+ if (tool.id.toLowerCase() === lower) {
125
+ return tool.id;
126
+ }
127
+ if (tool.aliases?.some((alias) => alias.toLowerCase() === lower)) {
128
+ return tool.id;
129
+ }
130
+ }
131
+ return null;
132
+ }
133
+ normalizeToolPolicyPattern(pattern) {
134
+ if (pattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
135
+ return pattern;
136
+ }
137
+ return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
138
+ }
139
+ constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger) {
118
140
  this.mcpManager = mcpManager;
119
141
  this.approvalManager = approvalManager;
120
142
  this.allowedToolsProvider = allowedToolsProvider;
@@ -122,18 +144,12 @@ let _ToolManager = class _ToolManager {
122
144
  this.agentEventBus = agentEventBus;
123
145
  this.toolPolicies = toolPolicies;
124
146
  this.logger = logger.createChild(import_types2.DextoLogComponent.TOOLS);
125
- if (options?.internalToolsConfig && options.internalToolsConfig.length > 0 || options?.customToolsConfig && options.customToolsConfig.length > 0) {
126
- const internalToolsServices = {
127
- ...options.internalToolsServices,
128
- approvalManager
129
- };
130
- this.internalToolsProvider = new import_provider.InternalToolsProvider(
131
- internalToolsServices,
132
- options.internalToolsConfig || [],
133
- options.customToolsConfig || [],
134
- this.logger
147
+ this.setTools(tools);
148
+ this.toolExecutionContextFactory = () => {
149
+ throw import_errors.ToolError.configInvalid(
150
+ "ToolExecutionContextFactory not configured. DextoAgent.start() must configure tool execution context before tools can run."
135
151
  );
136
- }
152
+ };
137
153
  this.setupNotificationListeners();
138
154
  this.logger.debug("ToolManager initialized");
139
155
  }
@@ -141,50 +157,78 @@ let _ToolManager = class _ToolManager {
141
157
  * Initialize the ToolManager and its components
142
158
  */
143
159
  async initialize() {
144
- if (this.internalToolsProvider) {
145
- await this.internalToolsProvider.initialize();
146
- }
147
160
  this.logger.debug("ToolManager initialization complete");
148
161
  }
162
+ setTools(tools) {
163
+ this.agentTools.clear();
164
+ for (const tool of tools) {
165
+ this.agentTools.set(tool.id, tool);
166
+ }
167
+ this.invalidateCache();
168
+ }
169
+ setToolExecutionContextFactory(factory) {
170
+ this.toolExecutionContextFactory = factory;
171
+ }
172
+ registerCleanup(handler) {
173
+ this.cleanupHandlers.add(handler);
174
+ }
175
+ async cleanup() {
176
+ if (this.cleanupStarted) {
177
+ return;
178
+ }
179
+ this.cleanupStarted = true;
180
+ for (const handler of this.cleanupHandlers) {
181
+ try {
182
+ await handler();
183
+ } catch (error) {
184
+ const err = error instanceof Error ? error : new Error(String(error));
185
+ this.logger.warn(`ToolManager cleanup handler failed: ${err.message}`, {
186
+ color: "yellow"
187
+ });
188
+ }
189
+ }
190
+ }
149
191
  /**
150
- * Set plugin support services (called after construction to avoid circular dependencies)
192
+ * Set hook support services (called after construction to avoid circular dependencies)
151
193
  */
152
- setPluginSupport(pluginManager, sessionManager, stateManager) {
153
- this.pluginManager = pluginManager;
194
+ setHookSupport(hookManager, sessionManager, stateManager) {
195
+ this.hookManager = hookManager;
154
196
  this.sessionManager = sessionManager;
155
197
  this.stateManager = stateManager;
156
- this.logger.debug("Plugin support configured for ToolManager");
198
+ this.logger.debug("Hook support configured for ToolManager");
157
199
  }
158
200
  /**
159
- * Set agent reference for custom tools (called after construction to avoid circular dependencies)
160
- * Must be called before initialize() if custom tools are configured
201
+ * Set workspace manager for tool execution context propagation.
161
202
  */
162
- setAgent(agent) {
163
- if (this.internalToolsProvider) {
164
- this.internalToolsProvider.setAgent(agent);
165
- this.logger.debug("Agent reference configured for custom tools");
203
+ setWorkspaceManager(workspaceManager) {
204
+ this.workspaceManager = workspaceManager;
205
+ void this.refreshWorkspace();
206
+ if (!this.workspaceListenerAttached) {
207
+ this.workspaceListenerAttached = true;
208
+ this.agentEventBus.on(
209
+ "workspace:changed",
210
+ (payload) => {
211
+ this.currentWorkspace = payload.workspace ?? void 0;
212
+ },
213
+ { signal: this.workspaceListenerAbort.signal }
214
+ );
215
+ this.registerCleanup(() => {
216
+ if (!this.workspaceListenerAbort.signal.aborted) {
217
+ this.workspaceListenerAbort.abort();
218
+ }
219
+ });
166
220
  }
221
+ this.logger.debug("WorkspaceManager reference configured for ToolManager");
167
222
  }
168
- /**
169
- * Set prompt manager for invoke_skill tool (called after construction to avoid circular dependencies)
170
- * Must be called before initialize() if invoke_skill tool is enabled
171
- */
172
- setPromptManager(promptManager) {
173
- if (this.internalToolsProvider) {
174
- this.internalToolsProvider.setPromptManager(promptManager);
175
- this.logger.debug("PromptManager reference configured for invoke_skill tool");
223
+ async refreshWorkspace() {
224
+ if (!this.workspaceManager) {
225
+ return;
176
226
  }
177
- }
178
- /**
179
- * Set task forker for context:fork skill execution (late-binding)
180
- * Called by agent-spawner custom tool provider after RuntimeService is created.
181
- * This enables invoke_skill to fork execution to an isolated subagent.
182
- */
183
- setTaskForker(taskForker) {
184
- if (this.internalToolsProvider) {
185
- this.internalToolsProvider.setTaskForker(taskForker);
227
+ try {
228
+ this.currentWorkspace = await this.workspaceManager.getWorkspace();
229
+ } catch (error) {
186
230
  this.logger.debug(
187
- "TaskForker reference configured for invoke_skill (context:fork support)"
231
+ `Failed to refresh workspace context: ${error instanceof Error ? error.message : String(error)}`
188
232
  );
189
233
  }
190
234
  }
@@ -195,18 +239,21 @@ let _ToolManager = class _ToolManager {
195
239
  * This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
196
240
  *
197
241
  * @param sessionId The session ID
198
- * @param autoApproveTools Array of tool names to auto-approve (e.g., ['custom--bash_exec', 'custom--read_file'])
242
+ * @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
199
243
  */
200
244
  setSessionAutoApproveTools(sessionId, autoApproveTools) {
201
245
  if (autoApproveTools.length === 0) {
202
246
  this.clearSessionAutoApproveTools(sessionId);
203
247
  return;
204
248
  }
205
- this.sessionAutoApproveTools.set(sessionId, autoApproveTools);
249
+ const normalized = autoApproveTools.map(
250
+ (pattern) => this.normalizeToolPolicyPattern(pattern)
251
+ );
252
+ this.sessionAutoApproveTools.set(sessionId, normalized);
206
253
  this.logger.info(
207
254
  `Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
208
255
  );
209
- this.logger.debug(`Auto-approve tools: ${autoApproveTools.join(", ")}`);
256
+ this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
210
257
  }
211
258
  /**
212
259
  * Set session-level auto-approve tools chosen by the user.
@@ -216,11 +263,14 @@ let _ToolManager = class _ToolManager {
216
263
  this.clearSessionUserAutoApproveTools(sessionId);
217
264
  return;
218
265
  }
219
- this.sessionUserAutoApproveTools.set(sessionId, autoApproveTools);
266
+ const normalized = autoApproveTools.map(
267
+ (pattern) => this.normalizeToolPolicyPattern(pattern)
268
+ );
269
+ this.sessionUserAutoApproveTools.set(sessionId, normalized);
220
270
  this.logger.info(
221
271
  `Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
222
272
  );
223
- this.logger.debug(`User auto-approve tools: ${autoApproveTools.join(", ")}`);
273
+ this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
224
274
  }
225
275
  /**
226
276
  * Clear session-level auto-approve tools chosen by the user.
@@ -397,39 +447,203 @@ let _ToolManager = class _ToolManager {
397
447
  }
398
448
  });
399
449
  }
400
- // ==================== Bash Pattern Approval Helpers ====================
401
- /**
402
- * Check if a tool name represents a bash execution tool
403
- */
404
- isBashTool(toolName) {
405
- return toolName === "bash_exec" || toolName === "internal--bash_exec" || toolName === "custom--bash_exec";
450
+ // ==================== Pattern Approval Helpers ====================
451
+ getToolApprovalPatternKeyFn(toolName) {
452
+ const tool = this.agentTools.get(toolName);
453
+ return tool?.approval?.patternKey;
406
454
  }
407
- /**
408
- * Check if a bash command is covered by any approved pattern.
409
- * Generates a pattern key from the command, then checks if it's covered by stored patterns.
410
- *
411
- * Returns approval info if covered, or pattern suggestions if not.
412
- */
413
- checkBashPatternApproval(command) {
414
- const patternKey = (0, import_bash_pattern_utils.generateBashPatternKey)(command);
415
- if (!patternKey) {
416
- if ((0, import_bash_pattern_utils.isDangerousCommand)(command)) {
417
- this.logger.debug(
418
- `Skipping pattern generation for dangerous command: ${command.split(/\s+/)[0]}`
419
- );
455
+ getToolSuggestApprovalPatternsFn(toolName) {
456
+ const tool = this.agentTools.get(toolName);
457
+ return tool?.approval?.suggestPatterns;
458
+ }
459
+ getToolApprovalOverrideFn(toolName) {
460
+ const tool = this.agentTools.get(toolName);
461
+ return tool?.approval?.override;
462
+ }
463
+ getToolApprovalOnGrantedFn(toolName) {
464
+ const tool = this.agentTools.get(toolName);
465
+ return tool?.approval?.onGranted;
466
+ }
467
+ getToolPreviewFn(toolName) {
468
+ const tool = this.agentTools.get(toolName);
469
+ return tool?.presentation?.preview;
470
+ }
471
+ getToolDescribeHeaderFn(toolName) {
472
+ const tool = this.agentTools.get(toolName);
473
+ return tool?.presentation?.describeHeader;
474
+ }
475
+ getToolDescribeArgsFn(toolName) {
476
+ const tool = this.agentTools.get(toolName);
477
+ return tool?.presentation?.describeArgs;
478
+ }
479
+ getToolDescribeResultFn(toolName) {
480
+ const tool = this.agentTools.get(toolName);
481
+ return tool?.presentation?.describeResult;
482
+ }
483
+ buildGenericToolPresentationSnapshot(toolName) {
484
+ const toTitleCase = (name) => name.replace(/[_-]+/g, " ").split(" ").filter(Boolean).map((part) => part.charAt(0).toUpperCase() + part.slice(1)).join(" ");
485
+ const isMcp = toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX);
486
+ const fallbackTitle = (() => {
487
+ if (!isMcp) {
488
+ return toTitleCase(toolName);
489
+ }
490
+ const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
491
+ const parts = actualToolName.split("--");
492
+ const toolPart = parts.length >= 2 ? parts.slice(1).join("--") : actualToolName;
493
+ return toTitleCase(toolPart);
494
+ })();
495
+ const snapshot = {
496
+ version: 1,
497
+ source: {
498
+ type: toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) ? "mcp" : "local"
499
+ },
500
+ header: {
501
+ title: fallbackTitle
502
+ }
503
+ };
504
+ if (snapshot.source?.type === "mcp") {
505
+ const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
506
+ const parts = actualToolName.split("--");
507
+ if (parts.length >= 2 && parts[0]) {
508
+ snapshot.source.mcpServerName = parts[0];
420
509
  }
421
- return { approved: false, suggestedPatterns: [] };
422
510
  }
423
- if (this.approvalManager.matchesBashPattern(patternKey)) {
424
- return { approved: true };
511
+ return snapshot;
512
+ }
513
+ getToolPresentationSnapshotForToolCallEvent(toolName, args, toolCallId, sessionId) {
514
+ const fallback = this.buildGenericToolPresentationSnapshot(toolName);
515
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
516
+ return fallback;
517
+ }
518
+ const describeHeader = this.getToolDescribeHeaderFn(toolName);
519
+ const describeArgs = this.getToolDescribeArgsFn(toolName);
520
+ if (!describeHeader && !describeArgs) {
521
+ return fallback;
522
+ }
523
+ try {
524
+ const validatedArgs = this.validateLocalToolArgs(toolName, args);
525
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
526
+ const isPromiseLike = (value) => {
527
+ if (typeof value !== "object" || value === null) {
528
+ return false;
529
+ }
530
+ return typeof value.then === "function";
531
+ };
532
+ let nextSnapshot = fallback;
533
+ if (describeHeader) {
534
+ const header = describeHeader(validatedArgs, context);
535
+ if (!isPromiseLike(header) && header) {
536
+ nextSnapshot = {
537
+ ...nextSnapshot,
538
+ header: { ...nextSnapshot.header, ...header }
539
+ };
540
+ }
541
+ }
542
+ if (describeArgs) {
543
+ const argsPresentation = describeArgs(validatedArgs, context);
544
+ if (!isPromiseLike(argsPresentation) && argsPresentation) {
545
+ nextSnapshot = {
546
+ ...nextSnapshot,
547
+ args: argsPresentation
548
+ };
549
+ }
550
+ }
551
+ return nextSnapshot;
552
+ } catch (error) {
553
+ this.logger.debug(
554
+ `Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
555
+ );
556
+ return fallback;
557
+ }
558
+ }
559
+ async getToolPresentationSnapshotForCall(toolName, args, toolCallId, sessionId) {
560
+ const fallback = this.buildGenericToolPresentationSnapshot(toolName);
561
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
562
+ return fallback;
563
+ }
564
+ const describeHeader = this.getToolDescribeHeaderFn(toolName);
565
+ const describeArgs = this.getToolDescribeArgsFn(toolName);
566
+ if (!describeHeader && !describeArgs) {
567
+ return fallback;
568
+ }
569
+ try {
570
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
571
+ const describedHeader = describeHeader ? await Promise.resolve(describeHeader(args, context)) : null;
572
+ const describedArgs = describeArgs ? await Promise.resolve(describeArgs(args, context)) : null;
573
+ return {
574
+ ...fallback,
575
+ ...describedHeader ? { header: { ...fallback.header, ...describedHeader } } : {},
576
+ ...describedArgs ? { args: describedArgs } : {}
577
+ };
578
+ } catch (error) {
579
+ this.logger.debug(
580
+ `Tool presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
581
+ );
582
+ return fallback;
583
+ }
584
+ }
585
+ async augmentSnapshotWithResult(toolName, snapshot, result, args, toolCallId, sessionId) {
586
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
587
+ return snapshot;
588
+ }
589
+ const describeResult = this.getToolDescribeResultFn(toolName);
590
+ if (!describeResult) {
591
+ return snapshot;
592
+ }
593
+ try {
594
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
595
+ const resultPresentation = await Promise.resolve(describeResult(result, args, context));
596
+ if (!resultPresentation) {
597
+ return snapshot;
598
+ }
599
+ return {
600
+ ...snapshot,
601
+ result: resultPresentation
602
+ };
603
+ } catch (error) {
604
+ this.logger.debug(
605
+ `Tool result presentation snapshot generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
606
+ );
607
+ return snapshot;
608
+ }
609
+ }
610
+ getToolPatternKey(toolName, args) {
611
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
612
+ return null;
613
+ }
614
+ const getPatternKey = this.getToolApprovalPatternKeyFn(toolName);
615
+ if (!getPatternKey) {
616
+ return null;
617
+ }
618
+ try {
619
+ return getPatternKey(args);
620
+ } catch (error) {
621
+ this.logger.debug(
622
+ `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
623
+ );
624
+ return null;
625
+ }
626
+ }
627
+ getToolSuggestedPatterns(toolName, args) {
628
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
629
+ return void 0;
630
+ }
631
+ const suggestPatterns = this.getToolSuggestApprovalPatternsFn(toolName);
632
+ if (!suggestPatterns) {
633
+ return void 0;
634
+ }
635
+ try {
636
+ const patterns = suggestPatterns(args);
637
+ return patterns.length > 0 ? patterns : void 0;
638
+ } catch (error) {
639
+ this.logger.debug(
640
+ `Pattern suggestion failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
641
+ );
642
+ return void 0;
425
643
  }
426
- return {
427
- approved: false,
428
- suggestedPatterns: (0, import_bash_pattern_utils.generateBashPatternSuggestions)(command)
429
- };
430
644
  }
431
645
  /**
432
- * Auto-approve pending tool confirmation requests for the same tool.
646
+ * Auto-approve pending tool approval requests for the same tool.
433
647
  * Called after a user selects "remember choice" for a tool.
434
648
  * This handles the case where parallel tool calls come in before the first one is approved.
435
649
  *
@@ -439,14 +653,13 @@ let _ToolManager = class _ToolManager {
439
653
  autoApprovePendingToolRequests(toolName, sessionId) {
440
654
  const count = this.approvalManager.autoApprovePendingRequests(
441
655
  (request) => {
442
- if (request.type !== import_types3.ApprovalType.TOOL_CONFIRMATION) {
656
+ if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
443
657
  return false;
444
658
  }
445
659
  if (request.sessionId !== sessionId) {
446
660
  return false;
447
661
  }
448
- const metadata = request.metadata;
449
- return metadata.toolName === toolName;
662
+ return request.metadata.toolName === toolName;
450
663
  },
451
664
  { rememberChoice: false }
452
665
  // Don't propagate remember choice to auto-approved requests
@@ -458,48 +671,86 @@ let _ToolManager = class _ToolManager {
458
671
  }
459
672
  }
460
673
  /**
461
- * Auto-approve pending bash command requests that match a pattern.
462
- * Called after a user selects "remember pattern" for a bash command.
463
- * This handles the case where parallel bash commands come in before the first one is approved.
464
- *
465
- * @param pattern The bash pattern that was just remembered
466
- * @param sessionId The session ID for context
674
+ * Auto-approve pending tool approval requests that are now covered by a remembered pattern.
675
+ * Called after a user selects "remember pattern" for a tool.
467
676
  */
468
- autoApprovePendingBashRequests(pattern, sessionId) {
677
+ autoApprovePendingPatternRequests(toolName, sessionId) {
678
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
679
+ return;
680
+ }
681
+ const getPatternKey = this.getToolApprovalPatternKeyFn(toolName);
682
+ if (!getPatternKey) {
683
+ return;
684
+ }
469
685
  const count = this.approvalManager.autoApprovePendingRequests(
470
686
  (request) => {
471
- if (request.type !== import_types3.ApprovalType.TOOL_CONFIRMATION) {
687
+ if (request.type !== import_types3.ApprovalType.TOOL_APPROVAL) {
472
688
  return false;
473
689
  }
474
690
  if (request.sessionId !== sessionId) {
475
691
  return false;
476
692
  }
477
- const metadata = request.metadata;
478
- if (!this.isBashTool(metadata.toolName)) {
693
+ if (request.metadata.toolName !== toolName) {
479
694
  return false;
480
695
  }
481
- const command = metadata.args?.command;
482
- if (!command) {
696
+ const args = request.metadata.args;
697
+ if (typeof args !== "object" || args === null) {
483
698
  return false;
484
699
  }
485
- const patternKey = (0, import_bash_pattern_utils.generateBashPatternKey)(command);
486
- if (!patternKey) {
700
+ const argsRecord = args;
701
+ let patternKey;
702
+ try {
703
+ patternKey = getPatternKey(argsRecord);
704
+ } catch (error) {
705
+ this.logger.debug(
706
+ `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
707
+ );
487
708
  return false;
488
709
  }
489
- return this.approvalManager.matchesBashPattern(patternKey);
710
+ if (!patternKey) return false;
711
+ return this.approvalManager.matchesPattern(toolName, patternKey);
490
712
  },
491
713
  { rememberPattern: void 0 }
492
- // Don't propagate pattern to auto-approved requests
714
+ // Don't propagate pattern choice to auto-approved requests
493
715
  );
494
716
  if (count > 0) {
495
717
  this.logger.info(
496
- `Auto-approved ${count} parallel bash command(s) matching pattern '${pattern}'`
718
+ `Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember pattern"`
497
719
  );
498
720
  }
499
721
  }
500
722
  getMcpManager() {
501
723
  return this.mcpManager;
502
724
  }
725
+ setContributorContextFactory(factory) {
726
+ this.contributorContextFactory = factory ?? void 0;
727
+ }
728
+ async buildContributorContext() {
729
+ const baseWorkspace = this.currentWorkspace ?? null;
730
+ const baseContext = {
731
+ mcpManager: this.mcpManager,
732
+ workspace: baseWorkspace
733
+ };
734
+ if (!this.contributorContextFactory) {
735
+ return baseContext;
736
+ }
737
+ try {
738
+ const overrides = await this.contributorContextFactory() ?? {};
739
+ const workspace = overrides.workspace !== void 0 ? overrides.workspace : baseWorkspace;
740
+ const environment = overrides.environment !== void 0 ? overrides.environment : baseContext.environment;
741
+ const mcpManager = overrides.mcpManager ?? baseContext.mcpManager;
742
+ return {
743
+ mcpManager,
744
+ workspace,
745
+ ...environment !== void 0 ? { environment } : {}
746
+ };
747
+ } catch (error) {
748
+ this.logger.warn(
749
+ `Failed to build contributor context: ${error instanceof Error ? error.message : String(error)}`
750
+ );
751
+ return baseContext;
752
+ }
753
+ }
503
754
  /**
504
755
  * Get all MCP tools (delegates to mcpManager.getAllTools())
505
756
  * This provides access to MCP tools while maintaining separation of concerns
@@ -507,11 +758,66 @@ let _ToolManager = class _ToolManager {
507
758
  async getMcpTools() {
508
759
  return await this.mcpManager.getAllTools();
509
760
  }
761
+ buildToolExecutionContext(options) {
762
+ const workspace = this.currentWorkspace;
763
+ const baseContext = {
764
+ sessionId: options.sessionId,
765
+ workspaceId: workspace?.id,
766
+ workspace,
767
+ abortSignal: options.abortSignal,
768
+ toolCallId: options.toolCallId,
769
+ logger: this.logger
770
+ };
771
+ return this.toolExecutionContextFactory(baseContext);
772
+ }
773
+ validateLocalToolArgs(toolName, args) {
774
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
775
+ return args;
776
+ }
777
+ const tool = this.agentTools.get(toolName);
778
+ if (!tool) {
779
+ return args;
780
+ }
781
+ const validationResult = tool.inputSchema.safeParse(args);
782
+ if (!validationResult.success) {
783
+ this.logger.error(
784
+ `\u274C Invalid arguments for tool ${toolName}: ${validationResult.error.message}`
785
+ );
786
+ throw import_errors.ToolError.validationFailed(
787
+ toolName,
788
+ `Invalid arguments: ${validationResult.error.message}`
789
+ );
790
+ }
791
+ const validated = validationResult.data;
792
+ if (typeof validated !== "object" || validated === null || Array.isArray(validated)) {
793
+ throw import_errors.ToolError.validationFailed(toolName, "Invalid arguments: expected an object");
794
+ }
795
+ return validated;
796
+ }
797
+ async executeLocalTool(toolName, args, sessionId, abortSignal, toolCallId) {
798
+ const tool = this.agentTools.get(toolName);
799
+ if (!tool) {
800
+ this.logger.error(`\u274C No local tool found: ${toolName}`);
801
+ this.logger.debug(
802
+ `Available local tools: ${Array.from(this.agentTools.keys()).join(", ")}`
803
+ );
804
+ throw import_errors.ToolError.notFound(toolName);
805
+ }
806
+ try {
807
+ const context = this.buildToolExecutionContext({ sessionId, abortSignal, toolCallId });
808
+ const result = await tool.execute(args, context);
809
+ return result;
810
+ } catch (error) {
811
+ this.logger.error(`\u274C Local tool execution failed: ${toolName}`, {
812
+ error: error instanceof Error ? error.message : String(error)
813
+ });
814
+ throw error;
815
+ }
816
+ }
510
817
  /**
511
- * Build all tools from sources with universal prefixing
512
- * ALL tools get prefixed by their source - no exceptions
818
+ * Build all tools from sources.
513
819
  *
514
- * TODO: Rethink tool naming convention for more consistency
820
+ * TODO: Rethink MCP tool naming convention for more consistency.
515
821
  * Current issue: MCP tools have dynamic naming based on conflicts:
516
822
  * - No conflict: mcp--toolName
517
823
  * - With conflict: mcp--serverName--toolName
@@ -524,8 +830,6 @@ let _ToolManager = class _ToolManager {
524
830
  async buildAllTools() {
525
831
  const allTools = {};
526
832
  let mcpTools = {};
527
- let internalTools = {};
528
- let customTools = {};
529
833
  try {
530
834
  mcpTools = await this.mcpManager.getAllTools();
531
835
  } catch (error) {
@@ -534,38 +838,13 @@ let _ToolManager = class _ToolManager {
534
838
  );
535
839
  mcpTools = {};
536
840
  }
537
- try {
538
- internalTools = this.internalToolsProvider?.getInternalTools() || {};
539
- } catch (error) {
540
- this.logger.error(
541
- `Failed to get internal tools: ${error instanceof Error ? error.message : String(error)}`
542
- );
543
- internalTools = {};
544
- }
545
- try {
546
- customTools = this.internalToolsProvider?.getCustomTools() || {};
547
- } catch (error) {
548
- this.logger.error(
549
- `Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
550
- );
551
- customTools = {};
552
- }
553
- for (const [toolName, toolDef] of Object.entries(internalTools)) {
554
- const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
555
- allTools[qualifiedName] = {
556
- ...toolDef,
557
- name: qualifiedName,
558
- description: `${toolDef.description || "No description provided"} (internal tool)`,
559
- parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(toolDef.parameters)
560
- };
561
- }
562
- for (const [toolName, toolDef] of Object.entries(customTools)) {
563
- const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
564
- allTools[qualifiedName] = {
565
- ...toolDef,
566
- name: qualifiedName,
567
- description: `${toolDef.description || "No description provided"} (custom tool)`,
568
- parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(toolDef.parameters)
841
+ for (const [toolName, tool] of this.agentTools) {
842
+ allTools[toolName] = {
843
+ name: toolName,
844
+ description: tool.description || "No description provided",
845
+ parameters: (0, import_tool_call_metadata.wrapToolParametersSchema)(
846
+ (0, import_schema.convertZodSchemaToJsonSchema)(tool.inputSchema, this.logger)
847
+ )
569
848
  };
570
849
  }
571
850
  for (const [toolName, toolDef] of Object.entries(mcpTools)) {
@@ -579,10 +858,9 @@ let _ToolManager = class _ToolManager {
579
858
  }
580
859
  const totalTools = Object.keys(allTools).length;
581
860
  const mcpCount = Object.keys(mcpTools).length;
582
- const internalCount = Object.keys(internalTools).length;
583
- const customCount = Object.keys(customTools).length;
861
+ const localCount = this.agentTools.size;
584
862
  this.logger.debug(
585
- `\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${internalCount} internal, ${customCount} custom)`
863
+ `\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${localCount} local)`
586
864
  );
587
865
  return allTools;
588
866
  }
@@ -600,10 +878,11 @@ let _ToolManager = class _ToolManager {
600
878
  return this.toolsCache;
601
879
  }
602
880
  /**
603
- * Execute a tool by routing based on universal prefix
604
- * ALL tools must have source prefix - no exceptions
881
+ * Execute a tool by routing based on prefix:
882
+ * - MCP tools: `mcp--...`
883
+ * - Local tools: `Tool.id`
605
884
  *
606
- * @param toolName The fully qualified tool name (e.g., "internal--edit_file")
885
+ * @param toolName Tool name (e.g., "edit_file", "mcp--filesystem--read_file")
607
886
  * @param args The arguments for the tool
608
887
  * @param toolCallId The unique tool call ID for tracking (from LLM or generated for direct calls)
609
888
  * @param sessionId Optional session ID for context
@@ -612,24 +891,39 @@ let _ToolManager = class _ToolManager {
612
891
  async executeTool(toolName, args, toolCallId, sessionId, abortSignal) {
613
892
  const { toolArgs: rawToolArgs, meta } = (0, import_tool_call_metadata.extractToolCallMeta)(args);
614
893
  let toolArgs = rawToolArgs;
894
+ const callDescription = typeof meta.callDescription === "string" ? meta.callDescription : typeof rawToolArgs.description === "string" ? rawToolArgs.description : void 0;
615
895
  const backgroundTasksEnabled = (0, import_env.isBackgroundTasksEnabled)();
616
896
  this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
617
897
  this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
618
898
  if (sessionId) {
899
+ const presentationSnapshot = this.getToolPresentationSnapshotForToolCallEvent(
900
+ toolName,
901
+ toolArgs,
902
+ toolCallId,
903
+ sessionId
904
+ );
619
905
  this.agentEventBus.emit("llm:tool-call", {
620
906
  toolName,
907
+ presentationSnapshot,
621
908
  args: toolArgs,
909
+ ...callDescription !== void 0 && { callDescription },
622
910
  callId: toolCallId,
623
911
  sessionId
624
912
  });
625
913
  }
626
- const { requireApproval, approvalStatus } = await this.handleToolApproval(
914
+ const {
915
+ requireApproval,
916
+ approvalStatus,
917
+ args: validatedToolArgs,
918
+ presentationSnapshot: callSnapshot
919
+ } = await this.handleToolApproval(
627
920
  toolName,
628
921
  toolArgs,
629
922
  toolCallId,
630
923
  sessionId,
631
- meta.callDescription
924
+ callDescription
632
925
  );
926
+ toolArgs = validatedToolArgs;
633
927
  this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
634
928
  this.logger.info(
635
929
  `\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
@@ -642,13 +936,13 @@ let _ToolManager = class _ToolManager {
642
936
  });
643
937
  }
644
938
  const startTime = Date.now();
645
- if (this.pluginManager && this.sessionManager && this.stateManager) {
939
+ if (this.hookManager && this.sessionManager && this.stateManager) {
646
940
  const beforePayload = {
647
941
  toolName,
648
942
  args: toolArgs,
649
943
  ...sessionId !== void 0 && { sessionId }
650
944
  };
651
- const modifiedPayload = await this.pluginManager.executePlugins(
945
+ const modifiedPayload = await this.hookManager.executeHooks(
652
946
  "beforeToolCall",
653
947
  beforePayload,
654
948
  {
@@ -660,6 +954,14 @@ let _ToolManager = class _ToolManager {
660
954
  }
661
955
  );
662
956
  toolArgs = modifiedPayload.args;
957
+ try {
958
+ toolArgs = this.validateLocalToolArgs(toolName, toolArgs);
959
+ } catch (error) {
960
+ this.logger.error(
961
+ `Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
962
+ );
963
+ throw error;
964
+ }
663
965
  }
664
966
  try {
665
967
  let result;
@@ -709,16 +1011,7 @@ let _ToolManager = class _ToolManager {
709
1011
  } else {
710
1012
  result = await this.mcpManager.executeTool(actualToolName, toolArgs, sessionId);
711
1013
  }
712
- } else if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
713
- this.logger.debug(`\u{1F527} Detected internal tool: '${toolName}'`);
714
- const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
715
- if (actualToolName.length === 0) {
716
- throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
717
- }
718
- if (!this.internalToolsProvider) {
719
- throw import_errors.ToolError.internalToolsNotInitialized(toolName);
720
- }
721
- this.logger.debug(`\u{1F3AF} Internal routing: '${toolName}' -> '${actualToolName}'`);
1014
+ } else {
722
1015
  const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
723
1016
  if (meta.runInBackground === true && !backgroundTasksEnabled) {
724
1017
  this.logger.debug(
@@ -729,14 +1022,14 @@ let _ToolManager = class _ToolManager {
729
1022
  if (runInBackground) {
730
1023
  const backgroundSessionId = sessionId;
731
1024
  const { result: backgroundResult, promise } = registerBackgroundTask(
732
- this.internalToolsProvider.executeTool(
733
- actualToolName,
1025
+ this.executeLocalTool(
1026
+ toolName,
734
1027
  toolArgs,
735
1028
  backgroundSessionId,
736
1029
  abortSignal,
737
1030
  toolCallId
738
1031
  ),
739
- `Internal tool ${actualToolName}`
1032
+ `Tool ${toolName}`
740
1033
  );
741
1034
  this.agentEventBus.emit("tool:background", {
742
1035
  toolName,
@@ -751,88 +1044,28 @@ let _ToolManager = class _ToolManager {
751
1044
  });
752
1045
  result = backgroundResult;
753
1046
  } else {
754
- result = await this.internalToolsProvider.executeTool(
755
- actualToolName,
756
- toolArgs,
757
- sessionId,
758
- abortSignal,
759
- toolCallId
760
- );
761
- }
762
- } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
763
- this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
764
- const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
765
- if (actualToolName.length === 0) {
766
- throw import_errors.ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
767
- }
768
- if (!this.internalToolsProvider) {
769
- throw import_errors.ToolError.internalToolsNotInitialized(toolName);
770
- }
771
- this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
772
- const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
773
- if (meta.runInBackground === true && !backgroundTasksEnabled) {
774
- this.logger.debug(
775
- "Background tool execution disabled; running synchronously instead.",
776
- { toolName }
777
- );
778
- }
779
- if (runInBackground) {
780
- const backgroundSessionId = sessionId;
781
- const { result: backgroundResult, promise } = registerBackgroundTask(
782
- this.internalToolsProvider.executeTool(
783
- actualToolName,
784
- toolArgs,
785
- backgroundSessionId,
786
- abortSignal,
787
- toolCallId
788
- ),
789
- `Custom tool ${actualToolName}`
790
- );
791
- this.agentEventBus.emit("tool:background", {
1047
+ result = await this.executeLocalTool(
792
1048
  toolName,
793
- toolCallId: backgroundResult.taskId,
794
- sessionId: backgroundSessionId,
795
- description: backgroundResult.description,
796
- promise,
797
- ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
798
- ...meta.notifyOnComplete !== void 0 && {
799
- notifyOnComplete: meta.notifyOnComplete
800
- }
801
- });
802
- result = backgroundResult;
803
- } else {
804
- result = await this.internalToolsProvider.executeTool(
805
- actualToolName,
806
1049
  toolArgs,
807
1050
  sessionId,
808
1051
  abortSignal,
809
1052
  toolCallId
810
1053
  );
811
1054
  }
812
- } else {
813
- this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
814
- const stats = await this.getToolStats();
815
- this.logger.error(
816
- `\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
817
- );
818
- this.logger.debug(
819
- `Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
820
- );
821
- throw import_errors.ToolError.notFound(toolName);
822
1055
  }
823
1056
  const duration = Date.now() - startTime;
824
1057
  this.logger.debug(`\u{1F3AF} Tool execution completed in ${duration}ms: '${toolName}'`);
825
1058
  this.logger.info(
826
1059
  `\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
827
1060
  );
828
- if (this.pluginManager && this.sessionManager && this.stateManager) {
1061
+ if (this.hookManager && this.sessionManager && this.stateManager) {
829
1062
  const afterPayload = {
830
1063
  toolName,
831
1064
  result,
832
1065
  success: true,
833
1066
  ...sessionId !== void 0 && { sessionId }
834
1067
  };
835
- const modifiedPayload = await this.pluginManager.executePlugins(
1068
+ const modifiedPayload = await this.hookManager.executeHooks(
836
1069
  "afterToolResult",
837
1070
  afterPayload,
838
1071
  {
@@ -845,8 +1078,17 @@ let _ToolManager = class _ToolManager {
845
1078
  );
846
1079
  result = modifiedPayload.result;
847
1080
  }
1081
+ const presentationSnapshot = await this.augmentSnapshotWithResult(
1082
+ toolName,
1083
+ callSnapshot,
1084
+ result,
1085
+ toolArgs,
1086
+ toolCallId,
1087
+ sessionId
1088
+ );
848
1089
  return {
849
1090
  result,
1091
+ ...presentationSnapshot !== void 0 && { presentationSnapshot },
850
1092
  ...requireApproval && { requireApproval, approvalStatus }
851
1093
  };
852
1094
  } catch (error) {
@@ -854,14 +1096,14 @@ let _ToolManager = class _ToolManager {
854
1096
  this.logger.error(
855
1097
  `\u274C Tool execution failed for ${toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
856
1098
  );
857
- if (this.pluginManager && this.sessionManager && this.stateManager) {
1099
+ if (this.hookManager && this.sessionManager && this.stateManager) {
858
1100
  const afterPayload = {
859
1101
  toolName,
860
1102
  result: error instanceof Error ? error.message : String(error),
861
1103
  success: false,
862
1104
  ...sessionId !== void 0 && { sessionId }
863
1105
  };
864
- await this.pluginManager.executePlugins("afterToolResult", afterPayload, {
1106
+ await this.hookManager.executeHooks("afterToolResult", afterPayload, {
865
1107
  sessionManager: this.sessionManager,
866
1108
  mcpManager: this.mcpManager,
867
1109
  toolManager: this,
@@ -873,30 +1115,20 @@ let _ToolManager = class _ToolManager {
873
1115
  }
874
1116
  }
875
1117
  /**
876
- * Check if a tool exists (must have proper source prefix)
1118
+ * Check if a tool exists.
877
1119
  */
878
1120
  async hasTool(toolName) {
879
1121
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
880
1122
  const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
881
1123
  return this.mcpManager.getToolClient(actualToolName) !== void 0;
882
1124
  }
883
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
884
- const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
885
- return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
886
- }
887
- if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
888
- const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
889
- return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
890
- }
891
- return false;
1125
+ return this.agentTools.has(toolName);
892
1126
  }
893
1127
  /**
894
1128
  * Get tool statistics across all sources
895
1129
  */
896
1130
  async getToolStats() {
897
1131
  let mcpTools = {};
898
- let internalTools = {};
899
- let customTools = {};
900
1132
  try {
901
1133
  mcpTools = await this.mcpManager.getAllTools();
902
1134
  } catch (error) {
@@ -905,34 +1137,16 @@ let _ToolManager = class _ToolManager {
905
1137
  );
906
1138
  mcpTools = {};
907
1139
  }
908
- try {
909
- internalTools = this.internalToolsProvider?.getInternalTools() || {};
910
- } catch (error) {
911
- this.logger.error(
912
- `Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
913
- );
914
- internalTools = {};
915
- }
916
- try {
917
- customTools = this.internalToolsProvider?.getCustomTools() || {};
918
- } catch (error) {
919
- this.logger.error(
920
- `Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
921
- );
922
- customTools = {};
923
- }
924
1140
  const mcpCount = Object.keys(mcpTools).length;
925
- const internalCount = Object.keys(internalTools).length;
926
- const customCount = Object.keys(customTools).length;
1141
+ const localCount = this.agentTools.size;
927
1142
  return {
928
- total: mcpCount + internalCount + customCount,
1143
+ total: mcpCount + localCount,
929
1144
  mcp: mcpCount,
930
- internal: internalCount,
931
- custom: customCount
1145
+ local: localCount
932
1146
  };
933
1147
  }
934
1148
  /**
935
- * Get the source of a tool (mcp, internal, custom, or unknown)
1149
+ * Get the source of a tool (mcp, local, or unknown).
936
1150
  * @param toolName The name of the tool to check
937
1151
  * @returns The source of the tool
938
1152
  */
@@ -940,11 +1154,8 @@ let _ToolManager = class _ToolManager {
940
1154
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
941
1155
  return "mcp";
942
1156
  }
943
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX) && toolName.length > _ToolManager.INTERNAL_TOOL_PREFIX.length) {
944
- return "internal";
945
- }
946
- if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
947
- return "custom";
1157
+ if (this.agentTools.has(toolName)) {
1158
+ return "local";
948
1159
  }
949
1160
  return "unknown";
950
1161
  }
@@ -955,7 +1166,7 @@ let _ToolManager = class _ToolManager {
955
1166
  * Examples:
956
1167
  * - Policy "mcp--read_file" matches "mcp--read_file" (exact)
957
1168
  * - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
958
- * - Policy "internal--ask_user" matches "internal--ask_user" (exact only)
1169
+ * - Policy "read_file" matches "read_file" (local tool exact only)
959
1170
  *
960
1171
  * @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
961
1172
  * @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
@@ -1002,99 +1213,113 @@ let _ToolManager = class _ToolManager {
1002
1213
  );
1003
1214
  }
1004
1215
  /**
1005
- * Check if a tool has a custom approval override and handle it.
1006
- * Tools can implement getApprovalOverride() to request specialized approval flows
1007
- * (e.g., directory access approval for file tools) instead of default tool confirmation.
1008
- *
1009
- * @param toolName The fully qualified tool name
1010
- * @param args The tool arguments
1011
- * @param sessionId Optional session ID
1012
- * @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
1216
+ * Handle tool approval flow. Checks various precedence levels to determine
1217
+ * if a tool should be auto-approved, denied, or requires manual approval.
1013
1218
  */
1014
- async checkCustomApprovalOverride(toolName, args, sessionId) {
1015
- let actualToolName;
1016
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
1017
- actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
1018
- } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
1019
- actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
1020
- }
1021
- if (!actualToolName || !this.internalToolsProvider) {
1022
- return { handled: false };
1023
- }
1024
- const tool = this.internalToolsProvider.getTool(actualToolName);
1025
- if (!tool?.getApprovalOverride) {
1026
- return { handled: false };
1027
- }
1028
- const approvalRequest = await tool.getApprovalOverride(args);
1029
- if (!approvalRequest) {
1030
- return { handled: false };
1031
- }
1032
- this.logger.debug(
1033
- `Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
1034
- );
1035
- if (sessionId && !approvalRequest.sessionId) {
1036
- approvalRequest.sessionId = sessionId;
1037
- }
1038
- const response = await this.approvalManager.requestApproval(approvalRequest);
1039
- if (response.status === import_types3.ApprovalStatus.APPROVED) {
1040
- if (tool.onApprovalGranted) {
1041
- tool.onApprovalGranted(response);
1042
- }
1219
+ async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
1220
+ if (this.isInAlwaysDenyList(toolName)) {
1043
1221
  this.logger.info(
1044
- `Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
1222
+ `Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
1045
1223
  );
1046
- return { handled: true };
1224
+ throw import_errors.ToolError.executionDenied(toolName, sessionId);
1047
1225
  }
1048
- this.logger.info(
1049
- `Custom approval denied for '${toolName}', type=${approvalRequest.type}, reason=${response.reason ?? "unknown"}`
1226
+ const validatedArgs = this.validateLocalToolArgs(toolName, args);
1227
+ const presentationSnapshot = await this.getToolPresentationSnapshotForCall(
1228
+ toolName,
1229
+ validatedArgs,
1230
+ toolCallId,
1231
+ sessionId
1050
1232
  );
1051
- if (approvalRequest.type === "directory_access") {
1052
- const metadata = approvalRequest.metadata;
1053
- throw import_errors.ToolError.directoryAccessDenied(
1054
- metadata?.parentDir ?? "unknown directory",
1055
- sessionId
1056
- );
1233
+ let directoryAccess;
1234
+ let directoryAccessApprovalRequest;
1235
+ if (!toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
1236
+ const getApprovalOverride = this.getToolApprovalOverrideFn(toolName);
1237
+ if (getApprovalOverride) {
1238
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
1239
+ const approvalRequest = await getApprovalOverride(validatedArgs, context);
1240
+ if (approvalRequest) {
1241
+ if (approvalRequest.type === import_types3.ApprovalType.DIRECTORY_ACCESS) {
1242
+ const metadata = approvalRequest.metadata;
1243
+ if (typeof metadata !== "object" || metadata === null || typeof metadata.path !== "string" || typeof metadata.parentDir !== "string" || typeof metadata.operation !== "string" || typeof metadata.toolName !== "string") {
1244
+ throw import_errors.ToolError.configInvalid(
1245
+ `Tool '${toolName}' returned invalid directory access metadata`
1246
+ );
1247
+ }
1248
+ directoryAccess = metadata;
1249
+ directoryAccessApprovalRequest = approvalRequest;
1250
+ } else {
1251
+ this.logger.debug(
1252
+ `Tool '${toolName}' requested custom approval: type=${approvalRequest.type}`
1253
+ );
1254
+ if (sessionId && !approvalRequest.sessionId) {
1255
+ approvalRequest.sessionId = sessionId;
1256
+ }
1257
+ const response = await this.approvalManager.requestApproval(approvalRequest);
1258
+ if (response.status === import_types3.ApprovalStatus.APPROVED) {
1259
+ const onGranted = this.getToolApprovalOnGrantedFn(toolName);
1260
+ if (onGranted) {
1261
+ await Promise.resolve(
1262
+ onGranted(response, context, approvalRequest)
1263
+ );
1264
+ }
1265
+ this.logger.info(
1266
+ `Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
1267
+ );
1268
+ return {
1269
+ requireApproval: true,
1270
+ approvalStatus: "approved",
1271
+ args: validatedArgs,
1272
+ presentationSnapshot
1273
+ };
1274
+ }
1275
+ this.logger.info(
1276
+ `Custom approval denied for '${toolName}', type=${approvalRequest.type}, reason=${response.reason ?? "unknown"}`
1277
+ );
1278
+ throw import_errors.ToolError.executionDenied(toolName, sessionId);
1279
+ }
1280
+ }
1281
+ }
1057
1282
  }
1058
- throw import_errors.ToolError.executionDenied(toolName, sessionId);
1059
- }
1060
- /**
1061
- * Handle tool approval flow. Checks various precedence levels to determine
1062
- * if a tool should be auto-approved, denied, or requires manual approval.
1063
- */
1064
- async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
1065
- const quickResult = await this.tryQuickApprovalResolution(toolName, args, sessionId);
1283
+ const quickResult = await this.tryQuickApprovalResolution(
1284
+ toolName,
1285
+ validatedArgs,
1286
+ sessionId,
1287
+ directoryAccess
1288
+ );
1066
1289
  if (quickResult !== null) {
1067
- return quickResult;
1290
+ return { ...quickResult, args: validatedArgs, presentationSnapshot };
1068
1291
  }
1069
- return this.requestManualApproval(toolName, args, toolCallId, sessionId, callDescription);
1292
+ const manualResult = await this.requestManualApproval(
1293
+ toolName,
1294
+ validatedArgs,
1295
+ toolCallId,
1296
+ sessionId,
1297
+ directoryAccess,
1298
+ directoryAccessApprovalRequest,
1299
+ callDescription,
1300
+ presentationSnapshot
1301
+ );
1302
+ return { ...manualResult, args: validatedArgs, presentationSnapshot };
1070
1303
  }
1071
1304
  /**
1072
1305
  * Try to resolve tool approval quickly based on policies and cached permissions.
1073
1306
  * Returns null if manual approval is needed.
1074
1307
  *
1075
1308
  * Precedence order (highest to lowest):
1076
- * 1. Static deny list (security - always blocks)
1077
- * 2. Custom approval override (tool-specific approval flows)
1078
- * 3. Session auto-approve (skill allowed-tools)
1079
- * 4. Static allow list
1080
- * 5. Dynamic "remembered" allowed list
1081
- * 6. Bash command patterns
1082
- * 7. Approval mode (auto-approve/auto-deny)
1309
+ * 1. Directory access requirement (outside-root paths)
1310
+ * 2. Session auto-approve (skill allowed-tools)
1311
+ * 3. Static allow list
1312
+ * 4. Dynamic "remembered" allowed list
1313
+ * 5. Tool approval patterns
1314
+ * 6. Approval mode (auto-approve/auto-deny)
1083
1315
  */
1084
- async tryQuickApprovalResolution(toolName, args, sessionId) {
1085
- if (this.isInAlwaysDenyList(toolName)) {
1086
- this.logger.info(
1087
- `Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
1088
- );
1089
- throw import_errors.ToolError.executionDenied(toolName, sessionId);
1090
- }
1091
- const customApprovalResult = await this.checkCustomApprovalOverride(
1092
- toolName,
1093
- args,
1094
- sessionId
1095
- );
1096
- if (customApprovalResult.handled) {
1097
- return { requireApproval: true, approvalStatus: "approved" };
1316
+ async tryQuickApprovalResolution(toolName, args, sessionId, directoryAccess) {
1317
+ if (directoryAccess) {
1318
+ if (this.approvalMode === "auto-approve") {
1319
+ this.approvalManager.addApprovedDirectory(directoryAccess.parentDir, "once");
1320
+ return { requireApproval: false };
1321
+ }
1322
+ return null;
1098
1323
  }
1099
1324
  if (sessionId && this.isToolAutoApprovedForSession(sessionId, toolName)) {
1100
1325
  this.logger.info(
@@ -1114,17 +1339,12 @@ let _ToolManager = class _ToolManager {
1114
1339
  );
1115
1340
  return { requireApproval: false };
1116
1341
  }
1117
- if (this.isBashTool(toolName)) {
1118
- const command = args.command;
1119
- if (command) {
1120
- const bashResult = this.checkBashPatternApproval(command);
1121
- if (bashResult.approved) {
1122
- this.logger.info(
1123
- `Bash command '${command}' matched approved pattern \u2013 skipping confirmation.`
1124
- );
1125
- return { requireApproval: false };
1126
- }
1127
- }
1342
+ const patternKey = this.getToolPatternKey(toolName, args);
1343
+ if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey)) {
1344
+ this.logger.info(
1345
+ `Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
1346
+ );
1347
+ return { requireApproval: false };
1128
1348
  }
1129
1349
  if (this.approvalMode === "auto-approve") {
1130
1350
  this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
@@ -1140,9 +1360,9 @@ let _ToolManager = class _ToolManager {
1140
1360
  * Request manual approval from the user for a tool execution.
1141
1361
  * Generates preview, sends approval request, and handles the response.
1142
1362
  */
1143
- async requestManualApproval(toolName, args, toolCallId, sessionId, callDescription) {
1363
+ async requestManualApproval(toolName, args, toolCallId, sessionId, directoryAccess, directoryAccessApprovalRequest, callDescription, presentationSnapshot) {
1144
1364
  this.logger.info(
1145
- `Tool confirmation requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
1365
+ `Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
1146
1366
  );
1147
1367
  try {
1148
1368
  const displayPreview = await this.generateToolPreview(
@@ -1151,16 +1371,27 @@ let _ToolManager = class _ToolManager {
1151
1371
  toolCallId,
1152
1372
  sessionId
1153
1373
  );
1154
- const suggestedPatterns = this.getBashSuggestedPatterns(toolName, args);
1155
- const response = await this.approvalManager.requestToolConfirmation({
1374
+ const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
1375
+ const response = await this.approvalManager.requestToolApproval({
1156
1376
  toolName,
1377
+ ...presentationSnapshot !== void 0 && { presentationSnapshot },
1157
1378
  toolCallId,
1158
1379
  args,
1159
1380
  ...callDescription !== void 0 && { description: callDescription },
1160
1381
  ...sessionId !== void 0 && { sessionId },
1161
1382
  ...displayPreview !== void 0 && { displayPreview },
1383
+ ...directoryAccess !== void 0 && { directoryAccess },
1162
1384
  ...suggestedPatterns !== void 0 && { suggestedPatterns }
1163
1385
  });
1386
+ if (response.status === import_types3.ApprovalStatus.APPROVED && directoryAccessApprovalRequest !== void 0) {
1387
+ const onGranted = this.getToolApprovalOnGrantedFn(toolName);
1388
+ if (onGranted) {
1389
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
1390
+ await Promise.resolve(
1391
+ onGranted(response, context, directoryAccessApprovalRequest)
1392
+ );
1393
+ }
1394
+ }
1164
1395
  if (response.status === import_types3.ApprovalStatus.APPROVED && response.data) {
1165
1396
  await this.handleRememberChoice(toolName, response, sessionId);
1166
1397
  }
@@ -1168,12 +1399,12 @@ let _ToolManager = class _ToolManager {
1168
1399
  this.handleApprovalDenied(toolName, response, sessionId);
1169
1400
  }
1170
1401
  this.logger.info(
1171
- `Tool confirmation approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
1402
+ `Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
1172
1403
  );
1173
1404
  return { requireApproval: true, approvalStatus: "approved" };
1174
1405
  } catch (error) {
1175
1406
  this.logger.error(
1176
- `Tool confirmation error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
1407
+ `Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
1177
1408
  );
1178
1409
  throw error;
1179
1410
  }
@@ -1182,14 +1413,13 @@ let _ToolManager = class _ToolManager {
1182
1413
  * Generate a preview for the tool approval UI if the tool supports it.
1183
1414
  */
1184
1415
  async generateToolPreview(toolName, args, toolCallId, sessionId) {
1185
- const actualToolName = toolName.replace(/^internal--/, "").replace(/^custom--/, "");
1186
- const internalTool = this.internalToolsProvider?.getTool(actualToolName);
1187
- if (!internalTool?.generatePreview) {
1416
+ const previewFn = this.getToolPreviewFn(toolName);
1417
+ if (!previewFn) {
1188
1418
  return void 0;
1189
1419
  }
1190
1420
  try {
1191
- const context = { sessionId, toolCallId };
1192
- const preview = await internalTool.generatePreview(args, context);
1421
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
1422
+ const preview = await previewFn(args, context);
1193
1423
  this.logger.debug(`Generated preview for ${toolName}`);
1194
1424
  return preview ?? void 0;
1195
1425
  } catch (previewError) {
@@ -1203,20 +1433,6 @@ let _ToolManager = class _ToolManager {
1203
1433
  return void 0;
1204
1434
  }
1205
1435
  }
1206
- /**
1207
- * Get suggested bash patterns for the approval UI.
1208
- */
1209
- getBashSuggestedPatterns(toolName, args) {
1210
- if (!this.isBashTool(toolName)) {
1211
- return void 0;
1212
- }
1213
- const command = args.command;
1214
- if (!command) {
1215
- return void 0;
1216
- }
1217
- const result = this.checkBashPatternApproval(command);
1218
- return result.suggestedPatterns?.length ? result.suggestedPatterns : void 0;
1219
- }
1220
1436
  /**
1221
1437
  * Handle "remember choice" or "remember pattern" when user approves a tool.
1222
1438
  */
@@ -1232,10 +1448,10 @@ let _ToolManager = class _ToolManager {
1232
1448
  `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
1233
1449
  );
1234
1450
  this.autoApprovePendingToolRequests(toolName, allowSessionId);
1235
- } else if (rememberPattern && this.isBashTool(toolName)) {
1236
- this.approvalManager.addBashPattern(rememberPattern);
1237
- this.logger.info(`Bash pattern '${rememberPattern}' added for session approval`);
1238
- this.autoApprovePendingBashRequests(rememberPattern, sessionId);
1451
+ } else if (rememberPattern && this.getToolApprovalPatternKeyFn(toolName)) {
1452
+ this.approvalManager.addPattern(toolName, rememberPattern);
1453
+ this.logger.info(`Pattern '${rememberPattern}' added for tool '${toolName}' approval`);
1454
+ this.autoApprovePendingPatternRequests(toolName, sessionId);
1239
1455
  }
1240
1456
  }
1241
1457
  /**