whale-code 6.5.10 → 6.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 (627) hide show
  1. package/dist/cli/chat/ChatApp.js +7 -11
  2. package/dist/cli/chat/ChatApp.js.map +1 -1
  3. package/dist/cli/chat/ChatInput.js +7 -3
  4. package/dist/cli/chat/ChatInput.js.map +1 -1
  5. package/dist/cli/chat/MessageList.js +5 -6
  6. package/dist/cli/chat/MessageList.js.map +1 -1
  7. package/dist/cli/chat/StatusBar.d.ts +2 -2
  8. package/dist/cli/chat/StatusBar.js +90 -160
  9. package/dist/cli/chat/StatusBar.js.map +1 -1
  10. package/dist/cli/chat/components/LiveArea.js +78 -115
  11. package/dist/cli/chat/components/LiveArea.js.map +1 -1
  12. package/dist/cli/chat/components/StaticMessages.js +60 -79
  13. package/dist/cli/chat/components/StaticMessages.js.map +1 -1
  14. package/dist/cli/chat/hooks/useAgentLoop.js +45 -37
  15. package/dist/cli/chat/hooks/useAgentLoop.js.map +1 -1
  16. package/dist/cli/chat/store.d.ts +12 -0
  17. package/dist/cli/chat/store.js +19 -0
  18. package/dist/cli/chat/store.js.map +1 -1
  19. package/dist/cli/commands/doctor.js +1 -6
  20. package/dist/cli/commands/doctor.js.map +1 -1
  21. package/dist/cli/services/agent-loop-tools.js +11 -2
  22. package/dist/cli/services/agent-loop-tools.js.map +1 -1
  23. package/dist/cli/services/agent-loop.js +1 -1
  24. package/dist/cli/services/agent-loop.js.map +1 -1
  25. package/dist/cli/services/cli-agent-loop.js +3 -2
  26. package/dist/cli/services/cli-agent-loop.js.map +1 -1
  27. package/dist/cli/services/config-store.d.ts +8 -10
  28. package/dist/cli/services/config-store.js +14 -13
  29. package/dist/cli/services/config-store.js.map +1 -1
  30. package/dist/cli/services/memory-manager.js +2 -2
  31. package/dist/cli/services/memory-manager.js.map +1 -1
  32. package/dist/cli/services/permission-modes.js +14 -10
  33. package/dist/cli/services/permission-modes.js.map +1 -1
  34. package/dist/cli/services/session-client.js +2 -1
  35. package/dist/cli/services/session-client.js.map +1 -1
  36. package/dist/cli/services/session-persistence.js +14 -6
  37. package/dist/cli/services/session-persistence.js.map +1 -1
  38. package/dist/cli/setup/SetupApp.d.ts +2 -2
  39. package/dist/cli/setup/SetupApp.js +91 -254
  40. package/dist/cli/setup/SetupApp.js.map +1 -1
  41. package/dist/cli/shared/SpinnerSlot.js +4 -1
  42. package/dist/cli/shared/SpinnerSlot.js.map +1 -1
  43. package/dist/cli/status/StatusApp.js +3 -3
  44. package/dist/cli/status/StatusApp.js.map +1 -1
  45. package/dist/index.js +13 -3
  46. package/dist/index.js.map +1 -1
  47. package/dist/server/handlers/browser-lifecycle.js +10 -0
  48. package/dist/server/handlers/browser-lifecycle.js.map +1 -1
  49. package/dist/server/handlers/browser.js +16 -1
  50. package/dist/server/handlers/browser.js.map +1 -1
  51. package/dist/server/handlers/campaigns.js +11 -0
  52. package/dist/server/handlers/campaigns.js.map +1 -1
  53. package/dist/server/handlers/catalog-products.js +19 -5
  54. package/dist/server/handlers/catalog-products.js.map +1 -1
  55. package/dist/server/handlers/catalog.js +42 -8
  56. package/dist/server/handlers/catalog.js.map +1 -1
  57. package/dist/server/handlers/clickhouse.js +4 -4
  58. package/dist/server/handlers/clickhouse.js.map +1 -1
  59. package/dist/server/handlers/comms-email.js +70 -8
  60. package/dist/server/handlers/comms-email.js.map +1 -1
  61. package/dist/server/handlers/comms.js +63 -21
  62. package/dist/server/handlers/comms.js.map +1 -1
  63. package/dist/server/handlers/coupons.js +141 -77
  64. package/dist/server/handlers/coupons.js.map +1 -1
  65. package/dist/server/handlers/google-ads.js +280 -8
  66. package/dist/server/handlers/google-ads.js.map +1 -1
  67. package/dist/server/handlers/remove-bg.d.ts +33 -0
  68. package/dist/server/handlers/remove-bg.js +698 -44
  69. package/dist/server/handlers/remove-bg.js.map +1 -1
  70. package/dist/server/handlers/supply-chain.js +93 -1
  71. package/dist/server/handlers/supply-chain.js.map +1 -1
  72. package/dist/server/handlers/workflow-steps-types.d.ts +1 -1
  73. package/dist/server/handlers/workflow-steps-types.js +7 -1
  74. package/dist/server/handlers/workflow-steps-types.js.map +1 -1
  75. package/dist/server/handlers/workflow-steps.js +1 -1
  76. package/dist/server/handlers/workflow-steps.js.map +1 -1
  77. package/dist/server/index.js +122 -29
  78. package/dist/server/index.js.map +1 -1
  79. package/dist/server/lib/agent-loop-turn.js +33 -3
  80. package/dist/server/lib/agent-loop-turn.js.map +1 -1
  81. package/dist/server/lib/agent-loop-types.d.ts +6 -2
  82. package/dist/server/lib/agent-loop-types.js +14 -2
  83. package/dist/server/lib/agent-loop-types.js.map +1 -1
  84. package/dist/server/lib/clickhouse-client.js +4 -2
  85. package/dist/server/lib/clickhouse-client.js.map +1 -1
  86. package/dist/server/lib/code-worker.js +4 -1
  87. package/dist/server/lib/code-worker.js.map +1 -1
  88. package/dist/server/providers/anthropic.js +103 -33
  89. package/dist/server/providers/anthropic.js.map +1 -1
  90. package/dist/server/server-chat.js +2 -2
  91. package/dist/server/server-chat.js.map +1 -1
  92. package/dist/server/server-helpers.d.ts +8 -1
  93. package/dist/server/server-helpers.js +17 -3
  94. package/dist/server/server-helpers.js.map +1 -1
  95. package/dist/server/server-persist.js +34 -21
  96. package/dist/server/server-persist.js.map +1 -1
  97. package/dist/server/server-rate-limit.d.ts +0 -1
  98. package/dist/server/server-rate-limit.js +5 -5
  99. package/dist/server/server-rate-limit.js.map +1 -1
  100. package/dist/server/server-routes-approvals.js +2 -2
  101. package/dist/server/server-routes-approvals.js.map +1 -1
  102. package/dist/server/server-routes-auth.js +2 -2
  103. package/dist/server/server-routes-auth.js.map +1 -1
  104. package/dist/server/server-routes-events.js +2 -2
  105. package/dist/server/server-routes-events.js.map +1 -1
  106. package/dist/server/server-routes-public.js +4 -4
  107. package/dist/server/server-routes-public.js.map +1 -1
  108. package/dist/server/server-routes-webchat.js +3 -3
  109. package/dist/server/server-routes-webchat.js.map +1 -1
  110. package/dist/server/server-store-circuit-breaker.js +1 -1
  111. package/dist/server/server-store-circuit-breaker.js.map +1 -1
  112. package/dist/server/tool-router.js +7 -4
  113. package/dist/server/tool-router.js.map +1 -1
  114. package/dist/server/validation.js +11 -0
  115. package/dist/server/validation.js.map +1 -1
  116. package/dist/setup.js +5 -25
  117. package/dist/setup.js.map +1 -1
  118. package/dist/shared/api-client.js +38 -11
  119. package/dist/shared/api-client.js.map +1 -1
  120. package/package.json +12 -10
  121. package/vendor/ink/build/ink.js +68 -24
  122. package/vendor/ink/node_modules/react-devtools-core/README.md +152 -0
  123. package/vendor/ink/node_modules/react-devtools-core/backend.js +1 -0
  124. package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js +2 -0
  125. package/vendor/ink/node_modules/react-devtools-core/dist/648.chunk.js.map +1 -0
  126. package/vendor/ink/node_modules/react-devtools-core/dist/backend.js +15691 -0
  127. package/vendor/ink/node_modules/react-devtools-core/dist/backend.js.map +1 -0
  128. package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js +2 -0
  129. package/vendor/ink/node_modules/react-devtools-core/dist/importFile.worker.worker.js.map +1 -0
  130. package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js +14 -0
  131. package/vendor/ink/node_modules/react-devtools-core/dist/parseSourceAndMetadata.worker.worker.js.map +1 -0
  132. package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js +2 -0
  133. package/vendor/ink/node_modules/react-devtools-core/dist/standalone.js.map +1 -0
  134. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/LICENSE +21 -0
  135. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/README.md +495 -0
  136. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/browser.js +8 -0
  137. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/index.js +10 -0
  138. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/buffer-util.js +129 -0
  139. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/constants.js +10 -0
  140. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/event-target.js +184 -0
  141. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/extension.js +223 -0
  142. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/limiter.js +55 -0
  143. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/permessage-deflate.js +518 -0
  144. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/receiver.js +607 -0
  145. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/sender.js +409 -0
  146. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/stream.js +180 -0
  147. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/validation.js +104 -0
  148. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket-server.js +449 -0
  149. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/lib/websocket.js +1197 -0
  150. package/vendor/ink/node_modules/react-devtools-core/node_modules/ws/package.json +56 -0
  151. package/vendor/ink/node_modules/react-devtools-core/package.json +38 -0
  152. package/vendor/ink/node_modules/react-devtools-core/standalone.js +1 -0
  153. package/dist/cli/__tests__/print-mode-streaming.test.js +0 -270
  154. package/dist/cli/__tests__/print-mode.basic-output.test.js +0 -230
  155. package/dist/cli/__tests__/print-mode.session-errors.test.js +0 -252
  156. package/dist/cli/__tests__/print-mode.test.js +0 -273
  157. package/dist/cli/__tests__/serve-mode-messages.test.js +0 -338
  158. package/dist/cli/__tests__/serve-mode.messages.part2.test.js +0 -266
  159. package/dist/cli/__tests__/serve-mode.messages.test.js +0 -277
  160. package/dist/cli/__tests__/serve-mode.startup-http.test.js +0 -279
  161. package/dist/cli/__tests__/serve-mode.test.js +0 -345
  162. package/dist/cli/chat/NodeManager.d.ts +0 -30
  163. package/dist/cli/chat/NodeManager.js +0 -66
  164. package/dist/cli/chat/NodeManager.js.map +0 -1
  165. package/dist/cli/chat/chat-input-menu-handler.d.ts +0 -32
  166. package/dist/cli/chat/hooks/slash-imsg-handlers.js +0 -148
  167. package/dist/cli/chat/hooks/slash-imsg-handlers.js.map +0 -1
  168. package/dist/cli/chat/hooks/useStreamingReducer.d.ts +0 -66
  169. package/dist/cli/commands/__tests__/config-cmd.test.js +0 -270
  170. package/dist/cli/commands/__tests__/doctor.test.js +0 -257
  171. package/dist/cli/commands/__tests__/imsg-node-bridge.test.js +0 -99
  172. package/dist/cli/commands/__tests__/imsg-utils.test.js +0 -73
  173. package/dist/cli/commands/__tests__/init.test.js +0 -214
  174. package/dist/cli/commands/__tests__/mcp.test.js +0 -287
  175. package/dist/cli/commands/imsg-watcher-helpers.d.ts +0 -40
  176. package/dist/cli/commands/imsg-watcher-helpers.js +0 -184
  177. package/dist/cli/commands/imsg-watcher-helpers.js.map +0 -1
  178. package/dist/cli/commands/imsg-watcher.d.ts +0 -11
  179. package/dist/cli/commands/imsg-watcher.js +0 -230
  180. package/dist/cli/commands/imsg-watcher.js.map +0 -1
  181. package/dist/cli/services/__tests__/agent-definitions.test.js +0 -153
  182. package/dist/cli/services/__tests__/agent-events-global.test.js +0 -39
  183. package/dist/cli/services/__tests__/agent-events.part2.test.js +0 -113
  184. package/dist/cli/services/__tests__/agent-events.test.js +0 -157
  185. package/dist/cli/services/__tests__/agent-loop-auth.test.js +0 -392
  186. package/dist/cli/services/__tests__/agent-loop-budget.test.js +0 -389
  187. package/dist/cli/services/__tests__/agent-loop-tools-lifecycle.test.js +0 -430
  188. package/dist/cli/services/__tests__/agent-loop-tools-maxturns.test.js +0 -486
  189. package/dist/cli/services/__tests__/agent-loop-utils-execution.test.js +0 -528
  190. package/dist/cli/services/__tests__/agent-loop-utils-helpers.test.js +0 -466
  191. package/dist/cli/services/__tests__/agent-worker-base-execute.test.js +0 -257
  192. package/dist/cli/services/__tests__/agent-worker-base-helpers.test.js +0 -198
  193. package/dist/cli/services/__tests__/agent-worker-base.test.js +0 -278
  194. package/dist/cli/services/__tests__/auth-service-exports.test.js +0 -41
  195. package/dist/cli/services/__tests__/auth-service.part2.test.js +0 -169
  196. package/dist/cli/services/__tests__/auth-service.test.js +0 -242
  197. package/dist/cli/services/__tests__/background-processes.test.js +0 -282
  198. package/dist/cli/services/__tests__/claude-md-loader.test.js +0 -134
  199. package/dist/cli/services/__tests__/config-store.test.js +0 -247
  200. package/dist/cli/services/__tests__/debug-log.test.js +0 -199
  201. package/dist/cli/services/__tests__/edge-cases-caching.test.js +0 -174
  202. package/dist/cli/services/__tests__/edge-cases-compaction-core.test.js +0 -226
  203. package/dist/cli/services/__tests__/edge-cases-compaction-openai.test.js +0 -152
  204. package/dist/cli/services/__tests__/edge-cases-compaction-shapes.test.js +0 -53
  205. package/dist/cli/services/__tests__/edge-cases-compaction-thinking.test.js +0 -226
  206. package/dist/cli/services/__tests__/edge-cases-compaction.test.js +0 -131
  207. package/dist/cli/services/__tests__/edge-cases-paths.test.js +0 -86
  208. package/dist/cli/services/__tests__/error-logger-messages.test.js +0 -81
  209. package/dist/cli/services/__tests__/error-logger-transport.test.js +0 -119
  210. package/dist/cli/services/__tests__/error-logger.test.js +0 -264
  211. package/dist/cli/services/__tests__/file-history.test.js +0 -136
  212. package/dist/cli/services/__tests__/git-context-cache-reset.test.js +0 -223
  213. package/dist/cli/services/__tests__/git-context.test.js +0 -241
  214. package/dist/cli/services/__tests__/interactive-tools-execute.test.js +0 -166
  215. package/dist/cli/services/__tests__/interactive-tools-plan.test.js +0 -197
  216. package/dist/cli/services/__tests__/interactive-tools.part2.test.js +0 -168
  217. package/dist/cli/services/__tests__/interactive-tools.test.js +0 -179
  218. package/dist/cli/services/__tests__/keybinding-manager.test.js +0 -205
  219. package/dist/cli/services/__tests__/local-tools-dispatch.test.js +0 -404
  220. package/dist/cli/services/__tests__/local-tools.test.js +0 -238
  221. package/dist/cli/services/__tests__/lsp-manager.test.js +0 -364
  222. package/dist/cli/services/__tests__/mcp-client-connect-disconnect.test.js +0 -310
  223. package/dist/cli/services/__tests__/mcp-client.test.js +0 -93
  224. package/dist/cli/services/__tests__/memory-manager.test.js +0 -154
  225. package/dist/cli/services/__tests__/model-manager-utils.test.js +0 -154
  226. package/dist/cli/services/__tests__/model-manager.test.js +0 -175
  227. package/dist/cli/services/__tests__/permission-modes.test.js +0 -222
  228. package/dist/cli/services/__tests__/ripgrep.test.js +0 -328
  229. package/dist/cli/services/__tests__/server-tools-execute.test.js +0 -317
  230. package/dist/cli/services/__tests__/server-tools.test.js +0 -272
  231. package/dist/cli/services/__tests__/session-persistence.test.js +0 -245
  232. package/dist/cli/services/__tests__/subagent-basic.test.js +0 -489
  233. package/dist/cli/services/__tests__/subagent-edge.test.js +0 -545
  234. package/dist/cli/services/__tests__/subagent-prompts.test.js +0 -558
  235. package/dist/cli/services/__tests__/subagent-worker-errors.test.js +0 -255
  236. package/dist/cli/services/__tests__/subagent-worker.test.js +0 -242
  237. package/dist/cli/services/__tests__/system-prompt.test.js +0 -210
  238. package/dist/cli/services/__tests__/team-lead-comms-messaging.test.js +0 -250
  239. package/dist/cli/services/__tests__/team-lead-comms-result.test.js +0 -232
  240. package/dist/cli/services/__tests__/team-lead-comms-stop.test.js +0 -344
  241. package/dist/cli/services/__tests__/team-lead-comms.test.js +0 -285
  242. package/dist/cli/services/__tests__/team-lead-create.test.js +0 -327
  243. package/dist/cli/services/__tests__/team-lead-run.test.js +0 -318
  244. package/dist/cli/services/__tests__/team-lead-stop.test.js +0 -199
  245. package/dist/cli/services/__tests__/team-state-comms.test.js +0 -240
  246. package/dist/cli/services/__tests__/team-state-core.test.js +0 -230
  247. package/dist/cli/services/__tests__/team-state-tasks-complete-fail-available.test.js +0 -224
  248. package/dist/cli/services/__tests__/team-state-tasks.test.js +0 -184
  249. package/dist/cli/services/__tests__/telemetry-ai-metadata.test.js +0 -116
  250. package/dist/cli/services/__tests__/telemetry.part2.test.js +0 -195
  251. package/dist/cli/services/__tests__/telemetry.test.js +0 -176
  252. package/dist/cli/services/agent-loop-iteration.d.ts +0 -13
  253. package/dist/cli/services/agent-loop-setup.d.ts +0 -32
  254. package/dist/cli/services/agent-worker-base-api.d.ts +0 -19
  255. package/dist/cli/services/agent-worker-base-helpers.d.ts +0 -27
  256. package/dist/cli/services/agent-worker-base-tools.d.ts +0 -16
  257. package/dist/cli/services/agent-worker-base-types.d.ts +0 -81
  258. package/dist/cli/services/background-agents.d.ts +0 -26
  259. package/dist/cli/services/background-processes-ops.d.ts +0 -24
  260. package/dist/cli/services/background-tool-defs.d.ts +0 -50
  261. package/dist/cli/services/config-modules-model.test.js +0 -133
  262. package/dist/cli/services/config-modules-permission.test.js +0 -85
  263. package/dist/cli/services/config-modules-permissions.test.js +0 -85
  264. package/dist/cli/services/config-modules-session.test.js +0 -297
  265. package/dist/cli/services/format-server-response-columns.test.js +0 -265
  266. package/dist/cli/services/format-server-response-fallback.test.js +0 -65
  267. package/dist/cli/services/format-server-response-primitives-basic.test.js +0 -261
  268. package/dist/cli/services/format-server-response-primitives-nested.test.js +0 -188
  269. package/dist/cli/services/format-server-response-primitives.test.js +0 -300
  270. package/dist/cli/services/format-server-response-realworld.test.js +0 -248
  271. package/dist/cli/services/format-server-response-values.test.js +0 -247
  272. package/dist/cli/services/hooks-runners.test.js +0 -184
  273. package/dist/cli/services/hooks.glob-load.test.js +0 -233
  274. package/dist/cli/services/hooks.run-hooks.test.js +0 -184
  275. package/dist/cli/services/hooks.test.js +0 -233
  276. package/dist/cli/services/ink-incremental.d.ts +0 -19
  277. package/dist/cli/services/ink-incremental.js +0 -59
  278. package/dist/cli/services/ink-incremental.js.map +0 -1
  279. package/dist/cli/services/ink-resize-fix.d.ts +0 -18
  280. package/dist/cli/services/ink-resize-fix.js +0 -76
  281. package/dist/cli/services/ink-resize-fix.js.map +0 -1
  282. package/dist/cli/services/ink-sync-output.d.ts +0 -12
  283. package/dist/cli/services/ink-sync-output.js +0 -16
  284. package/dist/cli/services/ink-sync-output.js.map +0 -1
  285. package/dist/cli/services/interactive-tool-defs.d.ts +0 -80
  286. package/dist/cli/services/local-tools-definitions.d.ts +0 -6
  287. package/dist/cli/services/local-tools-files.test.js +0 -256
  288. package/dist/cli/services/local-tools-read-many.d.ts +0 -6
  289. package/dist/cli/services/model-router.test.js +0 -245
  290. package/dist/cli/services/rewind-rewindTo.test.js +0 -202
  291. package/dist/cli/services/rewind.test.js +0 -175
  292. package/dist/cli/services/sandbox.test.js +0 -198
  293. package/dist/cli/services/subagent-execution.d.ts +0 -12
  294. package/dist/cli/services/team-lead-auto.d.ts +0 -11
  295. package/dist/cli/services/team-lead-execution.d.ts +0 -28
  296. package/dist/cli/services/teammate-loop.js +0 -557
  297. package/dist/cli/services/teammate-loop.js.map +0 -1
  298. package/dist/cli/services/tools/__tests__/agent-tools-tasks-teams.test.js +0 -250
  299. package/dist/cli/services/tools/__tests__/agent-tools-teams.test.js +0 -200
  300. package/dist/cli/services/tools/__tests__/agent-tools.test.js +0 -340
  301. package/dist/cli/services/tools/__tests__/file-ops-cache.test.js +0 -152
  302. package/dist/cli/services/tools/__tests__/file-ops-notebook.test.js +0 -249
  303. package/dist/cli/services/tools/__tests__/file-ops-read.test.js +0 -261
  304. package/dist/cli/services/tools/__tests__/file-ops-write.test.js +0 -292
  305. package/dist/cli/services/tools/__tests__/search-tools-rg.test.js +0 -92
  306. package/dist/cli/services/tools/__tests__/search-tools.part2.test.js +0 -174
  307. package/dist/cli/services/tools/__tests__/search-tools.test.js +0 -227
  308. package/dist/cli/services/tools/__tests__/shell-exec-allowed-core.test.js +0 -163
  309. package/dist/cli/services/tools/__tests__/shell-exec-allowed-extended.test.js +0 -220
  310. package/dist/cli/services/tools/__tests__/shell-exec-allowed.part2.test.js +0 -215
  311. package/dist/cli/services/tools/__tests__/shell-exec-allowed.test.js +0 -154
  312. package/dist/cli/services/tools/__tests__/shell-exec-blocked.test.js +0 -132
  313. package/dist/cli/services/tools/__tests__/shell-exec-execution.test.js +0 -245
  314. package/dist/cli/services/tools/__tests__/task-manager-create.test.js +0 -110
  315. package/dist/cli/services/tools/__tests__/task-manager-crud.test.js +0 -339
  316. package/dist/cli/services/tools/__tests__/task-manager-list-get.test.js +0 -343
  317. package/dist/cli/services/tools/__tests__/task-manager-query.test.js +0 -346
  318. package/dist/cli/services/tools/__tests__/task-manager-routing.test.js +0 -58
  319. package/dist/cli/services/tools/__tests__/task-manager-update.test.js +0 -224
  320. package/dist/cli/services/tools/__tests__/task-manager.test.js +0 -159
  321. package/dist/cli/services/tools/__tests__/web-tools-html-search.test.js +0 -227
  322. package/dist/cli/services/tools/__tests__/web-tools.test.js +0 -285
  323. package/dist/cli/services/tools/shell-exec.test.js +0 -148
  324. package/dist/cli/shared/SharedTick.d.ts +0 -10
  325. package/dist/cli/shared/__tests__/markdown.test.js +0 -188
  326. package/dist/local-agent/__tests__/connection-disconnect.test.js +0 -201
  327. package/dist/local-agent/__tests__/connection-lifecycle.test.js +0 -289
  328. package/dist/local-agent/__tests__/connection-msghandling.test.js +0 -311
  329. package/dist/local-agent/__tests__/connection-reconnect.test.js +0 -230
  330. package/dist/local-agent/__tests__/connection-toolexec.test.js +0 -253
  331. package/dist/local-agent/__tests__/discovery.test.js +0 -328
  332. package/dist/local-agent/__tests__/executor-background.test.js +0 -219
  333. package/dist/local-agent/__tests__/executor-exec.test.js +0 -221
  334. package/dist/local-agent/__tests__/executor-jobs-sessions.test.js +0 -220
  335. package/dist/local-agent/__tests__/executor-system-info.test.js +0 -133
  336. package/dist/local-agent/__tests__/executor-systeminfo.test.js +0 -109
  337. package/dist/local-agent/__tests__/executor.test.js +0 -235
  338. package/dist/local-agent/__tests__/index.test.js +0 -139
  339. package/dist/node/__tests__/cli-channels.test.js +0 -293
  340. package/dist/node/__tests__/cli-config-edge.test.js +0 -154
  341. package/dist/node/__tests__/cli-config.test.js +0 -215
  342. package/dist/node/__tests__/config.test.js +0 -292
  343. package/dist/node/__tests__/runtime-heartbeat.test.js +0 -153
  344. package/dist/node/__tests__/runtime-lifecycle-init.test.js +0 -263
  345. package/dist/node/__tests__/runtime-lifecycle-stats.test.js +0 -180
  346. package/dist/node/__tests__/runtime-lifecycle.test.js +0 -305
  347. package/dist/node/__tests__/runtime-relay.test.js +0 -341
  348. package/dist/node/adapters/__tests__/base.test.js +0 -286
  349. package/dist/node/adapters/__tests__/discord.test.js +0 -284
  350. package/dist/node/adapters/__tests__/email-send.test.js +0 -295
  351. package/dist/node/adapters/__tests__/email.inbound-send.test.js +0 -217
  352. package/dist/node/adapters/__tests__/email.lifecycle.test.js +0 -211
  353. package/dist/node/adapters/__tests__/email.test.js +0 -290
  354. package/dist/node/adapters/__tests__/email.webhook-send.test.js +0 -251
  355. package/dist/node/adapters/__tests__/imessage-filter.test.js +0 -183
  356. package/dist/node/adapters/__tests__/imessage-lifecycle.test.js +0 -215
  357. package/dist/node/adapters/__tests__/imessage-send-restart.test.js +0 -227
  358. package/dist/node/adapters/__tests__/slack.part2.test.js +0 -135
  359. package/dist/node/adapters/__tests__/slack.test.js +0 -241
  360. package/dist/node/adapters/__tests__/sms-extras.test.js +0 -108
  361. package/dist/node/adapters/__tests__/sms-lifecycle.test.js +0 -203
  362. package/dist/node/adapters/__tests__/sms-messaging.test.js +0 -266
  363. package/dist/node/adapters/__tests__/sms.part2.test.js +0 -174
  364. package/dist/node/adapters/__tests__/sms.test.js +0 -253
  365. package/dist/node/adapters/__tests__/telegram-polling.test.js +0 -256
  366. package/dist/node/adapters/__tests__/telegram-send.test.js +0 -166
  367. package/dist/node/adapters/__tests__/webchat-inbound.test.js +0 -188
  368. package/dist/node/adapters/__tests__/webchat-outbound.test.js +0 -178
  369. package/dist/node/adapters/__tests__/whatsapp-inbound.test.js +0 -200
  370. package/dist/node/adapters/__tests__/whatsapp-send.test.js +0 -212
  371. package/dist/node/adapters/__tests__/whatsapp.test.js +0 -280
  372. package/dist/server/__tests__/gateway-fast-fail.test.js +0 -160
  373. package/dist/server/__tests__/local-agent-gateway.test.js +0 -186
  374. package/dist/server/__tests__/proxy-handlers-delegation.test.js +0 -240
  375. package/dist/server/__tests__/proxy-handlers-validation.test.js +0 -211
  376. package/dist/server/__tests__/proxy-handlers.part2.test.js +0 -240
  377. package/dist/server/__tests__/proxy-handlers.test.js +0 -213
  378. package/dist/server/__tests__/strip-base64-e2e.test.js +0 -303
  379. package/dist/server/__tests__/strip-base64.test.js +0 -256
  380. package/dist/server/__tests__/tool-router-agent-tools.test.js +0 -324
  381. package/dist/server/__tests__/tool-router-execute-core.test.js +0 -357
  382. package/dist/server/__tests__/tool-router-execute-permissions.test.js +0 -332
  383. package/dist/server/__tests__/tool-router-execute.test.js +0 -348
  384. package/dist/server/__tests__/tool-router-load.test.js +0 -432
  385. package/dist/server/__tests__/tool-router-permissions.test.js +0 -359
  386. package/dist/server/__tests__/tool-router-registry-cache.test.js +0 -383
  387. package/dist/server/__tests__/tool-router-registry-handlers.test.js +0 -272
  388. package/dist/server/__tests__/tool-router-registry.test.js +0 -331
  389. package/dist/server/__tests__/validation-inventory.test.js +0 -250
  390. package/dist/server/__tests__/validation-misc.test.js +0 -243
  391. package/dist/server/__tests__/validation-supply-chain.test.js +0 -188
  392. package/dist/server/__tests__/worker.test.js +0 -265
  393. package/dist/server/handlers/__tests__/conversation-lock.test.js +0 -117
  394. package/dist/server/handlers/__tests__/e2e/auth-cross-platform-login.e2e.test.js +0 -268
  395. package/dist/server/handlers/__tests__/e2e/auth-cross-platform-tokens.e2e.test.js +0 -264
  396. package/dist/server/handlers/__tests__/e2e/email-pipeline-send.e2e.test.js +0 -214
  397. package/dist/server/handlers/__tests__/e2e/email-pipeline-threads.e2e.test.js +0 -168
  398. package/dist/server/handlers/__tests__/e2e/error-logging-pipeline-dedup.e2e.test.js +0 -229
  399. package/dist/server/handlers/__tests__/e2e/error-logging-pipeline.e2e.test.js +0 -239
  400. package/dist/server/handlers/__tests__/e2e/error-logging-rate-limit.e2e.test.js +0 -150
  401. package/dist/server/handlers/__tests__/e2e/inventory-sync-guards.e2e.test.js +0 -177
  402. package/dist/server/handlers/__tests__/e2e/inventory-sync.e2e.test.js +0 -228
  403. package/dist/server/handlers/__tests__/e2e/inventory-sync.part2.e2e.test.js +0 -188
  404. package/dist/server/handlers/__tests__/e2e/order-lifecycle-fulfillment.e2e.test.js +0 -295
  405. package/dist/server/handlers/__tests__/e2e/order-lifecycle.e2e.test.js +0 -277
  406. package/dist/server/handlers/__tests__/e2e/order-lifecycle.fulfillment.e2e.test.js +0 -307
  407. package/dist/server/handlers/__tests__/e2e/order-lifecycle.setup.e2e.test.js +0 -177
  408. package/dist/server/handlers/__tests__/e2e/storefront-checkout-cart.e2e.test.js +0 -255
  409. package/dist/server/handlers/__tests__/e2e/storefront-checkout-webhook.e2e.test.js +0 -231
  410. package/dist/server/handlers/__tests__/e2e/workflow-execution-failures.e2e.test.js +0 -235
  411. package/dist/server/handlers/__tests__/e2e/workflow-execution.e2e.test.js +0 -294
  412. package/dist/server/handlers/__tests__/e2e/workflow-security.e2e.test.js +0 -311
  413. package/dist/server/handlers/__tests__/e2e/workflow-security.part2.e2e.test.js +0 -267
  414. package/dist/server/handlers/__tests__/workflow-cache.test.js +0 -237
  415. package/dist/server/handlers/analytics-errors-edge.test.js +0 -173
  416. package/dist/server/handlers/analytics.test.js +0 -280
  417. package/dist/server/handlers/api-docs-examples-ext.d.ts +0 -9
  418. package/dist/server/handlers/api-docs-examples-ext.js +0 -278
  419. package/dist/server/handlers/api-docs-examples-ext.js.map +0 -1
  420. package/dist/server/handlers/api-docs-examples.d.ts +0 -8
  421. package/dist/server/handlers/api-docs-examples.js +0 -221
  422. package/dist/server/handlers/api-docs-examples.js.map +0 -1
  423. package/dist/server/handlers/api-docs-sections-ext.d.ts +0 -2
  424. package/dist/server/handlers/api-docs-sections-ext.js +0 -497
  425. package/dist/server/handlers/api-docs-sections-ext.js.map +0 -1
  426. package/dist/server/handlers/api-docs-sections.d.ts +0 -21
  427. package/dist/server/handlers/api-docs-sections.js +0 -293
  428. package/dist/server/handlers/api-docs-sections.js.map +0 -1
  429. package/dist/server/handlers/api-keys.part2.test.js +0 -157
  430. package/dist/server/handlers/api-keys.test.js +0 -161
  431. package/dist/server/handlers/billing-routes.test.js +0 -123
  432. package/dist/server/handlers/billing.test.js +0 -215
  433. package/dist/server/handlers/browser-actions-errors.test.js +0 -94
  434. package/dist/server/handlers/browser-actions.part2.test.js +0 -190
  435. package/dist/server/handlers/browser-actions.test.js +0 -190
  436. package/dist/server/handlers/browser-validation.test.js +0 -257
  437. package/dist/server/handlers/catalog.test.js +0 -297
  438. package/dist/server/handlers/comms.test.js +0 -289
  439. package/dist/server/handlers/creations-advanced-collections.test.js +0 -214
  440. package/dist/server/handlers/creations-advanced-generate.test.js +0 -142
  441. package/dist/server/handlers/creations-advanced.test.js +0 -171
  442. package/dist/server/handlers/creations-collections-preview.test.js +0 -214
  443. package/dist/server/handlers/creations-crud.test.js +0 -260
  444. package/dist/server/handlers/creations-mutations.test.js +0 -197
  445. package/dist/server/handlers/crm.test.js +0 -179
  446. package/dist/server/handlers/discovery-advertise.test.js +0 -185
  447. package/dist/server/handlers/discovery-scan.test.js +0 -233
  448. package/dist/server/handlers/embeddings-embed-search.test.js +0 -196
  449. package/dist/server/handlers/embeddings-index-delete-stats.test.js +0 -140
  450. package/dist/server/handlers/embeddings-search.test.js +0 -221
  451. package/dist/server/handlers/embeddings.test.js +0 -137
  452. package/dist/server/handlers/enrichment-breach.d.ts +0 -8
  453. package/dist/server/handlers/enrichment-breach.js +0 -266
  454. package/dist/server/handlers/enrichment-breach.js.map +0 -1
  455. package/dist/server/handlers/enrichment-data.d.ts +0 -13
  456. package/dist/server/handlers/enrichment-data.js +0 -145
  457. package/dist/server/handlers/enrichment-data.js.map +0 -1
  458. package/dist/server/handlers/enrichment-mutations.test.js +0 -240
  459. package/dist/server/handlers/enrichment-queries.test.js +0 -181
  460. package/dist/server/handlers/enrichment-validation.test.js +0 -177
  461. package/dist/server/handlers/enrichment-writes.d.ts +0 -16
  462. package/dist/server/handlers/enrichment-writes.js +0 -226
  463. package/dist/server/handlers/enrichment-writes.js.map +0 -1
  464. package/dist/server/handlers/image-gen.test.js +0 -205
  465. package/dist/server/handlers/inventory.test.js +0 -380
  466. package/dist/server/handlers/kali-background.test.js +0 -222
  467. package/dist/server/handlers/kali-errors.test.js +0 -92
  468. package/dist/server/handlers/kali-validation.test.js +0 -234
  469. package/dist/server/handlers/llm-providers-actions.test.js +0 -220
  470. package/dist/server/handlers/llm-providers-anthropic.test.js +0 -239
  471. package/dist/server/handlers/llm-providers-failover.test.js +0 -232
  472. package/dist/server/handlers/llm-providers-providers.test.js +0 -300
  473. package/dist/server/handlers/llm-providers-validation.test.js +0 -239
  474. package/dist/server/handlers/local-agent-tools.test.js +0 -224
  475. package/dist/server/handlers/local-agent.test.js +0 -198
  476. package/dist/server/handlers/local-agent.tools-status.test.js +0 -204
  477. package/dist/server/handlers/local-agent.validation-exec.test.js +0 -182
  478. package/dist/server/handlers/meta-ads-audience-rules.test.js +0 -243
  479. package/dist/server/handlers/meta-ads-audience-targeting.test.js +0 -205
  480. package/dist/server/handlers/meta-ads-audiences-targeting.test.js +0 -383
  481. package/dist/server/handlers/meta-ads-crud-ads.test.js +0 -136
  482. package/dist/server/handlers/meta-ads-crud-campaigns.test.js +0 -189
  483. package/dist/server/handlers/meta-ads-crud-create.test.js +0 -303
  484. package/dist/server/handlers/meta-ads-crud-list-update.test.js +0 -259
  485. package/dist/server/handlers/meta-ads-delete-publish-sync.test.js +0 -282
  486. package/dist/server/handlers/meta-ads-insights.test.js +0 -80
  487. package/dist/server/handlers/meta-ads-list-get.test.js +0 -237
  488. package/dist/server/handlers/meta-ads-publish-delete.test.js +0 -254
  489. package/dist/server/handlers/meta-ads-publish-helpers.js +0 -117
  490. package/dist/server/handlers/meta-ads-publish-helpers.js.map +0 -1
  491. package/dist/server/handlers/meta-ads-publish-sync.test.js +0 -205
  492. package/dist/server/handlers/meta-ads-publish.test.js +0 -254
  493. package/dist/server/handlers/meta-ads-sync-insights.test.js +0 -184
  494. package/dist/server/handlers/meta-ads-update.test.js +0 -117
  495. package/dist/server/handlers/nodes-channels.test.js +0 -413
  496. package/dist/server/handlers/nodes-events.test.js +0 -131
  497. package/dist/server/handlers/nodes-list-delete.test.js +0 -171
  498. package/dist/server/handlers/nodes-messages-delivery.test.js +0 -208
  499. package/dist/server/handlers/nodes-messages.test.js +0 -211
  500. package/dist/server/handlers/nodes-register.test.js +0 -277
  501. package/dist/server/handlers/nodes.test.js +0 -353
  502. package/dist/server/handlers/operations.test.js +0 -136
  503. package/dist/server/handlers/platform-telemetry.test.js +0 -200
  504. package/dist/server/handlers/platform-websearch.test.js +0 -160
  505. package/dist/server/handlers/storefront.test.js +0 -329
  506. package/dist/server/handlers/supply-chain.test.js +0 -347
  507. package/dist/server/handlers/transcription.test.js +0 -118
  508. package/dist/server/handlers/video-gen-veo.js +0 -114
  509. package/dist/server/handlers/video-gen-veo.js.map +0 -1
  510. package/dist/server/handlers/video-gen.test.js +0 -146
  511. package/dist/server/handlers/voice.test.js +0 -153
  512. package/dist/server/handlers/workflow-steps.test.js +0 -330
  513. package/dist/server/handlers/workflows-extras.test.js +0 -65
  514. package/dist/server/handlers/workflows.part2.test.js +0 -170
  515. package/dist/server/handlers/workflows.test.js +0 -281
  516. package/dist/server/lib/__tests__/batch-client-conversion-jsonl.test.js +0 -171
  517. package/dist/server/lib/__tests__/batch-client-polling.test.js +0 -292
  518. package/dist/server/lib/__tests__/batch-client-queue.test.js +0 -270
  519. package/dist/server/lib/__tests__/clickhouse-buffer.test.js +0 -236
  520. package/dist/server/lib/__tests__/code-worker-edge-cases.test.js +0 -118
  521. package/dist/server/lib/__tests__/code-worker-pool-execute.test.js +0 -193
  522. package/dist/server/lib/__tests__/code-worker-pool-execution.test.js +0 -165
  523. package/dist/server/lib/__tests__/code-worker-pool-init.test.js +0 -131
  524. package/dist/server/lib/__tests__/code-worker-pool.test.js +0 -194
  525. package/dist/server/lib/__tests__/code-worker-sandbox-ops.test.js +0 -123
  526. package/dist/server/lib/__tests__/code-worker-sandbox.test.js +0 -217
  527. package/dist/server/lib/__tests__/code-worker.test.js +0 -179
  528. package/dist/server/lib/__tests__/compaction-service-generate.test.js +0 -229
  529. package/dist/server/lib/__tests__/compaction-service.test.js +0 -319
  530. package/dist/server/lib/__tests__/otel.test.js +0 -146
  531. package/dist/server/lib/__tests__/prompt-sanitizer-validation.test.js +0 -165
  532. package/dist/server/lib/__tests__/prompt-sanitizer.sanitize.test.js +0 -343
  533. package/dist/server/lib/__tests__/prompt-sanitizer.test.js +0 -328
  534. package/dist/server/lib/__tests__/prompt-sanitizer.validate-tool.test.js +0 -145
  535. package/dist/server/lib/__tests__/provider-capabilities.test.js +0 -263
  536. package/dist/server/lib/__tests__/provider-failover-routing.test.js +0 -145
  537. package/dist/server/lib/__tests__/provider-failover-state.test.js +0 -131
  538. package/dist/server/lib/__tests__/rate-limiter-budgets.test.js +0 -216
  539. package/dist/server/lib/__tests__/rate-limiter.budgets-tools.test.js +0 -113
  540. package/dist/server/lib/__tests__/rate-limiter.check-request.test.js +0 -141
  541. package/dist/server/lib/__tests__/rate-limiter.stats-lifecycle.test.js +0 -135
  542. package/dist/server/lib/__tests__/rate-limiter.test.js +0 -207
  543. package/dist/server/lib/__tests__/server-agent-loop-abort-conditions.test.js +0 -544
  544. package/dist/server/lib/__tests__/server-agent-loop-abort.part2.test.js +0 -504
  545. package/dist/server/lib/__tests__/server-agent-loop-abort.test.js +0 -396
  546. package/dist/server/lib/__tests__/server-agent-loop-compaction.test.js +0 -397
  547. package/dist/server/lib/__tests__/server-agent-loop-failover.test.js +0 -356
  548. package/dist/server/lib/__tests__/server-agent-loop-features-caching.test.js +0 -519
  549. package/dist/server/lib/__tests__/server-agent-loop-features-edges.test.js +0 -512
  550. package/dist/server/lib/__tests__/server-subagent-bailout.test.js +0 -194
  551. package/dist/server/lib/__tests__/server-subagent-basics.test.js +0 -348
  552. package/dist/server/lib/__tests__/server-subagent-errors-abort.test.js +0 -319
  553. package/dist/server/lib/__tests__/server-subagent-errors-progress.test.js +0 -253
  554. package/dist/server/lib/__tests__/server-subagent-errors.part2.test.js +0 -253
  555. package/dist/server/lib/__tests__/server-subagent-errors.test.js +0 -319
  556. package/dist/server/lib/__tests__/session-checkpoint-load.test.js +0 -275
  557. package/dist/server/lib/__tests__/session-checkpoint-save.test.js +0 -159
  558. package/dist/server/lib/__tests__/ssrf-guard.test.js +0 -93
  559. package/dist/server/lib/__tests__/supabase-client.test.js +0 -111
  560. package/dist/server/lib/__tests__/template-resolver.test.js +0 -317
  561. package/dist/server/lib/__tests__/utils-timeout.test.js +0 -49
  562. package/dist/server/lib/__tests__/utils.test.js +0 -322
  563. package/dist/server/providers/__tests__/anthropic-adapter.test.js +0 -228
  564. package/dist/server/providers/__tests__/anthropic-betas-toolchoice.test.js +0 -257
  565. package/dist/server/providers/__tests__/anthropic-errors.test.js +0 -262
  566. package/dist/server/providers/__tests__/anthropic-stream-core.test.js +0 -275
  567. package/dist/server/providers/__tests__/anthropic-streaming-betas.test.js +0 -247
  568. package/dist/server/providers/__tests__/anthropic-streaming-core.test.js +0 -275
  569. package/dist/server/providers/__tests__/bedrock-config.test.js +0 -177
  570. package/dist/server/providers/__tests__/bedrock-stream-behavior-streaming.test.js +0 -272
  571. package/dist/server/providers/__tests__/bedrock-stream-behavior-toolchoice.test.js +0 -214
  572. package/dist/server/providers/__tests__/bedrock-stream-behavior.part2.test.js +0 -165
  573. package/dist/server/providers/__tests__/bedrock-stream-behavior.test.js +0 -309
  574. package/dist/server/providers/__tests__/bedrock-stream-body-credentials.test.js +0 -170
  575. package/dist/server/providers/__tests__/bedrock-stream-body-extras.test.js +0 -183
  576. package/dist/server/providers/__tests__/bedrock-stream-body-request.test.js +0 -305
  577. package/dist/server/providers/__tests__/bedrock-stream-body.part2.test.js +0 -305
  578. package/dist/server/providers/__tests__/bedrock-stream-body.test.js +0 -175
  579. package/dist/server/providers/__tests__/bedrock-stream-errors.test.js +0 -165
  580. package/dist/server/providers/__tests__/gemini-config-methods.test.js +0 -182
  581. package/dist/server/providers/__tests__/gemini-config-streaming.test.js +0 -257
  582. package/dist/server/providers/__tests__/gemini-conversion-messages.test.js +0 -247
  583. package/dist/server/providers/__tests__/gemini-conversion-schema.test.js +0 -365
  584. package/dist/server/providers/__tests__/gemini-tools-choice.test.js +0 -221
  585. package/dist/server/providers/__tests__/gemini-tools-fn.test.js +0 -252
  586. package/dist/server/providers/__tests__/openai-config.test.js +0 -194
  587. package/dist/server/providers/__tests__/openai-conversion.test.js +0 -276
  588. package/dist/server/providers/__tests__/openai-messages.test.js +0 -261
  589. package/dist/server/providers/__tests__/openai-streaming.test.js +0 -394
  590. package/dist/server/providers/__tests__/openai-tools-cache.test.js +0 -227
  591. package/dist/server/providers/__tests__/registry.test.js +0 -183
  592. package/dist/server/providers/__tests__/shared.test.js +0 -297
  593. package/dist/shared/agent-core-config.test.js +0 -132
  594. package/dist/shared/agent-core-context-thinking.test.js +0 -293
  595. package/dist/shared/agent-core-loop-calls.test.js +0 -174
  596. package/dist/shared/agent-core-loop-detector-bail.test.js +0 -201
  597. package/dist/shared/agent-core-loop-detector.test.js +0 -195
  598. package/dist/shared/agent-core-loop-errors.test.js +0 -258
  599. package/dist/shared/agent-core-pricing.test.js +0 -191
  600. package/dist/shared/agent-core-sanitize-retry.test.js +0 -129
  601. package/dist/shared/api-client-build-request.test.js +0 -228
  602. package/dist/shared/api-client-build-system-caching.test.js +0 -107
  603. package/dist/shared/api-client-build.test.js +0 -223
  604. package/dist/shared/api-client-config.d.ts +0 -21
  605. package/dist/shared/api-client-helpers.d.ts +0 -57
  606. package/dist/shared/api-client-helpers.test.js +0 -261
  607. package/dist/shared/api-client-proxy-happy.test.js +0 -255
  608. package/dist/shared/api-client-proxy-retry.test.js +0 -307
  609. package/dist/shared/api-client-proxy.d.ts +0 -26
  610. package/dist/shared/api-client-proxy.test.js +0 -255
  611. package/dist/shared/api-client-retry.test.js +0 -307
  612. package/dist/shared/api-client-system-trimming.test.js +0 -261
  613. package/dist/shared/api-client-trimming.d.ts +0 -36
  614. package/dist/shared/api-client.test.js +0 -228
  615. package/dist/shared/compaction-thinking.test.js +0 -315
  616. package/dist/shared/compaction-trimming.test.js +0 -223
  617. package/dist/shared/sse-parser-callbacks.test.js +0 -422
  618. package/dist/shared/sse-parser-collect.test.js +0 -252
  619. package/dist/shared/sse-parser-e2e.test.js +0 -558
  620. package/dist/shared/sse-parser-parse.test.js +0 -253
  621. package/dist/shared/tool-dispatch-advanced-batch-build.test.js +0 -405
  622. package/dist/shared/tool-dispatch-advanced.test.js +0 -320
  623. package/dist/shared/tool-dispatch-basic.test.js +0 -278
  624. package/dist/shared/tool-dispatch-content.d.ts +0 -14
  625. package/dist/shared/tool-dispatch-parallel.test.js +0 -378
  626. package/dist/webchat/__tests__/widget-messaging.test.js +0 -323
  627. package/dist/webchat/__tests__/widget.test.js +0 -273
