@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.
- package/README.md +68 -68
- package/cli.js +8515 -8515
- package/context-bootstrap.js +27 -27
- package/dist/src/bootstrap/state.js +3 -0
- package/dist/src/bridge/bridgeMain.js +40 -40
- package/dist/src/cli/print.js +12 -12
- package/dist/src/commands/agent/agent.js +8 -0
- package/dist/src/commands/commit-push-pr.js +55 -55
- package/dist/src/commands/createMovedToPluginCommand.js +9 -9
- package/dist/src/commands/init-verifiers.js +238 -238
- package/dist/src/commands/init.js +226 -225
- package/dist/src/commands/install.js +2 -2
- package/dist/src/commands/login/login.js +24 -10
- package/dist/src/commands/orchestrate/index.js +1 -1
- package/dist/src/commands/orchestrate/orchestrate.js +110 -24
- package/dist/src/commands/profile/profile.js +15 -1
- package/dist/src/commands/provider/index.js +1 -1
- package/dist/src/commands/provider/provider.js +34 -1
- package/dist/src/commands/review.js +22 -22
- package/dist/src/commands/run/index.js +2 -2
- package/dist/src/commands/run/run.js +63 -61
- package/dist/src/commands/team/index.js +1 -1
- package/dist/src/commands/team/team.js +84 -76
- package/dist/src/commands/team-auto/teamAuto.js +89 -29
- package/dist/src/commands/terminalSetup/terminalSetup.js +24 -24
- package/dist/src/commands/usage/index.js +7 -0
- package/dist/src/commands/usage/usage.js +5 -0
- package/dist/src/commands/workspace/workspace.js +39 -31
- package/dist/src/commands.js +0 -2
- package/dist/src/components/ConsoleOAuthFlow.js +92 -14
- package/dist/src/components/ModelPicker.js +2 -0
- package/dist/src/components/agents/AgentsList.js +9 -9
- package/dist/src/components/agents/AgentsMenu.js +3 -3
- package/dist/src/components/agents/generateAgent.js +92 -92
- package/dist/src/components/agents/utils.js +13 -9
- package/dist/src/components/grove/Grove.js +10 -10
- package/dist/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.js +8 -8
- package/dist/src/constants/geminiOAuth.js +13 -0
- package/dist/src/constants/github-app.js +134 -134
- package/dist/src/constants/prompts.js +123 -123
- package/dist/src/coordinator/coordinatorMode.js +252 -252
- package/dist/src/hooks/useTypeahead.js +7 -7
- package/dist/src/ink/reconciler.js +7 -7
- package/dist/src/main.js +5 -5
- package/dist/src/memdir/findRelevantMemories.js +6 -6
- package/dist/src/projectOnboardingState.js +3 -3
- package/dist/src/services/MagicDocs/prompts.js +56 -56
- package/dist/src/services/PromptSuggestion/promptSuggestion.js +29 -29
- package/dist/src/services/SessionMemory/prompts.js +66 -66
- package/dist/src/services/api/openai.js +584 -21
- package/dist/src/services/limits/adapters/ollama.js +3 -3
- package/dist/src/services/oauth/geminiCli.js +107 -0
- package/dist/src/services/orchestration/execution/AgentTaskExecutor.js +5 -3
- package/dist/src/services/orchestration/execution/OrchestrationExecutionRuntime.js +18 -18
- package/dist/src/services/orchestration/global/reporting.js +2 -2
- package/dist/src/services/toolUseSummary/toolUseSummaryGenerator.js +9 -9
- package/dist/src/skills/bundled/batch.js +78 -78
- package/dist/src/skills/bundled/claudeApi.js +34 -34
- package/dist/src/skills/bundled/claudeInChrome.js +4 -4
- package/dist/src/skills/bundled/debug.js +36 -36
- package/dist/src/skills/bundled/scheduleRemoteAgents.js +151 -151
- package/dist/src/skills/bundled/skillify.js +132 -132
- package/dist/src/skills/bundled/stuck.js +53 -53
- package/dist/src/skills/bundled/updateConfig.js +418 -418
- package/dist/src/tasks/RemoteAgentTask/RemoteAgentTask.js +26 -26
- package/dist/src/tools/AgentTool/AgentTool.js +7 -7
- package/dist/src/tools/AgentTool/agentDisplay.js +18 -10
- package/dist/src/tools/AgentTool/built-in/claudeCodeGuideAgent.js +67 -67
- package/dist/src/tools/AgentTool/built-in/exploreAgent.js +32 -32
- package/dist/src/tools/AgentTool/built-in/generalPurposeAgent.js +13 -13
- package/dist/src/tools/AgentTool/built-in/planAgent.js +49 -49
- package/dist/src/tools/AgentTool/built-in/statuslineSetup.js +129 -129
- package/dist/src/tools/AgentTool/built-in/verificationAgent.js +119 -119
- package/dist/src/tools/AgentTool/prompt.js +131 -131
- package/dist/src/tools/AgentTool/runAgent.js +9 -9
- package/dist/src/tools/BashTool/BashTool.js +10 -10
- package/dist/src/tools/BashTool/prompt.js +94 -94
- package/dist/src/tools/ConfigTool/prompt.js +29 -29
- package/dist/src/tools/EnterWorktreeTool/prompt.js +27 -27
- package/dist/src/tools/FileReadTool/prompt.js +12 -12
- package/dist/src/tools/PowerShellTool/prompt.js +82 -82
- package/dist/src/tools/RemoteTriggerTool/prompt.js +9 -9
- package/dist/src/tools/ScheduleCronTool/prompt.js +37 -37
- package/dist/src/tools/TeamCreateTool/prompt.js +110 -110
- package/dist/src/tools/TeamDeleteTool/prompt.js +13 -13
- package/dist/src/utils/advisor.js +15 -15
- package/dist/src/utils/api.js +2 -2
- package/dist/src/utils/auth.js +207 -2
- package/dist/src/utils/autoUpdater.js +18 -18
- package/dist/src/utils/bash/ShellSnapshot.js +86 -86
- package/dist/src/utils/bash/commands.js +61 -61
- package/dist/src/utils/claudeInChrome/prompt.js +53 -53
- package/dist/src/utils/claudeInChrome/setup.js +8 -8
- package/dist/src/utils/claudemd.js +19 -7
- package/dist/src/utils/databaseMcp/server/queries.js +632 -632
- package/dist/src/utils/deepLink/registerProtocol.js +35 -35
- package/dist/src/utils/deepLink/terminalLauncher.js +12 -12
- package/dist/src/utils/hooks/execAgentHook.js +7 -7
- package/dist/src/utils/hooks/execPromptHook.js +4 -4
- package/dist/src/utils/hooks/skillImprovement.js +36 -36
- package/dist/src/utils/logoV2Utils.js +1 -1
- package/dist/src/utils/mcp/dateTimeParser.js +9 -9
- package/dist/src/utils/messages.js +191 -191
- package/dist/src/utils/model/model.js +18 -0
- package/dist/src/utils/model/modelOptions.js +51 -1
- package/dist/src/utils/model/modelStrings.js +5 -1
- package/dist/src/utils/model/modelSupportOverrides.js +3 -0
- package/dist/src/utils/model/providerBaseUrls.js +6 -1
- package/dist/src/utils/model/providerCatalog.js +64 -28
- package/dist/src/utils/model/providerModels.js +88 -17
- package/dist/src/utils/model/providerProfiles.js +8 -0
- package/dist/src/utils/model/providerProfilesDb.js +578 -393
- package/dist/src/utils/model/providerSwitch.js +12 -0
- package/dist/src/utils/model/providerWorkspaces.js +2 -0
- package/dist/src/utils/model/providers.js +65 -2
- package/dist/src/utils/orchestration/store/providerWorkspaceStore.js +3 -1
- package/dist/src/utils/orchestration/store/runStore.js +47 -47
- package/dist/src/utils/orchestration/store/teamStore.js +61 -61
- package/dist/src/utils/powershell/parser.js +253 -253
- package/dist/src/utils/sessionTitle.js +12 -12
- package/dist/src/utils/sideQuestion.js +17 -17
- package/dist/src/utils/status.js +1 -1
- package/dist/src/utils/swarm/backends/registry.js +9 -9
- package/dist/src/utils/telemetry/instrumentation.js +9 -9
- package/dist/src/utils/teleport.js +15 -15
- package/dist/src/utils/undercover.js +28 -28
- 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
|
|
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
|
|
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
|
-
`
|
|
168
|
+
`Equipos detectados: ${contexts.length}`,
|
|
169
169
|
'',
|
|
170
|
-
'
|
|
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
|
-
`
|
|
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
|
|
193
|
-
lines.push('- Debe explicar que roles asumio, que hizo cada rol y que falta para completar el
|
|
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
|
|
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
|
|
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
|
|
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: `
|
|
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
|
|
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
|
-
`
|
|
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
|
-
`
|
|
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
|
|
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
|
|
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
|
-
`
|
|
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 =>
|
|
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
|
-
|
|
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: ["
|
|
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 ? `
|
|
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
|
|
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: ["
|
|
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
|
|
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
|
|
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>|
|
|
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;
|