@iaforged/context-code 1.0.77 → 1.0.80

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 (127) hide show
  1. package/README.md +68 -68
  2. package/cli.js +8515 -8515
  3. package/context-bootstrap.js +27 -27
  4. package/dist/src/bootstrap/state.js +3 -0
  5. package/dist/src/bridge/bridgeMain.js +40 -40
  6. package/dist/src/cli/print.js +12 -12
  7. package/dist/src/commands/agent/agent.js +8 -0
  8. package/dist/src/commands/commit-push-pr.js +55 -55
  9. package/dist/src/commands/createMovedToPluginCommand.js +9 -9
  10. package/dist/src/commands/init-verifiers.js +238 -238
  11. package/dist/src/commands/init.js +226 -225
  12. package/dist/src/commands/install.js +2 -2
  13. package/dist/src/commands/login/login.js +24 -10
  14. package/dist/src/commands/orchestrate/index.js +1 -1
  15. package/dist/src/commands/orchestrate/orchestrate.js +110 -24
  16. package/dist/src/commands/profile/profile.js +15 -1
  17. package/dist/src/commands/provider/index.js +1 -1
  18. package/dist/src/commands/provider/provider.js +34 -1
  19. package/dist/src/commands/review.js +22 -22
  20. package/dist/src/commands/run/index.js +2 -2
  21. package/dist/src/commands/run/run.js +63 -61
  22. package/dist/src/commands/team/index.js +1 -1
  23. package/dist/src/commands/team/team.js +84 -76
  24. package/dist/src/commands/team-auto/teamAuto.js +89 -29
  25. package/dist/src/commands/terminalSetup/terminalSetup.js +24 -24
  26. package/dist/src/commands/usage/index.js +7 -0
  27. package/dist/src/commands/usage/usage.js +5 -0
  28. package/dist/src/commands/workspace/workspace.js +39 -31
  29. package/dist/src/commands.js +0 -2
  30. package/dist/src/components/ConsoleOAuthFlow.js +92 -14
  31. package/dist/src/components/ModelPicker.js +2 -0
  32. package/dist/src/components/agents/AgentsList.js +9 -9
  33. package/dist/src/components/agents/AgentsMenu.js +3 -3
  34. package/dist/src/components/agents/generateAgent.js +92 -92
  35. package/dist/src/components/agents/utils.js +13 -9
  36. package/dist/src/components/grove/Grove.js +10 -10
  37. package/dist/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.js +8 -8
  38. package/dist/src/constants/geminiOAuth.js +13 -0
  39. package/dist/src/constants/github-app.js +134 -134
  40. package/dist/src/constants/prompts.js +123 -123
  41. package/dist/src/coordinator/coordinatorMode.js +252 -252
  42. package/dist/src/hooks/useTypeahead.js +7 -7
  43. package/dist/src/ink/reconciler.js +7 -7
  44. package/dist/src/main.js +5 -5
  45. package/dist/src/memdir/findRelevantMemories.js +6 -6
  46. package/dist/src/projectOnboardingState.js +3 -3
  47. package/dist/src/services/MagicDocs/prompts.js +56 -56
  48. package/dist/src/services/PromptSuggestion/promptSuggestion.js +29 -29
  49. package/dist/src/services/SessionMemory/prompts.js +66 -66
  50. package/dist/src/services/api/openai.js +584 -21
  51. package/dist/src/services/limits/adapters/ollama.js +3 -3
  52. package/dist/src/services/oauth/geminiCli.js +107 -0
  53. package/dist/src/services/orchestration/execution/AgentTaskExecutor.js +5 -3
  54. package/dist/src/services/orchestration/execution/OrchestrationExecutionRuntime.js +18 -18
  55. package/dist/src/services/orchestration/global/reporting.js +2 -2
  56. package/dist/src/services/toolUseSummary/toolUseSummaryGenerator.js +9 -9
  57. package/dist/src/skills/bundled/batch.js +78 -78
  58. package/dist/src/skills/bundled/claudeApi.js +34 -34
  59. package/dist/src/skills/bundled/claudeInChrome.js +4 -4
  60. package/dist/src/skills/bundled/debug.js +36 -36
  61. package/dist/src/skills/bundled/scheduleRemoteAgents.js +151 -151
  62. package/dist/src/skills/bundled/skillify.js +132 -132
  63. package/dist/src/skills/bundled/stuck.js +53 -53
  64. package/dist/src/skills/bundled/updateConfig.js +418 -418
  65. package/dist/src/tasks/RemoteAgentTask/RemoteAgentTask.js +26 -26
  66. package/dist/src/tools/AgentTool/AgentTool.js +7 -7
  67. package/dist/src/tools/AgentTool/agentDisplay.js +18 -10
  68. package/dist/src/tools/AgentTool/built-in/claudeCodeGuideAgent.js +67 -67
  69. package/dist/src/tools/AgentTool/built-in/exploreAgent.js +32 -32
  70. package/dist/src/tools/AgentTool/built-in/generalPurposeAgent.js +13 -13
  71. package/dist/src/tools/AgentTool/built-in/planAgent.js +49 -49
  72. package/dist/src/tools/AgentTool/built-in/statuslineSetup.js +129 -129
  73. package/dist/src/tools/AgentTool/built-in/verificationAgent.js +119 -119
  74. package/dist/src/tools/AgentTool/prompt.js +131 -131
  75. package/dist/src/tools/AgentTool/runAgent.js +9 -9
  76. package/dist/src/tools/BashTool/BashTool.js +10 -10
  77. package/dist/src/tools/BashTool/prompt.js +94 -94
  78. package/dist/src/tools/ConfigTool/prompt.js +29 -29
  79. package/dist/src/tools/EnterWorktreeTool/prompt.js +27 -27
  80. package/dist/src/tools/FileReadTool/prompt.js +12 -12
  81. package/dist/src/tools/PowerShellTool/prompt.js +82 -82
  82. package/dist/src/tools/RemoteTriggerTool/prompt.js +9 -9
  83. package/dist/src/tools/ScheduleCronTool/prompt.js +37 -37
  84. package/dist/src/tools/TeamCreateTool/prompt.js +110 -110
  85. package/dist/src/tools/TeamDeleteTool/prompt.js +13 -13
  86. package/dist/src/utils/advisor.js +15 -15
  87. package/dist/src/utils/api.js +2 -2
  88. package/dist/src/utils/auth.js +207 -2
  89. package/dist/src/utils/autoUpdater.js +18 -18
  90. package/dist/src/utils/bash/ShellSnapshot.js +86 -86
  91. package/dist/src/utils/bash/commands.js +61 -61
  92. package/dist/src/utils/claudeInChrome/prompt.js +53 -53
  93. package/dist/src/utils/claudeInChrome/setup.js +8 -8
  94. package/dist/src/utils/claudemd.js +19 -7
  95. package/dist/src/utils/databaseMcp/server/queries.js +632 -632
  96. package/dist/src/utils/deepLink/registerProtocol.js +35 -35
  97. package/dist/src/utils/deepLink/terminalLauncher.js +12 -12
  98. package/dist/src/utils/hooks/execAgentHook.js +7 -7
  99. package/dist/src/utils/hooks/execPromptHook.js +4 -4
  100. package/dist/src/utils/hooks/skillImprovement.js +36 -36
  101. package/dist/src/utils/logoV2Utils.js +1 -1
  102. package/dist/src/utils/mcp/dateTimeParser.js +9 -9
  103. package/dist/src/utils/messages.js +191 -191
  104. package/dist/src/utils/model/model.js +18 -0
  105. package/dist/src/utils/model/modelOptions.js +51 -1
  106. package/dist/src/utils/model/modelStrings.js +5 -1
  107. package/dist/src/utils/model/modelSupportOverrides.js +3 -0
  108. package/dist/src/utils/model/providerBaseUrls.js +6 -1
  109. package/dist/src/utils/model/providerCatalog.js +64 -28
  110. package/dist/src/utils/model/providerModels.js +88 -17
  111. package/dist/src/utils/model/providerProfiles.js +8 -0
  112. package/dist/src/utils/model/providerProfilesDb.js +578 -393
  113. package/dist/src/utils/model/providerSwitch.js +12 -0
  114. package/dist/src/utils/model/providerWorkspaces.js +2 -0
  115. package/dist/src/utils/model/providers.js +65 -2
  116. package/dist/src/utils/orchestration/store/providerWorkspaceStore.js +3 -1
  117. package/dist/src/utils/orchestration/store/runStore.js +47 -47
  118. package/dist/src/utils/orchestration/store/teamStore.js +61 -61
  119. package/dist/src/utils/powershell/parser.js +253 -253
  120. package/dist/src/utils/sessionTitle.js +12 -12
  121. package/dist/src/utils/sideQuestion.js +17 -17
  122. package/dist/src/utils/status.js +1 -1
  123. package/dist/src/utils/swarm/backends/registry.js +9 -9
  124. package/dist/src/utils/telemetry/instrumentation.js +9 -9
  125. package/dist/src/utils/teleport.js +15 -15
  126. package/dist/src/utils/undercover.js +28 -28
  127. package/package.json +1 -1
