@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
@@ -4,45 +4,40 @@ import {
4
4
  __runInitializers
5
5
  } from "../chunk-PTJYTZNU.js";
6
6
  var _ToolManager_decorators, _init;
7
- import { InternalToolsProvider } from "./internal-tools/provider.js";
8
7
  import { ToolError } from "./errors.js";
9
8
  import { ToolErrorCode } from "./error-codes.js";
10
9
  import { DextoRuntimeError } from "../errors/index.js";
11
10
  import { DextoLogComponent } from "../logger/v2/types.js";
11
+ import { convertZodSchemaToJsonSchema } from "../utils/schema.js";
12
12
  import { ApprovalStatus, ApprovalType, DenialReason } from "../approval/types.js";
13
13
  import { InstrumentClass } from "../telemetry/decorators.js";
14
14
  import { extractToolCallMeta, wrapToolParametersSchema } from "./tool-call-metadata.js";
15
- import {
16
- generateBashPatternKey,
17
- generateBashPatternSuggestions,
18
- isDangerousCommand
19
- } from "./bash-pattern-utils.js";
20
15
  import { isBackgroundTasksEnabled } from "../utils/env.js";
21
16
  _ToolManager_decorators = [InstrumentClass({
22
17
  prefix: "tool",
23
- excludeMethods: [
24
- "setPluginManager",
25
- "setStateManager",
26
- "getApprovalManager",
27
- "getAllowedToolsProvider"
28
- ]
18
+ excludeMethods: ["setHookSupport", "getApprovalManager", "getAllowedToolsProvider"]
29
19
  })];
