@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
|
@@ -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,
|
|
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=<
|
|
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
|
|
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
|
|
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: '
|
|
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,
|
|
193
|
-
const
|
|
194
|
-
if (!providerProfile || !
|
|
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
|
-
|
|
212
|
-
agentName: `${
|
|
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
|
|
254
|
-
const
|
|
255
|
-
return
|
|
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 === '
|
|
262
|
-
return `
|
|
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 === '
|
|
271
|
-
return (setup.entries.find(entry => entry.
|
|
272
|
-
setup.orchestrator?.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
359
|
+
lines.push(`- Saltado ${entry.unitName}: falta agente o workspace.`);
|
|
352
360
|
continue;
|
|
353
361
|
}
|
|
354
|
-
const
|
|
355
|
-
if (
|
|
356
|
-
await
|
|
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(`-
|
|
371
|
+
lines.push(`- Equipo actualizado: ${entry.unitName} -> ${entry.provider}/${entry.agentName}`);
|
|
364
372
|
continue;
|
|
365
373
|
}
|
|
366
|
-
await
|
|
374
|
+
await createTeamUnit({
|
|
367
375
|
teamId: team.id,
|
|
368
|
-
|
|
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(`-
|
|
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
|
|
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:
|
|
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') {
|
package/dist/src/commands.js
CHANGED
|
@@ -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
|
|
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(
|
|
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
|
|
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 === "
|
|
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
|
-
$[
|
|
560
|
+
$[65] = onDone;
|
|
561
|
+
$[66] = t7;
|
|
492
562
|
}
|
|
493
563
|
else {
|
|
494
|
-
t7 = $[
|
|
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
|
|
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: "
|
|
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, "
|
|
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 ? "
|
|
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
|
|
236
|
-
t25 = _jsx(Text, { dimColor: true, children: "
|
|
237
|
-
t26 = _jsx(Text, { dimColor: true, children: "
|
|
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
|
|
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}
|
|
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: "
|
|
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, `
|
|
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 ? `
|
|
221
|
-
onExit(exitMessage ?? "
|
|
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
|
};
|