whale-code 6.4.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 (319) hide show
  1. package/README.md +95 -0
  2. package/bin/swag-agent.js +9 -0
  3. package/bin/swagmanager-mcp.js +321 -0
  4. package/dist/cli/app.d.ts +26 -0
  5. package/dist/cli/app.js +64 -0
  6. package/dist/cli/chat/AgentSelector.d.ts +14 -0
  7. package/dist/cli/chat/AgentSelector.js +14 -0
  8. package/dist/cli/chat/ChatApp.d.ts +9 -0
  9. package/dist/cli/chat/ChatApp.js +267 -0
  10. package/dist/cli/chat/ChatInput.d.ts +39 -0
  11. package/dist/cli/chat/ChatInput.js +509 -0
  12. package/dist/cli/chat/MarkdownText.d.ts +10 -0
  13. package/dist/cli/chat/MarkdownText.js +20 -0
  14. package/dist/cli/chat/MessageList.d.ts +37 -0
  15. package/dist/cli/chat/MessageList.js +80 -0
  16. package/dist/cli/chat/ModelSelector.d.ts +20 -0
  17. package/dist/cli/chat/ModelSelector.js +73 -0
  18. package/dist/cli/chat/RewindViewer.d.ts +26 -0
  19. package/dist/cli/chat/RewindViewer.js +185 -0
  20. package/dist/cli/chat/StoreSelector.d.ts +14 -0
  21. package/dist/cli/chat/StoreSelector.js +24 -0
  22. package/dist/cli/chat/StreamingText.d.ts +12 -0
  23. package/dist/cli/chat/StreamingText.js +12 -0
  24. package/dist/cli/chat/SubagentPanel.d.ts +45 -0
  25. package/dist/cli/chat/SubagentPanel.js +110 -0
  26. package/dist/cli/chat/TeamPanel.d.ts +21 -0
  27. package/dist/cli/chat/TeamPanel.js +42 -0
  28. package/dist/cli/chat/ToolIndicator.d.ts +25 -0
  29. package/dist/cli/chat/ToolIndicator.js +436 -0
  30. package/dist/cli/chat/hooks/useAgentLoop.d.ts +39 -0
  31. package/dist/cli/chat/hooks/useAgentLoop.js +382 -0
  32. package/dist/cli/chat/hooks/useSlashCommands.d.ts +37 -0
  33. package/dist/cli/chat/hooks/useSlashCommands.js +387 -0
  34. package/dist/cli/commands/config-cmd.d.ts +10 -0
  35. package/dist/cli/commands/config-cmd.js +99 -0
  36. package/dist/cli/commands/doctor.d.ts +14 -0
  37. package/dist/cli/commands/doctor.js +172 -0
  38. package/dist/cli/commands/init.d.ts +16 -0
  39. package/dist/cli/commands/init.js +278 -0
  40. package/dist/cli/commands/mcp.d.ts +12 -0
  41. package/dist/cli/commands/mcp.js +162 -0
  42. package/dist/cli/login/LoginApp.d.ts +7 -0
  43. package/dist/cli/login/LoginApp.js +157 -0
  44. package/dist/cli/print-mode.d.ts +31 -0
  45. package/dist/cli/print-mode.js +202 -0
  46. package/dist/cli/serve-mode.d.ts +37 -0
  47. package/dist/cli/serve-mode.js +636 -0
  48. package/dist/cli/services/agent-definitions.d.ts +25 -0
  49. package/dist/cli/services/agent-definitions.js +91 -0
  50. package/dist/cli/services/agent-events.d.ts +178 -0
  51. package/dist/cli/services/agent-events.js +175 -0
  52. package/dist/cli/services/agent-loop.d.ts +90 -0
  53. package/dist/cli/services/agent-loop.js +762 -0
  54. package/dist/cli/services/agent-worker-base.d.ts +97 -0
  55. package/dist/cli/services/agent-worker-base.js +220 -0
  56. package/dist/cli/services/auth-service.d.ts +30 -0
  57. package/dist/cli/services/auth-service.js +160 -0
  58. package/dist/cli/services/background-processes.d.ts +126 -0
  59. package/dist/cli/services/background-processes.js +318 -0
  60. package/dist/cli/services/browser-auth.d.ts +24 -0
  61. package/dist/cli/services/browser-auth.js +180 -0
  62. package/dist/cli/services/claude-md-loader.d.ts +16 -0
  63. package/dist/cli/services/claude-md-loader.js +58 -0
  64. package/dist/cli/services/config-store.d.ts +47 -0
  65. package/dist/cli/services/config-store.js +79 -0
  66. package/dist/cli/services/debug-log.d.ts +10 -0
  67. package/dist/cli/services/debug-log.js +52 -0
  68. package/dist/cli/services/error-logger.d.ts +58 -0
  69. package/dist/cli/services/error-logger.js +269 -0
  70. package/dist/cli/services/file-history.d.ts +21 -0
  71. package/dist/cli/services/file-history.js +83 -0
  72. package/dist/cli/services/format-server-response.d.ts +16 -0
  73. package/dist/cli/services/format-server-response.js +440 -0
  74. package/dist/cli/services/git-context.d.ts +11 -0
  75. package/dist/cli/services/git-context.js +66 -0
  76. package/dist/cli/services/hooks.d.ts +85 -0
  77. package/dist/cli/services/hooks.js +258 -0
  78. package/dist/cli/services/interactive-tools.d.ts +125 -0
  79. package/dist/cli/services/interactive-tools.js +260 -0
  80. package/dist/cli/services/keybinding-manager.d.ts +52 -0
  81. package/dist/cli/services/keybinding-manager.js +115 -0
  82. package/dist/cli/services/local-tools.d.ts +22 -0
  83. package/dist/cli/services/local-tools.js +697 -0
  84. package/dist/cli/services/lsp-manager.d.ts +18 -0
  85. package/dist/cli/services/lsp-manager.js +717 -0
  86. package/dist/cli/services/mcp-client.d.ts +48 -0
  87. package/dist/cli/services/mcp-client.js +157 -0
  88. package/dist/cli/services/memory-manager.d.ts +16 -0
  89. package/dist/cli/services/memory-manager.js +57 -0
  90. package/dist/cli/services/model-manager.d.ts +18 -0
  91. package/dist/cli/services/model-manager.js +71 -0
  92. package/dist/cli/services/model-router.d.ts +26 -0
  93. package/dist/cli/services/model-router.js +149 -0
  94. package/dist/cli/services/permission-modes.d.ts +13 -0
  95. package/dist/cli/services/permission-modes.js +43 -0
  96. package/dist/cli/services/rewind.d.ts +84 -0
  97. package/dist/cli/services/rewind.js +194 -0
  98. package/dist/cli/services/ripgrep.d.ts +28 -0
  99. package/dist/cli/services/ripgrep.js +138 -0
  100. package/dist/cli/services/sandbox.d.ts +29 -0
  101. package/dist/cli/services/sandbox.js +97 -0
  102. package/dist/cli/services/server-tools.d.ts +61 -0
  103. package/dist/cli/services/server-tools.js +543 -0
  104. package/dist/cli/services/session-persistence.d.ts +23 -0
  105. package/dist/cli/services/session-persistence.js +99 -0
  106. package/dist/cli/services/subagent-worker.d.ts +19 -0
  107. package/dist/cli/services/subagent-worker.js +41 -0
  108. package/dist/cli/services/subagent.d.ts +47 -0
  109. package/dist/cli/services/subagent.js +647 -0
  110. package/dist/cli/services/system-prompt.d.ts +7 -0
  111. package/dist/cli/services/system-prompt.js +198 -0
  112. package/dist/cli/services/team-lead.d.ts +73 -0
  113. package/dist/cli/services/team-lead.js +512 -0
  114. package/dist/cli/services/team-state.d.ts +77 -0
  115. package/dist/cli/services/team-state.js +398 -0
  116. package/dist/cli/services/teammate.d.ts +31 -0
  117. package/dist/cli/services/teammate.js +689 -0
  118. package/dist/cli/services/telemetry.d.ts +61 -0
  119. package/dist/cli/services/telemetry.js +209 -0
  120. package/dist/cli/services/tools/agent-tools.d.ts +14 -0
  121. package/dist/cli/services/tools/agent-tools.js +347 -0
  122. package/dist/cli/services/tools/file-ops.d.ts +15 -0
  123. package/dist/cli/services/tools/file-ops.js +487 -0
  124. package/dist/cli/services/tools/search-tools.d.ts +8 -0
  125. package/dist/cli/services/tools/search-tools.js +186 -0
  126. package/dist/cli/services/tools/shell-exec.d.ts +10 -0
  127. package/dist/cli/services/tools/shell-exec.js +168 -0
  128. package/dist/cli/services/tools/task-manager.d.ts +28 -0
  129. package/dist/cli/services/tools/task-manager.js +209 -0
  130. package/dist/cli/services/tools/web-tools.d.ts +11 -0
  131. package/dist/cli/services/tools/web-tools.js +395 -0
  132. package/dist/cli/setup/SetupApp.d.ts +9 -0
  133. package/dist/cli/setup/SetupApp.js +191 -0
  134. package/dist/cli/shared/MatrixIntro.d.ts +4 -0
  135. package/dist/cli/shared/MatrixIntro.js +83 -0
  136. package/dist/cli/shared/Theme.d.ts +74 -0
  137. package/dist/cli/shared/Theme.js +127 -0
  138. package/dist/cli/shared/WhaleBanner.d.ts +10 -0
  139. package/dist/cli/shared/WhaleBanner.js +12 -0
  140. package/dist/cli/shared/markdown.d.ts +21 -0
  141. package/dist/cli/shared/markdown.js +756 -0
  142. package/dist/cli/status/StatusApp.d.ts +4 -0
  143. package/dist/cli/status/StatusApp.js +105 -0
  144. package/dist/cli/stores/StoreApp.d.ts +7 -0
  145. package/dist/cli/stores/StoreApp.js +81 -0
  146. package/dist/index.d.ts +15 -0
  147. package/dist/index.js +538 -0
  148. package/dist/local-agent/connection.d.ts +48 -0
  149. package/dist/local-agent/connection.js +332 -0
  150. package/dist/local-agent/discovery.d.ts +18 -0
  151. package/dist/local-agent/discovery.js +146 -0
  152. package/dist/local-agent/executor.d.ts +34 -0
  153. package/dist/local-agent/executor.js +241 -0
  154. package/dist/local-agent/index.d.ts +14 -0
  155. package/dist/local-agent/index.js +198 -0
  156. package/dist/node/adapters/base.d.ts +35 -0
  157. package/dist/node/adapters/base.js +10 -0
  158. package/dist/node/adapters/discord.d.ts +29 -0
  159. package/dist/node/adapters/discord.js +299 -0
  160. package/dist/node/adapters/email.d.ts +23 -0
  161. package/dist/node/adapters/email.js +218 -0
  162. package/dist/node/adapters/imessage.d.ts +17 -0
  163. package/dist/node/adapters/imessage.js +118 -0
  164. package/dist/node/adapters/slack.d.ts +26 -0
  165. package/dist/node/adapters/slack.js +259 -0
  166. package/dist/node/adapters/sms.d.ts +23 -0
  167. package/dist/node/adapters/sms.js +161 -0
  168. package/dist/node/adapters/telegram.d.ts +17 -0
  169. package/dist/node/adapters/telegram.js +101 -0
  170. package/dist/node/adapters/webchat.d.ts +27 -0
  171. package/dist/node/adapters/webchat.js +160 -0
  172. package/dist/node/adapters/whatsapp.d.ts +28 -0
  173. package/dist/node/adapters/whatsapp.js +230 -0
  174. package/dist/node/cli.d.ts +2 -0
  175. package/dist/node/cli.js +325 -0
  176. package/dist/node/config.d.ts +17 -0
  177. package/dist/node/config.js +31 -0
  178. package/dist/node/runtime.d.ts +50 -0
  179. package/dist/node/runtime.js +351 -0
  180. package/dist/server/handlers/__test-utils__/mock-supabase.d.ts +11 -0
  181. package/dist/server/handlers/__test-utils__/mock-supabase.js +393 -0
  182. package/dist/server/handlers/analytics.d.ts +17 -0
  183. package/dist/server/handlers/analytics.js +266 -0
  184. package/dist/server/handlers/api-keys.d.ts +6 -0
  185. package/dist/server/handlers/api-keys.js +221 -0
  186. package/dist/server/handlers/billing.d.ts +33 -0
  187. package/dist/server/handlers/billing.js +272 -0
  188. package/dist/server/handlers/browser.d.ts +10 -0
  189. package/dist/server/handlers/browser.js +517 -0
  190. package/dist/server/handlers/catalog.d.ts +99 -0
  191. package/dist/server/handlers/catalog.js +976 -0
  192. package/dist/server/handlers/comms.d.ts +254 -0
  193. package/dist/server/handlers/comms.js +588 -0
  194. package/dist/server/handlers/creations.d.ts +6 -0
  195. package/dist/server/handlers/creations.js +479 -0
  196. package/dist/server/handlers/crm.d.ts +89 -0
  197. package/dist/server/handlers/crm.js +538 -0
  198. package/dist/server/handlers/discovery.d.ts +6 -0
  199. package/dist/server/handlers/discovery.js +288 -0
  200. package/dist/server/handlers/embeddings.d.ts +92 -0
  201. package/dist/server/handlers/embeddings.js +197 -0
  202. package/dist/server/handlers/enrichment.d.ts +8 -0
  203. package/dist/server/handlers/enrichment.js +768 -0
  204. package/dist/server/handlers/image-gen.d.ts +6 -0
  205. package/dist/server/handlers/image-gen.js +409 -0
  206. package/dist/server/handlers/inventory.d.ts +319 -0
  207. package/dist/server/handlers/inventory.js +447 -0
  208. package/dist/server/handlers/kali.d.ts +10 -0
  209. package/dist/server/handlers/kali.js +210 -0
  210. package/dist/server/handlers/llm-providers.d.ts +6 -0
  211. package/dist/server/handlers/llm-providers.js +673 -0
  212. package/dist/server/handlers/local-agent.d.ts +6 -0
  213. package/dist/server/handlers/local-agent.js +118 -0
  214. package/dist/server/handlers/meta-ads.d.ts +111 -0
  215. package/dist/server/handlers/meta-ads.js +2279 -0
  216. package/dist/server/handlers/nodes.d.ts +33 -0
  217. package/dist/server/handlers/nodes.js +699 -0
  218. package/dist/server/handlers/operations.d.ts +138 -0
  219. package/dist/server/handlers/operations.js +131 -0
  220. package/dist/server/handlers/platform.d.ts +23 -0
  221. package/dist/server/handlers/platform.js +227 -0
  222. package/dist/server/handlers/supply-chain.d.ts +19 -0
  223. package/dist/server/handlers/supply-chain.js +327 -0
  224. package/dist/server/handlers/transcription.d.ts +17 -0
  225. package/dist/server/handlers/transcription.js +121 -0
  226. package/dist/server/handlers/video-gen.d.ts +6 -0
  227. package/dist/server/handlers/video-gen.js +466 -0
  228. package/dist/server/handlers/voice.d.ts +8 -0
  229. package/dist/server/handlers/voice.js +1146 -0
  230. package/dist/server/handlers/workflow-steps.d.ts +86 -0
  231. package/dist/server/handlers/workflow-steps.js +2349 -0
  232. package/dist/server/handlers/workflows.d.ts +7 -0
  233. package/dist/server/handlers/workflows.js +989 -0
  234. package/dist/server/index.d.ts +1 -0
  235. package/dist/server/index.js +2427 -0
  236. package/dist/server/lib/batch-client.d.ts +80 -0
  237. package/dist/server/lib/batch-client.js +467 -0
  238. package/dist/server/lib/code-worker-pool.d.ts +31 -0
  239. package/dist/server/lib/code-worker-pool.js +224 -0
  240. package/dist/server/lib/code-worker.d.ts +1 -0
  241. package/dist/server/lib/code-worker.js +188 -0
  242. package/dist/server/lib/compaction-service.d.ts +32 -0
  243. package/dist/server/lib/compaction-service.js +162 -0
  244. package/dist/server/lib/logger.d.ts +19 -0
  245. package/dist/server/lib/logger.js +46 -0
  246. package/dist/server/lib/otel.d.ts +38 -0
  247. package/dist/server/lib/otel.js +126 -0
  248. package/dist/server/lib/pg-rate-limiter.d.ts +21 -0
  249. package/dist/server/lib/pg-rate-limiter.js +86 -0
  250. package/dist/server/lib/prompt-sanitizer.d.ts +37 -0
  251. package/dist/server/lib/prompt-sanitizer.js +177 -0
  252. package/dist/server/lib/provider-capabilities.d.ts +85 -0
  253. package/dist/server/lib/provider-capabilities.js +190 -0
  254. package/dist/server/lib/provider-failover.d.ts +74 -0
  255. package/dist/server/lib/provider-failover.js +210 -0
  256. package/dist/server/lib/rate-limiter.d.ts +39 -0
  257. package/dist/server/lib/rate-limiter.js +147 -0
  258. package/dist/server/lib/server-agent-loop.d.ts +107 -0
  259. package/dist/server/lib/server-agent-loop.js +667 -0
  260. package/dist/server/lib/server-subagent.d.ts +78 -0
  261. package/dist/server/lib/server-subagent.js +203 -0
  262. package/dist/server/lib/session-checkpoint.d.ts +51 -0
  263. package/dist/server/lib/session-checkpoint.js +145 -0
  264. package/dist/server/lib/ssrf-guard.d.ts +13 -0
  265. package/dist/server/lib/ssrf-guard.js +240 -0
  266. package/dist/server/lib/supabase-client.d.ts +7 -0
  267. package/dist/server/lib/supabase-client.js +78 -0
  268. package/dist/server/lib/template-resolver.d.ts +31 -0
  269. package/dist/server/lib/template-resolver.js +215 -0
  270. package/dist/server/lib/utils.d.ts +16 -0
  271. package/dist/server/lib/utils.js +147 -0
  272. package/dist/server/local-agent-gateway.d.ts +82 -0
  273. package/dist/server/local-agent-gateway.js +426 -0
  274. package/dist/server/providers/anthropic.d.ts +20 -0
  275. package/dist/server/providers/anthropic.js +199 -0
  276. package/dist/server/providers/bedrock.d.ts +20 -0
  277. package/dist/server/providers/bedrock.js +194 -0
  278. package/dist/server/providers/gemini.d.ts +24 -0
  279. package/dist/server/providers/gemini.js +486 -0
  280. package/dist/server/providers/openai.d.ts +24 -0
  281. package/dist/server/providers/openai.js +522 -0
  282. package/dist/server/providers/registry.d.ts +32 -0
  283. package/dist/server/providers/registry.js +58 -0
  284. package/dist/server/providers/shared.d.ts +32 -0
  285. package/dist/server/providers/shared.js +124 -0
  286. package/dist/server/providers/types.d.ts +92 -0
  287. package/dist/server/providers/types.js +12 -0
  288. package/dist/server/proxy-handlers.d.ts +6 -0
  289. package/dist/server/proxy-handlers.js +89 -0
  290. package/dist/server/tool-router.d.ts +149 -0
  291. package/dist/server/tool-router.js +803 -0
  292. package/dist/server/validation.d.ts +24 -0
  293. package/dist/server/validation.js +301 -0
  294. package/dist/server/worker.d.ts +19 -0
  295. package/dist/server/worker.js +201 -0
  296. package/dist/setup.d.ts +8 -0
  297. package/dist/setup.js +181 -0
  298. package/dist/shared/agent-core.d.ts +157 -0
  299. package/dist/shared/agent-core.js +534 -0
  300. package/dist/shared/anthropic-types.d.ts +105 -0
  301. package/dist/shared/anthropic-types.js +7 -0
  302. package/dist/shared/api-client.d.ts +90 -0
  303. package/dist/shared/api-client.js +379 -0
  304. package/dist/shared/constants.d.ts +33 -0
  305. package/dist/shared/constants.js +80 -0
  306. package/dist/shared/sse-parser.d.ts +26 -0
  307. package/dist/shared/sse-parser.js +259 -0
  308. package/dist/shared/tool-dispatch.d.ts +52 -0
  309. package/dist/shared/tool-dispatch.js +191 -0
  310. package/dist/shared/types.d.ts +72 -0
  311. package/dist/shared/types.js +7 -0
  312. package/dist/updater.d.ts +25 -0
  313. package/dist/updater.js +140 -0
  314. package/dist/webchat/widget.d.ts +0 -0
  315. package/dist/webchat/widget.js +397 -0
  316. package/package.json +95 -0
  317. package/src/cli/services/builtin-skills/commit.md +19 -0
  318. package/src/cli/services/builtin-skills/review-pr.md +21 -0
  319. package/src/cli/services/builtin-skills/review.md +18 -0
