@iaforged/context-code 2.3.6 → 2.3.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.
Files changed (56) hide show
  1. package/dist/src/cli/handlers/auth.js +1 -1
  2. package/dist/src/commands/agent-spawn/agentSpawn.js +1 -0
  3. package/dist/src/commands/agent-spawn/index.js +1 -0
  4. package/dist/src/commands/login/login.js +1 -1
  5. package/dist/src/commands/skills/skills.js +1 -1
  6. package/dist/src/commands/swarm-init/index.js +1 -1
  7. package/dist/src/commands/swarm-init/swarmInit.js +1 -1
  8. package/dist/src/commands/swarm-list-teams/index.js +1 -0
  9. package/dist/src/commands/swarm-list-teams/swarmListTeams.js +1 -0
  10. package/dist/src/commands.js +1 -1
  11. package/dist/src/components/ConsoleOAuthFlow.js +1 -1
  12. package/dist/src/components/agents/agentFileUtils.js +1 -1
  13. package/dist/src/components/agents/new-agent-creation/wizard-steps/LocationStep.js +1 -1
  14. package/dist/src/components/agents/new-agent-creation/wizard-steps/MemoryStep.js +1 -1
  15. package/dist/src/components/permissions/ExitPlanModePermissionRequest/ExitPlanModePermissionRequest.js +1 -1
  16. package/dist/src/constants/oauth.js +1 -1
  17. package/dist/src/core/agents/blueprints.js +1 -1
  18. package/dist/src/core/agents/teams.js +1 -0
  19. package/dist/src/projectOnboardingState.js +1 -1
  20. package/dist/src/screens/Doctor.js +1 -1
  21. package/dist/src/services/api/openai.js +1 -1
  22. package/dist/src/services/oauth/copilotDevice.js +1 -0
  23. package/dist/src/skills/loadSkillsDir.js +1 -1
  24. package/dist/src/tools/AgentTool/agentMemory.js +1 -1
  25. package/dist/src/utils/auth.js +1 -1
  26. package/dist/src/utils/claudemd.js +1 -1
  27. package/dist/src/utils/cronTasks.js +1 -1
  28. package/dist/src/utils/cronTasksLock.js +1 -1
  29. package/dist/src/utils/doctorDiagnostic.js +1 -1
  30. package/dist/src/utils/envUtils.js +1 -1
  31. package/dist/src/utils/hooks/skillImprovement.js +1 -1
  32. package/dist/src/utils/markdownConfigLoader.js +1 -1
  33. package/dist/src/utils/metaMcp/common.js +1 -0
  34. package/dist/src/utils/metaMcp/mcpServer.js +1 -0
  35. package/dist/src/utils/metaMcp/server/index.js +1 -0
  36. package/dist/src/utils/metaMcp/setup.js +1 -0
  37. package/dist/src/utils/model/model.js +1 -1
  38. package/dist/src/utils/model/modelOptions.js +1 -1
  39. package/dist/src/utils/model/providerCatalog.js +1 -1
  40. package/dist/src/utils/model/providerModels.js +1 -1
  41. package/dist/src/utils/model/providerProfiles.js +1 -1
  42. package/dist/src/utils/model/providerProfilesDb.js +1 -1
  43. package/dist/src/utils/model/providers.js +1 -1
  44. package/dist/src/utils/nativeInstaller/installer.js +1 -1
  45. package/dist/src/utils/permissions/filesystem.js +1 -1
  46. package/dist/src/utils/plugins/addDirPluginSettings.js +1 -1
  47. package/dist/src/utils/sandbox/sandbox-adapter.js +1 -1
  48. package/dist/src/utils/settings/settings.js +1 -1
  49. package/dist/src/utils/skills/skillChangeDetector.js +1 -1
  50. package/dist/src/utils/worktree.js +1 -1
  51. package/dist/src/whatsapp/config.js +1 -1
  52. package/dist/webapp/chunk-OJZNEHPP.js +1 -1
  53. package/dist/webapp/chunk-VAB2VXFI.js +1 -1
  54. package/dist/webapp/ngsw-worker.js +1 -1
  55. package/dist/webapp/polyfills-7R4CRVNH.js +1 -1
  56. package/package.json +41 -3
