@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
@@ -108,7 +108,7 @@ async function buildDomainContexts(teamId) {
108
108
  for (const member of domainMembers) {
109
109
  const agent = await getProviderAgentById(member.agentId);
110
110
  if (!agent) {
111
- warnings.push(`Un miembro del dominio ya no existe: ${member.agentId}`);
111
+ warnings.push(`Un miembro del equipo ya no existe: ${member.agentId}`);
112
112
  continue;
113
113
  }
114
114
  const memberWorkspace = await getProviderWorkspaceById(agent.workspaceId);
@@ -125,7 +125,7 @@ async function buildDomainContexts(teamId) {
125
125
  }
126
126
  const assignedAgent = localOrchestrator ?? leadAgent ?? null;
127
127
  if (!assignedAgent) {
128
- warnings.push('No hay agente asignable para este dominio.');
128
+ warnings.push('No hay agente asignable para este equipo.');
129
129
  }
130
130
  const assignedWorkspace = assignedAgent
131
131
  ? await getProviderWorkspaceById(assignedAgent.workspaceId)
@@ -165,9 +165,9 @@ function buildGlobalSummary(goal, planSummary, contexts) {
165
165
  const lines = [
166
166
  `Objetivo: ${goal}`,
167
167
  `Resumen global: ${planSummary}`,
168
- `Dominios detectados: ${contexts.length}`,
168
+ `Equipos detectados: ${contexts.length}`,
169
169
  '',
170
- 'Dominios planificados:',
170
+ 'Equipos planificados:',
171
171
  ];
172
172
  for (const context of contexts) {
173
173
  lines.push(`- ${context.domainName} -> workspace=${context.workspaceLabel} | assigned=${context.assignedAgentLabel ?? 'sin asignar'} | members=${context.members.length} | mode=${context.selectionMode}`);
@@ -177,7 +177,7 @@ function buildGlobalSummary(goal, planSummary, contexts) {
177
177
  function buildDomainInstructions(teamName, objective, context, squadPlanSummary) {
178
178
  const lines = [
179
179
  `Team: ${teamName}`,
180
- `Dominio: ${context.domainName}`,
180
+ `Equipo: ${context.domainName}`,
181
181
  `Objetivo global: ${objective}`,
182
182
  `Workspace: ${context.workspaceLabel}`,
183
183
  `Modo de seleccion: ${context.selectionMode}`,
@@ -189,8 +189,8 @@ function buildDomainInstructions(teamName, objective, context, squadPlanSummary)
189
189
  lines.push('- sin miembros');
190
190
  lines.push('');
191
191
  lines.push('Autonomia del escuadron:');
192
- lines.push(`- El orquestador/lead del dominio ${context.domainName} debe asumir roles internos temporales segun la funcion principal del dominio.`);
193
- lines.push('- Debe explicar que roles asumio, que hizo cada rol y que falta para completar el dominio.');
192
+ lines.push(`- El orquestador/lead del equipo ${context.domainName} debe asumir roles internos temporales segun la funcion principal del equipo.`);
193
+ lines.push('- Debe explicar que roles asumio, que hizo cada rol y que falta para completar el equipo.');
194
194
  }
195
195
  else {
196
196
  for (const member of context.members) {
@@ -221,10 +221,10 @@ function buildConfigurationChecklist(teamName, contexts) {
221
221
  lines.push(`- ${context.domainName}: habilita el workspace/proveedor antes de ejecutar.`);
222
222
  }
223
223
  if (!context.localOrchestratorId) {
224
- lines.push(`- ${context.domainName}: falta orquestador local. Usa /team domain ${teamName} ${context.domainName} <provider>/<agent>`);
224
+ lines.push(`- ${context.domainName}: falta orquestador local. Usa /team equipo ${teamName} ${context.domainName} <provider>/<agent>`);
225
225
  }
226
226
  if (!context.leadAgentId) {
227
- lines.push(`- ${context.domainName}: falta lead. Usa /team domain ${teamName} ${context.domainName} <provider>/<agent>`);
227
+ lines.push(`- ${context.domainName}: falta lead. Usa /team equipo ${teamName} ${context.domainName} <provider>/<agent>`);
228
228
  }
229
229
  if (context.members.length === 0 && context.assignedAgentId) {
230
230
  lines.push(`- ${context.domainName}: modo autonomo. ${context.assignedAgentLabel ?? 'el orquestador local'} asignara roles internos; miembros extra son opcionales.`);
@@ -260,7 +260,7 @@ async function planRun(args) {
260
260
  const domains = await listTeamDomains(team.id);
261
261
  if (domains.length === 0) {
262
262
  return {
263
- error: `El team ${team.name} no tiene dominios configurados. Usa /team domain primero.`,
263
+ error: `El team ${team.name} no tiene equipos configurados. Usa /team equipo primero.`,
264
264
  };
265
265
  }
266
266
  const globalRuntime = createGlobalOrchestratorRuntime('phase-2-early');
@@ -334,11 +334,11 @@ async function planRun(args) {
334
334
  scopeType: 'domain',
335
335
  teamDomainId: context.domainId,
336
336
  assignedAgentId: context.assignedAgentId,
337
- title: `Dominio ${context.domainName}`,
337
+ title: `Equipo ${context.domainName}`,
338
338
  instructions: buildDomainInstructions(team.name, parsed.objective, context, squadPlan.summary),
339
339
  status: taskStatus,
340
340
  resultSummary: taskStatus === 'blocked'
341
- ? 'Pendiente por validacion/configuracion del dominio.'
341
+ ? 'Pendiente por validacion/configuracion del equipo.'
342
342
  : 'Delegacion inicial preparada.',
343
343
  });
344
344
  await createOrchestrationMessage({
@@ -348,7 +348,7 @@ async function planRun(args) {
348
348
  toAgentId: context.assignedAgentId,
349
349
  messageType: 'squad-plan',
350
350
  content: [
351
- `Dominio: ${context.domainName}`,
351
+ `Equipo: ${context.domainName}`,
352
352
  `Asignado: ${context.assignedAgentLabel ?? 'sin asignar'}`,
353
353
  `Resumen: ${squadPlan.summary}`,
354
354
  '',
@@ -379,13 +379,13 @@ async function planRun(args) {
379
379
  }
380
380
  function buildPlanOnlyMessage(plan) {
381
381
  const lines = [
382
- `Run creada: ${plan.run.id}`,
382
+ `Ejecucion creada: ${plan.run.id}`,
383
383
  `Team: ${plan.team.name}`,
384
384
  `Objetivo: ${plan.run.goal}`,
385
385
  `Orquestador global: ${plan.globalLabel}`,
386
386
  `Estado inicial: ${plan.run.status}`,
387
387
  '',
388
- 'Tareas por dominio:',
388
+ 'Tareas por equipo:',
389
389
  ...plan.taskSummaries,
390
390
  ];
391
391
  if (plan.validationWarnings.length > 0) {
@@ -402,7 +402,7 @@ function buildPlanOnlyMessage(plan) {
402
402
  lines.push(`- Ejecutar tareas listas: /run resume ${plan.run.id}`);
403
403
  }
404
404
  if (plan.hasBlockedTasks) {
405
- lines.push(`- Si hay dominios blocked, asigna un agente con /team domain <team> <domain> <provider>/<agent> y luego usa /run retry ${plan.run.id}`);
405
+ lines.push(`- Si hay equipos blocked, asigna un agente con /team equipo <team> <equipo> <provider>/<agent> y luego usa /run retry ${plan.run.id}`);
406
406
  }
407
407
  return lines.join('\n');
408
408
  }
@@ -416,14 +416,14 @@ function buildExecutionReport(plan, finalRun, finalTasks, finalMessages, errorMe
416
416
  .sort()
417
417
  .join(' | ');
418
418
  const lines = [
419
- `Run ejecutada: ${finalRun.id}`,
419
+ `Ejecucion finalizada: ${finalRun.id}`,
420
420
  `Team: ${plan.team.name}`,
421
421
  `Objetivo: ${finalRun.goal}`,
422
422
  `Estado final: ${finalRun.status}`,
423
423
  `Resumen tareas: ${countsLine || 'sin tareas'}`,
424
424
  ];
425
425
  const reportMessages = finalMessages
426
- .filter(message => message.messageType === 'run-report' || message.messageType === 'domain-report')
426
+ .filter(message => ['run-report', 'task.completed', 'domain-report'].includes(message.messageType))
427
427
  .slice(-6);
428
428
  if (reportMessages.length > 0) {
429
429
  lines.push('', 'Reportes:');
@@ -438,9 +438,74 @@ function buildExecutionReport(plan, finalRun, finalTasks, finalMessages, errorMe
438
438
  lines.push('', `Siguientes pasos: /run show ${finalRun.id} | /run messages ${finalRun.id} | /run task <task-id>`);
439
439
  return lines.join('\n');
440
440
  }
441
+ function buildInitialDomainExecutionView(plan) {
442
+ return plan.domainContexts.map(context => {
443
+ const isReady = Boolean(context.assignedAgentId && context.workspaceEnabled);
444
+ return {
445
+ domainName: context.domainName,
446
+ agentLabel: context.assignedAgentLabel ?? 'sin asignar',
447
+ status: isReady ? 'waiting' : 'blocked',
448
+ detail: isReady
449
+ ? 'en espera de ejecucion'
450
+ : context.validationWarnings[0] ?? 'requiere configuracion',
451
+ progressPercent: 0,
452
+ };
453
+ });
454
+ }
455
+ function toDomainStatus(phase) {
456
+ switch (phase) {
457
+ case 'dispatching':
458
+ return 'dispatching';
459
+ case 'executing':
460
+ return 'executing';
461
+ case 'completed':
462
+ return 'completed';
463
+ case 'failed':
464
+ return 'failed';
465
+ case 'blocked':
466
+ return 'blocked';
467
+ default:
468
+ return 'waiting';
469
+ }
470
+ }
471
+ function formatDomainStatus(status) {
472
+ switch (status) {
473
+ case 'waiting':
474
+ return 'en cola';
475
+ case 'dispatching':
476
+ return 'asignando';
477
+ case 'executing':
478
+ return 'trabajando';
479
+ case 'completed':
480
+ return 'terminado';
481
+ case 'failed':
482
+ return 'fallo';
483
+ case 'blocked':
484
+ return 'bloqueado';
485
+ case 'skipped':
486
+ return 'omitido';
487
+ }
488
+ }
489
+ function statusColor(status) {
490
+ switch (status) {
491
+ case 'completed':
492
+ return 'green';
493
+ case 'dispatching':
494
+ case 'executing':
495
+ return 'cyan';
496
+ case 'blocked':
497
+ case 'skipped':
498
+ return 'yellow';
499
+ case 'failed':
500
+ return 'red';
501
+ default:
502
+ return undefined;
503
+ }
504
+ }
441
505
  function PlanReview({ plan, onDone, }) {
442
506
  const [phase, setPhase] = React.useState('review');
443
507
  const [progress, setProgress] = React.useState(null);
508
+ const [domainStates, setDomainStates] = React.useState(() => buildInitialDomainExecutionView(plan));
444
509
  const [error, setError] = React.useState(null);
445
510
  React.useEffect(() => {
446
511
  if (phase !== 'executing')
@@ -453,13 +518,31 @@ function PlanReview({ plan, onDone, }) {
453
518
  onProgress: event => {
454
519
  if (cancelled)
455
520
  return;
456
- setProgress({
521
+ const nextProgress = {
522
+ taskId: event.taskId,
457
523
  phase: event.phase,
458
524
  domainName: event.domainName,
459
525
  agentLabel: event.agentLabel,
460
526
  detail: event.detail,
461
527
  progressPercent: event.progressPercent,
462
- });
528
+ };
529
+ setProgress(nextProgress);
530
+ if (event.domainName) {
531
+ setDomainStates(prev => prev.map(domain => {
532
+ if (domain.domainName !== event.domainName) {
533
+ return domain;
534
+ }
535
+ return {
536
+ ...domain,
537
+ agentLabel: event.agentLabel ?? domain.agentLabel,
538
+ status: toDomainStatus(event.phase),
539
+ detail: event.detail ?? domain.detail,
540
+ progressPercent: event.progressPercent == null
541
+ ? domain.progressPercent
542
+ : Math.round(event.progressPercent),
543
+ };
544
+ }));
545
+ }
463
546
  },
464
547
  });
465
548
  }
@@ -502,6 +585,9 @@ function PlanReview({ plan, onDone, }) {
502
585
  if (phase !== 'review')
503
586
  return;
504
587
  if (key.return) {
588
+ setDomainStates(buildInitialDomainExecutionView(plan));
589
+ setProgress(null);
590
+ setError(null);
505
591
  setPhase('executing');
506
592
  }
507
593
  else if (key.escape) {
@@ -509,13 +595,13 @@ function PlanReview({ plan, onDone, }) {
509
595
  }
510
596
  }, { isActive: phase === 'review' });
511
597
  if (phase === 'review') {
512
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Plan listo para ", plan.team.name] }), _jsxs(Text, { children: ["Run: ", plan.run.id] }), _jsxs(Text, { children: ["Objetivo: ", plan.run.goal] }), _jsxs(Text, { children: ["Orquestador global: ", plan.globalLabel] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Tareas por dominio" }), plan.taskSummaries.map((line, i) => (_jsx(Text, { children: line }, i)))] }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsxs(Text, { children: ["Listas: ", _jsx(Text, { color: "green", children: plan.readyCount }), " | Bloqueadas:", ' ', _jsx(Text, { color: plan.blockedCount > 0 ? 'yellow' : undefined, children: plan.blockedCount })] }) }), plan.validationWarnings.length > 0 ? (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: "yellow", children: "Advertencias" }), plan.validationWarnings.map((line, i) => (_jsx(Text, { color: "yellow", children: line }, i)))] })) : null, plan.configurationChecklist.length > 0 ? (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Estado de configuracion" }), plan.configurationChecklist.map((line, i) => (_jsx(Text, { children: line }, i)))] })) : null, _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["[Enter] Ejecutar ahora", plan.hasBlockedTasks ? ' (las bloqueadas se omiten)' : '', " | [Esc] Solo planificar"] }) })] }));
598
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Plan listo para ", plan.team.name] }), _jsxs(Text, { children: ["Ejecucion: ", plan.run.id] }), _jsxs(Text, { children: ["Objetivo: ", plan.run.goal] }), _jsxs(Text, { children: ["Orquestador global: ", plan.globalLabel] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Tareas por equipo" }), plan.taskSummaries.map((line, i) => (_jsx(Text, { children: line }, i)))] }), _jsx(Box, { marginTop: 1, flexDirection: "column", children: _jsxs(Text, { children: ["Listas: ", _jsx(Text, { color: "green", children: plan.readyCount }), " | Bloqueadas:", ' ', _jsx(Text, { color: plan.blockedCount > 0 ? 'yellow' : undefined, children: plan.blockedCount })] }) }), plan.validationWarnings.length > 0 ? (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, color: "yellow", children: "Advertencias" }), plan.validationWarnings.map((line, i) => (_jsx(Text, { color: "yellow", children: line }, i)))] })) : null, plan.configurationChecklist.length > 0 ? (_jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Estado de configuracion" }), plan.configurationChecklist.map((line, i) => (_jsx(Text, { children: line }, i)))] })) : null, _jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["[Enter] Ejecutar ahora", plan.hasBlockedTasks ? ' (las bloqueadas se omiten)' : '', " | [Esc] Solo planificar"] }) })] }));
513
599
  }
