murmur-rag 2.1.3 → 2.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/dist/cdn/{anthropic-p21yv83k.js → anthropic-9g8r07a0.js} +2 -2
  2. package/dist/cdn/chunk-c0ztxsjw.js +1 -0
  3. package/dist/cdn/{embed-zckjbrcx.js → embed-3x3yz3jw.js} +3 -3
  4. package/dist/cdn/embed-b072jtkd.js +9 -0
  5. package/dist/cdn/{embed-xdftb0b2.js → embed-gx1epk52.js} +5 -5
  6. package/dist/cdn/{embed-3vb4wcng.js → embed-hm6mmwpk.js} +2 -2
  7. package/dist/cdn/{embed-52n5pm9t.js → embed-pm1dj76g.js} +25 -25
  8. package/dist/cdn/{embed-f7gzw56s.js → embed-q2zmgyqj.js} +2 -2
  9. package/dist/cdn/{embed-wd4wcxtq.js → embed-strrtkwa.js} +1 -1
  10. package/dist/cdn/{google-df5pjzyw.js → google-8ag1bn64.js} +3 -3
  11. package/dist/cdn/{index-0yvq5pe3.js → index-27ae3wqx.js} +1 -1
  12. package/dist/cdn/{index-tjxzgn54.js → index-3hkf4rah.js} +1 -1
  13. package/dist/cdn/{index-arpy64fv.js → index-ec42kn0e.js} +1 -1
  14. package/dist/cdn/index-em6py5z5.js +1 -0
  15. package/dist/cdn/{index-f5ctpc4w.js → index-xz31ft5m.js} +1 -1
  16. package/dist/cdn/{mistral-0tm1pmab.js → mistral-x5wz2kx2.js} +1 -1
  17. package/dist/cdn/murmur-s4gkmy66.js +5 -0
  18. package/dist/cdn/murmur.js +6 -6
  19. package/dist/cdn/{openai-t1hcmmxm.js → openai-84wvv6cp.js} +6 -6
  20. package/dist/cdn/{openai-compatible-vqp1sqdg.js → openai-compatible-5qanv34a.js} +2 -2
  21. package/dist/cdn/retriever-brdwdchq.js +1 -0
  22. package/dist/cdn/{transformers.web-nr67a9j3.js → transformers.web-3m8jygmc.js} +1 -1
  23. package/dist/lib/chunks/index-7xc57jeh.js +86 -0
  24. package/dist/lib/chunks/{index-6j52e72a.js → index-9ybqwzx2.js} +43 -23
  25. package/dist/lib/chunks/{index-8h9c8ekq.js → index-ahy8h3ks.js} +16 -6
  26. package/dist/lib/chunks/{index-p86sy3y4.js → index-pjwdwban.js} +1 -1
  27. package/dist/lib/chunks/{murmur-t36hd4vt.js → murmur-5e79jear.js} +2 -2
  28. package/dist/lib/chunks/{retriever-wxshtnm0.js → retriever-62r4an0v.js} +1 -1
  29. package/dist/lib/embed.js +2 -2
  30. package/dist/lib/index.js +8 -4
  31. package/dist/lib/rag/index.js +7 -3
  32. package/dist/lib/widget/index.js +2 -2
  33. package/dist/types/core/murmur.d.ts +2 -0
  34. package/dist/types/rag/ground.d.ts +14 -3
  35. package/dist/types/rag/index.d.ts +1 -1
  36. package/package.json +1 -1
  37. package/dist/cdn/chunk-nhd6pd73.js +0 -1
  38. package/dist/cdn/embed-q03dhgpb.js +0 -9
  39. package/dist/cdn/index-r7h9ewgp.js +0 -1
  40. package/dist/cdn/murmur-krwan2e5.js +0 -5
  41. package/dist/cdn/retriever-3yz0vzz9.js +0 -1
  42. package/dist/lib/chunks/index-b77xqap3.js +0 -58
