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
package/dist/setup.js ADDED
@@ -0,0 +1,181 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * SwagManager MCP — Interactive Setup
4
+ *
5
+ * Detects installed MCP-compatible CLIs and writes config for each.
6
+ * Usage: npx swagmanager-mcp setup
7
+ */
8
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
9
+ import { homedir } from "os";
10
+ import { dirname, join } from "path";
11
+ import { createInterface } from "readline";
12
+ const home = homedir();
13
+ const CLI_TARGETS = [
14
+ {
15
+ name: "Claude Code",
16
+ configPath: join(home, ".claude", "settings.json"),
17
+ configKey: "mcpServers",
18
+ detect: () => existsSync(join(home, ".claude")),
19
+ format: (servers) => servers,
20
+ },
21
+ {
22
+ name: "Claude Desktop",
23
+ configPath: process.platform === "darwin"
24
+ ? join(home, "Library", "Application Support", "Claude", "claude_desktop_config.json")
25
+ : join(home, "AppData", "Roaming", "Claude", "claude_desktop_config.json"),
26
+ configKey: "mcpServers",
27
+ detect: () => existsSync(process.platform === "darwin"
28
+ ? join(home, "Library", "Application Support", "Claude")
29
+ : join(home, "AppData", "Roaming", "Claude")),
30
+ format: (servers) => servers,
31
+ },
32
+ {
33
+ name: "Cursor",
34
+ configPath: join(home, ".cursor", "mcp.json"),
35
+ configKey: "mcpServers",
36
+ detect: () => existsSync(join(home, ".cursor")),
37
+ format: (servers) => servers,
38
+ },
39
+ {
40
+ name: "Windsurf",
41
+ configPath: join(home, ".codeium", "windsurf", "mcp_config.json"),
42
+ configKey: "mcpServers",
43
+ detect: () => existsSync(join(home, ".codeium", "windsurf")),
44
+ format: (servers) => servers,
45
+ },
46
+ {
47
+ name: "Gemini CLI",
48
+ configPath: join(home, ".gemini", "settings.json"),
49
+ configKey: "mcpServers",
50
+ detect: () => existsSync(join(home, ".gemini")),
51
+ format: (servers) => servers,
52
+ },
53
+ ];
54
+ // ============================================================================
55
+ // HELPERS
56
+ // ============================================================================
57
+ function readJSON(path) {
58
+ try {
59
+ return JSON.parse(readFileSync(path, "utf-8"));
60
+ }
61
+ catch {
62
+ return {};
63
+ }
64
+ }
65
+ function writeJSON(path, data) {
66
+ const dir = dirname(path);
67
+ if (!existsSync(dir))
68
+ mkdirSync(dir, { recursive: true });
69
+ writeFileSync(path, JSON.stringify(data, null, 2) + "\n", "utf-8");
70
+ }
71
+ function prompt(rl, question, defaultValue) {
72
+ const suffix = defaultValue ? ` (${defaultValue})` : "";
73
+ return new Promise((resolve) => {
74
+ rl.question(`${question}${suffix}: `, (answer) => {
75
+ resolve(answer.trim() || defaultValue || "");
76
+ });
77
+ });
78
+ }
79
+ function promptYN(rl, question, defaultYes = true) {
80
+ const hint = defaultYes ? "[Y/n]" : "[y/N]";
81
+ return new Promise((resolve) => {
82
+ rl.question(`${question} ${hint} `, (answer) => {
83
+ const a = answer.trim().toLowerCase();
84
+ if (a === "")
85
+ resolve(defaultYes);
86
+ else
87
+ resolve(a === "y" || a === "yes");
88
+ });
89
+ });
90
+ }
91
+ // ============================================================================
92
+ // MAIN
93
+ // ============================================================================
94
+ export async function runSetup() {
95
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
96
+ console.log("");
97
+ console.log(" SwagManager MCP — Setup");
98
+ console.log(" ═══════════════════════");
99
+ console.log("");
100
+ // Detect installed CLIs
101
+ const detected = CLI_TARGETS.filter((t) => t.detect());
102
+ const notDetected = CLI_TARGETS.filter((t) => !t.detect());
103
+ if (detected.length > 0) {
104
+ console.log(" Detected CLIs:");
105
+ detected.forEach((t) => console.log(` + ${t.name}`));
106
+ }
107
+ if (notDetected.length > 0) {
108
+ console.log(" Not found:");
109
+ notDetected.forEach((t) => console.log(` - ${t.name}`));
110
+ }
111
+ console.log("");
112
+ if (detected.length === 0) {
113
+ console.log(" No supported MCP clients detected.");
114
+ console.log(" Install Claude Code, Claude Desktop, Cursor, Windsurf, or Gemini CLI first.");
115
+ rl.close();
116
+ return;
117
+ }
118
+ // Collect credentials
119
+ console.log(" Enter your Supabase credentials:");
120
+ console.log("");
121
+ const supabaseUrl = await prompt(rl, " Supabase URL");
122
+ if (!supabaseUrl) {
123
+ console.log(" Supabase URL is required. Aborting.");
124
+ rl.close();
125
+ return;
126
+ }
127
+ const supabaseKey = await prompt(rl, " Supabase Service Role Key");
128
+ if (!supabaseKey) {
129
+ console.log(" Service Role Key is required. Aborting.");
130
+ rl.close();
131
+ return;
132
+ }
133
+ const storeId = await prompt(rl, " Store ID (optional, press enter to skip)");
134
+ console.log("");
135
+ // Build MCP server entry
136
+ const serverEntry = {
137
+ type: "stdio",
138
+ command: "npx",
139
+ args: ["-y", "swagmanager-mcp"],
140
+ env: {
141
+ SUPABASE_URL: supabaseUrl,
142
+ SUPABASE_SERVICE_ROLE_KEY: supabaseKey,
143
+ ...(storeId ? { STORE_ID: storeId } : {}),
144
+ },
145
+ };
146
+ // Install to each detected CLI
147
+ let installed = 0;
148
+ for (const target of detected) {
149
+ const install = await promptYN(rl, ` Install to ${target.name}?`);
150
+ if (!install)
151
+ continue;
152
+ const config = readJSON(target.configPath);
153
+ if (!config[target.configKey])
154
+ config[target.configKey] = {};
155
+ // Check for existing entry
156
+ if (config[target.configKey].swagmanager) {
157
+ const overwrite = await promptYN(rl, ` swagmanager already configured in ${target.name}. Overwrite?`, false);
158
+ if (!overwrite)
159
+ continue;
160
+ }
161
+ config[target.configKey].swagmanager = target.format(serverEntry);
162
+ writeJSON(target.configPath, config);
163
+ console.log(` Wrote ${target.configPath}`);
164
+ installed++;
165
+ }
166
+ console.log("");
167
+ if (installed > 0) {
168
+ console.log(` Done! Installed to ${installed} CLI${installed > 1 ? "s" : ""}.`);
169
+ console.log(" Restart your CLI(s) to load the MCP server.");
170
+ }
171
+ else {
172
+ console.log(" No changes made.");
173
+ }
174
+ console.log("");
175
+ rl.close();
176
+ }
177
+ // Run if called directly
178
+ const isDirectRun = process.argv[1]?.includes("setup");
179
+ if (isDirectRun) {
180
+ runSetup().catch(console.error);
181
+ }
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Shared Agent Core — single source of truth for CLI + server agent
3
+ *
4
+ * Pure TypeScript, no runtime-specific APIs (no Deno.env, no process.env, no fs).
5
+ * Both the CLI (Node.js) and server (Fly container) import from here.
6
+ */
7
+ export interface LoopCheckResult {
8
+ blocked: boolean;
9
+ reason?: string;
10
+ }
11
+ export interface BailCheckResult {
12
+ shouldBail: boolean;
13
+ message?: string;
14
+ }
15
+ export interface CostInfo {
16
+ inputTokens: number;
17
+ outputTokens: number;
18
+ costUsd: number;
19
+ cacheCreation: number;
20
+ cacheRead: number;
21
+ }
22
+ /**
23
+ * Controls which tools the model can/must use:
24
+ * - "auto": Model decides whether to use tools (default)
25
+ * - "any": Model must use at least one tool
26
+ * - "none": Model must not use any tools (text-only response)
27
+ * - { type: "tool", name: string }: Model must use the specified tool
28
+ */
29
+ export type ToolChoice = "auto" | "any" | "none" | {
30
+ type: "tool";
31
+ name: string;
32
+ };
33
+ /**
34
+ * Resolve the effective tool_choice for a given turn.
35
+ *
36
+ * Priority:
37
+ * 1. Explicit override from caller (toolChoice option)
38
+ * 2. Loop detection: if last 3 turns all used the same tool, force "none"
39
+ * 3. Keyword detection: if user message mentions a tool name, force that tool
40
+ * 4. Default: "auto"
41
+ */
42
+ export declare function resolveToolChoice(opts: {
43
+ toolChoice?: ToolChoice;
44
+ turnCount: number;
45
+ recentToolUses: string[];
46
+ availableToolNames: string[];
47
+ userMessage: string;
48
+ }): ToolChoice;
49
+ export interface ContextManagementConfig {
50
+ betas: string[];
51
+ config: {
52
+ edits: Array<Record<string, unknown>>;
53
+ };
54
+ }
55
+ /** Compaction trigger threshold — shared so agent loops can track budget */
56
+ export declare const COMPACTION_TRIGGER_TOKENS = 120000;
57
+ /** Max cumulative tokens before forcing wrap-up (prevents runaway compaction cost) */
58
+ export declare const COMPACTION_TOTAL_BUDGET = 2000000;
59
+ /** Default session cost budget in USD — Infinity = no limit (budget enforcement disabled by default) */
60
+ export declare const DEFAULT_SESSION_COST_BUDGET_USD: number;
61
+ /**
62
+ * Provider-aware compaction configuration.
63
+ * - Anthropic/Bedrock: native server-side compaction via compact_20260112
64
+ * - OpenAI/Gemini: Haiku-based summarization (same instructions, same format)
65
+ */
66
+ export interface CompactionConfig {
67
+ triggerTokens: number;
68
+ totalBudget: number;
69
+ isNative: boolean;
70
+ }
71
+ export declare function getCompactionConfig(model: string): CompactionConfig;
72
+ /**
73
+ * Returns Anthropic beta flags and context_management config for the given model.
74
+ * - Opus 4.6 / Sonnet 4.6: compact at 120K (pause after) + clear thinking + clear tools at 80K/keep 3
75
+ * - All other Claude models: clear thinking + clear tools at 80K/keep 3
76
+ * - Non-Anthropic models (Gemini, OpenAI): no betas, no context management
77
+ */
78
+ export declare function getContextManagement(model: string): ContextManagementConfig;
79
+ export declare function getMaxOutputTokens(model: string, agentMax?: number): number;
80
+ /**
81
+ * Add prompt cache breakpoints to tools and messages.
82
+ * Uses 2 of 4 allowed breakpoints:
83
+ * - Last tool definition
84
+ * - Turn boundary (second-to-last message)
85
+ * System prompt caching is handled by the caller.
86
+ */
87
+ export declare function addPromptCaching(tools: Array<Record<string, unknown>>, messages: Array<Record<string, unknown>>): {
88
+ tools: Array<Record<string, unknown>>;
89
+ messages: Array<Record<string, unknown>>;
90
+ };
91
+ export declare class LoopDetector {
92
+ private history;
93
+ private consecutiveErrors;
94
+ private turnErrors;
95
+ private turnHadErrors;
96
+ private sessionErrors;
97
+ private failedStrategies;
98
+ private consecutiveFailedTurns;
99
+ private totalSessionErrors;
100
+ static IDENTICAL_CALL_LIMIT: number;
101
+ static CONSECUTIVE_ERROR_LIMIT: number;
102
+ static TURN_ERROR_LIMIT: number;
103
+ static WINDOW: number;
104
+ static SESSION_TOOL_ERROR_LIMIT: number;
105
+ static CONSECUTIVE_FAILED_TURN_LIMIT: number;
106
+ /** Get the error-tracking key for a tool call. Tools with an `action` param
107
+ * are tracked per-action so e.g. voice/speak failing won't block voice/music_compose. */
108
+ private errorKey;
109
+ recordCall(name: string, input: Record<string, unknown>): LoopCheckResult;
110
+ recordResult(name: string, success: boolean, input?: Record<string, unknown>): void;
111
+ endTurn(): BailCheckResult;
112
+ resetTurn(): void;
113
+ reset(): void;
114
+ getSessionStats(): {
115
+ totalErrors: number;
116
+ failedStrategies: number;
117
+ consecutiveFailedTurns: number;
118
+ };
119
+ }
120
+ export interface ThinkingConfig {
121
+ type: "enabled" | "disabled" | "adaptive";
122
+ budget_tokens?: number;
123
+ }
124
+ /**
125
+ * Returns the thinking configuration and required beta string for the given model.
126
+ * - Opus 4.6: adaptive thinking (no budget needed)
127
+ * - Sonnet/Haiku: enabled with 10000 token budget
128
+ * - budget_tokens must be strictly < max_tokens
129
+ */
130
+ export declare function getThinkingConfig(model: string, enabled: boolean): {
131
+ thinking: ThinkingConfig;
132
+ beta: string;
133
+ };
134
+ export declare const MODEL_PRICING: Record<string, {
135
+ inputPer1M: number;
136
+ outputPer1M: number;
137
+ thinkingPer1M?: number;
138
+ }>;
139
+ export declare function estimateCostUsd(inputTokens: number, outputTokens: number, model: string, thinkingTokens?: number, cacheReadTokens?: number, cacheCreationTokens?: number): number;
140
+ /**
141
+ * Route to cheaper model when the task is simple enough.
142
+ * Returns the model to actually use.
143
+ */
144
+ export declare function routeModel(message: string, requestedModel: string, forceModel?: boolean): string;
145
+ export type ErrorCategory = "RATE_LIMIT" | "TIMEOUT" | "AUTH" | "MALFORMED" | "PROVIDER_DOWN" | "NETWORK" | "UNKNOWN";
146
+ export declare function categorizeError(err: unknown): {
147
+ category: ErrorCategory;
148
+ retryable: boolean;
149
+ };
150
+ export declare function isRetryableError(err: unknown): boolean;
151
+ /** @deprecated — Anthropic context_management handles limits. Use SAFETY_MAX_CHARS in tool-dispatch instead. */
152
+ export declare function truncateToolResult(content: string, maxChars: number): string;
153
+ /** @deprecated — Anthropic context_management handles limits. */
154
+ export declare function getMaxToolResultChars(contextConfig?: {
155
+ max_tool_result_chars?: number;
156
+ } | null): number;
157
+ export declare function sanitizeError(err: unknown): string;