514
600
  if (phase === 'executing') {
515
601
  const progressLine = progress
516
602
  ? [
517
603
  progress.phase,
518
- progress.domainName ? `dominio=${progress.domainName}` : null,
604
+ progress.domainName ? `equipo=${progress.domainName}` : null,
519
605
  progress.agentLabel ? `agente=${progress.agentLabel}` : null,
520
606
  progress.detail,
521
607
  progress.progressPercent != null ? `${Math.round(progress.progressPercent)}%` : null,
@@ -523,9 +609,9 @@ function PlanReview({ plan, onDone, }) {
523
609
  .filter(Boolean)
524
610
  .join(' | ')
525
611
  : 'preparando ejecucion...';
526
- return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Ejecutando run ", plan.run.id] }), _jsxs(Text, { children: ["Team: ", plan.team.name] }), _jsx(Text, { children: progressLine }), error ? _jsxs(Text, { color: "red", children: ["Error: ", error] }) : null] }));
612
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Text, { bold: true, children: ["Ejecutando orquestacion ", plan.run.id] }), _jsxs(Text, { children: ["Team: ", plan.team.name] }), _jsx(Text, { children: progressLine }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Equipos y agentes" }), domainStates.map(domain => (_jsxs(Text, { color: statusColor(domain.status), children: [domain.domainName.padEnd(10), " | ", formatDomainStatus(domain.status).padEnd(10), " | ", domain.progressPercent.toString().padStart(3), "% | ", domain.agentLabel, " | ", domain.detail] }, domain.domainName)))] }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { dimColor: true, children: "La ejecucion avanza por equipos listos; las tareas bloqueadas quedan para corregir y reintentar." }) }), error ? _jsxs(Text, { color: "red", children: ["Error: ", error] }) : null] }));
527
613
  }
528
- return (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { children: ["Run ", plan.run.id, " terminada."] }) }));
614
+ return (_jsx(Box, { flexDirection: "column", children: _jsxs(Text, { children: ["Ejecucion ", plan.run.id, " terminada."] }) }));
529
615
  }
