@iaforged/context-code 2.4.3 → 2.4.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.
|
@@ -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{runCopilotDeviceLogin as f}from"../../services/oauth/copilotDevice.js";import{clearOAuthTokenCache as h,getAnthropicApiKeyWithSource as v,getAuthTokenSource as w,getClaudeAIOAuthTokens as _,getOpenAIOAuthTokens as x,getOauthAccountInfo as A,removeApiKey as O,saveOpenAIOAuthTokens as E,saveGeminiGoogleOAuthTokens as y,saveProviderApiKey as C,getSubscriptionType as b,isUsing3PServices as j,saveOAuthTokensIfNeeded as P,validateForceLoginOrg as T,removeProviderScopedCredentials as k,removeProviderApiKey as U}from"../../utils/auth.js";import{saveGlobalConfig as $}from"../../utils/config.js";import{logForDebugging as S}from"../../utils/debug.js";import{isRunningOnHomespace as I}from"../../utils/envUtils.js";import{errorMessage as z}from"../../utils/errors.js";import{logError as H}from"../../utils/log.js";import{getAPIProvider as D}from"../../utils/model/providers.js";import{setStoredActiveProviderPreference as L}from"../../utils/model/providerProfilesDb.js";import{isProfiledProvider as N,setActiveProfileForProvider as R}from"../../utils/model/providerProfiles.js";import{getLastUsedProviderProfile as K,removeProviderProfile as W}from"../../utils/model/providerProfiles.js";import{clearProviderBaseUrl as B,setProviderBaseUrl as F}from"../../utils/model/providerBaseUrls.js";import{getInitialSettings as M}from"../../utils/settings/settings.js";import{jsonStringify as X}from"../../utils/slowOperations.js";import{buildAccountProperties as Y,buildAPIProviderProperties as G}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 x.cache?.clear?.();await O();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()}_.cache?.clear?.(),$(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?E(o,l):P(o,l);if(h(),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=M(),c=n.forceLoginMethod?"claudeai"===n.forceLoginMethod:!i,u=n.forceLoginOrgUUID,d=a?.trim().toLowerCase(),h=process.env.CONTEXT_CODE_OAUTH_REFRESH_TOKEN??process.env.CLAUDE_CODE_OAUTH_REFRESH_TOKEN;if(h){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(h,{scopes:o});await installOAuthTokens(e);const i=await T();i.valid||(process.stderr.write(i.message+"\n"),process.exit(1)),$(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){H(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${z(e)}\n${o?o+"\n":""}`),process.exit(1)}}const v=o?"sso":void 0,w=new m;try{if(r("tengu_oauth_flow_start",{loginWithClaudeAi:c}),"gemini-google"===d){const e=await g();y(e),L("gemini-google"),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}"copilot"===d&&(await f(e=>{process.stdout.write(`\nPara conectar GitHub Copilot:\n 1. Abre: ${e.verificationUri}\n 2. Escribe el código: ${e.userCode}\n\nEsperando autorización…\n`)}),L("copilot"),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0));const o="openai"===d?"openai":"anthropic",i="openai"!==o&&c,t=await w.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:v,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){H(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${z(e)}\n${o?o+"\n":""}`),process.exit(1)}finally{w.cleanup()}}export async function authStatus(e){const{source:o,hasToken:i}=w(),{source:t}=v(),r=!!process.env.ANTHROPIC_API_KEY&&!I(),s=D(),a=A(),n=b(),c=j(),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=[...Y(),...G()];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(X(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=D();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&&N(o)&&R(o,t),await C(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&&N(o)&&R(o,t);const r=F(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(N(i)){const e=t||K(i)?.name;if(e){const o=W(i,e);o&&(await k(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 U(o);["ollama","ollama-cloud","lmstudio","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(o)&&B(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{runCopilotDeviceLogin as f}from"../../services/oauth/copilotDevice.js";import{clearOAuthTokenCache as h,getAnthropicApiKeyWithSource as v,getAuthTokenSource as w,getClaudeAIOAuthTokens as _,getOpenAIOAuthTokens as x,getOauthAccountInfo as A,removeApiKey as O,saveOpenAIOAuthTokens as E,saveGeminiGoogleOAuthTokens as y,saveProviderApiKey as C,getSubscriptionType as b,isUsing3PServices as j,saveOAuthTokensIfNeeded as P,validateForceLoginOrg as T,removeProviderScopedCredentials as k,removeProviderApiKey as U}from"../../utils/auth.js";import{saveGlobalConfig as $}from"../../utils/config.js";import{logForDebugging as S}from"../../utils/debug.js";import{isRunningOnHomespace as I}from"../../utils/envUtils.js";import{errorMessage as z}from"../../utils/errors.js";import{logError as H}from"../../utils/log.js";import{getAPIProvider as D}from"../../utils/model/providers.js";import{setStoredActiveProviderPreference as L}from"../../utils/model/providerProfilesDb.js";import{isProfiledProvider as N,setActiveProfileForProvider as R}from"../../utils/model/providerProfiles.js";import{getLastUsedProviderProfile as K,removeProviderProfile as W}from"../../utils/model/providerProfiles.js";import{clearProviderBaseUrl as B,setProviderBaseUrl as F}from"../../utils/model/providerBaseUrls.js";import{getInitialSettings as M}from"../../utils/settings/settings.js";import{jsonStringify as X}from"../../utils/slowOperations.js";import{buildAccountProperties as Y,buildAPIProviderProperties as G}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 x.cache?.clear?.();await O();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()}_.cache?.clear?.(),$(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?"openai":"claude";let g=l;!g&&N(m)&&(g=R(m).id);const f="openai"===s?E(o,g):P(o,g);if(h(),f.warning&&r("tengu_oauth_storage_warning",{warning:f.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=M(),c=n.forceLoginMethod?"claudeai"===n.forceLoginMethod:!i,u=n.forceLoginOrgUUID,d=a?.trim().toLowerCase(),h=process.env.CONTEXT_CODE_OAUTH_REFRESH_TOKEN??process.env.CLAUDE_CODE_OAUTH_REFRESH_TOKEN;if(h){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(h,{scopes:o});await installOAuthTokens(e);const i=await T();i.valid||(process.stderr.write(i.message+"\n"),process.exit(1)),$(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){H(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${z(e)}\n${o?o+"\n":""}`),process.exit(1)}}const v=o?"sso":void 0,w=new m;try{if(r("tengu_oauth_flow_start",{loginWithClaudeAi:c}),"gemini-google"===d){const e=await g();y(e),L("gemini-google"),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0)}"copilot"===d&&(await f(e=>{process.stdout.write(`\nPara conectar GitHub Copilot:\n 1. Abre: ${e.verificationUri}\n 2. Escribe el código: ${e.userCode}\n\nEsperando autorización…\n`)}),L("copilot"),process.stdout.write("Inicio de sesión exitoso.\n"),process.exit(0));const o="openai"===d?"openai":"anthropic",i="openai"!==o&&c,t=await w.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:v,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){H(e);const o=s(e);process.stderr.write(`Error al iniciar sesión: ${z(e)}\n${o?o+"\n":""}`),process.exit(1)}finally{w.cleanup()}}export async function authStatus(e){const{source:o,hasToken:i}=w(),{source:t}=v(),r=!!process.env.ANTHROPIC_API_KEY&&!I(),s=D(),a=A(),n=b(),c=j(),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=[...Y(),...G()];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(X(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=D();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&&N(o)&&R(o,t),await C(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&&N(o)&&R(o,t);const r=F(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(N(i)){const e=t||K(i)?.name;if(e){const o=W(i,e);o&&(await k(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 U(o);["ollama","ollama-cloud","lmstudio","openrouter","gemini-google","zai","minimax","nvidia","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi"].includes(o)&&B(o),process.stdout.write(r?`Proveedor eliminado: ${r}.\n`:`Credenciales/base URL limpiadas para ${o}.\n`),process.exit(0)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MACRO as e,feature as t}from"../recovery/bunBundleShim.js";if(process.env.COREPACK_ENABLE_AUTO_PIN="0",process.env.MAX_THINKING_TOKENS??="0","true"===process.env.CONTEXT_CODE_REMOTE||"true"===process.env.CLAUDE_CODE_REMOTE){const e=process.env.NODE_OPTIONS||"";process.env.NODE_OPTIONS=e?`${e} --max-old-space-size=8192`:"--max-old-space-size=8192"}if(t("ABLATION_BASELINE")&&(process.env.CONTEXT_CODE_ABLATION_BASELINE||process.env.CLAUDE_CODE_ABLATION_BASELINE))for(const e of["CLAUDE_CODE_SIMPLE","CONTEXT_CODE_SIMPLE","CLAUDE_CODE_DISABLE_THINKING","CONTEXT_CODE_DISABLE_THINKING","DISABLE_INTERLEAVED_THINKING","DISABLE_COMPACT","DISABLE_AUTO_COMPACT","CLAUDE_CODE_DISABLE_AUTO_MEMORY","CONTEXT_CODE_DISABLE_AUTO_MEMORY","CLAUDE_CODE_DISABLE_BACKGROUND_TASKS","CONTEXT_CODE_DISABLE_BACKGROUND_TASKS"])process.env[e]??="1";!async function(){const r=process.argv.slice(2);if(1===r.length&&("--version"===r[0]||"-v"===r[0]||"-V"===r[0]))return void console.log(`${e.VERSION} (Context Code)`);const{profileCheckpoint:i}=await import("../utils/startupProfiler.js");if(i("cli_entry"),t("DUMP_SYSTEM_PROMPT")&&"--dump-system-prompt"===r[0]){i("cli_dump_system_prompt_path");const{enableConfigs:e}=await import("../utils/config.js");e();const{getMainLoopModel:t}=await import("../utils/model/model.js"),
|
|
1
|
+
import{MACRO as e,feature as t}from"../recovery/bunBundleShim.js";if(process.env.COREPACK_ENABLE_AUTO_PIN="0",process.env.MAX_THINKING_TOKENS??="0","true"===process.env.CONTEXT_CODE_REMOTE||"true"===process.env.CLAUDE_CODE_REMOTE){const e=process.env.NODE_OPTIONS||"";process.env.NODE_OPTIONS=e?`${e} --max-old-space-size=8192`:"--max-old-space-size=8192"}if(t("ABLATION_BASELINE")&&(process.env.CONTEXT_CODE_ABLATION_BASELINE||process.env.CLAUDE_CODE_ABLATION_BASELINE))for(const e of["CLAUDE_CODE_SIMPLE","CONTEXT_CODE_SIMPLE","CLAUDE_CODE_DISABLE_THINKING","CONTEXT_CODE_DISABLE_THINKING","DISABLE_INTERLEAVED_THINKING","DISABLE_COMPACT","DISABLE_AUTO_COMPACT","CLAUDE_CODE_DISABLE_AUTO_MEMORY","CONTEXT_CODE_DISABLE_AUTO_MEMORY","CLAUDE_CODE_DISABLE_BACKGROUND_TASKS","CONTEXT_CODE_DISABLE_BACKGROUND_TASKS"])process.env[e]??="1";!async function(){const r=process.argv.slice(2);if(1===r.length&&("--version"===r[0]||"-v"===r[0]||"-V"===r[0]))return void console.log(`${e.VERSION} (Context Code)`);const{profileCheckpoint:i}=await import("../utils/startupProfiler.js");if(i("cli_entry"),t("DUMP_SYSTEM_PROMPT")&&"--dump-system-prompt"===r[0]){i("cli_dump_system_prompt_path");const{enableConfigs:e}=await import("../utils/config.js");e();const{getMainLoopModel:t}=await import("../utils/model/model.js"),a=r.indexOf("--model"),s=-1!==a&&r[a+1]||t(),{getSystemPrompt:o}=await import("../constants/prompts.js"),n=await o([],s);return void console.log(n.join("\n"))}if("--claude-in-chrome-mcp"===process.argv[2]){i("cli_claude_in_chrome_mcp_path");const{runClaudeInChromeMcpServer:e}=await import("../utils/claudeInChrome/mcpServer.js");return void await e()}if("--chrome-native-host"===process.argv[2]){i("cli_chrome_native_host_path");const{runChromeNativeHost:e}=await import("../utils/claudeInChrome/chromeNativeHost.js");return void await e()}if(t("CHICAGO_MCP")&&"--computer-use-mcp"===process.argv[2]){i("cli_computer_use_mcp_path");const{runComputerUseMcpServer:e}=await import("../utils/computerUse/mcpServer.js");return void await e()}if("--database-mcp"===process.argv[2]){i("cli_database_mcp_path");const{runDatabaseMcpServer:e}=await import("../utils/databaseMcp/mcpServer.js");return void await e()}if("--meta-mcp"===process.argv[2]){i("cli_meta_mcp_path");const{runMetaMcpServer:e}=await import("../utils/metaMcp/mcpServer.js");return void await e()}if("--ssh-mcp"===process.argv[2]){i("cli_ssh_mcp_path");const{runSshMcpServer:e}=await import("../utils/sshMcp/sshMcpServer.js");return void await e()}if("--remotion-mcp"===process.argv[2]){i("cli_remotion_mcp_path");const{runRemotionMcpServer:e}=await import("../utils/remotionMcp/mcpServer.js");return void await e()}if("--bridge-global-daemon"===process.argv[2]){i("cli_bridge_global_daemon_path");const{runGlobalBridgeDaemon:e}=await import("../bridgeGlobal/daemon.js");return void await e()}if("--headless"===process.argv[2]||"--json-channels"===process.argv[2]){i("cli_headless_channels_path");const{runHeadlessChannelServer:e}=await import("../server/channelServer.js"),t=process.argv.indexOf("--channel-port"),r=-1!==t&&process.argv[t+1]?parseInt(process.argv[t+1]):9878,a=process.argv.includes("--use-websocket")||process.argv.includes("--use-ws");return void await e({port:r,useWs:a})}if(t("DAEMON")&&"--daemon-worker"===r[0]){const{runDaemonWorker:e}=await import("../daemon/workerRegistry.js");return void await e(r[1])}if(t("BRIDGE_MODE")&&("remote-control"===r[0]||"rc"===r[0]||"remote"===r[0]||"sync"===r[0]||"bridge"===r[0])){i("cli_bridge_path");const{enableConfigs:e}=await import("../utils/config.js");e();const{getBridgeDisabledReason:t,checkBridgeMinVersion:a}=await import("../bridge/bridgeEnabled.js"),{BRIDGE_LOGIN_ERROR:s}=await import("../bridge/types.js"),{bridgeMain:o}=await import("../bridge/bridgeMain.js"),{exitWithError:n}=await import("../utils/process.js"),{getClaudeAIOAuthTokens:c}=await import("../utils/auth.js");c()?.accessToken||n(s);const p=await t();p&&n(`Error: ${p}`);const l=a();l&&n(l);const{waitForPolicyLimitsToLoad:m,isPolicyAllowed:_}=await import("../services/policyLimits/index.js");return await m(),_("allow_remote_control")||n("Error: Remote Control is disabled by your organization's policy."),void await o(r.slice(1))}if(t("DAEMON")&&"daemon"===r[0]){i("cli_daemon_path");const{enableConfigs:e}=await import("../utils/config.js");e();const{initSinks:t}=await import("../utils/sinks.js");t();const{daemonMain:a}=await import("../daemon/main.js");return void await a(r.slice(1))}if(t("BG_SESSIONS")&&("ps"===r[0]||"logs"===r[0]||"attach"===r[0]||"kill"===r[0]||r.includes("--bg")||r.includes("--background"))){i("cli_bg_path");const{enableConfigs:e}=await import("../utils/config.js");e();const t=await import("../cli/bg.js");switch(r[0]){case"ps":await t.psHandler(r.slice(1));break;case"logs":await t.logsHandler(r[1]);break;case"attach":await t.attachHandler(r[1]);break;case"kill":await t.killHandler(r[1]);break;default:await t.handleBgFlag(r)}return}if(t("TEMPLATES")&&("new"===r[0]||"list"===r[0]||"reply"===r[0])){i("cli_templates_path");const{templatesMain:e}=await import("../cli/handlers/templateJobs.js");await e(r),process.exit(0)}if(t("BYOC_ENVIRONMENT_RUNNER")&&"environment-runner"===r[0]){i("cli_environment_runner_path");const{environmentRunnerMain:e}=await import("../environment-runner/main.js");return void await e(r.slice(1))}if(t("SELF_HOSTED_RUNNER")&&"self-hosted-runner"===r[0]){i("cli_self_hosted_runner_path");const{selfHostedRunnerMain:e}=await import("../self-hosted-runner/main.js");return void await e(r.slice(1))}if((r.includes("--tmux")||r.includes("--tmux=classic"))&&(r.includes("-w")||r.includes("--worktree")||r.some(e=>e.startsWith("--worktree=")))){i("cli_tmux_worktree_fast_path");const{enableConfigs:e}=await import("../utils/config.js");e();const{isWorktreeModeEnabled:t}=await import("../utils/worktreeModeEnabled.js");if(t()){const{execIntoTmuxWorktree:e}=await import("../utils/worktree.js"),t=await e(r);if(t.handled)return;if(t.error){const{exitWithError:e}=await import("../utils/process.js");e(t.error)}}}1!==r.length||"--update"!==r[0]&&"--upgrade"!==r[0]||(process.argv=[process.argv[0],process.argv[1],"update"]),r.includes("--bare")&&(process.env.CLAUDE_CODE_SIMPLE="1");const{startCapturingEarlyInput:a}=await import("../utils/earlyInput.js");a(),i("cli_before_main_import");const{main:s}=await import("../main.js");i("cli_after_main_import"),await s(),i("cli_after_main_complete")}();
|
package/dist/src/main.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MACRO as e,feature as o}from"./recovery/bunBundleShim.js";import{createRequire as t}from"module";const s=t(import.meta.url);import{profileCheckpoint as i,profileReport as r}from"./utils/startupProfiler.js";i("main_tsx_entry");import{startMdmRawRead as n}from"./utils/settings/mdm/rawRead.js";n();import{ensureKeychainPrefetchCompleted as a,startKeychainPrefetch as c}from"./utils/secureStorage/keychainPrefetch.js";c();import{Command as l,InvalidArgumentError as d,Option as p}from"@commander-js/extra-typings";import m from"chalk";import{readFileSync as u}from"fs";import g from"lodash-es/mapValues.js";import f from"lodash-es/pickBy.js";import h from"lodash-es/uniqBy.js";import{getOauthConfig as v}from"./constants/oauth.js";import{getRemoteSessionUrl as w}from"./constants/product.js";import{getSystemContext as _,getUserContext as C}from"./context.js";import{init as S,initializeTelemetryAfterTrust as y}from"./entrypoints/init.js";import{addToHistory as E}from"./history.js";import{launchRepl as b}from"./replLauncher.js";import{hasGrowthBookEnvOverride as j,initializeGrowthBook as O,refreshGrowthBookAfterAuthChange as T}from"./services/analytics/growthbook.js";import{fetchBootstrapData as P}from"./services/api/bootstrap.js";import{downloadSessionFiles as A,parseFileSpecs as I}from"./services/api/filesApi.js";import{prefetchPassesEligibility as k}from"./services/api/referral.js";import{prefetchOfficialMcpUrls as D}from"./services/mcp/officialRegistry.js";import{isPolicyAllowed as x,loadPolicyLimits as R,refreshPolicyLimits as M,waitForPolicyLimitsToLoad as N}from"./services/policyLimits/index.js";import{loadRemoteManagedSettings as L,refreshRemoteManagedSettings as U}from"./services/remoteManagedSettings/index.js";import{createSyntheticOutputTool as H,isSyntheticOutputToolEnabled as $}from"./tools/SyntheticOutputTool/SyntheticOutputTool.js";import{getTools as B}from"./tools.js";import{canUserConfigureAdvisor as F,getInitialAdvisorSetting as K,isAdvisorEnabled as q,isValidAdvisorModel as V,modelSupportsAdvisor as z}from"./utils/advisor.js";import{isAgentSwarmsEnabled as W}from"./utils/agentSwarmsEnabled.js";import{count as G,uniq as X}from"./utils/array.js";import{installAsciicastRecorder as Y}from"./utils/asciicast.js";import{getSubscriptionType as J,prefetchAwsCredentialsAndBedRockInfoIfSafe as Q,prefetchGcpCredentialsIfSafe as Z,validateForceLoginOrg as ee}from"./utils/auth.js";import{checkHasTrustDialogAccepted as oe,getGlobalConfig as te,getRemoteControlAtStartup as se,isAutoUpdaterDisabled as ie,saveGlobalConfig as re}from"./utils/config.js";import{seedEarlyInput as ne,stopCapturingEarlyInput as ae}from"./utils/earlyInput.js";import{getInitialEffortSetting as ce,parseEffortValue as le}from"./utils/effort.js";import{getInitialFastModeSetting as de,isFastModeEnabled as pe,prefetchFastModeStatus as me,resolveFastModeStatusFromCache as ue}from"./utils/fastMode.js";import{applyConfigEnvironmentVariables as ge}from"./utils/managedEnv.js";import{createSystemMessage as fe,createUserMessage as he}from"./utils/messages.js";import{getPlatform as ve}from"./utils/platform.js";import{getBaseRenderOptions as we}from"./utils/renderOptions.js";import{getSessionIngressAuthToken as _e}from"./utils/sessionIngressAuth.js";import{settingsChangeDetector as Ce}from"./utils/settings/changeDetector.js";import{skillChangeDetector as Se}from"./utils/skills/skillChangeDetector.js";import{jsonParse as ye,writeFileSync_DEPRECATED as Ee}from"./utils/slowOperations.js";import{computeInitialTeamContext as be}from"./utils/swarm/reconnection.js";import{initializeWarningHandler as je}from"./utils/warningHandler.js";import{isWorktreeModeEnabled as Oe}from"./utils/worktreeModeEnabled.js";const getTeammateUtils=()=>s("./utils/teammate.js"),Te=o("COORDINATOR_MODE")?s("./coordinator/coordinatorMode.js"):null,Pe=o("KAIROS")?s("./assistant/index.js"):null,Ae=o("KAIROS")?s("./assistant/gate.js"):null;import{relative as Ie,resolve as ke}from"path";import{isAnalyticsDisabled as De}from"./services/analytics/config.js";import{getFeatureValue_CACHED_MAY_BE_STALE as xe}from"./services/analytics/growthbook.js";import{logEvent as Re}from"./services/analytics/index.js";import{initializeAnalyticsGates as Me}from"./services/analytics/sink.js";import{getOriginalCwd as Ne,setAdditionalDirectoriesForClaudeMd as Le,setIsRemoteMode as Ue,setMainLoopModelOverride as He,setMainThreadAgentType as $e,setTeleportedSessionInfo as Be}from"./bootstrap/state.js";import{filterCommandsForRemoteMode as Fe,getCommands as Ke}from"./commands.js";import{launchAssistantInstallWizard as qe,launchAssistantSessionChooser as Ve,launchInvalidSettingsDialog as ze,launchResumeChooser as We,launchSnapshotUpdateDialog as Ge,launchTeleportRepoMismatchDialog as Xe,launchTeleportResumeWrapper as Ye}from"./dialogLaunchers.js";import{SHOW_CURSOR as Je}from"./ink/termio/dec.js";import{exitWithError as Qe,exitWithMessage as Ze,getRenderContext as eo,renderAndRun as oo,showSetupScreens as to}from"./interactiveHelpers.js";import{initBuiltinPlugins as so}from"./plugins/bundled/index.js";import{checkQuotaStatus as io}from"./services/claudeAiLimits.js";import{getMcpToolsCommandsAndResources as ro,prefetchAllMcpResources as no}from"./services/mcp/client.js";import{VALID_INSTALLABLE_SCOPES as ao,VALID_UPDATE_SCOPES as co}from"./services/plugins/pluginCliCommands.js";import{initBundledSkills as lo}from"./skills/bundled/index.js";import{getActiveAgentsFromList as po,getAgentDefinitionsWithOverrides as mo,isBuiltInAgent as uo,isCustomAgent as go,parseAgentsFromJson as fo}from"./tools/AgentTool/loadAgentsDir.js";import{assertMinVersion as ho}from"./utils/autoUpdater.js";import{setupClaudeInChrome as vo,shouldAutoEnableClaudeInChrome as wo,shouldEnableClaudeInChrome as _o}from"./utils/claudeInChrome/setup.js";import{getContextWindowForModel as Co}from"./utils/context.js";import{loadConversationForResume as So}from"./utils/conversationRecovery.js";import{buildDeepLinkBanner as yo}from"./utils/deepLink/banner.js";import{hasNodeOption as Eo,isBareMode as bo,isEnvTruthy as jo,isInProtectedNamespace as Oo}from"./utils/envUtils.js";import{refreshExampleCommands as To}from"./utils/exampleCommands.js";import{getWorktreePaths as Po}from"./utils/getWorktreePaths.js";import{findGitRoot as Ao,getBranch as Io,getIsGit as ko,getWorktreeCount as Do}from"./utils/git.js";import{getGhAuthStatus as xo}from"./utils/github/ghAuthStatus.js";import{safeParseJSON as Ro}from"./utils/json.js";import{logError as Mo}from"./utils/log.js";import{getModelDeprecationWarning as No}from"./utils/model/deprecation.js";import{getDefaultMainLoopModel as Lo,getUserSpecifiedModelSetting as Uo,normalizeModelStringForAPI as Ho,parseUserSpecifiedModel as $o}from"./utils/model/model.js";import{ensureModelStringsInitialized as Bo}from"./utils/model/modelStrings.js";import{PERMISSION_MODES as Fo}from"./utils/permissions/PermissionMode.js";import{checkAndDisableBypassPermissions as Ko,getAutoModeEnabledStateIfCached as qo,initializeToolPermissionContext as Vo,initialPermissionModeFromCLI as zo,isDefaultPermissionModeAuto as Wo,parseToolListFromCLI as Go,removeDangerousPermissions as Xo,stripDangerousPermissionsForAutoMode as Yo,verifyAutoModeGateAccess as Jo}from"./utils/permissions/permissionSetup.js";import{cleanupOrphanedPluginVersionsInBackground as Qo}from"./utils/plugins/cacheUtils.js";import{initializeVersionedPlugins as Zo}from"./utils/plugins/installedPluginsManager.js";import{getManagedPluginNames as et}from"./utils/plugins/managedPlugins.js";import{getGlobExclusionsForPluginCache as ot}from"./utils/plugins/orphanedPluginFilter.js";import{getPluginSeedDirs as tt}from"./utils/plugins/pluginDirectories.js";import{countFilesRoundedRg as st}from"./utils/ripgrep.js";import{processSessionStartHooks as it,processSetupHooks as rt}from"./utils/sessionStart.js";import{cacheSessionTitle as nt,getSessionIdFromLog as at,loadTranscriptFromFile as ct,saveAgentSetting as lt,saveMode as dt,searchSessionsByCustomTitle as pt,sessionIdExists as mt}from"./utils/sessionStorage.js";import{ensureMdmSettingsLoaded as ut}from"./utils/settings/mdm/settings.js";import{getInitialSettings as gt,getManagedSettingsKeysForLogging as ft,getSettingsForSource as ht,getSettingsWithErrors as vt}from"./utils/settings/settings.js";import{resetSettingsCache as wt}from"./utils/settings/settingsCache.js";import{DEFAULT_TASKS_MODE_TASK_LIST_ID as _t,TASK_STATUSES as Ct}from"./utils/tasks.js";import{logPluginLoadErrors as St,logPluginsEnabledForSession as yt}from"./utils/telemetry/pluginTelemetry.js";import{logSkillsLoaded as Et}from"./utils/telemetry/skillLoadedEvent.js";import{generateTempFilePath as bt}from"./utils/tempfile.js";import{validateUuid as jt}from"./utils/uuid.js";import{registerMcpAddCommand as Ot}from"./commands/mcp/addCommand.js";import{registerMcpXaaIdpCommand as Tt}from"./commands/mcp/xaaIdpCommand.js";import{logPermissionContextForAnts as Pt}from"./services/internalLogging.js";import{fetchClaudeAIMcpConfigsIfEligible as At}from"./services/mcp/claudeai.js";import{clearServerCache as It}from"./services/mcp/client.js";import{areMcpConfigsAllowedWithEnterpriseMcpConfig as kt,dedupClaudeAiMcpServers as Dt,doesEnterpriseMcpConfigExist as xt,filterMcpServersByPolicy as Rt,getClaudeCodeMcpConfigs as Mt,getMcpServerSignature as Nt,parseMcpConfig as Lt,parseMcpConfigFromFilePath as Ut}from"./services/mcp/config.js";import{excludeCommandsByServer as Ht,excludeResourcesByServer as $t}from"./services/mcp/utils.js";import{isXaaEnabled as Bt}from"./services/mcp/xaaIdpLogin.js";import{getRelevantTips as Ft}from"./services/tips/tipRegistry.js";import{logContextMetrics as Kt}from"./utils/api.js";import{CLAUDE_IN_CHROME_MCP_SERVER_NAME as qt,isClaudeInChromeMCPServer as Vt}from"./utils/claudeInChrome/common.js";import{registerCleanup as zt}from"./utils/cleanupRegistry.js";import{eagerParseCliFlag as Wt}from"./utils/cliArgs.js";import{createEmptyAttributionState as Gt}from"./utils/commitAttribution.js";import{countConcurrentSessions as Xt,registerSession as Yt,updateSessionName as Jt}from"./utils/concurrentSessions.js";import{getCwd as Qt}from"./utils/cwd.js";import{logForDebugging as Zt,setHasFormattedOutput as es}from"./utils/debug.js";import{errorMessage as os,getErrnoCode as ts,isENOENT as ss,TeleportOperationError as is,toError as rs}from"./utils/errors.js";import{getFsImplementation as ns,safeResolvePath as as}from"./utils/fsOperations.js";import{gracefulShutdown as cs,gracefulShutdownSync as ls}from"./utils/gracefulShutdown.js";import{setAllHookEventsEnabled as ds}from"./utils/hooks/hookEvents.js";import{refreshModelCapabilities as ps}from"./utils/model/modelCapabilities.js";import{peekForStdinData as ms,writeToStderr as us}from"./utils/process.js";import{setCwd as gs}from"./utils/Shell.js";import{processResumedConversation as fs}from"./utils/sessionRestore.js";import{parseSettingSourcesFlag as hs}from"./utils/settings/constants.js";import{plural as vs}from"./utils/stringUtils.js";import{getInitialMainLoopModel as ws,getIsNonInteractiveSession as _s,getSdkBetas as Cs,getSessionId as Ss,getUserMsgOptIn as ys,setAllowedChannels as Es,setAllowedSettingSources as bs,setChromeFlagOverride as js,setClientType as Os,setCwdState as Ts,setDirectConnectServerUrl as Ps,setFlagSettingsPath as As,setInitialMainLoopModel as Is,setInlinePlugins as ks,setIsInteractive as Ds,setKairosActive as xs,setOriginalCwd as Rs,setQuestionPreviewFormat as Ms,setSdkBetas as Ns,setSessionBypassPermissionsMode as Ls,setSessionPersistenceDisabled as Us,setSessionSource as Hs,setUserMsgOptIn as $s,switchSession as Bs}from"./bootstrap/state.js";const Fs=o("TRANSCRIPT_CLASSIFIER")?s("./utils/permissions/autoModeState.js"):null;import{migrateAutoUpdatesToSettings as Ks}from"./migrations/migrateAutoUpdatesToSettings.js";import{migrateBypassPermissionsAcceptedToSettings as qs}from"./migrations/migrateBypassPermissionsAcceptedToSettings.js";import{migrateEnableAllProjectMcpServersToSettings as Vs}from"./migrations/migrateEnableAllProjectMcpServersToSettings.js";import{migrateFennecToOpus as zs}from"./migrations/migrateFennecToOpus.js";import{migrateLegacyOpusToCurrent as Ws}from"./migrations/migrateLegacyOpusToCurrent.js";import{migrateOpusToOpus1m as Gs}from"./migrations/migrateOpusToOpus1m.js";import{migrateReplBridgeEnabledToRemoteControlAtStartup as Xs}from"./migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.js";import{migrateSonnet1mToSonnet45 as Ys}from"./migrations/migrateSonnet1mToSonnet45.js";import{migrateSonnet45ToSonnet46 as Js}from"./migrations/migrateSonnet45ToSonnet46.js";import{resetAutoModeOptInForDefaultOffer as Qs}from"./migrations/resetAutoModeOptInForDefaultOffer.js";import{resetProToOpusDefault as Zs}from"./migrations/resetProToOpusDefault.js";import{createRemoteSessionConfig as ei}from"./remote/RemoteSessionManager.js";import{createDirectConnectSession as oi,DirectConnectError as ti}from"./server/createDirectConnectSession.js";import{initializeLspServerManager as si}from"./services/lsp/manager.js";import{shouldEnablePromptSuggestion as ii}from"./services/PromptSuggestion/promptSuggestion.js";import{getDefaultAppState as ri,IDLE_SPECULATION_STATE as ni}from"./state/AppStateStore.js";import{onChangeAppState as ai}from"./state/onChangeAppState.js";import{createStore as ci}from"./state/store.js";import{asSessionId as li}from"./types/ids.js";import{filterAllowedSdkBetas as di}from"./utils/betas.js";import{isInBundledMode as pi,isRunningWithBun as mi}from"./utils/bundledMode.js";import{logForDiagnosticsNoPII as ui}from"./utils/diagLogs.js";import{filterExistingPaths as gi,getKnownPathsForRepo as fi}from"./utils/githubRepoPathMapping.js";import{clearPluginCache as hi,loadAllPluginsCacheOnly as vi}from"./utils/plugins/pluginLoader.js";import{migrateChangelogFromConfig as wi}from"./utils/releaseNotes.js";import{SandboxManager as _i}from"./utils/sandbox/sandbox-adapter.js";import{fetchSession as Ci,prepareApiRequest as Si}from"./utils/teleport/api.js";import{checkOutTeleportedSessionBranch as yi,processMessagesForTeleportResume as Ei,teleportToRemoteWithErrorHandling as bi,validateGitState as ji,validateSessionRepository as Oi}from"./utils/teleport.js";import{shouldEnableThinkingByDefault as Ti}from"./utils/thinking.js";import{initUser as Pi,resetUserCache as Ai}from"./utils/user.js";import{getTmuxInstallInstructions as Ii,isTmuxAvailable as ki,parsePRReference as Di}from"./utils/worktree.js";function logSessionTelemetry(){const e=$o(ws()??Lo());Et(Qt(),Co(e,Cs())),vi().then(({enabled:e,errors:o})=>{const t=et();yt(e,t,tt()),St(o,t)}).catch(e=>Mo(e))}function getCertEnvVarTelemetry(){const e={};return process.env.NODE_EXTRA_CA_CERTS&&(e.has_node_extra_ca_certs=!0),(process.env.CONTEXT_CODE_CLIENT_CERT||process.env.CLAUDE_CODE_CLIENT_CERT)&&(e.has_client_cert=!0),Eo("--use-system-ca")&&(e.has_use_system_ca=!0),Eo("--use-openssl-ca")&&(e.has_use_openssl_ca=!0),e}i("main_tsx_imports_loaded"),function(){const e=mi(),o=process.execArgv.some(o=>e?/--inspect(-brk)?/.test(o):/--inspect(-brk)?|--debug(-brk)?/.test(o)),t=process.env.NODE_OPTIONS&&/--inspect(-brk)?|--debug(-brk)?/.test(process.env.NODE_OPTIONS);try{const e=global.require("inspector");return!!e.url()||o||t}catch{return o||t}}()&&process.exit(1);export function startDeferredPrefetches(){jo(process.env.CONTEXT_CODE_EXIT_AFTER_FIRST_RENDER)||jo(process.env.CLAUDE_CODE_EXIT_AFTER_FIRST_RENDER)||bo()||(Pi(),C(),function(){if(_s())return ui("info","prefetch_system_context_non_interactive"),void _();oe()?(ui("info","prefetch_system_context_has_trust"),_()):ui("info","prefetch_system_context_skipped_no_trust")}(),Ft(),!jo(process.env.CLAUDE_CODE_USE_BEDROCK)||jo(process.env.CONTEXT_CODE_SKIP_BEDROCK_AUTH)||jo(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH)||Q(),!jo(process.env.CLAUDE_CODE_USE_VERTEX)||jo(process.env.CONTEXT_CODE_SKIP_VERTEX_AUTH)||jo(process.env.CLAUDE_CODE_SKIP_VERTEX_AUTH)||Z(),st(Qt(),AbortSignal.timeout(3e3),[]),Me(),D(),ps(),Ce.initialize(),bo()||Se.initialize(),import("./commands/login/login.js"))}function eagerLoadSettings(){i("eagerLoadSettings_start");const e=Wt("--settings");e&&function(e){try{const o=e.trim();let t;if(o.startsWith("{")&&o.endsWith("}"))Ro(o)||(process.stderr.write(m.red("Error: Invalid JSON provided to --settings\n")),process.exit(1)),t=bt("claude-settings",".json",{contentHash:o}),Ee(t,o,"utf8");else{const{resolvedPath:o}=as(ns(),e);try{u(o,"utf8")}catch(e){throw ss(e)&&(process.stderr.write(m.red(`Error: Settings file not found: ${o}\n`)),process.exit(1)),e}t=o}As(t),wt()}catch(e){e instanceof Error&&Mo(e),process.stderr.write(m.red(`Error processing settings: ${os(e)}\n`)),process.exit(1)}}(e);const o=Wt("--setting-sources");void 0!==o&&function(e){try{const o=hs(e);bs(o),wt()}catch(e){e instanceof Error&&Mo(e),process.stderr.write(m.red(`Error processing --setting-sources: ${os(e)}\n`)),process.exit(1)}}(o),i("eagerLoadSettings_end")}const xi=o("DIRECT_CONNECT")?{url:void 0,authToken:void 0,dangerouslySkipPermissions:!1}:void 0,Ri=o("KAIROS")?{sessionId:void 0,discover:!1}:void 0,Mi=o("SSH_REMOTE")?{host:void 0,cwd:void 0,permissionMode:void 0,dangerouslySkipPermissions:!1,local:!1,extraCliArgs:[]}:void 0;export async function main(){if(i("main_function_start"),process.env.NoDefaultCurrentDirectoryInExePath="1",je(),process.on("exit",()=>{!function(){const e=process.stderr.isTTY?process.stderr:process.stdout.isTTY?process.stdout:void 0;e?.write(Je)}()}),process.on("SIGINT",()=>{process.argv.includes("-p")||process.argv.includes("--print")||process.exit(0)}),i("main_warning_handler_initialized"),o("DIRECT_CONNECT")){const e=process.argv.slice(2),o=e.findIndex(e=>e.startsWith("cc://")||e.startsWith("cc+unix://"));if(-1!==o&&xi){const t=e[o],{parseConnectUrl:s}=await import("./server/parseConnectUrl.js"),i=s(t);if(xi.dangerouslySkipPermissions=e.includes("--dangerously-skip-permissions"),e.includes("-p")||e.includes("--print")){const s=e.filter((e,t)=>t!==o),i=s.indexOf("--dangerously-skip-permissions");-1!==i&&s.splice(i,1),process.argv=[process.argv[0],process.argv[1],"open",t,...s]}else{xi.url=i.serverUrl,xi.authToken=i.authToken;const t=e.filter((e,t)=>t!==o),s=t.indexOf("--dangerously-skip-permissions");-1!==s&&t.splice(s,1),process.argv=[process.argv[0],process.argv[1],...t]}}}if(o("LODESTONE")){const e=process.argv.indexOf("--handle-uri");if(-1!==e&&process.argv[e+1]){const{enableConfigs:o}=await import("./utils/config.js");o();const t=process.argv[e+1],{handleDeepLinkUri:s}=await import("./utils/deepLink/protocolHandler.js"),i=await s(t);process.exit(i)}if("darwin"===process.platform&&"com.anthropic.claude-code-url-handler"===process.env.__CFBundleIdentifier){const{enableConfigs:e}=await import("./utils/config.js");e();const{handleUrlSchemeLaunch:o}=await import("./utils/deepLink/protocolHandler.js"),t=await o();process.exit(t??1)}}if(o("KAIROS")&&Ri){const e=process.argv.slice(2);if("assistant"===e[0]){const o=e[1];o&&!o.startsWith("-")?(Ri.sessionId=o,e.splice(0,2),process.argv=[process.argv[0],process.argv[1],...e]):o||(Ri.discover=!0,e.splice(0,1),process.argv=[process.argv[0],process.argv[1],...e])}}if(o("SSH_REMOTE")&&Mi){const e=process.argv.slice(2);if("ssh"===e[0]){const o=e.indexOf("--local");-1!==o&&(Mi.local=!0,e.splice(o,1));const t=e.indexOf("--dangerously-skip-permissions");-1!==t&&(Mi.dangerouslySkipPermissions=!0,e.splice(t,1));const s=e.indexOf("--permission-mode");-1!==s&&e[s+1]&&!e[s+1].startsWith("-")&&(Mi.permissionMode=e[s+1],e.splice(s,2));const i=e.findIndex(e=>e.startsWith("--permission-mode="));-1!==i&&(Mi.permissionMode=e[i].split("=")[1],e.splice(i,1));const extractFlag=(o,t={})=>{const s=e.indexOf(o);if(-1!==s){Mi.extraCliArgs.push(t.as??o);const i=e[s+1];t.hasValue&&i&&!i.startsWith("-")?(Mi.extraCliArgs.push(i),e.splice(s,2)):e.splice(s,1)}const i=e.findIndex(e=>e.startsWith(`${o}=`));-1!==i&&(Mi.extraCliArgs.push(t.as??o,e[i].slice(o.length+1)),e.splice(i,1))};extractFlag("-c",{as:"--continue"}),extractFlag("--continue"),extractFlag("--resume",{hasValue:!0}),extractFlag("--model",{hasValue:!0})}if("ssh"===e[0]&&e[1]&&!e[1].startsWith("-")){Mi.host=e[1];let o=2;e[2]&&!e[2].startsWith("-")&&(Mi.cwd=e[2],o=3);const t=e.slice(o);if(t.includes("-p")||t.includes("--print"))return process.stderr.write("Error: el modo sin cabeza (-p/--print) no es compatible con context ssh\n"),void ls(1);process.argv=[process.argv[0],process.argv[1],...t]}}const t=process.argv.slice(2),n=t.includes("-p")||t.includes("--print"),c=t.includes("--init-only"),j=t.some(e=>e.startsWith("--sdk-url")),O=n||c||j||!process.stdout.isTTY;O&&ae();Ds(!O),function(e){if(process.env.CLAUDE_CODE_ENTRYPOINT)return;const o=process.argv.slice(2),t=o.indexOf("mcp");-1===t||"serve"!==o[t+1]?jo(process.env.CONTEXT_CODE_ACTION)||jo(process.env.CLAUDE_CODE_ACTION)?process.env.CLAUDE_CODE_ENTRYPOINT="claude-code-github-action":process.env.CLAUDE_CODE_ENTRYPOINT=e?"sdk-cli":"cli":process.env.CLAUDE_CODE_ENTRYPOINT="mcp"}(O);const D=(()=>{if(jo(process.env.GITHUB_ACTIONS))return"github-action";if("sdk-ts"===process.env.CLAUDE_CODE_ENTRYPOINT)return"sdk-typescript";if("sdk-py"===process.env.CLAUDE_CODE_ENTRYPOINT)return"sdk-python";if("sdk-cli"===process.env.CLAUDE_CODE_ENTRYPOINT)return"sdk-cli";if("claude-vscode"===process.env.CLAUDE_CODE_ENTRYPOINT)return"claude-vscode";if("local-agent"===process.env.CLAUDE_CODE_ENTRYPOINT)return"local-agent";if("claude-desktop"===process.env.CLAUDE_CODE_ENTRYPOINT)return"claude-desktop";const e=process.env.CONTEXT_CODE_SESSION_ACCESS_TOKEN||process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN||process.env.CONTEXT_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR;return"remote"===process.env.CLAUDE_CODE_ENTRYPOINT||e?"remote":"cli"})();Os(D);const Y=process.env.CONTEXT_CODE_QUESTION_PREVIEW_FORMAT??process.env.CLAUDE_CODE_QUESTION_PREVIEW_FORMAT;"markdown"===Y||"html"===Y?Ms(Y):D.startsWith("sdk-")||"claude-desktop"===D||"local-agent"===D||"remote"===D||Ms("markdown"),"bridge"!==process.env.CONTEXT_CODE_ENVIRONMENT_KIND&&"bridge"!==process.env.CLAUDE_CODE_ENVIRONMENT_KIND||Hs("remote-control"),i("main_client_type_determined"),eagerLoadSettings(),i("main_before_run"),await async function(){function createSortedHelpConfig(){const getOptionSortKey=e=>e.long?.replace(/^--/,"")??e.short?.replace(/^-/,"")??"";return Object.assign({sortSubcommands:!0,sortOptions:!0},{compareOptions:(e,o)=>getOptionSortKey(e).localeCompare(getOptionSortKey(o))})}i("run_function_start");const t=(new l).configureHelp(createSortedHelpConfig()).enablePositionalOptions();i("run_commander_initialized"),t.hook("preAction",async e=>{i("preAction_start"),await Promise.all([ut(),a()]),i("preAction_after_mdm"),await S(),i("preAction_after_init"),jo(process.env.CONTEXT_CODE_DISABLE_TERMINAL_TITLE)||jo(process.env.CLAUDE_CODE_DISABLE_TERMINAL_TITLE)||(process.title="claude");const{initSinks:t}=await import("./utils/sinks.js");t(),i("preAction_after_sinks");const s=e.getOptionValue("pluginDir");Array.isArray(s)&&s.length>0&&s.every(e=>"string"==typeof e)&&(ks(s),hi("preAction: --plugin-dir inline plugins")),11!==te().migrationVersion&&(Ks(),qs(),Vs(),Zs(),Ys(),Ws(),Js(),Gs(),Xs(),o("TRANSCRIPT_CLASSIFIER")&&Qs(),re(e=>11===e.migrationVersion?e:{...e,migrationVersion:11})),wi().catch(()=>{}),i("preAction_after_migrations"),L(),R(),i("preAction_after_remote_settings"),o("UPLOAD_USER_SETTINGS")&&import("./services/settingsSync/index.js").then(e=>e.uploadUserSettingsInBackground()),i("preAction_after_settings_sync")}),t.name("context").description("Context Code - inicia una sesión interactiva por defecto, usa -p/--print para salida no interactiva").argument("[consulta...]","Tu consulta").helpOption("-h, --help","Muestra la ayuda del comando").option("-d, --debug [filtro]",'Activa el modo de depuración con filtrado opcional de categorías (ej. "api,hooks" o "!1p,!file")',e=>!0).addOption(new p("--debug-to-stderr","Activa el modo de depuración (a stderr)").argParser(Boolean).hideHelp()).option("--debug-file <ruta>","Escribe los logs de depuración en una ruta específica (activa implícitamente el modo de depuración)",()=>!0).option("--verbose","Sobrescribe el ajuste de modo detallado de la configuración",()=>!0).option("-p, --print","Imprime la respuesta y sale (útil para tuberías). Nota: El diálogo de confianza del espacio de trabajo se omite cuando se ejecuta con el modo -p. Solo usa esta bandera en directorios en los que confíes.",()=>!0).option("--bare","Modo mínimo: omite hooks, LSP, sincronización de plugins, atribución, auto-memoria, prefetches de fondo, lecturas de llavero y auto-descubrimiento de CLAUDE.md. Establece CLAUDE_CODE_SIMPLE=1. La autenticación de Anthropic es estrictamente ANTHROPIC_API_KEY o apiKeyHelper a través de --settings (OAuth y el llavero nunca se leen). Los proveedores 3P (Bedrock/Vertex/Foundry) usan sus propias credenciales. Las habilidades aún se resuelven a través de /nombre-habilidad. Proporciona contexto explícitamente a través de: --system-prompt[-file], --append-system-prompt[-file], --add-dir (directorios CLAUDE.md), --mcp-config, --settings, --agents, --plugin-dir.",()=>!0).addOption(new p("--init","Ejecuta los hooks de configuración con el disparador init, luego continúa").hideHelp()).addOption(new p("--init-only","Ejecuta los hooks de configuración y SessionStart:startup, luego sale").hideHelp()).addOption(new p("--maintenance","Ejecuta los hooks de configuración con el disparador de mantenimiento, luego continúa").hideHelp()).addOption(new p("--output-format <formato>",'Formato de salida (solo funciona con --print): "text" (por defecto), "json" (resultado único) o "stream-json" (transmisión en tiempo real)').choices(["text","json","stream-json"])).addOption(new p("--json-schema <esquema>",'Esquema JSON para la validación de salida estructurada. Ejemplo: {"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}').argParser(String)).option("--include-hook-events","Incluye todos los eventos del ciclo de vida del hook en el flujo de salida (solo funciona con --output-format=stream-json)",()=>!0).option("--include-partial-messages","Incluye fragmentos de mensajes parciales a medida que llegan (solo funciona con --print y --output-format=stream-json)",()=>!0).addOption(new p("--input-format <formato>",'Formato de entrada (solo funciona con --print): "text" (por defecto) o "stream-json" (entrada transmitida en tiempo real)').choices(["text","stream-json"])).option("--mcp-debug","[OBSOLETO. Usa --debug en su lugar] Activa el modo de depuración de MCP (muestra errores del servidor MCP)",()=>!0).option("--dangerously-skip-permissions","Omite todas las comprobaciones de permisos. Recomendado solo para sandboxes sin acceso a internet.",()=>!0).option("--allow-dangerously-skip-permissions","Permite omitir todas las comprobaciones de permisos como una opción, sin que esté activado por defecto. Recomendado solo para sandboxes sin acceso a internet.",()=>!0).addOption(new p("--thinking <modo>","Modo de pensamiento: enabled (equivalente a adaptive), disabled").choices(["enabled","adaptive","disabled"]).hideHelp()).addOption(new p("--max-thinking-tokens <tokens>","[OBSOLETO. Usa --thinking en su lugar para modelos más nuevos] Número máximo de tokens de pensamiento (solo funciona con --print)").argParser(Number).hideHelp()).addOption(new p("--max-turns <turnos>","Número máximo de turnos agénticos en modo no interactivo. Esto detendrá la conversación después del número especificado de turnos. (solo funciona con --print)").argParser(Number).hideHelp()).addOption(new p("--max-budget-usd <cantidad>","Cantidad máxima en dólares para gastar en llamadas a la API (solo funciona con --print)").argParser(e=>{const o=Number(e);if(isNaN(o)||o<=0)throw new Error("--max-budget-usd debe ser un número positivo mayor que 0");return o})).addOption(new p("--task-budget <tokens>","Presupuesto de tareas del lado de la API en tokens (output_config.task_budget)").argParser(e=>{const o=Number(e);if(isNaN(o)||o<=0||!Number.isInteger(o))throw new Error("--task-budget debe ser un entero positivo");return o}).hideHelp()).option("--replay-user-messages","Vuelve a emitir los mensajes del usuario desde stdin de vuelta a stdout para confirmación (solo funciona con --input-format=stream-json e --output-format=stream-json)",()=>!0).addOption(new p("--enable-auth-status","Activa los mensajes de estado de autenticación en modo SDK").default(!1).hideHelp()).option("--allowedTools, --allowed-tools <herramientas...>",'Lista de nombres de herramientas permitidas separadas por comas o espacios (ej. "Bash(git:*) Edit")').option("--tools <herramientas...>",'Especifica la lista de herramientas disponibles del conjunto integrado. Usa "" para desactivar todas las herramientas, "default" para usar todas las herramientas, o especifica nombres de herramientas (ej. "Bash,Edit,Read").').option("--disallowedTools, --disallowed-tools <herramientas...>",'Lista de nombres de herramientas denegadas separadas por comas o espacios (ej. "Bash(git:*) Edit")').option("--mcp-config <configs...>","Carga servidores MCP desde archivos JSON o cadenas (separados por espacios)").addOption(new p("--permission-prompt-tool <herramienta>","Herramienta MCP a usar para solicitudes de permisos (solo funciona con --print)").argParser(String).hideHelp()).addOption(new p("--system-prompt <prompt>","Prompt del sistema a usar para la sesión").argParser(String)).addOption(new p("--system-prompt-file <archivo>","Lee el prompt del sistema desde un archivo").argParser(String).hideHelp()).addOption(new p("--append-system-prompt <prompt>","Añade un prompt del sistema al prompt del sistema predeterminado").argParser(String)).addOption(new p("--append-system-prompt-file <archivo>","Lee un prompt del sistema desde un archivo y lo añade al prompt del sistema predeterminado").argParser(String).hideHelp()).addOption(new p("--permission-mode <modo>","Modo de permisos a usar para la sesión").argParser(String).choices(Fo)).option("-c, --continue","Continúa la conversación más reciente en el directorio actual",()=>!0).option("-r, --resume [valor]","Reanuda una conversación por ID de sesión, o abre el selector interactivo con un término de búsqueda opcional",e=>e||!0).option("--fork-session","Al reanudar, protege el ID de sesión original creando uno nuevo (úsalo con --resume o --continue)",()=>!0).addOption(new p("--prefill <texto>","Rellena previamente la entrada del prompt con texto sin enviarlo").hideHelp()).addOption(new p("--deep-link-origin","Señala que esta sesión se inició desde un enlace profundo").hideHelp()).addOption(new p("--deep-link-repo <slug>","Repositorio al que se resolvió el enlace profundo en el cwd actual").hideHelp()).addOption(new p("--deep-link-last-fetch <ms>","mtime de FETCH_HEAD en ms, precalculado por el enlace profundo").argParser(e=>{const o=Number(e);return Number.isFinite(o)?o:void 0}).hideHelp()).option("--from-pr [valor]","Reanuda una sesión vinculada a un PR, o abre el selector interactivo",e=>e||!0).option("--no-session-persistence","Desactiva la persistencia de sesión: las sesiones no se guardarán en disco (solo con --print)").addOption(new p("--resume-session-at <id mensaje>","Al reanudar, solo incluye mensajes hasta el ID especificado (usa con --resume en modo print)").argParser(String).hideHelp()).addOption(new p("--rewind-files <id-mensaje>","Restaura archivos al estado del mensaje especificado y sale (requiere --resume)").hideHelp()).option("--model <modelo>","Modelo para la sesión. Usa un alias (ej. 'sonnet') o el nombre completo (ej. 'claude-sonnet-4-6').").addOption(new p("--effort <level>","Nivel de esfuerzo (low, medium, high, max)").argParser(e=>{const o=e.toLowerCase(),t=["low","medium","high","max"];if(!t.includes(o))throw new d(`Debe ser uno de: ${t.join(", ")}`);return o})).option("--agent <agente>","Agente para la sesión. Sobrescribe el ajuste 'agent'.").option("--betas <betas...>","Encabezados beta para peticiones API (solo usuarios con API key)").option("--fallback-model <modelo>","Habilita el cambio automático al modelo especificado si el principal está saturado (solo con --print)").addOption(new p("--workload <tag>","Etiqueta de carga para atribución de facturación. Solo para uso interno. (solo con --print)").hideHelp()).option("--settings <archivo-o-json>","Ruta a un archivo JSON de ajustes o cadena JSON").option("--add-dir <directorios...>","Directorios adicionales permitidos para las herramientas").option("--ide","Conecta automáticamente al IDE al iniciar si hay uno disponible",()=>!0).option("--strict-mcp-config","Solo usa servidores MCP de --mcp-config",()=>!0).option("--session-id <uuid>","Usa un ID de sesión específico (debe ser un UUID válido)").option("-n, --name <nombre>","Establece un nombre para esta sesión (se muestra en /resume y en el título)").option("--agents <json>","Objeto JSON definiendo agentes personalizados").option("--setting-sources <fuentes>","Lista de fuentes de ajustes a cargar (user, project, local) separadas por comas.").option("--plugin-dir <ruta>","Carga plugins desde un directorio (repetible: --plugin-dir A --plugin-dir B)",(e,o)=>[...o,e],[]).option("--disable-slash-commands","Desactiva todas las habilidades",()=>!0).option("--chrome","Habilita la integración de Claude en Chrome").option("--no-chrome","Desactiva la integración de Claude en Chrome").option("--chrome-anty","Habilita la extensión Antigravity Browser Extension").option("--file <especificaciones...>","Recursos de archivos a descargar al inicio. Formato: id_archivo:ruta_relativa (ej., --file file_abc:doc.txt)").action(async(t,r)=>{let n=Array.isArray(t)?t.join(" "):t;i("action_handler_start"),r.bare&&(process.env.CLAUDE_CODE_SIMPLE="1"),"code"===n&&(Re("tengu_code_prompt_ignored",{}),console.warn(m.yellow("Tip: You can launch Context Code with just `context`")),n=void 0),n&&"string"==typeof n&&!/\s/.test(n)&&n.length>0&&Re("tengu_single_word_prompt",{length:n.length});let a,c=!1;if(o("KAIROS")&&r.assistant&&Pe&&Pe.markAssistantForced(),o("KAIROS")&&Pe?.isAssistantMode()&&!r.agentId&&Ae)if(oe()){if(c=Pe.isAssistantForced()||await Ae.isKairosEnabled(),c){r.brief=!0,xs(!0),a=await Pe.initializeAssistantTeam()}}else console.warn(m.yellow("Assistant mode disabled: directory is not trusted. Accept the trust dialog and restart."));const{debug:l=!1,debugToStderr:d=!1,dangerouslySkipPermissions:p,allowDangerouslySkipPermissions:S=!1,tools:j=[],allowedTools:O=[],disallowedTools:D=[],mcpConfig:R=[],permissionMode:L,addDir:Y=[],fallbackModel:Q,betas:Z=[],ide:ae=!1,sessionId:we,includeHookEvents:Ce,includePartialMessages:Se}=r;let Ee;r.prefill&&ne(r.prefill);const je=r.agents,Ie=r.agent;o("BG_SESSIONS")&&Ie&&(process.env.CONTEXT_CODE_AGENT=Ie,process.env.CLAUDE_CODE_AGENT=Ie);let Me=r.outputFormat,Je=r.inputFormat,ao=r.verbose??te().verbose,co=r.print;const Co=r.init??!1,Eo=r.initOnly??!1,Ao=r.maintenance??!1,Fo=r.disableSlashCommands||!1,qo=!1,Xo=qo?"string"==typeof qo?qo:_t:void 0;const et=Oe()?r.worktree:void 0;let tt="string"==typeof et?et:void 0;const st=void 0!==et;let ct;if(tt){const e=Di(tt);null!==e&&(ct=e,tt=void 0)}const ut=Oe()&&!0===r.tmux;let wt;if(ut&&(st||(process.stderr.write(m.red("Error: --tmux requires --worktree\n")),process.exit(1)),"windows"===ve()&&(process.stderr.write(m.red("Error: --tmux is not supported on Windows\n")),process.exit(1)),await ki()||(process.stderr.write(m.red(`Error: tmux is not installed.\n${Ii()}\n`)),process.exit(1))),W()){const e=function(e){if("object"!=typeof e||null===e)return{};const o=e,t=o.teammateMode;return{agentId:"string"==typeof o.agentId?o.agentId:void 0,agentName:"string"==typeof o.agentName?o.agentName:void 0,teamName:"string"==typeof o.teamName?o.teamName:void 0,agentColor:"string"==typeof o.agentColor?o.agentColor:void 0,planModeRequired:"boolean"==typeof o.planModeRequired?o.planModeRequired:void 0,parentSessionId:"string"==typeof o.parentSessionId?o.parentSessionId:void 0,teammateMode:"auto"===t||"tmux"===t||"in-process"===t?t:void 0,agentType:"string"==typeof o.agentType?o.agentType:void 0}}(r);wt=e;const o=e.agentId||e.agentName||e.teamName,t=e.agentId&&e.agentName&&e.teamName;o&&!t&&(process.stderr.write(m.red("Error: --agent-id, --agent-name, and --team-name must all be provided together\n")),process.exit(1)),e.agentId&&e.agentName&&e.teamName&&getTeammateUtils().setDynamicTeamContext?.({agentId:e.agentId,agentName:e.agentName,teamName:e.teamName,color:e.agentColor,planModeRequired:e.planModeRequired??!1,parentSessionId:e.parentSessionId}),e.teammateMode&&s("./utils/swarm/backends/teammateModeSnapshot.js").setCliTeammateModeOverride?.(e.teammateMode)}const Ct=r.sdkUrl??void 0,St=Se||jo(process.env.CONTEXT_CODE_INCLUDE_PARTIAL_MESSAGES)||jo(process.env.CLAUDE_CODE_INCLUDE_PARTIAL_MESSAGES);(Ce||jo(process.env.CONTEXT_CODE_REMOTE)||jo(process.env.CLAUDE_CODE_REMOTE))&&ds(!0),Ct&&(Je||(Je="stream-json"),Me||(Me="stream-json"),void 0===r.verbose&&(ao=!0),r.print||(co=!0));const yt=r.teleport??null,Et=r.remote,bt=!0===Et?"":Et??null,Ot=r.remoteControl??r.rc;let Tt=!1;const Bt="string"==typeof Ot&&Ot.length>0?Ot:void 0;if(we&&(!r.continue&&!r.resume||r.forkSession||(process.stderr.write(m.red("Error: --session-id can only be used with --continue or --resume if --fork-session is also specified.\n")),process.exit(1)),!Ct)){const e=jt(we);e||(process.stderr.write(m.red("Error: Invalid session ID. Must be a valid UUID.\n")),process.exit(1)),mt(e)&&(process.stderr.write(m.red(`Error: Session ID ${e} is already in use.\n`)),process.exit(1))}const Ft=r.file;if(Ft&&Ft.length>0){const e=_e();e||(process.stderr.write(m.red("Error: Session token required for file downloads. CLAUDE_CODE_SESSION_ACCESS_TOKEN must be set.\n")),process.exit(1));const o=process.env.CONTEXT_CODE_REMOTE_SESSION_ID||process.env.CLAUDE_CODE_REMOTE_SESSION_ID||Ss(),t=I(Ft);if(t.length>0){const s={baseUrl:process.env.ANTHROPIC_BASE_URL||v().BASE_API_URL,oauthToken:e,sessionId:o};Ee=A(t,s)}}const Wt=_s();Q&&r.model&&Q===r.model&&(process.stderr.write(m.red("Error: Fallback model cannot be the same as the main model. Please specify a different model for --fallback-model.\n")),process.exit(1));let ss=r.systemPrompt;if(r.systemPromptFile){r.systemPrompt&&(process.stderr.write(m.red("Error: Cannot use both --system-prompt and --system-prompt-file. Please use only one.\n")),process.exit(1));try{const e=ke(r.systemPromptFile);ss=u(e,"utf8")}catch(e){"ENOENT"===ts(e)&&(process.stderr.write(m.red(`Error: System prompt file not found: ${ke(r.systemPromptFile)}\n`)),process.exit(1)),process.stderr.write(m.red(`Error reading system prompt file: ${os(e)}\n`)),process.exit(1)}}let ns=r.appendSystemPrompt;if(r.appendSystemPromptFile){r.appendSystemPrompt&&(process.stderr.write(m.red("Error: Cannot use both --append-system-prompt and --append-system-prompt-file. Please use only one.\n")),process.exit(1));try{const e=ke(r.appendSystemPromptFile);ns=u(e,"utf8")}catch(e){"ENOENT"===ts(e)&&(process.stderr.write(m.red(`Error: Append system prompt file not found: ${ke(r.appendSystemPromptFile)}\n`)),process.exit(1)),process.stderr.write(m.red(`Error reading append system prompt file: ${os(e)}\n`)),process.exit(1)}}if(W()&&wt?.agentId&&wt?.agentName&&wt?.teamName){const e=s("./utils/swarm/teammatePromptAddendum.js").TEAMMATE_SYSTEM_PROMPT_ADDENDUM;ns=ns?`${ns}\n\n${e}`:e}const{mode:as,notification:ps}=zo({permissionModeCli:L,dangerouslySkipPermissions:p});Ls("bypassPermissions"===as),o("TRANSCRIPT_CLASSIFIER")&&(r.enableAutoMode||"auto"===L||"auto"===as||!L&&Wo())&&Fs?.setAutoModeFlagCli(!0);let hs={};if(R&&R.length>0){const e=R.map(e=>e.trim()).filter(e=>e.length>0);let t={};const s=[];for(const o of e){let e=null,i=[];const r=Ro(o);if(r){const o=Lt({configObject:r,filePath:"command line",expandVars:!0,scope:"dynamic"});o.config?e=o.config.mcpServers:i=o.errors}else{const t=ke(o),s=Ut({filePath:t,expandVars:!0,scope:"dynamic"});s.config?e=s.config.mcpServers:i=s.errors}i.length>0?s.push(...i):e&&(t={...t,...e})}if(s.length>0){const e=s.map(e=>`${e.path?e.path+": ":""}${e.message}`).join("\n");Zt(`--mcp-config validation failed (${s.length} errors): ${e}`,{level:"error"}),process.stderr.write(`Error: Invalid MCP configuration:\n${e}\n`),process.exit(1)}if(Object.keys(t).length>0){const e=Object.entries(t).filter(([,e])=>"sdk"!==e.type).map(([e])=>e);let s=null;if(e.some(Vt))s=`Invalid MCP configuration: "${qt}" is a reserved MCP name.`;else if(o("CHICAGO_MCP")){const{isComputerUseMCPServer:o,COMPUTER_USE_MCP_SERVER_NAME:t}=await import("./utils/computerUse/common.js");e.some(o)&&(s=`Invalid MCP configuration: "${t}" is a reserved MCP name.`)}if(!s){const{isComputerControlMCPServer:o,COMPUTER_CONTROL_MCP_SERVER_NAME:t}=await import("./utils/computerControlMcp/common.js");e.some(o)&&(s=`Invalid MCP configuration: "${t}" is a reserved MCP name.`)}s&&(process.stderr.write(`Error: ${s}\n`),process.exit(1));const i=g(t,e=>({...e,scope:"dynamic"})),{allowed:r,blocked:n}=Rt(i);n.length>0&&process.stderr.write(`Warning: MCP ${vs(n.length,"server")} blocked by enterprise policy: ${n.join(", ")}\n`),hs={...hs,...r}}}const Cs=r;Cs.chromeAnty&&(Cs.chrome=!0),js(Cs.chrome);const bs=_o(Cs.chrome),Os=void 0===Cs.chrome&&!bs&&wo();if(bs){const e=ve();try{Re("tengu_claude_in_chrome_setup",{platform:e});const{mcpConfig:o,allowedTools:t,systemPrompt:s}=vo();hs={...hs,...o},O.push(...t),s&&(ns=ns?`${s}\n\n${ns}`:s)}catch(o){Re("tengu_claude_in_chrome_setup_failed",{platform:e}),Zt(`[Context in Chrome] Error: ${o}`),Mo(o),console.error("Error: Failed to run with Context in Chrome."),process.exit(1)}}else if(Os)try{const{mcpConfig:e,allowedTools:o,systemPrompt:t}=vo();hs={...hs,...e},O.push(...o),t&&(ns=ns?`${t}\n\n${ns}`:t)}catch(e){Zt(`[Context in Chrome] Error (auto-enable): ${e}`)}const As=r.strictMcpConfig||!1;if(xt()&&(As&&(process.stderr.write(m.red("You cannot use --strict-mcp-config when an enterprise MCP config is present")),process.exit(1)),hs&&!kt(hs)&&(process.stderr.write(m.red("You cannot dynamically configure MCP servers when an enterprise MCP config is present")),process.exit(1))),o("CHICAGO_MCP")&&"macos"===ve()&&!_s())try{const{getChicagoEnabled:e}=await import("./utils/computerUse/gates.js");if(e()){const{setupComputerUseMCP:e}=await import("./utils/computerUse/setup.js"),{mcpConfig:o,allowedTools:t}=e();hs={...hs,...o},O.push(...t)}}catch(e){Zt(`[Computer Use MCP] Setup failed: ${os(e)}`)}if("darwin"!==process.platform)try{const{setupComputerControlMCP:e}=await import("./utils/computerControlMcp/setup.js"),{mcpConfig:o,allowedTools:t}=e();hs={...hs,...o},O.push(...t)}catch(e){Zt(`[Computer Control MCP] Setup failed: ${os(e)}`)}try{const{setupDatabaseMCP:e}=await import("./utils/databaseMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[Database MCP] Setup failed: ${os(e)}`)}try{const{setupSshMCP:e}=await import("./utils/sshMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[SSH MCP] Setup failed: ${os(e)}`)}try{const{setupSembleMCP:e}=await import("./utils/sembleMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[Semble MCP] Setup failed: ${os(e)}`)}try{const{setupRemotionMcp:e}=await import("./utils/remotionMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[Remotion MCP] Setup failed: ${os(e)}`)}try{const{setupPlaywrightMCP:e,isPlaywrightMcpDisabled:o}=await import("./utils/playwrightMcp/setup.js");if(!o()){const{mcpConfig:o}=e();hs={...hs,...o}}}catch(e){Zt(`[Playwright MCP] Setup failed: ${os(e)}`)}let ks;if(Le(Y),o("KAIROS")||o("KAIROS_CHANNELS")){const parseChannelEntries=(e,o)=>{const t=[],s=[];for(const o of e)if(o.startsWith("plugin:")){const e=o.slice(7),i=e.indexOf("@");i<=0||i===e.length-1?s.push(o):t.push({kind:"plugin",name:e.slice(0,i),marketplace:e.slice(i+1)})}else o.startsWith("server:")&&o.length>7?t.push({kind:"server",name:o.slice(7)}):s.push(o);return s.length>0&&(process.stderr.write(m.red(`${o} entries must be tagged: ${s.join(", ")}\n plugin:<name>@<marketplace> — plugin-provided channel (allowlist enforced)\n server:<name> — manually configured MCP server\n`)),process.exit(1)),t},e=r,o=e.channels,t=e.dangerouslyLoadDevelopmentChannels;let s=[];if(o&&o.length>0&&(s=parseChannelEntries(o,"--channels"),Es(s)),Wt||t&&t.length>0&&(ks=parseChannelEntries(t,"--dangerously-load-development-channels")),s.length>0||(ks?.length??0)>0){const joinPluginIds=e=>{const o=e.flatMap(e=>"plugin"===e.kind?[`${e.name}@${e.marketplace}`]:[]);return o.length>0?o.sort().join(","):void 0};Re("tengu_mcp_channel_flags",{channels_count:s.length,dev_count:ks?.length??0,plugins:joinPluginIds(s),dev_plugins:joinPluginIds(ks??[])})}}if((o("KAIROS")||o("KAIROS_BRIEF"))&&j.length>0){const{BRIEF_TOOL_NAME:e,LEGACY_BRIEF_TOOL_NAME:o}=s("./tools/BriefTool/prompt.js"),{isBriefEntitled:t}=s("./tools/BriefTool/BriefTool.js"),i=Go(j);(i.includes(e)||i.includes(o))&&t()&&$s(!0)}const Ds=await Vo({allowedToolsCli:O,disallowedToolsCli:D,baseToolsCli:j,permissionMode:as,allowDangerouslySkipPermissions:S,addDirs:Y});let Ms=Ds.toolPermissionContext;const{warnings:Hs,dangerousPermissions:Ks,overlyBroadBashPermissions:qs}=Ds;o("TRANSCRIPT_CLASSIFIER")&&Ks.length>0&&(Ms=Yo(Ms)),Hs.forEach(e=>{console.error(e)}),ho();const Vs=!Wt||As||xt()||bo()?Promise.resolve({}):At().then(e=>{const{allowed:o,blocked:t}=Rt(e);return t.length>0&&process.stderr.write(`Warning: claude.ai MCP ${vs(t.length,"server")} blocked by enterprise policy: ${t.join(", ")}\n`),o});Zt("[STARTUP] Loading MCP configs...");const zs=Date.now();let Ws;const Gs=(As||bo()?Promise.resolve({servers:{}}):Mt(hs)).then(e=>(Ws=Date.now()-zs,e));Je&&"text"!==Je&&"stream-json"!==Je&&(console.error(`Error: Invalid input format "${Je}".`),process.exit(1)),"stream-json"===Je&&"stream-json"!==Me&&(console.error("Error: --input-format=stream-json requires output-format=stream-json."),process.exit(1)),Ct&&("stream-json"===Je&&"stream-json"===Me||(console.error("Error: --sdk-url requires both --input-format=stream-json and --output-format=stream-json."),process.exit(1))),r.replayUserMessages&&("stream-json"===Je&&"stream-json"===Me||(console.error("Error: --replay-user-messages requires both --input-format=stream-json and --output-format=stream-json."),process.exit(1))),St&&(Wt&&"stream-json"===Me||(us("Error: --include-partial-messages requires --print and --output-format=stream-json."),process.exit(1))),!1!==r.sessionPersistence||Wt||(us("Error: --no-session-persistence can only be used with --print mode."),process.exit(1));const Xs=n||"";let Ys=await async function(e,o){if(!process.stdin.isTTY&&!process.argv.includes("mcp")){if("stream-json"===o)return process.stdin;process.stdin.setEncoding("utf8");let t="";const onData=e=>{t+=e};process.stdin.on("data",onData);const s=await ms(process.stdin,3e3);return process.stdin.off("data",onData),s&&process.stderr.write("Warning: no stdin data received in 3s, proceeding without it. If piping from a slow command, redirect stdin explicitly: < /dev/null to skip, or wait longer.\n"),[e,t].filter(Boolean).join("\n")}return e}(Xs,Je??"text");i("action_after_input_prompt"),maybeActivateProactive(r);let Js,Qs=B(Ms);if(o("COORDINATOR_MODE")&&(jo(process.env.CONTEXT_CODE_COORDINATOR_MODE)||jo(process.env.CLAUDE_CODE_COORDINATOR_MODE))){const{applyCoordinatorToolFilter:e}=await import("./utils/toolPool.js");Qs=e(Qs)}if(i("action_tools_loaded"),$({isNonInteractiveSession:Wt})&&r.jsonSchema&&(Js=ye(r.jsonSchema)),Js){const e=H(Js);"tool"in e?(Qs=[...Qs,e.tool],Re("tengu_structured_output_enabled",{schema_property_count:Object.keys(Js.properties||{}).length,has_required_fields:Boolean(Js.required)})):Re("tengu_structured_output_failure",{error:"Invalid JSON schema"})}i("action_before_setup"),Zt("[STARTUP] Running setup()...");const Zs=Date.now(),{setup:mi}=await import("./setup.js"),hi=o("UDS_INBOX")?r.messagingSocketPath:void 0,vi=Qt();"local-agent"!==process.env.CLAUDE_CODE_ENTRYPOINT&&(so(),lo());const wi=mi(vi,as,S,st,tt,ut,we?jt(we):void 0,ct,hi),Pi=st?null:Ke(vi),Ni=st?null:mo(vi);Pi?.catch(()=>{}),Ni?.catch(()=>{}),await wi,Zt(`[STARTUP] setup() completed in ${Date.now()-Zs}ms`),i("action_after_setup");let Li=!!r.replayUserMessages;o("UDS_INBOX")&&(Li||"stream-json"!==Me||(Li=!!r.messagingSocketPath)),_s()&&(ge(),_(),C(),Bo());const Ui=r.name?.trim();Ui&&nt(Ui);r.model||process.env.ANTHROPIC_MODEL;const Hi="default"===r.model?Lo():r.model,$i="default"===Q?Lo():Q,Bi=st?Qt():vi;Zt("[STARTUP] Loading commands and agents...");const Fi=Date.now(),withStartupTimeout=async(e,o,t,s)=>{let i,r=!1;try{return await Promise.race([o(),new Promise(e=>{i=setTimeout(()=>{r=!0,e(s)},t)})])}catch(o){return Zt(`[STARTUP] ${e} failed: ${o instanceof Error?o.message:String(o)}. Using fallback.`),s}finally{i&&clearTimeout(i),r&&Zt(`[STARTUP] ${e} timed out after ${t}ms. Using fallback.`)}},Ki={activeAgents:[],allAgents:[]},[qi,Vi]=await Promise.all([Pi??Ke(Bi),withStartupTimeout("agent definitions loading",()=>Ni??mo(Bi),1e4,Ki)]);Zt(`[STARTUP] Commands and agents loaded in ${Date.now()-Fi}ms`),i("action_commands_loaded");let zi=[];if(je)try{const e=Ro(je);e&&(zi=fo(e,"flagSettings"))}catch(e){Mo(e)}const Wi=[...Vi.allAgents,...zi],Gi={...Vi,allAgents:Wi,activeAgents:po(Wi)},Xi=Ie??gt().agent;let Yi;if(Xi&&(Yi=Gi.activeAgents.find(e=>e.agentType===Xi),Yi||Zt(`Warning: agent "${Xi}" not found. Available agents: ${Gi.activeAgents.map(e=>e.agentType).join(", ")}. Using default behavior.`)),$e(Yi?.agentType),Yi&&Re("tengu_agent_flag",{agentType:uo(Yi)?Yi.agentType:"custom",...Ie&&{source:"cli"}}),Yi?.agentType&<(Yi.agentType),Wt&&Yi&&!ss&&!uo(Yi)){const e=Yi.getSystemPrompt();e&&(ss=e)}Yi?.initialPrompt&&("string"==typeof Ys?Ys=Ys?`${Yi.initialPrompt}\n\n${Ys}`:Yi.initialPrompt:Ys||(Ys=Yi.initialPrompt));let Ji=Hi;!Ji&&Yi?.model&&"inherit"!==Yi.model&&(Ji=$o(Yi.model)),He(Ji),Is(Uo()||null);const Qi=ws(),Zi=$o(Qi??Lo());let er,or,tr,sr;if(q()){const e=F()?r.advisor:void 0;if(e){Zt(`[AdvisorTool] --advisor ${e}`),z(Zi)||(process.stderr.write(m.red(`Error: The model "${Zi}" does not support the advisor tool.\n`)),process.exit(1));const o=Ho($o(e));V(o)||(process.stderr.write(m.red(`Error: The model "${e}" cannot be used as an advisor.\n`)),process.exit(1))}er=F()?e??K():e,er&&Zt(`[AdvisorTool] Advisor model: ${er}`)}if(W()&&wt?.agentId&&wt?.agentName&&wt?.teamName&&wt?.agentType){const e=Gi.activeAgents.find(e=>e.agentType===wt.agentType);if(e){let o;if("built-in"===e.source?Zt(`[teammate] Built-in agent ${wt.agentType} - skipping custom prompt (not supported)`):o=e.getSystemPrompt(),e.memory&&Re("tengu_agent_memory_loaded",{scope:e.memory,source:"teammate"}),o){const e=`\n# Custom Agent Instructions\n${o}`;ns=ns?`${ns}\n\n${e}`:e}}else Zt(`[teammate] Custom agent ${wt.agentType} not found in available agents`)}if(maybeActivateBrief(r),(o("KAIROS")||o("KAIROS_BRIEF"))&&!_s()&&!ys()&&"chat"===gt().defaultView){const{isBriefEntitled:e}=s("./tools/BriefTool/BriefTool.js");e()&&$s(!0)}if((o("PROACTIVE")||o("KAIROS"))&&(r.proactive||jo(process.env.CONTEXT_CODE_PROACTIVE)||jo(process.env.CLAUDE_CODE_PROACTIVE))&&!Te?.isCoordinatorMode()){const e=`\n# Proactive Mode\n\nYou are in proactive mode. Take initiative — explore, act, and make progress without waiting for instructions.\n\nStart by briefly greeting the user.\n\nYou will receive periodic <tick> prompts. These are check-ins. Do whatever seems most useful, or call Sleep if there's nothing to do. ${(o("KAIROS")||o("KAIROS_BRIEF"))&&s("./tools/BriefTool/BriefTool.js").isBriefEnabled()?"Call SendUserMessage at checkpoints to mark where things stand.":"The user will see any text you output."}`;ns=ns?`${ns}\n\n${e}`:e}if(o("KAIROS")&&c&&Pe){const e=Pe.getAssistantSystemPromptAddendum();ns=ns?`${ns}\n\n${e}`:e}if(!Wt){const e=eo(!1);tr=e.getFpsMetrics,sr=e.stats;const{createRoot:t}=await import("./ink.js");or=await t(e.renderOptions),Re("tengu_timer",{event:"startup",durationMs:Math.round(1e3*process.uptime())}),Zt("[STARTUP] Running showSetupScreens()...");const s=Date.now(),i=await to(or,as,S,qi,bs,ks);if(Zt(`[STARTUP] showSetupScreens() completed in ${Date.now()-s}ms`),o("BRIDGE_MODE")&&void 0!==Ot){const{getBridgeDisabledReason:e}=await import("./bridge/bridgeEnabled.js"),o=await e();Tt=null===o,o&&process.stderr.write(m.yellow(`${o}\n--rc flag ignored.\n`))}if(o("AGENT_MEMORY_SNAPSHOT")&&Yi&&go(Yi)&&Yi.memory&&Yi.pendingSnapshotUpdate){const e=Yi;if("merge"===await Ge(or,{agentType:e.agentType,scope:e.memory,snapshotTimestamp:e.pendingSnapshotUpdate.snapshotTimestamp})){const{buildMergePrompt:o}=await import("./components/agents/SnapshotUpdateDialog.js"),t=o(e.agentType,e.memory);Ys=Ys?`${t}\n\n${Ys}`:t}e.pendingSnapshotUpdate=void 0}i&&"/login"===n?.trim().toLowerCase()&&(n=""),i&&(U(),M(),Ai(),T(),import("./bridge/trustedDevice.js").then(e=>(e.clearTrustedDeviceToken(),e.enrollTrustedDevice())));const r=await ee();r.valid||await Qe(or,r.message)}if(void 0!==process.exitCode)return void Zt("Graceful shutdown initiated, skipping further initialization");if(si(),!Wt){const{errors:e}=vt(),o=e.filter(e=>!e.mcpErrorMetadata);o.length>0&&await ze(or,{settingsErrors:o,onExit:()=>ls(1)})}const ir=xe("tengu_cicada_nap_ms",0),rr=te().startupPrefetchedAt??0;if(bo()||ir>0&&Date.now()-rr<ir)Zt(`Skipping startup prefetches, last ran ${Math.round((Date.now()-rr)/1e3)}s ago`),ue();else{const e=rr>0?` last ran ${Math.round((Date.now()-rr)/1e3)}s ago`:"";Zt(`Starting background startup prefetches${e}`),io().catch(e=>Mo(e)),P(),k(),xe("tengu_miraculo_the_bard",!1)?ue():me(),ir>0&&re(e=>({...e,startupPrefetchedAt:Date.now()}))}Wt||To();const{servers:nr}=await Gs;Zt(`[STARTUP] MCP configs resolved in ${Ws}ms (awaited at +${Date.now()-zs}ms)`);const ar={...nr,...hs},cr={},lr={};for(const[e,o]of Object.entries(ar)){const t=o;"sdk"===t.type?cr[e]=t:lr[e]=t}i("action_mcp_configs_loaded");const dr=Wt?Promise.resolve({clients:[],tools:[],commands:[]}):no(lr),pr=Wt?Promise.resolve({clients:[],tools:[],commands:[]}):Vs.then(e=>Object.keys(e).length>0?no(e):{clients:[],tools:[],commands:[]}),mr=Promise.all([dr,pr]).then(([e,o])=>({clients:[...e.clients,...o.clients],tools:h([...e.tools,...o.tools],"name"),commands:h([...e.commands,...o.commands],"name")})),ur=Eo||Co||Ao||Wt||r.continue||r.resume?null:it("startup",{agentType:Yi?.agentType,model:Zi}),gr=[];mr.catch(()=>{});const fr=[],hr=[],vr=[];let wr=Ti(),_r=!1!==wr?{type:"adaptive"}:{type:"disabled"};if("adaptive"===r.thinking||"enabled"===r.thinking)wr=!0,_r={type:"adaptive"};else if("disabled"===r.thinking)wr=!1,_r={type:"disabled"};else{const e=process.env.MAX_THINKING_TOKENS?parseInt(process.env.MAX_THINKING_TOKENS,10):r.maxThinkingTokens;void 0!==e&&(e>0?(wr=!0,_r={type:"enabled",budgetTokens:e}):0===e&&(wr=!1,_r={type:"disabled"}))}ui("info","started",{version:e.VERSION,is_native_binary:pi()}),zt(async()=>{ui("info","exited")}),async function({hasInitialPrompt:e,hasStdin:t,verbose:s,debug:i,debugToStderr:r,print:n,outputFormat:a,inputFormat:c,numAllowedTools:l,numDisallowedTools:d,mcpClientCount:p,worktreeEnabled:m,skipWebFetchPreflight:u,githubActionInputs:g,dangerouslySkipPermissionsPassed:f,permissionMode:h,modeIsBypass:v,allowDangerouslySkipPermissionsPassed:w,systemPromptFlag:_,appendSystemPromptFlag:C,thinkingConfig:S,assistantActivationPath:y}){try{Re("tengu_init",{entrypoint:"claude",hasInitialPrompt:e,hasStdin:t,verbose:s,debug:i,debugToStderr:r,print:n,outputFormat:a,inputFormat:c,numAllowedTools:l,numDisallowedTools:d,mcpClientCount:p,worktree:m,skipWebFetchPreflight:u,...g&&{githubActionInputs:g},dangerouslySkipPermissionsPassed:f,permissionMode:h,modeIsBypass:v,inProtectedNamespace:Oo(),allowDangerouslySkipPermissionsPassed:w,thinkingType:S.type,..._&&{systemPromptFlag:_},...C&&{appendSystemPromptFlag:C},is_simple:bo()||void 0,is_coordinator:!(!o("COORDINATOR_MODE")||!Te?.isCoordinatorMode())||void 0,...y&&{assistantActivationPath:y},autoUpdatesChannel:gt().autoUpdatesChannel??"latest"})}catch(e){Mo(e)}}({hasInitialPrompt:Boolean(n),hasStdin:Boolean(Ys),verbose:ao,debug:l,debugToStderr:d,print:co??!1,outputFormat:Me??"text",inputFormat:Je??"text",numAllowedTools:O.length,numDisallowedTools:D.length,mcpClientCount:Object.keys(ar).length,worktreeEnabled:st,skipWebFetchPreflight:gt().skipWebFetchPreflight,githubActionInputs:process.env.GITHUB_ACTION_INPUTS,dangerouslySkipPermissionsPassed:p??!1,permissionMode:as,modeIsBypass:"bypassPermissions"===as,allowDangerouslySkipPermissionsPassed:S,systemPromptFlag:ss?r.systemPromptFile?"file":"flag":void 0,appendSystemPromptFlag:ns?r.appendSystemPromptFile?"file":"flag":void 0,thinkingConfig:_r,assistantActivationPath:o("KAIROS")&&c?Pe?.getAssistantActivationPath():void 0}),Kt(lr,Ms),Pt(null,"initialization"),function(){try{const e=ht("policySettings");if(e){const o=ft(e);Re("tengu_managed_settings_loaded",{keyCount:o.length,keys:o.join(",")})}}catch{}}(),Yt().then(e=>{e&&(Ui&&Jt(Ui),Xt().then(e=>{e>=2&&Re("tengu_concurrent_sessions",{num_sessions:e})}))}),bo()||(Wt?(await Zo(),i("action_after_plugins_init"),Qo().then(()=>ot())):Zo().then(async()=>{i("action_after_plugins_init"),await Qo(),ot()}));const Cr=Eo||Co?"init":Ao?"maintenance":null;if(Eo)return ge(),await rt("init",{forceSyncExecution:!0}),await it("startup",{forceSyncExecution:!0}),void ls(0);if(Wt){"stream-json"!==Me&&"json"!==Me||es(!0),ge(),y();const e=r.continue||r.resume||yt||Cr?void 0:it("startup");e?.catch(()=>{}),i("before_validateForceLoginOrg");const t=await ee();t.valid||(process.stderr.write(t.message+"\n"),process.exit(1));const s=Fo?[]:qi.filter(e=>"prompt"===e.type&&!e.disableNonInteractive||"local"===e.type&&e.supportsNonInteractive),n=ri(),a={...n,mcp:{...n.mcp,clients:fr,commands:vr,tools:hr},toolPermissionContext:Ms,effortValue:le(r.effort)??ce(),...pe()&&{fastMode:de(Ji??null)},...q()&&er&&{advisorModel:er},...o("KAIROS")?{kairosEnabled:c}:{}},l=ci(a,ai);("bypassPermissions"===Ms.mode||S)&&Ko(Ms),o("TRANSCRIPT_CLASSIFIER")&&Jo(Ms,l.getState().fastMode).then(({updateContext:e})=>{l.setState(o=>{const t=e(o.toolPermissionContext);return t===o.toolPermissionContext?o:{...o,toolPermissionContext:t}})}),!1===r.sessionPersistence&&Us(!0),Ns(di(Z));const connectMcpBatch=(e,o)=>0===Object.keys(e).length?Promise.resolve():(l.setState(o=>({...o,mcp:{...o.mcp,clients:[...o.mcp.clients,...Object.entries(e).map(([e,o])=>({name:e,type:"pending",config:o}))]}})),ro(({client:e,tools:o,commands:t})=>{l.setState(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.some(o=>o.name===e.name)?s.mcp.clients.map(o=>o.name===e.name?e:o):[...s.mcp.clients,e],tools:h([...s.mcp.tools,...o],"name"),commands:h([...s.mcp.commands,...t],"name")}}))},e).catch(e=>Zt(`[MCP] ${o} connect error: ${e}`)));i("before_connectMcp"),await connectMcpBatch(lr,"regular"),i("after_connectMcp");const d=5e3,p=Vs.then(e=>{if(Object.keys(e).length>0){const o=new Set;for(const t of Object.values(e)){const e=Nt(t);e&&o.add(e)}const t=new Set;for(const[e,s]of Object.entries(lr)){if(!e.startsWith("plugin:"))continue;const i=Nt(s);i&&o.has(i)&&t.add(e)}if(t.size>0){Zt(`[MCP] Lazy dedup: suppressing ${t.size} plugin server(s) that duplicate claude.ai connectors: ${[...t].join(", ")}`);for(const e of l.getState().mcp.clients)t.has(e.name)&&"connected"===e.type&&(e.client.onclose=void 0,It(e.name,e.config).catch(()=>{}));l.setState(e=>{let{clients:o,tools:s,commands:i,resources:r}=e.mcp;o=o.filter(e=>!t.has(e.name)),s=s.filter(e=>!e.mcpInfo||!t.has(e.mcpInfo.serverName));for(const e of t)i=Ht(i,e),r=$t(r,e);return{...e,mcp:{...e.mcp,clients:o,tools:s,commands:i,resources:r}}})}}const o=f(lr,(e,o)=>!o.startsWith("plugin:")),{servers:t}=Dt(e,o);return connectMcpBatch(t,"claudeai")});let m;const u=await Promise.race([p.then(()=>!1),new Promise(e=>{m=setTimeout(e=>e(!0),d,e)})]);m&&clearTimeout(m),u&&Zt(`[MCP] claude.ai connectors not ready after ${d}ms — proceeding; background connection continues`),i("after_connectMcp_claudeai"),bo()||(startDeferredPrefetches(),import("./utils/backgroundHousekeeping.js").then(e=>e.startBackgroundHousekeeping())),logSessionTelemetry(),i("before_print_import");const{runHeadless:g}=await import("./cli/print.js");return i("after_print_import"),void g(Ys,()=>l.getState(),l.setState,s,Qs,cr,Gi.activeAgents,{continue:r.continue,resume:r.resume,verbose:ao,outputFormat:Me,jsonSchema:Js,permissionPromptToolName:r.permissionPromptTool,allowedTools:O,thinkingConfig:_r,maxTurns:r.maxTurns,maxBudgetUsd:r.maxBudgetUsd,taskBudget:r.taskBudget?{total:r.taskBudget}:void 0,systemPrompt:ss,appendSystemPrompt:ns,userSpecifiedModel:Ji,fallbackModel:$i,teleport:yt,sdkUrl:Ct,replayUserMessages:Li,includePartialMessages:St,forkSession:r.forkSession||!1,resumeSessionAt:r.resumeSessionAt||void 0,rewindFiles:r.rewindFiles,enableAuthStatus:r.enableAuthStatus,agent:Ie,workload:r.workload,setupTrigger:Cr??void 0,sessionStartHooksPromise:e})}Re("tengu_startup_manual_model_config",{cli_flag:r.model,env_var:process.env.ANTHROPIC_MODEL,settings_file:(gt()||{}).model,subscriptionType:J(),agent:Xi});const Sr=No(Zi),yr=[];if(ps&&yr.push({key:"permission-mode-notification",text:ps,priority:"high"}),Sr&&yr.push({key:"model-deprecation-warning",text:Sr,color:"warning",priority:"high"}),qs.length>0){const e=X(qs.map(e=>e.ruleDisplay)),o=e.join(", "),t=X(qs.map(e=>e.sourceDisplay)).join(", "),s=e.length;yr.push({key:"overly-broad-bash-notification",text:`${o} allow ${vs(s,"rule")} from ${t} ${vs(s,"was","were")} ignored — not available for Ants, please use auto-mode instead`,color:"warning",priority:"high"})}const Er={...Ms,mode:W()&&getTeammateUtils().isPlanModeRequired()?"plan":Ms.mode},br=!(!o("KAIROS")&&!o("KAIROS_BRIEF"))&&ys(),jr=Tt||se()||c;let Or=!1;if(o("CCR_MIRROR")&&!jr){const{isCcrMirrorEnabled:e}=s("./bridge/bridgeEnabled.js");Or=e()}const Tr={settings:gt(),tasks:{},agentNameRegistry:new Map,verbose:ao??te().verbose??!1,mainLoopModel:Qi,mainLoopModelForSession:null,isBriefOnly:br,expandedView:te().showSpinnerTree?"teammates":te().showExpandedTodos?"tasks":"none",showTeammateMessagePreview:!W()&&void 0,selectedIPAgentIndex:-1,coordinatorTaskIndex:-1,viewSelectionMode:"none",footerSelection:null,toolPermissionContext:Er,agent:Yi?.agentType,agentDefinitions:Gi,mcp:{clients:[],tools:[],commands:[],resources:{},pluginReconnectKey:0},plugins:{enabled:[],disabled:[],commands:[],errors:[],installationStatus:{marketplaces:[],plugins:[]},needsRefresh:!1},statusLineText:void 0,kairosEnabled:c,remoteSessionUrl:void 0,remoteConnectionStatus:"connecting",remoteBackgroundTaskCount:0,replBridgeEnabled:jr||Or,replBridgeExplicit:Tt,replBridgeOutboundOnly:Or,replBridgeConnected:!1,replBridgeSessionActive:!1,replBridgeReconnecting:!1,replBridgeConnectUrl:void 0,replBridgeSessionUrl:void 0,replBridgeEnvironmentId:void 0,replBridgeSessionId:void 0,replBridgeError:void 0,replBridgeInitialName:Bt,showRemoteCallout:!1,notifications:{current:null,queue:yr},elicitation:{queue:[]},todos:{},remoteAgentTaskSuggestions:[],fileHistory:{snapshots:[],trackedFiles:new Set,snapshotSequence:0},attribution:Gt(),thinkingEnabled:wr,promptSuggestionEnabled:ii(),sessionHooks:new Map,inbox:{messages:[]},promptSuggestion:{text:null,promptId:null,shownAt:0,acceptedAt:0,generationRequestId:null},speculation:ni,speculationSessionTimeSavedMs:0,skillImprovement:{suggestion:null},workerSandboxPermissions:{queue:[],selectedIndex:0},pendingWorkerRequest:null,pendingSandboxRequest:null,authVersion:0,initialMessage:Ys?{message:he({content:String(Ys)})}:null,effortValue:le(r.effort)??ce(),activeOverlays:new Set,fastMode:de(Zi),...q()&&er&&{advisorModel:er},teamContext:o("KAIROS")?a??be?.():be?.()};Ys&&E(String(Ys));const Pr=hr;re(e=>({...e,numStartups:(e.numStartups??0)+1})),setImmediate(()=>{!async function(){if(De())return;const[e,o,t]=await Promise.all([ko(),Do(),xo()]);Re("tengu_startup_telemetry",{is_git:e,worktree_count:o,gh_auth_status:t,sandbox_enabled:_i.isSandboxingEnabled(),are_unsandboxed_commands_allowed:_i.areUnsandboxedCommandsAllowed(),is_auto_bash_allowed_if_sandbox_enabled:_i.isAutoAllowBashIfSandboxedEnabled(),auto_updater_disabled:ie(),prefers_reduced_motion:gt().prefersReducedMotion??!1,...getCertEnvVarTelemetry()})}(),logSessionTelemetry()});const Ar=null,Ir=Ar?Ar.then(e=>e.createSessionTurnUploader()).catch(()=>null):null,kr={debug:l||d,commands:[...qi,...vr],initialTools:Pr,mcpClients:fr,autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,dynamicMcpConfig:hs,strictMcpConfig:As,systemPrompt:ss,appendSystemPrompt:ns,taskListId:Xo,thinkingConfig:_r,...Ir&&{onTurnComplete:e=>{Ir.then(o=>o?.(e))}}},Dr={modeApi:Te,mainThreadAgentDefinition:Yi,agentDefinitions:Gi,currentCwd:Bi,cliAgents:zi,initialState:Tr};if(r.continue){let e=!1;try{const o=performance.now(),{clearSessionCaches:t}=await import("./commands/clear/caches.js");t();const s=await So(void 0,void 0);if(!s)return Re("tengu_continue",{success:!1}),await Qe(or,"No conversation found to continue");const i=await fs(s,{forkSession:!!r.forkSession,includeAttribution:!0,transcriptPath:s.fullPath},Dr);i.restoredAgentDef&&(Yi=i.restoredAgentDef),maybeActivateProactive(r),maybeActivateBrief(r),Re("tengu_continue",{success:!0,resume_duration_ms:Math.round(performance.now()-o)}),e=!0,await b(or,{getFpsMetrics:tr,stats:sr,initialState:i.initialState},{...kr,mainThreadAgentDefinition:i.restoredAgentDef??Yi,initialMessages:i.messages,initialFileHistorySnapshots:i.fileHistorySnapshots,initialContentReplacements:i.contentReplacements,initialAgentName:i.agentName,initialAgentColor:i.agentColor},oo)}catch(o){e||Re("tengu_continue",{success:!1}),Mo(o),process.exit(1)}}else{if(o("DIRECT_CONNECT")&&xi?.url){let e;try{const o=await oi({serverUrl:xi.url,authToken:xi.authToken,cwd:Ne(),dangerouslySkipPermissions:xi.dangerouslySkipPermissions});o.workDir&&(Rs(o.workDir),Ts(o.workDir)),Ps(xi.url),e=o.config}catch(e){return await Qe(or,e instanceof ti?e.message:String(e),()=>cs(1))}const o=fe(`Connected to server at ${xi.url}\nSession: ${e.sessionId}`,"info");return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},{debug:l||d,commands:qi,initialTools:[],initialMessages:[o],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,directConnectConfig:e,thinkingConfig:_r},oo)}if(o("SSH_REMOTE")&&Mi?.host){const{createSSHSession:o,createLocalSSHSession:t,SSHSessionError:s}=await import("./ssh/createSSHSession.js");let i;try{if(Mi.local)process.stderr.write("Starting local ssh-proxy test session...\n"),i=t({cwd:Mi.cwd,permissionMode:Mi.permissionMode,dangerouslySkipPermissions:Mi.dangerouslySkipPermissions});else{process.stderr.write(`Connecting to ${Mi.host}…\n`);const t=process.stderr.isTTY;let s=!1;i=await o({host:Mi.host,cwd:Mi.cwd,localVersion:e.VERSION,permissionMode:Mi.permissionMode,dangerouslySkipPermissions:Mi.dangerouslySkipPermissions,extraCliArgs:Mi.extraCliArgs},t?{onProgress:e=>{s=!0,process.stderr.write(`\r ${e}[K`)}}:{}),s&&process.stderr.write("\n")}Rs(i.remoteCwd),Ts(i.remoteCwd),Ps(Mi.local?"local":Mi.host)}catch(e){return await Qe(or,e instanceof s?e.message:String(e),()=>cs(1))}const r=fe(Mi.local?`Local ssh-proxy test session\ncwd: ${i.remoteCwd}\nAuth: unix socket → local proxy`:`SSH session to ${Mi.host}\nRemote cwd: ${i.remoteCwd}\nAuth: unix socket -R → local proxy`,"info");return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},{debug:l||d,commands:qi,initialTools:[],initialMessages:[r],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,sshSession:i,thinkingConfig:_r},oo)}if(o("KAIROS")&&Ri&&(Ri.sessionId||Ri.discover)){const{discoverAssistantSessions:e}=await import("./assistant/sessionDiscovery.js");let o=Ri.sessionId;if(!o){let t;try{t=await e()}catch(e){return await Qe(or,`Failed to discover sessions: ${e instanceof Error?e.message:e}`,()=>cs(1))}if(0===t.length){let e;try{e=await qe(or)}catch(e){return await Qe(or,`Assistant installation failed: ${e instanceof Error?e.message:e}`,()=>cs(1))}return null===e&&(await cs(0),process.exit(0)),await Ze(or,`Assistant installed in ${e}. The daemon is starting up — run \`claude assistant\` again in a few seconds to connect.`,{exitCode:0,beforeExit:()=>cs(0)})}if(1===t.length)o=t[0].id;else{const e=await Ve(or,{sessions:t});e||(await cs(0),process.exit(0)),o=e}}const{checkAndRefreshOAuthTokenIfNeeded:t,getClaudeAIOAuthTokens:s}=await import("./utils/auth.js");let i;await t();try{i=await Si()}catch(e){return await Qe(or,`Error: ${e instanceof Error?e.message:"Failed to authenticate"}`,()=>cs(1))}const getAccessToken=()=>s()?.accessToken??i.accessToken;xs(!0),$s(!0),Ue(!0);const r=ei(o,getAccessToken,i.orgUUID,!1,!0),n=fe(`Attached to assistant session ${o.slice(0,8)}…`,"info"),a={...Tr,isBriefOnly:!0,kairosEnabled:!1,replBridgeEnabled:!1},c=Fe(qi);return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:a},{debug:l||d,commands:c,initialTools:[],initialMessages:[n],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,remoteSessionConfig:r,thinkingConfig:_r},oo)}if(r.resume||r.fromPr||yt||null!==bt){const{clearSessionCaches:e}=await import("./commands/clear/caches.js");e();let o,t,s,i=null,n=jt(r.resume),a=null;if(r.fromPr&&(!0===r.fromPr?s=!0:"string"==typeof r.fromPr&&(s=r.fromPr)),r.resume&&"string"==typeof r.resume&&!n){const e=r.resume.trim();if(e){const o=await pt(e,{exact:!0});1===o.length?(a=o[0],n=at(a)??null):t=e}}if((null!==bt||yt)&&(await N(),!x("allow_remote_sessions")))return await Qe(or,"Error: Remote sessions are disabled by your organization's policy.",()=>cs(1));if(null!==bt){const e=bt.length>0,o=xe("tengu_remote_backend",!1);if(!o&&!e)return await Qe(or,'Error: --remote requires a description.\nUsage: context --remote "your task description"',()=>cs(1));Re("tengu_remote_create_session",{has_initial_prompt:String(e)});const t=await Io(),s=await bi(or,e?bt:null,(new AbortController).signal,t||void 0);if(!s)return Re("tengu_remote_create_session_error",{error:"unable_to_create_session"}),await Qe(or,"Error: Unable to create remote session",()=>cs(1));let i;Re("tengu_remote_create_session_success",{session_id:s.id}),o||(process.stdout.write(`Created remote session: ${s.title}\n`),process.stdout.write(`View: ${w(s.id)}?m=0\n`),process.stdout.write(`Resume with: context --teleport ${s.id}\n`),await cs(0),process.exit(0)),Ue(!0),Bs(li(s.id));try{i=await Si()}catch(e){return Mo(rs(e)),await Qe(or,`Error: ${os(e)||"Failed to authenticate"}`,()=>cs(1))}const{getClaudeAIOAuthTokens:r}=await import("./utils/auth.js"),getAccessTokenForRemote=()=>r()?.accessToken??i.accessToken,n=ei(s.id,getAccessTokenForRemote,i.orgUUID,e),a=`${w(s.id)}?m=0`,c=fe(`/remote-control is active. Code in CLI or at ${a}`,"info"),p=e?he({content:bt}):null,m={...Tr,remoteSessionUrl:a},u=Fe(qi);return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:m},{debug:l||d,commands:u,initialTools:[],initialMessages:p?[c,p]:[c],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,remoteSessionConfig:n,thinkingConfig:_r},oo)}if(yt)if(!0===yt||""===yt){Re("tengu_teleport_interactive_mode",{}),Zt("selectAndResumeTeleportTask: Starting teleport flow...");const e=await Ye(or);e||(await cs(0),process.exit(0));const{branchError:o}=await yi(e.branch);i=Ei(e.log,o)}else if("string"==typeof yt){Re("tengu_teleport_resume_session",{mode:"direct"});try{const e=await Ci(yt),o=await Oi(e);if("mismatch"===o.status||"not_in_repo"===o.status){const e=o.sessionRepo;if(e){const o=fi(e),t=await gi(o);if(!(t.length>0))throw new is(`You must run context --teleport ${yt} from a checkout of ${e}.`,m.red(`You must run context --teleport ${yt} from a checkout of ${m.bold(e)}.\n`));{const o=await Xe(or,{targetRepo:e,initialPaths:t});o?(process.chdir(o),gs(o),Rs(o)):await cs(0)}}}else if("error"===o.status)throw new is(o.errorMessage||"Failed to validate session",m.red(`Error: ${o.errorMessage||"Failed to validate session"}\n`));await ji();const{teleportWithProgress:t}=await import("./components/TeleportProgress.js"),s=await t(or,yt);Be({sessionId:yt}),i=s.messages}catch(e){e instanceof is?process.stderr.write(e.formattedMessage+"\n"):(Mo(e),process.stderr.write(m.red(`Error: ${os(e)}\n`))),await cs(1)}}if(n){const e=n;try{const t=performance.now(),s=await So(a??e,void 0);if(!s)return Re("tengu_session_resumed",{entrypoint:"cli_flag",success:!1}),await Qe(or,`No conversation found with session ID: ${e}`);const i=a?.fullPath??s.fullPath;o=await fs(s,{forkSession:!!r.forkSession,sessionIdOverride:e,transcriptPath:i},Dr),o.restoredAgentDef&&(Yi=o.restoredAgentDef),Re("tengu_session_resumed",{entrypoint:"cli_flag",success:!0,resume_duration_ms:Math.round(performance.now()-t)})}catch(o){Re("tengu_session_resumed",{entrypoint:"cli_flag",success:!1}),Mo(o),await Qe(or,`Failed to resume session ${e}`)}}if(Ee)try{const e=await Ee,o=G(e,e=>!e.success);o>0&&process.stderr.write(m.yellow(`Warning: ${o}/${e.length} file(s) failed to download.\n`))}catch(e){return await Qe(or,`Error downloading files: ${os(e)}`)}const c=o??(Array.isArray(i)?{messages:i,fileHistorySnapshots:void 0,agentName:void 0,agentColor:void 0,restoredAgentDef:Yi,initialState:Tr,contentReplacements:void 0}:void 0);c?(maybeActivateProactive(r),maybeActivateBrief(r),await b(or,{getFpsMetrics:tr,stats:sr,initialState:c.initialState},{...kr,mainThreadAgentDefinition:c.restoredAgentDef??Yi,initialMessages:c.messages,initialFileHistorySnapshots:c.fileHistorySnapshots,initialContentReplacements:c.contentReplacements,initialAgentName:c.agentName,initialAgentColor:c.agentColor},oo)):await We(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},Po(Ne()),{...kr,initialSearchQuery:t,forkSession:r.forkSession,filterByPr:s})}else{const e=ur&&0===gr.length?ur:void 0;i("action_after_hooks"),maybeActivateProactive(r),maybeActivateBrief(r),o("COORDINATOR_MODE")&&dt(Te?.isCoordinatorMode()?"coordinator":"normal");let t=null;o("LODESTONE")&&(r.deepLinkOrigin?(Re("tengu_deep_link_opened",{has_prefill:Boolean(r.prefill),has_repo:Boolean(r.deepLinkRepo)}),t=fe(yo({cwd:Qt(),prefillLength:r.prefill?.length,repo:r.deepLinkRepo,lastFetch:void 0!==r.deepLinkLastFetch?new Date(r.deepLinkLastFetch):void 0}),"warning")):r.prefill&&(t=fe("Launched with a pre-filled prompt — review it before pressing Enter.","warning")));const s=t?[t,...gr]:gr.length>0?gr:void 0;await b(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},{...kr,initialMessages:s,pendingHookMessages:e},oo)}}}).version(`${e.VERSION} (Context Code)`,"-v, --version","Output the version number"),t.option("-w, --worktree [nombre]","Crea un nuevo git worktree para esta sesión (opcionalmente especifica un nombre)"),t.option("--tmux","Crea una sesión de tmux para el worktree (requiere --worktree). Usa paneles nativos de iTerm2 si están disponibles; usa --tmux=classic para tmux tradicional."),F()&&t.addOption(new p("--advisor <modelo>","Habilita la herramienta advisor del lado del servidor con el modelo especificado (alias o ID completo).").hideHelp());0;o("TRANSCRIPT_CLASSIFIER")&&t.addOption(new p("--enable-auto-mode","Activar modo automático").hideHelp());(o("PROACTIVE")||o("KAIROS"))&&t.addOption(new p("--proactive","Iniciar en modo autónomo proactivo"));o("UDS_INBOX")&&t.addOption(new p("--messaging-socket-path <ruta>","Ruta del socket de dominio Unix para el servidor de mensajería UDS (por defecto una ruta temporal)"));(o("KAIROS")||o("KAIROS_BRIEF"))&&t.addOption(new p("--brief","Habilita la herramienta SendUserMessage para la comunicación agente-usuario"));o("KAIROS")&&t.addOption(new p("--assistant","Fuerza el modo asistente (uso del demonio Agent SDK)").hideHelp());(o("KAIROS")||o("KAIROS_CHANNELS"))&&(t.addOption(new p("--channels <servidores...>","Servidores MCP cuyas notificaciones de canal deben registrar esta sesión. Nombres de servidor separados por espacios.").hideHelp()),t.addOption(new p("--dangerously-load-development-channels <servidores...>","Carga servidores de canal que no están en la lista permitida. Solo para desarrollo local.").hideHelp()));t.addOption(new p("--agent-id <id>","Teammate agent ID").hideHelp()),t.addOption(new p("--agent-name <name>","Teammate display name").hideHelp()),t.addOption(new p("--team-name <name>","Team name for swarm coordination").hideHelp()),t.addOption(new p("--agent-color <color>","Teammate UI color").hideHelp()),t.addOption(new p("--plan-mode-required","Require plan mode before implementation").hideHelp()),t.addOption(new p("--parent-session-id <id>","Parent session ID for analytics correlation").hideHelp()),t.addOption(new p("--teammate-mode <mode>",'How to spawn teammates: "tmux", "in-process", or "auto"').choices(["auto","tmux","in-process"]).hideHelp()),t.addOption(new p("--agent-type <type>","Custom agent type for this teammate").hideHelp()),t.addOption(new p("--sdk-url <url>","Use remote WebSocket endpoint for SDK I/O streaming (only with -p and stream-json format)").hideHelp()),t.addOption(new p("--teleport [session]","Resume a teleport session, optionally specify session ID").hideHelp()),t.addOption(new p("--remote [description]","Create a remote session with the given description").hideHelp()),o("BRIDGE_MODE")&&(t.addOption(new p("--remote-control [name]","Start an interactive session with Remote Control enabled (optionally named)").argParser(e=>e||!0).hideHelp()),t.addOption(new p("--rc [name]","Alias for --remote-control").argParser(e=>e||!0).hideHelp()));o("HARD_FAIL")&&t.addOption(new p("--hard-fail","Crash on logError calls instead of silently logging").hideHelp());i("run_main_options_built");const n=process.argv.includes("-p")||process.argv.includes("--print"),c=process.argv.some(e=>e.startsWith("cc://")||e.startsWith("cc+unix://"));if(n&&!c)return i("run_before_parse"),await t.parseAsync(process.argv),i("run_after_parse"),t;const j=t.command("mcp").description("Configurar y gestionar servidores MCP").configureHelp(createSortedHelpConfig()).enablePositionalOptions();j.command("serve").description("Iniciar el servidor MCP de Context Code").option("-d, --debug","Activar modo depuración",()=>!0).option("--verbose","Sobrescribir ajuste de verbosidad de la configuración",()=>!0).action(async({debug:e,verbose:o})=>{const{mcpServeHandler:t}=await import("./cli/handlers/mcp.js");await t({debug:e,verbose:o})}),Ot(j),Bt()&&Tt(j);j.command("remove <nombre>").description("Eliminar un servidor MCP").option("-s, --scope <ámbito>","Ámbito de configuración (local, user o project); si no se especifica, se elimina de donde exista").action(async(e,o)=>{const{mcpRemoveHandler:t}=await import("./cli/handlers/mcp.js");await t(e,o)}),j.command("list").description("Listar servidores MCP configurados. Nota: Se omite el diálogo de confianza y se inician los servidores stdio de .mcp.json para comprobaciones de estado. Úsalo solo en directorios en los que confíes.").action(async()=>{const{mcpListHandler:e}=await import("./cli/handlers/mcp.js");await e()}),j.command("get <nombre>").description("Obtener detalles sobre un servidor MCP. Nota: Se omite el diálogo de confianza y se inician los servidores stdio de .mcp.json para comprobaciones de estado. Úsalo solo en directorios en los que confíes.").action(async e=>{const{mcpGetHandler:o}=await import("./cli/handlers/mcp.js");await o(e)}),j.command("add-json <nombre> <json>").description("Añadir un servidor MCP (stdio o SSE) con una cadena JSON").option("-s, --scope <ámbito>","Ámbito de configuración (local, user o project)","local").option("--client-secret","Solicitar el secreto de cliente OAuth (o establecer la variable de entorno MCP_CLIENT_SECRET)").action(async(e,o,t)=>{const{mcpAddJsonHandler:s}=await import("./cli/handlers/mcp.js");await s(e,o,t)}),j.command("add-from-claude-desktop").description("Importar servidores MCP desde Context Desktop (solo Mac y WSL)").option("-s, --scope <ámbito>","Ámbito de configuración (local, user o project)","local").action(async e=>{const{mcpAddFromDesktopHandler:o}=await import("./cli/handlers/mcp.js");await o(e)}),j.command("reset-project-choices").description("Restablecer todos los servidores aprobados y rechazados del ámbito del proyecto (.mcp.json) dentro de este proyecto").action(async()=>{const{mcpResetChoicesHandler:e}=await import("./cli/handlers/mcp.js");await e()}),o("DIRECT_CONNECT")&&t.command("server").description("Iniciar un servidor de sesión de Context Code").option("--port <número>","Puerto HTTP","0").option("--host <dirección>","Dirección de escucha","0.0.0.0").option("--auth-token <token>","Token portador para autenticación").option("--unix <ruta>","Escucha en un socket de dominio Unix").option("--workspace <dir>","Directorio de trabajo por defecto para sesiones que no especifiquen cwd").option("--idle-timeout <ms>","Tiempo de espera de inactividad para sesiones desconectadas en ms (0 = nunca expira)","600000").option("--max-sessions <n>","Máximo de sesiones simultáneas (0 = sin límite)","32").action(async e=>{const{randomBytes:o}=await import("crypto"),{startServer:t}=await import("./server/server.js"),{SessionManager:s}=await import("./server/sessionManager.js"),{DangerousBackend:i}=await import("./server/backends/dangerousBackend.js"),{printBanner:r}=await import("./server/serverBanner.js"),{createServerLogger:n}=await import("./server/serverLog.js"),{writeServerLock:a,removeServerLock:c,probeRunningServer:l}=await import("./server/lockfile.js"),d=await l();d&&(process.stderr.write(`Ya hay un servidor context ejecutándose (pid ${d.pid}) en ${d.httpUrl}\n`),process.exit(1));const p=e.authToken??`sk-ant-cc-${o(16).toString("base64url")}`,m={port:parseInt(e.port,10),host:e.host,authToken:p,unix:e.unix,workspace:e.workspace,idleTimeoutMs:parseInt(e.idleTimeout,10),maxSessions:parseInt(e.maxSessions,10)},u=new s(new i,{idleTimeoutMs:m.idleTimeoutMs,maxSessions:m.maxSessions}),g=n(),f=t(m,u,g),h=f.port??m.port;r(m,p,h),await a({pid:process.pid,port:h,host:m.host,httpUrl:m.unix?`unix:${m.unix}`:`http://${m.host}:${h}`,startedAt:Date.now()});let v=!1;const shutdown=async()=>{v||(v=!0,f.stop(!0),await u.destroyAll(),await c(),process.exit(0))};process.once("SIGINT",()=>{shutdown()}),process.once("SIGTERM",()=>{shutdown()})});o("SSH_REMOTE")&&t.command("ssh <host> [dir]").description("Ejecutar Context Code en un host remoto a través de SSH. Despliega el binario y tuneliza la autenticación API a través de tu máquina local; no requiere configuración remota.").option("--permission-mode <modo>","Modo de permisos para la sesión remota").option("--dangerously-skip-permissions","Omitir todas las solicitudes de permiso en el remoto (peligroso)").option("--local","Modo de prueba e2e; lanza el CLI localmente (omite ssh/despliegue).").action(async()=>{process.stderr.write("Uso: context ssh <usuario@host | alias-ssh-config> [dir]\n\nEjecuta Context Code en un host Linux remoto. No necesitas instalar\nnada en el remoto ni ejecutar `context auth login` allí; el binario se\ndespliega vía SSH y la autenticación API se tuneliza de vuelta.\n"),process.exit(1)});o("DIRECT_CONNECT")&&t.command("open <cc-url>").description("Conectar a un servidor de Context Code (interno — usa URLs cc://)").option("-p, --print [prompt]","Modo impresión (sin interfaz)").option("--output-format <formato>","Formato de salida: text, json, stream-json","text").action(async(e,o)=>{const{parseConnectUrl:t}=await import("./server/parseConnectUrl.js"),{serverUrl:s,authToken:i}=t(e);let r;try{const e=await oi({serverUrl:s,authToken:i,cwd:Ne(),dangerouslySkipPermissions:xi?.dangerouslySkipPermissions});e.workDir&&(Rs(e.workDir),Ts(e.workDir)),Ps(s),r=e.config}catch(e){console.error(e instanceof ti?e.message:String(e)),process.exit(1)}const{runConnectHeadless:n}=await import("./server/connectHeadless.js"),a="string"==typeof o.print?o.print:"",c=!0===o.print;await n(r,a,o.outputFormat,c)});const O=t.command("auth").description("Gestionar autenticación").configureHelp(createSortedHelpConfig());O.command("login").description("Iniciar sesión por OAuth (Anthropic/OpenAI/Google según provider)").option("--email <email>","Pre-completar la dirección de correo en la página de inicio de sesión").option("--sso","Forzar el flujo de inicio de sesión SSO").option("--console","Usar Anthropic Console (facturación por uso de API) en lugar de la suscripción de Claude").option("--claudeai","Usar suscripción de Claude (por defecto)").option("--provider <id>","Provider OAuth: claude, openai, gemini-google").action(async({email:e,sso:o,console:t,claudeai:s,provider:i})=>{const{authLogin:r}=await import("./cli/handlers/auth.js");await r({email:e,sso:o,console:t,claudeai:s,provider:i})}),O.command("status").description("Show authentication status").option("--json","Output as JSON (default)").option("--text","Output as human-readable text").action(async e=>{const{authStatus:o}=await import("./cli/handlers/auth.js");await o(e)}),O.command("logout").description("Cerrar sesión en tu cuenta de Anthropic").action(async()=>{const{authLogout:e}=await import("./cli/handlers/auth.js");await e()}),O.command("provider-api-key").description("Guardar API key para un provider compatible").requiredOption("--provider <id>","ID de provider (openrouter, minimax, zai, gemini-api, nvidia, ollama-cloud)").requiredOption("--api-key <key>","API key del provider").option("--profile <name>","Perfil del provider").action(async e=>{const{authProviderApiKey:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider,apiKey:e.apiKey,profile:e.profile})}),O.command("provider-base-url").description("Guardar base URL para un provider compatible").requiredOption("--provider <id>","ID de provider (ollama, ollama-cloud, openrouter, gemini-google, zai, minimax, nvidia)").requiredOption("--base-url <url>","Base URL del provider").option("--profile <name>","Perfil del provider").action(async e=>{const{authProviderBaseUrl:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider,baseUrl:e.baseUrl,profile:e.profile})}),O.command("set-provider").description("Establecer provider activo para flujos de auth").requiredOption("--provider <id>","ID de provider (claude, openai, gemini-google, ...)").action(async e=>{const{authSetProviderPreference:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider})}),O.command("provider-remove").description("Eliminar provider/perfil y limpiar sus credenciales").requiredOption("--provider <id>","ID de provider (claude, openai, minimax, ollama, ...)").option("--profile <name>","Perfil del provider (si aplica)").action(async e=>{const{authProviderRemove:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider,profile:e.profile})});const D=t.command("provider").description("Cambiar entre proveedores y configurar endpoints").configureHelp(createSortedHelpConfig());D.command("list").description("Listar proveedores y perfiles configurados").action(async()=>{const{providerListHandler:e}=await import("./cli/handlers/provider.js");await e()}),D.command("use <profile>").description("Activar un perfil de proveedor").action(async e=>{try{const{listProviderProfiles:o}=await import("./utils/model/providerProfiles.js"),{switchProviderPreference:t}=await import("./utils/model/providerSwitch.js"),{getAPIProvider:s}=await import("./utils/model/providers.js"),{getDefaultMainLoopModel:i}=await import("./utils/model/model.js"),r=o().filter(o=>o.name.toLowerCase()===e.toLowerCase()||o.id.toLowerCase()===e.toLowerCase());0===r.length&&(process.stderr.write(`Perfil '${e}' no encontrado.\n`),process.exit(1)),r.length>1&&(process.stderr.write(`Perfil ambiguo '${e}'. Hay múltiples perfiles con este nombre.\n`),process.exit(1));const n=r[0];t({currentModel:i(),currentProvider:s(),targetProvider:n.provider,targetProfileName:n.name}),process.stdout.write(`Perfil ${n.provider}/${n.name} activado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});const Y=t.command("profile").description("Gestionar perfiles de proveedor").configureHelp(createSortedHelpConfig());Y.command("use <providerOrProfile> [profileName]").description("Activar un perfil de proveedor").action(async(e,o)=>{try{const{listProviderProfiles:t}=await import("./utils/model/providerProfiles.js"),{switchProviderPreference:s}=await import("./utils/model/providerSwitch.js"),{getAPIProvider:i}=await import("./utils/model/providers.js"),{getDefaultMainLoopModel:r}=await import("./utils/model/model.js");let n,a=o;if(a)n=e;else{const o=t().filter(o=>o.name.toLowerCase()===e.toLowerCase()||o.id.toLowerCase()===e.toLowerCase());1===o.length?(n=o[0].provider,a=o[0].name):o.length>1?(process.stderr.write(`Perfil ambiguo '${e}'. Hay múltiples perfiles con este nombre.\n`),process.exit(1)):(n=e,a=void 0)}s({currentModel:r(),currentProvider:i(),targetProvider:n,targetProfileName:a}),process.stdout.write(`Perfil ${n}${a?"/"+a:""} activado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}),Y.command("create <provider> <profileName>").description("Crear un nuevo perfil de proveedor").action(async(e,o)=>{try{const{createProviderProfile:t,isProfiledProvider:s}=await import("./utils/model/providerProfiles.js");s(e)||(process.stderr.write(`Proveedor '${e}' no admite perfiles.\n`),process.exit(1)),t({provider:e,name:o,activate:!0}),process.stdout.write(`Perfil ${e}/${o} creado y activado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}),Y.command("remove <provider> <profileName>").alias("delete").description("Eliminar un perfil de proveedor").action(async(e,o)=>{try{const{removeProviderProfile:t}=await import("./utils/model/providerProfiles.js");t(e,o)||(process.stderr.write(`Perfil ${e}/${o} no encontrado.\n`),process.exit(1)),process.stdout.write(`Perfil ${e}/${o} eliminado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});t.command("model").description("Inspeccionar modelos disponibles por provider").configureHelp(createSortedHelpConfig()).command("list").description("Listar modelos disponibles del provider activo o de uno especifico").option("--provider <id>","ID del provider (claude, minimax, zai, openai, ...) o label (Claude, MiniMax, ...)").option("--json","Salida en formato JSON").action(async e=>{const{modelListHandler:o}=await import("./cli/handlers/modelList.js");await o(e)});const coworkOption=()=>new p("--cowork","Usar el directorio cowork_plugins").hideHelp(),Q=t.command("plugin").alias("plugins").description("Gestionar plugins de Context Code").configureHelp(createSortedHelpConfig());Q.command("validate <path>").description("Validar un manifiesto de plugin o marketplace").addOption(coworkOption()).action(async(e,o)=>{const{pluginValidateHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("list").description("Listar plugins instalados").option("--json","Salida en formato JSON").option("--available","Incluir plugins disponibles de los marketplaces (requiere --json)").addOption(coworkOption()).action(async e=>{const{pluginListHandler:o}=await import("./cli/handlers/plugins.js");await o(e)});const Z=Q.command("marketplace").description("Gestionar marketplaces de Context Code").configureHelp(createSortedHelpConfig());if(Z.command("add <source>").description("Añadir un marketplace desde una URL, ruta o repositorio de GitHub").addOption(coworkOption()).option("--sparse <paths...>","Limitar la descarga a directorios específicos mediante git sparse-checkout (para monorepositorios). Ejemplo: --sparse .claude-plugin plugins").option("--scope <scope>","Dónde declarar el marketplace: user (por defecto), project o local").action(async(e,o)=>{const{marketplaceAddHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Z.command("list").description("Listar todos los marketplaces configurados").option("--json","Salida en formato JSON").addOption(coworkOption()).action(async e=>{const{marketplaceListHandler:o}=await import("./cli/handlers/plugins.js");await o(e)}),Z.command("remove <name>").alias("rm").description("Eliminar un marketplace configurado").addOption(coworkOption()).action(async(e,o)=>{const{marketplaceRemoveHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Z.command("update [name]").description("Actualizar marketplace(s) desde su origen - actualiza todos si no se especifica un nombre").addOption(coworkOption()).action(async(e,o)=>{const{marketplaceUpdateHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("install <plugin>").alias("i").description("Instalar un plugin de los marketplaces disponibles (usa plugin@marketplace para un marketplace específico)").option("-s, --scope <scope>","Ámbito de instalación: user, project o local","user").addOption(coworkOption()).action(async(e,o)=>{const{pluginInstallHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("uninstall <plugin>").alias("remove").alias("rm").description("Desinstalar un plugin instalado").option("-s, --scope <scope>","Desinstalar del ámbito: user, project o local","user").option("--keep-data","Preservar el directorio de datos persistentes del plugin (~/.context/plugins/data/{id}/)").addOption(coworkOption()).action(async(e,o)=>{const{pluginUninstallHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("enable <plugin>").description("Habilitar un plugin deshabilitado").option("-s, --scope <scope>",`Ámbito de instalación: ${ao.join(", ")} (por defecto: auto-detect)`).addOption(coworkOption()).action(async(e,o)=>{const{pluginEnableHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("disable [plugin]").description("Deshabilitar un plugin habilitado").option("-a, --all","Deshabilitar todos los plugins habilitados").option("-s, --scope <scope>",`Ámbito de instalación: ${ao.join(", ")} (por defecto: auto-detect)`).addOption(coworkOption()).action(async(e,o)=>{const{pluginDisableHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("update <plugin>").description("Actualizar un plugin a la última versión (se requiere reiniciar para aplicar)").option("-s, --scope <scope>",`Ámbito de instalación: ${co.join(", ")} (por defecto: user)`).addOption(coworkOption()).action(async(e,o)=>{const{pluginUpdateHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),t.command("setup-token").description("Configurar un token de autenticación de larga duración (requiere suscripción a Context)").action(async()=>{const[{setupTokenHandler:e},{createRoot:o}]=await Promise.all([import("./cli/handlers/util.js"),import("./ink.js")]),t=await o(we(!1));await e(t)}),t.command("agents").description("Listar agentes configurados").option("--setting-sources <sources>","Lista de fuentes de configuración a cargar separadas por comas (user, project, local).").option("--json","Salida en formato JSON estructurado para consumo por herramientas externas").action(async e=>{const{agentsHandler:o}=await import("./cli/handlers/agents.js");await o({json:!!e.json}),process.exit(0)}),o("TRANSCRIPT_CLASSIFIER")&&"disabled"!==qo()){const e=t.command("auto-mode").description("Inspeccionar la configuración del clasificador de modo automático");e.command("defaults").description("Imprimir el entorno predeterminado del modo automático, las reglas de permiso y denegación en formato JSON").action(async()=>{const{autoModeDefaultsHandler:e}=await import("./cli/handlers/autoMode.js");e(),process.exit(0)}),e.command("config").description("Imprimir la configuración efectiva del modo automático en formato JSON: tus ajustes si están establecidos, los valores predeterminados en caso contrario").action(async()=>{const{autoModeConfigHandler:e}=await import("./cli/handlers/autoMode.js");e(),process.exit(0)}),e.command("critique").description("Obtener comentarios de IA sobre tus reglas personalizadas de modo automático").option("--model <model>","Sobrescribir el modelo que se utiliza").action(async e=>{const{autoModeCritiqueHandler:o}=await import("./cli/handlers/autoMode.js");await o(e),process.exit()})}o("BRIDGE_MODE")&&t.command("remote-control",{hidden:!0}).alias("rc").description("Conectar tu entorno local para sesiones de control remoto a través de claude.ai/code").action(async()=>{const{bridgeMain:e}=await import("./bridge/bridgeMain.js");await e(process.argv.slice(3))});o("KAIROS")&&t.command("assistant [sessionId]").description("Adjuntar el REPL como cliente a una sesión puente en ejecución. Descubre sesiones a través de la API si no se proporciona sessionId.").action(()=>{process.stderr.write("Uso: Context Code assistant [sessionId]\n\nAdjuntar el REPL como cliente visor a una sesión puente en ejecución.\nOmite sessionId para descubrir y elegir entre las sesiones disponibles.\n"),process.exit(1)});t.command("doctor").description("Comprobar el estado del actualizador automático de Context Code. Nota: Se omite el diálogo de confianza del espacio de trabajo y se inician los servidores stdio de .mcp.json para las comprobaciones de salud. Usa este comando solo en directorios en los que confíes.").action(async()=>{const[{doctorHandler:e},{createRoot:o}]=await Promise.all([import("./cli/handlers/util.js"),import("./ink.js")]),t=await o(we(!1));await e(t)}),t.command("update").alias("upgrade").description("Buscar actualizaciones e instalarlas si están disponibles").action(async()=>{const{update:e}=await import("./cli/update.js");await e()}),!1;0;t.command("install [target]").description("Instalar la compilación nativa de Context Code. Usa [target] para especificar la versión (stable, latest o una versión específica)").option("--force","Forzar la instalación incluso si ya está instalado").action(async(e,o)=>{const{installHandler:t}=await import("./cli/handlers/util.js");await t(e,o)}),!1;return i("run_before_parse"),await t.parseAsync(process.argv),i("run_after_parse"),i("main_after_run"),r(),t}(),i("main_after_run")}function maybeActivateProactive(e){if((o("PROACTIVE")||o("KAIROS"))&&(e.proactive||jo(process.env.CONTEXT_CODE_PROACTIVE)||jo(process.env.CLAUDE_CODE_PROACTIVE))){const e=s("./proactive/index.js");e.isProactiveActive()||e.activateProactive("command")}}function maybeActivateBrief(e){if(!o("KAIROS")&&!o("KAIROS_BRIEF"))return;const t=e.brief,i=jo(process.env.CONTEXT_CODE_BRIEF)||jo(process.env.CLAUDE_CODE_BRIEF);if(!t&&!i)return;const{isBriefEntitled:r}=s("./tools/BriefTool/BriefTool.js"),n=r();n&&$s(!0),Re("tengu_brief_mode_enabled",{enabled:n,gated:!n,source:i?"env":"flag"})}
|
|
1
|
+
import{MACRO as e,feature as o}from"./recovery/bunBundleShim.js";import{createRequire as t}from"module";const s=t(import.meta.url);import{profileCheckpoint as i,profileReport as r}from"./utils/startupProfiler.js";i("main_tsx_entry");import{startMdmRawRead as n}from"./utils/settings/mdm/rawRead.js";n();import{ensureKeychainPrefetchCompleted as a,startKeychainPrefetch as c}from"./utils/secureStorage/keychainPrefetch.js";c();import{Command as l,InvalidArgumentError as d,Option as p}from"@commander-js/extra-typings";import m from"chalk";import{readFileSync as u}from"fs";import g from"lodash-es/mapValues.js";import f from"lodash-es/pickBy.js";import h from"lodash-es/uniqBy.js";import{getOauthConfig as v}from"./constants/oauth.js";import{getRemoteSessionUrl as w}from"./constants/product.js";import{getSystemContext as C,getUserContext as _}from"./context.js";import{init as S,initializeTelemetryAfterTrust as y}from"./entrypoints/init.js";import{addToHistory as E}from"./history.js";import{launchRepl as b}from"./replLauncher.js";import{hasGrowthBookEnvOverride as j,initializeGrowthBook as O,refreshGrowthBookAfterAuthChange as T}from"./services/analytics/growthbook.js";import{fetchBootstrapData as P}from"./services/api/bootstrap.js";import{downloadSessionFiles as A,parseFileSpecs as I}from"./services/api/filesApi.js";import{prefetchPassesEligibility as k}from"./services/api/referral.js";import{prefetchOfficialMcpUrls as D}from"./services/mcp/officialRegistry.js";import{isPolicyAllowed as x,loadPolicyLimits as R,refreshPolicyLimits as M,waitForPolicyLimitsToLoad as N}from"./services/policyLimits/index.js";import{loadRemoteManagedSettings as L,refreshRemoteManagedSettings as U}from"./services/remoteManagedSettings/index.js";import{createSyntheticOutputTool as H,isSyntheticOutputToolEnabled as $}from"./tools/SyntheticOutputTool/SyntheticOutputTool.js";import{getTools as B}from"./tools.js";import{canUserConfigureAdvisor as F,getInitialAdvisorSetting as K,isAdvisorEnabled as q,isValidAdvisorModel as V,modelSupportsAdvisor as z}from"./utils/advisor.js";import{isAgentSwarmsEnabled as W}from"./utils/agentSwarmsEnabled.js";import{count as G,uniq as X}from"./utils/array.js";import{installAsciicastRecorder as Y}from"./utils/asciicast.js";import{getSubscriptionType as J,prefetchAwsCredentialsAndBedRockInfoIfSafe as Q,prefetchGcpCredentialsIfSafe as Z,validateForceLoginOrg as ee}from"./utils/auth.js";import{checkHasTrustDialogAccepted as oe,getGlobalConfig as te,getRemoteControlAtStartup as se,isAutoUpdaterDisabled as ie,saveGlobalConfig as re}from"./utils/config.js";import{seedEarlyInput as ne,stopCapturingEarlyInput as ae}from"./utils/earlyInput.js";import{getInitialEffortSetting as ce,parseEffortValue as le}from"./utils/effort.js";import{getInitialFastModeSetting as de,isFastModeEnabled as pe,prefetchFastModeStatus as me,resolveFastModeStatusFromCache as ue}from"./utils/fastMode.js";import{applyConfigEnvironmentVariables as ge}from"./utils/managedEnv.js";import{createSystemMessage as fe,createUserMessage as he}from"./utils/messages.js";import{getPlatform as ve}from"./utils/platform.js";import{getBaseRenderOptions as we}from"./utils/renderOptions.js";import{getSessionIngressAuthToken as Ce}from"./utils/sessionIngressAuth.js";import{settingsChangeDetector as _e}from"./utils/settings/changeDetector.js";import{skillChangeDetector as Se}from"./utils/skills/skillChangeDetector.js";import{jsonParse as ye,writeFileSync_DEPRECATED as Ee}from"./utils/slowOperations.js";import{computeInitialTeamContext as be}from"./utils/swarm/reconnection.js";import{initializeWarningHandler as je}from"./utils/warningHandler.js";import{isWorktreeModeEnabled as Oe}from"./utils/worktreeModeEnabled.js";const getTeammateUtils=()=>s("./utils/teammate.js"),Te=o("COORDINATOR_MODE")?s("./coordinator/coordinatorMode.js"):null,Pe=o("KAIROS")?s("./assistant/index.js"):null,Ae=o("KAIROS")?s("./assistant/gate.js"):null;import{relative as Ie,resolve as ke}from"path";import{isAnalyticsDisabled as De}from"./services/analytics/config.js";import{getFeatureValue_CACHED_MAY_BE_STALE as xe}from"./services/analytics/growthbook.js";import{logEvent as Re}from"./services/analytics/index.js";import{initializeAnalyticsGates as Me}from"./services/analytics/sink.js";import{getOriginalCwd as Ne,setAdditionalDirectoriesForClaudeMd as Le,setIsRemoteMode as Ue,setMainLoopModelOverride as He,setMainThreadAgentType as $e,setTeleportedSessionInfo as Be}from"./bootstrap/state.js";import{filterCommandsForRemoteMode as Fe,getCommands as Ke}from"./commands.js";import{launchAssistantInstallWizard as qe,launchAssistantSessionChooser as Ve,launchInvalidSettingsDialog as ze,launchResumeChooser as We,launchSnapshotUpdateDialog as Ge,launchTeleportRepoMismatchDialog as Xe,launchTeleportResumeWrapper as Ye}from"./dialogLaunchers.js";import{SHOW_CURSOR as Je}from"./ink/termio/dec.js";import{exitWithError as Qe,exitWithMessage as Ze,getRenderContext as eo,renderAndRun as oo,showSetupScreens as to}from"./interactiveHelpers.js";import{initBuiltinPlugins as so}from"./plugins/bundled/index.js";import{checkQuotaStatus as io}from"./services/claudeAiLimits.js";import{getMcpToolsCommandsAndResources as ro,prefetchAllMcpResources as no}from"./services/mcp/client.js";import{VALID_INSTALLABLE_SCOPES as ao,VALID_UPDATE_SCOPES as co}from"./services/plugins/pluginCliCommands.js";import{initBundledSkills as lo}from"./skills/bundled/index.js";import{getActiveAgentsFromList as po,getAgentDefinitionsWithOverrides as mo,isBuiltInAgent as uo,isCustomAgent as go,parseAgentsFromJson as fo}from"./tools/AgentTool/loadAgentsDir.js";import{assertMinVersion as ho}from"./utils/autoUpdater.js";import{setupClaudeInChrome as vo,shouldAutoEnableClaudeInChrome as wo,shouldEnableClaudeInChrome as Co}from"./utils/claudeInChrome/setup.js";import{getContextWindowForModel as _o}from"./utils/context.js";import{loadConversationForResume as So}from"./utils/conversationRecovery.js";import{buildDeepLinkBanner as yo}from"./utils/deepLink/banner.js";import{hasNodeOption as Eo,isBareMode as bo,isEnvTruthy as jo,isInProtectedNamespace as Oo}from"./utils/envUtils.js";import{refreshExampleCommands as To}from"./utils/exampleCommands.js";import{getWorktreePaths as Po}from"./utils/getWorktreePaths.js";import{findGitRoot as Ao,getBranch as Io,getIsGit as ko,getWorktreeCount as Do}from"./utils/git.js";import{getGhAuthStatus as xo}from"./utils/github/ghAuthStatus.js";import{safeParseJSON as Ro}from"./utils/json.js";import{logError as Mo}from"./utils/log.js";import{getModelDeprecationWarning as No}from"./utils/model/deprecation.js";import{getDefaultMainLoopModel as Lo,getUserSpecifiedModelSetting as Uo,normalizeModelStringForAPI as Ho,parseUserSpecifiedModel as $o}from"./utils/model/model.js";import{ensureModelStringsInitialized as Bo}from"./utils/model/modelStrings.js";import{PERMISSION_MODES as Fo}from"./utils/permissions/PermissionMode.js";import{checkAndDisableBypassPermissions as Ko,getAutoModeEnabledStateIfCached as qo,initializeToolPermissionContext as Vo,initialPermissionModeFromCLI as zo,isDefaultPermissionModeAuto as Wo,parseToolListFromCLI as Go,removeDangerousPermissions as Xo,stripDangerousPermissionsForAutoMode as Yo,verifyAutoModeGateAccess as Jo}from"./utils/permissions/permissionSetup.js";import{cleanupOrphanedPluginVersionsInBackground as Qo}from"./utils/plugins/cacheUtils.js";import{initializeVersionedPlugins as Zo}from"./utils/plugins/installedPluginsManager.js";import{getManagedPluginNames as et}from"./utils/plugins/managedPlugins.js";import{getGlobExclusionsForPluginCache as ot}from"./utils/plugins/orphanedPluginFilter.js";import{getPluginSeedDirs as tt}from"./utils/plugins/pluginDirectories.js";import{countFilesRoundedRg as st}from"./utils/ripgrep.js";import{processSessionStartHooks as it,processSetupHooks as rt}from"./utils/sessionStart.js";import{cacheSessionTitle as nt,getSessionIdFromLog as at,loadTranscriptFromFile as ct,saveAgentSetting as lt,saveMode as dt,searchSessionsByCustomTitle as pt,sessionIdExists as mt}from"./utils/sessionStorage.js";import{ensureMdmSettingsLoaded as ut}from"./utils/settings/mdm/settings.js";import{getInitialSettings as gt,getManagedSettingsKeysForLogging as ft,getSettingsForSource as ht,getSettingsWithErrors as vt}from"./utils/settings/settings.js";import{resetSettingsCache as wt}from"./utils/settings/settingsCache.js";import{DEFAULT_TASKS_MODE_TASK_LIST_ID as Ct,TASK_STATUSES as _t}from"./utils/tasks.js";import{logPluginLoadErrors as St,logPluginsEnabledForSession as yt}from"./utils/telemetry/pluginTelemetry.js";import{logSkillsLoaded as Et}from"./utils/telemetry/skillLoadedEvent.js";import{generateTempFilePath as bt}from"./utils/tempfile.js";import{validateUuid as jt}from"./utils/uuid.js";import{registerMcpAddCommand as Ot}from"./commands/mcp/addCommand.js";import{registerMcpXaaIdpCommand as Tt}from"./commands/mcp/xaaIdpCommand.js";import{logPermissionContextForAnts as Pt}from"./services/internalLogging.js";import{fetchClaudeAIMcpConfigsIfEligible as At}from"./services/mcp/claudeai.js";import{clearServerCache as It}from"./services/mcp/client.js";import{areMcpConfigsAllowedWithEnterpriseMcpConfig as kt,dedupClaudeAiMcpServers as Dt,doesEnterpriseMcpConfigExist as xt,filterMcpServersByPolicy as Rt,getClaudeCodeMcpConfigs as Mt,getMcpServerSignature as Nt,parseMcpConfig as Lt,parseMcpConfigFromFilePath as Ut}from"./services/mcp/config.js";import{excludeCommandsByServer as Ht,excludeResourcesByServer as $t}from"./services/mcp/utils.js";import{isXaaEnabled as Bt}from"./services/mcp/xaaIdpLogin.js";import{getRelevantTips as Ft}from"./services/tips/tipRegistry.js";import{logContextMetrics as Kt}from"./utils/api.js";import{CLAUDE_IN_CHROME_MCP_SERVER_NAME as qt,isClaudeInChromeMCPServer as Vt}from"./utils/claudeInChrome/common.js";import{registerCleanup as zt}from"./utils/cleanupRegistry.js";import{eagerParseCliFlag as Wt}from"./utils/cliArgs.js";import{createEmptyAttributionState as Gt}from"./utils/commitAttribution.js";import{countConcurrentSessions as Xt,registerSession as Yt,updateSessionName as Jt}from"./utils/concurrentSessions.js";import{getCwd as Qt}from"./utils/cwd.js";import{logForDebugging as Zt,setHasFormattedOutput as es}from"./utils/debug.js";import{errorMessage as os,getErrnoCode as ts,isENOENT as ss,TeleportOperationError as is,toError as rs}from"./utils/errors.js";import{getFsImplementation as ns,safeResolvePath as as}from"./utils/fsOperations.js";import{gracefulShutdown as cs,gracefulShutdownSync as ls}from"./utils/gracefulShutdown.js";import{setAllHookEventsEnabled as ds}from"./utils/hooks/hookEvents.js";import{refreshModelCapabilities as ps}from"./utils/model/modelCapabilities.js";import{peekForStdinData as ms,writeToStderr as us}from"./utils/process.js";import{setCwd as gs}from"./utils/Shell.js";import{processResumedConversation as fs}from"./utils/sessionRestore.js";import{parseSettingSourcesFlag as hs}from"./utils/settings/constants.js";import{plural as vs}from"./utils/stringUtils.js";import{getInitialMainLoopModel as ws,getIsNonInteractiveSession as Cs,getSdkBetas as _s,getSessionId as Ss,getUserMsgOptIn as ys,setAllowedChannels as Es,setAllowedSettingSources as bs,setChromeFlagOverride as js,setClientType as Os,setCwdState as Ts,setDirectConnectServerUrl as Ps,setFlagSettingsPath as As,setInitialMainLoopModel as Is,setInlinePlugins as ks,setIsInteractive as Ds,setKairosActive as xs,setOriginalCwd as Rs,setQuestionPreviewFormat as Ms,setSdkBetas as Ns,setSessionBypassPermissionsMode as Ls,setSessionPersistenceDisabled as Us,setSessionSource as Hs,setUserMsgOptIn as $s,switchSession as Bs}from"./bootstrap/state.js";const Fs=o("TRANSCRIPT_CLASSIFIER")?s("./utils/permissions/autoModeState.js"):null;import{migrateAutoUpdatesToSettings as Ks}from"./migrations/migrateAutoUpdatesToSettings.js";import{migrateBypassPermissionsAcceptedToSettings as qs}from"./migrations/migrateBypassPermissionsAcceptedToSettings.js";import{migrateEnableAllProjectMcpServersToSettings as Vs}from"./migrations/migrateEnableAllProjectMcpServersToSettings.js";import{migrateFennecToOpus as zs}from"./migrations/migrateFennecToOpus.js";import{migrateLegacyOpusToCurrent as Ws}from"./migrations/migrateLegacyOpusToCurrent.js";import{migrateOpusToOpus1m as Gs}from"./migrations/migrateOpusToOpus1m.js";import{migrateReplBridgeEnabledToRemoteControlAtStartup as Xs}from"./migrations/migrateReplBridgeEnabledToRemoteControlAtStartup.js";import{migrateSonnet1mToSonnet45 as Ys}from"./migrations/migrateSonnet1mToSonnet45.js";import{migrateSonnet45ToSonnet46 as Js}from"./migrations/migrateSonnet45ToSonnet46.js";import{resetAutoModeOptInForDefaultOffer as Qs}from"./migrations/resetAutoModeOptInForDefaultOffer.js";import{resetProToOpusDefault as Zs}from"./migrations/resetProToOpusDefault.js";import{createRemoteSessionConfig as ei}from"./remote/RemoteSessionManager.js";import{createDirectConnectSession as oi,DirectConnectError as ti}from"./server/createDirectConnectSession.js";import{initializeLspServerManager as si}from"./services/lsp/manager.js";import{shouldEnablePromptSuggestion as ii}from"./services/PromptSuggestion/promptSuggestion.js";import{getDefaultAppState as ri,IDLE_SPECULATION_STATE as ni}from"./state/AppStateStore.js";import{onChangeAppState as ai}from"./state/onChangeAppState.js";import{createStore as ci}from"./state/store.js";import{asSessionId as li}from"./types/ids.js";import{filterAllowedSdkBetas as di}from"./utils/betas.js";import{isInBundledMode as pi,isRunningWithBun as mi}from"./utils/bundledMode.js";import{logForDiagnosticsNoPII as ui}from"./utils/diagLogs.js";import{filterExistingPaths as gi,getKnownPathsForRepo as fi}from"./utils/githubRepoPathMapping.js";import{clearPluginCache as hi,loadAllPluginsCacheOnly as vi}from"./utils/plugins/pluginLoader.js";import{migrateChangelogFromConfig as wi}from"./utils/releaseNotes.js";import{SandboxManager as Ci}from"./utils/sandbox/sandbox-adapter.js";import{fetchSession as _i,prepareApiRequest as Si}from"./utils/teleport/api.js";import{checkOutTeleportedSessionBranch as yi,processMessagesForTeleportResume as Ei,teleportToRemoteWithErrorHandling as bi,validateGitState as ji,validateSessionRepository as Oi}from"./utils/teleport.js";import{shouldEnableThinkingByDefault as Ti}from"./utils/thinking.js";import{initUser as Pi,resetUserCache as Ai}from"./utils/user.js";import{getTmuxInstallInstructions as Ii,isTmuxAvailable as ki,parsePRReference as Di}from"./utils/worktree.js";function logSessionTelemetry(){const e=$o(ws()??Lo());Et(Qt(),_o(e,_s())),vi().then(({enabled:e,errors:o})=>{const t=et();yt(e,t,tt()),St(o,t)}).catch(e=>Mo(e))}function getCertEnvVarTelemetry(){const e={};return process.env.NODE_EXTRA_CA_CERTS&&(e.has_node_extra_ca_certs=!0),(process.env.CONTEXT_CODE_CLIENT_CERT||process.env.CLAUDE_CODE_CLIENT_CERT)&&(e.has_client_cert=!0),Eo("--use-system-ca")&&(e.has_use_system_ca=!0),Eo("--use-openssl-ca")&&(e.has_use_openssl_ca=!0),e}i("main_tsx_imports_loaded"),function(){const e=mi(),o=process.execArgv.some(o=>e?/--inspect(-brk)?/.test(o):/--inspect(-brk)?|--debug(-brk)?/.test(o)),t=process.env.NODE_OPTIONS&&/--inspect(-brk)?|--debug(-brk)?/.test(process.env.NODE_OPTIONS);try{const e=global.require("inspector");return!!e.url()||o||t}catch{return o||t}}()&&process.exit(1);export function startDeferredPrefetches(){jo(process.env.CONTEXT_CODE_EXIT_AFTER_FIRST_RENDER)||jo(process.env.CLAUDE_CODE_EXIT_AFTER_FIRST_RENDER)||bo()||(Pi(),_(),function(){if(Cs())return ui("info","prefetch_system_context_non_interactive"),void C();oe()?(ui("info","prefetch_system_context_has_trust"),C()):ui("info","prefetch_system_context_skipped_no_trust")}(),Ft(),!jo(process.env.CLAUDE_CODE_USE_BEDROCK)||jo(process.env.CONTEXT_CODE_SKIP_BEDROCK_AUTH)||jo(process.env.CLAUDE_CODE_SKIP_BEDROCK_AUTH)||Q(),!jo(process.env.CLAUDE_CODE_USE_VERTEX)||jo(process.env.CONTEXT_CODE_SKIP_VERTEX_AUTH)||jo(process.env.CLAUDE_CODE_SKIP_VERTEX_AUTH)||Z(),st(Qt(),AbortSignal.timeout(3e3),[]),Me(),D(),ps(),_e.initialize(),bo()||Se.initialize(),import("./commands/login/login.js"))}function eagerLoadSettings(){i("eagerLoadSettings_start");const e=Wt("--settings");e&&function(e){try{const o=e.trim();let t;if(o.startsWith("{")&&o.endsWith("}"))Ro(o)||(process.stderr.write(m.red("Error: Invalid JSON provided to --settings\n")),process.exit(1)),t=bt("claude-settings",".json",{contentHash:o}),Ee(t,o,"utf8");else{const{resolvedPath:o}=as(ns(),e);try{u(o,"utf8")}catch(e){throw ss(e)&&(process.stderr.write(m.red(`Error: Settings file not found: ${o}\n`)),process.exit(1)),e}t=o}As(t),wt()}catch(e){e instanceof Error&&Mo(e),process.stderr.write(m.red(`Error processing settings: ${os(e)}\n`)),process.exit(1)}}(e);const o=Wt("--setting-sources");void 0!==o&&function(e){try{const o=hs(e);bs(o),wt()}catch(e){e instanceof Error&&Mo(e),process.stderr.write(m.red(`Error processing --setting-sources: ${os(e)}\n`)),process.exit(1)}}(o),i("eagerLoadSettings_end")}const xi=o("DIRECT_CONNECT")?{url:void 0,authToken:void 0,dangerouslySkipPermissions:!1}:void 0,Ri=o("KAIROS")?{sessionId:void 0,discover:!1}:void 0,Mi=o("SSH_REMOTE")?{host:void 0,cwd:void 0,permissionMode:void 0,dangerouslySkipPermissions:!1,local:!1,extraCliArgs:[]}:void 0;export async function main(){if(i("main_function_start"),process.env.NoDefaultCurrentDirectoryInExePath="1",je(),process.on("exit",()=>{!function(){const e=process.stderr.isTTY?process.stderr:process.stdout.isTTY?process.stdout:void 0;e?.write(Je)}()}),process.on("SIGINT",()=>{process.argv.includes("-p")||process.argv.includes("--print")||process.exit(0)}),i("main_warning_handler_initialized"),o("DIRECT_CONNECT")){const e=process.argv.slice(2),o=e.findIndex(e=>e.startsWith("cc://")||e.startsWith("cc+unix://"));if(-1!==o&&xi){const t=e[o],{parseConnectUrl:s}=await import("./server/parseConnectUrl.js"),i=s(t);if(xi.dangerouslySkipPermissions=e.includes("--dangerously-skip-permissions"),e.includes("-p")||e.includes("--print")){const s=e.filter((e,t)=>t!==o),i=s.indexOf("--dangerously-skip-permissions");-1!==i&&s.splice(i,1),process.argv=[process.argv[0],process.argv[1],"open",t,...s]}else{xi.url=i.serverUrl,xi.authToken=i.authToken;const t=e.filter((e,t)=>t!==o),s=t.indexOf("--dangerously-skip-permissions");-1!==s&&t.splice(s,1),process.argv=[process.argv[0],process.argv[1],...t]}}}if(o("LODESTONE")){const e=process.argv.indexOf("--handle-uri");if(-1!==e&&process.argv[e+1]){const{enableConfigs:o}=await import("./utils/config.js");o();const t=process.argv[e+1],{handleDeepLinkUri:s}=await import("./utils/deepLink/protocolHandler.js"),i=await s(t);process.exit(i)}if("darwin"===process.platform&&"com.anthropic.claude-code-url-handler"===process.env.__CFBundleIdentifier){const{enableConfigs:e}=await import("./utils/config.js");e();const{handleUrlSchemeLaunch:o}=await import("./utils/deepLink/protocolHandler.js"),t=await o();process.exit(t??1)}}if(o("KAIROS")&&Ri){const e=process.argv.slice(2);if("assistant"===e[0]){const o=e[1];o&&!o.startsWith("-")?(Ri.sessionId=o,e.splice(0,2),process.argv=[process.argv[0],process.argv[1],...e]):o||(Ri.discover=!0,e.splice(0,1),process.argv=[process.argv[0],process.argv[1],...e])}}if(o("SSH_REMOTE")&&Mi){const e=process.argv.slice(2);if("ssh"===e[0]){const o=e.indexOf("--local");-1!==o&&(Mi.local=!0,e.splice(o,1));const t=e.indexOf("--dangerously-skip-permissions");-1!==t&&(Mi.dangerouslySkipPermissions=!0,e.splice(t,1));const s=e.indexOf("--permission-mode");-1!==s&&e[s+1]&&!e[s+1].startsWith("-")&&(Mi.permissionMode=e[s+1],e.splice(s,2));const i=e.findIndex(e=>e.startsWith("--permission-mode="));-1!==i&&(Mi.permissionMode=e[i].split("=")[1],e.splice(i,1));const extractFlag=(o,t={})=>{const s=e.indexOf(o);if(-1!==s){Mi.extraCliArgs.push(t.as??o);const i=e[s+1];t.hasValue&&i&&!i.startsWith("-")?(Mi.extraCliArgs.push(i),e.splice(s,2)):e.splice(s,1)}const i=e.findIndex(e=>e.startsWith(`${o}=`));-1!==i&&(Mi.extraCliArgs.push(t.as??o,e[i].slice(o.length+1)),e.splice(i,1))};extractFlag("-c",{as:"--continue"}),extractFlag("--continue"),extractFlag("--resume",{hasValue:!0}),extractFlag("--model",{hasValue:!0})}if("ssh"===e[0]&&e[1]&&!e[1].startsWith("-")){Mi.host=e[1];let o=2;e[2]&&!e[2].startsWith("-")&&(Mi.cwd=e[2],o=3);const t=e.slice(o);if(t.includes("-p")||t.includes("--print"))return process.stderr.write("Error: el modo sin cabeza (-p/--print) no es compatible con context ssh\n"),void ls(1);process.argv=[process.argv[0],process.argv[1],...t]}}const t=process.argv.slice(2),n=t.includes("-p")||t.includes("--print"),c=t.includes("--init-only"),j=t.some(e=>e.startsWith("--sdk-url")),O=n||c||j||!process.stdout.isTTY;O&&ae();Ds(!O),function(e){if(process.env.CLAUDE_CODE_ENTRYPOINT)return;const o=process.argv.slice(2),t=o.indexOf("mcp");-1===t||"serve"!==o[t+1]?jo(process.env.CONTEXT_CODE_ACTION)||jo(process.env.CLAUDE_CODE_ACTION)?process.env.CLAUDE_CODE_ENTRYPOINT="claude-code-github-action":process.env.CLAUDE_CODE_ENTRYPOINT=e?"sdk-cli":"cli":process.env.CLAUDE_CODE_ENTRYPOINT="mcp"}(O);const D=(()=>{if(jo(process.env.GITHUB_ACTIONS))return"github-action";if("sdk-ts"===process.env.CLAUDE_CODE_ENTRYPOINT)return"sdk-typescript";if("sdk-py"===process.env.CLAUDE_CODE_ENTRYPOINT)return"sdk-python";if("sdk-cli"===process.env.CLAUDE_CODE_ENTRYPOINT)return"sdk-cli";if("claude-vscode"===process.env.CLAUDE_CODE_ENTRYPOINT)return"claude-vscode";if("local-agent"===process.env.CLAUDE_CODE_ENTRYPOINT)return"local-agent";if("claude-desktop"===process.env.CLAUDE_CODE_ENTRYPOINT)return"claude-desktop";const e=process.env.CONTEXT_CODE_SESSION_ACCESS_TOKEN||process.env.CLAUDE_CODE_SESSION_ACCESS_TOKEN||process.env.CONTEXT_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_WEBSOCKET_AUTH_FILE_DESCRIPTOR;return"remote"===process.env.CLAUDE_CODE_ENTRYPOINT||e?"remote":"cli"})();Os(D);const Y=process.env.CONTEXT_CODE_QUESTION_PREVIEW_FORMAT??process.env.CLAUDE_CODE_QUESTION_PREVIEW_FORMAT;"markdown"===Y||"html"===Y?Ms(Y):D.startsWith("sdk-")||"claude-desktop"===D||"local-agent"===D||"remote"===D||Ms("markdown"),"bridge"!==process.env.CONTEXT_CODE_ENVIRONMENT_KIND&&"bridge"!==process.env.CLAUDE_CODE_ENVIRONMENT_KIND||Hs("remote-control"),i("main_client_type_determined"),eagerLoadSettings(),i("main_before_run"),await async function(){function createSortedHelpConfig(){const getOptionSortKey=e=>e.long?.replace(/^--/,"")??e.short?.replace(/^-/,"")??"";return Object.assign({sortSubcommands:!0,sortOptions:!0},{compareOptions:(e,o)=>getOptionSortKey(e).localeCompare(getOptionSortKey(o))})}i("run_function_start");const t=(new l).configureHelp(createSortedHelpConfig()).enablePositionalOptions();i("run_commander_initialized"),t.hook("preAction",async e=>{i("preAction_start"),await Promise.all([ut(),a()]),i("preAction_after_mdm"),await S(),i("preAction_after_init"),jo(process.env.CONTEXT_CODE_DISABLE_TERMINAL_TITLE)||jo(process.env.CLAUDE_CODE_DISABLE_TERMINAL_TITLE)||(process.title="claude");const{initSinks:t}=await import("./utils/sinks.js");t(),i("preAction_after_sinks");const s=e.getOptionValue("pluginDir");Array.isArray(s)&&s.length>0&&s.every(e=>"string"==typeof e)&&(ks(s),hi("preAction: --plugin-dir inline plugins")),11!==te().migrationVersion&&(Ks(),qs(),Vs(),Zs(),Ys(),Ws(),Js(),Gs(),Xs(),o("TRANSCRIPT_CLASSIFIER")&&Qs(),re(e=>11===e.migrationVersion?e:{...e,migrationVersion:11})),wi().catch(()=>{}),i("preAction_after_migrations"),L(),R(),i("preAction_after_remote_settings"),o("UPLOAD_USER_SETTINGS")&&import("./services/settingsSync/index.js").then(e=>e.uploadUserSettingsInBackground()),i("preAction_after_settings_sync")}),t.name("context").description("Context Code - inicia una sesión interactiva por defecto, usa -p/--print para salida no interactiva").argument("[consulta...]","Tu consulta").helpOption("-h, --help","Muestra la ayuda del comando").option("-d, --debug [filtro]",'Activa el modo de depuración con filtrado opcional de categorías (ej. "api,hooks" o "!1p,!file")',e=>!0).addOption(new p("--debug-to-stderr","Activa el modo de depuración (a stderr)").argParser(Boolean).hideHelp()).option("--debug-file <ruta>","Escribe los logs de depuración en una ruta específica (activa implícitamente el modo de depuración)",()=>!0).option("--verbose","Sobrescribe el ajuste de modo detallado de la configuración",()=>!0).option("-p, --print","Imprime la respuesta y sale (útil para tuberías). Nota: El diálogo de confianza del espacio de trabajo se omite cuando se ejecuta con el modo -p. Solo usa esta bandera en directorios en los que confíes.",()=>!0).option("--bare","Modo mínimo: omite hooks, LSP, sincronización de plugins, atribución, auto-memoria, prefetches de fondo, lecturas de llavero y auto-descubrimiento de CLAUDE.md. Establece CLAUDE_CODE_SIMPLE=1. La autenticación de Anthropic es estrictamente ANTHROPIC_API_KEY o apiKeyHelper a través de --settings (OAuth y el llavero nunca se leen). Los proveedores 3P (Bedrock/Vertex/Foundry) usan sus propias credenciales. Las habilidades aún se resuelven a través de /nombre-habilidad. Proporciona contexto explícitamente a través de: --system-prompt[-file], --append-system-prompt[-file], --add-dir (directorios CLAUDE.md), --mcp-config, --settings, --agents, --plugin-dir.",()=>!0).addOption(new p("--init","Ejecuta los hooks de configuración con el disparador init, luego continúa").hideHelp()).addOption(new p("--init-only","Ejecuta los hooks de configuración y SessionStart:startup, luego sale").hideHelp()).addOption(new p("--maintenance","Ejecuta los hooks de configuración con el disparador de mantenimiento, luego continúa").hideHelp()).addOption(new p("--output-format <formato>",'Formato de salida (solo funciona con --print): "text" (por defecto), "json" (resultado único) o "stream-json" (transmisión en tiempo real)').choices(["text","json","stream-json"])).addOption(new p("--json-schema <esquema>",'Esquema JSON para la validación de salida estructurada. Ejemplo: {"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}').argParser(String)).option("--include-hook-events","Incluye todos los eventos del ciclo de vida del hook en el flujo de salida (solo funciona con --output-format=stream-json)",()=>!0).option("--include-partial-messages","Incluye fragmentos de mensajes parciales a medida que llegan (solo funciona con --print y --output-format=stream-json)",()=>!0).addOption(new p("--input-format <formato>",'Formato de entrada (solo funciona con --print): "text" (por defecto) o "stream-json" (entrada transmitida en tiempo real)').choices(["text","stream-json"])).option("--mcp-debug","[OBSOLETO. Usa --debug en su lugar] Activa el modo de depuración de MCP (muestra errores del servidor MCP)",()=>!0).option("--dangerously-skip-permissions","Omite todas las comprobaciones de permisos. Recomendado solo para sandboxes sin acceso a internet.",()=>!0).option("--allow-dangerously-skip-permissions","Permite omitir todas las comprobaciones de permisos como una opción, sin que esté activado por defecto. Recomendado solo para sandboxes sin acceso a internet.",()=>!0).addOption(new p("--thinking <modo>","Modo de pensamiento: enabled (equivalente a adaptive), disabled").choices(["enabled","adaptive","disabled"]).hideHelp()).addOption(new p("--max-thinking-tokens <tokens>","[OBSOLETO. Usa --thinking en su lugar para modelos más nuevos] Número máximo de tokens de pensamiento (solo funciona con --print)").argParser(Number).hideHelp()).addOption(new p("--max-turns <turnos>","Número máximo de turnos agénticos en modo no interactivo. Esto detendrá la conversación después del número especificado de turnos. (solo funciona con --print)").argParser(Number).hideHelp()).addOption(new p("--max-budget-usd <cantidad>","Cantidad máxima en dólares para gastar en llamadas a la API (solo funciona con --print)").argParser(e=>{const o=Number(e);if(isNaN(o)||o<=0)throw new Error("--max-budget-usd debe ser un número positivo mayor que 0");return o})).addOption(new p("--task-budget <tokens>","Presupuesto de tareas del lado de la API en tokens (output_config.task_budget)").argParser(e=>{const o=Number(e);if(isNaN(o)||o<=0||!Number.isInteger(o))throw new Error("--task-budget debe ser un entero positivo");return o}).hideHelp()).option("--replay-user-messages","Vuelve a emitir los mensajes del usuario desde stdin de vuelta a stdout para confirmación (solo funciona con --input-format=stream-json e --output-format=stream-json)",()=>!0).addOption(new p("--enable-auth-status","Activa los mensajes de estado de autenticación en modo SDK").default(!1).hideHelp()).option("--allowedTools, --allowed-tools <herramientas...>",'Lista de nombres de herramientas permitidas separadas por comas o espacios (ej. "Bash(git:*) Edit")').option("--tools <herramientas...>",'Especifica la lista de herramientas disponibles del conjunto integrado. Usa "" para desactivar todas las herramientas, "default" para usar todas las herramientas, o especifica nombres de herramientas (ej. "Bash,Edit,Read").').option("--disallowedTools, --disallowed-tools <herramientas...>",'Lista de nombres de herramientas denegadas separadas por comas o espacios (ej. "Bash(git:*) Edit")').option("--mcp-config <configs...>","Carga servidores MCP desde archivos JSON o cadenas (separados por espacios)").addOption(new p("--permission-prompt-tool <herramienta>","Herramienta MCP a usar para solicitudes de permisos (solo funciona con --print)").argParser(String).hideHelp()).addOption(new p("--system-prompt <prompt>","Prompt del sistema a usar para la sesión").argParser(String)).addOption(new p("--system-prompt-file <archivo>","Lee el prompt del sistema desde un archivo").argParser(String).hideHelp()).addOption(new p("--append-system-prompt <prompt>","Añade un prompt del sistema al prompt del sistema predeterminado").argParser(String)).addOption(new p("--append-system-prompt-file <archivo>","Lee un prompt del sistema desde un archivo y lo añade al prompt del sistema predeterminado").argParser(String).hideHelp()).addOption(new p("--permission-mode <modo>","Modo de permisos a usar para la sesión").argParser(String).choices(Fo)).option("-c, --continue","Continúa la conversación más reciente en el directorio actual",()=>!0).option("-r, --resume [valor]","Reanuda una conversación por ID de sesión, o abre el selector interactivo con un término de búsqueda opcional",e=>e||!0).option("--fork-session","Al reanudar, protege el ID de sesión original creando uno nuevo (úsalo con --resume o --continue)",()=>!0).addOption(new p("--prefill <texto>","Rellena previamente la entrada del prompt con texto sin enviarlo").hideHelp()).addOption(new p("--deep-link-origin","Señala que esta sesión se inició desde un enlace profundo").hideHelp()).addOption(new p("--deep-link-repo <slug>","Repositorio al que se resolvió el enlace profundo en el cwd actual").hideHelp()).addOption(new p("--deep-link-last-fetch <ms>","mtime de FETCH_HEAD en ms, precalculado por el enlace profundo").argParser(e=>{const o=Number(e);return Number.isFinite(o)?o:void 0}).hideHelp()).option("--from-pr [valor]","Reanuda una sesión vinculada a un PR, o abre el selector interactivo",e=>e||!0).option("--no-session-persistence","Desactiva la persistencia de sesión: las sesiones no se guardarán en disco (solo con --print)").addOption(new p("--resume-session-at <id mensaje>","Al reanudar, solo incluye mensajes hasta el ID especificado (usa con --resume en modo print)").argParser(String).hideHelp()).addOption(new p("--rewind-files <id-mensaje>","Restaura archivos al estado del mensaje especificado y sale (requiere --resume)").hideHelp()).option("--model <modelo>","Modelo para la sesión. Usa un alias (ej. 'sonnet') o el nombre completo (ej. 'claude-sonnet-4-6').").addOption(new p("--effort <level>","Nivel de esfuerzo (low, medium, high, max)").argParser(e=>{const o=e.toLowerCase(),t=["low","medium","high","max"];if(!t.includes(o))throw new d(`Debe ser uno de: ${t.join(", ")}`);return o})).option("--agent <agente>","Agente para la sesión. Sobrescribe el ajuste 'agent'.").option("--betas <betas...>","Encabezados beta para peticiones API (solo usuarios con API key)").option("--fallback-model <modelo>","Habilita el cambio automático al modelo especificado si el principal está saturado (solo con --print)").addOption(new p("--workload <tag>","Etiqueta de carga para atribución de facturación. Solo para uso interno. (solo con --print)").hideHelp()).option("--settings <archivo-o-json>","Ruta a un archivo JSON de ajustes o cadena JSON").option("--add-dir <directorios...>","Directorios adicionales permitidos para las herramientas").option("--ide","Conecta automáticamente al IDE al iniciar si hay uno disponible",()=>!0).option("--strict-mcp-config","Solo usa servidores MCP de --mcp-config",()=>!0).option("--session-id <uuid>","Usa un ID de sesión específico (debe ser un UUID válido)").option("-n, --name <nombre>","Establece un nombre para esta sesión (se muestra en /resume y en el título)").option("--agents <json>","Objeto JSON definiendo agentes personalizados").option("--setting-sources <fuentes>","Lista de fuentes de ajustes a cargar (user, project, local) separadas por comas.").option("--plugin-dir <ruta>","Carga plugins desde un directorio (repetible: --plugin-dir A --plugin-dir B)",(e,o)=>[...o,e],[]).option("--disable-slash-commands","Desactiva todas las habilidades",()=>!0).option("--chrome","Habilita la integración de Claude en Chrome").option("--no-chrome","Desactiva la integración de Claude en Chrome").option("--chrome-anty","Habilita la extensión Antigravity Browser Extension").option("--file <especificaciones...>","Recursos de archivos a descargar al inicio. Formato: id_archivo:ruta_relativa (ej., --file file_abc:doc.txt)").action(async(t,r)=>{let n=Array.isArray(t)?t.join(" "):t;i("action_handler_start"),r.bare&&(process.env.CLAUDE_CODE_SIMPLE="1"),"code"===n&&(Re("tengu_code_prompt_ignored",{}),console.warn(m.yellow("Tip: You can launch Context Code with just `context`")),n=void 0),n&&"string"==typeof n&&!/\s/.test(n)&&n.length>0&&Re("tengu_single_word_prompt",{length:n.length});let a,c=!1;if(o("KAIROS")&&r.assistant&&Pe&&Pe.markAssistantForced(),o("KAIROS")&&Pe?.isAssistantMode()&&!r.agentId&&Ae)if(oe()){if(c=Pe.isAssistantForced()||await Ae.isKairosEnabled(),c){r.brief=!0,xs(!0),a=await Pe.initializeAssistantTeam()}}else console.warn(m.yellow("Assistant mode disabled: directory is not trusted. Accept the trust dialog and restart."));const{debug:l=!1,debugToStderr:d=!1,dangerouslySkipPermissions:p,allowDangerouslySkipPermissions:S=!1,tools:j=[],allowedTools:O=[],disallowedTools:D=[],mcpConfig:R=[],permissionMode:L,addDir:Y=[],fallbackModel:Q,betas:Z=[],ide:ae=!1,sessionId:we,includeHookEvents:_e,includePartialMessages:Se}=r;let Ee;r.prefill&&ne(r.prefill);const je=r.agents,Ie=r.agent;o("BG_SESSIONS")&&Ie&&(process.env.CONTEXT_CODE_AGENT=Ie,process.env.CLAUDE_CODE_AGENT=Ie);let Me=r.outputFormat,Je=r.inputFormat,ao=r.verbose??te().verbose,co=r.print;const _o=r.init??!1,Eo=r.initOnly??!1,Ao=r.maintenance??!1,Fo=r.disableSlashCommands||!1,qo=!1,Xo=qo?"string"==typeof qo?qo:Ct:void 0;const et=Oe()?r.worktree:void 0;let tt="string"==typeof et?et:void 0;const st=void 0!==et;let ct;if(tt){const e=Di(tt);null!==e&&(ct=e,tt=void 0)}const ut=Oe()&&!0===r.tmux;let wt;if(ut&&(st||(process.stderr.write(m.red("Error: --tmux requires --worktree\n")),process.exit(1)),"windows"===ve()&&(process.stderr.write(m.red("Error: --tmux is not supported on Windows\n")),process.exit(1)),await ki()||(process.stderr.write(m.red(`Error: tmux is not installed.\n${Ii()}\n`)),process.exit(1))),W()){const e=function(e){if("object"!=typeof e||null===e)return{};const o=e,t=o.teammateMode;return{agentId:"string"==typeof o.agentId?o.agentId:void 0,agentName:"string"==typeof o.agentName?o.agentName:void 0,teamName:"string"==typeof o.teamName?o.teamName:void 0,agentColor:"string"==typeof o.agentColor?o.agentColor:void 0,planModeRequired:"boolean"==typeof o.planModeRequired?o.planModeRequired:void 0,parentSessionId:"string"==typeof o.parentSessionId?o.parentSessionId:void 0,teammateMode:"auto"===t||"tmux"===t||"in-process"===t?t:void 0,agentType:"string"==typeof o.agentType?o.agentType:void 0}}(r);wt=e;const o=e.agentId||e.agentName||e.teamName,t=e.agentId&&e.agentName&&e.teamName;o&&!t&&(process.stderr.write(m.red("Error: --agent-id, --agent-name, and --team-name must all be provided together\n")),process.exit(1)),e.agentId&&e.agentName&&e.teamName&&getTeammateUtils().setDynamicTeamContext?.({agentId:e.agentId,agentName:e.agentName,teamName:e.teamName,color:e.agentColor,planModeRequired:e.planModeRequired??!1,parentSessionId:e.parentSessionId}),e.teammateMode&&s("./utils/swarm/backends/teammateModeSnapshot.js").setCliTeammateModeOverride?.(e.teammateMode)}const _t=r.sdkUrl??void 0,St=Se||jo(process.env.CONTEXT_CODE_INCLUDE_PARTIAL_MESSAGES)||jo(process.env.CLAUDE_CODE_INCLUDE_PARTIAL_MESSAGES);(_e||jo(process.env.CONTEXT_CODE_REMOTE)||jo(process.env.CLAUDE_CODE_REMOTE))&&ds(!0),_t&&(Je||(Je="stream-json"),Me||(Me="stream-json"),void 0===r.verbose&&(ao=!0),r.print||(co=!0));const yt=r.teleport??null,Et=r.remote,bt=!0===Et?"":Et??null,Ot=r.remoteControl??r.rc;let Tt=!1;const Bt="string"==typeof Ot&&Ot.length>0?Ot:void 0;if(we&&(!r.continue&&!r.resume||r.forkSession||(process.stderr.write(m.red("Error: --session-id can only be used with --continue or --resume if --fork-session is also specified.\n")),process.exit(1)),!_t)){const e=jt(we);e||(process.stderr.write(m.red("Error: Invalid session ID. Must be a valid UUID.\n")),process.exit(1)),mt(e)&&(process.stderr.write(m.red(`Error: Session ID ${e} is already in use.\n`)),process.exit(1))}const Ft=r.file;if(Ft&&Ft.length>0){const e=Ce();e||(process.stderr.write(m.red("Error: Session token required for file downloads. CLAUDE_CODE_SESSION_ACCESS_TOKEN must be set.\n")),process.exit(1));const o=process.env.CONTEXT_CODE_REMOTE_SESSION_ID||process.env.CLAUDE_CODE_REMOTE_SESSION_ID||Ss(),t=I(Ft);if(t.length>0){const s={baseUrl:process.env.ANTHROPIC_BASE_URL||v().BASE_API_URL,oauthToken:e,sessionId:o};Ee=A(t,s)}}const Wt=Cs();Q&&r.model&&Q===r.model&&(process.stderr.write(m.red("Error: Fallback model cannot be the same as the main model. Please specify a different model for --fallback-model.\n")),process.exit(1));let ss=r.systemPrompt;if(r.systemPromptFile){r.systemPrompt&&(process.stderr.write(m.red("Error: Cannot use both --system-prompt and --system-prompt-file. Please use only one.\n")),process.exit(1));try{const e=ke(r.systemPromptFile);ss=u(e,"utf8")}catch(e){"ENOENT"===ts(e)&&(process.stderr.write(m.red(`Error: System prompt file not found: ${ke(r.systemPromptFile)}\n`)),process.exit(1)),process.stderr.write(m.red(`Error reading system prompt file: ${os(e)}\n`)),process.exit(1)}}let ns=r.appendSystemPrompt;if(r.appendSystemPromptFile){r.appendSystemPrompt&&(process.stderr.write(m.red("Error: Cannot use both --append-system-prompt and --append-system-prompt-file. Please use only one.\n")),process.exit(1));try{const e=ke(r.appendSystemPromptFile);ns=u(e,"utf8")}catch(e){"ENOENT"===ts(e)&&(process.stderr.write(m.red(`Error: Append system prompt file not found: ${ke(r.appendSystemPromptFile)}\n`)),process.exit(1)),process.stderr.write(m.red(`Error reading append system prompt file: ${os(e)}\n`)),process.exit(1)}}if(W()&&wt?.agentId&&wt?.agentName&&wt?.teamName){const e=s("./utils/swarm/teammatePromptAddendum.js").TEAMMATE_SYSTEM_PROMPT_ADDENDUM;ns=ns?`${ns}\n\n${e}`:e}const{mode:as,notification:ps}=zo({permissionModeCli:L,dangerouslySkipPermissions:p});Ls("bypassPermissions"===as),o("TRANSCRIPT_CLASSIFIER")&&(r.enableAutoMode||"auto"===L||"auto"===as||!L&&Wo())&&Fs?.setAutoModeFlagCli(!0);let hs={};if(R&&R.length>0){const e=R.map(e=>e.trim()).filter(e=>e.length>0);let t={};const s=[];for(const o of e){let e=null,i=[];const r=Ro(o);if(r){const o=Lt({configObject:r,filePath:"command line",expandVars:!0,scope:"dynamic"});o.config?e=o.config.mcpServers:i=o.errors}else{const t=ke(o),s=Ut({filePath:t,expandVars:!0,scope:"dynamic"});s.config?e=s.config.mcpServers:i=s.errors}i.length>0?s.push(...i):e&&(t={...t,...e})}if(s.length>0){const e=s.map(e=>`${e.path?e.path+": ":""}${e.message}`).join("\n");Zt(`--mcp-config validation failed (${s.length} errors): ${e}`,{level:"error"}),process.stderr.write(`Error: Invalid MCP configuration:\n${e}\n`),process.exit(1)}if(Object.keys(t).length>0){const e=Object.entries(t).filter(([,e])=>"sdk"!==e.type).map(([e])=>e);let s=null;if(e.some(Vt))s=`Invalid MCP configuration: "${qt}" is a reserved MCP name.`;else if(o("CHICAGO_MCP")){const{isComputerUseMCPServer:o,COMPUTER_USE_MCP_SERVER_NAME:t}=await import("./utils/computerUse/common.js");e.some(o)&&(s=`Invalid MCP configuration: "${t}" is a reserved MCP name.`)}if(!s){const{isComputerControlMCPServer:o,COMPUTER_CONTROL_MCP_SERVER_NAME:t}=await import("./utils/computerControlMcp/common.js");e.some(o)&&(s=`Invalid MCP configuration: "${t}" is a reserved MCP name.`)}s&&(process.stderr.write(`Error: ${s}\n`),process.exit(1));const i=g(t,e=>({...e,scope:"dynamic"})),{allowed:r,blocked:n}=Rt(i);n.length>0&&process.stderr.write(`Warning: MCP ${vs(n.length,"server")} blocked by enterprise policy: ${n.join(", ")}\n`),hs={...hs,...r}}}const _s=r;_s.chromeAnty&&(_s.chrome=!0),js(_s.chrome);const bs=Co(_s.chrome),Os=void 0===_s.chrome&&!bs&&wo();if(bs){const e=ve();try{Re("tengu_claude_in_chrome_setup",{platform:e});const{mcpConfig:o,allowedTools:t,systemPrompt:s}=vo();hs={...hs,...o},O.push(...t),s&&(ns=ns?`${s}\n\n${ns}`:s)}catch(o){Re("tengu_claude_in_chrome_setup_failed",{platform:e}),Zt(`[Context in Chrome] Error: ${o}`),Mo(o),console.error("Error: Failed to run with Context in Chrome."),process.exit(1)}}else if(Os)try{const{mcpConfig:e,allowedTools:o,systemPrompt:t}=vo();hs={...hs,...e},O.push(...o),t&&(ns=ns?`${t}\n\n${ns}`:t)}catch(e){Zt(`[Context in Chrome] Error (auto-enable): ${e}`)}const As=r.strictMcpConfig||!1;if(xt()&&(As&&(process.stderr.write(m.red("You cannot use --strict-mcp-config when an enterprise MCP config is present")),process.exit(1)),hs&&!kt(hs)&&(process.stderr.write(m.red("You cannot dynamically configure MCP servers when an enterprise MCP config is present")),process.exit(1))),o("CHICAGO_MCP")&&"macos"===ve()&&!Cs())try{const{getChicagoEnabled:e}=await import("./utils/computerUse/gates.js");if(e()){const{setupComputerUseMCP:e}=await import("./utils/computerUse/setup.js"),{mcpConfig:o,allowedTools:t}=e();hs={...hs,...o},O.push(...t)}}catch(e){Zt(`[Computer Use MCP] Setup failed: ${os(e)}`)}if("darwin"!==process.platform)try{const{setupComputerControlMCP:e}=await import("./utils/computerControlMcp/setup.js"),{mcpConfig:o,allowedTools:t}=e();hs={...hs,...o},O.push(...t)}catch(e){Zt(`[Computer Control MCP] Setup failed: ${os(e)}`)}try{const{setupDatabaseMCP:e}=await import("./utils/databaseMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[Database MCP] Setup failed: ${os(e)}`)}try{const{setupMetaMCP:e}=await import("./utils/metaMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[Meta MCP] Setup failed: ${os(e)}`)}try{const{setupSshMCP:e}=await import("./utils/sshMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[SSH MCP] Setup failed: ${os(e)}`)}try{const{setupSembleMCP:e}=await import("./utils/sembleMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[Semble MCP] Setup failed: ${os(e)}`)}try{const{setupRemotionMcp:e}=await import("./utils/remotionMcp/setup.js"),{mcpConfig:o}=e();hs={...hs,...o}}catch(e){Zt(`[Remotion MCP] Setup failed: ${os(e)}`)}try{const{setupPlaywrightMCP:e,isPlaywrightMcpDisabled:o}=await import("./utils/playwrightMcp/setup.js");if(!o()){const{mcpConfig:o}=e();hs={...hs,...o}}}catch(e){Zt(`[Playwright MCP] Setup failed: ${os(e)}`)}let ks;if(Le(Y),o("KAIROS")||o("KAIROS_CHANNELS")){const parseChannelEntries=(e,o)=>{const t=[],s=[];for(const o of e)if(o.startsWith("plugin:")){const e=o.slice(7),i=e.indexOf("@");i<=0||i===e.length-1?s.push(o):t.push({kind:"plugin",name:e.slice(0,i),marketplace:e.slice(i+1)})}else o.startsWith("server:")&&o.length>7?t.push({kind:"server",name:o.slice(7)}):s.push(o);return s.length>0&&(process.stderr.write(m.red(`${o} entries must be tagged: ${s.join(", ")}\n plugin:<name>@<marketplace> — plugin-provided channel (allowlist enforced)\n server:<name> — manually configured MCP server\n`)),process.exit(1)),t},e=r,o=e.channels,t=e.dangerouslyLoadDevelopmentChannels;let s=[];if(o&&o.length>0&&(s=parseChannelEntries(o,"--channels"),Es(s)),Wt||t&&t.length>0&&(ks=parseChannelEntries(t,"--dangerously-load-development-channels")),s.length>0||(ks?.length??0)>0){const joinPluginIds=e=>{const o=e.flatMap(e=>"plugin"===e.kind?[`${e.name}@${e.marketplace}`]:[]);return o.length>0?o.sort().join(","):void 0};Re("tengu_mcp_channel_flags",{channels_count:s.length,dev_count:ks?.length??0,plugins:joinPluginIds(s),dev_plugins:joinPluginIds(ks??[])})}}if((o("KAIROS")||o("KAIROS_BRIEF"))&&j.length>0){const{BRIEF_TOOL_NAME:e,LEGACY_BRIEF_TOOL_NAME:o}=s("./tools/BriefTool/prompt.js"),{isBriefEntitled:t}=s("./tools/BriefTool/BriefTool.js"),i=Go(j);(i.includes(e)||i.includes(o))&&t()&&$s(!0)}const Ds=await Vo({allowedToolsCli:O,disallowedToolsCli:D,baseToolsCli:j,permissionMode:as,allowDangerouslySkipPermissions:S,addDirs:Y});let Ms=Ds.toolPermissionContext;const{warnings:Hs,dangerousPermissions:Ks,overlyBroadBashPermissions:qs}=Ds;o("TRANSCRIPT_CLASSIFIER")&&Ks.length>0&&(Ms=Yo(Ms)),Hs.forEach(e=>{console.error(e)}),ho();const Vs=!Wt||As||xt()||bo()?Promise.resolve({}):At().then(e=>{const{allowed:o,blocked:t}=Rt(e);return t.length>0&&process.stderr.write(`Warning: claude.ai MCP ${vs(t.length,"server")} blocked by enterprise policy: ${t.join(", ")}\n`),o});Zt("[STARTUP] Loading MCP configs...");const zs=Date.now();let Ws;const Gs=(As||bo()?Promise.resolve({servers:{}}):Mt(hs)).then(e=>(Ws=Date.now()-zs,e));Je&&"text"!==Je&&"stream-json"!==Je&&(console.error(`Error: Invalid input format "${Je}".`),process.exit(1)),"stream-json"===Je&&"stream-json"!==Me&&(console.error("Error: --input-format=stream-json requires output-format=stream-json."),process.exit(1)),_t&&("stream-json"===Je&&"stream-json"===Me||(console.error("Error: --sdk-url requires both --input-format=stream-json and --output-format=stream-json."),process.exit(1))),r.replayUserMessages&&("stream-json"===Je&&"stream-json"===Me||(console.error("Error: --replay-user-messages requires both --input-format=stream-json and --output-format=stream-json."),process.exit(1))),St&&(Wt&&"stream-json"===Me||(us("Error: --include-partial-messages requires --print and --output-format=stream-json."),process.exit(1))),!1!==r.sessionPersistence||Wt||(us("Error: --no-session-persistence can only be used with --print mode."),process.exit(1));const Xs=n||"";let Ys=await async function(e,o){if(!process.stdin.isTTY&&!process.argv.includes("mcp")){if("stream-json"===o)return process.stdin;process.stdin.setEncoding("utf8");let t="";const onData=e=>{t+=e};process.stdin.on("data",onData);const s=await ms(process.stdin,3e3);return process.stdin.off("data",onData),s&&process.stderr.write("Warning: no stdin data received in 3s, proceeding without it. If piping from a slow command, redirect stdin explicitly: < /dev/null to skip, or wait longer.\n"),[e,t].filter(Boolean).join("\n")}return e}(Xs,Je??"text");i("action_after_input_prompt"),maybeActivateProactive(r);let Js,Qs=B(Ms);if(o("COORDINATOR_MODE")&&(jo(process.env.CONTEXT_CODE_COORDINATOR_MODE)||jo(process.env.CLAUDE_CODE_COORDINATOR_MODE))){const{applyCoordinatorToolFilter:e}=await import("./utils/toolPool.js");Qs=e(Qs)}if(i("action_tools_loaded"),$({isNonInteractiveSession:Wt})&&r.jsonSchema&&(Js=ye(r.jsonSchema)),Js){const e=H(Js);"tool"in e?(Qs=[...Qs,e.tool],Re("tengu_structured_output_enabled",{schema_property_count:Object.keys(Js.properties||{}).length,has_required_fields:Boolean(Js.required)})):Re("tengu_structured_output_failure",{error:"Invalid JSON schema"})}i("action_before_setup"),Zt("[STARTUP] Running setup()...");const Zs=Date.now(),{setup:mi}=await import("./setup.js"),hi=o("UDS_INBOX")?r.messagingSocketPath:void 0,vi=Qt();"local-agent"!==process.env.CLAUDE_CODE_ENTRYPOINT&&(so(),lo());const wi=mi(vi,as,S,st,tt,ut,we?jt(we):void 0,ct,hi),Pi=st?null:Ke(vi),Ni=st?null:mo(vi);Pi?.catch(()=>{}),Ni?.catch(()=>{}),await wi,Zt(`[STARTUP] setup() completed in ${Date.now()-Zs}ms`),i("action_after_setup");let Li=!!r.replayUserMessages;o("UDS_INBOX")&&(Li||"stream-json"!==Me||(Li=!!r.messagingSocketPath)),Cs()&&(ge(),C(),_(),Bo());const Ui=r.name?.trim();Ui&&nt(Ui);r.model||process.env.ANTHROPIC_MODEL;const Hi="default"===r.model?Lo():r.model,$i="default"===Q?Lo():Q,Bi=st?Qt():vi;Zt("[STARTUP] Loading commands and agents...");const Fi=Date.now(),withStartupTimeout=async(e,o,t,s)=>{let i,r=!1;try{return await Promise.race([o(),new Promise(e=>{i=setTimeout(()=>{r=!0,e(s)},t)})])}catch(o){return Zt(`[STARTUP] ${e} failed: ${o instanceof Error?o.message:String(o)}. Using fallback.`),s}finally{i&&clearTimeout(i),r&&Zt(`[STARTUP] ${e} timed out after ${t}ms. Using fallback.`)}},Ki={activeAgents:[],allAgents:[]},[qi,Vi]=await Promise.all([Pi??Ke(Bi),withStartupTimeout("agent definitions loading",()=>Ni??mo(Bi),1e4,Ki)]);Zt(`[STARTUP] Commands and agents loaded in ${Date.now()-Fi}ms`),i("action_commands_loaded");let zi=[];if(je)try{const e=Ro(je);e&&(zi=fo(e,"flagSettings"))}catch(e){Mo(e)}const Wi=[...Vi.allAgents,...zi],Gi={...Vi,allAgents:Wi,activeAgents:po(Wi)},Xi=Ie??gt().agent;let Yi;if(Xi&&(Yi=Gi.activeAgents.find(e=>e.agentType===Xi),Yi||Zt(`Warning: agent "${Xi}" not found. Available agents: ${Gi.activeAgents.map(e=>e.agentType).join(", ")}. Using default behavior.`)),$e(Yi?.agentType),Yi&&Re("tengu_agent_flag",{agentType:uo(Yi)?Yi.agentType:"custom",...Ie&&{source:"cli"}}),Yi?.agentType&<(Yi.agentType),Wt&&Yi&&!ss&&!uo(Yi)){const e=Yi.getSystemPrompt();e&&(ss=e)}Yi?.initialPrompt&&("string"==typeof Ys?Ys=Ys?`${Yi.initialPrompt}\n\n${Ys}`:Yi.initialPrompt:Ys||(Ys=Yi.initialPrompt));let Ji=Hi;!Ji&&Yi?.model&&"inherit"!==Yi.model&&(Ji=$o(Yi.model)),He(Ji),Is(Uo()||null);const Qi=ws(),Zi=$o(Qi??Lo());let er,or,tr,sr;if(q()){const e=F()?r.advisor:void 0;if(e){Zt(`[AdvisorTool] --advisor ${e}`),z(Zi)||(process.stderr.write(m.red(`Error: The model "${Zi}" does not support the advisor tool.\n`)),process.exit(1));const o=Ho($o(e));V(o)||(process.stderr.write(m.red(`Error: The model "${e}" cannot be used as an advisor.\n`)),process.exit(1))}er=F()?e??K():e,er&&Zt(`[AdvisorTool] Advisor model: ${er}`)}if(W()&&wt?.agentId&&wt?.agentName&&wt?.teamName&&wt?.agentType){const e=Gi.activeAgents.find(e=>e.agentType===wt.agentType);if(e){let o;if("built-in"===e.source?Zt(`[teammate] Built-in agent ${wt.agentType} - skipping custom prompt (not supported)`):o=e.getSystemPrompt(),e.memory&&Re("tengu_agent_memory_loaded",{scope:e.memory,source:"teammate"}),o){const e=`\n# Custom Agent Instructions\n${o}`;ns=ns?`${ns}\n\n${e}`:e}}else Zt(`[teammate] Custom agent ${wt.agentType} not found in available agents`)}if(maybeActivateBrief(r),(o("KAIROS")||o("KAIROS_BRIEF"))&&!Cs()&&!ys()&&"chat"===gt().defaultView){const{isBriefEntitled:e}=s("./tools/BriefTool/BriefTool.js");e()&&$s(!0)}if((o("PROACTIVE")||o("KAIROS"))&&(r.proactive||jo(process.env.CONTEXT_CODE_PROACTIVE)||jo(process.env.CLAUDE_CODE_PROACTIVE))&&!Te?.isCoordinatorMode()){const e=`\n# Proactive Mode\n\nYou are in proactive mode. Take initiative — explore, act, and make progress without waiting for instructions.\n\nStart by briefly greeting the user.\n\nYou will receive periodic <tick> prompts. These are check-ins. Do whatever seems most useful, or call Sleep if there's nothing to do. ${(o("KAIROS")||o("KAIROS_BRIEF"))&&s("./tools/BriefTool/BriefTool.js").isBriefEnabled()?"Call SendUserMessage at checkpoints to mark where things stand.":"The user will see any text you output."}`;ns=ns?`${ns}\n\n${e}`:e}if(o("KAIROS")&&c&&Pe){const e=Pe.getAssistantSystemPromptAddendum();ns=ns?`${ns}\n\n${e}`:e}if(!Wt){const e=eo(!1);tr=e.getFpsMetrics,sr=e.stats;const{createRoot:t}=await import("./ink.js");or=await t(e.renderOptions),Re("tengu_timer",{event:"startup",durationMs:Math.round(1e3*process.uptime())}),Zt("[STARTUP] Running showSetupScreens()...");const s=Date.now(),i=await to(or,as,S,qi,bs,ks);if(Zt(`[STARTUP] showSetupScreens() completed in ${Date.now()-s}ms`),o("BRIDGE_MODE")&&void 0!==Ot){const{getBridgeDisabledReason:e}=await import("./bridge/bridgeEnabled.js"),o=await e();Tt=null===o,o&&process.stderr.write(m.yellow(`${o}\n--rc flag ignored.\n`))}if(o("AGENT_MEMORY_SNAPSHOT")&&Yi&&go(Yi)&&Yi.memory&&Yi.pendingSnapshotUpdate){const e=Yi;if("merge"===await Ge(or,{agentType:e.agentType,scope:e.memory,snapshotTimestamp:e.pendingSnapshotUpdate.snapshotTimestamp})){const{buildMergePrompt:o}=await import("./components/agents/SnapshotUpdateDialog.js"),t=o(e.agentType,e.memory);Ys=Ys?`${t}\n\n${Ys}`:t}e.pendingSnapshotUpdate=void 0}i&&"/login"===n?.trim().toLowerCase()&&(n=""),i&&(U(),M(),Ai(),T(),import("./bridge/trustedDevice.js").then(e=>(e.clearTrustedDeviceToken(),e.enrollTrustedDevice())));const r=await ee();r.valid||await Qe(or,r.message)}if(void 0!==process.exitCode)return void Zt("Graceful shutdown initiated, skipping further initialization");if(si(),!Wt){const{errors:e}=vt(),o=e.filter(e=>!e.mcpErrorMetadata);o.length>0&&await ze(or,{settingsErrors:o,onExit:()=>ls(1)})}const ir=xe("tengu_cicada_nap_ms",0),rr=te().startupPrefetchedAt??0;if(bo()||ir>0&&Date.now()-rr<ir)Zt(`Skipping startup prefetches, last ran ${Math.round((Date.now()-rr)/1e3)}s ago`),ue();else{const e=rr>0?` last ran ${Math.round((Date.now()-rr)/1e3)}s ago`:"";Zt(`Starting background startup prefetches${e}`),io().catch(e=>Mo(e)),P(),k(),xe("tengu_miraculo_the_bard",!1)?ue():me(),ir>0&&re(e=>({...e,startupPrefetchedAt:Date.now()}))}Wt||To();const{servers:nr}=await Gs;Zt(`[STARTUP] MCP configs resolved in ${Ws}ms (awaited at +${Date.now()-zs}ms)`);const ar={...nr,...hs},cr={},lr={};for(const[e,o]of Object.entries(ar)){const t=o;"sdk"===t.type?cr[e]=t:lr[e]=t}i("action_mcp_configs_loaded");const dr=Wt?Promise.resolve({clients:[],tools:[],commands:[]}):no(lr),pr=Wt?Promise.resolve({clients:[],tools:[],commands:[]}):Vs.then(e=>Object.keys(e).length>0?no(e):{clients:[],tools:[],commands:[]}),mr=Promise.all([dr,pr]).then(([e,o])=>({clients:[...e.clients,...o.clients],tools:h([...e.tools,...o.tools],"name"),commands:h([...e.commands,...o.commands],"name")})),ur=Eo||_o||Ao||Wt||r.continue||r.resume?null:it("startup",{agentType:Yi?.agentType,model:Zi}),gr=[];mr.catch(()=>{});const fr=[],hr=[],vr=[];let wr=Ti(),Cr=!1!==wr?{type:"adaptive"}:{type:"disabled"};if("adaptive"===r.thinking||"enabled"===r.thinking)wr=!0,Cr={type:"adaptive"};else if("disabled"===r.thinking)wr=!1,Cr={type:"disabled"};else{const e=process.env.MAX_THINKING_TOKENS?parseInt(process.env.MAX_THINKING_TOKENS,10):r.maxThinkingTokens;void 0!==e&&(e>0?(wr=!0,Cr={type:"enabled",budgetTokens:e}):0===e&&(wr=!1,Cr={type:"disabled"}))}ui("info","started",{version:e.VERSION,is_native_binary:pi()}),zt(async()=>{ui("info","exited")}),async function({hasInitialPrompt:e,hasStdin:t,verbose:s,debug:i,debugToStderr:r,print:n,outputFormat:a,inputFormat:c,numAllowedTools:l,numDisallowedTools:d,mcpClientCount:p,worktreeEnabled:m,skipWebFetchPreflight:u,githubActionInputs:g,dangerouslySkipPermissionsPassed:f,permissionMode:h,modeIsBypass:v,allowDangerouslySkipPermissionsPassed:w,systemPromptFlag:C,appendSystemPromptFlag:_,thinkingConfig:S,assistantActivationPath:y}){try{Re("tengu_init",{entrypoint:"claude",hasInitialPrompt:e,hasStdin:t,verbose:s,debug:i,debugToStderr:r,print:n,outputFormat:a,inputFormat:c,numAllowedTools:l,numDisallowedTools:d,mcpClientCount:p,worktree:m,skipWebFetchPreflight:u,...g&&{githubActionInputs:g},dangerouslySkipPermissionsPassed:f,permissionMode:h,modeIsBypass:v,inProtectedNamespace:Oo(),allowDangerouslySkipPermissionsPassed:w,thinkingType:S.type,...C&&{systemPromptFlag:C},..._&&{appendSystemPromptFlag:_},is_simple:bo()||void 0,is_coordinator:!(!o("COORDINATOR_MODE")||!Te?.isCoordinatorMode())||void 0,...y&&{assistantActivationPath:y},autoUpdatesChannel:gt().autoUpdatesChannel??"latest"})}catch(e){Mo(e)}}({hasInitialPrompt:Boolean(n),hasStdin:Boolean(Ys),verbose:ao,debug:l,debugToStderr:d,print:co??!1,outputFormat:Me??"text",inputFormat:Je??"text",numAllowedTools:O.length,numDisallowedTools:D.length,mcpClientCount:Object.keys(ar).length,worktreeEnabled:st,skipWebFetchPreflight:gt().skipWebFetchPreflight,githubActionInputs:process.env.GITHUB_ACTION_INPUTS,dangerouslySkipPermissionsPassed:p??!1,permissionMode:as,modeIsBypass:"bypassPermissions"===as,allowDangerouslySkipPermissionsPassed:S,systemPromptFlag:ss?r.systemPromptFile?"file":"flag":void 0,appendSystemPromptFlag:ns?r.appendSystemPromptFile?"file":"flag":void 0,thinkingConfig:Cr,assistantActivationPath:o("KAIROS")&&c?Pe?.getAssistantActivationPath():void 0}),Kt(lr,Ms),Pt(null,"initialization"),function(){try{const e=ht("policySettings");if(e){const o=ft(e);Re("tengu_managed_settings_loaded",{keyCount:o.length,keys:o.join(",")})}}catch{}}(),Yt().then(e=>{e&&(Ui&&Jt(Ui),Xt().then(e=>{e>=2&&Re("tengu_concurrent_sessions",{num_sessions:e})}))}),bo()||(Wt?(await Zo(),i("action_after_plugins_init"),Qo().then(()=>ot())):Zo().then(async()=>{i("action_after_plugins_init"),await Qo(),ot()}));const _r=Eo||_o?"init":Ao?"maintenance":null;if(Eo)return ge(),await rt("init",{forceSyncExecution:!0}),await it("startup",{forceSyncExecution:!0}),void ls(0);if(Wt){"stream-json"!==Me&&"json"!==Me||es(!0),ge(),y();const e=r.continue||r.resume||yt||_r?void 0:it("startup");e?.catch(()=>{}),i("before_validateForceLoginOrg");const t=await ee();t.valid||(process.stderr.write(t.message+"\n"),process.exit(1));const s=Fo?[]:qi.filter(e=>"prompt"===e.type&&!e.disableNonInteractive||"local"===e.type&&e.supportsNonInteractive),n=ri(),a={...n,mcp:{...n.mcp,clients:fr,commands:vr,tools:hr},toolPermissionContext:Ms,effortValue:le(r.effort)??ce(),...pe()&&{fastMode:de(Ji??null)},...q()&&er&&{advisorModel:er},...o("KAIROS")?{kairosEnabled:c}:{}},l=ci(a,ai);("bypassPermissions"===Ms.mode||S)&&Ko(Ms),o("TRANSCRIPT_CLASSIFIER")&&Jo(Ms,l.getState().fastMode).then(({updateContext:e})=>{l.setState(o=>{const t=e(o.toolPermissionContext);return t===o.toolPermissionContext?o:{...o,toolPermissionContext:t}})}),!1===r.sessionPersistence&&Us(!0),Ns(di(Z));const connectMcpBatch=(e,o)=>0===Object.keys(e).length?Promise.resolve():(l.setState(o=>({...o,mcp:{...o.mcp,clients:[...o.mcp.clients,...Object.entries(e).map(([e,o])=>({name:e,type:"pending",config:o}))]}})),ro(({client:e,tools:o,commands:t})=>{l.setState(s=>({...s,mcp:{...s.mcp,clients:s.mcp.clients.some(o=>o.name===e.name)?s.mcp.clients.map(o=>o.name===e.name?e:o):[...s.mcp.clients,e],tools:h([...s.mcp.tools,...o],"name"),commands:h([...s.mcp.commands,...t],"name")}}))},e).catch(e=>Zt(`[MCP] ${o} connect error: ${e}`)));i("before_connectMcp"),await connectMcpBatch(lr,"regular"),i("after_connectMcp");const d=5e3,p=Vs.then(e=>{if(Object.keys(e).length>0){const o=new Set;for(const t of Object.values(e)){const e=Nt(t);e&&o.add(e)}const t=new Set;for(const[e,s]of Object.entries(lr)){if(!e.startsWith("plugin:"))continue;const i=Nt(s);i&&o.has(i)&&t.add(e)}if(t.size>0){Zt(`[MCP] Lazy dedup: suppressing ${t.size} plugin server(s) that duplicate claude.ai connectors: ${[...t].join(", ")}`);for(const e of l.getState().mcp.clients)t.has(e.name)&&"connected"===e.type&&(e.client.onclose=void 0,It(e.name,e.config).catch(()=>{}));l.setState(e=>{let{clients:o,tools:s,commands:i,resources:r}=e.mcp;o=o.filter(e=>!t.has(e.name)),s=s.filter(e=>!e.mcpInfo||!t.has(e.mcpInfo.serverName));for(const e of t)i=Ht(i,e),r=$t(r,e);return{...e,mcp:{...e.mcp,clients:o,tools:s,commands:i,resources:r}}})}}const o=f(lr,(e,o)=>!o.startsWith("plugin:")),{servers:t}=Dt(e,o);return connectMcpBatch(t,"claudeai")});let m;const u=await Promise.race([p.then(()=>!1),new Promise(e=>{m=setTimeout(e=>e(!0),d,e)})]);m&&clearTimeout(m),u&&Zt(`[MCP] claude.ai connectors not ready after ${d}ms — proceeding; background connection continues`),i("after_connectMcp_claudeai"),bo()||(startDeferredPrefetches(),import("./utils/backgroundHousekeeping.js").then(e=>e.startBackgroundHousekeeping())),logSessionTelemetry(),i("before_print_import");const{runHeadless:g}=await import("./cli/print.js");return i("after_print_import"),void g(Ys,()=>l.getState(),l.setState,s,Qs,cr,Gi.activeAgents,{continue:r.continue,resume:r.resume,verbose:ao,outputFormat:Me,jsonSchema:Js,permissionPromptToolName:r.permissionPromptTool,allowedTools:O,thinkingConfig:Cr,maxTurns:r.maxTurns,maxBudgetUsd:r.maxBudgetUsd,taskBudget:r.taskBudget?{total:r.taskBudget}:void 0,systemPrompt:ss,appendSystemPrompt:ns,userSpecifiedModel:Ji,fallbackModel:$i,teleport:yt,sdkUrl:_t,replayUserMessages:Li,includePartialMessages:St,forkSession:r.forkSession||!1,resumeSessionAt:r.resumeSessionAt||void 0,rewindFiles:r.rewindFiles,enableAuthStatus:r.enableAuthStatus,agent:Ie,workload:r.workload,setupTrigger:_r??void 0,sessionStartHooksPromise:e})}Re("tengu_startup_manual_model_config",{cli_flag:r.model,env_var:process.env.ANTHROPIC_MODEL,settings_file:(gt()||{}).model,subscriptionType:J(),agent:Xi});const Sr=No(Zi),yr=[];if(ps&&yr.push({key:"permission-mode-notification",text:ps,priority:"high"}),Sr&&yr.push({key:"model-deprecation-warning",text:Sr,color:"warning",priority:"high"}),qs.length>0){const e=X(qs.map(e=>e.ruleDisplay)),o=e.join(", "),t=X(qs.map(e=>e.sourceDisplay)).join(", "),s=e.length;yr.push({key:"overly-broad-bash-notification",text:`${o} allow ${vs(s,"rule")} from ${t} ${vs(s,"was","were")} ignored — not available for Ants, please use auto-mode instead`,color:"warning",priority:"high"})}const Er={...Ms,mode:W()&&getTeammateUtils().isPlanModeRequired()?"plan":Ms.mode},br=!(!o("KAIROS")&&!o("KAIROS_BRIEF"))&&ys(),jr=Tt||se()||c;let Or=!1;if(o("CCR_MIRROR")&&!jr){const{isCcrMirrorEnabled:e}=s("./bridge/bridgeEnabled.js");Or=e()}const Tr={settings:gt(),tasks:{},agentNameRegistry:new Map,verbose:ao??te().verbose??!1,mainLoopModel:Qi,mainLoopModelForSession:null,isBriefOnly:br,expandedView:te().showSpinnerTree?"teammates":te().showExpandedTodos?"tasks":"none",showTeammateMessagePreview:!W()&&void 0,selectedIPAgentIndex:-1,coordinatorTaskIndex:-1,viewSelectionMode:"none",footerSelection:null,toolPermissionContext:Er,agent:Yi?.agentType,agentDefinitions:Gi,mcp:{clients:[],tools:[],commands:[],resources:{},pluginReconnectKey:0},plugins:{enabled:[],disabled:[],commands:[],errors:[],installationStatus:{marketplaces:[],plugins:[]},needsRefresh:!1},statusLineText:void 0,kairosEnabled:c,remoteSessionUrl:void 0,remoteConnectionStatus:"connecting",remoteBackgroundTaskCount:0,replBridgeEnabled:jr||Or,replBridgeExplicit:Tt,replBridgeOutboundOnly:Or,replBridgeConnected:!1,replBridgeSessionActive:!1,replBridgeReconnecting:!1,replBridgeConnectUrl:void 0,replBridgeSessionUrl:void 0,replBridgeEnvironmentId:void 0,replBridgeSessionId:void 0,replBridgeError:void 0,replBridgeInitialName:Bt,showRemoteCallout:!1,notifications:{current:null,queue:yr},elicitation:{queue:[]},todos:{},remoteAgentTaskSuggestions:[],fileHistory:{snapshots:[],trackedFiles:new Set,snapshotSequence:0},attribution:Gt(),thinkingEnabled:wr,promptSuggestionEnabled:ii(),sessionHooks:new Map,inbox:{messages:[]},promptSuggestion:{text:null,promptId:null,shownAt:0,acceptedAt:0,generationRequestId:null},speculation:ni,speculationSessionTimeSavedMs:0,skillImprovement:{suggestion:null},workerSandboxPermissions:{queue:[],selectedIndex:0},pendingWorkerRequest:null,pendingSandboxRequest:null,authVersion:0,initialMessage:Ys?{message:he({content:String(Ys)})}:null,effortValue:le(r.effort)??ce(),activeOverlays:new Set,fastMode:de(Zi),...q()&&er&&{advisorModel:er},teamContext:o("KAIROS")?a??be?.():be?.()};Ys&&E(String(Ys));const Pr=hr;re(e=>({...e,numStartups:(e.numStartups??0)+1})),setImmediate(()=>{!async function(){if(De())return;const[e,o,t]=await Promise.all([ko(),Do(),xo()]);Re("tengu_startup_telemetry",{is_git:e,worktree_count:o,gh_auth_status:t,sandbox_enabled:Ci.isSandboxingEnabled(),are_unsandboxed_commands_allowed:Ci.areUnsandboxedCommandsAllowed(),is_auto_bash_allowed_if_sandbox_enabled:Ci.isAutoAllowBashIfSandboxedEnabled(),auto_updater_disabled:ie(),prefers_reduced_motion:gt().prefersReducedMotion??!1,...getCertEnvVarTelemetry()})}(),logSessionTelemetry()});const Ar=null,Ir=Ar?Ar.then(e=>e.createSessionTurnUploader()).catch(()=>null):null,kr={debug:l||d,commands:[...qi,...vr],initialTools:Pr,mcpClients:fr,autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,dynamicMcpConfig:hs,strictMcpConfig:As,systemPrompt:ss,appendSystemPrompt:ns,taskListId:Xo,thinkingConfig:Cr,...Ir&&{onTurnComplete:e=>{Ir.then(o=>o?.(e))}}},Dr={modeApi:Te,mainThreadAgentDefinition:Yi,agentDefinitions:Gi,currentCwd:Bi,cliAgents:zi,initialState:Tr};if(r.continue){let e=!1;try{const o=performance.now(),{clearSessionCaches:t}=await import("./commands/clear/caches.js");t();const s=await So(void 0,void 0);if(!s)return Re("tengu_continue",{success:!1}),await Qe(or,"No conversation found to continue");const i=await fs(s,{forkSession:!!r.forkSession,includeAttribution:!0,transcriptPath:s.fullPath},Dr);i.restoredAgentDef&&(Yi=i.restoredAgentDef),maybeActivateProactive(r),maybeActivateBrief(r),Re("tengu_continue",{success:!0,resume_duration_ms:Math.round(performance.now()-o)}),e=!0,await b(or,{getFpsMetrics:tr,stats:sr,initialState:i.initialState},{...kr,mainThreadAgentDefinition:i.restoredAgentDef??Yi,initialMessages:i.messages,initialFileHistorySnapshots:i.fileHistorySnapshots,initialContentReplacements:i.contentReplacements,initialAgentName:i.agentName,initialAgentColor:i.agentColor},oo)}catch(o){e||Re("tengu_continue",{success:!1}),Mo(o),process.exit(1)}}else{if(o("DIRECT_CONNECT")&&xi?.url){let e;try{const o=await oi({serverUrl:xi.url,authToken:xi.authToken,cwd:Ne(),dangerouslySkipPermissions:xi.dangerouslySkipPermissions});o.workDir&&(Rs(o.workDir),Ts(o.workDir)),Ps(xi.url),e=o.config}catch(e){return await Qe(or,e instanceof ti?e.message:String(e),()=>cs(1))}const o=fe(`Connected to server at ${xi.url}\nSession: ${e.sessionId}`,"info");return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},{debug:l||d,commands:qi,initialTools:[],initialMessages:[o],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,directConnectConfig:e,thinkingConfig:Cr},oo)}if(o("SSH_REMOTE")&&Mi?.host){const{createSSHSession:o,createLocalSSHSession:t,SSHSessionError:s}=await import("./ssh/createSSHSession.js");let i;try{if(Mi.local)process.stderr.write("Starting local ssh-proxy test session...\n"),i=t({cwd:Mi.cwd,permissionMode:Mi.permissionMode,dangerouslySkipPermissions:Mi.dangerouslySkipPermissions});else{process.stderr.write(`Connecting to ${Mi.host}…\n`);const t=process.stderr.isTTY;let s=!1;i=await o({host:Mi.host,cwd:Mi.cwd,localVersion:e.VERSION,permissionMode:Mi.permissionMode,dangerouslySkipPermissions:Mi.dangerouslySkipPermissions,extraCliArgs:Mi.extraCliArgs},t?{onProgress:e=>{s=!0,process.stderr.write(`\r ${e}[K`)}}:{}),s&&process.stderr.write("\n")}Rs(i.remoteCwd),Ts(i.remoteCwd),Ps(Mi.local?"local":Mi.host)}catch(e){return await Qe(or,e instanceof s?e.message:String(e),()=>cs(1))}const r=fe(Mi.local?`Local ssh-proxy test session\ncwd: ${i.remoteCwd}\nAuth: unix socket → local proxy`:`SSH session to ${Mi.host}\nRemote cwd: ${i.remoteCwd}\nAuth: unix socket -R → local proxy`,"info");return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},{debug:l||d,commands:qi,initialTools:[],initialMessages:[r],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,sshSession:i,thinkingConfig:Cr},oo)}if(o("KAIROS")&&Ri&&(Ri.sessionId||Ri.discover)){const{discoverAssistantSessions:e}=await import("./assistant/sessionDiscovery.js");let o=Ri.sessionId;if(!o){let t;try{t=await e()}catch(e){return await Qe(or,`Failed to discover sessions: ${e instanceof Error?e.message:e}`,()=>cs(1))}if(0===t.length){let e;try{e=await qe(or)}catch(e){return await Qe(or,`Assistant installation failed: ${e instanceof Error?e.message:e}`,()=>cs(1))}return null===e&&(await cs(0),process.exit(0)),await Ze(or,`Assistant installed in ${e}. The daemon is starting up — run \`claude assistant\` again in a few seconds to connect.`,{exitCode:0,beforeExit:()=>cs(0)})}if(1===t.length)o=t[0].id;else{const e=await Ve(or,{sessions:t});e||(await cs(0),process.exit(0)),o=e}}const{checkAndRefreshOAuthTokenIfNeeded:t,getClaudeAIOAuthTokens:s}=await import("./utils/auth.js");let i;await t();try{i=await Si()}catch(e){return await Qe(or,`Error: ${e instanceof Error?e.message:"Failed to authenticate"}`,()=>cs(1))}const getAccessToken=()=>s()?.accessToken??i.accessToken;xs(!0),$s(!0),Ue(!0);const r=ei(o,getAccessToken,i.orgUUID,!1,!0),n=fe(`Attached to assistant session ${o.slice(0,8)}…`,"info"),a={...Tr,isBriefOnly:!0,kairosEnabled:!1,replBridgeEnabled:!1},c=Fe(qi);return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:a},{debug:l||d,commands:c,initialTools:[],initialMessages:[n],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,remoteSessionConfig:r,thinkingConfig:Cr},oo)}if(r.resume||r.fromPr||yt||null!==bt){const{clearSessionCaches:e}=await import("./commands/clear/caches.js");e();let o,t,s,i=null,n=jt(r.resume),a=null;if(r.fromPr&&(!0===r.fromPr?s=!0:"string"==typeof r.fromPr&&(s=r.fromPr)),r.resume&&"string"==typeof r.resume&&!n){const e=r.resume.trim();if(e){const o=await pt(e,{exact:!0});1===o.length?(a=o[0],n=at(a)??null):t=e}}if((null!==bt||yt)&&(await N(),!x("allow_remote_sessions")))return await Qe(or,"Error: Remote sessions are disabled by your organization's policy.",()=>cs(1));if(null!==bt){const e=bt.length>0,o=xe("tengu_remote_backend",!1);if(!o&&!e)return await Qe(or,'Error: --remote requires a description.\nUsage: context --remote "your task description"',()=>cs(1));Re("tengu_remote_create_session",{has_initial_prompt:String(e)});const t=await Io(),s=await bi(or,e?bt:null,(new AbortController).signal,t||void 0);if(!s)return Re("tengu_remote_create_session_error",{error:"unable_to_create_session"}),await Qe(or,"Error: Unable to create remote session",()=>cs(1));let i;Re("tengu_remote_create_session_success",{session_id:s.id}),o||(process.stdout.write(`Created remote session: ${s.title}\n`),process.stdout.write(`View: ${w(s.id)}?m=0\n`),process.stdout.write(`Resume with: context --teleport ${s.id}\n`),await cs(0),process.exit(0)),Ue(!0),Bs(li(s.id));try{i=await Si()}catch(e){return Mo(rs(e)),await Qe(or,`Error: ${os(e)||"Failed to authenticate"}`,()=>cs(1))}const{getClaudeAIOAuthTokens:r}=await import("./utils/auth.js"),getAccessTokenForRemote=()=>r()?.accessToken??i.accessToken,n=ei(s.id,getAccessTokenForRemote,i.orgUUID,e),a=`${w(s.id)}?m=0`,c=fe(`/remote-control is active. Code in CLI or at ${a}`,"info"),p=e?he({content:bt}):null,m={...Tr,remoteSessionUrl:a},u=Fe(qi);return void await b(or,{getFpsMetrics:tr,stats:sr,initialState:m},{debug:l||d,commands:u,initialTools:[],initialMessages:p?[c,p]:[c],mcpClients:[],autoConnectIdeFlag:ae,mainThreadAgentDefinition:Yi,disableSlashCommands:Fo,remoteSessionConfig:n,thinkingConfig:Cr},oo)}if(yt)if(!0===yt||""===yt){Re("tengu_teleport_interactive_mode",{}),Zt("selectAndResumeTeleportTask: Starting teleport flow...");const e=await Ye(or);e||(await cs(0),process.exit(0));const{branchError:o}=await yi(e.branch);i=Ei(e.log,o)}else if("string"==typeof yt){Re("tengu_teleport_resume_session",{mode:"direct"});try{const e=await _i(yt),o=await Oi(e);if("mismatch"===o.status||"not_in_repo"===o.status){const e=o.sessionRepo;if(e){const o=fi(e),t=await gi(o);if(!(t.length>0))throw new is(`You must run context --teleport ${yt} from a checkout of ${e}.`,m.red(`You must run context --teleport ${yt} from a checkout of ${m.bold(e)}.\n`));{const o=await Xe(or,{targetRepo:e,initialPaths:t});o?(process.chdir(o),gs(o),Rs(o)):await cs(0)}}}else if("error"===o.status)throw new is(o.errorMessage||"Failed to validate session",m.red(`Error: ${o.errorMessage||"Failed to validate session"}\n`));await ji();const{teleportWithProgress:t}=await import("./components/TeleportProgress.js"),s=await t(or,yt);Be({sessionId:yt}),i=s.messages}catch(e){e instanceof is?process.stderr.write(e.formattedMessage+"\n"):(Mo(e),process.stderr.write(m.red(`Error: ${os(e)}\n`))),await cs(1)}}if(n){const e=n;try{const t=performance.now(),s=await So(a??e,void 0);if(!s)return Re("tengu_session_resumed",{entrypoint:"cli_flag",success:!1}),await Qe(or,`No conversation found with session ID: ${e}`);const i=a?.fullPath??s.fullPath;o=await fs(s,{forkSession:!!r.forkSession,sessionIdOverride:e,transcriptPath:i},Dr),o.restoredAgentDef&&(Yi=o.restoredAgentDef),Re("tengu_session_resumed",{entrypoint:"cli_flag",success:!0,resume_duration_ms:Math.round(performance.now()-t)})}catch(o){Re("tengu_session_resumed",{entrypoint:"cli_flag",success:!1}),Mo(o),await Qe(or,`Failed to resume session ${e}`)}}if(Ee)try{const e=await Ee,o=G(e,e=>!e.success);o>0&&process.stderr.write(m.yellow(`Warning: ${o}/${e.length} file(s) failed to download.\n`))}catch(e){return await Qe(or,`Error downloading files: ${os(e)}`)}const c=o??(Array.isArray(i)?{messages:i,fileHistorySnapshots:void 0,agentName:void 0,agentColor:void 0,restoredAgentDef:Yi,initialState:Tr,contentReplacements:void 0}:void 0);c?(maybeActivateProactive(r),maybeActivateBrief(r),await b(or,{getFpsMetrics:tr,stats:sr,initialState:c.initialState},{...kr,mainThreadAgentDefinition:c.restoredAgentDef??Yi,initialMessages:c.messages,initialFileHistorySnapshots:c.fileHistorySnapshots,initialContentReplacements:c.contentReplacements,initialAgentName:c.agentName,initialAgentColor:c.agentColor},oo)):await We(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},Po(Ne()),{...kr,initialSearchQuery:t,forkSession:r.forkSession,filterByPr:s})}else{const e=ur&&0===gr.length?ur:void 0;i("action_after_hooks"),maybeActivateProactive(r),maybeActivateBrief(r),o("COORDINATOR_MODE")&&dt(Te?.isCoordinatorMode()?"coordinator":"normal");let t=null;o("LODESTONE")&&(r.deepLinkOrigin?(Re("tengu_deep_link_opened",{has_prefill:Boolean(r.prefill),has_repo:Boolean(r.deepLinkRepo)}),t=fe(yo({cwd:Qt(),prefillLength:r.prefill?.length,repo:r.deepLinkRepo,lastFetch:void 0!==r.deepLinkLastFetch?new Date(r.deepLinkLastFetch):void 0}),"warning")):r.prefill&&(t=fe("Launched with a pre-filled prompt — review it before pressing Enter.","warning")));const s=t?[t,...gr]:gr.length>0?gr:void 0;await b(or,{getFpsMetrics:tr,stats:sr,initialState:Tr},{...kr,initialMessages:s,pendingHookMessages:e},oo)}}}).version(`${e.VERSION} (Context Code)`,"-v, --version","Output the version number"),t.option("-w, --worktree [nombre]","Crea un nuevo git worktree para esta sesión (opcionalmente especifica un nombre)"),t.option("--tmux","Crea una sesión de tmux para el worktree (requiere --worktree). Usa paneles nativos de iTerm2 si están disponibles; usa --tmux=classic para tmux tradicional."),F()&&t.addOption(new p("--advisor <modelo>","Habilita la herramienta advisor del lado del servidor con el modelo especificado (alias o ID completo).").hideHelp());0;o("TRANSCRIPT_CLASSIFIER")&&t.addOption(new p("--enable-auto-mode","Activar modo automático").hideHelp());(o("PROACTIVE")||o("KAIROS"))&&t.addOption(new p("--proactive","Iniciar en modo autónomo proactivo"));o("UDS_INBOX")&&t.addOption(new p("--messaging-socket-path <ruta>","Ruta del socket de dominio Unix para el servidor de mensajería UDS (por defecto una ruta temporal)"));(o("KAIROS")||o("KAIROS_BRIEF"))&&t.addOption(new p("--brief","Habilita la herramienta SendUserMessage para la comunicación agente-usuario"));o("KAIROS")&&t.addOption(new p("--assistant","Fuerza el modo asistente (uso del demonio Agent SDK)").hideHelp());(o("KAIROS")||o("KAIROS_CHANNELS"))&&(t.addOption(new p("--channels <servidores...>","Servidores MCP cuyas notificaciones de canal deben registrar esta sesión. Nombres de servidor separados por espacios.").hideHelp()),t.addOption(new p("--dangerously-load-development-channels <servidores...>","Carga servidores de canal que no están en la lista permitida. Solo para desarrollo local.").hideHelp()));t.addOption(new p("--agent-id <id>","Teammate agent ID").hideHelp()),t.addOption(new p("--agent-name <name>","Teammate display name").hideHelp()),t.addOption(new p("--team-name <name>","Team name for swarm coordination").hideHelp()),t.addOption(new p("--agent-color <color>","Teammate UI color").hideHelp()),t.addOption(new p("--plan-mode-required","Require plan mode before implementation").hideHelp()),t.addOption(new p("--parent-session-id <id>","Parent session ID for analytics correlation").hideHelp()),t.addOption(new p("--teammate-mode <mode>",'How to spawn teammates: "tmux", "in-process", or "auto"').choices(["auto","tmux","in-process"]).hideHelp()),t.addOption(new p("--agent-type <type>","Custom agent type for this teammate").hideHelp()),t.addOption(new p("--sdk-url <url>","Use remote WebSocket endpoint for SDK I/O streaming (only with -p and stream-json format)").hideHelp()),t.addOption(new p("--teleport [session]","Resume a teleport session, optionally specify session ID").hideHelp()),t.addOption(new p("--remote [description]","Create a remote session with the given description").hideHelp()),o("BRIDGE_MODE")&&(t.addOption(new p("--remote-control [name]","Start an interactive session with Remote Control enabled (optionally named)").argParser(e=>e||!0).hideHelp()),t.addOption(new p("--rc [name]","Alias for --remote-control").argParser(e=>e||!0).hideHelp()));o("HARD_FAIL")&&t.addOption(new p("--hard-fail","Crash on logError calls instead of silently logging").hideHelp());i("run_main_options_built");const n=process.argv.includes("-p")||process.argv.includes("--print"),c=process.argv.some(e=>e.startsWith("cc://")||e.startsWith("cc+unix://"));if(n&&!c)return i("run_before_parse"),await t.parseAsync(process.argv),i("run_after_parse"),t;const j=t.command("mcp").description("Configurar y gestionar servidores MCP").configureHelp(createSortedHelpConfig()).enablePositionalOptions();j.command("serve").description("Iniciar el servidor MCP de Context Code").option("-d, --debug","Activar modo depuración",()=>!0).option("--verbose","Sobrescribir ajuste de verbosidad de la configuración",()=>!0).action(async({debug:e,verbose:o})=>{const{mcpServeHandler:t}=await import("./cli/handlers/mcp.js");await t({debug:e,verbose:o})}),Ot(j),Bt()&&Tt(j);j.command("remove <nombre>").description("Eliminar un servidor MCP").option("-s, --scope <ámbito>","Ámbito de configuración (local, user o project); si no se especifica, se elimina de donde exista").action(async(e,o)=>{const{mcpRemoveHandler:t}=await import("./cli/handlers/mcp.js");await t(e,o)}),j.command("list").description("Listar servidores MCP configurados. Nota: Se omite el diálogo de confianza y se inician los servidores stdio de .mcp.json para comprobaciones de estado. Úsalo solo en directorios en los que confíes.").action(async()=>{const{mcpListHandler:e}=await import("./cli/handlers/mcp.js");await e()}),j.command("get <nombre>").description("Obtener detalles sobre un servidor MCP. Nota: Se omite el diálogo de confianza y se inician los servidores stdio de .mcp.json para comprobaciones de estado. Úsalo solo en directorios en los que confíes.").action(async e=>{const{mcpGetHandler:o}=await import("./cli/handlers/mcp.js");await o(e)}),j.command("add-json <nombre> <json>").description("Añadir un servidor MCP (stdio o SSE) con una cadena JSON").option("-s, --scope <ámbito>","Ámbito de configuración (local, user o project)","local").option("--client-secret","Solicitar el secreto de cliente OAuth (o establecer la variable de entorno MCP_CLIENT_SECRET)").action(async(e,o,t)=>{const{mcpAddJsonHandler:s}=await import("./cli/handlers/mcp.js");await s(e,o,t)}),j.command("add-from-claude-desktop").description("Importar servidores MCP desde Context Desktop (solo Mac y WSL)").option("-s, --scope <ámbito>","Ámbito de configuración (local, user o project)","local").action(async e=>{const{mcpAddFromDesktopHandler:o}=await import("./cli/handlers/mcp.js");await o(e)}),j.command("reset-project-choices").description("Restablecer todos los servidores aprobados y rechazados del ámbito del proyecto (.mcp.json) dentro de este proyecto").action(async()=>{const{mcpResetChoicesHandler:e}=await import("./cli/handlers/mcp.js");await e()}),o("DIRECT_CONNECT")&&t.command("server").description("Iniciar un servidor de sesión de Context Code").option("--port <número>","Puerto HTTP","0").option("--host <dirección>","Dirección de escucha","0.0.0.0").option("--auth-token <token>","Token portador para autenticación").option("--unix <ruta>","Escucha en un socket de dominio Unix").option("--workspace <dir>","Directorio de trabajo por defecto para sesiones que no especifiquen cwd").option("--idle-timeout <ms>","Tiempo de espera de inactividad para sesiones desconectadas en ms (0 = nunca expira)","600000").option("--max-sessions <n>","Máximo de sesiones simultáneas (0 = sin límite)","32").action(async e=>{const{randomBytes:o}=await import("crypto"),{startServer:t}=await import("./server/server.js"),{SessionManager:s}=await import("./server/sessionManager.js"),{DangerousBackend:i}=await import("./server/backends/dangerousBackend.js"),{printBanner:r}=await import("./server/serverBanner.js"),{createServerLogger:n}=await import("./server/serverLog.js"),{writeServerLock:a,removeServerLock:c,probeRunningServer:l}=await import("./server/lockfile.js"),d=await l();d&&(process.stderr.write(`Ya hay un servidor context ejecutándose (pid ${d.pid}) en ${d.httpUrl}\n`),process.exit(1));const p=e.authToken??`sk-ant-cc-${o(16).toString("base64url")}`,m={port:parseInt(e.port,10),host:e.host,authToken:p,unix:e.unix,workspace:e.workspace,idleTimeoutMs:parseInt(e.idleTimeout,10),maxSessions:parseInt(e.maxSessions,10)},u=new s(new i,{idleTimeoutMs:m.idleTimeoutMs,maxSessions:m.maxSessions}),g=n(),f=t(m,u,g),h=f.port??m.port;r(m,p,h),await a({pid:process.pid,port:h,host:m.host,httpUrl:m.unix?`unix:${m.unix}`:`http://${m.host}:${h}`,startedAt:Date.now()});let v=!1;const shutdown=async()=>{v||(v=!0,f.stop(!0),await u.destroyAll(),await c(),process.exit(0))};process.once("SIGINT",()=>{shutdown()}),process.once("SIGTERM",()=>{shutdown()})});o("SSH_REMOTE")&&t.command("ssh <host> [dir]").description("Ejecutar Context Code en un host remoto a través de SSH. Despliega el binario y tuneliza la autenticación API a través de tu máquina local; no requiere configuración remota.").option("--permission-mode <modo>","Modo de permisos para la sesión remota").option("--dangerously-skip-permissions","Omitir todas las solicitudes de permiso en el remoto (peligroso)").option("--local","Modo de prueba e2e; lanza el CLI localmente (omite ssh/despliegue).").action(async()=>{process.stderr.write("Uso: context ssh <usuario@host | alias-ssh-config> [dir]\n\nEjecuta Context Code en un host Linux remoto. No necesitas instalar\nnada en el remoto ni ejecutar `context auth login` allí; el binario se\ndespliega vía SSH y la autenticación API se tuneliza de vuelta.\n"),process.exit(1)});o("DIRECT_CONNECT")&&t.command("open <cc-url>").description("Conectar a un servidor de Context Code (interno — usa URLs cc://)").option("-p, --print [prompt]","Modo impresión (sin interfaz)").option("--output-format <formato>","Formato de salida: text, json, stream-json","text").action(async(e,o)=>{const{parseConnectUrl:t}=await import("./server/parseConnectUrl.js"),{serverUrl:s,authToken:i}=t(e);let r;try{const e=await oi({serverUrl:s,authToken:i,cwd:Ne(),dangerouslySkipPermissions:xi?.dangerouslySkipPermissions});e.workDir&&(Rs(e.workDir),Ts(e.workDir)),Ps(s),r=e.config}catch(e){console.error(e instanceof ti?e.message:String(e)),process.exit(1)}const{runConnectHeadless:n}=await import("./server/connectHeadless.js"),a="string"==typeof o.print?o.print:"",c=!0===o.print;await n(r,a,o.outputFormat,c)});const O=t.command("auth").description("Gestionar autenticación").configureHelp(createSortedHelpConfig());O.command("login").description("Iniciar sesión por OAuth (Anthropic/OpenAI/Google según provider)").option("--email <email>","Pre-completar la dirección de correo en la página de inicio de sesión").option("--sso","Forzar el flujo de inicio de sesión SSO").option("--console","Usar Anthropic Console (facturación por uso de API) en lugar de la suscripción de Claude").option("--claudeai","Usar suscripción de Claude (por defecto)").option("--provider <id>","Provider OAuth: claude, openai, gemini-google").action(async({email:e,sso:o,console:t,claudeai:s,provider:i})=>{const{authLogin:r}=await import("./cli/handlers/auth.js");await r({email:e,sso:o,console:t,claudeai:s,provider:i})}),O.command("status").description("Show authentication status").option("--json","Output as JSON (default)").option("--text","Output as human-readable text").action(async e=>{const{authStatus:o}=await import("./cli/handlers/auth.js");await o(e)}),O.command("logout").description("Cerrar sesión en tu cuenta de Anthropic").action(async()=>{const{authLogout:e}=await import("./cli/handlers/auth.js");await e()}),O.command("provider-api-key").description("Guardar API key para un provider compatible").requiredOption("--provider <id>","ID de provider (openrouter, minimax, zai, gemini-api, nvidia, ollama-cloud)").requiredOption("--api-key <key>","API key del provider").option("--profile <name>","Perfil del provider").action(async e=>{const{authProviderApiKey:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider,apiKey:e.apiKey,profile:e.profile})}),O.command("provider-base-url").description("Guardar base URL para un provider compatible").requiredOption("--provider <id>","ID de provider (ollama, ollama-cloud, openrouter, gemini-google, zai, minimax, nvidia)").requiredOption("--base-url <url>","Base URL del provider").option("--profile <name>","Perfil del provider").action(async e=>{const{authProviderBaseUrl:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider,baseUrl:e.baseUrl,profile:e.profile})}),O.command("set-provider").description("Establecer provider activo para flujos de auth").requiredOption("--provider <id>","ID de provider (claude, openai, gemini-google, ...)").action(async e=>{const{authSetProviderPreference:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider})}),O.command("provider-remove").description("Eliminar provider/perfil y limpiar sus credenciales").requiredOption("--provider <id>","ID de provider (claude, openai, minimax, ollama, ...)").option("--profile <name>","Perfil del provider (si aplica)").action(async e=>{const{authProviderRemove:o}=await import("./cli/handlers/auth.js");await o({provider:e.provider,profile:e.profile})});const D=t.command("provider").description("Cambiar entre proveedores y configurar endpoints").configureHelp(createSortedHelpConfig());D.command("list").description("Listar proveedores y perfiles configurados").action(async()=>{const{providerListHandler:e}=await import("./cli/handlers/provider.js");await e()}),D.command("use <profile>").description("Activar un perfil de proveedor").action(async e=>{try{const{listProviderProfiles:o}=await import("./utils/model/providerProfiles.js"),{switchProviderPreference:t}=await import("./utils/model/providerSwitch.js"),{getAPIProvider:s}=await import("./utils/model/providers.js"),{getDefaultMainLoopModel:i}=await import("./utils/model/model.js"),r=o().filter(o=>o.name.toLowerCase()===e.toLowerCase()||o.id.toLowerCase()===e.toLowerCase());0===r.length&&(process.stderr.write(`Perfil '${e}' no encontrado.\n`),process.exit(1)),r.length>1&&(process.stderr.write(`Perfil ambiguo '${e}'. Hay múltiples perfiles con este nombre.\n`),process.exit(1));const n=r[0];t({currentModel:i(),currentProvider:s(),targetProvider:n.provider,targetProfileName:n.name}),process.stdout.write(`Perfil ${n.provider}/${n.name} activado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});const Y=t.command("profile").description("Gestionar perfiles de proveedor").configureHelp(createSortedHelpConfig());Y.command("use <providerOrProfile> [profileName]").description("Activar un perfil de proveedor").action(async(e,o)=>{try{const{listProviderProfiles:t}=await import("./utils/model/providerProfiles.js"),{switchProviderPreference:s}=await import("./utils/model/providerSwitch.js"),{getAPIProvider:i}=await import("./utils/model/providers.js"),{getDefaultMainLoopModel:r}=await import("./utils/model/model.js");let n,a=o;if(a)n=e;else{const o=t().filter(o=>o.name.toLowerCase()===e.toLowerCase()||o.id.toLowerCase()===e.toLowerCase());1===o.length?(n=o[0].provider,a=o[0].name):o.length>1?(process.stderr.write(`Perfil ambiguo '${e}'. Hay múltiples perfiles con este nombre.\n`),process.exit(1)):(n=e,a=void 0)}s({currentModel:r(),currentProvider:i(),targetProvider:n,targetProfileName:a}),process.stdout.write(`Perfil ${n}${a?"/"+a:""} activado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}),Y.command("create <provider> <profileName>").description("Crear un nuevo perfil de proveedor").action(async(e,o)=>{try{const{createProviderProfile:t,isProfiledProvider:s}=await import("./utils/model/providerProfiles.js");s(e)||(process.stderr.write(`Proveedor '${e}' no admite perfiles.\n`),process.exit(1)),t({provider:e,name:o,activate:!0}),process.stdout.write(`Perfil ${e}/${o} creado y activado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}}),Y.command("remove <provider> <profileName>").alias("delete").description("Eliminar un perfil de proveedor").action(async(e,o)=>{try{const{removeProviderProfile:t}=await import("./utils/model/providerProfiles.js");t(e,o)||(process.stderr.write(`Perfil ${e}/${o} no encontrado.\n`),process.exit(1)),process.stdout.write(`Perfil ${e}/${o} eliminado exitosamente.\n`),process.exit(0)}catch(e){process.stderr.write(`Error: ${e instanceof Error?e.message:String(e)}\n`),process.exit(1)}});t.command("model").description("Inspeccionar modelos disponibles por provider").configureHelp(createSortedHelpConfig()).command("list").description("Listar modelos disponibles del provider activo o de uno especifico").option("--provider <id>","ID del provider (claude, minimax, zai, openai, ...) o label (Claude, MiniMax, ...)").option("--json","Salida en formato JSON").action(async e=>{const{modelListHandler:o}=await import("./cli/handlers/modelList.js");await o(e)});const coworkOption=()=>new p("--cowork","Usar el directorio cowork_plugins").hideHelp(),Q=t.command("plugin").alias("plugins").description("Gestionar plugins de Context Code").configureHelp(createSortedHelpConfig());Q.command("validate <path>").description("Validar un manifiesto de plugin o marketplace").addOption(coworkOption()).action(async(e,o)=>{const{pluginValidateHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("list").description("Listar plugins instalados").option("--json","Salida en formato JSON").option("--available","Incluir plugins disponibles de los marketplaces (requiere --json)").addOption(coworkOption()).action(async e=>{const{pluginListHandler:o}=await import("./cli/handlers/plugins.js");await o(e)});const Z=Q.command("marketplace").description("Gestionar marketplaces de Context Code").configureHelp(createSortedHelpConfig());if(Z.command("add <source>").description("Añadir un marketplace desde una URL, ruta o repositorio de GitHub").addOption(coworkOption()).option("--sparse <paths...>","Limitar la descarga a directorios específicos mediante git sparse-checkout (para monorepositorios). Ejemplo: --sparse .claude-plugin plugins").option("--scope <scope>","Dónde declarar el marketplace: user (por defecto), project o local").action(async(e,o)=>{const{marketplaceAddHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Z.command("list").description("Listar todos los marketplaces configurados").option("--json","Salida en formato JSON").addOption(coworkOption()).action(async e=>{const{marketplaceListHandler:o}=await import("./cli/handlers/plugins.js");await o(e)}),Z.command("remove <name>").alias("rm").description("Eliminar un marketplace configurado").addOption(coworkOption()).action(async(e,o)=>{const{marketplaceRemoveHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Z.command("update [name]").description("Actualizar marketplace(s) desde su origen - actualiza todos si no se especifica un nombre").addOption(coworkOption()).action(async(e,o)=>{const{marketplaceUpdateHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("install <plugin>").alias("i").description("Instalar un plugin de los marketplaces disponibles (usa plugin@marketplace para un marketplace específico)").option("-s, --scope <scope>","Ámbito de instalación: user, project o local","user").addOption(coworkOption()).action(async(e,o)=>{const{pluginInstallHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("uninstall <plugin>").alias("remove").alias("rm").description("Desinstalar un plugin instalado").option("-s, --scope <scope>","Desinstalar del ámbito: user, project o local","user").option("--keep-data","Preservar el directorio de datos persistentes del plugin (~/.context/plugins/data/{id}/)").addOption(coworkOption()).action(async(e,o)=>{const{pluginUninstallHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("enable <plugin>").description("Habilitar un plugin deshabilitado").option("-s, --scope <scope>",`Ámbito de instalación: ${ao.join(", ")} (por defecto: auto-detect)`).addOption(coworkOption()).action(async(e,o)=>{const{pluginEnableHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("disable [plugin]").description("Deshabilitar un plugin habilitado").option("-a, --all","Deshabilitar todos los plugins habilitados").option("-s, --scope <scope>",`Ámbito de instalación: ${ao.join(", ")} (por defecto: auto-detect)`).addOption(coworkOption()).action(async(e,o)=>{const{pluginDisableHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),Q.command("update <plugin>").description("Actualizar un plugin a la última versión (se requiere reiniciar para aplicar)").option("-s, --scope <scope>",`Ámbito de instalación: ${co.join(", ")} (por defecto: user)`).addOption(coworkOption()).action(async(e,o)=>{const{pluginUpdateHandler:t}=await import("./cli/handlers/plugins.js");await t(e,o)}),t.command("setup-token").description("Configurar un token de autenticación de larga duración (requiere suscripción a Context)").action(async()=>{const[{setupTokenHandler:e},{createRoot:o}]=await Promise.all([import("./cli/handlers/util.js"),import("./ink.js")]),t=await o(we(!1));await e(t)}),t.command("agents").description("Listar agentes configurados").option("--setting-sources <sources>","Lista de fuentes de configuración a cargar separadas por comas (user, project, local).").option("--json","Salida en formato JSON estructurado para consumo por herramientas externas").action(async e=>{const{agentsHandler:o}=await import("./cli/handlers/agents.js");await o({json:!!e.json}),process.exit(0)}),o("TRANSCRIPT_CLASSIFIER")&&"disabled"!==qo()){const e=t.command("auto-mode").description("Inspeccionar la configuración del clasificador de modo automático");e.command("defaults").description("Imprimir el entorno predeterminado del modo automático, las reglas de permiso y denegación en formato JSON").action(async()=>{const{autoModeDefaultsHandler:e}=await import("./cli/handlers/autoMode.js");e(),process.exit(0)}),e.command("config").description("Imprimir la configuración efectiva del modo automático en formato JSON: tus ajustes si están establecidos, los valores predeterminados en caso contrario").action(async()=>{const{autoModeConfigHandler:e}=await import("./cli/handlers/autoMode.js");e(),process.exit(0)}),e.command("critique").description("Obtener comentarios de IA sobre tus reglas personalizadas de modo automático").option("--model <model>","Sobrescribir el modelo que se utiliza").action(async e=>{const{autoModeCritiqueHandler:o}=await import("./cli/handlers/autoMode.js");await o(e),process.exit()})}o("BRIDGE_MODE")&&t.command("remote-control",{hidden:!0}).alias("rc").description("Conectar tu entorno local para sesiones de control remoto a través de claude.ai/code").action(async()=>{const{bridgeMain:e}=await import("./bridge/bridgeMain.js");await e(process.argv.slice(3))});o("KAIROS")&&t.command("assistant [sessionId]").description("Adjuntar el REPL como cliente a una sesión puente en ejecución. Descubre sesiones a través de la API si no se proporciona sessionId.").action(()=>{process.stderr.write("Uso: Context Code assistant [sessionId]\n\nAdjuntar el REPL como cliente visor a una sesión puente en ejecución.\nOmite sessionId para descubrir y elegir entre las sesiones disponibles.\n"),process.exit(1)});t.command("doctor").description("Comprobar el estado del actualizador automático de Context Code. Nota: Se omite el diálogo de confianza del espacio de trabajo y se inician los servidores stdio de .mcp.json para las comprobaciones de salud. Usa este comando solo en directorios en los que confíes.").action(async()=>{const[{doctorHandler:e},{createRoot:o}]=await Promise.all([import("./cli/handlers/util.js"),import("./ink.js")]),t=await o(we(!1));await e(t)}),t.command("update").alias("upgrade").description("Buscar actualizaciones e instalarlas si están disponibles").action(async()=>{const{update:e}=await import("./cli/update.js");await e()}),!1;0;t.command("install [target]").description("Instalar la compilación nativa de Context Code. Usa [target] para especificar la versión (stable, latest o una versión específica)").option("--force","Forzar la instalación incluso si ya está instalado").action(async(e,o)=>{const{installHandler:t}=await import("./cli/handlers/util.js");await t(e,o)}),!1;return i("run_before_parse"),await t.parseAsync(process.argv),i("run_after_parse"),i("main_after_run"),r(),t}(),i("main_after_run")}function maybeActivateProactive(e){if((o("PROACTIVE")||o("KAIROS"))&&(e.proactive||jo(process.env.CONTEXT_CODE_PROACTIVE)||jo(process.env.CLAUDE_CODE_PROACTIVE))){const e=s("./proactive/index.js");e.isProactiveActive()||e.activateProactive("command")}}function maybeActivateBrief(e){if(!o("KAIROS")&&!o("KAIROS_BRIEF"))return;const t=e.brief,i=jo(process.env.CONTEXT_CODE_BRIEF)||jo(process.env.CLAUDE_CODE_BRIEF);if(!t&&!i)return;const{isBriefEntitled:r}=s("./tools/BriefTool/BriefTool.js"),n=r();n&&$s(!0),Re("tengu_brief_mode_enabled",{enabled:n,gated:!n,source:i?"env":"flag"})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{feature as e}from"../../recovery/bunBundleShim.js";import{createRequire as r}from"module";const s=r(import.meta.url);import{chmod as o,open as t,rename as n,stat as i,unlink as c}from"fs/promises";import a from"lodash-es/mapValues.js";import p from"lodash-es/memoize.js";import{dirname as l,join as f,parse as u}from"path";import{getPlatform as d}from"../../utils/platform.js";import{getPluginErrorMessage as m}from"../../types/plugin.js";import{isClaudeInChromeMCPServer as g}from"../../utils/claudeInChrome/common.js";import{getCurrentProjectConfig as v,getGlobalConfig as M,saveCurrentProjectConfig as S,saveGlobalConfig as h}from"../../utils/config.js";import{getCwd as w}from"../../utils/cwd.js";import{logForDebugging as C}from"../../utils/debug.js";import{getErrnoCode as y}from"../../utils/errors.js";import{getFsImplementation as j}from"../../utils/fsOperations.js";import{safeParseJSON as P}from"../../utils/json.js";import{logError as b}from"../../utils/log.js";import{getPluginMcpServers as x}from"../../utils/plugins/mcpPluginIntegration.js";import{loadAllPluginsCacheOnly as $}from"../../utils/plugins/pluginLoader.js";import{isSettingSourceEnabled as E}from"../../utils/settings/constants.js";import{getManagedFilePath as O}from"../../utils/settings/managedPath.js";import{isRestrictedToPluginOnly as F}from"../../utils/settings/pluginOnlyPolicy.js";import{getInitialSettings as A,getSettingsForSource as B}from"../../utils/settings/settings.js";import{isMcpServerCommandEntry as N,isMcpServerNameEntry as D,isMcpServerUrlEntry as k}from"../../utils/settings/types.js";import{jsonStringify as V}from"../../utils/slowOperations.js";import{logEvent as U}from"../analytics/index.js";import{fetchClaudeAIMcpConfigsIfEligible as _}from"./claudeai.js";import{expandEnvVarsInString as T}from"./envExpansion.js";import{McpJsonConfigSchema as W,McpServerConfigSchema as I}from"./types.js";import{getProjectMcpServerStatus as R}from"./utils.js";export function getEnterpriseMcpFilePath(){return f(O(),"managed-mcp.json")}function addScopeToServers(e,r){if(!e)return{};const s={};for(const[o,t]of Object.entries(e))s[o]={...t,scope:r};return s}async function writeMcpjsonFile(e){const r=f(w(),".mcp.json");let s;try{s=(await i(r)).mode}catch(e){if("ENOENT"!==y(e))throw e}const a=`${r}.tmp.${process.pid}.${Date.now()}`,p=await t(a,"w",s??420);try{await p.writeFile(V(e,null,2),{encoding:"utf8"}),await p.datasync()}finally{await p.close()}try{void 0!==s&&await o(a,s),await n(a,r)}catch(e){try{await c(a)}catch{}throw e}}function getServerCommandArray(e){if(void 0!==e.type&&"stdio"!==e.type)return null;const r=e;return[r.command,...r.args??[]]}function commandArraysMatch(e,r){return e.length===r.length&&e.every((e,s)=>e===r[s])}function getServerUrl(e){return"url"in e?e.url:null}const J=["/v2/session_ingress/shttp/mcp/","/v2/ccr-sessions/"];export function unwrapCcrProxyUrl(e){if(!J.some(r=>e.includes(r)))return e;try{const r=new URL(e);return r.searchParams.get("mcp_url")||e}catch{return e}}export function getMcpServerSignature(e){const r=getServerCommandArray(e);if(r)return`stdio:${V(r)}`;const s=getServerUrl(e);return s?`url:${unwrapCcrProxyUrl(s)}`:null}export function dedupPluginMcpServers(e,r){const s=new Map;for(const[e,o]of Object.entries(r)){const r=getMcpServerSignature(o);r&&!s.has(r)&&s.set(r,e)}const o={},t=[],n=new Map;for(const[r,i]of Object.entries(e)){const e=getMcpServerSignature(i);if(null===e){o[r]=i;continue}const c=s.get(e);if(void 0!==c){C(`Suppressing plugin MCP server "${r}": duplicates manually-configured "${c}"`),t.push({name:r,duplicateOf:c});continue}const a=n.get(e);void 0===a?(n.set(e,r),o[r]=i):(C(`Suppressing plugin MCP server "${r}": duplicates earlier plugin server "${a}"`),t.push({name:r,duplicateOf:a}))}return{servers:o,suppressed:t}}export function dedupClaudeAiMcpServers(e,r){const s=new Map;for(const[e,o]of Object.entries(r)){if(isMcpServerDisabled(e))continue;const r=getMcpServerSignature(o);r&&!s.has(r)&&s.set(r,e)}const o={},t=[];for(const[r,n]of Object.entries(e)){const e=getMcpServerSignature(n),i=null!==e?s.get(e):void 0;void 0===i?o[r]=n:(C(`Suppressing claude.ai connector "${r}": duplicates manually-configured "${i}"`),t.push({name:r,duplicateOf:i}))}return{servers:o,suppressed:t}}function urlMatchesPattern(e,r){const s=function(e){const r=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${r}$`)}(r);return s.test(e)}function isMcpServerDenied(e,r){const s=A();if(!s.deniedMcpServers)return!1;for(const r of s.deniedMcpServers)if(D(r)&&r.serverName===e)return!0;if(r){const e=getServerCommandArray(r);if(e)for(const r of s.deniedMcpServers)if(N(r)&&commandArraysMatch(r.serverCommand,e))return!0;const o=getServerUrl(r);if(o)for(const e of s.deniedMcpServers)if(k(e)&&urlMatchesPattern(o,e.serverUrl))return!0}return!1}function isMcpServerAllowedByPolicy(e,r){if(isMcpServerDenied(e,r))return!1;const s=shouldAllowManagedMcpServersOnly()?B("policySettings")??{}:A();if(!s.allowedMcpServers)return!0;if(0===s.allowedMcpServers.length)return!1;const o=s.allowedMcpServers.some(N),t=s.allowedMcpServers.some(k);if(r){const n=getServerCommandArray(r),i=getServerUrl(r);if(n){if(o){for(const e of s.allowedMcpServers)if(N(e)&&commandArraysMatch(e.serverCommand,n))return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}if(i){if(t){for(const e of s.allowedMcpServers)if(k(e)&&urlMatchesPattern(i,e.serverUrl))return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}export function filterMcpServersByPolicy(e){const r={},s=[];for(const[o,t]of Object.entries(e)){const e=t;"sdk"===e.type||isMcpServerAllowedByPolicy(o,e)?r[o]=t:s.push(o)}return{allowed:r,blocked:s}}function expandEnvVars(e){const r=[];function expandString(e){const{expanded:s,missingVars:o}=T(e);return r.push(...o),s}let s;switch(e.type){case void 0:case"stdio":{const r=e;s={...r,command:expandString(r.command),args:r.args.map(expandString),env:r.env?a(r.env,expandString):void 0};break}case"sse":case"http":case"ws":{const r=e;s={...r,url:expandString(r.url),headers:r.headers?a(r.headers,expandString):void 0};break}case"sse-ide":case"ws-ide":case"sdk":case"claudeai-proxy":s=e}return{expanded:s,missingVars:[...new Set(r)]}}export async function addMcpConfig(r,s,o){if(r.match(/[^a-zA-Z0-9_-]/))throw new Error(`Invalid name ${r}. Names can only contain letters, numbers, hyphens, and underscores.`);if(g(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`);if(e("CHICAGO_MCP")){const{isComputerUseMCPServer:e}=await import("../../utils/computerUse/common.js");if(e(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`)}const{isDatabaseMCPServer:t}=await import("../../utils/databaseMcp/common.js");if(t(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`);const{isComputerControlMCPServer:n}=await import("../../utils/computerControlMcp/common.js");if(n(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`);if(doesEnterpriseMcpConfigExist())throw new Error("Cannot add MCP server: enterprise MCP configuration is active and has exclusive control over MCP servers");const i=I().safeParse(s);if(!i.success){const e=i.error.issues.map(e=>`${e.path.join(".")}: ${e.message}`).join(", ");throw new Error(`Invalid configuration: ${e}`)}const c=i.data;if(isMcpServerDenied(r,c))throw new Error(`Cannot add MCP server "${r}": server is explicitly blocked by enterprise policy`);if(!isMcpServerAllowedByPolicy(r,c))throw new Error(`Cannot add MCP server "${r}": not allowed by enterprise policy`);switch(o){case"project":{const{servers:e}=getProjectMcpConfigsFromCwd();if(e[r])throw new Error(`MCP server ${r} already exists in .mcp.json`);break}case"user":{const e=M();if(e.mcpServers?.[r])throw new Error(`MCP server ${r} already exists in user config`);break}case"local":{const e=v();if(e.mcpServers?.[r])throw new Error(`MCP server ${r} already exists in local config`);break}case"dynamic":throw new Error("Cannot add MCP server to scope: dynamic");case"enterprise":throw new Error("Cannot add MCP server to scope: enterprise");case"claudeai":throw new Error("Cannot add MCP server to scope: claudeai")}switch(o){case"project":{const{servers:e}=getProjectMcpConfigsFromCwd(),s={};for(const[r,o]of Object.entries(e)){const{scope:e,...t}=o;s[r]=t}s[r]=c;const o={mcpServers:s};try{await writeMcpjsonFile(o)}catch(e){throw new Error(`Failed to write to .mcp.json: ${e}`)}break}case"user":h(e=>({...e,mcpServers:{...e.mcpServers,[r]:c}}));break;case"local":S(e=>({...e,mcpServers:{...e.mcpServers,[r]:c}}));break;default:throw new Error(`Cannot add MCP server to scope: ${o}`)}}export async function removeMcpConfig(e,r){switch(r){case"project":{const{servers:r}=getProjectMcpConfigsFromCwd();if(!r[e])throw new Error(`No MCP server found with name: ${e} in .mcp.json`);const s={};for(const[o,t]of Object.entries(r))if(o!==e){const{scope:e,...r}=t;s[o]=r}const o={mcpServers:s};try{await writeMcpjsonFile(o)}catch(e){throw new Error(`Failed to remove from .mcp.json: ${e}`)}break}case"user":{const r=M();if(!r.mcpServers?.[e])throw new Error(`No user-scoped MCP server found with name: ${e}`);h(r=>{const{[e]:s,...o}=r.mcpServers??{};return{...r,mcpServers:o}});break}case"local":{const r=v();if(!r.mcpServers?.[e])throw new Error(`No project-local MCP server found with name: ${e}`);S(r=>{const{[e]:s,...o}=r.mcpServers??{};return{...r,mcpServers:o}});break}default:throw new Error(`Cannot remove MCP server from scope: ${r}`)}}export function getProjectMcpConfigsFromCwd(){if(!E("projectSettings"))return{servers:{},errors:[]};const e=f(w(),".mcp.json"),{config:r,errors:s}=parseMcpConfigFromFilePath({filePath:e,expandVars:!0,scope:"project"});if(!r){const r=s.filter(e=>!e.message.startsWith("MCP config file not found"));return r.length>0?(C(`MCP config errors for ${e}: ${V(r.map(e=>e.message))}`,{level:"error"}),{servers:{},errors:r}):{servers:{},errors:[]}}return{servers:r.mcpServers?addScopeToServers(r.mcpServers,"project"):{},errors:s||[]}}export function getMcpConfigsByScope(e){const r={project:"projectSettings",user:"userSettings",local:"localSettings"};if(e in r&&!E(r[e]))return{servers:{},errors:[]};switch(e){case"project":{const r={},s=[],o=[];let t=w();for(;t!==u(t).root;)o.push(t),t=l(t);for(const t of o.reverse()){const o=f(t,".mcp.json"),{config:n,errors:i}=parseMcpConfigFromFilePath({filePath:o,expandVars:!0,scope:"project"});if(!n){const e=i.filter(e=>!e.message.startsWith("MCP config file not found"));e.length>0&&(C(`MCP config errors for ${o}: ${V(e.map(e=>e.message))}`,{level:"error"}),s.push(...e));continue}n.mcpServers&&Object.assign(r,addScopeToServers(n.mcpServers,e)),i.length>0&&s.push(...i)}return{servers:r,errors:s}}case"user":{const r=M().mcpServers;if(!r)return{servers:{},errors:[]};const{config:s,errors:o}=parseMcpConfig({configObject:{mcpServers:r},expandVars:!0,scope:"user"});return{servers:addScopeToServers(s?.mcpServers,e),errors:o}}case"local":{const r=v().mcpServers;if(!r)return{servers:{},errors:[]};const{config:s,errors:o}=parseMcpConfig({configObject:{mcpServers:r},expandVars:!0,scope:"local"});return{servers:addScopeToServers(s?.mcpServers,e),errors:o}}case"enterprise":{const r=getEnterpriseMcpFilePath(),{config:s,errors:o}=parseMcpConfigFromFilePath({filePath:r,expandVars:!0,scope:"enterprise"});if(!s){const e=o.filter(e=>!e.message.startsWith("MCP config file not found"));return e.length>0?(C(`Enterprise MCP config errors for ${r}: ${V(e.map(e=>e.message))}`,{level:"error"}),{servers:{},errors:e}):{servers:{},errors:[]}}return{servers:addScopeToServers(s.mcpServers,e),errors:o}}}}export function getMcpConfigByName(e){const{servers:r}=getMcpConfigsByScope("enterprise");if(F("mcp"))return r[e]??null;const{servers:s}=getMcpConfigsByScope("user"),{servers:o}=getMcpConfigsByScope("project"),{servers:t}=getMcpConfigsByScope("local");return r[e]?r[e]:t[e]?t[e]:o[e]?o[e]:s[e]?s[e]:null}export async function getClaudeCodeMcpConfigs(e={},r=Promise.resolve({})){const{servers:s}=getMcpConfigsByScope("enterprise");if(doesEnterpriseMcpConfigExist()){const e={};for(const[r,o]of Object.entries(s))isMcpServerAllowedByPolicy(r,o)&&(e[r]=o);return{servers:e,errors:[]}}const o=F("mcp"),t={servers:{}},{servers:n}=o?t:getMcpConfigsByScope("user"),{servers:i}=o?t:getMcpConfigsByScope("project"),{servers:c}=o?t:getMcpConfigsByScope("local"),a={},p=await $(),l=[];if(p.errors.length>0)for(const e of p.errors)if("mcp-config-invalid"===e.type||"mcpb-download-failed"===e.type||"mcpb-extract-failed"===e.type||"mcpb-invalid-manifest"===e.type){const r=`Plugin MCP loading error - ${e.type}: ${m(e)}`;b(new Error(r))}else{const r=e.type;C(`Plugin not available for MCP: ${e.source} - error type: ${r}`)}const f=await Promise.all(p.enabled.map(e=>x(e,l)));for(const e of f)e&&Object.assign(a,e);if(l.length>0)for(const e of l){const r=`Plugin MCP server error - ${e.type}: ${m(e)}`;b(new Error(r))}const u={};for(const[e,r]of Object.entries(i))"approved"===R(e)&&(u[e]=r);const d=await r,g={};for(const[r,s]of Object.entries({...n,...u,...c,...e,...d}))!isMcpServerDisabled(r)&&isMcpServerAllowedByPolicy(r,s)&&(g[r]=s);const v={},M={};for(const[e,r]of Object.entries(a))isMcpServerDisabled(e)||!isMcpServerAllowedByPolicy(e,r)?M[e]=r:v[e]=r;const{servers:S,suppressed:h}=dedupPluginMcpServers(v,g);Object.assign(S,M);for(const{name:e,duplicateOf:r}of h){const s=e.split(":");"plugin"!==s[0]||s.length<3||l.push({type:"mcp-server-suppressed-duplicate",source:e,plugin:s[1],serverName:s.slice(2).join(":"),duplicateOf:r})}const w=Object.assign({},S,n,u,c),y={};for(const[e,r]of Object.entries(w))isMcpServerAllowedByPolicy(e,r)&&(y[e]=r);return{servers:y,errors:l}}export async function getAllMcpConfigs(){if(doesEnterpriseMcpConfigExist())return getClaudeCodeMcpConfigs();const e=_(),{servers:r,errors:s}=await getClaudeCodeMcpConfigs({},e),{allowed:o}=filterMcpServersByPolicy(await e),{servers:t}=dedupClaudeAiMcpServers(o,r);return{servers:Object.assign({},t,r),errors:s}}export function parseMcpConfig(e){const{configObject:r,expandVars:s,scope:o,filePath:t}=e,n=W().safeParse(r);if(!n.success)return{config:null,errors:n.error.issues.map(e=>({...t&&{file:t},path:e.path.join("."),message:"Does not adhere to MCP server configuration schema",mcpErrorMetadata:{scope:o,severity:"fatal"}}))};const i=[],c={};for(const[e,r]of Object.entries(n.data.mcpServers)){let n=r;if(s){const{expanded:s,missingVars:c}=expandEnvVars(r);c.length>0&&i.push({...t&&{file:t},path:`mcpServers.${e}`,message:`Missing environment variables: ${c.join(", ")}`,suggestion:`Set the following environment variables: ${c.join(", ")}`,mcpErrorMetadata:{scope:o,serverName:e,severity:"warning"}}),n=s}"windows"!==d()||n.type&&"stdio"!==n.type||"npx"!==n.command&&!n.command.endsWith("\\npx")&&!n.command.endsWith("/npx")||i.push({...t&&{file:t},path:`mcpServers.${e}`,message:"Windows requires 'cmd /c' wrapper to execute npx",suggestion:'Change command to "cmd" with args ["/c", "npx", ...]',mcpErrorMetadata:{scope:o,serverName:e,severity:"warning"}}),c[e]=n}return{config:{mcpServers:c},errors:i}}export function parseMcpConfigFromFilePath(e){const{filePath:r,expandVars:s,scope:o}=e,t=j();let n;try{n=t.readFileSync(r,{encoding:"utf8"})}catch(e){return"ENOENT"===y(e)?{config:null,errors:[{file:r,path:"",message:`MCP config file not found: ${r}`,suggestion:"Check that the file path is correct",mcpErrorMetadata:{scope:o,severity:"fatal"}}]}:(C(`MCP config read error for ${r} (scope=${o}): ${e}`,{level:"error"}),{config:null,errors:[{file:r,path:"",message:`Failed to read file: ${e}`,suggestion:"Check file permissions and ensure the file exists",mcpErrorMetadata:{scope:o,severity:"fatal"}}]})}const i=P(n);return i?parseMcpConfig({configObject:i,expandVars:s,scope:o,filePath:r}):(C(`MCP config is not valid JSON: ${r} (scope=${o}, length=${n.length}, first100=${V(n.slice(0,100))})`,{level:"error"}),{config:null,errors:[{file:r,path:"",message:"MCP config is not a valid JSON",suggestion:"Fix the JSON syntax errors in the file",mcpErrorMetadata:{scope:o,severity:"fatal"}}]})}export const doesEnterpriseMcpConfigExist=p(()=>{const{config:e}=parseMcpConfigFromFilePath({filePath:getEnterpriseMcpFilePath(),expandVars:!0,scope:"enterprise"});return null!==e});export function shouldAllowManagedMcpServersOnly(){return!0===B("policySettings")?.allowManagedMcpServersOnly}export function areMcpConfigsAllowedWithEnterpriseMcpConfig(e){return Object.values(e).every(e=>"sdk"===e.type&&"claude-vscode"===e.name)}const z=e("CHICAGO_MCP")?s("../../utils/computerUse/common.js").COMPUTER_USE_MCP_SERVER_NAME:null;function isDefaultDisabledBuiltin(e){return null!==z&&e===z}export function isMcpServerDisabled(e){const r=v();if(isDefaultDisabledBuiltin(e)){return!(r.enabledMcpServers||[]).includes(e)}return(r.disabledMcpServers||[]).includes(e)}function toggleMembership(e,r,s){return e.includes(r)===s?e:s?[...e,r]:e.filter(e=>e!==r)}export function setMcpServerEnabled(e,r){const s=isDefaultDisabledBuiltin(e)&&isMcpServerDisabled(e)===r;S(s=>{if(isDefaultDisabledBuiltin(e)){const o=s.enabledMcpServers||[],t=toggleMembership(o,e,r);return t===o?s:{...s,enabledMcpServers:t}}const o=s.disabledMcpServers||[],t=toggleMembership(o,e,!r);return t===o?s:{...s,disabledMcpServers:t}}),s&&U("tengu_builtin_mcp_toggle",{serverName:e,enabled:r})}
|
|
1
|
+
import{feature as e}from"../../recovery/bunBundleShim.js";import{createRequire as r}from"module";const s=r(import.meta.url);import{chmod as o,open as t,rename as n,stat as i,unlink as c}from"fs/promises";import a from"lodash-es/mapValues.js";import p from"lodash-es/memoize.js";import{dirname as l,join as f,parse as u}from"path";import{getPlatform as d}from"../../utils/platform.js";import{getPluginErrorMessage as m}from"../../types/plugin.js";import{isClaudeInChromeMCPServer as v}from"../../utils/claudeInChrome/common.js";import{getCurrentProjectConfig as g,getGlobalConfig as M,saveCurrentProjectConfig as S,saveGlobalConfig as h}from"../../utils/config.js";import{getCwd as w}from"../../utils/cwd.js";import{logForDebugging as C}from"../../utils/debug.js";import{getErrnoCode as y}from"../../utils/errors.js";import{getFsImplementation as P}from"../../utils/fsOperations.js";import{safeParseJSON as j}from"../../utils/json.js";import{logError as b}from"../../utils/log.js";import{getPluginMcpServers as x}from"../../utils/plugins/mcpPluginIntegration.js";import{loadAllPluginsCacheOnly as $}from"../../utils/plugins/pluginLoader.js";import{isSettingSourceEnabled as E}from"../../utils/settings/constants.js";import{getManagedFilePath as O}from"../../utils/settings/managedPath.js";import{isRestrictedToPluginOnly as F}from"../../utils/settings/pluginOnlyPolicy.js";import{getInitialSettings as A,getSettingsForSource as B}from"../../utils/settings/settings.js";import{isMcpServerCommandEntry as N,isMcpServerNameEntry as D,isMcpServerUrlEntry as k}from"../../utils/settings/types.js";import{jsonStringify as V}from"../../utils/slowOperations.js";import{logEvent as U}from"../analytics/index.js";import{fetchClaudeAIMcpConfigsIfEligible as _}from"./claudeai.js";import{expandEnvVarsInString as T}from"./envExpansion.js";import{McpJsonConfigSchema as W,McpServerConfigSchema as I}from"./types.js";import{getProjectMcpServerStatus as R}from"./utils.js";export function getEnterpriseMcpFilePath(){return f(O(),"managed-mcp.json")}function addScopeToServers(e,r){if(!e)return{};const s={};for(const[o,t]of Object.entries(e))s[o]={...t,scope:r};return s}async function writeMcpjsonFile(e){const r=f(w(),".mcp.json");let s;try{s=(await i(r)).mode}catch(e){if("ENOENT"!==y(e))throw e}const a=`${r}.tmp.${process.pid}.${Date.now()}`,p=await t(a,"w",s??420);try{await p.writeFile(V(e,null,2),{encoding:"utf8"}),await p.datasync()}finally{await p.close()}try{void 0!==s&&await o(a,s),await n(a,r)}catch(e){try{await c(a)}catch{}throw e}}function getServerCommandArray(e){if(void 0!==e.type&&"stdio"!==e.type)return null;const r=e;return[r.command,...r.args??[]]}function commandArraysMatch(e,r){return e.length===r.length&&e.every((e,s)=>e===r[s])}function getServerUrl(e){return"url"in e?e.url:null}const J=["/v2/session_ingress/shttp/mcp/","/v2/ccr-sessions/"];export function unwrapCcrProxyUrl(e){if(!J.some(r=>e.includes(r)))return e;try{const r=new URL(e);return r.searchParams.get("mcp_url")||e}catch{return e}}export function getMcpServerSignature(e){const r=getServerCommandArray(e);if(r)return`stdio:${V(r)}`;const s=getServerUrl(e);return s?`url:${unwrapCcrProxyUrl(s)}`:null}export function dedupPluginMcpServers(e,r){const s=new Map;for(const[e,o]of Object.entries(r)){const r=getMcpServerSignature(o);r&&!s.has(r)&&s.set(r,e)}const o={},t=[],n=new Map;for(const[r,i]of Object.entries(e)){const e=getMcpServerSignature(i);if(null===e){o[r]=i;continue}const c=s.get(e);if(void 0!==c){C(`Suppressing plugin MCP server "${r}": duplicates manually-configured "${c}"`),t.push({name:r,duplicateOf:c});continue}const a=n.get(e);void 0===a?(n.set(e,r),o[r]=i):(C(`Suppressing plugin MCP server "${r}": duplicates earlier plugin server "${a}"`),t.push({name:r,duplicateOf:a}))}return{servers:o,suppressed:t}}export function dedupClaudeAiMcpServers(e,r){const s=new Map;for(const[e,o]of Object.entries(r)){if(isMcpServerDisabled(e))continue;const r=getMcpServerSignature(o);r&&!s.has(r)&&s.set(r,e)}const o={},t=[];for(const[r,n]of Object.entries(e)){const e=getMcpServerSignature(n),i=null!==e?s.get(e):void 0;void 0===i?o[r]=n:(C(`Suppressing claude.ai connector "${r}": duplicates manually-configured "${i}"`),t.push({name:r,duplicateOf:i}))}return{servers:o,suppressed:t}}function urlMatchesPattern(e,r){const s=function(e){const r=e.replace(/[.+?^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*");return new RegExp(`^${r}$`)}(r);return s.test(e)}function isMcpServerDenied(e,r){const s=A();if(!s.deniedMcpServers)return!1;for(const r of s.deniedMcpServers)if(D(r)&&r.serverName===e)return!0;if(r){const e=getServerCommandArray(r);if(e)for(const r of s.deniedMcpServers)if(N(r)&&commandArraysMatch(r.serverCommand,e))return!0;const o=getServerUrl(r);if(o)for(const e of s.deniedMcpServers)if(k(e)&&urlMatchesPattern(o,e.serverUrl))return!0}return!1}function isMcpServerAllowedByPolicy(e,r){if(isMcpServerDenied(e,r))return!1;const s=shouldAllowManagedMcpServersOnly()?B("policySettings")??{}:A();if(!s.allowedMcpServers)return!0;if(0===s.allowedMcpServers.length)return!1;const o=s.allowedMcpServers.some(N),t=s.allowedMcpServers.some(k);if(r){const n=getServerCommandArray(r),i=getServerUrl(r);if(n){if(o){for(const e of s.allowedMcpServers)if(N(e)&&commandArraysMatch(e.serverCommand,n))return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}if(i){if(t){for(const e of s.allowedMcpServers)if(k(e)&&urlMatchesPattern(i,e.serverUrl))return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}for(const r of s.allowedMcpServers)if(D(r)&&r.serverName===e)return!0;return!1}export function filterMcpServersByPolicy(e){const r={},s=[];for(const[o,t]of Object.entries(e)){const e=t;"sdk"===e.type||isMcpServerAllowedByPolicy(o,e)?r[o]=t:s.push(o)}return{allowed:r,blocked:s}}function expandEnvVars(e){const r=[];function expandString(e){const{expanded:s,missingVars:o}=T(e);return r.push(...o),s}let s;switch(e.type){case void 0:case"stdio":{const r=e;s={...r,command:expandString(r.command),args:r.args.map(expandString),env:r.env?a(r.env,expandString):void 0};break}case"sse":case"http":case"ws":{const r=e;s={...r,url:expandString(r.url),headers:r.headers?a(r.headers,expandString):void 0};break}case"sse-ide":case"ws-ide":case"sdk":case"claudeai-proxy":s=e}return{expanded:s,missingVars:[...new Set(r)]}}export async function addMcpConfig(r,s,o){if(r.match(/[^a-zA-Z0-9_-]/))throw new Error(`Invalid name ${r}. Names can only contain letters, numbers, hyphens, and underscores.`);if(v(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`);if(e("CHICAGO_MCP")){const{isComputerUseMCPServer:e}=await import("../../utils/computerUse/common.js");if(e(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`)}const{isDatabaseMCPServer:t}=await import("../../utils/databaseMcp/common.js");if(t(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`);const{isMetaMCPServer:n}=await import("../../utils/metaMcp/common.js");if(n(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`);const{isComputerControlMCPServer:i}=await import("../../utils/computerControlMcp/common.js");if(i(r))throw new Error(`Cannot add MCP server "${r}": this name is reserved.`);if(doesEnterpriseMcpConfigExist())throw new Error("Cannot add MCP server: enterprise MCP configuration is active and has exclusive control over MCP servers");const c=I().safeParse(s);if(!c.success){const e=c.error.issues.map(e=>`${e.path.join(".")}: ${e.message}`).join(", ");throw new Error(`Invalid configuration: ${e}`)}const a=c.data;if(isMcpServerDenied(r,a))throw new Error(`Cannot add MCP server "${r}": server is explicitly blocked by enterprise policy`);if(!isMcpServerAllowedByPolicy(r,a))throw new Error(`Cannot add MCP server "${r}": not allowed by enterprise policy`);switch(o){case"project":{const{servers:e}=getProjectMcpConfigsFromCwd();if(e[r])throw new Error(`MCP server ${r} already exists in .mcp.json`);break}case"user":{const e=M();if(e.mcpServers?.[r])throw new Error(`MCP server ${r} already exists in user config`);break}case"local":{const e=g();if(e.mcpServers?.[r])throw new Error(`MCP server ${r} already exists in local config`);break}case"dynamic":throw new Error("Cannot add MCP server to scope: dynamic");case"enterprise":throw new Error("Cannot add MCP server to scope: enterprise");case"claudeai":throw new Error("Cannot add MCP server to scope: claudeai")}switch(o){case"project":{const{servers:e}=getProjectMcpConfigsFromCwd(),s={};for(const[r,o]of Object.entries(e)){const{scope:e,...t}=o;s[r]=t}s[r]=a;const o={mcpServers:s};try{await writeMcpjsonFile(o)}catch(e){throw new Error(`Failed to write to .mcp.json: ${e}`)}break}case"user":h(e=>({...e,mcpServers:{...e.mcpServers,[r]:a}}));break;case"local":S(e=>({...e,mcpServers:{...e.mcpServers,[r]:a}}));break;default:throw new Error(`Cannot add MCP server to scope: ${o}`)}}export async function removeMcpConfig(e,r){switch(r){case"project":{const{servers:r}=getProjectMcpConfigsFromCwd();if(!r[e])throw new Error(`No MCP server found with name: ${e} in .mcp.json`);const s={};for(const[o,t]of Object.entries(r))if(o!==e){const{scope:e,...r}=t;s[o]=r}const o={mcpServers:s};try{await writeMcpjsonFile(o)}catch(e){throw new Error(`Failed to remove from .mcp.json: ${e}`)}break}case"user":{const r=M();if(!r.mcpServers?.[e])throw new Error(`No user-scoped MCP server found with name: ${e}`);h(r=>{const{[e]:s,...o}=r.mcpServers??{};return{...r,mcpServers:o}});break}case"local":{const r=g();if(!r.mcpServers?.[e])throw new Error(`No project-local MCP server found with name: ${e}`);S(r=>{const{[e]:s,...o}=r.mcpServers??{};return{...r,mcpServers:o}});break}default:throw new Error(`Cannot remove MCP server from scope: ${r}`)}}export function getProjectMcpConfigsFromCwd(){if(!E("projectSettings"))return{servers:{},errors:[]};const e=f(w(),".mcp.json"),{config:r,errors:s}=parseMcpConfigFromFilePath({filePath:e,expandVars:!0,scope:"project"});if(!r){const r=s.filter(e=>!e.message.startsWith("MCP config file not found"));return r.length>0?(C(`MCP config errors for ${e}: ${V(r.map(e=>e.message))}`,{level:"error"}),{servers:{},errors:r}):{servers:{},errors:[]}}return{servers:r.mcpServers?addScopeToServers(r.mcpServers,"project"):{},errors:s||[]}}export function getMcpConfigsByScope(e){const r={project:"projectSettings",user:"userSettings",local:"localSettings"};if(e in r&&!E(r[e]))return{servers:{},errors:[]};switch(e){case"project":{const r={},s=[],o=[];let t=w();for(;t!==u(t).root;)o.push(t),t=l(t);for(const t of o.reverse()){const o=f(t,".mcp.json"),{config:n,errors:i}=parseMcpConfigFromFilePath({filePath:o,expandVars:!0,scope:"project"});if(!n){const e=i.filter(e=>!e.message.startsWith("MCP config file not found"));e.length>0&&(C(`MCP config errors for ${o}: ${V(e.map(e=>e.message))}`,{level:"error"}),s.push(...e));continue}n.mcpServers&&Object.assign(r,addScopeToServers(n.mcpServers,e)),i.length>0&&s.push(...i)}return{servers:r,errors:s}}case"user":{const r=M().mcpServers;if(!r)return{servers:{},errors:[]};const{config:s,errors:o}=parseMcpConfig({configObject:{mcpServers:r},expandVars:!0,scope:"user"});return{servers:addScopeToServers(s?.mcpServers,e),errors:o}}case"local":{const r=g().mcpServers;if(!r)return{servers:{},errors:[]};const{config:s,errors:o}=parseMcpConfig({configObject:{mcpServers:r},expandVars:!0,scope:"local"});return{servers:addScopeToServers(s?.mcpServers,e),errors:o}}case"enterprise":{const r=getEnterpriseMcpFilePath(),{config:s,errors:o}=parseMcpConfigFromFilePath({filePath:r,expandVars:!0,scope:"enterprise"});if(!s){const e=o.filter(e=>!e.message.startsWith("MCP config file not found"));return e.length>0?(C(`Enterprise MCP config errors for ${r}: ${V(e.map(e=>e.message))}`,{level:"error"}),{servers:{},errors:e}):{servers:{},errors:[]}}return{servers:addScopeToServers(s.mcpServers,e),errors:o}}}}export function getMcpConfigByName(e){const{servers:r}=getMcpConfigsByScope("enterprise");if(F("mcp"))return r[e]??null;const{servers:s}=getMcpConfigsByScope("user"),{servers:o}=getMcpConfigsByScope("project"),{servers:t}=getMcpConfigsByScope("local");return r[e]?r[e]:t[e]?t[e]:o[e]?o[e]:s[e]?s[e]:null}export async function getClaudeCodeMcpConfigs(e={},r=Promise.resolve({})){const{servers:s}=getMcpConfigsByScope("enterprise");if(doesEnterpriseMcpConfigExist()){const e={};for(const[r,o]of Object.entries(s))isMcpServerAllowedByPolicy(r,o)&&(e[r]=o);return{servers:e,errors:[]}}const o=F("mcp"),t={servers:{}},{servers:n}=o?t:getMcpConfigsByScope("user"),{servers:i}=o?t:getMcpConfigsByScope("project"),{servers:c}=o?t:getMcpConfigsByScope("local"),a={},p=await $(),l=[];if(p.errors.length>0)for(const e of p.errors)if("mcp-config-invalid"===e.type||"mcpb-download-failed"===e.type||"mcpb-extract-failed"===e.type||"mcpb-invalid-manifest"===e.type){const r=`Plugin MCP loading error - ${e.type}: ${m(e)}`;b(new Error(r))}else{const r=e.type;C(`Plugin not available for MCP: ${e.source} - error type: ${r}`)}const f=await Promise.all(p.enabled.map(e=>x(e,l)));for(const e of f)e&&Object.assign(a,e);if(l.length>0)for(const e of l){const r=`Plugin MCP server error - ${e.type}: ${m(e)}`;b(new Error(r))}const u={};for(const[e,r]of Object.entries(i))"approved"===R(e)&&(u[e]=r);const d=await r,v={};for(const[r,s]of Object.entries({...n,...u,...c,...e,...d}))!isMcpServerDisabled(r)&&isMcpServerAllowedByPolicy(r,s)&&(v[r]=s);const g={},M={};for(const[e,r]of Object.entries(a))isMcpServerDisabled(e)||!isMcpServerAllowedByPolicy(e,r)?M[e]=r:g[e]=r;const{servers:S,suppressed:h}=dedupPluginMcpServers(g,v);Object.assign(S,M);for(const{name:e,duplicateOf:r}of h){const s=e.split(":");"plugin"!==s[0]||s.length<3||l.push({type:"mcp-server-suppressed-duplicate",source:e,plugin:s[1],serverName:s.slice(2).join(":"),duplicateOf:r})}const w=Object.assign({},S,n,u,c),y={};for(const[e,r]of Object.entries(w))isMcpServerAllowedByPolicy(e,r)&&(y[e]=r);return{servers:y,errors:l}}export async function getAllMcpConfigs(){if(doesEnterpriseMcpConfigExist())return getClaudeCodeMcpConfigs();const e=_(),{servers:r,errors:s}=await getClaudeCodeMcpConfigs({},e),{allowed:o}=filterMcpServersByPolicy(await e),{servers:t}=dedupClaudeAiMcpServers(o,r);return{servers:Object.assign({},t,r),errors:s}}export function parseMcpConfig(e){const{configObject:r,expandVars:s,scope:o,filePath:t}=e,n=W().safeParse(r);if(!n.success)return{config:null,errors:n.error.issues.map(e=>({...t&&{file:t},path:e.path.join("."),message:"Does not adhere to MCP server configuration schema",mcpErrorMetadata:{scope:o,severity:"fatal"}}))};const i=[],c={};for(const[e,r]of Object.entries(n.data.mcpServers)){let n=r;if(s){const{expanded:s,missingVars:c}=expandEnvVars(r);c.length>0&&i.push({...t&&{file:t},path:`mcpServers.${e}`,message:`Missing environment variables: ${c.join(", ")}`,suggestion:`Set the following environment variables: ${c.join(", ")}`,mcpErrorMetadata:{scope:o,serverName:e,severity:"warning"}}),n=s}"windows"!==d()||n.type&&"stdio"!==n.type||"npx"!==n.command&&!n.command.endsWith("\\npx")&&!n.command.endsWith("/npx")||i.push({...t&&{file:t},path:`mcpServers.${e}`,message:"Windows requires 'cmd /c' wrapper to execute npx",suggestion:'Change command to "cmd" with args ["/c", "npx", ...]',mcpErrorMetadata:{scope:o,serverName:e,severity:"warning"}}),c[e]=n}return{config:{mcpServers:c},errors:i}}export function parseMcpConfigFromFilePath(e){const{filePath:r,expandVars:s,scope:o}=e,t=P();let n;try{n=t.readFileSync(r,{encoding:"utf8"})}catch(e){return"ENOENT"===y(e)?{config:null,errors:[{file:r,path:"",message:`MCP config file not found: ${r}`,suggestion:"Check that the file path is correct",mcpErrorMetadata:{scope:o,severity:"fatal"}}]}:(C(`MCP config read error for ${r} (scope=${o}): ${e}`,{level:"error"}),{config:null,errors:[{file:r,path:"",message:`Failed to read file: ${e}`,suggestion:"Check file permissions and ensure the file exists",mcpErrorMetadata:{scope:o,severity:"fatal"}}]})}const i=j(n);return i?parseMcpConfig({configObject:i,expandVars:s,scope:o,filePath:r}):(C(`MCP config is not valid JSON: ${r} (scope=${o}, length=${n.length}, first100=${V(n.slice(0,100))})`,{level:"error"}),{config:null,errors:[{file:r,path:"",message:"MCP config is not a valid JSON",suggestion:"Fix the JSON syntax errors in the file",mcpErrorMetadata:{scope:o,severity:"fatal"}}]})}export const doesEnterpriseMcpConfigExist=p(()=>{const{config:e}=parseMcpConfigFromFilePath({filePath:getEnterpriseMcpFilePath(),expandVars:!0,scope:"enterprise"});return null!==e});export function shouldAllowManagedMcpServersOnly(){return!0===B("policySettings")?.allowManagedMcpServersOnly}export function areMcpConfigsAllowedWithEnterpriseMcpConfig(e){return Object.values(e).every(e=>"sdk"===e.type&&"claude-vscode"===e.name)}const z=e("CHICAGO_MCP")?s("../../utils/computerUse/common.js").COMPUTER_USE_MCP_SERVER_NAME:null;function isDefaultDisabledBuiltin(e){return null!==z&&e===z}export function isMcpServerDisabled(e){const r=g();if(isDefaultDisabledBuiltin(e)){return!(r.enabledMcpServers||[]).includes(e)}return(r.disabledMcpServers||[]).includes(e)}function toggleMembership(e,r,s){return e.includes(r)===s?e:s?[...e,r]:e.filter(e=>e!==r)}export function setMcpServerEnabled(e,r){const s=isDefaultDisabledBuiltin(e)&&isMcpServerDisabled(e)===r;S(s=>{if(isDefaultDisabledBuiltin(e)){const o=s.enabledMcpServers||[],t=toggleMembership(o,e,r);return t===o?s:{...s,enabledMcpServers:t}}const o=s.disabledMcpServers||[],t=toggleMembership(o,e,!r);return t===o?s:{...s,disabledMcpServers:t}}),s&&U("tengu_builtin_mcp_toggle",{serverName:e,enabled:r})}
|
package/dist/src/utils/auth.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MACRO as e}from"../recovery/bunBundleShim.js";import t from"chalk";import{exec as r}from"child_process";import{execa as n}from"execa";import{mkdir as o,stat as s}from"fs/promises";import i from"lodash-es/memoize.js";import{CLAUDE_AI_PROFILE_SCOPE as c}from"../constants/oauth.js";import{logEvent as a}from"../services/analytics/index.js";import{GEMINI_CLI_OAUTH_CLIENT_ID as u,GEMINI_CLI_OAUTH_CLIENT_SECRET as p,GEMINI_CLI_OAUTH_SCOPES as l,GEMINI_CLI_OAUTH_TOKEN_URL as A}from"../constants/geminiOAuth.js";import{getModelStrings as d}from"./model/modelStrings.js";import{getAPIProvider as h,isOpenAICompatibleProvider as f}from"./model/providers.js";import{getResolvedProviderProfileId as _,ensureProviderProfile as g,isDefaultProfileId as O,isProfiledProvider as T,resolveProviderProfile as E}from"./model/providerProfiles.js";import{getIsNonInteractiveSession as m,preferThirdPartyAuthentication as k}from"../bootstrap/state.js";import{getMockSubscriptionType as y,shouldUseMockSubscription as C}from"../services/mockRateLimits.js";import{isOAuthTokenExpired as v,refreshOpenAIOAuthToken as I,refreshOAuthToken as K,shouldUseClaudeAIAuth as P}from"../services/oauth/client.js";import{getOauthProfileFromOauthToken as S}from"../services/oauth/getOauthProfile.js";import{getApiKeyFromFileDescriptor as x,getOAuthTokenFromFileDescriptor as w}from"./authFileDescriptor.js";import{maybeRemoveApiKeyFromMacOSKeychainThrows as N,normalizeApiKeyForConfig as R}from"./authPortable.js";import{checkStsCallerIdentity as D,clearAwsIniCache as H,isValidAwsStsOutput as b}from"./aws.js";import{AwsAuthStatusManager as U}from"./awsAuthStatusManager.js";import{clearBetasCaches as L}from"./betas.js";import{checkHasTrustDialogAccepted as j,getGlobalConfig as G,saveGlobalConfig as F}from"./config.js";import{logAntError as M,logForDebugging as Y}from"./debug.js";import{getClaudeConfigHomeDir as $,isBareMode as B,isEnvTruthy as X,isRunningOnHomespace as z}from"./envUtils.js";import{errorMessage as W}from"./errors.js";import{execSyncWithDefaults_DEPRECATED as q}from"./execFileNoThrow.js";import*as V from"./lockfile.js";import{logError as J}from"./log.js";import{memoizeWithTTLAsync as Z}from"./memoize.js";import{getSecureStorage as Q}from"./secureStorage/index.js";import{clearLegacyApiKeyPrefetch as ee,getLegacyApiKeyPrefetchResult as te}from"./secureStorage/keychainPrefetch.js";import{clearKeychainCache as re,getMacOsKeychainStorageServiceName as ne,getUsername as oe}from"./secureStorage/macOsKeychainHelpers.js";import{getLegacyCredentialsFilePath as se,getSecureStorageDbPath as ie}from"./secureStorage/sqliteStorage.js";import{getSettings_DEPRECATED as ce,getSettingsForSource as ae}from"./settings/settings.js";import{sleep as ue}from"./sleep.js";import{jsonParse as pe}from"./slowOperations.js";import{clearToolSchemaCache as le}from"./toolSchemaCache.js";function isManagedOAuthContext(){return X(process.env.CONTEXT_CODE_REMOTE)||X(process.env.CLAUDE_CODE_REMOTE)||"claude-desktop"===process.env.CLAUDE_CODE_ENTRYPOINT}export function isAnthropicAuthEnabled(){if(B())return!1;if(process.env.ANTHROPIC_UNIX_SOCKET)return!(!process.env.CONTEXT_CODE_OAUTH_TOKEN&&!process.env.CLAUDE_CODE_OAUTH_TOKEN);const e=h(),t=X(process.env.CONTEXT_CODE_USE_BEDROCK)||X(process.env.CLAUDE_CODE_USE_BEDROCK)||X(process.env.CONTEXT_CODE_USE_VERTEX)||X(process.env.CLAUDE_CODE_USE_VERTEX)||X(process.env.CONTEXT_CODE_USE_FOUNDRY)||X(process.env.CLAUDE_CODE_USE_FOUNDRY)||f(e)||"custom-anthropic"===e,r=(ce()||{}).apiKeyHelper,n=process.env.ANTHROPIC_AUTH_TOKEN||r||process.env.CONTEXT_CODE_API_KEY_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR,{source:o}=getAnthropicApiKeyWithSource({skipRetrievingKeyFromApiKeyHelper:!0}),s="ANTHROPIC_API_KEY"===o||"apiKeyHelper"===o;return!(t||n&&!isManagedOAuthContext()||s&&!isManagedOAuthContext())}export function getAuthTokenSource(){const e=h();if(f(e))return{source:e,hasToken:Boolean(getOpenAICompatibleAccessToken(e))};if(B())return getConfiguredApiKeyHelper()?{source:"apiKeyHelper",hasToken:!0}:{source:"none",hasToken:!1};if(process.env.ANTHROPIC_AUTH_TOKEN&&!isManagedOAuthContext())return{source:"ANTHROPIC_AUTH_TOKEN",hasToken:!0};if(isManagedOAuthContext()&&(process.env.CONTEXT_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN))return{source:"CLAUDE_CODE_OAUTH_TOKEN",hasToken:!0};if(isManagedOAuthContext()?w():null)return process.env.CONTEXT_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR?{source:"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR",hasToken:!0}:{source:"CCR_OAUTH_TOKEN_FILE",hasToken:!0};if(getConfiguredApiKeyHelper()&&!isManagedOAuthContext())return{source:"apiKeyHelper",hasToken:!0};const t=getClaudeAIOAuthTokens();return P(t?.scopes)&&t?.accessToken?{source:"claude.ai",hasToken:!0}:{source:"none",hasToken:!1}}const Ae={gmi:"GMI_API_KEY",novita:"NOVITA_API_KEY",stepfun:"STEPFUN_API_KEY",huggingface:"HF_TOKEN","opencode-zen":"OPENCODE_ZEN_API_KEY",arcee:"ARCEEAI_API_KEY",alibaba:"DASHSCOPE_API_KEY",kimi:"KIMI_API_KEY"};function getProviderOauthStorageKey(e){return"claude"===e?"claudeAiOauth":"openAiOauth"}function shouldUseLegacyProviderOauthFallback(e){return"openai"===e}export function getStoredProviderOAuthTokens(e,t){try{const r=Q().read();if(t){const n=r?.providerProfileOauth?.[t];if(n?.accessToken)return n;if(!O(e,t)&&!shouldUseLegacyProviderOauthFallback(e))return null}if("gemini-google"===e)return null;if(!shouldUseLegacyProviderOauthFallback(e))return null;const n=r?.[getProviderOauthStorageKey(e)];return n?.accessToken?n:null}catch{return null}}export function hasStoredProviderOAuthTokens(e,t){if(t)return Boolean(getStoredProviderOAuthTokens(e,t));try{const t=Q().read(),r=Object.entries(t?.providerProfileOauth??{}).some(([t,r])=>t.startsWith(`${e}/`)&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim());return shouldUseLegacyProviderOauthFallback(e)?Boolean(r||t?.[getProviderOauthStorageKey(e)]?.accessToken):Boolean(r)}catch{return!1}}export async function renameProviderScopedCredentials(e,t){if(!e||!t||e===t)return;const r=Q(),n=r.read()||{},o={...n.providerProfileApiKeys??{}},s={...n.providerProfileOauth??{}};e in o&&(o[t]=o[e],delete o[e]),e in s&&(s[t]=s[e],delete s[e]);if(!r.update({...n,providerProfileApiKeys:o,providerProfileOauth:s}).success)throw new Error("No se pudieron mover las credenciales del perfil.")}export async function removeProviderScopedCredentials(e){if(!e)return;const t=Q(),r=t.read()||{},n={...r.providerProfileApiKeys??{}},o={...r.providerProfileOauth??{}};delete n[e],delete o[e];if(!t.update({...r,providerProfileApiKeys:n,providerProfileOauth:o}).success)throw new Error("No se pudieron eliminar las credenciales del perfil.")}export async function removeAllProviderScopedCredentials(){const e=Q(),t=e.read()||{};if(!e.update({...t,providerProfileApiKeys:{},providerProfileOauth:{}}).success)throw new Error("No se pudieron eliminar las credenciales scoped de perfiles.")}export function getAnthropicApiKey(){const{key:e}=getAnthropicApiKeyWithSource();return e}export function hasAnthropicApiKeyAuth(){const{key:e,source:t}=getAnthropicApiKeyWithSource({skipRetrievingKeyFromApiKeyHelper:!0});return null!==e&&"none"!==t}export function getAnthropicApiKeyWithSource(e={}){if(f(h()))return{key:null,source:"none"};if(B())return process.env.ANTHROPIC_API_KEY?{key:process.env.ANTHROPIC_API_KEY,source:"ANTHROPIC_API_KEY"}:getConfiguredApiKeyHelper()?{key:e.skipRetrievingKeyFromApiKeyHelper?null:getApiKeyFromApiKeyHelperCached(),source:"apiKeyHelper"}:{key:null,source:"none"};const t=z()?void 0:process.env.ANTHROPIC_API_KEY;if(k()&&t)return{key:t,source:"ANTHROPIC_API_KEY"};if(X(process.env.CI)||"test"===process.env.NODE_ENV){const e=x();if(e)return{key:e,source:"ANTHROPIC_API_KEY"};if(!(t||process.env.CONTEXT_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN||process.env.CONTEXT_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR))throw new Error("ANTHROPIC_API_KEY or CONTEXT_CODE_OAUTH_TOKEN (legacy: CLAUDE_CODE_OAUTH_TOKEN) env var is required");return t?{key:t,source:"ANTHROPIC_API_KEY"}:{key:null,source:"none"}}if(t&&G().customApiKeyResponses?.approved?.includes(R(t)))return{key:t,source:"ANTHROPIC_API_KEY"};const r=x();if(r)return{key:r,source:"ANTHROPIC_API_KEY"};if(getConfiguredApiKeyHelper())return e.skipRetrievingKeyFromApiKeyHelper?{key:null,source:"apiKeyHelper"}:{key:getApiKeyFromApiKeyHelperCached(),source:"apiKeyHelper"};const n=getApiKeyFromConfigOrMacOSKeychain();return n||{key:null,source:"none"}}export function getConfiguredApiKeyHelper(){if(B())return ae("flagSettings")?.apiKeyHelper;return(ce()||{}).apiKeyHelper}function isApiKeyHelperFromProjectOrLocalSettings(){const e=getConfiguredApiKeyHelper();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.apiKeyHelper===e||r?.apiKeyHelper===e}function getConfiguredAwsAuthRefresh(){return(ce()||{}).awsAuthRefresh}export function isAwsAuthRefreshFromProjectSettings(){const e=getConfiguredAwsAuthRefresh();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.awsAuthRefresh===e||r?.awsAuthRefresh===e}function getConfiguredAwsCredentialExport(){return(ce()||{}).awsCredentialExport}export function isAwsCredentialExportFromProjectSettings(){const e=getConfiguredAwsCredentialExport();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.awsCredentialExport===e||r?.awsCredentialExport===e}export function calculateApiKeyHelperTTL(){const e=process.env.CONTEXT_CODE_API_KEY_HELPER_TTL_MS??process.env.CLAUDE_CODE_API_KEY_HELPER_TTL_MS;if(e){const t=parseInt(e,10);if(!Number.isNaN(t)&&t>=0)return t;Y(`Found CLAUDE_CODE_API_KEY_HELPER_TTL_MS env var, but it was not a valid number. Got ${e}`,{level:"error"})}return 3e5}let de=null,he=null,fe=0;export function getApiKeyHelperElapsedMs(){const e=he?.startedAt;return e?Date.now()-e:0}export async function getApiKeyFromApiKeyHelper(e){if(!getConfiguredApiKeyHelper())return null;const t=calculateApiKeyHelperTTL();return de?(Date.now()-de.timestamp<t||he||(he={promise:_runAndCache(e,!1,fe),startedAt:null}),de.value):(he||(he={promise:_runAndCache(e,!0,fe),startedAt:Date.now()}),he.promise)}async function _runAndCache(r,o,s){try{const t=await async function(t){const r=getConfiguredApiKeyHelper();if(!r)return null;if(isApiKeyHelperFromProjectOrLocalSettings()){if(!j()&&!t){const t=new Error(`Security: apiKeyHelper executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("apiKeyHelper invoked before trust check",t),a("tengu_apiKeyHelper_missing_trust11",{}),null}}const o=await n(r,{shell:!0,timeout:6e5,reject:!1});if(o.failed){const e=o.timedOut?"timed out":`exited ${o.exitCode}`,t=o.stderr?.trim();throw new Error(t?`${e}: ${t}`:e)}const s=o.stdout?.trim();if(!s)throw new Error("did not return a value");return s}(r);return s!==fe||null!==t&&(de={value:t,timestamp:Date.now()}),t}catch(e){if(s!==fe)return" ";const r=e instanceof Error?e.message:String(e);return console.error(t.red(`apiKeyHelper failed: ${r}`)),Y(`Error getting API key from apiKeyHelper: ${r}`,{level:"error"}),!o&&de&&" "!==de.value?(de={...de,timestamp:Date.now()},de.value):(de={value:" ",timestamp:Date.now()}," ")}finally{s===fe&&(he=null)}}export function getApiKeyFromApiKeyHelperCached(){return de?.value??null}export function clearApiKeyHelperCache(){fe++,de=null,he=null}export function prefetchApiKeyFromApiKeyHelperIfSafe(e){isApiKeyHelperFromProjectOrLocalSettings()&&!j()||getApiKeyFromApiKeyHelper(e)}const _e=18e4;export function refreshAwsAuth(e){Y("Running AWS auth refresh command");const n=U.getInstance();return n.startAuthentication(),new Promise(o=>{const s=r(e,{timeout:_e});s.stdout.on("data",e=>{const t=e.toString().trim();t&&(n.addOutput(t),Y(t,{level:"debug"}))}),s.stderr.on("data",e=>{const t=e.toString().trim();t&&(n.setError(t),Y(t,{level:"error"}))}),s.on("close",(e,r)=>{if(0===e)Y("AWS auth refresh completed successfully"),n.endAuthentication(!0),o(!0);else{const e="SIGTERM"===r?t.red("AWS auth refresh timed out after 3 minutes. Run your auth command manually in a separate terminal."):t.red("Error running awsAuthRefresh (in settings or ~/.context.json):");console.error(e),n.endAuthentication(!1),o(!1)}})})}export const refreshAndGetAwsCredentials=Z(async()=>{const r=await async function(){const t=getConfiguredAwsAuthRefresh();if(!t)return!1;if(isAwsAuthRefreshFromProjectSettings()&&!j()&&!m()){const t=new Error(`Security: awsAuthRefresh executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("awsAuthRefresh invoked before trust check",t),a("tengu_awsAuthRefresh_missing_trust",{}),!1}try{return Y("Fetching AWS caller identity for AWS auth refresh command"),await D(),Y("Fetched AWS caller identity, skipping AWS auth refresh command"),!1}catch{return refreshAwsAuth(t)}}(),o=await async function(){const r=getConfiguredAwsCredentialExport();if(!r)return null;if(isAwsCredentialExportFromProjectSettings()&&!j()&&!m()){const t=new Error(`Security: awsCredentialExport executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("awsCredentialExport invoked before trust check",t),a("tengu_awsCredentialExport_missing_trust",{}),null}try{return Y("Fetching AWS caller identity for credential export command"),await D(),Y("Fetched AWS caller identity, skipping AWS credential export command"),null}catch{try{Y("Running AWS credential export command");const e=await n(r,{shell:!0,reject:!1});if(0!==e.exitCode||!e.stdout)throw new Error("awsCredentialExport did not return a valid value");const t=pe(e.stdout.trim());if(!b(t))throw new Error("awsCredentialExport did not return valid AWS STS output structure");return Y("AWS credentials retrieved from awsCredentialExport"),{accessKeyId:t.Credentials.AccessKeyId,secretAccessKey:t.Credentials.SecretAccessKey,sessionToken:t.Credentials.SessionToken}}catch(e){const r=t.red("Error getting AWS credentials from awsCredentialExport (in settings or ~/.context.json):");return e instanceof Error?console.error(r,e.message):console.error(r,e),null}}}();return(r||o)&&await H(),o},36e5);export function clearAwsCredentialsCache(){refreshAndGetAwsCredentials.cache.clear()}function getConfiguredGcpAuthRefresh(){return(ce()||{}).gcpAuthRefresh}export function isGcpAuthRefreshFromProjectSettings(){const e=getConfiguredGcpAuthRefresh();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.gcpAuthRefresh===e||r?.gcpAuthRefresh===e}const ge=l;export async function checkGcpCredentialsValid(){try{const{GoogleAuth:e}=await import("google-auth-library"),t=new e({scopes:["https://www.googleapis.com/auth/cloud-platform"]}),r=(async()=>{const e=await t.getClient();await e.getAccessToken()})(),n=ue(5e3).then(()=>{throw new GcpCredentialsTimeoutError("GCP credentials check timed out")});return await Promise.race([r,n]),!0}catch{return!1}}const Oe=18e4;export function refreshGcpAuth(e){Y("Running GCP auth refresh command");const n=U.getInstance();return n.startAuthentication(),new Promise(o=>{const s=r(e,{timeout:Oe});s.stdout.on("data",e=>{const t=e.toString().trim();t&&(n.addOutput(t),Y(t,{level:"debug"}))}),s.stderr.on("data",e=>{const t=e.toString().trim();t&&(n.setError(t),Y(t,{level:"error"}))}),s.on("close",(e,r)=>{if(0===e)Y("GCP auth refresh completed successfully"),n.endAuthentication(!0),o(!0);else{const e="SIGTERM"===r?t.red("GCP auth refresh timed out after 3 minutes. Run your auth command manually in a separate terminal."):t.red("Error running gcpAuthRefresh (in settings or ~/.context.json):");console.error(e),n.endAuthentication(!1),o(!1)}})})}export const refreshGcpCredentialsIfNeeded=Z(async()=>await async function(){const t=getConfiguredGcpAuthRefresh();if(!t)return!1;if(isGcpAuthRefreshFromProjectSettings()&&!j()&&!m()){const t=new Error(`Security: gcpAuthRefresh executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("gcpAuthRefresh invoked before trust check",t),a("tengu_gcpAuthRefresh_missing_trust",{}),!1}try{if(Y("Checking GCP credentials validity for auth refresh"),await checkGcpCredentialsValid())return Y("GCP credentials are valid, skipping auth refresh command"),!1}catch{}return refreshGcpAuth(t)}(),36e5);export function clearGcpCredentialsCache(){refreshGcpCredentialsIfNeeded.cache.clear()}export function prefetchGcpCredentialsIfSafe(){if(getConfiguredGcpAuthRefresh()){if(isGcpAuthRefreshFromProjectSettings()){if(!j()&&!m())return}refreshGcpCredentialsIfNeeded()}}export function prefetchAwsCredentialsAndBedRockInfoIfSafe(){const e=getConfiguredAwsAuthRefresh(),t=getConfiguredAwsCredentialExport();if(e||t){if(isAwsAuthRefreshFromProjectSettings()||isAwsCredentialExportFromProjectSettings()){if(!j()&&!m())return}refreshAndGetAwsCredentials(),d()}}export const getApiKeyFromConfigOrMacOSKeychain=i(()=>{if("darwin"===process.platform){const e=te();if(e){if(e.stdout)return{key:e.stdout,source:"/login managed key"}}else{const e=ne();try{const t=q(`security find-generic-password -a $USER -w -s "${e}"`);if(t)return{key:t,source:"/login managed key"}}catch(e){J(e)}}}const e=G();return e.primaryApiKey?{key:e.primaryApiKey,source:"/login managed key"}:null});function isValidApiKey(e){return/^[a-zA-Z0-9-_\.]+$/.test(e)}function getStoredProviderApiKey(e,t){try{const r=Q().read();if(t){const n=r?.providerProfileApiKeys?.[t];if("string"==typeof n&&n.trim())return n;if(!O(e,t))return null}return r?.providerApiKeys?.[e]??null}catch{return null}}export function hasStoredProviderApiKey(e,t){return Boolean(getStoredProviderApiKey(e,t))}export async function saveProviderApiKey(e,t){if(!isValidApiKey(t))throw new Error("Formato de clave API inválido. La clave API solo debe contener caracteres alfanuméricos, guiones, guiones bajos y puntos.");const r=Q(),n=r.read()||{},o=T(e)?E(e,{createIfMissing:!0})?.id??null:null;if(!r.update({...n,providerApiKeys:{...n.providerApiKeys??{},[e]:t},...o?{providerProfileApiKeys:{...n.providerProfileApiKeys??{},[o]:t}}:{}}).success)throw new Error(`Failed to save ${e} API key`)}export async function removeProviderApiKey(e){const t=Q(),r=t.read()||{},n={...r.providerApiKeys??{}};delete n[e];const o={...r.providerProfileApiKeys??{}};if(T(e)){const t=_(e);t&&delete o[t]}if(!t.update({...r,providerApiKeys:n,providerProfileApiKeys:o}).success)throw new Error(`Failed to remove ${e} API key`)}export async function saveApiKey(e){if(!isValidApiKey(e))throw new Error("Formato de clave API inválido. La clave API solo debe contener caracteres alfanuméricos, guiones, guiones bajos y puntos.");await maybeRemoveApiKeyFromMacOSKeychain();let t=!1;if("darwin"===process.platform)try{const r=ne(),o=oe(),s=`add-generic-password -U -a "${o}" -s "${r}" -X "${Buffer.from(e,"utf-8").toString("hex")}"\n`;await n("security",["-i"],{input:s,reject:!1}),a("tengu_api_key_saved_to_keychain",{}),t=!0}catch(e){J(e),a("tengu_api_key_keychain_error",{error:W(e)}),a("tengu_api_key_saved_to_config",{})}else a("tengu_api_key_saved_to_config",{});const r=R(e);F(n=>{const o=n.customApiKeyResponses?.approved??[];return{...n,primaryApiKey:t?n.primaryApiKey:e,customApiKeyResponses:{...n.customApiKeyResponses,approved:o.includes(r)?o:[...o,r],rejected:n.customApiKeyResponses?.rejected??[]}}}),getApiKeyFromConfigOrMacOSKeychain.cache.clear?.(),ee()}export function isCustomApiKeyApproved(e){const t=G(),r=R(e);return t.customApiKeyResponses?.approved?.includes(r)??!1}export async function removeApiKey(){await maybeRemoveApiKeyFromMacOSKeychain(),F(e=>({...e,primaryApiKey:void 0})),getApiKeyFromConfigOrMacOSKeychain.cache.clear?.(),ee()}async function maybeRemoveApiKeyFromMacOSKeychain(){try{await N()}catch(e){J(e)}}export function saveOAuthTokensIfNeeded(e,t){if(!P(e.scopes))return a("tengu_oauth_tokens_not_claude_ai",{}),{success:!0};if(!e.refreshToken||!e.expiresAt)return a("tengu_oauth_tokens_inference_only",{}),{success:!0};const r=Q(),n=r.name;try{const o=r.read()||{},s=o.claudeAiOauth,i=t??_("claude"),c={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:e.subscriptionType??s?.subscriptionType??null,rateLimitTier:e.rateLimitTier??s?.rateLimitTier??null};i&&(o.providerProfileOauth={...o.providerProfileOauth??{},[i]:c});const u=r.update(o);return u.success?a("tengu_oauth_tokens_saved",{storageBackend:n}):a("tengu_oauth_tokens_save_failed",{storageBackend:n}),getClaudeAIOAuthTokens.cache?.clear?.(),L(),le(),u}catch(e){return J(e),a("tengu_oauth_tokens_save_exception",{storageBackend:n,error:W(e)}),{success:!1,warning:"Failed to save OAuth tokens"}}}export function saveOpenAIOAuthTokens(e,t){const r=Q(),n=r.name;try{const o=r.read()||{},s=t??_("openai"),i={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:e.subscriptionType??null,rateLimitTier:e.rateLimitTier??null};o.openAiOauth=i,s&&(o.providerProfileOauth={...o.providerProfileOauth??{},[s]:i});const c=r.update(o);return c.success?a("tengu_openai_oauth_tokens_saved",{storageBackend:n}):a("tengu_openai_oauth_tokens_save_failed",{storageBackend:n}),getOpenAIOAuthTokens.cache?.clear?.(),L(),le(),c}catch(e){return J(e),a("tengu_openai_oauth_tokens_save_exception",{storageBackend:n,error:W(e)}),{success:!1,warning:"Failed to save OpenAI OAuth tokens"}}}export function getClaudeAIOAuthTokens(){if(B())return null;const e=process.env.CONTEXT_CODE_OAUTH_TOKEN??process.env.CLAUDE_CODE_OAUTH_TOKEN;if(isManagedOAuthContext()&&e)return{accessToken:e,refreshToken:null,expiresAt:null,scopes:["user:inference"],subscriptionType:null,rateLimitTier:null};const t=isManagedOAuthContext()?w():null;if(t)return{accessToken:t,refreshToken:null,expiresAt:null,scopes:["user:inference"],subscriptionType:null,rateLimitTier:null};try{const e=getStoredProviderOAuthTokens("claude",_("claude"));return e?.accessToken?e:null}catch(e){return J(e),null}}export function getOpenAIOAuthTokens(){if(B())return null;if(process.env.OPENAI_OAUTH_TOKEN)return{accessToken:process.env.OPENAI_OAUTH_TOKEN,refreshToken:null,expiresAt:null,scopes:["responses:inference"],subscriptionType:null,rateLimitTier:null};try{const e=getStoredProviderOAuthTokens("openai",_("openai"));return e?.accessToken?e:null}catch(e){return J(e),null}}export function getOpenAIAccessToken(){return process.env.OPENAI_API_KEY||process.env.OPENAI_API_TOKEN||getStoredProviderApiKey("openai",_("openai"))||getOpenAIOAuthTokens()?.accessToken||null}export function getOpenRouterAccessToken(){return process.env.OPENROUTER_API_KEY||process.env.OPENROUTER_API_TOKEN||getStoredProviderApiKey("openrouter",_("openrouter"))||null}export async function checkGeminiGoogleCredentialsValid(){try{const e=await getGeminiGoogleAuthHeaders(),t=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim()||void 0,r=fetch("https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist",{method:"POST",headers:e,body:JSON.stringify({cloudaicompanionProject:t,metadata:{ideType:"IDE_UNSPECIFIED",platform:"PLATFORM_UNSPECIFIED",pluginType:"GEMINI",duetProject:t},mode:"HEALTH_CHECK"})}).then(e=>{if(!e.ok)throw new Error(`Gemini credentials check failed: ${e.status}`)}),n=ue(5e3).then(()=>{throw new GcpCredentialsTimeoutError("Gemini credentials check timed out")});return await Promise.race([r,n]),!0}catch{return!1}}export function getGeminiGoogleOAuthTokens(){try{const e=_("gemini-google"),t=Q().read(),r=e?t?.providerProfileOauth?.[e]:null;if(r?.accessToken)return r;const n=Object.entries(t?.providerProfileOauth??{}).find(([e,t])=>e.startsWith("gemini-google/")&&"object"==typeof t&&null!==t&&"string"==typeof t.accessToken&&t.accessToken.trim())?.[1];return n?.accessToken?n:null}catch{return null}}export function saveGeminiGoogleOAuthTokens(e){const t=Q(),r=t.name;try{const n=t.read()||{},o=_("gemini-google")??g("gemini-google").id,s={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:null,rateLimitTier:null,projectId:e.projectId};o&&(n.providerProfileOauth={...n.providerProfileOauth??{},[o]:s});const i=t.update(n);return a(i.success?"tengu_gemini_google_oauth_tokens_saved":"tengu_gemini_google_oauth_tokens_save_failed",{storageBackend:r}),i}catch(e){return J(e),a("tengu_gemini_google_oauth_tokens_save_exception",{storageBackend:r,error:W(e)}),{success:!1,warning:"Failed to save Gemini OAuth tokens"}}}export function getCopilotOAuthTokens(){try{const e=_("copilot"),t=Q().read(),r=e?t?.providerProfileOauth?.[e]:null;if(r?.githubToken||r?.accessToken)return r;const n=Object.entries(t?.providerProfileOauth??{}).find(([e,t])=>e.startsWith("copilot/")&&"object"==typeof t&&null!==t&&("string"==typeof t.githubToken||"string"==typeof t.accessToken))?.[1];return n?.githubToken||n?.accessToken?n:null}catch{return null}}export function saveCopilotOAuthTokens(e){const t=Q(),r=t.name;try{const n=t.read()||{},o=_("copilot")??g("copilot").id,s={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:null,rateLimitTier:null,githubToken:e.githubToken};o&&(n.providerProfileOauth={...n.providerProfileOauth??{},[o]:s});const i=t.update(n);return a(i.success?"tengu_copilot_oauth_tokens_saved":"tengu_copilot_oauth_tokens_save_failed",{storageBackend:r}),i}catch(e){return J(e),a("tengu_copilot_oauth_tokens_save_exception",{storageBackend:r,error:W(e)}),{success:!1,warning:"Failed to save Copilot OAuth tokens"}}}export async function checkAndRefreshCopilotTokenIfNeeded(){const e=getCopilotOAuthTokens();if(!e)return null;const t=e.githubToken||e.accessToken;if(!t)return e;if(e.accessToken&&e.accessToken!==e.githubToken&&e.expiresAt&&e.expiresAt>Date.now()+6e4)return e;try{const r=await fetch("https://api.github.com/copilot_internal/v2/token",{method:"GET",headers:{Authorization:`token ${t}`,"User-Agent":"ContextCode/1.0",Accept:"application/json"}});if(!r.ok)return e;const n=await r.json(),o=n.expires_at?1e3*n.expires_at:Date.now()+15e5,s={...e,accessToken:n.token,githubToken:t,expiresAt:o};return saveCopilotOAuthTokens(s),s}catch{return e}}export function getCopilotAccessToken(){const e=process.env.GITHUB_COPILOT_TOKEN||process.env.COPILOT_OAUTH_TOKEN;if(e)return e;const t=getCopilotOAuthTokens();return t?.accessToken||t?.githubToken||null}function quoteShellArg(e){return`"${e.replace(/"/g,'\\"')}"`}export function getGeminiGoogleAuthCommand(){const e=process.env.GEMINI_OAUTH_CLIENT_SECRET_FILE||process.env.GOOGLE_OAUTH_CLIENT_SECRET_FILE,t=ge.join(",");return`gcloud auth application-default login${e?` --client-id-file=${quoteShellArg(e)}`:""} --scopes=${quoteShellArg(t)}`}export async function refreshGeminiGoogleAuth(){return refreshGcpAuth(getGeminiGoogleAuthCommand())}export function getGeminiApiAccessToken(){return process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY||getStoredProviderApiKey("gemini-api",_("gemini-api"))||null}export async function getGeminiGoogleAuthHeaders(){const e=process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN,t={"Content-Type":"application/json"};if(e)t.Authorization=`Bearer ${e}`;else{const e=await async function(){const e=getGeminiGoogleOAuthTokens();if(!e?.refreshToken)return e;if(e.expiresAt&&e.expiresAt>Date.now()+6e4)return e;const t=await fetch(A,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:u,client_secret:p})});if(!t.ok)return e;const r=await t.json(),n={...e,accessToken:r.access_token,expiresAt:r.expires_in?Date.now()+1e3*r.expires_in:e.expiresAt,scopes:r.scope?.split(/\s+/).filter(Boolean)??e.scopes};return saveGeminiGoogleOAuthTokens(n),n}();if(e?.accessToken){t.Authorization=`Bearer ${e.accessToken}`;const r=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim();r&&(t["x-goog-user-project"]=r)}else{const{GoogleAuth:e}=await import("google-auth-library"),r=new e({scopes:ge}),n=await r.getClient(),o=await n.getRequestHeaders();if("function"==typeof o.forEach)o.forEach((e,r)=>{t[r]=e});else for(const[e,r]of Object.entries(o))Array.isArray(r)?t[e]=r.map(String).join(", "):null!=r&&(t[e]=String(r))}}const r=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim()||void 0;return r&&(t["x-goog-user-project"]=r),t}export function getZAIAccessToken(){return process.env.ZAI_API_KEY||getStoredProviderApiKey("zai",_("zai"))||null}export function getMiniMaxAccessToken(){return process.env.MINIMAX_API_KEY||getStoredProviderApiKey("minimax",_("minimax"))||null}export function getNvidiaAccessToken(){return process.env.NVIDIA_API_KEY||getStoredProviderApiKey("nvidia",_("nvidia"))||null}export function getDeepSeekAccessToken(){return process.env.DEEPSEEK_API_KEY||getStoredProviderApiKey("deepseek",_("deepseek"))||null}export function getXaiAccessToken(){return process.env.XAI_API_KEY||getStoredProviderApiKey("xai",_("xai"))||null}export function getOllamaAccessToken(){return"ollama"}export function getOllamaCloudAccessToken(){return process.env.OLLAMA_API_KEY||getStoredProviderApiKey("ollama-cloud",_("ollama-cloud"))||null}export function getOpenAICompatibleAccessToken(e=h()){switch(e){case"openrouter":return getOpenRouterAccessToken();case"gemini-api":return getGeminiApiAccessToken();case"gemini-google":return process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN||null;case"zai":return getZAIAccessToken();case"minimax":return getMiniMaxAccessToken();case"nvidia":return getNvidiaAccessToken();case"deepseek":return getDeepSeekAccessToken();case"xai":return getXaiAccessToken();case"copilot":return getCopilotAccessToken();case"gmi":case"novita":case"stepfun":case"huggingface":case"opencode-zen":case"arcee":case"alibaba":case"kimi":{const t=Ae[e];return(t?process.env[t]:void 0)||getStoredProviderApiKey(e,_(e))||null}case"ollama":return getOllamaAccessToken();case"ollama-cloud":return getOllamaCloudAccessToken();case"custom-openai":return process.env.CUSTOM_OPENAI_API_KEY||getStoredProviderApiKey("custom-openai",_("custom-openai"))||null;case"custom-anthropic":return process.env.CUSTOM_ANTHROPIC_API_KEY||getStoredProviderApiKey("custom-anthropic",_("custom-anthropic"))||null;default:return getOpenAIAccessToken()}}export async function getOpenAIOAuthTokensAsync(){if(B())return null;if(process.env.OPENAI_OAUTH_TOKEN)return getOpenAIOAuthTokens();try{const e=Q(),t=await e.readAsync(),r=_("openai"),n=r&&t?.providerProfileOauth?.[r]||(r&&!O("openai",r)?null:t?.openAiOauth);return n?.accessToken?n:null}catch(e){return J(e),null}}export function clearOAuthTokenCache(){getClaudeAIOAuthTokens.cache?.clear?.(),getOpenAIOAuthTokens.cache?.clear?.(),re()}let Te=0;async function invalidateOAuthCacheIfDiskChanged(){try{const e="sqlite"===Q().name?ie():se(),{mtimeMs:t}=await s(e);t!==Te&&(Te=t,clearOAuthTokenCache())}catch{getClaudeAIOAuthTokens.cache?.clear?.(),getOpenAIOAuthTokens.cache?.clear?.()}}const Ee=new Map;export function handleOAuth401Error(e){const t=Ee.get(e);if(t)return t;const r=async function(e){clearOAuthTokenCache();const t=await getClaudeAIOAuthTokensAsync();if(!t?.refreshToken)return!1;if(t.accessToken!==e)return a("tengu_oauth_401_recovered_from_keychain",{}),!0;return checkAndRefreshOAuthTokenIfNeeded(0,!0)}(e).finally(()=>{Ee.delete(e)});return Ee.set(e,r),r}export async function handleOpenAIOAuth401Error(e){clearOAuthTokenCache();const t=await getOpenAIOAuthTokensAsync();return!!t?.refreshToken&&(t.accessToken!==e?(a("tengu_openai_oauth_401_recovered_from_keychain",{}),!0):checkAndRefreshOpenAIOAuthTokenIfNeeded(0,!0))}export async function getClaudeAIOAuthTokensAsync(){if(B())return null;if(isManagedOAuthContext()&&(process.env.CONTEXT_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN||w()))return getClaudeAIOAuthTokens();try{const e=Q(),t=await e.readAsync(),r=_("claude"),n=r&&t?.providerProfileOauth?.[r]||(r&&!O("claude",r)?null:t?.claudeAiOauth);return n?.accessToken?n:null}catch(e){return J(e),null}}let me=null,ke=null;export function checkAndRefreshOAuthTokenIfNeeded(e=0,t=!1){if(0===e&&!t){if(me)return me;const r=checkAndRefreshOAuthTokenIfNeededImpl(e,t);return me=r.finally(()=>{me=null}),me}return checkAndRefreshOAuthTokenIfNeededImpl(e,t)}export function checkAndRefreshOpenAIOAuthTokenIfNeeded(e=0,t=!1){if(0===e&&!t){if(ke)return ke;const r=checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e,t);return ke=r.finally(()=>{ke=null}),ke}return checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e,t)}async function checkAndRefreshOAuthTokenIfNeededImpl(e,t){await invalidateOAuthCacheIfDiskChanged();const r=getClaudeAIOAuthTokens();if(!(t||r?.refreshToken&&v(r.expiresAt)))return!1;if(!r?.refreshToken)return!1;if(!P(r.scopes))return!1;getClaudeAIOAuthTokens.cache?.clear?.(),re();const n=await getClaudeAIOAuthTokensAsync();if(!n?.refreshToken||!v(n.expiresAt))return!1;const s=$();let i;await o(s,{recursive:!0});try{a("tengu_oauth_token_refresh_lock_acquiring",{}),i=await V.lock(s),a("tengu_oauth_token_refresh_lock_acquired",{})}catch(r){return"ELOCKED"===r.code?e<5?(a("tengu_oauth_token_refresh_lock_retry",{retryCount:e+1}),await ue(1e3+1e3*Math.random()),checkAndRefreshOAuthTokenIfNeededImpl(e+1,t)):(a("tengu_oauth_token_refresh_lock_retry_limit_reached",{maxRetries:5}),!1):(J(r),a("tengu_oauth_token_refresh_lock_error",{error:W(r)}),!1)}try{getClaudeAIOAuthTokens.cache?.clear?.(),re();const e=await getClaudeAIOAuthTokensAsync();if(!e?.refreshToken||!v(e.expiresAt))return a("tengu_oauth_token_refresh_race_resolved",{}),!1;a("tengu_oauth_token_refresh_starting",{});return saveOAuthTokensIfNeeded(await K(e.refreshToken,{scopes:P(e.scopes)?void 0:e.scopes})),getClaudeAIOAuthTokens.cache?.clear?.(),re(),!0}catch(e){J(e),getClaudeAIOAuthTokens.cache?.clear?.(),re();const t=await getClaudeAIOAuthTokensAsync();return!(!t||v(t.expiresAt))&&(a("tengu_oauth_token_refresh_race_recovered",{}),!0)}finally{a("tengu_oauth_token_refresh_lock_releasing",{}),await i(),a("tengu_oauth_token_refresh_lock_released",{})}}async function checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e,t){await invalidateOAuthCacheIfDiskChanged();const r=getOpenAIOAuthTokens();if(!(t||r?.refreshToken&&v(r.expiresAt)))return!1;if(!r?.refreshToken)return!1;getOpenAIOAuthTokens.cache?.clear?.(),re();const n=await getOpenAIOAuthTokensAsync();if(!n?.refreshToken||!v(n.expiresAt))return!1;const s=$();let i;await o(s,{recursive:!0});try{a("tengu_openai_oauth_token_refresh_lock_acquiring",{}),i=await V.lock(s),a("tengu_openai_oauth_token_refresh_lock_acquired",{})}catch(r){return"ELOCKED"===r.code?e<5?(a("tengu_openai_oauth_token_refresh_lock_retry",{retryCount:e+1}),await ue(1e3+1e3*Math.random()),checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e+1,t)):(a("tengu_openai_oauth_token_refresh_lock_retry_limit_reached",{maxRetries:5}),!1):(J(r),!1)}try{getOpenAIOAuthTokens.cache?.clear?.(),re();const e=await getOpenAIOAuthTokensAsync();if(!e?.refreshToken||!v(e.expiresAt))return a("tengu_openai_oauth_token_refresh_race_resolved",{}),!1;a("tengu_openai_oauth_token_refresh_starting",{});return saveOpenAIOAuthTokens(await I(e.refreshToken,{scopes:e.scopes})),getOpenAIOAuthTokens.cache?.clear?.(),re(),!0}catch(e){J(e),getOpenAIOAuthTokens.cache?.clear?.(),re();const t=await getOpenAIOAuthTokensAsync();return!(!t||v(t.expiresAt))&&(a("tengu_openai_oauth_token_refresh_race_recovered",{}),!0)}finally{a("tengu_openai_oauth_token_refresh_lock_releasing",{}),await i(),a("tengu_openai_oauth_token_refresh_lock_released",{})}}export function isClaudeAISubscriber(){return!!isAnthropicAuthEnabled()&&P(getClaudeAIOAuthTokens()?.scopes)}export function hasProfileScope(){return getClaudeAIOAuthTokens()?.scopes?.includes(c)??!1}export function is1PApiCustomer(){return!(X(process.env.CONTEXT_CODE_USE_BEDROCK)||X(process.env.CLAUDE_CODE_USE_BEDROCK)||X(process.env.CONTEXT_CODE_USE_VERTEX)||X(process.env.CLAUDE_CODE_USE_VERTEX)||X(process.env.CONTEXT_CODE_USE_FOUNDRY)||X(process.env.CLAUDE_CODE_USE_FOUNDRY)||f(h()))&&!isClaudeAISubscriber()}export function getOauthAccountInfo(){return isAnthropicAuthEnabled()?G().oauthAccount:void 0}export function isOverageProvisioningAllowed(){const e=getOauthAccountInfo(),t=e?.billingType;return!(!isClaudeAISubscriber()||!t)&&("stripe_subscription"===t||"stripe_subscription_contracted"===t||"apple_subscription"===t||"google_play_subscription"===t)}export function hasOpusAccess(){const e=getSubscriptionType();return"max"===e||"enterprise"===e||"team"===e||"pro"===e||null===e}export function getSubscriptionType(){if(C())return y();if(!isAnthropicAuthEnabled())return null;const e=getClaudeAIOAuthTokens();return e?e.subscriptionType??null:null}export function isMaxSubscriber(){return"max"===getSubscriptionType()}export function isTeamSubscriber(){return"team"===getSubscriptionType()}export function isTeamPremiumSubscriber(){return"team"===getSubscriptionType()&&"default_claude_max_5x"===getRateLimitTier()}export function isEnterpriseSubscriber(){return"enterprise"===getSubscriptionType()}export function isProSubscriber(){return"pro"===getSubscriptionType()}export function getRateLimitTier(){if(!isAnthropicAuthEnabled())return null;const e=getClaudeAIOAuthTokens();return e?e.rateLimitTier??null:null}export function getSubscriptionName(){switch(getSubscriptionType()){case"enterprise":return"Context Empresarial";case"team":return"Context Equipo";case"max":return"Context Max";case"pro":return"Context Pro";default:return"Context API"}}export function isUsing3PServices(){return!!(X(process.env.CONTEXT_CODE_USE_BEDROCK)||X(process.env.CLAUDE_CODE_USE_BEDROCK)||X(process.env.CONTEXT_CODE_USE_VERTEX)||X(process.env.CLAUDE_CODE_USE_VERTEX)||X(process.env.CONTEXT_CODE_USE_FOUNDRY)||X(process.env.CLAUDE_CODE_USE_FOUNDRY)||f(h()))}function getConfiguredOtelHeadersHelper(){return(ce()||{}).otelHeadersHelper}export function isOtelHeadersHelperFromProjectOrLocalSettings(){const e=getConfiguredOtelHeadersHelper();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.otelHeadersHelper===e||r?.otelHeadersHelper===e}let ye=null,Ce=0;const ve=174e4;export function getOtelHeadersFromHelper(){const e=getConfiguredOtelHeadersHelper();if(!e)return{};const t=parseInt(process.env.CONTEXT_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS||process.env.CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS||ve.toString());if(ye&&Date.now()-Ce<t)return ye;if(isOtelHeadersHelperFromProjectOrLocalSettings()){if(!j())return{}}try{const t=q(e,{timeout:3e4})?.toString().trim();if(!t)throw new Error("otelHeadersHelper did not return a valid value");const r=pe(t);if("object"!=typeof r||null===r||Array.isArray(r))throw new Error("otelHeadersHelper must return a JSON object with string key-value pairs");for(const[e,t]of Object.entries(r))if("string"!=typeof t)throw new Error(`otelHeadersHelper returned non-string value for key "${e}": ${typeof t}`);return ye=r,Ce=Date.now(),ye}catch(e){throw J(new Error(`Error getting OpenTelemetry headers from otelHeadersHelper (in settings): ${W(e)}`)),e}}export function isConsumerSubscriber(){const e=getSubscriptionType();return isClaudeAISubscriber()&&null!==e&&("max"===(t=e)||"pro"===t);var t}export function getAccountInformation(){if("firstParty"!==h())return;const{source:e}=getAuthTokenSource(),t={};"CLAUDE_CODE_OAUTH_TOKEN"===e||"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR"===e?t.tokenSource=e:isClaudeAISubscriber()?t.subscription=getSubscriptionName():t.tokenSource=e;const{key:r,source:n}=getAnthropicApiKeyWithSource();if(r&&(t.apiKeySource=n),"claude.ai"===e||"/login managed key"===n){const e=getOauthAccountInfo()?.organizationName;e&&(t.organization=e)}const o=getOauthAccountInfo()?.emailAddress;return"claude.ai"!==e&&"/login managed key"!==n||!o||(t.email=o),t}export async function validateForceLoginOrg(){if(process.env.ANTHROPIC_UNIX_SOCKET)return{valid:!0};if(!isAnthropicAuthEnabled())return{valid:!0};const e=ae("policySettings")?.forceLoginOrgUUID;if(!e)return{valid:!0};await checkAndRefreshOAuthTokenIfNeeded();const t=getClaudeAIOAuthTokens();if(!t)return{valid:!0};const{source:r}=getAuthTokenSource(),n="CLAUDE_CODE_OAUTH_TOKEN"===r||"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR"===r,o=await S(t.accessToken);if(!o)return{valid:!1,message:`Unable to verify organization for the current authentication token.\nThis machine requires organization ${e} but the profile could not be fetched.\nThis may be a network error, or the token may lack the user:profile scope required for\nverification (tokens from 'context setup-token' do not include this scope).\nTry again, or obtain a full-scope token via 'context auth login'.`};const s=o.organization.uuid;if(s===e)return{valid:!0};if(n){return{valid:!1,message:`The ${"CLAUDE_CODE_OAUTH_TOKEN"===r?"CLAUDE_CODE_OAUTH_TOKEN":"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR"} environment variable provides a token for a\ndifferent organization than required by this machine's managed settings.\n\nRequired organization: ${e}\nToken organization: ${s}\n\nRemove the environment variable or obtain a token for the correct organization.`}}return{valid:!1,message:`Your authentication token belongs to organization ${s},\nbut this machine requires organization ${e}.\n\nPlease log in with the correct organization: context auth login`}}class GcpCredentialsTimeoutError extends Error{}
|
|
1
|
+
import{MACRO as e}from"../recovery/bunBundleShim.js";import t from"chalk";import{exec as r}from"child_process";import{execa as n}from"execa";import{mkdir as o,stat as s}from"fs/promises";import i from"lodash-es/memoize.js";import{CLAUDE_AI_PROFILE_SCOPE as c}from"../constants/oauth.js";import{logEvent as a}from"../services/analytics/index.js";import{GEMINI_CLI_OAUTH_CLIENT_ID as u,GEMINI_CLI_OAUTH_CLIENT_SECRET as p,GEMINI_CLI_OAUTH_SCOPES as l,GEMINI_CLI_OAUTH_TOKEN_URL as A}from"../constants/geminiOAuth.js";import{getModelStrings as d}from"./model/modelStrings.js";import{getAPIProvider as h,isOpenAICompatibleProvider as f}from"./model/providers.js";import{getResolvedProviderProfileId as _,ensureProviderProfile as g,isDefaultProfileId as O,isProfiledProvider as T,resolveProviderProfile as E}from"./model/providerProfiles.js";import{getIsNonInteractiveSession as m,preferThirdPartyAuthentication as k}from"../bootstrap/state.js";import{getMockSubscriptionType as y,shouldUseMockSubscription as C}from"../services/mockRateLimits.js";import{isOAuthTokenExpired as v,refreshOpenAIOAuthToken as I,refreshOAuthToken as K,shouldUseClaudeAIAuth as P}from"../services/oauth/client.js";import{getOauthProfileFromOauthToken as S}from"../services/oauth/getOauthProfile.js";import{getApiKeyFromFileDescriptor as x,getOAuthTokenFromFileDescriptor as w}from"./authFileDescriptor.js";import{maybeRemoveApiKeyFromMacOSKeychainThrows as N,normalizeApiKeyForConfig as R}from"./authPortable.js";import{checkStsCallerIdentity as D,clearAwsIniCache as H,isValidAwsStsOutput as b}from"./aws.js";import{AwsAuthStatusManager as U}from"./awsAuthStatusManager.js";import{clearBetasCaches as L}from"./betas.js";import{checkHasTrustDialogAccepted as j,getGlobalConfig as G,saveGlobalConfig as F}from"./config.js";import{logAntError as M,logForDebugging as Y}from"./debug.js";import{getClaudeConfigHomeDir as $,isBareMode as B,isEnvTruthy as X,isRunningOnHomespace as z}from"./envUtils.js";import{errorMessage as W}from"./errors.js";import{execSyncWithDefaults_DEPRECATED as q}from"./execFileNoThrow.js";import*as V from"./lockfile.js";import{logError as J}from"./log.js";import{memoizeWithTTLAsync as Z}from"./memoize.js";import{getSecureStorage as Q}from"./secureStorage/index.js";import{clearLegacyApiKeyPrefetch as ee,getLegacyApiKeyPrefetchResult as te}from"./secureStorage/keychainPrefetch.js";import{clearKeychainCache as re,getMacOsKeychainStorageServiceName as ne,getUsername as oe}from"./secureStorage/macOsKeychainHelpers.js";import{getLegacyCredentialsFilePath as se,getSecureStorageDbPath as ie}from"./secureStorage/sqliteStorage.js";import{getSettings_DEPRECATED as ce,getSettingsForSource as ae}from"./settings/settings.js";import{sleep as ue}from"./sleep.js";import{jsonParse as pe}from"./slowOperations.js";import{clearToolSchemaCache as le}from"./toolSchemaCache.js";function isManagedOAuthContext(){return X(process.env.CONTEXT_CODE_REMOTE)||X(process.env.CLAUDE_CODE_REMOTE)||"claude-desktop"===process.env.CLAUDE_CODE_ENTRYPOINT}export function isAnthropicAuthEnabled(){if(B())return!1;if(process.env.ANTHROPIC_UNIX_SOCKET)return!(!process.env.CONTEXT_CODE_OAUTH_TOKEN&&!process.env.CLAUDE_CODE_OAUTH_TOKEN);const e=h(),t=X(process.env.CONTEXT_CODE_USE_BEDROCK)||X(process.env.CLAUDE_CODE_USE_BEDROCK)||X(process.env.CONTEXT_CODE_USE_VERTEX)||X(process.env.CLAUDE_CODE_USE_VERTEX)||X(process.env.CONTEXT_CODE_USE_FOUNDRY)||X(process.env.CLAUDE_CODE_USE_FOUNDRY)||f(e)||"custom-anthropic"===e,r=(ce()||{}).apiKeyHelper,n=process.env.ANTHROPIC_AUTH_TOKEN||r||process.env.CONTEXT_CODE_API_KEY_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_API_KEY_FILE_DESCRIPTOR,{source:o}=getAnthropicApiKeyWithSource({skipRetrievingKeyFromApiKeyHelper:!0}),s="ANTHROPIC_API_KEY"===o||"apiKeyHelper"===o;return!(t||n&&!isManagedOAuthContext()||s&&!isManagedOAuthContext())}export function getAuthTokenSource(){const e=h();if(f(e))return{source:e,hasToken:Boolean(getOpenAICompatibleAccessToken(e))};if(B())return getConfiguredApiKeyHelper()?{source:"apiKeyHelper",hasToken:!0}:{source:"none",hasToken:!1};if(process.env.ANTHROPIC_AUTH_TOKEN&&!isManagedOAuthContext())return{source:"ANTHROPIC_AUTH_TOKEN",hasToken:!0};if(isManagedOAuthContext()&&(process.env.CONTEXT_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN))return{source:"CLAUDE_CODE_OAUTH_TOKEN",hasToken:!0};if(isManagedOAuthContext()?w():null)return process.env.CONTEXT_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR?{source:"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR",hasToken:!0}:{source:"CCR_OAUTH_TOKEN_FILE",hasToken:!0};if(getConfiguredApiKeyHelper()&&!isManagedOAuthContext())return{source:"apiKeyHelper",hasToken:!0};const t=getClaudeAIOAuthTokens();return P(t?.scopes)&&t?.accessToken?{source:"claude.ai",hasToken:!0}:{source:"none",hasToken:!1}}const Ae={gmi:"GMI_API_KEY",novita:"NOVITA_API_KEY",stepfun:"STEPFUN_API_KEY",huggingface:"HF_TOKEN","opencode-zen":"OPENCODE_ZEN_API_KEY",arcee:"ARCEEAI_API_KEY",alibaba:"DASHSCOPE_API_KEY",kimi:"KIMI_API_KEY"};function getProviderOauthStorageKey(e){return"claude"===e?"claudeAiOauth":"openAiOauth"}function shouldUseLegacyProviderOauthFallback(e){return"openai"===e}export function getStoredProviderOAuthTokens(e,t){try{const r=Q().read();if(t){const n=r?.providerProfileOauth?.[t];if(n?.accessToken)return n;if(!O(e,t)&&!shouldUseLegacyProviderOauthFallback(e))return null}if("gemini-google"===e)return null;if(!shouldUseLegacyProviderOauthFallback(e))return null;const n=r?.[getProviderOauthStorageKey(e)];return n?.accessToken?n:null}catch{return null}}export function hasStoredProviderOAuthTokens(e,t){if(t)return Boolean(getStoredProviderOAuthTokens(e,t));try{const t=Q().read(),r=Object.entries(t?.providerProfileOauth??{}).some(([t,r])=>t.startsWith(`${e}/`)&&"object"==typeof r&&null!==r&&"string"==typeof r.accessToken&&r.accessToken.trim());return shouldUseLegacyProviderOauthFallback(e)?Boolean(r||t?.[getProviderOauthStorageKey(e)]?.accessToken):Boolean(r)}catch{return!1}}export async function renameProviderScopedCredentials(e,t){if(!e||!t||e===t)return;const r=Q(),n=r.read()||{},o={...n.providerProfileApiKeys??{}},s={...n.providerProfileOauth??{}};e in o&&(o[t]=o[e],delete o[e]),e in s&&(s[t]=s[e],delete s[e]);if(!r.update({...n,providerProfileApiKeys:o,providerProfileOauth:s}).success)throw new Error("No se pudieron mover las credenciales del perfil.")}export async function removeProviderScopedCredentials(e){if(!e)return;const t=Q(),r=t.read()||{},n={...r.providerProfileApiKeys??{}},o={...r.providerProfileOauth??{}};delete n[e],delete o[e];if(!t.update({...r,providerProfileApiKeys:n,providerProfileOauth:o}).success)throw new Error("No se pudieron eliminar las credenciales del perfil.")}export async function removeAllProviderScopedCredentials(){const e=Q(),t=e.read()||{};if(!e.update({...t,providerProfileApiKeys:{},providerProfileOauth:{}}).success)throw new Error("No se pudieron eliminar las credenciales scoped de perfiles.")}export function getAnthropicApiKey(){const{key:e}=getAnthropicApiKeyWithSource();return e}export function hasAnthropicApiKeyAuth(){const{key:e,source:t}=getAnthropicApiKeyWithSource({skipRetrievingKeyFromApiKeyHelper:!0});return null!==e&&"none"!==t}export function getAnthropicApiKeyWithSource(e={}){if(f(h()))return{key:null,source:"none"};if(B())return process.env.ANTHROPIC_API_KEY?{key:process.env.ANTHROPIC_API_KEY,source:"ANTHROPIC_API_KEY"}:getConfiguredApiKeyHelper()?{key:e.skipRetrievingKeyFromApiKeyHelper?null:getApiKeyFromApiKeyHelperCached(),source:"apiKeyHelper"}:{key:null,source:"none"};const t=z()?void 0:process.env.ANTHROPIC_API_KEY;if(k()&&t)return{key:t,source:"ANTHROPIC_API_KEY"};if(X(process.env.CI)||"test"===process.env.NODE_ENV){const e=x();if(e)return{key:e,source:"ANTHROPIC_API_KEY"};if(!(t||process.env.CONTEXT_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN||process.env.CONTEXT_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR||process.env.CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR))throw new Error("ANTHROPIC_API_KEY or CONTEXT_CODE_OAUTH_TOKEN (legacy: CLAUDE_CODE_OAUTH_TOKEN) env var is required");return t?{key:t,source:"ANTHROPIC_API_KEY"}:{key:null,source:"none"}}if(t&&G().customApiKeyResponses?.approved?.includes(R(t)))return{key:t,source:"ANTHROPIC_API_KEY"};const r=x();if(r)return{key:r,source:"ANTHROPIC_API_KEY"};if(getConfiguredApiKeyHelper())return e.skipRetrievingKeyFromApiKeyHelper?{key:null,source:"apiKeyHelper"}:{key:getApiKeyFromApiKeyHelperCached(),source:"apiKeyHelper"};const n=getApiKeyFromConfigOrMacOSKeychain();return n||{key:null,source:"none"}}export function getConfiguredApiKeyHelper(){if(B())return ae("flagSettings")?.apiKeyHelper;return(ce()||{}).apiKeyHelper}function isApiKeyHelperFromProjectOrLocalSettings(){const e=getConfiguredApiKeyHelper();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.apiKeyHelper===e||r?.apiKeyHelper===e}function getConfiguredAwsAuthRefresh(){return(ce()||{}).awsAuthRefresh}export function isAwsAuthRefreshFromProjectSettings(){const e=getConfiguredAwsAuthRefresh();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.awsAuthRefresh===e||r?.awsAuthRefresh===e}function getConfiguredAwsCredentialExport(){return(ce()||{}).awsCredentialExport}export function isAwsCredentialExportFromProjectSettings(){const e=getConfiguredAwsCredentialExport();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.awsCredentialExport===e||r?.awsCredentialExport===e}export function calculateApiKeyHelperTTL(){const e=process.env.CONTEXT_CODE_API_KEY_HELPER_TTL_MS??process.env.CLAUDE_CODE_API_KEY_HELPER_TTL_MS;if(e){const t=parseInt(e,10);if(!Number.isNaN(t)&&t>=0)return t;Y(`Found CLAUDE_CODE_API_KEY_HELPER_TTL_MS env var, but it was not a valid number. Got ${e}`,{level:"error"})}return 3e5}let de=null,he=null,fe=0;export function getApiKeyHelperElapsedMs(){const e=he?.startedAt;return e?Date.now()-e:0}export async function getApiKeyFromApiKeyHelper(e){if(!getConfiguredApiKeyHelper())return null;const t=calculateApiKeyHelperTTL();return de?(Date.now()-de.timestamp<t||he||(he={promise:_runAndCache(e,!1,fe),startedAt:null}),de.value):(he||(he={promise:_runAndCache(e,!0,fe),startedAt:Date.now()}),he.promise)}async function _runAndCache(r,o,s){try{const t=await async function(t){const r=getConfiguredApiKeyHelper();if(!r)return null;if(isApiKeyHelperFromProjectOrLocalSettings()){if(!j()&&!t){const t=new Error(`Security: apiKeyHelper executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("apiKeyHelper invoked before trust check",t),a("tengu_apiKeyHelper_missing_trust11",{}),null}}const o=await n(r,{shell:!0,timeout:6e5,reject:!1});if(o.failed){const e=o.timedOut?"timed out":`exited ${o.exitCode}`,t=o.stderr?.trim();throw new Error(t?`${e}: ${t}`:e)}const s=o.stdout?.trim();if(!s)throw new Error("did not return a value");return s}(r);return s!==fe||null!==t&&(de={value:t,timestamp:Date.now()}),t}catch(e){if(s!==fe)return" ";const r=e instanceof Error?e.message:String(e);return console.error(t.red(`apiKeyHelper failed: ${r}`)),Y(`Error getting API key from apiKeyHelper: ${r}`,{level:"error"}),!o&&de&&" "!==de.value?(de={...de,timestamp:Date.now()},de.value):(de={value:" ",timestamp:Date.now()}," ")}finally{s===fe&&(he=null)}}export function getApiKeyFromApiKeyHelperCached(){return de?.value??null}export function clearApiKeyHelperCache(){fe++,de=null,he=null}export function prefetchApiKeyFromApiKeyHelperIfSafe(e){isApiKeyHelperFromProjectOrLocalSettings()&&!j()||getApiKeyFromApiKeyHelper(e)}const _e=18e4;export function refreshAwsAuth(e){Y("Running AWS auth refresh command");const n=U.getInstance();return n.startAuthentication(),new Promise(o=>{const s=r(e,{timeout:_e});s.stdout.on("data",e=>{const t=e.toString().trim();t&&(n.addOutput(t),Y(t,{level:"debug"}))}),s.stderr.on("data",e=>{const t=e.toString().trim();t&&(n.setError(t),Y(t,{level:"error"}))}),s.on("close",(e,r)=>{if(0===e)Y("AWS auth refresh completed successfully"),n.endAuthentication(!0),o(!0);else{const e="SIGTERM"===r?t.red("AWS auth refresh timed out after 3 minutes. Run your auth command manually in a separate terminal."):t.red("Error running awsAuthRefresh (in settings or ~/.context.json):");console.error(e),n.endAuthentication(!1),o(!1)}})})}export const refreshAndGetAwsCredentials=Z(async()=>{const r=await async function(){const t=getConfiguredAwsAuthRefresh();if(!t)return!1;if(isAwsAuthRefreshFromProjectSettings()&&!j()&&!m()){const t=new Error(`Security: awsAuthRefresh executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("awsAuthRefresh invoked before trust check",t),a("tengu_awsAuthRefresh_missing_trust",{}),!1}try{return Y("Fetching AWS caller identity for AWS auth refresh command"),await D(),Y("Fetched AWS caller identity, skipping AWS auth refresh command"),!1}catch{return refreshAwsAuth(t)}}(),o=await async function(){const r=getConfiguredAwsCredentialExport();if(!r)return null;if(isAwsCredentialExportFromProjectSettings()&&!j()&&!m()){const t=new Error(`Security: awsCredentialExport executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("awsCredentialExport invoked before trust check",t),a("tengu_awsCredentialExport_missing_trust",{}),null}try{return Y("Fetching AWS caller identity for credential export command"),await D(),Y("Fetched AWS caller identity, skipping AWS credential export command"),null}catch{try{Y("Running AWS credential export command");const e=await n(r,{shell:!0,reject:!1});if(0!==e.exitCode||!e.stdout)throw new Error("awsCredentialExport did not return a valid value");const t=pe(e.stdout.trim());if(!b(t))throw new Error("awsCredentialExport did not return valid AWS STS output structure");return Y("AWS credentials retrieved from awsCredentialExport"),{accessKeyId:t.Credentials.AccessKeyId,secretAccessKey:t.Credentials.SecretAccessKey,sessionToken:t.Credentials.SessionToken}}catch(e){const r=t.red("Error getting AWS credentials from awsCredentialExport (in settings or ~/.context.json):");return e instanceof Error?console.error(r,e.message):console.error(r,e),null}}}();return(r||o)&&await H(),o},36e5);export function clearAwsCredentialsCache(){refreshAndGetAwsCredentials.cache.clear()}function getConfiguredGcpAuthRefresh(){return(ce()||{}).gcpAuthRefresh}export function isGcpAuthRefreshFromProjectSettings(){const e=getConfiguredGcpAuthRefresh();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.gcpAuthRefresh===e||r?.gcpAuthRefresh===e}const ge=l;export async function checkGcpCredentialsValid(){try{const{GoogleAuth:e}=await import("google-auth-library"),t=new e({scopes:["https://www.googleapis.com/auth/cloud-platform"]}),r=(async()=>{const e=await t.getClient();await e.getAccessToken()})(),n=ue(5e3).then(()=>{throw new GcpCredentialsTimeoutError("GCP credentials check timed out")});return await Promise.race([r,n]),!0}catch{return!1}}const Oe=18e4;export function refreshGcpAuth(e){Y("Running GCP auth refresh command");const n=U.getInstance();return n.startAuthentication(),new Promise(o=>{const s=r(e,{timeout:Oe});s.stdout.on("data",e=>{const t=e.toString().trim();t&&(n.addOutput(t),Y(t,{level:"debug"}))}),s.stderr.on("data",e=>{const t=e.toString().trim();t&&(n.setError(t),Y(t,{level:"error"}))}),s.on("close",(e,r)=>{if(0===e)Y("GCP auth refresh completed successfully"),n.endAuthentication(!0),o(!0);else{const e="SIGTERM"===r?t.red("GCP auth refresh timed out after 3 minutes. Run your auth command manually in a separate terminal."):t.red("Error running gcpAuthRefresh (in settings or ~/.context.json):");console.error(e),n.endAuthentication(!1),o(!1)}})})}export const refreshGcpCredentialsIfNeeded=Z(async()=>await async function(){const t=getConfiguredGcpAuthRefresh();if(!t)return!1;if(isGcpAuthRefreshFromProjectSettings()&&!j()&&!m()){const t=new Error(`Security: gcpAuthRefresh executed before workspace trust is confirmed. If you see this message, post in ${e.FEEDBACK_CHANNEL}.`);return M("gcpAuthRefresh invoked before trust check",t),a("tengu_gcpAuthRefresh_missing_trust",{}),!1}try{if(Y("Checking GCP credentials validity for auth refresh"),await checkGcpCredentialsValid())return Y("GCP credentials are valid, skipping auth refresh command"),!1}catch{}return refreshGcpAuth(t)}(),36e5);export function clearGcpCredentialsCache(){refreshGcpCredentialsIfNeeded.cache.clear()}export function prefetchGcpCredentialsIfSafe(){if(getConfiguredGcpAuthRefresh()){if(isGcpAuthRefreshFromProjectSettings()){if(!j()&&!m())return}refreshGcpCredentialsIfNeeded()}}export function prefetchAwsCredentialsAndBedRockInfoIfSafe(){const e=getConfiguredAwsAuthRefresh(),t=getConfiguredAwsCredentialExport();if(e||t){if(isAwsAuthRefreshFromProjectSettings()||isAwsCredentialExportFromProjectSettings()){if(!j()&&!m())return}refreshAndGetAwsCredentials(),d()}}export const getApiKeyFromConfigOrMacOSKeychain=i(()=>{if("darwin"===process.platform){const e=te();if(e){if(e.stdout)return{key:e.stdout,source:"/login managed key"}}else{const e=ne();try{const t=q(`security find-generic-password -a $USER -w -s "${e}"`);if(t)return{key:t,source:"/login managed key"}}catch(e){J(e)}}}const e=G();return e.primaryApiKey?{key:e.primaryApiKey,source:"/login managed key"}:null});function isValidApiKey(e){return/^[a-zA-Z0-9-_\.]+$/.test(e)}function getStoredProviderApiKey(e,t){try{const r=Q().read();if(t){const n=r?.providerProfileApiKeys?.[t];if("string"==typeof n&&n.trim())return n;if(!O(e,t))return null}return r?.providerApiKeys?.[e]??null}catch{return null}}export function hasStoredProviderApiKey(e,t){return Boolean(getStoredProviderApiKey(e,t))}export async function saveProviderApiKey(e,t){if(!isValidApiKey(t))throw new Error("Formato de clave API inválido. La clave API solo debe contener caracteres alfanuméricos, guiones, guiones bajos y puntos.");const r=Q(),n=r.read()||{},o=T(e)?E(e,{createIfMissing:!0})?.id??null:null;if(!r.update({...n,providerApiKeys:{...n.providerApiKeys??{},[e]:t},...o?{providerProfileApiKeys:{...n.providerProfileApiKeys??{},[o]:t}}:{}}).success)throw new Error(`Failed to save ${e} API key`)}export async function removeProviderApiKey(e){const t=Q(),r=t.read()||{},n={...r.providerApiKeys??{}};delete n[e];const o={...r.providerProfileApiKeys??{}};if(T(e)){const t=_(e);t&&delete o[t]}if(!t.update({...r,providerApiKeys:n,providerProfileApiKeys:o}).success)throw new Error(`Failed to remove ${e} API key`)}export async function saveApiKey(e){if(!isValidApiKey(e))throw new Error("Formato de clave API inválido. La clave API solo debe contener caracteres alfanuméricos, guiones, guiones bajos y puntos.");await maybeRemoveApiKeyFromMacOSKeychain();let t=!1;if("darwin"===process.platform)try{const r=ne(),o=oe(),s=`add-generic-password -U -a "${o}" -s "${r}" -X "${Buffer.from(e,"utf-8").toString("hex")}"\n`;await n("security",["-i"],{input:s,reject:!1}),a("tengu_api_key_saved_to_keychain",{}),t=!0}catch(e){J(e),a("tengu_api_key_keychain_error",{error:W(e)}),a("tengu_api_key_saved_to_config",{})}else a("tengu_api_key_saved_to_config",{});const r=R(e);F(n=>{const o=n.customApiKeyResponses?.approved??[];return{...n,primaryApiKey:t?n.primaryApiKey:e,customApiKeyResponses:{...n.customApiKeyResponses,approved:o.includes(r)?o:[...o,r],rejected:n.customApiKeyResponses?.rejected??[]}}}),getApiKeyFromConfigOrMacOSKeychain.cache.clear?.(),ee()}export function isCustomApiKeyApproved(e){const t=G(),r=R(e);return t.customApiKeyResponses?.approved?.includes(r)??!1}export async function removeApiKey(){await maybeRemoveApiKeyFromMacOSKeychain(),F(e=>({...e,primaryApiKey:void 0})),getApiKeyFromConfigOrMacOSKeychain.cache.clear?.(),ee()}async function maybeRemoveApiKeyFromMacOSKeychain(){try{await N()}catch(e){J(e)}}export function saveOAuthTokensIfNeeded(e,t){if(!P(e.scopes))return a("tengu_oauth_tokens_not_claude_ai",{}),{success:!0};if(!e.refreshToken||!e.expiresAt)return a("tengu_oauth_tokens_inference_only",{}),{success:!0};const r=Q(),n=r.name;try{const o=r.read()||{},s=o.claudeAiOauth,i=t??_("claude")??E("claude",{createIfMissing:!0})?.id??null,c={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:e.subscriptionType??s?.subscriptionType??null,rateLimitTier:e.rateLimitTier??s?.rateLimitTier??null};i&&(o.providerProfileOauth={...o.providerProfileOauth??{},[i]:c});const u=r.update(o);return u.success?a("tengu_oauth_tokens_saved",{storageBackend:n}):a("tengu_oauth_tokens_save_failed",{storageBackend:n}),getClaudeAIOAuthTokens.cache?.clear?.(),L(),le(),u}catch(e){return J(e),a("tengu_oauth_tokens_save_exception",{storageBackend:n,error:W(e)}),{success:!1,warning:"Failed to save OAuth tokens"}}}export function saveOpenAIOAuthTokens(e,t){const r=Q(),n=r.name;try{const o=r.read()||{},s=t??_("openai")??E("openai",{createIfMissing:!0})?.id??null,i={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:e.subscriptionType??null,rateLimitTier:e.rateLimitTier??null};o.openAiOauth=i,s&&(o.providerProfileOauth={...o.providerProfileOauth??{},[s]:i});const c=r.update(o);return c.success?a("tengu_openai_oauth_tokens_saved",{storageBackend:n}):a("tengu_openai_oauth_tokens_save_failed",{storageBackend:n}),getOpenAIOAuthTokens.cache?.clear?.(),L(),le(),c}catch(e){return J(e),a("tengu_openai_oauth_tokens_save_exception",{storageBackend:n,error:W(e)}),{success:!1,warning:"Failed to save OpenAI OAuth tokens"}}}export function getClaudeAIOAuthTokens(){if(B())return null;const e=process.env.CONTEXT_CODE_OAUTH_TOKEN??process.env.CLAUDE_CODE_OAUTH_TOKEN;if(isManagedOAuthContext()&&e)return{accessToken:e,refreshToken:null,expiresAt:null,scopes:["user:inference"],subscriptionType:null,rateLimitTier:null};const t=isManagedOAuthContext()?w():null;if(t)return{accessToken:t,refreshToken:null,expiresAt:null,scopes:["user:inference"],subscriptionType:null,rateLimitTier:null};try{const e=getStoredProviderOAuthTokens("claude",_("claude"));return e?.accessToken?e:null}catch(e){return J(e),null}}export function getOpenAIOAuthTokens(){if(B())return null;if(process.env.OPENAI_OAUTH_TOKEN)return{accessToken:process.env.OPENAI_OAUTH_TOKEN,refreshToken:null,expiresAt:null,scopes:["responses:inference"],subscriptionType:null,rateLimitTier:null};try{const e=getStoredProviderOAuthTokens("openai",_("openai"));return e?.accessToken?e:null}catch(e){return J(e),null}}export function getOpenAIAccessToken(){return process.env.OPENAI_API_KEY||process.env.OPENAI_API_TOKEN||getStoredProviderApiKey("openai",_("openai"))||getOpenAIOAuthTokens()?.accessToken||null}export function getOpenRouterAccessToken(){return process.env.OPENROUTER_API_KEY||process.env.OPENROUTER_API_TOKEN||getStoredProviderApiKey("openrouter",_("openrouter"))||null}export async function checkGeminiGoogleCredentialsValid(){try{const e=await getGeminiGoogleAuthHeaders(),t=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim()||void 0,r=fetch("https://cloudcode-pa.googleapis.com/v1internal:loadCodeAssist",{method:"POST",headers:e,body:JSON.stringify({cloudaicompanionProject:t,metadata:{ideType:"IDE_UNSPECIFIED",platform:"PLATFORM_UNSPECIFIED",pluginType:"GEMINI",duetProject:t},mode:"HEALTH_CHECK"})}).then(e=>{if(!e.ok)throw new Error(`Gemini credentials check failed: ${e.status}`)}),n=ue(5e3).then(()=>{throw new GcpCredentialsTimeoutError("Gemini credentials check timed out")});return await Promise.race([r,n]),!0}catch{return!1}}export function getGeminiGoogleOAuthTokens(){try{const e=_("gemini-google"),t=Q().read(),r=e?t?.providerProfileOauth?.[e]:null;if(r?.accessToken)return r;const n=Object.entries(t?.providerProfileOauth??{}).find(([e,t])=>e.startsWith("gemini-google/")&&"object"==typeof t&&null!==t&&"string"==typeof t.accessToken&&t.accessToken.trim())?.[1];return n?.accessToken?n:null}catch{return null}}export function saveGeminiGoogleOAuthTokens(e){const t=Q(),r=t.name;try{const n=t.read()||{},o=_("gemini-google")??g("gemini-google").id,s={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:null,rateLimitTier:null,projectId:e.projectId};o&&(n.providerProfileOauth={...n.providerProfileOauth??{},[o]:s});const i=t.update(n);return a(i.success?"tengu_gemini_google_oauth_tokens_saved":"tengu_gemini_google_oauth_tokens_save_failed",{storageBackend:r}),i}catch(e){return J(e),a("tengu_gemini_google_oauth_tokens_save_exception",{storageBackend:r,error:W(e)}),{success:!1,warning:"Failed to save Gemini OAuth tokens"}}}export function getCopilotOAuthTokens(){try{const e=_("copilot"),t=Q().read(),r=e?t?.providerProfileOauth?.[e]:null;if(r?.githubToken||r?.accessToken)return r;const n=Object.entries(t?.providerProfileOauth??{}).find(([e,t])=>e.startsWith("copilot/")&&"object"==typeof t&&null!==t&&("string"==typeof t.githubToken||"string"==typeof t.accessToken))?.[1];return n?.githubToken||n?.accessToken?n:null}catch{return null}}export function saveCopilotOAuthTokens(e){const t=Q(),r=t.name;try{const n=t.read()||{},o=_("copilot")??g("copilot").id,s={accessToken:e.accessToken,refreshToken:e.refreshToken,expiresAt:e.expiresAt,scopes:e.scopes,subscriptionType:null,rateLimitTier:null,githubToken:e.githubToken};o&&(n.providerProfileOauth={...n.providerProfileOauth??{},[o]:s});const i=t.update(n);return a(i.success?"tengu_copilot_oauth_tokens_saved":"tengu_copilot_oauth_tokens_save_failed",{storageBackend:r}),i}catch(e){return J(e),a("tengu_copilot_oauth_tokens_save_exception",{storageBackend:r,error:W(e)}),{success:!1,warning:"Failed to save Copilot OAuth tokens"}}}export async function checkAndRefreshCopilotTokenIfNeeded(){const e=getCopilotOAuthTokens();if(!e)return null;const t=e.githubToken||e.accessToken;if(!t)return e;if(e.accessToken&&e.accessToken!==e.githubToken&&e.expiresAt&&e.expiresAt>Date.now()+6e4)return e;try{const r=await fetch("https://api.github.com/copilot_internal/v2/token",{method:"GET",headers:{Authorization:`token ${t}`,"User-Agent":"ContextCode/1.0",Accept:"application/json"}});if(!r.ok)return e;const n=await r.json(),o=n.expires_at?1e3*n.expires_at:Date.now()+15e5,s={...e,accessToken:n.token,githubToken:t,expiresAt:o};return saveCopilotOAuthTokens(s),s}catch{return e}}export function getCopilotAccessToken(){const e=process.env.GITHUB_COPILOT_TOKEN||process.env.COPILOT_OAUTH_TOKEN;if(e)return e;const t=getCopilotOAuthTokens();return t?.accessToken||t?.githubToken||null}function quoteShellArg(e){return`"${e.replace(/"/g,'\\"')}"`}export function getGeminiGoogleAuthCommand(){const e=process.env.GEMINI_OAUTH_CLIENT_SECRET_FILE||process.env.GOOGLE_OAUTH_CLIENT_SECRET_FILE,t=ge.join(",");return`gcloud auth application-default login${e?` --client-id-file=${quoteShellArg(e)}`:""} --scopes=${quoteShellArg(t)}`}export async function refreshGeminiGoogleAuth(){return refreshGcpAuth(getGeminiGoogleAuthCommand())}export function getGeminiApiAccessToken(){return process.env.GEMINI_API_KEY||process.env.GOOGLE_API_KEY||getStoredProviderApiKey("gemini-api",_("gemini-api"))||null}export async function getGeminiGoogleAuthHeaders(){const e=process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN,t={"Content-Type":"application/json"};if(e)t.Authorization=`Bearer ${e}`;else{const e=await async function(){const e=getGeminiGoogleOAuthTokens();if(!e?.refreshToken)return e;if(e.expiresAt&&e.expiresAt>Date.now()+6e4)return e;const t=await fetch(A,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:new URLSearchParams({grant_type:"refresh_token",refresh_token:e.refreshToken,client_id:u,client_secret:p})});if(!t.ok)return e;const r=await t.json(),n={...e,accessToken:r.access_token,expiresAt:r.expires_in?Date.now()+1e3*r.expires_in:e.expiresAt,scopes:r.scope?.split(/\s+/).filter(Boolean)??e.scopes};return saveGeminiGoogleOAuthTokens(n),n}();if(e?.accessToken){t.Authorization=`Bearer ${e.accessToken}`;const r=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim();r&&(t["x-goog-user-project"]=r)}else{const{GoogleAuth:e}=await import("google-auth-library"),r=new e({scopes:ge}),n=await r.getClient(),o=await n.getRequestHeaders();if("function"==typeof o.forEach)o.forEach((e,r)=>{t[r]=e});else for(const[e,r]of Object.entries(o))Array.isArray(r)?t[e]=r.map(String).join(", "):null!=r&&(t[e]=String(r))}}const r=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim()||void 0;return r&&(t["x-goog-user-project"]=r),t}export function getZAIAccessToken(){return process.env.ZAI_API_KEY||getStoredProviderApiKey("zai",_("zai"))||null}export function getMiniMaxAccessToken(){return process.env.MINIMAX_API_KEY||getStoredProviderApiKey("minimax",_("minimax"))||null}export function getNvidiaAccessToken(){return process.env.NVIDIA_API_KEY||getStoredProviderApiKey("nvidia",_("nvidia"))||null}export function getDeepSeekAccessToken(){return process.env.DEEPSEEK_API_KEY||getStoredProviderApiKey("deepseek",_("deepseek"))||null}export function getXaiAccessToken(){return process.env.XAI_API_KEY||getStoredProviderApiKey("xai",_("xai"))||null}export function getOllamaAccessToken(){return"ollama"}export function getOllamaCloudAccessToken(){return process.env.OLLAMA_API_KEY||getStoredProviderApiKey("ollama-cloud",_("ollama-cloud"))||null}export function getOpenAICompatibleAccessToken(e=h()){switch(e){case"openrouter":return getOpenRouterAccessToken();case"gemini-api":return getGeminiApiAccessToken();case"gemini-google":return process.env.GEMINI_OAUTH_TOKEN||process.env.GOOGLE_OAUTH_ACCESS_TOKEN||null;case"zai":return getZAIAccessToken();case"minimax":return getMiniMaxAccessToken();case"nvidia":return getNvidiaAccessToken();case"deepseek":return getDeepSeekAccessToken();case"xai":return getXaiAccessToken();case"copilot":return getCopilotAccessToken();case"gmi":case"novita":case"stepfun":case"huggingface":case"opencode-zen":case"arcee":case"alibaba":case"kimi":{const t=Ae[e];return(t?process.env[t]:void 0)||getStoredProviderApiKey(e,_(e))||null}case"ollama":return getOllamaAccessToken();case"ollama-cloud":return getOllamaCloudAccessToken();case"custom-openai":return process.env.CUSTOM_OPENAI_API_KEY||getStoredProviderApiKey("custom-openai",_("custom-openai"))||null;case"custom-anthropic":return process.env.CUSTOM_ANTHROPIC_API_KEY||getStoredProviderApiKey("custom-anthropic",_("custom-anthropic"))||null;default:return getOpenAIAccessToken()}}export async function getOpenAIOAuthTokensAsync(){if(B())return null;if(process.env.OPENAI_OAUTH_TOKEN)return getOpenAIOAuthTokens();try{const e=Q(),t=await e.readAsync(),r=_("openai"),n=r&&t?.providerProfileOauth?.[r]||(r&&!O("openai",r)?null:t?.openAiOauth);return n?.accessToken?n:null}catch(e){return J(e),null}}export function clearOAuthTokenCache(){getClaudeAIOAuthTokens.cache?.clear?.(),getOpenAIOAuthTokens.cache?.clear?.(),re()}let Te=0;async function invalidateOAuthCacheIfDiskChanged(){try{const e="sqlite"===Q().name?ie():se(),{mtimeMs:t}=await s(e);t!==Te&&(Te=t,clearOAuthTokenCache())}catch{getClaudeAIOAuthTokens.cache?.clear?.(),getOpenAIOAuthTokens.cache?.clear?.()}}const Ee=new Map;export function handleOAuth401Error(e){const t=Ee.get(e);if(t)return t;const r=async function(e){clearOAuthTokenCache();const t=await getClaudeAIOAuthTokensAsync();if(!t?.refreshToken)return!1;if(t.accessToken!==e)return a("tengu_oauth_401_recovered_from_keychain",{}),!0;return checkAndRefreshOAuthTokenIfNeeded(0,!0)}(e).finally(()=>{Ee.delete(e)});return Ee.set(e,r),r}export async function handleOpenAIOAuth401Error(e){clearOAuthTokenCache();const t=await getOpenAIOAuthTokensAsync();return!!t?.refreshToken&&(t.accessToken!==e?(a("tengu_openai_oauth_401_recovered_from_keychain",{}),!0):checkAndRefreshOpenAIOAuthTokenIfNeeded(0,!0))}export async function getClaudeAIOAuthTokensAsync(){if(B())return null;if(isManagedOAuthContext()&&(process.env.CONTEXT_CODE_OAUTH_TOKEN||process.env.CLAUDE_CODE_OAUTH_TOKEN||w()))return getClaudeAIOAuthTokens();try{const e=Q(),t=await e.readAsync(),r=_("claude"),n=r&&t?.providerProfileOauth?.[r]||(r&&!O("claude",r)?null:t?.claudeAiOauth);return n?.accessToken?n:null}catch(e){return J(e),null}}let me=null,ke=null;export function checkAndRefreshOAuthTokenIfNeeded(e=0,t=!1){if(0===e&&!t){if(me)return me;const r=checkAndRefreshOAuthTokenIfNeededImpl(e,t);return me=r.finally(()=>{me=null}),me}return checkAndRefreshOAuthTokenIfNeededImpl(e,t)}export function checkAndRefreshOpenAIOAuthTokenIfNeeded(e=0,t=!1){if(0===e&&!t){if(ke)return ke;const r=checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e,t);return ke=r.finally(()=>{ke=null}),ke}return checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e,t)}async function checkAndRefreshOAuthTokenIfNeededImpl(e,t){await invalidateOAuthCacheIfDiskChanged();const r=getClaudeAIOAuthTokens();if(!(t||r?.refreshToken&&v(r.expiresAt)))return!1;if(!r?.refreshToken)return!1;if(!P(r.scopes))return!1;getClaudeAIOAuthTokens.cache?.clear?.(),re();const n=await getClaudeAIOAuthTokensAsync();if(!n?.refreshToken||!v(n.expiresAt))return!1;const s=$();let i;await o(s,{recursive:!0});try{a("tengu_oauth_token_refresh_lock_acquiring",{}),i=await V.lock(s),a("tengu_oauth_token_refresh_lock_acquired",{})}catch(r){return"ELOCKED"===r.code?e<5?(a("tengu_oauth_token_refresh_lock_retry",{retryCount:e+1}),await ue(1e3+1e3*Math.random()),checkAndRefreshOAuthTokenIfNeededImpl(e+1,t)):(a("tengu_oauth_token_refresh_lock_retry_limit_reached",{maxRetries:5}),!1):(J(r),a("tengu_oauth_token_refresh_lock_error",{error:W(r)}),!1)}try{getClaudeAIOAuthTokens.cache?.clear?.(),re();const e=await getClaudeAIOAuthTokensAsync();if(!e?.refreshToken||!v(e.expiresAt))return a("tengu_oauth_token_refresh_race_resolved",{}),!1;a("tengu_oauth_token_refresh_starting",{});return saveOAuthTokensIfNeeded(await K(e.refreshToken,{scopes:P(e.scopes)?void 0:e.scopes})),getClaudeAIOAuthTokens.cache?.clear?.(),re(),!0}catch(e){J(e),getClaudeAIOAuthTokens.cache?.clear?.(),re();const t=await getClaudeAIOAuthTokensAsync();return!(!t||v(t.expiresAt))&&(a("tengu_oauth_token_refresh_race_recovered",{}),!0)}finally{a("tengu_oauth_token_refresh_lock_releasing",{}),await i(),a("tengu_oauth_token_refresh_lock_released",{})}}async function checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e,t){await invalidateOAuthCacheIfDiskChanged();const r=getOpenAIOAuthTokens();if(!(t||r?.refreshToken&&v(r.expiresAt)))return!1;if(!r?.refreshToken)return!1;getOpenAIOAuthTokens.cache?.clear?.(),re();const n=await getOpenAIOAuthTokensAsync();if(!n?.refreshToken||!v(n.expiresAt))return!1;const s=$();let i;await o(s,{recursive:!0});try{a("tengu_openai_oauth_token_refresh_lock_acquiring",{}),i=await V.lock(s),a("tengu_openai_oauth_token_refresh_lock_acquired",{})}catch(r){return"ELOCKED"===r.code?e<5?(a("tengu_openai_oauth_token_refresh_lock_retry",{retryCount:e+1}),await ue(1e3+1e3*Math.random()),checkAndRefreshOpenAIOAuthTokenIfNeededImpl(e+1,t)):(a("tengu_openai_oauth_token_refresh_lock_retry_limit_reached",{maxRetries:5}),!1):(J(r),!1)}try{getOpenAIOAuthTokens.cache?.clear?.(),re();const e=await getOpenAIOAuthTokensAsync();if(!e?.refreshToken||!v(e.expiresAt))return a("tengu_openai_oauth_token_refresh_race_resolved",{}),!1;a("tengu_openai_oauth_token_refresh_starting",{});return saveOpenAIOAuthTokens(await I(e.refreshToken,{scopes:e.scopes})),getOpenAIOAuthTokens.cache?.clear?.(),re(),!0}catch(e){J(e),getOpenAIOAuthTokens.cache?.clear?.(),re();const t=await getOpenAIOAuthTokensAsync();return!(!t||v(t.expiresAt))&&(a("tengu_openai_oauth_token_refresh_race_recovered",{}),!0)}finally{a("tengu_openai_oauth_token_refresh_lock_releasing",{}),await i(),a("tengu_openai_oauth_token_refresh_lock_released",{})}}export function isClaudeAISubscriber(){return!!isAnthropicAuthEnabled()&&P(getClaudeAIOAuthTokens()?.scopes)}export function hasProfileScope(){return getClaudeAIOAuthTokens()?.scopes?.includes(c)??!1}export function is1PApiCustomer(){return!(X(process.env.CONTEXT_CODE_USE_BEDROCK)||X(process.env.CLAUDE_CODE_USE_BEDROCK)||X(process.env.CONTEXT_CODE_USE_VERTEX)||X(process.env.CLAUDE_CODE_USE_VERTEX)||X(process.env.CONTEXT_CODE_USE_FOUNDRY)||X(process.env.CLAUDE_CODE_USE_FOUNDRY)||f(h()))&&!isClaudeAISubscriber()}export function getOauthAccountInfo(){return isAnthropicAuthEnabled()?G().oauthAccount:void 0}export function isOverageProvisioningAllowed(){const e=getOauthAccountInfo(),t=e?.billingType;return!(!isClaudeAISubscriber()||!t)&&("stripe_subscription"===t||"stripe_subscription_contracted"===t||"apple_subscription"===t||"google_play_subscription"===t)}export function hasOpusAccess(){const e=getSubscriptionType();return"max"===e||"enterprise"===e||"team"===e||"pro"===e||null===e}export function getSubscriptionType(){if(C())return y();if(!isAnthropicAuthEnabled())return null;const e=getClaudeAIOAuthTokens();return e?e.subscriptionType??null:null}export function isMaxSubscriber(){return"max"===getSubscriptionType()}export function isTeamSubscriber(){return"team"===getSubscriptionType()}export function isTeamPremiumSubscriber(){return"team"===getSubscriptionType()&&"default_claude_max_5x"===getRateLimitTier()}export function isEnterpriseSubscriber(){return"enterprise"===getSubscriptionType()}export function isProSubscriber(){return"pro"===getSubscriptionType()}export function getRateLimitTier(){if(!isAnthropicAuthEnabled())return null;const e=getClaudeAIOAuthTokens();return e?e.rateLimitTier??null:null}export function getSubscriptionName(){switch(getSubscriptionType()){case"enterprise":return"Context Empresarial";case"team":return"Context Equipo";case"max":return"Context Max";case"pro":return"Context Pro";default:return"Context API"}}export function isUsing3PServices(){return!!(X(process.env.CONTEXT_CODE_USE_BEDROCK)||X(process.env.CLAUDE_CODE_USE_BEDROCK)||X(process.env.CONTEXT_CODE_USE_VERTEX)||X(process.env.CLAUDE_CODE_USE_VERTEX)||X(process.env.CONTEXT_CODE_USE_FOUNDRY)||X(process.env.CLAUDE_CODE_USE_FOUNDRY)||f(h()))}function getConfiguredOtelHeadersHelper(){return(ce()||{}).otelHeadersHelper}export function isOtelHeadersHelperFromProjectOrLocalSettings(){const e=getConfiguredOtelHeadersHelper();if(!e)return!1;const t=ae("projectSettings"),r=ae("localSettings");return t?.otelHeadersHelper===e||r?.otelHeadersHelper===e}let ye=null,Ce=0;const ve=174e4;export function getOtelHeadersFromHelper(){const e=getConfiguredOtelHeadersHelper();if(!e)return{};const t=parseInt(process.env.CONTEXT_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS||process.env.CLAUDE_CODE_OTEL_HEADERS_HELPER_DEBOUNCE_MS||ve.toString());if(ye&&Date.now()-Ce<t)return ye;if(isOtelHeadersHelperFromProjectOrLocalSettings()){if(!j())return{}}try{const t=q(e,{timeout:3e4})?.toString().trim();if(!t)throw new Error("otelHeadersHelper did not return a valid value");const r=pe(t);if("object"!=typeof r||null===r||Array.isArray(r))throw new Error("otelHeadersHelper must return a JSON object with string key-value pairs");for(const[e,t]of Object.entries(r))if("string"!=typeof t)throw new Error(`otelHeadersHelper returned non-string value for key "${e}": ${typeof t}`);return ye=r,Ce=Date.now(),ye}catch(e){throw J(new Error(`Error getting OpenTelemetry headers from otelHeadersHelper (in settings): ${W(e)}`)),e}}export function isConsumerSubscriber(){const e=getSubscriptionType();return isClaudeAISubscriber()&&null!==e&&("max"===(t=e)||"pro"===t);var t}export function getAccountInformation(){if("firstParty"!==h())return;const{source:e}=getAuthTokenSource(),t={};"CLAUDE_CODE_OAUTH_TOKEN"===e||"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR"===e?t.tokenSource=e:isClaudeAISubscriber()?t.subscription=getSubscriptionName():t.tokenSource=e;const{key:r,source:n}=getAnthropicApiKeyWithSource();if(r&&(t.apiKeySource=n),"claude.ai"===e||"/login managed key"===n){const e=getOauthAccountInfo()?.organizationName;e&&(t.organization=e)}const o=getOauthAccountInfo()?.emailAddress;return"claude.ai"!==e&&"/login managed key"!==n||!o||(t.email=o),t}export async function validateForceLoginOrg(){if(process.env.ANTHROPIC_UNIX_SOCKET)return{valid:!0};if(!isAnthropicAuthEnabled())return{valid:!0};const e=ae("policySettings")?.forceLoginOrgUUID;if(!e)return{valid:!0};await checkAndRefreshOAuthTokenIfNeeded();const t=getClaudeAIOAuthTokens();if(!t)return{valid:!0};const{source:r}=getAuthTokenSource(),n="CLAUDE_CODE_OAUTH_TOKEN"===r||"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR"===r,o=await S(t.accessToken);if(!o)return{valid:!1,message:`Unable to verify organization for the current authentication token.\nThis machine requires organization ${e} but the profile could not be fetched.\nThis may be a network error, or the token may lack the user:profile scope required for\nverification (tokens from 'context setup-token' do not include this scope).\nTry again, or obtain a full-scope token via 'context auth login'.`};const s=o.organization.uuid;if(s===e)return{valid:!0};if(n){return{valid:!1,message:`The ${"CLAUDE_CODE_OAUTH_TOKEN"===r?"CLAUDE_CODE_OAUTH_TOKEN":"CLAUDE_CODE_OAUTH_TOKEN_FILE_DESCRIPTOR"} environment variable provides a token for a\ndifferent organization than required by this machine's managed settings.\n\nRequired organization: ${e}\nToken organization: ${s}\n\nRemove the environment variable or obtain a token for the correct organization.`}}return{valid:!1,message:`Your authentication token belongs to organization ${s},\nbut this machine requires organization ${e}.\n\nPlease log in with the correct organization: context auth login`}}class GcpCredentialsTimeoutError extends Error{}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{A as e,Aa as r,Ba as i,C as a,Ca as o,Da as l,Ea as u,J as h,P as p,Q as b,a as g,aa as w,c as d,d as v,f
|
|
1
|
+
import{A as e,Aa as r,Ba as i,C as a,Ca as o,Da as l,Ea as u,J as h,P as p,Q as b,a as g,aa as w,c as d,d as v,f,h as E,i as m,j as y,k,l as O,m as T,o as C,pa as A,q as I,r as P,s as S,t as M,wa as N,xa as D,ya as W,za as L}from"./chunk-VAB2VXFI.js";var _="Service workers are disabled or not supported by this browser",x=class{serviceWorker;worker;registration;events;constructor(e,r){if(this.serviceWorker=e,e){let i=null,a=new v;this.worker=new d(e=>(null!==i&&e.next(i),a.subscribe(r=>e.next(r))));let s=()=>{let{controller:r}=e;null!==r&&(i=r,a.next(i))};e.addEventListener("controllerchange",s),s(),this.registration=this.worker.pipe(k(()=>e.getRegistration()));let o=new v;this.events=o.asObservable();let c=e=>{let{data:r}=e;r?.type&&o.next(r)};e.addEventListener("message",c),r?.get(b,null,{optional:!0})?.onDestroy(()=>{e.removeEventListener("controllerchange",s),e.removeEventListener("message",c)})}else this.worker=this.events=this.registration=new d(e=>e.error(new O(5601,!1)))}postMessage(e,r){return new Promise(i=>{this.worker.pipe(y(1)).subscribe(a=>{a.postMessage(g({action:e},r)),i()})})}postMessageWithOperation(e,r,i){let a=this.waitForOperationCompleted(i),o=this.postMessage(e,r);return Promise.all([o,a]).then(([,e])=>e)}generateNonce(){return Math.round(1e7*Math.random())}eventsOfType(e){let r;return r="string"==typeof e?r=>r.type===e:r=>e.includes(r.type),this.events.pipe(m(r))}nextEventOfType(e){return this.eventsOfType(e).pipe(y(1))}waitForOperationCompleted(e){return new Promise((r,i)=>{this.eventsOfType("OPERATION_COMPLETED").pipe(m(r=>r.nonce===e),y(1),f(e=>{if(void 0!==e.result)return e.result;throw new Error(e.error)})).subscribe({next:r,error:i})})}get isEnabled(){return!!this.serviceWorker}},V=(()=>{class n{sw;messages;notificationClicks;subscription;get isEnabled(){return this.sw.isEnabled}pushManager=null;subscriptionChanges=new v;constructor(e){if(this.sw=e,!e.isEnabled)return this.messages=E,this.notificationClicks=E,void(this.subscription=E);this.messages=this.sw.eventsOfType("PUSH").pipe(f(e=>e.data)),this.notificationClicks=this.sw.eventsOfType("NOTIFICATION_CLICK").pipe(f(e=>e.data)),this.pushManager=this.sw.registration.pipe(f(e=>e.pushManager));let r=this.pushManager.pipe(k(e=>e.getSubscription()));this.subscription=new d(e=>{let i=r.subscribe(e),a=this.subscriptionChanges.subscribe(e);return()=>{i.unsubscribe(),a.unsubscribe()}})}requestSubscription(e){if(!this.sw.isEnabled||null===this.pushManager)return Promise.reject(new Error(_));let r={userVisibleOnly:!0},i=this.decodeBase64(e.serverPublicKey.replace(/_/g,"/").replace(/-/g,"+")),a=new Uint8Array(new ArrayBuffer(i.length));for(let e=0;e<i.length;e++)a[e]=i.charCodeAt(e);return r.applicationServerKey=a,new Promise((e,i)=>{this.pushManager.pipe(k(e=>e.subscribe(r)),y(1)).subscribe({next:r=>{this.subscriptionChanges.next(r),e(r)},error:i})})}unsubscribe(){if(!this.sw.isEnabled)return Promise.reject(new Error(_));let t=e=>{if(null===e)throw new O(5602,!1);return e.unsubscribe().then(e=>{if(!e)throw new O(5603,!1);this.subscriptionChanges.next(null)})};return new Promise((e,r)=>{this.subscription.pipe(y(1),k(t)).subscribe({next:e,error:r})})}decodeBase64(e){return atob(e)}static ɵfac=function(e){return new(e||n)(P(x))};static ɵprov=C({token:n,factory:n.ɵfac})}return n})(),F=(()=>{class n{sw;versionUpdates;unrecoverable;get isEnabled(){return this.sw.isEnabled}constructor(e){if(this.sw=e,!e.isEnabled)return this.versionUpdates=E,void(this.unrecoverable=E);this.versionUpdates=this.sw.eventsOfType(["VERSION_DETECTED","VERSION_INSTALLATION_FAILED","VERSION_READY","NO_NEW_VERSION_DETECTED"]),this.unrecoverable=this.sw.eventsOfType("UNRECOVERABLE_STATE")}checkForUpdate(){if(!this.sw.isEnabled)return Promise.reject(new Error(_));let e=this.sw.generateNonce();return this.sw.postMessageWithOperation("CHECK_FOR_UPDATES",{nonce:e},e)}activateUpdate(){if(!this.sw.isEnabled)return Promise.reject(new O(5601,!1));let e=this.sw.generateNonce();return this.sw.postMessageWithOperation("ACTIVATE_UPDATE",{nonce:e},e)}static ɵfac=function(e){return new(e||n)(P(x))};static ɵprov=C({token:n,factory:n.ɵfac})}return n})(),R=new I("");function X(){let e=S(U);if(!("serviceWorker"in navigator)||!1===e.enabled)return;let r=S(R),i=S(a),o=S(b);i.runOutsideAngular(()=>{let e=navigator.serviceWorker,s=()=>e.controller?.postMessage({action:"INITIALIZE"});e.addEventListener("controllerchange",s),o.onDestroy(()=>{e.removeEventListener("controllerchange",s)})}),i.runOutsideAngular(()=>{let i,{registrationStrategy:a}=e;if("function"==typeof a)i=new Promise(e=>a().subscribe(()=>e()));else{let[e,...r]=(a||"registerWhenStable:30000").split(":");switch(e){case"registerImmediately":i=Promise.resolve();break;case"registerWithDelay":i=q(+r[0]||0);break;case"registerWhenStable":i=Promise.race([o.whenStable(),q(+r[0])]);break;default:throw new O(5600,!1)}}i.then(()=>{o.destroyed||navigator.serviceWorker.register(r,{scope:e.scope}).catch(e=>console.error(T(5604,!1)))})})}function q(e){return new Promise(r=>setTimeout(r,e))}function ee(e,r){return new x(!1!==e.enabled?navigator.serviceWorker:void 0,r)}var U=class{enabled;scope;registrationStrategy};N(class n{constructor(){this.auth=S(l),this.socket=S(u)}ngOnInit(){this.auth.hasToken()&&this.socket.connect()}static{this.ɵfac=function(e){return new(e||n)}}static{this.ɵcmp=h({type:n,selectors:[["cx-root"]],decls:1,vars:0,template:function(e,r){1&e&&w(0,"router-outlet")},dependencies:[L],encapsulation:2,changeDetection:0})}},{providers:[i([{path:"",redirectTo:"chat",pathMatch:"full"},{path:"login",loadComponent:()=>import("./chunk-NFYBHCXF.js").then(e=>e.LoginComponent)},{path:"chat",canActivate:[()=>{let e=S(l),i=S(r);return!!e.hasToken()||(i.navigate(["/login"]),!1)}],loadComponent:()=>import("./chunk-AMCDNAIG.js").then(e=>e.ChatComponent)},{path:"**",redirectTo:"chat"}],o()),D(W()),function(r,i={}){return M([V,F,{provide:R,useValue:r},{provide:U,useValue:i},{provide:x,useFactory:ee,deps:[U,e]},p(X)])}("ngsw-worker.js",{enabled:!A(),registrationStrategy:"registerWhenStable:30000"})]}).catch(e=>console.error("[webapp] bootstrap error",e));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iaforged/context-code",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.6",
|
|
4
4
|
"description": "Context Code es un asistente de desarrollo para la terminal. Puede revisar tu proyecto, editar archivos, ejecutar comandos y apoyarte en tareas reales de programacion.",
|
|
5
5
|
"author": "Context AI",
|
|
6
6
|
"license": "MIT",
|