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