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