@rubytech/taskmaster 1.0.36 → 1.0.39

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.
@@ -1,2856 +0,0 @@
1
- (function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const i of document.querySelectorAll('link[rel="modulepreload"]'))s(i);new MutationObserver(i=>{for(const o of i)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&s(r)}).observe(document,{childList:!0,subtree:!0});function n(i){const o={};return i.integrity&&(o.integrity=i.integrity),i.referrerPolicy&&(o.referrerPolicy=i.referrerPolicy),i.crossOrigin==="use-credentials"?o.credentials="include":i.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function s(i){if(i.ep)return;i.ep=!0;const o=n(i);fetch(i.href,o)}})();const Hc="modulepreload",qc=function(e,t){return new URL(e,t).href},Ho={},de=function(t,n,s){let i=Promise.resolve();if(n&&n.length>0){let c=function(u){return Promise.all(u.map(p=>Promise.resolve(p).then(m=>({status:"fulfilled",value:m}),m=>({status:"rejected",reason:m}))))};const r=document.getElementsByTagName("link"),l=document.querySelector("meta[property=csp-nonce]"),a=l?.nonce||l?.getAttribute("nonce");i=c(n.map(u=>{if(u=qc(u,s),u in Ho)return;Ho[u]=!0;const p=u.endsWith(".css"),m=p?'[rel="stylesheet"]':"";if(s)for(let w=r.length-1;w>=0;w--){const A=r[w];if(A.href===u&&(!p||A.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${u}"]${m}`))return;const v=document.createElement("link");if(v.rel=p?"stylesheet":Hc,p||(v.as="script"),v.crossOrigin="",v.href=u,a&&v.setAttribute("nonce",a),document.head.appendChild(v),p)return new Promise((w,A)=>{v.addEventListener("load",w),v.addEventListener("error",()=>A(new Error(`Unable to preload CSS for ${u}`)))})}))}function o(r){const l=new Event("vite:preloadError",{cancelable:!0});if(l.payload=r,window.dispatchEvent(l),!l.defaultPrevented)throw r}return i.then(r=>{for(const l of r||[])l.status==="rejected"&&o(l.reason);return t().catch(o)})};const Rn=globalThis,Ii=Rn.ShadowRoot&&(Rn.ShadyCSS===void 0||Rn.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,Ni=Symbol(),qo=new WeakMap;let Sa=class{constructor(t,n,s){if(this._$cssResult$=!0,s!==Ni)throw Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=t,this.t=n}get styleSheet(){let t=this.o;const n=this.t;if(Ii&&t===void 0){const s=n!==void 0&&n.length===1;s&&(t=qo.get(n)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),s&&qo.set(n,t))}return t}toString(){return this.cssText}};const Gc=e=>new Sa(typeof e=="string"?e:e+"",void 0,Ni),Vc=(e,...t)=>{const n=e.length===1?e[0]:t.reduce((s,i,o)=>s+(r=>{if(r._$cssResult$===!0)return r.cssText;if(typeof r=="number")return r;throw Error("Value passed to 'css' function must be a 'css' function result: "+r+". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.")})(i)+e[o+1],e[0]);return new Sa(n,e,Ni)},Yc=(e,t)=>{if(Ii)e.adoptedStyleSheets=t.map(n=>n instanceof CSSStyleSheet?n:n.styleSheet);else for(const n of t){const s=document.createElement("style"),i=Rn.litNonce;i!==void 0&&s.setAttribute("nonce",i),s.textContent=n.cssText,e.appendChild(s)}},Go=Ii?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let n="";for(const s of t.cssRules)n+=s.cssText;return Gc(n)})(e):e;const{is:Qc,defineProperty:Xc,getOwnPropertyDescriptor:Zc,getOwnPropertyNames:Jc,getOwnPropertySymbols:eu,getPrototypeOf:tu}=Object,ts=globalThis,Vo=ts.trustedTypes,nu=Vo?Vo.emptyScript:"",su=ts.reactiveElementPolyfillSupport,jt=(e,t)=>e,Fn={toAttribute(e,t){switch(t){case Boolean:e=e?nu:null;break;case Object:case Array:e=e==null?e:JSON.stringify(e)}return e},fromAttribute(e,t){let n=e;switch(t){case Boolean:n=e!==null;break;case Number:n=e===null?null:Number(e);break;case Object:case Array:try{n=JSON.parse(e)}catch{n=null}}return n}},Di=(e,t)=>!Qc(e,t),Yo={attribute:!0,type:String,converter:Fn,reflect:!1,useDefault:!1,hasChanged:Di};Symbol.metadata??=Symbol("metadata"),ts.litPropertyMetadata??=new WeakMap;let pt=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,n=Yo){if(n.state&&(n.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((n=Object.create(n)).wrapped=!0),this.elementProperties.set(t,n),!n.noAccessor){const s=Symbol(),i=this.getPropertyDescriptor(t,s,n);i!==void 0&&Xc(this.prototype,t,i)}}static getPropertyDescriptor(t,n,s){const{get:i,set:o}=Zc(this.prototype,t)??{get(){return this[n]},set(r){this[n]=r}};return{get:i,set(r){const l=i?.call(this);o?.call(this,r),this.requestUpdate(t,l,s)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??Yo}static _$Ei(){if(this.hasOwnProperty(jt("elementProperties")))return;const t=tu(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(jt("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(jt("properties"))){const n=this.properties,s=[...Jc(n),...eu(n)];for(const i of s)this.createProperty(i,n[i])}const t=this[Symbol.metadata];if(t!==null){const n=litPropertyMetadata.get(t);if(n!==void 0)for(const[s,i]of n)this.elementProperties.set(s,i)}this._$Eh=new Map;for(const[n,s]of this.elementProperties){const i=this._$Eu(n,s);i!==void 0&&this._$Eh.set(i,n)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const n=[];if(Array.isArray(t)){const s=new Set(t.flat(1/0).reverse());for(const i of s)n.unshift(Go(i))}else t!==void 0&&n.push(Go(t));return n}static _$Eu(t,n){const s=n.attribute;return s===!1?void 0:typeof s=="string"?s:typeof t=="string"?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),this.renderRoot!==void 0&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,n=this.constructor.elementProperties;for(const s of n.keys())this.hasOwnProperty(s)&&(t.set(s,this[s]),delete this[s]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Yc(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,n,s){this._$AK(t,s)}_$ET(t,n){const s=this.constructor.elementProperties.get(t),i=this.constructor._$Eu(t,s);if(i!==void 0&&s.reflect===!0){const o=(s.converter?.toAttribute!==void 0?s.converter:Fn).toAttribute(n,s.type);this._$Em=t,o==null?this.removeAttribute(i):this.setAttribute(i,o),this._$Em=null}}_$AK(t,n){const s=this.constructor,i=s._$Eh.get(t);if(i!==void 0&&this._$Em!==i){const o=s.getPropertyOptions(i),r=typeof o.converter=="function"?{fromAttribute:o.converter}:o.converter?.fromAttribute!==void 0?o.converter:Fn;this._$Em=i;const l=r.fromAttribute(n,o.type);this[i]=l??this._$Ej?.get(i)??l,this._$Em=null}}requestUpdate(t,n,s,i=!1,o){if(t!==void 0){const r=this.constructor;if(i===!1&&(o=this[t]),s??=r.getPropertyOptions(t),!((s.hasChanged??Di)(o,n)||s.useDefault&&s.reflect&&o===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,s))))return;this.C(t,n,s)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,n,{useDefault:s,reflect:i,wrapped:o},r){s&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??n??this[t]),o!==!0||r!==void 0)||(this._$AL.has(t)||(this.hasUpdated||s||(n=void 0),this._$AL.set(t,n)),i===!0&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(n){Promise.reject(n)}const t=this.scheduleUpdate();return t!=null&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[i,o]of this._$Ep)this[i]=o;this._$Ep=void 0}const s=this.constructor.elementProperties;if(s.size>0)for(const[i,o]of s){const{wrapped:r}=o,l=this[i];r!==!0||this._$AL.has(i)||l===void 0||this.C(i,void 0,o,l)}}let t=!1;const n=this._$AL;try{t=this.shouldUpdate(n),t?(this.willUpdate(n),this._$EO?.forEach(s=>s.hostUpdate?.()),this.update(n)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(n)}willUpdate(t){}_$AE(t){this._$EO?.forEach(n=>n.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(n=>this._$ET(n,this[n])),this._$EM()}updated(t){}firstUpdated(t){}};pt.elementStyles=[],pt.shadowRootOptions={mode:"open"},pt[jt("elementProperties")]=new Map,pt[jt("finalized")]=new Map,su?.({ReactiveElement:pt}),(ts.reactiveElementVersions??=[]).push("2.1.2");const Oi=globalThis,Qo=e=>e,Un=Oi.trustedTypes,Xo=Un?Un.createPolicy("lit-html",{createHTML:e=>e}):void 0,xa="$lit$",Re=`lit$${Math.random().toFixed(9).slice(2)}$`,Aa="?"+Re,iu=`<${Aa}>`,Ve=document,Qt=()=>Ve.createComment(""),Xt=e=>e===null||typeof e!="object"&&typeof e!="function",Bi=Array.isArray,ou=e=>Bi(e)||typeof e?.[Symbol.iterator]=="function",_s=`[
2
- \f\r]`,Mt=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,Zo=/-->/g,Jo=/>/g,ze=RegExp(`>|${_s}(?:([^\\s"'>=/]+)(${_s}*=${_s}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),er=/'/g,tr=/"/g,$a=/^(?:script|style|textarea|title)$/i,ru=e=>(t,...n)=>({_$litType$:e,strings:t,values:n}),d=ru(1),Ne=Symbol.for("lit-noChange"),b=Symbol.for("lit-nothing"),nr=new WeakMap,qe=Ve.createTreeWalker(Ve,129);function Ea(e,t){if(!Bi(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return Xo!==void 0?Xo.createHTML(t):t}const au=(e,t)=>{const n=e.length-1,s=[];let i,o=t===2?"<svg>":t===3?"<math>":"",r=Mt;for(let l=0;l<n;l++){const a=e[l];let c,u,p=-1,m=0;for(;m<a.length&&(r.lastIndex=m,u=r.exec(a),u!==null);)m=r.lastIndex,r===Mt?u[1]==="!--"?r=Zo:u[1]!==void 0?r=Jo:u[2]!==void 0?($a.test(u[2])&&(i=RegExp("</"+u[2],"g")),r=ze):u[3]!==void 0&&(r=ze):r===ze?u[0]===">"?(r=i??Mt,p=-1):u[1]===void 0?p=-2:(p=r.lastIndex-u[2].length,c=u[1],r=u[3]===void 0?ze:u[3]==='"'?tr:er):r===tr||r===er?r=ze:r===Zo||r===Jo?r=Mt:(r=ze,i=void 0);const v=r===ze&&e[l+1].startsWith("/>")?" ":"";o+=r===Mt?a+iu:p>=0?(s.push(c),a.slice(0,p)+xa+a.slice(p)+Re+v):a+Re+(p===-2?l:v)}return[Ea(e,o+(e[n]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]};let ri=class Ta{constructor({strings:t,_$litType$:n},s){let i;this.parts=[];let o=0,r=0;const l=t.length-1,a=this.parts,[c,u]=au(t,n);if(this.el=Ta.createElement(c,s),qe.currentNode=this.el.content,n===2||n===3){const p=this.el.content.firstChild;p.replaceWith(...p.childNodes)}for(;(i=qe.nextNode())!==null&&a.length<l;){if(i.nodeType===1){if(i.hasAttributes())for(const p of i.getAttributeNames())if(p.endsWith(xa)){const m=u[r++],v=i.getAttribute(p).split(Re),w=/([.?@])?(.*)/.exec(m);a.push({type:1,index:o,name:w[2],strings:v,ctor:w[1]==="."?cu:w[1]==="?"?uu:w[1]==="@"?du:ss}),i.removeAttribute(p)}else p.startsWith(Re)&&(a.push({type:6,index:o}),i.removeAttribute(p));if($a.test(i.tagName)){const p=i.textContent.split(Re),m=p.length-1;if(m>0){i.textContent=Un?Un.emptyScript:"";for(let v=0;v<m;v++)i.append(p[v],Qt()),qe.nextNode(),a.push({type:2,index:++o});i.append(p[m],Qt())}}}else if(i.nodeType===8)if(i.data===Aa)a.push({type:2,index:o});else{let p=-1;for(;(p=i.data.indexOf(Re,p+1))!==-1;)a.push({type:7,index:o}),p+=Re.length-1}o++}}static createElement(t,n){const s=Ve.createElement("template");return s.innerHTML=t,s}};function vt(e,t,n=e,s){if(t===Ne)return t;let i=s!==void 0?n._$Co?.[s]:n._$Cl;const o=Xt(t)?void 0:t._$litDirective$;return i?.constructor!==o&&(i?._$AO?.(!1),o===void 0?i=void 0:(i=new o(e),i._$AT(e,n,s)),s!==void 0?(n._$Co??=[])[s]=i:n._$Cl=i),i!==void 0&&(t=vt(e,i._$AS(e,t.values),i,s)),t}class lu{constructor(t,n){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=n}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:n},parts:s}=this._$AD,i=(t?.creationScope??Ve).importNode(n,!0);qe.currentNode=i;let o=qe.nextNode(),r=0,l=0,a=s[0];for(;a!==void 0;){if(r===a.index){let c;a.type===2?c=new ns(o,o.nextSibling,this,t):a.type===1?c=new a.ctor(o,a.name,a.strings,this,t):a.type===6&&(c=new pu(o,this,t)),this._$AV.push(c),a=s[++l]}r!==a?.index&&(o=qe.nextNode(),r++)}return qe.currentNode=Ve,i}p(t){let n=0;for(const s of this._$AV)s!==void 0&&(s.strings!==void 0?(s._$AI(t,s,n),n+=s.strings.length-2):s._$AI(t[n])),n++}}let ns=class Ca{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,n,s,i){this.type=2,this._$AH=b,this._$AN=void 0,this._$AA=t,this._$AB=n,this._$AM=s,this.options=i,this._$Cv=i?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const n=this._$AM;return n!==void 0&&t?.nodeType===11&&(t=n.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,n=this){t=vt(this,t,n),Xt(t)?t===b||t==null||t===""?(this._$AH!==b&&this._$AR(),this._$AH=b):t!==this._$AH&&t!==Ne&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):ou(t)?this.k(t):this._(t)}O(t){return this._$AA.parentNode.insertBefore(t,this._$AB)}T(t){this._$AH!==t&&(this._$AR(),this._$AH=this.O(t))}_(t){this._$AH!==b&&Xt(this._$AH)?this._$AA.nextSibling.data=t:this.T(Ve.createTextNode(t)),this._$AH=t}$(t){const{values:n,_$litType$:s}=t,i=typeof s=="number"?this._$AC(t):(s.el===void 0&&(s.el=ri.createElement(Ea(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===i)this._$AH.p(n);else{const o=new lu(i,this),r=o.u(this.options);o.p(n),this.T(r),this._$AH=o}}_$AC(t){let n=nr.get(t.strings);return n===void 0&&nr.set(t.strings,n=new ri(t)),n}k(t){Bi(this._$AH)||(this._$AH=[],this._$AR());const n=this._$AH;let s,i=0;for(const o of t)i===n.length?n.push(s=new Ca(this.O(Qt()),this.O(Qt()),this,this.options)):s=n[i],s._$AI(o),i++;i<n.length&&(this._$AR(s&&s._$AB.nextSibling,i),n.length=i)}_$AR(t=this._$AA.nextSibling,n){for(this._$AP?.(!1,!0,n);t!==this._$AB;){const s=Qo(t).nextSibling;Qo(t).remove(),t=s}}setConnected(t){this._$AM===void 0&&(this._$Cv=t,this._$AP?.(t))}};class ss{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,n,s,i,o){this.type=1,this._$AH=b,this._$AN=void 0,this.element=t,this.name=n,this._$AM=i,this.options=o,s.length>2||s[0]!==""||s[1]!==""?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=b}_$AI(t,n=this,s,i){const o=this.strings;let r=!1;if(o===void 0)t=vt(this,t,n,0),r=!Xt(t)||t!==this._$AH&&t!==Ne,r&&(this._$AH=t);else{const l=t;let a,c;for(t=o[0],a=0;a<o.length-1;a++)c=vt(this,l[s+a],n,a),c===Ne&&(c=this._$AH[a]),r||=!Xt(c)||c!==this._$AH[a],c===b?t=b:t!==b&&(t+=(c??"")+o[a+1]),this._$AH[a]=c}r&&!i&&this.j(t)}j(t){t===b?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}}let cu=class extends ss{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===b?void 0:t}},uu=class extends ss{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==b)}},du=class extends ss{constructor(t,n,s,i,o){super(t,n,s,i,o),this.type=5}_$AI(t,n=this){if((t=vt(this,t,n,0)??b)===Ne)return;const s=this._$AH,i=t===b&&s!==b||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,o=t!==b&&(s===b||i);i&&this.element.removeEventListener(this.name,this,s),o&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){typeof this._$AH=="function"?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}},pu=class{constructor(t,n,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=n,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){vt(this,t)}};const hu={I:ns},fu=Oi.litHtmlPolyfillSupport;fu?.(ri,ns),(Oi.litHtmlVersions??=[]).push("3.3.2");const gu=(e,t,n)=>{const s=n?.renderBefore??t;let i=s._$litPart$;if(i===void 0){const o=n?.renderBefore??null;s._$litPart$=i=new ns(t.insertBefore(Qt(),o),o,void 0,n??{})}return i._$AI(e),i};const Fi=globalThis;let mt=class extends pt{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const n=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=gu(n,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return Ne}};mt._$litElement$=!0,mt.finalized=!0,Fi.litElementHydrateSupport?.({LitElement:mt});const mu=Fi.litElementPolyfillSupport;mu?.({LitElement:mt});(Fi.litElementVersions??=[]).push("4.2.2");const _a=e=>(t,n)=>{n!==void 0?n.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const yu={attribute:!0,type:String,converter:Fn,reflect:!1,hasChanged:Di},vu=(e=yu,t,n)=>{const{kind:s,metadata:i}=n;let o=globalThis.litPropertyMetadata.get(i);if(o===void 0&&globalThis.litPropertyMetadata.set(i,o=new Map),s==="setter"&&((e=Object.create(e)).wrapped=!0),o.set(n.name,e),s==="accessor"){const{name:r}=n;return{set(l){const a=t.get.call(this);t.set.call(this,l),this.requestUpdate(r,a,e,!0,l)},init(l){return l!==void 0&&this.C(r,void 0,e,l),l}}}if(s==="setter"){const{name:r}=n;return function(l){const a=this[r];t.call(this,l),this.requestUpdate(r,a,e,!0,l)}}throw Error("Unsupported decorator location: "+s)};function is(e){return(t,n)=>typeof n=="object"?vu(e,t,n):((s,i,o)=>{const r=i.hasOwnProperty(o);return i.constructor.createProperty(o,s),r?Object.getOwnPropertyDescriptor(i,o):void 0})(e,t,n)}function g(e){return is({...e,state:!0,attribute:!1})}const bu=50,wu=200,ku="Assistant";function sr(e,t){if(typeof e!="string")return;const n=e.trim();if(n)return n.length<=t?n:n.slice(0,t)}function ai(e){const t=sr(e?.name,bu)??ku,n=sr(e?.avatar??void 0,wu)??null;return{agentId:typeof e?.agentId=="string"&&e.agentId.trim()?e.agentId.trim():null,name:t,avatar:n}}function Su(){return ai(typeof window>"u"?{}:{name:window.__TASKMASTER_ASSISTANT_NAME__,avatar:window.__TASKMASTER_ASSISTANT_AVATAR__})}const Wn="taskmaster.control.settings.v1",Ma="taskmaster.account.settings.";function Ht(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}`}const dt={gatewayUrl:Ht(),token:"",theme:"system",navCollapsed:!1,navGroupsCollapsed:{}},Pe={sessionKey:"main",lastActiveSessionKey:"main",chatFocusMode:!1,chatShowThinking:!1,splitRatio:.6};function xu(){try{const e=localStorage.getItem(Wn);if(!e)return{...dt,gatewayUrl:Ht()};const t=JSON.parse(e);return{gatewayUrl:typeof t.gatewayUrl=="string"&&t.gatewayUrl.trim()?t.gatewayUrl.trim():Ht(),token:typeof t.token=="string"?t.token:dt.token,theme:t.theme==="light"||t.theme==="dark"||t.theme==="system"?t.theme:dt.theme,navCollapsed:typeof t.navCollapsed=="boolean"?t.navCollapsed:dt.navCollapsed,navGroupsCollapsed:typeof t.navGroupsCollapsed=="object"&&t.navGroupsCollapsed!==null?t.navGroupsCollapsed:dt.navGroupsCollapsed}}catch{return{...dt,gatewayUrl:Ht()}}}function Au(e){if(!e)return{...Pe};try{const t=localStorage.getItem(Ma+e);if(!t)return{...Pe};const n=JSON.parse(t);return{sessionKey:typeof n.sessionKey=="string"&&n.sessionKey.trim()?n.sessionKey.trim():Pe.sessionKey,lastActiveSessionKey:typeof n.lastActiveSessionKey=="string"&&n.lastActiveSessionKey.trim()?n.lastActiveSessionKey.trim():typeof n.sessionKey=="string"&&n.sessionKey.trim()||Pe.lastActiveSessionKey,chatFocusMode:typeof n.chatFocusMode=="boolean"?n.chatFocusMode:Pe.chatFocusMode,chatShowThinking:typeof n.chatShowThinking=="boolean"?n.chatShowThinking:Pe.chatShowThinking,splitRatio:typeof n.splitRatio=="number"&&n.splitRatio>=.4&&n.splitRatio<=.7?n.splitRatio:Pe.splitRatio}}catch{return{...Pe}}}let Kn=null;function ir(e){Kn=e}function Ms(){return{...xu(),...Au(Kn)}}function $u(e){const t={gatewayUrl:e.gatewayUrl,token:e.token,theme:e.theme,navCollapsed:e.navCollapsed,navGroupsCollapsed:e.navGroupsCollapsed};if(localStorage.setItem(Wn,JSON.stringify(t)),Kn){const n={sessionKey:e.sessionKey,lastActiveSessionKey:e.lastActiveSessionKey,chatFocusMode:e.chatFocusMode,chatShowThinking:e.chatShowThinking,splitRatio:e.splitRatio};localStorage.setItem(Ma+Kn,JSON.stringify(n))}}(function(){try{const t=localStorage.getItem(Wn);if(!t)return;const n=JSON.parse(t);if(!("sessionKey"in n))return;const s={gatewayUrl:typeof n.gatewayUrl=="string"?n.gatewayUrl:Ht(),token:typeof n.token=="string"?n.token:"",theme:n.theme==="light"||n.theme==="dark"||n.theme==="system"?n.theme:"system",navCollapsed:typeof n.navCollapsed=="boolean"?n.navCollapsed:!1,navGroupsCollapsed:typeof n.navGroupsCollapsed=="object"&&n.navGroupsCollapsed!==null?n.navGroupsCollapsed:{}};localStorage.setItem(Wn,JSON.stringify(s))}catch{}})();function La(e){const t=(e??"").trim();if(!t)return null;const n=t.split(":").filter(Boolean);if(n.length<3||n[0]!=="agent")return null;const s=n[1]?.trim(),i=n.slice(2).join(":");return!s||!i?null:{agentId:s,rest:i}}const Eu=/<\s*\/?\s*(?:think(?:ing)?|thought|antthinking|final)\b/i,bn=/<\s*\/?\s*final\b[^>]*>/gi,or=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\b[^>]*>/gi;function Tu(e,t){return e.trimStart()}function Cu(e,t){if(!e||!Eu.test(e))return e;let n=e;bn.test(n)?(bn.lastIndex=0,n=n.replace(bn,"")):bn.lastIndex=0,or.lastIndex=0;let s="",i=0,o=!1;for(const r of n.matchAll(or)){const l=r.index??0,a=r[1]==="/";o?a&&(o=!1):(s+=n.slice(i,l),a||(o=!0)),i=l+r[0].length}return s+=n.slice(i),Tu(s)}function Pa(e){return!e&&e!==0?"n/a":new Date(e).toLocaleString()}function os(e){if(!e&&e!==0)return"n/a";const t=Date.now()-e;if(t<0)return"just now";const n=Math.round(t/1e3);if(n<60)return`${n}s ago`;const s=Math.round(n/60);if(s<60)return`${s}m ago`;const i=Math.round(s/60);return i<48?`${i}h ago`:`${Math.round(i/24)}d ago`}function Ra(e){if(!e&&e!==0)return"n/a";if(e<1e3)return`${e}ms`;const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.round(t/60);if(n<60)return`${n}m`;const s=Math.round(n/60);return s<48?`${s}h`:`${Math.round(s/24)}d`}function _u(e,t=120){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}…`}function Ia(e,t){return e.length<=t?{text:e,truncated:!1,total:e.length}:{text:e.slice(0,Math.max(0,t)),truncated:!0,total:e.length}}function zn(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function Ls(e){return Cu(e)}const Mu=/^\[([^\]]+)\]\s*/,Lu=["WebChat","WhatsApp","Telegram","Signal","Slack","Discord","iMessage","Teams","Matrix","Zalo","Zalo Personal","BlueBubbles"],Ps=new WeakMap,Rs=new WeakMap;function Pu(e){return/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z\b/.test(e)||/\d{4}-\d{2}-\d{2} \d{2}:\d{2}\b/.test(e)?!0:Lu.some(t=>e.startsWith(`${t} `))}function Is(e){const t=e.match(Mu);if(!t)return e;const n=t[1]??"";return Pu(n)?e.slice(t[0].length):e}function jn(e){const t=e,n=typeof t.role=="string"?t.role:"",s=t.content;if(typeof s=="string")return n==="assistant"?Ls(s):Is(s);if(Array.isArray(s)){const i=s.map(o=>{const r=o;return r.type==="text"&&typeof r.text=="string"?r.text:null}).filter(o=>typeof o=="string");if(i.length>0){const o=i.join(`
4
- `);return n==="assistant"?Ls(o):Is(o)}}return typeof t.text=="string"?n==="assistant"?Ls(t.text):Is(t.text):null}function Na(e){if(!e||typeof e!="object")return jn(e);const t=e;if(Ps.has(t))return Ps.get(t)??null;const n=jn(e);return Ps.set(t,n),n}function rr(e){const n=e.content,s=[];if(Array.isArray(n))for(const l of n){const a=l;if(a.type==="thinking"&&typeof a.thinking=="string"){const c=a.thinking.trim();c&&s.push(c)}}if(s.length>0)return s.join(`
5
- `);const i=Iu(e);if(!i)return null;const r=[...i.matchAll(/<\s*think(?:ing)?\s*>([\s\S]*?)<\s*\/\s*think(?:ing)?\s*>/gi)].map(l=>(l[1]??"").trim()).filter(Boolean);return r.length>0?r.join(`
6
- `):null}function Ru(e){if(!e||typeof e!="object")return rr(e);const t=e;if(Rs.has(t))return Rs.get(t)??null;const n=rr(e);return Rs.set(t,n),n}function Iu(e){const t=e,n=t.content;if(typeof n=="string")return n;if(Array.isArray(n)){const s=n.map(i=>{const o=i;return o.type==="text"&&typeof o.text=="string"?o.text:null}).filter(i=>typeof i=="string");if(s.length>0)return s.join(`
7
- `)}return typeof t.text=="string"?t.text:null}function Nu(e){const t=e.trim();if(!t)return"";const n=t.split(/\r?\n/).map(s=>s.trim()).filter(Boolean).map(s=>`_${s}_`);return n.length?["_Reasoning:_",...n].join(`
8
- `):""}const Du=/Read HEARTBEAT\.md if it exists|reply HEARTBEAT_OK/i,Ou=/^[\s*`_]*HEARTBEAT_OK[\s*`_]*$/i,Bu=/^[\s*`_]*NO_REPLY[\s*`_]*$/i,Fu=/^A new session was started via \/new or \/reset\./;function Uu(e){const t=e,n=typeof t.role=="string"?t.role:"";let s="";typeof t.content=="string"?s=t.content:Array.isArray(t.content)?s=t.content.filter(o=>typeof o=="object"&&o!==null).map(o=>o.text??"").join(" "):typeof t.text=="string"&&(s=t.text);const i=s.trim();return i?!!(n==="user"&&Du.test(i)||n==="assistant"&&Ou.test(i)||n==="user"&&Fu.test(i)||n==="assistant"&&Bu.test(i)):!1}function Wu(e){return e.filter(t=>!Uu(t))}function Da(e){const t=e;let n=typeof t.role=="string"?t.role:"unknown";const s=typeof t.toolCallId=="string"||typeof t.tool_call_id=="string",i=t.content,o=Array.isArray(i)?i:null,r=Array.isArray(o)&&o.some(p=>{const v=String(p.type??"").toLowerCase();return v==="toolresult"||v==="tool_result"}),l=typeof t.toolName=="string"||typeof t.tool_name=="string";(s||r||l)&&(n="toolResult");let a=[];typeof t.content=="string"?a=[{type:"text",text:t.content}]:Array.isArray(t.content)?a=t.content.map(p=>({type:p.type||"text",text:p.text,name:p.name,args:p.args||p.arguments})):typeof t.text=="string"&&(a=[{type:"text",text:t.text}]);const c=typeof t.timestamp=="number"?t.timestamp:Date.now(),u=typeof t.id=="string"?t.id:void 0;return{role:n,content:a,timestamp:c,id:u}}function Oa(e){const t=e.toLowerCase();return e==="user"||e==="User"?e:e==="assistant"?"assistant":e==="system"?"system":t==="toolresult"||t==="tool_result"||t==="tool"||t==="function"?"tool":e}function Ba(e){const t=e,n=typeof t.role=="string"?t.role.toLowerCase():"";return n==="toolresult"||n==="tool_result"}function ar(e){e[6]=e[6]&15|64,e[8]=e[8]&63|128;let t="";for(let n=0;n<e.length;n++)t+=e[n].toString(16).padStart(2,"0");return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20)}`}function Ku(){const e=new Uint8Array(16),t=Date.now();for(let n=0;n<e.length;n++)e[n]=Math.floor(Math.random()*256);return e[0]^=t&255,e[1]^=t>>>8&255,e[2]^=t>>>16&255,e[3]^=t>>>24&255,e}function Ui(e=globalThis.crypto){if(e&&typeof e.randomUUID=="function")return e.randomUUID();if(e&&typeof e.getRandomValues=="function"){const t=new Uint8Array(16);return e.getRandomValues(t),ar(t)}return ar(Ku())}async function Ce(e){if(!(!e.client||!e.connected)){e.chatLoading=!0,e.lastError=null;try{const t=await e.client.request("chat.history",{sessionKey:e.sessionKey,limit:200}),n=Array.isArray(t.messages)?t.messages:[];e.chatMessages=Wu(n),e.chatThinkingLevel=t.thinkingLevel??null,e.chatModelProvider=typeof t.modelProvider=="string"?t.modelProvider:null,e.chatModel=typeof t.model=="string"?t.model:null,e.chatVerboseLevel=typeof t.verboseLevel=="string"?t.verboseLevel:null,e.chatFillerEnabled=typeof t.fillerEnabled=="boolean"?t.fillerEnabled:null}catch(t){e.lastError=String(t)}finally{e.chatLoading=!1}}}function zu(e){const t=/^data:([^;]+);base64,(.+)$/.exec(e);return t?{mimeType:t[1],content:t[2]}:null}async function Fa(e,t,n){if(!e.client||!e.connected)return!1;const s=t.trim(),i=n&&n.length>0;if(!s&&!i)return!1;const o=Date.now(),r=(n??[]).filter(v=>!v.fileName),l=(n??[]).filter(v=>v.fileName),a=[],c=l.map(v=>v.fileName).filter(Boolean);if(c.length>0){const v=s?`${c.join(", ")}
9
-
10
- ${s}`:c.join(", ");a.push({type:"text",text:v})}else s&&a.push({type:"text",text:s});for(const v of r)a.push({type:"image",source:{type:"base64",media_type:v.mimeType,data:v.dataUrl}});e.chatMessages=[...e.chatMessages,{role:"user",content:a,timestamp:o}],e.chatSending=!0,e.lastError=null;const u=Ui();e.chatRunId=u,e.chatStream="",e.chatStreamStartedAt=o;const p=[...r,...l],m=p.length>0?p.map(v=>{if(v.textContent)return{type:"document",mimeType:v.mimeType||"text/plain",fileName:v.fileName,content:btoa(unescape(encodeURIComponent(v.textContent)))};const w=zu(v.dataUrl);return w?{type:v.fileName?"document":"image",mimeType:w.mimeType,fileName:v.fileName,content:w.content}:null}).filter(v=>v!==null):void 0;try{return await e.client.request("chat.send",{sessionKey:e.sessionKey,message:s,deliver:!1,idempotencyKey:u,attachments:m}),!0}catch(v){const w=String(v);return e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,e.lastError=w,e.chatMessages=[...e.chatMessages,{role:"assistant",content:[{type:"text",text:"Error: "+w}],timestamp:Date.now()}],!1}finally{e.chatSending=!1}}async function Ua(e){if(!e.client||!e.connected)return!1;const t=e.chatRunId;try{return await e.client.request("chat.abort",t?{sessionKey:e.sessionKey,runId:t}:{sessionKey:e.sessionKey}),!0}catch(n){return e.lastError=String(n),!1}}function Wa(e,t){if(!t||t.sessionKey!==e.sessionKey)return null;if(t.runId&&e.chatRunId&&t.runId!==e.chatRunId)return t.state==="final"?"final":null;if(t.state==="block"){const n=jn(t.message);return typeof n=="string"&&n.trim()&&(e.chatMessages=[...e.chatMessages,{role:"assistant",content:[{type:"text",text:n.trim()}],timestamp:Date.now(),filler:!0}]),"block"}else if(t.state==="delta"){const n=jn(t.message);if(typeof n=="string"){if(n.trim()==="NO_REPLY")return null;const s=e.chatStream??"";(!s||n.length>=s.length)&&(e.chatStream=n)}}else t.state==="final"||t.state==="aborted"?(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null):t.state==="error"&&(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null,e.lastError=t.errorMessage??"chat error");return t.state}const ju=Object.freeze(Object.defineProperty({__proto__:null,abortChatRun:Ua,handleChatEvent:Wa,loadChatHistory:Ce,sendChatMessage:Fa},Symbol.toStringTag,{value:"Module"}));async function Wi(e){if(!(!e.client||!e.connected)&&!e.sessionsLoading){e.sessionsLoading=!0,e.sessionsError=null;try{const t={includeGlobal:e.sessionsIncludeGlobal??!0,includeUnknown:e.sessionsIncludeUnknown??!1},n=zn(e.sessionsFilterActive??"",0),s=zn(e.sessionsFilterLimit??"",0);n>0&&(t.activeMinutes=n),s>0&&(t.limit=s);const i=await e.client.request("sessions.list",t);i&&(e.sessionsResult=i)}catch(t){e.sessionsError=String(t)}finally{e.sessionsLoading=!1}}}async function wn(e,t,n){if(!e.client||!e.connected)return;const s={key:t};"label"in n&&(s.label=n.label),"thinkingLevel"in n&&(s.thinkingLevel=n.thinkingLevel),"verboseLevel"in n&&(s.verboseLevel=n.verboseLevel),"reasoningLevel"in n&&(s.reasoningLevel=n.reasoningLevel),"model"in n&&(s.model=n.model),"fillerEnabled"in n&&(s.fillerEnabled=n.fillerEnabled);try{await e.client.request("sessions.patch",s),await Wi(e)}catch(i){e.sessionsError=String(i)}}const lr=50,Hu=80,qu=12e4;function Gu(e){if(!e||typeof e!="object")return null;const t=e;if(typeof t.text=="string")return t.text;const n=t.content;if(!Array.isArray(n))return null;const s=n.map(i=>{if(!i||typeof i!="object")return null;const o=i;return o.type==="text"&&typeof o.text=="string"?o.text:null}).filter(i=>!!i);return s.length===0?null:s.join(`
11
- `)}function cr(e){if(e==null)return null;if(typeof e=="number"||typeof e=="boolean")return String(e);const t=Gu(e);let n;if(typeof e=="string")n=e;else if(t)n=t;else try{n=JSON.stringify(e,null,2)}catch{n=String(e)}const s=Ia(n,qu);return s.truncated?`${s.text}
12
-
13
- … truncated (${s.total} chars, showing first ${s.text.length}).`:s.text}function Vu(e){const t=[];return t.push({type:"toolcall",name:e.name,arguments:e.args??{}}),e.output&&t.push({type:"toolresult",name:e.name,text:e.output}),{role:"assistant",toolCallId:e.toolCallId,runId:e.runId,content:t,timestamp:e.startedAt}}function Yu(e){if(e.toolStreamOrder.length<=lr)return;const t=e.toolStreamOrder.length-lr,n=e.toolStreamOrder.splice(0,t);for(const s of n)e.toolStreamById.delete(s)}function Qu(e){e.chatToolMessages=e.toolStreamOrder.map(t=>e.toolStreamById.get(t)?.message).filter(t=>!!t)}function li(e){e.toolStreamSyncTimer!=null&&(clearTimeout(e.toolStreamSyncTimer),e.toolStreamSyncTimer=null),Qu(e)}function Xu(e,t=!1){if(t){li(e);return}e.toolStreamSyncTimer==null&&(e.toolStreamSyncTimer=window.setTimeout(()=>li(e),Hu))}function Ki(e){e.toolStreamById.clear(),e.toolStreamOrder=[],e.chatToolMessages=[],li(e)}const Zu=5e3;function Ju(e,t){const n=t.data??{},s=typeof n.phase=="string"?n.phase:"";e.compactionClearTimer!=null&&(window.clearTimeout(e.compactionClearTimer),e.compactionClearTimer=null),s==="start"?e.compactionStatus={active:!0,startedAt:Date.now(),completedAt:null}:s==="end"&&(e.compactionStatus={active:!1,startedAt:e.compactionStatus?.startedAt??null,completedAt:Date.now()},e.compactionClearTimer=window.setTimeout(()=>{e.compactionStatus=null,e.compactionClearTimer=null},Zu))}function ed(e,t){if(!t)return;if(t.stream==="compaction"){Ju(e,t);return}if(t.stream!=="tool")return;const n=typeof t.sessionKey=="string"?t.sessionKey:void 0;if(n&&n!==e.sessionKey||!n&&e.chatRunId&&t.runId!==e.chatRunId||e.chatRunId&&t.runId!==e.chatRunId||!e.chatRunId)return;const s=t.data??{},i=typeof s.toolCallId=="string"?s.toolCallId:"";if(!i)return;const o=typeof s.name=="string"?s.name:"tool",r=typeof s.phase=="string"?s.phase:"",l=r==="start"?s.args:void 0,a=r==="update"?cr(s.partialResult):r==="result"?cr(s.result):void 0,c=Date.now();let u=e.toolStreamById.get(i);u?(u.name=o,l!==void 0&&(u.args=l),a!==void 0&&(u.output=a),u.updatedAt=c):(u={toolCallId:i,runId:t.runId,sessionKey:n,name:o,args:l,output:a,startedAt:typeof t.ts=="number"?t.ts:c,updatedAt:c,message:{}},e.toolStreamById.set(i,u),e.toolStreamOrder.push(i)),u.message=Vu(u),Yu(e),Xu(e,r==="result")}function en(e,t=!1){e.chatScrollFrame&&cancelAnimationFrame(e.chatScrollFrame),e.chatScrollTimeout!=null&&(clearTimeout(e.chatScrollTimeout),e.chatScrollTimeout=null);const n=()=>{const s=e.querySelector(".chat-thread");if(s){const i=getComputedStyle(s).overflowY;if(i==="auto"||i==="scroll"||s.scrollHeight-s.clientHeight>1)return s}return document.scrollingElement??document.documentElement};e.updateComplete.then(()=>{e.chatScrollFrame=requestAnimationFrame(()=>{e.chatScrollFrame=null;const s=n();if(!s)return;const i=s.scrollHeight-s.scrollTop-s.clientHeight;if(!(t||e.chatUserNearBottom||i<200))return;t&&(e.chatHasAutoScrolled=!0),s.scrollTop=s.scrollHeight,e.chatUserNearBottom=!0;const r=t?150:120;e.chatScrollTimeout=window.setTimeout(()=>{e.chatScrollTimeout=null;const l=n();if(!l)return;const a=l.scrollHeight-l.scrollTop-l.clientHeight;(t||e.chatUserNearBottom||a<200)&&(l.scrollTop=l.scrollHeight,e.chatUserNearBottom=!0)},r)})})}function Ka(e,t=!1){e.logsScrollFrame&&cancelAnimationFrame(e.logsScrollFrame),e.updateComplete.then(()=>{e.logsScrollFrame=requestAnimationFrame(()=>{e.logsScrollFrame=null;const n=e.querySelector(".log-stream");!n||!(t||n.scrollTop<80)||(n.scrollTop=0)})})}function td(e,t){const n=t.currentTarget;if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;e.chatUserNearBottom=s<200}function nd(e,t){const n=t.currentTarget;n&&(e.logsAtBottom=n.scrollTop<80)}function sd(e,t){const n=t.currentTarget;n&&(e.logsAtBottom=n.scrollTop<80)}function id(e){e.chatHasAutoScrolled=!1,e.chatUserNearBottom=!0}function od(e,t){if(e.length===0)return;const n=new Blob([`${e.join(`
14
- `)}
15
- `],{type:"text/plain"}),s=URL.createObjectURL(n),i=document.createElement("a"),o=new Date().toISOString().slice(0,19).replace(/[:T]/g,"-");i.href=s,i.download=`taskmaster-logs-${t}-${o}.log`,i.click(),URL.revokeObjectURL(s)}function rd(e,t){if(e.length===0)return;const n=new Blob([`${e.join(`
16
- `)}
17
- `],{type:"text/plain"}),s=URL.createObjectURL(n),i=document.createElement("a"),o=new Date().toISOString().slice(0,19).replace(/[:T]/g,"-");i.href=s,i.download=`taskmaster-session-logs-${t}-${o}.log`,i.click(),URL.revokeObjectURL(s)}function ad(e){if(typeof ResizeObserver>"u")return;const t=e.querySelector(".topbar");if(!t)return;const n=()=>{const{height:s}=t.getBoundingClientRect();e.style.setProperty("--topbar-height",`${s}px`)};n(),e.topbarObserver=new ResizeObserver(()=>n()),e.topbarObserver.observe(t)}function De(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function Ye(e){return`${JSON.stringify(e,null,2).trimEnd()}
18
- `}function za(e,t,n){if(t.length===0)return;let s=e;for(let o=0;o<t.length-1;o+=1){const r=t[o],l=t[o+1];if(typeof r=="number"){if(!Array.isArray(s))return;s[r]==null&&(s[r]=typeof l=="number"?[]:{}),s=s[r]}else{if(typeof s!="object"||s==null)return;const a=s;a[r]==null&&(a[r]=typeof l=="number"?[]:{}),s=a[r]}}const i=t[t.length-1];if(typeof i=="number"){Array.isArray(s)&&(s[i]=n);return}typeof s=="object"&&s!=null&&(s[i]=n)}async function ke(e){if(!(!e.client||!e.connected)){e.configLoading=!0,e.lastError=null;try{const t=await e.client.request("config.get",{});cd(e,t)}catch(t){e.lastError=String(t)}finally{e.configLoading=!1}}}async function ja(e){if(!(!e.client||!e.connected)&&!e.configSchemaLoading){e.configSchemaLoading=!0;try{const t=await e.client.request("config.schema",{});ld(e,t)}catch(t){e.lastError=String(t)}finally{e.configSchemaLoading=!1}}}function ld(e,t){e.configSchema=t.schema??null,e.configUiHints=t.uiHints??{},e.configSchemaVersion=t.version??null}function cd(e,t){e.configSnapshot=t;const n=typeof t.raw=="string"?t.raw:t.config&&typeof t.config=="object"?Ye(t.config):e.configRaw;!e.configFormDirty||e.configFormMode==="raw"?e.configRaw=n:e.configForm?e.configRaw=Ye(e.configForm):e.configRaw=n,e.configValid=typeof t.valid=="boolean"?t.valid:null,e.configIssues=Array.isArray(t.issues)?t.issues:[],e.configFormDirty||(e.configForm=De(t.config??{}),e.configFormOriginal=De(t.config??{}),e.configRawOriginal=n)}async function ud(e){if(!(!e.client||!e.connected)){e.configSaving=!0,e.lastError=null;try{const t=e.configFormMode==="form"&&e.configForm?Ye(e.configForm):e.configRaw,n=e.configSnapshot?.hash;if(!n){e.lastError="Config hash missing; reload and retry.";return}await e.client.request("config.set",{raw:t,baseHash:n}),e.configFormDirty=!1,await ke(e)}catch(t){e.lastError=String(t)}finally{e.configSaving=!1}}}async function tn(e){if(!(!e.client||!e.connected))try{const t=await e.client.request("cron.status",{});e.cronStatus=t}catch(t){e.cronError=String(t)}}async function rs(e){if(!(!e.client||!e.connected)&&!e.cronLoading){e.cronLoading=!0,e.cronError=null;try{const t={includeDisabled:!0};Array.isArray(e.workspaceAgentIds)&&e.workspaceAgentIds.length>0&&(t.agentIds=e.workspaceAgentIds);const n=await e.client.request("cron.list",t);e.cronJobs=Array.isArray(n.jobs)?n.jobs:[]}catch(t){e.cronError=String(t)}finally{e.cronLoading=!1}}}function dd(e){if(e.scheduleKind==="at"){const n=Date.parse(e.scheduleAt);if(!Number.isFinite(n))throw new Error("Invalid run time.");return{kind:"at",atMs:n}}if(e.scheduleKind==="every"){const n=zn(e.everyAmount,0);if(n<=0)throw new Error("Invalid interval amount.");const s=e.everyUnit;return{kind:"every",everyMs:n*(s==="minutes"?6e4:s==="hours"?36e5:864e5)}}const t=e.cronExpr.trim();if(!t)throw new Error("Cron expression required.");return{kind:"cron",expr:t,tz:e.cronTz.trim()||void 0}}function pd(e){if(e.payloadKind==="systemEvent"){const i=e.payloadText.trim();if(!i)throw new Error("System event text required.");return{kind:"systemEvent",text:i}}const t=e.payloadText.trim();if(!t)throw new Error("Agent message required.");const n={kind:"agentTurn",message:t};e.deliver&&(n.deliver=!0),e.channel&&(n.channel=e.channel),e.to.trim()&&(n.to=e.to.trim());const s=zn(e.timeoutSeconds,0);return s>0&&(n.timeoutSeconds=s),n}async function hd(e){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{const t=dd(e.cronForm),n=pd(e.cronForm),s=e.cronForm.agentId.trim(),i=e.cronForm.accountId?.trim(),o={name:e.cronForm.name.trim(),description:e.cronForm.description.trim()||void 0,agentId:s||void 0,accountId:i||void 0,enabled:e.cronForm.enabled,schedule:t,sessionTarget:e.cronForm.sessionTarget,wakeMode:e.cronForm.wakeMode,payload:n,isolation:e.cronForm.postToMainPrefix.trim()&&e.cronForm.sessionTarget==="isolated"?{postToMainPrefix:e.cronForm.postToMainPrefix.trim()}:void 0};if(!o.name)throw new Error("Name required.");await e.client.request("cron.add",o),e.cronForm={...e.cronForm,name:"",description:"",payloadText:""},await rs(e),await tn(e)}catch(t){e.cronError=String(t)}finally{e.cronBusy=!1}}}async function fd(e,t,n){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.update",{id:t.id,patch:{enabled:n}}),await rs(e),await tn(e)}catch(s){e.cronError=String(s)}finally{e.cronBusy=!1}}}async function gd(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.run",{id:t.id,mode:"force"}),await ci(e,t.id)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function md(e,t){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{await e.client.request("cron.remove",{id:t.id}),e.cronRunsJobId===t.id&&(e.cronRunsJobId=null,e.cronRuns=[]),await rs(e),await tn(e)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function ci(e,t){if(!(!e.client||!e.connected))try{const n=await e.client.request("cron.runs",{id:t,limit:50});e.cronRunsJobId=t,e.cronRuns=Array.isArray(n.entries)?n.entries:[]}catch(n){e.cronError=String(n)}}async function z(e,t){if(!(!e.client||!e.connected)&&!e.channelsLoading){e.channelsLoading=!0,e.channelsError=null;try{const n=await e.client.request("channels.status",{probe:t,timeoutMs:8e3});e.channelsSnapshot=n,e.channelsLastSuccess=Date.now()}catch(n){e.channelsError=String(n)}finally{e.channelsLoading=!1}}}async function zi(e,t,n){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0,e.whatsappActiveQrAccountId=n??null;try{const s=await e.client.request("web.login.start",{force:t,timeoutMs:3e4,accountId:n});e.whatsappLoginMessage=s.message??null,e.whatsappLoginQrDataUrl=s.qrDataUrl??null,e.whatsappLoginConnected=null}catch(s){e.whatsappLoginMessage=String(s),e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function Ha(e,t){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{const n=await e.client.request("web.login.wait",{timeoutMs:12e4,accountId:t});e.whatsappLoginMessage=n.message??null,e.whatsappLoginConnected=n.connected??null,n.connected&&(e.whatsappLoginQrDataUrl=null,e.whatsappActiveQrAccountId=null,e.whatsappPairedPhone=n.selfPhone??null)}catch(n){e.whatsappLoginMessage=String(n),e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function qa(e,t){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0;try{await e.client.request("channels.logout",{channel:"whatsapp",accountId:t}),e.whatsappLoginMessage="Logged out.",e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null,e.whatsappActiveQrAccountId=null}catch(n){e.whatsappLoginMessage=String(n)}finally{e.whatsappBusy=!1}}}async function Ga(e,t){if(!e.client||!e.connected||e.whatsappAccountSaving)return;const n=t.trim();if(!n){e.whatsappAccountError="Account name is required.";return}const s=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");if(!s){e.whatsappAccountError="Invalid account name.";return}e.whatsappAccountSaving=!0,e.whatsappAccountError=null;try{const i=await e.client.request("config.get",{});e.configSnapshot=i;const o=De(i.config??{});(!o.channels||typeof o.channels!="object")&&(o.channels={});const r=o.channels;(!r.whatsapp||typeof r.whatsapp!="object")&&(r.whatsapp={});const l=r.whatsapp;(!l.accounts||typeof l.accounts!="object")&&(l.accounts={});const a=l.accounts;if(a[s]){e.whatsappAccountError=`Account "${s}" already exists.`;return}a[s]={name:n,provider:"baileys"};const c=i.hash;if(!c){e.whatsappAccountError="Config hash missing; reload and retry.";return}const u=Ye(o);await e.client.request("config.set",{raw:u,baseHash:c}),e.addingWhatsAppAccount=!1,e.newWhatsAppAccountName="",await z(e,!0),await zi(e,!0,s)}catch(i){e.whatsappAccountError=String(i)}finally{e.whatsappAccountSaving=!1}}async function Va(e,t){if(!(!e.client||!e.connected)&&!e.whatsappAccountSaving){e.whatsappAccountSaving=!0,e.whatsappAccountError=null;try{const n=await e.client.request("config.get",{});e.configSnapshot=n;const s=De(n.config??{}),r=s.channels?.whatsapp?.accounts;if(!r){e.whatsappAccountError="No accounts found in config.";return}if(Object.keys(r).length<=1){e.whatsappAccountError="Cannot remove the last account.";return}if(!r[t]){e.whatsappAccountError=`Account "${t}" not found.`;return}try{await e.client.request("channels.logout",{channel:"whatsapp",accountId:t})}catch{}delete r[t],Array.isArray(s.bindings)&&(s.bindings=s.bindings.filter(u=>{const p=u.match;return!p||p.channel!=="whatsapp"?!0:p.accountId!==t}));const a=n.hash;if(!a){e.whatsappAccountError="Config hash missing; reload and retry.";return}const c=Ye(s);await e.client.request("config.set",{raw:c,baseHash:a}),e.whatsappActiveQrAccountId===t&&(e.whatsappActiveQrAccountId=null,e.whatsappLoginQrDataUrl=null,e.whatsappLoginMessage=null),await z(e,!0)}catch(n){e.whatsappAccountError=String(n)}finally{e.whatsappAccountSaving=!1}}}const yd=Object.freeze(Object.defineProperty({__proto__:null,addWhatsAppAccount:Ga,loadChannels:z,logoutWhatsApp:qa,removeWhatsAppAccount:Va,startWhatsAppLogin:zi,waitWhatsAppLogin:Ha},Symbol.toStringTag,{value:"Module"}));async function ji(e){if(!(!e.client||!e.connected)&&!e.debugLoading){e.debugLoading=!0;try{const[t,n,s,i]=await Promise.all([e.client.request("status",{}),e.client.request("health",{}),e.client.request("models.list",{}),e.client.request("last-heartbeat",{})]);e.debugStatus=t,e.debugHealth=n;const o=s;e.debugModels=Array.isArray(o?.models)?o?.models:[],e.debugHeartbeat=i}catch(t){e.debugCallError=String(t)}finally{e.debugLoading=!1}}}const vd=2e3,bd=new Set(["trace","debug","info","warn","error","fatal"]);function wd(e){if(typeof e!="string")return null;const t=e.trim();if(!t.startsWith("{")||!t.endsWith("}"))return null;try{const n=JSON.parse(t);return!n||typeof n!="object"?null:n}catch{return null}}function kd(e){if(typeof e!="string")return null;const t=e.toLowerCase();return bd.has(t)?t:null}function Sd(e){if(!e.trim())return{raw:e,message:e};try{const t=JSON.parse(e),n=t&&typeof t._meta=="object"&&t._meta!==null?t._meta:null,s=typeof t.time=="string"?t.time:typeof n?.date=="string"?n?.date:null,i=kd(n?.logLevelName??n?.level),o=typeof t[0]=="string"?t[0]:typeof n?.name=="string"?n?.name:null,r=wd(o);let l=null;r&&(typeof r.subsystem=="string"?l=r.subsystem:typeof r.module=="string"&&(l=r.module)),!l&&o&&o.length<120&&(l=o);let a=null;return typeof t[1]=="string"?a=t[1]:!r&&typeof t[0]=="string"?a=t[0]:typeof t.message=="string"&&(a=t.message),{raw:e,time:s,level:i,subsystem:l,message:a??e,meta:n??void 0}}catch{return{raw:e,message:e}}}async function qt(e,t){if(!(!e.client||!e.connected)&&!(e.logsLoading&&!t?.quiet)){t?.quiet||(e.logsLoading=!0),e.logsError=null;try{const s=await e.client.request("logs.tail",{cursor:t?.reset?void 0:e.logsCursor??void 0,limit:e.logsLimit,maxBytes:e.logsMaxBytes}),o=(Array.isArray(s.lines)?s.lines.filter(l=>typeof l=="string"):[]).map(Sd),r=!!(t?.reset||s.reset||e.logsCursor==null);e.logsEntries=r?o:[...e.logsEntries,...o].slice(-vd),typeof s.cursor=="number"&&(e.logsCursor=s.cursor),typeof s.file=="string"&&(e.logsFile=s.file),e.logsTruncated=!!s.truncated,e.logsLastFetchAt=Date.now()}catch(n){e.logsError=String(n)}finally{t?.quiet||(e.logsLoading=!1)}}}const Ya={p:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,n:0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,h:8n,a:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,d:0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,Gx:0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,Gy:0x6666666666666666666666666666666666666666666666666666666666666658n},{p:ee,n:In,Gx:ur,Gy:dr,a:Ns,d:Ds,h:xd}=Ya,Qe=32,Hi=64,Ad=(...e)=>{"captureStackTrace"in Error&&typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(...e)},Y=(e="")=>{const t=new Error(e);throw Ad(t,Y),t},$d=e=>typeof e=="bigint",Ed=e=>typeof e=="string",Td=e=>e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array",Be=(e,t,n="")=>{const s=Td(e),i=e?.length,o=t!==void 0;if(!s||o&&i!==t){const r=n&&`"${n}" `,l=o?` of length ${t}`:"",a=s?`length=${i}`:`type=${typeof e}`;Y(r+"expected Uint8Array"+l+", got "+a)}return e},as=e=>new Uint8Array(e),Qa=e=>Uint8Array.from(e),Xa=(e,t)=>e.toString(16).padStart(t,"0"),Za=e=>Array.from(Be(e)).map(t=>Xa(t,2)).join(""),$e={_0:48,_9:57,A:65,F:70,a:97,f:102},pr=e=>{if(e>=$e._0&&e<=$e._9)return e-$e._0;if(e>=$e.A&&e<=$e.F)return e-($e.A-10);if(e>=$e.a&&e<=$e.f)return e-($e.a-10)},Ja=e=>{const t="hex invalid";if(!Ed(e))return Y(t);const n=e.length,s=n/2;if(n%2)return Y(t);const i=as(s);for(let o=0,r=0;o<s;o++,r+=2){const l=pr(e.charCodeAt(r)),a=pr(e.charCodeAt(r+1));if(l===void 0||a===void 0)return Y(t);i[o]=l*16+a}return i},el=()=>globalThis?.crypto,Cd=()=>el()?.subtle??Y("crypto.subtle must be defined, consider polyfill"),Zt=(...e)=>{const t=as(e.reduce((s,i)=>s+Be(i).length,0));let n=0;return e.forEach(s=>{t.set(s,n),n+=s.length}),t},_d=(e=Qe)=>el().getRandomValues(as(e)),Hn=BigInt,He=(e,t,n,s="bad number: out of range")=>$d(e)&&t<=e&&e<n?e:Y(s),$=(e,t=ee)=>{const n=e%t;return n>=0n?n:t+n},tl=e=>$(e,In),Md=(e,t)=>{(e===0n||t<=0n)&&Y("no inverse n="+e+" mod="+t);let n=$(e,t),s=t,i=0n,o=1n;for(;n!==0n;){const r=s/n,l=s%n,a=i-o*r;s=n,n=l,i=o,o=a}return s===1n?$(i,t):Y("no inverse")},Ld=e=>{const t=ol[e];return typeof t!="function"&&Y("hashes."+e+" not set"),t},Os=e=>e instanceof ae?e:Y("Point expected"),ui=2n**256n;class ae{static BASE;static ZERO;X;Y;Z;T;constructor(t,n,s,i){const o=ui;this.X=He(t,0n,o),this.Y=He(n,0n,o),this.Z=He(s,1n,o),this.T=He(i,0n,o),Object.freeze(this)}static CURVE(){return Ya}static fromAffine(t){return new ae(t.x,t.y,1n,$(t.x*t.y))}static fromBytes(t,n=!1){const s=Ds,i=Qa(Be(t,Qe)),o=t[31];i[31]=o&-129;const r=sl(i);He(r,0n,n?ui:ee);const a=$(r*r),c=$(a-1n),u=$(s*a+1n);let{isValid:p,value:m}=Rd(c,u);p||Y("bad point: y not sqrt");const v=(m&1n)===1n,w=(o&128)!==0;return!n&&m===0n&&w&&Y("bad point: x==0, isLastByteOdd"),w!==v&&(m=$(-m)),new ae(m,r,1n,$(m*r))}static fromHex(t,n){return ae.fromBytes(Ja(t),n)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}assertValidity(){const t=Ns,n=Ds,s=this;if(s.is0())return Y("bad point: ZERO");const{X:i,Y:o,Z:r,T:l}=s,a=$(i*i),c=$(o*o),u=$(r*r),p=$(u*u),m=$(a*t),v=$(u*$(m+c)),w=$(p+$(n*$(a*c)));if(v!==w)return Y("bad point: equation left != right (1)");const A=$(i*o),_=$(r*l);return A!==_?Y("bad point: equation left != right (2)"):this}equals(t){const{X:n,Y:s,Z:i}=this,{X:o,Y:r,Z:l}=Os(t),a=$(n*l),c=$(o*i),u=$(s*l),p=$(r*i);return a===c&&u===p}is0(){return this.equals(ft)}negate(){return new ae($(-this.X),this.Y,this.Z,$(-this.T))}double(){const{X:t,Y:n,Z:s}=this,i=Ns,o=$(t*t),r=$(n*n),l=$(2n*$(s*s)),a=$(i*o),c=t+n,u=$($(c*c)-o-r),p=a+r,m=p-l,v=a-r,w=$(u*m),A=$(p*v),_=$(u*v),j=$(m*p);return new ae(w,A,j,_)}add(t){const{X:n,Y:s,Z:i,T:o}=this,{X:r,Y:l,Z:a,T:c}=Os(t),u=Ns,p=Ds,m=$(n*r),v=$(s*l),w=$(o*p*c),A=$(i*a),_=$((n+s)*(r+l)-m-v),j=$(A-w),C=$(A+w),P=$(v-u*m),I=$(_*j),B=$(C*P),ue=$(_*P),it=$(j*C);return new ae(I,B,it,ue)}subtract(t){return this.add(Os(t).negate())}multiply(t,n=!0){if(!n&&(t===0n||this.is0()))return ft;if(He(t,1n,In),t===1n)return this;if(this.equals(Xe))return jd(t).p;let s=ft,i=Xe;for(let o=this;t>0n;o=o.double(),t>>=1n)t&1n?s=s.add(o):n&&(i=i.add(o));return s}multiplyUnsafe(t){return this.multiply(t,!1)}toAffine(){const{X:t,Y:n,Z:s}=this;if(this.equals(ft))return{x:0n,y:1n};const i=Md(s,ee);$(s*i)!==1n&&Y("invalid inverse");const o=$(t*i),r=$(n*i);return{x:o,y:r}}toBytes(){const{x:t,y:n}=this.assertValidity().toAffine(),s=nl(n);return s[31]|=t&1n?128:0,s}toHex(){return Za(this.toBytes())}clearCofactor(){return this.multiply(Hn(xd),!1)}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){let t=this.multiply(In/2n,!1).double();return In%2n&&(t=t.add(this)),t.is0()}}const Xe=new ae(ur,dr,1n,$(ur*dr)),ft=new ae(0n,1n,1n,0n);ae.BASE=Xe;ae.ZERO=ft;const nl=e=>Ja(Xa(He(e,0n,ui),Hi)).reverse(),sl=e=>Hn("0x"+Za(Qa(Be(e)).reverse())),ve=(e,t)=>{let n=e;for(;t-- >0n;)n*=n,n%=ee;return n},Pd=e=>{const n=e*e%ee*e%ee,s=ve(n,2n)*n%ee,i=ve(s,1n)*e%ee,o=ve(i,5n)*i%ee,r=ve(o,10n)*o%ee,l=ve(r,20n)*r%ee,a=ve(l,40n)*l%ee,c=ve(a,80n)*a%ee,u=ve(c,80n)*a%ee,p=ve(u,10n)*o%ee;return{pow_p_5_8:ve(p,2n)*e%ee,b2:n}},hr=0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n,Rd=(e,t)=>{const n=$(t*t*t),s=$(n*n*t),i=Pd(e*s).pow_p_5_8;let o=$(e*n*i);const r=$(t*o*o),l=o,a=$(o*hr),c=r===e,u=r===$(-e),p=r===$(-e*hr);return c&&(o=l),(u||p)&&(o=a),($(o)&1n)===1n&&(o=$(-o)),{isValid:c||u,value:o}},di=e=>tl(sl(e)),qi=(...e)=>ol.sha512Async(Zt(...e)),Id=(...e)=>Ld("sha512")(Zt(...e)),il=e=>{const t=e.slice(0,Qe);t[0]&=248,t[31]&=127,t[31]|=64;const n=e.slice(Qe,Hi),s=di(t),i=Xe.multiply(s),o=i.toBytes();return{head:t,prefix:n,scalar:s,point:i,pointBytes:o}},Gi=e=>qi(Be(e,Qe)).then(il),Nd=e=>il(Id(Be(e,Qe))),Dd=e=>Gi(e).then(t=>t.pointBytes),Od=e=>qi(e.hashable).then(e.finish),Bd=(e,t,n)=>{const{pointBytes:s,scalar:i}=e,o=di(t),r=Xe.multiply(o).toBytes();return{hashable:Zt(r,s,n),finish:c=>{const u=tl(o+di(c)*i);return Be(Zt(r,nl(u)),Hi)}}},Fd=async(e,t)=>{const n=Be(e),s=await Gi(t),i=await qi(s.prefix,n);return Od(Bd(s,i,n))},ol={sha512Async:async e=>{const t=Cd(),n=Zt(e);return as(await t.digest("SHA-512",n.buffer))},sha512:void 0},Ud=(e=_d(Qe))=>e,Wd={getExtendedPublicKeyAsync:Gi,getExtendedPublicKey:Nd,randomSecretKey:Ud},qn=8,Kd=256,rl=Math.ceil(Kd/qn)+1,pi=2**(qn-1),zd=()=>{const e=[];let t=Xe,n=t;for(let s=0;s<rl;s++){n=t,e.push(n);for(let i=1;i<pi;i++)n=n.add(t),e.push(n);t=n.double()}return e};let fr;const gr=(e,t)=>{const n=t.negate();return e?n:t},jd=e=>{const t=fr||(fr=zd());let n=ft,s=Xe;const i=2**qn,o=i,r=Hn(i-1),l=Hn(qn);for(let a=0;a<rl;a++){let c=Number(e&r);e>>=l,c>pi&&(c-=o,e+=1n);const u=a*pi,p=u,m=u+Math.abs(c)-1,v=a%2!==0,w=c<0;c===0?s=s.add(gr(v,t[p])):n=n.add(gr(w,t[m]))}return e!==0n&&Y("invalid wnaf"),{p:n,f:s}},Bs="taskmaster-device-identity-v1";function hi(e){let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t).replaceAll("+","-").replaceAll("/","_").replace(/=+$/g,"")}function al(e){const t=e.replaceAll("-","+").replaceAll("_","/"),n=t+"=".repeat((4-t.length%4)%4),s=atob(n),i=new Uint8Array(s.length);for(let o=0;o<s.length;o+=1)i[o]=s.charCodeAt(o);return i}function Hd(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function ll(e){const t=await crypto.subtle.digest("SHA-256",e);return Hd(new Uint8Array(t))}async function qd(){const e=Wd.randomSecretKey(),t=await Dd(e);return{deviceId:await ll(t),publicKey:hi(t),privateKey:hi(e)}}async function Gd(){try{const n=localStorage.getItem(Bs);if(n){const s=JSON.parse(n);if(s?.version===1&&typeof s.deviceId=="string"&&typeof s.publicKey=="string"&&typeof s.privateKey=="string"){const i=await ll(al(s.publicKey));if(i!==s.deviceId){const o={...s,deviceId:i};return localStorage.setItem(Bs,JSON.stringify(o)),{deviceId:i,publicKey:s.publicKey,privateKey:s.privateKey}}return{deviceId:s.deviceId,publicKey:s.publicKey,privateKey:s.privateKey}}}}catch{}const e=await qd(),t={version:1,deviceId:e.deviceId,publicKey:e.publicKey,privateKey:e.privateKey,createdAtMs:Date.now()};return localStorage.setItem(Bs,JSON.stringify(t)),e}async function Vd(e,t){const n=al(e),s=new TextEncoder().encode(t),i=await Fd(s,n);return hi(i)}const cl="taskmaster.device.auth.v1";function Vi(e){return e.trim()}function Yd(e){if(!Array.isArray(e))return[];const t=new Set;for(const n of e){const s=n.trim();s&&t.add(s)}return[...t].sort()}function Yi(){try{const e=window.localStorage.getItem(cl);if(!e)return null;const t=JSON.parse(e);return!t||t.version!==1||!t.deviceId||typeof t.deviceId!="string"||!t.tokens||typeof t.tokens!="object"?null:t}catch{return null}}function ul(e){try{window.localStorage.setItem(cl,JSON.stringify(e))}catch{}}function Qd(e){const t=Yi();if(!t||t.deviceId!==e.deviceId)return null;const n=Vi(e.role),s=t.tokens[n];return!s||typeof s.token!="string"?null:s}function Xd(e){const t=Vi(e.role),n={version:1,deviceId:e.deviceId,tokens:{}},s=Yi();s&&s.deviceId===e.deviceId&&(n.tokens={...s.tokens});const i={token:e.token,role:t,scopes:Yd(e.scopes),updatedAtMs:Date.now()};return n.tokens[t]=i,ul(n),i}function Zd(e){const t=Yi();if(!t||t.deviceId!==e.deviceId)return;const n=Vi(e.role);if(!t.tokens[n])return;const s={...t,tokens:{...t.tokens}};delete s.tokens[n],ul(s)}async function Qi(e,t){if(!(!e.client||!e.connected)&&!e.devicesLoading){e.devicesLoading=!0,t?.quiet||(e.devicesError=null);try{const n=await e.client.request("device.pair.list",{});e.devicesList={pending:Array.isArray(n?.pending)?n.pending:[],paired:Array.isArray(n?.paired)?n.paired:[]}}catch(n){t?.quiet||(e.devicesError=String(n))}finally{e.devicesLoading=!1}}}async function Xi(e,t){if(!(!e.client||!e.connected)&&!e.nodesLoading){e.nodesLoading=!0,t?.quiet||(e.lastError=null);try{const n=await e.client.request("node.list",{});e.nodes=Array.isArray(n.nodes)?n.nodes:[]}catch(n){t?.quiet||(e.lastError=String(n))}finally{e.nodesLoading=!1}}}function Jd(e){return{method:"exec.approvals.get",params:{}}}async function ep(e,t){if(!(!e.client||!e.connected)&&!e.execApprovalsLoading){e.execApprovalsLoading=!0,e.lastError=null;try{const n=Jd(t);if(!n){e.lastError="Select a node before loading exec approvals.";return}const s=await e.client.request(n.method,n.params);tp(e,s)}catch(n){e.lastError=String(n)}finally{e.execApprovalsLoading=!1}}}function tp(e,t){e.execApprovalsSnapshot=t,e.execApprovalsDirty||(e.execApprovalsForm=De(t.file??{}))}async function dl(e){if(!(!e.client||!e.connected)&&!e.presenceLoading){e.presenceLoading=!0,e.presenceError=null,e.presenceStatus=null;try{const t=await e.client.request("system-presence",{});Array.isArray(t)?(e.presenceEntries=t,e.presenceStatus=t.length===0?"No instances yet.":null):(e.presenceEntries=[],e.presenceStatus="No presence payload.")}catch(t){e.presenceError=String(t)}finally{e.presenceLoading=!1}}}function bt(e,t,n){if(!t.trim())return;const s={...e.skillMessages};n?s[t]=n:delete s[t],e.skillMessages=s}function ls(e){return e instanceof Error?e.message:String(e)}async function wt(e,t){if(t?.clearMessages&&Object.keys(e.skillMessages).length>0&&(e.skillMessages={}),!(!e.client||!e.connected)&&!e.skillsLoading){e.skillsLoading=!0,e.skillsError=null;try{const n=await e.client.request("skills.status",{});n&&(e.skillsReport=n)}catch(n){e.skillsError=ls(n)}finally{e.skillsLoading=!1}}}function np(e,t,n){e.skillEdits={...e.skillEdits,[t]:n}}async function sp(e,t,n){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{await e.client.request("skills.update",{skillKey:t,enabled:n}),await wt(e),bt(e,t,{kind:"success",message:n?"Skill enabled":"Skill disabled"})}catch(s){const i=ls(s);e.skillsError=i,bt(e,t,{kind:"error",message:i})}finally{e.skillsBusyKey=null}}}async function ip(e,t){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const n=e.skillEdits[t]??"";await e.client.request("skills.update",{skillKey:t,apiKey:n}),await wt(e),bt(e,t,{kind:"success",message:"API key saved"})}catch(n){const s=ls(n);e.skillsError=s,bt(e,t,{kind:"error",message:s})}finally{e.skillsBusyKey=null}}}async function op(e,t,n,s){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const i=await e.client.request("skills.install",{name:n,installId:s,timeoutMs:12e4});await wt(e),bt(e,t,{kind:"success",message:i?.message??"Installed"})}catch(i){const o=ls(i);e.skillsError=o,bt(e,t,{kind:"error",message:o})}finally{e.skillsBusyKey=null}}}const pl={overview:"/overview",channels:"/channels",instances:"/instances",cron:"/cron",skills:"/skills",nodes:"/nodes",chat:"/chat",admins:"/admins",config:"/config",debug:"/debug",logs:"/logs"},hl=new Map(Object.entries(pl).map(([e,t])=>[t,e]));function cs(e){if(!e)return"";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t==="/"?"":(t.endsWith("/")&&(t=t.slice(0,-1)),t)}function Jt(e){if(!e)return"/";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t.length>1&&t.endsWith("/")&&(t=t.slice(0,-1)),t}function rp(e,t=""){const n=cs(t),s=pl[e];return n?`${n}${s}`:s}function fl(e,t=""){const n=cs(t);let s=e||"/";n&&(s===n?s="/":s.startsWith(`${n}/`)&&(s=s.slice(n.length)));let i=Jt(s).toLowerCase();return i.endsWith("/index.html")&&(i="/"),i==="/"?"chat":hl.get(i)??null}function ap(e){let t=Jt(e);if(t.endsWith("/index.html")&&(t=Jt(t.slice(0,-11))),t==="/")return"";const n=t.split("/").filter(Boolean);if(n.length===0)return"";for(let s=0;s<n.length;s++){const i=`/${n.slice(s).join("/")}`.toLowerCase();if(hl.has(i)){const o=n.slice(0,s);return o.length?`/${o.join("/")}`:""}}return`/${n.join("/")}`}function lp(){return typeof window>"u"||typeof window.matchMedia!="function"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Zi(e){return e==="system"?lp():e}const kn=e=>Number.isNaN(e)?.5:e<=0?0:e>=1?1:e,cp=()=>typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches??!1,Sn=e=>{e.classList.remove("theme-transition"),e.style.removeProperty("--theme-switch-x"),e.style.removeProperty("--theme-switch-y")},up=({nextTheme:e,applyTheme:t,context:n,currentTheme:s})=>{if(s===e)return;const i=globalThis.document??null;if(!i){t();return}const o=i.documentElement,r=i,l=cp();if(!!r.startViewTransition&&!l){let c=.5,u=.5;if(n?.pointerClientX!==void 0&&n?.pointerClientY!==void 0&&typeof window<"u")c=kn(n.pointerClientX/window.innerWidth),u=kn(n.pointerClientY/window.innerHeight);else if(n?.element){const p=n.element.getBoundingClientRect();p.width>0&&p.height>0&&typeof window<"u"&&(c=kn((p.left+p.width/2)/window.innerWidth),u=kn((p.top+p.height/2)/window.innerHeight))}o.style.setProperty("--theme-switch-x",`${c*100}%`),o.style.setProperty("--theme-switch-y",`${u*100}%`),o.classList.add("theme-transition");try{const p=r.startViewTransition?.(()=>{t()});p?.finished?p.finished.finally(()=>Sn(o)):Sn(o)}catch{Sn(o),t()}return}t(),Sn(o)},dp=2e3;async function gt(e,t){if(!(!e.client||!e.connected)&&!(e.sessionLogsLoading&&!t?.quiet)){t?.quiet||(e.sessionLogsLoading=!0),e.sessionLogsError=null;try{const s=await e.client.request("sessions.transcript",{cursors:t?.reset?void 0:e.sessionLogsCursors,limit:200,maxBytesPerFile:e.sessionLogsFull?25e4:5e4,...e.sessionLogsFull?{full:!0}:{}}),i=Array.isArray(s.entries)?s.entries:[],o=!!(t?.reset||Object.keys(e.sessionLogsCursors).length===0);e.sessionLogsEntries=o?i:[...e.sessionLogsEntries,...i].slice(-dp),s.cursors&&(e.sessionLogsCursors=s.cursors),Array.isArray(s.agents)&&(e.sessionLogsAgents=s.agents),e.sessionLogsLastFetchAt=Date.now()}catch(n){e.sessionLogsError=String(n)}finally{t?.quiet||(e.sessionLogsLoading=!1)}}}const pp=Object.freeze(Object.defineProperty({__proto__:null,loadSessionLogs:gt},Symbol.toStringTag,{value:"Module"}));function hp(e){e.nodesPollInterval==null&&(e.nodesPollInterval=window.setInterval(()=>{Xi(e,{quiet:!0})},5e3))}function fp(e){e.nodesPollInterval!=null&&(clearInterval(e.nodesPollInterval),e.nodesPollInterval=null)}function Ji(e){e.logsPollInterval==null&&(e.logsPollInterval=window.setInterval(()=>{e.tab==="logs"&&qt(e,{quiet:!0})},2e3))}function eo(e){e.logsPollInterval!=null&&(clearInterval(e.logsPollInterval),e.logsPollInterval=null)}function to(e){e.sessionLogsPollInterval==null&&(e.sessionLogsPollInterval=window.setInterval(()=>{e.tab!=="logs"||e.logsSubTab!=="session"||gt(e,{quiet:!0})},2e3))}function no(e){e.sessionLogsPollInterval!=null&&(clearInterval(e.sessionLogsPollInterval),e.sessionLogsPollInterval=null)}function so(e){e.debugPollInterval==null&&(e.debugPollInterval=window.setInterval(()=>{e.tab==="debug"&&ji(e)},3e3))}function io(e){e.debugPollInterval!=null&&(clearInterval(e.debugPollInterval),e.debugPollInterval=null)}function Ie(e,t){const n={...t,lastActiveSessionKey:t.lastActiveSessionKey?.trim()||t.sessionKey.trim()||"main"};e.settings=n,$u(n),t.theme!==e.theme&&(e.theme=t.theme,us(e,Zi(t.theme))),e.applySessionKey=e.settings.lastActiveSessionKey}function gl(e,t){const n=t.trim();n&&e.settings.lastActiveSessionKey!==n&&Ie(e,{...e.settings,lastActiveSessionKey:n})}function gp(e){if(!window.location.search)return;const t=new URLSearchParams(window.location.search),n=t.get("token"),s=t.get("password"),i=t.get("session"),o=t.get("gatewayUrl");let r=!1;if(n!=null){const a=n.trim();a&&a!==e.settings.token&&Ie(e,{...e.settings,token:a}),t.delete("token"),r=!0}if(s!=null){const a=s.trim();a&&(e.password=a),t.delete("password"),r=!0}if(i!=null){const a=i.trim();a&&(e.sessionKey=a,Ie(e,{...e.settings,sessionKey:a,lastActiveSessionKey:a}))}if(o!=null){const a=o.trim();a&&a!==e.settings.gatewayUrl&&Ie(e,{...e.settings,gatewayUrl:a}),t.delete("gatewayUrl"),r=!0}if(!r)return;const l=new URL(window.location.href);l.search=t.toString(),window.history.replaceState({},"",l.toString())}function mp(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?e.logsSubTab==="session"?to(e):Ji(e):(eo(e),no(e)),t==="debug"?so(e):io(e),oo(e),yl(e,t,!1)}function yp(e,t,n){up({nextTheme:t,applyTheme:()=>{e.theme=t,Ie(e,{...e.settings,theme:t}),us(e,Zi(t))},context:n,currentTheme:e.theme})}async function oo(e){if(e.tab==="overview"&&await vl(e),e.tab==="channels"&&await Ap(e),e.tab==="instances"&&await dl(e),e.tab==="cron"&&await ro(e),e.tab==="skills"&&await wt(e),e.tab==="nodes"&&(await Xi(e),await Qi(e),await ke(e),await ep(e)),e.tab==="chat"&&!e.advancedPage&&!e.chatPage&&(await _p(e),en(e,!e.chatHasAutoScrolled)),e.tab==="config"&&(await ja(e),await ke(e)),e.tab==="debug"&&(await ji(e),e.eventLog=e.eventLogBuffer),e.tab==="logs"){if(e.logsAtBottom=!0,e.logsSubTab==="session"){const{loadSessionLogs:n}=await de(async()=>{const{loadSessionLogs:s}=await Promise.resolve().then(()=>pp);return{loadSessionLogs:s}},void 0,import.meta.url);await n(e,{reset:!0})}else await qt(e,{reset:!0});Ka(e,!0)}}function vp(){if(typeof window>"u")return"";const e=window.__TASKMASTER_CONTROL_UI_BASE_PATH__;return typeof e=="string"&&e.trim()?cs(e):ap(window.location.pathname)}function bp(e){e.theme=e.settings.theme??"system",us(e,Zi(e.theme))}function us(e,t){if(e.themeResolved=t,typeof document>"u")return;const n=document.documentElement;n.dataset.theme=t,n.style.colorScheme=t}function wp(e){if(typeof window>"u"||typeof window.matchMedia!="function")return;if(e.themeMedia=window.matchMedia("(prefers-color-scheme: dark)"),e.themeMediaHandler=n=>{e.theme==="system"&&us(e,n.matches?"dark":"light")},typeof e.themeMedia.addEventListener=="function"){e.themeMedia.addEventListener("change",e.themeMediaHandler);return}e.themeMedia.addListener(e.themeMediaHandler)}function kp(e){if(!e.themeMedia||!e.themeMediaHandler)return;if(typeof e.themeMedia.removeEventListener=="function"){e.themeMedia.removeEventListener("change",e.themeMediaHandler);return}e.themeMedia.removeListener(e.themeMediaHandler),e.themeMedia=null,e.themeMediaHandler=null}function Sp(e,t){if(typeof window>"u")return;const n=fl(window.location.pathname,e.basePath)??"chat";ml(e,n),yl(e,n,t)}function xp(e){if(typeof window>"u")return;const t=fl(window.location.pathname,e.basePath);if(!t)return;const s=new URL(window.location.href).searchParams.get("session")?.trim();s&&(e.sessionKey=s,Ie(e,{...e.settings,sessionKey:s,lastActiveSessionKey:s})),ml(e,t)}function ml(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?e.logsSubTab==="session"?to(e):Ji(e):(eo(e),no(e)),t==="debug"?so(e):io(e),e.connected&&oo(e)}function yl(e,t,n){if(typeof window>"u")return;const s=Jt(rp(t,e.basePath)),i=Jt(window.location.pathname),o=new URL(window.location.href);t==="chat"&&e.sessionKey?o.searchParams.set("session",e.sessionKey):o.searchParams.delete("session"),i!==s&&(o.pathname=s),n?window.history.replaceState({},"",o.toString()):window.history.pushState({},"",o.toString())}async function vl(e){await Promise.all([z(e,!1),dl(e),Wi(e),tn(e),ji(e)])}async function Ap(e){await Promise.all([z(e,!0),ja(e),ke(e)])}async function ro(e){await Promise.all([z(e,!1),tn(e),rs(e)])}function bl(e){return e.chatSending||!!e.chatRunId}function $p(e){const t=e.trim();if(!t)return!1;const n=t.toLowerCase();return n==="/stop"?!0:n==="stop"||n==="esc"||n==="abort"||n==="wait"||n==="exit"}async function wl(e){e.connected&&(e.chatMessage="",await Ua(e))}function Ep(e,t,n){const s=t.trim(),i=!!(n&&n.length>0);!s&&!i||(e.chatQueue=[...e.chatQueue,{id:Ui(),text:s,createdAt:Date.now(),attachments:i?n?.map(o=>({...o})):void 0}],en(e))}async function kl(e,t,n){Ki(e);const s=await Fa(e,t,n?.attachments);return!s&&n?.previousDraft!=null&&(e.chatMessage=n.previousDraft),!s&&n?.previousAttachments&&(e.chatAttachments=n.previousAttachments),s&&gl(e,e.sessionKey),s&&n?.restoreDraft&&n.previousDraft?.trim()&&(e.chatMessage=n.previousDraft),s&&n?.restoreAttachments&&n.previousAttachments?.length&&(e.chatAttachments=n.previousAttachments),en(e),s&&!e.chatRunId&&Sl(e),s}async function Sl(e){if(!e.connected||bl(e))return;const[t,...n]=e.chatQueue;if(!t)return;e.chatQueue=n,await kl(e,t.text,{attachments:t.attachments})||(e.chatQueue=[t,...e.chatQueue])}function Tp(e,t){e.chatQueue=e.chatQueue.filter(n=>n.id!==t)}async function Cp(e,t,n){if(!e.connected)return;const s=e.chatMessage,i=(t??e.chatMessage).trim(),o=e.chatAttachments??[],r=t==null?o:[],l=r.length>0;if(!(!i&&!l)){if($p(i)){await wl(e);return}if(t==null&&(e.chatMessage="",e.chatAttachments=[]),bl(e)){Ep(e,i,r);return}await kl(e,i,{previousDraft:t==null?s:void 0,restoreDraft:!!(t&&n?.restoreDraft),attachments:l?r:void 0,previousAttachments:t==null?o:void 0,restoreAttachments:!!(t&&n?.restoreDraft)})}}async function _p(e){await Promise.all([Ce(e),Wi(e),fi(e)]),en(e,!0)}const Mp=Sl;function Lp(e){const t=La(e.sessionKey);return t?.agentId?t.agentId:e.hello?.snapshot?.sessionDefaults?.defaultAgentId?.trim()||"main"}function Pp(e,t){const n=cs(e),s=encodeURIComponent(t);return n?`${n}/avatar/${s}?meta=1`:`/avatar/${s}?meta=1`}async function fi(e){if(!e.connected){e.chatAvatarUrl=null;return}const t=Lp(e);if(!t){e.chatAvatarUrl=null;return}e.chatAvatarUrl=null;const n=Pp(e.basePath,t);try{const s=await fetch(n,{method:"GET"});if(!s.ok){e.chatAvatarUrl=null;return}const i=await s.json(),o=typeof i.avatarUrl=="string"?i.avatarUrl.trim():"";e.chatAvatarUrl=o||null}catch{e.chatAvatarUrl=null}}const N={messageSquare:d`<svg viewBox="0 0 24 24"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>`,barChart:d`<svg viewBox="0 0 24 24"><line x1="12" x2="12" y1="20" y2="10"/><line x1="18" x2="18" y1="20" y2="4"/><line x1="6" x2="6" y1="20" y2="16"/></svg>`,link:d`<svg viewBox="0 0 24 24"><path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"/><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"/></svg>`,radio:d`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="2"/><path d="M16.24 7.76a6 6 0 0 1 0 8.49m-8.48-.01a6 6 0 0 1 0-8.49m11.31-2.82a10 10 0 0 1 0 14.14m-14.14 0a10 10 0 0 1 0-14.14"/></svg>`,fileText:d`<svg viewBox="0 0 24 24"><path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"/><polyline points="14 2 14 8 20 8"/><line x1="16" x2="8" y1="13" y2="13"/><line x1="16" x2="8" y1="17" y2="17"/><line x1="10" x2="8" y1="9" y2="9"/></svg>`,zap:d`<svg viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>`,monitor:d`<svg viewBox="0 0 24 24"><rect width="20" height="14" x="2" y="3" rx="2"/><line x1="8" x2="16" y1="21" y2="21"/><line x1="12" x2="12" y1="17" y2="21"/></svg>`,settings:d`<svg viewBox="0 0 24 24"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"/><circle cx="12" cy="12" r="3"/></svg>`,bug:d`<svg viewBox="0 0 24 24"><path d="m8 2 1.88 1.88"/><path d="M14.12 3.88 16 2"/><path d="M9 7.13v-1a3.003 3.003 0 1 1 6 0v1"/><path d="M12 20c-3.3 0-6-2.7-6-6v-3a4 4 0 0 1 4-4h4a4 4 0 0 1 4 4v3c0 3.3-2.7 6-6 6"/><path d="M12 20v-9"/><path d="M6.53 9C4.6 8.8 3 7.1 3 5"/><path d="M6 13H2"/><path d="M3 21c0-2.1 1.7-3.9 3.8-4"/><path d="M20.97 5c0 2.1-1.6 3.8-3.5 4"/><path d="M22 13h-4"/><path d="M17.2 17c2.1.1 3.8 1.9 3.8 4"/></svg>`,scrollText:d`<svg viewBox="0 0 24 24"><path d="M8 21h12a2 2 0 0 0 2-2v-2H10v2a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v3h4"/><path d="M19 17V5a2 2 0 0 0-2-2H4"/><path d="M15 8h-5"/><path d="M15 12h-5"/></svg>`,folder:d`<svg viewBox="0 0 24 24"><path d="M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z"/></svg>`,users:d`<svg viewBox="0 0 24 24"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M22 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>`,menu:d`<svg viewBox="0 0 24 24"><line x1="4" x2="20" y1="12" y2="12"/><line x1="4" x2="20" y1="6" y2="6"/><line x1="4" x2="20" y1="18" y2="18"/></svg>`,x:d`<svg viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`,check:d`<svg viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>`,copy:d`<svg viewBox="0 0 24 24"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>`,search:d`<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>`,brain:d`<svg viewBox="0 0 24 24"><path d="M12 5a3 3 0 1 0-5.997.125 4 4 0 0 0-2.526 5.77 4 4 0 0 0 .556 6.588A4 4 0 1 0 12 18Z"/><path d="M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.526 5.77 4 4 0 0 1-.556 6.588A4 4 0 1 1 12 18Z"/><path d="M15 13a4.5 4.5 0 0 1-3-4 4.5 4.5 0 0 1-3 4"/><path d="M17.599 6.5a3 3 0 0 0 .399-1.375"/><path d="M6.003 5.125A3 3 0 0 0 6.401 6.5"/><path d="M3.477 10.896a4 4 0 0 1 .585-.396"/><path d="M19.938 10.5a4 4 0 0 1 .585.396"/><path d="M6 18a4 4 0 0 1-1.967-.516"/><path d="M19.967 17.484A4 4 0 0 1 18 18"/></svg>`,book:d`<svg viewBox="0 0 24 24"><path d="M4 19.5v-15A2.5 2.5 0 0 1 6.5 2H20v20H6.5a2.5 2.5 0 0 1 0-5H20"/></svg>`,loader:d`<svg viewBox="0 0 24 24"><path d="M12 2v4"/><path d="m16.2 7.8 2.9-2.9"/><path d="M18 12h4"/><path d="m16.2 16.2 2.9 2.9"/><path d="M12 18v4"/><path d="m4.9 19.1 2.9-2.9"/><path d="M2 12h4"/><path d="m4.9 4.9 2.9 2.9"/></svg>`,rotateCw:d`<svg viewBox="0 0 24 24"><path d="M21 12a9 9 0 1 1-9-9c2.52 0 4.93 1 6.74 2.74L21 8"/><path d="M21 3v5h-5"/></svg>`,download:d`<svg viewBox="0 0 24 24"><path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/><polyline points="7 10 12 15 17 10"/><line x1="12" x2="12" y1="15" y2="3"/></svg>`,wrench:d`<svg viewBox="0 0 24 24"><path d="M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z"/></svg>`,fileCode:d`<svg viewBox="0 0 24 24"><path d="M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5L14.5 2z"/><polyline points="14 2 14 8 20 8"/><path d="m10 13-2 2 2 2"/><path d="m14 17 2-2-2-2"/></svg>`,edit:d`<svg viewBox="0 0 24 24"><path d="M11 4H4a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h14a2 2 0 0 0 2-2v-7"/><path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/></svg>`,penLine:d`<svg viewBox="0 0 24 24"><path d="M12 20h9"/><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/></svg>`,paperclip:d`<svg viewBox="0 0 24 24"><path d="m21.44 11.05-9.19 9.19a6 6 0 0 1-8.49-8.49l8.57-8.57A4 4 0 1 1 18 8.84l-8.59 8.57a2 2 0 0 1-2.83-2.83l8.49-8.48"/></svg>`,globe:d`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>`,image:d`<svg viewBox="0 0 24 24"><rect width="18" height="18" x="3" y="3" rx="2" ry="2"/><circle cx="9" cy="9" r="2"/><path d="m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21"/></svg>`,smartphone:d`<svg viewBox="0 0 24 24"><rect width="14" height="20" x="5" y="2" rx="2" ry="2"/><path d="M12 18h.01"/></svg>`,plug:d`<svg viewBox="0 0 24 24"><path d="M12 22v-5"/><path d="M9 8V2"/><path d="M15 8V2"/><path d="M18 8v5a4 4 0 0 1-4 4h-4a4 4 0 0 1-4-4V8Z"/></svg>`,circle:d`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/></svg>`,puzzle:d`<svg viewBox="0 0 24 24"><path d="M19.439 7.85c-.049.322.059.648.289.878l1.568 1.568c.47.47.706 1.087.706 1.704s-.235 1.233-.706 1.704l-1.611 1.611a.98.98 0 0 1-.837.276c-.47-.07-.802-.48-.968-.925a2.501 2.501 0 1 0-3.214 3.214c.446.166.855.497.925.968a.979.979 0 0 1-.276.837l-1.61 1.61a2.404 2.404 0 0 1-1.705.707 2.402 2.402 0 0 1-1.704-.706l-1.568-1.568a1.026 1.026 0 0 0-.877-.29c-.493.074-.84.504-1.02.968a2.5 2.5 0 1 1-3.237-3.237c.464-.18.894-.527.967-1.02a1.026 1.026 0 0 0-.289-.877l-1.568-1.568A2.402 2.402 0 0 1 1.998 12c0-.617.236-1.234.706-1.704L4.23 8.77c.24-.24.581-.353.917-.303.515.076.874.54 1.02 1.02a2.5 2.5 0 1 0 3.237-3.237c-.48-.146-.944-.505-1.02-1.02a.98.98 0 0 1 .303-.917l1.526-1.526A2.402 2.402 0 0 1 11.998 2c.617 0 1.234.236 1.704.706l1.568 1.568c.23.23.556.338.877.29.493-.074.84-.504 1.02-.968a2.5 2.5 0 1 1 3.236 3.236c-.464.18-.894.527-.967 1.02Z"/></svg>`,info:d`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M12 16v-4"/><path d="M12 8h.01"/></svg>`,send:d`<svg viewBox="0 0 24 24"><path d="m22 2-7 20-4-9-9-4Z"/><path d="M22 2 11 13"/></svg>`,smile:d`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="M8 14s1.5 2 4 2 4-2 4-2"/><line x1="9" y1="9" x2="9.01" y2="9"/><line x1="15" y1="9" x2="15.01" y2="9"/></svg>`,slidersHorizontal:d`<svg viewBox="0 0 24 24"><line x1="21" x2="14" y1="4" y2="4"/><line x1="10" x2="3" y1="4" y2="4"/><line x1="21" x2="12" y1="12" y2="12"/><line x1="8" x2="3" y1="12" y2="12"/><line x1="21" x2="16" y1="20" y2="20"/><line x1="12" x2="3" y1="20" y2="20"/><line x1="14" x2="14" y1="2" y2="6"/><line x1="8" x2="8" y1="10" y2="14"/><line x1="16" x2="16" y1="18" y2="22"/></svg>`,square:d`<svg viewBox="0 0 24 24"><rect width="14" height="14" x="5" y="5" rx="2"/></svg>`,eye:d`<svg viewBox="0 0 24 24"><path d="M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z"/><circle cx="12" cy="12" r="3"/></svg>`,eyeOff:d`<svg viewBox="0 0 24 24"><path d="M9.88 9.88a3 3 0 1 0 4.24 4.24"/><path d="M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68"/><path d="M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61"/><line x1="2" x2="22" y1="2" y2="22"/></svg>`,trash:d`<svg viewBox="0 0 24 24"><path d="M3 6h18"/><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/></svg>`,chevronDown:d`<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg>`,film:d`<svg viewBox="0 0 24 24"><rect width="18" height="18" x="3" y="3" rx="2"/><path d="M7 3v18"/><path d="M3 7.5h4"/><path d="M3 12h18"/><path d="M3 16.5h4"/><path d="M17 3v18"/><path d="M17 7.5h4"/><path d="M17 16.5h4"/></svg>`},Rp="Taskmaster",Ip="/taskmaster-icon.png",xl="#00d4ff";let xn=null;function Oe(){return xn||(xn={name:window.__TASKMASTER_BRAND_NAME__||Rp,iconUrl:window.__TASKMASTER_BRAND_ICON_URL__||Ip,accentColor:window.__TASKMASTER_ACCENT_COLOR__||xl},xn)}function Np(e){const t=/^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/i.exec(e);return t?`${parseInt(t[1],16)}, ${parseInt(t[2],16)}, ${parseInt(t[3],16)}`:null}function Dp(e){if(e===xl)return;const t=Np(e);if(!t)return;const n=document.documentElement;n.style.setProperty("--accent",e),n.style.setProperty("--accent-hover",e),n.style.setProperty("--accent-muted",e),n.style.setProperty("--primary",e),n.style.setProperty("--ring",e),n.style.setProperty("--accent-subtle",`rgba(${t}, 0.15)`),n.style.setProperty("--accent-glow",`rgba(${t}, 0.25)`),n.style.setProperty("--tasker-orange",e),n.style.setProperty("--tasker-orange-hover",e),n.style.setProperty("--tasker-orange-glow",`rgba(${t}, 0.25)`)}const Op=d`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="11" width="18" height="11" rx="2" ry="2"></rect><path d="M7 11V7a5 5 0 0 1 10 0v4"></path></svg>`;let mr=!1;function Bp(){mr||(mr=!0,document.addEventListener("click",e=>{const t=document.getElementById("nav-burger-toggle");!t?.checked||t.closest(".setup-header")?.contains(e.target)||(t.checked=!1)}))}function tt(e,t){const n=(a,c)=>a===e?d`<span class="sp-page-nav-current">${a}</span>`:d`<a href=${c}>${a}</a>`,s=d`
19
- ${n("Setup","/setup")}
20
- ${n("Chat","/chat")}
21
- ${n("Admins","/admins")}
22
- ${n("Customers","/customers")}
23
- ${n("Files","/files")}
24
- ${n("Browser","/browser")}
25
- ${n("Advanced","/advanced")}
26
- `,o=t&&(t.isMaster!==!1||!t.hasPins)?Fp(t):b,r=t?.hasPins&&t.onLogout?d`<button class="nav-logout-btn" @click=${t.onLogout} title="Lock">${Op}</button>`:b,l=()=>{const a=document.getElementById("nav-burger-toggle");a&&(a.checked=!1)};return Bp(),d`
27
- <div class="setup-header">
28
- <input type="checkbox" id="nav-burger-toggle" class="nav-burger-checkbox" />
29
- <div class="setup-header-inner">
30
- <img class="setup-header-logo" src="${Oe().iconUrl}" alt="${Oe().name}" />
31
- <nav class="setup-header-nav">
32
- ${s}
33
- </nav>
34
- <div class="setup-header-right">
35
- ${o!==b?d`<span class="nav-selector-inline">${o}</span>`:b}
36
- ${r}
37
- <label for="nav-burger-toggle" class="nav-burger-button" aria-label="Toggle menu">
38
- <span class="nav-burger-icon"></span>
39
- </label>
40
- </div>
41
- </div>
42
- <nav class="setup-header-dropdown" @click=${l}>
43
- ${o!==b?d`<div class="nav-selector-mobile">${o}</div>`:b}
44
- ${s}
45
- </nav>
46
- </div>
47
- `}function Fp(e){const{workspaces:t,selectedWorkspace:n,onWorkspaceSelect:s}=e;return d`
48
- <select
49
- class="sp-workspace-selector"
50
- .value=${n??""}
51
- @change=${o=>{const r=o.target,l=r.value;if(l==="__add__"){r.value=n??"",e.onAddAccount?e.onAddAccount():window.location.href="/setup";return}s(l)}}
52
- >
53
- ${t.map(o=>d`
54
- <option value=${o.name} ?selected=${o.name===n}>
55
- ${o.displayName??o.name}
56
- </option>
57
- `)}
58
- <option disabled>───</option>
59
- <option value="__add__">+ Add Account</option>
60
- </select>
61
- `}function Up(e){return e.connected?d`
62
- <div class="setup-container">
63
- ${tt("Browser")}
64
- <div class="setup-card sp-card-wide">
65
- <h1>Remote Browser</h1>
66
- <p style="margin-bottom: 16px;">Live view of the headless Chrome instance.</p>
67
-
68
- <div class="sp-toolbar">
69
- ${e.active?d`
70
- <button
71
- class="setup-button ${e.inputMode?"primary":"secondary"}"
72
- style="padding: 10px 20px; font-size: 14px;"
73
- @click=${e.onToggleInput}
74
- >
75
- ${e.inputMode?"Input: ON":"Input: OFF"}
76
- </button>
77
- <button
78
- class="setup-button danger"
79
- style="padding: 10px 20px; font-size: 14px;"
80
- ?disabled=${e.loading}
81
- @click=${e.onStop}
82
- >
83
- Stop
84
- </button>
85
- `:d`
86
- <button
87
- class="setup-button primary"
88
- style="padding: 10px 20px; font-size: 14px;"
89
- ?disabled=${e.loading}
90
- @click=${e.onStart}
91
- >
92
- ${e.loading?"Starting...":"Start"}
93
- </button>
94
- `}
95
- </div>
96
-
97
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
98
-
99
- ${e.handoffPending?d`
100
- <div class="setup-warning" style="margin-top: 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; text-align: left;">
101
- <div>
102
- <strong>Action required:</strong> ${e.handoffReason??"The agent needs you to complete an action in the browser."}
103
- </div>
104
- <button class="setup-button primary" style="flex-shrink: 0; padding: 10px 20px; font-size: 14px;" @click=${e.onCompleteHandoff}>
105
- Done
106
- </button>
107
- </div>
108
- `:b}
109
-
110
- <div class="sp-canvas-area" style="margin-top: 16px;">
111
- ${e.active?d`
112
- <div class="sp-canvas-wrap ${e.inputMode?"sp-input-active":""}">
113
- <canvas
114
- id="browser-screencast-canvas"
115
- class="sp-canvas"
116
- tabindex="0"
117
- @mousedown=${t=>e.onCanvasMouseDown(t)}
118
- @mouseup=${t=>e.onCanvasMouseUp(t)}
119
- @mousemove=${t=>e.onCanvasMouseMove(t)}
120
- @keydown=${t=>{t.preventDefault(),e.onCanvasKeyDown(t)}}
121
- @keyup=${t=>{t.preventDefault(),e.onCanvasKeyUp(t)}}
122
- @contextmenu=${t=>t.preventDefault()}
123
- ></canvas>
124
- </div>
125
- `:d`
126
- <div class="sp-canvas-placeholder">
127
- <div class="sp-canvas-placeholder-icon">${N.globe}</div>
128
- <p>Click Start to begin streaming the Chrome viewport.</p>
129
- </div>
130
- `}
131
- </div>
132
-
133
- ${e.active&&e.inputMode?d`<p class="setup-hint" style="margin-top: 12px;">
134
- Click the canvas to focus, then interact with the browser. Mouse and keyboard input are forwarded.
135
- </p>`:b}
136
-
137
- </div>
138
- </div>
139
- `:d`
140
- <div class="setup-container">
141
- <div class="setup-card">
142
- <div class="setup-spinner"></div>
143
- <p>Connecting to gateway...</p>
144
- </div>
145
- </div>
146
- `}const Gn="application/x-taskmaster-file-path";function Al(e){return e==null?"":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function $l(e){const t=e.split("/");return t.length>1?t.slice(0,-1).join("/"):"."}function Wp(e,t,n){e.preventDefault(),e.stopPropagation(),e.currentTarget.classList.remove("sp-drop-target");const s=e.dataTransfer?.getData(Gn);if(s){$l(s)!==t&&n.onMoveToDir(s,t);return}const i=e.dataTransfer?.files;if(i&&i.length>0){const o=Array.from(i).filter(r=>r.name.toLowerCase().endsWith(".md"));o.length>0&&n.onUpload(t,o)}}function El(e,t,n){const s=e.type==="directory"||e.type==="symlink"&&e.children!=null,i=t.expandedDirs.has(e.path),o=t.selectedPaths.has(e.path),r=n*20+12;return s?d`
147
- <div
148
- class="sp-tree-item sp-tree-dir ${i?"expanded":""}"
149
- style="padding-left: ${r}px;"
150
- @click=${()=>t.onToggleDir(e.path)}
151
- @dragover=${l=>{l.preventDefault(),l.stopPropagation(),l.dataTransfer&&(l.dataTransfer.dropEffect="move"),l.currentTarget.classList.add("sp-drop-target")}}
152
- @dragleave=${l=>{l.currentTarget.classList.remove("sp-drop-target")}}
153
- @drop=${l=>Wp(l,e.path,t)}
154
- >
155
- <span class="sp-tree-chevron">${i?"−":"+"}</span>
156
- <span class="sp-tree-icon">${N.folder}</span>
157
- <span class="sp-tree-name">${e.name}</span>
158
- </div>
159
- ${i&&e.children?e.children.map(l=>El(l,t,n+1)):b}
160
- `:d`
161
- <div
162
- class="sp-tree-item sp-tree-file ${o?"selected":""}"
163
- style="padding-left: ${r}px;"
164
- draggable="true"
165
- @click=${l=>{l.metaKey||l.ctrlKey?t.onToggleSelectFile(e.path):t.onSelectFile(e.path)}}
166
- @dragstart=${l=>{l.dataTransfer&&(l.dataTransfer.effectAllowed="move",l.dataTransfer.setData(Gn,e.path),l.dataTransfer.setData("text/plain",e.name))}}
167
- >
168
- <span class="sp-tree-icon">${N.fileText}</span>
169
- <span class="sp-tree-name">${e.name}</span>
170
- <span class="sp-tree-size">${Al(e.size)}</span>
171
- </div>
172
- `}function Kp(e){const t=e.selectedPaths.size;return t<2?b:d`
173
- <div class="sp-bulk-actions">
174
- <span style="color: var(--tasker-muted-grey); font-size: 13px;">${t} files selected</span>
175
- <button
176
- class="setup-button secondary"
177
- style="padding: 8px 16px; font-size: 13px;"
178
- @click=${e.onBulkDownload}
179
- >
180
- Download ${t} files
181
- </button>
182
- </div>
183
- `}function zp(e){if(e.selectedPaths.size!==1||!e.selectedPath)return b;if(e.previewLoading)return d`
184
- <div class="sp-file-preview">
185
- <div class="setup-spinner" style="width: 32px; height: 32px; margin: 24px auto;"></div>
186
- </div>
187
- `;const t=e.selectedPath.split("/").pop()??e.selectedPath;return d`
188
- <div class="sp-file-preview">
189
- <div class="sp-file-preview-header">
190
- <div>
191
- <strong>${t}</strong>
192
- <div class="sp-file-preview-meta">
193
- ${e.selectedPath}${e.previewSize!=null?` — ${Al(e.previewSize)}`:""}
194
- </div>
195
- </div>
196
- <div class="sp-file-actions">
197
- <button class="setup-button secondary" style="padding: 8px 16px; font-size: 13px;" @click=${()=>e.onDownload(e.selectedPath)}>
198
- Download
199
- </button>
200
- <button class="setup-button secondary" style="padding: 8px 16px; font-size: 13px;" @click=${()=>{const n=prompt("Move to (relative path):",e.selectedPath);n&&n!==e.selectedPath&&e.onMove(e.selectedPath,n)}}>
201
- Move
202
- </button>
203
- <button class="setup-button danger" style="padding: 8px 16px; font-size: 13px;" @click=${()=>{confirm(`Delete ${t}?`)&&e.onDelete(e.selectedPath)}}>
204
- Delete
205
- </button>
206
- </div>
207
- </div>
208
- ${e.previewBinary?d`<div class="sp-file-preview-body"><p style="color: var(--tasker-muted-grey);">Binary file — use Download to view.</p></div>`:e.previewContent!=null?d`<div class="sp-file-preview-body"><pre class="sp-file-code">${e.previewContent}</pre></div>`:d`<div class="sp-file-preview-body"><p style="color: var(--tasker-muted-grey);">File too large for preview — use Download.</p></div>`}
209
- </div>
210
- `}function jp(e){if(!e.selectedPath)return".";if(e.expandedDirs.has(e.selectedPath))return e.selectedPath;const t=e.selectedPath.split("/");return t.length>1?t.slice(0,-1).join("/"):"."}function Hp(e){const t=jp(e);return e.connected?d`
211
- <div class="setup-container">
212
- ${tt("Files",e.wsProps)}
213
- <div class="setup-card sp-card-wide">
214
- <h1>Workspace Files</h1>
215
- <p style="margin-bottom: 16px;">Browse, upload, and manage files in your workspace. Drag files between folders to move them.</p>
216
-
217
- <div class="sp-toolbar">
218
- <label class="setup-button secondary" style="padding: 10px 20px; font-size: 14px; cursor: pointer;">
219
- Upload
220
- <input
221
- type="file"
222
- multiple
223
- accept=".md"
224
- style="display: none;"
225
- @change=${n=>{const s=n.target;s.files&&s.files.length>0&&(e.onUpload(t,Array.from(s.files)),s.value="")}}
226
- />
227
- </label>
228
- <button
229
- class="setup-button secondary"
230
- style="padding: 10px 20px; font-size: 14px;"
231
- ?disabled=${e.loading}
232
- @click=${e.onRefresh}
233
- >
234
- ${e.loading?"Loading...":"Refresh"}
235
- </button>
236
- <button
237
- class="setup-button secondary"
238
- style="padding: 10px 20px; font-size: 14px;"
239
- ?disabled=${e.reindexBusy}
240
- @click=${e.onReindex}
241
- >
242
- ${e.reindexBusy?"Re-indexing...":"Re-index"}
243
- </button>
244
- ${e.memoryStatus?d`<span style="display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--tasker-text-grey);">
245
- <span
246
- class="setup-status-light"
247
- style="width: 10px; height: 10px; background: ${e.memoryStatus.dirty?"#ef4444":"#22c55e"}"
248
- ></span>
249
- ${e.memoryStatus.files} files, ${e.memoryStatus.chunks} chunks
250
- </span>`:b}
251
- </div>
252
-
253
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
254
-
255
- ${e.message?d`<div class="${e.message.kind==="error"?"setup-error":"setup-success-message"}" style="margin-top: 12px;">
256
- ${e.message.text}
257
- </div>`:b}
258
-
259
- ${e.uploadBusy?d`<div style="margin-top: 12px; color: var(--tasker-orange); font-weight: 600; font-size: 14px;">Uploading...</div>`:b}
260
-
261
- <div
262
- class="sp-file-tree"
263
- @dragover=${n=>{n.preventDefault(),n.dataTransfer&&(n.dataTransfer.dropEffect=n.dataTransfer.types.includes(Gn)?"move":"copy")}}
264
- @drop=${n=>{n.preventDefault();const s=n.dataTransfer?.getData(Gn);if(s){$l(s)!=="."&&e.onMoveToDir(s,".");return}const i=n.dataTransfer?.files;if(i&&i.length>0){const o=Array.from(i).filter(r=>r.name.toLowerCase().endsWith(".md"));o.length>0&&e.onUpload(t,o)}}}
265
- >
266
- ${e.tree.length===0&&!e.loading?d`<div style="padding: 24px; color: var(--tasker-muted-grey); text-align: center;">No files found. Drop .md files here to upload.</div>`:e.tree.map(n=>El(n,e,0))}
267
- </div>
268
-
269
- ${Kp(e)}
270
- ${zp(e)}
271
- </div>
272
- </div>
273
- `:d`
274
- <div class="setup-container">
275
- <div class="setup-card">
276
- <div class="setup-spinner"></div>
277
- <p>Connecting to gateway...</p>
278
- </div>
279
- </div>
280
- `}const ao="taskmaster_uninstall_done";async function qp(e){if(!(!e.client||!e.connected)&&!e.uninstallBusy){e.uninstallBusy=!0,e.uninstallError=null,e.requestUpdate?.(),Vp();try{await e.client.request("system.uninstall",{scopes:["service","state","workspace"],purge:!0})}catch{}e.uninstallBusy=!1,e.uninstallDone=!0,e.requestUpdate?.()}}function Tl(){try{return localStorage.getItem(ao)==="1"}catch{return!1}}function Gp(){try{localStorage.removeItem(ao)}catch{}}function Vp(){try{localStorage.setItem(ao,"1")}catch{}}const yr=Object.freeze(Object.defineProperty({__proto__:null,checkUninstallDone:Tl,clearUninstallDone:Gp,runUninstall:qp},Symbol.toStringTag,{value:"Module"}));function le(e){return d`
281
- <span
282
- class="setup-status-light"
283
- style="background: ${{good:"#22c55e",bad:"#ef4444",partial:"#eab308",unknown:"#6b7280"}[e]}"
284
- ></span>
285
- `}function xt(e,t){return d`
286
- <button
287
- class="setup-info-btn"
288
- @click=${()=>t.onInfoModalOpen(e)}
289
- title="Details"
290
- >
291
- ${N.info}
292
- </button>
293
- `}function Yp(e){if(!e.infoModalOpen)return b;let t="",n=[];switch(e.infoModalOpen){case"gateway":{const s=typeof window<"u"?window.location.host:"unknown";t="Gateway",n=[{label:"Status",value:e.gatewayHealthy===!1?"Stopped":"Running"},{label:"Address",value:s},{label:"Health",value:e.gatewayHealthMessage||"OK"}];break}case"claude":{const s=e.authExpiresIn;let i="N/A";if(s!=null&&s>0)if(s>60){const o=Math.floor(s/60),r=s%60;i=r>0?`${o}h ${r}m`:`${o}h`}else i=`${s}m`;t="Claude",n=[{label:"Connected",value:e.authConnected?"Yes":"No"},{label:"Token Expiry",value:i},{label:"Renewal",value:"Automatic (tokens refresh on expiry)"},...e.authMessage?[{label:"Message",value:e.authMessage}]:[]];break}case"license":{const s=e.licenseStoredKey?`…${e.licenseStoredKey.slice(-12)}`:"N/A";t="License",n=[{label:"Status",value:e.licenseValid?"Active":"Inactive"},{label:"Key",value:s},{label:"Tier",value:e.licenseTier||"Standard"},{label:"Device ID",value:e.licenseDeviceId||"N/A"}];break}case"whatsapp":{const s=At(e),i=s?lo(s,e):null;t="WhatsApp",n=[{label:"Account",value:i?.name||i?.accountId||"Default"},{label:"Phone",value:i?.self?.e164||"Not paired"},{label:"Connected",value:i?.connected?"Yes":"No"},{label:"Linked",value:i?.linked?"Yes":"No"},...i?.lastError?[{label:"Last Error",value:i.lastError}]:[]];break}case"imessage":{const{thisWsOwns:s}=co(e);t="iMessage",n=[{label:"Connected",value:s&&e.imessageConnected?"Yes":"No"},{label:"Assigned To",value:e.imessageOwnerWorkspace??"Not assigned"},{label:"Mode",value:"Self-chat only"},...e.imessageLastError?[{label:"Last Error",value:e.imessageLastError}]:[]];break}case"update":{t="Software Update",n=[{label:"Current",value:e.currentVersion?`v${e.currentVersion}`:"Unknown"},{label:"Latest",value:e.latestVersion?`v${e.latestVersion}`:"Unknown"},{label:"Status",value:e.updateAvailable===null?"Not checked":e.updateAvailable?"Update available":"Up to date"},...e.updateMessage?[{label:"Message",value:e.updateMessage}]:[]];break}default:return b}return d`
294
- <div class="setup-info-overlay" @click=${s=>{s.target.classList.contains("setup-info-overlay")&&e.onInfoModalClose()}}>
295
- <div class="setup-info-card">
296
- <h3>${t}</h3>
297
- ${n.map(s=>d`
298
- <div class="setup-info-row">
299
- <span class="setup-info-label">${s.label}</span>
300
- <span class="setup-info-value">${s.value}</span>
301
- </div>
302
- `)}
303
- <button
304
- class="setup-button secondary"
305
- style="margin-top: 16px; width: 100%; padding: 10px;"
306
- @click=${e.onInfoModalClose}
307
- >
308
- Close
309
- </button>
310
- </div>
311
- </div>
312
- `}function ge(e){const t=[{id:"license",label:"1. Activate License"},{id:"auth",label:"2. Connect Claude"},{id:"whatsapp",label:"3. Link WhatsApp"}],n=["license","auth","whatsapp","complete"],s=n.indexOf(e);return d`
313
- <div class="setup-steps">
314
- ${t.map(i=>{const o=n.indexOf(i.id),r=e===i.id,l=s>o;return d`
315
- <div
316
- class="setup-step ${r?"active":""} ${l?"completed":""}"
317
- >
318
- <span class="setup-step-dot"></span>
319
- <span class="setup-step-label">${i.label}</span>
320
- </div>
321
- `})}
322
- </div>
323
- `}function vr(e){const{licenseKey:t,licenseBusy:n,licenseValid:s,licenseMessage:i,licenseDeviceId:o,onLicenseKeyChange:r,onLicenseActivate:l}=e;return s===!0?d`
324
- <div class="setup-container">
325
- <div class="setup-card setup-success">
326
- ${ge("license")}
327
- <div class="setup-status-row">
328
- ${le("good")}
329
- <span>License Activated</span>
330
- </div>
331
- <p>${i??"Your license is active."}</p>
332
- </div>
333
- </div>
334
- `:n&&!t?d`
335
- <div class="setup-container">
336
- <div class="setup-card">
337
- ${ge("license")}
338
- <div class="setup-spinner"></div>
339
- <p>Checking license...</p>
340
- </div>
341
- </div>
342
- `:d`
343
- <div class="setup-container">
344
- <div class="setup-card">
345
- ${ge("license")}
346
- <h1>Activate License</h1>
347
- <p>Enter your license key to get started.</p>
348
- ${o?d`
349
- <div class="setup-device-id">
350
- <span class="setup-device-id-label">Your Device ID</span>
351
- <div class="setup-device-id-row">
352
- <code class="setup-device-id-value">${o}</code>
353
- <button
354
- class="setup-device-id-copy"
355
- title="Copy Device ID"
356
- @click=${async a=>{const c=a.currentTarget;try{await navigator.clipboard.writeText(o),c.textContent="Copied!",setTimeout(()=>{c.textContent="Copy"},1500)}catch{const u=document.createElement("textarea");u.value=o,u.style.position="fixed",u.style.opacity="0",document.body.appendChild(u),u.select(),document.execCommand("copy"),document.body.removeChild(u),c.textContent="Copied!",setTimeout(()=>{c.textContent="Copy"},1500)}}}
357
- >Copy</button>
358
- </div>
359
- <p class="setup-hint" style="margin-top: 4px;">
360
- Send this ID along with your order number to our WhatsApp to receive your license key.
361
- </p>
362
- </div>
363
- `:b}
364
- <div class="setup-code-input">
365
- <input
366
- type="text"
367
- placeholder="Paste your license key here"
368
- .value=${t}
369
- @input=${a=>r(a.target.value)}
370
- @keydown=${a=>{a.key==="Enter"&&t.trim()&&l()}}
371
- />
372
- <button
373
- class="setup-button"
374
- ?disabled=${!t.trim()||n}
375
- @click=${l}
376
- >
377
- ${n?"Activating...":"Activate"}
378
- </button>
379
- </div>
380
- ${s===!1&&i?d`
381
- <div class="setup-status-row" style="margin-top: 12px;">
382
- ${le("bad")}
383
- <span class="setup-error">${i}</span>
384
- </div>
385
- `:b}
386
- <p class="setup-hint">
387
- Need a license?
388
- <a href="https://taskmaster.bot" target="_blank" rel="noopener">
389
- Purchase at taskmaster.bot
390
- </a>
391
- </p>
392
- </div>
393
- </div>
394
- `}function Qp(e){const{authConnected:t,authBusy:n,authMessage:s,authUrl:i,authCodeInput:o,authExpiresIn:r,onStartAuth:l,onSubmitAuthCode:a,onAuthCodeChange:c,onSkipToWhatsApp:u}=e;return t===!0?d`
395
- <div class="setup-container">
396
- <div class="setup-card setup-success">
397
- ${ge("auth")}
398
- <div class="setup-status-row">
399
- ${le("good")}
400
- <span>Claude Connected</span>
401
- </div>
402
- <p>
403
- Your Claude Pro subscription is linked.
404
- ${r?d`<br /><span class="setup-hint"
405
- >Expires in ${r} minutes</span
406
- >`:b}
407
- </p>
408
- <button class="setup-button primary" @click=${u}>
409
- Continue to WhatsApp →
410
- </button>
411
- </div>
412
- </div>
413
- `:n&&!i?d`
414
- <div class="setup-container">
415
- <div class="setup-card">
416
- ${ge("auth")}
417
- <div class="setup-spinner"></div>
418
- <p>Starting Claude connection...</p>
419
- </div>
420
- </div>
421
- `:i?d`
422
- <div class="setup-container">
423
- <div class="setup-card">
424
- ${ge("auth")}
425
- <h1>Connect to Claude</h1>
426
- <p>Click the button below to sign in with your Claude Pro account.</p>
427
- <a
428
- href=${i}
429
- target="_blank"
430
- rel="noopener"
431
- class="setup-button primary"
432
- >
433
- Sign in with Claude →
434
- </a>
435
- <div class="setup-divider">
436
- <span>Then enter the code shown</span>
437
- </div>
438
- <div class="setup-code-input">
439
- <input
440
- type="text"
441
- placeholder="Enter authorization code"
442
- .value=${o}
443
- @input=${p=>c(p.target.value)}
444
- @keydown=${p=>{p.key==="Enter"&&o.trim()&&a(o.trim())}}
445
- />
446
- <button
447
- class="setup-button"
448
- ?disabled=${!o.trim()||n}
449
- @click=${()=>a(o.trim())}
450
- >
451
- ${n?"Verifying...":"Submit"}
452
- </button>
453
- </div>
454
- ${s?d`<p class="setup-hint">${s}</p>`:b}
455
- <p class="setup-hint" style="margin-top: 16px;">
456
- <a href="#" class="setup-link" @click=${p=>{p.preventDefault(),e.onAuthApiKeyToggle()}}>
457
- Or use an API key instead
458
- </a>
459
- </p>
460
- </div>
461
- </div>
462
- `:e.authApiKeyMode?d`
463
- <div class="setup-container">
464
- <div class="setup-card">
465
- ${ge("auth")}
466
- <h1>Enter API Key</h1>
467
- <p>Paste your Anthropic API key below.</p>
468
- <div class="setup-code-input">
469
- <input
470
- type="password"
471
- placeholder="sk-ant-..."
472
- .value=${e.authApiKeyInput}
473
- @input=${p=>e.onAuthApiKeyChange(p.target.value)}
474
- @keydown=${p=>{p.key==="Enter"&&e.authApiKeyInput.trim()&&e.onAuthApiKeySubmit()}}
475
- ?disabled=${e.authApiKeyBusy}
476
- autofocus
477
- />
478
- <button
479
- class="setup-button"
480
- ?disabled=${!e.authApiKeyInput.trim()||e.authApiKeyBusy}
481
- @click=${()=>e.onAuthApiKeySubmit()}
482
- >${e.authApiKeyBusy?"Saving...":"Save"}</button>
483
- </div>
484
- ${e.authApiKeyError?d`<p class="setup-error">${e.authApiKeyError}</p>`:b}
485
- <p class="setup-hint" style="margin-top: 16px;">
486
- <a href="#" class="setup-link" @click=${p=>{p.preventDefault(),e.onAuthApiKeyToggle()}}>
487
- Use OAuth instead
488
- </a>
489
- </p>
490
- <p class="setup-hint">
491
- Get an API key from
492
- <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noopener">
493
- console.anthropic.com
494
- </a>
495
- </p>
496
- </div>
497
- </div>
498
- `:d`
499
- <div class="setup-container">
500
- <div class="setup-card">
501
- ${ge("auth")}
502
- <h1>Connect to Claude</h1>
503
- ${t===!1&&s?d`<p class="setup-error">${s}</p>`:d`<p>
504
- First, let's connect your Claude Pro subscription.<br />
505
- This powers your AI assistant.
506
- </p>`}
507
- <button class="setup-button primary" @click=${l}>
508
- Connect to Claude →
509
- </button>
510
- <p class="setup-hint" style="margin-top: 8px;">
511
- <a href="#" class="setup-link" @click=${p=>{p.preventDefault(),e.onAuthApiKeyToggle()}}>
512
- Or enter your API key
513
- </a>
514
- </p>
515
- <p class="setup-hint">
516
- Need a Claude subscription?
517
- <a href="https://claude.ai/upgrade" target="_blank" rel="noopener">
518
- Get Claude Pro
519
- </a>
520
- </p>
521
- </div>
522
- </div>
523
- `}function lo(e,t){const n=new Map(t.whatsappAccounts.map(s=>[s.accountId,s]));return e.whatsappAccountId?n.get(e.whatsappAccountId)??null:e.isDefault&&t.whatsappAccounts.length===1?t.whatsappAccounts[0]??null:null}function At(e){const t=e.wsProps?.selectedWorkspace;return t?e.workspaces.find(n=>n.name===t)??null:e.workspaces[0]??null}function br(e){const t=At(e),n=t?.displayName??t?.name??Oe().name,s=e.whatsappBusy||e.gatewayHealthLoading;if(e.renamingWorkspace&&t){const i=()=>{const o=e.renameWorkspaceName.trim();o&&e.onWorkspaceRename(t.name,o)};return d`
524
- <div style="display: flex; align-items: center; gap: 6px; margin-bottom: 4px;">
525
- <input
526
- type="text"
527
- .value=${e.renameWorkspaceName}
528
- @input=${o=>{e.renameWorkspaceName=o.target.value}}
529
- @keydown=${o=>{o.key==="Enter"&&i(),o.key==="Escape"&&e.onWorkspaceRenameCancel()}}
530
- style="flex: 1; font-size: 18px; font-weight: 600; background: var(--tasker-bg-input, rgba(255,255,255,0.08)); border: 1px solid var(--tasker-border, rgba(255,255,255,0.15)); border-radius: 6px; color: var(--tasker-white); padding: 4px 8px; outline: none;"
531
- autofocus
532
- />
533
- <button
534
- class="setup-status-action"
535
- @click=${i}
536
- title="Save"
537
- style="color: #22c55e;"
538
- >${N.check}</button>
539
- <button
540
- class="setup-status-action"
541
- @click=${e.onWorkspaceRenameCancel}
542
- title="Cancel"
543
- >${N.x}</button>
544
- </div>
545
- `}return d`
546
- <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px;">
547
- <div style="display: flex; align-items: center; gap: 6px;">
548
- <h2 style="margin: 0; font-size: 20px; font-weight: 600; color: var(--tasker-white);">${n}</h2>
549
- <button
550
- class="setup-status-action"
551
- @click=${e.onWorkspaceRenameStart}
552
- title="Rename"
553
- style="opacity: 0.5; transform: scale(0.8);"
554
- >${N.edit}</button>
555
- </div>
556
- <button
557
- class="setup-status-action ${s?"spinning":""}"
558
- ?disabled=${s}
559
- @click=${e.onRefreshStatus}
560
- title="Refresh Status"
561
- >
562
- ${N.rotateCw}
563
- </button>
564
- </div>
565
- `}function wr(e){return d`
566
- <div class="setup-status-item">
567
- ${le(e.gatewayHealthy===!1?"bad":"good")}
568
- <div class="setup-status-info">
569
- <strong>Gateway</strong>
570
- <span>${e.gatewayHealthMessage||"Running"}</span>
571
- </div>
572
- ${xt("gateway",e)}
573
- <button
574
- class="setup-status-action ${e.gatewayRestartBusy?"spinning":""}"
575
- ?disabled=${e.gatewayRestartBusy}
576
- @click=${e.onRestartGateway}
577
- title="Restart Gateway"
578
- >
579
- ${N.rotateCw}
580
- </button>
581
- </div>
582
- `}function kr(e){const t=e.authConnected===!0;return d`
583
- <div class="setup-status-item">
584
- ${le(t?"good":"bad")}
585
- <div class="setup-status-info">
586
- <strong>Claude</strong>
587
- <span>
588
- ${t?"Connected":"Not connected"}${t&&e.authExpiresIn?d` <span style="color: var(--tasker-text-grey); font-size: 12px;">(${e.authExpiresIn>60?`${Math.floor(e.authExpiresIn/60)}h ${e.authExpiresIn%60}m`:`${e.authExpiresIn}m`})</span>`:b}
589
- </span>
590
- </div>
591
- ${xt("claude",e)}
592
- ${t?d`
593
- <button
594
- class="setup-status-action ${e.authBusy?"spinning":""}"
595
- ?disabled=${e.authBusy}
596
- @click=${e.onStartAuth}
597
- title="Refresh Token"
598
- >
599
- ${N.rotateCw}
600
- </button>
601
- `:d`
602
- <button
603
- class="setup-status-action"
604
- @click=${e.onStartAuth}
605
- title="Connect Claude"
606
- >
607
- ${N.rotateCw}
608
- </button>
609
- `}
610
- </div>
611
- `}function Sr(e){return d`
612
- <div class="setup-status-item" style="flex-wrap: wrap;">
613
- ${le("good")}
614
- <div class="setup-status-info">
615
- <strong>License</strong>
616
- <span>Active</span>
617
- </div>
618
- ${xt("license",e)}
619
- <button
620
- class="setup-status-action"
621
- @click=${()=>{e.licenseRemoveConfirm?e.onLicenseRemoveCancel():e.onLicenseRemoveConfirm()}}
622
- title="Manage License"
623
- >
624
- ${N.rotateCw}
625
- </button>
626
- ${e.licenseRemoveConfirm?d`
627
- <div style="width: 100%; margin-top: 8px; margin-left: 30px;">
628
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 0 0 8px;">
629
- Removing your license will disable ${Oe().name} until you enter a new key.
630
- </p>
631
- <div style="display: flex; gap: 8px;">
632
- <button
633
- class="setup-button danger"
634
- style="font-size: 12px; padding: 4px 12px;"
635
- ?disabled=${e.licenseBusy}
636
- @click=${e.onLicenseRemove}
637
- >
638
- ${e.licenseBusy?"Removing…":"Remove License"}
639
- </button>
640
- <button
641
- class="setup-button secondary"
642
- style="font-size: 12px; padding: 4px 12px;"
643
- @click=${e.onLicenseRemoveCancel}
644
- >
645
- Cancel
646
- </button>
647
- </div>
648
- </div>
649
- `:b}
650
- </div>
651
- `}function xr(e){const t=At(e);if(!t)return b;const n=lo(t,e),s=n?.running&&n?.connected,i=n?.linked&&!s,o=!!n,r=s?"good":i?"partial":o?"bad":"unknown",l=s?"Connected":i?"Linked, not connected":o?n?.lastError||"Not connected":"Not paired",a=!n?.provider||n?.provider==="baileys",c=t.whatsappAccountId??(t.isDefault&&e.whatsappAccounts.length===1?e.whatsappAccounts[0]?.accountId:void 0),u=c!=null&&e.whatsappActiveQrAccountId===c;return d`
652
- <div class="setup-status-item" style="flex-wrap: wrap;">
653
- ${le(r)}
654
- <div class="setup-status-info">
655
- <div style="display: flex; align-items: center; gap: 4px;">
656
- <strong>WhatsApp</strong>
657
- ${o&&s?d`
658
- <button
659
- class="setup-status-action"
660
- @click=${e.onWhatsAppSettingsOpen}
661
- title="WhatsApp Settings"
662
- style="opacity: 0.5; transform: scale(0.75);"
663
- >
664
- ${N.settings}
665
- </button>
666
- `:b}
667
- </div>
668
- <span>${l}</span>
669
- </div>
670
- ${xt("whatsapp",e)}
671
- ${a&&c?d`
672
- <button
673
- class="setup-status-action ${e.whatsappBusy&&u?"spinning":""}"
674
- ?disabled=${e.whatsappBusy}
675
- @click=${()=>e.onWhatsAppRelink(c)}
676
- title="${s?"Relink":"Link"} WhatsApp"
677
- >
678
- ${N.rotateCw}
679
- </button>
680
- `:b}
681
- ${u&&e.whatsappLoginQrDataUrl?d`
682
- <div style="width: 100%; margin-top: 8px; margin-left: 30px;">
683
- <div class="setup-qr" style="display: inline-flex;">
684
- <img
685
- src=${e.whatsappLoginQrDataUrl}
686
- alt="WhatsApp QR"
687
- style="width: 140px; height: 140px;"
688
- />
689
- </div>
690
- ${e.whatsappLoginMessage?d`<p class="setup-hint" style="margin-top: 4px;">${e.whatsappLoginMessage}</p>`:b}
691
- </div>
692
- `:b}
693
- </div>
694
- `}const Xp=[{id:"claude-opus-4-6",shortName:"Opus"},{id:"claude-sonnet-4-5-20250929",shortName:"Sonnet"},{id:"claude-haiku-4-5-20251001",shortName:"Haiku"}],Zp="anthropic/claude-sonnet-4-5-20250929",Jp=[{value:"off",label:"Off"},{value:"minimal",label:"Minimal"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"}];function eh(e){if(!e.whatsappSettingsOpen)return b;const t=At(e);if(!t)return b;const n=lo(t,e),s=n?.running&&n?.connected;if(!n||!s)return b;const i=()=>e.onWhatsAppSettingsClose(),o=e.whatsappModelCatalog??[],r=new Set(o.filter(u=>u.provider==="anthropic").map(u=>u.id)),l=Xp.filter(u=>r.has(u.id)),a=e.whatsappModel??Zp,c=e.whatsappThinkingLevel??"off";return d`
695
- <div class="setup-info-overlay" @click=${u=>{u.target.classList.contains("setup-info-overlay")&&i()}}>
696
- <div class="setup-info-card" style="max-width: 360px;">
697
- <h3>Public Agent Settings</h3>
698
- <div style="display: flex; flex-direction: column; gap: 16px; margin-top: 12px;">
699
- <label style="display: flex; align-items: flex-start; gap: 8px; cursor: pointer;">
700
- <input
701
- type="checkbox"
702
- .checked=${e.whatsappDmPolicy!=="disabled"&&e.whatsappDmPolicy!==null}
703
- @change=${e.onWhatsAppDmToggle}
704
- style="accent-color: #22c55e; margin-top: 2px;"
705
- />
706
- <div>
707
- <div style="font-size: 13px; color: var(--tasker-white);">Enabled</div>
708
- <div style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;">Agent replies to 3rd party messages</div>
709
- </div>
710
- </label>
711
- <div style="border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;"></div>
712
- <label style="display: flex; align-items: flex-start; gap: 8px; cursor: pointer;">
713
- <input
714
- type="checkbox"
715
- .checked=${e.whatsappGroupPolicy==="open"}
716
- @change=${e.onWhatsAppGroupToggle}
717
- style="accent-color: #22c55e; margin-top: 2px;"
718
- />
719
- <div>
720
- <div style="font-size: 13px; color: var(--tasker-white);">Group chats</div>
721
- <div style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;">Agent responds in WhatsApp groups</div>
722
- </div>
723
- </label>
724
- ${e.whatsappGroupPolicy==="open"?d`
725
- <div style="display: flex; flex-direction: column; gap: 6px; padding-left: 24px;">
726
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
727
- <input
728
- type="radio"
729
- name="wa-group-mention"
730
- .checked=${e.whatsappGroupRequireMention}
731
- @change=${()=>e.onWhatsAppGroupMentionChange(!0)}
732
- style="accent-color: #22c55e;"
733
- />
734
- <div>
735
- <div style="font-size: 13px; color: var(--tasker-white);">When mentioned</div>
736
- <div style="font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;">Only responds when @mentioned</div>
737
- </div>
738
- </label>
739
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
740
- <input
741
- type="radio"
742
- name="wa-group-mention"
743
- .checked=${!e.whatsappGroupRequireMention}
744
- @change=${()=>e.onWhatsAppGroupMentionChange(!1)}
745
- style="accent-color: #22c55e;"
746
- />
747
- <div>
748
- <div style="font-size: 13px; color: var(--tasker-white);">Always respond</div>
749
- <div style="font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;">Responds to every message in groups</div>
750
- </div>
751
- </label>
752
- </div>
753
- `:b}
754
- <div style="border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;"></div>
755
- ${l.length>0?d`
756
- <div style="display: flex; align-items: center; gap: 8px;">
757
- <div style="font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;">Model</div>
758
- <select
759
- class="setup-model-select"
760
- style="flex: 1;"
761
- .value=${a}
762
- @change=${u=>{e.onWhatsAppModelChange(u.target.value)}}
763
- >
764
- ${l.map(u=>d`
765
- <option value=${"anthropic/"+u.id} ?selected=${a==="anthropic/"+u.id}>
766
- ${u.shortName}
767
- </option>
768
- `)}
769
- </select>
770
- </div>
771
- `:b}
772
- <div style="display: flex; align-items: center; gap: 8px;">
773
- <div style="font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;">Thinking</div>
774
- <select
775
- class="setup-model-select"
776
- style="flex: 1;"
777
- .value=${c}
778
- @change=${u=>{e.onWhatsAppThinkingChange(u.target.value)}}
779
- >
780
- ${Jp.map(u=>d`
781
- <option value=${u.value} ?selected=${c===u.value}>
782
- ${u.label}
783
- </option>
784
- `)}
785
- </select>
786
- </div>
787
- </div>
788
- <button
789
- class="setup-button secondary"
790
- style="margin-top: 20px; width: 100%; padding: 10px;"
791
- @click=${i}
792
- >
793
- Close
794
- </button>
795
- </div>
796
- </div>
797
- `}function co(e){const t=At(e),n=e.imessageOwnerWorkspace,s=!!(t&&n===t.name),i=!!(n&&t&&n!==t.name);return{selectedWs:t,ownerWs:n,thisWsOwns:s,anotherWsOwns:i}}function Ar(e){const{ownerWs:t,thisWsOwns:n,anotherWsOwns:s}=co(e);let i,o;return s?(i="partial",o=`Connected to ${t}`):n&&e.imessageConnected?(i="good",o="Connected"):n&&e.imessageRunning?(i="partial",o="Running, not connected"):n?(i="bad",o="Not running"):e.imessageConfigured?(i="unknown",o="Not connected"):(i="bad",o="Not configured"),d`
798
- <div class="setup-status-item" style="flex-wrap: wrap;">
799
- ${le(i)}
800
- <div class="setup-status-info">
801
- <strong>iMessage</strong>
802
- <span>${o}</span>
803
- </div>
804
- ${xt("imessage",e)}
805
- <button
806
- class="setup-status-action ${e.imessageEnabling?"spinning":""}"
807
- ?disabled=${e.imessageEnabling}
808
- @click=${e.onIMessageEnable}
809
- title="${n?"Manage iMessage":"Connect iMessage"}"
810
- >
811
- ${N.rotateCw}
812
- </button>
813
- ${b}
814
- </div>
815
- `}function th(e){if(!e.imessageEnableConfirm)return b;const{ownerWs:t,thisWsOwns:n,anotherWsOwns:s}=co(e),i=()=>{e.onIMessageEnableCancel()};return n?d`
816
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&i()}}>
817
- <div class="setup-info-card" style="text-align: center;">
818
- <h3>iMessage</h3>
819
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
820
- iMessage is connected to this business.
821
- </p>
822
- <p style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.6; margin-bottom: 16px;">
823
- Self-chat only. Third-party iMessage DMs are not processed.
824
- </p>
825
- <button
826
- class="setup-button secondary"
827
- style="width: 100%; padding: 10px; color: #ef4444; border-color: #ef4444;"
828
- ?disabled=${e.imessageEnabling}
829
- @click=${()=>{e.onIMessageDisconnect()}}
830
- >
831
- ${e.imessageEnabling?"Disconnecting…":"Disconnect iMessage"}
832
- </button>
833
- <button
834
- class="setup-button secondary"
835
- style="width: 100%; padding: 10px; margin-top: 8px;"
836
- @click=${i}
837
- >
838
- Close
839
- </button>
840
- </div>
841
- </div>
842
- `:s?d`
843
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&i()}}>
844
- <div class="setup-info-card" style="text-align: center;">
845
- <h3>Connect iMessage</h3>
846
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
847
- iMessage is currently connected to <strong style="text-transform: capitalize;">${t}</strong>.
848
- Move it to this business?
849
- </p>
850
- <button
851
- class="setup-button primary"
852
- style="width: 100%; padding: 10px;"
853
- ?disabled=${e.imessageEnabling}
854
- @click=${()=>{e.onIMessageReassign()}}
855
- >
856
- ${e.imessageEnabling?"Connecting…":"Connect to This Business"}
857
- </button>
858
- <button
859
- class="setup-button secondary"
860
- style="width: 100%; padding: 10px; margin-top: 8px;"
861
- @click=${i}
862
- >
863
- Cancel
864
- </button>
865
- </div>
866
- </div>
867
- `:d`
868
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&i()}}>
869
- <div class="setup-info-card" style="text-align: center;">
870
- <h3>Enable iMessage</h3>
871
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
872
- ${Oe().name} will respond to messages in Messages.app for this business.
873
- </p>
874
- <button
875
- class="setup-button primary"
876
- style="width: 100%; padding: 10px;"
877
- ?disabled=${e.imessageEnabling}
878
- @click=${()=>{e.onIMessageEnableConfirm()}}
879
- >
880
- ${e.imessageEnabling?"Connecting…":"Connect"}
881
- </button>
882
- <button
883
- class="setup-button secondary"
884
- style="width: 100%; padding: 10px; margin-top: 8px;"
885
- @click=${i}
886
- >
887
- Cancel
888
- </button>
889
- </div>
890
- </div>
891
- `}function $r(e){if(!e.isMaster)return b;const t=e.apiKeyProviders,n=t.filter(i=>i.hasKey).length,s=t.length;return d`
892
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
893
- <div class="setup-status-item">
894
- ${le(n>0?"good":"bad")}
895
- <div class="setup-status-info">
896
- <strong>API Keys</strong>
897
- <span>${n} of ${s} configured</span>
898
- </div>
899
- <button
900
- class="setup-link-btn"
901
- @click=${()=>e.onApiKeyModalOpen()}
902
- >Manage</button>
903
- </div>
904
- </div>
905
- ${nh(e)}
906
- `}function nh(e){if(!e.apiKeyModalOpen)return b;const t=e.apiKeyProviders,n={};for(const r of t)r.key&&(n[r.id]=r.key);const s=(r,l)=>{const u=l?.closest(".setup-apikey-input")?.querySelector("input")?.value.trim();!u||u===n[r]||e.onApiKeySave(r,u)},i=r=>{const l=r.currentTarget,c=l.closest(".setup-apikey-input")?.querySelector("input");if(!c)return;const u=c.type==="text";c.type=u?"password":"text",l.classList.toggle("active",!u)},o=(r,l)=>{const a=l.target,c=a.closest(".setup-apikey-input"),u=a.value.trim(),p=u.length>0&&u!==n[r],m=c?.querySelector(".setup-apikey-save");m&&(m.style.display=p?"":"none");const v=c?.querySelector(".setup-apikey-eye");v&&(v.style.display=u.length>0?"":"none")};return d`
907
- <div class="setup-info-overlay" style="align-items: flex-start; padding-top: 72px;" @click=${r=>{r.target.classList.contains("setup-info-overlay")&&e.onApiKeyModalClose()}}>
908
- <div class="setup-info-card" style="max-width: 480px;">
909
- <h3 style="margin: 0 0 4px; text-align: center;">API Keys</h3>
910
- <div class="setup-apikey-list">
911
- ${e.apiKeyError?d`<p class="setup-error" style="margin: 0;">${e.apiKeyError}</p>`:b}
912
- ${e.apiKeySuccess?d`<p class="login-success" style="margin: 0;">${e.apiKeySuccess}</p>`:b}
913
- ${t.map(r=>d`
914
- <div class="setup-apikey-row">
915
- <div class="setup-apikey-info">
916
- <strong>${r.name}</strong>
917
- <span class="setup-apikey-category">${r.category}</span>
918
- </div>
919
- <div class="setup-apikey-input">
920
- <input
921
- type="password"
922
- .value=${r.key??""}
923
- placeholder="Enter key"
924
- ?disabled=${e.apiKeyBusy}
925
- @input=${l=>o(r.id,l)}
926
- @keydown=${l=>{l.key==="Enter"&&s(r.id,l.target)}}
927
- />
928
- <button
929
- class="setup-apikey-icon-btn setup-apikey-eye"
930
- style=${r.hasKey?"":"display: none;"}
931
- title="Toggle visibility"
932
- @click=${i}
933
- >${N.eye}</button>
934
- <button
935
- class="setup-apikey-save setup-button"
936
- style="display: none;"
937
- ?disabled=${e.apiKeyBusy}
938
- @click=${l=>s(r.id,l.currentTarget)}
939
- >Save</button>
940
- ${r.hasKey?d`
941
- <button
942
- class="setup-apikey-icon-btn danger"
943
- title="Remove key"
944
- ?disabled=${e.apiKeyBusy}
945
- @click=${()=>e.onApiKeyRemove(r.id)}
946
- >${N.trash}</button>
947
- `:b}
948
- </div>
949
- </div>
950
- `)}
951
- </div>
952
- </div>
953
- </div>
954
- `}function Er(e){const t=e.updateAvailable===null?"unknown":e.updateAvailable?"partial":"good",n=e.updateAvailable&&e.latestVersion?`v${e.currentVersion} → v${e.latestVersion}`:e.currentVersion?`v${e.currentVersion}`:"Unknown",s=e.updateChecking||e.updateRunning;return d`
955
- <div class="setup-status-item">
956
- ${le(t)}
957
- <div class="setup-status-info">
958
- <strong>Software</strong>
959
- <span>${n}</span>
960
- </div>
961
- ${xt("update",e)}
962
- ${e.updateAvailable?d`
963
- <button
964
- class="setup-status-action ${s?"spinning":""}"
965
- ?disabled=${s}
966
- @click=${e.onUpdateRun}
967
- title="Update Now"
968
- >
969
- ${N.download}
970
- </button>
971
- `:d`
972
- <button
973
- class="setup-status-action ${s?"spinning":""}"
974
- ?disabled=${s}
975
- @click=${e.onUpdateCheck}
976
- title="Check for Updates"
977
- >
978
- ${N.rotateCw}
979
- </button>
980
- `}
981
- </div>
982
- `}function sh(e){const t=e.updateRunning,n=e.updateLastResult;if(!t&&!n)return b;if(t)return d`
983
- <div class="setup-info-overlay">
984
- <div class="setup-info-card" style="max-width: 400px;">
985
- <h3>Software Update</h3>
986
- ${e.updateProgressSteps.length>0?d`
987
- <div class="setup-update-progress">
988
- ${e.updateProgressSteps.map(s=>d`
989
- <div class="setup-update-step ${s.status}">
990
- <span class="setup-update-step-icon">
991
- ${s.status==="running"?d`<span class="setup-update-spinner"></span>`:s.status==="done"?d`<span class="setup-update-check">&#10003;</span>`:d`<span class="setup-update-cross">&#10007;</span>`}
992
- </span>
993
- <span class="setup-update-step-name">${s.name}</span>
994
- ${s.durationMs!=null?d`<span class="setup-update-step-time">${Tr(s.durationMs)}</span>`:b}
995
- </div>
996
- `)}
997
- </div>
998
- `:d`<div class="setup-spinner" style="margin: 16px auto;"></div>`}
999
- ${e.updateMessage?d`<p style="text-align: center; color: var(--tasker-text-grey); font-size: 13px; margin: 12px 0 0;">${e.updateMessage}</p>`:b}
1000
- </div>
1001
- </div>
1002
- `;if(n){const s=n.status==="ok";let i;if(s){const r=n.before?.version,l=n.after?.version??n.currentVersion;i=r?`v${r} → v${l}`:`Updated to v${l}`}else i=n.reason??n.failedStep?.name??"unknown error";const o=n.durationMs!=null?Tr(n.durationMs):null;return d`
1003
- <div class="setup-info-overlay" @click=${r=>{r.target.classList.contains("setup-info-overlay")&&e.onUpdateDismissResult()}}>
1004
- <div class="setup-info-card" style="max-width: 360px; text-align: center;">
1005
- <div style="font-size: 40px; margin-bottom: 8px;">${s?"✓":"✗"}</div>
1006
- <h3 style="color: ${s?"#22c55e":"#ef4444"};">
1007
- ${s?"Update Complete":"Update Failed"}
1008
- </h3>
1009
- <p style="color: var(--tasker-text-grey); font-size: 14px; margin: 8px 0;">
1010
- ${i}
1011
- </p>
1012
- ${o?d`<p style="color: rgba(255,255,255,0.3); font-size: 12px; margin: 4px 0 0;">${o}</p>`:b}
1013
- <button
1014
- class="setup-button secondary"
1015
- style="margin-top: 20px; width: 100%; padding: 10px;"
1016
- @click=${e.onUpdateDismissResult}
1017
- >
1018
- Close
1019
- </button>
1020
- </div>
1021
- </div>
1022
- `}return b}function Tr(e){if(e<1e3)return`${e}ms`;const t=Math.round(e/1e3);if(t<60)return`${t}s`;const n=Math.floor(t/60),s=t%60;return s>0?`${n}m ${s}s`:`${n}m`}function ih(e){const t=e.accountHasPin;return d`
1023
- <div class="setup-status-item">
1024
- ${le(t?"good":"bad")}
1025
- <div class="setup-status-info">
1026
- <strong>Account PIN</strong>
1027
- <span>${t?"Set":"Not set"}</span>
1028
- </div>
1029
- <button
1030
- class="setup-link-btn"
1031
- @click=${()=>e.onAccountPinModalOpen()}
1032
- >${t?"Change":"Set PIN"}</button>
1033
- </div>
1034
- `}function oh(e){if(!e.accountPinModalOpen)return b;const t=e.accountHasPin,n=e.accountPinBusy;let s="",i="",o="";const r=c=>u=>{const p=u.target;p.value=p.value.replace(/\D/g,"").slice(0,6),c(p.value)},l=(c,u)=>{let p=c.querySelector(".pin-modal-validation");p||(p=document.createElement("p"),p.className="login-error pin-modal-validation",c.querySelector("button[type=submit]")?.before(p)),p.textContent=u},a=c=>{c.preventDefault();const u=c.target;if(!n){if(t&&!s){l(u,"Enter your current PIN");return}if(!i){l(u,"Enter a new PIN");return}if(!o){l(u,"Confirm your new PIN");return}if(i!==o){l(u,"PINs do not match");return}if(i.length<4){l(u,"PIN must be 4–6 digits");return}e.onAccountPinSave(t?s:null,i)}};return d`
1035
- <div class="setup-info-overlay" @click=${c=>{c.target.classList.contains("setup-info-overlay")&&e.onAccountPinModalClose()}}>
1036
- <div class="setup-info-card" style="max-width: 340px;">
1037
- <div class="setup-info-header">
1038
- <h3>${t?"Change Account PIN":"Set Account PIN"}</h3>
1039
- <button class="setup-info-close" @click=${()=>e.onAccountPinModalClose()}>
1040
- ${N.close}
1041
- </button>
1042
- </div>
1043
- <form @submit=${a} style="display: flex; flex-direction: column; gap: 12px; padding: 16px 0 8px;">
1044
- ${t?d`
1045
- <input
1046
- class="login-pin-input"
1047
- type="password"
1048
- inputmode="numeric"
1049
- pattern="[0-9]*"
1050
- minlength="4"
1051
- maxlength="6"
1052
- placeholder="Current PIN"
1053
- ?disabled=${n}
1054
- @input=${r(c=>{s=c})}
1055
- autofocus
1056
- />
1057
- `:b}
1058
- <input
1059
- class="login-pin-input"
1060
- type="password"
1061
- inputmode="numeric"
1062
- pattern="[0-9]*"
1063
- minlength="4"
1064
- maxlength="6"
1065
- placeholder="New PIN (4–6 digits)"
1066
- ?disabled=${n}
1067
- @input=${r(c=>{i=c})}
1068
- ${t?b:d`autofocus`}
1069
- />
1070
- <input
1071
- class="login-pin-input"
1072
- type="password"
1073
- inputmode="numeric"
1074
- pattern="[0-9]*"
1075
- minlength="4"
1076
- maxlength="6"
1077
- placeholder="Confirm PIN"
1078
- ?disabled=${n}
1079
- @input=${r(c=>{o=c})}
1080
- />
1081
- ${e.accountPinError?d`<p class="login-error">${e.accountPinError}</p>`:b}
1082
- ${e.accountPinSuccess?d`<p class="login-success">${e.accountPinSuccess}</p>`:b}
1083
- <button
1084
- class="login-submit"
1085
- type="submit"
1086
- ?disabled=${n}
1087
- >${n?d`<span class="login-spinner"></span>`:t?"Change PIN":"Set PIN"}</button>
1088
- </form>
1089
- </div>
1090
- </div>
1091
- `}function Cr(e){if(!e.addingWorkspace)return b;const{workspaceSaving:t}=e;return d`
1092
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1093
- <div class="setup-add-account">
1094
- <strong>New Account</strong>
1095
- <input
1096
- type="text"
1097
- class="setup-add-account-input"
1098
- placeholder=""
1099
- .value=${e.newWorkspaceName}
1100
- @input=${n=>e.onSetNewWorkspaceName(n.target.value)}
1101
- @keydown=${n=>{n.key==="Enter"&&e.newWorkspaceName.trim()&&e.newWorkspacePin.match(/^\d{4,6}$/)&&e.onWorkspaceCreate(e.newWorkspaceName,e.newWorkspacePath||void 0)}}
1102
- />
1103
- <input
1104
- type="password"
1105
- inputmode="numeric"
1106
- pattern="[0-9]*"
1107
- minlength="4"
1108
- maxlength="6"
1109
- class="setup-add-account-input"
1110
- placeholder="PIN for this account (4-6 digits)"
1111
- .value=${e.newWorkspacePin}
1112
- @input=${n=>{const s=n.target;s.value=s.value.replace(/\D/g,"").slice(0,6),e.onSetNewWorkspacePin(s.value)}}
1113
- />
1114
- <details style="margin-top: 8px;">
1115
- <summary style="cursor: pointer; font-size: 12px; color: var(--tasker-text-grey);">
1116
- Use existing workspace (advanced)
1117
- </summary>
1118
- <input
1119
- type="text"
1120
- class="setup-add-account-input"
1121
- placeholder="/path/to/workspace"
1122
- style="margin-top: 8px;"
1123
- .value=${e.newWorkspacePath}
1124
- @input=${n=>e.onSetNewWorkspacePath(n.target.value)}
1125
- />
1126
- </details>
1127
- <div class="setup-add-account-actions" style="margin-top: 8px;">
1128
- <button
1129
- class="setup-button primary"
1130
- ?disabled=${t||!e.newWorkspaceName.trim()||!e.newWorkspacePin.match(/^\d{4,6}$/)}
1131
- @click=${()=>e.onWorkspaceCreate(e.newWorkspaceName,e.newWorkspacePath||void 0)}
1132
- >
1133
- ${t?"Creating…":"Create"}
1134
- </button>
1135
- <button
1136
- class="setup-button secondary"
1137
- @click=${()=>{e.onSetAddingWorkspace(!1),e.onSetNewWorkspaceName(""),e.onSetNewWorkspacePath(""),e.onSetNewWorkspacePin("")}}
1138
- >
1139
- Cancel
1140
- </button>
1141
- </div>
1142
- </div>
1143
- </div>
1144
- `}function _r(e){const t=At(e);return!t||t.isDefault?b:e.workspaceRemoveConfirm===t.name?d`
1145
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 12px;">
1146
- <div style="font-size: 13px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
1147
- <span style="color: var(--tasker-danger, #ef4444);">Remove "${t.displayName??t.name}" and its WhatsApp account?</span>
1148
- <button
1149
- class="setup-button danger"
1150
- style="font-size: 12px; padding: 4px 12px;"
1151
- ?disabled=${e.workspaceSaving}
1152
- @click=${()=>e.onWorkspaceRemove(t.name)}
1153
- >
1154
- ${e.workspaceSaving?"Removing…":"Remove"}
1155
- </button>
1156
- <button
1157
- class="setup-button secondary"
1158
- style="font-size: 12px; padding: 4px 12px;"
1159
- @click=${()=>e.onSetWorkspaceRemoveConfirm(null)}
1160
- >
1161
- Cancel
1162
- </button>
1163
- </div>
1164
- </div>
1165
- `:d`
1166
- <p class="setup-hint" style="margin-top: 12px;">
1167
- <a
1168
- href="#"
1169
- class="setup-link-danger"
1170
- @click=${s=>{s.preventDefault(),e.onSetWorkspaceRemoveConfirm(t.name)}}
1171
- >Remove Account</a>
1172
- </p>
1173
- `}function Mr(e){if(e.uninstallDone)return d`
1174
- <div style="margin-top: 24px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1175
- <p style="color: var(--tasker-danger, #ef4444); font-size: 13px; font-weight: 600; margin: 0 0 8px 0;">
1176
- Taskmaster has been uninstalled.
1177
- </p>
1178
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0;">
1179
- If the npm package was not removed automatically, run:<br/>
1180
- <code style="font-size: 11px; background: rgba(255,255,255,0.06); padding: 2px 6px; border-radius: 3px;">sudo npm uninstall -g @rubytech/taskmaster</code>
1181
- </p>
1182
- </div>
1183
- `;if(e.uninstallConfirm){const t=e.uninstallConfirmText==="UNINSTALL";return d`
1184
- <div style="margin-top: 24px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1185
- <p style="color: var(--tasker-danger, #ef4444); font-size: 13px; font-weight: 600; margin: 0 0 8px 0;">
1186
- Uninstall Taskmaster
1187
- </p>
1188
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0 0 12px 0;">
1189
- This will stop the gateway, remove all configuration, workspace files, and the npm package.
1190
- This cannot be undone.
1191
- </p>
1192
- <div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
1193
- <input
1194
- type="text"
1195
- placeholder="Type UNINSTALL to confirm"
1196
- .value=${e.uninstallConfirmText}
1197
- ?disabled=${e.uninstallBusy}
1198
- @input=${n=>e.onUninstallConfirmTextChange(n.target.value)}
1199
- style="font-size: 12px; padding: 4px 8px; background: rgba(255,255,255,0.06); border: 1px solid rgba(255,255,255,0.15); border-radius: 4px; color: inherit; width: 180px;"
1200
- />
1201
- <button
1202
- class="setup-button danger"
1203
- style="font-size: 12px; padding: 4px 12px;"
1204
- ?disabled=${!t||e.uninstallBusy}
1205
- @click=${e.onUninstallRun}
1206
- >
1207
- ${e.uninstallBusy?"Uninstalling…":"Uninstall"}
1208
- </button>
1209
- <button
1210
- class="setup-button secondary"
1211
- style="font-size: 12px; padding: 4px 12px;"
1212
- ?disabled=${e.uninstallBusy}
1213
- @click=${e.onUninstallCancel}
1214
- >
1215
- Cancel
1216
- </button>
1217
- </div>
1218
- ${e.uninstallError?d`<p class="setup-error" style="margin-top: 8px; font-size: 12px;">${e.uninstallError}</p>`:b}
1219
- </div>
1220
- `}return d`
1221
- <p class="setup-hint" style="margin-top: 8px;">
1222
- <a
1223
- href="#"
1224
- class="setup-link-danger"
1225
- @click=${t=>{t.preventDefault(),e.onUninstallConfirm()}}
1226
- >Uninstall Taskmaster</a>
1227
- </p>
1228
- `}function rh(e){const{whatsappBusy:t,whatsappLoginMessage:n,whatsappLoginQrDataUrl:s,whatsappLoginConnected:i,whatsappChannelStatus:o}=e;if(s)return d`
1229
- <div class="setup-container">
1230
- <div class="setup-card">
1231
- <h1>Scan with WhatsApp</h1>
1232
- <p>
1233
- On your phone: WhatsApp → Settings → Linked Devices → Link a Device
1234
- </p>
1235
- <div class="setup-qr">
1236
- <img src=${s} alt="WhatsApp QR Code" />
1237
- </div>
1238
- ${t?d`<p class="setup-waiting">Waiting for scan...</p>`:d`<p class="setup-hint">
1239
- Scan the code above with your phone
1240
- </p>`}
1241
- <p class="setup-hint" style="margin-top: 16px;">
1242
- <strong>Important:</strong> If you see "${Oe().name}" in your Linked
1243
- Devices, remove it first before scanning.
1244
- </p>
1245
- <div class="setup-actions" style="margin-top: 24px;">
1246
- <button
1247
- class="setup-button secondary"
1248
- @click=${e.onWhatsAppBack}
1249
- >
1250
- ← Back
1251
- </button>
1252
- </div>
1253
- </div>
1254
- </div>
1255
- `;if(t)return d`
1256
- <div class="setup-container">
1257
- <div class="setup-card">
1258
- <div class="setup-spinner"></div>
1259
- <p>${n||"Connecting to WhatsApp..."}</p>
1260
- </div>
1261
- </div>
1262
- `;const r=o?.running&&o?.connected;return o?(e.whatsappAccounts.length>1?e.whatsappAccounts.every(u=>u.running&&u.connected):r)&&e.authConnected?d`
1263
- <div class="setup-container">
1264
- <div class="setup-card setup-success">
1265
- ${br(e)}
1266
- <div class="setup-status-dashboard">
1267
- ${wr(e)}
1268
- ${kr(e)}
1269
- ${Sr(e)}
1270
- ${xr(e)}
1271
- ${Ar(e)}
1272
- ${ih(e)}
1273
- ${Er(e)}
1274
- </div>
1275
-
1276
- ${oh(e)}
1277
- ${$r(e)}
1278
- ${Cr(e)}
1279
- ${_r(e)}
1280
- ${Mr(e)}
1281
- ${e.workspacesError?d`<p class="setup-error" style="margin-top: 8px;">${e.workspacesError}</p>`:b}
1282
- </div>
1283
- </div>
1284
- `:d`
1285
- <div class="setup-container">
1286
- <div class="setup-card">
1287
- ${br(e)}
1288
- <div class="setup-status-dashboard">
1289
- ${wr(e)}
1290
- ${kr(e)}
1291
- ${Sr(e)}
1292
- ${xr(e)}
1293
- ${Ar(e)}
1294
- ${Er(e)}
1295
- </div>
1296
-
1297
- ${$r(e)}
1298
- ${Cr(e)}
1299
- ${_r(e)}
1300
- ${Mr(e)}
1301
- ${e.workspacesError?d`<p class="setup-error" style="margin-top: 8px;">${e.workspacesError}</p>`:b}
1302
- </div>
1303
- </div>
1304
- `:o?i===!1&&n&&!t?d`
1305
- <div class="setup-container">
1306
- <div class="setup-card">
1307
- ${ge("whatsapp")}
1308
- <div class="setup-status-row">
1309
- ${le("bad")}
1310
- <span>Connection Failed</span>
1311
- </div>
1312
- <p class="setup-error">${n}</p>
1313
- <button
1314
- class="setup-button primary"
1315
- ?disabled=${t}
1316
- @click=${e.onWhatsAppRelink}
1317
- >
1318
- Try Again
1319
- </button>
1320
- </div>
1321
- </div>
1322
- `:d`
1323
- <div class="setup-container">
1324
- <div class="setup-card">
1325
- ${ge("whatsapp")}
1326
- ${n?d`<p class="setup-error">${n}</p>`:d`<div class="setup-spinner"></div>
1327
- <p>Preparing...</p>`}
1328
- </div>
1329
- </div>
1330
- `:d`
1331
- <div class="setup-container">
1332
- <div class="setup-card">
1333
- ${ge("whatsapp")}
1334
- <div class="setup-spinner"></div>
1335
- <p>Checking connection status...</p>
1336
- <button
1337
- class="setup-button secondary"
1338
- style="margin-top: 16px;"
1339
- @click=${e.onRefreshStatus}
1340
- >
1341
- Refresh Status
1342
- </button>
1343
- </div>
1344
- </div>
1345
- `}function ah(e){const{connected:t,currentStep:n}=e;if(e.uninstallDone||Tl())return d`
1346
- <div class="setup-container">
1347
- <div class="setup-card">
1348
- <p style="color: var(--tasker-danger, #ef4444); font-size: 16px; font-weight: 600; margin: 0 0 12px 0;">
1349
- Taskmaster has been uninstalled.
1350
- </p>
1351
- <p style="font-size: 13px; color: var(--tasker-text-grey); margin: 0 0 16px 0;">
1352
- The gateway service, configuration, and workspace files have been removed.
1353
- </p>
1354
- <p style="font-size: 13px; color: var(--tasker-text-grey); margin: 0 0 16px 0;">
1355
- If the npm package was not removed automatically, run:
1356
- </p>
1357
- <code style="display: block; font-size: 12px; background: rgba(255,255,255,0.06); padding: 8px 12px; border-radius: 4px; margin: 0 0 16px 0;">sudo npm uninstall -g @rubytech/taskmaster</code>
1358
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0;">You can close this tab.</p>
1359
- </div>
1360
- </div>
1361
- `;if(!t){const o=e.updateRunning;return d`
1362
- <div class="setup-container">
1363
- <div class="setup-card">
1364
- <div class="setup-spinner"></div>
1365
- <p>${o?"Restarting gateway after update…":"Connecting to gateway..."}</p>
1366
- </div>
1367
- </div>
1368
- `}let s;switch(n){case"license":s=vr(e);break;case"auth":s=Qp(e);break;case"whatsapp":case"complete":s=rh(e);break;default:s=vr(e)}const i=tt("Setup",e.wsProps);return d`${s}${Yp(e)}${th(e)}${eh(e)}${sh(e)}${i}`}function lh(e,t){const n=e.paired?"Paired phone (used to link WhatsApp)":"Admin access via WhatsApp DM";return d`
1369
- <div class="sp-list-item">
1370
- <div class="sp-list-item-main">
1371
- <div class="sp-list-item-title">${e.phone}</div>
1372
- <div class="sp-list-item-sub">${n}</div>
1373
- </div>
1374
- ${e.paired?d`<span style="color: var(--tasker-orange); font-size: 13px; padding: 8px 16px;">Primary</span>`:d`<button
1375
- class="setup-button danger"
1376
- style="padding: 8px 16px; font-size: 13px;"
1377
- ?disabled=${t.saving}
1378
- @click=${()=>t.onRemove(e.phone)}
1379
- >
1380
- Remove
1381
- </button>`}
1382
- </div>
1383
- `}function ch(e){if(!e.connected)return d`
1384
- <div class="setup-container">
1385
- <div class="setup-card">
1386
- <div class="setup-spinner"></div>
1387
- <p>Connecting to gateway...</p>
1388
- </div>
1389
- </div>
1390
- `;const t=n=>{n.preventDefault(),e.newPhone.trim()&&e.onAdd(e.newPhone)};return d`
1391
- <div class="setup-container">
1392
- ${tt("Admins",e.wsProps)}
1393
- <div class="setup-card" style="max-width: 520px;">
1394
- <h1>Admin Phones</h1>
1395
- <p style="margin-bottom: 16px;">
1396
- Phone numbers that route to the admin agent instead of the public agent.
1397
- </p>
1398
-
1399
- <div class="sp-toolbar">
1400
- <button
1401
- class="setup-button secondary"
1402
- style="padding: 10px 20px; font-size: 14px;"
1403
- ?disabled=${e.loading}
1404
- @click=${e.onRefresh}
1405
- >
1406
- ${e.loading?"Loading...":"Refresh"}
1407
- </button>
1408
- </div>
1409
-
1410
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
1411
-
1412
- <form style="display: flex; flex-direction: row; gap: 12px; margin-top: 20px; align-items: stretch;" @submit=${t}>
1413
- <input
1414
- type="tel"
1415
- style="flex: 1; padding: 10px 14px; font-size: 14px; border-radius: 8px; border: 1px solid rgba(255, 255, 255, 0.15); background: rgba(0, 0, 0, 0.3); color: var(--tasker-white); font-family: inherit;"
1416
- placeholder="+44..."
1417
- .value=${e.newPhone}
1418
- @input=${n=>e.onNewPhoneChange(n.target.value)}
1419
- ?disabled=${e.saving}
1420
- />
1421
- <button
1422
- type="submit"
1423
- class="setup-button primary"
1424
- style="padding: 10px 20px; font-size: 14px; flex-shrink: 0;"
1425
- ?disabled=${e.saving||!e.newPhone.trim()}
1426
- >
1427
- ${e.saving?"Saving...":"Add"}
1428
- </button>
1429
- </form>
1430
-
1431
- <div class="sp-list" style="margin-top: 20px;">
1432
- ${e.phones.length===0?d`<div class="sp-list-empty">No admin phones configured yet.</div>`:e.phones.map(n=>lh(n,e))}
1433
- </div>
1434
-
1435
- <div class="setup-hint" style="margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;">
1436
- <strong style="color: var(--tasker-white);">How it works:</strong><br/>
1437
- Messages from admin phones route to the <code style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);">admin</code> agent with full tool access.
1438
- All other numbers go to <code style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);">public</code> with restricted access.
1439
- </div>
1440
-
1441
- </div>
1442
- </div>
1443
- `}function uh(e){return Object.keys(e.fields).length}function dh(e,t){const n=Object.entries(e.fields);return d`
1444
- <div class="customers-record-fields">
1445
- ${n.length===0?d`<div style="color: rgba(255,255,255,0.4); font-size: 13px; margin-top: 12px;">No fields yet. Add one below.</div>`:n.map(([s,i])=>d`
1446
- <div class="customers-field-row">
1447
- <input
1448
- class="field-key"
1449
- type="text"
1450
- .value=${s}
1451
- disabled
1452
- title="Field name"
1453
- />
1454
- <input
1455
- class="field-value"
1456
- type="text"
1457
- .value=${i}
1458
- @change=${o=>t.onSetField(e.id,s,o.target.value)}
1459
- ?disabled=${t.saving}
1460
- title="Field value"
1461
- />
1462
- <button
1463
- class="setup-button danger field-delete"
1464
- ?disabled=${t.saving}
1465
- @click=${()=>t.onDeleteField(e.id,s)}
1466
- >
1467
- ×
1468
- </button>
1469
- </div>
1470
- `)}
1471
- <div class="customers-record-actions">
1472
- <button
1473
- class="setup-button secondary"
1474
- style="font-size: 13px; padding: 8px 14px;"
1475
- ?disabled=${t.saving}
1476
- @click=${()=>{const s=prompt("Field name (e.g. status, plan, notes):");if(!s?.trim())return;const i=prompt(`Value for "${s.trim()}":`);i!==null&&t.onSetField(e.id,s.trim(),i)}}
1477
- >
1478
- + Add Field
1479
- </button>
1480
- <button
1481
- class="setup-button danger"
1482
- style="font-size: 13px; padding: 8px 14px;"
1483
- ?disabled=${t.saving}
1484
- @click=${()=>{confirm(`Delete customer "${e.name}" (${e.id})?`)&&t.onDelete(e.id)}}
1485
- >
1486
- Delete Customer
1487
- </button>
1488
- </div>
1489
- </div>
1490
- `}function ph(e,t){const n=t.editingId===e.id,s=uh(e),i=s===0?"No fields":`${s} field${s>1?"s":""}`;return d`
1491
- <div class="customers-record">
1492
- <div
1493
- class="customers-record-header"
1494
- @click=${()=>t.onToggleExpand(e.id)}
1495
- >
1496
- <div class="customers-record-info">
1497
- <span class="customers-record-name">${e.name}</span>
1498
- <span class="customers-record-phone">${e.id}</span>
1499
- </div>
1500
- <span class="customers-record-meta">${i}</span>
1501
- </div>
1502
- ${n?dh(e,t):b}
1503
- </div>
1504
- `}function hh(e){if(!e.connected)return d`
1505
- <div class="setup-container">
1506
- <div class="setup-card">
1507
- <div class="setup-spinner"></div>
1508
- <p>Connecting to gateway...</p>
1509
- </div>
1510
- </div>
1511
- `;const t=s=>{s.preventDefault(),e.onSearchSubmit()},n=s=>{s.preventDefault(),e.newRecordPhone.trim()&&e.newRecordName.trim()&&e.onAdd(e.newRecordPhone,e.newRecordName)};return d`
1512
- <div class="setup-container">
1513
- ${tt("Customers",e.wsProps)}
1514
- <div class="setup-card" style="max-width: 620px;">
1515
- <h1>Customer Records</h1>
1516
- <p style="margin-bottom: 16px;">
1517
- Verified customer data managed by the business owner. Agents can read these records but cannot modify them.
1518
- </p>
1519
-
1520
- <div class="sp-toolbar" style="display: flex; gap: 8px;">
1521
- <button
1522
- class="setup-button secondary"
1523
- style="padding: 10px 20px; font-size: 14px;"
1524
- ?disabled=${e.loading}
1525
- @click=${e.onRefresh}
1526
- >
1527
- ${e.loading?"Loading...":"Refresh"}
1528
- </button>
1529
- <button
1530
- class="setup-button primary"
1531
- style="padding: 10px 20px; font-size: 14px;"
1532
- @click=${e.onShowAddForm}
1533
- >
1534
- + Add Customer
1535
- </button>
1536
- </div>
1537
-
1538
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
1539
-
1540
- ${e.showAddForm?d`
1541
- <form class="customers-add-form" @submit=${n}>
1542
- <input
1543
- type="tel"
1544
- placeholder="+447490553305"
1545
- .value=${e.newRecordPhone}
1546
- @input=${s=>e.onNewRecordPhoneChange(s.target.value)}
1547
- ?disabled=${e.saving}
1548
- />
1549
- <input
1550
- type="text"
1551
- placeholder="Customer name"
1552
- .value=${e.newRecordName}
1553
- @input=${s=>e.onNewRecordNameChange(s.target.value)}
1554
- ?disabled=${e.saving}
1555
- />
1556
- <div class="customers-add-form-buttons">
1557
- <button
1558
- type="submit"
1559
- class="setup-button primary"
1560
- style="padding: 10px 20px; font-size: 14px;"
1561
- ?disabled=${e.saving||!e.newRecordPhone.trim()||!e.newRecordName.trim()}
1562
- >
1563
- ${e.saving?"Saving...":"Add"}
1564
- </button>
1565
- <button
1566
- type="button"
1567
- class="setup-button secondary"
1568
- style="padding: 10px 20px; font-size: 14px;"
1569
- @click=${e.onCancelAddForm}
1570
- >
1571
- Cancel
1572
- </button>
1573
- </div>
1574
- </form>
1575
- `:b}
1576
-
1577
- <form
1578
- class="customers-search"
1579
- style="margin-top: 16px;"
1580
- @submit=${t}
1581
- >
1582
- <input
1583
- type="text"
1584
- placeholder="Search by name or phone..."
1585
- .value=${e.searchQuery}
1586
- @input=${s=>e.onSearch(s.target.value)}
1587
- />
1588
- <button
1589
- type="submit"
1590
- class="setup-button secondary"
1591
- style="padding: 10px 20px; font-size: 14px; flex-shrink: 0;"
1592
- >
1593
- Search
1594
- </button>
1595
- </form>
1596
-
1597
- <div style="margin-top: 16px;">
1598
- ${e.records.length===0?d`<div class="customers-empty">
1599
- ${e.searchQuery.trim()?`No records matching "${e.searchQuery}".`:"No customer records yet. Add one to get started."}
1600
- </div>`:e.records.map(s=>ph(s,e))}
1601
- </div>
1602
-
1603
- <div class="setup-hint" style="margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;">
1604
- <strong style="color: var(--tasker-white);">How it works:</strong><br/>
1605
- Records stored here are <strong>read-only for agents</strong> — they use the
1606
- <code style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);">customer_lookup</code>
1607
- tool to check payment status and account details, but cannot modify them. This prevents prompt injection from altering sensitive data.
1608
- </div>
1609
- </div>
1610
- </div>
1611
- `}const Cl={CHILD:2},_l=e=>(...t)=>({_$litDirective$:e,values:t});let Ml=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,n,s){this._$Ct=t,this._$AM=n,this._$Ci=s}_$AS(t,n){return this.update(t,n)}update(t,n){return this.render(...n)}};const{I:fh}=hu,Lr=e=>e,Pr=()=>document.createComment(""),Lt=(e,t,n)=>{const s=e._$AA.parentNode,i=t===void 0?e._$AB:t._$AA;if(n===void 0){const o=s.insertBefore(Pr(),i),r=s.insertBefore(Pr(),i);n=new fh(o,r,e,e.options)}else{const o=n._$AB.nextSibling,r=n._$AM,l=r!==e;if(l){let a;n._$AQ?.(e),n._$AM=e,n._$AP!==void 0&&(a=e._$AU)!==r._$AU&&n._$AP(a)}if(o!==i||l){let a=n._$AA;for(;a!==o;){const c=Lr(a).nextSibling;Lr(s).insertBefore(a,i),a=c}}}return n},je=(e,t,n=e)=>(e._$AI(t,n),e),gh={},mh=(e,t=gh)=>e._$AH=t,yh=e=>e._$AH,Fs=e=>{e._$AR(),e._$AA.remove()};const Rr=(e,t,n)=>{const s=new Map;for(let i=t;i<=n;i++)s.set(e[i],i);return s},vh=_l(class extends Ml{constructor(e){if(super(e),e.type!==Cl.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,n){let s;n===void 0?n=t:t!==void 0&&(s=t);const i=[],o=[];let r=0;for(const l of e)i[r]=s?s(l,r):r,o[r]=n(l,r),r++;return{values:o,keys:i}}render(e,t,n){return this.dt(e,t,n).values}update(e,[t,n,s]){const i=yh(e),{values:o,keys:r}=this.dt(t,n,s);if(!Array.isArray(i))return this.ut=r,o;const l=this.ut??=[],a=[];let c,u,p=0,m=i.length-1,v=0,w=o.length-1;for(;p<=m&&v<=w;)if(i[p]===null)p++;else if(i[m]===null)m--;else if(l[p]===r[v])a[v]=je(i[p],o[v]),p++,v++;else if(l[m]===r[w])a[w]=je(i[m],o[w]),m--,w--;else if(l[p]===r[w])a[w]=je(i[p],o[w]),Lt(e,a[w+1],i[p]),p++,w--;else if(l[m]===r[v])a[v]=je(i[m],o[v]),Lt(e,i[p],i[m]),m--,v++;else if(c===void 0&&(c=Rr(r,v,w),u=Rr(l,p,m)),c.has(l[p]))if(c.has(l[m])){const A=u.get(r[v]),_=A!==void 0?i[A]:null;if(_===null){const j=Lt(e,i[p]);je(j,o[v]),a[v]=j}else a[v]=je(_,o[v]),Lt(e,i[p],_),i[A]=null;v++}else Fs(i[m]),m--;else Fs(i[p]),p++;for(;v<=w;){const A=Lt(e,a[w+1]);je(A,o[v]),a[v++]=A}for(;p<=m;){const A=i[p++];A!==null&&Fs(A)}return this.ut=r,mh(e,a),Ne}});class gi extends Ml{constructor(t){if(super(t),this.it=b,t.type!==Cl.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===b||t==null)return this._t=void 0,this.it=t;if(t===Ne)return t;if(typeof t!="string")throw Error(this.constructor.directiveName+"() called with a non-string value");if(t===this.it)return this._t;this.it=t;const n=[t];return n.raw=n,this._t={_$litType$:this.constructor.resultType,strings:n,values:[]}}}gi.directiveName="unsafeHTML",gi.resultType=1;const mi=_l(gi);const{entries:Ll,setPrototypeOf:Ir,isFrozen:bh,getPrototypeOf:wh,getOwnPropertyDescriptor:kh}=Object;let{freeze:ie,seal:ce,create:yi}=Object,{apply:vi,construct:bi}=typeof Reflect<"u"&&Reflect;ie||(ie=function(t){return t});ce||(ce=function(t){return t});vi||(vi=function(t,n){for(var s=arguments.length,i=new Array(s>2?s-2:0),o=2;o<s;o++)i[o-2]=arguments[o];return t.apply(n,i)});bi||(bi=function(t){for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return new t(...s)});const An=oe(Array.prototype.forEach),Sh=oe(Array.prototype.lastIndexOf),Nr=oe(Array.prototype.pop),Pt=oe(Array.prototype.push),xh=oe(Array.prototype.splice),Nn=oe(String.prototype.toLowerCase),Us=oe(String.prototype.toString),Ws=oe(String.prototype.match),Rt=oe(String.prototype.replace),Ah=oe(String.prototype.indexOf),$h=oe(String.prototype.trim),pe=oe(Object.prototype.hasOwnProperty),ne=oe(RegExp.prototype.test),It=Eh(TypeError);function oe(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,s=new Array(n>1?n-1:0),i=1;i<n;i++)s[i-1]=arguments[i];return vi(e,t,s)}}function Eh(e){return function(){for(var t=arguments.length,n=new Array(t),s=0;s<t;s++)n[s]=arguments[s];return bi(e,n)}}function R(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Nn;Ir&&Ir(e,null);let s=t.length;for(;s--;){let i=t[s];if(typeof i=="string"){const o=n(i);o!==i&&(bh(t)||(t[s]=o),i=o)}e[i]=!0}return e}function Th(e){for(let t=0;t<e.length;t++)pe(e,t)||(e[t]=null);return e}function we(e){const t=yi(null);for(const[n,s]of Ll(e))pe(e,n)&&(Array.isArray(s)?t[n]=Th(s):s&&typeof s=="object"&&s.constructor===Object?t[n]=we(s):t[n]=s);return t}function Nt(e,t){for(;e!==null;){const s=kh(e,t);if(s){if(s.get)return oe(s.get);if(typeof s.value=="function")return oe(s.value)}e=wh(e)}function n(){return null}return n}const Dr=ie(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","search","section","select","shadow","slot","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),Ks=ie(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","enterkeyhint","exportparts","filter","font","g","glyph","glyphref","hkern","image","inputmode","line","lineargradient","marker","mask","metadata","mpath","part","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),zs=ie(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),Ch=ie(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),js=ie(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),_h=ie(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),Or=ie(["#text"]),Br=ie(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","exportparts","face","for","headers","height","hidden","high","href","hreflang","id","inert","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","part","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","slot","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),Hs=ie(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mask-type","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),Fr=ie(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),$n=ie(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Mh=ce(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Lh=ce(/<%[\w\W]*|[\w\W]*%>/gm),Ph=ce(/\$\{[\w\W]*/gm),Rh=ce(/^data-[\-\w.\u00B7-\uFFFF]+$/),Ih=ce(/^aria-[\-\w]+$/),Pl=ce(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Nh=ce(/^(?:\w+script|data):/i),Dh=ce(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Rl=ce(/^html$/i),Oh=ce(/^[a-z][.\w]*(-[.\w]+)+$/i);var Ur=Object.freeze({__proto__:null,ARIA_ATTR:Ih,ATTR_WHITESPACE:Dh,CUSTOM_ELEMENT:Oh,DATA_ATTR:Rh,DOCTYPE_NAME:Rl,ERB_EXPR:Lh,IS_ALLOWED_URI:Pl,IS_SCRIPT_OR_DATA:Nh,MUSTACHE_EXPR:Mh,TMPLIT_EXPR:Ph});const Dt={element:1,text:3,progressingInstruction:7,comment:8,document:9},Bh=function(){return typeof window>"u"?null:window},Fh=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let s=null;const i="data-tt-policy-suffix";n&&n.hasAttribute(i)&&(s=n.getAttribute(i));const o="dompurify"+(s?"#"+s:"");try{return t.createPolicy(o,{createHTML(r){return r},createScriptURL(r){return r}})}catch{return console.warn("TrustedTypes policy "+o+" could not be created."),null}},Wr=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function Il(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Bh();const t=T=>Il(T);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==Dt.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e;const s=n,i=s.currentScript,{DocumentFragment:o,HTMLTemplateElement:r,Node:l,Element:a,NodeFilter:c,NamedNodeMap:u=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:p,DOMParser:m,trustedTypes:v}=e,w=a.prototype,A=Nt(w,"cloneNode"),_=Nt(w,"remove"),j=Nt(w,"nextSibling"),C=Nt(w,"childNodes"),P=Nt(w,"parentNode");if(typeof r=="function"){const T=n.createElement("template");T.content&&T.content.ownerDocument&&(n=T.content.ownerDocument)}let I,B="";const{implementation:ue,createNodeIterator:it,createDocumentFragment:gs,getElementsByTagName:ms}=n,{importNode:an}=s;let Q=Wr();t.isSupported=typeof Ll=="function"&&typeof P=="function"&&ue&&ue.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:Et,ERB_EXPR:ot,TMPLIT_EXPR:Ue,DATA_ATTR:ys,ARIA_ATTR:vs,IS_SCRIPT_OR_DATA:bs,ATTR_WHITESPACE:ln,CUSTOM_ELEMENT:ws}=Ur;let{IS_ALLOWED_URI:cn}=Ur,H=null;const un=R({},[...Dr,...Ks,...zs,...js,...Or]);let q=null;const dn=R({},[...Br,...Hs,...Fr,...$n]);let W=Object.seal(yi(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),We=null,Tt=null;const Me=Object.seal(yi(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let pn=!0,k=!0,x=!1,M=!0,L=!1,K=!0,F=!1,te=!1,Le=!1,rt=!1,hn=!1,fn=!1,Co=!0,_o=!1;const Oc="user-content-";let ks=!0,Ct=!1,at={},me=null;const Ss=R({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Mo=null;const Lo=R({},["audio","video","img","source","image","track"]);let xs=null;const Po=R({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),gn="http://www.w3.org/1998/Math/MathML",mn="http://www.w3.org/2000/svg",Se="http://www.w3.org/1999/xhtml";let lt=Se,As=!1,$s=null;const Bc=R({},[gn,mn,Se],Us);let yn=R({},["mi","mo","mn","ms","mtext"]),vn=R({},["annotation-xml"]);const Fc=R({},["title","style","font","a","script"]);let _t=null;const Uc=["application/xhtml+xml","text/html"],Wc="text/html";let V=null,ct=null;const Kc=n.createElement("form"),Ro=function(y){return y instanceof RegExp||y instanceof Function},Es=function(){let y=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(ct&&ct===y)){if((!y||typeof y!="object")&&(y={}),y=we(y),_t=Uc.indexOf(y.PARSER_MEDIA_TYPE)===-1?Wc:y.PARSER_MEDIA_TYPE,V=_t==="application/xhtml+xml"?Us:Nn,H=pe(y,"ALLOWED_TAGS")?R({},y.ALLOWED_TAGS,V):un,q=pe(y,"ALLOWED_ATTR")?R({},y.ALLOWED_ATTR,V):dn,$s=pe(y,"ALLOWED_NAMESPACES")?R({},y.ALLOWED_NAMESPACES,Us):Bc,xs=pe(y,"ADD_URI_SAFE_ATTR")?R(we(Po),y.ADD_URI_SAFE_ATTR,V):Po,Mo=pe(y,"ADD_DATA_URI_TAGS")?R(we(Lo),y.ADD_DATA_URI_TAGS,V):Lo,me=pe(y,"FORBID_CONTENTS")?R({},y.FORBID_CONTENTS,V):Ss,We=pe(y,"FORBID_TAGS")?R({},y.FORBID_TAGS,V):we({}),Tt=pe(y,"FORBID_ATTR")?R({},y.FORBID_ATTR,V):we({}),at=pe(y,"USE_PROFILES")?y.USE_PROFILES:!1,pn=y.ALLOW_ARIA_ATTR!==!1,k=y.ALLOW_DATA_ATTR!==!1,x=y.ALLOW_UNKNOWN_PROTOCOLS||!1,M=y.ALLOW_SELF_CLOSE_IN_ATTR!==!1,L=y.SAFE_FOR_TEMPLATES||!1,K=y.SAFE_FOR_XML!==!1,F=y.WHOLE_DOCUMENT||!1,rt=y.RETURN_DOM||!1,hn=y.RETURN_DOM_FRAGMENT||!1,fn=y.RETURN_TRUSTED_TYPE||!1,Le=y.FORCE_BODY||!1,Co=y.SANITIZE_DOM!==!1,_o=y.SANITIZE_NAMED_PROPS||!1,ks=y.KEEP_CONTENT!==!1,Ct=y.IN_PLACE||!1,cn=y.ALLOWED_URI_REGEXP||Pl,lt=y.NAMESPACE||Se,yn=y.MATHML_TEXT_INTEGRATION_POINTS||yn,vn=y.HTML_INTEGRATION_POINTS||vn,W=y.CUSTOM_ELEMENT_HANDLING||{},y.CUSTOM_ELEMENT_HANDLING&&Ro(y.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(W.tagNameCheck=y.CUSTOM_ELEMENT_HANDLING.tagNameCheck),y.CUSTOM_ELEMENT_HANDLING&&Ro(y.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(W.attributeNameCheck=y.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),y.CUSTOM_ELEMENT_HANDLING&&typeof y.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(W.allowCustomizedBuiltInElements=y.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),L&&(k=!1),hn&&(rt=!0),at&&(H=R({},Or),q=[],at.html===!0&&(R(H,Dr),R(q,Br)),at.svg===!0&&(R(H,Ks),R(q,Hs),R(q,$n)),at.svgFilters===!0&&(R(H,zs),R(q,Hs),R(q,$n)),at.mathMl===!0&&(R(H,js),R(q,Fr),R(q,$n))),y.ADD_TAGS&&(typeof y.ADD_TAGS=="function"?Me.tagCheck=y.ADD_TAGS:(H===un&&(H=we(H)),R(H,y.ADD_TAGS,V))),y.ADD_ATTR&&(typeof y.ADD_ATTR=="function"?Me.attributeCheck=y.ADD_ATTR:(q===dn&&(q=we(q)),R(q,y.ADD_ATTR,V))),y.ADD_URI_SAFE_ATTR&&R(xs,y.ADD_URI_SAFE_ATTR,V),y.FORBID_CONTENTS&&(me===Ss&&(me=we(me)),R(me,y.FORBID_CONTENTS,V)),y.ADD_FORBID_CONTENTS&&(me===Ss&&(me=we(me)),R(me,y.ADD_FORBID_CONTENTS,V)),ks&&(H["#text"]=!0),F&&R(H,["html","head","body"]),H.table&&(R(H,["tbody"]),delete We.tbody),y.TRUSTED_TYPES_POLICY){if(typeof y.TRUSTED_TYPES_POLICY.createHTML!="function")throw It('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof y.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw It('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');I=y.TRUSTED_TYPES_POLICY,B=I.createHTML("")}else I===void 0&&(I=Fh(v,i)),I!==null&&typeof B=="string"&&(B=I.createHTML(""));ie&&ie(y),ct=y}},Io=R({},[...Ks,...zs,...Ch]),No=R({},[...js,..._h]),zc=function(y){let S=P(y);(!S||!S.tagName)&&(S={namespaceURI:lt,tagName:"template"});const E=Nn(y.tagName),U=Nn(S.tagName);return $s[y.namespaceURI]?y.namespaceURI===mn?S.namespaceURI===Se?E==="svg":S.namespaceURI===gn?E==="svg"&&(U==="annotation-xml"||yn[U]):!!Io[E]:y.namespaceURI===gn?S.namespaceURI===Se?E==="math":S.namespaceURI===mn?E==="math"&&vn[U]:!!No[E]:y.namespaceURI===Se?S.namespaceURI===mn&&!vn[U]||S.namespaceURI===gn&&!yn[U]?!1:!No[E]&&(Fc[E]||!Io[E]):!!(_t==="application/xhtml+xml"&&$s[y.namespaceURI]):!1},ye=function(y){Pt(t.removed,{element:y});try{P(y).removeChild(y)}catch{_(y)}},Ke=function(y,S){try{Pt(t.removed,{attribute:S.getAttributeNode(y),from:S})}catch{Pt(t.removed,{attribute:null,from:S})}if(S.removeAttribute(y),y==="is")if(rt||hn)try{ye(S)}catch{}else try{S.setAttribute(y,"")}catch{}},Do=function(y){let S=null,E=null;if(Le)y="<remove></remove>"+y;else{const G=Ws(y,/^[\r\n\t ]+/);E=G&&G[0]}_t==="application/xhtml+xml"&&lt===Se&&(y='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+y+"</body></html>");const U=I?I.createHTML(y):y;if(lt===Se)try{S=new m().parseFromString(U,_t)}catch{}if(!S||!S.documentElement){S=ue.createDocument(lt,"template",null);try{S.documentElement.innerHTML=As?B:U}catch{}}const Z=S.body||S.documentElement;return y&&E&&Z.insertBefore(n.createTextNode(E),Z.childNodes[0]||null),lt===Se?ms.call(S,F?"html":"body")[0]:F?S.documentElement:Z},Oo=function(y){return it.call(y.ownerDocument||y,y,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},Ts=function(y){return y instanceof p&&(typeof y.nodeName!="string"||typeof y.textContent!="string"||typeof y.removeChild!="function"||!(y.attributes instanceof u)||typeof y.removeAttribute!="function"||typeof y.setAttribute!="function"||typeof y.namespaceURI!="string"||typeof y.insertBefore!="function"||typeof y.hasChildNodes!="function")},Bo=function(y){return typeof l=="function"&&y instanceof l};function xe(T,y,S){An(T,E=>{E.call(t,y,S,ct)})}const Fo=function(y){let S=null;if(xe(Q.beforeSanitizeElements,y,null),Ts(y))return ye(y),!0;const E=V(y.nodeName);if(xe(Q.uponSanitizeElement,y,{tagName:E,allowedTags:H}),K&&y.hasChildNodes()&&!Bo(y.firstElementChild)&&ne(/<[/\w!]/g,y.innerHTML)&&ne(/<[/\w!]/g,y.textContent)||y.nodeType===Dt.progressingInstruction||K&&y.nodeType===Dt.comment&&ne(/<[/\w]/g,y.data))return ye(y),!0;if(!(Me.tagCheck instanceof Function&&Me.tagCheck(E))&&(!H[E]||We[E])){if(!We[E]&&Wo(E)&&(W.tagNameCheck instanceof RegExp&&ne(W.tagNameCheck,E)||W.tagNameCheck instanceof Function&&W.tagNameCheck(E)))return!1;if(ks&&!me[E]){const U=P(y)||y.parentNode,Z=C(y)||y.childNodes;if(Z&&U){const G=Z.length;for(let re=G-1;re>=0;--re){const Ae=A(Z[re],!0);Ae.__removalCount=(y.__removalCount||0)+1,U.insertBefore(Ae,j(y))}}}return ye(y),!0}return y instanceof a&&!zc(y)||(E==="noscript"||E==="noembed"||E==="noframes")&&ne(/<\/no(script|embed|frames)/i,y.innerHTML)?(ye(y),!0):(L&&y.nodeType===Dt.text&&(S=y.textContent,An([Et,ot,Ue],U=>{S=Rt(S,U," ")}),y.textContent!==S&&(Pt(t.removed,{element:y.cloneNode()}),y.textContent=S)),xe(Q.afterSanitizeElements,y,null),!1)},Uo=function(y,S,E){if(Co&&(S==="id"||S==="name")&&(E in n||E in Kc))return!1;if(!(k&&!Tt[S]&&ne(ys,S))){if(!(pn&&ne(vs,S))){if(!(Me.attributeCheck instanceof Function&&Me.attributeCheck(S,y))){if(!q[S]||Tt[S]){if(!(Wo(y)&&(W.tagNameCheck instanceof RegExp&&ne(W.tagNameCheck,y)||W.tagNameCheck instanceof Function&&W.tagNameCheck(y))&&(W.attributeNameCheck instanceof RegExp&&ne(W.attributeNameCheck,S)||W.attributeNameCheck instanceof Function&&W.attributeNameCheck(S,y))||S==="is"&&W.allowCustomizedBuiltInElements&&(W.tagNameCheck instanceof RegExp&&ne(W.tagNameCheck,E)||W.tagNameCheck instanceof Function&&W.tagNameCheck(E))))return!1}else if(!xs[S]){if(!ne(cn,Rt(E,ln,""))){if(!((S==="src"||S==="xlink:href"||S==="href")&&y!=="script"&&Ah(E,"data:")===0&&Mo[y])){if(!(x&&!ne(bs,Rt(E,ln,"")))){if(E)return!1}}}}}}}return!0},Wo=function(y){return y!=="annotation-xml"&&Ws(y,ws)},Ko=function(y){xe(Q.beforeSanitizeAttributes,y,null);const{attributes:S}=y;if(!S||Ts(y))return;const E={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:q,forceKeepAttr:void 0};let U=S.length;for(;U--;){const Z=S[U],{name:G,namespaceURI:re,value:Ae}=Z,ut=V(G),Cs=Ae;let X=G==="value"?Cs:$h(Cs);if(E.attrName=ut,E.attrValue=X,E.keepAttr=!0,E.forceKeepAttr=void 0,xe(Q.uponSanitizeAttribute,y,E),X=E.attrValue,_o&&(ut==="id"||ut==="name")&&(Ke(G,y),X=Oc+X),K&&ne(/((--!?|])>)|<\/(style|title|textarea)/i,X)){Ke(G,y);continue}if(ut==="attributename"&&Ws(X,"href")){Ke(G,y);continue}if(E.forceKeepAttr)continue;if(!E.keepAttr){Ke(G,y);continue}if(!M&&ne(/\/>/i,X)){Ke(G,y);continue}L&&An([Et,ot,Ue],jo=>{X=Rt(X,jo," ")});const zo=V(y.nodeName);if(!Uo(zo,ut,X)){Ke(G,y);continue}if(I&&typeof v=="object"&&typeof v.getAttributeType=="function"&&!re)switch(v.getAttributeType(zo,ut)){case"TrustedHTML":{X=I.createHTML(X);break}case"TrustedScriptURL":{X=I.createScriptURL(X);break}}if(X!==Cs)try{re?y.setAttributeNS(re,G,X):y.setAttribute(G,X),Ts(y)?ye(y):Nr(t.removed)}catch{Ke(G,y)}}xe(Q.afterSanitizeAttributes,y,null)},jc=function T(y){let S=null;const E=Oo(y);for(xe(Q.beforeSanitizeShadowDOM,y,null);S=E.nextNode();)xe(Q.uponSanitizeShadowNode,S,null),Fo(S),Ko(S),S.content instanceof o&&T(S.content);xe(Q.afterSanitizeShadowDOM,y,null)};return t.sanitize=function(T){let y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},S=null,E=null,U=null,Z=null;if(As=!T,As&&(T="<!-->"),typeof T!="string"&&!Bo(T))if(typeof T.toString=="function"){if(T=T.toString(),typeof T!="string")throw It("dirty is not a string, aborting")}else throw It("toString is not a function");if(!t.isSupported)return T;if(te||Es(y),t.removed=[],typeof T=="string"&&(Ct=!1),Ct){if(T.nodeName){const Ae=V(T.nodeName);if(!H[Ae]||We[Ae])throw It("root node is forbidden and cannot be sanitized in-place")}}else if(T instanceof l)S=Do("<!---->"),E=S.ownerDocument.importNode(T,!0),E.nodeType===Dt.element&&E.nodeName==="BODY"||E.nodeName==="HTML"?S=E:S.appendChild(E);else{if(!rt&&!L&&!F&&T.indexOf("<")===-1)return I&&fn?I.createHTML(T):T;if(S=Do(T),!S)return rt?null:fn?B:""}S&&Le&&ye(S.firstChild);const G=Oo(Ct?T:S);for(;U=G.nextNode();)Fo(U),Ko(U),U.content instanceof o&&jc(U.content);if(Ct)return T;if(rt){if(hn)for(Z=gs.call(S.ownerDocument);S.firstChild;)Z.appendChild(S.firstChild);else Z=S;return(q.shadowroot||q.shadowrootmode)&&(Z=an.call(s,Z,!0)),Z}let re=F?S.outerHTML:S.innerHTML;return F&&H["!doctype"]&&S.ownerDocument&&S.ownerDocument.doctype&&S.ownerDocument.doctype.name&&ne(Rl,S.ownerDocument.doctype.name)&&(re="<!DOCTYPE "+S.ownerDocument.doctype.name+`>
1612
- `+re),L&&An([Et,ot,Ue],Ae=>{re=Rt(re,Ae," ")}),I&&fn?I.createHTML(re):re},t.setConfig=function(){let T=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};Es(T),te=!0},t.clearConfig=function(){ct=null,te=!1},t.isValidAttribute=function(T,y,S){ct||Es({});const E=V(T),U=V(y);return Uo(E,U,S)},t.addHook=function(T,y){typeof y=="function"&&Pt(Q[T],y)},t.removeHook=function(T,y){if(y!==void 0){const S=Sh(Q[T],y);return S===-1?void 0:xh(Q[T],S,1)[0]}return Nr(Q[T])},t.removeHooks=function(T){Q[T]=[]},t.removeAllHooks=function(){Q=Wr()},t}var wi=Il();function uo(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var nt=uo();function Nl(e){nt=e}var Gt={exec:()=>null};function D(e,t=""){let n=typeof e=="string"?e:e.source,s={replace:(i,o)=>{let r=typeof o=="string"?o:o.source;return r=r.replace(se.caret,"$1"),n=n.replace(i,r),s},getRegex:()=>new RegExp(n,t)};return s}var Uh=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),se={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,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,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,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:e=>new RegExp(`^( {0,3}${e})((?:[ ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`),hrRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}#`),htmlBeginRegex:e=>new RegExp(`^ {0,${Math.min(3,e-1)}}<(?:[a-z].*>|!--)`,"i")},Wh=/^(?:[ \t]*(?:\n|$))+/,Kh=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,zh=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,nn=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,jh=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,po=/(?:[*+-]|\d{1,9}[.)])/,Dl=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Ol=D(Dl).replace(/bull/g,po).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}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),Hh=D(Dl).replace(/bull/g,po).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}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),ho=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,qh=/^[^\n]+/,fo=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Gh=D(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",fo).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),Vh=D(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,po).getRegex(),ds="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",go=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,Yh=D("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ ]*)+\\n|$))","i").replace("comment",go).replace("tag",ds).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Bl=D(ho).replace("hr",nn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",ds).getRegex(),Qh=D(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Bl).getRegex(),mo={blockquote:Qh,code:Kh,def:Gh,fences:zh,heading:jh,hr:nn,html:Yh,lheading:Ol,list:Vh,newline:Wh,paragraph:Bl,table:Gt,text:qh},Kr=D("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",nn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3} )[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",ds).getRegex(),Xh={...mo,lheading:Hh,table:Kr,paragraph:D(ho).replace("hr",nn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",Kr).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",ds).getRegex()},Zh={...mo,html:D(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",go).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:Gt,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:D(ho).replace("hr",nn).replace("heading",` *#{1,6} *[^
1613
- ]`).replace("lheading",Ol).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},Jh=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,ef=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Fl=/^( {2,}|\\)\n(?!\s*$)/,tf=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,ps=/[\p{P}\p{S}]/u,yo=/[\s\p{P}\p{S}]/u,Ul=/[^\s\p{P}\p{S}]/u,nf=D(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,yo).getRegex(),Wl=/(?!~)[\p{P}\p{S}]/u,sf=/(?!~)[\s\p{P}\p{S}]/u,of=/(?:[^\s\p{P}\p{S}]|~)/u,rf=D(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Uh?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Kl=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,af=D(Kl,"u").replace(/punct/g,ps).getRegex(),lf=D(Kl,"u").replace(/punct/g,Wl).getRegex(),zl="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",cf=D(zl,"gu").replace(/notPunctSpace/g,Ul).replace(/punctSpace/g,yo).replace(/punct/g,ps).getRegex(),uf=D(zl,"gu").replace(/notPunctSpace/g,of).replace(/punctSpace/g,sf).replace(/punct/g,Wl).getRegex(),df=D("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Ul).replace(/punctSpace/g,yo).replace(/punct/g,ps).getRegex(),pf=D(/\\(punct)/,"gu").replace(/punct/g,ps).getRegex(),hf=D(/^<(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(),ff=D(go).replace("(?:-->|$)","-->").getRegex(),gf=D("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",ff).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Vn=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,mf=D(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Vn).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),jl=D(/^!?\[(label)\]\[(ref)\]/).replace("label",Vn).replace("ref",fo).getRegex(),Hl=D(/^!?\[(ref)\](?:\[\])?/).replace("ref",fo).getRegex(),yf=D("reflink|nolink(?!\\()","g").replace("reflink",jl).replace("nolink",Hl).getRegex(),zr=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,vo={_backpedal:Gt,anyPunctuation:pf,autolink:hf,blockSkip:rf,br:Fl,code:ef,del:Gt,emStrongLDelim:af,emStrongRDelimAst:cf,emStrongRDelimUnd:df,escape:Jh,link:mf,nolink:Hl,punctuation:nf,reflink:jl,reflinkSearch:yf,tag:gf,text:tf,url:Gt},vf={...vo,link:D(/^!?\[(label)\]\((.*?)\)/).replace("label",Vn).getRegex(),reflink:D(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Vn).getRegex()},ki={...vo,emStrongRDelimAst:uf,emStrongLDelim:lf,url:D(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",zr).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:D(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",zr).getRegex()},bf={...ki,br:D(Fl).replace("{2,}","*").getRegex(),text:D(ki.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},En={normal:mo,gfm:Xh,pedantic:Zh},Ot={normal:vo,gfm:ki,breaks:bf,pedantic:vf},wf={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},jr=e=>wf[e];function Ee(e,t){if(t){if(se.escapeTest.test(e))return e.replace(se.escapeReplace,jr)}else if(se.escapeTestNoEncode.test(e))return e.replace(se.escapeReplaceNoEncode,jr);return e}function Hr(e){try{e=encodeURI(e).replace(se.percentDecode,"%")}catch{return null}return e}function qr(e,t){let n=e.replace(se.findPipe,(o,r,l)=>{let a=!1,c=r;for(;--c>=0&&l[c]==="\\";)a=!a;return a?"|":" |"}),s=n.split(se.splitPipe),i=0;if(s[0].trim()||s.shift(),s.length>0&&!s.at(-1)?.trim()&&s.pop(),t)if(s.length>t)s.splice(t);else for(;s.length<t;)s.push("");for(;i<s.length;i++)s[i]=s[i].trim().replace(se.slashPipe,"|");return s}function Bt(e,t,n){let s=e.length;if(s===0)return"";let i=0;for(;i<s&&e.charAt(s-i-1)===t;)i++;return e.slice(0,s-i)}function kf(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let s=0;s<e.length;s++)if(e[s]==="\\")s++;else if(e[s]===t[0])n++;else if(e[s]===t[1]&&(n--,n<0))return s;return n>0?-2:-1}function Gr(e,t,n,s,i){let o=t.href,r=t.title||null,l=e[1].replace(i.other.outputLinkReplace,"$1");s.state.inLink=!0;let a={type:e[0].charAt(0)==="!"?"image":"link",raw:n,href:o,title:r,text:l,tokens:s.inlineTokens(l)};return s.state.inLink=!1,a}function Sf(e,t,n){let s=e.match(n.other.indentCodeCompensation);if(s===null)return t;let i=s[1];return t.split(`
1614
- `).map(o=>{let r=o.match(n.other.beginningSpace);if(r===null)return o;let[l]=r;return l.length>=i.length?o.slice(i.length):o}).join(`
1615
- `)}var Yn=class{options;rules;lexer;constructor(e){this.options=e||nt}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 n=t[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t[0],codeBlockStyle:"indented",text:this.options.pedantic?n:Bt(n,`
1616
- `)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Sf(n,t[3]||"",this.rules);return{type:"code",raw:n,lang:t[2]?t[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):t[2],text:s}}}heading(e){let t=this.rules.block.heading.exec(e);if(t){let n=t[2].trim();if(this.rules.other.endingHash.test(n)){let s=Bt(n,"#");(this.options.pedantic||!s||this.rules.other.endingSpaceChar.test(s))&&(n=s.trim())}return{type:"heading",raw:t[0],depth:t[1].length,text:n,tokens:this.lexer.inline(n)}}}hr(e){let t=this.rules.block.hr.exec(e);if(t)return{type:"hr",raw:Bt(t[0],`
1617
- `)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=Bt(t[0],`
1618
- `).split(`
1619
- `),s="",i="",o=[];for(;n.length>0;){let r=!1,l=[],a;for(a=0;a<n.length;a++)if(this.rules.other.blockquoteStart.test(n[a]))l.push(n[a]),r=!0;else if(!r)l.push(n[a]);else break;n=n.slice(a);let c=l.join(`
1620
- `),u=c.replace(this.rules.other.blockquoteSetextReplace,`
1621
- $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}
1622
- ${c}`:c,i=i?`${i}
1623
- ${u}`:u;let p=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(u,o,!0),this.lexer.state.top=p,n.length===0)break;let m=o.at(-1);if(m?.type==="code")break;if(m?.type==="blockquote"){let v=m,w=v.raw+`
1624
- `+n.join(`
1625
- `),A=this.blockquote(w);o[o.length-1]=A,s=s.substring(0,s.length-v.raw.length)+A.raw,i=i.substring(0,i.length-v.text.length)+A.text;break}else if(m?.type==="list"){let v=m,w=v.raw+`
1626
- `+n.join(`
1627
- `),A=this.list(w);o[o.length-1]=A,s=s.substring(0,s.length-m.raw.length)+A.raw,i=i.substring(0,i.length-v.raw.length)+A.raw,n=w.substring(o.at(-1).raw.length).split(`
1628
- `);continue}}return{type:"blockquote",raw:s,tokens:o,text:i}}}list(e){let t=this.rules.block.list.exec(e);if(t){let n=t[1].trim(),s=n.length>1,i={type:"list",raw:"",ordered:s,start:s?+n.slice(0,-1):"",loose:!1,items:[]};n=s?`\\d{1,9}\\${n.slice(-1)}`:`\\${n}`,this.options.pedantic&&(n=s?n:"[*+-]");let o=this.rules.other.listItemRegex(n),r=!1;for(;e;){let a=!1,c="",u="";if(!(t=o.exec(e))||this.rules.block.hr.test(e))break;c=t[0],e=e.substring(c.length);let p=t[2].split(`
1629
- `,1)[0].replace(this.rules.other.listReplaceTabs,A=>" ".repeat(3*A.length)),m=e.split(`
1630
- `,1)[0],v=!p.trim(),w=0;if(this.options.pedantic?(w=2,u=p.trimStart()):v?w=t[1].length+1:(w=t[2].search(this.rules.other.nonSpaceChar),w=w>4?1:w,u=p.slice(w),w+=t[1].length),v&&this.rules.other.blankLine.test(m)&&(c+=m+`
1631
- `,e=e.substring(m.length+1),a=!0),!a){let A=this.rules.other.nextBulletRegex(w),_=this.rules.other.hrRegex(w),j=this.rules.other.fencesBeginRegex(w),C=this.rules.other.headingBeginRegex(w),P=this.rules.other.htmlBeginRegex(w);for(;e;){let I=e.split(`
1632
- `,1)[0],B;if(m=I,this.options.pedantic?(m=m.replace(this.rules.other.listReplaceNesting," "),B=m):B=m.replace(this.rules.other.tabCharGlobal," "),j.test(m)||C.test(m)||P.test(m)||A.test(m)||_.test(m))break;if(B.search(this.rules.other.nonSpaceChar)>=w||!m.trim())u+=`
1633
- `+B.slice(w);else{if(v||p.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||j.test(p)||C.test(p)||_.test(p))break;u+=`
1634
- `+m}!v&&!m.trim()&&(v=!0),c+=I+`
1635
- `,e=e.substring(I.length+1),p=B.slice(w)}}i.loose||(r?i.loose=!0:this.rules.other.doubleBlankLine.test(c)&&(r=!0)),i.items.push({type:"list_item",raw:c,task:!!this.options.gfm&&this.rules.other.listIsTask.test(u),loose:!1,text:u,tokens:[]}),i.raw+=c}let l=i.items.at(-1);if(l)l.raw=l.raw.trimEnd(),l.text=l.text.trimEnd();else return;i.raw=i.raw.trimEnd();for(let a of i.items){if(this.lexer.state.top=!1,a.tokens=this.lexer.blockTokens(a.text,[]),a.task){if(a.text=a.text.replace(this.rules.other.listReplaceTask,""),a.tokens[0]?.type==="text"||a.tokens[0]?.type==="paragraph"){a.tokens[0].raw=a.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),a.tokens[0].text=a.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let u=this.lexer.inlineQueue.length-1;u>=0;u--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[u].src)){this.lexer.inlineQueue[u].src=this.lexer.inlineQueue[u].src.replace(this.rules.other.listReplaceTask,"");break}}let c=this.rules.other.listTaskCheckbox.exec(a.raw);if(c){let u={type:"checkbox",raw:c[0]+" ",checked:c[0]!=="[ ]"};a.checked=u.checked,i.loose?a.tokens[0]&&["paragraph","text"].includes(a.tokens[0].type)&&"tokens"in a.tokens[0]&&a.tokens[0].tokens?(a.tokens[0].raw=u.raw+a.tokens[0].raw,a.tokens[0].text=u.raw+a.tokens[0].text,a.tokens[0].tokens.unshift(u)):a.tokens.unshift({type:"paragraph",raw:u.raw,text:u.raw,tokens:[u]}):a.tokens.unshift(u)}}if(!i.loose){let c=a.tokens.filter(p=>p.type==="space"),u=c.length>0&&c.some(p=>this.rules.other.anyLine.test(p.raw));i.loose=u}}if(i.loose)for(let a of i.items){a.loose=!0;for(let c of a.tokens)c.type==="text"&&(c.type="paragraph")}return i}}html(e){let t=this.rules.block.html.exec(e);if(t)return{type:"html",block:!0,raw:t[0],pre:t[1]==="pre"||t[1]==="script"||t[1]==="style",text:t[0]}}def(e){let t=this.rules.block.def.exec(e);if(t){let n=t[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),s=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",i=t[3]?t[3].substring(1,t[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):t[3];return{type:"def",tag:n,raw:t[0],href:s,title:i}}}table(e){let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=qr(t[1]),s=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=t[3]?.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
1636
- `):[],o={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===s.length){for(let r of s)this.rules.other.tableAlignRight.test(r)?o.align.push("right"):this.rules.other.tableAlignCenter.test(r)?o.align.push("center"):this.rules.other.tableAlignLeft.test(r)?o.align.push("left"):o.align.push(null);for(let r=0;r<n.length;r++)o.header.push({text:n[r],tokens:this.lexer.inline(n[r]),header:!0,align:o.align[r]});for(let r of i)o.rows.push(qr(r,o.header.length).map((l,a)=>({text:l,tokens:this.lexer.inline(l),header:!1,align:o.align[a]})));return o}}lheading(e){let t=this.rules.block.lheading.exec(e);if(t)return{type:"heading",raw:t[0],depth:t[2].charAt(0)==="="?1:2,text:t[1],tokens:this.lexer.inline(t[1])}}paragraph(e){let t=this.rules.block.paragraph.exec(e);if(t){let n=t[1].charAt(t[1].length-1)===`
1637
- `?t[1].slice(0,-1):t[1];return{type:"paragraph",raw:t[0],text:n,tokens:this.lexer.inline(n)}}}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){let t=this.rules.inline.link.exec(e);if(t){let n=t[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(n)){if(!this.rules.other.endAngleBracket.test(n))return;let o=Bt(n.slice(0,-1),"\\");if((n.length-o.length)%2===0)return}else{let o=kf(t[2],"()");if(o===-2)return;if(o>-1){let r=(t[0].indexOf("!")===0?5:4)+t[1].length+o;t[2]=t[2].substring(0,o),t[0]=t[0].substring(0,r).trim(),t[3]=""}}let s=t[2],i="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(s);o&&(s=o[1],i=o[3])}else i=t[3]?t[3].slice(1,-1):"";return s=s.trim(),this.rules.other.startAngleBracket.test(s)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?s=s.slice(1):s=s.slice(1,-1)),Gr(t,{href:s&&s.replace(this.rules.inline.anyPunctuation,"$1"),title:i&&i.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 s=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),i=t[s.toLowerCase()];if(!i){let o=n[0].charAt(0);return{type:"text",raw:o,text:o}}return Gr(n,i,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let s=this.rules.inline.emStrongLDelim.exec(e);if(!(!s||s[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(s[1]||s[2])||!n||this.rules.inline.punctuation.exec(n))){let i=[...s[0]].length-1,o,r,l=i,a=0,c=s[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+i);(s=c.exec(t))!=null;){if(o=s[1]||s[2]||s[3]||s[4]||s[5]||s[6],!o)continue;if(r=[...o].length,s[3]||s[4]){l+=r;continue}else if((s[5]||s[6])&&i%3&&!((i+r)%3)){a+=r;continue}if(l-=r,l>0)continue;r=Math.min(r,r+l+a);let u=[...s[0]][0].length,p=e.slice(0,i+s.index+u+r);if(Math.min(i,r)%2){let v=p.slice(1,-1);return{type:"em",raw:p,text:v,tokens:this.lexer.inlineTokens(v)}}let m=p.slice(2,-2);return{type:"strong",raw:p,text:m,tokens:this.lexer.inlineTokens(m)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),s=this.rules.other.nonSpaceChar.test(n),i=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return s&&i&&(n=n.substring(1,n.length-1)),{type:"codespan",raw:t[0],text:n}}}br(e){let t=this.rules.inline.br.exec(e);if(t)return{type:"br",raw:t[0]}}del(e){let t=this.rules.inline.del.exec(e);if(t)return{type:"del",raw:t[0],text:t[2],tokens:this.lexer.inlineTokens(t[2])}}autolink(e){let t=this.rules.inline.autolink.exec(e);if(t){let n,s;return t[2]==="@"?(n=t[1],s="mailto:"+n):(n=t[1],s=n),{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}url(e){let t;if(t=this.rules.inline.url.exec(e)){let n,s;if(t[2]==="@")n=t[0],s="mailto:"+n;else{let i;do i=t[0],t[0]=this.rules.inline._backpedal.exec(t[0])?.[0]??"";while(i!==t[0]);n=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:n,href:s,tokens:[{type:"text",raw:n,text:n}]}}}inlineText(e){let t=this.rules.inline.text.exec(e);if(t){let n=this.lexer.state.inRawBlock;return{type:"text",raw:t[0],text:t[0],escaped:n}}}},he=class Si{tokens;options;state;inlineQueue;tokenizer;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||nt,this.options.tokenizer=this.options.tokenizer||new Yn,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};let n={other:se,block:En.normal,inline:Ot.normal};this.options.pedantic?(n.block=En.pedantic,n.inline=Ot.pedantic):this.options.gfm&&(n.block=En.gfm,this.options.breaks?n.inline=Ot.breaks:n.inline=Ot.gfm),this.tokenizer.rules=n}static get rules(){return{block:En,inline:Ot}}static lex(t,n){return new Si(n).lex(t)}static lexInline(t,n){return new Si(n).inlineTokens(t)}lex(t){t=t.replace(se.carriageReturn,`
1638
- `),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let s=this.inlineQueue[n];this.inlineTokens(s.src,s.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],s=!1){for(this.options.pedantic&&(t=t.replace(se.tabCharGlobal," ").replace(se.spaceLine,""));t;){let i;if(this.options.extensions?.block?.some(r=>(i=r.call({lexer:this},t,n))?(t=t.substring(i.raw.length),n.push(i),!0):!1))continue;if(i=this.tokenizer.space(t)){t=t.substring(i.raw.length);let r=n.at(-1);i.raw.length===1&&r!==void 0?r.raw+=`
1639
- `:n.push(i);continue}if(i=this.tokenizer.code(t)){t=t.substring(i.raw.length);let r=n.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=(r.raw.endsWith(`
1640
- `)?"":`
1641
- `)+i.raw,r.text+=`
1642
- `+i.text,this.inlineQueue.at(-1).src=r.text):n.push(i);continue}if(i=this.tokenizer.fences(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.heading(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.hr(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.blockquote(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.list(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.html(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.def(t)){t=t.substring(i.raw.length);let r=n.at(-1);r?.type==="paragraph"||r?.type==="text"?(r.raw+=(r.raw.endsWith(`
1643
- `)?"":`
1644
- `)+i.raw,r.text+=`
1645
- `+i.raw,this.inlineQueue.at(-1).src=r.text):this.tokens.links[i.tag]||(this.tokens.links[i.tag]={href:i.href,title:i.title},n.push(i));continue}if(i=this.tokenizer.table(t)){t=t.substring(i.raw.length),n.push(i);continue}if(i=this.tokenizer.lheading(t)){t=t.substring(i.raw.length),n.push(i);continue}let o=t;if(this.options.extensions?.startBlock){let r=1/0,l=t.slice(1),a;this.options.extensions.startBlock.forEach(c=>{a=c.call({lexer:this},l),typeof a=="number"&&a>=0&&(r=Math.min(r,a))}),r<1/0&&r>=0&&(o=t.substring(0,r+1))}if(this.state.top&&(i=this.tokenizer.paragraph(o))){let r=n.at(-1);s&&r?.type==="paragraph"?(r.raw+=(r.raw.endsWith(`
1646
- `)?"":`
1647
- `)+i.raw,r.text+=`
1648
- `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):n.push(i),s=o.length!==t.length,t=t.substring(i.raw.length);continue}if(i=this.tokenizer.text(t)){t=t.substring(i.raw.length);let r=n.at(-1);r?.type==="text"?(r.raw+=(r.raw.endsWith(`
1649
- `)?"":`
1650
- `)+i.raw,r.text+=`
1651
- `+i.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):n.push(i);continue}if(t){let r="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(r);break}else throw new Error(r)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){let s=t,i=null;if(this.tokens.links){let a=Object.keys(this.tokens.links);if(a.length>0)for(;(i=this.tokenizer.rules.inline.reflinkSearch.exec(s))!=null;)a.includes(i[0].slice(i[0].lastIndexOf("[")+1,-1))&&(s=s.slice(0,i.index)+"["+"a".repeat(i[0].length-2)+"]"+s.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(i=this.tokenizer.rules.inline.anyPunctuation.exec(s))!=null;)s=s.slice(0,i.index)+"++"+s.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(i=this.tokenizer.rules.inline.blockSkip.exec(s))!=null;)o=i[2]?i[2].length:0,s=s.slice(0,i.index+o)+"["+"a".repeat(i[0].length-o-2)+"]"+s.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);s=this.options.hooks?.emStrongMask?.call({lexer:this},s)??s;let r=!1,l="";for(;t;){r||(l=""),r=!1;let a;if(this.options.extensions?.inline?.some(u=>(a=u.call({lexer:this},t,n))?(t=t.substring(a.raw.length),n.push(a),!0):!1))continue;if(a=this.tokenizer.escape(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.tag(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.link(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(a.raw.length);let u=n.at(-1);a.type==="text"&&u?.type==="text"?(u.raw+=a.raw,u.text+=a.text):n.push(a);continue}if(a=this.tokenizer.emStrong(t,s,l)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.codespan(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.br(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.del(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.autolink(t)){t=t.substring(a.raw.length),n.push(a);continue}if(!this.state.inLink&&(a=this.tokenizer.url(t))){t=t.substring(a.raw.length),n.push(a);continue}let c=t;if(this.options.extensions?.startInline){let u=1/0,p=t.slice(1),m;this.options.extensions.startInline.forEach(v=>{m=v.call({lexer:this},p),typeof m=="number"&&m>=0&&(u=Math.min(u,m))}),u<1/0&&u>=0&&(c=t.substring(0,u+1))}if(a=this.tokenizer.inlineText(c)){t=t.substring(a.raw.length),a.raw.slice(-1)!=="_"&&(l=a.raw.slice(-1)),r=!0;let u=n.at(-1);u?.type==="text"?(u.raw+=a.raw,u.text+=a.text):n.push(a);continue}if(t){let u="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(u);break}else throw new Error(u)}}return n}},Qn=class{options;parser;constructor(e){this.options=e||nt}space(e){return""}code({text:e,lang:t,escaped:n}){let s=(t||"").match(se.notSpaceStart)?.[0],i=e.replace(se.endingNewline,"")+`
1652
- `;return s?'<pre><code class="language-'+Ee(s)+'">'+(n?i:Ee(i,!0))+`</code></pre>
1653
- `:"<pre><code>"+(n?i:Ee(i,!0))+`</code></pre>
1654
- `}blockquote({tokens:e}){return`<blockquote>
1655
- ${this.parser.parse(e)}</blockquote>
1656
- `}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
1657
- `}hr(e){return`<hr>
1658
- `}list(e){let t=e.ordered,n=e.start,s="";for(let r=0;r<e.items.length;r++){let l=e.items[r];s+=this.listitem(l)}let i=t?"ol":"ul",o=t&&n!==1?' start="'+n+'"':"";return"<"+i+o+`>
1659
- `+s+"</"+i+`>
1660
- `}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
1661
- `}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
1662
- `}table(e){let t="",n="";for(let i=0;i<e.header.length;i++)n+=this.tablecell(e.header[i]);t+=this.tablerow({text:n});let s="";for(let i=0;i<e.rows.length;i++){let o=e.rows[i];n="";for(let r=0;r<o.length;r++)n+=this.tablecell(o[r]);s+=this.tablerow({text:n})}return s&&(s=`<tbody>${s}</tbody>`),`<table>
1663
- <thead>
1664
- `+t+`</thead>
1665
- `+s+`</table>
1666
- `}tablerow({text:e}){return`<tr>
1667
- ${e}</tr>
1668
- `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
1669
- `}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>${Ee(e,!0)}</code>`}br(e){return"<br>"}del({tokens:e}){return`<del>${this.parser.parseInline(e)}</del>`}link({href:e,title:t,tokens:n}){let s=this.parser.parseInline(n),i=Hr(e);if(i===null)return s;e=i;let o='<a href="'+e+'"';return t&&(o+=' title="'+Ee(t)+'"'),o+=">"+s+"</a>",o}image({href:e,title:t,text:n,tokens:s}){s&&(n=this.parser.parseInline(s,this.parser.textRenderer));let i=Hr(e);if(i===null)return Ee(n);e=i;let o=`<img src="${e}" alt="${n}"`;return t&&(o+=` title="${Ee(t)}"`),o+=">",o}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:Ee(e.text)}},bo=class{strong({text:e}){return e}em({text:e}){return e}codespan({text:e}){return e}del({text:e}){return e}html({text:e}){return e}text({text:e}){return e}link({text:e}){return""+e}image({text:e}){return""+e}br(){return""}checkbox({raw:e}){return e}},fe=class xi{options;renderer;textRenderer;constructor(t){this.options=t||nt,this.options.renderer=this.options.renderer||new Qn,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new bo}static parse(t,n){return new xi(n).parse(t)}static parseInline(t,n){return new xi(n).parseInline(t)}parse(t){let n="";for(let s=0;s<t.length;s++){let i=t[s];if(this.options.extensions?.renderers?.[i.type]){let r=i,l=this.options.extensions.renderers[r.type].call({parser:this},r);if(l!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(r.type)){n+=l||"";continue}}let o=i;switch(o.type){case"space":{n+=this.renderer.space(o);break}case"hr":{n+=this.renderer.hr(o);break}case"heading":{n+=this.renderer.heading(o);break}case"code":{n+=this.renderer.code(o);break}case"table":{n+=this.renderer.table(o);break}case"blockquote":{n+=this.renderer.blockquote(o);break}case"list":{n+=this.renderer.list(o);break}case"checkbox":{n+=this.renderer.checkbox(o);break}case"html":{n+=this.renderer.html(o);break}case"def":{n+=this.renderer.def(o);break}case"paragraph":{n+=this.renderer.paragraph(o);break}case"text":{n+=this.renderer.text(o);break}default:{let r='Token with "'+o.type+'" type was not found.';if(this.options.silent)return console.error(r),"";throw new Error(r)}}}return n}parseInline(t,n=this.renderer){let s="";for(let i=0;i<t.length;i++){let o=t[i];if(this.options.extensions?.renderers?.[o.type]){let l=this.options.extensions.renderers[o.type].call({parser:this},o);if(l!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(o.type)){s+=l||"";continue}}let r=o;switch(r.type){case"escape":{s+=n.text(r);break}case"html":{s+=n.html(r);break}case"link":{s+=n.link(r);break}case"image":{s+=n.image(r);break}case"checkbox":{s+=n.checkbox(r);break}case"strong":{s+=n.strong(r);break}case"em":{s+=n.em(r);break}case"codespan":{s+=n.codespan(r);break}case"br":{s+=n.br(r);break}case"del":{s+=n.del(r);break}case"text":{s+=n.text(r);break}default:{let l='Token with "'+r.type+'" type was not found.';if(this.options.silent)return console.error(l),"";throw new Error(l)}}}return s}},Wt=class{options;block;constructor(e){this.options=e||nt}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?he.lex:he.lexInline}provideParser(){return this.block?fe.parse:fe.parseInline}},xf=class{defaults=uo();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=fe;Renderer=Qn;TextRenderer=bo;Lexer=he;Tokenizer=Yn;Hooks=Wt;constructor(...e){this.use(...e)}walkTokens(e,t){let n=[];for(let s of e)switch(n=n.concat(t.call(this,s)),s.type){case"table":{let i=s;for(let o of i.header)n=n.concat(this.walkTokens(o.tokens,t));for(let o of i.rows)for(let r of o)n=n.concat(this.walkTokens(r.tokens,t));break}case"list":{let i=s;n=n.concat(this.walkTokens(i.items,t));break}default:{let i=s;this.defaults.extensions?.childTokens?.[i.type]?this.defaults.extensions.childTokens[i.type].forEach(o=>{let r=i[o].flat(1/0);n=n.concat(this.walkTokens(r,t))}):i.tokens&&(n=n.concat(this.walkTokens(i.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let s={...n};if(s.async=this.defaults.async||s.async||!1,n.extensions&&(n.extensions.forEach(i=>{if(!i.name)throw new Error("extension name required");if("renderer"in i){let o=t.renderers[i.name];o?t.renderers[i.name]=function(...r){let l=i.renderer.apply(this,r);return l===!1&&(l=o.apply(this,r)),l}:t.renderers[i.name]=i.renderer}if("tokenizer"in i){if(!i.level||i.level!=="block"&&i.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=t[i.level];o?o.unshift(i.tokenizer):t[i.level]=[i.tokenizer],i.start&&(i.level==="block"?t.startBlock?t.startBlock.push(i.start):t.startBlock=[i.start]:i.level==="inline"&&(t.startInline?t.startInline.push(i.start):t.startInline=[i.start]))}"childTokens"in i&&i.childTokens&&(t.childTokens[i.name]=i.childTokens)}),s.extensions=t),n.renderer){let i=this.defaults.renderer||new Qn(this.defaults);for(let o in n.renderer){if(!(o in i))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let r=o,l=n.renderer[r],a=i[r];i[r]=(...c)=>{let u=l.apply(i,c);return u===!1&&(u=a.apply(i,c)),u||""}}s.renderer=i}if(n.tokenizer){let i=this.defaults.tokenizer||new Yn(this.defaults);for(let o in n.tokenizer){if(!(o in i))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let r=o,l=n.tokenizer[r],a=i[r];i[r]=(...c)=>{let u=l.apply(i,c);return u===!1&&(u=a.apply(i,c)),u}}s.tokenizer=i}if(n.hooks){let i=this.defaults.hooks||new Wt;for(let o in n.hooks){if(!(o in i))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let r=o,l=n.hooks[r],a=i[r];Wt.passThroughHooks.has(o)?i[r]=c=>{if(this.defaults.async&&Wt.passThroughHooksRespectAsync.has(o))return(async()=>{let p=await l.call(i,c);return a.call(i,p)})();let u=l.call(i,c);return a.call(i,u)}:i[r]=(...c)=>{if(this.defaults.async)return(async()=>{let p=await l.apply(i,c);return p===!1&&(p=await a.apply(i,c)),p})();let u=l.apply(i,c);return u===!1&&(u=a.apply(i,c)),u}}s.hooks=i}if(n.walkTokens){let i=this.defaults.walkTokens,o=n.walkTokens;s.walkTokens=function(r){let l=[];return l.push(o.call(this,r)),i&&(l=l.concat(i.call(this,r))),l}}this.defaults={...this.defaults,...s}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return he.lex(e,t??this.defaults)}parser(e,t){return fe.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let s={...n},i={...this.defaults,...s},o=this.onError(!!i.silent,!!i.async);if(this.defaults.async===!0&&s.async===!1)return o(new 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 o(new Error("marked(): input parameter is undefined or null"));if(typeof t!="string")return o(new 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 r=i.hooks?await i.hooks.preprocess(t):t,l=await(i.hooks?await i.hooks.provideLexer():e?he.lex:he.lexInline)(r,i),a=i.hooks?await i.hooks.processAllTokens(l):l;i.walkTokens&&await Promise.all(this.walkTokens(a,i.walkTokens));let c=await(i.hooks?await i.hooks.provideParser():e?fe.parse:fe.parseInline)(a,i);return i.hooks?await i.hooks.postprocess(c):c})().catch(o);try{i.hooks&&(t=i.hooks.preprocess(t));let r=(i.hooks?i.hooks.provideLexer():e?he.lex:he.lexInline)(t,i);i.hooks&&(r=i.hooks.processAllTokens(r)),i.walkTokens&&this.walkTokens(r,i.walkTokens);let l=(i.hooks?i.hooks.provideParser():e?fe.parse:fe.parseInline)(r,i);return i.hooks&&(l=i.hooks.postprocess(l)),l}catch(r){return o(r)}}}onError(e,t){return n=>{if(n.message+=`
1670
- Please report this to https://github.com/markedjs/marked.`,e){let s="<p>An error occurred:</p><pre>"+Ee(n.message+"",!0)+"</pre>";return t?Promise.resolve(s):s}if(t)return Promise.reject(n);throw n}}},Ze=new xf;function O(e,t){return Ze.parse(e,t)}O.options=O.setOptions=function(e){return Ze.setOptions(e),O.defaults=Ze.defaults,Nl(O.defaults),O};O.getDefaults=uo;O.defaults=nt;O.use=function(...e){return Ze.use(...e),O.defaults=Ze.defaults,Nl(O.defaults),O};O.walkTokens=function(e,t){return Ze.walkTokens(e,t)};O.parseInline=Ze.parseInline;O.Parser=fe;O.parser=fe.parse;O.Renderer=Qn;O.TextRenderer=bo;O.Lexer=he;O.lexer=he.lex;O.Tokenizer=Yn;O.Hooks=Wt;O.parse=O;O.options;O.setOptions;O.use;O.walkTokens;O.parseInline;fe.parse;he.lex;O.setOptions({gfm:!0,breaks:!0,mangle:!1});const Vr=["a","b","blockquote","br","code","del","em","h1","h2","h3","h4","hr","i","li","ol","p","pre","strong","table","tbody","td","th","thead","tr","ul"],Yr=["class","href","rel","target","title","start"];let Qr=!1;const Af=14e4,$f=4e4,Ef=200,qs=5e4,Ge=new Map;function Tf(e){const t=Ge.get(e);return t===void 0?null:(Ge.delete(e),Ge.set(e,t),t)}function Xr(e,t){if(Ge.set(e,t),Ge.size<=Ef)return;const n=Ge.keys().next().value;n&&Ge.delete(n)}function Cf(){Qr||(Qr=!0,wi.addHook("afterSanitizeAttributes",e=>{!(e instanceof HTMLAnchorElement)||!e.getAttribute("href")||(e.setAttribute("rel","noreferrer noopener"),e.setAttribute("target","_blank"))}))}function Ai(e){const t=e.trim();if(!t)return"";if(Cf(),t.length<=qs){const r=Tf(t);if(r!==null)return r}const n=Ia(t,Af),s=n.truncated?`
1671
-
1672
- … truncated (${n.total} chars, showing first ${n.text.length}).`:"";if(n.text.length>$f){const l=`<pre class="code-block">${_f(`${n.text}${s}`)}</pre>`,a=wi.sanitize(l,{ALLOWED_TAGS:Vr,ALLOWED_ATTR:Yr});return t.length<=qs&&Xr(t,a),a}const i=O.parse(`${n.text}${s}`),o=wi.sanitize(i,{ALLOWED_TAGS:Vr,ALLOWED_ATTR:Yr});return t.length<=qs&&Xr(t,o),o}function _f(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const Mf=1500,Lf=2e3,ql="Copy as markdown",Pf="Copied",Rf="Copy failed";async function If(e){if(!e)return!1;try{return await navigator.clipboard.writeText(e),!0}catch{try{const t=document.createElement("textarea");t.value=e,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select();const n=document.execCommand("copy");return document.body.removeChild(t),n}catch{return!1}}}function Tn(e,t){e.title=t,e.setAttribute("aria-label",t)}function Nf(e){const t=e.label??ql;return d`
1673
- <button
1674
- class="chat-copy-btn"
1675
- type="button"
1676
- title=${t}
1677
- aria-label=${t}
1678
- @click=${async n=>{const s=n.currentTarget;if(s?.querySelector(".chat-copy-btn__icon"),!s||s.dataset.copying==="1")return;s.dataset.copying="1",s.setAttribute("aria-busy","true"),s.disabled=!0;const i=await If(e.text());if(s.isConnected){if(delete s.dataset.copying,s.removeAttribute("aria-busy"),s.disabled=!1,!i){s.dataset.error="1",Tn(s,Rf),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.error,Tn(s,t))},Lf);return}s.dataset.copied="1",Tn(s,Pf),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.copied,Tn(s,t))},Mf)}}}
1679
- >
1680
- <span class="chat-copy-btn__icon" aria-hidden="true">
1681
- <span class="chat-copy-btn__icon-copy">${N.copy}</span>
1682
- <span class="chat-copy-btn__icon-check">${N.check}</span>
1683
- </span>
1684
- </button>
1685
- `}function Df(e){return Nf({text:()=>e,label:ql})}function Of(e){const t=e,n=Bf(t.content),s=[];for(const i of n){const o=String(i.type??"").toLowerCase();(["toolcall","tool_call","tooluse","tool_use"].includes(o)||typeof i.name=="string"&&i.arguments!=null)&&s.push({kind:"call",name:i.name??"tool",args:Ff(i.arguments??i.args)})}for(const i of n){const o=String(i.type??"").toLowerCase();if(o!=="toolresult"&&o!=="tool_result")continue;const r=Uf(i),l=typeof i.name=="string"?i.name:"tool";s.push({kind:"result",name:l,text:r})}if(Ba(e)&&!s.some(i=>i.kind==="result")){const i=typeof t.toolName=="string"&&t.toolName||typeof t.tool_name=="string"&&t.tool_name||"tool",o=Na(e)??void 0;s.push({kind:"result",name:i,text:o})}return s}function Bf(e){return Array.isArray(e)?e.filter(Boolean):[]}function Ff(e){if(typeof e!="string")return e;const t=e.trim();if(!t||!t.startsWith("{")&&!t.startsWith("["))return e;try{return JSON.parse(t)}catch{return e}}function Uf(e){if(typeof e.text=="string")return e.text;if(typeof e.content=="string")return e.content}function Wf(e){const n=e.content,s=[];if(Array.isArray(n))for(const i of n){if(typeof i!="object"||i===null)continue;const o=i;if(o.type==="image"){const r=o.source;if(r?.type==="base64"&&typeof r.data=="string"){const l=r.data,a=r.media_type||"image/png",c=l.startsWith("data:")?l:`data:${a};base64,${l}`;s.push({url:c})}else typeof o.url=="string"&&s.push({url:o.url})}else if(o.type==="image_url"){const r=o.image_url;typeof r?.url=="string"&&s.push({url:r.url})}}return s}function Kf(e){return d`
1686
- <div class="chat-group assistant">
1687
- <div class="chat-group-messages">
1688
- <div class="chat-bubble chat-reading-indicator" aria-hidden="true">
1689
- <span class="chat-reading-indicator__dots">
1690
- <span></span><span></span><span></span>
1691
- </span>
1692
- </div>
1693
- </div>
1694
- </div>
1695
- `}function zf(e,t,n,s){return d`
1696
- <div class="chat-group assistant">
1697
- <div class="chat-group-messages">
1698
- ${Gl({role:"assistant",content:[{type:"text",text:e}],timestamp:t},{isStreaming:!1,showReasoning:!1})}
1699
- </div>
1700
- </div>
1701
- `}function jf(e,t){const n=Oa(e.role),s=n==="user"?"user":n==="assistant"?"assistant":"other",i=new Date(e.timestamp).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"});return d`
1702
- <div class="chat-group ${s}">
1703
- <div class="chat-group-messages">
1704
- ${e.messages.map((o,r)=>Gl(o.message,{isStreaming:e.isStreaming&&r===e.messages.length-1,showReasoning:t.showReasoning}))}
1705
- <div class="chat-group-footer">
1706
- <span class="chat-group-timestamp">${i}</span>
1707
- </div>
1708
- </div>
1709
- </div>
1710
- `}function Hf(e){return e.length===0?b:d`
1711
- <div class="chat-message-images">
1712
- ${e.map(t=>d`
1713
- <img
1714
- src=${t.url}
1715
- alt=${t.alt??"Attached image"}
1716
- class="chat-message-image"
1717
- @click=${()=>window.open(t.url,"_blank")}
1718
- />
1719
- `)}
1720
- </div>
1721
- `}function Gl(e,t,n){const s=e,i=typeof s.role=="string"?s.role:"unknown",o=Ba(e)||i.toLowerCase()==="toolresult"||i.toLowerCase()==="tool_result"||typeof s.toolCallId=="string"||typeof s.tool_call_id=="string",l=Of(e).length>0,a=Wf(e),c=a.length>0,u=Na(e),p=t.showReasoning&&i==="assistant"?Ru(e):null,m=u?.trim()?u:null,v=p?Nu(p):null,w=m,A=(i==="assistant"||i==="user")&&!!w?.trim(),_=["chat-bubble",A?"has-copy":"",t.isStreaming?"streaming":"","fade-in"].filter(Boolean).join(" ");return!w&&(l||o)||!w&&!c?b:d`
1722
- <div class="${_}">
1723
- ${A?Df(w):b}
1724
- ${Hf(a)}
1725
- ${v?d`<div class="chat-thinking">${mi(Ai(v))}</div>`:b}
1726
- ${w?d`<div class="chat-text">${mi(Ai(w))}</div>`:b}
1727
- </div>
1728
- `}function qf(e){return d`
1729
- <div class="sidebar-panel">
1730
- <div class="sidebar-header">
1731
- <div class="sidebar-title">Tool Output</div>
1732
- <button @click=${e.onClose} class="btn" title="Close sidebar">
1733
- ${N.x}
1734
- </button>
1735
- </div>
1736
- <div class="sidebar-content">
1737
- ${e.error?d`
1738
- <div class="callout danger">${e.error}</div>
1739
- <button @click=${e.onViewRawText} class="btn" style="margin-top: 12px;">
1740
- View Raw Text
1741
- </button>
1742
- `:e.content?d`<div class="sidebar-markdown">${mi(Ai(e.content))}</div>`:d`<div class="muted">No content available</div>`}
1743
- </div>
1744
- </div>
1745
- `}var Gf=Object.defineProperty,Vf=Object.getOwnPropertyDescriptor,hs=(e,t,n,s)=>{for(var i=s>1?void 0:s?Vf(t,n):t,o=e.length-1,r;o>=0;o--)(r=e[o])&&(i=(s?r(t,n,i):r(i))||i);return s&&i&&Gf(t,n,i),i};let kt=class extends mt{constructor(){super(...arguments),this.splitRatio=.6,this.minRatio=.4,this.maxRatio=.7,this.isDragging=!1,this.startX=0,this.startRatio=0,this.handleMouseDown=e=>{this.isDragging=!0,this.startX=e.clientX,this.startRatio=this.splitRatio,this.classList.add("dragging"),document.addEventListener("mousemove",this.handleMouseMove),document.addEventListener("mouseup",this.handleMouseUp),e.preventDefault()},this.handleMouseMove=e=>{if(!this.isDragging)return;const t=this.parentElement;if(!t)return;const n=t.getBoundingClientRect().width,i=(e.clientX-this.startX)/n;let o=this.startRatio+i;o=Math.max(this.minRatio,Math.min(this.maxRatio,o)),this.dispatchEvent(new CustomEvent("resize",{detail:{splitRatio:o},bubbles:!0,composed:!0}))},this.handleMouseUp=()=>{this.isDragging=!1,this.classList.remove("dragging"),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp)}}render(){return d``}connectedCallback(){super.connectedCallback(),this.addEventListener("mousedown",this.handleMouseDown)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener("mousedown",this.handleMouseDown),document.removeEventListener("mousemove",this.handleMouseMove),document.removeEventListener("mouseup",this.handleMouseUp)}};kt.styles=Vc`
1746
- :host {
1747
- width: 4px;
1748
- cursor: col-resize;
1749
- background: var(--border, #333);
1750
- transition: background 150ms ease-out;
1751
- flex-shrink: 0;
1752
- position: relative;
1753
- }
1754
-
1755
- :host::before {
1756
- content: "";
1757
- position: absolute;
1758
- top: 0;
1759
- left: -4px;
1760
- right: -4px;
1761
- bottom: 0;
1762
- }
1763
-
1764
- :host(:hover) {
1765
- background: var(--accent, #007bff);
1766
- }
1767
-
1768
- :host(.dragging) {
1769
- background: var(--accent, #007bff);
1770
- }
1771
- `;hs([is({type:Number})],kt.prototype,"splitRatio",2);hs([is({type:Number})],kt.prototype,"minRatio",2);hs([is({type:Number})],kt.prototype,"maxRatio",2);kt=hs([_a("resizable-divider")],kt);function Cn(e){if(typeof e!="string"||!e)throw new Error("expected a non-empty string, got: "+e)}function Gs(e){if(typeof e!="number")throw new Error("expected a number, got: "+e)}const Yf=1,Qf=1,st="emoji",St="keyvalue",wo="favorites",Xf="tokens",Vl="tokens",Zf="unicode",Yl="count",Jf="group",eg="order",Ql="group-order",$i="eTag",Xn="url",Zr="skinTone",$t="readonly",ko="readwrite",Xl="skinUnicodes",tg="skinUnicodes",ng="https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json",sg="en";function ig(e,t){const n=new Set,s=[];for(const i of e){const o=t(i);n.has(o)||(n.add(o),s.push(i))}return s}function Jr(e){return ig(e,t=>t.unicode)}function og(e){function t(n,s,i){const o=s?e.createObjectStore(n,{keyPath:s}):e.createObjectStore(n);if(i)for(const[r,[l,a]]of Object.entries(i))o.createIndex(r,l,{multiEntry:a});return o}t(St),t(st,Zf,{[Vl]:[Xf,!0],[Ql]:[[Jf,eg]],[Xl]:[tg,!0]}),t(wo,void 0,{[Yl]:[""]})}const Ei={},Dn={},Zn={};function Zl(e,t,n){n.onerror=()=>t(n.error),n.onblocked=()=>t(new Error("IDB blocked")),n.onsuccess=()=>e(n.result)}async function rg(e){const t=await new Promise((n,s)=>{const i=indexedDB.open(e,Yf);Ei[e]=i,i.onupgradeneeded=o=>{o.oldVersion<Qf&&og(i.result)},Zl(n,s,i)});return t.onclose=()=>So(e),t}function ag(e){return Dn[e]||(Dn[e]=rg(e)),Dn[e]}function _e(e,t,n,s){return new Promise((i,o)=>{const r=e.transaction(t,n,{durability:"relaxed"}),l=typeof t=="string"?r.objectStore(t):t.map(c=>r.objectStore(c));let a;s(l,r,c=>{a=c}),r.oncomplete=()=>i(a),r.onerror=()=>o(r.error)})}function So(e){const t=Ei[e],n=t&&t.result;if(n){n.close();const s=Zn[e];if(s)for(const i of s)i()}delete Ei[e],delete Dn[e],delete Zn[e]}function lg(e){return new Promise((t,n)=>{So(e);const s=indexedDB.deleteDatabase(e);Zl(t,n,s)})}function cg(e,t){let n=Zn[e];n||(n=Zn[e]=[]),n.push(t)}const ug=new Set([":D","XD",":'D","O:)",":X",":P",";P","XP",":L",":Z",":j","8D","XO","8)",":B",":O",":S",":'o","Dx","X(","D:",":C",">0)",":3","</3","<3","\\M/",":E","8#"]);function yt(e){return e.split(/[\s_]+/).map(t=>!t.match(/\w/)||ug.has(t)?t.toLowerCase():t.replace(/[)(:,]/g,"").replace(/’/g,"'").toLowerCase()).filter(Boolean)}const dg=2;function Jl(e){return e.filter(Boolean).map(t=>t.toLowerCase()).filter(t=>t.length>=dg)}function pg(e){return e.map(({annotation:n,emoticon:s,group:i,order:o,shortcodes:r,skins:l,tags:a,emoji:c,version:u})=>{const p=[...new Set(Jl([...(r||[]).map(yt).flat(),...(a||[]).map(yt).flat(),...yt(n),s]))].sort(),m={annotation:n,group:i,order:o,tags:a,tokens:p,unicode:c,version:u};if(s&&(m.emoticon=s),r&&(m.shortcodes=r),l){m.skinTones=[],m.skinUnicodes=[],m.skinVersions=[];for(const{tone:v,emoji:w,version:A}of l)m.skinTones.push(v),m.skinUnicodes.push(w),m.skinVersions.push(A)}return m})}function ec(e,t,n,s){e[t](n).onsuccess=i=>s&&s(i.target.result)}function Je(e,t,n){ec(e,"get",t,n)}function tc(e,t,n){ec(e,"getAll",t,n)}function xo(e){e.commit&&e.commit()}function hg(e,t){let n=e[0];for(let s=1;s<e.length;s++){const i=e[s];t(n)>t(i)&&(n=i)}return n}function nc(e,t){const n=hg(e,i=>i.length),s=[];for(const i of n)e.some(o=>o.findIndex(r=>t(r)===t(i))===-1)||s.push(i);return s}async function fg(e){return!await Ao(e,St,Xn)}async function gg(e,t,n){const[s,i]=await Promise.all([$i,Xn].map(o=>Ao(e,St,o)));return s===n&&i===t}async function mg(e,t){return _e(e,st,$t,(s,i,o)=>{let r;const l=()=>{s.getAll(r&&IDBKeyRange.lowerBound(r,!0),50).onsuccess=a=>{const c=a.target.result;for(const u of c)if(r=u.unicode,t(u))return o(u);if(c.length<50)return o();l()}};l()})}async function sc(e,t,n,s){{const i=pg(t);await _e(e,[st,St],ko,([o,r],l)=>{let a,c,u=0;function p(){++u===2&&m()}function m(){if(!(a===s&&c===n)){o.clear();for(const v of i)o.put(v);r.put(s,$i),r.put(n,Xn),xo(l)}}Je(r,$i,v=>{a=v,p()}),Je(r,Xn,v=>{c=v,p()})})}}async function yg(e,t){return _e(e,st,$t,(n,s,i)=>{const o=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);tc(n.index(Ql),o,i)})}async function ic(e,t){const n=Jl(yt(t));return n.length?_e(e,st,$t,(s,i,o)=>{const r=[],l=()=>{r.length===n.length&&a()},a=()=>{const c=nc(r,u=>u.unicode);o(c.sort((u,p)=>u.order<p.order?-1:1))};for(let c=0;c<n.length;c++){const u=n[c],p=c===n.length-1?IDBKeyRange.bound(u,u+"￿",!1,!0):IDBKeyRange.only(u);tc(s.index(Vl),p,m=>{r.push(m),l()})}}):[]}async function vg(e,t){const n=await ic(e,t);return n.length?n.filter(s=>(s.shortcodes||[]).map(o=>o.toLowerCase()).includes(t.toLowerCase()))[0]||null:await mg(e,i=>(i.shortcodes||[]).includes(t.toLowerCase()))||null}async function bg(e,t){return _e(e,st,$t,(n,s,i)=>Je(n,t,o=>{if(o)return i(o);Je(n.index(Xl),t,r=>i(r||null))}))}function Ao(e,t,n){return _e(e,t,$t,(s,i,o)=>Je(s,n,o))}function wg(e,t,n,s){return _e(e,t,ko,(i,o)=>{i.put(s,n),xo(o)})}function kg(e,t){return _e(e,wo,ko,(n,s)=>Je(n,t,i=>{n.put((i||0)+1,t),xo(s)}))}function Sg(e,t,n){return n===0?[]:_e(e,[wo,st],$t,([s,i],o,r)=>{const l=[];s.index(Yl).openCursor(void 0,"prev").onsuccess=a=>{const c=a.target.result;if(!c)return r(l);function u(v){if(l.push(v),l.length===n)return r(l);c.continue()}const p=c.primaryKey,m=t.byName(p);if(m)return u(m);Je(i,p,v=>{if(v)return u(v);c.continue()})}})}const _n="";function xg(e,t){const n=new Map;for(const i of e){const o=t(i);for(const r of o){let l=n;for(let c=0;c<r.length;c++){const u=r.charAt(c);let p=l.get(u);p||(p=new Map,l.set(u,p)),l=p}let a=l.get(_n);a||(a=[],l.set(_n,a)),a.push(i)}}return(i,o)=>{let r=n;for(let c=0;c<i.length;c++){const u=i.charAt(c),p=r.get(u);if(p)r=p;else return[]}if(o)return r.get(_n)||[];const l=[],a=[r];for(;a.length;){const u=[...a.shift().entries()].sort((p,m)=>p[0]<m[0]?-1:1);for(const[p,m]of u)p===_n?l.push(...m):a.push(m)}return l}}const Ag=["name","url"];function $g(e){const t=e&&Array.isArray(e),n=t&&e.length&&(!e[0]||Ag.some(s=>!(s in e[0])));if(!t||n)throw new Error("Custom emojis are in the wrong format")}function ea(e){$g(e);const t=(m,v)=>m.name.toLowerCase()<v.name.toLowerCase()?-1:1,n=e.sort(t),i=xg(e,m=>{const v=new Set;if(m.shortcodes)for(const w of m.shortcodes)for(const A of yt(w))v.add(A);return v}),o=m=>i(m,!0),r=m=>i(m,!1),l=m=>{const v=yt(m),w=v.map((A,_)=>(_<v.length-1?o:r)(A));return nc(w,A=>A.name).sort(t)},a=new Map,c=new Map;for(const m of e){c.set(m.name.toLowerCase(),m);for(const v of m.shortcodes||[])a.set(v.toLowerCase(),m)}return{all:n,search:l,byShortcode:m=>a.get(m.toLowerCase()),byName:m=>c.get(m.toLowerCase())}}const Eg=typeof wrappedJSObject<"u";function Ft(e){if(!e)return e;if(Eg&&(e=structuredClone(e)),delete e.tokens,e.skinTones){const t=e.skinTones.length;e.skins=Array(t);for(let n=0;n<t;n++)e.skins[n]={tone:e.skinTones[n],unicode:e.skinUnicodes[n],version:e.skinVersions[n]};delete e.skinTones,delete e.skinUnicodes,delete e.skinVersions}return e}function oc(e){e||console.warn("emoji-picker-element is more efficient if the dataSource server exposes an ETag header.")}const Tg=["annotation","emoji","group","order","version"];function Cg(e){if(!e||!Array.isArray(e)||!e[0]||typeof e[0]!="object"||Tg.some(t=>!(t in e[0])))throw new Error("Emoji data is in the wrong format")}function rc(e,t){if(Math.floor(e.status/100)!==2)throw new Error("Failed to fetch: "+t+": "+e.status)}async function _g(e){const t=await fetch(e,{method:"HEAD"});rc(t,e);const n=t.headers.get("etag");return oc(n),n}async function Ti(e){const t=await fetch(e);rc(t,e);const n=t.headers.get("etag");oc(n);const s=await t.json();return Cg(s),[n,s]}function Mg(e){for(var t="",n=new Uint8Array(e),s=n.byteLength,i=-1;++i<s;)t+=String.fromCharCode(n[i]);return t}function Lg(e){for(var t=e.length,n=new ArrayBuffer(t),s=new Uint8Array(n),i=-1;++i<t;)s[i]=e.charCodeAt(i);return n}async function ac(e){const t=JSON.stringify(e);let n=Lg(t);const s=await crypto.subtle.digest("SHA-1",n),i=Mg(s);return btoa(i)}async function Pg(e,t){let n,s=await _g(t);if(!s){const i=await Ti(t);s=i[0],n=i[1],s||(s=await ac(n))}await gg(e,t,s)||(n||(n=(await Ti(t))[1]),await sc(e,n,t,s))}async function Rg(e,t){let[n,s]=await Ti(t);n||(n=await ac(s)),await sc(e,s,t,n)}async function Ig(e,t){try{await Pg(e,t)}catch(n){if(n.name!=="InvalidStateError")throw n}}class Ng{constructor({dataSource:t=ng,locale:n=sg,customEmoji:s=[]}={}){this.dataSource=t,this.locale=n,this._dbName=`emoji-picker-element-${this.locale}`,this._db=void 0,this._lazyUpdate=void 0,this._custom=ea(s),this._clear=this._clear.bind(this),this._ready=this._init()}async _init(){const t=this._db=await ag(this._dbName);cg(this._dbName,this._clear);const n=this.dataSource;await fg(t)?await Rg(t,n):this._lazyUpdate=Ig(t,n)}async ready(){const t=async()=>(this._ready||(this._ready=this._init()),this._ready);await t(),this._db||await t()}async getEmojiByGroup(t){return Gs(t),await this.ready(),Jr(await yg(this._db,t)).map(Ft)}async getEmojiBySearchQuery(t){Cn(t),await this.ready();const n=this._custom.search(t),s=Jr(await ic(this._db,t)).map(Ft);return[...n,...s]}async getEmojiByShortcode(t){Cn(t),await this.ready();const n=this._custom.byShortcode(t);return n||Ft(await vg(this._db,t))}async getEmojiByUnicodeOrName(t){Cn(t),await this.ready();const n=this._custom.byName(t);return n||Ft(await bg(this._db,t))}async getPreferredSkinTone(){return await this.ready(),await Ao(this._db,St,Zr)||0}async setPreferredSkinTone(t){return Gs(t),await this.ready(),wg(this._db,St,Zr,t)}async incrementFavoriteEmojiCount(t){return Cn(t),await this.ready(),kg(this._db,t)}async getTopFavoriteEmoji(t){return Gs(t),await this.ready(),(await Sg(this._db,this._custom,t)).map(Ft)}set customEmoji(t){this._custom=ea(t)}get customEmoji(){return this._custom.all}async _shutdown(){await this.ready();try{await this._lazyUpdate}catch{}}_clear(){this._db=this._ready=this._lazyUpdate=void 0}async close(){await this._shutdown(),await So(this._dbName)}async delete(){await this._shutdown(),await lg(this._dbName)}}const Ci=[[-1,"✨","custom"],[0,"😀","smileys-emotion"],[1,"👋","people-body"],[3,"🐱","animals-nature"],[4,"🍎","food-drink"],[5,"🏠️","travel-places"],[6,"⚽","activities"],[7,"📝","objects"],[8,"⛔️","symbols"],[9,"🏁","flags"]].map(([e,t,n])=>({id:e,emoji:t,name:n})),Vs=Ci.slice(1),Dg=2,ta=6,lc=typeof requestIdleCallback=="function"?requestIdleCallback:setTimeout;function na(e){return e.unicode.includes("‍")}const Og={"🫪":17,"🫩":16,"🫨":15.1,"🫠":14,"🥲":13.1,"🥻":12.1,"🥰":11,"🤩":5,"👱‍♀️":4,"🤣":3,"👁️‍🗨️":2,"😀":1,"😐️":.7,"😃":.6},Bg=1e3,Fg="🖐️",Ug=8,Wg=["😊","😒","❤️","👍️","😍","😂","😭","☺️","😔","😩","😏","💕","🙌","😘"],cc='"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif',Kg=(e,t)=>e<t?-1:e>t?1:0,sa=(e,t)=>{const n=document.createElement("canvas");n.width=n.height=1;const s=n.getContext("2d",{willReadFrequently:!0});return s.textBaseline="top",s.font=`100px ${cc}`,s.fillStyle=t,s.scale(.01,.01),s.fillText(e,0,0),s.getImageData(0,0,1,1).data},zg=(e,t)=>{const n=[...e].join(","),s=[...t].join(",");return n===s&&!n.startsWith("0,0,0,")};function jg(e){const t=sa(e,"#000"),n=sa(e,"#fff");return t&&n&&zg(t,n)}function Hg(){const e=Object.entries(Og);try{for(const[t,n]of e)if(jg(t))return n}catch{}return e[0][1]}let Ys;const Qs=()=>(Ys||(Ys=new Promise(e=>lc(()=>e(Hg())))),Ys),_i=new Map,qg="️",Gg="\uD83C",Vg="‍",Yg=127995,Qg=57339;function Xg(e,t){if(t===0)return e;const n=e.indexOf(Vg);return n!==-1?e.substring(0,n)+String.fromCodePoint(Yg+t-1)+e.substring(n):(e.endsWith(qg)&&(e=e.substring(0,e.length-1)),e+Gg+String.fromCodePoint(Qg+t-1))}function be(e){e.preventDefault(),e.stopPropagation()}function Xs(e,t,n){return t+=e?-1:1,t<0?t=n.length-1:t>=n.length&&(t=0),t}function uc(e,t){const n=new Set,s=[];for(const i of e){const o=t(i);n.has(o)||(n.add(o),s.push(i))}return s}function Zg(e,t){const n=s=>{const i={};for(const o of s)typeof o.tone=="number"&&o.version<=t&&(i[o.tone]=o.unicode);return i};return e.map(({unicode:s,skins:i,shortcodes:o,url:r,name:l,category:a,annotation:c})=>({unicode:s,name:l,shortcodes:o,url:r,category:a,annotation:c,id:s||l,skins:i&&n(i)}))}const On=requestAnimationFrame;let Jg=typeof ResizeObserver=="function";function em(e,t,n){let s;Jg?(s=new ResizeObserver(n),s.observe(e)):On(n),t.addEventListener("abort",()=>{s&&s.disconnect()})}function ia(e){{const t=document.createRange();return t.selectNode(e.firstChild),t.getBoundingClientRect().width}}let Zs;function tm(e,t,n){let s=!0,i=!1;for(const o of e){const r=n(o);if(!r)continue;const l=ia(r);l===0&&(i=!0),typeof Zs>"u"&&(Zs=ia(t));const a=l/1.8<Zs;_i.set(o.unicode,a),a||(s=!1)}return i&&console.warn(`Emoji support detection failed - emoji character is 0 width.
1772
- This is likely due to using \`display:none\` which is unsupported.
1773
- If this is a Jest/Vitest environment, you can ignore this warning.
1774
- For details see: https://github.com/nolanlawson/emoji-picker-element/issues/514`),s}function nm(e){return uc(e,t=>t)}function sm(e){e&&(e.scrollTop=0)}function Vt(e,t,n){let s=e.get(t);return s||(s=n(),e.set(t,s)),s}function oa(e){return""+e}function im(e){const t=document.createElement("template");return t.innerHTML=e,t}const om=new WeakMap,rm=new WeakMap,am=Symbol("un-keyed"),lm="replaceChildren"in Element.prototype;function cm(e,t){lm?e.replaceChildren(...t):(e.innerHTML="",e.append(...t))}function um(e,t){let n=e.firstChild,s=0;for(;n;){if(t[s]!==n)return!0;n=n.nextSibling,s++}return s!==t.length}function dm(e,t){const{targetNode:n}=t;let{targetParentNode:s}=t,i=!1;s?i=um(s,e):(i=!0,t.targetNode=void 0,t.targetParentNode=s=n.parentNode),i&&cm(s,e)}function pm(e,t){for(const n of t){const{targetNode:s,currentExpression:i,binding:{expressionIndex:o,attributeName:r,attributeValuePre:l,attributeValuePost:a}}=n,c=e[o];if(i!==c)if(n.currentExpression=c,r)if(c===null)s.removeAttribute(r);else{const u=l+oa(c)+a;s.setAttribute(r,u)}else{let u;Array.isArray(c)?dm(c,n):c instanceof Element?(u=c,s.replaceWith(u)):s.nodeValue=oa(c),u&&(n.targetNode=u)}}}function hm(e){let t="",n=!1,s=!1,i=-1;const o=new Map,r=[];let l=0;for(let c=0,u=e.length;c<u;c++){const p=e[c];if(t+=p.slice(l),c===u-1)break;for(let C=0;C<p.length;C++)switch(p.charAt(C)){case"<":{p.charAt(C+1)==="/"?r.pop():(n=!0,r.push(++i));break}case">":{n=!1,s=!1;break}case"=":{s=!0;break}}const m=r[r.length-1],v=Vt(o,m,()=>[]);let w,A,_;if(s){const C=/(\S+)="?([^"=]*)$/.exec(p);w=C[1],A=C[2];const P=/^([^">]*)("?)/.exec(e[c+1]);_=P[1],t=t.slice(0,-1*C[0].length),l=P[0].length}else l=0;const j={attributeName:w,attributeValuePre:A,attributeValuePost:_,expressionIndex:c};v.push(j),!n&&!s&&(t+=" ")}return{template:im(t),elementsToBindings:o}}function ra(e,t,n){for(let s=0;s<e.length;s++){const i=e[s],o=i.attributeName?t:t.firstChild,r={binding:i,targetNode:o,targetParentNode:void 0,currentExpression:void 0};n.push(r)}}function fm(e,t){const n=[];let s;if(t.size===1&&(s=t.get(0)))ra(s,e,n);else{const i=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);let o=e,r=-1;do{const l=t.get(++r);l&&ra(l,o,n)}while(o=i.nextNode())}return n}function gm(e){const{template:t,elementsToBindings:n}=Vt(om,e,()=>hm(e)),s=t.cloneNode(!0).content.firstElementChild,i=fm(s,n);return function(r){return pm(r,i),s}}function mm(e){const t=Vt(rm,e,()=>new Map);let n=am;function s(o,...r){const l=Vt(t,o,()=>new Map);return Vt(l,n,()=>gm(o))(r)}function i(o,r,l){return o.map((a,c)=>{const u=n;n=l(a);try{return r(a,c)}finally{n=u}})}return{map:i,html:s}}function ym(e,t,n,s,i,o,r,l,a){const{labelWithSkin:c,titleForEmoji:u,unicodeWithSkin:p}=n,{html:m,map:v}=mm(t);function w(C,P,I){return v(C,(B,ue)=>m`<button role="${P?"option":"menuitem"}" aria-selected="${P?ue===t.activeSearchItem:null}" aria-label="${c(B,t.currentSkinTone)}" title="${u(B)}" class="${"emoji"+(P&&ue===t.activeSearchItem?" active":"")+(B.unicode?"":" custom-emoji")}" id="${`${I}-${B.id}`}" style="${B.unicode?null:`--custom-emoji-background: url(${JSON.stringify(B.url)})`}">${B.unicode?p(B,t.currentSkinTone):""}</button>`,B=>`${I}-${B.id}`)}const _=m`<section data-ref="rootElement" class="picker" aria-label="${t.i18n.regionLabel}" style="${t.pickerStyle||""}"><div class="pad-top"></div><div class="search-row"><div class="search-wrapper"><input id="search" class="search" type="search" role="combobox" enterkeyhint="search" placeholder="${t.i18n.searchLabel}" autocapitalize="none" autocomplete="off" spellcheck="true" aria-expanded="${!!(t.searchMode&&t.currentEmojis.length)}" aria-controls="search-results" aria-describedby="search-description" aria-autocomplete="list" aria-activedescendant="${t.activeSearchItemId?`emo-${t.activeSearchItemId}`:null}" data-ref="searchElement" data-on-input="onSearchInput" data-on-keydown="onSearchKeydown"><label class="sr-only" for="search">${t.i18n.searchLabel}</label> <span id="search-description" class="sr-only">${t.i18n.searchDescription}</span></div><div class="skintone-button-wrapper ${t.skinTonePickerExpandedAfterAnimation?"expanded":""}"><button id="skintone-button" class="emoji ${t.skinTonePickerExpanded?"hide-focus":""}" aria-label="${t.skinToneButtonLabel}" title="${t.skinToneButtonLabel}" aria-describedby="skintone-description" aria-haspopup="listbox" aria-expanded="${t.skinTonePickerExpanded}" aria-controls="skintone-list" data-on-click="onClickSkinToneButton">${t.skinToneButtonText||""}</button></div><span id="skintone-description" class="sr-only">${t.i18n.skinToneDescription}</span><div data-ref="skinToneDropdown" id="skintone-list" class="skintone-list hide-focus ${t.skinTonePickerExpanded?"":"hidden no-animate"}" style="transform:translateY(${t.skinTonePickerExpanded?0:"calc(-1 * var(--num-skintones) * var(--total-emoji-size))"})" role="listbox" aria-label="${t.i18n.skinTonesLabel}" aria-activedescendant="skintone-${t.activeSkinTone}" aria-hidden="${!t.skinTonePickerExpanded}" tabIndex="-1" data-on-focusout="onSkinToneOptionsFocusOut" data-on-click="onSkinToneOptionsClick" data-on-keydown="onSkinToneOptionsKeydown" data-on-keyup="onSkinToneOptionsKeyup">${v(t.skinTones,(C,P)=>m`<div id="skintone-${P}" class="emoji ${P===t.activeSkinTone?"active":""}" aria-selected="${P===t.activeSkinTone}" role="option" title="${t.i18n.skinTones[P]}" aria-label="${t.i18n.skinTones[P]}">${C}</div>`,C=>C)}</div></div><div class="nav" role="tablist" style="grid-template-columns:repeat(${t.groups.length},1fr)" aria-label="${t.i18n.categoriesLabel}" data-on-keydown="onNavKeydown" data-on-click="onNavClick">${v(t.groups,C=>m`<button role="tab" class="nav-button" aria-controls="tab-${C.id}" aria-label="${t.i18n.categories[C.name]}" aria-selected="${!t.searchMode&&t.currentGroup.id===C.id}" title="${t.i18n.categories[C.name]}" data-group-id="${C.id}"><div class="nav-emoji emoji">${C.emoji}</div></button>`,C=>C.id)}</div><div class="indicator-wrapper"><div class="indicator" style="transform:translateX(${(t.isRtl?-1:1)*t.currentGroupIndex*100}%)"></div></div><div class="message ${t.message?"":"gone"}" role="alert" aria-live="polite">${t.message||""}</div><div data-ref="tabpanelElement" class="tabpanel ${!t.databaseLoaded||t.message?"gone":""}" role="${t.searchMode?"region":"tabpanel"}" aria-label="${t.searchMode?t.i18n.searchResultsLabel:t.i18n.categories[t.currentGroup.name]}" id="${t.searchMode?null:`tab-${t.currentGroup.id}`}" tabIndex="0" data-on-click="onEmojiClick"><div data-action="calculateEmojiGridStyle">${v(t.currentEmojisWithCategories,(C,P)=>m`<div><div id="menu-label-${P}" class="category ${t.currentEmojisWithCategories.length===1&&t.currentEmojisWithCategories[0].category===""?"gone":""}" aria-hidden="true">${t.searchMode?t.i18n.searchResultsLabel:C.category?C.category:t.currentEmojisWithCategories.length>1?t.i18n.categories.custom:t.i18n.categories[t.currentGroup.name]}</div><div class="emoji-menu ${P!==0&&!t.searchMode&&t.currentGroup.id===-1?"visibility-auto":""}" style="${`--num-rows: ${Math.ceil(C.emojis.length/t.numColumns)}`}" data-action="updateOnIntersection" role="${t.searchMode?"listbox":"menu"}" aria-labelledby="menu-label-${P}" id="${t.searchMode?"search-results":null}">${w(C.emojis,t.searchMode,"emo")}</div></div>`,C=>C.category)}</div></div><div class="favorites onscreen emoji-menu ${t.message?"gone":""}" role="menu" aria-label="${t.i18n.favoritesLabel}" data-on-click="onEmojiClick">${w(t.currentFavorites,!1,"fav")}</div><button data-ref="baselineEmoji" aria-hidden="true" tabindex="-1" class="abs-pos hidden emoji baseline-emoji">😀</button></section>`,j=(C,P)=>{for(const I of e.querySelectorAll(`[${C}]`))P(I,I.getAttribute(C))};if(a){e.appendChild(_);for(const C of["click","focusout","input","keydown","keyup"])j(`data-on-${C}`,(P,I)=>{P.addEventListener(C,s[I])});j("data-ref",(C,P)=>{o[P]=C}),r.addEventListener("abort",()=>{e.removeChild(_)})}j("data-action",(C,P)=>{let I=l.get(P);I||l.set(P,I=new WeakSet),I.has(C)||(I.add(C),i[P](C))})}const Jn=typeof queueMicrotask=="function"?queueMicrotask:e=>Promise.resolve().then(e);function vm(e){let t=!1,n;const s=new Map,i=new Set;let o;const r=()=>{if(t)return;const c=[...i];i.clear();try{for(const u of c)u()}finally{o=!1,i.size&&(o=!0,Jn(r))}},l=new Proxy({},{get(c,u){if(n){let p=s.get(u);p||(p=new Set,s.set(u,p)),p.add(n)}return c[u]},set(c,u,p){if(c[u]!==p){c[u]=p;const m=s.get(u);if(m){for(const v of m)i.add(v);o||(o=!0,Jn(r))}}return!0}}),a=c=>{const u=()=>{const p=n;n=u;try{return c()}finally{n=p}};return u()};return e.addEventListener("abort",()=>{t=!0}),{state:l,createEffect:a}}function Js(e,t,n){if(e.length!==t.length)return!1;for(let s=0;s<e.length;s++)if(!n(e[s],t[s]))return!1;return!0}const aa=new WeakMap;function bm(e,t,n){{const s=e.closest(".tabpanel");let i=aa.get(s);i||(i=new IntersectionObserver(n,{root:s,rootMargin:"50% 0px 50% 0px",threshold:0}),aa.set(s,i),t.addEventListener("abort",()=>{i.disconnect()})),i.observe(e)}}const ei=[],{assign:Mn}=Object;function wm(e,t){const n={},s=new AbortController,i=s.signal,{state:o,createEffect:r}=vm(i),l=new Map;Mn(o,{skinToneEmoji:void 0,i18n:void 0,database:void 0,customEmoji:void 0,customCategorySorting:void 0,emojiVersion:void 0}),Mn(o,t),Mn(o,{initialLoad:!0,currentEmojis:[],currentEmojisWithCategories:[],rawSearchText:"",searchText:"",searchMode:!1,activeSearchItem:-1,message:void 0,skinTonePickerExpanded:!1,skinTonePickerExpandedAfterAnimation:!1,currentSkinTone:0,activeSkinTone:0,skinToneButtonText:void 0,pickerStyle:void 0,skinToneButtonLabel:"",skinTones:[],currentFavorites:[],defaultFavoriteEmojis:void 0,numColumns:Ug,isRtl:!1,currentGroupIndex:0,groups:Vs,databaseLoaded:!1,activeSearchItemId:void 0}),r(()=>{o.currentGroup!==o.groups[o.currentGroupIndex]&&(o.currentGroup=o.groups[o.currentGroupIndex])});const a=k=>{e.getElementById(k).focus()},c=k=>e.getElementById(`emo-${k.id}`),u=(k,x)=>{n.rootElement.dispatchEvent(new CustomEvent(k,{detail:x,bubbles:!0,composed:!0}))},p=(k,x)=>k.id===x.id,m=(k,x)=>{const{category:M,emojis:L}=k,{category:K,emojis:F}=x;return M!==K?!1:Js(L,F,p)},v=k=>{Js(o.currentEmojis,k,p)||(o.currentEmojis=k)},w=k=>{o.searchMode!==k&&(o.searchMode=k)},A=k=>{Js(o.currentEmojisWithCategories,k,m)||(o.currentEmojisWithCategories=k)},_=(k,x)=>x&&k.skins&&k.skins[x]||k.unicode,P={labelWithSkin:(k,x)=>nm([k.name||_(k,x),k.annotation,...k.shortcodes||ei].filter(Boolean)).join(", "),titleForEmoji:k=>k.annotation||(k.shortcodes||ei).join(", "),unicodeWithSkin:_},I={onClickSkinToneButton:W,onEmojiClick:un,onNavClick:ln,onNavKeydown:ws,onSearchKeydown:bs,onSkinToneOptionsClick:dn,onSkinToneOptionsFocusOut:Me,onSkinToneOptionsKeydown:We,onSkinToneOptionsKeyup:Tt,onSearchInput:pn},B={calculateEmojiGridStyle:gs,updateOnIntersection:ms};let ue=!0;r(()=>{ym(e,o,P,I,B,n,i,l,ue),ue=!1}),o.emojiVersion||Qs().then(k=>{k||(o.message=o.i18n.emojiUnsupportedMessage)}),r(()=>{async function k(){let x=!1;const M=setTimeout(()=>{x=!0,o.message=o.i18n.loadingMessage},Bg);try{await o.database.ready(),o.databaseLoaded=!0}catch(L){console.error(L),o.message=o.i18n.networkErrorMessage}finally{clearTimeout(M),x&&(x=!1,o.message="")}}o.database&&k()}),r(()=>{o.pickerStyle=`
1775
- --num-groups: ${o.groups.length};
1776
- --indicator-opacity: ${o.searchMode?0:1};
1777
- --num-skintones: ${ta};`}),r(()=>{o.customEmoji&&o.database&&it()}),r(()=>{o.customEmoji&&o.customEmoji.length?o.groups!==Ci&&(o.groups=Ci):o.groups!==Vs&&(o.currentGroupIndex&&o.currentGroupIndex--,o.groups=Vs)}),r(()=>{async function k(){o.databaseLoaded&&(o.currentSkinTone=await o.database.getPreferredSkinTone())}k()}),r(()=>{o.skinTones=Array(ta).fill().map((k,x)=>Xg(o.skinToneEmoji,x))}),r(()=>{o.skinToneButtonText=o.skinTones[o.currentSkinTone]}),r(()=>{o.skinToneButtonLabel=o.i18n.skinToneLabel.replace("{skinTone}",o.i18n.skinTones[o.currentSkinTone])}),r(()=>{async function k(){const{database:x}=o,M=(await Promise.all(Wg.map(L=>x.getEmojiByUnicodeOrName(L)))).filter(Boolean);o.defaultFavoriteEmojis=M}o.databaseLoaded&&k()});function it(){const{customEmoji:k,database:x}=o,M=k||ei;x.customEmoji!==M&&(x.customEmoji=M)}r(()=>{async function k(){it();const{database:x,defaultFavoriteEmojis:M,numColumns:L}=o,K=await x.getTopFavoriteEmoji(L),F=await Ue(uc([...K,...M],te=>te.unicode||te.name).slice(0,L));o.currentFavorites=F}o.databaseLoaded&&o.defaultFavoriteEmojis&&k()});function gs(k){em(k,i,()=>{{const x=getComputedStyle(n.rootElement),M=parseInt(x.getPropertyValue("--num-columns"),10),L=x.getPropertyValue("direction")==="rtl";o.numColumns=M,o.isRtl=L}})}function ms(k){bm(k,i,x=>{for(const{target:M,isIntersecting:L}of x)M.classList.toggle("onscreen",L)})}r(()=>{async function k(){const{searchText:x,currentGroup:M,databaseLoaded:L,customEmoji:K}=o;if(!L)o.currentEmojis=[],o.searchMode=!1;else if(x.length>=Dg){const F=await vs(x);o.searchText===x&&(v(F),w(!0))}else{const{id:F}=M;if(F!==-1||K&&K.length){const te=await ys(F);o.currentGroup.id===F&&(v(te),w(!1))}}}k()});const an=()=>{On(()=>sm(n.tabpanelElement))};r(()=>{const{currentEmojis:k,emojiVersion:x}=o,M=k.filter(L=>L.unicode).filter(L=>na(L)&&!_i.has(L.unicode));if(!x&&M.length)v(k),On(()=>Q(M));else{const L=x?k:k.filter(Et);v(L),an()}});function Q(k){tm(k,n.baselineEmoji,c)?an():o.currentEmojis=[...o.currentEmojis]}function Et(k){return!k.unicode||!na(k)||_i.get(k.unicode)}async function ot(k){const x=o.emojiVersion||await Qs();return k.filter(({version:M})=>!M||M<=x)}async function Ue(k){return Zg(k,o.emojiVersion||await Qs())}async function ys(k){const x=k===-1?o.customEmoji:await o.database.getEmojiByGroup(k);return Ue(await ot(x))}async function vs(k){return Ue(await ot(await o.database.getEmojiBySearchQuery(k)))}r(()=>{}),r(()=>{function k(){const{searchMode:M,currentEmojis:L}=o;if(M)return[{category:"",emojis:L}];const K=new Map;for(const F of L){const te=F.category||"";let Le=K.get(te);Le||(Le=[],K.set(te,Le)),Le.push(F)}return[...K.entries()].map(([F,te])=>({category:F,emojis:te})).sort((F,te)=>o.customCategorySorting(F.category,te.category))}const x=k();A(x)}),r(()=>{o.activeSearchItemId=o.activeSearchItem!==-1&&o.currentEmojis[o.activeSearchItem].id}),r(()=>{const{rawSearchText:k}=o;lc(()=>{o.searchText=(k||"").trim(),o.activeSearchItem=-1})});function bs(k){if(!o.searchMode||!o.currentEmojis.length)return;const x=M=>{be(k),o.activeSearchItem=Xs(M,o.activeSearchItem,o.currentEmojis)};switch(k.key){case"ArrowDown":return x(!1);case"ArrowUp":return x(!0);case"Enter":if(o.activeSearchItem===-1)o.activeSearchItem=0;else return be(k),H(o.currentEmojis[o.activeSearchItem].id)}}function ln(k){const{target:x}=k,M=x.closest(".nav-button");if(!M)return;const L=parseInt(M.dataset.groupId,10);n.searchElement.value="",o.rawSearchText="",o.searchText="",o.activeSearchItem=-1,o.currentGroupIndex=o.groups.findIndex(K=>K.id===L)}function ws(k){const{target:x,key:M}=k,L=K=>{K&&(be(k),K.focus())};switch(M){case"ArrowLeft":return L(x.previousElementSibling);case"ArrowRight":return L(x.nextElementSibling);case"Home":return L(x.parentElement.firstElementChild);case"End":return L(x.parentElement.lastElementChild)}}async function cn(k){const x=await o.database.getEmojiByUnicodeOrName(k),M=[...o.currentEmojis,...o.currentFavorites].find(K=>K.id===k),L=M.unicode&&_(M,o.currentSkinTone);return await o.database.incrementFavoriteEmojiCount(k),{emoji:x,skinTone:o.currentSkinTone,...L&&{unicode:L},...M.name&&{name:M.name}}}async function H(k){const x=cn(k);u("emoji-click-sync",x),u("emoji-click",await x)}function un(k){const{target:x}=k;if(!x.classList.contains("emoji"))return;be(k);const M=x.id.substring(4);H(M)}function q(k){o.currentSkinTone=k,o.skinTonePickerExpanded=!1,a("skintone-button"),u("skin-tone-change",{skinTone:k}),o.database.setPreferredSkinTone(k)}function dn(k){const{target:{id:x}}=k,M=x&&x.match(/^skintone-(\d)/);if(!M)return;be(k);const L=parseInt(M[1],10);q(L)}function W(k){o.skinTonePickerExpanded=!o.skinTonePickerExpanded,o.activeSkinTone=o.currentSkinTone,o.skinTonePickerExpanded&&(be(k),On(()=>a("skintone-list")))}r(()=>{o.skinTonePickerExpanded?n.skinToneDropdown.addEventListener("transitionend",()=>{o.skinTonePickerExpandedAfterAnimation=!0},{once:!0}):o.skinTonePickerExpandedAfterAnimation=!1});function We(k){if(!o.skinTonePickerExpanded)return;const x=async M=>{be(k),o.activeSkinTone=M};switch(k.key){case"ArrowUp":return x(Xs(!0,o.activeSkinTone,o.skinTones));case"ArrowDown":return x(Xs(!1,o.activeSkinTone,o.skinTones));case"Home":return x(0);case"End":return x(o.skinTones.length-1);case"Enter":return be(k),q(o.activeSkinTone);case"Escape":return be(k),o.skinTonePickerExpanded=!1,a("skintone-button")}}function Tt(k){if(o.skinTonePickerExpanded&&k.key===" ")return be(k),q(o.activeSkinTone)}async function Me(k){const{relatedTarget:x}=k;(!x||x.id!=="skintone-list")&&(o.skinTonePickerExpanded=!1)}function pn(k){o.rawSearchText=k.target.value}return{$set(k){Mn(o,k)},$destroy(){s.abort()}}}const km="https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json",Sm="en";var xm={categoriesLabel:"Categories",emojiUnsupportedMessage:"Your browser does not support color emoji.",favoritesLabel:"Favorites",loadingMessage:"Loading…",networkErrorMessage:"Could not load emoji.",regionLabel:"Emoji picker",searchDescription:"When search results are available, press up or down to select and enter to choose.",searchLabel:"Search",searchResultsLabel:"Search results",skinToneDescription:"When expanded, press up or down to select and enter to choose.",skinToneLabel:"Choose a skin tone (currently {skinTone})",skinTonesLabel:"Skin tones",skinTones:["Default","Light","Medium-Light","Medium","Medium-Dark","Dark"],categories:{custom:"Custom","smileys-emotion":"Smileys and emoticons","people-body":"People and body","animals-nature":"Animals and nature","food-drink":"Food and drink","travel-places":"Travel and places",activities:"Activities",objects:"Objects",symbols:"Symbols",flags:"Flags"}},Am=':host{--emoji-size:1.375rem;--emoji-padding:0.5rem;--category-emoji-size:var(--emoji-size);--category-emoji-padding:var(--emoji-padding);--indicator-height:3px;--input-border-radius:0.5rem;--input-border-size:1px;--input-font-size:1rem;--input-line-height:1.5;--input-padding:0.25rem;--num-columns:8;--outline-size:2px;--border-size:1px;--border-radius:0;--skintone-border-radius:1rem;--category-font-size:1rem;display:flex;width:min-content;height:400px}:host,:host(.light){color-scheme:light;--background:#fff;--border-color:#e0e0e0;--indicator-color:#385ac1;--input-border-color:#999;--input-font-color:#111;--input-placeholder-color:#999;--outline-color:#999;--category-font-color:#111;--button-active-background:#e6e6e6;--button-hover-background:#d9d9d9}:host(.dark){color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}@media (prefers-color-scheme:dark){:host{color-scheme:dark;--background:#222;--border-color:#444;--indicator-color:#5373ec;--input-border-color:#ccc;--input-font-color:#efefef;--input-placeholder-color:#ccc;--outline-color:#fff;--category-font-color:#efefef;--button-active-background:#555555;--button-hover-background:#484848}}:host([hidden]){display:none}button{margin:0;padding:0;border:0;background:0 0;box-shadow:none;-webkit-tap-highlight-color:transparent}button::-moz-focus-inner{border:0}input{padding:0;margin:0;line-height:1.15;font-family:inherit}input[type=search]{-webkit-appearance:none}:focus{outline:var(--outline-color) solid var(--outline-size);outline-offset:calc(-1*var(--outline-size))}:host([data-js-focus-visible]) :focus:not([data-focus-visible-added]){outline:0}:focus:not(:focus-visible){outline:0}.hide-focus{outline:0}*{box-sizing:border-box}.picker{contain:content;display:flex;flex-direction:column;background:var(--background);border:var(--border-size) solid var(--border-color);border-radius:var(--border-radius);width:100%;height:100%;overflow:hidden;--total-emoji-size:calc(var(--emoji-size) + (2 * var(--emoji-padding)));--total-category-emoji-size:calc(var(--category-emoji-size) + (2 * var(--category-emoji-padding)))}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.hidden{opacity:0;pointer-events:none}.abs-pos{position:absolute;left:0;top:0}.gone{display:none!important}.skintone-button-wrapper,.skintone-list{background:var(--background);z-index:3}.skintone-button-wrapper.expanded{z-index:1}.skintone-list{position:absolute;inset-inline-end:0;top:0;z-index:2;overflow:visible;border-bottom:var(--border-size) solid var(--border-color);border-radius:0 0 var(--skintone-border-radius) var(--skintone-border-radius);will-change:transform;transition:transform .2s ease-in-out;transform-origin:center 0}@media (prefers-reduced-motion:reduce){.skintone-list{transition-duration:.001s}}@supports not (inset-inline-end:0){.skintone-list{right:0}}.skintone-list.no-animate{transition:none}.tabpanel{overflow-y:auto;scrollbar-gutter:stable;-webkit-overflow-scrolling:touch;will-change:transform;min-height:0;flex:1;contain:content}.emoji-menu{display:grid;grid-template-columns:repeat(var(--num-columns),var(--total-emoji-size));justify-content:space-around;align-items:flex-start;width:100%}.emoji-menu.visibility-auto{content-visibility:auto;contain-intrinsic-size:calc(var(--num-columns)*var(--total-emoji-size)) calc(var(--num-rows)*var(--total-emoji-size))}.category{padding:var(--emoji-padding);font-size:var(--category-font-size);color:var(--category-font-color)}.emoji,button.emoji{font-size:var(--emoji-size);display:flex;align-items:center;justify-content:center;border-radius:100%;height:var(--total-emoji-size);width:var(--total-emoji-size);line-height:1;overflow:hidden;font-family:var(--emoji-font-family);cursor:pointer}@media (hover:hover) and (pointer:fine){.emoji:hover,button.emoji:hover{background:var(--button-hover-background)}}.emoji.active,.emoji:active,button.emoji.active,button.emoji:active{background:var(--button-active-background)}.onscreen .custom-emoji::after{content:"";width:var(--emoji-size);height:var(--emoji-size);background-repeat:no-repeat;background-position:center center;background-size:contain;background-image:var(--custom-emoji-background)}.nav,.nav-button{align-items:center}.nav{display:grid;justify-content:space-between;contain:content}.nav-button{display:flex;justify-content:center}.nav-emoji{font-size:var(--category-emoji-size);width:var(--total-category-emoji-size);height:var(--total-category-emoji-size)}.indicator-wrapper{display:flex;border-bottom:1px solid var(--border-color)}.indicator{width:calc(100%/var(--num-groups));height:var(--indicator-height);opacity:var(--indicator-opacity);background-color:var(--indicator-color);will-change:transform,opacity;transition:opacity .1s linear,transform .25s ease-in-out}@media (prefers-reduced-motion:reduce){.indicator{will-change:opacity;transition:opacity .1s linear}}.pad-top,input.search{background:var(--background);width:100%}.pad-top{height:var(--emoji-padding);z-index:3}.search-row{display:flex;align-items:center;position:relative;padding-inline-start:var(--emoji-padding);padding-bottom:var(--emoji-padding)}.search-wrapper{flex:1;min-width:0}input.search{padding:var(--input-padding);border-radius:var(--input-border-radius);border:var(--input-border-size) solid var(--input-border-color);color:var(--input-font-color);font-size:var(--input-font-size);line-height:var(--input-line-height)}input.search::placeholder{color:var(--input-placeholder-color)}.favorites{overflow-y:auto;scrollbar-gutter:stable;display:flex;flex-direction:row;border-top:var(--border-size) solid var(--border-color);contain:content}.message{padding:var(--emoji-padding)}';const dc=["customEmoji","customCategorySorting","database","dataSource","i18n","locale","skinToneEmoji","emojiVersion"],$m=`:host{--emoji-font-family:${cc}}`;class $o extends HTMLElement{constructor(t){super(),this.attachShadow({mode:"open"});const n=document.createElement("style");n.textContent=Am+$m,this.shadowRoot.appendChild(n),this._ctx={locale:Sm,dataSource:km,skinToneEmoji:Fg,customCategorySorting:Kg,customEmoji:null,i18n:xm,emojiVersion:null,...t};for(const s of dc)s!=="database"&&Object.prototype.hasOwnProperty.call(this,s)&&(this._ctx[s]=this[s],delete this[s]);this._dbFlush()}connectedCallback(){la(this),this._cmp||(this._cmp=wm(this.shadowRoot,this._ctx))}disconnectedCallback(){la(this),Jn(()=>{if(!this.isConnected&&this._cmp){this._cmp.$destroy(),this._cmp=void 0;const{database:t}=this._ctx;t.close().catch(n=>console.error(n))}})}static get observedAttributes(){return["locale","data-source","skin-tone-emoji","emoji-version"]}attributeChangedCallback(t,n,s){this._set(t.replace(/-([a-z])/g,(i,o)=>o.toUpperCase()),t==="emoji-version"?parseFloat(s):s)}_set(t,n){this._ctx[t]=n,this._cmp&&this._cmp.$set({[t]:n}),["locale","dataSource"].includes(t)&&this._dbFlush()}_dbCreate(){const{locale:t,dataSource:n,database:s}=this._ctx;(!s||s.locale!==t||s.dataSource!==n)&&this._set("database",new Ng({locale:t,dataSource:n}))}_dbFlush(){Jn(()=>this._dbCreate())}}const pc={};for(const e of dc)pc[e]={get(){return e==="database"&&this._dbCreate(),this._ctx[e]},set(t){if(e==="database")throw new Error("database is read-only");this._set(e,t)}};Object.defineProperties($o.prototype,pc);function la(e){e instanceof $o||Object.setPrototypeOf(e,customElements.get(e.tagName.toLowerCase()).prototype)}customElements.get("emoji-picker")||customElements.define("emoji-picker",$o);function Em(e){e.style.height="0";const t=Math.max(e.scrollHeight,44);e.style.height=`${t}px`,e.style.overflowY=e.scrollHeight>e.offsetHeight?"auto":"hidden"}function ca(e){e.style.height="44px",e.style.overflowY="hidden"}const Tm=5e3;function Cm(e){return e?e.active?d`
1778
- <div class="callout info compaction-indicator compaction-indicator--active">
1779
- ${N.loader} Compacting context...
1780
- </div>
1781
- `:e.completedAt&&Date.now()-e.completedAt<Tm?d`
1782
- <div class="callout success compaction-indicator compaction-indicator--complete">
1783
- ${N.check} Context compacted
1784
- </div>
1785
- `:b:b}const Kt=5*1024*1024;function zt(){return`att-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function ht(e,t){let n=e.closest(".chat")?.querySelector(".chat-attachment-error");if(!n){n=document.createElement("div"),n.className="callout danger chat-attachment-error",n.style.cssText="margin: 8px 4px; animation: fade-in 200ms ease-out;";const s=e.closest(".chat")?.querySelector(".chat-compose");s?.parentElement?.insertBefore(n,s)}n.textContent=t,setTimeout(()=>n?.remove(),4e3)}const _m=/\.(md|txt|csv|json|xml|html|css|js|ts|py|sh|yaml|yml|toml|ini|cfg|log|sql)$/i;function Mm(e){return e.type.startsWith("image/")||/\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(e.name)}function Lm(e){return e.type.startsWith("text/")||e.type==="application/json"||e.type==="application/xml"||_m.test(e.name)}function Pm(e){return e.type==="application/pdf"||/\.pdf$/i.test(e.name)}function Rm(e){return e.type.startsWith("video/")||/\.(mp4|webm|mov|avi|mkv|m4v)$/i.test(e.name)}function Im(e,t){e.preventDefault(),e.stopPropagation();const n=e.currentTarget;n.classList.remove("chat--dragover");const s=e.dataTransfer?.files;if(!(!s||s.length===0))for(let i=0;i<s.length;i++){const o=s[i];if(Mm(o)){if(!t.onAttachmentsChange)continue;if(o.size>Kt){ht(n,`Image too large (${(o.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const r=new FileReader;r.onload=()=>{const l=r.result,a={id:zt(),dataUrl:l,mimeType:o.type},c=t.attachments??[];t.onAttachmentsChange?.([...c,a])},r.readAsDataURL(o)}else if(Lm(o)){if(!t.onAttachmentsChange)continue;if(o.size>Kt){ht(n,`File too large (${(o.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const r=new FileReader;r.onload=()=>{const l=r.result,a={id:zt(),dataUrl:"",mimeType:o.type||"text/plain",fileName:o.name,textContent:l},c=t.attachments??[];t.onAttachmentsChange?.([...c,a])},r.readAsText(o)}else if(Pm(o)){if(!t.onAttachmentsChange)continue;if(o.size>Kt){ht(n,`PDF too large (${(o.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const r=new FileReader;r.onload=()=>{const l=r.result,a={id:zt(),dataUrl:l,mimeType:"application/pdf",fileName:o.name},c=t.attachments??[];t.onAttachmentsChange?.([...c,a])},r.readAsDataURL(o)}else if(Rm(o)){if(!t.onAttachmentsChange)continue;if(o.size>Kt){ht(n,`Video too large (${(o.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const r=new FileReader;r.onload=()=>{const l=r.result,a={id:zt(),dataUrl:l,mimeType:o.type||"video/mp4",fileName:o.name},c=t.attachments??[];t.onAttachmentsChange?.([...c,a])},r.readAsDataURL(o)}else ht(n,`Unsupported file type: ${o.name}. Use the Files page to upload to workspace.`)}}function Nm(e){e.preventDefault(),e.stopPropagation(),e.dataTransfer&&(e.dataTransfer.dropEffect="copy"),e.currentTarget.classList.add("chat--dragover")}function Dm(e){e.preventDefault(),e.stopPropagation();const t=e.currentTarget,n=e.relatedTarget;(!n||!t.contains(n))&&t.classList.remove("chat--dragover")}function Om(e,t){const n=e.clipboardData?.items;if(!n||!t.onAttachmentsChange)return;const s=[];for(let i=0;i<n.length;i++){const o=n[i];(o.type.startsWith("image/")||o.type.startsWith("video/"))&&s.push(o)}if(s.length!==0){e.preventDefault();for(const i of s){const o=i.getAsFile();if(!o)continue;const r=o.type.startsWith("video/")?"Video":"Image";if(o.size>Kt){const a=e.target?.closest?.(".chat")??document.querySelector(".chat");a&&ht(a,`${r} too large (${(o.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const l=new FileReader;l.onload=()=>{const a=l.result,c=o.type.startsWith("video/"),u={id:zt(),dataUrl:a,mimeType:o.type,fileName:c?o.name||"video.mp4":void 0},p=t.attachments??[];t.onAttachmentsChange?.([...p,u])},l.readAsDataURL(o)}}}function Bm(e){const t=e.currentTarget,s=t.closest(".chat-compose")?.querySelector(".emoji-picker-popup");if(!s)return;const i=s.classList.toggle("active");if(t.classList.toggle("active",i),i){const o=r=>{s.contains(r.target)||t.contains(r.target)||(s.classList.remove("active"),t.classList.remove("active"),document.removeEventListener("click",o,!0))};requestAnimationFrame(()=>document.addEventListener("click",o,!0))}}function Fm(e,t){const s=e.detail?.unicode;if(!s)return;const i=e.currentTarget.closest(".chat-compose"),o=i?.querySelector("textarea");if(!o)return;const r=o.selectionStart??t.draft.length,l=o.selectionEnd??r,a=t.draft.slice(0,r),c=t.draft.slice(l);t.onDraftChange(a+s+c);const u=i?.querySelector(".emoji-picker-popup"),p=i?.querySelector(".chat-compose__emoji");u?.classList.remove("active"),p?.classList.remove("active"),requestAnimationFrame(()=>{o.focus();const m=r+s.length;o.setSelectionRange(m,m)})}function Um(e){const t=e.attachments??[];return t.length===0?b:d`
1786
- <div class="chat-attachments">
1787
- ${t.map(n=>n.fileName?d`
1788
- <div class="chat-attachment chat-attachment--file">
1789
- <span class="chat-attachment__icon">${n.mimeType?.startsWith("video/")?N.film:N.fileText}</span>
1790
- <span class="chat-attachment__name" title=${n.fileName}>${n.fileName}</span>
1791
- <button
1792
- class="chat-attachment__remove chat-attachment__remove--file"
1793
- type="button"
1794
- aria-label="Remove attachment"
1795
- @click=${()=>{const s=(e.attachments??[]).filter(i=>i.id!==n.id);e.onAttachmentsChange?.(s)}}
1796
- >
1797
- ${N.x}
1798
- </button>
1799
- </div>
1800
- `:d`
1801
- <div class="chat-attachment">
1802
- <img
1803
- src=${n.dataUrl}
1804
- alt="Attachment preview"
1805
- class="chat-attachment__img"
1806
- />
1807
- <button
1808
- class="chat-attachment__remove"
1809
- type="button"
1810
- aria-label="Remove attachment"
1811
- @click=${()=>{const s=(e.attachments??[]).filter(i=>i.id!==n.id);e.onAttachmentsChange?.(s)}}
1812
- >
1813
- ${N.x}
1814
- </button>
1815
- </div>
1816
- `)}
1817
- </div>
1818
- `}function Wm(e){const t=e.connected,n=e.sending||e.stream!==null,s=!!(e.canAbort&&e.onAbort),o=e.sessions?.sessions?.find(m=>m.key===e.sessionKey)?.reasoningLevel??"off",r=e.showThinking&&o!=="off";e.assistantName,e.assistantAvatar??e.assistantAvatarUrl;const l=(e.attachments?.length??0)>0,a=e.connected?l?"Add a message...":"Message...":"Connecting…",c=e.splitRatio??.6,u=!!(e.sidebarOpen&&e.onCloseSidebar),p=d`
1819
- <div
1820
- class="chat-thread"
1821
- role="log"
1822
- aria-live="polite"
1823
- @scroll=${e.onChatScroll}
1824
- >
1825
- ${e.loading?d`<div class="muted">Loading chat…</div>`:b}
1826
- ${vh(Vm(e),m=>m.key,m=>m.kind==="reading-indicator"?Kf():m.kind==="stream"?zf(m.text,m.startedAt,e.onOpenSidebar):m.kind==="group"?jf(m,{onOpenSidebar:e.onOpenSidebar,showReasoning:r,assistantName:e.assistantName}):b)}
1827
- </div>
1828
- `;return d`
1829
- <section
1830
- class="card chat"
1831
- @drop=${m=>Im(m,e)}
1832
- @dragover=${Nm}
1833
- @dragleave=${Dm}
1834
- >
1835
- ${e.disabledReason?d`<div class="callout">${e.disabledReason}</div>`:b}
1836
-
1837
- ${e.error?d`<div class="callout danger">${e.error}</div>`:b}
1838
-
1839
- ${Cm(e.compactionStatus)}
1840
-
1841
- ${e.focusMode?d`
1842
- <button
1843
- class="chat-focus-exit"
1844
- type="button"
1845
- @click=${e.onToggleFocusMode}
1846
- aria-label="Exit focus mode"
1847
- title="Exit focus mode"
1848
- >
1849
- ${N.x}
1850
- </button>
1851
- `:b}
1852
-
1853
- <div
1854
- class="chat-split-container ${u?"chat-split-container--open":""}"
1855
- >
1856
- <div
1857
- class="chat-main"
1858
- style="flex: ${u?`0 0 ${c*100}%`:"1 1 100%"}"
1859
- >
1860
- ${p}
1861
- ${e.nearBottom===!1?d`
1862
- <button
1863
- class="chat-scroll-bottom"
1864
- type="button"
1865
- @click=${m=>{const w=m.currentTarget.closest(".chat-main")?.querySelector(".chat-thread");w&&w.scrollTo({top:w.scrollHeight,behavior:"smooth"})}}
1866
- aria-label="Scroll to bottom"
1867
- title="Scroll to bottom"
1868
- >
1869
- ${N.chevronDown}
1870
- </button>
1871
- `:b}
1872
- </div>
1873
-
1874
- ${u?d`
1875
- <resizable-divider
1876
- .splitRatio=${c}
1877
- @resize=${m=>e.onSplitRatioChange?.(m.detail.splitRatio)}
1878
- ></resizable-divider>
1879
- <div class="chat-sidebar">
1880
- ${qf({content:e.sidebarContent??null,error:e.sidebarError??null,onClose:e.onCloseSidebar,onViewRawText:()=>{!e.sidebarContent||!e.onOpenSidebar||e.onOpenSidebar(`\`\`\`
1881
- ${e.sidebarContent}
1882
- \`\`\``)}})}
1883
- </div>
1884
- `:b}
1885
- </div>
1886
-
1887
- <div class="chat-compose">
1888
- ${Um(e)}
1889
- <div class="chat-compose__row">
1890
- <button
1891
- class="chat-compose__emoji"
1892
- type="button"
1893
- @click=${Bm}
1894
- aria-label="Emoji"
1895
- title="Emoji"
1896
- >
1897
- ${N.smile}
1898
- </button>
1899
- <label class="field chat-compose__field">
1900
- <span>Message</span>
1901
- <textarea
1902
- .value=${e.draft}
1903
- ?disabled=${!e.connected}
1904
- @keydown=${m=>{m.key==="Enter"&&(m.isComposing||m.keyCode===229||m.shiftKey||e.connected&&(m.preventDefault(),t&&(e.onSend(),ca(m.target))))}}
1905
- @input=${m=>{const v=m.target;e.onDraftChange(v.value),Em(v)}}
1906
- @paste=${m=>Om(m,e)}
1907
- placeholder=${a}
1908
- ></textarea>
1909
- </label>
1910
- ${s?d`
1911
- <button
1912
- class="btn btn--icon chat-compose__send"
1913
- @click=${e.onAbort}
1914
- aria-label="Stop"
1915
- title="Stop generating"
1916
- >
1917
- ${N.square}
1918
- </button>
1919
- `:b}
1920
- <button
1921
- class="btn btn--icon chat-compose__send primary"
1922
- ?disabled=${!e.connected}
1923
- @click=${m=>{e.onSend();const v=m.target.closest(".chat-compose")?.querySelector("textarea");v&&ca(v)}}
1924
- aria-label="${n?"Queue":"Send"}"
1925
- title="${n?"Queue message":"Send (Enter)"}"
1926
- >
1927
- ${N.send}
1928
- </button>
1929
- </div>
1930
- <div class="emoji-picker-popup">
1931
- <emoji-picker
1932
- @emoji-click=${m=>Fm(m,e)}
1933
- ></emoji-picker>
1934
- </div>
1935
- ${qm(e)}
1936
- </div>
1937
- </section>
1938
- `}const Km=[{id:"claude-opus-4-6",shortName:"Opus",description:"Most capable"},{id:"claude-sonnet-4-5-20250929",shortName:"Sonnet",description:"Fast & capable"},{id:"claude-haiku-4-5-20251001",shortName:"Haiku",description:"Fastest"}];function zm(e){const t=new Set(e.filter(n=>n.provider==="anthropic").map(n=>n.id));return Km.filter(n=>t.has(n.id)).map(n=>({key:`anthropic/${n.id}`,...n}))}const jm=[{value:"off",label:"Off"},{value:"minimal",label:"Minimal"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"}];function Hm(e){const t=e.currentTarget,n=t.closest(".chat-model-bar")?.querySelector(".chat-settings-menu");if(!n)return;const s=n.classList.contains("active");if(document.querySelectorAll(".chat-settings-menu.active").forEach(i=>i.classList.remove("active")),!s){n.classList.add("active");const i=o=>{!n.contains(o.target)&&o.target!==t&&!t.contains(o.target)&&(n.classList.remove("active"),document.removeEventListener("click",i))};requestAnimationFrame(()=>document.addEventListener("click",i))}}function qm(e){if(!e.connected)return b;const t=e.modelCatalog??[],n=zm(t);if(n.length===0)return b;const s=e.modelProvider&&e.model?`${e.modelProvider}/${e.model}`:null,i=e.thinkingLevel??"off",o=e.verboseLevel==="on"||e.verboseLevel==="full",r=e.fillerEnabled===!0;return d`
1939
- <div class="chat-model-bar">
1940
- <div class="chat-model-bar__select">
1941
- <select
1942
- class="chat-model-bar__dropdown"
1943
- .value=${s??""}
1944
- @change=${l=>{const a=l.target.value;a&&e.onModelChange&&e.onModelChange(a)}}
1945
- >
1946
- ${n.map(l=>d`
1947
- <option value=${l.key} ?selected=${l.key===s}>
1948
- ${l.shortName} — ${l.description}
1949
- </option>
1950
- `)}
1951
- </select>
1952
- </div>
1953
- <div class="chat-model-bar__select">
1954
- <select
1955
- class="chat-model-bar__dropdown"
1956
- .value=${i}
1957
- @change=${l=>{const a=l.target.value;e.onThinkingLevelChange&&e.onThinkingLevelChange(a)}}
1958
- >
1959
- ${jm.map(l=>d`
1960
- <option value=${l.value} ?selected=${l.value===i}>
1961
- Thinking: ${l.label}
1962
- </option>
1963
- `)}
1964
- </select>
1965
- </div>
1966
- <button
1967
- class="chat-model-bar__settings-btn"
1968
- type="button"
1969
- @click=${Hm}
1970
- aria-label="Message settings"
1971
- title="Message settings"
1972
- >
1973
- ${N.slidersHorizontal}
1974
- </button>
1975
- <div class="chat-settings-menu">
1976
- <label class="chat-settings-menu__item">
1977
- <input
1978
- type="checkbox"
1979
- .checked=${o}
1980
- @change=${l=>{const a=l.target.checked;e.onVerboseChange&&e.onVerboseChange(a?"on":"off")}}
1981
- />
1982
- <span>Verbose</span>
1983
- <span class="chat-settings-menu__hint">Detailed responses</span>
1984
- </label>
1985
- <label class="chat-settings-menu__item">
1986
- <input
1987
- type="checkbox"
1988
- .checked=${r}
1989
- @change=${l=>{const a=l.target.checked;e.onFillerChange&&e.onFillerChange(a)}}
1990
- />
1991
- <span>Filler</span>
1992
- <span class="chat-settings-menu__hint">Quick acks while thinking</span>
1993
- </label>
1994
- </div>
1995
- </div>
1996
- `}const ua=200;function Gm(e){const t=[];let n=null;for(const s of e){if(s.kind!=="message"){n&&(t.push(n),n=null),t.push(s);continue}const i=Da(s.message),o=Oa(i.role),r=i.timestamp||Date.now();!n||n.role!==o?(n&&t.push(n),n={kind:"group",key:`group:${o}:${s.key}`,role:o,messages:[{message:s.message,key:s.key}],timestamp:r,isStreaming:!1}):n.messages.push({message:s.message,key:s.key})}return n&&t.push(n),t}function Vm(e){const t=[],n=Array.isArray(e.messages)?e.messages:[],s=Array.isArray(e.toolMessages)?e.toolMessages:[],i=e.showThinking||e.verboseLevel==="on"||e.verboseLevel==="full",o=Math.max(0,n.length-ua);o>0&&t.push({kind:"message",key:"chat:history:notice",message:{role:"system",content:`Showing last ${ua} messages (${o} hidden).`,timestamp:Date.now()}});for(let r=o;r<n.length;r++){const l=n[r],a=Da(l);!i&&a.role.toLowerCase()==="toolresult"||t.push({kind:"message",key:da(l,r),message:l})}if(i)for(let r=0;r<s.length;r++)t.push({kind:"message",key:da(s[r],r+n.length),message:s[r]});if(e.stream!==null){const r=`stream:${e.sessionKey}:${e.streamStartedAt??"live"}`;e.stream.trim().length>0?t.push({kind:"stream",key:r,text:e.stream,startedAt:e.streamStartedAt??Date.now()}):t.push({kind:"reading-indicator",key:r})}for(const r of e.queue){const l=r.attachments?.filter(c=>c.fileName).map(c=>c.fileName)??[],a=l.length>0?r.text?`${l.join(", ")}
1997
-
1998
- ${r.text}`:l.join(", "):r.text;t.push({kind:"message",key:`queue:${r.id}`,message:{role:"user",content:[{type:"text",text:a}],timestamp:r.createdAt}})}return Gm(t)}function da(e,t){const n=e,s=typeof n.toolCallId=="string"?n.toolCallId:"";if(s)return`tool:${s}`;const i=typeof n.id=="string"?n.id:"";if(i)return`msg:${i}`;const o=typeof n.messageId=="string"?n.messageId:"";if(o)return`msg:${o}`;const r=typeof n.timestamp=="number"?n.timestamp:null,l=typeof n.role=="string"?n.role:"unknown";return r!=null?`msg:${l}:${r}:${t}`:`msg:${l}:${t}`}function Ym(e){return e.connected?d`
1999
- <div class="setup-container setup-container--full chat-page">
2000
- ${tt("Chat",e.wsProps)}
2001
- <div class="chat-viewport">
2002
- ${Wm(e)}
2003
- </div>
2004
- </div>
2005
- `:d`
2006
- <div class="setup-container">
2007
- <div class="setup-card">
2008
- <div class="setup-spinner"></div>
2009
- <p>Connecting to gateway...</p>
2010
- </div>
2011
- </div>
2012
- `}function Qm(e){return e?`${Pa(e)} (${os(e)})`:"n/a"}function hc(e){const t=e.state??{},n=t.lastStatus??"n/a",s=t.lastRunAtMs?os(t.lastRunAtMs):"never";return`${n} · last ${s}`}function fc(e){const t=e.schedule;return t.kind==="at"?`One-time: ${Pa(t.atMs)}`:t.kind==="every"?`Every ${Ra(t.everyMs)}`:`Schedule: ${t.expr}${t.tz?` (${t.tz})`:""}`}function Xm(e,t=!0){const n=e.payload;return n.kind==="systemEvent"?`Task: ${t&&n.text.length>60?`${n.text.slice(0,57)}…`:n.text}`:`Message: ${t&&n.message.length>60?`${n.message.slice(0,57)}…`:n.message}`}function pa(e){const t=e.payload;if(t.kind!=="agentTurn")return null;const n=t.channel??t.provider,s=t.to;if(!s&&!n)return null;const i=[];return s&&i.push(s),n&&n!=="last"&&i.push(`via ${n}`),i.join(" ")||null}function Zm(e){const t=["last",...e.channels.filter(Boolean)],n=e.form.channel?.trim();n&&!t.includes(n)&&t.push(n);const s=new Set;return t.filter(i=>s.has(i)?!1:(s.add(i),!0))}function Jm(e,t){if(t==="last")return"last";const n=e.channelMeta?.find(s=>s.id===t);return n?.label?n.label:e.channelLabels?.[t]??t}function ey(e){return e||"Default"}const ha=d`<svg viewBox="0 0 24 24"><polygon points="5 3 19 12 5 21 5 3"/></svg>`,ty=d`<svg viewBox="0 0 24 24"><rect x="6" y="4" width="4" height="16"/><rect x="14" y="4" width="4" height="16"/></svg>`,ny=d`<svg viewBox="0 0 24 24"><path d="M3 6h18"/><path d="M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6"/><path d="M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2"/></svg>`,gc=d`<svg viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`,sy=d`<svg viewBox="0 0 24 24"><path d="M12 5v14"/><path d="M5 12h14"/></svg>`;function fa(e){const t=e.detailJobId?e.jobs.find(n=>n.id===e.detailJobId)??null:null;return d`
2013
- ${iy(e)}
2014
- ${oy(e)}
2015
- ${e.newEventModalOpen?ay(e):b}
2016
- ${t?cy(t,e):b}
2017
- `}function iy(e){const t=e.status,n=t?.enabled??!1,s=t?.jobs??0,i=t?.nextWakeAtMs;return d`
2018
- <div class="event-status-bar">
2019
- <div class="event-status-bar__info">
2020
- <span class="statusDot ${n?"ok":""}"></span>
2021
- <span>${n?"Active":"Inactive"}</span>
2022
- <span class="event-status-bar__sep">\u00b7</span>
2023
- <span>${s} event${s!==1?"s":""}</span>
2024
- ${i?d`
2025
- <span class="event-status-bar__sep">\u00b7</span>
2026
- <span>Next: ${os(i)}</span>
2027
- `:b}
2028
- <button
2029
- class="btn btn--sm"
2030
- ?disabled=${e.loading}
2031
- @click=${e.onRefresh}
2032
- style="margin-left: 4px;"
2033
- >
2034
- ${e.loading?"Refreshing…":"Refresh"}
2035
- </button>
2036
- ${e.error?d`<span class="muted">${e.error}</span>`:b}
2037
- </div>
2038
- <button class="btn primary btn--sm" @click=${e.onNewEventModalOpen}>
2039
- ${sy} New Event
2040
- </button>
2041
- </div>
2042
- `}function oy(e){return e.jobs.length===0?d`<div class="muted" style="padding: 20px 0;">No events yet. Create one to get started.</div>`:d`
2043
- <div class="event-grid">
2044
- ${e.jobs.map(t=>ry(t,e))}
2045
- </div>
2046
- `}function ry(e,t){return d`
2047
- <div
2048
- class="event-card ${e.enabled?"":"disabled"}"
2049
- @click=${()=>t.onDetailOpen(e)}
2050
- >
2051
- <div class="event-card__header">
2052
- <div class="event-card__name">${e.name||"Untitled"}</div>
2053
- <span class="chip ${e.enabled?"chip-ok":""}" style="font-size: 11px; padding: 2px 8px;">
2054
- ${e.enabled?"On":"Off"}
2055
- </span>
2056
- </div>
2057
- <div class="event-card__schedule">${fc(e)}</div>
2058
- ${e.agentId?d`<div class="event-card__agent">${ey(e.agentId)}</div>`:b}
2059
- ${pa(e)?d`<div class="event-card__agent muted" style="font-size: 11px;">\u2192 ${pa(e)}</div>`:b}
2060
- <div class="event-card__footer">
2061
- <div class="event-card__status">
2062
- <span class="muted" style="font-size: 11px;">${hc(e)}</span>
2063
- </div>
2064
- <div class="event-card__actions" @click=${n=>n.stopPropagation()}>
2065
- <button
2066
- class="btn-icon"
2067
- title="${e.enabled?"Pause":"Resume"}"
2068
- ?disabled=${t.busy}
2069
- @click=${()=>t.onToggle(e,!e.enabled)}
2070
- >
2071
- ${e.enabled?ty:ha}
2072
- </button>
2073
- <button
2074
- class="btn-icon"
2075
- title="Run now"
2076
- ?disabled=${t.busy}
2077
- @click=${()=>t.onRun(e)}
2078
- >
2079
- ${ha}
2080
- </button>
2081
- <button
2082
- class="btn-icon danger"
2083
- title="Delete"
2084
- ?disabled=${t.busy}
2085
- @click=${()=>t.onRemove(e)}
2086
- >
2087
- ${ny}
2088
- </button>
2089
- </div>
2090
- </div>
2091
- </div>
2092
- `}function ay(e){const t=Zm(e);return d`
2093
- <div class="event-modal-overlay" @click=${e.onNewEventModalClose}>
2094
- <div class="event-modal" @click=${n=>n.stopPropagation()}>
2095
- <div class="event-modal__header">
2096
- <div class="event-modal__title">New Event</div>
2097
- <button class="event-modal__close" @click=${e.onNewEventModalClose}>
2098
- ${gc}
2099
- </button>
2100
- </div>
2101
-
2102
- <div class="form-grid">
2103
- <label class="field">
2104
- <span>Name</span>
2105
- <input
2106
- .value=${e.form.name}
2107
- @input=${n=>e.onFormChange({name:n.target.value})}
2108
- placeholder="e.g. Morning briefing"
2109
- />
2110
- </label>
2111
- <label class="field">
2112
- <span>Description</span>
2113
- <input
2114
- .value=${e.form.description}
2115
- @input=${n=>e.onFormChange({description:n.target.value})}
2116
- placeholder="What does this event do?"
2117
- />
2118
- </label>
2119
- <label class="field">
2120
- <span>Agent</span>
2121
- <select
2122
- .value=${e.form.agentId}
2123
- @change=${n=>e.onFormChange({agentId:n.target.value})}
2124
- >
2125
- <option value="">Default</option>
2126
- ${e.agentIds.map(n=>d`<option value=${n}>${n}</option>`)}
2127
- </select>
2128
- </label>
2129
- <label class="field checkbox">
2130
- <span>Enabled</span>
2131
- <input
2132
- type="checkbox"
2133
- .checked=${e.form.enabled}
2134
- @change=${n=>e.onFormChange({enabled:n.target.checked})}
2135
- />
2136
- </label>
2137
- <label class="field">
2138
- <span>Timing</span>
2139
- <select
2140
- .value=${e.form.scheduleKind}
2141
- @change=${n=>e.onFormChange({scheduleKind:n.target.value})}
2142
- >
2143
- <option value="every">Repeating</option>
2144
- <option value="at">One-time</option>
2145
- <option value="cron">Custom schedule</option>
2146
- </select>
2147
- </label>
2148
- </div>
2149
-
2150
- ${ly(e)}
2151
-
2152
- <div class="form-grid" style="margin-top: 12px;">
2153
- <label class="field">
2154
- <span>Session type</span>
2155
- <select
2156
- .value=${e.form.sessionTarget}
2157
- @change=${n=>e.onFormChange({sessionTarget:n.target.value})}
2158
- >
2159
- <option value="main">Shared session</option>
2160
- <option value="isolated">Separate session</option>
2161
- </select>
2162
- </label>
2163
- <label class="field">
2164
- <span>When to run</span>
2165
- <select
2166
- .value=${e.form.wakeMode}
2167
- @change=${n=>e.onFormChange({wakeMode:n.target.value})}
2168
- >
2169
- <option value="next-heartbeat">Next available time</option>
2170
- <option value="now">Right away</option>
2171
- </select>
2172
- </label>
2173
- <label class="field">
2174
- <span>Action type</span>
2175
- <select
2176
- .value=${e.form.payloadKind}
2177
- @change=${n=>e.onFormChange({payloadKind:n.target.value})}
2178
- >
2179
- <option value="systemEvent">Background task</option>
2180
- <option value="agentTurn">Send a message</option>
2181
- </select>
2182
- </label>
2183
- </div>
2184
-
2185
- <label class="field" style="margin-top: 12px;">
2186
- <span>${e.form.payloadKind==="systemEvent"?"Task description":"Message to send"}</span>
2187
- <textarea
2188
- .value=${e.form.payloadText}
2189
- @input=${n=>e.onFormChange({payloadText:n.target.value})}
2190
- rows="4"
2191
- placeholder="${e.form.payloadKind==="systemEvent"?"Describe what the assistant should do…":"Type the message to send…"}"
2192
- ></textarea>
2193
- </label>
2194
-
2195
- ${e.form.payloadKind==="agentTurn"?d`
2196
- <div class="form-grid" style="margin-top: 12px;">
2197
- <label class="field checkbox">
2198
- <span>Deliver response</span>
2199
- <input
2200
- type="checkbox"
2201
- .checked=${e.form.deliver}
2202
- @change=${n=>e.onFormChange({deliver:n.target.checked})}
2203
- />
2204
- </label>
2205
- <label class="field">
2206
- <span>Channel</span>
2207
- <select
2208
- .value=${e.form.channel||"last"}
2209
- @change=${n=>e.onFormChange({channel:n.target.value})}
2210
- >
2211
- ${t.map(n=>d`<option value=${n}>
2212
- ${Jm(e,n)}
2213
- </option>`)}
2214
- </select>
2215
- </label>
2216
- <label class="field">
2217
- <span>Send to</span>
2218
- <input
2219
- .value=${e.form.to}
2220
- @input=${n=>e.onFormChange({to:n.target.value})}
2221
- placeholder="+1555\u2026 or chat id"
2222
- />
2223
- </label>
2224
- <label class="field">
2225
- <span>Timeout (seconds)</span>
2226
- <input
2227
- .value=${e.form.timeoutSeconds}
2228
- @input=${n=>e.onFormChange({timeoutSeconds:n.target.value})}
2229
- />
2230
- </label>
2231
- ${e.form.sessionTarget==="isolated"?d`
2232
- <label class="field">
2233
- <span>Summary prefix</span>
2234
- <input
2235
- .value=${e.form.postToMainPrefix}
2236
- @input=${n=>e.onFormChange({postToMainPrefix:n.target.value})}
2237
- />
2238
- </label>
2239
- `:b}
2240
- </div>
2241
- `:b}
2242
-
2243
- <div class="row" style="margin-top: 16px; justify-content: flex-end;">
2244
- <button class="btn" @click=${e.onNewEventModalClose}>Cancel</button>
2245
- <button class="btn primary" ?disabled=${e.busy} @click=${e.onAdd}>
2246
- ${e.busy?"Creating…":"Create Event"}
2247
- </button>
2248
- </div>
2249
- </div>
2250
- </div>
2251
- `}function ly(e){const t=e.form;return t.scheduleKind==="at"?d`
2252
- <label class="field" style="margin-top: 12px;">
2253
- <span>Run at</span>
2254
- <input
2255
- type="datetime-local"
2256
- .value=${t.scheduleAt}
2257
- @input=${n=>e.onFormChange({scheduleAt:n.target.value})}
2258
- />
2259
- </label>
2260
- `:t.scheduleKind==="every"?d`
2261
- <div class="form-grid" style="margin-top: 12px;">
2262
- <label class="field">
2263
- <span>Repeat every</span>
2264
- <input
2265
- .value=${t.everyAmount}
2266
- @input=${n=>e.onFormChange({everyAmount:n.target.value})}
2267
- />
2268
- </label>
2269
- <label class="field">
2270
- <span>Unit</span>
2271
- <select
2272
- .value=${t.everyUnit}
2273
- @change=${n=>e.onFormChange({everyUnit:n.target.value})}
2274
- >
2275
- <option value="minutes">Minutes</option>
2276
- <option value="hours">Hours</option>
2277
- <option value="days">Days</option>
2278
- </select>
2279
- </label>
2280
- </div>
2281
- `:d`
2282
- <div class="form-grid" style="margin-top: 12px;">
2283
- <label class="field">
2284
- <span>Cron expression</span>
2285
- <input
2286
- .value=${t.cronExpr}
2287
- @input=${n=>e.onFormChange({cronExpr:n.target.value})}
2288
- placeholder="e.g. 0 7 * * *"
2289
- />
2290
- </label>
2291
- <label class="field">
2292
- <span>Timezone (optional)</span>
2293
- <input
2294
- .value=${t.cronTz}
2295
- @input=${n=>e.onFormChange({cronTz:n.target.value})}
2296
- placeholder="e.g. America/New_York"
2297
- />
2298
- </label>
2299
- </div>
2300
- `}function cy(e,t){return d`
2301
- <div class="event-modal-overlay" @click=${t.onDetailClose}>
2302
- <div class="event-modal" @click=${n=>n.stopPropagation()}>
2303
- <div class="event-modal__header">
2304
- <div class="event-modal__title">${e.name||"Untitled Event"}</div>
2305
- <button class="event-modal__close" @click=${t.onDetailClose}>
2306
- ${gc}
2307
- </button>
2308
- </div>
2309
-
2310
- ${e.description?d`<div style="color: var(--muted); font-size: 13px; margin-bottom: 16px;">${e.description}</div>`:b}
2311
-
2312
- <div class="event-detail-section">
2313
- <div class="event-detail-row">
2314
- <span class="event-detail-label">Status</span>
2315
- <span class="event-detail-value">
2316
- <span class="chip ${e.enabled?"chip-ok":""}" style="font-size: 11px; padding: 2px 8px;">
2317
- ${e.enabled?"Enabled":"Disabled"}
2318
- </span>
2319
- </span>
2320
- </div>
2321
- <div class="event-detail-row">
2322
- <span class="event-detail-label">Schedule</span>
2323
- <span class="event-detail-value">${fc(e)}</span>
2324
- </div>
2325
- ${e.agentId?d`
2326
- <div class="event-detail-row">
2327
- <span class="event-detail-label">Agent</span>
2328
- <span class="event-detail-value mono">${e.agentId}</span>
2329
- </div>
2330
- `:b}
2331
- <div class="event-detail-row">
2332
- <span class="event-detail-label">Session</span>
2333
- <span class="event-detail-value">
2334
- ${e.sessionTarget==="main"?"Shared":"Separate"}
2335
- </span>
2336
- </div>
2337
- <div class="event-detail-row">
2338
- <span class="event-detail-label">Run mode</span>
2339
- <span class="event-detail-value">
2340
- ${e.wakeMode==="now"?"Right away":"Next available time"}
2341
- </span>
2342
- </div>
2343
- <div class="event-detail-row" style="flex-direction: column; align-items: stretch; gap: 4px;">
2344
- <span class="event-detail-label">Action</span>
2345
- <span class="event-detail-value" style="text-align: left; white-space: pre-wrap; font-size: 12px; color: var(--muted); line-height: 1.5;">${Xm(e,!1)}</span>
2346
- </div>
2347
- ${e.payload.kind==="agentTurn"&&e.payload.to?d`
2348
- <div class="event-detail-row">
2349
- <span class="event-detail-label">Send to</span>
2350
- <span class="event-detail-value mono">${e.payload.to}</span>
2351
- </div>
2352
- `:b}
2353
- ${e.payload.kind==="agentTurn"&&(e.payload.channel??e.payload.provider)?d`
2354
- <div class="event-detail-row">
2355
- <span class="event-detail-label">Channel</span>
2356
- <span class="event-detail-value">${e.payload.channel??e.payload.provider}</span>
2357
- </div>
2358
- `:b}
2359
- ${e.payload.kind==="agentTurn"?d`
2360
- <div class="event-detail-row">
2361
- <span class="event-detail-label">Auto-deliver</span>
2362
- <span class="event-detail-value">${e.payload.deliver?"Yes":"No"}</span>
2363
- </div>
2364
- `:b}
2365
- </div>
2366
-
2367
- <div class="event-detail-section">
2368
- <div class="event-detail-row">
2369
- <span class="event-detail-label">Last run</span>
2370
- <span class="event-detail-value">${hc(e)}</span>
2371
- </div>
2372
- ${e.state?.nextRunAtMs?d`
2373
- <div class="event-detail-row">
2374
- <span class="event-detail-label">Next run</span>
2375
- <span class="event-detail-value">${Qm(e.state.nextRunAtMs)}</span>
2376
- </div>
2377
- `:b}
2378
- </div>
2379
-
2380
- <div class="event-detail-section">
2381
- <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;">
2382
- <span class="event-detail-label" style="font-size: 14px;">Recent Activity</span>
2383
- </div>
2384
- ${t.runs.length===0?d`<div class="muted" style="font-size: 13px;">No runs recorded yet.</div>`:d`
2385
- <div class="list">
2386
- ${[...t.runs].sort((n,s)=>s.ts-n.ts).map(n=>dy(n))}
2387
- </div>
2388
- `}
2389
- </div>
2390
-
2391
- <div class="row" style="margin-top: 16px; gap: 8px; justify-content: flex-end;">
2392
- <button
2393
- class="btn"
2394
- ?disabled=${t.busy}
2395
- @click=${()=>t.onToggle(e,!e.enabled)}
2396
- >
2397
- ${e.enabled?"Disable":"Enable"}
2398
- </button>
2399
- <button
2400
- class="btn primary"
2401
- ?disabled=${t.busy}
2402
- @click=${()=>t.onRun(e)}
2403
- >
2404
- Run Now
2405
- </button>
2406
- <button
2407
- class="btn danger"
2408
- ?disabled=${t.busy}
2409
- @click=${()=>{t.onRemove(e),t.onDetailClose()}}
2410
- >
2411
- Delete
2412
- </button>
2413
- </div>
2414
- </div>
2415
- </div>
2416
- `}function uy(e){const t=e.toLowerCase();return t==="ok"||t==="success"?"chip chip-ok":t==="error"||t==="fail"||t==="failed"?"chip chip-warn":"chip"}function dy(e){return d`
2417
- <div class="list-item" style="grid-template-columns: 1fr; gap: 6px;">
2418
- <div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
2419
- <span class=${uy(e.status)} style="font-size: 11px; padding: 2px 8px;">
2420
- ${e.status}
2421
- </span>
2422
- <span class="muted" style="font-size: 12px;">${os(e.ts)}</span>
2423
- <span class="muted" style="font-size: 12px;">${Ra(e.durationMs)}</span>
2424
- </div>
2425
- ${e.summary?d`<div class="muted" style="font-size: 12px;">${e.summary}</div>`:b}
2426
- ${e.error?d`
2427
- <details style="margin-top: 2px;">
2428
- <summary class="muted" style="cursor: pointer; font-size: 12px;">Error details</summary>
2429
- <div class="muted" style="margin-top: 4px; white-space: pre-wrap; font-size: 12px;">${e.error}</div>
2430
- </details>
2431
- `:b}
2432
- </div>
2433
- `}function py(e){const t=e.report?.skills??[],n=e.filter.trim().toLowerCase(),s=n?t.filter(i=>[i.name,i.description,i.source].join(" ").toLowerCase().includes(n)):t;return d`
2434
- <section class="card">
2435
- <div class="row" style="justify-content: space-between;">
2436
- <div>
2437
- <div class="card-title">Skills</div>
2438
- <div class="card-sub">Bundled, managed, and workspace skills.</div>
2439
- </div>
2440
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2441
- ${e.loading?"Loading…":"Refresh"}
2442
- </button>
2443
- </div>
2444
-
2445
- <div class="filters" style="margin-top: 14px;">
2446
- <label class="field" style="flex: 1;">
2447
- <span>Filter</span>
2448
- <input
2449
- .value=${e.filter}
2450
- @input=${i=>e.onFilterChange(i.target.value)}
2451
- placeholder="Search skills"
2452
- />
2453
- </label>
2454
- <div class="muted">${s.length} shown</div>
2455
- </div>
2456
-
2457
- ${e.error?d`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:b}
2458
-
2459
- ${s.length===0?d`<div class="muted" style="margin-top: 16px;">No skills found.</div>`:d`
2460
- <div class="list" style="margin-top: 16px;">
2461
- ${s.map(i=>hy(i,e))}
2462
- </div>
2463
- `}
2464
- </section>
2465
- `}function hy(e,t){const n=t.busyKey===e.skillKey,s=t.edits[e.skillKey]??"",i=t.messages[e.skillKey]??null,o=e.install.length>0&&e.missing.bins.length>0,r=[...e.missing.bins.map(a=>`bin:${a}`),...e.missing.env.map(a=>`env:${a}`),...e.missing.config.map(a=>`config:${a}`),...e.missing.os.map(a=>`os:${a}`)],l=[];return e.disabled&&l.push("disabled"),e.blockedByAllowlist&&l.push("blocked by allowlist"),d`
2466
- <div class="list-item">
2467
- <div class="list-main">
2468
- <div class="list-title">
2469
- ${e.emoji?`${e.emoji} `:""}${e.name}
2470
- </div>
2471
- <div class="list-sub">${_u(e.description,140)}</div>
2472
- <div class="chip-row" style="margin-top: 6px;">
2473
- <span class="chip">${e.source}</span>
2474
- <span class="chip ${e.eligible?"chip-ok":"chip-warn"}">
2475
- ${e.eligible?"eligible":"blocked"}
2476
- </span>
2477
- ${e.disabled?d`<span class="chip chip-warn">disabled</span>`:b}
2478
- </div>
2479
- ${r.length>0?d`
2480
- <div class="muted" style="margin-top: 6px;">
2481
- Missing: ${r.join(", ")}
2482
- </div>
2483
- `:b}
2484
- ${l.length>0?d`
2485
- <div class="muted" style="margin-top: 6px;">
2486
- Reason: ${l.join(", ")}
2487
- </div>
2488
- `:b}
2489
- </div>
2490
- <div class="list-meta">
2491
- <div class="row" style="justify-content: flex-end; flex-wrap: wrap;">
2492
- <button
2493
- class="btn"
2494
- ?disabled=${n}
2495
- @click=${()=>t.onToggle(e.skillKey,e.disabled)}
2496
- >
2497
- ${e.disabled?"Enable":"Disable"}
2498
- </button>
2499
- ${o?d`<button
2500
- class="btn"
2501
- ?disabled=${n}
2502
- @click=${()=>t.onInstall(e.skillKey,e.name,e.install[0].id)}
2503
- >
2504
- ${n?"Installing…":e.install[0].label}
2505
- </button>`:b}
2506
- </div>
2507
- ${i?d`<div
2508
- class="muted"
2509
- style="margin-top: 8px; color: ${i.kind==="error"?"var(--danger-color, #d14343)":"var(--success-color, #0a7f5a)"};"
2510
- >
2511
- ${i.message}
2512
- </div>`:b}
2513
- ${e.primaryEnv?d`
2514
- <div class="field" style="margin-top: 10px;">
2515
- <span>API key</span>
2516
- <input
2517
- type="password"
2518
- .value=${s}
2519
- @input=${a=>t.onEdit(e.skillKey,a.target.value)}
2520
- />
2521
- </div>
2522
- <button
2523
- class="btn primary"
2524
- style="margin-top: 8px;"
2525
- ?disabled=${n}
2526
- @click=${()=>t.onSaveKey(e.skillKey)}
2527
- >
2528
- Save key
2529
- </button>
2530
- `:b}
2531
- </div>
2532
- </div>
2533
- `}const ga=["user","assistant","tool","thinking","error"],ma={user:"User",assistant:"Assistant",tool:"Tool",thinking:"Thinking",error:"Error",system:"System"};function fy(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function gy(e){return e.split(":").slice(2).join(":")||e}function my(e,t){return t?[e.content,e.agentId,e.sessionKey,e.toolName].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function yy(e,t=500){return e.length<=t?e:e.slice(0,t)+"..."}function vy(e){const t=e.filterText.trim().toLowerCase();ga.some(s=>!e.typeFilters[s]),e.agents.some(s=>!e.agentFilters[s]);const n=e.entries.filter(s=>!e.typeFilters[s.type]||e.agents.length>0&&!(e.agentFilters[s.agentId]??!0)?!1:my(s,t));return d`
2534
- <div>
2535
- <div class="filters" style="margin-top: 14px;">
2536
- <label class="field" style="min-width: 220px;">
2537
- <span>Filter</span>
2538
- <input
2539
- .value=${e.filterText}
2540
- @input=${s=>e.onFilterTextChange(s.target.value)}
2541
- placeholder="Search session logs"
2542
- />
2543
- </label>
2544
- </div>
2545
-
2546
- <div class="chip-row" style="margin-top: 12px;">
2547
- ${ga.map(s=>d`
2548
- <label class="chip session-log-chip ${s}">
2549
- <input
2550
- type="checkbox"
2551
- .checked=${e.typeFilters[s]}
2552
- @change=${i=>e.onTypeToggle(s,i.target.checked)}
2553
- />
2554
- <span>${ma[s]}</span>
2555
- </label>
2556
- `)}
2557
- </div>
2558
-
2559
- <div class="chip-row" style="margin-top: 8px; align-items: center;">
2560
- ${e.agents.map(s=>d`
2561
- <label class="chip agent-chip">
2562
- <input
2563
- type="checkbox"
2564
- .checked=${e.agentFilters[s]??!0}
2565
- @change=${i=>e.onAgentToggle(s,i.target.checked)}
2566
- />
2567
- <span>${s}</span>
2568
- </label>
2569
- `)}
2570
- <label class="chip">
2571
- <input
2572
- type="checkbox"
2573
- .checked=${e.autoFollow}
2574
- @change=${s=>e.onToggleAutoFollow(s.target.checked)}
2575
- />
2576
- <span>Auto-follow</span>
2577
- </label>
2578
- <label class="chip">
2579
- <input
2580
- type="checkbox"
2581
- .checked=${e.full}
2582
- @change=${s=>e.onToggleFull(s.target.checked)}
2583
- />
2584
- <span>Full</span>
2585
- </label>
2586
- </div>
2587
-
2588
- ${e.error?d`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:b}
2589
-
2590
- <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
2591
- ${n.length===0?d`<div class="muted" style="padding: 12px;">No session log entries.</div>`:n.map(s=>d`
2592
- <div class="log-row session-entry ${s.type}">
2593
- <div class="log-row-header">
2594
- <span class="log-time mono">${fy(s.timestamp)}</span>
2595
- <span class="session-log-type ${s.type}">${ma[s.type]}</span>
2596
- <span class="log-subsystem mono">${s.agentId}</span>
2597
- <span class="session-label mono">${gy(s.sessionKey)}</span>
2598
- ${s.toolName?d`<span class="session-tool mono">${s.toolName}</span>`:b}
2599
- ${s.model?d`<span class="session-model mono">${s.model}</span>`:b}
2600
- </div>
2601
- <div class="log-message mono">${e.full?s.content:yy(s.content)}</div>
2602
- </div>
2603
- `)}
2604
- </div>
2605
- </div>
2606
- `}const Mi=["trace","debug","info","warn","error","fatal"];function by(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString()}function mc(e,t){return t?[e.message,e.subsystem,e.raw].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function wy(e){return d`
2607
- <section class="card">
2608
- <div class="row" style="justify-content: space-between;">
2609
- <div>
2610
- <div class="card-title">Logs</div>
2611
- <div class="card-sub">Session transcripts and system logs.</div>
2612
- </div>
2613
- <div class="row" style="gap: 8px;">
2614
- ${e.logsSubTab==="system"?d`
2615
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2616
- ${e.loading?"Loading…":"Refresh"}
2617
- </button>
2618
- <button
2619
- class="btn"
2620
- ?disabled=${e.entries.length===0}
2621
- @click=${()=>{const t=e.filterText.trim().toLowerCase(),n=Mi.some(o=>!e.levelFilters[o]),s=e.entries.filter(o=>o.level&&!e.levelFilters[o.level]?!1:mc(o,t)),i=t||n?"filtered":"visible";e.onExport(s.map(o=>o.raw),i)}}
2622
- >
2623
- Export
2624
- </button>
2625
- `:d`
2626
- <button class="btn" ?disabled=${e.sessionLogsProps.loading} @click=${e.sessionLogsProps.onRefresh}>
2627
- ${e.sessionLogsProps.loading?"Loading…":"Refresh"}
2628
- </button>
2629
- <button
2630
- class="btn"
2631
- ?disabled=${e.sessionLogsProps.entries.length===0}
2632
- @click=${()=>{const t=e.sessionLogsProps,n=t.filterText.trim().toLowerCase(),i=t.entries.filter(o=>!t.typeFilters[o.type]||t.agents.length>0&&!(t.agentFilters[o.agentId]??!0)?!1:n?[o.content,o.agentId,o.sessionKey,o.toolName].filter(Boolean).join(" ").toLowerCase().includes(n):!0).map(o=>`${o.timestamp} [${o.type}] ${o.agentId} ${o.sessionKey} ${o.toolName??""} ${o.content}`);t.onExport(i,n?"filtered":"visible")}}
2633
- >
2634
- Export
2635
- </button>
2636
- `}
2637
- </div>
2638
- </div>
2639
-
2640
- <div class="sp-tabs" style="margin-top: 12px;">
2641
- <button class="sp-tab ${e.logsSubTab==="session"?"active":""}"
2642
- @click=${()=>e.onSubTabChange("session")}>
2643
- Session Logs
2644
- </button>
2645
- <button class="sp-tab ${e.logsSubTab==="system"?"active":""}"
2646
- @click=${()=>e.onSubTabChange("system")}>
2647
- System Logs
2648
- </button>
2649
- </div>
2650
-
2651
- ${e.logsSubTab==="session"?vy(e.sessionLogsProps):ky(e)}
2652
- </section>
2653
- `}function ky(e){const t=e.filterText.trim().toLowerCase();Mi.some(s=>!e.levelFilters[s]);const n=e.entries.filter(s=>s.level&&!e.levelFilters[s.level]?!1:mc(s,t));return d`
2654
- <div class="filters" style="margin-top: 14px;">
2655
- <label class="field" style="min-width: 220px;">
2656
- <span>Filter</span>
2657
- <input
2658
- .value=${e.filterText}
2659
- @input=${s=>e.onFilterTextChange(s.target.value)}
2660
- placeholder="Search logs"
2661
- />
2662
- </label>
2663
- <label class="field checkbox">
2664
- <span>Auto-follow</span>
2665
- <input
2666
- type="checkbox"
2667
- .checked=${e.autoFollow}
2668
- @change=${s=>e.onToggleAutoFollow(s.target.checked)}
2669
- />
2670
- </label>
2671
- </div>
2672
-
2673
- <div class="chip-row" style="margin-top: 12px;">
2674
- ${Mi.map(s=>d`
2675
- <label class="chip log-chip ${s}">
2676
- <input
2677
- type="checkbox"
2678
- .checked=${e.levelFilters[s]}
2679
- @change=${i=>e.onLevelToggle(s,i.target.checked)}
2680
- />
2681
- <span>${s}</span>
2682
- </label>
2683
- `)}
2684
- </div>
2685
-
2686
- ${e.file?d`<div class="muted" style="margin-top: 10px;">File: ${e.file}</div>`:b}
2687
- ${e.truncated?d`<div class="callout" style="margin-top: 10px;">
2688
- Log output truncated; showing latest chunk.
2689
- </div>`:b}
2690
- ${e.error?d`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:b}
2691
-
2692
- <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
2693
- ${n.length===0?d`<div class="muted" style="padding: 12px;">No log entries.</div>`:[...n].reverse().map(s=>d`
2694
- <div class="log-row">
2695
- <div class="log-row-header">
2696
- <span class="log-time mono">${by(s.time)}</span>
2697
- <span class="log-level ${s.level??""}">${s.level??""}</span>
2698
- <span class="log-subsystem mono">${s.subsystem??""}</span>
2699
- </div>
2700
- <div class="log-message mono">${s.message??s.raw}</div>
2701
- </div>
2702
- `)}
2703
- </div>
2704
- `}const Sy=[{id:"cron",label:"Events"},{id:"skills",label:"Skills"},{id:"logs",label:"Logs"}];function xy(e){switch(e.activeTab){case"cron":return fa(e.cronProps);case"skills":return py(e.skillsProps);case"logs":return wy(e.logsProps);default:return fa(e.cronProps)}}function Ay(e){return e.connected?d`
2705
- <div class="setup-container">
2706
- ${tt("Advanced",e.wsProps)}
2707
- <div class="setup-card sp-card-advanced" style="text-align: left;">
2708
- <h1>Advanced</h1>
2709
- <div class="sp-tabs">
2710
- ${Sy.map(t=>d`
2711
- <button
2712
- class="sp-tab ${e.activeTab===t.id?"active":""}"
2713
- @click=${()=>e.onTabChange(t.id)}
2714
- >
2715
- ${t.label}
2716
- </button>
2717
- `)}
2718
- </div>
2719
- ${xy(e)}
2720
- </div>
2721
- </div>
2722
- `:d`
2723
- <div class="setup-container">
2724
- <div class="setup-card">
2725
- <div class="setup-spinner"></div>
2726
- <p>Connecting to gateway...</p>
2727
- </div>
2728
- </div>
2729
- `}function ya(e){if(!e.show)return b;const t=Oe(),n=e.isFirstTime,s=e.changePinMode===!0&&!n,i=e.changePinBusy===!0;let o=e.accounts.length>0?e.accounts[0].id:"";const r=m=>{o=m.target.value;const v=m.target.closest(".login-card")?.querySelector(".login-change-pin");v&&(v.style.display=o==="__master__"?"":"none")},l=m=>v=>{const w=v.target;w.value=w.value.replace(/\D/g,"").slice(0,6),m(w.value)},a=!n&&e.accounts.length>1?d`
2730
- <select
2731
- class="login-account-select"
2732
- @change=${r}
2733
- ?disabled=${e.busy||i}
2734
- >
2735
- ${e.accounts.map((m,v)=>d`
2736
- <option value=${m.id} ?selected=${v===0}>
2737
- ${m.displayName}
2738
- </option>
2739
- `)}
2740
- </select>
2741
- `:b;if(s){let m="",v="",w="";const A=_=>{_.preventDefault(),!i&&(!m||!v||!w||v===w&&o&&e.onChangePin?.(o,m,v))};return d`
2742
- <div class="login-overlay">
2743
- <div class="login-card">
2744
- <img class="login-logo" src="${t.iconUrl}" alt="${t.name}" />
2745
- <h2 class="login-title">Change PIN</h2>
2746
- <p class="login-subtitle">Enter your current PIN, then choose a new one</p>
2747
- <form class="login-form" @submit=${A}>
2748
- ${a}
2749
- <input
2750
- class="login-pin-input"
2751
- type="password"
2752
- inputmode="numeric"
2753
- pattern="[0-9]*"
2754
- minlength="4"
2755
- maxlength="6"
2756
- placeholder="Current PIN"
2757
- ?disabled=${i}
2758
- @input=${l(_=>{m=_})}
2759
- autofocus
2760
- />
2761
- <input
2762
- class="login-pin-input"
2763
- type="password"
2764
- inputmode="numeric"
2765
- pattern="[0-9]*"
2766
- minlength="4"
2767
- maxlength="6"
2768
- placeholder="New PIN (4-6 digits)"
2769
- ?disabled=${i}
2770
- @input=${l(_=>{v=_})}
2771
- />
2772
- <input
2773
- class="login-pin-input"
2774
- type="password"
2775
- inputmode="numeric"
2776
- pattern="[0-9]*"
2777
- minlength="4"
2778
- maxlength="6"
2779
- placeholder="Confirm new PIN"
2780
- ?disabled=${i}
2781
- @input=${l(_=>{w=_})}
2782
- />
2783
- ${e.changePinError?d`<p class="login-error">${e.changePinError}</p>`:b}
2784
- ${e.changePinSuccess?d`<p class="login-success">${e.changePinSuccess}</p>`:b}
2785
- <button
2786
- class="login-submit"
2787
- type="submit"
2788
- ?disabled=${i}
2789
- >${i?d`<span class="login-spinner"></span>`:"Change PIN"}</button>
2790
- </form>
2791
- <p class="login-hint" style="margin-top: 16px;">
2792
- <a
2793
- class="login-link"
2794
- href="#"
2795
- @click=${_=>{_.preventDefault(),e.onToggleChangePinMode?.()}}
2796
- >Back to login</a>
2797
- </p>
2798
- </div>
2799
- </div>
2800
- `}let c="",u="";const p=m=>{if(m.preventDefault(),!e.busy)if(n){if(!c||!u||c!==u)return;e.onSubmit(c)}else{if(!c||!o)return;e.onSubmit(o,c)}};return d`
2801
- <div class="login-overlay">
2802
- <div class="login-card">
2803
- <img class="login-logo" src="${t.iconUrl}" alt="${t.name}" />
2804
- <h2 class="login-title">${t.name}</h2>
2805
- <p class="login-subtitle">
2806
- ${n?"Set a PIN to protect this device":"Enter your PIN to continue"}
2807
- </p>
2808
- <form class="login-form" @submit=${p}>
2809
- ${a}
2810
- <input
2811
- class="login-pin-input"
2812
- type="password"
2813
- inputmode="numeric"
2814
- pattern="[0-9]*"
2815
- minlength="4"
2816
- maxlength="6"
2817
- placeholder="${n?"Choose a 4-6 digit PIN":"PIN"}"
2818
- ?disabled=${e.busy}
2819
- @input=${l(m=>{c=m})}
2820
- autofocus
2821
- />
2822
- ${n?d`
2823
- <input
2824
- class="login-pin-input"
2825
- type="password"
2826
- inputmode="numeric"
2827
- pattern="[0-9]*"
2828
- minlength="4"
2829
- maxlength="6"
2830
- placeholder="Confirm PIN"
2831
- ?disabled=${e.busy}
2832
- @input=${l(m=>{u=m})}
2833
- />
2834
- `:b}
2835
- ${e.error?d`<p class="login-error">${e.error}</p>`:b}
2836
- <button
2837
- class="login-submit"
2838
- type="submit"
2839
- ?disabled=${e.busy}
2840
- >
2841
- ${e.busy?d`<span class="login-spinner"></span>`:n?"Set PIN":"Unlock"}
2842
- </button>
2843
- </form>
2844
- ${n?d`<p class="login-hint">This PIN protects all accounts on this device. You'll need it every time you open the dashboard.</p>`:e.accounts.some(m=>m.id==="__master__")?d`<p class="login-hint login-change-pin" style="margin-top: 16px;${o!=="__master__"?" display: none;":""}">
2845
- <a
2846
- class="login-link"
2847
- href="#"
2848
- @click=${m=>{m.preventDefault(),e.onToggleChangePinMode?.()}}
2849
- >Change PIN</a>
2850
- </p>`:b}
2851
- </div>
2852
- </div>
2853
- `}const Eo="taskmaster-access-session",yc={checked:!1,hasPins:!1,hasMasterPin:!1,authenticated:!1,workspace:null,master:!1,accounts:[],error:null,busy:!1};function vc(){try{return localStorage.getItem(Eo)}catch{return null}}function bc(e){try{localStorage.setItem(Eo,e)}catch{}}function $y(){try{localStorage.removeItem(Eo)}catch{}}async function va(e){if(e.client)try{const t=vc(),n=await e.client.request("access.status",{token:t});e.accessState={...e.accessState,checked:!0,hasPins:n.hasPins,hasMasterPin:n.hasMasterPin,accounts:n.accounts??[],authenticated:n.authenticated,workspace:n.workspace,master:n.master,error:null}}catch{e.accessState={...e.accessState,checked:!0,hasPins:!1,hasMasterPin:!1,accounts:[],authenticated:!0,error:null}}}async function Ey(e,t,n){if(e.client){e.accessState={...e.accessState,busy:!0,error:null};try{const s=await e.client.request("access.verify",{account:t,pin:n});s.ok&&s.token?(bc(s.token),e.accessState={...e.accessState,authenticated:!0,workspace:s.workspace??null,master:s.master??!1,busy:!1,error:null}):e.accessState={...e.accessState,busy:!1,error:s.message??"Incorrect PIN"}}catch{e.accessState={...e.accessState,busy:!1,error:"Failed to verify PIN"}}}}async function Ty(e,t){if(e.client){e.accessState={...e.accessState,busy:!0,error:null};try{const n=await e.client.request("access.setMasterPin",{pin:t});n.ok&&n.token?(bc(n.token),e.accessState={...e.accessState,checked:!0,hasPins:!0,hasMasterPin:!0,authenticated:!0,workspace:null,master:!0,busy:!1,error:null}):e.accessState={...e.accessState,busy:!1,error:"Failed to set PIN"}}catch{e.accessState={...e.accessState,busy:!1,error:"Failed to set PIN"}}}}async function Cy(e,t,n){if(!e.client)return!1;try{return(await e.client.request("access.setAccountPin",{workspace:t,pin:n})).ok}catch{return!1}}async function _y(e){const t=vc();if(e.client&&t)try{await e.client.request("access.logout",{token:t})}catch{}$y(),e.accessState={...yc,checked:!0,hasPins:!0,hasMasterPin:e.accessState.hasMasterPin,accounts:e.accessState.accounts}}async function Li(e){return(await e.request("apikeys.list")).providers??[]}async function ba(e,t,n){await e.request("apikeys.set",{provider:t,apiKey:n})}async function My(e,t){await e.request("apikeys.remove",{provider:t})}class Ly{constructor(){this.canvas=null,this.ctx=null,this.img=new Image,this.pendingFrame=null,this.rafId=null,this.deviceWidth=1280,this.deviceHeight=720,this.lastMouseMoveAt=0,this.MOUSE_THROTTLE_MS=30}attach(t){this.canvas=t,this.ctx=t.getContext("2d")}detach(){this.rafId!=null&&(cancelAnimationFrame(this.rafId),this.rafId=null),this.canvas=null,this.ctx=null,this.pendingFrame=null}updateFrame(t,n){n?.deviceWidth&&(this.deviceWidth=n.deviceWidth),n?.deviceHeight&&(this.deviceHeight=n.deviceHeight),this.pendingFrame=t,this.rafId==null&&(this.rafId=requestAnimationFrame(()=>this.renderFrame()))}renderFrame(){this.rafId=null;const t=this.pendingFrame;!t||!this.canvas||!this.ctx||(this.pendingFrame=null,this.img.onload=()=>{!this.canvas||!this.ctx||((this.canvas.width!==this.img.width||this.canvas.height!==this.img.height)&&(this.canvas.width=this.img.width,this.canvas.height=this.img.height),this.ctx.drawImage(this.img,0,0))},this.img.src=`data:image/jpeg;base64,${t}`)}translateCoordinates(t,n){if(!this.canvas)return{x:t,y:n};const s=this.canvas.getBoundingClientRect(),i=this.canvas.width/s.width,o=this.canvas.height/s.height,r=this.deviceWidth/this.canvas.width,l=this.deviceHeight/this.canvas.height;return{x:Math.round(t*i*r),y:Math.round(n*o*l)}}shouldThrottleMouseMove(){const t=performance.now();return t-this.lastMouseMoveAt<this.MOUSE_THROTTLE_MS?!0:(this.lastMouseMoveAt=t,!1)}getDeviceDimensions(){return{width:this.deviceWidth,height:this.deviceHeight}}}let ti=null;function Bn(){return ti||(ti=new Ly),ti}function To(e){return e instanceof Error?e.message:String(e)}async function Py(e){if(!(!e.client||!e.connected)){e.browserLoading=!0,e.browserError=null;try{(await e.client.request("browser.screencast.start",{quality:60,maxWidth:1280,maxHeight:720}))?.ok&&(e.browserScreencastActive=!0)}catch(t){e.browserError=To(t)}finally{e.browserLoading=!1}}}async function Ry(e){if(!(!e.client||!e.connected)){e.browserLoading=!0;try{await e.client.request("browser.screencast.stop",{}),e.browserScreencastActive=!1,e.browserScreencastFrame=null,e.browserScreencastMetadata=null}catch(t){e.browserError=To(t)}finally{e.browserLoading=!1}}}async function ni(e,t,n,s,i){if(!(!e.client||!e.connected||!e.browserInputMode))try{await e.client.request("browser.screencast.input",{type:"mouse",action:t,x:n,y:s,button:i??"left",clickCount:t==="mousePressed"?1:0})}catch{}}async function si(e,t,n,s){if(!(!e.client||!e.connected||!e.browserInputMode))try{await e.client.request("browser.screencast.input",{type:"key",action:t,key:n,...s?.text?{text:s.text}:{},...s?.code?{code:s.code}:{},...s?.modifiers?{modifiers:s.modifiers}:{}})}catch{}}async function Iy(e){if(!(!e.client||!e.connected))try{await e.client.request("browser.handoff.complete",{}),e.browserHandoffPending=!1,e.browserHandoffReason=null,e.browserHandoffId=null}catch(t){e.browserError=To(t)}}function Ny(e){e.browserInputMode=!e.browserInputMode}function Dy(e,t){if(!t?.data)return;e.browserScreencastFrame=t.data,e.browserScreencastMetadata=t.metadata??null,Bn().updateFrame(t.data,t.metadata)}function Oy(e,t){t&&(e.browserHandoffPending=!0,e.browserHandoffReason=t.reason??"Action required",e.browserHandoffId=t.id??null)}function By(e){e.browserHandoffPending=!1,e.browserHandoffReason=null,e.browserHandoffId=null}function Fe(e){return e instanceof Error?e.message:String(e)}let Ln=null;function sn(e,t){Ln&&clearTimeout(Ln),e.filesMessage={kind:"success",text:t},Ln=setTimeout(()=>{e.filesMessage=null,Ln=null},3e3)}async function on(e,t){if(!(!e.client||!e.connected)){if(!t){e.filesTree=[],e.filesRoot="";return}if(!e.filesLoading){e.filesLoading=!0,e.filesError=null;try{const n={};t&&(n.agentId=t);const s=await e.client.request("files.tree",n);s?.tree&&(e.filesTree=s.tree,e.filesRoot=s.root??"")}catch(n){e.filesError=Fe(n)}finally{e.filesLoading=!1}}}}async function Fy(e,t,n){e.filesSelectedPaths=new Set([t]),await wc(e,t,n)}async function Uy(e,t,n){const s=new Set(e.filesSelectedPaths);if(s.has(t)?s.delete(t):s.add(t),e.filesSelectedPaths=s,s.size===1){const i=[...s][0];await wc(e,i,n)}else e.filesSelectedPath=null,e.filesPreviewContent=null,e.filesPreviewSize=null,e.filesPreviewBinary=!1}async function Wy(e,t){if(!e.client||!e.connected)return;const n=[...e.filesSelectedPaths];if(n.length===0)return;let s=0,i="";for(const o of n)try{await kc(e,o,t),s++}catch(r){i=Fe(r)}i?e.filesMessage={kind:"error",text:`${s} downloaded, error: ${i}`}:sn(e,`${s} file${s!==1?"s":""} downloaded`)}async function Ky(e,t,n,s){const i=t.split("/").pop()??t,o=n==="."?i:`${n}/${i}`;o!==t&&await Sc(e,t,o,s)}async function wc(e,t,n){if(!(!e.client||!e.connected)){e.filesSelectedPath=t,e.filesPreviewLoading=!0,e.filesPreviewContent=null,e.filesPreviewBinary=!1,e.filesPreviewSize=null;try{const s={path:t};n&&(s.agentId=n);const i=await e.client.request("files.read",s);e.filesPreviewContent=i?.content??null,e.filesPreviewBinary=i?.binary??!1,e.filesPreviewSize=i?.size??null}catch(s){e.filesError=Fe(s)}finally{e.filesPreviewLoading=!1}}}async function kc(e,t,n){if(!(!e.client||!e.connected))try{const s={path:t};n&&(s.agentId=n);const i=await e.client.request("files.download",s);if(!i?.base64){e.filesMessage={kind:"error",text:"Download failed: no data"};return}const o=Uint8Array.from(atob(i.base64),c=>c.charCodeAt(0)),r=new Blob([o]),l=URL.createObjectURL(r),a=document.createElement("a");a.href=l,a.download=i.name??t.split("/").pop()??"download",document.body.appendChild(a),a.click(),document.body.removeChild(a),URL.revokeObjectURL(l)}catch(s){e.filesMessage={kind:"error",text:Fe(s)}}}async function zy(e,t,n,s){if(!e.client||!e.connected)return;e.filesUploadBusy=!0,e.filesMessage=null;let i=0,o="";for(const r of n)try{const l=await r.arrayBuffer(),a=btoa(new Uint8Array(l).reduce((u,p)=>u+String.fromCharCode(p),"")),c={path:t,name:r.name,data:a};s&&(c.agentId=s),await e.client.request("files.upload",c),i++}catch(l){o=Fe(l)}e.filesUploadBusy=!1,o?e.filesMessage={kind:"error",text:i>0?`${i} uploaded, error: ${o}`:o}:sn(e,`${i} file${i!==1?"s":""} uploaded`),await on(e,s)}async function jy(e,t,n){if(!(!e.client||!e.connected)){e.filesMessage=null;try{const s={path:t};n&&(s.agentId=n),await e.client.request("files.delete",s),sn(e,"File deleted"),e.filesSelectedPath===t&&(e.filesSelectedPath=null,e.filesPreviewContent=null),await on(e,n)}catch(s){e.filesMessage={kind:"error",text:Fe(s)}}}}async function Sc(e,t,n,s){if(!(!e.client||!e.connected)){e.filesMessage=null;try{const i={from:t,to:n};s&&(i.agentId=s),await e.client.request("files.move",i),sn(e,"File moved"),e.filesSelectedPath===t&&(e.filesSelectedPath=n),await on(e,s)}catch(i){e.filesMessage={kind:"error",text:Fe(i)}}}}async function xc(e,t){if(!(!e.client||!e.connected))try{const n={};t&&(n.agentId=t);const s=await e.client.request("memory.status",n);s?.ok&&(e.filesMemoryStatus={dirty:s.dirty??!1,files:s.files??0,chunks:s.chunks??0})}catch{}}async function Hy(e,t){if(!(!e.client||!e.connected)&&!e.filesReindexBusy){e.filesReindexBusy=!0,e.filesMessage=null;try{const n={force:!0};t&&(n.agentId=t);const s=await e.client.request("memory.reindex",n),i=s?.files??0,o=s?.chunks??0;sn(e,`Re-indexed: ${i} files, ${o} chunks`),await xc(e,t)}catch(n){e.filesMessage={kind:"error",text:Fe(n)}}finally{e.filesReindexBusy=!1}}}function qy(e,t){const n=new Set(e.filesExpandedDirs);n.has(t)?n.delete(t):n.add(t),e.filesExpandedDirs=n}function Gy(e,t="admin"){if(!e)return[];const n=e.bindings;if(!Array.isArray(n))return[];const s=[];for(const i of n){if(!i||typeof i!="object"||i.agentId!==t)continue;const o=i.match;if(!o||typeof o!="object"||(o.channel??"").toLowerCase()!=="whatsapp")continue;const l=o.peer;if(!l||typeof l!="object"||l.kind!=="dm")continue;const a=l.id??"";a&&s.push({phone:a,paired:i.meta?.paired===!0})}return s.sort((i,o)=>i.paired&&!o.paired?-1:!i.paired&&o.paired?1:0),s}function Ac(e,t,n="admin",s){const i=new Map,o=new Map;for(const a of e){if(!a||typeof a!="object"||a.agentId!==n)continue;const c=a.match;if(!c||typeof c!="object"||(c.channel??"").toLowerCase()!=="whatsapp")continue;const p=c.peer;if(!p||typeof p!="object"||p.kind!=="dm")continue;const m=p.id??"";m&&(a.meta&&i.set(m,a.meta),c.accountId&&o.set(m,c.accountId))}const r=e.filter(a=>{if(!a||typeof a!="object"||a.agentId!==n)return!0;const c=a.match;if(!c||typeof c!="object"||(c.channel??"").toLowerCase()!=="whatsapp")return!0;const p=c.peer;return!p||typeof p!="object"?!0:p.kind!=="dm"}),l=t.map(a=>{const c=s??o.get(a.phone),u={channel:"whatsapp",peer:{kind:"dm",id:a.phone}};c&&(u.accountId=c);const p={agentId:n,match:u},m=i.get(a.phone);return m?p.meta=m:a.paired&&(p.meta={paired:!0}),p});return[...r,...l]}async function fs(e,t){if(!e.client||!e.connected)return;if(!t){e.adminPhones=[];return}if(e.adminsLoading)return;e.adminsLoading=!0,e.adminsError=null;const n=t;try{const s=await e.client.request("config.get",{});e.configSnapshot=s;const i=s.config;e.configForm=De(i??{}),e.adminPhones=Gy(i,n),e.configFormDirty=!1}catch(s){e.adminsError=String(s)}finally{e.adminsLoading=!1}}async function $c(e,t,n,s){if(!e.client||!e.connected)return;if(!n){e.adminsError="No business selected.";return}if(e.adminsSaving)return;const i=n;let o=t.trim();if(!o){e.adminsError="Phone number is required";return}if(o.startsWith("+")||(o="+"+o),!/^\+[1-9]\d{6,14}$/.test(o)){e.adminsError="Invalid phone number format. Use E.164 format (e.g., +14155552671)";return}if(e.adminPhones.some(r=>r.phone===o)){e.adminsError="Phone number already exists";return}e.adminsSaving=!0,e.adminsError=null;try{const r=De(e.configForm??e.configSnapshot?.config??{}),l=r.bindings??[],a=[...e.adminPhones,{phone:o}],c=Ac(l,a,i,s);za(r,["bindings"],c);const u=e.configSnapshot?.hash;if(!u){e.adminsError="Config hash missing; reload and retry.";return}const p=Ye(r);await e.client.request("config.set",{raw:p,baseHash:u}),await fs(e,n)}catch(r){e.adminsError=String(r)}finally{e.adminsSaving=!1}}async function Ec(e,t,n,s){if(!e.client||!e.connected)return;if(!n){e.adminsError="No business selected.";return}if(e.adminsSaving)return;const i=n;if(e.adminPhones.find(r=>r.phone===t)?.paired){e.adminsError="Cannot remove the paired phone. Unlink WhatsApp first.";return}e.adminsSaving=!0,e.adminsError=null;try{const r=De(e.configForm??e.configSnapshot?.config??{}),l=r.bindings??[],a=e.adminPhones.filter(m=>m.phone!==t),c=Ac(l,a,i,s);za(r,["bindings"],c);const u=e.configSnapshot?.hash;if(!u){e.adminsError="Config hash missing; reload and retry.";return}const p=Ye(r);await e.client.request("config.set",{raw:p,baseHash:u}),await fs(e,n)}catch(r){e.adminsError=String(r)}finally{e.adminsSaving=!1}}const Vy=Object.freeze(Object.defineProperty({__proto__:null,addAdmin:$c,loadAdmins:fs,removeAdmin:Ec},Symbol.toStringTag,{value:"Module"}));async function et(e,t){if(!(!e.client||!e.connected)){if(!t){e.customersRecords=[];return}if(!e.customersLoading){e.customersLoading=!0,e.customersError=null;try{const n=e.customersSearchQuery.trim(),s=n?await e.client.request("records.search",{query:n,workspace:t}):await e.client.request("records.list",{workspace:t});e.customersRecords=s.records??[]}catch(n){e.customersError=String(n)}finally{e.customersLoading=!1}}}}async function Tc(e,t,n,s){if(!e.client||!e.connected||e.customersSaving)return;let i=t.trim();const o=n.trim();if(!i){e.customersError="Phone number is required";return}if(!o){e.customersError="Name is required";return}if(i.startsWith("+")||(i="+"+i),!/^\+[1-9]\d{6,14}$/.test(i)){e.customersError="Invalid phone number format. Use E.164 (e.g. +447490553305)";return}e.customersSaving=!0,e.customersError=null;try{await e.client.request("records.set",{id:i,name:o,fields:{},workspace:s}),e.customersShowAddForm=!1,e.customersNewPhone="",e.customersNewName="",await et(e,s)}catch(r){e.customersError=String(r)}finally{e.customersSaving=!1}}async function Cc(e,t,n){if(!(!e.client||!e.connected)&&!e.customersSaving){e.customersSaving=!0,e.customersError=null;try{await e.client.request("records.delete",{id:t}),e.customersEditingId===t&&(e.customersEditingId=null),await et(e,n)}catch(s){e.customersError=String(s)}finally{e.customersSaving=!1}}}async function _c(e,t,n,s,i){if(!(!e.client||!e.connected)&&!e.customersSaving){e.customersSaving=!0,e.customersError=null;try{await e.client.request("records.setField",{id:t,key:n,value:s}),await et(e,i)}catch(o){e.customersError=String(o)}finally{e.customersSaving=!1}}}async function Mc(e,t,n,s){if(!(!e.client||!e.connected)&&!e.customersSaving){e.customersSaving=!0,e.customersError=null;try{await e.client.request("records.deleteField",{id:t,key:n}),await et(e,s)}catch(i){e.customersError=String(i)}finally{e.customersSaving=!1}}}const Yy=Object.freeze(Object.defineProperty({__proto__:null,addCustomer:Tc,deleteCustomer:Cc,deleteCustomerField:Mc,loadCustomers:et,setCustomerField:_c},Symbol.toStringTag,{value:"Module"}));function Ut(e){if(e.workspaces.length!==0)return{workspaces:e.workspaces,selectedWorkspace:e.selectedWorkspace,onWorkspaceSelect:t=>e.handleWorkspaceSelect(t),hasPins:e.accessState.hasPins,isMaster:e.accessState.master,onLogout:()=>e.handleLogout()}}function Qy(e){if(e.workspaces.length!==0)return{workspaces:e.workspaces,selectedWorkspace:e.selectedWorkspace,onWorkspaceSelect:t=>e.handleWorkspaceSelect(t),onAddAccount:()=>{e.addingWorkspace=!0},hasPins:e.accessState.hasPins,isMaster:e.accessState.master,onLogout:()=>e.handleLogout()}}function Xy(e){const t=J(e);return t?t.agents.find(s=>s.id.endsWith("-admin")||s.id==="admin")?.id:void 0}function Zy(e){return J(e)?.whatsappAccountId??void 0}function Jy(e){const t=J(e);if(t)return t.agents[0]?.id}function ev(e){return e.selectedWorkspace??void 0}function J(e){return e.selectedWorkspace?e.workspaces.find(t=>t.name===e.selectedWorkspace)??null:null}const tv=/^data:/i,nv=/^https?:\/\//i;function sv(e){const t=e.agentsList?.agents??[],s=La(e.sessionKey)?.agentId??e.agentsList?.defaultId??"main",o=t.find(l=>l.id===s)?.identity,r=o?.avatarUrl??o?.avatar;if(r)return tv.test(r)||nv.test(r)?r:o?.avatarUrl}function iv(e){if(!e)return null;const t=e.channelAccounts?.whatsapp;if(!t||t.length===0)return null;const n=t[0];return{running:n.running??!1,connected:n.connected??!1,linked:n.linked??!1,lastError:n.lastError}}function ov(e){if(!e)return{configured:!1,running:!1,connected:!1,lastError:null,selfChatMode:!1,dmPolicy:null,cliPath:null};const t=e.channelAccounts?.imessage;if(!t||t.length===0)return{configured:!1,running:!1,connected:!1,lastError:null,selfChatMode:!1,dmPolicy:null,cliPath:null};const n=t[0],s=n.running??!1,i=n.probe,o=i!=null?i.ok===!0:s;return{configured:n.configured??!1,running:s,connected:o,lastError:n.lastError??null,selfChatMode:n.mode==="self-chat"||!!n.selfChatMode,dmPolicy:n.dmPolicy??null,cliPath:n.cliPath??null}}function rv(e){const t=e.configSnapshot?.config;if(!t)return null;const n=t.bindings;if(!Array.isArray(n))return null;const s=n.find(r=>r.match?.channel==="imessage"&&r.meta?.imessageOwner);if(!s)return null;const i=s.agentId;for(const r of e.workspaces)if(r.agents.some(l=>l.id===i))return r.name;if(i==="admin"||i==="public")return e.workspaces.find(l=>l.isDefault)?.name??null;const o=i.replace(/-(admin|public)$/,"");return o!==i?e.workspaces.find(l=>l.name===o)?.name??null:null}function av(e){if(e.connected&&e.accessState.checked){const{accessState:t}=e;if(t.hasPins&&!t.authenticated)return ya({show:!0,isFirstTime:!1,accounts:t.accounts,error:t.error,busy:t.busy,onSubmit:(n,s)=>{s!=null&&e.handlePinSubmit(n,s)},changePinMode:e.loginChangePinMode,onToggleChangePinMode:()=>e.toggleChangePinMode(),changePinBusy:e.changePinBusy,changePinError:e.changePinError,changePinSuccess:e.changePinSuccess,onChangePin:(n,s,i)=>e.handleChangePin(n,s,i)});if(!t.hasMasterPin&&!t.authenticated&&e.setup)return ya({show:!0,isFirstTime:!0,accounts:[],error:t.error,busy:t.busy,onSubmit:n=>e.handleSetMasterPin(n)});if(!t.hasMasterPin&&!t.authenticated&&!e.setup)return window.location.href="/setup",b}if(e.setup){const t=iv(e.channelsSnapshot),n=e.channelsSnapshot?.channelAccounts?.whatsapp??[],s=ov(e.channelsSnapshot),i=rv(e);return ah({connected:e.connected,assistantName:e.assistantName,currentStep:e.setupStep,licenseKey:e.licenseKey,licenseBusy:e.licenseBusy,licenseValid:e.licenseValid,licenseMessage:e.licenseMessage,licenseTier:e.licenseTier,licenseDeviceId:e.licenseDeviceId,licenseStoredKey:e.licenseStoredKey,onLicenseKeyChange:o=>e.handleLicenseKeyChange(o),onLicenseActivate:()=>e.handleLicenseActivate(),onLicenseRemove:async()=>{await e.handleLicenseRemove(),e.licenseRemoveConfirm=!1},licenseRemoveConfirm:e.licenseRemoveConfirm,onLicenseRemoveConfirm:()=>{e.licenseRemoveConfirm=!0},onLicenseRemoveCancel:()=>{e.licenseRemoveConfirm=!1},authConnected:e.authConnected,authBusy:e.authBusy,authMessage:e.authMessage,authUrl:e.authUrl,authCodeInput:e.authCodeInput,authExpiresIn:e.authExpiresIn,whatsappBusy:e.whatsappBusy,whatsappLoginMessage:e.whatsappLoginMessage,whatsappLoginQrDataUrl:e.whatsappLoginQrDataUrl,whatsappLoginConnected:e.whatsappLoginConnected,whatsappChannelStatus:t,whatsappAccounts:n,whatsappActiveQrAccountId:e.whatsappActiveQrAccountId,whatsappAccountSaving:e.whatsappAccountSaving,gatewayHealthy:e.gatewayHealthy,gatewayHealthLoading:e.gatewayHealthLoading,gatewayHealthMessage:e.gatewayHealthMessage,gatewayRestartBusy:e.gatewayRestartBusy,updateAvailable:e.updateAvailable,currentVersion:e.currentVersion,latestVersion:e.latestVersion,updateChecking:e.updateChecking,updateRunning:e.updateRunning,updateMessage:e.updateMessage,updateProgressSteps:e.updateProgressSteps,updateLastResult:e.updateLastResult,onUpdateCheck:()=>e.handleUpdateCheck(),onUpdateRun:()=>e.handleUpdateRun(),onUpdateDismissResult:()=>e.handleUpdateDismissResult(),uninstallConfirm:e.uninstallConfirm,uninstallBusy:e.uninstallBusy,uninstallDone:e.uninstallDone,uninstallError:e.uninstallError,uninstallConfirmText:e.uninstallConfirmText,onUninstallConfirm:()=>e.handleUninstallConfirm(),onUninstallCancel:()=>e.handleUninstallCancel(),onUninstallConfirmTextChange:o=>e.handleUninstallConfirmTextChange(o),onUninstallRun:()=>e.handleUninstallRun(),onUninstallDismiss:()=>e.handleUninstallDismiss(),onStartAuth:()=>e.handleAuthStart(),onSubmitAuthCode:o=>e.handleAuthSubmitCode(o),onAuthCodeChange:o=>e.handleAuthCodeChange(o),onSkipToWhatsApp:()=>e.handleSkipToWhatsApp(),onWhatsAppRelink:async o=>{await e.handleWhatsAppStart(!0,o),e.whatsappLoginQrDataUrl&&(await e.handleWhatsAppWait(o),await z(e,!0),e.requestUpdate())},onWhatsAppReset:async o=>{await e.handleWhatsAppLogout(o),await e.handleWhatsAppStart(!0,o),e.whatsappLoginQrDataUrl&&(await e.handleWhatsAppWait(o),await z(e,!0),e.requestUpdate())},onRefreshStatus:async()=>{await z(e,!0),await e.handleGatewayHealthCheck()},onWhatsAppBack:()=>{e.whatsappLoginQrDataUrl=null,e.whatsappLoginMessage=null,e.whatsappLoginConnected=null,e.whatsappActiveQrAccountId=null,e.requestUpdate(),z(e,!0)},onRestartGateway:()=>e.handleGatewayRestart(),onRemoveWhatsAppAccount:o=>e.handleRemoveWhatsAppAccount(o),workspaces:e.workspaces,workspacesLoading:e.workspacesLoading,workspacesError:e.workspacesError,addingWorkspace:e.addingWorkspace,newWorkspaceName:e.newWorkspaceName,newWorkspacePath:e.newWorkspacePath,workspaceSaving:e.workspaceSaving,workspaceRemoveConfirm:e.workspaceRemoveConfirm,newWorkspacePin:e.newWorkspacePin,onSetNewWorkspacePin:o=>{e.newWorkspacePin=o},onWorkspaceCreate:async(o,r)=>{const l=e.newWorkspacePin;await e.handleWorkspaceCreate(o,r),l.match(/^\d{4,6}$/)&&(await Cy(e,o,l),e.newWorkspacePin="")},onWorkspaceRemove:o=>e.handleWorkspaceRemove(o),onSetAddingWorkspace:o=>{e.addingWorkspace=o},onSetNewWorkspaceName:o=>{e.newWorkspaceName=o},onSetNewWorkspacePath:o=>{e.newWorkspacePath=o},onSetWorkspaceRemoveConfirm:o=>{e.workspaceRemoveConfirm=o},renamingWorkspace:e.renamingWorkspace,renameWorkspaceName:e.renameWorkspaceName,onWorkspaceRenameStart:()=>e.handleWorkspaceRenameStart(),onWorkspaceRenameCancel:()=>e.handleWorkspaceRenameCancel(),onWorkspaceRename:(o,r)=>e.handleWorkspaceRename(o,r),whatsappDmPolicy:(()=>{const r=J(e)?.whatsappAccountId;return(r?n.find(a=>a.accountId===r):n[0])?.dmPolicy??null})(),onWhatsAppDmToggle:async()=>{const r=J(e)?.whatsappAccountId,l=r?n.find(p=>p.accountId===r):n[0];if(!l)return;const c=l.dmPolicy!=null&&l.dmPolicy!=="disabled"?"disabled":"open",u=c==="open"?{dmPolicy:c,allowFrom:["*"]}:{dmPolicy:c};try{const p=await e.client.request("config.get"),A=(p.config?.channels?.whatsapp?.accounts??{})[l.accountId]?{channels:{whatsapp:{accounts:{[l.accountId]:u}}}}:{channels:{whatsapp:u}};await e.client.request("config.patch",{raw:JSON.stringify(A),baseHash:p.hash,note:`WhatsApp DM policy → ${c}`,skipRestart:!0}),await z(e,!1)}catch(p){console.error("DM toggle failed:",p)}},whatsappModel:(()=>{const o=J(e);if(!o)return null;const r=o.agents.find(p=>p.id.endsWith("-public")||p.id==="public");if(!r)return null;const a=e.configSnapshot?.config?.agents?.list;if(!Array.isArray(a))return null;const c=a.find(p=>p.id===r.id);return c?.model&&(typeof c.model=="string"?c.model:c.model.primary)?.trim()||null})(),whatsappModelCatalog:e.chatModelCatalog??[],onWhatsAppModelChange:async o=>{const r=J(e);if(!r)return;const l=r.agents.find(a=>a.id.endsWith("-public")||a.id==="public");if(l)try{const a=await e.client.request("config.get"),u=a.config?.agents??{},p=Array.isArray(u.list)?[...u.list]:[],m=p.findIndex(w=>w.id===l.id);if(o)m>=0?p[m]={...p[m],model:o}:p.push({id:l.id,model:o});else if(m>=0){const{model:w,...A}=p[m];Object.keys(A).length<=1?p.splice(m,1):p[m]=A}const v=p.length>0?{agents:{list:p}}:{agents:{list:null}};await e.client.request("config.patch",{raw:JSON.stringify(v),baseHash:a.hash,note:`Public agent model → ${o||"default"}`,skipRestart:!0}),e.configSnapshot=await e.client.request("config.get")}catch(a){console.error("Model change failed:",a)}},whatsappThinkingLevel:(()=>{const o=J(e);if(!o)return null;const r=o.agents.find(u=>u.id.endsWith("-public")||u.id==="public");if(!r)return null;const a=e.configSnapshot?.config?.agents?.list;return Array.isArray(a)&&a.find(u=>u.id===r.id)?.thinkingLevel?.trim()||null})(),onWhatsAppThinkingChange:async o=>{const r=J(e);if(!r)return;const l=r.agents.find(a=>a.id.endsWith("-public")||a.id==="public");if(l)try{const a=await e.client.request("config.get"),u=a.config?.agents??{},p=Array.isArray(u.list)?[...u.list]:[],m=p.findIndex(A=>A.id===l.id),v=o==="off"?void 0:o;if(v)m>=0?p[m]={...p[m],thinkingLevel:v}:p.push({id:l.id,thinkingLevel:v});else if(m>=0){const{thinkingLevel:A,..._}=p[m];Object.keys(_).length<=1?p.splice(m,1):p[m]=_}const w=p.length>0?{agents:{list:p}}:{agents:{list:null}};await e.client.request("config.patch",{raw:JSON.stringify(w),baseHash:a.hash,note:`Public agent thinking → ${v||"default"}`,skipRestart:!0}),e.configSnapshot=await e.client.request("config.get")}catch(a){console.error("Thinking change failed:",a)}},whatsappGroupPolicy:(()=>{const r=e.configSnapshot?.config?.channels?.whatsapp,a=J(e)?.whatsappAccountId,c=r?.accounts??{};return(a?c[a]:void 0)?.groupPolicy??r?.groupPolicy??"allowlist"})(),whatsappGroupRequireMention:(()=>{const r=e.configSnapshot?.config?.channels?.whatsapp,a=J(e)?.whatsappAccountId,c=r?.accounts??{};return((a?c[a]:void 0)?.groups??r?.groups??{})["*"]?.requireMention!==!1})(),onWhatsAppGroupToggle:async()=>{const r=J(e)?.whatsappAccountId;try{const l=await e.client.request("config.get"),c=l.config?.channels?.whatsapp??{},u=c.accounts??{},p=r?u[r]:void 0,m=p?.groupPolicy??c.groupPolicy??"allowlist",v=m==="disabled"||m==="allowlist",w=v?"open":"disabled",A=v?{"*":{}}:void 0,_={groupPolicy:w};A&&(_.groups=A);const j=p?{channels:{whatsapp:{accounts:{[r]:_}}}}:{channels:{whatsapp:_}};await e.client.request("config.patch",{raw:JSON.stringify(j),baseHash:l.hash,note:`WhatsApp groups → ${w}`,skipRestart:!0}),e.configSnapshot=await e.client.request("config.get")}catch(l){console.error("Group toggle failed:",l)}},onWhatsAppGroupMentionChange:async o=>{const l=J(e)?.whatsappAccountId;try{const a=await e.client.request("config.get"),p=(a.config?.channels?.whatsapp??{}).accounts??{},m=l?p[l]:void 0,v={"*":{requireMention:o}},w=m?{channels:{whatsapp:{accounts:{[l]:{groups:v}}}}}:{channels:{whatsapp:{groups:v}}};await e.client.request("config.patch",{raw:JSON.stringify(w),baseHash:a.hash,note:`WhatsApp group mention → ${o?"when mentioned":"always"}`,skipRestart:!0}),e.configSnapshot=await e.client.request("config.get")}catch(a){console.error("Group mention change failed:",a)}},whatsappSettingsOpen:e.whatsappSettingsOpen??!1,onWhatsAppSettingsOpen:()=>{e.whatsappSettingsOpen=!0},onWhatsAppSettingsClose:()=>{e.whatsappSettingsOpen=!1},imessageConfigured:s.configured,imessageRunning:s.running,imessageConnected:s.connected,imessageLastError:s.lastError,imessageSelfChatMode:s.selfChatMode,imessageCliPath:s.cliPath,imessageEnabling:e.imessageEnabling,imessageEnableConfirm:e.imessageEnableConfirm,imessageOwnerWorkspace:i,onIMessageEnable:()=>{e.imessageEnableConfirm=!0},onIMessageEnableConfirm:async()=>{e.imessageEnabling=!0;try{const o=await e.client.request("config.get"),l=o.config?.bindings??[],a=J(e),u=a?.agents.find(w=>w.id.endsWith("-admin")||w.id==="admin")?.id??"admin",p=l.filter(w=>w.match?.channel!=="imessage"),m=[{agentId:u,match:{channel:"imessage",peer:{kind:"dm",id:"__self__"}},meta:{imessageOwner:!0}}],v=[...p,...m];await e.client.request("config.patch",{raw:JSON.stringify({channels:{imessage:{selfChatMode:!0,dmPolicy:"disabled",allowFrom:["*"]}},bindings:v}),baseHash:o.hash,note:"Enable iMessage (self-chat) for "+(a?.name??"default")}),e.imessageEnableConfirm=!1,setTimeout(()=>{Promise.all([z(e,!0),ke(e)]).then(()=>{e.imessageEnabling=!1})},3e3)}catch{e.imessageEnabling=!1}},onIMessageEnableCancel:()=>{e.imessageEnableConfirm=!1},onIMessageProbe:async()=>{e.imessageEnabling=!0,e.requestUpdate();try{await z(e,!0)}finally{e.imessageEnabling=!1}},onIMessageDisconnect:async()=>{e.imessageEnabling=!0;try{const o=await e.client.request("config.get"),a=(o.config?.bindings??[]).filter(c=>c.match?.channel!=="imessage");await e.client.request("config.patch",{raw:JSON.stringify({channels:{imessage:{selfChatMode:!1,dmPolicy:"disabled"}},bindings:a}),baseHash:o.hash,note:"Disconnect iMessage"}),e.imessageEnableConfirm=!1,setTimeout(()=>{Promise.all([z(e,!0),ke(e)]).then(()=>{e.imessageEnabling=!1})},3e3)}catch{e.imessageEnabling=!1}},onIMessageReassign:async()=>{e.imessageEnabling=!0;try{const o=await e.client.request("config.get"),l=o.config?.bindings??[],a=J(e),u=a?.agents.find(v=>v.id.endsWith("-admin")||v.id==="admin")?.id??"admin",p=l.filter(v=>v.match?.channel!=="imessage"),m=[{agentId:u,match:{channel:"imessage",peer:{kind:"dm",id:"__self__"}},meta:{imessageOwner:!0}}];await e.client.request("config.patch",{raw:JSON.stringify({channels:{imessage:{selfChatMode:!0,dmPolicy:"disabled",allowFrom:["*"]}},bindings:[...p,...m]}),baseHash:o.hash,note:"Reassign iMessage to "+(a?.name??"default")}),e.imessageEnableConfirm=!1,setTimeout(()=>{Promise.all([z(e,!0),ke(e)]).then(()=>{e.imessageEnabling=!1})},3e3)}catch{e.imessageEnabling=!1}},infoModalOpen:e.infoModalOpen,onInfoModalOpen:o=>{e.infoModalOpen=o},onInfoModalClose:()=>{e.infoModalOpen=null},isMaster:e.accessState.master,apiKeyProviders:e.apiKeyProviders,apiKeyModalOpen:e.apiKeyModalOpen,apiKeyBusy:e.apiKeyBusy,apiKeyError:e.apiKeyError,apiKeySuccess:e.apiKeySuccess,onApiKeyModalOpen:()=>{e.apiKeyModalOpen=!0,e.apiKeyError=null,e.apiKeySuccess=null},onApiKeyModalClose:()=>{e.apiKeyModalOpen=!1,e.apiKeyError=null,e.apiKeySuccess=null},onApiKeySave:async(o,r)=>{e.apiKeyBusy=!0,e.apiKeyError=null,e.apiKeySuccess=null;try{await ba(e.client,o,r),e.apiKeySuccess=`${o} key saved`;try{e.apiKeyProviders=await Li(e.client)}catch{}o==="anthropic"&&await e.handleAuthStatusCheck()}catch(l){e.apiKeyError=l instanceof Error?l.message:"Failed to save key"}finally{e.apiKeyBusy=!1}},onApiKeyRemove:async o=>{e.apiKeyBusy=!0,e.apiKeyError=null,e.apiKeySuccess=null;try{await My(e.client,o),e.apiKeySuccess=`${o} key removed`;try{e.apiKeyProviders=await Li(e.client)}catch{}}catch(r){e.apiKeyError=r instanceof Error?r.message:"Failed to remove key"}finally{e.apiKeyBusy=!1}},authApiKeyMode:e.authApiKeyMode,authApiKeyInput:e.authApiKeyInput,authApiKeyBusy:e.authApiKeyBusy,authApiKeyError:e.authApiKeyError,onAuthApiKeyToggle:()=>{e.authApiKeyMode=!e.authApiKeyMode,e.authApiKeyError=null},onAuthApiKeyChange:o=>{e.authApiKeyInput=o},onAuthApiKeySubmit:async()=>{const o=e.authApiKeyInput.trim();if(o){e.authApiKeyBusy=!0,e.authApiKeyError=null;try{await ba(e.client,"anthropic",o),await e.handleAuthStatusCheck(),e.authApiKeyMode=!1,e.authApiKeyInput=""}catch(r){e.authApiKeyError=r instanceof Error?r.message:"Failed to save API key"}finally{e.authApiKeyBusy=!1}}},accountHasPin:(()=>{const o=e.selectedWorkspace??e.workspaces[0]?.name;return o?e.accessState.accounts.some(r=>r.id===o):!1})(),accountPinModalOpen:e.accountPinModalOpen,accountPinBusy:e.accountPinBusy,accountPinError:e.accountPinError,accountPinSuccess:e.accountPinSuccess,onAccountPinModalOpen:()=>{e.accountPinModalOpen=!0,e.accountPinError=null,e.accountPinSuccess=null},onAccountPinModalClose:()=>{e.accountPinModalOpen=!1,e.accountPinError=null,e.accountPinSuccess=null},onAccountPinSave:(o,r)=>{const l=e.selectedWorkspace??e.workspaces[0]?.name;l&&e.handleAccountPinSave(l,o,r)},wsProps:Qy(e)})}if(e.filesPage){const t=Jy(e);return Hp({connected:e.connected,wsProps:Ut(e),loading:e.filesLoading,tree:e.filesTree,root:e.filesRoot,error:e.filesError,selectedPath:e.filesSelectedPath,selectedPaths:e.filesSelectedPaths,previewContent:e.filesPreviewContent,previewLoading:e.filesPreviewLoading,previewBinary:e.filesPreviewBinary,previewSize:e.filesPreviewSize,expandedDirs:e.filesExpandedDirs,message:e.filesMessage,uploadBusy:e.filesUploadBusy,reindexBusy:e.filesReindexBusy,memoryStatus:e.filesMemoryStatus,onRefresh:()=>on(e,t),onReindex:()=>Hy(e,t),onSelectFile:n=>Fy(e,n,t),onToggleSelectFile:n=>Uy(e,n,t),onToggleDir:n=>qy(e,n),onUpload:(n,s)=>zy(e,n,s,t),onDownload:n=>kc(e,n,t),onBulkDownload:()=>Wy(e,t),onDelete:n=>jy(e,n,t),onMove:(n,s)=>Sc(e,n,s,t),onMoveToDir:(n,s)=>Ky(e,n,s,t)})}if(e.browserPage)return Up({connected:e.connected,active:e.browserScreencastActive,loading:e.browserLoading,error:e.browserError,inputMode:e.browserInputMode,handoffPending:e.browserHandoffPending,handoffReason:e.browserHandoffReason,onStart:()=>Py(e),onStop:()=>Ry(e),onToggleInput:()=>Ny(e),onCompleteHandoff:()=>Iy(e),onCanvasMouseDown:t=>{const s=t.target.getBoundingClientRect(),o=Bn().translateCoordinates(t.clientX-s.left,t.clientY-s.top);ni(e,"mousePressed",o.x,o.y,t.button===2?"right":t.button===1?"middle":"left")},onCanvasMouseUp:t=>{const s=t.target.getBoundingClientRect(),o=Bn().translateCoordinates(t.clientX-s.left,t.clientY-s.top);ni(e,"mouseReleased",o.x,o.y)},onCanvasMouseMove:t=>{const n=Bn();if(n.shouldThrottleMouseMove())return;const i=t.target.getBoundingClientRect(),o=n.translateCoordinates(t.clientX-i.left,t.clientY-i.top);ni(e,"mouseMoved",o.x,o.y)},onCanvasKeyDown:t=>{let n=0;t.altKey&&(n|=1),t.ctrlKey&&(n|=2),t.metaKey&&(n|=4),t.shiftKey&&(n|=8),si(e,"keyDown",t.key,{code:t.code,modifiers:n||void 0}),t.key.length===1&&si(e,"char",t.key,{text:t.key})},onCanvasKeyUp:t=>{si(e,"keyUp",t.key,{code:t.code})}});if(e.adminsPage){const t=Xy(e),n=Zy(e);return ch({connected:e.connected,wsProps:Ut(e),loading:e.adminsLoading,saving:e.adminsSaving,phones:e.adminPhones,error:e.adminsError,newPhone:e.adminsNewPhone,onRefresh:()=>fs(e,t),onAdd:s=>{$c(e,s,t,n).then(()=>{e.adminsError||(e.adminsNewPhone="")})},onRemove:s=>Ec(e,s,t,n),onNewPhoneChange:s=>e.handleAdminsNewPhoneChange(s)})}if(e.customersPage){const t=ev(e);return hh({connected:e.connected,wsProps:Ut(e),loading:e.customersLoading,saving:e.customersSaving,records:e.customersRecords,error:e.customersError,searchQuery:e.customersSearchQuery,editingId:e.customersEditingId,showAddForm:e.customersShowAddForm,newRecordPhone:e.customersNewPhone,newRecordName:e.customersNewName,onSearch:n=>e.customersSearchQuery=n,onSearchSubmit:()=>et(e,t),onAdd:(n,s)=>Tc(e,n,s,t),onDelete:n=>Cc(e,n,t),onSetField:(n,s,i)=>_c(e,n,s,i,t),onDeleteField:(n,s)=>Mc(e,n,s,t),onToggleExpand:n=>{e.customersEditingId=e.customersEditingId===n?null:n},onShowAddForm:()=>e.customersShowAddForm=!0,onCancelAddForm:()=>{e.customersShowAddForm=!1,e.customersNewPhone="",e.customersNewName=""},onNewRecordPhoneChange:n=>e.handleCustomersNewPhoneChange(n),onNewRecordNameChange:n=>e.handleCustomersNewNameChange(n),onRefresh:()=>et(e,t)})}if(e.chatPage){const t=e.connected?null:"Disconnected from gateway.",n=sv(e),s=e.chatAvatarUrl??n??null;return Ym({connected:e.connected,wsProps:Ut(e),sessionKey:e.sessionKey,onSessionKeyChange:i=>{e.sessionKey=i,e.chatMessage="",e.chatAttachments=[],e.chatStream=null,e.chatStreamStartedAt=null,e.chatRunId=null,e.chatQueue=[],e.resetToolStream(),e.resetChatScroll(),e.applySettings({...e.settings,sessionKey:i,lastActiveSessionKey:i}),e.loadAssistantIdentity(),Ce(e),fi(e)},thinkingLevel:e.chatThinkingLevel,showThinking:e.settings.chatShowThinking??!1,modelProvider:e.chatModelProvider,model:e.chatModel,modelCatalog:e.chatModelCatalog,onModelChange:i=>{wn(e,e.sessionKey,{model:i}).then(()=>{Ce(e)})},onThinkingLevelChange:i=>{wn(e,e.sessionKey,{thinkingLevel:i==="off"?null:i}).then(()=>{Ce(e)})},verboseLevel:e.chatVerboseLevel,fillerEnabled:e.chatFillerEnabled,onVerboseChange:i=>{wn(e,e.sessionKey,{verboseLevel:i==="off"?null:i}).then(()=>{Ce(e)})},onFillerChange:i=>{wn(e,e.sessionKey,{fillerEnabled:i}).then(()=>{Ce(e)})},loading:e.chatLoading,sending:e.chatSending,compactionStatus:e.compactionStatus,assistantAvatarUrl:s,messages:e.chatMessages,toolMessages:e.chatToolMessages,stream:e.chatStream,streamStartedAt:e.chatStreamStartedAt,draft:e.chatMessage,queue:e.chatQueue,canSend:e.connected,disabledReason:t,error:e.lastError,sessions:e.sessionsResult,focusMode:!1,onRefresh:()=>(e.resetToolStream(),Promise.all([Ce(e),fi(e)])),onToggleFocusMode:()=>{},onChatScroll:i=>e.handleChatScroll(i),nearBottom:e.chatUserNearBottom,onDraftChange:i=>e.chatMessage=i,attachments:e.chatAttachments,onAttachmentsChange:i=>e.chatAttachments=i,onSend:()=>e.handleSendChat(),canAbort:!!e.chatRunId,onAbort:()=>{e.handleAbortChat()},onQueueRemove:i=>e.removeQueuedMessage(i),onNewSession:()=>e.handleSendChat("/new",{restoreDraft:!0}),sidebarOpen:e.sidebarOpen,sidebarContent:e.sidebarContent,sidebarError:e.sidebarError,splitRatio:e.splitRatio,onOpenSidebar:i=>e.handleOpenSidebar(i),onCloseSidebar:()=>e.handleCloseSidebar(),onSplitRatioChange:i=>e.handleSplitRatioChange(i),assistantName:e.assistantName,assistantAvatar:e.assistantAvatar})}return e.advancedPage?Ay({connected:e.connected,wsProps:Ut(e),activeTab:e.advancedTab,onTabChange:t=>{e.advancedTab=t,t==="cron"&&e.loadCron(),t==="skills"&&wt(e,{clearMessages:!0}),t==="logs"&&(e.logsSubTab==="session"?gt(e,{reset:!0}):qt(e,{reset:!0}))},cronProps:{loading:e.cronLoading,status:e.cronStatus,jobs:e.cronJobs,error:e.cronError,busy:e.cronBusy,form:e.cronForm,channels:e.channelsSnapshot?.channelMeta?.length?e.channelsSnapshot.channelMeta.map(t=>t.id):e.channelsSnapshot?.channelOrder??[],channelLabels:e.channelsSnapshot?.channelLabels??{},channelMeta:e.channelsSnapshot?.channelMeta??[],agentIds:J(e)?.agents?.map(n=>n.id)??[],runsJobId:e.cronRunsJobId,runs:e.cronRuns,newEventModalOpen:e.cronNewEventModal,onNewEventModalOpen:()=>{e.cronNewEventModal=!0},onNewEventModalClose:()=>{e.cronNewEventModal=!1},detailJobId:e.cronDetailJobId,onDetailOpen:t=>{e.cronDetailJobId=t.id,ci(e,t.id)},onDetailClose:()=>{e.cronDetailJobId=null},onFormChange:t=>e.cronForm={...e.cronForm,...t},onRefresh:()=>e.loadCron(),onAdd:()=>{hd(e).then(()=>{e.cronNewEventModal=!1})},onToggle:(t,n)=>fd(e,t,n),onRun:t=>gd(e,t),onRemove:t=>md(e,t),onLoadRuns:t=>ci(e,t)},skillsProps:{loading:e.skillsLoading,report:e.skillsReport,error:e.skillsError,filter:e.skillsFilter,edits:e.skillEdits,messages:e.skillMessages,busyKey:e.skillsBusyKey,onFilterChange:t=>e.skillsFilter=t,onRefresh:()=>wt(e,{clearMessages:!0}),onToggle:(t,n)=>sp(e,t,n),onEdit:(t,n)=>np(e,t,n),onSaveKey:t=>ip(e,t),onInstall:(t,n,s)=>op(e,t,n,s)},logsProps:{logsSubTab:e.logsSubTab,onSubTabChange:t=>{e.logsSubTab=t,t==="session"?gt(e,{reset:!0}):qt(e,{reset:!0})},sessionLogsProps:{loading:e.sessionLogsLoading,error:e.sessionLogsError,entries:e.sessionLogsEntries,agents:e.sessionLogsAgents,filterText:e.sessionLogsFilterText,typeFilters:e.sessionLogsTypeFilters,agentFilters:e.sessionLogsAgentFilters,autoFollow:e.sessionLogsAutoFollow,full:e.sessionLogsFull,onFilterTextChange:t=>e.sessionLogsFilterText=t,onTypeToggle:(t,n)=>{const s=e;s.sessionLogsTypeFilters={...s.sessionLogsTypeFilters,[t]:n}},onAgentToggle:(t,n)=>{const s=e;s.sessionLogsAgentFilters={...s.sessionLogsAgentFilters,[t]:n}},onToggleAutoFollow:t=>e.sessionLogsAutoFollow=t,onToggleFull:t=>{e.sessionLogsFull=t,gt(e,{reset:!0})},onRefresh:()=>{gt(e,{reset:!0})},onExport:(t,n)=>e.exportSessionLogs(t,n),onScroll:t=>e.handleSessionLogsScroll(t)},loading:e.logsLoading,error:e.logsError,file:e.logsFile,entries:e.logsEntries,filterText:e.logsFilterText,levelFilters:e.logsLevelFilters,autoFollow:e.logsAutoFollow,truncated:e.logsTruncated,onFilterTextChange:t=>e.logsFilterText=t,onLevelToggle:(t,n)=>{e.logsLevelFilters={...e.logsLevelFilters,[t]:n}},onToggleAutoFollow:t=>e.logsAutoFollow=t,onRefresh:()=>qt(e,{reset:!0}),onExport:(t,n)=>e.exportSessionLogs(t,n),onScroll:t=>e.handleLogsScroll(t)}}):(window.location.replace("/chat"),d``)}const lv={trace:!0,debug:!0,info:!0,warn:!0,error:!0,fatal:!0},cv={name:"",description:"",agentId:"",enabled:!0,scheduleKind:"every",scheduleAt:"",everyAmount:"30",everyUnit:"minutes",cronExpr:"0 7 * * *",cronTz:"",sessionTarget:"main",wakeMode:"next-heartbeat",payloadKind:"systemEvent",payloadText:"",deliver:!1,channel:"last",to:"",timeoutSeconds:"",postToMainPrefix:""};async function uv(e){if(!(!e.client||!e.connected)&&!e.agentsLoading){e.agentsLoading=!0,e.agentsError=null;try{const t=await e.client.request("agents.list",{});t&&(e.agentsList=t)}catch(t){e.agentsError=String(t)}finally{e.agentsLoading=!1}}}async function rn(e){if(!(!e.client||!e.connected)&&!e.workspacesLoading){e.workspacesLoading=!0,e.workspacesError=null;try{const t=await e.client.request("workspaces.list",{});e.workspaces=t.workspaces}catch(t){e.workspacesError=String(t)}finally{e.workspacesLoading=!1}}}async function dv(e,t){if(!e.client||!e.connected||e.workspaceSaving)return;const n=t.name.trim();if(!n){e.workspacesError="Account name is required.";return}e.workspaceSaving=!0,e.workspacesError=null;try{const s=await e.client.request("config.get",{});e.configSnapshot=s;const i=s.hash;if(!i){e.workspacesError="Config hash missing; reload and retry.";return}const o={name:n,baseHash:i,whatsappAccountName:n};t.workspacePath?.trim()&&(o.workspaceDir=t.workspacePath.trim());const r=await e.client.request("workspaces.create",o);e.addingWorkspace=!1,e.newWorkspaceName="",e.newWorkspacePath="",await rn(e),t.onCreated?.(r)}catch(s){e.workspacesError=String(s)}finally{e.workspaceSaving=!1}}async function pv(e,t){if(!(!e.client||!e.connected)&&!e.workspaceSaving){e.workspaceSaving=!0,e.workspacesError=null;try{const n=await e.client.request("config.get",{});e.configSnapshot=n;const s=n.hash;if(!s){e.workspacesError="Config hash missing; reload and retry.";return}await e.client.request("workspaces.remove",{name:t,baseHash:s}),e.workspaceRemoveConfirm=null,await rn(e)}catch(n){e.workspacesError=String(n)}finally{e.workspaceSaving=!1}}}async function hv(e,t,n){if(!(!e.client||!e.connected)){e.workspacesError=null;try{const s=await e.client.request("config.get",{});e.configSnapshot=s;const i=s.hash;if(!i){e.workspacesError="Config hash missing; reload and retry.";return}await e.client.request("workspaces.rename",{name:t,displayName:n,baseHash:i}),await rn(e)}catch(s){e.workspacesError=String(s)}}}const Pn=Object.freeze(Object.defineProperty({__proto__:null,createWorkspace:dv,loadWorkspaces:rn,removeWorkspace:pv,renameWorkspace:hv},Symbol.toStringTag,{value:"Module"})),Lc={WEBCHAT_UI:"webchat-ui",CONTROL_UI:"taskmaster-control-ui",SETUP_UI:"setup-ui",WEBCHAT:"webchat",CLI:"cli",GATEWAY_CLIENT:"gateway-client",MACOS_APP:"taskmaster-macos",IOS_APP:"taskmaster-ios",ANDROID_APP:"taskmaster-android",NODE_HOST:"node-host",TEST:"test",FINGERPRINT:"fingerprint",PROBE:"taskmaster-probe"},wa=Lc,Pi={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",NODE:"node",PROBE:"probe",TEST:"test"};new Set(Object.values(Lc));new Set(Object.values(Pi));function fv(e){const t=e.version??(e.nonce?"v2":"v1"),n=e.scopes.join(","),s=e.token??"",i=[t,e.deviceId,e.clientId,e.clientMode,e.role,n,String(e.signedAtMs),s];return t==="v2"&&i.push(e.nonce??""),i.join("|")}const gv=4008;class mv{constructor(t){this.opts=t,this.ws=null,this.pending=new Map,this.closed=!1,this.lastSeq=null,this.connectNonce=null,this.connectSent=!1,this.connectTimer=null,this.backoffMs=800}start(){this.closed=!1,this.connect()}stop(){this.closed=!0,this.ws?.close(),this.ws=null,this.flushPending(new Error("gateway client stopped"))}get connected(){return this.ws?.readyState===WebSocket.OPEN}connect(){this.closed||(this.ws=new WebSocket(this.opts.url),this.ws.onopen=()=>this.queueConnect(),this.ws.onmessage=t=>this.handleMessage(String(t.data??"")),this.ws.onclose=t=>{const n=String(t.reason??"");this.ws=null,this.flushPending(new Error(`gateway closed (${t.code}): ${n}`)),this.opts.onClose?.({code:t.code,reason:n}),this.scheduleReconnect()},this.ws.onerror=()=>{})}scheduleReconnect(){if(this.closed)return;const t=this.backoffMs;this.backoffMs=Math.min(this.backoffMs*1.7,15e3),window.setTimeout(()=>this.connect(),t)}flushPending(t){for(const[,n]of this.pending)n.reject(t);this.pending.clear()}async sendConnect(){if(this.connectSent)return;this.connectSent=!0,this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null);const t=typeof crypto<"u"&&!!crypto.subtle,n=["operator.admin","operator.approvals","operator.pairing"],s="operator";let i=null,o=!1,r=this.opts.token;if(t){i=await Gd();const u=Qd({deviceId:i.deviceId,role:s})?.token;r=u??this.opts.token,o=!!(u&&this.opts.token)}const l=r||this.opts.password?{token:r,password:this.opts.password}:void 0;let a;if(t&&i){const u=Date.now(),p=this.connectNonce??void 0,m=fv({deviceId:i.deviceId,clientId:this.opts.clientName??wa.CONTROL_UI,clientMode:this.opts.mode??Pi.WEBCHAT,role:s,scopes:n,signedAtMs:u,token:r??null,nonce:p}),v=await Vd(i.privateKey,m);a={id:i.deviceId,publicKey:i.publicKey,signature:v,signedAt:u,nonce:p}}const c={minProtocol:3,maxProtocol:3,client:{id:this.opts.clientName??wa.CONTROL_UI,version:this.opts.clientVersion??"dev",platform:this.opts.platform??navigator.platform??"web",mode:this.opts.mode??Pi.WEBCHAT,instanceId:this.opts.instanceId},role:s,scopes:n,device:a,caps:[],auth:l,userAgent:navigator.userAgent,locale:navigator.language};this.request("connect",c).then(u=>{u?.auth?.deviceToken&&i&&Xd({deviceId:i.deviceId,role:u.auth.role??s,token:u.auth.deviceToken,scopes:u.auth.scopes??[]}),this.backoffMs=800,this.opts.onHello?.(u)}).catch(()=>{o&&i&&Zd({deviceId:i.deviceId,role:s}),this.ws?.close(gv,"connect failed")})}handleMessage(t){let n;try{n=JSON.parse(t)}catch{return}const s=n;if(s.type==="event"){const i=n;if(i.event==="connect.challenge"){const r=i.payload,l=r&&typeof r.nonce=="string"?r.nonce:null;l&&(this.connectNonce=l,this.sendConnect());return}const o=typeof i.seq=="number"?i.seq:null;o!==null&&(this.lastSeq!==null&&o>this.lastSeq+1&&this.opts.onGap?.({expected:this.lastSeq+1,received:o}),this.lastSeq=o);try{this.opts.onEvent?.(i)}catch(r){console.error("[gateway] event handler error:",r)}return}if(s.type==="res"){const i=n,o=this.pending.get(i.id);if(!o)return;this.pending.delete(i.id),i.ok?o.resolve(i.payload):o.reject(new Error(i.error?.message??"request failed"));return}}request(t,n){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return Promise.reject(new Error("gateway not connected"));const s=Ui(),i={type:"req",id:s,method:t,params:n},o=new Promise((r,l)=>{this.pending.set(s,{resolve:a=>r(a),reject:l})});return this.ws.send(JSON.stringify(i)),o}queueConnect(){this.connectNonce=null,this.connectSent=!1,this.connectTimer!==null&&window.clearTimeout(this.connectTimer),this.connectTimer=window.setTimeout(()=>{this.sendConnect()},750)}}function Ri(e){return typeof e=="object"&&e!==null}function yv(e){if(!Ri(e))return null;const t=typeof e.id=="string"?e.id.trim():"",n=e.request;if(!t||!Ri(n))return null;const s=typeof n.command=="string"?n.command.trim():"";if(!s)return null;const i=typeof e.createdAtMs=="number"?e.createdAtMs:0,o=typeof e.expiresAtMs=="number"?e.expiresAtMs:0;return!i||!o?null:{id:t,request:{command:s,cwd:typeof n.cwd=="string"?n.cwd:null,host:typeof n.host=="string"?n.host:null,security:typeof n.security=="string"?n.security:null,ask:typeof n.ask=="string"?n.ask:null,agentId:typeof n.agentId=="string"?n.agentId:null,resolvedPath:typeof n.resolvedPath=="string"?n.resolvedPath:null,sessionKey:typeof n.sessionKey=="string"?n.sessionKey:null},createdAtMs:i,expiresAtMs:o}}function vv(e){if(!Ri(e))return null;const t=typeof e.id=="string"?e.id.trim():"";return t?{id:t,decision:typeof e.decision=="string"?e.decision:null,resolvedBy:typeof e.resolvedBy=="string"?e.resolvedBy:null,ts:typeof e.ts=="number"?e.ts:null}:null}function Pc(e){const t=Date.now();return e.filter(n=>n.expiresAtMs>t)}function bv(e,t){const n=Pc(e).filter(s=>s.id!==t.id);return n.push(t),n}function ka(e,t){return Pc(e).filter(n=>n.id!==t)}async function Rc(e,t){if(!e.client||!e.connected)return;const n=e.sessionKey.trim(),s=n?{sessionKey:n}:{};try{const i=await e.client.request("agent.identity.get",s);if(!i)return;const o=ai(i);e.assistantName=o.name,e.assistantAvatar=o.avatar,e.assistantAgentId=o.agentId??null}catch{}}const es="taskmaster_update_pending";async function Ic(e){if(!(!e.client||!e.connected)&&!e.updateChecking){e.updateChecking=!0,e.updateMessage=null,e.requestUpdate?.();try{const t=await e.client.request("update.status",{});e.currentVersion=t.current,e.latestVersion=t.latest,e.updateAvailable=t.updateAvailable,e.updateMessage=t.updateAvailable?`v${t.latest} available`:"Up to date"}catch(t){e.updateMessage=`Check failed: ${String(t)}`,e.updateAvailable=null}finally{e.updateChecking=!1,e.requestUpdate?.()}}}async function wv(e){if(!(!e.client||e.updateRunning)){e.updateRunning=!0,e.updateMessage="Starting update...",e.updateProgressSteps=[],e.updateLastResult=null,e.requestUpdate?.();try{localStorage.setItem(es,String(Date.now()))}catch{}try{const t=await e.client.request("update.run",{restartDelayMs:2e3,note:"Update from setup page"});if(t.ok&&t.result.status==="ok")e.updateMessage="Updated — restarting gateway...",e.requestUpdate?.();else if(t.ok&&t.result.status==="skipped")Yt(),e.updateMessage=t.result.reason||"Update skipped",e.updateRunning=!1,e.requestUpdate?.();else throw Yt(),new Error(t.result.reason||"Update failed")}catch(t){Yt(),e.updateMessage=`Update failed: ${String(t)}`,e.updateRunning=!1,e.updateProgressSteps=[],e.requestUpdate?.()}}}function kv(e,t){const n=t.phase;if(n==="step-start"){const s=t.name,i=t.index,o=t.total;e.updateMessage=`Updating: ${s} (${i+1}/${o})`;const r=e.updateProgressSteps.find(l=>l.index===i);r?(r.status="running",r.name=s):e.updateProgressSteps=[...e.updateProgressSteps,{name:s,index:i,total:o,status:"running"}],e.requestUpdate?.()}else if(n==="step-done"){const s=t.name,i=t.index,o=t.total,r=t.ok,l=t.durationMs,a=e.updateProgressSteps.find(c=>c.index===i);a?(a.status=r?"done":"failed",a.durationMs=l):e.updateProgressSteps=[...e.updateProgressSteps,{name:s,index:i,total:o,status:r?"done":"failed",durationMs:l}],e.updateMessage=r?`Updating: ${s} done (${i+1}/${o})`:`Update step failed: ${s}`,e.requestUpdate?.()}else if(n==="complete"){if(t.status==="ok")e.updateMessage="Update complete — restarting gateway...";else{const i=t.reason;e.updateMessage=i?`Update failed: ${i}`:"Update failed",e.updateRunning=!1,Yt()}e.requestUpdate?.()}}async function Sv(e){if(!e.client||!e.connected)return;const t=Av();Yt();try{const n=await e.client.request("update.lastResult",{});if(!n.ok||!n.result)return;const s=5*6e4,i=Date.now()-n.result.ts<s;if(!t&&!i)return;e.updateLastResult=n.result;const o=n.result.after?.version;if(n.result.status==="ok"&&o&&(e.currentVersion=o),e.updateAvailable=!1,n.result.status==="ok"){const r=n.result.before?.version,l=o??n.result.currentVersion;e.updateMessage=r?`Updated: v${r} → v${l}`:`Updated to v${l}`}else{const r=n.result.reason??n.result.failedStep?.name??"unknown error";e.updateMessage=`Update failed: ${r}`}}catch{}finally{e.updateRunning=!1,e.updateProgressSteps=[],e.requestUpdate?.()}}function xv(e){e.updateLastResult=null,e.requestUpdate?.()}function Av(){try{const e=localStorage.getItem(es);return e?Date.now()-Number(e)>30*6e4?(localStorage.removeItem(es),!1):!0:!1}catch{return!1}}function Yt(){try{localStorage.removeItem(es)}catch{}}function ii(e,t){const n=(e??"").trim(),s=t.mainSessionKey?.trim();if(!s)return n;if(!n)return s;const i=t.mainKey?.trim()||"main",o=t.defaultAgentId?.trim();return n==="main"||n===i||o&&(n===`agent:${o}:main`||n===`agent:${o}:${i}`)?s:n}function $v(e,t){if(!t?.mainSessionKey)return;const n=ii(e.sessionKey,t),s=ii(e.settings.sessionKey,t),i=ii(e.settings.lastActiveSessionKey,t),o=n||s||e.sessionKey,r={...e.settings,sessionKey:s||o,lastActiveSessionKey:i||o},l=r.sessionKey!==e.settings.sessionKey||r.lastActiveSessionKey!==e.settings.lastActiveSessionKey;o!==e.sessionKey&&(e.sessionKey=o),l&&Ie(e,r)}function Te(e){e.lastError=null,e.hello=null,e.connected=!1,e.execApprovalQueue=[],e.execApprovalError=null;const t=e.setup||e.filesPage||e.browserPage?"setup-ui":"taskmaster-control-ui";e.client?.stop(),e.client=new mv({url:e.settings.gatewayUrl,token:e.settings.token.trim()?e.settings.token:void 0,password:e.password.trim()?e.password:void 0,clientName:t,mode:"webchat",onHello:n=>{e.connected=!0,e.lastError=null,e.hello=n,Cv(e,n),e.handleAccessCheck(),Sv(e).then(()=>{Ic(e)}),Rc(e),uv(e),(e.chatPage||e.setup)&&_v(e),Xi(e,{quiet:!0}),Qi(e,{quiet:!0}),rn(e).then(()=>{e.initWorkspaceSelection()}),e.setup&&(ke(e),Mv(e)),oo(e)},onClose:({code:n,reason:s})=>{e.connected=!1,n!==1012&&(e.lastError=`disconnected (${n}): ${s||"no reason"}`)},onEvent:n=>Ev(e,n),onGap:({expected:n,received:s})=>{e.lastError=`event gap detected (expected seq ${n}, got ${s}); refresh recommended`}}),e.client.start()}function Ev(e,t){try{Tv(e,t)}catch(n){console.error("[gateway] handleGatewayEvent error:",t.event,n)}}function Tv(e,t){if(e.eventLogBuffer=[{ts:Date.now(),event:t.event,payload:t.payload},...e.eventLogBuffer].slice(0,250),e.tab==="debug"&&(e.eventLog=e.eventLogBuffer),t.event==="agent"){if(e.onboarding)return;ed(e,t.payload);return}if(t.event==="chat"){const n=t.payload;n?.sessionKey&&gl(e,n.sessionKey);const s=Wa(e,n);(s==="final"||s==="error"||s==="aborted")&&(Ki(e),Mp(e)),s==="final"&&Ce(e);return}if(t.event==="presence"){const n=t.payload;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence,e.presenceError=null,e.presenceStatus=null);return}if(t.event==="cron"&&e.tab==="cron"&&ro(e),(t.event==="device.pair.requested"||t.event==="device.pair.resolved")&&Qi(e,{quiet:!0}),t.event==="exec.approval.requested"){const n=yv(t.payload);if(n){e.execApprovalQueue=bv(e.execApprovalQueue,n),e.execApprovalError=null;const s=Math.max(0,n.expiresAtMs-Date.now()+500);window.setTimeout(()=>{e.execApprovalQueue=ka(e.execApprovalQueue,n.id)},s)}return}if(t.event==="browser.screencast.frame"){Dy(e,t.payload);return}if(t.event==="browser.handoff"){Oy(e,t.payload),e.browserPage||(window.location.href="/browser");return}if(t.event==="browser.handoff.resolved"){By(e);return}if(t.event==="exec.approval.resolved"){const n=vv(t.payload);n&&(e.execApprovalQueue=ka(e.execApprovalQueue,n.id));return}if(t.event==="update.progress"){kv(e,t.payload);return}}function Cv(e,t){const n=t.snapshot;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence),n?.health&&(e.debugHealth=n.health),n?.sessionDefaults&&$v(e,n.sessionDefaults)}async function _v(e){if(!(!e.client||!e.connected))try{const t=await e.client.request("models.list",{});Array.isArray(t?.models)&&(e.chatModelCatalog=t.models)}catch{}}async function Mv(e){if(!(!e.client||!e.connected))try{e.apiKeyProviders=await Li(e.client)}catch{}}function Lv(e){e.basePath=vp();const t=Oe();if(Dp(t.accentColor),window.scrollTo(0,0),e.setup){document.title=`${t.name} Setup`,Te(e);return}if(e.filesPage){document.title=`${t.name} Files`,Te(e);return}if(e.browserPage){document.title=`${t.name} Browser`,Te(e);return}if(e.adminsPage){document.title=`${t.name} Admins`,Te(e);return}if(e.customersPage){document.title=`${t.name} Customers`,Te(e);return}if(e.chatPage){document.title=`${t.name} Chat`,Te(e);return}if(e.advancedPage){document.title=`${t.name} Advanced`,Te(e);return}Sp(e,!0),bp(e),wp(e),window.addEventListener("popstate",e.popStateHandler),gp(e),Te(e),hp(e),e.tab==="logs"&&(e.logsSubTab==="session"?to(e):Ji(e)),e.tab==="debug"&&so(e)}function Pv(e){ad(e)}function Rv(e){window.removeEventListener("popstate",e.popStateHandler),fp(e),eo(e),no(e),io(e),kp(e),e.topbarObserver?.disconnect(),e.topbarObserver=null}function Iv(e,t){if(e.filesPage&&e.connected&&t.has("connected")&&t.get("connected")===!1&&e.handleFilesLoad&&e.handleFilesLoad(),e.adminsPage&&e.connected&&t.has("connected")&&t.get("connected")===!1&&e.handleAdminsLoad&&e.handleAdminsLoad(),e.customersPage&&e.connected&&t.has("connected")&&t.get("connected")===!1&&e.handleCustomersLoad&&e.handleCustomersLoad(),e.chatPage&&e.connected&&t.has("connected")&&t.get("connected")===!1&&e.handleChatLoad&&e.handleChatLoad(),e.advancedPage&&e.connected&&t.has("connected")&&t.get("connected")===!1&&e.handleAdvancedLoad&&e.handleAdvancedLoad(),e.setup&&e.connected){const n=t.has("connected")&&t.get("connected")===!1;n&&e.handleLicenseStatusCheck&&e.licenseValid===null&&!e.licenseBusy&&e.handleLicenseStatusCheck(),n&&e.handleUpdateCheck&&e.handleUpdateCheck();const s=t.has("setupStep")&&e.setupStep==="auth";(n||s)&&e.setupStep==="auth"&&(e.authConnected===!0?e.setupStep="whatsapp":e.handleAuthStatusCheck&&e.authConnected===null&&!e.authBusy&&e.handleAuthStatusCheck()),e.setupStep==="whatsapp"&&t.has("setupStep")&&e.client&&!e.channelsLoading&&(e.channelsLoading=!0,e.client.request("channels.status",{probe:!0,timeoutMs:8e3}).then(o=>{e.channelsSnapshot=o,e.channelsLoading=!1}).catch(()=>{e.channelsLoading=!1})),t.has("whatsappLoginConnected")&&e.whatsappLoginConnected===!0&&e.client&&!e.channelsLoading&&(e.channelsLoading=!0,e.client.request("channels.status",{probe:!0,timeoutMs:8e3}).then(i=>{e.channelsSnapshot=i,e.channelsLoading=!1}).catch(()=>{e.channelsLoading=!1}))}if(e.tab==="chat"&&!e.advancedPage&&(t.has("chatMessages")||t.has("chatToolMessages")||t.has("chatStream")||t.has("chatLoading")||t.has("tab"))){const n=t.has("tab"),s=t.has("chatLoading")&&t.get("chatLoading")===!0&&e.chatLoading===!1;en(e,n||s||!e.chatHasAutoScrolled)}e.tab==="logs"&&!e.advancedPage&&(t.has("logsEntries")||t.has("logsAutoFollow")||t.has("tab"))&&e.logsAutoFollow&&e.logsAtBottom&&Ka(e,t.has("tab")||t.has("logsAutoFollow"))}function Nv(e){const t={name:e?.name??"",displayName:e?.displayName??"",about:e?.about??"",picture:e?.picture??"",banner:e?.banner??"",website:e?.website??"",nip05:e?.nip05??"",lud16:e?.lud16??""};return{values:t,original:{...t},saving:!1,importing:!1,error:null,success:null,fieldErrors:{},showAdvanced:!!(e?.banner||e?.website||e?.nip05||e?.lud16)}}async function Dv(e,t,n){await zi(e,t,n),await z(e,!0)}async function Ov(e,t){await Ha(e,t),await z(e,!0)}async function Bv(e,t){await qa(e,t),await z(e,!0)}async function Fv(e,t){await Ga(e,t)}async function Uv(e,t){await Va(e,t)}async function Wv(e){await ud(e),await ke(e),await z(e,!0)}async function Kv(e){await ke(e),await z(e,!0)}function zv(e){if(!Array.isArray(e))return{};const t={};for(const n of e){if(typeof n!="string")continue;const[s,...i]=n.split(":");if(!s||i.length===0)continue;const o=s.trim(),r=i.join(":").trim();o&&r&&(t[o]=r)}return t}function Nc(e){return(e.channelsSnapshot?.channelAccounts?.nostr??[])[0]?.accountId??e.nostrProfileAccountId??"default"}function Dc(e,t=""){return`/api/channels/nostr/${encodeURIComponent(e)}/profile${t}`}function jv(e,t,n){e.nostrProfileAccountId=t,e.nostrProfileFormState=Nv(n??void 0)}function Hv(e){e.nostrProfileFormState=null,e.nostrProfileAccountId=null}function qv(e,t,n){const s=e.nostrProfileFormState;s&&(e.nostrProfileFormState={...s,values:{...s.values,[t]:n},fieldErrors:{...s.fieldErrors,[t]:""}})}function Gv(e){const t=e.nostrProfileFormState;t&&(e.nostrProfileFormState={...t,showAdvanced:!t.showAdvanced})}async function Vv(e){const t=e.nostrProfileFormState;if(!t||t.saving)return;const n=Nc(e);e.nostrProfileFormState={...t,saving:!0,error:null,success:null,fieldErrors:{}};try{const s=await fetch(Dc(n),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t.values)}),i=await s.json().catch(()=>null);if(!s.ok||i?.ok===!1||!i){const o=i?.error??`Profile update failed (${s.status})`;e.nostrProfileFormState={...t,saving:!1,error:o,success:null,fieldErrors:zv(i?.details)};return}if(!i.persisted){e.nostrProfileFormState={...t,saving:!1,error:"Profile publish failed on all relays.",success:null};return}e.nostrProfileFormState={...t,saving:!1,error:null,success:"Profile published to relays.",fieldErrors:{},original:{...t.values}},await z(e,!0)}catch(s){e.nostrProfileFormState={...t,saving:!1,error:`Profile update failed: ${String(s)}`,success:null}}}async function Yv(e){const t=e.nostrProfileFormState;if(!t||t.importing)return;const n=Nc(e);e.nostrProfileFormState={...t,importing:!0,error:null,success:null};try{const s=await fetch(Dc(n,"/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoMerge:!0})}),i=await s.json().catch(()=>null);if(!s.ok||i?.ok===!1||!i){const a=i?.error??`Profile import failed (${s.status})`;e.nostrProfileFormState={...t,importing:!1,error:a,success:null};return}const o=i.merged??i.imported??null,r=o?{...t.values,...o}:t.values,l=!!(r.banner||r.website||r.nip05||r.lud16);e.nostrProfileFormState={...t,importing:!1,values:r,error:null,success:i.saved?"Profile imported from relays. Review and publish.":"Profile imported. Review and publish.",showAdvanced:l},i.saved&&await z(e,!0)}catch(s){e.nostrProfileFormState={...t,importing:!1,error:`Profile import failed: ${String(s)}`,success:null}}}async function Qv(e){if(e.client){e.authBusy=!0,e.authMessage=null;try{const t=await e.client.request("auth.status",{});e.authConnected=t.connected,e.authExpiresIn=t.expiresIn??null,e.authMessage=t.message??null,t.connected&&(e.setupStep="whatsapp")}catch(t){e.authConnected=!1,e.authMessage=t instanceof Error?t.message:"Failed to check auth status"}finally{e.authBusy=!1}}}async function Xv(e){if(e.client){e.authBusy=!0,e.authMessage=null,e.authUrl=null,e.authConnected=null;try{const t=await e.client.request("auth.oauth.start",{provider:"anthropic"});e.authUrl=t.authUrl,e.authMessage=t.message??"Sign in with your Claude Pro account"}catch(t){e.authConnected=!1,e.authMessage=t instanceof Error?t.message:"Failed to start auth flow"}finally{e.authBusy=!1}}}async function Zv(e,t){if(e.client){e.authBusy=!0,e.authMessage="Verifying code...";try{await e.client.request("auth.oauth.code",{code:t});const n=await e.client.request("auth.oauth.wait",{timeoutMs:3e4});n.connected?(e.authConnected=!0,e.authMessage=n.message??"Connected to Claude!",e.authUrl=null,e.authCodeInput="",setTimeout(()=>{e.setupStep="whatsapp"},1500)):e.authMessage=n.message??"Still waiting for authorization..."}catch(n){e.authConnected=!1,e.authMessage=n instanceof Error?n.message:"Verification failed"}finally{e.authBusy=!1}}}function Jv(e,t){e.authCodeInput=t}function eb(e){e.setupStep="whatsapp"}async function tb(e){if(e.client){e.licenseBusy=!0,e.licenseMessage=null;try{const t=await e.client.request("license.status",{});e.licenseDeviceId=t.deviceId??null,e.licenseStoredKey=t.key??null,t.licensed?(e.licenseValid=!0,e.licenseTier=t.tier??null,e.setupStep="auth"):(e.licenseValid=null,e.setupStep="license")}catch(t){const n=t instanceof Error?t.message:String(t);n.includes("unknown method")?(e.licenseValid=!0,e.setupStep="auth"):(e.licenseValid=null,e.licenseMessage=n,e.setupStep="license")}finally{e.licenseBusy=!1}}}async function nb(e){if(e.client&&e.licenseKey.trim()){e.licenseBusy=!0,e.licenseMessage=null,e.licenseValid=null;try{const t=await e.client.request("license.activate",{key:e.licenseKey.trim()});t.valid?(e.licenseValid=!0,e.licenseMessage=t.message??"License activated",e.licenseTier=t.tier??null,setTimeout(()=>{e.setupStep="auth"},1500)):(e.licenseValid=!1,e.licenseMessage=t.message??"Invalid license key")}catch(t){e.licenseValid=!1,e.licenseMessage=t instanceof Error?t.message:"Activation failed"}finally{e.licenseBusy=!1}}}async function sb(e){if(e.client){e.licenseBusy=!0;try{await e.client.request("license.remove",{}),e.licenseValid=null,e.licenseKey="",e.licenseTier=null,e.licenseMessage=null,e.setupStep="license"}catch(t){e.licenseMessage=t instanceof Error?t.message:"Failed to remove license"}finally{e.licenseBusy=!1}}}function ib(e,t){e.licenseKey=t}async function ob(e){if(!(!e.client||!e.connected)&&!e.gatewayHealthLoading){e.gatewayHealthLoading=!0,e.requestUpdate?.();try{const t=await e.client.request("health",{probe:!0});e.gatewayHealthy=t.ok===!0,e.gatewayHealthMessage=t.ok?`Healthy${t.durationMs?` (${t.durationMs}ms)`:""}`:"Unhealthy"}catch(t){e.gatewayHealthy=!1,e.gatewayHealthMessage=`Error: ${String(t)}`}finally{e.gatewayHealthLoading=!1,e.requestUpdate?.()}}}async function rb(e){if(!(!e.client||e.gatewayRestartBusy)){e.gatewayRestartBusy=!0,e.gatewayHealthMessage="Restarting...",e.requestUpdate?.();try{const t=await e.client.request("gateway.restart",{reason:"Manual restart from setup page",delayMs:1e3});if(t.ok&&t.restart?.ok)e.gatewayHealthMessage="Restarting...",setTimeout(()=>{window.location.reload()},3e3);else throw new Error("Restart not scheduled")}catch(t){e.gatewayHealthMessage=`Restart failed: ${String(t)}`,e.gatewayRestartBusy=!1,e.requestUpdate?.()}}}var ab=Object.defineProperty,lb=Object.getOwnPropertyDescriptor,f=(e,t,n,s)=>{for(var i=s>1?void 0:s?lb(t,n):t,o=e.length-1,r;o>=0;o--)(r=e[o])&&(i=(s?r(t,n,i):r(i))||i);return s&&i&&ab(t,n,i),i};const oi=Su();function cb(){if(!window.location.search)return!1;const t=new URLSearchParams(window.location.search).get("onboarding");if(!t)return!1;const n=t.trim().toLowerCase();return n==="1"||n==="true"||n==="yes"||n==="on"}function ub(){const e=window.location.pathname;if(e==="/setup"||e.endsWith("/setup"))return!0;if(!window.location.search)return!1;const n=new URLSearchParams(window.location.search).get("setup");if(!n)return!1;const s=n.trim().toLowerCase();return s==="1"||s==="true"||s==="yes"||s==="on"}function db(){const e=window.location.pathname;return e==="/files"||e.endsWith("/files")}function pb(){const e=window.location.pathname;return e==="/browser"||e.endsWith("/browser")}function hb(){const e=window.location.pathname;return e==="/admins"||e.endsWith("/admins")}function fb(){const e=window.location.pathname;return e==="/customers"||e.endsWith("/customers")}function gb(){const e=window.location.pathname;return e==="/chat"||e.endsWith("/chat")}function mb(){const e=window.location.pathname;return e==="/advanced"||e.endsWith("/advanced")}let h=class extends mt{constructor(){super(...arguments),this.settings=Ms(),this.password="",this.tab="chat",this.onboarding=cb(),this.setup=ub(),this.filesPage=db(),this.browserPage=pb(),this.adminsPage=hb(),this.customersPage=fb(),this.chatPage=gb(),this.advancedPage=mb(),this.advancedTab="cron",this.connected=!1,this.accessState=yc,this.theme=this.settings.theme??"system",this.themeResolved="dark",this.hello=null,this.lastError=null,this.eventLog=[],this.eventLogBuffer=[],this.toolStreamSyncTimer=null,this.sidebarCloseTimer=null,this.assistantName=oi.name,this.assistantAvatar=oi.avatar,this.assistantAgentId=oi.agentId??null,this.sessionKey=this.settings.sessionKey,this.chatLoading=!1,this.chatSending=!1,this.chatMessage="",this.chatMessages=[],this.chatToolMessages=[],this.chatStream=null,this.chatStreamStartedAt=null,this.chatRunId=null,this.compactionStatus=null,this.chatAvatarUrl=null,this.chatThinkingLevel=null,this.chatModelProvider=null,this.chatModel=null,this.chatModelCatalog=[],this.chatVerboseLevel=null,this.chatFillerEnabled=null,this.chatQueue=[],this.chatAttachments=[],this.sidebarOpen=!1,this.sidebarContent=null,this.sidebarError=null,this.splitRatio=this.settings.splitRatio,this.nodesLoading=!1,this.nodes=[],this.devicesLoading=!1,this.devicesError=null,this.devicesList=null,this.execApprovalsLoading=!1,this.execApprovalsSaving=!1,this.execApprovalsDirty=!1,this.execApprovalsSnapshot=null,this.execApprovalsForm=null,this.execApprovalsSelectedAgent=null,this.execApprovalsTarget="gateway",this.execApprovalsTargetNodeId=null,this.execApprovalQueue=[],this.execApprovalBusy=!1,this.execApprovalError=null,this.configLoading=!1,this.configRaw=`{
2854
- }
2855
- `,this.configRawOriginal="",this.configValid=null,this.configIssues=[],this.configSaving=!1,this.configApplying=!1,this.updateRunning=!1,this.applySessionKey=this.settings.lastActiveSessionKey,this.configSnapshot=null,this.configSchema=null,this.configSchemaVersion=null,this.configSchemaLoading=!1,this.configUiHints={},this.configForm=null,this.configFormOriginal=null,this.configFormDirty=!1,this.configFormMode="form",this.configSearchQuery="",this.configActiveSection=null,this.configActiveSubsection=null,this.channelsLoading=!1,this.channelsSnapshot=null,this.channelsError=null,this.channelsLastSuccess=null,this.whatsappLoginMessage=null,this.whatsappLoginQrDataUrl=null,this.whatsappLoginConnected=null,this.whatsappBusy=!1,this.whatsappActiveQrAccountId=null,this.whatsappPairedPhone=null,this.addingWhatsAppAccount=!1,this.newWhatsAppAccountName="",this.whatsappAccountError=null,this.whatsappAccountSaving=!1,this.whatsappSettingsOpen=!1,this.licenseKey="",this.licenseBusy=!1,this.licenseValid=null,this.licenseMessage=null,this.licenseTier=null,this.licenseDeviceId=null,this.licenseStoredKey=null,this.licenseRemoveConfirm=!1,this.authConnected=null,this.authBusy=!1,this.authMessage=null,this.authUrl=null,this.authCodeInput="",this.authExpiresIn=null,this.setupStep="license",this.gatewayHealthy=null,this.gatewayHealthLoading=!1,this.gatewayHealthMessage=null,this.gatewayRestartBusy=!1,this.updateAvailable=null,this.currentVersion=null,this.latestVersion=null,this.updateChecking=!1,this.updateMessage=null,this.updateProgressSteps=[],this.updateLastResult=null,this.uninstallConfirm=!1,this.uninstallBusy=!1,this.uninstallDone=!1,this.uninstallError=null,this.uninstallConfirmText="",this.nostrProfileFormState=null,this.nostrProfileAccountId=null,this.presenceLoading=!1,this.presenceEntries=[],this.presenceError=null,this.presenceStatus=null,this.agentsLoading=!1,this.agentsList=null,this.agentsError=null,this.sessionsLoading=!1,this.sessionsResult=null,this.sessionsError=null,this.cronLoading=!1,this.cronJobs=[],this.cronStatus=null,this.cronError=null,this.cronForm={...cv},this.cronRunsJobId=null,this.cronRuns=[],this.cronBusy=!1,this.cronNewEventModal=!1,this.cronDetailJobId=null,this.browserScreencastActive=!1,this.browserScreencastFrame=null,this.browserScreencastMetadata=null,this.browserHandoffPending=!1,this.browserHandoffReason=null,this.browserHandoffId=null,this.browserInputMode=!1,this.browserLoading=!1,this.browserError=null,this.filesLoading=!1,this.filesTree=[],this.filesRoot="",this.filesError=null,this.filesSelectedPath=null,this.filesSelectedPaths=new Set,this.filesPreviewContent=null,this.filesPreviewLoading=!1,this.filesPreviewBinary=!1,this.filesPreviewSize=null,this.filesExpandedDirs=new Set,this.filesMessage=null,this.filesUploadBusy=!1,this.filesReindexBusy=!1,this.filesMemoryStatus=null,this.skillsLoading=!1,this.skillsReport=null,this.skillsError=null,this.skillsFilter="",this.skillEdits={},this.skillsBusyKey=null,this.skillMessages={},this.adminsLoading=!1,this.adminPhones=[],this.adminsError=null,this.adminsSaving=!1,this.adminsNewPhone="",this.customersLoading=!1,this.customersSaving=!1,this.customersRecords=[],this.customersError=null,this.customersSearchQuery="",this.customersEditingId=null,this.customersShowAddForm=!1,this.customersNewPhone="",this.customersNewName="",this.imessageEnableConfirm=!1,this.imessageEnabling=!1,this.infoModalOpen=null,this.workspaces=[],this.workspacesLoading=!1,this.workspacesError=null,this.selectedWorkspace=null,this.addingWorkspace=!1,this.newWorkspaceName="",this.newWorkspacePath="",this.newWorkspacePin="",this.accountPinModalOpen=!1,this.accountPinBusy=!1,this.accountPinError=null,this.accountPinSuccess=null,this.apiKeyProviders=[],this.apiKeyModalOpen=!1,this.apiKeyBusy=!1,this.apiKeyError=null,this.apiKeySuccess=null,this.authApiKeyMode=!1,this.authApiKeyInput="",this.authApiKeyBusy=!1,this.authApiKeyError=null,this.pinChanging=null,this.pinChangeBusy=!1,this.pinChangeError=null,this.loginChangePinMode=!1,this.changePinBusy=!1,this.changePinError=null,this.changePinSuccess=null,this.workspaceSaving=!1,this.workspaceRemoveConfirm=null,this.renamingWorkspace=!1,this.renameWorkspaceName="",this.debugLoading=!1,this.debugStatus=null,this.debugHealth=null,this.debugModels=[],this.debugHeartbeat=null,this.debugCallMethod="",this.debugCallParams="{}",this.debugCallResult=null,this.debugCallError=null,this.logsLoading=!1,this.logsError=null,this.logsFile=null,this.logsEntries=[],this.logsFilterText="",this.logsLevelFilters={...lv},this.logsAutoFollow=!0,this.logsTruncated=!1,this.logsCursor=null,this.logsLastFetchAt=null,this.logsLimit=500,this.logsMaxBytes=25e4,this.logsAtBottom=!0,this.logsSubTab="session",this.sessionLogsLoading=!1,this.sessionLogsError=null,this.sessionLogsEntries=[],this.sessionLogsFilterText="",this.sessionLogsTypeFilters={user:!0,assistant:!0,tool:!0,thinking:!0,error:!0,system:!0},this.sessionLogsAgentFilters={},this.sessionLogsAgents=[],this.sessionLogsAutoFollow=!0,this.sessionLogsFull=!1,this.sessionLogsCursors={},this.sessionLogsLastFetchAt=null,this.sessionLogsAtBottom=!0,this.client=null,this.chatScrollFrame=null,this.chatScrollTimeout=null,this.chatHasAutoScrolled=!1,this.chatUserNearBottom=!0,this.nodesPollInterval=null,this.logsPollInterval=null,this.sessionLogsPollInterval=null,this.debugPollInterval=null,this.logsScrollFrame=null,this.toolStreamById=new Map,this.toolStreamOrder=[],this.basePath="",this.popStateHandler=()=>xp(this),this.themeMedia=null,this.themeMediaHandler=null,this.topbarObserver=null}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),Lv(this)}firstUpdated(){Pv(this)}disconnectedCallback(){Rv(this),super.disconnectedCallback()}updated(e){Iv(this,e)}connect(){Te(this)}handleChatScroll(e){td(this,e)}handleLogsScroll(e){nd(this,e)}handleSessionLogsScroll(e){sd(this,e)}exportLogs(e,t){od(e,t)}exportSessionLogs(e,t){rd(e,t)}resetToolStream(){Ki(this)}resetChatScroll(){id(this)}async loadAssistantIdentity(){await Rc(this)}applySettings(e){Ie(this,e)}setTab(e){mp(this,e)}setTheme(e,t){yp(this,e,t)}async loadOverview(){await vl(this)}async loadCron(){const e=this.getSelectedWorkspaceInfo();this.workspaceAgentIds=e?.agents?.map(t=>t.id)??void 0,this.cronForm={...this.cronForm,accountId:e?.whatsappAccountId??void 0},await ro(this)}async handleAbortChat(){await wl(this)}removeQueuedMessage(e){Tp(this,e)}async handleSendChat(e,t){await Cp(this,e,t)}async handleWhatsAppStart(e,t){await Dv(this,e,t)}async handleWhatsAppWait(e){await Ov(this,e)}async handleWhatsAppLogout(e){await Bv(this,e)}async handleAddWhatsAppAccount(e){await Fv(this,e)}async handleRemoveWhatsAppAccount(e){await Uv(this,e)}async handleAccessCheck(){await va(this)}async handlePinSubmit(e,t){await Ey(this,e,t),this.accessState.authenticated&&this.accessState.workspace&&this.handleWorkspaceSelect(this.accessState.workspace)}async handleSetMasterPin(e){await Ty(this,e)}async handleLogout(){await _y(this)}toggleChangePinMode(){this.loginChangePinMode=!this.loginChangePinMode,this.changePinError=null,this.changePinSuccess=null}async handleChangePin(e,t,n){if(this.client){this.changePinBusy=!0,this.changePinError=null,this.changePinSuccess=null;try{const s=await this.client.request("access.verify",{account:e,pin:t});if(!s.ok){this.changePinError=s.message??"Incorrect current PIN",this.changePinBusy=!1;return}e==="__master__"?await this.client.request("access.setMasterPin",{pin:n}):await this.client.request("access.setAccountPin",{workspace:e,pin:n}),this.changePinSuccess="PIN changed successfully",this.changePinBusy=!1,setTimeout(()=>{this.loginChangePinMode=!1,this.changePinSuccess=null},2e3)}catch{this.changePinError="Failed to change PIN",this.changePinBusy=!1}}}async handleAccountPinSave(e,t,n){if(this.client){this.accountPinBusy=!0,this.accountPinError=null,this.accountPinSuccess=null;try{if(t!==null){const s=await this.client.request("access.verify",{account:e,pin:t});if(!s.ok){this.accountPinError=s.message??"Incorrect current PIN",this.accountPinBusy=!1;return}}await this.client.request("access.setAccountPin",{workspace:e,pin:n}),this.accountPinSuccess="PIN saved",this.accountPinBusy=!1,await va(this),setTimeout(()=>{this.accountPinModalOpen=!1,this.accountPinSuccess=null,this.accountPinError=null},1500)}catch{this.accountPinError="Failed to save PIN",this.accountPinBusy=!1}}}async handleLicenseStatusCheck(){await tb(this)}async handleLicenseActivate(){await nb(this)}async handleLicenseRemove(){await sb(this)}handleLicenseKeyChange(e){ib(this,e)}async handleAuthStatusCheck(){await Qv(this)}async handleAuthStart(){await Xv(this)}async handleAuthSubmitCode(e){await Zv(this,e)}handleAuthCodeChange(e){Jv(this,e)}handleSkipToWhatsApp(){eb(this)}async handleGatewayHealthCheck(){await ob(this)}async handleGatewayRestart(){await rb(this)}async handleUpdateCheck(){await Ic(this)}async handleUpdateRun(){await wv(this)}handleUpdateDismissResult(){xv(this)}handleUninstallConfirm(){this.uninstallConfirm=!0,this.uninstallConfirmText=""}handleUninstallCancel(){this.uninstallConfirm=!1,this.uninstallConfirmText="",this.uninstallError=null}handleUninstallConfirmTextChange(e){this.uninstallConfirmText=e}async handleUninstallRun(){const{runUninstall:e}=await de(async()=>{const{runUninstall:t}=await Promise.resolve().then(()=>yr);return{runUninstall:t}},void 0,import.meta.url);await e(this)}handleUninstallDismiss(){de(async()=>{const{clearUninstallDone:e}=await Promise.resolve().then(()=>yr);return{clearUninstallDone:e}},void 0,import.meta.url).then(({clearUninstallDone:e})=>{e()}),this.uninstallDone=!1,this.uninstallConfirm=!1,this.uninstallConfirmText=""}handleFilesLoad(){const e=this.resolveFilesAgentId();on(this,e),xc(this,e)}handleAdminsLoad(){const e=this.resolveAdminAgentId();de(async()=>{const{loadAdmins:t}=await Promise.resolve().then(()=>Vy);return{loadAdmins:t}},void 0,import.meta.url).then(({loadAdmins:t})=>{t(this,e)})}resolveAdminAgentId(){const e=this.getSelectedWorkspaceInfo();return e?e.agents.find(n=>n.id.endsWith("-admin")||n.id==="admin")?.id:void 0}resolveFilesAgentId(){const e=this.getSelectedWorkspaceInfo();if(e)return e.agents[0]?.id}handleChatLoad(){const e=this.resolveAdminAgentId();if(e){const t=`agent:${e}:main`;t!==this.sessionKey&&(this.sessionKey=t,this.chatMessages=[],this.chatStream=null,this.chatRunId=null,this.applySettings({...this.settings,sessionKey:t,lastActiveSessionKey:t}),this.loadAssistantIdentity())}de(async()=>{const{loadChatHistory:t}=await Promise.resolve().then(()=>ju);return{loadChatHistory:t}},void 0,import.meta.url).then(({loadChatHistory:t})=>{t(this)})}handleAdvancedLoad(){this.loadCron()}async handleChannelConfigSave(){await Wv(this)}async handleChannelConfigReload(){await Kv(this)}handleNostrProfileEdit(e,t){jv(this,e,t)}handleNostrProfileCancel(){Hv(this)}handleNostrProfileFieldChange(e,t){qv(this,e,t)}async handleNostrProfileSave(){await Vv(this)}async handleNostrProfileImport(){await Yv(this)}handleNostrProfileToggleAdvanced(){Gv(this)}async handleExecApprovalDecision(e){const t=this.execApprovalQueue[0];if(!(!t||!this.client||this.execApprovalBusy)){this.execApprovalBusy=!0,this.execApprovalError=null;try{await this.client.request("exec.approval.resolve",{id:t.id,decision:e}),this.execApprovalQueue=this.execApprovalQueue.filter(n=>n.id!==t.id)}catch(n){this.execApprovalError=`Exec approval failed: ${String(n)}`}finally{this.execApprovalBusy=!1}}}handleOpenSidebar(e){this.sidebarCloseTimer!=null&&(window.clearTimeout(this.sidebarCloseTimer),this.sidebarCloseTimer=null),this.sidebarContent=e,this.sidebarError=null,this.sidebarOpen=!0}handleCloseSidebar(){this.sidebarOpen=!1,this.sidebarCloseTimer!=null&&window.clearTimeout(this.sidebarCloseTimer),this.sidebarCloseTimer=window.setTimeout(()=>{this.sidebarOpen||(this.sidebarContent=null,this.sidebarError=null,this.sidebarCloseTimer=null)},200)}handleSplitRatioChange(e){const t=Math.max(.4,Math.min(.7,e));this.splitRatio=t,this.applySettings({...this.settings,splitRatio:t})}handleAdminsNewPhoneChange(e){this.adminsNewPhone=e,this.adminsError&&(this.adminsError=null)}handleCustomersLoad(){const e=this.selectedWorkspace??void 0;de(async()=>{const{loadCustomers:t}=await Promise.resolve().then(()=>Yy);return{loadCustomers:t}},void 0,import.meta.url).then(({loadCustomers:t})=>{t(this,e)})}handleCustomersNewPhoneChange(e){this.customersNewPhone=e,this.customersError&&(this.customersError=null)}handleCustomersNewNameChange(e){this.customersNewName=e,this.customersError&&(this.customersError=null)}async handleWorkspacesLoad(){const{loadWorkspaces:e}=await de(async()=>{const{loadWorkspaces:t}=await Promise.resolve().then(()=>Pn);return{loadWorkspaces:t}},void 0,import.meta.url);await e(this)}async handleWorkspaceCreate(e,t){const{createWorkspace:n}=await de(async()=>{const{createWorkspace:i}=await Promise.resolve().then(()=>Pn);return{createWorkspace:i}},void 0,import.meta.url),{loadChannels:s}=await de(async()=>{const{loadChannels:i}=await Promise.resolve().then(()=>yd);return{loadChannels:i}},void 0,import.meta.url);await n(this,{name:e,workspacePath:t,onCreated:i=>{if(!i.whatsappAccountId)return;const o=i.whatsappAccountId;this.handleWorkspaceSelect(e),setTimeout(async()=>{try{await s(this,!0),await this.handleWhatsAppStart(!0,o),this.whatsappLoginQrDataUrl&&(await this.handleWhatsAppWait(o),await s(this,!0),await this.handleWorkspacesLoad())}catch{}this.requestUpdate()},3e3)}})}async handleWorkspaceRemove(e){const{removeWorkspace:t}=await de(async()=>{const{removeWorkspace:n}=await Promise.resolve().then(()=>Pn);return{removeWorkspace:n}},void 0,import.meta.url);await t(this,e)}handleWorkspaceRenameStart(){const e=this.getSelectedWorkspaceInfo();this.renameWorkspaceName=e?.displayName??e?.name??"",this.renamingWorkspace=!0}handleWorkspaceRenameCancel(){this.renamingWorkspace=!1,this.renameWorkspaceName=""}async handleWorkspaceRename(e,t){const{renameWorkspace:n}=await de(async()=>{const{renameWorkspace:s}=await Promise.resolve().then(()=>Pn);return{renameWorkspace:s}},void 0,import.meta.url);await n(this,e,t),this.renamingWorkspace=!1,this.renameWorkspaceName=""}handleWorkspaceSelect(e){this.selectedWorkspace=e,localStorage.setItem("taskmaster-selected-workspace",e),ir(e),this.settings=Ms(),this.chatMessage="",this.chatAttachments=[],this.chatStream=null,this.chatStreamStartedAt=null,this.chatRunId=null,this.chatQueue=[],this.lastError=null,this.reloadCurrentPageData()}getSelectedWorkspaceInfo(){return this.selectedWorkspace?this.workspaces.find(e=>e.name===this.selectedWorkspace)??null:null}reloadCurrentPageData(){this.adminsPage?this.handleAdminsLoad():this.customersPage?this.handleCustomersLoad():this.filesPage?this.handleFilesLoad():this.chatPage?this.handleChatLoad():this.advancedPage&&this.handleAdvancedLoad()}initWorkspaceSelection(){if(this.workspaces.length===0)return;const e=localStorage.getItem("taskmaster-selected-workspace"),t=e?this.workspaces.find(n=>n.name===e):null;if(t)this.selectedWorkspace=t.name;else{const n=this.workspaces.find(s=>s.isDefault)??this.workspaces[0];this.selectedWorkspace=n.name,localStorage.setItem("taskmaster-selected-workspace",n.name)}ir(this.selectedWorkspace),this.settings=Ms(),this.reloadCurrentPageData()}render(){return av(this)}};f([g()],h.prototype,"settings",2);f([g()],h.prototype,"password",2);f([g()],h.prototype,"tab",2);f([g()],h.prototype,"onboarding",2);f([g()],h.prototype,"setup",2);f([g()],h.prototype,"filesPage",2);f([g()],h.prototype,"browserPage",2);f([g()],h.prototype,"adminsPage",2);f([g()],h.prototype,"customersPage",2);f([g()],h.prototype,"chatPage",2);f([g()],h.prototype,"advancedPage",2);f([g()],h.prototype,"advancedTab",2);f([g()],h.prototype,"connected",2);f([g()],h.prototype,"accessState",2);f([g()],h.prototype,"theme",2);f([g()],h.prototype,"themeResolved",2);f([g()],h.prototype,"hello",2);f([g()],h.prototype,"lastError",2);f([g()],h.prototype,"eventLog",2);f([g()],h.prototype,"assistantName",2);f([g()],h.prototype,"assistantAvatar",2);f([g()],h.prototype,"assistantAgentId",2);f([g()],h.prototype,"sessionKey",2);f([g()],h.prototype,"chatLoading",2);f([g()],h.prototype,"chatSending",2);f([g()],h.prototype,"chatMessage",2);f([g()],h.prototype,"chatMessages",2);f([g()],h.prototype,"chatToolMessages",2);f([g()],h.prototype,"chatStream",2);f([g()],h.prototype,"chatStreamStartedAt",2);f([g()],h.prototype,"chatRunId",2);f([g()],h.prototype,"compactionStatus",2);f([g()],h.prototype,"chatAvatarUrl",2);f([g()],h.prototype,"chatThinkingLevel",2);f([g()],h.prototype,"chatModelProvider",2);f([g()],h.prototype,"chatModel",2);f([g()],h.prototype,"chatModelCatalog",2);f([g()],h.prototype,"chatVerboseLevel",2);f([g()],h.prototype,"chatFillerEnabled",2);f([g()],h.prototype,"chatQueue",2);f([g()],h.prototype,"chatAttachments",2);f([g()],h.prototype,"sidebarOpen",2);f([g()],h.prototype,"sidebarContent",2);f([g()],h.prototype,"sidebarError",2);f([g()],h.prototype,"splitRatio",2);f([g()],h.prototype,"nodesLoading",2);f([g()],h.prototype,"nodes",2);f([g()],h.prototype,"devicesLoading",2);f([g()],h.prototype,"devicesError",2);f([g()],h.prototype,"devicesList",2);f([g()],h.prototype,"execApprovalsLoading",2);f([g()],h.prototype,"execApprovalsSaving",2);f([g()],h.prototype,"execApprovalsDirty",2);f([g()],h.prototype,"execApprovalsSnapshot",2);f([g()],h.prototype,"execApprovalsForm",2);f([g()],h.prototype,"execApprovalsSelectedAgent",2);f([g()],h.prototype,"execApprovalsTarget",2);f([g()],h.prototype,"execApprovalsTargetNodeId",2);f([g()],h.prototype,"execApprovalQueue",2);f([g()],h.prototype,"execApprovalBusy",2);f([g()],h.prototype,"execApprovalError",2);f([g()],h.prototype,"configLoading",2);f([g()],h.prototype,"configRaw",2);f([g()],h.prototype,"configRawOriginal",2);f([g()],h.prototype,"configValid",2);f([g()],h.prototype,"configIssues",2);f([g()],h.prototype,"configSaving",2);f([g()],h.prototype,"configApplying",2);f([g()],h.prototype,"updateRunning",2);f([g()],h.prototype,"applySessionKey",2);f([g()],h.prototype,"configSnapshot",2);f([g()],h.prototype,"configSchema",2);f([g()],h.prototype,"configSchemaVersion",2);f([g()],h.prototype,"configSchemaLoading",2);f([g()],h.prototype,"configUiHints",2);f([g()],h.prototype,"configForm",2);f([g()],h.prototype,"configFormOriginal",2);f([g()],h.prototype,"configFormDirty",2);f([g()],h.prototype,"configFormMode",2);f([g()],h.prototype,"configSearchQuery",2);f([g()],h.prototype,"configActiveSection",2);f([g()],h.prototype,"configActiveSubsection",2);f([g()],h.prototype,"channelsLoading",2);f([g()],h.prototype,"channelsSnapshot",2);f([g()],h.prototype,"channelsError",2);f([g()],h.prototype,"channelsLastSuccess",2);f([g()],h.prototype,"whatsappLoginMessage",2);f([g()],h.prototype,"whatsappLoginQrDataUrl",2);f([g()],h.prototype,"whatsappLoginConnected",2);f([g()],h.prototype,"whatsappBusy",2);f([g()],h.prototype,"whatsappActiveQrAccountId",2);f([g()],h.prototype,"whatsappPairedPhone",2);f([g()],h.prototype,"addingWhatsAppAccount",2);f([g()],h.prototype,"newWhatsAppAccountName",2);f([g()],h.prototype,"whatsappAccountError",2);f([g()],h.prototype,"whatsappAccountSaving",2);f([g()],h.prototype,"whatsappSettingsOpen",2);f([g()],h.prototype,"licenseKey",2);f([g()],h.prototype,"licenseBusy",2);f([g()],h.prototype,"licenseValid",2);f([g()],h.prototype,"licenseMessage",2);f([g()],h.prototype,"licenseTier",2);f([g()],h.prototype,"licenseDeviceId",2);f([g()],h.prototype,"licenseStoredKey",2);f([g()],h.prototype,"licenseRemoveConfirm",2);f([g()],h.prototype,"authConnected",2);f([g()],h.prototype,"authBusy",2);f([g()],h.prototype,"authMessage",2);f([g()],h.prototype,"authUrl",2);f([g()],h.prototype,"authCodeInput",2);f([g()],h.prototype,"authExpiresIn",2);f([g()],h.prototype,"setupStep",2);f([g()],h.prototype,"gatewayHealthy",2);f([g()],h.prototype,"gatewayHealthLoading",2);f([g()],h.prototype,"gatewayHealthMessage",2);f([g()],h.prototype,"gatewayRestartBusy",2);f([g()],h.prototype,"updateAvailable",2);f([g()],h.prototype,"currentVersion",2);f([g()],h.prototype,"latestVersion",2);f([g()],h.prototype,"updateChecking",2);f([g()],h.prototype,"updateMessage",2);f([g()],h.prototype,"updateProgressSteps",2);f([g()],h.prototype,"updateLastResult",2);f([g()],h.prototype,"uninstallConfirm",2);f([g()],h.prototype,"uninstallBusy",2);f([g()],h.prototype,"uninstallDone",2);f([g()],h.prototype,"uninstallError",2);f([g()],h.prototype,"uninstallConfirmText",2);f([g()],h.prototype,"nostrProfileFormState",2);f([g()],h.prototype,"nostrProfileAccountId",2);f([g()],h.prototype,"presenceLoading",2);f([g()],h.prototype,"presenceEntries",2);f([g()],h.prototype,"presenceError",2);f([g()],h.prototype,"presenceStatus",2);f([g()],h.prototype,"agentsLoading",2);f([g()],h.prototype,"agentsList",2);f([g()],h.prototype,"agentsError",2);f([g()],h.prototype,"sessionsLoading",2);f([g()],h.prototype,"sessionsResult",2);f([g()],h.prototype,"sessionsError",2);f([g()],h.prototype,"cronLoading",2);f([g()],h.prototype,"cronJobs",2);f([g()],h.prototype,"cronStatus",2);f([g()],h.prototype,"cronError",2);f([g()],h.prototype,"cronForm",2);f([g()],h.prototype,"cronRunsJobId",2);f([g()],h.prototype,"cronRuns",2);f([g()],h.prototype,"cronBusy",2);f([g()],h.prototype,"cronNewEventModal",2);f([g()],h.prototype,"cronDetailJobId",2);f([g()],h.prototype,"browserScreencastActive",2);f([g()],h.prototype,"browserScreencastFrame",2);f([g()],h.prototype,"browserScreencastMetadata",2);f([g()],h.prototype,"browserHandoffPending",2);f([g()],h.prototype,"browserHandoffReason",2);f([g()],h.prototype,"browserHandoffId",2);f([g()],h.prototype,"browserInputMode",2);f([g()],h.prototype,"browserLoading",2);f([g()],h.prototype,"browserError",2);f([g()],h.prototype,"filesLoading",2);f([g()],h.prototype,"filesTree",2);f([g()],h.prototype,"filesRoot",2);f([g()],h.prototype,"filesError",2);f([g()],h.prototype,"filesSelectedPath",2);f([g()],h.prototype,"filesSelectedPaths",2);f([g()],h.prototype,"filesPreviewContent",2);f([g()],h.prototype,"filesPreviewLoading",2);f([g()],h.prototype,"filesPreviewBinary",2);f([g()],h.prototype,"filesPreviewSize",2);f([g()],h.prototype,"filesExpandedDirs",2);f([g()],h.prototype,"filesMessage",2);f([g()],h.prototype,"filesUploadBusy",2);f([g()],h.prototype,"filesReindexBusy",2);f([g()],h.prototype,"filesMemoryStatus",2);f([g()],h.prototype,"skillsLoading",2);f([g()],h.prototype,"skillsReport",2);f([g()],h.prototype,"skillsError",2);f([g()],h.prototype,"skillsFilter",2);f([g()],h.prototype,"skillEdits",2);f([g()],h.prototype,"skillsBusyKey",2);f([g()],h.prototype,"skillMessages",2);f([g()],h.prototype,"adminsLoading",2);f([g()],h.prototype,"adminPhones",2);f([g()],h.prototype,"adminsError",2);f([g()],h.prototype,"adminsSaving",2);f([g()],h.prototype,"adminsNewPhone",2);f([g()],h.prototype,"customersLoading",2);f([g()],h.prototype,"customersSaving",2);f([g()],h.prototype,"customersRecords",2);f([g()],h.prototype,"customersError",2);f([g()],h.prototype,"customersSearchQuery",2);f([g()],h.prototype,"customersEditingId",2);f([g()],h.prototype,"customersShowAddForm",2);f([g()],h.prototype,"customersNewPhone",2);f([g()],h.prototype,"customersNewName",2);f([g()],h.prototype,"imessageEnableConfirm",2);f([g()],h.prototype,"imessageEnabling",2);f([g()],h.prototype,"infoModalOpen",2);f([g()],h.prototype,"workspaces",2);f([g()],h.prototype,"workspacesLoading",2);f([g()],h.prototype,"workspacesError",2);f([g()],h.prototype,"selectedWorkspace",2);f([g()],h.prototype,"addingWorkspace",2);f([g()],h.prototype,"newWorkspaceName",2);f([g()],h.prototype,"newWorkspacePath",2);f([g()],h.prototype,"newWorkspacePin",2);f([g()],h.prototype,"accountPinModalOpen",2);f([g()],h.prototype,"accountPinBusy",2);f([g()],h.prototype,"accountPinError",2);f([g()],h.prototype,"accountPinSuccess",2);f([g()],h.prototype,"apiKeyProviders",2);f([g()],h.prototype,"apiKeyModalOpen",2);f([g()],h.prototype,"apiKeyBusy",2);f([g()],h.prototype,"apiKeyError",2);f([g()],h.prototype,"apiKeySuccess",2);f([g()],h.prototype,"authApiKeyMode",2);f([g()],h.prototype,"authApiKeyInput",2);f([g()],h.prototype,"authApiKeyBusy",2);f([g()],h.prototype,"authApiKeyError",2);f([g()],h.prototype,"pinChanging",2);f([g()],h.prototype,"pinChangeBusy",2);f([g()],h.prototype,"pinChangeError",2);f([g()],h.prototype,"loginChangePinMode",2);f([g()],h.prototype,"changePinBusy",2);f([g()],h.prototype,"changePinError",2);f([g()],h.prototype,"changePinSuccess",2);f([g()],h.prototype,"workspaceSaving",2);f([g()],h.prototype,"workspaceRemoveConfirm",2);f([g()],h.prototype,"renamingWorkspace",2);f([g()],h.prototype,"renameWorkspaceName",2);f([g()],h.prototype,"debugLoading",2);f([g()],h.prototype,"debugStatus",2);f([g()],h.prototype,"debugHealth",2);f([g()],h.prototype,"debugModels",2);f([g()],h.prototype,"debugHeartbeat",2);f([g()],h.prototype,"debugCallMethod",2);f([g()],h.prototype,"debugCallParams",2);f([g()],h.prototype,"debugCallResult",2);f([g()],h.prototype,"debugCallError",2);f([g()],h.prototype,"logsLoading",2);f([g()],h.prototype,"logsError",2);f([g()],h.prototype,"logsFile",2);f([g()],h.prototype,"logsEntries",2);f([g()],h.prototype,"logsFilterText",2);f([g()],h.prototype,"logsLevelFilters",2);f([g()],h.prototype,"logsAutoFollow",2);f([g()],h.prototype,"logsTruncated",2);f([g()],h.prototype,"logsCursor",2);f([g()],h.prototype,"logsLastFetchAt",2);f([g()],h.prototype,"logsLimit",2);f([g()],h.prototype,"logsMaxBytes",2);f([g()],h.prototype,"logsAtBottom",2);f([g()],h.prototype,"logsSubTab",2);f([g()],h.prototype,"sessionLogsLoading",2);f([g()],h.prototype,"sessionLogsError",2);f([g()],h.prototype,"sessionLogsEntries",2);f([g()],h.prototype,"sessionLogsFilterText",2);f([g()],h.prototype,"sessionLogsTypeFilters",2);f([g()],h.prototype,"sessionLogsAgentFilters",2);f([g()],h.prototype,"sessionLogsAgents",2);f([g()],h.prototype,"sessionLogsAutoFollow",2);f([g()],h.prototype,"sessionLogsFull",2);f([g()],h.prototype,"sessionLogsCursors",2);f([g()],h.prototype,"sessionLogsLastFetchAt",2);f([g()],h.prototype,"sessionLogsAtBottom",2);f([g()],h.prototype,"chatUserNearBottom",2);h=f([_a("taskmaster-app")],h);
2856
- //# sourceMappingURL=index-DgT0m3bj.js.map