@phuetz/code-buddy 1.1.0 → 1.2.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 (291) hide show
  1. package/README.md +160 -165
  2. package/dist/agent/autonomous/agentic-coding-contract.d.ts +6 -6
  3. package/dist/agent/codebuddy-agent.d.ts +1 -1
  4. package/dist/agent/codebuddy-agent.js +69 -14
  5. package/dist/agent/execution/agent-executor.js +122 -12
  6. package/dist/agent/execution/tool-dependency-graph.js +7 -0
  7. package/dist/agent/execution/tool-hooks.d.ts +6 -0
  8. package/dist/agent/execution/tool-hooks.js +13 -5
  9. package/dist/agent/execution/tool-selection-strategy.d.ts +11 -2
  10. package/dist/agent/execution/tool-selection-strategy.js +67 -10
  11. package/dist/agent/extended-thinking.d.ts +8 -0
  12. package/dist/agent/extended-thinking.js +27 -0
  13. package/dist/agent/hermes-browser-backends.js +151 -11
  14. package/dist/agent/hermes-claw-migrate.d.ts +59 -0
  15. package/dist/agent/hermes-claw-migrate.js +427 -26
  16. package/dist/agent/hermes-parity-manifest.js +78 -71
  17. package/dist/agent/hermes-runtime-lifecycle.d.ts +67 -0
  18. package/dist/agent/hermes-runtime-lifecycle.js +468 -0
  19. package/dist/agent/middleware/index.d.ts +1 -0
  20. package/dist/agent/middleware/index.js +1 -0
  21. package/dist/agent/middleware/visual-validation-middleware.d.ts +17 -0
  22. package/dist/agent/middleware/visual-validation-middleware.js +67 -0
  23. package/dist/agent/model-benchmark.d.ts +77 -0
  24. package/dist/agent/model-benchmark.js +309 -0
  25. package/dist/agent/model-tier.d.ts +14 -0
  26. package/dist/agent/model-tier.js +71 -0
  27. package/dist/agent/multi-agent/agents/orchestrator-agent.js +17 -6
  28. package/dist/agent/multi-agent/multi-agent-system.js +3 -1
  29. package/dist/agent/multi-agent/session-fleet-bridge.d.ts +2 -0
  30. package/dist/agent/multi-agent/session-fleet-bridge.js +9 -1
  31. package/dist/agent/multi-agent/session-tools.js +22 -5
  32. package/dist/agent/reasoning/mcts.js +20 -6
  33. package/dist/agent/session-end-flush.d.ts +6 -1
  34. package/dist/agent/session-end-flush.js +20 -4
  35. package/dist/agent/streaming/streaming-handler.d.ts +7 -0
  36. package/dist/agent/streaming/streaming-handler.js +8 -1
  37. package/dist/agent/tool-executor.js +1 -0
  38. package/dist/agent/tool-handler.d.ts +5 -0
  39. package/dist/agent/tool-handler.js +130 -4
  40. package/dist/browser-automation/browser-operator-executor.js +15 -0
  41. package/dist/browser-automation/browser-use-runner.d.ts +96 -0
  42. package/dist/browser-automation/browser-use-runner.js +492 -0
  43. package/dist/browser-automation/camofox-runner.d.ts +107 -0
  44. package/dist/browser-automation/camofox-runner.js +287 -0
  45. package/dist/channels/dingtalk/index.js +3 -0
  46. package/dist/channels/discord/client.d.ts +9 -0
  47. package/dist/channels/discord/client.js +12 -0
  48. package/dist/channels/feishu/index.d.ts +167 -1
  49. package/dist/channels/feishu/index.js +432 -7
  50. package/dist/channels/gateway-lifecycle.d.ts +132 -0
  51. package/dist/channels/gateway-lifecycle.js +219 -0
  52. package/dist/channels/google-chat/index.d.ts +5 -1
  53. package/dist/channels/google-chat/index.js +5 -1
  54. package/dist/channels/imessage/index.d.ts +14 -0
  55. package/dist/channels/imessage/index.js +64 -17
  56. package/dist/channels/index.d.ts +4 -0
  57. package/dist/channels/index.js +4 -0
  58. package/dist/channels/irc/index.d.ts +73 -3
  59. package/dist/channels/irc/index.js +446 -11
  60. package/dist/channels/line/index.js +3 -0
  61. package/dist/channels/mattermost/index.d.ts +51 -4
  62. package/dist/channels/mattermost/index.js +303 -20
  63. package/dist/channels/nextcloud-talk/index.d.ts +89 -8
  64. package/dist/channels/nextcloud-talk/index.js +367 -16
  65. package/dist/channels/nostr/index.d.ts +121 -1
  66. package/dist/channels/nostr/index.js +396 -8
  67. package/dist/channels/ntfy/index.js +3 -0
  68. package/dist/channels/qq/index.js +3 -0
  69. package/dist/channels/slash-parity.d.ts +117 -0
  70. package/dist/channels/slash-parity.js +185 -0
  71. package/dist/channels/synology-chat/index.js +3 -0
  72. package/dist/channels/teams/index.d.ts +3 -0
  73. package/dist/channels/teams/index.js +3 -0
  74. package/dist/channels/telegram/client.d.ts +9 -0
  75. package/dist/channels/telegram/client.js +12 -0
  76. package/dist/channels/twilio-voice/index.js +3 -0
  77. package/dist/channels/webchat/index.d.ts +7 -1
  78. package/dist/channels/webchat/index.js +7 -1
  79. package/dist/channels/wecom/index.js +3 -0
  80. package/dist/channels/weixin/index.js +3 -0
  81. package/dist/channels/zalo/index.js +3 -0
  82. package/dist/cli/config-loader.js +1 -1
  83. package/dist/codebuddy/client.d.ts +30 -1
  84. package/dist/codebuddy/client.js +167 -20
  85. package/dist/codebuddy/providers/provider-chatgpt-responses.d.ts +5 -0
  86. package/dist/codebuddy/providers/provider-chatgpt-responses.js +1 -0
  87. package/dist/codebuddy/providers/provider-gemini-native.js +1 -1
  88. package/dist/codebuddy/providers/provider-openai-compat.d.ts +5 -0
  89. package/dist/codebuddy/providers/provider-openai-compat.js +82 -2
  90. package/dist/codebuddy/tool-definitions/computer-control-tools.js +32 -2
  91. package/dist/codebuddy/tool-definitions/core-tools.js +3 -3
  92. package/dist/codebuddy/tool-definitions/index.d.ts +2 -1
  93. package/dist/codebuddy/tool-definitions/index.js +2 -1
  94. package/dist/codebuddy/tool-definitions/multimodal-tools.d.ts +1 -0
  95. package/dist/codebuddy/tool-definitions/multimodal-tools.js +44 -1
  96. package/dist/codebuddy/tool-definitions/windows-tools.d.ts +2 -0
  97. package/dist/codebuddy/tool-definitions/windows-tools.js +34 -0
  98. package/dist/codebuddy/tools.d.ts +1 -1
  99. package/dist/codebuddy/tools.js +27 -24
  100. package/dist/commands/cli/hermes-commands.js +108 -0
  101. package/dist/commands/cli/native-engine-commands.js +102 -3
  102. package/dist/commands/cli/utility-commands.js +45 -0
  103. package/dist/commands/enhanced-command-handler.js +1 -1
  104. package/dist/commands/goal-cli.d.ts +30 -0
  105. package/dist/commands/goal-cli.js +210 -27
  106. package/dist/commands/handlers/goal-handler.d.ts +9 -2
  107. package/dist/commands/handlers/goal-handler.js +36 -9
  108. package/dist/commands/handlers/infra-handlers.js +36 -0
  109. package/dist/commands/handlers/memory-handlers.js +96 -1
  110. package/dist/commands/headless-slash.d.ts +2 -0
  111. package/dist/commands/headless-slash.js +12 -0
  112. package/dist/commands/llm-provider-resolution.d.ts +5 -3
  113. package/dist/commands/llm-provider-resolution.js +87 -33
  114. package/dist/commands/ollama.d.ts +25 -0
  115. package/dist/commands/ollama.js +100 -0
  116. package/dist/commands/provider.d.ts +5 -0
  117. package/dist/commands/provider.js +106 -55
  118. package/dist/commands/spec-next.js +2 -1
  119. package/dist/commands/spec-plan.js +5 -16
  120. package/dist/commands/tunnel.d.ts +2 -0
  121. package/dist/commands/tunnel.js +48 -0
  122. package/dist/config/config-resolver.d.ts +2 -1
  123. package/dist/config/config-resolver.js +54 -41
  124. package/dist/config/constants.d.ts +28 -0
  125. package/dist/config/constants.js +7 -0
  126. package/dist/config/env-schema.js +756 -0
  127. package/dist/config/model-tools.js +4 -4
  128. package/dist/config/toml-config.d.ts +16 -0
  129. package/dist/config/toml-config.js +3 -0
  130. package/dist/context/context-manager-v2.js +1 -0
  131. package/dist/daemon/autonomous-daemon.d.ts +1 -1
  132. package/dist/daemon/autonomous-daemon.js +3 -3
  133. package/dist/daemon/autonomous-loop.js +11 -2
  134. package/dist/daemon/colab-goal.js +9 -1
  135. package/dist/daemon/cron-agent-bridge.d.ts +12 -3
  136. package/dist/daemon/cron-agent-bridge.js +25 -9
  137. package/dist/desktop/codebuddy-engine-adapter.d.ts +32 -0
  138. package/dist/desktop/codebuddy-engine-adapter.js +257 -80
  139. package/dist/desktop/engine-adapter.d.ts +14 -0
  140. package/dist/desktop-automation/automation-manager.js +16 -0
  141. package/dist/desktop-automation/omniparser-runner.d.ts +63 -0
  142. package/dist/desktop-automation/omniparser-runner.js +115 -0
  143. package/dist/desktop-automation/smart-snapshot.d.ts +11 -0
  144. package/dist/desktop-automation/smart-snapshot.js +72 -5
  145. package/dist/doctor/index.js +40 -23
  146. package/dist/events/types.d.ts +11 -0
  147. package/dist/fleet/colab-store.js +14 -2
  148. package/dist/fleet/peer-session-bridge.js +50 -12
  149. package/dist/fleet/peer-tool-bridge.js +14 -0
  150. package/dist/goals/goal-decomposer.d.ts +27 -0
  151. package/dist/goals/goal-decomposer.js +293 -0
  152. package/dist/goals/goal-judge-client.d.ts +15 -0
  153. package/dist/goals/goal-judge-client.js +45 -0
  154. package/dist/goals/goal-judge.d.ts +2 -0
  155. package/dist/goals/goal-judge.js +35 -6
  156. package/dist/goals/goal-loop.d.ts +14 -0
  157. package/dist/goals/goal-loop.js +47 -2
  158. package/dist/goals/goal-manager.d.ts +6 -0
  159. package/dist/goals/goal-manager.js +67 -14
  160. package/dist/goals/goal-state.d.ts +13 -0
  161. package/dist/goals/goal-state.js +83 -13
  162. package/dist/goals/goal-store.d.ts +3 -0
  163. package/dist/goals/goal-store.js +31 -15
  164. package/dist/hooks/user-hooks.js +17 -3
  165. package/dist/index.js +464 -25
  166. package/dist/input/text-to-speech.d.ts +2 -6
  167. package/dist/input/text-to-speech.js +2 -27
  168. package/dist/integrations/screenpipe/screenpipe-client.d.ts +10 -0
  169. package/dist/integrations/screenpipe/screenpipe-client.js +12 -2
  170. package/dist/integrations/tailscale.d.ts +13 -0
  171. package/dist/integrations/tailscale.js +87 -34
  172. package/dist/knowledge/workspace-indexer.js +53 -9
  173. package/dist/mcp/client.js +1 -0
  174. package/dist/mcp/mcp-desktop-tools.d.ts +23 -0
  175. package/dist/mcp/mcp-desktop-tools.js +158 -0
  176. package/dist/mcp/mcp-server.js +2 -0
  177. package/dist/memory/enhanced-memory.d.ts +10 -0
  178. package/dist/memory/enhanced-memory.js +33 -2
  179. package/dist/memory/index.d.ts +3 -1
  180. package/dist/memory/index.js +4 -1
  181. package/dist/memory/memory-auto-proposer.d.ts +23 -0
  182. package/dist/memory/memory-auto-proposer.js +308 -0
  183. package/dist/memory/memory-candidate-queue.d.ts +92 -0
  184. package/dist/memory/memory-candidate-queue.js +261 -0
  185. package/dist/memory/persistent-memory.d.ts +45 -2
  186. package/dist/memory/persistent-memory.js +236 -40
  187. package/dist/ml/bayesian-qualifier.d.ts +1 -1
  188. package/dist/ml/bayesian-qualifier.js +35 -2
  189. package/dist/openclaw/gateway-bridge.js +5 -0
  190. package/dist/plugins/marketplace.d.ts +1 -0
  191. package/dist/plugins/marketplace.js +7 -0
  192. package/dist/prompts/execution-discipline.d.ts +14 -0
  193. package/dist/prompts/execution-discipline.js +29 -0
  194. package/dist/prompts/variation-injector.js +9 -2
  195. package/dist/protocols/acp/acp-agentic-runner.d.ts +7 -6
  196. package/dist/protocols/acp/acp-agentic-runner.js +115 -18
  197. package/dist/protocols/acp/acp-session-store.d.ts +23 -0
  198. package/dist/protocols/acp/acp-session-store.js +77 -0
  199. package/dist/protocols/acp/acp-stdio-server.d.ts +7 -0
  200. package/dist/protocols/acp/acp-stdio-server.js +71 -16
  201. package/dist/providers/active-llm-registry.d.ts +37 -0
  202. package/dist/providers/active-llm-registry.js +186 -0
  203. package/dist/providers/auxiliary-provider.d.ts +25 -0
  204. package/dist/providers/auxiliary-provider.js +192 -0
  205. package/dist/providers/codex-oauth.d.ts +1 -1
  206. package/dist/providers/codex-oauth.js +27 -4
  207. package/dist/providers/index.d.ts +3 -0
  208. package/dist/providers/index.js +4 -0
  209. package/dist/providers/provider-catalog.d.ts +70 -0
  210. package/dist/providers/provider-catalog.js +738 -0
  211. package/dist/providers/provider-fallback.d.ts +35 -0
  212. package/dist/providers/provider-fallback.js +171 -0
  213. package/dist/providers/xai-oauth.d.ts +128 -0
  214. package/dist/providers/xai-oauth.js +735 -0
  215. package/dist/scheduler/cron-scheduler.d.ts +15 -3
  216. package/dist/scheduler/cron-scheduler.js +53 -7
  217. package/dist/scheduler/script-runner.d.ts +2 -0
  218. package/dist/scheduler/script-runner.js +19 -4
  219. package/dist/scheduler/watchdog-handlers.js +7 -20
  220. package/dist/search/usearch-index.js +7 -2
  221. package/dist/security/tool-policy/tool-groups.js +2 -0
  222. package/dist/server/index.js +17 -2
  223. package/dist/server/routes/mobile.d.ts +12 -4
  224. package/dist/server/routes/mobile.js +116 -1
  225. package/dist/server/tls-config.d.ts +35 -0
  226. package/dist/server/tls-config.js +142 -0
  227. package/dist/server/tunnel-manager.d.ts +20 -0
  228. package/dist/server/tunnel-manager.js +58 -0
  229. package/dist/server/websocket/fleet-bridge.js +5 -0
  230. package/dist/services/prompt-builder.d.ts +1 -0
  231. package/dist/services/prompt-builder.js +49 -8
  232. package/dist/shared/engine-types.d.ts +15 -1
  233. package/dist/sidecar/sidecar-bridge.d.ts +1 -0
  234. package/dist/sidecar/sidecar-bridge.js +21 -10
  235. package/dist/spec/spec-store.js +8 -1
  236. package/dist/talk-mode/providers/audioreader-tts.d.ts +1 -1
  237. package/dist/talk-mode/providers/audioreader-tts.js +8 -8
  238. package/dist/templates/project-scaffolding.js +3 -2
  239. package/dist/themes/theme-schema.d.ts +10 -10
  240. package/dist/tools/application-profiles.js +38 -0
  241. package/dist/tools/bash/bash-tool.d.ts +1 -0
  242. package/dist/tools/bash/bash-tool.js +16 -2
  243. package/dist/tools/bash/command-validator.js +3 -0
  244. package/dist/tools/bash/rtk-rewrite.d.ts +16 -0
  245. package/dist/tools/bash/rtk-rewrite.js +100 -0
  246. package/dist/tools/bash/streaming-executor.js +14 -1
  247. package/dist/tools/computer-control-tool.d.ts +16 -1
  248. package/dist/tools/computer-control-tool.js +317 -5
  249. package/dist/tools/document-generator.d.ts +14 -0
  250. package/dist/tools/document-generator.js +79 -0
  251. package/dist/tools/execute-code-rpc-invoker.d.ts +26 -2
  252. package/dist/tools/execute-code-rpc-invoker.js +46 -5
  253. package/dist/tools/metadata.js +28 -0
  254. package/dist/tools/office-macro-tool.d.ts +10 -0
  255. package/dist/tools/office-macro-tool.js +93 -0
  256. package/dist/tools/registry/index.d.ts +2 -1
  257. package/dist/tools/registry/index.js +2 -1
  258. package/dist/tools/registry/memory-tools.d.ts +20 -0
  259. package/dist/tools/registry/memory-tools.js +225 -3
  260. package/dist/tools/registry/multimodal-tools.js +2 -2
  261. package/dist/tools/registry/vision-tools.d.ts +33 -0
  262. package/dist/tools/registry/vision-tools.js +308 -6
  263. package/dist/tools/registry/windows-tools.d.ts +2 -0
  264. package/dist/tools/registry/windows-tools.js +47 -0
  265. package/dist/tools/route-peer-tool.js +14 -0
  266. package/dist/tools/screenshot-tool.js +14 -2
  267. package/dist/tools/text-to-speech-tool.d.ts +1 -1
  268. package/dist/tools/text-to-speech-tool.js +2 -12
  269. package/dist/tools/tool-selector.js +3 -59
  270. package/dist/utils/config-validation/schema.d.ts +40 -7
  271. package/dist/utils/config-validation/schema.js +130 -1
  272. package/dist/utils/cost-tracker.js +21 -1
  273. package/dist/utils/disk-guard.d.ts +180 -0
  274. package/dist/utils/disk-guard.js +404 -0
  275. package/dist/utils/interactive-setup.js +35 -2
  276. package/dist/utils/model-utils.js +11 -2
  277. package/dist/utils/output-sanitizer.js +11 -0
  278. package/dist/utils/provider-detector.d.ts +8 -7
  279. package/dist/utils/provider-detector.js +19 -77
  280. package/dist/utils/settings-manager.d.ts +7 -0
  281. package/dist/utils/token-display.d.ts +3 -3
  282. package/dist/utils/token-display.js +22 -4
  283. package/dist/wizard/onboarding.d.ts +39 -0
  284. package/dist/wizard/onboarding.js +433 -21
  285. package/dist/wizard/provider-onboarding.d.ts +8 -23
  286. package/dist/wizard/provider-onboarding.js +39 -158
  287. package/package.json +4 -2
  288. package/dist/plugins/provider-onboarding.d.ts +0 -23
  289. package/dist/plugins/provider-onboarding.js +0 -116
  290. package/dist/utils/kokoro-tts.d.ts +0 -8
  291. package/dist/utils/kokoro-tts.js +0 -67
