@dexto/core 1.5.7 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (697) hide show
  1. package/README.md +19 -8
  2. package/dist/agent/DextoAgent.cjs +383 -153
  3. package/dist/agent/DextoAgent.d.ts +112 -60
  4. package/dist/agent/DextoAgent.d.ts.map +1 -1
  5. package/dist/agent/DextoAgent.js +380 -150
  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 -99
  20. package/dist/agent/schemas.d.ts +10 -9160
  21. package/dist/agent/schemas.d.ts.map +1 -1
  22. package/dist/agent/schemas.js +1 -104
  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 +77 -57
  38. package/dist/approval/manager.d.ts +41 -43
  39. package/dist/approval/manager.d.ts.map +1 -1
  40. package/dist/approval/manager.js +75 -55
  41. package/dist/approval/schemas.cjs +26 -25
  42. package/dist/approval/schemas.d.ts +35 -15
  43. package/dist/approval/schemas.d.ts.map +1 -1
  44. package/dist/approval/schemas.js +22 -21
  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 +5 -3
  64. package/dist/context/manager.d.ts +4 -3
  65. package/dist/context/manager.d.ts.map +1 -1
  66. package/dist/context/manager.js +5 -3
  67. package/dist/context/types.d.ts +2 -0
  68. package/dist/context/types.d.ts.map +1 -1
  69. package/dist/context/utils.cjs +70 -43
  70. package/dist/context/utils.d.ts +14 -14
  71. package/dist/context/utils.d.ts.map +1 -1
  72. package/dist/context/utils.js +69 -42
  73. package/dist/errors/result-bridge.d.ts +2 -2
  74. package/dist/errors/result-bridge.d.ts.map +1 -1
  75. package/dist/errors/types.cjs +1 -1
  76. package/dist/errors/types.d.ts +3 -3
  77. package/dist/errors/types.d.ts.map +1 -1
  78. package/dist/errors/types.js +1 -1
  79. package/dist/events/index.cjs +15 -2
  80. package/dist/events/index.d.ts +78 -7
  81. package/dist/events/index.d.ts.map +1 -1
  82. package/dist/events/index.js +15 -2
  83. package/dist/{plugins → hooks}/builtins/content-policy.cjs +7 -6
  84. package/dist/hooks/builtins/content-policy.d.ts +24 -0
  85. package/dist/hooks/builtins/content-policy.d.ts.map +1 -0
  86. package/dist/{plugins → hooks}/builtins/content-policy.js +6 -5
  87. package/dist/{plugins → hooks}/builtins/response-sanitizer.cjs +3 -3
  88. package/dist/hooks/builtins/response-sanitizer.d.ts +22 -0
  89. package/dist/hooks/builtins/response-sanitizer.d.ts.map +1 -0
  90. package/dist/{plugins → hooks}/builtins/response-sanitizer.js +2 -2
  91. package/dist/hooks/error-codes.cjs +43 -0
  92. package/dist/hooks/error-codes.d.ts +34 -0
  93. package/dist/hooks/error-codes.d.ts.map +1 -0
  94. package/dist/hooks/error-codes.js +20 -0
  95. package/dist/{storage/cache/providers/memory.cjs → hooks/index.cjs} +15 -18
  96. package/dist/hooks/index.d.ts +14 -0
  97. package/dist/hooks/index.d.ts.map +1 -0
  98. package/dist/hooks/index.js +11 -0
  99. package/dist/hooks/manager.cjs +354 -0
  100. package/dist/hooks/manager.d.ts +103 -0
  101. package/dist/hooks/manager.d.ts.map +1 -0
  102. package/dist/hooks/manager.js +331 -0
  103. package/dist/{plugins → hooks}/types.d.ts +36 -34
  104. package/dist/hooks/types.d.ts.map +1 -0
  105. package/dist/index.browser.cjs +13 -12
  106. package/dist/index.browser.d.ts +6 -6
  107. package/dist/index.browser.d.ts.map +1 -1
  108. package/dist/index.browser.js +8 -7
  109. package/dist/index.cjs +5 -7
  110. package/dist/index.d.ts +2 -3
  111. package/dist/index.d.ts.map +1 -1
  112. package/dist/index.js +2 -3
  113. package/dist/llm/curation-config.cjs +82 -0
  114. package/dist/llm/curation-config.d.ts +13 -0
  115. package/dist/llm/curation-config.d.ts.map +1 -0
  116. package/dist/llm/curation-config.js +59 -0
  117. package/dist/llm/curation.cjs +57 -0
  118. package/dist/llm/curation.d.ts +16 -0
  119. package/dist/llm/curation.d.ts.map +1 -0
  120. package/dist/llm/curation.js +34 -0
  121. package/dist/llm/errors.cjs +2 -2
  122. package/dist/llm/errors.d.ts +8 -8
  123. package/dist/llm/errors.js +1 -1
  124. package/dist/llm/executor/provider-options.cjs +1 -1
  125. package/dist/llm/executor/provider-options.js +1 -1
  126. package/dist/llm/executor/stream-processor.cjs +131 -11
  127. package/dist/llm/executor/stream-processor.d.ts +7 -5
  128. package/dist/llm/executor/stream-processor.d.ts.map +1 -1
  129. package/dist/llm/executor/stream-processor.js +131 -11
  130. package/dist/llm/executor/turn-executor.cjs +57 -56
  131. package/dist/llm/executor/turn-executor.d.ts +7 -8
  132. package/dist/llm/executor/turn-executor.d.ts.map +1 -1
  133. package/dist/llm/executor/turn-executor.js +57 -56
  134. package/dist/llm/formatters/vercel.cjs +2 -2
  135. package/dist/llm/formatters/vercel.d.ts +2 -2
  136. package/dist/llm/formatters/vercel.d.ts.map +1 -1
  137. package/dist/llm/index.cjs +14 -3
  138. package/dist/llm/index.d.ts +3 -1
  139. package/dist/llm/index.d.ts.map +1 -1
  140. package/dist/llm/index.js +13 -2
  141. package/dist/llm/providers/local/schemas.d.ts +10 -10
  142. package/dist/llm/registry/auto-update.cjs +263 -0
  143. package/dist/llm/registry/auto-update.d.ts +27 -0
  144. package/dist/llm/registry/auto-update.d.ts.map +1 -0
  145. package/dist/llm/registry/auto-update.js +227 -0
  146. package/dist/llm/registry/index.cjs +806 -0
  147. package/dist/llm/{registry.d.ts → registry/index.d.ts} +21 -43
  148. package/dist/llm/registry/index.d.ts.map +1 -0
  149. package/dist/llm/registry/index.js +756 -0
  150. package/dist/llm/registry/models.generated.cjs +4861 -0
  151. package/dist/llm/registry/models.generated.d.ts +431 -0
  152. package/dist/llm/registry/models.generated.d.ts.map +1 -0
  153. package/dist/llm/registry/models.generated.js +4838 -0
  154. package/dist/{storage/database/providers/index.cjs → llm/registry/models.manual.cjs} +22 -12
  155. package/dist/llm/registry/models.manual.d.ts +22 -0
  156. package/dist/llm/registry/models.manual.d.ts.map +1 -0
  157. package/dist/llm/registry/models.manual.js +21 -0
  158. package/dist/llm/registry/sync.cjs +354 -0
  159. package/dist/llm/registry/sync.d.ts +41 -0
  160. package/dist/llm/registry/sync.d.ts.map +1 -0
  161. package/dist/llm/registry/sync.js +328 -0
  162. package/dist/llm/resolver.cjs +29 -20
  163. package/dist/llm/resolver.d.ts +4 -4
  164. package/dist/llm/resolver.d.ts.map +1 -1
  165. package/dist/llm/resolver.js +28 -20
  166. package/dist/llm/schemas.cjs +69 -94
  167. package/dist/llm/schemas.d.ts +19 -158
  168. package/dist/llm/schemas.d.ts.map +1 -1
  169. package/dist/llm/schemas.js +67 -91
  170. package/dist/llm/services/factory.cjs +6 -7
  171. package/dist/llm/services/factory.d.ts +3 -4
  172. package/dist/llm/services/factory.d.ts.map +1 -1
  173. package/dist/llm/services/factory.js +6 -7
  174. package/dist/llm/services/vercel.cjs +11 -15
  175. package/dist/llm/services/vercel.d.ts +7 -7
  176. package/dist/llm/services/vercel.d.ts.map +1 -1
  177. package/dist/llm/services/vercel.js +11 -15
  178. package/dist/llm/types.cjs +1 -1
  179. package/dist/llm/types.d.ts +1 -1
  180. package/dist/llm/types.d.ts.map +1 -1
  181. package/dist/llm/types.js +1 -1
  182. package/dist/llm/validation.cjs +2 -2
  183. package/dist/llm/validation.d.ts +2 -2
  184. package/dist/llm/validation.d.ts.map +1 -1
  185. package/dist/llm/validation.js +1 -1
  186. package/dist/logger/browser.cjs +4 -4
  187. package/dist/logger/browser.d.ts +4 -4
  188. package/dist/logger/browser.d.ts.map +1 -1
  189. package/dist/logger/browser.js +3 -3
  190. package/dist/{context/compaction/providers/noop-provider.cjs → logger/default-logger-factory.cjs} +16 -22
  191. package/dist/logger/default-logger-factory.d.ts +301 -0
  192. package/dist/logger/default-logger-factory.d.ts.map +1 -0
  193. package/dist/logger/default-logger-factory.js +18 -0
  194. package/dist/logger/factory.d.ts +2 -2
  195. package/dist/logger/factory.d.ts.map +1 -1
  196. package/dist/logger/index.cjs +7 -2
  197. package/dist/logger/index.d.ts +5 -3
  198. package/dist/logger/index.d.ts.map +1 -1
  199. package/dist/logger/index.js +8 -2
  200. package/dist/logger/logger.cjs +4 -4
  201. package/dist/logger/logger.d.ts +4 -4
  202. package/dist/logger/logger.d.ts.map +1 -1
  203. package/dist/logger/logger.js +3 -3
  204. package/dist/logger/v2/dexto-logger.d.ts +3 -3
  205. package/dist/logger/v2/dexto-logger.d.ts.map +1 -1
  206. package/dist/logger/v2/schemas.d.ts +12 -12
  207. package/dist/logger/v2/test-utils.d.ts +5 -5
  208. package/dist/logger/v2/test-utils.d.ts.map +1 -1
  209. package/dist/logger/v2/transport-factory.d.ts +3 -3
  210. package/dist/logger/v2/transport-factory.d.ts.map +1 -1
  211. package/dist/logger/v2/transports/console-transport.d.ts +2 -2
  212. package/dist/logger/v2/transports/console-transport.d.ts.map +1 -1
  213. package/dist/logger/v2/transports/file-transport.d.ts +2 -2
  214. package/dist/logger/v2/transports/file-transport.d.ts.map +1 -1
  215. package/dist/logger/v2/transports/silent-transport.d.ts +2 -2
  216. package/dist/logger/v2/transports/silent-transport.d.ts.map +1 -1
  217. package/dist/logger/v2/types.cjs +1 -1
  218. package/dist/logger/v2/types.d.ts +8 -8
  219. package/dist/logger/v2/types.d.ts.map +1 -1
  220. package/dist/logger/v2/types.js +1 -1
  221. package/dist/mcp/errors.cjs +2 -2
  222. package/dist/mcp/errors.d.ts.map +1 -1
  223. package/dist/mcp/manager.cjs +16 -11
  224. package/dist/mcp/manager.d.ts +16 -13
  225. package/dist/mcp/manager.d.ts.map +1 -1
  226. package/dist/mcp/manager.js +17 -12
  227. package/dist/mcp/mcp-client.cjs +25 -20
  228. package/dist/mcp/mcp-client.d.ts +5 -5
  229. package/dist/mcp/mcp-client.d.ts.map +1 -1
  230. package/dist/mcp/mcp-client.js +20 -15
  231. package/dist/mcp/resolver.cjs +1 -1
  232. package/dist/mcp/schemas.cjs +5 -5
  233. package/dist/mcp/schemas.d.ts +4 -4
  234. package/dist/mcp/schemas.js +2 -2
  235. package/dist/mcp/types.d.ts +7 -7
  236. package/dist/mcp/types.d.ts.map +1 -1
  237. package/dist/memory/manager.d.ts +2 -2
  238. package/dist/memory/manager.d.ts.map +1 -1
  239. package/dist/memory/schemas.d.ts +2 -2
  240. package/dist/prompts/errors.cjs +3 -3
  241. package/dist/prompts/errors.d.ts.map +1 -1
  242. package/dist/prompts/prompt-manager.d.ts +3 -3
  243. package/dist/prompts/prompt-manager.d.ts.map +1 -1
  244. package/dist/prompts/providers/config-prompt-provider.cjs +15 -29
  245. package/dist/prompts/providers/config-prompt-provider.d.ts +3 -3
  246. package/dist/prompts/providers/config-prompt-provider.d.ts.map +1 -1
  247. package/dist/prompts/providers/config-prompt-provider.js +15 -29
  248. package/dist/prompts/providers/custom-prompt-provider.d.ts +2 -2
  249. package/dist/prompts/providers/custom-prompt-provider.d.ts.map +1 -1
  250. package/dist/prompts/providers/mcp-prompt-provider.d.ts +2 -2
  251. package/dist/prompts/providers/mcp-prompt-provider.d.ts.map +1 -1
  252. package/dist/prompts/schemas.d.ts +4 -4
  253. package/dist/resources/{internal-provider.cjs → agent-resources-provider.cjs} +16 -16
  254. package/dist/resources/{internal-provider.d.ts → agent-resources-provider.d.ts} +6 -6
  255. package/dist/resources/agent-resources-provider.d.ts.map +1 -0
  256. package/dist/resources/{internal-provider.js → agent-resources-provider.js} +13 -13
  257. package/dist/resources/errors.cjs +2 -2
  258. package/dist/resources/errors.d.ts.map +1 -1
  259. package/dist/resources/handlers/blob-handler.d.ts +2 -2
  260. package/dist/resources/handlers/blob-handler.d.ts.map +1 -1
  261. package/dist/resources/handlers/factory.d.ts +3 -3
  262. package/dist/resources/handlers/factory.d.ts.map +1 -1
  263. package/dist/resources/handlers/filesystem-handler.cjs +25 -0
  264. package/dist/resources/handlers/filesystem-handler.d.ts +3 -2
  265. package/dist/resources/handlers/filesystem-handler.d.ts.map +1 -1
  266. package/dist/resources/handlers/filesystem-handler.js +25 -0
  267. package/dist/resources/index.cjs +7 -9
  268. package/dist/resources/index.d.ts +3 -3
  269. package/dist/resources/index.d.ts.map +1 -1
  270. package/dist/resources/index.js +5 -10
  271. package/dist/resources/manager.cjs +77 -74
  272. package/dist/resources/manager.d.ts +16 -7
  273. package/dist/resources/manager.d.ts.map +1 -1
  274. package/dist/resources/manager.js +77 -74
  275. package/dist/resources/schemas.cjs +6 -26
  276. package/dist/resources/schemas.d.ts +8 -100
  277. package/dist/resources/schemas.d.ts.map +1 -1
  278. package/dist/resources/schemas.js +4 -23
  279. package/dist/search/search-service.d.ts +2 -2
  280. package/dist/search/search-service.d.ts.map +1 -1
  281. package/dist/session/chat-session.cjs +16 -26
  282. package/dist/session/chat-session.d.ts +7 -5
  283. package/dist/session/chat-session.d.ts.map +1 -1
  284. package/dist/session/chat-session.js +17 -27
  285. package/dist/session/errors.cjs +2 -2
  286. package/dist/session/errors.d.ts.map +1 -1
  287. package/dist/session/history/database.cjs +1 -1
  288. package/dist/session/history/database.d.ts +4 -4
  289. package/dist/session/history/database.d.ts.map +1 -1
  290. package/dist/session/history/factory.d.ts +3 -3
  291. package/dist/session/history/factory.d.ts.map +1 -1
  292. package/dist/session/history/memory.d.ts +4 -4
  293. package/dist/session/history/memory.d.ts.map +1 -1
  294. package/dist/session/history/types.d.ts +2 -2
  295. package/dist/session/history/types.d.ts.map +1 -1
  296. package/dist/session/index.cjs +3 -0
  297. package/dist/session/index.d.ts +2 -0
  298. package/dist/session/index.d.ts.map +1 -1
  299. package/dist/session/index.js +2 -0
  300. package/dist/session/message-queue.cjs +29 -5
  301. package/dist/session/message-queue.d.ts +5 -3
  302. package/dist/session/message-queue.d.ts.map +1 -1
  303. package/dist/session/message-queue.js +29 -5
  304. package/dist/session/session-manager.cjs +107 -12
  305. package/dist/session/session-manager.d.ts +49 -8
  306. package/dist/session/session-manager.d.ts.map +1 -1
  307. package/dist/session/session-manager.js +97 -12
  308. package/dist/session/title-generator.cjs +2 -2
  309. package/dist/session/title-generator.d.ts +2 -2
  310. package/dist/session/title-generator.d.ts.map +1 -1
  311. package/dist/session/types.d.ts +1 -0
  312. package/dist/session/types.d.ts.map +1 -1
  313. package/dist/storage/blob/index.cjs +0 -40
  314. package/dist/storage/blob/index.d.ts +2 -44
  315. package/dist/storage/blob/index.d.ts.map +1 -1
  316. package/dist/storage/blob/index.js +0 -30
  317. package/dist/storage/cache/index.cjs +0 -37
  318. package/dist/storage/cache/index.d.ts +0 -42
  319. package/dist/storage/cache/index.d.ts.map +1 -1
  320. package/dist/storage/cache/index.js +0 -28
  321. package/dist/storage/database/index.cjs +0 -42
  322. package/dist/storage/database/index.d.ts +0 -43
  323. package/dist/storage/database/index.d.ts.map +1 -1
  324. package/dist/storage/database/index.js +0 -37
  325. package/dist/storage/error-codes.cjs +1 -6
  326. package/dist/storage/error-codes.d.ts +2 -7
  327. package/dist/storage/error-codes.d.ts.map +1 -1
  328. package/dist/storage/error-codes.js +1 -6
  329. package/dist/storage/errors.cjs +18 -82
  330. package/dist/storage/errors.d.ts +4 -24
  331. package/dist/storage/errors.d.ts.map +1 -1
  332. package/dist/storage/errors.js +16 -80
  333. package/dist/storage/index.cjs +8 -69
  334. package/dist/storage/index.d.ts +11 -66
  335. package/dist/storage/index.d.ts.map +1 -1
  336. package/dist/storage/index.js +6 -50
  337. package/dist/storage/storage-manager.cjs +9 -25
  338. package/dist/storage/storage-manager.d.ts +11 -15
  339. package/dist/storage/storage-manager.d.ts.map +1 -1
  340. package/dist/storage/storage-manager.js +8 -23
  341. package/dist/storage/types.d.ts +0 -1
  342. package/dist/storage/types.d.ts.map +1 -1
  343. package/dist/systemPrompt/contributors.d.ts +4 -4
  344. package/dist/systemPrompt/contributors.d.ts.map +1 -1
  345. package/dist/systemPrompt/errors.cjs +2 -2
  346. package/dist/systemPrompt/errors.d.ts.map +1 -1
  347. package/dist/systemPrompt/manager.cjs +1 -5
  348. package/dist/systemPrompt/manager.d.ts +2 -3
  349. package/dist/systemPrompt/manager.d.ts.map +1 -1
  350. package/dist/systemPrompt/manager.js +1 -5
  351. package/dist/telemetry/index.cjs +3 -0
  352. package/dist/telemetry/index.d.ts +2 -0
  353. package/dist/telemetry/index.d.ts.map +1 -1
  354. package/dist/telemetry/index.js +2 -0
  355. package/dist/telemetry/utils.d.ts +4 -4
  356. package/dist/telemetry/utils.d.ts.map +1 -1
  357. package/dist/test-utils/in-memory-storage.cjs +288 -0
  358. package/dist/test-utils/in-memory-storage.js +252 -0
  359. package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts +3 -3
  360. package/dist/tools/confirmation/allowed-tools-provider/factory.d.ts.map +1 -1
  361. package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts +2 -2
  362. package/dist/tools/confirmation/allowed-tools-provider/in-memory.d.ts.map +1 -1
  363. package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts +4 -4
  364. package/dist/tools/confirmation/allowed-tools-provider/storage.d.ts.map +1 -1
  365. package/dist/tools/confirmation/allowed-tools-provider/types.d.ts +2 -2
  366. package/dist/tools/confirmation/allowed-tools-provider/types.d.ts.map +1 -1
  367. package/dist/tools/{internal-tools/constants.cjs → define-tool.cjs} +8 -13
  368. package/dist/tools/define-tool.d.ts +11 -0
  369. package/dist/tools/define-tool.d.ts.map +1 -0
  370. package/dist/tools/define-tool.js +7 -0
  371. package/dist/tools/error-codes.cjs +2 -2
  372. package/dist/tools/error-codes.d.ts +2 -2
  373. package/dist/tools/error-codes.d.ts.map +1 -1
  374. package/dist/tools/error-codes.js +2 -2
  375. package/dist/tools/errors.cjs +11 -23
  376. package/dist/tools/errors.d.ts +4 -10
  377. package/dist/tools/errors.d.ts.map +1 -1
  378. package/dist/tools/errors.js +9 -21
  379. package/dist/tools/index.cjs +3 -8
  380. package/dist/tools/index.d.ts +2 -4
  381. package/dist/tools/index.d.ts.map +1 -1
  382. package/dist/tools/index.js +2 -7
  383. package/dist/{storage/blob/providers/index.cjs → tools/pattern-utils.cjs} +11 -9
  384. package/dist/tools/pattern-utils.d.ts +20 -0
  385. package/dist/tools/pattern-utils.d.ts.map +1 -0
  386. package/dist/tools/pattern-utils.js +10 -0
  387. package/dist/tools/schemas.cjs +14 -40
  388. package/dist/tools/schemas.d.ts +6 -50
  389. package/dist/tools/schemas.d.ts.map +1 -1
  390. package/dist/tools/schemas.js +11 -32
  391. package/dist/tools/tool-call-metadata.cjs +75 -0
  392. package/dist/tools/tool-call-metadata.d.ts +16 -0
  393. package/dist/tools/tool-call-metadata.d.ts.map +1 -0
  394. package/dist/tools/tool-call-metadata.js +51 -0
  395. package/dist/tools/tool-manager.cjs +578 -302
  396. package/dist/tools/tool-manager.d.ts +105 -81
  397. package/dist/tools/tool-manager.d.ts.map +1 -1
  398. package/dist/tools/tool-manager.js +578 -306
  399. package/dist/tools/types.d.ts +112 -13
  400. package/dist/tools/types.d.ts.map +1 -1
  401. package/dist/utils/api-key-resolver.cjs +1 -1
  402. package/dist/utils/api-key-resolver.js +1 -1
  403. package/dist/utils/env.cjs +49 -0
  404. package/dist/utils/env.d.ts +4 -0
  405. package/dist/utils/env.d.ts.map +1 -0
  406. package/dist/utils/env.js +24 -0
  407. package/dist/utils/error-conversion.d.ts +2 -2
  408. package/dist/utils/error-conversion.d.ts.map +1 -1
  409. package/dist/utils/index.cjs +3 -1
  410. package/dist/utils/index.d.ts +1 -0
  411. package/dist/utils/index.d.ts.map +1 -1
  412. package/dist/utils/index.js +1 -0
  413. package/dist/utils/path.d.ts +2 -2
  414. package/dist/utils/path.d.ts.map +1 -1
  415. package/dist/utils/result.cjs +1 -1
  416. package/dist/utils/result.d.ts.map +1 -1
  417. package/dist/utils/schema.cjs +9 -5
  418. package/dist/utils/schema.d.ts +4 -2
  419. package/dist/utils/schema.d.ts.map +1 -1
  420. package/dist/utils/schema.js +9 -5
  421. package/dist/utils/service-initializer.cjs +58 -51
  422. package/dist/utils/service-initializer.d.ts +31 -9
  423. package/dist/utils/service-initializer.d.ts.map +1 -1
  424. package/dist/utils/service-initializer.js +58 -51
  425. package/dist/{storage/cache/providers/index.cjs → workspace/error-codes.cjs} +8 -9
  426. package/dist/workspace/error-codes.d.ts +5 -0
  427. package/dist/workspace/error-codes.d.ts.map +1 -0
  428. package/dist/workspace/error-codes.js +7 -0
  429. package/dist/{storage/blob/factory.cjs → workspace/errors.cjs} +20 -14
  430. package/dist/workspace/errors.d.ts +5 -0
  431. package/dist/workspace/errors.d.ts.map +1 -0
  432. package/dist/workspace/errors.js +21 -0
  433. package/dist/{image → workspace}/index.cjs +12 -10
  434. package/dist/workspace/index.d.ts +5 -0
  435. package/dist/workspace/index.d.ts.map +1 -0
  436. package/dist/workspace/index.js +9 -0
  437. package/dist/workspace/manager.cjs +113 -0
  438. package/dist/workspace/manager.d.ts +18 -0
  439. package/dist/workspace/manager.d.ts.map +1 -0
  440. package/dist/workspace/manager.js +90 -0
  441. package/dist/workspace/types.d.ts +14 -0
  442. package/dist/workspace/types.d.ts.map +1 -0
  443. package/package.json +7 -3
  444. package/dist/context/compaction/factory.cjs +0 -57
  445. package/dist/context/compaction/factory.d.ts +0 -17
  446. package/dist/context/compaction/factory.d.ts.map +0 -1
  447. package/dist/context/compaction/factory.js +0 -34
  448. package/dist/context/compaction/provider.d.ts +0 -48
  449. package/dist/context/compaction/provider.d.ts.map +0 -1
  450. package/dist/context/compaction/providers/noop-provider.d.ts +0 -24
  451. package/dist/context/compaction/providers/noop-provider.d.ts.map +0 -1
  452. package/dist/context/compaction/providers/noop-provider.js +0 -24
  453. package/dist/context/compaction/providers/reactive-overflow-provider.cjs +0 -76
  454. package/dist/context/compaction/providers/reactive-overflow-provider.d.ts +0 -51
  455. package/dist/context/compaction/providers/reactive-overflow-provider.d.ts.map +0 -1
  456. package/dist/context/compaction/providers/reactive-overflow-provider.js +0 -52
  457. package/dist/context/compaction/registry.cjs +0 -39
  458. package/dist/context/compaction/registry.d.ts +0 -19
  459. package/dist/context/compaction/registry.d.ts.map +0 -1
  460. package/dist/context/compaction/registry.js +0 -16
  461. package/dist/context/compaction/schemas.cjs +0 -58
  462. package/dist/context/compaction/schemas.d.ts +0 -69
  463. package/dist/context/compaction/schemas.d.ts.map +0 -1
  464. package/dist/context/compaction/schemas.js +0 -34
  465. package/dist/context/compaction/strategies/reactive-overflow.d.ts.map +0 -1
  466. package/dist/image/define-image.cjs +0 -146
  467. package/dist/image/define-image.d.ts +0 -71
  468. package/dist/image/define-image.d.ts.map +0 -1
  469. package/dist/image/define-image.js +0 -121
  470. package/dist/image/index.d.ts +0 -53
  471. package/dist/image/index.d.ts.map +0 -1
  472. package/dist/image/index.js +0 -7
  473. package/dist/image/types.d.ts +0 -246
  474. package/dist/image/types.d.ts.map +0 -1
  475. package/dist/llm/registry.cjs +0 -2075
  476. package/dist/llm/registry.d.ts.map +0 -1
  477. package/dist/llm/registry.js +0 -2025
  478. package/dist/llm/services/test-utils.integration.cjs +0 -237
  479. package/dist/llm/services/test-utils.integration.d.ts +0 -48
  480. package/dist/llm/services/test-utils.integration.d.ts.map +0 -1
  481. package/dist/llm/services/test-utils.integration.js +0 -214
  482. package/dist/plugins/builtins/content-policy.d.ts +0 -26
  483. package/dist/plugins/builtins/content-policy.d.ts.map +0 -1
  484. package/dist/plugins/builtins/response-sanitizer.d.ts +0 -25
  485. package/dist/plugins/builtins/response-sanitizer.d.ts.map +0 -1
  486. package/dist/plugins/error-codes.cjs +0 -43
  487. package/dist/plugins/error-codes.d.ts +0 -34
  488. package/dist/plugins/error-codes.d.ts.map +0 -1
  489. package/dist/plugins/error-codes.js +0 -20
  490. package/dist/plugins/index.cjs +0 -61
  491. package/dist/plugins/index.d.ts +0 -21
  492. package/dist/plugins/index.d.ts.map +0 -1
  493. package/dist/plugins/index.js +0 -30
  494. package/dist/plugins/loader.cjs +0 -171
  495. package/dist/plugins/loader.d.ts +0 -30
  496. package/dist/plugins/loader.d.ts.map +0 -1
  497. package/dist/plugins/loader.js +0 -145
  498. package/dist/plugins/manager.cjs +0 -473
  499. package/dist/plugins/manager.d.ts +0 -106
  500. package/dist/plugins/manager.d.ts.map +0 -1
  501. package/dist/plugins/manager.js +0 -450
  502. package/dist/plugins/registrations/builtins.cjs +0 -51
  503. package/dist/plugins/registrations/builtins.d.ts +0 -17
  504. package/dist/plugins/registrations/builtins.d.ts.map +0 -1
  505. package/dist/plugins/registrations/builtins.js +0 -28
  506. package/dist/plugins/registry.cjs +0 -63
  507. package/dist/plugins/registry.d.ts +0 -101
  508. package/dist/plugins/registry.d.ts.map +0 -1
  509. package/dist/plugins/registry.js +0 -39
  510. package/dist/plugins/schemas.cjs +0 -73
  511. package/dist/plugins/schemas.d.ts +0 -195
  512. package/dist/plugins/schemas.d.ts.map +0 -1
  513. package/dist/plugins/schemas.js +0 -47
  514. package/dist/plugins/types.d.ts.map +0 -1
  515. package/dist/providers/base-registry.cjs +0 -147
  516. package/dist/providers/base-registry.d.ts +0 -147
  517. package/dist/providers/base-registry.d.ts.map +0 -1
  518. package/dist/providers/base-registry.js +0 -123
  519. package/dist/providers/discovery.cjs +0 -109
  520. package/dist/providers/discovery.d.ts +0 -96
  521. package/dist/providers/discovery.d.ts.map +0 -1
  522. package/dist/providers/discovery.js +0 -84
  523. package/dist/providers/index.cjs +0 -24
  524. package/dist/providers/index.d.ts +0 -32
  525. package/dist/providers/index.d.ts.map +0 -1
  526. package/dist/providers/index.js +0 -2
  527. package/dist/resources/internal-provider.d.ts.map +0 -1
  528. package/dist/storage/blob/factory.d.ts +0 -37
  529. package/dist/storage/blob/factory.d.ts.map +0 -1
  530. package/dist/storage/blob/factory.js +0 -15
  531. package/dist/storage/blob/local-blob-store.cjs +0 -496
  532. package/dist/storage/blob/local-blob-store.d.ts +0 -58
  533. package/dist/storage/blob/local-blob-store.d.ts.map +0 -1
  534. package/dist/storage/blob/local-blob-store.js +0 -463
  535. package/dist/storage/blob/memory-blob-store.cjs +0 -326
  536. package/dist/storage/blob/memory-blob-store.d.ts +0 -66
  537. package/dist/storage/blob/memory-blob-store.d.ts.map +0 -1
  538. package/dist/storage/blob/memory-blob-store.js +0 -303
  539. package/dist/storage/blob/provider.d.ts +0 -50
  540. package/dist/storage/blob/provider.d.ts.map +0 -1
  541. package/dist/storage/blob/providers/index.d.ts +0 -8
  542. package/dist/storage/blob/providers/index.d.ts.map +0 -1
  543. package/dist/storage/blob/providers/index.js +0 -7
  544. package/dist/storage/blob/providers/local.cjs +0 -39
  545. package/dist/storage/blob/providers/local.d.ts +0 -17
  546. package/dist/storage/blob/providers/local.d.ts.map +0 -1
  547. package/dist/storage/blob/providers/local.js +0 -16
  548. package/dist/storage/blob/providers/memory.cjs +0 -39
  549. package/dist/storage/blob/providers/memory.d.ts +0 -17
  550. package/dist/storage/blob/providers/memory.d.ts.map +0 -1
  551. package/dist/storage/blob/providers/memory.js +0 -16
  552. package/dist/storage/blob/registry.cjs +0 -50
  553. package/dist/storage/blob/registry.d.ts +0 -42
  554. package/dist/storage/blob/registry.d.ts.map +0 -1
  555. package/dist/storage/blob/registry.js +0 -26
  556. package/dist/storage/blob/schemas.cjs +0 -52
  557. package/dist/storage/blob/schemas.d.ts +0 -85
  558. package/dist/storage/blob/schemas.d.ts.map +0 -1
  559. package/dist/storage/blob/schemas.js +0 -26
  560. package/dist/storage/cache/factory.cjs +0 -38
  561. package/dist/storage/cache/factory.d.ts +0 -37
  562. package/dist/storage/cache/factory.d.ts.map +0 -1
  563. package/dist/storage/cache/factory.js +0 -15
  564. package/dist/storage/cache/memory-cache-store.cjs +0 -107
  565. package/dist/storage/cache/memory-cache-store.d.ts +0 -26
  566. package/dist/storage/cache/memory-cache-store.d.ts.map +0 -1
  567. package/dist/storage/cache/memory-cache-store.js +0 -84
  568. package/dist/storage/cache/provider.cjs +0 -16
  569. package/dist/storage/cache/provider.d.ts +0 -56
  570. package/dist/storage/cache/provider.d.ts.map +0 -1
  571. package/dist/storage/cache/provider.js +0 -0
  572. package/dist/storage/cache/providers/index.d.ts +0 -8
  573. package/dist/storage/cache/providers/index.d.ts.map +0 -1
  574. package/dist/storage/cache/providers/index.js +0 -7
  575. package/dist/storage/cache/providers/memory.d.ts +0 -17
  576. package/dist/storage/cache/providers/memory.d.ts.map +0 -1
  577. package/dist/storage/cache/providers/memory.js +0 -17
  578. package/dist/storage/cache/providers/redis.cjs +0 -66
  579. package/dist/storage/cache/providers/redis.d.ts +0 -20
  580. package/dist/storage/cache/providers/redis.d.ts.map +0 -1
  581. package/dist/storage/cache/providers/redis.js +0 -33
  582. package/dist/storage/cache/redis-store.cjs +0 -173
  583. package/dist/storage/cache/redis-store.d.ts +0 -32
  584. package/dist/storage/cache/redis-store.d.ts.map +0 -1
  585. package/dist/storage/cache/redis-store.js +0 -150
  586. package/dist/storage/cache/registry.cjs +0 -50
  587. package/dist/storage/cache/registry.d.ts +0 -42
  588. package/dist/storage/cache/registry.d.ts.map +0 -1
  589. package/dist/storage/cache/registry.js +0 -26
  590. package/dist/storage/cache/schemas.cjs +0 -81
  591. package/dist/storage/cache/schemas.d.ts +0 -150
  592. package/dist/storage/cache/schemas.d.ts.map +0 -1
  593. package/dist/storage/cache/schemas.js +0 -55
  594. package/dist/storage/database/factory.cjs +0 -38
  595. package/dist/storage/database/factory.d.ts +0 -39
  596. package/dist/storage/database/factory.d.ts.map +0 -1
  597. package/dist/storage/database/factory.js +0 -15
  598. package/dist/storage/database/memory-database-store.cjs +0 -122
  599. package/dist/storage/database/memory-database-store.d.ts +0 -29
  600. package/dist/storage/database/memory-database-store.d.ts.map +0 -1
  601. package/dist/storage/database/memory-database-store.js +0 -99
  602. package/dist/storage/database/postgres-store.cjs +0 -342
  603. package/dist/storage/database/postgres-store.d.ts +0 -55
  604. package/dist/storage/database/postgres-store.d.ts.map +0 -1
  605. package/dist/storage/database/postgres-store.js +0 -319
  606. package/dist/storage/database/provider.cjs +0 -16
  607. package/dist/storage/database/provider.d.ts +0 -56
  608. package/dist/storage/database/provider.d.ts.map +0 -1
  609. package/dist/storage/database/provider.js +0 -0
  610. package/dist/storage/database/providers/index.d.ts +0 -9
  611. package/dist/storage/database/providers/index.d.ts.map +0 -1
  612. package/dist/storage/database/providers/index.js +0 -9
  613. package/dist/storage/database/providers/memory.cjs +0 -40
  614. package/dist/storage/database/providers/memory.d.ts +0 -16
  615. package/dist/storage/database/providers/memory.d.ts.map +0 -1
  616. package/dist/storage/database/providers/memory.js +0 -17
  617. package/dist/storage/database/providers/postgres.cjs +0 -62
  618. package/dist/storage/database/providers/postgres.d.ts +0 -19
  619. package/dist/storage/database/providers/postgres.d.ts.map +0 -1
  620. package/dist/storage/database/providers/postgres.js +0 -29
  621. package/dist/storage/database/providers/sqlite.cjs +0 -66
  622. package/dist/storage/database/providers/sqlite.d.ts +0 -20
  623. package/dist/storage/database/providers/sqlite.d.ts.map +0 -1
  624. package/dist/storage/database/providers/sqlite.js +0 -33
  625. package/dist/storage/database/registry.cjs +0 -50
  626. package/dist/storage/database/registry.d.ts +0 -42
  627. package/dist/storage/database/registry.d.ts.map +0 -1
  628. package/dist/storage/database/registry.js +0 -26
  629. package/dist/storage/database/schemas.cjs +0 -97
  630. package/dist/storage/database/schemas.d.ts +0 -226
  631. package/dist/storage/database/schemas.d.ts.map +0 -1
  632. package/dist/storage/database/schemas.js +0 -70
  633. package/dist/storage/database/sqlite-store.cjs +0 -270
  634. package/dist/storage/database/sqlite-store.d.ts +0 -33
  635. package/dist/storage/database/sqlite-store.d.ts.map +0 -1
  636. package/dist/storage/database/sqlite-store.js +0 -237
  637. package/dist/storage/schemas.cjs +0 -57
  638. package/dist/storage/schemas.d.ts +0 -347
  639. package/dist/storage/schemas.d.ts.map +0 -1
  640. package/dist/storage/schemas.js +0 -37
  641. package/dist/tools/bash-pattern-utils.cjs +0 -91
  642. package/dist/tools/bash-pattern-utils.d.ts +0 -58
  643. package/dist/tools/bash-pattern-utils.d.ts.map +0 -1
  644. package/dist/tools/bash-pattern-utils.js +0 -64
  645. package/dist/tools/custom-tool-registry.cjs +0 -64
  646. package/dist/tools/custom-tool-registry.d.ts +0 -126
  647. package/dist/tools/custom-tool-registry.d.ts.map +0 -1
  648. package/dist/tools/custom-tool-registry.js +0 -40
  649. package/dist/tools/custom-tool-schema-registry.cjs +0 -164
  650. package/dist/tools/custom-tool-schema-registry.d.ts +0 -86
  651. package/dist/tools/custom-tool-schema-registry.d.ts.map +0 -1
  652. package/dist/tools/custom-tool-schema-registry.js +0 -140
  653. package/dist/tools/internal-tools/constants.d.ts +0 -12
  654. package/dist/tools/internal-tools/constants.d.ts.map +0 -1
  655. package/dist/tools/internal-tools/constants.js +0 -12
  656. package/dist/tools/internal-tools/implementations/ask-user-tool.cjs +0 -57
  657. package/dist/tools/internal-tools/implementations/ask-user-tool.d.ts +0 -18
  658. package/dist/tools/internal-tools/implementations/ask-user-tool.d.ts.map +0 -1
  659. package/dist/tools/internal-tools/implementations/ask-user-tool.js +0 -34
  660. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.cjs +0 -192
  661. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.d.ts +0 -33
  662. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.d.ts.map +0 -1
  663. package/dist/tools/internal-tools/implementations/delegate-to-url-tool.js +0 -169
  664. package/dist/tools/internal-tools/implementations/get-resource-tool.cjs +0 -113
  665. package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts +0 -30
  666. package/dist/tools/internal-tools/implementations/get-resource-tool.d.ts.map +0 -1
  667. package/dist/tools/internal-tools/implementations/get-resource-tool.js +0 -90
  668. package/dist/tools/internal-tools/implementations/invoke-skill-tool.cjs +0 -140
  669. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts +0 -24
  670. package/dist/tools/internal-tools/implementations/invoke-skill-tool.d.ts.map +0 -1
  671. package/dist/tools/internal-tools/implementations/invoke-skill-tool.js +0 -117
  672. package/dist/tools/internal-tools/implementations/list-resources-tool.cjs +0 -91
  673. package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts +0 -24
  674. package/dist/tools/internal-tools/implementations/list-resources-tool.d.ts.map +0 -1
  675. package/dist/tools/internal-tools/implementations/list-resources-tool.js +0 -68
  676. package/dist/tools/internal-tools/implementations/search-history-tool.cjs +0 -61
  677. package/dist/tools/internal-tools/implementations/search-history-tool.d.ts +0 -7
  678. package/dist/tools/internal-tools/implementations/search-history-tool.d.ts.map +0 -1
  679. package/dist/tools/internal-tools/implementations/search-history-tool.js +0 -38
  680. package/dist/tools/internal-tools/index.cjs +0 -26
  681. package/dist/tools/internal-tools/index.d.ts +0 -4
  682. package/dist/tools/internal-tools/index.d.ts.map +0 -1
  683. package/dist/tools/internal-tools/index.js +0 -3
  684. package/dist/tools/internal-tools/provider.cjs +0 -324
  685. package/dist/tools/internal-tools/provider.d.ts +0 -114
  686. package/dist/tools/internal-tools/provider.d.ts.map +0 -1
  687. package/dist/tools/internal-tools/provider.js +0 -301
  688. package/dist/tools/internal-tools/registry.cjs +0 -71
  689. package/dist/tools/internal-tools/registry.d.ts +0 -91
  690. package/dist/tools/internal-tools/registry.d.ts.map +0 -1
  691. package/dist/tools/internal-tools/registry.js +0 -47
  692. /package/dist/{context/compaction/provider.js → agent/agent-options.js} +0 -0
  693. /package/dist/{image/types.js → agent/runtime-config.js} +0 -0
  694. /package/dist/{image → hooks}/types.cjs +0 -0
  695. /package/dist/{plugins → hooks}/types.js +0 -0
  696. /package/dist/{plugins → workspace}/types.cjs +0 -0
  697. /package/dist/{storage/blob/provider.js → workspace/types.js} +0 -0