@@ -0,0 +1,138 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export declare function handleLocations(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<{
3
+ success: boolean;
4
+ error: string;
5
+ data?: undefined;
6
+ } | {
7
+ success: boolean;
8
+ data: {
9
+ id: any;
10
+ name: any;
11
+ address_line1: any;
12
+ city: any;
13
+ state: any;
14
+ is_active: any;
15
+ type: any;
16
+ }[];
17
+ error?: undefined;
18
+ }>;
19
+ export declare function handleSuppliers(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<{
20
+ success: boolean;
21
+ error: string;
22
+ data?: undefined;
23
+ } | {
24
+ success: boolean;
25
+ data: {
26
+ id: any;
27
+ external_name: any;
28
+ external_company: any;
29
+ contact_name: any;
30
+ contact_email: any;
31
+ contact_phone: any;
32
+ city: any;
33
+ state: any;
34
+ is_active: any;
35
+ }[];
36
+ error?: undefined;
37
+ }>;
38
+ export declare function handleAlerts(sb: SupabaseClient, _args: Record<string, unknown>, storeId?: string): Promise<{
39
+ success: boolean;
40
+ data: {
41
+ summary: {
42
+ low_stock: number;
43
+ out_of_stock: number;
44
+ pending_orders: number;
45
+ };
46
+ low_stock: {
47
+ type: "low_stock";
48
+ severity: "warning";
49
+ product: any;
50
+ sku: any;
51
+ location: any;
52
+ quantity: any;
53
+ }[];
54
+ out_of_stock: {
55
+ type: "out_of_stock";
56
+ severity: "critical";
57
+ product: any;
58
+ sku: any;
59
+ location: any;
60
+ }[];
61
+ pending_orders: {
62
+ order_number: any;
63
+ total: any;
64
+ created_at: any;
65
+ }[];
66
+ };
67
+ }>;
68
+ export declare function handleStore(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<{
69
+ success: boolean;
70
+ error: string;
71
+ data?: undefined;
72
+ } | {
73
+ success: boolean;
74
+ data: {
75
+ locations: {
76
+ id: any;
77
+ name: any;
78
+ address_line1: any;
79
+ city: any;
80
+ state: any;
81
+ zip_code: any;
82
+ is_active: any;
83
+ type: any;
84
+ }[];
85
+ id: any;
86
+ store_name: any;
87
+ email: any;
88
+ logo_url: any;
89
+ brand_colors: any;
90
+ store_tagline: any;
91
+ };
92
+ error?: undefined;
93
+ }>;
94
+ export declare function handleAuditTrail(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<{
95
+ success: boolean;
96
+ error: string;
97
+ data?: undefined;
98
+ } | {
99
+ success: boolean;
100
+ data: {
101
+ query: string;
102
+ entries: {
103
+ id: any;
104
+ action: any;
105
+ severity: any;
106
+ source: any;
107
+ resource_type: any;
108
+ resource_id: any;
109
+ user_email: any;
110
+ details: any;
111
+ created_at: any;
112
+ }[];
113
+ count: number;
114
+ days: number;
115
+ summary?: undefined;
116
+ };
117
+ error?: undefined;
118
+ } | {
119
+ success: boolean;
120
+ data: {
121
+ entries: {
122
+ id: any;
123
+ action: any;
124
+ severity: any;
125
+ source: any;
126
+ resource_type: any;
127
+ resource_id: any;
128
+ details: any;
129
+ user_email: any;
130
+ created_at: any;
131
+ }[];
132
+ summary: Record<string, number>;
133
+ days: number;
134
+ count: number;
135
+ query?: undefined;
136
+ };
137
+ error?: undefined;
138
+ }>;
@@ -0,0 +1,131 @@
1
+ // server/handlers/operations.ts — Locations, Suppliers, Alerts, Audit Trail handlers
2
+ import { sanitizeFilterValue } from "../lib/utils.js";
3
+ export async function handleLocations(sb, args, storeId) {
4
+ const sid = storeId;
5
+ let q = sb.from("locations").select("id, name, address_line1, city, state, is_active, type").eq("store_id", sid);
6
+ if (args.is_active !== undefined)
7
+ q = q.eq("is_active", args.is_active);
8
+ if (args.name) {
9
+ const sn = sanitizeFilterValue(args.name);
10
+ q = q.ilike("name", `%${sn}%`);
11
+ }
12
+ const { data, error } = await q;
13
+ return error ? { success: false, error: error.message } : { success: true, data };
14
+ }
15
+ export async function handleSuppliers(sb, args, storeId) {
16
+ const sid = storeId;
17
+ let q = sb.from("suppliers").select("id, external_name, external_company, contact_name, contact_email, contact_phone, city, state, is_active").eq("store_id", sid);
18
+ if (args.name) {
19
+ const sn = sanitizeFilterValue(args.name);
20
+ q = q.or(`external_name.ilike.%${sn}%,external_company.ilike.%${sn}%,contact_name.ilike.%${sn}%`);
21
+ }
22
+ const { data, error } = await q;
23
+ return error ? { success: false, error: error.message } : { success: true, data };
24
+ }
25
+ export async function handleAlerts(sb, _args, storeId) {
26
+ const sid = storeId;
27
+ // Low stock alerts (quantity < 10)
28
+ const { data: lowStock } = await sb.from("inventory")
29
+ .select("quantity, product:products(name, sku), location:locations(name)")
30
+ .eq("store_id", sid).lt("quantity", 10).gt("quantity", 0);
31
+ const lowStockAlerts = (lowStock || []).map((item) => ({
32
+ type: "low_stock", severity: "warning",
33
+ product: item.product?.name || "?", sku: item.product?.sku || "?",
34
+ location: item.location?.name || "?", quantity: item.quantity,
35
+ }));
36
+ // Out of stock
37
+ const { data: outOfStock } = await sb.from("inventory")
38
+ .select("product:products(name, sku), location:locations(name)")
39
+ .eq("store_id", sid).eq("quantity", 0);
40
+ const outOfStockAlerts = (outOfStock || []).map((item) => ({
41
+ type: "out_of_stock", severity: "critical",
42
+ product: item.product?.name || "?", sku: item.product?.sku || "?",
43
+ location: item.location?.name || "?",
44
+ }));
45
+ // Pending orders
46
+ const { data: pendingOrders } = await sb.from("orders")
47
+ .select("id, order_number, total_amount, created_at")
48
+ .eq("store_id", sid).eq("status", "pending");
49
+ return {
50
+ success: true,
51
+ data: {
52
+ summary: {
53
+ low_stock: lowStockAlerts.length,
54
+ out_of_stock: outOfStockAlerts.length,
55
+ pending_orders: pendingOrders?.length || 0,
56
+ },
57
+ low_stock: lowStockAlerts,
58
+ out_of_stock: outOfStockAlerts,
59
+ pending_orders: (pendingOrders || []).map((o) => ({
60
+ order_number: o.order_number, total: o.total_amount, created_at: o.created_at,
61
+ })),
62
+ },
63
+ };
64
+ }
65
+ export async function handleStore(sb, args, storeId) {
66
+ const sid = storeId;
67
+ // Get store info with all locations
68
+ const { data: store, error: storeErr } = await sb.from("stores")
69
+ .select("id, store_name, email, logo_url, brand_colors, store_tagline")
70
+ .eq("id", sid)
71
+ .single();
72
+ if (storeErr || !store)
73
+ return { success: false, error: storeErr?.message || "Store not found" };
74
+ // Fetch locations for this store
75
+ const { data: locations } = await sb.from("locations")
76
+ .select("id, name, address_line1, city, state, zip_code, is_active, type")
77
+ .eq("store_id", sid)
78
+ .eq("is_active", true);
79
+ return { success: true, data: { ...store, locations: locations || [] } };
80
+ }
81
+ export async function handleAuditTrail(sb, args, storeId) {
82
+ const sid = storeId;
83
+ const days = args.days || 1;
84
+ const cutoff = new Date(Date.now() - days * 86400_000).toISOString();
85
+ // "search" action: full-text search across logs
86
+ if (args.action === "search") {
87
+ const query = args.query;
88
+ if (!query)
89
+ return { success: false, error: "query parameter is required for search action" };
90
+ let sq = sb.from("audit_logs")
91
+ .select("id, action, severity, source, resource_type, resource_id, user_email, details, created_at")
92
+ .eq("store_id", sid)
93
+ .gte("created_at", cutoff)
94
+ .or(`action.ilike.%${sanitizeFilterValue(query)}%,error_message.ilike.%${sanitizeFilterValue(query)}%,user_email.ilike.%${sanitizeFilterValue(query)}%,resource_id.ilike.%${sanitizeFilterValue(query)}%`)
95
+ .order("created_at", { ascending: false });
96
+ if (args.limit)
97
+ sq = sq.limit(args.limit);
98
+ const { data, error } = await sq;
99
+ if (error)
100
+ return { success: false, error: error.message };
101
+ return { success: true, data: { query, entries: data, count: data?.length || 0, days } };
102
+ }
103
+ // Default action: filtered list
104
+ let q = sb.from("audit_logs")
105
+ .select("id, action, severity, source, resource_type, resource_id, details, user_email, created_at")
106
+ .eq("store_id", sid)
107
+ .gte("created_at", cutoff)
108
+ .order("created_at", { ascending: false });
109
+ if (args.limit)
110
+ q = q.limit(args.limit);
111
+ // Optional filters
112
+ if (args.action_filter) {
113
+ const sf = sanitizeFilterValue(args.action_filter);
114
+ q = q.ilike("action", `%${sf}%`);
115
+ }
116
+ if (args.resource_type)
117
+ q = q.eq("resource_type", args.resource_type);
118
+ if (args.severity)
119
+ q = q.eq("severity", args.severity);
120
+ if (args.source)
121
+ q = q.eq("source", args.source);
122
+ const { data, error } = await q;
123
+ if (error)
124
+ return { success: false, error: error.message };
125
+ // Summarize by action for quick overview
126
+ const byAction = {};
127
+ for (const entry of data || []) {
128
+ byAction[entry.action] = (byAction[entry.action] || 0) + 1;
129
+ }
130
+ return { success: true, data: { entries: data, summary: byAction, days, count: data?.length || 0 } };
131
+ }
@@ -0,0 +1,23 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export declare function handleWebSearch(sb: SupabaseClient, args: Record<string, unknown>, _storeId?: string): Promise<{
3
+ success: boolean;
4
+ error: string;
5
+ data?: undefined;
6
+ } | {
7
+ success: boolean;
8
+ data: {
9
+ query: string;
10
+ results: any;
11
+ autopromptString: any;
12
+ };
13
+ error?: undefined;
14
+ }>;
15
+ export declare function handleTelemetry(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<{
16
+ success: boolean;
17
+ error: string;
18
+ data?: undefined;
19
+ } | {
20
+ success: boolean;
21
+ data: any;
22
+ error?: undefined;
23
+ }>;
@@ -0,0 +1,227 @@
1
+ export async function handleWebSearch(sb, args, _storeId) {
2
+ const query = args.query;
3
+ const numResults = args.num_results || 5;
4
+ // Read from platform_secrets table first, fall back to env var
5
+ const { data: secret } = await sb.from("platform_secrets").select("value").eq("key", "exa_api_key").single();
6
+ const exaApiKey = secret?.value || process.env["EXA_API_KEY"];
7
+ if (!exaApiKey) {
8
+ return { success: false, error: "Exa API key not configured. Add 'exa_api_key' to platform_secrets table." };
9
+ }
10
+ if (!query) {
11
+ return { success: false, error: "Query parameter is required" };
12
+ }
13
+ try {
14
+ const response = await fetch("https://api.exa.ai/search", {
15
+ method: "POST",
16
+ headers: {
17
+ "Content-Type": "application/json",
18
+ "x-api-key": exaApiKey
19
+ },
20
+ body: JSON.stringify({
21
+ query,
22
+ numResults,
23
+ useAutoprompt: true,
24
+ type: "auto"
25
+ })
26
+ });
27
+ if (!response.ok) {
28
+ const errorText = await response.text();
29
+ return { success: false, error: `Exa API error: ${response.status} - ${errorText}` };
30
+ }
31
+ const data = await response.json();
32
+ return {
33
+ success: true,
34
+ data: {
35
+ query,
36
+ results: data.results || [],
37
+ autopromptString: data.autopromptString
38
+ }
39
+ };
40
+ }
41
+ catch (err) {
42
+ return { success: false, error: `Web search failed: ${err}` };
43
+ }
44
+ }
45
+ export async function handleTelemetry(sb, args, storeId) {
46
+ const sid = storeId;
47
+ const hoursBack = args.hours_back || 24;
48
+ const limit = Math.min(args.limit || 50, 200);
49
+ switch (args.action) {
50
+ // ---- conversation_detail: Full conversation with messages + audit entries ----
51
+ case "conversation_detail": {
52
+ const convId = args.conversation_id;
53
+ if (!convId)
54
+ return { success: false, error: "conversation_id is required" };
55
+ const [convResult, msgResult, auditResult] = await Promise.all([
56
+ sb.from("ai_conversations").select("*").eq("id", convId).eq("store_id", sid).single(),
57
+ sb.from("ai_messages").select("*").eq("conversation_id", convId).order("created_at", { ascending: true }),
58
+ sb.from("audit_logs").select("id, action, severity, duration_ms, status_code, error_message, resource_id, input_tokens, output_tokens, model, created_at")
59
+ .eq("conversation_id", convId).order("created_at", { ascending: true }).limit(200)
60
+ ]);
61
+ if (convResult.error)
62
+ return { success: false, error: convResult.error.message };
63
+ return {
64
+ success: true,
65
+ data: {
66
+ conversation: convResult.data,
67
+ messages: msgResult.data || [],
68
+ audit_entries: auditResult.data || [],
69
+ message_count: msgResult.data?.length || 0,
70
+ audit_count: auditResult.data?.length || 0
71
+ }
72
+ };
73
+ }
74
+ // ---- conversations: List recent conversations ----
75
+ case "conversations": {
76
+ const convLimit = Math.min(args.limit || 20, 100);
77
+ let q = sb.from("ai_conversations")
78
+ .select("*")
79
+ .eq("store_id", sid)
80
+ .gte("created_at", new Date(Date.now() - hoursBack * 3600_000).toISOString())
81
+ .order("created_at", { ascending: false })
82
+ .limit(convLimit);
83
+ if (args.agent_id)
84
+ q = q.eq("agent_id", args.agent_id);
85
+ const { data, error } = await q;
86
+ return error ? { success: false, error: error.message } : { success: true, data: { count: data?.length || 0, conversations: data } };
87
+ }
88
+ // ---- agent_performance: Agent-level analytics via RPC ----
89
+ case "agent_performance": {
90
+ const agentId = args.agent_id;
91
+ if (!agentId)
92
+ return { success: false, error: "agent_id is required" };
93
+ // Verify agent belongs to this store
94
+ const { data: conv } = await sb.from("ai_conversations").select("id").eq("agent_id", agentId).eq("store_id", sid).limit(1);
95
+ if (!conv?.length)
96
+ return { success: false, error: "Agent not found for this store" };
97
+ const days = args.days || 7;
98
+ const { data, error } = await sb.rpc("get_agent_analytics", { p_agent_id: agentId, p_days: days });
99
+ return error ? { success: false, error: error.message } : { success: true, data };
100
+ }
101
+ // ---- tool_analytics: Per-tool performance metrics via RPC ----
102
+ case "tool_analytics": {
103
+ const { data, error } = await sb.rpc("get_tool_analytics", {
104
+ p_store_id: sid,
105
+ p_hours_back: hoursBack,
106
+ p_tool_name: args.tool_name || null
107
+ });
108
+ return error ? { success: false, error: error.message } : { success: true, data };
109
+ }
110
+ // ---- tool_timeline: Time-bucketed tool metrics via RPC ----
111
+ case "tool_timeline": {
112
+ const bucketMinutes = args.bucket_minutes || 15;
113
+ const { data, error } = await sb.rpc("get_tool_timeline", {
114
+ p_store_id: sid,
115
+ p_hours_back: hoursBack,
116
+ p_bucket_minutes: bucketMinutes,
117
+ p_tool_name: args.tool_name || null
118
+ });
119
+ return error ? { success: false, error: error.message } : { success: true, data };
120
+ }
121
+ // ---- trace: Full trace reconstruction via RPC ----
122
+ case "trace": {
123
+ const traceId = args.trace_id;
124
+ if (!traceId)
125
+ return { success: false, error: "trace_id is required" };
126
+ // Verify trace belongs to this store
127
+ const { data: traceLog } = await sb.from("audit_logs").select("id").eq("trace_id", traceId).eq("store_id", sid).limit(1);
128
+ if (!traceLog?.length)
129
+ return { success: false, error: "Trace not found for this store" };
130
+ const { data, error } = await sb.rpc("get_trace", { p_trace_id: traceId });
131
+ return error ? { success: false, error: error.message } : { success: true, data };
132
+ }
133
+ // ---- span_detail: Individual span deep-dive via RPC ----
134
+ case "span_detail": {
135
+ const spanId = args.span_id;
136
+ if (!spanId)
137
+ return { success: false, error: "span_id is required" };
138
+ // Verify span belongs to this store via audit_logs
139
+ const { data: spanLog } = await sb.from("audit_logs").select("id").eq("id", spanId).eq("store_id", sid).limit(1);
140
+ if (!spanLog?.length)
141
+ return { success: false, error: "Span not found for this store" };
142
+ const { data, error } = await sb.rpc("get_tool_trace_detail", { p_span_id: spanId });
143
+ return error ? { success: false, error: error.message } : { success: true, data };
144
+ }
145
+ // ---- error_patterns: Error correlation + burst detection via RPC ----
146
+ case "error_patterns": {
147
+ const { data, error } = await sb.rpc("get_tool_error_patterns", {
148
+ p_store_id: sid,
149
+ p_hours_back: hoursBack
150
+ });
151
+ return error ? { success: false, error: error.message } : { success: true, data };
152
+ }
153
+ // ---- token_usage: Token consumption by model/day ----
154
+ case "token_usage": {
155
+ const cutoff = new Date(Date.now() - hoursBack * 3600_000).toISOString();
156
+ // Build base query — if agent_id is provided, get conversation IDs first
157
+ let conversationFilter = null;
158
+ if (args.agent_id) {
159
+ const { data: convs } = await sb.from("ai_conversations")
160
+ .select("id").eq("agent_id", args.agent_id).eq("store_id", sid);
161
+ conversationFilter = convs?.map(c => c.id) || [];
162
+ }
163
+ let q = sb.from("audit_logs")
164
+ .select("model, input_tokens, output_tokens, total_cost, created_at")
165
+ .eq("store_id", sid)
166
+ .gte("created_at", cutoff)
167
+ .not("input_tokens", "is", null);
168
+ if (conversationFilter !== null) {
169
+ if (conversationFilter.length === 0)
170
+ return { success: true, data: { rows: [], summary: { total_input: 0, total_output: 0, total_cost: 0 } } };
171
+ q = q.in("conversation_id", conversationFilter);
172
+ }
173
+ const { data, error } = await q.order("created_at", { ascending: false }).limit(1000);
174
+ if (error)
175
+ return { success: false, error: error.message };
176
+ // Aggregate in-memory by model + day
177
+ const buckets = {};
178
+ for (const row of data || []) {
179
+ const day = row.created_at.substring(0, 10);
180
+ const model = row.model || "unknown";
181
+ const key = `${model}|${day}`;
182
+ if (!buckets[key])
183
+ buckets[key] = { model, day, requests: 0, input_tokens: 0, output_tokens: 0, total_cost: 0 };
184
+ buckets[key].requests++;
185
+ buckets[key].input_tokens += row.input_tokens || 0;
186
+ buckets[key].output_tokens += row.output_tokens || 0;
187
+ buckets[key].total_cost += parseFloat(row.total_cost || "0");
188
+ }
189
+ const rows = Object.values(buckets).sort((a, b) => b.day.localeCompare(a.day) || b.total_cost - a.total_cost);
190
+ const summary = rows.reduce((acc, r) => ({
191
+ total_input: acc.total_input + r.input_tokens,
192
+ total_output: acc.total_output + r.output_tokens,
193
+ total_cost: acc.total_cost + r.total_cost,
194
+ total_requests: acc.total_requests + r.requests
195
+ }), { total_input: 0, total_output: 0, total_cost: 0, total_requests: 0 });
196
+ return { success: true, data: { rows, summary, hours_back: hoursBack } };
197
+ }
198
+ // ---- sources: List all telemetry sources with counts ----
199
+ case "sources": {
200
+ const cutoff = new Date(Date.now() - hoursBack * 3600_000).toISOString();
201
+ const { data, error } = await sb.from("audit_logs")
202
+ .select("source, severity, created_at")
203
+ .eq("store_id", sid)
204
+ .gte("created_at", cutoff)
205
+ .not("source", "is", null)
206
+ .limit(1000);
207
+ if (error)
208
+ return { success: false, error: error.message };
209
+ // Aggregate by source
210
+ const sourceMap = {};
211
+ for (const row of data || []) {
212
+ const src = row.source;
213
+ if (!sourceMap[src])
214
+ sourceMap[src] = { source: src, count: 0, errors: 0, last_seen: row.created_at };
215
+ sourceMap[src].count++;
216
+ if (row.severity === "error")
217
+ sourceMap[src].errors++;
218
+ if (row.created_at > sourceMap[src].last_seen)
219
+ sourceMap[src].last_seen = row.created_at;
220
+ }
221
+ const sources = Object.values(sourceMap).sort((a, b) => b.count - a.count);
222
+ return { success: true, data: { sources, total_entries: data?.length || 0, hours_back: hoursBack } };
223
+ }
224
+ default:
225
+ return { success: false, error: `Unknown telemetry action: ${args.action}. Available: conversation_detail, conversations, agent_performance, tool_analytics, tool_timeline, trace, span_detail, error_patterns, token_usage, sources. For activity logs and inventory changes, use the audit_trail tool instead.` };
226
+ }
227
+ }
@@ -0,0 +1,19 @@
1
+ import type { SupabaseClient } from "@supabase/supabase-js";
2
+ export declare function handlePurchaseOrders(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<{
3
+ success: boolean;
4
+ error: string;
5
+ data?: undefined;
6
+ } | {
7
+ success: boolean;
8
+ data: any;
9
+ error?: undefined;
10
+ }>;
11
+ export declare function handleTransfers(sb: SupabaseClient, args: Record<string, unknown>, storeId?: string): Promise<{
12
+ success: boolean;
13
+ error: string;
14
+ data?: undefined;
15
+ } | {
16
+ success: boolean;
17
+ data: any;
18
+ error?: undefined;
19
+ }>;