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,199 @@
1
+ /**
2
+ * Anthropic Provider Adapter — direct Anthropic API passthrough.
3
+ *
4
+ * Simplest adapter: system prompt gets cache_control blocks, tools get
5
+ * { name, description, input_schema }, streaming events pass through as-is.
6
+ *
7
+ * Phase 7.1: Also encapsulates thinking config, context management,
8
+ * output token limits, and compaction config for Anthropic/Claude models.
9
+ */
10
+ import Anthropic from "@anthropic-ai/sdk";
11
+ import { sanitizeError } from "../../shared/agent-core.js";
12
+ import { getCapabilities } from "../lib/provider-capabilities.js";
13
+ import { registerProvider } from "./registry.js";
14
+ import { jsonResponse, writeSSEHeaders } from "./shared.js";
15
+ // ============================================================================
16
+ // CONSTANTS — Anthropic-specific model config
17
+ // ============================================================================
18
+ const COMPACTION_TRIGGER_TOKENS = 120_000;
19
+ const COMPACTION_TOTAL_BUDGET = 2_000_000;
20
+ const DEFAULT_OUTPUT_TOKENS = 16384;
21
+ const MODEL_MAX_OUTPUT_TOKENS = {
22
+ "claude-opus-4-6": 128000,
23
+ "claude-sonnet-4-6": 64000,
24
+ "claude-haiku-4-5-20251001": 64000,
25
+ "claude-sonnet-4-5-20250929": 64000,
26
+ "claude-opus-4-5-20251101": 64000,
27
+ "claude-opus-4-1-20250805": 32768,
28
+ "claude-sonnet-4-20250514": 64000,
29
+ "claude-opus-4-20250514": 32768,
30
+ "claude-3-7-sonnet-20250219": 64000,
31
+ "claude-3-haiku-20240307": 4096,
32
+ };
33
+ // ============================================================================
34
+ // ADAPTER
35
+ // ============================================================================
36
+ export class AnthropicAdapter {
37
+ name = "anthropic";
38
+ async handleStream(res, config, corsHeaders) {
39
+ const { model, messages, system, tools, max_tokens, temperature, stream = true, betas, context_management, thinking, tool_choice, documents, } = config;
40
+ const ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
41
+ const anthropic = new Anthropic({ apiKey: ANTHROPIC_API_KEY });
42
+ const apiParams = { model, max_tokens, messages, stream: true };
43
+ if (system) {
44
+ if (typeof system === "string") {
45
+ apiParams.system = [{ type: "text", text: system, cache_control: { type: "ephemeral" } }];
46
+ }
47
+ else {
48
+ apiParams.system = system;
49
+ }
50
+ }
51
+ if (tools?.length) {
52
+ apiParams.tools = tools.map((t) => ({
53
+ name: t.name,
54
+ description: typeof t.description === "string" ? t.description.slice(0, 4096) : "",
55
+ input_schema: t.input_schema,
56
+ }));
57
+ }
58
+ if (temperature !== undefined)
59
+ apiParams.temperature = temperature;
60
+ // Citations API: add beta and documents when source documents are provided
61
+ const effectiveBetas = betas?.length ? [...betas] : [];
62
+ if (documents?.length) {
63
+ if (!effectiveBetas.includes("citations-2025-04-15")) {
64
+ effectiveBetas.push("citations-2025-04-15");
65
+ }
66
+ apiParams.documents = documents;
67
+ }
68
+ if (effectiveBetas.length)
69
+ apiParams.betas = effectiveBetas;
70
+ if (context_management?.edits?.length)
71
+ apiParams.context_management = context_management;
72
+ if (thinking)
73
+ apiParams.thinking = thinking;
74
+ // Map tool_choice to Anthropic format
75
+ if (tool_choice) {
76
+ if (tool_choice === "auto") {
77
+ apiParams.tool_choice = { type: "auto" };
78
+ }
79
+ else if (tool_choice === "any") {
80
+ apiParams.tool_choice = { type: "any" };
81
+ }
82
+ else if (tool_choice === "none") {
83
+ // "none" means no tools — remove tools from request
84
+ delete apiParams.tools;
85
+ }
86
+ else if (typeof tool_choice === "object" && tool_choice.type === "tool") {
87
+ apiParams.tool_choice = { type: "tool", name: tool_choice.name };
88
+ }
89
+ }
90
+ if (!stream) {
91
+ try {
92
+ const response = effectiveBetas.length
93
+ ? await anthropic.beta.messages.create({ ...apiParams, stream: false })
94
+ : await anthropic.messages.create({ ...apiParams, stream: false });
95
+ jsonResponse(res, 200, response, corsHeaders);
96
+ }
97
+ catch (err) {
98
+ jsonResponse(res, 500, { error: sanitizeError(err) }, corsHeaders);
99
+ }
100
+ return;
101
+ }
102
+ // Streaming: defer SSE headers until stream is successfully created
103
+ // so we can return proper HTTP errors if the initial API call fails.
104
+ let heartbeat;
105
+ try {
106
+ const response = effectiveBetas.length
107
+ ? await anthropic.beta.messages.create({ ...apiParams, stream: true })
108
+ : await anthropic.messages.create(apiParams);
109
+ // Stream created successfully — now safe to commit to SSE
110
+ writeSSEHeaders(res, corsHeaders);
111
+ // Heartbeat keeps the connection alive and helps detect dead clients
112
+ heartbeat = setInterval(() => {
113
+ if (!res.writableEnded)
114
+ res.write(":ping\n\n");
115
+ }, 15_000);
116
+ for await (const event of response) {
117
+ res.write(`data: ${JSON.stringify(event)}\n\n`);
118
+ }
119
+ res.write("data: [DONE]\n\n");
120
+ }
121
+ catch (err) {
122
+ if (!res.headersSent) {
123
+ // Haven't started streaming yet — return proper HTTP error
124
+ jsonResponse(res, 502, { error: `anthropic error: ${sanitizeError(err)}` }, corsHeaders);
125
+ }
126
+ else {
127
+ // Mid-stream failure — send error event so client doesn't hang
128
+ res.write(`data: ${JSON.stringify({ type: "error", error: sanitizeError(err) })}\n\n`);
129
+ res.write("data: [DONE]\n\n");
130
+ }
131
+ }
132
+ finally {
133
+ if (heartbeat)
134
+ clearInterval(heartbeat);
135
+ }
136
+ res.end();
137
+ }
138
+ // ---- Provider-specific config methods ----
139
+ getThinkingConfig(model, enabled) {
140
+ if (!enabled) {
141
+ return { thinking: { type: "disabled" }, beta: "" };
142
+ }
143
+ if (model.includes("opus-4-6") || model.includes("sonnet-4-6")) {
144
+ return {
145
+ thinking: { type: "adaptive" },
146
+ beta: "adaptive-thinking-2026-01-28",
147
+ };
148
+ }
149
+ // Sonnet 4.5/4.0 / Haiku: fixed budget
150
+ return {
151
+ thinking: { type: "enabled", budget_tokens: 10_000 },
152
+ beta: "interleaved-thinking-2025-05-14",
153
+ };
154
+ }
155
+ getMaxOutputTokens(model, agentMax) {
156
+ const modelMax = MODEL_MAX_OUTPUT_TOKENS[model] ?? DEFAULT_OUTPUT_TOKENS;
157
+ if (agentMax)
158
+ return Math.min(agentMax, modelMax);
159
+ return Math.min(DEFAULT_OUTPUT_TOKENS, modelMax);
160
+ }
161
+ getContextManagement(model) {
162
+ const edits = [];
163
+ const betas = ["context-management-2025-06-27"];
164
+ // Thinking block clearing — must come FIRST in edits array (API requirement).
165
+ edits.push({
166
+ type: "clear_thinking_20251015",
167
+ keep: { type: "thinking_turns", value: 2 },
168
+ });
169
+ // Server-side compaction for models that support compact_20260112.
170
+ const supportsCompaction = model.includes("opus-4-6") || model.includes("sonnet-4-6");
171
+ if (supportsCompaction) {
172
+ edits.push({
173
+ type: "compact_20260112",
174
+ trigger: { type: "input_tokens", value: COMPACTION_TRIGGER_TOKENS },
175
+ pause_after_compaction: true,
176
+ instructions: "Summarize the conversation preserving: (1) task goals and constraints, (2) files created/modified with paths, (3) decisions made and rationale, (4) errors encountered and resolutions, (5) exact next steps. Be concise but preserve all state needed to continue work without repeating mistakes.",
177
+ });
178
+ betas.push("compact-2026-01-12");
179
+ }
180
+ edits.push({
181
+ type: "clear_tool_uses_20250919",
182
+ trigger: { type: "input_tokens", value: 80_000 },
183
+ keep: { type: "tool_uses", value: 3 },
184
+ });
185
+ return { betas, config: { edits } };
186
+ }
187
+ getCompactionConfig(_model) {
188
+ return {
189
+ triggerTokens: COMPACTION_TRIGGER_TOKENS,
190
+ totalBudget: COMPACTION_TOTAL_BUDGET,
191
+ isNative: true,
192
+ };
193
+ }
194
+ getCapabilities() {
195
+ return getCapabilities("anthropic");
196
+ }
197
+ }
198
+ // Auto-register on import
199
+ registerProvider("anthropic", new AnthropicAdapter());
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Bedrock Provider Adapter — AWS Bedrock Claude streaming.
3
+ *
4
+ * Similar to Anthropic but: strips cache_control from system blocks,
5
+ * uses AWS SDK credentials, parses event.chunk.bytes for streaming.
6
+ *
7
+ * Phase 7.1: Also encapsulates thinking config, context management,
8
+ * output token limits, and compaction config for Bedrock Claude models.
9
+ */
10
+ import type { ProviderAdapter, ProviderStreamConfig, ProviderCapabilities, ThinkingConfigResult, ContextManagementConfig, CompactionConfig } from "./types.js";
11
+ import type http from "node:http";
12
+ export declare class BedrockAdapter implements ProviderAdapter {
13
+ name: string;
14
+ handleStream(res: http.ServerResponse, config: ProviderStreamConfig, corsHeaders: Record<string, string>): Promise<void>;
15
+ getThinkingConfig(model: string, enabled: boolean): ThinkingConfigResult;
16
+ getMaxOutputTokens(model: string, agentMax?: number): number;
17
+ getContextManagement(model: string): ContextManagementConfig;
18
+ getCompactionConfig(_model: string): CompactionConfig;
19
+ getCapabilities(): ProviderCapabilities;
20
+ }
@@ -0,0 +1,194 @@
1
+ /**
2
+ * Bedrock Provider Adapter — AWS Bedrock Claude streaming.
3
+ *
4
+ * Similar to Anthropic but: strips cache_control from system blocks,
5
+ * uses AWS SDK credentials, parses event.chunk.bytes for streaming.
6
+ *
7
+ * Phase 7.1: Also encapsulates thinking config, context management,
8
+ * output token limits, and compaction config for Bedrock Claude models.
9
+ */
10
+ import { BedrockRuntimeClient, InvokeModelWithResponseStreamCommand } from "@aws-sdk/client-bedrock-runtime";
11
+ import { sanitizeError } from "../../shared/agent-core.js";
12
+ import { getCapabilities } from "../lib/provider-capabilities.js";
13
+ import { registerProvider } from "./registry.js";
14
+ import { jsonResponse, writeSSEHeaders, resolveProviderCredentials } from "./shared.js";
15
+ // ============================================================================
16
+ // CONSTANTS — Bedrock-specific model config
17
+ // ============================================================================
18
+ const COMPACTION_TRIGGER_TOKENS = 120_000;
19
+ const COMPACTION_TOTAL_BUDGET = 2_000_000;
20
+ const DEFAULT_OUTPUT_TOKENS = 16384;
21
+ const MODEL_MAX_OUTPUT_TOKENS = {
22
+ "anthropic.claude-sonnet-4-6": 64000,
23
+ "us.anthropic.claude-sonnet-4-20250514-v1:0": 64000,
24
+ "us.anthropic.claude-sonnet-4-5-20250929-v1:0": 64000,
25
+ "us.anthropic.claude-haiku-4-5-20251001-v1:0": 64000,
26
+ };
27
+ // ============================================================================
28
+ // ADAPTER
29
+ // ============================================================================
30
+ export class BedrockAdapter {
31
+ name = "bedrock";
32
+ async handleStream(res, config, corsHeaders) {
33
+ const { model, messages, system, tools, max_tokens, temperature, thinking, storeId, tool_choice } = config;
34
+ const creds = await resolveProviderCredentials("bedrock", storeId);
35
+ if (!creds.bedrock) {
36
+ jsonResponse(res, 422, { error: "Bedrock credentials not configured. Add aws_access_key_id and aws_secret_access_key to platform_secrets." }, corsHeaders);
37
+ return;
38
+ }
39
+ const client = new BedrockRuntimeClient({
40
+ region: creds.bedrock.region,
41
+ credentials: {
42
+ accessKeyId: creds.bedrock.accessKeyId,
43
+ secretAccessKey: creds.bedrock.secretAccessKey,
44
+ },
45
+ });
46
+ // Build Anthropic Messages API body (Bedrock Claude understands this natively)
47
+ const bedrockBody = {
48
+ anthropic_version: "bedrock-2023-10-16",
49
+ max_tokens,
50
+ messages,
51
+ };
52
+ if (system) {
53
+ bedrockBody.system = typeof system === "string"
54
+ ? [{ type: "text", text: system }]
55
+ : system.map((s) => {
56
+ // Strip cache_control — Bedrock doesn't support it
57
+ const { cache_control: _, ...rest } = s;
58
+ return rest;
59
+ });
60
+ }
61
+ if (tools?.length) {
62
+ bedrockBody.tools = tools.map((t) => ({
63
+ name: t.name,
64
+ description: typeof t.description === "string" ? t.description.slice(0, 4096) : "",
65
+ input_schema: t.input_schema,
66
+ }));
67
+ }
68
+ if (temperature !== undefined)
69
+ bedrockBody.temperature = temperature;
70
+ if (thinking)
71
+ bedrockBody.thinking = thinking;
72
+ // Map tool_choice to Anthropic/Bedrock format
73
+ if (tool_choice) {
74
+ if (tool_choice === "auto") {
75
+ bedrockBody.tool_choice = { type: "auto" };
76
+ }
77
+ else if (tool_choice === "any") {
78
+ bedrockBody.tool_choice = { type: "any" };
79
+ }
80
+ else if (tool_choice === "none") {
81
+ // "none" means no tools — remove tools from request
82
+ delete bedrockBody.tools;
83
+ }
84
+ else if (typeof tool_choice === "object" && tool_choice.type === "tool") {
85
+ bedrockBody.tool_choice = { type: "tool", name: tool_choice.name };
86
+ }
87
+ }
88
+ const command = new InvokeModelWithResponseStreamCommand({
89
+ modelId: model,
90
+ contentType: "application/json",
91
+ accept: "application/json",
92
+ body: new TextEncoder().encode(JSON.stringify(bedrockBody)),
93
+ });
94
+ // Stream SSE — defer headers until stream is successfully created
95
+ // so we can return proper HTTP errors if the initial API call fails.
96
+ let heartbeat;
97
+ try {
98
+ const response = await client.send(command);
99
+ // Stream created successfully — now safe to commit to SSE
100
+ writeSSEHeaders(res, corsHeaders);
101
+ // Heartbeat keeps the connection alive and helps detect dead clients
102
+ heartbeat = setInterval(() => {
103
+ if (!res.writableEnded)
104
+ res.write(":ping\n\n");
105
+ }, 15_000);
106
+ if (response.body) {
107
+ for await (const event of response.body) {
108
+ if (event.chunk?.bytes) {
109
+ const chunk = JSON.parse(new TextDecoder().decode(event.chunk.bytes));
110
+ res.write(`data: ${JSON.stringify(chunk)}\n\n`);
111
+ }
112
+ }
113
+ }
114
+ res.write("data: [DONE]\n\n");
115
+ }
116
+ catch (err) {
117
+ if (!res.headersSent) {
118
+ // Haven't started streaming yet — return proper HTTP error
119
+ jsonResponse(res, 502, { error: `bedrock error: ${sanitizeError(err)}` }, corsHeaders);
120
+ }
121
+ else {
122
+ // Mid-stream failure — send error event so client doesn't hang
123
+ res.write(`data: ${JSON.stringify({ type: "error", error: sanitizeError(err) })}\n\n`);
124
+ res.write("data: [DONE]\n\n");
125
+ }
126
+ }
127
+ finally {
128
+ if (heartbeat)
129
+ clearInterval(heartbeat);
130
+ }
131
+ res.end();
132
+ }
133
+ // ---- Provider-specific config methods ----
134
+ // Bedrock uses same thinking/context management as Anthropic (it's Claude underneath)
135
+ getThinkingConfig(model, enabled) {
136
+ if (!enabled) {
137
+ return { thinking: { type: "disabled" }, beta: "" };
138
+ }
139
+ // Bedrock model IDs contain the Claude model name
140
+ if (model.includes("opus-4-6") || model.includes("sonnet-4-6")) {
141
+ return {
142
+ thinking: { type: "adaptive" },
143
+ beta: "adaptive-thinking-2026-01-28",
144
+ };
145
+ }
146
+ return {
147
+ thinking: { type: "enabled", budget_tokens: 10_000 },
148
+ beta: "interleaved-thinking-2025-05-14",
149
+ };
150
+ }
151
+ getMaxOutputTokens(model, agentMax) {
152
+ const modelMax = MODEL_MAX_OUTPUT_TOKENS[model] ?? DEFAULT_OUTPUT_TOKENS;
153
+ if (agentMax)
154
+ return Math.min(agentMax, modelMax);
155
+ return Math.min(DEFAULT_OUTPUT_TOKENS, modelMax);
156
+ }
157
+ getContextManagement(model) {
158
+ // Bedrock Claude supports the same context management as direct Anthropic
159
+ const edits = [];
160
+ const betas = ["context-management-2025-06-27"];
161
+ edits.push({
162
+ type: "clear_thinking_20251015",
163
+ keep: { type: "thinking_turns", value: 2 },
164
+ });
165
+ const supportsCompaction = model.includes("opus-4-6") || model.includes("sonnet-4-6");
166
+ if (supportsCompaction) {
167
+ edits.push({
168
+ type: "compact_20260112",
169
+ trigger: { type: "input_tokens", value: COMPACTION_TRIGGER_TOKENS },
170
+ pause_after_compaction: true,
171
+ instructions: "Summarize the conversation preserving: (1) task goals and constraints, (2) files created/modified with paths, (3) decisions made and rationale, (4) errors encountered and resolutions, (5) exact next steps. Be concise but preserve all state needed to continue work without repeating mistakes.",
172
+ });
173
+ betas.push("compact-2026-01-12");
174
+ }
175
+ edits.push({
176
+ type: "clear_tool_uses_20250919",
177
+ trigger: { type: "input_tokens", value: 80_000 },
178
+ keep: { type: "tool_uses", value: 3 },
179
+ });
180
+ return { betas, config: { edits } };
181
+ }
182
+ getCompactionConfig(_model) {
183
+ return {
184
+ triggerTokens: COMPACTION_TRIGGER_TOKENS,
185
+ totalBudget: COMPACTION_TOTAL_BUDGET,
186
+ isNative: true,
187
+ };
188
+ }
189
+ getCapabilities() {
190
+ return getCapabilities("bedrock");
191
+ }
192
+ }
193
+ // Auto-register on import
194
+ registerProvider("bedrock", new BedrockAdapter());
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Gemini Provider Adapter — full format conversion to/from Anthropic SSE.
3
+ *
4
+ * Contains:
5
+ * - anthropicToGeminiMessages() — message format conversion
6
+ * - sanitizeSchemaForGemini() — type uppercase, enum stringification, key stripping
7
+ * - anthropicToGeminiFunctions() — tool conversion
8
+ * - Streaming event loop with thinking/text/function call detection
9
+ * - seenFunctionCalls deduplication
10
+ *
11
+ * Phase 7.1: Also encapsulates thinking config, context management,
12
+ * output token limits, and compaction config for Gemini models.
13
+ */
14
+ import type { ProviderAdapter, ProviderStreamConfig, ProviderCapabilities, ThinkingConfigResult, ContextManagementConfig, CompactionConfig } from "./types.js";
15
+ import type http from "node:http";
16
+ export declare class GeminiAdapter implements ProviderAdapter {
17
+ name: string;
18
+ handleStream(res: http.ServerResponse, config: ProviderStreamConfig, corsHeaders: Record<string, string>): Promise<void>;
19
+ getThinkingConfig(_model: string, enabled: boolean): ThinkingConfigResult;
20
+ getMaxOutputTokens(model: string, agentMax?: number): number;
21
+ getContextManagement(_model: string): ContextManagementConfig;
22
+ getCompactionConfig(_model: string): CompactionConfig;
23
+ getCapabilities(): ProviderCapabilities;
24
+ }