@@ -4,43 +4,40 @@ import {
4
4
  __runInitializers
5
5
  } from "../chunk-PTJYTZNU.js";
6
6
  var _ToolManager_decorators, _init;
7
- import { InternalToolsProvider } from "./internal-tools/provider.js";
8
7
  import { ToolError } from "./errors.js";
9
8
  import { ToolErrorCode } from "./error-codes.js";
10
9
  import { DextoRuntimeError } from "../errors/index.js";
11
10
  import { DextoLogComponent } from "../logger/v2/types.js";
11
+ import { convertZodSchemaToJsonSchema } from "../utils/schema.js";
12
12
  import { ApprovalStatus, ApprovalType, DenialReason } from "../approval/types.js";
13
13
  import { InstrumentClass } from "../telemetry/decorators.js";
14
- import {
15
- generateBashPatternKey,
16
- generateBashPatternSuggestions,
17
- isDangerousCommand
18
- } from "./bash-pattern-utils.js";
14
+ import { extractToolCallMeta, wrapToolParametersSchema } from "./tool-call-metadata.js";
15
+ import { isBackgroundTasksEnabled } from "../utils/env.js";
19
16
  _ToolManager_decorators = [InstrumentClass({
20
17
  prefix: "tool",
21
- excludeMethods: [
22
- "setPluginManager",
23
- "setStateManager",
24
- "getApprovalManager",
25
- "getAllowedToolsProvider"
26
- ]
18
+ excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
27
19
  })];
