@rubytech/taskmaster 1.0.38 → 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,2892 +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 Gc="modulepreload",Vc=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=Vc(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 x=r[w];if(x.href===u&&(!p||x.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${u}"]${m}`))return;const v=document.createElement("link");if(v.rel=p?"stylesheet":Gc,p||(v.as="script"),v.crossOrigin="",v.href=u,a&&v.setAttribute("nonce",a),document.head.appendChild(v),p)return new Promise((w,x)=>{v.addEventListener("load",w),v.addEventListener("error",()=>x(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 Aa=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 Yc=e=>new Aa(typeof e=="string"?e:e+"",void 0,Ni),Qc=(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 Aa(n,e,Ni)},Xc=(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 Yc(n)})(e):e;const{is:Zc,defineProperty:Jc,getOwnPropertyDescriptor:eu,getOwnPropertyNames:tu,getOwnPropertySymbols:nu,getPrototypeOf:su}=Object,ts=globalThis,Vo=ts.trustedTypes,iu=Vo?Vo.emptyScript:"",ou=ts.reactiveElementPolyfillSupport,jt=(e,t)=>e,Fn={toAttribute(e,t){switch(t){case Boolean:e=e?iu: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)=>!Zc(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&&Jc(this.prototype,t,i)}}static getPropertyDescriptor(t,n,s){const{get:i,set:o}=eu(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=su(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=[...tu(n),...nu(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 Xc(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,ou?.({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)}$`,$a="?"+Re,ru=`<${$a}>`,Ve=document,Qt=()=>Ve.createComment(""),Xt=e=>e===null||typeof e!="object"&&typeof e!="function",Bi=Array.isArray,au=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,Ea=/^(?:script|style|textarea|title)$/i,lu=e=>(t,...n)=>({_$litType$:e,strings:t,values:n}),d=lu(1),Ne=Symbol.for("lit-noChange"),b=Symbol.for("lit-nothing"),nr=new WeakMap,qe=Ve.createTreeWalker(Ve,129);function Ta(e,t){if(!Bi(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return Xo!==void 0?Xo.createHTML(t):t}const cu=(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?(Ea.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+ru:p>=0?(s.push(c),a.slice(0,p)+xa+a.slice(p)+Re+v):a+Re+(p===-2?l:v)}return[Ta(e,o+(e[n]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),s]};let ri=class Ca{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]=cu(t,n);if(this.el=Ca.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]==="."?du:w[1]==="?"?pu:w[1]==="@"?hu:ss}),i.removeAttribute(p)}else p.startsWith(Re)&&(a.push({type:6,index:o}),i.removeAttribute(p));if(Ea.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===$a)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 uu{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 fu(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 _a{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):au(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(Ta(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===i)this._$AH.p(n);else{const o=new uu(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 _a(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 du=class extends ss{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===b?void 0:t}},pu=class extends ss{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==b)}},hu=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)}},fu=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 gu={I:ns},mu=Oi.litHtmlPolyfillSupport;mu?.(ri,ns),(Oi.litHtmlVersions??=[]).push("3.3.2");const yu=(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=yu(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 vu=Fi.litElementPolyfillSupport;vu?.({LitElement:mt});(Fi.litElementVersions??=[]).push("4.2.2");const Ma=e=>(t,n)=>{n!==void 0?n.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const bu={attribute:!0,type:String,converter:Fn,reflect:!1,hasChanged:Di},wu=(e=bu,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"?wu(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 ku=50,Su=200,Au="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,ku)??Au,n=sr(e?.avatar??void 0,Su)??null;return{agentId:typeof e?.agentId=="string"&&e.agentId.trim()?e.agentId.trim():null,name:t,avatar:n}}function xu(){return ai(typeof window>"u"?{}:{name:window.__TASKMASTER_ASSISTANT_NAME__,avatar:window.__TASKMASTER_ASSISTANT_AVATAR__})}const Wn="taskmaster.control.settings.v1",La="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 $u(){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 Eu(e){if(!e)return{...Pe};try{const t=localStorage.getItem(La+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{...$u(),...Eu(Kn)}}function Tu(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(La+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 Pa(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 Cu=/<\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 _u(e,t){return e.trimStart()}function Mu(e,t){if(!e||!Cu.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),_u(s)}function Ra(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 Ia(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 Lu(e,t=120){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}…`}function Na(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 Mu(e)}const Pu=/^\[([^\]]+)\]\s*/,Ru=["WebChat","WhatsApp","Telegram","Signal","Slack","Discord","iMessage","Teams","Matrix","Zalo","Zalo Personal","BlueBubbles"],Ps=new WeakMap,Rs=new WeakMap;function Iu(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:Ru.some(t=>e.startsWith(`${t} `))}function Is(e){const t=e.match(Pu);if(!t)return e;const n=t[1]??"";return Iu(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 Da(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=Du(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 Nu(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 Du(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 Ou(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 Bu=/Read HEARTBEAT\.md if it exists|reply HEARTBEAT_OK/i,Fu=/^[\s*`_]*HEARTBEAT_OK[\s*`_]*$/i,Uu=/^[\s*`_]*NO_REPLY[\s*`_]*$/i,Wu=/^A new session was started via \/new or \/reset\./;function Ku(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"&&Bu.test(i)||n==="assistant"&&Fu.test(i)||n==="user"&&Wu.test(i)||n==="assistant"&&Uu.test(i)):!1}function zu(e){return e.filter(t=>!Ku(t))}function Oa(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 Ba(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 Fa(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 ju(){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(ju())}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=zu(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 Hu(e){const t=/^data:([^;]+);base64,(.+)$/.exec(e);return t?{mimeType:t[1],content:t[2]}:null}async function Ua(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=Hu(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 Wa(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 Ka(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 qu=Object.freeze(Object.defineProperty({__proto__:null,abortChatRun:Wa,handleChatEvent:Ka,loadChatHistory:Ce,sendChatMessage:Ua},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,Gu=80,Vu=12e4;function Yu(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=Yu(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=Na(n,Vu);return s.truncated?`${s.text}
12
-
13
- … truncated (${s.total} chars, showing first ${s.text.length}).`:s.text}function Qu(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 Xu(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 Zu(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),Zu(e)}function Ju(e,t=!1){if(t){li(e);return}e.toolStreamSyncTimer==null&&(e.toolStreamSyncTimer=window.setTimeout(()=>li(e),Gu))}function Ki(e){e.toolStreamById.clear(),e.toolStreamOrder=[],e.chatToolMessages=[],li(e)}const ed=5e3;function td(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},ed))}function nd(e,t){if(!t)return;if(t.stream==="compaction"){td(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=Qu(u),Xu(e),Ju(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 za(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 sd(e,t){const n=t.currentTarget;if(!n)return;const s=n.scrollHeight-n.scrollTop-n.clientHeight;e.chatUserNearBottom=s<200}function id(e,t){const n=t.currentTarget;n&&(e.logsAtBottom=n.scrollTop<80)}function od(e,t){const n=t.currentTarget;n&&(e.logsAtBottom=n.scrollTop<80)}function rd(e){e.chatHasAutoScrolled=!1,e.chatUserNearBottom=!0}function ad(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 ld(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 cd(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 ja(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",{});dd(e,t)}catch(t){e.lastError=String(t)}finally{e.configLoading=!1}}}async function Ha(e){if(!(!e.client||!e.connected)&&!e.configSchemaLoading){e.configSchemaLoading=!0;try{const t=await e.client.request("config.schema",{});ud(e,t)}catch(t){e.lastError=String(t)}finally{e.configSchemaLoading=!1}}}function ud(e,t){e.configSchema=t.schema??null,e.configUiHints=t.uiHints??{},e.configSchemaVersion=t.version??null}function dd(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 pd(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 hd(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 fd(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 gd(e){if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{const t=hd(e.cronForm),n=fd(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 md(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 yd(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 vd(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 qa(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 Ga(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 Va(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 Ya(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 bd=Object.freeze(Object.defineProperty({__proto__:null,addWhatsAppAccount:Va,loadChannels:z,logoutWhatsApp:Ga,removeWhatsAppAccount:Ya,startWhatsAppLogin:zi,waitWhatsAppLogin:qa},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 wd=2e3,kd=new Set(["trace","debug","info","warn","error","fatal"]);function Sd(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 Ad(e){if(typeof e!="string")return null;const t=e.toLowerCase();return kd.has(t)?t:null}function xd(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=Ad(n?.logLevelName??n?.level),o=typeof t[0]=="string"?t[0]:typeof n?.name=="string"?n?.name:null,r=Sd(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(xd),r=!!(t?.reset||s.reset||e.logsCursor==null);e.logsEntries=r?o:[...e.logsEntries,...o].slice(-wd),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 Qa={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:$d}=Qa,Qe=32,Hi=64,Ed=(...e)=>{"captureStackTrace"in Error&&typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(...e)},Y=(e="")=>{const t=new Error(e);throw Ed(t,Y),t},Td=e=>typeof e=="bigint",Cd=e=>typeof e=="string",_d=e=>e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array",Be=(e,t,n="")=>{const s=_d(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),Xa=e=>Uint8Array.from(e),Za=(e,t)=>e.toString(16).padStart(t,"0"),Ja=e=>Array.from(Be(e)).map(t=>Za(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)},el=e=>{const t="hex invalid";if(!Cd(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},tl=()=>globalThis?.crypto,Md=()=>tl()?.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},Ld=(e=Qe)=>tl().getRandomValues(as(e)),Hn=BigInt,He=(e,t,n,s="bad number: out of range")=>Td(e)&&t<=e&&e<n?e:Y(s),$=(e,t=ee)=>{const n=e%t;return n>=0n?n:t+n},nl=e=>$(e,In),Pd=(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")},Rd=e=>{const t=rl[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 Qa}static fromAffine(t){return new ae(t.x,t.y,1n,$(t.x*t.y))}static fromBytes(t,n=!1){const s=Ds,i=Xa(Be(t,Qe)),o=t[31];i[31]=o&-129;const r=il(i);He(r,0n,n?ui:ee);const a=$(r*r),c=$(a-1n),u=$(s*a+1n);let{isValid:p,value:m}=Nd(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(el(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 x=$(i*o),_=$(r*l);return x!==_?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),x=$(p*v),_=$(u*v),j=$(m*p);return new ae(w,x,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),x=$(i*a),_=$((n+s)*(r+l)-m-v),j=$(x-w),C=$(x+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 qd(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=Pd(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=sl(n);return s[31]|=t&1n?128:0,s}toHex(){return Ja(this.toBytes())}clearCofactor(){return this.multiply(Hn($d),!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 sl=e=>el(Za(He(e,0n,ui),Hi)).reverse(),il=e=>Hn("0x"+Ja(Xa(Be(e)).reverse())),ve=(e,t)=>{let n=e;for(;t-- >0n;)n*=n,n%=ee;return n},Id=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,Nd=(e,t)=>{const n=$(t*t*t),s=$(n*n*t),i=Id(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=>nl(il(e)),qi=(...e)=>rl.sha512Async(Zt(...e)),Dd=(...e)=>Rd("sha512")(Zt(...e)),ol=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(ol),Od=e=>ol(Dd(Be(e,Qe))),Bd=e=>Gi(e).then(t=>t.pointBytes),Fd=e=>qi(e.hashable).then(e.finish),Ud=(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=nl(o+di(c)*i);return Be(Zt(r,sl(u)),Hi)}}},Wd=async(e,t)=>{const n=Be(e),s=await Gi(t),i=await qi(s.prefix,n);return Fd(Ud(s,i,n))},rl={sha512Async:async e=>{const t=Md(),n=Zt(e);return as(await t.digest("SHA-512",n.buffer))},sha512:void 0},Kd=(e=Ld(Qe))=>e,zd={getExtendedPublicKeyAsync:Gi,getExtendedPublicKey:Od,randomSecretKey:Kd},qn=8,jd=256,al=Math.ceil(jd/qn)+1,pi=2**(qn-1),Hd=()=>{const e=[];let t=Xe,n=t;for(let s=0;s<al;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},qd=e=>{const t=fr||(fr=Hd());let n=ft,s=Xe;const i=2**qn,o=i,r=Hn(i-1),l=Hn(qn);for(let a=0;a<al;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 ll(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 Gd(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function cl(e){const t=await crypto.subtle.digest("SHA-256",e);return Gd(new Uint8Array(t))}async function Vd(){const e=zd.randomSecretKey(),t=await Bd(e);return{deviceId:await cl(t),publicKey:hi(t),privateKey:hi(e)}}async function Yd(){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 cl(ll(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 Vd(),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 Qd(e,t){const n=ll(e),s=new TextEncoder().encode(t),i=await Wd(s,n);return hi(i)}const ul="taskmaster.device.auth.v1";function Vi(e){return e.trim()}function Xd(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(ul);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 dl(e){try{window.localStorage.setItem(ul,JSON.stringify(e))}catch{}}function Zd(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 Jd(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:Xd(e.scopes),updatedAtMs:Date.now()};return n.tokens[t]=i,dl(n),i}function ep(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],dl(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 tp(e){return{method:"exec.approvals.get",params:{}}}async function np(e,t){if(!(!e.client||!e.connected)&&!e.execApprovalsLoading){e.execApprovalsLoading=!0,e.lastError=null;try{const n=tp(t);if(!n){e.lastError="Select a node before loading exec approvals.";return}const s=await e.client.request(n.method,n.params);sp(e,s)}catch(n){e.lastError=String(n)}finally{e.execApprovalsLoading=!1}}}function sp(e,t){e.execApprovalsSnapshot=t,e.execApprovalsDirty||(e.execApprovalsForm=De(t.file??{}))}async function pl(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 ip(e,t,n){e.skillEdits={...e.skillEdits,[t]:n}}async function op(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 rp(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 ap(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 hl={overview:"/overview",channels:"/channels",instances:"/instances",cron:"/cron",skills:"/skills",nodes:"/nodes",chat:"/chat",admins:"/admins",config:"/config",debug:"/debug",logs:"/logs"},fl=new Map(Object.entries(hl).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 lp(e,t=""){const n=cs(t),s=hl[e];return n?`${n}${s}`:s}function gl(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":fl.get(i)??null}function cp(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(fl.has(i)){const o=n.slice(0,s);return o.length?`/${o.join("/")}`:""}}return`/${n.join("/")}`}function up(){return typeof window>"u"||typeof window.matchMedia!="function"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function Zi(e){return e==="system"?up():e}const kn=e=>Number.isNaN(e)?.5:e<=0?0:e>=1?1:e,dp=()=>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")},pp=({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=dp();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)},hp=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(-hp),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 fp=Object.freeze(Object.defineProperty({__proto__:null,loadSessionLogs:gt},Symbol.toStringTag,{value:"Module"}));async function ml(e,t){if(!(!e.client||!e.connected))try{const n={},s=await e.client.request("memory.audit",n);s?.ok&&(e.auditEntries=s.entries??[])}catch{}}async function gp(e,t){if(!(!e.client||!e.connected))try{const n={};await e.client.request("memory.auditClear",n),e.auditEntries=[]}catch{}}function mp(e){e.nodesPollInterval==null&&(e.nodesPollInterval=window.setInterval(()=>{Xi(e,{quiet:!0})},5e3))}function yp(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 vp(e){e.auditPollInterval==null&&(e.auditPollInterval=window.setInterval(()=>{ml(e)},3e4))}function bp(e){e.auditPollInterval!=null&&(clearInterval(e.auditPollInterval),e.auditPollInterval=null)}function Ie(e,t){const n={...t,lastActiveSessionKey:t.lastActiveSessionKey?.trim()||t.sessionKey.trim()||"main"};e.settings=n,Tu(n),t.theme!==e.theme&&(e.theme=t.theme,us(e,Zi(t.theme))),e.applySessionKey=e.settings.lastActiveSessionKey}function yl(e,t){const n=t.trim();n&&e.settings.lastActiveSessionKey!==n&&Ie(e,{...e.settings,lastActiveSessionKey:n})}function wp(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 kp(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),bl(e,t,!1)}function Sp(e,t,n){pp({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 wl(e),e.tab==="channels"&&await _p(e),e.tab==="instances"&&await pl(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 np(e)),e.tab==="chat"&&!e.advancedPage&&!e.chatPage&&(await Ip(e),en(e,!e.chatHasAutoScrolled)),e.tab==="config"&&(await Ha(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(()=>fp);return{loadSessionLogs:s}},void 0,import.meta.url);await n(e,{reset:!0})}else await qt(e,{reset:!0});za(e,!0)}}function Ap(){if(typeof window>"u")return"";const e=window.__TASKMASTER_CONTROL_UI_BASE_PATH__;return typeof e=="string"&&e.trim()?cs(e):cp(window.location.pathname)}function xp(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 $p(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 Ep(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 Tp(e,t){if(typeof window>"u")return;const n=gl(window.location.pathname,e.basePath)??"chat";vl(e,n),bl(e,n,t)}function Cp(e){if(typeof window>"u")return;const t=gl(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})),vl(e,t)}function vl(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 bl(e,t,n){if(typeof window>"u")return;const s=Jt(lp(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 wl(e){await Promise.all([z(e,!1),pl(e),Wi(e),tn(e),ji(e)])}async function _p(e){await Promise.all([z(e,!0),Ha(e),ke(e)])}async function ro(e){await Promise.all([z(e,!1),tn(e),rs(e)])}function kl(e){return e.chatSending||!!e.chatRunId}function Mp(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 Sl(e){e.connected&&(e.chatMessage="",await Wa(e))}function Lp(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 Al(e,t,n){Ki(e);const s=await Ua(e,t,n?.attachments);return!s&&n?.previousDraft!=null&&(e.chatMessage=n.previousDraft),!s&&n?.previousAttachments&&(e.chatAttachments=n.previousAttachments),s&&yl(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&&xl(e),s}async function xl(e){if(!e.connected||kl(e))return;const[t,...n]=e.chatQueue;if(!t)return;e.chatQueue=n,await Al(e,t.text,{attachments:t.attachments})||(e.chatQueue=[t,...e.chatQueue])}function Pp(e,t){e.chatQueue=e.chatQueue.filter(n=>n.id!==t)}async function Rp(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(Mp(i)){await Sl(e);return}if(t==null&&(e.chatMessage="",e.chatAttachments=[]),kl(e)){Lp(e,i,r);return}await Al(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 Ip(e){await Promise.all([Ce(e),Wi(e),fi(e)]),en(e,!0)}const Np=xl;function Dp(e){const t=Pa(e.sessionKey);return t?.agentId?t.agentId:e.hello?.snapshot?.sessionDefaults?.defaultAgentId?.trim()||"main"}function Op(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=Dp(e);if(!t){e.chatAvatarUrl=null;return}e.chatAvatarUrl=null;const n=Op(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>`},Bp="Taskmaster",Fp="/taskmaster-icon.png",$l="#00d4ff";let An=null;function Oe(){return An||(An={name:window.__TASKMASTER_BRAND_NAME__||Bp,iconUrl:window.__TASKMASTER_BRAND_ICON_URL__||Fp,accentColor:window.__TASKMASTER_ACCENT_COLOR__||$l},An)}function Up(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 Wp(e){if(e===$l)return;const t=Up(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 Kp=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>`,zp=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"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"></path></svg>`;let mr=!1;function jp(){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=(u,p)=>u===e?d`<span class="sp-page-nav-current">${u}</span>`:d`<a href=${p}>${u}</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)?Hp(t):b,r=t?.hasPins&&t.onLogout?d`<button class="nav-logout-btn" @click=${t.onLogout} title="Lock">${Kp}</button>`:b,l=t?.auditCount??0,a=l>0&&t?.onAuditClick?d`<button class="nav-audit-btn" @click=${t.onAuditClick} title="Memory writes to review">
27
- ${zp}
28
- <span class="nav-audit-badge">${l>99?"99+":l}</span>
29
- </button>`:b,c=()=>{const u=document.getElementById("nav-burger-toggle");u&&(u.checked=!1)};return jp(),d`
30
- <div class="setup-header">
31
- <input type="checkbox" id="nav-burger-toggle" class="nav-burger-checkbox" />
32
- <div class="setup-header-inner">
33
- <img class="setup-header-logo" src="${Oe().iconUrl}" alt="${Oe().name}" />
34
- <nav class="setup-header-nav">
35
- ${s}
36
- </nav>
37
- <div class="setup-header-right">
38
- ${o!==b?d`<span class="nav-selector-inline">${o}</span>`:b}
39
- ${a}
40
- ${r}
41
- <label for="nav-burger-toggle" class="nav-burger-button" aria-label="Toggle menu">
42
- <span class="nav-burger-icon"></span>
43
- </label>
44
- </div>
45
- </div>
46
- <nav class="setup-header-dropdown" @click=${c}>
47
- ${o!==b?d`<div class="nav-selector-mobile">${o}</div>`:b}
48
- ${s}
49
- </nav>
50
- </div>
51
- `}function Hp(e){const{workspaces:t,selectedWorkspace:n,onWorkspaceSelect:s}=e;return d`
52
- <select
53
- class="sp-workspace-selector"
54
- .value=${n??""}
55
- @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)}}
56
- >
57
- ${t.map(o=>d`
58
- <option value=${o.name} ?selected=${o.name===n}>
59
- ${o.displayName??o.name}
60
- </option>
61
- `)}
62
- <option disabled>───</option>
63
- <option value="__add__">+ Add Account</option>
64
- </select>
65
- `}function qp(e){return e.connected?d`
66
- <div class="setup-container">
67
- ${tt("Browser")}
68
- <div class="setup-card sp-card-wide">
69
- <h1>Remote Browser</h1>
70
- <p style="margin-bottom: 16px;">Live view of the headless Chrome instance.</p>
71
-
72
- <div class="sp-toolbar">
73
- ${e.active?d`
74
- <button
75
- class="setup-button ${e.inputMode?"primary":"secondary"}"
76
- style="padding: 10px 20px; font-size: 14px;"
77
- @click=${e.onToggleInput}
78
- >
79
- ${e.inputMode?"Input: ON":"Input: OFF"}
80
- </button>
81
- <button
82
- class="setup-button danger"
83
- style="padding: 10px 20px; font-size: 14px;"
84
- ?disabled=${e.loading}
85
- @click=${e.onStop}
86
- >
87
- Stop
88
- </button>
89
- `:d`
90
- <button
91
- class="setup-button primary"
92
- style="padding: 10px 20px; font-size: 14px;"
93
- ?disabled=${e.loading}
94
- @click=${e.onStart}
95
- >
96
- ${e.loading?"Starting...":"Start"}
97
- </button>
98
- `}
99
- </div>
100
-
101
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
102
-
103
- ${e.handoffPending?d`
104
- <div class="setup-warning" style="margin-top: 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; text-align: left;">
105
- <div>
106
- <strong>Action required:</strong> ${e.handoffReason??"The agent needs you to complete an action in the browser."}
107
- </div>
108
- <button class="setup-button primary" style="flex-shrink: 0; padding: 10px 20px; font-size: 14px;" @click=${e.onCompleteHandoff}>
109
- Done
110
- </button>
111
- </div>
112
- `:b}
113
-
114
- <div class="sp-canvas-area" style="margin-top: 16px;">
115
- ${e.active?d`
116
- <div class="sp-canvas-wrap ${e.inputMode?"sp-input-active":""}">
117
- <canvas
118
- id="browser-screencast-canvas"
119
- class="sp-canvas"
120
- tabindex="0"
121
- @mousedown=${t=>e.onCanvasMouseDown(t)}
122
- @mouseup=${t=>e.onCanvasMouseUp(t)}
123
- @mousemove=${t=>e.onCanvasMouseMove(t)}
124
- @keydown=${t=>{t.preventDefault(),e.onCanvasKeyDown(t)}}
125
- @keyup=${t=>{t.preventDefault(),e.onCanvasKeyUp(t)}}
126
- @contextmenu=${t=>t.preventDefault()}
127
- ></canvas>
128
- </div>
129
- `:d`
130
- <div class="sp-canvas-placeholder">
131
- <div class="sp-canvas-placeholder-icon">${N.globe}</div>
132
- <p>Click Start to begin streaming the Chrome viewport.</p>
133
- </div>
134
- `}
135
- </div>
136
-
137
- ${e.active&&e.inputMode?d`<p class="setup-hint" style="margin-top: 12px;">
138
- Click the canvas to focus, then interact with the browser. Mouse and keyboard input are forwarded.
139
- </p>`:b}
140
-
141
- </div>
142
- </div>
143
- `:d`
144
- <div class="setup-container">
145
- <div class="setup-card">
146
- <div class="setup-spinner"></div>
147
- <p>Connecting to gateway...</p>
148
- </div>
149
- </div>
150
- `}const Gn="application/x-taskmaster-file-path";function El(e){return e==null?"":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function Tl(e){const t=e.split("/");return t.length>1?t.slice(0,-1).join("/"):"."}function Gp(e,t,n){e.preventDefault(),e.stopPropagation(),e.currentTarget.classList.remove("sp-drop-target");const s=e.dataTransfer?.getData(Gn);if(s){Tl(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 Cl(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`
151
- <div
152
- class="sp-tree-item sp-tree-dir ${i?"expanded":""}"
153
- style="padding-left: ${r}px;"
154
- @click=${()=>t.onToggleDir(e.path)}
155
- @dragover=${l=>{l.preventDefault(),l.stopPropagation(),l.dataTransfer&&(l.dataTransfer.dropEffect="move"),l.currentTarget.classList.add("sp-drop-target")}}
156
- @dragleave=${l=>{l.currentTarget.classList.remove("sp-drop-target")}}
157
- @drop=${l=>Gp(l,e.path,t)}
158
- >
159
- <span class="sp-tree-chevron">${i?"−":"+"}</span>
160
- <span class="sp-tree-icon">${N.folder}</span>
161
- <span class="sp-tree-name">${e.name}</span>
162
- </div>
163
- ${i&&e.children?e.children.map(l=>Cl(l,t,n+1)):b}
164
- `:d`
165
- <div
166
- class="sp-tree-item sp-tree-file ${o?"selected":""}"
167
- style="padding-left: ${r}px;"
168
- draggable="true"
169
- @click=${l=>{l.metaKey||l.ctrlKey?t.onToggleSelectFile(e.path):t.onSelectFile(e.path)}}
170
- @dragstart=${l=>{l.dataTransfer&&(l.dataTransfer.effectAllowed="move",l.dataTransfer.setData(Gn,e.path),l.dataTransfer.setData("text/plain",e.name))}}
171
- >
172
- <span class="sp-tree-icon">${N.fileText}</span>
173
- <span class="sp-tree-name">${e.name}</span>
174
- <span class="sp-tree-size">${El(e.size)}</span>
175
- </div>
176
- `}function Vp(e){const t=e.selectedPaths.size;return t<2?b:d`
177
- <div class="sp-bulk-actions">
178
- <span style="color: var(--tasker-muted-grey); font-size: 13px;">${t} files selected</span>
179
- <button
180
- class="setup-button secondary"
181
- style="padding: 8px 16px; font-size: 13px;"
182
- @click=${e.onBulkDownload}
183
- >
184
- Download ${t} files
185
- </button>
186
- </div>
187
- `}function Yp(e){if(e.selectedPaths.size!==1||!e.selectedPath)return b;if(e.previewLoading)return d`
188
- <div class="sp-file-preview">
189
- <div class="setup-spinner" style="width: 32px; height: 32px; margin: 24px auto;"></div>
190
- </div>
191
- `;const t=e.selectedPath.split("/").pop()??e.selectedPath;return d`
192
- <div class="sp-file-preview">
193
- <div class="sp-file-preview-header">
194
- <div>
195
- <strong>${t}</strong>
196
- <div class="sp-file-preview-meta">
197
- ${e.selectedPath}${e.previewSize!=null?` — ${El(e.previewSize)}`:""}
198
- </div>
199
- </div>
200
- <div class="sp-file-actions">
201
- <button class="setup-button secondary" style="padding: 8px 16px; font-size: 13px;" @click=${()=>e.onDownload(e.selectedPath)}>
202
- Download
203
- </button>
204
- <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)}}>
205
- Move
206
- </button>
207
- <button class="setup-button danger" style="padding: 8px 16px; font-size: 13px;" @click=${()=>{confirm(`Delete ${t}?`)&&e.onDelete(e.selectedPath)}}>
208
- Delete
209
- </button>
210
- </div>
211
- </div>
212
- ${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>`}
213
- </div>
214
- `}function Qp(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 Xp(e){const t=Qp(e);return e.connected?d`
215
- <div class="setup-container">
216
- ${tt("Files",e.wsProps)}
217
- <div class="setup-card sp-card-wide">
218
- <h1>Workspace Files</h1>
219
- <p style="margin-bottom: 16px;">Browse, upload, and manage files in your workspace. Drag files between folders to move them.</p>
220
-
221
- <div class="sp-toolbar">
222
- <label class="setup-button secondary" style="padding: 10px 20px; font-size: 14px; cursor: pointer;">
223
- Upload
224
- <input
225
- type="file"
226
- multiple
227
- accept=".md"
228
- style="display: none;"
229
- @change=${n=>{const s=n.target;s.files&&s.files.length>0&&(e.onUpload(t,Array.from(s.files)),s.value="")}}
230
- />
231
- </label>
232
- <button
233
- class="setup-button secondary"
234
- style="padding: 10px 20px; font-size: 14px;"
235
- ?disabled=${e.loading}
236
- @click=${e.onRefresh}
237
- >
238
- ${e.loading?"Loading...":"Refresh"}
239
- </button>
240
- <button
241
- class="setup-button secondary"
242
- style="padding: 10px 20px; font-size: 14px;"
243
- ?disabled=${e.reindexBusy}
244
- @click=${e.onReindex}
245
- >
246
- ${e.reindexBusy?"Re-indexing...":"Re-index"}
247
- </button>
248
- ${e.memoryStatus?d`<span style="display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--tasker-text-grey);">
249
- <span
250
- class="setup-status-light"
251
- style="width: 10px; height: 10px; background: ${e.memoryStatus.dirty?"#ef4444":"#22c55e"}"
252
- ></span>
253
- ${e.memoryStatus.files} files, ${e.memoryStatus.chunks} chunks
254
- </span>`:b}
255
- </div>
256
-
257
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
258
-
259
- ${e.message?d`<div class="${e.message.kind==="error"?"setup-error":"setup-success-message"}" style="margin-top: 12px;">
260
- ${e.message.text}
261
- </div>`:b}
262
-
263
- ${e.uploadBusy?d`<div style="margin-top: 12px; color: var(--tasker-orange); font-weight: 600; font-size: 14px;">Uploading...</div>`:b}
264
-
265
- <div
266
- class="sp-file-tree"
267
- @dragover=${n=>{n.preventDefault(),n.dataTransfer&&(n.dataTransfer.dropEffect=n.dataTransfer.types.includes(Gn)?"move":"copy")}}
268
- @drop=${n=>{n.preventDefault();const s=n.dataTransfer?.getData(Gn);if(s){Tl(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)}}}
269
- >
270
- ${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=>Cl(n,e,0))}
271
- </div>
272
-
273
- ${Vp(e)}
274
- ${Yp(e)}
275
- </div>
276
- </div>
277
- `:d`
278
- <div class="setup-container">
279
- <div class="setup-card">
280
- <div class="setup-spinner"></div>
281
- <p>Connecting to gateway...</p>
282
- </div>
283
- </div>
284
- `}const ao="taskmaster_uninstall_done";async function Zp(e){if(!(!e.client||!e.connected)&&!e.uninstallBusy){e.uninstallBusy=!0,e.uninstallError=null,e.requestUpdate?.(),eh();try{await e.client.request("system.uninstall",{scopes:["service","state","workspace"],purge:!0})}catch{}e.uninstallBusy=!1,e.uninstallDone=!0,e.requestUpdate?.()}}function _l(){try{return localStorage.getItem(ao)==="1"}catch{return!1}}function Jp(){try{localStorage.removeItem(ao)}catch{}}function eh(){try{localStorage.setItem(ao,"1")}catch{}}const yr=Object.freeze(Object.defineProperty({__proto__:null,checkUninstallDone:_l,clearUninstallDone:Jp,runUninstall:Zp},Symbol.toStringTag,{value:"Module"}));function le(e){return d`
285
- <span
286
- class="setup-status-light"
287
- style="background: ${{good:"#22c55e",bad:"#ef4444",partial:"#eab308",unknown:"#6b7280"}[e]}"
288
- ></span>
289
- `}function At(e,t){return d`
290
- <button
291
- class="setup-info-btn"
292
- @click=${()=>t.onInfoModalOpen(e)}
293
- title="Details"
294
- >
295
- ${N.info}
296
- </button>
297
- `}function th(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=xt(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`
298
- <div class="setup-info-overlay" @click=${s=>{s.target.classList.contains("setup-info-overlay")&&e.onInfoModalClose()}}>
299
- <div class="setup-info-card">
300
- <h3>${t}</h3>
301
- ${n.map(s=>d`
302
- <div class="setup-info-row">
303
- <span class="setup-info-label">${s.label}</span>
304
- <span class="setup-info-value">${s.value}</span>
305
- </div>
306
- `)}
307
- <button
308
- class="setup-button secondary"
309
- style="margin-top: 16px; width: 100%; padding: 10px;"
310
- @click=${e.onInfoModalClose}
311
- >
312
- Close
313
- </button>
314
- </div>
315
- </div>
316
- `}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`
317
- <div class="setup-steps">
318
- ${t.map(i=>{const o=n.indexOf(i.id),r=e===i.id,l=s>o;return d`
319
- <div
320
- class="setup-step ${r?"active":""} ${l?"completed":""}"
321
- >
322
- <span class="setup-step-dot"></span>
323
- <span class="setup-step-label">${i.label}</span>
324
- </div>
325
- `})}
326
- </div>
327
- `}function vr(e){const{licenseKey:t,licenseBusy:n,licenseValid:s,licenseMessage:i,licenseDeviceId:o,onLicenseKeyChange:r,onLicenseActivate:l}=e;return s===!0?d`
328
- <div class="setup-container">
329
- <div class="setup-card setup-success">
330
- ${ge("license")}
331
- <div class="setup-status-row">
332
- ${le("good")}
333
- <span>License Activated</span>
334
- </div>
335
- <p>${i??"Your license is active."}</p>
336
- </div>
337
- </div>
338
- `:n&&!t?d`
339
- <div class="setup-container">
340
- <div class="setup-card">
341
- ${ge("license")}
342
- <div class="setup-spinner"></div>
343
- <p>Checking license...</p>
344
- </div>
345
- </div>
346
- `:d`
347
- <div class="setup-container">
348
- <div class="setup-card">
349
- ${ge("license")}
350
- <h1>Activate License</h1>
351
- <p>Enter your license key to get started.</p>
352
- ${o?d`
353
- <div class="setup-device-id">
354
- <span class="setup-device-id-label">Your Device ID</span>
355
- <div class="setup-device-id-row">
356
- <code class="setup-device-id-value">${o}</code>
357
- <button
358
- class="setup-device-id-copy"
359
- title="Copy Device ID"
360
- @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)}}}
361
- >Copy</button>
362
- </div>
363
- <p class="setup-hint" style="margin-top: 4px;">
364
- Send this ID along with your order number to our WhatsApp to receive your license key.
365
- </p>
366
- </div>
367
- `:b}
368
- <div class="setup-code-input">
369
- <input
370
- type="text"
371
- placeholder="Paste your license key here"
372
- .value=${t}
373
- @input=${a=>r(a.target.value)}
374
- @keydown=${a=>{a.key==="Enter"&&t.trim()&&l()}}
375
- />
376
- <button
377
- class="setup-button"
378
- ?disabled=${!t.trim()||n}
379
- @click=${l}
380
- >
381
- ${n?"Activating...":"Activate"}
382
- </button>
383
- </div>
384
- ${s===!1&&i?d`
385
- <div class="setup-status-row" style="margin-top: 12px;">
386
- ${le("bad")}
387
- <span class="setup-error">${i}</span>
388
- </div>
389
- `:b}
390
- <p class="setup-hint">
391
- Need a license?
392
- <a href="https://taskmaster.bot" target="_blank" rel="noopener">
393
- Purchase at taskmaster.bot
394
- </a>
395
- </p>
396
- </div>
397
- </div>
398
- `}function nh(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`
399
- <div class="setup-container">
400
- <div class="setup-card setup-success">
401
- ${ge("auth")}
402
- <div class="setup-status-row">
403
- ${le("good")}
404
- <span>Claude Connected</span>
405
- </div>
406
- <p>
407
- Your Claude Pro subscription is linked.
408
- ${r?d`<br /><span class="setup-hint"
409
- >Expires in ${r} minutes</span
410
- >`:b}
411
- </p>
412
- <button class="setup-button primary" @click=${u}>
413
- Continue to WhatsApp →
414
- </button>
415
- </div>
416
- </div>
417
- `:n&&!i?d`
418
- <div class="setup-container">
419
- <div class="setup-card">
420
- ${ge("auth")}
421
- <div class="setup-spinner"></div>
422
- <p>Starting Claude connection...</p>
423
- </div>
424
- </div>
425
- `:i?d`
426
- <div class="setup-container">
427
- <div class="setup-card">
428
- ${ge("auth")}
429
- <h1>Connect to Claude</h1>
430
- <p>Click the button below to sign in with your Claude Pro account.</p>
431
- <a
432
- href=${i}
433
- target="_blank"
434
- rel="noopener"
435
- class="setup-button primary"
436
- >
437
- Sign in with Claude →
438
- </a>
439
- <div class="setup-divider">
440
- <span>Then enter the code shown</span>
441
- </div>
442
- <div class="setup-code-input">
443
- <input
444
- type="text"
445
- placeholder="Enter authorization code"
446
- .value=${o}
447
- @input=${p=>c(p.target.value)}
448
- @keydown=${p=>{p.key==="Enter"&&o.trim()&&a(o.trim())}}
449
- />
450
- <button
451
- class="setup-button"
452
- ?disabled=${!o.trim()||n}
453
- @click=${()=>a(o.trim())}
454
- >
455
- ${n?"Verifying...":"Submit"}
456
- </button>
457
- </div>
458
- ${s?d`<p class="setup-hint">${s}</p>`:b}
459
- <p class="setup-hint" style="margin-top: 16px;">
460
- <a href="#" class="setup-link" @click=${p=>{p.preventDefault(),e.onAuthApiKeyToggle()}}>
461
- Or use an API key instead
462
- </a>
463
- </p>
464
- </div>
465
- </div>
466
- `:e.authApiKeyMode?d`
467
- <div class="setup-container">
468
- <div class="setup-card">
469
- ${ge("auth")}
470
- <h1>Enter API Key</h1>
471
- <p>Paste your Anthropic API key below.</p>
472
- <div class="setup-code-input">
473
- <input
474
- type="password"
475
- placeholder="sk-ant-..."
476
- .value=${e.authApiKeyInput}
477
- @input=${p=>e.onAuthApiKeyChange(p.target.value)}
478
- @keydown=${p=>{p.key==="Enter"&&e.authApiKeyInput.trim()&&e.onAuthApiKeySubmit()}}
479
- ?disabled=${e.authApiKeyBusy}
480
- autofocus
481
- />
482
- <button
483
- class="setup-button"
484
- ?disabled=${!e.authApiKeyInput.trim()||e.authApiKeyBusy}
485
- @click=${()=>e.onAuthApiKeySubmit()}
486
- >${e.authApiKeyBusy?"Saving...":"Save"}</button>
487
- </div>
488
- ${e.authApiKeyError?d`<p class="setup-error">${e.authApiKeyError}</p>`:b}
489
- <p class="setup-hint" style="margin-top: 16px;">
490
- <a href="#" class="setup-link" @click=${p=>{p.preventDefault(),e.onAuthApiKeyToggle()}}>
491
- Use OAuth instead
492
- </a>
493
- </p>
494
- <p class="setup-hint">
495
- Get an API key from
496
- <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noopener">
497
- console.anthropic.com
498
- </a>
499
- </p>
500
- </div>
501
- </div>
502
- `:d`
503
- <div class="setup-container">
504
- <div class="setup-card">
505
- ${ge("auth")}
506
- <h1>Connect to Claude</h1>
507
- ${t===!1&&s?d`<p class="setup-error">${s}</p>`:d`<p>
508
- First, let's connect your Claude Pro subscription.<br />
509
- This powers your AI assistant.
510
- </p>`}
511
- <button class="setup-button primary" @click=${l}>
512
- Connect to Claude →
513
- </button>
514
- <p class="setup-hint" style="margin-top: 8px;">
515
- <a href="#" class="setup-link" @click=${p=>{p.preventDefault(),e.onAuthApiKeyToggle()}}>
516
- Or enter your API key
517
- </a>
518
- </p>
519
- <p class="setup-hint">
520
- Need a Claude subscription?
521
- <a href="https://claude.ai/upgrade" target="_blank" rel="noopener">
522
- Get Claude Pro
523
- </a>
524
- </p>
525
- </div>
526
- </div>
527
- `}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 xt(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=xt(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`
528
- <div style="display: flex; align-items: center; gap: 6px; margin-bottom: 4px;">
529
- <input
530
- type="text"
531
- .value=${e.renameWorkspaceName}
532
- @input=${o=>{e.renameWorkspaceName=o.target.value}}
533
- @keydown=${o=>{o.key==="Enter"&&i(),o.key==="Escape"&&e.onWorkspaceRenameCancel()}}
534
- 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;"
535
- autofocus
536
- />
537
- <button
538
- class="setup-status-action"
539
- @click=${i}
540
- title="Save"
541
- style="color: #22c55e;"
542
- >${N.check}</button>
543
- <button
544
- class="setup-status-action"
545
- @click=${e.onWorkspaceRenameCancel}
546
- title="Cancel"
547
- >${N.x}</button>
548
- </div>
549
- `}return d`
550
- <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px;">
551
- <div style="display: flex; align-items: center; gap: 6px;">
552
- <h2 style="margin: 0; font-size: 20px; font-weight: 600; color: var(--tasker-white);">${n}</h2>
553
- <button
554
- class="setup-status-action"
555
- @click=${e.onWorkspaceRenameStart}
556
- title="Rename"
557
- style="opacity: 0.5; transform: scale(0.8);"
558
- >${N.edit}</button>
559
- </div>
560
- <button
561
- class="setup-status-action ${s?"spinning":""}"
562
- ?disabled=${s}
563
- @click=${e.onRefreshStatus}
564
- title="Refresh Status"
565
- >
566
- ${N.rotateCw}
567
- </button>
568
- </div>
569
- `}function wr(e){return d`
570
- <div class="setup-status-item">
571
- ${le(e.gatewayHealthy===!1?"bad":"good")}
572
- <div class="setup-status-info">
573
- <strong>Gateway</strong>
574
- <span>${e.gatewayHealthMessage||"Running"}</span>
575
- </div>
576
- ${At("gateway",e)}
577
- <button
578
- class="setup-status-action ${e.gatewayRestartBusy?"spinning":""}"
579
- ?disabled=${e.gatewayRestartBusy}
580
- @click=${e.onRestartGateway}
581
- title="Restart Gateway"
582
- >
583
- ${N.rotateCw}
584
- </button>
585
- </div>
586
- `}function kr(e){const t=e.authConnected===!0;return d`
587
- <div class="setup-status-item">
588
- ${le(t?"good":"bad")}
589
- <div class="setup-status-info">
590
- <strong>Claude</strong>
591
- <span>
592
- ${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}
593
- </span>
594
- </div>
595
- ${At("claude",e)}
596
- ${t?d`
597
- <button
598
- class="setup-status-action ${e.authBusy?"spinning":""}"
599
- ?disabled=${e.authBusy}
600
- @click=${e.onStartAuth}
601
- title="Refresh Token"
602
- >
603
- ${N.rotateCw}
604
- </button>
605
- `:d`
606
- <button
607
- class="setup-status-action"
608
- @click=${e.onStartAuth}
609
- title="Connect Claude"
610
- >
611
- ${N.rotateCw}
612
- </button>
613
- `}
614
- </div>
615
- `}function Sr(e){return d`
616
- <div class="setup-status-item" style="flex-wrap: wrap;">
617
- ${le("good")}
618
- <div class="setup-status-info">
619
- <strong>License</strong>
620
- <span>Active</span>
621
- </div>
622
- ${At("license",e)}
623
- <button
624
- class="setup-status-action"
625
- @click=${()=>{e.licenseRemoveConfirm?e.onLicenseRemoveCancel():e.onLicenseRemoveConfirm()}}
626
- title="Manage License"
627
- >
628
- ${N.rotateCw}
629
- </button>
630
- ${e.licenseRemoveConfirm?d`
631
- <div style="width: 100%; margin-top: 8px; margin-left: 30px;">
632
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 0 0 8px;">
633
- Removing your license will disable ${Oe().name} until you enter a new key.
634
- </p>
635
- <div style="display: flex; gap: 8px;">
636
- <button
637
- class="setup-button danger"
638
- style="font-size: 12px; padding: 4px 12px;"
639
- ?disabled=${e.licenseBusy}
640
- @click=${e.onLicenseRemove}
641
- >
642
- ${e.licenseBusy?"Removing…":"Remove License"}
643
- </button>
644
- <button
645
- class="setup-button secondary"
646
- style="font-size: 12px; padding: 4px 12px;"
647
- @click=${e.onLicenseRemoveCancel}
648
- >
649
- Cancel
650
- </button>
651
- </div>
652
- </div>
653
- `:b}
654
- </div>
655
- `}function Ar(e){const t=xt(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`
656
- <div class="setup-status-item" style="flex-wrap: wrap;">
657
- ${le(r)}
658
- <div class="setup-status-info">
659
- <div style="display: flex; align-items: center; gap: 4px;">
660
- <strong>WhatsApp</strong>
661
- ${o&&s?d`
662
- <button
663
- class="setup-status-action"
664
- @click=${e.onWhatsAppSettingsOpen}
665
- title="WhatsApp Settings"
666
- style="opacity: 0.5; transform: scale(0.75);"
667
- >
668
- ${N.settings}
669
- </button>
670
- `:b}
671
- </div>
672
- <span>${l}</span>
673
- </div>
674
- ${At("whatsapp",e)}
675
- ${a&&c?d`
676
- <button
677
- class="setup-status-action ${e.whatsappBusy&&u?"spinning":""}"
678
- ?disabled=${e.whatsappBusy}
679
- @click=${()=>e.onWhatsAppRelink(c)}
680
- title="${s?"Relink":"Link"} WhatsApp"
681
- >
682
- ${N.rotateCw}
683
- </button>
684
- `:b}
685
- ${u&&e.whatsappLoginQrDataUrl?d`
686
- <div style="width: 100%; margin-top: 8px; margin-left: 30px;">
687
- <div class="setup-qr" style="display: inline-flex;">
688
- <img
689
- src=${e.whatsappLoginQrDataUrl}
690
- alt="WhatsApp QR"
691
- style="width: 140px; height: 140px;"
692
- />
693
- </div>
694
- ${e.whatsappLoginMessage?d`<p class="setup-hint" style="margin-top: 4px;">${e.whatsappLoginMessage}</p>`:b}
695
- </div>
696
- `:b}
697
- </div>
698
- `}const sh=[{id:"claude-opus-4-6",shortName:"Opus"},{id:"claude-sonnet-4-5-20250929",shortName:"Sonnet"},{id:"claude-haiku-4-5-20251001",shortName:"Haiku"}],ih="anthropic/claude-sonnet-4-5-20250929",oh=[{value:"off",label:"Off"},{value:"minimal",label:"Minimal"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"}];function rh(e){if(!e.whatsappSettingsOpen)return b;const t=xt(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=sh.filter(u=>r.has(u.id)),a=e.whatsappModel??ih,c=e.whatsappThinkingLevel??"off";return d`
699
- <div class="setup-info-overlay" @click=${u=>{u.target.classList.contains("setup-info-overlay")&&i()}}>
700
- <div class="setup-info-card" style="max-width: 360px;">
701
- <h3>Public Agent Settings</h3>
702
- <div style="display: flex; flex-direction: column; gap: 16px; margin-top: 12px;">
703
- <label style="display: flex; align-items: flex-start; gap: 8px; cursor: pointer;">
704
- <input
705
- type="checkbox"
706
- .checked=${e.whatsappDmPolicy!=="disabled"&&e.whatsappDmPolicy!==null}
707
- @change=${e.onWhatsAppDmToggle}
708
- style="accent-color: #22c55e; margin-top: 2px;"
709
- />
710
- <div>
711
- <div style="font-size: 13px; color: var(--tasker-white);">Enabled</div>
712
- <div style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;">Agent replies to 3rd party messages</div>
713
- </div>
714
- </label>
715
- <div style="border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;"></div>
716
- <label style="display: flex; align-items: flex-start; gap: 8px; cursor: pointer;">
717
- <input
718
- type="checkbox"
719
- .checked=${e.whatsappGroupPolicy==="open"}
720
- @change=${e.onWhatsAppGroupToggle}
721
- style="accent-color: #22c55e; margin-top: 2px;"
722
- />
723
- <div>
724
- <div style="font-size: 13px; color: var(--tasker-white);">Group chats</div>
725
- <div style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;">Agent responds in WhatsApp groups</div>
726
- </div>
727
- </label>
728
- ${e.whatsappGroupPolicy==="open"?d`
729
- <div style="display: flex; flex-direction: column; gap: 6px; padding-left: 24px;">
730
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
731
- <input
732
- type="radio"
733
- name="wa-group-mention"
734
- .checked=${e.whatsappGroupRequireMention}
735
- @change=${()=>e.onWhatsAppGroupMentionChange(!0)}
736
- style="accent-color: #22c55e;"
737
- />
738
- <div>
739
- <div style="font-size: 13px; color: var(--tasker-white);">When mentioned</div>
740
- <div style="font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;">Only responds when @mentioned</div>
741
- </div>
742
- </label>
743
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
744
- <input
745
- type="radio"
746
- name="wa-group-mention"
747
- .checked=${!e.whatsappGroupRequireMention}
748
- @change=${()=>e.onWhatsAppGroupMentionChange(!1)}
749
- style="accent-color: #22c55e;"
750
- />
751
- <div>
752
- <div style="font-size: 13px; color: var(--tasker-white);">Always respond</div>
753
- <div style="font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;">Responds to every message in groups</div>
754
- </div>
755
- </label>
756
- </div>
757
- `:b}
758
- <div style="border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;"></div>
759
- ${l.length>0?d`
760
- <div style="display: flex; align-items: center; gap: 8px;">
761
- <div style="font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;">Model</div>
762
- <select
763
- class="setup-model-select"
764
- style="flex: 1;"
765
- .value=${a}
766
- @change=${u=>{e.onWhatsAppModelChange(u.target.value)}}
767
- >
768
- ${l.map(u=>d`
769
- <option value=${"anthropic/"+u.id} ?selected=${a==="anthropic/"+u.id}>
770
- ${u.shortName}
771
- </option>
772
- `)}
773
- </select>
774
- </div>
775
- `:b}
776
- <div style="display: flex; align-items: center; gap: 8px;">
777
- <div style="font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;">Thinking</div>
778
- <select
779
- class="setup-model-select"
780
- style="flex: 1;"
781
- .value=${c}
782
- @change=${u=>{e.onWhatsAppThinkingChange(u.target.value)}}
783
- >
784
- ${oh.map(u=>d`
785
- <option value=${u.value} ?selected=${c===u.value}>
786
- ${u.label}
787
- </option>
788
- `)}
789
- </select>
790
- </div>
791
- </div>
792
- <button
793
- class="setup-button secondary"
794
- style="margin-top: 20px; width: 100%; padding: 10px;"
795
- @click=${i}
796
- >
797
- Close
798
- </button>
799
- </div>
800
- </div>
801
- `}function co(e){const t=xt(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 xr(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`
802
- <div class="setup-status-item" style="flex-wrap: wrap;">
803
- ${le(i)}
804
- <div class="setup-status-info">
805
- <strong>iMessage</strong>
806
- <span>${o}</span>
807
- </div>
808
- ${At("imessage",e)}
809
- <button
810
- class="setup-status-action ${e.imessageEnabling?"spinning":""}"
811
- ?disabled=${e.imessageEnabling}
812
- @click=${e.onIMessageEnable}
813
- title="${n?"Manage iMessage":"Connect iMessage"}"
814
- >
815
- ${N.rotateCw}
816
- </button>
817
- ${b}
818
- </div>
819
- `}function ah(e){if(!e.imessageEnableConfirm)return b;const{ownerWs:t,thisWsOwns:n,anotherWsOwns:s}=co(e),i=()=>{e.onIMessageEnableCancel()};return n?d`
820
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&i()}}>
821
- <div class="setup-info-card" style="text-align: center;">
822
- <h3>iMessage</h3>
823
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
824
- iMessage is connected to this business.
825
- </p>
826
- <p style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.6; margin-bottom: 16px;">
827
- Self-chat only. Third-party iMessage DMs are not processed.
828
- </p>
829
- <button
830
- class="setup-button secondary"
831
- style="width: 100%; padding: 10px; color: #ef4444; border-color: #ef4444;"
832
- ?disabled=${e.imessageEnabling}
833
- @click=${()=>{e.onIMessageDisconnect()}}
834
- >
835
- ${e.imessageEnabling?"Disconnecting…":"Disconnect iMessage"}
836
- </button>
837
- <button
838
- class="setup-button secondary"
839
- style="width: 100%; padding: 10px; margin-top: 8px;"
840
- @click=${i}
841
- >
842
- Close
843
- </button>
844
- </div>
845
- </div>
846
- `:s?d`
847
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&i()}}>
848
- <div class="setup-info-card" style="text-align: center;">
849
- <h3>Connect iMessage</h3>
850
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
851
- iMessage is currently connected to <strong style="text-transform: capitalize;">${t}</strong>.
852
- Move it to this business?
853
- </p>
854
- <button
855
- class="setup-button primary"
856
- style="width: 100%; padding: 10px;"
857
- ?disabled=${e.imessageEnabling}
858
- @click=${()=>{e.onIMessageReassign()}}
859
- >
860
- ${e.imessageEnabling?"Connecting…":"Connect to This Business"}
861
- </button>
862
- <button
863
- class="setup-button secondary"
864
- style="width: 100%; padding: 10px; margin-top: 8px;"
865
- @click=${i}
866
- >
867
- Cancel
868
- </button>
869
- </div>
870
- </div>
871
- `:d`
872
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&i()}}>
873
- <div class="setup-info-card" style="text-align: center;">
874
- <h3>Enable iMessage</h3>
875
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
876
- ${Oe().name} will respond to messages in Messages.app for this business.
877
- </p>
878
- <button
879
- class="setup-button primary"
880
- style="width: 100%; padding: 10px;"
881
- ?disabled=${e.imessageEnabling}
882
- @click=${()=>{e.onIMessageEnableConfirm()}}
883
- >
884
- ${e.imessageEnabling?"Connecting…":"Connect"}
885
- </button>
886
- <button
887
- class="setup-button secondary"
888
- style="width: 100%; padding: 10px; margin-top: 8px;"
889
- @click=${i}
890
- >
891
- Cancel
892
- </button>
893
- </div>
894
- </div>
895
- `}function $r(e){if(!e.isMaster)return b;const t=e.apiKeyProviders,n=t.filter(i=>i.hasKey).length,s=t.length;return d`
896
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
897
- <div class="setup-status-item">
898
- ${le(n>0?"good":"bad")}
899
- <div class="setup-status-info">
900
- <strong>API Keys</strong>
901
- <span>${n} of ${s} configured</span>
902
- </div>
903
- <button
904
- class="setup-link-btn"
905
- @click=${()=>e.onApiKeyModalOpen()}
906
- >Manage</button>
907
- </div>
908
- </div>
909
- ${lh(e)}
910
- `}function lh(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`
911
- <div class="setup-info-overlay" style="align-items: flex-start; padding-top: 72px;" @click=${r=>{r.target.classList.contains("setup-info-overlay")&&e.onApiKeyModalClose()}}>
912
- <div class="setup-info-card" style="max-width: 480px;">
913
- <h3 style="margin: 0 0 4px; text-align: center;">API Keys</h3>
914
- <div class="setup-apikey-list">
915
- ${e.apiKeyError?d`<p class="setup-error" style="margin: 0;">${e.apiKeyError}</p>`:b}
916
- ${e.apiKeySuccess?d`<p class="login-success" style="margin: 0;">${e.apiKeySuccess}</p>`:b}
917
- ${t.map(r=>d`
918
- <div class="setup-apikey-row">
919
- <div class="setup-apikey-info">
920
- <strong>${r.name}</strong>
921
- <span class="setup-apikey-category">${r.category}</span>
922
- </div>
923
- <div class="setup-apikey-input">
924
- <input
925
- type="password"
926
- .value=${r.key??""}
927
- placeholder="Enter key"
928
- ?disabled=${e.apiKeyBusy}
929
- @input=${l=>o(r.id,l)}
930
- @keydown=${l=>{l.key==="Enter"&&s(r.id,l.target)}}
931
- />
932
- <button
933
- class="setup-apikey-icon-btn setup-apikey-eye"
934
- style=${r.hasKey?"":"display: none;"}
935
- title="Toggle visibility"
936
- @click=${i}
937
- >${N.eye}</button>
938
- <button
939
- class="setup-apikey-save setup-button"
940
- style="display: none;"
941
- ?disabled=${e.apiKeyBusy}
942
- @click=${l=>s(r.id,l.currentTarget)}
943
- >Save</button>
944
- ${r.hasKey?d`
945
- <button
946
- class="setup-apikey-icon-btn danger"
947
- title="Remove key"
948
- ?disabled=${e.apiKeyBusy}
949
- @click=${()=>e.onApiKeyRemove(r.id)}
950
- >${N.trash}</button>
951
- `:b}
952
- </div>
953
- </div>
954
- `)}
955
- </div>
956
- </div>
957
- </div>
958
- `}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`
959
- <div class="setup-status-item">
960
- ${le(t)}
961
- <div class="setup-status-info">
962
- <strong>Software</strong>
963
- <span>${n}</span>
964
- </div>
965
- ${At("update",e)}
966
- ${e.updateAvailable?d`
967
- <button
968
- class="setup-status-action ${s?"spinning":""}"
969
- ?disabled=${s}
970
- @click=${e.onUpdateRun}
971
- title="Update Now"
972
- >
973
- ${N.download}
974
- </button>
975
- `:d`
976
- <button
977
- class="setup-status-action ${s?"spinning":""}"
978
- ?disabled=${s}
979
- @click=${e.onUpdateCheck}
980
- title="Check for Updates"
981
- >
982
- ${N.rotateCw}
983
- </button>
984
- `}
985
- </div>
986
- `}function ch(e){const t=e.updateRunning,n=e.updateLastResult;if(!t&&!n)return b;if(t)return d`
987
- <div class="setup-info-overlay">
988
- <div class="setup-info-card" style="max-width: 400px;">
989
- <h3>Software Update</h3>
990
- ${e.updateProgressSteps.length>0?d`
991
- <div class="setup-update-progress">
992
- ${e.updateProgressSteps.map(s=>d`
993
- <div class="setup-update-step ${s.status}">
994
- <span class="setup-update-step-icon">
995
- ${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>`}
996
- </span>
997
- <span class="setup-update-step-name">${s.name}</span>
998
- ${s.durationMs!=null?d`<span class="setup-update-step-time">${Tr(s.durationMs)}</span>`:b}
999
- </div>
1000
- `)}
1001
- </div>
1002
- `:d`<div class="setup-spinner" style="margin: 16px auto;"></div>`}
1003
- ${e.updateMessage?d`<p style="text-align: center; color: var(--tasker-text-grey); font-size: 13px; margin: 12px 0 0;">${e.updateMessage}</p>`:b}
1004
- </div>
1005
- </div>
1006
- `;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`
1007
- <div class="setup-info-overlay" @click=${r=>{r.target.classList.contains("setup-info-overlay")&&e.onUpdateDismissResult()}}>
1008
- <div class="setup-info-card" style="max-width: 360px; text-align: center;">
1009
- <div style="font-size: 40px; margin-bottom: 8px;">${s?"✓":"✗"}</div>
1010
- <h3 style="color: ${s?"#22c55e":"#ef4444"};">
1011
- ${s?"Update Complete":"Update Failed"}
1012
- </h3>
1013
- <p style="color: var(--tasker-text-grey); font-size: 14px; margin: 8px 0;">
1014
- ${i}
1015
- </p>
1016
- ${o?d`<p style="color: rgba(255,255,255,0.3); font-size: 12px; margin: 4px 0 0;">${o}</p>`:b}
1017
- <button
1018
- class="setup-button secondary"
1019
- style="margin-top: 20px; width: 100%; padding: 10px;"
1020
- @click=${e.onUpdateDismissResult}
1021
- >
1022
- Close
1023
- </button>
1024
- </div>
1025
- </div>
1026
- `}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 uh(e){const t=e.accountHasPin;return d`
1027
- <div class="setup-status-item">
1028
- ${le(t?"good":"bad")}
1029
- <div class="setup-status-info">
1030
- <strong>Account PIN</strong>
1031
- <span>${t?"Set":"Not set"}</span>
1032
- </div>
1033
- <button
1034
- class="setup-link-btn"
1035
- @click=${()=>e.onAccountPinModalOpen()}
1036
- >${t?"Change":"Set PIN"}</button>
1037
- </div>
1038
- `}function dh(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`
1039
- <div class="setup-info-overlay" @click=${c=>{c.target.classList.contains("setup-info-overlay")&&e.onAccountPinModalClose()}}>
1040
- <div class="setup-info-card" style="max-width: 340px;">
1041
- <div class="setup-info-header">
1042
- <h3>${t?"Change Account PIN":"Set Account PIN"}</h3>
1043
- <button class="setup-info-close" @click=${()=>e.onAccountPinModalClose()}>
1044
- ${N.close}
1045
- </button>
1046
- </div>
1047
- <form @submit=${a} style="display: flex; flex-direction: column; gap: 12px; padding: 16px 0 8px;">
1048
- ${t?d`
1049
- <input
1050
- class="login-pin-input"
1051
- type="password"
1052
- inputmode="numeric"
1053
- pattern="[0-9]*"
1054
- minlength="4"
1055
- maxlength="6"
1056
- placeholder="Current PIN"
1057
- ?disabled=${n}
1058
- @input=${r(c=>{s=c})}
1059
- autofocus
1060
- />
1061
- `:b}
1062
- <input
1063
- class="login-pin-input"
1064
- type="password"
1065
- inputmode="numeric"
1066
- pattern="[0-9]*"
1067
- minlength="4"
1068
- maxlength="6"
1069
- placeholder="New PIN (4–6 digits)"
1070
- ?disabled=${n}
1071
- @input=${r(c=>{i=c})}
1072
- ${t?b:d`autofocus`}
1073
- />
1074
- <input
1075
- class="login-pin-input"
1076
- type="password"
1077
- inputmode="numeric"
1078
- pattern="[0-9]*"
1079
- minlength="4"
1080
- maxlength="6"
1081
- placeholder="Confirm PIN"
1082
- ?disabled=${n}
1083
- @input=${r(c=>{o=c})}
1084
- />
1085
- ${e.accountPinError?d`<p class="login-error">${e.accountPinError}</p>`:b}
1086
- ${e.accountPinSuccess?d`<p class="login-success">${e.accountPinSuccess}</p>`:b}
1087
- <button
1088
- class="login-submit"
1089
- type="submit"
1090
- ?disabled=${n}
1091
- >${n?d`<span class="login-spinner"></span>`:t?"Change PIN":"Set PIN"}</button>
1092
- </form>
1093
- </div>
1094
- </div>
1095
- `}function Cr(e){if(!e.addingWorkspace)return b;const{workspaceSaving:t}=e;return d`
1096
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1097
- <div class="setup-add-account">
1098
- <strong>New Account</strong>
1099
- <input
1100
- type="text"
1101
- class="setup-add-account-input"
1102
- placeholder=""
1103
- .value=${e.newWorkspaceName}
1104
- @input=${n=>e.onSetNewWorkspaceName(n.target.value)}
1105
- @keydown=${n=>{n.key==="Enter"&&e.newWorkspaceName.trim()&&e.newWorkspacePin.match(/^\d{4,6}$/)&&e.onWorkspaceCreate(e.newWorkspaceName,e.newWorkspacePath||void 0)}}
1106
- />
1107
- <input
1108
- type="password"
1109
- inputmode="numeric"
1110
- pattern="[0-9]*"
1111
- minlength="4"
1112
- maxlength="6"
1113
- class="setup-add-account-input"
1114
- placeholder="PIN for this account (4-6 digits)"
1115
- .value=${e.newWorkspacePin}
1116
- @input=${n=>{const s=n.target;s.value=s.value.replace(/\D/g,"").slice(0,6),e.onSetNewWorkspacePin(s.value)}}
1117
- />
1118
- <details style="margin-top: 8px;">
1119
- <summary style="cursor: pointer; font-size: 12px; color: var(--tasker-text-grey);">
1120
- Use existing workspace (advanced)
1121
- </summary>
1122
- <input
1123
- type="text"
1124
- class="setup-add-account-input"
1125
- placeholder="/path/to/workspace"
1126
- style="margin-top: 8px;"
1127
- .value=${e.newWorkspacePath}
1128
- @input=${n=>e.onSetNewWorkspacePath(n.target.value)}
1129
- />
1130
- </details>
1131
- <div class="setup-add-account-actions" style="margin-top: 8px;">
1132
- <button
1133
- class="setup-button primary"
1134
- ?disabled=${t||!e.newWorkspaceName.trim()||!e.newWorkspacePin.match(/^\d{4,6}$/)}
1135
- @click=${()=>e.onWorkspaceCreate(e.newWorkspaceName,e.newWorkspacePath||void 0)}
1136
- >
1137
- ${t?"Creating…":"Create"}
1138
- </button>
1139
- <button
1140
- class="setup-button secondary"
1141
- @click=${()=>{e.onSetAddingWorkspace(!1),e.onSetNewWorkspaceName(""),e.onSetNewWorkspacePath(""),e.onSetNewWorkspacePin("")}}
1142
- >
1143
- Cancel
1144
- </button>
1145
- </div>
1146
- </div>
1147
- </div>
1148
- `}function _r(e){const t=xt(e);return!t||t.isDefault?b:e.workspaceRemoveConfirm===t.name?d`
1149
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 12px;">
1150
- <div style="font-size: 13px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
1151
- <span style="color: var(--tasker-danger, #ef4444);">Remove "${t.displayName??t.name}" and its WhatsApp account?</span>
1152
- <button
1153
- class="setup-button danger"
1154
- style="font-size: 12px; padding: 4px 12px;"
1155
- ?disabled=${e.workspaceSaving}
1156
- @click=${()=>e.onWorkspaceRemove(t.name)}
1157
- >
1158
- ${e.workspaceSaving?"Removing…":"Remove"}
1159
- </button>
1160
- <button
1161
- class="setup-button secondary"
1162
- style="font-size: 12px; padding: 4px 12px;"
1163
- @click=${()=>e.onSetWorkspaceRemoveConfirm(null)}
1164
- >
1165
- Cancel
1166
- </button>
1167
- </div>
1168
- </div>
1169
- `:d`
1170
- <p class="setup-hint" style="margin-top: 12px;">
1171
- <a
1172
- href="#"
1173
- class="setup-link-danger"
1174
- @click=${s=>{s.preventDefault(),e.onSetWorkspaceRemoveConfirm(t.name)}}
1175
- >Remove Account</a>
1176
- </p>
1177
- `}function Mr(e){if(e.uninstallDone)return d`
1178
- <div style="margin-top: 24px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1179
- <p style="color: var(--tasker-danger, #ef4444); font-size: 13px; font-weight: 600; margin: 0 0 8px 0;">
1180
- Taskmaster has been uninstalled.
1181
- </p>
1182
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0;">
1183
- If the npm package was not removed automatically, run:<br/>
1184
- <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>
1185
- </p>
1186
- </div>
1187
- `;if(e.uninstallConfirm){const t=e.uninstallConfirmText==="UNINSTALL";return d`
1188
- <div style="margin-top: 24px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1189
- <p style="color: var(--tasker-danger, #ef4444); font-size: 13px; font-weight: 600; margin: 0 0 8px 0;">
1190
- Uninstall Taskmaster
1191
- </p>
1192
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0 0 12px 0;">
1193
- This will stop the gateway, remove all configuration, workspace files, and the npm package.
1194
- This cannot be undone.
1195
- </p>
1196
- <div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
1197
- <input
1198
- type="text"
1199
- placeholder="Type UNINSTALL to confirm"
1200
- .value=${e.uninstallConfirmText}
1201
- ?disabled=${e.uninstallBusy}
1202
- @input=${n=>e.onUninstallConfirmTextChange(n.target.value)}
1203
- 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;"
1204
- />
1205
- <button
1206
- class="setup-button danger"
1207
- style="font-size: 12px; padding: 4px 12px;"
1208
- ?disabled=${!t||e.uninstallBusy}
1209
- @click=${e.onUninstallRun}
1210
- >
1211
- ${e.uninstallBusy?"Uninstalling…":"Uninstall"}
1212
- </button>
1213
- <button
1214
- class="setup-button secondary"
1215
- style="font-size: 12px; padding: 4px 12px;"
1216
- ?disabled=${e.uninstallBusy}
1217
- @click=${e.onUninstallCancel}
1218
- >
1219
- Cancel
1220
- </button>
1221
- </div>
1222
- ${e.uninstallError?d`<p class="setup-error" style="margin-top: 8px; font-size: 12px;">${e.uninstallError}</p>`:b}
1223
- </div>
1224
- `}return d`
1225
- <p class="setup-hint" style="margin-top: 8px;">
1226
- <a
1227
- href="#"
1228
- class="setup-link-danger"
1229
- @click=${t=>{t.preventDefault(),e.onUninstallConfirm()}}
1230
- >Uninstall Taskmaster</a>
1231
- </p>
1232
- `}function ph(e){const{whatsappBusy:t,whatsappLoginMessage:n,whatsappLoginQrDataUrl:s,whatsappLoginConnected:i,whatsappChannelStatus:o}=e;if(s)return d`
1233
- <div class="setup-container">
1234
- <div class="setup-card">
1235
- <h1>Scan with WhatsApp</h1>
1236
- <p>
1237
- On your phone: WhatsApp → Settings → Linked Devices → Link a Device
1238
- </p>
1239
- <div class="setup-qr">
1240
- <img src=${s} alt="WhatsApp QR Code" />
1241
- </div>
1242
- ${t?d`<p class="setup-waiting">Waiting for scan...</p>`:d`<p class="setup-hint">
1243
- Scan the code above with your phone
1244
- </p>`}
1245
- <p class="setup-hint" style="margin-top: 16px;">
1246
- <strong>Important:</strong> If you see "${Oe().name}" in your Linked
1247
- Devices, remove it first before scanning.
1248
- </p>
1249
- <div class="setup-actions" style="margin-top: 24px;">
1250
- <button
1251
- class="setup-button secondary"
1252
- @click=${e.onWhatsAppBack}
1253
- >
1254
- ← Back
1255
- </button>
1256
- </div>
1257
- </div>
1258
- </div>
1259
- `;if(t)return d`
1260
- <div class="setup-container">
1261
- <div class="setup-card">
1262
- <div class="setup-spinner"></div>
1263
- <p>${n||"Connecting to WhatsApp..."}</p>
1264
- </div>
1265
- </div>
1266
- `;const r=o?.running&&o?.connected;return o?(e.whatsappAccounts.length>1?e.whatsappAccounts.every(u=>u.running&&u.connected):r)&&e.authConnected?d`
1267
- <div class="setup-container">
1268
- <div class="setup-card setup-success">
1269
- ${br(e)}
1270
- <div class="setup-status-dashboard">
1271
- ${wr(e)}
1272
- ${kr(e)}
1273
- ${Sr(e)}
1274
- ${Ar(e)}
1275
- ${xr(e)}
1276
- ${uh(e)}
1277
- ${Er(e)}
1278
- </div>
1279
-
1280
- ${dh(e)}
1281
- ${$r(e)}
1282
- ${Cr(e)}
1283
- ${_r(e)}
1284
- ${Mr(e)}
1285
- ${e.workspacesError?d`<p class="setup-error" style="margin-top: 8px;">${e.workspacesError}</p>`:b}
1286
- </div>
1287
- </div>
1288
- `:d`
1289
- <div class="setup-container">
1290
- <div class="setup-card">
1291
- ${br(e)}
1292
- <div class="setup-status-dashboard">
1293
- ${wr(e)}
1294
- ${kr(e)}
1295
- ${Sr(e)}
1296
- ${Ar(e)}
1297
- ${xr(e)}
1298
- ${Er(e)}
1299
- </div>
1300
-
1301
- ${$r(e)}
1302
- ${Cr(e)}
1303
- ${_r(e)}
1304
- ${Mr(e)}
1305
- ${e.workspacesError?d`<p class="setup-error" style="margin-top: 8px;">${e.workspacesError}</p>`:b}
1306
- </div>
1307
- </div>
1308
- `:o?i===!1&&n&&!t?d`
1309
- <div class="setup-container">
1310
- <div class="setup-card">
1311
- ${ge("whatsapp")}
1312
- <div class="setup-status-row">
1313
- ${le("bad")}
1314
- <span>Connection Failed</span>
1315
- </div>
1316
- <p class="setup-error">${n}</p>
1317
- <button
1318
- class="setup-button primary"
1319
- ?disabled=${t}
1320
- @click=${e.onWhatsAppRelink}
1321
- >
1322
- Try Again
1323
- </button>
1324
- </div>
1325
- </div>
1326
- `:d`
1327
- <div class="setup-container">
1328
- <div class="setup-card">
1329
- ${ge("whatsapp")}
1330
- ${n?d`<p class="setup-error">${n}</p>`:d`<div class="setup-spinner"></div>
1331
- <p>Preparing...</p>`}
1332
- </div>
1333
- </div>
1334
- `:d`
1335
- <div class="setup-container">
1336
- <div class="setup-card">
1337
- ${ge("whatsapp")}
1338
- <div class="setup-spinner"></div>
1339
- <p>Checking connection status...</p>
1340
- <button
1341
- class="setup-button secondary"
1342
- style="margin-top: 16px;"
1343
- @click=${e.onRefreshStatus}
1344
- >
1345
- Refresh Status
1346
- </button>
1347
- </div>
1348
- </div>
1349
- `}function hh(e){const{connected:t,currentStep:n}=e;if(e.uninstallDone||_l())return d`
1350
- <div class="setup-container">
1351
- <div class="setup-card">
1352
- <p style="color: var(--tasker-danger, #ef4444); font-size: 16px; font-weight: 600; margin: 0 0 12px 0;">
1353
- Taskmaster has been uninstalled.
1354
- </p>
1355
- <p style="font-size: 13px; color: var(--tasker-text-grey); margin: 0 0 16px 0;">
1356
- The gateway service, configuration, and workspace files have been removed.
1357
- </p>
1358
- <p style="font-size: 13px; color: var(--tasker-text-grey); margin: 0 0 16px 0;">
1359
- If the npm package was not removed automatically, run:
1360
- </p>
1361
- <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>
1362
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0;">You can close this tab.</p>
1363
- </div>
1364
- </div>
1365
- `;if(!t){const o=e.updateRunning;return d`
1366
- <div class="setup-container">
1367
- <div class="setup-card">
1368
- <div class="setup-spinner"></div>
1369
- <p>${o?"Restarting gateway after update…":"Connecting to gateway..."}</p>
1370
- </div>
1371
- </div>
1372
- `}let s;switch(n){case"license":s=vr(e);break;case"auth":s=nh(e);break;case"whatsapp":case"complete":s=ph(e);break;default:s=vr(e)}const i=tt("Setup",e.wsProps);return d`${s}${th(e)}${ah(e)}${rh(e)}${ch(e)}${i}`}function fh(e,t){const n=e.paired?"Paired phone (used to link WhatsApp)":"Admin access via WhatsApp DM";return d`
1373
- <div class="sp-list-item">
1374
- <div class="sp-list-item-main">
1375
- <div class="sp-list-item-title">${e.phone}</div>
1376
- <div class="sp-list-item-sub">${n}</div>
1377
- </div>
1378
- ${e.paired?d`<span style="color: var(--tasker-orange); font-size: 13px; padding: 8px 16px;">Primary</span>`:d`<button
1379
- class="setup-button danger"
1380
- style="padding: 8px 16px; font-size: 13px;"
1381
- ?disabled=${t.saving}
1382
- @click=${()=>t.onRemove(e.phone)}
1383
- >
1384
- Remove
1385
- </button>`}
1386
- </div>
1387
- `}function gh(e){if(!e.connected)return d`
1388
- <div class="setup-container">
1389
- <div class="setup-card">
1390
- <div class="setup-spinner"></div>
1391
- <p>Connecting to gateway...</p>
1392
- </div>
1393
- </div>
1394
- `;const t=n=>{n.preventDefault(),e.newPhone.trim()&&e.onAdd(e.newPhone)};return d`
1395
- <div class="setup-container">
1396
- ${tt("Admins",e.wsProps)}
1397
- <div class="setup-card" style="max-width: 520px;">
1398
- <h1>Admin Phones</h1>
1399
- <p style="margin-bottom: 16px;">
1400
- Phone numbers that route to the admin agent instead of the public agent.
1401
- </p>
1402
-
1403
- <div class="sp-toolbar">
1404
- <button
1405
- class="setup-button secondary"
1406
- style="padding: 10px 20px; font-size: 14px;"
1407
- ?disabled=${e.loading}
1408
- @click=${e.onRefresh}
1409
- >
1410
- ${e.loading?"Loading...":"Refresh"}
1411
- </button>
1412
- </div>
1413
-
1414
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
1415
-
1416
- <form style="display: flex; flex-direction: row; gap: 12px; margin-top: 20px; align-items: stretch;" @submit=${t}>
1417
- <input
1418
- type="tel"
1419
- 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;"
1420
- placeholder="+44..."
1421
- .value=${e.newPhone}
1422
- @input=${n=>e.onNewPhoneChange(n.target.value)}
1423
- ?disabled=${e.saving}
1424
- />
1425
- <button
1426
- type="submit"
1427
- class="setup-button primary"
1428
- style="padding: 10px 20px; font-size: 14px; flex-shrink: 0;"
1429
- ?disabled=${e.saving||!e.newPhone.trim()}
1430
- >
1431
- ${e.saving?"Saving...":"Add"}
1432
- </button>
1433
- </form>
1434
-
1435
- <div class="sp-list" style="margin-top: 20px;">
1436
- ${e.phones.length===0?d`<div class="sp-list-empty">No admin phones configured yet.</div>`:e.phones.map(n=>fh(n,e))}
1437
- </div>
1438
-
1439
- <div class="setup-hint" style="margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;">
1440
- <strong style="color: var(--tasker-white);">How it works:</strong><br/>
1441
- 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.
1442
- 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.
1443
- </div>
1444
-
1445
- </div>
1446
- </div>
1447
- `}function mh(e){return Object.keys(e.fields).length}function yh(e,t){const n=Object.entries(e.fields);return d`
1448
- <div class="customers-record-fields">
1449
- ${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`
1450
- <div class="customers-field-row">
1451
- <input
1452
- class="field-key"
1453
- type="text"
1454
- .value=${s}
1455
- disabled
1456
- title="Field name"
1457
- />
1458
- <input
1459
- class="field-value"
1460
- type="text"
1461
- .value=${i}
1462
- @change=${o=>t.onSetField(e.id,s,o.target.value)}
1463
- ?disabled=${t.saving}
1464
- title="Field value"
1465
- />
1466
- <button
1467
- class="setup-button danger field-delete"
1468
- ?disabled=${t.saving}
1469
- @click=${()=>t.onDeleteField(e.id,s)}
1470
- >
1471
- ×
1472
- </button>
1473
- </div>
1474
- `)}
1475
- <div class="customers-record-actions">
1476
- <button
1477
- class="setup-button secondary"
1478
- style="font-size: 13px; padding: 8px 14px;"
1479
- ?disabled=${t.saving}
1480
- @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)}}
1481
- >
1482
- + Add Field
1483
- </button>
1484
- <button
1485
- class="setup-button danger"
1486
- style="font-size: 13px; padding: 8px 14px;"
1487
- ?disabled=${t.saving}
1488
- @click=${()=>{confirm(`Delete customer "${e.name}" (${e.id})?`)&&t.onDelete(e.id)}}
1489
- >
1490
- Delete Customer
1491
- </button>
1492
- </div>
1493
- </div>
1494
- `}function vh(e,t){const n=t.editingId===e.id,s=mh(e),i=s===0?"No fields":`${s} field${s>1?"s":""}`;return d`
1495
- <div class="customers-record">
1496
- <div
1497
- class="customers-record-header"
1498
- @click=${()=>t.onToggleExpand(e.id)}
1499
- >
1500
- <div class="customers-record-info">
1501
- <span class="customers-record-name">${e.name}</span>
1502
- <span class="customers-record-phone">${e.id}</span>
1503
- </div>
1504
- <span class="customers-record-meta">${i}</span>
1505
- </div>
1506
- ${n?yh(e,t):b}
1507
- </div>
1508
- `}function bh(e){if(!e.connected)return d`
1509
- <div class="setup-container">
1510
- <div class="setup-card">
1511
- <div class="setup-spinner"></div>
1512
- <p>Connecting to gateway...</p>
1513
- </div>
1514
- </div>
1515
- `;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`
1516
- <div class="setup-container">
1517
- ${tt("Customers",e.wsProps)}
1518
- <div class="setup-card" style="max-width: 620px;">
1519
- <h1>Customer Records</h1>
1520
- <p style="margin-bottom: 16px;">
1521
- Verified customer data managed by the business owner. Agents can read these records but cannot modify them.
1522
- </p>
1523
-
1524
- <div class="sp-toolbar" style="display: flex; gap: 8px;">
1525
- <button
1526
- class="setup-button secondary"
1527
- style="padding: 10px 20px; font-size: 14px;"
1528
- ?disabled=${e.loading}
1529
- @click=${e.onRefresh}
1530
- >
1531
- ${e.loading?"Loading...":"Refresh"}
1532
- </button>
1533
- <button
1534
- class="setup-button primary"
1535
- style="padding: 10px 20px; font-size: 14px;"
1536
- @click=${e.onShowAddForm}
1537
- >
1538
- + Add Customer
1539
- </button>
1540
- </div>
1541
-
1542
- ${e.error?d`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:b}
1543
-
1544
- ${e.showAddForm?d`
1545
- <form class="customers-add-form" @submit=${n}>
1546
- <input
1547
- type="tel"
1548
- placeholder="+447490553305"
1549
- .value=${e.newRecordPhone}
1550
- @input=${s=>e.onNewRecordPhoneChange(s.target.value)}
1551
- ?disabled=${e.saving}
1552
- />
1553
- <input
1554
- type="text"
1555
- placeholder="Customer name"
1556
- .value=${e.newRecordName}
1557
- @input=${s=>e.onNewRecordNameChange(s.target.value)}
1558
- ?disabled=${e.saving}
1559
- />
1560
- <div class="customers-add-form-buttons">
1561
- <button
1562
- type="submit"
1563
- class="setup-button primary"
1564
- style="padding: 10px 20px; font-size: 14px;"
1565
- ?disabled=${e.saving||!e.newRecordPhone.trim()||!e.newRecordName.trim()}
1566
- >
1567
- ${e.saving?"Saving...":"Add"}
1568
- </button>
1569
- <button
1570
- type="button"
1571
- class="setup-button secondary"
1572
- style="padding: 10px 20px; font-size: 14px;"
1573
- @click=${e.onCancelAddForm}
1574
- >
1575
- Cancel
1576
- </button>
1577
- </div>
1578
- </form>
1579
- `:b}
1580
-
1581
- <form
1582
- class="customers-search"
1583
- style="margin-top: 16px;"
1584
- @submit=${t}
1585
- >
1586
- <input
1587
- type="text"
1588
- placeholder="Search by name or phone..."
1589
- .value=${e.searchQuery}
1590
- @input=${s=>e.onSearch(s.target.value)}
1591
- />
1592
- <button
1593
- type="submit"
1594
- class="setup-button secondary"
1595
- style="padding: 10px 20px; font-size: 14px; flex-shrink: 0;"
1596
- >
1597
- Search
1598
- </button>
1599
- </form>
1600
-
1601
- <div style="margin-top: 16px;">
1602
- ${e.records.length===0?d`<div class="customers-empty">
1603
- ${e.searchQuery.trim()?`No records matching "${e.searchQuery}".`:"No customer records yet. Add one to get started."}
1604
- </div>`:e.records.map(s=>vh(s,e))}
1605
- </div>
1606
-
1607
- <div class="setup-hint" style="margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;">
1608
- <strong style="color: var(--tasker-white);">How it works:</strong><br/>
1609
- Records stored here are <strong>read-only for agents</strong> — they use the
1610
- <code style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);">customer_lookup</code>
1611
- tool to check payment status and account details, but cannot modify them. This prevents prompt injection from altering sensitive data.
1612
- </div>
1613
- </div>
1614
- </div>
1615
- `}const Ml={CHILD:2},Ll=e=>(...t)=>({_$litDirective$:e,values:t});let Pl=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:wh}=gu,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 wh(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),kh={},Sh=(e,t=kh)=>e._$AH=t,Ah=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},xh=Ll(class extends Pl{constructor(e){if(super(e),e.type!==Ml.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=Ah(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 x=u.get(r[v]),_=x!==void 0?i[x]: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[x]=null;v++}else Fs(i[m]),m--;else Fs(i[p]),p++;for(;v<=w;){const x=Lt(e,a[w+1]);je(x,o[v]),a[v++]=x}for(;p<=m;){const x=i[p++];x!==null&&Fs(x)}return this.ut=r,Sh(e,a),Ne}});class gi extends Pl{constructor(t){if(super(t),this.it=b,t.type!==Ml.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=Ll(gi);const{entries:Rl,setPrototypeOf:Ir,isFrozen:$h,getPrototypeOf:Eh,getOwnPropertyDescriptor:Th}=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 xn=oe(Array.prototype.forEach),Ch=oe(Array.prototype.lastIndexOf),Nr=oe(Array.prototype.pop),Pt=oe(Array.prototype.push),_h=oe(Array.prototype.splice),Nn=oe(String.prototype.toLowerCase),Us=oe(String.prototype.toString),Ws=oe(String.prototype.match),Rt=oe(String.prototype.replace),Mh=oe(String.prototype.indexOf),Lh=oe(String.prototype.trim),pe=oe(Object.prototype.hasOwnProperty),ne=oe(RegExp.prototype.test),It=Ph(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 Ph(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&&($h(t)||(t[s]=o),i=o)}e[i]=!0}return e}function Rh(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 Rl(e))pe(e,n)&&(Array.isArray(s)?t[n]=Rh(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=Th(e,t);if(s){if(s.get)return oe(s.get);if(typeof s.value=="function")return oe(s.value)}e=Eh(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"]),Ih=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"]),Nh=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"]),Dh=ce(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Oh=ce(/<%[\w\W]*|[\w\W]*%>/gm),Bh=ce(/\$\{[\w\W]*/gm),Fh=ce(/^data-[\-\w.\u00B7-\uFFFF]+$/),Uh=ce(/^aria-[\-\w]+$/),Il=ce(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),Wh=ce(/^(?:\w+script|data):/i),Kh=ce(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Nl=ce(/^html$/i),zh=ce(/^[a-z][.\w]*(-[.\w]+)+$/i);var Ur=Object.freeze({__proto__:null,ARIA_ATTR:Uh,ATTR_WHITESPACE:Kh,CUSTOM_ELEMENT:zh,DATA_ATTR:Fh,DOCTYPE_NAME:Nl,ERB_EXPR:Oh,IS_ALLOWED_URI:Il,IS_SCRIPT_OR_DATA:Wh,MUSTACHE_EXPR:Dh,TMPLIT_EXPR:Bh});const Dt={element:1,text:3,progressingInstruction:7,comment:8,document:9},jh=function(){return typeof window>"u"?null:window},Hh=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 Dl(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:jh();const t=T=>Dl(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,x=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 Rl=="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,A=!1,M=!0,L=!1,K=!0,F=!1,te=!1,Le=!1,rt=!1,hn=!1,fn=!1,Co=!0,_o=!1;const Fc="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 As=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,xs=!1,$s=null;const Uc=R({},[gn,mn,Se],Us);let yn=R({},["mi","mo","mn","ms","mtext"]),vn=R({},["annotation-xml"]);const Wc=R({},["title","style","font","a","script"]);let _t=null;const Kc=["application/xhtml+xml","text/html"],zc="text/html";let V=null,ct=null;const jc=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=Kc.indexOf(y.PARSER_MEDIA_TYPE)===-1?zc: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):Uc,As=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,A=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||Il,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(As,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=Hh(v,i)),I!==null&&typeof B=="string"&&(B=I.createHTML(""));ie&&ie(y),ct=y}},Io=R({},[...Ks,...zs,...Ih]),No=R({},[...js,...Nh]),Hc=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]&&(Wc[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=xs?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 Ae(T,y,S){xn(T,E=>{E.call(t,y,S,ct)})}const Fo=function(y){let S=null;if(Ae(Q.beforeSanitizeElements,y,null),Ts(y))return ye(y),!0;const E=V(y.nodeName);if(Ae(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 xe=x(Z[re],!0);xe.__removalCount=(y.__removalCount||0)+1,U.insertBefore(xe,j(y))}}}return ye(y),!0}return y instanceof a&&!Hc(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,xn([Et,ot,Ue],U=>{S=Rt(S,U," ")}),y.textContent!==S&&(Pt(t.removed,{element:y.cloneNode()}),y.textContent=S)),Ae(Q.afterSanitizeElements,y,null),!1)},Uo=function(y,S,E){if(Co&&(S==="id"||S==="name")&&(E in n||E in jc))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(!As[S]){if(!ne(cn,Rt(E,ln,""))){if(!((S==="src"||S==="xlink:href"||S==="href")&&y!=="script"&&Mh(E,"data:")===0&&Mo[y])){if(!(A&&!ne(bs,Rt(E,ln,"")))){if(E)return!1}}}}}}}return!0},Wo=function(y){return y!=="annotation-xml"&&Ws(y,ws)},Ko=function(y){Ae(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:xe}=Z,ut=V(G),Cs=xe;let X=G==="value"?Cs:Lh(Cs);if(E.attrName=ut,E.attrValue=X,E.keepAttr=!0,E.forceKeepAttr=void 0,Ae(Q.uponSanitizeAttribute,y,E),X=E.attrValue,_o&&(ut==="id"||ut==="name")&&(Ke(G,y),X=Fc+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&&xn([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)}}Ae(Q.afterSanitizeAttributes,y,null)},qc=function T(y){let S=null;const E=Oo(y);for(Ae(Q.beforeSanitizeShadowDOM,y,null);S=E.nextNode();)Ae(Q.uponSanitizeShadowNode,S,null),Fo(S),Ko(S),S.content instanceof o&&T(S.content);Ae(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(xs=!T,xs&&(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 xe=V(T.nodeName);if(!H[xe]||We[xe])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&&qc(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(Nl,S.ownerDocument.doctype.name)&&(re="<!DOCTYPE "+S.ownerDocument.doctype.name+`>
1616
- `+re),L&&xn([Et,ot,Ue],xe=>{re=Rt(re,xe," ")}),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=Ch(Q[T],y);return S===-1?void 0:_h(Q[T],S,1)[0]}return Nr(Q[T])},t.removeHooks=function(T){Q[T]=[]},t.removeAllHooks=function(){Q=Wr()},t}var wi=Dl();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 Ol(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 qh=(()=>{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")},Gh=/^(?:[ \t]*(?:\n|$))+/,Vh=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Yh=/^ {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+|$)/,Qh=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,po=/(?:[*+-]|\d{1,9}[.)])/,Bl=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Fl=D(Bl).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(),Xh=D(Bl).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]+)*)/,Zh=/^[^\n]+/,fo=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,Jh=D(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",fo).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),ef=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]*?(?:-->|$))/,tf=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(),Ul=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(),nf=D(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",Ul).getRegex(),mo={blockquote:nf,code:Vh,def:Jh,fences:Yh,heading:Qh,hr:nn,html:tf,lheading:Fl,list:ef,newline:Gh,paragraph:Ul,table:Gt,text:Zh},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(),sf={...mo,lheading:Xh,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()},of={...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} *[^
1617
- ]`).replace("lheading",Fl).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},rf=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,af=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Wl=/^( {2,}|\\)\n(?!\s*$)/,lf=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,ps=/[\p{P}\p{S}]/u,yo=/[\s\p{P}\p{S}]/u,Kl=/[^\s\p{P}\p{S}]/u,cf=D(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,yo).getRegex(),zl=/(?!~)[\p{P}\p{S}]/u,uf=/(?!~)[\s\p{P}\p{S}]/u,df=/(?:[^\s\p{P}\p{S}]|~)/u,pf=D(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",qh?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),jl=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,hf=D(jl,"u").replace(/punct/g,ps).getRegex(),ff=D(jl,"u").replace(/punct/g,zl).getRegex(),Hl="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",gf=D(Hl,"gu").replace(/notPunctSpace/g,Kl).replace(/punctSpace/g,yo).replace(/punct/g,ps).getRegex(),mf=D(Hl,"gu").replace(/notPunctSpace/g,df).replace(/punctSpace/g,uf).replace(/punct/g,zl).getRegex(),yf=D("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Kl).replace(/punctSpace/g,yo).replace(/punct/g,ps).getRegex(),vf=D(/\\(punct)/,"gu").replace(/punct/g,ps).getRegex(),bf=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(),wf=D(go).replace("(?:-->|$)","-->").getRegex(),kf=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",wf).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Vn=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,Sf=D(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",Vn).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ql=D(/^!?\[(label)\]\[(ref)\]/).replace("label",Vn).replace("ref",fo).getRegex(),Gl=D(/^!?\[(ref)\](?:\[\])?/).replace("ref",fo).getRegex(),Af=D("reflink|nolink(?!\\()","g").replace("reflink",ql).replace("nolink",Gl).getRegex(),zr=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,vo={_backpedal:Gt,anyPunctuation:vf,autolink:bf,blockSkip:pf,br:Wl,code:af,del:Gt,emStrongLDelim:hf,emStrongRDelimAst:gf,emStrongRDelimUnd:yf,escape:rf,link:Sf,nolink:Gl,punctuation:cf,reflink:ql,reflinkSearch:Af,tag:kf,text:lf,url:Gt},xf={...vo,link:D(/^!?\[(label)\]\((.*?)\)/).replace("label",Vn).getRegex(),reflink:D(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Vn).getRegex()},ki={...vo,emStrongRDelimAst:mf,emStrongLDelim:ff,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()},$f={...ki,br:D(Wl).replace("{2,}","*").getRegex(),text:D(ki.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},En={normal:mo,gfm:sf,pedantic:of},Ot={normal:vo,gfm:ki,breaks:$f,pedantic:xf},Ef={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},jr=e=>Ef[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 Tf(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 Cf(e,t,n){let s=e.match(n.other.indentCodeCompensation);if(s===null)return t;let i=s[1];return t.split(`
1618
- `).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(`
1619
- `)}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,`
1620
- `)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],s=Cf(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],`
1621
- `)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=Bt(t[0],`
1622
- `).split(`
1623
- `),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(`
1624
- `),u=c.replace(this.rules.other.blockquoteSetextReplace,`
1625
- $1`).replace(this.rules.other.blockquoteSetextReplace2,"");s=s?`${s}
1626
- ${c}`:c,i=i?`${i}
1627
- ${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+`
1628
- `+n.join(`
1629
- `),x=this.blockquote(w);o[o.length-1]=x,s=s.substring(0,s.length-v.raw.length)+x.raw,i=i.substring(0,i.length-v.text.length)+x.text;break}else if(m?.type==="list"){let v=m,w=v.raw+`
1630
- `+n.join(`
1631
- `),x=this.list(w);o[o.length-1]=x,s=s.substring(0,s.length-m.raw.length)+x.raw,i=i.substring(0,i.length-v.raw.length)+x.raw,n=w.substring(o.at(-1).raw.length).split(`
1632
- `);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(`
1633
- `,1)[0].replace(this.rules.other.listReplaceTabs,x=>" ".repeat(3*x.length)),m=e.split(`
1634
- `,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+`
1635
- `,e=e.substring(m.length+1),a=!0),!a){let x=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(`
1636
- `,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)||x.test(m)||_.test(m))break;if(B.search(this.rules.other.nonSpaceChar)>=w||!m.trim())u+=`
1637
- `+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+=`
1638
- `+m}!v&&!m.trim()&&(v=!0),c+=I+`
1639
- `,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(`
1640
- `):[],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)===`
1641
- `?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=Tf(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,`
1642
- `),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+=`
1643
- `: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(`
1644
- `)?"":`
1645
- `)+i.raw,r.text+=`
1646
- `+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(`
1647
- `)?"":`
1648
- `)+i.raw,r.text+=`
1649
- `+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(`
1650
- `)?"":`
1651
- `)+i.raw,r.text+=`
1652
- `+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(`
1653
- `)?"":`
1654
- `)+i.raw,r.text+=`
1655
- `+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,"")+`
1656
- `;return s?'<pre><code class="language-'+Ee(s)+'">'+(n?i:Ee(i,!0))+`</code></pre>
1657
- `:"<pre><code>"+(n?i:Ee(i,!0))+`</code></pre>
1658
- `}blockquote({tokens:e}){return`<blockquote>
1659
- ${this.parser.parse(e)}</blockquote>
1660
- `}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
1661
- `}hr(e){return`<hr>
1662
- `}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+`>
1663
- `+s+"</"+i+`>
1664
- `}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
1665
- `}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
1666
- `}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>
1667
- <thead>
1668
- `+t+`</thead>
1669
- `+s+`</table>
1670
- `}tablerow({text:e}){return`<tr>
1671
- ${e}</tr>
1672
- `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
1673
- `}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 Ai{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 Ai(n).parse(t)}static parseInline(t,n){return new Ai(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}},_f=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+=`
1674
- 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 _f;function O(e,t){return Ze.parse(e,t)}O.options=O.setOptions=function(e){return Ze.setOptions(e),O.defaults=Ze.defaults,Ol(O.defaults),O};O.getDefaults=uo;O.defaults=nt;O.use=function(...e){return Ze.use(...e),O.defaults=Ze.defaults,Ol(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 Mf=14e4,Lf=4e4,Pf=200,qs=5e4,Ge=new Map;function Rf(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<=Pf)return;const n=Ge.keys().next().value;n&&Ge.delete(n)}function If(){Qr||(Qr=!0,wi.addHook("afterSanitizeAttributes",e=>{!(e instanceof HTMLAnchorElement)||!e.getAttribute("href")||(e.setAttribute("rel","noreferrer noopener"),e.setAttribute("target","_blank"))}))}function xi(e){const t=e.trim();if(!t)return"";if(If(),t.length<=qs){const r=Rf(t);if(r!==null)return r}const n=Na(t,Mf),s=n.truncated?`
1675
-
1676
- … truncated (${n.total} chars, showing first ${n.text.length}).`:"";if(n.text.length>Lf){const l=`<pre class="code-block">${Nf(`${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 Nf(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const Df=1500,Of=2e3,Vl="Copy as markdown",Bf="Copied",Ff="Copy failed";async function Uf(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 Wf(e){const t=e.label??Vl;return d`
1677
- <button
1678
- class="chat-copy-btn"
1679
- type="button"
1680
- title=${t}
1681
- aria-label=${t}
1682
- @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 Uf(e.text());if(s.isConnected){if(delete s.dataset.copying,s.removeAttribute("aria-busy"),s.disabled=!1,!i){s.dataset.error="1",Tn(s,Ff),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.error,Tn(s,t))},Of);return}s.dataset.copied="1",Tn(s,Bf),window.setTimeout(()=>{s.isConnected&&(delete s.dataset.copied,Tn(s,t))},Df)}}}
1683
- >
1684
- <span class="chat-copy-btn__icon" aria-hidden="true">
1685
- <span class="chat-copy-btn__icon-copy">${N.copy}</span>
1686
- <span class="chat-copy-btn__icon-check">${N.check}</span>
1687
- </span>
1688
- </button>
1689
- `}function Kf(e){return Wf({text:()=>e,label:Vl})}function zf(e){const t=e,n=jf(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:Hf(i.arguments??i.args)})}for(const i of n){const o=String(i.type??"").toLowerCase();if(o!=="toolresult"&&o!=="tool_result")continue;const r=qf(i),l=typeof i.name=="string"?i.name:"tool";s.push({kind:"result",name:l,text:r})}if(Fa(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=Da(e)??void 0;s.push({kind:"result",name:i,text:o})}return s}function jf(e){return Array.isArray(e)?e.filter(Boolean):[]}function Hf(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 qf(e){if(typeof e.text=="string")return e.text;if(typeof e.content=="string")return e.content}function Gf(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 Vf(e){return d`
1690
- <div class="chat-group assistant">
1691
- <div class="chat-group-messages">
1692
- <div class="chat-bubble chat-reading-indicator" aria-hidden="true">
1693
- <span class="chat-reading-indicator__dots">
1694
- <span></span><span></span><span></span>
1695
- </span>
1696
- </div>
1697
- </div>
1698
- </div>
1699
- `}function Yf(e,t,n,s){return d`
1700
- <div class="chat-group assistant">
1701
- <div class="chat-group-messages">
1702
- ${Yl({role:"assistant",content:[{type:"text",text:e}],timestamp:t},{isStreaming:!1,showReasoning:!1})}
1703
- </div>
1704
- </div>
1705
- `}function Qf(e,t){const n=Ba(e.role),s=n==="user"?"user":n==="assistant"?"assistant":"other",i=new Date(e.timestamp).toLocaleTimeString([],{hour:"numeric",minute:"2-digit"});return d`
1706
- <div class="chat-group ${s}">
1707
- <div class="chat-group-messages">
1708
- ${e.messages.map((o,r)=>Yl(o.message,{isStreaming:e.isStreaming&&r===e.messages.length-1,showReasoning:t.showReasoning}))}
1709
- <div class="chat-group-footer">
1710
- <span class="chat-group-timestamp">${i}</span>
1711
- </div>
1712
- </div>
1713
- </div>
1714
- `}function Xf(e){return e.length===0?b:d`
1715
- <div class="chat-message-images">
1716
- ${e.map(t=>d`
1717
- <img
1718
- src=${t.url}
1719
- alt=${t.alt??"Attached image"}
1720
- class="chat-message-image"
1721
- @click=${()=>window.open(t.url,"_blank")}
1722
- />
1723
- `)}
1724
- </div>
1725
- `}function Yl(e,t,n){const s=e,i=typeof s.role=="string"?s.role:"unknown",o=Fa(e)||i.toLowerCase()==="toolresult"||i.toLowerCase()==="tool_result"||typeof s.toolCallId=="string"||typeof s.tool_call_id=="string",l=zf(e).length>0,a=Gf(e),c=a.length>0,u=Da(e),p=t.showReasoning&&i==="assistant"?Nu(e):null,m=u?.trim()?u:null,v=p?Ou(p):null,w=m,x=(i==="assistant"||i==="user")&&!!w?.trim(),_=["chat-bubble",x?"has-copy":"",t.isStreaming?"streaming":"","fade-in"].filter(Boolean).join(" ");return!w&&(l||o)||!w&&!c?b:d`
1726
- <div class="${_}">
1727
- ${x?Kf(w):b}
1728
- ${Xf(a)}
1729
- ${v?d`<div class="chat-thinking">${mi(xi(v))}</div>`:b}
1730
- ${w?d`<div class="chat-text">${mi(xi(w))}</div>`:b}
1731
- </div>
1732
- `}function Zf(e){return d`
1733
- <div class="sidebar-panel">
1734
- <div class="sidebar-header">
1735
- <div class="sidebar-title">Tool Output</div>
1736
- <button @click=${e.onClose} class="btn" title="Close sidebar">
1737
- ${N.x}
1738
- </button>
1739
- </div>
1740
- <div class="sidebar-content">
1741
- ${e.error?d`
1742
- <div class="callout danger">${e.error}</div>
1743
- <button @click=${e.onViewRawText} class="btn" style="margin-top: 12px;">
1744
- View Raw Text
1745
- </button>
1746
- `:e.content?d`<div class="sidebar-markdown">${mi(xi(e.content))}</div>`:d`<div class="muted">No content available</div>`}
1747
- </div>
1748
- </div>
1749
- `}var Jf=Object.defineProperty,eg=Object.getOwnPropertyDescriptor,hs=(e,t,n,s)=>{for(var i=s>1?void 0:s?eg(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&&Jf(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=Qc`
1750
- :host {
1751
- width: 4px;
1752
- cursor: col-resize;
1753
- background: var(--border, #333);
1754
- transition: background 150ms ease-out;
1755
- flex-shrink: 0;
1756
- position: relative;
1757
- }
1758
-
1759
- :host::before {
1760
- content: "";
1761
- position: absolute;
1762
- top: 0;
1763
- left: -4px;
1764
- right: -4px;
1765
- bottom: 0;
1766
- }
1767
-
1768
- :host(:hover) {
1769
- background: var(--accent, #007bff);
1770
- }
1771
-
1772
- :host(.dragging) {
1773
- background: var(--accent, #007bff);
1774
- }
1775
- `;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([Ma("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 tg=1,ng=1,st="emoji",St="keyvalue",wo="favorites",sg="tokens",Ql="tokens",ig="unicode",Xl="count",og="group",rg="order",Zl="group-order",$i="eTag",Xn="url",Zr="skinTone",$t="readonly",ko="readwrite",Jl="skinUnicodes",ag="skinUnicodes",lg="https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json",cg="en";function ug(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 ug(e,t=>t.unicode)}function dg(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,ig,{[Ql]:[sg,!0],[Zl]:[[og,rg]],[Jl]:[ag,!0]}),t(wo,void 0,{[Xl]:[""]})}const Ei={},Dn={},Zn={};function ec(e,t,n){n.onerror=()=>t(n.error),n.onblocked=()=>t(new Error("IDB blocked")),n.onsuccess=()=>e(n.result)}async function pg(e){const t=await new Promise((n,s)=>{const i=indexedDB.open(e,tg);Ei[e]=i,i.onupgradeneeded=o=>{o.oldVersion<ng&&dg(i.result)},ec(n,s,i)});return t.onclose=()=>So(e),t}function hg(e){return Dn[e]||(Dn[e]=pg(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 fg(e){return new Promise((t,n)=>{So(e);const s=indexedDB.deleteDatabase(e);ec(t,n,s)})}function gg(e,t){let n=Zn[e];n||(n=Zn[e]=[]),n.push(t)}const mg=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/)||mg.has(t)?t.toLowerCase():t.replace(/[)(:,]/g,"").replace(/’/g,"'").toLowerCase()).filter(Boolean)}const yg=2;function tc(e){return e.filter(Boolean).map(t=>t.toLowerCase()).filter(t=>t.length>=yg)}function vg(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(tc([...(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:x}of l)m.skinTones.push(v),m.skinUnicodes.push(w),m.skinVersions.push(x)}return m})}function nc(e,t,n,s){e[t](n).onsuccess=i=>s&&s(i.target.result)}function Je(e,t,n){nc(e,"get",t,n)}function sc(e,t,n){nc(e,"getAll",t,n)}function Ao(e){e.commit&&e.commit()}function bg(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 ic(e,t){const n=bg(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 wg(e){return!await xo(e,St,Xn)}async function kg(e,t,n){const[s,i]=await Promise.all([$i,Xn].map(o=>xo(e,St,o)));return s===n&&i===t}async function Sg(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 oc(e,t,n,s){{const i=vg(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),Ao(l)}}Je(r,$i,v=>{a=v,p()}),Je(r,Xn,v=>{c=v,p()})})}}async function Ag(e,t){return _e(e,st,$t,(n,s,i)=>{const o=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);sc(n.index(Zl),o,i)})}async function rc(e,t){const n=tc(yt(t));return n.length?_e(e,st,$t,(s,i,o)=>{const r=[],l=()=>{r.length===n.length&&a()},a=()=>{const c=ic(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);sc(s.index(Ql),p,m=>{r.push(m),l()})}}):[]}async function xg(e,t){const n=await rc(e,t);return n.length?n.filter(s=>(s.shortcodes||[]).map(o=>o.toLowerCase()).includes(t.toLowerCase()))[0]||null:await Sg(e,i=>(i.shortcodes||[]).includes(t.toLowerCase()))||null}async function $g(e,t){return _e(e,st,$t,(n,s,i)=>Je(n,t,o=>{if(o)return i(o);Je(n.index(Jl),t,r=>i(r||null))}))}function xo(e,t,n){return _e(e,t,$t,(s,i,o)=>Je(s,n,o))}function Eg(e,t,n,s){return _e(e,t,ko,(i,o)=>{i.put(s,n),Ao(o)})}function Tg(e,t){return _e(e,wo,ko,(n,s)=>Je(n,t,i=>{n.put((i||0)+1,t),Ao(s)}))}function Cg(e,t,n){return n===0?[]:_e(e,[wo,st],$t,([s,i],o,r)=>{const l=[];s.index(Xl).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 _g(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 Mg=["name","url"];function Lg(e){const t=e&&Array.isArray(e),n=t&&e.length&&(!e[0]||Mg.some(s=>!(s in e[0])));if(!t||n)throw new Error("Custom emojis are in the wrong format")}function ea(e){Lg(e);const t=(m,v)=>m.name.toLowerCase()<v.name.toLowerCase()?-1:1,n=e.sort(t),i=_g(e,m=>{const v=new Set;if(m.shortcodes)for(const w of m.shortcodes)for(const x of yt(w))v.add(x);return v}),o=m=>i(m,!0),r=m=>i(m,!1),l=m=>{const v=yt(m),w=v.map((x,_)=>(_<v.length-1?o:r)(x));return ic(w,x=>x.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 Pg=typeof wrappedJSObject<"u";function Ft(e){if(!e)return e;if(Pg&&(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 ac(e){e||console.warn("emoji-picker-element is more efficient if the dataSource server exposes an ETag header.")}const Rg=["annotation","emoji","group","order","version"];function Ig(e){if(!e||!Array.isArray(e)||!e[0]||typeof e[0]!="object"||Rg.some(t=>!(t in e[0])))throw new Error("Emoji data is in the wrong format")}function lc(e,t){if(Math.floor(e.status/100)!==2)throw new Error("Failed to fetch: "+t+": "+e.status)}async function Ng(e){const t=await fetch(e,{method:"HEAD"});lc(t,e);const n=t.headers.get("etag");return ac(n),n}async function Ti(e){const t=await fetch(e);lc(t,e);const n=t.headers.get("etag");ac(n);const s=await t.json();return Ig(s),[n,s]}function Dg(e){for(var t="",n=new Uint8Array(e),s=n.byteLength,i=-1;++i<s;)t+=String.fromCharCode(n[i]);return t}function Og(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 cc(e){const t=JSON.stringify(e);let n=Og(t);const s=await crypto.subtle.digest("SHA-1",n),i=Dg(s);return btoa(i)}async function Bg(e,t){let n,s=await Ng(t);if(!s){const i=await Ti(t);s=i[0],n=i[1],s||(s=await cc(n))}await kg(e,t,s)||(n||(n=(await Ti(t))[1]),await oc(e,n,t,s))}async function Fg(e,t){let[n,s]=await Ti(t);n||(n=await cc(s)),await oc(e,s,t,n)}async function Ug(e,t){try{await Bg(e,t)}catch(n){if(n.name!=="InvalidStateError")throw n}}class Wg{constructor({dataSource:t=lg,locale:n=cg,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 hg(this._dbName);gg(this._dbName,this._clear);const n=this.dataSource;await wg(t)?await Fg(t,n):this._lazyUpdate=Ug(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 Ag(this._db,t)).map(Ft)}async getEmojiBySearchQuery(t){Cn(t),await this.ready();const n=this._custom.search(t),s=Jr(await rc(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 xg(this._db,t))}async getEmojiByUnicodeOrName(t){Cn(t),await this.ready();const n=this._custom.byName(t);return n||Ft(await $g(this._db,t))}async getPreferredSkinTone(){return await this.ready(),await xo(this._db,St,Zr)||0}async setPreferredSkinTone(t){return Gs(t),await this.ready(),Eg(this._db,St,Zr,t)}async incrementFavoriteEmojiCount(t){return Cn(t),await this.ready(),Tg(this._db,t)}async getTopFavoriteEmoji(t){return Gs(t),await this.ready(),(await Cg(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 fg(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),Kg=2,ta=6,uc=typeof requestIdleCallback=="function"?requestIdleCallback:setTimeout;function na(e){return e.unicode.includes("‍")}const zg={"🫪":17,"🫩":16,"🫨":15.1,"🫠":14,"🥲":13.1,"🥻":12.1,"🥰":11,"🤩":5,"👱‍♀️":4,"🤣":3,"👁️‍🗨️":2,"😀":1,"😐️":.7,"😃":.6},jg=1e3,Hg="🖐️",qg=8,Gg=["😊","😒","❤️","👍️","😍","😂","😭","☺️","😔","😩","😏","💕","🙌","😘"],dc='"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif',Vg=(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 ${dc}`,s.fillStyle=t,s.scale(.01,.01),s.fillText(e,0,0),s.getImageData(0,0,1,1).data},Yg=(e,t)=>{const n=[...e].join(","),s=[...t].join(",");return n===s&&!n.startsWith("0,0,0,")};function Qg(e){const t=sa(e,"#000"),n=sa(e,"#fff");return t&&n&&Yg(t,n)}function Xg(){const e=Object.entries(zg);try{for(const[t,n]of e)if(Qg(t))return n}catch{}return e[0][1]}let Ys;const Qs=()=>(Ys||(Ys=new Promise(e=>uc(()=>e(Xg())))),Ys),_i=new Map,Zg="️",Jg="\uD83C",em="‍",tm=127995,nm=57339;function sm(e,t){if(t===0)return e;const n=e.indexOf(em);return n!==-1?e.substring(0,n)+String.fromCodePoint(tm+t-1)+e.substring(n):(e.endsWith(Zg)&&(e=e.substring(0,e.length-1)),e+Jg+String.fromCodePoint(nm+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 pc(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 im(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 om=typeof ResizeObserver=="function";function rm(e,t,n){let s;om?(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 am(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.
1776
- This is likely due to using \`display:none\` which is unsupported.
1777
- If this is a Jest/Vitest environment, you can ignore this warning.
1778
- For details see: https://github.com/nolanlawson/emoji-picker-element/issues/514`),s}function lm(e){return pc(e,t=>t)}function cm(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 um(e){const t=document.createElement("template");return t.innerHTML=e,t}const dm=new WeakMap,pm=new WeakMap,hm=Symbol("un-keyed"),fm="replaceChildren"in Element.prototype;function gm(e,t){fm?e.replaceChildren(...t):(e.innerHTML="",e.append(...t))}function mm(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 ym(e,t){const{targetNode:n}=t;let{targetParentNode:s}=t,i=!1;s?i=mm(s,e):(i=!0,t.targetNode=void 0,t.targetParentNode=s=n.parentNode),i&&gm(s,e)}function vm(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)?ym(c,n):c instanceof Element?(u=c,s.replaceWith(u)):s.nodeValue=oa(c),u&&(n.targetNode=u)}}}function bm(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,x,_;if(s){const C=/(\S+)="?([^"=]*)$/.exec(p);w=C[1],x=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:x,attributeValuePost:_,expressionIndex:c};v.push(j),!n&&!s&&(t+=" ")}return{template:um(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 wm(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 km(e){const{template:t,elementsToBindings:n}=Vt(dm,e,()=>bm(e)),s=t.cloneNode(!0).content.firstElementChild,i=wm(s,n);return function(r){return vm(r,i),s}}function Sm(e){const t=Vt(pm,e,()=>new Map);let n=hm;function s(o,...r){const l=Vt(t,o,()=>new Map);return Vt(l,n,()=>km(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 Am(e,t,n,s,i,o,r,l,a){const{labelWithSkin:c,titleForEmoji:u,unicodeWithSkin:p}=n,{html:m,map:v}=Sm(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 xm(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 $m(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 Em(e,t){const n={},s=new AbortController,i=s.signal,{state:o,createEffect:r}=xm(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:qg,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,A)=>{n.rootElement.dispatchEvent(new CustomEvent(k,{detail:A,bubbles:!0,composed:!0}))},p=(k,A)=>k.id===A.id,m=(k,A)=>{const{category:M,emojis:L}=k,{category:K,emojis:F}=A;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)},x=k=>{Js(o.currentEmojisWithCategories,k,m)||(o.currentEmojisWithCategories=k)},_=(k,A)=>A&&k.skins&&k.skins[A]||k.unicode,P={labelWithSkin:(k,A)=>lm([k.name||_(k,A),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(()=>{Am(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 A=!1;const M=setTimeout(()=>{A=!0,o.message=o.i18n.loadingMessage},jg);try{await o.database.ready(),o.databaseLoaded=!0}catch(L){console.error(L),o.message=o.i18n.networkErrorMessage}finally{clearTimeout(M),A&&(A=!1,o.message="")}}o.database&&k()}),r(()=>{o.pickerStyle=`
1779
- --num-groups: ${o.groups.length};
1780
- --indicator-opacity: ${o.searchMode?0:1};
1781
- --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,A)=>sm(o.skinToneEmoji,A))}),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:A}=o,M=(await Promise.all(Gg.map(L=>A.getEmojiByUnicodeOrName(L)))).filter(Boolean);o.defaultFavoriteEmojis=M}o.databaseLoaded&&k()});function it(){const{customEmoji:k,database:A}=o,M=k||ei;A.customEmoji!==M&&(A.customEmoji=M)}r(()=>{async function k(){it();const{database:A,defaultFavoriteEmojis:M,numColumns:L}=o,K=await A.getTopFavoriteEmoji(L),F=await Ue(pc([...K,...M],te=>te.unicode||te.name).slice(0,L));o.currentFavorites=F}o.databaseLoaded&&o.defaultFavoriteEmojis&&k()});function gs(k){rm(k,i,()=>{{const A=getComputedStyle(n.rootElement),M=parseInt(A.getPropertyValue("--num-columns"),10),L=A.getPropertyValue("direction")==="rtl";o.numColumns=M,o.isRtl=L}})}function ms(k){$m(k,i,A=>{for(const{target:M,isIntersecting:L}of A)M.classList.toggle("onscreen",L)})}r(()=>{async function k(){const{searchText:A,currentGroup:M,databaseLoaded:L,customEmoji:K}=o;if(!L)o.currentEmojis=[],o.searchMode=!1;else if(A.length>=Kg){const F=await vs(A);o.searchText===A&&(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(()=>cm(n.tabpanelElement))};r(()=>{const{currentEmojis:k,emojiVersion:A}=o,M=k.filter(L=>L.unicode).filter(L=>na(L)&&!_i.has(L.unicode));if(!A&&M.length)v(k),On(()=>Q(M));else{const L=A?k:k.filter(Et);v(L),an()}});function Q(k){am(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 A=o.emojiVersion||await Qs();return k.filter(({version:M})=>!M||M<=A)}async function Ue(k){return im(k,o.emojiVersion||await Qs())}async function ys(k){const A=k===-1?o.customEmoji:await o.database.getEmojiByGroup(k);return Ue(await ot(A))}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 A=k();x(A)}),r(()=>{o.activeSearchItemId=o.activeSearchItem!==-1&&o.currentEmojis[o.activeSearchItem].id}),r(()=>{const{rawSearchText:k}=o;uc(()=>{o.searchText=(k||"").trim(),o.activeSearchItem=-1})});function bs(k){if(!o.searchMode||!o.currentEmojis.length)return;const A=M=>{be(k),o.activeSearchItem=Xs(M,o.activeSearchItem,o.currentEmojis)};switch(k.key){case"ArrowDown":return A(!1);case"ArrowUp":return A(!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:A}=k,M=A.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:A,key:M}=k,L=K=>{K&&(be(k),K.focus())};switch(M){case"ArrowLeft":return L(A.previousElementSibling);case"ArrowRight":return L(A.nextElementSibling);case"Home":return L(A.parentElement.firstElementChild);case"End":return L(A.parentElement.lastElementChild)}}async function cn(k){const A=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:A,skinTone:o.currentSkinTone,...L&&{unicode:L},...M.name&&{name:M.name}}}async function H(k){const A=cn(k);u("emoji-click-sync",A),u("emoji-click",await A)}function un(k){const{target:A}=k;if(!A.classList.contains("emoji"))return;be(k);const M=A.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:A}}=k,M=A&&A.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 A=async M=>{be(k),o.activeSkinTone=M};switch(k.key){case"ArrowUp":return A(Xs(!0,o.activeSkinTone,o.skinTones));case"ArrowDown":return A(Xs(!1,o.activeSkinTone,o.skinTones));case"Home":return A(0);case"End":return A(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:A}=k;(!A||A.id!=="skintone-list")&&(o.skinTonePickerExpanded=!1)}function pn(k){o.rawSearchText=k.target.value}return{$set(k){Mn(o,k)},$destroy(){s.abort()}}}const Tm="https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json",Cm="en";var _m={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"}},Mm=':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 hc=["customEmoji","customCategorySorting","database","dataSource","i18n","locale","skinToneEmoji","emojiVersion"],Lm=`:host{--emoji-font-family:${dc}}`;class $o extends HTMLElement{constructor(t){super(),this.attachShadow({mode:"open"});const n=document.createElement("style");n.textContent=Mm+Lm,this.shadowRoot.appendChild(n),this._ctx={locale:Cm,dataSource:Tm,skinToneEmoji:Hg,customCategorySorting:Vg,customEmoji:null,i18n:_m,emojiVersion:null,...t};for(const s of hc)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=Em(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 Wg({locale:t,dataSource:n}))}_dbFlush(){Jn(()=>this._dbCreate())}}const fc={};for(const e of hc)fc[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,fc);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 Pm(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 Rm=5e3;function Im(e){return e?e.active?d`
1782
- <div class="callout info compaction-indicator compaction-indicator--active">
1783
- ${N.loader} Compacting context...
1784
- </div>
1785
- `:e.completedAt&&Date.now()-e.completedAt<Rm?d`
1786
- <div class="callout success compaction-indicator compaction-indicator--complete">
1787
- ${N.check} Context compacted
1788
- </div>
1789
- `: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 Nm=/\.(md|txt|csv|json|xml|html|css|js|ts|py|sh|yaml|yml|toml|ini|cfg|log|sql)$/i;function Dm(e){return e.type.startsWith("image/")||/\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(e.name)}function Om(e){return e.type.startsWith("text/")||e.type==="application/json"||e.type==="application/xml"||Nm.test(e.name)}function Bm(e){return e.type==="application/pdf"||/\.pdf$/i.test(e.name)}function Fm(e){return e.type.startsWith("video/")||/\.(mp4|webm|mov|avi|mkv|m4v)$/i.test(e.name)}function Um(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(Dm(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(Om(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(Bm(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(Fm(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 Wm(e){e.preventDefault(),e.stopPropagation(),e.dataTransfer&&(e.dataTransfer.dropEffect="copy"),e.currentTarget.classList.add("chat--dragover")}function Km(e){e.preventDefault(),e.stopPropagation();const t=e.currentTarget,n=e.relatedTarget;(!n||!t.contains(n))&&t.classList.remove("chat--dragover")}function zm(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 jm(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 Hm(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 qm(e){const t=e.attachments??[];return t.length===0?b:d`
1790
- <div class="chat-attachments">
1791
- ${t.map(n=>n.fileName?d`
1792
- <div class="chat-attachment chat-attachment--file">
1793
- <span class="chat-attachment__icon">${n.mimeType?.startsWith("video/")?N.film:N.fileText}</span>
1794
- <span class="chat-attachment__name" title=${n.fileName}>${n.fileName}</span>
1795
- <button
1796
- class="chat-attachment__remove chat-attachment__remove--file"
1797
- type="button"
1798
- aria-label="Remove attachment"
1799
- @click=${()=>{const s=(e.attachments??[]).filter(i=>i.id!==n.id);e.onAttachmentsChange?.(s)}}
1800
- >
1801
- ${N.x}
1802
- </button>
1803
- </div>
1804
- `:d`
1805
- <div class="chat-attachment">
1806
- <img
1807
- src=${n.dataUrl}
1808
- alt="Attachment preview"
1809
- class="chat-attachment__img"
1810
- />
1811
- <button
1812
- class="chat-attachment__remove"
1813
- type="button"
1814
- aria-label="Remove attachment"
1815
- @click=${()=>{const s=(e.attachments??[]).filter(i=>i.id!==n.id);e.onAttachmentsChange?.(s)}}
1816
- >
1817
- ${N.x}
1818
- </button>
1819
- </div>
1820
- `)}
1821
- </div>
1822
- `}function Gm(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`
1823
- <div
1824
- class="chat-thread"
1825
- role="log"
1826
- aria-live="polite"
1827
- @scroll=${e.onChatScroll}
1828
- >
1829
- ${e.loading?d`<div class="muted">Loading chat…</div>`:b}
1830
- ${xh(ey(e),m=>m.key,m=>m.kind==="reading-indicator"?Vf():m.kind==="stream"?Yf(m.text,m.startedAt,e.onOpenSidebar):m.kind==="group"?Qf(m,{onOpenSidebar:e.onOpenSidebar,showReasoning:r,assistantName:e.assistantName}):b)}
1831
- </div>
1832
- `;return d`
1833
- <section
1834
- class="card chat"
1835
- @drop=${m=>Um(m,e)}
1836
- @dragover=${Wm}
1837
- @dragleave=${Km}
1838
- >
1839
- ${e.disabledReason?d`<div class="callout">${e.disabledReason}</div>`:b}
1840
-
1841
- ${e.error?d`<div class="callout danger">${e.error}</div>`:b}
1842
-
1843
- ${Im(e.compactionStatus)}
1844
-
1845
- ${e.focusMode?d`
1846
- <button
1847
- class="chat-focus-exit"
1848
- type="button"
1849
- @click=${e.onToggleFocusMode}
1850
- aria-label="Exit focus mode"
1851
- title="Exit focus mode"
1852
- >
1853
- ${N.x}
1854
- </button>
1855
- `:b}
1856
-
1857
- <div
1858
- class="chat-split-container ${u?"chat-split-container--open":""}"
1859
- >
1860
- <div
1861
- class="chat-main"
1862
- style="flex: ${u?`0 0 ${c*100}%`:"1 1 100%"}"
1863
- >
1864
- ${p}
1865
- ${e.nearBottom===!1?d`
1866
- <button
1867
- class="chat-scroll-bottom"
1868
- type="button"
1869
- @click=${m=>{const w=m.currentTarget.closest(".chat-main")?.querySelector(".chat-thread");w&&w.scrollTo({top:w.scrollHeight,behavior:"smooth"})}}
1870
- aria-label="Scroll to bottom"
1871
- title="Scroll to bottom"
1872
- >
1873
- ${N.chevronDown}
1874
- </button>
1875
- `:b}
1876
- </div>
1877
-
1878
- ${u?d`
1879
- <resizable-divider
1880
- .splitRatio=${c}
1881
- @resize=${m=>e.onSplitRatioChange?.(m.detail.splitRatio)}
1882
- ></resizable-divider>
1883
- <div class="chat-sidebar">
1884
- ${Zf({content:e.sidebarContent??null,error:e.sidebarError??null,onClose:e.onCloseSidebar,onViewRawText:()=>{!e.sidebarContent||!e.onOpenSidebar||e.onOpenSidebar(`\`\`\`
1885
- ${e.sidebarContent}
1886
- \`\`\``)}})}
1887
- </div>
1888
- `:b}
1889
- </div>
1890
-
1891
- <div class="chat-compose">
1892
- ${qm(e)}
1893
- <div class="chat-compose__row">
1894
- <button
1895
- class="chat-compose__emoji"
1896
- type="button"
1897
- @click=${jm}
1898
- aria-label="Emoji"
1899
- title="Emoji"
1900
- >
1901
- ${N.smile}
1902
- </button>
1903
- <label class="field chat-compose__field">
1904
- <span>Message</span>
1905
- <textarea
1906
- .value=${e.draft}
1907
- ?disabled=${!e.connected}
1908
- @keydown=${m=>{m.key==="Enter"&&(m.isComposing||m.keyCode===229||m.shiftKey||e.connected&&(m.preventDefault(),t&&(e.onSend(),ca(m.target))))}}
1909
- @input=${m=>{const v=m.target;e.onDraftChange(v.value),Pm(v)}}
1910
- @paste=${m=>zm(m,e)}
1911
- placeholder=${a}
1912
- ></textarea>
1913
- </label>
1914
- ${s?d`
1915
- <button
1916
- class="btn btn--icon chat-compose__send"
1917
- @click=${e.onAbort}
1918
- aria-label="Stop"
1919
- title="Stop generating"
1920
- >
1921
- ${N.square}
1922
- </button>
1923
- `:b}
1924
- <button
1925
- class="btn btn--icon chat-compose__send primary"
1926
- ?disabled=${!e.connected}
1927
- @click=${m=>{e.onSend();const v=m.target.closest(".chat-compose")?.querySelector("textarea");v&&ca(v)}}
1928
- aria-label="${n?"Queue":"Send"}"
1929
- title="${n?"Queue message":"Send (Enter)"}"
1930
- >
1931
- ${N.send}
1932
- </button>
1933
- </div>
1934
- <div class="emoji-picker-popup">
1935
- <emoji-picker
1936
- @emoji-click=${m=>Hm(m,e)}
1937
- ></emoji-picker>
1938
- </div>
1939
- ${Zm(e)}
1940
- </div>
1941
- </section>
1942
- `}const Vm=[{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 Ym(e){const t=new Set(e.filter(n=>n.provider==="anthropic").map(n=>n.id));return Vm.filter(n=>t.has(n.id)).map(n=>({key:`anthropic/${n.id}`,...n}))}const Qm=[{value:"off",label:"Off"},{value:"minimal",label:"Minimal"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"}];function Xm(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 Zm(e){if(!e.connected)return b;const t=e.modelCatalog??[],n=Ym(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`
1943
- <div class="chat-model-bar">
1944
- <div class="chat-model-bar__select">
1945
- <select
1946
- class="chat-model-bar__dropdown"
1947
- .value=${s??""}
1948
- @change=${l=>{const a=l.target.value;a&&e.onModelChange&&e.onModelChange(a)}}
1949
- >
1950
- ${n.map(l=>d`
1951
- <option value=${l.key} ?selected=${l.key===s}>
1952
- ${l.shortName} — ${l.description}
1953
- </option>
1954
- `)}
1955
- </select>
1956
- </div>
1957
- <div class="chat-model-bar__select">
1958
- <select
1959
- class="chat-model-bar__dropdown"
1960
- .value=${i}
1961
- @change=${l=>{const a=l.target.value;e.onThinkingLevelChange&&e.onThinkingLevelChange(a)}}
1962
- >
1963
- ${Qm.map(l=>d`
1964
- <option value=${l.value} ?selected=${l.value===i}>
1965
- Thinking: ${l.label}
1966
- </option>
1967
- `)}
1968
- </select>
1969
- </div>
1970
- <button
1971
- class="chat-model-bar__settings-btn"
1972
- type="button"
1973
- @click=${Xm}
1974
- aria-label="Message settings"
1975
- title="Message settings"
1976
- >
1977
- ${N.slidersHorizontal}
1978
- </button>
1979
- <div class="chat-settings-menu">
1980
- <label class="chat-settings-menu__item">
1981
- <input
1982
- type="checkbox"
1983
- .checked=${o}
1984
- @change=${l=>{const a=l.target.checked;e.onVerboseChange&&e.onVerboseChange(a?"on":"off")}}
1985
- />
1986
- <span>Verbose</span>
1987
- <span class="chat-settings-menu__hint">Detailed responses</span>
1988
- </label>
1989
- <label class="chat-settings-menu__item">
1990
- <input
1991
- type="checkbox"
1992
- .checked=${r}
1993
- @change=${l=>{const a=l.target.checked;e.onFillerChange&&e.onFillerChange(a)}}
1994
- />
1995
- <span>Filler</span>
1996
- <span class="chat-settings-menu__hint">Quick acks while thinking</span>
1997
- </label>
1998
- </div>
1999
- </div>
2000
- `}const ua=200;function Jm(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=Oa(s.message),o=Ba(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 ey(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=Oa(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(", ")}
2001
-
2002
- ${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 Jm(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 ty(e){return e.connected?d`
2003
- <div class="setup-container setup-container--full chat-page">
2004
- ${tt("Chat",e.wsProps)}
2005
- <div class="chat-viewport">
2006
- ${Gm(e)}
2007
- </div>
2008
- </div>
2009
- `:d`
2010
- <div class="setup-container">
2011
- <div class="setup-card">
2012
- <div class="setup-spinner"></div>
2013
- <p>Connecting to gateway...</p>
2014
- </div>
2015
- </div>
2016
- `}function ny(e){return e?`${Ra(e)} (${os(e)})`:"n/a"}function gc(e){const t=e.state??{},n=t.lastStatus??"n/a",s=t.lastRunAtMs?os(t.lastRunAtMs):"never";return`${n} · last ${s}`}function mc(e){const t=e.schedule;return t.kind==="at"?`One-time: ${Ra(t.atMs)}`:t.kind==="every"?`Every ${Ia(t.everyMs)}`:`Schedule: ${t.expr}${t.tz?` (${t.tz})`:""}`}function sy(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 iy(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 oy(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 ry(e){return e||"Default"}const ha=d`<svg viewBox="0 0 24 24"><polygon points="5 3 19 12 5 21 5 3"/></svg>`,ay=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>`,ly=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>`,yc=d`<svg viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`,cy=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`
2017
- ${uy(e)}
2018
- ${dy(e)}
2019
- ${e.newEventModalOpen?hy(e):b}
2020
- ${t?gy(t,e):b}
2021
- `}function uy(e){const t=e.status,n=t?.enabled??!1,s=t?.jobs??0,i=t?.nextWakeAtMs;return d`
2022
- <div class="event-status-bar">
2023
- <div class="event-status-bar__info">
2024
- <span class="statusDot ${n?"ok":""}"></span>
2025
- <span>${n?"Active":"Inactive"}</span>
2026
- <span class="event-status-bar__sep">\u00b7</span>
2027
- <span>${s} event${s!==1?"s":""}</span>
2028
- ${i?d`
2029
- <span class="event-status-bar__sep">\u00b7</span>
2030
- <span>Next: ${os(i)}</span>
2031
- `:b}
2032
- <button
2033
- class="btn btn--sm"
2034
- ?disabled=${e.loading}
2035
- @click=${e.onRefresh}
2036
- style="margin-left: 4px;"
2037
- >
2038
- ${e.loading?"Refreshing…":"Refresh"}
2039
- </button>
2040
- ${e.error?d`<span class="muted">${e.error}</span>`:b}
2041
- </div>
2042
- <button class="btn primary btn--sm" @click=${e.onNewEventModalOpen}>
2043
- ${cy} New Event
2044
- </button>
2045
- </div>
2046
- `}function dy(e){return e.jobs.length===0?d`<div class="muted" style="padding: 20px 0;">No events yet. Create one to get started.</div>`:d`
2047
- <div class="event-grid">
2048
- ${e.jobs.map(t=>py(t,e))}
2049
- </div>
2050
- `}function py(e,t){return d`
2051
- <div
2052
- class="event-card ${e.enabled?"":"disabled"}"
2053
- @click=${()=>t.onDetailOpen(e)}
2054
- >
2055
- <div class="event-card__header">
2056
- <div class="event-card__name">${e.name||"Untitled"}</div>
2057
- <span class="chip ${e.enabled?"chip-ok":""}" style="font-size: 11px; padding: 2px 8px;">
2058
- ${e.enabled?"On":"Off"}
2059
- </span>
2060
- </div>
2061
- <div class="event-card__schedule">${mc(e)}</div>
2062
- ${e.agentId?d`<div class="event-card__agent">${ry(e.agentId)}</div>`:b}
2063
- ${pa(e)?d`<div class="event-card__agent muted" style="font-size: 11px;">\u2192 ${pa(e)}</div>`:b}
2064
- <div class="event-card__footer">
2065
- <div class="event-card__status">
2066
- <span class="muted" style="font-size: 11px;">${gc(e)}</span>
2067
- </div>
2068
- <div class="event-card__actions" @click=${n=>n.stopPropagation()}>
2069
- <button
2070
- class="btn-icon"
2071
- title="${e.enabled?"Pause":"Resume"}"
2072
- ?disabled=${t.busy}
2073
- @click=${()=>t.onToggle(e,!e.enabled)}
2074
- >
2075
- ${e.enabled?ay:ha}
2076
- </button>
2077
- <button
2078
- class="btn-icon"
2079
- title="Run now"
2080
- ?disabled=${t.busy}
2081
- @click=${()=>t.onRun(e)}
2082
- >
2083
- ${ha}
2084
- </button>
2085
- <button
2086
- class="btn-icon danger"
2087
- title="Delete"
2088
- ?disabled=${t.busy}
2089
- @click=${()=>t.onRemove(e)}
2090
- >
2091
- ${ly}
2092
- </button>
2093
- </div>
2094
- </div>
2095
- </div>
2096
- `}function hy(e){const t=iy(e);return d`
2097
- <div class="event-modal-overlay" @click=${e.onNewEventModalClose}>
2098
- <div class="event-modal" @click=${n=>n.stopPropagation()}>
2099
- <div class="event-modal__header">
2100
- <div class="event-modal__title">New Event</div>
2101
- <button class="event-modal__close" @click=${e.onNewEventModalClose}>
2102
- ${yc}
2103
- </button>
2104
- </div>
2105
-
2106
- <div class="form-grid">
2107
- <label class="field">
2108
- <span>Name</span>
2109
- <input
2110
- .value=${e.form.name}
2111
- @input=${n=>e.onFormChange({name:n.target.value})}
2112
- placeholder="e.g. Morning briefing"
2113
- />
2114
- </label>
2115
- <label class="field">
2116
- <span>Description</span>
2117
- <input
2118
- .value=${e.form.description}
2119
- @input=${n=>e.onFormChange({description:n.target.value})}
2120
- placeholder="What does this event do?"
2121
- />
2122
- </label>
2123
- <label class="field">
2124
- <span>Agent</span>
2125
- <select
2126
- .value=${e.form.agentId}
2127
- @change=${n=>e.onFormChange({agentId:n.target.value})}
2128
- >
2129
- <option value="">Default</option>
2130
- ${e.agentIds.map(n=>d`<option value=${n}>${n}</option>`)}
2131
- </select>
2132
- </label>
2133
- <label class="field checkbox">
2134
- <span>Enabled</span>
2135
- <input
2136
- type="checkbox"
2137
- .checked=${e.form.enabled}
2138
- @change=${n=>e.onFormChange({enabled:n.target.checked})}
2139
- />
2140
- </label>
2141
- <label class="field">
2142
- <span>Timing</span>
2143
- <select
2144
- .value=${e.form.scheduleKind}
2145
- @change=${n=>e.onFormChange({scheduleKind:n.target.value})}
2146
- >
2147
- <option value="every">Repeating</option>
2148
- <option value="at">One-time</option>
2149
- <option value="cron">Custom schedule</option>
2150
- </select>
2151
- </label>
2152
- </div>
2153
-
2154
- ${fy(e)}
2155
-
2156
- <div class="form-grid" style="margin-top: 12px;">
2157
- <label class="field">
2158
- <span>Session type</span>
2159
- <select
2160
- .value=${e.form.sessionTarget}
2161
- @change=${n=>e.onFormChange({sessionTarget:n.target.value})}
2162
- >
2163
- <option value="main">Shared session</option>
2164
- <option value="isolated">Separate session</option>
2165
- </select>
2166
- </label>
2167
- <label class="field">
2168
- <span>When to run</span>
2169
- <select
2170
- .value=${e.form.wakeMode}
2171
- @change=${n=>e.onFormChange({wakeMode:n.target.value})}
2172
- >
2173
- <option value="next-heartbeat">Next available time</option>
2174
- <option value="now">Right away</option>
2175
- </select>
2176
- </label>
2177
- <label class="field">
2178
- <span>Action type</span>
2179
- <select
2180
- .value=${e.form.payloadKind}
2181
- @change=${n=>e.onFormChange({payloadKind:n.target.value})}
2182
- >
2183
- <option value="systemEvent">Background task</option>
2184
- <option value="agentTurn">Send a message</option>
2185
- </select>
2186
- </label>
2187
- </div>
2188
-
2189
- <label class="field" style="margin-top: 12px;">
2190
- <span>${e.form.payloadKind==="systemEvent"?"Task description":"Message to send"}</span>
2191
- <textarea
2192
- .value=${e.form.payloadText}
2193
- @input=${n=>e.onFormChange({payloadText:n.target.value})}
2194
- rows="4"
2195
- placeholder="${e.form.payloadKind==="systemEvent"?"Describe what the assistant should do…":"Type the message to send…"}"
2196
- ></textarea>
2197
- </label>
2198
-
2199
- ${e.form.payloadKind==="agentTurn"?d`
2200
- <div class="form-grid" style="margin-top: 12px;">
2201
- <label class="field checkbox">
2202
- <span>Deliver response</span>
2203
- <input
2204
- type="checkbox"
2205
- .checked=${e.form.deliver}
2206
- @change=${n=>e.onFormChange({deliver:n.target.checked})}
2207
- />
2208
- </label>
2209
- <label class="field">
2210
- <span>Channel</span>
2211
- <select
2212
- .value=${e.form.channel||"last"}
2213
- @change=${n=>e.onFormChange({channel:n.target.value})}
2214
- >
2215
- ${t.map(n=>d`<option value=${n}>
2216
- ${oy(e,n)}
2217
- </option>`)}
2218
- </select>
2219
- </label>
2220
- <label class="field">
2221
- <span>Send to</span>
2222
- <input
2223
- .value=${e.form.to}
2224
- @input=${n=>e.onFormChange({to:n.target.value})}
2225
- placeholder="+1555\u2026 or chat id"
2226
- />
2227
- </label>
2228
- <label class="field">
2229
- <span>Timeout (seconds)</span>
2230
- <input
2231
- .value=${e.form.timeoutSeconds}
2232
- @input=${n=>e.onFormChange({timeoutSeconds:n.target.value})}
2233
- />
2234
- </label>
2235
- ${e.form.sessionTarget==="isolated"?d`
2236
- <label class="field">
2237
- <span>Summary prefix</span>
2238
- <input
2239
- .value=${e.form.postToMainPrefix}
2240
- @input=${n=>e.onFormChange({postToMainPrefix:n.target.value})}
2241
- />
2242
- </label>
2243
- `:b}
2244
- </div>
2245
- `:b}
2246
-
2247
- <div class="row" style="margin-top: 16px; justify-content: flex-end;">
2248
- <button class="btn" @click=${e.onNewEventModalClose}>Cancel</button>
2249
- <button class="btn primary" ?disabled=${e.busy} @click=${e.onAdd}>
2250
- ${e.busy?"Creating…":"Create Event"}
2251
- </button>
2252
- </div>
2253
- </div>
2254
- </div>
2255
- `}function fy(e){const t=e.form;return t.scheduleKind==="at"?d`
2256
- <label class="field" style="margin-top: 12px;">
2257
- <span>Run at</span>
2258
- <input
2259
- type="datetime-local"
2260
- .value=${t.scheduleAt}
2261
- @input=${n=>e.onFormChange({scheduleAt:n.target.value})}
2262
- />
2263
- </label>
2264
- `:t.scheduleKind==="every"?d`
2265
- <div class="form-grid" style="margin-top: 12px;">
2266
- <label class="field">
2267
- <span>Repeat every</span>
2268
- <input
2269
- .value=${t.everyAmount}
2270
- @input=${n=>e.onFormChange({everyAmount:n.target.value})}
2271
- />
2272
- </label>
2273
- <label class="field">
2274
- <span>Unit</span>
2275
- <select
2276
- .value=${t.everyUnit}
2277
- @change=${n=>e.onFormChange({everyUnit:n.target.value})}
2278
- >
2279
- <option value="minutes">Minutes</option>
2280
- <option value="hours">Hours</option>
2281
- <option value="days">Days</option>
2282
- </select>
2283
- </label>
2284
- </div>
2285
- `:d`
2286
- <div class="form-grid" style="margin-top: 12px;">
2287
- <label class="field">
2288
- <span>Cron expression</span>
2289
- <input
2290
- .value=${t.cronExpr}
2291
- @input=${n=>e.onFormChange({cronExpr:n.target.value})}
2292
- placeholder="e.g. 0 7 * * *"
2293
- />
2294
- </label>
2295
- <label class="field">
2296
- <span>Timezone (optional)</span>
2297
- <input
2298
- .value=${t.cronTz}
2299
- @input=${n=>e.onFormChange({cronTz:n.target.value})}
2300
- placeholder="e.g. America/New_York"
2301
- />
2302
- </label>
2303
- </div>
2304
- `}function gy(e,t){return d`
2305
- <div class="event-modal-overlay" @click=${t.onDetailClose}>
2306
- <div class="event-modal" @click=${n=>n.stopPropagation()}>
2307
- <div class="event-modal__header">
2308
- <div class="event-modal__title">${e.name||"Untitled Event"}</div>
2309
- <button class="event-modal__close" @click=${t.onDetailClose}>
2310
- ${yc}
2311
- </button>
2312
- </div>
2313
-
2314
- ${e.description?d`<div style="color: var(--muted); font-size: 13px; margin-bottom: 16px;">${e.description}</div>`:b}
2315
-
2316
- <div class="event-detail-section">
2317
- <div class="event-detail-row">
2318
- <span class="event-detail-label">Status</span>
2319
- <span class="event-detail-value">
2320
- <span class="chip ${e.enabled?"chip-ok":""}" style="font-size: 11px; padding: 2px 8px;">
2321
- ${e.enabled?"Enabled":"Disabled"}
2322
- </span>
2323
- </span>
2324
- </div>
2325
- <div class="event-detail-row">
2326
- <span class="event-detail-label">Schedule</span>
2327
- <span class="event-detail-value">${mc(e)}</span>
2328
- </div>
2329
- ${e.agentId?d`
2330
- <div class="event-detail-row">
2331
- <span class="event-detail-label">Agent</span>
2332
- <span class="event-detail-value mono">${e.agentId}</span>
2333
- </div>
2334
- `:b}
2335
- <div class="event-detail-row">
2336
- <span class="event-detail-label">Session</span>
2337
- <span class="event-detail-value">
2338
- ${e.sessionTarget==="main"?"Shared":"Separate"}
2339
- </span>
2340
- </div>
2341
- <div class="event-detail-row">
2342
- <span class="event-detail-label">Run mode</span>
2343
- <span class="event-detail-value">
2344
- ${e.wakeMode==="now"?"Right away":"Next available time"}
2345
- </span>
2346
- </div>
2347
- <div class="event-detail-row" style="flex-direction: column; align-items: stretch; gap: 4px;">
2348
- <span class="event-detail-label">Action</span>
2349
- <span class="event-detail-value" style="text-align: left; white-space: pre-wrap; font-size: 12px; color: var(--muted); line-height: 1.5;">${sy(e,!1)}</span>
2350
- </div>
2351
- ${e.payload.kind==="agentTurn"&&e.payload.to?d`
2352
- <div class="event-detail-row">
2353
- <span class="event-detail-label">Send to</span>
2354
- <span class="event-detail-value mono">${e.payload.to}</span>
2355
- </div>
2356
- `:b}
2357
- ${e.payload.kind==="agentTurn"&&(e.payload.channel??e.payload.provider)?d`
2358
- <div class="event-detail-row">
2359
- <span class="event-detail-label">Channel</span>
2360
- <span class="event-detail-value">${e.payload.channel??e.payload.provider}</span>
2361
- </div>
2362
- `:b}
2363
- ${e.payload.kind==="agentTurn"?d`
2364
- <div class="event-detail-row">
2365
- <span class="event-detail-label">Auto-deliver</span>
2366
- <span class="event-detail-value">${e.payload.deliver?"Yes":"No"}</span>
2367
- </div>
2368
- `:b}
2369
- </div>
2370
-
2371
- <div class="event-detail-section">
2372
- <div class="event-detail-row">
2373
- <span class="event-detail-label">Last run</span>
2374
- <span class="event-detail-value">${gc(e)}</span>
2375
- </div>
2376
- ${e.state?.nextRunAtMs?d`
2377
- <div class="event-detail-row">
2378
- <span class="event-detail-label">Next run</span>
2379
- <span class="event-detail-value">${ny(e.state.nextRunAtMs)}</span>
2380
- </div>
2381
- `:b}
2382
- </div>
2383
-
2384
- <div class="event-detail-section">
2385
- <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;">
2386
- <span class="event-detail-label" style="font-size: 14px;">Recent Activity</span>
2387
- </div>
2388
- ${t.runs.length===0?d`<div class="muted" style="font-size: 13px;">No runs recorded yet.</div>`:d`
2389
- <div class="list">
2390
- ${[...t.runs].sort((n,s)=>s.ts-n.ts).map(n=>yy(n))}
2391
- </div>
2392
- `}
2393
- </div>
2394
-
2395
- <div class="row" style="margin-top: 16px; gap: 8px; justify-content: flex-end;">
2396
- <button
2397
- class="btn"
2398
- ?disabled=${t.busy}
2399
- @click=${()=>t.onToggle(e,!e.enabled)}
2400
- >
2401
- ${e.enabled?"Disable":"Enable"}
2402
- </button>
2403
- <button
2404
- class="btn primary"
2405
- ?disabled=${t.busy}
2406
- @click=${()=>t.onRun(e)}
2407
- >
2408
- Run Now
2409
- </button>
2410
- <button
2411
- class="btn danger"
2412
- ?disabled=${t.busy}
2413
- @click=${()=>{t.onRemove(e),t.onDetailClose()}}
2414
- >
2415
- Delete
2416
- </button>
2417
- </div>
2418
- </div>
2419
- </div>
2420
- `}function my(e){const t=e.toLowerCase();return t==="ok"||t==="success"?"chip chip-ok":t==="error"||t==="fail"||t==="failed"?"chip chip-warn":"chip"}function yy(e){return d`
2421
- <div class="list-item" style="grid-template-columns: 1fr; gap: 6px;">
2422
- <div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
2423
- <span class=${my(e.status)} style="font-size: 11px; padding: 2px 8px;">
2424
- ${e.status}
2425
- </span>
2426
- <span class="muted" style="font-size: 12px;">${os(e.ts)}</span>
2427
- <span class="muted" style="font-size: 12px;">${Ia(e.durationMs)}</span>
2428
- </div>
2429
- ${e.summary?d`<div class="muted" style="font-size: 12px;">${e.summary}</div>`:b}
2430
- ${e.error?d`
2431
- <details style="margin-top: 2px;">
2432
- <summary class="muted" style="cursor: pointer; font-size: 12px;">Error details</summary>
2433
- <div class="muted" style="margin-top: 4px; white-space: pre-wrap; font-size: 12px;">${e.error}</div>
2434
- </details>
2435
- `:b}
2436
- </div>
2437
- `}function vy(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`
2438
- <section class="card">
2439
- <div class="row" style="justify-content: space-between;">
2440
- <div>
2441
- <div class="card-title">Skills</div>
2442
- <div class="card-sub">Bundled, managed, and workspace skills.</div>
2443
- </div>
2444
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2445
- ${e.loading?"Loading…":"Refresh"}
2446
- </button>
2447
- </div>
2448
-
2449
- <div class="filters" style="margin-top: 14px;">
2450
- <label class="field" style="flex: 1;">
2451
- <span>Filter</span>
2452
- <input
2453
- .value=${e.filter}
2454
- @input=${i=>e.onFilterChange(i.target.value)}
2455
- placeholder="Search skills"
2456
- />
2457
- </label>
2458
- <div class="muted">${s.length} shown</div>
2459
- </div>
2460
-
2461
- ${e.error?d`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:b}
2462
-
2463
- ${s.length===0?d`<div class="muted" style="margin-top: 16px;">No skills found.</div>`:d`
2464
- <div class="list" style="margin-top: 16px;">
2465
- ${s.map(i=>by(i,e))}
2466
- </div>
2467
- `}
2468
- </section>
2469
- `}function by(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`
2470
- <div class="list-item">
2471
- <div class="list-main">
2472
- <div class="list-title">
2473
- ${e.emoji?`${e.emoji} `:""}${e.name}
2474
- </div>
2475
- <div class="list-sub">${Lu(e.description,140)}</div>
2476
- <div class="chip-row" style="margin-top: 6px;">
2477
- <span class="chip">${e.source}</span>
2478
- <span class="chip ${e.eligible?"chip-ok":"chip-warn"}">
2479
- ${e.eligible?"eligible":"blocked"}
2480
- </span>
2481
- ${e.disabled?d`<span class="chip chip-warn">disabled</span>`:b}
2482
- </div>
2483
- ${r.length>0?d`
2484
- <div class="muted" style="margin-top: 6px;">
2485
- Missing: ${r.join(", ")}
2486
- </div>
2487
- `:b}
2488
- ${l.length>0?d`
2489
- <div class="muted" style="margin-top: 6px;">
2490
- Reason: ${l.join(", ")}
2491
- </div>
2492
- `:b}
2493
- </div>
2494
- <div class="list-meta">
2495
- <div class="row" style="justify-content: flex-end; flex-wrap: wrap;">
2496
- <button
2497
- class="btn"
2498
- ?disabled=${n}
2499
- @click=${()=>t.onToggle(e.skillKey,e.disabled)}
2500
- >
2501
- ${e.disabled?"Enable":"Disable"}
2502
- </button>
2503
- ${o?d`<button
2504
- class="btn"
2505
- ?disabled=${n}
2506
- @click=${()=>t.onInstall(e.skillKey,e.name,e.install[0].id)}
2507
- >
2508
- ${n?"Installing…":e.install[0].label}
2509
- </button>`:b}
2510
- </div>
2511
- ${i?d`<div
2512
- class="muted"
2513
- style="margin-top: 8px; color: ${i.kind==="error"?"var(--danger-color, #d14343)":"var(--success-color, #0a7f5a)"};"
2514
- >
2515
- ${i.message}
2516
- </div>`:b}
2517
- ${e.primaryEnv?d`
2518
- <div class="field" style="margin-top: 10px;">
2519
- <span>API key</span>
2520
- <input
2521
- type="password"
2522
- .value=${s}
2523
- @input=${a=>t.onEdit(e.skillKey,a.target.value)}
2524
- />
2525
- </div>
2526
- <button
2527
- class="btn primary"
2528
- style="margin-top: 8px;"
2529
- ?disabled=${n}
2530
- @click=${()=>t.onSaveKey(e.skillKey)}
2531
- >
2532
- Save key
2533
- </button>
2534
- `:b}
2535
- </div>
2536
- </div>
2537
- `}const ga=["user","assistant","tool","thinking","error"],ma={user:"User",assistant:"Assistant",tool:"Tool",thinking:"Thinking",error:"Error",system:"System"};function wy(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString()}function ky(e){return e.split(":").slice(2).join(":")||e}function Sy(e,t){return t?[e.content,e.agentId,e.sessionKey,e.toolName].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function Ay(e,t=500){return e.length<=t?e:e.slice(0,t)+"..."}function xy(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:Sy(s,t));return d`
2538
- <div>
2539
- <div class="filters" style="margin-top: 14px;">
2540
- <label class="field" style="min-width: 220px;">
2541
- <span>Filter</span>
2542
- <input
2543
- .value=${e.filterText}
2544
- @input=${s=>e.onFilterTextChange(s.target.value)}
2545
- placeholder="Search session logs"
2546
- />
2547
- </label>
2548
- </div>
2549
-
2550
- <div class="chip-row" style="margin-top: 12px;">
2551
- ${ga.map(s=>d`
2552
- <label class="chip session-log-chip ${s}">
2553
- <input
2554
- type="checkbox"
2555
- .checked=${e.typeFilters[s]}
2556
- @change=${i=>e.onTypeToggle(s,i.target.checked)}
2557
- />
2558
- <span>${ma[s]}</span>
2559
- </label>
2560
- `)}
2561
- </div>
2562
-
2563
- <div class="chip-row" style="margin-top: 8px; align-items: center;">
2564
- ${e.agents.map(s=>d`
2565
- <label class="chip agent-chip">
2566
- <input
2567
- type="checkbox"
2568
- .checked=${e.agentFilters[s]??!0}
2569
- @change=${i=>e.onAgentToggle(s,i.target.checked)}
2570
- />
2571
- <span>${s}</span>
2572
- </label>
2573
- `)}
2574
- <label class="chip">
2575
- <input
2576
- type="checkbox"
2577
- .checked=${e.autoFollow}
2578
- @change=${s=>e.onToggleAutoFollow(s.target.checked)}
2579
- />
2580
- <span>Auto-follow</span>
2581
- </label>
2582
- <label class="chip">
2583
- <input
2584
- type="checkbox"
2585
- .checked=${e.full}
2586
- @change=${s=>e.onToggleFull(s.target.checked)}
2587
- />
2588
- <span>Full</span>
2589
- </label>
2590
- </div>
2591
-
2592
- ${e.error?d`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:b}
2593
-
2594
- <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
2595
- ${n.length===0?d`<div class="muted" style="padding: 12px;">No session log entries.</div>`:n.map(s=>d`
2596
- <div class="log-row session-entry ${s.type}">
2597
- <div class="log-row-header">
2598
- <span class="log-time mono">${wy(s.timestamp)}</span>
2599
- <span class="session-log-type ${s.type}">${ma[s.type]}</span>
2600
- <span class="log-subsystem mono">${s.agentId}</span>
2601
- <span class="session-label mono">${ky(s.sessionKey)}</span>
2602
- ${s.toolName?d`<span class="session-tool mono">${s.toolName}</span>`:b}
2603
- ${s.model?d`<span class="session-model mono">${s.model}</span>`:b}
2604
- </div>
2605
- <div class="log-message mono">${e.full?s.content:Ay(s.content)}</div>
2606
- </div>
2607
- `)}
2608
- </div>
2609
- </div>
2610
- `}const Mi=["trace","debug","info","warn","error","fatal"];function $y(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString()}function vc(e,t){return t?[e.message,e.subsystem,e.raw].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function Ey(e){return d`
2611
- <section class="card">
2612
- <div class="row" style="justify-content: space-between;">
2613
- <div>
2614
- <div class="card-title">Logs</div>
2615
- <div class="card-sub">Session transcripts and system logs.</div>
2616
- </div>
2617
- <div class="row" style="gap: 8px;">
2618
- ${e.logsSubTab==="system"?d`
2619
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2620
- ${e.loading?"Loading…":"Refresh"}
2621
- </button>
2622
- <button
2623
- class="btn"
2624
- ?disabled=${e.entries.length===0}
2625
- @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:vc(o,t)),i=t||n?"filtered":"visible";e.onExport(s.map(o=>o.raw),i)}}
2626
- >
2627
- Export
2628
- </button>
2629
- `:d`
2630
- <button class="btn" ?disabled=${e.sessionLogsProps.loading} @click=${e.sessionLogsProps.onRefresh}>
2631
- ${e.sessionLogsProps.loading?"Loading…":"Refresh"}
2632
- </button>
2633
- <button
2634
- class="btn"
2635
- ?disabled=${e.sessionLogsProps.entries.length===0}
2636
- @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")}}
2637
- >
2638
- Export
2639
- </button>
2640
- `}
2641
- </div>
2642
- </div>
2643
-
2644
- <div class="sp-tabs" style="margin-top: 12px;">
2645
- <button class="sp-tab ${e.logsSubTab==="session"?"active":""}"
2646
- @click=${()=>e.onSubTabChange("session")}>
2647
- Session Logs
2648
- </button>
2649
- <button class="sp-tab ${e.logsSubTab==="system"?"active":""}"
2650
- @click=${()=>e.onSubTabChange("system")}>
2651
- System Logs
2652
- </button>
2653
- </div>
2654
-
2655
- ${e.logsSubTab==="session"?xy(e.sessionLogsProps):Ty(e)}
2656
- </section>
2657
- `}function Ty(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:vc(s,t));return d`
2658
- <div class="filters" style="margin-top: 14px;">
2659
- <label class="field" style="min-width: 220px;">
2660
- <span>Filter</span>
2661
- <input
2662
- .value=${e.filterText}
2663
- @input=${s=>e.onFilterTextChange(s.target.value)}
2664
- placeholder="Search logs"
2665
- />
2666
- </label>
2667
- <label class="field checkbox">
2668
- <span>Auto-follow</span>
2669
- <input
2670
- type="checkbox"
2671
- .checked=${e.autoFollow}
2672
- @change=${s=>e.onToggleAutoFollow(s.target.checked)}
2673
- />
2674
- </label>
2675
- </div>
2676
-
2677
- <div class="chip-row" style="margin-top: 12px;">
2678
- ${Mi.map(s=>d`
2679
- <label class="chip log-chip ${s}">
2680
- <input
2681
- type="checkbox"
2682
- .checked=${e.levelFilters[s]}
2683
- @change=${i=>e.onLevelToggle(s,i.target.checked)}
2684
- />
2685
- <span>${s}</span>
2686
- </label>
2687
- `)}
2688
- </div>
2689
-
2690
- ${e.file?d`<div class="muted" style="margin-top: 10px;">File: ${e.file}</div>`:b}
2691
- ${e.truncated?d`<div class="callout" style="margin-top: 10px;">
2692
- Log output truncated; showing latest chunk.
2693
- </div>`:b}
2694
- ${e.error?d`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:b}
2695
-
2696
- <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
2697
- ${n.length===0?d`<div class="muted" style="padding: 12px;">No log entries.</div>`:[...n].reverse().map(s=>d`
2698
- <div class="log-row">
2699
- <div class="log-row-header">
2700
- <span class="log-time mono">${$y(s.time)}</span>
2701
- <span class="log-level ${s.level??""}">${s.level??""}</span>
2702
- <span class="log-subsystem mono">${s.subsystem??""}</span>
2703
- </div>
2704
- <div class="log-message mono">${s.message??s.raw}</div>
2705
- </div>
2706
- `)}
2707
- </div>
2708
- `}const Cy=[{id:"cron",label:"Events"},{id:"skills",label:"Skills"},{id:"logs",label:"Logs"}];function _y(e){switch(e.activeTab){case"cron":return fa(e.cronProps);case"skills":return vy(e.skillsProps);case"logs":return Ey(e.logsProps);default:return fa(e.cronProps)}}function My(e){return e.connected?d`
2709
- <div class="setup-container">
2710
- ${tt("Advanced",e.wsProps)}
2711
- <div class="setup-card sp-card-advanced" style="text-align: left;">
2712
- <h1>Advanced</h1>
2713
- <div class="sp-tabs">
2714
- ${Cy.map(t=>d`
2715
- <button
2716
- class="sp-tab ${e.activeTab===t.id?"active":""}"
2717
- @click=${()=>e.onTabChange(t.id)}
2718
- >
2719
- ${t.label}
2720
- </button>
2721
- `)}
2722
- </div>
2723
- ${_y(e)}
2724
- </div>
2725
- </div>
2726
- `:d`
2727
- <div class="setup-container">
2728
- <div class="setup-card">
2729
- <div class="setup-spinner"></div>
2730
- <p>Connecting to gateway...</p>
2731
- </div>
2732
- </div>
2733
- `}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`
2734
- <select
2735
- class="login-account-select"
2736
- @change=${r}
2737
- ?disabled=${e.busy||i}
2738
- >
2739
- ${e.accounts.map((m,v)=>d`
2740
- <option value=${m.id} ?selected=${v===0}>
2741
- ${m.displayName}
2742
- </option>
2743
- `)}
2744
- </select>
2745
- `:b;if(s){let m="",v="",w="";const x=_=>{_.preventDefault(),!i&&(!m||!v||!w||v===w&&o&&e.onChangePin?.(o,m,v))};return d`
2746
- <div class="login-overlay">
2747
- <div class="login-card">
2748
- <img class="login-logo" src="${t.iconUrl}" alt="${t.name}" />
2749
- <h2 class="login-title">Change PIN</h2>
2750
- <p class="login-subtitle">Enter your current PIN, then choose a new one</p>
2751
- <form class="login-form" @submit=${x}>
2752
- ${a}
2753
- <input
2754
- class="login-pin-input"
2755
- type="password"
2756
- inputmode="numeric"
2757
- pattern="[0-9]*"
2758
- minlength="4"
2759
- maxlength="6"
2760
- placeholder="Current PIN"
2761
- ?disabled=${i}
2762
- @input=${l(_=>{m=_})}
2763
- autofocus
2764
- />
2765
- <input
2766
- class="login-pin-input"
2767
- type="password"
2768
- inputmode="numeric"
2769
- pattern="[0-9]*"
2770
- minlength="4"
2771
- maxlength="6"
2772
- placeholder="New PIN (4-6 digits)"
2773
- ?disabled=${i}
2774
- @input=${l(_=>{v=_})}
2775
- />
2776
- <input
2777
- class="login-pin-input"
2778
- type="password"
2779
- inputmode="numeric"
2780
- pattern="[0-9]*"
2781
- minlength="4"
2782
- maxlength="6"
2783
- placeholder="Confirm new PIN"
2784
- ?disabled=${i}
2785
- @input=${l(_=>{w=_})}
2786
- />
2787
- ${e.changePinError?d`<p class="login-error">${e.changePinError}</p>`:b}
2788
- ${e.changePinSuccess?d`<p class="login-success">${e.changePinSuccess}</p>`:b}
2789
- <button
2790
- class="login-submit"
2791
- type="submit"
2792
- ?disabled=${i}
2793
- >${i?d`<span class="login-spinner"></span>`:"Change PIN"}</button>
2794
- </form>
2795
- <p class="login-hint" style="margin-top: 16px;">
2796
- <a
2797
- class="login-link"
2798
- href="#"
2799
- @click=${_=>{_.preventDefault(),e.onToggleChangePinMode?.()}}
2800
- >Back to login</a>
2801
- </p>
2802
- </div>
2803
- </div>
2804
- `}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`
2805
- <div class="login-overlay">
2806
- <div class="login-card">
2807
- <img class="login-logo" src="${t.iconUrl}" alt="${t.name}" />
2808
- <h2 class="login-title">${t.name}</h2>
2809
- <p class="login-subtitle">
2810
- ${n?"Set a PIN to protect this device":"Enter your PIN to continue"}
2811
- </p>
2812
- <form class="login-form" @submit=${p}>
2813
- ${a}
2814
- <input
2815
- class="login-pin-input"
2816
- type="password"
2817
- inputmode="numeric"
2818
- pattern="[0-9]*"
2819
- minlength="4"
2820
- maxlength="6"
2821
- placeholder="${n?"Choose a 4-6 digit PIN":"PIN"}"
2822
- ?disabled=${e.busy}
2823
- @input=${l(m=>{c=m})}
2824
- autofocus
2825
- />
2826
- ${n?d`
2827
- <input
2828
- class="login-pin-input"
2829
- type="password"
2830
- inputmode="numeric"
2831
- pattern="[0-9]*"
2832
- minlength="4"
2833
- maxlength="6"
2834
- placeholder="Confirm PIN"
2835
- ?disabled=${e.busy}
2836
- @input=${l(m=>{u=m})}
2837
- />
2838
- `:b}
2839
- ${e.error?d`<p class="login-error">${e.error}</p>`:b}
2840
- <button
2841
- class="login-submit"
2842
- type="submit"
2843
- ?disabled=${e.busy}
2844
- >
2845
- ${e.busy?d`<span class="login-spinner"></span>`:n?"Set PIN":"Unlock"}
2846
- </button>
2847
- </form>
2848
- ${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;":""}">
2849
- <a
2850
- class="login-link"
2851
- href="#"
2852
- @click=${m=>{m.preventDefault(),e.onToggleChangePinMode?.()}}
2853
- >Change PIN</a>
2854
- </p>`:b}
2855
- </div>
2856
- </div>
2857
- `}const Eo="taskmaster-access-session",bc={checked:!1,hasPins:!1,hasMasterPin:!1,authenticated:!1,workspace:null,master:!1,accounts:[],error:null,busy:!1};function wc(){try{return localStorage.getItem(Eo)}catch{return null}}function kc(e){try{localStorage.setItem(Eo,e)}catch{}}function Ly(){try{localStorage.removeItem(Eo)}catch{}}async function va(e){if(e.client)try{const t=wc(),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 Py(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?(kc(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 Ry(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?(kc(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 Iy(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 Ny(e){const t=wc();if(e.client&&t)try{await e.client.request("access.logout",{token:t})}catch{}Ly(),e.accessState={...bc,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 Dy(e,t){await e.request("apikeys.remove",{provider:t})}class Oy{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 Oy),ti}function To(e){return e instanceof Error?e.message:String(e)}async function By(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 Fy(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 Uy(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 Wy(e){e.browserInputMode=!e.browserInputMode}function Ky(e,t){if(!t?.data)return;e.browserScreencastFrame=t.data,e.browserScreencastMetadata=t.metadata??null,Bn().updateFrame(t.data,t.metadata)}function zy(e,t){t&&(e.browserHandoffPending=!0,e.browserHandoffReason=t.reason??"Action required",e.browserHandoffId=t.id??null)}function jy(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 Hy(e,t,n){e.filesSelectedPaths=new Set([t]),await Sc(e,t,n)}async function qy(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 Sc(e,i,n)}else e.filesSelectedPath=null,e.filesPreviewContent=null,e.filesPreviewSize=null,e.filesPreviewBinary=!1}async function Gy(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 Ac(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 Vy(e,t,n,s){const i=t.split("/").pop()??t,o=n==="."?i:`${n}/${i}`;o!==t&&await xc(e,t,o,s)}async function Sc(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 Ac(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 Yy(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 Qy(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 xc(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 $c(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 Xy(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 $c(e,t)}catch(n){e.filesMessage={kind:"error",text:Fe(n)}}finally{e.filesReindexBusy=!1}}}function Zy(e,t){const n=new Set(e.filesExpandedDirs);n.has(t)?n.delete(t):n.add(t),e.filesExpandedDirs=n}function Jy(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 Ec(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=Jy(i,n),e.configFormDirty=!1}catch(s){e.adminsError=String(s)}finally{e.adminsLoading=!1}}async function Tc(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=Ec(l,a,i,s);ja(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 Cc(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=Ec(l,a,i,s);ja(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 ev=Object.freeze(Object.defineProperty({__proto__:null,addAdmin:Tc,loadAdmins:fs,removeAdmin:Cc},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 _c(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 Mc(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 Lc(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 Pc(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 tv=Object.freeze(Object.defineProperty({__proto__:null,addCustomer:_c,deleteCustomer:Mc,deleteCustomerField:Pc,loadCustomers:et,setCustomerField:Lc},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(),auditCount:e.auditEntries.length,onAuditClick:()=>{e.auditModalOpen=!0}}}function nv(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(),auditCount:e.auditEntries.length,onAuditClick:()=>{e.auditModalOpen=!0}}}function sv(e){const t=J(e);return t?t.agents.find(s=>s.id.endsWith("-admin")||s.id==="admin")?.id:void 0}function iv(e){return J(e)?.whatsappAccountId??void 0}function ov(e){const t=J(e);if(t)return t.agents[0]?.id}function rv(e){return e.selectedWorkspace??void 0}function J(e){return e.selectedWorkspace?e.workspaces.find(t=>t.name===e.selectedWorkspace)??null:null}const av=/^data:/i,lv=/^https?:\/\//i;function cv(e){const t=e.agentsList?.agents??[],s=Pa(e.sessionKey)?.agentId??e.agentsList?.defaultId??"main",o=t.find(l=>l.id===s)?.identity,r=o?.avatarUrl??o?.avatar;if(r)return av.test(r)||lv.test(r)?r:o?.avatarUrl}function uv(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 dv(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 pv(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 hv(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=uv(e.channelsSnapshot),n=e.channelsSnapshot?.channelAccounts?.whatsapp??[],s=dv(e.channelsSnapshot),i=pv(e);return hh({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 Iy(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"),x=(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(x),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,...x}=p[m];Object.keys(x).length<=1?p.splice(m,1):p[m]=x}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(x=>x.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:x,..._}=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",x=v?{"*":{}}:void 0,_={groupPolicy:w};x&&(_.groups=x);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 Dy(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:nv(e)})}if(e.filesPage){const t=ov(e);return Xp({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:()=>Xy(e,t),onSelectFile:n=>Hy(e,n,t),onToggleSelectFile:n=>qy(e,n,t),onToggleDir:n=>Zy(e,n),onUpload:(n,s)=>Yy(e,n,s,t),onDownload:n=>Ac(e,n,t),onBulkDownload:()=>Gy(e,t),onDelete:n=>Qy(e,n,t),onMove:(n,s)=>xc(e,n,s,t),onMoveToDir:(n,s)=>Vy(e,n,s,t)})}if(e.browserPage)return qp({connected:e.connected,active:e.browserScreencastActive,loading:e.browserLoading,error:e.browserError,inputMode:e.browserInputMode,handoffPending:e.browserHandoffPending,handoffReason:e.browserHandoffReason,onStart:()=>By(e),onStop:()=>Fy(e),onToggleInput:()=>Wy(e),onCompleteHandoff:()=>Uy(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=sv(e),n=iv(e);return gh({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=>{Tc(e,s,t,n).then(()=>{e.adminsError||(e.adminsNewPhone="")})},onRemove:s=>Cc(e,s,t,n),onNewPhoneChange:s=>e.handleAdminsNewPhoneChange(s)})}if(e.customersPage){const t=rv(e);return bh({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)=>_c(e,n,s,t),onDelete:n=>Mc(e,n,t),onSetField:(n,s,i)=>Lc(e,n,s,i,t),onDeleteField:(n,s)=>Pc(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=cv(e),s=e.chatAvatarUrl??n??null;return ty({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?My({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:()=>{gd(e).then(()=>{e.cronNewEventModal=!1})},onToggle:(t,n)=>md(e,t,n),onRun:t=>yd(e,t),onRemove:t=>vd(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)=>op(e,t,n),onEdit:(t,n)=>ip(e,t,n),onSaveKey:t=>rp(e,t),onInstall:(t,n,s)=>ap(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``)}function fv(e){const t=new Date(e),n=t.toLocaleDateString("en-GB",{day:"2-digit",month:"short"}),s=t.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit"});return`${n} ${s}`}function wa(e){return e.startsWith("memory/public/")?"public":e.startsWith("memory/shared/")?"shared":"other"}function gv(e,t,n){return d`
2858
- <div class="audit-modal-overlay" @click=${i=>{i.target.classList.contains("audit-modal-overlay")&&n()}}>
2859
- <div class="audit-modal-card">
2860
- <div class="audit-modal-header">
2861
- <h3>Memory Writes to Review</h3>
2862
- <button class="audit-modal-close" @click=${n}>&times;</button>
2863
- </div>
2864
- <p class="audit-modal-desc">
2865
- These files were written to shared or public folders by the agent.
2866
- Review to ensure no sensitive data was misplaced.
2867
- </p>
2868
- ${e.length===0?d`<p class="audit-modal-empty">No unreviewed writes.</p>`:d`
2869
- <div class="audit-modal-list">
2870
- ${e.map(i=>d`
2871
- <div class="audit-modal-entry">
2872
- <div class="audit-modal-entry-path">
2873
- <span class="audit-modal-folder audit-modal-folder--${wa(i.path)}">${wa(i.path)}</span>
2874
- <a href="/files" class="audit-modal-path-link">${i.path}</a>
2875
- </div>
2876
- <div class="audit-modal-entry-meta">
2877
- ${fv(i.timestamp)}
2878
- <span class="audit-modal-agent">${i.agentId}</span>
2879
- </div>
2880
- </div>
2881
- `)}
2882
- </div>
2883
- <button class="setup-button audit-modal-clear" @click=${t}>
2884
- Mark All Reviewed
2885
- </button>
2886
- `}
2887
- </div>
2888
- </div>
2889
- `}const mv={trace:!0,debug:!0,info:!0,warn:!0,error:!0,fatal:!0},yv={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 vv(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 bv(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 wv(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 kv(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:bv,loadWorkspaces:rn,removeWorkspace:wv,renameWorkspace:kv},Symbol.toStringTag,{value:"Module"})),Rc={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"},ka=Rc,Pi={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",NODE:"node",PROBE:"probe",TEST:"test"};new Set(Object.values(Rc));new Set(Object.values(Pi));function Sv(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 Av=4008;class xv{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 Yd();const u=Zd({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=Sv({deviceId:i.deviceId,clientId:this.opts.clientName??ka.CONTROL_UI,clientMode:this.opts.mode??Pi.WEBCHAT,role:s,scopes:n,signedAtMs:u,token:r??null,nonce:p}),v=await Qd(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??ka.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&&Jd({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&&ep({deviceId:i.deviceId,role:s}),this.ws?.close(Av,"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 $v(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 Ev(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 Ic(e){const t=Date.now();return e.filter(n=>n.expiresAtMs>t)}function Tv(e,t){const n=Ic(e).filter(s=>s.id!==t.id);return n.push(t),n}function Sa(e,t){return Ic(e).filter(n=>n.id!==t)}async function Nc(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 Dc(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 Cv(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 _v(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 Mv(e){if(!e.client||!e.connected)return;const t=Pv();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 Lv(e){e.updateLastResult=null,e.requestUpdate?.()}function Pv(){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 Rv(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 xv({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,Dv(e,n),e.handleAccessCheck(),Mv(e).then(()=>{Dc(e)}),Nc(e),vv(e),(e.chatPage||e.setup)&&Ov(e),Xi(e,{quiet:!0}),Qi(e,{quiet:!0}),rn(e).then(()=>{e.initWorkspaceSelection()}),e.setup&&(ke(e),Bv(e)),oo(e)},onClose:({code:n,reason:s})=>{e.connected=!1,n!==1012&&(e.lastError=`disconnected (${n}): ${s||"no reason"}`)},onEvent:n=>Iv(e,n),onGap:({expected:n,received:s})=>{e.lastError=`event gap detected (expected seq ${n}, got ${s}); refresh recommended`}}),e.client.start()}function Iv(e,t){try{Nv(e,t)}catch(n){console.error("[gateway] handleGatewayEvent error:",t.event,n)}}function Nv(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;nd(e,t.payload);return}if(t.event==="chat"){const n=t.payload;n?.sessionKey&&yl(e,n.sessionKey);const s=Ka(e,n);(s==="final"||s==="error"||s==="aborted")&&(Ki(e),Np(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=$v(t.payload);if(n){e.execApprovalQueue=Tv(e.execApprovalQueue,n),e.execApprovalError=null;const s=Math.max(0,n.expiresAtMs-Date.now()+500);window.setTimeout(()=>{e.execApprovalQueue=Sa(e.execApprovalQueue,n.id)},s)}return}if(t.event==="browser.screencast.frame"){Ky(e,t.payload);return}if(t.event==="browser.handoff"){zy(e,t.payload),e.browserPage||(window.location.href="/browser");return}if(t.event==="browser.handoff.resolved"){jy(e);return}if(t.event==="exec.approval.resolved"){const n=Ev(t.payload);n&&(e.execApprovalQueue=Sa(e.execApprovalQueue,n.id));return}if(t.event==="update.progress"){_v(e,t.payload);return}}function Dv(e,t){const n=t.snapshot;n?.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence),n?.health&&(e.debugHealth=n.health),n?.sessionDefaults&&Rv(e,n.sessionDefaults)}async function Ov(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 Bv(e){if(!(!e.client||!e.connected))try{e.apiKeyProviders=await Li(e.client)}catch{}}function Fv(e){e.basePath=Ap();const t=Oe();if(Wp(t.accentColor),window.scrollTo(0,0),vp(e),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}Tp(e,!0),xp(e),$p(e),window.addEventListener("popstate",e.popStateHandler),wp(e),Te(e),mp(e),e.tab==="logs"&&(e.logsSubTab==="session"?to(e):Ji(e)),e.tab==="debug"&&so(e)}function Uv(e){cd(e)}function Wv(e){window.removeEventListener("popstate",e.popStateHandler),yp(e),eo(e),no(e),io(e),bp(e),Ep(e),e.topbarObserver?.disconnect(),e.topbarObserver=null}function Kv(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&&za(e,t.has("tab")||t.has("logsAutoFollow"))}function zv(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 jv(e,t,n){await zi(e,t,n),await z(e,!0)}async function Hv(e,t){await qa(e,t),await z(e,!0)}async function qv(e,t){await Ga(e,t),await z(e,!0)}async function Gv(e,t){await Va(e,t)}async function Vv(e,t){await Ya(e,t)}async function Yv(e){await pd(e),await ke(e),await z(e,!0)}async function Qv(e){await ke(e),await z(e,!0)}function Xv(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 Oc(e){return(e.channelsSnapshot?.channelAccounts?.nostr??[])[0]?.accountId??e.nostrProfileAccountId??"default"}function Bc(e,t=""){return`/api/channels/nostr/${encodeURIComponent(e)}/profile${t}`}function Zv(e,t,n){e.nostrProfileAccountId=t,e.nostrProfileFormState=zv(n??void 0)}function Jv(e){e.nostrProfileFormState=null,e.nostrProfileAccountId=null}function eb(e,t,n){const s=e.nostrProfileFormState;s&&(e.nostrProfileFormState={...s,values:{...s.values,[t]:n},fieldErrors:{...s.fieldErrors,[t]:""}})}function tb(e){const t=e.nostrProfileFormState;t&&(e.nostrProfileFormState={...t,showAdvanced:!t.showAdvanced})}async function nb(e){const t=e.nostrProfileFormState;if(!t||t.saving)return;const n=Oc(e);e.nostrProfileFormState={...t,saving:!0,error:null,success:null,fieldErrors:{}};try{const s=await fetch(Bc(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:Xv(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 sb(e){const t=e.nostrProfileFormState;if(!t||t.importing)return;const n=Oc(e);e.nostrProfileFormState={...t,importing:!0,error:null,success:null};try{const s=await fetch(Bc(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 ib(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 ob(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 rb(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 ab(e,t){e.authCodeInput=t}function lb(e){e.setupStep="whatsapp"}async function cb(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 ub(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 db(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 pb(e,t){e.licenseKey=t}async function hb(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 fb(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 gb=Object.defineProperty,mb=Object.getOwnPropertyDescriptor,f=(e,t,n,s)=>{for(var i=s>1?void 0:s?mb(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&&gb(t,n,i),i};const oi=xu();function yb(){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 vb(){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 bb(){const e=window.location.pathname;return e==="/files"||e.endsWith("/files")}function wb(){const e=window.location.pathname;return e==="/browser"||e.endsWith("/browser")}function kb(){const e=window.location.pathname;return e==="/admins"||e.endsWith("/admins")}function Sb(){const e=window.location.pathname;return e==="/customers"||e.endsWith("/customers")}function Ab(){const e=window.location.pathname;return e==="/chat"||e.endsWith("/chat")}function xb(){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=yb(),this.setup=vb(),this.filesPage=bb(),this.browserPage=wb(),this.adminsPage=kb(),this.customersPage=Sb(),this.chatPage=Ab(),this.advancedPage=xb(),this.advancedTab="cron",this.connected=!1,this.accessState=bc,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=`{
2890
- }
2891
- `,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={...yv},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.auditEntries=[],this.auditLoading=!1,this.auditModalOpen=!1,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={...mv},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.auditPollInterval=null,this.logsScrollFrame=null,this.toolStreamById=new Map,this.toolStreamOrder=[],this.basePath="",this.popStateHandler=()=>Cp(this),this.themeMedia=null,this.themeMediaHandler=null,this.topbarObserver=null}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),Fv(this)}firstUpdated(){Uv(this)}disconnectedCallback(){Wv(this),super.disconnectedCallback()}updated(e){Kv(this,e)}connect(){Te(this)}handleChatScroll(e){sd(this,e)}handleLogsScroll(e){id(this,e)}handleSessionLogsScroll(e){od(this,e)}exportLogs(e,t){ad(e,t)}exportSessionLogs(e,t){ld(e,t)}resetToolStream(){Ki(this)}resetChatScroll(){rd(this)}async loadAssistantIdentity(){await Nc(this)}applySettings(e){Ie(this,e)}setTab(e){kp(this,e)}setTheme(e,t){Sp(this,e,t)}async loadOverview(){await wl(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 Sl(this)}removeQueuedMessage(e){Pp(this,e)}async handleSendChat(e,t){await Rp(this,e,t)}async handleWhatsAppStart(e,t){await jv(this,e,t)}async handleWhatsAppWait(e){await Hv(this,e)}async handleWhatsAppLogout(e){await qv(this,e)}async handleAddWhatsAppAccount(e){await Gv(this,e)}async handleRemoveWhatsAppAccount(e){await Vv(this,e)}async handleAccessCheck(){await va(this)}async handlePinSubmit(e,t){await Py(this,e,t),this.accessState.authenticated&&this.accessState.workspace&&this.handleWorkspaceSelect(this.accessState.workspace)}async handleSetMasterPin(e){await Ry(this,e)}async handleLogout(){await Ny(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 cb(this)}async handleLicenseActivate(){await ub(this)}async handleLicenseRemove(){await db(this)}handleLicenseKeyChange(e){pb(this,e)}async handleAuthStatusCheck(){await ib(this)}async handleAuthStart(){await ob(this)}async handleAuthSubmitCode(e){await rb(this,e)}handleAuthCodeChange(e){ab(this,e)}handleSkipToWhatsApp(){lb(this)}async handleGatewayHealthCheck(){await hb(this)}async handleGatewayRestart(){await fb(this)}async handleUpdateCheck(){await Dc(this)}async handleUpdateRun(){await Cv(this)}handleUpdateDismissResult(){Lv(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=""}async loadAuditEntries(){await ml(this)}async clearAudit(){await gp(this),this.auditModalOpen=!1}handleFilesLoad(){const e=this.resolveFilesAgentId();on(this,e),$c(this,e)}handleAdminsLoad(){const e=this.resolveAdminAgentId();de(async()=>{const{loadAdmins:t}=await Promise.resolve().then(()=>ev);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(()=>qu);return{loadChatHistory:t}},void 0,import.meta.url).then(({loadChatHistory:t})=>{t(this)})}handleAdvancedLoad(){this.loadCron()}async handleChannelConfigSave(){await Yv(this)}async handleChannelConfigReload(){await Qv(this)}handleNostrProfileEdit(e,t){Zv(this,e,t)}handleNostrProfileCancel(){Jv(this)}handleNostrProfileFieldChange(e,t){eb(this,e,t)}async handleNostrProfileSave(){await nb(this)}async handleNostrProfileImport(){await sb(this)}handleNostrProfileToggleAdvanced(){tb(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(()=>tv);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(()=>bd);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.loadAuditEntries(),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 d`${hv(this)}${this.auditModalOpen?gv(this.auditEntries,()=>this.clearAudit(),()=>{this.auditModalOpen=!1}):b}`}};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,"auditEntries",2);f([g()],h.prototype,"auditLoading",2);f([g()],h.prototype,"auditModalOpen",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([Ma("taskmaster-app")],h);
2892
- //# sourceMappingURL=index-B0Q2Wmm1.js.map