@@ -1,9 +1,9 @@
1
- import{N,yn,Xe,et,Ot}from"./embed-q03dhgpb.js";yn(import.meta.url,["9a9djeyw","0yvq5pe3","nhd6pd73","tjxzgn54","krwan2e5","3yz0vzz9","arpy64fv","f5ctpc4w","q03dhgpb","3vb4wcng","zckjbrcx","xdftb0b2","wd4wcxtq","nr67a9j3","vqp1sqdg","r7h9ewgp","t87kf8t0","t1hcmmxm","p21yv83k","df5pjzyw","0tm1pmab","52n5pm9t","f7gzw56s"],[["./murmur.js",8],["./index-0yvq5pe3.js",9],["./chunk-nhd6pd73.js",10],["./index-tjxzgn54.js",10],["./murmur-krwan2e5.js",11,12,8],["./retriever-3yz0vzz9.js",12],["./index-arpy64fv.js",9],["./index-f5ctpc4w.js",8],["./embed-q03dhgpb.js"],["./embed-3vb4wcng.js",8],["./embed-zckjbrcx.js"],["./embed-xdftb0b2.js",8,21],["./embed-wd4wcxtq.js",8],["./transformers.web-nr67a9j3.js",8],["./openai-compatible-vqp1sqdg.js",9,21],["./index-r7h9ewgp.js",11],["./browser-t87kf8t0.js"],["./openai-t1hcmmxm.js",9,8,21],["./anthropic-p21yv83k.js",9,22,21],["./google-df5pjzyw.js",9,22,21],["./mistral-0tm1pmab.js",9,21],["./embed-52n5pm9t.js"],["./embed-f7gzw56s.js",21]],0);
2
- var X={open:"Ask a question",close:"Close",title:"Ask this site",greeting:"Hi! Ask me anything about this site. I answer from its pages and link to them.",placeholder:"Your question…",send:"Send",stop:"Stop",settings:"AI settings",back:"Back to chat",sources:"Sources",notFound:"Nothing on this site matched. Try other words?",thinking:"Looking through the site…",newChat:"New conversation",poweredBy:"Answers from this site's pages, by murmur",errorAuth:"The key was refused. Check it in the AI settings.",errorNetwork:"No answer from the AI provider: key refused or network down.",errorRate:"The AI provider is busy or rate-limited. Try again in a moment.",errorOther:"The answer failed:",retry:"Try again",setupTitle:"Connect an AI model",setupIntro:"Pick how this site answers you: a model that runs in your browser, or your own AI key, kept encrypted in your browser and sent only to the provider you pick.",provider:"Provider",model:"Model",apiKey:"API key",apiKeyHint:"Sent only to the provider, never to this site.",remember:"Remember on this device",local:"Local server (Ollama, LM Studio)",localHint:"The server must allow this site's origin (CORS).",endpoint:"Server URL",test:"Test",testing:"Testing…",testOk:"Connected.",testFail:"Connection failed:",save:"Save and chat",forget:"Forget my key",loadingCatalog:"Loading models…",catalogError:"Could not load the model list.",searchModels:"Search models",recommended:"Recommended",otherProviders:"Other providers",localOption:"Run a model in this browser",localOptionHint:"{name}, about {size} downloaded once, then kept in this browser. Needs WebGPU; nothing you type leaves your device.",localActive:"Running in this browser",orKey:"or connect a provider with your key",useKey:"Use an API key instead",localConsent:"This assistant can run entirely in your browser with {name}, an AI model of about {size}. It downloads once, then stays in this browser; your questions never leave your device.",localDownload:"Download and answer",localLoading:"Downloading the model…",localLoadingLabel:"Model download",localPreparing:"Preparing the model on your GPU…",localNoWebGPU:"This browser cannot run the model locally (no WebGPU). Try a recent Chrome, Edge or Safari, or use an API key.",localLoadFailed:"The model could not be loaded in this browser.",localNoWebGPUOnly:"This site answers with an AI model that runs in your browser, and this browser cannot run it (no WebGPU). Try a recent Chrome, Edge or Safari.",gigabytes:"GB",megabytes:"MB"},ce={open:"Poser une question",close:"Fermer",title:"Demandez au site",greeting:"Bonjour ! Posez-moi une question sur ce site. Je réponds à partir de ses pages, avec les liens.",placeholder:"Votre question…",send:"Envoyer",stop:"Arrêter",settings:"Réglages IA",back:"Retour au chat",sources:"Sources",notFound:"Rien sur ce site ne correspond. Essayez d'autres mots ?",thinking:"Je cherche dans le site…",newChat:"Nouvelle conversation",poweredBy:"Réponses tirées des pages de ce site, par murmur",errorAuth:"La clé a été refusée. Vérifiez-la dans les réglages IA.",errorNetwork:"Pas de réponse du fournisseur d'IA : clé refusée ou réseau coupé.",errorRate:"Le fournisseur d'IA est saturé ou limite les appels. Réessayez dans un instant.",errorOther:"La réponse a échoué :",retry:"Réessayer",setupTitle:"Connecter un modèle d'IA",setupIntro:"Choisissez comment ce site vous répond : un modèle qui tourne dans votre navigateur, ou votre propre clé d'IA, gardée chiffrée dans votre navigateur et envoyée seulement au fournisseur choisi.",provider:"Fournisseur",model:"Modèle",apiKey:"Clé API",apiKeyHint:"Envoyée uniquement au fournisseur, jamais à ce site.",remember:"Mémoriser sur cet appareil",local:"Serveur local (Ollama, LM Studio)",localHint:"Le serveur doit autoriser l'origine de ce site (CORS).",endpoint:"URL du serveur",test:"Tester",testing:"Test…",testOk:"Connecté.",testFail:"Échec de la connexion :",save:"Enregistrer et discuter",forget:"Oublier ma clé",loadingCatalog:"Chargement des modèles…",catalogError:"Impossible de charger la liste des modèles.",searchModels:"Chercher un modèle",recommended:"Recommandés",otherProviders:"Autres fournisseurs",localOption:"Faire tourner un modèle dans ce navigateur",localOptionHint:"{name}, environ {size} téléchargés une fois puis gardés dans ce navigateur. Nécessite WebGPU ; rien de ce que vous tapez ne quitte votre appareil.",localActive:"Modèle actif dans ce navigateur",orKey:"ou connectez un fournisseur avec votre clé",useKey:"Utiliser une clé API à la place",localConsent:"Cet assistant peut fonctionner entièrement dans votre navigateur avec {name}, un modèle d'IA d'environ {size}. Il se télécharge une fois puis reste dans ce navigateur ; vos questions ne quittent jamais votre appareil.",localDownload:"Télécharger et répondre",localLoading:"Téléchargement du modèle…",localLoadingLabel:"Téléchargement du modèle",localPreparing:"Préparation du modèle sur votre GPU…",localNoWebGPU:"Ce navigateur ne peut pas faire tourner le modèle en local (pas de WebGPU). Essayez un Chrome, Edge ou Safari récent, ou utilisez une clé API.",localLoadFailed:"Le modèle n'a pas pu être chargé dans ce navigateur.",localNoWebGPUOnly:"Ce site répond avec un modèle d'IA qui tourne dans votre navigateur, et ce navigateur ne peut pas le faire tourner (pas de WebGPU). Essayez un Chrome, Edge ou Safari récent.",gigabytes:"Go",megabytes:"Mo"},ee={en:X,fr:ce};function te(...e){for(let n of e){let o=n?.toLowerCase().split(/[-_]/)[0];if(o&&o in ee)return o}return"en"}function B(e,n={}){return{...ee[e]??X,...n}}var de={chat:'<path d="M4 6.5A2.5 2.5 0 0 1 6.5 4h11A2.5 2.5 0 0 1 20 6.5v7a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.4c-.5.4-1.3 0-1.3-.6V6.5Z"/><path d="M8.5 9h7M8.5 12h4.5"/>',close:'<path d="M6 6l12 12M18 6 6 18"/>',send:'<path d="M12 19V5M6 11l6-6 6 6"/>',stop:'<rect x="7" y="7" width="10" height="10" rx="1.5"/>',settings:'<path d="M4 7h9M17 7h3M4 17h3M11 17h9"/><circle cx="15" cy="7" r="2"/><circle cx="9" cy="17" r="2"/>',reset:'<path d="M5 12a7 7 0 1 0 2.1-5"/><path d="M5 4.5V8h3.5"/>',back:'<path d="M14.5 6 8.5 12l6 6"/>',check:'<path d="m5.5 12.5 4 4 9-9"/>',key:'<circle cx="8" cy="15" r="3.5"/><path d="m10.5 12.5 8-8M16 7l2 2M14 9l1.5 1.5"/>'};function U(e,n){let o=e.createElement("template");return o.innerHTML=`<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">${de[n]??""}</svg>`,o.content.firstElementChild}var pe=/^(https?:\/\/|\/|#|\.\/|mailto:)/i;function S(e,n,o,t){let s=/(`[^`]+`)|(\*\*[^*]+\*\*)|(\*[^*\s][^*]*\*|_[^_\s][^_]*_)|(\[[^\]]+\]\([^)\s]+\))|(\[\d{1,2}\])/g,i=0;for(let c of n.matchAll(s)){let u=c.index??0;if(u>i)t.appendChild(e.createTextNode(n.slice(i,u)));i=u+c[0].length;let d=c[0];if(c[1]){let a=e.createElement("code");a.textContent=d.slice(1,-1),t.appendChild(a)}else if(c[2]){let a=e.createElement("strong");S(e,d.slice(2,-2),o,a),t.appendChild(a)}else if(c[3]){let a=e.createElement("em");S(e,d.slice(1,-1),o,a),t.appendChild(a)}else if(c[4]){let a=d.indexOf("]("),l=d.slice(1,a),p=d.slice(a+2,-1);if(pe.test(p)){let m=e.createElement("a");if(m.href=p,m.textContent=l,/^https?:/i.test(p))m.target="_blank",m.rel="noopener noreferrer";t.appendChild(m)}else t.appendChild(e.createTextNode(l))}else{let a=o(Number(d.slice(1,-1))),l=a?/^[.,;:!?)»]+/.exec(n.slice(i))?.[0]:void 0;if(a&&l){let p=e.createElement("span");p.className="nowrap",p.append(a,e.createTextNode(l)),t.appendChild(p),i+=l.length}else t.appendChild(a??e.createTextNode(d))}}if(i<n.length)t.appendChild(e.createTextNode(n.slice(i)))}var ue=/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)*\|?\s*$/;function ne(e,n){return/ {2,}$|\\$/.test(n)?e.createElement("br"):e.createTextNode(" ")}function oe(e){return e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map((n)=>n.trim())}function W(e,n,o){let t=e.ownerDocument,s=t.createDocumentFragment(),i=n.replace(/\r\n?/g,`
1
+ import{N,wn,Xe,et,Ot}from"./embed-b072jtkd.js";wn(import.meta.url,["jz5c6tw2","27ae3wqx","c0ztxsjw","3hkf4rah","s4gkmy66","brdwdchq","ec42kn0e","xz31ft5m","b072jtkd","hm6mmwpk","3x3yz3jw","gx1epk52","strrtkwa","3m8jygmc","5qanv34a","em6py5z5","t87kf8t0","84wvv6cp","9g8r07a0","8ag1bn64","x5wz2kx2","pm1dj76g","q2zmgyqj"],[["./murmur.js",8],["./index-27ae3wqx.js",9],["./chunk-c0ztxsjw.js",10],["./index-3hkf4rah.js",10],["./murmur-s4gkmy66.js",11,12,8],["./retriever-brdwdchq.js",12],["./index-ec42kn0e.js",9],["./index-xz31ft5m.js",8],["./embed-b072jtkd.js"],["./embed-hm6mmwpk.js",8],["./embed-3x3yz3jw.js"],["./embed-gx1epk52.js",8,21],["./embed-strrtkwa.js",8],["./transformers.web-3m8jygmc.js",8],["./openai-compatible-5qanv34a.js",9,21],["./index-em6py5z5.js",11],["./browser-t87kf8t0.js"],["./openai-84wvv6cp.js",9,8,21],["./anthropic-9g8r07a0.js",9,22,21],["./google-8ag1bn64.js",9,22,21],["./mistral-x5wz2kx2.js",9,21],["./embed-pm1dj76g.js"],["./embed-q2zmgyqj.js",21]],0);
2
+ var X={open:"Ask a question",close:"Close",title:"Ask this site",greeting:"Hi! Ask me anything about this site. I answer from its pages and link to them.",placeholder:"Your question…",send:"Send",stop:"Stop",settings:"AI settings",back:"Back to chat",sources:"Sources",notFound:"Nothing on this site matched. Try other words?",thinking:"Looking through the site…",newChat:"New conversation",poweredBy:"Answers from this site's pages, by murmur",errorAuth:"The key was refused. Check it in the AI settings.",errorNetwork:"No answer from the AI provider: key refused or network down.",errorRate:"The AI provider is busy or rate-limited. Try again in a moment.",errorOther:"The answer failed:",retry:"Try again",setupTitle:"Connect an AI model",setupIntro:"Pick how this site answers you: a model that runs in your browser, or your own AI key, kept encrypted in your browser and sent only to the provider you pick.",provider:"Provider",model:"Model",apiKey:"API key",apiKeyHint:"Sent only to the provider, never to this site.",remember:"Remember on this device",local:"Local server (Ollama, LM Studio)",localHint:"The server must allow this site's origin (CORS).",endpoint:"Server URL",test:"Test",testing:"Testing…",testOk:"Connected.",testFail:"Connection failed:",save:"Save and chat",forget:"Forget my key",loadingCatalog:"Loading models…",catalogError:"Could not load the model list.",searchModels:"Search models",recommended:"Recommended",otherProviders:"Other providers",localOption:"Run a model in this browser",localOptionHint:"{name}, about {size} downloaded once, then kept in this browser. Needs WebGPU; nothing you type leaves your device.",localActive:"Running in this browser",orKey:"or connect a provider with your key",useKey:"Use an API key instead",localConsent:"This assistant can run entirely in your browser with {name}, an AI model of about {size}. It downloads once, then stays in this browser; your questions never leave your device.",localDownload:"Download and answer",localLoading:"Downloading the model…",localLoadingLabel:"Model download",localPreparing:"Preparing the model on your GPU…",localNoWebGPU:"This browser cannot run the model locally (no WebGPU). Try a recent Chrome, Edge or Safari, or use an API key.",localLoadFailed:"The model could not be loaded in this browser.",localNoWebGPUOnly:"This site answers with an AI model that runs in your browser, and this browser cannot run it (no WebGPU). Try a recent Chrome, Edge or Safari.",gigabytes:"GB",megabytes:"MB"},ce={open:"Poser une question",close:"Fermer",title:"Demandez au site",greeting:"Bonjour ! Posez-moi une question sur ce site. Je réponds à partir de ses pages, avec les liens.",placeholder:"Votre question…",send:"Envoyer",stop:"Arrêter",settings:"Réglages IA",back:"Retour au chat",sources:"Sources",notFound:"Rien sur ce site ne correspond. Essayez d'autres mots ?",thinking:"Je cherche dans le site…",newChat:"Nouvelle conversation",poweredBy:"Réponses tirées des pages de ce site, par murmur",errorAuth:"La clé a été refusée. Vérifiez-la dans les réglages IA.",errorNetwork:"Pas de réponse du fournisseur d'IA : clé refusée ou réseau coupé.",errorRate:"Le fournisseur d'IA est saturé ou limite les appels. Réessayez dans un instant.",errorOther:"La réponse a échoué :",retry:"Réessayer",setupTitle:"Connecter un modèle d'IA",setupIntro:"Choisissez comment ce site vous répond : un modèle qui tourne dans votre navigateur, ou votre propre clé d'IA, gardée chiffrée dans votre navigateur et envoyée seulement au fournisseur choisi.",provider:"Fournisseur",model:"Modèle",apiKey:"Clé API",apiKeyHint:"Envoyée uniquement au fournisseur, jamais à ce site.",remember:"Mémoriser sur cet appareil",local:"Serveur local (Ollama, LM Studio)",localHint:"Le serveur doit autoriser l'origine de ce site (CORS).",endpoint:"URL du serveur",test:"Tester",testing:"Test…",testOk:"Connecté.",testFail:"Échec de la connexion :",save:"Enregistrer et discuter",forget:"Oublier ma clé",loadingCatalog:"Chargement des modèles…",catalogError:"Impossible de charger la liste des modèles.",searchModels:"Chercher un modèle",recommended:"Recommandés",otherProviders:"Autres fournisseurs",localOption:"Faire tourner un modèle dans ce navigateur",localOptionHint:"{name}, environ {size} téléchargés une fois puis gardés dans ce navigateur. Nécessite WebGPU ; rien de ce que vous tapez ne quitte votre appareil.",localActive:"Modèle actif dans ce navigateur",orKey:"ou connectez un fournisseur avec votre clé",useKey:"Utiliser une clé API à la place",localConsent:"Cet assistant peut fonctionner entièrement dans votre navigateur avec {name}, un modèle d'IA d'environ {size}. Il se télécharge une fois puis reste dans ce navigateur ; vos questions ne quittent jamais votre appareil.",localDownload:"Télécharger et répondre",localLoading:"Téléchargement du modèle…",localLoadingLabel:"Téléchargement du modèle",localPreparing:"Préparation du modèle sur votre GPU…",localNoWebGPU:"Ce navigateur ne peut pas faire tourner le modèle en local (pas de WebGPU). Essayez un Chrome, Edge ou Safari récent, ou utilisez une clé API.",localLoadFailed:"Le modèle n'a pas pu être chargé dans ce navigateur.",localNoWebGPUOnly:"Ce site répond avec un modèle d'IA qui tourne dans votre navigateur, et ce navigateur ne peut pas le faire tourner (pas de WebGPU). Essayez un Chrome, Edge ou Safari récent.",gigabytes:"Go",megabytes:"Mo"},ee={en:X,fr:ce};function te(...e){for(let n of e){let o=n?.toLowerCase().split(/[-_]/)[0];if(o&&o in ee)return o}return"en"}function B(e,n={}){return{...ee[e]??X,...n}}var de={chat:'<path d="M4 6.5A2.5 2.5 0 0 1 6.5 4h11A2.5 2.5 0 0 1 20 6.5v7a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.4c-.5.4-1.3 0-1.3-.6V6.5Z"/><path d="M8.5 9h7M8.5 12h4.5"/>',close:'<path d="M6 6l12 12M18 6 6 18"/>',send:'<path d="M12 19V5M6 11l6-6 6 6"/>',stop:'<rect x="7" y="7" width="10" height="10" rx="1.5"/>',settings:'<path d="M4 7h9M17 7h3M4 17h3M11 17h9"/><circle cx="15" cy="7" r="2"/><circle cx="9" cy="17" r="2"/>',reset:'<path d="M5 12a7 7 0 1 0 2.1-5"/><path d="M5 4.5V8h3.5"/>',back:'<path d="M14.5 6 8.5 12l6 6"/>',check:'<path d="m5.5 12.5 4 4 9-9"/>',key:'<circle cx="8" cy="15" r="3.5"/><path d="m10.5 12.5 8-8M16 7l2 2M14 9l1.5 1.5"/>'};function U(e,n){let o=e.createElement("template");return o.innerHTML=`<svg viewBox="0 0 24 24" width="20" height="20" fill="none" stroke="currentColor" stroke-width="1.75" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" focusable="false">${de[n]??""}</svg>`,o.content.firstElementChild}var pe=/^(https?:\/\/|\/|#|\.\/|mailto:)/i;function S(e,n,o,t){let s=/(`[^`]+`)|(\*\*[^*]+\*\*)|(\*[^*\s][^*]*\*|_[^_\s][^_]*_)|(\[[^\]]+\]\([^)\s]+\))|(\[\d{1,2}\])/g,i=0;for(let d of n.matchAll(s)){let u=d.index??0;if(u>i)t.appendChild(e.createTextNode(n.slice(i,u)));i=u+d[0].length;let c=d[0];if(d[1]){let l=e.createElement("code");l.textContent=c.slice(1,-1),t.appendChild(l)}else if(d[2]){let l=e.createElement("strong");S(e,c.slice(2,-2),o,l),t.appendChild(l)}else if(d[3]){let l=e.createElement("em");S(e,c.slice(1,-1),o,l),t.appendChild(l)}else if(d[4]){let l=c.indexOf("]("),r=c.slice(1,l),p=c.slice(l+2,-1);if(pe.test(p)){let m=e.createElement("a");if(m.href=p,m.textContent=r,/^https?:/i.test(p))m.target="_blank",m.rel="noopener noreferrer";t.appendChild(m)}else t.appendChild(e.createTextNode(r))}else{let l=o(Number(c.slice(1,-1))),r=l?/^[.,;:!?)»]+/.exec(n.slice(i))?.[0]:void 0;if(l&&r){let p=e.createElement("span");p.className="nowrap",p.append(l,e.createTextNode(r)),t.appendChild(p),i+=r.length}else t.appendChild(l??e.createTextNode(c))}}if(i<n.length)t.appendChild(e.createTextNode(n.slice(i)))}var ue=/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)*\|?\s*$/;function ne(e,n){return/ {2,}$|\\$/.test(n)?e.createElement("br"):e.createTextNode(" ")}function oe(e){return e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map((n)=>n.trim())}function W(e,n,o){let t=e.ownerDocument,s=t.createDocumentFragment(),i=n.replace(/\r\n?/g,`
3
3
  `).split(`
4
- `),c=[],u=null,d=()=>{if(!c.length)return;let l=t.createElement("p");c.forEach((p,m)=>{if(m)l.appendChild(ne(t,c[m-1]??""));S(t,p.trim(),o,l)}),s.appendChild(l),c=[]},a=()=>{u=null};for(let l=0;l<i.length;l++){let p=i[l]??"",m=/^(\s*)```/.exec(p);if(m){d();let h=m[1]?.length??0,g=h>=2&&u?u.lastElementChild:null;if(!g)a();let y=[];for(l++;l<i.length&&!/^\s*```/.test(i[l]??"");l++){let k=i[l]??"";y.push(k.startsWith(" ".repeat(h))?k.slice(h):k.trimStart())}let E=t.createElement("pre");E.tabIndex=0;let C=t.createElement("code");C.textContent=y.join(`
5
- `),E.appendChild(C),(g??s).appendChild(E);continue}if(/^\s*([-*_])(?:\s*\1){2,}\s*$/.test(p)){d(),a(),s.appendChild(t.createElement("hr"));continue}if(p.includes("|")&&ue.test(i[l+1]??"")){d(),a();let h=[oe(p)];for(l+=2;l<i.length&&(i[l]??"").includes("|");l++)h.push(oe(i[l]??""));l--;let g=t.createElement("div");g.className="table",g.tabIndex=0;let y=t.createElement("table");h.forEach((E,C)=>{let k=t.createElement("tr");for(let T of E){let A=t.createElement(C===0?"th":"td");S(t,T,o,A),k.appendChild(A)}y.appendChild(k)}),g.appendChild(y),s.appendChild(g);continue}let f=/^\s*>\s?(.*)$/.exec(p);if(f){d(),a();let h=[f[1]??""];for(;/^\s*>/.test(i[l+1]??"");l++)h.push((i[l+1]??"").replace(/^\s*>\s?/,""));let g=t.createElement("blockquote");W(g,h.join(`
6
- `),o),s.appendChild(g);continue}let v=/^\s*(?:([-*+])|(\d+)[.)])\s+(.*)$/.exec(p);if(v){d();let h=v[1]?"ul":"ol";if(!u||u.tagName.toLowerCase()!==h){if(u=t.createElement(h),h==="ol"&&v[2]&&v[2]!=="1")u.setAttribute("start",v[2]);s.appendChild(u)}let g=t.createElement("li");S(t,(v[3]??"").trimEnd(),o,g),u.appendChild(g);continue}let w=/^\s*#{1,6}\s+(.*)$/.exec(p);if(w){d(),a();let h=t.createElement("p"),g=t.createElement("strong");S(t,w[1]??"",o,g),h.appendChild(g),s.appendChild(h);continue}if(!p.trim()){d();let h=i.slice(l+1).find((y)=>y.trim())??"",g=u?.tagName.toLowerCase()==="ol"?/^\s*\d+[.)]\s+/:/^\s*[-*+]\s+/;if(!u||!g.test(h))a();continue}if(u&&/^\s{2,}\S/.test(p)){let h=u.lastElementChild;if(h){h.appendChild(ne(t,i[l-1]??"")),S(t,p.trim(),o,h);continue}}a(),c.push(p)}d(),e.replaceChildren(s)}var he={limit:4,budgetTokens:1500};class q{options;turns=[];engine=null;storePromise=null;historyKey;key;local={status:"idle"};localListeners=new Set;constructor(e){this.options=e;this.key=e.storageKey??"murmur",this.historyKey=`${e.storageKey??"murmur"}-chat:${location.pathname.split("/")[1]??""}`;try{let n=sessionStorage.getItem(this.historyKey);if(n)this.turns=JSON.parse(n)}catch{this.turns=[]}}get configured(){return this.options.mode??"auto"}get mode(){let e=this.configured;if(this.options.model)return"custom";if(e==="proxy"||e==="auto"&&this.options.llm?.endpoint)return"proxy";if(e==="local")return"local";if(e==="key"||!this.localAllowed)return"visitor";return F(`${this.key}-local`)==="0"?"visitor":"local"}get localAllowed(){let e=this.configured;if(this.options.model||e==="proxy"||e==="key")return!1;if(e==="local")return!0;return!this.options.llm?.endpoint&&this.options.local!==!1}get keyAllowed(){let e=this.configured;if(this.options.model||e==="proxy"||e==="local")return!1;return!this.options.llm?.endpoint}get localState(){return this.local}onLocalState(e){return this.localListeners.add(e),()=>this.localListeners.delete(e)}setLocal(e){this.local=e;for(let n of this.localListeners)n(e)}async warmUp(){if(this.mode!=="local"||this.local.status!=="idle")return;if(!await this.canRunLocally())return;let{loadLocalModel:e}=await (N("f5ctpc4w"),import("./index-f5ctpc4w.js"));this.setLocal({status:"loading"});try{await e(await this.localSpec(),(n)=>this.setLocal({status:"loading",progress:n})),this.setLocal({status:"ready"})}catch{this.setLocal({status:"error"})}}async warmUpIfCached(){if(this.mode!=="local"||this.preload==="consent")return;let{isLocalModelCached:e}=await (N("f5ctpc4w"),import("./index-f5ctpc4w.js"));if(await e(await this.localSpec()))await this.warmUp()}get preload(){return this.options.preload??"question"}async settleChoice(){if(!this.localAllowed||!this.keyAllowed||F(`${this.key}-local`)!==null)return;let[{isConfigured:e},n]=await Promise.all([(N("0yvq5pe3"),import("./index-0yvq5pe3.js")),this.store()]),o=await n.load();if(o&&e(o))G(`${this.key}-local`,"0")}async localSpec(){let{local:e}=this.options;if(e&&typeof e==="object")return e;return(await (N("f5ctpc4w"),import("./index-f5ctpc4w.js"))).DEFAULT_LOCAL_MODEL}useLocal(e){G(`${this.key}-local`,e?"1":"0"),this.engine=null}get needsDownloadConsent(){return this.mode==="local"&&this.preload==="consent"&&this.local.status!=="ready"&&F(`${this.key}-local-consent`)!=="1"}agreeToDownload(){G(`${this.key}-local-consent`,"1")}persist(){try{sessionStorage.setItem(this.historyKey,JSON.stringify(this.turns.slice(-30)))}catch{}}clear(){this.turns=[],this.persist()}store(){return this.storePromise??=(N("0yvq5pe3"),import("./index-0yvq5pe3.js")).then((e)=>{let n={};if(this.options.catalogUrl)n.catalogUrl=this.options.catalogUrl;if(this.options.storageKey)n.storageKey=this.options.storageKey;return e.visitorStore(this.options.llm??{},n)}),this.storePromise}async settings(){let e=this.mode;if(e==="custom"||e==="local")return null;let n=await (N("0yvq5pe3"),import("./index-0yvq5pe3.js")),o=this.options.llm??{};if(e==="proxy")return n.proxySettings(o);return n.resolveSettings({...o,endpoint:""},await this.store())}async needsSetup(){return this.mode==="visitor"&&!await this.settings()}async canRunLocally(){return(await (N("f5ctpc4w"),import("./index-f5ctpc4w.js"))).hasWebGPU()}async loadIndex(){let{index:e}=this.options;if(e&&typeof e!=="string")return e;let{isMurmurIndex:n}=await (N("nhd6pd73"),import("./chunk-nhd6pd73.js"));if(e){let t=await fetch(new URL(e,location.href));if(!t.ok)throw Error(`murmur: index ${t.status}`);let s=await t.json();if(!n(s))throw Error("murmur: not a murmur index");return s}let{indexDocument:o}=await (N("tjxzgn54"),import("./index-tjxzgn54.js"));return o(document,location.pathname+location.search)}createEngine(){return(async()=>{let[{createMurmur:e},n]=await Promise.all([(N("krwan2e5"),import("./murmur-krwan2e5.js")),this.options.retriever??(N("3yz0vzz9"),import("./retriever-3yz0vzz9.js")).then(async(i)=>i.bm25Retriever(await this.loadIndex()))]),o=this.mode==="local",t=this.options.model??(o?async()=>{let{localModel:i}=await (N("f5ctpc4w"),import("./index-f5ctpc4w.js"));return i({spec:await this.localSpec(),onProgress:(c)=>this.setLocal({status:"loading",progress:c})})}:async()=>{let i=await this.settings();if(!i)throw new H;let{loadModel:c}=await (N("0yvq5pe3"),import("./index-0yvq5pe3.js"));return c(i)}),s={retriever:n,model:t,...o?he:{}};if(this.options.instructions)s.instructions=this.options.instructions;if(this.options.lang)s.language=this.options.lang;return e(s)})()}async ask(e,n,o){let t=this.turns.filter((i)=>!i.error).map(({role:i,content:c})=>({role:i,content:c}));this.turns.push({role:"user",content:e});let s={role:"assistant",content:""};this.turns.push(s),this.persist();try{if(this.mode==="local")this.warmUp();this.engine??=this.createEngine();let c=await(await this.engine.catch((d)=>{throw this.engine=null,d})).ask(e,{history:t,signal:o});s.passages=c.passages.map(({url:d,anchor:a,title:l,heading:p})=>({url:d,anchor:a,title:l,heading:p}));for await(let d of c.textStream)s.content+=d,n(s.content,s);let u=await c.done;if(this.mode==="local")this.setLocal({status:"ready"});s.content=u.text,s.cited=u.cited}catch(i){if(o.aborted)s.cited=[];else if(i instanceof H)throw this.turns.splice(-2,2),i;else s.error=await this.describe(i)}finally{this.persist()}return s}async describe(e){if(e instanceof Error&&e.name==="LocalModelError")return`local-${e.code??"load"}|${e.message}`;try{let{describeError:n}=await (N("0yvq5pe3"),import("./index-0yvq5pe3.js")),o=this.mode==="custom"||this.mode==="local"?null:await this.settings(),t=n(e,o?.apiKey);return`${t.code}|${t.message}`}catch{return`unknown|${e instanceof Error?e.message:String(e)}`}}}function F(e){try{return localStorage.getItem(e)}catch{return null}}function G(e,n){try{if(n===null)localStorage.removeItem(e);else localStorage.setItem(e,n)}catch{}}class H extends Error{constructor(){super("murmur: no model set up")}}var se=`
4
+ `),d=[],u=null,c=()=>{if(!d.length)return;let r=t.createElement("p");d.forEach((p,m)=>{if(m)r.appendChild(ne(t,d[m-1]??""));S(t,p.trim(),o,r)}),s.appendChild(r),d=[]},l=()=>{u=null};for(let r=0;r<i.length;r++){let p=i[r]??"",m=/^(\s*)```/.exec(p);if(m){c();let h=m[1]?.length??0,f=h>=2&&u?u.lastElementChild:null;if(!f)l();let y=[];for(r++;r<i.length&&!/^\s*```/.test(i[r]??"");r++){let k=i[r]??"";y.push(k.startsWith(" ".repeat(h))?k.slice(h):k.trimStart())}let E=t.createElement("pre");E.tabIndex=0;let C=t.createElement("code");C.textContent=y.join(`
5
+ `),E.appendChild(C),(f??s).appendChild(E);continue}if(/^\s*([-*_])(?:\s*\1){2,}\s*$/.test(p)){c(),l(),s.appendChild(t.createElement("hr"));continue}if(p.includes("|")&&ue.test(i[r+1]??"")){c(),l();let h=[oe(p)];for(r+=2;r<i.length&&(i[r]??"").includes("|");r++)h.push(oe(i[r]??""));r--;let f=t.createElement("div");f.className="table",f.tabIndex=0;let y=t.createElement("table");h.forEach((E,C)=>{let k=t.createElement("tr");for(let T of E){let A=t.createElement(C===0?"th":"td");S(t,T,o,A),k.appendChild(A)}y.appendChild(k)}),f.appendChild(y),s.appendChild(f);continue}let g=/^\s*>\s?(.*)$/.exec(p);if(g){c(),l();let h=[g[1]??""];for(;/^\s*>/.test(i[r+1]??"");r++)h.push((i[r+1]??"").replace(/^\s*>\s?/,""));let f=t.createElement("blockquote");W(f,h.join(`
6
+ `),o),s.appendChild(f);continue}let b=/^\s*(?:([-*+])|(\d+)[.)])\s+(.*)$/.exec(p);if(b){c();let h=b[1]?"ul":"ol";if(!u||u.tagName.toLowerCase()!==h){if(u=t.createElement(h),h==="ol"&&b[2]&&b[2]!=="1")u.setAttribute("start",b[2]);s.appendChild(u)}let f=t.createElement("li");S(t,(b[3]??"").trimEnd(),o,f),u.appendChild(f);continue}let w=/^\s*#{1,6}\s+(.*)$/.exec(p);if(w){c(),l();let h=t.createElement("p"),f=t.createElement("strong");S(t,w[1]??"",o,f),h.appendChild(f),s.appendChild(h);continue}if(!p.trim()){c();let h=i.slice(r+1).find((y)=>y.trim())??"",f=u?.tagName.toLowerCase()==="ol"?/^\s*\d+[.)]\s+/:/^\s*[-*+]\s+/;if(!u||!f.test(h))l();continue}if(u&&/^\s{2,}\S/.test(p)){let h=u.lastElementChild;if(h){h.appendChild(ne(t,i[r-1]??"")),S(t,p.trim(),o,h);continue}}l(),d.push(p)}c(),e.replaceChildren(s)}var he={limit:4,budgetTokens:1500};class q{options;turns=[];engine=null;storePromise=null;historyKey;key;local={status:"idle"};localListeners=new Set;constructor(e){this.options=e;this.key=e.storageKey??"murmur",this.historyKey=`${e.storageKey??"murmur"}-chat:${location.pathname.split("/")[1]??""}`;try{let n=sessionStorage.getItem(this.historyKey);if(n)this.turns=JSON.parse(n)}catch{this.turns=[]}}get configured(){return this.options.mode??"auto"}get mode(){let e=this.configured;if(this.options.model)return"custom";if(e==="proxy"||e==="auto"&&this.options.llm?.endpoint)return"proxy";if(e==="local")return"local";if(e==="key"||!this.localAllowed)return"visitor";return F(`${this.key}-local`)==="0"?"visitor":"local"}get localAllowed(){let e=this.configured;if(this.options.model||e==="proxy"||e==="key")return!1;if(e==="local")return!0;return!this.options.llm?.endpoint&&this.options.local!==!1}get keyAllowed(){let e=this.configured;if(this.options.model||e==="proxy"||e==="local")return!1;return!this.options.llm?.endpoint}get localState(){return this.local}onLocalState(e){return this.localListeners.add(e),()=>this.localListeners.delete(e)}setLocal(e){this.local=e;for(let n of this.localListeners)n(e)}async warmUp(){if(this.mode!=="local"||this.local.status!=="idle")return;if(!await this.canRunLocally())return;let{loadLocalModel:e}=await (N("xz31ft5m"),import("./index-xz31ft5m.js"));this.setLocal({status:"loading"});try{await e(await this.localSpec(),(n)=>this.setLocal({status:"loading",progress:n})),this.setLocal({status:"ready"})}catch{this.setLocal({status:"error"})}}async warmUpIfCached(){if(this.mode!=="local"||this.preload==="consent")return;let{isLocalModelCached:e}=await (N("xz31ft5m"),import("./index-xz31ft5m.js"));if(await e(await this.localSpec()))await this.warmUp()}get preload(){return this.options.preload??"question"}async settleChoice(){if(!this.localAllowed||!this.keyAllowed||F(`${this.key}-local`)!==null)return;let[{isConfigured:e},n]=await Promise.all([(N("27ae3wqx"),import("./index-27ae3wqx.js")),this.store()]),o=await n.load();if(o&&e(o))G(`${this.key}-local`,"0")}async localSpec(){let{local:e}=this.options;if(e&&typeof e==="object")return e;return(await (N("xz31ft5m"),import("./index-xz31ft5m.js"))).DEFAULT_LOCAL_MODEL}useLocal(e){G(`${this.key}-local`,e?"1":"0"),this.engine=null}get needsDownloadConsent(){return this.mode==="local"&&this.preload==="consent"&&this.local.status!=="ready"&&F(`${this.key}-local-consent`)!=="1"}agreeToDownload(){G(`${this.key}-local-consent`,"1")}persist(){try{sessionStorage.setItem(this.historyKey,JSON.stringify(this.turns.slice(-30)))}catch{}}clear(){this.turns=[],this.persist()}store(){return this.storePromise??=(N("27ae3wqx"),import("./index-27ae3wqx.js")).then((e)=>{let n={};if(this.options.catalogUrl)n.catalogUrl=this.options.catalogUrl;if(this.options.storageKey)n.storageKey=this.options.storageKey;return e.visitorStore(this.options.llm??{},n)}),this.storePromise}async settings(){let e=this.mode;if(e==="custom"||e==="local")return null;let n=await (N("27ae3wqx"),import("./index-27ae3wqx.js")),o=this.options.llm??{};if(e==="proxy")return n.proxySettings(o);return n.resolveSettings({...o,endpoint:""},await this.store())}async needsSetup(){return this.mode==="visitor"&&!await this.settings()}async canRunLocally(){return(await (N("xz31ft5m"),import("./index-xz31ft5m.js"))).hasWebGPU()}async loadIndex(){let{index:e}=this.options;if(e&&typeof e!=="string")return e;let{isMurmurIndex:n}=await (N("c0ztxsjw"),import("./chunk-c0ztxsjw.js"));if(e){let t=await fetch(new URL(e,location.href));if(!t.ok)throw Error(`murmur: index ${t.status}`);let s=await t.json();if(!n(s))throw Error("murmur: not a murmur index");return s}let{indexDocument:o}=await (N("3hkf4rah"),import("./index-3hkf4rah.js"));return o(document,location.pathname+location.search)}createEngine(){return(async()=>{let[{createMurmur:e},n]=await Promise.all([(N("s4gkmy66"),import("./murmur-s4gkmy66.js")),this.options.retriever??(N("brdwdchq"),import("./retriever-brdwdchq.js")).then(async(i)=>i.bm25Retriever(await this.loadIndex()))]),o=this.mode==="local",t=this.options.model??(o?async()=>{let{localModel:i}=await (N("xz31ft5m"),import("./index-xz31ft5m.js"));return i({spec:await this.localSpec(),onProgress:(d)=>this.setLocal({status:"loading",progress:d})})}:async()=>{let i=await this.settings();if(!i)throw new H;let{loadModel:d}=await (N("27ae3wqx"),import("./index-27ae3wqx.js"));return d(i)}),s={retriever:n,model:t,...o?he:{}};if(this.options.instructions)s.instructions=this.options.instructions;if(this.options.lang)s.language=this.options.lang;return e(s)})()}async ask(e,n,o){let t=this.turns.filter((i)=>!i.error).map(({role:i,content:d})=>({role:i,content:d}));this.turns.push({role:"user",content:e});let s={role:"assistant",content:""};this.turns.push(s),this.persist();try{if(this.mode==="local")this.warmUp();this.engine??=this.createEngine();let d=await(await this.engine.catch((c)=>{throw this.engine=null,c})).ask(e,{history:t,signal:o});s.passages=d.passages.map(({url:c,anchor:l,title:r,heading:p})=>({url:c,anchor:l,title:r,heading:p}));for await(let c of d.textStream)s.content+=c,n(s.content,s);let u=await d.done;if(this.mode==="local")this.setLocal({status:"ready"});s.content=u.text,s.cited=u.cited}catch(i){if(o.aborted)s.cited=[];else if(i instanceof H)throw this.turns.splice(-2,2),i;else s.error=await this.describe(i)}finally{this.persist()}return s}async describe(e){if(e instanceof Error&&e.name==="LocalModelError")return`local-${e.code??"load"}|${e.message}`;try{let{describeError:n}=await (N("27ae3wqx"),import("./index-27ae3wqx.js")),o=this.mode==="custom"||this.mode==="local"?null:await this.settings(),t=n(e,o?.apiKey);return`${t.code}|${t.message}`}catch{return`unknown|${e instanceof Error?e.message:String(e)}`}}}function F(e){try{return localStorage.getItem(e)}catch{return null}}function G(e,n){try{if(n===null)localStorage.removeItem(e);else localStorage.setItem(e,n)}catch{}}class H extends Error{constructor(){super("murmur: no model set up")}}var se=`
7
7
  :host {
8
8
  --accent: var(--murmur-accent, #211c17);
9
9
  --accent-ink: var(--murmur-accent-ink, #f6efe0);
@@ -221,4 +221,4 @@ progress::-moz-progress-bar { background: var(--lamp); }
221
221
  @media (prefers-reduced-motion: reduce) {
222
222
  *, .panel { animation: none !important; transition: none !important; }
223
223
  }
224
- `;var me={auth:"errorAuth","auth-or-network":"errorNetwork","rate-limit":"errorRate",overloaded:"errorRate","local-webgpu":"localNoWebGPU","local-load":"localLoadFailed"};function V(e,n,o){if(e>=1000)return`${(e/1000).toLocaleString(n,{maximumFractionDigits:1})} ${o.gigabytes}`;return`${Math.round(e).toLocaleString(n)} ${o.megabytes}`}var ge=typeof HTMLElement>"u"?class{}:HTMLElement;class Y extends ge{options={};session=null;t=B("en");uiLang="en";root;launcher;panel;log;chatView;setupView;input;sendBtn;settingsBtn;controller=null;built=!1;unsubscribe=null;unsubscribeLocal=null;loadbar;constructor(){super();this.root=this.attachShadow({mode:"open"})}configure(e){if(this.options={...this.options,...e},this.isConnected)this.build();return this}get isOpen(){return this.hasAttribute("inline")||this.launcher?.getAttribute("aria-expanded")==="true"}connectedCallback(){this.build()}disconnectedCallback(){this.controller?.abort(),this.unsubscribe?.(),this.unsubscribeLocal?.(),this.unsubscribeLocal?.()}async open(){if(!this.built)this.build();if(this.launcher.setAttribute("aria-expanded","true"),this.panel.hidden=!1,this.session?.preload==="open")this.session.warmUp();this.session?.persist(),j("set",this.openKey),this.input.focus()}close(){if(this.hasAttribute("inline"))return;this.launcher.setAttribute("aria-expanded","false"),this.panel.hidden=!0,j("remove",this.openKey),this.launcher.focus()}async ask(e){if(!this.isOpen)await this.open();this.input.value=e,await this.submit()}get openKey(){return`${this.options.storageKey??"murmur"}-open`}build(){let e=this.options,n=te(e.lang,document.documentElement.lang,navigator.language);this.uiLang=n;let o={...e.messages};if(this.t=B(n,o),e.position)this.setAttribute("position",e.position);if(e.theme&&e.theme!=="auto")this.setAttribute("theme",e.theme);if(e.accent)this.style.setProperty("--murmur-accent",e.accent);this.controller?.abort(),this.unsubscribe?.();let t=this.ownerDocument,s=t.createElement("style");s.textContent=se,this.launcher=r(t,"button",{class:"launcher",type:"button","aria-expanded":"false"}),this.launcher.setAttribute("aria-controls","murmur-panel"),this.launcher.append(r(t,"span",{class:"lamp","aria-hidden":"true"}),x(t,"span",this.t.open)),this.launcher.addEventListener("click",()=>void this.open()),this.panel=r(t,"section",{class:"panel",id:"murmur-panel",role:"dialog"}),this.panel.setAttribute("aria-label",this.t.title),this.panel.hidden=!this.hasAttribute("inline"),this.panel.addEventListener("keydown",(f)=>{if(f.key==="Escape")this.close()});let i=r(t,"header"),c=x(t,"h2",this.t.title),u=_(t,"reset",this.t.newChat);u.addEventListener("click",()=>{this.controller?.abort(),this.session?.clear(),this.renderChat(),this.input.focus()}),this.settingsBtn=_(t,"settings",this.t.settings),this.settingsBtn.hidden=!!e.model||!!e.llm?.endpoint,this.settingsBtn.addEventListener("click",()=>void this.showSetup());let d=_(t,"close",this.t.close);d.hidden=this.hasAttribute("inline"),d.addEventListener("click",()=>this.close()),i.append(c,u,this.settingsBtn,d),this.chatView=r(t,"div",{class:"chat"}),this.chatView.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0",this.log=r(t,"div",{class:"log",role:"log","aria-live":"polite","aria-relevant":"additions"});let a=r(t,"form",{class:"composer"});this.input=r(t,"textarea",{rows:"1",placeholder:this.t.placeholder}),this.input.setAttribute("aria-label",this.t.placeholder),this.input.addEventListener("input",()=>this.autosize()),this.input.addEventListener("keydown",(f)=>{if(f.key==="Enter"&&!f.shiftKey&&!f.isComposing)f.preventDefault(),this.submit()}),this.sendBtn=r(t,"button",{class:"send",type:"submit"}),this.setSendMode("send"),a.addEventListener("submit",(f)=>{if(f.preventDefault(),this.controller)this.controller.abort();else this.submit()}),a.append(this.input,this.sendBtn),this.loadbar=r(t,"div",{class:"loadbar",role:"status"}),this.loadbar.hidden=!0;let l=r(t,"footer"),p=r(t,"a",{href:"https://maxgfr.github.io/murmur/",target:"_blank",rel:"noopener"});if(p.textContent=this.t.poweredBy,l.append(p),this.chatView.append(this.log,this.loadbar,a,l),this.setupView=r(t,"div",{class:"setup"}),this.setupView.hidden=!0,this.panel.append(i,this.chatView,this.setupView),this.root.replaceChildren(s,this.launcher,this.panel),this.hasAttribute("inline"))this.launcher.hidden=!0;this.built=!0;let m=new q({...e,lang:n});if(this.session=m,this.settingsBtn.hidden=!m.keyAllowed,this.unsubscribeLocal=m.onLocalState((f)=>this.drawLocal(f)),ve(()=>{if(m.preload==="idle")m.warmUp();else m.warmUpIfCached()}),this.renderChat(),e.open||!this.hasAttribute("inline")&&j("get",this.openKey))this.open()}drawLocal(e){let n=this.ownerDocument;if(this.launcher.querySelector(".lamp")?.classList.toggle("busy",e.status==="loading"),e.status!=="loading"){this.loadbar.hidden=!0;return}let t=e.progress,s=!t?this.t.localLoading:t.progress>=1?this.t.localPreparing:`${this.t.localLoading} ${Math.round(t.progress*100)} % · ${Math.round(t.loaded/1e6).toLocaleString(this.uiLang)} / ${V(t.total/1e6,this.uiLang,this.t)}`,i=r(n,"progress",{max:"1"});if(t&&t.progress<1)i.setAttribute("value",String(t.progress));i.setAttribute("aria-label",this.t.localLoadingLabel),this.loadbar.replaceChildren(x(n,"span",s),i),this.loadbar.hidden=!1}autosize(){this.input.style.height="auto",this.input.style.height=`${Math.min(this.input.scrollHeight,140)}px`}setSendMode(e){this.sendBtn.replaceChildren(U(this.ownerDocument,e)),this.sendBtn.setAttribute("aria-label",e==="send"?this.t.send:this.t.stop)}emit(e){this.dispatchEvent(new CustomEvent("murmur:state",{detail:e,bubbles:!0,composed:!0}))}renderChat(){let e=this.ownerDocument,n=this.session?.turns??[],o=[],t=r(e,"div",{class:"msg bot greeting"});t.append(x(e,"p",this.t.greeting)),o.push(t);for(let s of n)o.push(this.turnNode(s));this.log.replaceChildren(...o),this.log.scrollTop=this.log.scrollHeight}turnNode(e){let n=this.ownerDocument;if(e.role==="user"){let t=r(n,"div",{class:"msg user"});return t.textContent=e.content,t}let o=r(n,"div",{class:"msg bot"});return this.fillAnswer(o,e,!0),o}fillAnswer(e,n,o){let t=this.ownerDocument;if(n.error){let[p="unknown",...m]=n.error.split("|"),f=me[p],v=r(t,"div",{class:"error",role:"alert"});v.append(x(t,"p",f?this.t[f]:`${this.t.errorOther} ${m.join("|")}`));let w=r(t,"div",{class:"row"}),h=r(t,"button",{class:"text-btn",type:"button"});if(h.textContent=this.t.retry,h.addEventListener("click",()=>{let g=this.session?.turns??[],y=g.at(-2)?.content??"";if(g.splice(-2,2),this.renderChat(),y)this.ask(y)}),w.append(h),p==="auth"||p==="auth-or-network"){if(!this.settingsBtn.hidden){let g=r(t,"button",{class:"text-btn",type:"button"});g.textContent=this.t.settings,g.addEventListener("click",()=>void this.showSetup()),w.append(g)}}v.append(w),e.replaceChildren(v);return}let s=n.passages??[],i=Xe(n.content),c=et(i,s.length),u=(p)=>c.indexOf(p)+1,d=r(t,"div");W(d,i,(p)=>{let m=s[p-1];if(!m||!u(p))return null;let f=r(t,"a",{class:"cite",href:Ot(m)});return f.textContent=String(u(p)),f.setAttribute("aria-label",`${this.t.sources} ${u(p)}: ${m.title}`),f});let a=[d];if(o&&!n.content.trim()&&!s.length){let p=r(t,"p",{class:"status"});p.append(r(t,"span",{class:"lamp off","aria-hidden":"true"}),t.createTextNode(this.t.notFound)),a.push(p)}let l=c;if(o&&l.length){a.push(x(t,"p",this.t.sources,"sources-label"));let p=r(t,"ol",{class:"sources"});for(let m of l){let f=s[m-1];if(!f)continue;let v=r(t,"li"),w=r(t,"a",{href:Ot(f)}),h=x(t,"span",String(u(m)),"cite");h.setAttribute("aria-hidden","true");let g=r(t,"span",{class:"where"});if(g.append(t.createTextNode(f.title||f.url)),f.heading&&f.heading!==f.title)g.append(x(t,"span",` › ${f.heading}`));w.append(h,g),v.append(w),p.append(v)}a.push(p)}e.replaceChildren(...a)}async submit(){let e=this.input.value.trim();if(!e||this.controller||!this.session)return;if(await this.session.settleChoice(),this.session.needsDownloadConsent||this.session.mode==="local"&&!await this.session.canRunLocally()){await this.showConsent(e);return}if(await this.session.needsSetup()){await this.showSetup(e);return}let n=this.ownerDocument;this.input.value="",this.autosize(),this.log.append(this.turnNode({role:"user",content:e}));let o=r(n,"div",{class:"msg bot"}),t=r(n,"p",{class:"status"});t.append(r(n,"span",{class:"lamp busy","aria-hidden":"true"}),n.createTextNode(this.t.thinking)),o.append(t),this.log.append(o),this.log.scrollTop=this.log.scrollHeight,this.log.setAttribute("aria-busy","true");let s=new AbortController;this.controller=s,this.setSendMode("stop"),this.emit({state:"searching"});let i=!1;try{let c=await this.session.ask(e,(u,d)=>{if(!i)i=!0,this.emit({state:"streaming",passages:d.passages??[]});let a=this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<40;if(this.fillAnswer(o,d,!1),a)this.log.scrollTop=this.log.scrollHeight},s.signal);this.fillAnswer(o,c,!0),this.emit(c.error?{state:"error"}:{state:"done",passages:c.passages??[],cited:c.cited??[]})}catch(c){if(o.remove(),this.log.lastElementChild?.remove(),this.emit({state:"idle"}),c instanceof H)await this.showSetup(e);else throw c}finally{this.controller=null,this.setSendMode("send"),this.log.setAttribute("aria-busy","false"),this.log.scrollTop=this.log.scrollHeight}}async showConsent(e){if(!this.session)return;let n=this.ownerDocument,o=this.t,t=this.session,s=await t.localSpec(),i=r(n,"div",{class:"msg bot consent"}),c=r(n,"div",{class:"row"}),u=()=>{i.remove(),t.useLocal(!1),this.showSetup(e)};if(!await t.canRunLocally()){if(i.append(x(n,"p",t.keyAllowed?o.localNoWebGPU:o.localNoWebGPUOnly)),t.keyAllowed){let d=r(n,"button",{class:"primary",type:"button"});d.textContent=o.useKey,d.addEventListener("click",u),c.append(d)}}else{i.append(x(n,"p",o.localConsent.replace("{name}",s.name).replace("{size}",V(s.sizeMB,this.uiLang,o))));let d=r(n,"button",{class:"primary",type:"button"});if(d.textContent=o.localDownload,d.addEventListener("click",()=>{t.agreeToDownload(),i.remove(),this.input.value=e,this.submit()}),c.append(d),t.keyAllowed){let a=r(n,"button",{class:"link-btn",type:"button"});a.textContent=o.useKey,a.addEventListener("click",u),c.append(a)}}i.append(c),this.log.append(i),this.log.scrollTop=this.log.scrollHeight,c.querySelector("button")?.focus()}async showSetup(e){if(!this.session)return;let n=this.ownerDocument,o=await this.session.store();await o.load(),o.open(),this.chatView.hidden=!0,this.setupView.hidden=!1;let t=this.t,s=r(n,"button",{class:"link-btn",type:"button"});s.textContent=t.back,s.addEventListener("click",()=>this.hideSetup());let i=x(n,"h3",t.setupTitle);i.style.cssText="margin:0;font-size:17px;font-weight:650";let c=x(n,"p",t.setupIntro,"intro"),u=this.session,d=await u.localSpec(),a=r(n,"div",{class:"local-choice"}),l=r(n,"button",{class:"primary",type:"button"});l.textContent=t.localOption;let p=x(n,"small",t.localOptionHint.replace("{name}",d.name).replace("{size}",V(d.sizeMB,this.uiLang,t)));a.append(l,p),l.addEventListener("click",()=>{if(u.useLocal(!0),this.hideSetup(),e)this.input.value=e,this.submit()});let m=r(n,"button",{class:"link-btn",type:"button"});if(m.textContent=t.useKey,m.addEventListener("click",()=>{u.useLocal(!1),l.textContent=t.localOption,l.disabled=!1,m.remove()}),u.mode==="local")l.textContent=t.localActive,l.disabled=!0,a.append(m);u.canRunLocally().then((b)=>{if(b)return;l.textContent=t.localOption,l.disabled=!0,p.textContent=t.localNoWebGPU,m.remove()});let f=x(n,"p",t.orKey,"or");a.hidden=f.hidden=!u.localAllowed;let v=ie(n,t.local),w=I(n,t.provider,r(n,"select")),h=w.control,g=I(n,t.model,r(n,"select")),y=g.control,E=I(n,t.endpoint,r(n,"input",{type:"url",inputmode:"url"}),t.localHint),C=E.control,k=I(n,t.model,r(n,"input",{type:"text",autocomplete:"off"})),T=k.control,A=r(n,"div",{class:"presets"});for(let b of["ollama","lmstudio"]){let L=r(n,"button",{class:"text-btn",type:"button"});L.textContent=b==="ollama"?"Ollama":"LM Studio",L.addEventListener("click",async()=>{let{ENDPOINT_PRESETS:M}=await (N("arpy64fv"),import("./index-arpy64fv.js"));o.applyPreset(M[b])}),A.append(L)}let Z=I(n,t.apiKey,r(n,"input",{type:"password",autocomplete:"off",spellcheck:"false"}),t.apiKeyHint),O=Z.control,R=ie(n,t.remember),P=r(n,"button",{class:"text-btn",type:"button"});P.textContent=t.test;let z=r(n,"p",{class:"result",role:"status"});z.style.margin="0";let K=r(n,"button",{class:"primary",type:"button"});K.textContent=t.save;let D=r(n,"button",{class:"link-btn",type:"button"});D.textContent=t.forget,v.input.addEventListener("change",()=>o.toggleCustom(v.input.checked)),h.addEventListener("change",()=>o.selectProvider(h.value)),y.addEventListener("change",()=>o.selectModel(y.value)),C.addEventListener("input",()=>o.setEndpoint(C.value)),T.addEventListener("input",()=>o.setCustomModel(T.value)),O.addEventListener("input",()=>o.setApiKey(O.value)),R.input.addEventListener("change",()=>o.setRememberKey(R.input.checked)),P.addEventListener("click",()=>void o.test()),K.addEventListener("click",async()=>{if(!(await o.save()).ok)return;if(u.useLocal(!1),this.hideSetup(),e)this.input.value=e,this.submit()}),D.addEventListener("click",()=>void o.clear());let Q=r(n,"div",{class:"row"});Q.append(P,z),this.setupView.replaceChildren(s,i,c,a,f,v.label,w.label,g.label,A,E.label,k.label,Z.label,R.label,Q,K,D);let le=(b)=>{let L=b.draft.custom;if(v.input.checked=L,w.label.hidden=L,g.label.hidden=L,A.hidden=!L,E.label.hidden=!L,k.label.hidden=!L,b.catalogStatus==="ready")fe(n,h,b,t),be(n,y,b);else h.replaceChildren(J(n,"",b.catalogStatus==="error"?t.catalogError:t.loadingCatalog)),y.replaceChildren();if(C!==this.root.activeElement)C.value=b.draft.customEndpoint;if(T!==this.root.activeElement)T.value=b.draft.customModel;if(O!==this.root.activeElement)O.value=b.apiKey;R.input.checked=b.draft.rememberKey,P.disabled=!b.canTest||b.testing,P.textContent=b.testing?t.testing:t.test,K.disabled=!b.canSave;let M=b.testResult;z.className=M?M.ok?"result ok":"result fail":"result",z.textContent=!M?"":M.ok?t.testOk:`${t.testFail} ${M.reason}${M.message?` (${M.message})`:""}`};this.unsubscribe?.(),this.unsubscribe=o.subscribe(le),this.setupView.scrollTop=0,s.focus()}hideSetup(){this.unsubscribe?.(),this.unsubscribe=null,this.setupView.hidden=!0,this.chatView.hidden=!1,this.input.focus()}}function fe(e,n,o,t){let s=[[t.recommended,o.providers.recommended],[t.otherProviders,o.providers.others]],i=`${o.draft.providerId}|${o.providers.recommended.length+o.providers.others.length}`;if(n.dataset.sig===i)return;n.dataset.sig=i,n.replaceChildren(...s.filter(([,c])=>c.length).map(([c,u])=>{let d=e.createElement("optgroup");return d.label=c,d.append(...u.map((a)=>J(e,a.id,a.name))),d})),n.value=o.draft.providerId}function be(e,n,o){let t=`${o.draft.providerId}|${o.draft.model}|${o.models.length}`;if(n.dataset.sig===t)return;n.dataset.sig=t;let s=o.recommendedModel?.id;n.replaceChildren(...o.models.map((i)=>J(e,i.id,i.id===s?`${i.name} ★`:i.name))),n.value=o.draft.model}function j(e,n){try{if(e==="set")sessionStorage.setItem(n,"1");else if(e==="remove")sessionStorage.removeItem(n);else return sessionStorage.getItem(n)!==null}catch{}return!1}function ve(e){let n=globalThis.requestIdleCallback;if(n)n(e,{timeout:4000});else setTimeout(e,1500)}function r(e,n,o={}){let t=e.createElement(n);for(let[s,i]of Object.entries(o))t.setAttribute(s,i);return t}function x(e,n,o,t){let s=e.createElement(n);if(s.textContent=o,t)s.className=t;return s}function J(e,n,o){let t=e.createElement("option");return t.value=n,t.textContent=o,t}function _(e,n,o){let t=r(e,"button",{class:"icon-btn",type:"button",title:o});return t.setAttribute("aria-label",o),t.append(U(e,n)),t}function I(e,n,o,t){let s=r(e,"label",{class:"field"});if(s.append(x(e,"span",n),o),t)s.append(x(e,"small",t));return{label:s,control:o}}function ie(e,n){let o=r(e,"label",{class:"check"}),t=r(e,"input",{type:"checkbox"});return o.append(t,e.createTextNode(n)),{label:o,input:t}}function xe(e="murmur-chat"){if(!customElements.get(e))customElements.define(e,class extends Y{});return customElements.get(e)}function re(e={}){xe();let{target:n,inline:o,...t}=e,s=document.createElement("murmur-chat");if(o)s.setAttribute("inline","");return s.configure(t),(n??document.body).append(s),s}function ye(e,n){let o={};if(e.index)o.index=new URL(e.index,n).href;let t={};if(e.provider)t.provider=e.provider;if(e.model)t.model=e.model;if(e.endpoint)t.endpoint=e.endpoint;if(e.apiKey&&typeof console<"u")console.error('murmur: data-api-key is ignored: a key in the page can be read by anyone. Keep it in a Worker (data-endpoint), run the model in the browser (data-mode="local"), or let visitors use their own key.');if(Object.keys(t).length)o.llm=t;if(e.instructions)o.instructions=e.instructions;if(e.lang)o.lang=e.lang;let s={};if(e.title)s.title=e.title;if(e.greeting)s.greeting=e.greeting;if(e.placeholder)s.placeholder=e.placeholder;if(e.button)s.open=e.button;if(Object.keys(s).length)o.messages=s;if(e.position==="bottom-left"||e.position==="bottom-right")o.position=e.position;if(e.theme==="light"||e.theme==="dark"||e.theme==="auto")o.theme=e.theme;if(e.accent)o.accent=e.accent;if(e.catalog)o.catalogUrl=new URL(e.catalog,n).href;if(e.storageKey)o.storageKey=e.storageKey;if(e.open==="true")o.open=!0;if(e.local==="false")o.local=!1;if(e.mode==="auto"||e.mode==="proxy"||e.mode==="local"||e.mode==="key")o.mode=e.mode;if(e.preload==="question"||e.preload==="open"||e.preload==="idle"||e.preload==="consent")o.preload=e.preload;return o}function ae(){let e=import.meta.url,n=[...document.querySelectorAll("script[src]")].find((t)=>t.src===e&&!t.dataset.murmurReady);if(n)n.dataset.murmurReady="true";let o=ye(n?.dataset??{},location.href);o.catalogUrl??=new URL("./models.json",e).href,re(o)}if(typeof document<"u"&&!document.querySelector("murmur-chat:not([inline])"))if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",ae,{once:!0});else ae();export{ye as optionsFromDataset};
224
+ `;var me={auth:"errorAuth","auth-or-network":"errorNetwork","rate-limit":"errorRate",overloaded:"errorRate","local-webgpu":"localNoWebGPU","local-load":"localLoadFailed"};function V(e,n,o){if(e>=1000)return`${(e/1000).toLocaleString(n,{maximumFractionDigits:1})} ${o.gigabytes}`;return`${Math.round(e).toLocaleString(n)} ${o.megabytes}`}var ge=typeof HTMLElement>"u"?class{}:HTMLElement;class Y extends ge{options={};session=null;t=B("en");uiLang="en";root;launcher;panel;log;chatView;setupView;input;sendBtn;settingsBtn;controller=null;built=!1;unsubscribe=null;unsubscribeLocal=null;loadbar;constructor(){super();this.root=this.attachShadow({mode:"open"})}configure(e){if(this.options={...this.options,...e},this.isConnected)this.build();return this}get isOpen(){return this.hasAttribute("inline")||this.launcher?.getAttribute("aria-expanded")==="true"}connectedCallback(){this.build()}disconnectedCallback(){this.controller?.abort(),this.unsubscribe?.(),this.unsubscribeLocal?.()}async open(){if(!this.built)this.build();if(this.launcher.setAttribute("aria-expanded","true"),this.panel.hidden=!1,this.session?.preload==="open")this.session.warmUp();this.session?.persist(),j("set",this.openKey),this.input.focus()}close(){if(this.hasAttribute("inline"))return;this.launcher.setAttribute("aria-expanded","false"),this.panel.hidden=!0,j("remove",this.openKey),this.launcher.focus()}async ask(e){if(!this.isOpen)await this.open();this.input.value=e,await this.submit()}get openKey(){return`${this.options.storageKey??"murmur"}-open`}build(){let e=this.options,n=te(e.lang,document.documentElement.lang,navigator.language);this.uiLang=n;let o={...e.messages};if(this.t=B(n,o),e.position)this.setAttribute("position",e.position);if(e.theme&&e.theme!=="auto")this.setAttribute("theme",e.theme);if(e.accent)this.style.setProperty("--murmur-accent",e.accent);this.controller?.abort(),this.unsubscribe?.(),this.unsubscribeLocal?.();let t=this.ownerDocument,s=t.createElement("style");s.textContent=se,this.launcher=a(t,"button",{class:"launcher",type:"button","aria-expanded":"false"}),this.launcher.setAttribute("aria-controls","murmur-panel"),this.launcher.append(a(t,"span",{class:"lamp","aria-hidden":"true"}),x(t,"span",this.t.open)),this.launcher.addEventListener("click",()=>void this.open()),this.panel=a(t,"section",{class:"panel",id:"murmur-panel",role:"dialog"}),this.panel.setAttribute("aria-label",this.t.title),this.panel.hidden=!this.hasAttribute("inline"),this.panel.addEventListener("keydown",(g)=>{if(g.key==="Escape")this.close()});let i=a(t,"header"),d=x(t,"h2",this.t.title),u=_(t,"reset",this.t.newChat);u.addEventListener("click",()=>{this.controller?.abort(),this.session?.clear(),this.renderChat(),this.input.focus()}),this.settingsBtn=_(t,"settings",this.t.settings),this.settingsBtn.hidden=!!e.model||!!e.llm?.endpoint,this.settingsBtn.addEventListener("click",()=>void this.showSetup());let c=_(t,"close",this.t.close);c.hidden=this.hasAttribute("inline"),c.addEventListener("click",()=>this.close()),i.append(d,u,this.settingsBtn,c),this.chatView=a(t,"div",{class:"chat"}),this.chatView.style.cssText="display:flex;flex-direction:column;flex:1;min-height:0",this.log=a(t,"div",{class:"log",role:"log","aria-live":"polite","aria-relevant":"additions"});let l=a(t,"form",{class:"composer"});this.input=a(t,"textarea",{rows:"1",placeholder:this.t.placeholder}),this.input.setAttribute("aria-label",this.t.placeholder),this.input.addEventListener("input",()=>this.autosize()),this.input.addEventListener("keydown",(g)=>{if(g.key==="Enter"&&!g.shiftKey&&!g.isComposing)g.preventDefault(),this.submit()}),this.sendBtn=a(t,"button",{class:"send",type:"submit"}),this.setSendMode("send"),l.addEventListener("submit",(g)=>{if(g.preventDefault(),this.controller)this.controller.abort();else this.submit()}),l.append(this.input,this.sendBtn),this.loadbar=a(t,"div",{class:"loadbar",role:"status"}),this.loadbar.hidden=!0;let r=a(t,"footer"),p=a(t,"a",{href:"https://maxgfr.github.io/murmur/",target:"_blank",rel:"noopener"});if(p.textContent=this.t.poweredBy,r.append(p),this.chatView.append(this.log,this.loadbar,l,r),this.setupView=a(t,"div",{class:"setup"}),this.setupView.hidden=!0,this.panel.append(i,this.chatView,this.setupView),this.root.replaceChildren(s,this.launcher,this.panel),this.hasAttribute("inline"))this.launcher.hidden=!0;this.built=!0;let m=new q({...e,lang:n});if(this.session=m,this.settingsBtn.hidden=!m.keyAllowed,this.unsubscribeLocal=m.onLocalState((g)=>this.drawLocal(g)),ve(()=>{if(m.preload==="idle")m.warmUp();else m.warmUpIfCached()}),this.renderChat(),e.open||!this.hasAttribute("inline")&&j("get",this.openKey))this.open()}drawLocal(e){let n=this.ownerDocument;if(this.launcher.querySelector(".lamp")?.classList.toggle("busy",e.status==="loading"),e.status!=="loading"){this.loadbar.hidden=!0;return}let t=e.progress,s=!t?this.t.localLoading:t.progress>=1?this.t.localPreparing:`${this.t.localLoading} ${Math.round(t.progress*100)} % · ${Math.round(t.loaded/1e6).toLocaleString(this.uiLang)} / ${V(t.total/1e6,this.uiLang,this.t)}`,i=a(n,"progress",{max:"1"});if(t&&t.progress<1)i.setAttribute("value",String(t.progress));i.setAttribute("aria-label",this.t.localLoadingLabel),this.loadbar.replaceChildren(x(n,"span",s),i),this.loadbar.hidden=!1}autosize(){this.input.style.height="auto",this.input.style.height=`${Math.min(this.input.scrollHeight,140)}px`}setSendMode(e){this.sendBtn.replaceChildren(U(this.ownerDocument,e)),this.sendBtn.setAttribute("aria-label",e==="send"?this.t.send:this.t.stop)}emit(e){this.dispatchEvent(new CustomEvent("murmur:state",{detail:e,bubbles:!0,composed:!0}))}renderChat(){let e=this.ownerDocument,n=this.session?.turns??[],o=[],t=a(e,"div",{class:"msg bot greeting"});t.append(x(e,"p",this.t.greeting)),o.push(t);for(let s of n)o.push(this.turnNode(s));this.log.replaceChildren(...o),this.log.scrollTop=this.log.scrollHeight}turnNode(e){let n=this.ownerDocument;if(e.role==="user"){let t=a(n,"div",{class:"msg user"});return t.textContent=e.content,t}let o=a(n,"div",{class:"msg bot"});return this.fillAnswer(o,e,!0),o}fillAnswer(e,n,o){let t=this.ownerDocument;if(n.error){let[r="unknown",...p]=n.error.split("|"),m=me[r],g=a(t,"div",{class:"error",role:"alert"});g.append(x(t,"p",m?this.t[m]:`${this.t.errorOther} ${p.join("|")}`));let b=a(t,"div",{class:"row"}),w=a(t,"button",{class:"text-btn",type:"button"});if(w.textContent=this.t.retry,w.addEventListener("click",()=>{if(this.controller||!this.session)return;let h=this.session.turns,f=h.indexOf(n);if(f<1)return;let y=h[f-1]?.content??"";if(h.splice(f-1,2),this.session.persist(),this.renderChat(),y)this.ask(y)}),b.append(w),r==="auth"||r==="auth-or-network"){if(!this.settingsBtn.hidden){let h=a(t,"button",{class:"text-btn",type:"button"});h.textContent=this.t.settings,h.addEventListener("click",()=>void this.showSetup()),b.append(h)}}g.append(b),e.replaceChildren(g);return}let s=n.passages??[],i=(r)=>{let p=s[r-1];return p?Ot(p):""},d=et(Xe(n.content),s.length).replace(/(?:\[\d{1,2}\]){2,}/g,(r)=>{let p=new Set;return r.replace(/\[(\d{1,2})\]/g,(m,g)=>{let b=i(Number(g));if(p.has(b))return"";return p.add(b),m})}),u=new Map,c=a(t,"div");W(c,d,(r)=>{let p=s[r-1];if(!p)return null;let m=Ot(p),g=u.get(m);if(!g)g={label:u.size+1,passage:p},u.set(m,g);let b=a(t,"a",{class:"cite",href:m});return b.textContent=String(g.label),b.setAttribute("aria-label",`${this.t.sources} ${g.label}: ${p.title}`),b});let l=[c];if(o&&!n.content.trim()&&!s.length){let r=a(t,"p",{class:"status"});r.append(a(t,"span",{class:"lamp off","aria-hidden":"true"}),t.createTextNode(this.t.notFound)),l.push(r)}if(o&&u.size){l.push(x(t,"p",this.t.sources,"sources-label"));let r=a(t,"ol",{class:"sources"});for(let[p,{label:m,passage:g}]of u){let b=a(t,"li"),w=a(t,"a",{href:p}),h=x(t,"span",String(m),"cite");h.setAttribute("aria-hidden","true");let f=a(t,"span",{class:"where"});if(f.append(t.createTextNode(g.title||g.url)),g.heading&&g.heading!==g.title)f.append(x(t,"span",` › ${g.heading}`));w.append(h,f),b.append(w),r.append(b)}l.push(r)}e.replaceChildren(...l)}async submit(){let e=this.input.value.trim();if(!e||this.controller||!this.session)return;if(await this.session.settleChoice(),this.session.needsDownloadConsent||this.session.mode==="local"&&!await this.session.canRunLocally()){await this.showConsent(e);return}if(await this.session.needsSetup()){await this.showSetup(e);return}let n=this.ownerDocument;this.input.value="",this.autosize(),this.log.append(this.turnNode({role:"user",content:e}));let o=a(n,"div",{class:"msg bot"}),t=a(n,"p",{class:"status"});t.append(a(n,"span",{class:"lamp busy","aria-hidden":"true"}),n.createTextNode(this.t.thinking)),o.append(t),this.log.append(o),this.log.scrollTop=this.log.scrollHeight,this.log.setAttribute("aria-busy","true");let s=new AbortController;this.controller=s,this.setSendMode("stop"),this.emit({state:"searching"});let i=!1;try{let d=await this.session.ask(e,(u,c)=>{if(!i)i=!0,this.emit({state:"streaming",passages:c.passages??[]});let l=this.log.scrollHeight-this.log.scrollTop-this.log.clientHeight<40;if(this.fillAnswer(o,c,!1),l)this.log.scrollTop=this.log.scrollHeight},s.signal);this.fillAnswer(o,d,!0),this.emit(d.error?{state:"error"}:{state:"done",passages:d.passages??[],cited:d.cited??[]})}catch(d){if(o.remove(),this.log.lastElementChild?.remove(),this.emit({state:"idle"}),d instanceof H)await this.showSetup(e);else throw d}finally{this.controller=null,this.setSendMode("send"),this.log.setAttribute("aria-busy","false"),this.log.scrollTop=this.log.scrollHeight}}async showConsent(e){if(!this.session)return;let n=this.ownerDocument,o=this.t,t=this.session,s=await t.localSpec(),i=a(n,"div",{class:"msg bot consent"}),d=a(n,"div",{class:"row"}),u=()=>{i.remove(),t.useLocal(!1),this.showSetup(e)};if(!await t.canRunLocally()){if(i.append(x(n,"p",t.keyAllowed?o.localNoWebGPU:o.localNoWebGPUOnly)),t.keyAllowed){let c=a(n,"button",{class:"primary",type:"button"});c.textContent=o.useKey,c.addEventListener("click",u),d.append(c)}}else{i.append(x(n,"p",o.localConsent.replace("{name}",s.name).replace("{size}",V(s.sizeMB,this.uiLang,o))));let c=a(n,"button",{class:"primary",type:"button"});if(c.textContent=o.localDownload,c.addEventListener("click",()=>{t.agreeToDownload(),i.remove(),this.input.value=e,this.submit()}),d.append(c),t.keyAllowed){let l=a(n,"button",{class:"link-btn",type:"button"});l.textContent=o.useKey,l.addEventListener("click",u),d.append(l)}}i.append(d),this.log.append(i),this.log.scrollTop=this.log.scrollHeight,d.querySelector("button")?.focus()}async showSetup(e){if(!this.session)return;let n=this.ownerDocument,o=await this.session.store();await o.load(),o.open(),this.chatView.hidden=!0,this.setupView.hidden=!1;let t=this.t,s=a(n,"button",{class:"link-btn",type:"button"});s.textContent=t.back,s.addEventListener("click",()=>this.hideSetup());let i=x(n,"h3",t.setupTitle);i.style.cssText="margin:0;font-size:17px;font-weight:650";let d=x(n,"p",t.setupIntro,"intro"),u=this.session,c=await u.localSpec(),l=a(n,"div",{class:"local-choice"}),r=a(n,"button",{class:"primary",type:"button"});r.textContent=t.localOption;let p=x(n,"small",t.localOptionHint.replace("{name}",c.name).replace("{size}",V(c.sizeMB,this.uiLang,t)));l.append(r,p),r.addEventListener("click",()=>{if(u.useLocal(!0),this.hideSetup(),e)this.input.value=e,this.submit()});let m=a(n,"button",{class:"link-btn",type:"button"});if(m.textContent=t.useKey,m.addEventListener("click",()=>{u.useLocal(!1),r.textContent=t.localOption,r.disabled=!1,m.remove()}),u.mode==="local")r.textContent=t.localActive,r.disabled=!0,l.append(m);u.canRunLocally().then((v)=>{if(v)return;r.textContent=t.localOption,r.disabled=!0,p.textContent=t.localNoWebGPU,m.remove()});let g=x(n,"p",t.orKey,"or");l.hidden=g.hidden=!u.localAllowed;let b=ie(n,t.local),w=I(n,t.provider,a(n,"select")),h=w.control,f=I(n,t.model,a(n,"select")),y=f.control,E=I(n,t.endpoint,a(n,"input",{type:"url",inputmode:"url"}),t.localHint),C=E.control,k=I(n,t.model,a(n,"input",{type:"text",autocomplete:"off"})),T=k.control,A=a(n,"div",{class:"presets"});for(let v of["ollama","lmstudio"]){let L=a(n,"button",{class:"text-btn",type:"button"});L.textContent=v==="ollama"?"Ollama":"LM Studio",L.addEventListener("click",async()=>{let{ENDPOINT_PRESETS:M}=await (N("ec42kn0e"),import("./index-ec42kn0e.js"));o.applyPreset(M[v])}),A.append(L)}let Z=I(n,t.apiKey,a(n,"input",{type:"password",autocomplete:"off",spellcheck:"false"}),t.apiKeyHint),O=Z.control,R=ie(n,t.remember),P=a(n,"button",{class:"text-btn",type:"button"});P.textContent=t.test;let z=a(n,"p",{class:"result",role:"status"});z.style.margin="0";let K=a(n,"button",{class:"primary",type:"button"});K.textContent=t.save;let D=a(n,"button",{class:"link-btn",type:"button"});D.textContent=t.forget,b.input.addEventListener("change",()=>o.toggleCustom(b.input.checked)),h.addEventListener("change",()=>o.selectProvider(h.value)),y.addEventListener("change",()=>o.selectModel(y.value)),C.addEventListener("input",()=>o.setEndpoint(C.value)),T.addEventListener("input",()=>o.setCustomModel(T.value)),O.addEventListener("input",()=>o.setApiKey(O.value)),R.input.addEventListener("change",()=>o.setRememberKey(R.input.checked)),P.addEventListener("click",()=>void o.test()),K.addEventListener("click",async()=>{if(!(await o.save()).ok)return;if(u.useLocal(!1),this.hideSetup(),e)this.input.value=e,this.submit()}),D.addEventListener("click",()=>void o.clear());let Q=a(n,"div",{class:"row"});Q.append(P,z),this.setupView.replaceChildren(s,i,d,l,g,b.label,w.label,f.label,A,E.label,k.label,Z.label,R.label,Q,K,D);let le=(v)=>{let L=v.draft.custom;if(b.input.checked=L,w.label.hidden=L,f.label.hidden=L,A.hidden=!L,E.label.hidden=!L,k.label.hidden=!L,v.catalogStatus==="ready")fe(n,h,v,t),be(n,y,v);else h.replaceChildren(J(n,"",v.catalogStatus==="error"?t.catalogError:t.loadingCatalog)),y.replaceChildren();if(C!==this.root.activeElement)C.value=v.draft.customEndpoint;if(T!==this.root.activeElement)T.value=v.draft.customModel;if(O!==this.root.activeElement)O.value=v.apiKey;R.input.checked=v.draft.rememberKey,P.disabled=!v.canTest||v.testing,P.textContent=v.testing?t.testing:t.test,K.disabled=!v.canSave;let M=v.testResult;z.className=M?M.ok?"result ok":"result fail":"result",z.textContent=!M?"":M.ok?t.testOk:`${t.testFail} ${M.reason}${M.message?` (${M.message})`:""}`};this.unsubscribe?.(),this.unsubscribe=o.subscribe(le),this.setupView.scrollTop=0,s.focus()}hideSetup(){this.unsubscribe?.(),this.unsubscribe=null,this.setupView.hidden=!0,this.chatView.hidden=!1,this.input.focus()}}function fe(e,n,o,t){let s=[[t.recommended,o.providers.recommended],[t.otherProviders,o.providers.others]],i=`${o.draft.providerId}|${o.providers.recommended.length+o.providers.others.length}`;if(n.dataset.sig===i)return;n.dataset.sig=i,n.replaceChildren(...s.filter(([,d])=>d.length).map(([d,u])=>{let c=e.createElement("optgroup");return c.label=d,c.append(...u.map((l)=>J(e,l.id,l.name))),c})),n.value=o.draft.providerId}function be(e,n,o){let t=`${o.draft.providerId}|${o.draft.model}|${o.models.length}`;if(n.dataset.sig===t)return;n.dataset.sig=t;let s=o.recommendedModel?.id;n.replaceChildren(...o.models.map((i)=>J(e,i.id,i.id===s?`${i.name} ★`:i.name))),n.value=o.draft.model}function j(e,n){try{if(e==="set")sessionStorage.setItem(n,"1");else if(e==="remove")sessionStorage.removeItem(n);else return sessionStorage.getItem(n)!==null}catch{}return!1}function ve(e){let n=globalThis.requestIdleCallback;if(n)n(e,{timeout:4000});else setTimeout(e,1500)}function a(e,n,o={}){let t=e.createElement(n);for(let[s,i]of Object.entries(o))t.setAttribute(s,i);return t}function x(e,n,o,t){let s=e.createElement(n);if(s.textContent=o,t)s.className=t;return s}function J(e,n,o){let t=e.createElement("option");return t.value=n,t.textContent=o,t}function _(e,n,o){let t=a(e,"button",{class:"icon-btn",type:"button",title:o});return t.setAttribute("aria-label",o),t.append(U(e,n)),t}function I(e,n,o,t){let s=a(e,"label",{class:"field"});if(s.append(x(e,"span",n),o),t)s.append(x(e,"small",t));return{label:s,control:o}}function ie(e,n){let o=a(e,"label",{class:"check"}),t=a(e,"input",{type:"checkbox"});return o.append(t,e.createTextNode(n)),{label:o,input:t}}function xe(e="murmur-chat"){if(!customElements.get(e))customElements.define(e,class extends Y{});return customElements.get(e)}function re(e={}){xe();let{target:n,inline:o,...t}=e,s=document.createElement("murmur-chat");if(o)s.setAttribute("inline","");return s.configure(t),(n??document.body).append(s),s}function ye(e,n){let o={};if(e.index)o.index=new URL(e.index,n).href;let t={};if(e.provider)t.provider=e.provider;if(e.model)t.model=e.model;if(e.endpoint)t.endpoint=e.endpoint;if(e.apiKey&&typeof console<"u")console.error('murmur: data-api-key is ignored: a key in the page can be read by anyone. Keep it in a Worker (data-endpoint), run the model in the browser (data-mode="local"), or let visitors use their own key.');if(Object.keys(t).length)o.llm=t;if(e.instructions)o.instructions=e.instructions;if(e.lang)o.lang=e.lang;let s={};if(e.title)s.title=e.title;if(e.greeting)s.greeting=e.greeting;if(e.placeholder)s.placeholder=e.placeholder;if(e.button)s.open=e.button;if(Object.keys(s).length)o.messages=s;if(e.position==="bottom-left"||e.position==="bottom-right")o.position=e.position;if(e.theme==="light"||e.theme==="dark"||e.theme==="auto")o.theme=e.theme;if(e.accent)o.accent=e.accent;if(e.catalog)o.catalogUrl=new URL(e.catalog,n).href;if(e.storageKey)o.storageKey=e.storageKey;if(e.open==="true")o.open=!0;if(e.local==="false")o.local=!1;if(e.mode==="auto"||e.mode==="proxy"||e.mode==="local"||e.mode==="key")o.mode=e.mode;if(e.preload==="question"||e.preload==="open"||e.preload==="idle"||e.preload==="consent")o.preload=e.preload;return o}function ae(){let e=import.meta.url,n=[...document.querySelectorAll("script[src]")].find((t)=>t.src===e&&!t.dataset.murmurReady);if(n)n.dataset.murmurReady="true";let o=ye(n?.dataset??{},location.href);o.catalogUrl??=new URL("./models.json",e).href,re(o)}if(typeof document<"u"&&!document.querySelector("murmur-chat:not([inline])"))if(document.readyState==="loading")document.addEventListener("DOMContentLoaded",ae,{once:!0});else ae();export{ye as optionsFromDataset};