var e={openai:{chat:!0,streaming:!0,json:!0,local:!1,cloud:!0,attachments:!0},openrouter:{chat:!0,streaming:!0,json:!0,local:!1,cloud:!0,attachments:!0},ollama:{chat:!0,streaming:!0,json:!1,local:!0,cloud:!1,attachments:!0},lmstudio:{chat:!0,streaming:!0,json:!0,local:!0,cloud:!1,attachments:!0},anthropic:{chat:!0,streaming:!0,json:!0,local:!1,cloud:!0,attachments:!0},webllm:{chat:!0,streaming:!0,json:!0,local:!0,cloud:!1,attachments:!1}},t=(e=[])=>e.filter(e=>e.base64Data&&e.mimeType.startsWith(`image/`)),n=(e=[])=>e.filter(e=>e.base64Data&&e.mimeType===`application/pdf`),r=e=>{for(let t=e.length-1;t>=0;--t)if(e[t]?.role===`user`)return t;return-1},i=(e,i=[],a={})=>{let o=t(i),s=a.includePdfFiles?n(i):[];if(o.length===0&&s.length===0)return e;let c=e.map(e=>({...e})),l=r(c);l<0&&(c.push({role:`user`,content:`Attached images:`}),l=c.length-1);let u=c[l];return u.content=[{type:`text`,text:(typeof u.content==`string`?u.content:u.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
`))||`Attached images:`},...s.map(e=>({type:`file`,file:{filename:e.name,file_data:`data:application/pdf;base64,${e.base64Data}`}})),...o.map(e=>({type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.base64Data}`}}))],c},a=(e,n=[])=>{let i=t(n);if(i.length===0)return e;let a=e.map(e=>({...e})),o=r(a);return o<0&&(a.push({role:`user`,content:`Attached images:`}),o=a.length-1),a[o]={...a[o],images:i.flatMap(e=>e.base64Data?[e.base64Data]:[])},a},o=(e,i=[])=>{let a=e.filter(e=>e.role===`system`).map(e=>e.content).join(`

`),o=e.filter(e=>e.role!==`system`).map(e=>({role:e.role,content:e.content})),c=t(i),l=n(i);if(c.length>0||l.length>0){let e=r(o);e<0&&(o.push({role:`user`,content:`Attached images:`}),e=o.length-1);let t=o[e];t.content=[{type:`text`,text:(typeof t.content==`string`?t.content:t.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
`))||`Attached images:`},...l.map(e=>({type:`document`,source:{type:`base64`,media_type:`application/pdf`,data:e.base64Data??``},title:e.name})),...c.map(e=>({type:`image`,source:{type:`base64`,media_type:e.mimeType,data:e.base64Data??``}}))]}return o.length===0&&o.push({role:`user`,content:a||`Continue.`}),{...a?{system:a}:{},messages:s(o)}},s=e=>e.reduce((e,t)=>{let n=e.at(-1);return!n||n.role!==t.role?(e.push(t),e):(n.content=[...c(n.content),...c(t.content)],e)},[]),c=e=>typeof e==`string`?[{type:`text`,text:e}]:e;async function*l(e){let t=e.getReader(),n=new TextDecoder,r=``;for(;;){let{done:e,value:i}=await t.read();if(e)break;r+=n.decode(i,{stream:!0});let a=r.indexOf(`
`);for(;a>=0;){let e=r.slice(0,a).trim();r=r.slice(a+1),e&&(yield JSON.parse(e)),a=r.indexOf(`
`)}}let i=r.trim();i&&(yield JSON.parse(i))}var u=e=>typeof e==`string`?e?[e]:[]:Array.isArray(e)?e.map(e=>typeof e==`string`?e:e&&typeof e==`object`&&`text`in e&&typeof e.text==`string`?e.text:``).filter(Boolean):[],d=e=>{try{return JSON.parse(e)}catch{return null}},f=e=>!e||typeof e!=`object`||!(`choices`in e)?[]:(Array.isArray(e.choices)?e.choices:[]).flatMap(e=>{if(!e||typeof e!=`object`)return[];let t=`delta`in e&&e.delta&&typeof e.delta==`object`?e.delta:null,n=`message`in e&&e.message&&typeof e.message==`object`?e.message:null,r=`text`in e?e.text:void 0;return[...u(t?.content),...u(n?.content),...u(r)]}),p=e=>{if(!e||typeof e!=`object`)return[];if(`delta`in e){let t=e.delta;if(t&&typeof t==`object`&&`text`in t&&typeof t.text==`string`)return t.text?[t.text]:[]}return`content`in e?u(e.content):[]};async function*m(e){let t=e.getReader(),n=new TextDecoder,r=``,i=e=>{let t=[],n=e.split(`
`).map(e=>e.trim()).filter(e=>e.startsWith(`data:`));for(let e of n){let n=e.replace(/^data:\s*/,``);if(n===`[DONE]`)return{deltas:t,done:!0};t.push(...f(JSON.parse(n)))}return n.length===0&&t.push(...f(d(e))),{deltas:t,done:!1}};for(;;){let{done:e,value:a}=await t.read();if(e)break;r+=n.decode(a,{stream:!0}).replace(/\r\n/g,`
`),r=r.replace(/\r\n/g,`
`);let o=r.split(`

`);r=o.pop()??``;for(let e of o){let t=i(e);for(let e of t.deltas)yield e;if(t.done)return}}r+=n.decode().replace(/\r\n/g,`
`);let a=r.trim();if(a){let e=i(a);for(let t of e.deltas)yield t}}async function*ee(e){let t=e.getReader(),n=new TextDecoder,r=``,i=e=>{let t=[],n=e.split(`
`).map(e=>e.trim()).filter(e=>e.startsWith(`data:`));for(let e of n){let n=e.replace(/^data:\s*/,``);t.push(...p(JSON.parse(n)))}return n.length===0&&t.push(...p(d(e))),t};for(;;){let{done:e,value:a}=await t.read();if(e)break;r+=n.decode(a,{stream:!0}).replace(/\r\n/g,`
`);let o=r.split(`

`);r=o.pop()??``;for(let e of o)for(let t of i(e))yield t}r+=n.decode().replace(/\r\n/g,`
`);let a=r.trim();if(a)for(let e of i(a))yield e}var h=class extends Error{code;details;constructor(e,t,n){super(t),this.name=`ProviderError`,this.code=e,this.details=n}},g=`2023-06-01`,te=`claude-sonnet-4-6`,ne=class{config;id=`anthropic`;constructor(e){this.config=e}async isAvailable(){return!!this.config.apiKey}async listModels(){if(!this.config.apiKey)return[];let e=await fetch(`https://api.anthropic.com/v1/models`,{headers:{"anthropic-version":g,"x-api-key":this.config.apiKey}});return e.ok?(await e.json()).data?.map(e=>e.id)??[]:this.config.defaultModel?[this.config.defaultModel]:[]}async*chat(e){if(!this.config.apiKey)throw new h(`API_KEY_MISSING`,`Anthropic API key is missing`);let t=e.model??this.config.defaultModel??te,n=await fetch(`https://api.anthropic.com/v1/messages`,{method:`POST`,signal:e.signal??null,headers:{"anthropic-version":g,"content-type":`application/json`,"x-api-key":this.config.apiKey},body:JSON.stringify({model:t,max_tokens:e.maxOutputTokens,stream:!0,temperature:e.temperature??.2,...o(e.messages,e.files)})});if(!n.ok||!n.body)throw new h(`STREAM_FAILED`,`Anthropic error: ${n.status}`);yield{type:`start`,provider:this.id,model:t};for await(let e of ee(n.body))yield{type:`delta`,delta:e};yield{type:`done`}}},re=class{config;id=`lmstudio`;constructor(e){this.config=e}get baseUrl(){return this.config.baseUrl??`http://localhost:1234/v1`}get fetch(){return this.config.fetch??globalThis.fetch.bind(globalThis)}async isAvailable(){try{return(await this.fetch(`${this.baseUrl}/models`)).ok}catch{return!1}}async listModels(){let e=await this.fetch(`${this.baseUrl}/models`);return e.ok?(await e.json()).data?.map(e=>e.id)??[]:[]}async*chat(e){let t=await this.listModels(),n=e.model??this.config.defaultModel??t[0];if(!n)throw new h(`MODEL_UNAVAILABLE`,`No LM Studio model is loaded`);let r=await this.fetch(`${this.baseUrl}/chat/completions`,{method:`POST`,signal:e.signal??null,headers:{"Content-Type":`application/json`},body:JSON.stringify({model:n,messages:i(e.messages,e.files),temperature:e.temperature??.2,max_tokens:e.maxOutputTokens,stream:!0,response_format:e.responseFormat===`json`?{type:`json_object`}:void 0})});if(!r.ok||!r.body)throw new h(`LOCAL_PROVIDER_OFFLINE`,`LM Studio error: ${r.status}`);yield{type:`start`,provider:this.id,model:n};for await(let e of m(r.body))yield{type:`delta`,delta:e};yield{type:`done`}}},ie=()=>{try{let e=globalThis.chrome?.runtime?.id;return e?`chrome-extension://${e}`:`chrome-extension://*`}catch{return`chrome-extension://*`}},_=()=>[`Ollama rejected the request with HTTP 403.`,`Allow the extension origin in OLLAMA_ORIGINS, for example: ${ie()} or chrome-extension://*.`].join(` `),ae=async e=>{try{return(await e.text()).trim()}catch{return``}},oe=class{config;id=`ollama`;constructor(e){this.config=e}get baseUrl(){return this.config.baseUrl??`http://localhost:11434`}get fetch(){return this.config.fetch??globalThis.fetch.bind(globalThis)}async isAvailable(){try{return(await this.fetch(`${this.baseUrl}/api/tags`)).ok}catch{return!1}}async listModels(){let e=await this.fetch(`${this.baseUrl}/api/tags`);if(e.status===403)throw new h(`LOCAL_PROVIDER_OFFLINE`,_(),{status:403});return e.ok?(await e.json()).models?.map(e=>e.name)??[]:[]}async*chat(e){let t=e.model??this.config.defaultModel??(await this.listModels())[0];if(!t)throw new h(`MODEL_UNAVAILABLE`,`No Ollama model is available`);let n=await this.fetch(`${this.baseUrl}/api/chat`,{method:`POST`,signal:e.signal??null,headers:{"Content-Type":`application/json`},body:JSON.stringify({model:t,messages:a(e.messages,e.files),stream:!0,think:e.reasoning===!0,format:e.responseFormat===`json`?`json`:void 0,options:{temperature:e.temperature??.2,num_predict:e.maxOutputTokens}})});if(!n.ok||!n.body){if(n.status===403)throw new h(`LOCAL_PROVIDER_OFFLINE`,_(),{status:403});let e=await ae(n);throw new h(`LOCAL_PROVIDER_OFFLINE`,`Ollama error: ${n.status}${e?` - ${e}`:``}`,{status:n.status,body:e||void 0})}yield{type:`start`,provider:this.id,model:t};let r=!1;for await(let t of l(n.body))e.reasoning===!0&&typeof t.message?.thinking==`string`&&t.message.thinking.length>0&&(yield{type:`delta`,delta:t.message.thinking}),t.message?.content&&(yield{type:`delta`,delta:t.message.content}),typeof t.response==`string`&&t.response.length>0&&(yield{type:`delta`,delta:t.response}),t.done&&(r=!0,yield{type:`done`,usage:{inputTokens:t.prompt_eval_count,outputTokens:t.eval_count,totalTokens:typeof t.prompt_eval_count==`number`&&typeof t.eval_count==`number`?t.prompt_eval_count+t.eval_count:void 0}});r||(yield{type:`done`})}},se=`gpt-5.5`,ce=class{config;id=`openai`;constructor(e){this.config=e}get fetch(){return this.config.fetch??globalThis.fetch.bind(globalThis)}async isAvailable(){return!!this.config.apiKey}async listModels(){if(!this.config.apiKey)return[];let e=await this.fetch(`https://api.openai.com/v1/models`,{headers:{Authorization:`Bearer ${this.config.apiKey}`}});return e.ok?(await e.json()).data?.map(e=>e.id)??[]:this.config.defaultModel?[this.config.defaultModel]:[]}async*chat(e){if(!this.config.apiKey)throw new h(`API_KEY_MISSING`,`OpenAI API key is missing`);let t=e.model??this.config.defaultModel??se,n=await this.fetch(`https://api.openai.com/v1/chat/completions`,{method:`POST`,signal:e.signal??null,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:t,messages:i(e.messages,e.files),temperature:e.temperature??.2,max_completion_tokens:e.maxOutputTokens,stream:!0,response_format:e.responseFormat===`json`?{type:`json_object`}:void 0})});if(!n.ok||!n.body)throw new h(`STREAM_FAILED`,`OpenAI error: ${n.status}`);yield{type:`start`,provider:this.id,model:t};for await(let e of m(n.body))yield{type:`delta`,delta:e};yield{type:`done`}}},v=e=>{let t=typeof e==`number`?e:Number(e);return Number.isFinite(t)?t*1e6:void 0},le=e=>{let t=v(e.pricing?.prompt),n=v(e.pricing?.completion),r=t!==void 0||n!==void 0;return{id:e.id,...r?{pricing:{currency:`USD`,unit:`1M tokens`,...t===void 0?{}:{inputPerMillionUsd:t},...n===void 0?{}:{outputPerMillionUsd:n}}}:{}}},ue=class{config;id=`openrouter`;constructor(e){this.config=e}async isAvailable(){return!!this.config.apiKey}get fetch(){return this.config.fetch??globalThis.fetch.bind(globalThis)}async listModelDetails(){if(!this.config.apiKey)return[];let e=await this.fetch(`https://openrouter.ai/api/v1/models`,{headers:{Authorization:`Bearer ${this.config.apiKey}`}});return e.ok?(await e.json()).data?.map(le)??[]:[]}async listModels(){return(await this.listModelDetails()).map(e=>e.id)}async*chat(e){if(!this.config.apiKey)throw new h(`API_KEY_MISSING`,`OpenRouter API key is missing`);let t=e.model??this.config.defaultModel??`openai/gpt-4o-mini`,n=await this.fetch(`https://openrouter.ai/api/v1/chat/completions`,{method:`POST`,signal:e.signal??null,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify({model:t,messages:i(e.messages,e.files,{includePdfFiles:!0}),temperature:e.temperature??.2,max_tokens:e.maxOutputTokens,stream:!0,response_format:e.responseFormat===`json`?{type:`json_object`}:void 0})});if(!n.ok||!n.body)throw new h(`STREAM_FAILED`,`OpenRouter error: ${n.status}`);yield{type:`start`,provider:this.id,model:t};for await(let e of m(n.body))yield{type:`delta`,delta:e};yield{type:`done`}}},y=`DeepSeek-R1-Distill-Llama-8B-q4f16_1-MLC,DeepSeek-R1-Distill-Llama-8B-q4f32_1-MLC,DeepSeek-R1-Distill-Qwen-7B-q4f16_1-MLC,DeepSeek-R1-Distill-Qwen-7B-q4f32_1-MLC,gemma-2-2b-it-q4f16_1-MLC,gemma-2-2b-it-q4f16_1-MLC-1k,gemma-2-2b-it-q4f32_1-MLC,gemma-2-2b-it-q4f32_1-MLC-1k,gemma-2-2b-jpn-it-q4f16_1-MLC,gemma-2-2b-jpn-it-q4f32_1-MLC,gemma-2-9b-it-q4f16_1-MLC,gemma-2-9b-it-q4f32_1-MLC,gemma-2b-it-q4f16_1-MLC,gemma-2b-it-q4f16_1-MLC-1k,gemma-2b-it-q4f32_1-MLC,gemma-2b-it-q4f32_1-MLC-1k,Hermes-2-Pro-Llama-3-8B-q4f16_1-MLC,Hermes-2-Pro-Llama-3-8B-q4f32_1-MLC,Hermes-2-Pro-Mistral-7B-q4f16_1-MLC,Hermes-2-Theta-Llama-3-8B-q4f16_1-MLC,Hermes-2-Theta-Llama-3-8B-q4f32_1-MLC,Hermes-3-Llama-3.1-8B-q4f16_1-MLC,Hermes-3-Llama-3.1-8B-q4f32_1-MLC,Hermes-3-Llama-3.2-3B-q4f16_1-MLC,Hermes-3-Llama-3.2-3B-q4f32_1-MLC,Llama-2-13b-chat-hf-q4f16_1-MLC,Llama-2-7b-chat-hf-q4f16_1-MLC,Llama-2-7b-chat-hf-q4f16_1-MLC-1k,Llama-2-7b-chat-hf-q4f32_1-MLC,Llama-2-7b-chat-hf-q4f32_1-MLC-1k,Llama-3-70B-Instruct-q3f16_1-MLC,Llama-3-8B-Instruct-q4f16_1-MLC,Llama-3-8B-Instruct-q4f16_1-MLC-1k,Llama-3-8B-Instruct-q4f32_1-MLC,Llama-3-8B-Instruct-q4f32_1-MLC-1k,Llama-3.1-70B-Instruct-q3f16_1-MLC,Llama-3.1-8B-Instruct-q4f16_1-MLC,Llama-3.1-8B-Instruct-q4f16_1-MLC-1k,Llama-3.1-8B-Instruct-q4f32_1-MLC,Llama-3.1-8B-Instruct-q4f32_1-MLC-1k,Llama-3.2-1B-Instruct-q0f16-MLC,Llama-3.2-1B-Instruct-q4f16_1-MLC,Llama-3.2-1B-Instruct-q4f32_1-MLC,Llama-3.2-3B-Instruct-q4f16_1-MLC,Llama-3.2-3B-Instruct-q4f32_1-MLC,Ministral-3-3B-Base-2512-q4f16_1-MLC,Ministral-3-3B-Instruct-2512-BF16-q4f16_1-MLC,Ministral-3-3B-Reasoning-2512-q4f16_1-MLC,Mistral-7B-Instruct-v0.2-q4f16_1-MLC,Mistral-7B-Instruct-v0.3-q4f16_1-MLC,Mistral-7B-Instruct-v0.3-q4f32_1-MLC,NeuralHermes-2.5-Mistral-7B-q4f16_1-MLC,OpenHermes-2.5-Mistral-7B-q4f16_1-MLC,phi-1_5-q4f16_1-MLC,phi-1_5-q4f16_1-MLC-1k,phi-1_5-q4f32_1-MLC,phi-1_5-q4f32_1-MLC-1k,phi-2-q4f16_1-MLC,phi-2-q4f16_1-MLC-1k,phi-2-q4f32_1-MLC,phi-2-q4f32_1-MLC-1k,Phi-3-mini-4k-instruct-q4f16_1-MLC,Phi-3-mini-4k-instruct-q4f16_1-MLC-1k,Phi-3-mini-4k-instruct-q4f32_1-MLC,Phi-3-mini-4k-instruct-q4f32_1-MLC-1k,Phi-3.5-mini-instruct-q4f16_1-MLC,Phi-3.5-mini-instruct-q4f16_1-MLC-1k,Phi-3.5-mini-instruct-q4f32_1-MLC,Phi-3.5-mini-instruct-q4f32_1-MLC-1k,Qwen2-0.5B-Instruct-q0f16-MLC,Qwen2-0.5B-Instruct-q4f16_1-MLC,Qwen2-1.5B-Instruct-q4f16_1-MLC,Qwen2-1.5B-Instruct-q4f32_1-MLC,Qwen2-7B-Instruct-q4f16_1-MLC,Qwen2-7B-Instruct-q4f32_1-MLC,Qwen2-Math-1.5B-Instruct-q4f16_1-MLC,Qwen2-Math-1.5B-Instruct-q4f32_1-MLC,Qwen2-Math-7B-Instruct-q4f16_1-MLC,Qwen2-Math-7B-Instruct-q4f32_1-MLC,Qwen2.5-0.5B-Instruct-q0f16-MLC,Qwen2.5-0.5B-Instruct-q4f16_1-MLC,Qwen2.5-0.5B-Instruct-q4f32_1-MLC,Qwen2.5-1.5B-Instruct-q4f16_1-MLC,Qwen2.5-1.5B-Instruct-q4f32_1-MLC,Qwen2.5-3B-Instruct-q4f16_1-MLC,Qwen2.5-3B-Instruct-q4f32_1-MLC,Qwen2.5-7B-Instruct-q4f16_1-MLC,Qwen2.5-7B-Instruct-q4f32_1-MLC,Qwen2.5-Coder-0.5B-Instruct-q0f16-MLC,Qwen2.5-Coder-0.5B-Instruct-q4f16_1-MLC,Qwen2.5-Coder-0.5B-Instruct-q4f32_1-MLC,Qwen2.5-Coder-1.5B-Instruct-q4f16_1-MLC,Qwen2.5-Coder-1.5B-Instruct-q4f32_1-MLC,Qwen2.5-Coder-3B-Instruct-q4f16_1-MLC,Qwen2.5-Coder-3B-Instruct-q4f32_1-MLC,Qwen2.5-Coder-7B-Instruct-q4f16_1-MLC,Qwen2.5-Coder-7B-Instruct-q4f32_1-MLC,Qwen2.5-Math-1.5B-Instruct-q4f16_1-MLC,Qwen2.5-Math-1.5B-Instruct-q4f32_1-MLC,Qwen3-0.6B-q0f16-MLC,Qwen3-0.6B-q4f16_1-MLC,Qwen3-0.6B-q4f32_1-MLC,Qwen3-1.7B-q4f16_1-MLC,Qwen3-1.7B-q4f32_1-MLC,Qwen3-4B-q4f16_1-MLC,Qwen3-4B-q4f32_1-MLC,Qwen3-8B-q4f16_1-MLC,Qwen3-8B-q4f32_1-MLC,RedPajama-INCITE-Chat-3B-v1-q4f16_1-MLC,RedPajama-INCITE-Chat-3B-v1-q4f16_1-MLC-1k,RedPajama-INCITE-Chat-3B-v1-q4f32_1-MLC,RedPajama-INCITE-Chat-3B-v1-q4f32_1-MLC-1k,SmolLM2-1.7B-Instruct-q4f16_1-MLC,SmolLM2-1.7B-Instruct-q4f32_1-MLC,SmolLM2-135M-Instruct-q0f16-MLC,SmolLM2-135M-Instruct-q0f32-MLC,SmolLM2-360M-Instruct-q0f16-MLC,SmolLM2-360M-Instruct-q0f32-MLC,SmolLM2-360M-Instruct-q4f16_1-MLC,SmolLM2-360M-Instruct-q4f32_1-MLC,stablelm-2-zephyr-1_6b-q4f16_1-MLC,stablelm-2-zephyr-1_6b-q4f16_1-MLC-1k,stablelm-2-zephyr-1_6b-q4f32_1-MLC,stablelm-2-zephyr-1_6b-q4f32_1-MLC-1k,TinyLlama-1.1B-Chat-v0.4-q4f16_1-MLC,TinyLlama-1.1B-Chat-v0.4-q4f16_1-MLC-1k,TinyLlama-1.1B-Chat-v0.4-q4f32_1-MLC,TinyLlama-1.1B-Chat-v0.4-q4f32_1-MLC-1k,TinyLlama-1.1B-Chat-v1.0-q4f16_1-MLC,TinyLlama-1.1B-Chat-v1.0-q4f16_1-MLC-1k,TinyLlama-1.1B-Chat-v1.0-q4f32_1-MLC,TinyLlama-1.1B-Chat-v1.0-q4f32_1-MLC-1k,WizardMath-7B-V1.1-q4f16_1-MLC`.split(`,`),de=class{config;id=`webllm`;constructor(e){this.config=e}async isAvailable(){return this.config?.enabled?this.config.runtime?this.config.runtime.isAvailable():!!(globalThis.navigator&&`gpu`in globalThis.navigator):!1}async listModels(){return[...y]}async*chat(e){if(!this.config?.enabled)throw new h(`PROVIDER_UNAVAILABLE`,`WebLLM is disabled`);if(!this.config.runtime)throw new h(`PROVIDER_UNAVAILABLE`,`WebLLM runtime is unavailable in this extension context`);let t=e.model??this.config.defaultModel??y[0];yield*this.config.runtime.chat({...e,model:t})}},b=[`localhost`,`127.0.0.1`,`gallego.top`,`edu.xunta.gal`,`www.edu.xunta.gal`,`fhpgkaopgjjlblhieaehgcmgpmkjlkim`,`bfgfpghdohngenakhppednpfgaddoojp`],x=[`openrouter`,`openai`,`ollama`,`lmstudio`,`anthropic`,`webllm`],fe=[`es`,`en`,`fr`,`de`,`pt`,`gl`,`ca`,`eu`],pe={es:`Español`,en:`English`,fr:`Français`,de:`Deutsch`,pt:`Português`,gl:`Galego`,ca:`Català`,eu:`Euskara`},me={8364:128,8218:130,402:131,8222:132,8230:133,8224:134,8225:135,710:136,8240:137,352:138,8249:139,338:140,381:142,8216:145,8217:146,8220:147,8221:148,8226:149,8211:150,8212:151,732:152,8482:153,353:154,8250:155,339:156,382:158,376:159},S=e=>{if(!/[ÃÂâ]/.test(e))return e;let t=Array.from(e,e=>{let t=e.codePointAt(0)??0;return me[t]??t});return t.some(e=>e>255)?e:new TextDecoder().decode(new Uint8Array(t))},he=e=>S(pe[e]??e),C=e=>e,ge={en:C({loading:`Loading...`,savingChanges:`Saving changes...`,refreshingProviders:`Refreshing providers...`,loadingCapabilities:`Loading capabilities...`,loadingFiles:`Reading files...`,aiTab:`AI`,authorizedTab:`Authorized`,settingsTab:`Settings`,providersTab:`Providers`,testTab:`Test`,callersTab:`Authorized`,auditTab:`Audit Log`,refreshProviderSnapshot:`Refresh provider snapshot`,runtimeGatewayConfiguration:`AI Runtime configuration`,runtimeGatewayDescription:`Tune cloud and local providers, authorize trusted sites or extension IDs, and review runtime activity from one operational surface.`,providersOnline:`Providers online`,authorizedCallers:`Authorized`,latestCall:`Latest call`,snapshot:`Snapshot`,noTraffic:`No traffic`,providerSummaryLoading:`Loading providers...`,providerOnline:`online`,providerOffline:`offline`,downloadedLabel:`downloaded`,notDownloadedLabel:`not downloaded`,unknownSizeLabel:`unknown size`,testingProvider:`Testing...`,availableWithModels:`Available ({count} models detected)`,unavailable:`Unavailable`,providerEnabledHint:`Controls whether this provider can be inspected, shown, or selected by the runtime.`,selectDetectedModel:`Select detected model`,defaultModelPlaceholder:`Default model`,addCallerPrompt:`Site hostname or extension ID to authorize. Protocol and port are ignored.`,providerCardOpenai:`Direct OpenAI API provider with model discovery, streaming, and image input.`,providerCardOpenrouter:`Unified cloud endpoint with model discovery and streaming.`,providerCardOllama:`Local daemon on your machine using the internal CORS proxy and native /api/chat interface.`,providerCardLmstudio:`OpenAI-compatible local server for loaded desktop models.`,providerCardAnthropic:`Direct Claude Messages API provider with streaming, image input, and PDF document input.`,providerCardWebllm:`Local browser-runtime inference powered by WebGPU and the prebuilt WebLLM catalog.`,apiKey:`API key`,apiKeyStoredHint:`Stored only in chrome.storage.local.`,defaultModel:`Default model`,openaiDefaultModelHint:`Select from the models exposed by your OpenAI account.`,openrouterDefaultModelHint:`Select from the models exposed by your account.`,refreshModels:`Refresh models`,baseUrl:`Base URL`,ollamaBaseUrlHint:`Default is http://localhost:11434.`,ollamaDefaultModelHint:"Pulled from `/api/tags` when Ollama is reachable.",lmstudioBaseUrlHint:`Default is http://localhost:1234/v1.`,lmstudioDefaultModelHint:"Loaded from the `/models` endpoint when reachable.",anthropicApiHint:`Stored only in chrome.storage.local.`,anthropicModelHint:`Select from the models exposed by your Anthropic account.`,refreshStatus:`Refresh status`,webllmDefaultModelHint:"Drawn from the prebuilt `@mlc-ai/web-llm` model list available in this build.",refreshCatalog:`Refresh catalog`,authorizedCallersTitle:`Authorized`,authorizedCallersDescription:`Trusted site hostnames or extension IDs that can use the AI runtime. Protocol and port are ignored.`,defaultCaller:`Default`,addCaller:`Add authorized`,connectionPolicyDescription:`Connection policy for this authorized site or extension.`,remove:`Remove`,enabled:`Enabled`,enabledHint:`Disable this authorized entry without deleting the rest of its limits and provider choices.`,availableProviders:`Available providers`,availableProvidersHint:`Check the AI providers this authorized entry may request.`,allowedProvidersTitle:`Allowed providers`,defaultProvider:`Default provider`,autoProvider:`Automatic provider`,appDefaultsTitle:`App defaults`,appDefaultsDescription:`Saved provider and model choices per authorized origin and app id.`,noAppDefaults:`No app defaults saved yet.`,noProviderDefault:`No provider default`,readyToUse:`Ready to use`,maxInputChars:`Max input chars`,maxInputCharsHint:`Hard ceiling for total request content.`,maxOutputTokens:`Max output tokens`,maxOutputTokensHint:`Cap passed to providers when supported.`,aiSettingsTitle:`AI audit settings`,aiSettingsDescription:`AI requests do not have extension-level input, output, or execution time limits.`,storeAuditContent:`Store prompt and response content`,storeAuditContentHint:`When disabled, audit entries keep metadata, files, usage, and errors, but not prompt or response text.`,aiResetDefaults:`Reset AI defaults`,aiTestTitle:`AI test request`,aiTestDescription:`Send a direct test prompt through the configured runtime and inspect the response.`,testPromptLabel:`Prompt`,testProviderLabel:`Provider`,testProviderAuto:`Auto-select provider`,testModelLabel:`Model`,testAttachmentsLabel:`Attachments`,testAttachmentsHint:`Images and PDFs are sent as native files when the provider supports them; text files are sent as content.`,testTooManyFiles:`You can attach up to {count} files.`,testFileTooLarge:`{name} exceeds the file size limit.`,testFileReadError:`Could not read the selected file.`,testAllowCloudHint:`Lets this test use cloud providers when the general policy allows them.`,testRun:`Run test`,testRunning:`Running...`,testErrorTitle:`Request error`,auditLogTitle:`Audit Log`,auditLogDescription:`Latest 20 calls with expandable request and response details.`,clearAuditLog:`Clear audit log`,date:`Date`,app:`App`,origin:`Origin`,provider:`Provider`,model:`Model`,inputChars:`Input chars`,outputChars:`Output chars`,duration:`Duration`,speed:`Speed`,status:`Status`,requestDetails:`Request details`,responseDetails:`Response details`,messagesLabel:`Messages`,filesLabel:`Files`,responseFormatLabel:`Format`,reasoningLabel:`Reasoning`,errorCodeLabel:`Error code`,errorMessageLabel:`Error message`,usageLabel:`Usage`,noRequestBody:`No request body recorded.`,noResponseBody:`No response body recorded.`,language:`Language`,noCallsRecorded:`No calls recorded yet.`,launcherTitleAuthorized:`Authorized on {origin}. Providers: {providers}`,launcherTitleAuthorizedNoProviders:`Authorized on {origin}, but no providers are available.`,launcherTitleUnauthorized:`This site or extension is not authorized yet. Open Settings and authorize {origin}.`,launcherTitleOffline:`The extension is loaded but this page could not read its runtime status.`,launcherOpenOptionsFailed:`Could not open extension options.`,launcherStatusFailed:`The extension did not return a runtime status.`,launcherReadStatusFailed:`Could not read extension status.`,launcherOffline:`Offline`,launcherNoModel:`No model`,launcherNoProviders:`No providers`,launcherSetup:`Setup`,launcherAuto:`Auto`,launcherDefaultModel:`Default model`,launcherSelectProvider:`Select provider`,launcherOpenSettings:`Open full settings`,aiLabel:`AI`})},_e=[`fr`,`de`,`pt`,`gl`,`ca`,`eu`],ve={loading:[`Chargement...`,`Wird geladen...`,`A carregar...`,`Cargando...`,`Carregant...`,`Kargatzen...`],savingChanges:[`Enregistrement...`,`Speichere...`,`A guardar...`,`Gardando...`,`Desant...`,`Gordetzen...`],refreshingProviders:[`Actualisation des fournisseurs...`,`Provider werden aktualisiert...`,`A atualizar fornecedores...`,`Actualizando provedores...`,`Actualitzant proveidors...`,`Hornitzaileak eguneratzen...`],loadingCapabilities:[`Chargement des capacites...`,`Fahigkeiten werden geladen...`,`A carregar capacidades...`,`Cargando capacidades...`,`Carregant capacitats...`,`Gaitasunak kargatzen...`],loadingFiles:[`Lecture des fichiers...`,`Dateien werden gelesen...`,`A ler ficheiros...`,`Lendo arquivos...`,`Llegint fitxers...`,`Fitxategiak irakurtzen...`],aiTab:[`IA`,`KI`,`IA`,`IA`,`IA`,`IA`],authorizedTab:[`Autorisés`,`Autorisiert`,`Autorizados`,`Autorizados`,`Autoritzats`,`Baimenduak`],settingsTab:[`Paramètres`,`Einstellungen`,`Definições`,`Configuración`,`Configuració`,`Ezarpenak`],providersTab:[`Fournisseurs`,`Provider`,`Fornecedores`,`Provedores`,`Proveïdors`,`Hornitzaileak`],testTab:[`Test`,`Test`,`Teste`,`Proba`,`Prova`,`Proba`],callersTab:[`Autorisés`,`Autorisiert`,`Autorizados`,`Autorizados`,`Autoritzats`,`Baimenduak`],auditTab:[`Journal d’audit`,`Auditprotokoll`,`Auditoria`,`Auditoría`,`Auditoria`,`Auditoria`],refreshProviderSnapshot:[`Actualiser l’état des fournisseurs`,`Provider-Status aktualisieren`,`Atualizar estado dos fornecedores`,`Actualizar estado dos provedores`,`Actualitza l’estat dels proveïdors`,`Eguneratu hornitzaileen egoera`],runtimeGatewayConfiguration:[`Configuration de AI Runtime`,`AI Runtime-Konfiguration`,`Configuração do AI Runtime`,`Configuración de AI Runtime`,`Configuració d’AI Runtime`,`AI Runtime konfigurazioa`],runtimeGatewayDescription:[`Ajustez les fournisseurs locaux et cloud, autorisez les sites ou extensions de confiance et configurez le runtime depuis une seule interface.`,`Lokale und Cloud-Provider konfigurieren, vertrauenswürdige Websites oder Erweiterungen autorisieren und die Runtime zentral einrichten.`,`Ajusta fornecedores locais e na cloud, autoriza sites ou extensões de confiança e configura a runtime numa única superfície.`,`Axusta provedores locais e na nube, autoriza sitios ou extensións de confianza e configura o runtime nunha única superficie.`,`Ajusta proveïdors locals i al núvol, autoritza llocs o extensions de confiança i configura el runtime des d’una sola superfície.`,`Doitu tokiko eta hodeiko hornitzaileak, baimendu konfiantzazko webguneak edo hedapenak eta konfiguratu runtimea azalera bakar batean.`],providersOnline:[`Fournisseurs en ligne`,`Provider online`,`Fornecedores ativos`,`Provedores activos`,`Proveïdors actius`,`Hornitzaile aktiboak`],authorizedCallers:[`Autorisés`,`Autorisiert`,`Autorizados`,`Autorizados`,`Autoritzats`,`Baimenduak`],latestCall:[`Dernier appel`,`Letzter Aufruf`,`Última chamada`,`Última chamada`,`Darrera crida`,`Azken deia`],snapshot:[`Résumé`,`Übersicht`,`Resumo`,`Resumo`,`Resum`,`Laburpena`],noTraffic:[`Aucun trafic`,`Kein Verkehr`,`Sem tráfego`,`Sen tráfico`,`Sense trànsit`,`Trafikorik ez`],providerSummaryLoading:[`Chargement des fournisseurs...`,`Provider werden geladen...`,`A carregar fornecedores...`,`Cargando provedores...`,`Carregant proveïdors...`,`Hornitzaileak kargatzen...`],providerOnline:[`en ligne`,`online`,`ativo`,`activo`,`actiu`,`aktibo`],providerOffline:[`hors ligne`,`offline`,`inativo`,`inactivo`,`inactiu`,`ez aktibo`],downloadedLabel:[`téléchargé`,`heruntergeladen`,`transferido`,`descargado`,`descarregat`,`deskargatuta`],notDownloadedLabel:[`non téléchargé`,`nicht heruntergeladen`,`não transferido`,`non descargado`,`no descarregat`,`deskargatu gabe`],unknownSizeLabel:[`taille inconnue`,`unbekannte Größe`,`tamanho desconhecido`,`tamaño descoñecido`,`mida desconeguda`,`tamaina ezezaguna`],testingProvider:[`Test en cours...`,`Wird geprüft...`,`A testar...`,`Probando...`,`S’està provant...`,`Probatzen...`],availableWithModels:[`Disponible ({count} modèles détectés)`,`Verfügbar ({count} Modelle erkannt)`,`Disponível ({count} modelos detetados)`,`Dispoñible ({count} modelos detectados)`,`Disponible ({count} models detectats)`,`Eskuragarri ({count} modelo detektatu dira)`],unavailable:[`Indisponible`,`Nicht verfügbar`,`Indisponível`,`Non dispoñible`,`No disponible`,`Ez dago erabilgarri`],providerEnabledHint:[`Contrôle si ce fournisseur peut être inspecté, affiché ou sélectionné par le runtime.`,`Steuert, ob dieser Provider vom Runtime geprüft, angezeigt oder ausgewählt werden kann.`,`Controla se este fornecedor pode ser inspecionado, mostrado ou selecionado pelo runtime.`,`Controla se este provedor pode inspeccionarse, mostrarse ou seleccionarse no runtime.`,`Controla si aquest proveïdor es pot inspeccionar, mostrar o seleccionar al runtime.`,`Hornitzaile hau runtimeak ikus, azter edo hauta dezakeen kontrolatzen du.`],selectDetectedModel:[`Sélectionner un modèle détecté`,`Erkanntes Modell auswählen`,`Selecionar modelo detetado`,`Selecciona un modelo detectado`,`Selecciona un model detectat`,`Hautatu detektatutako modeloa`],defaultModelPlaceholder:[`Modèle par défaut`,`Standardmodell`,`Modelo predefinido`,`Modelo por defecto`,`Model per defecte`,`Modelo lehenetsia`],addCallerPrompt:[`Nom d’hôte du site ou ID de l’extension à autoriser. Le protocole et le port sont ignorés.`,`Hostname der Website oder Erweiterungs-ID, die autorisiert werden soll. Protokoll und Port werden ignoriert.`,`Hostname do site ou ID da extensão a autorizar. O protocolo e a porta são ignorados.`,`Hostname do sitio ou ID da extensión que queres autorizar. Ignóranse protocolo e porto.`,`Nom d’host del lloc o ID de l’extensió que vols autoritzar. S’ignoren protocol i port.`,`Baimendu nahi duzun webgunearen host izena edo hedapenaren IDa. Protokoloa eta ataka ez dira kontuan hartzen.`],providerCardOpenrouter:[`Point de terminaison cloud unifié avec découverte de modèles et streaming.`,`Einheitlicher Cloud-Endpunkt mit Modellerkennung und Streaming.`,`Endpoint cloud unificado com descoberta de modelos e streaming.`,`Endpoint unificado na nube con descubrimento de modelos e streaming.`,`Endpoint al núvol unificat amb descobriment de models i streaming.`,`Hodeiko endpoint bateratua, modeloen aurkikuntza eta streamingarekin.`],providerCardOpenai:[`Fournisseur direct de l API OpenAI avec découverte de modèles, streaming et images.`,`Direkter OpenAI API-Provider mit Modellerkennung, Streaming und Bildeingabe.`,`Fornecedor direto da API OpenAI com descoberta de modelos, streaming e imagens.`,`Provedor directo da API OpenAI con descubrimento de modelos, streaming e imaxes.`,`Proveïdor directe de l API OpenAI amb descobriment de models, streaming i imatges.`,`OpenAI API hornitzaile zuzena, modeloen aurkikuntzarekin, streamingarekin eta irudiekin.`],providerCardOllama:[`Daemon local sur votre machine utilisant l’interface native /api/chat.`,`Lokaler Dienst auf Ihrem Rechner mit der nativen /api/chat-Schnittstelle.`,`Daemon local na sua máquina com a interface nativa /api/chat.`,`Daemon local na túa máquina usando a interface nativa /api/chat.`,`Daemon local a la teva màquina amb la interfície nativa /api/chat.`,`Zure makinan dagoen daemon lokala, /api/chat interfaze natiboa erabiliz.`],providerCardLmstudio:[`Serveur local compatible OpenAI pour les modèles chargés sur le bureau.`,`OpenAI-kompatibler lokaler Server für geladene Desktop-Modelle.`,`Servidor local compatível com OpenAI para modelos carregados no desktop.`,`Servidor local compatible con OpenAI para modelos cargados no escritorio.`,`Servidor local compatible amb OpenAI per a models carregats a l’escriptori.`,`OpenAIrekin bateragarria den zerbitzari lokala, mahaigainean kargatutako modeloetarako.`],providerCardAnthropic:[`Fournisseur direct Claude Messages API avec streaming, images et documents PDF.`,`Direkter Claude Messages API-Provider mit Streaming, Bildeingabe und PDF-Dokumenten.`,`Fornecedor direto da Claude Messages API com streaming, imagens e documentos PDF.`,`Provedor directo da Claude Messages API con streaming, imaxes e documentos PDF.`,`Proveïdor directe de Claude Messages API amb streaming, imatges i documents PDF.`,`Claude Messages API hornitzaile zuzena, streamingarekin, irudiekin eta PDF dokumentuekin.`],providerCardWebllm:[`Inférence locale dans le navigateur avec WebGPU et le catalogue WebLLM précompilé.`,`Lokale Browser-Inferenz mit WebGPU und dem vorkompilierten WebLLM-Katalog.`,`Inferência local no navegador com WebGPU e o catálogo WebLLM pré-compilado.`,`Inferencia local no navegador con WebGPU e o catálogo WebLLM precompilado.`,`Inferència local al navegador amb WebGPU i el catàleg WebLLM precompilat.`,`Arakatzaileko inferentzia lokala WebGPUrekin eta WebLLM katalogo aurrekonpilatuarekin.`],apiKey:[`Clé API`,`API-Schlüssel`,`Chave API`,`Chave API`,`Clau API`,`API gakoa`],apiKeyStoredHint:[`Stockée uniquement dans chrome.storage.local.`,`Nur in chrome.storage.local gespeichert.`,`Guardada apenas em chrome.storage.local.`,`Gardada só en chrome.storage.local.`,`Desada només a chrome.storage.local.`,`chrome.storage.local-en bakarrik gordetzen da.`],defaultModel:[`Modèle par défaut`,`Standardmodell`,`Modelo predefinido`,`Modelo por defecto`,`Model per defecte`,`Modelo lehenetsia`],openrouterDefaultModelHint:[`Sélectionnez parmi les modèles exposés par votre compte.`,`Wählen Sie aus den von Ihrem Konto bereitgestellten Modellen.`,`Selecione entre os modelos expostos pela sua conta.`,`Selecciona entre os modelos expostos pola túa conta.`,`Selecciona entre els models exposats pel teu compte.`,`Hautatu zure kontuak erakusten dituen modeloen artean.`],openaiDefaultModelHint:[`Sélectionnez parmi les modèles exposés par votre compte OpenAI.`,`Wählen Sie aus den von Ihrem OpenAI-Konto bereitgestellten Modellen.`,`Selecione entre os modelos expostos pela sua conta OpenAI.`,`Selecciona entre os modelos expostos pola túa conta de OpenAI.`,`Selecciona entre els models exposats pel teu compte d OpenAI.`,`Hautatu zure OpenAI kontuak erakusten dituen modeloen artean.`],refreshModels:[`Actualiser les modèles`,`Modelle aktualisieren`,`Atualizar modelos`,`Actualizar modelos`,`Actualitza models`,`Eguneratu modeloak`],baseUrl:[`URL de base`,`Basis-URL`,`URL base`,`URL base`,`URL base`,`Oinarrizko URLa`],ollamaBaseUrlHint:[`Par défaut : http://localhost:11434.`,`Standard ist http://localhost:11434.`,`A predefinição é http://localhost:11434.`,`Por defecto é http://localhost:11434.`,`Per defecte és http://localhost:11434.`,`Lehenetsia http://localhost:11434 da.`],ollamaDefaultModelHint:["Récupéré depuis `/api/tags` lorsque Ollama est accessible.","Wird aus `/api/tags` gelesen, wenn Ollama erreichbar ist.","Obtido de `/api/tags` quando o Ollama está acessível.","Obtido de `/api/tags` cando Ollama está accesible.","S’obté de `/api/tags` quan Ollama és accessible.","Ollama eskuragarri dagoenean `/api/tags`-etik hartzen da."],lmstudioBaseUrlHint:[`Par défaut : http://localhost:1234/v1.`,`Standard ist http://localhost:1234/v1.`,`A predefinição é http://localhost:1234/v1.`,`Por defecto é http://localhost:1234/v1.`,`Per defecte és http://localhost:1234/v1.`,`Lehenetsia http://localhost:1234/v1 da.`],lmstudioDefaultModelHint:["Chargé depuis `/models` lorsque le serveur est accessible.","Wird vom `/models`-Endpunkt geladen, wenn er erreichbar ist.","Carregado do endpoint `/models` quando está acessível.","Cargado desde `/models` cando está accesible.","Es carrega des de `/models` quan és accessible.","Eskuragarri dagoenean `/models` endpointetik kargatzen da."],anthropicApiHint:[`Stockée uniquement dans chrome.storage.local.`,`Nur in chrome.storage.local gespeichert.`,`Guardada apenas em chrome.storage.local.`,`Gardada só en chrome.storage.local.`,`Desada només a chrome.storage.local.`,`chrome.storage.local-en bakarrik gordetzen da.`],anthropicModelHint:[`Sélectionnez parmi les modèles exposés par votre compte Anthropic.`,`Wählen Sie aus den von Ihrem Anthropic-Konto bereitgestellten Modellen.`,`Selecione entre os modelos expostos pela sua conta Anthropic.`,`Selecciona entre os modelos expostos pola túa conta de Anthropic.`,`Selecciona entre els models exposats pel teu compte d’Anthropic.`,`Hautatu zure Anthropic kontuak erakusten dituen modeloen artean.`],refreshStatus:[`Actualiser l’état`,`Status aktualisieren`,`Atualizar estado`,`Actualizar estado`,`Actualitza estat`,`Eguneratu egoera`],webllmDefaultModelHint:["Issu de la liste précompilée `@mlc-ai/web-llm` disponible dans cette build.","Aus der in diesem Build verfügbaren vorkompilierten `@mlc-ai/web-llm`-Modellliste.","Retirado da lista pré-compilada `@mlc-ai/web-llm` disponível nesta build.","Saído da lista precompilada `@mlc-ai/web-llm` dispoñible nesta build.","Extret de la llista precompilada `@mlc-ai/web-llm` disponible en aquesta build.","Build honetan eskuragarri dagoen `@mlc-ai/web-llm` zerrenda aurrekonpilatutik aterata."],refreshCatalog:[`Actualiser le catalogue`,`Katalog aktualisieren`,`Atualizar catálogo`,`Actualizar catálogo`,`Actualitza catàleg`,`Eguneratu katalogoa`],authorizedCallersTitle:[`Autorisés`,`Autorisiert`,`Autorizados`,`Autorizados`,`Autoritzats`,`Baimenduak`],authorizedCallersDescription:[`Noms d’hôte de sites ou IDs d’extensions de confiance pouvant se connecter au runtime. Le protocole et le port sont ignorés.`,`Vertrauenswürdige Site-Hostnames oder Erweiterungs-IDs, die sich mit dem Runtime verbinden dürfen. Protokoll und Port werden ignoriert.`,`Hostnames de sites ou IDs de extensões de confiança que podem ligar ao runtime. O protocolo e a porta são ignorados.`,`Hostnames de sitios ou IDs de extensións de confianza que poden conectarse ao runtime. Ignóranse protocolo e porto.`,`Noms d’host de llocs o IDs d’extensions de confiança que poden connectar-se al runtime. S’ignoren protocol i port.`,`Runtimearekin konekta daitezkeen konfiantzazko webguneen host izenak edo hedapen IDak. Protokoloa eta ataka ez dira kontuan hartzen.`],defaultCaller:[`Par défaut`,`Standard`,`Predefinido`,`Por defecto`,`Per defecte`,`Lehenetsia`],addCaller:[`Ajouter autorisé`,`Autorisierten hinzufügen`,`Adicionar autorizado`,`Engadir autorizado`,`Afegeix autoritzat`,`Gehitu baimendua`],connectionPolicyDescription:[`Politique de connexion pour ce site ou cette extension autorisée.`,`Verbindungsrichtlinie für diese autorisierte Website oder Erweiterung.`,`Política de ligação para este site ou extensão autorizada.`,`Política de conexión para este sitio ou extensión autorizada.`,`Política de connexió per a aquest lloc o extensió autoritzada.`,`Baimendutako webgune edo hedapen honen konexio-politika.`],remove:[`Supprimer`,`Entfernen`,`Remover`,`Eliminar`,`Elimina`,`Kendu`],enabled:[`Activé`,`Aktiviert`,`Ativado`,`Activado`,`Activat`,`Gaituta`],enabledHint:[`Désactive cette entrée autorisée sans supprimer ses limites ni ses choix de fournisseurs.`,`Deaktiviert diesen autorisierten Eintrag, ohne seine Limits oder Provider-Auswahl zu löschen.`,`Desativa esta entrada autorizada sem apagar os seus limites nem escolhas de fornecedores.`,`Desactiva esta entrada autorizada sen borrar os seus límites nin escollas de provedores.`,`Desactiva aquesta entrada autoritzada sense esborrar-ne els límits ni les opcions de proveïdor.`,`Sarrera baimendu hau desgaitzen du, bere mugak eta hornitzaile aukerak ezabatu gabe.`],availableProviders:[`Fournisseurs disponibles`,`Verfügbare Provider`,`Fornecedores disponíveis`,`Provedores dispoñibles`,`Proveïdors disponibles`,`Hornitzaile eskuragarriak`],allowedProvidersTitle:[`Fournisseurs autorises`,`Erlaubte Provider`,`Fornecedores permitidos`,`Provedores permitidos`,`Proveidors permesos`,`Baimendutako hornitzaileak`],defaultProvider:[`Fournisseur par defaut`,`Standard-Provider`,`Fornecedor predefinido`,`Provedor por defecto`,`Proveidor per defecte`,`Hornitzaile lehenetsia`],autoProvider:[`Fournisseur automatique`,`Automatischer Provider`,`Fornecedor automatico`,`Provedor automatico`,`Proveidor automatic`,`Hornitzaile automatikoa`],appDefaultsTitle:[`Valeurs par app`,`App-Standardwerte`,`Defaults por app`,`Defaults por app`,`Valors per app`,`Apparen lehenetsiak`],appDefaultsDescription:[`Choix de fournisseur et modele enregistres par origine autorisee et app.id.`,`Gespeicherte Provider- und Modellwahl je autorisiertem Ursprung und app.id.`,`Fornecedor e modelo guardados por origem autorizada e app.id.`,`Provedor e modelo gardados por orixe autorizada e app.id.`,`Proveidor i model desats per origen autoritzat i app.id.`,`Baimendutako jatorri eta app.id bakoitzeko hornitzaile eta modelo aukerak.`],noAppDefaults:[`Aucune valeur par app enregistree.`,`Noch keine App-Standardwerte gespeichert.`,`Ainda nao ha defaults por app guardados.`,`Ainda non hai defaults por app gardados.`,`Encara no hi ha valors per app desats.`,`Oraindik ez dago app lehenetsirik gordeta.`],noProviderDefault:[`Aucun fournisseur par defaut`,`Kein Standard-Provider`,`Sem fornecedor predefinido`,`Sen provedor por defecto`,`Sense proveidor per defecte`,`Hornitzaile lehenetsirik ez`],availableProvidersHint:[`Vérifiez les fournisseurs que cette entrée autorisée peut demander via le runtime.`,`Prüfen Sie die Provider, die dieser autorisierte Eintrag über das Runtime anfordern darf.`,`Verifique os fornecedores que esta entrada autorizada pode pedir através do runtime.`,`Marca os provedores que este autorizado pode pedir a través do runtime.`,`Marca els proveïdors que aquesta entrada autoritzada pot demanar a través del runtime.`,`Egiaztatu baimendu honek runtimearen bidez eska ditzakeen hornitzaileak.`],readyToUse:[`Prêt à utiliser`,`Einsatzbereit`,`Pronto a usar`,`Listo para usar`,`A punt per usar`,`Erabiltzeko prest`],maxInputChars:[`Caractères d’entrée max.`,`Max. Eingabezeichen`,`Máx. caracteres de entrada`,`Máx. caracteres de entrada`,`Màx. caràcters d’entrada`,`Sarrerako karaktere gehienez`],maxInputCharsHint:[`Plafond strict pour le contenu total de la requête.`,`Harte Obergrenze für den gesamten Anfrageinhalt.`,`Limite rígido para o conteúdo total do pedido.`,`Límite duro para o contido total da solicitude.`,`Límit estricte per al contingut total de la sol·licitud.`,`Eskaeraren eduki osoarentzako muga zorrotza.`],maxOutputTokens:[`Tokens de sortie max.`,`Max. Ausgabetokens`,`Máx. tokens de saída`,`Máx. tokens de saída`,`Màx. tokens de sortida`,`Irteerako token gehienez`],maxOutputTokensHint:[`Limite transmise aux fournisseurs lorsqu’ils la prennent en charge.`,`Limit, das an Provider übergeben wird, wenn unterstützt.`,`Limite enviado aos fornecedores quando suportado.`,`Límite que se pasa ao provedor cando o soporta.`,`Límit que es passa als proveïdors quan és compatible.`,`Onartzen denean hornitzaileei pasatzen zaien muga.`],aiSettingsTitle:[`Paramètres des requêtes IA`,`KI-Anfrageeinstellungen`,`Definições de pedidos IA`,`Configuración de peticións IA`,`Configuració de peticions IA`,`IA eskaeren ezarpenak`],aiSettingsDescription:[`Limites globales du runtime appliquées à chaque origine autorisée. L’activation des fournisseurs reste dans chaque carte.`,`Globale Runtime-Limits für jeden autorisierten Ursprung. Provider-Aktivierung bleibt in den jeweiligen Karten.`,`Limites globais do runtime aplicados a cada origem autorizada. A ativação de fornecedores fica em cada cartão.`,`Límites globais do runtime aplicados a cada orixe autorizada. A activación de provedores queda en cada tarxeta.`,`Límits globals del runtime aplicats a cada origen autoritzat. L’activació de proveïdors queda a cada targeta.`,`Jatorri baimendu guztiei aplikatzen zaizkien runtime muga globalak. Hornitzaileen gaitzea txartel bakoitzean geratzen da.`],aiRequestTimeout:[`Délai max. requête IA (secondes)`,`KI-Anfrage-Timeout (Sekunden)`,`Timeout de pedido IA (segundos)`,`Tempo máximo de petición IA (segundos)`,`Temps màxim de petició IA (segons)`,`IA eskaeraren denbora-muga (segundoak)`],aiRequestTimeoutHint:[`Temps maximal pour une vraie requête IA avant que le runtime ne l’annule.`,`Maximale Zeit für eine echte KI-Anfrage, bevor das Runtime sie abbricht.`,`Tempo máximo de um pedido IA real antes de o runtime o abortar.`,`Tempo máximo dunha petición IA real antes de que o runtime a aborte.`,`Temps màxim d’una petició IA real abans que el runtime l’avorti.`,`Benetako IA eskaera bat runtimeak abortatu aurretik duen gehieneko denbora.`],storeAuditContent:[`Stocker le contenu prompt/reponse`,`Prompt- und Antwortinhalt speichern`,`Guardar conteudo do prompt e resposta`,`Gardar contido de prompt e resposta`,`Desa contingut de prompt i resposta`,`Gorde prompt eta erantzun edukia`],storeAuditContentHint:[`Desactive, audit conserve metadonnees, fichiers, usage et erreurs, mais pas texte.`,`Deaktiviert speichert Audit Metadaten, Dateien, Nutzung und Fehler, aber keinen Text.`,`Desativado, auditoria guarda metadados, ficheiros, uso e erros, mas nao texto.`,`Desactivado, auditoria garda metadatos, arquivos, uso e erros, pero non texto.`,`Desactivat, auditoria desa metadades, fitxers, us i errors, pero no text.`,`Desgaituta, auditoretzak metadatuak, fitxategiak, erabilera eta erroreak gordetzen ditu, baina ez testua.`],aiResetDefaults:[`Réinitialiser l’IA`,`KI-Standardwerte zurücksetzen`,`Repor valores IA`,`Restaurar valores IA`,`Restaura valors IA`,`Berrezarri IA balio lehenetsiak`],aiTestTitle:[`Requête de test IA`,`KI-Testanfrage`,`Pedido de teste IA`,`Proba de petición IA`,`Petició de prova IA`,`IA proba-eskaera`],aiTestDescription:[`Envoyez un prompt de test via le runtime configuré et inspectez la réponse.`,`Senden Sie einen Test-Prompt über das konfigurierte Runtime und prüfen Sie die Antwort.`,`Envie um prompt de teste pelo runtime configurado e inspecione a resposta.`,`Envía un prompt de proba a través do runtime configurado e revisa a resposta.`,`Envia un prompt de prova a través del runtime configurat i revisa la resposta.`,`Bidali proba-prompt bat konfiguratutako runtimearen bidez eta aztertu erantzuna.`],testPromptLabel:[`Prompt`,`Prompt`,`Prompt`,`Prompt`,`Prompt`,`Prompt`],testProviderLabel:[`Fournisseur`,`Provider`,`Fornecedor`,`Provedor`,`Proveïdor`,`Hornitzailea`],testProviderAuto:[`Sélection automatique`,`Provider automatisch auswählen`,`Selecionar fornecedor automaticamente`,`Seleccionar provedor automaticamente`,`Selecciona proveïdor automàticament`,`Hautatu hornitzailea automatikoki`],testModelLabel:[`Modèle`,`Modell`,`Modelo`,`Modelo`,`Model`,`Modeloa`],testAttachmentsLabel:[`Pièces jointes`,`Anhänge`,`Anexos`,`Adxuntos`,`Adjunts`,`Eranskinak`],testAttachmentsHint:[`Jusqu’à {count} fichiers. Les images et PDF sont envoyés comme fichiers natifs si le fournisseur les prend en charge; les textes sont envoyés comme contenu.`,`Bis zu {count} Dateien. Bilder und PDFs werden als native Dateien gesendet, wenn der Provider sie unterstützt; Textdateien als Inhalt.`,`Até {count} ficheiros. Imagens e PDFs são enviados como ficheiros nativos quando o fornecedor suporta; textos são enviados como conteúdo.`,`Ata {count} arquivos. Imaxes e PDFs envíanse como arquivos nativos cando o provedor os soporta; os textos envíanse como contido.`,`Fins a {count} fitxers. Imatges i PDFs s’envien com a fitxers natius quan el proveïdor els admet; els textos s’envien com a contingut.`,`{count} fitxategi arte. Irudiak eta PDFak fitxategi natibo gisa bidaltzen dira hornitzaileak onartzen baditu; testuak eduki gisa.`],testTooManyFiles:[`Vous pouvez joindre jusqu’à {count} fichiers.`,`Sie können bis zu {count} Dateien anhängen.`,`Pode anexar até {count} ficheiros.`,`Podes anexar ata {count} arquivos.`,`Pots adjuntar fins a {count} fitxers.`,`{count} fitxategi arte erants ditzakezu.`],testFileTooLarge:[`{name} dépasse la limite de taille.`,`{name} überschreitet die Größenbegrenzung.`,`{name} excede o limite de tamanho.`,`{name} supera o límite de tamaño.`,`{name} supera el límit de mida.`,`{name} fitxategiak tamaina-muga gainditzen du.`],testFileReadError:[`Impossible de lire le fichier sélectionné.`,`Die ausgewählte Datei konnte nicht gelesen werden.`,`Não foi possível ler o ficheiro selecionado.`,`Non se puido ler o arquivo seleccionado.`,`No s’ha pogut llegir el fitxer seleccionat.`,`Ezin izan da hautatutako fitxategia irakurri.`],testAllowCloudHint:[`Permet à ce test d’utiliser des fournisseurs cloud lorsque la politique générale le permet.`,`Erlaubt diesem Test Cloud-Provider zu nutzen, wenn die allgemeine Richtlinie es zulässt.`,`Permite que este teste use fornecedores cloud quando a política geral permite.`,`Permite que esta proba use provedores na nube cando a política xeral o permita.`,`Permet que aquesta prova usi proveïdors al núvol quan la política general ho permet.`,`Proba honek hodeiko hornitzaileak erabiltzea ahalbidetzen du politika orokorrak uzten duenean.`],testRun:[`Lancer le test`,`Test ausführen`,`Executar teste`,`Executar proba`,`Executa prova`,`Exekutatu proba`],testRunning:[`Exécution...`,`Läuft...`,`A executar...`,`Executando...`,`Executant...`,`Exekutatzen...`],testErrorTitle:[`Erreur de requête`,`Anfragefehler`,`Erro do pedido`,`Erro da petición`,`Error de la petició`,`Eskaeraren errorea`],auditLogTitle:[`Journal d’audit`,`Auditprotokoll`,`Registo de auditoria`,`Rexistro de auditoría`,`Registre d’auditoria`,`Auditoria erregistroa`],auditLogDescription:[`Les 20 derniers appels avec détails de requête et de réponse extensibles.`,`Die letzten 20 Aufrufe mit ausklappbaren Anfrage- und Antwortdetails.`,`Últimas 20 chamadas com detalhes expansíveis de pedido e resposta.`,`Últimas 20 chamadas con detalles expandibles de petición e resposta.`,`Últimes 20 crides amb detalls desplegables de petició i resposta.`,`Azken 20 deiak, eskaera eta erantzun xehetasun zabalgarriak barne.`],clearAuditLog:[`Effacer le journal`,`Auditprotokoll löschen`,`Limpar auditoria`,`Borrar auditoría`,`Esborra auditoria`,`Garbitu auditoria erregistroa`],date:[`Date`,`Datum`,`Data`,`Data`,`Data`,`Data`],app:[`App`,`App`,`App`,`App`,`App`,`App`],origin:[`Origine`,`Ursprung`,`Origem`,`Orixe`,`Origen`,`Jatorria`],provider:[`Fournisseur`,`Provider`,`Fornecedor`,`Provedor`,`Proveïdor`,`Hornitzailea`],model:[`Modèle`,`Modell`,`Modelo`,`Modelo`,`Model`,`Modeloa`],inputChars:[`Caractères d’entrée`,`Eingabezeichen`,`Caracteres de entrada`,`Caracteres de entrada`,`Caràcters d’entrada`,`Sarrerako karaktereak`],outputChars:[`Caractères de sortie`,`Ausgabezeichen`,`Caracteres de saída`,`Caracteres de saída`,`Caràcters de sortida`,`Irteerako karaktereak`],duration:[`Durée`,`Dauer`,`Duração`,`Duración`,`Durada`,`Iraupena`],speed:[`Vitesse`,`Geschwindigkeit`,`Velocidade`,`Velocidade`,`Velocitat`,`Abiadura`],status:[`État`,`Status`,`Estado`,`Estado`,`Estat`,`Egoera`],requestDetails:[`Détails de la requête`,`Anfragedetails`,`Detalhes do pedido`,`Detalles da petición`,`Detalls de la petició`,`Eskaeraren xehetasunak`],responseDetails:[`Détails de la réponse`,`Antwortdetails`,`Detalhes da resposta`,`Detalles da resposta`,`Detalls de la resposta`,`Erantzunaren xehetasunak`],messagesLabel:[`Messages`,`Nachrichten`,`Mensagens`,`Mensaxes`,`Missatges`,`Mezuak`],filesLabel:[`Fichiers`,`Dateien`,`Ficheiros`,`Arquivos`,`Fitxers`,`Fitxategiak`],responseFormatLabel:[`Format`,`Format`,`Formato`,`Formato`,`Format`,`Formatua`],reasoningLabel:[`Raisonnement`,`Reasoning`,`Raciocínio`,`Razoamento`,`Raonament`,`Arrazoiketa`],errorCodeLabel:[`Code d’erreur`,`Fehlercode`,`Código de erro`,`Código de erro`,`Codi d’error`,`Errore kodea`],errorMessageLabel:[`Message d’erreur`,`Fehlermeldung`,`Mensagem de erro`,`Mensaxe de erro`,`Missatge d’error`,`Errore mezua`],usageLabel:[`Utilisation`,`Nutzung`,`Uso`,`Uso`,`Ús`,`Erabilera`],noRequestBody:[`Aucun corps de requête enregistré.`,`Kein Anfrageinhalt aufgezeichnet.`,`Nenhum corpo de pedido registado.`,`Non hai corpo de petición rexistrado.`,`No hi ha cos de petició registrat.`,`Ez da eskaeraren edukirik erregistratu.`],noResponseBody:[`Aucun corps de réponse enregistré.`,`Kein Antwortinhalt aufgezeichnet.`,`Nenhum corpo de resposta registado.`,`Non hai corpo de resposta rexistrado.`,`No hi ha cos de resposta registrat.`,`Ez da erantzunaren edukirik erregistratu.`],language:[`Langue`,`Sprache`,`Idioma`,`Idioma`,`Idioma`,`Hizkuntza`],noCallsRecorded:[`Aucun appel enregistré.`,`Noch keine Aufrufe aufgezeichnet.`,`Ainda não há chamadas registadas.`,`Aínda non hai chamadas rexistradas.`,`Encara no hi ha crides registrades.`,`Oraindik ez dago deirik erregistratuta.`],launcherTitleAuthorized:[`Autorisé sur {origin}. Fournisseurs : {providers}`,`Autorisiert für {origin}. Provider: {providers}`,`Autorizado em {origin}. Fornecedores: {providers}`,`Autorizado en {origin}. Provedores: {providers}`,`Autoritzat a {origin}. Proveïdors: {providers}`,`Baimenduta {origin}. Hornitzaileak: {providers}`],launcherTitleAuthorizedNoProviders:[`Autorisé sur {origin}, mais aucun fournisseur n’est disponible.`,`Autorisiert für {origin}, aber keine Provider sind verfügbar.`,`Autorizado em {origin}, mas não há fornecedores disponíveis.`,`Autorizado en {origin}, pero non hai provedores dispoñibles.`,`Autoritzat a {origin}, però no hi ha proveïdors disponibles.`,`Baimenduta {origin}, baina ez dago hornitzailerik erabilgarri.`],launcherTitleUnauthorized:[`Ce site ou cette extension n’est pas encore autorisé. Ouvrez Paramètres et autorisez {origin}.`,`Diese Website oder Erweiterung ist noch nicht autorisiert. Öffnen Sie Einstellungen und autorisieren Sie {origin}.`,`Este site ou extensão ainda não está autorizado. Abra Definições e autorize {origin}.`,`Este sitio ou extensión aínda non está autorizado. Abre Configuración e autoriza {origin}.`,`Aquest lloc o extensió encara no està autoritzat. Obre Configuració i autoritza {origin}.`,`Webgune edo hedapen hau oraindik ez dago baimenduta. Ireki Ezarpenak eta baimendu {origin}.`],launcherTitleOffline:[`L’extension est chargée, mais cette page n’a pas pu lire son état runtime.`,`Die Erweiterung ist geladen, aber diese Seite konnte ihren Runtime-Status nicht lesen.`,`A extensão está carregada, mas esta página não conseguiu ler o estado do runtime.`,`A extensión está cargada, pero esta páxina non puido ler o seu estado do runtime.`,`L’extensió està carregada, però aquesta pàgina no ha pogut llegir l’estat del runtime.`,`Hedapena kargatuta dago, baina orri honek ezin izan du runtime egoera irakurri.`],launcherOpenOptionsFailed:[`Impossible d’ouvrir les options de l’extension.`,`Erweiterungsoptionen konnten nicht geöffnet werden.`,`Não foi possível abrir as opções da extensão.`,`Non se puideron abrir as opcións da extensión.`,`No s’han pogut obrir les opcions de l’extensió.`,`Ezin izan dira hedapenaren aukerak ireki.`],launcherStatusFailed:[`L’extension n’a pas renvoyé d’état du runtime.`,`Die Erweiterung hat keinen Runtime-Status zurückgegeben.`,`A extensão não devolveu um estado do runtime.`,`A extensión non devolveu un estado do runtime.`,`L’extensió no ha retornat cap estat del runtime.`,`Hedapenak ez du runtime egoerarik itzuli.`],launcherReadStatusFailed:[`Impossible de lire l’état de l’extension.`,`Erweiterungsstatus konnte nicht gelesen werden.`,`Não foi possível ler o estado da extensão.`,`Non se puido ler o estado da extensión.`,`No s’ha pogut llegir l’estat de l’extensió.`,`Ezin izan da hedapenaren egoera irakurri.`],launcherOffline:[`Hors ligne`,`Offline`,`Offline`,`Desconectado`,`Desconnectat`,`Lineaz kanpo`],launcherNoModel:[`Aucun modèle`,`Kein Modell`,`Sem modelo`,`Sen modelo`,`Sense model`,`Modelorik ez`],launcherNoProviders:[`Aucun fournisseur`,`Keine Provider`,`Sem fornecedores`,`Sen provedores`,`Sense proveïdors`,`Hornitzailerik ez`],launcherSetup:[`Configurer`,`Einrichten`,`Configurar`,`Configurar`,`Configura`,`Konfiguratu`],launcherAuto:[`Auto`,`Auto`,`Auto`,`Auto`,`Auto`,`Auto`],launcherDefaultModel:[`Modèle par défaut`,`Standardmodell`,`Modelo predefinido`,`Modelo por defecto`,`Model per defecte`,`Modelo lehenetsia`],launcherSelectProvider:[`Sélectionner un fournisseur`,`Provider auswählen`,`Selecionar fornecedor`,`Selecciona provedor`,`Selecciona proveïdor`,`Hautatu hornitzailea`],launcherOpenSettings:[`Ouvrir tous les paramètres`,`Alle Einstellungen öffnen`,`Abrir definições completas`,`Abrir configuración completa`,`Obre configuració completa`,`Ireki ezarpen osoak`],aiLabel:[`AI`,`AI`,`AI`,`AI`,`AI`,`AI`]},w=e=>{let t=_e.indexOf(e);return C(Object.fromEntries(Object.entries(ve).map(([e,n])=>[e,n[t]])))},T={en:ge.en,es:C({loading:`Cargando...`,savingChanges:`Guardando cambios...`,refreshingProviders:`Actualizando proveedores...`,loadingCapabilities:`Cargando capacidades...`,loadingFiles:`Leyendo archivos...`,aiTab:`IA`,authorizedTab:`Autorizados`,settingsTab:`Configuración`,providersTab:`Proveedores`,testTab:`Prueba`,callersTab:`Autorizados`,auditTab:`Auditoría`,refreshProviderSnapshot:`Actualizar estado de proveedores`,runtimeGatewayConfiguration:`Configuración de AI Runtime`,runtimeGatewayDescription:`Ajusta proveedores locales y en la nube, autoriza sitios o extensiones de confianza y configura el runtime desde una única superficie operativa.`,providersOnline:`Proveedores activos`,authorizedCallers:`Autorizados`,latestCall:`Última llamada`,snapshot:`Resumen`,noTraffic:`Sin tráfico`,providerSummaryLoading:`Cargando proveedores...`,providerOnline:`activo`,providerOffline:`inactivo`,downloadedLabel:`descargado`,notDownloadedLabel:`no descargado`,unknownSizeLabel:`tamaño desconocido`,testingProvider:`Probando...`,availableWithModels:`Disponible ({count} modelos detectados)`,unavailable:`No disponible`,providerEnabledHint:`Controla si este proveedor se puede inspeccionar, mostrar o seleccionar en el runtime.`,selectDetectedModel:`Selecciona un modelo detectado`,defaultModelPlaceholder:`Modelo por defecto`,addCallerPrompt:`Hostname del sitio o ID de la extensión que quieres permitir. Se ignoran protocolo y puerto.`,providerCardOpenai:`Proveedor directo de OpenAI API con descubrimiento de modelos, streaming e imagenes.`,providerCardOpenrouter:`Endpoint unificado en la nube con descubrimiento de modelos y streaming.`,providerCardOllama:`Daemon local en tu máquina usando el proxy CORS interno y la interfaz nativa /api/chat.`,providerCardLmstudio:`Servidor local compatible con OpenAI para modelos cargados en escritorio.`,providerCardAnthropic:`Proveedor directo de Claude Messages API con streaming, imágenes y documentos PDF.`,providerCardWebllm:`Inferencia local en navegador basada en WebGPU y el catálogo precompilado de WebLLM.`,apiKey:`API key`,apiKeyStoredHint:`Se guarda solo en chrome.storage.local.`,defaultModel:`Modelo por defecto`,openaiDefaultModelHint:`Selecciona entre los modelos expuestos por tu cuenta de OpenAI.`,openrouterDefaultModelHint:`Selecciona entre los modelos expuestos por tu cuenta.`,refreshModels:`Actualizar modelos`,baseUrl:`URL base`,ollamaBaseUrlHint:`Por defecto es http://localhost:11434.`,ollamaDefaultModelHint:"Se obtiene de `/api/tags` cuando Ollama está accesible.",lmstudioBaseUrlHint:`Por defecto es http://localhost:1234/v1.`,lmstudioDefaultModelHint:"Se carga desde `/models` cuando está accesible.",anthropicApiHint:`Se guarda solo en chrome.storage.local.`,anthropicModelHint:`Selecciona entre los modelos expuestos por tu cuenta de Anthropic.`,refreshStatus:`Actualizar estado`,webllmDefaultModelHint:"Sale del listado precompilado de `@mlc-ai/web-llm` disponible en esta build.",refreshCatalog:`Actualizar catálogo`,authorizedCallersTitle:`Autorizados`,authorizedCallersDescription:`Hostnames de sitios o IDs de extensiones de confianza que pueden usar el runtime IA y el runtime.`,defaultCaller:`Por defecto`,addCaller:`Añadir autorizado`,connectionPolicyDescription:`Política de conexión para este sitio o extensión autorizada.`,remove:`Eliminar`,enabled:`Activado`,enabledHint:`Desactiva este autorizado sin borrar sus límites ni sus proveedores permitidos.`,availableProviders:`Proveedores disponibles`,allowedProvidersTitle:`Proveedores permitidos`,defaultProvider:`Proveedor por defecto`,autoProvider:`Proveedor automatico`,appDefaultsTitle:`Defaults por app`,appDefaultsDescription:`Proveedor y modelo guardados por origen autorizado y app.id.`,noAppDefaults:`Todavia no hay defaults por app guardados.`,noProviderDefault:`Sin proveedor por defecto`,availableProvidersHint:`Marca los proveedores IA que este autorizado puede pedir.`,readyToUse:`Listo para usar`,maxInputChars:`Máximo de caracteres de entrada`,maxInputCharsHint:`Límite duro para el contenido total de la solicitud.`,maxOutputTokens:`Máximo de tokens de salida`,maxOutputTokensHint:`Límite que se pasa al proveedor cuando lo soporta.`,aiSettingsTitle:`Auditoria de IA`,aiSettingsDescription:`Las peticiones IA no tienen limites de entrada, salida ni tiempo de ejecucion aplicados por la extension.`,storeAuditContent:`Guardar contenido de prompt y respuesta`,storeAuditContentHint:`Si esta desactivado, la auditoria conserva metadatos, archivos, uso y errores, pero no texto de prompt ni respuesta.`,aiResetDefaults:`Restaurar valores IA`,aiTestTitle:`Prueba de petición IA`,aiTestDescription:`Envía un prompt de prueba a través del runtime configurado y revisa la respuesta.`,testPromptLabel:`Prompt`,testProviderLabel:`Proveedor`,testProviderAuto:`Seleccionar proveedor automáticamente`,testModelLabel:`Modelo`,testAttachmentsLabel:`Adjuntos`,testAttachmentsHint:`Imagenes y PDFs se envian como archivos nativos cuando el proveedor lo soporta; los textos se envian como contenido.`,testTooManyFiles:`Puedes adjuntar hasta {count} archivos.`,testFileTooLarge:`{name} supera el límite de tamaño.`,testFileReadError:`No se pudo leer el archivo seleccionado.`,testAllowCloudHint:`Permite que esta prueba use proveedores en la nube cuando la política general lo permita.`,testRun:`Ejecutar prueba`,testRunning:`Ejecutando...`,testErrorTitle:`Error de la petición`,auditLogTitle:`Registro de auditoría`,auditLogDescription:`Últimas 20 llamadas con detalles expandibles de petición y respuesta.`,clearAuditLog:`Borrar auditoria`,date:`Fecha`,app:`App`,origin:`Origen`,provider:`Proveedor`,model:`Modelo`,inputChars:`Caracteres de entrada`,outputChars:`Caracteres de salida`,duration:`Duracion`,speed:`Velocidad`,status:`Estado`,requestDetails:`Detalles de la peticion`,responseDetails:`Detalles de la respuesta`,messagesLabel:`Mensajes`,filesLabel:`Archivos`,responseFormatLabel:`Formato`,reasoningLabel:`Razonamiento`,errorCodeLabel:`Codigo de error`,errorMessageLabel:`Mensaje de error`,usageLabel:`Uso`,noRequestBody:`No hay cuerpo de peticion registrado.`,noResponseBody:`No hay cuerpo de respuesta registrado.`,language:`Idioma`,noCallsRecorded:`Todavía no hay llamadas registradas.`,launcherTitleAuthorized:`Autorizado en {origin}. Proveedores: {providers}`,launcherTitleAuthorizedNoProviders:`Autorizado en {origin}, pero no hay proveedores disponibles.`,launcherTitleUnauthorized:`Este sitio o extensión todavía no está autorizado. Abre Configuración y autoriza {origin}.`,launcherTitleOffline:`La extensión está cargada, pero esta página no pudo leer su estado.`,launcherOpenOptionsFailed:`No se pudieron abrir las opciones de la extensión.`,launcherStatusFailed:`La extensión no devolvió un estado del runtime.`,launcherReadStatusFailed:`No se pudo leer el estado de la extensión.`,launcherOffline:`Desconectado`,launcherNoModel:`Sin modelo`,launcherNoProviders:`Sin proveedores`,launcherSetup:`Configurar`,launcherAuto:`Auto`,launcherDefaultModel:`Modelo por defecto`,launcherSelectProvider:`Selecciona proveedor`,launcherOpenSettings:`Abrir configuración completa`,aiLabel:`AI`}),fr:C({loading:`Chargement...`,aiTab:`IA`,providersTab:`Fournisseurs`,callersTab:`Autorisés`,auditTab:`Audit`,refreshProviderSnapshot:`Actualiser l’état des fournisseurs`,runtimeGatewayConfiguration:`Configuration de AI Runtime`,runtimeGatewayDescription:`Ajustez les fournisseurs locaux et cloud, autorisez les sites ou extensions de confiance et consultez l’activité du runtime depuis une seule interface.`,providersOnline:`Fournisseurs en ligne`,authorizedCallers:`Autorisés`,latestCall:`Dernier appel`,snapshot:`Résumé`,noTraffic:`Aucun trafic`,providerSummaryLoading:`Chargement des fournisseurs...`,providerOnline:`en ligne`,providerOffline:`hors ligne`,testingProvider:`Test en cours...`,availableWithModels:`Disponible ({count} modèles détectés)`,unavailable:`Indisponible`,selectDetectedModel:`Sélectionner un modèle détecté`,defaultModelPlaceholder:`Modèle par défaut`,addCallerPrompt:`Nom d’hôte du site ou ID de l’extension à autoriser. Le protocole et le port sont ignorés.`,openOptions:`Ouvrir les options`,refreshing:`Actualisation...`,language:`Langue`,aiLabel:`AI`}),de:C({loading:`Wird geladen...`,aiTab:`KI`,providersTab:`Provider`,callersTab:`Autorisiert`,auditTab:`Audit`,refreshProviderSnapshot:`Provider-Status aktualisieren`,runtimeGatewayConfiguration:`AI Runtime-Konfiguration`,runtimeGatewayDescription:`Lokale und Cloud-Provider konfigurieren, vertrauenswürdige Websites oder Erweiterungen autorisieren und die Runtime-Aktivität zentral überwachen.`,providersOnline:`Provider online`,authorizedCallers:`Autorisiert`,latestCall:`Letzter Aufruf`,snapshot:`Übersicht`,noTraffic:`Kein Verkehr`,providerSummaryLoading:`Provider werden geladen...`,providerOnline:`online`,providerOffline:`offline`,testingProvider:`Wird geprüft...`,availableWithModels:`Verfügbar ({count} Modelle erkannt)`,unavailable:`Nicht verfügbar`,selectDetectedModel:`Erkanntes Modell auswählen`,defaultModelPlaceholder:`Standardmodell`,addCallerPrompt:`Hostname der Website oder Erweiterungs-ID, die erlaubt werden soll. Protokoll und Port werden ignoriert.`,openOptions:`Optionen öffnen`,refreshing:`Aktualisiere...`,language:`Sprache`,aiLabel:`AI`}),pt:C({loading:`A carregar...`,aiTab:`IA`,providersTab:`Fornecedores`,callersTab:`Autorizados`,auditTab:`Auditoria`,refreshProviderSnapshot:`Atualizar estado dos fornecedores`,runtimeGatewayConfiguration:`Configuração do AI Runtime`,runtimeGatewayDescription:`Ajusta fornecedores locais e cloud, autoriza sites ou extensões de confiança e inspeciona a atividade do runtime numa única superfície.`,providersOnline:`Fornecedores ativos`,authorizedCallers:`Autorizados`,latestCall:`Última chamada`,snapshot:`Resumo`,noTraffic:`Sem tráfego`,providerSummaryLoading:`A carregar fornecedores...`,providerOnline:`ativo`,providerOffline:`inativo`,testingProvider:`A testar...`,availableWithModels:`Disponível ({count} modelos detetados)`,unavailable:`Indisponível`,selectDetectedModel:`Selecionar modelo detetado`,defaultModelPlaceholder:`Modelo por defeito`,addCallerPrompt:`Hostname do site ou ID da extensão a autorizar. O protocolo e a porta são ignorados.`,openOptions:`Abrir opções`,refreshing:`A atualizar...`,language:`Idioma`,aiLabel:`AI`}),gl:C({loading:`Cargando...`,aiTab:`IA`,providersTab:`Provedores`,callersTab:`Autorizados`,auditTab:`Auditoría`,refreshProviderSnapshot:`Actualizar estado dos provedores`,runtimeGatewayConfiguration:`Configuración de AI Runtime`,runtimeGatewayDescription:`Axusta provedores locais e na nube, autoriza sitios ou extensións de confianza e revisa a actividade do runtime nunha única superficie.`,providersOnline:`Provedores activos`,authorizedCallers:`Autorizados`,latestCall:`Última chamada`,snapshot:`Resumo`,noTraffic:`Sen tráfico`,providerSummaryLoading:`Cargando provedores...`,providerOnline:`activo`,providerOffline:`inactivo`,testingProvider:`Probando...`,availableWithModels:`Dispoñible ({count} modelos detectados)`,unavailable:`Non dispoñible`,selectDetectedModel:`Selecciona un modelo detectado`,defaultModelPlaceholder:`Modelo por defecto`,addCallerPrompt:`Hostname do sitio ou ID da extensión que queres permitir. Ignóranse protocolo e porto.`,openOptions:`Abrir opcións`,refreshing:`Actualizando...`,language:`Idioma`,aiLabel:`AI`}),ca:C({loading:`Carregant...`,aiTab:`IA`,providersTab:`Proveïdors`,callersTab:`Autoritzats`,auditTab:`Auditoria`,refreshProviderSnapshot:`Actualitza l’estat dels proveïdors`,runtimeGatewayConfiguration:`Configuració d’AI Runtime`,runtimeGatewayDescription:`Ajusta proveïdors locals i al núvol, autoritza llocs o extensions de confiança i revisa l’activitat del runtime des d’una sola superfície.`,providersOnline:`Proveïdors actius`,authorizedCallers:`Autoritzats`,latestCall:`Darrera crida`,snapshot:`Resum`,noTraffic:`Sense trànsit`,providerSummaryLoading:`Carregant proveïdors...`,providerOnline:`actiu`,providerOffline:`inactiu`,testingProvider:`S’està provant...`,availableWithModels:`Disponible ({count} models detectats)`,unavailable:`No disponible`,selectDetectedModel:`Selecciona un model detectat`,defaultModelPlaceholder:`Model per defecte`,addCallerPrompt:`Nom d’host del lloc o ID de l’extensió que vols permetre. S’ignoren protocol i port.`,openOptions:`Obre opcions`,refreshing:`Actualitzant...`,language:`Idioma`,aiLabel:`AI`}),eu:C({loading:`Kargatzen...`,aiTab:`IA`,providersTab:`Hornitzaileak`,callersTab:`Baimenduak`,auditTab:`Auditoria`,refreshProviderSnapshot:`Eguneratu hornitzaileen egoera`,runtimeGatewayConfiguration:`AI Runtime konfigurazioa`,runtimeGatewayDescription:`Doitu tokiko eta hodeiko hornitzaileak, baimendu konfiantzazko webguneak edo hedapenak eta berrikusi runtime jarduera azalera bakar batetik.`,providersOnline:`Hornitzaile aktiboak`,authorizedCallers:`Baimenduak`,latestCall:`Azken deia`,snapshot:`Laburpena`,noTraffic:`Trafikorik ez`,providerSummaryLoading:`Hornitzaileak kargatzen...`,providerOnline:`aktibo`,providerOffline:`ez aktibo`,testingProvider:`Probatzen...`,availableWithModels:`Eskuragarri ({count} modelo detektatu dira)`,unavailable:`Ez dago erabilgarri`,selectDetectedModel:`Hautatu detektatutako modeloa`,defaultModelPlaceholder:`Modelo lehenetsia`,addCallerPrompt:`Baimendu nahi duzun gunearen host izena edo hedapenaren IDa. Protokoloa eta ataka ez dira kontuan hartzen.`,openOptions:`Ireki aukerak`,refreshing:`Eguneratzen...`,language:`Hizkuntza`,aiLabel:`AI`}),fr:w(`fr`),de:w(`de`),pt:w(`pt`),gl:w(`gl`),ca:w(`ca`),eu:w(`eu`)},E={es:`es`,en:`en`,fr:`fr`,de:`de`,pt:`pt`,gl:`gl`,ca:`ca`,eu:`eu`},D=()=>{let e=(typeof chrome<`u`&&typeof chrome.i18n?.getUILanguage==`function`?chrome.i18n.getUILanguage():typeof navigator<`u`?navigator.language:`en`).toLowerCase(),t=e.split(`-`)[0];return E[e]??E[t]??`en`},ye=e=>{if(!e)return D();let t=e.toLowerCase();return E[t]??E[t.split(`-`)[0]]??`en`},be=(e,t,n={})=>{let r=(T[e]??T.en)[t]??T.en[t]??t;return typeof r==`function`?r(n):S(r.replace(/\{(\w+)\}/g,(e,t)=>String(n[t]??`{${t}}`)))},O=`ai-runtime-state`,k=20,A=null,j=null;typeof chrome<`u`&&chrome.storage?.onChanged&&chrome.storage.onChanged.addListener((e,t)=>{if(t!==`local`||!(O in e))return;let n=e[O]?.newValue;A=n?R(n):null,j=null});var M=e=>{let t=e.trim().toLowerCase();if(!t)return``;let n=t.includes(`://`)?t:`https://${t}`;try{return new URL(n).hostname.toLowerCase()}catch{return t.replace(/^[a-z]+:\/\//,``).replace(/\/.*$/,``).replace(/:\d+$/,``).toLowerCase()}},xe=e=>{let t=e.trim();return t?t.slice(0,128):`unknown-app`},N=(e,t)=>JSON.stringify([M(e),xe(t)]),P=e=>{let t=e&&typeof e==`object`&&!Array.isArray(e)?e:{},n=x.includes(t.provider)?t.provider:void 0,r=typeof t.model==`string`&&t.model.trim()?t.model.trim().slice(0,300):void 0;return{...n?{provider:n}:{},...n&&r?{model:r}:{}}},Se=e=>!e||typeof e!=`object`||Array.isArray(e)?{}:Object.fromEntries(Object.entries(e).map(([e,t])=>{let n=P(t);return n.provider?[e,n]:null}).filter(Boolean)),F=e=>{let t=Array.isArray(e.allowedProviders),n=t?e.allowedProviders.filter(e=>x.includes(e)):[],r=t?Array.from(new Set(n)):[...x];return{origin:e.origin,enabled:e.enabled!==!1,allowedProviders:r,defaultProvider:e.defaultProvider&&r.includes(e.defaultProvider)?e.defaultProvider:void 0}},I=e=>F({origin:M(e),enabled:!0,allowedProviders:[...x]}),L=()=>Object.fromEntries(b.map(e=>{let t=M(e);return t?[t,I(e)]:null}).filter(Boolean)),R=e=>{let t={...e};delete t.ai;let n=Object.values(e.originPolicies).reduce((e,t)=>{let n=M(t.origin);return n&&(e[n]=F({...t,origin:n})),e},L());return{...t,locale:ye(e.locale),providers:{...e.providers,openai:{...e.providers.openai,enabled:e.providers.openai?.enabled??!0},openrouter:{...e.providers.openrouter,enabled:e.providers.openrouter?.enabled??!0},anthropic:{...e.providers.anthropic,enabled:e.providers.anthropic?.enabled??!0},ollama:{...e.providers.ollama,baseUrl:e.providers.ollama?.baseUrl??`http://localhost:11434`,enabled:e.providers.ollama?.enabled??!0},lmstudio:{...e.providers.lmstudio,baseUrl:e.providers.lmstudio?.baseUrl??`http://localhost:1234/v1`,enabled:e.providers.lmstudio?.enabled===!0},webllm:{...e.providers.webllm,enabled:e.providers.webllm?.enabled??!0}},originPolicies:n,appConfigs:Se(e.appConfigs),auditLog:e.auditLog.slice(0,k)}},Ce=()=>({version:1,locale:D(),providers:{ollama:{enabled:!0,baseUrl:`http://localhost:11434`},lmstudio:{enabled:!1,baseUrl:`http://localhost:1234/v1`},webllm:{enabled:!0}},originPolicies:L(),appConfigs:{},auditLog:[]});async function z(){if(A)return A;if(j)return j;j=(async()=>{let e=(await chrome.storage.local.get(O))[O];if(e){let t=R(e);return JSON.stringify(t)===JSON.stringify(e)?(A=t,t):(await B(t),t)}let t=Ce();return await B(t),t})();try{let e=await j;return A=e,e}finally{j=null}}async function B(e){let t=R(e);await chrome.storage.local.set({[O]:t}),A=t,j=null}async function we(e){return(await z()).originPolicies[M(e)]}async function Te(e,t){return(await z()).appConfigs[N(e,t)]??{}}async function Ee(e,t,n){let r=await z(),i=N(e,t),a=P(n);return a.provider?r.appConfigs[i]=a:delete r.appConfigs[i],await B(r),a}async function De(e){let t=await z();t.auditLog=[e,...t.auditLog].slice(0,k),await B(t)}var Oe=`11434`,V=`ai-runtime-extension:internal-fetch`,ke=e=>{try{return new URL(e).port===Oe}catch{return!1}},H=e=>{if(!ke(e.url))return e.headers;let t={};for(let[n,r]of Object.entries(e.headers)){let e=n.toLowerCase();(e===`accept`||e===`accept-language`||e===`content-language`||e===`range`)&&(t[n]=r)}return e.hasBody&&e.method!==`GET`&&e.method!==`HEAD`&&(t[`Content-Type`]=`text/plain`),t},U=e=>{let t={};return e&&new Headers(e).forEach((e,n)=>{t[n]=e}),t},W=e=>e instanceof Request?e.url:String(e),G=(e,t)=>String(t?.method??(e instanceof Request?e.method:`GET`)).trim().toUpperCase(),Ae=async(e,t)=>{let n=t?.body;if(n==null)return e instanceof Request&&e.body!==null?e.text():void 0;if(typeof n==`string`)return n;if(n instanceof URLSearchParams)return n.toString();if(n instanceof Blob)return n.text();if(n instanceof ArrayBuffer||ArrayBuffer.isView(n))return new TextDecoder().decode(n);throw TypeError(`Runtime fetch only supports text request bodies.`)},K=async(e,t={})=>{let n=W(e),r=G(e,t),i=t.headers??(e instanceof Request?e.headers:void 0),a=await Ae(e,t);return{url:n,method:r,headers:U(i),body:a,responseType:`text`,allowPrivateNetwork:!0}},q=e=>new Response(e.bodyText,{status:e.status,statusText:e.statusText,headers:e.headers}),je=()=>{let e=globalThis.chrome?.runtime;return e?.sendMessage?async(t,n={})=>{let r=n.signal;if(r?.aborted)throw new DOMException(`The operation was aborted.`,`AbortError`);let i=await K(t,n);return q(await new Promise((t,n)=>{let a=()=>{n(new DOMException(`The operation was aborted.`,`AbortError`))};r?.addEventListener(`abort`,a,{once:!0});try{e.sendMessage({type:V,requestId:crypto.randomUUID(),payload:i},i=>{r?.removeEventListener(`abort`,a);let o=e.lastError?.message;if(o){n(Error(o));return}if(!i?.ok){n(Error(i?.error?.message??`Internal runtime fetch failed.`));return}t(i.result)})}catch(e){r?.removeEventListener(`abort`,a),n(e)}}))}:null},J=(e=globalThis.fetch.bind(globalThis))=>(t,n={})=>{let r=W(t),i=G(t,n),a=H({url:r,method:i,headers:U(n.headers??(t instanceof Request?t.headers:void 0)),hasBody:n.body!=null||t instanceof Request&&t.body!==null});return e(t,{...n,method:i,headers:a,credentials:n.credentials??`omit`})},Me=3e3,Y=async e=>Promise.race([e,new Promise((e,t)=>{setTimeout(()=>{t(Error(`Provider inspection timed out`))},Me)})]),X=async e=>{if(e.listModelDetails){let t=await e.listModelDetails();return{models:t.map(e=>e.id),...t.length?{modelDetails:t}:{}}}return{models:await e.listModels()}},Z=(e,t)=>{if(!Q(e,t))return`Provider disabled`;if(e===`openrouter`&&!t.providers.openrouter?.apiKey||e===`openai`&&!t.providers.openai?.apiKey||e===`anthropic`&&!t.providers.anthropic?.apiKey)return`Missing API key`;if(e===`webllm`)return t.providers.webllm?.enabled?`WebGPU unavailable or blocked in this browser context`:`Enable WebLLM to browse the prebuilt model catalog`},Ne=[`openrouter`,`openai`,`ollama`,`lmstudio`,`anthropic`,`webllm`],Pe=new Set([`ollama`,`lmstudio`]),Q=(e,t)=>e===`openrouter`?t.providers.openrouter?.enabled!==!1:e===`openai`?t.providers.openai?.enabled!==!1:e===`anthropic`?t.providers.anthropic?.enabled!==!1:e===`ollama`?t.providers.ollama?.enabled!==!1:e===`lmstudio`?t.providers.lmstudio?.enabled===!0:e===`webllm`?t.providers.webllm?.enabled===!0:!0,$=(e,t={})=>{let n=t.ollamaFetch??je()??J();return new Map([[`openai`,new ce({id:`openai`,displayName:`OpenAI`,apiKey:e.providers.openai?.apiKey,defaultModel:e.providers.openai?.defaultModel})],[`openrouter`,new ue({id:`openrouter`,displayName:`OpenRouter`,apiKey:e.providers.openrouter?.apiKey,defaultModel:e.providers.openrouter?.defaultModel})],[`ollama`,new oe({id:`ollama`,displayName:`Ollama`,baseUrl:e.providers.ollama?.baseUrl,defaultModel:e.providers.ollama?.defaultModel,fetch:n})],[`lmstudio`,new re({id:`lmstudio`,displayName:`LM Studio`,baseUrl:e.providers.lmstudio?.baseUrl,defaultModel:e.providers.lmstudio?.defaultModel,fetch:J()})],[`anthropic`,new ne({id:`anthropic`,displayName:`Anthropic`,apiKey:e.providers.anthropic?.apiKey,defaultModel:e.providers.anthropic?.defaultModel})],[`webllm`,new de({id:`webllm`,displayName:`WebLLM`,defaultModel:e.providers.webllm?.defaultModel,enabled:e.providers.webllm?.enabled,runtime:t.webllmRuntime})]].filter(([t])=>Q(t,e)))},Fe=async(t,n={})=>{let r=$(t,n),i=n.providerIds??Ne;return await Promise.all(i.map(async n=>{if(!Q(n,t))return{provider:n,available:!1,reason:Z(n,t),models:[],supports:e[n]};let i=r.get(n);if(!i)return{provider:n,available:!1,reason:Z(n,t),models:[],supports:e[n]};if(Pe.has(n)){let t=await Y(X(i)).then(e=>e,e=>({models:[],error:e})),r=t.error instanceof Error?t.error:null;return{provider:n,available:!r,reason:r?.message,models:t.models,...t.modelDetails?{modelDetails:t.modelDetails}:{},supports:e[n]}}let a=await Y(i.isAvailable()).then(e=>({available:e}),e=>({available:!1,error:e})),o=a.available?await Y(X(i)).then(e=>e,e=>({models:[],error:e})):{models:[]},s=a.error instanceof Error?a.error:o.error instanceof Error?o.error:null;return{provider:n,available:a.available,reason:a.available?void 0:s?.message??Z(n,t),models:o.models,...o.modelDetails?{modelDetails:o.modelDetails}:{},supports:e[n]}}))};export{be as _,K as a,h as b,I as c,z as d,M as f,fe as g,he as h,H as i,Te as l,Ee as m,Fe as n,q as o,B as p,V as r,De as s,$ as t,we as u,b as v,x as y};