@@ -1 +1 @@
1
- {"version":3,"file":"tool-router.js","names":["sanitizeError","validateToolArgs","sanitizeToolDescription","validateUrl","handleInventory","handleInventoryQuery","handleInventoryAudit","handlePurchaseOrders","handleTransfers","handleProducts","handleCollections","handleCustomers","handleOrders","handleAnalytics","handleLocations","handleSuppliers","handleAlerts","handleAuditTrail","handleStore","handleEmail","handleDocuments","handleWebSearch","handleTelemetry","handleBrowser","handleDiscovery","handleVoice","handleWorkflows","handleEmbeddings","handleLLM","handleImageGen","handleRemoveBg","handleMedia","handleVideoGen","handleAPIKeys","handleCreations","handleMetaAds","handleGoogleAds","handleKali","handleLocalAgent","handleEnrichment","handleStorefront","handleApiDocs","handleClickHouse","handleLoyalty","handleCoupons","handleFulfillment","handleSegments","handleCampaigns","handleReviews","handleTax","handleWebhooksMgmt","handleAffiliates","handleQRCodes","handlePhone","handleSocial","handleWallet","handlePipeline","handleInvoices","handleWholesale","summarizeResult","withTimeout","queueSpan","flushSpans","auditRowToSpan","classifyErrorType","toolMetrics","Map","getToolMetrics","result","name","m","invocations","errors","avgMs","Math","round","totalMs","lastMs","recordToolMetric","toolName","durationMs","success","get","set","cachedResult","cacheTime","cachedApiToolDefs","truncateDescription","desc","maxLen","length","cut","lastIndexOf","substring","loadTools","supabase","forceRefresh","Date","now","data","error","from","select","eq","neq","core","extended","all","allTools","map","t","description","definition","input_schema","type","properties","migrationApplied","some","auto_load","push","i","DISCOVER_TOOLS_DEF","getCachedToolDefs","tools","cached","names","items","category","refresh","userToolCache","USER_TOOL_CACHE_MAX","evictUserToolCache","size","entries","sort","a","b","lastAccessed","excess","delete","loadUserTools","storeId","time","rows","defs","display_name","requires_approval","getUserToolByPrefixedName","prefixedName","replace","find","getToolsForAgent","agent","coreTools","userToolDefs","enabled_tools","filteredUserTools","filter","includes","DEFAULT_TIMEOUT","TOOL_HANDLERS","inventory","handler","sb","args","sid","action","startsWith","slice","timeout","requiresStore","purchase_orders","transfers","products","collections","customers","orders","analytics","locations","suppliers","store","storefront","email","documents","alerts","audit_trail","workflows","voice","image_gen","remove_bg","media","video_gen","llm","embeddings","creations","web_search","telemetry","browser","discovery","api_keys","api_docs","meta_ads","google_ads","kali","supportsProgress","local_agent","enrichment","clickhouse","loyalty","coupons","fulfillment","segments","campaigns","reviews","tax","invoices","webhooks_mgmt","affiliates","qr_codes","phone","social","wallet","pipeline","wholesale","discover_tools","handleDiscoverTools","Object","freeze","getRegisteredToolNames","keys","_extendedToolsCache","_extendedToolsIndex","setExtendedToolsCache","split","getExtendedToolsCache","getExtendedToolsIndex","getFullToolSchemas","toolNames","nameSet","Set","has","TOOL_CATEGORIES","freshResult","matching","cat","toLowerCase","categoryTools","existingNames","available","join","count","refreshed","executeUserTool","userTool","agentId","conversationId","max_execution_time_ms","execution_type","executeHTTPUserTool","rpc","p_tool_id","id","p_store_id","p_args","p_agent_id","p_conversation_id","message","pending_approval","execution_id","execute_sql","executeSQLUserTool","err","config","http_config","url","httpCfg","headers","configStr","JSON","stringify","body","body_template","secretRefs","matchAll","secretMap","Promise","p_name","resolveSecrets","text","_","resolveArgs","val","undefined","String","resolve","key","method","toUpperCase","resolvedBody","ssrfError","controller","AbortController","timer","setTimeout","abort","resp","fetch","signal","clearTimeout","clear","contentType","json","ok","status","sqlConfig","is_read_only","template","p_sql","p_params","p_allowed_tables","allowed_tables","executeSupplyChain","traceId","userId","userEmail","source","userToolRows","scAction","PO_ALIASES","create","list","add_items","approve","mark_ordered","receive","cancel","executeTool","onToolProgress","skipAudit","startTime","entry","test","agentFlags","single","can_query","readActions","can_modify","writeActions","wa","validation","valid","execStartMs","toolPromise","progressCb","progress","timeoutMs","stepTimeout","_step_timeout_seconds","console","warn","endTime","inputJson","outputJson","inputBytes","outputBytes","details","tool_input","input_bytes","output_bytes","result_summary","tool_result","_truncated","_type","Array","isArray","_size","_count","tool_error","errorType","error_type","bytes","Uint8Array","crypto","getRandomValues","spanId","toString","padStart","auditRow","severity","store_id","resource_type","resource_id","request_id","conversation_id","error_message","duration_ms","user_id","user_email","trace_id","span_id","span_kind","service_name","status_code","start_time","toISOString","end_time","loadAgentConfig","query","or"],"sources":["../../src/server/tool-router.ts"],"sourcesContent":["/**\n * Tool Router — unified tool registry, dispatch, and execution.\n *\n * SINGLE SOURCE OF TRUTH for all AI systems (MCP server, HTTP agent, workflows, CLI).\n *\n * Architecture:\n * - ai_tool_registry (DB): tool definitions (name, description, schema) — queried by ALL clients\n * - TOOL_HANDLERS (code): name → handler function mapping — the only place handler routing lives\n * - user_tools (DB): per-store custom tools — additive, never filtered from built-ins\n * - getToolsForAgent(): consistent tool set — all registry tools always available\n * - executeTool(): unified dispatch — handler lookup + timeout + audit logging\n *\n * To add a new tool:\n * 1. Add handler in src/server/handlers/\n * 2. Import and register in TOOL_HANDLERS below\n * 3. Add row to ai_tool_registry table (defines schema for all clients)\n * That's it — MCP, WhaleChat, workflows, CLI all pick it up automatically.\n */\n\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { sanitizeError } from \"../shared/agent-core.js\";\nimport { validateToolArgs } from \"./validation.js\";\nimport { sanitizeToolDescription } from \"./lib/prompt-sanitizer.js\";\nimport { validateUrl } from \"./lib/ssrf-guard.js\";\n\nimport { handleInventory, handleInventoryQuery, handleInventoryAudit } from \"./handlers/inventory.js\";\nimport { handlePurchaseOrders, handleTransfers } from \"./handlers/supply-chain.js\";\nimport { handleProducts, handleCollections } from \"./handlers/catalog.js\";\nimport { handleCustomers, handleOrders } from \"./handlers/crm.js\";\nimport { handleAnalytics } from \"./handlers/analytics.js\";\nimport { handleLocations, handleSuppliers, handleAlerts, handleAuditTrail, handleStore } from \"./handlers/operations.js\";\nimport { handleEmail, handleDocuments } from \"./handlers/comms.js\";\nimport { handleWebSearch, handleTelemetry } from \"./handlers/platform.js\";\nimport { handleBrowser } from \"./handlers/browser.js\";\nimport { handleDiscovery } from \"./handlers/discovery.js\";\nimport { handleVoice } from \"./handlers/voice.js\";\nimport { handleWorkflows } from \"./handlers/workflows.js\";\nimport { handleEmbeddings } from \"./handlers/embeddings.js\";\nimport { handleLLM } from \"./handlers/llm-providers.js\";\nimport { handleImageGen } from \"./handlers/image-gen.js\";\nimport { handleRemoveBg } from \"./handlers/remove-bg.js\";\nimport { handleMedia } from \"./handlers/media.js\";\nimport { handleVideoGen } from \"./handlers/video-gen.js\";\nimport { handleAPIKeys } from \"./handlers/api-keys.js\";\nimport { handleCreations } from \"./handlers/creations.js\";\nimport { handleMetaAds } from \"./handlers/meta-ads.js\";\nimport { handleGoogleAds } from \"./handlers/google-ads.js\";\nimport { handleKali } from \"./handlers/kali.js\";\nimport { handleLocalAgent } from \"./handlers/local-agent.js\";\nimport { handleEnrichment } from \"./handlers/enrichment.js\";\nimport { handleStorefront } from \"./handlers/storefront.js\";\nimport { handleApiDocs } from \"./handlers/api-docs.js\";\nimport { handleClickHouse } from \"./handlers/clickhouse.js\";\nimport { handleLoyalty } from \"./handlers/loyalty.js\";\nimport { handleCoupons } from \"./handlers/coupons.js\";\nimport { handleFulfillment } from \"./handlers/fulfillment.js\";\nimport { handleSegments } from \"./handlers/segments.js\";\nimport { handleCampaigns } from \"./handlers/campaigns.js\";\nimport { handleReviews } from \"./handlers/reviews.js\";\nimport { handleTax } from \"./handlers/tax.js\";\nimport { handleWebhooksMgmt } from \"./handlers/webhooks-mgmt.js\";\nimport { handleAffiliates } from \"./handlers/affiliates.js\";\nimport { handleQRCodes } from \"./handlers/qr-codes.js\";\nimport { handlePhone } from \"./handlers/phone.js\";\nimport { handleSocial } from \"./handlers/social.js\";\nimport { handleWallet } from \"./handlers/wallet.js\";\nimport { handlePipeline } from \"./handlers/pipeline.js\";\nimport { handleInvoices } from \"./handlers/invoices.js\";\nimport { handleWholesale } from \"./handlers/wholesale.js\";\nimport { summarizeResult, withTimeout } from \"./lib/utils.js\";\n\n// ============================================================================\n// TELEMETRY — ClickHouse span buffer (replaces Postgres audit_logs buffer)\n// ============================================================================\n\nimport { queueSpan, flushSpans, auditRowToSpan, classifyErrorType } from \"./lib/clickhouse-buffer.js\";\n\n// Re-export for callers that used flushAuditLogs (e.g. index.ts shutdown)\nexport { flushSpans };\n\n// ============================================================================\n// IN-MEMORY EXECUTION METRICS\n// ============================================================================\n\nconst toolMetrics = new Map<string, { invocations: number; errors: number; totalMs: number; lastMs: number }>();\n\nexport function getToolMetrics(): Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> {\n const result: Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> = {};\n for (const [name, m] of toolMetrics) {\n result[name] = { invocations: m.invocations, errors: m.errors, avgMs: m.invocations > 0 ? Math.round(m.totalMs / m.invocations) : 0, lastMs: m.lastMs };\n }\n return result;\n}\n\nfunction recordToolMetric(toolName: string, durationMs: number, success: boolean): void {\n let m = toolMetrics.get(toolName);\n if (!m) { m = { invocations: 0, errors: 0, totalMs: 0, lastMs: 0 }; toolMetrics.set(toolName, m); }\n m.invocations++;\n m.totalMs += durationMs;\n m.lastMs = durationMs;\n if (!success) m.errors++;\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ToolDef {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport interface UserToolRow {\n id: string;\n name: string;\n display_name: string;\n description: string;\n input_schema: Record<string, unknown>;\n execution_type: \"rpc\" | \"http\" | \"sql\";\n is_read_only: boolean;\n requires_approval: boolean;\n http_config: Record<string, unknown> | null;\n rpc_function: string | null;\n sql_template: string | null;\n allowed_tables: string[] | null;\n max_execution_time_ms: number;\n}\n\nexport interface AgentConfig {\n id: string;\n name: string;\n description: string;\n system_prompt: string;\n model: string;\n max_tokens: number;\n max_tool_calls: number;\n temperature: number;\n enabled_tools: string[];\n can_query: boolean;\n can_send: boolean;\n can_modify: boolean;\n tone: string;\n verbosity: string;\n api_key: string | null;\n store_id: string | null;\n context_config: {\n includeLocations?: boolean;\n locationIds?: string[];\n includeCustomers?: boolean;\n customerSegments?: string[];\n max_history_chars?: number;\n max_tool_result_chars?: number;\n max_message_chars?: number;\n // Context management overrides — match Anthropic API defaults when unset\n compaction_trigger_tokens?: number;\n compaction_total_budget?: number;\n clear_thinking_keep?: number;\n clear_tool_uses_trigger?: number;\n clear_tool_uses_keep?: number;\n session_cost_budget_usd?: number;\n // Agent loop behavior — DB is single source of truth, defaults in AGENT_DEFAULTS\n max_concurrent_tools?: number;\n enable_delegation?: boolean;\n max_duration_ms?: number;\n enable_model_routing?: boolean;\n subagent_max_tokens?: number;\n subagent_max_turns?: number;\n subagent_temperature?: number;\n } | null;\n}\n\n// ============================================================================\n// TOOL REGISTRY (loaded from database — same as CLI and edge function)\n// ============================================================================\n\nexport interface ToolLoadResult {\n /** Core tools — always sent to the model (auto_load=true + discover_tools) */\n core: ToolDef[];\n /** Extended tools — only name+description sent; full schema loaded on demand */\n extended: ToolDef[];\n /** All tools combined (backward compat for callers that don't need the split) */\n all: ToolDef[];\n}\n\nlet cachedResult: ToolLoadResult | null = null;\nlet cacheTime = 0;\n\n/** Pre-computed API-ready tool defs (name + truncated description + input_schema).\n * Computed once at load time, reused every turn without re-serialization. */\nlet cachedApiToolDefs: Map<string, { name: string; description: string; input_schema: Record<string, unknown> }> | null = null;\n\n/** Truncate a description to maxLen characters, ending at a word boundary with ellipsis. */\nfunction truncateDescription(desc: string, maxLen = 150): string {\n if (desc.length <= maxLen) return desc;\n const cut = desc.lastIndexOf(\" \", maxLen - 3);\n return desc.substring(0, cut > 0 ? cut : maxLen - 3) + \"...\";\n}\n\n/**\n * Load tools from ai_tool_registry, split into core (auto_load=true) and extended.\n * The `discover_tools` meta-tool is always injected into core.\n * Descriptions are truncated to 150 chars at load time.\n */\nexport async function loadTools(supabase: SupabaseClient, forceRefresh = false): Promise<ToolLoadResult> {\n if (!forceRefresh && cachedResult && Date.now() - cacheTime < 60_000) return cachedResult;\n\n const { data, error } = await supabase\n .from(\"ai_tool_registry\")\n .select(\"name, description, definition, auto_load\")\n .eq(\"is_active\", true)\n .neq(\"tool_mode\", \"code\");\n\n if (error || !data) {\n return cachedResult || { core: [], extended: [], all: [] };\n }\n\n const allTools: ToolDef[] = data.map((t: any) => ({\n name: t.name,\n description: sanitizeToolDescription(\n truncateDescription(t.description || t.definition?.description || t.name),\n ),\n input_schema: t.definition?.input_schema || { type: \"object\", properties: {} },\n }));\n\n const core: ToolDef[] = [];\n const extended: ToolDef[] = [];\n\n // Check if any row has auto_load set — if the column doesn't exist yet\n // (migration not run), all values will be null/undefined. In that case,\n // treat ALL tools as core to preserve pre-migration behavior.\n const migrationApplied = data.some((t: any) => t.auto_load === true || t.auto_load === false);\n\n if (!migrationApplied) {\n // Pre-migration: all tools are core (original behavior)\n core.push(...allTools);\n } else {\n for (let i = 0; i < data.length; i++) {\n if (data[i].auto_load) {\n core.push(allTools[i]);\n } else {\n extended.push(allTools[i]);\n }\n }\n }\n\n // Always inject discover_tools into core set\n if (!core.some(t => t.name === \"discover_tools\")) {\n core.push(DISCOVER_TOOLS_DEF);\n }\n\n // Pre-compute API-ready tool defs keyed by name — avoids per-turn .map()\n cachedApiToolDefs = new Map();\n for (const t of [...core, ...extended]) {\n cachedApiToolDefs.set(t.name, {\n name: t.name,\n description: t.description,\n input_schema: t.input_schema,\n });\n }\n\n cachedResult = { core, extended, all: allTools };\n cacheTime = Date.now();\n return cachedResult;\n}\n\n/**\n * Get pre-computed API-ready tool definitions. Returns frozen objects keyed by name\n * so the agent loop can look up defs without re-mapping every turn.\n * Falls back to building from a ToolDef[] if cache not yet populated.\n */\nexport function getCachedToolDefs(\n tools: ToolDef[],\n): Array<{ name: string; description: string; input_schema: Record<string, unknown> }> {\n if (cachedApiToolDefs) {\n // Fast path: look up each active tool in the pre-computed map\n const result: Array<{ name: string; description: string; input_schema: Record<string, unknown> }> = [];\n for (const t of tools) {\n const cached = cachedApiToolDefs.get(t.name);\n if (cached) {\n result.push(cached);\n } else {\n // Dynamic tool (e.g. delegate_task, user tools, discovered tools) — build on the fly\n result.push({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n });\n }\n }\n return result;\n }\n // Fallback: cache not populated yet — build from scratch with truncation\n return tools.map((t) => ({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n }));\n}\n\n/** discover_tools meta-tool — lets the model load extended tool schemas on demand */\nconst DISCOVER_TOOLS_DEF: ToolDef = {\n name: \"discover_tools\",\n description: \"Load full schemas for extended tools not in your core set. Call this before using a tool that is listed under 'Extended Tools' in your system prompt. You can load tools by name or by category.\",\n input_schema: {\n type: \"object\",\n properties: {\n names: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific tool names to load (e.g. ['kali', 'browser', 'voice'])\",\n },\n category: {\n type: \"string\",\n description: \"Load all tools in this category (e.g. 'security', 'media', 'operations')\",\n },\n refresh: {\n type: \"boolean\",\n description: \"Force reload tool definitions from DB (bust cache). Use when tools may have been updated mid-conversation.\",\n },\n },\n },\n};\n\n// ============================================================================\n// USER TOOLS (per-store custom tools from user_tools table)\n// ============================================================================\n\nconst userToolCache = new Map<string, { tools: UserToolRow[]; defs: ToolDef[]; time: number; lastAccessed: number }>();\nconst USER_TOOL_CACHE_MAX = 100;\n\nfunction evictUserToolCache(): void {\n if (userToolCache.size <= USER_TOOL_CACHE_MAX) return;\n const entries = [...userToolCache.entries()].sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);\n const excess = userToolCache.size - USER_TOOL_CACHE_MAX;\n for (let i = 0; i < excess; i++) {\n userToolCache.delete(entries[i][0]);\n }\n}\n\nexport async function loadUserTools(supabase: SupabaseClient, storeId: string): Promise<{ rows: UserToolRow[]; defs: ToolDef[] }> {\n const cached = userToolCache.get(storeId);\n if (cached && Date.now() - cached.time < 60_000) {\n cached.lastAccessed = Date.now();\n return { rows: cached.tools, defs: cached.defs };\n }\n\n const { data, error } = await supabase\n .from(\"user_tools\")\n .select(\"id, name, display_name, description, input_schema, execution_type, is_read_only, requires_approval, http_config, rpc_function, sql_template, allowed_tables, max_execution_time_ms\")\n .eq(\"store_id\", storeId)\n .eq(\"is_active\", true);\n\n if (error || !data?.length) return { rows: [], defs: [] };\n\n const rows: UserToolRow[] = data as UserToolRow[];\n const defs: ToolDef[] = rows.map((t) => ({\n name: `user_tool__${t.name}`,\n description: sanitizeToolDescription(\n `[Custom Tool] ${t.display_name}: ${t.description}${t.requires_approval ? \" (requires approval)\" : \"\"}`,\n ),\n input_schema: t.input_schema || { type: \"object\", properties: {} },\n }));\n\n userToolCache.set(storeId, { tools: rows, defs, time: Date.now(), lastAccessed: Date.now() });\n evictUserToolCache();\n return { rows, defs };\n}\n\nexport function getUserToolByPrefixedName(rows: UserToolRow[], prefixedName: string): UserToolRow | undefined {\n const toolName = prefixedName.replace(/^user_tool__/, \"\");\n return rows.find((t) => t.name === toolName);\n}\n\nexport function getToolsForAgent(agent: AgentConfig, coreTools: ToolDef[], userToolDefs: ToolDef[] = []): ToolDef[] {\n // Core registry tools are always available (matches MCP server behavior).\n // enabled_tools only restricts custom user tools.\n if (agent.enabled_tools?.length > 0) {\n const filteredUserTools = userToolDefs.filter((t) => agent.enabled_tools.includes(t.name));\n return [...coreTools, ...filteredUserTools];\n }\n return [...coreTools, ...userToolDefs];\n}\n\n// ============================================================================\n// UNIFIED HANDLER REGISTRY — single source of truth for all tool dispatch\n// ============================================================================\n\nexport type ToolProgressCallback = (toolName: string, progress: unknown) => void;\n\ntype ToolHandler = (\n sb: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n onToolProgress?: (progress: unknown) => void,\n) => Promise<{ success: boolean; data?: unknown; error?: string }>;\n\ninterface ToolHandlerEntry {\n handler: ToolHandler;\n timeout: number; // ms — execution timeout\n requiresStore: boolean; // whether store_id is mandatory\n supportsProgress?: boolean; // handler accepts onToolProgress (4th param)\n}\n\nconst DEFAULT_TIMEOUT = 30_000;\n\n/**\n * Every built-in tool MUST be registered here. This map is the single source\n * of truth for handler routing, timeouts, and store requirements.\n * Adding a tool to ai_tool_registry without an entry here → \"Unknown tool\" error.\n */\nexport const TOOL_HANDLERS: Record<string, ToolHandlerEntry> = {\n // --- Business Data ---\n inventory: { handler: (sb, args, sid) => {\n const a = args.action as string || \"\";\n if (a.startsWith(\"audit_\")) return handleInventoryAudit(sb, { ...args, action: a.slice(6) }, sid);\n if ([\"summary\",\"velocity\",\"by_location\",\"in_stock\",\"out_of_stock\",\"by_category\"].includes(a)) return handleInventoryQuery(sb, args, sid);\n return handleInventory(sb, args, sid);\n }, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n purchase_orders: { handler: handlePurchaseOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n transfers: { handler: handleTransfers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n products: { handler: handleProducts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n collections: { handler: handleCollections, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n customers: { handler: handleCustomers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n orders: { handler: handleOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n analytics: { handler: handleAnalytics, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n locations: { handler: handleLocations, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n suppliers: { handler: handleSuppliers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n store: { handler: handleStore, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n storefront: { handler: handleStorefront, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Communication ---\n email: { handler: handleEmail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n documents: { handler: handleDocuments, timeout: 120_000, requiresStore: true },\n\n // --- Operations ---\n alerts: { handler: handleAlerts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n audit_trail: { handler: handleAuditTrail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n workflows: { handler: handleWorkflows, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- AI & Generation ---\n voice: { handler: handleVoice, timeout: 120_000, requiresStore: true },\n image_gen: { handler: handleImageGen, timeout: 60_000, requiresStore: true },\n remove_bg: { handler: handleRemoveBg, timeout: 60_000, requiresStore: true },\n media: { handler: handleMedia, timeout: 60_000, requiresStore: true },\n video_gen: { handler: handleVideoGen, timeout: 600_000, requiresStore: true },\n llm: { handler: handleLLM, timeout: 120_000, requiresStore: true },\n embeddings: { handler: handleEmbeddings, timeout: 60_000, requiresStore: true },\n creations: { handler: handleCreations, timeout: 60_000, requiresStore: true },\n\n // --- Platform & Infrastructure (no store required) ---\n web_search: { handler: handleWebSearch, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n telemetry: { handler: handleTelemetry, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n browser: { handler: handleBrowser, timeout: 120_000, requiresStore: true },\n discovery: { handler: handleDiscovery, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n api_keys: { handler: handleAPIKeys, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n api_docs: { handler: handleApiDocs, timeout: 15_000, requiresStore: false },\n\n // --- Advertising ---\n meta_ads: { handler: handleMetaAds, timeout: 300_000, requiresStore: true },\n google_ads: { handler: handleGoogleAds, timeout: 300_000, requiresStore: true },\n\n // --- Security & Local ---\n kali: { handler: handleKali as ToolHandler, timeout: 600_000, requiresStore: true, supportsProgress: true },\n local_agent: { handler: handleLocalAgent, timeout: 600_000, requiresStore: false },\n\n // --- Customer Enrichment ---\n enrichment: { handler: handleEnrichment, timeout: 60_000, requiresStore: true },\n\n // --- Observability (ClickHouse) ---\n clickhouse: { handler: handleClickHouse, timeout: 60_000, requiresStore: false },\n\n // --- Loyalty & Promotions ---\n loyalty: { handler: handleLoyalty, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n coupons: { handler: handleCoupons, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Fulfillment ---\n fulfillment: { handler: handleFulfillment, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- CRM & Marketing ---\n segments: { handler: handleSegments, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n campaigns: { handler: handleCampaigns, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n reviews: { handler: handleReviews, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Finance & Tax ---\n tax: { handler: handleTax, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n invoices: { handler: handleInvoices, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Webhooks ---\n webhooks_mgmt: { handler: handleWebhooksMgmt, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Affiliates ---\n affiliates: { handler: handleAffiliates, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- QR Codes ---\n qr_codes: { handler: handleQRCodes, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Phone (RingCentral) ---\n phone: { handler: handlePhone, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Social / Multi-platform Ads ---\n social: { handler: handleSocial, timeout: 300_000, requiresStore: true },\n\n // --- Wallet ---\n wallet: { handler: handleWallet, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Sales Pipeline ---\n pipeline: { handler: handlePipeline, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Wholesale ---\n wholesale: { handler: handleWholesale, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Meta: Tool Discovery (lazy loading) ---\n discover_tools: { handler: handleDiscoverTools, timeout: 5000, requiresStore: false },\n};\n\nObject.freeze(TOOL_HANDLERS);\n\n/** Get all registered built-in tool names */\nexport function getRegisteredToolNames(): string[] {\n return Object.keys(TOOL_HANDLERS);\n}\n\n// ============================================================================\n// DISCOVER_TOOLS HANDLER — returns full schemas for extended tools on demand\n// ============================================================================\n\n/** Full extended tool defs (with schemas) — used by handleDiscoverTools to return schemas on demand */\nlet _extendedToolsCache: ToolDef[] = [];\n\n/** Lightweight extended tool index — name + first-sentence description only (for system prompt) */\nlet _extendedToolsIndex: Array<{ name: string; description: string }> = [];\n\n/** Called by index.ts after loadTools() to populate the discover_tools cache.\n * Stores full schemas for on-demand loading, plus a lightweight index for the system prompt. */\nexport function setExtendedToolsCache(tools: ToolDef[]): void {\n _extendedToolsCache = tools;\n // Pre-compute lightweight index: name + first sentence only (no schemas)\n _extendedToolsIndex = tools.map(t => ({\n name: t.name,\n description: t.description.split(\".\")[0],\n }));\n}\n\n/** Get full extended tools with schemas (for discover_tools handler) */\nexport function getExtendedToolsCache(): ToolDef[] {\n return _extendedToolsCache;\n}\n\n/** Get lightweight extended tools index — name + short description only (for system prompt).\n * Avoids serializing full schemas into the prompt. */\nexport function getExtendedToolsIndex(): Array<{ name: string; description: string }> {\n return _extendedToolsIndex;\n}\n\n/**\n * Get full tool schemas for specific tool names from the extended tools cache.\n * Used by the agent loop to inject discovered tool schemas into the active tool set.\n * Returns only tools that exist in the cache; unknown names are silently skipped.\n */\nexport function getFullToolSchemas(toolNames: string[]): ToolDef[] {\n if (!toolNames.length || !_extendedToolsCache.length) return [];\n const nameSet = new Set(toolNames);\n return _extendedToolsCache.filter(t => nameSet.has(t.name));\n}\n\n// Tool category heuristics — maps tool names to categories for category-based discovery\nconst TOOL_CATEGORIES: Record<string, string> = {\n // Business Data\n inventory: \"business\", purchase_orders: \"business\", transfers: \"business\",\n products: \"business\", collections: \"business\", customers: \"business\",\n orders: \"business\", analytics: \"business\", locations: \"business\",\n suppliers: \"business\", store: \"business\", storefront: \"business\",\n // Communication\n email: \"communication\", documents: \"communication\",\n // Operations\n alerts: \"operations\", audit_trail: \"operations\", workflows: \"operations\",\n telemetry: \"operations\",\n // Media & AI\n voice: \"media\", image_gen: \"media\", video_gen: \"media\", remove_bg: \"media\", media: \"media\",\n llm: \"ai\", embeddings: \"ai\", creations: \"media\",\n // Platform\n web_search: \"platform\", browser: \"platform\", discovery: \"platform\",\n api_keys: \"platform\", api_docs: \"platform\",\n // Security\n kali: \"security\", local_agent: \"platform\",\n // Advertising\n meta_ads: \"advertising\",\n // Data\n enrichment: \"data\",\n};\n\nasync function handleDiscoverTools(\n sb: SupabaseClient,\n args: Record<string, unknown>,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const names = args.names as string[] | undefined;\n const category = args.category as string | undefined;\n const refresh = args.refresh as boolean | undefined;\n\n // Force reload from DB if refresh requested — busts the 60s cache\n if (refresh) {\n try {\n const freshResult = await loadTools(sb, true);\n setExtendedToolsCache(freshResult.extended);\n } catch {\n // If refresh fails, continue with stale cache — better than erroring\n }\n }\n\n if (!names?.length && !category) {\n return { success: false, error: \"Provide 'names' (array of tool names) or 'category' to discover tools.\" };\n }\n\n let matching: ToolDef[] = [];\n\n if (names?.length) {\n const nameSet = new Set(names);\n matching = _extendedToolsCache.filter(t => nameSet.has(t.name));\n }\n\n if (category) {\n const cat = category.toLowerCase();\n const categoryTools = _extendedToolsCache.filter(t => TOOL_CATEGORIES[t.name] === cat);\n // Merge without duplicates\n const existingNames = new Set(matching.map(t => t.name));\n for (const t of categoryTools) {\n if (!existingNames.has(t.name)) matching.push(t);\n }\n }\n\n if (matching.length === 0) {\n const available = _extendedToolsCache.map(t => t.name).join(\", \");\n return { success: false, error: `No matching extended tools found. Available: ${available}` };\n }\n\n return {\n success: true,\n data: {\n tools: matching.map(t => ({ name: t.name, description: t.description, input_schema: t.input_schema })),\n count: matching.length,\n refreshed: !!refresh,\n },\n };\n}\n\n// ============================================================================\n// USER TOOL EXECUTOR — handles RPC, HTTP, SQL execution types\n// ============================================================================\n\nasync function executeUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n agentId?: string,\n conversationId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const timeout = userTool.max_execution_time_ms || 5000;\n\n if (userTool.execution_type === \"http\") {\n return executeHTTPUserTool(supabase, userTool, args, storeId, timeout);\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_user_tool\", {\n p_tool_id: userTool.id,\n p_store_id: storeId,\n p_args: args,\n p_agent_id: agentId || null,\n p_conversation_id: conversationId || null,\n });\n\n if (error) return { success: false, error: error.message };\n\n const result = data as { success: boolean; data?: unknown; error?: string; pending_approval?: boolean; execution_id?: string; message?: string };\n\n if (result.pending_approval) {\n return { success: false, error: `Tool requires approval. Execution ID: ${result.execution_id}. ${result.message}` };\n }\n\n if (result.success && result.data && (result.data as any).execute_sql) {\n return executeSQLUserTool(supabase, result.data as any, args, storeId);\n }\n\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error || \"Unknown error\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeHTTPUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n timeout: number,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const config = userTool.http_config;\n if (!config || !(config as any).url) {\n return { success: false, error: \"HTTP tool has no URL configured\" };\n }\n\n const httpCfg = config as { url: string; method?: string; headers?: Record<string, string>; body_template?: Record<string, unknown> };\n\n let url = httpCfg.url;\n let headers: Record<string, string> = { ...(httpCfg.headers || {}) };\n\n // Collect secret names referenced in the URL, headers, and body template\n const configStr = JSON.stringify({ url: httpCfg.url, headers: httpCfg.headers, body: httpCfg.body_template });\n const secretRefs = [...configStr.matchAll(/\\{\\{secret:(\\w+)\\}\\}/g)].map(m => m[1]);\n\n // Decrypt each referenced secret via RPC (consistent with all other handlers)\n const secretMap = new Map<string, string>();\n await Promise.all(\n [...new Set(secretRefs)].map(async (name) => {\n try {\n const { data } = await supabase.rpc(\"decrypt_secret\", { p_name: name, p_store_id: storeId });\n if (data) secretMap.set(name, data as string);\n } catch { /* secret not found — will remain as {{secret:NAME}} placeholder */ }\n }),\n );\n\n const resolveSecrets = (text: string): string => {\n return text.replace(/\\{\\{secret:(\\w+)\\}\\}/g, (_, name) => secretMap.get(name) || `{{secret:${name}}}`);\n };\n\n const resolveArgs = (text: string): string => {\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n if (name === \"secret\") return `{{${name}}}`;\n const val = args[name];\n return val !== undefined ? String(val) : `{{${name}}}`;\n });\n };\n\n const resolve = (text: string): string => resolveSecrets(resolveArgs(text));\n\n url = resolve(url);\n for (const [key, val] of Object.entries(headers)) {\n headers[key] = resolve(val);\n }\n\n let body: string | undefined;\n const method = (httpCfg.method || \"GET\").toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") {\n if (httpCfg.body_template) {\n const resolvedBody: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(httpCfg.body_template)) {\n if (typeof val === \"string\") {\n resolvedBody[key] = resolve(val);\n } else {\n resolvedBody[key] = val;\n }\n }\n for (const [key, val] of Object.entries(args)) {\n if (!(key in resolvedBody)) {\n resolvedBody[key] = val;\n }\n }\n body = JSON.stringify(resolvedBody);\n } else {\n body = JSON.stringify(args);\n }\n if (!headers[\"Content-Type\"] && !headers[\"content-type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n // P0 FIX: Use shared SSRF guard with DNS resolve-then-check (replaces inline regex)\n const ssrfError = await validateUrl(url);\n if (ssrfError) {\n return { success: false, error: `Blocked: ${ssrfError}` };\n }\n\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n const resp = await fetch(url, { method, headers, body, signal: controller.signal });\n clearTimeout(timer);\n\n // Clear secrets from memory as soon as the request is sent\n secretMap.clear();\n\n const contentType = resp.headers.get(\"content-type\") || \"\";\n let data: unknown;\n if (contentType.includes(\"json\")) {\n data = await resp.json();\n } else {\n data = await resp.text();\n }\n\n if (!resp.ok) {\n return { success: false, error: `HTTP ${resp.status}: ${typeof data === \"string\" ? data.substring(0, 500) : JSON.stringify(data).substring(0, 500)}` };\n }\n\n return { success: true, data };\n } catch (err: any) {\n // Clear secrets from memory even on error\n secretMap.clear();\n if (err.name === \"AbortError\") {\n return { success: false, error: `HTTP request timed out after ${timeout}ms` };\n }\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeSQLUserTool(\n supabase: SupabaseClient,\n sqlConfig: { template: string; allowed_tables: string[]; is_read_only: boolean },\n args: Record<string, unknown>,\n storeId: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n if (!sqlConfig.is_read_only) {\n return { success: false, error: \"Write SQL tools are not supported in server execution\" };\n }\n\n if (!sqlConfig.template) {\n return { success: false, error: \"No SQL template configured\" };\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_safe_sql\", {\n p_sql: sqlConfig.template,\n p_params: args,\n p_store_id: storeId,\n p_allowed_tables: sqlConfig.allowed_tables || [],\n });\n\n if (error) return { success: false, error: error.message };\n\n if (data?.success) {\n return { success: true, data: data.data };\n }\n return { success: false, error: data?.error || \"SQL execution failed\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\n// ============================================================================\n// SUPPLY CHAIN — action aliasing (LLMs omit po_/transfer_ prefix)\n// ============================================================================\n\nasync function executeSupplyChain(\n supabase: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n let scAction = args.action as string || \"\";\n const PO_ALIASES: Record<string, string> = {\n create: \"po_create\", list: \"po_list\", get: \"po_get\",\n add_items: \"po_add_items\", approve: \"po_approve\", mark_ordered: \"po_mark_ordered\",\n receive: \"po_receive\", cancel: \"po_cancel\",\n };\n if (PO_ALIASES[scAction]) scAction = PO_ALIASES[scAction];\n\n if (scAction === \"find_suppliers\") {\n return executeTool(supabase, \"suppliers\", { ...args, action: \"find_suppliers\" }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"po_\")) {\n return executeTool(supabase, \"purchase_orders\", { ...args, action: scAction.slice(3) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"transfer_\")) {\n return executeTool(supabase, \"transfers\", { ...args, action: scAction.slice(9) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n return { success: false, error: `Unknown supply_chain action: ${scAction}. Use po_create, po_list, po_get, po_approve, po_receive, po_cancel, transfer_create, transfer_list, transfer_approve, transfer_ship, transfer_receive, transfer_cancel, find_suppliers.` };\n}\n\n// ============================================================================\n// TOOL EXECUTOR — dispatches via unified handler registry\n// ============================================================================\n\nexport async function executeTool(\n supabase: SupabaseClient,\n toolName: string,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n onToolProgress?: ToolProgressCallback,\n /** Skip per-tool audit when called within a conversation — persistAgentTurn handles it */\n skipAudit?: boolean,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const startTime = Date.now();\n const action = args.action as string | undefined;\n let result: { success: boolean; data?: unknown; error?: string };\n\n // Handle supply_chain aliases (LLMs often omit po_/transfer_ prefix)\n if (toolName === \"supply_chain\") {\n return executeSupplyChain(supabase, args, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n\n // Look up handler from unified registry\n const entry = TOOL_HANDLERS[toolName];\n\n // Check store requirement from registry (not hardcoded)\n const requiresStore = entry ? entry.requiresStore : true;\n if (requiresStore && (!storeId || !/^[0-9a-fA-F]{8}-/.test(storeId))) {\n return { success: false, error: `store_id is required for ${toolName}. Ensure a store is selected.` };\n }\n\n // Permission enforcement — check agent flags before tool execution\n if (agentId) {\n const { data: agentFlags } = await supabase.from(\"ai_agent_config\")\n .select(\"can_query, can_modify\")\n .eq(\"id\", agentId).single();\n if (agentFlags) {\n // Read-only agent check — block ALL tool calls if can_query is false\n if (!agentFlags.can_query) {\n const readActions = [\"list\", \"get\", \"search\", \"query\", \"summary\", \"stats\", \"count\", \"by_location\", \"in_stock\", \"out_of_stock\", \"velocity\"];\n const action = args.action as string | undefined;\n if (action && readActions.includes(action)) {\n return { success: false, error: `Agent does not have query permission (can_query=false). Contact an admin.` };\n }\n }\n // Mutation check — already in system prompt but enforce at execution level\n if (!agentFlags.can_modify) {\n const writeActions = [\"create\", \"update\", \"delete\", \"upsert\", \"send\", \"approve\", \"cancel\", \"add\", \"remove\", \"set\", \"adjust\", \"transfer\"];\n const action = args.action as string | undefined;\n if (action && writeActions.some(wa => action.startsWith(wa))) {\n return { success: false, error: `Agent has read-only access (can_modify=false). Cannot perform \"${action}\".` };\n }\n }\n }\n }\n\n // User tool approval check — requires_approval enforced at execution level\n if (toolName.startsWith(\"user_tool__\") && userToolRows?.length) {\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool?.requires_approval) {\n return { success: false, error: `Tool \"${userTool.display_name}\" requires approval before execution. Use the workflow approval system to request permission.` };\n }\n }\n\n // Validate mutation args before dispatch — read-only actions pass through\n const validation = validateToolArgs(toolName, args);\n if (!validation.valid) {\n return { success: false, error: validation.error };\n }\n args = validation.data;\n\n const execStartMs = Date.now();\n try {\n let toolPromise: Promise<{ success: boolean; data?: unknown; error?: string }>;\n\n if (entry) {\n // Dispatch via unified handler registry — pass progress callback to handlers that support it\n const progressCb = entry.supportsProgress && onToolProgress\n ? (progress: unknown) => onToolProgress(toolName, progress)\n : undefined;\n toolPromise = entry.handler(supabase, args, storeId, progressCb);\n } else if (toolName.startsWith(\"user_tool__\") && userToolRows && storeId) {\n // Custom user tools\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool) {\n toolPromise = executeUserTool(supabase, userTool, args, storeId, agentId, conversationId);\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown user tool: ${toolName}` });\n }\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown tool: ${toolName}. Use the discover_tools action to see available tools.` });\n }\n\n const timeoutMs = entry?.timeout || DEFAULT_TIMEOUT;\n\n // FIX 7: Timeout cascade validation — warn if step timeout < tool timeout\n const stepTimeout = args._step_timeout_seconds as number | undefined;\n if (stepTimeout && stepTimeout * 1000 < timeoutMs) {\n console.warn(`[timeout-cascade] Step timeout (${stepTimeout}s) < tool timeout (${timeoutMs / 1000}s) for ${toolName}. Tool may outlive step.`);\n }\n\n result = await withTimeout(toolPromise, timeoutMs, toolName);\n } catch (err) {\n result = { success: false, error: sanitizeError(err) };\n }\n\n // Record execution metrics\n recordToolMetric(toolName, Date.now() - execStartMs, result.success);\n\n // Audit log — enriched with OTEL fields for distributed tracing\n // Skipped when tool is called within a conversation (SSE chat, channel agent, workflow)\n // because persistAgentTurn already logs the full conversation with tool details\n if (skipAudit) return result;\n try {\n const endTime = Date.now();\n // Compute payload sizes for observability\n const inputJson = JSON.stringify(args);\n const outputJson = result.data ? JSON.stringify(result.data) : \"\";\n const inputBytes = inputJson.length;\n const outputBytes = outputJson.length;\n\n const details: Record<string, unknown> = {\n source: source || \"fly_container\",\n args,\n // Keys that SwiftUI telemetry panel reads for rich display\n tool_input: args,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n };\n if (result.success && result.data) {\n details.result_summary = summarizeResult(toolName, action, result.data);\n // Store full result for rich telemetry display (capped at 50KB to prevent JSONB bloat)\n if (outputBytes <= 50_000) {\n details.tool_result = result.data;\n } else {\n details.tool_result = {\n _truncated: true,\n _type: Array.isArray(result.data) ? \"array\" : \"object\",\n _size: outputBytes,\n _count: Array.isArray(result.data) ? result.data.length : Object.keys(result.data as object).length,\n };\n }\n }\n if (result.error) {\n details.tool_error = result.error;\n const errorType = classifyErrorType(result.error);\n if (errorType) details.error_type = errorType;\n }\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n const spanId = Array.from(bytes).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n const auditRow: Record<string, unknown> = {\n action: `tool.${toolName}${action ? `.${action}` : \"\"}`,\n severity: result.success ? \"info\" : \"error\",\n store_id: storeId || null,\n resource_type: \"mcp_tool\",\n resource_id: toolName,\n request_id: traceId || null,\n conversation_id: conversationId || null,\n source: source || \"fly_container\",\n details,\n error_message: result.error || null,\n error_type: classifyErrorType(result.error) || undefined,\n duration_ms: endTime - startTime,\n user_id: userId || null,\n user_email: userEmail || null,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n // OTEL fields\n trace_id: traceId || null,\n span_id: spanId,\n span_kind: \"INTERNAL\",\n service_name: \"agent-server\",\n status_code: result.success ? \"OK\" : \"ERROR\",\n start_time: new Date(startTime).toISOString(),\n end_time: new Date(endTime).toISOString(),\n };\n queueSpan(auditRowToSpan(auditRow));\n } catch (err) {\n console.error(\"[audit] exception:\", err);\n }\n\n return result;\n}\n\n// ============================================================================\n// AGENT LOADER\n// ============================================================================\n\nexport async function loadAgentConfig(supabase: SupabaseClient, agentId: string, storeId?: string): Promise<AgentConfig | null> {\n // storeId is required for tenant isolation — only omit for internal/migration callers\n let query = supabase\n .from(\"ai_agent_config\")\n .select(\"*\")\n .eq(\"id\", agentId);\n\n // Filter by store_id for tenant isolation, but also allow platform agents (store_id IS NULL)\n if (storeId) {\n query = query.or(`store_id.eq.${storeId},store_id.is.null`);\n }\n\n const { data, error } = await query.single();\n\n if (error || !data) return null;\n return data as AgentConfig;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"tool-router.js","names":["sanitizeError","validateToolArgs","sanitizeToolDescription","validateUrl","handleInventory","handleInventoryQuery","handleInventoryAudit","handlePurchaseOrders","handleTransfers","handleProducts","handleCollections","handleCustomers","handleOrders","handleAnalytics","handleLocations","handleSuppliers","handleAlerts","handleAuditTrail","handleStore","handleEmail","handleDocuments","handleWebSearch","handleTelemetry","handleBrowser","handleDiscovery","handleVoice","handleWorkflows","handleEmbeddings","handleLLM","handleImageGen","handleRemoveBg","handleMedia","handleVideoGen","handleAPIKeys","handleCreations","handleMetaAds","handleGoogleAds","handleKali","handleLocalAgent","handleEnrichment","handleStorefront","handleApiDocs","handleClickHouse","handleLoyalty","handleCoupons","handleFulfillment","handleSegments","handleCampaigns","handleReviews","handleTax","handleWebhooksMgmt","handleAffiliates","handleQRCodes","handlePhone","handleSocial","handleWallet","handlePipeline","handleInvoices","handleWholesale","summarizeResult","withTimeout","queueSpan","flushSpans","auditRowToSpan","classifyErrorType","toolMetrics","Map","getToolMetrics","result","name","m","invocations","errors","avgMs","Math","round","totalMs","lastMs","recordToolMetric","toolName","durationMs","success","get","set","cachedResult","cacheTime","cachedApiToolDefs","truncateDescription","desc","maxLen","length","cut","lastIndexOf","substring","loadTools","supabase","forceRefresh","Date","now","data","error","from","select","eq","neq","core","extended","all","allTools","map","t","description","definition","input_schema","type","properties","migrationApplied","some","auto_load","push","i","DISCOVER_TOOLS_DEF","getCachedToolDefs","tools","cached","names","items","category","refresh","userToolCache","USER_TOOL_CACHE_MAX","evictUserToolCache","size","entries","sort","a","b","lastAccessed","excess","delete","loadUserTools","storeId","time","rows","defs","display_name","requires_approval","getUserToolByPrefixedName","prefixedName","replace","find","getToolsForAgent","agent","coreTools","userToolDefs","enabled_tools","filteredUserTools","filter","includes","DEFAULT_TIMEOUT","TOOL_HANDLERS","inventory","handler","sb","args","sid","action","startsWith","slice","timeout","requiresStore","purchase_orders","transfers","products","collections","customers","orders","analytics","locations","suppliers","store","storefront","email","documents","alerts","audit_trail","workflows","voice","image_gen","remove_bg","media","video_gen","llm","embeddings","creations","web_search","telemetry","browser","discovery","api_keys","api_docs","meta_ads","google_ads","kali","supportsProgress","local_agent","enrichment","clickhouse","loyalty","coupons","fulfillment","segments","campaigns","reviews","tax","invoices","webhooks_mgmt","affiliates","qr_codes","phone","social","wallet","pipeline","wholesale","discover_tools","handleDiscoverTools","Object","freeze","getRegisteredToolNames","keys","_extendedToolsCache","_extendedToolsIndex","setExtendedToolsCache","split","getExtendedToolsCache","getExtendedToolsIndex","getFullToolSchemas","toolNames","nameSet","Set","has","TOOL_CATEGORIES","freshResult","matching","cat","toLowerCase","categoryTools","existingNames","available","join","count","refreshed","executeUserTool","userTool","agentId","conversationId","max_execution_time_ms","execution_type","executeHTTPUserTool","rpc","p_tool_id","id","p_store_id","p_args","p_agent_id","p_conversation_id","message","pending_approval","execution_id","execute_sql","executeSQLUserTool","err","config","http_config","url","httpCfg","headers","configStr","JSON","stringify","body","body_template","secretRefs","matchAll","secretMap","Promise","p_name","resolveSecrets","text","_","resolveArgs","val","undefined","String","resolve","key","method","toUpperCase","resolvedBody","ssrfError","controller","AbortController","timer","setTimeout","abort","resp","fetch","signal","clearTimeout","clear","contentType","json","ok","status","sqlConfig","is_read_only","template","p_sql","p_params","p_allowed_tables","allowed_tables","executeSupplyChain","traceId","userId","userEmail","source","userToolRows","scAction","PO_ALIASES","create","list","add_items","update_items","approve","mark_ordered","receive","cancel","executeTool","onToolProgress","skipAudit","startTime","entry","test","agentFlags","single","can_query","readActions","can_modify","writeActions","wa","validation","valid","execStartMs","toolPromise","progressCb","progress","timeoutMs","stepTimeout","_step_timeout_seconds","console","warn","endTime","inputJson","outputJson","inputBytes","outputBytes","details","tool_input","input_bytes","output_bytes","result_summary","tool_result","_truncated","_type","Array","isArray","_size","_count","tool_error","errorType","error_type","bytes","Uint8Array","crypto","getRandomValues","spanId","toString","padStart","auditRow","severity","store_id","resource_type","resource_id","request_id","conversation_id","error_message","duration_ms","user_id","user_email","trace_id","span_id","span_kind","service_name","status_code","start_time","toISOString","end_time","loadAgentConfig","query","or"],"sources":["../../src/server/tool-router.ts"],"sourcesContent":["/**\n * Tool Router — unified tool registry, dispatch, and execution.\n *\n * SINGLE SOURCE OF TRUTH for all AI systems (MCP server, HTTP agent, workflows, CLI).\n *\n * Architecture:\n * - ai_tool_registry (DB): tool definitions (name, description, schema) — queried by ALL clients\n * - TOOL_HANDLERS (code): name → handler function mapping — the only place handler routing lives\n * - user_tools (DB): per-store custom tools — additive, never filtered from built-ins\n * - getToolsForAgent(): consistent tool set — all registry tools always available\n * - executeTool(): unified dispatch — handler lookup + timeout + audit logging\n *\n * To add a new tool:\n * 1. Add handler in src/server/handlers/\n * 2. Import and register in TOOL_HANDLERS below\n * 3. Add row to ai_tool_registry table (defines schema for all clients)\n * That's it — MCP, WhaleChat, workflows, CLI all pick it up automatically.\n */\n\nimport type { SupabaseClient } from \"@supabase/supabase-js\";\nimport { sanitizeError } from \"../shared/agent-core.js\";\nimport { validateToolArgs } from \"./validation.js\";\nimport { sanitizeToolDescription } from \"./lib/prompt-sanitizer.js\";\nimport { validateUrl } from \"./lib/ssrf-guard.js\";\n\nimport { handleInventory, handleInventoryQuery, handleInventoryAudit } from \"./handlers/inventory.js\";\nimport { handlePurchaseOrders, handleTransfers } from \"./handlers/supply-chain.js\";\nimport { handleProducts, handleCollections } from \"./handlers/catalog.js\";\nimport { handleCustomers, handleOrders } from \"./handlers/crm.js\";\nimport { handleAnalytics } from \"./handlers/analytics.js\";\nimport { handleLocations, handleSuppliers, handleAlerts, handleAuditTrail, handleStore } from \"./handlers/operations.js\";\nimport { handleEmail, handleDocuments } from \"./handlers/comms.js\";\nimport { handleWebSearch, handleTelemetry } from \"./handlers/platform.js\";\nimport { handleBrowser } from \"./handlers/browser.js\";\nimport { handleDiscovery } from \"./handlers/discovery.js\";\nimport { handleVoice } from \"./handlers/voice.js\";\nimport { handleWorkflows } from \"./handlers/workflows.js\";\nimport { handleEmbeddings } from \"./handlers/embeddings.js\";\nimport { handleLLM } from \"./handlers/llm-providers.js\";\nimport { handleImageGen } from \"./handlers/image-gen.js\";\nimport { handleRemoveBg } from \"./handlers/remove-bg.js\";\nimport { handleMedia } from \"./handlers/media.js\";\nimport { handleVideoGen } from \"./handlers/video-gen.js\";\nimport { handleAPIKeys } from \"./handlers/api-keys.js\";\nimport { handleCreations } from \"./handlers/creations.js\";\nimport { handleMetaAds } from \"./handlers/meta-ads.js\";\nimport { handleGoogleAds } from \"./handlers/google-ads.js\";\nimport { handleKali } from \"./handlers/kali.js\";\nimport { handleLocalAgent } from \"./handlers/local-agent.js\";\nimport { handleEnrichment } from \"./handlers/enrichment.js\";\nimport { handleStorefront } from \"./handlers/storefront.js\";\nimport { handleApiDocs } from \"./handlers/api-docs.js\";\nimport { handleClickHouse } from \"./handlers/clickhouse.js\";\nimport { handleLoyalty } from \"./handlers/loyalty.js\";\nimport { handleCoupons } from \"./handlers/coupons.js\";\nimport { handleFulfillment } from \"./handlers/fulfillment.js\";\nimport { handleSegments } from \"./handlers/segments.js\";\nimport { handleCampaigns } from \"./handlers/campaigns.js\";\nimport { handleReviews } from \"./handlers/reviews.js\";\nimport { handleTax } from \"./handlers/tax.js\";\nimport { handleWebhooksMgmt } from \"./handlers/webhooks-mgmt.js\";\nimport { handleAffiliates } from \"./handlers/affiliates.js\";\nimport { handleQRCodes } from \"./handlers/qr-codes.js\";\nimport { handlePhone } from \"./handlers/phone.js\";\nimport { handleSocial } from \"./handlers/social.js\";\nimport { handleWallet } from \"./handlers/wallet.js\";\nimport { handlePipeline } from \"./handlers/pipeline.js\";\nimport { handleInvoices } from \"./handlers/invoices.js\";\nimport { handleWholesale } from \"./handlers/wholesale.js\";\nimport { summarizeResult, withTimeout } from \"./lib/utils.js\";\n\n// ============================================================================\n// TELEMETRY — ClickHouse span buffer (replaces Postgres audit_logs buffer)\n// ============================================================================\n\nimport { queueSpan, flushSpans, auditRowToSpan, classifyErrorType } from \"./lib/clickhouse-buffer.js\";\n\n// Re-export for callers that used flushAuditLogs (e.g. index.ts shutdown)\nexport { flushSpans };\n\n// ============================================================================\n// IN-MEMORY EXECUTION METRICS\n// ============================================================================\n\nconst toolMetrics = new Map<string, { invocations: number; errors: number; totalMs: number; lastMs: number }>();\n\nexport function getToolMetrics(): Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> {\n const result: Record<string, { invocations: number; errors: number; avgMs: number; lastMs: number }> = {};\n for (const [name, m] of toolMetrics) {\n result[name] = { invocations: m.invocations, errors: m.errors, avgMs: m.invocations > 0 ? Math.round(m.totalMs / m.invocations) : 0, lastMs: m.lastMs };\n }\n return result;\n}\n\nfunction recordToolMetric(toolName: string, durationMs: number, success: boolean): void {\n let m = toolMetrics.get(toolName);\n if (!m) { m = { invocations: 0, errors: 0, totalMs: 0, lastMs: 0 }; toolMetrics.set(toolName, m); }\n m.invocations++;\n m.totalMs += durationMs;\n m.lastMs = durationMs;\n if (!success) m.errors++;\n}\n\n// ============================================================================\n// TYPES\n// ============================================================================\n\nexport interface ToolDef {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\nexport interface UserToolRow {\n id: string;\n name: string;\n display_name: string;\n description: string;\n input_schema: Record<string, unknown>;\n execution_type: \"rpc\" | \"http\" | \"sql\";\n is_read_only: boolean;\n requires_approval: boolean;\n http_config: Record<string, unknown> | null;\n rpc_function: string | null;\n sql_template: string | null;\n allowed_tables: string[] | null;\n max_execution_time_ms: number;\n}\n\nexport interface AgentConfig {\n id: string;\n name: string;\n description: string;\n system_prompt: string;\n model: string;\n max_tokens: number;\n max_tool_calls: number;\n temperature: number;\n enabled_tools: string[];\n can_query: boolean;\n can_send: boolean;\n can_modify: boolean;\n tone: string;\n verbosity: string;\n api_key: string | null;\n store_id: string | null;\n context_config: {\n includeLocations?: boolean;\n locationIds?: string[];\n includeCustomers?: boolean;\n customerSegments?: string[];\n max_history_chars?: number;\n max_tool_result_chars?: number;\n max_message_chars?: number;\n // Context management overrides — match Anthropic API defaults when unset\n compaction_trigger_tokens?: number;\n compaction_total_budget?: number;\n clear_thinking_keep?: number;\n clear_tool_uses_trigger?: number;\n clear_tool_uses_keep?: number;\n session_cost_budget_usd?: number;\n // Agent loop behavior — DB is single source of truth, defaults in AGENT_DEFAULTS\n max_concurrent_tools?: number;\n enable_delegation?: boolean;\n max_duration_ms?: number;\n enable_model_routing?: boolean;\n subagent_max_tokens?: number;\n subagent_max_turns?: number;\n subagent_temperature?: number;\n } | null;\n}\n\n// ============================================================================\n// TOOL REGISTRY (loaded from database — same as CLI and edge function)\n// ============================================================================\n\nexport interface ToolLoadResult {\n /** Core tools — always sent to the model (auto_load=true + discover_tools) */\n core: ToolDef[];\n /** Extended tools — only name+description sent; full schema loaded on demand */\n extended: ToolDef[];\n /** All tools combined (backward compat for callers that don't need the split) */\n all: ToolDef[];\n}\n\nlet cachedResult: ToolLoadResult | null = null;\nlet cacheTime = 0;\n\n/** Pre-computed API-ready tool defs (name + truncated description + input_schema).\n * Computed once at load time, reused every turn without re-serialization. */\nlet cachedApiToolDefs: Map<string, { name: string; description: string; input_schema: Record<string, unknown> }> | null = null;\n\n/** Truncate a description to maxLen characters, ending at a word boundary with ellipsis. */\nfunction truncateDescription(desc: string, maxLen = 150): string {\n if (desc.length <= maxLen) return desc;\n const cut = desc.lastIndexOf(\" \", maxLen - 3);\n return desc.substring(0, cut > 0 ? cut : maxLen - 3) + \"...\";\n}\n\n/**\n * Load tools from ai_tool_registry, split into core (auto_load=true) and extended.\n * The `discover_tools` meta-tool is always injected into core.\n * Descriptions are truncated to 150 chars at load time.\n */\nexport async function loadTools(supabase: SupabaseClient, forceRefresh = false): Promise<ToolLoadResult> {\n if (!forceRefresh && cachedResult && Date.now() - cacheTime < 60_000) return cachedResult;\n\n const { data, error } = await supabase\n .from(\"ai_tool_registry\")\n .select(\"name, description, definition, auto_load\")\n .eq(\"is_active\", true)\n .neq(\"tool_mode\", \"code\");\n\n if (error || !data) {\n return cachedResult || { core: [], extended: [], all: [] };\n }\n\n const allTools: ToolDef[] = data.map((t: any) => ({\n name: t.name,\n description: sanitizeToolDescription(\n truncateDescription(t.description || t.definition?.description || t.name),\n ),\n input_schema: t.definition?.input_schema || { type: \"object\", properties: {} },\n }));\n\n const core: ToolDef[] = [];\n const extended: ToolDef[] = [];\n\n // Check if any row has auto_load set — if the column doesn't exist yet\n // (migration not run), all values will be null/undefined. In that case,\n // treat ALL tools as core to preserve pre-migration behavior.\n const migrationApplied = data.some((t: any) => t.auto_load === true || t.auto_load === false);\n\n if (!migrationApplied) {\n // Pre-migration: all tools are core (original behavior)\n core.push(...allTools);\n } else {\n for (let i = 0; i < data.length; i++) {\n if (data[i].auto_load) {\n core.push(allTools[i]);\n } else {\n extended.push(allTools[i]);\n }\n }\n }\n\n // Always inject discover_tools into core set\n if (!core.some(t => t.name === \"discover_tools\")) {\n core.push(DISCOVER_TOOLS_DEF);\n }\n\n // Pre-compute API-ready tool defs keyed by name — avoids per-turn .map()\n cachedApiToolDefs = new Map();\n for (const t of [...core, ...extended]) {\n cachedApiToolDefs.set(t.name, {\n name: t.name,\n description: t.description,\n input_schema: t.input_schema,\n });\n }\n\n cachedResult = { core, extended, all: allTools };\n cacheTime = Date.now();\n return cachedResult;\n}\n\n/**\n * Get pre-computed API-ready tool definitions. Returns frozen objects keyed by name\n * so the agent loop can look up defs without re-mapping every turn.\n * Falls back to building from a ToolDef[] if cache not yet populated.\n */\nexport function getCachedToolDefs(\n tools: ToolDef[],\n): Array<{ name: string; description: string; input_schema: Record<string, unknown> }> {\n if (cachedApiToolDefs) {\n // Fast path: look up each active tool in the pre-computed map\n const result: Array<{ name: string; description: string; input_schema: Record<string, unknown> }> = [];\n for (const t of tools) {\n const cached = cachedApiToolDefs.get(t.name);\n if (cached) {\n result.push(cached);\n } else {\n // Dynamic tool (e.g. delegate_task, user tools, discovered tools) — build on the fly\n result.push({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n });\n }\n }\n return result;\n }\n // Fallback: cache not populated yet — build from scratch with truncation\n return tools.map((t) => ({\n name: t.name,\n description: truncateDescription(t.description),\n input_schema: t.input_schema,\n }));\n}\n\n/** discover_tools meta-tool — lets the model load extended tool schemas on demand */\nconst DISCOVER_TOOLS_DEF: ToolDef = {\n name: \"discover_tools\",\n description: \"Load full schemas for extended tools not in your core set. Call this before using a tool that is listed under 'Extended Tools' in your system prompt. You can load tools by name or by category.\",\n input_schema: {\n type: \"object\",\n properties: {\n names: {\n type: \"array\",\n items: { type: \"string\" },\n description: \"Specific tool names to load (e.g. ['kali', 'browser', 'voice'])\",\n },\n category: {\n type: \"string\",\n description: \"Load all tools in this category (e.g. 'security', 'media', 'operations')\",\n },\n refresh: {\n type: \"boolean\",\n description: \"Force reload tool definitions from DB (bust cache). Use when tools may have been updated mid-conversation.\",\n },\n },\n },\n};\n\n// ============================================================================\n// USER TOOLS (per-store custom tools from user_tools table)\n// ============================================================================\n\nconst userToolCache = new Map<string, { tools: UserToolRow[]; defs: ToolDef[]; time: number; lastAccessed: number }>();\nconst USER_TOOL_CACHE_MAX = 100;\n\nfunction evictUserToolCache(): void {\n if (userToolCache.size <= USER_TOOL_CACHE_MAX) return;\n const entries = [...userToolCache.entries()].sort((a, b) => a[1].lastAccessed - b[1].lastAccessed);\n const excess = userToolCache.size - USER_TOOL_CACHE_MAX;\n for (let i = 0; i < excess; i++) {\n userToolCache.delete(entries[i][0]);\n }\n}\n\nexport async function loadUserTools(supabase: SupabaseClient, storeId: string): Promise<{ rows: UserToolRow[]; defs: ToolDef[] }> {\n const cached = userToolCache.get(storeId);\n if (cached && Date.now() - cached.time < 60_000) {\n cached.lastAccessed = Date.now();\n return { rows: cached.tools, defs: cached.defs };\n }\n\n const { data, error } = await supabase\n .from(\"user_tools\")\n .select(\"id, name, display_name, description, input_schema, execution_type, is_read_only, requires_approval, http_config, rpc_function, sql_template, allowed_tables, max_execution_time_ms\")\n .eq(\"store_id\", storeId)\n .eq(\"is_active\", true);\n\n if (error || !data?.length) return { rows: [], defs: [] };\n\n const rows: UserToolRow[] = data as UserToolRow[];\n const defs: ToolDef[] = rows.map((t) => ({\n name: `user_tool__${t.name}`,\n description: sanitizeToolDescription(\n `[Custom Tool] ${t.display_name}: ${t.description}${t.requires_approval ? \" (requires approval)\" : \"\"}`,\n ),\n input_schema: t.input_schema || { type: \"object\", properties: {} },\n }));\n\n userToolCache.set(storeId, { tools: rows, defs, time: Date.now(), lastAccessed: Date.now() });\n evictUserToolCache();\n return { rows, defs };\n}\n\nexport function getUserToolByPrefixedName(rows: UserToolRow[], prefixedName: string): UserToolRow | undefined {\n const toolName = prefixedName.replace(/^user_tool__/, \"\");\n return rows.find((t) => t.name === toolName);\n}\n\nexport function getToolsForAgent(agent: AgentConfig, coreTools: ToolDef[], userToolDefs: ToolDef[] = []): ToolDef[] {\n // Core registry tools are always available (matches MCP server behavior).\n // enabled_tools only restricts custom user tools.\n if (agent.enabled_tools?.length > 0) {\n const filteredUserTools = userToolDefs.filter((t) => agent.enabled_tools.includes(t.name));\n return [...coreTools, ...filteredUserTools];\n }\n return [...coreTools, ...userToolDefs];\n}\n\n// ============================================================================\n// UNIFIED HANDLER REGISTRY — single source of truth for all tool dispatch\n// ============================================================================\n\nexport type ToolProgressCallback = (toolName: string, progress: unknown) => void;\n\ntype ToolHandler = (\n sb: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n onToolProgress?: (progress: unknown) => void,\n) => Promise<{ success: boolean; data?: unknown; error?: string }>;\n\ninterface ToolHandlerEntry {\n handler: ToolHandler;\n timeout: number; // ms — execution timeout\n requiresStore: boolean; // whether store_id is mandatory\n supportsProgress?: boolean; // handler accepts onToolProgress (4th param)\n}\n\nconst DEFAULT_TIMEOUT = 30_000;\n\n/**\n * Every built-in tool MUST be registered here. This map is the single source\n * of truth for handler routing, timeouts, and store requirements.\n * Adding a tool to ai_tool_registry without an entry here → \"Unknown tool\" error.\n */\nexport const TOOL_HANDLERS: Record<string, ToolHandlerEntry> = {\n // --- Business Data ---\n inventory: { handler: (sb, args, sid) => {\n const a = args.action as string || \"\";\n if (a.startsWith(\"audit_\")) return handleInventoryAudit(sb, { ...args, action: a.slice(6) }, sid);\n if ([\"summary\",\"velocity\",\"by_location\",\"in_stock\",\"out_of_stock\",\"by_category\"].includes(a)) return handleInventoryQuery(sb, args, sid);\n return handleInventory(sb, args, sid);\n }, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n purchase_orders: { handler: handlePurchaseOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n transfers: { handler: handleTransfers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n products: { handler: handleProducts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n collections: { handler: handleCollections, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n customers: { handler: handleCustomers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n orders: { handler: handleOrders, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n analytics: { handler: handleAnalytics, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n locations: { handler: handleLocations, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n suppliers: { handler: handleSuppliers, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n store: { handler: handleStore, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n storefront: { handler: handleStorefront, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Communication ---\n email: { handler: handleEmail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n documents: { handler: handleDocuments, timeout: 120_000, requiresStore: true },\n\n // --- Operations ---\n alerts: { handler: handleAlerts, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n audit_trail: { handler: handleAuditTrail, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n workflows: { handler: handleWorkflows, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- AI & Generation ---\n voice: { handler: handleVoice, timeout: 120_000, requiresStore: true },\n image_gen: { handler: handleImageGen, timeout: 60_000, requiresStore: true },\n remove_bg: { handler: handleRemoveBg, timeout: 300_000, requiresStore: true },\n media: { handler: handleMedia, timeout: 60_000, requiresStore: true },\n video_gen: { handler: handleVideoGen, timeout: 600_000, requiresStore: true },\n llm: { handler: handleLLM, timeout: 120_000, requiresStore: true },\n embeddings: { handler: handleEmbeddings, timeout: 60_000, requiresStore: true },\n creations: { handler: handleCreations, timeout: 60_000, requiresStore: true },\n\n // --- Platform & Infrastructure (no store required) ---\n web_search: { handler: handleWebSearch, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n telemetry: { handler: handleTelemetry, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n browser: { handler: handleBrowser, timeout: 120_000, requiresStore: true },\n discovery: { handler: handleDiscovery, timeout: DEFAULT_TIMEOUT, requiresStore: false },\n api_keys: { handler: handleAPIKeys, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n api_docs: { handler: handleApiDocs, timeout: 15_000, requiresStore: false },\n\n // --- Advertising ---\n meta_ads: { handler: handleMetaAds, timeout: 300_000, requiresStore: true },\n google_ads: { handler: handleGoogleAds, timeout: 300_000, requiresStore: true },\n\n // --- Security & Local ---\n kali: { handler: handleKali as ToolHandler, timeout: 600_000, requiresStore: true, supportsProgress: true },\n local_agent: { handler: handleLocalAgent, timeout: 600_000, requiresStore: false },\n\n // --- Customer Enrichment ---\n enrichment: { handler: handleEnrichment, timeout: 60_000, requiresStore: true },\n\n // --- Observability (ClickHouse) ---\n clickhouse: { handler: handleClickHouse, timeout: 60_000, requiresStore: false },\n\n // --- Loyalty & Promotions ---\n loyalty: { handler: handleLoyalty, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n coupons: { handler: handleCoupons, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Fulfillment ---\n fulfillment: { handler: handleFulfillment, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- CRM & Marketing ---\n segments: { handler: handleSegments, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n campaigns: { handler: handleCampaigns, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n reviews: { handler: handleReviews, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Finance & Tax ---\n tax: { handler: handleTax, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n invoices: { handler: handleInvoices, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Webhooks ---\n webhooks_mgmt: { handler: handleWebhooksMgmt, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Affiliates ---\n affiliates: { handler: handleAffiliates, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- QR Codes ---\n qr_codes: { handler: handleQRCodes, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Phone (RingCentral) ---\n phone: { handler: handlePhone, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Social / Multi-platform Ads ---\n social: { handler: handleSocial, timeout: 300_000, requiresStore: true },\n\n // --- Wallet ---\n wallet: { handler: handleWallet, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Sales Pipeline ---\n pipeline: { handler: handlePipeline, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Wholesale ---\n wholesale: { handler: handleWholesale, timeout: DEFAULT_TIMEOUT, requiresStore: true },\n\n // --- Meta: Tool Discovery (lazy loading) ---\n discover_tools: { handler: handleDiscoverTools, timeout: 5000, requiresStore: false },\n};\n\nObject.freeze(TOOL_HANDLERS);\n\n/** Get all registered built-in tool names */\nexport function getRegisteredToolNames(): string[] {\n return Object.keys(TOOL_HANDLERS);\n}\n\n// ============================================================================\n// DISCOVER_TOOLS HANDLER — returns full schemas for extended tools on demand\n// ============================================================================\n\n/** Full extended tool defs (with schemas) — used by handleDiscoverTools to return schemas on demand */\nlet _extendedToolsCache: ToolDef[] = [];\n\n/** Lightweight extended tool index — name + first-sentence description only (for system prompt) */\nlet _extendedToolsIndex: Array<{ name: string; description: string }> = [];\n\n/** Called by index.ts after loadTools() to populate the discover_tools cache.\n * Stores full schemas for on-demand loading, plus a lightweight index for the system prompt. */\nexport function setExtendedToolsCache(tools: ToolDef[]): void {\n _extendedToolsCache = tools;\n // Pre-compute lightweight index: name + first sentence only (no schemas)\n _extendedToolsIndex = tools.map(t => ({\n name: t.name,\n description: t.description.split(\".\")[0],\n }));\n}\n\n/** Get full extended tools with schemas (for discover_tools handler) */\nexport function getExtendedToolsCache(): ToolDef[] {\n return _extendedToolsCache;\n}\n\n/** Get lightweight extended tools index — name + short description only (for system prompt).\n * Avoids serializing full schemas into the prompt. */\nexport function getExtendedToolsIndex(): Array<{ name: string; description: string }> {\n return _extendedToolsIndex;\n}\n\n/**\n * Get full tool schemas for specific tool names from the extended tools cache.\n * Used by the agent loop to inject discovered tool schemas into the active tool set.\n * Returns only tools that exist in the cache; unknown names are silently skipped.\n */\nexport function getFullToolSchemas(toolNames: string[]): ToolDef[] {\n if (!toolNames.length || !_extendedToolsCache.length) return [];\n const nameSet = new Set(toolNames);\n return _extendedToolsCache.filter(t => nameSet.has(t.name));\n}\n\n// Tool category heuristics — maps tool names to categories for category-based discovery\nconst TOOL_CATEGORIES: Record<string, string> = {\n // Business Data\n inventory: \"business\", purchase_orders: \"business\", transfers: \"business\",\n products: \"business\", collections: \"business\", customers: \"business\",\n orders: \"business\", analytics: \"business\", locations: \"business\",\n suppliers: \"business\", store: \"business\", storefront: \"business\",\n // Communication\n email: \"communication\", documents: \"communication\",\n // Operations\n alerts: \"operations\", audit_trail: \"operations\", workflows: \"operations\",\n telemetry: \"operations\",\n // Media & AI\n voice: \"media\", image_gen: \"media\", video_gen: \"media\", remove_bg: \"media\", media: \"media\",\n llm: \"ai\", embeddings: \"ai\", creations: \"media\",\n // Platform\n web_search: \"platform\", browser: \"platform\", discovery: \"platform\",\n api_keys: \"platform\", api_docs: \"platform\",\n // Security\n kali: \"security\", local_agent: \"platform\",\n // Advertising\n meta_ads: \"advertising\",\n // Data\n enrichment: \"data\",\n};\n\nasync function handleDiscoverTools(\n sb: SupabaseClient,\n args: Record<string, unknown>,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const names = args.names as string[] | undefined;\n const category = args.category as string | undefined;\n const refresh = args.refresh as boolean | undefined;\n\n // Force reload from DB if refresh requested — busts the 60s cache\n if (refresh) {\n try {\n const freshResult = await loadTools(sb, true);\n setExtendedToolsCache(freshResult.extended);\n } catch {\n // If refresh fails, continue with stale cache — better than erroring\n }\n }\n\n if (!names?.length && !category) {\n return { success: false, error: \"Provide 'names' (array of tool names) or 'category' to discover tools.\" };\n }\n\n let matching: ToolDef[] = [];\n\n if (names?.length) {\n const nameSet = new Set(names);\n matching = _extendedToolsCache.filter(t => nameSet.has(t.name));\n }\n\n if (category) {\n const cat = category.toLowerCase();\n const categoryTools = _extendedToolsCache.filter(t => TOOL_CATEGORIES[t.name] === cat);\n // Merge without duplicates\n const existingNames = new Set(matching.map(t => t.name));\n for (const t of categoryTools) {\n if (!existingNames.has(t.name)) matching.push(t);\n }\n }\n\n if (matching.length === 0) {\n const available = _extendedToolsCache.map(t => t.name).join(\", \");\n return { success: false, error: `No matching extended tools found. Available: ${available}` };\n }\n\n return {\n success: true,\n data: {\n tools: matching.map(t => ({ name: t.name, description: t.description, input_schema: t.input_schema })),\n count: matching.length,\n refreshed: !!refresh,\n },\n };\n}\n\n// ============================================================================\n// USER TOOL EXECUTOR — handles RPC, HTTP, SQL execution types\n// ============================================================================\n\nasync function executeUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n agentId?: string,\n conversationId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const timeout = userTool.max_execution_time_ms || 5000;\n\n if (userTool.execution_type === \"http\") {\n return executeHTTPUserTool(supabase, userTool, args, storeId, timeout);\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_user_tool\", {\n p_tool_id: userTool.id,\n p_store_id: storeId,\n p_args: args,\n p_agent_id: agentId || null,\n p_conversation_id: conversationId || null,\n });\n\n if (error) return { success: false, error: error.message };\n\n const result = data as { success: boolean; data?: unknown; error?: string; pending_approval?: boolean; execution_id?: string; message?: string };\n\n if (result.pending_approval) {\n return { success: false, error: `Tool requires approval. Execution ID: ${result.execution_id}. ${result.message}` };\n }\n\n if (result.success && result.data && (result.data as any).execute_sql) {\n return executeSQLUserTool(supabase, result.data as any, args, storeId);\n }\n\n return result.success\n ? { success: true, data: result.data }\n : { success: false, error: result.error || \"Unknown error\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeHTTPUserTool(\n supabase: SupabaseClient,\n userTool: UserToolRow,\n args: Record<string, unknown>,\n storeId: string,\n timeout: number,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const config = userTool.http_config;\n if (!config || !(config as any).url) {\n return { success: false, error: \"HTTP tool has no URL configured\" };\n }\n\n const httpCfg = config as { url: string; method?: string; headers?: Record<string, string>; body_template?: Record<string, unknown> };\n\n let url = httpCfg.url;\n let headers: Record<string, string> = { ...(httpCfg.headers || {}) };\n\n // Collect secret names referenced in the URL, headers, and body template\n const configStr = JSON.stringify({ url: httpCfg.url, headers: httpCfg.headers, body: httpCfg.body_template });\n const secretRefs = [...configStr.matchAll(/\\{\\{secret:(\\w+)\\}\\}/g)].map(m => m[1]);\n\n // Decrypt each referenced secret via RPC (consistent with all other handlers)\n const secretMap = new Map<string, string>();\n await Promise.all(\n [...new Set(secretRefs)].map(async (name) => {\n try {\n const { data } = await supabase.rpc(\"decrypt_secret\", { p_name: name, p_store_id: storeId });\n if (data) secretMap.set(name, data as string);\n } catch { /* secret not found — will remain as {{secret:NAME}} placeholder */ }\n }),\n );\n\n const resolveSecrets = (text: string): string => {\n return text.replace(/\\{\\{secret:(\\w+)\\}\\}/g, (_, name) => secretMap.get(name) || `{{secret:${name}}}`);\n };\n\n const resolveArgs = (text: string): string => {\n return text.replace(/\\{\\{(\\w+)\\}\\}/g, (_, name) => {\n if (name === \"secret\") return `{{${name}}}`;\n const val = args[name];\n return val !== undefined ? String(val) : `{{${name}}}`;\n });\n };\n\n const resolve = (text: string): string => resolveSecrets(resolveArgs(text));\n\n url = resolve(url);\n for (const [key, val] of Object.entries(headers)) {\n headers[key] = resolve(val);\n }\n\n let body: string | undefined;\n const method = (httpCfg.method || \"GET\").toUpperCase();\n if (method !== \"GET\" && method !== \"HEAD\") {\n if (httpCfg.body_template) {\n const resolvedBody: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(httpCfg.body_template)) {\n if (typeof val === \"string\") {\n resolvedBody[key] = resolve(val);\n } else {\n resolvedBody[key] = val;\n }\n }\n for (const [key, val] of Object.entries(args)) {\n if (!(key in resolvedBody)) {\n resolvedBody[key] = val;\n }\n }\n body = JSON.stringify(resolvedBody);\n } else {\n body = JSON.stringify(args);\n }\n if (!headers[\"Content-Type\"] && !headers[\"content-type\"]) {\n headers[\"Content-Type\"] = \"application/json\";\n }\n }\n\n // P0 FIX: Use shared SSRF guard with DNS resolve-then-check (replaces inline regex)\n const ssrfError = await validateUrl(url);\n if (ssrfError) {\n return { success: false, error: `Blocked: ${ssrfError}` };\n }\n\n try {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeout);\n\n const resp = await fetch(url, { method, headers, body, signal: controller.signal });\n clearTimeout(timer);\n\n // Clear secrets from memory as soon as the request is sent\n secretMap.clear();\n\n const contentType = resp.headers.get(\"content-type\") || \"\";\n let data: unknown;\n if (contentType.includes(\"json\")) {\n data = await resp.json();\n } else {\n data = await resp.text();\n }\n\n if (!resp.ok) {\n return { success: false, error: `HTTP ${resp.status}: ${typeof data === \"string\" ? data.substring(0, 500) : JSON.stringify(data).substring(0, 500)}` };\n }\n\n return { success: true, data };\n } catch (err: any) {\n // Clear secrets from memory even on error\n secretMap.clear();\n if (err.name === \"AbortError\") {\n return { success: false, error: `HTTP request timed out after ${timeout}ms` };\n }\n return { success: false, error: sanitizeError(err) };\n }\n}\n\nasync function executeSQLUserTool(\n supabase: SupabaseClient,\n sqlConfig: { template: string; allowed_tables: string[]; is_read_only: boolean },\n args: Record<string, unknown>,\n storeId: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n if (!sqlConfig.is_read_only) {\n return { success: false, error: \"Write SQL tools are not supported in server execution\" };\n }\n\n if (!sqlConfig.template) {\n return { success: false, error: \"No SQL template configured\" };\n }\n\n try {\n const { data, error } = await supabase.rpc(\"execute_safe_sql\", {\n p_sql: sqlConfig.template,\n p_params: args,\n p_store_id: storeId,\n p_allowed_tables: sqlConfig.allowed_tables || [],\n });\n\n if (error) return { success: false, error: error.message };\n\n if (data?.success) {\n return { success: true, data: data.data };\n }\n return { success: false, error: data?.error || \"SQL execution failed\" };\n } catch (err) {\n return { success: false, error: sanitizeError(err) };\n }\n}\n\n// ============================================================================\n// SUPPLY CHAIN — action aliasing (LLMs omit po_/transfer_ prefix)\n// ============================================================================\n\nasync function executeSupplyChain(\n supabase: SupabaseClient,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n let scAction = args.action as string || \"\";\n const PO_ALIASES: Record<string, string> = {\n create: \"po_create\", list: \"po_list\", get: \"po_get\",\n add_items: \"po_add_items\", update_items: \"po_update_items\", approve: \"po_approve\", mark_ordered: \"po_mark_ordered\",\n receive: \"po_receive\", cancel: \"po_cancel\",\n };\n if (PO_ALIASES[scAction]) scAction = PO_ALIASES[scAction];\n\n if (scAction === \"find_suppliers\") {\n return executeTool(supabase, \"suppliers\", { ...args, action: \"find_suppliers\" }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"po_\")) {\n return executeTool(supabase, \"purchase_orders\", { ...args, action: scAction.slice(3) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n if (scAction.startsWith(\"transfer_\")) {\n return executeTool(supabase, \"transfers\", { ...args, action: scAction.slice(9) }, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n return { success: false, error: `Unknown supply_chain action: ${scAction}. Use po_create, po_list, po_get, po_add_items, po_update_items, po_approve, po_receive, po_cancel, transfer_create, transfer_list, transfer_approve, transfer_ship, transfer_receive, transfer_cancel, find_suppliers.` };\n}\n\n// ============================================================================\n// TOOL EXECUTOR — dispatches via unified handler registry\n// ============================================================================\n\nexport async function executeTool(\n supabase: SupabaseClient,\n toolName: string,\n args: Record<string, unknown>,\n storeId?: string,\n traceId?: string,\n userId?: string | null,\n userEmail?: string | null,\n source?: string,\n conversationId?: string,\n userToolRows?: UserToolRow[],\n agentId?: string,\n onToolProgress?: ToolProgressCallback,\n /** Skip per-tool audit when called within a conversation — persistAgentTurn handles it */\n skipAudit?: boolean,\n): Promise<{ success: boolean; data?: unknown; error?: string }> {\n const startTime = Date.now();\n const action = args.action as string | undefined;\n let result: { success: boolean; data?: unknown; error?: string };\n\n // Handle supply_chain aliases (LLMs often omit po_/transfer_ prefix)\n if (toolName === \"supply_chain\") {\n return executeSupplyChain(supabase, args, storeId, traceId, userId, userEmail, source, conversationId, userToolRows, agentId);\n }\n\n // Look up handler from unified registry\n const entry = TOOL_HANDLERS[toolName];\n\n // Check store requirement from registry (not hardcoded)\n const requiresStore = entry ? entry.requiresStore : true;\n if (requiresStore && (!storeId || !/^[0-9a-fA-F]{8}-/.test(storeId))) {\n return { success: false, error: `store_id is required for ${toolName}. Ensure a store is selected.` };\n }\n\n // Permission enforcement — check agent flags before tool execution.\n // Skip for whale-code CLI: it's a developer tool with full access.\n // Agent permissions only apply to customer-facing surfaces (webchat, channels, workflows).\n if (agentId && source !== \"whale-code\") {\n const { data: agentFlags } = await supabase.from(\"ai_agent_config\")\n .select(\"can_query, can_modify\")\n .eq(\"id\", agentId).single();\n if (agentFlags) {\n // Read-only agent check — block ALL tool calls if can_query is false\n if (!agentFlags.can_query) {\n const readActions = [\"list\", \"get\", \"search\", \"query\", \"summary\", \"stats\", \"count\", \"by_location\", \"in_stock\", \"out_of_stock\", \"velocity\"];\n const action = args.action as string | undefined;\n if (action && readActions.includes(action)) {\n return { success: false, error: `Agent does not have query permission (can_query=false). Contact an admin.` };\n }\n }\n // Mutation check — already in system prompt but enforce at execution level\n if (!agentFlags.can_modify) {\n const writeActions = [\"create\", \"update\", \"delete\", \"upsert\", \"send\", \"approve\", \"cancel\", \"add\", \"remove\", \"set\", \"adjust\", \"transfer\"];\n const action = args.action as string | undefined;\n if (action && writeActions.some(wa => action.startsWith(wa))) {\n return { success: false, error: `Agent has read-only access (can_modify=false). Cannot perform \"${action}\".` };\n }\n }\n }\n }\n\n // User tool approval check — requires_approval enforced at execution level\n if (toolName.startsWith(\"user_tool__\") && userToolRows?.length) {\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool?.requires_approval) {\n return { success: false, error: `Tool \"${userTool.display_name}\" requires approval before execution. Use the workflow approval system to request permission.` };\n }\n }\n\n // Validate mutation args before dispatch — read-only actions pass through\n const validation = validateToolArgs(toolName, args);\n if (!validation.valid) {\n return { success: false, error: validation.error };\n }\n args = validation.data;\n\n const execStartMs = Date.now();\n try {\n let toolPromise: Promise<{ success: boolean; data?: unknown; error?: string }>;\n\n if (entry) {\n // Dispatch via unified handler registry — pass progress callback to handlers that support it\n const progressCb = entry.supportsProgress && onToolProgress\n ? (progress: unknown) => onToolProgress(toolName, progress)\n : undefined;\n toolPromise = entry.handler(supabase, args, storeId, progressCb);\n } else if (toolName.startsWith(\"user_tool__\") && userToolRows && storeId) {\n // Custom user tools\n const userTool = getUserToolByPrefixedName(userToolRows, toolName);\n if (userTool) {\n toolPromise = executeUserTool(supabase, userTool, args, storeId, agentId, conversationId);\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown user tool: ${toolName}` });\n }\n } else {\n toolPromise = Promise.resolve({ success: false, error: `Unknown tool: ${toolName}. Use the discover_tools action to see available tools.` });\n }\n\n const timeoutMs = entry?.timeout || DEFAULT_TIMEOUT;\n\n // FIX 7: Timeout cascade validation — warn if step timeout < tool timeout\n const stepTimeout = args._step_timeout_seconds as number | undefined;\n if (stepTimeout && stepTimeout * 1000 < timeoutMs) {\n console.warn(`[timeout-cascade] Step timeout (${stepTimeout}s) < tool timeout (${timeoutMs / 1000}s) for ${toolName}. Tool may outlive step.`);\n }\n\n result = await withTimeout(toolPromise, timeoutMs, toolName);\n } catch (err) {\n result = { success: false, error: sanitizeError(err) };\n }\n\n // Record execution metrics\n recordToolMetric(toolName, Date.now() - execStartMs, result.success);\n\n // Audit log — enriched with OTEL fields for distributed tracing\n // Skipped when tool is called within a conversation (SSE chat, channel agent, workflow)\n // because persistAgentTurn already logs the full conversation with tool details\n if (skipAudit) return result;\n try {\n const endTime = Date.now();\n // Compute payload sizes for observability\n const inputJson = JSON.stringify(args);\n const outputJson = result.data ? JSON.stringify(result.data) : \"\";\n const inputBytes = inputJson.length;\n const outputBytes = outputJson.length;\n\n const details: Record<string, unknown> = {\n source: source || \"fly_container\",\n args,\n // Keys that SwiftUI telemetry panel reads for rich display\n tool_input: args,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n };\n if (result.success && result.data) {\n details.result_summary = summarizeResult(toolName, action, result.data);\n // Store full result for rich telemetry display (capped at 50KB to prevent JSONB bloat)\n if (outputBytes <= 50_000) {\n details.tool_result = result.data;\n } else {\n details.tool_result = {\n _truncated: true,\n _type: Array.isArray(result.data) ? \"array\" : \"object\",\n _size: outputBytes,\n _count: Array.isArray(result.data) ? result.data.length : Object.keys(result.data as object).length,\n };\n }\n }\n if (result.error) {\n details.tool_error = result.error;\n const errorType = classifyErrorType(result.error);\n if (errorType) details.error_type = errorType;\n }\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n const spanId = Array.from(bytes).map(b => b.toString(16).padStart(2, \"0\")).join(\"\");\n const auditRow: Record<string, unknown> = {\n action: `tool.${toolName}${action ? `.${action}` : \"\"}`,\n severity: result.success ? \"info\" : \"error\",\n store_id: storeId || null,\n resource_type: \"mcp_tool\",\n resource_id: toolName,\n request_id: traceId || null,\n conversation_id: conversationId || null,\n source: source || \"fly_container\",\n details,\n error_message: result.error || null,\n error_type: classifyErrorType(result.error) || undefined,\n duration_ms: endTime - startTime,\n user_id: userId || null,\n user_email: userEmail || null,\n input_bytes: inputBytes,\n output_bytes: outputBytes,\n // OTEL fields\n trace_id: traceId || null,\n span_id: spanId,\n span_kind: \"INTERNAL\",\n service_name: \"agent-server\",\n status_code: result.success ? \"OK\" : \"ERROR\",\n start_time: new Date(startTime).toISOString(),\n end_time: new Date(endTime).toISOString(),\n };\n queueSpan(auditRowToSpan(auditRow));\n } catch (err) {\n console.error(\"[audit] exception:\", err);\n }\n\n return result;\n}\n\n// ============================================================================\n// AGENT LOADER\n// ============================================================================\n\nexport async function loadAgentConfig(supabase: SupabaseClient, agentId: string, storeId?: string): Promise<AgentConfig | null> {\n // storeId is required for tenant isolation — only omit for internal/migration callers\n let query = supabase\n .from(\"ai_agent_config\")\n .select(\"*\")\n .eq(\"id\", agentId);\n\n // Filter by store_id for tenant isolation, but also allow platform agents (store_id IS NULL)\n if (storeId) {\n query = query.or(`store_id.eq.${storeId},store_id.is.null`);\n }\n\n const { data, error } = await query.single();\n\n if (error || !data) return null;\n return data as AgentConfig;\n}\n"],"mappings":"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","ignoreList":[]}
@@ -89,6 +89,16 @@ const poAddItemsSchema = z.object({
89
89
  unit_cost: nonNegativeNumber.optional()
90
90
  })).min(1)
91
91
  });
