panoma 0.1.7 → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app/BUILD-INFO.json +2 -2
- package/app/apps/web/.next-bundle/BUILD_ID +1 -1
- package/app/apps/web/.next-bundle/app-build-manifest.json +131 -131
- package/app/apps/web/.next-bundle/app-path-routes-manifest.json +34 -34
- package/app/apps/web/.next-bundle/build-manifest.json +2 -2
- package/app/apps/web/.next-bundle/prerender-manifest.json +3 -3
- package/app/apps/web/.next-bundle/server/app/(app)/agents/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/ai/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/bridge/page.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/bridge/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/copies/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/credentials/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/disk/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/hidden/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/p/[slug]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/packages/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/runs/[id]/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/runs/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/search/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/twin/look/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/twin/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/(app)/unsaved/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/accounts/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/consult/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/context/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/hello/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/journal/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/keys/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/log/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/mcp/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/notes/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/tasks/[id]/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/agent/tasks/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/ai/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/assets/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/assignments/launch/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/assignments/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/catalog/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/check/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/consultations/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/describe/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/disk/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/enrich/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/environment/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/hooks/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/ingest/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/md/apply/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/md/context/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/md/inspect/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/md/repair/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/md/review/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/north/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/notes/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/open/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/project/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/rescan/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/roots/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/runs/[id]/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/runs/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/scale/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/secrets/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/tasks/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/today/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/assign/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/classify/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/critique/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/design/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/distill/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/look/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/mine/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/score/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/shot/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/sources/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/synthesize/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/taste/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/twin/verdicts/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/api/watch/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app/icon/[id]/route_client-reference-manifest.js +1 -1
- package/app/apps/web/.next-bundle/server/app-paths-manifest.json +34 -34
- package/app/apps/web/.next-bundle/server/chunks/2930.js +1 -1
- package/app/apps/web/.next-bundle/server/chunks/3610.js +1 -1
- package/app/apps/web/.next-bundle/server/chunks/3677.js +1 -1
- package/app/apps/web/.next-bundle/server/functions-config-manifest.json +6 -6
- package/app/apps/web/.next-bundle/server/middleware-manifest.json +5 -5
- package/app/apps/web/.next-bundle/server/pages/500.html +1 -1
- package/app/apps/web/.next-bundle/server/server-reference-manifest.json +1 -1
- package/app/apps/web/.next-bundle/static/chunks/7911-1730eba8c196e698.js +1 -0
- package/app/apps/web/.next-bundle/static/chunks/app/(app)/bridge/{page-95d7d92ca0b30f20.js → page-9f270ffcd9da75ca.js} +1 -1
- package/app/node_modules/@panoma/ai/dist/index.js +17 -5
- package/dist/{ai-command-ICITNELE.js → ai-command-2LSCDGUE.js} +2 -2
- package/dist/{chunk-N7EEJ4U6.js → chunk-RC6OXHI6.js} +17 -5
- package/dist/{dist-C7GE6UXH.js → dist-ON3THUVO.js} +1 -1
- package/dist/index.js +1 -1
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/app/apps/web/.next-bundle/static/chunks/7911-c6622f219724e580.js +0 -1
- /package/app/apps/web/.next-bundle/static/{Ac5gZ0DbQ_SywHZXjduqm → IoWYBo4jj6B8WTfswm-wr}/_buildManifest.js +0 -0
- /package/app/apps/web/.next-bundle/static/{Ac5gZ0DbQ_SywHZXjduqm → IoWYBo4jj6B8WTfswm-wr}/_ssgManifest.js +0 -0
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";exports.id=3610,exports.ids=[3610],exports.modules={33610:(a,b,c)=>{c.d(b,{D:()=>X,Dd:()=>u,G1:()=>z,LZ:()=>Q,My:()=>ab,ON:()=>o,SR:()=>M,ST:()=>s,Xg:()=>H,Xo:()=>O,Z7:()=>L,_R:()=>R,aj:()=>V,eQ:()=>D,f7:()=>P,g8:()=>n,gW:()=>aa,kq:()=>F,lh:()=>m,nr:()=>r,s9:()=>S});var d=c(21820),e=c(33873),f=c(79748),g=c(76157),h=c(55511),i=c(81630),j=c(79646),k=c(28354),l=[{id:"anthropic",name:"Anthropic",auth:"api-key",description:"Claude por API. Facturaci\xf3n por uso.",descriptionEn:"Claude over the API. Pay as you go.",api:"anthropic",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],baseUrlEnvVar:"ANTHROPIC_BASE_URL",defaultModel:"claude-opus-5",models:["claude-opus-5","claude-sonnet-5","claude-haiku-4-5-20251001"],signupUrl:"https://console.anthropic.com/settings/keys"},{id:"openai",name:"OpenAI",auth:"api-key",description:"GPT por API. Facturaci\xf3n por uso.",descriptionEn:"GPT over the API. Pay as you go.",api:"openai",baseUrl:"https://api.openai.com/v1",apiKeyEnvVars:["OPENAI_API_KEY"],baseUrlEnvVar:"OPENAI_BASE_URL",defaultModel:"gpt-5",models:["gpt-5","gpt-5-mini"],signupUrl:"https://platform.openai.com/api-keys"},{id:"openrouter",name:"OpenRouter",auth:"api-key",description:"Una clave para modelos de muchos fabricantes.",descriptionEn:"One key for models from many makers.",api:"openai",baseUrl:"https://openrouter.ai/api/v1",apiKeyEnvVars:["OPENROUTER_API_KEY"],baseUrlEnvVar:"OPENROUTER_BASE_URL",defaultModel:"anthropic/claude-opus-4.6",models:["anthropic/claude-opus-4.6","openai/gpt-5","google/gemini-2.5-pro","deepseek/deepseek-chat"],signupUrl:"https://openrouter.ai/keys"},{id:"google",name:"Google AI Studio",auth:"api-key",description:"Gemini por su endpoint compatible con OpenAI.",descriptionEn:"Gemini through its OpenAI-compatible endpoint.",api:"openai",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",apiKeyEnvVars:["GEMINI_API_KEY","GOOGLE_API_KEY"],baseUrlEnvVar:"GEMINI_BASE_URL",defaultModel:"gemini-2.5-pro",models:["gemini-2.5-pro","gemini-2.5-flash"],signupUrl:"https://aistudio.google.com/apikey"},{id:"local",name:"Modelo local",auth:"api-key",description:"Ollama, LM Studio o cualquier servidor compatible con OpenAI.",descriptionEn:"Ollama, LM Studio, or any OpenAI-compatible server.",api:"openai",baseUrl:"http://127.0.0.1:11434/v1",apiKeyEnvVars:["LOCAL_LLM_API_KEY"],baseUrlEnvVar:"LOCAL_LLM_BASE_URL",defaultModel:"qwen3:8b",signupUrl:"https://ollama.com"},{id:"deepseek",name:"DeepSeek",auth:"api-key",description:"Modelos de razonamiento a precio bajo.",descriptionEn:"Reasoning models at a low price.",api:"openai",baseUrl:"https://api.deepseek.com/v1",apiKeyEnvVars:["DEEPSEEK_API_KEY"],baseUrlEnvVar:"DEEPSEEK_BASE_URL",defaultModel:"deepseek-chat",models:["deepseek-chat","deepseek-reasoner"],signupUrl:"https://platform.deepseek.com/api_keys"},{id:"groq",name:"Groq",auth:"api-key",description:"Modelos abiertos, con la respuesta m\xe1s r\xe1pida del mercado.",descriptionEn:"Open models, with the fastest responses on the market.",api:"openai",baseUrl:"https://api.groq.com/openai/v1",apiKeyEnvVars:["GROQ_API_KEY"],baseUrlEnvVar:"GROQ_BASE_URL",defaultModel:"llama-3.3-70b-versatile",signupUrl:"https://console.groq.com/keys"},{id:"xai",name:"xAI",auth:"api-key",description:"Grok por API.",descriptionEn:"Grok over the API.",api:"openai",baseUrl:"https://api.x.ai/v1",apiKeyEnvVars:["XAI_API_KEY"],baseUrlEnvVar:"XAI_BASE_URL",defaultModel:"grok-4-fast-reasoning",signupUrl:"https://console.x.ai"},{id:"together",name:"Together AI",auth:"api-key",description:"Cat\xe1logo grande de modelos abiertos alojados.",descriptionEn:"A large catalog of hosted open models.",api:"openai",baseUrl:"https://api.together.xyz/v1",apiKeyEnvVars:["TOGETHER_API_KEY"],baseUrlEnvVar:"TOGETHER_BASE_URL",defaultModel:"deepseek-ai/DeepSeek-V3",signupUrl:"https://api.together.ai/settings/api-keys"},{id:"fireworks",name:"Fireworks AI",auth:"api-key",description:"Modelos abiertos servidos r\xe1pido.",descriptionEn:"Open models, served fast.",api:"openai",baseUrl:"https://api.fireworks.ai/inference/v1",apiKeyEnvVars:["FIREWORKS_API_KEY"],baseUrlEnvVar:"FIREWORKS_BASE_URL",defaultModel:"accounts/fireworks/models/kimi-k2-instruct",signupUrl:"https://fireworks.ai/account/api-keys"},{id:"cerebras",name:"Cerebras",auth:"api-key",description:"Inferencia sobre oblea entera. Muy r\xe1pida, cat\xe1logo corto.",descriptionEn:"Wafer-scale inference. Very fast, short catalog.",api:"openai",baseUrl:"https://api.cerebras.ai/v1",apiKeyEnvVars:["CEREBRAS_API_KEY"],baseUrlEnvVar:"CEREBRAS_BASE_URL",defaultModel:"llama-3.3-70b",signupUrl:"https://cloud.cerebras.ai"},{id:"moonshot",name:"Moonshot \xb7 Kimi",auth:"api-key",description:"Kimi, con ventana de contexto larga.",descriptionEn:"Kimi, with a long context window.",api:"openai",baseUrl:"https://api.moonshot.ai/v1",apiKeyEnvVars:["MOONSHOT_API_KEY","KIMI_API_KEY"],baseUrlEnvVar:"MOONSHOT_BASE_URL",defaultModel:"kimi-k2-turbo-preview",signupUrl:"https://platform.moonshot.ai/console/api-keys"},{id:"alibaba",name:"Qwen \xb7 DashScope",auth:"api-key",description:"Qwen por el endpoint compatible de Alibaba.",descriptionEn:"Qwen through Alibaba’s compatible endpoint.",api:"openai",baseUrl:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",apiKeyEnvVars:["DASHSCOPE_API_KEY"],baseUrlEnvVar:"DASHSCOPE_BASE_URL",defaultModel:"qwen-max",signupUrl:"https://bailian.console.alibabacloud.com"},{id:"nvidia",name:"NVIDIA NIM",auth:"api-key",description:"Modelos abiertos servidos por NVIDIA.",descriptionEn:"Open models served by NVIDIA.",api:"openai",baseUrl:"https://integrate.api.nvidia.com/v1",apiKeyEnvVars:["NVIDIA_API_KEY"],baseUrlEnvVar:"NVIDIA_BASE_URL",defaultModel:"meta/llama-3.3-70b-instruct",signupUrl:"https://build.nvidia.com"},{id:"huggingface",name:"Hugging Face",auth:"api-key",description:"El enrutador de inferencia del Hub.",descriptionEn:"The Hub’s inference router.",api:"openai",baseUrl:"https://router.huggingface.co/v1",apiKeyEnvVars:["HF_TOKEN","HUGGINGFACE_API_KEY"],baseUrlEnvVar:"HF_BASE_URL",defaultModel:"Qwen/Qwen2.5-72B-Instruct",signupUrl:"https://huggingface.co/settings/tokens"},{id:"ollama-cloud",name:"Ollama Cloud",auth:"api-key",description:"Los modelos de Ollama, servidos por ellos en vez de por tu port\xe1til.",descriptionEn:"Ollama’s models, served by them instead of your laptop.",api:"openai",baseUrl:"https://ollama.com/v1",apiKeyEnvVars:["OLLAMA_API_KEY"],baseUrlEnvVar:"OLLAMA_BASE_URL",defaultModel:"gpt-oss:120b",signupUrl:"https://ollama.com/settings/keys"},{id:"lmstudio",name:"LM Studio",auth:"api-key",description:"El servidor local de LM Studio. Sin clave, salvo que le pongas una.",descriptionEn:"LM Studio’s local server. No key, unless you set one.",api:"openai",baseUrl:"http://127.0.0.1:1234/v1",apiKeyEnvVars:["LM_API_KEY","LMSTUDIO_API_KEY"],baseUrlEnvVar:"LMSTUDIO_BASE_URL",defaultModel:"local-model",signupUrl:"https://lmstudio.ai"},{id:"openai-codex",name:"ChatGPT (Codex)",auth:"oauth",description:"Tu suscripci\xf3n de ChatGPT Plus o Pro, sin clave. Uso personal: se apoya en el inicio de sesi\xf3n del CLI de Codex y en un endpoint privado de OpenAI, as\xed que puede dejar de funcionar el d\xeda que ellos lo cambien.",descriptionEn:"Your ChatGPT Plus or Pro subscription, no key. Personal use: it leans on the Codex CLI sign-in and a private OpenAI endpoint, so it can stop working the day they change it.",api:"codex",baseUrl:"https://chatgpt.com/backend-api/codex",baseUrlEnvVar:"CODEX_BASE_URL",defaultModel:"gpt-5.6-terra",models:["gpt-5.6-terra","gpt-5.6-sol","gpt-5.6-luna","gpt-5.5"],signupUrl:"https://chatgpt.com",oauth:{clientId:"app_EMoamEEZ73f0CkXaXp7hrann",authorizeUrl:"https://auth.openai.com/oauth/authorize",tokenUrl:"https://auth.openai.com/oauth/token",scopes:["openid","profile","email","offline_access"],redirectPort:1455,redirectPath:"/auth/callback"}},{id:"claude-cli",name:"Claude Code",auth:"cli",description:"Usa tu sesi\xf3n de Claude Code ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Claude Code session. No keys.",command:"claude",args:["-p"],bundles:[(0,e.join)((0,d.homedir)(),".claude","local","claude"),"/Applications/Claude.app/Contents/Resources/claude"]},{id:"codex-cli",name:"Codex",auth:"cli",description:"Usa tu sesi\xf3n de Codex ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Codex session. No keys.",command:"codex",args:["exec"],bundles:["/Applications/ChatGPT.app/Contents/Resources/codex"]},{id:"gemini-cli",name:"Gemini CLI",auth:"cli",description:"Usa tu sesi\xf3n de Gemini CLI ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Gemini CLI session. No keys.",command:"gemini",args:["-p"]},{id:"cursor-agent",name:"Cursor Agent",auth:"cli",description:"Usa tu sesi\xf3n de Cursor ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Cursor session. No keys.",command:"cursor-agent",args:["-p"],bundles:[(0,e.join)((0,d.homedir)(),".local","bin","cursor-agent")]},{id:"copilot-cli",name:"GitHub Copilot",auth:"cli",description:"Usa tu suscripci\xf3n de Copilot ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Copilot subscription. No keys.",command:"copilot",args:["-p"]},{id:"opencode",name:"OpenCode",auth:"cli",description:"Usa tu instalaci\xf3n de OpenCode. Sin claves.",descriptionEn:"Uses your OpenCode install. No keys.",command:"opencode",args:["run"]},{id:"aider",name:"Aider",auth:"cli",description:"Usa tu instalaci\xf3n de Aider. Sin claves.",descriptionEn:"Uses your Aider install. No keys.",command:"aider",args:["--message"]},{id:"amp-cli",name:"Amp",auth:"cli",description:"Usa tu sesi\xf3n de Amp ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Amp session. No keys.",command:"amp",args:["-x"]},{id:"goose",name:"Goose",auth:"cli",description:"Usa tu instalaci\xf3n de Goose. Sin claves.",descriptionEn:"Uses your Goose install. No keys.",command:"goose",args:["run","-t"]}];function m(a){return l.find(b=>b.id===a)}function n(a){return l.filter(b=>b.auth===a)}function o(){let a=p((0,h.randomBytes)(48));return{verifier:a,challenge:p((0,h.createHash)("sha256").update(a).digest()),state:p((0,h.randomBytes)(24))}}function p(a){return a.toString("base64url")}function q(a){let b=y(a);return`http://localhost:${b.redirectPort}${b.redirectPath}`}function r(a,b){let c=y(a),d=new URL(c.authorizeUrl);return d.searchParams.set("response_type","code"),d.searchParams.set("client_id",c.clientId),d.searchParams.set("redirect_uri",q(a)),d.searchParams.set("scope",c.scopes.join(" ")),d.searchParams.set("code_challenge",b.challenge),d.searchParams.set("code_challenge_method","S256"),d.searchParams.set("state",b.state),d.toString()}function s(a,b){let c=y(a);return new Promise((a,d)=>{let e,f=()=>e?.close(),g=setTimeout(()=>{f(),d(Error("Se agot\xf3 el plazo esperando a que volvieras del navegador."))},3e5),j=(b,c)=>{clearTimeout(g),f(),b?d(b):a(c)};(e=(0,i.createServer)((a,d)=>{let e=new URL(a.url??"/",`http://localhost:${c.redirectPort}`);if(e.pathname!==c.redirectPath)return void d.writeHead(404).end();let f=e.searchParams.get("error"),g=e.searchParams.get("code");if(!function(a,b){let c=Buffer.from(a),d=Buffer.from(b);return c.length===d.length&&(0,h.timingSafeEqual)(c,d)}(e.searchParams.get("state")??"",b.state)){t(d,400,"Ese retorno no era de esta sesi\xf3n."),j(Error("El \xabstate\xbb del retorno no coincide: se descarta."));return}if(f){t(d,400,"No se pudo iniciar sesi\xf3n."),j(Error(`El proveedor devolvi\xf3 \xab${f}\xbb.`));return}if(!g){t(d,400,"El retorno vino sin c\xf3digo."),j(Error("El retorno no tra\xeda c\xf3digo de autorizaci\xf3n."));return}t(d,200,"Listo. Ya puedes cerrar esta pesta\xf1a y volver a Panoma."),j(null,g)})).on("error",a=>{clearTimeout(g),d(Error("EADDRINUSE"===a.code?`El puerto ${c.redirectPort} est\xe1 ocupado, y es el \xfanico que vale para este inicio de sesi\xf3n. Suele ser un 'codex login' a medias: ci\xe9rralo y vuelve a probar.`:`No se pudo escuchar en el puerto ${c.redirectPort}: ${a.message}`))}),e.listen(c.redirectPort,"127.0.0.1")})}function t(a,b,c){a.writeHead(b,{"content-type":"text/html; charset=utf-8"}),a.end(`<!doctype html><meta charset="utf-8"><title>Panoma</title><body style="font:15px system-ui;padding:3rem;color:#141722">${c}</body>`)}async function u(a,b,c){return w(a,{grant_type:"authorization_code",code:b,redirect_uri:q(a),code_verifier:c})}async function v(a,b){let c=await w(a,{grant_type:"refresh_token",refresh_token:b});return{...c,refresh:c.refresh??b}}async function w(a,b){let c=y(a),d=await fetch(c.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({...b,client_id:c.clientId})}),e=await d.json().catch(()=>({}));if(!d.ok||!e.access_token)throw Error(`${a.name} rechaz\xf3 la petici\xf3n de token (${d.status}): ${e.error_description??e.error??d.statusText}`);return{access:e.access_token,...e.refresh_token?{refresh:e.refresh_token}:{},...e.expires_in?{expiresAt:Date.now()+1e3*e.expires_in}:{},...x(e.id_token)?{accountId:x(e.id_token)}:{}}}function x(a){if(!a)return;let b=a.split(".")[1];if(b)try{let a=JSON.parse(Buffer.from(b,"base64url").toString("utf8"))["https://api.openai.com/auth"],c=a?.chatgpt_account_id;return"string"==typeof c?c:void 0}catch{return}}function y(a){if(!a.oauth)throw Error(`${a.name} no usa inicio de sesi\xf3n.`);return a.oauth}function z(a,b){if(!b||!a.baseUrl)return!1;try{return new URL(b).origin!==new URL(a.baseUrl).origin}catch{return!1}}var A=[/\bsk-[A-Za-z0-9_-]{8,}/g,/\bgsk_[A-Za-z0-9]{8,}/g,/\bxai-[A-Za-z0-9]{8,}/g,/\bAIza[A-Za-z0-9_-]{8,}/g,/\b(?:ghp|gho|ghs|ghu)_[A-Za-z0-9]{8,}/g,/\bgithub_pat_[A-Za-z0-9_]{8,}/g,/\bhf_[A-Za-z0-9]{8,}/g,/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,/\bBearer\s+[A-Za-z0-9._~+/=-]{12,}/gi],B="\xabcredencial oculta\xbb";function C(a,b=[]){let c=a;for(let a of b)a&&!(a.length<4)&&(c=c.split(a).join(B));for(let a of A)c=c.replace(a,B);return c.replace(/\b[A-Za-z0-9_-]{40,}\b/g,B)}function D(){return(0,g.panomaPath)("ai.json")}function E(){return`${D()}.anterior`}var F=class extends Error{constructor(a,b,c){let d=[`No se pudo leer la configuraci\xf3n de IA en ${a}: ${b.message}`];c?d.push(`Hay una copia anterior en ${c.path} con ${c.keys} clave${1===c.keys?"":"s"} dentro. Recup\xe9rala con:`,` mv ${c.path} ${a}`,"No ejecutes 'panoma ai key' antes: sobrescribir\xeda el fichero y con \xe9l lo que quede."):d.push("No hay copia anterior. \xc1brelo y arr\xe9glalo a mano, o b\xf3rralo si prefieres empezar","de cero — perder\xe1s las claves que hubiera guardadas dentro."),super(d.join("\n"),{cause:b}),this.path=a,this.recovery=c,this.name="ConfigCorruptError"}};async function G(a){let b;try{b=await (0,f.readFile)(a,"utf8")}catch(a){if("ENOENT"===a.code)return;throw a}let c=JSON.parse(b);if(!function(a){if("object"!=typeof a||null===a||Array.isArray(a)||void 0!==a.provider&&"string"!=typeof a.provider||void 0!==a.model&&"string"!=typeof a.model)return!1;let b=a.keys;if(void 0!==b&&("object"!=typeof b||null===b||Array.isArray(b)||Object.values(b).some(a=>"string"!=typeof a)))return!1;let c=a.tokens;return!(void 0!==c&&("object"!=typeof c||null===c||Array.isArray(c)||Object.values(c).some(a=>"object"!=typeof a||null===a||"string"!=typeof a.access)))&&!0}(c))throw Error("el contenido no tiene la forma de una configuraci\xf3n de Panoma");return c}async function H(){let a=D();try{return await G(a)??{}}catch(c){let b=await G(E()).catch(()=>void 0);throw new F(a,c,b?{path:E(),keys:Object.keys(b.keys??{}).length}:void 0)}}async function I(a){let b=D();await (0,f.mkdir)((0,e.dirname)(b),{recursive:!0}),await G(b).catch(()=>void 0)&&await (0,f.copyFile)(b,E()).then(()=>(0,g.j)(E())).catch(()=>{});let c=`${b}.${process.pid}.tmp`,d=`${JSON.stringify(a,null,2)}
|
|
1
|
+
"use strict";exports.id=3610,exports.ids=[3610],exports.modules={33610:(a,b,c)=>{c.d(b,{D:()=>X,Dd:()=>u,G1:()=>z,LZ:()=>Q,My:()=>ab,ON:()=>o,SR:()=>M,ST:()=>s,Xg:()=>H,Xo:()=>O,Z7:()=>L,_R:()=>R,aj:()=>V,eQ:()=>D,f7:()=>P,g8:()=>n,gW:()=>aa,kq:()=>F,lh:()=>m,nr:()=>r,s9:()=>S});var d=c(21820),e=c(33873),f=c(79748),g=c(76157),h=c(55511),i=c(81630),j=c(79646),k=c(28354),l=[{id:"anthropic",name:"Anthropic",auth:"api-key",description:"Claude por API. Facturaci\xf3n por uso.",descriptionEn:"Claude over the API. Pay as you go.",api:"anthropic",baseUrl:"https://api.anthropic.com",apiKeyEnvVars:["ANTHROPIC_API_KEY"],baseUrlEnvVar:"ANTHROPIC_BASE_URL",defaultModel:"claude-opus-5",models:["claude-opus-5","claude-sonnet-5","claude-haiku-4-5-20251001"],signupUrl:"https://console.anthropic.com/settings/keys"},{id:"openai",name:"OpenAI",auth:"api-key",description:"GPT por API. Facturaci\xf3n por uso.",descriptionEn:"GPT over the API. Pay as you go.",api:"openai",baseUrl:"https://api.openai.com/v1",apiKeyEnvVars:["OPENAI_API_KEY"],baseUrlEnvVar:"OPENAI_BASE_URL",defaultModel:"gpt-5",models:["gpt-5","gpt-5-mini"],signupUrl:"https://platform.openai.com/api-keys"},{id:"openrouter",name:"OpenRouter",auth:"api-key",description:"Una clave para modelos de muchos fabricantes.",descriptionEn:"One key for models from many makers.",api:"openai",baseUrl:"https://openrouter.ai/api/v1",apiKeyEnvVars:["OPENROUTER_API_KEY"],baseUrlEnvVar:"OPENROUTER_BASE_URL",defaultModel:"anthropic/claude-opus-4.6",models:["anthropic/claude-opus-4.6","openai/gpt-5","google/gemini-2.5-pro","deepseek/deepseek-chat"],signupUrl:"https://openrouter.ai/keys"},{id:"google",name:"Google AI Studio",auth:"api-key",description:"Gemini por su endpoint compatible con OpenAI.",descriptionEn:"Gemini through its OpenAI-compatible endpoint.",api:"openai",baseUrl:"https://generativelanguage.googleapis.com/v1beta/openai",apiKeyEnvVars:["GEMINI_API_KEY","GOOGLE_API_KEY"],baseUrlEnvVar:"GEMINI_BASE_URL",defaultModel:"gemini-2.5-pro",models:["gemini-2.5-pro","gemini-2.5-flash"],signupUrl:"https://aistudio.google.com/apikey"},{id:"local",name:"Modelo local",auth:"api-key",description:"Ollama, LM Studio o cualquier servidor compatible con OpenAI.",descriptionEn:"Ollama, LM Studio, or any OpenAI-compatible server.",api:"openai",baseUrl:"http://127.0.0.1:11434/v1",apiKeyEnvVars:["LOCAL_LLM_API_KEY"],baseUrlEnvVar:"LOCAL_LLM_BASE_URL",defaultModel:"qwen3:8b",signupUrl:"https://ollama.com"},{id:"deepseek",name:"DeepSeek",auth:"api-key",description:"Modelos de razonamiento a precio bajo.",descriptionEn:"Reasoning models at a low price.",api:"openai",baseUrl:"https://api.deepseek.com/v1",apiKeyEnvVars:["DEEPSEEK_API_KEY"],baseUrlEnvVar:"DEEPSEEK_BASE_URL",defaultModel:"deepseek-chat",models:["deepseek-chat","deepseek-reasoner"],signupUrl:"https://platform.deepseek.com/api_keys"},{id:"groq",name:"Groq",auth:"api-key",description:"Modelos abiertos, con la respuesta m\xe1s r\xe1pida del mercado.",descriptionEn:"Open models, with the fastest responses on the market.",api:"openai",baseUrl:"https://api.groq.com/openai/v1",apiKeyEnvVars:["GROQ_API_KEY"],baseUrlEnvVar:"GROQ_BASE_URL",defaultModel:"llama-3.3-70b-versatile",signupUrl:"https://console.groq.com/keys"},{id:"xai",name:"xAI",auth:"api-key",description:"Grok por API.",descriptionEn:"Grok over the API.",api:"openai",baseUrl:"https://api.x.ai/v1",apiKeyEnvVars:["XAI_API_KEY"],baseUrlEnvVar:"XAI_BASE_URL",defaultModel:"grok-4-fast-reasoning",signupUrl:"https://console.x.ai"},{id:"together",name:"Together AI",auth:"api-key",description:"Cat\xe1logo grande de modelos abiertos alojados.",descriptionEn:"A large catalog of hosted open models.",api:"openai",baseUrl:"https://api.together.xyz/v1",apiKeyEnvVars:["TOGETHER_API_KEY"],baseUrlEnvVar:"TOGETHER_BASE_URL",defaultModel:"deepseek-ai/DeepSeek-V3",signupUrl:"https://api.together.ai/settings/api-keys"},{id:"fireworks",name:"Fireworks AI",auth:"api-key",description:"Modelos abiertos servidos r\xe1pido.",descriptionEn:"Open models, served fast.",api:"openai",baseUrl:"https://api.fireworks.ai/inference/v1",apiKeyEnvVars:["FIREWORKS_API_KEY"],baseUrlEnvVar:"FIREWORKS_BASE_URL",defaultModel:"accounts/fireworks/models/kimi-k2-instruct",signupUrl:"https://fireworks.ai/account/api-keys"},{id:"cerebras",name:"Cerebras",auth:"api-key",description:"Inferencia sobre oblea entera. Muy r\xe1pida, cat\xe1logo corto.",descriptionEn:"Wafer-scale inference. Very fast, short catalog.",api:"openai",baseUrl:"https://api.cerebras.ai/v1",apiKeyEnvVars:["CEREBRAS_API_KEY"],baseUrlEnvVar:"CEREBRAS_BASE_URL",defaultModel:"llama-3.3-70b",signupUrl:"https://cloud.cerebras.ai"},{id:"moonshot",name:"Moonshot \xb7 Kimi",auth:"api-key",description:"Kimi, con ventana de contexto larga.",descriptionEn:"Kimi, with a long context window.",api:"openai",baseUrl:"https://api.moonshot.ai/v1",apiKeyEnvVars:["MOONSHOT_API_KEY","KIMI_API_KEY"],baseUrlEnvVar:"MOONSHOT_BASE_URL",defaultModel:"kimi-k2-turbo-preview",signupUrl:"https://platform.moonshot.ai/console/api-keys"},{id:"alibaba",name:"Qwen \xb7 DashScope",auth:"api-key",description:"Qwen por el endpoint compatible de Alibaba.",descriptionEn:"Qwen through Alibaba’s compatible endpoint.",api:"openai",baseUrl:"https://dashscope-intl.aliyuncs.com/compatible-mode/v1",apiKeyEnvVars:["DASHSCOPE_API_KEY"],baseUrlEnvVar:"DASHSCOPE_BASE_URL",defaultModel:"qwen-max",signupUrl:"https://bailian.console.alibabacloud.com"},{id:"nvidia",name:"NVIDIA NIM",auth:"api-key",description:"Modelos abiertos servidos por NVIDIA.",descriptionEn:"Open models served by NVIDIA.",api:"openai",baseUrl:"https://integrate.api.nvidia.com/v1",apiKeyEnvVars:["NVIDIA_API_KEY"],baseUrlEnvVar:"NVIDIA_BASE_URL",defaultModel:"meta/llama-3.3-70b-instruct",signupUrl:"https://build.nvidia.com"},{id:"huggingface",name:"Hugging Face",auth:"api-key",description:"El enrutador de inferencia del Hub.",descriptionEn:"The Hub’s inference router.",api:"openai",baseUrl:"https://router.huggingface.co/v1",apiKeyEnvVars:["HF_TOKEN","HUGGINGFACE_API_KEY"],baseUrlEnvVar:"HF_BASE_URL",defaultModel:"Qwen/Qwen2.5-72B-Instruct",signupUrl:"https://huggingface.co/settings/tokens"},{id:"ollama-cloud",name:"Ollama Cloud",auth:"api-key",description:"Los modelos de Ollama, servidos por ellos en vez de por tu port\xe1til.",descriptionEn:"Ollama’s models, served by them instead of your laptop.",api:"openai",baseUrl:"https://ollama.com/v1",apiKeyEnvVars:["OLLAMA_API_KEY"],baseUrlEnvVar:"OLLAMA_BASE_URL",defaultModel:"gpt-oss:120b",signupUrl:"https://ollama.com/settings/keys"},{id:"lmstudio",name:"LM Studio",auth:"api-key",description:"El servidor local de LM Studio. Sin clave, salvo que le pongas una.",descriptionEn:"LM Studio’s local server. No key, unless you set one.",api:"openai",baseUrl:"http://127.0.0.1:1234/v1",apiKeyEnvVars:["LM_API_KEY","LMSTUDIO_API_KEY"],baseUrlEnvVar:"LMSTUDIO_BASE_URL",defaultModel:"local-model",signupUrl:"https://lmstudio.ai"},{id:"openai-codex",name:"ChatGPT (Codex)",auth:"oauth",description:"Tu suscripci\xf3n de ChatGPT Plus o Pro, sin clave y sin binario local. Uso personal: se apoya en el inicio de sesi\xf3n del CLI de Codex y en un endpoint privado de OpenAI, as\xed que puede dejar de funcionar el d\xeda que ellos lo cambien.",descriptionEn:"Your ChatGPT Plus or Pro subscription, no key and no local binary. Personal use: it leans on the Codex CLI sign-in and a private OpenAI endpoint, so it can stop working the day they change it.",api:"codex",baseUrl:"https://chatgpt.com/backend-api/codex",baseUrlEnvVar:"CODEX_BASE_URL",defaultModel:"gpt-5.6-terra",models:["gpt-5.6-terra","gpt-5.6-sol","gpt-5.6-luna","gpt-5.5"],signupUrl:"https://chatgpt.com",oauth:{clientId:"app_EMoamEEZ73f0CkXaXp7hrann",authorizeUrl:"https://auth.openai.com/oauth/authorize",tokenUrl:"https://auth.openai.com/oauth/token",scopes:["openid","profile","email","offline_access"],redirectPort:1455,redirectPath:"/auth/callback"}},{id:"claude-cli",name:"Claude Code",auth:"cli",description:"Usa tu sesi\xf3n de Claude Code ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Claude Code session. No keys.",command:"claude",args:["-p"],bundles:[(0,e.join)((0,d.homedir)(),".claude","local","claude"),"/Applications/Claude.app/Contents/Resources/claude"]},{id:"codex-cli",name:"Codex CLI",auth:"cli",description:"Ejecuta el binario `codex` de esta m\xe1quina. Usa su sesi\xf3n ya iniciada, sin claves.",descriptionEn:"Runs the `codex` binary on this machine, using its signed-in session. No keys.",command:"codex",args:["exec"],bundles:["/Applications/ChatGPT.app/Contents/Resources/codex"]},{id:"gemini-cli",name:"Gemini CLI",auth:"cli",description:"Usa tu sesi\xf3n de Gemini CLI ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Gemini CLI session. No keys.",command:"gemini",args:["-p"]},{id:"cursor-agent",name:"Cursor Agent",auth:"cli",description:"Usa tu sesi\xf3n de Cursor ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Cursor session. No keys.",command:"cursor-agent",args:["-p"],bundles:[(0,e.join)((0,d.homedir)(),".local","bin","cursor-agent")]},{id:"copilot-cli",name:"GitHub Copilot",auth:"cli",description:"Usa tu suscripci\xf3n de Copilot ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Copilot subscription. No keys.",command:"copilot",args:["-p"]},{id:"opencode",name:"OpenCode",auth:"cli",description:"Usa tu instalaci\xf3n de OpenCode. Sin claves.",descriptionEn:"Uses your OpenCode install. No keys.",command:"opencode",args:["run"]},{id:"aider",name:"Aider",auth:"cli",description:"Usa tu instalaci\xf3n de Aider. Sin claves.",descriptionEn:"Uses your Aider install. No keys.",command:"aider",args:["--message"]},{id:"amp-cli",name:"Amp",auth:"cli",description:"Usa tu sesi\xf3n de Amp ya iniciada. Sin claves.",descriptionEn:"Uses your signed-in Amp session. No keys.",command:"amp",args:["-x"]},{id:"goose",name:"Goose",auth:"cli",description:"Usa tu instalaci\xf3n de Goose. Sin claves.",descriptionEn:"Uses your Goose install. No keys.",command:"goose",args:["run","-t"]}];function m(a){return l.find(b=>b.id===a)}function n(a){return l.filter(b=>b.auth===a)}function o(){let a=p((0,h.randomBytes)(48));return{verifier:a,challenge:p((0,h.createHash)("sha256").update(a).digest()),state:p((0,h.randomBytes)(24))}}function p(a){return a.toString("base64url")}function q(a){let b=y(a);return`http://localhost:${b.redirectPort}${b.redirectPath}`}function r(a,b){let c=y(a),d=new URL(c.authorizeUrl);return d.searchParams.set("response_type","code"),d.searchParams.set("client_id",c.clientId),d.searchParams.set("redirect_uri",q(a)),d.searchParams.set("scope",c.scopes.join(" ")),d.searchParams.set("code_challenge",b.challenge),d.searchParams.set("code_challenge_method","S256"),d.searchParams.set("state",b.state),d.toString()}function s(a,b){let c=y(a);return new Promise((a,d)=>{let e,f=()=>e?.close(),g=setTimeout(()=>{f(),d(Error("Se agot\xf3 el plazo esperando a que volvieras del navegador."))},3e5),j=(b,c)=>{clearTimeout(g),f(),b?d(b):a(c)};(e=(0,i.createServer)((a,d)=>{let e=new URL(a.url??"/",`http://localhost:${c.redirectPort}`);if(e.pathname!==c.redirectPath)return void d.writeHead(404).end();let f=e.searchParams.get("error"),g=e.searchParams.get("code");if(!function(a,b){let c=Buffer.from(a),d=Buffer.from(b);return c.length===d.length&&(0,h.timingSafeEqual)(c,d)}(e.searchParams.get("state")??"",b.state)){t(d,400,"Ese retorno no era de esta sesi\xf3n."),j(Error("El \xabstate\xbb del retorno no coincide: se descarta."));return}if(f){t(d,400,"No se pudo iniciar sesi\xf3n."),j(Error(`El proveedor devolvi\xf3 \xab${f}\xbb.`));return}if(!g){t(d,400,"El retorno vino sin c\xf3digo."),j(Error("El retorno no tra\xeda c\xf3digo de autorizaci\xf3n."));return}t(d,200,"Listo. Ya puedes cerrar esta pesta\xf1a y volver a Panoma."),j(null,g)})).on("error",a=>{clearTimeout(g),d(Error("EADDRINUSE"===a.code?`El puerto ${c.redirectPort} est\xe1 ocupado, y es el \xfanico que vale para este inicio de sesi\xf3n. Suele ser un 'codex login' a medias: ci\xe9rralo y vuelve a probar.`:`No se pudo escuchar en el puerto ${c.redirectPort}: ${a.message}`))}),e.listen(c.redirectPort,"127.0.0.1")})}function t(a,b,c){a.writeHead(b,{"content-type":"text/html; charset=utf-8"}),a.end(`<!doctype html><meta charset="utf-8"><title>Panoma</title><body style="font:15px system-ui;padding:3rem;color:#141722">${c}</body>`)}async function u(a,b,c){return w(a,{grant_type:"authorization_code",code:b,redirect_uri:q(a),code_verifier:c})}async function v(a,b){let c=await w(a,{grant_type:"refresh_token",refresh_token:b});return{...c,refresh:c.refresh??b}}async function w(a,b){let c=y(a),d=await fetch(c.tokenUrl,{method:"POST",headers:{"content-type":"application/x-www-form-urlencoded"},body:new URLSearchParams({...b,client_id:c.clientId})}),e=await d.json().catch(()=>({}));if(!d.ok||!e.access_token)throw Error(`${a.name} rechaz\xf3 la petici\xf3n de token (${d.status}): ${e.error_description??e.error??d.statusText}`);return{access:e.access_token,...e.refresh_token?{refresh:e.refresh_token}:{},...e.expires_in?{expiresAt:Date.now()+1e3*e.expires_in}:{},...x(e.id_token)?{accountId:x(e.id_token)}:{}}}function x(a){if(!a)return;let b=a.split(".")[1];if(b)try{let a=JSON.parse(Buffer.from(b,"base64url").toString("utf8"))["https://api.openai.com/auth"],c=a?.chatgpt_account_id;return"string"==typeof c?c:void 0}catch{return}}function y(a){if(!a.oauth)throw Error(`${a.name} no usa inicio de sesi\xf3n.`);return a.oauth}function z(a,b){if(!b||!a.baseUrl)return!1;try{return new URL(b).origin!==new URL(a.baseUrl).origin}catch{return!1}}var A=[/\bsk-[A-Za-z0-9_-]{8,}/g,/\bgsk_[A-Za-z0-9]{8,}/g,/\bxai-[A-Za-z0-9]{8,}/g,/\bAIza[A-Za-z0-9_-]{8,}/g,/\b(?:ghp|gho|ghs|ghu)_[A-Za-z0-9]{8,}/g,/\bgithub_pat_[A-Za-z0-9_]{8,}/g,/\bhf_[A-Za-z0-9]{8,}/g,/\beyJ[A-Za-z0-9_-]{20,}\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+/g,/\bBearer\s+[A-Za-z0-9._~+/=-]{12,}/gi],B="\xabcredencial oculta\xbb";function C(a,b=[]){let c=a;for(let a of b)a&&!(a.length<4)&&(c=c.split(a).join(B));for(let a of A)c=c.replace(a,B);return c.replace(/\b[A-Za-z0-9_-]{40,}\b/g,B)}function D(){return(0,g.panomaPath)("ai.json")}function E(){return`${D()}.anterior`}var F=class extends Error{constructor(a,b,c){let d=[`No se pudo leer la configuraci\xf3n de IA en ${a}: ${b.message}`];c?d.push(`Hay una copia anterior en ${c.path} con ${c.keys} clave${1===c.keys?"":"s"} dentro. Recup\xe9rala con:`,` mv ${c.path} ${a}`,"No ejecutes 'panoma ai key' antes: sobrescribir\xeda el fichero y con \xe9l lo que quede."):d.push("No hay copia anterior. \xc1brelo y arr\xe9glalo a mano, o b\xf3rralo si prefieres empezar","de cero — perder\xe1s las claves que hubiera guardadas dentro."),super(d.join("\n"),{cause:b}),this.path=a,this.recovery=c,this.name="ConfigCorruptError"}};async function G(a){let b;try{b=await (0,f.readFile)(a,"utf8")}catch(a){if("ENOENT"===a.code)return;throw a}let c=JSON.parse(b);if(!function(a){if("object"!=typeof a||null===a||Array.isArray(a)||void 0!==a.provider&&"string"!=typeof a.provider||void 0!==a.model&&"string"!=typeof a.model)return!1;let b=a.keys;if(void 0!==b&&("object"!=typeof b||null===b||Array.isArray(b)||Object.values(b).some(a=>"string"!=typeof a)))return!1;let c=a.tokens;return!(void 0!==c&&("object"!=typeof c||null===c||Array.isArray(c)||Object.values(c).some(a=>"object"!=typeof a||null===a||"string"!=typeof a.access)))&&!0}(c))throw Error("el contenido no tiene la forma de una configuraci\xf3n de Panoma");return c}async function H(){let a=D();try{return await G(a)??{}}catch(c){let b=await G(E()).catch(()=>void 0);throw new F(a,c,b?{path:E(),keys:Object.keys(b.keys??{}).length}:void 0)}}async function I(a){let b=D();await (0,f.mkdir)((0,e.dirname)(b),{recursive:!0}),await G(b).catch(()=>void 0)&&await (0,f.copyFile)(b,E()).then(()=>(0,g.j)(E())).catch(()=>{});let c=`${b}.${process.pid}.tmp`,d=`${JSON.stringify(a,null,2)}
|
|
2
2
|
`;try{let a=await (0,f.open)(c,"w",384);try{await a.writeFile(d,"utf8"),await a.sync()}finally{await a.close()}await (0,f.rename)(c,b)}catch(a){throw await (0,f.rm)(c,{force:!0}).catch(()=>{}),a}await (0,g.j)(b),await (0,f.open)((0,e.dirname)(b),"r").then(async a=>{await a.sync().catch(()=>{}),await a.close()}).catch(()=>{}),await J()}async function J(){let a=(0,e.dirname)(D()),b=`${(0,e.basename)(D())}.`;for(let c of(await (0,f.readdir)(a).catch(()=>[]))){if(!c.startsWith(b)||!c.endsWith(".tmp"))continue;let d=Number.parseInt(c.slice(b.length,-4),10);Number.isInteger(d)&&(d!==process.pid&&function(a){try{return process.kill(a,0),!0}catch(a){return"EPERM"===a.code}}(d)||await (0,f.rm)((0,e.join)(a,c),{force:!0}).catch(()=>{}))}}async function K(a){let b=`${D()}.lock`;await (0,f.mkdir)((0,e.dirname)(b),{recursive:!0});let c=Date.now()+3e3;for(;;)try{let a=await (0,f.open)(b,"wx",384);await a.writeFile(`${process.pid}
|
|
3
3
|
`,"utf8").catch(()=>{}),await a.close();break}catch(a){if("EEXIST"!==a.code)throw a;if(Date.now()>c){let c=await (0,f.readFile)(b,"utf8").catch(()=>"");throw Error(`Otro proceso de Panoma est\xe1 escribiendo la configuraci\xf3n${c.trim()?` (pid ${c.trim()})`:""}.
|
|
4
4
|
Si no hay ninguno corriendo, el cerrojo se qued\xf3 de una ejecuci\xf3n anterior:
|