@iaforged/context-code 2.3.3 → 2.3.6

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 (89) hide show
  1. package/context-bootstrap.js +7 -5
  2. package/dist/src/cli/handlers/auth.js +1 -1
  3. package/dist/src/cli/handlers/modelList.js +1 -1
  4. package/dist/src/commands/agent/agent.js +1 -1
  5. package/dist/src/commands/login/login.js +1 -1
  6. package/dist/src/commands/profile/profile.js +1 -1
  7. package/dist/src/commands/provider/index.js +1 -1
  8. package/dist/src/commands/provider/provider.js +1 -1
  9. package/dist/src/components/BaseTextInput.js +1 -1
  10. package/dist/src/components/LogoV2/AnimatedClawd.js +1 -1
  11. package/dist/src/components/LogoV2/Clawd.js +1 -1
  12. package/dist/src/components/LogoV2/LogoV2.js +1 -1
  13. package/dist/src/components/LogoV2/WelcomeV2.js +1 -1
  14. package/dist/src/components/PromptInput/PromptInputFooterLeftSide.js +1 -1
  15. package/dist/src/components/SessionTokenFooter.js +1 -1
  16. package/dist/src/components/Spinner.js +1 -1
  17. package/dist/src/components/Stats.js +1 -1
  18. package/dist/src/components/TeleportProgress.js +1 -1
  19. package/dist/src/components/TextInput.js +1 -1
  20. package/dist/src/components/design-system/ThemeProvider.js +1 -1
  21. package/dist/src/components/permissions/AskUserQuestionPermissionRequest/AskUserQuestionPermissionRequest.js +1 -1
  22. package/dist/src/core/auth/loginCore.js +1 -1
  23. package/dist/src/core/providers/llmCore.js +1 -1
  24. package/dist/src/core/providers/providerModelCompatibility.js +1 -1
  25. package/dist/src/main.js +1 -1
  26. package/dist/src/query/stopHooks.js +1 -1
  27. package/dist/src/screens/REPL.js +1 -1
  28. package/dist/src/services/PromptSuggestion/promptSuggestion.js +1 -1
  29. package/dist/src/services/analytics/config.js +1 -1
  30. package/dist/src/services/analytics/datadog.js +1 -1
  31. package/dist/src/services/api/openai.js +1 -1
  32. package/dist/src/services/mcp/config.js +1 -1
  33. package/dist/src/services/orchestration/execution/AgentTaskExecutor.js +1 -1
  34. package/dist/src/services/tips/tipRegistry.js +1 -1
  35. package/dist/src/services/toolUseSummary/toolUseSummaryGenerator.js +1 -1
  36. package/dist/src/tools/BriefTool/UI.js +1 -1
  37. package/dist/src/utils/computerControlMcp/mcpServer.js +1 -1
  38. package/dist/src/utils/computerControlMcp/server/.gitattributes +18 -0
  39. package/dist/src/utils/computerControlMcp/server/Dockerfile +25 -0
  40. package/dist/src/utils/computerControlMcp/server/LICENSE +21 -0
  41. package/dist/src/utils/computerControlMcp/server/MANIFEST.in +10 -0
  42. package/dist/src/utils/computerControlMcp/server/README.md +193 -0
  43. package/dist/src/utils/computerControlMcp/server/demonstration.gif +0 -0
  44. package/dist/src/utils/computerControlMcp/server/icon.png +0 -0
  45. package/dist/src/utils/computerControlMcp/server/pyproject.toml +52 -0
  46. package/dist/src/utils/computerControlMcp/server/smithery.yaml +13 -0
  47. package/dist/src/utils/computerControlMcp/server/src/README.md +12 -0
  48. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/FZYTK.TTF +0 -0
  49. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/__init__.py +11 -0
  50. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/__main__.py +21 -0
  51. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/cli.py +128 -0
  52. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/core.py +1008 -0
  53. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/gui.py +126 -0
  54. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/server.py +15 -0
  55. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/test.py +346 -0
  56. package/dist/src/utils/computerControlMcp/server/src/computer_control_mcp/test_image.png +0 -0
  57. package/dist/src/utils/computerControlMcp/server/tests/README.md +22 -0
  58. package/dist/src/utils/computerControlMcp/server/tests/conftest.py +10 -0
  59. package/dist/src/utils/computerControlMcp/server/tests/rapidocr_test.py +21 -0
  60. package/dist/src/utils/computerControlMcp/server/tests/run_cli.py +9 -0
  61. package/dist/src/utils/computerControlMcp/server/tests/run_server.py +15 -0
  62. package/dist/src/utils/computerControlMcp/server/tests/setup.py +16 -0
  63. package/dist/src/utils/computerControlMcp/server/tests/test_computer_control.py +161 -0
  64. package/dist/src/utils/computerControlMcp/server/tests/test_screenshot.py +14 -0
  65. package/dist/src/utils/computerControlMcp/server/tests/test_wgc_env_var.py +42 -0
  66. package/dist/src/utils/computerControlMcp/server/tests/test_wgc_screenshot.py +67 -0
  67. package/dist/src/utils/computerControlMcp/server/uv.lock +4986 -0
  68. package/dist/src/utils/computerControlMcp/setup.js +1 -1
  69. package/dist/src/utils/logoV2Utils.js +1 -1
  70. package/dist/src/utils/model/configs.js +1 -1
  71. package/dist/src/utils/model/model.js +1 -1
  72. package/dist/src/utils/model/modelOptions.js +1 -1
  73. package/dist/src/utils/model/providerBaseUrls.js +1 -1
  74. package/dist/src/utils/model/providerCatalog.js +1 -1
  75. package/dist/src/utils/model/providerModels.js +1 -1
  76. package/dist/src/utils/model/providerProfiles.js +1 -1
  77. package/dist/src/utils/model/providerProfilesDb.js +1 -1
  78. package/dist/src/utils/sembleMcp/setup.js +1 -1
  79. package/dist/src/utils/status.js +1 -1
  80. package/dist/src/utils/theme.js +1 -1
  81. package/dist/src/utils/themes/bootstrap.js +1 -1
  82. package/dist/src/utils/themes/opencodeMapper.js +1 -1
  83. package/dist/webapp/chunk-OJZNEHPP.js +1 -1
  84. package/dist/webapp/chunk-VAB2VXFI.js +1 -1
  85. package/dist/webapp/main-MTQLKGXD.js +1 -1
  86. package/dist/webapp/ngsw-worker.js +1 -1
  87. package/dist/webapp/ngsw.json +1 -1
  88. package/dist/webapp/polyfills-7R4CRVNH.js +1 -1
  89. package/package.json +1 -1