@@ -0,0 +1,738 @@
1
+ /**
2
+ * Runtime provider catalog.
3
+ *
4
+ * Hermes resolves providers as runtime data (`provider`, `api_mode`,
5
+ * `base_url`, `api_key`, `source`) before the agent loop starts. Code Buddy's
6
+ * main runtime still consumes the simpler `(apiKey, model, baseURL)` tuple, so
7
+ * this catalog is the shared bridge between provider UX and that client.
8
+ */
9
+ export const RUNTIME_PROVIDER_CATALOG = [
10
+ {
11
+ id: 'chatgpt',
12
+ aliases: ['codex', 'openai-codex', 'chatgpt-oauth'],
13
+ label: 'ChatGPT (OAuth)',
14
+ authMode: 'oauth',
15
+ apiMode: 'chatgpt-responses',
16
+ runtimeSupport: 'direct',
17
+ priority: 10,
18
+ apiKeyEnvKeys: ['CODEBUDDY_CHATGPT_OAUTH'],
19
+ baseUrlEnvKeys: [],
20
+ modelEnvKeys: ['CHATGPT_MODEL'],
21
+ defaultBaseURL: 'https://chatgpt.com/backend-api/codex',
22
+ defaultModel: 'gpt-5.5',
23
+ apiKeyPlaceholder: 'oauth-chatgpt',
24
+ models: ['gpt-5.5', 'gpt-5.1-codex', 'gpt-5-codex', 'codex-1'],
25
+ },
26
+ {
27
+ id: 'ollama',
28
+ label: 'Ollama',
29
+ authMode: 'local',
30
+ apiMode: 'openai-compatible',
31
+ runtimeSupport: 'direct',
32
+ priority: 20,
33
+ apiKeyEnvKeys: [],
34
+ baseUrlEnvKeys: ['OLLAMA_HOST'],
35
+ modelEnvKeys: ['GROK_MODEL', 'OLLAMA_MODEL'],
36
+ defaultBaseURL: 'http://localhost:11434/v1',
37
+ defaultModel: 'qwen2.5-coder:7b',
38
+ apiKeyPlaceholder: 'ollama',
39
+ models: ['qwen2.5-coder:7b', 'llama3.2', 'mistral', 'devstral-small-2'],
40
+ },
41
+ {
42
+ id: 'lmstudio',
43
+ aliases: ['lm-studio', 'lm_studio'],
44
+ label: 'LM Studio',
45
+ authMode: 'local',
46
+ apiMode: 'openai-compatible',
47
+ runtimeSupport: 'direct',
48
+ priority: 21,
49
+ apiKeyEnvKeys: ['LMSTUDIO_API_KEY', 'LM_STUDIO_API_KEY'],
50
+ baseUrlEnvKeys: ['LMSTUDIO_HOST', 'LM_STUDIO_HOST', 'LMSTUDIO_BASE_URL', 'LM_STUDIO_BASE_URL'],
51
+ modelEnvKeys: ['LMSTUDIO_MODEL', 'LM_STUDIO_MODEL'],
52
+ defaultBaseURL: 'http://localhost:1234/v1',
53
+ defaultModel: 'local-model',
54
+ apiKeyPlaceholder: 'lm-studio',
55
+ models: ['local-model', 'qwen2.5-coder', 'llama-3.1-8b', 'mistral-7b'],
56
+ },
57
+ {
58
+ id: 'grok',
59
+ aliases: ['xai'],
60
+ label: 'Grok (xAI)',
61
+ authMode: 'api-key',
62
+ apiMode: 'openai-compatible',
63
+ runtimeSupport: 'direct',
64
+ priority: 30,
65
+ apiKeyEnvKeys: ['GROK_API_KEY', 'XAI_API_KEY'],
66
+ baseUrlEnvKeys: ['GROK_BASE_URL', 'XAI_BASE_URL'],
67
+ modelEnvKeys: ['GROK_MODEL', 'XAI_MODEL'],
68
+ defaultBaseURL: 'https://api.x.ai/v1',
69
+ defaultModel: 'grok-3-fast',
70
+ models: ['grok-4-1-fast', 'grok-code-fast-1', 'grok-3-fast', 'grok-3-mini'],
71
+ },
72
+ {
73
+ id: 'gemini',
74
+ aliases: ['google'],
75
+ label: 'Gemini (Google)',
76
+ authMode: 'api-key',
77
+ apiMode: 'gemini-native',
78
+ runtimeSupport: 'direct',
79
+ priority: 40,
80
+ apiKeyEnvKeys: ['GOOGLE_API_KEY', 'GEMINI_API_KEY'],
81
+ baseUrlEnvKeys: ['GEMINI_BASE_URL', 'GOOGLE_AI_BASE_URL'],
82
+ modelEnvKeys: ['GEMINI_MODEL', 'GOOGLE_MODEL'],
83
+ defaultBaseURL: 'https://generativelanguage.googleapis.com/v1beta',
84
+ defaultModel: 'gemini-2.5-flash',
85
+ models: ['gemini-2.5-flash', 'gemini-2.5-pro', 'gemini-2.0-flash', 'gemini-1.5-pro'],
86
+ },
87
+ {
88
+ id: 'openai',
89
+ aliases: ['openai-api'],
90
+ label: 'OpenAI',
91
+ authMode: 'api-key',
92
+ apiMode: 'openai-compatible',
93
+ runtimeSupport: 'direct',
94
+ priority: 50,
95
+ apiKeyEnvKeys: ['OPENAI_API_KEY'],
96
+ baseUrlEnvKeys: ['OPENAI_BASE_URL'],
97
+ modelEnvKeys: ['OPENAI_MODEL'],
98
+ defaultBaseURL: 'https://api.openai.com/v1',
99
+ defaultModel: 'gpt-4o',
100
+ models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4-turbo', 'o1', 'o3-mini'],
101
+ },
102
+ {
103
+ id: 'anthropic',
104
+ aliases: ['claude', 'claude-code'],
105
+ label: 'Claude (Anthropic)',
106
+ authMode: 'api-key',
107
+ apiMode: 'openai-compatible',
108
+ runtimeSupport: 'direct',
109
+ priority: 60,
110
+ apiKeyEnvKeys: ['ANTHROPIC_API_KEY'],
111
+ baseUrlEnvKeys: ['ANTHROPIC_BASE_URL'],
112
+ modelEnvKeys: ['ANTHROPIC_MODEL', 'CLAUDE_MODEL'],
113
+ defaultBaseURL: 'https://api.anthropic.com/v1',
114
+ defaultModel: 'claude-sonnet-4-20250514',
115
+ models: ['claude-sonnet-4-20250514', 'claude-opus-4-20250514', 'claude-3-5-sonnet-latest'],
116
+ },
117
+ {
118
+ id: 'mistral',
119
+ label: 'Mistral AI',
120
+ authMode: 'api-key',
121
+ apiMode: 'openai-compatible',
122
+ runtimeSupport: 'direct',
123
+ priority: 70,
124
+ apiKeyEnvKeys: ['MISTRAL_API_KEY'],
125
+ baseUrlEnvKeys: ['MISTRAL_BASE_URL'],
126
+ modelEnvKeys: ['MISTRAL_MODEL'],
127
+ defaultBaseURL: 'https://api.mistral.ai/v1',
128
+ defaultModel: 'mistral-large-latest',
129
+ models: ['mistral-large-latest', 'mistral-medium-latest', 'mistral-small-latest', 'codestral-latest'],
130
+ },
131
+ {
132
+ id: 'groq',
133
+ label: 'Groq',
134
+ authMode: 'api-key',
135
+ apiMode: 'openai-compatible',
136
+ runtimeSupport: 'direct',
137
+ priority: 80,
138
+ apiKeyEnvKeys: ['GROQ_API_KEY'],
139
+ baseUrlEnvKeys: ['GROQ_BASE_URL'],
140
+ modelEnvKeys: ['GROQ_MODEL'],
141
+ defaultBaseURL: 'https://api.groq.com/openai/v1',
142
+ defaultModel: 'llama-3.3-70b-versatile',
143
+ models: ['llama-3.3-70b-versatile', 'llama-3.1-8b-instant', 'mixtral-8x7b-32768'],
144
+ },
145
+ {
146
+ id: 'together',
147
+ label: 'Together AI',
148
+ authMode: 'api-key',
149
+ apiMode: 'openai-compatible',
150
+ runtimeSupport: 'direct',
151
+ priority: 90,
152
+ apiKeyEnvKeys: ['TOGETHER_API_KEY'],
153
+ baseUrlEnvKeys: ['TOGETHER_BASE_URL'],
154
+ modelEnvKeys: ['TOGETHER_MODEL'],
155
+ defaultBaseURL: 'https://api.together.xyz/v1',
156
+ defaultModel: 'meta-llama/Llama-3.3-70B-Instruct-Turbo',
157
+ models: ['meta-llama/Llama-3.3-70B-Instruct-Turbo', 'mistralai/Mixtral-8x7B-Instruct-v0.1'],
158
+ },
159
+ {
160
+ id: 'fireworks',
161
+ label: 'Fireworks AI',
162
+ authMode: 'api-key',
163
+ apiMode: 'openai-compatible',
164
+ runtimeSupport: 'direct',
165
+ priority: 100,
166
+ apiKeyEnvKeys: ['FIREWORKS_API_KEY'],
167
+ baseUrlEnvKeys: ['FIREWORKS_BASE_URL'],
168
+ modelEnvKeys: ['FIREWORKS_MODEL'],
169
+ defaultBaseURL: 'https://api.fireworks.ai/inference/v1',
170
+ defaultModel: 'accounts/fireworks/models/llama-v3p1-70b-instruct',
171
+ models: ['accounts/fireworks/models/llama-v3p1-70b-instruct', 'accounts/fireworks/models/qwen2p5-coder-32b-instruct'],
172
+ },
173
+ {
174
+ id: 'openrouter',
175
+ label: 'OpenRouter',
176
+ authMode: 'api-key',
177
+ apiMode: 'openai-compatible',
178
+ runtimeSupport: 'direct',
179
+ priority: 110,
180
+ apiKeyEnvKeys: ['OPENROUTER_API_KEY'],
181
+ baseUrlEnvKeys: ['OPENROUTER_BASE_URL'],
182
+ modelEnvKeys: ['OPENROUTER_MODEL'],
183
+ defaultBaseURL: 'https://openrouter.ai/api/v1',
184
+ defaultModel: 'openai/gpt-4o',
185
+ models: ['openai/gpt-4o', 'anthropic/claude-sonnet-4', 'google/gemini-2.5-pro'],
186
+ },
187
+ {
188
+ id: 'novita',
189
+ aliases: ['novita-ai'],
190
+ label: 'NovitaAI',
191
+ authMode: 'api-key',
192
+ apiMode: 'openai-compatible',
193
+ runtimeSupport: 'direct',
194
+ priority: 111,
195
+ apiKeyEnvKeys: ['NOVITA_API_KEY'],
196
+ baseUrlEnvKeys: ['NOVITA_BASE_URL'],
197
+ modelEnvKeys: ['NOVITA_MODEL'],
198
+ defaultBaseURL: 'https://api.novita.ai/openai/v1',
199
+ defaultModel: 'moonshotai/kimi-k2.5',
200
+ models: ['moonshotai/kimi-k2.5', 'deepseek/deepseek-v3.2', 'qwen/qwen3-coder-480b-a35b-instruct'],
201
+ },
202
+ {
203
+ id: 'zai',
204
+ aliases: ['glm', 'zai-coding', 'zhipu'],
205
+ label: 'z.ai / GLM',
206
+ authMode: 'api-key',
207
+ apiMode: 'openai-compatible',
208
+ runtimeSupport: 'direct',
209
+ priority: 112,
210
+ apiKeyEnvKeys: ['GLM_API_KEY', 'ZAI_API_KEY'],
211
+ baseUrlEnvKeys: ['GLM_BASE_URL', 'ZAI_BASE_URL'],
212
+ modelEnvKeys: ['GLM_MODEL', 'ZAI_MODEL'],
213
+ defaultBaseURL: 'https://api.z.ai/api/paas/v4',
214
+ defaultModel: 'glm-5',
215
+ models: ['glm-5', 'glm-5-code', 'glm-4.7', 'glm-4.5-air'],
216
+ },
217
+ {
218
+ id: 'kimi-coding',
219
+ aliases: ['kimi', 'moonshot', 'moonshot-ai'],
220
+ label: 'Kimi / Moonshot',
221
+ authMode: 'api-key',
222
+ apiMode: 'openai-compatible',
223
+ runtimeSupport: 'direct',
224
+ priority: 113,
225
+ apiKeyEnvKeys: ['KIMI_API_KEY', 'MOONSHOT_API_KEY'],
226
+ baseUrlEnvKeys: ['KIMI_BASE_URL', 'MOONSHOT_BASE_URL'],
227
+ modelEnvKeys: ['KIMI_MODEL', 'MOONSHOT_MODEL'],
228
+ defaultBaseURL: 'https://api.moonshot.ai/v1',
229
+ defaultModel: 'kimi-k2.5',
230
+ models: ['kimi-k2.5', 'kimi-k2-thinking', 'kimi-latest'],
231
+ },
232
+ {
233
+ id: 'kimi-coding-cn',
234
+ aliases: ['kimi-cn', 'moonshot-cn'],
235
+ label: 'Kimi / Moonshot China',
236
+ authMode: 'api-key',
237
+ apiMode: 'openai-compatible',
238
+ runtimeSupport: 'direct',
239
+ priority: 114,
240
+ apiKeyEnvKeys: ['KIMI_CN_API_KEY'],
241
+ baseUrlEnvKeys: ['KIMI_CN_BASE_URL'],
242
+ modelEnvKeys: ['KIMI_CN_MODEL'],
243
+ defaultBaseURL: 'https://api.moonshot.cn/v1',
244
+ defaultModel: 'kimi-k2.5',
245
+ models: ['kimi-k2.5', 'kimi-k2-thinking', 'moonshot-v1-128k'],
246
+ },
247
+ {
248
+ id: 'arcee',
249
+ aliases: ['arcee-ai', 'arceeai'],
250
+ label: 'Arcee AI',
251
+ authMode: 'api-key',
252
+ apiMode: 'openai-compatible',
253
+ runtimeSupport: 'direct',
254
+ priority: 115,
255
+ apiKeyEnvKeys: ['ARCEEAI_API_KEY', 'ARCEE_API_KEY'],
256
+ baseUrlEnvKeys: ['ARCEEAI_BASE_URL', 'ARCEE_BASE_URL'],
257
+ modelEnvKeys: ['ARCEEAI_MODEL', 'ARCEE_MODEL'],
258
+ defaultBaseURL: 'https://api.arcee.ai/api/v1',
259
+ defaultModel: 'trinity-large-thinking',
260
+ models: ['trinity-large-thinking', 'trinity-mini', 'afm-4.5b'],
261
+ },
262
+ {
263
+ id: 'gmi',
264
+ aliases: ['gmi-cloud', 'gmicloud'],
265
+ label: 'GMI Cloud',
266
+ authMode: 'api-key',
267
+ apiMode: 'openai-compatible',
268
+ runtimeSupport: 'direct',
269
+ priority: 116,
270
+ apiKeyEnvKeys: ['GMI_API_KEY'],
271
+ baseUrlEnvKeys: ['GMI_BASE_URL'],
272
+ modelEnvKeys: ['GMI_MODEL'],
273
+ defaultBaseURL: 'https://api.gmi-serving.com/v1',
274
+ defaultModel: 'deepseek-ai/DeepSeek-V3.2',
275
+ models: ['deepseek-ai/DeepSeek-V3.2', 'zai-org/GLM-5.1-FP8', 'google/gemini-3.1-flash-lite'],
276
+ },
277
+ {
278
+ id: 'minimax',
279
+ label: 'MiniMax',
280
+ authMode: 'api-key',
281
+ apiMode: 'openai-compatible',
282
+ runtimeSupport: 'direct',
283
+ priority: 117,
284
+ apiKeyEnvKeys: ['MINIMAX_API_KEY'],
285
+ baseUrlEnvKeys: ['MINIMAX_BASE_URL'],
286
+ modelEnvKeys: ['MINIMAX_MODEL'],
287
+ defaultBaseURL: 'https://api.minimax.io/v1',
288
+ defaultModel: 'MiniMax-M2.7',
289
+ models: ['MiniMax-M2.7', 'MiniMax-M2.5', 'MiniMax-M2.1'],
290
+ },
291
+ {
292
+ id: 'minimax-cn',
293
+ label: 'MiniMax China',
294
+ authMode: 'api-key',
295
+ apiMode: 'openai-compatible',
296
+ runtimeSupport: 'direct',
297
+ priority: 118,
298
+ apiKeyEnvKeys: ['MINIMAX_CN_API_KEY'],
299
+ baseUrlEnvKeys: ['MINIMAX_CN_BASE_URL'],
300
+ modelEnvKeys: ['MINIMAX_CN_MODEL'],
301
+ defaultBaseURL: 'https://api.minimaxi.com/v1',
302
+ defaultModel: 'MiniMax-M2.7',
303
+ models: ['MiniMax-M2.7', 'MiniMax-M2.5', 'MiniMax-M2.1'],
304
+ },
305
+ {
306
+ id: 'alibaba',
307
+ aliases: ['qwen', 'dashscope'],
308
+ label: 'Alibaba Cloud / DashScope',
309
+ authMode: 'api-key',
310
+ apiMode: 'openai-compatible',
311
+ runtimeSupport: 'direct',
312
+ priority: 119,
313
+ apiKeyEnvKeys: ['DASHSCOPE_API_KEY', 'ALIBABA_API_KEY'],
314
+ baseUrlEnvKeys: ['DASHSCOPE_BASE_URL', 'ALIBABA_BASE_URL'],
315
+ modelEnvKeys: ['DASHSCOPE_MODEL', 'ALIBABA_MODEL'],
316
+ defaultBaseURL: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',
317
+ defaultModel: 'qwen3.5-plus',
318
+ models: ['qwen3.5-plus', 'qwen3-coder-plus', 'qwen-plus'],
319
+ },
320
+ {
321
+ id: 'alibaba-coding-plan',
322
+ aliases: ['alibaba-coding', 'qwen-coding'],
323
+ label: 'Alibaba Coding Plan',
324
+ authMode: 'api-key',
325
+ apiMode: 'openai-compatible',
326
+ runtimeSupport: 'direct',
327
+ priority: 120,
328
+ apiKeyEnvKeys: ['ALIBABA_CODING_PLAN_API_KEY', 'DASHSCOPE_API_KEY'],
329
+ baseUrlEnvKeys: ['ALIBABA_CODING_PLAN_BASE_URL', 'DASHSCOPE_CODING_BASE_URL'],
330
+ modelEnvKeys: ['ALIBABA_CODING_PLAN_MODEL', 'DASHSCOPE_CODING_MODEL'],
331
+ defaultBaseURL: 'https://dashscope-intl.aliyuncs.com/compatible-mode/v1',
332
+ defaultModel: 'qwen3-coder-plus',
333
+ models: ['qwen3-coder-plus', 'qwen3-coder-flash'],
334
+ },
335
+ {
336
+ id: 'kilocode',
337
+ aliases: ['kilo-code', 'kilo'],
338
+ label: 'Kilo Code Gateway',
339
+ authMode: 'api-key',
340
+ apiMode: 'openai-compatible',
341
+ runtimeSupport: 'direct',
342
+ priority: 121,
343
+ apiKeyEnvKeys: ['KILOCODE_API_KEY', 'KILO_API_KEY'],
344
+ baseUrlEnvKeys: ['KILOCODE_BASE_URL', 'KILO_BASE_URL'],
345
+ modelEnvKeys: ['KILOCODE_MODEL', 'KILO_MODEL'],
346
+ defaultBaseURL: 'https://api.kilo.ai/api/gateway',
347
+ defaultModel: 'kilocode-default',
348
+ models: ['kilocode-default'],
349
+ },
350
+ {
351
+ id: 'xiaomi',
352
+ aliases: ['mimo', 'xiaomi-mimo'],
353
+ label: 'Xiaomi MiMo',
354
+ authMode: 'api-key',
355
+ apiMode: 'openai-compatible',
356
+ runtimeSupport: 'direct',
357
+ priority: 122,
358
+ apiKeyEnvKeys: ['XIAOMI_API_KEY'],
359
+ baseUrlEnvKeys: ['XIAOMI_BASE_URL'],
360
+ modelEnvKeys: ['XIAOMI_MODEL'],
361
+ defaultBaseURL: 'https://api.xiaomimimo.com/v1',
362
+ defaultModel: 'mimo-v2-pro',
363
+ models: ['mimo-v2-pro', 'mimo-v2-flash'],
364
+ },
365
+ {
366
+ id: 'tencent-tokenhub',
367
+ aliases: ['tencent', 'tokenhub', 'tencentmaas'],
368
+ label: 'Tencent TokenHub',
369
+ authMode: 'api-key',
370
+ apiMode: 'openai-compatible',
371
+ runtimeSupport: 'direct',
372
+ priority: 123,
373
+ apiKeyEnvKeys: ['TOKENHUB_API_KEY', 'TENCENT_TOKENHUB_API_KEY'],
374
+ baseUrlEnvKeys: ['TOKENHUB_BASE_URL', 'TENCENT_TOKENHUB_BASE_URL'],
375
+ modelEnvKeys: ['TOKENHUB_MODEL', 'TENCENT_TOKENHUB_MODEL'],
376
+ defaultBaseURL: 'https://tokenhub.tencentmaas.com/v1',
377
+ defaultModel: 'tencent-tokenhub/hy3-preview',
378
+ models: ['tencent-tokenhub/hy3-preview'],
379
+ },
380
+ {
381
+ id: 'opencode-zen',
382
+ aliases: ['opencode', 'opencode-zen-api'],
383
+ label: 'OpenCode Zen',
384
+ authMode: 'api-key',
385
+ apiMode: 'openai-compatible',
386
+ runtimeSupport: 'direct',
387
+ priority: 124,
388
+ apiKeyEnvKeys: ['OPENCODE_ZEN_API_KEY', 'OPENCODE_API_KEY'],
389
+ baseUrlEnvKeys: ['OPENCODE_ZEN_BASE_URL', 'OPENCODE_BASE_URL'],
390
+ modelEnvKeys: ['OPENCODE_ZEN_MODEL', 'OPENCODE_MODEL'],
391
+ defaultBaseURL: 'https://opencode.ai/zen/v1',
392
+ defaultModel: 'opencode/claude-sonnet-4-5',
393
+ models: ['opencode/claude-sonnet-4-5', 'opencode/gpt-5.1', 'opencode/glm-5.1'],
394
+ },
395
+ {
396
+ id: 'opencode-go',
397
+ aliases: ['opencode-go-api'],
398
+ label: 'OpenCode Go',
399
+ authMode: 'api-key',
400
+ apiMode: 'openai-compatible',
401
+ runtimeSupport: 'direct',
402
+ priority: 125,
403
+ apiKeyEnvKeys: ['OPENCODE_GO_API_KEY'],
404
+ baseUrlEnvKeys: ['OPENCODE_GO_BASE_URL'],
405
+ modelEnvKeys: ['OPENCODE_GO_MODEL'],
406
+ defaultBaseURL: 'https://opencode.ai/zen/go/v1',
407
+ defaultModel: 'deepseek-v4-flash',
408
+ models: ['deepseek-v4-flash', 'glm-5.1'],
409
+ },
410
+ {
411
+ id: 'deepseek',
412
+ label: 'DeepSeek',
413
+ authMode: 'api-key',
414
+ apiMode: 'openai-compatible',
415
+ runtimeSupport: 'direct',
416
+ priority: 126,
417
+ apiKeyEnvKeys: ['DEEPSEEK_API_KEY'],
418
+ baseUrlEnvKeys: ['DEEPSEEK_BASE_URL'],
419
+ modelEnvKeys: ['DEEPSEEK_MODEL'],
420
+ defaultBaseURL: 'https://api.deepseek.com/v1',
421
+ defaultModel: 'deepseek-chat',
422
+ models: ['deepseek-chat', 'deepseek-reasoner', 'deepseek-v3.2'],
423
+ },
424
+ {
425
+ id: 'huggingface',
426
+ aliases: ['hf'],
427
+ label: 'Hugging Face',
428
+ authMode: 'api-key',
429
+ apiMode: 'openai-compatible',
430
+ runtimeSupport: 'direct',
431
+ priority: 127,
432
+ apiKeyEnvKeys: ['HF_TOKEN', 'HUGGINGFACE_API_KEY'],
433
+ baseUrlEnvKeys: ['HF_BASE_URL', 'HUGGINGFACE_BASE_URL'],
434
+ modelEnvKeys: ['HF_MODEL', 'HUGGINGFACE_MODEL'],
435
+ defaultBaseURL: 'https://router.huggingface.co/v1',
436
+ defaultModel: 'openai/gpt-oss-120b',
437
+ models: ['openai/gpt-oss-120b', 'meta-llama/Llama-3.3-70B-Instruct', 'Qwen/Qwen3-Coder-480B-A35B-Instruct'],
438
+ },
439
+ {
440
+ id: 'nvidia',
441
+ aliases: ['nvidia-nim', 'nim'],
442
+ label: 'NVIDIA NIM',
443
+ authMode: 'api-key',
444
+ apiMode: 'openai-compatible',
445
+ runtimeSupport: 'direct',
446
+ priority: 128,
447
+ apiKeyEnvKeys: ['NVIDIA_API_KEY'],
448
+ baseUrlEnvKeys: ['NVIDIA_BASE_URL', 'NVIDIA_NIM_BASE_URL'],
449
+ modelEnvKeys: ['NVIDIA_MODEL', 'NVIDIA_NIM_MODEL'],
450
+ defaultBaseURL: 'https://integrate.api.nvidia.com/v1',
451
+ defaultModel: 'nvidia/llama-3.3-nemotron-super-49b-v1',
452
+ models: ['nvidia/llama-3.3-nemotron-super-49b-v1', 'nvidia/llama-3.1-nemotron-ultra-253b-v1'],
453
+ },
454
+ {
455
+ id: 'ollama-cloud',
456
+ aliases: ['ollama-com'],
457
+ label: 'Ollama Cloud',
458
+ authMode: 'api-key',
459
+ apiMode: 'openai-compatible',
460
+ runtimeSupport: 'direct',
461
+ priority: 129,
462
+ apiKeyEnvKeys: ['OLLAMA_API_KEY'],
463
+ baseUrlEnvKeys: ['OLLAMA_CLOUD_BASE_URL'],
464
+ modelEnvKeys: ['OLLAMA_CLOUD_MODEL'],
465
+ defaultBaseURL: 'https://ollama.com/v1',
466
+ defaultModel: 'gpt-oss:120b',
467
+ models: ['gpt-oss:120b', 'deepseek-v3.1:671b-cloud'],
468
+ },
469
+ {
470
+ id: 'stepfun',
471
+ aliases: ['step'],
472
+ label: 'StepFun',
473
+ authMode: 'api-key',
474
+ apiMode: 'openai-compatible',
475
+ runtimeSupport: 'direct',
476
+ priority: 130,
477
+ apiKeyEnvKeys: ['STEPFUN_API_KEY', 'STEP_API_KEY'],
478
+ baseUrlEnvKeys: ['STEPFUN_BASE_URL', 'STEP_BASE_URL'],
479
+ modelEnvKeys: ['STEPFUN_MODEL', 'STEP_MODEL'],
480
+ defaultBaseURL: 'https://api.stepfun.ai/v1',
481
+ defaultModel: 'step-3.5-flash',
482
+ models: ['step-3.5-flash', 'step-3.5-mini'],
483
+ },
484
+ {
485
+ id: 'vllm',
486
+ label: 'vLLM',
487
+ authMode: 'local',
488
+ apiMode: 'openai-compatible',
489
+ runtimeSupport: 'direct',
490
+ priority: 22,
491
+ apiKeyEnvKeys: ['VLLM_API_KEY'],
492
+ baseUrlEnvKeys: ['VLLM_BASE_URL'],
493
+ modelEnvKeys: ['VLLM_MODEL'],
494
+ defaultBaseURL: 'http://localhost:8000/v1',
495
+ defaultModel: 'model',
496
+ apiKeyPlaceholder: 'vllm',
497
+ models: ['model'],
498
+ },
499
+ {
500
+ id: 'custom',
501
+ aliases: ['openai-compatible', 'custom-openai'],
502
+ label: 'Custom OpenAI-compatible',
503
+ authMode: 'api-key',
504
+ apiMode: 'openai-compatible',
505
+ runtimeSupport: 'direct',
506
+ priority: 300,
507
+ apiKeyEnvKeys: ['CODEBUDDY_API_KEY', 'CUSTOM_PROVIDER_API_KEY'],
508
+ baseUrlEnvKeys: ['CODEBUDDY_BASE_URL', 'CUSTOM_PROVIDER_BASE_URL'],
509
+ modelEnvKeys: ['CODEBUDDY_MODEL', 'CUSTOM_PROVIDER_MODEL'],
510
+ defaultBaseURL: 'http://localhost:8000/v1',
511
+ defaultModel: 'model',
512
+ models: ['model'],
513
+ },
514
+ {
515
+ id: 'azure',
516
+ aliases: ['azure-openai', 'azure_openai'],
517
+ label: 'Azure OpenAI',
518
+ authMode: 'api-key',
519
+ apiMode: 'azure-openai',
520
+ runtimeSupport: 'plugin-native',
521
+ priority: 400,
522
+ apiKeyEnvKeys: ['AZURE_OPENAI_API_KEY', 'AZURE_OPENAI_AD_TOKEN'],
523
+ baseUrlEnvKeys: ['AZURE_OPENAI_ENDPOINT'],
524
+ modelEnvKeys: ['AZURE_OPENAI_DEPLOYMENT', 'AZURE_OPENAI_MODEL'],
525
+ defaultBaseURL: 'https://<resource>.openai.azure.com',
526
+ defaultModel: 'gpt-4o',
527
+ models: ['gpt-4o', 'gpt-4o-mini', 'gpt-4', 'gpt-35-turbo'],
528
+ notes: 'Bundled plugin transport: src/plugins/bundled/azure-provider.ts',
529
+ },
530
+ {
531
+ id: 'bedrock',
532
+ aliases: ['aws-bedrock', 'amazon-bedrock'],
533
+ label: 'AWS Bedrock',
534
+ authMode: 'api-key',
535
+ apiMode: 'aws-bedrock',
536
+ runtimeSupport: 'plugin-native',
537
+ priority: 401,
538
+ apiKeyEnvKeys: ['AWS_ACCESS_KEY_ID', 'AWS_SECRET_ACCESS_KEY', 'AWS_PROFILE'],
539
+ baseUrlEnvKeys: ['AWS_BEDROCK_REGION', 'AWS_REGION'],
540
+ modelEnvKeys: ['AWS_BEDROCK_MODEL', 'BEDROCK_MODEL'],
541
+ defaultBaseURL: 'https://bedrock-runtime.<region>.amazonaws.com',
542
+ defaultModel: 'anthropic.claude-3-5-sonnet-20241022-v2:0',
543
+ models: [
544
+ 'anthropic.claude-3-5-sonnet-20241022-v2:0',
545
+ 'anthropic.claude-3-opus-20240229-v1:0',
546
+ 'meta.llama3-1-70b-instruct-v1:0',
547
+ 'mistral.mistral-large-2407-v1:0',
548
+ ],
549
+ notes: 'Bundled plugin transport: src/plugins/bundled/bedrock-provider.ts',
550
+ },
551
+ {
552
+ id: 'copilot',
553
+ aliases: ['github-copilot', 'github_copilot'],
554
+ label: 'GitHub Copilot',
555
+ authMode: 'oauth',
556
+ apiMode: 'copilot-chat',
557
+ runtimeSupport: 'plugin-native',
558
+ priority: 402,
559
+ apiKeyEnvKeys: ['GITHUB_COPILOT_TOKEN', 'COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN'],
560
+ baseUrlEnvKeys: [],
561
+ modelEnvKeys: ['COPILOT_MODEL'],
562
+ defaultBaseURL: 'https://api.githubcopilot.com',
563
+ defaultModel: 'gpt-4o',
564
+ models: ['gpt-4o', 'gpt-4.1', 'claude-sonnet-4'],
565
+ notes: 'Bundled plugin transport: src/plugins/bundled/copilot-provider.ts',
566
+ },
567
+ ];
568
+ export const PLUGIN_NATIVE_PROVIDER_IDS = ['azure', 'bedrock', 'copilot'];
569
+ export function getRuntimeProviderCatalog() {
570
+ return [...RUNTIME_PROVIDER_CATALOG];
571
+ }
572
+ export function getDirectRuntimeProviderCatalog() {
573
+ return RUNTIME_PROVIDER_CATALOG.filter((entry) => entry.runtimeSupport === 'direct');
574
+ }
575
+ export function getPluginNativeRuntimeProviderCatalog() {
576
+ return RUNTIME_PROVIDER_CATALOG.filter((entry) => entry.runtimeSupport === 'plugin-native');
577
+ }
578
+ export function findRuntimeProvider(idOrAlias) {
579
+ if (!idOrAlias)
580
+ return undefined;
581
+ const normalized = normalizeProviderId(idOrAlias);
582
+ return RUNTIME_PROVIDER_CATALOG.find((entry) => {
583
+ if (entry.id === normalized)
584
+ return true;
585
+ return entry.aliases?.some((alias) => normalizeProviderId(alias) === normalized) ?? false;
586
+ });
587
+ }
588
+ export function resolveProviderFromCatalog(options = {}) {
589
+ const env = options.env ?? process.env;
590
+ const override = normalizeProviderId(options.providerOverride ?? env.CODEBUDDY_PROVIDER);
591
+ if (override) {
592
+ const entry = findRuntimeProvider(override);
593
+ if (!entry || entry.runtimeSupport !== 'direct')
594
+ return null;
595
+ return resolveEntry(entry, env, 'override', options);
596
+ }
597
+ if (options.hasChatGptOAuth) {
598
+ const chatgpt = findRuntimeProvider('chatgpt');
599
+ if (chatgpt)
600
+ return resolveEntry(chatgpt, env, 'oauth', options);
601
+ }
602
+ const ordered = getDirectRuntimeProviderCatalog()
603
+ .filter((entry) => entry.id !== 'chatgpt' && entry.id !== 'custom')
604
+ .sort((a, b) => a.priority - b.priority);
605
+ for (const entry of ordered) {
606
+ if (!isEntryConfigured(entry, env))
607
+ continue;
608
+ return resolveEntry(entry, env, 'environment', options);
609
+ }
610
+ const custom = findRuntimeProvider('custom');
611
+ if (custom && isEntryConfigured(custom, env)) {
612
+ return resolveEntry(custom, env, 'environment', options);
613
+ }
614
+ return null;
615
+ }
616
+ export function resolvePluginRuntimeProvider(idOrAlias, env = process.env) {
617
+ const entry = findRuntimeProvider(idOrAlias);
618
+ if (!entry || entry.runtimeSupport !== 'plugin-native')
619
+ return null;
620
+ const baseURL = resolvePluginBaseURL(entry, env);
621
+ const defaultModel = firstEnvValue(env, entry.modelEnvKeys) || entry.defaultModel;
622
+ const credentialSources = [
623
+ ...entry.apiKeyEnvKeys.filter((key) => hasAnyEnvValue(env, [key])),
624
+ ...entry.baseUrlEnvKeys.filter((key) => hasAnyEnvValue(env, [key])),
625
+ ];
626
+ return {
627
+ provider: entry.id,
628
+ label: entry.label,
629
+ apiMode: entry.apiMode,
630
+ authMode: entry.authMode,
631
+ runtimeSupport: 'plugin-native',
632
+ pluginId: `bundled-${entry.id === 'azure' ? 'azure-openai' : entry.id}`,
633
+ configured: isProviderConfigured(entry, env, false),
634
+ credentialSources,
635
+ ...(baseURL ? { baseURL } : {}),
636
+ defaultModel,
637
+ ...(entry.notes ? { notes: entry.notes } : {}),
638
+ };
639
+ }
640
+ export function getProviderEnvSummary(entry) {
641
+ if (entry.id === 'chatgpt')
642
+ return 'CODEBUDDY_CHATGPT_OAUTH';
643
+ if (entry.authMode === 'local' && entry.baseUrlEnvKeys.length > 0) {
644
+ return entry.baseUrlEnvKeys.join(' | ');
645
+ }
646
+ if (entry.apiKeyEnvKeys.length > 0)
647
+ return entry.apiKeyEnvKeys.join(' | ');
648
+ if (entry.baseUrlEnvKeys.length > 0)
649
+ return entry.baseUrlEnvKeys.join(' | ');
650
+ return 'none';
651
+ }
652
+ export function isProviderConfigured(entry, env = process.env, hasChatGptOAuth = false) {
653
+ if (entry.id === 'chatgpt')
654
+ return hasChatGptOAuth;
655
+ return isEntryConfigured(entry, env);
656
+ }
657
+ function resolveEntry(entry, env, source, options) {
658
+ if (entry.id === 'chatgpt' && !options.hasChatGptOAuth) {
659
+ return null;
660
+ }
661
+ const apiKey = firstEnvValue(env, entry.apiKeyEnvKeys) || entry.apiKeyPlaceholder || '';
662
+ const baseURL = normalizeProviderBaseURL(firstEnvValue(env, entry.baseUrlEnvKeys) || entry.defaultBaseURL, entry);
663
+ const defaultModel = firstEnvValue(env, entry.modelEnvKeys) || entry.defaultModel;
664
+ if (options.requireConfigured && !apiKey && entry.authMode === 'api-key') {
665
+ return null;
666
+ }
667
+ return {
668
+ provider: entry.id,
669
+ label: entry.label,
670
+ apiMode: entry.apiMode,
671
+ authMode: entry.authMode,
672
+ apiKey,
673
+ baseURL,
674
+ defaultModel,
675
+ source,
676
+ };
677
+ }
678
+ function isEntryConfigured(entry, env) {
679
+ if (entry.runtimeSupport === 'plugin-native') {
680
+ if (entry.id === 'azure') {
681
+ return hasAnyEnvValue(env, ['AZURE_OPENAI_ENDPOINT'])
682
+ && hasAnyEnvValue(env, ['AZURE_OPENAI_API_KEY', 'AZURE_OPENAI_AD_TOKEN']);
683
+ }
684
+ if (entry.id === 'bedrock') {
685
+ return hasAnyEnvValue(env, ['AWS_BEDROCK_REGION', 'AWS_REGION'])
686
+ && hasAnyEnvValue(env, ['AWS_ACCESS_KEY_ID'])
687
+ && hasAnyEnvValue(env, ['AWS_SECRET_ACCESS_KEY']);
688
+ }
689
+ if (entry.id === 'copilot') {
690
+ return hasAnyEnvValue(env, ['GITHUB_COPILOT_TOKEN', 'COPILOT_GITHUB_TOKEN', 'GH_TOKEN', 'GITHUB_TOKEN']);
691
+ }
692
+ }
693
+ if (entry.authMode === 'local') {
694
+ return hasAnyEnvValue(env, entry.baseUrlEnvKeys);
695
+ }
696
+ if (entry.authMode === 'api-key') {
697
+ return hasAnyEnvValue(env, entry.apiKeyEnvKeys);
698
+ }
699
+ return false;
700
+ }
701
+ function firstEnvValue(env, keys) {
702
+ for (const key of keys) {
703
+ const value = env[key]?.trim();
704
+ if (value)
705
+ return value;
706
+ }
707
+ return undefined;
708
+ }
709
+ function hasAnyEnvValue(env, keys) {
710
+ return firstEnvValue(env, keys) !== undefined;
711
+ }
712
+ function normalizeProviderId(value) {
713
+ return (value ?? '').trim().toLowerCase().replace(/^bundled-/, '');
714
+ }
715
+ function normalizeProviderBaseURL(value, entry) {
716
+ let baseURL = value.trim();
717
+ if ((entry.id === 'ollama' || entry.id === 'lmstudio' || entry.id === 'vllm') && !/^https?:\/\//i.test(baseURL)) {
718
+ baseURL = `http://${baseURL}`;
719
+ }
720
+ if (entry.id === 'ollama' || entry.id === 'lmstudio' || entry.id === 'vllm') {
721
+ const withoutSlash = baseURL.replace(/\/+$/, '');
722
+ if (/\/v1$/i.test(withoutSlash))
723
+ return withoutSlash;
724
+ return `${withoutSlash}/v1`;
725
+ }
726
+ return baseURL.replace(/\/+$/, '');
727
+ }
728
+ function resolvePluginBaseURL(entry, env) {
729
+ if (entry.id === 'azure') {
730
+ return firstEnvValue(env, ['AZURE_OPENAI_ENDPOINT'])?.replace(/\/+$/, '');
731
+ }
732
+ if (entry.id === 'bedrock') {
733
+ const region = firstEnvValue(env, ['AWS_BEDROCK_REGION', 'AWS_REGION']);
734
+ return region ? `https://bedrock-runtime.${region}.amazonaws.com` : undefined;
735
+ }
736
+ return entry.defaultBaseURL;
737
+ }
738
+ //# sourceMappingURL=provider-catalog.js.map