30
20
  let _ToolManager = class _ToolManager {
31
21
  mcpManager;
32
- internalToolsProvider;
22
+ agentTools = /* @__PURE__ */ new Map();
33
23
  approvalManager;
34
24
  allowedToolsProvider;
35
25
  approvalMode;
36
26
  agentEventBus;
37
27
  toolPolicies;
38
- // Plugin support - set after construction to avoid circular dependencies
39
- pluginManager;
28
+ toolExecutionContextFactory;
29
+ // Hook support - set after construction to avoid circular dependencies
30
+ hookManager;
40
31
  sessionManager;
41
32
  stateManager;
42
- // Tool source prefixing - ALL tools get prefixed by source
33
+ workspaceManager;
34
+ currentWorkspace;
35
+ workspaceListenerAttached = false;
36
+ workspaceListenerAbort = new AbortController();
37
+ // Tool naming:
38
+ // - MCP tools are prefixed with `mcp--` for disambiguation.
39
+ // - Local tools use their `Tool.id` as-is (no internal/custom prefixing).
43
40
  static MCP_TOOL_PREFIX = "mcp--";
44
- static INTERNAL_TOOL_PREFIX = "internal--";
45
- static CUSTOM_TOOL_PREFIX = "custom--";
46
41
  // Tool caching for performance
47
42
  toolsCache = {};
48
43
  cacheValid = false;
@@ -55,7 +50,29 @@ let _ToolManager = class _ToolManager {
55
50
  sessionUserAutoApproveTools = /* @__PURE__ */ new Map();
56
51
  sessionDisabledTools = /* @__PURE__ */ new Map();
57
52
  globalDisabledTools = [];
58
- constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, options, logger) {
53
+ cleanupHandlers = /* @__PURE__ */ new Set();
54
+ cleanupStarted = false;
55
+ resolveLocalToolIdOrAlias(name) {
56
+ const direct = this.agentTools.get(name);
57
+ if (direct) return direct.id;
58
+ const lower = name.toLowerCase();
59
+ for (const tool of this.agentTools.values()) {
60
+ if (tool.id.toLowerCase() === lower) {
61
+ return tool.id;
62
+ }
63
+ if (tool.aliases?.some((alias) => alias.toLowerCase() === lower)) {
64
+ return tool.id;
65
+ }
66
+ }
67
+ return null;
68
+ }
69
+ normalizeToolPolicyPattern(pattern) {
70
+ if (pattern.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
71
+ return pattern;
72
+ }
73
+ return this.resolveLocalToolIdOrAlias(pattern) ?? pattern;
74
+ }
75
+ constructor(mcpManager, approvalManager, allowedToolsProvider, approvalMode, agentEventBus, toolPolicies, tools, logger) {
59
76
  this.mcpManager = mcpManager;
60
77
  this.approvalManager = approvalManager;
61
78
  this.allowedToolsProvider = allowedToolsProvider;
@@ -63,18 +80,12 @@ let _ToolManager = class _ToolManager {
63
80
  this.agentEventBus = agentEventBus;
64
81
  this.toolPolicies = toolPolicies;
65
82
  this.logger = logger.createChild(DextoLogComponent.TOOLS);
66
- if (options?.internalToolsConfig && options.internalToolsConfig.length > 0 || options?.customToolsConfig && options.customToolsConfig.length > 0) {
67
- const internalToolsServices = {
68
- ...options.internalToolsServices,
69
- approvalManager
70
- };
71
- this.internalToolsProvider = new InternalToolsProvider(
72
- internalToolsServices,
73
- options.internalToolsConfig || [],
74
- options.customToolsConfig || [],
75
- this.logger
83
+ this.setTools(tools);
84
+ this.toolExecutionContextFactory = () => {
85
+ throw ToolError.configInvalid(
86
+ "ToolExecutionContextFactory not configured. DextoAgent.start() must configure tool execution context before tools can run."
76
87
  );
77
- }
88
+ };
78
89
  this.setupNotificationListeners();
79
90
  this.logger.debug("ToolManager initialized");
80
91
  }
@@ -82,50 +93,78 @@ let _ToolManager = class _ToolManager {
82
93
  * Initialize the ToolManager and its components
83
94
  */
84
95
  async initialize() {
85
- if (this.internalToolsProvider) {
86
- await this.internalToolsProvider.initialize();
87
- }
88
96
  this.logger.debug("ToolManager initialization complete");
89
97
  }
98
+ setTools(tools) {
99
+ this.agentTools.clear();
100
+ for (const tool of tools) {
101
+ this.agentTools.set(tool.id, tool);
102
+ }
103
+ this.invalidateCache();
104
+ }
105
+ setToolExecutionContextFactory(factory) {
106
+ this.toolExecutionContextFactory = factory;
107
+ }
108
+ registerCleanup(handler) {
109
+ this.cleanupHandlers.add(handler);
110
+ }
111
+ async cleanup() {
112
+ if (this.cleanupStarted) {
113
+ return;
114
+ }
115
+ this.cleanupStarted = true;
116
+ for (const handler of this.cleanupHandlers) {
117
+ try {
118
+ await handler();
119
+ } catch (error) {
120
+ const err = error instanceof Error ? error : new Error(String(error));
121
+ this.logger.warn(`ToolManager cleanup handler failed: ${err.message}`, {
122
+ color: "yellow"
123
+ });
124
+ }
125
+ }
126
+ }
90
127
  /**
91
- * Set plugin support services (called after construction to avoid circular dependencies)
128
+ * Set hook support services (called after construction to avoid circular dependencies)
92
129
  */
93
- setPluginSupport(pluginManager, sessionManager, stateManager) {
94
- this.pluginManager = pluginManager;
130
+ setHookSupport(hookManager, sessionManager, stateManager) {
131
+ this.hookManager = hookManager;
95
132
  this.sessionManager = sessionManager;
96
133
  this.stateManager = stateManager;
97
- this.logger.debug("Plugin support configured for ToolManager");
134
+ this.logger.debug("Hook support configured for ToolManager");
98
135
  }
99
136
  /**
100
- * Set agent reference for custom tools (called after construction to avoid circular dependencies)
101
- * Must be called before initialize() if custom tools are configured
137
+ * Set workspace manager for tool execution context propagation.
102
138
  */
103
- setAgent(agent) {
104
- if (this.internalToolsProvider) {
105
- this.internalToolsProvider.setAgent(agent);
106
- this.logger.debug("Agent reference configured for custom tools");
139
+ setWorkspaceManager(workspaceManager) {
140
+ this.workspaceManager = workspaceManager;
141
+ void this.refreshWorkspace();
142
+ if (!this.workspaceListenerAttached) {
143
+ this.workspaceListenerAttached = true;
144
+ this.agentEventBus.on(
145
+ "workspace:changed",
146
+ (payload) => {
147
+ this.currentWorkspace = payload.workspace ?? void 0;
148
+ },
149
+ { signal: this.workspaceListenerAbort.signal }
150
+ );
151
+ this.registerCleanup(() => {
152
+ if (!this.workspaceListenerAbort.signal.aborted) {
153
+ this.workspaceListenerAbort.abort();
154
+ }
155
+ });
107
156
  }
157
+ this.logger.debug("WorkspaceManager reference configured for ToolManager");
108
158
  }
109
- /**
110
- * Set prompt manager for invoke_skill tool (called after construction to avoid circular dependencies)
111
- * Must be called before initialize() if invoke_skill tool is enabled
112
- */
113
- setPromptManager(promptManager) {
114
- if (this.internalToolsProvider) {
115
- this.internalToolsProvider.setPromptManager(promptManager);
116
- this.logger.debug("PromptManager reference configured for invoke_skill tool");
159
+ async refreshWorkspace() {
160
+ if (!this.workspaceManager) {
161
+ return;
117
162
  }
118
- }
119
- /**
120
- * Set task forker for context:fork skill execution (late-binding)
121
- * Called by agent-spawner custom tool provider after RuntimeService is created.
122
- * This enables invoke_skill to fork execution to an isolated subagent.
123
- */
124
- setTaskForker(taskForker) {
125
- if (this.internalToolsProvider) {
126
- this.internalToolsProvider.setTaskForker(taskForker);
163
+ try {
164
+ this.currentWorkspace = await this.workspaceManager.getWorkspace();
165
+ } catch (error) {
127
166
  this.logger.debug(
128
- "TaskForker reference configured for invoke_skill (context:fork support)"
167
+ `Failed to refresh workspace context: ${error instanceof Error ? error.message : String(error)}`
129
168
  );
130
169
  }
131
170
  }
@@ -136,18 +175,21 @@ let _ToolManager = class _ToolManager {
136
175
  * This is ADDITIVE - other tools are NOT blocked, they just go through normal approval flow.
137
176
  *
138
177
  * @param sessionId The session ID
139
- * @param autoApproveTools Array of tool names to auto-approve (e.g., ['custom--bash_exec', 'custom--read_file'])
178
+ * @param autoApproveTools Array of tool names to auto-approve (e.g., ['bash_exec', 'mcp--read_file'])
140
179
  */
141
180
  setSessionAutoApproveTools(sessionId, autoApproveTools) {
142
181
  if (autoApproveTools.length === 0) {
143
182
  this.clearSessionAutoApproveTools(sessionId);
144
183
  return;
145
184
  }
146
- this.sessionAutoApproveTools.set(sessionId, autoApproveTools);
185
+ const normalized = autoApproveTools.map(
186
+ (pattern) => this.normalizeToolPolicyPattern(pattern)
187
+ );
188
+ this.sessionAutoApproveTools.set(sessionId, normalized);
147
189
  this.logger.info(
148
190
  `Session auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
149
191
  );
150
- this.logger.debug(`Auto-approve tools: ${autoApproveTools.join(", ")}`);
192
+ this.logger.debug(`Auto-approve tools: ${normalized.join(", ")}`);
151
193
  }
152
194
  /**
153
195
  * Set session-level auto-approve tools chosen by the user.
@@ -157,11 +199,14 @@ let _ToolManager = class _ToolManager {
157
199
  this.clearSessionUserAutoApproveTools(sessionId);
158
200
  return;
159
201
  }
160
- this.sessionUserAutoApproveTools.set(sessionId, autoApproveTools);
202
+ const normalized = autoApproveTools.map(
203
+ (pattern) => this.normalizeToolPolicyPattern(pattern)
204
+ );
205
+ this.sessionUserAutoApproveTools.set(sessionId, normalized);
161
206
  this.logger.info(
162
207
  `Session user auto-approve tools set for '${sessionId}': ${autoApproveTools.length} tools`
163
208
  );
164
- this.logger.debug(`User auto-approve tools: ${autoApproveTools.join(", ")}`);
209
+ this.logger.debug(`User auto-approve tools: ${normalized.join(", ")}`);
165
210
  }
166
211
  /**
167
212
  * Clear session-level auto-approve tools chosen by the user.
@@ -338,39 +383,44 @@ let _ToolManager = class _ToolManager {
338
383
  }
339
384
  });
340
385
  }
341
- // ==================== Bash Pattern Approval Helpers ====================
342
- /**
343
- * Check if a tool name represents a bash execution tool
344
- */
345
- isBashTool(toolName) {
346
- return toolName === "bash_exec" || toolName === "internal--bash_exec" || toolName === "custom--bash_exec";
386
+ // ==================== Pattern Approval Helpers ====================
387
+ getToolPatternKey(toolName, args) {
388
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
389
+ return null;
390
+ }
391
+ const tool = this.agentTools.get(toolName);
392
+ if (!tool?.getApprovalPatternKey) {
393
+ return null;
394
+ }
395
+ try {
396
+ return tool.getApprovalPatternKey(args);
397
+ } catch (error) {
398
+ this.logger.debug(
399
+ `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
400
+ );
401
+ return null;
402
+ }
347
403
  }
348
- /**
349
- * Check if a bash command is covered by any approved pattern.
350
- * Generates a pattern key from the command, then checks if it's covered by stored patterns.
351
- *
352
- * Returns approval info if covered, or pattern suggestions if not.
353
- */
354
- checkBashPatternApproval(command) {
355
- const patternKey = generateBashPatternKey(command);
356
- if (!patternKey) {
357
- if (isDangerousCommand(command)) {
358
- this.logger.debug(
359
- `Skipping pattern generation for dangerous command: ${command.split(/\s+/)[0]}`
360
- );
361
- }
362
- return { approved: false, suggestedPatterns: [] };
404
+ getToolSuggestedPatterns(toolName, args) {
405
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
406
+ return void 0;
363
407
  }
364
- if (this.approvalManager.matchesBashPattern(patternKey)) {
365
- return { approved: true };
408
+ const tool = this.agentTools.get(toolName);
409
+ if (!tool?.suggestApprovalPatterns) {
410
+ return void 0;
411
+ }
412
+ try {
413
+ const patterns = tool.suggestApprovalPatterns(args);
414
+ return patterns.length > 0 ? patterns : void 0;
415
+ } catch (error) {
416
+ this.logger.debug(
417
+ `Pattern suggestion failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
418
+ );
419
+ return void 0;
366
420
  }
367
- return {
368
- approved: false,
369
- suggestedPatterns: generateBashPatternSuggestions(command)
370
- };
371
421
  }
372
422
  /**
373
- * Auto-approve pending tool confirmation requests for the same tool.
423
+ * Auto-approve pending tool approval requests for the same tool.
374
424
  * Called after a user selects "remember choice" for a tool.
375
425
  * This handles the case where parallel tool calls come in before the first one is approved.
376
426
  *
@@ -380,7 +430,7 @@ let _ToolManager = class _ToolManager {
380
430
  autoApprovePendingToolRequests(toolName, sessionId) {
381
431
  const count = this.approvalManager.autoApprovePendingRequests(
382
432
  (request) => {
383
- if (request.type !== ApprovalType.TOOL_CONFIRMATION) {
433
+ if (request.type !== ApprovalType.TOOL_APPROVAL) {
384
434
  return false;
385
435
  }
386
436
  if (request.sessionId !== sessionId) {
@@ -399,42 +449,86 @@ let _ToolManager = class _ToolManager {
399
449
  }
400
450
  }
401
451
  /**
402
- * Auto-approve pending bash command requests that match a pattern.
403
- * Called after a user selects "remember pattern" for a bash command.
404
- * This handles the case where parallel bash commands come in before the first one is approved.
405
- *
406
- * @param pattern The bash pattern that was just remembered
407
- * @param sessionId The session ID for context
452
+ * Auto-approve pending tool approval requests that are now covered by a remembered pattern.
453
+ * Called after a user selects "remember pattern" for a tool.
408
454
  */
409
- autoApprovePendingBashRequests(pattern, sessionId) {
455
+ autoApprovePendingPatternRequests(toolName, sessionId) {
456
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
457
+ return;
458
+ }
459
+ const tool = this.agentTools.get(toolName);
460
+ const getPatternKey = tool?.getApprovalPatternKey;
461
+ if (!getPatternKey) {
462
+ return;
463
+ }
410
464
  const count = this.approvalManager.autoApprovePendingRequests(
411
465
  (request) => {
412
- if (request.type !== ApprovalType.TOOL_CONFIRMATION) {
466
+ if (request.type !== ApprovalType.TOOL_APPROVAL) {
413
467
  return false;
414
468
  }
415
469
  if (request.sessionId !== sessionId) {
416
470
  return false;
417
471
  }
418
472
  const metadata = request.metadata;
419
- if (!this.isBashTool(metadata.toolName)) {
473
+ if (metadata.toolName !== toolName) {
420
474
  return false;
421
475
  }
422
- const command = metadata.args?.command;
423
- if (!command) {
476
+ const args = metadata.args;
477
+ if (typeof args !== "object" || args === null) {
424
478
  return false;
425
479
  }
426
- const patternKey = generateBashPatternKey(command);
427
- if (!patternKey) {
480
+ let patternKey;
481
+ try {
482
+ patternKey = getPatternKey(args);
483
+ } catch (error) {
484
+ this.logger.debug(
485
+ `Pattern key generation failed for '${toolName}': ${error instanceof Error ? error.message : String(error)}`
486
+ );
428
487
  return false;
429
488
  }
430
- return this.approvalManager.matchesBashPattern(patternKey);
489
+ if (!patternKey) return false;
490
+ return this.approvalManager.matchesPattern(toolName, patternKey);
431
491
  },
432
492
  { rememberPattern: void 0 }
433
- // Don't propagate pattern to auto-approved requests
493
+ // Don't propagate pattern choice to auto-approved requests
434
494
  );
435
495
  if (count > 0) {
436
496
  this.logger.info(
437
- `Auto-approved ${count} parallel bash command(s) matching pattern '${pattern}'`
497
+ `Auto-approved ${count} parallel request(s) for tool '${toolName}' after user selected "remember pattern"`
498
+ );
499
+ }
500
+ }
501
+ /**
502
+ * Auto-approve pending directory access requests that match a newly approved directory access request.
503
+ *
504
+ * This handles the case where parallel file operations request directory approval concurrently.
505
+ */
506
+ autoApprovePendingDirectoryAccessRequests(options) {
507
+ const count = this.approvalManager.autoApprovePendingRequests(
508
+ (request) => {
509
+ if (request.type !== ApprovalType.DIRECTORY_ACCESS) {
510
+ return false;
511
+ }
512
+ if (request.sessionId !== options.sessionId) {
513
+ return false;
514
+ }
515
+ const metadata = request.metadata;
516
+ if (typeof metadata?.parentDir !== "string" || metadata.parentDir !== options.parentDir) {
517
+ return false;
518
+ }
519
+ if (options.rememberDirectory) {
520
+ return true;
521
+ }
522
+ if (typeof metadata?.operation !== "string" || typeof metadata?.toolName !== "string") {
523
+ return false;
524
+ }
525
+ return metadata.operation === options.operation && metadata.toolName === options.toolName;
526
+ },
527
+ { rememberDirectory: false }
528
+ );
529
+ if (count > 0) {
530
+ this.logger.info(
531
+ `Auto-approved ${count} parallel request(s) for directory '${options.parentDir}' after directory access was approved`
438
532
  );
439
533
  }
440
534
  }
@@ -448,11 +542,66 @@ let _ToolManager = class _ToolManager {
448
542
  async getMcpTools() {
449
543
  return await this.mcpManager.getAllTools();
450
544
  }
545
+ buildToolExecutionContext(options) {
546
+ const workspace = this.currentWorkspace;
547
+ const baseContext = {
548
+ sessionId: options.sessionId,
549
+ workspaceId: workspace?.id,
550
+ workspace,
551
+ abortSignal: options.abortSignal,
552
+ toolCallId: options.toolCallId,
553
+ logger: this.logger
554
+ };
555
+ return this.toolExecutionContextFactory(baseContext);
556
+ }
557
+ validateLocalToolArgsOrThrow(toolName, args) {
558
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
559
+ return args;
560
+ }
561
+ const tool = this.agentTools.get(toolName);
562
+ if (!tool) {
563
+ return args;
564
+ }
565
+ const validationResult = tool.inputSchema.safeParse(args);
566
+ if (!validationResult.success) {
567
+ this.logger.error(
568
+ `\u274C Invalid arguments for tool ${toolName}: ${validationResult.error.message}`
569
+ );
570
+ throw ToolError.validationFailed(
571
+ toolName,
572
+ `Invalid arguments: ${validationResult.error.message}`
573
+ );
574
+ }
575
+ const validated = validationResult.data;
576
+ if (typeof validated !== "object" || validated === null || Array.isArray(validated)) {
577
+ throw ToolError.validationFailed(toolName, "Invalid arguments: expected an object");
578
+ }
579
+ return validated;
580
+ }
581
+ async executeLocalTool(toolName, args, sessionId, abortSignal, toolCallId) {
582
+ const tool = this.agentTools.get(toolName);
583
+ if (!tool) {
584
+ this.logger.error(`\u274C No local tool found: ${toolName}`);
585
+ this.logger.debug(
586
+ `Available local tools: ${Array.from(this.agentTools.keys()).join(", ")}`
587
+ );
588
+ throw ToolError.notFound(toolName);
589
+ }
590
+ try {
591
+ const context = this.buildToolExecutionContext({ sessionId, abortSignal, toolCallId });
592
+ const result = await tool.execute(args, context);
593
+ return result;
594
+ } catch (error) {
595
+ this.logger.error(`\u274C Local tool execution failed: ${toolName}`, {
596
+ error: error instanceof Error ? error.message : String(error)
597
+ });
598
+ throw error;
599
+ }
600
+ }
451
601
  /**
452
- * Build all tools from sources with universal prefixing
453
- * ALL tools get prefixed by their source - no exceptions
602
+ * Build all tools from sources.
454
603
  *
455
- * TODO: Rethink tool naming convention for more consistency
604
+ * TODO: Rethink MCP tool naming convention for more consistency.
456
605
  * Current issue: MCP tools have dynamic naming based on conflicts:
457
606
  * - No conflict: mcp--toolName
458
607
  * - With conflict: mcp--serverName--toolName
@@ -465,8 +614,6 @@ let _ToolManager = class _ToolManager {
465
614
  async buildAllTools() {
466
615
  const allTools = {};
467
616
  let mcpTools = {};
468
- let internalTools = {};
469
- let customTools = {};
470
617
  try {
471
618
  mcpTools = await this.mcpManager.getAllTools();
472
619
  } catch (error) {
@@ -475,38 +622,13 @@ let _ToolManager = class _ToolManager {
475
622
  );
476
623
  mcpTools = {};
477
624
  }
478
- try {
479
- internalTools = this.internalToolsProvider?.getInternalTools() || {};
480
- } catch (error) {
481
- this.logger.error(
482
- `Failed to get internal tools: ${error instanceof Error ? error.message : String(error)}`
483
- );
484
- internalTools = {};
485
- }
486
- try {
487
- customTools = this.internalToolsProvider?.getCustomTools() || {};
488
- } catch (error) {
489
- this.logger.error(
490
- `Failed to get custom tools: ${error instanceof Error ? error.message : String(error)}`
491
- );
492
- customTools = {};
493
- }
494
- for (const [toolName, toolDef] of Object.entries(internalTools)) {
495
- const qualifiedName = `${_ToolManager.INTERNAL_TOOL_PREFIX}${toolName}`;
496
- allTools[qualifiedName] = {
497
- ...toolDef,
498
- name: qualifiedName,
499
- description: `${toolDef.description || "No description provided"} (internal tool)`,
500
- parameters: wrapToolParametersSchema(toolDef.parameters)
501
- };
502
- }
503
- for (const [toolName, toolDef] of Object.entries(customTools)) {
504
- const qualifiedName = `${_ToolManager.CUSTOM_TOOL_PREFIX}${toolName}`;
505
- allTools[qualifiedName] = {
506
- ...toolDef,
507
- name: qualifiedName,
508
- description: `${toolDef.description || "No description provided"} (custom tool)`,
509
- parameters: wrapToolParametersSchema(toolDef.parameters)
625
+ for (const [toolName, tool] of this.agentTools) {
626
+ allTools[toolName] = {
627
+ name: toolName,
628
+ description: tool.description || "No description provided",
629
+ parameters: wrapToolParametersSchema(
630
+ convertZodSchemaToJsonSchema(tool.inputSchema, this.logger)
631
+ )
510
632
  };
511
633
  }
512
634
  for (const [toolName, toolDef] of Object.entries(mcpTools)) {
@@ -520,10 +642,9 @@ let _ToolManager = class _ToolManager {
520
642
  }
521
643
  const totalTools = Object.keys(allTools).length;
522
644
  const mcpCount = Object.keys(mcpTools).length;
523
- const internalCount = Object.keys(internalTools).length;
524
- const customCount = Object.keys(customTools).length;
645
+ const localCount = this.agentTools.size;
525
646
  this.logger.debug(
526
- `\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${internalCount} internal, ${customCount} custom)`
647
+ `\u{1F527} Unified tool discovery: ${totalTools} total tools (${mcpCount} MCP, ${localCount} local)`
527
648
  );
528
649
  return allTools;
529
650
  }
@@ -541,10 +662,11 @@ let _ToolManager = class _ToolManager {
541
662
  return this.toolsCache;
542
663
  }
543
664
  /**
544
- * Execute a tool by routing based on universal prefix
545
- * ALL tools must have source prefix - no exceptions
665
+ * Execute a tool by routing based on prefix:
666
+ * - MCP tools: `mcp--...`
667
+ * - Local tools: `Tool.id`
546
668
  *
547
- * @param toolName The fully qualified tool name (e.g., "internal--edit_file")
669
+ * @param toolName Tool name (e.g., "edit_file", "mcp--filesystem--read_file")
548
670
  * @param args The arguments for the tool
549
671
  * @param toolCallId The unique tool call ID for tracking (from LLM or generated for direct calls)
550
672
  * @param sessionId Optional session ID for context
@@ -554,23 +676,30 @@ let _ToolManager = class _ToolManager {
554
676
  const { toolArgs: rawToolArgs, meta } = extractToolCallMeta(args);
555
677
  let toolArgs = rawToolArgs;
556
678
  const backgroundTasksEnabled = isBackgroundTasksEnabled();
679
+ const toolDisplayName = this.agentTools.get(toolName)?.displayName;
557
680
  this.logger.debug(`\u{1F527} Tool execution requested: '${toolName}' (toolCallId: ${toolCallId})`);
558
681
  this.logger.debug(`Tool args: ${JSON.stringify(toolArgs, null, 2)}`);
559
682
  if (sessionId) {
560
683
  this.agentEventBus.emit("llm:tool-call", {
561
684
  toolName,
685
+ ...toolDisplayName !== void 0 && { toolDisplayName },
562
686
  args: toolArgs,
563
687
  callId: toolCallId,
564
688
  sessionId
565
689
  });
566
690
  }
567
- const { requireApproval, approvalStatus } = await this.handleToolApproval(
691
+ const {
692
+ requireApproval,
693
+ approvalStatus,
694
+ args: validatedToolArgs
695
+ } = await this.handleToolApproval(
568
696
  toolName,
569
697
  toolArgs,
570
698
  toolCallId,
571
699
  sessionId,
572
700
  meta.callDescription
573
701
  );
702
+ toolArgs = validatedToolArgs;
574
703
  this.logger.debug(`\u2705 Tool execution approved: ${toolName}`);
575
704
  this.logger.info(
576
705
  `\u{1F527} Tool execution started for ${toolName}, sessionId: ${sessionId ?? "global"}`
@@ -583,13 +712,13 @@ let _ToolManager = class _ToolManager {
583
712
  });
584
713
  }
585
714
  const startTime = Date.now();
586
- if (this.pluginManager && this.sessionManager && this.stateManager) {
715
+ if (this.hookManager && this.sessionManager && this.stateManager) {
587
716
  const beforePayload = {
588
717
  toolName,
589
718
  args: toolArgs,
590
719
  ...sessionId !== void 0 && { sessionId }
591
720
  };
592
- const modifiedPayload = await this.pluginManager.executePlugins(
721
+ const modifiedPayload = await this.hookManager.executeHooks(
593
722
  "beforeToolCall",
594
723
  beforePayload,
595
724
  {
@@ -601,6 +730,14 @@ let _ToolManager = class _ToolManager {
601
730
  }
602
731
  );
603
732
  toolArgs = modifiedPayload.args;
733
+ try {
734
+ toolArgs = this.validateLocalToolArgsOrThrow(toolName, toolArgs);
735
+ } catch (error) {
736
+ this.logger.error(
737
+ `Post-hook validation failed for tool '${toolName}': a beforeToolCall hook may have set invalid args`
738
+ );
739
+ throw error;
740
+ }
604
741
  }
605
742
  try {
606
743
  let result;
@@ -650,16 +787,7 @@ let _ToolManager = class _ToolManager {
650
787
  } else {
651
788
  result = await this.mcpManager.executeTool(actualToolName, toolArgs, sessionId);
652
789
  }
653
- } else if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
654
- this.logger.debug(`\u{1F527} Detected internal tool: '${toolName}'`);
655
- const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
656
- if (actualToolName.length === 0) {
657
- throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
658
- }
659
- if (!this.internalToolsProvider) {
660
- throw ToolError.internalToolsNotInitialized(toolName);
661
- }
662
- this.logger.debug(`\u{1F3AF} Internal routing: '${toolName}' -> '${actualToolName}'`);
790
+ } else {
663
791
  const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
664
792
  if (meta.runInBackground === true && !backgroundTasksEnabled) {
665
793
  this.logger.debug(
@@ -670,14 +798,14 @@ let _ToolManager = class _ToolManager {
670
798
  if (runInBackground) {
671
799
  const backgroundSessionId = sessionId;
672
800
  const { result: backgroundResult, promise } = registerBackgroundTask(
673
- this.internalToolsProvider.executeTool(
674
- actualToolName,
801
+ this.executeLocalTool(
802
+ toolName,
675
803
  toolArgs,
676
804
  backgroundSessionId,
677
805
  abortSignal,
678
806
  toolCallId
679
807
  ),
680
- `Internal tool ${actualToolName}`
808
+ `Tool ${toolName}`
681
809
  );
682
810
  this.agentEventBus.emit("tool:background", {
683
811
  toolName,
@@ -692,88 +820,28 @@ let _ToolManager = class _ToolManager {
692
820
  });
693
821
  result = backgroundResult;
694
822
  } else {
695
- result = await this.internalToolsProvider.executeTool(
696
- actualToolName,
697
- toolArgs,
698
- sessionId,
699
- abortSignal,
700
- toolCallId
701
- );
702
- }
703
- } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
704
- this.logger.debug(`\u{1F527} Detected custom tool: '${toolName}'`);
705
- const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
706
- if (actualToolName.length === 0) {
707
- throw ToolError.invalidName(toolName, "tool name cannot be empty after prefix");
708
- }
709
- if (!this.internalToolsProvider) {
710
- throw ToolError.internalToolsNotInitialized(toolName);
711
- }
712
- this.logger.debug(`\u{1F3AF} Custom routing: '${toolName}' -> '${actualToolName}'`);
713
- const runInBackground = backgroundTasksEnabled && meta.runInBackground === true && sessionId !== void 0;
714
- if (meta.runInBackground === true && !backgroundTasksEnabled) {
715
- this.logger.debug(
716
- "Background tool execution disabled; running synchronously instead.",
717
- { toolName }
718
- );
719
- }
720
- if (runInBackground) {
721
- const backgroundSessionId = sessionId;
722
- const { result: backgroundResult, promise } = registerBackgroundTask(
723
- this.internalToolsProvider.executeTool(
724
- actualToolName,
725
- toolArgs,
726
- backgroundSessionId,
727
- abortSignal,
728
- toolCallId
729
- ),
730
- `Custom tool ${actualToolName}`
731
- );
732
- this.agentEventBus.emit("tool:background", {
823
+ result = await this.executeLocalTool(
733
824
  toolName,
734
- toolCallId: backgroundResult.taskId,
735
- sessionId: backgroundSessionId,
736
- description: backgroundResult.description,
737
- promise,
738
- ...meta.timeoutMs !== void 0 && { timeoutMs: meta.timeoutMs },
739
- ...meta.notifyOnComplete !== void 0 && {
740
- notifyOnComplete: meta.notifyOnComplete
741
- }
742
- });
743
- result = backgroundResult;
744
- } else {
745
- result = await this.internalToolsProvider.executeTool(
746
- actualToolName,
747
825
  toolArgs,
748
826
  sessionId,
749
827
  abortSignal,
750
828
  toolCallId
751
829
  );
752
830
  }
753
- } else {
754
- this.logger.debug(`\u{1F527} Detected tool without proper prefix: '${toolName}'`);
755
- const stats = await this.getToolStats();
756
- this.logger.error(
757
- `\u274C Tool missing source prefix: '${toolName}' (expected '${_ToolManager.MCP_TOOL_PREFIX}*', '${_ToolManager.INTERNAL_TOOL_PREFIX}*', or '${_ToolManager.CUSTOM_TOOL_PREFIX}*')`
758
- );
759
- this.logger.debug(
760
- `Available: ${stats.mcp} MCP, ${stats.internal} internal, ${stats.custom} custom tools`
761
- );
762
- throw ToolError.notFound(toolName);
763
831
  }
764
832
  const duration = Date.now() - startTime;
765
833
  this.logger.debug(`\u{1F3AF} Tool execution completed in ${duration}ms: '${toolName}'`);
766
834
  this.logger.info(
767
835
  `\u2705 Tool execution completed successfully for ${toolName} in ${duration}ms, sessionId: ${sessionId ?? "global"}`
768
836
  );
769
- if (this.pluginManager && this.sessionManager && this.stateManager) {
837
+ if (this.hookManager && this.sessionManager && this.stateManager) {
770
838
  const afterPayload = {
771
839
  toolName,
772
840
  result,
773
841
  success: true,
774
842
  ...sessionId !== void 0 && { sessionId }
775
843
  };
776
- const modifiedPayload = await this.pluginManager.executePlugins(
844
+ const modifiedPayload = await this.hookManager.executeHooks(
777
845
  "afterToolResult",
778
846
  afterPayload,
779
847
  {
@@ -788,6 +856,7 @@ let _ToolManager = class _ToolManager {
788
856
  }
789
857
  return {
790
858
  result,
859
+ ...toolDisplayName !== void 0 && { toolDisplayName },
791
860
  ...requireApproval && { requireApproval, approvalStatus }
792
861
  };
793
862
  } catch (error) {
@@ -795,14 +864,14 @@ let _ToolManager = class _ToolManager {
795
864
  this.logger.error(
796
865
  `\u274C Tool execution failed for ${toolName} after ${duration}ms, sessionId: ${sessionId ?? "global"}: ${error instanceof Error ? error.message : String(error)}`
797
866
  );
798
- if (this.pluginManager && this.sessionManager && this.stateManager) {
867
+ if (this.hookManager && this.sessionManager && this.stateManager) {
799
868
  const afterPayload = {
800
869
  toolName,
801
870
  result: error instanceof Error ? error.message : String(error),
802
871
  success: false,
803
872
  ...sessionId !== void 0 && { sessionId }
804
873
  };
805
- await this.pluginManager.executePlugins("afterToolResult", afterPayload, {
874
+ await this.hookManager.executeHooks("afterToolResult", afterPayload, {
806
875
  sessionManager: this.sessionManager,
807
876
  mcpManager: this.mcpManager,
808
877
  toolManager: this,
@@ -814,30 +883,20 @@ let _ToolManager = class _ToolManager {
814
883
  }
815
884
  }
816
885
  /**
817
- * Check if a tool exists (must have proper source prefix)
886
+ * Check if a tool exists.
818
887
  */
819
888
  async hasTool(toolName) {
820
889
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
821
890
  const actualToolName = toolName.substring(_ToolManager.MCP_TOOL_PREFIX.length);
822
891
  return this.mcpManager.getToolClient(actualToolName) !== void 0;
823
892
  }
824
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
825
- const actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
826
- return this.internalToolsProvider?.hasInternalTool(actualToolName) ?? false;
827
- }
828
- if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
829
- const actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
830
- return this.internalToolsProvider?.hasCustomTool(actualToolName) ?? false;
831
- }
832
- return false;
893
+ return this.agentTools.has(toolName);
833
894
  }
834
895
  /**
835
896
  * Get tool statistics across all sources
836
897
  */
837
898
  async getToolStats() {
838
899
  let mcpTools = {};
839
- let internalTools = {};
840
- let customTools = {};
841
900
  try {
842
901
  mcpTools = await this.mcpManager.getAllTools();
843
902
  } catch (error) {
@@ -846,34 +905,16 @@ let _ToolManager = class _ToolManager {
846
905
  );
847
906
  mcpTools = {};
848
907
  }
849
- try {
850
- internalTools = this.internalToolsProvider?.getInternalTools() || {};
851
- } catch (error) {
852
- this.logger.error(
853
- `Failed to get internal tools for stats: ${error instanceof Error ? error.message : String(error)}`
854
- );
855
- internalTools = {};
856
- }
857
- try {
858
- customTools = this.internalToolsProvider?.getCustomTools() || {};
859
- } catch (error) {
860
- this.logger.error(
861
- `Failed to get custom tools for stats: ${error instanceof Error ? error.message : String(error)}`
862
- );
863
- customTools = {};
864
- }
865
908
  const mcpCount = Object.keys(mcpTools).length;
866
- const internalCount = Object.keys(internalTools).length;
867
- const customCount = Object.keys(customTools).length;
909
+ const localCount = this.agentTools.size;
868
910
  return {
869
- total: mcpCount + internalCount + customCount,
911
+ total: mcpCount + localCount,
870
912
  mcp: mcpCount,
871
- internal: internalCount,
872
- custom: customCount
913
+ local: localCount
873
914
  };
874
915
  }
875
916
  /**
876
- * Get the source of a tool (mcp, internal, custom, or unknown)
917
+ * Get the source of a tool (mcp, local, or unknown).
877
918
  * @param toolName The name of the tool to check
878
919
  * @returns The source of the tool
879
920
  */
@@ -881,11 +922,8 @@ let _ToolManager = class _ToolManager {
881
922
  if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX) && toolName.length > _ToolManager.MCP_TOOL_PREFIX.length) {
882
923
  return "mcp";
883
924
  }
884
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX) && toolName.length > _ToolManager.INTERNAL_TOOL_PREFIX.length) {
885
- return "internal";
886
- }
887
- if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX) && toolName.length > _ToolManager.CUSTOM_TOOL_PREFIX.length) {
888
- return "custom";
925
+ if (this.agentTools.has(toolName)) {
926
+ return "local";
889
927
  }
890
928
  return "unknown";
891
929
  }
@@ -896,7 +934,7 @@ let _ToolManager = class _ToolManager {
896
934
  * Examples:
897
935
  * - Policy "mcp--read_file" matches "mcp--read_file" (exact)
898
936
  * - Policy "mcp--read_file" matches "mcp--filesystem--read_file" (suffix)
899
- * - Policy "internal--ask_user" matches "internal--ask_user" (exact only)
937
+ * - Policy "read_file" matches "read_file" (local tool exact only)
900
938
  *
901
939
  * @param toolName The fully qualified tool name (e.g., "mcp--filesystem--read_file")
902
940
  * @param policyPattern The policy pattern to match against (e.g., "mcp--read_file")
@@ -947,26 +985,21 @@ let _ToolManager = class _ToolManager {
947
985
  * Tools can implement getApprovalOverride() to request specialized approval flows
948
986
  * (e.g., directory access approval for file tools) instead of default tool confirmation.
949
987
  *
950
- * @param toolName The fully qualified tool name
988
+ * @param toolName Tool name
951
989
  * @param args The tool arguments
952
990
  * @param sessionId Optional session ID
953
991
  * @returns { handled: true } if custom approval was processed, { handled: false } to continue normal flow
954
992
  */
955
- async checkCustomApprovalOverride(toolName, args, sessionId) {
956
- let actualToolName;
957
- if (toolName.startsWith(_ToolManager.INTERNAL_TOOL_PREFIX)) {
958
- actualToolName = toolName.substring(_ToolManager.INTERNAL_TOOL_PREFIX.length);
959
- } else if (toolName.startsWith(_ToolManager.CUSTOM_TOOL_PREFIX)) {
960
- actualToolName = toolName.substring(_ToolManager.CUSTOM_TOOL_PREFIX.length);
961
- }
962
- if (!actualToolName || !this.internalToolsProvider) {
993
+ async checkCustomApprovalOverride(toolName, args, toolCallId, sessionId) {
994
+ if (toolName.startsWith(_ToolManager.MCP_TOOL_PREFIX)) {
963
995
  return { handled: false };
964
996
  }
965
- const tool = this.internalToolsProvider.getTool(actualToolName);
997
+ const tool = this.agentTools.get(toolName);
966
998
  if (!tool?.getApprovalOverride) {
967
999
  return { handled: false };
968
1000
  }
969
- const approvalRequest = await tool.getApprovalOverride(args);
1001
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
1002
+ const approvalRequest = await tool.getApprovalOverride(args, context);
970
1003
  if (!approvalRequest) {
971
1004
  return { handled: false };
972
1005
  }
@@ -979,7 +1012,23 @@ let _ToolManager = class _ToolManager {
979
1012
  const response = await this.approvalManager.requestApproval(approvalRequest);
980
1013
  if (response.status === ApprovalStatus.APPROVED) {
981
1014
  if (tool.onApprovalGranted) {
982
- tool.onApprovalGranted(response);
1015
+ tool.onApprovalGranted(response, context, approvalRequest);
1016
+ }
1017
+ if (approvalRequest.type === ApprovalType.DIRECTORY_ACCESS) {
1018
+ const metadata = approvalRequest.metadata;
1019
+ const parentDir = typeof metadata?.parentDir === "string" ? metadata.parentDir : null;
1020
+ const operation = typeof metadata?.operation === "string" ? metadata.operation : null;
1021
+ if (parentDir && operation) {
1022
+ const data = response.data;
1023
+ const rememberDirectory = data?.rememberDirectory ?? false;
1024
+ this.autoApprovePendingDirectoryAccessRequests({
1025
+ parentDir,
1026
+ operation,
1027
+ sessionId,
1028
+ toolName,
1029
+ rememberDirectory
1030
+ });
1031
+ }
983
1032
  }
984
1033
  this.logger.info(
985
1034
  `Custom approval granted for '${toolName}', type=${approvalRequest.type}, session=${sessionId ?? "global"}`
@@ -1003,11 +1052,24 @@ let _ToolManager = class _ToolManager {
1003
1052
  * if a tool should be auto-approved, denied, or requires manual approval.
1004
1053
  */
1005
1054
  async handleToolApproval(toolName, args, toolCallId, sessionId, callDescription) {
1006
- const quickResult = await this.tryQuickApprovalResolution(toolName, args, sessionId);
1055
+ const validatedArgs = this.validateLocalToolArgsOrThrow(toolName, args);
1056
+ const quickResult = await this.tryQuickApprovalResolution(
1057
+ toolName,
1058
+ validatedArgs,
1059
+ toolCallId,
1060
+ sessionId
1061
+ );
1007
1062
  if (quickResult !== null) {
1008
- return quickResult;
1063
+ return { ...quickResult, args: validatedArgs };
1009
1064
  }
1010
- return this.requestManualApproval(toolName, args, toolCallId, sessionId, callDescription);
1065
+ const manualResult = await this.requestManualApproval(
1066
+ toolName,
1067
+ validatedArgs,
1068
+ toolCallId,
1069
+ sessionId,
1070
+ callDescription
1071
+ );
1072
+ return { ...manualResult, args: validatedArgs };
1011
1073
  }
1012
1074
  /**
1013
1075
  * Try to resolve tool approval quickly based on policies and cached permissions.
@@ -1019,10 +1081,10 @@ let _ToolManager = class _ToolManager {
1019
1081
  * 3. Session auto-approve (skill allowed-tools)
1020
1082
  * 4. Static allow list
1021
1083
  * 5. Dynamic "remembered" allowed list
1022
- * 6. Bash command patterns
1084
+ * 6. Tool approval patterns
1023
1085
  * 7. Approval mode (auto-approve/auto-deny)
1024
1086
  */
1025
- async tryQuickApprovalResolution(toolName, args, sessionId) {
1087
+ async tryQuickApprovalResolution(toolName, args, toolCallId, sessionId) {
1026
1088
  if (this.isInAlwaysDenyList(toolName)) {
1027
1089
  this.logger.info(
1028
1090
  `Tool '${toolName}' is in static deny list \u2013 blocking execution (session: ${sessionId ?? "global"})`
@@ -1032,6 +1094,7 @@ let _ToolManager = class _ToolManager {
1032
1094
  const customApprovalResult = await this.checkCustomApprovalOverride(
1033
1095
  toolName,
1034
1096
  args,
1097
+ toolCallId,
1035
1098
  sessionId
1036
1099
  );
1037
1100
  if (customApprovalResult.handled) {
@@ -1055,17 +1118,12 @@ let _ToolManager = class _ToolManager {
1055
1118
  );
1056
1119
  return { requireApproval: false };
1057
1120
  }
1058
- if (this.isBashTool(toolName)) {
1059
- const command = args.command;
1060
- if (command) {
1061
- const bashResult = this.checkBashPatternApproval(command);
1062
- if (bashResult.approved) {
1063
- this.logger.info(
1064
- `Bash command '${command}' matched approved pattern \u2013 skipping confirmation.`
1065
- );
1066
- return { requireApproval: false };
1067
- }
1068
- }
1121
+ const patternKey = this.getToolPatternKey(toolName, args);
1122
+ if (patternKey && this.approvalManager.matchesPattern(toolName, patternKey)) {
1123
+ this.logger.info(
1124
+ `Tool '${toolName}' matched approved pattern key '${patternKey}' \u2013 skipping confirmation.`
1125
+ );
1126
+ return { requireApproval: false };
1069
1127
  }
1070
1128
  if (this.approvalMode === "auto-approve") {
1071
1129
  this.logger.debug(`\u{1F7E2} Auto-approving tool execution: ${toolName}`);
@@ -1083,18 +1141,20 @@ let _ToolManager = class _ToolManager {
1083
1141
  */
1084
1142
  async requestManualApproval(toolName, args, toolCallId, sessionId, callDescription) {
1085
1143
  this.logger.info(
1086
- `Tool confirmation requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
1144
+ `Tool approval requested for ${toolName}, sessionId: ${sessionId ?? "global"}`
1087
1145
  );
1088
1146
  try {
1147
+ const toolDisplayName = this.agentTools.get(toolName)?.displayName;
1089
1148
  const displayPreview = await this.generateToolPreview(
1090
1149
  toolName,
1091
1150
  args,
1092
1151
  toolCallId,
1093
1152
  sessionId
1094
1153
  );
1095
- const suggestedPatterns = this.getBashSuggestedPatterns(toolName, args);
1096
- const response = await this.approvalManager.requestToolConfirmation({
1154
+ const suggestedPatterns = this.getToolSuggestedPatterns(toolName, args);
1155
+ const response = await this.approvalManager.requestToolApproval({
1097
1156
  toolName,
1157
+ ...toolDisplayName !== void 0 && { toolDisplayName },
1098
1158
  toolCallId,
1099
1159
  args,
1100
1160
  ...callDescription !== void 0 && { description: callDescription },
@@ -1109,12 +1169,12 @@ let _ToolManager = class _ToolManager {
1109
1169
  this.handleApprovalDenied(toolName, response, sessionId);
1110
1170
  }
1111
1171
  this.logger.info(
1112
- `Tool confirmation approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
1172
+ `Tool approval approved for ${toolName}, sessionId: ${sessionId ?? "global"}`
1113
1173
  );
1114
1174
  return { requireApproval: true, approvalStatus: "approved" };
1115
1175
  } catch (error) {
1116
1176
  this.logger.error(
1117
- `Tool confirmation error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
1177
+ `Tool approval error for ${toolName}: ${error instanceof Error ? error.message : String(error)}`
1118
1178
  );
1119
1179
  throw error;
1120
1180
  }
@@ -1123,14 +1183,13 @@ let _ToolManager = class _ToolManager {
1123
1183
  * Generate a preview for the tool approval UI if the tool supports it.
1124
1184
  */
1125
1185
  async generateToolPreview(toolName, args, toolCallId, sessionId) {
1126
- const actualToolName = toolName.replace(/^internal--/, "").replace(/^custom--/, "");
1127
- const internalTool = this.internalToolsProvider?.getTool(actualToolName);
1128
- if (!internalTool?.generatePreview) {
1186
+ const tool = this.agentTools.get(toolName);
1187
+ if (!tool?.generatePreview) {
1129
1188
  return void 0;
1130
1189
  }
1131
1190
  try {
1132
- const context = { sessionId, toolCallId };
1133
- const preview = await internalTool.generatePreview(args, context);
1191
+ const context = this.buildToolExecutionContext({ sessionId, toolCallId });
1192
+ const preview = await tool.generatePreview(args, context);
1134
1193
  this.logger.debug(`Generated preview for ${toolName}`);
1135
1194
  return preview ?? void 0;
1136
1195
  } catch (previewError) {
@@ -1144,20 +1203,6 @@ let _ToolManager = class _ToolManager {
1144
1203
  return void 0;
1145
1204
  }
1146
1205
  }
1147
- /**
1148
- * Get suggested bash patterns for the approval UI.
1149
- */
1150
- getBashSuggestedPatterns(toolName, args) {
1151
- if (!this.isBashTool(toolName)) {
1152
- return void 0;
1153
- }
1154
- const command = args.command;
1155
- if (!command) {
1156
- return void 0;
1157
- }
1158
- const result = this.checkBashPatternApproval(command);
1159
- return result.suggestedPatterns?.length ? result.suggestedPatterns : void 0;
1160
- }
1161
1206
  /**
1162
1207
  * Handle "remember choice" or "remember pattern" when user approves a tool.
1163
1208
  */
@@ -1173,10 +1218,10 @@ let _ToolManager = class _ToolManager {
1173
1218
  `Tool '${toolName}' added to allowed tools for session '${allowSessionId ?? "global"}' (remember choice selected)`
1174
1219
  );
1175
1220
  this.autoApprovePendingToolRequests(toolName, allowSessionId);
1176
- } else if (rememberPattern && this.isBashTool(toolName)) {
1177
- this.approvalManager.addBashPattern(rememberPattern);
1178
- this.logger.info(`Bash pattern '${rememberPattern}' added for session approval`);
1179
- this.autoApprovePendingBashRequests(rememberPattern, sessionId);
1221
+ } else if (rememberPattern && this.agentTools.get(toolName)?.getApprovalPatternKey) {
1222
+ this.approvalManager.addPattern(toolName, rememberPattern);
1223
+ this.logger.info(`Pattern '${rememberPattern}' added for tool '${toolName}' approval`);
1224
+ this.autoApprovePendingPatternRequests(toolName, sessionId);
1180
1225
  }
1181
1226
  }
1182
1227
  /**