@iaforged/context-code 2.1.8 → 2.2.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.
- package/dist/src/commands/actualizar-version/actualizar-version.js +1 -0
- package/dist/src/commands/actualizar-version/index.js +1 -0
- package/dist/src/commands/login/login.js +1 -1
- package/dist/src/components/ConsoleOAuthFlow.js +1 -1
- package/dist/src/utils/model/providerBaseUrls.js +1 -1
- package/dist/src/utils/model/providerCatalog.js +1 -1
- package/dist/webapp/main-MTQLKGXD.js +1 -1
- package/package.json +41 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{jsx as e,jsxs as o}from"react/jsx-runtime";import*as t from"react";import{Box as n,Text as i}from"../../ink.js";import{Spinner as r}from"../../components/Spinner.js";import{execSync as c}from"child_process";import{logError as s}from"../../utils/log.js";export default async function actualizarVersion(t){return o(n,{flexDirection:"column",gap:1,children:[e(i,{bold:!0,children:"🔄 Actualizando Context Code..."}),o(n,{marginY:1,children:[e(r,{}),e(i,{children:" Ejecutando npm update -g @iaforged/context-code"})]}),e(ActualizarVersionLogic,{onDone:t})]})}function ActualizarVersionLogic({onDone:o}){return t.useEffect(()=>{let e=!0;return(async()=>{try{const{execSync:t}=await import("child_process");let n="desconocida";try{const e=c("npm list -g @iaforged/context-code --depth=0 --json 2>/dev/null",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=JSON.parse(e);n=o.dependencies?.["@iaforged/context-code"]?.version||"desconocida"}catch{}if(t("npm update -g @iaforged/context-code",{stdio:"inherit",windowsHide:!0}),!e)return;let i="desconocida";try{const e=c("npm list -g @iaforged/context-code --depth=0 --json 2>/dev/null",{encoding:"utf-8",stdio:["pipe","pipe","pipe"]}),o=JSON.parse(e);i=o.dependencies?.["@iaforged/context-code"]?.version||"desconocida"}catch{}if(!e)return;n!==i?(o(`✅ Context Code actualizado de ${n} a ${i}. Reiniciando...`),setTimeout(()=>{try{const e=process.argv[1]||"context";t(`start "" "${e}"`,{windowsHide:!0,stdio:"ignore"}),process.exit(0)}catch{process.exit(0)}},2e3)):o("ℹ️ Ya tienes la última versión de Context Code instalada.",{nextInput:"/version",submitNextInput:!0})}catch(e){s(e);const t=e instanceof Error?e.message:"Error desconocido";o(`❌ Error al actualizar: ${t}`,{nextInput:"/status",submitNextInput:!0})}})(),()=>{e=!1}},[o]),e(n,{flexDirection:"column",gap:0,children:e(i,{dimColor:!0,children:"Por favor espera, esto puede tomar unos segundos..."})})}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const a={type:"local-jsx",name:"actualizar-version",aliases:["update-version","actualizar","upgrade-cli"],description:"Actualiza Context Code a la última versión disponible en npm",load:()=>import("./actualizar-version.js")};export default a;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{feature as e}from"../../recovery/bunBundleShim.js";import{jsx as r,jsxs as o}from"react/jsx-runtime";import{resetCostState as t}from"../../bootstrap/state.js";import{clearTrustedDeviceToken as i,enrollTrustedDevice as n}from"../../bridge/trustedDevice.js";import{ConfigurableShortcutHint as s}from"../../components/ConfigurableShortcutHint.js";import{ConsoleOAuthFlow as a}from"../../components/ConsoleOAuthFlow.js";import{Dialog as m}from"../../components/design-system/Dialog.js";import{useMainLoopModel as l}from"../../hooks/useMainLoopModel.js";import{Text as
|
|
1
|
+
import{feature as e}from"../../recovery/bunBundleShim.js";import{jsx as r,jsxs as o}from"react/jsx-runtime";import{resetCostState as t}from"../../bootstrap/state.js";import{clearTrustedDeviceToken as i,enrollTrustedDevice as n}from"../../bridge/trustedDevice.js";import{ConfigurableShortcutHint as s}from"../../components/ConfigurableShortcutHint.js";import{ConsoleOAuthFlow as a}from"../../components/ConsoleOAuthFlow.js";import{Dialog as m}from"../../components/design-system/Dialog.js";import{useMainLoopModel as l}from"../../hooks/useMainLoopModel.js";import{Text as c}from"../../ink.js";import{refreshGrowthBookAfterAuthChange as d}from"../../services/analytics/growthbook.js";import{refreshPolicyLimits as p}from"../../services/policyLimits/index.js";import{refreshRemoteManagedSettings as u}from"../../services/remoteManagedSettings/index.js";import{stripSignatureBlocks as g}from"../../utils/messages.js";import{checkAndDisableAutoModeIfNeeded as f,checkAndDisableBypassPermissionsIfNeeded as P,resetAutoModeGateCheck as v,resetBypassPermissionsCheck as M}from"../../utils/permissions/bypassPermissionsKillswitch.js";import{getAPIProvider as N}from"../../utils/model/providers.js";import{switchProviderPreference as j}from"../../utils/model/providerSwitch.js";import{resetUserCache as x}from"../../utils/user.js";import{applySuccessfulLogin as h,isCoreAuthEnabled as S,parseLoginProfileName as I}from"../../core/auth/loginCore.js";export async function call(o,s,a){const m=I(a);return r(Login,{profileName:m,onDone:async(r,a,l,c)=>{if(s.onChangeAPIKey(),s.setMessages(g),r){if(S()){const r=h({context:s,profileName:m,previousModel:a,previousProvider:l,targetProvider:c,transcriptClassifierEnabled:e("TRANSCRIPT_CLASSIFIER")});return r.shouldOpenModelPicker?void o(r.message,{nextInput:"/model",submitNextInput:!0}):void o(r.message)}const r=j("openai"===c?{currentModel:a,currentProvider:l,targetProvider:"openai",targetProfileName:m}:"openrouter"===c?{currentModel:a,currentProvider:l,targetProvider:"openrouter",targetProfileName:m}:"ollama"===c?{currentModel:a,currentProvider:l,targetProvider:"ollama",targetProfileName:m}:"ollama-cloud"===c?{currentModel:a,currentProvider:l,targetProvider:"ollama-cloud",targetProfileName:m}:"gemini-api"===c?{currentModel:a,currentProvider:l,targetProvider:"gemini-api",targetProfileName:m}:"gemini-google"===c?{currentModel:a,currentProvider:l,targetProvider:"gemini-google",targetProfileName:m}:"zai"===c?{currentModel:a,currentProvider:l,targetProvider:"zai",targetProfileName:m}:"minimax"===c?{currentModel:a,currentProvider:l,targetProvider:"minimax",targetProfileName:m}:"nvidia"===c?{currentModel:a,currentProvider:l,targetProvider:"nvidia",targetProfileName:m}:"deepseek"===c?{currentModel:a,currentProvider:l,targetProvider:"deepseek",targetProfileName:m}:"custom-openai"===c?{currentModel:a,currentProvider:l,targetProvider:"custom-openai",targetProfileName:m}:"custom-anthropic"===c?{currentModel:a,currentProvider:l,targetProvider:"custom-anthropic",targetProfileName:m}:{currentModel:a,currentProvider:l,targetProvider:"claude",targetProfileName:m});t(),u(),p(),x(),d(),i(),n(),M();const g=s.getAppState();if(P(g.toolPermissionContext,s.setAppState),e("TRANSCRIPT_CLASSIFIER")&&(v(),f(g.toolPermissionContext,s.setAppState,g.fastMode)),s.setAppState(e=>({...e,mainLoopModel:r,mainLoopModelForSession:r,authVersion:e.authVersion+1})),!r)return void o(m?`Inicio de sesion exitoso en el perfil "${m}". Selecciona ahora el modelo para este perfil.`:"Inicio de sesion exitoso. Selecciona ahora el modelo para este perfil.",{nextInput:"/model",submitNextInput:!0})}o(r?"Inicio de sesión exitoso":"Acceso interrumpido")}})}export function Login(e){const t=l(),i=N();return r(m,{title:"Iniciar sesión",onCancel:()=>e.onDone(!1,t,i),color:"permission",inputGuide:e=>e.pending?o(c,{children:["Presiona ",e.keyName," de nuevo para salir"]}):r(s,{action:"confirm:no",context:"Confirmation",fallback:"Esc",description:"cancelar"}),children:r(a,{onDone:r=>e.onDone(!0,t,i,r),startingMessage:e.startingMessage,profileName:e.profileName})})}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{jsxs as e,jsx as o,Fragment as r}from"react/jsx-runtime";import{c as t}from"react/compiler-runtime";import{useCallback as i,useEffect as n,useRef as a,useState as s}from"react";import{logEvent as l}from"../services/analytics/index.js";import{installOAuthTokens as c}from"../cli/handlers/auth.js";import{useTerminalSize as d}from"../hooks/useTerminalSize.js";import{setClipboard as u}from"../ink/termio/osc.js";import{useTerminalNotification as m}from"../ink/useTerminalNotification.js";import{Box as p,Link as h,Text as g}from"../ink.js";import{useKeybinding as f}from"../keybindings/useKeybinding.js";import{getSSLErrorHint as _}from"../services/api/errorUtils.js";import{sendNotification as v}from"../services/notifier.js";import{OAuthService as y}from"../services/oauth/index.js";import{getOAuthRequestDetails as C}from"../services/oauth/client.js";import{checkGeminiGoogleCredentialsValid as A,getOauthAccountInfo as b,saveGeminiGoogleOAuthTokens as x,saveProviderApiKey as k,validateForceLoginOrg as O}from"../utils/auth.js";import{startGeminiCliOAuthFlow as P}from"../services/oauth/geminiCli.js";import{resolveProviderProfile as I}from"../utils/model/providerProfiles.js";import{logError as S}from"../utils/log.js";import{getVisibleProvider as D}from"../utils/model/providerCatalog.js";import{getConfiguredProviderBaseUrl as T,setProviderBaseUrl as w}from"../utils/model/providerBaseUrls.js";import{getSettings_DEPRECATED as j}from"../utils/settings/settings.js";import{Select as M}from"./CustomSelect/select.js";import{KeyboardShortcutHint as U}from"./design-system/KeyboardShortcutHint.js";import{Spinner as R}from"./Spinner.js";import G from"./TextInput.js";const E=["deepseek","minimax","openrouter","zai","nvidia","ollama","openai","claudeai","gemini-google","gemini-api","console"];function sortLoginProviderOptions(e){const o=new Map(E.map((e,o)=>[e,o]));return[...e].sort((e,r)=>(o.get(e.value)??Number.MAX_SAFE_INTEGER)-(o.get(r.value)??Number.MAX_SAFE_INTEGER))}const B="Pega aqui el codigo si se solicita > ";function formatOAuthDebugDetails(e,o){if("openai"!==e)return"";const r=C({provider:e,port:o,isManual:!1});return[`authorize=${r.authorizeUrl}`,`redirect_uri=${r.redirectUri}`,`scope=${r.scopes.join(" ")}`].join("\n")}export function ConsoleOAuthFlow({onDone:r,startingMessage:t,mode:C="login",forceLoginMethod:b,profileName:T}){const M=j()||{},R=b??M.forceLoginMethod,G=M.forceLoginOrgUUID,E="claudeai"===R?"Método de acceso preseleccionado: Plan de suscripción (Context Pro/Max)":"console"===R?"Método de acceso preseleccionado: Facturación por uso de API (Anthropic Console)":"openai"===R?"Método de acceso preseleccionado: OpenAI / Codex OAuth":null,B=m(),[L,K]=s(()=>"setup-token"===C||"claudeai"===R||"console"===R||"openai"===R?{state:"ready_to_start"}:{state:"idle"}),[z,N]=s(""),[F,$]=s(0),[W]=s(()=>new y),[V,X]=s(()=>"openai"===R?"openai":"anthropic"),[Y,q]=s(()=>"setup-token"===C||"claudeai"===R),[H,Z]=s(!1),[J,Q]=s(!1),ee=d().columns-37-1,[oe,re]=s(""),[te,ie]=s(0),[ne,ae]=s(""),[se,le]=s(0);n(()=>{"claudeai"===R?l("tengu_oauth_claudeai_forced",{}):"console"===R&&l("tengu_oauth_console_forced",{})},[R]),n(()=>{if("about_to_retry"===L.state){const e=setTimeout(K,1e3,L.nextState);return()=>clearTimeout(e)}},[L]),f("confirm:yes",()=>{l("tengu_oauth_success",{loginWithClaudeAi:Y}),r(V)},{context:"Confirmation",isActive:"success"===L.state&&"setup-token"!==C}),n(()=>{if("success"===L.state&&!process.stdin.isTTY){const e=setTimeout(()=>{l("tengu_oauth_success",{loginWithClaudeAi:Y}),r(V)},800);return()=>clearTimeout(e)}},[L.state,V,Y,r]),f("confirm:yes",()=>{K({state:"idle"})},{context:"Confirmation",isActive:"platform_setup"===L.state}),f("confirm:yes",()=>{ue()},{context:"Confirmation",isActive:"provider_google_setup"===L.state}),f("confirm:yes",()=>{"error"===L.state&&L.toRetry&&(N(""),K({state:"about_to_retry",nextState:L.toRetry}))},{context:"Confirmation",isActive:"error"===L.state&&!!L.toRetry}),f("cancel",()=>{K({state:"idle"})},{context:"Confirmation",isActive:"provider_api_key_input"===L.state||"provider_local_setup"===L.state||"provider_google_setup"===L.state||"error"===L.state}),n(()=>{"c"===z&&"waiting_for_login"===L.state&&H&&!J&&(u(L.url).then(e=>{e&&process.stdout.write(e),Q(!0),setTimeout(Q,2e3,!1)}),N(""))},[z,L,H,J]);const ce=i(async(e,o)=>{const t=e.trim();if(t)try{await k(o,t),re(""),ie(0);const e=D(o).label;v({message:`API key de ${e} guardada`,notificationType:"auth_success"},B),r(o)}catch(e){S(e),K({state:"error",message:e.message,toRetry:{state:"provider_api_key_input",provider:o}})}else K({state:"error",message:"Debes ingresar una API key.",toRetry:{state:"provider_api_key_input",provider:o}})},[r,B]),de=i((e,o)=>{const t=e.trim();if(t)try{const e=w(o,t);ae(e),le(0),v({message:`URL de ${D(o).label} guardada`,notificationType:"auth_success"},B),r(o)}catch(e){S(e),K({state:"error",message:e.message,toRetry:{state:"provider_local_setup",provider:o}})}else K({state:"error",message:"Debes ingresar una URL para Ollama.",toRetry:{state:"provider_local_setup",provider:o}})},[r,B]),ue=i(async()=>{K({state:"provider_google_auth_running"});try{if(await A())return void r("gemini-google");const e=await P();x(e);if(!await A())return v({message:"OAuth de Gemini guardado; Code Assist no valido el proyecto de cuota",notificationType:"auth_success"},B),void r("gemini-google");v({message:"Credenciales de Gemini Google listas",notificationType:"auth_success"},B),r("gemini-google")}catch(e){S(e),K({state:"error",message:e.message,toRetry:{state:"provider_google_setup"}})}},[r,B]),me=i(async()=>{try{l("tengu_oauth_flow_start",{loginWithClaudeAi:Y,provider:V});const e=await W.startOAuthFlow(async e=>{K({state:"waiting_for_login",url:e}),setTimeout(Z,3e3,!0)},{loginWithClaudeAi:Y,provider:V,inferenceOnly:"setup-token"===C,expiresIn:"setup-token"===C?31536e3:void 0,orgUUID:G}).catch(e=>{const o=e.message.includes("Token exchange failed"),r=_(e),t=W.getPort(),i="openai"===V&&t?formatOAuthDebugDetails(V,t):"";throw K({state:"error",message:r??(o?"No se pudo intercambiar el codigo de autorizacion por el token de acceso. Intentalo de nuevo."+(i?`\n${i}`:""):e.message),toRetry:"setup-token"===C?{state:"ready_to_start"}:{state:"idle"}}),l("tengu_oauth_token_exchange_error",{error:e.message,ssl_error:null!==r}),e});if("setup-token"===C)K({state:"success",token:e.accessToken});else{K({state:"creating_api_key"});const o=T?I("openai"===V?"openai":"anthropic",T):void 0;if(await c(e,V,o?.id),"anthropic"===V){const e=await O();if(!e.valid)throw new Error(e.message)}K({state:"success"}),v({message:"openai"===V?"Inicio de sesión con OpenAI / Codex completado":"Inicio de sesión en Context Code completado",notificationType:"auth_success"},B)}}catch(e){const o=e.message,r=_(e),t=W.getPort(),i="openai"===V&&t?formatOAuthDebugDetails(V,t):"";K({state:"error",message:r??("openai"===V&&i&&!o.includes("redirect_uri=")?`${o}\n${i}`:o),toRetry:{state:"setup-token"===C?"ready_to_start":"idle"}}),l("tengu_oauth_error",{error:o,ssl_error:null!==r})}},[V,W,Z,Y,C,G,B]),pe=a(!1);return n(()=>{"ready_to_start"!==L.state||pe.current||(pe.current=!0,process.nextTick((e,o)=>{e(),o.current=!1},me,pe))},[L.state,me]),n(()=>{if("setup-token"===C&&"success"===L.state){const e=setTimeout((e,o)=>{l("tengu_oauth_success",{loginWithClaudeAi:e}),o(V)},500,Y,r,V);return()=>clearTimeout(e)}},[C,L,Y,r,V]),n(()=>()=>{W.cleanup()},[W]),e(p,{flexDirection:"column",gap:1,children:["waiting_for_login"===L.state&&H&&e(p,{flexDirection:"column",gap:1,paddingBottom:1,children:[e(p,{paddingX:1,children:[e(g,{dimColor:!0,children:["Browser didn't open? Use the url below to sign in"," "]}),o(g,J?{color:"success",children:"(Copied!)"}:{dimColor:!0,children:o(U,{shortcut:"c",action:"copiar",parens:!0})})]}),o(h,{url:L.url,children:o(g,{dimColor:!0,children:L.url})})]},"urlToCopy"),"setup-token"===C&&"success"===L.state&&L.token&&e(p,{flexDirection:"column",gap:1,paddingTop:1,children:[o(g,{color:"success",children:"✓ Long-lived authentication token created successfully!"}),e(p,{flexDirection:"column",gap:1,children:[o(g,{children:"Your OAuth token (valid for 1 year):"}),o(g,{color:"warning",children:L.token}),o(g,{dimColor:!0,children:"Store this token securely. You won't be able to see it again."}),o(g,{dimColor:!0,children:"Use this token by setting: export CONTEXT_CODE_OAUTH_TOKEN=<token>"})]})]},"tokenOutput"),o(p,{paddingLeft:1,flexDirection:"column",gap:1,children:o(OAuthStatusMessage,{oauthStatus:L,oauthProvider:V,mode:C,startingMessage:t,forcedMethodMessage:E,showPastePrompt:H,pastedCode:z,setPastedCode:N,cursorOffset:F,setCursorOffset:$,textInputColumns:ee,handleSubmitCode:async function(e,o){try{const[r,t]=e.split("#");if(!r||!t)return void K({state:"error",message:"Codigo invalido. Asegurate de copiar el codigo completo",toRetry:{state:"waiting_for_login",url:o}});l("tengu_oauth_manual_entry",{}),W.handleManualAuthCodeInput({authorizationCode:r,state:t})}catch(e){S(e),K({state:"error",message:e.message,toRetry:{state:"waiting_for_login",url:o}})}},setOAuthStatus:K,setLoginWithClaudeAi:q,setOAuthProvider:X,providerApiKey:oe,setProviderApiKey:re,providerApiKeyCursorOffset:te,setProviderApiKeyCursorOffset:ie,handleProviderApiKeySubmit:ce,providerBaseUrl:ne,setProviderBaseUrlInput:ae,providerBaseUrlCursorOffset:se,setProviderBaseUrlCursorOffset:le,handleProviderBaseUrlSubmit:de,onDone:r})})]})}function OAuthStatusMessage(i){const n=t(68),{oauthStatus:a,oauthProvider:s,mode:c,startingMessage:d,forcedMethodMessage:u,showPastePrompt:m,pastedCode:f,setPastedCode:_,cursorOffset:v,setCursorOffset:y,textInputColumns:C,handleSubmitCode:A,setOAuthStatus:x,setLoginWithClaudeAi:k,setOAuthProvider:O,providerApiKey:P,setProviderApiKey:I,providerApiKeyCursorOffset:S,setProviderApiKeyCursorOffset:w,handleProviderApiKeySubmit:j,providerBaseUrl:U,setProviderBaseUrlInput:E,providerBaseUrlCursorOffset:L,setProviderBaseUrlCursorOffset:K,handleProviderBaseUrlSubmit:z,onDone:N}=i;switch(a.state){case"idle":{const r=d||"Context Code puede usarse con tu suscripción de Claude, la facturación de Anthropic Console o OpenAI / Codex OAuth.";let t,i,a,s,c,u,m;return n[0]!==r?(t=o(g,{bold:!0,children:r}),n[0]=r,n[1]=t):t=n[1],n[2]===Symbol.for("react.memo_cache_sentinel")?(i=o(g,{children:"Selecciona el metodo de acceso:"}),n[2]=i):i=n[2],n[3]===Symbol.for("react.memo_cache_sentinel")?(a={label:e(g,{children:["Claude account with subscription ·"," ",o(g,{dimColor:!0,children:"Pro, Max, Team, or Enterprise"}),!1,"\n"]}),value:"claudeai"},n[3]=a):a=n[3],n[4]===Symbol.for("react.memo_cache_sentinel")?(s={label:e(g,{children:["Anthropic Console account ·"," ",o(g,{dimColor:!0,children:"API usage billing"}),"\n"]}),value:"console"},n[4]=s):s=n[4],n[5]===Symbol.for("react.memo_cache_sentinel")?(c=[a,s,{label:e(g,{children:["Cuenta de OpenAI / Codex ·"," ",o(g,{dimColor:!0,children:"Login OAuth"}),"\n"]}),value:"openai"},{label:e(g,{children:["OpenRouter ·"," ",o(g,{dimColor:!0,children:"API key / OpenAI-compatible"}),"\n"]}),value:"openrouter"},{label:e(g,{children:["Ollama ·"," ",o(g,{dimColor:!0,children:"Servidor local compatible"}),"\n"]}),value:"ollama"},{label:e(g,{children:["Gemini API - ",o(g,{dimColor:!0,children:"API key / OpenAI-compatible"}),"\n"]}),value:"gemini-api"},{label:e(g,{children:["Gemini Google - ",o(g,{dimColor:!0,children:"OAuth/ADC de Google"}),"\n"]}),value:"gemini-google"},{label:e(g,{children:["Z.AI ·"," ",o(g,{dimColor:!0,children:"API key / OpenAI-compatible"}),"\n"]}),value:"zai"},{label:e(g,{children:["MiniMax ·"," ",o(g,{dimColor:!0,children:"API key / Anthropic-compatible"}),"\n"]}),value:"minimax"},{label:e(g,{children:["NVIDIA API ·"," ",o(g,{dimColor:!0,children:"API key / build.nvidia.com"}),"\n"]}),value:"nvidia"},{label:e(g,{children:["DeepSeek ·"," ",o(g,{dimColor:!0,children:"API key / contexto 1M (V4)"}),"\n"]}),value:"deepseek"}],n[5]=c):c=n[5],n[6]!==k||n[7]!==x||n[8]!==O||n[65]!==N?(u=o(p,{children:o(M,{options:sortLoginProviderOptions(c),onChange:e=>{"platform"===e?(l("tengu_oauth_platform_selected",{}),x({state:"platform_setup"})):"openai"===e?(l("tengu_oauth_openai_selected",{}),O("openai"),k(!1),x({state:"ready_to_start"})):"openrouter"===e?x({state:"provider_api_key_input",provider:"openrouter"}):"gemini-api"===e||"zai"===e||"minimax"===e||"nvidia"===e||"deepseek"===e?x({state:"provider_api_key_input",provider:e}):"gemini-google"===e?x({state:"provider_google_setup"}):"ollama"===e||"ollama-cloud"===e?(E(T(e)),K(0),x({state:"provider_local_setup",provider:e})):(O("anthropic"),x({state:"ready_to_start"}),"claudeai"===e?(l("tengu_oauth_claudeai_selected",{}),k(!0)):(l("tengu_oauth_console_selected",{}),k(!1)))}})}),n[6]=k,n[7]=x,n[8]=O,n[65]=N,n[66]=u):u=n[66],n[10]!==t||n[11]!==u?(m=e(p,{flexDirection:"column",gap:1,marginTop:1,children:[t,i,u]}),n[10]=t,n[11]=u,n[12]=m):m=n[12],m}case"provider_api_key_input":{let r,t,i,s;if(n[50]!==a.provider?(r=e(g,{bold:!0,children:["Ingresa la API key de ",D(a.provider).label]}),n[50]=a.provider,n[51]=r):r=n[51],n[52]!==a.provider){const r=D(a.provider);t=e(p,{flexDirection:"column",gap:0,children:[o(g,{dimColor:!0,children:r.description}),e(g,{dimColor:!0,children:["Siguiente paso: ",r.setup.nextStep]})]}),n[52]=a.provider,n[53]=t}else t=n[53];return n[54]!==P||n[55]!==S||n[56]!==I||n[57]!==w||n[58]!==C||n[59]!==j?(i=e(p,{children:[o(g,{children:"API key > "}),o(G,{value:P,onChange:I,onSubmit:e=>j(e,a.provider),cursorOffset:S,onChangeCursorOffset:w,columns:C,mask:"*"})]}),n[54]=P,n[55]=S,n[56]=I,n[57]=w,n[58]=C,n[59]=j,n[60]=i):i=n[60],n[61]!==r||n[62]!==t||n[63]!==i?(s=e(p,{flexDirection:"column",gap:1,children:[r,t,i]}),n[61]=r,n[62]=t,n[63]=i,n[64]=s):s=n[64],s}case"provider_local_setup":{const r=D(a.provider);return e(p,{flexDirection:"column",gap:1,children:[o(g,{bold:!0,children:r.label}),o(g,{dimColor:!0,children:r.setup.intro}),o(g,{dimColor:!0,children:r.setup.nextStep}),o(g,{children:"URL del servidor > "}),o(p,{children:o(G,{value:U,onChange:E,onSubmit:e=>z(e,a.provider),cursorOffset:L,onChangeCursorOffset:K,columns:C})}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para guardar la URL y continuar."]})]})}case"provider_google_setup":return e(p,{flexDirection:"column",gap:1,children:[o(g,{bold:!0,children:"Gemini Google OAuth"}),o(g,{dimColor:!0,children:"Context Code usara el flujo OAuth compatible con Gemini CLI y abrira Google en el navegador."}),o(g,{dimColor:!0,children:"Se guardara el access token y refresh token en el perfil activo de Gemini Google."}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para iniciar sesion con tu cuenta de Google."]})]});case"provider_google_auth_running":return e(p,{children:[o(R,{}),o(g,{children:"Abriendo Google OAuth para Gemini..."})]});case"platform_setup":{let r,t,i,a,s,l,c,d;return n[12]===Symbol.for("react.memo_cache_sentinel")?(r=o(g,{bold:!0,children:"Usando plataformas de terceros"}),n[12]=r):r=n[12],n[13]===Symbol.for("react.memo_cache_sentinel")?(t=o(g,{children:"Context Code soporta Amazon Bedrock, Microsoft Foundry y Vertex AI. Configura las variables de entorno requeridas y luego reinicia Context Code."}),i=o(g,{children:"Si formas parte de una organización empresarial, contacta a tu administrador para las instrucciones de configuración."}),n[13]=t,n[14]=i):(t=n[13],i=n[14]),n[15]===Symbol.for("react.memo_cache_sentinel")?(a=o(g,{bold:!0,children:"Documentation:"}),n[15]=a):a=n[15],n[16]===Symbol.for("react.memo_cache_sentinel")?(s=e(g,{children:["· Amazon Bedrock:"," ",o(h,{url:"https://docs.iaforged.com/",children:"https://docs.iaforged.com/"})]}),n[16]=s):s=n[16],n[17]===Symbol.for("react.memo_cache_sentinel")?(l=e(g,{children:["· Microsoft Foundry:"," ",o(h,{url:"https://docs.iaforged.com/",children:"https://docs.iaforged.com/"})]}),n[17]=l):l=n[17],n[18]===Symbol.for("react.memo_cache_sentinel")?(c=e(p,{flexDirection:"column",marginTop:1,children:[a,s,l,e(g,{children:["· Vertex AI:"," ",o(h,{url:"https://docs.iaforged.com/",children:"https://docs.iaforged.com/"})]})]}),n[18]=c):c=n[18],n[19]===Symbol.for("react.memo_cache_sentinel")?(d=e(p,{flexDirection:"column",gap:1,marginTop:1,children:[r,e(p,{flexDirection:"column",gap:1,children:[t,i,c,o(p,{marginTop:1,children:e(g,{dimColor:!0,children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para volver a las opciones de acceso."]})})]})]}),n[19]=d):d=n[19],d}case"waiting_for_login":{let r,t,i,s;return n[20]!==u?(r=u&&o(p,{children:o(g,{dimColor:!0,children:u})}),n[20]=u,n[21]=r):r=n[21],n[22]!==m?(t=!m&&e(p,{children:[o(R,{}),o(g,{children:"Abriendo el navegador para iniciar sesión…"})]}),n[22]=m,n[23]=t):t=n[23],n[24]!==v||n[25]!==A||n[26]!==a.url||n[27]!==f||n[28]!==y||n[29]!==_||n[30]!==m||n[31]!==C?(i=m&&e(p,{children:[o(g,{children:B}),o(G,{value:f,onChange:_,onSubmit:e=>A(e,a.url),cursorOffset:v,onChangeCursorOffset:y,columns:C,mask:"*"})]}),n[24]=v,n[25]=A,n[26]=a.url,n[27]=f,n[28]=y,n[29]=_,n[30]=m,n[31]=C,n[32]=i):i=n[32],n[33]!==r||n[34]!==t||n[35]!==i?(s=e(p,{flexDirection:"column",gap:1,children:[r,t,i]}),n[33]=r,n[34]=t,n[35]=i,n[36]=s):s=n[36],s}case"creating_api_key":{let r;return n[37]===Symbol.for("react.memo_cache_sentinel")?(r=o(p,{flexDirection:"column",gap:1,children:e(p,{children:[o(R,{}),o(g,{children:"Creando API key para Context Code…"})]})}),n[37]=r):r=n[37],r}case"about_to_retry":{let e;return n[38]===Symbol.for("react.memo_cache_sentinel")?(e=o(p,{flexDirection:"column",gap:1,children:o(g,{color:"permission",children:"Reintentando…"})}),n[38]=e):e=n[38],e}case"success":{let t,i;if(n[39]!==c||n[40]!==a.token){const i="openai"===s?"Inicio de sesión en OpenAI / Codex exitoso. Presiona ":"Inicio de sesión exitoso. Presiona ";t="setup-token"===c&&a.token?null:e(r,{children:[b()?.emailAddress?e(g,{dimColor:!0,children:["Sesión iniciada como"," ",o(g,{children:b()?.emailAddress})]}):null,e(g,{color:"success",children:[i,o(g,{bold:!0,children:"Enter"})," para continuar…"]})]}),n[39]=c,n[40]=a.token,n[41]=t}else t=n[41];return n[42]!==t?(i=o(p,{flexDirection:"column",children:t}),n[42]=t,n[43]=i):i=n[43],i}case"error":{let r,t,i;return n[44]!==a.message?(r=e(g,{color:"error",children:["OAuth error: ",a.message]}),n[44]=a.message,n[45]=r):r=n[45],n[46]!==a.toRetry?(t=a.toRetry&&o(p,{marginTop:1,children:e(g,{color:"permission",children:["Press ",o(g,{bold:!0,children:"Enter"})," to retry."]})}),n[46]=a.toRetry,n[47]=t):t=n[47],n[48]!==r||n[49]!==t?(i=e(p,{flexDirection:"column",gap:1,children:[r,t]}),n[48]=r,n[49]=t,n[50]=i):i=n[50],i}default:return null}}
|
|
1
|
+
import{jsxs as e,jsx as o,Fragment as r}from"react/jsx-runtime";import{c as t}from"react/compiler-runtime";import{useCallback as i,useEffect as n,useRef as a,useState as s}from"react";import{logEvent as l}from"../services/analytics/index.js";import{installOAuthTokens as c}from"../cli/handlers/auth.js";import{useTerminalSize as d}from"../hooks/useTerminalSize.js";import{setClipboard as u}from"../ink/termio/osc.js";import{useTerminalNotification as p}from"../ink/useTerminalNotification.js";import{Box as m,Link as h,Text as g}from"../ink.js";import{useKeybinding as f}from"../keybindings/useKeybinding.js";import{getSSLErrorHint as _}from"../services/api/errorUtils.js";import{sendNotification as v}from"../services/notifier.js";import{OAuthService as C}from"../services/oauth/index.js";import{getOAuthRequestDetails as y}from"../services/oauth/client.js";import{checkGeminiGoogleCredentialsValid as A,getOauthAccountInfo as b,saveGeminiGoogleOAuthTokens as k,saveProviderApiKey as x,validateForceLoginOrg as P}from"../utils/auth.js";import{startGeminiCliOAuthFlow as O}from"../services/oauth/geminiCli.js";import{resolveProviderProfile as I}from"../utils/model/providerProfiles.js";import{logError as S}from"../utils/log.js";import{getVisibleProvider as w}from"../utils/model/providerCatalog.js";import{getConfiguredProviderBaseUrl as z,setProviderBaseUrl as D}from"../utils/model/providerBaseUrls.js";import{getSettings_DEPRECATED as M}from"../utils/settings/settings.js";import{Select as T}from"./CustomSelect/select.js";import{KeyboardShortcutHint as E}from"./design-system/KeyboardShortcutHint.js";import{Spinner as j}from"./Spinner.js";import R from"./TextInput.js";const U=["deepseek","minimax","openrouter","zai","nvidia","ollama","openai","claudeai","gemini-google","gemini-api","console"];function sortLoginProviderOptions(e){const o=new Map(U.map((e,o)=>[e,o]));return[...e].sort((e,r)=>(o.get(e.value)??Number.MAX_SAFE_INTEGER)-(o.get(r.value)??Number.MAX_SAFE_INTEGER))}const K="Pega aqui el codigo si se solicita > ";function formatOAuthDebugDetails(e,o){if("openai"!==e)return"";const r=y({provider:e,port:o,isManual:!1});return[`authorize=${r.authorizeUrl}`,`redirect_uri=${r.redirectUri}`,`scope=${r.scopes.join(" ")}`].join("\n")}export function ConsoleOAuthFlow({onDone:r,startingMessage:t,mode:y="login",forceLoginMethod:b,profileName:z}){const T=M()||{},j=b??T.forceLoginMethod,R=T.forceLoginOrgUUID,U="claudeai"===j?"Método de acceso preseleccionado: Plan de suscripción (Context Pro/Max)":"console"===j?"Método de acceso preseleccionado: Facturación por uso de API (Anthropic Console)":"openai"===j?"Método de acceso preseleccionado: OpenAI / Codex OAuth":null,K=p(),[W,L]=s(()=>"setup-token"===y||"claudeai"===j||"console"===j||"openai"===j?{state:"ready_to_start"}:{state:"idle"}),[G,B]=s(""),[N,$]=s(0),[F]=s(()=>new C),[V,X]=s(()=>"openai"===j?"openai":"anthropic"),[Y,q]=s(()=>"setup-token"===y||"claudeai"===j),[H,Z]=s(!1),[J,Q]=s(!1),ee=d().columns-37-1,[oe,re]=s(""),[te,ie]=s(0),[ne,ae]=s(""),[se,le]=s(0),[ce,de]=s(""),[ue,pe]=s(""),[me,he]=s(""),[ge,fe]=s(0),[_e,ve]=s(0),[Ce,ye]=s(0);n(()=>{"claudeai"===j?l("tengu_oauth_claudeai_forced",{}):"console"===j&&l("tengu_oauth_console_forced",{})},[j]),n(()=>{if("about_to_retry"===W.state){const e=setTimeout(L,1e3,W.nextState);return()=>clearTimeout(e)}},[W]),f("confirm:yes",()=>{l("tengu_oauth_success",{loginWithClaudeAi:Y}),r(V)},{context:"Confirmation",isActive:"success"===W.state&&"setup-token"!==y}),n(()=>{if("success"===W.state&&!process.stdin.isTTY){const e=setTimeout(()=>{l("tengu_oauth_success",{loginWithClaudeAi:Y}),r(V)},800);return()=>clearTimeout(e)}},[W.state,V,Y,r]),f("confirm:yes",()=>{L({state:"idle"})},{context:"Confirmation",isActive:"platform_setup"===W.state}),f("confirm:yes",()=>{xe()},{context:"Confirmation",isActive:"provider_google_setup"===W.state}),f("confirm:yes",()=>{"error"===W.state&&W.toRetry&&(B(""),L({state:"about_to_retry",nextState:W.toRetry}))},{context:"Confirmation",isActive:"error"===W.state&&!!W.toRetry}),f("cancel",()=>{L({state:"idle"})},{context:"Confirmation",isActive:"provider_api_key_input"===W.state||"provider_local_setup"===W.state||"provider_google_setup"===W.state||"error"===W.state}),n(()=>{"c"===G&&"waiting_for_login"===W.state&&H&&!J&&(u(W.url).then(e=>{e&&process.stdout.write(e),Q(!0),setTimeout(Q,2e3,!1)}),B(""))},[G,W,H,J]);const Ae=i(async(e,o)=>{const t=e.trim();if(t)try{await x(o,t),re(""),ie(0);const e=w(o).label;v({message:`API key de ${e} guardada`,notificationType:"auth_success"},K),r(o)}catch(e){S(e),L({state:"error",message:e.message,toRetry:{state:"provider_api_key_input",provider:o}})}else L({state:"error",message:"Debes ingresar una API key.",toRetry:{state:"provider_api_key_input",provider:o}})},[r,K]),be=i((e,o)=>{const t=e.trim();if(t)try{const e=D(o,t);ae(e),le(0),v({message:`URL de ${w(o).label} guardada`,notificationType:"auth_success"},K),r(o)}catch(e){S(e),L({state:"error",message:e.message,toRetry:{state:"provider_local_setup",provider:o}})}else L({state:"error",message:"Debes ingresar una URL para Ollama.",toRetry:{state:"provider_local_setup",provider:o}})},[r,K]),ke=i((e,o)=>{if("custom_provider_wizard"===W.state)if("api_key"===e){if(!o.trim())return void L({state:"error",message:"La API key no puede estar vacia.",toRetry:W});L({...W,apiKey:o.trim(),step:"endpoint"})}else if("endpoint"===e){const e=o.trim();if(e&&!e.startsWith("http"))return void L({state:"error",message:"La URL debe empezar con http:// o https://.",toRetry:W});L({...W,endpoint:e||("custom-openai"===W.provider?"https://api.openai.com/v1":"https://api.anthropic.com/v1"),step:"model"})}else if("model"===e){o.trim();const e=W.endpoint||("custom-openai"===W.provider?"https://api.openai.com/v1":"https://api.anthropic.com/v1");x(W.provider,W.apiKey).then(()=>{D(W.provider,e),v({message:`Configuracion de ${w(W.provider).label} guardada`,notificationType:"auth_success"},K),r(W.provider)}).catch(e=>{S(e),L({state:"error",message:e.message,toRetry:W})})}},[r,W,K]),xe=i(async()=>{L({state:"provider_google_auth_running"});try{if(await A())return void r("gemini-google");const e=await O();k(e);if(!await A())return v({message:"OAuth de Gemini guardado; Code Assist no valido el proyecto de cuota",notificationType:"auth_success"},K),void r("gemini-google");v({message:"Credenciales de Gemini Google listas",notificationType:"auth_success"},K),r("gemini-google")}catch(e){S(e),L({state:"error",message:e.message,toRetry:{state:"provider_google_setup"}})}},[r,K]),Pe=i(async()=>{try{l("tengu_oauth_flow_start",{loginWithClaudeAi:Y,provider:V});const e=await F.startOAuthFlow(async e=>{L({state:"waiting_for_login",url:e}),setTimeout(Z,3e3,!0)},{loginWithClaudeAi:Y,provider:V,inferenceOnly:"setup-token"===y,expiresIn:"setup-token"===y?31536e3:void 0,orgUUID:R}).catch(e=>{const o=e.message.includes("Token exchange failed"),r=_(e),t=F.getPort(),i="openai"===V&&t?formatOAuthDebugDetails(V,t):"";throw L({state:"error",message:r??(o?"No se pudo intercambiar el codigo de autorizacion por el token de acceso. Intentalo de nuevo."+(i?`\n${i}`:""):e.message),toRetry:"setup-token"===y?{state:"ready_to_start"}:{state:"idle"}}),l("tengu_oauth_token_exchange_error",{error:e.message,ssl_error:null!==r}),e});if("setup-token"===y)L({state:"success",token:e.accessToken});else{L({state:"creating_api_key"});const o=z?I("openai"===V?"openai":"anthropic",z):void 0;if(await c(e,V,o?.id),"anthropic"===V){const e=await P();if(!e.valid)throw new Error(e.message)}L({state:"success"}),v({message:"openai"===V?"Inicio de sesión con OpenAI / Codex completado":"Inicio de sesión en Context Code completado",notificationType:"auth_success"},K)}}catch(e){const o=e.message,r=_(e),t=F.getPort(),i="openai"===V&&t?formatOAuthDebugDetails(V,t):"";L({state:"error",message:r??("openai"===V&&i&&!o.includes("redirect_uri=")?`${o}\n${i}`:o),toRetry:{state:"setup-token"===y?"ready_to_start":"idle"}}),l("tengu_oauth_error",{error:o,ssl_error:null!==r})}},[V,F,Z,Y,y,R,K]),Oe=a(!1);return n(()=>{"ready_to_start"!==W.state||Oe.current||(Oe.current=!0,process.nextTick((e,o)=>{e(),o.current=!1},Pe,Oe))},[W.state,Pe]),n(()=>{if("setup-token"===y&&"success"===W.state){const e=setTimeout((e,o)=>{l("tengu_oauth_success",{loginWithClaudeAi:e}),o(V)},500,Y,r,V);return()=>clearTimeout(e)}},[y,W,Y,r,V]),n(()=>()=>{F.cleanup()},[F]),e(m,{flexDirection:"column",gap:1,children:["waiting_for_login"===W.state&&H&&e(m,{flexDirection:"column",gap:1,paddingBottom:1,children:[e(m,{paddingX:1,children:[e(g,{dimColor:!0,children:["Browser didn't open? Use the url below to sign in"," "]}),o(g,J?{color:"success",children:"(Copied!)"}:{dimColor:!0,children:o(E,{shortcut:"c",action:"copiar",parens:!0})})]}),o(h,{url:W.url,children:o(g,{dimColor:!0,children:W.url})})]},"urlToCopy"),"setup-token"===y&&"success"===W.state&&W.token&&e(m,{flexDirection:"column",gap:1,paddingTop:1,children:[o(g,{color:"success",children:"✓ Long-lived authentication token created successfully!"}),e(m,{flexDirection:"column",gap:1,children:[o(g,{children:"Your OAuth token (valid for 1 year):"}),o(g,{color:"warning",children:W.token}),o(g,{dimColor:!0,children:"Store this token securely. You won't be able to see it again."}),o(g,{dimColor:!0,children:"Use this token by setting: export CONTEXT_CODE_OAUTH_TOKEN=<token>"})]})]},"tokenOutput"),o(m,{paddingLeft:1,flexDirection:"column",gap:1,children:o(OAuthStatusMessage,{oauthStatus:W,oauthProvider:V,mode:y,startingMessage:t,forcedMethodMessage:U,showPastePrompt:H,pastedCode:G,setPastedCode:B,cursorOffset:N,setCursorOffset:$,textInputColumns:ee,handleSubmitCode:async function(e,o){try{const[r,t]=e.split("#");if(!r||!t)return void L({state:"error",message:"Codigo invalido. Asegurate de copiar el codigo completo",toRetry:{state:"waiting_for_login",url:o}});l("tengu_oauth_manual_entry",{}),F.handleManualAuthCodeInput({authorizationCode:r,state:t})}catch(e){S(e),L({state:"error",message:e.message,toRetry:{state:"waiting_for_login",url:o}})}},setOAuthStatus:L,setLoginWithClaudeAi:q,setOAuthProvider:X,providerApiKey:oe,setProviderApiKey:re,providerApiKeyCursorOffset:te,setProviderApiKeyCursorOffset:ie,handleProviderApiKeySubmit:Ae,providerBaseUrl:ne,setProviderBaseUrlInput:ae,providerBaseUrlCursorOffset:se,setProviderBaseUrlCursorOffset:le,handleProviderBaseUrlSubmit:be,onDone:r,wizardApiKey:ce,setWizardApiKey:de,wizardEndpoint:ue,setWizardEndpoint:pe,wizardModel:me,setWizardModel:he,wizardApiKeyCursor:ge,setWizardApiKeyCursor:fe,wizardEndpointCursor:_e,setWizardEndpointCursor:ve,wizardModelCursor:Ce,setWizardModelCursor:ye,handleCustomProviderWizardSubmit:ke})})]})}function OAuthStatusMessage(i){const n=t(68),{oauthStatus:a,oauthProvider:s,mode:c,startingMessage:d,forcedMethodMessage:u,showPastePrompt:p,pastedCode:f,setPastedCode:_,cursorOffset:v,setCursorOffset:C,textInputColumns:y,handleSubmitCode:A,setOAuthStatus:k,setLoginWithClaudeAi:x,setOAuthProvider:P,providerApiKey:O,setProviderApiKey:I,providerApiKeyCursorOffset:S,setProviderApiKeyCursorOffset:D,handleProviderApiKeySubmit:M,providerBaseUrl:E,setProviderBaseUrlInput:U,providerBaseUrlCursorOffset:W,setProviderBaseUrlCursorOffset:L,handleProviderBaseUrlSubmit:G,onDone:B,wizardApiKey:N,setWizardApiKey:$,wizardEndpoint:F,setWizardEndpoint:V,wizardModel:X,setWizardModel:Y,wizardApiKeyCursor:q,setWizardApiKeyCursor:H,wizardEndpointCursor:Z,setWizardEndpointCursor:J,wizardModelCursor:Q,setWizardModelCursor:ee,handleCustomProviderWizardSubmit:oe}=i;switch(a.state){case"idle":{const r=d||"Context Code puede usarse con tu suscripción de Claude, la facturación de Anthropic Console o OpenAI / Codex OAuth.";let t,i,a,s,c,u,p;return n[0]!==r?(t=o(g,{bold:!0,children:r}),n[0]=r,n[1]=t):t=n[1],n[2]===Symbol.for("react.memo_cache_sentinel")?(i=o(g,{children:"Selecciona el metodo de acceso:"}),n[2]=i):i=n[2],n[3]===Symbol.for("react.memo_cache_sentinel")?(a={label:e(g,{children:["Claude account with subscription ·"," ",o(g,{dimColor:!0,children:"Pro, Max, Team, or Enterprise"}),!1,"\n"]}),value:"claudeai"},n[3]=a):a=n[3],n[4]===Symbol.for("react.memo_cache_sentinel")?(s={label:e(g,{children:["Anthropic Console account ·"," ",o(g,{dimColor:!0,children:"API usage billing"}),"\n"]}),value:"console"},n[4]=s):s=n[4],n[5]===Symbol.for("react.memo_cache_sentinel")?(c=[a,s,{label:e(g,{children:["Cuenta de OpenAI / Codex ·"," ",o(g,{dimColor:!0,children:"Login OAuth"}),"\n"]}),value:"openai"},{label:e(g,{children:["OpenRouter ·"," ",o(g,{dimColor:!0,children:"API key / OpenAI-compatible"}),"\n"]}),value:"openrouter"},{label:e(g,{children:["Ollama ·"," ",o(g,{dimColor:!0,children:"Servidor local compatible"}),"\n"]}),value:"ollama"},{label:e(g,{children:["Gemini API - ",o(g,{dimColor:!0,children:"API key / OpenAI-compatible"}),"\n"]}),value:"gemini-api"},{label:e(g,{children:["Gemini Google - ",o(g,{dimColor:!0,children:"OAuth/ADC de Google"}),"\n"]}),value:"gemini-google"},{label:e(g,{children:["Z.AI ·"," ",o(g,{dimColor:!0,children:"API key / OpenAI-compatible"}),"\n"]}),value:"zai"},{label:e(g,{children:["MiniMax ·"," ",o(g,{dimColor:!0,children:"API key / Anthropic-compatible"}),"\n"]}),value:"minimax"},{label:e(g,{children:["NVIDIA API ·"," ",o(g,{dimColor:!0,children:"API key / build.nvidia.com"}),"\n"]}),value:"nvidia"},{label:e(g,{children:["DeepSeek ·"," ",o(g,{dimColor:!0,children:"API key / contexto 1M (V4)"}),"\n"]}),value:"deepseek"},{label:e(g,{children:["Custom OpenAI ·"," ",o(g,{dimColor:!0,children:"Wizard API key + endpoint"}),"\n"]}),value:"custom-openai"},{label:e(g,{children:["Custom Anthropic ·"," ",o(g,{dimColor:!0,children:"Wizard API key + endpoint"}),"\n"]}),value:"custom-anthropic"}],n[5]=c):c=n[5],n[6]!==x||n[7]!==k||n[8]!==P||n[65]!==B?(u=o(m,{children:o(T,{options:sortLoginProviderOptions(c),onChange:e=>{"platform"===e?(l("tengu_oauth_platform_selected",{}),k({state:"platform_setup"})):"openai"===e?(l("tengu_oauth_openai_selected",{}),P("openai"),x(!1),k({state:"ready_to_start"})):"openrouter"===e?k({state:"provider_api_key_input",provider:"openrouter"}):"gemini-api"===e||"zai"===e||"minimax"===e||"nvidia"===e||"deepseek"===e?k({state:"provider_api_key_input",provider:e}):"gemini-google"===e?k({state:"provider_google_setup"}):"ollama"===e||"ollama-cloud"===e?(U(z(e)),L(0),k({state:"provider_local_setup",provider:e})):"custom-openai"===e||"custom-anthropic"===e?k({state:"custom_provider_wizard",provider:e,step:"api_key",apiKey:"",endpoint:"custom-openai"===e?"https://api.openai.com/v1":"https://api.anthropic.com/v1",model:""}):(P("anthropic"),k({state:"ready_to_start"}),"claudeai"===e?(l("tengu_oauth_claudeai_selected",{}),x(!0)):(l("tengu_oauth_console_selected",{}),x(!1)))}})}),n[6]=x,n[7]=k,n[8]=P,n[65]=B,n[66]=u):u=n[66],n[10]!==t||n[11]!==u?(p=e(m,{flexDirection:"column",gap:1,marginTop:1,children:[t,i,u]}),n[10]=t,n[11]=u,n[12]=p):p=n[12],p}case"provider_api_key_input":{let r,t,i,s;if(n[50]!==a.provider?(r=e(g,{bold:!0,children:["Ingresa la API key de ",w(a.provider).label]}),n[50]=a.provider,n[51]=r):r=n[51],n[52]!==a.provider){const r=w(a.provider);t=e(m,{flexDirection:"column",gap:0,children:[o(g,{dimColor:!0,children:r.description}),e(g,{dimColor:!0,children:["Siguiente paso: ",r.setup.nextStep]})]}),n[52]=a.provider,n[53]=t}else t=n[53];return n[54]!==O||n[55]!==S||n[56]!==I||n[57]!==D||n[58]!==y||n[59]!==M?(i=e(m,{children:[o(g,{children:"API key > "}),o(R,{value:O,onChange:I,onSubmit:e=>M(e,a.provider),cursorOffset:S,onChangeCursorOffset:D,columns:y,mask:"*"})]}),n[54]=O,n[55]=S,n[56]=I,n[57]=D,n[58]=y,n[59]=M,n[60]=i):i=n[60],n[61]!==r||n[62]!==t||n[63]!==i?(s=e(m,{flexDirection:"column",gap:1,children:[r,t,i]}),n[61]=r,n[62]=t,n[63]=i,n[64]=s):s=n[64],s}case"provider_local_setup":{const r=w(a.provider);return e(m,{flexDirection:"column",gap:1,children:[o(g,{bold:!0,children:r.label}),o(g,{dimColor:!0,children:r.setup.intro}),o(g,{dimColor:!0,children:r.setup.nextStep}),o(g,{children:"URL del servidor > "}),o(m,{children:o(R,{value:E,onChange:U,onSubmit:e=>G(e,a.provider),cursorOffset:W,onChangeCursorOffset:L,columns:y})}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para guardar la URL y continuar."]})]})}case"provider_google_setup":return e(m,{flexDirection:"column",gap:1,children:[o(g,{bold:!0,children:"Gemini Google OAuth"}),o(g,{dimColor:!0,children:"Context Code usara el flujo OAuth compatible con Gemini CLI y abrira Google en el navegador."}),o(g,{dimColor:!0,children:"Se guardara el access token y refresh token en el perfil activo de Gemini Google."}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para iniciar sesion con tu cuenta de Google."]})]});case"provider_google_auth_running":return e(m,{children:[o(j,{}),o(g,{children:"Abriendo Google OAuth para Gemini..."})]});case"custom_provider_wizard":{const r=w(a.provider),t="custom-openai"===a.provider?"https://api.openai.com/v1":"https://api.anthropic.com/v1";if("api_key"===a.step)return e(m,{flexDirection:"column",gap:1,children:[e(g,{bold:!0,children:[r.label," - Paso 1/3"]}),e(g,{dimColor:!0,children:["Ingresa tu API key para ",r.label,"."]}),o(g,{children:"API key > "}),o(m,{children:o(R,{value:N,onChange:$,onSubmit:e=>oe("api_key",e),cursorOffset:q,onChangeCursorOffset:H,columns:y,mask:"*"})}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para continuar al siguiente paso."]})]});if("endpoint"===a.step)return e(m,{flexDirection:"column",gap:1,children:[e(g,{bold:!0,children:[r.label," - Paso 2/3"]}),e(g,{dimColor:!0,children:["URL del endpoint (Enter para usar default: ",t,")"]}),o(g,{children:"Endpoint > "}),o(m,{children:o(R,{value:F,onChange:V,onSubmit:e=>oe("endpoint",e),cursorOffset:Z,onChangeCursorOffset:J,columns:y})}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para usar el default o ingresa tu propia URL."]}),o(g,{dimColor:!0,children:"Puedes saltar este paso presionando Enter directamente."})]});if("model"===a.step)return e(m,{flexDirection:"column",gap:1,children:[e(g,{bold:!0,children:[r.label," - Paso 3/3"]}),o(g,{dimColor:!0,children:"Modelo a usar (opcional, puedes dejarlo en blanco)."}),o(g,{dimColor:!0,children:"Podras cambiarlo luego con el comando /model."}),o(g,{children:"Modelo > "}),o(m,{children:o(R,{value:X,onChange:Y,onSubmit:e=>oe("model",e),cursorOffset:Q,onChangeCursorOffset:ee,columns:y})}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para guardar la configuracion."]})]});break}case"platform_setup":{let r,t,i,a,s,l,c,d;return n[12]===Symbol.for("react.memo_cache_sentinel")?(r=o(g,{bold:!0,children:"Usando plataformas de terceros"}),n[12]=r):r=n[12],n[13]===Symbol.for("react.memo_cache_sentinel")?(t=o(g,{children:"Context Code soporta Amazon Bedrock, Microsoft Foundry y Vertex AI. Configura las variables de entorno requeridas y luego reinicia Context Code."}),i=o(g,{children:"Si formas parte de una organización empresarial, contacta a tu administrador para las instrucciones de configuración."}),n[13]=t,n[14]=i):(t=n[13],i=n[14]),n[15]===Symbol.for("react.memo_cache_sentinel")?(a=o(g,{bold:!0,children:"Documentation:"}),n[15]=a):a=n[15],n[16]===Symbol.for("react.memo_cache_sentinel")?(s=e(g,{children:["· Amazon Bedrock:"," ",o(h,{url:"https://docs.iaforged.com/",children:"https://docs.iaforged.com/"})]}),n[16]=s):s=n[16],n[17]===Symbol.for("react.memo_cache_sentinel")?(l=e(g,{children:["· Microsoft Foundry:"," ",o(h,{url:"https://docs.iaforged.com/",children:"https://docs.iaforged.com/"})]}),n[17]=l):l=n[17],n[18]===Symbol.for("react.memo_cache_sentinel")?(c=e(m,{flexDirection:"column",marginTop:1,children:[a,s,l,e(g,{children:["· Vertex AI:"," ",o(h,{url:"https://docs.iaforged.com/",children:"https://docs.iaforged.com/"})]})]}),n[18]=c):c=n[18],n[19]===Symbol.for("react.memo_cache_sentinel")?(d=e(m,{flexDirection:"column",gap:1,marginTop:1,children:[r,e(m,{flexDirection:"column",gap:1,children:[t,i,c,o(m,{marginTop:1,children:e(g,{dimColor:!0,children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para volver a las opciones de acceso."]})})]})]}),n[19]=d):d=n[19],d}case"waiting_for_login":{let r,t,i,s;return n[20]!==u?(r=u&&o(m,{children:o(g,{dimColor:!0,children:u})}),n[20]=u,n[21]=r):r=n[21],n[22]!==p?(t=!p&&e(m,{children:[o(j,{}),o(g,{children:"Abriendo el navegador para iniciar sesión…"})]}),n[22]=p,n[23]=t):t=n[23],n[24]!==v||n[25]!==A||n[26]!==a.url||n[27]!==f||n[28]!==C||n[29]!==_||n[30]!==p||n[31]!==y?(i=p&&e(m,{children:[o(g,{children:K}),o(R,{value:f,onChange:_,onSubmit:e=>A(e,a.url),cursorOffset:v,onChangeCursorOffset:C,columns:y,mask:"*"})]}),n[24]=v,n[25]=A,n[26]=a.url,n[27]=f,n[28]=C,n[29]=_,n[30]=p,n[31]=y,n[32]=i):i=n[32],n[33]!==r||n[34]!==t||n[35]!==i?(s=e(m,{flexDirection:"column",gap:1,children:[r,t,i]}),n[33]=r,n[34]=t,n[35]=i,n[36]=s):s=n[36],s}case"creating_api_key":{let r;return n[37]===Symbol.for("react.memo_cache_sentinel")?(r=o(m,{flexDirection:"column",gap:1,children:e(m,{children:[o(j,{}),o(g,{children:"Creando API key para Context Code…"})]})}),n[37]=r):r=n[37],r}case"about_to_retry":{let e;return n[38]===Symbol.for("react.memo_cache_sentinel")?(e=o(m,{flexDirection:"column",gap:1,children:o(g,{color:"permission",children:"Reintentando…"})}),n[38]=e):e=n[38],e}case"success":{let t,i;if(n[39]!==c||n[40]!==a.token){const i="openai"===s?"Inicio de sesión en OpenAI / Codex exitoso. Presiona ":"Inicio de sesión exitoso. Presiona ";t="setup-token"===c&&a.token?null:e(r,{children:[b()?.emailAddress?e(g,{dimColor:!0,children:["Sesión iniciada como"," ",o(g,{children:b()?.emailAddress})]}):null,e(g,{color:"success",children:[i,o(g,{bold:!0,children:"Enter"})," para continuar…"]})]}),n[39]=c,n[40]=a.token,n[41]=t}else t=n[41];return n[42]!==t?(i=o(m,{flexDirection:"column",children:t}),n[42]=t,n[43]=i):i=n[43],i}case"error":{let r,t,i;return n[44]!==a.message?(r=e(g,{color:"error",children:["OAuth error: ",a.message]}),n[44]=a.message,n[45]=r):r=n[45],n[46]!==a.toRetry?(t=a.toRetry&&o(m,{marginTop:1,children:e(g,{color:"permission",children:["Press ",o(g,{bold:!0,children:"Enter"})," to retry."]})}),n[46]=a.toRetry,n[47]=t):t=n[47],n[48]!==r||n[49]!==t?(i=e(m,{flexDirection:"column",gap:1,children:[r,t]}),n[48]=r,n[49]=t,n[50]=i):i=n[50],i}default:return null}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{clearProviderProfileBaseUrl as r,getProviderProfileBaseUrl as
|
|
1
|
+
import{clearProviderProfileBaseUrl as r,getProviderProfileBaseUrl as t,setProviderProfileBaseUrl as e}from"./providerProfiles.js";import{clearStoredProviderBaseUrl as i,getStoredProviderBaseUrl as o,setStoredProviderBaseUrl as a}from"./providerProfilesDb.js";const n={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",nvidia:"https://integrate.api.nvidia.com/v1",deepseek:"https://api.deepseek.com/v1","custom-openai":"https://api.openai.com/v1","custom-anthropic":"https://api.anthropic.com/v1"};function trimTrailingSlash(r){return r.endsWith("/")?r.slice(0,-1):r}export function getDefaultProviderBaseUrl(r){return n[r]}export function getConfiguredProviderBaseUrl(r){const e=t(r)?.trim();if(e)try{return normalizeProviderBaseUrl(r,e)}catch{return e}const i=o(r)?.trim();if(i)try{return normalizeProviderBaseUrl(r,i)}catch{return i}return getDefaultProviderBaseUrl(r)}export function isProviderBaseUrlCustomized(r){return Boolean(t(r)?.trim()||o(r)?.trim())}export function normalizeProviderBaseUrl(r,t){const e=function(r,t){const e=t.trim();if(!e)throw new Error("La base URL no puede estar vacia.");try{return new URL(e)}catch{return new URL(`${"ollama"===r||"ollama-cloud"===r?"http://":"https://"}${e}`)}}(r,t),i=`${e.protocol}//${e.host}${e.pathname}${e.search}${e.hash}`;return"zai"===r||"minimax"===r||"gemini-api"===r||"gemini-google"===r||"nvidia"===r?trimTrailingSlash(i):function(r){const t=trimTrailingSlash(r);return t.endsWith("/v1")?t:`${t}/v1`}(i)}export function setProviderBaseUrl(r,t){const i=normalizeProviderBaseUrl(r,t);return e(r,i),a(r,i),i}export function clearProviderBaseUrl(t){r(t),i(t)}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const VISIBLE_PROVIDERS=[{id:"minimax",label:"MiniMax",description:"API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de MiniMax.",nextStep:"Despues, elige un modelo MiniMax compatible con Anthropic desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"openrouter",label:"OpenRouter",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenRouter.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"ollama",label:"Ollama",description:"Servidor Ollama compatible. Incluye modelos locales y modelos cloud si hiciste ollama signin.",setup:{kind:"local-server",intro:"Esto solo configura el servidor Ollama; no abre un login OAuth.",nextStep:"Asegurate de tener ollama serve activo. Si usas cloud, ejecuta ollama signin fuera del CLI.",actionLabel:"Continuar con Ollama"},implemented:!0},{id:"ollama-cloud",label:"Ollama Cloud",description:"Modelos cloud desde tu servidor Ollama autenticado con ollama signin.",setup:{kind:"local-server",intro:"Esto usa tu servidor Ollama ya autenticado; no abre un login OAuth.",nextStep:"Ejecuta ollama signin fuera del CLI, usa http://localhost:11434/v1 y despues elige un modelo cloud desde /model.",actionLabel:"Continuar con Ollama Cloud"},implemented:!0},{id:"openai",label:"OpenAI / Codex",description:"OAuth de OpenAI",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de OpenAI / Codex.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con OpenAI"},implemented:!0},{id:"gemini-google",label:"Gemini Google OAuth",description:"Cuenta Google mediante OAuth compatible con Gemini CLI.",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Google usando el flujo OAuth de Gemini CLI.",nextStep:"Usa /login y elige Gemini Google para abrir el navegador y guardar el token OAuth.",actionLabel:"Continuar con Google"},implemented:!0},{id:"gemini-api",label:"Gemini API",description:"API key de Google AI Studio, usando endpoint OpenAI-compatible.",setup:{kind:"api-key",intro:"Pega tu API key de Gemini / Google AI Studio.",nextStep:"Despues, elige un modelo Gemini desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"zai",label:"Z.AI",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Z.AI.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"nvidia",label:"NVIDIA API",description:"API key propia de NVIDIA NIM / build.nvidia.com. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NVIDIA.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"deepseek",label:"DeepSeek",description:"API key propia de api.deepseek.com (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DeepSeek (sk-...).",nextStep:"Despues, elige un modelo como deepseek-chat o deepseek-reasoner desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"claude",label:"Claude (Anthropic)",description:"Suscripcion Claude o Anthropic Console",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Claude o Anthropic Console.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con Claude"},implemented:!0}];export function getVisibleProvider(e){const o=VISIBLE_PROVIDERS.find(o=>o.id===e);if(!o)throw new Error(`Unknown provider: ${e}`);return o}
|
|
1
|
+
export const VISIBLE_PROVIDERS=[{id:"minimax",label:"MiniMax",description:"API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de MiniMax.",nextStep:"Despues, elige un modelo MiniMax compatible con Anthropic desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"openrouter",label:"OpenRouter",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenRouter.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"ollama",label:"Ollama",description:"Servidor Ollama compatible. Incluye modelos locales y modelos cloud si hiciste ollama signin.",setup:{kind:"local-server",intro:"Esto solo configura el servidor Ollama; no abre un login OAuth.",nextStep:"Asegurate de tener ollama serve activo. Si usas cloud, ejecuta ollama signin fuera del CLI.",actionLabel:"Continuar con Ollama"},implemented:!0},{id:"ollama-cloud",label:"Ollama Cloud",description:"Modelos cloud desde tu servidor Ollama autenticado con ollama signin.",setup:{kind:"local-server",intro:"Esto usa tu servidor Ollama ya autenticado; no abre un login OAuth.",nextStep:"Ejecuta ollama signin fuera del CLI, usa http://localhost:11434/v1 y despues elige un modelo cloud desde /model.",actionLabel:"Continuar con Ollama Cloud"},implemented:!0},{id:"openai",label:"OpenAI / Codex",description:"OAuth de OpenAI",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de OpenAI / Codex.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con OpenAI"},implemented:!0},{id:"gemini-google",label:"Gemini Google OAuth",description:"Cuenta Google mediante OAuth compatible con Gemini CLI.",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Google usando el flujo OAuth de Gemini CLI.",nextStep:"Usa /login y elige Gemini Google para abrir el navegador y guardar el token OAuth.",actionLabel:"Continuar con Google"},implemented:!0},{id:"gemini-api",label:"Gemini API",description:"API key de Google AI Studio, usando endpoint OpenAI-compatible.",setup:{kind:"api-key",intro:"Pega tu API key de Gemini / Google AI Studio.",nextStep:"Despues, elige un modelo Gemini desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"zai",label:"Z.AI",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Z.AI.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"nvidia",label:"NVIDIA API",description:"API key propia de NVIDIA NIM / build.nvidia.com. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NVIDIA.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"deepseek",label:"DeepSeek",description:"API key propia de api.deepseek.com (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DeepSeek (sk-...).",nextStep:"Despues, elige un modelo como deepseek-chat o deepseek-reasoner desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"claude",label:"Claude (Anthropic)",description:"Suscripcion Claude o Anthropic Console",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Claude o Anthropic Console.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con Claude"},implemented:!0},{id:"custom-openai",label:"Custom OpenAI",description:"API key y endpoint personalizado para OpenAI-compatible. Ideal para proxies o servidores propios.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom OpenAI"},implemented:!0},{id:"custom-anthropic",label:"Custom Anthropic",description:"API key y endpoint personalizado para Anthropic-compatible. Ideal para instalaciones on-premise.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom Anthropic"},implemented:!0}];export function getVisibleProvider(e){const o=VISIBLE_PROVIDERS.find(o=>o.id===e);if(!o)throw new Error(`Unknown provider: ${e}`);return o}
|
|
@@ -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,h as
|
|
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 as E,h as f,i as m,j as y,k as O,l as k,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(O(()=>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 k(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),E(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=f,this.notificationClicks=f,void(this.subscription=f);this.messages=this.sw.eventsOfType("PUSH").pipe(E(e=>e.data)),this.notificationClicks=this.sw.eventsOfType("NOTIFICATION_CLICK").pipe(E(e=>e.data)),this.pushManager=this.sw.registration.pipe(E(e=>e.pushManager));let r=this.pushManager.pipe(O(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(O(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 k(5602,!1);return e.unsubscribe().then(e=>{if(!e)throw new k(5603,!1);this.subscriptionChanges.next(null)})};return new Promise((e,r)=>{this.subscription.pipe(y(1),O(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=f,void(this.unrecoverable=f);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 k(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 k(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,10 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@iaforged/context-code",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.2.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",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/context-bootstrap.js",
|
|
10
|
+
"./core": {
|
|
11
|
+
"types": "./src/core/index.ts",
|
|
12
|
+
"default": "./dist/src/core/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
8
15
|
"bin": {
|
|
9
16
|
"context": "context-bootstrap.js",
|
|
10
17
|
"context-recovery": "context-bootstrap.js",
|
|
@@ -13,6 +20,7 @@
|
|
|
13
20
|
"engines": {
|
|
14
21
|
"node": ">=18.0.0"
|
|
15
22
|
},
|
|
23
|
+
"packageManager": "pnpm@11.1.2",
|
|
16
24
|
"files": [
|
|
17
25
|
"context-bootstrap.js",
|
|
18
26
|
"contextcode-bootstrap.js",
|
|
@@ -142,5 +150,35 @@
|
|
|
142
150
|
"@img/sharp-win32-x64": "^0.34.2",
|
|
143
151
|
"@whiskeysockets/baileys": "7.0.0-rc.9"
|
|
144
152
|
},
|
|
145
|
-
"scripts": {
|
|
146
|
-
|
|
153
|
+
"scripts": {
|
|
154
|
+
"dev": "pnpm --dir ../webapp run build && pnpm build:fast && node ./context-bootstrap.js",
|
|
155
|
+
"dev:code": "pnpm --dir ../webapp run build && pnpm build:fast && node ./contextcode-bootstrap.js",
|
|
156
|
+
"build": "tsc -p tsconfig.json && node ./scripts/postprocess-build.mjs && node ./scripts/minify-dist.mjs",
|
|
157
|
+
"build:fast": "tsc -p tsconfig.json && node ./scripts/postprocess-build.mjs",
|
|
158
|
+
"smoke:provider-parity": "pnpm build:fast && node ./dist/src/core/providers/providerParitySmoke.js",
|
|
159
|
+
"smoke:core-query-wiring": "pnpm build:fast && node ./dist/src/core/query/wiring.smoke.js",
|
|
160
|
+
"smoke:core-all": "pnpm build:fast && node ./dist/src/core/query/wiring.smoke.js && node ./dist/src/core/tools/fileResolution.smoke.js && node ./dist/src/core/tools/filesCore.smoke.js && node ./dist/src/core/tools/notebookParity.smoke.js && node ./dist/src/core/tools/imageParity.smoke.js && node ./dist/src/core/tools/pdfParity.smoke.js && node ./dist/src/core/providers/providerParitySmoke.js && node ./dist/src/core/skills/runtime.smoke.js && node ./dist/src/core/syncFlags.smoke.js && node ./dist/src/core/tasks/persistence.smoke.js",
|
|
161
|
+
"pubpackages": "bash ./scripts/pubpackages.sh",
|
|
162
|
+
"prepublishOnly": "node ./scripts/preflight-check.mjs",
|
|
163
|
+
"docs:dev": "pnpm --dir ../../docs docs:dev",
|
|
164
|
+
"docs:build": "pnpm --dir ../../docs docs:build",
|
|
165
|
+
"docs:preview": "pnpm --dir ../../docs docs:preview",
|
|
166
|
+
"docs:open": "pnpm --dir ../../docs docs:open"
|
|
167
|
+
},
|
|
168
|
+
"pnpm": {
|
|
169
|
+
"onlyBuiltDependencies": [
|
|
170
|
+
"cpu-features",
|
|
171
|
+
"ssh2"
|
|
172
|
+
]
|
|
173
|
+
},
|
|
174
|
+
"devDependencies": {
|
|
175
|
+
"@types/bun": "^1.3.14",
|
|
176
|
+
"@types/node": "^25.8.0",
|
|
177
|
+
"@types/node-notifier": "^8.0.5",
|
|
178
|
+
"@types/react": "^19.2.14",
|
|
179
|
+
"@types/react-reconciler": "^0.33.0",
|
|
180
|
+
"@types/ssh2": "^1.15.5",
|
|
181
|
+
"terser": "^5.47.1",
|
|
182
|
+
"typescript": "^5.9.3"
|
|
183
|
+
}
|
|
184
|
+
}
|