@@ -1,13 +1,49 @@
1
1
  export const VISIBLE_PROVIDERS = [
2
2
  {
3
- id: 'claude',
4
- label: 'Claude (Anthropic)',
5
- description: 'Suscripcion Claude o Anthropic Console',
3
+ id: 'minimax',
4
+ label: 'MiniMax',
5
+ description: 'API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.',
6
6
  setup: {
7
- kind: 'oauth',
8
- intro: 'Inicia sesion con tu cuenta de Claude o Anthropic Console.',
9
- nextStep: 'Despues de iniciar sesion, elige un modelo desde /model.',
10
- actionLabel: 'Continuar con Claude',
7
+ kind: 'api-key',
8
+ intro: 'Pega tu API key de MiniMax.',
9
+ nextStep: 'Despues, elige un modelo MiniMax compatible con Anthropic desde /model.',
10
+ actionLabel: 'Pegar API key',
11
+ },
12
+ implemented: true,
13
+ },
14
+ {
15
+ id: 'openrouter',
16
+ label: 'OpenRouter',
17
+ description: 'API key propia. Luego elige un modelo en /model.',
18
+ setup: {
19
+ kind: 'api-key',
20
+ intro: 'Pega tu API key de OpenRouter.',
21
+ nextStep: 'Despues, elige un modelo compatible desde /model.',
22
+ actionLabel: 'Pegar API key',
23
+ },
24
+ implemented: true,
25
+ },
26
+ {
27
+ id: 'ollama',
28
+ label: 'Ollama',
29
+ description: 'Servidor Ollama compatible. Incluye modelos locales y modelos cloud si hiciste ollama signin.',
30
+ setup: {
31
+ kind: 'local-server',
32
+ intro: 'Esto solo configura el servidor Ollama; no abre un login OAuth.',
33
+ nextStep: 'Asegurate de tener ollama serve activo. Si usas cloud, ejecuta ollama signin fuera del CLI.',
34
+ actionLabel: 'Continuar con Ollama',
35
+ },
36
+ implemented: true,
37
+ },
38
+ {
39
+ id: 'ollama-cloud',
40
+ label: 'Ollama Cloud',
41
+ description: 'Modelos cloud desde tu servidor Ollama autenticado con ollama signin.',
42
+ setup: {
43
+ kind: 'local-server',
44
+ intro: 'Esto usa tu servidor Ollama ya autenticado; no abre un login OAuth.',
45
+ nextStep: 'Ejecuta ollama signin fuera del CLI, usa http://localhost:11434/v1 y despues elige un modelo cloud desde /model.',
46
+ actionLabel: 'Continuar con Ollama Cloud',
11
47
  },
12
48
  implemented: true,
13
49
  },
@@ -24,26 +60,26 @@ export const VISIBLE_PROVIDERS = [
24
60
  implemented: true,
25
61
  },
26
62
  {
27
- id: 'openrouter',
28
- label: 'OpenRouter',
29
- description: 'API key propia. Luego elige un modelo en /model.',
63
+ id: 'gemini-google',
64
+ label: 'Gemini Google OAuth',
65
+ description: 'Cuenta Google mediante OAuth compatible con Gemini CLI.',
30
66
  setup: {
31
- kind: 'api-key',
32
- intro: 'Pega tu API key de OpenRouter.',
33
- nextStep: 'Despues, elige un modelo compatible desde /model.',
34
- actionLabel: 'Pegar API key',
67
+ kind: 'oauth',
68
+ intro: 'Inicia sesion con tu cuenta de Google usando el flujo OAuth de Gemini CLI.',
69
+ nextStep: 'Usa /login y elige Gemini Google para abrir el navegador y guardar el token OAuth.',
70
+ actionLabel: 'Continuar con Google',
35
71
  },
36
72
  implemented: true,
37
73
  },
38
74
  {
39
- id: 'ollama',
40
- label: 'Ollama Local',
41
- description: 'Servidor Ollama compatible. Modelos locales; puedes usar localhost o una URL remota.',
75
+ id: 'gemini-api',
76
+ label: 'Gemini API',
77
+ description: 'API key de Google AI Studio, usando endpoint OpenAI-compatible.',
42
78
  setup: {
43
- kind: 'local-server',
44
- intro: 'Ollama local no usa API key.',
45
- nextStep: 'Ingresa la URL de tu servidor Ollama. Por defecto usa http://localhost:11434/v1.',
46
- actionLabel: 'Continuar con servidor local',
79
+ kind: 'api-key',
80
+ intro: 'Pega tu API key de Gemini / Google AI Studio.',
81
+ nextStep: 'Despues, elige un modelo Gemini desde /model.',
82
+ actionLabel: 'Pegar API key',
47
83
  },
48
84
  implemented: true,
49
85
  },
@@ -60,14 +96,14 @@ export const VISIBLE_PROVIDERS = [
60
96
  implemented: true,
61
97
  },
62
98
  {
63
- id: 'minimax',
64
- label: 'MiniMax',
65
- description: 'API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.',
99
+ id: 'claude',
100
+ label: 'Claude (Anthropic)',
101
+ description: 'Suscripcion Claude o Anthropic Console',
66
102
  setup: {
67
- kind: 'api-key',
68
- intro: 'Pega tu API key de MiniMax.',
69
- nextStep: 'Despues, elige un modelo MiniMax compatible con Anthropic desde /model.',
70
- actionLabel: 'Pegar API key',
103
+ kind: 'oauth',
104
+ intro: 'Inicia sesion con tu cuenta de Claude o Anthropic Console.',
105
+ nextStep: 'Despues de iniciar sesion, elige un modelo desde /model.',
106
+ actionLabel: 'Continuar con Claude',
71
107
  },
72
108
  implemented: true,
73
109
  },
@@ -1,4 +1,4 @@
1
- import { getMiniMaxAccessToken, getOpenAICompatibleAccessToken } from '../auth.js';
1
+ import { getGeminiGoogleAuthHeaders, getMiniMaxAccessToken, getOpenAICompatibleAccessToken, } from '../auth.js';
2
2
  import { getConfiguredProviderBaseUrl } from './providerBaseUrls.js';
3
3
  import { getResolvedProviderProfileId, isProfiledProvider, } from './providerProfiles.js';
4
4
  const MINIMAX_MODEL_DESCRIPTIONS = {
@@ -23,6 +23,38 @@ const MINIMAX_ANTHROPIC_MODELS = [
23
23
  label: modelId,
24
24
  description: MINIMAX_MODEL_DESCRIPTIONS[modelId.toLowerCase()] ?? '',
25
25
  }));
