@iaforged/context-code 2.2.7 → 2.2.9

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
- export default{type:"local-jsx",name:"provider",aliases:["proveedor","proveedores"],description:"Cambiar entre proveedores y configurar endpoints sin cerrar sesion",argumentHint:"[list|current|claude|openai|openrouter|ollama|ollama-cloud|gemini-api|gemini-google|zai|minimax|nvidia] [baseURL|clear]",isEnabled:()=>!0,load:()=>import("./provider.js")};
1
+ export default{type:"local-jsx",name:"provider",aliases:["proveedor","proveedores"],description:"Cambiar entre proveedores y configurar endpoints sin cerrar sesion",argumentHint:"[list|current|claude|openai|openrouter|ollama|ollama-cloud|gemini-api|gemini-google|zai|minimax|nvidia|deepseek|custom-openai|custom-anthropic] [baseURL|clear]",isEnabled:()=>!0,load:()=>import("./provider.js")};
@@ -1 +1 @@
1
- import{jsx as e,jsxs as r}from"react/jsx-runtime";import{Select as o}from"../../components/CustomSelect/select.js";import*as i from"react";import{Box as a,Text as n}from"../../ink.js";import{useMainLoopModel as t}from"../../hooks/useMainLoopModel.js";import{useSetAppState as l}from"../../state/AppState.js";import{getStoredActiveProviderPreference as d}from"../../utils/model/providerProfilesDb.js";import{getCoreCurrentProviderProfile as s,getCoreProviderLabel as u,isCoreProviderEnabled as c,isCoreSelectedProfileReady as p,listCoreProviderProfiles as m,normalizeCoreProviderInput as g,setCoreActiveProfile as f,switchCoreProvider as v}from"../../core/providers/providerCore.js";import{getAPIProvider as b,isGeminiApiProviderConfigured as P,isGeminiGoogleProviderConfigured as h,isNvidiaProviderConfigured as $,isOllamaCloudProviderConfigured as y,isMiniMaxProviderConfigured as U,isOpenAIProviderConfigured as C,isOpenRouterProviderConfigured as L,isZAIProviderConfigured as w}from"../../utils/model/providers.js";import{clearProviderBaseUrl as M,getConfiguredProviderBaseUrl as S,getDefaultProviderBaseUrl as x,isProviderBaseUrlCustomized as I,setProviderBaseUrl as j}from"../../utils/model/providerBaseUrls.js";import{getVisibleProvider as A,VISIBLE_PROVIDERS as R}from"../../utils/model/providerCatalog.js";import{getActiveProviderProfile as E,getLastUsedProviderProfile as N,isProfiledProvider as k,listProviderProfiles as z,setActiveProfileForProvider as B}from"../../utils/model/providerProfiles.js";import{switchProviderPreference as O}from"../../utils/model/providerSwitch.js";import{clearAuthRelatedCaches as D}from"../logout/logout.js";import{call as G}from"../login/login.js";import{call as q}from"../login-openai/login-openai.js";import T from"chalk";import{getStoredProviderOAuthTokens as V,hasStoredProviderApiKey as W,hasStoredProviderOAuthTokens as F}from"../../utils/auth.js";const K=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","nvidia"];function isConfigurableBaseUrlProvider(e){return K.includes(e)}function getProviderLabel(e){return c()?u(e):A(e).label}function getCurrentProviderBaseUrl(e){return I(e)?S(e):x(e)}function getProviderSetupMessage(e){const r=getCurrentProviderBaseUrl(e);switch(e){case"ollama":return`Ollama usa un servidor local compatible. Endpoint actual: ${r}. Puedes cambiarlo con /provider ollama <baseURL> o restaurar el default con /provider ollama clear.`;case"ollama-cloud":return`Ollama Cloud usa por defecto tu host local autenticado. Endpoint actual: ${r}. Ejecuta 'ollama signin' y luego usa /provider ollama-cloud.`;case"gemini-api":return`Gemini API requiere una API key de Google AI Studio. Endpoint actual: ${r}. Usa /login para guardarla o /provider gemini-api <baseURL> para cambiar el endpoint.`;case"gemini-google":return`Gemini Google usa OAuth compatible con Gemini CLI. Endpoint actual: ${r}. Usa /login y elige Gemini Google para abrir el navegador y guardar el token.`;case"zai":return"Z.AI requiere una API key. Usa /login para guardarla y /provider zai <baseURL> para cambiar el endpoint si hace falta.";case"minimax":return"MiniMax requiere una API key. Usa /login para guardarla. El endpoint por defecto es Anthropic-compatible (https://api.minimax.io/anthropic) y puedes cambiarlo con /provider minimax <baseURL>.";case"nvidia":return"NVIDIA requiere una API key. Usa /login para guardarla. El endpoint por defecto es https://integrate.api.nvidia.com/v1 y puedes cambiarlo con /provider nvidia <baseURL>.";default:return"OpenRouter requiere una API key. Usa /login para guardarla y /provider openrouter <baseURL> para cambiar el endpoint si hace falta."}}function isUrlLike(e){const r=e.toLowerCase();return!(!r.startsWith("http://")&&!r.startsWith("https://"))||(!!r.startsWith("localhost")||(/\.[a-z]{2,}/i.test(r)||/:\d+/.test(r)||/^(\d{1,3}\.){3}\d{1,3}/.test(r)))}async function switchProvider(e){const r=c()?v({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName}).restoredModel:O({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName});await D(),e.context.onChangeAPIKey();const o=k(e.target)&&N(e.target)?` · perfil ${N(e.target).name}`:"";return{message:r?`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - modelo restaurado: ${r}`:`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - cargando modelo predeterminado`,restoredModel:r}}function getProviderSelectionMessage(e,r){if("claude"===e)return"Redirigiendo a inicio de sesion de Claude...";if("openai"===e)return"Redirigiendo a inicio de sesion de OpenAI...";const o=isConfigurableBaseUrlProvider(e)?getProviderSetupMessage(e):null;return r&&o?`${r} - ${o}`:r??o??`Proveedor preparado: ${getProviderLabel(e)}`}function isSelectedProfileReady(e,r){if(c())return p(e,r);if(!r||!k(e))return!0;const o=N(e);return!!o&&("claude"===e?F("claude",o.id):"openai"===e?F("openai",o.id):"openrouter"===e?W("openrouter",o.id):"gemini-api"===e?W("gemini-api",o.id):"gemini-google"===e?h():"zai"===e?W("zai",o.id):"minimax"===e?W("minimax",o.id):"nvidia"!==e||W("nvidia",o.id))}export async function call(r,o,i){const a=i?.trim(),n=a?.split(/\s+/).filter(Boolean)??[],t=n[0]?.toLowerCase();if("list"===t){const e=c(),o=e?m():null,i=e?Object.values(o.providers).flat():z(),a=e?o.activeProfile:E(),n=e?o.providers:i.reduce((e,r)=>(e[r.provider]||(e[r.provider]=[]),e[r.provider].push(r),e),{});let t="\n"+T.cyan.bold(" +----------------------------------------------------------+")+"\n";t+=T.cyan.bold(" | ")+T.white.bold("GESTIÓN DE PROVEEDORES Y CUENTAS")+T.cyan.bold(" |")+"\n",t+=T.cyan.bold(" +----------------------------------------------------------+")+"\n";const l=R.filter(e=>e.implemented);for(const e of l){const r=e.id,o=n[r]??[];if(t+=`\n ${T.magenta.bold("♦")}${T.bgMagenta.white.bold(" "+e.label.toUpperCase()+" ")}${T.magenta.bold("♦")} ${T.dim("("+r+")")}\n`,0===o.length){let e=!1;"claude"===r?e=F("claude"):"openai"===r?e=C():"openrouter"===r?e=L():"gemini-api"===r?e=P():"gemini-google"===r?e=h():"zai"===r?e=w():"minimax"===r?e=U():"nvidia"===r?e=$():"ollama"===r?e=!0:"ollama-cloud"===r&&(e=y());const o=e?T.green("● Configurado (sin perfil creado)"):T.yellow("○ Sin perfiles");t+=` ${T.dim("•")} ${T.white("sin perfiles".padEnd(15))} ${o}\n`;continue}for(const e of o){const r=e.id===a?.id;let o=!1;"claude"===e.provider||"openai"===e.provider?o=!!V(e.provider,e.id):["openrouter","zai","minimax","nvidia"].includes(e.provider)?o=W(e.provider,e.id):"ollama"!==e.provider&&"ollama-cloud"!==e.provider||(o=!0);t+=` ${r?T.cyan("●"):T.dim("○")} ${r?T.cyan.bold(e.name.padEnd(15)):T.white(e.name.padEnd(15))} ${o?T.green("● Conectado"):T.red("○ Desconectado")} ${r?T.bgCyan.black(" ACTUAL "):""}\n`,e.baseUrl&&(t+=` ${T.dim("+-")} ${T.blue("→")} ${T.dim(e.baseUrl)}\n`)}}return t+="\n"+T.cyan.bold(" ► Guía rápida:")+"\n",t+=` ${T.dim("•")} Cambiar perfil: ${T.yellow("/provider [id] profile [nombre]")}\n`,t+=` ${T.dim("•")} Nueva cuenta: ${T.yellow("/login --profile [nombre]")}\n`,t+=` ${T.dim("•")} Ver actual: ${T.yellow("/provider current")}\n`,r(t),null}if("current"===t){const e=c()?s().activeProfile:E();if(!e)return r(T.yellow("No hay un perfil de proveedor activo configurado.")),null;const o=A(e.provider);let i=`\n${T.cyan.bold("Perfil actual:")}\n`;return i+=`${T.white("Proveedor:")} ${T.magenta(o.label)}\n`,i+=`${T.white("Nombre:")} ${T.cyan(e.name)}\n`,e.baseUrl&&(i+=`${T.white("Endpoint:")} ${T.blue(e.baseUrl)}\n`),r(i),null}const l=function(e){if(c())return g(e);if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":case"google-ai-studio":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(t);if(l){if(!R.find(e=>e.id===l))return r(`Proveedor no reconocido: ${l}. Opciones: ${R.map(e=>e.id).join(", ")}`),null;const i=function(e,r){if(!r||!k(e))return null;const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return null;if("profile"===o[1]?.toLowerCase())return o.slice(2).join(" ").trim()||null;const i=o[1];return["set","set-url","base-url","baseurl","url","endpoint","clear","reset","default","restore"].includes(i.toLowerCase())||isUrlLike(i)?null:i}(l,a);if(i&&k(l)&&(c()?f(l,i):B(l,i)),!("claude"!==l||F("claude")&&isSelectedProfileReady(l,i)))return G(r,o);if(!("openai"!==l||C()&&isSelectedProfileReady(l,i)))return q(r,o);const n=function(e,r){if(!r||!isConfigurableBaseUrlProvider(e))return{};const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return{};if("profile"===o[1]?.toLowerCase())return{};const i=o[1]?.toLowerCase(),a=["set","set-url","base-url","baseurl","url","endpoint"].includes(i),n=(a?o.slice(2):o.slice(1)).join(" ").trim();return n?["clear","reset","default","restore"].includes(n.toLowerCase())?{clear:!0}:a||isUrlLike(n)?{baseUrl:n}:{}:{}}(l,a);let t=null;if(n.clear&&isConfigurableBaseUrlProvider(l))M(l),t=`Base URL de ${getProviderLabel(l)} restaurada a ${getCurrentProviderBaseUrl(l)}`;else if(n.baseUrl&&isConfigurableBaseUrlProvider(l))try{const e=j(l,n.baseUrl);t=`Base URL de ${getProviderLabel(l)} guardada: ${e}`}catch(e){return r(e instanceof Error?e.message:`No se pudo guardar la base URL para ${getProviderLabel(l)}.`),null}return("openrouter"!==l||L())&&(("openrouter"!==l||isSelectedProfileReady(l,i))&&("gemini-api"!==l||P()&&isSelectedProfileReady(l,i))&&("zai"!==l||w()&&isSelectedProfileReady(l,i))&&("minimax"!==l||U())&&("minimax"!==l||isSelectedProfileReady(l,i))&&("nvidia"!==l||$())&&("nvidia"!==l||isSelectedProfileReady(l,i)))?e(SwitchProviderOnMount,{onDone:r,context:o,target:l,baseUrlMessage:t,targetProfileName:i}):(r(getProviderSelectionMessage(l,t)),null)}return e(ProviderPicker,{onDone:r,context:o})}function SwitchProviderOnMount({onDone:e,context:r,target:o,baseUrlMessage:a,targetProfileName:n}){const d=t(),s=l();return i.useEffect(()=>{(async()=>{try{const i=await switchProvider({context:r,currentModel:d,currentProvider:b(),target:o,targetProfileName:n});s(e=>({...e,mainLoopModel:i.restoredModel,mainLoopModelForSession:null})),e(a?`${a} - ${i.message}`:i.message)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo cambiar de proveedor: ${o}`)}})()},[a,r,d,e,s,o,n]),null}function ProviderPicker({onDone:i,context:s}){const u=t(),c=l(),p=b(),m=d(),g=R.filter(e=>e.implemented).map(e=>{const r="claude"===e.id&&"firstParty"===p||e.id===p,o="claude"===e.id&&F("claude")||"openai"===e.id&&C()||"openrouter"===e.id&&L()||"gemini-api"===e.id&&P()||"gemini-google"===e.id&&h()||"ollama"===e.id||"ollama-cloud"===e.id&&y()||"zai"===e.id&&w()||"minimax"===e.id&&U()||"nvidia"===e.id&&$(),i=r?" [active]":o?" [ready]":" [setup]";return{label:`${e.label}${i}`,value:e.id}});const f=m??("firstParty"===p?"claude":p);return r(a,{flexDirection:"column",gap:1,children:[e(n,{bold:!0,color:"cyan",children:"Selecciona el proveedor de IA para Context Code:"}),e(n,{dimColor:!0,children:"Puedes usar la API oficial de Claude, OpenAI o proveedores compatibles con OpenAI."}),e(o,{options:g,defaultValue:f,onChange:async function(e){try{const r=e;if("claude"===r&&!F("claude"))return void i("No hay sesión de Claude. Lanzando /login...",{nextInput:"/login",submitNextInput:!0});if("openai"===r&&!C())return void i("No hay sesión de OpenAI. Lanzando /login-openai...",{nextInput:"/login-openai",submitNextInput:!0});if("openrouter"===r&&!L())return void i(getProviderSetupMessage(r));if("gemini-api"===r&&!P())return void i(getProviderSetupMessage(r));if("zai"===r&&!w())return void i(getProviderSetupMessage(r));if("minimax"===r&&!U())return void i(getProviderSetupMessage(r));if("nvidia"===r&&!$())return void i(getProviderSetupMessage(r));const o=await switchProvider({context:s,currentModel:u,currentProvider:p,target:r});c(e=>({...e,mainLoopModel:o.restoredModel,mainLoopModelForSession:null})),i(o.message)}catch(e){const r=e instanceof Error?e.message:String(e);i(`No se pudo cambiar de proveedor: ${r}`)}}}),r(a,{marginTop:1,flexDirection:"column",children:[r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/login"})," para configurar las API keys."]}),r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/provider openrouter https://..."})," para guardar una base URL personalizada."]}),r(n,{dimColor:!0,children:["- ",e(n,{bold:!0,children:"Ollama"})," usa ",getCurrentProviderBaseUrl("ollama")," por defecto."]})]})]})}
1
+ import{jsx as e,jsxs as r}from"react/jsx-runtime";import{Select as o}from"../../components/CustomSelect/select.js";import*as i from"react";import{Box as a,Text as n}from"../../ink.js";import{useMainLoopModel as t}from"../../hooks/useMainLoopModel.js";import{useSetAppState as l}from"../../state/AppState.js";import{getStoredActiveProviderPreference as d}from"../../utils/model/providerProfilesDb.js";import{getCoreCurrentProviderProfile as s,getCoreProviderLabel as u,isCoreProviderEnabled as c,isCoreSelectedProfileReady as p,listCoreProviderProfiles as m,normalizeCoreProviderInput as g,setCoreActiveProfile as f,switchCoreProvider as v}from"../../core/providers/providerCore.js";import{getAPIProvider as b,isGeminiApiProviderConfigured as P,isGeminiGoogleProviderConfigured as h,isNvidiaProviderConfigured as y,isOllamaCloudProviderConfigured as $,isMiniMaxProviderConfigured as U,isOpenAIProviderConfigured as C,isOpenRouterProviderConfigured as L,isZAIProviderConfigured as S}from"../../utils/model/providers.js";import{clearProviderBaseUrl as w,getConfiguredProviderBaseUrl as M,getDefaultProviderBaseUrl as x,isProviderBaseUrlCustomized as A,setProviderBaseUrl as I}from"../../utils/model/providerBaseUrls.js";import{getVisibleProvider as k,VISIBLE_PROVIDERS as R}from"../../utils/model/providerCatalog.js";import{getActiveProviderProfile as E,getLastUsedProviderProfile as j,isProfiledProvider as N,listProviderProfiles as z,setActiveProfileForProvider as O}from"../../utils/model/providerProfiles.js";import{switchProviderPreference as B}from"../../utils/model/providerSwitch.js";import{clearAuthRelatedCaches as D}from"../logout/logout.js";import{call as G}from"../login/login.js";import{call as q}from"../login-openai/login-openai.js";import T from"chalk";import{getStoredProviderOAuthTokens as V,hasStoredProviderApiKey as W,hasStoredProviderOAuthTokens as F}from"../../utils/auth.js";const K=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","nvidia","deepseek","custom-openai","custom-anthropic"];function isConfigurableBaseUrlProvider(e){return K.includes(e)}function getProviderLabel(e){return c()?u(e):k(e).label}function getCurrentProviderBaseUrl(e){return A(e)?M(e):x(e)}function getProviderSetupMessage(e){const r=getCurrentProviderBaseUrl(e);switch(e){case"ollama":return`Ollama usa un servidor local compatible. Endpoint actual: ${r}. Puedes cambiarlo con /provider ollama <baseURL> o restaurar el default con /provider ollama clear.`;case"ollama-cloud":return`Ollama Cloud usa por defecto tu host local autenticado. Endpoint actual: ${r}. Ejecuta 'ollama signin' y luego usa /provider ollama-cloud.`;case"gemini-api":return`Gemini API requiere una API key de Google AI Studio. Endpoint actual: ${r}. Usa /login para guardarla o /provider gemini-api <baseURL> para cambiar el endpoint.`;case"gemini-google":return`Gemini Google usa OAuth compatible con Gemini CLI. Endpoint actual: ${r}. Usa /login y elige Gemini Google para abrir el navegador y guardar el token.`;case"zai":return"Z.AI requiere una API key. Usa /login para guardarla y /provider zai <baseURL> para cambiar el endpoint si hace falta.";case"minimax":return"MiniMax requiere una API key. Usa /login para guardarla. El endpoint por defecto es Anthropic-compatible (https://api.minimax.io/anthropic) y puedes cambiarlo con /provider minimax <baseURL>.";case"nvidia":return"NVIDIA requiere una API key. Usa /login para guardarla. El endpoint por defecto es https://integrate.api.nvidia.com/v1 y puedes cambiarlo con /provider nvidia <baseURL>.";case"deepseek":return`DeepSeek requiere una API key. Usa /login para guardarla. Endpoint actual: ${r}. Puedes cambiarlo con /provider deepseek <baseURL>.`;case"custom-openai":return`Custom OpenAI usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-openai <baseURL> para cambiar solo el endpoint.`;case"custom-anthropic":return`Custom Anthropic usa un endpoint y API key personalizados. Endpoint actual: ${r}. Usa /login para configurarlo desde cero o /provider custom-anthropic <baseURL> para cambiar solo el endpoint.`;default:return"OpenRouter requiere una API key. Usa /login para guardarla y /provider openrouter <baseURL> para cambiar el endpoint si hace falta."}}function isUrlLike(e){const r=e.toLowerCase();return!(!r.startsWith("http://")&&!r.startsWith("https://"))||(!!r.startsWith("localhost")||(/\.[a-z]{2,}/i.test(r)||/:\d+/.test(r)||/^(\d{1,3}\.){3}\d{1,3}/.test(r)))}async function switchProvider(e){const r=c()?v({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName}).restoredModel:B({currentModel:e.currentModel,currentProvider:e.currentProvider,targetProvider:e.target,targetProfileName:e.targetProfileName});await D(),e.context.onChangeAPIKey();const o=N(e.target)&&j(e.target)?` · perfil ${j(e.target).name}`:"";return{message:r?`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - modelo restaurado: ${r}`:`Proveedor cambiado a ${getProviderLabel(e.target)}${o} - cargando modelo predeterminado`,restoredModel:r}}function getProviderSelectionMessage(e,r){if("claude"===e)return"Redirigiendo a inicio de sesion de Claude...";if("openai"===e)return"Redirigiendo a inicio de sesion de OpenAI...";const o=isConfigurableBaseUrlProvider(e)?getProviderSetupMessage(e):null;return r&&o?`${r} - ${o}`:r??o??`Proveedor preparado: ${getProviderLabel(e)}`}function isSelectedProfileReady(e,r){if(c())return p(e,r);if(!r||!N(e))return!0;const o=j(e);return!!o&&("claude"===e?F("claude",o.id):"openai"===e?F("openai",o.id):"openrouter"===e?W("openrouter",o.id):"gemini-api"===e?W("gemini-api",o.id):"gemini-google"===e?h():"zai"===e?W("zai",o.id):"minimax"===e?W("minimax",o.id):"nvidia"!==e||W("nvidia",o.id))}export async function call(r,o,i){const a=i?.trim(),n=a?.split(/\s+/).filter(Boolean)??[],t=n[0]?.toLowerCase();if("list"===t){const e=c(),o=e?m():null,i=e?Object.values(o.providers).flat():z(),a=e?o.activeProfile:E(),n=e?o.providers:i.reduce((e,r)=>(e[r.provider]||(e[r.provider]=[]),e[r.provider].push(r),e),{});let t="\n"+T.cyan.bold(" +----------------------------------------------------------+")+"\n";t+=T.cyan.bold(" | ")+T.white.bold("GESTIÓN DE PROVEEDORES Y CUENTAS")+T.cyan.bold(" |")+"\n",t+=T.cyan.bold(" +----------------------------------------------------------+")+"\n";const l=R.filter(e=>e.implemented);for(const e of l){const r=e.id,o=n[r]??[];if(t+=`\n ${T.magenta.bold("♦")}${T.bgMagenta.white.bold(" "+e.label.toUpperCase()+" ")}${T.magenta.bold("♦")} ${T.dim("("+r+")")}\n`,0===o.length){let e=!1;"claude"===r?e=F("claude"):"openai"===r?e=C():"openrouter"===r?e=L():"gemini-api"===r?e=P():"gemini-google"===r?e=h():"zai"===r?e=S():"minimax"===r?e=U():"nvidia"===r?e=y():"ollama"===r?e=!0:"ollama-cloud"===r?e=$():"deepseek"===r?e=W("deepseek"):"custom-openai"===r?e=W("custom-openai"):"custom-anthropic"===r&&(e=W("custom-anthropic"));const o=e?T.green("● Configurado (sin perfil creado)"):T.yellow("○ Sin perfiles");t+=` ${T.dim("•")} ${T.white("sin perfiles".padEnd(15))} ${o}\n`;continue}for(const e of o){const r=e.id===a?.id;let o=!1;"claude"===e.provider||"openai"===e.provider?o=!!V(e.provider,e.id):["openrouter","zai","minimax","nvidia","deepseek","gemini-api","custom-openai","custom-anthropic"].includes(e.provider)?o=W(e.provider,e.id):"ollama"!==e.provider&&"ollama-cloud"!==e.provider||(o=!0);t+=` ${r?T.cyan("●"):T.dim("○")} ${r?T.cyan.bold(e.name.padEnd(15)):T.white(e.name.padEnd(15))} ${o?T.green("● Conectado"):T.red("○ Desconectado")} ${r?T.bgCyan.black(" ACTUAL "):""}\n`,e.baseUrl&&(t+=` ${T.dim("+-")} ${T.blue("→")} ${T.dim(e.baseUrl)}\n`)}}return t+="\n"+T.cyan.bold(" ► Guía rápida:")+"\n",t+=` ${T.dim("•")} Cambiar perfil: ${T.yellow("/provider [id] profile [nombre]")}\n`,t+=` ${T.dim("•")} Nueva cuenta: ${T.yellow("/login --profile [nombre]")}\n`,t+=` ${T.dim("•")} Ver actual: ${T.yellow("/provider current")}\n`,r(t),null}if("current"===t){const e=c()?s().activeProfile:E();if(!e)return r(T.yellow("No hay un perfil de proveedor activo configurado.")),null;const o=k(e.provider);let i=`\n${T.cyan.bold("Perfil actual:")}\n`;return i+=`${T.white("Proveedor:")} ${T.magenta(o.label)}\n`,i+=`${T.white("Nombre:")} ${T.cyan(e.name)}\n`,e.baseUrl&&(i+=`${T.white("Endpoint:")} ${T.blue(e.baseUrl)}\n`),r(i),null}const l=function(e){if(c())return g(e);if(e)switch(e.trim().toLowerCase()){case"z.ai":case"z-ai":return"zai";case"open-router":return"openrouter";case"ollama-cloud":case"ollama_cloud":case"ollamacloud":return"ollama-cloud";case"gemini":case"gemini-api-key":case"google-ai":case"google-ai-studio":return"gemini-api";case"gemini-google":case"google":case"google-oauth":return"gemini-google";default:return e.trim().toLowerCase()}}(t);if(l){if(!R.find(e=>e.id===l))return r(`Proveedor no reconocido: ${l}. Opciones: ${R.map(e=>e.id).join(", ")}`),null;const i=function(e,r){if(!r||!N(e))return null;const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return null;if("profile"===o[1]?.toLowerCase())return o.slice(2).join(" ").trim()||null;const i=o[1];return["set","set-url","base-url","baseurl","url","endpoint","clear","reset","default","restore"].includes(i.toLowerCase())||isUrlLike(i)?null:i}(l,a);if(i&&N(l)&&(c()?f(l,i):O(l,i)),!("claude"!==l||F("claude")&&isSelectedProfileReady(l,i)))return G(r,o);if(!("openai"!==l||C()&&isSelectedProfileReady(l,i)))return q(r,o);const n=function(e,r){if(!r||!isConfigurableBaseUrlProvider(e))return{};const o=r.trim().split(/\s+/).filter(Boolean);if(o.length<2)return{};if("profile"===o[1]?.toLowerCase())return{};const i=o[1]?.toLowerCase(),a=["set","set-url","base-url","baseurl","url","endpoint"].includes(i),n=(a?o.slice(2):o.slice(1)).join(" ").trim();return n?["clear","reset","default","restore"].includes(n.toLowerCase())?{clear:!0}:a||isUrlLike(n)?{baseUrl:n}:{}:{}}(l,a);let t=null;if(n.clear&&isConfigurableBaseUrlProvider(l))w(l),t=`Base URL de ${getProviderLabel(l)} restaurada a ${getCurrentProviderBaseUrl(l)}`;else if(n.baseUrl&&isConfigurableBaseUrlProvider(l))try{const e=I(l,n.baseUrl);t=`Base URL de ${getProviderLabel(l)} guardada: ${e}`}catch(e){return r(e instanceof Error?e.message:`No se pudo guardar la base URL para ${getProviderLabel(l)}.`),null}return("openrouter"!==l||L())&&(("openrouter"!==l||isSelectedProfileReady(l,i))&&("gemini-api"!==l||P()&&isSelectedProfileReady(l,i))&&("zai"!==l||S()&&isSelectedProfileReady(l,i))&&("minimax"!==l||U())&&("minimax"!==l||isSelectedProfileReady(l,i))&&("nvidia"!==l||y())&&("nvidia"!==l||isSelectedProfileReady(l,i)))?e(SwitchProviderOnMount,{onDone:r,context:o,target:l,baseUrlMessage:t,targetProfileName:i}):(r(getProviderSelectionMessage(l,t)),null)}return e(ProviderPicker,{onDone:r,context:o})}function SwitchProviderOnMount({onDone:e,context:r,target:o,baseUrlMessage:a,targetProfileName:n}){const d=t(),s=l();return i.useEffect(()=>{(async()=>{try{const i=await switchProvider({context:r,currentModel:d,currentProvider:b(),target:o,targetProfileName:n});s(e=>({...e,mainLoopModel:i.restoredModel,mainLoopModelForSession:null})),e(a?`${a} - ${i.message}`:i.message)}catch(r){const o=r instanceof Error?r.message:String(r);e(`No se pudo cambiar de proveedor: ${o}`)}})()},[a,r,d,e,s,o,n]),null}function ProviderPicker({onDone:i,context:s}){const u=t(),c=l(),p=b(),m=d(),g=R.filter(e=>e.implemented).map(e=>{const r="claude"===e.id&&"firstParty"===p||e.id===p,o="claude"===e.id&&F("claude")||"openai"===e.id&&C()||"openrouter"===e.id&&L()||"gemini-api"===e.id&&P()||"gemini-google"===e.id&&h()||"ollama"===e.id||"ollama-cloud"===e.id&&$()||"zai"===e.id&&S()||"minimax"===e.id&&U()||"nvidia"===e.id&&y(),i=r?" [active]":o?" [ready]":" [setup]";return{label:`${e.label}${i}`,value:e.id}});const f=m??("firstParty"===p?"claude":p);return r(a,{flexDirection:"column",gap:1,children:[e(n,{bold:!0,color:"cyan",children:"Selecciona el proveedor de IA para Context Code:"}),e(n,{dimColor:!0,children:"Puedes usar la API oficial de Claude, OpenAI o proveedores compatibles con OpenAI."}),e(o,{options:g,defaultValue:f,onChange:async function(e){try{const r=e;if("claude"===r&&!F("claude"))return void i("No hay sesión de Claude. Lanzando /login...",{nextInput:"/login",submitNextInput:!0});if("openai"===r&&!C())return void i("No hay sesión de OpenAI. Lanzando /login-openai...",{nextInput:"/login-openai",submitNextInput:!0});if("openrouter"===r&&!L())return void i(getProviderSetupMessage(r));if("gemini-api"===r&&!P())return void i(getProviderSetupMessage(r));if("zai"===r&&!S())return void i(getProviderSetupMessage(r));if("minimax"===r&&!U())return void i(getProviderSetupMessage(r));if("nvidia"===r&&!y())return void i(getProviderSetupMessage(r));const o=await switchProvider({context:s,currentModel:u,currentProvider:p,target:r});c(e=>({...e,mainLoopModel:o.restoredModel,mainLoopModelForSession:null})),i(o.message)}catch(e){const r=e instanceof Error?e.message:String(e);i(`No se pudo cambiar de proveedor: ${r}`)}}}),r(a,{marginTop:1,flexDirection:"column",children:[r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/login"})," para configurar las API keys."]}),r(n,{dimColor:!0,children:["- Usa ",e(n,{bold:!0,children:"/provider openrouter https://..."})," para guardar una base URL personalizada."]}),r(n,{dimColor:!0,children:["- ",e(n,{bold:!0,children:"Ollama"})," usa ",getCurrentProviderBaseUrl("ollama")," por defecto."]})]})]})}
@@ -1 +1 @@
1
- import{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)=>{const t=W;if("custom_provider_wizard"===t.state&&t.provider)if("api_key"===e){const e=o.trim();if(!e)return void L({state:"error",message:"La API key no puede estar vacia.",toRetry:t});L({state:"custom_provider_wizard",provider:t.provider,step:"endpoint",apiKey:e,endpoint:t.endpoint,model:t.model})}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:t});const r=e||("custom-openai"===t.provider?"https://api.openai.com/v1":"https://api.anthropic.com/v1");L({state:"custom_provider_wizard",provider:t.provider,step:"model",apiKey:t.apiKey,endpoint:r,model:t.model})}else if("model"===e){const e=t.endpoint||("custom-openai"===t.provider?"https://api.openai.com/v1":"https://api.anthropic.com/v1");x(t.provider,t.apiKey).then(()=>{D(t.provider,e),v({message:`Configuracion de ${w(t.provider).label} guardada`,notificationType:"auth_success"},K),r(t.provider)}).catch(e=>{S(e),L({state:"error",message:e.message,toRetry:t})})}},[r,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
+ import{jsxs as e,jsx as o,Fragment as r}from"react/jsx-runtime";import{c as i}from"react/compiler-runtime";import{useCallback as t,useEffect as n,useRef as a,useState as s}from"react";import{logEvent as l}from"../services/analytics/index.js";import{installOAuthTokens as d}from"../cli/handlers/auth.js";import{useTerminalSize as c}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 b,getOauthAccountInfo as A,saveGeminiGoogleOAuthTokens as k,saveProviderApiKey as P,validateForceLoginOrg as x}from"../utils/auth.js";import{startGeminiCliOAuthFlow as O}from"../services/oauth/geminiCli.js";import{ensureProviderProfile as I,isProfiledProvider as S,resolveProviderProfile as w,setActiveProviderProfile as z,setProviderProfileLastModel as D}from"../utils/model/providerProfiles.js";import{setStoredActiveProviderPreference as M,setStoredLastModelForProvider as T}from"../utils/model/providerProfilesDb.js";import{logError as j}from"../utils/log.js";import{getVisibleProvider as E}from"../utils/model/providerCatalog.js";import{getConfiguredProviderBaseUrl as R,setProviderBaseUrl as U}from"../utils/model/providerBaseUrls.js";import{getSettings_DEPRECATED as K}from"../utils/settings/settings.js";import{setCustomProviderModels as W}from"../utils/config.js";import{Select as L}from"./CustomSelect/select.js";import{KeyboardShortcutHint as G}from"./design-system/KeyboardShortcutHint.js";import{Spinner as B}from"./Spinner.js";import N from"./TextInput.js";const $=["deepseek","minimax","openrouter","zai","nvidia","ollama","openai","claudeai","gemini-google","gemini-api","console"];function sortLoginProviderOptions(e){const o=new Map($.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 F="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:i,mode:y="login",forceLoginMethod:A,profileName:R}){const L=K()||{},B=A??L.forceLoginMethod,N=L.forceLoginOrgUUID,$="claudeai"===B?"Método de acceso preseleccionado: Plan de suscripción (Context Pro/Max)":"console"===B?"Método de acceso preseleccionado: Facturación por uso de API (Anthropic Console)":"openai"===B?"Método de acceso preseleccionado: OpenAI / Codex OAuth":null,F=p(),[V,X]=s(()=>"setup-token"===y||"claudeai"===B||"console"===B||"openai"===B?{state:"ready_to_start"}:{state:"idle"}),[Y,q]=s(""),[H,Z]=s(0),[J]=s(()=>new C),[Q,ee]=s(()=>"openai"===B?"openai":"anthropic"),[oe,re]=s(()=>"setup-token"===y||"claudeai"===B),[ie,te]=s(!1),[ne,ae]=s(!1),se=c().columns-37-1,[le,de]=s(""),[ce,ue]=s(0),[pe,me]=s(""),[he,ge]=s(0),[fe,_e]=s(""),[ve,Ce]=s(""),[ye,be]=s(""),[Ae,ke]=s(0),[Pe,xe]=s(0),[Oe,Ie]=s(0);n(()=>{"claudeai"===B?l("tengu_oauth_claudeai_forced",{}):"console"===B&&l("tengu_oauth_console_forced",{})},[B]),n(()=>{if("about_to_retry"===V.state){const e=setTimeout(X,1e3,V.nextState);return()=>clearTimeout(e)}},[V]),f("confirm:yes",()=>{l("tengu_oauth_success",{loginWithClaudeAi:oe}),r(Q)},{context:"Confirmation",isActive:"success"===V.state&&"setup-token"!==y}),n(()=>{if("success"===V.state&&!process.stdin.isTTY){const e=setTimeout(()=>{l("tengu_oauth_success",{loginWithClaudeAi:oe}),r(Q)},800);return()=>clearTimeout(e)}},[V.state,Q,oe,r]),f("confirm:yes",()=>{X({state:"idle"})},{context:"Confirmation",isActive:"platform_setup"===V.state}),f("confirm:yes",()=>{De()},{context:"Confirmation",isActive:"provider_google_setup"===V.state}),f("confirm:yes",()=>{"error"===V.state&&V.toRetry&&(q(""),X({state:"about_to_retry",nextState:V.toRetry}))},{context:"Confirmation",isActive:"error"===V.state&&!!V.toRetry}),f("cancel",()=>{X({state:"idle"})},{context:"Confirmation",isActive:"provider_api_key_input"===V.state||"provider_local_setup"===V.state||"provider_google_setup"===V.state||"error"===V.state}),n(()=>{"c"===Y&&"waiting_for_login"===V.state&&ie&&!ne&&(u(V.url).then(e=>{e&&process.stdout.write(e),ae(!0),setTimeout(ae,2e3,!1)}),q(""))},[Y,V,ie,ne]);const Se=t(async(e,o)=>{const i=e.trim();if(i)try{await P(o,i),de(""),ue(0);const e=E(o).label;v({message:`API key de ${e} guardada`,notificationType:"auth_success"},F),r(o)}catch(e){j(e),X({state:"error",message:e.message,toRetry:{state:"provider_api_key_input",provider:o}})}else X({state:"error",message:"Debes ingresar una API key.",toRetry:{state:"provider_api_key_input",provider:o}})},[r,F]),we=t((e,o)=>{const i=e.trim();if(i)try{const e=U(o,i);me(e),ge(0),v({message:`URL de ${E(o).label} guardada`,notificationType:"auth_success"},F),r(o)}catch(e){j(e),X({state:"error",message:e.message,toRetry:{state:"provider_local_setup",provider:o}})}else X({state:"error",message:"Debes ingresar una URL para Ollama.",toRetry:{state:"provider_local_setup",provider:o}})},[r,F]),ze=t((e,o)=>{const i=V;if("custom_provider_wizard"===i.state&&i.provider)if("endpoint"===e){const e=o.trim();if(e&&!e.startsWith("http"))return void X({state:"error",message:"La URL debe empezar con http:// o https://.",toRetry:i});if(!e)return void X({state:"error",message:"El endpoint es obligatorio. Ejemplo: http://localhost:8001/v1",toRetry:i});X({state:"custom_provider_wizard",provider:i.provider,step:"api_key",apiKey:i.apiKey,endpoint:e,model:i.model})}else if("api_key"===e){const e=o.trim();if(!e)return void X({state:"error",message:"La API key no puede estar vacia.",toRetry:i});X({state:"custom_provider_wizard",provider:i.provider,step:"model_list",apiKey:e,endpoint:i.endpoint,model:"",availableModels:[],modelsLoading:!0});const r=new AbortController,t=setTimeout(()=>r.abort(),15e3);fetch(`${i.endpoint}/models`,{headers:{Authorization:`Bearer ${e}`},signal:r.signal}).then(e=>e.json()).then(e=>{clearTimeout(t);const o=e.data?.map(e=>e.id)||[];X(e=>"custom_provider_wizard"!==e.state||"model_list"!==e.step?e:{...e,availableModels:o,modelsLoading:!1})}).catch(e=>{clearTimeout(t),j(e),X(e=>"custom_provider_wizard"!==e.state||"model_list"!==e.step?e:{...e,availableModels:[],modelsLoading:!1})})}else if("model"===e){const e="model_list"===i.step&&Array.isArray(i.availableModels)?i.availableModels:[];let t=null;try{if(S(i.provider))if(R&&R.trim()){const e=I(i.provider,R.trim());z(e.id),t=e.id}else t=w(i.provider,{createIfMissing:!0})?.id??null}catch(e){j(e)}P(i.provider,i.apiKey).then(()=>{U(i.provider,i.endpoint);try{M(i.provider)}catch(e){j(e)}const n=o?.trim();if(n)try{T(i.provider,n),S(i.provider)&&D(i.provider,n)}catch(e){j(e)}if(e.length>0)try{W(i.provider,e,t)}catch(e){j(e)}v({message:`Configuracion de ${E(i.provider).label} guardada`,notificationType:"auth_success"},F),r(i.provider)}).catch(e=>{j(e),X({state:"error",message:e.message,toRetry:i})})}},[r,F,V,R]),De=t(async()=>{X({state:"provider_google_auth_running"});try{if(await b())return void r("gemini-google");const e=await O();k(e);if(!await b())return v({message:"OAuth de Gemini guardado; Code Assist no valido el proyecto de cuota",notificationType:"auth_success"},F),void r("gemini-google");v({message:"Credenciales de Gemini Google listas",notificationType:"auth_success"},F),r("gemini-google")}catch(e){j(e),X({state:"error",message:e.message,toRetry:{state:"provider_google_setup"}})}},[r,F]),Me=t(async()=>{try{l("tengu_oauth_flow_start",{loginWithClaudeAi:oe,provider:Q});const e=await J.startOAuthFlow(async e=>{X({state:"waiting_for_login",url:e}),setTimeout(te,3e3,!0)},{loginWithClaudeAi:oe,provider:Q,inferenceOnly:"setup-token"===y,expiresIn:"setup-token"===y?31536e3:void 0,orgUUID:N}).catch(e=>{const o=e.message.includes("Token exchange failed"),r=_(e),i=J.getPort(),t="openai"===Q&&i?formatOAuthDebugDetails(Q,i):"";throw X({state:"error",message:r??(o?"No se pudo intercambiar el codigo de autorizacion por el token de acceso. Intentalo de nuevo."+(t?`\n${t}`:""):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)X({state:"success",token:e.accessToken});else{X({state:"creating_api_key"});const o=R?w("openai"===Q?"openai":"anthropic",R):void 0;if(await d(e,Q,o?.id),"anthropic"===Q){const e=await x();if(!e.valid)throw new Error(e.message)}X({state:"success"}),v({message:"openai"===Q?"Inicio de sesión con OpenAI / Codex completado":"Inicio de sesión en Context Code completado",notificationType:"auth_success"},F)}}catch(e){const o=e.message,r=_(e),i=J.getPort(),t="openai"===Q&&i?formatOAuthDebugDetails(Q,i):"";X({state:"error",message:r??("openai"===Q&&t&&!o.includes("redirect_uri=")?`${o}\n${t}`:o),toRetry:{state:"setup-token"===y?"ready_to_start":"idle"}}),l("tengu_oauth_error",{error:o,ssl_error:null!==r})}},[Q,J,te,oe,y,N,F]),Te=a(!1);return n(()=>{"ready_to_start"!==V.state||Te.current||(Te.current=!0,process.nextTick((e,o)=>{e(),o.current=!1},Me,Te))},[V.state,Me]),n(()=>{if("setup-token"===y&&"success"===V.state){const e=setTimeout((e,o)=>{l("tengu_oauth_success",{loginWithClaudeAi:e}),o(Q)},500,oe,r,Q);return()=>clearTimeout(e)}},[y,V,oe,r,Q]),n(()=>()=>{J.cleanup()},[J]),e(m,{flexDirection:"column",gap:1,children:["waiting_for_login"===V.state&&ie&&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,ne?{color:"success",children:"(Copied!)"}:{dimColor:!0,children:o(G,{shortcut:"c",action:"copiar",parens:!0})})]}),o(h,{url:V.url,children:o(g,{dimColor:!0,children:V.url})})]},"urlToCopy"),"setup-token"===y&&"success"===V.state&&V.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:V.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:V,oauthProvider:Q,mode:y,startingMessage:i,forcedMethodMessage:$,showPastePrompt:ie,pastedCode:Y,setPastedCode:q,cursorOffset:H,setCursorOffset:Z,textInputColumns:se,handleSubmitCode:async function(e,o){try{const[r,i]=e.split("#");if(!r||!i)return void X({state:"error",message:"Codigo invalido. Asegurate de copiar el codigo completo",toRetry:{state:"waiting_for_login",url:o}});l("tengu_oauth_manual_entry",{}),J.handleManualAuthCodeInput({authorizationCode:r,state:i})}catch(e){j(e),X({state:"error",message:e.message,toRetry:{state:"waiting_for_login",url:o}})}},setOAuthStatus:X,setLoginWithClaudeAi:re,setOAuthProvider:ee,providerApiKey:le,setProviderApiKey:de,providerApiKeyCursorOffset:ce,setProviderApiKeyCursorOffset:ue,handleProviderApiKeySubmit:Se,providerBaseUrl:pe,setProviderBaseUrlInput:me,providerBaseUrlCursorOffset:he,setProviderBaseUrlCursorOffset:ge,handleProviderBaseUrlSubmit:we,onDone:r,wizardApiKey:fe,setWizardApiKey:_e,wizardEndpoint:ve,setWizardEndpoint:Ce,wizardModel:ye,setWizardModel:be,wizardApiKeyCursor:Ae,setWizardApiKeyCursor:ke,wizardEndpointCursor:Pe,setWizardEndpointCursor:xe,wizardModelCursor:Oe,setWizardModelCursor:Ie,handleCustomProviderWizardSubmit:ze})})]})}function OAuthStatusMessage(t){const n=i(68),{oauthStatus:a,oauthProvider:s,mode:d,startingMessage:c,forcedMethodMessage:u,showPastePrompt:p,pastedCode:f,setPastedCode:_,cursorOffset:v,setCursorOffset:C,textInputColumns:y,handleSubmitCode:b,setOAuthStatus:k,setLoginWithClaudeAi:P,setOAuthProvider:x,providerApiKey:O,setProviderApiKey:I,providerApiKeyCursorOffset:S,setProviderApiKeyCursorOffset:w,handleProviderApiKeySubmit:z,providerBaseUrl:D,setProviderBaseUrlInput:M,providerBaseUrlCursorOffset:T,setProviderBaseUrlCursorOffset:j,handleProviderBaseUrlSubmit:U,onDone:K,wizardApiKey:W,setWizardApiKey:G,wizardEndpoint:$,setWizardEndpoint:V,wizardModel:X,setWizardModel:Y,wizardApiKeyCursor:q,setWizardApiKeyCursor:H,wizardEndpointCursor:Z,setWizardEndpointCursor:J,wizardModelCursor:Q,setWizardModelCursor:ee,handleCustomProviderWizardSubmit:oe}=t;switch(a.state){case"idle":{const r=c||"Context Code puede usarse con tu suscripción de Claude, la facturación de Anthropic Console o OpenAI / Codex OAuth.";let i,t,a,s,d,u,p;return n[0]!==r?(i=o(g,{bold:!0,children:r}),n[0]=r,n[1]=i):i=n[1],n[2]===Symbol.for("react.memo_cache_sentinel")?(t=o(g,{children:"Selecciona el metodo de acceso:"}),n[2]=t):t=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")?(d=[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]=d):d=n[5],n[6]!==P||n[7]!==k||n[8]!==x||n[65]!==K?(u=o(m,{children:o(L,{options:sortLoginProviderOptions(d),onChange:e=>{"platform"===e?(l("tengu_oauth_platform_selected",{}),k({state:"platform_setup"})):"openai"===e?(l("tengu_oauth_openai_selected",{}),x("openai"),P(!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?(M(R(e)),j(0),k({state:"provider_local_setup",provider:e})):"custom-openai"===e||"custom-anthropic"===e?k({state:"custom_provider_wizard",provider:e,step:"endpoint",apiKey:"",endpoint:"",model:""}):(x("anthropic"),k({state:"ready_to_start"}),"claudeai"===e?(l("tengu_oauth_claudeai_selected",{}),P(!0)):(l("tengu_oauth_console_selected",{}),P(!1)))}})}),n[6]=P,n[7]=k,n[8]=x,n[65]=K,n[66]=u):u=n[66],n[10]!==i||n[11]!==u?(p=e(m,{flexDirection:"column",gap:1,marginTop:1,children:[i,t,u]}),n[10]=i,n[11]=u,n[12]=p):p=n[12],p}case"provider_api_key_input":{let r,i,t,s;if(n[50]!==a.provider?(r=e(g,{bold:!0,children:["Ingresa la API key de ",E(a.provider).label]}),n[50]=a.provider,n[51]=r):r=n[51],n[52]!==a.provider){const r=E(a.provider);i=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]=i}else i=n[53];return n[54]!==O||n[55]!==S||n[56]!==I||n[57]!==w||n[58]!==y||n[59]!==z?(t=e(m,{children:[o(g,{children:"API key > "}),o(N,{value:O,onChange:I,onSubmit:e=>z(e,a.provider),cursorOffset:S,onChangeCursorOffset:w,columns:y,mask:"*"})]}),n[54]=O,n[55]=S,n[56]=I,n[57]=w,n[58]=y,n[59]=z,n[60]=t):t=n[60],n[61]!==r||n[62]!==i||n[63]!==t?(s=e(m,{flexDirection:"column",gap:1,children:[r,i,t]}),n[61]=r,n[62]=i,n[63]=t,n[64]=s):s=n[64],s}case"provider_local_setup":{const r=E(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(N,{value:D,onChange:M,onSubmit:e=>U(e,a.provider),cursorOffset:T,onChangeCursorOffset:j,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(B,{}),o(g,{children:"Abriendo Google OAuth para Gemini..."})]});case"custom_provider_wizard":{const r=E(a.provider),i="custom-openai"===a.provider?"https://api.openai.com/v1":"https://api.anthropic.com/v1";if("endpoint"===a.step)return e(m,{flexDirection:"column",gap:1,children:[e(g,{bold:!0,children:[r.label," - Paso 1/3"]}),o(g,{dimColor:!0,children:"URL del servidor API (ej: http://localhost:8001/v1)"}),o(g,{children:"Endpoint > "}),o(m,{children:o(N,{value:$,onChange:V,onSubmit:oe.bind(null,"endpoint"),cursorOffset:Z,onChangeCursorOffset:J,columns:y})}),e(g,{dimColor:!0,children:["Default: ",i]}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para continuar."]})]});if("api_key"===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:["Ingresa tu API key para ",r.label,"."]}),o(g,{children:"API key > "}),o(m,{children:o(N,{value:W,onChange:G,onSubmit:oe.bind(null,"api_key"),cursorOffset:q,onChangeCursorOffset:H,columns:y,mask:"*"})}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para obtener modelos disponibles."]})]});if("model_list"===a.step){if(a.modelsLoading)return e(m,{flexDirection:"column",gap:1,children:[e(g,{bold:!0,children:[r.label," - Cargando modelos..."]}),e(m,{children:[o(B,{}),e(g,{children:[" Obteniendo lista de modelos desde ",a.endpoint,"/models"]})]})]});const i=a.availableModels||[];if(i.length>0){const t=i.map(e=>({label:e,value:e}));return e(m,{flexDirection:"column",gap:1,children:[e(g,{bold:!0,children:[r.label," - Paso 3/3"]}),o(g,{dimColor:!0,children:"Selecciona un modelo de la lista:"}),o(m,{children:o(L,{options:t,onChange:e=>{k(o=>({...o,model:e})),oe("model",e)}})}),e(g,{color:"success",children:["Presiona ",o(g,{bold:!0,children:"Enter"})," para guardar la configuracion."]})]})}return e(m,{flexDirection:"column",gap:1,children:[e(g,{bold:!0,children:[r.label," - Paso 3/3"]}),o(g,{dimColor:!0,children:"No se pudo obtener la lista de modelos."}),o(g,{dimColor:!0,children:"Ingresa el nombre del modelo manualmente."}),o(g,{dimColor:!0,children:"Podras cambiarlo luego con el comando /model."}),o(g,{children:"Modelo > "}),o(m,{children:o(N,{value:X,onChange:Y,onSubmit:oe.bind(null,"model"),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,i,t,a,s,l,d,c;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")?(i=o(g,{children:"Context Code soporta Amazon Bedrock, Microsoft Foundry y Vertex AI. Configura las variables de entorno requeridas y luego reinicia Context Code."}),t=o(g,{children:"Si formas parte de una organización empresarial, contacta a tu administrador para las instrucciones de configuración."}),n[13]=i,n[14]=t):(i=n[13],t=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")?(d=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]=d):d=n[18],n[19]===Symbol.for("react.memo_cache_sentinel")?(c=e(m,{flexDirection:"column",gap:1,marginTop:1,children:[r,e(m,{flexDirection:"column",gap:1,children:[i,t,d,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]=c):c=n[19],c}case"waiting_for_login":{let r,i,t,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?(i=!p&&e(m,{children:[o(B,{}),o(g,{children:"Abriendo el navegador para iniciar sesión…"})]}),n[22]=p,n[23]=i):i=n[23],n[24]!==v||n[25]!==b||n[26]!==a.url||n[27]!==f||n[28]!==C||n[29]!==_||n[30]!==p||n[31]!==y?(t=p&&e(m,{children:[o(g,{children:F}),o(N,{value:f,onChange:_,onSubmit:e=>b(e,a.url),cursorOffset:v,onChangeCursorOffset:C,columns:y,mask:"*"})]}),n[24]=v,n[25]=b,n[26]=a.url,n[27]=f,n[28]=C,n[29]=_,n[30]=p,n[31]=y,n[32]=t):t=n[32],n[33]!==r||n[34]!==i||n[35]!==t?(s=e(m,{flexDirection:"column",gap:1,children:[r,i,t]}),n[33]=r,n[34]=i,n[35]=t,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(B,{}),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 i,t;if(n[39]!==d||n[40]!==a.token){const t="openai"===s?"Inicio de sesión en OpenAI / Codex exitoso. Presiona ":"Inicio de sesión exitoso. Presiona ";i="setup-token"===d&&a.token?null:e(r,{children:[A()?.emailAddress?e(g,{dimColor:!0,children:["Sesión iniciada como"," ",o(g,{children:A()?.emailAddress})]}):null,e(g,{color:"success",children:[t,o(g,{bold:!0,children:"Enter"})," para continuar…"]})]}),n[39]=d,n[40]=a.token,n[41]=i}else i=n[41];return n[42]!==i?(t=o(m,{flexDirection:"column",children:i}),n[42]=i,n[43]=t):t=n[43],t}case"error":{let r,i,t;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?(i=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]=i):i=n[47],n[48]!==r||n[49]!==i?(t=e(m,{flexDirection:"column",gap:1,children:[r,i]}),n[48]=r,n[49]=i,n[50]=t):t=n[50],t}default:return null}}
@@ -1 +1 @@
1
- import{jsxs as e}from"react/jsx-runtime";import{useCallback as t,useEffect as n,useMemo as o,useRef as s,useState as r}from"react";import{useNotifications as i}from"../context/notifications.js";import{Text as a}from"../ink.js";import{logEvent as l}from"../services/analytics/index.js";import{useDebounceCallback as g}from"usehooks-ts";import{getCommandName as m}from"../commands.js";import{getModeFromInput as c,getValueFromInput as u}from"../components/PromptInput/inputModes.js";import{useIsModalOverlayActive as d,useRegisterOverlay as p}from"../context/overlayContext.js";import{KeyboardEvent as f}from"../ink/events/keyboard-event.js";import{useInput as h}from"../ink.js";import{useOptionalKeybindingContext as v,useRegisterKeybindingContext as A}from"../keybindings/KeybindingContext.js";import{useKeybindings as b}from"../keybindings/useKeybinding.js";import{useShortcutDisplay as S}from"../keybindings/useShortcutDisplay.js";import{useAppState as w,useAppStateStore as $}from"../state/AppState.js";import{isAgentSwarmsEnabled as y}from"../utils/agentSwarmsEnabled.js";import{getShellCompletions as C}from"../utils/bash/shellCompletion.js";import{formatLogMetadata as x}from"../utils/format.js";import{getSessionIdFromLog as k,searchSessionsByCustomTitle as H}from"../utils/sessionStorage.js";import{applyCommandSuggestion as P,findMidInputSlashCommand as T,getBestCommandMatch as W,isCommandInput as L}from"../utils/suggestions/commandSuggestions.js";import{getDirectoryCompletions as j}from"../utils/suggestions/directoryCompletion.js";import{getShellHistoryCompletion as N}from"../utils/suggestions/shellHistoryCompletion.js";import{getSlackChannelSuggestions as M,hasSlackMcpServer as I}from"../utils/suggestions/slackChannelSuggestions.js";import{TEAM_LEAD_NAME as q}from"../utils/swarm/constants.js";import{listProviderProfiles as Q}from"../utils/model/providerProfiles.js";import{applyFileSuggestion as R,findLongestCommonPrefix as D,onIndexBuildComplete as V,startBackgroundCacheRefresh as O}from"./fileSuggestions.js";import{generateUnifiedSuggestions as E}from"./unifiedSuggestions.js";const _=/^@[\p{L}\p{N}\p{M}_\-./\\()[\]~:]*/u,z=/^[\p{L}\p{N}\p{M}_\-./\\()[\]~:]+/u,F=/(@[\p{L}\p{N}\p{M}_\-./\\()[\]~:]*|[\p{L}\p{N}\p{M}_\-./\\()[\]~:]+)$/u,K=/[\p{L}\p{N}\p{M}_\-./\\()[\]~:]+$/u,G=/(^|\s)@([\p{L}\p{N}\p{M}_\-./\\()[\]~:]*|"[^"]*"?)$/u,B=/(^|\s)#([a-z0-9][a-z0-9_-]*)$/,U=["list","current","use","rename","remove","model","agent"],Z=["list","show","enable","disable","setup","orchestrator"],J=["list","create","show","orchestrator","equipo","add-member"],X=["frontend","backend","docs","tests","review","database","devops"],Y=[{provider:"claude",label:"Context"},{provider:"openai",label:"OpenAI"},{provider:"openrouter",label:"OpenRouter"},{provider:"ollama",label:"Ollama"},{provider:"ollama-cloud",label:"Ollama Cloud"},{provider:"zai",label:"Z.AI"},{provider:"minimax",label:"MiniMax"}];function isPathMetadata(e){return"object"==typeof e&&null!==e&&"type"in e&&("directory"===e.type||"file"===e.type)}function getPreservedSelection(e,t,n){if(0===n.length)return-1;if(t<0)return 0;const o=e[t];if(!o)return 0;const s=n.findIndex(e=>e.id===o.id);return s>=0?s:0}function replaceProfileArgs(e,t){const n="/profile";return t.length>0?`${n} ${t}`:n}function buildProfileArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}function replaceWorkspaceArgs(e){const t="/workspace";return e.length>0?`${t} ${e}`:t}function buildWorkspaceArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}function replaceTeamArgs(e){const t="/team";return e.length>0?`${t} ${e}`:t}function buildTeamArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}function getProviderCommandSuggestions(e){const t=extractCommandNameAndArgs(e);if(!t||"provider"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=r[1]??"",makeProviderSuggestions=e=>Y.filter(t=>t.provider.startsWith(e.toLowerCase())).map(e=>buildProfileArgSuggestion(`provider-choice-${e.provider}`,e.provider,`/provider ${e.provider} `,e.label));if(r.length<=1){const e=i.toLowerCase();return{suggestions:[...["list","current","reset"].filter(t=>t.startsWith(e)).map(e=>buildProfileArgSuggestion(`provider-subcommand-${e}`,e,`/provider ${e} `,"list"===e?"Listar proveedores":"current"===e?"Ver proveedor actual":"Resetear configuración")),...makeProviderSuggestions(e)],commandArgumentHint:"<proveedor|list|current>"}}if(["list","current","reset"].includes(i.toLowerCase()))return{suggestions:[],commandArgumentHint:void 0};if(Y.some(e=>e.provider===i.toLowerCase())&&r.length<=2){const e=a.toLowerCase(),t=((e,t)=>Q(e).filter(e=>e.name.toLowerCase().startsWith(t.toLowerCase())).map(t=>buildProfileArgSuggestion(`provider-profile-${t.id}`,t.name,`/provider ${e} ${t.name} `,`${t.agentName}${t.lastModel?` · ${t.lastModel}`:""}`)))(i.toLowerCase(),e);return{suggestions:[...t,...["reset","set","url","clear"].filter(t=>t.startsWith(e)).map(e=>buildProfileArgSuggestion(`provider-keyword-${e}`,e,`/provider ${i} ${e} `,`Acción: ${e}`))],commandArgumentHint:"<perfil|url|reset>"}}return{suggestions:[],commandArgumentHint:void 0}}function buildSlashArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}const ee=[{name:"status",description:"Ver configuración actual"},{name:"browser",description:"Cambiar navegador",valueAfter:"<chromium|chrome|firefox|webkit|msedge>"},{name:"visible",description:"Modo visible (headed)"},{name:"headless",description:"Modo oculto (headless)"},{name:"executable",description:'Ruta a binario custom o "clear"'},{name:"device",description:'Dispositivo a emular o "clear"'},{name:"viewport",description:'Tamaño viewport (ej 1280x720) o "clear"'},{name:"reset",description:"Borrar config y volver a defaults"},{name:"help",description:"Ver ayuda detallada"}],te=[{name:"chromium",description:"Chromium (default, Playwright lo descarga)"},{name:"chrome",description:"Google Chrome del sistema"},{name:"msedge",description:"Microsoft Edge del sistema (Windows)"},{name:"firefox",description:"Firefox (Playwright lo descarga)"},{name:"webkit",description:"WebKit (Playwright lo descarga)"}];const ne=[{name:"status",description:"Ver estado del bridge y números autorizados"},{name:"permitidos",description:"Listar/configurar números autorizados"},{name:"start",description:"Iniciar bridge (requiere cuenta vinculada)"},{name:"stop",description:"Detener bridge"},{name:"help",description:"Ver ayuda detallada"},{name:"global",description:"Subcomandos del canal global (status/start/stop)"}],oe=[{name:"status",description:"Estado del daemon global"},{name:"start",description:"Iniciar daemon global"},{name:"stop",description:"Detener daemon global"}];const se=[{name:"status",description:"Ver estado del bot y usuarios permitidos"},{name:"permitidos",description:"Listar usuarios autorizados"},{name:"help",description:"Ver ayuda detallada"},{name:"global",description:"Subcomandos del canal global (status/start/stop)"}];const re=[{name:"start",description:"Iniciar servidor y abrir en navegador"},{name:"stop",description:"Detener servidor web"},{name:"status",description:"Ver estado del servidor y conexiones"},{name:"open",description:"Abrir la WebApp en el navegador"},{name:"token",description:"Ver token de autenticación actual"},{name:"port",description:"Cambiar puerto del servidor"},{name:"autostart",description:"Activar/desactivar inicio automático"},{name:"help",description:"Ver ayuda detallada"}];function getProviderAgentRefSuggestions(e,t,n=!0){const o=e.toLowerCase(),s=[];for(const e of Y)for(const r of Q(e.provider)){const i=`${e.provider}/${r.agentName||`${r.name}-lead`}`;i.toLowerCase().startsWith(o)&&s.push(buildTeamArgSuggestion(`team-agent-${r.id}`,i,replaceTeamArgs([...t,i].join(" ")+(n?" ":"")),r.lastModel?`${e.label} - ${r.lastModel}`:e.label))}return s}function applyCommandArgSuggestion(e,t,n){const o=e.metadata,s=o?.replacement??e.displayText;t(s),n(s.length)}function buildResumeInputFromSuggestion(e){const t=e.metadata;return t?.sessionId?`/resume ${t.sessionId}`:`/resume ${e.displayText}`}export function extractSearchToken(e){return e.isQuoted?e.token.slice(2).replace(/"$/,""):e.token.startsWith("@")?e.token.substring(1):e.token}export function formatReplacementValue(e){const{displayText:t,mode:n,hasAtPrefix:o,needsQuotes:s,isQuoted:r,isComplete:i}=e,a=i?" ":"";return r||s?"bash"===n?`"${t}"${a}`:`@"${t}"${a}`:o?"bash"===n?`${t}${a}`:`@${t}${a}`:t}export function applyShellSuggestion(e,t,n,o,s,r){const i=t.slice(0,n).lastIndexOf(" ")+1;let a;a="variable"===r?"$"+e.displayText+" ":"command"===r?e.displayText+" ":e.displayText;o(t.slice(0,i)+a+t.slice(n)),s(i+a.length)}const ie=/(^|\s)@[\w-]*$/;function applyTriggerSuggestion(e,t,n,o,s,r){const i=t.slice(0,n).match(o);if(!i||void 0===i.index)return;const a=i.index+(i[1]?.length??0),l=t.slice(0,a);s(l+e.displayText+" "+t.slice(n)),r(l.length+e.displayText.length+1)}let ae=null;export function applyDirectorySuggestion(e,t,n,o,s){const r=s?"/":" ",i=e.slice(0,n),a="@"+t+r;return{newInput:i+a+e.slice(n+o),cursorPos:i.length+a.length}}export function extractCompletionToken(e,t,n=!1){if(!e)return null;const o=e.substring(0,t);if(n){const n=/@"([^"]*)"?$/,s=o.match(n);if(s&&void 0!==s.index){const n=e.substring(t).match(/^[^"]*"?/),o=n?n[0]:"";return{token:s[0]+o,startPos:s.index,isQuoted:!0}}}if(n){const n=o.lastIndexOf("@");if(n>=0&&(0===n||/\s/.test(o[n-1]))){const s=o.substring(n),r=s.match(_);if(r&&r[0].length===s.length){const o=e.substring(t).match(z),s=o?o[0]:"";return{token:r[0]+s,startPos:n,isQuoted:!1}}}}const s=n?F:K,r=o.match(s);if(!r||void 0===r.index)return null;const i=e.substring(t).match(z),a=i?i[0]:"";return{token:r[0]+a,startPos:r.index,isQuoted:!1}}function extractCommandNameAndArgs(e){if(L(e)){const t=e.indexOf(" ");return-1===t?{commandName:e.slice(1),args:""}:{commandName:e.slice(1,t),args:e.slice(t+1)}}return null}export function useTypeahead({commands:_,onInputChange:z,onSubmit:F,setCursorOffset:K,input:le,cursorOffset:ge,mode:me,agents:ce,setSuggestionsState:ue,suggestionsState:{suggestions:de,selectedSuggestion:pe,commandArgumentHint:fe},suppressSuggestions:he=!1,markAccepted:ve,onModeChange:Ae}){const{addNotification:be}=i(),Se=S("chat:thinkingToggle","Chat","alt+t"),[we,$e]=r("none"),ye=o(()=>{const e=_.filter(e=>!e.isHidden);if(0===e.length)return;return Math.max(...e.map(e=>m(e).length))+6},[_]),[Ce,xe]=r(void 0),ke=w(e=>e.mcp.resources),He=$(),Pe=w(e=>e.promptSuggestion),Te=w(e=>!!e.viewingAgentTaskId),We=v(),[Le,je]=r(void 0),Ne=o(()=>{if("prompt"!==me||he)return;const e=T(le,ge);if(!e)return;const t=W(e.partialCommand,_);return t?{text:t.suffix,fullCommand:t.fullCommand,insertPosition:e.startPos+1+e.partialCommand.length}:void 0},[le,ge,me,_,he]),Me=he?void 0:"prompt"===me?Ne:Le,Ie=s(ge);Ie.current=ge;const qe=s(null),Qe=s(""),Re=(s(""),s("")),De=s("");s(de).current=de;const Ve=s(null),Oe=t(()=>{ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),xe(void 0),je(void 0)},[ue]),Ee=t(async(e,t=!1)=>{qe.current=e;const n=await E(e,ke,ce,t);if(qe.current===e){if(0===n.length)return ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),void xe(void 0);ue(e=>({commandArgumentHint:void 0,suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n)})),$e(n.length>0?"file":"none"),xe(void 0)}},[ke,ue,$e,xe,ce]);n(()=>(O(),V(()=>{const e=qe.current;null!==e&&(qe.current=null,Ee(e,""===e))})),[Ee]);const _e=g(Ee,50),ze=t(async e=>{De.current=e;const t=await M(He.getState().mcp.clients,e);De.current===e&&(ue(e=>({commandArgumentHint:void 0,suggestions:t,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,t)})),$e(t.length>0?"slack-channel":"none"),xe(void 0))},[ue]),Fe=g(ze,150),Ke=t(async(e,t)=>{const n=t??Ie.current;if(he)return _e.cancel(),void Oe();if("prompt"===me){const t=T(e,n);if(t){if(W(t.partialCommand,_))return ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),void xe(void 0)}}if("bash"===me&&e.trim()){Re.current=e;const t=await N(e);if(Re.current!==e)return;if(t)return je({text:t.suffix,fullCommand:t.fullCommand,insertPosition:e.length}),ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),void xe(void 0);je(void 0)}const o="bash"!==me?e.substring(0,n).match(/(^|\s)@([\w-]*)$/):null;if(o){const e=(o[2]??"").toLowerCase(),t=He.getState(),n=[],s=new Set;if(y()&&t.teamContext)for(const o of Object.values(t.teamContext.teammates??{}))o.name!==q&&o.name.toLowerCase().startsWith(e)&&(s.add(o.name),n.push({id:`dm-${o.name}`,displayText:`@${o.name}`,description:"send message"}));for(const[o,r]of t.agentNameRegistry){if(s.has(o))continue;if(!o.toLowerCase().startsWith(e))continue;const i=t.tasks[r]?.status;n.push({id:`dm-${o}`,displayText:`@${o}`,description:i?`send message · ${i}`:"send message"})}if(n.length>0)return _e.cancel(),ue(e=>({commandArgumentHint:void 0,suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n)})),$e("agent"),void xe(void 0)}if("prompt"===me){const t=e.substring(0,n).match(B);if(t&&I(He.getState().mcp.clients))return void Fe(t[2]);"slack-channel"===we&&(Fe.cancel(),Oe())}const s=e.substring(0,n).match(G),r=n===e.length&&n>0&&e.length>0&&" "===e[n-1];if("prompt"===me&&L(e)&&n>0){const t=extractCommandNameAndArgs(e);if(t&&"add-dir"===t.commandName&&t.args){const{args:e}=t;if(e.match(/\s+$/))return _e.cancel(),void Oe();const n=await j(e);return n.length>0?(ue(e=>({suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n),commandArgumentHint:void 0})),void $e("directory")):(_e.cancel(),void Oe())}if(t&&"resume"===t.commandName&&void 0!==t.args&&e.includes(" ")){const{args:e}=t,n=(await H(e,{limit:10})).map(e=>{const t=k(e);return{id:`resume-title-${t}`,displayText:e.customTitle,description:x(e),metadata:{sessionId:t}}});return n.length>0?(ue(e=>({suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n),commandArgumentHint:void 0})),void $e("custom-title")):void Oe()}}const i="prompt"===me?function(e){const t=extractCommandNameAndArgs(e);if(!t||"team"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=i.toLowerCase();if(r.length<=1){const e=i.toLowerCase();return{suggestions:J.filter(t=>t.startsWith(e)).map(e=>buildTeamArgSuggestion(`team-subcommand-${e}`,e,replaceTeamArgs(`${e} `))),commandArgumentHint:"<subcomando>"}}if("list"===a)return{suggestions:[],commandArgumentHint:void 0};if("create"===a)return{suggestions:[],commandArgumentHint:"<nombre-equipo>"};if("show"===a)return{suggestions:[],commandArgumentHint:"<equipo>"};if("orchestrator"===a)return r.length<=2?{suggestions:[],commandArgumentHint:"<equipo>"}:{suggestions:getProviderAgentRefSuggestions(r[r.length-1]??"",r.slice(0,r.length-1),!1),commandArgumentHint:"<provider/agent>"};if("equipo"===a){if(r.length<=2)return{suggestions:[],commandArgumentHint:"<equipo>"};if(r.length<=3){const e=r[1]??"",t=(r[2]??"").toLowerCase();return{suggestions:X.filter(e=>e.startsWith(t)).map(t=>buildTeamArgSuggestion(`team-equipo-${t}`,t,replaceTeamArgs(["equipo",e,t,""].join(" ").trimEnd()+" "),`equipo ${t}`)),commandArgumentHint:"<area>"}}return{suggestions:getProviderAgentRefSuggestions(r[r.length-1]??"",r.slice(0,r.length-1),!1),commandArgumentHint:"<provider/agent>"}}if("add-member"===a){if(r.length<=2)return{suggestions:[],commandArgumentHint:"<equipo>"};if(r.length<=3){const e=r[1]??"",t=(r[2]??"").toLowerCase();return{suggestions:X.filter(e=>e.startsWith(t)).map(t=>buildTeamArgSuggestion(`team-member-equipo-${t}`,t,replaceTeamArgs(["add-member",e,t,""].join(" ").trimEnd()+" "),`equipo ${t}`)),commandArgumentHint:"<area>"}}return r.length<=4?{suggestions:getProviderAgentRefSuggestions(r[3]??"",r.slice(0,3)),commandArgumentHint:"<provider/agent>"}:{suggestions:[],commandArgumentHint:"[duty]"}}return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(i){const{suggestions:e,commandArgumentHint:t}=i;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const a="prompt"===me?function(e){const t=extractCommandNameAndArgs(e);if(!t||"workspace"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=i.toLowerCase();if(r.length<=1){const e=i.toLowerCase();return{suggestions:Z.filter(t=>t.startsWith(e)).map(e=>buildWorkspaceArgSuggestion(`workspace-subcommand-${e}`,e,replaceWorkspaceArgs(`${e} `))),commandArgumentHint:"<subcomando>"}}if(["show","enable","disable"].includes(a)&&r.length<=2){const e=(r[1]??"").toLowerCase();return{suggestions:Y.filter(t=>t.provider.startsWith(e)).map(e=>buildWorkspaceArgSuggestion(`workspace-provider-${e.provider}`,e.provider,replaceWorkspaceArgs(`${a} ${e.provider}`),e.label)),commandArgumentHint:"<proveedor>"}}if("orchestrator"===a)return{suggestions:[],commandArgumentHint:"[equipo] [provider/agent]"};if("setup"!==a)return{suggestions:[],commandArgumentHint:void 0};if(r.length<=2)return{suggestions:[],commandArgumentHint:"<equipo> [orchestrator=<area|provider/agent>]"};const l=r.length-1,g=r[l]??"",m=r.slice(0,l);if(!m.some(e=>e.toLowerCase().startsWith("orchestrator="))&&"orchestrator=".startsWith(g.toLowerCase()))return{suggestions:[buildWorkspaceArgSuggestion("workspace-orchestrator","orchestrator=",replaceWorkspaceArgs([...m,"orchestrator="].join(" ")),"escoger coordinador principal")],commandArgumentHint:"orchestrator=<area|provider/agent>"};if(g.toLowerCase().startsWith("orchestrator=")){const e=g.slice(13).toLowerCase(),t=X.filter(t=>t.startsWith(e)).map(e=>buildWorkspaceArgSuggestion(`workspace-orchestrator-equipo-${e}`,e,replaceWorkspaceArgs([...m,`orchestrator=${e} `].join(" ").trimEnd()),`usar el equipo ${e} como orquestador`)),n=[];for(const t of Y)for(const o of Q(t.provider)){const s=`${t.provider}/${o.agentName||`${o.name}-lead`}`;s.toLowerCase().startsWith(e)&&n.push(buildWorkspaceArgSuggestion(`workspace-orchestrator-agent-${o.id}`,s,replaceWorkspaceArgs([...m,`orchestrator=${s} `].join(" ").trimEnd()),`agente de ${t.label}`))}return{suggestions:[...t,...n],commandArgumentHint:"orchestrator=<area|provider/agent>"}}const c=g.indexOf(":");if(c>=0){const e=g.slice(0,c),t=g.slice(c+1).toLowerCase();return{suggestions:X.filter(e=>e.startsWith(t)).map(t=>buildWorkspaceArgSuggestion(`workspace-equipo-${e}-${t}`,t,replaceWorkspaceArgs([...m,`${e}:${t} `].join(" ").trimEnd()),`equipo ${t}`)),commandArgumentHint:"<proveedor/perfil:area>"}}const u=g.toLowerCase(),d=[];for(const e of Y)for(const t of Q(e.provider)){const n=`${e.provider}/${t.name}`;n.toLowerCase().startsWith(u)&&d.push(buildWorkspaceArgSuggestion(`workspace-profile-${t.id}`,`${n}:`,replaceWorkspaceArgs([...m,`${n}:`].join(" ")),t.lastModel?`${e.label} - ${t.lastModel}`:e.label))}return{suggestions:d,commandArgumentHint:"<proveedor/perfil:area>"}}(e):null;if(a){const{suggestions:e,commandArgumentHint:t}=a;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const l="prompt"===me?function(e){const t=extractCommandNameAndArgs(e);if(!t||"profile"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=r[1]??"",l=r[2]??"",g=i.toLowerCase(),makeProviderSuggestions=(e,t)=>Y.filter(t=>t.provider.startsWith(e.toLowerCase())).map(e=>buildProfileArgSuggestion(`profile-provider-${e.provider}`,e.provider,replaceProfileArgs(0,[...t,e.provider,""].join(" ").trimEnd()+" "),e.label)),makeProfileSuggestions=(e,t,n)=>e&&Y.some(t=>t.provider===e)?Q(e).filter(e=>e.name.toLowerCase().startsWith(t.toLowerCase())).map(e=>buildProfileArgSuggestion(`profile-name-${e.id}`,e.name,replaceProfileArgs(0,[...n,e.name,""].join(" ").trimEnd()+" "),`${e.agentName}${e.lastModel?` · ${e.lastModel}`:""}`)):[];if(r.length<=1){const e=i.toLowerCase();return{suggestions:U.filter(t=>t.startsWith(e)).map(e=>buildProfileArgSuggestion(`profile-subcommand-${e}`,e,replaceProfileArgs(0,`${e} `))),commandArgumentHint:"<subcomando>"}}if("list"===g||"current"===g)return{suggestions:[],commandArgumentHint:void 0};if("remove"===g&&r.length<=2){const e=a.toLowerCase();return{suggestions:[buildProfileArgSuggestion("profile-remove-all","all",replaceProfileArgs(0,"remove all"),"Eliminar todos los perfiles"),...makeProviderSuggestions(e,["remove"])].filter(t=>t.displayText.toLowerCase().startsWith(e)),commandArgumentHint:"<proveedor|all>"}}return["use","rename","remove","model","agent"].includes(g)&&r.length<=2?{suggestions:makeProviderSuggestions(a,[g]),commandArgumentHint:"<proveedor>"}:["use","remove","model","agent"].includes(g)&&r.length<=3?{suggestions:makeProfileSuggestions(a,l,[g,a]),commandArgumentHint:"<perfil>"}:"rename"===g&&r.length<=3?{suggestions:makeProfileSuggestions(a,l,[g,a]),commandArgumentHint:"<perfil-actual>"}:{suggestions:[],commandArgumentHint:void 0}}(e):null;if(l){const{suggestions:e,commandArgumentHint:t}=l;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const g="prompt"===me?getProviderCommandSuggestions(e):null;if(g){const{suggestions:e,commandArgumentHint:t}=g;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const c="prompt"===me?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("playwright"!==n&&"pw"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:ee.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`playwright-sub-${e.name}`,e.name,`/playwright ${e.name} `,e.description)),commandArgumentHint:"[status|browser|visible|headless|reset|help]"};if("browser"===a&&i.length<=2)return{suggestions:te.filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`playwright-browser-${e.name}`,e.name,`/playwright browser ${e.name} `,e.description)),commandArgumentHint:"<chromium|chrome|firefox|webkit|msedge>"};return("executable"===a||"device"===a||"viewport"===a)&&i.length<=2&&"clear".startsWith(l)?{suggestions:[buildSlashArgSuggestion(`playwright-${a}-clear`,"clear",`/playwright ${a} clear`,`Quitar ${a} custom`)],commandArgumentHint:"<valor|clear>"}:{suggestions:[],commandArgumentHint:void 0}}(e):null;if(c){const{suggestions:e,commandArgumentHint:t}=c;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const u="prompt"===me?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("whatsapp"!==n&&"wa"!==n&&"whats"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:ne.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`whatsapp-sub-${e.name}`,e.name,`/whatsapp ${e.name} `,e.description)),commandArgumentHint:"[status|permitidos|start|stop|global|help]"};if("global"===a&&i.length<=2)return{suggestions:oe.filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`whatsapp-global-${e.name}`,e.name,`/whatsapp global ${e.name} `,e.description)),commandArgumentHint:"<status|start|stop>"};return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(u){const{suggestions:e,commandArgumentHint:t}=u;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const d="prompt"===me?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("telegram"!==n&&"tg"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:se.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`telegram-sub-${e.name}`,e.name,`/telegram ${e.name} `,e.description)),commandArgumentHint:"[status|permitidos|global|help]"};if("global"===a&&i.length<=2)return{suggestions:oe.filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`telegram-global-${e.name}`,e.name,`/telegram global ${e.name} `,e.description)),commandArgumentHint:"<status|start|stop>"};return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(d){const{suggestions:e,commandArgumentHint:t}=d;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const p="prompt"===me?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("webapp"!==n&&"app"!==n&&"pwa"!==n&&"aplicacion-web"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:re.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`webapp-sub-${e.name}`,e.name,`/webapp ${e.name} `,e.description)),commandArgumentHint:"[start|stop|status|open|token|port|autostart|help]"};if("token"===a&&i.length<=2)return{suggestions:[{name:"reset",description:"Regenerar token (invalida el anterior)"}].filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`webapp-token-${e.name}`,e.name,`/webapp token ${e.name} `,e.description)),commandArgumentHint:"[reset]"};return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(p){const{suggestions:e,commandArgumentHint:t}=p;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}if("bash"!==me&&L(e)&&n>0&&!r){const t=e.slice(1).toLowerCase();if(!function(e,t){return!e&&t.includes(" ")&&!t.endsWith(" ")}(r,e)){const e=_.filter(e=>!e.isHidden).filter(e=>m(e).startsWith(t)||(e.aliases??[]).some(e=>e.startsWith(t))).map(e=>({id:m(e),displayText:`/${m(e)}`,description:e.description??"",metadata:e}));return ue(t=>({commandArgumentHint:void 0,suggestions:e,selectedSuggestion:getPreservedSelection(t.suggestions,t.selectedSuggestion,e)})),$e(e.length>0?"command":"none"),void xe(e.length>0?ye:void 0)}}if(s){const t=extractCompletionToken(e,n,!0);if(t){const e=t.token.startsWith("@"),n=e?t.token.substring(1):t.token;return void _e(n,e)}}_e.cancel(),Oe()},[me,he,_,Oe,_e,ue,ye,Fe,we]);n(()=>{Ve.current!==le&&(Qe.current!==le&&(Qe.current=le,qe.current=null),Ve.current=null,Ke(le))},[le,Ke]);const Ge=t(async()=>{if(Me){if("bash"===me)return z(Me.fullCommand),K(Me.fullCommand.length),void je(void 0);const e=T(le,ge);if(e){const t=le.slice(0,e.startPos),n=le.slice(e.startPos+e.token.length),o=t+"/"+Me.fullCommand+" "+n,s=e.startPos+1+Me.fullCommand.length+1;return z(o),void K(s)}}if(de.length>0){_e.cancel(),Fe.cancel();const e=-1===pe?0:pe,t=de[e];if("command"===we&&e<de.length)t&&(P(t,!1,_,z,K,F),Oe());else if("command-arg"===we&&e<de.length)t&&(applyCommandArgSuggestion(t,z,K),Oe());else if("custom-title"===we&&de.length>0){if(t){const e=buildResumeInputFromSuggestion(t);z(e),K(e.length),Oe()}}else if("directory"===we&&de.length>0){const t=de[e];if(t){let e;if(L(le)){const n=le.indexOf(" "),o=le.slice(0,n+1),s=isPathMetadata(t.metadata)&&"directory"===t.metadata.type?"/":" ";e=o+t.id+s,z(e),K(e.length),isPathMetadata(t.metadata)&&"directory"===t.metadata.type?(ue(e=>({...e,commandArgumentHint:void 0})),Ke(e,e.length)):Oe()}else{const n=extractCompletionToken(le,ge,!0)??extractCompletionToken(le,ge,!1);if(n){const o=isPathMetadata(t.metadata)&&"directory"===t.metadata.type,s=applyDirectorySuggestion(le,t.id,n.startPos,n.token.length,o);e=s.newInput,z(e),K(s.cursorPos),o?(ue(e=>({...e,commandArgumentHint:void 0})),Ke(e,s.cursorPos)):Oe()}else Oe()}}}else if("shell"===we&&de.length>0){const t=de[e];if(t){const e=t.metadata;applyShellSuggestion(t,le,ge,z,K,e?.completionType),Oe()}}else if("agent"===we&&de.length>0&&de[e]?.id?.startsWith("dm-")){const t=de[e];t&&(applyTriggerSuggestion(t,le,ge,ie,z,K),Oe())}else if("slack-channel"===we&&de.length>0){const t=de[e];t&&(applyTriggerSuggestion(t,le,ge,B,z,K),Oe())}else if("file"===we&&de.length>0){const t=extractCompletionToken(le,ge,!0);if(!t)return void Oe();const n=D(de),o=t.token.startsWith("@");let s;if(s=t.isQuoted?t.token.slice(2).replace(/"$/,"").length:o?t.token.length-1:t.token.length,n.length>s){const e=formatReplacementValue({displayText:n,mode:me,hasAtPrefix:o,needsQuotes:!1,isQuoted:t.isQuoted,isComplete:!1});R(e,le,t.token,t.startPos,z,K),Ke(le.replace(t.token,e),ge)}else if(e<de.length){const n=de[e];if(n){const e=n.displayText.includes(" "),s=formatReplacementValue({displayText:n.displayText,mode:me,hasAtPrefix:o,needsQuotes:e,isQuoted:t.isQuoted,isComplete:!0});R(s,le,t.token,t.startPos,z,K),Oe()}}}}else if(""!==le.trim()){let e,t;if("bash"===me){e="shell";const n=await async function(e,t){try{return ae&&ae.abort(),ae=new AbortController,await C(e,t,ae.signal)}catch{return l("tengu_shell_completion_failed",{}),[]}}(le,ge);if(1===n.length){const e=n[0];if(e){const t=e.metadata;applyShellSuggestion(e,le,ge,z,K,t?.completionType)}t=[]}else t=n}else{e="file";const n=extractCompletionToken(le,ge,!0);if(n){const e=n.token.startsWith("@"),o=e?n.token.substring(1):n.token;t=await E(o,ke,ce,e)}else t=[]}t.length>0&&(ue(e=>({commandArgumentHint:void 0,suggestions:t,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,t)})),$e(e),xe(void 0))}},[de,pe,le,we,_,me,z,K,F,Oe,ge,Ke,ke,ue,ce,_e,Fe,Me]),Be=t(()=>{if(pe<0||0===de.length)return;const e=de[pe];if("command"===we&&pe<de.length)e&&(P(e,!0,_,z,K,F),_e.cancel(),Oe());else if("command-arg"===we&&pe<de.length){if(e){const t=e.metadata;if((t?.replacement??e.displayText).trim()===le.trim())return _e.cancel(),Oe(),void F(le,!0);applyCommandArgSuggestion(e,z,K),_e.cancel(),Oe()}}else if("custom-title"===we&&pe<de.length){if(e){const t=buildResumeInputFromSuggestion(e);z(t),K(t.length),F(t,!0),_e.cancel(),Oe()}}else if("shell"===we&&pe<de.length){const e=de[pe];if(e){const t=e.metadata;applyShellSuggestion(e,le,ge,z,K,t?.completionType),_e.cancel(),Oe()}}else if("agent"===we&&pe<de.length&&e?.id?.startsWith("dm-"))applyTriggerSuggestion(e,le,ge,ie,z,K),_e.cancel(),Oe();else if("slack-channel"===we&&pe<de.length)e&&(applyTriggerSuggestion(e,le,ge,B,z,K),Fe.cancel(),Oe());else if("file"===we&&pe<de.length){const t=extractCompletionToken(le,ge,!0);if(t&&e){const n=t.token.startsWith("@"),o=e.displayText.includes(" "),s=formatReplacementValue({displayText:e.displayText,mode:me,hasAtPrefix:n,needsQuotes:o,isQuoted:t.isQuoted,isComplete:!0});R(s,le,t.token,t.startPos,z,K),_e.cancel(),Oe()}}else if("directory"===we&&pe<de.length&&e){if(L(le))return _e.cancel(),void Oe();const t=extractCompletionToken(le,ge,!0)??extractCompletionToken(le,ge,!1);if(t){const n=isPathMetadata(e.metadata)&&"directory"===e.metadata.type,o=applyDirectorySuggestion(le,e.id,t.startPos,t.token.length,n);z(o.newInput),K(o.cursorPos)}_e.cancel(),Oe()}},[de,pe,we,_,le,ge,me,z,K,F,Oe,_e,Fe]),Ue=t(()=>{Ge()},[Ge]),Ze=t(()=>{_e.cancel(),Fe.cancel(),Oe(),Ve.current=le},[_e,Fe,Oe,le]),Je=t(()=>{ue(e=>({...e,selectedSuggestion:e.selectedSuggestion<=0?de.length-1:e.selectedSuggestion-1}))},[de.length,ue]),Xe=t(()=>{ue(e=>({...e,selectedSuggestion:e.selectedSuggestion>=de.length-1?0:e.selectedSuggestion+1}))},[de.length,ue]),Ye=o(()=>({"autocomplete:accept":Ue,"autocomplete:dismiss":Ze,"autocomplete:previous":Je,"autocomplete:next":Xe}),[Ue,Ze,Je,Xe]),et=de.length>0||!!Me,tt=d();function acceptSuggestionText(e){const t=c(e);if("prompt"!==t&&Ae){Ae(t);const n=u(e);z(n),K(n.length)}else z(e),K(e.length)}p("autocomplete",et),A("Autocomplete",et),b(Ye,{context:"Autocomplete",isActive:et&&!tt});const handleKeyDown=t=>{if("right"===t.key&&!Te){const e=Pe.text,n=Pe.shownAt;if(e&&n>0&&""===le)return ve(),acceptSuggestionText(e),void t.stopImmediatePropagation()}if("tab"===t.key&&!t.shift){if(de.length>0||Me)return;const n=Pe.text,o=Pe.shownAt;return n&&o>0&&""===le&&!Te?(t.preventDefault(),ve(),void acceptSuggestionText(n)):void(""===le.trim()&&(t.preventDefault(),be({key:"thinking-toggle-hint",jsx:e(a,{dimColor:!0,children:["Usa ",Se," para alternar el modo de razonamiento"]}),priority:"immediate",timeoutMs:3e3})))}if(0===de.length)return;const n=null!=We?.pendingChord;return t.ctrl&&"n"===t.key&&!n?(t.preventDefault(),void Xe()):t.ctrl&&"p"===t.key&&!n?(t.preventDefault(),void Je()):void("return"!==t.key||t.shift||t.meta||(t.preventDefault(),Be()))};return h((e,t,n)=>{const o=new f(n.keypress);handleKeyDown(o),o.didStopImmediatePropagation()&&n.stopImmediatePropagation()}),{suggestions:de,selectedSuggestion:pe,suggestionType:we,maxColumnWidth:Ce,commandArgumentHint:fe,inlineGhostText:Me,handleKeyDown}}
1
+ import{jsxs as e}from"react/jsx-runtime";import{useCallback as t,useEffect as n,useMemo as o,useRef as s,useState as r}from"react";import{useNotifications as i}from"../context/notifications.js";import{Text as a}from"../ink.js";import{logEvent as l}from"../services/analytics/index.js";import{useDebounceCallback as m}from"usehooks-ts";import{getCommandName as g}from"../commands.js";import{getModeFromInput as c,getValueFromInput as u}from"../components/PromptInput/inputModes.js";import{useIsModalOverlayActive as d,useRegisterOverlay as p}from"../context/overlayContext.js";import{KeyboardEvent as f}from"../ink/events/keyboard-event.js";import{useInput as h}from"../ink.js";import{useOptionalKeybindingContext as v,useRegisterKeybindingContext as A}from"../keybindings/KeybindingContext.js";import{useKeybindings as b}from"../keybindings/useKeybinding.js";import{useShortcutDisplay as S}from"../keybindings/useShortcutDisplay.js";import{useAppState as w,useAppStateStore as $}from"../state/AppState.js";import{isAgentSwarmsEnabled as y}from"../utils/agentSwarmsEnabled.js";import{getShellCompletions as C}from"../utils/bash/shellCompletion.js";import{formatLogMetadata as x}from"../utils/format.js";import{getSessionIdFromLog as k,searchSessionsByCustomTitle as H}from"../utils/sessionStorage.js";import{applyCommandSuggestion as P,findMidInputSlashCommand as T,getBestCommandMatch as W,isCommandInput as L}from"../utils/suggestions/commandSuggestions.js";import{getDirectoryCompletions as j}from"../utils/suggestions/directoryCompletion.js";import{getShellHistoryCompletion as N}from"../utils/suggestions/shellHistoryCompletion.js";import{getSlackChannelSuggestions as I,hasSlackMcpServer as M}from"../utils/suggestions/slackChannelSuggestions.js";import{TEAM_LEAD_NAME as q}from"../utils/swarm/constants.js";import{listProviderProfiles as Q}from"../utils/model/providerProfiles.js";import{applyFileSuggestion as D,findLongestCommonPrefix as R,onIndexBuildComplete as V,startBackgroundCacheRefresh as O}from"./fileSuggestions.js";import{generateUnifiedSuggestions as E}from"./unifiedSuggestions.js";const _=/^@[\p{L}\p{N}\p{M}_\-./\\()[\]~:]*/u,z=/^[\p{L}\p{N}\p{M}_\-./\\()[\]~:]+/u,G=/(@[\p{L}\p{N}\p{M}_\-./\\()[\]~:]*|[\p{L}\p{N}\p{M}_\-./\\()[\]~:]+)$/u,F=/[\p{L}\p{N}\p{M}_\-./\\()[\]~:]+$/u,K=/(^|\s)@([\p{L}\p{N}\p{M}_\-./\\()[\]~:]*|"[^"]*"?)$/u,B=/(^|\s)#([a-z0-9][a-z0-9_-]*)$/,U=["list","current","use","rename","remove","model","agent"],Z=["list","show","enable","disable","setup","orchestrator"],J=["list","create","show","orchestrator","equipo","add-member"],X=["frontend","backend","docs","tests","review","database","devops"],Y=[{provider:"claude",label:"Context"},{provider:"openai",label:"OpenAI"},{provider:"openrouter",label:"OpenRouter"},{provider:"ollama",label:"Ollama"},{provider:"ollama-cloud",label:"Ollama Cloud"},{provider:"gemini-api",label:"Gemini API"},{provider:"gemini-google",label:"Gemini Google OAuth"},{provider:"zai",label:"Z.AI"},{provider:"minimax",label:"MiniMax"},{provider:"nvidia",label:"NVIDIA API"},{provider:"deepseek",label:"DeepSeek"},{provider:"custom-openai",label:"Custom OpenAI"},{provider:"custom-anthropic",label:"Custom Anthropic"}];function isPathMetadata(e){return"object"==typeof e&&null!==e&&"type"in e&&("directory"===e.type||"file"===e.type)}function getPreservedSelection(e,t,n){if(0===n.length)return-1;if(t<0)return 0;const o=e[t];if(!o)return 0;const s=n.findIndex(e=>e.id===o.id);return s>=0?s:0}function replaceProfileArgs(e,t){const n="/profile";return t.length>0?`${n} ${t}`:n}function buildProfileArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}function replaceWorkspaceArgs(e){const t="/workspace";return e.length>0?`${t} ${e}`:t}function buildWorkspaceArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}function replaceTeamArgs(e){const t="/team";return e.length>0?`${t} ${e}`:t}function buildTeamArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}function getProviderCommandSuggestions(e){const t=extractCommandNameAndArgs(e);if(!t||"provider"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=r[1]??"",makeProviderSuggestions=e=>Y.filter(t=>t.provider.startsWith(e.toLowerCase())).map(e=>buildProfileArgSuggestion(`provider-choice-${e.provider}`,e.provider,`/provider ${e.provider} `,e.label));if(r.length<=1){const e=i.toLowerCase();return{suggestions:[...["list","current","reset"].filter(t=>t.startsWith(e)).map(e=>buildProfileArgSuggestion(`provider-subcommand-${e}`,e,`/provider ${e} `,"list"===e?"Listar proveedores":"current"===e?"Ver proveedor actual":"Resetear configuración")),...makeProviderSuggestions(e)],commandArgumentHint:"<proveedor|list|current>"}}if(["list","current","reset"].includes(i.toLowerCase()))return{suggestions:[],commandArgumentHint:void 0};if(Y.some(e=>e.provider===i.toLowerCase())&&r.length<=2){const e=a.toLowerCase(),t=((e,t)=>Q(e).filter(e=>e.name.toLowerCase().startsWith(t.toLowerCase())).map(t=>buildProfileArgSuggestion(`provider-profile-${t.id}`,t.name,`/provider ${e} ${t.name} `,`${t.agentName}${t.lastModel?` · ${t.lastModel}`:""}`)))(i.toLowerCase(),e);return{suggestions:[...t,...["reset","set","url","clear"].filter(t=>t.startsWith(e)).map(e=>buildProfileArgSuggestion(`provider-keyword-${e}`,e,`/provider ${i} ${e} `,`Acción: ${e}`))],commandArgumentHint:"<perfil|url|reset>"}}return{suggestions:[],commandArgumentHint:void 0}}function buildSlashArgSuggestion(e,t,n,o){return{id:e,displayText:t,description:o,metadata:{replacement:n}}}const ee=[{name:"status",description:"Ver configuración actual"},{name:"browser",description:"Cambiar navegador",valueAfter:"<chromium|chrome|firefox|webkit|msedge>"},{name:"visible",description:"Modo visible (headed)"},{name:"headless",description:"Modo oculto (headless)"},{name:"executable",description:'Ruta a binario custom o "clear"'},{name:"device",description:'Dispositivo a emular o "clear"'},{name:"viewport",description:'Tamaño viewport (ej 1280x720) o "clear"'},{name:"reset",description:"Borrar config y volver a defaults"},{name:"help",description:"Ver ayuda detallada"}],te=[{name:"chromium",description:"Chromium (default, Playwright lo descarga)"},{name:"chrome",description:"Google Chrome del sistema"},{name:"msedge",description:"Microsoft Edge del sistema (Windows)"},{name:"firefox",description:"Firefox (Playwright lo descarga)"},{name:"webkit",description:"WebKit (Playwright lo descarga)"}];const ne=[{name:"status",description:"Ver estado del bridge y números autorizados"},{name:"permitidos",description:"Listar/configurar números autorizados"},{name:"start",description:"Iniciar bridge (requiere cuenta vinculada)"},{name:"stop",description:"Detener bridge"},{name:"help",description:"Ver ayuda detallada"},{name:"global",description:"Subcomandos del canal global (status/start/stop)"}],oe=[{name:"status",description:"Estado del daemon global"},{name:"start",description:"Iniciar daemon global"},{name:"stop",description:"Detener daemon global"}];const se=[{name:"status",description:"Ver estado del bot y usuarios permitidos"},{name:"permitidos",description:"Listar usuarios autorizados"},{name:"help",description:"Ver ayuda detallada"},{name:"global",description:"Subcomandos del canal global (status/start/stop)"}];const re=[{name:"start",description:"Iniciar servidor y abrir en navegador"},{name:"stop",description:"Detener servidor web"},{name:"status",description:"Ver estado del servidor y conexiones"},{name:"open",description:"Abrir la WebApp en el navegador"},{name:"token",description:"Ver token de autenticación actual"},{name:"port",description:"Cambiar puerto del servidor"},{name:"autostart",description:"Activar/desactivar inicio automático"},{name:"help",description:"Ver ayuda detallada"}];function getProviderAgentRefSuggestions(e,t,n=!0){const o=e.toLowerCase(),s=[];for(const e of Y)for(const r of Q(e.provider)){const i=`${e.provider}/${r.agentName||`${r.name}-lead`}`;i.toLowerCase().startsWith(o)&&s.push(buildTeamArgSuggestion(`team-agent-${r.id}`,i,replaceTeamArgs([...t,i].join(" ")+(n?" ":"")),r.lastModel?`${e.label} - ${r.lastModel}`:e.label))}return s}function applyCommandArgSuggestion(e,t,n){const o=e.metadata,s=o?.replacement??e.displayText;t(s),n(s.length)}function buildResumeInputFromSuggestion(e){const t=e.metadata;return t?.sessionId?`/resume ${t.sessionId}`:`/resume ${e.displayText}`}export function extractSearchToken(e){return e.isQuoted?e.token.slice(2).replace(/"$/,""):e.token.startsWith("@")?e.token.substring(1):e.token}export function formatReplacementValue(e){const{displayText:t,mode:n,hasAtPrefix:o,needsQuotes:s,isQuoted:r,isComplete:i}=e,a=i?" ":"";return r||s?"bash"===n?`"${t}"${a}`:`@"${t}"${a}`:o?"bash"===n?`${t}${a}`:`@${t}${a}`:t}export function applyShellSuggestion(e,t,n,o,s,r){const i=t.slice(0,n).lastIndexOf(" ")+1;let a;a="variable"===r?"$"+e.displayText+" ":"command"===r?e.displayText+" ":e.displayText;o(t.slice(0,i)+a+t.slice(n)),s(i+a.length)}const ie=/(^|\s)@[\w-]*$/;function applyTriggerSuggestion(e,t,n,o,s,r){const i=t.slice(0,n).match(o);if(!i||void 0===i.index)return;const a=i.index+(i[1]?.length??0),l=t.slice(0,a);s(l+e.displayText+" "+t.slice(n)),r(l.length+e.displayText.length+1)}let ae=null;export function applyDirectorySuggestion(e,t,n,o,s){const r=s?"/":" ",i=e.slice(0,n),a="@"+t+r;return{newInput:i+a+e.slice(n+o),cursorPos:i.length+a.length}}export function extractCompletionToken(e,t,n=!1){if(!e)return null;const o=e.substring(0,t);if(n){const n=/@"([^"]*)"?$/,s=o.match(n);if(s&&void 0!==s.index){const n=e.substring(t).match(/^[^"]*"?/),o=n?n[0]:"";return{token:s[0]+o,startPos:s.index,isQuoted:!0}}}if(n){const n=o.lastIndexOf("@");if(n>=0&&(0===n||/\s/.test(o[n-1]))){const s=o.substring(n),r=s.match(_);if(r&&r[0].length===s.length){const o=e.substring(t).match(z),s=o?o[0]:"";return{token:r[0]+s,startPos:n,isQuoted:!1}}}}const s=n?G:F,r=o.match(s);if(!r||void 0===r.index)return null;const i=e.substring(t).match(z),a=i?i[0]:"";return{token:r[0]+a,startPos:r.index,isQuoted:!1}}function extractCommandNameAndArgs(e){if(L(e)){const t=e.indexOf(" ");return-1===t?{commandName:e.slice(1),args:""}:{commandName:e.slice(1,t),args:e.slice(t+1)}}return null}export function useTypeahead({commands:_,onInputChange:z,onSubmit:G,setCursorOffset:F,input:le,cursorOffset:me,mode:ge,agents:ce,setSuggestionsState:ue,suggestionsState:{suggestions:de,selectedSuggestion:pe,commandArgumentHint:fe},suppressSuggestions:he=!1,markAccepted:ve,onModeChange:Ae}){const{addNotification:be}=i(),Se=S("chat:thinkingToggle","Chat","alt+t"),[we,$e]=r("none"),ye=o(()=>{const e=_.filter(e=>!e.isHidden);if(0===e.length)return;return Math.max(...e.map(e=>g(e).length))+6},[_]),[Ce,xe]=r(void 0),ke=w(e=>e.mcp.resources),He=$(),Pe=w(e=>e.promptSuggestion),Te=w(e=>!!e.viewingAgentTaskId),We=v(),[Le,je]=r(void 0),Ne=o(()=>{if("prompt"!==ge||he)return;const e=T(le,me);if(!e)return;const t=W(e.partialCommand,_);return t?{text:t.suffix,fullCommand:t.fullCommand,insertPosition:e.startPos+1+e.partialCommand.length}:void 0},[le,me,ge,_,he]),Ie=he?void 0:"prompt"===ge?Ne:Le,Me=s(me);Me.current=me;const qe=s(null),Qe=s(""),De=(s(""),s("")),Re=s("");s(de).current=de;const Ve=s(null),Oe=t(()=>{ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),xe(void 0),je(void 0)},[ue]),Ee=t(async(e,t=!1)=>{qe.current=e;const n=await E(e,ke,ce,t);if(qe.current===e){if(0===n.length)return ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),void xe(void 0);ue(e=>({commandArgumentHint:void 0,suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n)})),$e(n.length>0?"file":"none"),xe(void 0)}},[ke,ue,$e,xe,ce]);n(()=>(O(),V(()=>{const e=qe.current;null!==e&&(qe.current=null,Ee(e,""===e))})),[Ee]);const _e=m(Ee,50),ze=t(async e=>{Re.current=e;const t=await I(He.getState().mcp.clients,e);Re.current===e&&(ue(e=>({commandArgumentHint:void 0,suggestions:t,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,t)})),$e(t.length>0?"slack-channel":"none"),xe(void 0))},[ue]),Ge=m(ze,150),Fe=t(async(e,t)=>{const n=t??Me.current;if(he)return _e.cancel(),void Oe();if("prompt"===ge){const t=T(e,n);if(t){if(W(t.partialCommand,_))return ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),void xe(void 0)}}if("bash"===ge&&e.trim()){De.current=e;const t=await N(e);if(De.current!==e)return;if(t)return je({text:t.suffix,fullCommand:t.fullCommand,insertPosition:e.length}),ue(()=>({commandArgumentHint:void 0,suggestions:[],selectedSuggestion:-1})),$e("none"),void xe(void 0);je(void 0)}const o="bash"!==ge?e.substring(0,n).match(/(^|\s)@([\w-]*)$/):null;if(o){const e=(o[2]??"").toLowerCase(),t=He.getState(),n=[],s=new Set;if(y()&&t.teamContext)for(const o of Object.values(t.teamContext.teammates??{}))o.name!==q&&o.name.toLowerCase().startsWith(e)&&(s.add(o.name),n.push({id:`dm-${o.name}`,displayText:`@${o.name}`,description:"send message"}));for(const[o,r]of t.agentNameRegistry){if(s.has(o))continue;if(!o.toLowerCase().startsWith(e))continue;const i=t.tasks[r]?.status;n.push({id:`dm-${o}`,displayText:`@${o}`,description:i?`send message · ${i}`:"send message"})}if(n.length>0)return _e.cancel(),ue(e=>({commandArgumentHint:void 0,suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n)})),$e("agent"),void xe(void 0)}if("prompt"===ge){const t=e.substring(0,n).match(B);if(t&&M(He.getState().mcp.clients))return void Ge(t[2]);"slack-channel"===we&&(Ge.cancel(),Oe())}const s=e.substring(0,n).match(K),r=n===e.length&&n>0&&e.length>0&&" "===e[n-1];if("prompt"===ge&&L(e)&&n>0){const t=extractCommandNameAndArgs(e);if(t&&"add-dir"===t.commandName&&t.args){const{args:e}=t;if(e.match(/\s+$/))return _e.cancel(),void Oe();const n=await j(e);return n.length>0?(ue(e=>({suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n),commandArgumentHint:void 0})),void $e("directory")):(_e.cancel(),void Oe())}if(t&&"resume"===t.commandName&&void 0!==t.args&&e.includes(" ")){const{args:e}=t,n=(await H(e,{limit:10})).map(e=>{const t=k(e);return{id:`resume-title-${t}`,displayText:e.customTitle,description:x(e),metadata:{sessionId:t}}});return n.length>0?(ue(e=>({suggestions:n,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,n),commandArgumentHint:void 0})),void $e("custom-title")):void Oe()}}const i="prompt"===ge?function(e){const t=extractCommandNameAndArgs(e);if(!t||"team"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=i.toLowerCase();if(r.length<=1){const e=i.toLowerCase();return{suggestions:J.filter(t=>t.startsWith(e)).map(e=>buildTeamArgSuggestion(`team-subcommand-${e}`,e,replaceTeamArgs(`${e} `))),commandArgumentHint:"<subcomando>"}}if("list"===a)return{suggestions:[],commandArgumentHint:void 0};if("create"===a)return{suggestions:[],commandArgumentHint:"<nombre-equipo>"};if("show"===a)return{suggestions:[],commandArgumentHint:"<equipo>"};if("orchestrator"===a)return r.length<=2?{suggestions:[],commandArgumentHint:"<equipo>"}:{suggestions:getProviderAgentRefSuggestions(r[r.length-1]??"",r.slice(0,r.length-1),!1),commandArgumentHint:"<provider/agent>"};if("equipo"===a){if(r.length<=2)return{suggestions:[],commandArgumentHint:"<equipo>"};if(r.length<=3){const e=r[1]??"",t=(r[2]??"").toLowerCase();return{suggestions:X.filter(e=>e.startsWith(t)).map(t=>buildTeamArgSuggestion(`team-equipo-${t}`,t,replaceTeamArgs(["equipo",e,t,""].join(" ").trimEnd()+" "),`equipo ${t}`)),commandArgumentHint:"<area>"}}return{suggestions:getProviderAgentRefSuggestions(r[r.length-1]??"",r.slice(0,r.length-1),!1),commandArgumentHint:"<provider/agent>"}}if("add-member"===a){if(r.length<=2)return{suggestions:[],commandArgumentHint:"<equipo>"};if(r.length<=3){const e=r[1]??"",t=(r[2]??"").toLowerCase();return{suggestions:X.filter(e=>e.startsWith(t)).map(t=>buildTeamArgSuggestion(`team-member-equipo-${t}`,t,replaceTeamArgs(["add-member",e,t,""].join(" ").trimEnd()+" "),`equipo ${t}`)),commandArgumentHint:"<area>"}}return r.length<=4?{suggestions:getProviderAgentRefSuggestions(r[3]??"",r.slice(0,3)),commandArgumentHint:"<provider/agent>"}:{suggestions:[],commandArgumentHint:"[duty]"}}return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(i){const{suggestions:e,commandArgumentHint:t}=i;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const a="prompt"===ge?function(e){const t=extractCommandNameAndArgs(e);if(!t||"workspace"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=i.toLowerCase();if(r.length<=1){const e=i.toLowerCase();return{suggestions:Z.filter(t=>t.startsWith(e)).map(e=>buildWorkspaceArgSuggestion(`workspace-subcommand-${e}`,e,replaceWorkspaceArgs(`${e} `))),commandArgumentHint:"<subcomando>"}}if(["show","enable","disable"].includes(a)&&r.length<=2){const e=(r[1]??"").toLowerCase();return{suggestions:Y.filter(t=>t.provider.startsWith(e)).map(e=>buildWorkspaceArgSuggestion(`workspace-provider-${e.provider}`,e.provider,replaceWorkspaceArgs(`${a} ${e.provider}`),e.label)),commandArgumentHint:"<proveedor>"}}if("orchestrator"===a)return{suggestions:[],commandArgumentHint:"[equipo] [provider/agent]"};if("setup"!==a)return{suggestions:[],commandArgumentHint:void 0};if(r.length<=2)return{suggestions:[],commandArgumentHint:"<equipo> [orchestrator=<area|provider/agent>]"};const l=r.length-1,m=r[l]??"",g=r.slice(0,l);if(!g.some(e=>e.toLowerCase().startsWith("orchestrator="))&&"orchestrator=".startsWith(m.toLowerCase()))return{suggestions:[buildWorkspaceArgSuggestion("workspace-orchestrator","orchestrator=",replaceWorkspaceArgs([...g,"orchestrator="].join(" ")),"escoger coordinador principal")],commandArgumentHint:"orchestrator=<area|provider/agent>"};if(m.toLowerCase().startsWith("orchestrator=")){const e=m.slice(13).toLowerCase(),t=X.filter(t=>t.startsWith(e)).map(e=>buildWorkspaceArgSuggestion(`workspace-orchestrator-equipo-${e}`,e,replaceWorkspaceArgs([...g,`orchestrator=${e} `].join(" ").trimEnd()),`usar el equipo ${e} como orquestador`)),n=[];for(const t of Y)for(const o of Q(t.provider)){const s=`${t.provider}/${o.agentName||`${o.name}-lead`}`;s.toLowerCase().startsWith(e)&&n.push(buildWorkspaceArgSuggestion(`workspace-orchestrator-agent-${o.id}`,s,replaceWorkspaceArgs([...g,`orchestrator=${s} `].join(" ").trimEnd()),`agente de ${t.label}`))}return{suggestions:[...t,...n],commandArgumentHint:"orchestrator=<area|provider/agent>"}}const c=m.indexOf(":");if(c>=0){const e=m.slice(0,c),t=m.slice(c+1).toLowerCase();return{suggestions:X.filter(e=>e.startsWith(t)).map(t=>buildWorkspaceArgSuggestion(`workspace-equipo-${e}-${t}`,t,replaceWorkspaceArgs([...g,`${e}:${t} `].join(" ").trimEnd()),`equipo ${t}`)),commandArgumentHint:"<proveedor/perfil:area>"}}const u=m.toLowerCase(),d=[];for(const e of Y)for(const t of Q(e.provider)){const n=`${e.provider}/${t.name}`;n.toLowerCase().startsWith(u)&&d.push(buildWorkspaceArgSuggestion(`workspace-profile-${t.id}`,`${n}:`,replaceWorkspaceArgs([...g,`${n}:`].join(" ")),t.lastModel?`${e.label} - ${t.lastModel}`:e.label))}return{suggestions:d,commandArgumentHint:"<proveedor/perfil:area>"}}(e):null;if(a){const{suggestions:e,commandArgumentHint:t}=a;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const l="prompt"===ge?function(e){const t=extractCommandNameAndArgs(e);if(!t||"profile"!==t.commandName)return null;const n=t.args??"",o=/\s$/.test(n),s=n.trim().length>0?n.trim().split(/\s+/):[],r=o?[...s,""]:s,i=r[0]??"",a=r[1]??"",l=r[2]??"",m=i.toLowerCase(),makeProviderSuggestions=(e,t)=>Y.filter(t=>t.provider.startsWith(e.toLowerCase())).map(e=>buildProfileArgSuggestion(`profile-provider-${e.provider}`,e.provider,replaceProfileArgs(0,[...t,e.provider,""].join(" ").trimEnd()+" "),e.label)),makeProfileSuggestions=(e,t,n)=>e&&Y.some(t=>t.provider===e)?Q(e).filter(e=>e.name.toLowerCase().startsWith(t.toLowerCase())).map(e=>buildProfileArgSuggestion(`profile-name-${e.id}`,e.name,replaceProfileArgs(0,[...n,e.name,""].join(" ").trimEnd()+" "),`${e.agentName}${e.lastModel?` · ${e.lastModel}`:""}`)):[];if(r.length<=1){const e=i.toLowerCase();return{suggestions:U.filter(t=>t.startsWith(e)).map(e=>buildProfileArgSuggestion(`profile-subcommand-${e}`,e,replaceProfileArgs(0,`${e} `))),commandArgumentHint:"<subcomando>"}}if("list"===m||"current"===m)return{suggestions:[],commandArgumentHint:void 0};if("remove"===m&&r.length<=2){const e=a.toLowerCase();return{suggestions:[buildProfileArgSuggestion("profile-remove-all","all",replaceProfileArgs(0,"remove all"),"Eliminar todos los perfiles"),...makeProviderSuggestions(e,["remove"])].filter(t=>t.displayText.toLowerCase().startsWith(e)),commandArgumentHint:"<proveedor|all>"}}return["use","rename","remove","model","agent"].includes(m)&&r.length<=2?{suggestions:makeProviderSuggestions(a,[m]),commandArgumentHint:"<proveedor>"}:["use","remove","model","agent"].includes(m)&&r.length<=3?{suggestions:makeProfileSuggestions(a,l,[m,a]),commandArgumentHint:"<perfil>"}:"rename"===m&&r.length<=3?{suggestions:makeProfileSuggestions(a,l,[m,a]),commandArgumentHint:"<perfil-actual>"}:{suggestions:[],commandArgumentHint:void 0}}(e):null;if(l){const{suggestions:e,commandArgumentHint:t}=l;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const m="prompt"===ge?getProviderCommandSuggestions(e):null;if(m){const{suggestions:e,commandArgumentHint:t}=m;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const c="prompt"===ge?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("playwright"!==n&&"pw"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:ee.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`playwright-sub-${e.name}`,e.name,`/playwright ${e.name} `,e.description)),commandArgumentHint:"[status|browser|visible|headless|reset|help]"};if("browser"===a&&i.length<=2)return{suggestions:te.filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`playwright-browser-${e.name}`,e.name,`/playwright browser ${e.name} `,e.description)),commandArgumentHint:"<chromium|chrome|firefox|webkit|msedge>"};return("executable"===a||"device"===a||"viewport"===a)&&i.length<=2&&"clear".startsWith(l)?{suggestions:[buildSlashArgSuggestion(`playwright-${a}-clear`,"clear",`/playwright ${a} clear`,`Quitar ${a} custom`)],commandArgumentHint:"<valor|clear>"}:{suggestions:[],commandArgumentHint:void 0}}(e):null;if(c){const{suggestions:e,commandArgumentHint:t}=c;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const u="prompt"===ge?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("whatsapp"!==n&&"wa"!==n&&"whats"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:ne.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`whatsapp-sub-${e.name}`,e.name,`/whatsapp ${e.name} `,e.description)),commandArgumentHint:"[status|permitidos|start|stop|global|help]"};if("global"===a&&i.length<=2)return{suggestions:oe.filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`whatsapp-global-${e.name}`,e.name,`/whatsapp global ${e.name} `,e.description)),commandArgumentHint:"<status|start|stop>"};return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(u){const{suggestions:e,commandArgumentHint:t}=u;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const d="prompt"===ge?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("telegram"!==n&&"tg"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:se.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`telegram-sub-${e.name}`,e.name,`/telegram ${e.name} `,e.description)),commandArgumentHint:"[status|permitidos|global|help]"};if("global"===a&&i.length<=2)return{suggestions:oe.filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`telegram-global-${e.name}`,e.name,`/telegram global ${e.name} `,e.description)),commandArgumentHint:"<status|start|stop>"};return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(d){const{suggestions:e,commandArgumentHint:t}=d;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}const p="prompt"===ge?function(e){const t=extractCommandNameAndArgs(e);if(!t)return null;const n=t.commandName.toLowerCase();if("webapp"!==n&&"app"!==n&&"pwa"!==n&&"aplicacion-web"!==n)return null;const o=t.args??"",s=/\s$/.test(o),r=o.trim().length>0?o.trim().split(/\s+/):[],i=s?[...r,""]:r,a=(i[0]??"").toLowerCase(),l=(i[1]??"").toLowerCase();if(i.length<=1)return{suggestions:re.filter(e=>e.name.startsWith(a)).map(e=>buildSlashArgSuggestion(`webapp-sub-${e.name}`,e.name,`/webapp ${e.name} `,e.description)),commandArgumentHint:"[start|stop|status|open|token|port|autostart|help]"};if("token"===a&&i.length<=2)return{suggestions:[{name:"reset",description:"Regenerar token (invalida el anterior)"}].filter(e=>e.name.startsWith(l)).map(e=>buildSlashArgSuggestion(`webapp-token-${e.name}`,e.name,`/webapp token ${e.name} `,e.description)),commandArgumentHint:"[reset]"};return{suggestions:[],commandArgumentHint:void 0}}(e):null;if(p){const{suggestions:e,commandArgumentHint:t}=p;return ue(()=>({commandArgumentHint:t,suggestions:e,selectedSuggestion:e.length>0?0:-1})),$e(e.length>0?"command-arg":"none"),void xe(void 0)}if("bash"!==ge&&L(e)&&n>0&&!r){const t=e.slice(1).toLowerCase();if(!function(e,t){return!e&&t.includes(" ")&&!t.endsWith(" ")}(r,e)){const e=_.filter(e=>!e.isHidden).filter(e=>g(e).startsWith(t)||(e.aliases??[]).some(e=>e.startsWith(t))).map(e=>({id:g(e),displayText:`/${g(e)}`,description:e.description??"",metadata:e}));return ue(t=>({commandArgumentHint:void 0,suggestions:e,selectedSuggestion:getPreservedSelection(t.suggestions,t.selectedSuggestion,e)})),$e(e.length>0?"command":"none"),void xe(e.length>0?ye:void 0)}}if(s){const t=extractCompletionToken(e,n,!0);if(t){const e=t.token.startsWith("@"),n=e?t.token.substring(1):t.token;return void _e(n,e)}}_e.cancel(),Oe()},[ge,he,_,Oe,_e,ue,ye,Ge,we]);n(()=>{Ve.current!==le&&(Qe.current!==le&&(Qe.current=le,qe.current=null),Ve.current=null,Fe(le))},[le,Fe]);const Ke=t(async()=>{if(Ie){if("bash"===ge)return z(Ie.fullCommand),F(Ie.fullCommand.length),void je(void 0);const e=T(le,me);if(e){const t=le.slice(0,e.startPos),n=le.slice(e.startPos+e.token.length),o=t+"/"+Ie.fullCommand+" "+n,s=e.startPos+1+Ie.fullCommand.length+1;return z(o),void F(s)}}if(de.length>0){_e.cancel(),Ge.cancel();const e=-1===pe?0:pe,t=de[e];if("command"===we&&e<de.length)t&&(P(t,!1,_,z,F,G),Oe());else if("command-arg"===we&&e<de.length)t&&(applyCommandArgSuggestion(t,z,F),Oe());else if("custom-title"===we&&de.length>0){if(t){const e=buildResumeInputFromSuggestion(t);z(e),F(e.length),Oe()}}else if("directory"===we&&de.length>0){const t=de[e];if(t){let e;if(L(le)){const n=le.indexOf(" "),o=le.slice(0,n+1),s=isPathMetadata(t.metadata)&&"directory"===t.metadata.type?"/":" ";e=o+t.id+s,z(e),F(e.length),isPathMetadata(t.metadata)&&"directory"===t.metadata.type?(ue(e=>({...e,commandArgumentHint:void 0})),Fe(e,e.length)):Oe()}else{const n=extractCompletionToken(le,me,!0)??extractCompletionToken(le,me,!1);if(n){const o=isPathMetadata(t.metadata)&&"directory"===t.metadata.type,s=applyDirectorySuggestion(le,t.id,n.startPos,n.token.length,o);e=s.newInput,z(e),F(s.cursorPos),o?(ue(e=>({...e,commandArgumentHint:void 0})),Fe(e,s.cursorPos)):Oe()}else Oe()}}}else if("shell"===we&&de.length>0){const t=de[e];if(t){const e=t.metadata;applyShellSuggestion(t,le,me,z,F,e?.completionType),Oe()}}else if("agent"===we&&de.length>0&&de[e]?.id?.startsWith("dm-")){const t=de[e];t&&(applyTriggerSuggestion(t,le,me,ie,z,F),Oe())}else if("slack-channel"===we&&de.length>0){const t=de[e];t&&(applyTriggerSuggestion(t,le,me,B,z,F),Oe())}else if("file"===we&&de.length>0){const t=extractCompletionToken(le,me,!0);if(!t)return void Oe();const n=R(de),o=t.token.startsWith("@");let s;if(s=t.isQuoted?t.token.slice(2).replace(/"$/,"").length:o?t.token.length-1:t.token.length,n.length>s){const e=formatReplacementValue({displayText:n,mode:ge,hasAtPrefix:o,needsQuotes:!1,isQuoted:t.isQuoted,isComplete:!1});D(e,le,t.token,t.startPos,z,F),Fe(le.replace(t.token,e),me)}else if(e<de.length){const n=de[e];if(n){const e=n.displayText.includes(" "),s=formatReplacementValue({displayText:n.displayText,mode:ge,hasAtPrefix:o,needsQuotes:e,isQuoted:t.isQuoted,isComplete:!0});D(s,le,t.token,t.startPos,z,F),Oe()}}}}else if(""!==le.trim()){let e,t;if("bash"===ge){e="shell";const n=await async function(e,t){try{return ae&&ae.abort(),ae=new AbortController,await C(e,t,ae.signal)}catch{return l("tengu_shell_completion_failed",{}),[]}}(le,me);if(1===n.length){const e=n[0];if(e){const t=e.metadata;applyShellSuggestion(e,le,me,z,F,t?.completionType)}t=[]}else t=n}else{e="file";const n=extractCompletionToken(le,me,!0);if(n){const e=n.token.startsWith("@"),o=e?n.token.substring(1):n.token;t=await E(o,ke,ce,e)}else t=[]}t.length>0&&(ue(e=>({commandArgumentHint:void 0,suggestions:t,selectedSuggestion:getPreservedSelection(e.suggestions,e.selectedSuggestion,t)})),$e(e),xe(void 0))}},[de,pe,le,we,_,ge,z,F,G,Oe,me,Fe,ke,ue,ce,_e,Ge,Ie]),Be=t(()=>{if(pe<0||0===de.length)return;const e=de[pe];if("command"===we&&pe<de.length)e&&(P(e,!0,_,z,F,G),_e.cancel(),Oe());else if("command-arg"===we&&pe<de.length){if(e){const t=e.metadata;if((t?.replacement??e.displayText).trim()===le.trim())return _e.cancel(),Oe(),void G(le,!0);applyCommandArgSuggestion(e,z,F),_e.cancel(),Oe()}}else if("custom-title"===we&&pe<de.length){if(e){const t=buildResumeInputFromSuggestion(e);z(t),F(t.length),G(t,!0),_e.cancel(),Oe()}}else if("shell"===we&&pe<de.length){const e=de[pe];if(e){const t=e.metadata;applyShellSuggestion(e,le,me,z,F,t?.completionType),_e.cancel(),Oe()}}else if("agent"===we&&pe<de.length&&e?.id?.startsWith("dm-"))applyTriggerSuggestion(e,le,me,ie,z,F),_e.cancel(),Oe();else if("slack-channel"===we&&pe<de.length)e&&(applyTriggerSuggestion(e,le,me,B,z,F),Ge.cancel(),Oe());else if("file"===we&&pe<de.length){const t=extractCompletionToken(le,me,!0);if(t&&e){const n=t.token.startsWith("@"),o=e.displayText.includes(" "),s=formatReplacementValue({displayText:e.displayText,mode:ge,hasAtPrefix:n,needsQuotes:o,isQuoted:t.isQuoted,isComplete:!0});D(s,le,t.token,t.startPos,z,F),_e.cancel(),Oe()}}else if("directory"===we&&pe<de.length&&e){if(L(le))return _e.cancel(),void Oe();const t=extractCompletionToken(le,me,!0)??extractCompletionToken(le,me,!1);if(t){const n=isPathMetadata(e.metadata)&&"directory"===e.metadata.type,o=applyDirectorySuggestion(le,e.id,t.startPos,t.token.length,n);z(o.newInput),F(o.cursorPos)}_e.cancel(),Oe()}},[de,pe,we,_,le,me,ge,z,F,G,Oe,_e,Ge]),Ue=t(()=>{Ke()},[Ke]),Ze=t(()=>{_e.cancel(),Ge.cancel(),Oe(),Ve.current=le},[_e,Ge,Oe,le]),Je=t(()=>{ue(e=>({...e,selectedSuggestion:e.selectedSuggestion<=0?de.length-1:e.selectedSuggestion-1}))},[de.length,ue]),Xe=t(()=>{ue(e=>({...e,selectedSuggestion:e.selectedSuggestion>=de.length-1?0:e.selectedSuggestion+1}))},[de.length,ue]),Ye=o(()=>({"autocomplete:accept":Ue,"autocomplete:dismiss":Ze,"autocomplete:previous":Je,"autocomplete:next":Xe}),[Ue,Ze,Je,Xe]),et=de.length>0||!!Ie,tt=d();function acceptSuggestionText(e){const t=c(e);if("prompt"!==t&&Ae){Ae(t);const n=u(e);z(n),F(n.length)}else z(e),F(e.length)}p("autocomplete",et),A("Autocomplete",et),b(Ye,{context:"Autocomplete",isActive:et&&!tt});const handleKeyDown=t=>{if("right"===t.key&&!Te){const e=Pe.text,n=Pe.shownAt;if(e&&n>0&&""===le)return ve(),acceptSuggestionText(e),void t.stopImmediatePropagation()}if("tab"===t.key&&!t.shift){if(de.length>0||Ie)return;const n=Pe.text,o=Pe.shownAt;return n&&o>0&&""===le&&!Te?(t.preventDefault(),ve(),void acceptSuggestionText(n)):void(""===le.trim()&&(t.preventDefault(),be({key:"thinking-toggle-hint",jsx:e(a,{dimColor:!0,children:["Usa ",Se," para alternar el modo de razonamiento"]}),priority:"immediate",timeoutMs:3e3})))}if(0===de.length)return;const n=null!=We?.pendingChord;return t.ctrl&&"n"===t.key&&!n?(t.preventDefault(),void Xe()):t.ctrl&&"p"===t.key&&!n?(t.preventDefault(),void Je()):void("return"!==t.key||t.shift||t.meta||(t.preventDefault(),Be()))};return h((e,t,n)=>{const o=new f(n.keypress);handleKeyDown(o),o.didStopImmediatePropagation()&&n.stopImmediatePropagation()}),{suggestions:de,selectedSuggestion:pe,suggestionType:we,maxColumnWidth:Ce,commandArgumentHint:fe,inlineGhostText:Ie,handleKeyDown}}
@@ -1 +1 @@
1
- import{APIUserAbortError as e}from"@anthropic-ai/sdk/error.js";import{randomUUID as t}from"node:crypto";import{checkAndRefreshOpenAIOAuthTokenIfNeeded as o,getGeminiGoogleAuthHeaders as n,getOpenAICompatibleAccessToken as r,getOpenAIAccessToken as s,handleOpenAIOAuth401Error as i}from"../../utils/auth.js";import{getAPIProvider as a}from"../../utils/model/providers.js";import{getConfiguredProviderBaseUrl as u}from"../../utils/model/providerBaseUrls.js";import{errorMessage as l}from"../../utils/errors.js";import{logForDebugging as p}from"../../utils/debug.js";import{logError as c}from"../../utils/log.js";import{createAssistantAPIErrorMessage as m,createAssistantMessage as d,createUserMessage as f}from"../../utils/messages.js";import{toolToAPISchema as g}from"../../utils/api.js";import{jsonStringify as y}from"../../utils/slowOperations.js";function getOpenAIMaxTimeoutRetries(){const e=process.env.CONTEXT_CODE_MAX_RETRIES;if(!e)return 10;const t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?10:t}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function isPlainObject(e){if(!isRecord(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function isJwtToken(e){return 3===e.split(".").length}function getOpenAICompatibleProvider(){const e=a();return"openrouter"===e||"ollama"===e||"ollama-cloud"===e||"gemini-api"===e||"gemini-google"===e||"zai"===e||"nvidia"===e?e:"openai"}function getOpenAICompatibleProviderLabel(e=getOpenAICompatibleProvider()){switch(e){case"openrouter":return"OpenRouter";case"ollama":return"Ollama";case"ollama-cloud":return"Ollama Cloud";case"gemini-api":return"Gemini API";case"gemini-google":return"Gemini Google";case"zai":return"Z.AI";case"nvidia":return"NVIDIA NIM";default:return"OpenAI"}}function getOpenAIBaseUrl(e=getOpenAICompatibleProvider()){if("openrouter"===e){const e=process.env.OPENROUTER_BASE_URL||u("openrouter")||"https://openrouter.ai/api/v1";return e.endsWith("/v1")?e:e.endsWith("/")?`${e}v1`:`${e}/v1`}if("ollama"===e){const e=process.env.OLLAMA_BASE_URL||u("ollama")||"http://localhost:11434/v1";return e.endsWith("/v1")?e:e.endsWith("/")?`${e}v1`:`${e}/v1`}if("ollama-cloud"===e){const e=process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||u("ollama-cloud")||"http://localhost:11434/v1";return e.endsWith("/v1")?e:e.endsWith("/")?`${e}v1`:`${e}/v1`}if("zai"===e){const e=process.env.ZAI_BASE_URL||u("zai")||"https://api.z.ai/api/coding/paas/v4";return e.endsWith("/")?e.slice(0,-1):e}if("gemini-api"===e||"gemini-google"===e){const t=("gemini-api"===e?process.env.GEMINI_BASE_URL||process.env.GEMINI_API_BASE_URL:process.env.GEMINI_GOOGLE_BASE_URL||process.env.GEMINI_BASE_URL)||u(e)||"https://generativelanguage.googleapis.com/v1beta/openai";return t.endsWith("/")?t.slice(0,-1):t}if("nvidia"===e){const e=process.env.NVIDIA_BASE_URL||u("nvidia")||"https://integrate.api.nvidia.com/v1";return e.endsWith("/")?e.slice(0,-1):e}const t=process.env.OPENAI_API_BASE_URL||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1";return t.endsWith("/v1")?t:t.endsWith("/")?`${t}v1`:`${t}/v1`}async function getOpenAIRequestHeaders(e=getOpenAICompatibleProvider()){return"gemini-google"===e?n():function(e=getOpenAICompatibleProvider()){const t=r(e);if(isLocalOllamaProviderHost(e,getOpenAIBaseUrl(e)))return{"Content-Type":"application/json"};if(!t)throw new Error(`${getOpenAICompatibleProviderLabel(e)} is selected but no credentials were found.`);return{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}(e)}function isLocalOllamaProviderHost(e,t=getOpenAIBaseUrl(e)){return("ollama"===e||"ollama-cloud"===e)&&(t.includes("localhost")||t.includes("127.0.0.1"))}function getOpenAIAccessTokenOrThrow(e=getOpenAICompatibleProvider()){if(isLocalOllamaProviderHost(e))return"ollama";if("gemini-google"===e)return r(e)||"google-application-default-credentials";const t=r(e);if(!t)throw new Error(`${getOpenAICompatibleProviderLabel(e)} is selected but no credentials were found.`);return t}async function maybeRefreshOpenAICompatibleAuth(e=getOpenAICompatibleProvider()){"openai"===e&&await o()}async function maybeRecoverOpenAICompatible401(e,t=getOpenAICompatibleProvider()){if("openai"!==t)return null;if(!await i(e))return null;const o=s();return o&&o!==e?o:null}function toInputText(e){return{type:"input_text",text:e}}function toOutputText(e){return{type:"output_text",text:e}}function normalizeBlocksForRole(e,t){return"assistant"!==t?e:e.map(e=>"input_text"===e.type?toOutputText(e.text):e)}function stringifyBlockContent(e){return"string"==typeof e?e:Array.isArray(e)?e.map(e=>"string"==typeof e?e:e&&"object"==typeof e&&"type"in e&&"text"===e.type&&"text"in e&&"string"==typeof e.text?e.text:y(e)).join("\n"):null==e?"":y(e)}function normalizeResponseContent(e){return Array.isArray(e)?e:null==e?[]:[e]}function blockToOpenAIContentBlocks(e){if(!isRecord(e))return null;if("text"===e.type&&"string"==typeof e.text)return[toInputText(e.text)];if("image"===e.type){const t=isRecord(e.source)?e.source:null,o=t?function(e){if("base64"===e.type){const t=e.media_type,o=e.data;return"string"!=typeof t||"string"!=typeof o?null:{type:"input_image",image_url:`data:${t};base64,${o}`}}return"url"===e.type&&"string"==typeof e.url?{type:"input_image",image_url:e.url}:"file"===e.type&&"string"==typeof e.file_id?{type:"input_image",file_id:e.file_id}:null}(t):null;return o?[o]:null}if("document"===e.type){const t=isRecord(e.source)?e.source:null;if(!t)return null;const o=function(e,t){return"file"===e.type&&"string"==typeof e.file_id?{type:"input_file",file_id:e.file_id}:"base64"===e.type&&"string"==typeof e.data?"string"!=typeof e.media_type?null:{type:"input_file",file_data:e.data,..."string"==typeof t&&t?{filename:t}:{}}:"url"===e.type&&"string"==typeof e.url?{type:"input_file",file_url:e.url,..."string"==typeof t&&t?{filename:t}:{}}:"text"===e.type&&"string"==typeof e.data?toInputText(e.data):null}(t,"string"==typeof e.title?e.title:void 0);if(o)return[o];if("content"===t.type&&"string"==typeof t.content)return[toInputText(t.content)];if("content"===t.type&&Array.isArray(t.content)){const e=[];for(const o of t.content){const t=blockToOpenAIContentBlocks(o);t&&e.push(...t)}return e.length>0?e:null}return null}if("search_result"===e.type&&Array.isArray(e.content)){const t=[];"string"==typeof e.title&&e.title.trim()&&t.push(e.title.trim()),"string"==typeof e.source&&e.source.trim()&&t.push(e.source.trim());for(const o of e.content)if(o&&"object"==typeof o&&"text"in o){const e=o.text;"string"==typeof e&&e.trim()&&t.push(e.trim())}return[toInputText(t.join("\n\n"))]}if("container_upload"===e.type&&"string"==typeof e.file_id)return[{type:"input_file",file_id:e.file_id}];if(("bash_code_execution_output"===e.type||"mcp_tool_result"===e.type||"code_execution_tool_result"===e.type||"web_search_tool_result"===e.type||"web_fetch_tool_result"===e.type||"text_editor_code_execution_tool_result"===e.type||"tool_search_tool_result"===e.type)&&"content"in e){const t=e.content;if("string"==typeof t)return[toInputText(t)];if(Array.isArray(t)){const e=[];for(const o of t){const t=blockToOpenAIContentBlocks(o);t&&e.push(...t)}return e.length>0?e:null}}if("content"in e&&("string"==typeof e.content||Array.isArray(e.content))){const t=e.content;if("string"==typeof t)return[toInputText(t)];const o=[];for(const e of t){const t=blockToOpenAIContentBlocks(e);t&&o.push(...t)}return o.length>0?o:null}return"data"in e&&"string"==typeof e.data?[toInputText(e.data)]:null}function toolResultContentToOpenAIOutput(e){if("string"==typeof e)return e;if(!Array.isArray(e))return stringifyBlockContent(e);const t=[];for(const o of e){const e=blockToOpenAIContentBlocks(o);if(e&&e.length>0){t.push(...e);continue}const n=stringifyBlockContent(o).trim();n&&t.push(toInputText(n))}return 0===t.length?"":t.every(e=>"input_text"===e.type)?t.map(e=>e.text).join("\n\n"):t}function messageToOpenAIInput(e){if(!e.message||"user"!==e.type&&"assistant"!==e.type)return[];const t=Array.isArray(e.message.content)?e.message.content:[{type:"text",text:String(e.message.content??"")}],o="assistant"===e.type?"assistant":"user",n=[],r=[],flushMessage=()=>{0!==r.length&&(n.push({type:"message",role:o,content:[...r]}),r.length=0)};for(const s of t){if("assistant"===e.type&&"tool_use"===s.type&&"string"==typeof s.id&&"string"==typeof s.name){flushMessage(),n.push({type:"function_call",call_id:s.id,name:s.name,arguments:y(s.input??{})});continue}if("user"===e.type&&"tool_result"===s.type&&"string"==typeof s.tool_use_id){flushMessage(),n.push({type:"function_call_output",call_id:s.tool_use_id,output:toolResultContentToOpenAIOutput(s.content)});continue}if("thinking"===s.type||"redacted_thinking"===s.type)continue;const t=blockToOpenAIContentBlocks(s);t&&t.length>0?r.push(...normalizeBlocksForRole(t,o)):r.push(..."assistant"===o?[toOutputText(stringifyBlockContent(s))]:[toInputText(stringifyBlockContent(s))])}return flushMessage(),n}async function readOpenAIResponseBody(e){const t=await e.text();if(!t.trim())return{};const o=t.trim();if(o.startsWith("data:")||o.startsWith("event:"))return function(e){const t=[];for(const o of e.split(/\r?\n\r?\n/)){const e=o.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===e.length)continue;const n=e.filter(e=>e.startsWith("data:")).map(e=>e.slice(5).trim());if(0===n.length)continue;const r=n.join("\n").trim();if(r&&"[DONE]"!==r)try{const e=JSON.parse(r);isRecord(e)&&t.push(e)}catch{}}let o=null,n=null;const r=[];let s="";for(const i of t){const t="string"==typeof i.type?i.type:"";"response.completed"===t&&isRecord(i.response)?o={...i.response,raw_error_text:e}:"error"!==t?"response.output_item.done"===t&&isRecord(i.item)?r.push(i.item):"response.output_text.delta"!==t||"string"!=typeof i.delta?"response.output_text.done"===t&&"string"==typeof i.text&&(s=i.text):s+=i.delta:"string"==typeof i.message&&i.message.trim()?n=i.message:isRecord(i.error)&&"string"==typeof i.error.message&&(n=i.error.message)}if(o)return(!o.output||0===o.output.length)&&r.length>0&&(o.output=r),!o.output_text&&s&&(o.output_text=s),!o.error&&n&&(o.error={message:n}),o;if(r.length>0||s||n)return{output:r.length>0?r:void 0,output_text:s||void 0,error:n?{message:n}:void 0,raw_error_text:e};return{error:{message:e},raw_error_text:e}}(t);try{const e=JSON.parse(t);return isRecord(e)&&"string"==typeof e.error?{...e,error:{message:e.error},raw_error_text:t}:isRecord(e)?{...e,raw_error_text:t}:{error:{message:t},raw_error_text:t}}catch{return{error:{message:t},raw_error_text:t}}}function buildOpenAIErrorMessage(e){const t=e.data.error?.message?.trim()||e.data.raw_error_text?.trim()||`OpenAI request failed (${e.status} ${e.statusText})`,o=/requires a subscription|upgrade for access/i.test(t)?`El modelo ${e.model??"seleccionado"} requiere una suscripcion de Ollama Cloud. Cambia a otro modelo en /model o actualiza tu plan de Ollama.`:t,n=e.data.raw_error_text?.trim(),r=n&&n!==t&&n!==o?n.replace(/\s+/g," ").slice(0,400):null;return r?`${o} [model=${e.model??"unknown"} endpoint=${e.url}] ${r}`:`${o} [model=${e.model??"unknown"} endpoint=${e.url}]`}function blockToChatContentPart(e){if("text"===e.type&&"string"==typeof e.text)return{type:"text",text:e.text};if("image"===e.type){const t=isRecord(e.source)?e.source:null;if(!t)return null;if("base64"===t.type&&"string"==typeof t.data&&"string"==typeof t.media_type)return{type:"image_url",image_url:{url:`data:${t.media_type};base64,${t.data}`}};if("url"===t.type&&"string"==typeof t.url)return{type:"image_url",image_url:{url:t.url}}}const t=stringifyBlockContent(e);return t?{type:"text",text:t}:null}function toolResultToString(e){return"string"==typeof e?e:Array.isArray(e)?e.map(e=>"string"==typeof e?e:isRecord(e)&&"string"==typeof e.text?e.text:stringifyBlockContent(e)).filter(Boolean).join("\n"):stringifyBlockContent(e)}function messageToChatMessages(e){if(!e.message||"user"!==e.type&&"assistant"!==e.type)return[];const t=e.message.content,o=Array.isArray(t)?t:[{type:"text",text:String(t??"")}];if("assistant"===e.type){const e=[],t=[];for(const n of o)"thinking"!==n.type&&"redacted_thinking"!==n.type&&("tool_use"===n.type&&"string"==typeof n.id&&"string"==typeof n.name?e.push({id:n.id,type:"function",function:{name:n.name,arguments:y(n.input??{})}}):"text"===n.type&&"string"==typeof n.text&&n.text.trim()&&t.push(n.text));const n={role:"assistant",content:t.join("\n")};return e.length>0&&(n.tool_calls=e),[n]}const n=[],r=[];for(const e of o)if("tool_result"===e.type&&"string"==typeof e.tool_use_id)n.push({role:"tool",tool_call_id:e.tool_use_id,content:toolResultToString(e.content)});else{const t=blockToChatContentPart(e);t&&r.push(t)}const s=[...n];if(r.length>0){const e=r.every(e=>"text"===e.type);s.push({role:"user",content:e?r.map(e=>e.text).join("\n"):r})}return s}function parseChatCompletionResponse(e){const t=[];for(const o of e.choices??[]){const e=o.message;if(e){"string"==typeof e.content&&e.content.trim()&&t.push({type:"text",text:e.content});for(const o of e.tool_calls??[])t.push({type:"tool_use",id:o.id,name:o.function?.name??"tool",input:parseFunctionCallArguments(o.function?.arguments)})}}return{content:t}}function getChatUsage(e){if("number"==typeof e.usage?.prompt_tokens||"number"==typeof e.usage?.completion_tokens)return{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}function buildChatToolChoice(e){if(!e.toolChoice)return"auto";switch(e.toolChoice.type){case"auto":default:return"auto";case"any":return"required";case"none":return"none";case"tool":return"string"==typeof e.toolChoice.name?{type:"function",function:{name:e.toolChoice.name}}:"auto"}}function chatContentToGeminiParts(e){return"string"==typeof e?e?[{text:e}]:[]:Array.isArray(e)?e.map(e=>"text"===e.type?e.text?{text:e.text}:null:"image_url"===e.type?{text:`[Image input: ${e.image_url.url}]`}:null).filter(e=>null!==e):[]}function buildGeminiContents(e){const t=new Map,o=[];for(const n of e){if("system"===n.role)continue;if("assistant"===n.role){const e=chatContentToGeminiParts(n.content);for(const o of n.tool_calls??[]){t.set(o.id,o.function.name);const n=parseFunctionCallArguments(o.function.arguments);e.push({functionCall:{name:o.function.name,args:isPlainObject(n)?n:{raw:n}}})}e.length>0&&o.push({role:"model",parts:e});continue}if("tool"===n.role){const e=n.tool_call_id?t.get(n.tool_call_id)??"tool":"tool";o.push({role:"function",parts:[{functionResponse:{name:e,response:{result:n.content??""}}}]});continue}const e=chatContentToGeminiParts(n.content);e.length>0&&o.push({role:"user",parts:e})}return o.length>0?o:[{role:"user",parts:[{text:""}]}]}function getGeminiEnumType(e){switch(typeof e){case"string":return"string";case"number":return Number.isInteger(e)?"integer":"number";case"boolean":return"boolean";default:return}}function sanitizeGeminiSchema(e){if(!isRecord(e))return{type:"object",properties:{}};const t=Array.isArray(e.anyOf)?e.anyOf:Array.isArray(e.any_of)?e.any_of:null,o=Array.isArray(e.oneOf)?e.oneOf:Array.isArray(e.one_of)?e.one_of:null;if(t||o){const e=function(e){const t=[];let o,n=!1;for(const r of e){if(!isRecord(r))return null;if("null"===r.type){n=!0;continue}const e=void 0!==r.const?[r.const]:Array.isArray(r.enum)?r.enum:null;if(!e)return null;for(const n of e){const e=getGeminiEnumType(n);if(!e)return null;if(o&&o!==e)return null;o=e,t.push(n)}}return o&&0!==t.length?{type:o,enum:Array.from(new Set(t)),...n?{nullable:!0}:{}}:null}(t??o??[]);return e||{anyOf:(t??o??[]).map(sanitizeGeminiSchema)}}const n={},r=e.type;if(Array.isArray(r)){const e=r.find(e=>"null"!==e);"string"==typeof e&&(n.type=e),r.includes("null")&&(n.nullable=!0)}else"string"==typeof r&&(n.type=r);for(const t of["title","description","format","nullable","minimum","maximum","minItems","maxItems","minLength","maxLength","pattern"])void 0!==e[t]&&(n[t]=e[t]);if(Array.isArray(e.enum)?n.enum=e.enum:void 0!==e.const&&(n.enum=[e.const]),!n.type&&Array.isArray(n.enum)&&n.enum.length>0&&(n.type=getGeminiEnumType(n.enum[0])),void 0!==e.exclusiveMinimum&&void 0===n.minimum&&(n.minimum="number"==typeof e.exclusiveMinimum?e.exclusiveMinimum:e.minimum),void 0!==e.exclusiveMaximum&&void 0===n.maximum&&(n.maximum="number"==typeof e.exclusiveMaximum?e.exclusiveMaximum:e.maximum),isRecord(e.items)?n.items=sanitizeGeminiSchema(e.items):Array.isArray(e.items)&&e.items.length>0&&(n.items=sanitizeGeminiSchema(e.items[0])),isRecord(e.properties)){const t={};for(const[o,n]of Object.entries(e.properties))t[o]=sanitizeGeminiSchema(n);n.properties=t}return Array.isArray(e.required)&&(n.required=e.required.filter(e=>"string"==typeof e)),n.type||(n.type=n.properties?"object":n.items?"array":"object"),"object"!==n.type||n.properties||(n.properties={}),n}async function postGeminiCodeAssist(e,t,o,n){const r=await fetch(`https://cloudcode-pa.googleapis.com/v1internal:${e}`,{method:"POST",headers:t,body:y(o),signal:n});return{response:r,data:await readOpenAIResponseBody(r)}}function getGeminiCodeAssistMetadata(e){return{ideType:"IDE_UNSPECIFIED",platform:"PLATFORM_UNSPECIFIED",pluginType:"GEMINI",...e?{duetProject:e}:{}}}async function resolveGeminiCodeAssistProject(e,t){const o=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim()||void 0,n={...o?{cloudaicompanionProject:o}:{},metadata:getGeminiCodeAssistMetadata(o)},{response:r,data:s}=await postGeminiCodeAssist("loadCodeAssist",e,n,t);if(!r.ok)return o;if("string"==typeof s.cloudaicompanionProject)return s.cloudaicompanionProject;if(o)return o;const i=Array.isArray(s.allowedTiers)?s.allowedTiers.filter(isRecord):[],a=i.find(e=>!0===e.isDefault)??i[0],u="string"==typeof a?.id?a.id:void 0;if(!u)return;const{response:l,data:p}=await postGeminiCodeAssist("onboardUser",e,{tierId:u,metadata:getGeminiCodeAssistMetadata()},t);if(!l.ok)return;const c=isRecord(p.response)?p.response:p,m=isRecord(c.cloudaicompanionProject)?c.cloudaicompanionProject:null;return"string"==typeof m?.id?m.id:void 0}async function createGeminiGoogleChatCompletionResponse(e){const{model:o,chatMessages:r,chatTools:s,toolChoice:i,signal:a,maxOutputTokens:u,temperature:l}=e,c=await n(),m=await resolveGeminiCodeAssistProject(c,a),d={};u&&(d.maxOutputTokens=u),void 0!==l&&(d.temperature=l);const f={contents:buildGeminiContents(r),session_id:t()},g=r.filter(e=>"system"===e.role&&"string"==typeof e.content).map(e=>e.content).join("\n\n");g&&(f.systemInstruction={role:"user",parts:[{text:g}]});const h=function(e){if(0!==e.length)return[{functionDeclarations:e.map(e=>({name:e.function.name,description:e.function.description,parameters:sanitizeGeminiSchema(e.function.parameters??{type:"object",properties:{}})}))}]}(s);h&&(f.tools=h);const _=function(e){if("auto"!==e)return"none"===e?{functionCallingConfig:{mode:"NONE"}}:"required"===e?{functionCallingConfig:{mode:"ANY"}}:{functionCallingConfig:{mode:"ANY",allowedFunctionNames:[e.function.name]}}}(i);_&&(f.toolConfig=_),Object.keys(d).length>0&&(f.generationConfig=d);const A={model:o,...m?{project:m}:{},user_prompt_id:t(),request:f},O="https://cloudcode-pa.googleapis.com/v1internal:generateContent";p(`[Gemini Google] codeassist generateContent request model=${o} messages=${r.length} tools=${s.length} endpoint=${O}`);const{response:b,data:x}=await postGeminiCodeAssist("generateContent",c,A,a);if(!b.ok)throw p(`[Gemini Google] codeassist generateContent error status=${b.status} model=${o} endpoint=${O} body=${(x.error?.message??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:b.status,statusText:b.statusText,url:O,model:o,data:x}));return function(e){const o=e.response?.candidates??[];return{id:e.traceId,choices:o.map(e=>{const o=[],n=[];for(const r of e.content?.parts??[])"text"in r&&"string"==typeof r.text&&o.push(r.text),"functionCall"in r&&r.functionCall?.name&&n.push({id:`call_${t().replace(/-/g,"")}`,type:"function",function:{name:r.functionCall.name,arguments:y(r.functionCall.args??{})}});return{message:{content:o.join("")||null,tool_calls:n.length>0?n:void 0},finish_reason:e.finishReason}}),usage:{prompt_tokens:e.response?.usageMetadata?.promptTokenCount,completion_tokens:e.response?.usageMetadata?.candidatesTokenCount}}}(x)}async function buildOpenAITools(e,t){return(await Promise.all(e.map(o=>g(o,{getToolPermissionContext:t.getToolPermissionContext,tools:e,agents:t.agents,allowedAgentTypes:t.allowedAgentTypes,model:t.model})))).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema,...e.strict?{strict:!0}:{}}))}function buildToolChoice(e){if(!e.toolChoice)return"auto";switch(e.toolChoice.type){case"auto":default:return"auto";case"any":return"required";case"none":return"none";case"tool":return"string"==typeof e.toolChoice.name?{type:"function",name:e.toolChoice.name}:"auto"}}function shouldDisableParallelToolCalls(e){const t=e.toolChoice;return Boolean(t&&"disable_parallel_tool_use"in t&&!0===t.disable_parallel_tool_use)}function parseFunctionCallArguments(e){if(isPlainObject(e))return e;if("string"!=typeof e)return null==e?{}:{raw:e};try{const t=JSON.parse(e);return isPlainObject(t)?t:{raw:t}}catch{return{raw:e}}}function parseOutputItems(e){const t=[];for(const o of e.output??[])if(o&&"object"==typeof o){if("function_call"===o.type){const e=parseFunctionCallArguments(o.arguments);t.push({type:"tool_use",id:String(o.call_id??o.id??""),name:String(o.name??"tool"),input:e});continue}if("message"===o.type)for(const e of normalizeResponseContent(o.content)){if("string"==typeof e){t.push({type:"text",text:e});continue}if(!e||"object"!=typeof e||!("type"in e))continue;const o=String(e.type??""),n="string"==typeof e.text?e.text??"":"string"==typeof e.refusal?e.refusal??"":"";"output_text"!==o&&"text"!==o&&"refusal"!==o||!n||t.push({type:"text",text:n})}}return 0===t.length&&"string"==typeof e.output_text&&t.push({type:"text",text:e.output_text}),{content:t}}function getUsage(e){if("number"==typeof e.usage?.input_tokens||"number"==typeof e.usage?.output_tokens)return{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}function sideQueryMessageToOpenAIInput(e){const t=Array.isArray(e.content)?e.content.filter(e=>"text"===e?.type&&"string"==typeof e.text).map(e=>toInputText(e.text)):[toInputText(String(e.content??""))];return[{type:"message",role:e.role,content:t.length>0?t:[toInputText("")]}]}function sideQueryToolToOpenAITool(e){return{type:"function",name:e.name,description:e.description,parameters:e.input_schema??{type:"object",properties:{}}}}function buildSideQueryToolChoice(e){return e&&"auto"!==e?"none"===e||"none"===e.type?"none":"any"===e.type?"required":"auto"===e.type?"auto":"string"==typeof e.name&&e.name?{type:"function",name:e.name}:"auto":"auto"}function sideQueryMessageToChatMessage(e){const t=Array.isArray(e.content)?e.content.filter(e=>"text"===e?.type&&"string"==typeof e.text).map(e=>e.text).join("\n"):String(e.content??"");return{role:e.role,content:t}}function sideQueryToolToChatTool(e){return{type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema??{type:"object",properties:{}}}}}export async function queryOpenAISideQuery({model:e,systemPrompt:t,messages:o,tools:n,toolChoice:s,outputFormat:i,signal:a,maxOutputTokens:u,temperature:l}){const c=getOpenAICompatibleProvider();await maybeRefreshOpenAICompatibleAuth(c);const m=getOpenAIBaseUrl(c),d=r(c);if(!("openai"===c&&d&&isJwtToken(d))){const r=[...t?[{role:"system",content:t}]:[],...o.map(sideQueryMessageToChatMessage)],d={model:e,messages:r,stream:!1},f=n?.map(sideQueryToolToChatTool)??[],g=function(e){const t=buildSideQueryToolChoice(e);return"auto"===t||"none"===t?t:"required"===t?"required":{type:"function",function:{name:t.name}}}(s);if(f.length>0&&(d.tools=f,d.tool_choice=g),"json_schema"===i?.type&&(d.response_format={type:"json_schema",json_schema:{name:"side_query_output",strict:!0,schema:i.schema}}),u&&(d.max_tokens=u),void 0!==l&&(d.temperature=l),"gemini-google"===c){const t=await createGeminiGoogleChatCompletionResponse({model:e,chatMessages:r,chatTools:f,toolChoice:g,signal:a,maxOutputTokens:u,temperature:l});return{id:t.id,content:parseChatCompletionResponse(t).content,usage:getChatUsage(t)}}const h=`${m}/chat/completions`,_=await fetch(h,{method:"POST",headers:await getOpenAIRequestHeaders(c),body:y(d),signal:a}),A=await readOpenAIResponseBody(_);if(!_.ok)throw p(`[${getOpenAICompatibleProviderLabel(c)}] sideQuery chat.completions error status=${_.status} model=${e} endpoint=${h} body=${(A.error?.message??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:_.status,statusText:_.statusText,url:h,model:e,data:A}));return{id:A.id,content:parseChatCompletionResponse(A).content,usage:getChatUsage(A)}}const f={model:e,input:o.flatMap(sideQueryMessageToOpenAIInput),instructions:t,stream:!1,store:!1};n&&n.length>0&&(f.tools=n.map(sideQueryToolToOpenAITool),f.tool_choice=buildSideQueryToolChoice(s)),"json_schema"===i?.type&&(f.text={format:{type:"json_schema",name:"side_query_output",strict:!0,schema:i.schema}}),u&&(f.max_output_tokens=u),void 0!==l&&(f.temperature=l);const g=`${m}/responses`,h=await fetch(g,{method:"POST",headers:await getOpenAIRequestHeaders(c),body:y(f),signal:a}),_=await readOpenAIResponseBody(h);if(!h.ok)throw p(`[${getOpenAICompatibleProviderLabel(c)}] sideQuery error status=${h.status} model=${e} endpoint=${m}/responses body=${(_.raw_error_text??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:h.status,statusText:h.statusText,url:`${m}/responses`,model:e,data:_}));return{id:_.id,content:parseOutputItems(_).content,usage:getUsage(_)}}async function createOpenAIResponse(e){const{messages:t,systemPrompt:o,tools:n,signal:s,options:i}=e,a=getOpenAICompatibleProvider();await maybeRefreshOpenAICompatibleAuth(a);const u=getOpenAIAccessTokenOrThrow(a),l="openai"===a&&isJwtToken(u);if(!l){const t=await async function({messages:e,systemPrompt:t,tools:o,signal:n,options:s}){const i=getOpenAICompatibleProvider();await maybeRefreshOpenAICompatibleAuth(i);const a=t.join("\n\n"),u=[...a?[{role:"system",content:a}]:[],...e.flatMap(messageToChatMessages)],l=(m=await buildOpenAITools(o,s),m.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.parameters,...e.strict?{strict:!0}:{}}}))),c={model:s.model,messages:u,stream:!1};var m;if(l.length>0&&(c.tools=l,c.tool_choice=buildChatToolChoice(s)),shouldDisableParallelToolCalls(s)&&(c.parallel_tool_calls=!1),s.maxOutputTokensOverride&&(c.max_tokens=s.maxOutputTokensOverride),void 0!==s.temperatureOverride&&(c.temperature=s.temperatureOverride),s.effortValue&&(c.reasoning_effort=s.effortValue),"gemini-google"===i)return createGeminiGoogleChatCompletionResponse({model:String(s.model),chatMessages:u,chatTools:l,toolChoice:buildChatToolChoice(s),signal:n,maxOutputTokens:s.maxOutputTokensOverride,temperature:s.temperatureOverride});const d=getOpenAIMaxTimeoutRetries(),sendRequest=async(e=r(i)??"",t=0)=>{const o=`${getOpenAIBaseUrl(i)}/chat/completions`;p(`[${getOpenAICompatibleProviderLabel(i)}] chat.completions request model=${s.model} messages=${u.length} tools=${l.length} endpoint=${o}${t>0?` (retry ${t})`:""}`);const a=12e4,m=new AbortController,f=setTimeout(()=>m.abort(),a),onAbort=()=>m.abort();n?.addEventListener("abort",onAbort);try{const n=await fetch(o,{method:"POST",headers:await getOpenAIRequestHeaders(i),body:y(c),signal:m.signal}),r=await readOpenAIResponseBody(n);if(504===n.status&&t<1)return p(`[${getOpenAICompatibleProviderLabel(i)}] 504 Gateway Timeout, reintentando...`,{level:"warn"}),sendRequest(e,t+1);if(401===n.status){const o=await maybeRecoverOpenAICompatible401(e,i);if(o)return sendRequest(o,t)}if(!n.ok)throw p(`[${getOpenAICompatibleProviderLabel(i)}] chat.completions error status=${n.status} model=${s.model} endpoint=${o} body=${(r.error?.message??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:n.status,statusText:n.statusText,url:o,model:String(s.model),data:r}));return r}catch(o){if(o instanceof Error&&"AbortError"===o.name&&!n?.aborted){if(t<d){const o=1e3*Math.pow(2,t);return p(`[${getOpenAICompatibleProviderLabel(i)}] timeout local tras 120000ms, reintentando en ${o}ms (intento ${t+1}/${d})`,{level:"warn"}),await new Promise(e=>setTimeout(e,o)),sendRequest(e,t+1)}throw new Error("La solicitud expiró tras 120s. El servidor tardó demasiado en responder.")}throw o}finally{clearTimeout(f),n?.removeEventListener("abort",onAbort)}};return getOpenAIAccessTokenOrThrow(i),sendRequest()}(e);return{id:t.id,output:t.choices?.flatMap(e=>{const t=[];if(e.message?.content&&t.push({type:"message",role:"assistant",content:[e.message.content]}),e.message?.tool_calls)for(const o of e.message.tool_calls)t.push({type:"function_call",call_id:o.id,name:o.function.name,arguments:o.function.arguments});return t})??[],usage:{input_tokens:t.usage?.prompt_tokens,output_tokens:t.usage?.completion_tokens}}}const c=t.flatMap(messageToOpenAIInput),m=await buildOpenAITools(n,i),d={model:i.model,input:c,instructions:o.join("\n\n"),tools:m,tool_choice:buildToolChoice(i),stream:!1,store:!1};shouldDisableParallelToolCalls(i)&&(d.parallel_tool_calls=!1),i.maxOutputTokensOverride&&(d.max_output_tokens=i.maxOutputTokensOverride),void 0!==i.temperatureOverride&&(d.temperature=i.temperatureOverride),i.effortValue&&(d.reasoning={effort:i.effortValue});const f=getOpenAIMaxTimeoutRetries(),sendRequest=async(e,t=0)=>{const o=l?{...d,stream:!0}:d;let n,r;if(l){const t=function(e){try{const t=JSON.parse(atob(e.split(".")[1])),o=t?.["https://api.openai.com/auth"]?.chatgpt_account_id;if(!o)throw new Error("No account ID in token");return o}catch{throw new Error("Failed to extract chatgpt-account-id from OAuth token")}}(e);n=function(){const e=(process.env.OPENAI_OAUTH_BASE_URL||"https://chatgpt.com/backend-api").replace(/\/+$/,"");return e.endsWith("/codex/responses")?e:e.endsWith("/codex")?`${e}/responses`:`${e}/codex/responses`}(),r={Authorization:`Bearer ${e}`,"chatgpt-account-id":t,"OpenAI-Beta":"responses=experimental",originator:"pi","content-type":"application/json",accept:"application/json"}}else n=`${getOpenAIBaseUrl(a)}/responses`,r={Authorization:`Bearer ${e}`,"Content-Type":"application/json"};const u=12e4,c=new AbortController,m=setTimeout(()=>c.abort(),u),onAbort=()=>c.abort();s?.addEventListener("abort",onAbort);try{const s=await fetch(n,{method:"POST",headers:r,body:y(o),signal:c.signal}),u=await readOpenAIResponseBody(s);if(504===s.status&&t<1)return p(`[${getOpenAICompatibleProviderLabel(a)}] responses 504 Gateway Timeout, reintentando...`,{level:"warn"}),sendRequest(e,t+1);if(401===s.status){const o=await maybeRecoverOpenAICompatible401(e,a);if(o)return sendRequest(o,t)}if(!s.ok)throw p(`[${getOpenAICompatibleProviderLabel(a)}] responses error status=${s.status} model=${i.model} endpoint=${n} oauth=${l} body=${(u.raw_error_text??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:s.status,statusText:s.statusText,url:n,model:String(i.model),data:u}));return u}catch(o){if(o instanceof Error&&"AbortError"===o.name&&!s?.aborted){if(t<f){const o=1e3*Math.pow(2,t);return p(`[${getOpenAICompatibleProviderLabel(a)}] responses timeout local tras 120000ms, reintentando en ${o}ms (intento ${t+1}/${f})`,{level:"warn"}),await new Promise(e=>setTimeout(e,o)),sendRequest(e,t+1)}throw new Error("La solicitud expiró tras 120s. El servidor tardó demasiado en responder.")}throw o}finally{clearTimeout(m),s?.removeEventListener("abort",onAbort)}};return sendRequest(u)}export async function*queryOpenAIModelWithStreaming({messages:t,systemPrompt:o,thinkingConfig:n,tools:r,signal:s,options:i}){try{for(let e=1;e<=2;e++){const n=await createOpenAIResponse({messages:1===e?t:[...t,f({content:"System reminder: your previous response for this turn was empty. Continue the current task without asking the user to repeat themselves. If a tool call is needed, emit the appropriate tool call now. Do not return an empty response.",isMeta:!0})],systemPrompt:o,tools:r,signal:s,options:i}),{content:a}=parseOutputItems(n);if(a.length>0)return void(yield d({content:a,usage:getUsage(n)}));if(!(e<2))return void(yield m({content:"OpenAI returned no content after retrying."}));p(`[${getOpenAICompatibleProviderLabel(getOpenAICompatibleProvider())}] empty model response with no content; retrying request (${e}/1)`,{level:"warn"})}}catch(t){if(s.aborted)throw new e;c(t),yield m({content:l(t),errorDetails:l(t)})}}
1
+ import{APIUserAbortError as e}from"@anthropic-ai/sdk/error.js";import{randomUUID as t}from"node:crypto";import{checkAndRefreshOpenAIOAuthTokenIfNeeded as o,getGeminiGoogleAuthHeaders as n,getOpenAICompatibleAccessToken as r,getOpenAIAccessToken as s,handleOpenAIOAuth401Error as i}from"../../utils/auth.js";import{getAPIProvider as a}from"../../utils/model/providers.js";import{getConfiguredProviderBaseUrl as u}from"../../utils/model/providerBaseUrls.js";import{errorMessage as l}from"../../utils/errors.js";import{logForDebugging as p}from"../../utils/debug.js";import{logError as c}from"../../utils/log.js";import{createAssistantAPIErrorMessage as m,createAssistantMessage as d,createUserMessage as f}from"../../utils/messages.js";import{toolToAPISchema as g}from"../../utils/api.js";import{jsonStringify as y}from"../../utils/slowOperations.js";function getOpenAIMaxTimeoutRetries(){const e=process.env.CONTEXT_CODE_MAX_RETRIES;if(!e)return 10;const t=Number.parseInt(e,10);return!Number.isFinite(t)||t<0?10:t}function isRecord(e){return"object"==typeof e&&null!==e&&!Array.isArray(e)}function isPlainObject(e){if(!isRecord(e))return!1;const t=Object.getPrototypeOf(e);return t===Object.prototype||null===t}function isJwtToken(e){return 3===e.split(".").length}function getOpenAICompatibleProvider(){const e=a();return"openrouter"===e||"ollama"===e||"ollama-cloud"===e||"gemini-api"===e||"gemini-google"===e||"zai"===e||"nvidia"===e||"custom-openai"===e?e:"openai"}function getOpenAICompatibleProviderLabel(e=getOpenAICompatibleProvider()){switch(e){case"openrouter":return"OpenRouter";case"ollama":return"Ollama";case"ollama-cloud":return"Ollama Cloud";case"gemini-api":return"Gemini API";case"gemini-google":return"Gemini Google";case"zai":return"Z.AI";case"nvidia":return"NVIDIA NIM";case"custom-openai":return"Custom OpenAI";default:return"OpenAI"}}function getOpenAIBaseUrl(e=getOpenAICompatibleProvider()){if("openrouter"===e){const e=process.env.OPENROUTER_BASE_URL||u("openrouter")||"https://openrouter.ai/api/v1";return e.endsWith("/v1")?e:e.endsWith("/")?`${e}v1`:`${e}/v1`}if("ollama"===e){const e=process.env.OLLAMA_BASE_URL||u("ollama")||"http://localhost:11434/v1";return e.endsWith("/v1")?e:e.endsWith("/")?`${e}v1`:`${e}/v1`}if("ollama-cloud"===e){const e=process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||u("ollama-cloud")||"http://localhost:11434/v1";return e.endsWith("/v1")?e:e.endsWith("/")?`${e}v1`:`${e}/v1`}if("zai"===e){const e=process.env.ZAI_BASE_URL||u("zai")||"https://api.z.ai/api/coding/paas/v4";return e.endsWith("/")?e.slice(0,-1):e}if("gemini-api"===e||"gemini-google"===e){const t=("gemini-api"===e?process.env.GEMINI_BASE_URL||process.env.GEMINI_API_BASE_URL:process.env.GEMINI_GOOGLE_BASE_URL||process.env.GEMINI_BASE_URL)||u(e)||"https://generativelanguage.googleapis.com/v1beta/openai";return t.endsWith("/")?t.slice(0,-1):t}if("nvidia"===e){const e=process.env.NVIDIA_BASE_URL||u("nvidia")||"https://integrate.api.nvidia.com/v1";return e.endsWith("/")?e.slice(0,-1):e}if("custom-openai"===e){const e=u("custom-openai")||"https://api.openai.com/v1";return e.endsWith("/")?e.slice(0,-1):e}const t=process.env.OPENAI_API_BASE_URL||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1";return t.endsWith("/v1")?t:t.endsWith("/")?`${t}v1`:`${t}/v1`}async function getOpenAIRequestHeaders(e=getOpenAICompatibleProvider()){return"gemini-google"===e?n():function(e=getOpenAICompatibleProvider()){const t=r(e);if(isLocalOllamaProviderHost(e,getOpenAIBaseUrl(e)))return{"Content-Type":"application/json"};if(!t)throw new Error(`${getOpenAICompatibleProviderLabel(e)} is selected but no credentials were found.`);return{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}(e)}function isLocalOllamaProviderHost(e,t=getOpenAIBaseUrl(e)){return("ollama"===e||"ollama-cloud"===e)&&(t.includes("localhost")||t.includes("127.0.0.1"))}function getOpenAIAccessTokenOrThrow(e=getOpenAICompatibleProvider()){if(isLocalOllamaProviderHost(e))return"ollama";if("gemini-google"===e)return r(e)||"google-application-default-credentials";const t=r(e);if(!t)throw new Error(`${getOpenAICompatibleProviderLabel(e)} is selected but no credentials were found.`);return t}async function maybeRefreshOpenAICompatibleAuth(e=getOpenAICompatibleProvider()){"openai"===e&&await o()}async function maybeRecoverOpenAICompatible401(e,t=getOpenAICompatibleProvider()){if("openai"!==t)return null;if(!await i(e))return null;const o=s();return o&&o!==e?o:null}function toInputText(e){return{type:"input_text",text:e}}function toOutputText(e){return{type:"output_text",text:e}}function normalizeBlocksForRole(e,t){return"assistant"!==t?e:e.map(e=>"input_text"===e.type?toOutputText(e.text):e)}function stringifyBlockContent(e){return"string"==typeof e?e:Array.isArray(e)?e.map(e=>"string"==typeof e?e:e&&"object"==typeof e&&"type"in e&&"text"===e.type&&"text"in e&&"string"==typeof e.text?e.text:y(e)).join("\n"):null==e?"":y(e)}function normalizeResponseContent(e){return Array.isArray(e)?e:null==e?[]:[e]}function blockToOpenAIContentBlocks(e){if(!isRecord(e))return null;if("text"===e.type&&"string"==typeof e.text)return[toInputText(e.text)];if("image"===e.type){const t=isRecord(e.source)?e.source:null,o=t?function(e){if("base64"===e.type){const t=e.media_type,o=e.data;return"string"!=typeof t||"string"!=typeof o?null:{type:"input_image",image_url:`data:${t};base64,${o}`}}return"url"===e.type&&"string"==typeof e.url?{type:"input_image",image_url:e.url}:"file"===e.type&&"string"==typeof e.file_id?{type:"input_image",file_id:e.file_id}:null}(t):null;return o?[o]:null}if("document"===e.type){const t=isRecord(e.source)?e.source:null;if(!t)return null;const o=function(e,t){return"file"===e.type&&"string"==typeof e.file_id?{type:"input_file",file_id:e.file_id}:"base64"===e.type&&"string"==typeof e.data?"string"!=typeof e.media_type?null:{type:"input_file",file_data:e.data,..."string"==typeof t&&t?{filename:t}:{}}:"url"===e.type&&"string"==typeof e.url?{type:"input_file",file_url:e.url,..."string"==typeof t&&t?{filename:t}:{}}:"text"===e.type&&"string"==typeof e.data?toInputText(e.data):null}(t,"string"==typeof e.title?e.title:void 0);if(o)return[o];if("content"===t.type&&"string"==typeof t.content)return[toInputText(t.content)];if("content"===t.type&&Array.isArray(t.content)){const e=[];for(const o of t.content){const t=blockToOpenAIContentBlocks(o);t&&e.push(...t)}return e.length>0?e:null}return null}if("search_result"===e.type&&Array.isArray(e.content)){const t=[];"string"==typeof e.title&&e.title.trim()&&t.push(e.title.trim()),"string"==typeof e.source&&e.source.trim()&&t.push(e.source.trim());for(const o of e.content)if(o&&"object"==typeof o&&"text"in o){const e=o.text;"string"==typeof e&&e.trim()&&t.push(e.trim())}return[toInputText(t.join("\n\n"))]}if("container_upload"===e.type&&"string"==typeof e.file_id)return[{type:"input_file",file_id:e.file_id}];if(("bash_code_execution_output"===e.type||"mcp_tool_result"===e.type||"code_execution_tool_result"===e.type||"web_search_tool_result"===e.type||"web_fetch_tool_result"===e.type||"text_editor_code_execution_tool_result"===e.type||"tool_search_tool_result"===e.type)&&"content"in e){const t=e.content;if("string"==typeof t)return[toInputText(t)];if(Array.isArray(t)){const e=[];for(const o of t){const t=blockToOpenAIContentBlocks(o);t&&e.push(...t)}return e.length>0?e:null}}if("content"in e&&("string"==typeof e.content||Array.isArray(e.content))){const t=e.content;if("string"==typeof t)return[toInputText(t)];const o=[];for(const e of t){const t=blockToOpenAIContentBlocks(e);t&&o.push(...t)}return o.length>0?o:null}return"data"in e&&"string"==typeof e.data?[toInputText(e.data)]:null}function toolResultContentToOpenAIOutput(e){if("string"==typeof e)return e;if(!Array.isArray(e))return stringifyBlockContent(e);const t=[];for(const o of e){const e=blockToOpenAIContentBlocks(o);if(e&&e.length>0){t.push(...e);continue}const n=stringifyBlockContent(o).trim();n&&t.push(toInputText(n))}return 0===t.length?"":t.every(e=>"input_text"===e.type)?t.map(e=>e.text).join("\n\n"):t}function messageToOpenAIInput(e){if(!e.message||"user"!==e.type&&"assistant"!==e.type)return[];const t=Array.isArray(e.message.content)?e.message.content:[{type:"text",text:String(e.message.content??"")}],o="assistant"===e.type?"assistant":"user",n=[],r=[],flushMessage=()=>{0!==r.length&&(n.push({type:"message",role:o,content:[...r]}),r.length=0)};for(const s of t){if("assistant"===e.type&&"tool_use"===s.type&&"string"==typeof s.id&&"string"==typeof s.name){flushMessage(),n.push({type:"function_call",call_id:s.id,name:s.name,arguments:y(s.input??{})});continue}if("user"===e.type&&"tool_result"===s.type&&"string"==typeof s.tool_use_id){flushMessage(),n.push({type:"function_call_output",call_id:s.tool_use_id,output:toolResultContentToOpenAIOutput(s.content)});continue}if("thinking"===s.type||"redacted_thinking"===s.type)continue;const t=blockToOpenAIContentBlocks(s);t&&t.length>0?r.push(...normalizeBlocksForRole(t,o)):r.push(..."assistant"===o?[toOutputText(stringifyBlockContent(s))]:[toInputText(stringifyBlockContent(s))])}return flushMessage(),n}async function readOpenAIResponseBody(e){const t=await e.text();if(!t.trim())return{};const o=t.trim();if(o.startsWith("data:")||o.startsWith("event:"))return function(e){const t=[];for(const o of e.split(/\r?\n\r?\n/)){const e=o.split(/\r?\n/).map(e=>e.trim()).filter(Boolean);if(0===e.length)continue;const n=e.filter(e=>e.startsWith("data:")).map(e=>e.slice(5).trim());if(0===n.length)continue;const r=n.join("\n").trim();if(r&&"[DONE]"!==r)try{const e=JSON.parse(r);isRecord(e)&&t.push(e)}catch{}}let o=null,n=null;const r=[];let s="";for(const i of t){const t="string"==typeof i.type?i.type:"";"response.completed"===t&&isRecord(i.response)?o={...i.response,raw_error_text:e}:"error"!==t?"response.output_item.done"===t&&isRecord(i.item)?r.push(i.item):"response.output_text.delta"!==t||"string"!=typeof i.delta?"response.output_text.done"===t&&"string"==typeof i.text&&(s=i.text):s+=i.delta:"string"==typeof i.message&&i.message.trim()?n=i.message:isRecord(i.error)&&"string"==typeof i.error.message&&(n=i.error.message)}if(o)return(!o.output||0===o.output.length)&&r.length>0&&(o.output=r),!o.output_text&&s&&(o.output_text=s),!o.error&&n&&(o.error={message:n}),o;if(r.length>0||s||n)return{output:r.length>0?r:void 0,output_text:s||void 0,error:n?{message:n}:void 0,raw_error_text:e};return{error:{message:e},raw_error_text:e}}(t);try{const e=JSON.parse(t);return isRecord(e)&&"string"==typeof e.error?{...e,error:{message:e.error},raw_error_text:t}:isRecord(e)?{...e,raw_error_text:t}:{error:{message:t},raw_error_text:t}}catch{return{error:{message:t},raw_error_text:t}}}function buildOpenAIErrorMessage(e){const t=e.data.error?.message?.trim()||e.data.raw_error_text?.trim()||`OpenAI request failed (${e.status} ${e.statusText})`,o=/requires a subscription|upgrade for access/i.test(t)?`El modelo ${e.model??"seleccionado"} requiere una suscripcion de Ollama Cloud. Cambia a otro modelo en /model o actualiza tu plan de Ollama.`:t,n=e.data.raw_error_text?.trim(),r=n&&n!==t&&n!==o?n.replace(/\s+/g," ").slice(0,400):null;return r?`${o} [model=${e.model??"unknown"} endpoint=${e.url}] ${r}`:`${o} [model=${e.model??"unknown"} endpoint=${e.url}]`}function blockToChatContentPart(e){if("text"===e.type&&"string"==typeof e.text)return{type:"text",text:e.text};if("image"===e.type){const t=isRecord(e.source)?e.source:null;if(!t)return null;if("base64"===t.type&&"string"==typeof t.data&&"string"==typeof t.media_type)return{type:"image_url",image_url:{url:`data:${t.media_type};base64,${t.data}`}};if("url"===t.type&&"string"==typeof t.url)return{type:"image_url",image_url:{url:t.url}}}const t=stringifyBlockContent(e);return t?{type:"text",text:t}:null}function toolResultToString(e){return"string"==typeof e?e:Array.isArray(e)?e.map(e=>"string"==typeof e?e:isRecord(e)&&"string"==typeof e.text?e.text:stringifyBlockContent(e)).filter(Boolean).join("\n"):stringifyBlockContent(e)}function messageToChatMessages(e){if(!e.message||"user"!==e.type&&"assistant"!==e.type)return[];const t=e.message.content,o=Array.isArray(t)?t:[{type:"text",text:String(t??"")}];if("assistant"===e.type){const e=[],t=[];for(const n of o)"thinking"!==n.type&&"redacted_thinking"!==n.type&&("tool_use"===n.type&&"string"==typeof n.id&&"string"==typeof n.name?e.push({id:n.id,type:"function",function:{name:n.name,arguments:y(n.input??{})}}):"text"===n.type&&"string"==typeof n.text&&n.text.trim()&&t.push(n.text));const n={role:"assistant",content:t.join("\n")};return e.length>0&&(n.tool_calls=e),[n]}const n=[],r=[];for(const e of o)if("tool_result"===e.type&&"string"==typeof e.tool_use_id)n.push({role:"tool",tool_call_id:e.tool_use_id,content:toolResultToString(e.content)});else{const t=blockToChatContentPart(e);t&&r.push(t)}const s=[...n];if(r.length>0){const e=r.every(e=>"text"===e.type);s.push({role:"user",content:e?r.map(e=>e.text).join("\n"):r})}return s}function parseChatCompletionResponse(e){const t=[];for(const o of e.choices??[]){const e=o.message;if(e){"string"==typeof e.content&&e.content.trim()&&t.push({type:"text",text:e.content});for(const o of e.tool_calls??[])t.push({type:"tool_use",id:o.id,name:o.function?.name??"tool",input:parseFunctionCallArguments(o.function?.arguments)})}}return{content:t}}function getChatUsage(e){if("number"==typeof e.usage?.prompt_tokens||"number"==typeof e.usage?.completion_tokens)return{input_tokens:e.usage?.prompt_tokens??0,output_tokens:e.usage?.completion_tokens??0}}function buildChatToolChoice(e){if(!e.toolChoice)return"auto";switch(e.toolChoice.type){case"auto":default:return"auto";case"any":return"required";case"none":return"none";case"tool":return"string"==typeof e.toolChoice.name?{type:"function",function:{name:e.toolChoice.name}}:"auto"}}function chatContentToGeminiParts(e){return"string"==typeof e?e?[{text:e}]:[]:Array.isArray(e)?e.map(e=>"text"===e.type?e.text?{text:e.text}:null:"image_url"===e.type?{text:`[Image input: ${e.image_url.url}]`}:null).filter(e=>null!==e):[]}function buildGeminiContents(e){const t=new Map,o=[];for(const n of e){if("system"===n.role)continue;if("assistant"===n.role){const e=chatContentToGeminiParts(n.content);for(const o of n.tool_calls??[]){t.set(o.id,o.function.name);const n=parseFunctionCallArguments(o.function.arguments);e.push({functionCall:{name:o.function.name,args:isPlainObject(n)?n:{raw:n}}})}e.length>0&&o.push({role:"model",parts:e});continue}if("tool"===n.role){const e=n.tool_call_id?t.get(n.tool_call_id)??"tool":"tool";o.push({role:"function",parts:[{functionResponse:{name:e,response:{result:n.content??""}}}]});continue}const e=chatContentToGeminiParts(n.content);e.length>0&&o.push({role:"user",parts:e})}return o.length>0?o:[{role:"user",parts:[{text:""}]}]}function getGeminiEnumType(e){switch(typeof e){case"string":return"string";case"number":return Number.isInteger(e)?"integer":"number";case"boolean":return"boolean";default:return}}function sanitizeGeminiSchema(e){if(!isRecord(e))return{type:"object",properties:{}};const t=Array.isArray(e.anyOf)?e.anyOf:Array.isArray(e.any_of)?e.any_of:null,o=Array.isArray(e.oneOf)?e.oneOf:Array.isArray(e.one_of)?e.one_of:null;if(t||o){const e=function(e){const t=[];let o,n=!1;for(const r of e){if(!isRecord(r))return null;if("null"===r.type){n=!0;continue}const e=void 0!==r.const?[r.const]:Array.isArray(r.enum)?r.enum:null;if(!e)return null;for(const n of e){const e=getGeminiEnumType(n);if(!e)return null;if(o&&o!==e)return null;o=e,t.push(n)}}return o&&0!==t.length?{type:o,enum:Array.from(new Set(t)),...n?{nullable:!0}:{}}:null}(t??o??[]);return e||{anyOf:(t??o??[]).map(sanitizeGeminiSchema)}}const n={},r=e.type;if(Array.isArray(r)){const e=r.find(e=>"null"!==e);"string"==typeof e&&(n.type=e),r.includes("null")&&(n.nullable=!0)}else"string"==typeof r&&(n.type=r);for(const t of["title","description","format","nullable","minimum","maximum","minItems","maxItems","minLength","maxLength","pattern"])void 0!==e[t]&&(n[t]=e[t]);if(Array.isArray(e.enum)?n.enum=e.enum:void 0!==e.const&&(n.enum=[e.const]),!n.type&&Array.isArray(n.enum)&&n.enum.length>0&&(n.type=getGeminiEnumType(n.enum[0])),void 0!==e.exclusiveMinimum&&void 0===n.minimum&&(n.minimum="number"==typeof e.exclusiveMinimum?e.exclusiveMinimum:e.minimum),void 0!==e.exclusiveMaximum&&void 0===n.maximum&&(n.maximum="number"==typeof e.exclusiveMaximum?e.exclusiveMaximum:e.maximum),isRecord(e.items)?n.items=sanitizeGeminiSchema(e.items):Array.isArray(e.items)&&e.items.length>0&&(n.items=sanitizeGeminiSchema(e.items[0])),isRecord(e.properties)){const t={};for(const[o,n]of Object.entries(e.properties))t[o]=sanitizeGeminiSchema(n);n.properties=t}return Array.isArray(e.required)&&(n.required=e.required.filter(e=>"string"==typeof e)),n.type||(n.type=n.properties?"object":n.items?"array":"object"),"object"!==n.type||n.properties||(n.properties={}),n}async function postGeminiCodeAssist(e,t,o,n){const r=await fetch(`https://cloudcode-pa.googleapis.com/v1internal:${e}`,{method:"POST",headers:t,body:y(o),signal:n});return{response:r,data:await readOpenAIResponseBody(r)}}function getGeminiCodeAssistMetadata(e){return{ideType:"IDE_UNSPECIFIED",platform:"PLATFORM_UNSPECIFIED",pluginType:"GEMINI",...e?{duetProject:e}:{}}}async function resolveGeminiCodeAssistProject(e,t){const o=process.env.GEMINI_GOOGLE_PROJECT_ID?.trim()||void 0,n={...o?{cloudaicompanionProject:o}:{},metadata:getGeminiCodeAssistMetadata(o)},{response:r,data:s}=await postGeminiCodeAssist("loadCodeAssist",e,n,t);if(!r.ok)return o;if("string"==typeof s.cloudaicompanionProject)return s.cloudaicompanionProject;if(o)return o;const i=Array.isArray(s.allowedTiers)?s.allowedTiers.filter(isRecord):[],a=i.find(e=>!0===e.isDefault)??i[0],u="string"==typeof a?.id?a.id:void 0;if(!u)return;const{response:l,data:p}=await postGeminiCodeAssist("onboardUser",e,{tierId:u,metadata:getGeminiCodeAssistMetadata()},t);if(!l.ok)return;const c=isRecord(p.response)?p.response:p,m=isRecord(c.cloudaicompanionProject)?c.cloudaicompanionProject:null;return"string"==typeof m?.id?m.id:void 0}async function createGeminiGoogleChatCompletionResponse(e){const{model:o,chatMessages:r,chatTools:s,toolChoice:i,signal:a,maxOutputTokens:u,temperature:l}=e,c=await n(),m=await resolveGeminiCodeAssistProject(c,a),d={};u&&(d.maxOutputTokens=u),void 0!==l&&(d.temperature=l);const f={contents:buildGeminiContents(r),session_id:t()},g=r.filter(e=>"system"===e.role&&"string"==typeof e.content).map(e=>e.content).join("\n\n");g&&(f.systemInstruction={role:"user",parts:[{text:g}]});const h=function(e){if(0!==e.length)return[{functionDeclarations:e.map(e=>({name:e.function.name,description:e.function.description,parameters:sanitizeGeminiSchema(e.function.parameters??{type:"object",properties:{}})}))}]}(s);h&&(f.tools=h);const _=function(e){if("auto"!==e)return"none"===e?{functionCallingConfig:{mode:"NONE"}}:"required"===e?{functionCallingConfig:{mode:"ANY"}}:{functionCallingConfig:{mode:"ANY",allowedFunctionNames:[e.function.name]}}}(i);_&&(f.toolConfig=_),Object.keys(d).length>0&&(f.generationConfig=d);const A={model:o,...m?{project:m}:{},user_prompt_id:t(),request:f},O="https://cloudcode-pa.googleapis.com/v1internal:generateContent";p(`[Gemini Google] codeassist generateContent request model=${o} messages=${r.length} tools=${s.length} endpoint=${O}`);const{response:b,data:x}=await postGeminiCodeAssist("generateContent",c,A,a);if(!b.ok)throw p(`[Gemini Google] codeassist generateContent error status=${b.status} model=${o} endpoint=${O} body=${(x.error?.message??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:b.status,statusText:b.statusText,url:O,model:o,data:x}));return function(e){const o=e.response?.candidates??[];return{id:e.traceId,choices:o.map(e=>{const o=[],n=[];for(const r of e.content?.parts??[])"text"in r&&"string"==typeof r.text&&o.push(r.text),"functionCall"in r&&r.functionCall?.name&&n.push({id:`call_${t().replace(/-/g,"")}`,type:"function",function:{name:r.functionCall.name,arguments:y(r.functionCall.args??{})}});return{message:{content:o.join("")||null,tool_calls:n.length>0?n:void 0},finish_reason:e.finishReason}}),usage:{prompt_tokens:e.response?.usageMetadata?.promptTokenCount,completion_tokens:e.response?.usageMetadata?.candidatesTokenCount}}}(x)}async function buildOpenAITools(e,t){return(await Promise.all(e.map(o=>g(o,{getToolPermissionContext:t.getToolPermissionContext,tools:e,agents:t.agents,allowedAgentTypes:t.allowedAgentTypes,model:t.model})))).map(e=>({type:"function",name:e.name,description:e.description,parameters:e.input_schema,...e.strict?{strict:!0}:{}}))}function buildToolChoice(e){if(!e.toolChoice)return"auto";switch(e.toolChoice.type){case"auto":default:return"auto";case"any":return"required";case"none":return"none";case"tool":return"string"==typeof e.toolChoice.name?{type:"function",name:e.toolChoice.name}:"auto"}}function shouldDisableParallelToolCalls(e){const t=e.toolChoice;return Boolean(t&&"disable_parallel_tool_use"in t&&!0===t.disable_parallel_tool_use)}function parseFunctionCallArguments(e){if(isPlainObject(e))return e;if("string"!=typeof e)return null==e?{}:{raw:e};try{const t=JSON.parse(e);return isPlainObject(t)?t:{raw:t}}catch{return{raw:e}}}function parseOutputItems(e){const t=[];for(const o of e.output??[])if(o&&"object"==typeof o){if("function_call"===o.type){const e=parseFunctionCallArguments(o.arguments);t.push({type:"tool_use",id:String(o.call_id??o.id??""),name:String(o.name??"tool"),input:e});continue}if("message"===o.type)for(const e of normalizeResponseContent(o.content)){if("string"==typeof e){t.push({type:"text",text:e});continue}if(!e||"object"!=typeof e||!("type"in e))continue;const o=String(e.type??""),n="string"==typeof e.text?e.text??"":"string"==typeof e.refusal?e.refusal??"":"";"output_text"!==o&&"text"!==o&&"refusal"!==o||!n||t.push({type:"text",text:n})}}return 0===t.length&&"string"==typeof e.output_text&&t.push({type:"text",text:e.output_text}),{content:t}}function getUsage(e){if("number"==typeof e.usage?.input_tokens||"number"==typeof e.usage?.output_tokens)return{input_tokens:e.usage?.input_tokens??0,output_tokens:e.usage?.output_tokens??0}}function sideQueryMessageToOpenAIInput(e){const t=Array.isArray(e.content)?e.content.filter(e=>"text"===e?.type&&"string"==typeof e.text).map(e=>toInputText(e.text)):[toInputText(String(e.content??""))];return[{type:"message",role:e.role,content:t.length>0?t:[toInputText("")]}]}function sideQueryToolToOpenAITool(e){return{type:"function",name:e.name,description:e.description,parameters:e.input_schema??{type:"object",properties:{}}}}function buildSideQueryToolChoice(e){return e&&"auto"!==e?"none"===e||"none"===e.type?"none":"any"===e.type?"required":"auto"===e.type?"auto":"string"==typeof e.name&&e.name?{type:"function",name:e.name}:"auto":"auto"}function sideQueryMessageToChatMessage(e){const t=Array.isArray(e.content)?e.content.filter(e=>"text"===e?.type&&"string"==typeof e.text).map(e=>e.text).join("\n"):String(e.content??"");return{role:e.role,content:t}}function sideQueryToolToChatTool(e){return{type:"function",function:{name:e.name,description:e.description,parameters:e.input_schema??{type:"object",properties:{}}}}}export async function queryOpenAISideQuery({model:e,systemPrompt:t,messages:o,tools:n,toolChoice:s,outputFormat:i,signal:a,maxOutputTokens:u,temperature:l}){const c=getOpenAICompatibleProvider();await maybeRefreshOpenAICompatibleAuth(c);const m=getOpenAIBaseUrl(c),d=r(c);if(!("openai"===c&&d&&isJwtToken(d))){const r=[...t?[{role:"system",content:t}]:[],...o.map(sideQueryMessageToChatMessage)],d={model:e,messages:r,stream:!1},f=n?.map(sideQueryToolToChatTool)??[],g=function(e){const t=buildSideQueryToolChoice(e);return"auto"===t||"none"===t?t:"required"===t?"required":{type:"function",function:{name:t.name}}}(s);if(f.length>0&&(d.tools=f,d.tool_choice=g),"json_schema"===i?.type&&(d.response_format={type:"json_schema",json_schema:{name:"side_query_output",strict:!0,schema:i.schema}}),u&&(d.max_tokens=u),void 0!==l&&(d.temperature=l),"gemini-google"===c){const t=await createGeminiGoogleChatCompletionResponse({model:e,chatMessages:r,chatTools:f,toolChoice:g,signal:a,maxOutputTokens:u,temperature:l});return{id:t.id,content:parseChatCompletionResponse(t).content,usage:getChatUsage(t)}}const h=`${m}/chat/completions`,_=await fetch(h,{method:"POST",headers:await getOpenAIRequestHeaders(c),body:y(d),signal:a}),A=await readOpenAIResponseBody(_);if(!_.ok)throw p(`[${getOpenAICompatibleProviderLabel(c)}] sideQuery chat.completions error status=${_.status} model=${e} endpoint=${h} body=${(A.error?.message??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:_.status,statusText:_.statusText,url:h,model:e,data:A}));return{id:A.id,content:parseChatCompletionResponse(A).content,usage:getChatUsage(A)}}const f={model:e,input:o.flatMap(sideQueryMessageToOpenAIInput),instructions:t,stream:!1,store:!1};n&&n.length>0&&(f.tools=n.map(sideQueryToolToOpenAITool),f.tool_choice=buildSideQueryToolChoice(s)),"json_schema"===i?.type&&(f.text={format:{type:"json_schema",name:"side_query_output",strict:!0,schema:i.schema}}),u&&(f.max_output_tokens=u),void 0!==l&&(f.temperature=l);const g=`${m}/responses`,h=await fetch(g,{method:"POST",headers:await getOpenAIRequestHeaders(c),body:y(f),signal:a}),_=await readOpenAIResponseBody(h);if(!h.ok)throw p(`[${getOpenAICompatibleProviderLabel(c)}] sideQuery error status=${h.status} model=${e} endpoint=${m}/responses body=${(_.raw_error_text??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:h.status,statusText:h.statusText,url:`${m}/responses`,model:e,data:_}));return{id:_.id,content:parseOutputItems(_).content,usage:getUsage(_)}}async function createOpenAIResponse(e){const{messages:t,systemPrompt:o,tools:n,signal:s,options:i}=e,a=getOpenAICompatibleProvider();await maybeRefreshOpenAICompatibleAuth(a);const u=getOpenAIAccessTokenOrThrow(a),l="openai"===a&&isJwtToken(u);if(!l){const t=await async function({messages:e,systemPrompt:t,tools:o,signal:n,options:s}){const i=getOpenAICompatibleProvider();await maybeRefreshOpenAICompatibleAuth(i);const a=t.join("\n\n"),u=[...a?[{role:"system",content:a}]:[],...e.flatMap(messageToChatMessages)],l=(m=await buildOpenAITools(o,s),m.map(e=>({type:"function",function:{name:e.name,description:e.description,parameters:e.parameters,...e.strict?{strict:!0}:{}}}))),c={model:s.model,messages:u,stream:!1};var m;if(l.length>0&&(c.tools=l,c.tool_choice=buildChatToolChoice(s)),shouldDisableParallelToolCalls(s)&&(c.parallel_tool_calls=!1),s.maxOutputTokensOverride&&(c.max_tokens=s.maxOutputTokensOverride),void 0!==s.temperatureOverride&&(c.temperature=s.temperatureOverride),s.effortValue&&(c.reasoning_effort=s.effortValue),"gemini-google"===i)return createGeminiGoogleChatCompletionResponse({model:String(s.model),chatMessages:u,chatTools:l,toolChoice:buildChatToolChoice(s),signal:n,maxOutputTokens:s.maxOutputTokensOverride,temperature:s.temperatureOverride});const d=getOpenAIMaxTimeoutRetries(),sendRequest=async(e=r(i)??"",t=0)=>{const o=`${getOpenAIBaseUrl(i)}/chat/completions`;p(`[${getOpenAICompatibleProviderLabel(i)}] chat.completions request model=${s.model} messages=${u.length} tools=${l.length} endpoint=${o}${t>0?` (retry ${t})`:""}`);const a=12e4,m=new AbortController,f=setTimeout(()=>m.abort(),a),onAbort=()=>m.abort();n?.addEventListener("abort",onAbort);try{const n=await fetch(o,{method:"POST",headers:await getOpenAIRequestHeaders(i),body:y(c),signal:m.signal}),r=await readOpenAIResponseBody(n);if(504===n.status&&t<1)return p(`[${getOpenAICompatibleProviderLabel(i)}] 504 Gateway Timeout, reintentando...`,{level:"warn"}),sendRequest(e,t+1);if(401===n.status){const o=await maybeRecoverOpenAICompatible401(e,i);if(o)return sendRequest(o,t)}if(!n.ok)throw p(`[${getOpenAICompatibleProviderLabel(i)}] chat.completions error status=${n.status} model=${s.model} endpoint=${o} body=${(r.error?.message??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:n.status,statusText:n.statusText,url:o,model:String(s.model),data:r}));return r}catch(o){if(o instanceof Error&&"AbortError"===o.name&&!n?.aborted){if(t<d){const o=1e3*Math.pow(2,t);return p(`[${getOpenAICompatibleProviderLabel(i)}] timeout local tras 120000ms, reintentando en ${o}ms (intento ${t+1}/${d})`,{level:"warn"}),await new Promise(e=>setTimeout(e,o)),sendRequest(e,t+1)}throw new Error("La solicitud expiró tras 120s. El servidor tardó demasiado en responder.")}throw o}finally{clearTimeout(f),n?.removeEventListener("abort",onAbort)}};return getOpenAIAccessTokenOrThrow(i),sendRequest()}(e);return{id:t.id,output:t.choices?.flatMap(e=>{const t=[];if(e.message?.content&&t.push({type:"message",role:"assistant",content:[e.message.content]}),e.message?.tool_calls)for(const o of e.message.tool_calls)t.push({type:"function_call",call_id:o.id,name:o.function.name,arguments:o.function.arguments});return t})??[],usage:{input_tokens:t.usage?.prompt_tokens,output_tokens:t.usage?.completion_tokens}}}const c=t.flatMap(messageToOpenAIInput),m=await buildOpenAITools(n,i),d={model:i.model,input:c,instructions:o.join("\n\n"),tools:m,tool_choice:buildToolChoice(i),stream:!1,store:!1};shouldDisableParallelToolCalls(i)&&(d.parallel_tool_calls=!1),i.maxOutputTokensOverride&&(d.max_output_tokens=i.maxOutputTokensOverride),void 0!==i.temperatureOverride&&(d.temperature=i.temperatureOverride),i.effortValue&&(d.reasoning={effort:i.effortValue});const f=getOpenAIMaxTimeoutRetries(),sendRequest=async(e,t=0)=>{const o=l?{...d,stream:!0}:d;let n,r;if(l){const t=function(e){try{const t=JSON.parse(atob(e.split(".")[1])),o=t?.["https://api.openai.com/auth"]?.chatgpt_account_id;if(!o)throw new Error("No account ID in token");return o}catch{throw new Error("Failed to extract chatgpt-account-id from OAuth token")}}(e);n=function(){const e=(process.env.OPENAI_OAUTH_BASE_URL||"https://chatgpt.com/backend-api").replace(/\/+$/,"");return e.endsWith("/codex/responses")?e:e.endsWith("/codex")?`${e}/responses`:`${e}/codex/responses`}(),r={Authorization:`Bearer ${e}`,"chatgpt-account-id":t,"OpenAI-Beta":"responses=experimental",originator:"pi","content-type":"application/json",accept:"application/json"}}else n=`${getOpenAIBaseUrl(a)}/responses`,r={Authorization:`Bearer ${e}`,"Content-Type":"application/json"};const u=12e4,c=new AbortController,m=setTimeout(()=>c.abort(),u),onAbort=()=>c.abort();s?.addEventListener("abort",onAbort);try{const s=await fetch(n,{method:"POST",headers:r,body:y(o),signal:c.signal}),u=await readOpenAIResponseBody(s);if(504===s.status&&t<1)return p(`[${getOpenAICompatibleProviderLabel(a)}] responses 504 Gateway Timeout, reintentando...`,{level:"warn"}),sendRequest(e,t+1);if(401===s.status){const o=await maybeRecoverOpenAICompatible401(e,a);if(o)return sendRequest(o,t)}if(!s.ok)throw p(`[${getOpenAICompatibleProviderLabel(a)}] responses error status=${s.status} model=${i.model} endpoint=${n} oauth=${l} body=${(u.raw_error_text??"").replace(/\s+/g," ").slice(0,500)}`,{level:"error"}),new Error(buildOpenAIErrorMessage({status:s.status,statusText:s.statusText,url:n,model:String(i.model),data:u}));return u}catch(o){if(o instanceof Error&&"AbortError"===o.name&&!s?.aborted){if(t<f){const o=1e3*Math.pow(2,t);return p(`[${getOpenAICompatibleProviderLabel(a)}] responses timeout local tras 120000ms, reintentando en ${o}ms (intento ${t+1}/${f})`,{level:"warn"}),await new Promise(e=>setTimeout(e,o)),sendRequest(e,t+1)}throw new Error("La solicitud expiró tras 120s. El servidor tardó demasiado en responder.")}throw o}finally{clearTimeout(m),s?.removeEventListener("abort",onAbort)}};return sendRequest(u)}export async function*queryOpenAIModelWithStreaming({messages:t,systemPrompt:o,thinkingConfig:n,tools:r,signal:s,options:i}){try{for(let e=1;e<=2;e++){const n=await createOpenAIResponse({messages:1===e?t:[...t,f({content:"System reminder: your previous response for this turn was empty. Continue the current task without asking the user to repeat themselves. If a tool call is needed, emit the appropriate tool call now. Do not return an empty response.",isMeta:!0})],systemPrompt:o,tools:r,signal:s,options:i}),{content:a}=parseOutputItems(n);if(a.length>0)return void(yield d({content:a,usage:getUsage(n)}));if(!(e<2))return void(yield m({content:"OpenAI returned no content after retrying."}));p(`[${getOpenAICompatibleProviderLabel(getOpenAICompatibleProvider())}] empty model response with no content; retrying request (${e}/1)`,{level:"warn"})}}catch(t){if(s.aborted)throw new e;c(t),yield m({content:l(t),errorDetails:l(t)})}}