@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
@@ -6,7 +6,7 @@ import { getProviderWorkspace, listProviderWorkspaces, setProviderWorkspaceEnabl
6
6
  import { createAgent, getAgent, listAgents, setAgentOrchestratorByName, setAgentRoleByName, } from '../agent/agentStore.js';
7
7
  import { getActiveProviderProfile, getLastUsedProviderProfile, listProviderProfiles, } from '../../utils/model/providerProfiles.js';
8
8
  import { getVisibleProvider, VISIBLE_PROVIDERS, } from '../../utils/model/providerCatalog.js';
9
- import { createTeam, createTeamDomain, getProviderWorkspaceByProvider, getTeamByName, listTeams, listTeamDomains, updateTeam, updateTeamDomain, } from '../../utils/orchestration/store/index.js';
9
+ import { createTeam, createTeamUnit, getProviderWorkspaceByProvider, getTeamByName, listTeams, listTeamUnits, updateTeam, updateTeamUnit, } from '../../utils/orchestration/store/index.js';
10
10
  const ORCHESTRATOR_PROFILE_PREFIX = 'profile:';
11
11
  const ORCHESTRATOR_CREATE_PROFILE_PREFIX = 'create-profile:';
12
12
  function normalizeProviderInput(rawProvider) {
@@ -23,6 +23,14 @@ function normalizeProviderInput(rawProvider) {
23
23
  case 'ollama_cloud':
24
24
  case 'ollamacloud':
25
25
  return 'ollama-cloud';
26
+ case 'gemini':
27
+ case 'gemini-api-key':
28
+ case 'google-ai':
29
+ return 'gemini-api';
30
+ case 'gemini-google':
31
+ case 'google':
32
+ case 'google-oauth':
33
+ return 'gemini-google';
26
34
  default:
27
35
  return rawProvider.trim().toLowerCase();
28
36
  }
@@ -147,18 +155,18 @@ function buildSetupGuideMessage() {
147
155
  'Si ya sabes que perfiles quieres usar, tambien puedes ejecutar el modo rapido.',
148
156
  '',
149
157
  'Formato rapido:',
150
- '/workspace setup <team> [orchestrator=<domain|provider/agent>] <provider/profile:domain> [...]',
158
+ '/workspace setup <team> [orchestrator=<equipo|provider/agent>] <provider/profile:equipo> [...]',
151
159
  '',
152
160
  'Ejemplo:',
153
161
  '/workspace setup core-dev orchestrator=backend claude/main:frontend openai/work:backend minimax/main:docs',
154
162
  '',
155
163
  'El modo rapido hara esto:',
156
164
  '1. Habilita cada proveedor como workspace.',
157
- '2. Crea un agente por dominio con nombre <domain>-lead.',
165
+ '2. Crea un agente por equipo interno con nombre <equipo>-lead.',
158
166
  '3. Vincula cada agente al perfil indicado.',
159
167
  '4. Crea el team si no existe.',
160
168
  '5. Usa orchestrator=... como coordinador principal, o el primer agente si no lo indicas.',
161
- '6. Crea o actualiza los dominios del team.',
169
+ '6. Crea o actualiza los equipos internos del team.',
162
170
  '',
163
171
  'Despues puedes ejecutar:',
164
172
  '/team show <team>',
@@ -175,7 +183,7 @@ function parseSetupOrchestrator(rawToken) {
175
183
  }
176
184
  const slashIndex = value.indexOf('/');
177
185
  if (slashIndex <= 0 || slashIndex >= value.length - 1) {
178
- return { type: 'domain', domainName: value.toLowerCase() };
186
+ return { type: 'team', unitName: value.toLowerCase() };
179
187
  }
180
188
  const provider = normalizeProviderInput(value.slice(0, slashIndex));
181
189
  const agentName = value.slice(slashIndex + 1).trim();
@@ -189,9 +197,9 @@ function parseSetupOrchestrator(rawToken) {
189
197
  };
190
198
  }
191
199
  function parseSetupEntry(rawEntry) {
192
- const [providerProfile, rawDomain] = rawEntry.split(':');
193
- const domainName = rawDomain?.trim().toLowerCase();
194
- if (!providerProfile || !domainName) {
200
+ const [providerProfile, rawUnit] = rawEntry.split(':');
201
+ const unitName = rawUnit?.trim().toLowerCase();
202
+ if (!providerProfile || !unitName) {
195
203
  return null;
196
204
  }
197
205
  const slashIndex = providerProfile.indexOf('/');
@@ -208,8 +216,8 @@ function parseSetupEntry(rawEntry) {
208
216
  return {
209
217
  provider: provider,
210
218
  profileName,
211
- domainName,
212
- agentName: `${domainName}-lead`,
219
+ unitName,
220
+ agentName: `${unitName}-lead`,
213
221
  };
214
222
  }
215
223
  function parseSetupArgs(args) {
@@ -250,16 +258,16 @@ function parseSetupArgs(args) {
250
258
  }
251
259
  return { teamName, entries, invalidEntries, orchestrator };
252
260
  }
253
- async function findDomainByName(teamId, domainName) {
254
- const domains = await listTeamDomains(teamId);
255
- return domains.find(domain => domain.domainName.toLowerCase() === domainName.toLowerCase()) ?? null;
261
+ async function findUnitByName(teamId, unitName) {
262
+ const units = await listTeamUnits(teamId);
263
+ return units.find(unit => unit.unitName.toLowerCase() === unitName.toLowerCase()) ?? null;
256
264
  }
257
265
  function formatSetupOrchestrator(orchestrator) {
258
266
  if (!orchestrator) {
259
267
  return 'primer agente indicado';
260
268
  }
261
- if (orchestrator.type === 'domain') {
262
- return `dominio ${orchestrator.domainName}`;
269
+ if (orchestrator.type === 'team') {
270
+ return `equipo ${orchestrator.unitName}`;
263
271
  }
264
272
  return `${orchestrator.provider}/${orchestrator.agentName}`;
265
273
  }
@@ -267,9 +275,9 @@ function resolveSetupCoordinatorEntry(setup) {
267
275
  if (!setup.orchestrator) {
268
276
  return setup.entries[0] ?? null;
269
277
  }
270
- if (setup.orchestrator.type === 'domain') {
271
- return (setup.entries.find(entry => entry.domainName.toLowerCase() ===
272
- setup.orchestrator?.domainName.toLowerCase()) ??
278
+ if (setup.orchestrator.type === 'team') {
279
+ return (setup.entries.find(entry => entry.unitName.toLowerCase() ===
280
+ setup.orchestrator?.unitName.toLowerCase()) ??
273
281
  setup.entries[0] ??
274
282
  null);
275
283
  }
@@ -277,7 +285,7 @@ function resolveSetupCoordinatorEntry(setup) {
277
285
  entry.agentName === setup.orchestrator?.agentName) ?? {
278
286
  provider: setup.orchestrator.provider,
279
287
  profileName: '',
280
- domainName: '',
288
+ unitName: '',
281
289
  agentName: setup.orchestrator.agentName,
282
290
  });
283
291
  }
@@ -301,7 +309,7 @@ async function runWorkspaceSetup(setup) {
301
309
  '',
302
310
  'Resumen de lo que se va a configurar:',
303
311
  `- Orquestador principal: ${formatSetupOrchestrator(setup.orchestrator)}`,
304
- ...setup.entries.map(entry => `- ${entry.domainName}: ${entry.provider}/${entry.profileName} -> agente ${entry.provider}/${entry.agentName}`),
312
+ ...setup.entries.map(entry => `- ${entry.unitName}: ${entry.provider}/${entry.profileName} -> agente ${entry.provider}/${entry.agentName}`),
305
313
  '',
306
314
  'Aplicando cambios:',
307
315
  ];
@@ -328,7 +336,7 @@ async function runWorkspaceSetup(setup) {
328
336
  else {
329
337
  lines.push(`- Agente existente: ${entry.provider}/${entry.agentName}`);
330
338
  }
331
- await setAgentRoleByName(entry.provider, entry.agentName, entry.domainName);
339
+ await setAgentRoleByName(entry.provider, entry.agentName, entry.unitName);
332
340
  }
333
341
  const coordinatorEntry = resolveSetupCoordinatorEntry(setup);
334
342
  if (coordinatorEntry) {
@@ -348,31 +356,31 @@ async function runWorkspaceSetup(setup) {
348
356
  const agent = await getAgent(entry.provider, entry.agentName);
349
357
  const workspace = await getProviderWorkspaceByProvider(entry.provider);
350
358
  if (!agent || !workspace) {
351
- lines.push(`- Saltado ${entry.domainName}: falta agente o workspace.`);
359
+ lines.push(`- Saltado ${entry.unitName}: falta agente o workspace.`);
352
360
  continue;
353
361
  }
354
- const existingDomain = await findDomainByName(team.id, entry.domainName);
355
- if (existingDomain) {
356
- await updateTeamDomain(existingDomain.id, {
362
+ const existingUnit = await findUnitByName(team.id, entry.unitName);
363
+ if (existingUnit) {
364
+ await updateTeamUnit(existingUnit.id, {
357
365
  workspaceId: workspace.id,
358
366
  localOrchestratorAgentId: agent.id,
359
367
  leadAgentId: agent.id,
360
368
  selectionMode: 'manual',
361
369
  required: true,
362
370
  });
363
- lines.push(`- Dominio actualizado: ${entry.domainName} -> ${entry.provider}/${entry.agentName}`);
371
+ lines.push(`- Equipo actualizado: ${entry.unitName} -> ${entry.provider}/${entry.agentName}`);
364
372
  continue;
365
373
  }
366
- await createTeamDomain({
374
+ await createTeamUnit({
367
375
  teamId: team.id,
368
- domainName: entry.domainName,
376
+ unitName: entry.unitName,
369
377
  workspaceId: workspace.id,
370
378
  localOrchestratorAgentId: agent.id,
371
379
  leadAgentId: agent.id,
372
380
  selectionMode: 'manual',
373
381
  required: true,
374
382
  });
375
- lines.push(`- Dominio creado: ${entry.domainName} -> ${entry.provider}/${entry.agentName}`);
383
+ lines.push(`- Equipo creado: ${entry.unitName} -> ${entry.provider}/${entry.agentName}`);
376
384
  }
377
385
  lines.push('', 'Listo. Siguientes comandos recomendados:', `/team show ${setup.teamName}`, `/orchestrate ${setup.teamName} <describe tu objetivo>`, '/run list', '/run resume <run-id>');
378
386
  return lines.join('\n');
@@ -578,7 +586,7 @@ function WorkspaceSetupWizard({ onDone, }) {
578
586
  onDone([
579
587
  `Equipo seleccionado: ${cleanTeamName}.`,
580
588
  `Orquestador seleccionado: ${selectedOrchestrator}.`,
581
- 'Ahora completa los dominios con provider/profile:area.',
589
+ 'Ahora completa los equipos internos con provider/profile:equipo.',
582
590
  'Ejemplo: claude/main:frontend openai/work:backend minimax/main:docs',
583
591
  ].join('\n'), {
584
592
  nextInput: `/workspace setup ${cleanTeamName} orchestrator=${selectedOrchestrator} `,
@@ -689,7 +697,7 @@ export async function call(onDone, _context, args) {
689
697
  }
690
698
  const action = parseProviderAction(trimmedArgs);
691
699
  if (!action) {
692
- onDone('Uso: /workspace, /workspace list, /workspace show <proveedor>, /workspace enable <proveedor>, /workspace disable <proveedor>, /workspace setup <team> <provider/profile:domain>..., /workspace orchestrator');
700
+ onDone('Uso: /workspace, /workspace list, /workspace show <proveedor>, /workspace enable <proveedor>, /workspace disable <proveedor>, /workspace setup <team> <provider/profile:equipo>..., /workspace orchestrator');
693
701
  return null;
694
702
  }
695
703
  if (action.action === 'show') {
@@ -155,7 +155,6 @@ import run from './commands/run/index.js';
155
155
  import workspace from './commands/workspace/index.js';
156
156
  import orchestrate from './commands/orchestrate/index.js';
157
157
  import provider from './commands/provider/index.js';
158
- import loginOpenAI from './commands/login-openai/index.js';
159
158
  import tag from './commands/tag/index.js';
160
159
  import team from './commands/team/index.js';
161
160
  import teamAuto from './commands/team-auto/index.js';
@@ -247,7 +246,6 @@ const COMMANDS = memoize(() => [
247
246
  workspace,
248
247
  orchestrate,
249
248
  provider,
250
- loginOpenAI,
251
249
  outputStyle,
252
250
  remoteEnv,
253
251
  plugin,
@@ -12,7 +12,8 @@ import { getSSLErrorHint } from '../services/api/errorUtils.js';
12
12
  import { sendNotification } from '../services/notifier.js';
13
13
  import { OAuthService } from '../services/oauth/index.js';
14
14
  import { getOAuthRequestDetails } from '../services/oauth/client.js';
15
- import { getOauthAccountInfo, saveProviderApiKey, validateForceLoginOrg } from '../utils/auth.js';
15
+ import { checkGeminiGoogleCredentialsValid, getOauthAccountInfo, saveGeminiGoogleOAuthTokens, saveProviderApiKey, validateForceLoginOrg } from '../utils/auth.js';
16
+ import { startGeminiCliOAuthFlow } from '../services/oauth/geminiCli.js';
16
17
  import { resolveProviderProfile } from '../utils/model/providerProfiles.js';
17
18
  import { logError } from '../utils/log.js';
18
19
  import { getVisibleProvider } from '../utils/model/providerCatalog.js';
@@ -22,6 +23,22 @@ import { Select } from './CustomSelect/select.js';
22
23
  import { KeyboardShortcutHint } from './design-system/KeyboardShortcutHint.js';
23
24
  import { Spinner } from './Spinner.js';
24
25
  import TextInput from './TextInput.js';
26
+ const LOGIN_PROVIDER_ORDER = [
27
+ 'minimax',
28
+ 'openrouter',
29
+ 'zai',
30
+ 'ollama',
31
+ 'openai',
32
+ 'claudeai',
33
+ 'gemini-google',
34
+ 'gemini-api',
35
+ 'console',
36
+ ];
37
+ function sortLoginProviderOptions(options) {
38
+ const order = new Map(LOGIN_PROVIDER_ORDER.map((value, index) => [value, index]));
39
+ return [...options].sort((a, b) => (order.get(a.value) ?? Number.MAX_SAFE_INTEGER) -
40
+ (order.get(b.value) ?? Number.MAX_SAFE_INTEGER));
41
+ }
25
42
  const PASTE_HERE_MSG = 'Pega aqui el codigo si se solicita > ';
26
43
  function formatOAuthDebugDetails(provider, port) {
27
44
  if (provider !== 'openai') {
@@ -108,6 +125,12 @@ export function ConsoleOAuthFlow({ onDone, startingMessage, mode = 'login', forc
108
125
  context: 'Confirmation',
109
126
  isActive: oauthStatus.state === 'platform_setup'
110
127
  });
128
+ useKeybinding('confirm:yes', () => {
129
+ void handleGeminiGoogleAuthSubmit();
130
+ }, {
131
+ context: 'Confirmation',
132
+ isActive: oauthStatus.state === 'provider_google_setup'
133
+ });
111
134
  // Handle Enter to retry on error state
112
135
  useKeybinding('confirm:yes', () => {
113
136
  if (oauthStatus.state === 'error' && oauthStatus.toRetry) {
@@ -186,7 +209,7 @@ export function ConsoleOAuthFlow({ onDone, startingMessage, mode = 'login', forc
186
209
  setOAuthStatus({
187
210
  state: 'success'
188
211
  });
189
- const providerLabel = provider === 'openrouter' ? 'OpenRouter' : provider === 'zai' ? 'Z.AI' : 'MiniMax';
212
+ const providerLabel = getVisibleProvider(provider).label;
190
213
  void sendNotification({
191
214
  message: `API key de ${providerLabel} guardada`,
192
215
  notificationType: 'auth_success'
@@ -240,6 +263,44 @@ export function ConsoleOAuthFlow({ onDone, startingMessage, mode = 'login', forc
240
263
  });
241
264
  }
242
265
  }, [onDone, terminal]);
266
+ const handleGeminiGoogleAuthSubmit = useCallback(async () => {
267
+ setOAuthStatus({
268
+ state: 'provider_google_auth_running'
269
+ });
270
+ try {
271
+ const alreadyValid = await checkGeminiGoogleCredentialsValid();
272
+ if (alreadyValid) {
273
+ onDone('gemini-google');
274
+ return;
275
+ }
276
+ const tokens = await startGeminiCliOAuthFlow();
277
+ saveGeminiGoogleOAuthTokens(tokens);
278
+ const isValid = await checkGeminiGoogleCredentialsValid();
279
+ if (!isValid) {
280
+ void sendNotification({
281
+ message: 'OAuth de Gemini guardado; Code Assist no valido el proyecto de cuota',
282
+ notificationType: 'auth_success'
283
+ }, terminal);
284
+ onDone('gemini-google');
285
+ return;
286
+ }
287
+ void sendNotification({
288
+ message: 'Credenciales de Gemini Google listas',
289
+ notificationType: 'auth_success'
290
+ }, terminal);
291
+ onDone('gemini-google');
292
+ }
293
+ catch (error) {
294
+ logError(error);
295
+ setOAuthStatus({
296
+ state: 'error',
297
+ message: error.message,
298
+ toRetry: {
299
+ state: 'provider_google_setup'
300
+ }
301
+ });
302
+ }
303
+ }, [onDone, terminal]);
243
304
  const startOAuth = useCallback(async () => {
244
305
  try {
245
306
  logEvent('tengu_oauth_flow_start', {
@@ -362,7 +423,7 @@ export function ConsoleOAuthFlow({ onDone, startingMessage, mode = 'login', forc
362
423
  return _jsxs(Box, { flexDirection: "column", gap: 1, children: [oauthStatus.state === 'waiting_for_login' && showPastePrompt && _jsxs(Box, { flexDirection: "column", gap: 1, paddingBottom: 1, children: [_jsxs(Box, { paddingX: 1, children: [_jsxs(Text, { dimColor: true, children: ["Browser didn't open? Use the url below to sign in", ' '] }), urlCopied ? _jsx(Text, { color: "success", children: "(Copied!)" }) : _jsx(Text, { dimColor: true, children: _jsx(KeyboardShortcutHint, { shortcut: "c", action: "copiar", parens: true }) })] }), _jsx(Link, { url: oauthStatus.url, children: _jsx(Text, { dimColor: true, children: oauthStatus.url }) })] }, "urlToCopy"), mode === 'setup-token' && oauthStatus.state === 'success' && oauthStatus.token && _jsxs(Box, { flexDirection: "column", gap: 1, paddingTop: 1, children: [_jsx(Text, { color: "success", children: "\u2713 Long-lived authentication token created successfully!" }), _jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { children: "Your OAuth token (valid for 1 year):" }), _jsx(Text, { color: "warning", children: oauthStatus.token }), _jsx(Text, { dimColor: true, children: "Store this token securely. You won't be able to see it again." }), _jsx(Text, { dimColor: true, children: "Use this token by setting: export CLAUDE_CODE_OAUTH_TOKEN=<token>" })] })] }, "tokenOutput"), _jsx(Box, { paddingLeft: 1, flexDirection: "column", gap: 1, children: _jsx(OAuthStatusMessage, { oauthStatus: oauthStatus, oauthProvider: oauthProvider, mode: mode, startingMessage: startingMessage, forcedMethodMessage: forcedMethodMessage, showPastePrompt: showPastePrompt, pastedCode: pastedCode, setPastedCode: setPastedCode, cursorOffset: cursorOffset, setCursorOffset: setCursorOffset, textInputColumns: textInputColumns, handleSubmitCode: handleSubmitCode, setOAuthStatus: setOAuthStatus, setLoginWithClaudeAi: setLoginWithClaudeAi, setOAuthProvider: setOAuthProvider, providerApiKey: providerApiKey, setProviderApiKey: setProviderApiKey, providerApiKeyCursorOffset: providerApiKeyCursorOffset, setProviderApiKeyCursorOffset: setProviderApiKeyCursorOffset, handleProviderApiKeySubmit: handleProviderApiKeySubmit, providerBaseUrl: providerBaseUrl, setProviderBaseUrlInput: setProviderBaseUrlInput, providerBaseUrlCursorOffset: providerBaseUrlCursorOffset, setProviderBaseUrlCursorOffset: setProviderBaseUrlCursorOffset, handleProviderBaseUrlSubmit: handleProviderBaseUrlSubmit, onDone: onDone }) })] });
363
424
  }
364
425
  function OAuthStatusMessage(t0) {
365
- const $ = _c(65);
426
+ const $ = _c(68);
366
427
  const { oauthStatus, oauthProvider, mode, startingMessage, forcedMethodMessage, showPastePrompt, pastedCode, setPastedCode, cursorOffset, setCursorOffset, textInputColumns, handleSubmitCode, setOAuthStatus, setLoginWithClaudeAi, setOAuthProvider, providerApiKey, setProviderApiKey, providerApiKeyCursorOffset, setProviderApiKeyCursorOffset, handleProviderApiKeySubmit, providerBaseUrl, setProviderBaseUrlInput, providerBaseUrlCursorOffset, setProviderBaseUrlCursorOffset, handleProviderBaseUrlSubmit, onDone } = t0;
367
428
  switch (oauthStatus.state) {
368
429
  case "idle":
@@ -410,17 +471,20 @@ function OAuthStatusMessage(t0) {
410
471
  let t6;
411
472
  if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
412
473
  t6 = [t4, t5, {
413
- label: _jsxs(Text, { children: ["Plataforma de terceros \u00B7", " ", _jsx(Text, { dimColor: true, children: "Amazon Bedrock, Microsoft Foundry o Vertex AI" }), "\n"] }),
414
- value: "platform"
415
- }, {
416
474
  label: _jsxs(Text, { children: ["Cuenta de OpenAI / Codex \u00B7", " ", _jsx(Text, { dimColor: true, children: "Login OAuth" }), "\n"] }),
417
475
  value: "openai"
418
476
  }, {
419
477
  label: _jsxs(Text, { children: ["OpenRouter \u00B7", " ", _jsx(Text, { dimColor: true, children: "API key / OpenAI-compatible" }), "\n"] }),
420
478
  value: "openrouter"
421
479
  }, {
422
- label: _jsxs(Text, { children: ["Ollama Local \u00B7", " ", _jsx(Text, { dimColor: true, children: "Servidor local compatible" }), "\n"] }),
480
+ label: _jsxs(Text, { children: ["Ollama \u00B7", " ", _jsx(Text, { dimColor: true, children: "Servidor local compatible" }), "\n"] }),
423
481
  value: "ollama"
482
+ }, {
483
+ label: _jsxs(Text, { children: ["Gemini API - ", _jsx(Text, { dimColor: true, children: "API key / OpenAI-compatible" }), "\n"] }),
484
+ value: "gemini-api"
485
+ }, {
486
+ label: _jsxs(Text, { children: ["Gemini Google - ", _jsx(Text, { dimColor: true, children: "OAuth/ADC de Google" }), "\n"] }),
487
+ value: "gemini-google"
424
488
  }, {
425
489
  label: _jsxs(Text, { children: ["Z.AI \u00B7", " ", _jsx(Text, { dimColor: true, children: "API key / OpenAI-compatible" }), "\n"] }),
426
490
  value: "zai"
@@ -434,8 +498,8 @@ function OAuthStatusMessage(t0) {
434
498
  t6 = $[5];
435
499
  }
436
500
  let t7;
437
- if ($[6] !== setLoginWithClaudeAi || $[7] !== setOAuthStatus || $[8] !== setOAuthProvider) {
438
- t7 = _jsx(Box, { children: _jsx(Select, { options: t6, onChange: value_0 => {
501
+ if ($[6] !== setLoginWithClaudeAi || $[7] !== setOAuthStatus || $[8] !== setOAuthProvider || $[65] !== onDone) {
502
+ t7 = _jsx(Box, { children: _jsx(Select, { options: sortLoginProviderOptions(t6), onChange: value_0 => {
439
503
  if (value_0 === "platform") {
440
504
  logEvent("tengu_oauth_platform_selected", {});
441
505
  setOAuthStatus({
@@ -456,13 +520,18 @@ function OAuthStatusMessage(t0) {
456
520
  provider: "openrouter"
457
521
  });
458
522
  }
459
- else if (value_0 === "zai" || value_0 === "minimax") {
523
+ else if (value_0 === "gemini-api" || value_0 === "zai" || value_0 === "minimax") {
460
524
  setOAuthStatus({
461
525
  state: "provider_api_key_input",
462
526
  provider: value_0
463
527
  });
464
528
  }
465
- else if (value_0 === "ollama") {
529
+ else if (value_0 === "gemini-google") {
530
+ setOAuthStatus({
531
+ state: "provider_google_setup"
532
+ });
533
+ }
534
+ else if (value_0 === "ollama" || value_0 === "ollama-cloud") {
466
535
  setProviderBaseUrlInput(getConfiguredProviderBaseUrl(value_0));
467
536
  setProviderBaseUrlCursorOffset(0);
468
537
  setOAuthStatus({
@@ -488,10 +557,11 @@ function OAuthStatusMessage(t0) {
488
557
  $[6] = setLoginWithClaudeAi;
489
558
  $[7] = setOAuthStatus;
490
559
  $[8] = setOAuthProvider;
491
- $[9] = t7;
560
+ $[65] = onDone;
561
+ $[66] = t7;
492
562
  }
493
563
  else {
494
- t7 = $[9];
564
+ t7 = $[66];
495
565
  }
496
566
  let t8;
497
567
  if ($[10] !== t2 || $[11] !== t7) {
@@ -509,7 +579,7 @@ function OAuthStatusMessage(t0) {
509
579
  {
510
580
  let t1;
511
581
  if ($[50] !== oauthStatus.provider) {
512
- t1 = _jsxs(Text, { bold: true, children: ["Ingresa la API key de ", oauthStatus.provider === "openrouter" ? "OpenRouter" : oauthStatus.provider === "zai" ? "Z.AI" : "MiniMax"] });
582
+ t1 = _jsxs(Text, { bold: true, children: ["Ingresa la API key de ", getVisibleProvider(oauthStatus.provider).label] });
513
583
  $[50] = oauthStatus.provider;
514
584
  $[51] = t1;
515
585
  }
@@ -558,6 +628,14 @@ function OAuthStatusMessage(t0) {
558
628
  const providerInfo = getVisibleProvider(oauthStatus.provider);
559
629
  return _jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { bold: true, children: providerInfo.label }), _jsx(Text, { dimColor: true, children: providerInfo.setup.intro }), _jsx(Text, { dimColor: true, children: providerInfo.setup.nextStep }), _jsx(Text, { children: "URL del servidor > " }), _jsx(Box, { children: _jsx(TextInput, { value: providerBaseUrl, onChange: setProviderBaseUrlInput, onSubmit: value => handleProviderBaseUrlSubmit(value, oauthStatus.provider), cursorOffset: providerBaseUrlCursorOffset, onChangeCursorOffset: setProviderBaseUrlCursorOffset, columns: textInputColumns }) }), _jsxs(Text, { color: "success", children: ["Presiona ", _jsx(Text, { bold: true, children: "Enter" }), " para guardar la URL y continuar."] })] });
560
630
  }
631
+ case "provider_google_setup":
632
+ {
633
+ return _jsxs(Box, { flexDirection: "column", gap: 1, children: [_jsx(Text, { bold: true, children: "Gemini Google OAuth" }), _jsx(Text, { dimColor: true, children: "Context Code usara el flujo OAuth compatible con Gemini CLI y abrira Google en el navegador." }), _jsx(Text, { dimColor: true, children: "Se guardara el access token y refresh token en el perfil activo de Gemini Google." }), _jsxs(Text, { color: "success", children: ["Presiona ", _jsx(Text, { bold: true, children: "Enter" }), " para iniciar sesion con tu cuenta de Google."] })] });
634
+ }
635
+ case "provider_google_auth_running":
636
+ {
637
+ return _jsxs(Box, { children: [_jsx(Spinner, {}), _jsx(Text, { children: "Abriendo Google OAuth para Gemini..." })] });
638
+ }
561
639
  case "platform_setup":
562
640
  {
563
641
  let t1;
@@ -60,6 +60,8 @@ export function ModelPicker(t0) {
60
60
  provider === 'openrouter' ||
61
61
  provider === 'ollama' ||
62
62
  provider === 'ollama-cloud' ||
63
+ provider === 'gemini-api' ||
64
+ provider === 'gemini-google' ||
63
65
  provider === 'zai' ||
64
66
  provider === 'minimax') {
65
67
  const { getCachedProviderModels, fetchProviderModels } = await import('../utils/model/providerModels.js');
@@ -26,7 +26,7 @@ export function AgentsList(t0) {
26
26
  const getOverrideInfo = _temp;
27
27
  let t2;
28
28
  if ($[2] !== isCreateNewSelected) {
29
- t2 = () => _jsxs(Box, { children: [_jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: isCreateNewSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: "Create new agent" })] });
29
+ t2 = () => _jsxs(Box, { children: [_jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: isCreateNewSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { color: isCreateNewSelected ? "suggestion" : undefined, children: "Crear nuevo agente" })] });
30
30
  $[2] = isCreateNewSelected;
31
31
  $[3] = t2;
32
32
  }
@@ -43,7 +43,7 @@ export function AgentsList(t0) {
43
43
  const dimmed = isBuiltIn || isOverridden;
44
44
  const textColor = !isBuiltIn && isSelected ? "suggestion" : undefined;
45
45
  const resolvedModel = resolveAgentModelDisplay(agent_0);
46
- return _jsxs(Box, { children: [_jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: isBuiltIn ? "" : isSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: agent_0.agentType }), resolvedModel && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", resolvedModel] }), agent_0.memory && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", agent_0.memory, " memory"] }), overriddenBy && _jsxs(Text, { dimColor: !isSelected, color: isSelected ? "warning" : undefined, children: [" ", figures.warning, " shadowed by ", getOverrideSourceLabel(overriddenBy)] })] }, `${agent_0.agentType}-${agent_0.source}`);
46
+ return _jsxs(Box, { children: [_jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: isBuiltIn ? "" : isSelected ? `${figures.pointer} ` : " " }), _jsx(Text, { dimColor: dimmed && !isSelected, color: textColor, children: agent_0.agentType }), resolvedModel && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", resolvedModel] }), agent_0.memory && _jsxs(Text, { dimColor: true, color: textColor, children: [" \xB7 ", agent_0.memory, " memoria"] }), overriddenBy && _jsxs(Text, { dimColor: !isSelected, color: isSelected ? "warning" : undefined, children: [" ", figures.warning, " reemplazado por ", getOverrideSourceLabel(overriddenBy)] })] }, `${agent_0.agentType}-${agent_0.source}`);
47
47
  };
48
48
  $[4] = isCreateNewSelected;
49
49
  $[5] = selectedAgent?.agentType;
@@ -160,7 +160,7 @@ export function AgentsList(t0) {
160
160
  let t8;
161
161
  if ($[23] !== renderAgent || $[24] !== sortedAgents) {
162
162
  t8 = t9 => {
163
- const title = t9 === undefined ? "Built-in (always available):" : t9;
163
+ const title = t9 === undefined ? "Integrados (siempre disponibles):" : t9;
164
164
  const builtInAgents = sortedAgents.filter(_temp4);
165
165
  return _jsxs(Box, { flexDirection: "column", marginBottom: 1, paddingLeft: 2, children: [_jsx(Text, { bold: true, dimColor: true, children: title }), builtInAgents.map(renderAgent)] });
166
166
  };
@@ -232,9 +232,9 @@ export function AgentsList(t0) {
232
232
  let t25;
233
233
  let t26;
234
234
  if ($[58] === Symbol.for("react.memo_cache_sentinel")) {
235
- t24 = _jsx(Text, { dimColor: true, children: "No agents found. Create specialized subagents that Claude can delegate to." });
236
- t25 = _jsx(Text, { dimColor: true, children: "Each subagent has its own context window, custom system prompt, and specific tools." });
237
- t26 = _jsx(Text, { dimColor: true, children: "Try creating: Code Reviewer, Code Simplifier, Security Reviewer, Tech Lead, or UX Reviewer." });
235
+ t24 = _jsx(Text, { dimColor: true, children: "No hay agentes. Crea subagentes especializados a los que Context Code pueda delegar tareas." });
236
+ t25 = _jsx(Text, { dimColor: true, children: "Cada subagente tiene su propia ventana de contexto, prompt de sistema personalizado y herramientas especificas." });
237
+ t26 = _jsx(Text, { dimColor: true, children: "Prueba crear: Revisor de codigo, Simplificador de codigo, Revisor de seguridad, Lider tecnico o Revisor UX." });
238
238
  $[58] = t24;
239
239
  $[59] = t25;
240
240
  $[60] = t26;
@@ -268,7 +268,7 @@ export function AgentsList(t0) {
268
268
  }
269
269
  let t29;
270
270
  if ($[69] !== onBack || $[70] !== sourceTitle || $[71] !== t28) {
271
- t29 = _jsx(Dialog, { title: sourceTitle, subtitle: "No agents found", onCancel: onBack, hideInputGuide: true, children: t28 });
271
+ t29 = _jsx(Dialog, { title: sourceTitle, subtitle: "No hay agentes", onCancel: onBack, hideInputGuide: true, children: t28 });
272
272
  $[69] = onBack;
273
273
  $[70] = sourceTitle;
274
274
  $[71] = t28;
@@ -291,7 +291,7 @@ export function AgentsList(t0) {
291
291
  else {
292
292
  t23 = $[74];
293
293
  }
294
- t18 = `${t23} agents`;
294
+ t18 = `${t23} agentes`;
295
295
  t19 = onBack;
296
296
  t20 = true;
297
297
  if ($[75] !== changes) {
@@ -319,7 +319,7 @@ export function AgentsList(t0) {
319
319
  t16 = source === "all" ? _jsxs(_Fragment, { children: [AGENT_SOURCE_GROUPS.filter(_temp9).map(t24 => {
320
320
  const { label, source: groupSource_0 } = t24;
321
321
  return _jsx(React.Fragment, { children: renderAgentGroup(label, sortedAgents.filter(a_7 => a_7.source === groupSource_0)) }, groupSource_0);
322
- }), builtInAgents_0.length > 0 && _jsxs(Box, { flexDirection: "column", marginBottom: 1, paddingLeft: 2, children: [_jsxs(Text, { dimColor: true, children: [_jsx(Text, { bold: true, children: "Built-in agents" }), " (always available)"] }), builtInAgents_0.map(renderAgent)] })] }) : source === "built-in" ? _jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, italic: true, children: "Built-in agents are provided by default and cannot be modified." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: sortedAgents.map(agent_2 => renderAgent(agent_2)) })] }) : _jsxs(_Fragment, { children: [sortedAgents.filter(_temp0).map(agent_3 => renderAgent(agent_3)), sortedAgents.some(_temp1) && _jsxs(_Fragment, { children: [_jsx(Divider, {}), renderBuiltInAgentsSection()] })] });
322
+ }), builtInAgents_0.length > 0 && _jsxs(Box, { flexDirection: "column", marginBottom: 1, paddingLeft: 2, children: [_jsxs(Text, { dimColor: true, children: [_jsx(Text, { bold: true, children: "Agentes integrados" }), " (siempre disponibles)"] }), builtInAgents_0.map(renderAgent)] })] }) : source === "built-in" ? _jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, italic: true, children: "Los agentes integrados vienen por defecto y no se pueden modificar." }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: sortedAgents.map(agent_2 => renderAgent(agent_2)) })] }) : _jsxs(_Fragment, { children: [sortedAgents.filter(_temp0).map(agent_3 => renderAgent(agent_3)), sortedAgents.some(_temp1) && _jsxs(_Fragment, { children: [_jsx(Divider, {}), renderBuiltInAgentsSection()] })] });
323
323
  }
324
324
  $[30] = changes;
325
325
  $[31] = handleKeyDown;
@@ -170,7 +170,7 @@ export function AgentsMenu(t0) {
170
170
  }
171
171
  };
172
172
  });
173
- setChanges(prev_0 => [...prev_0, `Deleted agent: ${chalk.bold(agent.agentType)}`]);
173
+ setChanges(prev_0 => [...prev_0, `Agente eliminado: ${chalk.bold(agent.agentType)}`]);
174
174
  setModeState({
175
175
  mode: "list-agents",
176
176
  source: "all"
@@ -217,8 +217,8 @@ export function AgentsMenu(t0) {
217
217
  let t15;
218
218
  if ($[34] !== changes || $[35] !== onExit) {
219
219
  t15 = () => {
220
- const exitMessage = changes.length > 0 ? `Agent changes:\n${changes.join("\n")}` : undefined;
221
- onExit(exitMessage ?? "Agents dialog dismissed", {
220
+ const exitMessage = changes.length > 0 ? `Cambios de agentes:\n${changes.join("\n")}` : undefined;
221
+ onExit(exitMessage ?? "Panel de agentes cerrado", {
222
222
  display: changes.length === 0 ? "system" : undefined
223
223
  });
224
224
  };