26
+ const GEMINI_DEFAULT_MODELS = [
27
+ {
28
+ value: 'gemini-3.1-pro-preview',
29
+ label: 'Gemini 3.1 Pro Preview',
30
+ description: 'Modelo Gemini principal para razonamiento, codigo y agentes.',
31
+ },
32
+ {
33
+ value: 'gemini-3-flash-preview',
34
+ label: 'Gemini 3 Flash Preview',
35
+ description: 'Modelo Gemini rapido con capacidades multimodales y de codigo.',
36
+ },
37
+ {
38
+ value: 'gemini-3.1-flash-lite-preview',
39
+ label: 'Gemini 3.1 Flash-Lite Preview',
40
+ description: 'Variante de bajo costo y baja latencia.',
41
+ },
42
+ {
43
+ value: 'gemini-2.5-pro',
44
+ label: 'Gemini 2.5 Pro',
45
+ description: 'Modelo estable para razonamiento y codigo.',
46
+ },
47
+ {
48
+ value: 'gemini-2.5-flash',
49
+ label: 'Gemini 2.5 Flash',
50
+ description: 'Modelo estable rapido para alto volumen.',
51
+ },
52
+ {
53
+ value: 'gemini-2.5-flash-lite',
54
+ label: 'Gemini 2.5 Flash-Lite',
55
+ description: 'Modelo estable economico y de baja latencia.',
56
+ },
57
+ ];
26
58
  const providerModelCache = new Map();