@@ -37,7 +37,7 @@ if (!yaTieneHeap) {
37
37
  const child = spawn(
38
38
  process.execPath,
39
39
  [HEAP_FLAG, __filename, ...process.argv.slice(2)],
40
- { stdio: 'inherit', env },
40
+ { stdio: 'inherit', env, cwd: __dirname },
41
41
  )
42
42
  const reenviarSenal = sig => () => {
43
43
  try { child.kill(sig) } catch {}
@@ -80,12 +80,14 @@ try {
80
80
  await runRemotionMcpServer()
81
81
  process.exit(0)
82
82
  }
83
- if (isBun && existsSync(bundledCli)) {
84
- await import(pathToFileURL(bundledCli).href)
85
- } else if (existsSync(distCli)) {
83
+ // Siempre usar el entry compilado por tsc. cli.js (bundle de Bun) usa
84
+ // `import from "bun:bundle"` que Bun resuelve en tiempo de parseo —
85
+ // antes del try/catch — y falla con "may only be imported once" fuera
86
+ // de un contexto de bundle.
87
+ if (existsSync(distCli)) {
86
88
  await import(pathToFileURL(distCli).href)
87
89
  } else {
88
- console.error('No se encontró el punto de entrada del CLI (cli.js o dist/src/entrypoints/cli.js)')
90
+ console.error('No se encontró el punto de entrada del CLI. Ejecuta primero: bun run build:fast')
89
91
  process.exit(1)
90
92
  }
91
93
  } catch (e) {
@@ -1 +1 @@
1
- import{clearAuthRelatedCaches as e,performLogout as o}from"../../commands/logout/logout.js";import{setMainLoopModelOverride as i}from"../../bootstrap/state.js";import{getSecureStorage as t}from"../../utils/secureStorage/index.js";import{logEvent as r}from"../../services/analytics/index.js";import{getSSLErrorHint as s}from"../../services/api/errorUtils.js";import{fetchAndStoreClaudeCodeFirstTokenDate as a}from"../../services/api/firstTokenDate.js";import{createAndStoreApiKey as n,fetchAndStoreUserRoles as c,refreshOAuthToken as l,shouldUseClaudeAIAuth as p,storeOAuthAccountInfo as u}from"../../services/oauth/client.js";import{getOauthProfileFromOauthToken as d}from"../../services/oauth/getOauthProfile.js";import{OAuthService as m}from"../../services/oauth/index.js";import{startGeminiCliOAuthFlow as g}from"../../services/oauth/geminiCli.js";import{clearOAuthTokenCache as f,getAnthropicApiKeyWithSource as h,getAuthTokenSource as v,getClaudeAIOAuthTokens as w,getOpenAIOAuthTokens as _,getOauthAccountInfo as x,removeApiKey as A,saveOpenAIOAuthTokens as O,saveGeminiGoogleOAuthTokens as E,saveProviderApiKey as y,getSubscriptionType as C,isUsing3PServices as b,saveOAuthTokensIfNeeded as j,validateForceLoginOrg as T,removeProviderScopedCredentials as P,removeProviderApiKey as k}from"../../utils/auth.js";import{saveGlobalConfig as U}from"../../utils/config.js";import{logForDebugging as S}from"../../utils/debug.js";import{isRunningOnHomespace as $}from"../../utils/envUtils.js";import{errorMessage as I}from"../../utils/errors.js";import{logError as z}from"../../utils/log.js";import{getAPIProvider as H}from"../../utils/model/providers.js";import{setStoredActiveProviderPreference as L}from"../../utils/model/providerProfilesDb.js";import{isProfiledProvider as D,setActiveProfileForProvider as N}from"../../utils/model/providerProfiles.js";import{getLastUsedProviderProfile as R,removeProviderProfile as K}from"../../utils/model/providerProfiles.js";import{clearProviderBaseUrl as W,setProviderBaseUrl as B}from"../../utils/model/providerBaseUrls.js";import{getInitialSettings as F}from"../../utils/settings/settings.js";import{jsonStringify as M}from"../../utils/slowOperations.js";import{buildAccountProperties as X,buildAPIProviderProperties as Y}from"../../utils/status.js";export async function installOAuthTokens(o,s="anthropic",l){if(l||await async function(e){const{flushTelemetry:o}=await import("../../utils/telemetry/instrumentation.js");if(await o(),"openai"===e)return void _.cache?.clear?.();await A();const i=t(),r=i.read();if(r){const e=Object.fromEntries(Object.entries(r.providerProfileOauth??{}).filter(([e])=>!e.startsWith("claude/"))),{claudeAiOauth:o,...t}=r,s={...t,providerProfileOauth:e};Object.keys(s).length>0?i.update(s):i.delete()}w.cache?.clear?.(),U(e=>({...e,oauthAccount:void 0}))}(s),"anthropic"===s){const e=o.profile??await d(o.accessToken);e?u({accountUuid:e.account.uuid,emailAddress:e.account.email,organizationUuid:e.organization.uuid,displayName:e.account.display_name||void 0,hasExtraUsageEnabled:e.organization.has_extra_usage_enabled??void 0,billingType:e.organization.billing_type??void 0,subscriptionCreatedAt:e.organization.subscription_created_at??void 0,accountCreatedAt:e.account.created_at}):o.tokenAccount&&u({accountUuid:o.tokenAccount.uuid,emailAddress:o.tokenAccount.emailAddress,organizationUuid:o.tokenAccount.organizationUuid})}const m="openai"===s?O(o,l):j(o,l);if(f(),m.warning&&r("tengu_oauth_storage_warning",{warning:m.warning}),"anthropic"===s&&await c(o.accessToken).catch(e=>S(String(e),{level:"error"})),"anthropic"===s&&p(o.scopes))await a().catch(e=>S(String(e),{level:"error"}));else if("anthropic"===s){if(!await n(o.accessToken))throw new Error("No se pudo crear la API key. El servidor aceptó la solicitud pero no devolvió una clave.")}L("openai"===s?"openai":"claude"),i(void 0),await e()}export async function authLogin({email:e,sso:o,console:i,claudeai:t,provider:a}){i&&t&&(process.stderr.write("Error: --console and --claudeai cannot be used together.\n"),process.exit(1));const n=F(),c=n.forceLoginMethod?"claudeai"===n.forceLoginMethod:!i,u=n.forceLoginOrgUUID,d=a?.trim().toLowerCase(),f=process.env.CONTEXT_CODE_OAUTH_REFRESH_TOKEN??process.env.CLAUDE_CODE_OAUTH_REFRESH_TOKEN;if(f){const e=process.env.CONTEXT_CODE_OAUTH_SCOPES??process.env.CLAUDE_CODE_OAUTH_SCOPES;e||(process.stderr.write('CONTEXT_CODE_OAUTH_SCOPES (legacy: CLAUDE_CODE_OAUTH_SCOPES) is required when using CONTEXT_CODE_OAUTH_REFRESH_TOKEN.\nSet it to the space-separated scopes the refresh token was issued with\n(e.g. "user:inference" or "user:profile user:inference user:sessions:claude_code user:mcp_servers").\n'),process.exit(1));const o=e.split(/\s+/).filter(Boolean);try{r("tengu_login_from_refresh_token",{});const e=await l(f,{scopes:o});await installOAuthTokens(e);const i=await T();i.valid||(process.stderr.write(i.message+"\n"),process.exit(1)),U(e=>e.hasCompletedOnboarding?e:{...e,hasCompletedOnboarding:!0}),r("tengu_oauth_success",{loginWithClaudeAi:p(e.scopes)}),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}catch(e){z(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${I(e)}\n${o?o+"\n":""}`),process.exit(1)}}const h=o?"sso":void 0,v=new m;try{if(r("tengu_oauth_flow_start",{loginWithClaudeAi:c}),"gemini-google"===d){const e=await g();E(e),L("gemini-google"),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}const o="openai"===d?"openai":"anthropic",i="openai"!==o&&c,t=await v.startOAuthFlow(async e=>{process.stdout.write("Abriendo el navegador para iniciar sesión…\n"),process.stdout.write(`Si el navegador no se abre, visita: ${e}\n`)},{loginWithClaudeAi:i,provider:o,loginHint:e,loginMethod:h,orgUUID:u});if(await installOAuthTokens(t,o),"anthropic"===o){const e=await T();e.valid||(process.stderr.write(e.message+"\n"),process.exit(1))}r("tengu_oauth_success",{loginWithClaudeAi:i}),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}catch(e){z(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${I(e)}\n${o?o+"\n":""}`),process.exit(1)}finally{v.cleanup()}}export async function authStatus(e){const{source:o,hasToken:i}=v(),{source:t}=h(),r=!!process.env.ANTHROPIC_API_KEY&&!$(),s=H(),a=x(),n=C(),c=b(),l=i||"none"!==t||r||c;let p="none";if("openai"===s?p="openai":c?p="third_party":"claude.ai"===o?p="claude.ai":"apiKeyHelper"===o?p="api_key_helper":"none"!==o?p="oauth_token":"ANTHROPIC_API_KEY"===t||r?p="api_key":"/login managed key"===t&&(p="claude.ai"),e.text){const e=[...X(),...Y()];let o=!1;for(const i of e){const e="string"==typeof i.value?i.value:Array.isArray(i.value)?i.value.join(", "):null;null!==e&&"none"!==e&&(o=!0,i.label?process.stdout.write(`${i.label}: ${e}\n`):process.stdout.write(`${e}\n`))}!o&&r&&process.stdout.write("API key: ANTHROPIC_API_KEY\n"),l||process.stdout.write("openai"===s?"Sesión no iniciada. Ejecuta context auth login para autenticarte con OpenAI / Codex.\n":"Sesión no iniciada. Ejecuta context auth login para autenticarte.\n")}else{const e="none"!==t?t:r?"ANTHROPIC_API_KEY":null,o={loggedIn:l,authMethod:p,apiProvider:s};e&&(o.apiKeySource=e),"claude.ai"===p&&(o.email=a?.emailAddress??null,o.orgId=a?.organizationUuid??null,o.orgName=a?.organizationName??null,o.subscriptionType=n??null),process.stdout.write(M(o,null,2)+"\n")}process.exit(l?0:1)}export async function authLogout(){try{await o({clearOnboarding:!1})}catch{process.stderr.write("Error al cerrar sesión.\n"),process.exit(1)}process.stdout.write(`Sesión cerrada exitosamente de tu cuenta ${function(){const e=H();return"openai"===e?"OpenAI / Codex":"bedrock"===e?"AWS Bedrock":"vertex"===e?"Google Vertex AI":"foundry"===e?"Microsoft Foundry":"Anthropic"}()}.\n`),process.exit(0)}export async function authProviderApiKey(e){const o=e.provider.trim().toLowerCase(),i=["openrouter","ollama-cloud","gemini-api","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","openai"];i.includes(o)||(process.stderr.write(`Provider no soportado para API key: ${o}. Soportados: ${i.join(", ")}\n`),process.exit(1));const t=e.profile?.trim();t&&D(o)&&N(o,t),await y(o,e.apiKey),L(o),process.stdout.write(`API key guardada para ${o}${t?` (perfil ${t})`:""}.\n`),process.exit(0)}export async function authProviderBaseUrl(e){const o=e.provider.trim().toLowerCase(),i=["ollama","ollama-cloud","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"];i.includes(o)||(process.stderr.write(`Provider no soportado para base URL: ${o}. Soportados: ${i.join(", ")}\n`),process.exit(1));const t=e.profile?.trim();t&&D(o)&&N(o,t);const r=B(o,e.baseUrl);L(o),process.stdout.write(`Base URL guardada para ${o}: ${r}${t?` (perfil ${t})`:""}.\n`),process.exit(0)}export async function authSetProviderPreference(e){const o=e.provider.trim().toLowerCase();L(o),process.stdout.write(`Provider activo establecido a ${o}.\n`),process.exit(0)}export async function authProviderRemove(e){const o=e.provider.trim().toLowerCase();o||(process.stderr.write("Debes indicar un provider.\n"),process.exit(1));const i=o,t=e.profile?.trim();let r=null;if(D(i)){const e=t||R(i)?.name;if(e){const o=K(i,e);o&&(await P(o.id),r=`${o.provider}/${o.name}`)}}["openrouter","ollama-cloud","gemini-api","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","openai"].includes(o)&&await k(o);["ollama","ollama-cloud","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(o)&&W(o),process.stdout.write(r?`Proveedor eliminado: ${r}.\n`:`Credenciales/base URL limpiadas para ${o}.\n`),process.exit(0)}
1
+ import{clearAuthRelatedCaches as e,performLogout as o}from"../../commands/logout/logout.js";import{setMainLoopModelOverride as i}from"../../bootstrap/state.js";import{getSecureStorage as t}from"../../utils/secureStorage/index.js";import{logEvent as r}from"../../services/analytics/index.js";import{getSSLErrorHint as s}from"../../services/api/errorUtils.js";import{fetchAndStoreClaudeCodeFirstTokenDate as a}from"../../services/api/firstTokenDate.js";import{createAndStoreApiKey as n,fetchAndStoreUserRoles as c,refreshOAuthToken as l,shouldUseClaudeAIAuth as p,storeOAuthAccountInfo as u}from"../../services/oauth/client.js";import{getOauthProfileFromOauthToken as d}from"../../services/oauth/getOauthProfile.js";import{OAuthService as m}from"../../services/oauth/index.js";import{startGeminiCliOAuthFlow as g}from"../../services/oauth/geminiCli.js";import{clearOAuthTokenCache as f,getAnthropicApiKeyWithSource as h,getAuthTokenSource as v,getClaudeAIOAuthTokens as w,getOpenAIOAuthTokens as _,getOauthAccountInfo as x,removeApiKey as A,saveOpenAIOAuthTokens as O,saveGeminiGoogleOAuthTokens as E,saveProviderApiKey as y,getSubscriptionType as C,isUsing3PServices as b,saveOAuthTokensIfNeeded as j,validateForceLoginOrg as T,removeProviderScopedCredentials as P,removeProviderApiKey as k}from"../../utils/auth.js";import{saveGlobalConfig as U}from"../../utils/config.js";import{logForDebugging as S}from"../../utils/debug.js";import{isRunningOnHomespace as $}from"../../utils/envUtils.js";import{errorMessage as I}from"../../utils/errors.js";import{logError as z}from"../../utils/log.js";import{getAPIProvider as H}from"../../utils/model/providers.js";import{setStoredActiveProviderPreference as L}from"../../utils/model/providerProfilesDb.js";import{isProfiledProvider as D,setActiveProfileForProvider as N}from"../../utils/model/providerProfiles.js";import{getLastUsedProviderProfile as R,removeProviderProfile as K}from"../../utils/model/providerProfiles.js";import{clearProviderBaseUrl as W,setProviderBaseUrl as B}from"../../utils/model/providerBaseUrls.js";import{getInitialSettings as F}from"../../utils/settings/settings.js";import{jsonStringify as M}from"../../utils/slowOperations.js";import{buildAccountProperties as X,buildAPIProviderProperties as Y}from"../../utils/status.js";export async function installOAuthTokens(o,s="anthropic",l){if(l||await async function(e){const{flushTelemetry:o}=await import("../../utils/telemetry/instrumentation.js");if(await o(),"openai"===e)return void _.cache?.clear?.();await A();const i=t(),r=i.read();if(r){const e=Object.fromEntries(Object.entries(r.providerProfileOauth??{}).filter(([e])=>!e.startsWith("claude/"))),{claudeAiOauth:o,...t}=r,s={...t,providerProfileOauth:e};Object.keys(s).length>0?i.update(s):i.delete()}w.cache?.clear?.(),U(e=>({...e,oauthAccount:void 0}))}(s),"anthropic"===s){const e=o.profile??await d(o.accessToken);e?u({accountUuid:e.account.uuid,emailAddress:e.account.email,organizationUuid:e.organization.uuid,displayName:e.account.display_name||void 0,hasExtraUsageEnabled:e.organization.has_extra_usage_enabled??void 0,billingType:e.organization.billing_type??void 0,subscriptionCreatedAt:e.organization.subscription_created_at??void 0,accountCreatedAt:e.account.created_at}):o.tokenAccount&&u({accountUuid:o.tokenAccount.uuid,emailAddress:o.tokenAccount.emailAddress,organizationUuid:o.tokenAccount.organizationUuid})}const m="openai"===s?O(o,l):j(o,l);if(f(),m.warning&&r("tengu_oauth_storage_warning",{warning:m.warning}),"anthropic"===s&&await c(o.accessToken).catch(e=>S(String(e),{level:"error"})),"anthropic"===s&&p(o.scopes))await a().catch(e=>S(String(e),{level:"error"}));else if("anthropic"===s){if(!await n(o.accessToken))throw new Error("No se pudo crear la API key. El servidor aceptó la solicitud pero no devolvió una clave.")}L("openai"===s?"openai":"claude"),i(void 0),await e()}export async function authLogin({email:e,sso:o,console:i,claudeai:t,provider:a}){i&&t&&(process.stderr.write("Error: --console and --claudeai cannot be used together.\n"),process.exit(1));const n=F(),c=n.forceLoginMethod?"claudeai"===n.forceLoginMethod:!i,u=n.forceLoginOrgUUID,d=a?.trim().toLowerCase(),f=process.env.CONTEXT_CODE_OAUTH_REFRESH_TOKEN??process.env.CLAUDE_CODE_OAUTH_REFRESH_TOKEN;if(f){const e=process.env.CONTEXT_CODE_OAUTH_SCOPES??process.env.CLAUDE_CODE_OAUTH_SCOPES;e||(process.stderr.write('CONTEXT_CODE_OAUTH_SCOPES (legacy: CLAUDE_CODE_OAUTH_SCOPES) is required when using CONTEXT_CODE_OAUTH_REFRESH_TOKEN.\nSet it to the space-separated scopes the refresh token was issued with\n(e.g. "user:inference" or "user:profile user:inference user:sessions:claude_code user:mcp_servers").\n'),process.exit(1));const o=e.split(/\s+/).filter(Boolean);try{r("tengu_login_from_refresh_token",{});const e=await l(f,{scopes:o});await installOAuthTokens(e);const i=await T();i.valid||(process.stderr.write(i.message+"\n"),process.exit(1)),U(e=>e.hasCompletedOnboarding?e:{...e,hasCompletedOnboarding:!0}),r("tengu_oauth_success",{loginWithClaudeAi:p(e.scopes)}),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}catch(e){z(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${I(e)}\n${o?o+"\n":""}`),process.exit(1)}}const h=o?"sso":void 0,v=new m;try{if(r("tengu_oauth_flow_start",{loginWithClaudeAi:c}),"gemini-google"===d){const e=await g();E(e),L("gemini-google"),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}const o="openai"===d?"openai":"anthropic",i="openai"!==o&&c,t=await v.startOAuthFlow(async e=>{process.stdout.write("Abriendo el navegador para iniciar sesión…\n"),process.stdout.write(`Si el navegador no se abre, visita: ${e}\n`)},{loginWithClaudeAi:i,provider:o,loginHint:e,loginMethod:h,orgUUID:u});if(await installOAuthTokens(t,o),"anthropic"===o){const e=await T();e.valid||(process.stderr.write(e.message+"\n"),process.exit(1))}r("tengu_oauth_success",{loginWithClaudeAi:i}),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}catch(e){z(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${I(e)}\n${o?o+"\n":""}`),process.exit(1)}finally{v.cleanup()}}export async function authStatus(e){const{source:o,hasToken:i}=v(),{source:t}=h(),r=!!process.env.ANTHROPIC_API_KEY&&!$(),s=H(),a=x(),n=C(),c=b(),l=i||"none"!==t||r||c;let p="none";if("openai"===s?p="openai":c?p="third_party":"claude.ai"===o?p="claude.ai":"apiKeyHelper"===o?p="api_key_helper":"none"!==o?p="oauth_token":"ANTHROPIC_API_KEY"===t||r?p="api_key":"/login managed key"===t&&(p="claude.ai"),e.text){const e=[...X(),...Y()];let o=!1;for(const i of e){const e="string"==typeof i.value?i.value:Array.isArray(i.value)?i.value.join(", "):null;null!==e&&"none"!==e&&(o=!0,i.label?process.stdout.write(`${i.label}: ${e}\n`):process.stdout.write(`${e}\n`))}!o&&r&&process.stdout.write("API key: ANTHROPIC_API_KEY\n"),l||process.stdout.write("openai"===s?"Sesión no iniciada. Ejecuta context auth login para autenticarte con OpenAI / Codex.\n":"Sesión no iniciada. Ejecuta context auth login para autenticarte.\n")}else{const e="none"!==t?t:r?"ANTHROPIC_API_KEY":null,o={loggedIn:l,authMethod:p,apiProvider:s};e&&(o.apiKeySource=e),"claude.ai"===p&&(o.email=a?.emailAddress??null,o.orgId=a?.organizationUuid??null,o.orgName=a?.organizationName??null,o.subscriptionType=n??null),process.stdout.write(M(o,null,2)+"\n")}process.exit(l?0:1)}export async function authLogout(){try{await o({clearOnboarding:!1})}catch{process.stderr.write("Error al cerrar sesión.\n"),process.exit(1)}process.stdout.write(`Sesión cerrada exitosamente de tu cuenta ${function(){const e=H();return"openai"===e?"OpenAI / Codex":"bedrock"===e?"AWS Bedrock":"vertex"===e?"Google Vertex AI":"foundry"===e?"Microsoft Foundry":"Anthropic"}()}.\n`),process.exit(0)}export async function authProviderApiKey(e){const o=e.provider.trim().toLowerCase(),i=["openrouter","ollama-cloud","gemini-api","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","openai"];i.includes(o)||(process.stderr.write(`Provider no soportado para API key: ${o}. Soportados: ${i.join(", ")}\n`),process.exit(1));const t=e.profile?.trim();t&&D(o)&&N(o,t),await y(o,e.apiKey),L(o),process.stdout.write(`API key guardada para ${o}${t?` (perfil ${t})`:""}.\n`),process.exit(0)}export async function authProviderBaseUrl(e){const o=e.provider.trim().toLowerCase(),i=["ollama","ollama-cloud","lmstudio","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"];i.includes(o)||(process.stderr.write(`Provider no soportado para base URL: ${o}. Soportados: ${i.join(", ")}\n`),process.exit(1));const t=e.profile?.trim();t&&D(o)&&N(o,t);const r=B(o,e.baseUrl);L(o),process.stdout.write(`Base URL guardada para ${o}: ${r}${t?` (perfil ${t})`:""}.\n`),process.exit(0)}export async function authSetProviderPreference(e){const o=e.provider.trim().toLowerCase();L(o),process.stdout.write(`Provider activo establecido a ${o}.\n`),process.exit(0)}export async function authProviderRemove(e){const o=e.provider.trim().toLowerCase();o||(process.stderr.write("Debes indicar un provider.\n"),process.exit(1));const i=o,t=e.profile?.trim();let r=null;if(D(i)){const e=t||R(i)?.name;if(e){const o=K(i,e);o&&(await P(o.id),r=`${o.provider}/${o.name}`)}}["openrouter","ollama-cloud","gemini-api","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","openai"].includes(o)&&await k(o);["ollama","ollama-cloud","lmstudio","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(o)&&W(o),process.stdout.write(r?`Proveedor eliminado: ${r}.\n`:`Credenciales/base URL limpiadas para ${o}.\n`),process.exit(0)}
@@ -1 +1 @@
1
- import{fetchProviderModels as e}from"../../utils/model/providerModels.js";import{VISIBLE_PROVIDERS as i}from"../../utils/model/providerCatalog.js";import{getAPIProvider as o}from"../../utils/model/providers.js";const r=[{id:"claude-opus-4-7",label:"Opus 4.7",description:"Mas capaz, ideal para tareas complejas."},{id:"claude-sonnet-4-6",label:"Sonnet 4.6",description:"Balanceado, recomendado para uso general."},{id:"claude-haiku-4-5-20251001",label:"Haiku 4.5",description:"Rapido y economico."},{id:"opus",label:"opus (alias)",description:"Alias dinamico al Opus por defecto."},{id:"sonnet",label:"sonnet (alias)",description:"Alias dinamico al Sonnet por defecto."},{id:"haiku",label:"haiku (alias)",description:"Alias dinamico al Haiku por defecto."}],a={claude:"firstParty",openai:"openai",openrouter:"openrouter",ollama:"ollama","ollama-cloud":"ollama-cloud","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"zai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek",xai:"xai",gmi:"gmi",novita:"novita",stepfun:"stepfun",huggingface:"huggingface","opencode-zen":"opencode-zen",arcee:"arcee",alibaba:"alibaba",kimi:"kimi","custom-openai":"custom-openai","custom-anthropic":"custom-anthropic",bedrock:"bedrock",vertex:"vertex",foundry:"foundry",firstparty:"firstParty",anthropic:"firstParty"};export async function modelListHandler(t){let n;if(t.provider){const e=function(e){if(!e)return null;const o=e.trim().toLowerCase();if(a[o])return a[o];const r=i.find(e=>e.label.toLowerCase()===o);if(r)return a[r.id]??null;const t=i.find(e=>e.label.toLowerCase().includes(o)||o.includes(e.id));return t?a[t.id]??null:null}(t.provider);e||(process.stderr.write(`Provider desconocido: ${t.provider}\n`),process.exit(2)),n=e}else n=o();let s=[],l=null;try{s=(await e(n)).map(e=>({id:e.value,label:e.label,description:e.description}))}catch(e){l=e instanceof Error?e.message:String(e)}if(0===s.length&&function(e){return"firstParty"===e||"bedrock"===e||"vertex"===e||"foundry"===e}(n)&&(s=r),t.json)process.stdout.write(JSON.stringify({provider:n,models:s,error:l})+"\n");else{process.stdout.write(`Modelos disponibles (${n}):\n`),0===s.length&&(process.stdout.write(" (sin modelos detectados)\n"),l&&process.stdout.write(` Error: ${l}\n`));for(const e of s)process.stdout.write(` ${e.id}${e.label&&e.label!==e.id?` - ${e.label}`:""}\n`),e.description&&process.stdout.write(` ${e.description}\n`)}process.exit(0)}
1
+ import{fetchProviderModels as e}from"../../utils/model/providerModels.js";import{VISIBLE_PROVIDERS as i}from"../../utils/model/providerCatalog.js";import{getAPIProvider as o}from"../../utils/model/providers.js";const r=[{id:"claude-opus-4-7",label:"Opus 4.7",description:"Mas capaz, ideal para tareas complejas."},{id:"claude-sonnet-4-6",label:"Sonnet 4.6",description:"Balanceado, recomendado para uso general."},{id:"claude-haiku-4-5-20251001",label:"Haiku 4.5",description:"Rapido y economico."},{id:"opus",label:"opus (alias)",description:"Alias dinamico al Opus por defecto."},{id:"sonnet",label:"sonnet (alias)",description:"Alias dinamico al Sonnet por defecto."},{id:"haiku",label:"haiku (alias)",description:"Alias dinamico al Haiku por defecto."}],a={claude:"firstParty",openai:"openai",openrouter:"openrouter",ollama:"ollama","ollama-cloud":"ollama-cloud",lmstudio:"lmstudio","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"zai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek",xai:"xai",gmi:"gmi",novita:"novita",stepfun:"stepfun",huggingface:"huggingface","opencode-zen":"opencode-zen",arcee:"arcee",alibaba:"alibaba",kimi:"kimi","custom-openai":"custom-openai","custom-anthropic":"custom-anthropic",bedrock:"bedrock",vertex:"vertex",foundry:"foundry",firstparty:"firstParty",anthropic:"firstParty"};export async function modelListHandler(t){let s;if(t.provider){const e=function(e){if(!e)return null;const o=e.trim().toLowerCase();if(a[o])return a[o];const r=i.find(e=>e.label.toLowerCase()===o);if(r)return a[r.id]??null;const t=i.find(e=>e.label.toLowerCase().includes(o)||o.includes(e.id));return t?a[t.id]??null:null}(t.provider);e||(process.stderr.write(`Provider desconocido: ${t.provider}\n`),process.exit(2)),s=e}else s=o();let n=[],l=null;try{n=(await e(s)).map(e=>({id:e.value,label:e.label,description:e.description}))}catch(e){l=e instanceof Error?e.message:String(e)}if(0===n.length&&function(e){return"firstParty"===e||"bedrock"===e||"vertex"===e||"foundry"===e}(s)&&(n=r),t.json)process.stdout.write(JSON.stringify({provider:s,models:n,error:l})+"\n");else{process.stdout.write(`Modelos disponibles (${s}):\n`),0===n.length&&(process.stdout.write(" (sin modelos detectados)\n"),l&&process.stdout.write(` Error: ${l}\n`));for(const e of n)process.stdout.write(` ${e.id}${e.label&&e.label!==e.id?` - ${e.label}`:""}\n`),e.description&&process.stdout.write(` ${e.description}\n`)}process.exit(0)}
@@ -1 +1 @@
1
- import{getVisibleProvider as e}from"../../utils/model/providerCatalog.js";import{buildAgentDetailMessage as r,buildAgentSummary as t,createAgent as o,deleteAgent as a,getAgent as n,isKnownAgentProvider as i,listAgents as s,setAgentModelByName as l,setAgentOrchestratorByName as u,setAgentRoleByName as c}from"./agentStore.js";function parseProvider(e){const r=function(e){if(!e)return null;switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(e);return r&&i(r)?r:null}function getProviderLabel(r){return e(r).label}async function buildListMessageAsync(e){const r=await s(e);if(0===r.length)return e?`No hay agentes guardados para ${getProviderLabel(e)}.`:"No hay agentes guardados.";const o=[],a=e?[[e,r]]:Array.from(r.reduce((e,r)=>{const t=e.get(r.provider)??[];return t.push(r),e.set(r.provider,t),e},new Map));for(const[r,n]of a){e||o.push(""),o.push(`${getProviderLabel(r)}:`);for(const e of n)o.push(t(e))}return o.join("\n").trimStart()}const d=[{name:"orchestrator",role:"orchestrator",isOrchestrator:!0},{name:"backend",role:"backend",isOrchestrator:!1},{name:"frontend",role:"frontend",isOrchestrator:!1},{name:"qa",role:"qa",isOrchestrator:!1}];async function bootstrapProviderAgents(e){const r=[];for(const t of d){const a=await n(e.provider,t.name),i=a??await o({provider:e.provider,name:t.name,profileName:e.profileName}),s=await c(e.provider,i.name,t.role),d=await u(e.provider,i.name,t.isOrchestrator),p=await l(e.provider,i.name,e.model);r.push(`${a?"actualizado":"creado"} ${e.provider}/${i.name} role=${s?.roleKind??t.role} orchestrator=${d?.isOrchestrator?"true":"false"} model=${p?.modelOverride??"sin override"}`)}return[`Setup completado para ${getProviderLabel(e.provider)} (${d.length} agentes):`,...r].join("\n")}export const call=async(e,t)=>{const i=e.trim();if(!i||"list"===i.toLowerCase())return{type:"text",value:await buildListMessageAsync()};const s=i.split(/\s+/).filter(Boolean),d=s[0]?.toLowerCase();if("list"===d){const e=parseProvider(s[1]);return s[1]&&!e?{type:"text",value:`Proveedor invalido: ${s[1]}`}:{type:"text",value:await buildListMessageAsync(e??void 0)}}const p=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("create"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]);if(!t)return null;const o=r[2]?.trim();return o?{provider:t,name:o,profileName:r.slice(3).join(" ").trim()||void 0}:null}(i);if(p)try{const e=await n(p.provider,p.name);if(e)return{type:"text",value:`El agente ya existe: ${e.provider}/${e.name}`};const r=await o(p);return{type:"text",value:`Agente creado: ${r.provider}/${r.name}\nPerfil vinculado: ${r.profile?`${r.profile.provider}/${r.profile.name}`:"sin perfil"}`}}catch(e){return{type:"text",value:`No se pudo crear el agente: ${e instanceof Error?e.message:String(e)}`}}const m=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("setup"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]);if(!t)return null;const o=r[2],a=r.slice(3).join(" ").trim();return{provider:t,model:o&&!["-","none","clear"].includes(o.toLowerCase())?o.trim():null,profileName:a||void 0}}(i);if(m)try{return{type:"text",value:await bootstrapProviderAgents(m)}}catch(e){return{type:"text",value:`No se pudo ejecutar setup: ${e instanceof Error?e.message:String(e)}`}}const v=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("show"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim();return t&&o?{provider:t,name:o}:null}(i);if(v){const e=await n(v.provider,v.name);return e?{type:"text",value:r(e)}:{type:"text",value:`No existe el agente ${v.provider}/${v.name}.`}}const f=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("delete"!==r[0]?.toLowerCase()&&"remove"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim();return t&&o?{provider:t,name:o}:null}(i);if(f){return await a(f.provider,f.name)?{type:"text",value:`Agente eliminado: ${f.provider}/${f.name}`}:{type:"text",value:`No existe el agente ${f.provider}/${f.name}.`}}const g=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("set-role"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim(),a=r.slice(3).join(" ").trim();return t&&o&&a?{provider:t,name:o,role:a}:null}(i);if(g)try{const e=await c(g.provider,g.name,g.role);return e?{type:"text",value:`Rol actualizado para ${e.provider}/${e.name}: ${e.roleKind??"worker"}`}:{type:"text",value:`No existe el agente ${g.provider}/${g.name}.`}}catch(e){return{type:"text",value:`No se pudo actualizar el rol: ${e instanceof Error?e.message:String(e)}`}}const $=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("set-orchestrator"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim(),a=function(e){if(!e)return null;switch(e.trim().toLowerCase()){case"true":case"1":case"yes":case"y":case"si":case"s":case"on":return!0;case"false":case"0":case"no":case"n":case"off":return!1;default:return null}}(r[3]);return t&&o&&null!==a?{provider:t,name:o,isOrchestrator:a}:null}(i);if($){const e=await u($.provider,$.name,$.isOrchestrator);return e?{type:"text",value:`Orquestador actualizado para ${e.provider}/${e.name}: ${e.isOrchestrator?"true":"false"}`}:{type:"text",value:`No existe el agente ${$.provider}/${$.name}.`}}const y=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("set-model"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim();return t&&o&&0!==r.slice(3).length?{provider:t,name:o,model:function(e){const r=e.join(" ").trim();return r?["clear","default","reset","none"].includes(r.toLowerCase())?null:r:null}(r.slice(3))}:null}(i);if(y)try{const e=await l(y.provider,y.name,y.model);return e?{type:"text",value:e.modelOverride?`Modelo actualizado para ${e.provider}/${e.name}: ${e.modelOverride}`:`Modelo limpiado para ${e.provider}/${e.name}`}:{type:"text",value:`No existe el agente ${y.provider}/${y.name}.`}}catch(e){return{type:"text",value:`No se pudo actualizar el modelo: ${e instanceof Error?e.message:String(e)}`}}return{type:"text",value:["Uso: /agent, /agent list [proveedor], /agent create <proveedor> <name> [profile],","/agent setup <proveedor> [model] [profile],","/agent show <proveedor> <name>, /agent delete <proveedor> <name>, /agent set-role <proveedor> <name> <role>,","/agent set-orchestrator <proveedor> <name> <true|false>, /agent set-model <proveedor> <name> <model|clear>"].join(" ")}};
1
+ import{getVisibleProvider as e}from"../../utils/model/providerCatalog.js";import{buildAgentDetailMessage as r,buildAgentSummary as t,createAgent as o,deleteAgent as a,getAgent as n,isKnownAgentProvider as i,listAgents as s,setAgentModelByName as l,setAgentOrchestratorByName as u,setAgentRoleByName as c}from"./agentStore.js";function parseProvider(e){const r=function(e){if(!e)return null;switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"lm-studio":case"lm_studio":case"lmstudio":return"lmstudio";case"gemini":case"gemini-api-key":case"google-ai":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(e);return r&&i(r)?r:null}function getProviderLabel(r){return e(r).label}async function buildListMessageAsync(e){const r=await s(e);if(0===r.length)return e?`No hay agentes guardados para ${getProviderLabel(e)}.`:"No hay agentes guardados.";const o=[],a=e?[[e,r]]:Array.from(r.reduce((e,r)=>{const t=e.get(r.provider)??[];return t.push(r),e.set(r.provider,t),e},new Map));for(const[r,n]of a){e||o.push(""),o.push(`${getProviderLabel(r)}:`);for(const e of n)o.push(t(e))}return o.join("\n").trimStart()}const d=[{name:"orchestrator",role:"orchestrator",isOrchestrator:!0},{name:"backend",role:"backend",isOrchestrator:!1},{name:"frontend",role:"frontend",isOrchestrator:!1},{name:"qa",role:"qa",isOrchestrator:!1}];async function bootstrapProviderAgents(e){const r=[];for(const t of d){const a=await n(e.provider,t.name),i=a??await o({provider:e.provider,name:t.name,profileName:e.profileName}),s=await c(e.provider,i.name,t.role),d=await u(e.provider,i.name,t.isOrchestrator),p=await l(e.provider,i.name,e.model);r.push(`${a?"actualizado":"creado"} ${e.provider}/${i.name} role=${s?.roleKind??t.role} orchestrator=${d?.isOrchestrator?"true":"false"} model=${p?.modelOverride??"sin override"}`)}return[`Setup completado para ${getProviderLabel(e.provider)} (${d.length} agentes):`,...r].join("\n")}export const call=async(e,t)=>{const i=e.trim();if(!i||"list"===i.toLowerCase())return{type:"text",value:await buildListMessageAsync()};const s=i.split(/\s+/).filter(Boolean),d=s[0]?.toLowerCase();if("list"===d){const e=parseProvider(s[1]);return s[1]&&!e?{type:"text",value:`Proveedor invalido: ${s[1]}`}:{type:"text",value:await buildListMessageAsync(e??void 0)}}const p=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("create"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]);if(!t)return null;const o=r[2]?.trim();return o?{provider:t,name:o,profileName:r.slice(3).join(" ").trim()||void 0}:null}(i);if(p)try{const e=await n(p.provider,p.name);if(e)return{type:"text",value:`El agente ya existe: ${e.provider}/${e.name}`};const r=await o(p);return{type:"text",value:`Agente creado: ${r.provider}/${r.name}\nPerfil vinculado: ${r.profile?`${r.profile.provider}/${r.profile.name}`:"sin perfil"}`}}catch(e){return{type:"text",value:`No se pudo crear el agente: ${e instanceof Error?e.message:String(e)}`}}const m=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("setup"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]);if(!t)return null;const o=r[2],a=r.slice(3).join(" ").trim();return{provider:t,model:o&&!["-","none","clear"].includes(o.toLowerCase())?o.trim():null,profileName:a||void 0}}(i);if(m)try{return{type:"text",value:await bootstrapProviderAgents(m)}}catch(e){return{type:"text",value:`No se pudo ejecutar setup: ${e instanceof Error?e.message:String(e)}`}}const v=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("show"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim();return t&&o?{provider:t,name:o}:null}(i);if(v){const e=await n(v.provider,v.name);return e?{type:"text",value:r(e)}:{type:"text",value:`No existe el agente ${v.provider}/${v.name}.`}}const f=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("delete"!==r[0]?.toLowerCase()&&"remove"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim();return t&&o?{provider:t,name:o}:null}(i);if(f){return await a(f.provider,f.name)?{type:"text",value:`Agente eliminado: ${f.provider}/${f.name}`}:{type:"text",value:`No existe el agente ${f.provider}/${f.name}.`}}const g=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("set-role"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim(),a=r.slice(3).join(" ").trim();return t&&o&&a?{provider:t,name:o,role:a}:null}(i);if(g)try{const e=await c(g.provider,g.name,g.role);return e?{type:"text",value:`Rol actualizado para ${e.provider}/${e.name}: ${e.roleKind??"worker"}`}:{type:"text",value:`No existe el agente ${g.provider}/${g.name}.`}}catch(e){return{type:"text",value:`No se pudo actualizar el rol: ${e instanceof Error?e.message:String(e)}`}}const $=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("set-orchestrator"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim(),a=function(e){if(!e)return null;switch(e.trim().toLowerCase()){case"true":case"1":case"yes":case"y":case"si":case"s":case"on":return!0;case"false":case"0":case"no":case"n":case"off":return!1;default:return null}}(r[3]);return t&&o&&null!==a?{provider:t,name:o,isOrchestrator:a}:null}(i);if($){const e=await u($.provider,$.name,$.isOrchestrator);return e?{type:"text",value:`Orquestador actualizado para ${e.provider}/${e.name}: ${e.isOrchestrator?"true":"false"}`}:{type:"text",value:`No existe el agente ${$.provider}/${$.name}.`}}const y=function(e){const r=e.trim().split(/\s+/).filter(Boolean);if("set-model"!==r[0]?.toLowerCase())return null;const t=parseProvider(r[1]),o=r[2]?.trim();return t&&o&&0!==r.slice(3).length?{provider:t,name:o,model:function(e){const r=e.join(" ").trim();return r?["clear","default","reset","none"].includes(r.toLowerCase())?null:r:null}(r.slice(3))}:null}(i);if(y)try{const e=await l(y.provider,y.name,y.model);return e?{type:"text",value:e.modelOverride?`Modelo actualizado para ${e.provider}/${e.name}: ${e.modelOverride}`:`Modelo limpiado para ${e.provider}/${e.name}`}:{type:"text",value:`No existe el agente ${y.provider}/${y.name}.`}}catch(e){return{type:"text",value:`No se pudo actualizar el modelo: ${e instanceof Error?e.message:String(e)}`}}return{type:"text",value:["Uso: /agent, /agent list [proveedor], /agent create <proveedor> <name> [profile],","/agent setup <proveedor> [model] [profile],","/agent show <proveedor> <name>, /agent delete <proveedor> <name>, /agent set-role <proveedor> <name> <role>,","/agent set-orchestrator <proveedor> <name> <true|false>, /agent set-model <proveedor> <name> <model|clear>"].join(" ")}};
@@ -1 +1 @@
1
- import{feature as e}from"../../recovery/bunBundleShim.js";import{jsx as r,jsxs as o}from"react/jsx-runtime";import{resetCostState as t}from"../../bootstrap/state.js";import{clearTrustedDeviceToken as i,enrollTrustedDevice as n}from"../../bridge/trustedDevice.js";import{ConfigurableShortcutHint as a}from"../../components/ConfigurableShortcutHint.js";import{ConsoleOAuthFlow as s}from"../../components/ConsoleOAuthFlow.js";import{Dialog as m}from"../../components/design-system/Dialog.js";import{useMainLoopModel as l}from"../../hooks/useMainLoopModel.js";import{Text as c}from"../../ink.js";import{refreshGrowthBookAfterAuthChange as d}from"../../services/analytics/growthbook.js";import{refreshPolicyLimits as p}from"../../services/policyLimits/index.js";import{refreshRemoteManagedSettings as u}from"../../services/remoteManagedSettings/index.js";import{stripSignatureBlocks as g}from"../../utils/messages.js";import{checkAndDisableAutoModeIfNeeded as f,checkAndDisableBypassPermissionsIfNeeded as P,resetAutoModeGateCheck as v,resetBypassPermissionsCheck as M}from"../../utils/permissions/bypassPermissionsKillswitch.js";import{getAPIProvider as N}from"../../utils/model/providers.js";import{switchProviderPreference as x}from"../../utils/model/providerSwitch.js";import{resetUserCache as j}from"../../utils/user.js";import{applySuccessfulLogin as h,isCoreAuthEnabled as S,parseLoginProfileName as I}from"../../core/auth/loginCore.js";export async function call(o,a,s){const m=I(s);return r(Login,{profileName:m,onDone:async(r,s,l,c)=>{if(a.onChangeAPIKey(),a.setMessages(g),r){if(S()){const r=h({context:a,profileName:m,previousModel:s,previousProvider:l,targetProvider:c,transcriptClassifierEnabled:e("TRANSCRIPT_CLASSIFIER")});return r.shouldOpenModelPicker?void o(r.message,{nextInput:"/model",submitNextInput:!0}):void o(r.message)}const r="openai"===c?x({currentModel:s,currentProvider:l,targetProvider:"openai",targetProfileName:m}):"openrouter"===c?x({currentModel:s,currentProvider:l,targetProvider:"openrouter",targetProfileName:m}):"ollama"===c?x({currentModel:s,currentProvider:l,targetProvider:"ollama",targetProfileName:m}):"ollama-cloud"===c?x({currentModel:s,currentProvider:l,targetProvider:"ollama-cloud",targetProfileName:m}):"gemini-api"===c?x({currentModel:s,currentProvider:l,targetProvider:"gemini-api",targetProfileName:m}):"gemini-google"===c?x({currentModel:s,currentProvider:l,targetProvider:"gemini-google",targetProfileName:m}):"zai"===c?x({currentModel:s,currentProvider:l,targetProvider:"zai",targetProfileName:m}):"minimax"===c?x({currentModel:s,currentProvider:l,targetProvider:"minimax",targetProfileName:m}):"nvidia"===c?x({currentModel:s,currentProvider:l,targetProvider:"nvidia",targetProfileName:m}):"deepseek"===c?x({currentModel:s,currentProvider:l,targetProvider:"deepseek",targetProfileName:m}):"custom-openai"===c?x({currentModel:s,currentProvider:l,targetProvider:"custom-openai",targetProfileName:m}):"custom-anthropic"===c?x({currentModel:s,currentProvider:l,targetProvider:"custom-anthropic",targetProfileName:m}):c&&["xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(c)?x({currentModel:s,currentProvider:l,targetProvider:c,targetProfileName:m}):x({currentModel:s,currentProvider:l,targetProvider:"claude",targetProfileName:m});t(),u(),p(),j(),d(),i(),n(),M();const g=a.getAppState();if(P(g.toolPermissionContext,a.setAppState),e("TRANSCRIPT_CLASSIFIER")&&(v(),f(g.toolPermissionContext,a.setAppState,g.fastMode)),a.setAppState(e=>({...e,mainLoopModel:r,mainLoopModelForSession:r,authVersion:e.authVersion+1})),!r)return void o(m?`Inicio de sesion exitoso en el perfil "${m}". Selecciona ahora el modelo para este perfil.`:"Inicio de sesion exitoso. Selecciona ahora el modelo para este perfil.",{nextInput:"/model",submitNextInput:!0})}o(r?"Inicio de sesión exitoso":"Acceso interrumpido")}})}export function Login(e){const t=l(),i=N();return r(m,{title:"Iniciar sesión",onCancel:()=>e.onDone(!1,t,i),color:"permission",inputGuide:e=>e.pending?o(c,{children:["Presiona ",e.keyName," de nuevo para salir"]}):r(a,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancelar"}),children:r(s,{onDone:r=>e.onDone(!0,t,i,r),startingMessage:e.startingMessage,profileName:e.profileName})})}
1
+ import{feature as e}from"../../recovery/bunBundleShim.js";import{jsx as r}from"react/jsx-runtime";import{resetCostState as o}from"../../bootstrap/state.js";import{clearTrustedDeviceToken as t,enrollTrustedDevice as i}from"../../bridge/trustedDevice.js";import{ConsoleOAuthFlow as n}from"../../components/ConsoleOAuthFlow.js";import{useKeybinding as a}from"../../keybindings/useKeybinding.js";import{useMainLoopModel as s}from"../../hooks/useMainLoopModel.js";import{Box as m}from"../../ink.js";import{refreshGrowthBookAfterAuthChange as l}from"../../services/analytics/growthbook.js";import{refreshPolicyLimits as d}from"../../services/policyLimits/index.js";import{refreshRemoteManagedSettings as c}from"../../services/remoteManagedSettings/index.js";import{stripSignatureBlocks as u}from"../../utils/messages.js";import{checkAndDisableAutoModeIfNeeded as p,checkAndDisableBypassPermissionsIfNeeded as g,resetAutoModeGateCheck as P,resetBypassPermissionsCheck as f}from"../../utils/permissions/bypassPermissionsKillswitch.js";import{getAPIProvider as v}from"../../utils/model/providers.js";import{switchProviderPreference as M}from"../../utils/model/providerSwitch.js";import{resetUserCache as N}from"../../utils/user.js";import{applySuccessfulLogin as x,isCoreAuthEnabled as j,parseLoginProfileName as h}from"../../core/auth/loginCore.js";export async function call(n,a,s){const m=h(s);return r(Login,{profileName:m,onDone:async(r,s,v,h)=>{if(a.onChangeAPIKey(),a.setMessages(u),r){if(j()){const r=x({context:a,profileName:m,previousModel:s,previousProvider:v,targetProvider:h,transcriptClassifierEnabled:e("TRANSCRIPT_CLASSIFIER")});return r.shouldOpenModelPicker?void n(r.message,{nextInput:"/model",submitNextInput:!0}):void n(r.message)}const r="openai"===h?M({currentModel:s,currentProvider:v,targetProvider:"openai",targetProfileName:m}):"openrouter"===h?M({currentModel:s,currentProvider:v,targetProvider:"openrouter",targetProfileName:m}):"ollama"===h?M({currentModel:s,currentProvider:v,targetProvider:"ollama",targetProfileName:m}):"ollama-cloud"===h?M({currentModel:s,currentProvider:v,targetProvider:"ollama-cloud",targetProfileName:m}):"lmstudio"===h?M({currentModel:s,currentProvider:v,targetProvider:"lmstudio",targetProfileName:m}):"gemini-api"===h?M({currentModel:s,currentProvider:v,targetProvider:"gemini-api",targetProfileName:m}):"gemini-google"===h?M({currentModel:s,currentProvider:v,targetProvider:"gemini-google",targetProfileName:m}):"zai"===h?M({currentModel:s,currentProvider:v,targetProvider:"zai",targetProfileName:m}):"minimax"===h?M({currentModel:s,currentProvider:v,targetProvider:"minimax",targetProfileName:m}):"nvidia"===h?M({currentModel:s,currentProvider:v,targetProvider:"nvidia",targetProfileName:m}):"deepseek"===h?M({currentModel:s,currentProvider:v,targetProvider:"deepseek",targetProfileName:m}):"custom-openai"===h?M({currentModel:s,currentProvider:v,targetProvider:"custom-openai",targetProfileName:m}):"custom-anthropic"===h?M({currentModel:s,currentProvider:v,targetProvider:"custom-anthropic",targetProfileName:m}):h&&["xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(h)?M({currentModel:s,currentProvider:v,targetProvider:h,targetProfileName:m}):M({currentModel:s,currentProvider:v,targetProvider:"claude",targetProfileName:m});o(),c(),d(),N(),l(),t(),i(),f();const u=a.getAppState();if(g(u.toolPermissionContext,a.setAppState),e("TRANSCRIPT_CLASSIFIER")&&(P(),p(u.toolPermissionContext,a.setAppState,u.fastMode)),a.setAppState(e=>({...e,mainLoopModel:r,mainLoopModelForSession:r,authVersion:e.authVersion+1})),!r)return void n(m?`Inicio de sesion exitoso en el perfil "${m}". Selecciona ahora el modelo para este perfil.`:"Inicio de sesion exitoso. Selecciona ahora el modelo para este perfil.",{nextInput:"/model",submitNextInput:!0})}n(r?"Inicio de sesión exitoso":"Acceso interrumpido")}})}export function Login(e){const o=s(),t=v();return a("confirm:no",()=>e.onDone(!1,o,t),{context:"Confirmation"}),r(m,{flexDirection:"column",gap:1,children:r(n,{onDone:r=>e.onDone(!0,o,t,r),startingMessage:e.startingMessage,profileName:e.profileName})})}
@@ -1 +1 @@
1
- import{jsx as e,jsxs as r}from"react/jsx-runtime";import*as o from"react";import{Box as i,Text as n,useInput as l}from"../../ink.js";import{Dialog as t}from"../../components/design-system/Dialog.js";import{useMainLoopModel as a}from"../../hooks/useMainLoopModel.js";import{useSetAppState as s}from"../../state/AppState.js";import{getAPIProvider as c}from"../../utils/model/providers.js";import{finalizeProviderProfilesMigration as u,getProviderProfilesDbPath as d,getProviderProfilesStorageBackend as f,getProviderProfilesStorageMode as m,purgeLegacyProviderStateInConfig as p,setStoredActiveProviderPreference as v}from"../../utils/model/providerProfilesDb.js";import{clearAllProviderProfiles as g,createProviderProfile as $,findProviderProfileByName as N,getActiveProviderProfile as P,getLastUsedProviderProfile as h,getProviderProfile as L,isProfiledProvider as w,listProviderProfiles as C,removeProviderProfile as j,renameProviderProfile as y,setActiveProviderProfile as S,setProviderProfileAgentNameByName as b,setProviderProfileLastModelByName as x}from"../../utils/model/providerProfiles.js";import{fetchProviderModels as M}from"../../utils/model/providerModels.js";import{VISIBLE_PROVIDERS as A}from"../../utils/model/providerCatalog.js";import{switchProviderPreference as E}from"../../utils/model/providerSwitch.js";import{removeAllProviderScopedCredentials as B,removeProviderScopedCredentials as I,renameProviderScopedCredentials as z}from"../../utils/auth.js";import{clearAuthRelatedCaches as D}from"../logout/logout.js";import{getSecureStorage as U}from"../../utils/secureStorage/index.js";import{getLegacyCredentialsFilePath as q,getSecureStorageDbPath as k,getSecureStorageKeyPath as K,hasLegacyCredentialsFile as Q,isSecureStorageEncrypted as R}from"../../utils/secureStorage/sqliteStorage.js";function normalizeProviderInput(e){if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}function getProviderLabel(e){return A.find(r=>r.id===e)?.label??e}function formatProfileLine(e,r){const o=L(r);if(!o)return null;const i=P(),n=h(e),l=[i?.id===o.id?"active":null,n?.id===o.id?"last":null].filter(Boolean),t=l.length>0?` [${l.join(", ")}]`:"",a=[`agent=${o.agentName}`,o.baseUrl?`url=${o.baseUrl}`:null,o.lastModel?`model=${o.lastModel}`:null].filter(Boolean).join(" | ");return`- ${o.provider}/${o.name}${t}${a?` -> ${a}`:""}`}function getProviderStorageModeLabel(){const e=f(),r=m();return"sqlite"!==e?"Legacy fallback":"sqlite-only"===r?"SQLite-only":"SQLite (migracion pendiente)"}function reconcileActiveProviderProfileState(){const e=P();if(e)return void v(e.provider);const r=C()[0];r?(S(r.id),v(r.provider)):v(null)}function RemoveAllProfilesConfirmation({onDone:a,context:s}){const[c,u]=o.useState(!1);return l((e,r)=>{if(!c)return"y"===e||"Y"===e?(u(!0),void async function(e,r){try{const o=g();reconcileActiveProviderProfileState(),await B(),await D(),r.onChangeAPIKey(),e(o.length>0?`Se eliminaron todos los perfiles guardados (${o.length}).`:"No habia perfiles guardados para eliminar.")}catch(r){e(`No se pudieron eliminar todos los perfiles: ${r instanceof Error?r.message:String(r)}`)}}(a,s)):void(("n"===e||"N"===e||r.escape)&&a("Eliminacion de perfiles cancelada."))},{isActive:!0}),e(t,{title:"Eliminar todos los perfiles",subtitle:"Esta accion elimina todos los perfiles guardados y sus credenciales asociadas por perfil.",onCancel:()=>{c||a("Eliminacion de perfiles cancelada.")},color:"error",inputGuide:()=>e(n,{children:"y: confirmar eliminacion total · n/Esc: cancelar"}),children:r(i,{flexDirection:"column",children:[e(n,{children:"Se borraran todos los perfiles persistidos de proveedores."}),e(n,{dimColor:!0,children:"Los fallbacks legacy de compatibilidad no se eliminan con este comando."}),c?e(n,{children:"Eliminando perfiles..."}):null]})})}function SwitchProfileOnMount({onDone:e,context:r,provider:i,profileName:n}){const l=a(),t=s();return o.useEffect(()=>{(async()=>{try{const o=E({currentModel:l,currentProvider:c(),targetProvider:i,targetProfileName:n});await D(),r.onChangeAPIKey(),t(e=>({...e,mainLoopModel:o,mainLoopModelForSession:null}));const a=h(i);e(o?`Perfil activo cambiado a ${i}/${a?.name??n} - modelo restaurado: ${o}`:`Perfil activo cambiado a ${i}/${a?.name??n}`)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo activar el perfil: ${o}`)}})()},[r,l,e,n,i,t]),null}export async function call(r,o,i){const n=i?.trim();if(!n||"list"===n.toLowerCase())return r(function(){const e=A.map(e=>e.id).filter(w),r=[],o=P();r.push(o?`Perfil activo: ${o.provider}/${o.name} (${o.agentName})`:"Perfil activo: ninguno");for(const o of e){const e=C(o);if(r.push(""),r.push(`${getProviderLabel(o)}:`),0!==e.length)for(const i of e){const e=formatProfileLine(o,i.id);e&&r.push(e)}else r.push("- sin perfiles guardados")}return r.join("\n")}()),null;if("current"===n.toLowerCase())return r(function(){const e=P();return e?[`Proveedor: ${getProviderLabel(e.provider)}`,`Perfil: ${e.name}`,`AgentName: ${e.agentName}`,e.baseUrl?`Base URL: ${e.baseUrl}`:null,e.lastModel?`Ultimo modelo: ${e.lastModel}`:null].filter(Boolean).join("\n"):"No hay perfil activo."}()),null;if(function(e){if(!e)return!1;const r=e.trim().toLowerCase();return"migrate"===r||"migrar"===r||"finalize-migration"===r||"finalizar-migracion"===r}(n))return r(function(){const e=U();try{u()}catch{p()}"sqlite"===e.name&&e.read();const r=["Migracion revisada.",`Persistencia providers: ${getProviderStorageModeLabel()}`,`Provider DB: ${d()}`,`Credenciales providers: ${"sqlite"===e.name?"SQLite (cifrado local)":e.name}`];return"sqlite"===e.name&&(r.push(`Credenciales DB: ${k()}`),r.push(`Clave cifrado: ${K()}`),r.push("Estado cifrado credenciales: "+(R()?"Cifrado activo":"Sin payload o pendiente")),r.push("Legacy credentials file: "+(Q()?`Presente (${q()})`:"No presente"))),r.join("\n")}()),null;const l=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("create"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(l){const e=N(l.provider,l.profileName);if(e)return r(`Ya existe el perfil ${e.provider}/${e.name}.`),null;const o=$({provider:l.provider,name:l.profileName});return reconcileActiveProviderProfileState(),r(`Perfil creado: ${o.provider}/${o.name}`),null}const t=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("use"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);return o&&w(o)?{provider:o,profileName:r.slice(2).join(" ").trim()||void 0}:null}(n);if(t)return e(SwitchProfileOnMount,{onDone:r,context:o,provider:t.provider,profileName:t.profileName});const a=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("rename"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,currentName:i,nextName:n}:null}(n);if(a){if(!N(a.provider,a.currentName))return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;try{const e=y(a.provider,a.currentName,a.nextName);if(!e)return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;await z(e.previousId,e.profile.id),await D(),o.onChangeAPIKey(),r(`Perfil renombrado: ${a.provider}/${a.currentName} -> ${e.profile.name}`)}catch(e){r(`No se pudo renombrar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}const s=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("remove"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(s){if(!N(s.provider,s.profileName))return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;try{const e=j(s.provider,s.profileName);if(!e)return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;await I(e.id),reconcileActiveProviderProfileState(),await D(),o.onChangeAPIKey(),r(`Perfil eliminado: ${e.provider}/${e.name}`)}catch(e){r(`No se pudo eliminar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}if(function(e){if(!e)return!1;const r=e.trim().split(/\s+/).filter(Boolean),o=r[0]?.toLowerCase(),i=r[1]?.toLowerCase();return"remove"===o&&"all"===i&&2===r.length||"clear-all"===o&&1===r.length||"clear"===o&&1===r.length||"clear"===o&&"all"===i&&2===r.length}(n))return e(RemoveAllProfilesConfirmation,{onDone:r,context:o});const f=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("model"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,model:["clear","default","reset","none"].includes(n.toLowerCase())?null:n}:null}(n);if(f){if(!N(f.provider,f.profileName))return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;const e=await async function(e,r){if(!r||"claude"===e)return{valid:!0};const o=await M(e);if(0===o.length)return{valid:!0,warning:`No se pudo validar el catálogo de ${getProviderLabel(e)}. El modelo se guardó sin validación remota.`};const i=r.toLowerCase();return o.some(e=>e.value.toLowerCase()===i||e.label.toLowerCase()===i)?{valid:!0}:{valid:!1,error:`El modelo '${r}' no pertenece al catálogo actual de ${getProviderLabel(e)}.`}}(f.provider,f.model);if(!e.valid)return r(e.error),null;const i=x(f.provider,f.profileName,f.model);if(!i)return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;const n=P();return n?.id===i.id&&c()===i.provider&&(await D(),o.onChangeAPIKey()),r(f.model?`${e.warning?`${e.warning} `:""}Modelo guardado para ${i.provider}/${i.name}: ${f.model}`:`Modelo limpiado para ${i.provider}/${i.name}`),null}const m=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("agent"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,agentName:n}:null}(n);if(m){if(!N(m.provider,m.profileName))return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;try{const e=b(m.provider,m.profileName,m.agentName);if(!e)return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;r(`AgentName guardado para ${e.provider}/${e.name}: ${e.agentName}`)}catch(e){r(`No se pudo guardar el agentName: ${e instanceof Error?e.message:String(e)}`)}return null}return r("Uso: /perfil, /perfil list, /perfil current, /perfil migrate, /perfil create <proveedor> <perfil>, /perfil use <proveedor> [perfil], /perfil rename <proveedor> <actual> <nuevo>, /perfil remove <proveedor> <perfil>, /perfil remove all, /perfil clear, /perfil clear all, /perfil model <proveedor> <perfil> <modelo|clear>, /perfil agent <proveedor> <perfil> <agentName>"),null}
1
+ import{jsx as e,jsxs as r}from"react/jsx-runtime";import*as o from"react";import{Box as i,Text as n,useInput as l}from"../../ink.js";import{Dialog as t}from"../../components/design-system/Dialog.js";import{useMainLoopModel as a}from"../../hooks/useMainLoopModel.js";import{useSetAppState as s}from"../../state/AppState.js";import{getAPIProvider as c}from"../../utils/model/providers.js";import{finalizeProviderProfilesMigration as u,getProviderProfilesDbPath as d,getProviderProfilesStorageBackend as f,getProviderProfilesStorageMode as m,purgeLegacyProviderStateInConfig as p,setStoredActiveProviderPreference as v}from"../../utils/model/providerProfilesDb.js";import{clearAllProviderProfiles as g,createProviderProfile as $,findProviderProfileByName as N,getActiveProviderProfile as P,getLastUsedProviderProfile as h,getProviderProfile as L,isProfiledProvider as w,listProviderProfiles as C,removeProviderProfile as j,renameProviderProfile as y,setActiveProviderProfile as S,setProviderProfileAgentNameByName as b,setProviderProfileLastModelByName as x}from"../../utils/model/providerProfiles.js";import{fetchProviderModels as M}from"../../utils/model/providerModels.js";import{VISIBLE_PROVIDERS as A}from"../../utils/model/providerCatalog.js";import{switchProviderPreference as E}from"../../utils/model/providerSwitch.js";import{removeAllProviderScopedCredentials as B,removeProviderScopedCredentials as I,renameProviderScopedCredentials as z}from"../../utils/auth.js";import{clearAuthRelatedCaches as D}from"../logout/logout.js";import{getSecureStorage as U}from"../../utils/secureStorage/index.js";import{getLegacyCredentialsFilePath as q,getSecureStorageDbPath as k,getSecureStorageKeyPath as K,hasLegacyCredentialsFile as Q,isSecureStorageEncrypted as R}from"../../utils/secureStorage/sqliteStorage.js";function normalizeProviderInput(e){if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"lm-studio":case"lm_studio":case"lmstudio":return"lmstudio";case"gemini":case"gemini-api-key":case"google-ai":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}function getProviderLabel(e){return A.find(r=>r.id===e)?.label??e}function formatProfileLine(e,r){const o=L(r);if(!o)return null;const i=P(),n=h(e),l=[i?.id===o.id?"active":null,n?.id===o.id?"last":null].filter(Boolean),t=l.length>0?` [${l.join(", ")}]`:"",a=[`agent=${o.agentName}`,o.baseUrl?`url=${o.baseUrl}`:null,o.lastModel?`model=${o.lastModel}`:null].filter(Boolean).join(" | ");return`- ${o.provider}/${o.name}${t}${a?` -> ${a}`:""}`}function getProviderStorageModeLabel(){const e=f(),r=m();return"sqlite"!==e?"Legacy fallback":"sqlite-only"===r?"SQLite-only":"SQLite (migracion pendiente)"}function reconcileActiveProviderProfileState(){const e=P();if(e)return void v(e.provider);const r=C()[0];r?(S(r.id),v(r.provider)):v(null)}function RemoveAllProfilesConfirmation({onDone:a,context:s}){const[c,u]=o.useState(!1);return l((e,r)=>{if(!c)return"y"===e||"Y"===e?(u(!0),void async function(e,r){try{const o=g();reconcileActiveProviderProfileState(),await B(),await D(),r.onChangeAPIKey(),e(o.length>0?`Se eliminaron todos los perfiles guardados (${o.length}).`:"No habia perfiles guardados para eliminar.")}catch(r){e(`No se pudieron eliminar todos los perfiles: ${r instanceof Error?r.message:String(r)}`)}}(a,s)):void(("n"===e||"N"===e||r.escape)&&a("Eliminacion de perfiles cancelada."))},{isActive:!0}),e(t,{title:"Eliminar todos los perfiles",subtitle:"Esta accion elimina todos los perfiles guardados y sus credenciales asociadas por perfil.",onCancel:()=>{c||a("Eliminacion de perfiles cancelada.")},color:"error",inputGuide:()=>e(n,{children:"y: confirmar eliminacion total · n/Esc: cancelar"}),children:r(i,{flexDirection:"column",children:[e(n,{children:"Se borraran todos los perfiles persistidos de proveedores."}),e(n,{dimColor:!0,children:"Los fallbacks legacy de compatibilidad no se eliminan con este comando."}),c?e(n,{children:"Eliminando perfiles..."}):null]})})}function SwitchProfileOnMount({onDone:e,context:r,provider:i,profileName:n}){const l=a(),t=s();return o.useEffect(()=>{(async()=>{try{const o=E({currentModel:l,currentProvider:c(),targetProvider:i,targetProfileName:n});await D(),r.onChangeAPIKey(),t(e=>({...e,mainLoopModel:o,mainLoopModelForSession:null}));const a=h(i);e(o?`Perfil activo cambiado a ${i}/${a?.name??n} - modelo restaurado: ${o}`:`Perfil activo cambiado a ${i}/${a?.name??n}`)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo activar el perfil: ${o}`)}})()},[r,l,e,n,i,t]),null}export async function call(r,o,i){const n=i?.trim();if(!n||"list"===n.toLowerCase())return r(function(){const e=A.map(e=>e.id).filter(w),r=[],o=P();r.push(o?`Perfil activo: ${o.provider}/${o.name} (${o.agentName})`:"Perfil activo: ninguno");for(const o of e){const e=C(o);if(r.push(""),r.push(`${getProviderLabel(o)}:`),0!==e.length)for(const i of e){const e=formatProfileLine(o,i.id);e&&r.push(e)}else r.push("- sin perfiles guardados")}return r.join("\n")}()),null;if("current"===n.toLowerCase())return r(function(){const e=P();return e?[`Proveedor: ${getProviderLabel(e.provider)}`,`Perfil: ${e.name}`,`AgentName: ${e.agentName}`,e.baseUrl?`Base URL: ${e.baseUrl}`:null,e.lastModel?`Ultimo modelo: ${e.lastModel}`:null].filter(Boolean).join("\n"):"No hay perfil activo."}()),null;if(function(e){if(!e)return!1;const r=e.trim().toLowerCase();return"migrate"===r||"migrar"===r||"finalize-migration"===r||"finalizar-migracion"===r}(n))return r(function(){const e=U();try{u()}catch{p()}"sqlite"===e.name&&e.read();const r=["Migracion revisada.",`Persistencia providers: ${getProviderStorageModeLabel()}`,`Provider DB: ${d()}`,`Credenciales providers: ${"sqlite"===e.name?"SQLite (cifrado local)":e.name}`];return"sqlite"===e.name&&(r.push(`Credenciales DB: ${k()}`),r.push(`Clave cifrado: ${K()}`),r.push("Estado cifrado credenciales: "+(R()?"Cifrado activo":"Sin payload o pendiente")),r.push("Legacy credentials file: "+(Q()?`Presente (${q()})`:"No presente"))),r.join("\n")}()),null;const l=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("create"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(l){const e=N(l.provider,l.profileName);if(e)return r(`Ya existe el perfil ${e.provider}/${e.name}.`),null;const o=$({provider:l.provider,name:l.profileName});return reconcileActiveProviderProfileState(),r(`Perfil creado: ${o.provider}/${o.name}`),null}const t=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("use"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);return o&&w(o)?{provider:o,profileName:r.slice(2).join(" ").trim()||void 0}:null}(n);if(t)return e(SwitchProfileOnMount,{onDone:r,context:o,provider:t.provider,profileName:t.profileName});const a=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("rename"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,currentName:i,nextName:n}:null}(n);if(a){if(!N(a.provider,a.currentName))return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;try{const e=y(a.provider,a.currentName,a.nextName);if(!e)return r(`No existe el perfil ${a.provider}/${a.currentName}.`),null;await z(e.previousId,e.profile.id),await D(),o.onChangeAPIKey(),r(`Perfil renombrado: ${a.provider}/${a.currentName} -> ${e.profile.name}`)}catch(e){r(`No se pudo renombrar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}const s=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("remove"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r.slice(2).join(" ").trim();return i?{provider:o,profileName:i}:null}(n);if(s){if(!N(s.provider,s.profileName))return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;try{const e=j(s.provider,s.profileName);if(!e)return r(`No existe el perfil ${s.provider}/${s.profileName}.`),null;await I(e.id),reconcileActiveProviderProfileState(),await D(),o.onChangeAPIKey(),r(`Perfil eliminado: ${e.provider}/${e.name}`)}catch(e){r(`No se pudo eliminar el perfil: ${e instanceof Error?e.message:String(e)}`)}return null}if(function(e){if(!e)return!1;const r=e.trim().split(/\s+/).filter(Boolean),o=r[0]?.toLowerCase(),i=r[1]?.toLowerCase();return"remove"===o&&"all"===i&&2===r.length||"clear-all"===o&&1===r.length||"clear"===o&&1===r.length||"clear"===o&&"all"===i&&2===r.length}(n))return e(RemoveAllProfilesConfirmation,{onDone:r,context:o});const f=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("model"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,model:["clear","default","reset","none"].includes(n.toLowerCase())?null:n}:null}(n);if(f){if(!N(f.provider,f.profileName))return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;const e=await async function(e,r){if(!r||"claude"===e)return{valid:!0};const o=await M(e);if(0===o.length)return{valid:!0,warning:`No se pudo validar el catálogo de ${getProviderLabel(e)}. El modelo se guardó sin validación remota.`};const i=r.toLowerCase();return o.some(e=>e.value.toLowerCase()===i||e.label.toLowerCase()===i)?{valid:!0}:{valid:!1,error:`El modelo '${r}' no pertenece al catálogo actual de ${getProviderLabel(e)}.`}}(f.provider,f.model);if(!e.valid)return r(e.error),null;const i=x(f.provider,f.profileName,f.model);if(!i)return r(`No existe el perfil ${f.provider}/${f.profileName}.`),null;const n=P();return n?.id===i.id&&c()===i.provider&&(await D(),o.onChangeAPIKey()),r(f.model?`${e.warning?`${e.warning} `:""}Modelo guardado para ${i.provider}/${i.name}: ${f.model}`:`Modelo limpiado para ${i.provider}/${i.name}`),null}const m=function(e){if(!e)return null;const r=e.trim().split(/\s+/).filter(Boolean);if("agent"!==r[0]?.toLowerCase())return null;const o=normalizeProviderInput(r[1]);if(!o||!w(o))return null;const i=r[2]?.trim(),n=r.slice(3).join(" ").trim();return i&&n?{provider:o,profileName:i,agentName:n}:null}(n);if(m){if(!N(m.provider,m.profileName))return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;try{const e=b(m.provider,m.profileName,m.agentName);if(!e)return r(`No existe el perfil ${m.provider}/${m.profileName}.`),null;r(`AgentName guardado para ${e.provider}/${e.name}: ${e.agentName}`)}catch(e){r(`No se pudo guardar el agentName: ${e instanceof Error?e.message:String(e)}`)}return null}return r("Uso: /perfil, /perfil list, /perfil current, /perfil migrate, /perfil create <proveedor> <perfil>, /perfil use <proveedor> [perfil], /perfil rename <proveedor> <actual> <nuevo>, /perfil remove <proveedor> <perfil>, /perfil remove all, /perfil clear, /perfil clear all, /perfil model <proveedor> <perfil> <modelo|clear>, /perfil agent <proveedor> <perfil> <agentName>"),null}
@@ -1 +1 @@
1
- export default{type:"local-jsx",name:"provider",aliases:["proveedor","proveedores"],description:"Cambiar entre proveedores y configurar endpoints sin cerrar sesion",argumentHint:"[list|current|clear all|claude|openai|openrouter|ollama|ollama-cloud|gemini-api|gemini-google|zai|minimax|nvidia|deepseek|custom-openai|custom-anthropic] [baseURL|clear]",isEnabled:()=>!0,load:()=>import("./provider.js")};
1
+ export default{type:"local-jsx",name:"provider",aliases:["proveedor","proveedores"],description:"Cambiar entre proveedores y configurar endpoints sin cerrar sesion",argumentHint:"[list|current|clear all|claude|openai|openrouter|ollama|ollama-cloud|lmstudio|gemini-api|gemini-google|zai|minimax|nvidia|deepseek|custom-openai|custom-anthropic] [baseURL|clear]",isEnabled:()=>!0,load:()=>import("./provider.js")};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as r}from"react/jsx-runtime";import{Select as o}from"../../components/CustomSelect/select.js";import*as a from"react";import{Box as i,Text as n,useInput as t}from"../../ink.js";import{Dialog as l}from"../../components/design-system/Dialog.js";import{useMainLoopModel as s}from"../../hooks/useMainLoopModel.js";import{useSetAppState as d}from"../../state/AppState.js";import{getStoredActiveProviderPreference as c,setStoredActiveProviderPreference as u}from"../../utils/model/providerProfilesDb.js";import{getCoreCurrentProviderProfile as p,getCoreProviderLabel as m,isCoreProviderEnabled as g,isCoreSelectedProfileReady as f,listCoreProviderProfiles as v,normalizeCoreProviderInput as b,setCoreActiveProfile as P,switchCoreProvider as h}from"../../core/providers/providerCore.js";import{getAPIProvider as y,isGeminiApiProviderConfigured as $,isGeminiGoogleProviderConfigured as C,isNvidiaProviderConfigured as U,isOllamaCloudProviderConfigured as L,isMiniMaxProviderConfigured as w,isOpenAIProviderConfigured as A,isOpenRouterProviderConfigured as I,isZAIProviderConfigured as E}from"../../utils/model/providers.js";import{clearProviderBaseUrl as k,getConfiguredProviderBaseUrl as x,getDefaultProviderBaseUrl as S,isProviderBaseUrlCustomized as M,setProviderBaseUrl as R}from"../../utils/model/providerBaseUrls.js";import{getVisibleProvider as j,VISIBLE_PROVIDERS as N}from"../../utils/model/providerCatalog.js";import{clearAllProviderProfiles as O,getActiveProviderProfile as D,getLastUsedProviderProfile as z,isProfiledProvider as B,listProviderProfiles as G,setActiveProfileForProvider as q,setActiveProviderProfile as T}from"../../utils/model/providerProfiles.js";import{switchProviderPreference as V}from"../../utils/model/providerSwitch.js";import{clearAuthRelatedCaches as W}from"../logout/logout.js";import{call as F}from"../login/login.js";import{call as K}from"../login-openai/login-openai.js";import Y from"chalk";import{getStoredProviderOAuthTokens as Z,hasStoredProviderApiKey as _,hasStoredProviderOAuthTokens as H,removeAllProviderScopedCredentials as J}from"../../utils/auth.js";const Q=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","custom-openai","custom-anthropic"];function isConfigurableBaseUrlProvider(e){return Q.includes(e)}function isProviderConfigured(e){return"claude"===e?H("claude"):"openai"===e?A():"openrouter"===e?I():"gemini-api"===e?$():"gemini-google"===e?C():"ollama"===e||("ollama-cloud"===e?L():"zai"===e?E():"minimax"===e?w():"nvidia"===e?U():_(e))}function getProviderLabel(e){return g()?m(e):j(e).label}function getCurrentProviderBaseUrl(e){return M(e)?x(e):S(e)}function getProviderSetupMessage(e){const r=getCurrentProviderBaseUrl(e);switch(e){case"ollama":return`Ollama usa un servidor local compatible. Endpoint actual: ${r}. Puedes cambiarlo con /provider ollama <baseURL> o restaurar el default con /provider ollama clear.`;case"ollama-cloud":return`Ollama Cloud usa por defecto tu host local autenticado. Endpoint actual: ${r}. Ejecuta 'ollama signin' y luego usa /provider ollama-cloud.`;case"gemini-api":return`Gemini API requiere una API key de Google AI Studio. Endpoint actual: ${r}. Usa /login para guardarla o /provider gemini-api <baseURL> para cambiar el endpoint.`;case"gemini-google":return`Gemini Google usa OAuth compatible con Gemini CLI. Endpoint actual: ${r}. Usa /login y elige Gemini Google para abrir el navegador y guardar el token.`;case"zai":return"Z.AI requiere una API key. Usa /login para guardarla y /provider zai <baseURL> para cambiar el endpoint si hace falta.";case"minimax":return"MiniMax requiere una API key. Usa /login para guardarla. El endpoint por defecto es Anthropic-compatible (https://api.minimax.io/anthropic) y puedes cambiarlo con /provider minimax <baseURL>.";case"nvidia":return"NVIDIA requiere una API key. Usa /login para guardarla. El endpoint por defecto es https://integrate.api.nvidia.com/v1 y puedes cambiarlo con /provider nvidia <baseURL>.";case"deepseek":return`DeepSeek requiere una API key. Usa /login para guardarla. Endpoint actual: ${r}. Puedes cambiarlo con /provider deepseek <baseURL>.`;case"custom-openai":return`Custom OpenAI usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-openai <baseURL> para cambiar solo el endpoint.`;case"custom-anthropic":return`Custom Anthropic usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-anthropic <baseURL> para cambiar solo el endpoint.`;default:if(["xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(e)){return`${getProviderLabel(e)} requiere una API key. Usa /login para guardarla y /provider ${e} <baseURL> para cambiar el endpoint si hace falta.`}return"OpenRouter requiere una API key. Usa /login para guardarla y /provider openrouter <baseURL> para cambiar el endpoint si hace falta."}}function isUrlLike(e){const r=e.toLowerCase();return!(!r.startsWith("http://")&&!r.startsWith("https://"))||(!!r.startsWith("localhost")||(/\.[a-z]{2,}/i.test(r)||/:\d+/.test(r)||/^(\d{1,3}\.){3}\d{1,3}/.test(r)))}async function switchProvider(e){const r=g()?h({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName}).restoredModel:V({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName});await W(),e.context.onChangeAPIKey();const o=B(e.target)&&z(e.target)?` · perfil ${z(e.target).name}`:"";return{message:r?`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - modelo restaurado: ${r}`:`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - cargando modelo predeterminado`,restoredModel:r}}function isSelectedProfileReady(e,r){if(g())return f(e,r);if(!r||!B(e))return!0;const o=z(e);return!!o&&("claude"===e?H("claude",o.id):"openai"===e?H("openai",o.id):"gemini-google"===e?C():"ollama"===e||"ollama-cloud"===e||_(e,o.id))}function RemoveAllProvidersConfirmation({onDone:o,context:s}){const[d,c]=a.useState(!1);return t((e,r)=>{if(!d)return"y"===e||"Y"===e?(c(!0),void async function(e,r){try{const o=O(),a=D();if(a)u(a.provider);else{const e=G()[0];e?(T(e.id),u(e.provider)):u(null)}await J(),await W(),r.onChangeAPIKey(),e(o.length>0?`Se eliminaron correctamente todos los perfiles (${o.length}) y credenciales de los proveedores de IA.`:"Se eliminaron correctamente todas las credenciales de proveedores. No habia perfiles guardados.")}catch(r){e(`No se pudieron eliminar las credenciales y perfiles de proveedores: ${r instanceof Error?r.message:String(r)}`)}}(o,s)):void(("n"===e||"N"===e||r.escape)&&o("Eliminacion de proveedores y credenciales cancelada."))},{isActive:!0}),e(l,{title:"Eliminar todos los proveedores y perfiles",subtitle:"Esta accion elimina todos los perfiles guardados, sus credenciales asociadas y limpia todas las API keys persistidas.",onCancel:()=>{d||o("Eliminacion de proveedores y credenciales cancelada.")},color:"error",inputGuide:()=>e(n,{children:"y: confirmar eliminacion total · n/Esc: cancelar"}),children:r(i,{flexDirection:"column",children:[e(n,{children:"Se borraran todas las credenciales (API keys / OAuth) y perfiles persistidos de todos los proveedores."}),e(n,{dimColor:!0,children:"Esta accion es irreversible y te desconectara de todos los servicios de IA."}),d?e(n,{children:"Eliminando configuraciones..."}):null]})})}export async function call(r,o,a){const i=a?.trim(),n=i?.split(/\s+/).filter(Boolean)??[],t=n[0]?.toLowerCase(),l=n[1]?.toLowerCase();if("clear"===t&&"all"===l&&2===n.length||"clear-all"===t&&1===n.length||"clear"===t&&1===n.length||"remove"===t&&"all"===l&&2===n.length)return e(RemoveAllProvidersConfirmation,{onDone:r,context:o});if("list"===t){const e=g(),o=e?v():null,a=e?Object.values(o.providers).flat():G(),i=e?o.activeProfile:D(),n=e?o.providers:a.reduce((e,r)=>(e[r.provider]||(e[r.provider]=[]),e[r.provider].push(r),e),{});let t="\n"+Y.cyan.bold(" +----------------------------------------------------------+")+"\n";t+=Y.cyan.bold(" | ")+Y.white.bold("GESTIÓN DE PROVEEDORES Y CUENTAS")+Y.cyan.bold(" |")+"\n",t+=Y.cyan.bold(" +----------------------------------------------------------+")+"\n";const l=N.filter(e=>e.implemented);for(const e of l){const r=e.id,o=n[r]??[];if(t+=`\n ${Y.magenta.bold("♦")}${Y.bgMagenta.white.bold(" "+e.label.toUpperCase()+" ")}${Y.magenta.bold("♦")} ${Y.dim("("+r+")")}\n`,0===o.length){const e=isProviderConfigured(r)?Y.green("● Configurado (sin perfil creado)"):Y.yellow("○ Sin perfiles");t+=` ${Y.dim("•")} ${Y.white("sin perfiles".padEnd(15))} ${e}\n`;continue}for(const e of o){const r=e.id===i?.id;let o=!1;o="claude"===e.provider||"openai"===e.provider?!!Z(e.provider,e.id):"ollama"===e.provider||"ollama-cloud"===e.provider||_(e.provider,e.id);t+=` ${r?Y.cyan("●"):Y.dim("○")} ${r?Y.cyan.bold(e.name.padEnd(15)):Y.white(e.name.padEnd(15))} ${o?Y.green("● Conectado"):Y.red("○ Desconectado")} ${r?Y.bgCyan.black(" ACTUAL "):""}\n`,e.baseUrl&&(t+=` ${Y.dim("+-")} ${Y.blue("→")} ${Y.dim(e.baseUrl)}\n`)}}return t+="\n"+Y.cyan.bold(" ► Guía rápida:")+"\n",t+=` ${Y.dim("•")} Cambiar perfil: ${Y.yellow("/provider [id] perfil [nombre]")}\n`,t+=` ${Y.dim("•")} Nueva cuenta: ${Y.yellow("/login --profile [nombre]")}\n`,t+=` ${Y.dim("•")} Ver actual: ${Y.yellow("/provider current")}\n`,t+=` ${Y.dim("•")} Limpiar todo: ${Y.yellow("/provider clear all")}\n`,r(t),null}if("current"===t){const e=g()?p().activeProfile:D();if(!e)return r(Y.yellow("No hay un perfil de proveedor activo configurado.")),null;const o=j(e.provider);let a=`\n${Y.cyan.bold("Perfil actual:")}\n`;return a+=`${Y.white("Proveedor:")} ${Y.magenta(o.label)}\n`,a+=`${Y.white("Nombre:")} ${Y.cyan(e.name)}\n`,e.baseUrl&&(a+=`${Y.white("Endpoint:")} ${Y.blue(e.baseUrl)}\n`),r(a),null}const s=function(e){if(g())return b(e);if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":case"google-ai-studio":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(t);if(s){if(!N.find(e=>e.id===s))return r(`Proveedor no reconocido: ${s}. Opciones: ${N.map(e=>e.id).join(", ")}`),null;const a=function(e,r){if(!r||!B(e))return null;const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return null;if("profile"===o[1]?.toLowerCase()||"perfil"===o[1]?.toLowerCase())return o.slice(2).join(" ").trim()||null;const a=o[1];return["set","set-url","base-url","baseurl","url","endpoint","clear","reset","default","restore"].includes(a.toLowerCase())||isUrlLike(a)?null:a}(s,i);if(a&&B(s)&&(g()?P(s,a):q(s,a)),!("claude"!==s||H("claude")&&isSelectedProfileReady(s,a)))return F(r,o);if(!("openai"!==s||A()&&isSelectedProfileReady(s,a)))return K(r,o);const n=function(e,r){if(!r||!isConfigurableBaseUrlProvider(e))return{};const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return{};if("profile"===o[1]?.toLowerCase()||"perfil"===o[1]?.toLowerCase())return{};const a=o[1]?.toLowerCase(),i=["set","set-url","base-url","baseurl","url","endpoint"].includes(a),n=(i?o.slice(2):o.slice(1)).join(" ").trim();return n?["clear","reset","default","restore"].includes(n.toLowerCase())?{clear:!0}:i||isUrlLike(n)?{baseUrl:n}:{}:{}}(s,i);let t=null;if(n.clear&&isConfigurableBaseUrlProvider(s))k(s),t=`Base URL de ${getProviderLabel(s)} restaurada a ${getCurrentProviderBaseUrl(s)}`;else if(n.baseUrl&&isConfigurableBaseUrlProvider(s))try{const e=R(s,n.baseUrl);t=`Base URL de ${getProviderLabel(s)} guardada: ${e}`}catch(e){return r(e instanceof Error?e.message:`No se pudo guardar la base URL para ${getProviderLabel(s)}.`),null}return isProviderConfigured(s)&&isSelectedProfileReady(s,a)?e(SwitchProviderOnMount,{onDone:r,context:o,target:s,baseUrlMessage:t,targetProfileName:a}):(r(function(e,r){if("claude"===e)return"Redirigiendo a inicio de sesion de Claude...";if("openai"===e)return"Redirigiendo a inicio de sesion de OpenAI...";const o=isConfigurableBaseUrlProvider(e)?getProviderSetupMessage(e):null;return r&&o?`${r} - ${o}`:r??o??`Proveedor preparado: ${getProviderLabel(e)}`}(s,t)),null)}return e(ProviderPicker,{onDone:r,context:o})}function SwitchProviderOnMount({onDone:e,context:r,target:o,baseUrlMessage:i,targetProfileName:n}){const t=s(),l=d();return a.useEffect(()=>{(async()=>{try{const a=await switchProvider({context:r,currentModel:t,currentProvider:y(),target:o,targetProfileName:n});l(e=>({...e,mainLoopModel:a.restoredModel,mainLoopModelForSession:null})),e(i?`${i} - ${a.message}`:a.message)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo cambiar de proveedor: ${o}`)}})()},[i,r,t,e,l,o,n]),null}function ProviderPicker({onDone:a,context:t}){const l=s(),u=d(),p=y(),m=c(),g=N.filter(e=>e.implemented).map(e=>{const r="claude"===e.id&&"firstParty"===p||e.id===p,o=isProviderConfigured(e.id),a=r?" [active]":o?" [ready]":" [setup]";return{label:`${e.label}${a}`,value:e.id}});const f=m??("firstParty"===p?"claude":p);return r(i,{flexDirection:"column",gap:1,children:[e(n,{bold:!0,color:"cyan",children:"Selecciona el proveedor de IA para Context Code:"}),e(n,{dimColor:!0,children:"Puedes usar la API oficial de Claude, OpenAI o proveedores compatibles con OpenAI."}),e(o,{options:g,defaultValue:f,onChange:async function(e){try{const r=e;if("claude"===r&&!H("claude"))return void a("No hay sesión de Claude. Lanzando /login...",{nextInput:"/login",submitNextInput:!0});if("openai"===r&&!A())return void a("No hay sesión de OpenAI. Lanzando /login-openai...",{nextInput:"/login-openai",submitNextInput:!0});if(!isProviderConfigured(r))return void a(getProviderSetupMessage(r));const o=await switchProvider({context:t,currentModel:l,currentProvider:p,target:r});u(e=>({...e,mainLoopModel:o.restoredModel,mainLoopModelForSession:null})),a(o.message)}catch(e){const r=e instanceof Error?e.message:String(e);a(`No se pudo cambiar de proveedor: ${r}`)}}}),r(i,{marginTop:1,flexDirection:"column",children:[r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/login"})," para configurar las API keys."]}),r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/provider openrouter https://..."})," para guardar una base URL personalizada."]}),r(n,{dimColor:!0,children:["- ",e(n,{bold:!0,children:"Ollama"})," usa ",getCurrentProviderBaseUrl("ollama")," por defecto."]})]})]})}
1
+ import{jsx as e,jsxs as r}from"react/jsx-runtime";import{Select as o}from"../../components/CustomSelect/select.js";import*as a from"react";import{Box as i,Text as n,useInput as t}from"../../ink.js";import{Dialog as l}from"../../components/design-system/Dialog.js";import{useMainLoopModel as s}from"../../hooks/useMainLoopModel.js";import{useSetAppState as d}from"../../state/AppState.js";import{getStoredActiveProviderPreference as c,setStoredActiveProviderPreference as u}from"../../utils/model/providerProfilesDb.js";import{getCoreCurrentProviderProfile as p,getCoreProviderLabel as m,isCoreProviderEnabled as g,isCoreSelectedProfileReady as f,listCoreProviderProfiles as v,normalizeCoreProviderInput as b,setCoreActiveProfile as P,switchCoreProvider as h}from"../../core/providers/providerCore.js";import{getAPIProvider as y,isGeminiApiProviderConfigured as $,isGeminiGoogleProviderConfigured as C,isNvidiaProviderConfigured as U,isOllamaCloudProviderConfigured as L,isMiniMaxProviderConfigured as w,isOpenAIProviderConfigured as A,isOpenRouterProviderConfigured as I,isZAIProviderConfigured as E}from"../../utils/model/providers.js";import{clearProviderBaseUrl as k,getConfiguredProviderBaseUrl as x,getDefaultProviderBaseUrl as S,isProviderBaseUrlCustomized as M,setProviderBaseUrl as R}from"../../utils/model/providerBaseUrls.js";import{getVisibleProvider as j,VISIBLE_PROVIDERS as N}from"../../utils/model/providerCatalog.js";import{clearAllProviderProfiles as O,getActiveProviderProfile as D,getLastUsedProviderProfile as z,isProfiledProvider as B,listProviderProfiles as G,setActiveProfileForProvider as q,setActiveProviderProfile as T}from"../../utils/model/providerProfiles.js";import{switchProviderPreference as V}from"../../utils/model/providerSwitch.js";import{clearAuthRelatedCaches as W}from"../logout/logout.js";import{call as F}from"../login/login.js";import{call as K}from"../login-openai/login-openai.js";import Y from"chalk";import{getStoredProviderOAuthTokens as _,hasStoredProviderApiKey as Z,hasStoredProviderOAuthTokens as H,removeAllProviderScopedCredentials as J}from"../../utils/auth.js";const Q=["openrouter","ollama","ollama-cloud","lmstudio","gemini-api","gemini-google","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","custom-openai","custom-anthropic"];function isConfigurableBaseUrlProvider(e){return Q.includes(e)}function isProviderConfigured(e){return"claude"===e?H("claude"):"openai"===e?A():"openrouter"===e?I():"gemini-api"===e?$():"gemini-google"===e?C():"ollama"===e||("ollama-cloud"===e?L():"zai"===e?E():"minimax"===e?w():"nvidia"===e?U():Z(e))}function getProviderLabel(e){return g()?m(e):j(e).label}function getCurrentProviderBaseUrl(e){return M(e)?x(e):S(e)}function getProviderSetupMessage(e){const r=getCurrentProviderBaseUrl(e);switch(e){case"ollama":return`Ollama usa un servidor local compatible. Endpoint actual: ${r}. Puedes cambiarlo con /provider ollama <baseURL> o restaurar el default con /provider ollama clear.`;case"ollama-cloud":return`Ollama Cloud usa por defecto tu host local autenticado. Endpoint actual: ${r}. Ejecuta 'ollama signin' y luego usa /provider ollama-cloud.`;case"gemini-api":return`Gemini API requiere una API key de Google AI Studio. Endpoint actual: ${r}. Usa /login para guardarla o /provider gemini-api <baseURL> para cambiar el endpoint.`;case"gemini-google":return`Gemini Google usa OAuth compatible con Gemini CLI. Endpoint actual: ${r}. Usa /login y elige Gemini Google para abrir el navegador y guardar el token.`;case"zai":return"Z.AI requiere una API key. Usa /login para guardarla y /provider zai <baseURL> para cambiar el endpoint si hace falta.";case"minimax":return"MiniMax requiere una API key. Usa /login para guardarla. El endpoint por defecto es Anthropic-compatible (https://api.minimax.io/anthropic) y puedes cambiarlo con /provider minimax <baseURL>.";case"nvidia":return"NVIDIA requiere una API key. Usa /login para guardarla. El endpoint por defecto es https://integrate.api.nvidia.com/v1 y puedes cambiarlo con /provider nvidia <baseURL>.";case"deepseek":return`DeepSeek requiere una API key. Usa /login para guardarla. Endpoint actual: ${r}. Puedes cambiarlo con /provider deepseek <baseURL>.`;case"custom-openai":return`Custom OpenAI usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-openai <baseURL> para cambiar solo el endpoint.`;case"custom-anthropic":return`Custom Anthropic usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-anthropic <baseURL> para cambiar solo el endpoint.`;default:if(["xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(e)){return`${getProviderLabel(e)} requiere una API key. Usa /login para guardarla y /provider ${e} <baseURL> para cambiar el endpoint si hace falta.`}return"OpenRouter requiere una API key. Usa /login para guardarla y /provider openrouter <baseURL> para cambiar el endpoint si hace falta."}}function isUrlLike(e){const r=e.toLowerCase();return!(!r.startsWith("http://")&&!r.startsWith("https://"))||(!!r.startsWith("localhost")||(/\.[a-z]{2,}/i.test(r)||/:\d+/.test(r)||/^(\d{1,3}\.){3}\d{1,3}/.test(r)))}async function switchProvider(e){const r=g()?h({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName}).restoredModel:V({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName});await W(),e.context.onChangeAPIKey();const o=B(e.target)&&z(e.target)?` · perfil ${z(e.target).name}`:"";return{message:r?`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - modelo restaurado: ${r}`:`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - cargando modelo predeterminado`,restoredModel:r}}function isSelectedProfileReady(e,r){if(g())return f(e,r);if(!r||!B(e))return!0;const o=z(e);return!!o&&("claude"===e?H("claude",o.id):"openai"===e?H("openai",o.id):"gemini-google"===e?C():"ollama"===e||"ollama-cloud"===e||Z(e,o.id))}function RemoveAllProvidersConfirmation({onDone:o,context:s}){const[d,c]=a.useState(!1);return t((e,r)=>{if(!d)return"y"===e||"Y"===e?(c(!0),void async function(e,r){try{const o=O(),a=D();if(a)u(a.provider);else{const e=G()[0];e?(T(e.id),u(e.provider)):u(null)}await J(),await W(),r.onChangeAPIKey(),e(o.length>0?`Se eliminaron correctamente todos los perfiles (${o.length}) y credenciales de los proveedores de IA.`:"Se eliminaron correctamente todas las credenciales de proveedores. No habia perfiles guardados.")}catch(r){e(`No se pudieron eliminar las credenciales y perfiles de proveedores: ${r instanceof Error?r.message:String(r)}`)}}(o,s)):void(("n"===e||"N"===e||r.escape)&&o("Eliminacion de proveedores y credenciales cancelada."))},{isActive:!0}),e(l,{title:"Eliminar todos los proveedores y perfiles",subtitle:"Esta accion elimina todos los perfiles guardados, sus credenciales asociadas y limpia todas las API keys persistidas.",onCancel:()=>{d||o("Eliminacion de proveedores y credenciales cancelada.")},color:"error",inputGuide:()=>e(n,{children:"y: confirmar eliminacion total · n/Esc: cancelar"}),children:r(i,{flexDirection:"column",children:[e(n,{children:"Se borraran todas las credenciales (API keys / OAuth) y perfiles persistidos de todos los proveedores."}),e(n,{dimColor:!0,children:"Esta accion es irreversible y te desconectara de todos los servicios de IA."}),d?e(n,{children:"Eliminando configuraciones..."}):null]})})}export async function call(r,o,a){const i=a?.trim(),n=i?.split(/\s+/).filter(Boolean)??[],t=n[0]?.toLowerCase(),l=n[1]?.toLowerCase();if("clear"===t&&"all"===l&&2===n.length||"clear-all"===t&&1===n.length||"clear"===t&&1===n.length||"remove"===t&&"all"===l&&2===n.length)return e(RemoveAllProvidersConfirmation,{onDone:r,context:o});if("list"===t){const e=g(),o=e?v():null,a=e?Object.values(o.providers).flat():G(),i=e?o.activeProfile:D(),n=e?o.providers:a.reduce((e,r)=>(e[r.provider]||(e[r.provider]=[]),e[r.provider].push(r),e),{});let t="\n"+Y.cyan.bold(" +----------------------------------------------------------+")+"\n";t+=Y.cyan.bold(" | ")+Y.white.bold("GESTIÓN DE PROVEEDORES Y CUENTAS")+Y.cyan.bold(" |")+"\n",t+=Y.cyan.bold(" +----------------------------------------------------------+")+"\n";const l=N.filter(e=>e.implemented);for(const e of l){const r=e.id,o=n[r]??[];if(t+=`\n ${Y.magenta.bold("♦")}${Y.bgMagenta.white.bold(" "+e.label.toUpperCase()+" ")}${Y.magenta.bold("♦")} ${Y.dim("("+r+")")}\n`,0===o.length){const e=isProviderConfigured(r)?Y.green("● Configurado (sin perfil creado)"):Y.yellow("○ Sin perfiles");t+=` ${Y.dim("•")} ${Y.white("sin perfiles".padEnd(15))} ${e}\n`;continue}for(const e of o){const r=e.id===i?.id;let o=!1;o="claude"===e.provider||"openai"===e.provider?!!_(e.provider,e.id):"ollama"===e.provider||"ollama-cloud"===e.provider||Z(e.provider,e.id);t+=` ${r?Y.cyan("●"):Y.dim("○")} ${r?Y.cyan.bold(e.name.padEnd(15)):Y.white(e.name.padEnd(15))} ${o?Y.green("● Conectado"):Y.red("○ Desconectado")} ${r?Y.bgCyan.black(" ACTUAL "):""}\n`,e.baseUrl&&(t+=` ${Y.dim("+-")} ${Y.blue("→")} ${Y.dim(e.baseUrl)}\n`)}}return t+="\n"+Y.cyan.bold(" ► Guía rápida:")+"\n",t+=` ${Y.dim("•")} Cambiar perfil: ${Y.yellow("/provider [id] perfil [nombre]")}\n`,t+=` ${Y.dim("•")} Nueva cuenta: ${Y.yellow("/login --profile [nombre]")}\n`,t+=` ${Y.dim("•")} Ver actual: ${Y.yellow("/provider current")}\n`,t+=` ${Y.dim("•")} Limpiar todo: ${Y.yellow("/provider clear all")}\n`,r(t),null}if("current"===t){const e=g()?p().activeProfile:D();if(!e)return r(Y.yellow("No hay un perfil de proveedor activo configurado.")),null;const o=j(e.provider);let a=`\n${Y.cyan.bold("Perfil actual:")}\n`;return a+=`${Y.white("Proveedor:")} ${Y.magenta(o.label)}\n`,a+=`${Y.white("Nombre:")} ${Y.cyan(e.name)}\n`,e.baseUrl&&(a+=`${Y.white("Endpoint:")} ${Y.blue(e.baseUrl)}\n`),r(a),null}const s=function(e){if(g())return b(e);if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"lm-studio":case"lm_studio":case"lmstudio":return"lmstudio";case"gemini":case"gemini-api-key":case"google-ai":case"google-ai-studio":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(t);if(s){if(!N.find(e=>e.id===s))return r(`Proveedor no reconocido: ${s}. Opciones: ${N.map(e=>e.id).join(", ")}`),null;const a=function(e,r){if(!r||!B(e))return null;const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return null;if("profile"===o[1]?.toLowerCase()||"perfil"===o[1]?.toLowerCase())return o.slice(2).join(" ").trim()||null;const a=o[1];return["set","set-url","base-url","baseurl","url","endpoint","clear","reset","default","restore"].includes(a.toLowerCase())||isUrlLike(a)?null:a}(s,i);if(a&&B(s)&&(g()?P(s,a):q(s,a)),!("claude"!==s||H("claude")&&isSelectedProfileReady(s,a)))return F(r,o);if(!("openai"!==s||A()&&isSelectedProfileReady(s,a)))return K(r,o);const n=function(e,r){if(!r||!isConfigurableBaseUrlProvider(e))return{};const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return{};if("profile"===o[1]?.toLowerCase()||"perfil"===o[1]?.toLowerCase())return{};const a=o[1]?.toLowerCase(),i=["set","set-url","base-url","baseurl","url","endpoint"].includes(a),n=(i?o.slice(2):o.slice(1)).join(" ").trim();return n?["clear","reset","default","restore"].includes(n.toLowerCase())?{clear:!0}:i||isUrlLike(n)?{baseUrl:n}:{}:{}}(s,i);let t=null;if(n.clear&&isConfigurableBaseUrlProvider(s))k(s),t=`Base URL de ${getProviderLabel(s)} restaurada a ${getCurrentProviderBaseUrl(s)}`;else if(n.baseUrl&&isConfigurableBaseUrlProvider(s))try{const e=R(s,n.baseUrl);t=`Base URL de ${getProviderLabel(s)} guardada: ${e}`}catch(e){return r(e instanceof Error?e.message:`No se pudo guardar la base URL para ${getProviderLabel(s)}.`),null}return isProviderConfigured(s)&&isSelectedProfileReady(s,a)?e(SwitchProviderOnMount,{onDone:r,context:o,target:s,baseUrlMessage:t,targetProfileName:a}):(r(function(e,r){if("claude"===e)return"Redirigiendo a inicio de sesion de Claude...";if("openai"===e)return"Redirigiendo a inicio de sesion de OpenAI...";const o=isConfigurableBaseUrlProvider(e)?getProviderSetupMessage(e):null;return r&&o?`${r} - ${o}`:r??o??`Proveedor preparado: ${getProviderLabel(e)}`}(s,t)),null)}return e(ProviderPicker,{onDone:r,context:o})}function SwitchProviderOnMount({onDone:e,context:r,target:o,baseUrlMessage:i,targetProfileName:n}){const t=s(),l=d();return a.useEffect(()=>{(async()=>{try{const a=await switchProvider({context:r,currentModel:t,currentProvider:y(),target:o,targetProfileName:n});l(e=>({...e,mainLoopModel:a.restoredModel,mainLoopModelForSession:null})),e(i?`${i} - ${a.message}`:a.message)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo cambiar de proveedor: ${o}`)}})()},[i,r,t,e,l,o,n]),null}function ProviderPicker({onDone:a,context:t}){const l=s(),u=d(),p=y(),m=c(),g=N.filter(e=>e.implemented).map(e=>{const r="claude"===e.id&&"firstParty"===p||e.id===p,o=isProviderConfigured(e.id),a=r?" [active]":o?" [ready]":" [setup]";return{label:`${e.label}${a}`,value:e.id}});const f=m??("firstParty"===p?"claude":p);return r(i,{flexDirection:"column",gap:1,children:[e(n,{bold:!0,color:"cyan",children:"Selecciona el proveedor de IA para Context Code:"}),e(n,{dimColor:!0,children:"Puedes usar la API oficial de Claude, OpenAI o proveedores compatibles con OpenAI."}),e(o,{options:g,defaultValue:f,onChange:async function(e){try{const r=e;if("claude"===r&&!H("claude"))return void a("No hay sesión de Claude. Lanzando /login...",{nextInput:"/login",submitNextInput:!0});if("openai"===r&&!A())return void a("No hay sesión de OpenAI. Lanzando /login-openai...",{nextInput:"/login-openai",submitNextInput:!0});if(!isProviderConfigured(r))return void a(getProviderSetupMessage(r));const o=await switchProvider({context:t,currentModel:l,currentProvider:p,target:r});u(e=>({...e,mainLoopModel:o.restoredModel,mainLoopModelForSession:null})),a(o.message)}catch(e){const r=e instanceof Error?e.message:String(e);a(`No se pudo cambiar de proveedor: ${r}`)}}}),r(i,{marginTop:1,flexDirection:"column",children:[r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/login"})," para configurar las API keys."]}),r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/provider openrouter https://..."})," para guardar una base URL personalizada."]}),r(n,{dimColor:!0,children:["- ",e(n,{bold:!0,children:"Ollama"})," usa ",getCurrentProviderBaseUrl("ollama")," por defecto."]})]})]})}
@@ -1 +1 @@
1
- import{jsx as e,jsxs as r}from"react/jsx-runtime";import{c as t}from"react/compiler-runtime";import o from"react";import{renderPlaceholder as n}from"../hooks/renderPlaceholder.js";import{usePasteHandler as s}from"../hooks/usePasteHandler.js";import{useDeclaredCursor as i}from"../ink/hooks/use-declared-cursor.js";import{Ansi as l,Box as a,Text as h,useInput as u}from"../ink.js";import{HighlightedInput as c}from"./PromptInput/ShimmeredInput.js";export function BaseTextInput(d){const m=t(14),{inputState:p,children:f,terminalFocus:g,invert:v,hidePlaceholderText:C,...P}=d,{onInput:x,renderedValue:w,cursorLine:I,cursorColumn:j}=p,k=Boolean(P.focus&&P.showCursor&&g);let O;m[0]!==j||m[1]!==I||m[2]!==k?(O={line:I,column:j,active:k},m[0]=j,m[1]=I,m[2]=k,m[3]=O):O=m[3];const E=i(O),{wrappedOnInput:H,isPasting:W}=s({onPaste:P.onPaste,onInput:(e,r)=>{B&&r.return||x(e,r)},onImagePaste:P.onImagePaste}),B=W,{onIsPastingChange:T}=P;o.useEffect(()=>{T&&T(B)},[B,T]);const{showPlaceholder:F,renderedPlaceholder:S}=n({placeholder:P.placeholder,value:P.value,showCursor:P.showCursor,focus:P.focus,terminalFocus:g,invert:v,hidePlaceholderText:C});u(H,{isActive:P.focus});const A=P.value&&-1===P.value.trim().indexOf(" ")||P.value&&P.value.endsWith(" "),L=Boolean(P.argumentHint&&P.value&&A&&P.value.startsWith("/")),M=P.showCursor&&P.highlights?P.highlights.filter(e=>e.dimColor||P.cursorOffset<e.start||P.cursorOffset>=e.end):P.highlights,{viewportCharOffset:V,viewportCharEnd:b}=p,q=M&&V>0?M.filter(e=>e.end>V&&e.start<b).map(e=>({...e,start:Math.max(0,e.start-V),end:e.end-V})):M;if(q&&q.length>0)return r(a,{ref:E,children:[e(c,{text:w,highlights:q}),L&&r(h,{dimColor:!0,children:[P.value?.endsWith(" ")?"":" ",P.argumentHint]}),f]});const y=a,z=h,D=F&&P.placeholderElement?P.placeholderElement:e(l,F&&S?{children:S}:{children:w}),G=L&&r(h,{dimColor:!0,children:[P.value?.endsWith(" ")?"":" ",P.argumentHint]});let J,K;return m[4]!==z||m[5]!==f||m[6]!==P||m[7]!==D||m[8]!==G?(J=r(z,{wrap:"truncate-end",dimColor:P.dimColor,children:[D,G,f]}),m[4]=z,m[5]=f,m[6]=P,m[7]=D,m[8]=G,m[9]=J):J=m[9],m[10]!==y||m[11]!==E||m[12]!==J?(K=e(y,{ref:E,children:J}),m[10]=y,m[11]=E,m[12]=J,m[13]=K):K=m[13],K}
1
+ import{jsx as e,jsxs as r}from"react/jsx-runtime";import{c as t}from"react/compiler-runtime";import o from"react";import{renderPlaceholder as n}from"../hooks/renderPlaceholder.js";import{usePasteHandler as s}from"../hooks/usePasteHandler.js";import{useDeclaredCursor as l}from"../ink/hooks/use-declared-cursor.js";import{Ansi as a,Box as i,Text as h,useInput as u}from"../ink.js";import{HighlightedInput as c}from"./PromptInput/ShimmeredInput.js";export function BaseTextInput(d){const m=t(14),{inputState:f,children:p,terminalFocus:g,invert:C,hidePlaceholderText:v,...P}=d,{onInput:x,renderedValue:w,cursorLine:I,cursorColumn:O}=f,j=Boolean(P.focus&&P.showCursor&&g);let k;m[0]!==O||m[1]!==I||m[2]!==j?(k={line:I,column:O,active:j},m[0]=O,m[1]=I,m[2]=j,m[3]=k):k=m[3];const E=l(k),H=o.useCallback(e=>{const r=P.value??"",t=P.cursorOffset??r.length,o=r.slice(0,t)+e+r.slice(t);P.onChange(o),P.onChangeCursorOffset(t+e.length)},[P.value,P.cursorOffset,P.onChange,P.onChangeCursorOffset]),{wrappedOnInput:W,isPasting:B}=s({onPaste:P.onPaste??H,onInput:(e,r)=>{T&&r.return||x(e,r)},onImagePaste:P.onImagePaste}),T=B,{onIsPastingChange:F}=P;o.useEffect(()=>{F&&F(T)},[T,F]);const{showPlaceholder:S,renderedPlaceholder:b}=n({placeholder:P.placeholder,value:P.value,showCursor:P.showCursor,focus:P.focus,terminalFocus:g,invert:C,hidePlaceholderText:v});u(W,{isActive:P.focus});const A=P.value&&-1===P.value.trim().indexOf(" ")||P.value&&P.value.endsWith(" "),L=Boolean(P.argumentHint&&P.value&&A&&P.value.startsWith("/")),M=P.showCursor&&P.highlights?P.highlights.filter(e=>e.dimColor||P.cursorOffset<e.start||P.cursorOffset>=e.end):P.highlights,{viewportCharOffset:V,viewportCharEnd:q}=f,y=M&&V>0?M.filter(e=>e.end>V&&e.start<q).map(e=>({...e,start:Math.max(0,e.start-V),end:e.end-V})):M;if(y&&y.length>0)return r(i,{ref:E,children:[e(c,{text:w,highlights:y}),L&&r(h,{dimColor:!0,children:[P.value?.endsWith(" ")?"":" ",P.argumentHint]}),p]});const z=i,D=h,G=S&&P.placeholderElement?P.placeholderElement:e(a,S&&b?{children:b}:{children:w}),J=L&&r(h,{dimColor:!0,children:[P.value?.endsWith(" ")?"":" ",P.argumentHint]});let K,N;return m[4]!==D||m[5]!==p||m[6]!==P||m[7]!==G||m[8]!==J?(K=r(D,{wrap:"truncate-end",dimColor:P.dimColor,children:[G,J,p]}),m[4]=D,m[5]=p,m[6]=P,m[7]=G,m[8]=J,m[9]=K):K=m[9],m[10]!==z||m[11]!==E||m[12]!==K?(N=e(z,{ref:E,children:K}),m[10]=z,m[11]=E,m[12]=K,m[13]=N):N=m[13],N}
@@ -1 +1 @@
1
- import{jsx as o}from"react/jsx-runtime";import{c as t}from"react/compiler-runtime";import{useEffect as e,useRef as r,useState as n}from"react";import{Box as l}from"../../ink.js";import{getInitialSettings as i}from"../../utils/settings/settings.js";import{Clawd as f}from"./Clawd.js";function hold(o,t,e){return Array.from({length:e},()=>({pose:o,offset:t}))}const s=[...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1),...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1)],u=[...hold("look-right",0,5),...hold("look-left",0,5),...hold("default",0,1)],c=[s,u],d={pose:"default",offset:0},incrementFrame=o=>o+1;export function AnimatedClawd(){const u=t(8),{pose:m,bounceOffset:a,onClick:h}=function(){const[o]=n(()=>i().prefersReducedMotion??!1),[t,l]=n(-1),f=r(s),onClick=()=>{o||-1!==t||(f.current=c[Math.floor(Math.random()*c.length)],l(0))};e(()=>{if(-1===t)return;if(t>=f.current.length)return void l(-1);const o=setTimeout(l,60,incrementFrame);return()=>clearTimeout(o)},[t]);const u=f.current,m=t>=0&&t<u.length?u[t]:d;return{pose:m.pose,bounceOffset:m.offset,onClick}}();let p,g,k;return u[0]!==m?(p=o(f,{pose:m}),u[0]=m,u[1]=p):p=u[1],u[2]!==a||u[3]!==p?(g=o(l,{marginTop:a,flexShrink:0,children:p}),u[2]=a,u[3]=p,u[4]=g):g=u[4],u[5]!==h||u[6]!==g?(k=o(l,{height:3,flexDirection:"column",onClick:h,children:g}),u[5]=h,u[6]=g,u[7]=k):k=u[7],k}
1
+ import{jsx as o}from"react/jsx-runtime";import{c as t}from"react/compiler-runtime";import{useEffect as e,useRef as r,useState as n}from"react";import{Box as l}from"../../ink.js";import{getInitialSettings as i}from"../../utils/settings/settings.js";import{Clawd as f}from"./Clawd.js";function hold(o,t,e){return Array.from({length:e},()=>({pose:o,offset:t}))}const s=[...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1),...hold("default",1,2),...hold("arms-up",0,3),...hold("default",0,1)],u=[...hold("look-right",0,5),...hold("look-left",0,5),...hold("default",0,1)],c=[s,u],d={pose:"default",offset:0},incrementFrame=o=>o+1;export function AnimatedClawd(){const u=t(8),{pose:m,bounceOffset:a,onClick:h}=function(){const[o]=n(()=>i().prefersReducedMotion??!1),[t,l]=n(-1),f=r(s),onClick=()=>{o||-1!==t||(f.current=c[Math.floor(Math.random()*c.length)],l(0))};e(()=>{if(-1===t)return;if(t>=f.current.length)return void l(-1);const o=setTimeout(l,60,incrementFrame);return()=>clearTimeout(o)},[t]);const u=f.current,m=t>=0&&t<u.length?u[t]:d;return{pose:m.pose,bounceOffset:m.offset,onClick}}();let p,g,k;return u[0]!==m?(p=o(f,{pose:m}),u[0]=m,u[1]=p):p=u[1],u[2]!==a||u[3]!==p?(g=o(l,{marginTop:a,flexShrink:0,children:p}),u[2]=a,u[3]=p,u[4]=g):g=u[4],u[5]!==h||u[6]!==g?(k=o(l,{height:5,flexDirection:"column",onClick:h,children:g}),u[5]=h,u[6]=g,u[7]=k):k=u[7],k}
@@ -1 +1 @@
1
- import{jsx as o,jsxs as l}from"react/jsx-runtime";import{Box as r,Text as e}from"../../ink.js";export function Clawd({pose:c="default"}={}){const[d,t,i]={default:["╭─┬─┬─╮","│C│T│X│","╰─┴─┴─╯"],"arms-up":["╭▲┬▲┬▲╮","│C│T│X│","╰─┴─┴─╯"],"look-left":["╭─┬─┬─╮","│◀│T│X│","╰─┴─┴─╯"],"look-right":["╭─┬─┬─╮","│C│T│▶│","╰─┴─┴─╯"]}[c];return l(r,{flexDirection:"column",alignItems:"center",children:[o(e,{color:"clawd_body",children:d}),o(e,{color:"clawd_body",bold:!0,children:t}),o(e,{color:"clawd_body",dimColor:!0,children:i})]})}
1
+ import{jsx as o}from"react/jsx-runtime";import{Box as r,Text as e}from"../../ink.js";const t=["██████ ██████ ██ ██","██ ██ ████ ","██ ██ ██ ","██ ██ ████ ","██████ ██ ██ ██"],c=["white","white","clawd_body","clawd_body","clawd_body"];export function Clawd(i={}){return o(r,{flexDirection:"column",alignItems:"center",children:t.map((r,t)=>o(e,{color:c[t],bold:!0,children:r},t))})}
@@ -1 +1 @@
1
- import{MACRO as e,feature as o}from"../../recovery/bunBundleShim.js";import{jsx as r,jsxs as n,Fragment as t}from"react/jsx-runtime";import{createRequire as s}from"module";const i=s(import.meta.url);import{c}from"react/compiler-runtime";import{Box as l,Text as m,color as a}from"../../ink.js";import{useTerminalSize as d}from"../../hooks/useTerminalSize.js";import{stringWidth as _}from"../../ink/stringWidth.js";import{getLayoutMode as p,calculateLayoutDimensions as C,calculateOptimalLeftWidth as E,formatWelcomeMessage as f,truncatePath as h,getRecentActivitySync as u,getRecentReleaseNotesSync as O,getLogoDisplayData as T}from"../../utils/logoV2Utils.js";import{truncate as D}from"../../utils/format.js";import{getDisplayPath as X}from"../../utils/file.js";import{Clawd as S}from"./Clawd.js";import{FeedColumn as g}from"./FeedColumn.js";import{createRecentActivityFeed as N,createWhatsNewFeed as U,createProjectOnboardingFeed as L,createGuestPassesFeed as v}from"./feedConfigs.js";import{getGlobalConfig as I,saveGlobalConfig as M}from"../../utils/config.js";import{resolveThemeSetting as b}from"../../utils/systemTheme.js";import{getInitialSettings as j}from"../../utils/settings/settings.js";import{isDebugMode as F,isDebugToStdErr as x,getDebugLogPath as R}from"../../utils/debug.js";import{useEffect as A,useState as y}from"react";import{getSteps as P,shouldShowProjectOnboarding as $,incrementProjectOnboardingSeenCount as w}from"../../projectOnboardingState.js";import{CondensedLogo as z}from"./CondensedLogo.js";import{OffscreenFreeze as V}from"../OffscreenFreeze.js";import{checkForReleaseNotesSync as G}from"../../utils/releaseNotes.js";import{getDumpPromptsPath as k}from"../../services/api/dumpPrompts.js";import{isEnvTruthy as W}from"../../utils/envUtils.js";import{getStartupPerfLogPath as H,isDetailedProfilingEnabled as K}from"../../utils/startupProfiler.js";import{EmergencyTip as Y}from"./EmergencyTip.js";import{VoiceModeNotice as B}from"./VoiceModeNotice.js";import{Opus1mMergeNotice as q}from"./Opus1mMergeNotice.js";const J=o("KAIROS")||o("KAIROS_CHANNELS")?i("./ChannelsNotice.js"):null;import{SandboxManager as Q}from"../../utils/sandbox/sandbox-adapter.js";import{useShowGuestPassesUpsell as Z,incrementGuestPassesSeenCount as ee}from"./GuestPassesUpsell.js";import{useShowOverageCreditUpsell as oe,incrementOverageCreditUpsellSeenCount as re,createOverageCreditFeed as ne}from"./OverageCreditUpsell.js";import{useAppState as te}from"../../state/AppState.js";import{getEffortSuffix as se}from"../../utils/effort.js";import{useMainLoopModel as ie}from"../../hooks/useMainLoopModel.js";import{renderModelSetting as ce}from"../../utils/model/model.js";export function LogoV2(){const o=c(94),s=u(),i=I().oauthAccount?.displayName??"",{columns:X}=d();let k;o[0]===Symbol.for("react.memo_cache_sentinel")?(k=$(),o[0]=k):k=o[0];const H=k;let K;o[1]===Symbol.for("react.memo_cache_sentinel")?(K=Q.isSandboxingEnabled(),o[1]=K):K=o[1];const le=K,me=Z(),ae=oe(),de=te(_temp),_e=te(_temp2),pe=I();let Ce;try{Ce=O(3)}catch{Ce=[]}const[Ee]=y(()=>{const e=j().companyAnnouncements;if(e&&0!==e.length)return 1===pe.numStartups?e[0]:e[Math.floor(Math.random()*e.length)]}),{hasReleaseNotes:fe}=G(pe.lastReleaseNotesSeen);let he,ue,Oe;o[2]===Symbol.for("react.memo_cache_sentinel")?(he=()=>{I().lastReleaseNotesSeen!==e.VERSION&&(M(_temp3),H&&w())},o[2]=he):he=o[2],o[3]!==pe?(ue=[pe,H],o[3]=pe,o[4]=ue):ue=o[4],A(he,ue),o[5]===Symbol.for("react.memo_cache_sentinel")?(Oe=!(fe||H||W(process.env.CONTEXT_CODE_FORCE_FULL_LOGO)||W(process.env.CLAUDE_CODE_FORCE_FULL_LOGO)),o[5]=Oe):Oe=o[5];const Te=Oe;let De,Xe,Se,ge;o[6]!==me?(De=()=>{!me||H||Te||ee()},Xe=[me,H,Te],o[6]=me,o[7]=De,o[8]=Xe):(De=o[7],Xe=o[8]),A(De,Xe),o[9]!==me||o[10]!==ae?(Se=()=>{!ae||H||me||Te||re()},ge=[ae,H,me,Te],o[9]=me,o[10]=ae,o[11]=Se,o[12]=ge):(Se=o[11],ge=o[12]),A(Se,ge);const Ne=ie(),Ue=ce(Ne),{version:Le,cwd:ve,billingType:Ie,agentName:Me}=T(),be=de??Me,je=Ue+se(Ne,_e);let Fe;o[13]!==je?(Fe=D(je,30),o[13]=je,o[14]=Fe):Fe=o[14];const xe=Fe;if(!(fe||H||W(process.env.CONTEXT_CODE_FORCE_FULL_LOGO)||W(process.env.CLAUDE_CODE_FORCE_FULL_LOGO))){let e,s,i,c,a,d,_,p,C,E,f,h,u;return o[15]===Symbol.for("react.memo_cache_sentinel")?(e=r(z,{}),s=r(B,{}),i=r(q,{}),c=J&&r(J.ChannelsNotice,{}),a=F()&&n(l,{paddingLeft:2,flexDirection:"column",children:[r(m,{color:"warning",children:"Debug mode enabled"}),n(m,{dimColor:!0,children:["Logging to: ",x()?"stderr":R()]})]}),d=r(Y,{}),_=(process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION)&&n(l,{paddingLeft:2,flexDirection:"column",children:[n(m,{dimColor:!0,children:["tmux session: ",process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION]}),r(m,{dimColor:!0,children:process.env.CONTEXT_CODE_TMUX_PREFIX_CONFLICTS??process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),o[15]=e,o[16]=s,o[17]=i,o[18]=c,o[19]=a,o[20]=d,o[21]=_):(e=o[15],s=o[16],i=o[17],c=o[18],a=o[19],d=o[20],_=o[21]),o[22]!==Ee||o[23]!==pe?(p=Ee&&n(l,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&pe.oauthAccount?.organizationName&&n(m,{dimColor:!0,children:["Message from ",pe.oauthAccount.organizationName,":"]}),r(m,{children:Ee})]}),o[22]=Ee,o[23]=pe,o[24]=p):p=o[24],o[25]===Symbol.for("react.memo_cache_sentinel")?(C=!1,E=!1,f=!1,h=!1,o[25]=C,o[26]=E,o[27]=f,o[28]=h):(C=o[25],E=o[26],f=o[27],h=o[28]),o[29]!==p?(u=n(t,{children:[e,s,i,c,a,d,_,p,C,E,f,h]}),o[29]=p,o[30]=u):u=o[30],u}const Re=p(X),Ae=b(I().theme),ye=` ${a("claude",Ae)("CTX")} ${a("inactive",Ae)(`v${Le}`)} `,Pe=a("claude",Ae)(" CTX ");if("compact"===Re){let e=f(i);if(_(e)>X-4){let r;o[31]===Symbol.for("react.memo_cache_sentinel")?(r=f(null),o[31]=r):r=o[31],e=r}const s=h(ve,Math.max(X-4,10));let c,a,d,p,C,E,u,O,T;return o[32]!==Pe?(c={content:Pe,position:"top",align:"start",offset:1},o[32]=Pe,o[33]=c):c=o[33],o[34]===Symbol.for("react.memo_cache_sentinel")?(a=r(l,{marginY:1,children:r(S,{})}),o[34]=a):a=o[34],o[35]!==xe?(d=r(m,{dimColor:!0,children:xe}),o[35]=xe,o[36]=d):d=o[36],o[37]===Symbol.for("react.memo_cache_sentinel")?(p=r(B,{}),C=r(q,{}),E=J&&r(J.ChannelsNotice,{}),o[37]=p,o[38]=C,o[39]=E):(p=o[37],C=o[38],E=o[39]),o[40]!==le?(u=le&&r(l,{marginTop:1,flexDirection:"column",children:r(m,{color:"warning",children:"Tus comandos bash se ejecutarán en sandbox. Desactiva con /sandbox."})}),o[40]=le,o[41]=u):u=o[41],o[42]===Symbol.for("react.memo_cache_sentinel")?(O=!1,T=!1,o[42]=O,o[43]=T):(O=o[42],T=o[43]),n(t,{children:[r(V,{children:n(l,{flexDirection:"column",borderStyle:"round",borderColor:"claude",borderText:c,paddingX:2,paddingY:1,alignItems:"center",width:X,children:[r(m,{color:"claude",children:"CTX"}),r(m,{bold:!0,children:e}),a,r(m,{dimColor:!0,children:xe}),r(m,{dimColor:!0,children:Ie}),be?n(m,{dimColor:!0,children:["@",be]}):null,r(m,{dimColor:!0,children:s})]})}),p,C,E,u,O,T]})}const $e=f(i),we=!process.env.IS_DEMO&&pe.oauthAccount?.organizationName?`${xe} · ${Ie} · ${pe.oauthAccount.organizationName}`:`${xe} · ${Ie}`,ze=be?49-_(be)-3:50,Ve=h(ve,Math.max(ze,10)),Ge=be?`@${be} · ${Ve}`:Ve,ke=E($e,Ge,we),{leftWidth:We,rightWidth:He}=C(X,Re,ke),Ke=V,Ye=l;let Be;o[44]!==ye?(Be={content:ye,position:"top",align:"start",offset:3},o[44]=ye,o[45]=Be):Be=o[45];const qe=l,Je="column";let Qe,Ze,eo,oo,ro,no,to;o[46]!==$e?(Qe=r(l,{marginTop:1,children:r(m,{bold:!0,children:$e})}),o[46]=$e,o[47]=Qe):Qe=o[47],o[48]===Symbol.for("react.memo_cache_sentinel")?(Ze=r(S,{}),o[48]=Ze):Ze=o[48],o[49]!==we?(eo=r(m,{dimColor:!0,children:we}),o[49]=we,o[50]=eo):eo=o[50],o[51]!==Ge?(oo=r(m,{dimColor:!0,children:Ge}),o[51]=Ge,o[52]=oo):oo=o[52],o[53]!==eo||o[54]!==oo?(ro=n(l,{flexDirection:"column",alignItems:"center",children:[r(m,{color:"claude",children:"CTX"}),eo,oo]}),o[53]=eo,o[54]=oo,o[55]=ro):ro=o[55],o[56]!==We||o[57]!==Qe||o[58]!==ro?(no=n(l,{flexDirection:"column",width:We,justifyContent:"space-between",alignItems:"center",minHeight:11,children:[Qe,Ze,ro]}),o[56]=We,o[57]=Qe,o[58]=ro,o[59]=no):no=o[59],o[60]!==Re?(to=null,o[60]=Re,o[61]=to):to=o[61];const so=r(g,{feeds:H?[L(P()),N(s)]:me?[N(s),v()]:ae?[N(s),ne()]:[N(s),U(Ce)],maxWidth:Math.max(We,He)});let io,co,lo,mo,ao,_o,po,Co,Eo,fo,ho,uo,Oo,To,Do,Xo;return o[62]!==qe||o[63]!==Je||o[64]!==no||o[65]!==to||o[66]!==so?(io=n(qe,{flexDirection:Je,paddingX:2,gap:2,children:[no,to,so]}),o[62]=qe,o[63]=Je,o[64]=no,o[65]=to,o[66]=so,o[67]=io):io=o[67],o[68]!==Ye||o[69]!==Be||o[70]!==io?(co=r(Ye,{flexDirection:"column",borderStyle:"round",borderColor:"claude",borderText:Be,children:io}),o[68]=Ye,o[69]=Be,o[70]=io,o[71]=co):co=o[71],o[72]!==Ke||o[73]!==co?(lo=r(Ke,{children:co}),o[72]=Ke,o[73]=co,o[74]=lo):lo=o[74],o[75]===Symbol.for("react.memo_cache_sentinel")?(mo=r(B,{}),ao=r(q,{}),_o=J&&r(J.ChannelsNotice,{}),po=F()&&n(l,{paddingLeft:2,flexDirection:"column",children:[r(m,{color:"warning",children:"Debug mode enabled"}),n(m,{dimColor:!0,children:["Logging to: ",x()?"stderr":R()]})]}),Co=r(Y,{}),Eo=(process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION)&&n(l,{paddingLeft:2,flexDirection:"column",children:[n(m,{dimColor:!0,children:["tmux session: ",process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION]}),r(m,{dimColor:!0,children:process.env.CONTEXT_CODE_TMUX_PREFIX_CONFLICTS??process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),o[75]=mo,o[76]=ao,o[77]=_o,o[78]=po,o[79]=Co,o[80]=Eo):(mo=o[75],ao=o[76],_o=o[77],po=o[78],Co=o[79],Eo=o[80]),o[81]!==Ee||o[82]!==pe?(fo=Ee&&n(l,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&pe.oauthAccount?.organizationName&&n(m,{dimColor:!0,children:["Message from ",pe.oauthAccount.organizationName,":"]}),r(m,{children:Ee})]}),o[81]=Ee,o[82]=pe,o[83]=fo):fo=o[83],o[84]!==le?(ho=le&&r(l,{paddingLeft:2,flexDirection:"column",children:r(m,{color:"warning",children:"Tus comandos bash se ejecutarán en sandbox. Desactiva con /sandbox."})}),o[84]=le,o[85]=ho):ho=o[85],o[86]===Symbol.for("react.memo_cache_sentinel")?(uo=!1,Oo=!1,To=!1,Do=!1,o[86]=uo,o[87]=Oo,o[88]=To,o[89]=Do):(uo=o[86],Oo=o[87],To=o[88],Do=o[89]),o[90]!==lo||o[91]!==fo||o[92]!==ho?(Xo=n(t,{children:[lo,mo,ao,_o,po,Co,Eo,fo,ho,uo,Oo,To,Do]}),o[90]=lo,o[91]=fo,o[92]=ho,o[93]=Xo):Xo=o[93],Xo}function _temp3(o){return o.lastReleaseNotesSeen===e.VERSION?o:{...o,lastReleaseNotesSeen:e.VERSION}}function _temp2(e){return e.effortValue}function _temp(e){return e.agent}
1
+ import{MACRO as e,feature as o}from"../../recovery/bunBundleShim.js";import{jsx as n,jsxs as r,Fragment as t}from"react/jsx-runtime";import{createRequire as i}from"module";const s=i(import.meta.url);import{c}from"react/compiler-runtime";import{Box as l,Text as m,color as a}from"../../ink.js";import{useTerminalSize as d}from"../../hooks/useTerminalSize.js";import{stringWidth as _}from"../../ink/stringWidth.js";import{getLayoutMode as p,calculateLayoutDimensions as C,formatWelcomeMessage as f,truncatePath as h,getRecentActivitySync as E,getRecentReleaseNotesSync as u,getLogoDisplayData as O}from"../../utils/logoV2Utils.js";import{truncate as T}from"../../utils/format.js";import{getDisplayPath as D}from"../../utils/file.js";import{Clawd as X}from"./Clawd.js";import{FeedColumn as g}from"./FeedColumn.js";import{createRecentActivityFeed as S,createWhatsNewFeed as N,createProjectOnboardingFeed as U,createGuestPassesFeed as L}from"./feedConfigs.js";import{getGlobalConfig as I,saveGlobalConfig as x}from"../../utils/config.js";import{resolveThemeSetting as v}from"../../utils/systemTheme.js";import{getInitialSettings as M}from"../../utils/settings/settings.js";import{isDebugMode as j,isDebugToStdErr as F,getDebugLogPath as b}from"../../utils/debug.js";import{useEffect as R,useState as A}from"react";import{getSteps as P,shouldShowProjectOnboarding as y,incrementProjectOnboardingSeenCount as $}from"../../projectOnboardingState.js";import{CondensedLogo as w}from"./CondensedLogo.js";import{OffscreenFreeze as z}from"../OffscreenFreeze.js";import{checkForReleaseNotesSync as V}from"../../utils/releaseNotes.js";import{getDumpPromptsPath as G}from"../../services/api/dumpPrompts.js";import{isEnvTruthy as k}from"../../utils/envUtils.js";import{getStartupPerfLogPath as W,isDetailedProfilingEnabled as H}from"../../utils/startupProfiler.js";import{EmergencyTip as K}from"./EmergencyTip.js";import{VoiceModeNotice as Y}from"./VoiceModeNotice.js";import{Opus1mMergeNotice as B}from"./Opus1mMergeNotice.js";const q=o("KAIROS")||o("KAIROS_CHANNELS")?s("./ChannelsNotice.js"):null;import{SandboxManager as J}from"../../utils/sandbox/sandbox-adapter.js";import{useShowGuestPassesUpsell as Q,incrementGuestPassesSeenCount as Z}from"./GuestPassesUpsell.js";import{useShowOverageCreditUpsell as ee,incrementOverageCreditUpsellSeenCount as oe,createOverageCreditFeed as ne}from"./OverageCreditUpsell.js";import{useAppState as re}from"../../state/AppState.js";import{getEffortSuffix as te}from"../../utils/effort.js";import{useMainLoopModel as ie}from"../../hooks/useMainLoopModel.js";import{renderModelSetting as se}from"../../utils/model/model.js";const ce=120;export function LogoV2(){const o=c(94),i=E(),s=I().oauthAccount?.displayName??"",{columns:D}=d();let G;o[0]===Symbol.for("react.memo_cache_sentinel")?(G=y(),o[0]=G):G=o[0];const W=G;let H;o[1]===Symbol.for("react.memo_cache_sentinel")?(H=J.isSandboxingEnabled(),o[1]=H):H=o[1];const le=H,me=Q(),ae=ee(),de=re(_temp),_e=re(_temp2),pe=I();let Ce;try{Ce=u(3)}catch{Ce=[]}const[fe]=A(()=>{const e=M().companyAnnouncements;if(e&&0!==e.length)return 1===pe.numStartups?e[0]:e[Math.floor(Math.random()*e.length)]}),{hasReleaseNotes:he}=V(pe.lastReleaseNotesSeen);let Ee,ue,Oe;o[2]===Symbol.for("react.memo_cache_sentinel")?(Ee=()=>{I().lastReleaseNotesSeen!==e.VERSION&&(x(_temp3),W&&$())},o[2]=Ee):Ee=o[2],o[3]!==pe?(ue=[pe,W],o[3]=pe,o[4]=ue):ue=o[4],R(Ee,ue),o[5]===Symbol.for("react.memo_cache_sentinel")?(Oe=!(he||W||k(process.env.CONTEXT_CODE_FORCE_FULL_LOGO)||k(process.env.CLAUDE_CODE_FORCE_FULL_LOGO)),o[5]=Oe):Oe=o[5];const Te=Oe;let De,Xe,ge,Se;o[6]!==me?(De=()=>{!me||W||Te||Z()},Xe=[me,W,Te],o[6]=me,o[7]=De,o[8]=Xe):(De=o[7],Xe=o[8]),R(De,Xe),o[9]!==me||o[10]!==ae?(ge=()=>{!ae||W||me||Te||oe()},Se=[ae,W,me,Te],o[9]=me,o[10]=ae,o[11]=ge,o[12]=Se):(ge=o[11],Se=o[12]),R(ge,Se);const Ne=ie(),Ue=se(Ne),{version:Le,cwd:Ie,billingType:xe,agentName:ve}=O(),Me=de??ve,je=Ue+te(Ne,_e);let Fe;o[13]!==je?(Fe=T(je,100),o[13]=je,o[14]=Fe):Fe=o[14];const be=Fe;if(!(he||W||k(process.env.CONTEXT_CODE_FORCE_FULL_LOGO)||k(process.env.CLAUDE_CODE_FORCE_FULL_LOGO))){let e,i,s,c,a,d,_,p,C,f,h,E,u;return o[15]===Symbol.for("react.memo_cache_sentinel")?(e=n(w,{}),i=n(Y,{}),s=n(B,{}),c=q&&n(q.ChannelsNotice,{}),a=j()&&r(l,{paddingLeft:2,flexDirection:"column",children:[n(m,{color:"warning",children:"Debug mode enabled"}),r(m,{dimColor:!0,children:["Logging to: ",F()?"stderr":b()]})]}),d=n(K,{}),_=(process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION)&&r(l,{paddingLeft:2,flexDirection:"column",children:[r(m,{dimColor:!0,children:["tmux session: ",process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION]}),n(m,{dimColor:!0,children:process.env.CONTEXT_CODE_TMUX_PREFIX_CONFLICTS??process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),o[15]=e,o[16]=i,o[17]=s,o[18]=c,o[19]=a,o[20]=d,o[21]=_):(e=o[15],i=o[16],s=o[17],c=o[18],a=o[19],d=o[20],_=o[21]),o[22]!==fe||o[23]!==pe?(p=fe&&r(l,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&pe.oauthAccount?.organizationName&&r(m,{dimColor:!0,children:["Message from ",pe.oauthAccount.organizationName,":"]}),n(m,{children:fe})]}),o[22]=fe,o[23]=pe,o[24]=p):p=o[24],o[25]===Symbol.for("react.memo_cache_sentinel")?(C=!1,f=!1,h=!1,E=!1,o[25]=C,o[26]=f,o[27]=h,o[28]=E):(C=o[25],f=o[26],h=o[27],E=o[28]),o[29]!==p?(u=r(t,{children:[e,i,s,c,a,d,_,p,C,f,h,E]}),o[29]=p,o[30]=u):u=o[30],u}const Re=p(D),Ae=v(I().theme),Pe=` ${a("context",Ae)("CTX")} ${a("inactive",Ae)(`v${Le}`)} `,ye=a("context",Ae)(" CTX ");if("compact"===Re){let e=f(s);if(_(e)>D-4){let n;o[31]===Symbol.for("react.memo_cache_sentinel")?(n=f(null),o[31]=n):n=o[31],e=n}const i=h(Ie,Math.max(D-4,10));let c,a,d,p,C,E,u,O,T;return o[32]!==ye?(c={content:ye,position:"top",align:"start",offset:1},o[32]=ye,o[33]=c):c=o[33],o[34]===Symbol.for("react.memo_cache_sentinel")?(a=n(l,{marginY:1,children:n(X,{})}),o[34]=a):a=o[34],o[35]!==be?(d=n(m,{dimColor:!0,children:be}),o[35]=be,o[36]=d):d=o[36],o[37]===Symbol.for("react.memo_cache_sentinel")?(p=n(Y,{}),C=n(B,{}),E=q&&n(q.ChannelsNotice,{}),o[37]=p,o[38]=C,o[39]=E):(p=o[37],C=o[38],E=o[39]),o[40]!==le?(u=le&&n(l,{marginTop:1,flexDirection:"column",children:n(m,{color:"warning",children:"Tus comandos bash se ejecutarán en sandbox. Desactiva con /sandbox."})}),o[40]=le,o[41]=u):u=o[41],o[42]===Symbol.for("react.memo_cache_sentinel")?(O=!1,T=!1,o[42]=O,o[43]=T):(O=o[42],T=o[43]),r(t,{children:[n(z,{children:r(l,{flexDirection:"column",paddingX:2,paddingY:1,alignItems:"center",width:D,children:[n(m,{color:"context",children:"CTX"}),n(m,{bold:!0,children:e}),a,n(m,{dimColor:!0,children:be}),n(m,{dimColor:!0,children:xe}),Me?r(m,{dimColor:!0,children:["@",Me]}):null,n(m,{dimColor:!0,children:i})]})}),p,C,E,u,O,T]})}const $e=f(s),we=(ze=pe.oauthAccount?.organizationName,ze?ze.replace(/\s*,\s*(Inc\.|Inc|LLC|Ltd\.|Ltd|S\.A\.|S\.A|Corp\.|Corp)\b/gi,"").trim():"");var ze;const Ve=`${be} · ${xe}`,Ge=!process.env.IS_DEMO&&we?`Organización: ${we}`:null,ke=Me?119-_(Me)-3:ce,We=h(Ie,Math.max(ke,10)),He=Me?`@${Me} · ${We}`:We,Ke=Math.max(_($e),23+_(He),23+_(Ve),Ge?23+_(Ge):0),Ye=Math.min(Ke+4,ce),{leftWidth:Be,rightWidth:qe}=C(D,Re,Ye),Je=z,Qe=l;let Ze;o[44]!==Pe?(Ze={content:Pe,position:"top",align:"start",offset:3},o[44]=Pe,o[45]=Ze):Ze=o[45];const eo=l,oo="column";let no,ro,to,io,so,co,lo;o[46]!==$e?(no=n(l,{marginTop:1,children:n(m,{bold:!0,children:$e})}),o[46]=$e,o[47]=no):no=o[47],o[48]===Symbol.for("react.memo_cache_sentinel")?(ro=n(l,{alignSelf:"flex-start",children:n(X,{})}),o[48]=ro):ro=o[48],o[49]!==Ve||o[50]!==Ge?(to=r(l,{flexDirection:"column",alignItems:"flex-start",children:[n(m,{dimColor:!0,children:Ve}),Ge&&n(m,{dimColor:!0,children:Ge})]}),o[49]=Ve,o[50]=to):to=o[50],o[51]!==He?(io=n(m,{dimColor:!0,children:He}),o[51]=He,o[52]=io):io=o[52],o[53]!==to||o[54]!==io?(so=r(l,{flexDirection:"column",alignItems:"center",children:[n(m,{color:"context",children:"CTX"}),to,io]}),o[53]=to,o[54]=io,o[55]=so):so=o[55],o[56]!==Be||o[57]!==no||o[58]!==so?(co=r(l,{flexDirection:"column",width:Be,minHeight:11,children:[n(l,{alignSelf:"flex-start",children:no}),r(l,{flexDirection:"row",alignItems:"center",gap:3,marginTop:1,children:[n(l,{flexDirection:"column",alignItems:"center",width:20,children:n(X,{})}),r(l,{flexDirection:"column",alignItems:"flex-start",flexGrow:1,width:Be-23,children:[to,io]})]})]}),o[56]=Be,o[57]=no,o[58]=so,o[59]=co):co=o[59],o[60]!==Re?(lo=null,o[60]=Re,o[61]=lo):lo=o[61];const mo=n(g,{feeds:W?[U(P()),S(i)]:me?[S(i),L()]:ae?[S(i),ne()]:[S(i),N(Ce)],maxWidth:Math.max(Be,qe)});let ao,_o,po,Co,fo,ho,Eo,uo,Oo,To,Do,Xo,go,So,No,Uo;return o[62]!==eo||o[63]!==oo||o[64]!==co||o[65]!==lo||o[66]!==mo?(ao=r(eo,{flexDirection:oo,paddingX:2,gap:2,children:[co,lo]}),o[62]=eo,o[63]=oo,o[64]=co,o[65]=lo,o[66]=mo,o[67]=ao):ao=o[67],o[68]!==Qe||o[69]!==Ze||o[70]!==ao?(_o=n(Qe,{flexDirection:"column",children:ao}),o[68]=Qe,o[69]=Ze,o[70]=ao,o[71]=_o):_o=o[71],o[72]!==Je||o[73]!==_o?(po=n(Je,{children:_o}),o[72]=Je,o[73]=_o,o[74]=po):po=o[74],o[75]===Symbol.for("react.memo_cache_sentinel")?(Co=n(Y,{}),fo=n(B,{}),ho=q&&n(q.ChannelsNotice,{}),Eo=j()&&r(l,{paddingLeft:2,flexDirection:"column",children:[n(m,{color:"warning",children:"Debug mode enabled"}),r(m,{dimColor:!0,children:["Logging to: ",F()?"stderr":b()]})]}),uo=n(K,{}),Oo=(process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION)&&r(l,{paddingLeft:2,flexDirection:"column",children:[r(m,{dimColor:!0,children:["tmux session: ",process.env.CONTEXT_CODE_TMUX_SESSION??process.env.CLAUDE_CODE_TMUX_SESSION]}),n(m,{dimColor:!0,children:process.env.CONTEXT_CODE_TMUX_PREFIX_CONFLICTS??process.env.CLAUDE_CODE_TMUX_PREFIX_CONFLICTS?`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d (press prefix twice - Claude uses ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX})`:`Detach: ${process.env.CONTEXT_CODE_TMUX_PREFIX??process.env.CLAUDE_CODE_TMUX_PREFIX} d`})]}),o[75]=Co,o[76]=fo,o[77]=ho,o[78]=Eo,o[79]=uo,o[80]=Oo):(Co=o[75],fo=o[76],ho=o[77],Eo=o[78],uo=o[79],Oo=o[80]),o[81]!==fe||o[82]!==pe?(To=fe&&r(l,{paddingLeft:2,flexDirection:"column",children:[!process.env.IS_DEMO&&pe.oauthAccount?.organizationName&&r(m,{dimColor:!0,children:["Message from ",pe.oauthAccount.organizationName,":"]}),n(m,{children:fe})]}),o[81]=fe,o[82]=pe,o[83]=To):To=o[83],o[84]!==le?(Do=le&&n(l,{paddingLeft:2,flexDirection:"column",children:n(m,{color:"warning",children:"Tus comandos bash se ejecutarán en sandbox. Desactiva con /sandbox."})}),o[84]=le,o[85]=Do):Do=o[85],o[86]===Symbol.for("react.memo_cache_sentinel")?(Xo=!1,go=!1,So=!1,No=!1,o[86]=Xo,o[87]=go,o[88]=So,o[89]=No):(Xo=o[86],go=o[87],So=o[88],No=o[89]),o[90]!==po||o[91]!==To||o[92]!==Do?(Uo=r(t,{children:[po,Co,fo,ho,Eo,uo,Oo,To,Do,Xo,go,So,No]}),o[90]=po,o[91]=To,o[92]=Do,o[93]=Uo):Uo=o[93],Uo}function _temp3(o){return o.lastReleaseNotesSeen===e.VERSION?o:{...o,lastReleaseNotesSeen:e.VERSION}}function _temp2(e){return e.effortValue}function _temp(e){return e.agent}
@@ -1 +1 @@
1
- import{MACRO as r}from"../../recovery/bunBundleShim.js";import{jsx as e,jsxs as o}from"react/jsx-runtime";import{Box as i,Text as n}from"../../ink.js";import{Clawd as d}from"./Clawd.js";export function WelcomeV2(){return e(i,{flexDirection:"column",width:54,children:o(i,{borderStyle:"round",borderColor:"claude",paddingX:3,paddingY:1,flexDirection:"column",alignItems:"center",children:[e(n,{color:"claude",children:"CTX"}),e(n,{bold:!0,children:"Context Code"}),o(n,{dimColor:!0,children:["v",r.VERSION]}),e(i,{marginTop:1,marginBottom:1,children:e(d,{})}),e(n,{children:"Lee, edita y ejecuta sin perder contexto."}),e(n,{dimColor:!0,children:"Configuracion inicial"})]})})}
1
+ import{MACRO as r}from"../../recovery/bunBundleShim.js";import{jsx as e,jsxs as o}from"react/jsx-runtime";import{Box as i,Text as n}from"../../ink.js";import{Clawd as t}from"./Clawd.js";export function WelcomeV2(){return e(i,{flexDirection:"column",width:54,children:o(i,{borderStyle:"round",borderColor:"context",paddingX:3,paddingY:1,flexDirection:"column",alignItems:"center",children:[e(n,{color:"context",children:"CTX"}),e(n,{bold:!0,children:"Context Code"}),o(n,{dimColor:!0,children:["v",r.VERSION]}),e(i,{marginTop:1,marginBottom:1,children:e(t,{})}),e(n,{children:"Lee, edita y ejecuta sin perder contexto."}),e(n,{dimColor:!0,children:"Configuracion inicial"})]})})}
@@ -1 +1 @@
1
- import{feature as e}from"../../recovery/bunBundleShim.js";import{jsxs as t,jsx as o}from"react/jsx-runtime";import{createRequire as r}from"module";const s=r(import.meta.url);import{c as i}from"react/compiler-runtime";const n=e("COORDINATOR_MODE")?s("../../coordinator/coordinatorMode.js"):void 0;import{Box as a,Text as l,Link as c}from"../../ink.js";import m from"figures";import{useEffect as u,useMemo as d,useRef as h,useState as p,useSyncExternalStore as f}from"react";import{isVimModeEnabled as g}from"./utils.js";import{useShortcutDisplay as S}from"../../keybindings/useShortcutDisplay.js";import{isDefaultMode as k,permissionModeSymbol as C,permissionModeTitle as v,getModeColor as j}from"../../utils/permissions/PermissionMode.js";import{BackgroundTaskStatus as O}from"../tasks/BackgroundTaskStatus.js";import{isBackgroundTask as E}from"../../tasks/types.js";import{isPanelAgentTask as b}from"../../tasks/LocalAgentTask/LocalAgentTask.js";import{getVisibleAgentTasks as y}from"../CoordinatorAgentStatus.js";import{count as I}from"../../utils/array.js";import{shouldHideTasksFooter as x}from"../tasks/taskStatusUtils.js";import{isAgentSwarmsEnabled as T}from"../../utils/agentSwarmsEnabled.js";import{TeamStatus as w}from"../teams/TeamStatus.js";import{isInProcessEnabled as M}from"../../utils/swarm/backends/registry.js";import{useAppState as P,useAppStateStore as _}from"../../state/AppState.js";import{getIsRemoteMode as D}from"../../bootstrap/state.js";import V from"./HistorySearchInput.js";import{usePrStatus as A}from"../../hooks/usePrStatus.js";import{KeyboardShortcutHint as F}from"../design-system/KeyboardShortcutHint.js";import{Byline as R}from"../design-system/Byline.js";import{useTerminalSize as H}from"../../hooks/useTerminalSize.js";import{useTasksV2 as L}from"../../hooks/useTasksV2.js";import{formatDuration as U}from"../../utils/format.js";import{VoiceWarmupHint as N}from"./VoiceIndicator.js";import{useVoiceEnabled as B}from"../../hooks/useVoiceEnabled.js";import{useVoiceState as Y}from"../../context/voice.js";import{isFullscreenEnvEnabled as K}from"../../utils/fullscreen.js";import{isXtermJs as Q}from"../../ink/terminal.js";import{useHasSelection as z,useSelection as G}from"../../ink/hooks/use-selection.js";import{getGlobalConfig as W,saveGlobalConfig as q}from"../../utils/config.js";import{getPlatform as J}from"../../utils/platform.js";import{PrBadge as X}from"../PrBadge.js";const Z=e("PROACTIVE")||e("KAIROS")?s("../../proactive/index.js"):null,NO_OP_SUBSCRIBE=e=>()=>{},NULL=()=>null;function ProactiveCountdown(){const e=i(7),o=f(Z?.subscribeToProactiveChanges??NO_OP_SUBSCRIBE,Z?.getNextTickAt??NULL,NULL),[r,s]=p(null);let n,a;if(e[0]!==o?(n=()=>{if(null===o)return void s(null);const update=function(){const e=Math.max(0,Math.ceil((o-Date.now())/1e3));s(e)};update();const e=setInterval(update,1e3);return()=>clearInterval(e)},a=[o],e[0]=o,e[1]=n,e[2]=a):(n=e[1],a=e[2]),u(n,a),null===r)return null;const c=1e3*r;let m,d;return e[3]!==c?(m=U(c,{mostSignificantOnly:!0}),e[3]=c,e[4]=m):m=e[4],e[5]!==m?(d=t(l,{dimColor:!0,children:["esperando"," ",m]}),e[5]=m,e[6]=d):d=e[6],d}export function PromptInputFooterLeftSide(e){const r=i(27),{exitMessage:s,vimMode:n,mode:c,toolPermissionContext:m,suppressHint:u,isLoading:d,tasksSelected:h,teamsSelected:p,tmuxSelected:f,teammateFooterIndex:S,isPasting:k,isSearching:C,historyQuery:v,setHistoryQuery:j,historyFailedMatch:O,onOpenTasksDialog:E}=e;if(s.show){let e;return r[0]!==s.key?(e=t(l,{dimColor:!0,children:["Presiona ",s.key," de nuevo para salir"]},"exit-message"),r[0]=s.key,r[1]=e):e=r[1],e}if(k){let e;return r[2]===Symbol.for("react.memo_cache_sentinel")?(e=o(l,{dimColor:!0,children:"Pegando texto…"},"pasting-message"),r[2]=e):e=r[2],e}let b;r[3]!==C||r[4]!==n?(b=g()&&"INSERT"===n&&!C,r[3]=C,r[4]=n,r[5]=b):b=r[5];const y=b;let I,x;r[6]!==O||r[7]!==v||r[8]!==C||r[9]!==j?(I=C&&o(V,{value:v,onChange:j,historyFailedMatch:O}),r[6]=O,r[7]=v,r[8]=C,r[9]=j,r[10]=I):I=r[10],r[11]!==y?(x=y?o(l,{dimColor:!0,children:"-- INSERT --"},"vim-insert"):null,r[11]=y,r[12]=x):x=r[12];const T=!u&&!y;let w,M;return r[13]!==d||r[14]!==c||r[15]!==E||r[16]!==T||r[17]!==h||r[18]!==S||r[19]!==p||r[20]!==f||r[21]!==m?(w=o(ModeIndicator,{mode:c,toolPermissionContext:m,showHint:T,isLoading:d,tasksSelected:h,teamsSelected:p,teammateFooterIndex:S,tmuxSelected:f,onOpenTasksDialog:E}),r[13]=d,r[14]=c,r[15]=E,r[16]=T,r[17]=h,r[18]=S,r[19]=p,r[20]=f,r[21]=m,r[22]=w):w=r[22],r[23]!==I||r[24]!==x||r[25]!==w?(M=t(a,{justifyContent:"flex-start",gap:1,children:[I,x,w]}),r[23]=I,r[24]=x,r[25]=w,r[26]=M):M=r[26],M}function ModeIndicator({mode:r,toolPermissionContext:s,showHint:i,isLoading:g,tasksSelected:V,teamsSelected:U,tmuxSelected:$,teammateFooterIndex:ee,onOpenTasksDialog:te}){const{columns:oe}=H(),re=S("chat:cycleMode","Chat","shift+tab"),se=P(e=>e.tasks),ie=P(e=>e.teamContext),ne=_(),[ae]=p(()=>ne.getState().remoteSessionUrl),le=P(e=>e.viewSelectionMode),ce=P(e=>e.viewingAgentTaskId),me=P(e=>e.expandedView),ue="teammates"===me,de=A(g,isPrStatusEnabled()),he=(P(e=>"ant"===process.env.USER_TYPE&&void 0!==e.tungstenActiveSession),f(Z?.subscribeToProactiveChanges??NO_OP_SUBSCRIBE,Z?.getNextTickAt??NULL,NULL)),pe=!!e("VOICE_MODE")&&B(),fe=e("VOICE_MODE")?Y(e=>e.voiceState):"idle",ge=!!e("VOICE_MODE")&&Y(e=>e.voiceWarmingUp),Se=z(),ke=G().getState,Ce=null!==he,ve=!!e("COORDINATOR_MODE")&&!0===n?.isCoordinatorMode(),je=d(()=>I(Object.values(se),e=>E(e)&&!("ant"===process.env.USER_TYPE&&b(e))),[se]),Oe=L(),Ee=void 0!==Oe&&Oe.length>0,be=S("chat:cancel","Chat","esc").toLowerCase(),ye=S("app:toggleTodos","Global","ctrl+t"),Ie=S("chat:killAgents","Chat","ctrl+x ctrl+k"),xe=e("VOICE_MODE")?S("voice:pushToTalk","Chat","Space"):"",[Te]=e("VOICE_MODE")?p(()=>(W().voiceFooterHintSeenCount??0)<3):[!1],we=e("VOICE_MODE")?h(!1):null;u(()=>{if(e("VOICE_MODE")){if(!pe||!Te)return;if(we?.current)return;we&&(we.current=!0);const e=(W().voiceFooterHintSeenCount??0)+1;q(t=>(t.voiceFooterHintSeenCount??0)>=e?t:{...t,voiceFooterHintSeenCount:e})}},[pe,Te]);const Me=P(e=>"kill-agents-confirm"===e.notifications.current?.key),Pe=T()&&!M()&&void 0!==ie&&I(Object.values(ie.teammates),e=>"team-lead"!==e.name)>0;if("bash"===r)return o(l,{color:"bashBorder",children:"! para modo bash"});const _e=s?.mode,De=!k(_e),Ve=ce?se[ce]:void 0,Ae="viewing-agent"===le&&"in_process_teammate"===Ve?.type,Fe=Ae&&null!=Ve&&"running"!==Ve.status,Re=je>0||Ae,He=(ve||De?1:0)+(Re?1:0)+(Pe?1:0),Le=isPrStatusEnabled()&&null!==de.number&&null!==de.reviewState&&null!==de.url&&He<2&&(0===He||oe>=80),Ue=He<2,Ne=!ue&&Re&&Object.values(se).some(e=>"in_process_teammate"===e.type)||!ue&&Ae,Be=_e&&De&&!D()?t(l,{color:j(_e),children:[C(_e)," ",v(_e).toLowerCase()," activado",Ue&&t(l,{dimColor:!0,children:[" ",o(F,{shortcut:re,action:"cambiar",parens:!0})]})]},"mode"):null,Ye=[...ae?[o(c,{url:ae,children:t(l,{color:"ide",children:[m.circleDouble," remoto"]})},"remote")]:[],...(process.env.USER_TYPE,[]),...T()&&Pe?[o(w,{teamsSelected:U,showHint:i&&!Re},"teams")]:[],...Le?[o(X,{number:de.number,url:de.url,reviewState:de.reviewState},"pr-status")]:[]],Ke=Object.values(se).some(e=>"in_process_teammate"===e.type&&"running"===e.status),Qe=Object.values(se).some(e=>"local_agent"===e.type&&"running"===e.status),ze=i?function(e,t,r,s,i,n,a,c,m){let u;if(a)switch(n){case"none":u="mostrar tareas";break;case"tasks":u="mostrar compañeros";break;case"teammates":u="ocultar"}else u="tasks"===n?"ocultar tareas":"mostrar tareas";const d=i||a;return[...e?[o(l,{dimColor:!0,children:o(F,{shortcut:t,action:"interrumpir"})},"esc")]:[],...e||!c||m?[]:[o(l,{dimColor:!0,children:o(F,{shortcut:s,action:"detener agentes"})},"kill-agents")],...d?[o(l,{dimColor:!0,children:o(F,{shortcut:r,action:u})},"toggle-tasks")]:[]]}(!!g,be,ye,Ie,!!Ee,me,!!Ke,!!Qe,!!Me):[];if(Fe?Ye.push(o(l,{dimColor:!0,children:o(F,{shortcut:be,action:"volver al líder"})},"esc-return")):(e("PROACTIVE")||e("KAIROS"))&&Ce?Ye.push(o(ProactiveCountdown,{},"proactive")):!Ne&&i&&Ye.push(...ze),Ne){const e=[...Be?[Be]:[],...Ye,...Fe?[]:ze];return t(a,{flexDirection:"column",children:[o(a,{children:o(O,{tasksSelected:V,isViewingTeammate:Ae,teammateFooterIndex:ee,isLeaderIdle:!g,onOpenDialog:te})}),e.length>0&&o(a,{children:o(R,{children:e})})]})}const Ge="ant"===process.env.USER_TYPE&&y(se).length>0,We=!Re||Ne||x(se,ue)?null:o(O,{tasksSelected:V,isViewingTeammate:Ae,teammateFooterIndex:ee,isLeaderIdle:!g,onOpenDialog:te});0!==Ye.length||We||Be||!i||Ye.push(o(l,{dimColor:!0,children:"? para atajos"},"shortcuts-hint"));const qe=W().copyOnSelect??!0,Je=Se&&(!qe||Q());if(e("VOICE_MODE")&&pe&&ge)Ye.push(o(N,{},"voice-warmup"));else if(K()&&Je){const e="macos"===J(),r=e&&(ke()?.lastPressHadAlt??!1);Ye.push(o(l,{dimColor:!0,children:t(R,{children:[!qe&&o(F,{shortcut:"ctrl+c",action:"copy"}),Q()&&(r?o(l,{children:"ajusta macOptionClickForcesSelection en la configuración de VS Code"}):o(F,{shortcut:e?"option+click":"shift+click",action:"selección nativa"}))]})},"selection-copy"))}else e("VOICE_MODE")&&Ye.length>0&&i&&pe&&"idle"===fe&&0===ze.length&&Te&&Ye.push(t(l,{dimColor:!0,children:["mantén ",xe," para hablar"]},"voice-hint"));return(We||Ge)&&i&&!Pe&&Ye.push(o(l,{dimColor:!0,children:o(F,V?{shortcut:"Enter",action:"ver tareas"}:{shortcut:"↓",action:"gestionar"})},"manage-tasks")),0!==Ye.length||We||Be?t(a,{height:1,overflow:"hidden",children:[Be&&t(a,{flexShrink:0,children:[Be,(We||Ye.length>0)&&o(l,{dimColor:!0,children:" · "})]}),We&&t(a,{flexShrink:0,children:[We,Ye.length>0&&o(l,{dimColor:!0,children:" · "})]}),Ye.length>0&&o(l,{wrap:"truncate",children:o(R,{children:Ye})})]}):K()?o(l,{children:" "}):null}function isPrStatusEnabled(){return W().prStatusFooterEnabled??!0}
1
+ import{feature as e}from"../../recovery/bunBundleShim.js";import{jsxs as t,jsx as o}from"react/jsx-runtime";import{createRequire as r}from"module";const s=r(import.meta.url);import{c as i}from"react/compiler-runtime";const n=e("COORDINATOR_MODE")?s("../../coordinator/coordinatorMode.js"):void 0;import{Box as a,Text as l,Link as c}from"../../ink.js";import m from"figures";import{useEffect as u,useMemo as d,useRef as h,useState as p,useSyncExternalStore as f}from"react";import{isVimModeEnabled as g}from"./utils.js";import{useShortcutDisplay as S}from"../../keybindings/useShortcutDisplay.js";import{isDefaultMode as k,permissionModeSymbol as v,permissionModeTitle as C,getModeColor as j}from"../../utils/permissions/PermissionMode.js";import{BackgroundTaskStatus as O}from"../tasks/BackgroundTaskStatus.js";import{isBackgroundTask as E}from"../../tasks/types.js";import{isPanelAgentTask as b}from"../../tasks/LocalAgentTask/LocalAgentTask.js";import{getVisibleAgentTasks as y}from"../CoordinatorAgentStatus.js";import{count as I}from"../../utils/array.js";import{shouldHideTasksFooter as x}from"../tasks/taskStatusUtils.js";import{isAgentSwarmsEnabled as T}from"../../utils/agentSwarmsEnabled.js";import{TeamStatus as w}from"../teams/TeamStatus.js";import{isInProcessEnabled as M}from"../../utils/swarm/backends/registry.js";import{useAppState as P,useAppStateStore as _}from"../../state/AppState.js";import{getIsRemoteMode as D}from"../../bootstrap/state.js";import V from"./HistorySearchInput.js";import{usePrStatus as A}from"../../hooks/usePrStatus.js";import{KeyboardShortcutHint as F}from"../design-system/KeyboardShortcutHint.js";import{Byline as R}from"../design-system/Byline.js";import{useTerminalSize as H}from"../../hooks/useTerminalSize.js";import{useTasksV2 as L}from"../../hooks/useTasksV2.js";import{formatDuration as U}from"../../utils/format.js";import{VoiceWarmupHint as N}from"./VoiceIndicator.js";import{useVoiceEnabled as B}from"../../hooks/useVoiceEnabled.js";import{useVoiceState as Y}from"../../context/voice.js";import{isFullscreenEnvEnabled as K}from"../../utils/fullscreen.js";import{isXtermJs as Q}from"../../ink/terminal.js";import{useHasSelection as z,useSelection as G}from"../../ink/hooks/use-selection.js";import{getGlobalConfig as W,saveGlobalConfig as q}from"../../utils/config.js";import{getPlatform as J}from"../../utils/platform.js";import{PrBadge as X}from"../PrBadge.js";const Z=e("PROACTIVE")||e("KAIROS")?s("../../proactive/index.js"):null,NO_OP_SUBSCRIBE=e=>()=>{},NULL=()=>null;function ProactiveCountdown(){const e=i(7),o=f(Z?.subscribeToProactiveChanges??NO_OP_SUBSCRIBE,Z?.getNextTickAt??NULL,NULL),[r,s]=p(null);let n,a;if(e[0]!==o?(n=()=>{if(null===o)return void s(null);const update=function(){const e=Math.max(0,Math.ceil((o-Date.now())/1e3));s(e)};update();const e=setInterval(update,1e3);return()=>clearInterval(e)},a=[o],e[0]=o,e[1]=n,e[2]=a):(n=e[1],a=e[2]),u(n,a),null===r)return null;const c=1e3*r;let m,d;return e[3]!==c?(m=U(c,{mostSignificantOnly:!0}),e[3]=c,e[4]=m):m=e[4],e[5]!==m?(d=t(l,{dimColor:!0,children:["esperando"," ",m]}),e[5]=m,e[6]=d):d=e[6],d}export function PromptInputFooterLeftSide(e){const r=i(27),{exitMessage:s,vimMode:n,mode:c,toolPermissionContext:m,suppressHint:u,isLoading:d,tasksSelected:h,teamsSelected:p,tmuxSelected:f,teammateFooterIndex:S,isPasting:k,isSearching:v,historyQuery:C,setHistoryQuery:j,historyFailedMatch:O,onOpenTasksDialog:E}=e;if(s.show){let e;return r[0]!==s.key?(e=t(l,{dimColor:!0,children:["Presiona ",s.key," de nuevo para salir"]},"exit-message"),r[0]=s.key,r[1]=e):e=r[1],e}if(k){let e;return r[2]===Symbol.for("react.memo_cache_sentinel")?(e=o(l,{dimColor:!0,children:"Pegando texto…"},"pasting-message"),r[2]=e):e=r[2],e}let b;r[3]!==v||r[4]!==n?(b=g()&&"INSERT"===n&&!v,r[3]=v,r[4]=n,r[5]=b):b=r[5];const y=b;let I,x;r[6]!==O||r[7]!==C||r[8]!==v||r[9]!==j?(I=v&&o(V,{value:C,onChange:j,historyFailedMatch:O}),r[6]=O,r[7]=C,r[8]=v,r[9]=j,r[10]=I):I=r[10],r[11]!==y?(x=y?o(l,{dimColor:!0,children:"-- INSERT --"},"vim-insert"):null,r[11]=y,r[12]=x):x=r[12];const T=!u&&!y;let w,M;return r[13]!==d||r[14]!==c||r[15]!==E||r[16]!==T||r[17]!==h||r[18]!==S||r[19]!==p||r[20]!==f||r[21]!==m?(w=o(ModeIndicator,{mode:c,toolPermissionContext:m,showHint:T,isLoading:d,tasksSelected:h,teamsSelected:p,teammateFooterIndex:S,tmuxSelected:f,onOpenTasksDialog:E}),r[13]=d,r[14]=c,r[15]=E,r[16]=T,r[17]=h,r[18]=S,r[19]=p,r[20]=f,r[21]=m,r[22]=w):w=r[22],r[23]!==I||r[24]!==x||r[25]!==w?(M=t(a,{justifyContent:"flex-start",gap:1,children:[I,x,w]}),r[23]=I,r[24]=x,r[25]=w,r[26]=M):M=r[26],M}function ModeIndicator({mode:r,toolPermissionContext:s,showHint:i,isLoading:g,tasksSelected:V,teamsSelected:U,tmuxSelected:$,teammateFooterIndex:ee,onOpenTasksDialog:te}){const{columns:oe}=H(),re=S("chat:cycleMode","Chat","shift+tab"),se=P(e=>e.tasks),ie=P(e=>e.teamContext),ne=_(),[ae]=p(()=>ne.getState().remoteSessionUrl),le=P(e=>e.viewSelectionMode),ce=P(e=>e.viewingAgentTaskId),me=P(e=>e.expandedView),ue="teammates"===me,de=A(g,isPrStatusEnabled()),he=(P(e=>"ant"===process.env.USER_TYPE&&void 0!==e.tungstenActiveSession),f(Z?.subscribeToProactiveChanges??NO_OP_SUBSCRIBE,Z?.getNextTickAt??NULL,NULL)),pe=!!e("VOICE_MODE")&&B(),fe=e("VOICE_MODE")?Y(e=>e.voiceState):"idle",ge=!!e("VOICE_MODE")&&Y(e=>e.voiceWarmingUp),Se=z(),ke=G().getState,ve=null!==he,Ce=!!e("COORDINATOR_MODE")&&!0===n?.isCoordinatorMode(),je=d(()=>I(Object.values(se),e=>E(e)&&!("ant"===process.env.USER_TYPE&&b(e))),[se]),Oe=L(),Ee=void 0!==Oe&&Oe.length>0,be=S("chat:cancel","Chat","esc").toLowerCase(),ye=S("app:toggleTodos","Global","ctrl+t"),Ie=S("chat:killAgents","Chat","ctrl+x ctrl+k"),xe=e("VOICE_MODE")?S("voice:pushToTalk","Chat","Space"):"",[Te]=e("VOICE_MODE")?p(()=>(W().voiceFooterHintSeenCount??0)<3):[!1],we=e("VOICE_MODE")?h(!1):null;u(()=>{if(e("VOICE_MODE")){if(!pe||!Te)return;if(we?.current)return;we&&(we.current=!0);const e=(W().voiceFooterHintSeenCount??0)+1;q(t=>(t.voiceFooterHintSeenCount??0)>=e?t:{...t,voiceFooterHintSeenCount:e})}},[pe,Te]);const Me=P(e=>"kill-agents-confirm"===e.notifications.current?.key),Pe=T()&&!M()&&void 0!==ie&&I(Object.values(ie.teammates),e=>"team-lead"!==e.name)>0;if("bash"===r)return o(l,{color:"bashBorder",children:"! para modo bash"});const _e=s?.mode,De=!k(_e),Ve=ce?se[ce]:void 0,Ae="viewing-agent"===le&&"in_process_teammate"===Ve?.type,Fe=Ae&&null!=Ve&&"running"!==Ve.status,Re=je>0||Ae,He=(Ce||De?1:0)+(Re?1:0)+(Pe?1:0),Le=isPrStatusEnabled()&&null!==de.number&&null!==de.reviewState&&null!==de.url&&He<2&&(0===He||oe>=80),Ue=He<2,Ne=!ue&&Re&&Object.values(se).some(e=>"in_process_teammate"===e.type)||!ue&&Ae,Be=_e&&De&&!D()?t(l,{color:j(_e),children:[v(_e)," ",C(_e).toLowerCase()," activado",Ue&&t(l,{dimColor:!0,children:[" ",o(F,{shortcut:re,action:"cambiar",parens:!0})]})]},"mode"):null,Ye=[...ae?[o(c,{url:ae,children:t(l,{color:"ide",children:[m.circleDouble," remoto"]})},"remote")]:[],...(process.env.USER_TYPE,[]),...T()&&Pe?[o(w,{teamsSelected:U,showHint:i&&!Re},"teams")]:[],...Le?[o(X,{number:de.number,url:de.url,reviewState:de.reviewState},"pr-status")]:[]],Ke=Object.values(se).some(e=>"in_process_teammate"===e.type&&"running"===e.status),Qe=Object.values(se).some(e=>"local_agent"===e.type&&"running"===e.status),ze=i?function(e,t,r,s,i,n,a,c,m){let u;if(a)switch(n){case"none":u="mostrar tareas";break;case"tasks":u="mostrar compañeros";break;case"teammates":u="ocultar"}else u="tasks"===n?"ocultar tareas":"mostrar tareas";const d=i||a;return[...e?[o(l,{dimColor:!0,children:o(F,{shortcut:t,action:"interrumpir"})},"esc")]:[],...e||!c||m?[]:[o(l,{dimColor:!0,children:o(F,{shortcut:s,action:"detener agentes"})},"kill-agents")],...d?[o(l,{dimColor:!0,children:o(F,{shortcut:r,action:u})},"toggle-tasks")]:[]]}(!!g,be,ye,Ie,!!Ee,me,!!Ke,!!Qe,!!Me):[];if(Fe?Ye.push(o(l,{dimColor:!0,children:o(F,{shortcut:be,action:"volver al líder"})},"esc-return")):(e("PROACTIVE")||e("KAIROS"))&&ve?Ye.push(o(ProactiveCountdown,{},"proactive")):!Ne&&i&&Ye.push(...ze),Ne){const e=[...Be?[Be]:[],...Ye,...Fe?[]:ze];return t(a,{flexDirection:"column",children:[o(a,{children:o(O,{tasksSelected:V,isViewingTeammate:Ae,teammateFooterIndex:ee,isLeaderIdle:!g,onOpenDialog:te})}),e.length>0&&o(a,{children:o(R,{children:e})})]})}const Ge="ant"===process.env.USER_TYPE&&y(se).length>0,We=!Re||Ne||x(se,ue)?null:o(O,{tasksSelected:V,isViewingTeammate:Ae,teammateFooterIndex:ee,isLeaderIdle:!g,onOpenDialog:te}),qe=W().copyOnSelect??!0,Je=Se&&(!qe||Q());if(e("VOICE_MODE")&&pe&&ge)Ye.push(o(N,{},"voice-warmup"));else if(K()&&Je){const e="macos"===J(),r=e&&(ke()?.lastPressHadAlt??!1);Ye.push(o(l,{dimColor:!0,children:t(R,{children:[!qe&&o(F,{shortcut:"ctrl+c",action:"copy"}),Q()&&(r?o(l,{children:"ajusta macOptionClickForcesSelection en la configuración de VS Code"}):o(F,{shortcut:e?"option+click":"shift+click",action:"selección nativa"}))]})},"selection-copy"))}else e("VOICE_MODE")&&Ye.length>0&&i&&pe&&"idle"===fe&&0===ze.length&&Te&&Ye.push(t(l,{dimColor:!0,children:["mantén ",xe," para hablar"]},"voice-hint"));return(We||Ge)&&i&&!Pe&&Ye.push(o(l,{dimColor:!0,children:o(F,V?{shortcut:"Enter",action:"ver tareas"}:{shortcut:"↓",action:"gestionar"})},"manage-tasks")),0!==Ye.length||We||Be?t(a,{height:1,overflow:"hidden",children:[Be&&t(a,{flexShrink:0,children:[Be,(We||Ye.length>0)&&o(l,{dimColor:!0,children:" · "})]}),We&&t(a,{flexShrink:0,children:[We,Ye.length>0&&o(l,{dimColor:!0,children:" · "})]}),Ye.length>0&&o(l,{wrap:"truncate",children:o(R,{children:Ye})})]}):K()?o(l,{children:" "}):null}function isPrStatusEnabled(){return W().prStatusFooterEnabled??!0}
@@ -1 +1 @@
1
- import{jsxs as o,jsx as r}from"react/jsx-runtime";import{getTotalCost as e,getTotalInputTokens as t,getTotalOutputTokens as i}from"../cost-tracker.js";import{useMainLoopModel as n}from"../hooks/useMainLoopModel.js";import{Box as s,Text as m}from"../ink.js";import{getAPIProvider as l}from"../utils/model/providers.js";import{getCurrentUsage as d}from"../utils/tokens.js";function formatNumber(o){return o>=1e6?`${(o/1e6).toFixed(2)}M`:o>=1e3?`${(o/1e3).toFixed(1)}k`:String(o)}export const SessionTokenFooter=({messages:c})=>{const a=l(),u=n(),f=t(),p=i(),h=d(c),k=h?.input_tokens??0,j=h?.output_tokens??0,x=e(),b="firstParty"===a||"openai"===a||"bedrock"===a||"vertex"===a||"foundry"===a;return r(s,{paddingX:1,children:o(m,{dimColor:!0,children:[a," · ",u||"sin modelo"," ",o(m,{color:"cyan",children:["↑ ",formatNumber(f)]})," / ",o(m,{color:"green",children:["↓ ",formatNumber(p)]})," tokens en esta sesion",h&&o(m,{dimColor:!0,children:[" · ultima respuesta: ",r(m,{color:"cyan",children:formatNumber(k)})," / ",r(m,{color:"green",children:formatNumber(j)})]}),x>0&&o(m,{dimColor:!0,children:[" · ",o(m,{color:"yellow",children:["$",x.toFixed(4)]}),b?"":" (estimado)"]})]})})};
1
+ import{jsxs as o,jsx as r}from"react/jsx-runtime";import{getTotalCost as e,getTotalInputTokens as t,getTotalOutputTokens as i}from"../cost-tracker.js";import{useMainLoopModel as n}from"../hooks/useMainLoopModel.js";import{Box as s,Text as m}from"../ink.js";import{getAPIProvider as l}from"../utils/model/providers.js";import{getCurrentUsage as d}from"../utils/tokens.js";function formatNumber(o){return o>=1e6?`${(o/1e6).toFixed(2)}M`:o>=1e3?`${(o/1e3).toFixed(1)}k`:String(o)}export const SessionTokenFooter=({messages:c})=>{const a=l(),u=n(),f=t(),p=i(),h=d(c),k=h?.input_tokens??0,j=h?.output_tokens??0,x=e(),b="firstParty"===a||"openai"===a||"bedrock"===a||"vertex"===a||"foundry"===a;return r(s,{paddingX:2,children:o(m,{dimColor:!0,children:[a," · ",u||"sin modelo"," ",o(m,{color:"cyan",children:["↑ ",formatNumber(f)]})," / ",o(m,{color:"green",children:["↓ ",formatNumber(p)]})," tokens en esta sesion",h&&o(m,{dimColor:!0,children:[" · ultima respuesta: ",r(m,{color:"cyan",children:formatNumber(k)})," / ",r(m,{color:"green",children:formatNumber(j)})]}),x>0&&o(m,{dimColor:!0,children:[" · ",o(m,{color:"yellow",children:["$",x.toFixed(4)]}),b?"":" (estimado)"]})]})})};
@@ -1 +1 @@
1
- import{feature as e}from"../recovery/bunBundleShim.js";import{jsx as t,jsxs as r,Fragment as n}from"react/jsx-runtime";import{c as o}from"react/compiler-runtime";import{Box as i,Text as s}from"../ink.js";import{useEffect as a,useMemo as l,useRef as c,useState as m}from"react";import{computeGlimmerIndex as d,computeShimmerSegments as u,SHIMMER_INTERVAL_MS as p}from"../bridge/bridgeStatusUtil.js";import{getKairosActive as f,getUserMsgOptIn as h}from"../bootstrap/state.js";import{getFeatureValue_CACHED_MAY_BE_STALE as g}from"../services/analytics/growthbook.js";import{isEnvTruthy as v}from"../utils/envUtils.js";import{count as I}from"../utils/array.js";import j from"lodash-es/sample.js";import{formatDuration as T,formatNumber as b}from"../utils/format.js";import{activityManager as k}from"../utils/activityManager.js";import{getSpinnerVerbs as x}from"../constants/spinnerVerbs.js";import{MessageResponse as S}from"./MessageResponse.js";import{TaskListV2 as w}from"./TaskListV2.js";import{useTasksV2 as C}from"../hooks/useTasksV2.js";import{useAppState as M}from"../state/AppState.js";import{useTerminalSize as R}from"../hooks/useTerminalSize.js";import{stringWidth as _}from"../ink/stringWidth.js";import{getDefaultCharacters as D}from"./Spinner/index.js";import{SpinnerAnimationRow as y}from"./Spinner/SpinnerAnimationRow.js";import{useSettings as A}from"../hooks/useSettings.js";import{isInProcessTeammateTask as O}from"../tasks/InProcessTeammateTask/types.js";import{isBackgroundTask as $}from"../tasks/types.js";import{getAllInProcessTeammateTasks as B}from"../tasks/InProcessTeammateTask/InProcessTeammateTask.js";import{getEffortSuffix as E}from"../utils/effort.js";import{getMainLoopModel as V}from"../utils/model/model.js";import{getViewedTeammateTask as L}from"../state/selectors.js";import{TEARDROP_ASTERISK as U}from"../constants/figures.js";import P from"figures";import{getCurrentTurnTokenBudget as W,getTurnOutputTokens as F}from"../bootstrap/state.js";import{TeammateSpinnerTree as K}from"./Spinner/TeammateSpinnerTree.js";import{useAnimationFrame as q}from"../ink.js";import{getGlobalConfig as z}from"../utils/config.js";const N=D(),G=[...N,...[...N].reverse()];export function SpinnerWithVerb(r){const n=M(e=>e.isBriefOnly),o=M(e=>e.viewingAgentTaskId),i=!(!e("KAIROS")&&!e("KAIROS_BRIEF"))&&l(()=>v(process.env.CONTEXT_CODE_BRIEF)||v(process.env.CLAUDE_CODE_BRIEF),[]);return(e("KAIROS")||e("KAIROS_BRIEF"))&&(f()||h()&&(i||g("tengu_kairos_brief",!1)))&&n&&!o?t(BriefSpinner,{mode:r.mode,overrideMessage:r.overrideMessage}):t(SpinnerWithVerbInner,{...r})}function SpinnerWithVerbInner({mode:n,loadingStartTimeRef:o,totalPausedMsRef:l,pauseStartTimeRef:d,spinnerTip:u,responseLengthRef:p,overrideColor:f,overrideShimmerColor:h,overrideMessage:g,spinnerSuffix:v,verbose:I,hasActiveTools:_=!1,leaderIsIdle:D=!1}){const $=A().prefersReducedMotion??!1,q=M(e=>e.tasks),z=M(e=>e.viewingAgentTaskId),N=M(e=>e.expandedView),G="tasks"===N,X="teammates"===N,H=M(e=>e.selectedIPAgentIndex),J=M(e=>e.viewSelectionMode),Q=z?L({viewingAgentTaskId:z,tasks:q}):void 0,{columns:Y}=R(),Z=C(),[ee,te]=m(null),re=c(null);a(()=>{let e=null,t=null;if("thinking"===n)null===re.current&&(re.current=Date.now(),te("thinking"));else if(null!==re.current){const r=Date.now()-re.current,n=Date.now()-re.current,o=Math.max(0,2e3-n);re.current=null;const showDuration=()=>{te(r),t=setTimeout(te,2e3,null)};o>0?e=setTimeout(showDuration,o):showDuration()}return()=>{e&&clearTimeout(e),t&&clearTimeout(t)}},[n]);const ne=Z?.find(e=>"pending"!==e.status&&"completed"!==e.status),oe=function(e){if(!e)return;const t=e.filter(e=>"pending"===e.status);if(0===t.length)return;const r=new Set(e.filter(e=>"completed"!==e.status).map(e=>e.id));return t.find(e=>!e.blockedBy.some(e=>r.has(e)))??t[0]}(Z),[ie]=m(()=>j(x())),se=g??ne?.activeForm??ne?.subject??ie,ae=(Q&&!Q.isIdle?Q.spinnerVerb??ie:se)+"...";a(()=>{const e="spinner-"+n;return k.startCLIActivity(e),()=>{k.endCLIActivity(e)}},[n]);const le=M(e=>e.effortValue),ce=E(V(),le),me=B(q).filter(e=>"running"===e.status),de=me.length>0,ue=de&&me.every(e=>e.isIdle);let pe=0;if(!X)for(const e of Object.values(q))O(e)&&"running"===e.status&&e.progress?.tokenCount&&(pe+=e.progress.tokenCount);const fe=null!==d.current?d.current-o.current-l.current:Date.now()-o.current-l.current,he=Math.round(p.current/4),ge=f??"claude",ve=h??"claudeShimmer";if(D&&de&&!Q)return r(i,{flexDirection:"column",width:"100%",alignItems:"flex-start",children:[t(i,{flexDirection:"row",flexWrap:"wrap",marginTop:1,width:"100%",children:r(s,{dimColor:!0,children:[U," Inactivo",!ue&&" · companeros ejecutandose"]})}),X&&t(K,{selectedIndex:H,isInSelectionMode:"selecting-agent"===J,allIdle:ue,leaderTokenCount:he,leaderIdleText:"Inactivo"})]});if(Q?.isIdle){const e=ue?`${U} Trabajo durante ${T(Date.now()-Q.startTime)}`:`${U} Inactivo`;return r(i,{flexDirection:"column",width:"100%",alignItems:"flex-start",children:[t(i,{flexDirection:"row",flexWrap:"wrap",marginTop:1,width:"100%",children:t(s,{dimColor:!0,children:e})}),X&&de&&t(K,{selectedIndex:H,isInSelectionMode:"selecting-agent"===J,allIdle:ue,leaderVerb:D?void 0:se,leaderIdleText:D?"Inactivo":void 0,leaderTokenCount:he})]})}const Ie=u;let je=null;if(e("TOKEN_BUDGET")){const e=W();if(null!==e&&e>0){const t=F();if(t>=e)je=`Objetivo: ${b(t)} usados (${b(e)} min ${P.tick})`;else{const r=Math.round(t/e*100),n=fe>5e3&&t>=2e3?t/fe:0,o=n>0?` · ~${T((e-t)/n,{mostSignificantOnly:!0})}`:"";je=`Objetivo: ${b(t)} / ${b(e)} (${r}%)${o}`}}}return r(i,{flexDirection:"column",width:"100%",alignItems:"flex-start",children:[t(y,{mode:n,reducedMotion:$,hasActiveTools:_,responseLengthRef:p,message:ae,messageColor:ge,shimmerColor:ve,overrideColor:f,loadingStartTimeRef:o,totalPausedMsRef:l,pauseStartTimeRef:d,spinnerSuffix:v,verbose:I,columns:Y,hasRunningTeammates:de,teammateTokens:pe,foregroundedTeammate:Q,leaderIsIdle:D,thinkingStatus:ee,effortSuffix:ce}),X&&de?t(K,{selectedIndex:H,isInSelectionMode:"selecting-agent"===J,allIdle:ue,leaderVerb:D?void 0:se,leaderIdleText:D?"Inactivo":void 0,leaderTokenCount:he}):G&&Z&&Z.length>0?t(i,{width:"100%",flexDirection:"column",children:t(S,{children:t(w,{tasks:Z})})}):oe||Ie||je?r(i,{width:"100%",flexDirection:"column",children:[je&&t(S,{children:t(s,{dimColor:!0,children:je})}),(oe||Ie)&&t(S,{children:t(s,{dimColor:!0,children:oe?`Siguiente: ${oe.subject}`:`Consejo: ${Te=Ie,"Double-tap esc to rewind the code and/or conversation to a previous point in time"===Te?"Pulsa dos veces Esc para rebobinar el codigo y/o la conversacion a un punto anterior en el tiempo":"Double-tap esc to rewind the conversation to a previous point in time"===Te?"Pulsa dos veces Esc para rebobinar la conversacion a un punto anterior en el tiempo":"Use /btw to ask a quick side question without interrupting Claude's current work"===Te||"Usa /btw para hacer una pregunta rapida sin interrumpir el trabajo actual de Context"===Te?"Usa /btw para hacer una pregunta rápida sin interrumpir el trabajo actual de Context":"Use /clear to start fresh when switching topics and free up context"===Te?"Usa /clear para empezar de cero al cambiar de tema y liberar contexto":Te}`})})]}):null]});var Te}function BriefSpinner(e){const l=o(31),{mode:c,overrideMessage:f}=e,h=A().prefersReducedMotion??!1,[g]=m(_temp4),v=f??g,I=M(_temp5);let j,T;l[0]!==c?(j=()=>{const e="spinner-"+c;return k.startCLIActivity(e),()=>{k.endCLIActivity(e)}},T=[c],l[0]=c,l[1]=j,l[2]=T):(j=l[1],T=l[2]),a(j,T);const[,b]=q(h?null:120),x=M(_temp6),S="reconnecting"===I||"disconnected"===I,w="reconnecting"===I?"Reconectando":"Desconectado",C=Math.floor(b/300)%3;let D;l[3]!==C||l[4]!==h?(D=h?"… ":".".repeat(C+1).padEnd(3),l[3]=C,l[4]=h,l[5]=D):D=l[5];const y=D;let O;l[6]!==v?(O=_(v),l[6]=v,l[7]=O):O=l[7];const $=O;let B;if(l[8]!==h||l[9]!==S||l[10]!==b||l[11]!==v||l[12]!==$){const e=h||S?-100:d(Math.floor(b/p),$);B=u(v,e),l[8]=h,l[9]=S,l[10]=b,l[11]=v,l[12]=$,l[13]=B}else B=l[13];const{before:E,shimmer:V,after:L}=B,{columns:U}=R(),P=x>0?`${x} en segundo plano`:"";let W;l[14]!==w||l[15]!==S||l[16]!==$?(W=S?_(w):$,l[14]=w,l[15]=S,l[16]=$,l[17]=W):W=l[17];const F=W+3,K=Math.max(1,U-2-F-_(P));let z,N,G;return l[18]!==L||l[19]!==E||l[20]!==w||l[21]!==y||l[22]!==V||l[23]!==S?(z=S?t(s,{color:"error",children:w+y}):r(n,{children:[E?t(s,{dimColor:!0,children:E}):null,V?t(s,{children:V}):null,L?t(s,{dimColor:!0,children:L}):null,t(s,{dimColor:!0,children:y})]}),l[18]=L,l[19]=E,l[20]=w,l[21]=y,l[22]=V,l[23]=S,l[24]=z):z=l[24],l[25]!==K||l[26]!==P?(N=P?r(n,{children:[t(s,{children:" ".repeat(K)}),t(s,{color:"subtle",children:P})]}):null,l[25]=K,l[26]=P,l[27]=N):N=l[27],l[28]!==z||l[29]!==N?(G=r(i,{flexDirection:"row",width:"100%",marginTop:1,paddingLeft:2,children:[z,N]}),l[28]=z,l[29]=N,l[30]=G):G=l[30],G}function _temp6(e){return I(Object.values(e.tasks),$)+e.remoteBackgroundTaskCount}function _temp5(e){return e.remoteConnectionStatus}function _temp4(){return j(x())??"Trabajando"}export function BriefIdleStatus(){const e=o(9),a=M(_temp7),l=M(_temp8),{columns:c}=R(),m="reconnecting"===a||"disconnected"===a?"reconnecting"===a?"Reconectando…":"Desconectado":"",d=l>0?`${l} en segundo plano`:"";if(!m&&!d){let r;return e[0]===Symbol.for("react.memo_cache_sentinel")?(r=t(i,{height:2}),e[0]=r):r=e[0],r}const u=Math.max(1,c-2-_(m)-_(d));let p,f,h;return e[1]!==m?(p=m?t(s,{color:"error",children:m}):null,e[1]=m,e[2]=p):p=e[2],e[3]!==u||e[4]!==d?(f=d?r(n,{children:[t(s,{children:" ".repeat(u)}),t(s,{color:"subtle",children:d})]}):null,e[3]=u,e[4]=d,e[5]=f):f=e[5],e[6]!==p||e[7]!==f?(h=t(i,{marginTop:1,paddingLeft:2,children:r(s,{children:[p,f]})}),e[6]=p,e[7]=f,e[8]=h):h=e[8],h}function _temp8(e){return I(Object.values(e.tasks),$)+e.remoteBackgroundTaskCount}function _temp7(e){return e.remoteConnectionStatus}export function Spinner(){const e=o(8),r=A().prefersReducedMotion??!1,[n,a]=q(r?null:120);if(r){let r,o;return e[0]===Symbol.for("react.memo_cache_sentinel")?(r=t(s,{color:"text",children:"*"}),e[0]=r):r=e[0],e[1]!==n?(o=t(i,{ref:n,flexWrap:"wrap",height:1,width:2,children:r}),e[1]=n,e[2]=o):o=e[2],o}const l=Math.floor(a/120)%G.length,c=G[l];let m,d;return e[3]!==c?(m=t(s,{color:"text",children:c}),e[3]=c,e[4]=m):m=e[4],e[5]!==n||e[6]!==m?(d=t(i,{ref:n,flexWrap:"wrap",height:1,width:2,children:m}),e[5]=n,e[6]=m,e[7]=d):d=e[7],d}
1
+ import{feature as e}from"../recovery/bunBundleShim.js";import{jsx as t,jsxs as r,Fragment as n}from"react/jsx-runtime";import{c as o}from"react/compiler-runtime";import{Box as i,Text as s}from"../ink.js";import{useEffect as a,useMemo as l,useRef as c,useState as m}from"react";import{computeGlimmerIndex as d,computeShimmerSegments as u,SHIMMER_INTERVAL_MS as p}from"../bridge/bridgeStatusUtil.js";import{getKairosActive as f,getUserMsgOptIn as h}from"../bootstrap/state.js";import{getFeatureValue_CACHED_MAY_BE_STALE as g}from"../services/analytics/growthbook.js";import{isEnvTruthy as v}from"../utils/envUtils.js";import{count as I}from"../utils/array.js";import j from"lodash-es/sample.js";import{formatDuration as T,formatNumber as b}from"../utils/format.js";import{activityManager as x}from"../utils/activityManager.js";import{getSpinnerVerbs as k}from"../constants/spinnerVerbs.js";import{MessageResponse as S}from"./MessageResponse.js";import{TaskListV2 as w}from"./TaskListV2.js";import{useTasksV2 as C}from"../hooks/useTasksV2.js";import{useAppState as M}from"../state/AppState.js";import{useTerminalSize as R}from"../hooks/useTerminalSize.js";import{stringWidth as _}from"../ink/stringWidth.js";import{getDefaultCharacters as D}from"./Spinner/index.js";import{SpinnerAnimationRow as y}from"./Spinner/SpinnerAnimationRow.js";import{useSettings as A}from"../hooks/useSettings.js";import{isInProcessTeammateTask as O}from"../tasks/InProcessTeammateTask/types.js";import{isBackgroundTask as $}from"../tasks/types.js";import{getAllInProcessTeammateTasks as B}from"../tasks/InProcessTeammateTask/InProcessTeammateTask.js";import{getEffortSuffix as E}from"../utils/effort.js";import{getMainLoopModel as V}from"../utils/model/model.js";import{getViewedTeammateTask as L}from"../state/selectors.js";import{TEARDROP_ASTERISK as U}from"../constants/figures.js";import P from"figures";import{getCurrentTurnTokenBudget as W,getTurnOutputTokens as F}from"../bootstrap/state.js";import{TeammateSpinnerTree as K}from"./Spinner/TeammateSpinnerTree.js";import{useAnimationFrame as q}from"../ink.js";import{getGlobalConfig as z}from"../utils/config.js";const N=D(),G=[...N,...[...N].reverse()];export function SpinnerWithVerb(r){const n=M(e=>e.isBriefOnly),o=M(e=>e.viewingAgentTaskId),i=!(!e("KAIROS")&&!e("KAIROS_BRIEF"))&&l(()=>v(process.env.CONTEXT_CODE_BRIEF)||v(process.env.CLAUDE_CODE_BRIEF),[]);return(e("KAIROS")||e("KAIROS_BRIEF"))&&(f()||h()&&(i||g("tengu_kairos_brief",!1)))&&n&&!o?t(BriefSpinner,{mode:r.mode,overrideMessage:r.overrideMessage}):t(SpinnerWithVerbInner,{...r})}function SpinnerWithVerbInner({mode:n,loadingStartTimeRef:o,totalPausedMsRef:l,pauseStartTimeRef:d,spinnerTip:u,responseLengthRef:p,overrideColor:f,overrideShimmerColor:h,overrideMessage:g,spinnerSuffix:v,verbose:I,hasActiveTools:_=!1,leaderIsIdle:D=!1}){const $=A().prefersReducedMotion??!1,q=M(e=>e.tasks),z=M(e=>e.viewingAgentTaskId),N=M(e=>e.expandedView),G="tasks"===N,X="teammates"===N,H=M(e=>e.selectedIPAgentIndex),J=M(e=>e.viewSelectionMode),Q=z?L({viewingAgentTaskId:z,tasks:q}):void 0,{columns:Y}=R(),Z=C(),[ee,te]=m(null),re=c(null);a(()=>{let e=null,t=null;if("thinking"===n)null===re.current&&(re.current=Date.now(),te("thinking"));else if(null!==re.current){const r=Date.now()-re.current,n=Date.now()-re.current,o=Math.max(0,2e3-n);re.current=null;const showDuration=()=>{te(r),t=setTimeout(te,2e3,null)};o>0?e=setTimeout(showDuration,o):showDuration()}return()=>{e&&clearTimeout(e),t&&clearTimeout(t)}},[n]);const ne=Z?.find(e=>"pending"!==e.status&&"completed"!==e.status),oe=function(e){if(!e)return;const t=e.filter(e=>"pending"===e.status);if(0===t.length)return;const r=new Set(e.filter(e=>"completed"!==e.status).map(e=>e.id));return t.find(e=>!e.blockedBy.some(e=>r.has(e)))??t[0]}(Z),[ie]=m(()=>j(k())),se=g??ne?.activeForm??ne?.subject??ie,ae=(Q&&!Q.isIdle?Q.spinnerVerb??ie:se)+"...";a(()=>{const e="spinner-"+n;return x.startCLIActivity(e),()=>{x.endCLIActivity(e)}},[n]);const le=M(e=>e.effortValue),ce=E(V(),le),me=B(q).filter(e=>"running"===e.status),de=me.length>0,ue=de&&me.every(e=>e.isIdle);let pe=0;if(!X)for(const e of Object.values(q))O(e)&&"running"===e.status&&e.progress?.tokenCount&&(pe+=e.progress.tokenCount);const fe=null!==d.current?d.current-o.current-l.current:Date.now()-o.current-l.current,he=Math.round(p.current/4),ge=f??"context",ve=h??"contextShimmer";if(D&&de&&!Q)return r(i,{flexDirection:"column",width:"100%",alignItems:"flex-start",children:[t(i,{flexDirection:"row",flexWrap:"wrap",marginTop:1,width:"100%",children:r(s,{dimColor:!0,children:[U," Inactivo",!ue&&" · companeros ejecutandose"]})}),X&&t(K,{selectedIndex:H,isInSelectionMode:"selecting-agent"===J,allIdle:ue,leaderTokenCount:he,leaderIdleText:"Inactivo"})]});if(Q?.isIdle){const e=ue?`${U} Trabajo durante ${T(Date.now()-Q.startTime)}`:`${U} Inactivo`;return r(i,{flexDirection:"column",width:"100%",alignItems:"flex-start",children:[t(i,{flexDirection:"row",flexWrap:"wrap",marginTop:1,width:"100%",children:t(s,{dimColor:!0,children:e})}),X&&de&&t(K,{selectedIndex:H,isInSelectionMode:"selecting-agent"===J,allIdle:ue,leaderVerb:D?void 0:se,leaderIdleText:D?"Inactivo":void 0,leaderTokenCount:he})]})}const Ie=u;let je=null;if(e("TOKEN_BUDGET")){const e=W();if(null!==e&&e>0){const t=F();if(t>=e)je=`Objetivo: ${b(t)} usados (${b(e)} min ${P.tick})`;else{const r=Math.round(t/e*100),n=fe>5e3&&t>=2e3?t/fe:0,o=n>0?` · ~${T((e-t)/n,{mostSignificantOnly:!0})}`:"";je=`Objetivo: ${b(t)} / ${b(e)} (${r}%)${o}`}}}return r(i,{flexDirection:"column",width:"100%",alignItems:"flex-start",children:[t(y,{mode:n,reducedMotion:$,hasActiveTools:_,responseLengthRef:p,message:ae,messageColor:ge,shimmerColor:ve,overrideColor:f,loadingStartTimeRef:o,totalPausedMsRef:l,pauseStartTimeRef:d,spinnerSuffix:v,verbose:I,columns:Y,hasRunningTeammates:de,teammateTokens:pe,foregroundedTeammate:Q,leaderIsIdle:D,thinkingStatus:ee,effortSuffix:ce}),X&&de?t(K,{selectedIndex:H,isInSelectionMode:"selecting-agent"===J,allIdle:ue,leaderVerb:D?void 0:se,leaderIdleText:D?"Inactivo":void 0,leaderTokenCount:he}):G&&Z&&Z.length>0?t(i,{width:"100%",flexDirection:"column",children:t(S,{children:t(w,{tasks:Z})})}):oe||Ie||je?r(i,{width:"100%",flexDirection:"column",children:[je&&t(S,{children:t(s,{dimColor:!0,children:je})}),(oe||Ie)&&t(S,{children:t(s,{dimColor:!0,children:oe?`Siguiente: ${oe.subject}`:`Consejo: ${Te=Ie,"Double-tap esc to rewind the code and/or conversation to a previous point in time"===Te?"Pulsa dos veces Esc para rebobinar el codigo y/o la conversacion a un punto anterior en el tiempo":"Double-tap esc to rewind the conversation to a previous point in time"===Te?"Pulsa dos veces Esc para rebobinar la conversacion a un punto anterior en el tiempo":"Use /btw to ask a quick side question without interrupting Claude's current work"===Te||"Usa /btw para hacer una pregunta rapida sin interrumpir el trabajo actual de Context"===Te?"Usa /btw para hacer una pregunta rápida sin interrumpir el trabajo actual de Context":"Use /clear to start fresh when switching topics and free up context"===Te?"Usa /clear para empezar de cero al cambiar de tema y liberar contexto":Te}`})})]}):null]});var Te}function BriefSpinner(e){const l=o(31),{mode:c,overrideMessage:f}=e,h=A().prefersReducedMotion??!1,[g]=m(_temp4),v=f??g,I=M(_temp5);let j,T;l[0]!==c?(j=()=>{const e="spinner-"+c;return x.startCLIActivity(e),()=>{x.endCLIActivity(e)}},T=[c],l[0]=c,l[1]=j,l[2]=T):(j=l[1],T=l[2]),a(j,T);const[,b]=q(h?null:120),k=M(_temp6),S="reconnecting"===I||"disconnected"===I,w="reconnecting"===I?"Reconectando":"Desconectado",C=Math.floor(b/300)%3;let D;l[3]!==C||l[4]!==h?(D=h?"… ":".".repeat(C+1).padEnd(3),l[3]=C,l[4]=h,l[5]=D):D=l[5];const y=D;let O;l[6]!==v?(O=_(v),l[6]=v,l[7]=O):O=l[7];const $=O;let B;if(l[8]!==h||l[9]!==S||l[10]!==b||l[11]!==v||l[12]!==$){const e=h||S?-100:d(Math.floor(b/p),$);B=u(v,e),l[8]=h,l[9]=S,l[10]=b,l[11]=v,l[12]=$,l[13]=B}else B=l[13];const{before:E,shimmer:V,after:L}=B,{columns:U}=R(),P=k>0?`${k} en segundo plano`:"";let W;l[14]!==w||l[15]!==S||l[16]!==$?(W=S?_(w):$,l[14]=w,l[15]=S,l[16]=$,l[17]=W):W=l[17];const F=W+3,K=Math.max(1,U-2-F-_(P));let z,N,G;return l[18]!==L||l[19]!==E||l[20]!==w||l[21]!==y||l[22]!==V||l[23]!==S?(z=S?t(s,{color:"error",children:w+y}):r(n,{children:[E?t(s,{dimColor:!0,children:E}):null,V?t(s,{children:V}):null,L?t(s,{dimColor:!0,children:L}):null,t(s,{dimColor:!0,children:y})]}),l[18]=L,l[19]=E,l[20]=w,l[21]=y,l[22]=V,l[23]=S,l[24]=z):z=l[24],l[25]!==K||l[26]!==P?(N=P?r(n,{children:[t(s,{children:" ".repeat(K)}),t(s,{color:"subtle",children:P})]}):null,l[25]=K,l[26]=P,l[27]=N):N=l[27],l[28]!==z||l[29]!==N?(G=r(i,{flexDirection:"row",width:"100%",marginTop:1,paddingLeft:2,children:[z,N]}),l[28]=z,l[29]=N,l[30]=G):G=l[30],G}function _temp6(e){return I(Object.values(e.tasks),$)+e.remoteBackgroundTaskCount}function _temp5(e){return e.remoteConnectionStatus}function _temp4(){return j(k())??"Trabajando"}export function BriefIdleStatus(){const e=o(9),a=M(_temp7),l=M(_temp8),{columns:c}=R(),m="reconnecting"===a||"disconnected"===a?"reconnecting"===a?"Reconectando…":"Desconectado":"",d=l>0?`${l} en segundo plano`:"";if(!m&&!d){let r;return e[0]===Symbol.for("react.memo_cache_sentinel")?(r=t(i,{height:2}),e[0]=r):r=e[0],r}const u=Math.max(1,c-2-_(m)-_(d));let p,f,h;return e[1]!==m?(p=m?t(s,{color:"error",children:m}):null,e[1]=m,e[2]=p):p=e[2],e[3]!==u||e[4]!==d?(f=d?r(n,{children:[t(s,{children:" ".repeat(u)}),t(s,{color:"subtle",children:d})]}):null,e[3]=u,e[4]=d,e[5]=f):f=e[5],e[6]!==p||e[7]!==f?(h=t(i,{marginTop:1,paddingLeft:2,children:r(s,{children:[p,f]})}),e[6]=p,e[7]=f,e[8]=h):h=e[8],h}function _temp8(e){return I(Object.values(e.tasks),$)+e.remoteBackgroundTaskCount}function _temp7(e){return e.remoteConnectionStatus}export function Spinner(){const e=o(8),r=A().prefersReducedMotion??!1,[n,a]=q(r?null:120);if(r){let r,o;return e[0]===Symbol.for("react.memo_cache_sentinel")?(r=t(s,{color:"text",children:"*"}),e[0]=r):r=e[0],e[1]!==n?(o=t(i,{ref:n,flexWrap:"wrap",height:1,width:2,children:r}),e[1]=n,e[2]=o):o=e[2],o}const l=Math.floor(a/120)%G.length,c=G[l];let m,d;return e[3]!==c?(m=t(s,{color:"text",children:c}),e[3]=c,e[4]=m):m=e[4],e[5]!==n||e[6]!==m?(d=t(i,{ref:n,flexWrap:"wrap",height:1,width:2,children:m}),e[5]=n,e[6]=m,e[7]=d):d=e[7],d}