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,91 @@
1
+ /**
2
+ * Agent Definitions — custom agent types from markdown files
3
+ *
4
+ * Matches Claude Code's .claude/agents/ pattern:
5
+ *
6
+ * .whale/agents/reviewer.md:
7
+ * ---
8
+ * description: Reviews code for security issues
9
+ * tools: read_file, glob, grep
10
+ * ---
11
+ * You are a security review agent...
12
+ *
13
+ * Load order:
14
+ * 1. ~/.swagmanager/agents/*.md (global)
15
+ * 2. .whale/agents/*.md (local, overrides global)
16
+ */
17
+ import { existsSync, readdirSync, readFileSync } from "fs";
18
+ import { join, basename } from "path";
19
+ import { homedir } from "os";
20
+ // ============================================================================
21
+ // PATHS
22
+ // ============================================================================
23
+ const GLOBAL_AGENTS_DIR = join(homedir(), ".swagmanager", "agents");
24
+ const LOCAL_AGENTS_DIR = ".whale/agents";
25
+ // ============================================================================
26
+ // LOADING
27
+ // ============================================================================
28
+ function parseFrontmatter(content) {
29
+ if (!content.startsWith("---"))
30
+ return { body: content.trim() };
31
+ const endIndex = content.indexOf("---", 3);
32
+ if (endIndex === -1)
33
+ return { body: content.trim() };
34
+ const frontmatter = content.slice(3, endIndex).trim();
35
+ const body = content.slice(endIndex + 3).trim();
36
+ // Parse description
37
+ const descMatch = frontmatter.match(/description:\s*(.+)/i);
38
+ const description = descMatch?.[1]?.trim();
39
+ // Parse tools (comma-separated)
40
+ const toolsMatch = frontmatter.match(/tools:\s*(.+)/i);
41
+ const tools = toolsMatch?.[1]?.split(",").map(t => t.trim()).filter(Boolean);
42
+ return { description, tools, body };
43
+ }
44
+ function loadAgentsFromDir(dir, source) {
45
+ if (!existsSync(dir))
46
+ return [];
47
+ const agents = [];
48
+ try {
49
+ const files = readdirSync(dir).filter(f => f.endsWith(".md"));
50
+ for (const file of files) {
51
+ const name = basename(file, ".md");
52
+ const path = join(dir, file);
53
+ try {
54
+ const content = readFileSync(path, "utf-8");
55
+ const { description, tools, body } = parseFrontmatter(content);
56
+ agents.push({
57
+ name,
58
+ prompt: body,
59
+ description,
60
+ tools,
61
+ source,
62
+ });
63
+ }
64
+ catch { /* skip unreadable */ }
65
+ }
66
+ }
67
+ catch { /* skip inaccessible */ }
68
+ return agents;
69
+ }
70
+ export function loadAgentDefinitions() {
71
+ const agents = [];
72
+ // Load global agents first
73
+ agents.push(...loadAgentsFromDir(GLOBAL_AGENTS_DIR, "global"));
74
+ // Load local agents (override global with same name)
75
+ const localDir = join(process.cwd(), LOCAL_AGENTS_DIR);
76
+ const localAgents = loadAgentsFromDir(localDir, "local");
77
+ for (const local of localAgents) {
78
+ const existingIndex = agents.findIndex(a => a.name === local.name);
79
+ if (existingIndex >= 0) {
80
+ agents[existingIndex] = local;
81
+ }
82
+ else {
83
+ agents.push(local);
84
+ }
85
+ }
86
+ return agents.sort((a, b) => a.name.localeCompare(b.name));
87
+ }
88
+ export function getAgentDefinition(name) {
89
+ const agents = loadAgentDefinitions();
90
+ return agents.find(a => a.name === name);
91
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Agent Event System — decoupled event-driven architecture for smooth UI
3
+ *
4
+ * The agent loop emits typed events; the UI subscribes and renders.
5
+ * This prevents tight coupling and enables proper batching.
6
+ */
7
+ import { EventEmitter } from "events";
8
+ import type Anthropic from "@anthropic-ai/sdk";
9
+ export interface AgentTextEvent {
10
+ type: "text";
11
+ text: string;
12
+ accumulated: string;
13
+ }
14
+ export interface AgentToolStartEvent {
15
+ type: "tool_start";
16
+ id: string;
17
+ name: string;
18
+ }
19
+ export interface AgentToolEndEvent {
20
+ type: "tool_end";
21
+ id: string;
22
+ name: string;
23
+ success: boolean;
24
+ result?: string;
25
+ input?: Record<string, unknown>;
26
+ durationMs: number;
27
+ }
28
+ export interface AgentUsageEvent {
29
+ type: "usage";
30
+ inputTokens: number;
31
+ outputTokens: number;
32
+ model?: string;
33
+ costUsd?: number;
34
+ cacheReadTokens?: number;
35
+ cacheCreationTokens?: number;
36
+ }
37
+ export interface AgentDoneEvent {
38
+ type: "done";
39
+ text: string;
40
+ messages: Anthropic.MessageParam[];
41
+ }
42
+ export interface AgentErrorEvent {
43
+ type: "error";
44
+ error: string;
45
+ }
46
+ export interface AgentCompactEvent {
47
+ type: "compact";
48
+ before: number;
49
+ after: number;
50
+ tokensSaved: number;
51
+ }
52
+ export interface ToolOutputEvent {
53
+ type: "tool_output";
54
+ toolName: string;
55
+ line: string;
56
+ }
57
+ export interface SubagentStartEvent {
58
+ type: "subagent_start";
59
+ id: string;
60
+ agentType: string;
61
+ model: string;
62
+ description: string;
63
+ }
64
+ export interface SubagentProgressEvent {
65
+ type: "subagent_progress";
66
+ id: string;
67
+ agentType: string;
68
+ message: string;
69
+ turn?: number;
70
+ toolName?: string;
71
+ }
72
+ export interface SubagentDoneEvent {
73
+ type: "subagent_done";
74
+ id: string;
75
+ agentType: string;
76
+ success: boolean;
77
+ output: string;
78
+ tokens: {
79
+ input: number;
80
+ output: number;
81
+ };
82
+ tools: string[];
83
+ durationMs: number;
84
+ }
85
+ export interface SubagentToolStartEvent {
86
+ type: "subagent_tool_start";
87
+ agentId: string;
88
+ toolName: string;
89
+ toolInput?: Record<string, unknown>;
90
+ }
91
+ export interface SubagentToolEndEvent {
92
+ type: "subagent_tool_end";
93
+ agentId: string;
94
+ toolName: string;
95
+ success: boolean;
96
+ durationMs: number;
97
+ }
98
+ export interface TeamStartEvent {
99
+ type: "team_start";
100
+ teamId: string;
101
+ name: string;
102
+ teammateCount: number;
103
+ taskCount: number;
104
+ }
105
+ export interface TeamProgressEvent {
106
+ type: "team_progress";
107
+ teamId: string;
108
+ teammateId: string;
109
+ teammateName: string;
110
+ message: string;
111
+ taskId?: string;
112
+ }
113
+ export interface TeamTaskEvent {
114
+ type: "team_task";
115
+ teamId: string;
116
+ teammateId: string;
117
+ taskId: string;
118
+ taskDescription: string;
119
+ status: "started" | "completed" | "failed";
120
+ result?: string;
121
+ }
122
+ export interface TeamDoneEvent {
123
+ type: "team_done";
124
+ teamId: string;
125
+ success: boolean;
126
+ summary: string;
127
+ tasksCompleted: number;
128
+ tasksTotal: number;
129
+ tokens: {
130
+ input: number;
131
+ output: number;
132
+ };
133
+ durationMs: number;
134
+ }
135
+ export type AgentEvent = AgentTextEvent | AgentToolStartEvent | AgentToolEndEvent | AgentUsageEvent | AgentDoneEvent | AgentErrorEvent | AgentCompactEvent | ToolOutputEvent | SubagentStartEvent | SubagentProgressEvent | SubagentDoneEvent | SubagentToolStartEvent | SubagentToolEndEvent | TeamStartEvent | TeamProgressEvent | TeamTaskEvent | TeamDoneEvent;
136
+ export declare class AgentEventEmitter extends EventEmitter {
137
+ /**
138
+ * Emit text immediately — UI-side handles batching via single flush timer
139
+ */
140
+ emitText(text: string): void;
141
+ /**
142
+ * No-op — kept for interface compat
143
+ */
144
+ flushText(): void;
145
+ emitToolStart(id: string, name: string): void;
146
+ emitToolEnd(id: string, name: string, success: boolean, result: string | undefined, input: Record<string, unknown> | undefined, durationMs: number): void;
147
+ emitUsage(inputTokens: number, outputTokens: number, model?: string, costUsd?: number, cacheReadTokens?: number, cacheCreationTokens?: number): void;
148
+ emitDone(text: string, messages: Anthropic.MessageParam[]): void;
149
+ emitError(error: string): void;
150
+ emitCompact(before: number, after: number, tokensSaved: number): void;
151
+ emitToolOutput(toolName: string, line: string): void;
152
+ emitSubagentStart(id: string, agentType: string, model: string, description: string): void;
153
+ emitSubagentProgress(id: string, agentType: string, message: string, turn?: number, toolName?: string): void;
154
+ emitSubagentDone(id: string, agentType: string, success: boolean, output: string, tokens: {
155
+ input: number;
156
+ output: number;
157
+ }, tools: string[], durationMs: number): void;
158
+ emitSubagentToolStart(agentId: string, toolName: string, toolInput?: Record<string, unknown>): void;
159
+ emitSubagentToolEnd(agentId: string, toolName: string, success: boolean, durationMs: number): void;
160
+ emitTeamStart(teamId: string, name: string, teammateCount: number, taskCount: number): void;
161
+ emitTeamProgress(teamId: string, teammateId: string, teammateName: string, message: string, taskId?: string): void;
162
+ emitTeamTask(teamId: string, teammateId: string, taskId: string, taskDescription: string, status: "started" | "completed" | "failed", result?: string): void;
163
+ emitTeamDone(teamId: string, success: boolean, summary: string, tasksCompleted: number, tasksTotal: number, tokens: {
164
+ input: number;
165
+ output: number;
166
+ }, durationMs: number): void;
167
+ /**
168
+ * Subscribe to events with typed handler
169
+ */
170
+ onEvent(handler: (event: AgentEvent) => void): () => void;
171
+ /**
172
+ * Clean up
173
+ */
174
+ destroy(): void;
175
+ }
176
+ export declare function getGlobalEmitter(): AgentEventEmitter;
177
+ export declare function setGlobalEmitter(emitter: AgentEventEmitter): void;
178
+ export declare function clearGlobalEmitter(): void;
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Agent Event System — decoupled event-driven architecture for smooth UI
3
+ *
4
+ * The agent loop emits typed events; the UI subscribes and renders.
5
+ * This prevents tight coupling and enables proper batching.
6
+ */
7
+ import { EventEmitter } from "events";
8
+ // ============================================================================
9
+ // TYPED EVENT EMITTER
10
+ // ============================================================================
11
+ export class AgentEventEmitter extends EventEmitter {
12
+ /**
13
+ * Emit text immediately — UI-side handles batching via single flush timer
14
+ */
15
+ emitText(text) {
16
+ this.emit("event", {
17
+ type: "text",
18
+ text,
19
+ accumulated: "", // Set by consumer
20
+ });
21
+ }
22
+ /**
23
+ * No-op — kept for interface compat
24
+ */
25
+ flushText() { }
26
+ emitToolStart(id, name) {
27
+ this.flushText(); // Flush pending text before tool
28
+ this.emit("event", { type: "tool_start", id, name });
29
+ }
30
+ emitToolEnd(id, name, success, result, input, durationMs) {
31
+ this.emit("event", {
32
+ type: "tool_end",
33
+ id,
34
+ name,
35
+ success,
36
+ result,
37
+ input,
38
+ durationMs,
39
+ });
40
+ }
41
+ emitUsage(inputTokens, outputTokens, model, costUsd, cacheReadTokens, cacheCreationTokens) {
42
+ this.emit("event", { type: "usage", inputTokens, outputTokens, model, costUsd, cacheReadTokens, cacheCreationTokens });
43
+ }
44
+ emitDone(text, messages) {
45
+ this.flushText();
46
+ this.emit("event", { type: "done", text, messages });
47
+ }
48
+ emitError(error) {
49
+ this.flushText();
50
+ this.emit("event", { type: "error", error });
51
+ }
52
+ emitCompact(before, after, tokensSaved) {
53
+ this.emit("event", { type: "compact", before, after, tokensSaved });
54
+ }
55
+ emitToolOutput(toolName, line) {
56
+ this.emit("event", { type: "tool_output", toolName, line });
57
+ }
58
+ emitSubagentStart(id, agentType, model, description) {
59
+ this.emit("event", { type: "subagent_start", id, agentType, model, description });
60
+ }
61
+ emitSubagentProgress(id, agentType, message, turn, toolName) {
62
+ this.emit("event", {
63
+ type: "subagent_progress",
64
+ id,
65
+ agentType,
66
+ message,
67
+ turn,
68
+ toolName,
69
+ });
70
+ }
71
+ emitSubagentDone(id, agentType, success, output, tokens, tools, durationMs) {
72
+ this.emit("event", {
73
+ type: "subagent_done",
74
+ id,
75
+ agentType,
76
+ success,
77
+ output,
78
+ tokens,
79
+ tools,
80
+ durationMs,
81
+ });
82
+ }
83
+ emitSubagentToolStart(agentId, toolName, toolInput) {
84
+ this.emit("event", {
85
+ type: "subagent_tool_start",
86
+ agentId,
87
+ toolName,
88
+ toolInput,
89
+ });
90
+ }
91
+ emitSubagentToolEnd(agentId, toolName, success, durationMs) {
92
+ this.emit("event", {
93
+ type: "subagent_tool_end",
94
+ agentId,
95
+ toolName,
96
+ success,
97
+ durationMs,
98
+ });
99
+ }
100
+ // ── Team Events ──
101
+ emitTeamStart(teamId, name, teammateCount, taskCount) {
102
+ this.emit("event", {
103
+ type: "team_start",
104
+ teamId,
105
+ name,
106
+ teammateCount,
107
+ taskCount,
108
+ });
109
+ }
110
+ emitTeamProgress(teamId, teammateId, teammateName, message, taskId) {
111
+ this.emit("event", {
112
+ type: "team_progress",
113
+ teamId,
114
+ teammateId,
115
+ teammateName,
116
+ message,
117
+ taskId,
118
+ });
119
+ }
120
+ emitTeamTask(teamId, teammateId, taskId, taskDescription, status, result) {
121
+ this.emit("event", {
122
+ type: "team_task",
123
+ teamId,
124
+ teammateId,
125
+ taskId,
126
+ taskDescription,
127
+ status,
128
+ result,
129
+ });
130
+ }
131
+ emitTeamDone(teamId, success, summary, tasksCompleted, tasksTotal, tokens, durationMs) {
132
+ this.emit("event", {
133
+ type: "team_done",
134
+ teamId,
135
+ success,
136
+ summary,
137
+ tasksCompleted,
138
+ tasksTotal,
139
+ tokens,
140
+ durationMs,
141
+ });
142
+ }
143
+ /**
144
+ * Subscribe to events with typed handler
145
+ */
146
+ onEvent(handler) {
147
+ this.on("event", handler);
148
+ return () => this.off("event", handler);
149
+ }
150
+ /**
151
+ * Clean up
152
+ */
153
+ destroy() {
154
+ this.removeAllListeners();
155
+ }
156
+ }
157
+ // ============================================================================
158
+ // GLOBAL EMITTER (for subagents to report progress)
159
+ // ============================================================================
160
+ let globalEmitter = null;
161
+ export function getGlobalEmitter() {
162
+ if (!globalEmitter) {
163
+ globalEmitter = new AgentEventEmitter();
164
+ }
165
+ return globalEmitter;
166
+ }
167
+ export function setGlobalEmitter(emitter) {
168
+ globalEmitter = emitter;
169
+ }
170
+ export function clearGlobalEmitter() {
171
+ if (globalEmitter) {
172
+ globalEmitter.destroy();
173
+ globalEmitter = null;
174
+ }
175
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Agent Loop — local-first agentic CLI with server tool support
3
+ *
4
+ * LLM calls proxy through the `agent-proxy` edge function (server holds API key).
5
+ * User authenticates via Supabase JWT. Local tools execute on the client.
6
+ * Server tools execute via direct import of executeTool() (same codebase).
7
+ *
8
+ * Fallback: if proxy is unavailable and ANTHROPIC_API_KEY is set, calls directly.
9
+ *
10
+ * This file is the thin orchestrator + re-export facade. Domain logic lives in:
11
+ * - memory-manager.ts (loadMemory, addMemory, removeMemory, listMemories)
12
+ * - git-context.ts (gatherGitContext, refreshGitContext)
13
+ * - claude-md-loader.ts (loadClaudeMd, reloadClaudeMd)
14
+ * - permission-modes.ts (PermissionMode, set/get/isAllowed)
15
+ * - model-manager.ts (setModel, getModel, getModelShortName, estimateCostUsd)
16
+ * - session-persistence.ts (SessionMeta, save/load/list/find sessions)
17
+ * - system-prompt.ts (buildSystemPrompt)
18
+ */
19
+ import type Anthropic from "@anthropic-ai/sdk";
20
+ import { getServerStatus, type ServerStatus } from "./server-tools.js";
21
+ import { AgentEventEmitter } from "./agent-events.js";
22
+ import { mcpClientManager } from "./mcp-client.js";
23
+ import { loadMemory, addMemory, removeMemory, listMemories } from "./memory-manager.js";
24
+ import { refreshGitContext } from "./git-context.js";
25
+ import { loadClaudeMd, reloadClaudeMd } from "./claude-md-loader.js";
26
+ import { setPermissionMode, getPermissionMode, isToolAllowedByPermission, type PermissionMode } from "./permission-modes.js";
27
+ import { setModel, getModel, getModelShortName, estimateCostUsd } from "./model-manager.js";
28
+ import { saveSession, loadSession, listSessions, findLatestSessionForCwd, type SessionMeta } from "./session-persistence.js";
29
+ export { loadMemory, addMemory, removeMemory, listMemories };
30
+ export { refreshGitContext };
31
+ export { loadClaudeMd, reloadClaudeMd };
32
+ export { setPermissionMode, getPermissionMode, isToolAllowedByPermission, type PermissionMode };
33
+ export { setModel, getModel, getModelShortName, estimateCostUsd };
34
+ export { saveSession, loadSession, listSessions, findLatestSessionForCwd, type SessionMeta };
35
+ export { getServerStatus, type ServerStatus };
36
+ export { mcpClientManager };
37
+ export { listProcesses, listBackgroundAgents } from "./background-processes.js";
38
+ export { AgentEventEmitter, type AgentEvent } from "./agent-events.js";
39
+ export interface AgentLoopCallbacks {
40
+ onText: (text: string) => void;
41
+ onToolStart: (name: string, input?: Record<string, unknown>) => void;
42
+ onToolResult: (name: string, success: boolean, result: unknown, input?: Record<string, unknown>, durationMs?: number) => void;
43
+ onUsage: (input_tokens: number, output_tokens: number, thinking_tokens?: number, model?: string, costUsd?: number, cacheReadTokens?: number, cacheCreationTokens?: number) => void;
44
+ onDone: (finalMessages: Anthropic.MessageParam[]) => void;
45
+ onError: (error: string, partialMessages?: Anthropic.MessageParam[]) => void;
46
+ onAutoCompact?: (beforeMessages: number, afterMessages: number, tokensSaved: number) => void;
47
+ }
48
+ export interface AgentLoopOptions {
49
+ message: string;
50
+ images?: {
51
+ base64: string;
52
+ mediaType: string;
53
+ }[];
54
+ conversationHistory: Anthropic.MessageParam[];
55
+ callbacks: AgentLoopCallbacks;
56
+ abortSignal?: AbortSignal;
57
+ model?: string;
58
+ emitter?: AgentEventEmitter;
59
+ maxTurns?: number;
60
+ maxBudgetUsd?: number;
61
+ effort?: "low" | "medium" | "high";
62
+ allowedTools?: string[];
63
+ disallowedTools?: string[];
64
+ fallbackModel?: string;
65
+ thinking?: boolean;
66
+ shellSummarization?: boolean;
67
+ cwd?: string;
68
+ }
69
+ export declare function getSessionTokens(): {
70
+ input: number;
71
+ output: number;
72
+ };
73
+ /**
74
+ * Reset all CLI-only session state. Call when starting a new conversation
75
+ * (e.g., /clear command, new print-mode run) to prevent stale token counts,
76
+ * loop detector state, and caches from leaking across sessions.
77
+ *
78
+ * Does NOT reset activeModel or permissionMode — those are user preferences
79
+ * that persist intentionally until explicitly changed.
80
+ */
81
+ export declare function resetSessionState(): void;
82
+ /** Exposed for /status command */
83
+ export declare function getServerToolCount(): Promise<number>;
84
+ export declare function runAgentLoop(opts: AgentLoopOptions): Promise<void>;
85
+ export declare function truncateResult(output: string, maxLen: number): string;
86
+ export declare function classifyToolError(output: string): string;
87
+ export declare function canUseAgent(): {
88
+ ready: boolean;
89
+ reason?: string;
90
+ };