@fiodos/web-core 0.1.12 → 0.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/adapters/webCredentialAutofillAdapter.d.ts +16 -0
- package/dist/cjs/adapters/webCredentialAutofillAdapter.js +47 -0
- package/dist/cjs/api/backendClient.d.ts +10 -3
- package/dist/cjs/api/backendClient.js +31 -9
- package/dist/cjs/config/types.d.ts +22 -2
- package/dist/cjs/controller/AgentController.d.ts +14 -0
- package/dist/cjs/controller/AgentController.js +65 -2
- package/dist/cjs/dropin/createFiodosAgent.d.ts +27 -1
- package/dist/cjs/dropin/createFiodosAgent.js +48 -4
- package/dist/cjs/embed/dynamics.d.ts +61 -0
- package/dist/cjs/embed/dynamics.js +173 -0
- package/dist/cjs/embed/global.d.ts +45 -0
- package/dist/cjs/embed/global.js +48 -0
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.js +8 -1
- package/dist/cjs/orb/mountOrb.js +172 -28
- package/dist/cjs/orb/orbView.js +42 -8
- package/dist/cjs/orb/publishedConfig.d.ts +4 -2
- package/dist/cjs/orb/publishedConfig.js +56 -7
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/embed/fiodos-embed.js +66 -0
- package/dist/esm/adapters/webCredentialAutofillAdapter.d.ts +16 -0
- package/dist/esm/adapters/webCredentialAutofillAdapter.js +44 -0
- package/dist/esm/api/backendClient.d.ts +10 -3
- package/dist/esm/api/backendClient.js +32 -10
- package/dist/esm/config/types.d.ts +22 -2
- package/dist/esm/controller/AgentController.d.ts +14 -0
- package/dist/esm/controller/AgentController.js +65 -2
- package/dist/esm/dropin/createFiodosAgent.d.ts +27 -1
- package/dist/esm/dropin/createFiodosAgent.js +48 -4
- package/dist/esm/embed/dynamics.d.ts +61 -0
- package/dist/esm/embed/dynamics.js +168 -0
- package/dist/esm/embed/global.d.ts +45 -0
- package/dist/esm/embed/global.js +46 -0
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/orb/mountOrb.js +173 -29
- package/dist/esm/orb/orbView.js +43 -9
- package/dist/esm/orb/publishedConfig.d.ts +4 -2
- package/dist/esm/orb/publishedConfig.js +56 -7
- package/dist/esm/version.d.ts +1 -1
- package/dist/esm/version.js +1 -1
- package/package.json +5 -3
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";(()=>{var sr=new Set(["navigate","execute","none"]);function kt(e){if(!e||typeof e!="object")return null;let t=e,n=t.type;if(typeof n!="string"||!sr.has(n))return null;if(n==="none")return{type:"none"};let o=typeof t.intent=="string"?t.intent.trim():"";return o?{type:n,intent:o,parameters:t.parameters&&typeof t.parameters=="object"?t.parameters:void 0,requireConfirmation:t.requireConfirmation===!0?!0:void 0,confirmationMessage:typeof t.confirmationMessage=="string"&&t.confirmationMessage.trim()?t.confirmationMessage.trim():void 0}:null}var fe="BACK";function _t(e){return e.routes.map(t=>({intent:t.intent,label:t.label,examples:t.examples,...t.description?{description:t.description}:{},...t.audience==="authenticated"?{audience:"authenticated"}:{}}))}function Pt(e){return e.actions.map(t=>{var i,r,s,a;let n=Object.entries((i=t.parameters)!=null?i:{}),o=(r=t.contextRequirements)==null?void 0:r.custom;return{intent:t.intent,label:t.label,examples:t.examples,...t.kind==="link"?{kind:"link"}:{},...t.kind==="link"&&t.navTarget?{nav_target:t.navTarget}:{},requires_visible_content:((s=t.contextRequirements)==null?void 0:s.requiresVisibleContent)===!0,requires_auth:((a=t.contextRequirements)==null?void 0:a.requiresAuth)===!0,...o&&o.length>0?{requires_context:[...o]}:{},requires_confirmation:t.requireConfirmation,...t.confirmationMessageTemplate?{confirmation_message:t.confirmationMessageTemplate}:{},...n.length>0?{parameters:Object.fromEntries(n.map(([l,c])=>[l,{type:c.type,required:c.required,description:c.description}]))}:{},...t.description?{description:t.description}:{},...t.preconditions?{preconditions:t.preconditions}:{},...t.effect?{effect:t.effect}:{},...t.relatedIntents&&t.relatedIntents.length>0?{related_intents:[...t.relatedIntents]}:{},...t.showcaseRoute?{showcase_route:t.showcaseRoute}:{},...t.audience==="authenticated"?{audience:"authenticated"}:{},...t.requiredCapabilities&&t.requiredCapabilities.length>0?{required_capabilities:[...t.requiredCapabilities]}:{}}})}var Dn=/\{([a-zA-Z0-9_]+)\}/g,ar="baseUrl";function Mt(e){let t=[];for(let n of e.matchAll(Dn)){let o=n[1];o&&!t.includes(o)&&t.push(o)}return t}function Lt(e){let t=new Set(Mt(e.url)),n=o=>{if(typeof o=="string")for(let i of Mt(o))t.add(i);else Array.isArray(o)?o.forEach(n):o&&typeof o=="object"&&Object.values(o).forEach(n)};return e.body&&n(e.body),[...t]}var Oe=class extends Error{};function cr(e,t,n){return e.replace(Dn,(o,i)=>{if(i===ar){if(!n)throw new Oe("URL template uses {baseUrl} but no baseUrl was provided to buildApiActionRegistries");return n}let r=t[i];if(r==null)throw new Oe(`Missing parameter '${i}' for URL template`);return encodeURIComponent(String(r))})}function $n(e,t){if(typeof e=="string"){let n=/^\{([a-zA-Z0-9_]+)\}$/.exec(e);if(n){let o=n[1],i=t[o];if(i==null)throw new Oe(`Missing parameter '${o}' for body template`);return i}return e.replace(Dn,(o,i)=>{let r=t[i];if(r==null)throw new Oe(`Missing parameter '${i}' for body template`);return String(r)})}return Array.isArray(e)?e.map(n=>$n(n,t)):e&&typeof e=="object"?Object.fromEntries(Object.entries(e).map(([n,o])=>[n,$n(o,t)])):e}function lr(){let e=globalThis.fetch;return typeof e=="function"?e:null}function ur(e){let t=globalThis;if(!t.AbortController||!t.setTimeout)return{cancel:()=>{}};let n=new t.AbortController,o=t.setTimeout(()=>n.abort(),e);return{signal:n.signal,cancel:()=>{var i;return(i=t.clearTimeout)==null?void 0:i.call(t,o)}}}function dr(e,t){var i,r;let n=(i=t.baseUrl)==null?void 0:i.replace(/\/$/,""),o=(r=t.timeoutMs)!=null?r:15e3;return async s=>{var f,m,h,x,T;let a={...(f=e.headers)!=null?f:{}};if(e.authRef){let v=(m=t.authProviders)==null?void 0:m[e.authRef];if(!v)return{success:!1,error:`Auth provider not registered: ${e.authRef}`};try{Object.assign(a,await v())}catch(S){return{success:!1,error:`Auth provider '${e.authRef}' failed: ${S instanceof Error?S.message:"unknown"}`}}}let l,c;try{l=cr(e.url,s,n),e.body&&(a["Content-Type"]=(h=a["Content-Type"])!=null?h:"application/json",c=JSON.stringify($n(e.body,s)))}catch(v){return{success:!1,error:v instanceof Error?v.message:"Template resolution failed"}}let u=(x=t.fetchFn)!=null?x:lr();if(!u)return{success:!1,error:"No fetch implementation available"};let p=ur(o);try{let v=await u(l,{method:e.method,headers:a,...c!==void 0?{body:c}:{},...p.signal?{signal:p.signal}:{}});if(!v.ok){let R="";try{R=(await v.text()).slice(0,200)}catch{}return{success:!1,error:`HTTP ${v.status}${R?`: ${R}`:""}`}}let S;try{if(((T=v.headers.get("content-type"))!=null?T:"").includes("json")){let E=await v.text();if(E){let g=JSON.parse(E);g&&typeof g=="object"&&!Array.isArray(g)&&(S=g)}}}catch{}return{success:!0,...S?{data:S}:{}}}catch(v){return{success:!1,error:`Request failed: ${v instanceof Error?v.message:"unknown"}`}}finally{p.cancel()}}}function Bt(e,t={}){var o,i;let n={};for(let r of(o=e.actions)!=null?o:[]){if(!r.execution||r.kind==="link")continue;let s=(i=r.handler)==null?void 0:i.trim();s&&(n[s]=dr(r.execution,t))}return{handlers:n,idempotencyCheckers:{},contextValidators:{}}}var pr=new Set(["string","number","boolean"]),fr=new Set(["standard","strict","disabled"]),hr=new Set(["GET","POST","PUT","PATCH","DELETE"]);function mr(e,t,n){var r,s;let o=e.execution;if(!o)return;if(e.kind==="link"){n.push(`link action '${t}' cannot declare execution`);return}if(o.kind!=="http"&&n.push(`action '${t}' has invalid execution kind '${String(o.kind)}'`),hr.has(o.method)||n.push(`action '${t}' has invalid execution method '${String(o.method)}'`),!((r=o.url)!=null&&r.trim())){n.push(`action '${t}' has an empty execution url`);return}o.authRef!==void 0&&!o.authRef.trim()&&n.push(`action '${t}' has an empty execution authRef`);let i=new Set(Object.keys((s=e.parameters)!=null?s:{}));for(let a of Lt(o))a!=="baseUrl"&&!i.has(a)&&n.push(`action '${t}' execution references undeclared parameter '{${a}}'`)}function he(e){var o,i,r,s,a,l,c,u,p,f,m,h,x,T,v,S,R;let t=[];(o=e.appId)!=null&&o.trim()||t.push("appId is required"),(i=e.appName)!=null&&i.trim()||t.push("appName is required"),(r=e.version)!=null&&r.trim()||t.push("version is required");let n=new Set;for(let E of(s=e.routes)!=null?s:[]){let g=(a=E.intent)==null?void 0:a.trim();if(!g){t.push("route with empty intent");continue}n.has(g)&&t.push(`duplicate intent: ${g}`),n.add(g),(l=E.route)!=null&&l.trim()||t.push(`route intent '${g}' has empty route`),(c=E.examples)!=null&&c.length||t.push(`route intent '${g}' has no examples`)}for(let E of(u=e.actions)!=null?u:[]){let g=(p=E.intent)==null?void 0:p.trim();if(!g){t.push("action with empty intent");continue}n.has(g)&&t.push(`duplicate intent: ${g}`),n.add(g),E.kind==="link"?(f=E.navTarget)!=null&&f.trim()||t.push(`link action '${g}' has empty navTarget`):(m=E.handler)!=null&&m.trim()||t.push(`action '${g}' has empty handler`),(h=E.examples)!=null&&h.length||t.push(`action '${g}' has no examples`),E.doubleConfirmation&&!E.requireConfirmation&&t.push(`action '${g}' declares doubleConfirmation without requireConfirmation`),E.voiceConfirmation!==void 0&&(fr.has(E.voiceConfirmation)||t.push(`action '${g}' has invalid voiceConfirmation '${E.voiceConfirmation}'`),E.requireConfirmation||t.push(`action '${g}' declares voiceConfirmation without requireConfirmation`)),E.confirmationPhrase!==void 0&&!E.confirmationPhrase.trim()&&t.push(`action '${g}' has an empty confirmationPhrase`),E.requireConfirmation&&!((x=E.confirmationMessageTemplate)!=null&&x.trim())&&t.push(`action '${g}' requires confirmation but has no confirmationMessageTemplate`);for(let[C,A]of Object.entries((T=E.parameters)!=null?T:{}))pr.has(A.type)||t.push(`action '${g}' parameter '${C}' has invalid type '${A.type}'`),(v=A.description)!=null&&v.trim()||t.push(`action '${g}' parameter '${C}' has empty description`);for(let C of(R=(S=E.contextRequirements)==null?void 0:S.custom)!=null?R:[])C.trim()||t.push(`action '${g}' has an empty custom requirement name`);mr(E,g,t)}return{valid:t.length===0,errors:t}}function Fn(e,t,n,o){var r,s,a,l,c,u,p,f;let i=e.contextRequirements;if(!i)return{ok:!0};if(i.requiresVisibleContent&&!(((s=(r=t.visibleContent)==null?void 0:r.items.length)!=null?s:0)>0))return{ok:!1,reason:"No visible content in context",userMessage:o.messages.needsVisibleContent,recoverable:!0};if(i.requiresAuth){let m=o.isAuthenticated?o.isAuthenticated():null;if(m==null)return(l=(a=globalThis.console)==null?void 0:a.warn)==null||l.call(a,o.isAuthenticated?`[fyodos] Action "${e.intent}" declares requiresAuth but isAuthenticated() returned null/undefined (session state UNKNOWN). The action is blocked (fail-closed). If this is the generated session wiring, the app component that registers the session bridge has not rendered yet \u2014 see src/fyodos/FYODOS_SESSION.md.`:`[fyodos] Action "${e.intent}" declares requiresAuth but the app did not provide isAuthenticated. The action is blocked (fail-closed). Wire it on the mount, e.g. <FiodosAgent isAuthenticated={() => Boolean(session)} \u2026/> \u2014 see FYODOS_ORB_MOUNT.md.`),{ok:!1,reason:o.isAuthenticated?"requiresAuth declared but auth state is unknown (provider returned null)":"requiresAuth declared but no AuthStateProvider registered",userMessage:(c=o.messages.authUnverifiable)!=null?c:o.messages.actionUnavailable,recoverable:!1};if(!m)return{ok:!1,reason:"User not authenticated",userMessage:o.messages.needsAuth,recoverable:!1}}for(let m of(u=i.custom)!=null?u:[]){let h=(p=n.contextValidators)==null?void 0:p[m];if(!h)return{ok:!1,reason:`Context validator not registered: ${m}`,userMessage:o.messages.actionUnavailable,recoverable:!1};let x;try{x=h(t)}catch(T){return{ok:!1,reason:`Context validator '${m}' threw: ${T instanceof Error?T.message:"unknown"}`,userMessage:o.messages.actionUnavailable,recoverable:!1}}if(!x.ok)return{ok:!1,reason:x.reason,userMessage:(f=x.userMessage)!=null?f:o.messages.actionUnavailable,recoverable:!0}}return{ok:!0}}async function Qe(e,t,n,o,i){var l;let r=(l=e.intent)==null?void 0:l.trim();if(!r)return{kind:"done",result:{success:!1,error:"No intent specified"}};let s=t.find(c=>c.intent===r);if(!s)return{kind:"done",result:{success:!1,error:`Unknown action intent: ${r}`}};let a=Fn(s,n,o,i);if(!a.ok)return{kind:"done",result:{success:!1,error:a.reason,message:a.userMessage,recoverable:a.recoverable}};if(s.idempotencyCheck){let c=o.idempotencyCheckers[s.idempotencyCheck];if(c)try{let u=await c(n);if(u.alreadyApplied)return{kind:"done",result:{success:!0,idempotent:!0,message:u.message}}}catch{}}return{kind:"ready",actionConfig:s}}async function Je(e,t,n,o,i){var l;let r=await Qe(e,t,n,o,i);if(r.kind==="done")return r.result;let{actionConfig:s}=r,a=o.handlers[s.handler];if(!a)return{success:!1,error:`Handler not found: ${s.handler}`,message:i.messages.actionUnavailable};try{return await a((l=e.parameters)!=null?l:{},n,s.intent)}catch(c){return{success:!1,error:`Handler failed: ${c instanceof Error?c.message:"unknown"}`,message:i.messages.actionFailed}}}var No={needsVisibleContent:"For that, I first need the content open on screen. Want me to take you there?",needsAuth:"You need to be signed in to do that.",authUnverifiable:"I can't do that from here yet. Please use the app's own controls.",actionUnavailable:"I can't do that right now. Please try again.",signInAutofillDismissed:"No problem. You can tell me your email and password, or sign in from the login screen.",signInAutofillUnavailable:"I couldn't use the credentials saved on this device. Tell me your email and password, or sign in from the login screen.",actionFailed:"I couldn't do that. Please try again.",navigationFailed:"I couldn't open that screen. Please try again.",alreadyOnScreen:"You're already on that screen.",cancelled:"Cancelled.",confirmationFallbackQuestion:"Do you want me to proceed?",confirmationNotUnderstood:"I didn't catch that.",doubleConfirmationQuestion:"This is a serious action. Do you definitely confirm?",strictConfirmationInstruction:'For safety, to continue say exactly: "{phrase}". To cancel, say no.',strictConfirmationPhraseTemplate:"confirm {label}",strictConfirmationNotMatched:"For safety, I need the exact phrase.",strictConfirmationModalHint:'To confirm by voice, say exactly: "{phrase}".',contextTruncationSuffix:"\u2026[content truncated to optimize the response]",visibleContentHeader:"Items currently visible on screen ({count}):",visibleContentEmpty:"No content is currently loaded on screen.",visibleContentFocusedTag:"[ON SCREEN NOW]",visibleContentReferenceHint:'If the user says "this one" or "this item", they mean the one tagged ON SCREEN NOW (or the only visible one). Never read internal ids aloud.',currentScreenLabel:'Current screen: "{label}"',currentScreenActions:"From here the user can: {actions}",bubblePromptFromExample:"Want to {phrase}?",bubblePromptFromAction:"Want to {action}?",bubblePromptFromLabel:"Want to open {label}?"};var $o={needsVisibleContent:"Para eso necesito que abras primero el contenido en pantalla. \xBFTe llevo hasta \xE9l?",needsAuth:"Necesitas haber iniciado sesi\xF3n para hacer eso.",authUnverifiable:"Todav\xEDa no puedo hacer eso desde aqu\xED. Usa los controles de la propia app.",actionUnavailable:"No puedo hacer eso ahora mismo. Int\xE9ntalo de nuevo.",signInAutofillDismissed:"Sin problema. Puedes decirme tu email y contrase\xF1a, o iniciar sesi\xF3n desde la pantalla de acceso.",signInAutofillUnavailable:"No he podido usar las credenciales guardadas en este dispositivo. Dime tu email y contrase\xF1a, o inicia sesi\xF3n desde la pantalla de acceso.",actionFailed:"No he podido hacerlo. Int\xE9ntalo de nuevo.",navigationFailed:"No he podido abrir esa pantalla. Int\xE9ntalo de nuevo.",alreadyOnScreen:"Ya est\xE1s en esa pantalla.",cancelled:"Cancelado.",confirmationFallbackQuestion:"\xBFQuieres que lo haga?",confirmationNotUnderstood:"No te he entendido.",doubleConfirmationQuestion:"Es una acci\xF3n seria. \xBFLo confirmas definitivamente?",strictConfirmationInstruction:"Por seguridad, para continuar di exactamente: \xAB{phrase}\xBB. Para cancelar, di no.",strictConfirmationPhraseTemplate:"confirmar {label}",strictConfirmationNotMatched:"Por seguridad necesito la frase exacta.",strictConfirmationModalHint:"Para confirmar por voz, di exactamente: \xAB{phrase}\xBB.",contextTruncationSuffix:"\u2026[contenido recortado para optimizar la respuesta]",visibleContentHeader:"Elementos visibles en pantalla ({count}):",visibleContentEmpty:"Todav\xEDa no hay contenido cargado en pantalla.",visibleContentFocusedTag:"[EN PANTALLA AHORA]",visibleContentReferenceHint:'Si el usuario dice "esto" o "este elemento", se refiere al marcado como EN PANTALLA AHORA (o al \xFAnico visible). Nunca leas identificadores internos en voz alta.',currentScreenLabel:"Pantalla actual: \xAB{label}\xBB",currentScreenActions:"Desde aqu\xED el usuario puede: {actions}",bubblePromptFromExample:"\xBFQuieres {phrase}?",bubblePromptFromAction:"\xBFQuieres {action}?",bubblePromptFromLabel:"\xBFQuieres ir a {label}?"};var Ze={en:No,es:$o};function br(e){var t,n;return(n=(t=e.split(/[-_]/)[0])==null?void 0:t.toLowerCase())!=null?n:e.toLowerCase()}function Nt(e,t={}){var s,a,l;let n=(s=t.catalogs)!=null?s:{},o=(a=n[e])!=null?a:Ze[e],i=br(e),r=(l=o!=null?o:n[i])!=null?l:Ze[i];if(!r){let c=[...new Set([...Object.keys(Ze),...Object.keys(n)])].join(", ");throw new Error(`[fyodos] No message catalog for locale "${e}". Available locales: ${c}. Register a catalog for your locale via resolveMessages(locale, { catalogs }) or pick a supported one.`)}return t.overrides?{...r,...t.overrides}:r}function ee(e,t){return e.replace(/\{(\w+)\}/g,(n,o)=>o in t?String(t[o]):n)}function xe(e){return String(e!=null?e:"").replace(/\s+/g," ").trim()}var Do=/^(open|go to|navigate|show|view|launch|access|enter|get|take me|ir a|abrir|mostrar|ver|llévame)\b/i;function yr(e){let t=xe(e);if(!t||t.length>72)return!1;if(t.includes("?")||t.includes("\xBF")||/[áéíóúñüÁÉÍÓÚÑÜ]/.test(t))return!0;if(/[_-]/.test(t)||Do.test(t)||!/\s/.test(t)&&t===t.toLowerCase())return!1;let n=t.split(/\s+/);return!(n.length===2&&Do.test(n[0]))}function xr(e){var t,n;return(n=(t=e.split(/[-_]/)[0])==null?void 0:t.toLowerCase())!=null?n:e.toLowerCase()}function Wn(e){return xr(e)==="es"}var Fo=new Set(["home","landing","index","main","feed","dashboard","root","start"]);function vr(e){return e.toLowerCase().replace(/[\s-]+/g,"_")}function Cr(e,t){var i;let n=(i=e.actionIntents)!=null?i:[];if(n.length===0||!(t!=null&&t.length))return null;let o=new Map(t.map(r=>[r.intent,r]));for(let r of n){let s=o.get(r);if(s)return s}return null}function Ar(e,t){var c;let n=Wn(t),o=xe(e.label),i=xe(e.description),r=o.toLowerCase(),l=n?{"add todo":"a\xF1adir una tarea","delete todo":"eliminar una tarea","toggle todo":"marcar una tarea como hecha","complete todo":"marcar una tarea como hecha","search users":"buscar un usuario","create user":"crear un usuario","sign in":"iniciar sesi\xF3n","sign out":"cerrar sesi\xF3n","log in":"iniciar sesi\xF3n","log out":"cerrar sesi\xF3n",checkout:"finalizar la compra","add to cart":"a\xF1adir algo al carrito","place order":"hacer tu pedido"}:{"add todo":"add a task","delete todo":"delete a task","toggle todo":"mark a task done","complete todo":"mark a task done","search users":"search for a user","create user":"create a user","sign in":"sign in","sign out":"sign out","log in":"sign in","log out":"sign out",checkout:"check out","add to cart":"add something to your cart","place order":"place your order"};if(l[r])return l[r];if(i){let u=i.match(/^(adds?|creates?|deletes?|removes?|updates?|sends?|opens?|shows?|lists?|marks?|completes?|toggles?|searches?|finds?|places?|submits?)\s+(.+?)(?:\.|$)/i);if(u){let p=u[1].toLowerCase().replace(/s$/,""),f=u[2].toLowerCase();return n?`${(c={add:"a\xF1adir",create:"crear",delete:"eliminar",remove:"quitar",update:"actualizar",send:"enviar",open:"abrir",show:"ver",list:"ver",mark:"marcar",complete:"completar",toggle:"cambiar",search:"buscar",find:"buscar",place:"hacer",submit:"enviar"}[p])!=null?c:p} ${f}`.slice(0,48):`${p} ${f}`.slice(0,48)}}if(o){let u=o.split(/\s+/);return u.length>=2?`${u[0].toLowerCase()} ${u.slice(1).join(" ").toLowerCase()}`:o.toLowerCase()}return xe(e.intent).replace(/_/g," ")}function Sr(e,t,n){let o=Ar(e,n);return ee(t.bubblePromptFromAction,{action:o})}function wr(e,t){let n=e.toLowerCase(),o=Wn(t),i=e.match(/from here (?:you|the user|users?) (?:can|may|could)\s+(.+?)(?:[.;]|$)/i);if(i!=null&&i[1]){let r=i[1].trim().replace(/[.;]+$/,"");if(r.length>=4&&r.length<=56)return o?`\xBFQuieres ${r.toLowerCase()}?`:`Want to ${r.toLowerCase()}?`}return/sign(?:\s|-)?in|log(?:\s|-)?in|authenticate|iniciar ses/i.test(n)?o?"\xBFQuieres iniciar sesi\xF3n?":"Want to sign in?":/sign(?:\s|-)?up|register|create an account|registr/i.test(n)?o?"\xBFQuieres registrarte?":"Want to create an account?":/cart|checkout|check out|finalizar compra|pagar/i.test(n)?o?"\xBFFinalizar tu compra?":"Ready to checkout?":/user|account|people|person|usuario|cuenta/i.test(n)&&/list|search|browse|manage|ver|buscar/i.test(n)?o?"\xBFBuscar un usuario?":"Looking for a user?":/product|item|catalog|tienda|producto/i.test(n)&&/list|browse|shop|search|ver|buscar/i.test(n)?o?"\xBFBuscar un producto?":"Browse products?":/task|todo|tarea/i.test(n)&&/add|create|list|manage|añadir|crear/i.test(n)?o?"\xBFA\xF1adir una tarea?":"Want to add a task?":/setting|preference|ajuste|configur/i.test(n)?o?"\xBFCambiar alg\xFAn ajuste?":"Need to change a setting?":/profile|perfil/i.test(n)?o?"\xBFActualizar tu perfil?":"Update your profile?":/bill|invoice|payment|factur|pago/i.test(n)?o?"\xBFVer tu facturaci\xF3n?":"Check your billing?":/password|contrase/i.test(n)?o?"\xBFCambiar tu contrase\xF1a?":"Change your password?":/message|chat|conversation/i.test(n)?o?"\xBFEnviar un mensaje?":"Send a message?":/order|pedido/i.test(n)?o?"\xBFVer tus pedidos?":"Check your orders?":null}function Tr(e,t){let n=Wn(t),o=vr(e.intent),i=xe(e.label).toLowerCase();if(Fo.has(o)||Fo.has(i.replace(/\s+/g,"_")))return null;let r=`${o} ${i}`;return/login|sign_in|signin|auth/.test(r)?n?"\xBFQuieres iniciar sesi\xF3n?":"Want to sign in?":/register|signup|sign_up|sign-up/.test(r)?n?"\xBFQuieres registrarte?":"Want to create an account?":/cart|checkout|basket/.test(r)?n?"\xBFFinalizar tu compra?":"Ready to checkout?":/user|users|account|people|member/.test(r)?n?"\xBFBuscar un usuario?":"Looking for a user?":/product|catalog|shop|store|item/.test(r)?n?"\xBFBuscar un producto?":"Browse products?":/todo|task/.test(r)?n?"\xBFA\xF1adir una tarea?":"Want to add a task?":/setting|preference|config/.test(r)?n?"\xBFCambiar alg\xFAn ajuste?":"Need to change a setting?":/profile|account_overview/.test(r)?n?"\xBFActualizar tu perfil?":"Update your profile?":/bill|invoice|payment|subscription|pricing/.test(r)?n?"\xBFVer tu facturaci\xF3n?":"Check your billing?":/search|find|lookup/.test(r)?n?"\xBFQu\xE9 buscas?":"What are you looking for?":/chat|message|inbox|conversation/.test(r)?n?"\xBFEnviar un mensaje?":"Send a message?":/password|security/.test(r)?n?"\xBFCambiar tu contrase\xF1a?":"Change your password?":/order|transaction|history/.test(r)?n?"\xBFVer tu historial?":"Review your history?":/wallet|budget|saving|finance|balance/.test(r)?n?"\xBFRevisar tus finanzas?":"Review your finances?":/note|editor|write|compose|new_chat/.test(r)?n?"\xBFEscribir algo nuevo?":"Write something new?":null}function Er(e,t,n){var r;let o=((r=e.examples)!=null?r:[]).map(xe).find(s=>s.length>0&&yr(s));if(!o)return null;let i=o.replace(/\?+$/,"").trim();return/^(take me|go to|open|show me|navigate|ir a|abrir|mostrar|llévame)/i.test(i)?null:ee(t.bubblePromptFromExample,{phrase:i})}function $t(e,t,n){var l;let o=(l=n==null?void 0:n.locale)!=null?l:"en",i=n==null?void 0:n.actions,r=Cr(e,i);if(r)return Sr(r,t,o);let s=xe(e.description);if(s){let c=wr(s,o);if(c)return c}let a=Tr(e,o);return a||Er(e,t,o)}function q(e){let t=String(e!=null?e:"").trim();return t?(t=t.split("?")[0].split("#")[0],t=t.replace(/\([^)]*\)/g,""),t=t.replace(/\/{2,}/g,"/").replace(/^\/+|\/+$/g,""),t=t.replace(/(^|\/)index$/i,""),t=t.replace(/^\/+|\/+$/g,""),t.toLowerCase()):""}function Wo(e){var n;if(!e)return"";let t=e.split("/");return(n=t[t.length-1])!=null?n:""}function et(e,t){if(e==null||!t||t.length===0)return null;let n=String(e).trim();if(!n)return null;let o=q(n),i=t.filter(s=>s&&s.route&&s.route!==fe);if(i.length===0)return null;for(let s of i)if(q(s.route)===o)return s;if(o){let s=null;for(let a of i){let l=q(a.route);if(!l)continue;(o===l||o.startsWith(`${l}/`)||l.startsWith(`${o}/`)||o.endsWith(`/${l}`)||l.endsWith(`/${o}`))&&(!s||l.length>s.len)&&(s={route:a,len:l.length})}if(s)return s.route}let r=Wo(o)||o;if(r){for(let s of i)if(q(s.intent)===r||q(s.label)===r||Wo(q(s.route))===r)return s;for(let s of i)if(q(s.intent)===o||q(s.label)===o)return s}return null}function Un(e,t){var l,c,u,p,f;if(!e)return null;let n=((l=e.label)==null?void 0:l.trim())||((c=e.intent)==null?void 0:c.trim());if(!n)return null;let{messages:o,actions:i}=t,r=[ee(o.currentScreenLabel,{label:n})],s=(u=e.description)==null?void 0:u.trim();s&&r.push(s);let a=(p=e.actionIntents)!=null?p:[];if(a.length>0&&i&&i.length>0){let m=new Map(i.map(T=>[T.intent,T])),h=[],x=new Set;for(let T of a){let v=m.get(T),S=(f=v==null?void 0:v.label)==null?void 0:f.trim();S&&!x.has(S)&&(x.add(S),h.push(S))}h.length>0&&r.push(ee(o.currentScreenActions,{actions:h.join(", ")}))}return r.join(" \u2014 ")}function Ho(e){return String(e!=null?e:"").replace(/\s+/g," ").trim()}function Uo(e){return String(e!=null?e:"").split(/[-_]/)[0].trim().toLowerCase()}function Ir(e,t){let n=e.bubblePrompts;if(!n||typeof n!="object")return null;let o=Uo(t);if(!o)return null;for(let[i,r]of Object.entries(n))if(Uo(i)===o){let s=Ho(r);if(s)return s}return null}function Dt(e,t,n){if(!e)return null;let o=Ir(e,n==null?void 0:n.locale);if(o)return o;let i=Ho(e.bubblePrompt);if(i)return i;let r=$t(e,t,{locale:n==null?void 0:n.locale,actions:n==null?void 0:n.actions});return r||null}function Ft(e,t,n){let o=et(e,t.routes);return Un(o,{messages:n,actions:t.actions})}var Rr=/(^|[\s_.-])(log[\s_-]?in|sign[\s_-]?in|iniciar[\s_-]?sesi[oó]n|inicia[\s_-]?sesi[oó]n)([\s_.-]|$)|\b(login|signin|acceder|autenticar|authenticate)\b/i,Or=/log[\s_-]?out|sign[\s_-]?out|sign[\s_-]?up|signup|register|registr|cerrar[\s_-]?sesi[oó]n|crear[\s_-]?cuenta|reset|recover|recuperar|forgot|olvid/i,kr=/^(e-?mail|correo|username|user|usuario|login|identifier|account)$|email|user/i,_r=/pass(word)?|contrase|clave|pwd/i;function zn(e){var o,i;if(e.kind==="link"||(o=e.contextRequirements)!=null&&o.requiresAuth)return!1;let t=`${e.intent} ${e.label} ${(i=e.handler)!=null?i:""}`;if(Or.test(t)||!Rr.test(t))return!1;let n=Wt(e);return n.usernameParam!==null&&n.passwordParam!==null}function Wt(e){var o;let t=null,n=null;for(let[i,r]of Object.entries((o=e.parameters)!=null?o:{}))if(r.type==="string"){if(n===null&&_r.test(i)){n=i;continue}t===null&&kr.test(i)&&(t=i)}return{usernameParam:t,passwordParam:n}}function Hn(e){return typeof e=="string"?e.trim().length>0:e!=null}async function Ut(e,t,n,o){var c;if(!n)return{kind:"not-applicable"};let i=!1;try{i=n.isSupported()===!0}catch{i=!1}if(!i)return{kind:"not-applicable"};if(!zn(t))return{kind:"not-applicable"};if((o==null?void 0:o())===!0)return{kind:"not-applicable"};let{usernameParam:r,passwordParam:s}=Wt(t);if(!r||!s)return{kind:"not-applicable"};let a=(c=e.parameters)!=null?c:{};if(Hn(a[r])&&Hn(a[s]))return{kind:"not-applicable"};let l;try{l=await n.requestCredentials()}catch{l={status:"unavailable"}}return l.status==="success"&&l.username&&l.password?{kind:"proceed",action:{...e,parameters:{...a,[r]:Hn(a[r])?a[r]:l.username,[s]:l.password}}}:l.status==="dismissed"?{kind:"dismissed"}:{kind:"unavailable"}}function Ht(e){let t={messages:e.messages,isAuthenticated:e.isAuthenticated};function n(i){var a,l;let r=(a=i.intent)==null?void 0:a.trim();if(!r)return{success:!1,error:"No intent specified"};let s=e.manifest.routes.find(c=>c.intent===r);if(!s)return{success:!1,error:`Unknown intent: ${r}`};if(s.route!==fe&&e.messages.alreadyOnScreen)try{let c=e.navigation.getCurrentRoute();if(c!=null&&String(c).trim()!==""&&q(c)===q(s.route))return{success:!0,message:e.messages.alreadyOnScreen}}catch{}try{return s.route===fe?e.navigation.back():e.navigation.navigate(s.route),{success:!0}}catch(c){return{success:!1,error:`Navigation failed: ${c instanceof Error?c.message:"unknown"}`,message:(l=e.messages.navigationFailed)!=null?l:e.messages.actionFailed}}}function o(i,r){if(!(i!=null&&i.showcaseRoute)||!r.success||r.recoverable)return;let s=e.manifest.routes.find(a=>a.intent===i.showcaseRoute);if(!(!s||s.route===fe))try{let a=e.navigation.getCurrentRoute();if(a!=null&&String(a).trim()!==""&&q(a)===q(s.route))return;e.navigation.navigate(s.route)}catch{}}return{async execute(i,r={}){var s,a;if(!i||i.type==="none")return{success:!0};if(i.type==="navigate")return n(i);if(i.type==="execute"){let l=e.manifest.actions.find(u=>{var p;return u.intent===((p=i.intent)==null?void 0:p.trim())});if(l){let u=await Ut(i,l,e.credentialAutofill,e.isAuthenticated);if(u.kind==="proceed"){let p=await Je(u.action,e.manifest.actions,r,e.registries,t);return o(l,p),p}if(u.kind==="dismissed"||u.kind==="unavailable"){let p=u.kind==="dismissed"?(s=e.messages.signInAutofillDismissed)!=null?s:e.messages.cancelled:(a=e.messages.signInAutofillUnavailable)!=null?a:e.messages.actionUnavailable;return{success:!1,error:`sign_in_autofill_${u.kind}`,message:p}}}let c=await Je(i,e.manifest.actions,r,e.registries,t);return o(l,c),c}return{success:!1,error:`Action type not implemented: ${i.type}`}},async precheck(i,r={}){return Qe(i,e.manifest.actions,r,e.registries,t)}}}function zt(e,t){var o,i;if(e.kind==="link"||e.execution)return!0;let n=((o=e.handler)!=null?o:"").trim();return n?typeof((i=t.handlers)==null?void 0:i[n])=="function":!1}var zo=new Set;function Vt(e,t){var s,a,l;if(!t)return e;let n=(s=e.actions)!=null?s:[],o=n.filter(c=>zt(c,t));if(o.length===n.length)return e;let i=n.filter(c=>!zt(c,t)).map(c=>c.intent).sort(),r=i.join(",");return zo.has(r)||(zo.add(r),(l=(a=globalThis.console)==null?void 0:a.warn)==null||l.call(a,`[fyodos] ${i.length} manifest action(s) have no live handler in this app and were hidden from the agent so it never promises them: ${i.join(", ")}. To restore them, finish their wiring (see src/fyodos/FYODOS_HANDLERS.md) or re-run \`npx @fiodos/cli rewire .\` in the app repo.`)),{...e,actions:o}}function ke(e,t){var i;let n=(i=t.maxChars)!=null?i:1500;if(e.length<=n)return e;let o=Math.max(0,n-t.truncationSuffix.length);return e.slice(0,o)+t.truncationSuffix}function tt(e,t,n){var l;let o=(l=n.maxChars)!=null?l:1500,i=(e==null?void 0:e.trim())||null,r=(t==null?void 0:t.trim())||null;if(!i&&!r)return null;if(!r)return ke(i,{...n,maxChars:o});if(!i)return ke(r,{...n,maxChars:o});let s=`
|
|
2
|
+
|
|
3
|
+
`,a=o-i.length-s.length;return a<=n.truncationSuffix.length?ke(i,{...n,maxChars:o}):i+s+ke(r,{...n,maxChars:a})}var Vn=[{type:"email",regex:/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g,replacement:"[REDACTED:EMAIL]"},{type:"payment_card",regex:/\b\d(?:[ -]?\d){12,18}\b/g,replacement:"[REDACTED:CARD]"},{type:"phone",regex:/(?:\+\d{1,3}[\s.-]?)?\b\d(?:[\s.-]?\d){8,13}\b/g,replacement:"[REDACTED:PHONE]"}],Gt={ES:[{type:"iban_es",regex:/\bES[\s-]?\d{2}(?:[\s-]?\d){20}\b/g,replacement:"[REDACTED:IBAN]"},{type:"national_id_es",regex:/\b\d{8}[A-Za-z]\b/g,replacement:"[REDACTED:NATIONAL_ID]"}],US:[{type:"ssn_us",regex:/\b\d{3}[- ]\d{2}[- ]\d{4}\b/g,replacement:"[REDACTED:NATIONAL_ID]"}]};function Gn(e={}){var i,r;let t=((i=e.countryPacks)!=null?i:[]).flatMap(s=>{let a=Gt[s.toUpperCase()];if(!a)throw new Error(`[fyodos] Unknown PII country pack "${s}". Available packs: ${Object.keys(Gt).join(", ")}. Use customPatterns to add your own.`);return a}),[n,...o]=Vn;return[n,...(r=e.customPatterns)!=null?r:[],...t,...o]}function Kt(e={}){let t=Gn(e);return n=>{let o=n,i=[];for(let{type:r,regex:s,replacement:a}of t)s.test(o)&&(i.push(r),o=o.replace(s,a)),s.lastIndex=0;return o=o.replace(/\+\s?\[REDACTED:PHONE\]/g,"[REDACTED:PHONE]"),{sanitized:o,redactions:i}}}function Mr(e){return String(e!=null?e:"").replace(/\s+/g," ").trim()}function Lr(e){var t,n;return(n=(t=e.split(/[-_]/)[0])==null?void 0:t.toLowerCase())!=null?n:e.toLowerCase()}function Br(e){return Lr(e)==="es"}function Kn(e){return e.replace(/^[¿¡]+/,"").replace(/[?!.…]+$/,"").trim()}function Nr(e,t,n){var f;let o=Kn(e),i=Kn(t),r=i.match(/\{(\w+)\}/);if(!r||r.index==null)return null;let s=r[1],a=i.slice(0,r.index).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),l=i.slice(r.index+r[0].length).replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),c=new RegExp(`^${a}(?<value>.+?)${l}$`,"i"),u=o.match(c);if(!((f=u==null?void 0:u.groups)!=null&&f.value))return null;let p=u.groups.value.trim();return n.replace(`{${s}}`,p)}var $r=[[/^want to (.+)$/i,"I want to $1"],[/^ready to checkout$/i,"I want to checkout"],[/^ready to (.+)$/i,"I want to $1"],[/^looking for (.+)$/i,"I'm looking for $1"],[/^browse (.+)$/i,"I want to browse $1"],[/^check your (.+)$/i,"I want to check my $1"],[/^need to (.+)$/i,"I need to $1"],[/^update your (.+)$/i,"I want to update my $1"],[/^send (.+)$/i,"I want to send $1"],[/^change your (.+)$/i,"I want to change my $1"],[/^review your (.+)$/i,"I want to review my $1"],[/^write (.+)$/i,"I want to write $1"],[/^what are you looking for$/i,"I'm looking for something"]],Dr=[[/^quieres ir a (.+)$/i,"Quiero ir a $1"],[/^quieres (.+)$/i,"Quiero $1"],[/^finalizar tu compra$/i,"Quiero finalizar mi compra"],[/^buscar un usuario$/i,"Quiero buscar un usuario"],[/^buscar un producto$/i,"Quiero buscar un producto"],[/^buscar (.+)$/i,"Quiero buscar $1"],[/^ver tu (.+)$/i,"Quiero ver mi $1"],[/^ver tus (.+)$/i,"Quiero ver mis $1"],[/^cambiar algún ajuste$/i,"Quiero cambiar un ajuste"],[/^cambiar tu (.+)$/i,"Quiero cambiar mi $1"],[/^actualizar tu perfil$/i,"Quiero actualizar mi perfil"],[/^añadir una tarea$/i,"Quiero a\xF1adir una tarea"],[/^añadir (.+)$/i,"Quiero a\xF1adir $1"],[/^enviar un mensaje$/i,"Quiero enviar un mensaje"],[/^revisar tus finanzas$/i,"Quiero revisar mis finanzas"],[/^revisar tu historial$/i,"Quiero revisar mi historial"],[/^escribir algo nuevo$/i,"Quiero escribir algo nuevo"],[/^qué buscas$/i,"Busco algo"]];function Yt(e,t){var c;let n=Mr(e);if(!n)return"";let o=(c=t==null?void 0:t.locale)!=null?c:"en",i=Br(o),r=t==null?void 0:t.messages,s=Kn(n);if(r){let u=i?[[r.bubblePromptFromExample,"Quiero {phrase}"],[r.bubblePromptFromAction,"Quiero {action}"],[r.bubblePromptFromLabel,"Quiero ir a {label}"]]:[[r.bubblePromptFromExample,"I want to {phrase}"],[r.bubblePromptFromAction,"I want to {action}"],[r.bubblePromptFromLabel,"I want to open {label}"]];for(let[p,f]of u){let m=Nr(n,p,f);if(m)return m}}let a=i?Dr:$r;for(let[u,p]of a)if(u.test(s))return s.replace(u,p);return i?`Quiero ${s.charAt(0).toLowerCase()+s.slice(1)}`:`I want to ${s.charAt(0).toLowerCase()+s.slice(1)}`}function Yn(e,t=1){return`@fiodos/${e}/assistant_consent_v${t}`}function jt(e){var o;let t=Yn(e.appId,(o=e.version)!=null?o:1),{storage:n}=e;return{storageKey:t,async hasConsented(){try{let i=await n.getItem(t);return i?JSON.parse(i).granted===!0:!1}catch{return!1}},async grant(){let i=JSON.stringify({granted:!0,grantedAt:new Date().toISOString()});await n.setItem(t,i)},async revoke(){await n.removeItem(t)}}}function Xt(e){return e.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\p{L}\p{N}\s]/gu," ").replace(/\s+/g," ").trim()}function qt(e,t){let n=Xt(e);if(!n)return{matched:!1,command:""};for(let o of t){let i=Xt(o);if(!i)continue;let r=n.indexOf(i);if(r===-1)continue;return{matched:!0,command:n.slice(r+i.length).trim(),phrase:i}}return{matched:!1,command:""}}function Qt(e){return{logEvent(t){if(e)try{let n=e.logEvent(t);n&&typeof n.catch=="function"&&n.catch(()=>{})}catch{}}}}var Vo=40;function Jt(e){return typeof e!="number"||Number.isNaN(e)?Vo:Math.max(0,Math.min(100,Math.round(e)))}function Go(e,t){let n=Jt(t);if(n<=0)return 0;let o=n/100,i=r=>Math.max(1,Math.round(r*o));switch(e){case"response":return[0,i(12),40,i(12)];case"orbTap":return i(18);case"listenStart":return i(14);case"listenStop":return i(8);default:return i(10)}}function jn(e){let t=()=>typeof e=="function"?e():e;return{trigger(n){try{let i=globalThis.navigator,r=Go(n,t());!(r===0||Array.isArray(r)&&r.every(a=>a===0))&&i&&typeof i.vibrate=="function"&&i.vibrate(r)}catch{}}}}var nt={en:{affirmative:["yes","yeah","yep","sure","confirm","confirmed","go ahead","do it","ok","okay","correct","exactly","absolutely","affirmative"],negative:["no","nope","cancel","cancel it","stop","wait","dont","never mind","nevermind","forget it","negative"]},es:{affirmative:["si","s\xED","confirma","confirmo","adelante","hazlo","vale","ok","okey","correcto","exacto","claro","efectivamente","dale"],negative:["no","cancela","cancelar","cancelalo","canc\xE9lalo","para","espera","detente","mejor no","olvidalo","olv\xEDdalo","nada"]}};function Zt(e){var o,i,r;let t=(i=(o=e.split(/[-_]/)[0])==null?void 0:o.toLowerCase())!=null?i:e.toLowerCase(),n=(r=nt[e])!=null?r:nt[t];if(!n)throw new Error(`[fyodos] No confirmation lexicon for locale "${e}". Built-in locales: ${Object.keys(nt).join(", ")}. Pass a custom ConfirmationLexicon for your locale.`);return n}function _e(e){return e.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[.,;:!?¡¿"'«»()]/g," ").replace(/\s+/g," ").trim()}function Ko(e,t){return e===t||e.startsWith(`${t} `)||e.endsWith(` ${t}`)||e.includes(` ${t} `)}function Xn(e,t){let n=_e(e);return n?t.affirmative.some(o=>Ko(n,_e(o))):!1}function en(e,t){let n=_e(e);return n?t.negative.some(o=>Ko(n,_e(o))):!1}function tn(e,t){let n=en(e,t),o=Xn(e,t);return n?"negative":o?"affirmative":"ambiguous"}function is(e,t){return t?` ${e} `.includes(` ${t} `):!1}function nn(e,t,n){let o=_e(e);return o?en(e,n)?"negative":is(o,_e(t))?"affirmative":"ambiguous":"ambiguous"}var qn={maxRecentTurns:10,summarizeAfterTurns:14,maxSummaryChars:800,sessionIdleMs:18e5,maxStoredTurns:40},ot={maxRecentTurns:16,summarizeAfterTurns:22,maxSummaryChars:1600,maxStoredTurns:80};function Me(e,t=!1){let n=t?ot:void 0;return e==null||typeof e!="number"||Number.isNaN(e)?n?{...n}:void 0:e<=0?{...n,sessionIdleMs:Number.POSITIVE_INFINITY}:{...n,sessionIdleMs:Math.round(e*6e4)}}var ve=5,Pe=200;function Yo(e,t){let n=e.trim();return n.length<=t?n:`${n.slice(0,t-1)}\u2026`}function jo(e,t){return e.length<=t?e:`${e.slice(0,t-1)}\u2026`}function Xo(e,t,n){let o=t.map(i=>i.role==="user"?`User: ${Yo(i.content,120)}`:`Assistant: ${Yo(i.content,120)}`).join(" | ");return jo(e?`${e} | ${o}`:o,n)}function Qn(e){return{...qn,...e}}function Le(e){return{turns:[],summary:null,lastActivityAt:Date.now()}}function Be(e,t=Date.now(),n){var i;let{sessionIdleMs:o}=Qn(n);return e.turns.length===0&&!e.summary&&!((i=e.uiArchive)!=null&&i.length)?(e.lastActivityAt=t,!1):t-e.lastActivityAt<=o?!1:(e.turns=[],e.summary=null,e.uiArchive=[],e.lastActivityAt=t,!0)}function Jn(e,t=null,n){let{maxRecentTurns:o}=Qn(n);return e.length===0?{history:[],summary:(t==null?void 0:t.trim())||null}:{history:e.slice(-o),summary:(t==null?void 0:t.trim())||null}}function it(e,t=Date.now(),n){return Be(e,t,n),e.lastActivityAt=t,Jn(e.turns,e.summary,n)}function rs(e,t){let{maxRecentTurns:n,summarizeAfterTurns:o,maxSummaryChars:i,maxStoredTurns:r}=t;if(e.turns.length>o){let s=e.turns.length-n,a=e.turns.slice(0,s);e.summary=Xo(e.summary,a,i),e.turns=e.turns.slice(s)}if(e.turns.length>r){let s=e.turns.slice(0,e.turns.length-n);e.summary=Xo(e.summary,s,i),e.turns=e.turns.slice(-n)}}function rt(e,t,n,o=Date.now(),i){var l;let r=Qn(i),s=t.trim(),a=n.trim();!s||!a||(e.turns.push({role:"user",content:s},{role:"assistant",content:a}),e.uiArchive=(l=e.uiArchive)!=null?l:[],e.uiArchive.push({userText:s,replyText:a}),e.uiArchive.length>Pe&&(e.uiArchive=e.uiArchive.slice(-Pe)),e.lastActivityAt=o,rs(e,r))}function ss(e,t){var r,s,a,l;let n;if((r=e.uiArchive)!=null&&r.length)n=e.uiArchive;else{n=[];for(let c=0;c<e.turns.length;c+=2){let u=e.turns[c],p=e.turns[c+1];(u==null?void 0:u.role)==="user"&&(p==null?void 0:p.role)==="assistant"&&n.push({userText:u.content,replyText:p.content})}}if(!((s=t==null?void 0:t.userText)!=null&&s.trim()))return n;let o=n[n.length-1];return o!=null&&o.userText===t.userText&&o.replyText===((a=t.replyText)!=null?a:"")?t.replyText&&o.replyText!==t.replyText?[...n.slice(0,-1),t]:n:[...n,{userText:t.userText,replyText:(l=t.replyText)!=null?l:""}]}function st(e,t,n=ve,o){Be(e,Date.now(),o);let i=ss(e,t),r=Math.max(1,n);return{exchanges:i.slice(-r),hasOlder:i.length>r,totalCount:i.length}}var ce="anon";function at(e){let t=(e!=null?e:"").trim();if(!t)return ce;let n=2166136261;for(let o=0;o<t.length;o++)n^=t.charCodeAt(o),n=Math.imul(n,16777619);return`u_${(n>>>0).toString(36)}`}function ct(e,t="public",n=ce){let o=t==="internal"?`@fiodos/${e}/conversation_internal_v1`:`@fiodos/${e}/conversation_v1`;return n===ce?o:`${o}/${n}`}function as(e){if(!Array.isArray(e))return[];let t=[];for(let n of e.slice(-ot.maxStoredTurns)){let o=n==null?void 0:n.role,i=n==null?void 0:n.content;(o==="user"||o==="assistant")&&typeof i=="string"&&i&&t.push({role:o,content:i})}return t}function cs(e){if(!Array.isArray(e))return[];let t=[];for(let n of e.slice(-Pe)){let o=n==null?void 0:n.userText,i=n==null?void 0:n.replyText;typeof o=="string"&&o&&typeof i=="string"&&t.push({userText:o,replyText:i})}return t}async function on(e,t,n,o=null,i="public",r=ce){var a,l;let s=ct(t,i,r);try{if(n.turns.length===0&&!n.summary&&!((a=n.uiArchive)!=null&&a.length)){await e.removeItem(s);return}let u={v:1,turns:n.turns,summary:n.summary,lastActivityAt:n.lastActivityAt,uiArchive:(l=n.uiArchive)!=null?l:[],retentionMinutes:o,owner:r};await e.setItem(s,JSON.stringify(u))}catch{}}async function rn(e,t,n=Date.now(),o="public",i=ce){var s;let r=ct(t,o,i);try{let a=await e.getItem(r);if(!a)return null;let l=JSON.parse(a);if((l==null?void 0:l.v)!==1)return await e.removeItem(r),null;if((typeof l.owner=="string"?l.owner:ce)!==i)return null;let u={turns:as(l.turns),summary:typeof l.summary=="string"&&l.summary?l.summary:null,lastActivityAt:typeof l.lastActivityAt=="number"&&Number.isFinite(l.lastActivityAt)?l.lastActivityAt:0,uiArchive:cs(l.uiArchive)},p=typeof l.retentionMinutes=="number"?l.retentionMinutes:null;return Be(u,n,Me(p))||u.turns.length===0&&!u.summary&&!((s=u.uiArchive)!=null&&s.length)?(await e.removeItem(r),null):(u.lastActivityAt=n,u)}catch{return null}}async function sn(e,t,n="public",o=ce){try{await e.removeItem(ct(t,n,o))}catch{}}function Ne(e){return e==null||Number.isNaN(Number(e))?100:Math.max(0,Math.min(100,Number(e)))}function Zn(e,t){let n=Ne(t);if(n<=0)return 0;let o=n/100;return e*(.008+o*.035)}function eo(e,t){return Zn(e,t)}var $e=35,lt="rgba(255,255,255,0.1)",ut="#ffffff";function De(e){return e==null||Number.isNaN(Number(e))?$e:Math.max(0,Math.min(100,Number(e)))}function to(e,t){let n=De(t)/100;return n<=0?0:e*(.002+n*.012)}function dt(e){let t=e==null?void 0:e.trim();if(!t)return lt;if(t.startsWith("rgba")||t.startsWith("rgb"))return t;if(t.startsWith("#")){let n=t.length===4?`#${t[1]}${t[1]}${t[2]}${t[2]}${t[3]}${t[3]}`:t.slice(0,7),o=parseInt(n.slice(1,3),16),i=parseInt(n.slice(3,5),16),r=parseInt(n.slice(5,7),16);return[o,i,r].some(s=>Number.isNaN(s))?lt:`rgba(${o},${i},${r},0.12)`}return lt}function pt(e,t,n){let o=e,i=to(e,n),r=eo(e,t),s=o+2*i,a=o+2*i+2*r;return{fillPx:o,interiorPx:i,exteriorPx:r,totalPx:a,fillRadius:o/2,midPx:s}}function an(e,t){let n=e/150;return`0 0 ${Math.round(48*n)}px ${t}33`}function cn(e){let t=e/150;return[`inset -${Math.round(8*t)}px -${Math.round(12*t)}px ${Math.round(28*t)}px rgba(0,0,0,0.36)`,`inset ${Math.round(6*t)}px ${Math.round(8*t)}px ${Math.round(20*t)}px rgba(255,255,255,0.07)`].join(", ")}var te={accent:"#2f6bff",glow:"#5aa2ff",background:"rgba(0,0,0,0.72)",waveform:"#ffffff",colorKey:"azul"},qo={colorKey:te.colorKey,glowKey:te.colorKey,accentColor:te.accent,glowColor:te.glow,backgroundColor:te.background,waveformColor:te.waveform,waveformColorKey:"custom",speed:42,glowIntensity:100,innerBorderColor:ut,innerBorderWidth:$e,borderWidth:1.5,waveformHeight:26,size:52},Qo={size:30,shape:"circle",backgroundColor:te.background,borderColor:te.accent,iconColor:te.accent,icon:"keyboard",iconImageDataUrl:null,iconScale:1,innerBorderColor:ut,innerBorderWidth:$e,borderWidth:100},ht={backgroundColor:"#ffffff",textColor:"#16181d",borderColor:"rgba(0,0,0,0.08)",borderWidth:1,shape:"pill",borderRadius:14,textSize:13,bubbleScale:1,size:13},Jo={cardBackgroundColor:"#16181d",cardBorderColor:"rgba(255,255,255,0.14)",userTextColor:"rgba(255,255,255,0.75)",replyTextColor:"#ffffff",accentColor:te.accent,inputBackgroundColor:"#ffffff",borderRadius:18,sendButtonRadius:16};function Fe(e){let t=Zo(e);return t===null||t>.55?"#0f172a":"#f4f6fb"}function ln(e){let t=Zo(e);return t===null||t>.55?"#64748b":"rgba(244,246,251,0.65)"}function Zo(e){if(!e)return null;let t=e.trim().toLowerCase(),n,o,i,r=t.match(/^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/);if(r){let s=r[1];s.length===3?(n=parseInt(s[0]+s[0],16),o=parseInt(s[1]+s[1],16),i=parseInt(s[2]+s[2],16)):(n=parseInt(s.slice(0,2),16),o=parseInt(s.slice(2,4),16),i=parseInt(s.slice(4,6),16))}else{let s=t.match(/^rgba?\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)/);if(!s)return null;n=Number(s[1]),o=Number(s[2]),i=Number(s[3])}return(.299*n+.587*o+.114*i)/255}var ft={bars:[.42,.72,1,.72,.42],color:"#eaf1ff",barWidthRatio:.06,gapRatio:.05,heightRatio:.4};function no(e,t){let{bars:n,barWidthRatio:o,gapRatio:i,heightRatio:r}=ft,s=(t!=null?t:"").trim()||ft.color,a=e*o,l=e*i,c=e*r,u=n.length*a+(n.length-1)*l,p=(e-u)/2;return{bars:n.map((m,h)=>{let x=Math.max(a,c*m);return{x:p+h*(a+l),y:(e-x)/2,width:a,height:x}}),color:s,radius:a/2}}function un(e,t){let{bars:n,color:o,radius:i}=no(e,t),r=e/2,s=e*ft.heightRatio/2;return{color:o,radius:i,bars:n.map(a=>({...a,baseHalfHeight:a.height/2,centerY:r,maxHalfHeight:s}))}}function dn(e,t,n,o){let i=.5+.5*((.5+.5*Math.sin(e*1.6))*.6+(.5+.5*Math.sin(e*.9+1.1))*.4),r=.35+.65*(.5+.5*Math.sin(e*7+t*.95))*(.55+.45*Math.sin(e*3.1+t*.6)),s=n*(.5+r*i);return Math.max(n*.35,Math.min(s,o))}var fs=["pill","rounded","square","cloud"];function ei(e,t,n,o,i,r,s){let a=[];for(let l=0;l<=s;l++){let c=i+(r-i)*l/s;a.push([e+n*Math.cos(c),t+o*Math.sin(c)])}return a}function hs(e,t,n,o,i){let r=[];for(let s=0;s<=i;s++){let a=Math.PI-Math.PI*s/i;r.push([e+n*Math.cos(a),t-o*Math.sin(a)])}return r}function ms(e,t,n,o,i){let r=[];for(let s=0;s<=i;s++){let a=Math.PI*s/i;r.push([e+n*Math.cos(a),t+o*Math.sin(a)])}return r}function pn(e,t,n){n&&t.shift(),e.push(...t)}var gs=1.28,bs=38;function ni(e,t,n){return Math.max(t,Math.min(n,Math.round(e)))}function io(e){if(!Number.isFinite(e)||e<=0)return 5;let t=e*.88;return ni(t/bs,3,7)}function oi(e=5){let l=ni(e,3,7),c=88/(2*l),u=5,p=65/2,f=[];pn(f,ei(6,50,u,p,Math.PI/2,Math.PI*3/2,10),!1);for(let h=0;h<l;h++){let x=6+c+2*c*h;pn(f,hs(x,18,c,14,8),!0)}pn(f,ei(94,50,u,p,-Math.PI/2,Math.PI/2,10),!0);for(let h=l-1;h>=0;h--){let x=6+c+2*c*h;pn(f,ms(x,83,c,12,8),!0)}return`polygon(${f.map(([h,x])=>`${h.toFixed(2)}% ${x.toFixed(2)}%`).join(", ")})`}var ro=oi(5);function so(e){return oi(io(e))}function mt(e,t){return typeof e=="number"&&Number.isFinite(e)?e:t}function oo(e,t){return typeof e=="string"&&e.trim()?e:t}function fn(e){let t=String(e!=null?e:"").toLowerCase();return t==="circle"||t==="round"?"cloud":fs.includes(t)?t:ht.shape}function gt(e,t){if(e!=null)return`${Math.round(e*t)}px`}function We(e){let t=e!=null?e:{},n=ht,o=mt(t.textSize,mt(t.size,n.textSize));return{backgroundColor:oo(t.backgroundColor,n.backgroundColor),textColor:oo(t.textColor,n.textColor),borderColor:oo(t.borderColor,n.borderColor),borderWidth:mt(t.borderWidth,n.borderWidth),shape:fn(t.shape),borderRadius:mt(t.borderRadius,n.borderRadius),textSize:o,bubbleScale:mt(t.bubbleScale,n.bubbleScale)}}var ao=38,co=14,ti=4;function bt(e){let t=e.textSize,n=e.bubbleScale,o=Math.round(co*n),i=Math.round(t*1.25),r=Math.max(Math.round(ao*n),i+ti*2);fn(e.shape)==="cloud"&&(r=Math.round(r*gs));let s=Math.max(ti,Math.round((r-i)/2));return{fontPx:t,padV:s,padH:o,approxHeight:r}}function ys(e){let t=Math.round(e*.45);return{borderTopLeftRadius:t,borderTopRightRadius:t,borderBottomLeftRadius:t,borderBottomRightRadius:t}}var ii=999;function lo(e,t,n){switch(fn(e.shape)){case"square":return{borderRadius:0};case"pill":return{borderRadius:ii};case"cloud":{let i=ys(t),r=typeof n=="number"&&n>0?so(n):ro;return{...i,clipPath:r}}default:return{borderRadius:Math.min(e.borderRadius,Math.round(t/2))}}}function hn(e,t,n=1,o){var s;let i=fn(e.shape),r=lo({...e,shape:i},t,o);if(i==="pill"){let a=`${Math.round(ii*n)}px`;return{borderRadius:a,borderTopLeftRadius:a,borderTopRightRadius:a,borderBottomLeftRadius:a,borderBottomRightRadius:a,clipPath:"none"}}return i==="square"?{borderRadius:"0px",borderTopLeftRadius:"0px",borderTopRightRadius:"0px",borderBottomLeftRadius:"0px",borderBottomRightRadius:"0px",clipPath:"none"}:{borderRadius:gt(r.borderRadius,n),borderTopLeftRadius:gt(r.borderTopLeftRadius,n),borderTopRightRadius:gt(r.borderTopRightRadius,n),borderBottomLeftRadius:gt(r.borderBottomLeftRadius,n),borderBottomRightRadius:gt(r.borderBottomRightRadius,n),clipPath:(s=r.clipPath)!=null?s:"none"}}function mn(e,t){if(!e)return;let n=(o,i)=>{if(!i){e.style.removeProperty(o);return}e.style.setProperty(o,i,"important")};n("border-radius",t.borderRadius),n("border-top-left-radius",t.borderTopLeftRadius),n("border-top-right-radius",t.borderTopRightRadius),n("border-bottom-left-radius",t.borderBottomLeftRadius),n("border-bottom-right-radius",t.borderBottomRightRadius),n("clip-path",t.clipPath)}function gn(e){return Math.round(e*.5)}function bn(e=1){return!Number.isFinite(e)||e<=0?1:Math.max(.35,Math.min(1.75,e))}function yn(e,t){return e==="circle"?t/2:e==="rounded"?Math.max(6,Math.round(t*.28)):6}function xn(e,t,n="#ffffff"){let o=(e!=null?e:n).trim(),i=t.trim();if(!o)return n;let r=s=>{let a=s.toLowerCase();return a.startsWith("#")&&a.length>=7?a.slice(0,7):a};return r(o)===r(i)?n:o}var xs=[[8,11],[11,11],[14,11],[17,11],[8,14],[11,14],[14,14],[17,14]],ri={keyboard:{viewBox:"0 0 24 24",paths:[],contentBBox:{minX:4,minY:7,maxX:20,maxY:18},keyboardFrame:{x:4,y:7,w:16,h:11,rx:2},keyDots:xs},pen:{viewBox:"0 0 24 24",paths:[{d:"M4 20h4l10.5-10.5a1.5 1.5 0 0 0 0-2.12l-2.38-2.38a1.5 1.5 0 0 0-2.12 0L4 15.5V20z",fill:!1},{d:"M13.5 6.5l4 4",fill:!1}],contentBBox:{minX:4,minY:6.5,maxX:17.5,maxY:20}},chat:{viewBox:"0 0 24 24",paths:[],contentBBox:{minX:5,minY:4,maxX:19,maxY:18.5},chatFrame:{x:5,y:4,w:14,h:10,rx:2.5},chatTail:{left:7.5,right:10.5,tipX:5,tipY:18.5},chatLines:[{y:8,w:6},{y:10,w:6}]}};function vn(e="keyboard"){var t;return(t=ri[e])!=null?t:ri.keyboard}function Cn(e){var l,c;let t=e.viewBox.split(/\s+/).map(Number),n=(l=t[2])!=null?l:24,o=(c=t[3])!=null?c:24,{minX:i,minY:r,maxX:s,maxY:a}=e.contentBBox;return{x:n/2-(i+s)/2,y:o/2-(r+a)/2}}var vs=["keyboard","pen","chat"];function Ue(e){return vs.includes(e)?e:"keyboard"}var Ce={x:1,y:1};function le(e){if(e==null)return{...Ce};let t=Number(e.x),n=Number(e.y);return{x:Number.isFinite(t)?Math.min(1,Math.max(0,t)):Ce.x,y:Number.isFinite(n)?Math.min(1,Math.max(0,n)):Ce.y}}function uo(e){var f,m,h,x,T;let t=le(e.position),n=(f=e.safeAreaTop)!=null?f:0,o=(m=e.safeAreaBottom)!=null?m:0,i=(h=e.safeAreaLeft)!=null?h:0,r=(x=e.safeAreaRight)!=null?x:0,s=(T=e.margin)!=null?T:16,a=e.orbDiameter,l=Math.max(0,e.viewportWidth-i-r-2*s-a),c=Math.max(0,e.viewportHeight-n-o-2*s-a),u=i+s+t.x*l,p=n+s+t.y*c;return{right:e.viewportWidth-u-a,bottom:e.viewportHeight-p-a}}function An(e){var u,p,f;let t=(u=e.contentWidth)!=null?u:e.viewportWidth,n=(p=e.contentHeight)!=null?p:e.viewportHeight,o=e.orbDiameter,i=(f=e.edgeGap)!=null?f:8,r=uo({viewportWidth:t,viewportHeight:n,orbDiameter:o,margin:e.margin,position:e.position,safeAreaTop:e.safeAreaTop,safeAreaBottom:e.safeAreaBottom,safeAreaLeft:e.safeAreaLeft,safeAreaRight:e.safeAreaRight}),s=t-r.right-o,a=n-r.bottom-o,l=Math.max(i,t-o-i),c=Math.max(i,n-o-i);return{left:Math.min(l,Math.max(i,s)),top:Math.min(c,Math.max(i,a))}}function yt(e){let t=le(e);return{horizontal:t.x>=.5?"left":"right",vertical:t.y>=.5?"up":"down"}}function Sn(e){let t=le(e);return{x:t.x>=.5?1:0,y:t.y}}function wn(e){var m,h,x,T,v;let t=(m=e.safeAreaTop)!=null?m:0,n=(h=e.safeAreaBottom)!=null?h:0,o=(x=e.safeAreaLeft)!=null?x:0,i=(T=e.safeAreaRight)!=null?T:0,r=(v=e.margin)!=null?v:16,s=e.orbDiameter,a=Math.max(0,e.viewportWidth-o-i-2*r-s),l=Math.max(0,e.viewportHeight-t-n-2*r-s),c=e.centerX-s/2,u=e.centerY-s/2,p=a>0?(c-o-r)/a:0,f=l>0?(u-t-r)/l:0;return le({x:p,y:f})}var si={azul:"#2f6bff",cian:"#16b8d4",agua:"#19c39b",violeta:"#7a4dff",magenta:"#e0489e",ambar:"#f0820f",verde:"#46c24a",blanco:"#ffffff"},xt="rgba(0,0,0,0.72)";function vt(e){var o,i,r;let t=(o=e.colorKey)==null?void 0:o.trim();if(t&&t!=="custom"&&si[t])return si[t];let n=(i=e.backgroundColor)==null?void 0:i.trim();return n&&n!==xt?n:(r=e.accentColor)!=null&&r.trim()?e.accentColor.trim():n||xt}function Tn(e){var s,a,l,c,u,p,f,m;let t=vt(e),n=e.keyboardChip,o=(s=n==null?void 0:n.backgroundColor)==null?void 0:s.trim(),i=(a=e.glowColor)!=null?a:e.accentColor,r=n?{...n,icon:Ue(n.icon),backgroundColor:!o||o===xt?t:o,borderColor:(l=n.borderColor)!=null?l:i,iconColor:(c=n.iconColor)!=null?c:e.accentColor,innerBorderColor:n.innerBorderColor,innerBorderWidth:De(n.innerBorderWidth),borderWidth:Ne(n.borderWidth)}:void 0;return{accentColor:e.accentColor,backgroundColor:t,glowColor:i,colorKey:e.colorKey,glowKey:e.glowKey,speed:(u=e.speed)!=null?u:42,glowIntensity:Ne(e.glowIntensity),hapticIntensity:Jt(e.hapticIntensity),innerBorderColor:e.innerBorderColor,innerBorderWidth:De(e.innerBorderWidth),size:e.size,borderWidth:(p=e.borderWidth)!=null?p:2,waveformHeight:(f=e.waveformHeight)!=null?f:26,waveformColor:(m=e.waveformColor)!=null?m:e.accentColor,keyboardChip:r}}function Ct(e){var n,o;return{theme:Tn(e.orbTheme),modalTheme:e.modalTheme,logoDataUrl:(n=e.logoDataUrl)!=null?n:null,logoTransform:(o=e.logoTransform)!=null?o:null,screenPosition:le(e.orbTheme.screenPosition)}}var Cs=/^(127\.|10\.|192\.168\.|172\.(1[6-9]|2\d|3[01])\.|169\.254\.|0\.0\.0\.0$)/;function po(e){let t=(e||"").trim().toLowerCase().replace(/^\[|\]$/g,"");return t?t==="localhost"||t.endsWith(".localhost")||t==="::1"||t==="::"||t.endsWith(".local")?!0:Cs.test(t):!1}function En(e,t=!1,n){var r;if(!e||t)return!1;let o=globalThis.location,i=n!=null?n:o?(r=o.hostname)!=null?r:"":null;return i==null?!1:!po(i)}var z=class extends Error{constructor(t,n,o){super(n!=null?n:t),this.name="AgentApiError",this.code=t,this.status=o}};var Ca=15e3,Aa=12e3;async function In(e,t,n,o){let i=new AbortController,r=!1,s=setTimeout(()=>{r=!0,i.abort()},n);o&&(o.aborted?i.abort():o.addEventListener("abort",()=>i.abort()));try{return await fetch(e,{...t,signal:i.signal})}catch(a){if(r)throw new z("timeout");if(o!=null&&o.aborted)throw new z("cancelled");let l=a instanceof Error?a.message:String(a);throw new z("network",l)}finally{clearTimeout(s)}}async function ai(e){let t={};try{let o=await e.text();o&&(t=JSON.parse(o))}catch{}let n=typeof t.detail=="string"?t.detail:typeof t.error=="string"?t.error:t.message;if(e.status===401||e.status===403)return new z("unauthorized",n,e.status);if(e.status===429){let o=typeof t.remaining=="number"||(n!=null?n:"").toLowerCase().includes("quota");return new z(o?"quota_exceeded":"rate_limited",n,e.status)}return e.status===404?new z("not_found",n,e.status):e.status>=500?new z("server_error",n,e.status):new z("unknown",n!=null?n:e.statusText,e.status)}function ci(e){var r,s;let t=e.baseUrl.replace(/\/$/,""),n=(r=e.turnTimeoutMs)!=null?r:Ca,o=(s=e.ttsTimeoutMs)!=null?s:Aa;function i(){var l,c;let a=(l=e.getUserId)==null?void 0:l.call(e);return{"Content-Type":"application/json",...e.apiKey?{"x-api-key":e.apiKey}:{},...a?{"x-user-id":a}:{},...(c=e.headers)!=null?c:{}}}return{async sendTurn(a,l){var h,x,T,v,S,R,E,g,C,A,B;let c={message:a.message.trim(),language:a.language,manifest_version:a.manifestVersion,manifest_routes:a.manifestRoutes,manifest_actions:a.manifestActions,app_name:a.appName,app_description:a.appDescription};(h=a.appType)!=null&&h.trim()&&(c.app_type=a.appType.trim()),(x=a.appFlow)!=null&&x.trim()&&(c.app_flow=a.appFlow.trim()),a.voice&&(c.voice=a.voice),(T=a.screenContext)!=null&&T.trim()&&(c.screen_context=a.screenContext.trim()),(v=a.currentRoute)!=null&&v.trim()&&(c.current_route=a.currentRoute.trim()),(S=a.conversationHistory)!=null&&S.length&&(c.conversation_history=a.conversationHistory.map(Q=>({role:Q.role,content:Q.content.trim()}))),(R=a.conversationSummary)!=null&&R.trim()&&(c.conversation_summary=a.conversationSummary.trim()),(E=a.llmModel)!=null&&E.trim()&&(c.llm_model=a.llmModel.trim()),(g=a.sessionId)!=null&&g.trim()&&(c.session_id=a.sessionId.trim()),(C=a.platformCapabilities)!=null&&C.credentialAutofill&&(c.platform_capabilities={credential_autofill:!0}),a.sessionContext&&(c.session_context={authenticated:a.sessionContext.authenticated,...a.sessionContext.capabilities?{capabilities:a.sessionContext.capabilities}:{}}),a.isContinuation&&(c.is_continuation=!0,typeof a.chainStep=="number"&&(c.chain_step=a.chainStep),a.lastStep&&(c.last_step={type:a.lastStep.type,intent:a.lastStep.intent,...a.lastStep.label?{label:a.lastStep.label}:{},success:a.lastStep.success}));let u=await In(`${t}/assistant/chat`,{method:"POST",headers:i(),body:JSON.stringify(c)},n,l==null?void 0:l.signal);if(!u.ok)throw await ai(u);let p;try{p=await u.json()}catch{throw new z("invalid_response")}let f=typeof p.task_status=="string"?p.task_status:"",m=f==="in_progress"||f==="blocked"?f:"complete";return{reply:((A=p.reply)!=null?A:"").trim(),audioBase64:(B=p.audio_base64)!=null?B:null,action:kt(p.action),wasTruncated:p.was_truncated===!0,taskStatus:m}},async previewTts(a,l){var c;try{let u=await In(`${t}/assistant/preview-tts`,{method:"POST",headers:i(),body:JSON.stringify({voice:a,text:l})},o);if(!u.ok)return null;let p=await u.json();return(c=p.audio_base64)!=null&&c.length?p.audio_base64:null}catch{return null}},async warmUp(){try{await In(`${t}/health`,{method:"GET",headers:i()},5e3)}catch{}},async fetchPublishedConfig(){let a=await In(`${t}/v1/client/config`,{method:"GET",headers:i()},8e3);if(!a.ok)throw await ai(a);return await a.json()}}}function fo(e,t){let n=Vt(e,t);return{manifestVersion:n.version,manifestRoutes:_t(n),manifestActions:Pt(n),appName:n.appName,appDescription:n.appDescription,...n.appType?{appType:n.appType}:{},...n.appFlow?{appFlow:n.appFlow}:{}}}function Sa(e){var o,i;let t=(o=e.intentDetected)!=null?o:null,n=(i=e.sessionId)!=null?i:null;switch(e.eventType){case"agent_session_started":return[{type:"session",session_id:n}];case"action_executed":{let r=[{type:"action",intent:t,session_id:n}];return e.actionExecuted!=null&&e.actionExecuted.confirmed===!0&&r.push({type:"confirmation_completed",intent:t,session_id:n}),r}case"action_confirmation_requested":return[{type:"confirmation_requested",intent:t,session_id:n}];default:return[]}}function li(e){var c,u;let t=e.baseUrl.replace(/\/$/,""),n=(c=e.flushIntervalMs)!=null?c:4e3,o=(u=e.maxBatch)!=null?u:20,i=[],r=null;function s(){var f,m;let p=(f=e.getUserId)==null?void 0:f.call(e);return{"Content-Type":"application/json",...e.apiKey?{"x-api-key":e.apiKey}:{},...p?{"x-user-id":p}:{},...(m=e.headers)!=null?m:{}}}function a(){if(r&&(clearTimeout(r),r=null),i.length===0)return;let p=i;i=[],(async()=>{try{await fetch(`${t}/v1/agent/events`,{method:"POST",headers:s(),body:JSON.stringify({events:p})})}catch{}})()}function l(){r||(r=setTimeout(a,n))}return{logEvent(p){let f=Sa(p);if(f.length!==0){for(let m of f)i.push(m);i.length>=o?a():l()}}}}var wa="BACK";function Ta(){return typeof window=="undefined"||!window.location?null:`${window.location.pathname}${window.location.search}`}function ui(e){let t=null,n=!1;return{navigate(o){if(!o||o===wa){this.back();return}n=!0,e.navigate(o)},back(){var o;if(e.back){e.back();return}if(n&&typeof window!="undefined"&&((o=window.history)==null?void 0:o.length)>1){window.history.back();return}e.backFallbackRoute&&e.navigate(e.backFallbackRoute)},getCurrentRoute(){return t!=null?t:e.getCurrentRoute?e.getCurrentRoute():Ta()},setCurrentRoute(o){t=o}}}function Ea(e){if(e)return e;try{if(typeof window!="undefined"&&window.localStorage){let n="__fyodos_probe__";return window.localStorage.setItem(n,"1"),window.localStorage.removeItem(n),window.localStorage}}catch{}let t=new Map;return{getItem:n=>t.has(n)?t.get(n):null,setItem:(n,o)=>{t.set(n,o)},removeItem:n=>{t.delete(n)}}}function di(e={}){let t=Ea(e.backend);return{async getItem(n){try{return t.getItem(n)}catch{return null}},async setItem(n,o){try{t.setItem(n,o)}catch{}},async removeItem(n){try{t.removeItem(n)}catch{}}}}function Ia(e){let t=e.getVoices();return t.length?Promise.resolve(t):new Promise(n=>{let o=!1,i=()=>{o||(o=!0,n(e.getVoices()))};try{e.addEventListener("voiceschanged",i,{once:!0})}catch{}setTimeout(i,600)})}function Ra(e,t){var i,r,s,a,l;if(!e.length)return;let n=t.toLowerCase(),o=(i=n.split("-")[0])!=null?i:n;return(l=(a=(s=(r=e.find(c=>{var u;return((u=c.lang)==null?void 0:u.toLowerCase())===n}))!=null?r:e.find(c=>{var u;return(u=c.lang)==null?void 0:u.toLowerCase().startsWith(`${o}-`)}))!=null?s:e.find(c=>{var u;return(u=c.lang)==null?void 0:u.toLowerCase().startsWith(o)}))!=null?a:e.find(c=>c.default))!=null?l:e[0]}function pi(){var t,n;if(typeof window=="undefined")return null;let e=window;return(n=(t=e.SpeechRecognition)!=null?t:e.webkitSpeechRecognition)!=null?n:null}function fi(){if(typeof navigator=="undefined")return!1;let e=navigator.userAgent||"",t=/iPad|iPhone|iPod/.test(e),n=/Macintosh/.test(e)&&typeof document!="undefined"&&"ontouchend"in document;return t||n}function hi(e={}){let t=pi(),n=null,o="",i=null,r=!1,s=!1,a=null,l=null,c=null,u=!1,p=!1,f=[],m="",h=null,x=null;function T(){x&&(clearTimeout(x),x=null)}function v(){if(T(),c){c.onresult=null,c.onerror=null,c.onend=null,c.onstart=null;try{c.abort()}catch{}}c=null}function S(){T(),!(!u||p)&&(x=setTimeout(()=>{x=null,u&&!p&&R()},600))}function R(){let O=pi();if(!O||!u||p)return;if(typeof document!="undefined"&&document.hidden){S();return}let b=new O;c=b,b.lang=m,b.continuous=!0,b.interimResults=!0,b.maxAlternatives=1,b.onresult=I=>{var F;if(!u||p)return;let $="";for(let P=0;P<I.results.length;P+=1){let J=I.results[P];if(!J)continue;let X=J[0];$=`${$} ${(F=X==null?void 0:X.transcript)!=null?F:""}`.trim()}let L=qt($,f);if(!L.matched)return;p=!0;let j=h;v(),j==null||j.onDetected(L.command)},b.onerror=I=>{var $;I.error==="aborted"||I.error==="no-speech"||!u||p||($=h==null?void 0:h.onError)==null||$.call(h,new Error(I.error||"wake recognition error"))},b.onend=()=>{!u||p||S()};try{b.start()}catch{S()}}let E=null,g=null;function C(){var b,I;if(typeof window=="undefined")return null;let O=window;return(I=(b=O.AudioContext)!=null?b:O.webkitAudioContext)!=null?I:null}function A(){if(E)return E;let O=C();if(!O)return null;try{E=new O}catch{E=null}return E}function B(O){let b=atob(O),I=b.length,$=new Uint8Array(I);for(let L=0;L<I;L+=1)$[L]=b.charCodeAt(L);return $.buffer}function Q(){if(g){try{g.onended=null,g.stop()}catch{}g=null}}async function N(O){let b=A();if(!b)return!1;try{b.state==="suspended"&&await b.resume();let I=await b.decodeAudioData(B(O));return await new Promise($=>{Q();let L=b.createBufferSource();g=L,L.buffer=I,L.connect(b.destination),L.onended=()=>{L.onended=null,g===L&&(g=null),$(!0)},L.start()})}catch{return!1}}function Y(){i&&(clearTimeout(i),i=null)}function ue(){Y(),n&&(n.onresult=null,n.onerror=null,n.onend=null,n.onstart=null),n=null}return{isRecognitionAvailable(){return t!=null},async startListening(O,b){var $,L,j;if(!t){($=b.onError)==null||$.call(b,new Error("SpeechRecognition unavailable in this browser"));return}if(u&&(u=!1,p=!1,h=null,v()),n){r=!0;try{n.abort()}catch{}ue()}o="",r=!1,s=!1;let I=new t;n=I,I.lang=O.locale,I.continuous=(L=O.continuous)!=null?L:!0,I.interimResults=!0,I.maxAlternatives=1,I.onresult=F=>{var X,me;let P="";for(let de=F.resultIndex;de<F.results.length;de+=1){let ge=F.results[de];if(!ge)continue;let Z=ge[0],Ae=(X=Z==null?void 0:Z.transcript)!=null?X:"";ge.isFinal?o=`${o} ${Ae}`.trim():P=`${P} ${Ae}`.trim()}let J=`${o} ${P}`.trim();J&&((me=b.onInterim)==null||me.call(b,J))},I.onerror=F=>{var P;F.error==="aborted"||r||F.error!=="no-speech"&&(s=!0,(P=b.onError)==null||P.call(b,new Error(F.error||"speech recognition error")))},I.onend=()=>{var J,X,me,de;Y();let F=r,P=o.trim();if(ue(),s){(J=b.onEnd)==null||J.call(b);return}if(F){(X=b.onEnd)==null||X.call(b);return}P?(me=b.onFinal)==null||me.call(b,P):(de=b.onEnd)==null||de.call(b)};try{I.start()}catch(F){ue(),(j=b.onError)==null||j.call(b,F);return}O.maxSeconds&&O.maxSeconds>0&&(i=setTimeout(()=>{try{I.stop()}catch{}},O.maxSeconds*1e3))},stopListening(){if(Y(),n)try{n.stop()}catch{}},cancelListening(){if(Y(),r=!0,n)try{n.abort()}catch{}},primePlayback(){let O=A();if(O)try{O.state==="suspended"&&O.resume();let b=O.createBuffer(1,1,O.sampleRate),I=O.createBufferSource();I.buffer=b,I.connect(O.destination),I.start(0)}catch{}if(!e.disableDeviceTtsFallback&&typeof window!="undefined"&&window.speechSynthesis)try{let b=window.speechSynthesis;b.getVoices(),b.paused&&b.resume();let I=new SpeechSynthesisUtterance(" ");I.volume=0,b.speak(I)}catch{}},async playAudioBase64Mp3(O){if(typeof window!="undefined"&&(this.stopPlayback(),!await N(O)&&typeof Audio!="undefined"))return new Promise(b=>{try{let I=new Audio(`data:audio/mp3;base64,${O}`);a=I;let $=()=>{I.onended=null,I.onerror=null,a===I&&(a=null),b()};I.onended=$,I.onerror=$,I.play().catch(()=>$())}catch{b()}})},async speakWithDeviceTts(O,b){if(e.disableDeviceTtsFallback||typeof window=="undefined"||!window.speechSynthesis)return;let I=window.speechSynthesis,$=await Ia(I);return new Promise(L=>{let j=null,F=()=>{j&&(clearInterval(j),j=null)};try{I.cancel();let P=new SpeechSynthesisUtterance(O);P.lang=b.locale;let J=Ra($,b.locale);J&&(P.voice=J),P.volume=1,P.rate=1,P.pitch=1,l=P;let X=()=>{F(),P.onstart=null,P.onend=null,P.onerror=null,l===P&&(l=null),L()};P.onend=X,P.onerror=X,I.speak(P),I.resume(),j=setInterval(()=>{if(!I.speaking&&!I.pending){F();return}I.pause(),I.resume()},9e3)}catch{F(),L()}})},stopPlayback(){if(Q(),a){try{a.pause()}catch{}a=null}if(typeof window!="undefined"&&window.speechSynthesis)try{window.speechSynthesis.cancel()}catch{}},supportsWakeWordDetection(){return t!=null&&!fi()},isWakeWordListening(){return u},async startWakeWordDetection(O,b){var I;if(!t||fi()){(I=b.onError)==null||I.call(b,new Error("wake_word_unsupported"));return}f=O.phrases,m=O.locale,h=b,u=!0,p=!1,R()},stopWakeWordDetection(){u=!1,p=!1,h=null,v()}}}function mi(){if(typeof navigator=="undefined")return null;let e=navigator;return e.credentials&&typeof e.credentials.get=="function"?e.credentials:null}function gi(){if(typeof window=="undefined")return!1;let e=window;return typeof e.PasswordCredential=="function"&&e.isSecureContext!==!1}function bi(){return{isSupported(){return mi()!==null&&gi()},async requestCredentials(){let e=mi();if(!e||!gi())return{status:"unavailable"};let t;try{t=await e.get({password:!0,mediation:"required"})}catch{return{status:"unavailable"}}let n=t;return n?n.type==="password"&&n.id&&typeof n.password=="string"&&n.password?{status:"success",username:n.id,password:n.password}:{status:"unavailable"}:{status:"dismissed"}}}}function ho(e,t){let n=t.startsWith("es");if(e instanceof z){switch(e.code){case"timeout":return n?"La respuesta tard\xF3 demasiado. Comprueba tu conexi\xF3n e int\xE9ntalo de nuevo.":"The response took too long. Check your connection and try again.";case"network":return n?"No pude conectar con el servidor de Fiodos. \xBFEst\xE1 el backend en marcha y la URL correcta?":"Could not reach the Fiodos server. Is the backend running and the URL correct?";case"unauthorized":return n?"La API key fue rechazada. Comprueba que coincide con la del proyecto en el dashboard.":"The API key was rejected. Check it matches the project key in your dashboard.";case"quota_exceeded":return n?"Has alcanzado el l\xEDmite de uso de IA de tu plan. Mej\xF3ralo en el dashboard para seguir.":"You reached your plan\u2019s AI usage limit. Upgrade in the dashboard to continue.";case"rate_limited":return n?"Demasiadas peticiones seguidas. Espera un momento e int\xE9ntalo de nuevo.":"Too many requests. Wait a moment and try again.";case"server_error":return n?"El servidor no pudo responder. Revisa que la IA est\xE9 configurada en el backend.":"The server could not respond. Check that the AI is configured on the backend.";case"cancelled":return n?"Cancelado.":"Cancelled.";default:break}if(e.message&&e.message!==e.code)return e.message}return e instanceof Error&&e.message?e.message:n?"No pude responder. Int\xE9ntalo de nuevo.":"I could not reply. Please try again."}function Rn(e){let t=null;return{set(n,o){t={ownerId:n,snapshot:o}},clear(n){(t==null?void 0:t.ownerId)===n&&(t=null)},getText(){var i,r,s;let n=(i=t==null?void 0:t.snapshot.text)==null?void 0:i.trim();return n||((s=(r=e.routeFallback)==null?void 0:r.call(e,e.getCurrentRoute()))==null?void 0:s.trim())||null},getSnapshot(){var n;return(n=t==null?void 0:t.snapshot)!=null?n:null}}}function yi(e){let{adapter:t,locale:n,maxSeconds:o}=e,i={state:"idle",interimText:"",volumeLevel:0},r=new Set;function s(l){i={...i,...l};for(let c of r)c(i)}function a(){s({state:"idle",interimText:"",volumeLevel:0})}return{getSnapshot(){return i},subscribe(l){return r.add(l),()=>r.delete(l)},async start(){i.state==="idle"&&(s({state:"recording",interimText:"",volumeLevel:.85}),await t.startListening({locale:n,continuous:!0,maxSeconds:o},{onInterim:l=>s({interimText:l}),onFinal:l=>{a(),l.trim()&&e.onTranscript(l)},onEnd:()=>{i.state!=="idle"&&a()},onError:l=>{var c;a(),(c=e.onError)==null||c.call(e,l)}}))},stop(){i.state==="recording"&&(s({state:"transcribing",volumeLevel:0}),t.stopListening())},cancel(){t.cancelListening(),a()},dispose(){t.cancelListening(),r.clear()}}}function Oa(e,t){if(t)return e.actions.find(n=>n.intent===t)}async function xi(e){var a,l,c,u,p,f,m;let{action:t,manifest:n,executor:o,context:i,messages:r,userMessage:s}=e;if(!t||t.type==="none")return{kind:"noop"};if(t.type==="navigate")return{kind:"executed",result:await o.execute(t)};if(t.type==="execute"){let h=Oa(n,t.intent);if(!((h==null?void 0:h.requireConfirmation)===!0))return{kind:"executed",result:await o.execute(t,i)};let T=await o.precheck(t,i);if(T.kind==="done")return{kind:"precheck-resolved",result:T.result};let v=(a=h==null?void 0:h.voiceConfirmation)!=null?a:"standard",S=v==="strict"?(u=h==null?void 0:h.confirmationPhrase)!=null?u:ee(r.strictConfirmationPhraseTemplate,{label:((c=(l=h==null?void 0:h.label)!=null?l:t.intent)!=null?c:"").toLowerCase()}):null;return{kind:"needs-confirmation",pending:{action:t,context:i,question:(f=(p=h==null?void 0:h.confirmationMessageTemplate)!=null?p:t.confirmationMessage)!=null?f:r.confirmationFallbackQuestion,voiceMode:v,strictPhrase:S,remainingConfirmations:(h==null?void 0:h.doubleConfirmation)===!0?2:1,userMessage:s,intent:(m=t.intent)!=null?m:""}}}return{kind:"noop"}}function vi(e,t,n,o={}){if(t.voiceMode==="disabled"||o.silent)return"ambiguous";let i=e.trim();return i.length<2?"ambiguous":t.voiceMode==="strict"&&t.strictPhrase!=null?nn(i,t.strictPhrase,n):tn(i,n)}var Ci={thinkingWatchdogMs:25e3,maxListeningSeconds:60,confirmationVoiceWindowMs:8e3,minTranscriptChars:2},Ai={enabled:!1,maxSteps:6,dwellMs:450};var wi={orbLabel:"Voice assistant",confirmTitle:"Confirm",confirmLabel:"Confirm",cancelLabel:"Cancel",consentTitle:"Voice assistant",consentBody:"This assistant uses your microphone to understand voice commands and may navigate or perform actions in this app on your behalf. Your speech is processed to answer you and is not stored as a transcript.",consentAccept:"Allow",consentDecline:"Not now",textPlaceholder:"Type a message\u2026",keyboardChipLabel:"Type instead of talking",sendLabel:"Send",micLabel:"Dictate message",micStopLabel:"Stop dictating",voiceUnavailable:"Voice input is not available in this browser. You can type instead.",activityThinking:"Thinking\u2026",activityNavigating:"Navigating to {label}\u2026",activityExecuting:"Running {label}\u2026",activityWaitingConfirmation:"Waiting for your confirmation\u2026"},ka={orbLabel:"Asistente de voz",confirmTitle:"Confirmar",confirmLabel:"Confirmar",cancelLabel:"Cancelar",consentTitle:"Asistente de voz",consentBody:"Este asistente usa tu micr\xF3fono para entender comandos de voz y puede navegar o realizar acciones en esta app en tu nombre. Tu voz se procesa para responderte y no se guarda como transcripci\xF3n.",consentAccept:"Permitir",consentDecline:"Ahora no",textPlaceholder:"Escribe un mensaje\u2026",keyboardChipLabel:"Escribir en lugar de hablar",sendLabel:"Enviar",micLabel:"Dictar mensaje",micStopLabel:"Detener dictado",voiceUnavailable:"La entrada por voz no est\xE1 disponible en este navegador. Puedes escribir.",activityThinking:"Pensando\u2026",activityNavigating:"Navegando a {label}\u2026",activityExecuting:"Ejecutando {label}\u2026",activityWaitingConfirmation:"Esperando tu confirmaci\xF3n\u2026"},Si={en:wi,es:ka};function _a(e){var t,n;return(n=(t=e.split(/[-_]/)[0])==null?void 0:t.toLowerCase())!=null?n:e.toLowerCase()}function Ti(e,t={}){var r,s,a,l,c;let n=(r=t.catalogs)!=null?r:{},o=_a(e),i=(c=(l=(a=(s=n[e])!=null?s:Si[e])!=null?a:n[o])!=null?l:Si[o])!=null?c:wi;return t.overrides?{...i,...t.overrides}:i}function Pa(){return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}var Ma=e=>new Promise(t=>setTimeout(t,e)),He=class{constructor(t){this.enabled=!0;this.phase="idle";this.lastExchange=null;this.pendingTurnText=null;this.confirmationMessage=null;this.confirmationVoiceHint=null;this.consentModalVisible=!1;this.sessionId=Pa();this.sessionStarted=!1;this.conversation=Le();this.pending=null;this.confirmationReasked=!1;this.confirmationVoiceActive=!1;this.silentTurn=!1;this.voiceBlocked=!1;this.abort=null;this.watchdog=null;this.confirmWindow=null;this.speakTimer=null;this.serverTtsUnavailable=!1;this.pendingConsentIntent=null;this.chainState=null;this.liveActivity=null;this.chainActive=!1;this.bubbleWindowSize=ve;this.conversationRetentionMinutes=null;this.conversationScope="public";this.removeIdentityListeners=null;this.loadingOlderExchanges=!1;this.loadOlderTimer=null;this.listeners=new Set;this.unsubscribeSpeech=null;var o,i,r,s,a,l,c,u,p;he(t.manifest),this.config=t,this.messages=Nt(t.locale,{catalogs:(o=t.messages)==null?void 0:o.catalogs,overrides:(i=t.messages)==null?void 0:i.overrides}),this.ui=Ti(t.locale,t.uiMessages),this.lexicon=(r=t.confirmationLexicon)!=null?r:Zt(t.locale),this.sanitizer=(s=t.sanitizer)!=null?s:Kt(),this.telemetry=Qt(t.telemetry),this.consent=jt({storage:t.storage,appId:t.manifest.appId,version:t.consentVersion}),this.credentialAutofill=t.credentialAutofill===void 0?bi():t.credentialAutofill,this.executor=Ht({manifest:t.manifest,registries:t.registries,navigation:t.navigation,messages:this.messages,isAuthenticated:t.isAuthenticated,credentialAutofill:this.credentialAutofill}),this.timings={...Ci,...t.timings};let n={...Ai,...t.chaining};if(this.chaining={enabled:n.enabled===!0,maxSteps:Math.max(1,Math.min(6,Math.floor(n.maxSteps||6))),dwellMs:Math.max(0,Math.min(3e3,Math.floor((a=n.dwellMs)!=null?a:450)))},this.ttsLocale=(l=t.ttsLocale)!=null?l:t.sttLocale,this.notifyError=(c=t.notifyError)!=null?c:(f=>{console.error(`[fyodos] ${f}`)}),this.screenStore=Rn({getCurrentRoute:()=>t.navigation.getCurrentRoute(),routeFallback:(u=t.routeContextFallback)!=null?u:(f=>Ft(f,t.manifest,this.messages))}),this.speech=yi({adapter:t.voice,locale:t.sttLocale,maxSeconds:this.timings.maxListeningSeconds,onTranscript:f=>this.onTranscript(f),onError:f=>this.onSpeechError(f)}),this.unsubscribeSpeech=this.speech.subscribe(()=>this.emit()),this.conversationIdentity=at((p=t.getUserId)==null?void 0:p.call(t)),this.restorePersistedConversation(),typeof window!="undefined"){let f=()=>{this.syncConversationIdentity()};window.addEventListener("focus",f),document.addEventListener("visibilitychange",f),this.removeIdentityListeners=()=>{window.removeEventListener("focus",f),document.removeEventListener("visibilitychange",f)}}}async restorePersistedConversation(){var o;let t=this.conversationIdentity,n=await rn(this.config.storage,this.config.manifest.appId,Date.now(),this.conversationScope,t);!n||this.conversationIdentity!==t||this.conversation.turns.length>0||(o=this.conversation.uiArchive)!=null&&o.length||(this.conversation.turns=n.turns,this.conversation.summary=n.summary,this.conversation.uiArchive=n.uiArchive,this.conversation.lastActivityAt=n.lastActivityAt,this.emit())}persistConversation(){on(this.config.storage,this.config.manifest.appId,this.conversation,this.conversationRetentionMinutes,this.conversationScope,this.conversationIdentity)}syncConversationIdentity(){var n,o;let t=at((o=(n=this.config).getUserId)==null?void 0:o.call(n));return t===this.conversationIdentity?!1:(this.persistConversation(),this.conversation=Le(),this.conversationIdentity=t,this.lastExchange=null,this.emit(),this.restorePersistedConversation(),!0)}resetConversation(){this.cancelAll(),this.conversation=Le(),this.lastExchange=null,sn(this.config.storage,this.config.manifest.appId,this.conversationScope,this.conversationIdentity),this.emit()}getState(){let t=this.speech.getSnapshot(),n=(this.phase==="listening"||this.phase==="confirming")&&t.state==="recording",o=this.phase==="thinking"||this.phase==="listening"&&t.state==="transcribing",i=st(this.conversation,this.lastExchange,this.bubbleWindowSize,this.conversationOptions);return{phase:this.phase,interimText:t.interimText,volumeLevel:t.volumeLevel,showWaveform:n,showThinking:o,isBusy:o||this.phase==="speaking",isListening:this.phase==="listening"&&t.state!=="idle",lastExchange:this.lastExchange,recentExchanges:i.exchanges,hasOlderExchanges:i.hasOlder,loadingOlderExchanges:this.loadingOlderExchanges,confirmationMessage:this.confirmationMessage,confirmationVoiceHint:this.confirmationVoiceHint,consentModalVisible:this.consentModalVisible,voiceBlocked:this.voiceBlocked,liveActivity:this.liveActivity,chainActive:this.chainActive}}setActivity(t){let n=this.liveActivity;n===t||n&&t&&n.kind===t.kind&&n.label===t.label||(this.liveActivity=t,this.emit())}setChainActive(t){this.chainActive!==t&&(this.chainActive=t,this.emit())}get voiceAvailable(){return this.config.voice.isRecognitionAvailable()&&!this.voiceBlocked}primeAudio(){var t,n;(n=(t=this.config.voice).primePlayback)==null||n.call(t)}markVoiceBlocked(t){this.voiceBlocked!==t&&(this.voiceBlocked=t,this.emit())}loadOlderExchanges(){this.loadingOlderExchanges||!st(this.conversation,this.lastExchange,this.bubbleWindowSize,this.conversationOptions).hasOlder||(this.loadingOlderExchanges=!0,this.emit(),this.loadOlderTimer=setTimeout(()=>{this.loadOlderTimer=null,this.bubbleWindowSize+=ve,this.loadingOlderExchanges=!1,this.emit()},350))}setConversationRetention(t,n=!1){this.conversationOptions=Me(t,n),this.conversationRetentionMinutes=typeof t=="number"?t:null;let o=n?"internal":"public";o!==this.conversationScope&&(this.conversationScope=o,this.restorePersistedConversation())}resetBubbleWindow(){this.loadOlderTimer&&(clearTimeout(this.loadOlderTimer),this.loadOlderTimer=null),this.loadingOlderExchanges=!1,this.bubbleWindowSize=ve}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}emit(){let t=this.getState();for(let n of this.listeners)n(t)}setEnabled(t){this.enabled=t,t||this.cancelAll()}getTtsVoice(){return typeof this.config.ttsVoice=="function"?this.config.ttsVoice():this.config.ttsVoice}setPhase(t){var o,i;let n=this.phase;n!==t&&(this.phase=t,(i=(o=this.config).onPhaseChange)==null||i.call(o,t,n),this.emit())}clearWatchdog(){this.watchdog&&(clearTimeout(this.watchdog),this.watchdog=null)}clearConfirmWindow(){this.confirmWindow&&(clearTimeout(this.confirmWindow),this.confirmWindow=null),this.confirmationVoiceActive=!1}clearSpeakTimer(){this.speakTimer&&(clearTimeout(this.speakTimer),this.speakTimer=null)}async speakReply(t,n){var o;if(!this.silentTurn&&!(!t&&!n)){this.setPhase("speaking");try{let i=n;if(i&&(this.serverTtsUnavailable=!1),!i&&t&&!this.serverTtsUnavailable)try{i=await this.config.backend.previewTts((o=this.getTtsVoice())!=null?o:"",t),i||(this.serverTtsUnavailable=!0)}catch{i=null,this.serverTtsUnavailable=!0}let r=i?this.config.voice.playAudioBase64Mp3(i):t?this.config.voice.speakWithDeviceTts(t,{locale:this.ttsLocale}):Promise.resolve();await this.raceSpeakingWatchdog(r,t)}catch{}finally{this.clearSpeakTimer(),this.phase==="speaking"&&this.setPhase("idle")}}}raceSpeakingWatchdog(t,n){let o=Math.min(6e4,5e3+n.length*90);return new Promise(i=>{let r=!1,s=()=>{r||(r=!0,this.clearSpeakTimer(),i())};this.clearSpeakTimer(),this.speakTimer=setTimeout(()=>{this.config.voice.stopPlayback(),s()},o),t.then(s,s)})}beginConfirmationVoiceWindow(){let t=this.pending;!t||t.silent||t.voiceMode==="disabled"||this.config.voice.isRecognitionAvailable()&&(this.clearConfirmWindow(),this.setPhase("confirming"),this.confirmationVoiceActive=!0,this.speech.start(),this.confirmWindow=setTimeout(()=>{this.speech.stop(),this.confirmationVoiceActive=!1},this.timings.confirmationVoiceWindowMs))}async confirmPendingAction(){var i,r;this.clearConfirmWindow();let t=this.pending;if(!t){this.confirmationMessage=null,this.confirmationVoiceHint=null,this.emit();return}if(t.remainingConfirmations>1){t.remainingConfirmations-=1,this.confirmationReasked=!1;let s=this.messages.doubleConfirmationQuestion;this.confirmationMessage=s,this.lastExchange&&(this.lastExchange={...this.lastExchange,replyText:s}),this.emit(),await this.speakReply(s,null),this.pending&&this.beginConfirmationVoiceWindow();return}this.pending=null,this.confirmationMessage=null,this.confirmationVoiceHint=null,this.phase==="confirming"&&this.setPhase("idle"),this.emit(),this.setActivity({kind:"executing",label:(i=this.actionLabel(t.intent))!=null?i:t.intent});let n=await this.executor.execute(t.action,t.context);this.telemetry.logEvent({eventType:n.success?"action_executed":"action_failed",intentDetected:t.intent,sessionId:this.sessionId,actionExecuted:{intent:t.intent,confirmed:!0}}),n.message&&(this.lastExchange&&(this.lastExchange={...this.lastExchange,replyText:n.message}),this.emit(),await this.speakReply(n.message,null));let o=this.chainState;o&&(this.chainState=null,n.success&&this.chaining.enabled?(this.telemetry.logEvent({eventType:"agent_chain_step",intentDetected:t.intent,sessionId:this.sessionId,chainStep:o.step}),o.pendingKey&&o.visitedKeys.add(o.pendingKey),await this.runChainLoop({userMessage:o.userMessage,step:o.step,lastStep:(r=o.pendingStep)!=null?r:o.lastStep,visitedKeys:o.visitedKeys})):n.success||this.telemetry.logEvent({eventType:"agent_chain_aborted",sessionId:this.sessionId,chainAbortReason:"error"})),this.pending||this.setActivity(null)}cancelPendingAction(){this.clearConfirmWindow();let t=this.pending;this.pending=null,this.confirmationMessage=null,this.confirmationVoiceHint=null,this.setActivity(null),this.phase==="confirming"&&this.setPhase("idle"),this.emit();let n=this.chainState;this.chainState=null,n&&this.telemetry.logEvent({eventType:"agent_chain_aborted",sessionId:this.sessionId,chainAbortReason:"user_interrupt"}),t&&(this.telemetry.logEvent({eventType:"action_cancelled",intentDetected:t.intent,sessionId:this.sessionId}),this.lastExchange&&(this.lastExchange={...this.lastExchange,replyText:this.messages.cancelled}),this.emit(),this.speakReply(this.messages.cancelled,null))}async handleConfirmationTranscript(t){this.confirmationVoiceActive=!1,this.clearConfirmWindow();let n=this.pending;if(this.phase==="confirming"&&this.setPhase("idle"),!n||n.voiceMode==="disabled"||n.silent)return;let o=vi(t,n,this.lexicon,{silent:n.silent});if(o==="affirmative"){await this.confirmPendingAction();return}if(o==="negative"){this.cancelPendingAction();return}if(!this.confirmationReasked){this.confirmationReasked=!0;let i=`${this.messages.confirmationNotUnderstood} ${n.question}`.trim();this.confirmationMessage=i,this.emit(),await this.speakReply(i,null),this.pending&&this.beginConfirmationVoiceWindow()}}platformCapabilities(){var n;let t=!1;try{t=((n=this.credentialAutofill)==null?void 0:n.isSupported())===!0}catch{t=!1}return t?{credentialAutofill:!0}:void 0}sessionContext(){let{isAuthenticated:t,getSessionCapabilities:n}=this.config;if(!t&&!n)return;let o=null;try{let r=t==null?void 0:t();o=r==null?null:!!r}catch{o=null}let i;try{let r=n==null?void 0:n();if(r&&typeof r=="object"){let s={};for(let[a,l]of Object.entries(r))typeof l=="boolean"&&(s[a]=l);Object.keys(s).length>0&&(i=s)}}catch{i=void 0}return{authenticated:o,...i?{capabilities:i}:{}}}routeLabel(t){var n;return(n=this.config.manifest.routes.find(o=>o.intent===t))==null?void 0:n.label}actionLabel(t){var n;return(n=this.config.manifest.actions.find(o=>o.intent===t))==null?void 0:n.label}async applyOutcome(t,n,o,i){var x,T,v,S,R,E,g,C,A,B,Q;let r=t.reply,s=t.audioBase64;r&&(this.serverTtsUnavailable=!s);let a=await xi({action:t.action,manifest:this.config.manifest,executor:this.executor,context:o,messages:this.messages,userMessage:i}),l=!1,c,u,p=!1,f=!1,m,h;if(a.kind==="executed"){let N=a.result;if(N.success&&((x=t.action)==null?void 0:x.type)==="navigate"?this.setActivity({kind:"navigating",label:(S=(v=this.routeLabel((T=t.action.intent)!=null?T:""))!=null?v:t.action.intent)!=null?S:""}):N.success&&!N.recoverable&&((R=t.action)==null?void 0:R.type)==="execute"&&this.setActivity({kind:"executing",label:(C=(g=this.actionLabel((E=t.action.intent)!=null?E:""))!=null?g:t.action.intent)!=null?C:""}),((A=t.action)==null?void 0:A.type)==="navigate"?this.telemetry.logEvent({eventType:N.success?"navigation_executed":"navigation_failed",intentDetected:t.action.intent,sessionId:this.sessionId,currentRoute:n!=null?n:void 0}):((B=t.action)==null?void 0:B.type)==="execute"&&this.telemetry.logEvent({eventType:N.recoverable?"action_needs_context":N.success?"action_executed":"action_failed",intentDetected:t.action.intent,sessionId:this.sessionId,actionExecuted:{intent:t.action.intent,confirmed:!1}}),N.recoverable||N.message&&(r=N.message,s=null),t.action&&(t.action.type==="navigate"||t.action.type==="execute")&&N.success&&!N.recoverable){let Y=(Q=t.action.intent)!=null?Q:"";c={type:t.action.type,intent:Y,label:t.action.type==="navigate"?this.routeLabel(Y):this.actionLabel(Y),success:!0},u=`${t.action.type}:${Y}`,l=t.taskStatus==="in_progress"}}else if(a.kind==="precheck-resolved")a.result.message&&!a.result.recoverable&&(r=a.result.message,s=null);else if(a.kind==="needs-confirmation"){this.pending={...a.pending,silent:this.silentTurn},this.confirmationReasked=!1,this.confirmationMessage=a.pending.question,this.confirmationVoiceHint=a.pending.voiceMode==="strict"&&a.pending.strictPhrase&&!this.silentTurn?ee(this.messages.strictConfirmationModalHint,{phrase:a.pending.strictPhrase}):null,this.emit(),this.telemetry.logEvent({eventType:"action_confirmation_requested",intentDetected:a.pending.intent,sessionId:this.sessionId}),this.setActivity({kind:"waiting_confirmation"}),p=!0,f=t.taskStatus==="in_progress";let N=a.pending.intent||"";m={type:"execute",intent:N,label:this.actionLabel(N),success:!0},h=`execute:${N}`}return{reply:r,audioBase64:s,hasPending:p,canContinue:l,lastStep:c,actionKey:u,pendingInProgress:f,pendingStep:m,pendingKey:h}}async runChainLoop(t){var r,s,a,l,c,u,p,f,m,h,x;let n=t.step,o=t.lastStep,i=t.visitedKeys;this.setChainActive(!0);try{for(;n<this.chaining.maxSteps;){if(n+=1,this.chaining.dwellMs>0&&await Ma(this.chaining.dwellMs),this.pending!=null)return;let T=this.config.navigation.getCurrentRoute(),v=this.screenStore.getSnapshot(),S=tt((a=(s=(r=this.config).getUserContextText)==null?void 0:s.call(r))!=null?a:null,this.screenStore.getText(),{truncationSuffix:this.messages.contextTruncationSuffix,maxChars:this.config.contextMaxChars}),R=S?this.sanitizer(S).sanitized:void 0,E=it(this.conversation,Date.now(),this.conversationOptions);this.setPhase("thinking"),this.setActivity({kind:"thinking"});let g=new AbortController;this.abort=g;let C;try{let A=await this.config.backend.sendTurn({message:t.userMessage,language:this.config.locale,voice:this.getTtsVoice(),screenContext:R,currentRoute:T!=null?T:void 0,conversationHistory:E.history,conversationSummary:(l=E.summary)!=null?l:void 0,sessionId:this.sessionId,isContinuation:!0,chainStep:n,lastStep:o,platformCapabilities:this.platformCapabilities(),sessionContext:this.sessionContext(),...fo(this.config.manifest,this.config.registries)},{signal:g.signal});C=await this.applyOutcome(A,T,(c=v==null?void 0:v.context)!=null?c:{},t.userMessage)}catch(A){this.abort=null;let B=A instanceof z&&A.code==="cancelled";if(B)this.phase==="thinking"&&this.setPhase("idle");else{A instanceof z&&A.code==="quota_exceeded"&&((p=(u=this.config).onQuotaExceeded)==null||p.call(u));let Q=ho(A,this.config.locale);this.lastExchange={userText:t.userMessage,replyText:Q},this.phase==="thinking"&&this.setPhase("idle"),this.emit(),this.notifyError(Q)}this.telemetry.logEvent({eventType:"agent_chain_aborted",sessionId:this.sessionId,chainStep:n,chainAbortReason:B?"user_interrupt":"error"});return}if(this.abort=null,C.reply&&(this.lastExchange={userText:t.userMessage,replyText:C.reply},this.emit(),rt(this.conversation,t.userMessage,C.reply,Date.now(),this.conversationOptions),this.persistConversation()),await this.speakReply(C.reply,C.audioBase64),this.telemetry.logEvent({eventType:"agent_chain_step",intentDetected:(x=(h=(f=C.lastStep)==null?void 0:f.intent)!=null?h:(m=C.pendingStep)==null?void 0:m.intent)!=null?x:null,sessionId:this.sessionId,chainStep:n}),C.hasPending){this.chainState=C.pendingInProgress?{userMessage:t.userMessage,step:n,lastStep:o,visitedKeys:i,pendingKey:C.pendingKey,pendingStep:C.pendingStep}:null,this.beginConfirmationVoiceWindow();return}if(this.phase!=="speaking"&&this.setPhase("idle"),C.actionKey&&i.has(C.actionKey)){this.telemetry.logEvent({eventType:"agent_chain_aborted",sessionId:this.sessionId,chainStep:n,chainAbortReason:"no_progress"});return}if(C.actionKey&&i.add(C.actionKey),!C.canContinue){this.telemetry.logEvent({eventType:"agent_chain_completed",sessionId:this.sessionId,chainStep:n});return}o=C.lastStep}this.telemetry.logEvent({eventType:"agent_chain_aborted",sessionId:this.sessionId,chainStep:n,chainAbortReason:"max_steps"})}finally{this.setChainActive(!1)}}async handleTranscript(t){var f,m,h,x,T,v,S,R,E;let n=t.trim();if(!this.enabled||n.length<this.timings.minTranscriptChars){this.phase==="thinking"&&this.setPhase("idle");return}this.syncConversationIdentity(),this.setPhase("thinking"),this.setActivity({kind:"thinking"}),this.pendingTurnText=n,this.lastExchange={userText:n,replyText:""},this.emit(),this.clearWatchdog(),this.watchdog=setTimeout(()=>{var g;if(this.phase==="thinking"){this.telemetry.logEvent({eventType:"agent_watchdog_reset",sessionId:this.sessionId});let C=(g=this.pendingTurnText)!=null?g:n,A=this.config.locale.startsWith("es")?"La respuesta tard\xF3 demasiado. Int\xE9ntalo de nuevo.":"The response took too long. Please try again.";this.lastExchange={userText:C,replyText:A},this.pendingTurnText=null,this.setActivity(null),this.setPhase("idle"),this.emit()}},this.timings.thinkingWatchdogMs);let o=this.config.navigation.getCurrentRoute();this.sessionStarted||(this.sessionStarted=!0,this.telemetry.logEvent({eventType:"agent_session_started",sessionId:this.sessionId})),this.telemetry.logEvent({eventType:"agent_invoked",sessionId:this.sessionId,currentRoute:o});let i=this.screenStore.getSnapshot(),r=tt((h=(m=(f=this.config).getUserContextText)==null?void 0:m.call(f))!=null?h:null,this.screenStore.getText(),{truncationSuffix:this.messages.contextTruncationSuffix,maxChars:this.config.contextMaxChars}),s=r?this.sanitizer(r).sanitized:void 0,a=it(this.conversation,Date.now(),this.conversationOptions),l=new AbortController;this.abort=l;let c=null;try{let g=await this.config.backend.sendTurn({message:n,language:this.config.locale,voice:this.getTtsVoice(),screenContext:s,currentRoute:o!=null?o:void 0,conversationHistory:a.history,conversationSummary:(x=a.summary)!=null?x:void 0,sessionId:this.sessionId,platformCapabilities:this.platformCapabilities(),sessionContext:this.sessionContext(),...fo(this.config.manifest,this.config.registries)},{signal:l.signal});c=await this.applyOutcome(g,o,(T=i==null?void 0:i.context)!=null?T:{},n)}catch(g){if(this.clearWatchdog(),this.abort=null,this.setActivity(null),g instanceof z&&g.code==="cancelled"){this.phase==="thinking"&&this.setPhase("idle"),this.pendingTurnText=null;return}g instanceof z&&g.code==="quota_exceeded"&&((S=(v=this.config).onQuotaExceeded)==null||S.call(v));let C=ho(g,this.config.locale);this.lastExchange={userText:n,replyText:C},this.pendingTurnText=null,this.phase==="thinking"&&this.setPhase("idle"),this.emit(),this.notifyError(C);return}if(this.clearWatchdog(),this.abort=null,this.pendingTurnText=null,!c)return;let u=c.reply;if(u)this.lastExchange={userText:n,replyText:u},this.emit(),rt(this.conversation,n,u,Date.now(),this.conversationOptions),this.persistConversation();else{let g=this.config.locale.startsWith("es")?"No recib\xED respuesta del servidor. Int\xE9ntalo de nuevo.":"No reply from the server. Please try again.";this.lastExchange={userText:n,replyText:g},this.emit()}let p=c.hasPending;if(await this.speakReply(u,c.audioBase64),p?(this.beginConfirmationVoiceWindow(),this.chaining.enabled&&c.pendingInProgress&&(this.telemetry.logEvent({eventType:"agent_chain_started",sessionId:this.sessionId,chainStep:1}),this.chainState={userMessage:n,step:1,lastStep:c.pendingStep,visitedKeys:new Set,pendingKey:c.pendingKey,pendingStep:c.pendingStep})):this.phase!=="speaking"&&this.setPhase("idle"),this.chaining.enabled&&c.canContinue&&!p){this.telemetry.logEvent({eventType:"agent_chain_started",sessionId:this.sessionId,chainStep:1});let g=new Set;c.actionKey&&g.add(c.actionKey),await this.runChainLoop({userMessage:n,step:1,lastStep:c.lastStep,visitedKeys:g})}this.pending||this.setActivity(null),(E=(R=this.config).onTurnCompleted)==null||E.call(R)}onTranscript(t){if(this.confirmationVoiceActive||this.pending){this.handleConfirmationTranscript(t);return}this.handleTranscript(t)}onSpeechError(t){this.telemetry.logEvent({eventType:"agent_stt_failed",sessionId:this.sessionId}),(this.phase==="listening"||this.phase==="confirming")&&this.setPhase("idle");let n=t instanceof Error?t.message:String(t),o=n.toLowerCase();if(o.includes("not-allowed")||o.includes("not allowed")||o.includes("service-not-allowed")||o.includes("audio-capture")||o.includes("permission")){this.markVoiceBlocked(!0);return}this.notifyError(n)}async beginListening(){var n,o;if(!this.enabled)return;if(!this.config.voice.isRecognitionAvailable()){this.telemetry.logEvent({eventType:"agent_stt_failed",sessionId:this.sessionId}),this.notifyError(this.ui.voiceUnavailable);return}let t=(o=(n=this.config).gateTurn)==null?void 0:o.call(n);if(t&&!t.ok){t.message&&this.notifyError(t.message);return}this.config.voice.stopPlayback(),this.silentTurn=!1,this.setPhase("listening"),await this.speech.start()}async toggleListening(){if(!this.enabled||this.phase==="confirming")return;if(this.phase==="listening"){this.speech.stop(),this.setPhase("thinking");return}if(this.phase==="speaking"){this.cancelAll();return}if(this.phase==="thinking")return;if(!await this.consent.hasConsented()){this.pendingConsentIntent="voice",this.consentModalVisible=!0,this.emit();return}await this.beginListening()}async submitTextTurn(t,n){var r,s;if(!this.enabled)return;let o=t.trim();if(!o)return;let i=(s=(r=this.config).gateTurn)==null?void 0:s.call(r);if(i&&!i.ok){i.message&&this.notifyError(i.message);return}if(this.pending&&!this.pending.silent){await this.handleConfirmationTranscript(o);return}this.silentTurn=(n==null?void 0:n.speak)!==!0,await this.handleTranscript(o)}async acceptConsent(){await this.consent.grant(),this.consentModalVisible=!1,this.emit(),this.telemetry.logEvent({eventType:"agent_consent_granted",sessionId:this.sessionId});let t=this.pendingConsentIntent;this.pendingConsentIntent=null,t==="voice"&&await this.beginListening()}declineConsent(){this.consentModalVisible=!1,this.pendingConsentIntent=null,this.emit(),this.telemetry.logEvent({eventType:"agent_consent_declined",sessionId:this.sessionId})}cancelAll(){var n;(n=this.abort)==null||n.abort(),this.abort=null,this.clearWatchdog(),this.clearConfirmWindow(),this.clearSpeakTimer(),this.speech.cancel(),this.config.voice.stopPlayback(),this.pending=null,this.chainState=null,this.confirmationMessage=null,this.confirmationVoiceHint=null,this.liveActivity=null,this.chainActive=!1;let t=this.pendingTurnText;return t&&(this.pendingTurnText=null,this.lastExchange=null),this.setPhase("idle"),this.emit(),t}warmUp(){var t,n;(n=(t=this.config.backend).warmUp)==null||n.call(t)}dispose(){var t,n;this.cancelAll(),(t=this.removeIdentityListeners)==null||t.call(this),this.removeIdentityListeners=null,this.loadOlderTimer&&(clearTimeout(this.loadOlderTimer),this.loadOlderTimer=null),(n=this.unsubscribeSpeech)==null||n.call(this),this.unsubscribeSpeech=null,this.speech.dispose(),this.listeners.clear()}};var La="http://www.w3.org/2000/svg",ae={accentColor:"#4f8cff",backgroundColor:"#1b2a4a",colorKey:"azul",glowIntensity:100,size:56};function ne(e,t){let n=document.createElementNS(La,e);for(let[o,i]of Object.entries(t))n.setAttribute(o,String(i));return n}function Ri(e){let{fillPx:t,interiorPx:n,exteriorPx:o,totalPx:i,fillRadius:r,midPx:s}=pt(e.fillDiameter,e.exteriorWidthSlider,e.interiorWidthSlider),a=typeof e.borderRadius=="number",l=a?`${r}px`:String(e.borderRadius),c=a?`${s/2}px`:String(e.borderRadius),u=a?`${i/2}px`:String(e.borderRadius),p=e.outerGlow!==!1,f=e.fillDepth!==!1,m=document.createElement("div");Object.assign(m.style,{boxSizing:"content-box",border:o>0?`${o}px solid ${e.exteriorColor}`:"",borderRadius:u,background:"transparent",display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:"0",boxShadow:p&&o>0?an(i,e.exteriorColor):""});let h=document.createElement("div");Object.assign(h.style,{boxSizing:"content-box",border:n>0?`${n}px solid ${e.interiorColor}`:"",borderRadius:c,background:"transparent",display:"inline-flex",alignItems:"center",justifyContent:"center",flexShrink:"0"});let x=document.createElement("div");return Object.assign(x.style,{width:`${t}px`,height:`${t}px`,borderRadius:l,background:e.fill,overflow:"hidden",position:"relative",flexShrink:"0",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:f&&t>0?cn(e.fillDiameter):""}),h.appendChild(x),m.appendChild(h),{root:m,fill:x}}function Ba(e,t){let{bars:n,color:o,radius:i}=un(e,t),r=ne("svg",{width:e,height:e,viewBox:`0 0 ${e} ${e}`,"aria-hidden":"true"});r.style.display="block";let s=n.map(l=>{let c=ne("rect",{x:l.x,y:l.y,width:l.width,height:l.height,rx:i,ry:i,fill:o});return r.appendChild(c),c}),a=0;return{el:r,start(){let l=performance.now(),c=u=>{a=requestAnimationFrame(c);let p=(u-l)/1e3;n.forEach((f,m)=>{let h=dn(p,m,f.baseHalfHeight,f.maxHalfHeight);s[m].setAttribute("y",(f.centerY-h).toFixed(2)),s[m].setAttribute("height",(2*h).toFixed(2))})};a=requestAnimationFrame(c)},stop(){cancelAnimationFrame(a)}}}var Na=9,$a=[.25,.45,.65,.85,1,.85,.65,.45,.25],Ei=[0,.7,1.4,2.1,2.8,2.1,1.4,.7,0],Da=26;function Fa(e,t){let n=t/Da,o=3*n,i=3*n,r=3*n,s=document.createElement("div");Object.assign(s.style,{display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:`${i}px`,height:`${t}px`,width:"100%",maxWidth:"88%"});let a=[];for(let h=0;h<Na;h++){let x=document.createElement("div");Object.assign(x.style,{width:`${o}px`,height:`${t}px`,borderRadius:`${Math.max(1,2*n)}px`,backgroundColor:e,transformOrigin:"center center",transform:`scaleY(${r/t})`,flexShrink:"0"}),a.push(x),s.appendChild(x)}let l=0,c=0,u=0,p=0,f=r/t,m=h=>{l=requestAnimationFrame(m),!(h-u<80)&&(u=h,c+=.22,a.forEach((x,T)=>{var S,R,E;let v;if(p<.05){let g=(Math.sin(c+((S=Ei[T])!=null?S:0))+1)/2;v=f+g*(.22-f)}else{let g=Math.sin(c*2.3+((R=Ei[T])!=null?R:0))*.18+.82+Math.random()*.18;v=f+p*((E=$a[T])!=null?E:.5)*(1-f)*g}x.style.transform=`scaleY(${Math.min(1,Math.max(f,v))})`}))};return{el:s,start(){l||(u=typeof performance!="undefined"?performance.now():Date.now(),l=requestAnimationFrame(m))},stop(){l&&cancelAnimationFrame(l),l=0},setVolume(h){p=h}}}var Ii=8,Oi=68,Wa=360-Oi,Ua=Oi/2,Ha=[.15,.25,.35,.5,.65,.78,.88,1];function za(e,t){var a;let n=Math.max(28,e*.52),o=document.createElement("div");Object.assign(o.style,{position:"absolute",inset:"0",display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"none"});let i=document.createElement("div");Object.assign(i.style,{width:`${n}px`,height:`${n}px`,animation:"fy-spin 0.92s linear infinite"}),i.setAttribute("role","progressbar"),i.setAttribute("aria-label","Loading");let r=ne("svg",{width:n,height:n,viewBox:"0 0 40 40","aria-hidden":"true"}),s=Wa/(Ii-1);for(let l=0;l<Ii;l++){let c=Ua+s*l;r.appendChild(ne("rect",{x:"18.25",y:"5.5",width:"3.5",height:"11",rx:"1.75",fill:t,opacity:(a=Ha[l])!=null?a:1,transform:`rotate(${c} 20 20)`}))}return i.appendChild(r),o.appendChild(i),o}var Va=118/380,Ga=30/380,Ka=2/380;function Ya(e,t){let n=document.createElement("div");Object.assign(n.style,{position:"absolute",inset:"0",display:"flex",alignItems:"center",justifyContent:"center",pointerEvents:"none"});let o=e*Va,i=Math.max(1,e*Ka);for(let a of[0,.85]){let l=document.createElement("div");Object.assign(l.style,{position:"absolute",width:`${o}px`,height:`${o}px`,borderRadius:"50%",border:`${i}px solid ${t}`,opacity:"0.55",animation:`fy-voice 1.7s ease-out infinite ${a}s`}),n.appendChild(l)}let r=e*Ga,s=document.createElement("div");return Object.assign(s.style,{width:`${r}px`,height:`${r}px`,borderRadius:"50%",background:t,opacity:"0.9",animation:"fy-opulse 1s ease-in-out infinite"}),n.appendChild(s),n}function ja(e,t,n){let o=vn(e),i=1.8,{x:r,y:s}=Cn(o),a=ne("svg",{width:t,height:t,viewBox:o.viewBox,fill:"none","aria-hidden":"true"});a.style.display="block",a.style.pointerEvents="none";let l=ne("g",{transform:`translate(${r} ${s})`});if(o.keyboardFrame&&o.keyDots){let c=o.keyboardFrame;l.appendChild(ne("rect",{x:c.x,y:c.y,width:c.w,height:c.h,rx:c.rx,stroke:n,"stroke-width":i}));for(let[u,p]of o.keyDots)l.appendChild(ne("rect",{x:u-.6,y:p-.6,width:1.2,height:1.2,rx:.2,fill:n}))}else if(o.chatFrame&&o.chatLines){let c=o.chatFrame,u=c.x+c.w/2,p=c.y+c.h,f=Math.max(1.15,i*.65);if(l.appendChild(ne("rect",{x:c.x,y:c.y,width:c.w,height:c.h,rx:c.rx,stroke:n,"stroke-width":i})),o.chatTail){let m=o.chatTail;l.appendChild(ne("polygon",{points:`${m.left},${p} ${m.tipX},${m.tipY} ${m.right},${p}`,fill:n}))}for(let{y:m,w:h}of o.chatLines)l.appendChild(ne("line",{x1:u-h/2,y1:m,x2:u+h/2,y2:m,stroke:n,"stroke-width":f,"stroke-linecap":"round"}))}else for(let c of o.paths)l.appendChild(ne("path",{d:c.d,stroke:n,fill:"none","stroke-width":i,"stroke-linecap":"round","stroke-linejoin":"round"}));return a.appendChild(l),a}function ki(e){var x,T,v,S,R,E,g;let{theme:t}=e,n=(x=t.size)!=null?x:30,o=(T=t.shape)!=null?T:"circle",i=o==="circle"?"50%":`${yn(o,n)}px`,r=(v=t.backgroundColor)!=null?v:e.backgroundColor,s=(S=t.borderColor)!=null?S:e.accentColor,a=xn(t.iconColor,r,e.accentColor),l=Ue(t.icon),c=bn((R=t.iconScale)!=null?R:1),u=Math.round(gn(n)*c),p=pt(n,(E=t.borderWidth)!=null?E:100,t.innerBorderWidth),f=document.createElement("button");f.type="button",f.setAttribute("aria-label",e.label),Object.assign(f.style,{border:"none",background:"transparent",padding:"0",cursor:"pointer",lineHeight:"0",flexShrink:"0",width:`${p.totalPx}px`,height:`${p.totalPx}px`,display:"flex",alignItems:"center",justifyContent:"center"}),f.onclick=e.onClick;let{root:m,fill:h}=Ri({fillDiameter:n,borderRadius:i,exteriorColor:s,exteriorWidthSlider:(g=t.borderWidth)!=null?g:100,interiorColor:dt(t.innerBorderColor),interiorWidthSlider:t.innerBorderWidth,fill:r,outerGlow:!1,fillDepth:!1});if(t.iconImageDataUrl){let C=document.createElement("img");C.src=t.iconImageDataUrl,C.alt="",Object.assign(C.style,{width:`${u}px`,height:`${u}px`,objectFit:"contain",display:"block"}),h.appendChild(C)}else h.appendChild(ja(l,u,a));return f.appendChild(m),f}function _i(e){let t=document.createElement("div");t.style.display="inline-flex";let n=e,o="idle",i=0,r=null,s=null,a=null;function l(){var T,v,S,R;let u=(T=n.size)!=null?T:ae.size,p=vt({colorKey:(v=n.colorKey)!=null?v:ae.colorKey,backgroundColor:n.backgroundColor,accentColor:n.accentColor}),f=(S=n.glowColor)!=null&&S.startsWith("#")?n.glowColor:n.accentColor,m=dt(n.innerBorderColor);s==null||s.stop(),s=null,a==null||a.stop(),a=null,t.replaceChildren();let{root:h,fill:x}=Ri({fillDiameter:u,borderRadius:u,exteriorColor:f,exteriorWidthSlider:(R=n.glowIntensity)!=null?R:ae.glowIntensity,interiorColor:m,interiorWidthSlider:n.innerBorderWidth,fill:p});r=x,t.appendChild(h),c()}function c(){var f,m;if(!r)return;let u=(f=n.size)!=null?f:ae.size,p=(m=n.waveformColor)!=null?m:"#ffffff";if(s==null||s.stop(),s=null,a==null||a.stop(),a=null,r.replaceChildren(),t.style.animation="",o==="thinking"){r.appendChild(za(u,p));return}if(o==="listening"){s=Fa(p,Math.round(u*.46)),s.setVolume(i),r.appendChild(s.el),s.start();return}if(n.logoDataUrl){let h=document.createElement("img");h.src=n.logoDataUrl,h.alt="",h.draggable=!1,h.addEventListener("dragstart",x=>x.preventDefault()),Object.assign(h.style,{width:"64%",height:"64%",objectFit:"contain",pointerEvents:"none",userSelect:"none",webkitUserSelect:"none",webkitUserDrag:"none",animation:o==="speaking"?"fy-opulse 1s ease-in-out infinite":""}),r.appendChild(h);return}if(o==="speaking"){r.appendChild(Ya(u,p));return}o==="idle"&&(a=Ba(u,n.waveformColor),r.appendChild(a.el),a.start())}return l(),{element:t,applyAppearance(u){n=u,l()},applyState(u,p){i=p,u!==o?(o=u,c()):o==="listening"&&(s==null||s.setVolume(i))}}}var mo="fyodos:published-config:v1";function Xa(){try{if(typeof window=="undefined"||!window.localStorage)return null;let e=window.localStorage.getItem(mo);return e?JSON.parse(e):null}catch{return null}}function Pi(e){try{if(typeof window=="undefined"||!window.localStorage)return;e?window.localStorage.setItem(mo,JSON.stringify(e)):window.localStorage.removeItem(mo)}catch{}}function Mi(e,t){var r,s,a,l;let n=t.orbEnabled!==!1,o=e.theme;return{appearance:{accentColor:(r=o.accentColor)!=null?r:ae.accentColor,backgroundColor:(s=o.backgroundColor)!=null?s:ae.backgroundColor,glowColor:o.glowColor,colorKey:o.colorKey,glowIntensity:o.glowIntensity,hapticIntensity:o.hapticIntensity,innerBorderColor:o.innerBorderColor,innerBorderWidth:o.innerBorderWidth,size:(a=o.size)!=null?a:ae.size,waveformColor:o.waveformColor,logoDataUrl:e.logoDataUrl},keyboardChip:(l=o.keyboardChip)!=null?l:null,modalTheme:e.modalTheme,screenPosition:e.screenPosition,bubbleTheme:We(t.bubbleTheme),bubbleEnabled:t.bubbleEnabled!==!1,voiceInputEnabled:t.voiceInputEnabled!==!1,thinkingStepsEnabled:t.agentThinkingStepsEnabled===!0,enabled:n,conversationRetentionMinutes:typeof t.conversationRetentionMinutes=="number"?t.conversationRetentionMinutes:null,internalProfile:t.orbProfile==="internal"}}function Li(e,t){var l;let n=e.config.backend.fetchPublishedConfig;if(!n)return t.onChange(null),()=>{};let o=!1,i=Xa();i&&t.onChange(Mi(Ct(i),i));let r=async()=>{try{let c=await n.call(e.config.backend);if(o)return;c.published?(t.onChange(Mi(Ct(c.published),c.published)),Pi(c.published)):(t.onChange(null),Pi(null))}catch{}};r();let s=(l=t.pollMs)!=null?l:12e3,a=s>0?setInterval(()=>{r()},s):null;return()=>{o=!0,a&&clearInterval(a)}}function qa(){var t,n;if(typeof window=="undefined")return null;let e=window;return(n=(t=e.SpeechRecognition)!=null?t:e.webkitSpeechRecognition)!=null?n:null}function Qa(e){return e.toLowerCase().startsWith("es")?"es-ES":"en-US"}function At(e){let t=e.value.length;try{e.setSelectionRange(t,t)}catch{}e.scrollLeft=e.scrollWidth}function Bi(e){let t=qa(),n=null,o=!1,i="",r=()=>{n==null||n.stop()};return{isSupported:()=>t!=null,isListening:()=>o,stop:r,dispose:()=>{r(),n=null,o=!1},toggle(a,l){if(!t)return;if(o){r();return}i=a();let c=new t;c.lang=Qa(e),c.interimResults=!0,c.continuous=!0;let u="";c.onresult=p=>{var x,T;let f="";for(let v=p.resultIndex;v<p.results.length;v+=1){let S=p.results[v];if(!S)continue;let R=(T=(x=S[0])==null?void 0:x.transcript)!=null?T:"";S.isFinal?u+=R:f+=R}let m=`${u}${f}`.trimStart(),h=i?`${i}${i.endsWith(" ")?"":" "}${m}`:m;l(h)},c.onend=()=>{o=!1,n=null},c.onerror=()=>{o=!1,n=null},n=c,o=!0,c.start()}}}var Ni="fyodos-orb-styles",Ja=`
|
|
4
|
+
.fyodos-orb-root{position:fixed;display:inline-flex;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;touch-action:none;}
|
|
5
|
+
.fyodos-orb-btn{appearance:none;border:none;background:transparent;padding:0;cursor:pointer;line-height:0;display:inline-flex;touch-action:none;user-select:none;-webkit-user-select:none;-webkit-user-drag:none;}
|
|
6
|
+
.fyodos-orb-btn img{pointer-events:none;-webkit-user-drag:none;user-select:none;}
|
|
7
|
+
.fyodos-orb-btn:focus-visible{outline:2px solid #8ab6ff;outline-offset:4px;border-radius:50%;}
|
|
8
|
+
.fyodos-orb-anchor{position:relative;display:inline-flex;}
|
|
9
|
+
.fyodos-bubble{position:absolute;display:flex;flex-direction:column;width:min(320px,calc(100vw - 48px));max-height:340px;overflow:hidden;border-radius:16px;box-shadow:0 16px 40px rgba(0,0,0,0.28);border:1px solid rgba(160,180,220,0.22);animation:fyodos-fade-in .14s ease-out;transition:width .25s cubic-bezier(0.22,1,0.36,1),max-height .25s cubic-bezier(0.22,1,0.36,1);cursor:zoom-in;}
|
|
10
|
+
.fyodos-bubble--expanded{width:min(560px,calc(100vw - 32px));max-height:min(620px,75vh);cursor:auto;}
|
|
11
|
+
.fyodos-bubble-user,.fyodos-bubble-reply{cursor:text;}
|
|
12
|
+
.fyodos-bubble-row{cursor:default;}
|
|
13
|
+
.fyodos-bubble--expanded .fyodos-bubble-scroll{padding:22px 24px 8px;gap:10px;}
|
|
14
|
+
.fyodos-bubble--expanded .fyodos-bubble-exchanges{gap:14px;}
|
|
15
|
+
.fyodos-bubble--expanded .fyodos-bubble-exchange{gap:9px;}
|
|
16
|
+
.fyodos-bubble--expanded .fyodos-bubble-exchange:first-child .fyodos-bubble-user{padding-right:0;}
|
|
17
|
+
.fyodos-bubble--expanded .fyodos-bubble-user{font-size:14.5px;line-height:21px;}
|
|
18
|
+
.fyodos-bubble--expanded .fyodos-bubble-reply{font-size:17px;line-height:25px;}
|
|
19
|
+
.fyodos-bubble--expanded .fyodos-bubble-row{padding:12px 16px;gap:10px;}
|
|
20
|
+
.fyodos-bubble--expanded .fyodos-bubble-busy{padding:8px 24px;}
|
|
21
|
+
.fyodos-bubble--expanded .fyodos-bubble-row input{padding:12px 14px;font-size:16px;}
|
|
22
|
+
.fyodos-bubble--expanded .fyodos-bubble-mic,.fyodos-bubble--expanded .fyodos-bubble-row button{width:38px;height:38px;min-width:38px;font-size:19px;}
|
|
23
|
+
.fyodos-bubble-close,.fyodos-bubble-unexpand{position:absolute;top:4px;z-index:1;display:flex;align-items:center;justify-content:center;border:none;background:transparent;font-size:18px;line-height:18px;width:28px;height:28px;cursor:pointer;padding:0;opacity:.75;}
|
|
24
|
+
.fyodos-bubble-close{right:6px;}
|
|
25
|
+
.fyodos-bubble-unexpand{right:38px;display:none;}
|
|
26
|
+
.fyodos-bubble-user-row{display:flex;flex-direction:row;align-items:flex-start;gap:6px;}
|
|
27
|
+
.fyodos-bubble-scroll{overflow-y:auto;padding:12px 14px 4px;display:flex;flex-direction:column;gap:6px;min-height:18px;scrollbar-width:none;-ms-overflow-style:none;}
|
|
28
|
+
.fyodos-bubble-scroll::-webkit-scrollbar{display:none;width:0;height:0;}
|
|
29
|
+
.fyodos-bubble-loader{display:flex;justify-content:center;align-items:center;padding:2px 0 6px;flex-shrink:0;}
|
|
30
|
+
.fyodos-bubble-loader span{width:14px;height:14px;border-radius:50%;border:2px solid rgba(148,163,184,0.35);border-top-color:rgba(148,163,184,0.9);animation:fy-spin .7s linear infinite;}
|
|
31
|
+
.fyodos-bubble-exchanges{display:flex;flex-direction:column;gap:12px;}
|
|
32
|
+
.fyodos-bubble-exchange{display:flex;flex-direction:column;gap:6px;}
|
|
33
|
+
.fyodos-bubble-exchange:first-child .fyodos-bubble-user{padding-right:22px;}
|
|
34
|
+
.fyodos-bubble-user{flex:1;min-width:0;font-size:13px;line-height:18px;opacity:.75;}
|
|
35
|
+
.fyodos-bubble-reply{font-size:15px;line-height:21px;white-space:pre-wrap;}
|
|
36
|
+
.fyodos-bubble-busy{display:flex;gap:5px;padding:8px 14px;align-items:center;}
|
|
37
|
+
.fyodos-bubble-busy span{width:6px;height:6px;border-radius:50%;opacity:.5;animation:fyodos-blink 1s infinite;}
|
|
38
|
+
.fyodos-bubble-busy span:nth-child(2){animation-delay:.18s;}
|
|
39
|
+
.fyodos-bubble-busy span:nth-child(3){animation-delay:.36s;}
|
|
40
|
+
.fyodos-busy-step{margin-right:6px;font-size:12.5px;line-height:18px;font-style:italic;animation:fyodos-fade-in .28s ease-out;}
|
|
41
|
+
.fyodos-bubble-row{display:flex;gap:8px;align-items:flex-end;padding:8px 10px;border-top:1px solid rgba(160,180,220,0.18);}
|
|
42
|
+
.fyodos-bubble-row input{flex:1;min-width:0;border:none;outline:none;border-radius:10px;padding:9px 11px;font-size:15px;}
|
|
43
|
+
.fyodos-bubble-row input::placeholder{color:var(--fyodos-input-placeholder,#94a3b8);opacity:1;}
|
|
44
|
+
.fyodos-bubble-mic{appearance:none;flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;min-width:32px;padding:0;border:1px solid rgba(148,163,184,0.4);border-radius:999px;background:rgba(255,255,255,0.06);color:inherit;cursor:pointer;}
|
|
45
|
+
.fyodos-bubble-row button{appearance:none;border:none;flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;min-width:32px;padding:0;font-size:17px;font-weight:700;line-height:1;color:#000;cursor:pointer;}
|
|
46
|
+
.fyodos-thought{position:absolute;appearance:none;box-sizing:border-box;display:flex;align-items:center;width:max-content;max-width:min(280px,70vw);white-space:nowrap;overflow:hidden;text-align:left;line-height:1.25;font-weight:500;cursor:pointer;box-shadow:0 8px 24px rgba(0,0,0,0.22);animation:fyodos-thought-in .18s ease-out;}
|
|
47
|
+
@keyframes fyodos-thought-in{from{opacity:0;transform:translateY(4px) scale(0.96)}to{opacity:1;transform:none}}
|
|
48
|
+
@keyframes fyodos-marquee{from{transform:translateX(0)}to{transform:translateX(-50%)}}
|
|
49
|
+
.fyodos-thought-track{display:flex;flex-shrink:0;width:max-content;will-change:transform;}
|
|
50
|
+
.fyodos-thought-track>span{flex-shrink:0;padding-right:48px;white-space:nowrap;}
|
|
51
|
+
@keyframes fyodos-fade-in{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
|
|
52
|
+
@keyframes fyodos-blink{0%,100%{opacity:.25}50%{opacity:.9}}
|
|
53
|
+
@keyframes fy-spin{to{transform:rotate(360deg)}}
|
|
54
|
+
@keyframes fy-opulse{0%,100%{transform:scale(1);opacity:1}50%{transform:scale(1.06);opacity:.85}}
|
|
55
|
+
@keyframes fy-voice{0%{transform:scale(0.6);opacity:.7}100%{transform:scale(1.35);opacity:0}}
|
|
56
|
+
.fyodos-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;padding:24px;background:rgba(4,6,12,0.6);}
|
|
57
|
+
.fyodos-modal{width:min(420px,100%);border-radius:16px;padding:22px 24px;box-shadow:0 24px 60px rgba(0,0,0,0.5);}
|
|
58
|
+
.fyodos-modal h3{margin:0 0 10px;font-size:17px;font-weight:600;}
|
|
59
|
+
.fyodos-modal p{margin:0 0 14px;font-size:14px;line-height:1.5;}
|
|
60
|
+
.fyodos-modal .fyodos-hint{font-size:12.5px;font-style:italic;opacity:.75;margin-bottom:16px;}
|
|
61
|
+
.fyodos-modal-actions{display:flex;gap:10px;justify-content:flex-end;}
|
|
62
|
+
.fyodos-btn-ghost{appearance:none;border:1px solid rgba(160,180,220,0.25);background:transparent;border-radius:999px;padding:10px 16px;font-size:13px;cursor:pointer;}
|
|
63
|
+
.fyodos-btn-primary{appearance:none;border:none;border-radius:999px;padding:10px 18px;font-size:13px;font-weight:600;color:#fff;cursor:pointer;}
|
|
64
|
+
`;function Za(){if(typeof document=="undefined"||document.getElementById(Ni))return;let e=document.createElement("style");e.id=Ni,e.textContent=Ja,document.head.appendChild(e)}function $i(){let e=typeof document!="undefined"?document.documentElement:null;return{width:(e==null?void 0:e.clientWidth)||window.innerWidth,height:(e==null?void 0:e.clientHeight)||window.innerHeight}}function ec(e){switch(e){case"bottom-left":return{x:0,y:1};case"top-right":return{x:1,y:0};case"top-left":return{x:0,y:0};default:return{x:1,y:1}}}var ze={cardBackgroundColor:"#0b0f1a",cardBorderColor:"rgba(160,180,220,0.2)",titleColor:"#e7ecf7",bodyColor:"#b9c4dd"};function St(e,t={}){var Mo,Lo,Bo;if(typeof document=="undefined")return{unmount(){}};Za();let n=(Mo=t.container)!=null?Mo:document.body,o=(Lo=t.zIndex)!=null?Lo:2147483e3,i=t.enableTextInput!==!1,r=t.usePublishedPosition!==!1,s=e.ui;if(e.config.voice.isRecognitionAvailable()){let d=navigator.permissions;(Bo=d==null?void 0:d.query)==null||Bo.call(d,{name:"microphone"}).then(y=>{e.markVoiceBlocked(y.state==="denied"),y.onchange=()=>e.markVoiceBlocked(y.state==="denied")}).catch(()=>{})}let a=jn(()=>v().hapticIntensity),l=null,c=null,u,p=We(null),f=!0,m=!0,h=!1,x=null,T=t.corner?ec(t.corner):{...Ce};function v(){let d={...ae,...l!=null?l:{}};return t.accent&&(d.accentColor=t.accent,d.colorKey="custom",d.backgroundColor=t.accent,d.glowColor=t.accent),t.size&&(d.size=t.size),d}let S=document.createElement("div");S.className="fyodos-orb-root",S.style.zIndex=String(o);let R=document.createElement("div");R.className="fyodos-orb-anchor";let E=_i(v()),g=document.createElement("button");g.className="fyodos-orb-btn",g.type="button",g.setAttribute("aria-label",s.orbLabel),g.appendChild(E.element),R.appendChild(g),S.appendChild(R);let C=null,A=document.createElement("div");A.className="fyodos-thought",A.setAttribute("role","button"),A.tabIndex=0,A.style.display="none",A.addEventListener("click",()=>{if(a.trigger("orbTap"),e.primeAudio(),i){let d=To();je(d?Yt(d,{locale:It(),messages:e.messages}):void 0);return}wt=!0,e.toggleListening()}),A.addEventListener("keydown",d=>{(d.key==="Enter"||d.key===" ")&&(d.preventDefault(),A.click())}),R.appendChild(A),n.appendChild(S);let B=null;function Q(){var d;return(d=v().size)!=null?d:ae.size}function N(){return B!=null?B:T}function Y(){let d=Q(),y=$i(),{left:w,top:k}=An({viewportWidth:window.innerWidth,viewportHeight:window.innerHeight,contentWidth:y.width,contentHeight:y.height,orbDiameter:d,position:N()});S.style.left=`${w}px`,S.style.top=`${k}px`,S.style.right="",S.style.bottom="",ue()}function ue(){let d=yt(N());C&&(C.style.position="absolute",C.style.top="50%",C.style.transform="translateY(-50%)",d.horizontal==="left"?(C.style.right="calc(100% + 10px)",C.style.left=""):(C.style.left="calc(100% + 10px)",C.style.right="")),A.style.display!=="none"&&Io()}window.addEventListener("resize",Y);let O;typeof ResizeObserver!="undefined"&&document.documentElement&&(O=new ResizeObserver(()=>Y()),O.observe(document.documentElement));let b=window.visualViewport,I=()=>{Z&&_n()};b==null||b.addEventListener("resize",I),b==null||b.addEventListener("scroll",I);let $=6,L=!1,j=!1,F=0,P=0,J=0,X=0;function me(d){if(d.button!=null&&d.button!==0)return;let y=S.getBoundingClientRect();J=y.left,X=y.top,F=d.clientX,P=d.clientY,L=!1;try{g.setPointerCapture(d.pointerId)}catch{}}function de(d){var se;if(!((se=g.hasPointerCapture)!=null&&se.call(g,d.pointerId)))return;let y=d.clientX-F,w=d.clientY-P;if(!L&&Math.hypot(y,w)<$)return;L=!0,d.preventDefault();let k=Q(),M=$i(),_=8,U=M.width-_-k,G=M.height-_-k,H=Math.min(U,Math.max(_,J+y)),K=Math.min(G,Math.max(_,X+w));S.style.left=`${H}px`,S.style.top=`${K}px`,S.style.right="",S.style.bottom="",B=wn({centerX:H+k/2,centerY:K+k/2,viewportWidth:M.width,viewportHeight:M.height,orbDiameter:k}),ue()}function ge(d){try{g.releasePointerCapture(d.pointerId)}catch{}L&&(j=!0,L=!1,B=Sn(B!=null?B:N()),S.style.transition="left 220ms cubic-bezier(0.22, 1, 0.36, 1), top 220ms cubic-bezier(0.22, 1, 0.36, 1)",Y(),window.setTimeout(()=>{S.style.transition=""},260))}g.draggable=!1,g.addEventListener("dragstart",d=>d.preventDefault()),g.addEventListener("pointerdown",me),g.addEventListener("pointermove",de),g.addEventListener("pointerup",ge),g.addEventListener("pointercancel",ge),g.addEventListener("lostpointercapture",ge);let Z=!1,Ae=!1,be=!1,wt=!1,V=document.createElement("div");V.className="fyodos-bubble",V.style.display="none";function Xi(){let d=window.visualViewport;return d?Math.max(0,window.innerHeight-d.height-d.offsetTop):0}function _n(){V.style.position="fixed",V.style.left="50%",V.style.right="",V.style.top="",V.style.transform="translateX(-50%)",V.style.bottom=`${Xi()+16}px`,V.style.zIndex=String(o+5)}let oe=document.createElement("div");oe.className="fyodos-bubble-scroll";let ye=document.createElement("button");ye.type="button",ye.className="fyodos-bubble-close",ye.textContent="\xD7",ye.setAttribute("aria-label","Close"),ye.addEventListener("click",()=>Et(!1));let pe=document.createElement("button");pe.type="button",pe.className="fyodos-bubble-unexpand",pe.innerHTML='<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 14h6v6M20 10h-6V4M14 10l7-7M3 21l7-7"></path></svg>',pe.setAttribute("aria-label","Collapse"),pe.addEventListener("click",d=>{d.stopPropagation(),Tt(!1)});let Ve=document.createElement("div");Ve.className="fyodos-bubble-loader",Ve.append(document.createElement("span")),Ve.style.display="none";let Se=document.createElement("div");Se.className="fyodos-bubble-exchanges",oe.append(Ve,Se);let Ge="";function qi(d){let y=d.map(_=>`${_.userText}\0${_.replyText}`).join("");if(y===Ge)return;let w=Ge.length>0&&y.length>Ge.length&&y.endsWith(Ge),k=oe.scrollHeight-oe.scrollTop;Ge=y;let M={...ze,...u!=null?u:{}};Se.replaceChildren();for(let _ of d){let U=document.createElement("div");U.className="fyodos-bubble-exchange";let G=document.createElement("div");if(G.className="fyodos-bubble-user",G.textContent=_.userText,G.style.color=M.bodyColor,U.append(G),_.replyText){let H=document.createElement("div");H.className="fyodos-bubble-reply",H.textContent=_.replyText,H.style.color=M.titleColor,U.append(H)}Se.append(U)}oe.scrollTop=w?oe.scrollHeight-k:oe.scrollHeight}oe.addEventListener("scroll",()=>{if(!Z||oe.scrollTop>12)return;let d=e.getState();d.hasOlderExchanges&&!d.loadingOlderExchanges&&e.loadOlderExchanges()});let we=document.createElement("div");we.className="fyodos-bubble-busy";let ie=document.createElement("em");ie.className="fyodos-busy-step",ie.style.display="none",we.appendChild(ie),we.append(document.createElement("span"),document.createElement("span"),document.createElement("span"));let vo=null;function Qi(d){if(!h||!d.liveActivity)return null;let{kind:y,label:w}=d.liveActivity;switch(y){case"navigating":return s.activityNavigating.replace("{label}",w!=null?w:"");case"executing":return s.activityExecuting.replace("{label}",w!=null?w:"");case"waiting_confirmation":return s.activityWaitingConfirmation;default:return s.activityThinking}}function Ji(d,y){let w=d?Qi(y):null;if(w!==vo){if(vo=w,!w){ie.textContent="",ie.style.display="none";return}ie.style.display="",ie.textContent=w,ie.style.animation="none",ie.offsetWidth,ie.style.animation=""}}let Pn=document.createElement("div");Pn.className="fyodos-bubble-row";let W=document.createElement("input");W.type="text",W.placeholder=s.textPlaceholder;let D=document.createElement("button");D.type="button",D.className="fyodos-bubble-mic",D.innerHTML='<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><rect x="9" y="3" width="6" height="11" rx="3"></rect><path d="M5 11a7 7 0 0014 0 M12 18v3"></path></svg>',D.style.display="none";let re=document.createElement("button");re.textContent="\u2191",re.setAttribute("aria-label",s.sendLabel),Pn.append(W,D,re);let Te=Bi(e.config.locale);Te.isSupported()&&(D.style.display="flex",D.setAttribute("aria-label",s.micLabel),D.title=s.micLabel,D.addEventListener("click",()=>{e.getState().isBusy||(Te.toggle(()=>W.value,d=>{W.value=d,At(W)}),Ke())}));function Ke(){var M,_;let d=(M=u==null?void 0:u.primaryButtonColor)!=null?M:v().accentColor,y=`${(_=u==null?void 0:u.sendButtonRadius)!=null?_:10}px`,w={...ze,...u!=null?u:{}}.bodyColor,k=Te.isListening();D.classList.toggle("is-listening",k),k?(D.style.background=d,D.style.border="none",D.style.color=Fe(d),D.style.borderRadius=y):(D.style.background="rgba(255,255,255,0.06)",D.style.border="1px solid rgba(148,163,184,0.4)",D.style.color=w,D.style.borderRadius="999px"),D.setAttribute("aria-label",k?s.micStopLabel:s.micLabel),D.title=k?s.micStopLabel:s.micLabel}V.append(ye,pe,oe,we,Pn),R.appendChild(V);function Tt(d){Ae!==d&&(Ae=d,V.classList.toggle("fyodos-bubble--expanded",d),pe.style.display=d?"flex":"none",_n())}let Co=0,Ao=0,Ye=null,Zi=8,So=()=>{var y;let d=typeof window!="undefined"?(y=window.getSelection)==null?void 0:y.call(window):null;return!!d&&!d.isCollapsed&&d.toString().length>0},Mn=()=>{Ye!=null&&(window.clearTimeout(Ye),Ye=null)};V.addEventListener("pointerdown",d=>{Co=d.clientX,Ao=d.clientY}),V.addEventListener("click",d=>{if(Ae)return;let y=d.target;if(y!=null&&y.closest(".fyodos-bubble-row, .fyodos-bubble-close, .fyodos-bubble-unexpand, button, input, a")||Math.hypot(d.clientX-Co,d.clientY-Ao)>Zi)return;if(d.detail>1){Mn();return}if(Mn(),!!!(y!=null&&y.closest(".fyodos-bubble-user, .fyodos-bubble-reply"))&&!So()){Tt(!0);return}Ye=window.setTimeout(()=>{Ye=null,So()||Tt(!0)},280)}),Y();function wo(){var k,M,_;let d={...ze,...u!=null?u:{}},y=(k=u==null?void 0:u.primaryButtonColor)!=null?k:v().accentColor;V.style.background=d.cardBackgroundColor,V.style.borderColor=d.cardBorderColor,(u==null?void 0:u.borderRadius)!=null&&(V.style.borderRadius=`${u.borderRadius}px`),ye.style.color=d.bodyColor,pe.style.color=d.bodyColor,Se.querySelectorAll(".fyodos-bubble-user").forEach(U=>{U.style.color=d.bodyColor}),Se.querySelectorAll(".fyodos-bubble-reply").forEach(U=>{U.style.color=d.titleColor});let w=(M=u==null?void 0:u.inputBackgroundColor)!=null?M:"#ffffff";W.style.background=w,W.style.color=Fe(w),W.style.setProperty("--fyodos-input-placeholder",ln(w)),re.style.background=y,re.style.color=Fe(y),re.style.borderRadius=`${(_=u==null?void 0:u.sendButtonRadius)!=null?_:10}px`,Ke(),we.querySelectorAll("span").forEach(U=>{U.style.background=y}),ie.style.color=d.titleColor}function Et(d){Z=d,V.style.display=d?"flex":"none",d?(wo(),_n(),W.focus()):(Te.stop(),Ke(),e.resetBubbleWindow(),be=!1,Mn(),Tt(!1)),Bn(e.getState()),Rt(e.getState())}function Ln(){if(e.getState().isBusy)return;let d=W.value.trim();d&&(Te.stop(),Ke(),a.trigger("send"),W.value="",e.submitTextTurn(d))}function je(d,y=!1){var _;let w=e.cancelAll(),k=(_=d==null?void 0:d.trim())!=null?_:"",M=k||w||"";W.value=M,Et(!0),y&&k&&queueMicrotask(()=>Ln())}function Bn(d){if(!(i&&!Z&&(d.phase==="listening"||be))){C&&(C.remove(),C=null);return}if(C){ue();return}let w=v();C=ki({theme:c!=null?c:{},accentColor:w.accentColor,backgroundColor:w.backgroundColor,label:s.keyboardChipLabel,onClick:()=>{a.trigger("keyboardChip"),je()}}),R.appendChild(C),ue()}function It(){var d,y;try{let w=(y=(d=e.config).getLocale)==null?void 0:y.call(d);if(typeof w=="string"&&w.trim())return w.trim()}catch{}return e.config.locale}function To(){return Dt(et(x,e.config.manifest.routes),e.messages,{locale:It(),actions:e.config.manifest.actions})}function er(d){let y=p,{padH:w}=bt(y);A.style.width="",A.textContent=d;let k=A.scrollWidth,M=typeof window!="undefined"?window.innerWidth:280,_=Math.min(280,M*.7);if(!(k>_-y.borderWidth*2)){A.style.width="";return}let G=Math.max(0,k-w*2),H=Math.max(4,(G+48)/30);A.style.width=`${_}px`,A.textContent="";let K=document.createElement("div");K.className="fyodos-thought-track",K.style.animation=`fyodos-marquee ${H}s linear infinite`;let se=document.createElement("span");se.textContent=d;let Ie=document.createElement("span");Ie.textContent=d,Ie.setAttribute("aria-hidden","true"),K.appendChild(se),K.appendChild(Ie),A.appendChild(K)}function Eo(d){let y=p,{fontPx:w,padH:k,approxHeight:M}=bt(y),_=hn(y,M,1,d);A.style.fontSize=`${w}px`,A.style.height=`${M}px`,A.style.padding=`0 ${k}px`,A.style.color=y.textColor,A.style.background=y.backgroundColor,A.style.border=`${y.borderWidth}px solid ${y.borderColor}`,mn(A,_)}function Io(){let d=yt(N());d.horizontal==="left"?(A.style.right="calc(100% + 10px)",A.style.left=""):(A.style.left="calc(100% + 10px)",A.style.right=""),d.vertical==="up"?(A.style.top="0",A.style.bottom="",A.style.transform=""):(A.style.bottom="0",A.style.top="",A.style.transform="")}function Rt(d){let y=!d.showThinking&&!d.showWaveform&&d.phase!=="speaking"&&!be,w=f&&!Z&&y?To():null;if(!w){A.style.display="none";return}if(A.setAttribute("aria-label",w),A.style.display="flex",Eo(),er(w),p.shape==="cloud"){let k=A.offsetWidth;k>0&&Eo(k)}Io()}let Xe=null;function qe(){Xe&&(Xe.remove(),Xe=null)}function Ro(){let d={...ze,...u!=null?u:{}},y=document.createElement("div");y.className="fyodos-overlay",y.style.zIndex=String(o+10);let w=document.createElement("div");return w.className="fyodos-modal",w.style.background=d.cardBackgroundColor,w.style.border=`1px solid ${d.cardBorderColor}`,w.style.color=d.titleColor,w.setAttribute("role","dialog"),w.setAttribute("aria-modal","true"),y.appendChild(w),{overlay:y,modal:w}}function tr(d,y){var Ie;qe();let w={...ze,...u!=null?u:{}},k=(Ie=u==null?void 0:u.primaryButtonColor)!=null?Ie:v().accentColor,{overlay:M,modal:_}=Ro(),U=document.createElement("h3");U.textContent=s.confirmTitle;let G=document.createElement("p");if(G.style.color=w.bodyColor,G.textContent=d,_.append(U,G),y){let Re=document.createElement("div");Re.className="fyodos-hint",Re.style.color=w.bodyColor,Re.textContent=y,_.append(Re)}let H=document.createElement("div");H.className="fyodos-modal-actions";let K=document.createElement("button");K.className="fyodos-btn-ghost",K.style.color=w.bodyColor,K.textContent=s.cancelLabel,K.onclick=()=>e.cancelPendingAction();let se=document.createElement("button");se.className="fyodos-btn-primary",se.style.background=k,se.textContent=s.confirmLabel,se.onclick=()=>{e.confirmPendingAction()},H.append(K,se),_.append(H),M.onclick=Re=>{Re.target===M&&e.cancelPendingAction()},n.appendChild(M),Xe=M}function nr(){var K;qe();let d={...ze,...u!=null?u:{}},y=(K=u==null?void 0:u.primaryButtonColor)!=null?K:v().accentColor,{overlay:w,modal:k}=Ro(),M=document.createElement("h3");M.textContent=s.consentTitle;let _=document.createElement("p");_.style.color=d.bodyColor,_.textContent=s.consentBody;let U=document.createElement("div");U.className="fyodos-modal-actions";let G=document.createElement("button");G.className="fyodos-btn-ghost",G.style.color=d.bodyColor,G.textContent=s.consentDecline,G.onclick=()=>e.declineConsent();let H=document.createElement("button");H.className="fyodos-btn-primary",H.style.background=y,H.textContent=s.consentAccept,H.onclick=()=>{e.acceptConsent()},U.append(G,H),k.append(M,_,U),n.appendChild(w),Xe=w}g.onclick=()=>{if(j){j=!1;return}if(e.primeAudio(),e.getState().showThinking){a.trigger("orbTap");let y=e.cancelAll();y&&Z&&(W.value=y,At(W));return}if(a.trigger("orbTap"),Z){Et(!1);return}if(!m&&i){be=!1,je();return}if(e.voiceAvailable&&m){be=!1,wt=!0,e.toggleListening();return}if(i){be=!1,je();return}wt=!0,e.toggleListening()},re.onclick=()=>{let d=e.getState();if(d.isBusy||d.chainActive){a.trigger("orbTap");let y=e.cancelAll();y&&(W.value=y,At(W)),W.focus();return}Ln()},W.onkeydown=d=>{d.key==="Enter"&&Ln(),d.key==="Escape"&&Et(!1)},W.addEventListener("input",()=>At(W)),i||C&&(C.style.display="none");let Oo=null,ko=!1,Nn=!1,Ot=null;function _o(d){if(d.voiceBlocked&&!Nn){if(Nn=!0,wt&&i&&!Z&&!d.isBusy){je();return}}else d.voiceBlocked||(Nn=!1);d.phase!==Ot&&(d.phase==="listening"?a.trigger("listenStart"):Ot==="listening"&&a.trigger("listenStop"),Ot==="thinking"&&a.trigger("response"),Ot=d.phase);let y=d.showThinking?"thinking":d.showWaveform||be?"listening":d.phase==="speaking"?"speaking":"idle";E.applyState(y,d.volumeLevel);let w=d.showThinking||d.chainActive;if(Ji(w,d),Z){Ve.style.display=d.loadingOlderExchanges?"flex":"none",qi(d.recentExchanges),oe.style.display="flex",we.style.display=w?"flex":"none";let k=d.isBusy||d.chainActive;re.textContent=k?"\u25FC":"\u2191",re.setAttribute("aria-label",k?s.cancelLabel:s.sendLabel),re.style.opacity="1",re.disabled=!1,D.style.opacity=k?"0.45":"1",D.disabled=k,Ke()}Bn(d),Rt(d),d.confirmationMessage!==Oo&&(Oo=d.confirmationMessage,d.confirmationMessage?tr(d.confirmationMessage,d.confirmationVoiceHint):d.consentModalVisible||qe()),d.consentModalVisible!==ko&&(ko=d.consentModalVisible,d.consentModalVisible?nr():d.confirmationMessage||qe())}let or=e.subscribe(_o);_o(e.getState());let Po=It(),Ee=()=>{let d=null;try{d=e.config.navigation.getCurrentRoute()}catch{}let y=It();(d!==x||y!==Po)&&(x=d,Po=y,Rt(e.getState()))};Ee();let ir=window.setInterval(Ee,700);window.addEventListener("popstate",Ee),document.addEventListener("visibilitychange",Ee);let rr=Li(e,{pollMs:t.appearancePollMs,onChange:d=>{let y=d!=null&&En(d.internalProfile,t.allowInternalOrb===!0);S.style.display=d&&d.enabled===!1||y?"none":"",d&&(l=d.appearance,c=d.keyboardChip,u=d.modalTheme,p=d.bubbleTheme,f=d.bubbleEnabled,m=d.voiceInputEnabled,h=d.thinkingStepsEnabled,e.setConversationRetention(d.conversationRetentionMinutes,d.internalProfile),r&&d.screenPosition&&(T=d.screenPosition)),E.applyAppearance(v()),Y(),C&&(C.remove(),C=null),Bn(e.getState()),Rt(e.getState()),Z&&wo()}});return{unmount(){Te.dispose(),or(),rr(),window.clearInterval(ir),window.removeEventListener("popstate",Ee),document.removeEventListener("visibilitychange",Ee),window.removeEventListener("resize",Y),O==null||O.disconnect(),b==null||b.removeEventListener("resize",I),b==null||b.removeEventListener("scroll",I),qe(),C==null||C.remove(),S.remove()}}}var Di="fiodos-dev-error-badge";function tc(){try{return!1}catch{return!1}}function go(e,t){if(!tc()||typeof document=="undefined"||!document.body)return;let n=nc(e),o=document.getElementById(Di);if(o){let l=o.querySelector("[data-fiodos-badge-msg]");l&&(l.textContent=n);return}o=document.createElement("div"),o.id=Di,o.setAttribute("role","alert"),o.style.cssText=["position:fixed","bottom:20px","right:20px","z-index:2147483000","max-width:340px","padding:12px 14px","border-radius:12px","background:#1b1b1f","color:#fff","font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif","font-size:13px","line-height:1.45","box-shadow:0 8px 28px rgba(0,0,0,0.35)","border:1px solid rgba(255,255,255,0.12)"].join(";");let i=document.createElement("div");i.style.cssText="display:flex;align-items:center;gap:6px;margin-bottom:6px;font-weight:600;color:#ffd166",i.textContent="\u25C9 Fiodos \xB7 el orbe no se mont\xF3 (solo desarrollo)";let r=document.createElement("button");r.textContent="\xD7",r.setAttribute("aria-label","Cerrar aviso de Fiodos"),r.style.cssText=["margin-left:auto","background:transparent","border:0","color:rgba(255,255,255,0.6)","font-size:18px","line-height:1","cursor:pointer","padding:0 2px"].join(";"),r.addEventListener("click",()=>o==null?void 0:o.remove()),i.appendChild(r);let s=document.createElement("div");s.setAttribute("data-fiodos-badge-msg",""),s.textContent=n;let a=document.createElement("div");a.style.cssText="margin-top:8px;color:rgba(255,255,255,0.55);font-size:11.5px",a.textContent="Comprueba que la API key y la URL de tu app son las del MISMO proyecto donde publicaste. Este aviso solo aparece en desarrollo.",o.appendChild(i),o.appendChild(s),o.appendChild(a),document.body.appendChild(o)}function nc(e){return e.replace(/^\[fyodos\]\s*/i,"").trim()||"No se pudo montar el orbe."}var On="0.1.15",Fi="@fiodos/web-core";var Wi="https://api.fyodos.com";function Ui(e){return e.replace(/\/$/,"")}async function Hi(e){let t=Ui(e.baseUrl);if(!e.apiKey)throw new Error("[fyodos] A drop-in agent requires an apiKey. Set it to the project key from your Fiodos dashboard (e.g. VITE_FYODOS_API_KEY).");let n=await fetch(`${t}/v1/client/manifest`,{method:"GET",headers:{"x-api-key":e.apiKey}});if(!n.ok)throw n.status===401?new Error(`[fyodos] The orb did not load: the API key was rejected (HTTP 401) by ${t}. Check that your FYODOS API key matches the current project key in the dashboard (a deleted/recreated project gets a NEW key).`):new Error(`[fyodos] The orb did not load: could not fetch the manifest (HTTP ${n.status}) from ${t}.`);let o=await n.json();return o.manifest?{status:"ready",manifest:o.manifest}:{status:"no-manifest",manifest:null}}function oc(){return typeof navigator!="undefined"&&/Mobi|Android|iPhone|iPad/i.test(navigator.userAgent)?"web-mobile":"web"}async function bo(e){var n;if(!e.apiKey)return;let t=Ui(e.baseUrl);try{await fetch(`${t}/v1/client/orb-seen`,{method:"POST",headers:{"Content-Type":"application/json","x-api-key":e.apiKey},body:JSON.stringify({platform:(n=e.platform)!=null?n:oc(),sdkVersion:On,sdkPackage:Fi})})}catch{}}function ic(e){typeof window!="undefined"&&window.location&&window.location.assign(e)}function Ki(){let e=typeof navigator!="undefined"&&navigator.language?navigator.language:"en-US";return{locale:e.split("-")[0]||"en",sttLocale:e}}function zi(){var e,t;return typeof document!="undefined"&&((t=(e=document.documentElement.lang)==null?void 0:e.split(/[-_]/)[0])==null?void 0:t.trim())||""}function Vi(e){var o,i,r;let t=(i=(o=e.getLocale)==null?void 0:o.call(e))==null?void 0:i.trim();if(t)return t;if((r=e.locale)!=null&&r.trim())return e.locale.trim();if(e.localeDetection==="browser")return Ki().locale;if(e.localeDetection==="document"){let s=zi();if(s)return s}let n=zi();return n||"en"}function Gi(e,t,n){var u,p,f,m;let o=Ki(),i=Vi(e),r=(p=(u=e.sttLocale)!=null?u:e.locale)!=null?p:o.sttLocale,s=ci({baseUrl:n,apiKey:e.apiKey,getUserId:e.getUserId}),a=li({baseUrl:n,apiKey:e.apiKey,getUserId:e.getUserId}),l={manifest:t,locale:i,getLocale:()=>Vi(e),sttLocale:r,navigation:ui({navigate:(f=e.navigate)!=null?f:ic,getCurrentRoute:e.getCurrentRoute}),registries:(m=e.registries)!=null?m:{handlers:{},idempotencyCheckers:{}},backend:s,voice:hi(),storage:di(),telemetry:a,isAuthenticated:e.isAuthenticated,getSessionCapabilities:e.getSessionCapabilities,getUserId:e.getUserId,ttsVoice:e.ttsVoice,...e.configOverrides},c=new He(l);return c.warmUp(),c}function Yi(e){var a,l;let t=((a=e.baseUrl)!=null?a:Wi).replace(/\/$/,""),n=e.mount!==!1,o=Symbol("fiodos-embed-host");if(e.manifest){let c=Gi(e,e.manifest,t),u=n?St(c,e.orb):null;return n&&e.apiKey&&bo({baseUrl:t,apiKey:e.apiKey}),(l=e.onReady)==null||l.call(e,c),{controller:c,orb:u,ready:Promise.resolve(c),resetConversation(){c.resetConversation()},setScreenContext(f){c.screenStore.set(o,f)},clearScreenContext(){c.screenStore.clear(o)},destroy(){u==null||u.unmount(),c.dispose()}}}let i,r={controller:null,orb:null,ready:Promise.resolve(null),resetConversation(){var c;(c=r.controller)==null||c.resetConversation()},setScreenContext(c){r.controller?r.controller.screenStore.set(o,c):i=c},clearScreenContext(){r.controller?r.controller.screenStore.clear(o):i=null},destroy(){var c,u;s=!0,(c=r.orb)==null||c.unmount(),(u=r.controller)==null||u.dispose()}},s=!1;return r.ready=(async()=>{var c,u;try{if(!e.apiKey)throw new Error("[fyodos] createFiodosAgent requires either a `manifest` or an `apiKey` (to self-fetch the published manifest).");let p=await Hi({baseUrl:t,apiKey:e.apiKey});if(s)return null;if(p.status==="no-manifest"||!p.manifest){let h="[fyodos] No hay manifest publicado para esta API key todav\xEDa. Ejecuta `npx @fiodos/cli analyze . --publish` o publ\xEDcalo desde el dashboard, y recarga.";return console.warn(h),go(h,{baseUrl:t}),null}let f=he(p.manifest);if(!f.valid)throw new Error(`[fyodos] Invalid manifest for "${p.manifest.appId}":
|
|
65
|
+
- ${f.errors.join(`
|
|
66
|
+
- `)}`);let m=Gi(e,p.manifest,t);return s?(m.dispose(),null):(r.controller=m,i&&m.screenStore.set(o,i),i=void 0,r.orb=n?St(m,e.orb):null,n&&e.apiKey&&bo({baseUrl:t,apiKey:e.apiKey}),(c=e.onReady)==null||c.call(e,m),m)}catch(p){let f=p instanceof Error?p:new Error(String(p));return console.error(f.message),go(f.message,{baseUrl:t}),(u=e.onError)==null||u.call(e,f),null}})(),r}function kn(e){let t=e.trim();return t.length>120?`${t.slice(0,119)}\u2026`:t}function rc(e){let t=e.map(n=>n&&typeof n=="object"&&typeof n.name=="string"?n.name:null).filter(n=>!!n);return t.length?t.join(", "):null}function sc(e){var n;try{let o=(n=e.getText)==null?void 0:n.call(e);if(typeof o=="string"&&o.trim())return kn(o);if(Array.isArray(o)&&o.length)return kn(o.join(", "))}catch{}let t;try{t=e.getValue()}catch{return null}if(t==null)return null;if(typeof t=="string")return t.trim()?kn(t):null;if(typeof t=="number"||typeof t=="boolean")return t;if(t instanceof Date)return t.toISOString();if(Array.isArray(t)){let o=rc(t);return o?kn(o):null}return null}function yo(e){return e.replace(/[{}]/g,"").trim().toLowerCase()}function xo(e,t={}){var h,x,T,v,S,R,E,g;let n=(h=e.data)==null?void 0:h.entity;if(!n)return null;let o=n.getEntityName(),i=yo((x=n.getId())!=null?x:""),r=(T=t.attributes)!=null&&T.length?new Set(t.attributes.map(C=>C.trim().toLowerCase()).filter(Boolean)):null,s=(v=t.maxAttributes)!=null?v:12,a={},l=0;(S=n.attributes)==null||S.forEach(C=>{let A;try{A=C.getName()}catch{return}if(!A)return;if(r){if(!r.has(A.toLowerCase()))return}else if(l>=s)return;let B=sc(C);B!=null&&(a[A]=B,l+=1)});let c;try{c=(E=(R=n.getPrimaryAttributeValue)==null?void 0:R.call(n))!=null?E:void 0}catch{c=void 0}let u=i?{id:i,kind:o,title:c,metadata:a}:null,p=Object.entries(a).map(([C,A])=>`${C}: ${A}`).join("; "),f=[`Dynamics 365 form \u2014 entity "${o}"`,i?`record "${c!=null?c:i}" (id ${i})`:"new record (not saved yet)"];p&&f.push(`Fields: ${p}`);let m={...u?{visibleContent:{items:[u],focusedIndex:0}}:{},custom:{platform:"dynamics365",entityName:o,...i?{recordId:i}:{},...typeof((g=e.ui)==null?void 0:g.getFormType)=="function"?{formType:e.ui.getFormType()}:{}}};return{kind:`dynamics-form:${o}`,text:f.join(". "),context:m}}function ji(e,t,n={}){var s;let o=!1,i=()=>{if(o)return;let a=xo(t,n);a?e.setScreenContext(a):e.clearScreenContext()};i();let r=(s=t.data)==null?void 0:s.entity;if(r!=null&&r.addOnPostSave)try{r.addOnPostSave(i)}catch{}return{refresh:i,disconnect(){var a;if(!o){o=!0;try{(a=r==null?void 0:r.removeOnPostSave)==null||a.call(r,i)}catch{}e.clearScreenContext()}}}}var ac={version:On,createFiodosAgent:Yi,mountOrb:St,AgentController:He,createScreenContextStore:Rn,buildApiActionRegistries:Bt,validateManifest:he,connectDynamicsFormContext:ji,dynamicsFormSnapshot:xo,normalizeDynamicsId:yo};globalThis.Fiodos=ac;})();
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web implementation of @fiodos/core's CredentialAutofillAdapter, on top of
|
|
3
|
+
* the Credential Management API (`navigator.credentials.get({ password: true,
|
|
4
|
+
* mediation: 'required' })`). The BROWSER owns the account-picker / user
|
|
5
|
+
* verification UI; this module only receives the outcome:
|
|
6
|
+
*
|
|
7
|
+
* - A `PasswordCredential` → 'success' with the saved username + password.
|
|
8
|
+
* - `null` (user dismissed the picker, or no saved credential and the browser
|
|
9
|
+
* chose not to prompt) → 'dismissed' (graceful fallback, never an error).
|
|
10
|
+
* - No API / SecurityError (insecure context, iframe policy) → 'unavailable'.
|
|
11
|
+
*
|
|
12
|
+
* The credentials never touch storage, logs or the network from here: they go
|
|
13
|
+
* straight into the app's own login handler parameters, one call, then gone.
|
|
14
|
+
*/
|
|
15
|
+
import type { CredentialAutofillAdapter } from '@fiodos/core';
|
|
16
|
+
export declare function createWebCredentialAutofillAdapter(): CredentialAutofillAdapter;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function credentialsContainer() {
|
|
2
|
+
if (typeof navigator === 'undefined')
|
|
3
|
+
return null;
|
|
4
|
+
const nav = navigator;
|
|
5
|
+
return nav.credentials && typeof nav.credentials.get === 'function' ? nav.credentials : null;
|
|
6
|
+
}
|
|
7
|
+
function passwordCredentialSupported() {
|
|
8
|
+
if (typeof window === 'undefined')
|
|
9
|
+
return false;
|
|
10
|
+
const w = window;
|
|
11
|
+
// The Credential Management password store needs both the constructor and a
|
|
12
|
+
// secure context; feature-detect instead of sniffing the browser.
|
|
13
|
+
return typeof w.PasswordCredential === 'function' && w.isSecureContext !== false;
|
|
14
|
+
}
|
|
15
|
+
export function createWebCredentialAutofillAdapter() {
|
|
16
|
+
return {
|
|
17
|
+
isSupported() {
|
|
18
|
+
return credentialsContainer() !== null && passwordCredentialSupported();
|
|
19
|
+
},
|
|
20
|
+
async requestCredentials() {
|
|
21
|
+
const container = credentialsContainer();
|
|
22
|
+
if (!container || !passwordCredentialSupported())
|
|
23
|
+
return { status: 'unavailable' };
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
// mediation 'required': ALWAYS show the browser's account picker — the
|
|
27
|
+
// user explicitly asked to sign in, so a visible, cancellable choice is
|
|
28
|
+
// the honest UX (and the only one that lets them pick among accounts).
|
|
29
|
+
raw = await container.get({ password: true, mediation: 'required' });
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// SecurityError (permissions policy / insecure frame), NotSupportedError…
|
|
33
|
+
return { status: 'unavailable' };
|
|
34
|
+
}
|
|
35
|
+
const cred = raw;
|
|
36
|
+
if (!cred)
|
|
37
|
+
return { status: 'dismissed' };
|
|
38
|
+
if (cred.type === 'password' && cred.id && typeof cred.password === 'string' && cred.password) {
|
|
39
|
+
return { status: 'success', username: cred.id, password: cred.password };
|
|
40
|
+
}
|
|
41
|
+
return { status: 'unavailable' };
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* way. The only platform dependency is `fetch` + `AbortController` (native in
|
|
7
7
|
* the browser). No client source code is ever sent — only the manifest payload.
|
|
8
8
|
*/
|
|
9
|
-
import { type AgentBackendClient, type AppManifest } from '@fiodos/core';
|
|
9
|
+
import { type ActionRegistries, type AgentBackendClient, type AppManifest } from '@fiodos/core';
|
|
10
10
|
export interface FiodosBackendClientOptions {
|
|
11
11
|
baseUrl: string;
|
|
12
12
|
/** Client API key sent as x-api-key. */
|
|
@@ -19,8 +19,15 @@ export interface FiodosBackendClientOptions {
|
|
|
19
19
|
ttsTimeoutMs?: number;
|
|
20
20
|
}
|
|
21
21
|
export declare function createFiodosBackendClient(options: FiodosBackendClientOptions): AgentBackendClient;
|
|
22
|
-
/**
|
|
23
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Serializes the manifest payloads for a turn request (used by AgentController).
|
|
24
|
+
*
|
|
25
|
+
* When the live registries are provided, actions with no registered handler
|
|
26
|
+
* are dropped from the payload (runtime "wired or nonexistent"): the LLM never
|
|
27
|
+
* hears about an action this mounted app cannot execute, so it can never
|
|
28
|
+
* promise it. Fail-open without registries.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildManifestPayload(manifest: AppManifest, registries?: ActionRegistries | null): {
|
|
24
31
|
appFlow?: string | undefined;
|
|
25
32
|
appType?: string | undefined;
|
|
26
33
|
manifestVersion: string;
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* way. The only platform dependency is `fetch` + `AbortController` (native in
|
|
7
7
|
* the browser). No client source code is ever sent — only the manifest payload.
|
|
8
8
|
*/
|
|
9
|
-
import { manifestActionsForBackend, manifestRoutesForBackend, parseAgentAction, } from '@fiodos/core';
|
|
9
|
+
import { manifestActionsForBackend, manifestRoutesForBackend, parseAgentAction, withExecutableActions, } from '@fiodos/core';
|
|
10
10
|
import { AgentApiError } from './errors.js';
|
|
11
11
|
const DEFAULT_TURN_TIMEOUT_MS = 15000;
|
|
12
12
|
const DEFAULT_TTS_TIMEOUT_MS = 12000;
|
|
@@ -115,6 +115,20 @@ export function createFiodosBackendClient(options) {
|
|
|
115
115
|
if (request.sessionId?.trim()) {
|
|
116
116
|
body.session_id = request.sessionId.trim();
|
|
117
117
|
}
|
|
118
|
+
// Device capability flags (retrocompatible: old backends ignore them).
|
|
119
|
+
if (request.platformCapabilities?.credentialAutofill) {
|
|
120
|
+
body.platform_capabilities = { credential_autofill: true };
|
|
121
|
+
}
|
|
122
|
+
// Live session verdict for audience filtering (retrocompatible: absent
|
|
123
|
+
// when the host wired no session source; old backends ignore it).
|
|
124
|
+
if (request.sessionContext) {
|
|
125
|
+
body.session_context = {
|
|
126
|
+
authenticated: request.sessionContext.authenticated,
|
|
127
|
+
...(request.sessionContext.capabilities
|
|
128
|
+
? { capabilities: request.sessionContext.capabilities }
|
|
129
|
+
: {}),
|
|
130
|
+
};
|
|
131
|
+
}
|
|
118
132
|
// Autonomous-chain continuation metadata (backward compatible: absent on a
|
|
119
133
|
// normal turn; an old backend simply ignores these fields).
|
|
120
134
|
if (request.isContinuation) {
|
|
@@ -184,15 +198,23 @@ export function createFiodosBackendClient(options) {
|
|
|
184
198
|
},
|
|
185
199
|
};
|
|
186
200
|
}
|
|
187
|
-
/**
|
|
188
|
-
|
|
201
|
+
/**
|
|
202
|
+
* Serializes the manifest payloads for a turn request (used by AgentController).
|
|
203
|
+
*
|
|
204
|
+
* When the live registries are provided, actions with no registered handler
|
|
205
|
+
* are dropped from the payload (runtime "wired or nonexistent"): the LLM never
|
|
206
|
+
* hears about an action this mounted app cannot execute, so it can never
|
|
207
|
+
* promise it. Fail-open without registries.
|
|
208
|
+
*/
|
|
209
|
+
export function buildManifestPayload(manifest, registries) {
|
|
210
|
+
const effective = withExecutableActions(manifest, registries);
|
|
189
211
|
return {
|
|
190
|
-
manifestVersion:
|
|
191
|
-
manifestRoutes: manifestRoutesForBackend(
|
|
192
|
-
manifestActions: manifestActionsForBackend(
|
|
193
|
-
appName:
|
|
194
|
-
appDescription:
|
|
195
|
-
...(
|
|
196
|
-
...(
|
|
212
|
+
manifestVersion: effective.version,
|
|
213
|
+
manifestRoutes: manifestRoutesForBackend(effective),
|
|
214
|
+
manifestActions: manifestActionsForBackend(effective),
|
|
215
|
+
appName: effective.appName,
|
|
216
|
+
appDescription: effective.appDescription,
|
|
217
|
+
...(effective.appType ? { appType: effective.appType } : {}),
|
|
218
|
+
...(effective.appFlow ? { appFlow: effective.appFlow } : {}),
|
|
197
219
|
};
|
|
198
220
|
}
|