28
20
  let _ToolManager = class _ToolManager {
29
21
  mcpManager;
30
- internalToolsProvider;
22
+ agentTools = /* @__PURE__ */ new Map();
31
23
  approvalManager;
32
24
  allowedToolsProvider;
33
25
  approvalMode;
34
26
  agentEventBus;
35
27
  toolPolicies;
36
- // Plugin support - set after construction to avoid circular dependencies
37
- pluginManager;
28
+ toolExecutionContextFactory;
29
+ // Hook support - set after construction to avoid circular dependencies
30
+ hookManager;
38
31
  sessionManager;
39
32
  stateManager;
40
- // Tool source prefixing - ALL tools get prefixed by source
33
+ workspaceManager;
34
+ currentWorkspace;
35
+ workspaceListenerAttached = false;
36
+ workspaceListenerAbort = new AbortController();
37
+ // Tool naming:
38
+ // - MCP tools are prefixed with `mcp--` for disambiguation.
39
+ // - Local tools use their `Tool.id` as-is (no internal/custom prefixing).
41
40
  static MCP_TOOL_PREFIX = "mcp--";
42
- static INTERNAL_TOOL_PREFIX = "internal--";
43
- static CUSTOM_TOOL_PREFIX = "custom--";
44
41
  // Tool caching for performance
45
42
  toolsCache = {};
46
43
  cacheValid = false;
@@ -49,7 +46,33 @@ let _ToolManager = class _ToolManager {
49
46
  // When a skill with allowedTools is invoked, those tools are auto-approved (skip confirmation)
50
47
  // This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow
51
48
  sessionAutoApproveTools = /* @__PURE__ */ new Map();
52
- constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, options, logger) {
49
+ // Session-level auto-approve tools set by users (UI)
50
+ sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
51
+ sessionDisabledTools = /* @__PURE__ */ new Map();
52
+ globalDisabledTools = [];
53
+ cleanupHandlers = /* @__PURE__ */ new Set();
54
+ cleanupStarted = false;
55
+ resolveLocalToolIdOrAlias(name) {
56
+ const direct = this.agentTools.get(name);
57
+ if (direct) return direct.id;
58
+ const lower = name.toLowerCase();
59
+ for (const tool of this.agentTools.values()) {
60
+ if (tool.id.toLowerCase() === lower) {
61
+ return tool.id;
62
+ }
63
+ if (tool.aliases?.some((alias) => alias.toLowerCase() === lower)) {
64
+ return tool.id;
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ normalizeToolPolicyPattern(pattern) {
70
+ if (pattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
71
+ return pattern;
72
+ }
73
+ return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
74
+ }
75
+ constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger) {
53
76
  this.mcpManager = mcpManager;
54
77
  this.approvalManager = approvalManager;
55
78
  this.allowedToolsProvider = allowedToolsProvider;
@@ -57,18 +80,12 @@ let _ToolManager = class _ToolManager {
57
80
  this.agentEventBus = agentEventBus;
58
81
  this.toolPolicies = toolPolicies;
59
82
  this.logger = logger.createChild(DextoLogComponent.TOOLS);
60
- if (options?.internalToolsConfig && options.internalToolsConfig.length > 0 || options?.customToolsConfig && options.customToolsConfig.length > 0) {
61
- const internalToolsServices = {
62
- ...options.internalToolsServices,
63
- approvalManager
64
- };
65
- this.internalToolsProvider = new InternalToolsProvider(
66
- internalToolsServices,
67
- options.internalToolsConfig || [],
68
- options.customToolsConfig || [],
69
- this.logger
83
+ this.setTools(tools);
84
+ this.toolExecutionContextFactory = () => {
85
+ throw ToolError.configInvalid(
86
+ "ToolExecutionContextFactory not configured. DextoAgent.start() must configure tool execution context before tools can run."
70
87
  );
71
- }
88
+ };
72
89
  this.setupNotificationListeners();
73
90
  this.logger.debug("ToolManager initialized");
74
91
  }
@@ -76,50 +93,78 @@ let _ToolManager = class _ToolManager {
76
93
  * Initialize the ToolManager and its components
77
94
  */
78
95
  async initialize() {
79
- if (this.internalToolsProvider) {
80
- await this.internalToolsProvider.initialize();
81
- }
82
96
  this.logger.debug("ToolManager initialization complete");
83
97
  }
98
+ setTools(tools) {
99
+ this.agentTools.clear();
100
+ for (const tool of tools) {
101
+ this.agentTools.set(tool.id, tool);
102
+ }
103
+ this.invalidateCache();
104
+ }
105
+ setToolExecutionContextFactory(factory) {
106
+ this.toolExecutionContextFactory = factory;
107
+ }
108
+ registerCleanup(handler) {
109
+ this.cleanupHandlers.add(handler);
110
+ }
111
+ async cleanup() {
112
+ if (this.cleanupStarted) {
113
+ return;
114
+ }
115
+ this.cleanupStarted = true;
116
+ for (const handler of this.cleanupHandlers) {
117
+ try {
118
+ await handler();
119
+ } catch (error) {
120
+ const err = error instanceof Error ? error : new Error(String(error));
121
+ this.logger.warn(`ToolManager cleanup handler failed: ${err.message}`, {
122
+ color: "yellow"
123
+ });
124
+ }
125
+ }
126
+ }
84
127
  /**
85
- * Set plugin support services (called after construction to avoid circular dependencies)
128
+ * Set hook support services (called after construction to avoid circular dependencies)
86
129
  */
87
- setPluginSupport(pluginManager, sessionManager, stateManager) {
88
- this.pluginManager = pluginManager;
130
+ setHookSupport(hookManager, sessionManager, stateManager) {
131
+ this.hookManager = hookManager;
89
132
  this.sessionManager = sessionManager;
90
133
  this.stateManager = stateManager;
91
- this.logger.debug("Plugin support configured for ToolManager");
134
+ this.logger.debug("Hook support configured for ToolManager");
92
135
  }
93
136
  /**
94
- * Set agent reference for custom tools (called after construction to avoid circular dependencies)
95
- * Must be called before initialize() if custom tools are configured
137
+ * Set workspace manager for tool execution context propagation.
96
138
  */
97
- setAgent(agent) {
98
- if (this.internalToolsProvider) {
99
- this.internalToolsProvider.setAgent(agent);
100
- this.logger.debug("Agent reference configured for custom tools");
139
+ setWorkspaceManager(workspaceManager) {
140
+ this.workspaceManager = workspaceManager;
141
+ void this.refreshWorkspace();
142
+ if (!this.workspaceListenerAttached) {
143
+ this.workspaceListenerAttached = true;
144
+ this.agentEventBus.on(
145
+ "workspace:changed",
146
+ (payload) => {
147
+ this.currentWorkspace = payload.workspace ?? void 0;
148
+ },
149
+ { signal: this.workspaceListenerAbort.signal }
150
+ );
151
+ this.registerCleanup(() => {
152
+ if (!this.workspaceListenerAbort.signal.aborted) {
153
+ this.workspaceListenerAbort.abort();
154
+ }
155
+ });
101
156
  }
157
+ this.logger.debug("WorkspaceManager reference configured for ToolManager");
102
158
  }
103
- /**
104
- * Set prompt manager for invoke_skill tool (called after construction to avoid circular dependencies)
105
- * Must be called before initialize() if invoke_skill tool is enabled
106
- */
107
- setPromptManager(promptManager) {
108
- if (this.internalToolsProvider) {
109
- this.internalToolsProvider.setPromptManager(promptManager);
110
- this.logger.debug("PromptManager reference configured for invoke_skill tool");
159
+ async refreshWorkspace() {
160
+ if (!this.workspaceManager) {
161
+ return;
111
162
  }
112
- }
113
- /**
114
- * Set task forker for context:fork skill execution (late-binding)
115
- * Called by agent-spawner custom tool provider after RuntimeService is created.
116
- * This enables invoke_skill to fork execution to an isolated subagent.
117
- */
118
- setTaskForker(taskForker) {
119
- if (this.internalToolsProvider) {
120
- this.internalToolsProvider.setTaskForker(taskForker);
163
+ try {
164
+ this.currentWorkspace = await this.workspaceManager.getWorkspace();
165
+ } catch (error) {
121
166
  this.logger.debug(
122
- "TaskForker reference configured for invoke_skill (context:fork support)"
167
+ `Failed to refresh workspace context: ${error instanceof Error ? error.message : String(error)}`
123
168
  );
124
169
  }
125
170
  }
@@ -130,18 +175,48 @@ let _ToolManager = class _ToolManager {
130
175
  * This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
131
176
  *
132
177
  * @param sessionId The session ID
133
- * @param autoApproveTools Array of tool names to auto-approve (e.g., ['custom--bash_exec', 'custom--read_file'])
178
+ * @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
134
179
  */
135
180
  setSessionAutoApproveTools(sessionId, autoApproveTools) {
136
181
  if (autoApproveTools.length === 0) {
137
182
  this.clearSessionAutoApproveTools(sessionId);
138
183
  return;
139
184
  }
140
- this.sessionAutoApproveTools.set(sessionId, autoApproveTools);
185
+ const normalized = autoApproveTools.map(
186
+ (pattern) => this.normalizeToolPolicyPattern(pattern)
187
+ );
188
+ this.sessionAutoApproveTools.set(sessionId, normalized);
141
189
  this.logger.info(
142
190
  `Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
143
191
  );
144
- this.logger.debug(`Auto-approve tools: ${autoApproveTools.join(", ")}`);
192
+ this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
193
+ }
194
+ /**
195
+ * Set session-level auto-approve tools chosen by the user.
196
+ */
197
+ setSessionUserAutoApproveTools(sessionId, autoApproveTools) {
198
+ if (autoApproveTools.length === 0) {
199
+ this.clearSessionUserAutoApproveTools(sessionId);
200
+ return;
201
+ }
202
+ const normalized = autoApproveTools.map(
203
+ (pattern) => this.normalizeToolPolicyPattern(pattern)
204
+ );
205
+ this.sessionUserAutoApproveTools.set(sessionId, normalized);
206
+ this.logger.info(
207
+ `Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
208
+ );
209
+ this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
210
+ }
211
+ /**
212
+ * Clear session-level auto-approve tools chosen by the user.
213
+ */
214
+ clearSessionUserAutoApproveTools(sessionId) {
215
+ const hadAutoApprove = this.sessionUserAutoApproveTools.has(sessionId);
216
+ this.sessionUserAutoApproveTools.delete(sessionId);
217
+ if (hadAutoApprove) {
218
+ this.logger.info(`Session user auto-approve tools cleared for '${sessionId}'`);
219
+ }
145
220
  }
146
221
  /**
147
222
  * Clear session-level auto-approve tools.
@@ -156,6 +231,76 @@ let _ToolManager = class _ToolManager {
156
231
  this.logger.info(`Session auto-approve tools cleared for '${sessionId}'`);
157
232
  }
158
233
  }
234
+ hasSessionUserAutoApproveTools(sessionId) {
235
+ return this.sessionUserAutoApproveTools.has(sessionId);
236
+ }
237
+ // ============= ENABLED/DISABLED TOOLS =============
238
+ /**
239
+ * Set global disabled tools (agent-level preferences).
240
+ */
241
+ setGlobalDisabledTools(toolNames) {
242
+ this.globalDisabledTools = [...toolNames];
243
+ this.logger.info("Global disabled tools updated", {
244
+ count: toolNames.length
245
+ });
246
+ this.agentEventBus.emit("tools:enabled-updated", {
247
+ scope: "global",
248
+ disabledTools: [...this.globalDisabledTools]
249
+ });
250
+ }
251
+ getGlobalDisabledTools() {
252
+ return [...this.globalDisabledTools];
253
+ }
254
+ /**
255
+ * Set session-level disabled tools (overrides global list).
256
+ */
257
+ setSessionDisabledTools(sessionId, toolNames) {
258
+ if (toolNames.length === 0) {
259
+ this.clearSessionDisabledTools(sessionId);
260
+ return;
261
+ }
262
+ this.sessionDisabledTools.set(sessionId, [...toolNames]);
263
+ this.logger.info("Session disabled tools updated", {
264
+ sessionId,
265
+ count: toolNames.length
266
+ });
267
+ this.agentEventBus.emit("tools:enabled-updated", {
268
+ scope: "session",
269
+ sessionId,
270
+ disabledTools: [...toolNames]
271
+ });
272
+ }
273
+ /**
274
+ * Clear session-level disabled tools.
275
+ */
276
+ clearSessionDisabledTools(sessionId) {
277
+ const hadOverrides = this.sessionDisabledTools.has(sessionId);
278
+ this.sessionDisabledTools.delete(sessionId);
279
+ if (hadOverrides) {
280
+ this.logger.info("Session disabled tools cleared", { sessionId });
281
+ }
282
+ }
283
+ /**
284
+ * Get disabled tools for a session (session override wins).
285
+ */
286
+ getDisabledTools(sessionId) {
287
+ if (sessionId && this.sessionDisabledTools.has(sessionId)) {
288
+ return this.sessionDisabledTools.get(sessionId) ?? [];
289
+ }
290
+ return this.globalDisabledTools;
291
+ }
292
+ /**
293
+ * Filter a tool set based on disabled tools for a session.
294
+ */
295
+ filterToolsForSession(toolSet, sessionId) {
296
+ const disabled = new Set(this.getDisabledTools(sessionId));
297
+ if (disabled.size === 0) {
298
+ return toolSet;
299
+ }
300
+ return Object.fromEntries(
301
+ Object.entries(toolSet).filter(([toolName]) => !disabled.has(toolName))
302
+ );
303
+ }
159
304
  /**
160
305
  * Check if a session has auto-approve tools set.
161
306
  *
@@ -166,7 +311,7 @@ let _ToolManager = class _ToolManager {
166
311
  return this.sessionAutoApproveTools.has(sessionId);
167
312
  }
168
313
  /**
169
- * Get the auto-approve tools for a session.
314
+ * Get the auto-approve tools for a session (skill-provided list).
170
315
  *
171
316
  * @param sessionId The session ID to check
172
317
  * @returns Array of auto-approve tool names, or undefined if none set
@@ -174,6 +319,21 @@ let _ToolManager = class _ToolManager {
174
319
  getSessionAutoApproveTools(sessionId) {
175
320
  return this.sessionAutoApproveTools.get(sessionId);
176
321
  }
322
+ /**
323
+ * Get the user auto-approve tools for a session.
324
+ */
325
+ getSessionUserAutoApproveTools(sessionId) {
326
+ return this.sessionUserAutoApproveTools.get(sessionId);
327
+ }
328
+ /**
329
+ * Combined auto-approve list for a session.
330
+ */
331
+ getCombinedSessionAutoApproveTools(sessionId) {
332
+ return [
333
+ ...this.sessionAutoApproveTools.get(sessionId) ?? [],
334
+ ...this.sessionUserAutoApproveTools.get(sessionId) ?? []
335
+ ];
336
+ }
177
337
  /**
178
338
  * Check if a tool should be auto-approved for a session.
179
339
  * Returns true if the tool is in the session's auto-approve list.
@@ -183,8 +343,8 @@ let _ToolManager = class _ToolManager {
183
343
  * @returns true if the tool should be auto-approved
184
344
  */
185
345
  isToolAutoApprovedForSession(sessionId, toolName) {
186
- const autoApproveTools = this.sessionAutoApproveTools.get(sessionId);
187
- if (!autoApproveTools) {
346
+ const autoApproveTools = this.getCombinedSessionAutoApproveTools(sessionId);
347
+ if (autoApproveTools.length === 0) {
188
348
  return false;
189
349
  }
190
350
  return autoApproveTools.some((pattern) => this.matchesToolPolicy(toolName, pattern));
@@ -223,39 +383,44 @@ let _ToolManager = class _ToolManager {
223
383
  }
224
384
  });
225
385
  }
226
- // ==================== Bash Pattern Approval Helpers ====================
227
- /**
228
- * Check if a tool name represents a bash execution tool
229
- */
230
- isBashTool(toolName) {
231
- return toolName === "bash_exec" || toolName === "internal--bash_exec" || toolName === "custom--bash_exec";
386
+ // ==================== Pattern Approval Helpers ====================
387
+ getToolPatternKey(toolName, args) {
388
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
389
+ return null;
390
+ }
391
+ const tool = this.agentTools.get(toolName);
392
+ if (!tool?.getApprovalPatternKey) {
393
+ return null;
394
+ }
395
+ try {
396
+ return tool.getApprovalPatternKey(args);
397
+ } catch (error) {
398
+ this.logger.debug(
399
+ `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
400
+ );
401
+ return null;
402
+ }
232
403
  }
233
- /**
234
- * Check if a bash command is covered by any approved pattern.
235
- * Generates a pattern key from the command, then checks if it's covered by stored patterns.
236
- *
237
- * Returns approval info if covered, or pattern suggestions if not.
238
- */
239
- checkBashPatternApproval(command) {
240
- const patternKey = generateBashPatternKey(command);
241
- if (!patternKey) {
242
- if (isDangerousCommand(command)) {
243
- this.logger.debug(
244
- `Skipping pattern generation for dangerous command: ${command.split(/\s+/)[0]}`
245
- );
246
- }
247
- return { approved: false, suggestedPatterns: [] };
404
+ getToolSuggestedPatterns(toolName, args) {
405
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
406
+ return void 0;
248
407
  }
249
- if (this.approvalManager.matchesBashPattern(patternKey)) {
250
- return { approved: true };
408
+ const tool = this.agentTools.get(toolName);
409
+ if (!tool?.suggestApprovalPatterns) {
410
+ return void 0;
411
+ }
412
+ try {
413
+ const patterns = tool.suggestApprovalPatterns(args);
414
+ return patterns.length > 0 ? patterns : void 0;
415
+ } catch (error) {
416
+ this.logger.debug(
417
+ `Pattern suggestion failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
418
+ );
419
+ return void 0;
251
420
  }
252
- return {
253
- approved: false,
254
- suggestedPatterns: generateBashPatternSuggestions(command)
255
- };
256
421
  }
257
422
  /**
258
- * Auto-approve pending tool confirmation requests for the same tool.
423
+ * Auto-approve pending tool approval requests for the same tool.
259
424
  * Called after a user selects "remember choice" for a tool.
260
425
  * This handles the case where parallel tool calls come in before the first one is approved.
261
426
  *
@@ -265,7 +430,7 @@ let _ToolManager = class _ToolManager {
265
430
  autoApprovePendingToolRequests(toolName, sessionId) {
266
431
  const count = this.approvalManager.autoApprovePendingRequests(
267
432
  (request) => {
268
- if (request.type !== ApprovalType.TOOL_CONFIRMATION) {
433
+ if (request.type !== ApprovalType.TOOL_APPROVAL) {
269
434
  return false;
270
435
  }
271
436
  if (request.sessionId !== sessionId) {
@@ -284,42 +449,86 @@ let _ToolManager = class _ToolManager {
284
449
  }
285
450
  }
286
451
  /**
287
- * Auto-approve pending bash command requests that match a pattern.
288
- * Called after a user selects "remember pattern" for a bash command.
289
- * This handles the case where parallel bash commands come in before the first one is approved.
290
- *
291
- * @param pattern The bash pattern that was just remembered
292
- * @param sessionId The session ID for context
452
+ * Auto-approve pending tool approval requests that are now covered by a remembered pattern.
453
+ * Called after a user selects "remember pattern" for a tool.
293
454
  */
294
- autoApprovePendingBashRequests(pattern, sessionId) {
455
+ autoApprovePendingPatternRequests(toolName, sessionId) {
456
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
457
+ return;
458
+ }
459
+ const tool = this.agentTools.get(toolName);
460
+ const getPatternKey = tool?.getApprovalPatternKey;
461
+ if (!getPatternKey) {
462
+ return;
463
+ }
295
464
  const count = this.approvalManager.autoApprovePendingRequests(
296
465
  (request) => {
297
- if (request.type !== ApprovalType.TOOL_CONFIRMATION) {
466
+ if (request.type !== ApprovalType.TOOL_APPROVAL) {
298
467
  return false;
299
468
  }
300
469
  if (request.sessionId !== sessionId) {
301
470
  return false;
302
471
  }
303
472
  const metadata = request.metadata;
304
- if (!this.isBashTool(metadata.toolName)) {
473
+ if (metadata.toolName !== toolName) {
305
474
  return false;
306
475
  }
307
- const command = metadata.args?.command;
308
- if (!command) {
476
+ const args = metadata.args;
477
+ if (typeof args !== "object" || args === null) {
309
478
  return false;
310
479
  }
311
- const patternKey = generateBashPatternKey(command);
312
- if (!patternKey) {
480
+ let patternKey;
481
+ try {
482
+ patternKey = getPatternKey(args);
483
+ } catch (error) {
484
+ this.logger.debug(
485
+ `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
486
+ );
313
487
  return false;
314
488
  }
315
- return this.approvalManager.matchesBashPattern(patternKey);
489
+ if (!patternKey) return false;
490
+ return this.approvalManager.matchesPattern(toolName, patternKey);
316
491
  },
317
492
  { rememberPattern: void 0 }
318
- // Don't propagate pattern to auto-approved requests
493
+ // Don't propagate pattern choice to auto-approved requests
319
494
  );
320
495
  if (count > 0) {
321
496
  this.logger.info(
322
- `Auto-approved ${count} parallel bash command(s) matching pattern '${pattern}'`
497
+ `Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember pattern"`
498
+ );
499
+ }
500
+ }
501
+ /**
502
+ * Auto-approve pending directory access requests that match a newly approved directory access request.
503
+ *
504
+ * This handles the case where parallel file operations request directory approval concurrently.
505
+ */
506
+ autoApprovePendingDirectoryAccessRequests(options) {
507
+ const count = this.approvalManager.autoApprovePendingRequests(
508
+ (request) => {
509
+ if (request.type !== ApprovalType.DIRECTORY_ACCESS) {
510
+ return false;
511
+ }
512
+ if (request.sessionId !== options.sessionId) {
513
+ return false;
514
+ }
515
+ const metadata = request.metadata;
516
+ if (typeof metadata?.parentDir !== "string" || metadata.parentDir !== options.parentDir) {
517
+ return false;
518
+ }
519
+ if (options.rememberDirectory) {
520
+ return true;
521
+ }
522
+ if (typeof metadata?.operation !== "string" || typeof metadata?.toolName !== "string") {
523
+ return false;
524
+ }
525
+ return metadata.operation === options.operation && metadata.toolName === options.toolName;
526
+ },
527
+ { rememberDirectory: false }
528
+ );
529
+ if (count > 0) {
530
+ this.logger.info(
531
+ `Auto-approved ${count} parallel request(s) for directory '${options.parentDir}' after directory access was approved`
323
532
  );
324
533
  }
325
534
  }
@@ -333,11 +542,66 @@ let _ToolManager = class _ToolManager {
333
542
  async getMcpTools() {
334
543
  return await this.mcpManager.getAllTools();
335
544
  }
545
+ buildToolExecutionContext(options) {
546
+ const workspace = this.currentWorkspace;
547
+ const baseContext = {
548
+ sessionId: options.sessionId,
549
+ workspaceId: workspace?.id,
550
+ workspace,
551
+ abortSignal: options.abortSignal,
552
+ toolCallId: options.toolCallId,
553
+ logger: this.logger
554
+ };
555
+ return this.toolExecutionContextFactory(baseContext);
556
+ }
557
+ validateLocalToolArgsOrThrow(toolName, args) {
558
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
559
+ return args;
560
+ }
561
+ const tool = this.agentTools.get(toolName);
562
+ if (!tool) {
563
+ return args;
564
+ }
565
+ const validationResult = tool.inputSchema.safeParse(args);
566
+ if (!validationResult.success) {
567
+ this.logger.error(
568
+ `\u274C Invalid arguments for tool ${toolName}: ${validationResult.error.message}`
569
+ );
570
+ throw ToolError.validationFailed(
571
+ toolName,
572
+ `Invalid arguments: ${validationResult.error.message}`
573
+ );
574
+ }
575
+ const validated = validationResult.data;
576
+ if (typeof validated !== "object" || validated === null || Array.isArray(validated)) {
577
+ throw ToolError.validationFailed(toolName, "Invalid arguments: expected an object");
578
+ }
579
+ return validated;
580
+ }
581
+ async executeLocalTool(toolName, args, sessionId, abortSignal, toolCallId) {
582
+ const tool = this.agentTools.get(toolName);
583
+ if (!tool) {
584
+ this.logger.error(`\u274C No local tool found: ${toolName}`);
585
+ this.logger.debug(
586
+ `Available local tools: ${Array.from(this.agentTools.keys()).join(", ")}`
587
+ );
588
+ throw ToolError.notFound(toolName);
589
+ }
590
+ try {
591
+ const context = this.buildToolExecutionContext({ sessionId, abortSignal, toolCallId });
592
+ const result = await tool.execute(args, context);
593
+ return result;
594
+ } catch (error) {
595
+ this.logger.error(`\u274C Local tool execution failed: ${toolName}`, {
596
+ error: error instanceof Error ? error.message : String(error)
597
+ });
598
+ throw error;
599
+ }
600
+ }
336
601
  /**
337
- * Build all tools from sources with universal prefixing
338
- * ALL tools get prefixed by their source - no exceptions
602
+ * Build all tools from sources.
339
603
  *
340
- * TODO: Rethink tool naming convention for more consistency
604
+ * TODO: Rethink MCP tool naming convention for more consistency.
341
605
  * Current issue: MCP tools have dynamic naming based on conflicts:
342
606
  * - No conflict: mcp--toolName
343
607
  * - With conflict: mcp--serverName--toolName
@@ -350,8 +614,6 @@ let _ToolManager = class _ToolManager {
350
614
  async buildAllTools() {
351
615
  const allTools = {};
352
616
  let mcpTools = {};
353
- let internalTools = {};
354
- let customTools = {};
355
617
  try {
356
618
  mcpTools = await this.mcpManager.getAllTools();
357
619
  } catch (error) {
@@ -360,36 +622,13 @@ let _ToolManager = class _ToolManager {
360
622
  );
361
623
  mcpTools = {};
362
624
  }
363
- try {
364
- internalTools = this.internalToolsProvider?.getInternalTools() || {};
365
- } catch (error) {
366
- this.logger.error(
367
- `Failed to get internal tools: ${error instanceof Error ? error.message : String(error)}`
368
- );
369
- internalTools = {};
370
- }
371
- try {
372
- customTools = this.internalToolsProvider?.getCustomTools() || {};
373
- } catch (error) {
374
- this.logger.error(
375
- `Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
376
- );
377
- customTools = {};
378
- }
379
- for (const [toolName, toolDef] of Object.entries(internalTools)) {
380
- const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
381
- allTools[qualifiedName] = {
382
- ...toolDef,
383
- name: qualifiedName,
384
- description: `${toolDef.description || "No description provided"} (internal tool)`
385
- };
386
- }
387
- for (const [toolName, toolDef] of Object.entries(customTools)) {
388
- const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
389
- allTools[qualifiedName] = {
390
- ...toolDef,
391
- name: qualifiedName,
392
- description: `${toolDef.description || "No description provided"} (custom tool)`
625
+ for (const [toolName, tool] of this.agentTools) {
626
+ allTools[toolName] = {
627
+ name: toolName,
628
+ description: tool.description || "No description provided",
629
+ parameters: wrapToolParametersSchema(
630
+ convertZodSchemaToJsonSchema(tool.inputSchema, this.logger)
631
+ )
393
632
  };
394
633
  }
395
634
  for (const [toolName, toolDef] of Object.entries(mcpTools)) {
@@ -397,15 +636,15 @@ let _ToolManager = class _ToolManager {
397
636
  allTools[qualifiedName] = {
398
637
  ...toolDef,
399
638
  name: qualifiedName,
400
- description: `${toolDef.description || "No description provided"} (via MCP servers)`
639
+ description: `${toolDef.description || "No description provided"} (via MCP servers)`,
640
+ parameters: wrapToolParametersSchema(toolDef.parameters)
401
641
  };
402
642
  }
403
643
  const totalTools = Object.keys(allTools).length;
404
644
  const mcpCount = Object.keys(mcpTools).length;
405
- const internalCount = Object.keys(internalTools).length;
406
- const customCount = Object.keys(customTools).length;
645
+ const localCount = this.agentTools.size;
407
646
  this.logger.debug(
408
- `\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${internalCount} internal, ${customCount} custom)`
647
+ `\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${localCount} local)`
409
648
  );
410
649
  return allTools;
411
650
  }
@@ -423,32 +662,44 @@ let _ToolManager = class _ToolManager {
423
662
  return this.toolsCache;
424
663
  }
425
664
  /**
426
- * Execute a tool by routing based on universal prefix
427
- * ALL tools must have source prefix - no exceptions
665
+ * Execute a tool by routing based on prefix:
666
+ * - MCP tools: `mcp--...`
667
+ * - Local tools: `Tool.id`
428
668
  *
429
- * @param toolName The fully qualified tool name (e.g., "internal--edit_file")
669
+ * @param toolName Tool name (e.g., "edit_file", "mcp--filesystem--read_file")
430
670
  * @param args The arguments for the tool
431
671
  * @param toolCallId The unique tool call ID for tracking (from LLM or generated for direct calls)
432
672
  * @param sessionId Optional session ID for context
433
673
  * @param abortSignal Optional abort signal for cancellation support
434
674
  */
435
675
  async executeTool(toolName, args, toolCallId, sessionId, abortSignal) {
676
+ const { toolArgs: rawToolArgs, meta } = extractToolCallMeta(args);
677
+ let toolArgs = rawToolArgs;
678
+ const backgroundTasksEnabled = isBackgroundTasksEnabled();
679
+ const toolDisplayName = this.agentTools.get(toolName)?.displayName;
436
680
  this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
437
- this.logger.debug(`Tool args: ${JSON.stringify(args, null, 2)}`);
681
+ this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
438
682
  if (sessionId) {
439
683
  this.agentEventBus.emit("llm:tool-call", {
440
684
  toolName,
441
- args,
685
+ ...toolDisplayName !== void 0 && { toolDisplayName },
686
+ args: toolArgs,
442
687
  callId: toolCallId,
443
688
  sessionId
444
689
  });
445
690
  }
446
- const { requireApproval, approvalStatus } = await this.handleToolApproval(
691
+ const {
692
+ requireApproval,
693
+ approvalStatus,
694
+ args: validatedToolArgs
695
+ } = await this.handleToolApproval(
447
696
  toolName,
448
- args,
697
+ toolArgs,
449
698
  toolCallId,
450
- sessionId
699
+ sessionId,
700
+ meta.callDescription
451
701
  );
702
+ toolArgs = validatedToolArgs;
452
703
  this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
453
704
  this.logger.info(
454
705
  `\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
@@ -461,13 +712,13 @@ let _ToolManager = class _ToolManager {
461
712
  });
462
713
  }
463
714
  const startTime = Date.now();
464
- if (this.pluginManager && this.sessionManager && this.stateManager) {
715
+ if (this.hookManager && this.sessionManager && this.stateManager) {
465
716
  const beforePayload = {
466
717
  toolName,
467
- args,
718
+ args: toolArgs,
468
719
  ...sessionId !== void 0 && { sessionId }
469
720
  };
470
- const modifiedPayload = await this.pluginManager.executePlugins(
721
+ const modifiedPayload = await this.hookManager.executeHooks(
471
722
  "beforeToolCall",
472
723
  beforePayload,
473
724
  {
@@ -478,10 +729,29 @@ let _ToolManager = class _ToolManager {
478
729
  ...sessionId !== void 0 && { sessionId }
479
730
  }
480
731
  );
481
- args = modifiedPayload.args;
732
+ toolArgs = modifiedPayload.args;
733
+ try {
734
+ toolArgs = this.validateLocalToolArgsOrThrow(toolName, toolArgs);
735
+ } catch (error) {
736
+ this.logger.error(
737
+ `Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
738
+ );
739
+ throw error;
740
+ }
482
741
  }
483
742
  try {
484
743
  let result;
744
+ const registerBackgroundTask = (promise, description) => {
745
+ const fallbackId = `task-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
746
+ return {
747
+ result: {
748
+ taskId: toolCallId ?? fallbackId,
749
+ status: "running",
750
+ description
751
+ },
752
+ promise
753
+ };
754
+ };
485
755
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
486
756
  this.logger.debug(`\u{1F527} Detected MCP tool: '${toolName}'`);
487
757
  const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
@@ -489,65 +759,89 @@ let _ToolManager = class _ToolManager {
489
759
  throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
490
760
  }
491
761
  this.logger.debug(`\u{1F3AF} MCP routing: '${toolName}' -> '${actualToolName}'`);
492
- result = await this.mcpManager.executeTool(actualToolName, args, sessionId);
493
- } else if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
494
- this.logger.debug(`\u{1F527} Detected internal tool: '${toolName}'`);
495
- const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
496
- if (actualToolName.length === 0) {
497
- throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
762
+ const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
763
+ if (meta.runInBackground === true && !backgroundTasksEnabled) {
764
+ this.logger.debug(
765
+ "Background tool execution disabled; running synchronously instead.",
766
+ { toolName }
767
+ );
498
768
  }
499
- if (!this.internalToolsProvider) {
500
- throw ToolError.internalToolsNotInitialized(toolName);
769
+ if (runInBackground) {
770
+ const backgroundSessionId = sessionId;
771
+ const { result: backgroundResult, promise } = registerBackgroundTask(
772
+ this.mcpManager.executeTool(actualToolName, toolArgs, backgroundSessionId),
773
+ `MCP tool ${actualToolName}`
774
+ );
775
+ this.agentEventBus.emit("tool:background", {
776
+ toolName,
777
+ toolCallId: backgroundResult.taskId,
778
+ sessionId: backgroundSessionId,
779
+ description: backgroundResult.description,
780
+ promise,
781
+ ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
782
+ ...meta.notifyOnComplete !== void 0 && {
783
+ notifyOnComplete: meta.notifyOnComplete
784
+ }
785
+ });
786
+ result = backgroundResult;
787
+ } else {
788
+ result = await this.mcpManager.executeTool(actualToolName, toolArgs, sessionId);
501
789
  }
502
- this.logger.debug(`\u{1F3AF} Internal routing: '${toolName}' -> '${actualToolName}'`);
503
- result = await this.internalToolsProvider.executeTool(
504
- actualToolName,
505
- args,
506
- sessionId,
507
- abortSignal,
508
- toolCallId
509
- );
510
- } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
511
- this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
512
- const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
513
- if (actualToolName.length === 0) {
514
- throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
790
+ } else {
791
+ const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
792
+ if (meta.runInBackground === true && !backgroundTasksEnabled) {
793
+ this.logger.debug(
794
+ "Background tool execution disabled; running synchronously instead.",
795
+ { toolName }
796
+ );
515
797
  }
516
- if (!this.internalToolsProvider) {
517
- throw ToolError.internalToolsNotInitialized(toolName);
798
+ if (runInBackground) {
799
+ const backgroundSessionId = sessionId;
800
+ const { result: backgroundResult, promise } = registerBackgroundTask(
801
+ this.executeLocalTool(
802
+ toolName,
803
+ toolArgs,
804
+ backgroundSessionId,
805
+ abortSignal,
806
+ toolCallId
807
+ ),
808
+ `Tool ${toolName}`
809
+ );
810
+ this.agentEventBus.emit("tool:background", {
811
+ toolName,
812
+ toolCallId: backgroundResult.taskId,
813
+ sessionId: backgroundSessionId,
814
+ description: backgroundResult.description,
815
+ promise,
816
+ ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
817
+ ...meta.notifyOnComplete !== void 0 && {
818
+ notifyOnComplete: meta.notifyOnComplete
819
+ }
820
+ });
821
+ result = backgroundResult;
822
+ } else {
823
+ result = await this.executeLocalTool(
824
+ toolName,
825
+ toolArgs,
826
+ sessionId,
827
+ abortSignal,
828
+ toolCallId
829
+ );
518
830
  }
519
- this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
520
- result = await this.internalToolsProvider.executeTool(
521
- actualToolName,
522
- args,
523
- sessionId,
524
- abortSignal,
525
- toolCallId
526
- );
527
- } else {
528
- this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
529
- const stats = await this.getToolStats();
530
- this.logger.error(
531
- `\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
532
- );
533
- this.logger.debug(
534
- `Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
535
- );
536
- throw ToolError.notFound(toolName);
537
831
  }
538
832
  const duration = Date.now() - startTime;
539
833
  this.logger.debug(`\u{1F3AF} Tool execution completed in ${duration}ms: '${toolName}'`);
540
834
  this.logger.info(
541
835
  `\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
542
836
  );
543
- if (this.pluginManager && this.sessionManager && this.stateManager) {
837
+ if (this.hookManager && this.sessionManager && this.stateManager) {
544
838
  const afterPayload = {
545
839
  toolName,
546
840
  result,
547
841
  success: true,
548
842
  ...sessionId !== void 0 && { sessionId }
549
843
  };
550
- const modifiedPayload = await this.pluginManager.executePlugins(
844
+ const modifiedPayload = await this.hookManager.executeHooks(
551
845
  "afterToolResult",
552
846
  afterPayload,
553
847
  {
@@ -562,6 +856,7 @@ let _ToolManager = class _ToolManager {
562
856
  }
563
857
  return {
564
858
  result,
859
+ ...toolDisplayName !== void 0 && { toolDisplayName },
565
860
  ...requireApproval && { requireApproval, approvalStatus }
566
861
  };
567
862
  } catch (error) {
@@ -569,14 +864,14 @@ let _ToolManager = class _ToolManager {
569
864
  this.logger.error(
570
865
  `\u274C Tool execution failed for ${toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
571
866
  );
572
- if (this.pluginManager && this.sessionManager && this.stateManager) {
867
+ if (this.hookManager && this.sessionManager && this.stateManager) {
573
868
  const afterPayload = {
574
869
  toolName,
575
870
  result: error instanceof Error ? error.message : String(error),
576
871
  success: false,
577
872
  ...sessionId !== void 0 && { sessionId }
578
873
  };
579
- await this.pluginManager.executePlugins("afterToolResult", afterPayload, {
874
+ await this.hookManager.executeHooks("afterToolResult", afterPayload, {
580
875
  sessionManager: this.sessionManager,
581
876
  mcpManager: this.mcpManager,
582
877
  toolManager: this,
@@ -588,30 +883,20 @@ let _ToolManager = class _ToolManager {
588
883
  }
589
884
  }
590
885
  /**
591
- * Check if a tool exists (must have proper source prefix)
886
+ * Check if a tool exists.
592
887
  */
593
888
  async hasTool(toolName) {
594
889
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
595
890
  const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
596
891
  return this.mcpManager.getToolClient(actualToolName) !== void 0;
597
892
  }
598
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
599
- const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
600
- return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
601
- }
602
- if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
603
- const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
604
- return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
605
- }
606
- return false;
893
+ return this.agentTools.has(toolName);
607
894
  }
608
895
  /**
609
896
  * Get tool statistics across all sources
610
897
  */
611
898
  async getToolStats() {
612
899
  let mcpTools = {};
613
- let internalTools = {};
614
- let customTools = {};
615
900
  try {
616
901
  mcpTools = await this.mcpManager.getAllTools();
617
902
  } catch (error) {
@@ -620,34 +905,16 @@ let _ToolManager = class _ToolManager {
620
905
  );
621
906
  mcpTools = {};
622
907
  }
623
- try {
624
- internalTools = this.internalToolsProvider?.getInternalTools() || {};
625
- } catch (error) {
626
- this.logger.error(
627
- `Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
628
- );
629
- internalTools = {};
630
- }
631
- try {
632
- customTools = this.internalToolsProvider?.getCustomTools() || {};
633
- } catch (error) {
634
- this.logger.error(
635
- `Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
636
- );
637
- customTools = {};
638
- }
639
908
  const mcpCount = Object.keys(mcpTools).length;
640
- const internalCount = Object.keys(internalTools).length;
641
- const customCount = Object.keys(customTools).length;
909
+ const localCount = this.agentTools.size;
642
910
  return {
643
- total: mcpCount + internalCount + customCount,
911
+ total: mcpCount + localCount,
644
912
  mcp: mcpCount,
645
- internal: internalCount,
646
- custom: customCount
913
+ local: localCount
647
914
  };
648
915
  }
649
916
  /**
650
- * Get the source of a tool (mcp, internal, custom, or unknown)
917
+ * Get the source of a tool (mcp, local, or unknown).
651
918
  * @param toolName The name of the tool to check
652
919
  * @returns The source of the tool
653
920
  */
@@ -655,11 +922,8 @@ let _ToolManager = class _ToolManager {
655
922
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
656
923
  return "mcp";
657
924
  }
658
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX) && toolName.length > _ToolManager.INTERNAL_TOOL_PREFIX.length) {
659
- return "internal";
660
- }
661
- if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
662
- return "custom";
925
+ if (this.agentTools.has(toolName)) {
926
+ return "local";
663
927
  }
664
928
  return "unknown";
665
929
  }
@@ -670,7 +934,7 @@ let _ToolManager = class _ToolManager {
670
934
  * Examples:
671
935
  * - Policy "mcp--read_file" matches "mcp--read_file" (exact)
672
936
  * - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
673
- * - Policy "internal--ask_user" matches "internal--ask_user" (exact only)
937
+ * - Policy "read_file" matches "read_file" (local tool exact only)
674
938
  *
675
939
  * @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
676
940
  * @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
@@ -721,26 +985,21 @@ let _ToolManager = class _ToolManager {
721
985
  * Tools can implement getApprovalOverride() to request specialized approval flows
722
986
  * (e.g., directory access approval for file tools) instead of default tool confirmation.
723
987
  *
724
- * @param toolName The fully qualified tool name
988
+ * @param toolName Tool name
725
989
  * @param args The tool arguments
726
990
  * @param sessionId Optional session ID
727
991
  * @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
728
992
  */
729
- async checkCustomApprovalOverride(toolName, args, sessionId) {
730
- let actualToolName;
731
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
732
- actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
733
- } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
734
- actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
735
- }
736
- if (!actualToolName || !this.internalToolsProvider) {
993
+ async checkCustomApprovalOverride(toolName, args, toolCallId, sessionId) {
994
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
737
995
  return { handled: false };
738
996
  }
739
- const tool = this.internalToolsProvider.getTool(actualToolName);
997
+ const tool = this.agentTools.get(toolName);
740
998
  if (!tool?.getApprovalOverride) {
741
999
  return { handled: false };
742
1000
  }
743
- const approvalRequest = await tool.getApprovalOverride(args);
1001
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
1002
+ const approvalRequest = await tool.getApprovalOverride(args, context);
744
1003
  if (!approvalRequest) {
745
1004
  return { handled: false };
746
1005
  }
@@ -753,7 +1012,23 @@ let _ToolManager = class _ToolManager {
753
1012
  const response = await this.approvalManager.requestApproval(approvalRequest);
754
1013
  if (response.status === ApprovalStatus.APPROVED) {
755
1014
  if (tool.onApprovalGranted) {
756
- tool.onApprovalGranted(response);
1015
+ tool.onApprovalGranted(response, context, approvalRequest);
1016
+ }
1017
+ if (approvalRequest.type === ApprovalType.DIRECTORY_ACCESS) {
1018
+ const metadata = approvalRequest.metadata;
1019
+ const parentDir = typeof metadata?.parentDir === "string" ? metadata.parentDir : null;
1020
+ const operation = typeof metadata?.operation === "string" ? metadata.operation : null;
1021
+ if (parentDir && operation) {
1022
+ const data = response.data;
1023
+ const rememberDirectory = data?.rememberDirectory ?? false;
1024
+ this.autoApprovePendingDirectoryAccessRequests({
1025
+ parentDir,
1026
+ operation,
1027
+ sessionId,
1028
+ toolName,
1029
+ rememberDirectory
1030
+ });
1031
+ }
757
1032
  }
758
1033
  this.logger.info(
759
1034
  `Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
@@ -776,12 +1051,25 @@ let _ToolManager = class _ToolManager {
776
1051
  * Handle tool approval flow. Checks various precedence levels to determine
777
1052
  * if a tool should be auto-approved, denied, or requires manual approval.
778
1053
  */
779
- async handleToolApproval(toolName, args, toolCallId, sessionId) {
780
- const quickResult = await this.tryQuickApprovalResolution(toolName, args, sessionId);
1054
+ async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
1055
+ const validatedArgs = this.validateLocalToolArgsOrThrow(toolName, args);
1056
+ const quickResult = await this.tryQuickApprovalResolution(
1057
+ toolName,
1058
+ validatedArgs,
1059
+ toolCallId,
1060
+ sessionId
1061
+ );
781
1062
  if (quickResult !== null) {
782
- return quickResult;
1063
+ return { ...quickResult, args: validatedArgs };
783
1064
  }
784
- return this.requestManualApproval(toolName, args, toolCallId, sessionId);
1065
+ const manualResult = await this.requestManualApproval(
1066
+ toolName,
1067
+ validatedArgs,
1068
+ toolCallId,
1069
+ sessionId,
1070
+ callDescription
1071
+ );
1072
+ return { ...manualResult, args: validatedArgs };
785
1073
  }
786
1074
  /**
787
1075
  * Try to resolve tool approval quickly based on policies and cached permissions.
@@ -793,10 +1081,10 @@ let _ToolManager = class _ToolManager {
793
1081
  * 3. Session auto-approve (skill allowed-tools)
794
1082
  * 4. Static allow list
795
1083
  * 5. Dynamic "remembered" allowed list
796
- * 6. Bash command patterns
1084
+ * 6. Tool approval patterns
797
1085
  * 7. Approval mode (auto-approve/auto-deny)
798
1086
  */
799
- async tryQuickApprovalResolution(toolName, args, sessionId) {
1087
+ async tryQuickApprovalResolution(toolName, args, toolCallId, sessionId) {
800
1088
  if (this.isInAlwaysDenyList(toolName)) {
801
1089
  this.logger.info(
802
1090
  `Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
@@ -806,6 +1094,7 @@ let _ToolManager = class _ToolManager {
806
1094
  const customApprovalResult = await this.checkCustomApprovalOverride(
807
1095
  toolName,
808
1096
  args,
1097
+ toolCallId,
809
1098
  sessionId
810
1099
  );
811
1100
  if (customApprovalResult.handled) {
@@ -829,17 +1118,12 @@ let _ToolManager = class _ToolManager {
829
1118
  );
830
1119
  return { requireApproval: false };
831
1120
  }
832
- if (this.isBashTool(toolName)) {
833
- const command = args.command;
834
- if (command) {
835
- const bashResult = this.checkBashPatternApproval(command);
836
- if (bashResult.approved) {
837
- this.logger.info(
838
- `Bash command '${command}' matched approved pattern \u2013 skipping confirmation.`
839
- );
840
- return { requireApproval: false };
841
- }
842
- }
1121
+ const patternKey = this.getToolPatternKey(toolName, args);
1122
+ if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey)) {
1123
+ this.logger.info(
1124
+ `Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
1125
+ );
1126
+ return { requireApproval: false };
843
1127
  }
844
1128
  if (this.approvalMode === "auto-approve") {
845
1129
  this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
@@ -855,22 +1139,25 @@ let _ToolManager = class _ToolManager {
855
1139
  * Request manual approval from the user for a tool execution.
856
1140
  * Generates preview, sends approval request, and handles the response.
857
1141
  */
858
- async requestManualApproval(toolName, args, toolCallId, sessionId) {
1142
+ async requestManualApproval(toolName, args, toolCallId, sessionId, callDescription) {
859
1143
  this.logger.info(
860
- `Tool confirmation requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
1144
+ `Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
861
1145
  );
862
1146
  try {
1147
+ const toolDisplayName = this.agentTools.get(toolName)?.displayName;
863
1148
  const displayPreview = await this.generateToolPreview(
864
1149
  toolName,
865
1150
  args,
866
1151
  toolCallId,
867
1152
  sessionId
868
1153
  );
869
- const suggestedPatterns = this.getBashSuggestedPatterns(toolName, args);
870
- const response = await this.approvalManager.requestToolConfirmation({
1154
+ const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
1155
+ const response = await this.approvalManager.requestToolApproval({
871
1156
  toolName,
1157
+ ...toolDisplayName !== void 0 && { toolDisplayName },
872
1158
  toolCallId,
873
1159
  args,
1160
+ ...callDescription !== void 0 && { description: callDescription },
874
1161
  ...sessionId !== void 0 && { sessionId },
875
1162
  ...displayPreview !== void 0 && { displayPreview },
876
1163
  ...suggestedPatterns !== void 0 && { suggestedPatterns }
@@ -882,12 +1169,12 @@ let _ToolManager = class _ToolManager {
882
1169
  this.handleApprovalDenied(toolName, response, sessionId);
883
1170
  }
884
1171
  this.logger.info(
885
- `Tool confirmation approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
1172
+ `Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
886
1173
  );
887
1174
  return { requireApproval: true, approvalStatus: "approved" };
888
1175
  } catch (error) {
889
1176
  this.logger.error(
890
- `Tool confirmation error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
1177
+ `Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
891
1178
  );
892
1179
  throw error;
893
1180
  }
@@ -896,14 +1183,13 @@ let _ToolManager = class _ToolManager {
896
1183
  * Generate a preview for the tool approval UI if the tool supports it.
897
1184
  */
898
1185
  async generateToolPreview(toolName, args, toolCallId, sessionId) {
899
- const actualToolName = toolName.replace(/^internal--/, "").replace(/^custom--/, "");
900
- const internalTool = this.internalToolsProvider?.getTool(actualToolName);
901
- if (!internalTool?.generatePreview) {
1186
+ const tool = this.agentTools.get(toolName);
1187
+ if (!tool?.generatePreview) {
902
1188
  return void 0;
903
1189
  }
904
1190
  try {
905
- const context = { sessionId, toolCallId };
906
- const preview = await internalTool.generatePreview(args, context);
1191
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
1192
+ const preview = await tool.generatePreview(args, context);
907
1193
  this.logger.debug(`Generated preview for ${toolName}`);
908
1194
  return preview ?? void 0;
909
1195
  } catch (previewError) {
@@ -917,20 +1203,6 @@ let _ToolManager = class _ToolManager {
917
1203
  return void 0;
918
1204
  }
919
1205
  }
920
- /**
921
- * Get suggested bash patterns for the approval UI.
922
- */
923
- getBashSuggestedPatterns(toolName, args) {
924
- if (!this.isBashTool(toolName)) {
925
- return void 0;
926
- }
927
- const command = args.command;
928
- if (!command) {
929
- return void 0;
930
- }
931
- const result = this.checkBashPatternApproval(command);
932
- return result.suggestedPatterns?.length ? result.suggestedPatterns : void 0;
933
- }
934
1206
  /**
935
1207
  * Handle "remember choice" or "remember pattern" when user approves a tool.
936
1208
  */
@@ -946,10 +1218,10 @@ let _ToolManager = class _ToolManager {
946
1218
  `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
947
1219
  );
948
1220
  this.autoApprovePendingToolRequests(toolName, allowSessionId);
949
- } else if (rememberPattern && this.isBashTool(toolName)) {
950
- this.approvalManager.addBashPattern(rememberPattern);
951
- this.logger.info(`Bash pattern '${rememberPattern}' added for session approval`);
952
- this.autoApprovePendingBashRequests(rememberPattern, sessionId);
1221
+ } else if (rememberPattern && this.agentTools.get(toolName)?.getApprovalPatternKey) {
1222
+ this.approvalManager.addPattern(toolName, rememberPattern);
1223
+ this.logger.info(`Pattern '${rememberPattern}' added for tool '${toolName}' approval`);
1224
+ this.autoApprovePendingPatternRequests(toolName, sessionId);
953
1225
  }
954
1226
  }
955
1227
  /**