92
+ const poUpdateItemsSchema = z.object({
93
+ action: z.literal("update_items"),
94
+ purchase_order_id: uuid,
95
+ items: z.array(z.object({
96
+ product_id: uuid,
97
+ quantity: positiveNumber,
98
+ unit_price: nonNegativeNumber.optional(),
99
+ unit_cost: nonNegativeNumber.optional()
100
+ })).min(1)
101
+ });
92
102
  const poApproveSchema = z.object({
93
103
  action: z.literal("approve"),
94
104
  purchase_order_id: uuid
@@ -219,6 +229,7 @@ const inventorySchemas = {
219
229
  const purchaseOrderSchemas = {
220
230
  create: poCreateSchema,
221
231
  add_items: poAddItemsSchema,
232
+ update_items: poUpdateItemsSchema,
222
233
  approve: poApproveSchema,
223
234
  mark_ordered: poApproveSchema,
224
235
  receive: poReceiveSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","names":["z","uuid","string","positiveNumber","number","positive","nonNegativeNumber","min","inventoryAdjustSchema","object","action","literal","product_id","location_id","adjustment","reason","optional","inventorySetSchema","quantity","inventoryTransferSchema","from_location_id","to_location_id","inventoryBulkSetSchema","items","array","inventoryBulkAdjustSchema","inventoryBulkClearSchema","poCreateSchema","supplier_id","unit_price","unit_cost","notes","expected_delivery_date","po_type","poAddItemsSchema","purchase_order_id","poApproveSchema","poReceiveSchema","poCancelSchema","transferCreateSchema","source_location_id","destination_location_id","refine","d","message","path","transferApproveSchema","transfer_id","transferShipSchema","union","transferReceiveSchema","transferCancelSchema","customerCreateSchema","first_name","last_name","email","phone","date_of_birth","email_consent","boolean","sms_consent","street_address","city","state","postal_code","drivers_license_number","medical_card_number","medical_card_expiry","customerUpdateSchema","customer_id","status","push_consent","loyalty_points","loyalty_tier","id_verified","is_wholesale_approved","wholesale_tier","wholesale_business_name","wholesale_license_number","wholesale_tax_id","customerMergeSchema","primary_customer_id","secondary_customer_id","productMergeSchema","primary_product_id","secondary_product_id","productSchemas","merge","inventorySchemas","adjust","set","transfer","bulk_set","bulk_adjust","bulk_clear","purchaseOrderSchemas","create","add_items","approve","mark_ordered","receive","cancel","transferSchemas","ship","mark_in_transit","complete","customerSchemas","update","toolSchemaRegistry","products","inventory","purchase_orders","transfers","customers","resolveSupplyChainAction","startsWith","tool","slice","validateToolArgs","toolName","args","valid","data","schemaMap","resolved","schema","innerArgs","runSchema","parseTarget","originalArgs","result","safeParse","success","issues","error","map","i","join","parsed"],"sources":["../../src/server/validation.ts"],"sourcesContent":["/**\n * Zod input validation for server tool dispatch.\n *\n * Only mutation actions are validated — reads (find, get, list, summary, etc.)\n * pass through without schema checks. This prevents malformed AI tool calls\n * from crashing handlers with TypeErrors on unchecked `as` casts.\n */\n\nimport { z } from \"zod\";\n\n// ============================================================================\n// SHARED PRIMITIVES\n// ============================================================================\n\nconst uuid = z.string().uuid();\nconst positiveNumber = z.number().positive();\nconst nonNegativeNumber = z.number().min(0);\n\n// ============================================================================\n// INVENTORY MUTATIONS\n// ============================================================================\n\nconst inventoryAdjustSchema = z.object({\n action: z.literal(\"adjust\"),\n product_id: uuid,\n location_id: uuid,\n adjustment: z.number(),\n reason: z.string().optional(),\n});\n\nconst inventorySetSchema = z.object({\n action: z.literal(\"set\"),\n product_id: uuid,\n location_id: uuid,\n quantity: nonNegativeNumber,\n});\n\nconst inventoryTransferSchema = z.object({\n action: z.literal(\"transfer\"),\n product_id: uuid,\n from_location_id: uuid,\n to_location_id: uuid,\n quantity: positiveNumber,\n});\n\nconst inventoryBulkSetSchema = z.object({\n action: z.literal(\"bulk_set\"),\n items: z.array(z.object({\n product_id: uuid,\n location_id: uuid,\n quantity: nonNegativeNumber,\n })).min(1),\n});\n\nconst inventoryBulkAdjustSchema = z.object({\n action: z.literal(\"bulk_adjust\"),\n items: z.array(z.object({\n product_id: uuid,\n location_id: uuid,\n adjustment: z.number(),\n })).min(1),\n});\n\nconst inventoryBulkClearSchema = z.object({\n action: z.literal(\"bulk_clear\"),\n location_id: uuid,\n});\n\n// ============================================================================\n// SUPPLY CHAIN — PURCHASE ORDERS\n// ============================================================================\n\nconst poCreateSchema = z.object({\n action: z.literal(\"create\"),\n supplier_id: uuid,\n location_id: uuid,\n items: z.array(z.object({\n product_id: uuid,\n quantity: positiveNumber,\n unit_price: nonNegativeNumber.optional(),\n unit_cost: nonNegativeNumber.optional(),\n })).min(1).optional(),\n notes: z.string().optional(),\n expected_delivery_date: z.string().optional(),\n po_type: z.string().optional(),\n});\n\nconst poAddItemsSchema = z.object({\n action: z.literal(\"add_items\"),\n purchase_order_id: uuid,\n items: z.array(z.object({\n product_id: uuid,\n quantity: positiveNumber,\n unit_price: nonNegativeNumber.optional(),\n unit_cost: nonNegativeNumber.optional(),\n })).min(1),\n});\n\nconst poApproveSchema = z.object({\n action: z.literal(\"approve\"),\n purchase_order_id: uuid,\n});\n\nconst poReceiveSchema = z.object({\n action: z.literal(\"receive\"),\n purchase_order_id: uuid,\n});\n\nconst poCancelSchema = z.object({\n action: z.literal(\"cancel\"),\n purchase_order_id: uuid,\n});\n\n// ============================================================================\n// SUPPLY CHAIN — TRANSFERS\n// ============================================================================\n\nconst transferCreateSchema = z.object({\n action: z.literal(\"create\"),\n from_location_id: uuid.optional(),\n source_location_id: uuid.optional(),\n to_location_id: uuid.optional(),\n destination_location_id: uuid.optional(),\n items: z.array(z.object({\n product_id: uuid,\n quantity: positiveNumber,\n })).min(1).optional(),\n notes: z.string().optional(),\n}).refine(\n (d) => d.from_location_id || d.source_location_id,\n { message: \"from_location_id or source_location_id is required\", path: [\"from_location_id\"] }\n).refine(\n (d) => d.to_location_id || d.destination_location_id,\n { message: \"to_location_id or destination_location_id is required\", path: [\"to_location_id\"] }\n);\n\nconst transferApproveSchema = z.object({\n action: z.literal(\"approve\"),\n transfer_id: uuid,\n});\n\nconst transferShipSchema = z.object({\n action: z.union([z.literal(\"ship\"), z.literal(\"mark_in_transit\")]),\n transfer_id: uuid,\n});\n\nconst transferReceiveSchema = z.object({\n action: z.union([z.literal(\"receive\"), z.literal(\"complete\")]),\n transfer_id: uuid,\n});\n\nconst transferCancelSchema = z.object({\n action: z.literal(\"cancel\"),\n transfer_id: uuid,\n});\n\n// ============================================================================\n// CUSTOMERS\n// ============================================================================\n\nconst customerCreateSchema = z.object({\n action: z.literal(\"create\"),\n first_name: z.string().min(1),\n last_name: z.string().min(1),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n date_of_birth: z.string().optional(),\n email_consent: z.boolean().optional(),\n sms_consent: z.boolean().optional(),\n street_address: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n postal_code: z.string().optional(),\n drivers_license_number: z.string().optional(),\n medical_card_number: z.string().optional(),\n medical_card_expiry: z.string().optional(),\n});\n\nconst customerUpdateSchema = z.object({\n action: z.literal(\"update\"),\n customer_id: uuid,\n first_name: z.string().min(1).optional(),\n last_name: z.string().min(1).optional(),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n date_of_birth: z.string().optional(),\n status: z.string().optional(),\n email_consent: z.boolean().optional(),\n sms_consent: z.boolean().optional(),\n push_consent: z.boolean().optional(),\n loyalty_points: z.number().optional(),\n loyalty_tier: z.string().optional(),\n street_address: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n postal_code: z.string().optional(),\n drivers_license_number: z.string().optional(),\n id_verified: z.boolean().optional(),\n medical_card_number: z.string().optional(),\n medical_card_expiry: z.string().optional(),\n is_wholesale_approved: z.boolean().optional(),\n wholesale_tier: z.string().optional(),\n wholesale_business_name: z.string().optional(),\n wholesale_license_number: z.string().optional(),\n wholesale_tax_id: z.string().optional(),\n});\n\nconst customerMergeSchema = z.object({\n action: z.literal(\"merge\"),\n primary_customer_id: uuid,\n secondary_customer_id: uuid,\n});\n\nconst productMergeSchema = z.object({\n action: z.literal(\"merge\"),\n primary_product_id: uuid,\n secondary_product_id: uuid,\n});\n\n// ============================================================================\n// SCHEMA REGISTRY — maps (toolName, action) → Zod schema\n// ============================================================================\n\ntype SchemaMap = Record<string, z.ZodTypeAny>;\n\nconst productSchemas: SchemaMap = {\n merge: productMergeSchema,\n};\n\nconst inventorySchemas: SchemaMap = {\n adjust: inventoryAdjustSchema,\n set: inventorySetSchema,\n transfer: inventoryTransferSchema,\n bulk_set: inventoryBulkSetSchema,\n bulk_adjust: inventoryBulkAdjustSchema,\n bulk_clear: inventoryBulkClearSchema,\n};\n\nconst purchaseOrderSchemas: SchemaMap = {\n create: poCreateSchema,\n add_items: poAddItemsSchema,\n approve: poApproveSchema,\n mark_ordered: poApproveSchema,\n receive: poReceiveSchema,\n cancel: poCancelSchema,\n};\n\nconst transferSchemas: SchemaMap = {\n create: transferCreateSchema,\n approve: transferApproveSchema,\n ship: transferShipSchema,\n mark_in_transit: transferShipSchema,\n receive: transferReceiveSchema,\n complete: transferReceiveSchema,\n cancel: transferCancelSchema,\n};\n\nconst customerSchemas: SchemaMap = {\n create: customerCreateSchema,\n update: customerUpdateSchema,\n merge: customerMergeSchema,\n};\n\n/**\n * Top-level registry keyed by tool name.\n * Only tools with mutation actions are listed.\n * Read-only tools (analytics, orders.find, etc.) are intentionally absent — passthrough.\n */\nconst toolSchemaRegistry: Record<string, SchemaMap> = {\n products: productSchemas,\n inventory: inventorySchemas,\n purchase_orders: purchaseOrderSchemas,\n transfers: transferSchemas,\n customers: customerSchemas,\n};\n\n// ============================================================================\n// SUPPLY_CHAIN META-TOOL RESOLUTION\n// ============================================================================\n\n/**\n * The \"supply_chain\" tool dispatches by action prefix:\n * po_create → purchase_orders / create\n * transfer_create → transfers / create\n *\n * This helper resolves supply_chain actions to the underlying tool + action.\n */\nfunction resolveSupplyChainAction(action: string): { tool: string; action: string } | null {\n if (action.startsWith(\"po_\")) return { tool: \"purchase_orders\", action: action.slice(3) };\n if (action.startsWith(\"transfer_\")) return { tool: \"transfers\", action: action.slice(9) };\n return null;\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\nexport type ValidationResult =\n | { valid: true; data: Record<string, unknown> }\n | { valid: false; error: string };\n\n/**\n * Validate tool args before dispatch to handler.\n *\n * Returns `{ valid: true, data }` with parsed (coerced) data on success,\n * or `{ valid: false, error }` with a human-readable message on failure.\n *\n * If no schema is registered for the (tool, action) pair, returns passthrough\n * with `{ valid: true, data: args }` — no validation, no blocking.\n */\nexport function validateToolArgs(\n toolName: string,\n args: Record<string, unknown>,\n): ValidationResult {\n const action = args.action as string | undefined;\n if (!action) {\n // No action param = passthrough (some tools don't use action)\n return { valid: true, data: args };\n }\n\n let schemaMap: SchemaMap | undefined;\n\n if (toolName === \"supply_chain\") {\n const resolved = resolveSupplyChainAction(action);\n if (resolved) {\n schemaMap = toolSchemaRegistry[resolved.tool];\n // Look up by the resolved action (e.g. \"create\" not \"po_create\")\n const schema = schemaMap?.[resolved.action];\n if (!schema) return { valid: true, data: args };\n // For supply_chain, we validate using the inner action name\n // Rebuild args with the inner action for schema parsing\n const innerArgs = { ...args, action: resolved.action };\n return runSchema(schema, innerArgs, args);\n }\n // Unknown supply_chain action (e.g. find_suppliers) — passthrough\n return { valid: true, data: args };\n }\n\n schemaMap = toolSchemaRegistry[toolName];\n if (!schemaMap) return { valid: true, data: args };\n\n const schema = schemaMap[action];\n if (!schema) return { valid: true, data: args };\n\n return runSchema(schema, args, args);\n}\n\n/**\n * Parse args against schema. On success, merge parsed data back onto original\n * args so extra fields (not in schema) are preserved for the handler.\n */\nfunction runSchema(\n schema: z.ZodTypeAny,\n parseTarget: Record<string, unknown>,\n originalArgs: Record<string, unknown>,\n): ValidationResult {\n const result = schema.safeParse(parseTarget);\n if (!result.success) {\n const issues = result.error.issues.map(\n (i) => `${i.path.join(\".\")}: ${i.message}`\n );\n return { valid: false, error: `Validation failed: ${issues.join(\", \")}` };\n }\n // Merge parsed data back with original args so extra passthrough fields survive\n const parsed = result.data as Record<string, unknown>;\n return { valid: true, data: { ...originalArgs, ...parsed } };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"validation.js","names":["z","uuid","string","positiveNumber","number","positive","nonNegativeNumber","min","inventoryAdjustSchema","object","action","literal","product_id","location_id","adjustment","reason","optional","inventorySetSchema","quantity","inventoryTransferSchema","from_location_id","to_location_id","inventoryBulkSetSchema","items","array","inventoryBulkAdjustSchema","inventoryBulkClearSchema","poCreateSchema","supplier_id","unit_price","unit_cost","notes","expected_delivery_date","po_type","poAddItemsSchema","purchase_order_id","poUpdateItemsSchema","poApproveSchema","poReceiveSchema","poCancelSchema","transferCreateSchema","source_location_id","destination_location_id","refine","d","message","path","transferApproveSchema","transfer_id","transferShipSchema","union","transferReceiveSchema","transferCancelSchema","customerCreateSchema","first_name","last_name","email","phone","date_of_birth","email_consent","boolean","sms_consent","street_address","city","state","postal_code","drivers_license_number","medical_card_number","medical_card_expiry","customerUpdateSchema","customer_id","status","push_consent","loyalty_points","loyalty_tier","id_verified","is_wholesale_approved","wholesale_tier","wholesale_business_name","wholesale_license_number","wholesale_tax_id","customerMergeSchema","primary_customer_id","secondary_customer_id","productMergeSchema","primary_product_id","secondary_product_id","productSchemas","merge","inventorySchemas","adjust","set","transfer","bulk_set","bulk_adjust","bulk_clear","purchaseOrderSchemas","create","add_items","update_items","approve","mark_ordered","receive","cancel","transferSchemas","ship","mark_in_transit","complete","customerSchemas","update","toolSchemaRegistry","products","inventory","purchase_orders","transfers","customers","resolveSupplyChainAction","startsWith","tool","slice","validateToolArgs","toolName","args","valid","data","schemaMap","resolved","schema","innerArgs","runSchema","parseTarget","originalArgs","result","safeParse","success","issues","error","map","i","join","parsed"],"sources":["../../src/server/validation.ts"],"sourcesContent":["/**\n * Zod input validation for server tool dispatch.\n *\n * Only mutation actions are validated — reads (find, get, list, summary, etc.)\n * pass through without schema checks. This prevents malformed AI tool calls\n * from crashing handlers with TypeErrors on unchecked `as` casts.\n */\n\nimport { z } from \"zod\";\n\n// ============================================================================\n// SHARED PRIMITIVES\n// ============================================================================\n\nconst uuid = z.string().uuid();\nconst positiveNumber = z.number().positive();\nconst nonNegativeNumber = z.number().min(0);\n\n// ============================================================================\n// INVENTORY MUTATIONS\n// ============================================================================\n\nconst inventoryAdjustSchema = z.object({\n action: z.literal(\"adjust\"),\n product_id: uuid,\n location_id: uuid,\n adjustment: z.number(),\n reason: z.string().optional(),\n});\n\nconst inventorySetSchema = z.object({\n action: z.literal(\"set\"),\n product_id: uuid,\n location_id: uuid,\n quantity: nonNegativeNumber,\n});\n\nconst inventoryTransferSchema = z.object({\n action: z.literal(\"transfer\"),\n product_id: uuid,\n from_location_id: uuid,\n to_location_id: uuid,\n quantity: positiveNumber,\n});\n\nconst inventoryBulkSetSchema = z.object({\n action: z.literal(\"bulk_set\"),\n items: z.array(z.object({\n product_id: uuid,\n location_id: uuid,\n quantity: nonNegativeNumber,\n })).min(1),\n});\n\nconst inventoryBulkAdjustSchema = z.object({\n action: z.literal(\"bulk_adjust\"),\n items: z.array(z.object({\n product_id: uuid,\n location_id: uuid,\n adjustment: z.number(),\n })).min(1),\n});\n\nconst inventoryBulkClearSchema = z.object({\n action: z.literal(\"bulk_clear\"),\n location_id: uuid,\n});\n\n// ============================================================================\n// SUPPLY CHAIN — PURCHASE ORDERS\n// ============================================================================\n\nconst poCreateSchema = z.object({\n action: z.literal(\"create\"),\n supplier_id: uuid,\n location_id: uuid,\n items: z.array(z.object({\n product_id: uuid,\n quantity: positiveNumber,\n unit_price: nonNegativeNumber.optional(),\n unit_cost: nonNegativeNumber.optional(),\n })).min(1).optional(),\n notes: z.string().optional(),\n expected_delivery_date: z.string().optional(),\n po_type: z.string().optional(),\n});\n\nconst poAddItemsSchema = z.object({\n action: z.literal(\"add_items\"),\n purchase_order_id: uuid,\n items: z.array(z.object({\n product_id: uuid,\n quantity: positiveNumber,\n unit_price: nonNegativeNumber.optional(),\n unit_cost: nonNegativeNumber.optional(),\n })).min(1),\n});\n\nconst poUpdateItemsSchema = z.object({\n action: z.literal(\"update_items\"),\n purchase_order_id: uuid,\n items: z.array(z.object({\n product_id: uuid,\n quantity: positiveNumber,\n unit_price: nonNegativeNumber.optional(),\n unit_cost: nonNegativeNumber.optional(),\n })).min(1),\n});\n\nconst poApproveSchema = z.object({\n action: z.literal(\"approve\"),\n purchase_order_id: uuid,\n});\n\nconst poReceiveSchema = z.object({\n action: z.literal(\"receive\"),\n purchase_order_id: uuid,\n});\n\nconst poCancelSchema = z.object({\n action: z.literal(\"cancel\"),\n purchase_order_id: uuid,\n});\n\n// ============================================================================\n// SUPPLY CHAIN — TRANSFERS\n// ============================================================================\n\nconst transferCreateSchema = z.object({\n action: z.literal(\"create\"),\n from_location_id: uuid.optional(),\n source_location_id: uuid.optional(),\n to_location_id: uuid.optional(),\n destination_location_id: uuid.optional(),\n items: z.array(z.object({\n product_id: uuid,\n quantity: positiveNumber,\n })).min(1).optional(),\n notes: z.string().optional(),\n}).refine(\n (d) => d.from_location_id || d.source_location_id,\n { message: \"from_location_id or source_location_id is required\", path: [\"from_location_id\"] }\n).refine(\n (d) => d.to_location_id || d.destination_location_id,\n { message: \"to_location_id or destination_location_id is required\", path: [\"to_location_id\"] }\n);\n\nconst transferApproveSchema = z.object({\n action: z.literal(\"approve\"),\n transfer_id: uuid,\n});\n\nconst transferShipSchema = z.object({\n action: z.union([z.literal(\"ship\"), z.literal(\"mark_in_transit\")]),\n transfer_id: uuid,\n});\n\nconst transferReceiveSchema = z.object({\n action: z.union([z.literal(\"receive\"), z.literal(\"complete\")]),\n transfer_id: uuid,\n});\n\nconst transferCancelSchema = z.object({\n action: z.literal(\"cancel\"),\n transfer_id: uuid,\n});\n\n// ============================================================================\n// CUSTOMERS\n// ============================================================================\n\nconst customerCreateSchema = z.object({\n action: z.literal(\"create\"),\n first_name: z.string().min(1),\n last_name: z.string().min(1),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n date_of_birth: z.string().optional(),\n email_consent: z.boolean().optional(),\n sms_consent: z.boolean().optional(),\n street_address: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n postal_code: z.string().optional(),\n drivers_license_number: z.string().optional(),\n medical_card_number: z.string().optional(),\n medical_card_expiry: z.string().optional(),\n});\n\nconst customerUpdateSchema = z.object({\n action: z.literal(\"update\"),\n customer_id: uuid,\n first_name: z.string().min(1).optional(),\n last_name: z.string().min(1).optional(),\n email: z.string().email().optional(),\n phone: z.string().optional(),\n date_of_birth: z.string().optional(),\n status: z.string().optional(),\n email_consent: z.boolean().optional(),\n sms_consent: z.boolean().optional(),\n push_consent: z.boolean().optional(),\n loyalty_points: z.number().optional(),\n loyalty_tier: z.string().optional(),\n street_address: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n postal_code: z.string().optional(),\n drivers_license_number: z.string().optional(),\n id_verified: z.boolean().optional(),\n medical_card_number: z.string().optional(),\n medical_card_expiry: z.string().optional(),\n is_wholesale_approved: z.boolean().optional(),\n wholesale_tier: z.string().optional(),\n wholesale_business_name: z.string().optional(),\n wholesale_license_number: z.string().optional(),\n wholesale_tax_id: z.string().optional(),\n});\n\nconst customerMergeSchema = z.object({\n action: z.literal(\"merge\"),\n primary_customer_id: uuid,\n secondary_customer_id: uuid,\n});\n\nconst productMergeSchema = z.object({\n action: z.literal(\"merge\"),\n primary_product_id: uuid,\n secondary_product_id: uuid,\n});\n\n// ============================================================================\n// SCHEMA REGISTRY — maps (toolName, action) → Zod schema\n// ============================================================================\n\ntype SchemaMap = Record<string, z.ZodTypeAny>;\n\nconst productSchemas: SchemaMap = {\n merge: productMergeSchema,\n};\n\nconst inventorySchemas: SchemaMap = {\n adjust: inventoryAdjustSchema,\n set: inventorySetSchema,\n transfer: inventoryTransferSchema,\n bulk_set: inventoryBulkSetSchema,\n bulk_adjust: inventoryBulkAdjustSchema,\n bulk_clear: inventoryBulkClearSchema,\n};\n\nconst purchaseOrderSchemas: SchemaMap = {\n create: poCreateSchema,\n add_items: poAddItemsSchema,\n update_items: poUpdateItemsSchema,\n approve: poApproveSchema,\n mark_ordered: poApproveSchema,\n receive: poReceiveSchema,\n cancel: poCancelSchema,\n};\n\nconst transferSchemas: SchemaMap = {\n create: transferCreateSchema,\n approve: transferApproveSchema,\n ship: transferShipSchema,\n mark_in_transit: transferShipSchema,\n receive: transferReceiveSchema,\n complete: transferReceiveSchema,\n cancel: transferCancelSchema,\n};\n\nconst customerSchemas: SchemaMap = {\n create: customerCreateSchema,\n update: customerUpdateSchema,\n merge: customerMergeSchema,\n};\n\n/**\n * Top-level registry keyed by tool name.\n * Only tools with mutation actions are listed.\n * Read-only tools (analytics, orders.find, etc.) are intentionally absent — passthrough.\n */\nconst toolSchemaRegistry: Record<string, SchemaMap> = {\n products: productSchemas,\n inventory: inventorySchemas,\n purchase_orders: purchaseOrderSchemas,\n transfers: transferSchemas,\n customers: customerSchemas,\n};\n\n// ============================================================================\n// SUPPLY_CHAIN META-TOOL RESOLUTION\n// ============================================================================\n\n/**\n * The \"supply_chain\" tool dispatches by action prefix:\n * po_create → purchase_orders / create\n * transfer_create → transfers / create\n *\n * This helper resolves supply_chain actions to the underlying tool + action.\n */\nfunction resolveSupplyChainAction(action: string): { tool: string; action: string } | null {\n if (action.startsWith(\"po_\")) return { tool: \"purchase_orders\", action: action.slice(3) };\n if (action.startsWith(\"transfer_\")) return { tool: \"transfers\", action: action.slice(9) };\n return null;\n}\n\n// ============================================================================\n// PUBLIC API\n// ============================================================================\n\nexport type ValidationResult =\n | { valid: true; data: Record<string, unknown> }\n | { valid: false; error: string };\n\n/**\n * Validate tool args before dispatch to handler.\n *\n * Returns `{ valid: true, data }` with parsed (coerced) data on success,\n * or `{ valid: false, error }` with a human-readable message on failure.\n *\n * If no schema is registered for the (tool, action) pair, returns passthrough\n * with `{ valid: true, data: args }` — no validation, no blocking.\n */\nexport function validateToolArgs(\n toolName: string,\n args: Record<string, unknown>,\n): ValidationResult {\n const action = args.action as string | undefined;\n if (!action) {\n // No action param = passthrough (some tools don't use action)\n return { valid: true, data: args };\n }\n\n let schemaMap: SchemaMap | undefined;\n\n if (toolName === \"supply_chain\") {\n const resolved = resolveSupplyChainAction(action);\n if (resolved) {\n schemaMap = toolSchemaRegistry[resolved.tool];\n // Look up by the resolved action (e.g. \"create\" not \"po_create\")\n const schema = schemaMap?.[resolved.action];\n if (!schema) return { valid: true, data: args };\n // For supply_chain, we validate using the inner action name\n // Rebuild args with the inner action for schema parsing\n const innerArgs = { ...args, action: resolved.action };\n return runSchema(schema, innerArgs, args);\n }\n // Unknown supply_chain action (e.g. find_suppliers) — passthrough\n return { valid: true, data: args };\n }\n\n schemaMap = toolSchemaRegistry[toolName];\n if (!schemaMap) return { valid: true, data: args };\n\n const schema = schemaMap[action];\n if (!schema) return { valid: true, data: args };\n\n return runSchema(schema, args, args);\n}\n\n/**\n * Parse args against schema. On success, merge parsed data back onto original\n * args so extra fields (not in schema) are preserved for the handler.\n */\nfunction runSchema(\n schema: z.ZodTypeAny,\n parseTarget: Record<string, unknown>,\n originalArgs: Record<string, unknown>,\n): ValidationResult {\n const result = schema.safeParse(parseTarget);\n if (!result.success) {\n const issues = result.error.issues.map(\n (i) => `${i.path.join(\".\")}: ${i.message}`\n );\n return { valid: false, error: `Validation failed: ${issues.join(\", \")}` };\n }\n // Merge parsed data back with original args so extra passthrough fields survive\n const parsed = result.data as Record<string, unknown>;\n return { valid: true, data: { ...originalArgs, ...parsed } };\n}\n"],"mappings":"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","ignoreList":[]}