@boldare/askdare 0.0.0-stage → 0.1.0-rc.0

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/next.js ADDED
@@ -0,0 +1,2864 @@
1
+ import { d as textLocale, f as textsFor, i as resolveTheme, l as TEXT_LOCALES, s as PRESET_NAMES, t as PROTOCOL_HEADER, u as canonicalLocale } from "./version.js";
2
+ import { z } from "zod";
3
+ import { after } from "next/server.js";
4
+ import OpenAI, { APIConnectionError, APIConnectionTimeoutError, APIError, APIUserAbortError, BadRequestError, NotFoundError, toFile } from "openai";
5
+ import { zodResponsesFunction } from "openai/helpers/zod";
6
+ import { EncryptJWT, errors, jwtDecrypt, jwtVerify } from "jose";
7
+ // src/errors.ts
8
+ const HTTP_STATUS = {
9
+ invalid_input: 400,
10
+ unauthorized: 401,
11
+ session_expired: 401,
12
+ not_found: 404,
13
+ content_blocked: 422,
14
+ rate_limited: 429,
15
+ budget_exceeded: 429,
16
+ internal_error: 500,
17
+ upstream_error: 502,
18
+ bot_unavailable: 503,
19
+ timeout: 504
20
+ };
21
+ const DEFAULT_MESSAGES = {
22
+ invalid_input: "The request was invalid.",
23
+ unauthorized: "Authentication is required.",
24
+ session_expired: "Your session has expired. Please try again.",
25
+ not_found: "Not found.",
26
+ content_blocked: "This message cannot be processed.",
27
+ rate_limited: "Too many messages. Please wait a moment.",
28
+ budget_exceeded: "The assistant is unavailable for the rest of the day.",
29
+ internal_error: "Something went wrong. Please try again.",
30
+ upstream_error: "The assistant is temporarily unavailable. Please try again.",
31
+ bot_unavailable: "The assistant is currently unavailable.",
32
+ timeout: "The assistant took too long to respond. Please try again."
33
+ };
34
+ /** An error with a stable, client-safe code. Anything else that escapes becomes `internal_error`. */
35
+ var AskdareError = class extends Error {
36
+ name = "AskdareError";
37
+ code;
38
+ status;
39
+ retryAfterMs;
40
+ key;
41
+ params;
42
+ constructor(code, options = {}) {
43
+ super(options.message ?? DEFAULT_MESSAGES[code], { cause: options.cause });
44
+ this.code = code;
45
+ this.status = HTTP_STATUS[code];
46
+ this.retryAfterMs = options.retryAfterMs;
47
+ this.key = options.key ?? (options.message === void 0 ? `error.${code}` : void 0);
48
+ this.params = options.params;
49
+ }
50
+ };
51
+ /** The caller's own signal aborted the work (for example, the visitor closed the chat). Not an error to report. */
52
+ var TurnAbortedError = class extends Error {
53
+ name = "TurnAbortedError";
54
+ };
55
+ /** Normalizes anything thrown into a {@link AskdareError} without exposing its details. */
56
+ function toAskdareError(error) {
57
+ return error instanceof AskdareError ? error : new AskdareError("internal_error", { cause: error });
58
+ }
59
+ /** API keys never reach a log line, a report or the chat: `sk-proj-abc…` keeps only its prefix. */
60
+ function scrub(text) {
61
+ return text.replace(/\b(sk|rk)-[A-Za-z0-9_-]{6,}/g, (key) => `${key.slice(0, 3)}…`);
62
+ }
63
+ // src/generated/assets.ts
64
+ const LOADER_JS = "(function(){function e(e){let t=typeof e==`object`&&e?e:{},n={v:1,type:`configure`};return typeof t.greeting==`string`&&(n.greeting=t.greeting),typeof t.context==`string`&&(n.context=t.context),Array.isArray(t.starters)&&(n.starters=t.starters.filter(e=>typeof e==`string`)),n}var t=`\n:host { all: initial; }\n[part=launcher] {\n position: fixed; right: 24px; bottom: 24px; z-index: 2147483000;\n display: flex; align-items: center; justify-content: center; gap: 10px;\n min-width: 56px; height: 56px; padding: 0; border: 0; border-radius: 999px;\n background: var(--a); color: var(--o); cursor: pointer;\n font: 600 15px/1 system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;\n box-shadow: 0 12px 32px -10px rgb(15 23 42 / .45), 0 2px 6px rgb(15 23 42 / .16);\n transition: transform .16s ease, box-shadow .16s ease;\n}\n[part=launcher]:hover { transform: translateY(-2px); }\n[part=launcher]:focus-visible { outline: 3px solid var(--a); outline-offset: 3px; }\n.pill { padding: 0 22px 0 6px; }\n.av { display: grid; place-items: center; width: 44px; height: 44px; overflow: hidden;\n border-radius: 50%; background: var(--o); color: var(--a); font-size: 14px; }\n.av img { width: 100%; height: 100%; object-fit: cover; }\n/* The orb launcher: the orb with its label, on the panel's background, so it reads as a chat. */\n.orb { height: 60px; padding: 0 22px 0 6px; background: var(--l); color: var(--t);\n box-shadow: 0 14px 34px -12px var(--a), 0 2px 8px rgb(15 23 42 / .12),\n 0 0 0 1px rgb(15 23 42 / .06); }\n:host([data-askdare-scheme=dark]) .orb { background: var(--d); color: var(--u); }\n@media (prefers-color-scheme: dark) {\n :host([data-askdare-scheme=auto]) .orb { background: var(--d); color: var(--u); }\n}\n.ob { position: relative; width: 48px; height: 48px; border-radius: 50%; background: var(--b);\n box-shadow: inset 0 -5px 12px rgb(0 0 0 / .18), inset 0 4px 10px rgb(255 255 255 / .6); }\n.ob::after { content: \"\"; position: absolute; top: 12%; left: 20%; width: 36%; height: 28%;\n border-radius: 50%; background: radial-gradient(closest-side, #fffe, #fff0); }\n[aria-expanded=true], :host .orb[aria-expanded=true] { background: var(--a); color: var(--o); }\n[aria-expanded=true] .av, [aria-expanded=true] .ob, [aria-expanded=true] .lb { display: none; }\n.pill[aria-expanded=true], .orb[aria-expanded=true] { padding: 0; width: 56px; }\n[part=panel] {\n position: fixed; right: 24px; bottom: 96px; z-index: 2147483000;\n width: min(400px, calc(100vw - 48px)); height: min(680px, calc(100dvh - 120px));\n overflow: hidden; border-radius: var(--r); background: var(--l);\n box-shadow: 0 28px 70px -12px rgb(15 23 42 / .4), 0 0 0 1px rgb(15 23 42 / .06);\n transform-origin: bottom right; animation: in .22s cubic-bezier(.2, .8, .2, 1);\n}\n:host([data-askdare-scheme=dark]) [part=panel] { background: var(--d); }\n@media (prefers-color-scheme: dark) {\n :host([data-askdare-scheme=auto]) [part=panel] { background: var(--d); }\n}\n[part=panel][hidden] { display: none; }\n[part=unavailable] { position: absolute; inset: 0; display: grid; place-items: center;\n margin: 0; padding: 24px; background: var(--l); color: var(--t); text-align: center;\n font: 15px/1.5 system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif; }\n[part=panel].solo { bottom: 24px; }\n[part=panel].inline { position: relative; inset: auto; width: 100%; height: 100%; border-radius: inherit;\n box-shadow: none; animation: none; }\niframe { display: block; width: 100%; height: 100%; border: 0; }\n@keyframes in { from { opacity: 0; transform: translateY(10px) scale(.97); } }\n@media (max-width: 480px) {\n [part=panel] { inset: 0; width: 100vw; height: 100dvh; border-radius: 0; }\n [aria-expanded=true][data-ready] { display: none; }\n}\n@media (prefers-reduced-motion: reduce) {\n [part=launcher], [part=panel] { transition: none; animation: none; }\n}\n`;function n(){try{return JSON.parse(`__ASKDARE_LAUNCHERS__`)}catch{return{}}}function r(){if(window.askdare?.loaded)return;let r=document.currentScript;if(!(r instanceof HTMLScriptElement)||!r.src)return;let i=new URL(r.src),a=r.dataset.bot??i.searchParams.get(`bot`);if(!a){console.warn(`[askdare] Load the widget as widget.js?bot=<bot id>.`);return}let o=i.origin,s=i.pathname.replace(/\\/widget\\.js$/,``),c=r.dataset.mode===`inline`?r.dataset.target:void 0,l=()=>{try{return c?document.querySelector(c):null}catch{return null}};c&&!l()&&document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,()=>u(r,l(),a),{once:!0}):u(r,l(),a);function u(r,i,a){let l=window.askdare;if(l?.loaded)return;let u=Array.isArray(l?.q)?l.q:[];c&&!i&&console.warn(`[askdare] No element matches ${c}.`);let d=i!==null,f=!d&&r.dataset.launcher!==`none`,p=document.documentElement.lang,m=new URLSearchParams({...p?{lang:p}:{},...d?{mode:`inline`}:{}}).toString(),h=`${o}${s}/embed/${encodeURIComponent(a)}${m?`?${m}`:``}`,g=n()[a],_=(g?.locale||p||navigator.language).toLowerCase().split(`-`)[0],v=g?.texts[_??`en`]??g?.texts.en??{label:`Ask us`,open:`Open chat`,close:`Close chat`,unavailable:`The chat couldn’t load. Please try again later.`,title:`Chat`},y=document.createElement(`div`);y.dataset.askdare=a,y.dataset.askdareScheme=g?.scheme??`auto`;for(let[e,t]of[[`--a`,g?.accent??`#1f5fe0`],[`--o`,g?.onAccent??`#ffffff`],[`--b`,g?.orb??`var(--a)`],[`--l`,g?.light??`#ffffff`],[`--d`,g?.dark??`#0a0f1c`],[`--t`,g?.text??`#0d1526`],[`--u`,g?.textDark??`#e8edf7`],[`--r`,g?.radius?`min(${g.radius}, 24px)`:`18px`]])y.style.setProperty(e,t);let b=y.attachShadow({mode:`open`});try{let e=new CSSStyleSheet;e.replaceSync(t),b.adoptedStyleSheets=[e]}catch{let e=document.createElement(`style`);e.textContent=t,b.append(e)}let x=document.createElement(`button`);x.type=`button`,x.className=g?.style??`circle`,x.setAttribute(`part`,`launcher`);let S=g?.style===`pill`||g?.style===`orb`?`${v.label}, ${v.open}`:v.open;x.setAttribute(`aria-label`,S),x.setAttribute(`aria-expanded`,`false`);let C=document.createElement(`span`);C.style.display=`contents`;let w=e=>{C.innerHTML=e?`<svg width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" aria-hidden=\"true\"><path d=\"M6 6l12 12M18 6 6 18\"/></svg>`:g?.style===`circle`||!g?`<svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden=\"true\"><path d=\"M4 5.5A2.5 2.5 0 0 1 6.5 3h11A2.5 2.5 0 0 1 20 5.5v8a2.5 2.5 0 0 1-2.5 2.5H10l-4.2 3.6A.5.5 0 0 1 5 19.2V16h-.5A.5.5 0 0 1 4 15.5z\" fill=\"currentColor\"/></svg>`:``};if(w(!1),g?.style===`pill`||g?.style===`orb`){let e=document.createElement(`span`);if(e.className=g.style===`orb`?`ob`:`av`,g.style===`pill`&&(e.textContent=g.initials),g.style===`pill`&&g.avatar){let t=document.createElement(`img`);t.alt=``,t.src=g.avatar.startsWith(`/`)?`${o}${g.avatar}`:g.avatar,t.onload=()=>e.replaceChildren(t)}let t=document.createElement(`span`);t.className=`lb`,t.textContent=v.label,x.append(e,t)}x.append(C);let T=document.createElement(`div`);T.setAttribute(`part`,`panel`),T.setAttribute(`role`,`dialog`),T.setAttribute(`aria-label`,v.title),T.hidden=!0,d?T.className=`inline`:f||(T.className=`solo`),b.append(T),f&&b.append(x);let E,D,O=!1,k,A=()=>{O||k||(k=document.createElement(`p`),k.setAttribute(`part`,`unavailable`),k.setAttribute(`role`,`status`),k.textContent=v.unavailable,T.append(k),console.warn(`[askdare] The chat \"${a}\" didn't load on ${location.origin}. Is this origin in the bot's security.allowedOrigins? Check with: npx @boldare/askdare doctor --origin ${location.origin}`))},j,M,N,P=e=>{D?.close();let t=new MessageChannel;D=t.port1,D.onmessage=e=>{e.data?.v===1&&(e.data.type===`close`&&I(),e.data.type===`ready`&&(O=!0,k?.remove(),k=void 0,x.dataset.ready=``))},e.contentWindow?.postMessage({v:1,type:`askdare:init`,...M===void 0?{}:{identity:M}},o,[t.port2]),j&&D.postMessage(j)},F=(e=!0)=>{if(!d&&T.hidden){let e=document.activeElement;N=e instanceof HTMLElement&&e!==y?e:void 0}E||(E=document.createElement(`iframe`),E.title=`Chat`,E.src=h,E.referrerPolicy=`strict-origin`,E.allow=`clipboard-write; microphone`,E.addEventListener(`load`,()=>E&&P(E)),T.append(E),setTimeout(A,8e3)),T.hidden=!1,w(!0),x.setAttribute(`aria-expanded`,`true`),x.setAttribute(`aria-label`,v.close),e&&E.focus()};function I(){if(d||T.hidden)return;D?.postMessage({v:1,type:`hidden`}),T.hidden=!0,w(!1),x.setAttribute(`aria-expanded`,`false`),x.setAttribute(`aria-label`,S);let e=N?.isConnected?N:f?x:void 0;e&&(window.focus(),e.focus())}x.addEventListener(`click`,()=>T.hidden?F():I()),(i??document.body??document.documentElement).append(y),d&&F(!1);let L=((t,n)=>{t===`open`?F():t===`close`?I():t===`toggle`?(T.hidden?F:I)():t===`identify`?(typeof n!=`string`&&n!==null&&console.warn(`[askdare] askdare('identify') expects a token or null; signing out.`),M=typeof n==`string`?n:null,D?.postMessage({v:1,type:`identify`,token:M})):t===`configure`&&(j=e(n),D?.postMessage(j))});Object.defineProperty(L,\"loaded\",{value:!0}),window.askdare=L;for(let e of u)L(...e)}}r()})();";
65
+ const WIDGET_JS = "var e,t,n,r,i,a,o,s,c,l,u,d,f,p,m={},h=[],g=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,_=Array.isArray;function v(e,t){for(var n in t)e[n]=t[n];return e}function ee(e){e&&e.parentNode&&e.parentNode.removeChild(e)}function y(t,n,r){var i,a,o,s={};for(o in n)o==`key`?i=n[o]:o==`ref`?a=n[o]:s[o]=n[o];if(arguments.length>2&&(s.children=arguments.length>3?e.call(arguments,2):r),typeof t==`function`&&t.defaultProps!=null)for(o in t.defaultProps)s[o]===void 0&&(s[o]=t.defaultProps[o]);return b(t,s,i,a,null)}function b(e,r,i,a,o){var s={type:e,props:r,key:i,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:o??++n,__i:-1,__u:0};return o==null&&t.vnode!=null&&t.vnode(s),s}function x(e){return e.children}function S(e,t){this.props=e,this.context=t}function C(e,t){if(t==null)return e.__?C(e.__,e.__i+1):null;for(var n;t<e.__k.length;t++)if((n=e.__k[t])!=null&&n.__e!=null)return n.__e;return typeof e.type==`function`?C(e):null}function te(e){if(e.__P&&e.__d){var n=e.__v,r=n.__e,i=[],a=[],o=v({},n);o.__v=n.__v+1,t.vnode&&t.vnode(o),j(e.__P,o,n,e.__n,e.__P.namespaceURI,32&n.__u?[r]:null,i,r??C(n),!!(32&n.__u),a),o.__v=n.__v,o.__.__k[o.__i]=o,se(i,o,a),n.__e=n.__=null,o.__e!=r&&w(o)}}function w(e){if((e=e.__)!=null&&e.__c!=null)return e.__e=e.__c.base=null,e.__k.some(function(t){if(t!=null&&t.__e!=null)return e.__e=e.__c.base=t.__e}),w(e)}function T(e){(!e.__d&&(e.__d=!0)&&r.push(e)&&!E.__r++||i!=t.debounceRendering)&&((i=t.debounceRendering)||a)(E)}function E(){try{for(var e,t=1;r.length;)r.length>t&&r.sort(o),e=r.shift(),t=r.length,te(e)}finally{r.length=E.__r=0}}function ne(e,t,n,r,i,a,o,s,c,l,u){var d,f,p,g,_,v,ee=r&&r.__k||h,y=t.length;for(c=D(n,t,ee,c,y),d=0;d<y;d++)(p=n.__k[d])!=null&&(f=p.__i!=-1&&ee[p.__i]||m,p.__i=d,v=j(e,p,f,i,a,o,s,c,l,u),g=p.__e,p.ref&&f.ref!=p.ref&&(f.ref&&le(f.ref,null,p),u.push(p.ref,p.__c||g,p)),_==null&&g!=null&&(_=g),4&p.__u?(c=O(p,c,e),f.__e&&(f.__e=null)):typeof p.type==`function`&&v!==void 0?c=v:g&&(c=g.nextSibling),p.__u&=-7);return n.__e=_,c}function D(e,t,n,r,i){var a,o,s,c,l,u=n.length,d=u,f=0;for(e.__k=Array(i),a=0;a<i;a++)(o=t[a])!=null&&typeof o!=`boolean`&&typeof o!=`function`?(typeof o==`string`||typeof o==`number`||typeof o==`bigint`||o.constructor==String?o=e.__k[a]=b(null,o,null,null,null):_(o)?o=e.__k[a]=b(x,{children:o},null,null,null):o.constructor===void 0&&o.__b>0?o=e.__k[a]=b(o.type,o.props,o.key,o.ref?o.ref:null,o.__v):e.__k[a]=o,c=a+f,o.__=e,o.__b=e.__b+1,s=null,(l=o.__i=re(o,n,c,d))!=-1&&(d--,(s=n[l])&&(s.__u|=2)),s==null||s.__v==null?(l==-1&&(i>u?f--:i<u&&f++),typeof o.type!=`function`&&(o.__u|=4)):l!=c&&(l==c-1?f--:l==c+1?f++:(l>c?f--:f++,o.__u|=4))):e.__k[a]=null;if(d)for(a=0;a<u;a++)(s=n[a])!=null&&!(2&s.__u)&&(s.__e==r&&(r=C(s)),ue(s,s));return r}function O(e,t,n){var r,i;if(typeof e.type==`function`){for(r=e.__k,i=0;r&&i<r.length;i++)r[i]&&(r[i].__=e,t=O(r[i],t,n));return t}e.__e!=t&&(t&&e.type&&!t.parentNode&&(t=C(e)),t=n.insertBefore(e.__e,t||null));do t&&=t.nextSibling;while(t!=null&&t.nodeType==8);return t}function k(e,t){return t||=[],e==null||typeof e==`boolean`||(_(e)?e.some(function(e){k(e,t)}):t.push(e)),t}function re(e,t,n,r){var i,a,o,s=e.key,c=e.type,l=t[n],u=l!=null&&!(2&l.__u);if(l===null&&s==null||u&&s==l.key&&c==l.type)return n;if(r>+!!u){for(i=n-1,a=n+1;i>=0||a<t.length;)if((l=t[o=i>=0?i--:a++])!=null&&!(2&l.__u)&&s==l.key&&c==l.type)return o}return-1}function ie(e,t,n){t[0]==`-`?e.setProperty(t,n??``):e[t]=n==null?``:typeof n!=`number`||g.test(t)?n:n+`px`}function A(e,t,n,r,i){var a,o;n:if(t==`style`){if(typeof n==`string`)e.style.cssText=n;else{if(typeof r==`string`&&(e.style.cssText=r=``),r)for(t in r)n&&t in n||ie(e.style,t,``);if(n)for(t in n)r&&n[t]==r[t]||ie(e.style,t,n[t])}}else if(t[0]==`o`&&t[1]==`n`)a=t!=(t=t.replace(u,`$1`)),o=t.toLowerCase(),t=o in e||t==`onFocusOut`||t==`onFocusIn`?o.slice(2):t.slice(2),e.l||={},e.l[t+a]=n,n?r?n[l]=r[l]:(n[l]=d,e.addEventListener(t,a?p:f,a)):e.removeEventListener(t,a?p:f,a);else{if(i==`http://www.w3.org/2000/svg`)t=t.replace(/xlink(H|:h)/,`h`).replace(/sName$/,`s`);else if(t!=`width`&&t!=`height`&&t!=`href`&&t!=`list`&&t!=`form`&&t!=`tabIndex`&&t!=`download`&&t!=`rowSpan`&&t!=`colSpan`&&t!=`role`&&t!=`popover`&&t in e)try{e[t]=n??``;break n}catch{}typeof n==`function`||(n==null||!1===n&&t[4]!=`-`?e.removeAttribute(t):e.setAttribute(t,t==`popover`&&n==1?``:n))}}function ae(e){return function(n){if(this.l){var r=this.l[n.type+e];if(n[c]==null)n[c]=d++;else if(n[c]<r[l])return;return r(t.event?t.event(n):n)}}}function j(e,n,r,i,a,o,s,c,l,u){var d,f,p,m,g,y,b,te,w,T,E,D,O,k,re,ie,A=n.type;if(n.constructor!==void 0)return null;128&r.__u&&(l=!!(32&r.__u),o=[c=n.__e=r.__e]),(d=t.__b)&&d(n);n:if(typeof A==`function`){f=s.length;try{if(w=n.props,T=A.prototype&&A.prototype.render,E=(d=A.contextType)&&i[d.__c],D=d?E?E.props.value:d.__:i,r.__c?te=(p=n.__c=r.__c).__=p.__E:(T?n.__c=p=new A(w,D):(n.__c=p=new S(w,D),p.constructor=A,p.render=de),E&&E.sub(p),p.state||(p.state={}),p.__n=i,m=p.__d=!0,p.__h=[],p._sb=[]),T&&p.__s==null&&(p.__s=p.state),T&&A.getDerivedStateFromProps!=null&&(p.__s==p.state&&(p.__s=v({},p.__s)),v(p.__s,A.getDerivedStateFromProps(w,p.__s))),g=p.props,y=p.state,p.__v=n,m)T&&A.getDerivedStateFromProps==null&&p.componentWillMount!=null&&p.componentWillMount(),T&&p.componentDidMount!=null&&p.__h.push(p.componentDidMount);else{if(T&&A.getDerivedStateFromProps==null&&w!==g&&p.componentWillReceiveProps!=null&&p.componentWillReceiveProps(w,D),n.__v==r.__v||!p.__e&&p.shouldComponentUpdate!=null&&!1===p.shouldComponentUpdate(w,p.__s,D)){n.__v!=r.__v&&(p.props=w,p.state=p.__s,p.__d=!1),n.__e=r.__e,n.__k=r.__k,n.__k.some(function(e){e&&(e.__=n)}),h.push.apply(p.__h,p._sb),p._sb=[],p.__h.length&&s.push(p),c=C(r);break n}p.componentWillUpdate!=null&&p.componentWillUpdate(w,p.__s,D),T&&p.componentDidUpdate!=null&&p.__h.push(function(){p.componentDidUpdate(g,y,b)})}if(p.context=D,p.props=w,p.__P=e,p.__e=!1,O=t.__r,k=0,T)p.state=p.__s,p.__d=!1,O&&O(n),d=p.render(p.props,p.state,p.context),h.push.apply(p.__h,p._sb),p._sb=[];else do p.__d=!1,O&&O(n),d=p.render(p.props,p.state,p.context),p.state=p.__s;while(p.__d&&++k<25);p.state=p.__s,p.getChildContext!=null&&(i=v(v({},i),p.getChildContext())),T&&!m&&p.getSnapshotBeforeUpdate!=null&&(b=p.getSnapshotBeforeUpdate(g,y)),re=d!=null&&d.type===x&&d.key==null?ce(d.props.children):d,c=ne(e,_(re)?re:[re],n,r,i,a,o,s,c,l,u),p.base=n.__e,n.__u&=-161,p.__h.length&&s.push(p),te&&(p.__E=p.__=null)}catch(e){if(s.length=f,n.__v=null,l||o!=null){if(e.then){for(n.__u|=l?160:128;c&&c.nodeType==8&&c.nextSibling;)c=c.nextSibling;o!=null&&(o[o.indexOf(c)]=null),n.__e=c}else if(o!=null)for(ie=o.length;ie--;)ee(o[ie])}else n.__e=r.__e;n.__k??=r.__k||[],e.then||oe(n),t.__e(e,n,r)}}else o==null&&n.__v==r.__v?(n.__k=r.__k,n.__e=r.__e):c=n.__e=M(r.__e,n,r,i,a,o,s,l,u);return(d=t.diffed)&&d(n),128&n.__u?void 0:c}function oe(e){e&&(e.__c&&(e.__c.__e=!0),e.__k&&e.__k.some(oe))}function se(e,n,r){for(var i=0;i<r.length;i++)le(r[i],r[++i],r[++i]);t.__c&&t.__c(n,e),e.some(function(n){try{e=n.__h,n.__h=[],e.some(function(e){e.call(n)})}catch(e){t.__e(e,n.__v)}})}function ce(e){return typeof e!=`object`||!e||e.__b>0?e:_(e)?e.map(ce):e.constructor===void 0?v({},e):null}function M(n,r,i,a,o,s,c,l,u){var d,f,p,h,g,v,y,b=i.props||m,x=r.props,S=r.type;if(S==`svg`?o=`http://www.w3.org/2000/svg`:S==`math`?o=`http://www.w3.org/1998/Math/MathML`:o||=`http://www.w3.org/1999/xhtml`,s!=null){for(d=0;d<s.length;d++)if((g=s[d])&&`setAttribute`in g==!!S&&(S?g.localName==S:g.nodeType==3)){n=g,s[d]=null;break}}if(n==null){if(S==null)return document.createTextNode(x);n=document.createElementNS(o,S,x.is&&x),l&&=(t.__m&&t.__m(r,s),!1),s=null}if(S==null)b===x||l&&n.data==x||(n.data=x);else{if(s=S==`textarea`&&x.defaultValue!=null?null:s&&e.call(n.childNodes),!l&&s!=null)for(b={},d=0;d<n.attributes.length;d++)b[(g=n.attributes[d]).name]=g.value;for(d in b)g=b[d],d==`dangerouslySetInnerHTML`?p=g:d==`children`||d in x||d==`value`&&`defaultValue`in x||d==`checked`&&`defaultChecked`in x||A(n,d,null,g,o);for(d in x)g=x[d],d==`children`?h=g:d==`dangerouslySetInnerHTML`?f=g:d==`value`?v=g:d==`checked`?y=g:l&&typeof g!=`function`||b[d]===g||A(n,d,g,b[d],o);if(f)l||p&&(f.__html==p.__html||f.__html==n.innerHTML)||(n.innerHTML=f.__html),r.__k=[];else if(p&&(n.innerHTML=``),ne(r.type==`template`?n.content:n,_(h)?h:[h],r,i,a,S==`foreignObject`?`http://www.w3.org/1999/xhtml`:o,s,c,s?s[0]:i.__k&&C(i,0),l,u),s!=null)for(d=s.length;d--;)ee(s[d]);l&&S!=`textarea`||(d=`value`,S==`progress`&&v==null?n.removeAttribute(`value`):v!=null&&(v!==n[d]||S==`progress`&&!v||S==`option`&&v!=b[d])&&A(n,d,v,b[d],o),d=`checked`,y!=null&&y!=n[d]&&A(n,d,y,b[d],o))}return n}function le(e,n,r){try{if(typeof e==`function`){var i=typeof e.__u==`function`;i&&e.__u(),i&&n==null||(e.__u=e(n))}else e.current=n}catch(e){t.__e(e,r)}}function ue(e,n,r){var i,a;if(t.unmount&&t.unmount(e),(i=e.ref)&&(i.current&&i.current!=e.__e||le(i,null,n)),(i=e.__c)!=null){if(i.componentWillUnmount)try{i.componentWillUnmount()}catch(e){t.__e(e,n)}i.base=i.__P=i.__n=null}if(i=e.__k)for(a=0;a<i.length;a++)i[a]&&ue(i[a],n,r||typeof e.type!=`function`);r||ee(e.__e),e.__c=e.__=e.__e=void 0}function de(e,t,n){return this.constructor(e,n)}function fe(n,r,i){var a,o,s,c;r==document&&(r=document.documentElement),t.__&&t.__(n,r),o=(a=typeof i==`function`)?null:i&&i.__k||r.__k,s=[],c=[],j(r,n=(!a&&i||r).__k=y(x,null,[n]),o||m,m,r.namespaceURI,!a&&i?[i]:o?null:r.firstChild?e.call(r.childNodes):null,s,!a&&i?i:o?o.__e:r.firstChild,a,c),se(s,n,c),n.props.children=null}e=h.slice,t={__e:function(e,t,n,r){for(var i,a,o;t=t.__;)if((i=t.__c)&&!i.__)try{if((a=i.constructor)&&a.getDerivedStateFromError!=null&&(i.setState(a.getDerivedStateFromError(e)),o=i.__d),i.componentDidCatch!=null&&(i.componentDidCatch(e,r||{}),o=i.__d),o)return i.__E=i}catch(t){e=t}throw e}},n=0,S.prototype.setState=function(e,t){var n=this.__s!=null&&this.__s!=this.state?this.__s:this.__s=v({},this.state);typeof e==`function`&&(e=e(v({},n),this.props)),e&&v(n,e),e!=null&&this.__v&&(t&&this._sb.push(t),T(this))},S.prototype.forceUpdate=function(e){this.__v&&(this.__e=!0,e&&this.__h.push(e),T(this))},S.prototype.render=x,r=[],a=typeof Promise==`function`?Promise.prototype.then.bind(Promise.resolve()):setTimeout,o=function(e,t){return e.__v.__b-t.__v.__b},E.__r=0,s=Math.random().toString(8),c=`__d`+s,l=`__a`+s,u=/(PointerCapture)$|Capture$/i,d=0,f=ae(!1),p=ae(!0);var N,P,F,pe,me=0,he=[],I=t,ge=I.__b,_e=I.__r,ve=I.diffed,ye=I.__c,be=I.unmount,xe=I.__;function Se(e,t){I.__h&&I.__h(P,e,me||t),me=0;var n=P.__H||(P.__H={__:[],__h:[]});return e>=n.__.length&&n.__.push({}),n.__[e]}function L(e){return me=1,Ce(Fe,e)}function Ce(e,t,n){var r=Se(N++,2);if(r.t=e,!r.__c&&(r.__=[n?n(t):Fe(void 0,t),function(e){var t=r.__N?r.__N[0]:r.__[0],n=r.t(t,e);t!==n&&(r.__N=[n,r.__[1]],r.__c.setState({}))}],r.__c=P,!P.__f)){var i=function(e,t,n){if(!r.__c.__H)return!0;var i=!1,o=r.__c.props!==e;if(r.__c.__H.__.some(function(e){if(e.__N){i=!0;var t=e.__[0];e.__=e.__N,e.__N=void 0,t!==e.__[0]&&(o=!0)}}),a){var s=a.call(this,e,t,n);return i?s||o:s}return!i||o};P.__f=!0;var a=P.shouldComponentUpdate,o=P.componentWillUpdate;P.componentWillUpdate=function(e,t,n){if(this.__e){var r=a;a=void 0,i(e,t,n),a=r}o&&o.call(this,e,t,n)},P.shouldComponentUpdate=i}return r.__N||r.__}function we(e,t){var n=Se(N++,3);!I.__s&&Pe(n.__H,t)&&(n.__=e,n.u=t,P.__H.__h.push(n))}function Te(e,t){var n=Se(N++,4);!I.__s&&Pe(n.__H,t)&&(n.__=e,n.u=t,P.__h.push(n))}function R(e){return me=5,Ee(function(){return{current:e}},[])}function Ee(e,t){var n=Se(N++,7);return Pe(n.__H,t)&&(n.__=e(),n.__H=t,n.__h=e),n.__}function De(e,t){return me=8,Ee(function(){return e},t)}function Oe(){var e=Se(N++,11);if(!e.__){for(var t=P.__v;t!==null&&!t.__m&&t.__!==null;)t=t.__;var n=t.__m||(t.__m=[0,0]);e.__=`P`+n[0]+`-`+n[1]++}return e.__}function ke(){for(var e;e=he.shift();){var t=e.__H;if(e.__P&&t)try{t.__h.some(Me),t.__h.some(Ne),t.__h=[]}catch(n){t.__h=[],I.__e(n,e.__v)}}}I.__b=function(e){P=null,ge&&ge(e)},I.__=function(e,t){e&&t.__k&&t.__k.__m&&(e.__m=t.__k.__m),xe&&xe(e,t)},I.__r=function(e){_e&&_e(e),N=0;var t=(P=e.__c).__H;t&&(F===P?(t.__h=[],P.__h=[],t.__.some(function(e){e.__N&&(e.__=e.__N),e.u=e.__N=void 0})):(t.__h.some(Me),t.__h.some(Ne),t.__h=[],N=0)),F=P},I.diffed=function(e){ve&&ve(e);var t=e.__c;t&&t.__H&&(t.__H.__h.length&&(he.push(t)!==1&&pe===I.requestAnimationFrame||((pe=I.requestAnimationFrame)||je)(ke)),t.__H.__.some(function(e){e.u&&=(e.__H=e.u,void 0)})),F=P=null},I.__c=function(e,t){t.some(function(e){try{e.__h.some(Me),e.__h=e.__h.filter(function(e){return!e.__||Ne(e)})}catch(n){t.some(function(e){e.__h&&=[]}),t=[],I.__e(n,e.__v)}}),ye&&ye(e,t)},I.unmount=function(e){be&&be(e);var t,n=e.__c;n&&n.__H&&(n.__H.__.some(function(e){try{Me(e)}catch(e){t=e}}),n.__H=void 0,t&&I.__e(t,n.__v))};var Ae=typeof requestAnimationFrame==`function`;function je(e){var t,n=function(){clearTimeout(r),Ae&&cancelAnimationFrame(t),setTimeout(e)},r=setTimeout(n,35);Ae&&(t=requestAnimationFrame(n))}function Me(e){var t=P,n=e.__c;typeof n==`function`&&(e.__c=void 0,n()),P=t}function Ne(e){var t=P;e.__c=e.__(),P=t}function Pe(e,t){return!e||e.length!==t.length||t.some(function(t,n){return t!==e[n]})}function Fe(e,t){return typeof t==`function`?t(e):t}function Ie(e,t){for(var n in t)e[n]=t[n];return e}function Le(e,t){for(var n in e)if(n!==`__source`&&!(n in t))return!0;for(var r in t)if(r!==`__source`&&e[r]!==t[r])return!0;return!1}function Re(e,t){this.props=e,this.context=t}function ze(e,t){function n(e){var n=this.props.ref;return n!=e.ref&&n&&(typeof n==`function`?n(null):n.current=null),t?!t(this.props,e)||n!=e.ref:Le(this.props,e)}function r(t){return this.shouldComponentUpdate=n,y(e,t)}return r.displayName=`Memo(`+(e.displayName||e.name)+`)`,r.__f=r.prototype.isReactComponent=!0,r.type=e,r}(Re.prototype=new S).isPureReactComponent=!0,Re.prototype.shouldComponentUpdate=function(e,t){return Le(this.props,e)||Le(this.state,t)};var Be=t.__b;t.__b=function(e){e.type&&e.type.__f&&e.ref&&(e.props.ref=e.ref,e.ref=null),Be&&Be(e)},typeof Symbol<`u`&&Symbol.for;var Ve=t.__e;t.__e=function(e,t,n,r){if(e.then){for(var i,a=t;a=a.__;)if((i=a.__c)&&i.__c)return t.__e??(t.__e=n.__e,t.__k=n.__k||[]),i.__c(e,t)}Ve(e,t,n,r)};var He=t.unmount;function Ue(e,t,n){return e&&(e.__c&&e.__c.__H&&(e.__c.__H.__.forEach(function(e){typeof e.__c==`function`&&e.__c()}),e.__c.__H=null),(e=Ie({},e)).__c!=null&&(e.__c.__P===n&&(e.__c.__P=t),e.__c.__e=!0,e.__c=null),e.__k=e.__k&&e.__k.map(function(e){return Ue(e,t,n)})),e}function We(e,t,n){return e&&n&&(e.__v=null,e.__k=e.__k&&e.__k.map(function(e){return We(e,t,n)}),e.__c&&e.__c.__P===t&&(e.__e&&n.appendChild(e.__e),e.__c.__e=!0,e.__c.__P=n)),e}function Ge(){this.__u=0,this.o=null,this.__b=null}function Ke(e){var t=e.__&&e.__.__c;return t&&t.__a&&t.__a(e)}function qe(){this.i=null,this.l=null}t.unmount=function(e){var t=e.__c;t&&(t.__z=!0),t&&t.__R&&t.__R(),t&&32&e.__u&&(e.type=null),He&&He(e)},(Ge.prototype=new S).__c=function(e,t){var n=t.__c,r=this;r.o??=[],r.o.push(n);var i=Ke(r.__v),a=!1,o=function(){a||r.__z||(a=!0,n.__R=null,i?i(c):c())};n.__R=o;var s=n.__P;n.__P=null;var c=function(){if(!--r.__u){if(r.state.__a){var e=r.state.__a;r.__v.__k[0]=We(e,e.__c.__P,e.__c.__O)}var t;for(r.setState({__a:r.__b=null});t=r.o.pop();)t.__P=s,t.forceUpdate()}};r.__u++||32&t.__u||r.setState({__a:r.__b=r.__v.__k[0]}),e.then(o,o)},Ge.prototype.componentWillUnmount=function(){this.o=[]},Ge.prototype.render=function(e,t){if(this.__b){if(this.__v.__k){var n=document.createElement(`div`),r=this.__v.__k[0].__c;this.__v.__k[0]=Ue(this.__b,n,r.__O=r.__P)}this.__b=null}var i=t.__a&&y(x,null,e.fallback);return i&&(i.__u&=-33),[y(x,null,t.__a?null:e.children),i]};var Je=function(e,t,n){if(++n[1]===n[0]&&e.l.delete(t),e.props.revealOrder&&(e.props.revealOrder[0]!==`t`||!e.l.size))for(n=e.i;n;){for(;n.length>3;)n.pop()();if(n[1]<n[0])break;e.i=n=n[2]}};(qe.prototype=new S).__a=function(e){var t=this,n=Ke(t.__v),r=t.l.get(e);return r[0]++,function(i){var a=function(){t.props.revealOrder?(r.push(i),Je(t,e,r)):i()};n?n(a):a()}},qe.prototype.render=function(e){this.i=null,this.l=/* @__PURE__ */ new Map;var t=k(e.children);e.revealOrder&&e.revealOrder[0]===`b`&&t.reverse();for(var n=t.length;n--;)this.l.set(t[n],this.i=[1,0,this.i]);return e.children},qe.prototype.componentDidUpdate=qe.prototype.componentDidMount=function(){var e=this;this.l.forEach(function(t,n){Je(e,n,t)})};var Ye=typeof Symbol<`u`&&Symbol.for&&Symbol.for(`react.element`)||60103,Xe=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Ze=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,Qe=/[A-Z0-9]/g,$e=typeof document<`u`,et=function(e){return(typeof Symbol<`u`&&typeof Symbol()==`symbol`?/fil|che|rad/:/fil|che|ra/).test(e)};function tt(e,t,n){return t.__k??(t.textContent=``),fe(e,t),typeof n==`function`&&n(),e?e.__c:null}S.prototype.isReactComponent=!0,[`componentWillMount`,`componentWillReceiveProps`,`componentWillUpdate`].forEach(function(e){Object.defineProperty(S.prototype,e,{configurable:!0,get:function(){return this[`UNSAFE_`+e]},set:function(t){Object.defineProperty(this,e,{configurable:!0,writable:!0,value:t})}})});var nt=t.event;t.event=function(e){return nt&&(e=nt(e)),e.persist=function(){},e.isPropagationStopped=function(){return this.cancelBubble},e.isDefaultPrevented=function(){return this.defaultPrevented},e.nativeEvent=e};var rt={configurable:!0,get:function(){return this.class}},it=t.vnode;t.vnode=function(e){typeof e.type==`string`&&function(e){var t=e.props,n=e.type,r={},i=n.indexOf(`-`)==-1;for(var a in t){var o=t[a];if(!(a===`value`&&`defaultValue`in t&&o==null||$e&&a===`children`&&n===`noscript`||a===`class`||a===`className`)){var s=a.toLowerCase();a===`defaultValue`&&`value`in t&&t.value==null?a=`value`:a===`download`&&!0===o?o=``:s===`translate`&&o===`no`?o=!1:s[0]===`o`&&s[1]===`n`?s===`ondoubleclick`?a=`ondblclick`:s!==`onchange`||n!==`input`&&n!==`textarea`||et(t.type)?s===`onfocus`?a=`onfocusin`:s===`onblur`?a=`onfocusout`:Ze.test(a)&&(a=s):s=a=`oninput`:i&&Xe.test(a)?a=a.replace(Qe,`-$&`).toLowerCase():o===null&&(o=void 0),s===`oninput`&&r[a=s]&&(a=`oninputCapture`),r[a]=o}}n==`select`&&(r.multiple&&Array.isArray(r.value)&&(r.value=k(t.children).forEach(function(e){e.props.selected=r.value.indexOf(e.props.value)!=-1})),r.defaultValue!=null&&(r.value=k(t.children).forEach(function(e){e.props.selected=r.multiple?r.defaultValue.indexOf(e.props.value)!=-1:r.defaultValue==e.props.value}))),t.class&&!t.className?(r.class=t.class,Object.defineProperty(r,\"className\",rt)):t.className&&(r.class=r.className=t.className),e.props=r}(e),e.$$typeof=Ye,it&&it(e)};var at=t.__r;t.__r=function(e){at&&at(e),e.__c};var ot=t.diffed;t.diffed=function(e){ot&&ot(e);var t=e.props,n=e.__e;n!=null&&e.type===`textarea`&&`value`in t&&t.value!==n.value&&(n.value=t.value==null?``:t.value)};function st(e){return!!e.__k&&(fe(null,e),!0)}function ct(e){return{render:function(t){tt(t,e)},unmount:function(){st(e)}}}function lt(e,t={}){return e.replace(/\\{(\\w+)\\}/g,(e,n)=>n in t?String(t[n]):e)}function ut(e,t,n,r){let i=`other`;try{i=new Intl.PluralRules(r).select(n)}catch{}return lt(e[`${t}.${i}`]??e[`${t}.other`]??``,{count:n})}var dt=0;Array.isArray;function z(e,n,r,i,a,o){n||={};var s,c,l=n;if(`ref`in l)for(c in l={},n)c==`ref`?s=n[c]:l[c]=n[c];var u={type:e,props:l,key:r,ref:s,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--dt,__i:-1,__u:0,__source:a,__self:o};if(typeof e==`function`&&(s=e.defaultProps))for(c in s)l[c]===void 0&&(l[c]=s[c]);return t.vnode&&t.vnode(u),u}function B({children:e,size:t=20}){return/* @__PURE__ */ z(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,\"aria-hidden\":`true`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:e})}var ft=()=>/* @__PURE__ */ z(B,{children:/* @__PURE__ */ z(`path`,{d:`M12 19V5M5.5 11.5 12 5l6.5 6.5`})}),pt=()=>/* @__PURE__ */ z(B,{children:/* @__PURE__ */ z(`path`,{d:`M20 11.5 12.2 19.3a5 5 0 0 1-7.1-7.1l8.1-8.1a3.4 3.4 0 0 1 4.8 4.8l-8 8a1.8 1.8 0 0 1-2.6-2.6l7.3-7.3`})}),mt=()=>/* @__PURE__ */ z(B,{children:[/* @__PURE__ */ z(`rect`,{x:`9`,y:`3`,width:`6`,height:`11`,rx:`3`}),/* @__PURE__ */ z(`path`,{d:`M5.5 11a6.5 6.5 0 0 0 13 0M12 17.5V21`})]}),ht=({size:e=18})=>/* @__PURE__ */ z(B,{size:e,children:/* @__PURE__ */ z(`path`,{d:`M6 6l12 12M18 6 6 18`})}),gt=()=>/* @__PURE__ */ z(B,{size:18,children:/* @__PURE__ */ z(`path`,{d:`M4 12a8 8 0 1 0 2.4-5.7M4 4v4.5h4.5`})}),_t=()=>/* @__PURE__ */ z(B,{size:18,children:/* @__PURE__ */ z(`path`,{d:`M5 12.5l4.5 4.5L19 7.5`})}),vt=({size:e=16})=>/* @__PURE__ */ z(B,{size:e,children:[/* @__PURE__ */ z(`path`,{d:`M12 3.5c.5 4.3 2.2 6 6.5 6.5-4.3.5-6 2.2-6.5 6.5-.5-4.3-2.2-6-6.5-6.5 4.3-.5 6-2.2 6.5-6.5Z`}),/* @__PURE__ */ z(`path`,{d:`M18.5 15.5c.2 1.6.9 2.3 2.5 2.5-1.6.2-2.3.9-2.5 2.5-.2-1.6-.9-2.3-2.5-2.5 1.6-.2 2.3-.9 2.5-2.5Z`})]}),yt=()=>/* @__PURE__ */ z(B,{size:16,children:/* @__PURE__ */ z(`path`,{d:`M5 12h14M13 6l6 6-6 6`})});function bt(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var xt=bt();function St(e){xt=e}var Ct={exec:()=>null};function wt(e){let t=[];return n=>{let r=Math.max(0,Math.min(3,n-1)),i=t[r];return i||(i=e(r),t[r]=i),i}}function V(e,t=``){let n=typeof e==`string`?e:e.source,r={replace:(e,t)=>{let i=typeof t==`string`?t:t.source;return i=i.replace(H.caret,`$1`),n=n.replace(e,i),r},getRegex:()=>new RegExp(n,t)};return r}var Tt=((e=``)=>{try{return!!RegExp(`(?<=1)(?<!1)`+e)}catch{return!1}})(),H={codeRemoveIndent:/^(?: {0,3}\\t| {1,4})/gm,outputLinkReplace:/\\\\([\\[\\]])/g,indentCodeCompensation:/^(\\s+)(?:```)/,beginningSpace:/^\\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,endingSpaceTabChar:/[ \\t]$/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\\n/g,tabCharGlobal:/\\t/g,leadingSpaceTab:/^[ \\t]+/,multipleSpaceGlobal:/\\s+/g,blankLine:/^[ \\t]*$/,doubleBlankLine:/\\n[ \\t]*\\n[ \\t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\\n {0,3}((?:=+|-+) *)(?=\\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \\t]?/gm,blockquoteMarkerWhitespace:/^( {0,3}>)([ \\t]+)/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\\[[ xX]\\] +\\S/,listReplaceTask:/^\\[[ xX]\\] +/,listTaskCheckbox:/\\[[ xX]\\]/,anyLine:/\\n.*\\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\\||\\| *$/g,tableRowBlankLine:/\\n[ \\t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\\s|>)/i,endPreScriptTag:/^<\\/(pre|code|kbd|script)(\\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/,unicodeAlphaNumeric:/[\\p{L}\\p{N}]/u,numericCharacterReference:/&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));/,numericCharacterReferenceOrAmpersand:/&#(?:(\\d{1,7})|[Xx]([A-Fa-f0-9]{1,6}));|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,escapeTest:/[&<>\"']/,escapeReplace:/[&<>\"']/g,escapeTestNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/,escapeReplaceNoEncode:/[<>\"']|&(?!(#\\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\\w+);)/g,caret:/(^|[^\\[])\\^/g,percentDecode:/%25/g,findPipe:/\\|/g,splitPipe:/ \\|/,slashPipe:/\\\\\\|/g,carriageReturn:/\\r\\n|\\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\\S*/,endingNewline:/\\n$/,listItemRegex:e=>RegExp(`^( {0,3}${e})((?:[ ][^\\\\n]*)?(?:\\\\n|$))`),nextBulletRegex:wt(e=>RegExp(`^ {0,${e}}(?:[*+-]|\\\\d{1,9}[.)])((?:[ ][^\\\\n]*)?(?:\\\\n|$))`)),hrRegex:wt(e=>RegExp(`^ {0,${e}}((?:-[ ]*){3,}|(?:_[ ]*){3,}|(?:\\\\*[ ]*){3,})(?:\\\\n+|$)`)),fencesBeginRegex:wt(e=>RegExp(`^ {0,${e}}(?:\\`\\`\\`|~~~)`)),headingBeginRegex:wt(e=>RegExp(`^ {0,${e}}#{1,6}(?:\\\\s|$)`)),pedanticHeadingBeginRegex:wt(e=>RegExp(`^ {0,${e}}#`)),htmlBeginRegex:wt(e=>RegExp(`^ {0,${e}}(?:</?(?:${Bt})(?: +|$|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)`,`i`)),blockquoteBeginRegex:wt(e=>RegExp(`^ {0,${e}}>`))},Et=/^(?:[ \\t]*(?:\\n|$))+/,Dt=/^((?: {4}| {0,3}\\t)[^\\n]+(?:\\n(?:[ \\t]*(?:\\n|$))*)?)+/,Ot=/^ {0,3}(`{3,}(?=[^`\\n]*(?:\\n|$))|~{3,})([^\\n]*)(?:\\n|$)(?:|([\\s\\S]*?)(?:\\n|$))(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,kt=/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,At=/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,jt=/ {0,3}(?:[*+-]|\\d{1,9}[.)])/,Mt=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\\n(?!\\s*?\\n|bull |fences|blockquote|heading|hr|html|table))+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,Nt=V(Mt).replace(/bull/g,jt).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/\\|table/g,``).getRegex(),Pt=V(Mt).replace(/bull/g,jt).replace(/blockCode/g,/(?: {4}| {0,3}\\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\\s|$)/).replace(/hr/g,/ {0,3}(?:(?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/).replace(/html/g,/ {0,3}<[^\\n>]+>\\n/).replace(/table/g,/ {0,3}\\|?(?:[:\\- ]*\\|)+[\\:\\- ]*\\n/).getRegex(),Ft=/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \\t]+\\n)[^\\n]+)*)/,It=/^[^\\n]+/,Lt=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\])+/,Rt=V(/^ {0,3}\\[(label)\\]: *(?:\\n[ \\t]*)?([^<\\s][^\\s]*|<.*?>)(?:(?: +(?:\\n[ \\t]*)?| *\\n[ \\t]*)(title))? *(?:\\n+|$)/).replace(`label`,Lt).replace(`title`,/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/).getRegex(),zt=V(/^(bull)([ \\t][^\\n]*?)?(?:\\n|$)/).replace(/bull/g,jt).getRegex(),Bt=`address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul`,Vt=/<!--(?:-?>|[\\s\\S]*?(?:-->|$))/,Ht=V(`^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n*|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>[^\\\\n]*\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>[^\\\\n]*\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>[^\\\\n]*\\\\n*|$)|</?(tag)(?:[ \\\\t]+|\\\\n|/?>|$)[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$)|<(?!(?:script|pre|style|textarea)(?![a-z0-9-]))([a-z][a-z0-9-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$)|</[a-z][a-z0-9-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n[ ]*)+\\\\n|$))`,`i`).replace(`comment`,Vt).replace(`tag`,Bt).replace(`attribute`,/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),Ut=e=>V(Ft).replace(`hr`,kt).replace(`heading`,` {0,3}#{1,6}(?:\\\\s|$)`).replace(`|lheading`,``).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`fences`,\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(`list`,e).replace(`html`,` {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)`).replace(`tag`,Bt).getRegex(),Wt=Ut(/ {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]/),Gt=Ut(/ {0,3}(?:[*+-]|\\d{1,9}[.)])(?:[ \\t]|\\n|$)/),Kt={blockquote:V(/^( {0,3}> ?(?:(?![ \\t]*(?:\\n|$))(paragraph)|[^\\n]*)(?:\\n|$))+/).replace(`paragraph`,Gt).getRegex(),code:Dt,def:Rt,fences:Ot,heading:At,hr:kt,html:Ht,lheading:Nt,list:zt,newline:Et,paragraph:Wt,table:Ct,text:It},qt=V(`^ *([^\\\\n ].*)\\\\n {0,3}((?:\\\\| *)?:?-+:? *(?:\\\\| *:?-+:? *)*(?:\\\\| *)?)(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)`).replace(`hr`,kt).replace(`heading`,` {0,3}#{1,6}(?:\\\\s|$)`).replace(`blockquote`,` {0,3}>`).replace(`code`,`(?: {4}| {0,3} )[^\\\\n]`).replace(`fences`,\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\\\t]`).replace(`html`,` {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)`).replace(`tag`,Bt).getRegex(),Jt={...Kt,lheading:Pt,table:qt,paragraph:V(Ft).replace(`hr`,kt).replace(`heading`,` {0,3}#{1,6}(?:\\\\s|$)`).replace(`|lheading`,``).replace(`table`,qt).replace(`blockquote`,` {0,3}>`).replace(`fences`,\" {0,3}(?:`{3,}(?=[^`\\\\n]*(?:\\\\n|$))|~~~)[^\\\\n]*(?:\\\\n|$)\").replace(`list`,` {0,3}(?:[*+-]|1[.)])[ \\\\t]+[^ \\\\t\\\\n]`).replace(`html`,` {0,3}(?:</?(?:tag)(?: +|\\\\n|/?>)|<(?:(?:script|pre|style|textarea)(?:[\\\\s>]|$)|!--)|<\\\\?|<![A-Za-z]|<!\\\\[CDATA\\\\[)`).replace(`tag`,Bt).getRegex()},Yt={...Kt,html:V(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(`comment`,Vt).replace(/tag/g,`(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b`).getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:Ct,lheading:/^(.+?)\\n {0,3}(=+|-+) *(?:\\n+|$)/,paragraph:V(Ft).replace(`hr`,kt).replace(`heading`,` *#{1,6} *[^\n]`).replace(`lheading`,Nt).replace(`|table`,``).replace(`blockquote`,` {0,3}>`).replace(`|fences`,``).replace(`|list`,``).replace(`|html`,``).replace(`|tag`,``).getRegex()},Xt=/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,Zt=/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,Qt=/^( {2,}|\\\\)\\n(?!\\s*$)[ \\t]*/,$t=/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,U=/[\\p{P}\\p{S}]/u,en=/[\\s\\p{P}\\p{S}]/u,tn=/[^\\s\\p{P}\\p{S}]/u,nn=V(/^((?![*_])punctSpace)/,`u`).replace(/punctSpace/g,en).getRegex(),rn=/[\\p{Pi}\\p{Ps}\"']/u,an=/(?!~)[\\p{P}\\p{S}]/u,on=/(?!~)[\\s\\p{P}\\p{S}]/u,sn=/(?:[^\\s\\p{P}\\p{S}]|~)/u,cn=V(/link|precode-code|html/,`g`).replace(`link`,/\\[(?:[^\\[\\]`]|(?<a>`+)[^`]+\\k<a>(?!`))*?\\]\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)]|\\((?:\\\\[\\s\\S]|[^\\\\\\(\\)])*\\))*\\)/).replace(`precode-`,Tt?\"(?<!`)()\":\"(^^|[^`])\").replace(`code`,/(?<b>`+)[^`]+\\k<b>(?!`)/).replace(`html`,/<(?! )[^<>]*?>/).getRegex(),ln=/^(?:\\*+(?:((?!\\*)punct)|([^\\s*]))?)|^_+(?:((?!_)punct)|([^\\s_]))?/,un=V(ln,`u`).replace(/punct/g,U).getRegex(),dn=V(ln,`u`).replace(/punct/g,an).getRegex(),fn=V(/^(?:\\*+(?:((?!\\*)(?!openQuote)punct)|([^\\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\\s_]))?/,`u`).replace(/openQuote/g,rn).replace(/punct/g,U).getRegex(),pn=`^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)punctSpace(\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|notPunctSpace(\\\\*+)(?=notPunctSpace)`,mn=V(pn,`gu`).replace(/notPunctSpace/g,tn).replace(/punctSpace/g,en).replace(/punct/g,U).getRegex(),hn=V(pn,`gu`).replace(/notPunctSpace/g,sn).replace(/punctSpace/g,on).replace(/punct/g,an).getRegex(),gn=V(`^[^_*]*?__[^_*]*?\\\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\\\*)punct(\\\\*+)(?=[\\\\s]|$)|notPunctSpace(\\\\*+)(?!\\\\*)(?=punctSpace|$)|(?!\\\\*)[\\\\s](\\\\*+)(?=notPunctSpace)|[\\\\s](\\\\*+)(?!\\\\*)(?=punct)|(?!\\\\*)punct(\\\\*+)(?!\\\\*)(?=punct)|(?:(?!\\\\*)punct|notPunctSpace)(\\\\*+)(?!\\\\*)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,tn).replace(/punctSpace/g,en).replace(/punct/g,U).getRegex(),_n=V(`^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)`,`gu`).replace(/notPunctSpace/g,tn).replace(/punctSpace/g,en).replace(/punct/g,U).getRegex(),vn=V(`^[^_*]*?\\\\*\\\\*[^_*]*?_[^_*]*?(?=\\\\*\\\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\\\s](_+)(?=notPunctSpace)|[\\\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,tn).replace(/punctSpace/g,en).replace(/punct/g,U).getRegex(),yn=V(/^~~?(?:((?!~)punct)|[^\\s~])/,`u`).replace(/punct/g,U).getRegex(),bn=V(`^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)`,`gu`).replace(/notPunctSpace/g,tn).replace(/punctSpace/g,en).replace(/punct/g,U).getRegex(),xn=V(/\\\\(punct)/,`gu`).replace(/punct/g,U).getRegex(),Sn=V(/(`+)(?:[^`]|[^`][\\s\\S]*?[^`])\\1(?!`)|`+|\\\\(punct)/,`gu`).replace(/punct/g,U).getRegex(),Cn=V(/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/).replace(`scheme`,/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace(`email`,/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),wn=V(Vt).replace(`(?:-->|$)`,`-->`).getRegex(),Tn=V(`^comment|^</[a-zA-Z][a-zA-Z0-9-]*\\\\s*>|^<[a-zA-Z][a-zA-Z0-9-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>`).replace(`comment`,wn).replace(`attribute`,/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/).getRegex(),En=/\\[(?:\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]/,Dn=V(/(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\])|[^\\[\\]\\\\`])*?/).replace(`brackets`,En).getRegex(),On=V(/^!?\\[(label)\\]\\([ \\t\\n]*(href)(?:(?:[ \\t]+(?:\\n[ \\t]*)?|\\n[ \\t]*)(title))?[ \\t\\n]*\\)/).replace(`label`,Dn).replace(`href`,/<(?:\\\\.|[^\\n<>\\\\])+>|[^ \\t\\n\\x00-\\x1f]+|(?=\\))/).replace(`title`,/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/).getRegex(),kn=V(/^!?\\[(label)\\]\\[(ref)\\]/).replace(`label`,Dn).replace(`ref`,Lt).getRegex(),An=V(/^!?\\[(ref)\\](?:\\[\\])?/).replace(`ref`,Lt).getRegex(),jn=/(?!\\s*\\])(?:\\\\[\\s\\S]|[^\\[\\]\\\\]){1,999}/,Mn=V(/(?:[^\\[\\]\\\\`]*(?:\\[(?:brackets|\\\\[\\s\\S]|[^\\[\\]\\\\])*\\]|\\\\[\\s\\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\\]))){0,999}?[^\\[\\]\\\\`]*?/).replace(`brackets`,En).getRegex(),Nn=V(`reflink|nolink(?!\\\\()`,`g`).replace(`reflink`,V(/^!?\\[(label)\\]\\[(ref)\\]/).replace(`label`,Mn).replace(`ref`,jn).getRegex()).replace(`nolink`,V(/^!?\\[(ref)\\](?:\\[\\])?/).replace(`ref`,jn).getRegex()).getRegex(),Pn=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Fn=V(/(?:mailto:email|xmpp:email(?:\\/[A-Za-z0-9@.]+)?)/).replace(/email/g,/[A-Za-z0-9._+-]+@[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/).getRegex(),In={_backpedal:Ct,anyPunctuation:xn,anyPunctuationOutsideCode:Sn,autolink:Cn,blockSkip:cn,br:Qt,code:Zt,del:Ct,delLDelim:Ct,delRDelim:Ct,emStrongLDelim:un,emStrongRDelimAst:mn,emStrongRDelimUnd:_n,escape:Xt,link:On,nolink:An,punctuation:nn,reflink:kn,reflinkSearch:Nn,tag:Tn,text:$t,url:Ct},Ln={...In,emStrongLDelim:fn,emStrongRDelimAst:gn,emStrongRDelimUnd:vn,link:V(/^!?\\[(label)\\]\\((.*?)\\)/).replace(`label`,Dn).getRegex(),reflink:V(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(`label`,Dn).getRegex()},Rn={...In,emStrongRDelimAst:hn,emStrongLDelim:dn,delLDelim:yn,delRDelim:bn,url:V(/^emailProtocol|^((?:protocol):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/).replace(`emailProtocol`,Fn).replace(`protocol`,Pn).replace(`email`,/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![\\w-])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'\"~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'\"~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])((?:\\\\[\\s\\S]|[^\\\\])*?(?:\\\\[\\s\\S]|[^\\s~\\\\]))\\1(?=[^~]|$)/,text:V(/^(?:[^a-zA-Z0-9](?=emailProtocol)|(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|protocol:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9](?=emailProtocol)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@))))/).replace(`protocol`,Pn).replace(/emailProtocol/g,/(?:mailto|xmpp):/).getRegex()},zn={...Rn,br:V(Qt).replace(`{2,}`,`*`).getRegex(),text:V(Rn.text).replace(`\\\\b_`,`\\\\b_| {2,}\\\\n`).replace(/\\{2,\\}/g,`*`).getRegex()},Bn={normal:Kt,gfm:Jt,pedantic:Yt},Vn={normal:In,gfm:Rn,breaks:zn,pedantic:Ln},Hn={\"&\":`&amp;`,\"<\":`&lt;`,\">\":`&gt;`,'\"':`&quot;`,\"'\":`&#39;`},Un=e=>Hn[e];function W(e,t){if(t){if(H.escapeTest.test(e))return e.replace(H.escapeReplace,Un)}else if(H.escapeTestNoEncode.test(e))return e.replace(H.escapeReplaceNoEncode,Un);return e}function Wn(e){return H.numericCharacterReference.test(e)?e.replace(H.numericCharacterReferenceOrAmpersand,(e,t,n)=>{if(t===void 0&&n===void 0)return`&amp;`;let r=t===void 0?Number.parseInt(n,16):Number.parseInt(t,10);return r===0||r>1114111||r>=55296&&r<=57343?`�`:r===38?`&amp;`:String.fromCodePoint(r)}):e}function Gn(e){try{e=encodeURI(e).replace(H.percentDecode,`%`)}catch{return null}return e}function Kn(e,t){let n=e.replace(H.findPipe,(e,t,n)=>{let r=!1,i=t;for(;--i>=0&&n[i]===`\\\\`;)r=!r;return r?`|`:` |`}).split(H.splitPipe),r=0;if(n[0].trim()||n.shift(),n.length>0&&!n.at(-1)?.trim()&&n.pop(),t){if(n.length>t)n.splice(t);else for(;n.length<t;)n.push(``)}for(;r<n.length;r++)n[r]=n[r].trim().replace(H.slashPipe,`|`);return n}function G(e,t,n){let r=e.length;if(r===0)return``;let i=0;for(;i<r;){let a=e.charAt(r-i-1);if(a===t&&!n)i++;else if(a!==t&&n)i++;else break}return e.slice(0,r-i)}function qn(e){let t=e.split(`\n`),n=t.length-1;for(;n>=0&&H.blankLine.test(t[n]);)n--;return t.length-n<=2?e:t.slice(0,n+1).join(`\n`)}function Jn(e){return e.trim().toLowerCase().toUpperCase().toLowerCase()}function Yn(e,t){if(e.indexOf(t[0])===-1&&e.indexOf(t[1])===-1)return-1;let n=0;for(let r=0;r<e.length;r++)if(e[r]===`\\\\`)r++;else if(e[r]===t[0])n++;else if(e[r]===t[1]&&(n--,n<0))return r;return n>0?-2:-1}function Xn(e,t=0){let n=t,r=``;for(let t of e)if(t===` `){let e=4-n%4;r+=` `.repeat(e),n+=e}else r+=t,n++;return r}function Zn(e,t,n,r,i){let a=t.href,o=t.title||null,s=e[1].replace(i.other.outputLinkReplace,`$1`),c=e[0].charAt(0)===`!`,l=r.state.inLink,u=r.state.linkEmitted,d=r.state.inRawBlock;r.state.inLink=!0,r.state.linkEmitted=!1;let f=r.inlineTokens(s),p=r.state.linkEmitted;if(r.state.linkEmitted=u,r.state.inLink=l,!c){if(p){r.state.inRawBlock=d;return}r.state.linkEmitted=!0}return{type:c?`image`:`link`,raw:n,href:a,title:o,text:s,tokens:f}}function Qn(e,t,n){let r=e.match(n.other.indentCodeCompensation);if(r===null)return t;let i=r[1];return t.split(`\n`).map(e=>{let t=e.match(n.other.beginningSpace);if(t===null)return e;let[r]=t;return e.slice(Math.min(r.length,i.length))}).join(`\n`)}function $n(e,t,n,r){if(!t.includes(`<`))return!1;for(let i=0;i<t.length;i++){if(t[i]===`\\\\`){i++;continue}if(t[i]===\"`\"){let e=r.inline.code.exec(t.slice(i));if(e){i+=e[0].length-1;continue}}if(t[i]!==`<`)continue;let a=e.slice(n+i),o=r.inline.tag.exec(a)||r.inline.autolink.exec(a);if(o){if(o[0].length>t.length-i)return!0;i+=o[0].length-1}}return!1}var er=class{options;rules;lexer;constructor(e){this.options=e||xt}space(e){let t=this.rules.block.newline.exec(e);if(t&&t[0].length>0)return{type:`space`,raw:t[0]}}code(e){let t=this.rules.block.code.exec(e);if(t){let e=this.options.pedantic?t[0]:qn(t[0]);return{type:`code`,raw:e,codeBlockStyle:`indented`,text:e.replace(this.rules.other.codeRemoveIndent,``)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let e=t[0],n=Qn(e,t[3]||``,this.rules);return{type:`code`,raw:e,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,`$1`):t[2],text:n}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let e=t[2].trim();if(this.rules.other.endingHash.test(e)){let t=G(e,`#`);(this.options.pedantic||!t||this.rules.other.endingSpaceTabChar.test(t))&&(e=t.trim())}return{type:`heading`,raw:G(t[0],`\n`),depth:t[1].length,text:e,tokens:this.lexer.inline(e)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:`hr`,raw:G(t[0],`\n`)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let e=G(t[0],`\n`).split(`\n`),n=``,r=``,i=[];for(;e.length>0;){let t=!1,a=[],o=0;for(;o<e.length;o++)if(this.rules.other.blockquoteStart.test(e[o]))a.push(e[o]),t=!0;else if(!t)a.push(e[o]);else break;e=e.slice(o);let s=a.join(`\n`),c=s.replace(this.rules.other.blockquoteMarkerWhitespace,(e,t,n)=>t+Xn(n,t.length)).replace(this.rules.other.blockquoteSetextReplace,`\n $1`).replace(this.rules.other.blockquoteSetextReplace2,``);n=n?`${n}\n${s}`:s,r=r?`${r}\n${c}`:c;let l=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(c,i,!0),this.lexer.state.top=l,e.length===0)break;let u=i.at(-1);if(u?.type===`code`||u?.type===`heading`||u?.type===`hr`||u?.type===`html`)break;if(u?.type===`blockquote`){let t=u,a=e.join(`\n`),o=t.raw+`\n`+a.replace(this.rules.other.blockquoteSetextReplace2,``),s=this.blockquote(o);i[i.length-1]=s;let c=o.substring(s.raw.length).replace(/^\\n/,``),l=c?c.split(`\n`).length:0,d=l?e.slice(0,-l):e;d.length>0&&(n=`${n}\n${d.join(`\n`)}`),r=r.substring(0,r.length-t.text.length)+s.text;break}if(u?.type===`list`){let t=u,a=t.raw+`\n`+e.join(`\n`),o=this.list(a);i[i.length-1]=o;let s=o.raw.length>t.raw.length?a.slice(t.raw.length+1,o.raw.length).split(`\n`).length:0;if(s>0){let t=e.slice(0,s).join(`\n`);n=`${n}\n${t}`,r=`${r}\n${t}`}e=e.slice(s)}}return{type:`blockquote`,raw:n,tokens:i,text:r}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=e,r=()=>n.length-e.length,i=t[1].trim(),a=i.length>1,o={type:`list`,raw:``,ordered:a,start:a?+i.slice(0,-1):``,loose:!1,items:[]};i=a?`\\\\d{1,9}\\\\${i.slice(-1)}`:`\\\\${i}`,this.options.pedantic&&(i=a?i:`[*+-]`);let s=this.rules.other.listItemRegex(i),c=!1;for(;e;){let i=!1,a=``;if(!(t=s.exec(e))||this.rules.block.hr.test(e))break;let l=r();e=e.substring(t[0].length);let u=t[2].split(`\n`,1)[0],d=t[1].length,f=this.options.pedantic?Xn(u,d):u.replace(this.rules.other.leadingSpaceTab,e=>Xn(e,d)),p=e.split(`\n`,1)[0],m=!f.trim(),h=0;if(this.options.pedantic?(h=2,a=f.trimStart()):m?h=d+1:(h=f.search(this.rules.other.nonSpaceChar),h=h>4?1:h,a=f.slice(h),h+=d),m&&this.rules.other.blankLine.test(p)&&(e=e.substring(p.length+1),i=!0),!i){let t=this.rules.other.nextBulletRegex(h),n=this.rules.other.hrRegex(h),r=this.rules.other.fencesBeginRegex(h),i=this.options.pedantic?this.rules.other.pedanticHeadingBeginRegex(h):this.rules.other.headingBeginRegex(h),o=this.rules.other.htmlBeginRegex(h),s=this.rules.other.blockquoteBeginRegex(h);for(;e;){let c=e.split(`\n`,1)[0],l;if(p=c,this.options.pedantic?(p=p.replace(this.rules.other.listReplaceNesting,` `),l=p):l=p.replace(this.rules.other.leadingSpaceTab,e=>Xn(e)),r.test(p)||i.test(p)||o.test(p)||s.test(p)||t.test(p)||n.test(p))break;if(l.search(this.rules.other.nonSpaceChar)>=h||!p.trim())a+=`\n`+l.slice(h);else{if(m||f.replace(this.rules.other.tabCharGlobal,` `).search(this.rules.other.nonSpaceChar)>=4||r.test(f)||i.test(f)||n.test(f))break;let e=!this.options.pedantic&&/^ {0,3}(?:=+|-+) *$/.test(p)&&this.rules.block.lheading.test(`${f}\n${p}`)?` ${l.replace(/^ {0,3}/,``)}`:p;a+=`\n`+e}m=!p.trim(),e=e.substring(c.length+1),f=l.slice(h)}}let g=n.slice(l,r());o.loose||(c?o.loose=!0:this.rules.other.doubleBlankLine.test(g)&&(c=!0)),o.items.push({type:`list_item`,raw:g,task:!!this.options.gfm&&this.rules.other.listIsTask.test(a),loose:!1,text:a,tokens:[]})}let l=o.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;o.raw=n.slice(0,r()).trimEnd();for(let e of o.items)if(this.lexer.state.top=!1,e.tokens=this.lexer.blockTokens(e.text,[]),!o.loose){let t=e.tokens.filter(e=>e.type===`space`);o.loose=t.length>0&&t.some(e=>this.rules.other.anyLine.test(e.raw))}for(let e of o.items){let t=e.tokens[0];if(e.task&&(t?.type===`text`||t?.type===`paragraph`)){e.text=e.text.replace(this.rules.other.listReplaceTask,``),t.raw=t.raw.replace(this.rules.other.listReplaceTask,``),t.text=t.text.replace(this.rules.other.listReplaceTask,``);for(let e=this.lexer.inlineQueue.length-1;e>=0;e--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[e].src)){this.lexer.inlineQueue[e].src=this.lexer.inlineQueue[e].src.replace(this.rules.other.listReplaceTask,``);break}let n=this.rules.other.listTaskCheckbox.exec(e.raw);if(n){let t={type:`checkbox`,raw:n[0]+` `,checked:n[0]!==`[ ]`};e.checked=t.checked,o.loose?e.tokens[0]&&[`paragraph`,`text`].includes(e.tokens[0].type)&&`tokens`in e.tokens[0]&&e.tokens[0].tokens?(e.tokens[0].raw=t.raw+e.tokens[0].raw,e.tokens[0].text=t.raw+e.tokens[0].text,e.tokens[0].tokens.unshift(t)):e.tokens.unshift({type:`paragraph`,raw:t.raw,text:t.raw,tokens:[t]}):e.tokens.unshift(t)}}else e.task&&=!1}if(o.loose)for(let e of o.items){e.loose=!0;for(let t of e.tokens)t.type===`text`&&(t.type=`paragraph`)}return o}}html(e){let t=this.rules.block.html.exec(e);if(t){let e=qn(t[0]);return{type:`html`,block:!0,raw:e,pre:t[1]===`pre`||t[1]===`script`||t[1]===`style`,text:e}}}def(e){let t=this.rules.block.def.exec(e);if(t){if(!this.rules.other.startAngleBracket.test(t[2])&&Yn(t[2],`()`)!==-1)return;let e=Jn(t[1]).replace(this.rules.other.multipleSpaceGlobal,` `),n=t[2]?t[2].replace(this.rules.other.hrefBrackets,`$1`).replace(this.rules.inline.anyPunctuation,`$1`):``,r=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,`$1`):t[3];return{type:`def`,tag:e,raw:G(t[0],`\n`),href:n,title:r}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=Kn(t[1]),r=t[2].replace(this.rules.other.tableAlignChars,``).split(`|`),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,``).split(`\n`):[],a={type:`table`,raw:G(t[0],`\n`),header:[],align:[],rows:[]};if(n.length===r.length){for(let e of r)this.rules.other.tableAlignRight.test(e)?a.align.push(`right`):this.rules.other.tableAlignCenter.test(e)?a.align.push(`center`):this.rules.other.tableAlignLeft.test(e)?a.align.push(`left`):a.align.push(null);for(let e=0;e<n.length;e++)a.header.push({text:n[e],tokens:this.lexer.inline(n[e]),header:!0,align:a.align[e]});for(let e of i)a.rows.push(Kn(e,a.header.length).map((e,t)=>({text:e,tokens:this.lexer.inline(e),header:!1,align:a.align[t]})));return a}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t){let e=t[1].trim();return{type:`heading`,raw:G(t[0],`\n`),depth:t[2].charAt(0)===`=`?1:2,text:e,tokens:this.lexer.inline(e)}}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let e=t[1].charAt(t[1].length-1)===`\n`?t[1].slice(0,-1):t[1];return{type:`paragraph`,raw:t[0],text:e,tokens:this.lexer.inline(e)}}}text(e){let t=this.rules.block.text.exec(e);if(t)return{type:`text`,raw:t[0],text:t[0],tokens:this.lexer.inline(t[0])}}escape(e){let t=this.rules.inline.escape.exec(e);if(t)return{type:`escape`,raw:t[0],text:t[1]}}tag(e){let t=this.rules.inline.tag.exec(e);if(t)return!this.lexer.state.inLink&&this.rules.other.startATag.test(t[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(t[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(t[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(t[0])&&(this.lexer.state.inRawBlock=!1),{type:`html`,raw:t[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:t[0]}}link(e){if(this.lexer.state.linkParenPossible===!1)return;let t=this.rules.inline.link.exec(e);if(t){let n=t[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&$n(e,t[1],n,this.rules))return;let r=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(r)){if(!this.rules.other.endAngleBracket.test(r))return;let e=G(r.slice(0,-1),`\\\\`);if((r.length-e.length)%2==0)return}else{let e=Yn(t[2],`()`);if(e===-2)return;if(e>-1){let n=(t[0].indexOf(`!`)===0?5:4)+t[1].length+e;t[2]=t[2].substring(0,e),t[0]=t[0].substring(0,n).trim(),t[3]=``}}let i=t[2],a=``;if(this.options.pedantic){let e=this.rules.other.pedanticHrefTitle.exec(i);e&&(i=e[1],a=e[3])}else a=t[3]?t[3].slice(1,-1):``;return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(i=this.options.pedantic&&!this.rules.other.endAngleBracket.test(r)?i.slice(1):i.slice(1,-1)),Zn(t,{href:i&&i.replace(this.rules.inline.anyPunctuation,`$1`),title:a&&a.replace(this.rules.inline.anyPunctuation,`$1`)},t[0],this.lexer,this.rules)}}reflink(e,t){let n;if((n=this.rules.inline.reflink.exec(e))||(n=this.rules.inline.nolink.exec(e))){let r=n[0].charAt(0)===`!`?2:1;if(!this.options.pedantic&&$n(e,n[1],r,this.rules))return;let i=t[Jn((n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal,` `))];if(!i){let e=n[0].charAt(0);return{type:`text`,raw:e,text:e}}return Zn(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=``){let r=this.rules.inline.emStrongLDelim.exec(e);if(!r||!r[1]&&!r[2]&&!r[3]&&!r[4])return;let i=r[0][0],a=n===i,o=t.length-e.length,s=o;for(;!this.options.pedantic&&s>0&&t[s-1]===i;)s--;let c=[...t.slice(Math.max(0,s-2),s)].at(-1)??``,l=c===`*`||c===`_`||!!this.rules.inline.punctuation.exec(c);s<o&&(n=c);let u=s<o?l:!!this.rules.inline.punctuation.exec(n);if(r[4]&&n.match(this.rules.other.unicodeAlphaNumeric))return;let d=r[1]||r[3]||``;if(!d||!n||u){let n=[...r[0]].length-1,u,f,p=n,m=0,h=o-s+n,g=!this.options.pedantic&&!!c.trim()&&(!!d||i===`*`&&!l),_=i===`*`?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(_.lastIndex=0,t=t.slice(-1*e.length+n);(r=_.exec(t))!==null;){if(u=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!u)continue;if(f=[...u].length,r[3]||r[4]){p+=f;continue}if(r[5]||r[6]||g){if(a&&(r[5]||r[6]))break;if(h%3&&!((h+f)%3)){m+=f;continue}}if(p-=f,p>0)continue;f=Math.min(f,f+p+m);let t=[...r[0]][0].length,i=e.slice(0,n+r.index+t+f);if(Math.min(n,f)%2){let e=i.slice(1,-1);return{type:`em`,raw:i,text:e,tokens:this.lexer.inlineTokens(e)}}let o=i.slice(2,-2);return{type:`strong`,raw:i,text:o,tokens:this.lexer.inlineTokens(o)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let e=t[2].replace(this.rules.other.newLineCharGlobal,` `),n=this.rules.other.nonSpaceChar.test(e),r=this.rules.other.startingSpaceChar.test(e)&&this.rules.other.endingSpaceChar.test(e);return n&&r&&(e=e.substring(1,e.length-1)),{type:`codespan`,raw:t[0],text:e}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:`br`,raw:t[0]}}del(e,t,n=``){let r=this.rules.inline.delLDelim.exec(e);if(r&&(!r[1]||!n||this.rules.inline.punctuation.exec(n))){let n=[...r[0]].length-1,i,a,o=n,s=this.rules.inline.delRDelim;for(s.lastIndex=0,t=t.slice(-1*e.length+n);(r=s.exec(t))!==null;){if(i=r[1]||r[2]||r[3]||r[4]||r[5]||r[6],!i||(a=[...i].length,a!==n))continue;if(r[3]||r[4]){o+=a;continue}if(o-=a,o>0)continue;a=Math.min(a,a+o);let t=[...r[0]][0].length,s=e.slice(0,n+r.index+t+a),c=s.slice(n,-n);return{type:`del`,raw:s,text:c,tokens:this.lexer.inlineTokens(c)}}}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let e,n;return t[2]===`@`?(e=t[1],n=`mailto:`+e):(e=t[1],n=e),{type:`link`,raw:t[0],text:e,href:n,autolink:!0,tokens:[{type:`text`,raw:e,text:e}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let e,n;if(t[2]===`@`)e=t[0],n=`mailto:`+e;else{let r;do r=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??``;while(r!==t[0]);e=t[0],n=t[1]===`www.`?`http://`+t[0]:t[0]}return{type:`link`,raw:t[0],text:e,href:n,autolink:!0,tokens:[{type:`text`,raw:e,text:e}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let e=this.lexer.state.inRawBlock;return{type:`text`,raw:t[0],text:e?t[0]:Wn(t[0]),escaped:e}}}},K=class e{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||xt,this.options.tokenizer=this.options.tokenizer||new er,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,linkParenPossible:!0,top:!0};let t={other:H,block:Bn.normal,inline:Vn.normal};this.options.pedantic?(t.block=Bn.pedantic,t.inline=Vn.pedantic):this.options.gfm&&(t.block=Bn.gfm,t.inline=this.options.breaks?Vn.breaks:Vn.gfm),this.tokenizer.rules=t}static get rules(){return{block:Bn,inline:Vn}}static lex(t,n){return new e(n).lex(t)}static lexInline(t,n){return new e(n).inlineTokens(t)}lex(e){e=e.replace(H.carriageReturn,`\n`),this.blockTokens(e,this.tokens);for(let e=0;e<this.inlineQueue.length;e++){let t=this.inlineQueue[e];this.state.inRawBlock=!1,this.inlineTokens(t.src,t.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],n=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(H.tabCharGlobal,` `).replace(H.spaceLine,``));let r=1/0;for(;e;){if(e.length<r)r=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let i;if(this.options.extensions?.block?.some(n=>(i=n.call({lexer:this},e,t))?(e=e.substring(i.raw.length),t.push(i),!0):!1))continue;if(i=this.tokenizer.space(e)){e=e.substring(i.raw.length);let n=t.at(-1);i.raw.length===1&&n!==void 0?n.raw+=`\n`:t.push(i);continue}if(i=this.tokenizer.code(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`paragraph`||n?.type===`text`?(n.raw+=(n.raw.endsWith(`\n`)?``:`\n`)+i.raw,n.text+=`\n`+i.text,this.inlineQueue.at(-1).src=n.text):t.push(i);continue}if((i=this.tokenizer.fences(e))||(i=this.tokenizer.heading(e))||(i=this.tokenizer.hr(e))||(i=this.tokenizer.blockquote(e))||(i=this.tokenizer.list(e))||(i=this.tokenizer.html(e))){e=e.substring(i.raw.length),t.push(i);continue}if(i=this.tokenizer.def(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`paragraph`||n?.type===`text`?(n.raw+=(n.raw.endsWith(`\n`)?``:`\n`)+i.raw,n.text+=`\n`+i.raw,this.inlineQueue.at(-1).src=n.text):(this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title}),t.push(i));continue}if((i=this.tokenizer.table(e))||(i=this.tokenizer.lheading(e))){e=e.substring(i.raw.length),t.push(i);continue}let a=e;if(this.options.extensions?.startBlock){let t=1/0,n=e.slice(1),r;this.options.extensions.startBlock.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(a=e.substring(0,t+1))}if(this.state.top&&(i=this.tokenizer.paragraph(a))){let r=t.at(-1);n&&r?.type===`paragraph`?(r.raw+=(r.raw.endsWith(`\n`)?``:`\n`)+i.raw,r.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):t.push(i),n=a.length!==e.length,e=e.substring(i.raw.length)}else if(i=this.tokenizer.text(e)){e=e.substring(i.raw.length);let n=t.at(-1);n?.type===`text`?(n.raw+=(n.raw.endsWith(`\n`)?``:`\n`)+i.raw,n.text+=`\n`+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=n.text):t.push(i)}else if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes(`[`))return!1;let t=this.tokenizer.rules.inline.link;for(let n of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(n[0])&&e.charAt(n.index-1)!==`!`)return!0;for(let t of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let e=t[0],n=e.lastIndexOf(`[`);if(e.charAt(0)!==`!`&&Object.hasOwn(this.tokens.links,Jn(e.slice(n+1,-1)))&&!(n>1&&this.linkInText(e.slice(1,n-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let n=this.state.linkParenPossible;this.state.linkParenPossible=n&&e.includes(`)`);try{return this.#e(e,t)}finally{this.state.linkParenPossible=n}}#e(e,t){let n=e.includes(`*`)||e.includes(`_`)||e.includes(`~`)||this.options.hooks?.emStrongMask||this.tokenizer.emStrong!==er.prototype.emStrong||this.tokenizer.del!==er.prototype.del?this.#t(e):e,r=!1,i=``,a=1/0;for(;e;){if(e.length<a)a=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}r||(i=``),r=!1;let o;if(this.options.extensions?.inline?.some(n=>(o=n.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if((o=this.tokenizer.escape(e))||(o=this.tokenizer.tag(e))||(o=this.tokenizer.link(e))){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let n=t.at(-1);o.type===`text`&&n?.type===`text`?(n.raw+=o.raw,n.text+=o.text):t.push(o);continue}if((o=this.tokenizer.emStrong(e,n,i))||(o=this.tokenizer.codespan(e))||(o=this.tokenizer.br(e))||(o=this.tokenizer.del(e,n,i))||(o=this.tokenizer.autolink(e))||!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let s=e;if(this.options.extensions?.startInline){let t=1/0,n=e.slice(1),r;this.options.extensions.startInline.forEach(e=>{r=e.call({lexer:this},n),typeof r==`number`&&r>=0&&(t=Math.min(t,r))}),t<1/0&&t>=0&&(s=e.substring(0,t+1))}if(o=this.tokenizer.inlineText(s)){e=e.substring(o.raw.length),o.raw.slice(-1)!==`_`&&(i=o.raw.slice(-1)),r=!0;let n=t.at(-1);n?.type===`text`?(n.raw+=o.raw,n.text+=o.text):t.push(o)}else if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}#t(e){let t=e;if(this.tokens.links&&e.includes(`[`)){let e=this.tokenizer.rules.inline.reflinkSearch,n=t=>{let r=t.lastIndexOf(`[`);if(!Object.hasOwn(this.tokens.links,Jn(t.slice(r+1,-1))))return t;if(r>1&&t.charAt(0)!==`!`){let i=t.slice(1,r-1);if(this.linkInText(i))return`[`+i.replace(e,n)+`][`+`a`.repeat(t.length-r-2)+`]`}return`[`+`a`.repeat(t.length-2)+`]`};t=t.replace(e,n)}return t=t.replace(this.tokenizer.rules.inline.anyPunctuationOutsideCode,(e,t,n)=>n?`+`.repeat(e.length):t?t+e.slice(t.length,-t.length).replace(/`/g,`+`)+t:e),t=t.replace(this.tokenizer.rules.inline.blockSkip,(e,t,n)=>{let r=n?n.length:0;return e.slice(0,r)+`[`+`a`.repeat(e.length-r-2)+`]`}),t=this.options.hooks?.emStrongMask?.call({lexer:this},t)??t,t}infiniteLoopError(e){let t=`Infinite loop on byte: `+e;if(this.options.silent)console.error(t);else throw Error(t)}},tr=class{options;parser;constructor(e){this.options=e||xt}space(e){return``}code({text:e,lang:t,escaped:n}){let r=(t||``).match(H.notSpaceStart)?.[0],i=e?e.replace(H.endingNewline,``)+`\n`:``;return r?`<pre><code class=\"language-`+W(r)+`\">`+(n?i:W(i,!0))+`</code></pre>\n`:`<pre><code>`+(n?i:W(i,!0))+`</code></pre>\n`}blockquote({tokens:e}){return`<blockquote>\n${this.parser.parse(e)}</blockquote>\n`}html({text:e}){return e}def(e){return``}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>\n`}hr(e){return`<hr>\n`}list(e){let t=e.ordered,n=e.start,r=``;for(let t=0;t<e.items.length;t++){let n=e.items[t];r+=this.listitem(n)}let i=t?`ol`:`ul`,a=t&&n!==1?` start=\"`+n+`\"`:``;return`<`+i+a+`>\n`+r+`</`+i+`>\n`}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>\n`}checkbox({checked:e}){return`<input `+(e?`checked=\"\" `:``)+`disabled=\"\" type=\"checkbox\"> `}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>\n`}table(e){let t=``,n=``;for(let t=0;t<e.header.length;t++)n+=this.tablecell(e.header[t]);t+=this.tablerow({text:n});let r=``;for(let t=0;t<e.rows.length;t++){let i=e.rows[t];n=``;for(let e=0;e<i.length;e++)n+=this.tablecell(i[e]);r+=this.tablerow({text:n})}return r&&=`<tbody>${r}</tbody>`,`<table>\n<thead>\n`+t+`</thead>\n`+r+`</table>\n`}tablerow({text:e}){return`<tr>\n${e}</tr>\n`}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?`th`:`td`;return(e.align?`<${n} align=\"${e.align}\">`:`<${n}>`)+t+`</${n}>\n`}strong({tokens:e}){return`<strong>${this.parser.parseInline(e)}</strong>`}em({tokens:e}){return`<em>${this.parser.parseInline(e)}</em>`}codespan({text:e}){return`<code>${W(e,!0)}</code>`}br(e){return`<br>`}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,text:n,tokens:r,autolink:i}){let a=i?W(n,!0):this.parser.parseInline(r),o=Gn(e);if(o===null)return a;e=W(o,i);let s=`<a href=\"`+e+`\"`;return t&&(s+=` title=\"`+W(t)+`\"`),s+=`>`+a+`</a>`,s}image({href:e,title:t,text:n,tokens:r}){r&&(n=this.parser.parseInline(r,this.parser.textRenderer));let i=Gn(e);if(i===null)return W(n);e=i;let a=`<img src=\"${W(e)}\" alt=\"${W(n)}\"`;return t&&(a+=` title=\"${W(t)}\"`),a+=`>`,a}text(e){return`tokens`in e&&e.tokens?this.parser.parseInline(e.tokens):`escaped`in e&&e.escaped?e.text:W(e.text)}},nr=class{parser;strong({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}em({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}codespan({text:e}){return e}del({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}html({text:e}){return e}text({text:e}){return e}link({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}image({text:e,tokens:t}){return t?this.parser.parseInline(t,this):e}br(){return``}checkbox({raw:e}){return e}},q=class e{options;renderer;textRenderer;constructor(e){this.options=e||xt,this.options.renderer=this.options.renderer||new tr,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new nr,this.textRenderer.parser=this}static parse(t,n){return new e(n).parse(t)}static parseInline(t,n){return new e(n).parseInline(t)}parse(e){this.renderer.parser=this;let t=``;for(let n=0;n<e.length;n++){let r=e[n];if(this.options.extensions?.renderers?.[r.type]){let e=r,n=this.options.extensions.renderers[e.type].call({parser:this},e);if(n!==!1||![`space`,`hr`,`heading`,`code`,`table`,`blockquote`,`list`,`checkbox`,`html`,`def`,`paragraph`,`text`].includes(e.type)){t+=n||``;continue}}let i=r;switch(i.type){case`space`:t+=this.renderer.space(i);break;case`hr`:t+=this.renderer.hr(i);break;case`heading`:t+=this.renderer.heading(i);break;case`code`:t+=this.renderer.code(i);break;case`table`:t+=this.renderer.table(i);break;case`blockquote`:t+=this.renderer.blockquote(i);break;case`list`:t+=this.renderer.list(i);break;case`checkbox`:t+=this.renderer.checkbox(i);break;case`html`:t+=this.renderer.html(i);break;case`def`:t+=this.renderer.def(i);break;case`paragraph`:t+=this.renderer.paragraph(i);break;case`text`:t+=this.renderer.text(i);break;default:{let e=`Token with \"`+i.type+`\" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let n=``;for(let r=0;r<e.length;r++){let i=e[r];if(this.options.extensions?.renderers?.[i.type]){let e=this.options.extensions.renderers[i.type].call({parser:this},i);if(e!==!1||![`escape`,`html`,`link`,`image`,`checkbox`,`strong`,`em`,`codespan`,`br`,`del`,`text`].includes(i.type)){n+=e||``;continue}}let a=i;switch(a.type){case`escape`:n+=t.text(a);break;case`html`:n+=t.html(a);break;case`link`:n+=t.link(a);break;case`image`:n+=t.image(a);break;case`checkbox`:n+=t.checkbox(a);break;case`strong`:n+=t.strong(a);break;case`em`:n+=t.em(a);break;case`codespan`:n+=t.codespan(a);break;case`br`:n+=t.br(a);break;case`del`:n+=t.del(a);break;case`text`:n+=t.text(a);break;default:{let e=`Token with \"`+a.type+`\" type was not found.`;if(this.options.silent)return console.error(e),``;throw Error(e)}}}return n}},rr=class{options;block;constructor(e){this.options=e||xt}static passThroughHooks=/* @__PURE__ */ new Set([`preprocess`,`postprocess`,`processAllTokens`,`emStrongMask`]);static passThroughHooksRespectAsync=/* @__PURE__ */ new Set([`preprocess`,`postprocess`,`processAllTokens`]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(e=this.block){return e?K.lex:K.lexInline}provideParser(e=this.block){return e?q.parse:q.parseInline}};function ir(e,t){if(Array.isArray(t))for(let n=0;n<t.length;n++)e.push(t[n]);else e.push(t)}var J=new class{defaults=bt();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=q;Renderer=tr;TextRenderer=nr;Lexer=K;Tokenizer=er;Hooks=rr;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let r of e)switch(ir(n,t.call(this,r)),r.type){case`table`:{let e=r;for(let r of e.header)ir(n,this.walkTokens(r.tokens,t));for(let r of e.rows)for(let e of r)ir(n,this.walkTokens(e.tokens,t));break}case`list`:{let e=r;ir(n,this.walkTokens(e.items,t));break}default:{let e=r;this.defaults.extensions?.childTokens?.[e.type]?this.defaults.extensions.childTokens[e.type].forEach(r=>{let i=e[r].flat(1/0);ir(n,this.walkTokens(i,t))}):e.tokens&&ir(n,this.walkTokens(e.tokens,t))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(e=>{let n={...e};if(n.async=this.defaults.async||n.async||!1,e.extensions&&(e.extensions.forEach(e=>{if(!e.name)throw Error(`extension name required`);if(`renderer`in e){let n=t.renderers[e.name];n?t.renderers[e.name]=function(...t){let r=e.renderer.apply(this,t);return r===!1&&(r=n.apply(this,t)),r}:t.renderers[e.name]=e.renderer}if(`tokenizer`in e){if(!e.level||e.level!==`block`&&e.level!==`inline`)throw Error(`extension level must be 'block' or 'inline'`);let n=t[e.level];n?n.unshift(e.tokenizer):t[e.level]=[e.tokenizer],e.start&&(e.level===`block`?t.startBlock?t.startBlock.push(e.start):t.startBlock=[e.start]:e.level===`inline`&&(t.startInline?t.startInline.push(e.start):t.startInline=[e.start]))}`childTokens`in e&&e.childTokens&&(t.childTokens[e.name]=e.childTokens)}),n.extensions=t),e.renderer){let t=this.defaults.renderer||new tr(this.defaults);for(let n in e.renderer){if(!(n in t))throw Error(`renderer '${n}' does not exist`);if([`options`,`parser`].includes(n))continue;let r=n,i=e.renderer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n||``}}n.renderer=t}if(e.tokenizer){let t=this.defaults.tokenizer||new er(this.defaults);for(let n in e.tokenizer){if(!(n in t))throw Error(`tokenizer '${n}' does not exist`);if([`options`,`rules`,`lexer`].includes(n))continue;let r=n,i=e.tokenizer[r],a=t[r];t[r]=(...e)=>{let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.tokenizer=t}if(e.hooks){let t=this.defaults.hooks||new rr;for(let n in e.hooks){if(!(n in t))throw Error(`hook '${n}' does not exist`);if([`options`,`block`].includes(n))continue;let r=n,i=e.hooks[r],a=t[r];t[r]=rr.passThroughHooks.has(n)?e=>{if(t.options.async&&rr.passThroughHooksRespectAsync.has(n))return(async()=>{let n=await i.call(t,e);return a.call(t,n)})();let r=i.call(t,e);return a.call(t,r)}:(...e)=>{if(t.options.async)return(async()=>{let n=await i.apply(t,e);return n===!1&&(n=await a.apply(t,e)),n})();let n=i.apply(t,e);return n===!1&&(n=a.apply(t,e)),n}}n.hooks=t}if(e.walkTokens){let t=this.defaults.walkTokens,r=e.walkTokens;n.walkTokens=function(e){let n=[];return n.push(r.call(this,e)),t&&ir(n,t.call(this,e)),n}}this.defaults={...this.defaults,...n}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return K.lex(e,t??this.defaults)}parser(e,t){return q.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let r={...n},i={...this.defaults,...r},a=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&r.async===!1)return a(/* @__PURE__ */ Error(`marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.`));if(typeof t>`u`||t===null)return a(/* @__PURE__ */ Error(`marked(): input parameter is undefined or null`));if(typeof t!=`string`)return a(/* @__PURE__ */ Error(`marked(): input parameter is of type `+Object.prototype.toString.call(t)+`, string expected`));if(i.hooks&&(i.hooks.options=i,i.hooks.block=e),i.async)return(async()=>{let n=i.hooks?await i.hooks.preprocess(t):t,r=await(i.hooks?await i.hooks.provideLexer(e):e?K.lex:K.lexInline)(n,i),a=i.hooks?await i.hooks.processAllTokens(r):r;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let o=await(i.hooks?await i.hooks.provideParser(e):e?q.parse:q.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(o):o})().catch(a);try{i.hooks&&(t=i.hooks.preprocess(t));let n=(i.hooks?i.hooks.provideLexer(e):e?K.lex:K.lexInline)(t,i);i.hooks&&(n=i.hooks.processAllTokens(n)),i.walkTokens&&this.walkTokens(n,i.walkTokens);let r=(i.hooks?i.hooks.provideParser(e):e?q.parse:q.parseInline)(n,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(e){return a(e)}}}onError(e,t){return n=>{if(n.message+=`\nPlease report this to https://github.com/markedjs/marked.`,e){let e=`<p>An error occurred:</p><pre>`+W(n.message+``,!0)+`</pre>`;return t?Promise.resolve(e):e}if(t)return Promise.reject(n);throw n}}};function Y(e,t){return J.parse(e,t)}Y.options=Y.setOptions=function(e){return J.setOptions(e),Y.defaults=J.defaults,St(Y.defaults),Y},Y.getDefaults=bt,Y.defaults=xt;function ar(...e){return J.use(...e),Y.defaults=J.defaults,St(Y.defaults),Y}Y.use=ar,Y.walkTokens=function(e,t){return J.walkTokens(e,t)},Y.parseInline=J.parseInline,Y.Parser=q,Y.parser=q.parse,Y.Renderer=tr,Y.TextRenderer=nr,Y.Lexer=K,Y.lexer=K.lex,Y.Tokenizer=er,Y.Hooks=rr,Y.parse=Y,Y.options,Y.setOptions,Y.walkTokens,Y.parseInline,q.parse,K.lex;var or=/* @__PURE__ */ new Set([`http:`,`https:`,`mailto:`]),sr=16;function cr(e){try{let t=new URL(e);return or.has(t.protocol)?t.href:``}catch{return``}}var lr={amp:`&`,lt:`<`,gt:`>`,quot:`\"`,apos:`'`,nbsp:`\\xA0`,copy:`©`,reg:`®`,trade:`™`,hellip:`…`,mdash:`—`,ndash:`–`,lsquo:`‘`,rsquo:`’`,ldquo:`“`,rdquo:`”`,laquo:`«`,raquo:`»`,bull:`•`,middot:`·`,deg:`°`,plusmn:`±`,times:`×`,divide:`÷`,euro:`€`,pound:`£`,yen:`¥`,cent:`¢`,sect:`§`,para:`¶`};function ur(e){return e.includes(`&`)?e.replace(/&(#\\d{1,7}|#[xX][\\da-fA-F]{1,6}|[a-zA-Z]{2,8});/g,(e,t)=>{if(t[0]!==`#`)return lr[t]??e;let n=t[1]===`x`||t[1]===`X`?Number.parseInt(t.slice(2),16):Number.parseInt(t.slice(1),10);return n>0&&n<=1114111&&(n<55296||n>57343)?String.fromCodePoint(n):`�`}):e}function X(e,t){return t>sr?[(e??[]).map(e=>e.raw).join(``)]:(e??[]).map((e,n)=>{switch(e.type){case`text`:return`tokens`in e&&e.tokens?X(e.tokens,t+1):ur(e.text);case`escape`:return e.text;case`strong`:return/* @__PURE__ */ z(`strong`,{children:X(e.tokens,t+1)},n);case`em`:return/* @__PURE__ */ z(`em`,{children:X(e.tokens,t+1)},n);case`del`:return/* @__PURE__ */ z(`del`,{children:X(e.tokens,t+1)},n);case`codespan`:return/* @__PURE__ */ z(`code`,{children:e.text},n);case`br`:return/* @__PURE__ */ z(`br`,{},n);case`link`:{let r=cr(ur(e.href));return r?/* @__PURE__ */ z(`a`,{href:r,target:`_blank`,rel:`noopener noreferrer nofollow`,children:X(e.tokens,t+1)},n):/* @__PURE__ */ z(`span`,{children:X(e.tokens,t+1)},n)}case`image`:return e.text?/* @__PURE__ */ z(`span`,{\"data-ask-part\":`image-alt`,children:[`[`,ur(e.text),`]`]},n):null;default:return null}})}function dr(e,t,n){return e.map((e,r)=>/* @__PURE__ */ z(t?`th`:`td`,{style:e.align?{textAlign:e.align}:void 0,children:X(e.tokens,n+1)},r))}function fr(e,t){return t>sr?[e.map(e=>e.raw).join(``)]:e.map((e,n)=>{switch(e.type){case`paragraph`:return/* @__PURE__ */ z(`p`,{children:X(e.tokens,t+1)},n);case`text`:return e.tokens?X(e.tokens,t+1):ur(e.text);case`heading`:return/* @__PURE__ */ z(`h${Math.min(Math.max(e.depth,1),6)}`,{children:X(e.tokens,t+1)},n);case`code`:return/* @__PURE__ */ z(`pre`,{children:/* @__PURE__ */ z(`code`,{children:e.text})},n);case`blockquote`:return/* @__PURE__ */ z(`blockquote`,{children:fr(e.tokens??[],t+1)},n);case`hr`:return/* @__PURE__ */ z(`hr`,{},n);case`list`:{let r=e.items.map((e,n)=>/* @__PURE__ */ z(`li`,{children:[e.task&&/* @__PURE__ */ z(`input`,{type:`checkbox`,checked:e.checked??!1,disabled:!0}),fr(e.tokens.filter(e=>e.type!==`checkbox`),t+1)]},n));return e.ordered?/* @__PURE__ */ z(`ol`,{start:typeof e.start==`number`?e.start:void 0,children:r},n):/* @__PURE__ */ z(`ul`,{children:r},n)}case`table`:return/* @__PURE__ */ z(`table`,{children:[/* @__PURE__ */ z(`thead`,{children:/* @__PURE__ */ z(`tr`,{children:dr(e.header,!0,t)})}),/* @__PURE__ */ z(`tbody`,{children:e.rows.map((e,n)=>/* @__PURE__ */ z(`tr`,{children:dr(e,!1,t)},n))})]},n);default:return null}})}var pr=e=>e.split(/\\n{2,}/).map((e,t)=>/* @__PURE__ */ z(`p`,{children:e},t));function mr(e){try{return fr(K.lex(e,{gfm:!0}),0)}catch{return pr(e)}}var hr=class extends S{state={failed:!1};static getDerivedStateFromError(){return{failed:!0}}render(){return this.state.failed?pr(this.props.text):this.props.children}},gr=ze(function({text:e}){return/* @__PURE__ */ z(hr,{text:e,children:mr(e)})}),_r=2048,vr=.85,yr=/\\.(png|jpe?g|webp|gif|heic|heif|avif|bmp)$/i,br=class extends Error{},xr=e=>e.type===`application/pdf`||/\\.pdf$/i.test(e.name),Sr=e=>e.type.startsWith(`image/`)&&e.type!==`image/svg+xml`||yr.test(e.name),Cr=e=>e.replace(/\\.[^.]*$/,``)||`image`;function wr(e){return[...e.images?[`image/png`,`image/jpeg`,`image/webp`,`image/gif`,`image/heic`]:[],...e.pdf?[`application/pdf`]:[]].join(`,`)}async function Tr(e,t,n){let r=document.createElement(`canvas`);r.width=t,r.height=n;let i=r.getContext(`2d`);if(!i)throw new br;return i.fillStyle=`#fff`,i.fillRect(0,0,t,n),i.drawImage(e,0,0,t,n),new Promise((e,t)=>r.toBlob(n=>n?e(n):t(new br),`image/jpeg`,vr))}async function Er(e,t){if(t.pdf&&xr(e))return{blob:e,name:e.name,kind:`pdf`};if(!t.images||!Sr(e))throw new br;let n;try{n=await createImageBitmap(e,{imageOrientation:`from-image`})}catch{throw new br}try{let t=Math.min(1,_r/Math.max(n.width,n.height)),r=Math.max(1,Math.round(n.width*t)),i=Math.max(1,Math.round(n.height*t));return{blob:await Tr(n,r,i),name:`${Cr(e.name)}.jpg`,kind:`image`}}finally{n.close()}}var Dr=[`audio/webm;codecs=opus`,`audio/webm`,`audio/mp4;codecs=mp4a.40.2`,`audio/mp4`],Or=32e3;function kr(){if(typeof MediaRecorder<`u`)return Dr.find(e=>MediaRecorder.isTypeSupported(e))}function Ar(){return!navigator.mediaDevices?.getUserMedia||!kr()?!1:document.featurePolicy?.allowsFeature(`microphone`)??!0}var jr=class extends Error{reason;constructor(e,t){super(`Microphone ${e}`,t),this.reason=e}};async function Mr(e){let t=kr();if(!t)throw new jr(`failed`);let n;try{n=await navigator.mediaDevices.getUserMedia({audio:{echoCancellation:!0,noiseSuppression:!0}})}catch(e){let t=e instanceof DOMException?e.name:``;throw t===`NotAllowedError`||t===`SecurityError`?new jr(`blocked`,{cause:e}):t===`NotFoundError`||t===`OverconstrainedError`?new jr(`missing`,{cause:e}):new jr(`failed`,{cause:e})}try{return Nr(n,t,e)}catch(e){for(let e of n.getTracks())e.stop();throw new jr(`failed`,{cause:e})}}function Nr(e,t,n){let r=new MediaRecorder(e,{mimeType:t,audioBitsPerSecond:Or}),i=[];r.addEventListener(`dataavailable`,e=>{e.data.size>0&&i.push(e.data)});let a=new Promise(e=>r.addEventListener(`stop`,()=>e(),{once:!0})),o=new AudioContext,s=o.createAnalyser();s.fftSize=512,o.createMediaStreamSource(e).connect(s);let c=new Uint8Array(s.fftSize),l=()=>{for(let t of e.getTracks())t.stop();o.close()},u,d=()=>{clearTimeout(u),r.state!==`inactive`&&r.stop()};return r.start(250),u=setTimeout(d,n*1e3),{level(){s.getByteTimeDomainData(c);let e=0;for(let t of c){let n=(t-128)/128;e+=n*n}return Math.min(1,Math.sqrt(e/c.length)*4)},async stop(){return d(),await a,l(),new Blob(i,{type:t.split(`;`)[0]??t})},cancel(){d(),l()}}}var Pr=e=>e.split(/\\s+/).filter(Boolean).slice(0,2).map(e=>e[0]?.toUpperCase()??``).join(``)||`AI`;function Fr(e){return e.split(`**`).map((e,t)=>t%2==1?/* @__PURE__ */ z(`strong`,{children:e},t):e)}function Ir({widget:e,size:t}){let n=e.avatar?`image`:e.variants.avatar;return n===`none`?null:/* @__PURE__ */ z(`span`,{\"data-ask-part\":`avatar`,\"data-kind\":n,\"data-size\":t,\"aria-hidden\":`true`,children:[n===`image`&&/* @__PURE__ */ z(`img`,{src:e.avatar,alt:``}),n===`orb`&&/* @__PURE__ */ z(`span`,{\"data-ask-part\":`orb`}),n===`icon`&&/* @__PURE__ */ z(vt,{size:t===`large`?28:16}),n===`initials`&&Pr(e.title)]})}function Lr({widget:e,disabled:t,onPick:n}){if(e.starters.length===0)return null;let r=e.variants.welcome===`intro`;return/* @__PURE__ */ z(`ul`,{\"data-ask-part\":`starters`,\"aria-label\":e.texts[`welcome.suggestions`],children:e.starters.map(i=>/* @__PURE__ */ z(`li`,{children:/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`starter`,disabled:t,onClick:()=>n(i),children:[z(r?_t:vt,{}),/* @__PURE__ */ z(`span`,{children:i}),e.variants.welcome===`persona`&&/* @__PURE__ */ z(yt,{})]})},i))})}function Rr({widget:e,disabled:t,onPick:n}){let r=e.variants.welcome,i=/* @__PURE__ */ z(Lr,{widget:e,disabled:t,onPick:n});return r===`intro`?/* @__PURE__ */ z(`section`,{\"data-ask-part\":`welcome`,\"data-layout\":`intro`,\"aria-label\":e.texts[`welcome.label`],children:/* @__PURE__ */ z(`div`,{\"data-ask-part\":`intro`,children:[/* @__PURE__ */ z(Ir,{widget:e,size:`small`}),/* @__PURE__ */ z(`div`,{\"data-ask-part\":`intro-card`,children:[/* @__PURE__ */ z(`p`,{\"data-ask-part\":`greeting`,children:Fr(e.greeting)}),i]})]})}):r===`persona`?/* @__PURE__ */ z(`section`,{\"data-ask-part\":`welcome`,\"data-layout\":`persona`,\"aria-label\":e.texts[`welcome.label`],children:[/* @__PURE__ */ z(`div`,{\"data-ask-part\":`persona`,children:[/* @__PURE__ */ z(Ir,{widget:e,size:`large`}),/* @__PURE__ */ z(`div`,{children:[/* @__PURE__ */ z(`h2`,{\"data-ask-part\":`persona-name`,children:e.title}),/* @__PURE__ */ z(`span`,{\"data-ask-part\":`presence`,children:e.texts[`welcome.online`]})]})]}),/* @__PURE__ */ z(`p`,{\"data-ask-part\":`greeting`,children:Fr(e.greeting)}),i]}):/* @__PURE__ */ z(`section`,{\"data-ask-part\":`welcome`,\"data-layout\":`hero`,\"aria-label\":e.texts[`welcome.label`],children:[/* @__PURE__ */ z(Ir,{widget:e,size:`large`}),/* @__PURE__ */ z(`h2`,{\"data-ask-part\":`greeting`,children:Fr(e.greeting)}),i]})}var zr=e=>`${Math.floor(e/1e5)/10} MB`,Br=e=>e.role===`user`||e.status===`streaming`||e.text!==``||e.citations.length>0;function Vr(e){e.style.height=`auto`,e.style.height=`${e.scrollHeight}px`}var Hr=e=>`${Math.floor(e/60)}:${String(Math.floor(e%60)).padStart(2,`0`)}`,Ur={blocked:`microphone.blocked`,missing:`microphone.missing`,failed:`microphone.failed`};function Wr(e){for(let t of e)t.previewUrl&&URL.revokeObjectURL(t.previewUrl)}function Gr({files:e,part:t,t:n,onRemove:r}){return/* @__PURE__ */ z(`ul`,{\"data-ask-part\":t,\"aria-label\":n(`attachment.list`),children:e.map((e,t)=>{let i=`status`in e?e:void 0;return/* @__PURE__ */ z(`li`,{\"data-ask-part\":`attachment`,\"data-kind\":e.kind,\"data-status\":i?.status,children:[e.previewUrl?/* @__PURE__ */ z(`img`,{\"data-ask-part\":`attachment-preview`,src:e.previewUrl,alt:``}):/* @__PURE__ */ z(`span`,{\"data-ask-part\":`attachment-badge`,\"aria-hidden\":`true`,children:e.kind===`image`?`IMG`:e.kind===`pdf`?`PDF`:`FILE`}),/* @__PURE__ */ z(`span`,{\"data-ask-part\":`attachment-name`,children:e.name}),i?.status===`uploading`&&/* @__PURE__ */ z(`span`,{\"data-ask-part\":`attachment-status`,children:n(`attachment.uploading`)}),i?.status===`error`&&/* @__PURE__ */ z(`span`,{\"data-ask-part\":`attachment-status`,role:`alert`,children:i.error}),i&&r&&/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`attachment-remove`,\"aria-label\":n(`attachment.remove`,{name:e.name}),onClick:()=>r(i),children:`×`})]},i?.key??t)})})}var Kr=0,qr=()=>`local_${++Kr}`,Jr=e=>({...e,status:`done`});function Yr(e,t){let n=(t,n)=>e.map(e=>e.id===t?n(e):e);switch(t.type){case`message.start`:return[...e,{id:t.messageId,role:`assistant`,text:``,citations:[],attachments:0,status:`streaming`}];case`text.delta`:return n(t.messageId,e=>({...e,text:e.text+t.delta}));case`citation`:return n(t.messageId,e=>({...e,citations:[...e.citations,{index:t.index,title:t.title,url:t.url}]}));case`message.end`:return n(t.messageId,e=>({...e,status:`done`}));default:return e}}function Xr(e,t){if(e.type===`reasoning`)return e.state===`started`?t(`status.thinking`):null;if(e.type===`tool.status`)return e.state===`running`?e.name===`file_search`?t(`status.searching`):t(`status.tool`,{name:e.name}):null;if(e.type===`text.delta`||e.type===`message.end`)return null}function Zr({config:e,client:t,bridge:n,fixture:r,inline:i=!1}){let[a,o]=L({});we(()=>n.onConfigure(o),[n]);let s={...e.widget,...a.greeting?{greeting:a.greeting}:{},...a.starters?{starters:a.starters}:{}},c=De((e,t)=>lt(s.texts[e]??e,t),[s.texts]),[l,u]=L(r?.messages??[]),[d,f]=L(r?.draft??``),[p,m]=L(r?.busy??!1),[h,g]=L(()=>!r&&t.hasConversation()),[_,v]=L(r?.error),[ee,y]=L(r?.activity??null),[b,S]=L(r?.pending??[]),[C,te]=L(!1),w=R(null),T=R(null),[E,ne]=L(!1),D=R(!1);D.current=E;let O=R(null),k=R(null),re=Oe(),ie=R(null),A=e.voice,[ae]=L(()=>A!==void 0&&(!!r||Ar())),[j,oe]=L(r?.dictation??`idle`),[se,ce]=L(r?.elapsed??0),M=R(void 0),le=R(!1),ue=R(void 0),de=R(null),fe=R(null),N=R(/* @__PURE__ */ new Map),P=e.attachments;Te(()=>{T.current&&j===`idle`&&Vr(T.current)},[d,j]);let F=De(()=>{clearTimeout(ue.current),M.current?.cancel(),M.current=void 0,oe(`idle`)},[]);we(()=>{let e=e=>{e.key===`Escape`&&(D.current?(ne(!1),requestAnimationFrame(()=>O.current?.focus())):M.current?(F(),requestAnimationFrame(()=>T.current?.focus())):n.close())},t=()=>F(),r=()=>{document.visibilityState===`hidden`&&F()};window.addEventListener(`keydown`,e),document.addEventListener(`visibilitychange`,r);let a=n.onHidden(t);return i||T.current?.focus(),()=>{window.removeEventListener(`keydown`,e),document.removeEventListener(`visibilitychange`,r),a(),F()}},[n,F,i]);let[pe,me]=L(r!==void 0),[he,I]=L(0);we(()=>{if(r)return;let e=!0,i=()=>{},a=Promise.resolve(),o=n=>{a=a.then(async()=>{await t.identify(n)&&e&&(u([]),v(void 0),I(e=>e+1))})};return n.handshake.then(()=>(e&&(i=n.onIdentify(o)),a)).finally(()=>{e&&me(!0)}),()=>{e=!1,i()}},[n,t,r]),we(()=>{if(r||!pe)return;if(!t.hasConversation()){g(!1);return}g(!0);let e=new AbortController;return t.loadHistory(e.signal).then(e=>u(e.map(Jr))).catch(()=>{e.signal.aborted||v(c(`error.history`))}).finally(()=>g(!1)),()=>e.abort()},[t,r,pe,he,c]);let ge=l.at(-1)?.text;we(()=>{let e=w.current;e&&ge!==void 0&&(e.scrollTop=e.scrollHeight)},[ge]);let _e=b.some(e=>e.status===`uploading`),ve=b.filter(e=>e.status===`ready`),ye=pe&&!p&&!h&&!_e&&(d.trim()!==``||ve.length>0),be=async e=>{if(!P)return;let n=qr(),r=e=>S(t=>t.map(t=>t.key===n?{...t,...e}:t)),i=new AbortController;N.current.set(n,i),S(t=>[...t,{key:n,name:e.name,status:`uploading`}]);let a=e=>{N.current.delete(n),i.signal.aborted||r({status:`error`,error:e})},o;try{o=await Er(e,P)}catch{a(c(`attachment.unsupported`));return}if(o.blob.size>P.maxBytes){a(c(`attachment.tooLarge`,{size:zr(P.maxBytes)}));return}if(i.signal.aborted)return;let s=o.kind===`image`?URL.createObjectURL(o.blob):void 0;r({name:o.name,kind:o.kind,previewUrl:s});let l=await t.upload(o.blob,o.name,i.signal);N.current.delete(n),i.signal.aborted?Wr([{previewUrl:s}]):r(l.ok?{status:`ready`,handle:l.file.id,name:l.file.name}:{status:`error`,error:l.message})},xe=e=>{if(!P||e.length===0)return;let t=P.maxPerMessage-b.length;e.length>t&&v(c(`attachment.tooMany`,{count:P.maxPerMessage}));for(let n of e.slice(0,Math.max(0,t)))be(n)},Se=e=>{for(let t of[...e])N.current.get(t)?.abort(),N.current.delete(t)},Ce=e=>{Se([e.key]),Wr([e]),S(t=>t.filter(t=>t.key!==e.key))},Ee=async n=>{let r=(n??d).trim();if(n===void 0?!ye:!pe||p||h||_e||r===``)return;let i=ve.flatMap(({name:e,kind:t,previewUrl:n})=>t?[{name:e,kind:t,previewUrl:n}]:[]),o=ve.flatMap(e=>e.handle?[e.handle]:[]);Wr(b.filter(e=>e.status!==`ready`)),S([]),n===void 0&&f(``),v(void 0),m(!0),u(e=>[...e,{id:qr(),role:`user`,text:r,citations:[],attachments:i.length,files:i,status:`done`}]);let s=e.pageContext?a.context:void 0;await t.send({text:r,attachments:o,context:s},e=>{let t=Xr(e,c);t!==void 0&&y(t),e.type===`error`?(v(e.message),u(e=>e.map(e=>e.status===`streaming`?{...e,status:`error`}:e))):u(t=>Yr(t,e))}),y(null),m(!1),T.current?.focus()},ke=async()=>{let n=M.current;if(!n)return;M.current=void 0,clearTimeout(ue.current),oe(`transcribing`);let r=await n.stop();if(r.size<1e3){oe(`idle`),v(c(`dictation.empty`));return}let i=[...navigator.languages.slice(0,2),e.widget.locale],a=await t.transcribe(r,i);oe(`idle`),a.ok?a.text&&f(e=>e.trim()?`${e.trimEnd()} ${a.text}`:a.text):v(a.message),requestAnimationFrame(()=>T.current?.focus())},Ae=async()=>{if(!A||M.current||le.current)return;v(void 0),le.current=!0;let e;try{e=await Mr(A.maxSeconds)}catch(e){v(c(Ur[e instanceof jr?e.reason:`failed`]));return}finally{le.current=!1}M.current=e,ce(0),oe(`recording`),requestAnimationFrame(()=>fe.current?.focus()),ue.current=setTimeout(()=>void ke(),A.maxSeconds*1e3);let t=performance.now(),n=()=>{M.current===e&&(de.current?.style.setProperty(`--ask-level`,e.level().toFixed(3)),ce(Math.min(A.maxSeconds,Math.floor((performance.now()-t)/1e3))),requestAnimationFrame(n))};requestAnimationFrame(n)},je=()=>{F(),requestAnimationFrame(()=>T.current?.focus())},Me=()=>{ne(!0),requestAnimationFrame(()=>k.current?.querySelector(`button`)?.focus())},Ne=()=>{ne(!1),requestAnimationFrame(()=>O.current?.focus())},Pe=e=>{if(e.key!==`Tab`)return;let t=Array.from(e.currentTarget.querySelectorAll(`button`)),n=t[0],r=t[t.length-1];e.shiftKey&&document.activeElement===n?(e.preventDefault(),r?.focus()):!e.shiftKey&&document.activeElement===r&&(e.preventDefault(),n?.focus())},Fe=async()=>{ne(!1),m(!0),await t.deleteConversation().catch(()=>void 0),Wr(l.flatMap(e=>e.files??[])),Se(N.current.keys()),Wr(b),S([]),u([]),v(void 0),m(!1),T.current?.focus()},Ie=e=>{e.preventDefault(),Ee()},Le=e=>{e.key===`Enter`&&!e.shiftKey&&!e.nativeEvent.isComposing&&(e.preventDefault(),Ee())},Re=e=>{let t=Array.from(e.clipboardData.files);P&&t.length!==0&&(e.preventDefault(),xe(t))},ze=R(xe);we(()=>{ze.current=xe}),we(()=>{if(!P)return;let e=e=>e.dataTransfer?.types.includes(`Files`)??!1,t=t=>{e(t)&&(t.preventDefault(),te(!0))},n=e=>{e.relatedTarget===null&&te(!1)},r=t=>{e(t)&&(t.preventDefault(),te(!1),ze.current(Array.from(t.dataTransfer?.files??[])))};return document.addEventListener(`dragover`,t),document.addEventListener(`dragleave`,n),document.addEventListener(`drop`,r),()=>{document.removeEventListener(`dragover`,t),document.removeEventListener(`dragleave`,n),document.removeEventListener(`drop`,r)}},[P]);let Be=l.length===0&&!h;return/* @__PURE__ */ z(`main`,{\"data-ask-part\":`panel`,\"data-dragging\":C||void 0,\"data-busy\":p||j!==`idle`||void 0,children:[/* @__PURE__ */ z(`header`,{\"data-ask-part\":`header`,children:[/* @__PURE__ */ z(`div`,{\"data-ask-part\":`identity`,children:[/* @__PURE__ */ z(Ir,{widget:s,size:`small`}),/* @__PURE__ */ z(`div`,{\"data-ask-part\":`identity-text`,children:[/* @__PURE__ */ z(`h1`,{\"data-ask-part\":`title`,children:s.title}),s.subtitle&&/* @__PURE__ */ z(`p`,{\"data-ask-part\":`subtitle`,children:s.subtitle})]})]}),/* @__PURE__ */ z(`div`,{\"data-ask-part\":`actions`,children:[l.length>0&&/* @__PURE__ */ z(`button`,{ref:O,type:`button`,\"data-ask-part\":`new-conversation`,\"aria-label\":c(`header.newConversation`),\"aria-haspopup\":`dialog`,title:c(`header.newConversation`),disabled:p,onClick:Me,children:/* @__PURE__ */ z(gt,{})}),n.embedded&&!i&&/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`close`,\"aria-label\":c(`header.close`),title:c(`header.close`),onClick:()=>{F(),n.close()},children:/* @__PURE__ */ z(ht,{})})]})]}),E&&/* @__PURE__ */ z(`div`,{\"data-ask-part\":`confirm-backdrop`,children:/* @__PURE__ */ z(`div`,{ref:k,\"data-ask-part\":`confirm`,role:`alertdialog`,\"aria-modal\":`true`,\"aria-describedby\":re,\"aria-label\":c(`header.newConversation`),onKeyDown:Pe,children:[/* @__PURE__ */ z(`span`,{\"data-ask-part\":`confirm-icon`,\"aria-hidden\":`true`,children:/* @__PURE__ */ z(gt,{})}),/* @__PURE__ */ z(`p`,{id:re,\"data-ask-part\":`confirm-text`,children:c(`confirm.newConversation`)}),/* @__PURE__ */ z(`div`,{\"data-ask-part\":`confirm-actions`,children:[/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`confirm-cancel`,onClick:Ne,children:c(`confirm.cancel`)}),/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`confirm-accept`,onClick:()=>void Fe(),children:c(`confirm.accept`)})]})]})}),/* @__PURE__ */ z(`div`,{\"data-ask-part\":`messages`,ref:w,role:`log`,\"aria-live\":`polite`,\"aria-relevant\":`additions`,\"aria-busy\":h,children:[Be&&/* @__PURE__ */ z(Rr,{widget:s,disabled:p||!pe,onPick:e=>void Ee(e)}),h&&/* @__PURE__ */ z(`p`,{\"data-ask-part\":`status`,role:`status`,children:c(`status.loading`)}),l.filter(Br).map(e=>/* @__PURE__ */ z(`div`,{\"data-ask-part\":`message`,\"data-role\":e.role,\"data-status\":e.status,children:[e.role===`assistant`&&/* @__PURE__ */ z(Ir,{widget:s,size:`small`}),/* @__PURE__ */ z(`div`,{\"data-ask-part\":`message-body`,children:[e.text===``?e.status===`streaming`&&/* @__PURE__ */ z(`div`,{\"data-ask-part\":`bubble`,children:/* @__PURE__ */ z(`span`,{\"data-ask-part\":`typing`,role:`img`,\"aria-label\":c(`status.typing`),children:[/* @__PURE__ */ z(`i`,{}),/* @__PURE__ */ z(`i`,{}),/* @__PURE__ */ z(`i`,{})]})}):/* @__PURE__ */ z(`div`,{\"data-ask-part\":`bubble`,children:e.role===`assistant`?/* @__PURE__ */ z(gr,{text:e.text}):e.text}),e.files&&e.files.length>0?/* @__PURE__ */ z(Gr,{files:e.files,part:`message-attachments`,t:c}):e.attachments>0&&/* @__PURE__ */ z(`p`,{\"data-ask-part\":`attachments-note`,children:ut(s.texts,`message.attachments`,e.attachments,s.locale)}),e.citations.length>0&&/* @__PURE__ */ z(`ol`,{\"data-ask-part\":`citations`,\"aria-label\":c(`message.sources`),children:e.citations.map(e=>/* @__PURE__ */ z(`li`,{\"data-ask-part\":`citation`,children:e.url?/* @__PURE__ */ z(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer nofollow`,children:e.title}):/* @__PURE__ */ z(`span`,{children:e.title})},e.index))})]})]},e.id)),ee&&/* @__PURE__ */ z(`p`,{\"data-ask-part\":`status`,role:`status`,children:ee})]}),_&&/* @__PURE__ */ z(`p`,{\"data-ask-part\":`error`,role:`alert`,children:_}),/* @__PURE__ */ z(`form`,{\"data-ask-part\":`composer`,onSubmit:Ie,children:[b.length>0&&/* @__PURE__ */ z(Gr,{files:b,part:`attachments`,t:c,onRemove:Ce}),/* @__PURE__ */ z(`div`,{\"data-ask-part\":`composer-box`,children:j===`idle`?/* @__PURE__ */ z(x,{children:[P&&/* @__PURE__ */ z(x,{children:[/* @__PURE__ */ z(`input`,{ref:ie,type:`file`,hidden:!0,multiple:!0,accept:wr(P),onChange:e=>{xe(Array.from(e.target.files??[])),e.target.value=``}}),/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`attach`,\"aria-label\":c(`composer.attach`),title:c(`composer.attach`),disabled:p||b.length>=P.maxPerMessage,onClick:()=>ie.current?.click(),children:/* @__PURE__ */ z(pt,{})})]}),/* @__PURE__ */ z(`textarea`,{ref:T,\"data-ask-part\":`input`,rows:1,value:d,placeholder:s.placeholder,\"aria-label\":s.placeholder,onChange:e=>f(e.target.value),onKeyDown:Le,onPaste:Re}),ae&&/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`voice`,\"aria-label\":c(`composer.dictate`),title:c(`composer.dictate`),onClick:()=>void Ae(),children:/* @__PURE__ */ z(mt,{})}),/* @__PURE__ */ z(`button`,{type:`submit`,\"data-ask-part\":`send`,\"aria-label\":c(`composer.send`),title:c(`composer.send`),disabled:!ye,children:[/* @__PURE__ */ z(ft,{}),/* @__PURE__ */ z(`span`,{\"data-ask-part\":`send-label`,\"aria-hidden\":`true`,children:c(`composer.send`)})]})]}):/* @__PURE__ */ z(`div`,{\"data-ask-part\":`recorder`,\"data-state\":j,children:[/* @__PURE__ */ z(`span`,{\"data-ask-part\":`recorder-level`,ref:de,\"aria-hidden\":`true`}),/* @__PURE__ */ z(`span`,{\"data-ask-part\":`recorder-label`,role:`status`,children:c(j===`recording`?`dictation.listening`:`dictation.transcribing`)}),j===`recording`&&/* @__PURE__ */ z(x,{children:[/* @__PURE__ */ z(`span`,{\"data-ask-part\":`recorder-time`,children:[Hr(se),` / `,Hr(A?.maxSeconds??0)]}),/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`recorder-cancel`,\"aria-label\":c(`dictation.cancel`),title:c(`dictation.cancel`),onClick:je,children:/* @__PURE__ */ z(ht,{})}),/* @__PURE__ */ z(`button`,{type:`button`,\"data-ask-part\":`recorder-done`,ref:fe,onClick:()=>void ke(),children:c(`dictation.done`)})]})]})})]}),s.disclosure!==!1&&/* @__PURE__ */ z(`p`,{\"data-ask-part\":`disclosure`,children:[c(`disclosure.text`),s.disclosure.privacyUrl&&/* @__PURE__ */ z(x,{children:[` `,/* @__PURE__ */ z(`a`,{href:s.disclosure.privacyUrl,target:`_blank`,rel:`noopener noreferrer`,children:c(`disclosure.privacy`)})]})]})]})}var Qr=[`invalid_input`,`unauthorized`,`session_expired`,`not_found`,`rate_limited`,`budget_exceeded`,`bot_unavailable`,`content_blocked`,`timeout`,`upstream_error`,`internal_error`],$r=[`completed`,`max_steps`,`max_output_tokens`,`timeout`,`content_filter`,`aborted`],ei=[`conversation.created`,`user.ack`,`message.start`,`reasoning`,`text.delta`,`citation`,`tool.status`,`message.end`,`error`],ti=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Z=(e,t=0,n=1/0)=>typeof e==`string`&&e.length>=t&&e.length<=n,ni=(e,t)=>typeof e==`number`&&Number.isSafeInteger(e)&&e>=t,ri=(e,t)=>t.includes(e),ii=e=>Z(e,1,128);function ai(e){if(typeof e!=`string`||!/^https?:\\/\\/[^\\s/?#]+[^\\s]*$/i.test(e))return!1;try{let{protocol:t}=new URL(e);return t===`http:`||t===`https:`}catch{return!1}}function oi(e){if(ti(e)&&ni(e.index,1)&&Z(e.title,1)&&(e.url===void 0||ai(e.url)))return{index:e.index,title:e.title,...e.url===void 0?{}:{url:e.url}}}function si(e){if(!ti(e))return;let t={};for(let[n,r]of Object.entries(e)){if(n.length>32||!(Z(r,0,200)||typeof r==`number`&&Number.isFinite(r)))return;t[n]=r}return t}function ci(e){if(!ti(e))return;let t=e.messageId;switch(e.type){case`conversation.created`:return Z(e.resumeToken,1)?{type:`conversation.created`,resumeToken:e.resumeToken}:void 0;case`user.ack`:case`message.start`:return ii(t)?{type:e.type,messageId:t}:void 0;case`reasoning`:return ii(t)&&ri(e.state,[`started`,`done`])?{type:`reasoning`,messageId:t,state:e.state}:void 0;case`text.delta`:return ii(t)&&Z(e.delta)?{type:`text.delta`,messageId:t,delta:e.delta}:void 0;case`citation`:{let n=oi(e);return ii(t)&&n?{type:`citation`,messageId:t,...n}:void 0}case`tool.status`:return ii(t)&&Z(e.callId,1,128)&&Z(e.name,1,64)&&ri(e.state,[`running`,`done`,`error`])?{type:`tool.status`,messageId:t,callId:e.callId,name:e.name,state:e.state}:void 0;case`message.end`:{let{resumeToken:n}=e;return!ii(t)||!ri(e.reason,$r)||n!==void 0&&!Z(n,1)?void 0:{type:`message.end`,messageId:t,reason:e.reason,...typeof n==`string`?{resumeToken:n}:{}}}case`error`:{let{code:t,message:n,retryAfterMs:r,key:i,params:a}=e;if(!ri(t,Qr)||!Z(n,0,500)||r!==void 0&&!ni(r,0)||i!==void 0&&!Z(i,0,64))return;let o=a===void 0?void 0:si(a);return a!==void 0&&!o?void 0:{type:`error`,code:t,message:n,...r===void 0?{}:{retryAfterMs:r},...i===void 0?{}:{key:i},...o?{params:o}:{}}}default:return}}function li(e){if(!ti(e)||!Z(e.id,1,256)||!ri(e.role,[`user`,`assistant`])||!Z(e.text)||!Array.isArray(e.citations)||!ni(e.attachments,0))return;let t=e.citations.map(oi);if(!t.some(e=>e===void 0))return{id:e.id,role:e.role,text:e.text,citations:t,attachments:e.attachments}}function ui(e){if(!ti(e)||!Array.isArray(e.messages))return;let t=e.messages.map(li);return t.some(e=>e===void 0)?void 0:{messages:t}}var di=new Set(ei);function fi(e){if(!di.has(e.event))return{ok:!1,reason:`unknown_type`,type:e.event};let t;try{t=JSON.parse(e.data)}catch{return{ok:!1,reason:`invalid_json`,type:e.event}}let n=ci(t);return!n||n.type!==e.event?{ok:!1,reason:`invalid_payload`,type:e.event}:{ok:!0,event:n}}var pi=class{#e=``;#t=!1;#n=!1;#r=``;#i=[];push(e){let t=e;!this.#n&&t.length>0&&(this.#n=!0,t.charCodeAt(0)===65279&&(t=t.slice(1))),this.#t&&t.startsWith(`\n`)&&(t=t.slice(1)),this.#t=!1,this.#e+=t;let n=[],r=0;for(let e=0;e<this.#e.length;e+=1){let t=this.#e[e];if(t!==`\n`&&t!==`\\r`)continue;let i=this.#e.slice(r,e);t===`\\r`&&(e+1===this.#e.length?this.#t=!0:this.#e[e+1]===`\n`&&(e+=1)),r=e+1;let a=this.#a(i);a&&n.push(a)}return this.#e=this.#e.slice(r),n}#a(e){if(e===``)return this.#o();if(e.startsWith(`:`))return;let t=e.indexOf(`:`),n=t===-1?e:e.slice(0,t),r=t===-1?``:e.slice(t+1);r.startsWith(` `)&&(r=r.slice(1)),n===`event`?this.#r=r:n===`data`&&this.#i.push(r)}#o(){let e=this.#i.length>0,t={event:this.#r===``?`message`:this.#r,data:this.#i.join(`\n`)};return this.#r=``,this.#i=[],e?t:void 0}},mi=e=>({contentType:`application/json`,body:JSON.stringify(e)}),hi=30,gi=class extends Error{event;constructor(e){super(e.message),this.event=e}},_i=class{#e;#t;#n;#r;#i;#a;#o;#s=!1;#c;#l;#u;constructor(e){this.#e=e,this.#t=e.fetch??((e,t)=>fetch(e,t)),this.#n=e.botId}#d(e,t,n){return{type:`error`,code:e,key:t,message:this.#e.translate?.(t)??n}}#f(e){let t=e.key?this.#e.translate?.(e.key,e.params):void 0;return t?{...e,message:t}:e}async identify(e){if(e===this.#o)return!1;this.#o=e,this.#s=!0,await this.#a?.catch(()=>void 0);let t=this.#p();this.#u=this.#r?.accessToken??this.#u,this.#r=void 0;try{await this.#h(!1)}catch{}return this.#p()!==t}#p(){let e=`askdare:${this.#n}:resume`;return this.#l?`${e}:${this.#l}`:e}reset(){this.#i=void 0,this.#e.storage.remove(this.#p())}hasConversation(){return this.#e.storage.get(this.#p())!==void 0}async loadHistory(e){let t=this.#e.storage.get(this.#p());if(!t)return[];let n=await this.#m(`POST`,`/history`,()=>mi({botId:this.#e.botId,resumeToken:t}),e);if(n.status===404)return this.reset(),[];if(!n.ok)throw Error(`History request failed with ${n.status}`);return ui(await n.json())?.messages??[]}async deleteConversation(){let e=this.#e.storage.get(this.#p());try{e&&await this.#m(`DELETE`,`/conversation`,()=>mi({botId:this.#e.botId,resumeToken:e}))}finally{this.reset()}}async upload(e,t,n){try{let r=await this.#m(`POST`,`/attachments`,()=>({contentType:`application/octet-stream`,body:e,headers:{\"x-askdare-bot\":this.#e.botId,\"x-askdare-filename\":encodeURIComponent(t)}}),n);if(!r.ok)return{ok:!1,message:(await this.#y(r)).message};let i=(await r.json()).attachment;return typeof i?.id!=`string`||i.kind!==`image`&&i.kind!==`pdf`||typeof i.name!=`string`?{ok:!1,message:this.#d(`upstream_error`,`error.uploadFailed`,`The file could not be uploaded.`).message}:{ok:!0,file:{id:i.id,kind:i.kind,name:i.name}}}catch(e){return{ok:!1,message:this.#_(e,`upstream_error`).message}}}async transcribe(e,t){try{let n=await this.#m(`POST`,`/transcriptions`,()=>({contentType:`application/octet-stream`,body:e,headers:{\"x-askdare-bot\":this.#e.botId,\"x-askdare-languages\":t.join(`,`)}}));if(!n.ok)return{ok:!1,message:(await this.#y(n)).message};let r=await n.json();return typeof r.text==`string`?{ok:!0,text:r.text}:{ok:!1,message:this.#d(`upstream_error`,`error.transcriptionFailed`,`The recording could not be transcribed.`).message}}catch(e){return{ok:!1,message:this.#_(e,`upstream_error`).message}}}async send(e,t,n){let r=e.context===this.#i?void 0:e.context;try{let i=await this.#m(`POST`,`/messages`,()=>{let t=this.#e.storage.get(this.#p());return mi({botId:this.#e.botId,text:e.text,locale:this.#e.locale,...e.attachments?.length?{attachments:e.attachments}:{},...r?{context:r}:{},...t?{resumeToken:t}:{}})},n);if(!i.ok||!i.body){t(await this.#y(i));return}if(i.headers.get(`x-askdare-protocol`)!==`1`){t(this.#d(`bot_unavailable`,`error.updated`,`The assistant was updated. Please reload the page.`));return}await this.#b(i.body,e=>{e.type===`message.start`&&r&&(this.#i=r),t(e)},n)}catch(e){if(n?.aborted)return;t(this.#_(e,e instanceof DOMException&&e.name===`TimeoutError`?`timeout`:`upstream_error`))}}async#m(e,t,n,r){let i=async i=>{let a=await this.#h(i),{contentType:o,body:s,headers:c}=n();return this.#t(`${this.#e.basePath}${t}`,{method:e,headers:{...c,\"content-type\":o,authorization:`Bearer ${a.accessToken}`},body:s,...r?{signal:r}:{}})},a=await i(!1);return a.status===401?i(!0):a}async#h(e){let t=Date.now()/1e3;return!e&&!this.#s&&this.#r&&this.#r.expiresAt-hi>t?this.#r:(this.#a??=this.#g().finally(()=>{this.#a=void 0}),this.#a)}async#g(){let e=this.#e.storage.get(this.#p()),t=this.#r?.accessToken??this.#u,n=this.#o,r=this.#p(),i=await this.#t(`${this.#e.basePath}/session`,{method:`POST`,headers:{\"content-type\":`application/json`},body:JSON.stringify({botId:this.#e.botId,...e?{resumeToken:e}:{},...t?{accessToken:t}:{},...n===void 0?{}:{identityToken:n}})});if(!i.ok)throw new gi(await this.#y(i,!1));let a=await i.json();return this.#o===n&&(this.#s=!1),this.#u=void 0,this.#l=a.identified?a.identityKey:void 0,n&&!a.identified&&this.#c!==n&&(this.#c=n,console.warn(`[askdare] askdare('identify') was refused (${a.identityProblem??`unknown`}); the chat continues anonymously.`)),a.resumeToken?(this.#e.storage.set(this.#p(),a.resumeToken),r!==this.#p()&&this.#e.storage.remove(r)):!a.resumable&&e&&r===this.#p()&&this.reset(),this.#r={accessToken:a.accessToken,expiresAt:a.expiresAt},this.#r}#_(e,t){return e instanceof gi?e.event:this.#v(t)}#v(e){return this.#d(e,`error.connection`,`Connection problem. Please try again.`)}async#y(e,t=!0){let n={};try{n=await e.json()}catch{}t&&e.status===404&&n.error?.code===`not_found`&&this.reset();let r=fi({event:`error`,data:JSON.stringify({type:`error`,...n.error})});return r.ok&&r.event.type===`error`?this.#f(r.event):this.#d(`upstream_error`,`error.upstream_error`,`The assistant is temporarily unavailable. Please try again.`)}async#b(e,t,n){let r=e.getReader(),i=new TextDecoder,a=new pi,o=this.#e.watchdogMs??45e3,s,c=!1,l=()=>{clearTimeout(s),s=setTimeout(()=>{c=!0,r.cancel()},o)},u=()=>void r.cancel();n?.addEventListener(`abort`,u,{once:!0});try{for(l();;){let{done:e,value:n}=await r.read();if(e)break;l();for(let e of a.push(i.decode(n,{stream:!0}))){let n=fi(e);n.ok&&(n.event.type===`conversation.created`||n.event.type===`message.end`&&n.event.resumeToken?this.#e.storage.set(this.#p(),n.event.resumeToken):n.event.type===`error`&&n.event.code===`not_found`&&this.reset(),t(n.event.type===`error`?this.#f(n.event):n.event))}}c&&t(this.#d(`timeout`,`error.stalled`,`The connection stalled. Please try again.`))}finally{clearTimeout(s),n?.removeEventListener(`abort`,u)}}},vi=`data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2040%2040%22%3E%3Cdefs%3E%3ClinearGradient%20id%3D%22s%22%20x2%3D%220%22%20y2%3D%221%22%3E%3Cstop%20offset%3D%220%22%20stop-color%3D%22%239cc9ff%22%2F%3E%3Cstop%20offset%3D%221%22%20stop-color%3D%22%23fde2c4%22%2F%3E%3C%2FlinearGradient%3E%3C%2Fdefs%3E%3Crect%20width%3D%2240%22%20height%3D%2240%22%20fill%3D%22url(%23s)%22%2F%3E%3Ccircle%20cx%3D%2229%22%20cy%3D%2212%22%20r%3D%225%22%20fill%3D%22%23fff6d5%22%2F%3E%3Cpath%20d%3D%22M0%2030l11-11%209%209%206-5%2014%2012v5H0z%22%20fill%3D%22%234f7d6a%22%2F%3E%3C%2Fsvg%3E`,Q=(e,t,n,r={})=>({id:e,role:t,text:n,citations:[],attachments:0,status:`done`,...r}),yi=[Q(`u1`,`user`,`What does the Business plan include?`),Q(`a1`,`assistant`,`The **Business** plan is built for larger teams:\n\n- Unlimited users and **1 TB** of storage\n- Single sign-on with SAML and an audit log\n- Priority support, first reply within 4 business hours\n\n| Billing | Price per user |\n| --- | --- |\n| Monthly | €15 |\n| Yearly | €12 |`,{citations:[{index:1,title:`Brightloop pricing and plans`,url:`https://example.com/pricing`},{index:2,title:`Brightloop security and privacy`,url:`https://example.com/security`}]}),Q(`u2`,`user`,`Can we try it first?`),Q(`a2`,`assistant`,`Yes. Every paid plan starts with a **14-day free trial**, and you don’t need a card to start it.`)],bi={welcome:{messages:[]},conversation:{messages:yi},streaming:{messages:[...yi.slice(0,2),Q(`u2`,`user`,`How do I move our projects from Trello?`),Q(`a2`,`assistant`,`Go to **Settings → Import** and choose Trello. Brightloop brings over`,{status:`streaming`})],busy:!0},attachments:{messages:[Q(`u1`,`user`,`Is this the right screen for exporting?`,{attachments:2,files:[{name:`screenshot.jpg`,kind:`image`,previewUrl:vi},{name:`export-guide.pdf`,kind:`pdf`}]}),Q(`a1`,`assistant`,``,{status:`streaming`})],pending:[{key:`p1`,name:`invoice-march.pdf`,kind:`pdf`,status:`ready`,handle:`h`},{key:`p2`,name:`team-photo.jpg`,kind:`image`,status:`uploading`,previewUrl:vi},{key:`p3`,name:`notes.svg`,status:`error`,error:`This file type is not supported.`}],busy:!0,activity:`Searching documents…`},error:{messages:[...yi.slice(0,2),Q(`u2`,`user`,`And the Enterprise plan?`),Q(`a2`,`assistant`,`Enterprise adds`,{status:`error`})],error:`The assistant took too long to respond. Please try again.`,draft:`And the Enterprise plan?`},listening:{messages:yi.slice(0,2),dictation:`recording`,elapsed:7}},xi=1e3,Si=3e3,Ci=/^[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+\\.[A-Za-z0-9_-]+$/;function wi(e){if(e===null)return null;if(typeof e==`string`)return e.length<=4096&&Ci.test(e)?e:(console.warn(`[askdare] askdare('identify') got something that isn't a JWT; signing out.`),null)}function Ti(e){let t=typeof e.greeting==`string`?e.greeting.trim():``,n=Array.isArray(e.starters)?e.starters.filter(e=>typeof e==`string`).map(e=>e.trim()).filter(e=>e.length>0&&e.length<=80).slice(0,4):void 0,r=typeof e.context==`string`?e.context.trim():``;return{...t&&t.length<=500?{greeting:t}:{},...n?{starters:n}:{},...r?{context:r.slice(0,xi)}:{}}}function Ei(e){let t=window.parent!==window,n,r=/* @__PURE__ */ new Set,i=/* @__PURE__ */ new Set,a,o=/* @__PURE__ */ new Set,s,c=e=>{if(e!==void 0){s=e;for(let t of o)t(e)}},l=()=>{},u=new Promise(e=>{l=e,t?setTimeout(e,Si):e()}),d=/* @__PURE__ */ new Set([window.location.origin,...e]),f=e=>{if(n||e.source!==window.parent||!d.has(e.origin))return;let t=e.data;t?.v===1&&t.type===`askdare:init`&&e.ports[0]&&(n=e.ports[0],n.onmessage=e=>{if(e.data?.v===1){if(e.data.type===`hidden`)for(let e of r)e();else if(e.data.type===`configure`){a=Ti(e.data);for(let e of i)e(a)}else e.data.type===`identify`&&c(wi(e.data.token))}},n.start(),n.postMessage({v:1,type:`ready`}),window.removeEventListener(`message`,f),c(wi(t.identity)),l())};return t&&window.addEventListener(`message`,f),{embedded:t,close(){n?.postMessage({v:1,type:`close`})},onHidden(e){return r.add(e),()=>r.delete(e)},onConfigure(e){return i.add(e),a&&e(a),()=>i.delete(e)},handshake:u,onIdentify(e){return o.add(e),s!==void 0&&e(s),()=>o.delete(e)}}}function Di(){return{get(e){try{return window.localStorage.getItem(e)??void 0}catch{return}},set(e,t){try{window.localStorage.setItem(e,t)}catch{}},remove(e){try{window.localStorage.removeItem(e)}catch{}}}}function Oi(){let e=document.getElementById(`askdare-config`),t=JSON.parse(e?.textContent??`null`);if(!t?.botId||!t.basePath)throw Error(`[askdare] Missing embed configuration.`);return t}var $=Oi(),ki=document.getElementById(`askdare-root`);if(ki){let e=new _i({basePath:$.basePath,botId:$.botId,locale:$.widget.locale,storage:Di(),translate:(e,t)=>{let n=$.widget.texts[e];return n===void 0?void 0:lt(n,t)}});ct(ki).render(/* @__PURE__ */ z(Zr,{config:$,client:e,bridge:Ei($.allowedOrigins),fixture:$.gallery?bi[$.gallery]:void 0,inline:new URLSearchParams(window.location.search).get(`mode`)===`inline`}))}";
66
+ const WIDGET_CSS = "@layer askdare{:root{--ask-color-accent:#6b52e0;--ask-color-on-accent:#fff;--ask-color-background:#fdfbfd;--ask-color-surface:#f5f0f7;--ask-color-text:#242424;--ask-color-muted:#5f5a68;--ask-color-border:#2424241a;--ask-color-danger:#b42318;--ask-color-success:#067647;--ask-color-user-bubble:#c2386f;--ask-color-on-user-bubble:#fff;--ask-backdrop:none;--ask-orb:radial-gradient(circle at 50% 28%, #ffa3c6, #b8a1f6 60%, #7dd8d0);--ask-font-family:system-ui, -apple-system, \"Segoe UI\", Roboto, sans-serif;--ask-font-family-heading:var(--ask-font-family);--ask-font-size:15px;--ask-radius:18px;--ask-space:8px;--ask-radius-small:calc(var(--ask-radius) * .6);--ask-shadow:0 1px 2px color-mix(in srgb, var(--ask-color-text) 6%, transparent), 0 8px 24px -10px color-mix(in srgb, var(--ask-color-text) 18%, transparent);--ask-ring:0 0 0 3px color-mix(in srgb, var(--ask-color-accent) 24%, transparent);--ask-glass:color-mix(in srgb, var(--ask-color-surface) 68%, transparent);--ask-ease:cubic-bezier(.2, .8, .2, 1);--lightningcss-light:initial;--lightningcss-dark: ;color-scheme:light}:root[data-ask-density=compact]{--ask-space:6px}*,:before,:after{box-sizing:border-box}html,body,#askdare-root{height:100%;margin:0}body{background:var(--ask-backdrop), var(--ask-color-background);background-color:var(--ask-color-background);color:var(--ask-color-text);font:var(--ask-font-size) / 1.55 var(--ask-font-family);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility}button{font:inherit;color:inherit}:focus-visible{outline:2px solid var(--ask-color-accent);outline-offset:2px}[data-ask-part=panel]{flex-direction:column;height:100%;display:flex;position:relative}[data-ask-part=header]{justify-content:space-between;align-items:center;gap:var(--ask-space);padding:calc(var(--ask-space) * 1.5) calc(var(--ask-space) * 1.5) calc(var(--ask-space) * 1.5) calc(var(--ask-space) * 2);border-bottom:1px solid var(--ask-color-border);background:var(--ask-color-background);display:flex}:root[data-ask-surface=glass] [data-ask-part=header]{background:color-mix(in srgb, var(--ask-color-background) 55%, transparent);-webkit-backdrop-filter:blur(18px)saturate(150%);backdrop-filter:blur(18px)saturate(150%);border-bottom-color:color-mix(in srgb, var(--ask-color-border) 70%, transparent)}[data-ask-part=identity]{align-items:center;gap:calc(var(--ask-space) * 1.25);min-width:0;display:flex}[data-ask-part=identity-text]{min-width:0}[data-ask-part=title]{font-family:var(--ask-font-family-heading);letter-spacing:-.01em;text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:1rem;font-weight:600;line-height:1.3;overflow:hidden}:root[data-ask-welcome=persona] [data-ask-part=title]{letter-spacing:0;font-size:1.15rem;font-weight:300}[data-ask-part=subtitle]{color:var(--ask-color-muted);text-overflow:ellipsis;white-space:nowrap;margin:0;font-size:.8rem;line-height:1.35;overflow:hidden}[data-ask-part=actions]{flex:none;gap:2px;display:flex}:is([data-ask-part=new-conversation],[data-ask-part=close]){width:34px;height:34px;color:var(--ask-color-muted);cursor:pointer;transition:background-color .15s var(--ask-ease), color .15s var(--ask-ease);background:0 0;border:0;border-radius:50%;place-items:center;padding:0;display:grid}:is([data-ask-part=new-conversation],[data-ask-part=close]):hover{background:var(--ask-color-surface);color:var(--ask-color-text)}[data-ask-part=avatar]{width:30px;height:30px;font-family:var(--ask-font-family);letter-spacing:.02em;border-radius:50%;flex:none;place-items:center;font-size:.75rem;font-weight:600;display:grid;overflow:hidden}[data-ask-part=avatar][data-size=large]{width:72px;height:72px;font-size:1.5rem}[data-ask-part=avatar] img{object-fit:cover;width:100%;height:100%}[data-ask-part=avatar][data-kind=initials]{background:var(--ask-color-user-bubble);color:var(--ask-color-on-user-bubble)}[data-ask-part=avatar][data-kind=icon]{background:var(--ask-color-accent);color:var(--ask-color-on-accent);border-radius:30%}[data-ask-part=avatar][data-kind=orb]{overflow:visible}[data-ask-part=avatar][data-kind=orb][data-size=large]{filter:drop-shadow(0 14px 22px color-mix(in srgb, var(--ask-color-accent) 32%, transparent))}[data-ask-part=orb]{background:var(--ask-orb);border-radius:50%;width:100%;height:100%;animation:6s ease-in-out infinite ask-breathe;display:block;position:relative;overflow:hidden;box-shadow:inset 0 -5px 12px #0000002e,inset 0 4px 10px #ffffff8c}[data-ask-part=orb]:before{content:\"\";background:conic-gradient(from 0deg, transparent 0 55%, #ffffff73 70%, transparent 85%);mix-blend-mode:soft-light;animation:9s linear infinite ask-spin;position:absolute;inset:-35%}[data-ask-part=orb]:after{content:\"\";background:radial-gradient(closest-side,#ffffffe6,#fff0);border-radius:50%;width:36%;height:28%;position:absolute;top:13%;left:20%}[data-ask-part=panel][data-busy] [data-ask-part=orb]{animation-duration:1.4s}[data-ask-part=messages]{gap:calc(var(--ask-space) * 1.5);overscroll-behavior:contain;padding:calc(var(--ask-space) * 2);scrollbar-width:thin;scrollbar-color:color-mix(in srgb, var(--ask-color-text) 18%, transparent) transparent;flex-direction:column;flex:1;display:flex;overflow-y:auto}[data-ask-part=status]{align-items:center;gap:var(--ask-space);color:var(--ask-color-muted);margin:0;font-size:.85rem;display:flex}[data-ask-part=status]:before{content:\"\";background:var(--ask-color-accent);border-radius:50%;width:8px;height:8px;animation:1.2s ease-in-out infinite ask-pulse}[data-ask-part=message]{align-items:flex-start;gap:var(--ask-space);max-width:88%;animation:ask-rise .26s var(--ask-ease) both;display:flex}[data-ask-part=message][data-role=user]{align-self:flex-end}[data-ask-part=message]>[data-ask-part=avatar]{margin-top:2px}[data-ask-part=message-body]{gap:calc(var(--ask-space) * .75);flex-direction:column;min-width:0;display:flex}[data-ask-part=message][data-role=user] [data-ask-part=message-body]{align-items:flex-end}[data-ask-part=bubble]{padding:calc(var(--ask-space) * 1.25) calc(var(--ask-space) * 1.75);border-radius:var(--ask-radius);overflow-wrap:anywhere;white-space:pre-wrap}[data-ask-part=message][data-role=assistant] [data-ask-part=bubble]{border-top-left-radius:calc(var(--ask-radius-small) * .6);background:var(--ask-color-surface);white-space:normal}[data-ask-part=message][data-role=user] [data-ask-part=bubble]{border-bottom-right-radius:calc(var(--ask-radius-small) * .6);background:var(--ask-color-user-bubble);color:var(--ask-color-on-user-bubble)}[data-ask-part=message][data-status=error] [data-ask-part=bubble]{opacity:.6}:root[data-ask-surface=glass] [data-ask-part=message][data-role=assistant] [data-ask-part=bubble]{border:1px solid color-mix(in srgb, var(--ask-color-background) 60%, transparent);background:var(--ask-glass);-webkit-backdrop-filter:blur(12px)saturate(140%);backdrop-filter:blur(12px)saturate(140%);box-shadow:0 1px 2px color-mix(in srgb, var(--ask-color-text) 5%, transparent)}:root[data-ask-bubbles=plain] [data-ask-part=message][data-role=assistant] [data-ask-part=bubble]{box-shadow:none;-webkit-backdrop-filter:none;backdrop-filter:none;background:0 0;border:0;padding-inline:0}[data-ask-part=bubble]>:first-child{margin-top:0}[data-ask-part=bubble]>:last-child{margin-bottom:0}[data-ask-part=bubble] :is(p,ul,ol,pre,table,blockquote){margin:0 0 var(--ask-space)}[data-ask-part=bubble] :is(h1,h2,h3,h4){margin:calc(var(--ask-space) * 1.5) 0 calc(var(--ask-space) * .75);font-size:1em;font-weight:650;line-height:1.35}[data-ask-part=bubble] :is(ul,ol){padding-left:calc(var(--ask-space) * 2.5)}[data-ask-part=bubble] li+li{margin-top:2px}[data-ask-part=bubble] blockquote{padding-left:calc(var(--ask-space) * 1.5);border-left:3px solid var(--ask-color-border);color:var(--ask-color-muted)}[data-ask-part=bubble] code{background:color-mix(in srgb, var(--ask-color-text) 7%, transparent);border-radius:5px;padding:.1em .35em;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.88em}[data-ask-part=bubble] pre{padding:calc(var(--ask-space) * 1.25);border-radius:var(--ask-radius-small);background:color-mix(in srgb, var(--ask-color-text) 6%, transparent);overflow-x:auto}[data-ask-part=bubble] pre code{background:0 0;padding:0}[data-ask-part=bubble] table{border-collapse:collapse;font-size:.92em;display:block;overflow-x:auto}[data-ask-part=bubble] :is(th,td){border-bottom:1px solid var(--ask-color-border);text-align:left;padding:5px 10px}[data-ask-part=bubble] th{font-weight:600}[data-ask-part=bubble] a{color:var(--ask-color-accent);text-underline-offset:2px;text-decoration-thickness:1px}[data-ask-part=typing]{gap:4px;padding:6px 2px;display:inline-flex}[data-ask-part=typing] i{background:var(--ask-color-muted);border-radius:50%;width:7px;height:7px;animation:1.2s ease-in-out infinite ask-dot}[data-ask-part=typing] i:nth-child(2){animation-delay:.15s}[data-ask-part=typing] i:nth-child(3){animation-delay:.3s}[data-ask-part=attachments-note]{color:var(--ask-color-muted);margin:0;font-size:.8rem}[data-ask-part=citations]{counter-reset:ask-citation;flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none;display:flex}[data-ask-part=citation]{border:1px solid var(--ask-color-border);background:var(--ask-color-background);counter-increment:ask-citation;border-radius:999px;align-items:center;gap:6px;max-width:100%;padding:3px 10px 3px 4px;font-size:.78rem;line-height:1.4;display:inline-flex}[data-ask-part=citation]:before{content:counter(ask-citation);background:var(--ask-color-surface);min-width:18px;height:18px;color:var(--ask-color-muted);border-radius:999px;flex:none;place-items:center;font-size:.7rem;font-weight:600;display:grid}[data-ask-part=citation] :is(a,span){color:var(--ask-color-text);text-overflow:ellipsis;white-space:nowrap;text-decoration:none;overflow:hidden}[data-ask-part=citation] a:hover{color:var(--ask-color-accent);text-decoration:underline}[data-ask-part=welcome]{gap:calc(var(--ask-space) * 1.5);flex-direction:column;display:flex}[data-ask-part=welcome][data-layout=hero]{padding:calc(var(--ask-space) * 2) calc(var(--ask-space) * .5);text-align:center;align-items:center;margin:auto 0}[data-ask-part=welcome][data-layout=hero] [data-ask-part=greeting]{max-width:300px;margin:calc(var(--ask-space) * 1.5) 0 0;font-family:var(--ask-font-family-heading);letter-spacing:-.02em;text-wrap:balance;font-size:1.45rem;font-weight:600;line-height:1.25}[data-ask-part=starters]{gap:var(--ask-space);width:100%;margin:calc(var(--ask-space) * .5) 0 0;flex-direction:column;padding:0;list-style:none;display:flex}[data-ask-part=starter]{align-items:center;gap:calc(var(--ask-space) * 1.25);width:100%;padding:calc(var(--ask-space) * 1.25) calc(var(--ask-space) * 1.75);border:1px solid var(--ask-color-border);border-radius:var(--ask-radius-small);background:var(--ask-color-background);box-shadow:0 1px 2px color-mix(in srgb, var(--ask-color-text) 5%, transparent);text-align:left;cursor:pointer;transition:border-color .15s var(--ask-ease), transform .15s var(--ask-ease), box-shadow .15s var(--ask-ease);font-size:.92rem;line-height:1.4;display:flex}[data-ask-part=starter] svg{color:var(--ask-color-accent);flex:none}[data-ask-part=starter] span{flex:1}[data-ask-part=starter]:hover:not(:disabled){border-color:color-mix(in srgb, var(--ask-color-accent) 45%, var(--ask-color-border));box-shadow:var(--ask-shadow);transform:translateY(-1px)}[data-ask-part=starter]:disabled{opacity:.55;cursor:default}:root[data-ask-surface=glass] [data-ask-part=starter]{border-color:color-mix(in srgb, var(--ask-color-background) 70%, var(--ask-color-border));background:var(--ask-glass);-webkit-backdrop-filter:blur(12px)saturate(140%);backdrop-filter:blur(12px)saturate(140%)}[data-ask-part=welcome][data-layout=persona]{padding-top:calc(var(--ask-space) * 2);margin-top:auto}[data-ask-part=persona]{align-items:center;gap:calc(var(--ask-space) * 2);display:flex}[data-ask-part=persona] [data-ask-part=avatar][data-size=large]{border-radius:22px;width:64px;height:64px}[data-ask-part=persona-name]{font-family:var(--ask-font-family-heading);letter-spacing:-.01em;margin:0 0 6px;font-size:1.75rem;font-weight:300;line-height:1.1}[data-ask-part=presence]{border:1px solid var(--ask-color-border);color:var(--ask-color-muted);border-radius:999px;align-items:center;gap:6px;padding:2px 10px 2px 8px;font-size:.75rem;font-weight:500;display:inline-flex}[data-ask-part=presence]:before{content:\"\";background:var(--ask-color-success);width:7px;height:7px;box-shadow:0 0 0 3px color-mix(in srgb, var(--ask-color-success) 20%, transparent);border-radius:50%}[data-ask-part=welcome][data-layout=persona] [data-ask-part=greeting]{margin:calc(var(--ask-space) * .5) 0 0;font-size:1rem;line-height:1.6}[data-ask-part=welcome][data-layout=persona] [data-ask-part=starter]{padding:calc(var(--ask-space) * 1.4) calc(var(--ask-space) * 2.25);background:var(--ask-color-accent);box-shadow:none;color:var(--ask-color-on-accent);border-color:#0000;border-radius:999px;font-weight:500}[data-ask-part=welcome][data-layout=persona] [data-ask-part=starter] svg{color:inherit}[data-ask-part=welcome][data-layout=persona] [data-ask-part=starter] svg:first-child{display:none}[data-ask-part=welcome][data-layout=persona] [data-ask-part=starter]:hover:not(:disabled){box-shadow:0 8px 20px -10px color-mix(in srgb, var(--ask-color-accent) 70%, transparent)}[data-ask-part=intro]{align-items:flex-start;gap:var(--ask-space);animation:ask-rise .26s var(--ask-ease) both;display:flex}[data-ask-part=intro]>[data-ask-part=avatar]{margin-top:2px}[data-ask-part=intro-card]{min-width:0;padding:calc(var(--ask-space) * 1.25) calc(var(--ask-space) * 1.75);border-radius:var(--ask-radius);border-top-left-radius:calc(var(--ask-radius-small) * .6);background:var(--ask-color-surface);flex:1}:root[data-ask-surface=glass] [data-ask-part=intro-card]{border:1px solid color-mix(in srgb, var(--ask-color-background) 60%, transparent);background:var(--ask-glass);-webkit-backdrop-filter:blur(12px)saturate(140%);backdrop-filter:blur(12px)saturate(140%)}[data-ask-part=welcome][data-layout=intro] [data-ask-part=greeting]{margin:0;font-size:1.02rem}[data-ask-part=intro-card] [data-ask-part=starters]{margin-top:var(--ask-space);gap:0;padding:0}[data-ask-part=welcome][data-layout=intro] li+li{border-top:1px solid var(--ask-color-border)}[data-ask-part=welcome][data-layout=intro] [data-ask-part=starter]{padding:calc(var(--ask-space) * 1.1) 0;box-shadow:none;background:0 0;border:0;border-radius:0;font-size:.98rem}[data-ask-part=welcome][data-layout=intro] [data-ask-part=starter] svg{color:var(--ask-color-success)}[data-ask-part=welcome][data-layout=intro] [data-ask-part=starter]:hover:not(:disabled){box-shadow:none;text-underline-offset:3px;text-decoration:underline;transform:none}[data-ask-part=confirm-backdrop]{z-index:5;padding:calc(var(--ask-space) * 2);background:color-mix(in srgb, var(--ask-color-background) 60%, transparent);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);animation:ask-fade .16s var(--ask-ease);place-items:center;display:grid;position:absolute;inset:0}[data-ask-part=confirm]{justify-items:center;gap:calc(var(--ask-space) * 1.5);width:min(300px,100%);padding:calc(var(--ask-space) * 2.5) calc(var(--ask-space) * 2) calc(var(--ask-space) * 2);border:1px solid var(--ask-color-border);border-radius:var(--ask-radius);background:var(--ask-color-surface);box-shadow:var(--ask-shadow);text-align:center;animation:ask-pop .2s var(--ask-ease);display:grid}[data-ask-part=confirm-icon]{background:color-mix(in srgb, var(--ask-color-accent) 12%, transparent);width:44px;height:44px;color:var(--ask-color-accent);border-radius:50%;place-items:center;display:grid}[data-ask-part=confirm-text]{color:var(--ask-color-text);text-wrap:balance;margin:0;font-size:.95rem;line-height:1.45}[data-ask-part=confirm-actions]{gap:var(--ask-space);width:100%;margin-top:calc(var(--ask-space) / 2);display:flex}:is([data-ask-part=confirm-cancel],[data-ask-part=confirm-accept]){padding:calc(var(--ask-space) * 1.1) var(--ask-space);border:1px solid var(--ask-color-border);border-radius:var(--ask-radius-small);color:var(--ask-color-text);font:inherit;cursor:pointer;transition:background .15s var(--ask-ease);background:0 0;flex:1;font-size:.9rem;font-weight:600}[data-ask-part=confirm-cancel]:hover{background:color-mix(in srgb, var(--ask-color-text) 6%, transparent)}[data-ask-part=confirm-accept]{border-color:var(--ask-color-accent);background:var(--ask-color-accent);color:var(--ask-color-on-accent)}[data-ask-part=confirm-accept]:hover{background:color-mix(in srgb, var(--ask-color-accent) 80%, var(--ask-color-background))}@keyframes ask-fade{0%{opacity:0}}@keyframes ask-pop{0%{opacity:0;transform:translateY(6px)scale(.97)}}[data-ask-part=error]{margin:0 calc(var(--ask-space) * 1.5) var(--ask-space);padding:var(--ask-space) calc(var(--ask-space) * 1.5);border:1px solid color-mix(in srgb, var(--ask-color-danger) 30%, transparent);border-radius:var(--ask-radius-small);background:color-mix(in srgb, var(--ask-color-danger) 8%, var(--ask-color-background));color:var(--ask-color-danger);font-size:.88rem}[data-ask-part=panel][data-dragging]{outline:2px dashed var(--ask-color-accent);outline-offset:-6px}[data-ask-part=composer]{gap:var(--ask-space);padding:var(--ask-space) calc(var(--ask-space) * 1.5) calc(var(--ask-space) * 1.5);flex-direction:column;display:flex}[data-ask-part=composer-box]{border:1px solid var(--ask-color-border);border-radius:calc(var(--ask-radius) + 4px);background:var(--ask-color-background);box-shadow:var(--ask-shadow);transition:border-color .15s var(--ask-ease), box-shadow .15s var(--ask-ease);align-items:flex-end;gap:4px;padding:6px;display:flex}[data-ask-part=composer-box]:focus-within{border-color:color-mix(in srgb, var(--ask-color-accent) 55%, var(--ask-color-border));box-shadow:var(--ask-shadow), var(--ask-ring)}:root[data-ask-surface=glass] [data-ask-part=composer-box]{background:color-mix(in srgb, var(--ask-color-background) 78%, transparent);-webkit-backdrop-filter:blur(16px)saturate(150%);backdrop-filter:blur(16px)saturate(150%)}:root[data-ask-composer=gradient] [data-ask-part=composer-box]{background:linear-gradient(var(--ask-color-background), var(--ask-color-background)) padding-box, var(--ask-orb) border-box;border:1.5px solid #0000}:root[data-ask-composer=gradient] [data-ask-part=composer-box]:focus-within{border-color:#0000}[data-ask-part=input]{min-height:36px;max-height:140px;color:inherit;font:inherit;resize:none;background:0 0;border:0;outline:0;flex:1;margin:0;padding:7px 8px;line-height:1.45}[data-ask-part=input]::placeholder{color:var(--ask-color-muted);opacity:1}:is([data-ask-part=attach],[data-ask-part=voice],[data-ask-part=send],[data-ask-part=recorder-cancel]){cursor:pointer;width:36px;height:36px;transition:background-color .15s var(--ask-ease), color .15s var(--ask-ease), transform .15s var(--ask-ease), opacity .15s var(--ask-ease);border:0;border-radius:50%;flex:none;place-items:center;padding:0;display:grid}:is([data-ask-part=attach],[data-ask-part=voice],[data-ask-part=recorder-cancel]){color:var(--ask-color-muted);background:0 0}:is([data-ask-part=attach],[data-ask-part=voice],[data-ask-part=recorder-cancel]):hover:not(:disabled){background:var(--ask-color-surface);color:var(--ask-color-text)}[data-ask-part=send]{background:var(--ask-color-accent);color:var(--ask-color-on-accent)}[data-ask-part=send]:hover:not(:disabled){transform:translateY(-1px)}[data-ask-part=send-label]{display:none}:is([data-ask-part=attach],[data-ask-part=voice],[data-ask-part=send]):disabled{opacity:.35;cursor:default}[data-ask-part=disclosure]{margin:calc(var(--ask-space) * -.5) 0 0;padding:0 calc(var(--ask-space) * 2) calc(var(--ask-space) * 1.25);color:var(--ask-color-muted);text-align:center;font-size:.72rem;line-height:1.4}[data-ask-part=disclosure] a{color:inherit;text-underline-offset:2px}:is([data-ask-part=attachments],[data-ask-part=message-attachments]){flex-wrap:wrap;gap:6px;margin:0;padding:0;list-style:none;display:flex}[data-ask-part=message-attachments]{justify-content:flex-end}[data-ask-part=attachment]{border:1px solid var(--ask-color-border);border-radius:var(--ask-radius-small);background:var(--ask-color-background);align-items:center;gap:8px;max-width:100%;padding:4px 6px 4px 4px;font-size:.82rem;display:flex}[data-ask-part=attachment][data-status=error]{border-color:var(--ask-color-danger)}:is([data-ask-part=attachment-preview],[data-ask-part=attachment-badge]){border-radius:calc(var(--ask-radius-small) * .7);flex:none;width:34px;height:34px}[data-ask-part=attachment-preview]{object-fit:cover}[data-ask-part=attachment-badge]{background:var(--ask-color-surface);color:var(--ask-color-muted);letter-spacing:.04em;place-items:center;font-size:.65rem;font-weight:700;display:grid}[data-ask-part=attachment-name]{text-overflow:ellipsis;white-space:nowrap;max-width:160px;overflow:hidden}[data-ask-part=attachment-status]{color:var(--ask-color-muted)}[data-ask-part=attachment][data-status=error] [data-ask-part=attachment-status]{color:var(--ask-color-danger)}[data-ask-part=attachment-remove]{color:var(--ask-color-muted);cursor:pointer;background:0 0;border:0;padding:0 4px;font-size:1.1em}[data-ask-part=recorder]{align-items:center;gap:var(--ask-space);flex:1;min-height:36px;padding-left:10px;display:flex}[data-ask-part=recorder-level]{background:var(--ask-color-danger);width:14px;height:14px;box-shadow:0 0 0 calc(var(--ask-level,0) * 10px) color-mix(in srgb, var(--ask-color-danger) 18%, transparent);transform:scale(calc(.7 + var(--ask-level,0) * .6));border-radius:50%;flex:none;transition:transform 80ms linear,box-shadow 80ms linear}[data-ask-part=recorder][data-state=transcribing] [data-ask-part=recorder-level]{background:var(--ask-color-muted);box-shadow:none;animation:1.2s ease-in-out infinite ask-pulse;transform:none}[data-ask-part=recorder-label]{font-weight:600}[data-ask-part=recorder-time]{color:var(--ask-color-muted);font-variant-numeric:tabular-nums;margin-right:auto}[data-ask-part=recorder][data-state=transcribing] [data-ask-part=recorder-label]{margin-right:auto}[data-ask-part=recorder-done]{height:36px;padding:0 calc(var(--ask-space) * 2);background:var(--ask-color-accent);color:var(--ask-color-on-accent);cursor:pointer;border:0;border-radius:999px;font-weight:600}@media (max-width:480px){[data-ask-part=input]{font-size:16px}}@keyframes ask-rise{0%{opacity:0;transform:translateY(6px)}}@keyframes ask-dot{0%,60%,to{opacity:.35;transform:translateY(0)}30%{opacity:1;transform:translateY(-3px)}}@keyframes ask-pulse{50%{opacity:.35}}@keyframes ask-breathe{50%{filter:saturate(1.15)brightness(1.04);transform:scale(1.04)}}@keyframes ask-spin{to{transform:rotate(360deg)}}:root:is([data-ask-preset=aura],[data-ask-preset=halo]) [data-ask-part=starters]{flex-flow:wrap;justify-content:center;gap:8px}:root:is([data-ask-preset=aura],[data-ask-preset=halo]) [data-ask-part=starter]{border-radius:999px;width:auto;padding:7px 14px 7px 11px;font-size:.82rem}:root[data-ask-preset=aura] [data-ask-part=welcome][data-layout=hero]{isolation:isolate;position:relative}:root[data-ask-preset=aura] [data-ask-part=welcome][data-layout=hero]:before{content:\"\";z-index:-1;background:radial-gradient(circle, color-mix(in srgb, var(--ask-color-text) 9%, transparent) 1px, transparent 1.4px) 0 0 / 14px 14px;pointer-events:none;position:absolute;inset:-6% 0 34%;-webkit-mask-image:radial-gradient(closest-side,#000 20%,#0000 100%);mask-image:radial-gradient(closest-side,#000 20%,#0000 100%)}:root[data-ask-preset=aura] [data-ask-part=welcome][data-layout=hero] [data-ask-part=avatar][data-size=large]{width:116px;height:116px;filter:drop-shadow(0 22px 26px color-mix(in srgb, var(--ask-color-accent) 22%, transparent));-webkit-box-reflect:below 6px linear-gradient(transparent 52%, #ffffff6b);margin-bottom:30px}:root[data-ask-preset=aura] [data-ask-part=orb]{box-shadow:inset 0 -10px 22px #ffffff59,inset 0 8px 16px #ffffffa6,inset 0 0 0 1px #ffffff80}:root[data-ask-preset=aura] [data-ask-part=welcome][data-layout=hero] [data-ask-part=greeting]{letter-spacing:-.03em;max-width:320px;font-size:1.6rem;font-weight:700}:root[data-ask-preset=aura] [data-layout=hero] [data-ask-part=greeting]:has(strong){color:color-mix(in srgb, var(--ask-color-text) 58%, var(--ask-color-background));font-weight:500}:root[data-ask-preset=aura] [data-ask-part=greeting] strong{color:var(--ask-color-text);font-weight:700}:root[data-ask-preset=aura] [data-ask-part=starter]{background:var(--ask-color-background);-webkit-backdrop-filter:none;backdrop-filter:none}:root[data-ask-preset=aura]{--ask-aura-gradient-end:var(--ask-color-accent)}:root[data-ask-preset=aura][data-ask-scheme=dark]{--ask-aura-gradient-end:color-mix(in srgb, var(--ask-color-accent) 55%, #000)}@media (prefers-color-scheme:dark){:root[data-ask-preset=aura][data-ask-scheme=auto]{--ask-aura-gradient-end:color-mix(in srgb, var(--ask-color-accent) 55%, #000)}}:root[data-ask-preset=aura] [data-ask-part=message][data-role=user] [data-ask-part=bubble],:root[data-ask-preset=aura] [data-ask-part=send]{background:linear-gradient(115deg, var(--ask-color-user-bubble), var(--ask-aura-gradient-end));color:var(--ask-color-on-user-bubble)}:root[data-ask-preset=aura] [data-ask-part=message][data-role=user] [data-ask-part=bubble]{border-radius:20px 20px 6px}:root[data-ask-preset=aura] [data-ask-part=composer-box]{border-radius:22px;flex-wrap:wrap;align-items:center;padding:10px 10px 8px}:root[data-ask-preset=aura] [data-ask-part=input]{flex:1 0 100%;order:-1;min-height:44px;padding:4px 8px 6px}:root[data-ask-preset=aura] :is([data-ask-part=attach],[data-ask-part=voice]){border:1px solid var(--ask-color-border);background:var(--ask-color-background);border-radius:999px;width:34px;height:32px}:root[data-ask-preset=aura] :is([data-ask-part=voice],[data-ask-part=send]:not([data-ask-part=voice]~*)){margin-left:auto}:root[data-ask-preset=aura] [data-ask-part=send]{border-radius:999px;gap:6px;width:auto;height:32px;padding:0 14px 0 10px;display:inline-flex}:root[data-ask-preset=aura] [data-ask-part=send] svg{width:16px;height:16px}:root[data-ask-preset=aura] [data-ask-part=send-label]{font-size:.82rem;font-weight:600;display:inline}:root[data-ask-preset=halo] [data-ask-part=welcome][data-layout=hero] [data-ask-part=avatar][data-size=large]{width:104px;height:104px;box-shadow:0 0 0 12px color-mix(in srgb, var(--ask-color-accent) 9%, transparent), 0 0 0 26px color-mix(in srgb, var(--ask-color-accent) 5%, transparent), 0 26px 50px -14px color-mix(in srgb, var(--ask-color-accent) 45%, transparent);filter:none;border-radius:50%;margin:18px 0 14px}:root[data-ask-preset=halo] [data-ask-part=orb]{box-shadow:inset 0 0 0 2px #ffffff8c, inset 0 -12px 24px color-mix(in srgb, var(--ask-color-accent) 35%, transparent), inset 0 10px 18px #ffffffb3}:root[data-ask-preset=halo] [data-ask-part=welcome][data-layout=hero] [data-ask-part=greeting]{letter-spacing:-.035em;font-size:1.7rem;font-weight:700}:root[data-ask-preset=halo] [data-ask-part=message][data-role=user] [data-ask-part=bubble]{border-radius:18px 18px 6px}:root[data-ask-preset=halo] [data-ask-part=composer-box]{box-shadow:0 10px 30px -14px color-mix(in srgb, var(--ask-color-accent) 45%, transparent);border-radius:999px;align-items:center;padding:6px 6px 6px 10px}:root[data-ask-preset=halo] :is([data-ask-part=voice],[data-ask-part=send]){background:color-mix(in srgb, var(--ask-color-accent) 15%, var(--ask-color-background));width:40px;height:40px;color:var(--ask-color-accent)}:root[data-ask-preset=halo] [data-ask-part=input]{align-self:center}:root[data-ask-preset=sage] [data-ask-part=welcome][data-layout=persona]{padding:calc(var(--ask-space) * 2.25);border:1px solid var(--ask-color-border);background:linear-gradient(160deg, var(--ask-color-background) 30%, color-mix(in srgb, var(--ask-color-surface) 70%, var(--ask-color-background)));box-shadow:var(--ask-shadow);border-radius:26px}:root[data-ask-preset=sage] [data-ask-part=persona]{flex-direction:row-reverse;justify-content:space-between}:root[data-ask-preset=sage] [data-ask-part=welcome] [data-ask-part=persona] [data-ask-part=avatar][data-size=large]{border-radius:50%;width:84px;height:84px}:root[data-ask-preset=sage] [data-ask-part=persona-name]{letter-spacing:-.03em;order:2;margin:10px 0 0;font-size:1.9rem;font-weight:300}:root[data-ask-preset=sage] [data-ask-part=persona]>div{flex-direction:column;align-items:flex-start;display:flex}:root[data-ask-preset=sage] [data-ask-part=presence]{background:var(--ask-color-background);box-shadow:0 1px 2px color-mix(in srgb, var(--ask-color-text) 8%, transparent);color:var(--ask-color-text);border-color:#0000;padding:3px 10px 3px 8px}:root[data-ask-preset=sage] [data-ask-part=welcome][data-layout=persona] [data-ask-part=greeting]{color:var(--ask-color-muted);font-weight:300}:root[data-ask-preset=sage] [data-ask-part=starters]{flex-flow:wrap;gap:8px}:root[data-ask-preset=sage] [data-ask-part=starter]{border-radius:999px;width:auto;padding:8px 16px;font-size:.85rem}:root[data-ask-preset=sage] [data-ask-part=starter] svg{display:none}:root[data-ask-preset=sage] li:first-child>[data-ask-part=starter]{border-color:var(--ask-color-accent);background:var(--ask-color-accent);color:var(--ask-color-on-accent)}:root[data-ask-preset=sage] [data-ask-part=message][data-role=user] [data-ask-part=bubble]{border:1px solid var(--ask-color-border);box-shadow:0 1px 2px color-mix(in srgb, var(--ask-color-text) 6%, transparent)}:root[data-ask-preset=sage] [data-ask-part=composer-box]{border-radius:999px;align-items:center;padding:6px 6px 6px 8px;position:relative}:root[data-ask-preset=sage] [data-ask-part=composer-box]:has(>[data-ask-part=voice]){margin-right:54px}:root[data-ask-preset=sage] [data-ask-part=send]{width:40px;height:40px}:root[data-ask-preset=sage] [data-ask-part=voice]{border:1px solid var(--ask-color-border);background:var(--ask-color-background);width:46px;height:46px;box-shadow:var(--ask-shadow);color:var(--ask-color-text);position:absolute;top:50%;right:-54px;transform:translateY(-50%)}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none!important;animation:none!important}[data-ask-part=recorder-level]{opacity:calc(.4 + var(--ask-level,0) * .6);transform:none}}}\n/*$vite$:1*/";
67
+ const WIDGET_JS_FILE = "widget.59b5e54b633b.js";
68
+ const WIDGET_CSS_FILE = "widget.820e1bb47b3f.css";
69
+ const FONTS_CSS = "@font-face {\n font-family: 'Geist Variable';\n font-style: normal;\n font-display: swap;\n font-weight: 100 900;\n src: url(./geist-latin-ext-wght-normal.824f485b5d26.woff2) format('woff2');\n unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n@font-face {\n font-family: 'Geist Variable';\n font-style: normal;\n font-display: swap;\n font-weight: 100 900;\n src: url(./geist-latin-wght-normal.19f9c92546aa.woff2) format('woff2');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}\n@font-face {\n font-family: 'Plus Jakarta Sans Variable';\n font-style: normal;\n font-display: swap;\n font-weight: 200 800;\n src: url(./plus-jakarta-sans-latin-ext-wght-normal.38e3b8fd8045.woff2) format('woff2');\n unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n@font-face {\n font-family: 'Plus Jakarta Sans Variable';\n font-style: normal;\n font-display: swap;\n font-weight: 200 800;\n src: url(./plus-jakarta-sans-latin-wght-normal.153fc85b7029.woff2) format('woff2');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}\n@font-face {\n font-family: 'Atkinson Hyperlegible Next Variable';\n font-style: normal;\n font-display: swap;\n font-weight: 200 800;\n src: url(./atkinson-hyperlegible-next-latin-ext-wght-normal.7dae0c6c66af.woff2) format('woff2');\n unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n@font-face {\n font-family: 'Atkinson Hyperlegible Next Variable';\n font-style: normal;\n font-display: swap;\n font-weight: 200 800;\n src: url(./atkinson-hyperlegible-next-latin-wght-normal.18b2a1a39a2f.woff2) format('woff2');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}";
70
+ const FONTS_CSS_FILE = "fonts.c3792c78d2c3.css";
71
+ /** Base64 woff2 files by published name. */
72
+ const FONT_FILES = {
73
+ "geist-latin-ext-wght-normal.824f485b5d26.woff2": "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",
74
+ "geist-latin-wght-normal.19f9c92546aa.woff2": "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",
75
+ "plus-jakarta-sans-latin-ext-wght-normal.38e3b8fd8045.woff2": "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",
76
+ "plus-jakarta-sans-latin-wght-normal.153fc85b7029.woff2": "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",
77
+ "atkinson-hyperlegible-next-latin-ext-wght-normal.7dae0c6c66af.woff2": "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",
78
+ "atkinson-hyperlegible-next-latin-wght-normal.18b2a1a39a2f.woff2": "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"
79
+ };
80
+ // src/limits/client-ip.ts
81
+ const IPV4 = /^(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)(\.(25[0-5]|2[0-4]\d|1\d\d|[1-9]?\d)){3}$/;
82
+ const HEXTET = /^[0-9a-f]{1,4}$/;
83
+ function ipv6Hextets(value) {
84
+ const halves = value.split("::");
85
+ if (halves.length > 2) return void 0;
86
+ const split = (part) => part ? part.split(":") : [];
87
+ const head = split(halves[0]);
88
+ const tail = split(halves[1]);
89
+ const missing = 8 - head.length - tail.length;
90
+ if (halves.length === 1 ? missing !== 0 : missing < 1) return void 0;
91
+ const hextets = [
92
+ ...head,
93
+ ...Array(halves.length === 2 ? missing : 0).fill("0"),
94
+ ...tail
95
+ ];
96
+ return hextets.every((hextet) => HEXTET.test(hextet)) ? hextets : void 0;
97
+ }
98
+ /**
99
+ * Validates an address and turns it into a rate-limit key. IPv6 is reduced to its /64 prefix,
100
+ * because anyone with a /64 (common on VPS providers) controls 2^64 addresses.
101
+ */
102
+ function normalizeIp(raw) {
103
+ if (!raw || raw.length > 64) return void 0;
104
+ let ip = raw.trim().toLowerCase();
105
+ const bracketed = /^\[([^\]]+)\](?::\d+)?$/.exec(ip);
106
+ if (bracketed?.[1]) ip = bracketed[1];
107
+ else if (/^[\d.]+:\d+$/.test(ip)) ip = ip.slice(0, ip.lastIndexOf(":"));
108
+ if (IPV4.test(ip)) return ip;
109
+ const mapped = /^::ffff:([\d.]+)$/.exec(ip);
110
+ if (mapped?.[1] && IPV4.test(mapped[1])) return mapped[1];
111
+ const hextets = ipv6Hextets(ip);
112
+ if (!hextets) return void 0;
113
+ return `${hextets.slice(0, 4).map((hextet) => hextet.replace(/^0+(?=.)/, "")).join(":")}::/64`;
114
+ }
115
+ /** Best-effort client IP for rate-limit keys, never for authentication. `unknown` if unusable. */
116
+ function getClientIp(request, trustProxy = "auto") {
117
+ const vercel = trustProxy === "vercel" || trustProxy === "auto" && Boolean(process.env["VERCEL"]);
118
+ const forwarded = (request.headers.get("x-forwarded-for") ?? "").split(",").map((entry) => entry.trim()).filter(Boolean);
119
+ let candidate;
120
+ if (vercel) candidate = request.headers.get("x-real-ip") ?? forwarded[0];
121
+ else {
122
+ const proxies = typeof trustProxy === "number" ? Math.max(1, Math.floor(trustProxy)) : 1;
123
+ candidate = forwarded.length >= proxies ? forwarded[forwarded.length - proxies] : void 0;
124
+ }
125
+ return normalizeIp(candidate) ?? "unknown";
126
+ }
127
+ // src/limits/limits.ts
128
+ const MINUTE = 6e4;
129
+ const HOUR = 60 * MINUTE;
130
+ const DAY = 24 * HOUR;
131
+ const CONVERSATION_TTL = 30 * DAY;
132
+ /** Dictations transcribing at once, per IP and per bot, which bounds how far parallel requests can overshoot. */
133
+ const TRANSCRIPTIONS_IN_FLIGHT_PER_IP = 2;
134
+ const TRANSCRIPTIONS_IN_FLIGHT_PER_BOT = 10;
135
+ /** In-flight slots expire on their own if a process dies mid-transcription. */
136
+ const IN_FLIGHT_WINDOW = 2 * MINUTE;
137
+ /** Rough input cost of one file search chunk (about 800 tokens by default). */
138
+ const SEARCH_RESULT_TOKENS = 800;
139
+ /**
140
+ * Bounds what an anonymous visitor can cost (ADR-0004). Each turn first passes request-rate limits,
141
+ * then reserves an estimate (expected input + `maxOutputTokens`) against the bot, per-IP and
142
+ * global daily budgets. The reservation is atomic, so concurrent turns can't overshoot, and it
143
+ * stays charged when a turn is aborted or fails, so disconnecting early saves the attacker nothing.
144
+ */
145
+ function createLimits(options) {
146
+ const { store } = options;
147
+ const now = options.now ?? Date.now;
148
+ const assertEnabled = () => {
149
+ if (options.disabled?.()) throw new AskdareError("bot_unavailable");
150
+ };
151
+ const enforce = async (key, windowMs, limit, custom) => {
152
+ const { count, resetMs } = await store.hit(key, windowMs, 1);
153
+ if (count > limit) throw new AskdareError("rate_limited", {
154
+ retryAfterMs: Math.max(resetMs, 1e3),
155
+ ...custom
156
+ });
157
+ };
158
+ const day = () => new Date(now()).toISOString().slice(0, 10);
159
+ const untilMidnight = () => Date.parse(`${day()}T00:00:00Z`) + DAY - now();
160
+ const budgets = (bot, clientIp) => [
161
+ {
162
+ key: `ask:t:${bot.id}:${day()}`,
163
+ limit: bot.limits.dailyTokens,
164
+ exhausted: `The daily token budget of bot "${bot.id}" (limits.dailyTokens) is used up until 00:00 UTC.`
165
+ },
166
+ {
167
+ key: `ask:ti:${bot.id}:${clientIp}:${day()}`,
168
+ limit: bot.limits.dailyTokensPerIp
169
+ },
170
+ ...options.globalDailyTokens === void 0 ? [] : [{
171
+ key: `ask:tg:${day()}`,
172
+ limit: options.globalDailyTokens,
173
+ exhausted: "The global daily token budget (globalDailyTokens) is used up until 00:00 UTC."
174
+ }]
175
+ ];
176
+ const reported = /* @__PURE__ */ new Set();
177
+ const reserve = async (list, amount) => {
178
+ const charged = [];
179
+ for (const budget of list) {
180
+ const { count } = await store.hit(budget.key, 2 * DAY, amount);
181
+ charged.push(budget);
182
+ if (count > budget.limit) {
183
+ await Promise.all(charged.map((item) => store.hit(item.key, 2 * DAY, -amount)));
184
+ if (budget.exhausted && !reported.has(budget.key)) {
185
+ if (reported.size > 1e3) reported.clear();
186
+ reported.add(budget.key);
187
+ options.onExhausted?.(budget.exhausted);
188
+ }
189
+ throw new AskdareError("budget_exceeded", { retryAfterMs: Math.max(untilMidnight(), 1e3) });
190
+ }
191
+ }
192
+ };
193
+ return {
194
+ async checkSession(bot, keys) {
195
+ assertEnabled();
196
+ if (keys.returningVisitorId) await enforce(`ask:sv:${bot.id}:${keys.returningVisitorId}`, HOUR, 12);
197
+ else await enforce(`ask:s:${bot.id}:${keys.clientIp}`, HOUR, bot.limits.sessionsPerIpPerHour);
198
+ },
199
+ async checkDoctor() {
200
+ assertEnabled();
201
+ await enforce("ask:doctor", MINUTE, 3);
202
+ },
203
+ async checkConversationAccess(bot, visitorId) {
204
+ assertEnabled();
205
+ await enforce(`ask:r:${bot.id}:${visitorId}`, MINUTE, 20);
206
+ },
207
+ async checkUpload(bot, keys) {
208
+ assertEnabled();
209
+ await enforce(`ask:uv:${bot.id}:${keys.visitorId}`, HOUR, bot.limits.uploadsPerVisitorPerHour);
210
+ await enforce(`ask:ui:${bot.id}:${keys.clientIp}`, HOUR, bot.limits.uploadsPerIpPerHour);
211
+ await enforce(`ask:ud:${bot.id}:${day()}`, DAY, bot.limits.uploadsPerDay);
212
+ },
213
+ async beginTranscription(bot, keys) {
214
+ assertEnabled();
215
+ const { limits } = bot;
216
+ await enforce(`ask:tv:${bot.id}:${keys.visitorId}`, HOUR, limits.transcriptionsPerVisitorPerHour);
217
+ const slots = [{
218
+ key: `ask:tfi:${bot.id}:${keys.clientIp}`,
219
+ limit: TRANSCRIPTIONS_IN_FLIGHT_PER_IP
220
+ }, {
221
+ key: `ask:tfb:${bot.id}`,
222
+ limit: TRANSCRIPTIONS_IN_FLIGHT_PER_BOT
223
+ }];
224
+ const taken = [];
225
+ const release = () => Promise.all(taken.map((slot) => store.hit(slot.key, IN_FLIGHT_WINDOW, -1)));
226
+ for (const slot of slots) {
227
+ const { count } = await store.hit(slot.key, IN_FLIGHT_WINDOW, 1);
228
+ taken.push(slot);
229
+ if (count > slot.limit) {
230
+ await release();
231
+ throw new AskdareError("rate_limited", {
232
+ retryAfterMs: 5e3,
233
+ message: "Another dictation is still being transcribed. Please try again in a moment.",
234
+ key: "error.dictationBusy"
235
+ });
236
+ }
237
+ }
238
+ const reserved = bot.voice?.maxSeconds ?? 60;
239
+ const list = [{
240
+ key: `ask:vs:${bot.id}:${day()}`,
241
+ limit: limits.voiceSecondsPerDay,
242
+ exhausted: `The daily speech budget of bot "${bot.id}" (limits.voiceSecondsPerDay) is used up until 00:00 UTC.`
243
+ }, {
244
+ key: `ask:vsi:${bot.id}:${keys.clientIp}:${day()}`,
245
+ limit: limits.voiceSecondsPerIpPerDay
246
+ }];
247
+ try {
248
+ await reserve(list, reserved);
249
+ } catch (error) {
250
+ await release();
251
+ if (error instanceof AskdareError && error.code === "budget_exceeded") throw new AskdareError("budget_exceeded", {
252
+ retryAfterMs: Math.max(untilMidnight(), 1e3),
253
+ message: "Dictation is unavailable for the rest of the day. You can still type.",
254
+ key: "error.dictationBudget"
255
+ });
256
+ throw error;
257
+ }
258
+ return { async settle(seconds) {
259
+ const difference = Math.ceil(seconds) - reserved;
260
+ await Promise.all([...list.map((budget) => store.hit(budget.key, 2 * DAY, difference)), release()]);
261
+ } };
262
+ },
263
+ async beginTurn(bot, keys) {
264
+ assertEnabled();
265
+ const { limits } = bot;
266
+ await enforce(`ask:mv:${bot.id}:${keys.visitorId}`, MINUTE, limits.messagesPerVisitorPerMinute);
267
+ await enforce(`ask:mi:${bot.id}:${keys.clientIp}`, MINUTE, limits.messagesPerIpPerMinute);
268
+ let historyTokens = 0;
269
+ if (keys.conversationId) {
270
+ await enforce(`ask:c:${keys.conversationId}`, CONVERSATION_TTL, limits.maxTurns, {
271
+ message: "This conversation is too long. Please start a new one.",
272
+ key: "error.conversationTooLong"
273
+ });
274
+ historyTokens = (await store.hit(`ask:ci:${keys.conversationId}`, CONVERSATION_TTL, 0)).count;
275
+ } else await enforce(`ask:cc:${bot.id}:${keys.clientIp}`, HOUR, limits.conversationsPerIpPerHour);
276
+ const perCall = historyTokens + Math.ceil(keys.inputChars / 2) + limits.maxOutputTokens + (keys.attachmentTokens ?? 0) + (bot.knowledge ? bot.knowledge.maxResults * SEARCH_RESULT_TOKENS : 0);
277
+ const list = budgets(bot, keys.clientIp);
278
+ await reserve(list, perCall);
279
+ let reserved = perCall;
280
+ return {
281
+ async extend() {
282
+ try {
283
+ await reserve(list, perCall);
284
+ } catch (error) {
285
+ if (error instanceof AskdareError && error.code === "budget_exceeded") return false;
286
+ throw error;
287
+ }
288
+ reserved += perCall;
289
+ return true;
290
+ },
291
+ async settle(usage, conversationId) {
292
+ const actual = usage.inputTokens + usage.outputTokens;
293
+ await Promise.all(list.map((budget) => store.hit(budget.key, 2 * DAY, actual - reserved)));
294
+ const inputKey = `ask:ci:${conversationId}`;
295
+ const previous = (await store.hit(inputKey, CONVERSATION_TTL, 0)).count;
296
+ await store.hit(inputKey, CONVERSATION_TTL, usage.inputTokens - previous);
297
+ if (!keys.conversationId) await store.hit(`ask:c:${conversationId}`, CONVERSATION_TTL, 1);
298
+ }
299
+ };
300
+ }
301
+ };
302
+ }
303
+ // src/limits/store.ts
304
+ /** Windows up to this length are short-lived rate counters and may be evicted under pressure. */
305
+ const EVICTABLE_WINDOW_MS = 36e5;
306
+ /** Expired windows are dropped at least this often: their keys hold IP addresses. */
307
+ const SWEEP_INTERVAL_MS = 6e4;
308
+ /**
309
+ * Per-process counters, kept in least-recently-used order. Expired windows are dropped every
310
+ * minute. When full, it also drops the least recently used short-lived rate counters. It never
311
+ * evicts long windows (budgets, conversation lengths): when only those remain, it fails closed
312
+ * instead of forgetting spend.
313
+ */
314
+ function memoryStore(options = {}) {
315
+ const now = options.now ?? Date.now;
316
+ const maxKeys = options.maxKeys ?? 5e4;
317
+ const windows = /* @__PURE__ */ new Map();
318
+ let sweptAt = now();
319
+ const sweep = (time) => {
320
+ for (const [key, window] of windows) if (window.resetAt <= time) windows.delete(key);
321
+ sweptAt = time;
322
+ };
323
+ const makeRoom = (time) => {
324
+ sweep(time);
325
+ for (const [key, window] of windows) {
326
+ if (windows.size < maxKeys) return;
327
+ if (window.windowMs <= EVICTABLE_WINDOW_MS) windows.delete(key);
328
+ }
329
+ if (windows.size >= maxKeys) throw new Error("[askdare] In-memory rate-limit store is full; use a shared store.");
330
+ };
331
+ return {
332
+ shared: false,
333
+ get size() {
334
+ return windows.size;
335
+ },
336
+ async hit(key, windowMs, amount) {
337
+ const time = now();
338
+ if (time - sweptAt >= SWEEP_INTERVAL_MS) sweep(time);
339
+ let window = windows.get(key);
340
+ if (window && window.resetAt > time) windows.delete(key);
341
+ else {
342
+ if (window) windows.delete(key);
343
+ if (windows.size >= maxKeys) makeRoom(time);
344
+ window = {
345
+ count: 0,
346
+ resetAt: time + windowMs,
347
+ windowMs
348
+ };
349
+ }
350
+ windows.set(key, window);
351
+ window.count += amount;
352
+ return {
353
+ count: window.count,
354
+ resetMs: window.resetAt - time
355
+ };
356
+ }
357
+ };
358
+ }
359
+ // src/openai/attachments.ts
360
+ /** Longest expiry OpenAI allows; attachments outlive no conversation by more than this. */
361
+ const FILE_TTL_SECONDS = 2592e3;
362
+ /** Items scanned for attachments before deleting a conversation (conversations are capped by maxTurns). */
363
+ const MAX_ITEMS = 1e3;
364
+ /** IDs of the files the visitor attached in a conversation. */
365
+ async function attachedFileIds(client, conversationId) {
366
+ const ids = /* @__PURE__ */ new Set();
367
+ let scanned = 0;
368
+ for await (const item of client.conversations.items.list(conversationId, { limit: 100 })) {
369
+ scanned += 1;
370
+ if (scanned > MAX_ITEMS) break;
371
+ if (item.type !== "message" || item.role !== "user") continue;
372
+ for (const part of item.content) if ((part.type === "input_image" || part.type === "input_file") && part.file_id) ids.add(part.file_id);
373
+ }
374
+ return [...ids];
375
+ }
376
+ /** Best effort: a file that fails to delete still expires on its own. */
377
+ async function deleteFiles(client, fileIds) {
378
+ for (let index = 0; index < fileIds.length; index += 5) await Promise.all(fileIds.slice(index, index + 5).map(async (fileId) => {
379
+ try {
380
+ await client.files.delete(fileId);
381
+ } catch (error) {
382
+ if (!(error instanceof NotFoundError)) console.error("[askdare] could not delete an attachment file:", fileId);
383
+ }
384
+ }));
385
+ }
386
+ // src/openai/diagnose.ts
387
+ /** Doctor requests fail fast instead of retrying: the operator is waiting at a terminal. */
388
+ const OPTIONS = {
389
+ timeout: 2e4,
390
+ maxRetries: 0
391
+ };
392
+ /** Only the status and code leave this module: OpenAI messages may quote part of the key. */
393
+ function failureOf(error) {
394
+ if (error instanceof APIConnectionError) return {
395
+ status: void 0,
396
+ code: "connection",
397
+ forbidden: false
398
+ };
399
+ if (error instanceof APIError) {
400
+ const code = typeof error.code === "string" ? error.code : void 0;
401
+ const forbidden = error.status === 403 || error.status === 401 && (code === "missing_scope" || /missing scopes/i.test(error.message));
402
+ return {
403
+ status: error.status,
404
+ code,
405
+ forbidden
406
+ };
407
+ }
408
+ return {
409
+ status: void 0,
410
+ code: void 0,
411
+ forbidden: false
412
+ };
413
+ }
414
+ const KEY_REJECTED = {
415
+ status: "fail",
416
+ title: "OpenAI rejected OPENAI_API_KEY.",
417
+ fix: "Create a key in the bot's OpenAI project and set OPENAI_API_KEY where the app runs."
418
+ };
419
+ /** The common outcomes; `forbidden` names the permission a restricted key needs. */
420
+ function failed(what, failure, forbidden) {
421
+ if (failure.forbidden) return {
422
+ status: "fail",
423
+ title: `The key may not ${what}.`,
424
+ fix: forbidden
425
+ };
426
+ if (failure.status === 401) return KEY_REJECTED;
427
+ if (failure.code === "insufficient_quota") return {
428
+ status: "fail",
429
+ title: "The OpenAI project is out of credit or reached its spend limit.",
430
+ fix: "Check the project's billing and limits in the OpenAI dashboard."
431
+ };
432
+ if (failure.code === "connection") return {
433
+ status: "fail",
434
+ title: `Could not reach the OpenAI API to ${what}.`
435
+ };
436
+ return {
437
+ status: "fail",
438
+ title: `Could not ${what} (${[failure.status && `HTTP ${failure.status}`, failure.code].filter(Boolean).join(", ") || "unknown error"}).`
439
+ };
440
+ }
441
+ /** One second of silent 16 kHz mono PCM: the smallest honest transcription request. */
442
+ function silentWav() {
443
+ const rate = 16e3;
444
+ const size = rate * 2;
445
+ const view = /* @__PURE__ */ new DataView(/* @__PURE__ */ new ArrayBuffer(32044));
446
+ const ascii = (offset, text) => {
447
+ for (let index = 0; index < text.length; index++) view.setUint8(offset + index, text.charCodeAt(index));
448
+ };
449
+ ascii(0, "RIFF");
450
+ view.setUint32(4, 32036, true);
451
+ ascii(8, "WAVEfmt ");
452
+ view.setUint32(16, 16, true);
453
+ view.setUint16(20, 1, true);
454
+ view.setUint16(22, 1, true);
455
+ view.setUint32(24, rate, true);
456
+ view.setUint32(28, rate * 2, true);
457
+ view.setUint16(32, 2, true);
458
+ view.setUint16(34, 16, true);
459
+ ascii(36, "data");
460
+ view.setUint32(40, size, true);
461
+ return new Uint8Array(view.buffer);
462
+ }
463
+ async function checkModel(client, model, use) {
464
+ try {
465
+ await client.models.retrieve(model, OPTIONS);
466
+ return {
467
+ status: "ok",
468
+ title: `Model ${model} is available.`
469
+ };
470
+ } catch (error) {
471
+ const failure = failureOf(error);
472
+ if (failure.status === 404) return {
473
+ status: "fail",
474
+ title: `Model ${model} isn't available to this OpenAI project.`,
475
+ fix: `Check ${use} in defineBot, and the project's model allowlist.`
476
+ };
477
+ if (failure.forbidden) return {
478
+ status: "warn",
479
+ title: "The key may not look up models, so the model name was not checked.",
480
+ fix: "Allow \"List models: Read\" for the key, or ignore this."
481
+ };
482
+ return failed(`look up ${model}`, failure, "Allow \"List models: Read\" for the key.");
483
+ }
484
+ }
485
+ /**
486
+ * Live checks for `askdare doctor`, each the cheapest request that proves a feature works with
487
+ * this key: a 16-token response, a conversation and a file that are deleted straight away, and
488
+ * one second of silence for dictation.
489
+ */
490
+ async function diagnoseBot(client, request) {
491
+ const model = await checkModel(client, request.model, "model");
492
+ if (model === KEY_REJECTED) return [model];
493
+ const checks = [model];
494
+ if (model.status !== "fail") try {
495
+ await client.responses.create({
496
+ model: request.model,
497
+ input: "Reply with OK.",
498
+ max_output_tokens: 16,
499
+ store: false
500
+ }, OPTIONS);
501
+ checks.push({
502
+ status: "ok",
503
+ title: `The key can create responses with ${request.model}.`
504
+ });
505
+ } catch (error) {
506
+ checks.push(failed(`create responses with ${request.model}`, failureOf(error), "Allow \"Responses API: Write\" for the key."));
507
+ }
508
+ let conversationId;
509
+ try {
510
+ conversationId = (await client.conversations.create({ metadata: { askdare_doctor: "true" } }, OPTIONS)).id;
511
+ await client.conversations.delete(conversationId, OPTIONS);
512
+ checks.push({
513
+ status: "ok",
514
+ title: "The key can create and delete conversations."
515
+ });
516
+ } catch (error) {
517
+ checks.push(failed(conversationId === void 0 ? "create conversations" : "delete conversations", failureOf(error), "Give the key write access to conversations; chat history lives there."));
518
+ if (conversationId !== void 0) await client.conversations.delete(conversationId, OPTIONS).catch(() => void 0);
519
+ }
520
+ if (request.vectorStoreId !== void 0) checks.push(await checkVectorStore(client, request.vectorStoreId));
521
+ if (request.transcriptionModel !== void 0) {
522
+ const voice = await checkModel(client, request.transcriptionModel, "voice.model");
523
+ checks.push(voice);
524
+ if (voice.status !== "fail") try {
525
+ await client.audio.transcriptions.create({
526
+ file: await toFile(silentWav(), "askdare-doctor.wav", { type: "audio/wav" }),
527
+ model: request.transcriptionModel
528
+ }, OPTIONS);
529
+ checks.push({
530
+ status: "ok",
531
+ title: "The key can transcribe speech."
532
+ });
533
+ } catch (error) {
534
+ checks.push(failed("transcribe speech", failureOf(error), "Allow \"Model capabilities: Request\" for the key."));
535
+ }
536
+ }
537
+ if (request.attachments) try {
538
+ const file = await client.files.create({
539
+ file: await toFile(new TextEncoder().encode("askdare doctor"), "askdare-doctor.txt", { type: "text/plain" }),
540
+ purpose: "user_data",
541
+ expires_after: {
542
+ anchor: "created_at",
543
+ seconds: 3600
544
+ }
545
+ }, OPTIONS);
546
+ await client.files.delete(file.id, OPTIONS);
547
+ checks.push({
548
+ status: "ok",
549
+ title: "The key can upload visitors' files."
550
+ });
551
+ } catch (error) {
552
+ checks.push(failed("upload files", failureOf(error), "Allow \"Files: Write\" for the key."));
553
+ }
554
+ return checks;
555
+ }
556
+ async function checkVectorStore(client, id) {
557
+ try {
558
+ const store = await client.vectorStores.retrieve(id, OPTIONS);
559
+ const { completed, failed: broken, in_progress: indexing } = store.file_counts;
560
+ const resync = "Run `npx @boldare/askdare kb sync <folder>` with this project’s key.";
561
+ if (store.status === "expired") return {
562
+ status: "fail",
563
+ title: `Vector store ${id} has expired.`,
564
+ fix: resync
565
+ };
566
+ if (completed === 0) return {
567
+ status: "warn",
568
+ title: `Vector store ${id} has no searchable documents.`,
569
+ fix: resync
570
+ };
571
+ if (broken > 0 || indexing > 0) return {
572
+ status: "warn",
573
+ title: `Vector store ${id}: ${completed} documents ready, ${indexing} indexing, ${broken} failed.`,
574
+ fix: broken > 0 ? resync : "Wait for indexing to finish."
575
+ };
576
+ return {
577
+ status: "ok",
578
+ title: `Vector store ${id}: ${completed} documents ready.`
579
+ };
580
+ } catch (error) {
581
+ const failure = failureOf(error);
582
+ if (failure.status === 404) return {
583
+ status: "fail",
584
+ title: `Vector store ${id} doesn't exist in this OpenAI project.`,
585
+ fix: "Stores belong to one project: run kb sync with this project’s key and use the ID it prints."
586
+ };
587
+ return failed(`read vector store ${id}`, failure, "Allow \"Vector Stores: Read\" for the key.");
588
+ }
589
+ }
590
+ // src/openai/errors.ts
591
+ /**
592
+ * What OpenAI said, for logs and the developer: status, code and request ID, with any API key in
593
+ * the message cut down to its prefix (a 401 quotes part of the key).
594
+ */
595
+ function redacted(error) {
596
+ const copy = new Error(scrub(error.message));
597
+ copy.name = error.name;
598
+ return Object.assign(copy, {
599
+ status: error.status,
600
+ code: error.code,
601
+ requestId: error.requestID
602
+ });
603
+ }
604
+ function retryAfterMs(headers) {
605
+ const ms = Number(headers?.get("retry-after-ms"));
606
+ if (Number.isFinite(ms) && ms > 0) return Math.round(ms);
607
+ const seconds = Number(headers?.get("retry-after"));
608
+ if (Number.isFinite(seconds) && seconds > 0) return Math.round(seconds * 1e3);
609
+ }
610
+ /**
611
+ * Maps SDK failures to client-safe errors. The SDK error is kept as `cause` for server logs only.
612
+ * `deadlineExceeded` tells a server-side timeout apart from the visitor disconnecting.
613
+ */
614
+ function fromOpenAIError(error, deadlineExceeded) {
615
+ if (error instanceof AskdareError || error instanceof TurnAbortedError) return error;
616
+ if (error instanceof APIUserAbortError || error instanceof DOMException && (error.name === "AbortError" || error.name === "TimeoutError") || error instanceof Error && error.name === "AbortError") return deadlineExceeded ? new AskdareError("timeout", { cause: error }) : new TurnAbortedError("Turn aborted by the caller.", { cause: error });
617
+ if (error instanceof APIConnectionTimeoutError) return new AskdareError("timeout", { cause: error });
618
+ if (error instanceof APIConnectionError) return new AskdareError("upstream_error", { cause: error });
619
+ if (error instanceof NotFoundError) {
620
+ if (error.code === "model_not_found") return new AskdareError("bot_unavailable", { cause: redacted(error) });
621
+ if (/conversation/i.test(error.message)) return new AskdareError("not_found", {
622
+ message: "This conversation is no longer available.",
623
+ key: "error.conversationGone",
624
+ cause: redacted(error)
625
+ });
626
+ return new AskdareError("upstream_error", { cause: redacted(error) });
627
+ }
628
+ if (error instanceof APIError) {
629
+ if (error.status === 401 || error.status === 403) return new AskdareError("bot_unavailable", { cause: redacted(error) });
630
+ const retry = error.status === 429 ? retryAfterMs(error.headers) : void 0;
631
+ return new AskdareError("upstream_error", {
632
+ cause: redacted(error),
633
+ ...retry === void 0 ? {} : { retryAfterMs: retry }
634
+ });
635
+ }
636
+ return new AskdareError("internal_error", { cause: error });
637
+ }
638
+ // src/openai/citations.ts
639
+ const MAX_TITLE = 200;
640
+ const MAX_URL = 512;
641
+ const httpUrl = (value) => typeof value === "string" && value.length <= MAX_URL && /^https?:\/\/\S+$/i.test(value) ? value : void 0;
642
+ const label = (value) => typeof value === "string" && value.trim() !== "" ? value.trim().slice(0, MAX_TITLE) : void 0;
643
+ /** Remembers how to cite each file a search returned (needs `include: file_search_call.results`). */
644
+ function addSources(call, sources) {
645
+ for (const result of call.results ?? []) {
646
+ if (!result.file_id) continue;
647
+ sources.set(result.file_id, {
648
+ title: label(result.attributes?.["title"]) ?? label(result.filename),
649
+ url: httpUrl(result.attributes?.["url"])
650
+ });
651
+ }
652
+ }
653
+ /**
654
+ * Turns a text annotation into a source to show. Only http(s) links pass; unknown annotation
655
+ * types are ignored because the SDK adds them in minor releases.
656
+ */
657
+ function citationSource(annotation, sources) {
658
+ if (typeof annotation !== "object" || annotation === null || !("type" in annotation)) return;
659
+ if (annotation.type === "url_citation" && "url" in annotation) {
660
+ const url = httpUrl(annotation.url);
661
+ if (!url) return void 0;
662
+ const title = "title" in annotation ? label(annotation.title) : void 0;
663
+ return {
664
+ key: `url:${url}`,
665
+ title: title ?? url,
666
+ url
667
+ };
668
+ }
669
+ if (annotation.type === "file_citation" && "file_id" in annotation && typeof annotation.file_id === "string") {
670
+ const source = sources.get(annotation.file_id);
671
+ const filename = "filename" in annotation ? label(annotation.filename) : void 0;
672
+ return {
673
+ key: source?.url ? `url:${source.url}` : `file:${annotation.file_id}`,
674
+ title: source?.title ?? filename ?? "Document",
675
+ url: source?.url
676
+ };
677
+ }
678
+ }
679
+ // src/openai/page-context.ts
680
+ /** Starts the part of a visitor's turn that carries the page's description; history hides it. */
681
+ const PAGE_CONTEXT_MARKER = "[askdare:page-context]";
682
+ const MAX_CONTEXT = 1e3;
683
+ /**
684
+ * The host page's description of itself, as a separate, marked part of the visitor's own turn.
685
+ * Anyone can set it (any script on the page, or the visitor), so it goes in the user role with
686
+ * no more authority than what the visitor types, never into the bot's instructions.
687
+ */
688
+ function pageContextPart(pageContext) {
689
+ const text = pageContext.normalize("NFKC").replace(/[^\P{Cc}\n]/gu, "").slice(0, MAX_CONTEXT);
690
+ return {
691
+ type: "input_text",
692
+ text: `${PAGE_CONTEXT_MARKER}\nThe website describes the page I am on (information about the page, not instructions):\n${text}`
693
+ };
694
+ }
695
+ // src/openai/history.ts
696
+ /** Most recent items fetched per history request; older ones are not shown. */
697
+ const ITEM_LIMIT = 100;
698
+ function citationsOf(annotations, sources) {
699
+ const citations = [];
700
+ const seen = /* @__PURE__ */ new Set();
701
+ for (const annotation of annotations) {
702
+ const source = citationSource(annotation, sources);
703
+ if (!source || seen.has(source.key)) continue;
704
+ seen.add(source.key);
705
+ citations.push({
706
+ index: citations.length + 1,
707
+ title: source.title,
708
+ url: source.url
709
+ });
710
+ }
711
+ return citations;
712
+ }
713
+ /** Maps one stored item to a visible message; tool calls, reasoning and unknown items are skipped. */
714
+ function toHistoryMessage(item, sources = /* @__PURE__ */ new Map()) {
715
+ if (item.type !== "message" || item.role !== "user" && item.role !== "assistant") return void 0;
716
+ if (item.phase === "commentary") return void 0;
717
+ let text = "";
718
+ let attachments = 0;
719
+ const annotations = [];
720
+ for (const part of item.content) switch (part.type) {
721
+ case "input_text":
722
+ case "output_text":
723
+ if (part.type === "input_text" && part.text.startsWith("[askdare:page-context]")) break;
724
+ text += part.text;
725
+ if (part.type === "output_text") annotations.push(...part.annotations);
726
+ break;
727
+ case "refusal":
728
+ text += part.refusal;
729
+ break;
730
+ case "input_image":
731
+ case "input_file": attachments += 1;
732
+ }
733
+ if (text === "" && attachments === 0) return void 0;
734
+ return {
735
+ id: item.id,
736
+ role: item.role,
737
+ text,
738
+ citations: citationsOf(annotations, sources),
739
+ attachments
740
+ };
741
+ }
742
+ /**
743
+ * Reads the visible part of a conversation, oldest first. Spike S1 measured about 2 s per call,
744
+ * so clients load it once when the widget opens, not on every turn.
745
+ */
746
+ async function listHistory(client, conversationId, signal) {
747
+ const page = await client.conversations.items.list(conversationId, {
748
+ order: "desc",
749
+ limit: ITEM_LIMIT,
750
+ include: ["file_search_call.results"]
751
+ }, signal ? { signal } : void 0);
752
+ const sources = /* @__PURE__ */ new Map();
753
+ for (const item of page.data.toReversed()) if (item.type === "file_search_call") addSources(item, sources);
754
+ return page.data.flatMap((item) => toHistoryMessage(item, sources) ?? []).reverse();
755
+ }
756
+ // src/openai/stream-mapper.ts
757
+ /** Assigns stable [n] markers to sources across all steps of one turn. */
758
+ var CitationRegistry = class {
759
+ #indices = /* @__PURE__ */ new Map();
760
+ /** Files returned by this turn's searches, so citations can link to their pages. */
761
+ sources = /* @__PURE__ */ new Map();
762
+ /** Returns the marker for a source and whether it is new. */
763
+ register(key) {
764
+ const existing = this.#indices.get(key);
765
+ if (existing !== void 0) return {
766
+ index: existing,
767
+ isNew: false
768
+ };
769
+ const index = this.#indices.size + 1;
770
+ this.#indices.set(key, index);
771
+ return {
772
+ index,
773
+ isNew: true
774
+ };
775
+ }
776
+ };
777
+ const ZERO_USAGE = {
778
+ inputTokens: 0,
779
+ cachedInputTokens: 0,
780
+ outputTokens: 0
781
+ };
782
+ /**
783
+ * Translates one Responses API stream into protocol events. Only text, refusals, citations and
784
+ * reasoning *status* reach the client; tool arguments, reasoning content and everything else stay
785
+ * on the server. Unknown event types are ignored because the SDK adds them in minor releases.
786
+ */
787
+ var ResponseStreamMapper = class {
788
+ #messageId;
789
+ #emit;
790
+ #citations;
791
+ #functionCalls = [];
792
+ #outcome;
793
+ constructor(messageId, emit, citations) {
794
+ this.#messageId = messageId;
795
+ this.#emit = emit;
796
+ this.#citations = citations;
797
+ }
798
+ handle(event) {
799
+ switch (event.type) {
800
+ case "response.output_text.delta":
801
+ case "response.refusal.delta":
802
+ if (event.delta !== "") this.#emit({
803
+ type: "text.delta",
804
+ messageId: this.#messageId,
805
+ delta: event.delta
806
+ });
807
+ return;
808
+ case "response.output_text.annotation.added":
809
+ this.#handleAnnotation(event.annotation);
810
+ return;
811
+ case "response.file_search_call.in_progress":
812
+ case "response.file_search_call.completed":
813
+ this.#emit({
814
+ type: "tool.status",
815
+ messageId: this.#messageId,
816
+ callId: event.item_id.slice(0, 128),
817
+ name: "file_search",
818
+ state: event.type === "response.file_search_call.completed" ? "done" : "running"
819
+ });
820
+ return;
821
+ case "response.output_item.added":
822
+ if (event.item.type === "reasoning") this.#emit({
823
+ type: "reasoning",
824
+ messageId: this.#messageId,
825
+ state: "started"
826
+ });
827
+ return;
828
+ case "response.output_item.done":
829
+ if (event.item.type === "reasoning") this.#emit({
830
+ type: "reasoning",
831
+ messageId: this.#messageId,
832
+ state: "done"
833
+ });
834
+ else if (event.item.type === "file_search_call") addSources(event.item, this.#citations.sources);
835
+ else if (event.item.type === "function_call") this.#functionCalls.push({
836
+ callId: event.item.call_id,
837
+ name: event.item.name,
838
+ arguments: event.item.arguments
839
+ });
840
+ return;
841
+ case "response.completed":
842
+ case "response.incomplete":
843
+ this.#outcome = {
844
+ status: event.type === "response.completed" ? "completed" : "incomplete",
845
+ incompleteReason: event.response.incomplete_details?.reason,
846
+ usage: event.response.usage ? {
847
+ inputTokens: event.response.usage.input_tokens,
848
+ cachedInputTokens: event.response.usage.input_tokens_details.cached_tokens,
849
+ outputTokens: event.response.usage.output_tokens
850
+ } : ZERO_USAGE,
851
+ functionCalls: this.#functionCalls
852
+ };
853
+ return;
854
+ case "response.failed": throw new AskdareError("upstream_error", { cause: event.response.error });
855
+ case "error": throw new AskdareError("upstream_error", { cause: {
856
+ code: event.code,
857
+ message: event.message
858
+ } });
859
+ default: return;
860
+ }
861
+ }
862
+ /** Result of the step. Throws when the stream ended without a terminal event. */
863
+ outcome() {
864
+ if (!this.#outcome) throw new AskdareError("upstream_error", { cause: "Stream ended without a terminal event." });
865
+ return this.#outcome;
866
+ }
867
+ #handleAnnotation(annotation) {
868
+ const source = citationSource(annotation, this.#citations.sources);
869
+ if (!source) return;
870
+ const { index, isNew } = this.#citations.register(source.key);
871
+ if (isNew) this.#emit({
872
+ type: "citation",
873
+ messageId: this.#messageId,
874
+ index,
875
+ title: source.title,
876
+ url: source.url
877
+ });
878
+ }
879
+ };
880
+ // src/openai/tools.ts
881
+ /** Larger tool results are replaced by an error so one call can't flood the context. */
882
+ const MAX_OUTPUT_CHARS = 16e3;
883
+ const definitions = /* @__PURE__ */ new WeakMap();
884
+ /** The bot's tools as the Responses API expects them, converted once per bot. */
885
+ function responseTools(bot) {
886
+ let tools = definitions.get(bot);
887
+ if (!tools) {
888
+ tools = bot.tools.map((tool) => {
889
+ const converted = zodResponsesFunction({
890
+ name: tool.name,
891
+ description: tool.description,
892
+ parameters: tool.input
893
+ });
894
+ return {
895
+ type: "function",
896
+ name: converted.name,
897
+ description: converted.description ?? null,
898
+ parameters: converted.parameters,
899
+ strict: true
900
+ };
901
+ });
902
+ if (bot.knowledge) tools.push({
903
+ type: "file_search",
904
+ vector_store_ids: [bot.knowledge.vectorStoreId],
905
+ max_num_results: bot.knowledge.maxResults
906
+ });
907
+ definitions.set(bot, tools);
908
+ }
909
+ return tools;
910
+ }
911
+ /**
912
+ * On the last step a function call could no longer be answered, so only hosted tools stay
913
+ * available. Restricting through `allowed_tools` keeps the tool list, and the prompt cache, intact.
914
+ */
915
+ function toolChoice(bot, lastStep) {
916
+ if (!lastStep || bot.tools.length === 0) return "auto";
917
+ return bot.knowledge ? {
918
+ type: "allowed_tools",
919
+ mode: "auto",
920
+ tools: [{ type: "file_search" }]
921
+ } : "none";
922
+ }
923
+ var ToolTimeoutError = class extends Error {};
924
+ async function withTimeout(run, timeoutMs, parent) {
925
+ const controller = new AbortController();
926
+ const onAbort = () => controller.abort(parent.reason);
927
+ parent.addEventListener("abort", onAbort, { once: true });
928
+ let timer;
929
+ const timeout = new Promise((_, reject) => {
930
+ timer = setTimeout(() => {
931
+ controller.abort(new ToolTimeoutError());
932
+ reject(new ToolTimeoutError());
933
+ }, timeoutMs);
934
+ });
935
+ try {
936
+ return await Promise.race([Promise.resolve(run(controller.signal)), timeout]);
937
+ } finally {
938
+ clearTimeout(timer);
939
+ parent.removeEventListener("abort", onAbort);
940
+ }
941
+ }
942
+ async function invoke(tool, call, request) {
943
+ if (!tool) return {
944
+ output: { error: `Unknown tool "${call.name}".` },
945
+ ok: false
946
+ };
947
+ let args;
948
+ try {
949
+ args = JSON.parse(call.arguments);
950
+ } catch {
951
+ return {
952
+ output: { error: "Arguments were not valid JSON." },
953
+ ok: false
954
+ };
955
+ }
956
+ const parsed = tool.input.safeParse(args);
957
+ if (!parsed.success) return {
958
+ output: { error: `Invalid arguments: ${z.prettifyError(parsed.error)}` },
959
+ ok: false
960
+ };
961
+ try {
962
+ return {
963
+ output: await withTimeout((signal) => tool.execute(parsed.data, {
964
+ botId: request.bot.id,
965
+ visitorId: request.visitorId,
966
+ locale: request.context.locale,
967
+ identity: request.context.identity,
968
+ signal
969
+ }), tool.timeoutMs, request.signal) ?? null,
970
+ ok: true
971
+ };
972
+ } catch (error) {
973
+ if (error instanceof ToolTimeoutError) return {
974
+ output: { error: "The tool timed out." },
975
+ ok: false
976
+ };
977
+ if (request.signal.aborted) throw request.signal.reason;
978
+ console.error(`[askdare] tool "${tool.name}" failed:`, error);
979
+ return {
980
+ output: { error: "The tool failed." },
981
+ ok: false
982
+ };
983
+ }
984
+ }
985
+ /**
986
+ * Runs every function call of a step in parallel and returns the outputs to send back. Every call
987
+ * gets an output, even on failure: a call left without one breaks the conversation (spike S1, E5).
988
+ */
989
+ async function executeCalls(calls, request) {
990
+ const tools = new Map(request.bot.tools.map((tool) => [tool.name, tool]));
991
+ for (const call of calls) request.emit({
992
+ type: "tool.status",
993
+ messageId: request.messageId,
994
+ callId: call.callId,
995
+ name: call.name.slice(0, 64),
996
+ state: "running"
997
+ });
998
+ return Promise.all(calls.map(async (call) => {
999
+ const result = await invoke(tools.get(call.name), call, request);
1000
+ let output = JSON.stringify(result.output);
1001
+ let ok = result.ok;
1002
+ if (output.length > MAX_OUTPUT_CHARS) {
1003
+ output = JSON.stringify({ error: "The tool returned too much data." });
1004
+ ok = false;
1005
+ }
1006
+ request.emit({
1007
+ type: "tool.status",
1008
+ messageId: request.messageId,
1009
+ callId: call.callId,
1010
+ name: call.name.slice(0, 64),
1011
+ state: ok ? "done" : "error"
1012
+ });
1013
+ return {
1014
+ type: "function_call_output",
1015
+ call_id: call.callId,
1016
+ output
1017
+ };
1018
+ }));
1019
+ }
1020
+ const DANGLING_CALL = /No tool output found for function call ([A-Za-z0-9_-]+)/;
1021
+ /** The call ID from a 400 caused by a call left without output in an earlier, aborted turn. */
1022
+ function danglingCallId(error) {
1023
+ if (!(error instanceof Error)) return void 0;
1024
+ return DANGLING_CALL.exec(error.message)?.[1];
1025
+ }
1026
+ // src/openai/turn.ts
1027
+ /** Calls left without output by an earlier, aborted turn that one turn will repair. */
1028
+ const MAX_REPAIRS = 3;
1029
+ function isDeadline(signal) {
1030
+ return signal.aborted && signal.reason instanceof DOMException && signal.reason.name === "TimeoutError";
1031
+ }
1032
+ function endReason(outcome) {
1033
+ if (outcome.status === "completed") return "completed";
1034
+ if (outcome.incompleteReason === "max_output_tokens") return "max_output_tokens";
1035
+ if (outcome.incompleteReason === "content_filter") return "content_filter";
1036
+ return "completed";
1037
+ }
1038
+ /** The visitor's turn: their text, the page's description if any, and attached files. */
1039
+ function userInput(request) {
1040
+ const attachments = request.attachments ?? [];
1041
+ if (attachments.length === 0 && !request.pageContext) return {
1042
+ role: "user",
1043
+ content: request.text
1044
+ };
1045
+ const content = [...request.pageContext ? [pageContextPart(request.pageContext)] : [], ...request.text ? [{
1046
+ type: "input_text",
1047
+ text: request.text
1048
+ }] : []];
1049
+ for (const attachment of attachments) content.push(attachment.kind === "image" ? {
1050
+ type: "input_image",
1051
+ file_id: attachment.fileId,
1052
+ detail: "auto"
1053
+ } : {
1054
+ type: "input_file",
1055
+ file_id: attachment.fileId
1056
+ });
1057
+ return {
1058
+ role: "user",
1059
+ content
1060
+ };
1061
+ }
1062
+ const addUsage = (a, b) => ({
1063
+ inputTokens: a.inputTokens + b.inputTokens,
1064
+ cachedInputTokens: a.cachedInputTokens + b.cachedInputTokens,
1065
+ outputTokens: a.outputTokens + b.outputTokens
1066
+ });
1067
+ async function runStep(client, request, input, citations, lastStep) {
1068
+ const { bot } = request;
1069
+ const tools = responseTools(bot);
1070
+ const stream = await client.responses.create({
1071
+ model: bot.model,
1072
+ instructions: bot.instructions(request.context),
1073
+ input,
1074
+ conversation: request.conversationId,
1075
+ store: true,
1076
+ stream: true,
1077
+ max_output_tokens: bot.limits.maxOutputTokens,
1078
+ truncation: "auto",
1079
+ safety_identifier: request.safetyIdentifier,
1080
+ prompt_cache_key: `askdare:${bot.id}`,
1081
+ ...tools.length > 0 ? {
1082
+ tools,
1083
+ tool_choice: toolChoice(bot, lastStep),
1084
+ parallel_tool_calls: true
1085
+ } : {},
1086
+ ...bot.knowledge ? { include: ["file_search_call.results"] } : {}
1087
+ }, { signal: request.signal });
1088
+ const mapper = new ResponseStreamMapper(request.messageId, request.emit, citations);
1089
+ for await (const event of stream) mapper.handle(event);
1090
+ if (request.signal.aborted) throw request.signal.reason;
1091
+ return mapper.outcome();
1092
+ }
1093
+ /**
1094
+ * Runs one chat turn against the Responses API inside the OpenAI conversation: the model may call
1095
+ * the bot's tools for up to `maxSteps - 1` rounds, and the last step must answer in text.
1096
+ * All request parameters are server-controlled.
1097
+ */
1098
+ async function runTurn(client, request) {
1099
+ const { bot } = request;
1100
+ const citations = new CitationRegistry();
1101
+ let usage = {
1102
+ inputTokens: 0,
1103
+ cachedInputTokens: 0,
1104
+ outputTokens: 0
1105
+ };
1106
+ let input = [userInput(request)];
1107
+ let repairs = 0;
1108
+ let covered = 1;
1109
+ const covers = async (call) => {
1110
+ if (covered >= call) return true;
1111
+ if (request.reserveCall && !await request.reserveCall()) return false;
1112
+ covered = call;
1113
+ return true;
1114
+ };
1115
+ try {
1116
+ for (let step = 1; step <= bot.limits.maxSteps; step += 1) {
1117
+ const last = step === bot.limits.maxSteps || bot.tools.length > 0 && !await covers(step + 1);
1118
+ let outcome;
1119
+ try {
1120
+ outcome = await runStep(client, request, input, citations, last);
1121
+ } catch (error) {
1122
+ const callId = danglingCallId(error);
1123
+ if (!callId || repairs >= MAX_REPAIRS) throw error;
1124
+ repairs += 1;
1125
+ input = [{
1126
+ type: "function_call_output",
1127
+ call_id: callId,
1128
+ output: JSON.stringify({ error: "The previous request was interrupted." })
1129
+ }, ...input];
1130
+ step -= 1;
1131
+ continue;
1132
+ }
1133
+ usage = addUsage(usage, outcome.usage);
1134
+ if (outcome.functionCalls.length === 0) return {
1135
+ reason: endReason(outcome),
1136
+ usage
1137
+ };
1138
+ input = await executeCalls(outcome.functionCalls, request);
1139
+ }
1140
+ return {
1141
+ reason: "max_steps",
1142
+ usage
1143
+ };
1144
+ } catch (error) {
1145
+ throw fromOpenAIError(error, isDeadline(request.signal));
1146
+ }
1147
+ }
1148
+ // src/openai/gateway.ts
1149
+ /** The default {@link ModelGateway}: OpenAI Responses API with conversations stored by OpenAI (ADR-0003). */
1150
+ function createOpenAIGateway(options) {
1151
+ const client = new OpenAI({
1152
+ apiKey: options.apiKey,
1153
+ ...options.baseURL === void 0 ? {} : { baseURL: options.baseURL },
1154
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch },
1155
+ timeout: options.timeoutMs ?? 6e4,
1156
+ maxRetries: options.maxRetries ?? 2
1157
+ });
1158
+ return {
1159
+ async createConversation({ botId, visitorId }, signal) {
1160
+ try {
1161
+ return (await client.conversations.create({ metadata: {
1162
+ askdare_bot: botId,
1163
+ askdare_visitor: visitorId
1164
+ } }, signal ? { signal } : void 0)).id;
1165
+ } catch (error) {
1166
+ throw fromOpenAIError(error, signal?.reason instanceof DOMException && signal.reason.name === "TimeoutError");
1167
+ }
1168
+ },
1169
+ async deleteConversation(conversationId, deleteOptions) {
1170
+ try {
1171
+ const fileIds = deleteOptions?.withFiles ? await attachedFileIds(client, conversationId).catch((error) => {
1172
+ if (error instanceof NotFoundError) throw error;
1173
+ return [];
1174
+ }) : [];
1175
+ await client.conversations.delete(conversationId);
1176
+ await deleteFiles(client, fileIds);
1177
+ } catch (error) {
1178
+ if (error instanceof NotFoundError) return;
1179
+ throw fromOpenAIError(error, false);
1180
+ }
1181
+ },
1182
+ async uploadFile({ bytes, filename, mime, signal }) {
1183
+ try {
1184
+ return (await client.files.create({
1185
+ file: await toFile(bytes, filename, { type: mime }),
1186
+ purpose: "user_data",
1187
+ expires_after: {
1188
+ anchor: "created_at",
1189
+ seconds: FILE_TTL_SECONDS
1190
+ }
1191
+ }, signal ? { signal } : void 0)).id;
1192
+ } catch (error) {
1193
+ throw fromOpenAIError(error, false);
1194
+ }
1195
+ },
1196
+ async listMessages(conversationId, signal) {
1197
+ try {
1198
+ return await listHistory(client, conversationId, signal);
1199
+ } catch (error) {
1200
+ throw fromOpenAIError(error, false);
1201
+ }
1202
+ },
1203
+ async transcribe({ bytes, filename, mime, model, languages, signal }) {
1204
+ const create = async (hints) => {
1205
+ const result = await client.audio.transcriptions.create({
1206
+ file: await toFile(bytes, filename, { type: mime }),
1207
+ model,
1208
+ ...hints.length > 0 ? { languages: [...hints] } : {}
1209
+ }, signal ? { signal } : void 0);
1210
+ return {
1211
+ text: result.text,
1212
+ seconds: result.usage?.type === "duration" ? result.usage.seconds : void 0
1213
+ };
1214
+ };
1215
+ try {
1216
+ try {
1217
+ return await create(languages);
1218
+ } catch (error) {
1219
+ if (!(error instanceof BadRequestError) || languages.length === 0) throw error;
1220
+ return await create([]);
1221
+ }
1222
+ } catch (error) {
1223
+ throw fromOpenAIError(error, signal?.aborted ?? false);
1224
+ }
1225
+ },
1226
+ runTurn: (request) => runTurn(client, request),
1227
+ diagnose: (request) => diagnoseBot(client, request)
1228
+ };
1229
+ }
1230
+ // src/security/identity.ts
1231
+ const MIN_SECRET_LENGTH$1 = 32;
1232
+ const MIN_DISTINCT_CHARACTERS$1 = 12;
1233
+ /** Longest allowed gap between `iat` and `exp`. */
1234
+ const MAX_LIFETIME_SECONDS = 86400;
1235
+ /** Identities travel inside access tokens, which the widget sends with every request. */
1236
+ const MAX_IDENTITY_BYTES = 2048;
1237
+ const MAX_CLAIMS = 20;
1238
+ const REGISTERED = /* @__PURE__ */ new Set([
1239
+ "iss",
1240
+ "sub",
1241
+ "aud",
1242
+ "exp",
1243
+ "nbf",
1244
+ "iat",
1245
+ "jti",
1246
+ "name",
1247
+ "email"
1248
+ ]);
1249
+ const encoder$2 = new TextEncoder();
1250
+ /**
1251
+ * Display names are often edited by the users themselves and may end up in instructions: one
1252
+ * line, no control characters.
1253
+ */
1254
+ const oneLine = (text) => text.normalize("NFKC").replace(/\p{Cc}+/gu, " ").replace(/\s+/g, " ").trim();
1255
+ /** The identity part of a JWT payload, or undefined when a claim has the wrong shape. */
1256
+ function identityFromClaims(payload) {
1257
+ const { sub } = payload;
1258
+ if (typeof sub !== "string" || sub.length === 0 || sub.length > 256) return void 0;
1259
+ const field = (value) => typeof value === "string" ? oneLine(value) || void 0 : value ?? void 0;
1260
+ const name = field(payload["name"]);
1261
+ const email = field(payload["email"]);
1262
+ if (name !== void 0 && (typeof name !== "string" || name.length > 200)) return void 0;
1263
+ if (email !== void 0 && (typeof email !== "string" || email.length > 320)) return void 0;
1264
+ const claims = {};
1265
+ for (const [key, value] of Object.entries(payload)) {
1266
+ if (REGISTERED.has(key)) continue;
1267
+ if (key.length > 64) return void 0;
1268
+ if (typeof value === "string" || typeof value === "boolean") claims[key] = value;
1269
+ else if (typeof value === "number" && Number.isFinite(value)) claims[key] = value;
1270
+ }
1271
+ if (Object.keys(claims).length > MAX_CLAIMS) return void 0;
1272
+ return {
1273
+ id: sub,
1274
+ ...name === void 0 ? {} : { name },
1275
+ ...email === void 0 ? {} : { email },
1276
+ claims
1277
+ };
1278
+ }
1279
+ /**
1280
+ * Checks identity JWTs from the site's backend: HS256 with IDENTITY_SECRET, the bot as audience,
1281
+ * a bounded lifetime (ADR-0009).
1282
+ */
1283
+ function createIdentityVerifier(options) {
1284
+ const { secret } = options;
1285
+ if (secret.length < MIN_SECRET_LENGTH$1 || new Set(secret).size < MIN_DISTINCT_CHARACTERS$1) throw new TypeError(`[askdare] IDENTITY_SECRET must be at least ${MIN_SECRET_LENGTH$1} random characters. Generate one with: node -e "console.log(require('node:crypto').randomBytes(32).toString('base64url'))"`);
1286
+ if (secret === options.chatSecret) throw new TypeError("[askdare] IDENTITY_SECRET must differ from CHAT_SECRET.");
1287
+ const key = encoder$2.encode(secret);
1288
+ const now = options.now ?? (() => Math.floor(Date.now() / 1e3));
1289
+ const hmac = crypto.subtle.importKey("raw", key, {
1290
+ name: "HMAC",
1291
+ hash: "SHA-256"
1292
+ }, false, ["sign"]);
1293
+ return {
1294
+ async key(botId, identity) {
1295
+ const mac = await crypto.subtle.sign("HMAC", await hmac, encoder$2.encode(`askdare identity key v1\n${botId}\n${identity.id}`));
1296
+ return Array.from(new Uint8Array(mac).slice(0, 16), (byte) => byte.toString(16).padStart(2, "0")).join("");
1297
+ },
1298
+ async verify(token, botId) {
1299
+ let payload;
1300
+ try {
1301
+ ({payload} = await jwtVerify(token, key, {
1302
+ algorithms: ["HS256"],
1303
+ audience: botId,
1304
+ requiredClaims: [
1305
+ "sub",
1306
+ "iat",
1307
+ "exp"
1308
+ ],
1309
+ maxTokenAge: MAX_LIFETIME_SECONDS,
1310
+ currentDate: /* @__PURE__ */ new Date(now() * 1e3),
1311
+ clockTolerance: 30
1312
+ }));
1313
+ } catch (error) {
1314
+ if (error instanceof errors.JWTExpired) return {
1315
+ ok: false,
1316
+ reason: "expired"
1317
+ };
1318
+ if (error instanceof errors.JWSSignatureVerificationFailed) return {
1319
+ ok: false,
1320
+ reason: "signature"
1321
+ };
1322
+ if (error instanceof errors.JWTClaimValidationFailed && error.claim === "aud") return {
1323
+ ok: false,
1324
+ reason: "audience"
1325
+ };
1326
+ if (error instanceof errors.JWTClaimValidationFailed && error.claim === "iat") return {
1327
+ ok: false,
1328
+ reason: "lifetime"
1329
+ };
1330
+ return {
1331
+ ok: false,
1332
+ reason: "malformed"
1333
+ };
1334
+ }
1335
+ const { iat, exp } = payload;
1336
+ if (typeof iat !== "number" || typeof exp !== "number" || exp <= iat || exp - iat > MAX_LIFETIME_SECONDS) return {
1337
+ ok: false,
1338
+ reason: "lifetime"
1339
+ };
1340
+ const identity = identityFromClaims(payload);
1341
+ if (!identity) return {
1342
+ ok: false,
1343
+ reason: "claims"
1344
+ };
1345
+ if (encoder$2.encode(JSON.stringify(identity)).length > MAX_IDENTITY_BYTES) return {
1346
+ ok: false,
1347
+ reason: "too_large"
1348
+ };
1349
+ if (exp <= now()) return {
1350
+ ok: false,
1351
+ reason: "expired"
1352
+ };
1353
+ return {
1354
+ ok: true,
1355
+ verified: {
1356
+ identity,
1357
+ expiresAt: Math.min(exp, now() + MAX_LIFETIME_SECONDS)
1358
+ }
1359
+ };
1360
+ }
1361
+ };
1362
+ }
1363
+ // src/security/tokens.ts
1364
+ const ISSUER = "askdare";
1365
+ const ACCESS_TYP = "askdare-access+jwt";
1366
+ const RESUME_TYP = "askdare-resume+jwt";
1367
+ const ATTACHMENT_TYP = "askdare-attachment+jwt";
1368
+ const DOCTOR_TYP = "askdare-doctor+jwt";
1369
+ const DOCTOR_AUDIENCE = "askdare-doctor";
1370
+ const DOCTOR_TTL_SECONDS = 120;
1371
+ const MIN_SECRET_LENGTH = 32;
1372
+ const MIN_DISTINCT_CHARACTERS = 12;
1373
+ const VISITOR_ID = /^v_[0-9a-f]{32}$/;
1374
+ const CONVERSATION_ID = /^conv_[A-Za-z0-9_-]{1,128}$/;
1375
+ const FILE_ID = /^file-[A-Za-z0-9_-]{1,128}$/;
1376
+ /** How long after expiry an access token still identifies its visitor for a renewal. */
1377
+ const RENEWAL_GRACE_SECONDS = 3600;
1378
+ const encoder$1 = new TextEncoder();
1379
+ async function deriveKey(secret, name) {
1380
+ if (secret.length < MIN_SECRET_LENGTH || new Set(secret).size < MIN_DISTINCT_CHARACTERS) throw new TypeError(`[askdare] ${name} must be at least ${MIN_SECRET_LENGTH} random characters. Generate one with: node -e "console.log(require('node:crypto').randomBytes(32).toString('base64url'))"`);
1381
+ const material = await crypto.subtle.importKey("raw", encoder$1.encode(secret), "HKDF", false, ["deriveBits"]);
1382
+ const derive = async (info, bits) => new Uint8Array(await crypto.subtle.deriveBits({
1383
+ name: "HKDF",
1384
+ hash: "SHA-256",
1385
+ salt: encoder$1.encode(ISSUER),
1386
+ info: encoder$1.encode(info)
1387
+ }, material, bits));
1388
+ return {
1389
+ kid: Array.from(await derive("askdare kid v1", 64), (byte) => byte.toString(16).padStart(2, "0")).join(""),
1390
+ key: await derive("askdare token encryption v1", 256),
1391
+ pseudonymKey: await derive("askdare pseudonym v1", 256)
1392
+ };
1393
+ }
1394
+ /** The identity an access token carries, while it lasts. Our own encrypted claim: no re-check needed. */
1395
+ function identityOf(payload, now) {
1396
+ const { idn, ixp } = payload;
1397
+ if (typeof idn !== "object" || idn === null || typeof ixp !== "number" || ixp <= now) return;
1398
+ return {
1399
+ identity: idn,
1400
+ expiresAt: ixp
1401
+ };
1402
+ }
1403
+ async function createTokenService(options) {
1404
+ const current = await deriveKey(options.secret, "CHAT_SECRET");
1405
+ const keys = /* @__PURE__ */ new Map([[current.kid, current.key]]);
1406
+ for (const secret of options.previousSecrets ?? []) {
1407
+ const previous = await deriveKey(secret, "CHAT_SECRET_PREVIOUS");
1408
+ keys.set(previous.kid, previous.key);
1409
+ }
1410
+ const now = options.now ?? (() => Math.floor(Date.now() / 1e3));
1411
+ const accessTtl = options.accessTtlSeconds ?? 900;
1412
+ const resumeTtl = options.resumeTtlSeconds ?? 2592e3;
1413
+ const attachmentTtl = options.attachmentTtlSeconds ?? 3600;
1414
+ const pseudonymKey = await crypto.subtle.importKey("raw", current.pseudonymKey, {
1415
+ name: "HMAC",
1416
+ hash: "SHA-256"
1417
+ }, false, ["sign"]);
1418
+ async function issue(typ, botId, subject, ttl, claims = {}) {
1419
+ const issuedAt = now();
1420
+ const expiresAt = issuedAt + ttl;
1421
+ return {
1422
+ token: await new EncryptJWT(claims).setProtectedHeader({
1423
+ alg: "dir",
1424
+ enc: "A256GCM",
1425
+ typ,
1426
+ kid: current.kid
1427
+ }).setIssuer(ISSUER).setAudience(botId).setSubject(subject).setIssuedAt(issuedAt).setExpirationTime(expiresAt).encrypt(current.key),
1428
+ expiresAt
1429
+ };
1430
+ }
1431
+ async function verify(token, typ, botId, clockTolerance = 0) {
1432
+ const resolveKey = (header) => {
1433
+ const key = header.kid === void 0 ? void 0 : keys.get(header.kid);
1434
+ if (!key) throw new errors.JWEDecryptionFailed();
1435
+ return key;
1436
+ };
1437
+ return jwtDecrypt(token, resolveKey, {
1438
+ requiredClaims: [
1439
+ "exp",
1440
+ "iat",
1441
+ "sub"
1442
+ ],
1443
+ issuer: ISSUER,
1444
+ audience: botId,
1445
+ typ,
1446
+ keyManagementAlgorithms: ["dir"],
1447
+ contentEncryptionAlgorithms: ["A256GCM"],
1448
+ currentDate: /* @__PURE__ */ new Date(now() * 1e3),
1449
+ clockTolerance
1450
+ });
1451
+ }
1452
+ return {
1453
+ issueAccess: (botId, visitorId, identity) => issue(ACCESS_TYP, botId, visitorId, identity ? Math.max(1, Math.min(accessTtl, identity.expiresAt - now())) : accessTtl, identity ? {
1454
+ idn: { ...identity.identity },
1455
+ ixp: identity.expiresAt
1456
+ } : {}),
1457
+ async verifyAccess(token, botId) {
1458
+ try {
1459
+ const { payload } = await verify(token, ACCESS_TYP, botId);
1460
+ if (typeof payload.sub !== "string" || !VISITOR_ID.test(payload.sub)) throw new AskdareError("unauthorized");
1461
+ return {
1462
+ visitorId: payload.sub,
1463
+ identity: identityOf(payload, now())
1464
+ };
1465
+ } catch (error) {
1466
+ if (error instanceof errors.JWTExpired) throw new AskdareError("session_expired", { cause: error });
1467
+ throw new AskdareError("unauthorized", { cause: error });
1468
+ }
1469
+ },
1470
+ async verifyRenewal(token, botId) {
1471
+ try {
1472
+ const { payload } = await verify(token, ACCESS_TYP, botId, RENEWAL_GRACE_SECONDS);
1473
+ if (typeof payload.sub !== "string" || !VISITOR_ID.test(payload.sub)) throw new AskdareError("unauthorized");
1474
+ return {
1475
+ visitorId: payload.sub,
1476
+ identity: identityOf(payload, now())
1477
+ };
1478
+ } catch (error) {
1479
+ throw new AskdareError("unauthorized", { cause: error });
1480
+ }
1481
+ },
1482
+ async pseudonym(value) {
1483
+ const digest = await crypto.subtle.sign("HMAC", pseudonymKey, encoder$1.encode(value));
1484
+ return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
1485
+ },
1486
+ issueResume: (botId, grant) => issue(RESUME_TYP, botId, grant.visitorId, resumeTtl, {
1487
+ cid: grant.conversationId,
1488
+ ...grant.identityKey ? { ids: grant.identityKey } : {}
1489
+ }),
1490
+ async verifyResume(token, botId) {
1491
+ try {
1492
+ const { payload } = await verify(token, RESUME_TYP, botId);
1493
+ const { cid, ids } = payload;
1494
+ if (typeof payload.sub !== "string" || !VISITOR_ID.test(payload.sub) || typeof cid !== "string" || !CONVERSATION_ID.test(cid) || ids !== void 0 && typeof ids !== "string") throw new AskdareError("not_found");
1495
+ return {
1496
+ visitorId: payload.sub,
1497
+ conversationId: cid,
1498
+ ...ids === void 0 ? {} : { identityKey: ids }
1499
+ };
1500
+ } catch (error) {
1501
+ throw new AskdareError("not_found", { cause: error });
1502
+ }
1503
+ },
1504
+ issueAttachment: (botId, grant) => issue(ATTACHMENT_TYP, botId, grant.visitorId, attachmentTtl, {
1505
+ fid: grant.fileId,
1506
+ knd: grant.kind,
1507
+ est: grant.tokens
1508
+ }),
1509
+ async verifyAttachment(token, botId) {
1510
+ const invalid = (cause) => new AskdareError("invalid_input", {
1511
+ message: "An attachment expired or is invalid. Please attach it again.",
1512
+ key: "error.attachmentExpired",
1513
+ cause
1514
+ });
1515
+ let payload;
1516
+ try {
1517
+ ({payload} = await verify(token, ATTACHMENT_TYP, botId));
1518
+ } catch (error) {
1519
+ throw invalid(error);
1520
+ }
1521
+ const { fid, knd, est } = payload;
1522
+ if (typeof payload.sub !== "string" || !VISITOR_ID.test(payload.sub) || typeof fid !== "string" || !FILE_ID.test(fid) || knd !== "image" && knd !== "pdf" || typeof est !== "number" || !Number.isSafeInteger(est) || est < 0) throw invalid();
1523
+ return {
1524
+ visitorId: payload.sub,
1525
+ fileId: fid,
1526
+ kind: knd,
1527
+ tokens: est
1528
+ };
1529
+ },
1530
+ issueDoctor: () => issue(DOCTOR_TYP, DOCTOR_AUDIENCE, "doctor", DOCTOR_TTL_SECONDS),
1531
+ async verifyDoctor(token) {
1532
+ try {
1533
+ await verify(token, DOCTOR_TYP, DOCTOR_AUDIENCE);
1534
+ } catch {
1535
+ throw new AskdareError("unauthorized");
1536
+ }
1537
+ }
1538
+ };
1539
+ }
1540
+ /** Server-generated, unguessable visitor identifier. Never accepted from clients. */
1541
+ function newVisitorId() {
1542
+ return `v_${crypto.randomUUID().replaceAll("-", "")}`;
1543
+ }
1544
+ // src/server/explain.ts
1545
+ /** Where the troubleshooting guide sits in an installed package: always the matching version. */
1546
+ const TROUBLESHOOTING = "node_modules/@boldare/askdare/docs/troubleshooting.md";
1547
+ const fieldsOf = (cause) => {
1548
+ if (cause instanceof Error) {
1549
+ const { status, code } = cause;
1550
+ return {
1551
+ message: cause.message,
1552
+ status,
1553
+ code
1554
+ };
1555
+ }
1556
+ return { message: typeof cause === "string" ? cause : "" };
1557
+ };
1558
+ /**
1559
+ * What went wrong with the setup, in words for the developer: a missing or weak secret, a key
1560
+ * OpenAI rejects, a model the project can't use. Undefined for everything else, whose generic
1561
+ * message is all anyone needs. Never contains a secret.
1562
+ */
1563
+ function explain(error) {
1564
+ if (error.code !== "bot_unavailable") return void 0;
1565
+ const { message, status, code } = fieldsOf(error.cause);
1566
+ const plain = scrub(message.replace(/^\[askdare\] /, ""));
1567
+ if (/is not configured/.test(plain)) return `${plain.replace(" is not configured.", "")} is not set. Add it to .env.local (or your host's environment) and restart the app.`;
1568
+ if (status === 401 || status === 403) return `OpenAI rejected the API key (${String(status)}). Check OPENAI_API_KEY and the key's project permissions.`;
1569
+ if (code === "model_not_found") return `The bot's model doesn't exist or this OpenAI project can't use it: ${plain}`;
1570
+ return plain || void 0;
1571
+ }
1572
+ // src/attachments/files.ts
1573
+ const MAX_NAME = 80;
1574
+ const ascii$1 = (text) => Array.from(text, (char) => char.charCodeAt(0));
1575
+ function startsWith$1(bytes, signature, offset = 0) {
1576
+ return signature.every((byte, index) => bytes[offset + index] === byte);
1577
+ }
1578
+ function count(bytes, pattern) {
1579
+ let found = 0;
1580
+ for (let index = 0; index <= bytes.length - pattern.length; index += 1) if (startsWith$1(bytes, pattern, index)) found += 1;
1581
+ return found;
1582
+ }
1583
+ /** Animated GIFs loop (NETSCAPE2.0) or have several frames, each with its own control block. */
1584
+ const isAnimatedGif = (bytes) => count(bytes, ascii$1("NETSCAPE2.0")) > 0 || count(bytes, [
1585
+ 33,
1586
+ 249,
1587
+ 4
1588
+ ]) > 1;
1589
+ /** Extended WebP (VP8X) carries an animation flag in its header. */
1590
+ const isAnimatedWebp = (bytes) => startsWith$1(bytes, ascii$1("VP8X"), 12) && ((bytes[20] ?? 0) & 2) !== 0;
1591
+ /**
1592
+ * Detects the file type from its first bytes. The file name and Content-Type are never trusted.
1593
+ * Only types OpenAI accepts as model input pass: PNG, JPEG, WebP, GIF (not animated) and PDF.
1594
+ * Everything else, SVG included, is rejected.
1595
+ */
1596
+ function detectFile(bytes) {
1597
+ if (startsWith$1(bytes, [
1598
+ 137,
1599
+ 80,
1600
+ 78,
1601
+ 71,
1602
+ 13,
1603
+ 10,
1604
+ 26,
1605
+ 10
1606
+ ])) return {
1607
+ kind: "image",
1608
+ mime: "image/png",
1609
+ extension: "png"
1610
+ };
1611
+ if (startsWith$1(bytes, [
1612
+ 255,
1613
+ 216,
1614
+ 255
1615
+ ])) return {
1616
+ kind: "image",
1617
+ mime: "image/jpeg",
1618
+ extension: "jpg"
1619
+ };
1620
+ if (startsWith$1(bytes, ascii$1("GIF87a")) || startsWith$1(bytes, ascii$1("GIF89a"))) return isAnimatedGif(bytes) ? void 0 : {
1621
+ kind: "image",
1622
+ mime: "image/gif",
1623
+ extension: "gif"
1624
+ };
1625
+ if (startsWith$1(bytes, ascii$1("RIFF")) && startsWith$1(bytes, ascii$1("WEBP"), 8)) return isAnimatedWebp(bytes) ? void 0 : {
1626
+ kind: "image",
1627
+ mime: "image/webp",
1628
+ extension: "webp"
1629
+ };
1630
+ if (startsWith$1(bytes, ascii$1("%PDF-"))) return {
1631
+ kind: "pdf",
1632
+ mime: "application/pdf",
1633
+ extension: "pdf"
1634
+ };
1635
+ }
1636
+ /** Decompressed bytes scanned per PDF while counting pages, so a zip bomb can't exhaust memory. */
1637
+ const INFLATE_BUDGET = 33554432;
1638
+ const latin1 = (bytes) => new TextDecoder("latin1").decode(bytes);
1639
+ /** PDF names may escape characters as #xx, so /P#61ge is /Page. */
1640
+ const unescapeNames = (text) => text.replace(/#([0-9A-Fa-f]{2})/g, (_match, hex) => String.fromCharCode(Number.parseInt(hex, 16)));
1641
+ function pageCounts(text) {
1642
+ const clean = unescapeNames(text);
1643
+ let declared = 0;
1644
+ for (const match of clean.matchAll(/\/Count\s+(\d+)/g)) declared = Math.max(declared, Number(match[1]));
1645
+ return {
1646
+ objects: clean.match(/\/Type\s*\/Page(?![A-Za-z])/g)?.length ?? 0,
1647
+ declared
1648
+ };
1649
+ }
1650
+ async function inflate(data, budget) {
1651
+ try {
1652
+ const reader = new Blob([data]).stream().pipeThrough(new DecompressionStream("deflate")).getReader();
1653
+ const chunks = [];
1654
+ let size = 0;
1655
+ for (;;) {
1656
+ const { done, value } = await reader.read();
1657
+ if (done) break;
1658
+ size += value.byteLength;
1659
+ budget.left -= value.byteLength;
1660
+ if (budget.left < 0) {
1661
+ await reader.cancel();
1662
+ return;
1663
+ }
1664
+ chunks.push(value);
1665
+ }
1666
+ const out = new Uint8Array(size);
1667
+ let offset = 0;
1668
+ for (const chunk of chunks) {
1669
+ out.set(chunk, offset);
1670
+ offset += chunk.byteLength;
1671
+ }
1672
+ return out;
1673
+ } catch {
1674
+ return;
1675
+ }
1676
+ }
1677
+ /**
1678
+ * Pages of a PDF: the larger of the page objects found and the page count the file declares,
1679
+ * including both inside compressed object streams. Returns `undefined` when the file hides its
1680
+ * structure (encryption, unknown filters, broken streams), so callers can assume the worst.
1681
+ */
1682
+ async function countPdfPages(bytes) {
1683
+ const text = latin1(bytes);
1684
+ if (/\/Encrypt\b/.test(text)) return void 0;
1685
+ let { objects, declared } = pageCounts(text);
1686
+ const budget = { left: INFLATE_BUDGET };
1687
+ for (const match of text.matchAll(/\bstream(\r\n|\n|\r)/g)) {
1688
+ const start = match.index + match[0].length;
1689
+ const objectStart = Math.max(0, text.lastIndexOf(" obj", match.index));
1690
+ const dictionary = unescapeNames(text.slice(objectStart, match.index));
1691
+ if (!/\/Type\s*\/ObjStm\b/.test(dictionary)) continue;
1692
+ if ((/\/Filter\s*(\[[^\]]*\]|\/[A-Za-z0-9]+)/.exec(dictionary)?.[1] ?? "").replace(/[[\]\s]/g, "") !== "/FlateDecode" || /\/DecodeParms/.test(dictionary)) return;
1693
+ const length = /\/Length\s+(\d+)(?!\s+\d+\s+R)/.exec(dictionary);
1694
+ const end = length ? start + Number(length[1]) : text.indexOf("endstream", start);
1695
+ if (end < start) return void 0;
1696
+ const inflated = await inflate(bytes.subarray(start, end), budget);
1697
+ if (!inflated) return void 0;
1698
+ const inner = pageCounts(latin1(inflated));
1699
+ objects += inner.objects;
1700
+ declared = Math.max(declared, inner.declared);
1701
+ }
1702
+ const pages = Math.max(objects, declared);
1703
+ return pages > 0 ? pages : void 0;
1704
+ }
1705
+ /** Input tokens one image adds to a turn (detail `auto`). */
1706
+ const IMAGE_TOKENS = 1500;
1707
+ /** Input tokens one PDF page adds: its extracted text plus a high-detail page image. */
1708
+ const PDF_PAGE_TOKENS = 2e3;
1709
+ /**
1710
+ * A safe file name for OpenAI: the visitor's base name without paths or control characters, and
1711
+ * the extension of the detected type, which is what OpenAI reads the file as.
1712
+ */
1713
+ function attachmentName(raw, file) {
1714
+ let decoded = "";
1715
+ try {
1716
+ decoded = decodeURIComponent(raw ?? "");
1717
+ } catch {}
1718
+ return `${(decoded.split(/[\\/]/).pop() ?? "").replace(/\.[^.]*$/, "").replace(/[^\p{L}\p{N} ._()-]+/gu, "_").trim().slice(0, MAX_NAME) || "attachment"}.${file.extension}`;
1719
+ }
1720
+ // src/voice/audio.ts
1721
+ /** Bytes allowed per second of speech: 128 kbps, the most browsers record (Safari's AAC default). */
1722
+ const BYTES_PER_SECOND = 16e3;
1723
+ /** About 4 kbps, the lowest bitrate speech codecs use, so the longest audio a file can hold. */
1724
+ const MIN_BYTES_PER_SECOND = 500;
1725
+ const ascii = (text) => Array.from(text, (char) => char.charCodeAt(0));
1726
+ function startsWith(bytes, signature, offset = 0) {
1727
+ return signature.every((byte, index) => bytes[offset + index] === byte);
1728
+ }
1729
+ function contains(bytes, pattern, within) {
1730
+ const end = Math.min(bytes.length, within) - pattern.length;
1731
+ for (let index = 0; index <= end; index += 1) if (startsWith(bytes, pattern, index)) return true;
1732
+ return false;
1733
+ }
1734
+ /**
1735
+ * Detects a recording's container from its first bytes, limited to what OpenAI transcribes and
1736
+ * browsers record: WebM (Chrome, Firefox, Edge), MP4 (Safari), plus WAV and MP3. Ogg and
1737
+ * Matroska are refused because OpenAI does not accept them.
1738
+ */
1739
+ function detectAudio(bytes) {
1740
+ if (startsWith(bytes, [
1741
+ 26,
1742
+ 69,
1743
+ 223,
1744
+ 163
1745
+ ])) return contains(bytes, ascii("webm"), 64) ? {
1746
+ mime: "audio/webm",
1747
+ extension: "webm"
1748
+ } : void 0;
1749
+ if (startsWith(bytes, ascii("ftyp"), 4)) return {
1750
+ mime: "audio/mp4",
1751
+ extension: "mp4"
1752
+ };
1753
+ if (startsWith(bytes, ascii("RIFF")) && startsWith(bytes, ascii("WAVE"), 8)) return {
1754
+ mime: "audio/wav",
1755
+ extension: "wav"
1756
+ };
1757
+ if (startsWith(bytes, ascii("ID3")) || (bytes[0] ?? 0) === 255 && ((bytes[1] ?? 0) & 224) === 224) return {
1758
+ mime: "audio/mpeg",
1759
+ extension: "mp3"
1760
+ };
1761
+ }
1762
+ /** Largest recording accepted for a bot's longest allowed dictation. */
1763
+ const maxAudioBytes = (maxSeconds) => maxSeconds * BYTES_PER_SECOND + 32e3;
1764
+ /** Seconds to charge when the billed duration is unknown: the longest a file of this size can play. */
1765
+ const worstCaseSeconds = (bytes, maxSeconds) => Math.max(maxSeconds, Math.ceil(bytes / MIN_BYTES_PER_SECOND));
1766
+ /** ISO 639-1 codes from the visitor's languages, as hints for transcription; at most three. */
1767
+ function languageHints(header) {
1768
+ const codes = (header ?? "").split(",").map((code) => code.trim().toLowerCase().split("-")[0] ?? "").filter((code) => /^[a-z]{2}$/.test(code));
1769
+ return [...new Set(codes)].slice(0, 3);
1770
+ }
1771
+ // src/theme/css.ts
1772
+ /** Public CSS variable for each token (ADR-0008). */
1773
+ const TOKEN_VARIABLES = {
1774
+ accent: "--ask-color-accent",
1775
+ onAccent: "--ask-color-on-accent",
1776
+ background: "--ask-color-background",
1777
+ surface: "--ask-color-surface",
1778
+ text: "--ask-color-text",
1779
+ muted: "--ask-color-muted",
1780
+ border: "--ask-color-border",
1781
+ danger: "--ask-color-danger",
1782
+ success: "--ask-color-success",
1783
+ userBubble: "--ask-color-user-bubble",
1784
+ onUserBubble: "--ask-color-on-user-bubble",
1785
+ backdrop: "--ask-backdrop",
1786
+ orb: "--ask-orb",
1787
+ fontFamily: "--ask-font-family",
1788
+ headingFamily: "--ask-font-family-heading",
1789
+ fontSize: "--ask-font-size",
1790
+ radius: "--ask-radius"
1791
+ };
1792
+ function declarations(tokens, scheme) {
1793
+ return `:root{${Object.entries(TOKEN_VARIABLES).map(([key, variable]) => `${variable}:${tokens[key]}`).join(";")};color-scheme:${scheme}}`;
1794
+ }
1795
+ /**
1796
+ * The theme as a stylesheet, served next to the iframe so the first paint already has the right
1797
+ * colors (the CSP forbids inline styles). Token values are validated, so they can't break out.
1798
+ * Kept in the library's layer: a site's own CSS still wins.
1799
+ */
1800
+ function themeStylesheet(theme) {
1801
+ return `@layer askdare{${theme.colorScheme === "auto" ? `${declarations(theme.light, "light")}@media (prefers-color-scheme: dark){${declarations(theme.dark, "dark")}}` : declarations(theme[theme.colorScheme], theme.colorScheme)}}`;
1802
+ }
1803
+ /** Variant attributes for the iframe document's root element. */
1804
+ function themeAttributes(theme) {
1805
+ return {
1806
+ "data-ask-preset": theme.preset,
1807
+ "data-ask-scheme": theme.colorScheme,
1808
+ ...Object.fromEntries(Object.entries(theme.variants).map(([name, value]) => [`data-ask-${name}`, value]))
1809
+ };
1810
+ }
1811
+ // src/server/embed-page.ts
1812
+ const uiLanguage = (locale) => locale.toLowerCase().split("-")[0] === textLocale(locale) ? locale : textLocale(locale);
1813
+ /** States the gallery can render without a model, for design review and visual tests. */
1814
+ const GALLERY_STATES = [
1815
+ "welcome",
1816
+ "conversation",
1817
+ "streaming",
1818
+ "attachments",
1819
+ "error",
1820
+ "listening"
1821
+ ];
1822
+ const HTML_ESCAPES = {
1823
+ "&": "&amp;",
1824
+ "<": "&lt;",
1825
+ ">": "&gt;",
1826
+ "\"": "&quot;",
1827
+ "'": "&#39;"
1828
+ };
1829
+ function escapeHtml(value) {
1830
+ return value.replace(/[&<>"']/g, (char) => HTML_ESCAPES[char] ?? char);
1831
+ }
1832
+ /** JSON that is safe inside a `<script type="application/json">` element. */
1833
+ function scriptSafeJson(value) {
1834
+ return JSON.stringify(value).replaceAll("<", "\\u003c").replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
1835
+ }
1836
+ function embedConfig(bot, basePath, view) {
1837
+ const { theme, css: _css, texts: overrides, ...widget } = bot.widget;
1838
+ const resolved = view?.theme ?? theme;
1839
+ const locale = view?.locale ?? (widget.locale === "auto" ? "en" : widget.locale);
1840
+ const texts = textsFor(locale, overrides);
1841
+ return {
1842
+ protocolVersion: 1,
1843
+ basePath,
1844
+ botId: bot.id,
1845
+ allowedOrigins: bot.security.allowedOrigins,
1846
+ pageContext: bot.pageContext,
1847
+ widget: {
1848
+ ...widget,
1849
+ locale,
1850
+ title: texts["header.title"] ?? widget.title,
1851
+ greeting: texts["welcome.greeting"] ?? widget.greeting,
1852
+ placeholder: texts["composer.placeholder"] ?? widget.placeholder,
1853
+ launcherLabel: texts["launcher.label"] ?? widget.launcherLabel,
1854
+ texts,
1855
+ preset: resolved.preset,
1856
+ variants: resolved.variants
1857
+ },
1858
+ ...view?.gallery ? { gallery: view.gallery } : {},
1859
+ ...bot.attachments ? { attachments: bot.attachments } : {},
1860
+ ...bot.voice ? { voice: { maxSeconds: bot.voice.maxSeconds } } : {}
1861
+ };
1862
+ }
1863
+ /**
1864
+ * Content Security Policy for the iframe document: same-origin resources only, no inline script,
1865
+ * and `frame-ancestors` limited to the app itself plus the bot's allowlist (ADR-0005).
1866
+ */
1867
+ function embedContentSecurityPolicy(bot) {
1868
+ return [
1869
+ "default-src 'none'",
1870
+ "script-src 'self'",
1871
+ "style-src 'self'",
1872
+ "connect-src 'self'",
1873
+ "img-src 'self' data: blob:",
1874
+ "font-src 'self'",
1875
+ "base-uri 'none'",
1876
+ "form-action 'none'",
1877
+ `frame-ancestors ${["'self'", ...bot.security.allowedOrigins].join(" ")}`
1878
+ ].join("; ");
1879
+ }
1880
+ /** Stylesheet and content hash of a theme plus a bot's own CSS, cached per distinct pair. */
1881
+ const stylesheets = /* @__PURE__ */ new WeakMap();
1882
+ function themeAsset(theme, custom = "") {
1883
+ let byCustom = stylesheets.get(theme);
1884
+ if (!byCustom) {
1885
+ byCustom = /* @__PURE__ */ new Map();
1886
+ stylesheets.set(theme, byCustom);
1887
+ }
1888
+ let asset = byCustom.get(custom);
1889
+ if (!asset) {
1890
+ const css = custom ? `${themeStylesheet(theme)}\n${custom}` : themeStylesheet(theme);
1891
+ let value = 2166136261;
1892
+ for (let index = 0; index < css.length; index += 1) value = Math.imul(value ^ css.charCodeAt(index), 16777619) >>> 0;
1893
+ asset = {
1894
+ css,
1895
+ hash: value.toString(16).padStart(8, "0")
1896
+ };
1897
+ byCustom.set(custom, asset);
1898
+ }
1899
+ return asset;
1900
+ }
1901
+ function renderEmbedPage(bot, basePath, assets, view) {
1902
+ const config = embedConfig(bot, basePath, view);
1903
+ const lang = bot.widget.locale !== "auto" && Object.keys(bot.widget.texts ?? {}).length > 0 ? config.widget.locale : uiLanguage(config.widget.locale);
1904
+ const attributes = Object.entries(themeAttributes(view.theme)).map(([name, value]) => ` ${name}="${escapeHtml(value)}"`).join("");
1905
+ return [
1906
+ "<!doctype html>",
1907
+ `<html lang="${escapeHtml(lang)}"${attributes}>`,
1908
+ "<head>",
1909
+ "<meta charset=\"utf-8\">",
1910
+ "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">",
1911
+ `<title>${escapeHtml(config.widget.title)}</title>`,
1912
+ `<link rel="stylesheet" href="${basePath}/assets/${assets.fontsCssFile}">`,
1913
+ `<link rel="stylesheet" href="${basePath}/assets/${assets.widgetCssFile}">`,
1914
+ `<link rel="stylesheet" href="${escapeHtml(view.themeHref)}">`,
1915
+ "</head>",
1916
+ "<body>",
1917
+ "<div id=\"askdare-root\"></div>",
1918
+ `<script type="application/json" id="askdare-config">${scriptSafeJson(config)}<\/script>`,
1919
+ `<script type="module" src="${basePath}/assets/${assets.widgetJsFile}"><\/script>`,
1920
+ "</body>",
1921
+ "</html>"
1922
+ ].join("\n");
1923
+ }
1924
+ // src/protocol/launcher.ts
1925
+ /** Replaced, quotes included, in the served loader by a JSON string of the requested bot's look. */
1926
+ const LAUNCHER_PLACEHOLDER = "__ASKDARE_LAUNCHERS__";
1927
+ // src/server/launcher.ts
1928
+ const initials = (title) => title.split(/\s+/).filter(Boolean).slice(0, 2).map((word) => word[0]?.toUpperCase() ?? "").join("") || "AI";
1929
+ function launcherLook(bot) {
1930
+ const { theme } = bot.widget;
1931
+ const tokens = theme.colorScheme === "dark" ? theme.dark : theme.light;
1932
+ const texts = Object.fromEntries(TEXT_LOCALES.map((locale) => {
1933
+ const all = textsFor(locale, bot.widget.texts);
1934
+ return [locale, {
1935
+ label: all["launcher.label"] ?? "",
1936
+ open: all["launcher.open"] ?? "",
1937
+ close: all["launcher.close"] ?? "",
1938
+ unavailable: all["launcher.unavailable"] ?? "",
1939
+ title: all["header.title"] ?? ""
1940
+ }];
1941
+ }));
1942
+ return {
1943
+ style: theme.variants.launcher,
1944
+ texts,
1945
+ ...bot.widget.locale === "auto" ? {} : { locale: textLocale(bot.widget.locale) },
1946
+ accent: tokens.accent,
1947
+ onAccent: tokens.onAccent,
1948
+ orb: tokens.orb,
1949
+ ...bot.widget.avatar ? { avatar: bot.widget.avatar } : {},
1950
+ initials: initials(bot.widget.title),
1951
+ light: theme.light.background,
1952
+ dark: theme.dark.background,
1953
+ text: theme.light.text,
1954
+ textDark: theme.dark.text,
1955
+ scheme: theme.colorScheme,
1956
+ radius: tokens.radius
1957
+ };
1958
+ }
1959
+ /** The placeholder as the minifier left it, in whichever quotes it chose (it picks backticks too). */
1960
+ const QUOTED_PLACEHOLDER = new RegExp(`(['"\`])${LAUNCHER_PLACEHOLDER}\\1`);
1961
+ /**
1962
+ * The loader with the requested bot's launcher look inlined, and no other bot's: widget.js must
1963
+ * not list every bot. The whole quoted placeholder is replaced by a JSON string literal, which is
1964
+ * a valid JS string whatever it contains (quotes, backticks, `${`, `$&`), and the replacement is a
1965
+ * function so `String.replace` patterns in the values are not interpreted.
1966
+ */
1967
+ function loaderWithLook(loaderJs, bot) {
1968
+ const looks = bot ? { [bot.id]: launcherLook(bot) } : {};
1969
+ const literal = JSON.stringify(JSON.stringify(looks)).replaceAll("\u2028", "\\u2028").replaceAll("\u2029", "\\u2029");
1970
+ return loaderJs.replace(QUOTED_PLACEHOLDER, () => literal);
1971
+ }
1972
+ // src/protocol/events.ts
1973
+ const PROTOCOL_EVENT_TYPES = [
1974
+ "conversation.created",
1975
+ "user.ack",
1976
+ "message.start",
1977
+ "reasoning",
1978
+ "text.delta",
1979
+ "citation",
1980
+ "tool.status",
1981
+ "message.end",
1982
+ "error"
1983
+ ];
1984
+ // src/protocol/sse.ts
1985
+ /** Frames a protocol event for the wire. JSON never contains raw newlines, so one data line suffices. */
1986
+ function encodeEvent(event) {
1987
+ return `event: ${event.type}\ndata: ${JSON.stringify(event)}\n\n`;
1988
+ }
1989
+ /** Frames an SSE comment, used for the first byte and heartbeats. Clients ignore it. */
1990
+ function encodeComment(text) {
1991
+ return `: ${text.replaceAll(/[\r\n]/g, " ")}\n\n`;
1992
+ }
1993
+ new Set(PROTOCOL_EVENT_TYPES);
1994
+ // src/server/stream-turn.ts
1995
+ const STREAM_HEADERS = {
1996
+ "Content-Type": "text/event-stream; charset=utf-8",
1997
+ "Cache-Control": "no-cache, no-transform",
1998
+ "X-Accel-Buffering": "no",
1999
+ [PROTOCOL_HEADER]: String(1)
2000
+ };
2001
+ const encoder = new TextEncoder();
2002
+ function defaultId() {
2003
+ return `msg_${crypto.randomUUID().replaceAll("-", "")}`;
2004
+ }
2005
+ function logError(error) {
2006
+ console.error(`[askdare] turn failed: ${error.code}`, error.cause);
2007
+ }
2008
+ /**
2009
+ * Streams one chat turn as protocol v1 SSE. Sends a comment before any upstream call (Heroku's
2010
+ * 30 s first-byte rule), heartbeats on an independent timer (55 s idle rule), and enforces the
2011
+ * bot's turn deadline.
2012
+ *
2013
+ * A visitor who disconnects stops the stream, not the model: once the model call has started, it
2014
+ * runs to completion, so the turn is charged its real usage (an aborted response is gone, usage
2015
+ * included) and the answer is waiting in the conversation when they return.
2016
+ */
2017
+ function streamTurn(options) {
2018
+ const { bot, gateway } = options;
2019
+ const generateId = options.generateId ?? defaultId;
2020
+ const reportError = options.onError ?? logError;
2021
+ let closed = false;
2022
+ let heartbeat;
2023
+ return new ReadableStream({
2024
+ start(controller) {
2025
+ const write = (chunk) => {
2026
+ if (closed) return;
2027
+ try {
2028
+ controller.enqueue(encoder.encode(chunk));
2029
+ } catch {
2030
+ closed = true;
2031
+ }
2032
+ };
2033
+ const emit = (event) => write(encodeEvent(event));
2034
+ const finish = () => {
2035
+ clearInterval(heartbeat);
2036
+ if (closed) return;
2037
+ closed = true;
2038
+ controller.close();
2039
+ };
2040
+ write(encodeComment("ok"));
2041
+ heartbeat = setInterval(() => write(encodeComment("ping")), options.heartbeatIntervalMs ?? 15e3);
2042
+ const deadline = AbortSignal.timeout(bot.limits.turnTimeoutMs);
2043
+ const visitorLeft = () => options.signal.aborted;
2044
+ const run = async () => {
2045
+ if (visitorLeft()) return;
2046
+ let conversationId = options.conversationId;
2047
+ if (conversationId === void 0) {
2048
+ conversationId = await gateway.createConversation({
2049
+ botId: bot.id,
2050
+ visitorId: options.visitorId
2051
+ }, deadline);
2052
+ const resumeToken = await options.issueResumeToken(conversationId);
2053
+ if (visitorLeft()) {
2054
+ await gateway.deleteConversation(conversationId);
2055
+ return;
2056
+ }
2057
+ emit({
2058
+ type: "conversation.created",
2059
+ resumeToken
2060
+ });
2061
+ }
2062
+ if (visitorLeft()) return;
2063
+ emit({
2064
+ type: "user.ack",
2065
+ messageId: generateId()
2066
+ });
2067
+ const messageId = generateId();
2068
+ emit({
2069
+ type: "message.start",
2070
+ messageId
2071
+ });
2072
+ const result = await gateway.runTurn({
2073
+ bot,
2074
+ conversationId,
2075
+ text: options.text,
2076
+ attachments: options.attachments ?? [],
2077
+ pageContext: options.pageContext,
2078
+ context: options.context,
2079
+ visitorId: options.visitorId,
2080
+ safetyIdentifier: await options.pseudonym(options.context.identity ? `user:${options.context.identity.id}` : options.visitorId),
2081
+ messageId,
2082
+ signal: deadline,
2083
+ emit,
2084
+ reserveCall: options.reserveCall
2085
+ });
2086
+ options.onUsage?.(result.usage, conversationId);
2087
+ const resumeToken = options.conversationId ? await options.issueResumeToken(conversationId).catch(() => void 0) : void 0;
2088
+ emit({
2089
+ type: "message.end",
2090
+ messageId,
2091
+ reason: result.reason,
2092
+ ...resumeToken ? { resumeToken } : {}
2093
+ });
2094
+ };
2095
+ const work = run().catch((error) => {
2096
+ if (error instanceof TurnAbortedError) return;
2097
+ const failure = deadline.aborted ? new AskdareError("timeout", { cause: error }) : toAskdareError(error);
2098
+ reportError(failure);
2099
+ const explanation = options.explain?.(failure);
2100
+ emit({
2101
+ type: "error",
2102
+ code: failure.code,
2103
+ message: explanation ?? failure.message,
2104
+ retryAfterMs: failure.retryAfterMs,
2105
+ key: explanation ? void 0 : failure.key,
2106
+ params: failure.params
2107
+ });
2108
+ }).finally(finish);
2109
+ try {
2110
+ options.waitUntil?.(work);
2111
+ } catch {}
2112
+ },
2113
+ cancel() {
2114
+ closed = true;
2115
+ clearInterval(heartbeat);
2116
+ }
2117
+ });
2118
+ }
2119
+ // src/server/handler.ts
2120
+ const MAX_BODY_BYTES = 262144;
2121
+ /** Upload metadata travels in headers because the body is the raw file. */
2122
+ const BOT_HEADER = "x-askdare-bot";
2123
+ const FILENAME_HEADER = "x-askdare-filename";
2124
+ /** The visitor's likely languages (browser and page), as transcription hints. */
2125
+ const LANGUAGES_HEADER = "x-askdare-languages";
2126
+ /** Transcription is short; this only bounds a stuck upstream call. */
2127
+ const TRANSCRIPTION_TIMEOUT_MS = 6e4;
2128
+ const NO_STORE = { "Cache-Control": "no-store" };
2129
+ const sessionBody = z.object({
2130
+ botId: z.string().max(64),
2131
+ resumeToken: z.string().max(4096).optional(),
2132
+ /** The previous access token, so a renewal keeps the visitor before they have a conversation. */
2133
+ accessToken: z.string().max(8192).optional(),
2134
+ /**
2135
+ * askdare('identify') from the page: a JWT signed by the site's backend, or null to sign out.
2136
+ * Absent: a renewal keeps the identity the previous access token had.
2137
+ */
2138
+ identityToken: z.string().max(4096).nullable().optional()
2139
+ });
2140
+ const conversationBody = z.object({
2141
+ botId: z.string().max(64),
2142
+ resumeToken: z.string().min(1).max(4096)
2143
+ });
2144
+ const messageBody = z.object({
2145
+ botId: z.string().max(64),
2146
+ text: z.string(),
2147
+ /** Handles from POST /attachments; raw OpenAI file IDs fail verification. */
2148
+ attachments: z.array(z.string().min(1).max(4096)).max(10).optional(),
2149
+ /** askdare('configure', { context }) from the host page: untrusted, like the message itself. */
2150
+ context: z.string().max(1e3).optional(),
2151
+ resumeToken: z.string().max(4096).optional(),
2152
+ locale: z.string().max(35).refine((value) => canonicalLocale(value) !== void 0).optional()
2153
+ });
2154
+ function jsonResponse(body, status = 200, headers = {}) {
2155
+ return new Response(JSON.stringify(body), {
2156
+ status,
2157
+ headers: {
2158
+ "Content-Type": "application/json; charset=utf-8",
2159
+ ...NO_STORE,
2160
+ ...headers
2161
+ }
2162
+ });
2163
+ }
2164
+ function errorResponse(error, explanation) {
2165
+ const retry = error.retryAfterMs;
2166
+ return jsonResponse({ error: {
2167
+ code: error.code,
2168
+ message: explanation ?? error.message,
2169
+ ...retry ? { retryAfterMs: retry } : {},
2170
+ ...error.key && !explanation ? { key: error.key } : {},
2171
+ ...error.params ? { params: error.params } : {}
2172
+ } }, error.status, retry ? { "Retry-After": String(Math.ceil(retry / 1e3)) } : {});
2173
+ }
2174
+ /**
2175
+ * Defense in depth only: browsers can't reach the API cross-origin anyway, because JSON bodies need
2176
+ * a CORS preflight we never grant. Compares Origin with the Host header, which proxies set, never
2177
+ * with X-Forwarded-Host, which clients control.
2178
+ */
2179
+ function assertSameOrigin(request) {
2180
+ const denied = () => new AskdareError("unauthorized", { message: "Cross-origin requests are not allowed." });
2181
+ if (request.headers.get("sec-fetch-site") === "cross-site") throw denied();
2182
+ const origin = request.headers.get("origin");
2183
+ if (origin === null) return;
2184
+ const host = request.headers.get("host") ?? new URL(request.url).host;
2185
+ let originHost;
2186
+ try {
2187
+ originHost = new URL(origin).host;
2188
+ } catch {
2189
+ throw denied();
2190
+ }
2191
+ if (originHost !== host) throw denied();
2192
+ }
2193
+ /** Reads at most `limit` bytes and cancels the upload as soon as it grows past the limit. */
2194
+ async function readBytes(request, limit, tooLargeError = { message: "Request body is too large." }) {
2195
+ const tooLarge = () => new AskdareError("invalid_input", tooLargeError);
2196
+ if (Number(request.headers.get("content-length") ?? 0) > limit) throw tooLarge();
2197
+ if (!request.body) return /* @__PURE__ */ new Uint8Array();
2198
+ const reader = request.body.getReader();
2199
+ const chunks = [];
2200
+ let size = 0;
2201
+ for (;;) {
2202
+ const { done, value } = await reader.read();
2203
+ if (done) break;
2204
+ size += value.byteLength;
2205
+ if (size > limit) {
2206
+ await reader.cancel();
2207
+ throw tooLarge();
2208
+ }
2209
+ chunks.push(value);
2210
+ }
2211
+ const bytes = new Uint8Array(size);
2212
+ let offset = 0;
2213
+ for (const chunk of chunks) {
2214
+ bytes.set(chunk, offset);
2215
+ offset += chunk.byteLength;
2216
+ }
2217
+ return bytes;
2218
+ }
2219
+ async function readJson(request, schema) {
2220
+ if (!(request.headers.get("content-type") ?? "").toLowerCase().startsWith("application/json")) throw new AskdareError("invalid_input", { message: "Expected an application/json body." });
2221
+ const text = new TextDecoder().decode(await readBytes(request, MAX_BODY_BYTES));
2222
+ let json;
2223
+ try {
2224
+ json = JSON.parse(text);
2225
+ } catch {
2226
+ throw new AskdareError("invalid_input", { message: "Malformed JSON." });
2227
+ }
2228
+ const parsed = schema.safeParse(json);
2229
+ if (!parsed.success) throw new AskdareError("invalid_input");
2230
+ return parsed.data;
2231
+ }
2232
+ /**
2233
+ * Whether the current session may use a conversation: anonymous conversations stay open to their
2234
+ * visitor, signed-in ones only to the same user (ADR-0009).
2235
+ */
2236
+ function sameOwner(grant, visitorId, key) {
2237
+ return grant.identityKey === void 0 ? grant.visitorId === visitorId : grant.identityKey === key;
2238
+ }
2239
+ function bearerToken(request) {
2240
+ const header = request.headers.get("authorization") ?? "";
2241
+ const match = /^Bearer\s+(\S+)$/i.exec(header);
2242
+ if (!match?.[1]) throw new AskdareError("unauthorized");
2243
+ return match[1];
2244
+ }
2245
+ /** Turns attachment handles into files, rejecting foreign, expired and duplicate handles. */
2246
+ async function verifyAttachments(bot, tokens, visitorId, handles) {
2247
+ const unique = [...new Set(handles)];
2248
+ if (unique.length === 0) return {
2249
+ attachments: [],
2250
+ attachmentTokens: 0
2251
+ };
2252
+ if (!bot.attachments) throw new AskdareError("invalid_input", {
2253
+ message: "This assistant does not accept files.",
2254
+ key: "error.filesNotAccepted"
2255
+ });
2256
+ if (unique.length > bot.attachments.maxPerMessage) throw new AskdareError("invalid_input", {
2257
+ message: `Attach up to ${bot.attachments.maxPerMessage} files per message.`,
2258
+ key: "error.tooManyFiles",
2259
+ params: { count: bot.attachments.maxPerMessage }
2260
+ });
2261
+ const files = /* @__PURE__ */ new Map();
2262
+ let attachmentTokens = 0;
2263
+ for (const handle of unique) {
2264
+ const grant = await tokens.verifyAttachment(handle, bot.id);
2265
+ if (grant.visitorId !== visitorId) throw new AskdareError("invalid_input", {
2266
+ message: "An attachment expired or is invalid. Please attach it again.",
2267
+ key: "error.attachmentExpired"
2268
+ });
2269
+ if (files.has(grant.fileId)) continue;
2270
+ files.set(grant.fileId, {
2271
+ fileId: grant.fileId,
2272
+ kind: grant.kind
2273
+ });
2274
+ attachmentTokens += grant.tokens;
2275
+ }
2276
+ return {
2277
+ attachments: [...files.values()],
2278
+ attachmentTokens
2279
+ };
2280
+ }
2281
+ /**
2282
+ * Framework-agnostic request handler behind `createChatHandler`. Serves the loader, the iframe
2283
+ * document and its assets, and the JSON/SSE API used by the iframe app (same-origin, no CORS).
2284
+ */
2285
+ function createRequestHandler(config) {
2286
+ const bots = new Map(config.bots.map((bot) => [bot.id, bot]));
2287
+ const report = config.onError ?? ((error) => console.error(`[askdare] ${error.code}`, error.cause));
2288
+ const findBot = (botId) => {
2289
+ const bot = bots.get(botId);
2290
+ if (!bot) throw new AskdareError("not_found");
2291
+ return bot;
2292
+ };
2293
+ /** One loader per bot, with only that bot's launcher look (`widget.js?bot=<id>`). */
2294
+ const loaders = /* @__PURE__ */ new Map();
2295
+ const serveLoader = (query) => {
2296
+ const bot = bots.get(query.get("bot") ?? "");
2297
+ const key = bot?.id ?? "";
2298
+ let loaderJs = loaders.get(key);
2299
+ if (loaderJs === void 0) {
2300
+ loaderJs = loaderWithLook(config.assets.loaderJs, bot);
2301
+ loaders.set(key, loaderJs);
2302
+ }
2303
+ return new Response(loaderJs, { headers: {
2304
+ "Content-Type": "text/javascript; charset=utf-8",
2305
+ "Cache-Control": config.development ? "no-cache" : "public, max-age=300, stale-while-revalidate=86400",
2306
+ "Cross-Origin-Resource-Policy": "cross-origin",
2307
+ "X-Content-Type-Options": "nosniff"
2308
+ } });
2309
+ };
2310
+ /**
2311
+ * The visitor's language for a bot set to `auto`: their page's `lang` (sent by the loader),
2312
+ * else their browser's first language, else English.
2313
+ */
2314
+ const localeFor = (bot, query, request) => {
2315
+ if (bot.widget.locale !== "auto") return bot.widget.locale;
2316
+ const candidates = [query.get("lang"), (request.headers.get("accept-language") ?? "").split(",")[0]?.split(";")[0]?.trim()];
2317
+ for (const tag of candidates) {
2318
+ const canonical = tag ? canonicalLocale(tag) : void 0;
2319
+ if (canonical) return canonical;
2320
+ }
2321
+ return "en";
2322
+ };
2323
+ /** The bot's theme, or in gallery mode the preset and scheme asked for in the query. */
2324
+ const viewFor = (bot, query, request) => {
2325
+ let theme = bot.widget.theme;
2326
+ let gallery;
2327
+ const overrides = new URLSearchParams();
2328
+ if (config.gallery) {
2329
+ const state = query.get("gallery");
2330
+ if (GALLERY_STATES.includes(state)) gallery = state;
2331
+ const preset = query.get("preset");
2332
+ const scheme = query.get("scheme");
2333
+ const colorScheme = [
2334
+ "auto",
2335
+ "light",
2336
+ "dark"
2337
+ ].includes(scheme) ? scheme : theme.colorScheme;
2338
+ if (PRESET_NAMES.includes(preset)) {
2339
+ theme = resolveTheme(preset, colorScheme);
2340
+ overrides.set("preset", preset);
2341
+ } else if (colorScheme !== theme.colorScheme) theme = {
2342
+ ...theme,
2343
+ colorScheme
2344
+ };
2345
+ if (colorScheme !== bot.widget.theme.colorScheme) overrides.set("scheme", colorScheme);
2346
+ }
2347
+ overrides.set("v", themeAsset(theme, bot.widget.css).hash);
2348
+ return {
2349
+ locale: localeFor(bot, query, request),
2350
+ theme,
2351
+ gallery,
2352
+ themeHref: `${config.basePath}/theme/${bot.id}.css?${overrides}`
2353
+ };
2354
+ };
2355
+ const serveTheme = (botId, query, request) => {
2356
+ const bot = findBot(botId);
2357
+ const { css, hash } = themeAsset(viewFor(bot, query, request).theme, bot.widget.css);
2358
+ return new Response(css, { headers: {
2359
+ "Content-Type": "text/css; charset=utf-8",
2360
+ "Cache-Control": query.get("v") === hash ? "public, max-age=31536000, immutable" : "public, max-age=60",
2361
+ "Cross-Origin-Resource-Policy": "same-origin",
2362
+ "X-Content-Type-Options": "nosniff"
2363
+ } });
2364
+ };
2365
+ const serveEmbed = (botId, query, request) => {
2366
+ const bot = findBot(botId);
2367
+ const page = renderEmbedPage(bot, config.basePath, config.assets, viewFor(bot, query, request));
2368
+ return new Response(page, { headers: {
2369
+ "Content-Type": "text/html; charset=utf-8",
2370
+ "Content-Security-Policy": embedContentSecurityPolicy(bot),
2371
+ "Permissions-Policy": `camera=(), geolocation=(), microphone=${bot.voice ? "(self)" : "()"}`,
2372
+ "Referrer-Policy": "strict-origin",
2373
+ "Cross-Origin-Opener-Policy": "same-origin",
2374
+ "X-Content-Type-Options": "nosniff",
2375
+ ...NO_STORE
2376
+ } });
2377
+ };
2378
+ const fonts = /* @__PURE__ */ new Map();
2379
+ const fontFile = (file) => {
2380
+ const encoded = Object.hasOwn(config.assets.fontFiles, file) ? config.assets.fontFiles[file] : void 0;
2381
+ if (encoded === void 0) return void 0;
2382
+ let bytes = fonts.get(file);
2383
+ if (!bytes) {
2384
+ bytes = Uint8Array.from(atob(encoded), (char) => char.charCodeAt(0));
2385
+ fonts.set(file, bytes);
2386
+ }
2387
+ return bytes;
2388
+ };
2389
+ const serveAsset = (file) => {
2390
+ const { assets } = config;
2391
+ const font = fontFile(file);
2392
+ const body = font ? {
2393
+ content: font,
2394
+ type: "font/woff2"
2395
+ } : file === assets.widgetJsFile ? {
2396
+ content: assets.widgetJs,
2397
+ type: "text/javascript; charset=utf-8"
2398
+ } : file === assets.widgetCssFile ? {
2399
+ content: assets.widgetCss,
2400
+ type: "text/css; charset=utf-8"
2401
+ } : file === assets.fontsCssFile ? {
2402
+ content: assets.fontsCss,
2403
+ type: "text/css; charset=utf-8"
2404
+ } : void 0;
2405
+ if (!body) throw new AskdareError("not_found");
2406
+ return new Response(body.content, { headers: {
2407
+ "Content-Type": body.type,
2408
+ "Cache-Control": "public, max-age=31536000, immutable",
2409
+ "Cross-Origin-Resource-Policy": "same-origin",
2410
+ "X-Content-Type-Options": "nosniff"
2411
+ } });
2412
+ };
2413
+ /** With identity off (no IDENTITY_SECRET), identities in older access tokens no longer count. */
2414
+ const keyed = (grant) => config.identity?.() ? grant : {
2415
+ ...grant,
2416
+ identity: void 0
2417
+ };
2418
+ const keyOf = (bot, identity) => config.identity?.()?.key(bot.id, identity.identity) ?? Promise.resolve(void 0);
2419
+ const createSession = async (request) => {
2420
+ assertSameOrigin(request);
2421
+ const body = await readJson(request, sessionBody);
2422
+ const bot = findBot(body.botId);
2423
+ const tokens = await config.tokens();
2424
+ let returningVisitorId;
2425
+ let resume;
2426
+ if (body.resumeToken) try {
2427
+ resume = await tokens.verifyResume(body.resumeToken, bot.id);
2428
+ returningVisitorId = resume.visitorId;
2429
+ } catch {}
2430
+ let identity;
2431
+ if (body.accessToken) try {
2432
+ const renewal = await tokens.verifyRenewal(body.accessToken, bot.id);
2433
+ returningVisitorId ??= renewal.visitorId;
2434
+ if (renewal.visitorId === returningVisitorId) identity = renewal.identity;
2435
+ } catch {}
2436
+ let identityProblem;
2437
+ if (body.identityToken !== void 0) {
2438
+ identity = void 0;
2439
+ if (body.identityToken !== null) {
2440
+ const verifier = config.identity?.();
2441
+ const result = verifier ? await verifier.verify(body.identityToken, bot.id) : {
2442
+ ok: false,
2443
+ reason: "disabled"
2444
+ };
2445
+ if (result.ok) identity = result.verified;
2446
+ else identityProblem = result.reason;
2447
+ }
2448
+ }
2449
+ if (!config.identity?.()) identity = void 0;
2450
+ const key = identity ? await keyOf(bot, identity) : void 0;
2451
+ const resumable = resume !== void 0 && sameOwner(resume, resume.visitorId, key);
2452
+ await config.limits.checkSession(bot, {
2453
+ clientIp: config.clientIp(request),
2454
+ returningVisitorId
2455
+ });
2456
+ const visitorId = returningVisitorId ?? newVisitorId();
2457
+ const access = await tokens.issueAccess(bot.id, visitorId, identity);
2458
+ const adopted = resume && resumable && key && resume.identityKey === void 0 ? (await tokens.issueResume(bot.id, {
2459
+ ...resume,
2460
+ identityKey: key
2461
+ })).token : void 0;
2462
+ return jsonResponse({
2463
+ accessToken: access.token,
2464
+ expiresAt: access.expiresAt,
2465
+ resumable,
2466
+ ...adopted ? { resumeToken: adopted } : {},
2467
+ identified: identity !== void 0,
2468
+ ...key ? { identityKey: key } : {},
2469
+ ...identityProblem ? { identityProblem } : {}
2470
+ });
2471
+ };
2472
+ const sendMessage = async (request) => {
2473
+ assertSameOrigin(request);
2474
+ const body = await readJson(request, messageBody);
2475
+ const bot = findBot(body.botId);
2476
+ const tokens = await config.tokens();
2477
+ const { visitorId, identity } = keyed(await tokens.verifyAccess(bearerToken(request), bot.id));
2478
+ const key = identity ? await keyOf(bot, identity) : void 0;
2479
+ let conversationId;
2480
+ if (body.resumeToken) {
2481
+ const grant = await tokens.verifyResume(body.resumeToken, bot.id);
2482
+ if (!sameOwner(grant, visitorId, key)) throw new AskdareError("not_found");
2483
+ conversationId = grant.conversationId;
2484
+ }
2485
+ const { attachments, attachmentTokens } = await verifyAttachments(bot, tokens, visitorId, body.attachments ?? []);
2486
+ const text = body.text.trim();
2487
+ if (text.length === 0 && attachments.length === 0 || text.length > bot.limits.maxInputChars) throw new AskdareError("invalid_input", {
2488
+ message: `Messages must be between 1 and ${bot.limits.maxInputChars} characters.`,
2489
+ key: "error.messageLength",
2490
+ params: { max: bot.limits.maxInputChars }
2491
+ });
2492
+ const context = {
2493
+ locale: body.locale ?? (bot.widget.locale === "auto" ? "en" : bot.widget.locale),
2494
+ identity: identity?.identity
2495
+ };
2496
+ const pageContext = bot.pageContext ? body.context?.trim() || void 0 : void 0;
2497
+ const gateway = config.gateway();
2498
+ const reservation = await config.limits.beginTurn(bot, {
2499
+ clientIp: config.clientIp(request),
2500
+ visitorId,
2501
+ conversationId,
2502
+ inputChars: text.length + bot.instructions(context).length + (pageContext?.length ?? 0),
2503
+ attachmentTokens
2504
+ });
2505
+ const stream = streamTurn({
2506
+ gateway,
2507
+ pseudonym: (value) => tokens.pseudonym(value),
2508
+ bot,
2509
+ text,
2510
+ attachments,
2511
+ pageContext,
2512
+ context,
2513
+ visitorId,
2514
+ conversationId,
2515
+ signal: request.signal,
2516
+ issueResumeToken: async (id) => (await tokens.issueResume(bot.id, {
2517
+ visitorId,
2518
+ conversationId: id,
2519
+ identityKey: key
2520
+ })).token,
2521
+ onUsage: (usage, id) => {
2522
+ reservation.settle(usage, id).catch((error) => report(toAskdareError(error)));
2523
+ },
2524
+ reserveCall: () => reservation.extend(),
2525
+ onError: report,
2526
+ explain: config.explain,
2527
+ heartbeatIntervalMs: config.heartbeatIntervalMs,
2528
+ waitUntil: config.waitUntil
2529
+ });
2530
+ return new Response(stream, { headers: STREAM_HEADERS });
2531
+ };
2532
+ /**
2533
+ * Stores one file for the visitor's next message. The body is the raw file; its type is detected
2534
+ * from its bytes. Returns an encrypted handle, so the client never learns the OpenAI file ID.
2535
+ */
2536
+ const uploadAttachment = async (request) => {
2537
+ assertSameOrigin(request);
2538
+ if (!(request.headers.get("content-type") ?? "").toLowerCase().startsWith("application/octet-stream")) throw new AskdareError("invalid_input", { message: "Expected an application/octet-stream body." });
2539
+ const bot = findBot(request.headers.get(BOT_HEADER) ?? "");
2540
+ const allowed = bot.attachments;
2541
+ if (!allowed) throw new AskdareError("invalid_input", {
2542
+ message: "This assistant does not accept files.",
2543
+ key: "error.filesNotAccepted"
2544
+ });
2545
+ const tokens = await config.tokens();
2546
+ const { visitorId } = await tokens.verifyAccess(bearerToken(request), bot.id);
2547
+ await config.limits.checkUpload(bot, {
2548
+ clientIp: config.clientIp(request),
2549
+ visitorId
2550
+ });
2551
+ const megabytes = Math.floor(allowed.maxBytes / 1e6 * 10) / 10;
2552
+ const bytes = await readBytes(request, allowed.maxBytes, {
2553
+ message: `Files can be up to ${megabytes} MB.`,
2554
+ key: "error.fileTooLarge",
2555
+ params: { size: `${megabytes} MB` }
2556
+ });
2557
+ const file = detectFile(bytes);
2558
+ if (!file || file.kind === "image" && !allowed.images || file.kind === "pdf" && !allowed.pdf) throw new AskdareError("invalid_input", {
2559
+ message: `Only ${[allowed.images ? "images (PNG, JPEG, WebP, GIF)" : "", allowed.pdf ? "PDF" : ""].filter(Boolean).join(" or ")} files are supported.`,
2560
+ key: allowed.images && allowed.pdf ? "error.fileType.both" : allowed.images ? "error.fileType.images" : "error.fileType.pdf"
2561
+ });
2562
+ let cost = IMAGE_TOKENS;
2563
+ if (file.kind === "pdf") {
2564
+ const pages = await countPdfPages(bytes);
2565
+ if (pages !== void 0 && pages > allowed.maxPdfPages) throw new AskdareError("invalid_input", {
2566
+ message: `PDFs can have up to ${allowed.maxPdfPages} pages.`,
2567
+ key: "error.pdfPages",
2568
+ params: { max: allowed.maxPdfPages }
2569
+ });
2570
+ cost = (pages ?? allowed.maxPdfPages) * PDF_PAGE_TOKENS;
2571
+ }
2572
+ const name = attachmentName(request.headers.get(FILENAME_HEADER), file);
2573
+ const fileId = await config.gateway().uploadFile({
2574
+ bytes,
2575
+ filename: name,
2576
+ mime: file.mime,
2577
+ signal: request.signal
2578
+ });
2579
+ return jsonResponse({ attachment: {
2580
+ id: (await tokens.issueAttachment(bot.id, {
2581
+ visitorId,
2582
+ fileId,
2583
+ kind: file.kind,
2584
+ tokens: cost
2585
+ })).token,
2586
+ kind: file.kind,
2587
+ name,
2588
+ size: bytes.byteLength
2589
+ } });
2590
+ };
2591
+ /**
2592
+ * Transcribes one dictation into text for the visitor to check and send. The body is the raw
2593
+ * recording. Speech is billed by duration, so seconds are reserved first and settled with what
2594
+ * OpenAI reports; the call is not tied to the visitor's connection, so it always settles.
2595
+ */
2596
+ const transcribe = async (request) => {
2597
+ assertSameOrigin(request);
2598
+ if (!(request.headers.get("content-type") ?? "").toLowerCase().startsWith("application/octet-stream")) throw new AskdareError("invalid_input", { message: "Expected an application/octet-stream body." });
2599
+ const bot = findBot(request.headers.get(BOT_HEADER) ?? "");
2600
+ const { voice } = bot;
2601
+ if (!voice) throw new AskdareError("invalid_input", {
2602
+ message: "This assistant does not accept voice input.",
2603
+ key: "error.voiceNotAccepted"
2604
+ });
2605
+ const { visitorId } = await (await config.tokens()).verifyAccess(bearerToken(request), bot.id);
2606
+ const reservation = await config.limits.beginTranscription(bot, {
2607
+ clientIp: config.clientIp(request),
2608
+ visitorId
2609
+ });
2610
+ let bytes;
2611
+ let audio;
2612
+ try {
2613
+ bytes = await readBytes(request, maxAudioBytes(voice.maxSeconds), {
2614
+ message: "This recording is too long.",
2615
+ key: "error.recordingTooLong"
2616
+ });
2617
+ audio = detectAudio(bytes);
2618
+ if (!audio) throw new AskdareError("invalid_input", {
2619
+ message: "This recording format is not supported.",
2620
+ key: "error.recordingFormat"
2621
+ });
2622
+ } catch (error) {
2623
+ await reservation.settle(0).catch((settleError) => {
2624
+ report(toAskdareError(settleError));
2625
+ });
2626
+ throw error;
2627
+ }
2628
+ const worstCase = worstCaseSeconds(bytes.byteLength, voice.maxSeconds);
2629
+ let billed = 0;
2630
+ try {
2631
+ const result = await config.gateway().transcribe({
2632
+ bytes,
2633
+ filename: `speech.${audio.extension}`,
2634
+ mime: audio.mime,
2635
+ model: voice.model,
2636
+ languages: languageHints(request.headers.get(LANGUAGES_HEADER)),
2637
+ signal: AbortSignal.timeout(TRANSCRIPTION_TIMEOUT_MS)
2638
+ });
2639
+ billed = result.seconds ?? worstCase;
2640
+ return jsonResponse({ text: result.text.trim() });
2641
+ } catch (error) {
2642
+ if (toAskdareError(error).code === "timeout") billed = worstCase;
2643
+ throw error;
2644
+ } finally {
2645
+ await reservation.settle(billed).catch((error) => report(toAskdareError(error)));
2646
+ }
2647
+ };
2648
+ /** Authenticates the visitor and proves they own the conversation behind the resume token. */
2649
+ const ownedConversation = async (request) => {
2650
+ assertSameOrigin(request);
2651
+ const body = await readJson(request, conversationBody);
2652
+ const bot = findBot(body.botId);
2653
+ const tokens = await config.tokens();
2654
+ const { visitorId, identity } = keyed(await tokens.verifyAccess(bearerToken(request), bot.id));
2655
+ const grant = await tokens.verifyResume(body.resumeToken, bot.id);
2656
+ if (!sameOwner(grant, visitorId, identity ? await keyOf(bot, identity) : void 0)) throw new AskdareError("not_found");
2657
+ await config.limits.checkConversationAccess(bot, visitorId);
2658
+ return {
2659
+ bot,
2660
+ conversationId: grant.conversationId
2661
+ };
2662
+ };
2663
+ const readHistory = async (request) => {
2664
+ const { conversationId } = await ownedConversation(request);
2665
+ return jsonResponse({ messages: await config.gateway().listMessages(conversationId, request.signal) });
2666
+ };
2667
+ const deleteConversation = async (request) => {
2668
+ const { bot, conversationId } = await ownedConversation(request);
2669
+ await config.gateway().deleteConversation(conversationId, { withFiles: bot.attachments !== void 0 });
2670
+ return new Response(null, {
2671
+ status: 204,
2672
+ headers: NO_STORE
2673
+ });
2674
+ };
2675
+ /**
2676
+ * `askdare doctor`: live checks of every bot with this server's key and config. Only for
2677
+ * callers that know CHAT_SECRET; one run at a time, since each makes a few OpenAI requests.
2678
+ */
2679
+ let doctorRunning = false;
2680
+ const runDoctor = async (request) => {
2681
+ await (await config.tokens()).verifyDoctor(bearerToken(request));
2682
+ await config.limits.checkDoctor();
2683
+ if (doctorRunning) throw new AskdareError("rate_limited", { retryAfterMs: 5e3 });
2684
+ doctorRunning = true;
2685
+ try {
2686
+ let gateway;
2687
+ try {
2688
+ gateway = config.gateway();
2689
+ } catch {}
2690
+ const bots = [];
2691
+ for (const bot of config.bots) {
2692
+ const checks = gateway ? await gateway.diagnose({
2693
+ model: bot.model,
2694
+ vectorStoreId: bot.knowledge?.vectorStoreId,
2695
+ transcriptionModel: bot.voice?.model,
2696
+ attachments: bot.attachments !== void 0
2697
+ }) : [{
2698
+ status: "fail",
2699
+ title: "OPENAI_API_KEY is not set where the app runs.",
2700
+ fix: "Add the key of the bot's OpenAI project to the app's environment."
2701
+ }];
2702
+ bots.push({
2703
+ id: bot.id,
2704
+ checks,
2705
+ turnTimeoutMs: bot.limits.turnTimeoutMs
2706
+ });
2707
+ }
2708
+ return jsonResponse({
2709
+ development: config.development === true,
2710
+ sharedLimits: config.sharedLimits === true,
2711
+ gallery: config.gallery === true,
2712
+ bots
2713
+ }, 200, NO_STORE);
2714
+ } finally {
2715
+ doctorRunning = false;
2716
+ }
2717
+ };
2718
+ const route = async (request) => {
2719
+ const { pathname } = new URL(request.url);
2720
+ if (!pathname.startsWith(`${config.basePath}/`)) throw new AskdareError("not_found");
2721
+ const path = pathname.slice(config.basePath.length);
2722
+ const method = request.method.toUpperCase();
2723
+ if (method === "GET") {
2724
+ const query = new URL(request.url).searchParams;
2725
+ if (path === "/widget.js") return serveLoader(query);
2726
+ const embed = /^\/embed\/([a-z0-9-]{1,48})$/.exec(path);
2727
+ if (embed?.[1]) return serveEmbed(embed[1], query, request);
2728
+ const theme = /^\/theme\/([a-z0-9-]{1,48})\.css$/.exec(path);
2729
+ if (theme?.[1]) return serveTheme(theme[1], query, request);
2730
+ const asset = /^\/assets\/([a-zA-Z0-9.-]{1,80})$/.exec(path);
2731
+ if (asset?.[1]) return serveAsset(asset[1]);
2732
+ } else if (method === "POST") {
2733
+ if (path === "/session") return createSession(request);
2734
+ if (path === "/messages") return sendMessage(request);
2735
+ if (path === "/history") return readHistory(request);
2736
+ if (path === "/attachments") return uploadAttachment(request);
2737
+ if (path === "/transcriptions") return transcribe(request);
2738
+ if (path === "/doctor") return runDoctor(request);
2739
+ } else if (method === "DELETE") {
2740
+ if (path === "/conversation") return deleteConversation(request);
2741
+ }
2742
+ throw new AskdareError("not_found");
2743
+ };
2744
+ return async (request) => {
2745
+ try {
2746
+ return await route(request);
2747
+ } catch (error) {
2748
+ const failure = toAskdareError(error);
2749
+ if (failure.status >= 500) report(failure);
2750
+ return errorResponse(failure, config.explain?.(failure));
2751
+ }
2752
+ };
2753
+ }
2754
+ // src/next/create-chat-handler.ts
2755
+ function required(value, name) {
2756
+ if (!value) throw new AskdareError("bot_unavailable", { cause: `${name} is not configured.` });
2757
+ return value;
2758
+ }
2759
+ /**
2760
+ * Creates the Next.js route handlers for askdare. Mount them in a catch-all route:
2761
+ *
2762
+ * ```ts
2763
+ * // app/api/chat/[...path]/route.ts
2764
+ * export const maxDuration = 300;
2765
+ * export const { GET, POST, DELETE } = createChatHandler({ bots });
2766
+ * ```
2767
+ *
2768
+ * Secrets are read on the first request, so importing the route (for example during
2769
+ * `next build`) never requires them.
2770
+ */
2771
+ function createChatHandler(options) {
2772
+ const basePath = options.basePath ?? "/api/chat";
2773
+ if (!/^(\/[a-zA-Z0-9._~-]+)+$/.test(basePath)) throw new TypeError(`[askdare] basePath must look like /api/chat, got "${basePath}".`);
2774
+ const ids = options.bots.map((bot) => bot.id);
2775
+ const duplicate = ids.find((id, index) => ids.indexOf(id) !== index);
2776
+ if (duplicate) throw new TypeError(`[askdare] Duplicate bot id "${duplicate}".`);
2777
+ if (ids.length === 0) throw new TypeError("[askdare] Define at least one bot.");
2778
+ let gateway;
2779
+ /** null: no IDENTITY_SECRET, so identity is off. */
2780
+ let identity;
2781
+ let tokens;
2782
+ const store = options.limits?.store ?? memoryStore();
2783
+ if (!store.shared && process.env["NODE_ENV"] === "production") console.warn("[askdare] Rate limits are kept in memory, per instance. With more than one instance, use a shared store such as @boldare/askdare-upstash.");
2784
+ const trustProxy = options.limits?.trustProxy ?? "auto";
2785
+ const development = process.env["NODE_ENV"] === "development";
2786
+ const report = (error) => {
2787
+ const explanation = explain(error);
2788
+ if (options.onError) {
2789
+ options.onError({
2790
+ code: error.code,
2791
+ message: explanation ?? error.message,
2792
+ cause: error.cause
2793
+ });
2794
+ return;
2795
+ }
2796
+ const line = `[askdare] ${error.code}: ${explanation ?? error.message} (see ${TROUBLESHOOTING})`;
2797
+ if (error.cause === void 0) console.error(line);
2798
+ else console.error(line, error.cause);
2799
+ };
2800
+ /** A setup mistake (a weak secret) is the operator's to fix, not an internal error. */
2801
+ const setupError = (error) => error instanceof TypeError ? new AskdareError("bot_unavailable", { cause: error }) : error;
2802
+ const handle = createRequestHandler({
2803
+ bots: options.bots,
2804
+ basePath,
2805
+ waitUntil: (work) => {
2806
+ try {
2807
+ after(work);
2808
+ } catch {}
2809
+ },
2810
+ assets: {
2811
+ loaderJs: LOADER_JS,
2812
+ widgetJs: WIDGET_JS,
2813
+ widgetCss: WIDGET_CSS,
2814
+ widgetJsFile: WIDGET_JS_FILE,
2815
+ widgetCssFile: WIDGET_CSS_FILE,
2816
+ fontsCss: FONTS_CSS,
2817
+ fontsCssFile: FONTS_CSS_FILE,
2818
+ fontFiles: FONT_FILES
2819
+ },
2820
+ gallery: options.gallery,
2821
+ development,
2822
+ onError: report,
2823
+ explain: development ? explain : void 0,
2824
+ sharedLimits: store.shared,
2825
+ gateway: () => gateway ??= createOpenAIGateway({ apiKey: required(options.openaiApiKey ?? process.env["OPENAI_API_KEY"], "OPENAI_API_KEY") }),
2826
+ tokens: () => {
2827
+ tokens ??= createTokenService({
2828
+ secret: required(options.secret ?? process.env["CHAT_SECRET"], "CHAT_SECRET"),
2829
+ previousSecrets: options.previousSecrets ?? (process.env["CHAT_SECRET_PREVIOUS"] ?? "").split(",").map((secret) => secret.trim()).filter(Boolean)
2830
+ }).catch((error) => {
2831
+ tokens = void 0;
2832
+ throw setupError(error);
2833
+ });
2834
+ return tokens;
2835
+ },
2836
+ identity: () => {
2837
+ if (identity === void 0) {
2838
+ const secret = options.identitySecret ?? process.env["IDENTITY_SECRET"];
2839
+ try {
2840
+ identity = secret ? createIdentityVerifier({
2841
+ secret,
2842
+ chatSecret: options.secret ?? process.env["CHAT_SECRET"]
2843
+ }) : null;
2844
+ } catch (error) {
2845
+ throw setupError(error);
2846
+ }
2847
+ }
2848
+ return identity ?? void 0;
2849
+ },
2850
+ limits: createLimits({
2851
+ store,
2852
+ globalDailyTokens: options.limits?.globalDailyTokens,
2853
+ disabled: () => process.env["ASKDARE_DISABLED"] === "true",
2854
+ onExhausted: (message) => report(new AskdareError("budget_exceeded", { message }))
2855
+ }),
2856
+ clientIp: (request) => getClientIp(request, trustProxy)
2857
+ });
2858
+ return {
2859
+ GET: handle,
2860
+ POST: handle,
2861
+ DELETE: handle
2862
+ };
2863
+ }
2864
+ export { createChatHandler };