27
59
  const providerHealthCache = new Map();
28
60
  const PROVIDER_HEALTH_CACHE_TTL_MS = 30_000;
@@ -33,6 +65,15 @@ function ensureV1Suffix(value) {
33
65
  const trimmed = trimTrailingSlash(value);
34
66
  return trimmed.endsWith('/v1') ? trimmed : `${trimmed}/v1`;
35
67
  }
68
+ function isLocalOllamaProviderHost(baseUrl) {
69
+ try {
70
+ const parsed = new URL(baseUrl);
71
+ return parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1';
72
+ }
73
+ catch {
74
+ return baseUrl.includes('localhost') || baseUrl.includes('127.0.0.1');
75
+ }
76
+ }
36
77
  function getProviderCacheKey(provider) {
37
78
  const baseUrl = getProviderBaseUrl(provider);
38
79
  const profileId = isProfiledProvider(provider) ? getResolvedProviderProfileId(provider) : null;
@@ -43,9 +84,13 @@ function getProviderLabel(provider) {
43
84
  case 'openrouter':
44
85
  return 'OpenRouter';
45
86
  case 'ollama':
46
- return 'Ollama Local';
87
+ return 'Ollama';
47
88
  case 'ollama-cloud':
48
89
  return 'Ollama Cloud';
90
+ case 'gemini-api':
91
+ return 'Gemini API';
92
+ case 'gemini-google':
93
+ return 'Gemini Google';
49
94
  case 'zai':
50
95
  return 'Z.AI';
51
96
  case 'minimax':
@@ -65,13 +110,24 @@ function getProviderBaseUrl(provider) {
65
110
  getConfiguredProviderBaseUrl('ollama') ||
66
111
  'http://localhost:11434/v1');
67
112
  case 'ollama-cloud':
68
- return ensureV1Suffix(process.env.OLLAMA_BASE_URL ||
113
+ return ensureV1Suffix(process.env.OLLAMA_CLOUD_BASE_URL ||
114
+ process.env.OLLAMA_BASE_URL ||
69
115
  getConfiguredProviderBaseUrl('ollama-cloud') ||
70
116
  'http://localhost:11434/v1');
71
117
  case 'zai':
72
118
  return trimTrailingSlash(process.env.ZAI_BASE_URL ||
73
119
  getConfiguredProviderBaseUrl('zai') ||
74
120
  'https://api.z.ai/api/coding/paas/v4');
121
+ case 'gemini-api':
122
+ return trimTrailingSlash(process.env.GEMINI_BASE_URL ||
123
+ process.env.GEMINI_API_BASE_URL ||
124
+ getConfiguredProviderBaseUrl('gemini-api') ||
125
+ 'https://generativelanguage.googleapis.com/v1beta/openai');
126
+ case 'gemini-google':
127
+ return trimTrailingSlash(process.env.GEMINI_GOOGLE_BASE_URL ||
128
+ process.env.GEMINI_BASE_URL ||
129
+ getConfiguredProviderBaseUrl('gemini-google') ||
130
+ 'https://generativelanguage.googleapis.com/v1beta/openai');
75
131
  case 'minimax':
76
132
  return trimTrailingSlash(process.env.MINIMAX_BASE_URL ||
77
133
  getConfiguredProviderBaseUrl('minimax') ||
@@ -82,10 +138,16 @@ function getProviderBaseUrl(provider) {
82
138
  'https://api.openai.com/v1');
83
139
  }
84
140
  }
85
- function buildProviderHeaders(provider) {
141
+ async function buildProviderHeaders(provider) {
142
+ if (provider === 'gemini-google') {
143
+ return getGeminiGoogleAuthHeaders();
144
+ }
86
145
  const headers = {};
87
146
  const token = getOpenAICompatibleAccessToken(provider);
88
- if (provider !== 'ollama' && provider !== 'ollama-cloud' && token) {
147
+ const baseUrl = getProviderBaseUrl(provider);
148
+ const shouldSendBearer = provider !== 'ollama' &&
149
+ !(provider === 'ollama-cloud' && isLocalOllamaProviderHost(baseUrl));
150
+ if (shouldSendBearer && token) {
89
151
  headers.Authorization = `Bearer ${token}`;
90
152
  }
91
153
  if (provider === 'openrouter') {
@@ -145,11 +207,8 @@ function mapOllamaModels(payload) {
145
207
  })
146
208
  .filter((model) => model !== null);
147
209
  }
148
- function filterOllamaModels(provider, models) {
149
- if (provider === 'ollama') {
150
- return models.filter(model => !model.value.toLowerCase().endsWith(':cloud'));
151
- }
152
- if (provider === 'ollama-cloud') {
210
+ function filterOllamaModels(provider, models, baseUrl) {
211
+ if (provider === 'ollama-cloud' && isLocalOllamaProviderHost(baseUrl)) {
153
212
  return models.filter(model => model.value.toLowerCase().endsWith(':cloud'));
154
213
  }
155
214
  return models;
@@ -224,12 +283,13 @@ export async function checkProviderHealth(provider, options = {}) {
224
283
  Authorization: `Bearer ${getMiniMaxAccessToken() ?? ''}`,
225
284
  'Content-Type': 'application/json',
226
285
  }
227
- : buildProviderHeaders(provider);
286
+ : await buildProviderHeaders(provider);
228
287
  const apiKey = provider === 'minimax'
229
288
  ? getMiniMaxAccessToken()
230
289
  : getOpenAICompatibleAccessToken(provider);
231
290
  if (provider !== 'ollama' &&
232
- !(provider === 'ollama-cloud' && baseUrl.includes('localhost')) &&
291
+ provider !== 'gemini-google' &&
292
+ !(provider === 'ollama-cloud' && isLocalOllamaProviderHost(baseUrl)) &&
233
293
  !apiKey) {
234
294
  return cacheProviderHealth(buildHealthResult(provider, 'needs-setup', `${label} no tiene credenciales configuradas.`, { baseUrl }));
235
295
  }
@@ -313,22 +373,33 @@ export async function fetchProviderModels(provider) {
313
373
  const baseUrl = getProviderBaseUrl(provider);
314
374
  const rootUrl = baseUrl.endsWith('/v1') ? baseUrl.slice(0, -3) : baseUrl;
315
375
  try {
316
- const payload = (await fetchJson(`${rootUrl}/api/tags`, buildProviderHeaders(provider)));
317
- models = filterOllamaModels(provider, mapOllamaModels(payload));
376
+ const payload = (await fetchJson(`${rootUrl}/api/tags`, await buildProviderHeaders(provider)));
377
+ models = filterOllamaModels(provider, mapOllamaModels(payload), baseUrl);
318
378
  }
319
379
  catch {
320
- const payload = (await fetchJson(`${baseUrl}/models`, buildProviderHeaders(provider)));
321
- models = filterOllamaModels(provider, mapOpenAICompatibleModels(payload, provider));
380
+ const payload = (await fetchJson(`${baseUrl}/models`, await buildProviderHeaders(provider)));
381
+ models = filterOllamaModels(provider, mapOpenAICompatibleModels(payload, provider), baseUrl);
322
382
  }
323
383
  }
324
384
  else {
325
- const payload = (await fetchJson(`${getProviderBaseUrl(provider)}/models`, buildProviderHeaders(provider)));
385
+ const payload = (await fetchJson(`${getProviderBaseUrl(provider)}/models`, await buildProviderHeaders(provider)));
326
386
  models = mapOpenAICompatibleModels(payload, provider);
327
387
  }
388
+ if (provider === 'gemini-api' || provider === 'gemini-google') {
389
+ const seen = new Set(GEMINI_DEFAULT_MODELS.map(model => model.value));
390
+ models = [
391
+ ...GEMINI_DEFAULT_MODELS,
392
+ ...models.filter(model => !seen.has(model.value)),
393
+ ];
394
+ }
328
395
  providerModelCache.set(cacheKey, models);
329
396
  return models;
330
397
  }
331
398
  catch {
399
+ if (provider === 'gemini-api' || provider === 'gemini-google') {
400
+ providerModelCache.set(cacheKey, GEMINI_DEFAULT_MODELS);
401
+ return GEMINI_DEFAULT_MODELS;
402
+ }
332
403
  return [];
333
404
  }
334
405
  }
@@ -5,6 +5,8 @@ const PROFILED_PROVIDERS = new Set([
5
5
  'openrouter',
6
6
  'ollama',
7
7
  'ollama-cloud',
8
+ 'gemini-api',
9
+ 'gemini-google',
8
10
  'zai',
9
11
  'minimax',
10
12
  ]);
@@ -14,6 +16,8 @@ const DEFAULT_PROFILE_NAMES = {
14
16
  openrouter: 'main',
15
17
  ollama: 'local',
16
18
  'ollama-cloud': 'main',
19
+ 'gemini-api': 'main',
20
+ 'gemini-google': 'main',
17
21
  zai: 'main',
18
22
  minimax: 'main',
19
23
  };
@@ -23,6 +27,8 @@ const DEFAULT_AGENT_NAMES = {
23
27
  openrouter: 'openrouter',
24
28
  ollama: 'ollama-local',
25
29
  'ollama-cloud': 'ollama-cloud',
30
+ 'gemini-api': 'gemini-api',
31
+ 'gemini-google': 'gemini-google',
26
32
  zai: 'z-ai',
27
33
  minimax: 'minimax',
28
34
  };
@@ -30,6 +36,8 @@ const DEFAULT_PROFILE_BASE_URLS = {
30
36
  openrouter: 'https://openrouter.ai/api/v1',
31
37
  ollama: 'http://localhost:11434/v1',
32
38
  'ollama-cloud': 'http://localhost:11434/v1',
39
+ 'gemini-api': 'https://generativelanguage.googleapis.com/v1beta/openai',
40
+ 'gemini-google': 'https://generativelanguage.googleapis.com/v1beta/openai',
33
41
  zai: 'https://api.z.ai/api/coding/paas/v4',
34
42
  minimax: 'https://api.minimax.io/anthropic',
35
43
  };