530
616
  export const call = async (onDone, _context, args) => {
531
617
  const result = await planRun(args ?? '');
@@ -27,6 +27,14 @@ function normalizeProviderInput(rawProvider) {
27
27
  case 'ollama_cloud':
28
28
  case 'ollamacloud':
29
29
  return 'ollama-cloud';
30
+ case 'gemini':
31
+ case 'gemini-api-key':
32
+ case 'google-ai':
33
+ return 'gemini-api';
34
+ case 'gemini-google':
35
+ case 'google':
36
+ case 'google-oauth':
37
+ return 'gemini-google';
30
38
  default:
31
39
  return rawProvider.trim().toLowerCase();
32
40
  }
@@ -40,9 +48,13 @@ function getProviderLabel(provider) {
40
48
  case 'openrouter':
41
49
  return 'OpenRouter';
42
50
  case 'ollama':
43
- return 'Ollama Local';
51
+ return 'Ollama';
44
52
  case 'ollama-cloud':
45
53
  return 'Ollama Cloud';
54
+ case 'gemini-api':
55
+ return 'Gemini API';
56
+ case 'gemini-google':
57
+ return 'Gemini Google';
46
58
  case 'zai':
47
59
  return 'Z.AI';
48
60
  case 'minimax':
@@ -77,6 +89,8 @@ function buildProfileListMessage() {
77
89
  'openrouter',
78
90
  'ollama',
79
91
  'ollama-cloud',
92
+ 'gemini-api',
93
+ 'gemini-google',
80
94
  'zai',
81
95
  'minimax',
82
96
  ];
@@ -2,7 +2,7 @@ export default {
2
2
  type: 'local-jsx',
3
3
  name: 'provider',
4
4
  description: 'Cambiar entre proveedores y configurar endpoints sin cerrar sesion',
5
- argumentHint: '[list|current|claude|openai|openrouter|ollama|ollama-cloud|zai|minimax] [baseURL|clear]',
5
+ argumentHint: '[list|current|claude|openai|openrouter|ollama|ollama-cloud|gemini-api|gemini-google|zai|minimax] [baseURL|clear]',
6
6
  isEnabled: () => true,
7
7
  load: () => import('./provider.js'),
8
8
  };
@@ -5,7 +5,7 @@ import { Box, Text } from '../../ink.js';
5
5
  import { useMainLoopModel } from '../../hooks/useMainLoopModel.js';
6
6
  import { useSetAppState } from '../../state/AppState.js';
7
7
  import { getStoredActiveProviderPreference } from '../../utils/model/providerProfilesDb.js';
8
- import { getAPIProvider, isOllamaCloudProviderConfigured, isMiniMaxProviderConfigured, isOpenAIProviderConfigured, isOpenRouterProviderConfigured, isZAIProviderConfigured, } from '../../utils/model/providers.js';
8
+ import { getAPIProvider, isGeminiApiProviderConfigured, isGeminiGoogleProviderConfigured, isOllamaCloudProviderConfigured, isMiniMaxProviderConfigured, isOpenAIProviderConfigured, isOpenRouterProviderConfigured, isZAIProviderConfigured, } from '../../utils/model/providers.js';
9
9
  import { clearProviderBaseUrl, getConfiguredProviderBaseUrl, getDefaultProviderBaseUrl, isProviderBaseUrlCustomized, setProviderBaseUrl, } from '../../utils/model/providerBaseUrls.js';
10
10
  import { getVisibleProvider, VISIBLE_PROVIDERS, } from '../../utils/model/providerCatalog.js';
11
11
  import { getActiveProviderProfile, getLastUsedProviderProfile, isProfiledProvider, listProviderProfiles, setActiveProfileForProvider, } from '../../utils/model/providerProfiles.js';
@@ -19,6 +19,8 @@ const CONFIGURABLE_BASE_URL_PROVIDERS = [
19
19
  'openrouter',
20
20
  'ollama',
21
21
  'ollama-cloud',
22
+ 'gemini-api',
23
+ 'gemini-google',
22
24
  'zai',
23
25
  'minimax',
24
26
  ];
@@ -42,6 +44,15 @@ function normalizeProviderInput(rawProvider) {
42
44
  case 'ollama_cloud':
43
45
  case 'ollamacloud':
44
46
  return 'ollama-cloud';
47
+ case 'gemini':
48
+ case 'gemini-api-key':
49
+ case 'google-ai':
50
+ case 'google-ai-studio':
51
+ return 'gemini-api';
52
+ case 'gemini-google':
53
+ case 'google':
54
+ case 'google-oauth':
55
+ return 'gemini-google';
45
56
  default:
46
57
  return rawProvider.trim().toLowerCase();
47
58
  }
@@ -58,6 +69,10 @@ function getProviderSetupMessage(provider) {
58
69
  return `Ollama usa un servidor local compatible. Endpoint actual: ${baseUrl}. Puedes cambiarlo con /provider ollama <baseURL> o restaurar el default con /provider ollama clear.`;
59
70
  case 'ollama-cloud':
60
71
  return `Ollama Cloud usa por defecto tu host local autenticado. Endpoint actual: ${baseUrl}. Ejecuta 'ollama signin' y luego usa /provider ollama-cloud.`;
72
+ case 'gemini-api':
73
+ return `Gemini API requiere una API key de Google AI Studio. Endpoint actual: ${baseUrl}. Usa /login para guardarla o /provider gemini-api <baseURL> para cambiar el endpoint.`;
74
+ case 'gemini-google':
75
+ return `Gemini Google usa OAuth compatible con Gemini CLI. Endpoint actual: ${baseUrl}. Usa /login y elige Gemini Google para abrir el navegador y guardar el token.`;
61
76
  case 'zai':
62
77
  return 'Z.AI requiere una API key. Usa /login para guardarla y /provider zai <baseURL> para cambiar el endpoint si hace falta.';
63
78
  case 'minimax':
@@ -194,6 +209,12 @@ function isSelectedProfileReady(provider, profileName) {
194
209
  if (provider === 'openrouter') {
195
210
  return hasStoredProviderApiKey('openrouter', profile.id);
196
211
  }
212
+ if (provider === 'gemini-api') {
213
+ return hasStoredProviderApiKey('gemini-api', profile.id);
214
+ }
215
+ if (provider === 'gemini-google') {
216
+ return isGeminiGoogleProviderConfigured();
217
+ }
197
218
  if (provider === 'zai') {
198
219
  return hasStoredProviderApiKey('zai', profile.id);
199
220
  }
@@ -322,6 +343,12 @@ export async function call(onDone, context, args) {
322
343
  onDone(getProviderSelectionMessage(providerName, baseUrlMessage));
323
344
  return null;
324
345
  }
346
+ if (providerName === 'gemini-api' &&
347
+ (!isGeminiApiProviderConfigured() ||
348
+ !isSelectedProfileReady(providerName, profileSelection))) {
349
+ onDone(getProviderSelectionMessage(providerName, baseUrlMessage));
350
+ return null;
351
+ }
325
352
  if (providerName === 'ollama-cloud' && !isOllamaCloudProviderConfigured()) {
326
353
  onDone(getProviderSelectionMessage(providerName, baseUrlMessage));
327
354
  return null;
@@ -384,6 +411,8 @@ function ProviderPicker({ onDone, context, }) {
384
411
  const isConfigured = (provider.id === 'claude' && hasStoredProviderOAuthTokens('claude')) ||
385
412
  (provider.id === 'openai' && isOpenAIProviderConfigured()) ||
386
413
  (provider.id === 'openrouter' && isOpenRouterProviderConfigured()) ||
414
+ (provider.id === 'gemini-api' && isGeminiApiProviderConfigured()) ||
415
+ (provider.id === 'gemini-google' && isGeminiGoogleProviderConfigured()) ||
387
416
  provider.id === 'ollama' ||
388
417
  (provider.id === 'ollama-cloud' && isOllamaCloudProviderConfigured()) ||
389
418
  (provider.id === 'zai' && isZAIProviderConfigured()) ||
@@ -419,6 +448,10 @@ function ProviderPicker({ onDone, context, }) {
419
448
  onDone(getProviderSetupMessage(target));
420
449
  return;
421
450
  }
451
+ if (target === 'gemini-api' && !isGeminiApiProviderConfigured()) {
452
+ onDone(getProviderSetupMessage(target));
453
+ return;
454
+ }
422
455
  if (target === 'ollama-cloud' && !isOllamaCloudProviderConfigured()) {
423
456
  onDone(getProviderSetupMessage(target));
424
457
  return;
@@ -2,28 +2,28 @@ import { isUltrareviewEnabled } from './review/ultrareviewEnabled.js';
2
2
  // Legal wants the explicit surface name plus a docs link visible before the
3
3
  // user triggers, so the description carries "Context Code on the web" + URL.
4
4
  const CCR_TERMS_URL = 'https://code.claude.com/docs/en/claude-code-on-the-web';
5
- const LOCAL_REVIEW_PROMPT = (args) => `
6
- Eres un experto revisor de código. Sigue estos pasos:
7
-
8
- 1. Si no se proporciona un número de PR en los argumentos, ejecuta \`gh pr list\` para mostrar las PR abiertas.
9
- 2. Si se proporciona un número de PR, ejecuta \`gh pr view <numero>\` para obtener los detalles de la PR.
10
- 3. Ejecuta \`gh pr diff <numero>\` para obtener el diff.
11
- 4. Analiza los cambios y proporciona una revisión de código exhaustiva que incluya:
12
- - Resumen de lo que hace la PR.
13
- - Análisis de la calidad y el estilo del código.
14
- - Sugerencias específicas de mejora.
15
- - Cualquier problema o riesgo potencial.
16
-
17
- Mantén tu revisión concisa pero exhaustiva. Encamina tu atención a:
18
- - Corrección del código.
19
- - Seguimiento de las convenciones del proyecto.
20
- - Implicaciones de rendimiento.
21
- - Cobertura de pruebas.
22
- - Consideraciones de seguridad.
23
-
24
- Formatea tu revisión con secciones claras y puntos de viñeta.
25
-
26
- Número de PR: ${args}
5
+ const LOCAL_REVIEW_PROMPT = (args) => `
6
+ Eres un experto revisor de código. Sigue estos pasos:
7
+
8
+ 1. Si no se proporciona un número de PR en los argumentos, ejecuta \`gh pr list\` para mostrar las PR abiertas.
9
+ 2. Si se proporciona un número de PR, ejecuta \`gh pr view <numero>\` para obtener los detalles de la PR.
10
+ 3. Ejecuta \`gh pr diff <numero>\` para obtener el diff.
11
+ 4. Analiza los cambios y proporciona una revisión de código exhaustiva que incluya:
12
+ - Resumen de lo que hace la PR.
13
+ - Análisis de la calidad y el estilo del código.
14
+ - Sugerencias específicas de mejora.
15
+ - Cualquier problema o riesgo potencial.
16
+
17
+ Mantén tu revisión concisa pero exhaustiva. Encamina tu atención a:
18
+ - Corrección del código.
19
+ - Seguimiento de las convenciones del proyecto.
20
+ - Implicaciones de rendimiento.
21
+ - Cobertura de pruebas.
22
+ - Consideraciones de seguridad.
23
+
24
+ Formatea tu revisión con secciones claras y puntos de viñeta.
25
+
26
+ Número de PR: ${args}
27
27
  `;
28
28
  const review = {
29
29
  type: 'prompt',
@@ -2,8 +2,8 @@ const run = {
2
2
  type: 'local',
3
3
  supportsNonInteractive: true,
4
4
  name: 'run',
5
- description: 'Inspeccionar y operar corridas de orquestacion',
6
- argumentHint: '[list|show <run-id>|report <run-id>|tasks <run-id>|task <task-id>|messages <run-id>|start <team> <goal>|resume <run-id>|cancel <run-id>|retry <run-id> [task-id]|cancel-task <task-id>|domain <run-id> <domain>|reassign <task-id> <provider>/<agent>|optimize <run-id> [policy]|assign <run-id> [policy]|fallback <run-id> [task-id] [policy]|explain <run-id>]',
5
+ description: 'Inspeccionar y operar ejecuciones de orquestacion',
6
+ argumentHint: '[list|show <run-id>|report <run-id>|tasks <run-id>|task <task-id>|messages <run-id>|start <team> <goal>|resume <run-id>|cancel <run-id>|retry <run-id> [task-id]|cancel-task <task-id>|equipo <run-id> <equipo>|reassign <task-id> <provider>/<agent>|optimize <run-id> [policy]|assign <run-id> [policy]|fallback <run-id> [task-id] [policy]|explain <run-id>]',
7
7
  load: () => import('./run.js'),
8
8
  };
9
9
  export default run;