@@ -0,0 +1 @@
1
+ import{Server as e}from"@modelcontextprotocol/sdk/server/index.js";import{StdioServerTransport as a}from"@modelcontextprotocol/sdk/server/stdio.js";import{CallToolRequestSchema as t,ListToolsRequestSchema as i}from"@modelcontextprotocol/sdk/types.js";let n=null;const r=[{name:"meta_connect",description:"Conectarse a la API de Meta Developer y guardar el token y los IDs de cuenta en la sesión del servidor MCP.",inputSchema:{type:"object",properties:{accessToken:{type:"string",description:"Meta Graph API Access Token (Token de acceso de usuario, página o sistema)"},adAccountId:{type:"string",description:"ID de la Cuenta de Anuncios (act_XXXXXXXXX) (opcional)"},pageId:{type:"string",description:"ID de la Página de Facebook (opcional)"},instagramBusinessAccountId:{type:"string",description:"ID de la Cuenta de Instagram Business (opcional)"},whatsappPhoneNumberId:{type:"string",description:"ID del número de teléfono de WhatsApp Cloud API (opcional)"},whatsappWabaId:{type:"string",description:"ID de la Cuenta de WhatsApp Business (opcional)"}},required:["accessToken"]}},{name:"meta_status",description:"Verificar el estado de la conexión y las credenciales configuradas.",inputSchema:{type:"object",properties:{}}},{name:"meta_disconnect",description:"Cerrar la sesión de Meta y borrar las credenciales de la memoria.",inputSchema:{type:"object",properties:{}}},{name:"meta_create_campaign",description:"Crear una campaña publicitaria en Meta Ads.",inputSchema:{type:"object",properties:{name:{type:"string",description:"Nombre de la campaña"},objective:{type:"string",enum:["OUTCOME_TRAFFIC","OUTCOME_LEADS","OUTCOME_ENGAGEMENT","OUTCOME_AWARENESS","OUTCOME_APP_PROMOTION","OUTCOME_SALES"],description:"Objetivo de la campaña"},status:{type:"string",enum:["ACTIVE","PAUSED"],description:"Estado inicial"},dailyBudget:{type:"number",description:"Presupuesto diario en centavos (ej: 1000 para $10.00)"}},required:["name","objective"]}},{name:"meta_create_adset",description:"Crear un conjunto de anuncios (AdSet) para una campaña.",inputSchema:{type:"object",properties:{campaignId:{type:"string",description:"ID de la campaña padre"},name:{type:"string",description:"Nombre del conjunto de anuncios"},dailyBudget:{type:"number",description:"Presupuesto diario en centavos"},billingEvent:{type:"string",enum:["IMPRESSIONS","CLICKS","LINK_CLICKS"],description:"Evento de facturación"},optimizationGoal:{type:"string",description:"Meta de optimización (ej: LINK_CLICKS, REACH)"},targeting:{type:"object",description:"Especificación de targeting (geolocalización, edad, intereses)"},status:{type:"string",enum:["ACTIVE","PAUSED"]}},required:["campaignId","name","billingEvent","optimizationGoal","targeting"]}},{name:"meta_create_ad",description:"Crear un anuncio (Creative y Ad) dentro de un AdSet.",inputSchema:{type:"object",properties:{adsetId:{type:"string",description:"ID del conjunto de anuncios"},name:{type:"string",description:"Nombre del anuncio"},creativeId:{type:"string",description:"ID del AdCreative a utilizar"},status:{type:"string",enum:["ACTIVE","PAUSED"]}},required:["adsetId","name","creativeId"]}},{name:"meta_update_budget",description:"Modificar el presupuesto diario de una campaña o conjunto de anuncios.",inputSchema:{type:"object",properties:{id:{type:"string",description:"ID de la Campaña o AdSet"},dailyBudget:{type:"number",description:"Nuevo presupuesto diario en centavos"}},required:["id","dailyBudget"]}},{name:"meta_get_ad_metrics",description:"Consultar métricas (ROAS, CTR, CPC, CPM, impresiones, clics, gasto) para la cuenta o una campaña específica.",inputSchema:{type:"object",properties:{campaignId:{type:"string",description:"ID de la campaña (opcional, si se omite trae métricas globales de la cuenta)"},datePreset:{type:"string",enum:["today","yesterday","this_month","last_month","maximum","last_30d"],description:"Rango de fechas predefinido"}}}},{name:"meta_pause_campaign",description:"Pausar una campaña publicitaria activa.",inputSchema:{type:"object",properties:{campaignId:{type:"string",description:"ID de la campaña a pausar"}},required:["campaignId"]}},{name:"meta_duplicate_campaign",description:"Duplicar una campaña publicitaria existente.",inputSchema:{type:"object",properties:{campaignId:{type:"string",description:"ID de la campaña a duplicar"},newName:{type:"string",description:"Nombre de la nueva campaña"}},required:["campaignId","newName"]}},{name:"meta_get_page_posts",description:"Leer las publicaciones de una Página de Facebook.",inputSchema:{type:"object",properties:{limit:{type:"number",description:"Límite de publicaciones a retornar"}}}},{name:"meta_schedule_post",description:"Crear o programar una publicación en la Página de Facebook.",inputSchema:{type:"object",properties:{message:{type:"string",description:"Texto de la publicación"},link:{type:"string",description:"URL del enlace a compartir (opcional)"},published:{type:"boolean",description:"Publicar inmediatamente (true) o guardar como borrador/programado (false)"},scheduledPublishTime:{type:"number",description:"Timestamp UNIX en segundos para programar la publicación (opcional)"}},required:["message"]}},{name:"meta_get_page_comments",description:"Leer comentarios de una publicación en la Página.",inputSchema:{type:"object",properties:{postId:{type:"string",description:"ID de la publicación"}},required:["postId"]}},{name:"meta_reply_comment",description:"Responder a un comentario en una publicación.",inputSchema:{type:"object",properties:{commentId:{type:"string",description:"ID del comentario al que se le va a responder"},message:{type:"string",description:"Texto de la respuesta"}},required:["commentId","message"]}},{name:"meta_get_page_insights",description:"Obtener estadísticas de la Página de Facebook (me gusta, visitas, engagement).",inputSchema:{type:"object",properties:{metric:{type:"string",description:"Nombre de la métrica (ej: page_impressions, page_views_total)"}}}},{name:"meta_publish_ig_content",description:"Publicar una imagen o contenedor multimedia en una cuenta de Instagram Business.",inputSchema:{type:"object",properties:{imageUrl:{type:"string",description:"URL pública de la imagen a publicar"},caption:{type:"string",description:"Pie de foto de la publicación"}},required:["imageUrl","caption"]}},{name:"meta_schedule_ig_post",description:"Programar contenido multimedia para Instagram.",inputSchema:{type:"object",properties:{imageUrl:{type:"string",description:"URL de la imagen"},caption:{type:"string",description:"Pie de foto"},scheduledTime:{type:"string",description:"Fecha en formato ISO 8601"}},required:["imageUrl","caption","scheduledTime"]}},{name:"meta_get_ig_comments",description:"Obtener comentarios de un elemento multimedia en Instagram.",inputSchema:{type:"object",properties:{mediaId:{type:"string",description:"ID del objeto multimedia de Instagram"}},required:["mediaId"]}},{name:"meta_reply_ig_message",description:"Responder a un mensaje directo de Instagram.",inputSchema:{type:"object",properties:{recipientId:{type:"string",description:"ID del destinatario (usuario de Instagram)"},message:{type:"string",description:"Texto de la respuesta"}},required:["recipientId","message"]}},{name:"meta_get_ig_insights",description:"Obtener métricas del perfil o contenido de Instagram Business.",inputSchema:{type:"object",properties:{metric:{type:"string",description:"Métrica a consultar (ej: impressions, reach, profile_views)"}}}},{name:"meta_send_wa_message",description:"Enviar un mensaje de texto plano por WhatsApp Cloud API.",inputSchema:{type:"object",properties:{to:{type:"string",description:"Número de teléfono destinatario en formato internacional (ej: 521XXXXXXXXXX)"},text:{type:"string",description:"Cuerpo del mensaje"}},required:["to","text"]}},{name:"meta_send_wa_notification",description:"Enviar una notificación utilizando plantillas oficiales de WhatsApp (Templates).",inputSchema:{type:"object",properties:{to:{type:"string",description:"Número de teléfono destinatario"},templateName:{type:"string",description:"Nombre de la plantilla registrada"},languageCode:{type:"string",description:"Código del lenguaje (ej: es, en)"},components:{type:"array",items:{type:"object"},description:"Componentes dinámicos de la plantilla"}},required:["to","templateName","languageCode"]}},{name:"meta_create_catalog_product",description:"Crear un producto en un catálogo comercial de Meta.",inputSchema:{type:"object",properties:{catalogId:{type:"string",description:"ID del catálogo"},name:{type:"string",description:"Nombre del producto"},retailerId:{type:"string",description:"SKU o ID único del retailer"},description:{type:"string",description:"Descripción del producto"},imageUrl:{type:"string",description:"URL de la imagen del producto"},price:{type:"number",description:"Precio del producto (ej: 2990 para $29.90)"},currency:{type:"string",description:"Moneda (USD, MXN, EUR, etc.)"},brand:{type:"string",description:"Marca del producto"}},required:["catalogId","name","retailerId","imageUrl","price","currency"]}},{name:"meta_update_catalog_inventory",description:"Actualizar precio o inventario de un producto del catálogo.",inputSchema:{type:"object",properties:{catalogId:{type:"string",description:"ID del catálogo"},retailerId:{type:"string",description:"SKU del producto"},price:{type:"number",description:"Nuevo precio"},availability:{type:"string",enum:["in stock","out of stock"],description:"Disponibilidad"}},required:["catalogId","retailerId"]}},{name:"meta_search_ads_library",description:"Buscar anuncios en la Meta Ads Library (Ad Archive API) para analizar competidores y detectar anuncios de larga duración.",inputSchema:{type:"object",properties:{searchTerms:{type:"string",description:"Términos de búsqueda o marca"},country:{type:"string",description:"Código del país (ej: US, MX, ES)"},limit:{type:"number",description:"Número máximo de anuncios a retornar (por defecto 25)"}},required:["searchTerms"]}}];async function callMetaApi(e,a="GET",t=null){if(!n?.accessToken)throw new Error("No hay una sesión activa de Meta. Llama a meta_connect primero con un Access Token.");const i=new URL(`https://graph.facebook.com/v19.0/${e}`);i.searchParams.append("access_token",n.accessToken);const r={method:a,headers:{"Content-Type":"application/json"}};if(t)if("GET"===a)for(const[e,a]of Object.entries(t))"object"==typeof a?i.searchParams.append(e,JSON.stringify(a)):i.searchParams.append(e,String(a));else r.body=JSON.stringify(t);const s=await fetch(i.toString(),r),o=await s.json();if(!s.ok)throw new Error(`Error de Meta API (${s.status}): ${o.error?.message||JSON.stringify(o)}`);return o}export async function runMetaMcpServer(){const s=new e({name:"Meta Developer and Marketing Suite",version:"1.0.0"},{capabilities:{tools:{}}});s.setRequestHandler(i,async()=>({tools:r})),s.setRequestHandler(t,async e=>{const{name:a,arguments:t}=e.params,i=await async function(e,a){if("meta_connect"===e){n={accessToken:a.accessToken,adAccountId:a.adAccountId,pageId:a.pageId,instagramBusinessAccountId:a.instagramBusinessAccountId,whatsappPhoneNumberId:a.whatsappPhoneNumberId,whatsappWabaId:a.whatsappWabaId};try{const e=await callMetaApi("me");return`✅ Conexión con Meta establecida exitosamente.\nUsuario: ${e.name} (ID: ${e.id})\nCredenciales guardadas en la sesión.`}catch(e){return n=null,`❌ Error al conectar con Meta (Token inválido): ${e instanceof Error?e.message:String(e)}`}}if("meta_status"===e)return n?`✅ Sesión activa de Meta:\n Ad Account ID: ${n.adAccountId||"No configurado"}\n Page ID: ${n.pageId||"No configurado"}\n Instagram Business ID: ${n.instagramBusinessAccountId||"No configurado"}\n WhatsApp Phone ID: ${n.whatsappPhoneNumberId||"No configurado"}\n WhatsApp WABA ID: ${n.whatsappWabaId||"No configurado"}`:"❌ No hay sesión activa de Meta. Conéctate usando meta_connect.";if("meta_disconnect"===e)return n=null,"✅ Sesión de Meta cerrada. Credenciales borradas de la memoria.";if(!n)return"❌ Error: Se requiere una sesión activa con Meta para usar esta herramienta. Por favor, ejecuta primero meta_connect.";try{switch(e){case"meta_create_campaign":{const e=n.adAccountId;if(!e)return'❌ Error: Se requiere especificar "adAccountId" al conectar para crear campañas.';const t={name:a.name,objective:a.objective,status:a.status||"PAUSED",special_ad_categories:"NONE"};return a.dailyBudget&&(t.daily_budget=a.dailyBudget),`✅ Campaña creada exitosamente. ID: ${(await callMetaApi(`${e}/campaigns`,"POST",t)).id}`}case"meta_create_adset":{const e=n.adAccountId;if(!e)return'❌ Error: Se requiere especificar "adAccountId" para crear conjuntos de anuncios.';const t={name:a.name,campaign_id:a.campaignId,daily_budget:a.dailyBudget,billing_event:a.billingEvent,optimization_goal:a.optimizationGoal,targeting:a.targeting,status:a.status||"PAUSED"};return`✅ Conjunto de Anuncios (AdSet) creado exitosamente. ID: ${(await callMetaApi(`${e}/adsets`,"POST",t)).id}`}case"meta_create_ad":{const e=n.adAccountId;if(!e)return'❌ Error: Se requiere especificar "adAccountId" para crear anuncios.';const t={name:a.name,adset_id:a.adsetId,creative:{creative_id:a.creativeId},status:a.status||"PAUSED"};return`✅ Anuncio creado exitosamente. ID: ${(await callMetaApi(`${e}/ads`,"POST",t)).id}`}case"meta_update_budget":{const e={daily_budget:a.dailyBudget},t=await callMetaApi(a.id,"POST",e);return`✅ Presupuesto modificado exitosamente para el objeto ID: ${a.id}. Estado: ${t.success}`}case"meta_get_ad_metrics":{const e=a.campaignId||n.adAccountId;if(!e)return'❌ Error: Se requiere "campaignId" o configurar "adAccountId" en la conexión.';const t={fields:"impressions,clicks,spend,ctr,cpc,cpm,actions",date_preset:a.datePreset||"last_30d"},i=await callMetaApi(`${e}/insights`,"GET",t);if(!i.data||0===i.data.length)return`ℹ️ No hay métricas registradas en el período seleccionado (${t.date_preset}).`;const r=i.data[0];let s=0;if(r.actions){const e=r.actions.find(e=>"purchase"===e.action_type);e&&(s=parseFloat(e.value||0))}const o=r.spend>0?(s/parseFloat(r.spend)).toFixed(2):"N/A";return`📊 Métricas de Meta Ads (${t.date_preset}):\n Gasto: ${r.spend} ${r.account_currency||"USD"}\n Impresiones: ${r.impressions}\n Clics: ${r.clicks}\n CTR: ${parseFloat(r.ctr||0).toFixed(2)}%\n CPC: ${parseFloat(r.cpc||0).toFixed(2)}\n CPM: ${parseFloat(r.cpm||0).toFixed(2)}\n ROAS estimado: ${o}`}case"meta_pause_campaign":{const e={status:"PAUSED"},t=await callMetaApi(a.campaignId,"POST",e);return`✅ Campaña ${a.campaignId} pausada exitosamente. Éxito: ${t.success}`}case"meta_duplicate_campaign":{const e=await callMetaApi(`${a.campaignId}/copies`,"POST",{rename_options:{rename_strategy:"REPLACE_PREFIX",replace_string:a.newName}});return`✅ Campaña duplicada con éxito. ID de la nueva campaña: ${e.copied_campaign_id||e.id}`}case"meta_get_page_posts":{const e=n.pageId;if(!e)return'❌ Error: Se requiere especificar "pageId" en la conexión para leer posts.';const t=a.limit||10,i=await callMetaApi(`${e}/posts`,"GET",{limit:t,fields:"id,message,created_time,shares,likes.summary(true)"});let r=`📝 Publicaciones de la Página (Límite: ${t}):\n`;for(const e of i.data||[])r+=`- [${e.created_time}] ID: ${e.id}\n Texto: ${e.message||"[Sin texto]"}\n`;return r}case"meta_schedule_post":{const e=n.pageId;if(!e)return'❌ Error: Se requiere especificar "pageId" en la conexión para crear posts.';const t={message:a.message,published:void 0===a.published||a.published};return a.link&&(t.link=a.link),a.scheduledPublishTime&&(t.scheduled_publish_time=a.scheduledPublishTime),`✅ Publicación realizada/programada exitosamente en la Página. ID: ${(await callMetaApi(`${e}/feed`,"POST",t)).id}`}case"meta_get_page_comments":{const e=await callMetaApi(`${a.postId}/comments`,"GET",{fields:"id,message,from,created_time"});let t=`💬 Comentarios de la publicación ${a.postId}:\n`;for(const a of e.data||[])t+=`- ID: ${a.id} por ${a.from?.name||"Usuario"}: "${a.message}"\n`;return t}case"meta_reply_comment":return`✅ Respuesta enviada exitosamente. ID del comentario de respuesta: ${(await callMetaApi(`${a.commentId}/comments`,"POST",{message:a.message})).id}`;case"meta_get_page_insights":{const e=n.pageId;if(!e)return'❌ Error: Se requiere especificar "pageId" para obtener insights.';const t=a.metric||"page_impressions",i=await callMetaApi(`${e}/insights/${t}`,"GET");let r=`📈 Estadísticas de la Página para la métrica "${t}":\n`;if(i.data&&i.data.length>0){const e=i.data[0].values;for(const a of e.slice(-5))r+=` - Fecha: ${a.end_time.split("T")[0]} -> Valor: ${a.value}\n`}else r+=" Sin datos disponibles.";return r}case"meta_publish_ig_content":{const e=n.instagramBusinessAccountId;if(!e)return'❌ Error: Se requiere especificar "instagramBusinessAccountId" para publicar en IG.';const t=await callMetaApi(`${e}/media`,"POST",{image_url:a.imageUrl,caption:a.caption});return`✅ Contenido publicado en Instagram. ID publicación: ${(await callMetaApi(`${e}/media_publish`,"POST",{creation_id:t.id})).id}`}case"meta_schedule_ig_post":{const e=n.instagramBusinessAccountId;if(!e)return'❌ Error: Se requiere especificar "instagramBusinessAccountId" para programar en IG.';const t=Math.floor(new Date(a.scheduledTime).getTime()/1e3);return`✅ Publicación de Instagram programada exitosamente. Contenedor ID: ${(await callMetaApi(`${e}/media`,"POST",{image_url:a.imageUrl,caption:a.caption,scheduled_publish_time:t})).id}`}case"meta_get_ig_comments":{const e=await callMetaApi(`${a.mediaId}/comments`,"GET",{fields:"id,text,username,timestamp"});let t="💬 Comentarios de Instagram:\n";for(const a of e.data||[])t+=`- ID: ${a.id} (@${a.username}): "${a.text}"\n`;return t}case"meta_reply_ig_message":{const e=n.pageId;if(!e)return'❌ Error: Se requiere especificar "pageId" (vinculada al IG) para responder mensajes.';const t={recipient:{id:a.recipientId},message:{text:a.message}};return`✅ Mensaje directo de Instagram enviado exitosamente. ID del mensaje: ${(await callMetaApi(`${e}/messages`,"POST",t)).message_id}`}case"meta_get_ig_insights":{const e=n.instagramBusinessAccountId;if(!e)return'❌ Error: Se requiere especificar "instagramBusinessAccountId" para insights.';const t=a.metric||"impressions",i=await callMetaApi(`${e}/insights`,"GET",{metric:t,period:"day"});return`📈 Insights de Instagram (${t}):\n${JSON.stringify(i.data,null,2)}`}case"meta_send_wa_message":{const e=n.whatsappPhoneNumberId;if(!e)return'❌ Error: Se requiere especificar "whatsappPhoneNumberId" para WhatsApp.';const t={messaging_product:"whatsapp",to:a.to,type:"text",text:{body:a.text}},i=await callMetaApi(`${e}/messages`,"POST",t);return`✅ Mensaje de WhatsApp enviado exitosamente a ${a.to}. ID: ${i.messages?.[0]?.id}`}case"meta_send_wa_notification":{const e=n.whatsappPhoneNumberId;if(!e)return'❌ Error: Se requiere especificar "whatsappPhoneNumberId" para WhatsApp.';const t={messaging_product:"whatsapp",to:a.to,type:"template",template:{name:a.templateName,language:{code:a.languageCode},components:a.components}},i=await callMetaApi(`${e}/messages`,"POST",t);return`✅ Notificación por plantilla de WhatsApp enviada a ${a.to}. ID: ${i.messages?.[0]?.id}`}case"meta_create_catalog_product":{const e={name:a.name,retailer_id:a.retailerId,description:a.description||"",image_url:a.imageUrl,price:a.price,currency:a.currency,brand:a.brand||""};return`✅ Producto agregado al catálogo. ID del objeto de producto: ${(await callMetaApi(`${a.catalogId}/products`,"POST",e)).id}`}case"meta_update_catalog_inventory":{const e={};void 0!==a.price&&(e.price=a.price),void 0!==a.availability&&(e.availability=a.availability);const t=await callMetaApi(`${a.catalogId}/products`,"POST",{requests:[{method:"UPDATE",retailer_id:a.retailerId,data:e}]});return`✅ Petición de actualización de inventario enviada. Respuesta: ${JSON.stringify(t)}`}case"meta_search_ads_library":{const e=a.limit||25,t={search_terms:a.searchTerms,limit:e,fields:"id,ad_creation_time,ad_delivery_start_time,ad_delivery_stop_time,ad_creative_bodies,ad_creative_link_captions,page_id,page_name,publisher_platforms,ad_snapshot_url"};a.country?t.ad_reached_countries=[a.country]:t.ad_reached_countries=["ALL"];const i=(await callMetaApi("ads_archive","GET",t)).data||[];let n=`🔍 Resultados de búsqueda en Meta Ads Library (Ads: ${i.length}):\n\n`;for(const e of i){const a=new Date(e.ad_creation_time),t=Math.abs(Date.now()-a.getTime()),i=Math.ceil(t/864e5);let r="";r=i>=14?` 🔥 [ANUNCIO DE LARGA DURACIÓN: ${i} días activo. ¡Conversión probable!]`:` (Activo por ${i} días)`,n+=`📣 Anuncio ID: ${e.id} | De: ${e.page_name}${r}\n`,n+=` Creado el: ${e.ad_creation_time}\n`,n+=` Contenido (Copy): "${e.ad_creative_bodies?.[0]||"Sin texto"}"\n`,n+=` Plataformas: ${e.publisher_platforms?.join(", ")||"N/A"}\n`,n+=` URL del Snapshot: ${e.ad_snapshot_url||"N/A"}\n\n`}return n}default:return`❌ Error: Herramienta "${e}" no está implementada en este servidor MCP.`}}catch(a){return`❌ Error al ejecutar herramienta "${e}": ${a instanceof Error?a.message:String(a)}`}}(a,t||{});return{content:[{type:"text",text:i}]}});const o=new a;await s.connect(o),console.error("✅ Servidor MCP de Meta Developer y Marketing Suite iniciado por stdio.")}
@@ -0,0 +1 @@
1
+ import{join as o}from"node:path";import{fileURLToPath as m}from"node:url";import{META_MCP_SERVER_NAME as e,META_MCP_TOOLS as t}from"./common.js";import{isInBundledMode as s}from"../bundledMode.js";import{buildMcpToolName as r}from"../../services/mcp/mcpStringUtils.js";export function setupMetaMCP(){const p=t.map(o=>r(e,o)),a=s()?["--meta-mcp"]:[o(m(import.meta.url),"..","..","..","entrypoints","cli.js"),"--meta-mcp"];return{mcpConfig:{[e]:{type:"stdio",command:process.execPath,args:a,scope:"dynamic"}},allowedTools:p}}
@@ -1 +1 @@
1
- import{getMainLoopModelOverride as e}from"../../bootstrap/state.js";import{getSubscriptionType as t,isClaudeAISubscriber as n,isMaxSubscriber as o,isProSubscriber as r,isTeamPremiumSubscriber as u}from"../auth.js";import{has1mContext as s,is1mContextDisabled as i,modelSupports1M as l}from"../context.js";import{isEnvTruthy as a}from"../envUtils.js";import{getModelStrings as c,resolveOverriddenModel as d}from"./modelStrings.js";import{resolveAntModel as p,getAntModelOverrideConfig as f}from"./antModels.js";export{p as resolveAntModel,f as getAntModelOverrideConfig};import{formatModelPricing as m,getOpus46CostTier as M}from"../modelCost.js";import{getSettings_DEPRECATED as g}from"../settings/settings.js";import{getAPIProvider as O,isOpenAICompatibleProvider as x}from"./providers.js";import{LIGHTNING_BOLT as D}from"../../constants/figures.js";import{isModelAllowed as S}from"./modelAllowlist.js";import{isModelAlias as P}from"./aliases.js";import{capitalize as E}from"../stringUtils.js";export function isOpenAIProvider(){return x(O())}export function isGeminiProvider(){const e=O();return"gemini-api"===e||"gemini-google"===e}export function getSmallFastModel(){return process.env.ANTHROPIC_SMALL_FAST_MODEL||getDefaultHaikuModel()}export function isNonCustomOpusModel(e){return e===c().opus40||e===c().opus41||e===c().opus45||e===c().opus46||e===c().opus47||e===c().opus48}export function getUserSpecifiedModelSetting(){let t;const n=e();if(void 0!==n)t=n;else{const e=g()||{};t=process.env.ANTHROPIC_MODEL||e.model||void 0}if(!t||S(t))return t}export function getMainLoopModel(){const e=getUserSpecifiedModelSetting();return null!=e?parseUserSpecifiedModel(e):getDefaultMainLoopModel()}export function getBestModel(){return isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():getDefaultOpusModel()}export function getDefaultOpusModel(){return process.env.ANTHROPIC_DEFAULT_OPUS_MODEL?process.env.ANTHROPIC_DEFAULT_OPUS_MODEL:(O(),c().opus48)}export function getDefaultSonnetModel(){return process.env.ANTHROPIC_DEFAULT_SONNET_MODEL?process.env.ANTHROPIC_DEFAULT_SONNET_MODEL:"firstParty"!==O()?c().sonnet45:c().sonnet46}export function getDefaultHaikuModel(){return process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL?process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL:c().haiku45}export function getDefaultOpenAIModel(){return process.env.OPENAI_DEFAULT_MODEL||"gpt-5.4"}export function getDefaultOpenAIFastModel(){return process.env.OPENAI_DEFAULT_FAST_MODEL||"gpt-5.4-mini"}export function getDefaultGeminiModel(){return process.env.GEMINI_DEFAULT_MODEL||"gemini-3.5-pro"}export function getDefaultGeminiFastModel(){return process.env.GEMINI_DEFAULT_FAST_MODEL||"gemini-3.5-flash"}export function getRuntimeMainLoopModel(e){const{permissionMode:t,mainLoopModel:n,exceeds200kTokens:o=!1}=e;return"opusplan"!==getUserSpecifiedModelSetting()||"plan"!==t||o?"haiku"===getUserSpecifiedModelSetting()&&"plan"===t?getDefaultSonnetModel():n:getDefaultOpusModel()}export function getDefaultMainLoopModelSetting(){return"ant"===process.env.USER_TYPE?f()?.defaultModel??getDefaultOpusModel()+"[1m]":isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():o()||u()?getDefaultOpusModel()+(isOpus1mMergeEnabled()?"[1m]":""):getDefaultSonnetModel()}export function getDefaultMainLoopModel(){return parseUserSpecifiedModel(getDefaultMainLoopModelSetting())}export function firstPartyNameToCanonical(e){if(!e)return e;if((e=e.toLowerCase()).includes("claude-fable-5"))return"claude-fable-5";if(e.includes("claude-opus-4-8"))return"claude-opus-4-8";if(e.includes("claude-opus-4-7"))return"claude-opus-4-7";if(e.includes("claude-opus-4-6"))return"claude-opus-4-6";if(e.includes("claude-opus-4-5"))return"claude-opus-4-5";if(e.includes("claude-opus-4-1"))return"claude-opus-4-1";if(e.includes("claude-opus-4"))return"claude-opus-4";if(e.includes("claude-sonnet-4-6"))return"claude-sonnet-4-6";if(e.includes("claude-sonnet-4-5"))return"claude-sonnet-4-5";if(e.includes("claude-sonnet-4"))return"claude-sonnet-4";if(e.includes("claude-haiku-4-5"))return"claude-haiku-4-5";if(e.includes("claude-3-7-sonnet"))return"claude-3-7-sonnet";if(e.includes("claude-3-5-sonnet"))return"claude-3-5-sonnet";if(e.includes("claude-3-5-haiku"))return"claude-3-5-haiku";if(e.includes("claude-3-opus"))return"claude-3-opus";if(e.includes("claude-3-sonnet"))return"claude-3-sonnet";if(e.includes("claude-3-haiku"))return"claude-3-haiku";const t=e.match(/(claude-(\d+-\d+-)?\w+)/);return t&&t[1]?t[1]:e}export function getCanonicalName(e){return firstPartyNameToCanonical(d(e))}export function getClaudeAiUserDefaultModelDescription(e=!1){return o()||u()?isOpus1mMergeEnabled()?`Opus 4.7 con contexto de 1M · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:`Opus 4.7 · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:"Sonnet 4.6 · Lo mejor para tareas cotidianas"}export function renderDefaultModelSetting(e){return"opusplan"===e?"Opus 4.7 en modo plan, de lo contrario Sonnet 4.6":renderModelName(parseUserSpecifiedModel(e))}export function getOpus46PricingSuffix(e){if("firstParty"!==O())return"";const t=m(M(e));return` ·${e?` (${D})`:""} ${t}`}export function isOpus1mMergeEnabled(){return!i()&&!r()&&"firstParty"===O()&&(!n()||null!==t())}export function renderModelSetting(e){return"opusplan"===e?"Plan Opus":P(e)?E(e):renderModelName(e)}export function getPublicModelDisplayName(e){switch(e){case c().opus48:return"Opus 4.8";case c().opus48+"[1m]":return"Opus 4.8 (1M context)";case c().opus47:return"Opus 4.7";case c().opus47+"[1m]":return"Opus 4.7 (1M context)";case c().opus46:return"Opus 4.6";case c().opus46+"[1m]":return"Opus 4.6 (1M context)";case c().opus45:return"Opus 4.5";case c().opus41:return"Opus 4.1";case c().opus40:return"Opus 4";case c().sonnet46+"[1m]":return"Sonnet 4.6 (1M context)";case c().sonnet46:return"Sonnet 4.6";case c().sonnet45+"[1m]":return"Sonnet 4.5 (1M context)";case c().sonnet45:return"Sonnet 4.5";case c().sonnet40:return"Sonnet 4";case c().sonnet40+"[1m]":return"Sonnet 4 (1M context)";case c().sonnet37:return"Sonnet 3.7";case c().sonnet35:return"Sonnet 3.5";case c().haiku45:return"Haiku 4.5";case c().haiku35:return"Haiku 3.5";default:return null}}export function renderModelName(e){const t=getPublicModelDisplayName(e);if(t)return t;if("ant"===process.env.USER_TYPE){const t=parseUserSpecifiedModel(e),n=p(e);if(n){const e=function(e){const[t="",...n]=e.split("-");return[t.slice(0,3)+"*".repeat(Math.max(0,t.length-3)),...n].join("-")}(n.model.replace(/\[1m\]$/i,""));return e+(s(t)?"[1m]":"")}return t!==e?`${e} (${t})`:t}return e}export function getPublicModelName(e){const t=getPublicModelDisplayName(e);return t||e}export function parseUserSpecifiedModel(e){const t=getDefaultMainLoopModelSetting(),n=("string"==typeof e&&e.trim().length>0?e:"string"==typeof t&&t.trim().length>0?t:getDefaultOpenAIModel()).trim(),o=n.toLowerCase(),r=s(o),u=r?o.replace(/\[1m]$/i,"").trim():o;if(isOpenAIProvider()&&P(u))return"best"===u?getBestModel():r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n;if(P(u))switch(u){case"best":return getBestModel();case"opusplan":case"sonnet":return getDefaultSonnetModel()+(r?"[1m]":"");case"haiku":return getDefaultHaikuModel()+(r?"[1m]":"");case"opus":return getDefaultOpusModel()+(r?"[1m]":"")}if("firstParty"===O()&&(i=u,T.includes(i))&&isLegacyModelRemapEnabled())return getDefaultOpusModel()+(r?"[1m]":"");var i;if("ant"===process.env.USER_TYPE){const e=s(o),t=o.replace(/\[1m]$/i,"").trim(),n=p(t);if(n){const t=e?"[1m]":"";return n.model+t}}return r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n}export function resolveSkillModelOverride(e,t){return s(e)||!s(t)?e:l(parseUserSpecifiedModel(e))?e+"[1m]":e}const T=["claude-opus-4-20250514","claude-opus-4-1-20250805","claude-opus-4-0","claude-opus-4-1"];export function isLegacyModelRemapEnabled(){return!a(process.env.CONTEXT_CODE_DISABLE_LEGACY_MODEL_REMAP)&&!a(process.env.CLAUDE_CODE_DISABLE_LEGACY_MODEL_REMAP)}export function modelDisplayString(e){if(null===e)return"ant"===process.env.USER_TYPE?`Predeterminado para Ants (${renderDefaultModelSetting(getDefaultMainLoopModelSetting())})`:n()?`Predeterminado (${getClaudeAiUserDefaultModelDescription()})`:`Predeterminado (${renderModelName(getDefaultMainLoopModel())})`;const t=parseUserSpecifiedModel(e);return isOpenAIProvider()?e===t?renderModelName(t):`${e} (${renderModelName(t)})`:e===t?t:`${e} (${t})`}export function getMarketingNameForModel(e){if(!e)return;if("foundry"===O())return;const t=e.toLowerCase().includes("[1m]"),n=getCanonicalName(e);return n.includes("claude-fable-5")?t?"Fable 5 (with 1M context)":"Fable 5":n.includes("claude-opus-4-8")?t?"Opus 4.8 (with 1M context)":"Opus 4.8":n.includes("claude-opus-4-7")?t?"Opus 4.7 (with 1M context)":"Opus 4.7":n.includes("claude-opus-4-6")?t?"Opus 4.6 (with 1M context)":"Opus 4.6":n.includes("claude-opus-4-5")?"Opus 4.5":n.includes("claude-opus-4-1")?"Opus 4.1":n.includes("claude-opus-4")?"Opus 4":n.includes("claude-sonnet-4-6")?t?"Sonnet 4.6 (with 1M context)":"Sonnet 4.6":n.includes("claude-sonnet-4-5")?t?"Sonnet 4.5 (with 1M context)":"Sonnet 4.5":n.includes("claude-sonnet-4")?t?"Sonnet 4 (with 1M context)":"Sonnet 4":n.includes("claude-3-7-sonnet")?"3.7 Sonnet":n.includes("claude-3-5-sonnet")?"3.5 Sonnet":n.includes("claude-haiku-4-5")?"Haiku 4.5":n.includes("claude-3-5-haiku")?"3.5 Haiku":n.includes("gpt-5.3-codex")?"GPT-5.3 Codex":n.includes("gpt-5.5-pro")?"GPT-5.5 Pro":n.includes("gpt-5.5")?"GPT-5.5":n.includes("gpt-5.2-codex")?"GPT-5.2 Codex":n.includes("gpt-5.1-codex-max")?"GPT-5.1 Codex Max":n.includes("gpt-5.1-codex-mini")?"GPT-5.1 Codex mini":n.includes("gpt-5.1-codex")?"GPT-5.1 Codex":n.includes("gpt-5.3")?"GPT-5.3":n.includes("gpt-5.2")?"GPT-5.2":n.includes("gpt-5.1")?"GPT-5.1":n.includes("gpt-5-codex")?"GPT-5 Codex":n.includes("gpt-5-chat-latest")?"GPT-5 Chat":n.includes("gpt-5-mini")?"GPT-5 mini":n.includes("gpt-5-nano")?"GPT-5 nano":n.includes("gpt-5-pro")?"GPT-5 Pro":n.includes("gpt-5")?"GPT-5":n.includes("gpt-4o-mini")?"GPT-4o mini":n.includes("gpt-4o")?"GPT-4o":n.includes("codex-mini-latest")?"Codex mini":void 0}export function normalizeModelStringForAPI(e){return e.replace(/\[(1|2)m\]/gi,"")}
1
+ import{getMainLoopModelOverride as e}from"../../bootstrap/state.js";import{getSubscriptionType as t,isClaudeAISubscriber as n,isMaxSubscriber as o,isProSubscriber as r,isTeamPremiumSubscriber as u}from"../auth.js";import{has1mContext as s,is1mContextDisabled as i,modelSupports1M as l}from"../context.js";import{isEnvTruthy as a}from"../envUtils.js";import{getModelStrings as c,resolveOverriddenModel as d}from"./modelStrings.js";import{resolveAntModel as p,getAntModelOverrideConfig as f}from"./antModels.js";export{p as resolveAntModel,f as getAntModelOverrideConfig};import{formatModelPricing as m,getOpus46CostTier as M}from"../modelCost.js";import{getSettings_DEPRECATED as g}from"../settings/settings.js";import{getAPIProvider as O,isOpenAICompatibleProvider as D}from"./providers.js";import{LIGHTNING_BOLT as x}from"../../constants/figures.js";import{isModelAllowed as S}from"./modelAllowlist.js";import{isModelAlias as P}from"./aliases.js";import{capitalize as E}from"../stringUtils.js";export function isOpenAIProvider(){return D(O())}export function isGeminiProvider(){const e=O();return"gemini-api"===e||"gemini-google"===e}export function getSmallFastModel(){return process.env.ANTHROPIC_SMALL_FAST_MODEL||getDefaultHaikuModel()}export function isNonCustomOpusModel(e){return e===c().opus40||e===c().opus41||e===c().opus45||e===c().opus46||e===c().opus47||e===c().opus48}export function getUserSpecifiedModelSetting(){let t;const n=e();if(void 0!==n)t=n;else{const e=g()||{};t=process.env.ANTHROPIC_MODEL||e.model||void 0}if(!t||S(t))return t}export function getMainLoopModel(){const e=getUserSpecifiedModelSetting();return null!=e?parseUserSpecifiedModel(e):getDefaultMainLoopModel()}export function getBestModel(){return isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():getDefaultOpusModel()}export function getDefaultOpusModel(){return process.env.ANTHROPIC_DEFAULT_OPUS_MODEL?process.env.ANTHROPIC_DEFAULT_OPUS_MODEL:(O(),c().opus48)}export function getDefaultSonnetModel(){return process.env.ANTHROPIC_DEFAULT_SONNET_MODEL?process.env.ANTHROPIC_DEFAULT_SONNET_MODEL:"firstParty"!==O()?c().sonnet45:c().sonnet46}export function getDefaultHaikuModel(){return process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL?process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL:c().haiku45}const L="gpt-4.1";export function getDefaultOpenAIModel(){return"copilot"===O()?process.env.GITHUB_COPILOT_DEFAULT_MODEL||L:process.env.OPENAI_DEFAULT_MODEL||"gpt-5"}export function getDefaultOpenAIFastModel(){return process.env.OPENAI_DEFAULT_FAST_MODEL||"gpt-5-mini"}export function getDefaultGeminiModel(){return process.env.GEMINI_DEFAULT_MODEL||"gemini-3.5-pro"}export function getDefaultGeminiFastModel(){return process.env.GEMINI_DEFAULT_FAST_MODEL||"gemini-3.5-flash"}export function getRuntimeMainLoopModel(e){const{permissionMode:t,mainLoopModel:n,exceeds200kTokens:o=!1}=e;return"opusplan"!==getUserSpecifiedModelSetting()||"plan"!==t||o?"haiku"===getUserSpecifiedModelSetting()&&"plan"===t?getDefaultSonnetModel():n:getDefaultOpusModel()}export function getDefaultMainLoopModelSetting(){return"ant"===process.env.USER_TYPE?f()?.defaultModel??getDefaultOpusModel()+"[1m]":isGeminiProvider()?getDefaultGeminiModel():isOpenAIProvider()?getDefaultOpenAIModel():o()||u()?getDefaultOpusModel()+(isOpus1mMergeEnabled()?"[1m]":""):getDefaultSonnetModel()}export function getDefaultMainLoopModel(){return parseUserSpecifiedModel(getDefaultMainLoopModelSetting())}export function firstPartyNameToCanonical(e){if(!e)return e;if((e=e.toLowerCase()).includes("claude-fable-5"))return"claude-fable-5";if(e.includes("claude-opus-4-8"))return"claude-opus-4-8";if(e.includes("claude-opus-4-7"))return"claude-opus-4-7";if(e.includes("claude-opus-4-6"))return"claude-opus-4-6";if(e.includes("claude-opus-4-5"))return"claude-opus-4-5";if(e.includes("claude-opus-4-1"))return"claude-opus-4-1";if(e.includes("claude-opus-4"))return"claude-opus-4";if(e.includes("claude-sonnet-4-6"))return"claude-sonnet-4-6";if(e.includes("claude-sonnet-4-5"))return"claude-sonnet-4-5";if(e.includes("claude-sonnet-4"))return"claude-sonnet-4";if(e.includes("claude-haiku-4-5"))return"claude-haiku-4-5";if(e.includes("claude-3-7-sonnet"))return"claude-3-7-sonnet";if(e.includes("claude-3-5-sonnet"))return"claude-3-5-sonnet";if(e.includes("claude-3-5-haiku"))return"claude-3-5-haiku";if(e.includes("claude-3-opus"))return"claude-3-opus";if(e.includes("claude-3-sonnet"))return"claude-3-sonnet";if(e.includes("claude-3-haiku"))return"claude-3-haiku";const t=e.match(/(claude-(\d+-\d+-)?\w+)/);return t&&t[1]?t[1]:e}export function getCanonicalName(e){return firstPartyNameToCanonical(d(e))}export function getClaudeAiUserDefaultModelDescription(e=!1){return o()||u()?isOpus1mMergeEnabled()?`Opus 4.7 con contexto de 1M · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:`Opus 4.7 · El más capaz para tareas complejas${e?getOpus46PricingSuffix(!0):""}`:"Sonnet 4.6 · Lo mejor para tareas cotidianas"}export function renderDefaultModelSetting(e){return"opusplan"===e?"Opus 4.7 en modo plan, de lo contrario Sonnet 4.6":renderModelName(parseUserSpecifiedModel(e))}export function getOpus46PricingSuffix(e){if("firstParty"!==O())return"";const t=m(M(e));return` ·${e?` (${x})`:""} ${t}`}export function isOpus1mMergeEnabled(){return!i()&&!r()&&"firstParty"===O()&&(!n()||null!==t())}export function renderModelSetting(e){return"opusplan"===e?"Plan Opus":P(e)?E(e):renderModelName(e)}export function getPublicModelDisplayName(e){switch(e){case c().opus48:return"Opus 4.8";case c().opus48+"[1m]":return"Opus 4.8 (1M context)";case c().opus47:return"Opus 4.7";case c().opus47+"[1m]":return"Opus 4.7 (1M context)";case c().opus46:return"Opus 4.6";case c().opus46+"[1m]":return"Opus 4.6 (1M context)";case c().opus45:return"Opus 4.5";case c().opus41:return"Opus 4.1";case c().opus40:return"Opus 4";case c().sonnet46+"[1m]":return"Sonnet 4.6 (1M context)";case c().sonnet46:return"Sonnet 4.6";case c().sonnet45+"[1m]":return"Sonnet 4.5 (1M context)";case c().sonnet45:return"Sonnet 4.5";case c().sonnet40:return"Sonnet 4";case c().sonnet40+"[1m]":return"Sonnet 4 (1M context)";case c().sonnet37:return"Sonnet 3.7";case c().sonnet35:return"Sonnet 3.5";case c().haiku45:return"Haiku 4.5";case c().haiku35:return"Haiku 3.5";default:return null}}export function renderModelName(e){const t=getPublicModelDisplayName(e);if(t)return t;if("ant"===process.env.USER_TYPE){const t=parseUserSpecifiedModel(e),n=p(e);if(n){const e=function(e){const[t="",...n]=e.split("-");return[t.slice(0,3)+"*".repeat(Math.max(0,t.length-3)),...n].join("-")}(n.model.replace(/\[1m\]$/i,""));return e+(s(t)?"[1m]":"")}return t!==e?`${e} (${t})`:t}return e}export function getPublicModelName(e){const t=getPublicModelDisplayName(e);return t||e}export function parseUserSpecifiedModel(e){const t=getDefaultMainLoopModelSetting(),n=("string"==typeof e&&e.trim().length>0?e:"string"==typeof t&&t.trim().length>0?t:getDefaultOpenAIModel()).trim(),o=n.toLowerCase(),r=s(o),u=r?o.replace(/\[1m]$/i,"").trim():o;if(isOpenAIProvider()&&P(u))return"best"===u?getBestModel():r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n;if(P(u))switch(u){case"best":return getBestModel();case"opusplan":case"sonnet":return getDefaultSonnetModel()+(r?"[1m]":"");case"haiku":return getDefaultHaikuModel()+(r?"[1m]":"");case"opus":return getDefaultOpusModel()+(r?"[1m]":"")}if("firstParty"===O()&&(i=u,A.includes(i))&&isLegacyModelRemapEnabled())return getDefaultOpusModel()+(r?"[1m]":"");var i;if("ant"===process.env.USER_TYPE){const e=s(o),t=o.replace(/\[1m]$/i,"").trim(),n=p(t);if(n){const t=e?"[1m]":"";return n.model+t}}return r?n.replace(/\[1m\]$/i,"").trim()+"[1m]":n}export function resolveSkillModelOverride(e,t){return s(e)||!s(t)?e:l(parseUserSpecifiedModel(e))?e+"[1m]":e}const A=["claude-opus-4-20250514","claude-opus-4-1-20250805","claude-opus-4-0","claude-opus-4-1"];export function isLegacyModelRemapEnabled(){return!a(process.env.CONTEXT_CODE_DISABLE_LEGACY_MODEL_REMAP)&&!a(process.env.CLAUDE_CODE_DISABLE_LEGACY_MODEL_REMAP)}export function modelDisplayString(e){if(null===e)return"ant"===process.env.USER_TYPE?`Predeterminado para Ants (${renderDefaultModelSetting(getDefaultMainLoopModelSetting())})`:n()?`Predeterminado (${getClaudeAiUserDefaultModelDescription()})`:`Predeterminado (${renderModelName(getDefaultMainLoopModel())})`;const t=parseUserSpecifiedModel(e);return isOpenAIProvider()?e===t?renderModelName(t):`${e} (${renderModelName(t)})`:e===t?t:`${e} (${t})`}export function getMarketingNameForModel(e){if(!e)return;if("foundry"===O())return;const t=e.toLowerCase().includes("[1m]"),n=getCanonicalName(e);return n.includes("claude-fable-5")?t?"Fable 5 (with 1M context)":"Fable 5":n.includes("claude-opus-4-8")?t?"Opus 4.8 (with 1M context)":"Opus 4.8":n.includes("claude-opus-4-7")?t?"Opus 4.7 (with 1M context)":"Opus 4.7":n.includes("claude-opus-4-6")?t?"Opus 4.6 (with 1M context)":"Opus 4.6":n.includes("claude-opus-4-5")?"Opus 4.5":n.includes("claude-opus-4-1")?"Opus 4.1":n.includes("claude-opus-4")?"Opus 4":n.includes("claude-sonnet-4-6")?t?"Sonnet 4.6 (with 1M context)":"Sonnet 4.6":n.includes("claude-sonnet-4-5")?t?"Sonnet 4.5 (with 1M context)":"Sonnet 4.5":n.includes("claude-sonnet-4")?t?"Sonnet 4 (with 1M context)":"Sonnet 4":n.includes("claude-3-7-sonnet")?"3.7 Sonnet":n.includes("claude-3-5-sonnet")?"3.5 Sonnet":n.includes("claude-haiku-4-5")?"Haiku 4.5":n.includes("claude-3-5-haiku")?"3.5 Haiku":n.includes("gpt-5.1-codex-max")?"GPT-5.1 Codex Max":n.includes("gpt-5.1-codex-mini")?"GPT-5.1 Codex mini":n.includes("gpt-5.1-codex")?"GPT-5.1 Codex":n.includes("gpt-5.1")?"GPT-5.1":n.includes("gpt-5-codex")?"GPT-5 Codex":n.includes("gpt-5-chat-latest")?"GPT-5 Chat":n.includes("gpt-5-mini")?"GPT-5 mini":n.includes("gpt-5-nano")?"GPT-5 nano":n.includes("gpt-5-pro")?"GPT-5 Pro":n.includes("gpt-5")?"GPT-5":n.includes("gpt-4o-mini")?"GPT-4o mini":n.includes("gpt-4o")?"GPT-4o":n.includes("codex-mini-latest")?"Codex mini":void 0}export function normalizeModelStringForAPI(e){return e.replace(/\[(1|2)m\]/gi,"")}
@@ -1 +1 @@
1
- import{getInitialMainLoopModel as e}from"../../bootstrap/state.js";import{isClaudeAISubscriber as o,isMaxSubscriber as t,isTeamPremiumSubscriber as i}from"../auth.js";import{getModelStrings as n}from"./modelStrings.js";import{COST_TIER_3_15 as s,COST_HAIKU_35 as r,COST_HAIKU_45 as p,formatModelPricing as a}from"../modelCost.js";import{getSettings_DEPRECATED as l}from"../settings/settings.js";import{checkOpus1mAccess as u,checkSonnet1mAccess as c}from"./check1mAccess.js";import{getAPIProvider as d}from"./providers.js";import{isModelAllowed as O}from"./modelAllowlist.js";import{getCanonicalName as m,getClaudeAiUserDefaultModelDescription as g,getDefaultOpenAIModel as f,getDefaultOpenAIFastModel as M,getDefaultGeminiModel as h,getDefaultGeminiFastModel as v,getDefaultSonnetModel as x,getDefaultOpusModel as b,getDefaultHaikuModel as _,getDefaultMainLoopModelSetting as F,getMarketingNameForModel as P,getUserSpecifiedModelSetting as w,isOpus1mMergeEnabled as T,getOpus46PricingSuffix as D,isOpenAIProvider as S,isGeminiProvider as N,renderDefaultModelSetting as k}from"./model.js";import{getAntModels as C}from"./antModels.js";import{has1mContext as E}from"../context.js";import{getCustomProviderModels as $,getGlobalConfig as A}from"../config.js";import{resolveProviderProfile as U}from"./providerProfiles.js";export function getDefaultOptionForUser(e=!1){if("ant"===process.env.USER_TYPE){const e=k(F());return{value:null,label:"Default (recommended)",description:`Use the default model for Ants (currently ${e})`,descriptionForModel:`Default model (currently ${e})`}}if(S())return{value:null,label:"Predeterminado (recomendado)",description:`Usa el modelo predeterminado (actualmente ${k(F())})`};if(o())return{value:null,label:"Default (recommended)",description:g(e)};const t="firstParty"!==d();return{value:null,label:"Default (recommended)",description:`Use the default model (currently ${k(F())})${t?"":` · ${a(s)}`}`}}function getSonnet46Option(){const e="firstParty"!==d();return{value:e?n().sonnet46:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"+(e?"":` · ${a(s)}`),descriptionForModel:"Sonnet 4.6 - best for everyday tasks. Generally recommended for most coding tasks"}}function getOpus48Option(e=!1){d();return{value:n().opus48,label:"Opus",description:`Opus 4.8 · Most capable for complex work${D(e)}`,descriptionForModel:"Opus 4.8 - most capable for complex work"}}function getFable5Option(e=!1){return{value:n().fable5,label:"Fable 5",description:`Fable 5 · Newest model${D(e)}`,descriptionForModel:"Fable 5 - newest Anthropic model"}}export function getOpus48_1MOption(e=!1){d();return{value:n().opus48+"[1m]",label:"Opus 4.8 (1M context)",description:`Opus 4.8 for long sessions${D(e)}`,descriptionForModel:"Opus 4.8 with 1M context window - for long sessions with large codebases"}}function getOpus47Option(e=!1){d();return{value:n().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${D(e)}`,descriptionForModel:"Opus 4.7 - most capable for complex work"}}function getOpus46Option(e=!1){return{value:"firstParty"!==d()?n().opus46:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${D(e)}`,descriptionForModel:"Opus 4.6 - previous generation"}}export function getSonnet46_1MOption(){const e="firstParty"!==d();return{value:e?n().sonnet46+"[1m]":"sonnet[1m]",label:"Sonnet (1M context)",description:"Sonnet 4.6 for long sessions"+(e?"":` · ${a(s)}`),descriptionForModel:"Sonnet 4.6 with 1M context window - for long sessions with large codebases"}}export function getOpus47_1MOption(e=!1){d();return{value:n().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 for long sessions${D(e)}`,descriptionForModel:"Opus 4.7 with 1M context window - for long sessions with large codebases"}}export function getOpus46_1MOption(e=!1){return{value:"firstParty"!==d()?n().opus46+"[1m]":"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 for long sessions${D(e)}`,descriptionForModel:"Opus 4.6 with 1M context window - for long sessions with large codebases"}}function getHaiku45Option(){return{value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"+("firstParty"!==d()?"":` · ${a(p)}`),descriptionForModel:"Haiku 4.5 - fastest for quick answers. Lower cost but less capable than Sonnet 4.6."}}function getHaikuOption(){return _()===n().haiku45?getHaiku45Option():{value:"haiku",label:"Haiku",description:"Haiku 3.5 for simple tasks"+("firstParty"!==d()?"":` · ${a(r)}`),descriptionForModel:"Haiku 3.5 - faster and lower cost, but less capable than Sonnet. Use for simple tasks."}}function getMaxOpus48Option(e=!1){return{value:n().opus48,label:"Opus",description:`Opus 4.8 · Most capable for complex work${e?D(!0):""}`}}function getMaxFable5Option(e=!1){return{value:n().fable5,label:"Fable 5",description:`Fable 5 · Newest model${e?D(!0):""}`}}export function getMaxOpus48_1MOption(e=!1){const t=o()?" · Billed as extra usage":"";return{value:n().opus48+"[1m]",label:"Opus 4.8 (1M context)",description:`Opus 4.8 with 1M context${t}${D(e)}`}}function getMaxOpus47Option(e=!1){return{value:n().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${e?D(!0):""}`}}function getMaxOpusOption(e=!1){return{value:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${e?D(!0):""}`}}export function getMaxSonnet46_1MOption(){const e="firstParty"!==d();return{value:"sonnet[1m]",label:"Sonnet (1M context)",description:`Sonnet 4.6 with 1M context${o()?" · Billed as extra usage":""}${e?"":` · ${a(s)}`}`}}export function getMaxOpus47_1MOption(e=!1){const t=o()?" · Billed as extra usage":"";return{value:n().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 with 1M context${t}${D(e)}`}}export function getMaxOpus46_1MOption(e=!1){return{value:"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 with 1M context${o()?" · Billed as extra usage":""}${D(e)}`}}function getMergedOpus1MOption(e=!1){const o="firstParty"!==d();return{value:n().opus48+"[1m]",label:"Opus (1M context)",description:`Opus 4.8 with 1M context · Most capable for complex work${!o&&e?D(e):""}`,descriptionForModel:"Opus 4.8 with 1M context - most capable for complex work"}}const y={value:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"},I={value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"};function getModelOptionsBase(e=!1){if("ant"===process.env.USER_TYPE){const o=C().map(e=>({value:e.alias,label:e.label,description:e.description??`[ANT-ONLY] ${e.label} (${e.model})`}));return[getDefaultOptionForUser(),...o,getMergedOpus1MOption(e),getSonnet46Option(),getSonnet46_1MOption(),getHaiku45Option()]}if("openai"===d())return[getDefaultOptionForUser(e),{value:"gpt-5.5",label:"GPT-5.5",description:"gpt-5.5 - Modelo flagship para razonamiento, coding y agentes",descriptionForModel:"gpt-5.5 - flagship model for complex reasoning, coding, and agentic work"},{value:"gpt-5.5-pro",label:"GPT-5.5 Pro",description:"gpt-5.5-pro - Mayor precision para tareas dificiles",descriptionForModel:"gpt-5.5-pro - higher-accuracy model for harder tasks"},{value:"gpt-5.4",label:"GPT-5.4",description:"gpt-5.4 - Modelo principal recomendado",descriptionForModel:"gpt-5.4 - recommended flagship model"},{value:"gpt-5.2-codex",label:"GPT-5.2-Codex",description:"gpt-5.2-codex - Codex moderno para programacion",descriptionForModel:"gpt-5.2-codex - modern Codex model"},{value:"gpt-5.1-codex-max",label:"GPT-5.1-Codex-Max",description:"gpt-5.1-codex-max - Codex de maxima capacidad",descriptionForModel:"gpt-5.1-codex-max - highest-capacity Codex model"},{value:"gpt-5.4-mini",label:"GPT-5.4-Mini",description:"gpt-5.4-mini - Variante ligera y rapida",descriptionForModel:"gpt-5.4-mini - fast lightweight model"},{value:"gpt-5.3-codex",label:"GPT-5.3-Codex",description:"gpt-5.3-codex - Codex frontier anterior",descriptionForModel:"gpt-5.3-codex - previous frontier Codex model"},{value:"gpt-5.2",label:"GPT-5.2",description:"gpt-5.2 - Modelo general estable",descriptionForModel:"gpt-5.2 - stable general-purpose model"},{value:"gpt-5.1-codex-mini",label:"GPT-5.1-Codex-Mini",description:"gpt-5.1-codex-mini - Codex mini de compatibilidad",descriptionForModel:"gpt-5.1-codex-mini - compatibility Codex mini model"}];if("openrouter"===d())return[getDefaultOptionForUser(e)];if(N())return[getDefaultOptionForUser(e),{value:h(),label:"Gemini 3.5 Pro",description:"gemini-3.5-pro - Modelo Gemini principal para razonamiento, codigo y agentes",descriptionForModel:"gemini-3.5-pro - flagship Gemini model"},{value:v(),label:"Gemini 3.5 Flash",description:"gemini-3.5-flash - Variante Gemini rapida para tareas multimodales y de codigo",descriptionForModel:"gemini-3.5-flash - fast Gemini model"},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"gemini-3.5-flash-lite - Variante de bajo costo y baja latencia",descriptionForModel:"gemini-3.5-flash-lite - fast low-cost Gemini model"},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"gemini-3.1-pro-preview - Version anterior de Pro",descriptionForModel:"gemini-3.1-pro-preview - previous Pro preview model"},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"gemini-3-flash-preview - Version anterior de Flash",descriptionForModel:"gemini-3-flash-preview - previous Flash preview model"},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"gemini-2.5-pro - Modelo estable para razonamiento y codigo",descriptionForModel:"gemini-2.5-pro - stable Gemini model"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"gemini-2.5-flash - Modelo estable rapido",descriptionForModel:"gemini-2.5-flash - stable fast Gemini model"}];if("custom-openai"===d()||"custom-anthropic"===d()){const o=d(),t=U(o)?.id??null,i=$(o,t),n="custom-openai"===o?"OpenAI personalizado":"Anthropic personalizado",s=i.map(e=>({value:e,label:e,description:`Modelo del endpoint ${n}`}));return[getDefaultOptionForUser(e),...s]}if("ollama"===d()||"ollama-cloud"===d()||"zai"===d()||"minimax"===d()||"deepseek"===d())return[getDefaultOptionForUser(e)];if(o()){if(t()||i()){const o=[getDefaultOptionForUser(e)];return o.push(getMaxFable5Option(e)),o.push(getMaxOpus48Option(e)),!T()&&u()&&o.push(getMaxOpus48_1MOption(e)),o.push(getMaxOpus47Option(e)),!T()&&u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),!T()&&u()&&o.push(getMaxOpus46_1MOption(e)),o.push(y),c()&&o.push(getMaxSonnet46_1MOption()),o.push(I),o}const o=[getDefaultOptionForUser(e)];return o.push(getMaxFable5Option(e)),o.push(y),c()&&o.push(getMaxSonnet46_1MOption()),o.push(getMaxOpus48Option(e)),u()&&o.push(getMaxOpus48_1MOption(e)),o.push(getMaxOpus47Option(e)),u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),u()&&o.push(getMaxOpus46_1MOption(e)),o.push(I),o}if("firstParty"===d()){const o=[getDefaultOptionForUser(e)];return o.push(getFable5Option(e)),o.push(getSonnet46Option()),c()&&o.push(getSonnet46_1MOption()),o.push(getOpus48Option(e)),u()&&o.push(getOpus48_1MOption(e)),o.push(getOpus47Option(e)),u()&&o.push(getOpus47_1MOption(e)),o.push(getOpus46Option(e)),u()&&o.push(getOpus46_1MOption(e)),o.push(getHaiku45Option()),o}const n=[getDefaultOptionForUser(e)],s=function(){const e="firstParty"!==d(),o=process.env.ANTHROPIC_DEFAULT_SONNET_MODEL;if(e&&o){const e=E(o);return{value:"sonnet",label:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==s?n.push(s):(n.push(getSonnet46Option()),c()&&n.push(getSonnet46_1MOption()));const r=function(){const e="firstParty"!==d(),o=process.env.ANTHROPIC_DEFAULT_OPUS_MODEL;if(e&&o){const e=E(o);return{value:"opus",label:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==r?n.push(r):(n.push(getFable5Option(e)),n.push(getOpus48Option(e)),u()&&n.push(getOpus48_1MOption(e)),n.push(getOpus47Option(e)),u()&&n.push(getOpus47_1MOption(e)),n.push(getOpus46Option(e)),u()&&n.push(getOpus46_1MOption(e)),n.push({value:"opus",label:"Opus 4.1",description:"Opus 4.1 · Legacy",descriptionForModel:"Opus 4.1 - legacy version"}));const p=function(){const e="firstParty"!==d(),o=process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL;if(e&&o)return{value:"haiku",label:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model",descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model"} (${o})`}}();return void 0!==p?n.push(p):n.push(getHaikuOption()),n}function getKnownModelOption(e){const o=P(e);if(!o)return null;const t=function(e){const o=m(e);if(o.includes("claude-sonnet-4-6")||o.includes("claude-sonnet-4-5")||o.includes("claude-sonnet-4-")||o.includes("claude-3-7-sonnet")||o.includes("claude-3-5-sonnet")){const e=P(x());if(e)return{alias:"Sonnet",currentVersionName:e}}if(o.includes("claude-opus-4")){const e=P(b());if(e)return{alias:"Opus",currentVersionName:e}}if(o.includes("claude-haiku")||o.includes("claude-3-5-haiku")){const e=P(_());if(e)return{alias:"Haiku",currentVersionName:e}}return null}(e);return t&&o!==t.currentVersionName?{value:e,label:o,description:`Newer version available · select ${t.alias} for ${t.currentVersionName}`}:{value:e,label:o,description:e}}export function getModelOptions(o=!1){const t=getModelOptionsBase(o),i=process.env.ANTHROPIC_CUSTOM_MODEL_OPTION;i&&!t.some(e=>e.value===i)&&t.push({value:i,label:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME??i,description:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION??`Modelo personalizado (${i})`});const n=d();if("firstParty"===n)for(const e of A().additionalModelOptionsCache??[])t.some(o=>o.value===e.value)||t.push(e);let s=null;const r=w(),p=e();null!=r?s=r:null!==p&&(s=p);const a=function(e){if(!(l()||{}).availableModels)return e;return e.filter(e=>null===e.value||null!==e.value&&O(e.value))}((()=>{if(null===s||t.some(e=>e.value===s))return t;if("opusplan"===s)return[...t,{value:"opusplan",label:"Opus Plan Mode",description:"Use Opus 4.8 in plan mode, Sonnet 4.6 otherwise"}];if("opus"===s&&"firstParty"===d())return[...t,getMaxOpusOption(o)];if("opus[1m]"===s&&"firstParty"===d())return[...t,getMergedOpus1MOption(o)];{const e=getKnownModelOption(s);return e?t.push(e):t.push({value:s,label:s,description:"Modelo personalizado"}),t}})());return"firstParty"!==n&&"custom-anthropic"!==n?a.filter(e=>!function(e){if(!e)return!1;const o=e.toLowerCase();return o.startsWith("claude")||o.startsWith("sonnet")||o.startsWith("opus")||o.startsWith("haiku")||"opusplan"===o}(e.value)):a}
1
+ import{getInitialMainLoopModel as e}from"../../bootstrap/state.js";import{isClaudeAISubscriber as o,isMaxSubscriber as t,isTeamPremiumSubscriber as n}from"../auth.js";import{getModelStrings as s}from"./modelStrings.js";import{COST_TIER_3_15 as i,COST_HAIKU_35 as r,COST_HAIKU_45 as p,formatModelPricing as a}from"../modelCost.js";import{getSettings_DEPRECATED as l}from"../settings/settings.js";import{checkOpus1mAccess as u,checkSonnet1mAccess as c}from"./check1mAccess.js";import{getAPIProvider as d}from"./providers.js";import{isModelAllowed as O}from"./modelAllowlist.js";import{getCanonicalName as m,getClaudeAiUserDefaultModelDescription as f,getDefaultOpenAIModel as M,getDefaultOpenAIFastModel as g,getDefaultGeminiModel as h,getDefaultGeminiFastModel as v,getDefaultSonnetModel as x,getDefaultOpusModel as b,getDefaultHaikuModel as _,getDefaultMainLoopModelSetting as F,getMarketingNameForModel as P,getUserSpecifiedModelSetting as w,isOpus1mMergeEnabled as T,getOpus46PricingSuffix as D,isOpenAIProvider as S,isGeminiProvider as N,renderDefaultModelSetting as E}from"./model.js";import{getAntModels as k}from"./antModels.js";import{has1mContext as $}from"../context.js";import{getCustomProviderModels as A,getGlobalConfig as U}from"../config.js";import{resolveProviderProfile as C}from"./providerProfiles.js";export function getDefaultOptionForUser(e=!1){if("ant"===process.env.USER_TYPE){const e=E(F());return{value:null,label:"Default (recommended)",description:`Use the default model for Ants (currently ${e})`,descriptionForModel:`Default model (currently ${e})`}}if(S())return{value:null,label:"Predeterminado (recomendado)",description:`Usa el modelo predeterminado (actualmente ${E(F())})`};if(o())return{value:null,label:"Default (recommended)",description:f(e)};const t="firstParty"!==d();return{value:null,label:"Default (recommended)",description:`Use the default model (currently ${E(F())})${t?"":` · ${a(i)}`}`}}function getSonnet46Option(){const e="firstParty"!==d();return{value:e?s().sonnet46:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"+(e?"":` · ${a(i)}`),descriptionForModel:"Sonnet 4.6 - best for everyday tasks. Generally recommended for most coding tasks"}}function getOpus48Option(e=!1){d();return{value:s().opus48,label:"Opus",description:`Opus 4.8 · Most capable for complex work${D(e)}`,descriptionForModel:"Opus 4.8 - most capable for complex work"}}function getFable5Option(e=!1){return{value:s().fable5,label:"Fable 5",description:`Fable 5 · Newest model${D(e)}`,descriptionForModel:"Fable 5 - newest Anthropic model"}}export function getOpus48_1MOption(e=!1){d();return{value:s().opus48+"[1m]",label:"Opus 4.8 (1M context)",description:`Opus 4.8 for long sessions${D(e)}`,descriptionForModel:"Opus 4.8 with 1M context window - for long sessions with large codebases"}}function getOpus47Option(e=!1){d();return{value:s().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${D(e)}`,descriptionForModel:"Opus 4.7 - most capable for complex work"}}function getOpus46Option(e=!1){return{value:"firstParty"!==d()?s().opus46:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${D(e)}`,descriptionForModel:"Opus 4.6 - previous generation"}}export function getSonnet46_1MOption(){const e="firstParty"!==d();return{value:e?s().sonnet46+"[1m]":"sonnet[1m]",label:"Sonnet (1M context)",description:"Sonnet 4.6 for long sessions"+(e?"":` · ${a(i)}`),descriptionForModel:"Sonnet 4.6 with 1M context window - for long sessions with large codebases"}}export function getOpus47_1MOption(e=!1){d();return{value:s().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 for long sessions${D(e)}`,descriptionForModel:"Opus 4.7 with 1M context window - for long sessions with large codebases"}}export function getOpus46_1MOption(e=!1){return{value:"firstParty"!==d()?s().opus46+"[1m]":"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 for long sessions${D(e)}`,descriptionForModel:"Opus 4.6 with 1M context window - for long sessions with large codebases"}}function getHaiku45Option(){return{value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"+("firstParty"!==d()?"":` · ${a(p)}`),descriptionForModel:"Haiku 4.5 - fastest for quick answers. Lower cost but less capable than Sonnet 4.6."}}function getHaikuOption(){return _()===s().haiku45?getHaiku45Option():{value:"haiku",label:"Haiku",description:"Haiku 3.5 for simple tasks"+("firstParty"!==d()?"":` · ${a(r)}`),descriptionForModel:"Haiku 3.5 - faster and lower cost, but less capable than Sonnet. Use for simple tasks."}}function getMaxOpus48Option(e=!1){return{value:s().opus48,label:"Opus",description:`Opus 4.8 · Most capable for complex work${e?D(!0):""}`}}function getMaxFable5Option(e=!1){return{value:s().fable5,label:"Fable 5",description:`Fable 5 · Newest model${e?D(!0):""}`}}export function getMaxOpus48_1MOption(e=!1){const t=o()?" · Billed as extra usage":"";return{value:s().opus48+"[1m]",label:"Opus 4.8 (1M context)",description:`Opus 4.8 with 1M context${t}${D(e)}`}}function getMaxOpus47Option(e=!1){return{value:s().opus47,label:"Opus",description:`Opus 4.7 · Most capable for complex work${e?D(!0):""}`}}function getMaxOpusOption(e=!1){return{value:"opus",label:"Opus 4.6",description:`Opus 4.6 · Previous generation${e?D(!0):""}`}}export function getMaxSonnet46_1MOption(){const e="firstParty"!==d();return{value:"sonnet[1m]",label:"Sonnet (1M context)",description:`Sonnet 4.6 with 1M context${o()?" · Billed as extra usage":""}${e?"":` · ${a(i)}`}`}}export function getMaxOpus47_1MOption(e=!1){const t=o()?" · Billed as extra usage":"";return{value:s().opus47+"[1m]",label:"Opus 4.7 (1M context)",description:`Opus 4.7 with 1M context${t}${D(e)}`}}export function getMaxOpus46_1MOption(e=!1){return{value:"opus[1m]",label:"Opus 4.6 (1M context)",description:`Opus 4.6 with 1M context${o()?" · Billed as extra usage":""}${D(e)}`}}function getMergedOpus1MOption(e=!1){const o="firstParty"!==d();return{value:s().opus48+"[1m]",label:"Opus (1M context)",description:`Opus 4.8 with 1M context · Most capable for complex work${!o&&e?D(e):""}`,descriptionForModel:"Opus 4.8 with 1M context - most capable for complex work"}}const I={value:"sonnet",label:"Sonnet",description:"Sonnet 4.6 · Best for everyday tasks"},H={value:"haiku",label:"Haiku",description:"Haiku 4.5 · Fastest for quick answers"};function getModelOptionsBase(e=!1){if("ant"===process.env.USER_TYPE){const o=k().map(e=>({value:e.alias,label:e.label,description:e.description??`[ANT-ONLY] ${e.label} (${e.model})`}));return[getDefaultOptionForUser(),...o,getMergedOpus1MOption(e),getSonnet46Option(),getSonnet46_1MOption(),getHaiku45Option()]}if("openai"===d())return[getDefaultOptionForUser(e),{value:"gpt-5.1",label:"GPT-5.1",description:"gpt-5.1 · Modelo general de alta capacidad",descriptionForModel:"gpt-5.1 - high-capability general model"},{value:"gpt-5.1-codex",label:"GPT-5.1 Codex",description:"gpt-5.1-codex · Versión anterior de Codex",descriptionForModel:"gpt-5.1-codex - previous Codex generation"},{value:"gpt-5.1-codex-max",label:"GPT-5.1 Codex Max",description:"gpt-5.1-codex-max · Codex de máxima capacidad",descriptionForModel:"gpt-5.1-codex-max - max capacity Codex"}];if("openrouter"===d())return[getDefaultOptionForUser(e)];if(N())return[getDefaultOptionForUser(e),{value:h(),label:"Gemini 3.5 Pro",description:"gemini-3.5-pro - Modelo Gemini principal para razonamiento, codigo y agentes",descriptionForModel:"gemini-3.5-pro - flagship Gemini model"},{value:v(),label:"Gemini 3.5 Flash",description:"gemini-3.5-flash - Variante Gemini rapida para tareas multimodales y de codigo",descriptionForModel:"gemini-3.5-flash - fast Gemini model"},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"gemini-3.5-flash-lite - Variante de bajo costo y baja latencia",descriptionForModel:"gemini-3.5-flash-lite - fast low-cost Gemini model"},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"gemini-3.1-pro-preview - Version anterior de Pro",descriptionForModel:"gemini-3.1-pro-preview - previous Pro preview model"},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"gemini-3-flash-preview - Version anterior de Flash",descriptionForModel:"gemini-3-flash-preview - previous Flash preview model"},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"gemini-2.5-pro - Modelo estable para razonamiento y codigo",descriptionForModel:"gemini-2.5-pro - stable Gemini model"},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"gemini-2.5-flash - Modelo estable rapido",descriptionForModel:"gemini-2.5-flash - stable fast Gemini model"}];if("custom-openai"===d()||"custom-anthropic"===d()){const o=d(),t=C(o)?.id??null,n=A(o,t),s="custom-openai"===o?"OpenAI personalizado":"Anthropic personalizado",i=n.map(e=>({value:e,label:e,description:`Modelo del endpoint ${s}`}));return[getDefaultOptionForUser(e),...i]}if("ollama"===d()||"ollama-cloud"===d()||"zai"===d()||"minimax"===d()||"deepseek"===d()||"copilot"===d())return[getDefaultOptionForUser(e)];if(o()){if(t()||n()){const o=[getDefaultOptionForUser(e)];return o.push(getMaxFable5Option(e)),o.push(getMaxOpus48Option(e)),!T()&&u()&&o.push(getMaxOpus48_1MOption(e)),o.push(getMaxOpus47Option(e)),!T()&&u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),!T()&&u()&&o.push(getMaxOpus46_1MOption(e)),o.push(I),c()&&o.push(getMaxSonnet46_1MOption()),o.push(H),o}const o=[getDefaultOptionForUser(e)];return o.push(getMaxFable5Option(e)),o.push(I),c()&&o.push(getMaxSonnet46_1MOption()),o.push(getMaxOpus48Option(e)),u()&&o.push(getMaxOpus48_1MOption(e)),o.push(getMaxOpus47Option(e)),u()&&o.push(getMaxOpus47_1MOption(e)),o.push(getMaxOpusOption(e)),u()&&o.push(getMaxOpus46_1MOption(e)),o.push(H),o}if("firstParty"===d()){const o=[getDefaultOptionForUser(e)];return o.push(getFable5Option(e)),o.push(getSonnet46Option()),c()&&o.push(getSonnet46_1MOption()),o.push(getOpus48Option(e)),u()&&o.push(getOpus48_1MOption(e)),o.push(getOpus47Option(e)),u()&&o.push(getOpus47_1MOption(e)),o.push(getOpus46Option(e)),u()&&o.push(getOpus46_1MOption(e)),o.push(getHaiku45Option()),o}const s=[getDefaultOptionForUser(e)],i=function(){const e="firstParty"!==d(),o=process.env.ANTHROPIC_DEFAULT_SONNET_MODEL;if(e&&o){const e=$(o);return{value:"sonnet",label:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_SONNET_MODEL_DESCRIPTION??"Custom Sonnet model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==i?s.push(i):(s.push(getSonnet46Option()),c()&&s.push(getSonnet46_1MOption()));const r=function(){const e="firstParty"!==d(),o=process.env.ANTHROPIC_DEFAULT_OPUS_MODEL;if(e&&o){const e=$(o);return{value:"opus",label:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" (1M context)":""),descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_OPUS_MODEL_DESCRIPTION??"Custom Opus model"+(e?" with 1M context":"")} (${o})`}}}();void 0!==r?s.push(r):(s.push(getFable5Option(e)),s.push(getOpus48Option(e)),u()&&s.push(getOpus48_1MOption(e)),s.push(getOpus47Option(e)),u()&&s.push(getOpus47_1MOption(e)),s.push(getOpus46Option(e)),u()&&s.push(getOpus46_1MOption(e)),s.push({value:"opus",label:"Opus 4.1",description:"Opus 4.1 · Legacy",descriptionForModel:"Opus 4.1 - legacy version"}));const p=function(){const e="firstParty"!==d(),o=process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL;if(e&&o)return{value:"haiku",label:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_NAME??o,description:process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model",descriptionForModel:`${process.env.ANTHROPIC_DEFAULT_HAIKU_MODEL_DESCRIPTION??"Custom Haiku model"} (${o})`}}();return void 0!==p?s.push(p):s.push(getHaikuOption()),s}function getKnownModelOption(e){const o=P(e);if(!o)return null;const t=function(e){const o=m(e);if(o.includes("claude-sonnet-4-6")||o.includes("claude-sonnet-4-5")||o.includes("claude-sonnet-4-")||o.includes("claude-3-7-sonnet")||o.includes("claude-3-5-sonnet")){const e=P(x());if(e)return{alias:"Sonnet",currentVersionName:e}}if(o.includes("claude-opus-4")){const e=P(b());if(e)return{alias:"Opus",currentVersionName:e}}if(o.includes("claude-haiku")||o.includes("claude-3-5-haiku")){const e=P(_());if(e)return{alias:"Haiku",currentVersionName:e}}return null}(e);return t&&o!==t.currentVersionName?{value:e,label:o,description:`Newer version available · select ${t.alias} for ${t.currentVersionName}`}:{value:e,label:o,description:e}}export function getModelOptions(o=!1){const t=getModelOptionsBase(o),n=process.env.ANTHROPIC_CUSTOM_MODEL_OPTION;n&&!t.some(e=>e.value===n)&&t.push({value:n,label:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_NAME??n,description:process.env.ANTHROPIC_CUSTOM_MODEL_OPTION_DESCRIPTION??`Modelo personalizado (${n})`});const s=d();if("firstParty"===s)for(const e of U().additionalModelOptionsCache??[])t.some(o=>o.value===e.value)||t.push(e);let i=null;const r=w(),p=e();null!=r?i=r:null!==p&&(i=p);const a=function(e){if(!(l()||{}).availableModels)return e;return e.filter(e=>null===e.value||null!==e.value&&O(e.value))}((()=>{if(null===i||t.some(e=>e.value===i))return t;if("opusplan"===i)return[...t,{value:"opusplan",label:"Opus Plan Mode",description:"Use Opus 4.8 in plan mode, Sonnet 4.6 otherwise"}];if("opus"===i&&"firstParty"===d())return[...t,getMaxOpusOption(o)];if("opus[1m]"===i&&"firstParty"===d())return[...t,getMergedOpus1MOption(o)];{const e=getKnownModelOption(i);return e?t.push(e):t.push({value:i,label:i,description:"Modelo personalizado"}),t}})());return"firstParty"!==s&&"custom-anthropic"!==s?a.filter(e=>!function(e){if(!e)return!1;const o=e.toLowerCase();return o.startsWith("claude")||o.startsWith("sonnet")||o.startsWith("opus")||o.startsWith("haiku")||"opusplan"===o}(e.value)):a}
@@ -1 +1 @@
1
- export const VISIBLE_PROVIDERS=[{id:"minimax",label:"MiniMax",description:"API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de MiniMax.",nextStep:"Despues, elige un modelo MiniMax compatible con Anthropic desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"openrouter",label:"OpenRouter",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenRouter.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"ollama",label:"Ollama",description:"Servidor Ollama compatible. Incluye modelos locales y modelos cloud si hiciste ollama signin.",setup:{kind:"local-server",intro:"Esto solo configura el servidor Ollama; no abre un login OAuth.",nextStep:"Asegurate de tener ollama serve activo. Si usas cloud, ejecuta ollama signin fuera del CLI.",actionLabel:"Continuar con Ollama"},implemented:!0},{id:"ollama-cloud",label:"Ollama Cloud",description:"Modelos cloud desde tu servidor Ollama autenticado con ollama signin.",setup:{kind:"local-server",intro:"Esto usa tu servidor Ollama ya autenticado; no abre un login OAuth.",nextStep:"Ejecuta ollama signin fuera del CLI, usa http://localhost:11434/v1 y despues elige un modelo cloud desde /model.",actionLabel:"Continuar con Ollama Cloud"},implemented:!0},{id:"lmstudio",label:"LM Studio",description:"Servidor local OpenAI-compatible de LM Studio. No requiere API key.",setup:{kind:"local-server",intro:"Esto solo apunta al servidor local de LM Studio; no abre un login OAuth.",nextStep:"Abre LM Studio, ve a la pestaña Developer y pulsa Start Server (puerto 1234 por defecto). Carga un modelo en la pestana Chat y elige su identificador exacto desde /model.",actionLabel:"Continuar con LM Studio"},implemented:!0},{id:"openai",label:"OpenAI / Codex",description:"OAuth de OpenAI",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de OpenAI / Codex.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con OpenAI"},implemented:!0},{id:"gemini-google",label:"Gemini Google OAuth",description:"Cuenta Google mediante OAuth compatible con Gemini CLI.",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Google usando el flujo OAuth de Gemini CLI.",nextStep:"Usa /login y elige Gemini Google para abrir el navegador y guardar el token OAuth.",actionLabel:"Continuar con Google"},implemented:!0},{id:"gemini-api",label:"Gemini API",description:"API key de Google AI Studio, usando endpoint OpenAI-compatible.",setup:{kind:"api-key",intro:"Pega tu API key de Gemini / Google AI Studio.",nextStep:"Despues, elige un modelo Gemini desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"zai",label:"Z.AI",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Z.AI.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"nvidia",label:"NVIDIA API",description:"API key propia de NVIDIA NIM / build.nvidia.com. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NVIDIA.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"deepseek",label:"DeepSeek",description:"API key propia de api.deepseek.com (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DeepSeek (sk-...).",nextStep:"Despues, elige un modelo como deepseek-chat o deepseek-reasoner desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"xai",label:"xAI / Grok",description:"API key propia de api.x.ai (OpenAI-compatible). Luego elige un modelo Grok en /model.",setup:{kind:"api-key",intro:"Pega tu API key de xAI (xai-...).",nextStep:"Despues, elige un modelo como grok-4 o grok-code-fast-1 desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"gmi",label:"GMI Cloud",description:"API key de api.gmi-serving.com (OpenAI-compatible, multi-modelo). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de GMI Cloud.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"novita",label:"NovitaAI",description:"API key de novita.ai (OpenAI-compatible, multi-modelo). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NovitaAI.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"stepfun",label:"StepFun",description:"API key de stepfun.ai (OpenAI-compatible). Luego elige un modelo Step en /model.",setup:{kind:"api-key",intro:"Pega tu API key de StepFun.",nextStep:"Despues, elige un modelo como step-3 desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"huggingface",label:"HuggingFace",description:"Token HF en router.huggingface.co (OpenAI-compatible). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu token de HuggingFace (HF_TOKEN, hf_...).",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar token"},implemented:!0},{id:"opencode-zen",label:"OpenCode Zen",description:"API key de opencode.ai/zen (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenCode Zen.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"arcee",label:"Arcee AI",description:"API key de api.arcee.ai (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Arcee AI.",nextStep:"Despues, elige un modelo (p.ej. auto) desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"alibaba",label:"Alibaba (Qwen)",description:"API key de DashScope (compatible-mode OpenAI). Luego elige un modelo Qwen en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DashScope / Alibaba Cloud (DASHSCOPE_API_KEY).",nextStep:"Despues, elige un modelo como qwen3-max desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"kimi",label:"Kimi (Moonshot)",description:"API key de api.moonshot.ai (OpenAI-compatible). Luego elige un modelo Kimi en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Kimi / Moonshot (KIMI_API_KEY).",nextStep:"Despues, elige un modelo como kimi-k2-0905-preview desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"claude",label:"Claude (Anthropic)",description:"Suscripcion Claude o Anthropic Console",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Claude o Anthropic Console.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con Claude"},implemented:!0},{id:"custom-openai",label:"Custom OpenAI",description:"API key y endpoint personalizado para OpenAI-compatible. Ideal para proxies o servidores propios.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom OpenAI"},implemented:!0},{id:"custom-anthropic",label:"Custom Anthropic",description:"API key y endpoint personalizado para Anthropic-compatible. Ideal para instalaciones on-premise.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom Anthropic"},implemented:!0}];export function getVisibleProvider(e){const o=VISIBLE_PROVIDERS.find(o=>o.id===e);if(!o)throw new Error(`Unknown provider: ${e}`);return o}
1
+ export const VISIBLE_PROVIDERS=[{id:"minimax",label:"MiniMax",description:"API key propia. Usa el endpoint Anthropic-compatible y luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de MiniMax.",nextStep:"Despues, elige un modelo MiniMax compatible con Anthropic desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"openrouter",label:"OpenRouter",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenRouter.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"ollama",label:"Ollama",description:"Servidor Ollama compatible. Incluye modelos locales y modelos cloud si hiciste ollama signin.",setup:{kind:"local-server",intro:"Esto solo configura el servidor Ollama; no abre un login OAuth.",nextStep:"Asegurate de tener ollama serve activo. Si usas cloud, ejecuta ollama signin fuera del CLI.",actionLabel:"Continuar con Ollama"},implemented:!0},{id:"ollama-cloud",label:"Ollama Cloud",description:"Modelos cloud desde tu servidor Ollama autenticado con ollama signin.",setup:{kind:"local-server",intro:"Esto usa tu servidor Ollama ya autenticado; no abre un login OAuth.",nextStep:"Ejecuta ollama signin fuera del CLI, usa http://localhost:11434/v1 y despues elige un modelo cloud desde /model.",actionLabel:"Continuar con Ollama Cloud"},implemented:!0},{id:"lmstudio",label:"LM Studio",description:"Servidor local OpenAI-compatible de LM Studio. No requiere API key.",setup:{kind:"local-server",intro:"Esto solo apunta al servidor local de LM Studio; no abre un login OAuth.",nextStep:"Abre LM Studio, ve a la pestaña Developer y pulsa Start Server (puerto 1234 por defecto). Carga un modelo en la pestana Chat y elige su identificador exacto desde /model.",actionLabel:"Continuar con LM Studio"},implemented:!0},{id:"openai",label:"OpenAI / Codex",description:"OAuth de OpenAI",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de OpenAI / Codex.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con OpenAI"},implemented:!0},{id:"gemini-google",label:"Gemini Google OAuth",description:"Cuenta Google mediante OAuth compatible con Gemini CLI.",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Google usando el flujo OAuth de Gemini CLI.",nextStep:"Usa /login y elige Gemini Google para abrir el navegador y guardar el token OAuth.",actionLabel:"Continuar con Google"},implemented:!0},{id:"copilot",label:"GitHub Copilot",description:"Inicia sesion con tu cuenta de GitHub (device-code) y usa tu suscripcion Copilot.",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de GitHub usando el flujo device-code.",nextStep:"Abre github.com/login/device, introduce el codigo que te mostramos y elige un modelo desde /model.",actionLabel:"Continuar con GitHub Copilot"},implemented:!0},{id:"gemini-api",label:"Gemini API",description:"API key de Google AI Studio, usando endpoint OpenAI-compatible.",setup:{kind:"api-key",intro:"Pega tu API key de Gemini / Google AI Studio.",nextStep:"Despues, elige un modelo Gemini desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"zai",label:"Z.AI",description:"API key propia. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Z.AI.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"nvidia",label:"NVIDIA API",description:"API key propia de NVIDIA NIM / build.nvidia.com. Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NVIDIA.",nextStep:"Despues, elige un modelo compatible desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"deepseek",label:"DeepSeek",description:"API key propia de api.deepseek.com (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DeepSeek (sk-...).",nextStep:"Despues, elige un modelo como deepseek-chat o deepseek-reasoner desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"xai",label:"xAI / Grok",description:"API key propia de api.x.ai (OpenAI-compatible). Luego elige un modelo Grok en /model.",setup:{kind:"api-key",intro:"Pega tu API key de xAI (xai-...).",nextStep:"Despues, elige un modelo como grok-4 o grok-code-fast-1 desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"gmi",label:"GMI Cloud",description:"API key de api.gmi-serving.com (OpenAI-compatible, multi-modelo). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de GMI Cloud.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"novita",label:"NovitaAI",description:"API key de novita.ai (OpenAI-compatible, multi-modelo). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de NovitaAI.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"stepfun",label:"StepFun",description:"API key de stepfun.ai (OpenAI-compatible). Luego elige un modelo Step en /model.",setup:{kind:"api-key",intro:"Pega tu API key de StepFun.",nextStep:"Despues, elige un modelo como step-3 desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"huggingface",label:"HuggingFace",description:"Token HF en router.huggingface.co (OpenAI-compatible). Luego elige modelo en /model.",setup:{kind:"api-key",intro:"Pega tu token de HuggingFace (HF_TOKEN, hf_...).",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar token"},implemented:!0},{id:"opencode-zen",label:"OpenCode Zen",description:"API key de opencode.ai/zen (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de OpenCode Zen.",nextStep:"Despues, elige un modelo desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"arcee",label:"Arcee AI",description:"API key de api.arcee.ai (OpenAI-compatible). Luego elige un modelo en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Arcee AI.",nextStep:"Despues, elige un modelo (p.ej. auto) desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"alibaba",label:"Alibaba (Qwen)",description:"API key de DashScope (compatible-mode OpenAI). Luego elige un modelo Qwen en /model.",setup:{kind:"api-key",intro:"Pega tu API key de DashScope / Alibaba Cloud (DASHSCOPE_API_KEY).",nextStep:"Despues, elige un modelo como qwen3-max desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"kimi",label:"Kimi (Moonshot)",description:"API key de api.moonshot.ai (OpenAI-compatible). Luego elige un modelo Kimi en /model.",setup:{kind:"api-key",intro:"Pega tu API key de Kimi / Moonshot (KIMI_API_KEY).",nextStep:"Despues, elige un modelo como kimi-k2-0905-preview desde /model.",actionLabel:"Pegar API key"},implemented:!0},{id:"claude",label:"Claude (Anthropic)",description:"Suscripcion Claude o Anthropic Console",setup:{kind:"oauth",intro:"Inicia sesion con tu cuenta de Claude o Anthropic Console.",nextStep:"Despues de iniciar sesion, elige un modelo desde /model.",actionLabel:"Continuar con Claude"},implemented:!0},{id:"custom-openai",label:"Custom OpenAI",description:"API key y endpoint personalizado para OpenAI-compatible. Ideal para proxies o servidores propios.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom OpenAI"},implemented:!0},{id:"custom-anthropic",label:"Custom Anthropic",description:"API key y endpoint personalizado para Anthropic-compatible. Ideal para instalaciones on-premise.",setup:{kind:"api-key",intro:"Wizard paso a paso: API key, endpoint (opcional), modelo (opcional).",nextStep:"Al finalizar, elige un modelo desde /model.",actionLabel:"Configurar Custom Anthropic"},implemented:!0}];export function getVisibleProvider(e){const o=VISIBLE_PROVIDERS.find(o=>o.id===e);if(!o)throw new Error(`Unknown provider: ${e}`);return o}
@@ -1 +1 @@
1
- import{getGeminiGoogleAuthHeaders as e,getMiniMaxAccessToken as a,getOpenAICompatibleAccessToken as i}from"../auth.js";import{getConfiguredProviderBaseUrl as t}from"./providerBaseUrls.js";import{getResolvedProviderProfileId as o,isProfiledProvider as r}from"./providerProfiles.js";const n={"minimax-m3":"Modelo multimodal de frontera para codigo, con ventana de 1M tokens.","minimax-m2.7":"Modelo de razonamiento general y chat predeterminado.","minimax-m2.7-highspeed":"Version rapida de MiniMax-M2.7.","minimax-m2.5":"Modelo de razonamiento avanzado con alta capacidad.","minimax-m2.5-highspeed":"Version rapida de MiniMax-M2.5.","minimax-m2.1":"Optimizado para programacion y desarrollo.","minimax-m2.1-highspeed":"Version rapida de MiniMax-M2.1.","minimax-m2":"Capacidades agenciales y razonamiento avanzado."},l=[{value:"minimax-m3",label:"MiniMax-M3"},{value:"minimax-m2.7",label:"MiniMax-M2.7"},{value:"minimax-m2.7-highspeed",label:"MiniMax-M2.7-highspeed"},{value:"minimax-m2.5",label:"MiniMax-M2.5"},{value:"minimax-m2.5-highspeed",label:"MiniMax-M2.5-highspeed"},{value:"minimax-m2.1",label:"MiniMax-M2.1"},{value:"minimax-m2.1-highspeed",label:"MiniMax-M2.1-highspeed"},{value:"minimax-m2",label:"MiniMax-M2"}].map(e=>({value:e.value,label:e.label,description:n[e.value]??""})),s=[{value:"deepseek-v4-pro",label:"DeepSeek V4 Pro",description:"Familia V4 pro — razonamiento profundo y código. Contexto 1M tokens."},{value:"deepseek-v4-flash",label:"DeepSeek V4 Flash",description:"Familia V4 flash — alto volumen, baja latencia. Contexto 1M tokens."},{value:"deepseek-chat",label:"deepseek-chat",description:"Alias estable V3 (api.deepseek.com). Contexto 128k tokens."},{value:"deepseek-reasoner",label:"deepseek-reasoner",description:"Alias estable R1/V3 con chain-of-thought. Contexto 128k tokens."}],c=[{value:"gemini-3.5-pro",label:"Gemini 3.5 Pro",description:"Modelo Gemini principal para razonamiento, codigo y agentes."},{value:"gemini-3.5-flash",label:"Gemini 3.5 Flash",description:"Modelo Gemini rapido con capacidades multimodales y de codigo."},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"Variante de bajo costo y baja latencia."},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"Version anterior de Pro."},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"Version anterior de Flash."},{value:"gemini-3.1-flash-lite-preview",label:"Gemini 3.1 Flash-Lite Preview",description:"Version anterior de Flash-Lite."},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"Modelo estable para razonamiento y codigo."},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"Modelo estable rapido para alto volumen."},{value:"gemini-2.5-flash-lite",label:"Gemini 2.5 Flash-Lite",description:"Modelo estable economico y de baja latencia."}],u=[{value:"grok-4",label:"Grok 4",description:"Modelo principal de xAI para razonamiento, codigo y agentes."},{value:"grok-4-fast-reasoning",label:"Grok 4 Fast (reasoning)",description:"Variante rapida de Grok 4 con razonamiento."},{value:"grok-code-fast-1",label:"Grok Code Fast 1",description:"Optimizado para tareas agenticas de codigo de baja latencia."},{value:"grok-3",label:"Grok 3",description:"Generacion anterior, estable para uso general."}],d={gmi:[{value:"deepseek-ai/DeepSeek-V3.2",label:"DeepSeek V3.2",description:"GMI Cloud — DeepSeek V3.2."},{value:"moonshotai/Kimi-K2.5",label:"Kimi K2.5",description:"GMI Cloud — Moonshot Kimi K2.5."},{value:"zai-org/GLM-5.1-FP8",label:"GLM 5.1",description:"GMI Cloud — Zhipu GLM 5.1."},{value:"openai/gpt-5.4",label:"GPT-5.4",description:"GMI Cloud — OpenAI GPT-5.4."}],novita:[{value:"moonshotai/kimi-k2.5",label:"Kimi K2.5",description:"NovitaAI — Moonshot Kimi K2.5."},{value:"zai-org/glm-5",label:"GLM 5",description:"NovitaAI — Zhipu GLM 5."},{value:"deepseek/deepseek-v3-0324",label:"DeepSeek V3 0324",description:"NovitaAI — DeepSeek V3."},{value:"qwen/qwen3-235b-a22b-fp8",label:"Qwen3 235B",description:"NovitaAI — Qwen3 235B."}],stepfun:[{value:"step-3",label:"Step 3",description:"StepFun — modelo flagship Step 3."}],huggingface:[{value:"Qwen/Qwen3.5-72B-Instruct",label:"Qwen3.5 72B",description:"HuggingFace router — Qwen3.5 72B Instruct."},{value:"deepseek-ai/DeepSeek-V3.2",label:"DeepSeek V3.2",description:"HuggingFace router — DeepSeek V3.2."}],arcee:[{value:"auto",label:"Auto (router)",description:"Arcee AI — enrutador automático de modelos."}],alibaba:[{value:"qwen3-max",label:"Qwen3 Max",description:"Alibaba DashScope — Qwen3 Max."},{value:"qwen3-coder-plus",label:"Qwen3 Coder Plus",description:"Alibaba DashScope — Qwen3 Coder Plus."},{value:"qwen-plus",label:"Qwen Plus",description:"Alibaba DashScope — Qwen Plus."}],kimi:[{value:"kimi-k2-0905-preview",label:"Kimi K2 (0905)",description:"Moonshot — Kimi K2 para coding."},{value:"moonshot-v1-128k",label:"Moonshot v1 128k",description:"Moonshot — contexto 128k."}]},p=new Map,m=new Map;function trimTrailingSlash(e){return e.endsWith("/")?e.slice(0,-1):e}function ensureV1Suffix(e){const a=trimTrailingSlash(e);return a.endsWith("/v1")?a:`${a}/v1`}function isLocalOllamaProviderHost(e){try{const a=new URL(e);return"localhost"===a.hostname||"127.0.0.1"===a.hostname}catch{return e.includes("localhost")||e.includes("127.0.0.1")}}function getProviderCacheKey(e){const a=getProviderBaseUrl(e);return`${e}:${(r(e)?o(e):null)??"default"}:${a}`}function getProviderLabel(e){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"minimax":return"MiniMax";case"nvidia":return"NVIDIA NIM";case"deepseek":return"DeepSeek";case"xai":return"xAI";case"gmi":return"GMI Cloud";case"novita":return"NovitaAI";case"stepfun":return"StepFun";case"huggingface":return"HuggingFace";case"opencode-zen":return"OpenCode Zen";case"arcee":return"Arcee AI";case"alibaba":return"Alibaba (Qwen)";case"kimi":return"Kimi (Moonshot)";default:return"OpenAI"}}function getProviderBaseUrl(e){switch(e){case"openrouter":return ensureV1Suffix(process.env.OPENROUTER_BASE_URL||t("openrouter")||"https://openrouter.ai/api/v1");case"ollama":return ensureV1Suffix(process.env.OLLAMA_BASE_URL||t("ollama")||"http://localhost:11434/v1");case"ollama-cloud":return ensureV1Suffix(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||t("ollama-cloud")||"http://localhost:11434/v1");case"zai":return trimTrailingSlash(process.env.ZAI_BASE_URL||t("zai")||"https://api.z.ai/api/coding/paas/v4");case"gemini-api":return trimTrailingSlash(process.env.GEMINI_BASE_URL||process.env.GEMINI_API_BASE_URL||t("gemini-api")||"https://generativelanguage.googleapis.com/v1beta/openai");case"gemini-google":return trimTrailingSlash(process.env.GEMINI_GOOGLE_BASE_URL||process.env.GEMINI_BASE_URL||t("gemini-google")||"https://generativelanguage.googleapis.com/v1beta/openai");case"minimax":return trimTrailingSlash(process.env.MINIMAX_BASE_URL||t("minimax")||"https://api.minimax.io/anthropic");case"nvidia":return ensureV1Suffix(process.env.NVIDIA_BASE_URL||t("nvidia")||"https://integrate.api.nvidia.com/v1");case"deepseek":return ensureV1Suffix(process.env.DEEPSEEK_BASE_URL||t("deepseek")||"https://api.deepseek.com/v1");case"xai":return ensureV1Suffix(process.env.XAI_BASE_URL||t("xai")||"https://api.x.ai/v1");case"gmi":case"novita":case"stepfun":case"huggingface":case"opencode-zen":case"arcee":case"alibaba":case"kimi":return ensureV1Suffix(t(e));case"custom-openai":return ensureV1Suffix(t("custom-openai")||"https://api.openai.com/v1");default:return ensureV1Suffix(process.env.OPENAI_API_BASE_URL||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1")}}async function buildProviderHeaders(a){if("gemini-google"===a)return e();const t={},o=i(a),r=getProviderBaseUrl(a);return"ollama"!==a&&!("ollama-cloud"===a&&isLocalOllamaProviderHost(r))&&o&&(t.Authorization=`Bearer ${o}`),"openrouter"===a&&(t["HTTP-Referer"]="https://context.iaforged.com",t["X-Title"]="Context Code"),t}function formatOpenAICompatibleDescription(e){const a=[];return e.description&&a.push(e.description),e.context_length&&a.push(`Context: ${e.context_length}`),(e.pricing?.prompt||e.pricing?.completion)&&a.push(`Price: ${e.pricing?.prompt??"?"} prompt / ${e.pricing?.completion??"?"} completion`),a.join(" · ")}function mapOpenAICompatibleModels(e,a){return(e.data??[]).map(e=>{const i=e.id?.trim();if(!i)return null;const t="minimax"===a?n[i.toLowerCase()]:void 0;return{value:i,label:e.name?.trim()||i,description:formatOpenAICompatibleDescription(e)||t||""}}).filter(e=>null!==e)}function filterOllamaModels(e,a,i){return"ollama-cloud"===e&&isLocalOllamaProviderHost(i)?a.filter(e=>e.value.toLowerCase().endsWith(":cloud")):a}async function fetchJson(e,a){const i=await fetch(e,{headers:a});if(!i.ok)throw new Error(`Failed to load models from ${e}: ${i.status}`);return i.json()}function cacheProviderHealth(e){return m.set(getProviderCacheKey(e.provider),{expiresAt:Date.now()+3e4,result:e}),e}function buildHealthResult(e,a,i,t={}){return{provider:e,label:getProviderLabel(e),state:a,message:i,baseUrl:t.baseUrl??getProviderBaseUrl(e),statusCode:t.statusCode,checkedAt:Date.now()}}async function fetchWithTimeout(e,a,i=5e3){const t=new AbortController,o=setTimeout(()=>t.abort(),i);try{return await fetch(e,{headers:a,signal:t.signal})}finally{clearTimeout(o)}}export async function checkProviderHealth(e,t={}){if(!t.forceRefresh){const a=function(e){const a=m.get(getProviderCacheKey(e));return a?a.expiresAt<Date.now()?(m.delete(getProviderCacheKey(e)),null):a.result:null}(e);if(a)return a}const o=getProviderBaseUrl(e),r=getProviderLabel(e),n="minimax"===e?{"x-api-key":a()??"",Authorization:`Bearer ${a()??""}`,"Content-Type":"application/json"}:await buildProviderHeaders(e),l="minimax"===e?a():i(e);if(!("ollama"===e||"gemini-google"===e||"ollama-cloud"===e&&isLocalOllamaProviderHost(o)||l))return cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} no tiene credenciales configuradas.`,{baseUrl:o}));try{if("minimax"===e)return cacheProviderHealth(buildHealthResult(e,"healthy",`${r} configurado para Anthropic-compatible (${o}).`,{baseUrl:o}));if("ollama"===e||"ollama-cloud"===e){const a=[`${o.endsWith("/v1")?o.slice(0,-3):o}/api/tags`,`${o}/models`];let i,t="";for(const r of a){const a=await fetchWithTimeout(r,n);if(a.ok)return cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${r}.`,{baseUrl:o,statusCode:a.status}));if(i=a.status,t=`${a.status} ${a.statusText}`.trim(),404!==a.status||!r.endsWith("/api/tags"))break}return cacheProviderHealth(429===i?buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o,statusCode:i}):buildHealthResult(e,"unreachable",t?`${r} no respondió correctamente (${t}).`:`${r} no respondió correctamente.`,{baseUrl:o,statusCode:i}))}const a=`${o}/models`,i=await fetchWithTimeout(a,n);return i.ok?cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${a}.`,{baseUrl:o,statusCode:i.status})):401===i.status||403===i.status?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} rechazó la solicitud. Revisa la API key o token configurado.`,{baseUrl:o,statusCode:i.status})):429===i.status?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o,statusCode:i.status})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${r} respondió con ${i.status} al validar la conexión.`,{baseUrl:o,statusCode:i.status}))}catch(a){const i=function(e){return e instanceof Error?e.message.replace(/\s+/g," ").trim():String(e).replace(/\s+/g," ").trim()}(a);return"ollama"===e&&(i.toLowerCase().includes("econnrefused")||i.toLowerCase().includes("fetch failed")||i.toLowerCase().includes("networkerror")||i.toLowerCase().includes("localhost:11434"))?cacheProviderHealth(buildHealthResult(e,"unreachable","Ollama no es accesible. Inicia el servidor local o revisa OLLAMA_BASE_URL.",{baseUrl:o})):i.includes("401")||i.includes("403")||i.toLowerCase().includes("authentication")?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} no tiene credenciales válidas.`,{baseUrl:o})):i.includes("429")||i.toLowerCase().includes("rate limit")?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${r} no pudo validarse: ${i||"error desconocido"}.`,{baseUrl:o}))}}export function getCachedProviderModels(e){return p.get(getProviderCacheKey(e))??null}export async function fetchProviderModels(e){const i=getProviderCacheKey(e),t=p.get(i);if(t)return t;try{if("minimax"===e)try{const e=a(),t=function(e){return(e.data??[]).map(e=>{const a=e.id?.trim();return a?{value:a,label:e.display_name?.trim()||a,description:n[a.toLowerCase()]??""}:null}).filter(e=>null!==e)}(await fetchJson(`${getProviderBaseUrl("minimax")}/v1/models`,{"X-Api-Key":e??"","Content-Type":"application/json"})),o=new Set(t.map(e=>e.value)),r=t.length>0?[...t,...l.filter(e=>!o.has(e.value))]:l;return p.set(i,r),r}catch{return p.set(i,l),l}let t=[];if("ollama"===e||"ollama-cloud"===e){const a=getProviderBaseUrl(e),i=a.endsWith("/v1")?a.slice(0,-3):a;try{t=filterOllamaModels(e,function(e){return(e.models??[]).map(e=>{const a=e.model?.trim()||e.name?.trim();if(!a)return null;const i=[e.details?.family,e.details?.parameter_size,e.details?.quantization_level].filter(Boolean);return{value:a,label:e.name?.trim()||a,description:i.join(" · ")}}).filter(e=>null!==e)}(await fetchJson(`${i}/api/tags`,await buildProviderHeaders(e))),a)}catch{t=filterOllamaModels(e,mapOpenAICompatibleModels(await fetchJson(`${a}/models`,await buildProviderHeaders(e)),e),a)}}else{t=mapOpenAICompatibleModels(await fetchJson(`${getProviderBaseUrl(e)}/models`,await buildProviderHeaders(e)),e)}if("gemini-api"===e||"gemini-google"===e){const e=new Set(c.map(e=>e.value));t=[...c,...t.filter(a=>!e.has(a.value))]}if("xai"===e){const e=new Set(u.map(e=>e.value));t=[...u,...t.filter(a=>!e.has(a.value))]}if("deepseek"===e){const e=new Set(s.map(e=>e.value));t=[...s,...t.filter(a=>!e.has(a.value))]}const o=d[e];if(o){const e=new Set(o.map(e=>e.value));t=[...o,...t.filter(a=>!e.has(a.value))]}return p.set(i,t),t}catch{if("gemini-api"===e||"gemini-google"===e)return p.set(i,c),c;if("xai"===e)return p.set(i,u),u;if("deepseek"===e)return p.set(i,s),s;const a=d[e];return a?(p.set(i,a),a):[]}}
1
+ import{getGeminiGoogleAuthHeaders as e,getMiniMaxAccessToken as a,getOpenAICompatibleAccessToken as i}from"../auth.js";import{getConfiguredProviderBaseUrl as t}from"./providerBaseUrls.js";import{getResolvedProviderProfileId as o,isProfiledProvider as r}from"./providerProfiles.js";const n={"minimax-m3":"Modelo multimodal de frontera para codigo, con ventana de 1M tokens.","minimax-m2.7":"Modelo de razonamiento general y chat predeterminado.","minimax-m2.7-highspeed":"Version rapida de MiniMax-M2.7.","minimax-m2.5":"Modelo de razonamiento avanzado con alta capacidad.","minimax-m2.5-highspeed":"Version rapida de MiniMax-M2.5.","minimax-m2.1":"Optimizado para programacion y desarrollo.","minimax-m2.1-highspeed":"Version rapida de MiniMax-M2.1.","minimax-m2":"Capacidades agenciales y razonamiento avanzado."},l=[{value:"minimax-m3",label:"MiniMax-M3"},{value:"minimax-m2.7",label:"MiniMax-M2.7"},{value:"minimax-m2.7-highspeed",label:"MiniMax-M2.7-highspeed"},{value:"minimax-m2.5",label:"MiniMax-M2.5"},{value:"minimax-m2.5-highspeed",label:"MiniMax-M2.5-highspeed"},{value:"minimax-m2.1",label:"MiniMax-M2.1"},{value:"minimax-m2.1-highspeed",label:"MiniMax-M2.1-highspeed"},{value:"minimax-m2",label:"MiniMax-M2"}].map(e=>({value:e.value,label:e.label,description:n[e.value]??""})),s=[{value:"deepseek-v4-pro",label:"DeepSeek V4 Pro",description:"Familia V4 pro — razonamiento profundo y código. Contexto 1M tokens."},{value:"deepseek-v4-flash",label:"DeepSeek V4 Flash",description:"Familia V4 flash — alto volumen, baja latencia. Contexto 1M tokens."},{value:"deepseek-chat",label:"deepseek-chat",description:"Alias estable V3 (api.deepseek.com). Contexto 128k tokens."},{value:"deepseek-reasoner",label:"deepseek-reasoner",description:"Alias estable R1/V3 con chain-of-thought. Contexto 128k tokens."}],c=[{value:"gemini-3.5-pro",label:"Gemini 3.5 Pro",description:"Modelo Gemini principal para razonamiento, codigo y agentes."},{value:"gemini-3.5-flash",label:"Gemini 3.5 Flash",description:"Modelo Gemini rapido con capacidades multimodales y de codigo."},{value:"gemini-3.5-flash-lite",label:"Gemini 3.5 Flash-Lite",description:"Variante de bajo costo y baja latencia."},{value:"gemini-3.1-pro-preview",label:"Gemini 3.1 Pro Preview",description:"Version anterior de Pro."},{value:"gemini-3-flash-preview",label:"Gemini 3 Flash Preview",description:"Version anterior de Flash."},{value:"gemini-3.1-flash-lite-preview",label:"Gemini 3.1 Flash-Lite Preview",description:"Version anterior de Flash-Lite."},{value:"gemini-2.5-pro",label:"Gemini 2.5 Pro",description:"Modelo estable para razonamiento y codigo."},{value:"gemini-2.5-flash",label:"Gemini 2.5 Flash",description:"Modelo estable rapido para alto volumen."},{value:"gemini-2.5-flash-lite",label:"Gemini 2.5 Flash-Lite",description:"Modelo estable economico y de baja latencia."}],u=[{value:"grok-4",label:"Grok 4",description:"Modelo principal de xAI para razonamiento, codigo y agentes."},{value:"grok-4-fast-reasoning",label:"Grok 4 Fast (reasoning)",description:"Variante rapida de Grok 4 con razonamiento."},{value:"grok-code-fast-1",label:"Grok Code Fast 1",description:"Optimizado para tareas agenticas de codigo de baja latencia."},{value:"grok-3",label:"Grok 3",description:"Generacion anterior, estable para uso general."}],d={gmi:[{value:"deepseek-ai/DeepSeek-V3.2",label:"DeepSeek V3.2",description:"GMI Cloud — DeepSeek V3.2."},{value:"moonshotai/Kimi-K2.5",label:"Kimi K2.5",description:"GMI Cloud — Moonshot Kimi K2.5."},{value:"zai-org/GLM-5.1-FP8",label:"GLM 5.1",description:"GMI Cloud — Zhipu GLM 5.1."},{value:"openai/gpt-5.4",label:"GPT-5.4",description:"GMI Cloud — OpenAI GPT-5.4."}],novita:[{value:"moonshotai/kimi-k2.5",label:"Kimi K2.5",description:"NovitaAI — Moonshot Kimi K2.5."},{value:"zai-org/glm-5",label:"GLM 5",description:"NovitaAI — Zhipu GLM 5."},{value:"deepseek/deepseek-v3-0324",label:"DeepSeek V3 0324",description:"NovitaAI — DeepSeek V3."},{value:"qwen/qwen3-235b-a22b-fp8",label:"Qwen3 235B",description:"NovitaAI — Qwen3 235B."}],stepfun:[{value:"step-3",label:"Step 3",description:"StepFun — modelo flagship Step 3."}],huggingface:[{value:"Qwen/Qwen3.5-72B-Instruct",label:"Qwen3.5 72B",description:"HuggingFace router — Qwen3.5 72B Instruct."},{value:"deepseek-ai/DeepSeek-V3.2",label:"DeepSeek V3.2",description:"HuggingFace router — DeepSeek V3.2."}],arcee:[{value:"auto",label:"Auto (router)",description:"Arcee AI — enrutador automático de modelos."}],alibaba:[{value:"qwen3-max",label:"Qwen3 Max",description:"Alibaba DashScope — Qwen3 Max."},{value:"qwen3-coder-plus",label:"Qwen3 Coder Plus",description:"Alibaba DashScope — Qwen3 Coder Plus."},{value:"qwen-plus",label:"Qwen Plus",description:"Alibaba DashScope — Qwen Plus."}],kimi:[{value:"kimi-k2-0905-preview",label:"Kimi K2 (0905)",description:"Moonshot — Kimi K2 para coding."},{value:"moonshot-v1-128k",label:"Moonshot v1 128k",description:"Moonshot — contexto 128k."}]},p=new Map,m=new Map;function trimTrailingSlash(e){return e.endsWith("/")?e.slice(0,-1):e}function ensureV1Suffix(e){const a=trimTrailingSlash(e);return a.endsWith("/v1")?a:`${a}/v1`}function isLocalOllamaProviderHost(e){try{const a=new URL(e);return"localhost"===a.hostname||"127.0.0.1"===a.hostname}catch{return e.includes("localhost")||e.includes("127.0.0.1")}}function getProviderCacheKey(e){const a=getProviderBaseUrl(e);return`${e}:${(r(e)?o(e):null)??"default"}:${a}`}function getProviderLabel(e){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"minimax":return"MiniMax";case"nvidia":return"NVIDIA NIM";case"deepseek":return"DeepSeek";case"xai":return"xAI";case"gmi":return"GMI Cloud";case"novita":return"NovitaAI";case"stepfun":return"StepFun";case"huggingface":return"HuggingFace";case"opencode-zen":return"OpenCode Zen";case"arcee":return"Arcee AI";case"alibaba":return"Alibaba (Qwen)";case"kimi":return"Kimi (Moonshot)";case"copilot":return"GitHub Copilot";default:return"OpenAI"}}function getProviderBaseUrl(e){switch(e){case"openrouter":return ensureV1Suffix(process.env.OPENROUTER_BASE_URL||t("openrouter")||"https://openrouter.ai/api/v1");case"ollama":return ensureV1Suffix(process.env.OLLAMA_BASE_URL||t("ollama")||"http://localhost:11434/v1");case"ollama-cloud":return ensureV1Suffix(process.env.OLLAMA_CLOUD_BASE_URL||process.env.OLLAMA_BASE_URL||t("ollama-cloud")||"http://localhost:11434/v1");case"zai":return trimTrailingSlash(process.env.ZAI_BASE_URL||t("zai")||"https://api.z.ai/api/coding/paas/v4");case"gemini-api":return trimTrailingSlash(process.env.GEMINI_BASE_URL||process.env.GEMINI_API_BASE_URL||t("gemini-api")||"https://generativelanguage.googleapis.com/v1beta/openai");case"gemini-google":return trimTrailingSlash(process.env.GEMINI_GOOGLE_BASE_URL||process.env.GEMINI_BASE_URL||t("gemini-google")||"https://generativelanguage.googleapis.com/v1beta/openai");case"minimax":return trimTrailingSlash(process.env.MINIMAX_BASE_URL||t("minimax")||"https://api.minimax.io/anthropic");case"nvidia":return ensureV1Suffix(process.env.NVIDIA_BASE_URL||t("nvidia")||"https://integrate.api.nvidia.com/v1");case"deepseek":return ensureV1Suffix(process.env.DEEPSEEK_BASE_URL||t("deepseek")||"https://api.deepseek.com/v1");case"xai":return ensureV1Suffix(process.env.XAI_BASE_URL||t("xai")||"https://api.x.ai/v1");case"copilot":return trimTrailingSlash(process.env.GITHUB_COPILOT_BASE_URL||"https://api.githubcopilot.com");case"gmi":case"novita":case"stepfun":case"huggingface":case"opencode-zen":case"arcee":case"alibaba":case"kimi":return ensureV1Suffix(t(e));case"custom-openai":return ensureV1Suffix(t("custom-openai")||"https://api.openai.com/v1");default:return ensureV1Suffix(process.env.OPENAI_API_BASE_URL||process.env.OPENAI_BASE_URL||"https://api.openai.com/v1")}}async function buildProviderHeaders(a){if("gemini-google"===a)return e();const t={},o=i(a),r=getProviderBaseUrl(a);return"ollama"!==a&&!("ollama-cloud"===a&&isLocalOllamaProviderHost(r))&&o&&(t.Authorization=`Bearer ${o}`),"openrouter"===a&&(t["HTTP-Referer"]="https://context.iaforged.com",t["X-Title"]="Context Code"),"copilot"===a&&(t["Copilot-Integration-Id"]="vscode-chat",t["Editor-Version"]="ContextCode/1.0",t["Editor-Plugin-Version"]="ContextCode/1.0",t["User-Agent"]="ContextCode/1.0"),t}function formatOpenAICompatibleDescription(e){const a=[];return e.description&&a.push(e.description),e.context_length&&a.push(`Context: ${e.context_length}`),(e.pricing?.prompt||e.pricing?.completion)&&a.push(`Price: ${e.pricing?.prompt??"?"} prompt / ${e.pricing?.completion??"?"} completion`),a.join(" · ")}function mapOpenAICompatibleModels(e,a){return(e.data??[]).map(e=>{const i=e.id?.trim();if(!i)return null;const t="minimax"===a?n[i.toLowerCase()]:void 0;return{value:i,label:e.name?.trim()||i,description:formatOpenAICompatibleDescription(e)||t||""}}).filter(e=>null!==e)}function filterOllamaModels(e,a,i){return"ollama-cloud"===e&&isLocalOllamaProviderHost(i)?a.filter(e=>e.value.toLowerCase().endsWith(":cloud")):a}async function fetchJson(e,a){const i=await fetch(e,{headers:a});if(!i.ok)throw new Error(`Failed to load models from ${e}: ${i.status}`);return i.json()}function cacheProviderHealth(e){return m.set(getProviderCacheKey(e.provider),{expiresAt:Date.now()+3e4,result:e}),e}function buildHealthResult(e,a,i,t={}){return{provider:e,label:getProviderLabel(e),state:a,message:i,baseUrl:t.baseUrl??getProviderBaseUrl(e),statusCode:t.statusCode,checkedAt:Date.now()}}async function fetchWithTimeout(e,a,i=5e3){const t=new AbortController,o=setTimeout(()=>t.abort(),i);try{return await fetch(e,{headers:a,signal:t.signal})}finally{clearTimeout(o)}}export async function checkProviderHealth(e,t={}){if(!t.forceRefresh){const a=function(e){const a=m.get(getProviderCacheKey(e));return a?a.expiresAt<Date.now()?(m.delete(getProviderCacheKey(e)),null):a.result:null}(e);if(a)return a}const o=getProviderBaseUrl(e),r=getProviderLabel(e),n="minimax"===e?{"x-api-key":a()??"",Authorization:`Bearer ${a()??""}`,"Content-Type":"application/json"}:await buildProviderHeaders(e),l="minimax"===e?a():i(e);if(!("ollama"===e||"gemini-google"===e||"ollama-cloud"===e&&isLocalOllamaProviderHost(o)||l))return cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} no tiene credenciales configuradas.`,{baseUrl:o}));try{if("minimax"===e)return cacheProviderHealth(buildHealthResult(e,"healthy",`${r} configurado para Anthropic-compatible (${o}).`,{baseUrl:o}));if("ollama"===e||"ollama-cloud"===e){const a=[`${o.endsWith("/v1")?o.slice(0,-3):o}/api/tags`,`${o}/models`];let i,t="";for(const r of a){const a=await fetchWithTimeout(r,n);if(a.ok)return cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${r}.`,{baseUrl:o,statusCode:a.status}));if(i=a.status,t=`${a.status} ${a.statusText}`.trim(),404!==a.status||!r.endsWith("/api/tags"))break}return cacheProviderHealth(429===i?buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o,statusCode:i}):buildHealthResult(e,"unreachable",t?`${r} no respondió correctamente (${t}).`:`${r} no respondió correctamente.`,{baseUrl:o,statusCode:i}))}const a=`${o}/models`,i=await fetchWithTimeout(a,n);return i.ok?cacheProviderHealth(buildHealthResult(e,"healthy",`Conectado a ${a}.`,{baseUrl:o,statusCode:i.status})):401===i.status||403===i.status?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} rechazó la solicitud. Revisa la API key o token configurado.`,{baseUrl:o,statusCode:i.status})):429===i.status?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o,statusCode:i.status})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${r} respondió con ${i.status} al validar la conexión.`,{baseUrl:o,statusCode:i.status}))}catch(a){const i=function(e){return e instanceof Error?e.message.replace(/\s+/g," ").trim():String(e).replace(/\s+/g," ").trim()}(a);return"ollama"===e&&(i.toLowerCase().includes("econnrefused")||i.toLowerCase().includes("fetch failed")||i.toLowerCase().includes("networkerror")||i.toLowerCase().includes("localhost:11434"))?cacheProviderHealth(buildHealthResult(e,"unreachable","Ollama no es accesible. Inicia el servidor local o revisa OLLAMA_BASE_URL.",{baseUrl:o})):i.includes("401")||i.includes("403")||i.toLowerCase().includes("authentication")?cacheProviderHealth(buildHealthResult(e,"needs-setup",`${r} no tiene credenciales válidas.`,{baseUrl:o})):i.includes("429")||i.toLowerCase().includes("rate limit")?cacheProviderHealth(buildHealthResult(e,"rate-limited",`${r} devolvió rate limit al validar la conexión.`,{baseUrl:o})):cacheProviderHealth(buildHealthResult(e,"unreachable",`${r} no pudo validarse: ${i||"error desconocido"}.`,{baseUrl:o}))}}export function getCachedProviderModels(e){return p.get(getProviderCacheKey(e))??null}export async function fetchProviderModels(e){const i=getProviderCacheKey(e),t=p.get(i);if(t)return t;try{if("minimax"===e)try{const e=a(),t=function(e){return(e.data??[]).map(e=>{const a=e.id?.trim();return a?{value:a,label:e.display_name?.trim()||a,description:n[a.toLowerCase()]??""}:null}).filter(e=>null!==e)}(await fetchJson(`${getProviderBaseUrl("minimax")}/v1/models`,{"X-Api-Key":e??"","Content-Type":"application/json"})),o=new Set(t.map(e=>e.value)),r=t.length>0?[...t,...l.filter(e=>!o.has(e.value))]:l;return p.set(i,r),r}catch{return p.set(i,l),l}let t=[];if("ollama"===e||"ollama-cloud"===e){const a=getProviderBaseUrl(e),i=a.endsWith("/v1")?a.slice(0,-3):a;try{t=filterOllamaModels(e,function(e){return(e.models??[]).map(e=>{const a=e.model?.trim()||e.name?.trim();if(!a)return null;const i=[e.details?.family,e.details?.parameter_size,e.details?.quantization_level].filter(Boolean);return{value:a,label:e.name?.trim()||a,description:i.join(" · ")}}).filter(e=>null!==e)}(await fetchJson(`${i}/api/tags`,await buildProviderHeaders(e))),a)}catch{t=filterOllamaModels(e,mapOpenAICompatibleModels(await fetchJson(`${a}/models`,await buildProviderHeaders(e)),e),a)}}else{t=mapOpenAICompatibleModels(await fetchJson(`${getProviderBaseUrl(e)}/models`,await buildProviderHeaders(e)),e)}if("gemini-api"===e||"gemini-google"===e){const e=new Set(c.map(e=>e.value));t=[...c,...t.filter(a=>!e.has(a.value))]}if("xai"===e){const e=new Set(u.map(e=>e.value));t=[...u,...t.filter(a=>!e.has(a.value))]}if("deepseek"===e){const e=new Set(s.map(e=>e.value));t=[...s,...t.filter(a=>!e.has(a.value))]}const o=d[e];if(o){const e=new Set(o.map(e=>e.value));t=[...o,...t.filter(a=>!e.has(a.value))]}return p.set(i,t),t}catch{if("gemini-api"===e||"gemini-google"===e)return p.set(i,c),c;if("xai"===e)return p.set(i,u),u;if("deepseek"===e)return p.set(i,s),s;const a=d[e];return a?(p.set(i,a),a):[]}}
@@ -1 +1 @@
1
- import{getStoredLastModelForProvider as e,getStoredProviderBaseUrl as i,readProviderProfilesState as r,writeProviderProfilesState as o}from"./providerProfilesDb.js";const t=new Set(["claude","openai","openrouter","ollama","ollama-cloud","lmstudio","gemini-api","gemini-google","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","custom-openai","custom-anthropic"]),n={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main",lmstudio:"local","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main",xai:"main",gmi:"main",novita:"main",stepfun:"main",huggingface:"main","opencode-zen":"main",arcee:"main",alibaba:"main",kimi:"main","custom-openai":"main","custom-anthropic":"main"},a={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud",lmstudio:"lmstudio-local","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek",xai:"xai",gmi:"gmi",novita:"novita",stepfun:"stepfun",huggingface:"huggingface","opencode-zen":"opencode-zen",arcee:"arcee",alibaba:"alibaba",kimi:"kimi","custom-openai":"custom-openai","custom-anthropic":"custom-anthropic"},l={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1",lmstudio:"http://localhost:1234/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1",xai:"https://api.x.ai/v1",gmi:"https://api.gmi-serving.com/v1",novita:"https://api.novita.ai/openai/v1",stepfun:"https://api.stepfun.ai/step_plan/v1",huggingface:"https://router.huggingface.co/v1","opencode-zen":"https://opencode.ai/zen/v1",arcee:"https://api.arcee.ai/api/v1",alibaba:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",kimi:"https://api.moonshot.ai/v1"};function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,i){return`${e}/${sanitizeProfileSegment(i)}`}function buildDefaultAgentName(e,i){const r=a[e],o=sanitizeProfileSegment(i);return o===sanitizeProfileSegment(n[e])?r:`${r}-${o}`}export function getDefaultProfileName(e){return n[e]}export function buildProviderProfileId(e,i){return buildProfileId(e,i)}export function isDefaultProfileId(e,i){return!!i&&i===buildProfileId(e,n[e])}function getState(){const e=r();return{version:1,profiles:e.profiles??{},lastProfileIdByProvider:e.lastProfileIdByProvider??{},activeProfileId:e.activeProfileId}}function saveState(e){const i=e(getState());return o(i),i}function getProfilesMap(){return getState().profiles??{}}function getProfileSeed(r,o){return o?function(r){return{baseUrl:"openrouter"===r||"ollama"===r||"ollama-cloud"===r||"zai"===r||"minimax"===r||"deepseek"===r||"xai"===r||"gmi"===r||"novita"===r||"stepfun"===r||"huggingface"===r||"opencode-zen"===r||"arcee"===r||"alibaba"===r||"kimi"===r?i(r):void 0,lastModel:e(r)??null}}(r):{baseUrl:l[r],lastModel:null}}export function isProfiledProvider(e){return t.has(e)}export function listProviderProfiles(e){const i=Object.values(getProfilesMap());return e?i.filter(i=>i.provider===e):i}export function getProviderProfile(e){return e?getProfilesMap()[e]??null:null}export function getActiveProviderProfile(){return getProviderProfile(getState().activeProfileId)}export function getLastUsedProviderProfile(e){const i=getState(),r=i.lastProfileIdByProvider?.[e];if(r){const e=getProviderProfile(r);if(e)return e}return listProviderProfiles(e)[0]??null}export function createProviderProfile(e){const i=buildProfileId(e.provider,e.name),r=getProviderProfile(i);if(r)return r;const o=(new Date).toISOString(),t={id:i,provider:e.provider,name:e.name.trim()||n[e.provider],agentName:e.agentName?.trim()||buildDefaultAgentName(e.provider,e.name),baseUrl:e.baseUrl,lastModel:e.lastModel??null,createdAt:o,updatedAt:o};return saveState(i=>({...i,activeProfileId:e.activate?t.id:i.activeProfileId,profiles:{...i.profiles??{},[t.id]:t},lastProfileIdByProvider:{...i.lastProfileIdByProvider??{},[e.provider]:t.id}})),t}export function ensureProviderProfile(e,i=n[e]){const r=getProviderProfile(buildProfileId(e,i));if(r)return r;return createProviderProfile({provider:e,name:i,...getProfileSeed(e,0===listProviderProfiles(e).length),activate:!1})}export function resolveProviderProfile(e,i={}){const r=getActiveProviderProfile();if(r?.provider===e)return r;const o=getLastUsedProviderProfile(e);return o||(i.createIfMissing?ensureProviderProfile(e):null)}export function getResolvedProviderProfileId(e){return resolveProviderProfile(e)?.id??null}export function setActiveProviderProfile(e){const i=getProviderProfile(e);return i?(saveState(e=>({...e,activeProfileId:i.id,lastProfileIdByProvider:{...e.lastProfileIdByProvider??{},[i.provider]:i.id}})),i):null}export function setActiveProfileForProvider(e,i){const r=i&&i.trim()?ensureProviderProfile(e,i):resolveProviderProfile(e,{createIfMissing:!0});return setActiveProviderProfile(r.id),r}export function findProviderProfileByName(e,i){return getProviderProfile(buildProfileId(e,i))}export function updateProviderProfile(e,i){let r=null;return saveState(o=>{const t=o.profiles?.[e];return t?(r=i(t),{...o,profiles:{...o.profiles??{},[e]:r},lastProfileIdByProvider:{...o.lastProfileIdByProvider??{},[t.provider]:e}}):o}),r}export function renameProviderProfile(e,i,r){const o=findProviderProfileByName(e,i);if(!o)return null;const t=r.trim();if(!t)throw new Error("Debes indicar un nuevo nombre de perfil.");const n=buildProfileId(e,t);if(n!==o.id&&getProviderProfile(n))throw new Error(`Ya existe un perfil ${e}/${t}.`);const a={...o,id:n,name:t,updatedAt:(new Date).toISOString()};return saveState(i=>{const r={...i.profiles??{}};delete r[o.id],r[n]=a;const t={...i.lastProfileIdByProvider??{},[e]:i.lastProfileIdByProvider?.[e]===o.id?n:i.lastProfileIdByProvider?.[e]};return{...i,activeProfileId:i.activeProfileId===o.id?n:i.activeProfileId,profiles:r,lastProfileIdByProvider:t}}),{previousId:o.id,profile:a}}export function removeProviderProfile(e,i){const r=findProviderProfileByName(e,i);return r?(saveState(i=>{const o={...i.profiles??{}};delete o[r.id];const t=Object.values(o).filter(i=>i.provider===e),n=t[0]?.id;return{...i,activeProfileId:i.activeProfileId===r.id?n:i.activeProfileId,profiles:o,lastProfileIdByProvider:{...i.lastProfileIdByProvider??{},[e]:i.lastProfileIdByProvider?.[e]===r.id?n:i.lastProfileIdByProvider?.[e]}}}),r):null}export function clearAllProviderProfiles(){const e=Object.values(getProfilesMap());return saveState(e=>({version:1,profiles:{},lastProfileIdByProvider:{}})),e}export function setProviderProfileAgentNameByName(e,i,r){const o=findProviderProfileByName(e,i);if(!o)return null;const t=sanitizeProfileSegment(r);if(!t)throw new Error("Debes indicar un agentName valido.");return updateProviderProfile(o.id,e=>({...e,agentName:t,updatedAt:(new Date).toISOString()}))}export function setProviderProfileBaseUrl(e,i){const r=resolveProviderProfile(e,{createIfMissing:!0});return updateProviderProfile(r.id,e=>({...e,baseUrl:i,updatedAt:(new Date).toISOString()}))??r}export function clearProviderProfileBaseUrl(e){const i=resolveProviderProfile(e);return i?updateProviderProfile(i.id,e=>({...e,baseUrl:void 0,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileBaseUrl(e){return resolveProviderProfile(e)?.baseUrl??null}export function setProviderProfileLastModel(e,i){const r=resolveProviderProfile(e);return r?updateProviderProfile(r.id,e=>({...e,lastModel:i,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileLastModel(e){return resolveProviderProfile(e)?.lastModel??null}export function setProviderProfileLastModelByName(e,i,r){const o=findProviderProfileByName(e,i);return o?updateProviderProfile(o.id,e=>({...e,lastModel:r,updatedAt:(new Date).toISOString()})):null}
1
+ import{getStoredLastModelForProvider as e,getStoredProviderBaseUrl as i,readProviderProfilesState as r,writeProviderProfilesState as o}from"./providerProfilesDb.js";const t=new Set(["claude","openai","openrouter","ollama","ollama-cloud","lmstudio","gemini-api","gemini-google","zai","minimax","nvidia","deepseek","xai","gmi","novita","stepfun","huggingface","opencode-zen","arcee","alibaba","kimi","copilot","custom-openai","custom-anthropic"]),n={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main",lmstudio:"local","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main",xai:"main",gmi:"main",novita:"main",stepfun:"main",huggingface:"main","opencode-zen":"main",arcee:"main",alibaba:"main",kimi:"main",copilot:"main","custom-openai":"main","custom-anthropic":"main"},a={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud",lmstudio:"lmstudio-local","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek",xai:"xai",gmi:"gmi",novita:"novita",stepfun:"stepfun",huggingface:"huggingface","opencode-zen":"opencode-zen",arcee:"arcee",alibaba:"alibaba",kimi:"kimi",copilot:"copilot","custom-openai":"custom-openai","custom-anthropic":"custom-anthropic"},l={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1",lmstudio:"http://localhost:1234/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1",xai:"https://api.x.ai/v1",gmi:"https://api.gmi-serving.com/v1",novita:"https://api.novita.ai/openai/v1",stepfun:"https://api.stepfun.ai/step_plan/v1",huggingface:"https://router.huggingface.co/v1","opencode-zen":"https://opencode.ai/zen/v1",arcee:"https://api.arcee.ai/api/v1",alibaba:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",kimi:"https://api.moonshot.ai/v1"};function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,i){return`${e}/${sanitizeProfileSegment(i)}`}function buildDefaultAgentName(e,i){const r=a[e],o=sanitizeProfileSegment(i);return o===sanitizeProfileSegment(n[e])?r:`${r}-${o}`}export function getDefaultProfileName(e){return n[e]}export function buildProviderProfileId(e,i){return buildProfileId(e,i)}export function isDefaultProfileId(e,i){return!!i&&i===buildProfileId(e,n[e])}function getState(){const e=r();return{version:1,profiles:e.profiles??{},lastProfileIdByProvider:e.lastProfileIdByProvider??{},activeProfileId:e.activeProfileId}}function saveState(e){const i=e(getState());return o(i),i}function getProfilesMap(){return getState().profiles??{}}function getProfileSeed(r,o){return o?function(r){return{baseUrl:"openrouter"===r||"ollama"===r||"ollama-cloud"===r||"zai"===r||"minimax"===r||"deepseek"===r||"xai"===r||"gmi"===r||"novita"===r||"stepfun"===r||"huggingface"===r||"opencode-zen"===r||"arcee"===r||"alibaba"===r||"kimi"===r?i(r):void 0,lastModel:e(r)??null}}(r):{baseUrl:l[r],lastModel:null}}export function isProfiledProvider(e){return t.has(e)}export function listProviderProfiles(e){const i=Object.values(getProfilesMap());return e?i.filter(i=>i.provider===e):i}export function getProviderProfile(e){return e?getProfilesMap()[e]??null:null}export function getActiveProviderProfile(){return getProviderProfile(getState().activeProfileId)}export function getLastUsedProviderProfile(e){const i=getState(),r=i.lastProfileIdByProvider?.[e];if(r){const e=getProviderProfile(r);if(e)return e}return listProviderProfiles(e)[0]??null}export function createProviderProfile(e){const i=buildProfileId(e.provider,e.name),r=getProviderProfile(i);if(r)return r;const o=(new Date).toISOString(),t={id:i,provider:e.provider,name:e.name.trim()||n[e.provider],agentName:e.agentName?.trim()||buildDefaultAgentName(e.provider,e.name),baseUrl:e.baseUrl,lastModel:e.lastModel??null,createdAt:o,updatedAt:o};return saveState(i=>({...i,activeProfileId:e.activate?t.id:i.activeProfileId,profiles:{...i.profiles??{},[t.id]:t},lastProfileIdByProvider:{...i.lastProfileIdByProvider??{},[e.provider]:t.id}})),t}export function ensureProviderProfile(e,i=n[e]){const r=getProviderProfile(buildProfileId(e,i));if(r)return r;return createProviderProfile({provider:e,name:i,...getProfileSeed(e,0===listProviderProfiles(e).length),activate:!1})}export function resolveProviderProfile(e,i={}){const r=getActiveProviderProfile();if(r?.provider===e)return r;const o=getLastUsedProviderProfile(e);return o||(i.createIfMissing?ensureProviderProfile(e):null)}export function getResolvedProviderProfileId(e){return resolveProviderProfile(e)?.id??null}export function setActiveProviderProfile(e){const i=getProviderProfile(e);return i?(saveState(e=>({...e,activeProfileId:i.id,lastProfileIdByProvider:{...e.lastProfileIdByProvider??{},[i.provider]:i.id}})),i):null}export function setActiveProfileForProvider(e,i){const r=i&&i.trim()?ensureProviderProfile(e,i):resolveProviderProfile(e,{createIfMissing:!0});return setActiveProviderProfile(r.id),r}export function findProviderProfileByName(e,i){return getProviderProfile(buildProfileId(e,i))}export function updateProviderProfile(e,i){let r=null;return saveState(o=>{const t=o.profiles?.[e];return t?(r=i(t),{...o,profiles:{...o.profiles??{},[e]:r},lastProfileIdByProvider:{...o.lastProfileIdByProvider??{},[t.provider]:e}}):o}),r}export function renameProviderProfile(e,i,r){const o=findProviderProfileByName(e,i);if(!o)return null;const t=r.trim();if(!t)throw new Error("Debes indicar un nuevo nombre de perfil.");const n=buildProfileId(e,t);if(n!==o.id&&getProviderProfile(n))throw new Error(`Ya existe un perfil ${e}/${t}.`);const a={...o,id:n,name:t,updatedAt:(new Date).toISOString()};return saveState(i=>{const r={...i.profiles??{}};delete r[o.id],r[n]=a;const t={...i.lastProfileIdByProvider??{},[e]:i.lastProfileIdByProvider?.[e]===o.id?n:i.lastProfileIdByProvider?.[e]};return{...i,activeProfileId:i.activeProfileId===o.id?n:i.activeProfileId,profiles:r,lastProfileIdByProvider:t}}),{previousId:o.id,profile:a}}export function removeProviderProfile(e,i){const r=findProviderProfileByName(e,i);return r?(saveState(i=>{const o={...i.profiles??{}};delete o[r.id];const t=Object.values(o).filter(i=>i.provider===e),n=t[0]?.id;return{...i,activeProfileId:i.activeProfileId===r.id?n:i.activeProfileId,profiles:o,lastProfileIdByProvider:{...i.lastProfileIdByProvider??{},[e]:i.lastProfileIdByProvider?.[e]===r.id?n:i.lastProfileIdByProvider?.[e]}}}),r):null}export function clearAllProviderProfiles(){const e=Object.values(getProfilesMap());return saveState(e=>({version:1,profiles:{},lastProfileIdByProvider:{}})),e}export function setProviderProfileAgentNameByName(e,i,r){const o=findProviderProfileByName(e,i);if(!o)return null;const t=sanitizeProfileSegment(r);if(!t)throw new Error("Debes indicar un agentName valido.");return updateProviderProfile(o.id,e=>({...e,agentName:t,updatedAt:(new Date).toISOString()}))}export function setProviderProfileBaseUrl(e,i){const r=resolveProviderProfile(e,{createIfMissing:!0});return updateProviderProfile(r.id,e=>({...e,baseUrl:i,updatedAt:(new Date).toISOString()}))??r}export function clearProviderProfileBaseUrl(e){const i=resolveProviderProfile(e);return i?updateProviderProfile(i.id,e=>({...e,baseUrl:void 0,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileBaseUrl(e){return resolveProviderProfile(e)?.baseUrl??null}export function setProviderProfileLastModel(e,i){const r=resolveProviderProfile(e);return r?updateProviderProfile(r.id,e=>({...e,lastModel:i,updatedAt:(new Date).toISOString()})):null}export function getProviderProfileLastModel(e){return resolveProviderProfile(e)?.lastModel??null}export function setProviderProfileLastModelByName(e,i,r){const o=findProviderProfileByName(e,i);return o?updateProviderProfile(o.id,e=>({...e,lastModel:r,updatedAt:(new Date).toISOString()})):null}
@@ -1 +1 @@
1
- import{createRequire as e}from"module";import{randomUUID as t}from"node:crypto";import{join as n}from"path";import{getGlobalConfig as i,saveGlobalConfig as r}from"../config.js";import{getClaudeConfigHomeDir as a}from"../envUtils.js";import{getFsImplementation as E}from"../fsOperations.js";import{getSecureStorage as o}from"../secureStorage/index.js";function hasStoredCredentialForProvider(e,t){if(!e)return!1;if("openai"===t&&e.openAiOauth?.accessToken)return!0;if("claude"===t&&e.claudeAiOauth?.accessToken)return!0;if(Object.keys(e.providerProfileOauth??{}).some(e=>e.startsWith(`${t}/`)))return!0;if(e.providerApiKeys?.[t])return!0;return Object.keys(e.providerProfileApiKeys??{}).some(e=>e.startsWith(`${t}/`))}const d=e(import.meta.url);let _=null,s=!1,T=!1;const l="active_provider",N="active_profile_id",p=["claude","openai","openrouter","ollama","ollama-cloud","lmstudio","gemini-api","gemini-google","zai","minimax","deepseek"],L={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main",lmstudio:"local","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main"},c={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud",lmstudio:"lmstudio-local","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek"},u={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1",lmstudio:"http://localhost:1234/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1"},m={claude:"Claude",openai:"OpenAI",openrouter:"OpenRouter",ollama:"Ollama","ollama-cloud":"Ollama Cloud",lmstudio:"LM Studio","gemini-api":"Gemini API","gemini-google":"Gemini Google",zai:"Z.AI",minimax:"MiniMax",nvidia:"NVIDIA NIM",deepseek:"DeepSeek"},O=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"];function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,t){return`${e}/${sanitizeProfileSegment(t)}`}function buildDefaultAgentName(e,t){const n=c[e],i=sanitizeProfileSegment(t);return i===sanitizeProfileSegment(L[e])?n:`${n}-${i}`}function tableExists(e,t){const n=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(t);return Boolean(n)}function columnExists(e,t,n){return e.prepare(`PRAGMA table_info(${t})`).all().some(e=>e.name===n)}function migrateTeamUnitsSchema(e){e.exec("PRAGMA foreign_keys = OFF;");try{tableExists(e,"team_domains")&&e.exec("\n INSERT OR IGNORE INTO team_units (\n id, team_id, unit_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n )\n SELECT id, team_id, domain_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n FROM team_domains;\n "),tableExists(e,"team_domain_members")&&e.exec("\n INSERT OR IGNORE INTO team_unit_members (\n id, team_unit_id, agent_id, duty, priority, created_at, updated_at\n )\n SELECT id, team_domain_id, agent_id, duty, priority, created_at, updated_at\n FROM team_domain_members;\n "),tableExists(e,"orchestration_tasks")&&!columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("ALTER TABLE orchestration_tasks ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n UPDATE orchestration_tasks\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS orchestration_tasks_v8 (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks_v8(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n INSERT OR REPLACE INTO orchestration_tasks_v8 (\n id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n )\n SELECT id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n FROM orchestration_tasks;\n\n DROP TABLE orchestration_tasks;\n ALTER TABLE orchestration_tasks_v8 RENAME TO orchestration_tasks;\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n ")}(e),tableExists(e,"orchestration_domain_reports")&&e.exec("\n INSERT OR IGNORE INTO orchestration_team_reports (\n id, run_id, team_unit_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n )\n SELECT id, run_id, team_domain_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n FROM orchestration_domain_reports;\n "),tableExists(e,"provider_agent_capability_rankings")&&!columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("ALTER TABLE provider_agent_capability_rankings ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n UPDATE provider_agent_capability_rankings\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings_v8 (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n INSERT OR REPLACE INTO provider_agent_capability_rankings_v8 (\n id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n )\n SELECT id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n FROM provider_agent_capability_rankings;\n\n DROP TABLE provider_agent_capability_rankings;\n ALTER TABLE provider_agent_capability_rankings_v8 RENAME TO provider_agent_capability_rankings;\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n ")}(e),e.exec("\n DROP TABLE IF EXISTS orchestration_domain_reports;\n DROP TABLE IF EXISTS team_domain_members;\n DROP TABLE IF EXISTS team_domains;\n ")}finally{e.exec("PRAGMA foreign_keys = ON;")}tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n "),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n ")}function getDatabasePath(){return n(a(),"provider-state.sqlite3")}function rowToProfile(e){if(!e)return null;const t=e;return{id:t.id,provider:t.provider,name:t.name,agentName:t.agent_name,baseUrl:t.base_url??void 0,lastModel:t.last_model,createdAt:t.created_at,updatedAt:t.updated_at}}function seedLegacyProfiles(){const e=i(),t=e.providerProfiles,n={...t&&"object"==typeof t&&t.profiles?t.profiles:{}},r={...t&&"object"==typeof t&&t.lastProfileIdByProvider?t.lastProfileIdByProvider:{}},a=(()=>{try{return o().read()}catch{return null}})();for(const t of p){const i=Object.values(n).some(e=>e.provider===t),E=e.providerBaseUrls?.[t],o=e.lastModelByProvider?.[t]??null;if(!(i||e.activeProvider===t||Boolean(E)||null!==o||hasStoredCredentialForProvider(a,t))||i)continue;const d=L[t],_=buildProfileId(t,d),s=(new Date).toISOString();n[_]={id:_,provider:t,name:d,agentName:buildDefaultAgentName(t,d),baseUrl:E??u[t],lastModel:o,createdAt:s,updatedAt:s},r[t]=_}return{version:1,activeProfileId:(t&&"object"==typeof t?t.activeProfileId:void 0)??(e.activeProvider&&p.includes(e.activeProvider)?r[e.activeProvider]:void 0),lastProfileIdByProvider:r,profiles:n}}function migrateFromLegacyConfig(e){const t=i(),n=seedLegacyProfiles(),r=e.prepare("\n INSERT OR REPLACE INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n "),a=e.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ON CONFLICT(provider) DO UPDATE SET profile_id = excluded.profile_id\n "),E=e.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n "),o=e.prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n "),d=e.prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ");for(const e of Object.values(n.profiles??{}))r.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);for(const[e,t]of Object.entries(n.lastProfileIdByProvider??{}))t&&a.run(e,t);n.activeProfileId&&E.run(N,n.activeProfileId);const _=t.activeProvider??(n.activeProfileId?n.profiles?.[n.activeProfileId]?.provider:void 0);_&&E.run(l,_);const s={claude:t.lastClaudeModel??t.lastModelByProvider?.claude??null,openai:t.lastOpenAIModel??t.lastModelByProvider?.openai??null,openrouter:t.lastOpenRouterModel??t.lastModelByProvider?.openrouter??null,ollama:t.lastModelByProvider?.ollama??null,"ollama-cloud":t.lastModelByProvider?.["ollama-cloud"]??null,"gemini-api":t.lastModelByProvider?.["gemini-api"]??null,"gemini-google":t.lastModelByProvider?.["gemini-google"]??null,zai:t.lastModelByProvider?.zai??null,minimax:t.lastModelByProvider?.minimax??null,deepseek:t.lastModelByProvider?.deepseek??null};for(const e of p)o.run(e,s[e]??null,(new Date).toISOString());for(const e of O){const n=t.providerBaseUrls?.[e];"string"==typeof n&&n.trim()&&d.run(e,n.trim(),(new Date).toISOString())}}export function purgeLegacyProviderStateInConfig(){hasLegacyProviderStateInConfig()&&r(e=>({...e,activeProvider:void 0,lastModelByProvider:{},providerBaseUrls:void 0,lastOpenAIModel:void 0,lastClaudeModel:void 0,lastOpenRouterModel:void 0,providerProfiles:void 0}))}export function finalizeProviderProfilesMigration(){ensureInitialized(),purgeLegacyProviderStateInConfig()}function ensureInitialized(){const e=function(){if(T)throw new Error("SQLite no disponible en este runtime.");if(_)return _;let e;E().mkdirSync(a(),{mode:448});try{e=d("node:sqlite")}catch(e){throw T=!0,e}return _=new e.DatabaseSync(getDatabasePath()),_}();if(s)return e;e.exec("\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n PRAGMA synchronous = NORMAL;\n\n CREATE TABLE IF NOT EXISTS provider_profiles (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n name TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n base_url TEXT NULL,\n last_model TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_profile (\n provider TEXT PRIMARY KEY,\n profile_id TEXT NOT NULL,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS provider_runtime_state (\n key TEXT PRIMARY KEY,\n value TEXT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_model (\n provider TEXT PRIMARY KEY,\n last_model TEXT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_base_url (\n provider TEXT PRIMARY KEY,\n base_url TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_workspaces (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL UNIQUE,\n display_name TEXT NOT NULL,\n domain_focus TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_agents (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL,\n profile_id TEXT NOT NULL,\n name TEXT NOT NULL,\n role_kind TEXT NULL,\n system_prompt TEXT NULL,\n model_override TEXT NULL,\n tool_policy TEXT NULL,\n autonomy_level TEXT NULL,\n is_orchestrator INTEGER NOT NULL DEFAULT 0,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE CASCADE,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE,\n UNIQUE (workspace_id, name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agents_workspace_id\n ON provider_agents(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agents_profile_id\n ON provider_agents(profile_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capabilities (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n weight REAL NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (agent_id, capability)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capabilities_agent_id\n ON provider_agent_capabilities(agent_id);\n\n CREATE TABLE IF NOT EXISTS teams (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n description TEXT NULL,\n global_orchestrator_agent_id TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE TABLE IF NOT EXISTS team_units (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n unit_name TEXT NOT NULL,\n workspace_id TEXT NULL,\n local_orchestrator_agent_id TEXT NULL,\n lead_agent_id TEXT NULL,\n selection_mode TEXT NOT NULL DEFAULT 'manual',\n required INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE SET NULL,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (lead_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (team_id, unit_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_units_team_id\n ON team_units(team_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_workspace_id\n ON team_units(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_local_orchestrator_agent_id\n ON team_units(local_orchestrator_agent_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_lead_agent_id\n ON team_units(lead_agent_id);\n\n CREATE TABLE IF NOT EXISTS team_unit_members (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n duty TEXT NULL,\n priority INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_team_unit_id\n ON team_unit_members(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_agent_id\n ON team_unit_members(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_runs (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n goal TEXT NOT NULL,\n global_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n started_at TEXT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_team_id\n ON orchestration_runs(team_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_status\n ON orchestration_runs(status);\n\n CREATE TABLE IF NOT EXISTS orchestration_tasks (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_messages (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NULL,\n from_agent_id TEXT NULL,\n to_agent_id TEXT NULL,\n message_type TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (from_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (to_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_run_id\n ON orchestration_messages(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_task_id\n ON orchestration_messages(task_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_task_results (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NOT NULL,\n agent_id TEXT NULL,\n result_type TEXT NOT NULL,\n status TEXT NOT NULL,\n summary TEXT NULL,\n content TEXT NULL,\n metadata_json TEXT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_run_id\n ON orchestration_task_results(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_task_id\n ON orchestration_task_results(task_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_agent_id\n ON orchestration_task_results(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_team_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n team_unit_id TEXT NOT NULL,\n local_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n blockers TEXT NULL,\n output TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (run_id, team_unit_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_run_id\n ON orchestration_team_reports(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_team_unit_id\n ON orchestration_team_reports(team_unit_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_run_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n output TEXT NULL,\n risks TEXT NULL,\n next_steps TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_run_reports_run_id\n ON orchestration_run_reports(run_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n\n CREATE TABLE IF NOT EXISTS secure_storage (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS projects (\n path TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS permission_rules (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n tool_name TEXT NOT NULL,\n behavior TEXT NOT NULL,\n created_at TEXT NOT NULL,\n expires_at TEXT NULL,\n UNIQUE (scope, scope_path, tool_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_permission_rules_scope\n ON permission_rules(scope, scope_path);\n CREATE INDEX IF NOT EXISTS idx_permission_rules_tool_name\n ON permission_rules(tool_name);\n\n CREATE TABLE IF NOT EXISTS permission_mode_config (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n mode TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE (scope, scope_path)\n );\n\n CREATE TABLE IF NOT EXISTS trusted_directories (\n path TEXT PRIMARY KEY,\n trust_level TEXT NOT NULL DEFAULT 'full',\n created_at TEXT NOT NULL\n );\n "),migrateTeamUnitsSchema(e);const n=e.prepare("PRAGMA user_version").get();(n?.user_version??0)<8&&e.exec("PRAGMA user_version = 8"),function(e){const n=(new Date).toISOString(),i=e.prepare("\n INSERT OR IGNORE INTO provider_workspaces (\n id, provider, display_name, domain_focus, is_enabled, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n ");for(const e of p)i.run(t(),e,m[e],null,1,n,n)}(e);const i=e.prepare("SELECT COUNT(*) AS count FROM provider_profiles").get();if(0===(i?.count??0))migrateFromLegacyConfig(e);else{const t=e.prepare("SELECT COUNT(*) AS count FROM provider_last_model").get();0===(t?.count??0)&&migrateFromLegacyConfig(e);const n=e.prepare("SELECT COUNT(*) AS count FROM provider_base_url").get();0===(n?.count??0)&&migrateFromLegacyConfig(e)}return purgeLegacyProviderStateInConfig(),s=!0,e}export class ProviderProfilesDb{static instance=null;db;constructor(){this.db=ensureInitialized()}static async get(){return ProviderProfilesDb.instance||(ProviderProfilesDb.instance=new ProviderProfilesDb),ProviderProfilesDb.instance}}export function getProviderProfilesDbPath(){return getDatabasePath()}export function getProviderProfilesStorageBackend(){try{return ensureInitialized(),"sqlite"}catch{return"legacy"}}export function hasLegacyProviderStateInConfig(){try{const e=i();return Boolean(e.activeProvider||e.lastClaudeModel||e.lastOpenAIModel||e.lastOpenRouterModel||Object.keys(e.lastModelByProvider??{}).length>0||Object.keys(e.providerBaseUrls??{}).length>0||e.providerProfiles?.activeProfileId||Object.keys(e.providerProfiles?.profiles??{}).length>0||Object.keys(e.providerProfiles?.lastProfileIdByProvider??{}).length>0)}catch{return!1}}export function getProviderProfilesStorageMode(){return"sqlite"!==getProviderProfilesStorageBackend()?"legacy":hasLegacyProviderStateInConfig()?"sqlite-migration-pending":"sqlite-only"}export function readProviderProfilesState(){let e;try{e=ensureInitialized()}catch{return seedLegacyProfiles()}const t=e.prepare("SELECT id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n FROM provider_profiles\n ORDER BY provider, created_at, id").all().map(rowToProfile).filter(e=>null!==e),n=e.prepare("SELECT provider, profile_id FROM provider_last_profile").all(),i=e.prepare(`SELECT value FROM provider_runtime_state WHERE key = '${N}'`).get();return{version:1,activeProfileId:i?.value,lastProfileIdByProvider:Object.fromEntries(n.map(e=>[e.provider,e.profile_id])),profiles:Object.fromEntries(t.map(e=>[e.id,e]))}}export function writeProviderProfilesState(e){let t;try{t=ensureInitialized()}catch{return}const n=Object.values(e.profiles??{}),i=0===n.length;t.exec("BEGIN");try{t.exec("DELETE FROM provider_last_profile"),t.exec(`DELETE FROM provider_runtime_state WHERE key = '${N}'`),t.exec("DELETE FROM provider_profiles"),i&&(t.exec(`DELETE FROM provider_runtime_state WHERE key = '${l}'`),t.exec("DELETE FROM provider_last_model"),t.exec("DELETE FROM provider_base_url"));const r=t.prepare("\n INSERT INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ");for(const e of n)r.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);const a=t.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ");for(const[t,n]of Object.entries(e.lastProfileIdByProvider??{}))n&&a.run(t,n);e.activeProfileId&&t.prepare(`\n INSERT INTO provider_runtime_state (key, value)\n VALUES ('${N}', ?)\n `).run(e.activeProfileId),t.exec("COMMIT")}catch(e){throw t.exec("ROLLBACK"),e}}export function getStoredActiveProviderPreference(){const e=function(e){try{const t=ensureInitialized().prepare("SELECT value FROM provider_runtime_state WHERE key = ?").get(e);return t?.value??null}catch{return null}}(l);return null!==e?e:null}export function setStoredActiveProviderPreference(e){!function(e,t){try{const n=ensureInitialized();if(null===t)return void n.prepare("DELETE FROM provider_runtime_state WHERE key = ?").run(e);n.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n ").run(e,t)}catch{}}(l,e)}export function getStoredLastModelForProvider(e){try{const t=ensureInitialized().prepare("SELECT last_model FROM provider_last_model WHERE provider = ?").get(e);if(t&&Object.prototype.hasOwnProperty.call(t,"last_model"))return t.last_model??null}catch{return}}export function setStoredLastModelForProvider(e,t){!function(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}(e,t)}export function getStoredProviderBaseUrl(e){try{const t=ensureInitialized().prepare("SELECT base_url FROM provider_base_url WHERE provider = ?").get(e);if(t?.base_url?.trim())return t.base_url.trim()}catch{return}}export function setStoredProviderBaseUrl(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}export function clearStoredProviderBaseUrl(e){try{ensureInitialized().prepare("DELETE FROM provider_base_url WHERE provider = ?").run(e)}catch{}}
1
+ import{createRequire as e}from"module";import{randomUUID as t}from"node:crypto";import{join as n}from"path";import{getGlobalConfig as i,saveGlobalConfig as r}from"../config.js";import{getClaudeConfigHomeDir as a}from"../envUtils.js";import{getFsImplementation as o}from"../fsOperations.js";import{getSecureStorage as E}from"../secureStorage/index.js";function hasStoredCredentialForProvider(e,t){if(!e)return!1;if("openai"===t&&e.openAiOauth?.accessToken)return!0;if("claude"===t&&e.claudeAiOauth?.accessToken)return!0;if(Object.keys(e.providerProfileOauth??{}).some(e=>e.startsWith(`${t}/`)))return!0;if(e.providerApiKeys?.[t])return!0;return Object.keys(e.providerProfileApiKeys??{}).some(e=>e.startsWith(`${t}/`))}const d=e(import.meta.url);let _=null,s=!1,T=!1;const l="active_provider",N="active_profile_id",p=["claude","openai","openrouter","ollama","ollama-cloud","lmstudio","gemini-api","gemini-google","zai","minimax","deepseek","copilot"],c={claude:"main",openai:"main",openrouter:"main",ollama:"local","ollama-cloud":"main",lmstudio:"local","gemini-api":"main","gemini-google":"main",zai:"main",minimax:"main",nvidia:"main",deepseek:"main",copilot:"main"},L={claude:"claude",openai:"openai",openrouter:"openrouter",ollama:"ollama-local","ollama-cloud":"ollama-cloud",lmstudio:"lmstudio-local","gemini-api":"gemini-api","gemini-google":"gemini-google",zai:"z-ai",minimax:"minimax",nvidia:"nvidia",deepseek:"deepseek",copilot:"copilot"},u={openrouter:"https://openrouter.ai/api/v1",ollama:"http://localhost:11434/v1","ollama-cloud":"http://localhost:11434/v1",lmstudio:"http://localhost:1234/v1","gemini-api":"https://generativelanguage.googleapis.com/v1beta/openai","gemini-google":"https://generativelanguage.googleapis.com/v1beta/openai",zai:"https://api.z.ai/api/coding/paas/v4",minimax:"https://api.minimax.io/anthropic",deepseek:"https://api.deepseek.com/v1"},m={claude:"Claude",openai:"OpenAI",openrouter:"OpenRouter",ollama:"Ollama","ollama-cloud":"Ollama Cloud",lmstudio:"LM Studio","gemini-api":"Gemini API","gemini-google":"Gemini Google",zai:"Z.AI",minimax:"MiniMax",nvidia:"NVIDIA NIM",deepseek:"DeepSeek"},O=["openrouter","ollama","ollama-cloud","gemini-api","gemini-google","zai","minimax","deepseek"];function sanitizeProfileSegment(e){return e.trim().toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")||"default"}function buildProfileId(e,t){return`${e}/${sanitizeProfileSegment(t)}`}function buildDefaultAgentName(e,t){const n=L[e],i=sanitizeProfileSegment(t);return i===sanitizeProfileSegment(c[e])?n:`${n}-${i}`}function tableExists(e,t){const n=e.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ?").get(t);return Boolean(n)}function columnExists(e,t,n){return e.prepare(`PRAGMA table_info(${t})`).all().some(e=>e.name===n)}function migrateTeamUnitsSchema(e){e.exec("PRAGMA foreign_keys = OFF;");try{tableExists(e,"team_domains")&&e.exec("\n INSERT OR IGNORE INTO team_units (\n id, team_id, unit_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n )\n SELECT id, team_id, domain_name, workspace_id, local_orchestrator_agent_id, lead_agent_id, selection_mode, required, created_at, updated_at\n FROM team_domains;\n "),tableExists(e,"team_domain_members")&&e.exec("\n INSERT OR IGNORE INTO team_unit_members (\n id, team_unit_id, agent_id, duty, priority, created_at, updated_at\n )\n SELECT id, team_domain_id, agent_id, duty, priority, created_at, updated_at\n FROM team_domain_members;\n "),tableExists(e,"orchestration_tasks")&&!columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("ALTER TABLE orchestration_tasks ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n UPDATE orchestration_tasks\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS orchestration_tasks_v8 (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks_v8(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n INSERT OR REPLACE INTO orchestration_tasks_v8 (\n id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n )\n SELECT id, run_id, parent_task_id, scope_type, team_unit_id, assigned_agent_id, title, instructions, status, result_summary, created_at, finished_at\n FROM orchestration_tasks;\n\n DROP TABLE orchestration_tasks;\n ALTER TABLE orchestration_tasks_v8 RENAME TO orchestration_tasks;\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n ")}(e),tableExists(e,"orchestration_domain_reports")&&e.exec("\n INSERT OR IGNORE INTO orchestration_team_reports (\n id, run_id, team_unit_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n )\n SELECT id, run_id, team_domain_id, local_orchestrator_agent_id, status, summary, blockers, output, metrics_json, created_at, updated_at, submitted_at\n FROM orchestration_domain_reports;\n "),tableExists(e,"provider_agent_capability_rankings")&&!columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("ALTER TABLE provider_agent_capability_rankings ADD COLUMN team_unit_id TEXT NULL;"),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n UPDATE provider_agent_capability_rankings\n SET team_unit_id = team_domain_id\n WHERE team_unit_id IS NULL AND team_domain_id IS NOT NULL;\n "),function(e){tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_domain_id")&&e.exec("\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings_v8 (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n INSERT OR REPLACE INTO provider_agent_capability_rankings_v8 (\n id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n )\n SELECT id, team_unit_id, capability, agent_id, score, reason, source, created_at, updated_at\n FROM provider_agent_capability_rankings;\n\n DROP TABLE provider_agent_capability_rankings;\n ALTER TABLE provider_agent_capability_rankings_v8 RENAME TO provider_agent_capability_rankings;\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n ")}(e),e.exec("\n DROP TABLE IF EXISTS orchestration_domain_reports;\n DROP TABLE IF EXISTS team_domain_members;\n DROP TABLE IF EXISTS team_domains;\n ")}finally{e.exec("PRAGMA foreign_keys = ON;")}tableExists(e,"orchestration_tasks")&&columnExists(e,"orchestration_tasks","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_team_unit_id\n ON orchestration_tasks(team_unit_id);\n "),tableExists(e,"provider_agent_capability_rankings")&&columnExists(e,"provider_agent_capability_rankings","team_unit_id")&&e.exec("\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_team_unit\n ON provider_agent_capability_rankings(team_unit_id);\n ")}function getDatabasePath(){return n(a(),"provider-state.sqlite3")}function rowToProfile(e){if(!e)return null;const t=e;return{id:t.id,provider:t.provider,name:t.name,agentName:t.agent_name,baseUrl:t.base_url??void 0,lastModel:t.last_model,createdAt:t.created_at,updatedAt:t.updated_at}}function seedLegacyProfiles(){const e=i(),t=e.providerProfiles,n={...t&&"object"==typeof t&&t.profiles?t.profiles:{}},r={...t&&"object"==typeof t&&t.lastProfileIdByProvider?t.lastProfileIdByProvider:{}},a=(()=>{try{return E().read()}catch{return null}})();for(const t of p){const i=Object.values(n).some(e=>e.provider===t),o=e.providerBaseUrls?.[t],E=e.lastModelByProvider?.[t]??null;if(!(i||e.activeProvider===t||Boolean(o)||null!==E||hasStoredCredentialForProvider(a,t))||i)continue;const d=c[t],_=buildProfileId(t,d),s=(new Date).toISOString();n[_]={id:_,provider:t,name:d,agentName:buildDefaultAgentName(t,d),baseUrl:o??u[t],lastModel:E,createdAt:s,updatedAt:s},r[t]=_}return{version:1,activeProfileId:(t&&"object"==typeof t?t.activeProfileId:void 0)??(e.activeProvider&&p.includes(e.activeProvider)?r[e.activeProvider]:void 0),lastProfileIdByProvider:r,profiles:n}}function migrateFromLegacyConfig(e){const t=i(),n=seedLegacyProfiles(),r=e.prepare("\n INSERT OR REPLACE INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n "),a=e.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ON CONFLICT(provider) DO UPDATE SET profile_id = excluded.profile_id\n "),o=e.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n "),E=e.prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n "),d=e.prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ");for(const e of Object.values(n.profiles??{}))r.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);for(const[e,t]of Object.entries(n.lastProfileIdByProvider??{}))t&&a.run(e,t);n.activeProfileId&&o.run(N,n.activeProfileId);const _=t.activeProvider??(n.activeProfileId?n.profiles?.[n.activeProfileId]?.provider:void 0);_&&o.run(l,_);const s={claude:t.lastClaudeModel??t.lastModelByProvider?.claude??null,openai:t.lastOpenAIModel??t.lastModelByProvider?.openai??null,openrouter:t.lastOpenRouterModel??t.lastModelByProvider?.openrouter??null,ollama:t.lastModelByProvider?.ollama??null,"ollama-cloud":t.lastModelByProvider?.["ollama-cloud"]??null,"gemini-api":t.lastModelByProvider?.["gemini-api"]??null,"gemini-google":t.lastModelByProvider?.["gemini-google"]??null,zai:t.lastModelByProvider?.zai??null,minimax:t.lastModelByProvider?.minimax??null,deepseek:t.lastModelByProvider?.deepseek??null};for(const e of p)E.run(e,s[e]??null,(new Date).toISOString());for(const e of O){const n=t.providerBaseUrls?.[e];"string"==typeof n&&n.trim()&&d.run(e,n.trim(),(new Date).toISOString())}}export function purgeLegacyProviderStateInConfig(){hasLegacyProviderStateInConfig()&&r(e=>({...e,activeProvider:void 0,lastModelByProvider:{},providerBaseUrls:void 0,lastOpenAIModel:void 0,lastClaudeModel:void 0,lastOpenRouterModel:void 0,providerProfiles:void 0}))}export function finalizeProviderProfilesMigration(){ensureInitialized(),purgeLegacyProviderStateInConfig()}function ensureInitialized(){const e=function(){if(T)throw new Error("SQLite no disponible en este runtime.");if(_)return _;let e;o().mkdirSync(a(),{mode:448});try{e=d("node:sqlite")}catch(e){throw T=!0,e}return _=new e.DatabaseSync(getDatabasePath()),_}();if(s)return e;e.exec("\n PRAGMA journal_mode = WAL;\n PRAGMA foreign_keys = ON;\n PRAGMA synchronous = NORMAL;\n\n CREATE TABLE IF NOT EXISTS provider_profiles (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL,\n name TEXT NOT NULL,\n agent_name TEXT NOT NULL,\n base_url TEXT NULL,\n last_model TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_profile (\n provider TEXT PRIMARY KEY,\n profile_id TEXT NOT NULL,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE\n );\n\n CREATE TABLE IF NOT EXISTS provider_runtime_state (\n key TEXT PRIMARY KEY,\n value TEXT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_last_model (\n provider TEXT PRIMARY KEY,\n last_model TEXT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_base_url (\n provider TEXT PRIMARY KEY,\n base_url TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_workspaces (\n id TEXT PRIMARY KEY,\n provider TEXT NOT NULL UNIQUE,\n display_name TEXT NOT NULL,\n domain_focus TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS provider_agents (\n id TEXT PRIMARY KEY,\n workspace_id TEXT NOT NULL,\n profile_id TEXT NOT NULL,\n name TEXT NOT NULL,\n role_kind TEXT NULL,\n system_prompt TEXT NULL,\n model_override TEXT NULL,\n tool_policy TEXT NULL,\n autonomy_level TEXT NULL,\n is_orchestrator INTEGER NOT NULL DEFAULT 0,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE CASCADE,\n FOREIGN KEY (profile_id) REFERENCES provider_profiles(id) ON DELETE CASCADE,\n UNIQUE (workspace_id, name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agents_workspace_id\n ON provider_agents(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_provider_agents_profile_id\n ON provider_agents(profile_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capabilities (\n id TEXT PRIMARY KEY,\n agent_id TEXT NOT NULL,\n capability TEXT NOT NULL,\n weight REAL NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (agent_id, capability)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capabilities_agent_id\n ON provider_agent_capabilities(agent_id);\n\n CREATE TABLE IF NOT EXISTS teams (\n id TEXT PRIMARY KEY,\n name TEXT NOT NULL UNIQUE,\n description TEXT NULL,\n global_orchestrator_agent_id TEXT NULL,\n is_enabled INTEGER NOT NULL DEFAULT 1,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE TABLE IF NOT EXISTS team_units (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n unit_name TEXT NOT NULL,\n workspace_id TEXT NULL,\n local_orchestrator_agent_id TEXT NULL,\n lead_agent_id TEXT NULL,\n selection_mode TEXT NOT NULL DEFAULT 'manual',\n required INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (workspace_id) REFERENCES provider_workspaces(id) ON DELETE SET NULL,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (lead_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (team_id, unit_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_units_team_id\n ON team_units(team_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_workspace_id\n ON team_units(workspace_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_local_orchestrator_agent_id\n ON team_units(local_orchestrator_agent_id);\n CREATE INDEX IF NOT EXISTS idx_team_units_lead_agent_id\n ON team_units(lead_agent_id);\n\n CREATE TABLE IF NOT EXISTS team_unit_members (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n duty TEXT NULL,\n priority INTEGER NOT NULL DEFAULT 0,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_team_unit_id\n ON team_unit_members(team_unit_id);\n CREATE INDEX IF NOT EXISTS idx_team_unit_members_agent_id\n ON team_unit_members(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_runs (\n id TEXT PRIMARY KEY,\n team_id TEXT NOT NULL,\n goal TEXT NOT NULL,\n global_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n created_at TEXT NOT NULL,\n started_at TEXT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE,\n FOREIGN KEY (global_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_team_id\n ON orchestration_runs(team_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_runs_status\n ON orchestration_runs(status);\n\n CREATE TABLE IF NOT EXISTS orchestration_tasks (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n parent_task_id TEXT NULL,\n scope_type TEXT NOT NULL,\n team_unit_id TEXT NULL,\n assigned_agent_id TEXT NULL,\n title TEXT NOT NULL,\n instructions TEXT NOT NULL,\n status TEXT NOT NULL,\n result_summary TEXT NULL,\n created_at TEXT NOT NULL,\n finished_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (parent_task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE SET NULL,\n FOREIGN KEY (assigned_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_run_id\n ON orchestration_tasks(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_tasks_assigned_agent_id\n ON orchestration_tasks(assigned_agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_messages (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NULL,\n from_agent_id TEXT NULL,\n to_agent_id TEXT NULL,\n message_type TEXT NOT NULL,\n content TEXT NOT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE SET NULL,\n FOREIGN KEY (from_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n FOREIGN KEY (to_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_run_id\n ON orchestration_messages(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_messages_task_id\n ON orchestration_messages(task_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_task_results (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n task_id TEXT NOT NULL,\n agent_id TEXT NULL,\n result_type TEXT NOT NULL,\n status TEXT NOT NULL,\n summary TEXT NULL,\n content TEXT NULL,\n metadata_json TEXT NULL,\n created_at TEXT NOT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (task_id) REFERENCES orchestration_tasks(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_run_id\n ON orchestration_task_results(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_task_id\n ON orchestration_task_results(task_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_task_results_agent_id\n ON orchestration_task_results(agent_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_team_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL,\n team_unit_id TEXT NOT NULL,\n local_orchestrator_agent_id TEXT NULL,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n blockers TEXT NULL,\n output TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (local_orchestrator_agent_id) REFERENCES provider_agents(id) ON DELETE SET NULL,\n UNIQUE (run_id, team_unit_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_run_id\n ON orchestration_team_reports(run_id);\n CREATE INDEX IF NOT EXISTS idx_orchestration_team_reports_team_unit_id\n ON orchestration_team_reports(team_unit_id);\n\n CREATE TABLE IF NOT EXISTS orchestration_run_reports (\n id TEXT PRIMARY KEY,\n run_id TEXT NOT NULL UNIQUE,\n status TEXT NOT NULL,\n summary TEXT NOT NULL,\n output TEXT NULL,\n risks TEXT NULL,\n next_steps TEXT NULL,\n metrics_json TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n submitted_at TEXT NULL,\n FOREIGN KEY (run_id) REFERENCES orchestration_runs(id) ON DELETE CASCADE\n );\n\n CREATE INDEX IF NOT EXISTS idx_orchestration_run_reports_run_id\n ON orchestration_run_reports(run_id);\n\n CREATE TABLE IF NOT EXISTS provider_agent_capability_rankings (\n id TEXT PRIMARY KEY,\n team_unit_id TEXT NULL,\n capability TEXT NOT NULL,\n agent_id TEXT NOT NULL,\n score REAL NOT NULL DEFAULT 0,\n reason TEXT NULL,\n source TEXT NULL,\n created_at TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n FOREIGN KEY (team_unit_id) REFERENCES team_units(id) ON DELETE CASCADE,\n FOREIGN KEY (agent_id) REFERENCES provider_agents(id) ON DELETE CASCADE,\n UNIQUE (team_unit_id, capability, agent_id)\n );\n\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_capability\n ON provider_agent_capability_rankings(capability);\n CREATE INDEX IF NOT EXISTS idx_provider_agent_capability_rankings_agent\n ON provider_agent_capability_rankings(agent_id);\n\n CREATE TABLE IF NOT EXISTS secure_storage (\n key TEXT PRIMARY KEY,\n value TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS projects (\n path TEXT PRIMARY KEY,\n name TEXT NOT NULL,\n created_at TEXT NOT NULL\n );\n\n CREATE TABLE IF NOT EXISTS permission_rules (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n tool_name TEXT NOT NULL,\n behavior TEXT NOT NULL,\n created_at TEXT NOT NULL,\n expires_at TEXT NULL,\n UNIQUE (scope, scope_path, tool_name)\n );\n\n CREATE INDEX IF NOT EXISTS idx_permission_rules_scope\n ON permission_rules(scope, scope_path);\n CREATE INDEX IF NOT EXISTS idx_permission_rules_tool_name\n ON permission_rules(tool_name);\n\n CREATE TABLE IF NOT EXISTS permission_mode_config (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n scope_path TEXT NULL,\n mode TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n UNIQUE (scope, scope_path)\n );\n\n CREATE TABLE IF NOT EXISTS trusted_directories (\n path TEXT PRIMARY KEY,\n trust_level TEXT NOT NULL DEFAULT 'full',\n created_at TEXT NOT NULL\n );\n "),migrateTeamUnitsSchema(e);const n=e.prepare("PRAGMA user_version").get();(n?.user_version??0)<8&&e.exec("PRAGMA user_version = 8"),function(e){const n=(new Date).toISOString(),i=e.prepare("\n INSERT OR IGNORE INTO provider_workspaces (\n id, provider, display_name, domain_focus, is_enabled, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?)\n ");for(const e of p)i.run(t(),e,m[e],null,1,n,n)}(e);const i=e.prepare("SELECT COUNT(*) AS count FROM provider_profiles").get();if(0===(i?.count??0))migrateFromLegacyConfig(e);else{const t=e.prepare("SELECT COUNT(*) AS count FROM provider_last_model").get();0===(t?.count??0)&&migrateFromLegacyConfig(e);const n=e.prepare("SELECT COUNT(*) AS count FROM provider_base_url").get();0===(n?.count??0)&&migrateFromLegacyConfig(e)}return purgeLegacyProviderStateInConfig(),s=!0,e}export class ProviderProfilesDb{static instance=null;db;constructor(){this.db=ensureInitialized()}static async get(){return ProviderProfilesDb.instance||(ProviderProfilesDb.instance=new ProviderProfilesDb),ProviderProfilesDb.instance}}export function getProviderProfilesDbPath(){return getDatabasePath()}export function getProviderProfilesStorageBackend(){try{return ensureInitialized(),"sqlite"}catch{return"legacy"}}export function hasLegacyProviderStateInConfig(){try{const e=i();return Boolean(e.activeProvider||e.lastClaudeModel||e.lastOpenAIModel||e.lastOpenRouterModel||Object.keys(e.lastModelByProvider??{}).length>0||Object.keys(e.providerBaseUrls??{}).length>0||e.providerProfiles?.activeProfileId||Object.keys(e.providerProfiles?.profiles??{}).length>0||Object.keys(e.providerProfiles?.lastProfileIdByProvider??{}).length>0)}catch{return!1}}export function getProviderProfilesStorageMode(){return"sqlite"!==getProviderProfilesStorageBackend()?"legacy":hasLegacyProviderStateInConfig()?"sqlite-migration-pending":"sqlite-only"}export function readProviderProfilesState(){let e;try{e=ensureInitialized()}catch{return seedLegacyProfiles()}const t=e.prepare("SELECT id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n FROM provider_profiles\n ORDER BY provider, created_at, id").all().map(rowToProfile).filter(e=>null!==e),n=e.prepare("SELECT provider, profile_id FROM provider_last_profile").all(),i=e.prepare(`SELECT value FROM provider_runtime_state WHERE key = '${N}'`).get();return{version:1,activeProfileId:i?.value,lastProfileIdByProvider:Object.fromEntries(n.map(e=>[e.provider,e.profile_id])),profiles:Object.fromEntries(t.map(e=>[e.id,e]))}}export function writeProviderProfilesState(e){let t;try{t=ensureInitialized()}catch{return}const n=Object.values(e.profiles??{}),i=0===n.length;t.exec("BEGIN");try{t.exec("DELETE FROM provider_last_profile"),t.exec(`DELETE FROM provider_runtime_state WHERE key = '${N}'`),t.exec("DELETE FROM provider_profiles"),i&&(t.exec(`DELETE FROM provider_runtime_state WHERE key = '${l}'`),t.exec("DELETE FROM provider_last_model"),t.exec("DELETE FROM provider_base_url"));const r=t.prepare("\n INSERT INTO provider_profiles (\n id, provider, name, agent_name, base_url, last_model, created_at, updated_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)\n ");for(const e of n)r.run(e.id,e.provider,e.name,e.agentName,e.baseUrl??null,e.lastModel??null,e.createdAt,e.updatedAt);const a=t.prepare("\n INSERT INTO provider_last_profile (provider, profile_id)\n VALUES (?, ?)\n ");for(const[t,n]of Object.entries(e.lastProfileIdByProvider??{}))n&&a.run(t,n);e.activeProfileId&&t.prepare(`\n INSERT INTO provider_runtime_state (key, value)\n VALUES ('${N}', ?)\n `).run(e.activeProfileId),t.exec("COMMIT")}catch(e){throw t.exec("ROLLBACK"),e}}export function getStoredActiveProviderPreference(){const e=function(e){try{const t=ensureInitialized().prepare("SELECT value FROM provider_runtime_state WHERE key = ?").get(e);return t?.value??null}catch{return null}}(l);return null!==e?e:null}export function setStoredActiveProviderPreference(e){!function(e,t){try{const n=ensureInitialized();if(null===t)return void n.prepare("DELETE FROM provider_runtime_state WHERE key = ?").run(e);n.prepare("\n INSERT INTO provider_runtime_state (key, value)\n VALUES (?, ?)\n ON CONFLICT(key) DO UPDATE SET value = excluded.value\n ").run(e,t)}catch{}}(l,e)}export function getStoredLastModelForProvider(e){try{const t=ensureInitialized().prepare("SELECT last_model FROM provider_last_model WHERE provider = ?").get(e);if(t&&Object.prototype.hasOwnProperty.call(t,"last_model"))return t.last_model??null}catch{return}}export function setStoredLastModelForProvider(e,t){!function(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_last_model (provider, last_model, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n last_model = excluded.last_model,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}(e,t)}export function getStoredProviderBaseUrl(e){try{const t=ensureInitialized().prepare("SELECT base_url FROM provider_base_url WHERE provider = ?").get(e);if(t?.base_url?.trim())return t.base_url.trim()}catch{return}}export function setStoredProviderBaseUrl(e,t){try{ensureInitialized().prepare("\n INSERT INTO provider_base_url (provider, base_url, updated_at)\n VALUES (?, ?, ?)\n ON CONFLICT(provider) DO UPDATE SET\n base_url = excluded.base_url,\n updated_at = excluded.updated_at\n ").run(e,t,(new Date).toISOString())}catch{}}export function clearStoredProviderBaseUrl(e){try{ensureInitialized().prepare("DELETE FROM provider_base_url WHERE provider = ?").run(e)}catch{}}