@rubytech/taskmaster 1.0.106 → 1.0.108

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/agents/skills-status.js +23 -3
  2. package/dist/agents/skills.js +1 -0
  3. package/dist/agents/system-prompt.js +3 -0
  4. package/dist/agents/taskmaster-tools.js +5 -0
  5. package/dist/agents/tool-policy.js +2 -1
  6. package/dist/agents/tools/authorize-admin-tool.js +1 -1
  7. package/dist/agents/tools/memory-tool.js +2 -1
  8. package/dist/agents/tools/software-update-tool.js +114 -0
  9. package/dist/auto-reply/reply/commands-status.js +5 -9
  10. package/dist/auto-reply/reply/get-reply-run.js +1 -1
  11. package/dist/auto-reply/reply/get-reply.js +1 -1
  12. package/dist/auto-reply/reply/model-selection.js +1 -1
  13. package/dist/browser/routes/screencast.js +1 -1
  14. package/dist/browser/screencast.js +1 -1
  15. package/dist/build-info.json +3 -3
  16. package/dist/commands/agent.js +2 -2
  17. package/dist/config/zod-schema.js +12 -1
  18. package/dist/control-ui/assets/index-B2FEGOCu.css +1 -0
  19. package/dist/control-ui/assets/index-nLVF-pVT.js +3762 -0
  20. package/dist/control-ui/assets/index-nLVF-pVT.js.map +1 -0
  21. package/dist/control-ui/index.html +2 -2
  22. package/dist/control-ui/maxy-icon.png +0 -0
  23. package/dist/cron/isolated-agent/recipients.js +70 -0
  24. package/dist/cron/isolated-agent/run.js +43 -13
  25. package/dist/gateway/config-reload.js +1 -0
  26. package/dist/gateway/control-ui.js +111 -5
  27. package/dist/gateway/protocol/index.js +6 -1
  28. package/dist/gateway/protocol/schema/agents-models-skills.js +23 -0
  29. package/dist/gateway/protocol/schema/protocol-schemas.js +6 -1
  30. package/dist/gateway/server-http.js +6 -1
  31. package/dist/gateway/server-methods/access.js +3 -3
  32. package/dist/gateway/server-methods/brand.js +160 -0
  33. package/dist/gateway/server-methods/browser-screencast.js +3 -3
  34. package/dist/gateway/server-methods/skills.js +159 -3
  35. package/dist/gateway/server-methods/workspaces.js +7 -7
  36. package/dist/gateway/server-methods-list.js +5 -0
  37. package/dist/gateway/server-methods.js +2 -0
  38. package/dist/gateway/server.impl.js +1 -1
  39. package/dist/infra/heartbeat-runner.js +17 -0
  40. package/dist/infra/heartbeat-update-notify.js +120 -0
  41. package/dist/infra/tunnel.js +1 -1
  42. package/dist/memory/embeddings.js +0 -4
  43. package/dist/memory/manager.js +15 -6
  44. package/dist/web/inbound/media.js +1 -1
  45. package/dist/web/login-qr.js +0 -23
  46. package/dist/web/providers/cloud/receive.js +1 -1
  47. package/dist/web/providers/cloud/webhook.js +1 -1
  48. package/package.json +1 -1
  49. package/skills/skill-builder/SKILL.md +97 -0
  50. package/skills/skill-builder/references/lean-pattern.md +118 -0
  51. package/skills/zero-to-prototype/SKILL.md +35 -0
  52. package/skills/zero-to-prototype/references/discovery.md +64 -0
  53. package/skills/zero-to-prototype/references/prd.md +83 -0
  54. package/skills/zero-to-prototype/references/validation.md +67 -0
  55. package/taskmaster-docs/USER-GUIDE.md +65 -31
  56. package/templates/customer/agents/public/AGENTS.md +3 -10
  57. package/templates/taskmaster/agents/public/SOUL.md +0 -4
  58. package/templates/tradesupport/agents/public/AGENTS.md +3 -10
  59. package/dist/control-ui/assets/index-DjhCZlZd.css +0 -1
  60. package/dist/control-ui/assets/index-DtuDNTAC.js +0 -3539
  61. package/dist/control-ui/assets/index-DtuDNTAC.js.map +0 -1
  62. package/skills/taskmaster/SKILL.md +0 -164
@@ -1,3539 +0,0 @@
1
- var Fu=Object.defineProperty;var Uu=(e,t,n)=>t in e?Fu(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var U=(e,t,n)=>Uu(e,typeof t!="symbol"?t+"":t,n);(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))i(s);new MutationObserver(s=>{for(const o of s)if(o.type==="childList")for(const r of o.addedNodes)r.tagName==="LINK"&&r.rel==="modulepreload"&&i(r)}).observe(document,{childList:!0,subtree:!0});function n(s){const o={};return s.integrity&&(o.integrity=s.integrity),s.referrerPolicy&&(o.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?o.credentials="include":s.crossOrigin==="anonymous"?o.credentials="omit":o.credentials="same-origin",o}function i(s){if(s.ep)return;s.ep=!0;const o=n(s);fetch(s.href,o)}})();const Wu="modulepreload",Ku=function(e,t){return new URL(e,t).href},pr={},ie=function(t,n,i){let s=Promise.resolve();if(n&&n.length>0){let c=function(l){return Promise.all(l.map(d=>Promise.resolve(d).then(h=>({status:"fulfilled",value:h}),h=>({status:"rejected",reason:h}))))};const r=document.getElementsByTagName("link"),a=document.querySelector("meta[property=csp-nonce]"),u=(a==null?void 0:a.nonce)||(a==null?void 0:a.getAttribute("nonce"));s=c(n.map(l=>{if(l=Ku(l,i),l in pr)return;pr[l]=!0;const d=l.endsWith(".css"),h=d?'[rel="stylesheet"]':"";if(i)for(let f=r.length-1;f>=0;f--){const b=r[f];if(b.href===l&&(!d||b.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${l}"]${h}`))return;const v=document.createElement("link");if(v.rel=d?"stylesheet":Wu,d||(v.as="script"),v.crossOrigin="",v.href=l,u&&v.setAttribute("nonce",u),document.head.appendChild(v),d)return new Promise((f,b)=>{v.addEventListener("load",f),v.addEventListener("error",()=>b(new Error(`Unable to preload CSS for ${l}`)))})}))}function o(r){const a=new Event("vite:preloadError",{cancelable:!0});if(a.payload=r,window.dispatchEvent(a),!a.defaultPrevented)throw r}return s.then(r=>{for(const a of r||[])a.status==="rejected"&&o(a.reason);return t().catch(o)})};const Qn=globalThis,to=Qn.ShadowRoot&&(Qn.ShadyCSS===void 0||Qn.ShadyCSS.nativeShadow)&&"adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype,no=Symbol(),hr=new WeakMap;let il=class{constructor(t,n,i){if(this._$cssResult$=!0,i!==no)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(to&&t===void 0){const i=n!==void 0&&n.length===1;i&&(t=hr.get(n)),t===void 0&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),i&&hr.set(n,t))}return t}toString(){return this.cssText}};const zu=e=>new il(typeof e=="string"?e:e+"",void 0,no),ju=(e,...t)=>{const n=e.length===1?e[0]:t.reduce((i,s,o)=>i+(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.")})(s)+e[o+1],e[0]);return new il(n,e,no)},Hu=(e,t)=>{if(to)e.adoptedStyleSheets=t.map(n=>n instanceof CSSStyleSheet?n:n.styleSheet);else for(const n of t){const i=document.createElement("style"),s=Qn.litNonce;s!==void 0&&i.setAttribute("nonce",s),i.textContent=n.cssText,e.appendChild(i)}},fr=to?e=>e:e=>e instanceof CSSStyleSheet?(t=>{let n="";for(const i of t.cssRules)n+=i.cssText;return zu(n)})(e):e;const{is:qu,defineProperty:Vu,getOwnPropertyDescriptor:Gu,getOwnPropertyNames:Qu,getOwnPropertySymbols:Yu,getPrototypeOf:Xu}=Object,Ve=globalThis,gr=Ve.trustedTypes,Zu=gr?gr.emptyScript:"",qi=Ve.reactiveElementPolyfillSupport,rn=(e,t)=>e,ei={toAttribute(e,t){switch(t){case Boolean:e=e?Zu: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}},io=(e,t)=>!qu(e,t),mr={attribute:!0,type:String,converter:ei,reflect:!1,useDefault:!1,hasChanged:io};Symbol.metadata??(Symbol.metadata=Symbol("metadata")),Ve.litPropertyMetadata??(Ve.litPropertyMetadata=new WeakMap);let Tt=class extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??(this.l=[])).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,n=mr){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 i=Symbol(),s=this.getPropertyDescriptor(t,i,n);s!==void 0&&Vu(this.prototype,t,s)}}static getPropertyDescriptor(t,n,i){const{get:s,set:o}=Gu(this.prototype,t)??{get(){return this[n]},set(r){this[n]=r}};return{get:s,set(r){const a=s==null?void 0:s.call(this);o==null||o.call(this,r),this.requestUpdate(t,a,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??mr}static _$Ei(){if(this.hasOwnProperty(rn("elementProperties")))return;const t=Xu(this);t.finalize(),t.l!==void 0&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(rn("finalized")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(rn("properties"))){const n=this.properties,i=[...Qu(n),...Yu(n)];for(const s of i)this.createProperty(s,n[s])}const t=this[Symbol.metadata];if(t!==null){const n=litPropertyMetadata.get(t);if(n!==void 0)for(const[i,s]of n)this.elementProperties.set(i,s)}this._$Eh=new Map;for(const[n,i]of this.elementProperties){const s=this._$Eu(n,i);s!==void 0&&this._$Eh.set(s,n)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(t){const n=[];if(Array.isArray(t)){const i=new Set(t.flat(1/0).reverse());for(const s of i)n.unshift(fr(s))}else t!==void 0&&n.push(fr(t));return n}static _$Eu(t,n){const i=n.attribute;return i===!1?void 0:typeof i=="string"?i: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(){var t;this._$ES=new Promise(n=>this.enableUpdating=n),this._$AL=new Map,this._$E_(),this.requestUpdate(),(t=this.constructor.l)==null||t.forEach(n=>n(this))}addController(t){var n;(this._$EO??(this._$EO=new Set)).add(t),this.renderRoot!==void 0&&this.isConnected&&((n=t.hostConnected)==null||n.call(t))}removeController(t){var n;(n=this._$EO)==null||n.delete(t)}_$E_(){const t=new Map,n=this.constructor.elementProperties;for(const i of n.keys())this.hasOwnProperty(i)&&(t.set(i,this[i]),delete this[i]);t.size>0&&(this._$Ep=t)}createRenderRoot(){const t=this.shadowRoot??this.attachShadow(this.constructor.shadowRootOptions);return Hu(t,this.constructor.elementStyles),t}connectedCallback(){var t;this.renderRoot??(this.renderRoot=this.createRenderRoot()),this.enableUpdating(!0),(t=this._$EO)==null||t.forEach(n=>{var i;return(i=n.hostConnected)==null?void 0:i.call(n)})}enableUpdating(t){}disconnectedCallback(){var t;(t=this._$EO)==null||t.forEach(n=>{var i;return(i=n.hostDisconnected)==null?void 0:i.call(n)})}attributeChangedCallback(t,n,i){this._$AK(t,i)}_$ET(t,n){var o;const i=this.constructor.elementProperties.get(t),s=this.constructor._$Eu(t,i);if(s!==void 0&&i.reflect===!0){const r=(((o=i.converter)==null?void 0:o.toAttribute)!==void 0?i.converter:ei).toAttribute(n,i.type);this._$Em=t,r==null?this.removeAttribute(s):this.setAttribute(s,r),this._$Em=null}}_$AK(t,n){var o,r;const i=this.constructor,s=i._$Eh.get(t);if(s!==void 0&&this._$Em!==s){const a=i.getPropertyOptions(s),u=typeof a.converter=="function"?{fromAttribute:a.converter}:((o=a.converter)==null?void 0:o.fromAttribute)!==void 0?a.converter:ei;this._$Em=s;const c=u.fromAttribute(n,a.type);this[s]=c??((r=this._$Ej)==null?void 0:r.get(s))??c,this._$Em=null}}requestUpdate(t,n,i,s=!1,o){var r;if(t!==void 0){const a=this.constructor;if(s===!1&&(o=this[t]),i??(i=a.getPropertyOptions(t)),!((i.hasChanged??io)(o,n)||i.useDefault&&i.reflect&&o===((r=this._$Ej)==null?void 0:r.get(t))&&!this.hasAttribute(a._$Eu(t,i))))return;this.C(t,n,i)}this.isUpdatePending===!1&&(this._$ES=this._$EP())}C(t,n,{useDefault:i,reflect:s,wrapped:o},r){i&&!(this._$Ej??(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||i||(n=void 0),this._$AL.set(t,n)),s===!0&&this._$Em!==t&&(this._$Eq??(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(){var i;if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??(this.renderRoot=this.createRenderRoot()),this._$Ep){for(const[o,r]of this._$Ep)this[o]=r;this._$Ep=void 0}const s=this.constructor.elementProperties;if(s.size>0)for(const[o,r]of s){const{wrapped:a}=r,u=this[o];a!==!0||this._$AL.has(o)||u===void 0||this.C(o,void 0,r,u)}}let t=!1;const n=this._$AL;try{t=this.shouldUpdate(n),t?(this.willUpdate(n),(i=this._$EO)==null||i.forEach(s=>{var o;return(o=s.hostUpdate)==null?void 0:o.call(s)}),this.update(n)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(n)}willUpdate(t){}_$AE(t){var n;(n=this._$EO)==null||n.forEach(i=>{var s;return(s=i.hostUpdated)==null?void 0:s.call(i)}),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=this._$Eq.forEach(n=>this._$ET(n,this[n]))),this._$EM()}updated(t){}firstUpdated(t){}};Tt.elementStyles=[],Tt.shadowRootOptions={mode:"open"},Tt[rn("elementProperties")]=new Map,Tt[rn("finalized")]=new Map,qi==null||qi({ReactiveElement:Tt}),(Ve.reactiveElementVersions??(Ve.reactiveElementVersions=[])).push("2.1.2");const an=globalThis,yr=e=>e,ti=an.trustedTypes,vr=ti?ti.createPolicy("lit-html",{createHTML:e=>e}):void 0,sl="$lit$",qe=`lit$${Math.random().toFixed(9).slice(2)}$`,ol="?"+qe,Ju=`<${ol}>`,ct=document,gn=()=>ct.createComment(""),mn=e=>e===null||typeof e!="object"&&typeof e!="function",so=Array.isArray,ed=e=>so(e)||typeof(e==null?void 0:e[Symbol.iterator])=="function",Vi=`[
2
- \f\r]`,Vt=/<(?:(!--|\/[^a-zA-Z])|(\/?[a-zA-Z][^>\s]*)|(\/?$))/g,br=/-->/g,wr=/>/g,nt=RegExp(`>|${Vi}(?:([^\\s"'>=/]+)(${Vi}*=${Vi}*(?:[^
3
- \f\r"'\`<>=]|("|')|))|$)`,"g"),kr=/'/g,Sr=/"/g,rl=/^(?:script|style|textarea|title)$/i,td=e=>(t,...n)=>({_$litType$:e,strings:t,values:n}),p=td(1),Qe=Symbol.for("lit-noChange"),k=Symbol.for("lit-nothing"),xr=new WeakMap,rt=ct.createTreeWalker(ct,129);function al(e,t){if(!so(e)||!e.hasOwnProperty("raw"))throw Error("invalid template strings array");return vr!==void 0?vr.createHTML(t):t}const nd=(e,t)=>{const n=e.length-1,i=[];let s,o=t===2?"<svg>":t===3?"<math>":"",r=Vt;for(let a=0;a<n;a++){const u=e[a];let c,l,d=-1,h=0;for(;h<u.length&&(r.lastIndex=h,l=r.exec(u),l!==null);)h=r.lastIndex,r===Vt?l[1]==="!--"?r=br:l[1]!==void 0?r=wr:l[2]!==void 0?(rl.test(l[2])&&(s=RegExp("</"+l[2],"g")),r=nt):l[3]!==void 0&&(r=nt):r===nt?l[0]===">"?(r=s??Vt,d=-1):l[1]===void 0?d=-2:(d=r.lastIndex-l[2].length,c=l[1],r=l[3]===void 0?nt:l[3]==='"'?Sr:kr):r===Sr||r===kr?r=nt:r===br||r===wr?r=Vt:(r=nt,s=void 0);const v=r===nt&&e[a+1].startsWith("/>")?" ":"";o+=r===Vt?u+Ju:d>=0?(i.push(c),u.slice(0,d)+sl+u.slice(d)+qe+v):u+qe+(d===-2?a:v)}return[al(e,o+(e[n]||"<?>")+(t===2?"</svg>":t===3?"</math>":"")),i]};let Ts=class ll{constructor({strings:t,_$litType$:n},i){let s;this.parts=[];let o=0,r=0;const a=t.length-1,u=this.parts,[c,l]=nd(t,n);if(this.el=ll.createElement(c,i),rt.currentNode=this.el.content,n===2||n===3){const d=this.el.content.firstChild;d.replaceWith(...d.childNodes)}for(;(s=rt.nextNode())!==null&&u.length<a;){if(s.nodeType===1){if(s.hasAttributes())for(const d of s.getAttributeNames())if(d.endsWith(sl)){const h=l[r++],v=s.getAttribute(d).split(qe),f=/([.?@])?(.*)/.exec(h);u.push({type:1,index:o,name:f[2],strings:v,ctor:f[1]==="."?sd:f[1]==="?"?od:f[1]==="@"?rd:Si}),s.removeAttribute(d)}else d.startsWith(qe)&&(u.push({type:6,index:o}),s.removeAttribute(d));if(rl.test(s.tagName)){const d=s.textContent.split(qe),h=d.length-1;if(h>0){s.textContent=ti?ti.emptyScript:"";for(let v=0;v<h;v++)s.append(d[v],gn()),rt.nextNode(),u.push({type:2,index:++o});s.append(d[h],gn())}}}else if(s.nodeType===8)if(s.data===ol)u.push({type:2,index:o});else{let d=-1;for(;(d=s.data.indexOf(qe,d+1))!==-1;)u.push({type:7,index:o}),d+=qe.length-1}o++}}static createElement(t,n){const i=ct.createElement("template");return i.innerHTML=t,i}};function It(e,t,n=e,i){var r,a;if(t===Qe)return t;let s=i!==void 0?(r=n._$Co)==null?void 0:r[i]:n._$Cl;const o=mn(t)?void 0:t._$litDirective$;return(s==null?void 0:s.constructor)!==o&&((a=s==null?void 0:s._$AO)==null||a.call(s,!1),o===void 0?s=void 0:(s=new o(e),s._$AT(e,n,i)),i!==void 0?(n._$Co??(n._$Co=[]))[i]=s:n._$Cl=s),s!==void 0&&(t=It(e,s._$AS(e,t.values),s,i)),t}class id{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:i}=this._$AD,s=((t==null?void 0:t.creationScope)??ct).importNode(n,!0);rt.currentNode=s;let o=rt.nextNode(),r=0,a=0,u=i[0];for(;u!==void 0;){if(r===u.index){let c;u.type===2?c=new ki(o,o.nextSibling,this,t):u.type===1?c=new u.ctor(o,u.name,u.strings,this,t):u.type===6&&(c=new ad(o,this,t)),this._$AV.push(c),u=i[++a]}r!==(u==null?void 0:u.index)&&(o=rt.nextNode(),r++)}return rt.currentNode=ct,s}p(t){let n=0;for(const i of this._$AV)i!==void 0&&(i.strings!==void 0?(i._$AI(t,i,n),n+=i.strings.length-2):i._$AI(t[n])),n++}}let ki=class cl{get _$AU(){var t;return((t=this._$AM)==null?void 0:t._$AU)??this._$Cv}constructor(t,n,i,s){this.type=2,this._$AH=k,this._$AN=void 0,this._$AA=t,this._$AB=n,this._$AM=i,this.options=s,this._$Cv=(s==null?void 0:s.isConnected)??!0}get parentNode(){let t=this._$AA.parentNode;const n=this._$AM;return n!==void 0&&(t==null?void 0:t.nodeType)===11&&(t=n.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,n=this){t=It(this,t,n),mn(t)?t===k||t==null||t===""?(this._$AH!==k&&this._$AR(),this._$AH=k):t!==this._$AH&&t!==Qe&&this._(t):t._$litType$!==void 0?this.$(t):t.nodeType!==void 0?this.T(t):ed(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!==k&&mn(this._$AH)?this._$AA.nextSibling.data=t:this.T(ct.createTextNode(t)),this._$AH=t}$(t){var o;const{values:n,_$litType$:i}=t,s=typeof i=="number"?this._$AC(t):(i.el===void 0&&(i.el=Ts.createElement(al(i.h,i.h[0]),this.options)),i);if(((o=this._$AH)==null?void 0:o._$AD)===s)this._$AH.p(n);else{const r=new id(s,this),a=r.u(this.options);r.p(n),this.T(a),this._$AH=r}}_$AC(t){let n=xr.get(t.strings);return n===void 0&&xr.set(t.strings,n=new Ts(t)),n}k(t){so(this._$AH)||(this._$AH=[],this._$AR());const n=this._$AH;let i,s=0;for(const o of t)s===n.length?n.push(i=new cl(this.O(gn()),this.O(gn()),this,this.options)):i=n[s],i._$AI(o),s++;s<n.length&&(this._$AR(i&&i._$AB.nextSibling,s),n.length=s)}_$AR(t=this._$AA.nextSibling,n){var i;for((i=this._$AP)==null?void 0:i.call(this,!1,!0,n);t!==this._$AB;){const s=yr(t).nextSibling;yr(t).remove(),t=s}}setConnected(t){var n;this._$AM===void 0&&(this._$Cv=t,(n=this._$AP)==null||n.call(this,t))}};class Si{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,n,i,s,o){this.type=1,this._$AH=k,this._$AN=void 0,this.element=t,this.name=n,this._$AM=s,this.options=o,i.length>2||i[0]!==""||i[1]!==""?(this._$AH=Array(i.length-1).fill(new String),this.strings=i):this._$AH=k}_$AI(t,n=this,i,s){const o=this.strings;let r=!1;if(o===void 0)t=It(this,t,n,0),r=!mn(t)||t!==this._$AH&&t!==Qe,r&&(this._$AH=t);else{const a=t;let u,c;for(t=o[0],u=0;u<o.length-1;u++)c=It(this,a[i+u],n,u),c===Qe&&(c=this._$AH[u]),r||(r=!mn(c)||c!==this._$AH[u]),c===k?t=k:t!==k&&(t+=(c??"")+o[u+1]),this._$AH[u]=c}r&&!s&&this.j(t)}j(t){t===k?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??"")}}let sd=class extends Si{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===k?void 0:t}},od=class extends Si{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==k)}},rd=class extends Si{constructor(t,n,i,s,o){super(t,n,i,s,o),this.type=5}_$AI(t,n=this){if((t=It(this,t,n,0)??k)===Qe)return;const i=this._$AH,s=t===k&&i!==k||t.capture!==i.capture||t.once!==i.once||t.passive!==i.passive,o=t!==k&&(i===k||s);s&&this.element.removeEventListener(this.name,this,i),o&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){var n;typeof this._$AH=="function"?this._$AH.call(((n=this.options)==null?void 0:n.host)??this.element,t):this._$AH.handleEvent(t)}},ad=class{constructor(t,n,i){this.element=t,this.type=6,this._$AN=void 0,this._$AM=n,this.options=i}get _$AU(){return this._$AM._$AU}_$AI(t){It(this,t)}};const ld={I:ki},Gi=an.litHtmlPolyfillSupport;Gi==null||Gi(Ts,ki),(an.litHtmlVersions??(an.litHtmlVersions=[])).push("3.3.2");const cd=(e,t,n)=>{const i=(n==null?void 0:n.renderBefore)??t;let s=i._$litPart$;if(s===void 0){const o=(n==null?void 0:n.renderBefore)??null;i._$litPart$=s=new ki(t.insertBefore(gn(),o),o,void 0,n??{})}return s._$AI(e),s};const lt=globalThis;let Mt=class extends Tt{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){var n;const t=super.createRenderRoot();return(n=this.renderOptions).renderBefore??(n.renderBefore=t.firstChild),t}update(t){const n=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=cd(n,this.renderRoot,this.renderOptions)}connectedCallback(){var t;super.connectedCallback(),(t=this._$Do)==null||t.setConnected(!0)}disconnectedCallback(){var t;super.disconnectedCallback(),(t=this._$Do)==null||t.setConnected(!1)}render(){return Qe}};var nl;Mt._$litElement$=!0,Mt.finalized=!0,(nl=lt.litElementHydrateSupport)==null||nl.call(lt,{LitElement:Mt});const Qi=lt.litElementPolyfillSupport;Qi==null||Qi({LitElement:Mt});(lt.litElementVersions??(lt.litElementVersions=[])).push("4.2.2");const ul=e=>(t,n)=>{n!==void 0?n.addInitializer(()=>{customElements.define(e,t)}):customElements.define(e,t)};const ud={attribute:!0,type:String,converter:ei,reflect:!1,hasChanged:io},dd=(e=ud,t,n)=>{const{kind:i,metadata:s}=n;let o=globalThis.litPropertyMetadata.get(s);if(o===void 0&&globalThis.litPropertyMetadata.set(s,o=new Map),i==="setter"&&((e=Object.create(e)).wrapped=!0),o.set(n.name,e),i==="accessor"){const{name:r}=n;return{set(a){const u=t.get.call(this);t.set.call(this,a),this.requestUpdate(r,u,e,!0,a)},init(a){return a!==void 0&&this.C(r,void 0,e,a),a}}}if(i==="setter"){const{name:r}=n;return function(a){const u=this[r];t.call(this,a),this.requestUpdate(r,u,e,!0,a)}}throw Error("Unsupported decorator location: "+i)};function xi(e){return(t,n)=>typeof n=="object"?dd(e,t,n):((i,s,o)=>{const r=s.hasOwnProperty(o);return s.constructor.createProperty(o,i),r?Object.getOwnPropertyDescriptor(s,o):void 0})(e,t,n)}function y(e){return xi({...e,state:!0,attribute:!1})}const pd=50,hd=200,fd="Assistant";function $r(e,t){if(typeof e!="string")return;const n=e.trim();if(n)return n.length<=t?n:n.slice(0,t)}function _s(e){const t=$r(e==null?void 0:e.name,pd)??fd,n=$r((e==null?void 0:e.avatar)??void 0,hd)??null;return{agentId:typeof(e==null?void 0:e.agentId)=="string"&&e.agentId.trim()?e.agentId.trim():null,name:t,avatar:n}}function gd(){return _s(typeof window>"u"?{}:{name:window.__TASKMASTER_ASSISTANT_NAME__,avatar:window.__TASKMASTER_ASSISTANT_AVATAR__})}const ni="taskmaster.control.settings.v1",dl="taskmaster.account.settings.";function ln(){return`${location.protocol==="https:"?"wss":"ws"}://${location.host}`}const Ct={gatewayUrl:ln(),token:"",theme:"system",navCollapsed:!1,navGroupsCollapsed:{}},He={sessionKey:"main",lastActiveSessionKey:"main",chatFocusMode:!1,chatShowThinking:!1,splitRatio:.6};function md(){try{const e=localStorage.getItem(ni);if(!e)return{...Ct,gatewayUrl:ln()};const t=JSON.parse(e);return{gatewayUrl:typeof t.gatewayUrl=="string"&&t.gatewayUrl.trim()?t.gatewayUrl.trim():ln(),token:typeof t.token=="string"?t.token:Ct.token,theme:t.theme==="light"||t.theme==="dark"||t.theme==="system"?t.theme:Ct.theme,navCollapsed:typeof t.navCollapsed=="boolean"?t.navCollapsed:Ct.navCollapsed,navGroupsCollapsed:typeof t.navGroupsCollapsed=="object"&&t.navGroupsCollapsed!==null?t.navGroupsCollapsed:Ct.navGroupsCollapsed}}catch{return{...Ct,gatewayUrl:ln()}}}function yd(e){if(!e)return{...He};try{const t=localStorage.getItem(dl+e);if(!t)return{...He};const n=JSON.parse(t);return{sessionKey:typeof n.sessionKey=="string"&&n.sessionKey.trim()?n.sessionKey.trim():He.sessionKey,lastActiveSessionKey:typeof n.lastActiveSessionKey=="string"&&n.lastActiveSessionKey.trim()?n.lastActiveSessionKey.trim():typeof n.sessionKey=="string"&&n.sessionKey.trim()||He.lastActiveSessionKey,chatFocusMode:typeof n.chatFocusMode=="boolean"?n.chatFocusMode:He.chatFocusMode,chatShowThinking:typeof n.chatShowThinking=="boolean"?n.chatShowThinking:He.chatShowThinking,splitRatio:typeof n.splitRatio=="number"&&n.splitRatio>=.4&&n.splitRatio<=.7?n.splitRatio:He.splitRatio}}catch{return{...He}}}let ii=null;function Ar(e){ii=e}function Yi(){return{...md(),...yd(ii)}}function vd(e){const t={gatewayUrl:e.gatewayUrl,token:e.token,theme:e.theme,navCollapsed:e.navCollapsed,navGroupsCollapsed:e.navGroupsCollapsed};if(localStorage.setItem(ni,JSON.stringify(t)),ii){const n={sessionKey:e.sessionKey,lastActiveSessionKey:e.lastActiveSessionKey,chatFocusMode:e.chatFocusMode,chatShowThinking:e.chatShowThinking,splitRatio:e.splitRatio};localStorage.setItem(dl+ii,JSON.stringify(n))}}(function(){try{const t=localStorage.getItem(ni);if(!t)return;const n=JSON.parse(t);if(!("sessionKey"in n))return;const i={gatewayUrl:typeof n.gatewayUrl=="string"?n.gatewayUrl:ln(),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(ni,JSON.stringify(i))}catch{}})();function pl(e){var o;const t=(e??"").trim();if(!t)return null;const n=t.split(":").filter(Boolean);if(n.length<3||n[0]!=="agent")return null;const i=(o=n[1])==null?void 0:o.trim(),s=n.slice(2).join(":");return!i||!s?null:{agentId:i,rest:s}}const bd=/<\s*\/?\s*(?:think(?:ing)?|thought|antthinking|final)\b/i,In=/<\s*\/?\s*final\b[^>]*>/gi,Er=/<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\b[^>]*>/gi;function wd(e,t){return e.trimStart()}function kd(e,t){if(!e||!bd.test(e))return e;let n=e;In.test(n)?(In.lastIndex=0,n=n.replace(In,"")):In.lastIndex=0,Er.lastIndex=0;let i="",s=0,o=!1;for(const r of n.matchAll(Er)){const a=r.index??0,u=r[1]==="/";o?u&&(o=!1):(i+=n.slice(s,a),u||(o=!0)),s=a+r[0].length}return i+=n.slice(s),wd(i)}function hl(e){return!e&&e!==0?"n/a":new Date(e).toLocaleString(void 0,{dateStyle:"medium",timeStyle:"medium"})}function $i(e){if(!e&&e!==0)return"n/a";const t=Date.now()-e;if(t<0){const r=-t,a=Math.round(r/1e3);if(a<60)return`in ${a}s`;const u=Math.round(a/60);if(u<60)return`in ${u}m`;const c=Math.round(u/60);return c<48?`in ${c}h`:`in ${Math.round(c/24)}d`}const n=Math.round(t/1e3);if(n<60)return`${n}s ago`;const i=Math.round(n/60);if(i<60)return`${i}m ago`;const s=Math.round(i/60);return s<48?`${s}h ago`:`${Math.round(s/24)}d ago`}function fl(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 i=Math.round(n/60);return i<48?`${i}h`:`${Math.round(i/24)}d`}function Sd(e,t=120){return e.length<=t?e:`${e.slice(0,Math.max(0,t-1))}…`}function gl(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 si(e,t){const n=Number(e);return Number.isFinite(n)?n:t}function Xi(e){return kd(e)}const xd=/^\[([^\]]+)\]\s*/,$d=["WebChat","WhatsApp","Telegram","Signal","Slack","Discord","iMessage","Teams","Matrix","Zalo","Zalo Personal","BlueBubbles"],Zi=new WeakMap,Ji=new WeakMap;function Ad(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:$d.some(t=>e.startsWith(`${t} `))}function es(e){const t=e.match(xd);if(!t)return e;const n=t[1]??"";return Ad(n)?e.slice(t[0].length):e}function cn(e){const t=e,n=typeof t.role=="string"?t.role:"",i=t.content;if(typeof i=="string")return n==="assistant"?Xi(i):es(i);if(Array.isArray(i)){const s=i.map(o=>{const r=o;return r.type==="text"&&typeof r.text=="string"?r.text:null}).filter(o=>typeof o=="string");if(s.length>0){const o=s.join(`
4
- `);return n==="assistant"?Xi(o):es(o)}}return typeof t.text=="string"?n==="assistant"?Xi(t.text):es(t.text):null}function ml(e){if(!e||typeof e!="object")return cn(e);const t=e;if(Zi.has(t))return Zi.get(t)??null;const n=cn(e);return Zi.set(t,n),n}function Cr(e){const n=e.content,i=[];if(Array.isArray(n))for(const a of n){const u=a;if(u.type==="thinking"&&typeof u.thinking=="string"){const c=u.thinking.trim();c&&i.push(c)}}if(i.length>0)return i.join(`
5
- `);const s=Cd(e);if(!s)return null;const r=[...s.matchAll(/<\s*think(?:ing)?\s*>([\s\S]*?)<\s*\/\s*think(?:ing)?\s*>/gi)].map(a=>(a[1]??"").trim()).filter(Boolean);return r.length>0?r.join(`
6
- `):null}function Ed(e){if(!e||typeof e!="object")return Cr(e);const t=e;if(Ji.has(t))return Ji.get(t)??null;const n=Cr(e);return Ji.set(t,n),n}function Cd(e){const t=e,n=t.content;if(typeof n=="string")return n;if(Array.isArray(n)){const i=n.map(s=>{const o=s;return o.type==="text"&&typeof o.text=="string"?o.text:null}).filter(s=>typeof s=="string");if(i.length>0)return i.join(`
7
- `)}return typeof t.text=="string"?t.text:null}function Td(e){const t=e.trim();if(!t)return"";const n=t.split(/\r?\n/).map(i=>i.trim()).filter(Boolean).map(i=>`_${i}_`);return n.length?["_Reasoning:_",...n].join(`
8
- `):""}const _d=/Read HEARTBEAT\.md if it exists|reply HEARTBEAT_OK/i,Md=/^[\s*`_]*HEARTBEAT_OK[\s*`_]*$/i,Pd=/^[\s*`_]*NO_REPLY[\s*`_]*$/i,Ld=/^A new session was started via \/new or \/reset\./;function Id(e){const t=e,n=typeof t.role=="string"?t.role:"";let i="";typeof t.content=="string"?i=t.content:Array.isArray(t.content)?i=t.content.filter(o=>typeof o=="object"&&o!==null).map(o=>o.text??"").join(" "):typeof t.text=="string"&&(i=t.text);const s=i.trim();return s?!!(n==="user"&&_d.test(s)||n==="assistant"&&Md.test(s)||n==="user"&&Ld.test(s)||n==="assistant"&&Pd.test(s)):!1}function yl(e){return e.filter(t=>!Id(t))}function vl(e){const t=e;let n=typeof t.role=="string"?t.role:"unknown";const i=typeof t.toolCallId=="string"||typeof t.tool_call_id=="string",s=t.content,o=Array.isArray(s)?s:null,r=Array.isArray(o)&&o.some(d=>{const v=String(d.type??"").toLowerCase();return v==="toolresult"||v==="tool_result"}),a=typeof t.toolName=="string"||typeof t.tool_name=="string";(i||r||a)&&(n="toolResult");let u=[];typeof t.content=="string"?u=[{type:"text",text:t.content}]:Array.isArray(t.content)?u=t.content.map(d=>({type:d.type||"text",text:d.text,name:d.name,args:d.args||d.arguments})):typeof t.text=="string"&&(u=[{type:"text",text:t.text}]);const c=typeof t.timestamp=="number"?t.timestamp:Date.now(),l=typeof t.id=="string"?t.id:void 0;return{role:n,content:u,timestamp:c,id:l}}function bl(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 wl(e){const t=e,n=typeof t.role=="string"?t.role.toLowerCase():"";return n==="toolresult"||n==="tool_result"}function Tr(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 Rd(){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 oo(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),Tr(t)}return Tr(Rd())}const Pe=50;async function Me(e,t){if(!e.client||!e.connected)return;e.chatLoading=!0,e.lastError=null;const n=(t==null?void 0:t.limit)??Pe;try{const i=await e.client.request("chat.history",{sessionKey:e.sessionKey,limit:n}),s=Array.isArray(i.messages)?i.messages:[],o=typeof i.totalMessages=="number"?i.totalMessages:s.length,r=yl(s);e.chatMessages=r,e.chatHistoryTotal=o,e.chatHistoryHasMore=o>s.length,e.chatThinkingLevel=i.thinkingLevel??null,e.chatModelProvider=typeof i.modelProvider=="string"?i.modelProvider:null,e.chatModel=typeof i.model=="string"?i.model:null,e.chatVerboseLevel=typeof i.verboseLevel=="string"?i.verboseLevel:null,e.chatFillerEnabled=typeof i.fillerEnabled=="boolean"?i.fillerEnabled:null}catch(i){e.lastError=String(i)}finally{e.chatLoading=!1}}async function Nd(e){if(!e.client||!e.connected||e.chatLoadingOlder||!e.chatHistoryHasMore)return!1;e.chatLoadingOlder=!0;try{const t=e.chatMessages.length,n=await e.client.request("chat.history",{sessionKey:e.sessionKey,limit:Pe,offset:t}),i=Array.isArray(n.messages)?n.messages:[],s=typeof n.totalMessages=="number"?n.totalMessages:0;if(i.length===0)return e.chatHistoryHasMore=!1,!1;const o=yl(i);return e.chatMessages=[...o,...e.chatMessages],e.chatHistoryTotal=s,e.chatHistoryHasMore=s>t+i.length,!0}catch(t){return e.lastError=String(t),!1}finally{e.chatLoadingOlder=!1}}function Dd(e){const t=/^data:([^;]+);base64,(.+)$/.exec(e);return t?{mimeType:t[1],content:t[2]}:null}async function kl(e,t,n){if(e.chatSuggestion=null,!e.client||!e.connected)return!1;const i=t.trim(),s=n&&n.length>0;if(!i&&!s)return!1;const o=Date.now(),r=(n??[]).filter(v=>!v.fileName),a=(n??[]).filter(v=>v.fileName),u=[],c=a.map(v=>v.fileName).filter(Boolean);if(c.length>0){const v=i?`${c.join(", ")}
9
-
10
- ${i}`:c.join(", ");u.push({type:"text",text:v})}else i&&u.push({type:"text",text:i});for(const v of r)u.push({type:"image",source:{type:"base64",media_type:v.mimeType,data:v.dataUrl}});e.chatMessages=[...e.chatMessages,{role:"user",content:u,timestamp:o}],e.chatSending=!0,e.lastError=null;const l=oo();e.chatRunId=l,e.chatStream="",e.chatStreamStartedAt=o;const d=[...r,...a],h=d.length>0?d.map(v=>{if(v.textContent)return{type:"document",mimeType:v.mimeType||"text/plain",fileName:v.fileName,content:btoa(unescape(encodeURIComponent(v.textContent)))};const f=Dd(v.dataUrl);return f?{type:v.fileName?"document":"image",mimeType:f.mimeType,fileName:v.fileName,content:f.content}:null}).filter(v=>v!==null):void 0;try{return await e.client.request("chat.send",{sessionKey:e.sessionKey,message:i,deliver:!1,idempotencyKey:l,attachments:h}),!0}catch(v){const f=String(v);return e.chatRunId=null,e.chatStream=null,e.chatStreamStartedAt=null,e.lastError=f,e.chatMessages=[...e.chatMessages,{role:"assistant",content:[{type:"text",text:"Error: "+f}],timestamp:Date.now()}],!1}finally{e.chatSending=!1}}async function Sl(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 xl(e,t){var n,i;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==="working"){const o=(t.message?(n=cn(t.message))==null?void 0:n.trim():void 0)||((i=e.chatStream)==null?void 0:i.trim());return o&&(e.chatInterimText=e.chatInterimText?`${e.chatInterimText}
11
-
12
- ${o}`:o),e.chatStream="","working"}else if(t.state==="block"){const s=cn(t.message);return typeof s=="string"&&s.trim()&&(e.chatMessages=[...e.chatMessages,{role:"assistant",content:[{type:"text",text:s.trim()}],timestamp:Date.now(),filler:!0}]),"block"}else if(t.state==="delta"){e.chatSuggestion=null;const s=cn(t.message);if(typeof s=="string"){if(s.trim()==="NO_REPLY")return null;const o=e.chatStream??"";(!o||s.length>=o.length)&&(e.chatStream=s)}}else t.state==="final"||t.state==="aborted"?(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null,e.chatInterimText=null):t.state==="error"&&(e.chatStream=null,e.chatRunId=null,e.chatStreamStartedAt=null,e.chatInterimText=null,e.lastError=t.errorMessage??"chat error");return t.state}const oi=Object.freeze(Object.defineProperty({__proto__:null,CHAT_PAGE_SIZE:Pe,abortChatRun:Sl,handleChatEvent:xl,loadChatHistory:Me,loadOlderChatHistory:Nd,sendChatMessage:kl},Symbol.toStringTag,{value:"Module"}));async function ro(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=si(e.sessionsFilterActive??"",0),i=si(e.sessionsFilterLimit??"",0);n>0&&(t.activeMinutes=n),i>0&&(t.limit=i);const s=await e.client.request("sessions.list",t);s&&(e.sessionsResult=s)}catch(t){e.sessionsError=String(t)}finally{e.sessionsLoading=!1}}}async function Rn(e,t,n){if(!e.client||!e.connected)return;const i={key:t};"label"in n&&(i.label=n.label),"thinkingLevel"in n&&(i.thinkingLevel=n.thinkingLevel),"verboseLevel"in n&&(i.verboseLevel=n.verboseLevel),"reasoningLevel"in n&&(i.reasoningLevel=n.reasoningLevel),"model"in n&&(i.model=n.model),"fillerEnabled"in n&&(i.fillerEnabled=n.fillerEnabled);try{await e.client.request("sessions.patch",i),await ro(e)}catch(s){e.sessionsError=String(s)}}const _r=50,Od=80,Bd=12e4;function Fd(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 i=n.map(s=>{if(!s||typeof s!="object")return null;const o=s;return o.type==="text"&&typeof o.text=="string"?o.text:null}).filter(s=>!!s);return i.length===0?null:i.join(`
13
- `)}function Mr(e){if(e==null)return null;if(typeof e=="number"||typeof e=="boolean")return String(e);const t=Fd(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 i=gl(n,Bd);return i.truncated?`${i.text}
14
-
15
- … truncated (${i.total} chars, showing first ${i.text.length}).`:i.text}function Ud(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 Wd(e){if(e.toolStreamOrder.length<=_r)return;const t=e.toolStreamOrder.length-_r,n=e.toolStreamOrder.splice(0,t);for(const i of n)e.toolStreamById.delete(i)}function Kd(e){e.chatToolMessages=e.toolStreamOrder.map(t=>{var n;return(n=e.toolStreamById.get(t))==null?void 0:n.message}).filter(t=>!!t)}function Ms(e){e.toolStreamSyncTimer!=null&&(clearTimeout(e.toolStreamSyncTimer),e.toolStreamSyncTimer=null),Kd(e)}function zd(e,t=!1){if(t){Ms(e);return}e.toolStreamSyncTimer==null&&(e.toolStreamSyncTimer=window.setTimeout(()=>Ms(e),Od))}function ao(e){e.toolStreamById.clear(),e.toolStreamOrder=[],e.chatToolMessages=[],Ms(e)}const jd=5e3;function Hd(e,t){var s;const n=t.data??{},i=typeof n.phase=="string"?n.phase:"";e.compactionClearTimer!=null&&(window.clearTimeout(e.compactionClearTimer),e.compactionClearTimer=null),i==="start"?e.compactionStatus={active:!0,startedAt:Date.now(),completedAt:null}:i==="end"&&(e.compactionStatus={active:!1,startedAt:((s=e.compactionStatus)==null?void 0:s.startedAt)??null,completedAt:Date.now()},e.compactionClearTimer=window.setTimeout(()=>{e.compactionStatus=null,e.compactionClearTimer=null},jd))}function qd(e,t){if(!t)return;if(t.stream==="compaction"){Hd(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 i=t.data??{},s=typeof i.toolCallId=="string"?i.toolCallId:"";if(!s)return;const o=typeof i.name=="string"?i.name:"tool",r=typeof i.phase=="string"?i.phase:"",a=r==="start"?i.args:void 0,u=r==="update"?Mr(i.partialResult):r==="result"?Mr(i.result):void 0,c=Date.now();let l=e.toolStreamById.get(s);l?(l.name=o,a!==void 0&&(l.args=a),u!==void 0&&(l.output=u),l.updatedAt=c):(l={toolCallId:s,runId:t.runId,sessionKey:n,name:o,args:a,output:u,startedAt:typeof t.ts=="number"?t.ts:c,updatedAt:c,message:{}},e.toolStreamById.set(s,l),e.toolStreamOrder.push(s)),l.message=Ud(l),Wd(e),zd(e,r==="result")}let Nn=0;function Bt(e,t=!1){e.chatScrollFrame&&cancelAnimationFrame(e.chatScrollFrame),e.chatScrollTimeout!=null&&(clearTimeout(e.chatScrollTimeout),e.chatScrollTimeout=null);const n=++Nn,i=()=>{const s=e.querySelector(".chat-thread");if(s){const o=getComputedStyle(s).overflowY;if(o==="auto"||o==="scroll"||s.scrollHeight-s.clientHeight>1)return s}return document.scrollingElement??document.documentElement};e.updateComplete.then(()=>{n===Nn&&(e.chatScrollFrame=requestAnimationFrame(()=>{if(e.chatScrollFrame=null,n!==Nn)return;const s=i();if(!s)return;const o=s.scrollHeight-s.scrollTop-s.clientHeight;if(!(t||e.chatUserNearBottom||o<200))return;t&&(e.chatHasAutoScrolled=!0),s.scrollTop=s.scrollHeight,e.chatUserNearBottom=!0;const a=t?150:120;e.chatScrollTimeout=window.setTimeout(()=>{if(e.chatScrollTimeout=null,n!==Nn)return;const u=i();if(!u)return;const c=u.scrollHeight-u.scrollTop-u.clientHeight;(t||e.chatUserNearBottom||c<200)&&(u.scrollTop=u.scrollHeight,e.chatUserNearBottom=!0)},a)}))})}function $l(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 Vd(e,t){const n=t.currentTarget;if(!n)return;const i=n.scrollHeight-n.scrollTop-n.clientHeight;e.chatUserNearBottom=i<200,n.scrollTop<100&&e.onLoadOlder&&e.onLoadOlder()}function Gd(e){const t=e.querySelector(".chat-thread");if(!t)return null;const n=t.scrollHeight,i=t.scrollTop;return()=>{const s=t.scrollHeight-n;t.scrollTop=i+s}}function Qd(e,t){const n=t.currentTarget;n&&(e.logsAtBottom=n.scrollTop<80)}function Yd(e,t){const n=t.currentTarget;n&&(e.logsAtBottom=n.scrollTop<80)}function Xd(e){e.chatHasAutoScrolled=!1,e.chatUserNearBottom=!0}function Zd(e,t){if(e.length===0)return;const n=new Blob([`${e.join(`
16
- `)}
17
- `],{type:"text/plain"}),i=URL.createObjectURL(n),s=document.createElement("a"),o=new Date().toISOString().slice(0,19).replace(/[:T]/g,"-");s.href=i,s.download=`taskmaster-logs-${t}-${o}.log`,s.click(),URL.revokeObjectURL(i)}function Jd(e,t){if(e.length===0)return;const n=new Blob([`${e.join(`
18
- `)}
19
- `],{type:"text/plain"}),i=URL.createObjectURL(n),s=document.createElement("a"),o=new Date().toISOString().slice(0,19).replace(/[:T]/g,"-");s.href=i,s.download=`taskmaster-session-logs-${t}-${o}.log`,s.click(),URL.revokeObjectURL(i)}function ep(e){if(typeof ResizeObserver>"u")return;const t=e.querySelector(".topbar");if(!t)return;const n=()=>{const{height:i}=t.getBoundingClientRect();e.style.setProperty("--topbar-height",`${i}px`)};n(),e.topbarObserver=new ResizeObserver(()=>n()),e.topbarObserver.observe(t)}function Ye(e){return typeof structuredClone=="function"?structuredClone(e):JSON.parse(JSON.stringify(e))}function ut(e){return`${JSON.stringify(e,null,2).trimEnd()}
20
- `}function Al(e,t,n){if(t.length===0)return;let i=e;for(let o=0;o<t.length-1;o+=1){const r=t[o],a=t[o+1];if(typeof r=="number"){if(!Array.isArray(i))return;i[r]==null&&(i[r]=typeof a=="number"?[]:{}),i=i[r]}else{if(typeof i!="object"||i==null)return;const u=i;u[r]==null&&(u[r]=typeof a=="number"?[]:{}),i=u[r]}}const s=t[t.length-1];if(typeof s=="number"){Array.isArray(i)&&(i[s]=n);return}typeof i=="object"&&i!=null&&(i[s]=n)}async function Le(e){if(!(!e.client||!e.connected)){e.configLoading=!0,e.lastError=null;try{const t=await e.client.request("config.get",{});np(e,t)}catch(t){e.lastError=String(t)}finally{e.configLoading=!1}}}async function El(e){if(!(!e.client||!e.connected)&&!e.configSchemaLoading){e.configSchemaLoading=!0;try{const t=await e.client.request("config.schema",{});tp(e,t)}catch(t){e.lastError=String(t)}finally{e.configSchemaLoading=!1}}}function tp(e,t){e.configSchema=t.schema??null,e.configUiHints=t.uiHints??{},e.configSchemaVersion=t.version??null}function np(e,t){e.configSnapshot=t;const n=typeof t.raw=="string"?t.raw:t.config&&typeof t.config=="object"?ut(t.config):e.configRaw;!e.configFormDirty||e.configFormMode==="raw"?e.configRaw=n:e.configForm?e.configRaw=ut(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=Ye(t.config??{}),e.configFormOriginal=Ye(t.config??{}),e.configRawOriginal=n)}async function ip(e){var t;if(!(!e.client||!e.connected)){e.configSaving=!0,e.lastError=null;try{const n=e.configFormMode==="form"&&e.configForm?ut(e.configForm):e.configRaw,i=(t=e.configSnapshot)==null?void 0:t.hash;if(!i){e.lastError="Config hash missing; reload and retry.";return}await e.client.request("config.set",{raw:n,baseHash:i}),e.configFormDirty=!1,await Le(e)}catch(n){e.lastError=String(n)}finally{e.configSaving=!1}}}async function bn(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 Ai(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 sp(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=si(e.everyAmount,0);if(n<=0)throw new Error("Invalid interval amount.");const i=e.everyUnit;return{kind:"every",everyMs:n*(i==="minutes"?6e4:i==="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 op(e){if(e.payloadKind==="systemEvent"){const s=e.payloadText.trim();if(!s)throw new Error("System event text required.");return{kind:"systemEvent",text:s}}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 i=si(e.timeoutSeconds,0);return i>0&&(n.timeoutSeconds=i),n}async function rp(e){var t;if(!(!e.client||!e.connected||e.cronBusy)){e.cronBusy=!0,e.cronError=null;try{const n=sp(e.cronForm),i=op(e.cronForm),s=e.cronForm.agentId.trim(),o=(t=e.cronForm.accountId)==null?void 0:t.trim(),r={name:e.cronForm.name.trim(),description:e.cronForm.description.trim()||void 0,agentId:s||void 0,accountId:o||void 0,enabled:e.cronForm.enabled,schedule:n,sessionTarget:e.cronForm.sessionTarget,wakeMode:e.cronForm.wakeMode,payload:i,isolation:e.cronForm.postToMainPrefix.trim()&&e.cronForm.sessionTarget==="isolated"?{postToMainPrefix:e.cronForm.postToMainPrefix.trim()}:void 0};if(!r.name)throw new Error("Name required.");await e.client.request("cron.add",r),e.cronForm={...e.cronForm,name:"",description:"",payloadText:""},await Ai(e),await bn(e)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function ap(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 Ai(e),await bn(e)}catch(i){e.cronError=String(i)}finally{e.cronBusy=!1}}}async function lp(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 Ps(e,t.id)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function cp(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 Ai(e),await bn(e)}catch(n){e.cronError=String(n)}finally{e.cronBusy=!1}}}async function Ps(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 G(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 lo(e,t,n){if(!(!e.client||!e.connected||e.whatsappBusy)){e.whatsappBusy=!0,e.whatsappActiveQrAccountId=n??null;try{const i=await e.client.request("web.login.start",{force:t,timeoutMs:3e4,accountId:n});e.whatsappLoginMessage=i.message??null,e.whatsappLoginQrDataUrl=i.qrDataUrl??null,e.whatsappLoginConnected=null}catch(i){e.whatsappLoginMessage=String(i),e.whatsappLoginQrDataUrl=null,e.whatsappLoginConnected=null}finally{e.whatsappBusy=!1}}}async function Cl(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 Tl(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 _l(e,t){if(!e.client||!e.connected||e.whatsappAccountSaving)return;const n=t.trim();if(!n){e.whatsappAccountError="Account name is required.";return}const i=n.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");if(!i){e.whatsappAccountError="Invalid account name.";return}e.whatsappAccountSaving=!0,e.whatsappAccountError=null;try{const s=await e.client.request("config.get",{});e.configSnapshot=s;const o=Ye(s.config??{});(!o.channels||typeof o.channels!="object")&&(o.channels={});const r=o.channels;(!r.whatsapp||typeof r.whatsapp!="object")&&(r.whatsapp={});const a=r.whatsapp;(!a.accounts||typeof a.accounts!="object")&&(a.accounts={});const u=a.accounts;if(u[i]){e.whatsappAccountError=`Account "${i}" already exists.`;return}u[i]={name:n,provider:"baileys"};const c=s.hash;if(!c){e.whatsappAccountError="Config hash missing; reload and retry.";return}const l=ut(o);await e.client.request("config.set",{raw:l,baseHash:c}),e.addingWhatsAppAccount=!1,e.newWhatsAppAccountName="",await G(e,!0),await lo(e,!0,i)}catch(s){e.whatsappAccountError=String(s)}finally{e.whatsappAccountSaving=!1}}async function Ml(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 i=Ye(n.config??{}),s=i.channels,o=s==null?void 0:s.whatsapp,r=o==null?void 0:o.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(i.bindings)&&(i.bindings=i.bindings.filter(l=>{const d=l.match;return!d||d.channel!=="whatsapp"?!0:d.accountId!==t}));const u=n.hash;if(!u){e.whatsappAccountError="Config hash missing; reload and retry.";return}const c=ut(i);await e.client.request("config.set",{raw:c,baseHash:u}),e.whatsappActiveQrAccountId===t&&(e.whatsappActiveQrAccountId=null,e.whatsappLoginQrDataUrl=null,e.whatsappLoginMessage=null),await G(e,!0)}catch(n){e.whatsappAccountError=String(n)}finally{e.whatsappAccountSaving=!1}}}const up=Object.freeze(Object.defineProperty({__proto__:null,addWhatsAppAccount:_l,loadChannels:G,logoutWhatsApp:Tl,removeWhatsAppAccount:Ml,startWhatsAppLogin:lo,waitWhatsAppLogin:Cl},Symbol.toStringTag,{value:"Module"}));async function co(e){if(!(!e.client||!e.connected)&&!e.debugLoading){e.debugLoading=!0;try{const[t,n,i,s]=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=i;e.debugModels=Array.isArray(o==null?void 0:o.models)?o==null?void 0:o.models:[],e.debugHeartbeat=s}catch(t){e.debugCallError=String(t)}finally{e.debugLoading=!1}}}const dp=2e3,pp=new Set(["trace","debug","info","warn","error","fatal"]);function hp(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 fp(e){if(typeof e!="string")return null;const t=e.toLowerCase();return pp.has(t)?t:null}function Pl(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,i=typeof t.time=="string"?t.time:typeof(n==null?void 0:n.date)=="string"?n==null?void 0:n.date:null,s=fp((n==null?void 0:n.logLevelName)??(n==null?void 0:n.level)),o=typeof t[0]=="string"?t[0]:typeof(n==null?void 0:n.name)=="string"?n==null?void 0:n.name:null,r=hp(o);let a=null;r&&(typeof r.subsystem=="string"?a=r.subsystem:typeof r.module=="string"&&(a=r.module)),!a&&o&&o.length<120&&(a=o);let u=null;return typeof t[1]=="string"?u=t[1]:!r&&typeof t[0]=="string"?u=t[0]:typeof t.message=="string"&&(u=t.message),{raw:e,time:i,level:s,subsystem:a,message:u??e,meta:n??void 0}}catch{return{raw:e,message:e}}}async function Pt(e,t){if(!(!e.client||!e.connected)&&!(e.logsLoading&&!(t!=null&&t.quiet))){t!=null&&t.quiet||(e.logsLoading=!0),e.logsError=null;try{const i=await e.client.request("logs.tail",{cursor:t!=null&&t.reset?void 0:e.logsCursor??void 0,limit:e.logsLimit,maxBytes:e.logsMaxBytes}),o=(Array.isArray(i.lines)?i.lines.filter(a=>typeof a=="string"):[]).map(Pl),r=!!(t!=null&&t.reset||i.reset||e.logsCursor==null);e.logsEntries=r?o:[...e.logsEntries,...o].slice(-dp),typeof i.cursor=="number"&&(e.logsCursor=i.cursor),typeof i.file=="string"&&(e.logsFile=i.file),e.logsTruncated=!!i.truncated,e.logsLastFetchAt=Date.now()}catch(n){e.logsError=String(n)}finally{t!=null&&t.quiet||(e.logsLoading=!1)}}}const gp=Object.freeze(Object.defineProperty({__proto__:null,loadLogs:Pt,parseLogLine:Pl},Symbol.toStringTag,{value:"Module"}));const Ll={p:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffedn,n:0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3edn,h:8n,a:0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffecn,d:0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3n,Gx:0x216936d3cd6e53fec0a4e231fdd6dc5c692cc7609525a7b2c9562d608f25d51an,Gy:0x6666666666666666666666666666666666666666666666666666666666666658n},{p:re,n:Yn,Gx:Pr,Gy:Lr,a:ts,d:ns,h:mp}=Ll,dt=32,uo=64,yp=(...e)=>{"captureStackTrace"in Error&&typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(...e)},te=(e="")=>{const t=new Error(e);throw yp(t,te),t},vp=e=>typeof e=="bigint",bp=e=>typeof e=="string",wp=e=>e instanceof Uint8Array||ArrayBuffer.isView(e)&&e.constructor.name==="Uint8Array",Ze=(e,t,n="")=>{const i=wp(e),s=e==null?void 0:e.length,o=t!==void 0;if(!i||o&&s!==t){const r=n&&`"${n}" `,a=o?` of length ${t}`:"",u=i?`length=${s}`:`type=${typeof e}`;te(r+"expected Uint8Array"+a+", got "+u)}return e},Ei=e=>new Uint8Array(e),Il=e=>Uint8Array.from(e),Rl=(e,t)=>e.toString(16).padStart(t,"0"),Nl=e=>Array.from(Ze(e)).map(t=>Rl(t,2)).join(""),Oe={_0:48,_9:57,A:65,F:70,a:97,f:102},Ir=e=>{if(e>=Oe._0&&e<=Oe._9)return e-Oe._0;if(e>=Oe.A&&e<=Oe.F)return e-(Oe.A-10);if(e>=Oe.a&&e<=Oe.f)return e-(Oe.a-10)},Dl=e=>{const t="hex invalid";if(!bp(e))return te(t);const n=e.length,i=n/2;if(n%2)return te(t);const s=Ei(i);for(let o=0,r=0;o<i;o++,r+=2){const a=Ir(e.charCodeAt(r)),u=Ir(e.charCodeAt(r+1));if(a===void 0||u===void 0)return te(t);s[o]=a*16+u}return s},Ol=()=>globalThis==null?void 0:globalThis.crypto,kp=()=>{var e;return((e=Ol())==null?void 0:e.subtle)??te("crypto.subtle must be defined, consider polyfill")},yn=(...e)=>{const t=Ei(e.reduce((i,s)=>i+Ze(s).length,0));let n=0;return e.forEach(i=>{t.set(i,n),n+=i.length}),t},Sp=(e=dt)=>Ol().getRandomValues(Ei(e)),ri=BigInt,ot=(e,t,n,i="bad number: out of range")=>vp(e)&&t<=e&&e<n?e:te(i),P=(e,t=re)=>{const n=e%t;return n>=0n?n:t+n},Bl=e=>P(e,Yn),xp=(e,t)=>{(e===0n||t<=0n)&&te("no inverse n="+e+" mod="+t);let n=P(e,t),i=t,s=0n,o=1n;for(;n!==0n;){const r=i/n,a=i%n,u=s-o*r;i=n,n=a,s=o,o=u}return i===1n?P(s,t):te("no inverse")},$p=e=>{const t=Kl[e];return typeof t!="function"&&te("hashes."+e+" not set"),t},is=e=>e instanceof pt?e:te("Point expected"),Ls=2n**256n,_e=class _e{constructor(t,n,i,s){U(this,"X");U(this,"Y");U(this,"Z");U(this,"T");const o=Ls;this.X=ot(t,0n,o),this.Y=ot(n,0n,o),this.Z=ot(i,1n,o),this.T=ot(s,0n,o),Object.freeze(this)}static CURVE(){return Ll}static fromAffine(t){return new _e(t.x,t.y,1n,P(t.x*t.y))}static fromBytes(t,n=!1){const i=ns,s=Il(Ze(t,dt)),o=t[31];s[31]=o&-129;const r=Ul(s);ot(r,0n,n?Ls:re);const u=P(r*r),c=P(u-1n),l=P(i*u+1n);let{isValid:d,value:h}=Ep(c,l);d||te("bad point: y not sqrt");const v=(h&1n)===1n,f=(o&128)!==0;return!n&&h===0n&&f&&te("bad point: x==0, isLastByteOdd"),f!==v&&(h=P(-h)),new _e(h,r,1n,P(h*r))}static fromHex(t,n){return _e.fromBytes(Dl(t),n)}get x(){return this.toAffine().x}get y(){return this.toAffine().y}assertValidity(){const t=ts,n=ns,i=this;if(i.is0())return te("bad point: ZERO");const{X:s,Y:o,Z:r,T:a}=i,u=P(s*s),c=P(o*o),l=P(r*r),d=P(l*l),h=P(u*t),v=P(l*P(h+c)),f=P(d+P(n*P(u*c)));if(v!==f)return te("bad point: equation left != right (1)");const b=P(s*o),S=P(r*a);return b!==S?te("bad point: equation left != right (2)"):this}equals(t){const{X:n,Y:i,Z:s}=this,{X:o,Y:r,Z:a}=is(t),u=P(n*a),c=P(o*s),l=P(i*a),d=P(r*s);return u===c&&l===d}is0(){return this.equals(_t)}negate(){return new _e(P(-this.X),this.Y,this.Z,P(-this.T))}double(){const{X:t,Y:n,Z:i}=this,s=ts,o=P(t*t),r=P(n*n),a=P(2n*P(i*i)),u=P(s*o),c=t+n,l=P(P(c*c)-o-r),d=u+r,h=d-a,v=u-r,f=P(l*h),b=P(d*v),S=P(l*v),$=P(h*d);return new _e(f,b,$,S)}add(t){const{X:n,Y:i,Z:s,T:o}=this,{X:r,Y:a,Z:u,T:c}=is(t),l=ts,d=ns,h=P(n*r),v=P(i*a),f=P(o*d*c),b=P(s*u),S=P((n+i)*(r+a)-h-v),$=P(b-f),A=P(b+f),C=P(v-l*h),T=P(S*$),M=P(A*C),R=P(S*C),B=P($*A);return new _e(T,M,B,R)}subtract(t){return this.add(is(t).negate())}multiply(t,n=!0){if(!n&&(t===0n||this.is0()))return _t;if(ot(t,1n,Yn),t===1n)return this;if(this.equals(ht))return Op(t).p;let i=_t,s=ht;for(let o=this;t>0n;o=o.double(),t>>=1n)t&1n?i=i.add(o):n&&(s=s.add(o));return i}multiplyUnsafe(t){return this.multiply(t,!1)}toAffine(){const{X:t,Y:n,Z:i}=this;if(this.equals(_t))return{x:0n,y:1n};const s=xp(i,re);P(i*s)!==1n&&te("invalid inverse");const o=P(t*s),r=P(n*s);return{x:o,y:r}}toBytes(){const{x:t,y:n}=this.assertValidity().toAffine(),i=Fl(n);return i[31]|=t&1n?128:0,i}toHex(){return Nl(this.toBytes())}clearCofactor(){return this.multiply(ri(mp),!1)}isSmallOrder(){return this.clearCofactor().is0()}isTorsionFree(){let t=this.multiply(Yn/2n,!1).double();return Yn%2n&&(t=t.add(this)),t.is0()}};U(_e,"BASE"),U(_e,"ZERO");let pt=_e;const ht=new pt(Pr,Lr,1n,P(Pr*Lr)),_t=new pt(0n,1n,1n,0n);pt.BASE=ht;pt.ZERO=_t;const Fl=e=>Dl(Rl(ot(e,0n,Ls),uo)).reverse(),Ul=e=>ri("0x"+Nl(Il(Ze(e)).reverse())),Ae=(e,t)=>{let n=e;for(;t-- >0n;)n*=n,n%=re;return n},Ap=e=>{const n=e*e%re*e%re,i=Ae(n,2n)*n%re,s=Ae(i,1n)*e%re,o=Ae(s,5n)*s%re,r=Ae(o,10n)*o%re,a=Ae(r,20n)*r%re,u=Ae(a,40n)*a%re,c=Ae(u,80n)*u%re,l=Ae(c,80n)*u%re,d=Ae(l,10n)*o%re;return{pow_p_5_8:Ae(d,2n)*e%re,b2:n}},Rr=0x2b8324804fc1df0b2b4d00993dfbd7a72f431806ad2fe478c4ee1b274a0ea0b0n,Ep=(e,t)=>{const n=P(t*t*t),i=P(n*n*t),s=Ap(e*i).pow_p_5_8;let o=P(e*n*s);const r=P(t*o*o),a=o,u=P(o*Rr),c=r===e,l=r===P(-e),d=r===P(-e*Rr);return c&&(o=a),(l||d)&&(o=u),(P(o)&1n)===1n&&(o=P(-o)),{isValid:c||l,value:o}},Is=e=>Bl(Ul(e)),po=(...e)=>Kl.sha512Async(yn(...e)),Cp=(...e)=>$p("sha512")(yn(...e)),Wl=e=>{const t=e.slice(0,dt);t[0]&=248,t[31]&=127,t[31]|=64;const n=e.slice(dt,uo),i=Is(t),s=ht.multiply(i),o=s.toBytes();return{head:t,prefix:n,scalar:i,point:s,pointBytes:o}},ho=e=>po(Ze(e,dt)).then(Wl),Tp=e=>Wl(Cp(Ze(e,dt))),_p=e=>ho(e).then(t=>t.pointBytes),Mp=e=>po(e.hashable).then(e.finish),Pp=(e,t,n)=>{const{pointBytes:i,scalar:s}=e,o=Is(t),r=ht.multiply(o).toBytes();return{hashable:yn(r,i,n),finish:c=>{const l=Bl(o+Is(c)*s);return Ze(yn(r,Fl(l)),uo)}}},Lp=async(e,t)=>{const n=Ze(e),i=await ho(t),s=await po(i.prefix,n);return Mp(Pp(i,s,n))},Kl={sha512Async:async e=>{const t=kp(),n=yn(e);return Ei(await t.digest("SHA-512",n.buffer))},sha512:void 0},Ip=(e=Sp(dt))=>e,Rp={getExtendedPublicKeyAsync:ho,getExtendedPublicKey:Tp,randomSecretKey:Ip},ai=8,Np=256,zl=Math.ceil(Np/ai)+1,Rs=2**(ai-1),Dp=()=>{const e=[];let t=ht,n=t;for(let i=0;i<zl;i++){n=t,e.push(n);for(let s=1;s<Rs;s++)n=n.add(t),e.push(n);t=n.double()}return e};let Nr;const Dr=(e,t)=>{const n=t.negate();return e?n:t},Op=e=>{const t=Nr||(Nr=Dp());let n=_t,i=ht;const s=2**ai,o=s,r=ri(s-1),a=ri(ai);for(let u=0;u<zl;u++){let c=Number(e&r);e>>=a,c>Rs&&(c-=o,e+=1n);const l=u*Rs,d=l,h=l+Math.abs(c)-1,v=u%2!==0,f=c<0;c===0?i=i.add(Dr(v,t[d])):n=n.add(Dr(f,t[h]))}return e!==0n&&te("invalid wnaf"),{p:n,f:i}},ss="taskmaster-device-identity-v1";function Ns(e){let t="";for(const n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/g,"")}function jl(e){const t=e.replace(/-/g,"+").replace(/_/g,"/"),n=t+"=".repeat((4-t.length%4)%4),i=atob(n),s=new Uint8Array(i.length);for(let o=0;o<i.length;o+=1)s[o]=i.charCodeAt(o);return s}function Bp(e){return Array.from(e).map(t=>t.toString(16).padStart(2,"0")).join("")}async function Hl(e){const t=await crypto.subtle.digest("SHA-256",e);return Bp(new Uint8Array(t))}async function Fp(){const e=Rp.randomSecretKey(),t=await _p(e);return{deviceId:await Hl(t),publicKey:Ns(t),privateKey:Ns(e)}}async function Up(){try{const n=localStorage.getItem(ss);if(n){const i=JSON.parse(n);if((i==null?void 0:i.version)===1&&typeof i.deviceId=="string"&&typeof i.publicKey=="string"&&typeof i.privateKey=="string"){const s=await Hl(jl(i.publicKey));if(s!==i.deviceId){const o={...i,deviceId:s};return localStorage.setItem(ss,JSON.stringify(o)),{deviceId:s,publicKey:i.publicKey,privateKey:i.privateKey}}return{deviceId:i.deviceId,publicKey:i.publicKey,privateKey:i.privateKey}}}}catch{}const e=await Fp(),t={version:1,deviceId:e.deviceId,publicKey:e.publicKey,privateKey:e.privateKey,createdAtMs:Date.now()};return localStorage.setItem(ss,JSON.stringify(t)),e}async function Wp(e,t){const n=jl(e),i=new TextEncoder().encode(t),s=await Lp(i,n);return Ns(s)}const ql="taskmaster.device.auth.v1";function fo(e){return e.trim()}function Kp(e){if(!Array.isArray(e))return[];const t=new Set;for(const n of e){const i=n.trim();i&&t.add(i)}return[...t].sort()}function go(){try{const e=window.localStorage.getItem(ql);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 Vl(e){try{window.localStorage.setItem(ql,JSON.stringify(e))}catch{}}function zp(e){const t=go();if(!t||t.deviceId!==e.deviceId)return null;const n=fo(e.role),i=t.tokens[n];return!i||typeof i.token!="string"?null:i}function jp(e){const t=fo(e.role),n={version:1,deviceId:e.deviceId,tokens:{}},i=go();i&&i.deviceId===e.deviceId&&(n.tokens={...i.tokens});const s={token:e.token,role:t,scopes:Kp(e.scopes),updatedAtMs:Date.now()};return n.tokens[t]=s,Vl(n),s}function Hp(e){const t=go();if(!t||t.deviceId!==e.deviceId)return;const n=fo(e.role);if(!t.tokens[n])return;const i={...t,tokens:{...t.tokens}};delete i.tokens[n],Vl(i)}async function mo(e,t){if(!(!e.client||!e.connected)&&!e.devicesLoading){e.devicesLoading=!0,t!=null&&t.quiet||(e.devicesError=null);try{const n=await e.client.request("device.pair.list",{});e.devicesList={pending:Array.isArray(n==null?void 0:n.pending)?n.pending:[],paired:Array.isArray(n==null?void 0:n.paired)?n.paired:[]}}catch(n){t!=null&&t.quiet||(e.devicesError=String(n))}finally{e.devicesLoading=!1}}}async function yo(e,t){if(!(!e.client||!e.connected)&&!e.nodesLoading){e.nodesLoading=!0,t!=null&&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!=null&&t.quiet||(e.lastError=String(n))}finally{e.nodesLoading=!1}}}function qp(e){return{method:"exec.approvals.get",params:{}}}async function Vp(e,t){if(!(!e.client||!e.connected)&&!e.execApprovalsLoading){e.execApprovalsLoading=!0,e.lastError=null;try{const n=qp(t);if(!n){e.lastError="Select a node before loading exec approvals.";return}const i=await e.client.request(n.method,n.params);Gp(e,i)}catch(n){e.lastError=String(n)}finally{e.execApprovalsLoading=!1}}}function Gp(e,t){e.execApprovalsSnapshot=t,e.execApprovalsDirty||(e.execApprovalsForm=Ye(t.file??{}))}async function Gl(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 Rt(e,t,n){if(!t.trim())return;const i={...e.skillMessages};n?i[t]=n:delete i[t],e.skillMessages=i}function Ci(e){return e instanceof Error?e.message:String(e)}async function ft(e,t){if(t!=null&&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=Ci(n)}finally{e.skillsLoading=!1}}}function Ql(e,t,n){e.skillEdits={...e.skillEdits,[t]:n}}async function Yl(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 ft(e),Rt(e,t,{kind:"success",message:n?"Skill enabled":"Skill disabled"})}catch(i){const s=Ci(i);e.skillsError=s,Rt(e,t,{kind:"error",message:s})}finally{e.skillsBusyKey=null}}}async function Xl(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 ft(e),Rt(e,t,{kind:"success",message:"API key saved"})}catch(n){const i=Ci(n);e.skillsError=i,Rt(e,t,{kind:"error",message:i})}finally{e.skillsBusyKey=null}}}async function Zl(e,t,n,i){if(!(!e.client||!e.connected)){e.skillsBusyKey=t,e.skillsError=null;try{const s=await e.client.request("skills.install",{name:n,installId:i,timeoutMs:12e4});await ft(e),Rt(e,t,{kind:"success",message:(s==null?void 0:s.message)??"Installed"})}catch(s){const o=Ci(s);e.skillsError=o,Rt(e,t,{kind:"error",message:o})}finally{e.skillsBusyKey=null}}}const Qp=Object.freeze(Object.defineProperty({__proto__:null,installSkill:Zl,loadSkills:ft,saveSkillApiKey:Xl,updateSkillEdit:Ql,updateSkillEnabled:Yl},Symbol.toStringTag,{value:"Module"})),Jl={overview:"/overview",channels:"/channels",instances:"/instances",cron:"/cron",skills:"/skills",nodes:"/nodes",chat:"/chat",admins:"/admins",config:"/config",debug:"/debug",logs:"/logs"},ec=new Map(Object.entries(Jl).map(([e,t])=>[t,e]));function Ti(e){if(!e)return"";let t=e.trim();return t.startsWith("/")||(t=`/${t}`),t==="/"?"":(t.endsWith("/")&&(t=t.slice(0,-1)),t)}function vn(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 Yp(e,t=""){const n=Ti(t),i=Jl[e];return n?`${n}${i}`:i}function tc(e,t=""){const n=Ti(t);let i=e||"/";n&&(i===n?i="/":i.startsWith(`${n}/`)&&(i=i.slice(n.length)));let s=vn(i).toLowerCase();return s.endsWith("/index.html")&&(s="/"),s==="/"?"chat":ec.get(s)??null}function Xp(e){let t=vn(e);if(t.endsWith("/index.html")&&(t=vn(t.slice(0,-11))),t==="/")return"";const n=t.split("/").filter(Boolean);if(n.length===0)return"";for(let i=0;i<n.length;i++){const s=`/${n.slice(i).join("/")}`.toLowerCase();if(ec.has(s)){const o=n.slice(0,i);return o.length?`/${o.join("/")}`:""}}return`/${n.join("/")}`}function Zp(){return typeof window>"u"||typeof window.matchMedia!="function"||window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function vo(e){return e==="system"?Zp():e}const Dn=e=>Number.isNaN(e)?.5:e<=0?0:e>=1?1:e,Jp=()=>typeof window>"u"||typeof window.matchMedia!="function"?!1:window.matchMedia("(prefers-reduced-motion: reduce)").matches??!1,On=e=>{e.classList.remove("theme-transition"),e.style.removeProperty("--theme-switch-x"),e.style.removeProperty("--theme-switch-y")},eh=({nextTheme:e,applyTheme:t,context:n,currentTheme:i})=>{var c;if(i===e)return;const s=globalThis.document??null;if(!s){t();return}const o=s.documentElement,r=s,a=Jp();if(!!r.startViewTransition&&!a){let l=.5,d=.5;if((n==null?void 0:n.pointerClientX)!==void 0&&(n==null?void 0:n.pointerClientY)!==void 0&&typeof window<"u")l=Dn(n.pointerClientX/window.innerWidth),d=Dn(n.pointerClientY/window.innerHeight);else if(n!=null&&n.element){const h=n.element.getBoundingClientRect();h.width>0&&h.height>0&&typeof window<"u"&&(l=Dn((h.left+h.width/2)/window.innerWidth),d=Dn((h.top+h.height/2)/window.innerHeight))}o.style.setProperty("--theme-switch-x",`${l*100}%`),o.style.setProperty("--theme-switch-y",`${d*100}%`),o.classList.add("theme-transition");try{const h=(c=r.startViewTransition)==null?void 0:c.call(r,()=>{t()});h!=null&&h.finished?h.finished.finally(()=>On(o)):On(o)}catch{On(o),t()}return}t(),On(o)},th=2e3;async function un(e,t){if(!(!e.client||!e.connected)&&!(e.sessionLogsLoading&&!(t!=null&&t.quiet))){t!=null&&t.quiet||(e.sessionLogsLoading=!0),e.sessionLogsError=null;try{const n={cursors:t!=null&&t.reset?void 0:e.sessionLogsCursors,limit:500};Array.isArray(e.workspaceAgentIds)&&e.workspaceAgentIds.length>0&&(n.agents=e.workspaceAgentIds);const s=await e.client.request("sessions.transcript",n),o=Array.isArray(s.entries)?s.entries:[],r=!!(t!=null&&t.reset||Object.keys(e.sessionLogsCursors).length===0);e.sessionLogsEntries=r?o:[...e.sessionLogsEntries,...o].slice(-th),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!=null&&t.quiet||(e.sessionLogsLoading=!1)}}}const nc=Object.freeze(Object.defineProperty({__proto__:null,loadSessionLogs:un},Symbol.toStringTag,{value:"Module"}));async function ic(e,t){if(!(!e.client||!e.connected))try{const n={},i=await e.client.request("memory.audit",n);i!=null&&i.ok&&(e.auditEntries=i.entries??[])}catch{}}async function nh(e,t){if(!(!e.client||!e.connected))try{const n={};await e.client.request("memory.auditClear",n),e.auditEntries=[]}catch{}}function Ie(e){return e instanceof Error?e.message:String(e)}let Bn=null;function Ft(e,t){Bn&&clearTimeout(Bn),e.filesMessage={kind:"success",text:t},Bn=setTimeout(()=>{e.filesMessage=null,Bn=null},3e3)}async function Ut(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 i=await e.client.request("files.tree",n);i!=null&&i.tree&&(e.filesTree=i.tree,e.filesRoot=i.root??"")}catch(n){e.filesError=Ie(n)}finally{e.filesLoading=!1}}}}async function ih(e,t,n){e.filesSelectedPaths=new Set([t]),await sc(e,t,n)}async function sh(e,t,n){const i=new Set(e.filesSelectedPaths);if(i.has(t)?i.delete(t):i.add(t),e.filesSelectedPaths=i,i.size===1){const s=[...i][0];await sc(e,s,n)}else e.filesSelectedPath=null,e.filesPreviewContent=null,e.filesPreviewSize=null,e.filesPreviewBinary=!1}async function oh(e,t){if(!e.client||!e.connected)return;const n=[...e.filesSelectedPaths];if(n.length===0)return;let i=0,s="";for(const o of n)try{await oc(e,o,t),i++}catch(r){s=Ie(r)}s?e.filesMessage={kind:"error",text:`${i} downloaded, error: ${s}`}:Ft(e,`${i} file${i!==1?"s":""} downloaded`)}async function rh(e,t,n,i){const s=t.split("/").pop()??t,o=n==="."?s:`${n}/${s}`;o!==t&&await uh(e,t,o,i)}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 i={path:t};n&&(i.agentId=n);const s=await e.client.request("files.read",i);e.filesPreviewContent=(s==null?void 0:s.content)??null,e.filesPreviewBinary=(s==null?void 0:s.binary)??!1,e.filesPreviewSize=(s==null?void 0:s.size)??null}catch(i){e.filesError=Ie(i)}finally{e.filesPreviewLoading=!1}}}async function oc(e,t,n){if(!(!e.client||!e.connected))try{const i={path:t};n&&(i.agentId=n);const s=await e.client.request("files.download",i);if(!(s!=null&&s.base64)){e.filesMessage={kind:"error",text:"Download failed: no data"};return}const o=Uint8Array.from(atob(s.base64),c=>c.charCodeAt(0)),r=new Blob([o]),a=URL.createObjectURL(r),u=document.createElement("a");u.href=a,u.download=s.name??t.split("/").pop()??"download",document.body.appendChild(u),u.click(),document.body.removeChild(u),URL.revokeObjectURL(a)}catch(i){e.filesMessage={kind:"error",text:Ie(i)}}}async function ah(e,t,n,i){if(!e.client||!e.connected)return;e.filesUploadBusy=!0,e.filesMessage=null;let s=0,o="";for(const r of n)try{const a=await r.arrayBuffer(),u=btoa(new Uint8Array(a).reduce((l,d)=>l+String.fromCharCode(d),"")),c={path:t,name:r.name,data:u};i&&(c.agentId=i),await e.client.request("files.upload",c),s++}catch(a){o=Ie(a)}e.filesUploadBusy=!1,o?e.filesMessage={kind:"error",text:s>0?`${s} uploaded, error: ${o}`:o}:Ft(e,`${s} file${s!==1?"s":""} uploaded`),await Ut(e,i)}async function lh(e,t,n,i){if(!e.client||!e.connected)return;e.filesMessage=null;const s=t==="."?n:`${t}/${n}`;try{const o={path:s};i&&(o.agentId=i),await e.client.request("files.mkdir",o),Ft(e,`Created ${s}`),await Ut(e,i),e.filesExpandedDirs=new Set([...e.filesExpandedDirs,s]),e.filesCurrentDir=s}catch(o){e.filesMessage={kind:"error",text:Ie(o)}}}async function ch(e,t,n){if(!(!e.client||!e.connected)){e.filesMessage=null;try{const i={path:t};n&&(i.agentId=n),await e.client.request("files.delete",i),Ft(e,"File deleted"),e.filesSelectedPath===t&&(e.filesSelectedPath=null,e.filesPreviewContent=null),await Ut(e,n)}catch(i){e.filesMessage={kind:"error",text:Ie(i)}}}}async function uh(e,t,n,i){if(!(!e.client||!e.connected)){e.filesMessage=null;try{const s={from:t,to:n};i&&(s.agentId=i),await e.client.request("files.move",s),Ft(e,"File moved"),e.filesSelectedPath===t&&(e.filesSelectedPath=n),await Ut(e,i)}catch(s){e.filesMessage={kind:"error",text:Ie(s)}}}}async function bo(e,t){if(!(!e.client||!e.connected))try{const n={};t&&(n.agentId=t);const i=await e.client.request("memory.status",n);i!=null&&i.ok&&(e.filesMemoryStatus={dirty:i.dirty??!1,syncing:i.syncing,syncProgress:i.syncProgress,files:i.files??0,chunks:i.chunks??0,model:i.model,embeddingState:i.embeddingState})}catch{}}async function dh(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 i=await e.client.request("memory.reindex",n),s=(i==null?void 0:i.files)??0,o=(i==null?void 0:i.chunks)??0;Ft(e,`Re-indexed: ${s} files, ${o} chunks`),await bo(e,t)}catch(n){e.filesMessage={kind:"error",text:Ie(n)}}finally{e.filesReindexBusy=!1}}}function ph(e,t){const n=new Set(e.filesExpandedDirs);n.has(t)?n.delete(t):n.add(t),e.filesExpandedDirs=n,e.filesCurrentDir=t}async function hh(e,t,n){if(!(!e.client||!e.connected)){if(!t.trim()){e.filesSearchResults=null;return}e.filesSearchLoading=!0,e.filesSearchResults=null;try{const i={query:t.trim(),maxResults:20};n&&(i.agentId=n);const s=await e.client.request("memory.search",i);e.filesSearchResults=(s==null?void 0:s.results)??[]}catch(i){e.filesMessage={kind:"error",text:Ie(i)},e.filesSearchResults=null}finally{e.filesSearchLoading=!1}}}function fh(e){e.filesSearchQuery="",e.filesSearchResults=null}function gh(e){e.nodesPollInterval==null&&(e.nodesPollInterval=window.setInterval(()=>{yo(e,{quiet:!0})},5e3))}function mh(e){e.nodesPollInterval!=null&&(clearInterval(e.nodesPollInterval),e.nodesPollInterval=null)}function wo(e){e.logsPollInterval==null&&(e.logsPollInterval=window.setInterval(()=>{e.tab==="logs"&&Pt(e,{quiet:!0})},2e3))}function ko(e){e.logsPollInterval!=null&&(clearInterval(e.logsPollInterval),e.logsPollInterval=null)}function So(e){e.sessionLogsPollInterval==null&&(e.sessionLogsPollInterval=window.setInterval(()=>{!(e.advancedPage?e.advancedTab==="logs":e.tab==="logs")||e.logsSubTab!=="session"||un(e,{quiet:!0})},2e3))}function xo(e){e.sessionLogsPollInterval!=null&&(clearInterval(e.sessionLogsPollInterval),e.sessionLogsPollInterval=null)}function $o(e){e.debugPollInterval==null&&(e.debugPollInterval=window.setInterval(()=>{e.tab==="debug"&&co(e)},3e3))}function Ao(e){e.debugPollInterval!=null&&(clearInterval(e.debugPollInterval),e.debugPollInterval=null)}function yh(e){e.auditPollInterval==null&&(e.auditPollInterval=window.setInterval(()=>{ic(e)},3e4))}function vh(e){e.auditPollInterval!=null&&(clearInterval(e.auditPollInterval),e.auditPollInterval=null)}function bh(e){e.memoryStatusPollInterval==null&&(e.memoryStatusPollInterval=window.setInterval(()=>{if(e.tab!=="files")return;const t=e;bo(t,t.filesResolvedAgentId)},3e3))}function wh(e){e.memoryStatusPollInterval!=null&&(clearInterval(e.memoryStatusPollInterval),e.memoryStatusPollInterval=null)}function Ge(e,t){var i;const n={...t,lastActiveSessionKey:((i=t.lastActiveSessionKey)==null?void 0:i.trim())||t.sessionKey.trim()||"main"};e.settings=n,vd(n),t.theme!==e.theme&&(e.theme=t.theme,_i(e,vo(t.theme))),e.applySessionKey=e.settings.lastActiveSessionKey}function rc(e,t){const n=t.trim();n&&e.settings.lastActiveSessionKey!==n&&Ge(e,{...e.settings,lastActiveSessionKey:n})}function kh(e){if(!window.location.search)return;const t=new URLSearchParams(window.location.search),n=t.get("token"),i=t.get("password"),s=t.get("session"),o=t.get("gatewayUrl");let r=!1;if(n!=null){const u=n.trim();u&&u!==e.settings.token&&Ge(e,{...e.settings,token:u}),t.delete("token"),r=!0}if(i!=null){const u=i.trim();u&&(e.password=u),t.delete("password"),r=!0}if(s!=null){const u=s.trim();u&&(e.sessionKey=u,Ge(e,{...e.settings,sessionKey:u,lastActiveSessionKey:u}))}if(o!=null){const u=o.trim();u&&u!==e.settings.gatewayUrl&&Ge(e,{...e.settings,gatewayUrl:u}),t.delete("gatewayUrl"),r=!0}if(!r)return;const a=new URL(window.location.href);a.search=t.toString(),window.history.replaceState({},"",a.toString())}function Sh(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?e.logsSubTab==="session"?So(e):wo(e):(ko(e),xo(e)),t==="debug"?$o(e):Ao(e),li(e),lc(e,t,!1)}function xh(e,t,n){eh({nextTheme:t,applyTheme:()=>{e.theme=t,Ge(e,{...e.settings,theme:t}),_i(e,vo(t))},context:n,currentTheme:e.theme})}async function li(e){if(e.tab==="overview"&&await cc(e),e.tab==="channels"&&await Mh(e),e.tab==="instances"&&await Gl(e),e.tab==="cron"&&await Eo(e),e.tab==="skills"&&await ft(e),e.tab==="nodes"&&(await yo(e),await mo(e),await Le(e),await Vp(e)),e.tab==="chat"&&!e.advancedPage&&!e.chatPage&&(await Nh(e),Bt(e,!e.chatHasAutoScrolled)),e.tab==="config"&&(await El(e),await Le(e)),e.tab==="debug"&&(await co(e),e.eventLog=e.eventLogBuffer),e.tab==="logs"){if(e.logsAtBottom=!0,e.logsSubTab==="session"){const{loadSessionLogs:n}=await ie(async()=>{const{loadSessionLogs:i}=await Promise.resolve().then(()=>nc);return{loadSessionLogs:i}},void 0,import.meta.url);await n(e,{reset:!0})}else await Pt(e,{reset:!0});$l(e,!0)}}function $h(){if(typeof window>"u")return"";const e=window.__TASKMASTER_CONTROL_UI_BASE_PATH__;return typeof e=="string"&&e.trim()?Ti(e):Xp(window.location.pathname)}function Ah(e){e.theme=e.settings.theme??"system",_i(e,vo(e.theme))}function _i(e,t){if(e.themeResolved=t,typeof document>"u")return;const n=document.documentElement;n.dataset.theme=t,n.style.colorScheme=t}function Eh(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"&&_i(e,n.matches?"dark":"light")},typeof e.themeMedia.addEventListener=="function"){e.themeMedia.addEventListener("change",e.themeMediaHandler);return}e.themeMedia.addListener(e.themeMediaHandler)}function Ch(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 Th(e,t){if(typeof window>"u")return;const n=tc(window.location.pathname,e.basePath)??"chat";ac(e,n),lc(e,n,t)}function _h(e){var s;if(typeof window>"u")return;const t=tc(window.location.pathname,e.basePath);if(!t)return;const i=(s=new URL(window.location.href).searchParams.get("session"))==null?void 0:s.trim();i&&(e.sessionKey=i,Ge(e,{...e.settings,sessionKey:i,lastActiveSessionKey:i})),ac(e,t)}function ac(e,t){e.tab!==t&&(e.tab=t),t==="chat"&&(e.chatHasAutoScrolled=!1),t==="logs"?e.logsSubTab==="session"?So(e):wo(e):(ko(e),xo(e)),t==="debug"?$o(e):Ao(e),e.connected&&li(e)}function lc(e,t,n){if(typeof window>"u")return;const i=vn(Yp(t,e.basePath)),s=vn(window.location.pathname),o=new URL(window.location.href);t==="chat"&&e.sessionKey?o.searchParams.set("session",e.sessionKey):o.searchParams.delete("session"),s!==i&&(o.pathname=i),n?window.history.replaceState({},"",o.toString()):window.history.pushState({},"",o.toString())}async function cc(e){await Promise.all([G(e,!1),Gl(e),ro(e),bn(e),co(e)])}async function Mh(e){await Promise.all([G(e,!0),El(e),Le(e)])}async function Eo(e){await Promise.all([G(e,!1),bn(e),Ai(e)])}function uc(e){return e.chatSending||!!e.chatRunId}function Ph(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 dc(e){e.connected&&(e.chatMessage="",await Sl(e))}function Lh(e,t,n){const i=t.trim(),s=!!(n&&n.length>0);!i&&!s||(e.chatQueue=[...e.chatQueue,{id:oo(),text:i,createdAt:Date.now(),attachments:s?n==null?void 0:n.map(o=>({...o})):void 0}],Bt(e))}async function pc(e,t,n){var s,o;ao(e);const i=await kl(e,t,n==null?void 0:n.attachments);return!i&&(n==null?void 0:n.previousDraft)!=null&&(e.chatMessage=n.previousDraft),!i&&(n!=null&&n.previousAttachments)&&(e.chatAttachments=n.previousAttachments),i&&rc(e,e.sessionKey),i&&(n!=null&&n.restoreDraft)&&((s=n.previousDraft)!=null&&s.trim())&&(e.chatMessage=n.previousDraft),i&&(n!=null&&n.restoreAttachments)&&((o=n.previousAttachments)!=null&&o.length)&&(e.chatAttachments=n.previousAttachments),Bt(e),i&&!e.chatRunId&&hc(e),i}async function hc(e){if(!e.connected||uc(e))return;const[t,...n]=e.chatQueue;if(!t)return;e.chatQueue=n,await pc(e,t.text,{attachments:t.attachments})||(e.chatQueue=[t,...e.chatQueue])}function Ih(e,t){e.chatQueue=e.chatQueue.filter(n=>n.id!==t)}async function Rh(e,t,n){if(!e.connected)return;const i=e.chatMessage,s=(t??e.chatMessage).trim(),o=e.chatAttachments??[],r=t==null?o:[],a=r.length>0;if(!(!s&&!a)){if(Ph(s)){await dc(e);return}if(t==null&&(e.chatMessage="",e.chatAttachments=[]),uc(e)){Lh(e,s,r);return}await pc(e,s,{previousDraft:t==null?i:void 0,restoreDraft:!!(t&&(n!=null&&n.restoreDraft)),attachments:a?r:void 0,previousAttachments:t==null?o:void 0,restoreAttachments:!!(t&&(n!=null&&n.restoreDraft))})}}async function Nh(e){var i;const t=e,n=Math.max((((i=t.chatMessages)==null?void 0:i.length)??0)+10,Pe);await Promise.all([Me(t,{limit:n}),ro(t),Ds(e)]),Bt(e,!0)}const Dh=hc;function Oh(e){var s,o,r;const t=pl(e.sessionKey);if(t!=null&&t.agentId)return t.agentId;const n=(s=e.hello)==null?void 0:s.snapshot;return((r=(o=n==null?void 0:n.sessionDefaults)==null?void 0:o.defaultAgentId)==null?void 0:r.trim())||"main"}function Bh(e,t){const n=Ti(e),i=encodeURIComponent(t);return n?`${n}/avatar/${i}?meta=1`:`/avatar/${i}?meta=1`}async function Ds(e){if(!e.connected){e.chatAvatarUrl=null;return}const t=Oh(e);if(!t){e.chatAvatarUrl=null;return}e.chatAvatarUrl=null;const n=Bh(e.basePath,t);try{const i=await fetch(n,{method:"GET"});if(!i.ok){e.chatAvatarUrl=null;return}const s=await i.json(),o=typeof s.avatarUrl=="string"?s.avatarUrl.trim():"";e.chatAvatarUrl=o||null}catch{e.chatAvatarUrl=null}}const N={messageSquare:p`<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:p`<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:p`<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>`,unlink:p`<svg viewBox="0 0 24 24"><path d="m18.84 12.25 1.72-1.71h-.02a5.004 5.004 0 0 0-.12-7.07 5.006 5.006 0 0 0-6.95 0l-1.72 1.71"/><path d="m5.17 11.75-1.71 1.71a5.004 5.004 0 0 0 .12 7.07 5.006 5.006 0 0 0 6.95 0l1.71-1.71"/><line x1="8" x2="8" y1="2" y2="5"/><line x1="2" x2="5" y1="8" y2="8"/><line x1="16" x2="16" y1="19" y2="22"/><line x1="19" x2="22" y1="16" y2="16"/></svg>`,radio:p`<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:p`<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:p`<svg viewBox="0 0 24 24"><polygon points="13 2 3 14 12 14 11 22 21 10 12 10 13 2"/></svg>`,monitor:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<svg viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`,check:p`<svg viewBox="0 0 24 24"><path d="M20 6 9 17l-5-5"/></svg>`,copy:p`<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:p`<svg viewBox="0 0 24 24"><circle cx="11" cy="11" r="8"/><path d="m21 21-4.3-4.3"/></svg>`,brain:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<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:p`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/></svg>`,circleCheck:p`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="m9 12 2 2 4-4"/></svg>`,circleX:p`<svg viewBox="0 0 24 24"><circle cx="12" cy="12" r="10"/><path d="m15 9-6 6"/><path d="m9 9 6 6"/></svg>`,puzzle:p`<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:p`<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:p`<svg viewBox="0 0 24 24"><path d="m22 2-7 20-4-9-9-4Z"/><path d="M22 2 11 13"/></svg>`,smile:p`<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:p`<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:p`<svg viewBox="0 0 24 24"><rect width="14" height="14" x="5" y="5" rx="2"/></svg>`,eye:p`<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:p`<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:p`<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:p`<svg viewBox="0 0 24 24"><path d="m6 9 6 6 6-6"/></svg>`,film:p`<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>`,wifi:p`<svg viewBox="0 0 24 24"><path d="M12 20h.01"/><path d="M2 8.82a15 15 0 0 1 20 0"/><path d="M5 12.859a10 10 0 0 1 14 0"/><path d="M8.5 16.429a5 5 0 0 1 7 0"/></svg>`,wifiOff:p`<svg viewBox="0 0 24 24"><path d="M12 20h.01"/><path d="M8.5 16.429a5 5 0 0 1 7 0"/><path d="M5 12.859a10 10 0 0 1 5.17-2.69"/><path d="M13.41 10.28a10 10 0 0 1 5.59 2.58"/><path d="M2 8.82a15 15 0 0 1 4.17-2.65"/><path d="M10.66 5c4.01-.36 8.14.9 11.34 3.76"/><line x1="2" x2="22" y1="2" y2="22"/></svg>`},Fh="Taskmaster",Uh="/taskmaster-icon.png",fc="#00d4ff";let Fn=null;function Xe(){return Fn||(Fn={name:window.__TASKMASTER_BRAND_NAME__||Fh,iconUrl:window.__TASKMASTER_BRAND_ICON_URL__||Uh,accentColor:window.__TASKMASTER_ACCENT_COLOR__||fc},Fn)}function Wh(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 Kh(e){if(e===fc)return;const t=Wh(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 zh=p`<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>`,jh=p`<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="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"></path><path d="M13.73 21a2 2 0 0 1-3.46 0"></path></svg>`;let Or=!1;function Hh(){Or||(Or=!0,document.addEventListener("click",e=>{const t=document.getElementById("nav-burger-toggle");if(!(t!=null&&t.checked))return;const n=t.closest(".setup-header");n!=null&&n.contains(e.target)||(t.checked=!1)}))}function vt(e,t){const n=(l,d)=>l===e?p`<span class="sp-page-nav-current">${l}</span>`:p`<a href=${d}>${l}</a>`,i=p`
21
- ${n("Setup","/setup")}
22
- ${n("Chat","/chat")}
23
- ${n("Admins","/admins")}
24
- ${n("Contacts","/contacts")}
25
- ${n("Files","/files")}
26
- ${n("Browser","/browser")}
27
- ${n("Advanced","/advanced")}
28
- `,o=t&&(t.isMaster!==!1||!t.hasPins)?qh(t):k,r=t!=null&&t.hasPins&&t.onLogout?p`<button class="nav-logout-btn" @click=${t.onLogout} title="Lock">${zh}</button>`:k,a=(t==null?void 0:t.auditCount)??0,u=a>0&&(t!=null&&t.onAuditClick)?p`<button class="nav-audit-btn" @click=${t.onAuditClick} title="Memory writes to review">
29
- ${jh}
30
- <span class="nav-audit-badge">${a>99?"99+":a}</span>
31
- </button>`:k,c=()=>{const l=document.getElementById("nav-burger-toggle");l&&(l.checked=!1)};return Hh(),p`
32
- <div class="setup-header">
33
- <input type="checkbox" id="nav-burger-toggle" class="nav-burger-checkbox" />
34
- <div class="setup-header-inner">
35
- <img class="setup-header-logo" src="${Xe().iconUrl}" alt="${Xe().name}" />
36
- <nav class="setup-header-nav">
37
- ${i}
38
- </nav>
39
- <div class="setup-header-right">
40
- ${o!==k?p`<span class="nav-selector-inline">${o}</span>`:k}
41
- ${u}
42
- ${r}
43
- <label for="nav-burger-toggle" class="nav-burger-button" aria-label="Toggle menu">
44
- <span class="nav-burger-icon"></span>
45
- </label>
46
- </div>
47
- </div>
48
- <nav class="setup-header-dropdown" @click=${c}>
49
- ${o!==k?p`<div class="nav-selector-mobile">${o}</div>`:k}
50
- ${i}
51
- </nav>
52
- </div>
53
- `}function qh(e){const{workspaces:t,selectedWorkspace:n,onWorkspaceSelect:i}=e;return p`
54
- <select
55
- class="sp-workspace-selector"
56
- .value=${n??""}
57
- @change=${o=>{const r=o.target,a=r.value;if(a==="__add__"){r.value=n??"",e.onAddAccount?e.onAddAccount():window.location.href="/setup";return}i(a)}}
58
- >
59
- ${t.map(o=>p`
60
- <option value=${o.name} ?selected=${o.name===n}>
61
- ${o.displayName??o.name}
62
- </option>
63
- `)}
64
- <option disabled>───</option>
65
- <option value="__add__">+ Add Account</option>
66
- </select>
67
- `}function Vh(e){return e.connected?e.fullscreen&&e.active?p`
68
- <div class="sp-fullscreen-overlay">
69
- <div class="sp-fullscreen-toolbar">
70
- <button
71
- class="setup-button ${e.inputMode?"primary":"secondary"}"
72
- style="padding: 6px 14px; font-size: 13px;"
73
- @click=${e.onToggleInput}
74
- >
75
- ${e.inputMode?"Input: ON":"Input: OFF"}
76
- </button>
77
- <button
78
- class="setup-button secondary"
79
- style="padding: 6px 14px; font-size: 13px;"
80
- @click=${e.onToggleFullscreen}
81
- >
82
- Exit Fullscreen
83
- </button>
84
- <button
85
- class="setup-button danger"
86
- style="padding: 6px 14px; font-size: 13px;"
87
- ?disabled=${e.loading}
88
- @click=${e.onStop}
89
- >
90
- Stop
91
- </button>
92
- </div>
93
- <div class="sp-fullscreen-canvas-wrap ${e.inputMode?"sp-input-active":""}">
94
- <canvas
95
- id="browser-screencast-canvas"
96
- class="sp-canvas sp-canvas-fullscreen"
97
- tabindex="0"
98
- @mousedown=${t=>e.onCanvasMouseDown(t)}
99
- @mouseup=${t=>e.onCanvasMouseUp(t)}
100
- @mousemove=${t=>e.onCanvasMouseMove(t)}
101
- @keydown=${t=>{t.preventDefault(),e.onCanvasKeyDown(t)}}
102
- @keyup=${t=>{t.preventDefault(),e.onCanvasKeyUp(t)}}
103
- @contextmenu=${t=>t.preventDefault()}
104
- ></canvas>
105
- </div>
106
- </div>
107
- `:p`
108
- <div class="setup-container">
109
- ${vt("Browser")}
110
- <div class="setup-card sp-card-wide">
111
- <h1>Remote Browser</h1>
112
- <p style="margin-bottom: 16px;">Live view of the headless Chrome instance.</p>
113
-
114
- <div class="sp-toolbar">
115
- ${e.active?p`
116
- <button
117
- class="setup-button ${e.inputMode?"primary":"secondary"}"
118
- style="padding: 10px 20px; font-size: 14px;"
119
- @click=${e.onToggleInput}
120
- >
121
- ${e.inputMode?"Input: ON":"Input: OFF"}
122
- </button>
123
- <button
124
- class="setup-button secondary"
125
- style="padding: 10px 20px; font-size: 14px;"
126
- @click=${e.onToggleFullscreen}
127
- >
128
- Fullscreen
129
- </button>
130
- <button
131
- class="setup-button danger"
132
- style="padding: 10px 20px; font-size: 14px;"
133
- ?disabled=${e.loading}
134
- @click=${e.onStop}
135
- >
136
- Stop
137
- </button>
138
- `:p`
139
- <button
140
- class="setup-button primary"
141
- style="padding: 10px 20px; font-size: 14px;"
142
- ?disabled=${e.loading}
143
- @click=${e.onStart}
144
- >
145
- ${e.loading?"Starting...":"Start"}
146
- </button>
147
- `}
148
- </div>
149
-
150
- ${e.error?p`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:k}
151
-
152
- ${e.handoffPending?p`
153
- <div class="setup-warning" style="margin-top: 16px; display: flex; align-items: center; justify-content: space-between; gap: 12px; text-align: left;">
154
- <div>
155
- <strong>Action required:</strong> ${e.handoffReason??"The agent needs you to complete an action in the browser."}
156
- </div>
157
- <button class="setup-button primary" style="flex-shrink: 0; padding: 10px 20px; font-size: 14px;" @click=${e.onCompleteHandoff}>
158
- Done
159
- </button>
160
- </div>
161
- `:k}
162
-
163
- <div class="sp-canvas-area" style="margin-top: 16px;">
164
- ${e.active?p`
165
- <div class="sp-canvas-wrap ${e.inputMode?"sp-input-active":""}">
166
- <canvas
167
- id="browser-screencast-canvas"
168
- class="sp-canvas"
169
- tabindex="0"
170
- @mousedown=${t=>e.onCanvasMouseDown(t)}
171
- @mouseup=${t=>e.onCanvasMouseUp(t)}
172
- @mousemove=${t=>e.onCanvasMouseMove(t)}
173
- @keydown=${t=>{t.preventDefault(),e.onCanvasKeyDown(t)}}
174
- @keyup=${t=>{t.preventDefault(),e.onCanvasKeyUp(t)}}
175
- @contextmenu=${t=>t.preventDefault()}
176
- ></canvas>
177
- </div>
178
- `:p`
179
- <div class="sp-canvas-placeholder">
180
- <div class="sp-canvas-placeholder-icon">${N.globe}</div>
181
- <p>Click Start to begin streaming the Chrome viewport.</p>
182
- </div>
183
- `}
184
- </div>
185
-
186
- ${e.active&&e.inputMode?p`<p class="setup-hint" style="margin-top: 12px;">
187
- Click the canvas to focus, then interact with the browser. Mouse and keyboard input are forwarded.
188
- </p>`:k}
189
-
190
- </div>
191
- </div>
192
- `:p`
193
- <div class="setup-container">
194
- <div class="setup-card">
195
- <div class="setup-spinner"></div>
196
- <p>Connecting to gateway...</p>
197
- </div>
198
- </div>
199
- `}const ci="application/x-taskmaster-file-path";let it=null;function gc(e){return e==null?"":e<1024?`${e} B`:e<1024*1024?`${(e/1024).toFixed(1)} KB`:`${(e/(1024*1024)).toFixed(1)} MB`}function mc(e){const t=e.split("/");return t.length>1?t.slice(0,-1).join("/"):"."}function Gh(e,t,n){var o,r;e.preventDefault(),e.stopPropagation(),e.currentTarget.classList.remove("sp-drop-target");const i=(o=e.dataTransfer)==null?void 0:o.getData(ci);if(i){mc(i)!==t&&n.onMoveToDir(i,t);return}const s=(r=e.dataTransfer)==null?void 0:r.files;if(s&&s.length>0){const a=Array.from(s).filter(u=>u.name.toLowerCase().endsWith(".md"));a.length>0&&n.onUpload(t,a)}}function yc(e,t,n){var u;const i=e.type==="directory"||e.type==="symlink"&&e.children!=null,s=t.expandedDirs.has(e.path),o=t.selectedPaths.has(e.path),r=t.currentDir===e.path,a=n*20+12;return i?p`
200
- <div
201
- class="sp-tree-item sp-tree-dir ${s?"expanded":""} ${r?"current":""}"
202
- style="padding-left: ${a}px;"
203
- @click=${()=>t.onToggleDir(e.path)}
204
- @dragover=${c=>{c.preventDefault(),c.stopPropagation(),c.dataTransfer&&(c.dataTransfer.dropEffect="move"),c.currentTarget.classList.add("sp-drop-target")}}
205
- @dragleave=${c=>{c.currentTarget.classList.remove("sp-drop-target")}}
206
- @drop=${c=>Gh(c,e.path,t)}
207
- >
208
- <span class="sp-tree-chevron">${s?"−":"+"}</span>
209
- <span class="sp-tree-icon">${N.folder}</span>
210
- <span class="sp-tree-name">${e.name}</span>
211
- ${s&&((u=e.children)==null?void 0:u.length)===0?p`<span
212
- class="sp-tree-dir-delete"
213
- title="Delete empty folder"
214
- @click=${c=>{c.stopPropagation(),t.onDelete(e.path)}}
215
- >×</span>`:k}
216
- </div>
217
- ${s&&e.children?e.children.map(c=>yc(c,t,n+1)):k}
218
- `:p`
219
- <div
220
- class="sp-tree-item sp-tree-file ${o?"selected":""}"
221
- style="padding-left: ${a}px;"
222
- draggable="true"
223
- @click=${c=>{c.metaKey||c.ctrlKey?t.onToggleSelectFile(e.path):t.onSelectFile(e.path)}}
224
- @dragstart=${c=>{c.dataTransfer&&(c.dataTransfer.effectAllowed="move",c.dataTransfer.setData(ci,e.path),c.dataTransfer.setData("text/plain",e.name))}}
225
- >
226
- <span class="sp-tree-icon">${N.fileText}</span>
227
- <span class="sp-tree-name">${e.name}</span>
228
- <span class="sp-tree-size">${gc(e.size)}</span>
229
- </div>
230
- `}function Qh(e){const t=e.selectedPaths.size;return t<2?k:p`
231
- <div class="sp-bulk-actions">
232
- <span style="color: var(--tasker-muted-grey); font-size: 13px;">${t} files selected</span>
233
- <button
234
- class="setup-button secondary"
235
- style="padding: 8px 16px; font-size: 13px;"
236
- @click=${e.onBulkDownload}
237
- >
238
- Download ${t} files
239
- </button>
240
- </div>
241
- `}function Yh(e){if(e.selectedPaths.size!==1||!e.selectedPath)return k;if(e.previewLoading)return p`
242
- <div class="sp-file-preview">
243
- <div class="setup-spinner" style="width: 32px; height: 32px; margin: 24px auto;"></div>
244
- </div>
245
- `;const t=e.selectedPath.split("/").pop()??e.selectedPath;return p`
246
- <div class="sp-file-preview">
247
- <div class="sp-file-preview-header">
248
- <div>
249
- <strong>${t}</strong>
250
- <div class="sp-file-preview-meta">
251
- ${e.selectedPath}${e.previewSize!=null?` — ${gc(e.previewSize)}`:""}
252
- </div>
253
- </div>
254
- <div class="sp-file-actions">
255
- <button class="setup-button secondary" style="padding: 8px 16px; font-size: 13px;" @click=${()=>e.onDownload(e.selectedPath)}>
256
- Download
257
- </button>
258
- <button class="setup-button danger" style="padding: 8px 16px; font-size: 13px;" @click=${()=>{e.pendingDeletePath===e.selectedPath?(it&&clearTimeout(it),it=null,e.onDelete(e.selectedPath)):(e.onArmDelete(e.selectedPath),it&&clearTimeout(it),it=setTimeout(()=>{e.onArmDelete(""),it=null},3e3))}}>
259
- ${e.pendingDeletePath===e.selectedPath?"Confirm delete?":"Delete"}
260
- </button>
261
- </div>
262
- </div>
263
- ${e.previewBinary?p`<div class="sp-file-preview-body"><p style="color: var(--tasker-muted-grey);">Binary file — use Download to view.</p></div>`:e.previewContent!=null?p`<div class="sp-file-preview-body"><pre class="sp-file-code">${e.previewContent}</pre></div>`:p`<div class="sp-file-preview-body"><p style="color: var(--tasker-muted-grey);">File too large for preview — use Download.</p></div>`}
264
- </div>
265
- `}function Xh(e){return p`
266
- <div class="sp-search-bar">
267
- <input
268
- type="text"
269
- class="sp-search-input"
270
- placeholder="Search memory..."
271
- .value=${e.searchQuery}
272
- @input=${t=>e.onSearchQueryChange(t.target.value)}
273
- @keydown=${t=>{t.key==="Enter"&&e.onSearch(e.searchQuery)}}
274
- />
275
- ${e.agentIds.length>1?p`<select
276
- class="sp-search-agent-select"
277
- @change=${t=>e.onSearchAgentChange(t.target.value)}
278
- >
279
- ${e.agentIds.map(t=>p`<option value=${t} ?selected=${t===e.searchAgentId}>${t}</option>`)}
280
- </select>`:k}
281
- <button
282
- class="setup-button secondary"
283
- style="padding: 8px 16px; font-size: 13px;"
284
- ?disabled=${e.searchLoading||!e.searchQuery.trim()}
285
- @click=${()=>e.onSearch(e.searchQuery)}
286
- >
287
- ${e.searchLoading?"Searching...":"Search"}
288
- </button>
289
- ${e.searchResults!==null?p`<button
290
- class="setup-button secondary"
291
- style="padding: 8px 16px; font-size: 13px;"
292
- @click=${e.onSearchClear}
293
- >
294
- Clear
295
- </button>`:k}
296
- </div>
297
- `}function Zh(e){return e.searchResults?e.searchResults.length===0?p`<div class="sp-search-results">
298
- <div style="padding: 24px; color: var(--tasker-muted-grey); text-align: center;">No results found.</div>
299
- </div>`:p`
300
- <div class="sp-search-results">
301
- ${e.searchResults.map(t=>p`
302
- <div
303
- class="sp-search-result ${e.selectedPath===t.path?"selected":""}"
304
- @click=${()=>e.onSelectFile(t.path)}
305
- >
306
- <div class="sp-search-result-header">
307
- <span class="sp-search-result-path">${t.path}</span>
308
- <span class="sp-search-result-score">${(t.score*100).toFixed(0)}%</span>
309
- </div>
310
- <div class="sp-search-result-meta">
311
- Lines ${t.startLine}\u2013${t.endLine} \u00b7 ${t.source}
312
- </div>
313
- <pre class="sp-search-result-snippet">${t.snippet}</pre>
314
- </div>
315
- `)}
316
- </div>
317
- `:k}function Jh(e){const t=e.currentDir;return e.connected?p`
318
- <div class="setup-container">
319
- ${vt("Files",e.wsProps)}
320
- <div class="setup-card sp-card-wide">
321
- <h1>Workspace Files</h1>
322
- <p style="margin-bottom: 16px;">Browse, upload, and manage files in your workspace. Drag files between folders to move them.</p>
323
-
324
- <div class="sp-toolbar">
325
- <label class="setup-button secondary" style="padding: 10px 20px; font-size: 14px; cursor: pointer;">
326
- Upload${t!=="."?p` to <em>${t}</em>`:k}
327
- <input
328
- type="file"
329
- multiple
330
- accept=".md"
331
- style="display: none;"
332
- @change=${n=>{const i=n.target;i.files&&i.files.length>0&&(e.onUpload(t,Array.from(i.files)),i.value="")}}
333
- />
334
- </label>
335
- <button
336
- class="setup-button secondary"
337
- style="padding: 10px 20px; font-size: 14px;"
338
- @click=${()=>{const n=prompt("Folder name:");n!=null&&n.trim()&&e.onNewFolder(t,n.trim())}}
339
- >
340
- New Folder${t!=="."?p` in <em>${t}</em>`:k}
341
- </button>
342
- <button
343
- class="setup-button secondary"
344
- style="padding: 10px 20px; font-size: 14px;"
345
- ?disabled=${e.loading}
346
- @click=${e.onRefresh}
347
- >
348
- ${e.loading?"Loading...":"Refresh"}
349
- </button>
350
- <button
351
- class="setup-button secondary"
352
- style="padding: 10px 20px; font-size: 14px;"
353
- ?disabled=${e.reindexBusy}
354
- @click=${e.onReindex}
355
- >
356
- ${e.reindexBusy?"Re-indexing...":"Re-index"}
357
- </button>
358
- ${e.memoryStatus?e.memoryStatus.embeddingState==="downloading"?p`<span style="display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--tasker-orange, #f59e0b);">
359
- <span
360
- class="setup-status-light"
361
- style="width: 10px; height: 10px; background: #f59e0b"
362
- ></span>
363
- Downloading embedding model\u2026
364
- </span>`:p`<span style="display: inline-flex; align-items: center; gap: 6px; font-size: 13px; color: var(--tasker-text-grey);">
365
- <span
366
- class="setup-status-light"
367
- style="width: 10px; height: 10px; background: ${e.memoryStatus.syncing?"#f59e0b":e.memoryStatus.dirty?"#ef4444":"#22c55e"}"
368
- ></span>
369
- ${(()=>{var u;if(e.memoryStatus.syncing&&e.memoryStatus.syncProgress){const{completed:c,total:l,label:d}=e.memoryStatus.syncProgress;return d||(l>0?`Indexing ${c}/${l} files…`:"Indexing…")}const n=e.memoryStatus.files,i=e.memoryStatus.chunks,s=`${n} file${n!==1?"s":""}, ${i} chunks`,o=(u=e.memoryStatus)==null?void 0:u.model;if(!o)return s;const a=(o.includes("/")?o.split("/").pop():o).replace(/[-_]Q\d.*$/i,"").replace(/\.gguf$/i,"");return`${s} · ${a}`})()}
370
- </span>`:k}
371
- </div>
372
-
373
- ${e.error?p`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:k}
374
-
375
- ${e.message?p`<div class="${e.message.kind==="error"?"setup-error":"setup-success-message"}" style="margin-top: 12px;">
376
- ${e.message.text}
377
- </div>`:k}
378
-
379
- ${e.uploadBusy?p`<div style="margin-top: 12px; color: var(--tasker-orange); font-weight: 600; font-size: 14px;">Uploading...</div>`:k}
380
-
381
- ${Xh(e)}
382
-
383
- ${e.searchResults!==null?Zh(e):p`<div
384
- class="sp-file-tree"
385
- @dragover=${n=>{n.preventDefault(),n.dataTransfer&&(n.dataTransfer.dropEffect=n.dataTransfer.types.includes(ci)?"move":"copy")}}
386
- @drop=${n=>{var o,r;n.preventDefault();const i=(o=n.dataTransfer)==null?void 0:o.getData(ci);if(i){mc(i)!=="."&&e.onMoveToDir(i,".");return}const s=(r=n.dataTransfer)==null?void 0:r.files;if(s&&s.length>0){const a=Array.from(s).filter(u=>u.name.toLowerCase().endsWith(".md"));a.length>0&&e.onUpload(t,a)}}}
387
- >
388
- ${e.tree.length===0&&!e.loading?p`<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=>yc(n,e,0))}
389
- </div>`}
390
-
391
- ${Qh(e)}
392
- ${Yh(e)}
393
- </div>
394
- </div>
395
- `:p`
396
- <div class="setup-container">
397
- <div class="setup-card">
398
- <div class="setup-spinner"></div>
399
- <p>Connecting to gateway...</p>
400
- </div>
401
- </div>
402
- `}const Co="taskmaster_uninstall_done";async function ef(e){var t,n;if(!(!e.client||!e.connected)&&!e.uninstallBusy){e.uninstallBusy=!0,e.uninstallError=null,(t=e.requestUpdate)==null||t.call(e),tf();try{await e.client.request("system.uninstall",{scopes:["service","state","workspace"],purge:!0})}catch{}e.uninstallBusy=!1,e.uninstallDone=!0,(n=e.requestUpdate)==null||n.call(e)}}function ui(){try{return localStorage.getItem(Co)==="1"}catch{return!1}}function To(){try{localStorage.removeItem(Co)}catch{}}function tf(){try{localStorage.setItem(Co,"1")}catch{}}const Br=Object.freeze(Object.defineProperty({__proto__:null,checkUninstallDone:ui,clearUninstallDone:To,runUninstall:ef},Symbol.toStringTag,{value:"Module"}));function q(e){return p`
403
- <span
404
- class="setup-status-light"
405
- style="background: ${{good:"#22c55e",bad:"#ef4444",partial:"#eab308",unknown:"#6b7280"}[e]}"
406
- ></span>
407
- `}function ce(e,t){return p`
408
- <button
409
- class="setup-info-btn"
410
- @click=${()=>t.onInfoModalOpen(e)}
411
- title="Details"
412
- >
413
- ${N.info}
414
- </button>
415
- `}function nf(e){var i;if(!e.infoModalOpen)return k;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 o="N/A";if(s!=null&&s>0)if(s>60){const r=Math.floor(s/60),a=s%60;o=a>0?`${r}h ${a}m`:`${r}h`}else o=`${s}m`;t="Claude",n=[{label:"Connected",value:e.authConnected?"Yes":"No"},{label:"Token Expiry",value:o},{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=Wt(e),o=s?_o(s,e):null;t="WhatsApp",n=[{label:"Account",value:(o==null?void 0:o.name)||(o==null?void 0:o.accountId)||"Default"},{label:"Phone",value:((i=o==null?void 0:o.self)==null?void 0:i.e164)||"Not paired"},{label:"Connected",value:o!=null&&o.connected?"Yes":"No"},{label:"Linked",value:o!=null&&o.linked?"Yes":"No"},...o!=null&&o.lastError?[{label:"Last Error",value:vc(o.lastError)}]:[]];break}case"imessage":{const{thisWsOwns:s}=Mo(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}case"internet":{const s=e.tailscaleStatus,o=s?s.installed?s.loggedIn?s.funnelEnabled&&s.funnelActive?"Active":s.funnelEnabled&&!s.funnelActive?"Enabled but not active":"Connected (not public)":"Not connected":"Not installed":"Checking...";t="Internet Access",n=[{label:"Status",value:o},{label:"What",value:"Makes your public chat and API reachable from the internet, not just your local network"},{label:"How",value:"Uses Tailscale Funnel — a free, secure tunnel that gives your device a public HTTPS address"},{label:"Security",value:"Only the /public/* paths are exposed. The control panel stays LAN-only."},...s!=null&&s.publicUrl?[{label:"Public URL",value:s.publicUrl}]:[],...s!=null&&s.hostname?[{label:"Hostname",value:s.hostname}]:[]];break}case"public-chat":{t="Public Chat",n=[{label:"Status",value:e.publicChatEnabled?"Enabled":"Disabled"},{label:"What",value:"A chat widget anyone can use to message your business from a web browser"},{label:"Access mode",value:df[e.publicChatAuthMode]??"Open access"},{label:"Open access",value:"Anyone can chat without identifying themselves"},{label:"WhatsApp OTP",value:"Visitors verify their phone number before chatting"},{label:"Visitor chooses",value:"Visitors can chat anonymously or verify via WhatsApp"}];break}case"account-pin":{t="Account PIN",n=[{label:"Status",value:e.accountHasPin?"Set":"Not set"},{label:"What",value:"A numeric PIN that protects this account on the control panel"},{label:"When needed",value:"Required when switching to this account or after the session expires"},{label:"Format",value:"4 to 6 digits"}];break}default:return k}return p`
416
- <div class="setup-info-overlay" @click=${s=>{s.target.classList.contains("setup-info-overlay")&&e.onInfoModalClose()}}>
417
- <div class="setup-info-card">
418
- <h3>${t}</h3>
419
- ${n.map(s=>p`
420
- <div class="setup-info-row">
421
- <span class="setup-info-label">${s.label}</span>
422
- <span class="setup-info-value">${s.value}</span>
423
- </div>
424
- `)}
425
- <button
426
- class="setup-button secondary"
427
- style="margin-top: 16px; width: 100%; padding: 10px;"
428
- @click=${e.onInfoModalClose}
429
- >
430
- Close
431
- </button>
432
- </div>
433
- </div>
434
- `}function we(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"],i=n.indexOf(e);return p`
435
- <div class="setup-steps">
436
- ${t.map(s=>{const o=n.indexOf(s.id),r=e===s.id,a=i>o;return p`
437
- <div
438
- class="setup-step ${r?"active":""} ${a?"completed":""}"
439
- >
440
- <span class="setup-step-dot"></span>
441
- <span class="setup-step-label">${s.label}</span>
442
- </div>
443
- `})}
444
- </div>
445
- `}function Fr(e){const{licenseKey:t,licenseBusy:n,licenseValid:i,licenseMessage:s,licenseDeviceId:o,onLicenseKeyChange:r,onLicenseActivate:a}=e;return i===!0?p`
446
- <div class="setup-container">
447
- <div class="setup-card setup-success">
448
- ${we("license")}
449
- <div class="setup-status-row">
450
- ${q("good")}
451
- <span>License Activated</span>
452
- </div>
453
- <p>${s??"Your license is active."}</p>
454
- </div>
455
- </div>
456
- `:n&&!t?p`
457
- <div class="setup-container">
458
- <div class="setup-card">
459
- ${we("license")}
460
- <div class="setup-spinner"></div>
461
- <p>Checking license...</p>
462
- </div>
463
- </div>
464
- `:p`
465
- <div class="setup-container">
466
- <div class="setup-card">
467
- ${we("license")}
468
- <h1>Activate License</h1>
469
- <p>Enter your license key to get started.</p>
470
- ${o?p`
471
- <p class="setup-hint" style="margin-top: 0;">
472
- Send this ID along with your order number to our WhatsApp to receive your license key.
473
- </p>
474
- <div class="setup-device-id">
475
- <span class="setup-device-id-label">Your Device ID</span>
476
- <code class="setup-device-id-value">${o}</code>
477
- <button
478
- class="setup-device-id-copy"
479
- title="Copy Device ID"
480
- @click=${async u=>{const c=u.currentTarget;try{await navigator.clipboard.writeText(o),c.textContent="Copied!",setTimeout(()=>{c.textContent="Copy"},1500)}catch{const l=document.createElement("textarea");l.value=o,l.style.position="fixed",l.style.opacity="0",document.body.appendChild(l),l.select(),document.execCommand("copy"),document.body.removeChild(l),c.textContent="Copied!",setTimeout(()=>{c.textContent="Copy"},1500)}}}
481
- >Copy</button>
482
- </div>
483
- `:k}
484
- <div class="setup-code-input">
485
- <input
486
- type="text"
487
- placeholder="Paste your license key here"
488
- .value=${t}
489
- @input=${u=>r(u.target.value)}
490
- @keydown=${u=>{u.key==="Enter"&&t.trim()&&a()}}
491
- />
492
- <button
493
- class="setup-button"
494
- ?disabled=${!t.trim()||n}
495
- @click=${a}
496
- >
497
- ${n?"Activating...":"Activate"}
498
- </button>
499
- </div>
500
- ${i===!1&&s?p`
501
- <div class="setup-status-row" style="margin-top: 12px;">
502
- ${q("bad")}
503
- <span class="setup-error">${s}</span>
504
- </div>
505
- `:k}
506
- <p class="setup-hint">
507
- Need a license?
508
- <a href="https://taskmaster.bot" target="_blank" rel="noopener">
509
- Purchase at taskmaster.bot
510
- </a>
511
- </p>
512
- </div>
513
- </div>
514
- `}function sf(e){const{authConnected:t,authBusy:n,authMessage:i,authUrl:s,authCodeInput:o,authExpiresIn:r,onStartAuth:a,onSubmitAuthCode:u,onAuthCodeChange:c,onSkipToWhatsApp:l}=e;return t===!0?p`
515
- <div class="setup-container">
516
- <div class="setup-card setup-success">
517
- ${we("auth")}
518
- <div class="setup-status-row">
519
- ${q("good")}
520
- <span>Claude Connected</span>
521
- </div>
522
- <p>
523
- Your Claude Pro subscription is linked.
524
- ${r?p`<br /><span class="setup-hint"
525
- >Expires in ${r} minutes</span
526
- >`:k}
527
- </p>
528
- <p style="color: var(--tasker-text-grey); font-size: 14px;">
529
- Head to Chat to introduce yourself and finish setting up your assistant.
530
- </p>
531
- <a href="/chat" class="setup-button primary">
532
- Continue to Chat →
533
- </a>
534
- </div>
535
- </div>
536
- `:n&&!s?p`
537
- <div class="setup-container">
538
- <div class="setup-card">
539
- ${we("auth")}
540
- <div class="setup-spinner"></div>
541
- <p>Starting Claude connection...</p>
542
- </div>
543
- </div>
544
- `:s?p`
545
- <div class="setup-container">
546
- <div class="setup-card">
547
- ${we("auth")}
548
- <h1>Connect to Claude</h1>
549
- <p>Click the button below to sign in with your Claude Pro account.</p>
550
- <a
551
- href=${s}
552
- target="_blank"
553
- rel="noopener"
554
- class="setup-button primary"
555
- >
556
- Sign in with Claude →
557
- </a>
558
- <div class="setup-divider">
559
- <span>Then enter the code shown</span>
560
- </div>
561
- <div class="setup-code-input">
562
- <input
563
- type="text"
564
- placeholder="Enter authorization code"
565
- .value=${o}
566
- @input=${d=>c(d.target.value)}
567
- @keydown=${d=>{d.key==="Enter"&&o.trim()&&u(o.trim())}}
568
- />
569
- <button
570
- class="setup-button"
571
- ?disabled=${!o.trim()||n}
572
- @click=${()=>u(o.trim())}
573
- >
574
- ${n?"Verifying...":"Submit"}
575
- </button>
576
- </div>
577
- ${i?p`<p class="setup-hint">${i}</p>`:k}
578
- <p class="setup-hint" style="margin-top: 16px;">
579
- <a href="#" class="setup-link" @click=${d=>{d.preventDefault(),e.onAuthApiKeyToggle()}}>
580
- Or use an API key instead
581
- </a>
582
- </p>
583
- </div>
584
- </div>
585
- `:e.authApiKeyMode?p`
586
- <div class="setup-container">
587
- <div class="setup-card">
588
- ${we("auth")}
589
- <h1>Enter API Key</h1>
590
- <p>Paste your Anthropic API key below.</p>
591
- <div class="setup-code-input">
592
- <input
593
- type="password"
594
- placeholder="sk-ant-..."
595
- .value=${e.authApiKeyInput}
596
- @input=${d=>e.onAuthApiKeyChange(d.target.value)}
597
- @keydown=${d=>{d.key==="Enter"&&e.authApiKeyInput.trim()&&e.onAuthApiKeySubmit()}}
598
- ?disabled=${e.authApiKeyBusy}
599
- autofocus
600
- />
601
- <button
602
- class="setup-button"
603
- ?disabled=${!e.authApiKeyInput.trim()||e.authApiKeyBusy}
604
- @click=${()=>e.onAuthApiKeySubmit()}
605
- >${e.authApiKeyBusy?"Saving...":"Save"}</button>
606
- </div>
607
- ${e.authApiKeyError?p`<p class="setup-error">${e.authApiKeyError}</p>`:k}
608
- <p class="setup-hint" style="margin-top: 16px;">
609
- <a href="#" class="setup-link" @click=${d=>{d.preventDefault(),e.onAuthApiKeyToggle()}}>
610
- Use OAuth instead
611
- </a>
612
- </p>
613
- <p class="setup-hint">
614
- Get an API key from
615
- <a href="https://console.anthropic.com/settings/keys" target="_blank" rel="noopener">
616
- console.anthropic.com
617
- </a>
618
- </p>
619
- </div>
620
- </div>
621
- `:p`
622
- <div class="setup-container">
623
- <div class="setup-card">
624
- ${we("auth")}
625
- <h1>Connect to Claude</h1>
626
- ${t===!1&&i?p`<p class="setup-error">${i}</p>`:p`<p>
627
- First, let's connect your Claude Pro subscription.<br />
628
- This powers your AI assistant.
629
- </p>`}
630
- <button class="setup-button primary" @click=${a}>
631
- Connect to Claude →
632
- </button>
633
- <p class="setup-hint" style="margin-top: 8px;">
634
- <a href="#" class="setup-link" @click=${d=>{d.preventDefault(),e.onAuthApiKeyToggle()}}>
635
- Or enter your API key
636
- </a>
637
- </p>
638
- <p class="setup-hint">
639
- Need a Claude subscription?
640
- <a href="https://claude.ai/upgrade" target="_blank" rel="noopener">
641
- Get Claude Pro
642
- </a>
643
- </p>
644
- </div>
645
- </div>
646
- `}function _o(e,t){const n=new Map(t.whatsappAccounts.map(i=>[i.accountId,i]));return e.whatsappAccountId?n.get(e.whatsappAccountId)??null:e.isDefault&&t.whatsappAccounts.length===1?t.whatsappAccounts[0]??null:null}function Wt(e){var n;const t=(n=e.wsProps)==null?void 0:n.selectedWorkspace;return t?e.workspaces.find(i=>i.name===t)??null:e.workspaces[0]??null}function Ur(e){const t=Wt(e),n=(t==null?void 0:t.displayName)??(t==null?void 0:t.name)??Xe().name,i=e.whatsappBusy||e.gatewayHealthLoading;if(e.renamingWorkspace&&t){const s=()=>{const o=e.renameWorkspaceName.trim();o&&e.onWorkspaceRename(t.name,o)};return p`
647
- <div style="display: flex; align-items: center; gap: 6px; margin-bottom: 4px;">
648
- <input
649
- type="text"
650
- .value=${e.renameWorkspaceName}
651
- @input=${o=>{e.renameWorkspaceName=o.target.value}}
652
- @keydown=${o=>{o.key==="Enter"&&s(),o.key==="Escape"&&e.onWorkspaceRenameCancel()}}
653
- 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;"
654
- autofocus
655
- />
656
- <button
657
- class="setup-status-action"
658
- @click=${s}
659
- title="Save"
660
- style="color: #22c55e;"
661
- >${N.check}</button>
662
- <button
663
- class="setup-status-action"
664
- @click=${e.onWorkspaceRenameCancel}
665
- title="Cancel"
666
- >${N.x}</button>
667
- </div>
668
- `}return p`
669
- <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 4px;">
670
- <div style="display: flex; align-items: center; gap: 6px;">
671
- <h2 style="margin: 0; font-size: 20px; font-weight: 600; color: var(--tasker-white);">${n}</h2>
672
- <button
673
- class="setup-status-action"
674
- @click=${e.onWorkspaceRenameStart}
675
- title="Rename"
676
- style="opacity: 0.5; transform: scale(0.8);"
677
- >${N.edit}</button>
678
- </div>
679
- <button
680
- class="setup-status-action ${i?"spinning":""}"
681
- ?disabled=${i}
682
- @click=${e.onRefreshStatus}
683
- title="Refresh Status"
684
- >
685
- ${N.rotateCw}
686
- </button>
687
- </div>
688
- `}function Wr(e){return p`
689
- <div class="setup-status-item">
690
- ${q(e.gatewayHealthy===!1?"bad":"good")}
691
- <div class="setup-status-info">
692
- <strong>Gateway</strong>
693
- <span>${e.gatewayHealthMessage||"Running"}</span>
694
- </div>
695
- ${ce("gateway",e)}
696
- <button
697
- class="setup-status-action ${e.gatewayRestartBusy?"spinning":""}"
698
- ?disabled=${e.gatewayRestartBusy}
699
- @click=${e.onRestartGateway}
700
- title="Restart Gateway"
701
- >
702
- ${N.rotateCw}
703
- </button>
704
- </div>
705
- `}function Kr(e){const t=e.authConnected===!0;return p`
706
- <div class="setup-status-item">
707
- ${q(t?"good":"bad")}
708
- <div class="setup-status-info">
709
- <strong>Claude</strong>
710
- <span>
711
- ${t?"Connected":"Not connected"}${t&&e.authExpiresIn?p` <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>`:k}
712
- </span>
713
- </div>
714
- ${ce("claude",e)}
715
- ${t?p`
716
- <button
717
- class="setup-status-action ${e.authBusy?"spinning":""}"
718
- ?disabled=${e.authBusy}
719
- @click=${e.onStartAuth}
720
- title="Refresh Token"
721
- >
722
- ${N.rotateCw}
723
- </button>
724
- `:p`
725
- <button
726
- class="setup-status-action"
727
- @click=${e.onStartAuth}
728
- title="Connect Claude"
729
- >
730
- ${N.rotateCw}
731
- </button>
732
- `}
733
- </div>
734
- `}function zr(e){return p`
735
- <div class="setup-status-item" style="flex-wrap: wrap;">
736
- ${q("good")}
737
- <div class="setup-status-info">
738
- <strong>License</strong>
739
- <span>Active</span>
740
- </div>
741
- ${ce("license",e)}
742
- <button
743
- class="setup-status-action"
744
- @click=${()=>{e.licenseRemoveConfirm?e.onLicenseRemoveCancel():e.onLicenseRemoveConfirm()}}
745
- title="Manage License"
746
- >
747
- ${N.rotateCw}
748
- </button>
749
- ${e.licenseRemoveConfirm?p`
750
- <div style="width: 100%; margin-top: 8px; margin-left: 30px;">
751
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 0 0 8px;">
752
- Removing your license will disable ${Xe().name} until you enter a new key.
753
- </p>
754
- <div style="display: flex; gap: 8px;">
755
- <button
756
- class="setup-button danger"
757
- style="font-size: 12px; padding: 4px 12px;"
758
- ?disabled=${e.licenseBusy}
759
- @click=${e.onLicenseRemove}
760
- >
761
- ${e.licenseBusy?"Removing…":"Remove License"}
762
- </button>
763
- <button
764
- class="setup-button secondary"
765
- style="font-size: 12px; padding: 4px 12px;"
766
- @click=${e.onLicenseRemoveCancel}
767
- >
768
- Cancel
769
- </button>
770
- </div>
771
- </div>
772
- `:k}
773
- </div>
774
- `}function vc(e){var t,n;try{const i=JSON.parse(e),s=(i==null?void 0:i.error)??i,o=((n=(t=s==null?void 0:s.output)==null?void 0:t.payload)==null?void 0:n.message)??(s==null?void 0:s.message)??(i==null?void 0:i.message);if(o&&typeof o=="string")return o}catch{}return e.length>80?e.slice(0,77)+"…":e}function jr(e){var d;const t=Wt(e);if(!t)return k;const n=_o(t,e),i=(n==null?void 0:n.running)&&(n==null?void 0:n.connected),s=(n==null?void 0:n.linked)&&!i,o=!!n,r=i?"good":s?"partial":o?"bad":"unknown",a=i?"Connected":s?"Linked, not connected":o?n!=null&&n.lastError?vc(n.lastError):"Not connected":"Not paired",u=!(n!=null&&n.provider)||(n==null?void 0:n.provider)==="baileys",c=t.whatsappAccountId??(t.isDefault&&e.whatsappAccounts.length===1?(d=e.whatsappAccounts[0])==null?void 0:d.accountId:void 0),l=c!=null&&e.whatsappActiveQrAccountId===c;return p`
775
- <div class="setup-status-item" style="flex-wrap: wrap;">
776
- ${q(r)}
777
- <div class="setup-status-info">
778
- <div style="display: flex; align-items: center; gap: 4px;">
779
- <strong>WhatsApp</strong>
780
- ${o&&i?p`
781
- <button
782
- class="setup-status-action"
783
- @click=${e.onWhatsAppSettingsOpen}
784
- title="WhatsApp Settings"
785
- style="opacity: 0.5; transform: scale(0.75);"
786
- >
787
- ${N.settings}
788
- </button>
789
- `:k}
790
- </div>
791
- <span>${a}</span>
792
- </div>
793
- ${ce("whatsapp",e)}
794
- ${u&&c?p`
795
- <button
796
- class="setup-status-action"
797
- @click=${e.onRefreshStatus}
798
- title="Refresh Status"
799
- >
800
- ${N.rotateCw}
801
- </button>
802
- ${n!=null&&n.linked?p`
803
- <button
804
- class="setup-status-action"
805
- ?disabled=${e.whatsappBusy}
806
- @click=${()=>e.onWhatsAppUnlink(c)}
807
- title="Unlink WhatsApp"
808
- >
809
- ${N.unlink}
810
- </button>
811
- `:p`
812
- <button
813
- class="setup-status-action ${e.whatsappBusy&&l?"spinning":""}"
814
- ?disabled=${e.whatsappBusy}
815
- @click=${()=>e.onWhatsAppRelink(c)}
816
- title="Link WhatsApp"
817
- >
818
- ${N.link}
819
- </button>
820
- `}
821
- `:k}
822
- ${l&&e.whatsappLoginQrDataUrl?p`
823
- <div style="width: 100%; margin-top: 8px; margin-left: 30px;">
824
- <div class="setup-qr" style="display: inline-flex;">
825
- <img
826
- src=${e.whatsappLoginQrDataUrl}
827
- alt="WhatsApp QR"
828
- style="width: 140px; height: 140px;"
829
- />
830
- </div>
831
- ${e.whatsappLoginMessage?p`<p class="setup-hint" style="margin-top: 4px;">${e.whatsappLoginMessage}</p>`:k}
832
- </div>
833
- `:k}
834
- </div>
835
- `}const of=[{id:"claude-opus-4-6",shortName:"Opus"},{id:"claude-sonnet-4-5-20250929",shortName:"Sonnet"},{id:"claude-haiku-4-5-20251001",shortName:"Haiku"}],rf="anthropic/claude-sonnet-4-5-20250929",af=[{value:"off",label:"Off"},{value:"minimal",label:"Minimal"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"}];function lf(e){if(!e.whatsappSettingsOpen)return k;const t=Wt(e);if(!t)return k;const n=_o(t,e),i=(n==null?void 0:n.running)&&(n==null?void 0:n.connected);if(!n||!i)return k;const s=()=>e.onWhatsAppSettingsClose(),o=e.whatsappModelCatalog??[],r=new Set(o.filter(l=>l.provider==="anthropic").map(l=>l.id)),a=of.filter(l=>r.has(l.id)),u=e.whatsappModel??rf,c=e.whatsappThinkingLevel??"off";return p`
836
- <div class="setup-info-overlay" @click=${l=>{l.target.classList.contains("setup-info-overlay")&&s()}}>
837
- <div class="setup-info-card" style="max-width: 360px;">
838
- <h3>Public Agent Settings</h3>
839
- <div style="display: flex; flex-direction: column; gap: 16px; margin-top: 12px;">
840
- <label style="display: flex; align-items: flex-start; gap: 8px; cursor: pointer;">
841
- <input
842
- type="checkbox"
843
- .checked=${e.whatsappDmPolicy!=="disabled"&&e.whatsappDmPolicy!==null}
844
- @change=${e.onWhatsAppDmToggle}
845
- style="accent-color: #22c55e; margin-top: 2px;"
846
- />
847
- <div>
848
- <div style="font-size: 13px; color: var(--tasker-white);">Enabled</div>
849
- <div style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;">Agent replies to 3rd party messages</div>
850
- </div>
851
- </label>
852
- <div style="border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;"></div>
853
- <label style="display: flex; align-items: flex-start; gap: 8px; cursor: pointer;">
854
- <input
855
- type="checkbox"
856
- .checked=${e.whatsappGroupPolicy==="open"}
857
- @change=${e.onWhatsAppGroupToggle}
858
- style="accent-color: #22c55e; margin-top: 2px;"
859
- />
860
- <div>
861
- <div style="font-size: 13px; color: var(--tasker-white);">Group chats</div>
862
- <div style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.7;">Agent responds in WhatsApp groups</div>
863
- </div>
864
- </label>
865
- ${e.whatsappGroupPolicy==="open"?p`
866
- <div style="display: flex; flex-direction: column; gap: 6px; padding-left: 24px;">
867
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
868
- <input
869
- type="radio"
870
- name="wa-group-mention"
871
- .checked=${e.whatsappGroupRequireMention}
872
- @change=${()=>e.onWhatsAppGroupMentionChange(!0)}
873
- style="accent-color: #22c55e;"
874
- />
875
- <div>
876
- <div style="font-size: 13px; color: var(--tasker-white);">When mentioned</div>
877
- <div style="font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;">Only responds when @mentioned</div>
878
- </div>
879
- </label>
880
- <label style="display: flex; align-items: center; gap: 8px; cursor: pointer;">
881
- <input
882
- type="radio"
883
- name="wa-group-mention"
884
- .checked=${!e.whatsappGroupRequireMention}
885
- @change=${()=>e.onWhatsAppGroupMentionChange(!1)}
886
- style="accent-color: #22c55e;"
887
- />
888
- <div>
889
- <div style="font-size: 13px; color: var(--tasker-white);">Always respond</div>
890
- <div style="font-size: 11px; color: var(--tasker-text-grey); opacity: 0.7;">Responds to every message in groups</div>
891
- </div>
892
- </label>
893
- </div>
894
- `:k}
895
- <div style="border-top: 1px solid rgba(255,255,255,0.08); margin: 4px 0;"></div>
896
- ${a.length>0?p`
897
- <div style="display: flex; align-items: center; gap: 8px;">
898
- <div style="font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;">Model</div>
899
- <select
900
- class="setup-model-select"
901
- style="flex: 1;"
902
- .value=${u}
903
- @change=${l=>{e.onWhatsAppModelChange(l.target.value)}}
904
- >
905
- ${a.map(l=>p`
906
- <option value=${"anthropic/"+l.id} ?selected=${u==="anthropic/"+l.id}>
907
- ${l.shortName}
908
- </option>
909
- `)}
910
- </select>
911
- </div>
912
- `:k}
913
- <div style="display: flex; align-items: center; gap: 8px;">
914
- <div style="font-size: 13px; color: var(--tasker-text-grey); min-width: 60px;">Thinking</div>
915
- <select
916
- class="setup-model-select"
917
- style="flex: 1;"
918
- .value=${c}
919
- @change=${l=>{e.onWhatsAppThinkingChange(l.target.value)}}
920
- >
921
- ${af.map(l=>p`
922
- <option value=${l.value} ?selected=${c===l.value}>
923
- ${l.label}
924
- </option>
925
- `)}
926
- </select>
927
- </div>
928
- </div>
929
- <button
930
- class="setup-button secondary"
931
- style="margin-top: 20px; width: 100%; padding: 10px;"
932
- @click=${s}
933
- >
934
- Close
935
- </button>
936
- </div>
937
- </div>
938
- `}function Mo(e){const t=Wt(e),n=e.imessageOwnerWorkspace,i=!!(t&&n===t.name),s=!!(n&&t&&n!==t.name);return{selectedWs:t,ownerWs:n,thisWsOwns:i,anotherWsOwns:s}}function Hr(e){const{ownerWs:t,thisWsOwns:n,anotherWsOwns:i}=Mo(e);let s,o;return i?(s="partial",o=`Connected to ${t}`):n&&e.imessageConnected?(s="good",o="Connected"):n&&e.imessageRunning?(s="partial",o="Running, not connected"):n?(s="bad",o="Not running"):e.imessageConfigured?(s="unknown",o="Not connected"):(s="bad",o="Not configured"),p`
939
- <div class="setup-status-item" style="flex-wrap: wrap;">
940
- ${q(s)}
941
- <div class="setup-status-info">
942
- <strong>iMessage</strong>
943
- <span>${o}</span>
944
- </div>
945
- ${ce("imessage",e)}
946
- <button
947
- class="setup-status-action ${e.imessageEnabling?"spinning":""}"
948
- ?disabled=${e.imessageEnabling}
949
- @click=${e.onIMessageEnable}
950
- title="${n?"Manage iMessage":"Connect iMessage"}"
951
- >
952
- ${N.rotateCw}
953
- </button>
954
- ${k}
955
- </div>
956
- `}function cf(e){if(!e.imessageEnableConfirm)return k;const{ownerWs:t,thisWsOwns:n,anotherWsOwns:i}=Mo(e),s=()=>{e.onIMessageEnableCancel()};return n?p`
957
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&s()}}>
958
- <div class="setup-info-card" style="text-align: center;">
959
- <h3>iMessage</h3>
960
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
961
- iMessage is connected to this business.
962
- </p>
963
- <p style="font-size: 12px; color: var(--tasker-text-grey); opacity: 0.6; margin-bottom: 16px;">
964
- Self-chat only. Third-party iMessage DMs are not processed.
965
- </p>
966
- <button
967
- class="setup-button secondary"
968
- style="width: 100%; padding: 10px; color: #ef4444; border-color: #ef4444;"
969
- ?disabled=${e.imessageEnabling}
970
- @click=${()=>{e.onIMessageDisconnect()}}
971
- >
972
- ${e.imessageEnabling?"Disconnecting…":"Disconnect iMessage"}
973
- </button>
974
- <button
975
- class="setup-button secondary"
976
- style="width: 100%; padding: 10px; margin-top: 8px;"
977
- @click=${s}
978
- >
979
- Close
980
- </button>
981
- </div>
982
- </div>
983
- `:i?p`
984
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&s()}}>
985
- <div class="setup-info-card" style="text-align: center;">
986
- <h3>Connect iMessage</h3>
987
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
988
- iMessage is currently connected to <strong style="text-transform: capitalize;">${t}</strong>.
989
- Move it to this business?
990
- </p>
991
- <button
992
- class="setup-button primary"
993
- style="width: 100%; padding: 10px;"
994
- ?disabled=${e.imessageEnabling}
995
- @click=${()=>{e.onIMessageReassign()}}
996
- >
997
- ${e.imessageEnabling?"Connecting…":"Connect to This Business"}
998
- </button>
999
- <button
1000
- class="setup-button secondary"
1001
- style="width: 100%; padding: 10px; margin-top: 8px;"
1002
- @click=${s}
1003
- >
1004
- Cancel
1005
- </button>
1006
- </div>
1007
- </div>
1008
- `:p`
1009
- <div class="setup-info-overlay" @click=${o=>{o.target.classList.contains("setup-info-overlay")&&s()}}>
1010
- <div class="setup-info-card" style="text-align: center;">
1011
- <h3>Enable iMessage</h3>
1012
- <p style="color: var(--tasker-text-grey); font-size: 13px; margin: 8px 0 16px;">
1013
- ${Xe().name} will respond to messages in Messages.app for this business.
1014
- </p>
1015
- <button
1016
- class="setup-button primary"
1017
- style="width: 100%; padding: 10px;"
1018
- ?disabled=${e.imessageEnabling}
1019
- @click=${()=>{e.onIMessageEnableConfirm()}}
1020
- >
1021
- ${e.imessageEnabling?"Connecting…":"Connect"}
1022
- </button>
1023
- <button
1024
- class="setup-button secondary"
1025
- style="width: 100%; padding: 10px; margin-top: 8px;"
1026
- @click=${s}
1027
- >
1028
- Cancel
1029
- </button>
1030
- </div>
1031
- </div>
1032
- `}function qr(e){if(!e.isMaster)return k;const n=e.apiKeyProviders.filter(i=>i.hasKey).length;return p`
1033
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1034
- <div class="setup-status-item">
1035
- ${q(n>0?"good":"bad")}
1036
- <div class="setup-status-info">
1037
- <strong>API Keys</strong>
1038
- <span>${n} configured</span>
1039
- </div>
1040
- <button
1041
- class="setup-link-btn"
1042
- @click=${()=>e.onApiKeyModalOpen()}
1043
- >Manage</button>
1044
- </div>
1045
- </div>
1046
- ${uf(e)}
1047
- `}function uf(e){if(!e.apiKeyModalOpen)return k;const t=e.apiKeyProviders,n={};for(const c of t)c.key&&(n[c.id]=c.key);const i=(c,l)=>{const d=l==null?void 0:l.closest(".setup-apikey-input"),h=d==null?void 0:d.querySelector("input"),v=h==null?void 0:h.value.trim();!v||v===n[c]||e.onApiKeySave(c,v)},s=c=>{const l=c.currentTarget,d=l.closest(".setup-apikey-input"),h=d==null?void 0:d.querySelector("input");if(!h)return;const v=h.type==="text";h.type=v?"password":"text",l.classList.toggle("active",!v)},o=(c,l)=>{const d=l.target,h=d.closest(".setup-apikey-input"),v=d.value.trim(),f=v.length>0&&v!==n[c],b=h==null?void 0:h.querySelector(".setup-apikey-save");b&&(b.style.display=f?"":"none");const S=h==null?void 0:h.querySelector(".setup-apikey-eye");S&&(S.style.display=v.length>0?"":"none")},r=t.filter(c=>c.primary),a=t.filter(c=>!c.primary),u=c=>{const l=e.apiKeySavingProvider===c.id&&e.apiKeyBusy,d=!e.apiKeyBusy&&e.apiKeySuccess===`${c.id} key saved`,h=!e.apiKeyBusy&&e.apiKeySuccess===`${c.id} key removed`;return p`
1048
- <div class="setup-apikey-row">
1049
- <div class="setup-apikey-info">
1050
- <strong>${c.name}</strong>
1051
- <span class="setup-apikey-category">${c.category}</span>
1052
- ${d?p`<span class="setup-apikey-badge saved">Saved</span>`:k}
1053
- ${h?p`<span class="setup-apikey-badge removed">Removed</span>`:k}
1054
- </div>
1055
- <div class="setup-apikey-input">
1056
- <input
1057
- type="password"
1058
- .value=${c.key??""}
1059
- placeholder="Enter key"
1060
- ?disabled=${e.apiKeyBusy}
1061
- @input=${v=>o(c.id,v)}
1062
- @keydown=${v=>{v.key==="Enter"&&i(c.id,v.target)}}
1063
- />
1064
- <button
1065
- class="setup-apikey-icon-btn setup-apikey-eye"
1066
- style=${c.hasKey?"":"display: none;"}
1067
- title="Toggle visibility"
1068
- @click=${s}
1069
- >${N.eye}</button>
1070
- ${l?p`<span class="setup-apikey-badge saving">Saving\u2026</span>`:p`<button
1071
- class="setup-apikey-save setup-button"
1072
- style="display: none;"
1073
- ?disabled=${e.apiKeyBusy}
1074
- @click=${v=>i(c.id,v.currentTarget)}
1075
- >Save</button>`}
1076
- ${c.hasKey&&!l?p`
1077
- <button
1078
- class="setup-apikey-icon-btn danger"
1079
- title="Remove key"
1080
- ?disabled=${e.apiKeyBusy}
1081
- @click=${()=>e.onApiKeyRemove(c.id)}
1082
- >${N.trash}</button>
1083
- `:k}
1084
- </div>
1085
- </div>
1086
- `};return p`
1087
- <div class="setup-info-overlay" style="align-items: flex-start; padding-top: 72px;" @click=${c=>{c.target.classList.contains("setup-info-overlay")&&e.onApiKeyModalClose()}}>
1088
- <div class="setup-info-card" style="max-width: 480px;">
1089
- <h3 style="margin: 0 0 4px; text-align: center;">API Keys</h3>
1090
- <div class="setup-apikey-list">
1091
- ${e.apiKeyError?p`<p class="setup-error" style="margin: 0;">${e.apiKeyError}</p>`:k}
1092
- ${r.map(u)}
1093
- ${a.length>0?p`
1094
- <details class="setup-apikey-advanced">
1095
- <summary>Additional keys</summary>
1096
- ${a.map(u)}
1097
- </details>
1098
- `:k}
1099
- </div>
1100
- </div>
1101
- </div>
1102
- `}function Vr(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",i=e.updateChecking||e.updateRunning;return p`
1103
- <div class="setup-status-item">
1104
- ${q(t)}
1105
- <div class="setup-status-info">
1106
- <strong>Software</strong>
1107
- <span>${n}</span>
1108
- </div>
1109
- ${ce("update",e)}
1110
- ${e.updateAvailable?p`
1111
- <button
1112
- class="setup-status-action ${i?"spinning":""}"
1113
- ?disabled=${i}
1114
- @click=${e.onUpdateRun}
1115
- title="Update Now"
1116
- >
1117
- ${N.download}
1118
- </button>
1119
- `:p`
1120
- <button
1121
- class="setup-status-action ${i?"spinning":""}"
1122
- ?disabled=${i}
1123
- @click=${e.onUpdateCheck}
1124
- title="Check for Updates"
1125
- >
1126
- ${N.rotateCw}
1127
- </button>
1128
- `}
1129
- </div>
1130
- `}const df={anonymous:"Open access",verified:"WhatsApp OTP",choice:"Visitor chooses"};function Gr(e){const t=e.publicChatEnabled;return p`
1131
- <div class="setup-status-item">
1132
- ${q(t?"good":"unknown")}
1133
- <div class="setup-status-info">
1134
- <strong>Public Chat</strong>
1135
- ${t?p`
1136
- <select
1137
- class="setup-select-sm"
1138
- ?disabled=${e.publicChatBusy}
1139
- @change=${i=>{const s=i.target.value;e.onPublicChatAuthModeChange(s)}}
1140
- >
1141
- <option value="anonymous" ?selected=${e.publicChatAuthMode==="anonymous"}>Open access</option>
1142
- <option value="verified" ?selected=${e.publicChatAuthMode==="verified"}>WhatsApp OTP</option>
1143
- <option value="choice" ?selected=${e.publicChatAuthMode==="choice"}>Visitor chooses</option>
1144
- </select>
1145
- `:p`<span>Disabled</span>`}
1146
- </div>
1147
- ${ce("public-chat",e)}
1148
- <button
1149
- class="setup-link-btn"
1150
- ?disabled=${e.publicChatBusy}
1151
- @click=${e.onPublicChatToggle}
1152
- >${e.publicChatBusy?"...":t?"Disable":"Enable"}</button>
1153
- </div>
1154
- `}function pf(e){if(!e.isMaster)return k;const t=e.tailscaleStatus,n=e.tailscaleBusy,i=e.tailscaleAuthUrl;if(!t)return p`
1155
- <div class="setup-status-item">
1156
- ${q("unknown")}
1157
- <div class="setup-status-info">
1158
- <strong>Internet Access</strong>
1159
- <span>Checking...</span>
1160
- </div>
1161
- ${ce("internet",e)}
1162
- </div>
1163
- `;if(!t.installed)return p`
1164
- <div class="setup-status-item">
1165
- ${q("unknown")}
1166
- <div class="setup-status-info">
1167
- <strong>Internet Access</strong>
1168
- <span>Tailscale not installed</span>
1169
- </div>
1170
- ${ce("internet",e)}
1171
- </div>
1172
- `;if(i)return p`
1173
- <div>
1174
- <div class="setup-status-item">
1175
- ${q("partial")}
1176
- <div class="setup-status-info">
1177
- <strong>Internet Access</strong>
1178
- <span>Waiting for authentication...</span>
1179
- </div>
1180
- ${ce("internet",e)}
1181
- </div>
1182
- <div style="padding: 12px 0 4px 28px;">
1183
- <p style="margin: 0 0 8px; font-size: 13px; opacity: 0.8;">
1184
- Scan the QR code or open the link to log in with your Google or Microsoft account:
1185
- </p>
1186
- <div style="text-align: center; margin: 12px 0;">
1187
- <img
1188
- src="https://api.qrserver.com/v1/create-qr-code/?size=180x180&data=${encodeURIComponent(i)}"
1189
- alt="Tailscale auth QR code"
1190
- style="width: 180px; height: 180px; border-radius: 8px; background: #fff; padding: 8px;"
1191
- />
1192
- </div>
1193
- <div style="text-align: center; margin-bottom: 8px;">
1194
- <a
1195
- href="${i}"
1196
- target="_blank"
1197
- rel="noopener"
1198
- style="color: var(--tasker-link, #60a5fa); font-size: 13px; word-break: break-all;"
1199
- >${i}</a>
1200
- </div>
1201
- </div>
1202
- </div>
1203
- `;if(!t.loggedIn)return p`
1204
- <div class="setup-status-item">
1205
- ${q("partial")}
1206
- <div class="setup-status-info">
1207
- <strong>Internet Access</strong>
1208
- <span>Not connected</span>
1209
- </div>
1210
- ${ce("internet",e)}
1211
- <button
1212
- class="setup-link-btn"
1213
- ?disabled=${n}
1214
- @click=${e.onTailscaleEnable}
1215
- >${n?"...":"Connect"}</button>
1216
- </div>
1217
- `;if(!t.funnelEnabled){const o=e.tailscaleFunnelEnableUrl;return p`
1218
- <div>
1219
- <div class="setup-status-item">
1220
- ${q("partial")}
1221
- <div class="setup-status-info">
1222
- <strong>Internet Access</strong>
1223
- <span>Connected (LAN only)</span>
1224
- </div>
1225
- ${ce("internet",e)}
1226
- <button
1227
- class="setup-link-btn"
1228
- ?disabled=${n}
1229
- @click=${e.onTailscaleFunnelEnable}
1230
- >${n?"...":"Enable"}</button>
1231
- </div>
1232
- ${o?p`<div style="padding: 8px 0 4px 28px;">
1233
- <p style="margin: 0 0 6px; font-size: 13px; color: #f59e0b;">
1234
- Funnel must be enabled on your Tailscale account first.
1235
- </p>
1236
- <a
1237
- href="${o}"
1238
- target="_blank"
1239
- rel="noopener"
1240
- style="color: var(--tasker-link, #60a5fa); font-size: 13px; word-break: break-all;"
1241
- >Open Tailscale admin to enable Funnel &rarr;</a>
1242
- <p style="margin: 6px 0 0; font-size: 12px; opacity: 0.6;">
1243
- After enabling, come back here and click Enable again.
1244
- </p>
1245
- </div>`:e.tailscaleError&&!o?p`<div style="padding: 8px 0 4px 28px;">
1246
- <p style="margin: 0; font-size: 13px; color: #ef4444;">${e.tailscaleError}</p>
1247
- </div>`:k}
1248
- </div>
1249
- `}if(!t.funnelActive)return p`
1250
- <div>
1251
- <div class="setup-status-item">
1252
- ${q("error")}
1253
- <div class="setup-status-info">
1254
- <strong>Internet Access</strong>
1255
- <span>Enabled but not active</span>
1256
- </div>
1257
- ${ce("internet",e)}
1258
- <button
1259
- class="setup-link-btn"
1260
- ?disabled=${n}
1261
- @click=${e.onTailscaleFunnelDisable}
1262
- >${n?"...":"Disable"}</button>
1263
- </div>
1264
- <div style="padding: 8px 0 4px 28px;">
1265
- <p style="margin: 0; font-size: 13px; color: #f59e0b;">
1266
- Funnel is configured but not running. You may need to
1267
- <a
1268
- href="https://login.tailscale.com/admin/machines"
1269
- target="_blank"
1270
- rel="noopener"
1271
- style="color: var(--tasker-link, #60a5fa);"
1272
- >enable Funnel in Tailscale admin</a>,
1273
- then disable and re-enable here.
1274
- </p>
1275
- </div>
1276
- </div>
1277
- `;const s=t.publicUrl??`https://${t.hostname}`;return p`
1278
- <div class="setup-status-item">
1279
- ${q("good")}
1280
- <div class="setup-status-info">
1281
- <strong>Internet Access</strong>
1282
- <a
1283
- href="${s}"
1284
- target="_blank"
1285
- rel="noopener"
1286
- style="color: var(--tasker-link, #60a5fa); font-size: 12px; overflow-wrap: break-word; word-break: normal;"
1287
- >${s}</a>
1288
- </div>
1289
- ${ce("internet",e)}
1290
- <button
1291
- class="setup-info-btn"
1292
- title="Copy URL"
1293
- @click=${async o=>{const r=o.currentTarget;try{await navigator.clipboard.writeText(s)}catch{const a=document.createElement("textarea");a.value=s,a.style.position="fixed",a.style.opacity="0",document.body.appendChild(a),a.select(),document.execCommand("copy"),document.body.removeChild(a)}r.classList.add("copied"),setTimeout(()=>r.classList.remove("copied"),1500)}}
1294
- >${N.copy}</button>
1295
- <button
1296
- class="setup-link-btn"
1297
- ?disabled=${n}
1298
- @click=${e.onTailscaleFunnelDisable}
1299
- >${n?"...":"Disable"}</button>
1300
- </div>
1301
- `}function Qr(e){const t=e>=70?4:e>=50?3:e>=30?2:1;return p`
1302
- <span style="display: inline-flex; align-items: flex-end; gap: 2px; height: 14px; vertical-align: middle;">
1303
- ${[4,7,10,14].map((i,s)=>p`<span style="
1304
- width: 3px;
1305
- height: ${i}px;
1306
- border-radius: 1px;
1307
- background: ${s<t?"var(--tasker-accent, #00e5ff)":"rgba(255,255,255,0.15)"};
1308
- "></span>`)}
1309
- </span>
1310
- `}function Yr(e){if(e.serverPlatform!=="linux")return k;const t=e.wifiStatus,n=e.wifiBusy;if(!t)return p`
1311
- <div class="setup-status-item">
1312
- ${q("unknown")}
1313
- <div class="setup-status-info">
1314
- <strong>WiFi</strong>
1315
- <span>Checking...</span>
1316
- </div>
1317
- </div>
1318
- `;if(!t.available)return p`
1319
- <div class="setup-status-item">
1320
- ${q("unknown")}
1321
- <div class="setup-status-info">
1322
- <strong>WiFi</strong>
1323
- <span>NetworkManager not available</span>
1324
- </div>
1325
- </div>
1326
- `;const i=e.wifiNetworks,s=e.wifiSelectedSsid,o=i.length>0,r=!!t.savedSsid&&!t.connected,a=t.connected?"good":"partial",u=t.connected?p`${t.ssid} ${t.signal!=null?p`<span style="margin-left: 4px;">${Qr(t.signal)}</span>`:k}`:r?p`${t.savedSsid} <span style="opacity: 0.4;">\u2014 reconnecting\u2026</span>`:"Not connected";return p`
1327
- <div>
1328
- <div class="setup-status-item">
1329
- ${q(a)}
1330
- <div class="setup-status-info">
1331
- <strong>WiFi</strong>
1332
- <span>${u}</span>
1333
- ${t.connected&&t.ip?p`<span style="font-size: 11px; opacity: 0.5;">${t.ip}</span>`:k}
1334
- </div>
1335
- ${t.connected?p`<button
1336
- class="setup-status-action"
1337
- ?disabled=${n}
1338
- @click=${e.onWifiDisconnect}
1339
- title="Disconnect"
1340
- >${N.wifiOff}</button>`:k}
1341
- <button
1342
- class="setup-status-action ${n?"spinning":""}"
1343
- ?disabled=${n}
1344
- @click=${o?e.onWifiDismiss:e.onWifiScan}
1345
- title="${o?"Close":"Scan for networks"}"
1346
- >${o?N.x:N.wifi}</button>
1347
- </div>
1348
-
1349
- ${e.wifiError?p`<div style="padding: 4px 0 4px 28px;">
1350
- <p style="margin: 0; font-size: 13px; color: #ef4444;">${e.wifiError}</p>
1351
- </div>`:k}
1352
-
1353
- ${o?p`
1354
- <div style="padding: 8px 0 4px 28px;">
1355
- <div style="
1356
- max-height: 200px;
1357
- overflow-y: auto;
1358
- border: 1px solid rgba(255,255,255,0.1);
1359
- border-radius: 6px;
1360
- margin-bottom: 8px;
1361
- ">
1362
- ${i.map(c=>{const l=t.savedSsid===c.ssid;return p`
1363
- <button
1364
- style="
1365
- display: flex;
1366
- align-items: center;
1367
- justify-content: space-between;
1368
- width: 100%;
1369
- padding: 8px 12px;
1370
- background: ${s===c.ssid?"rgba(255,255,255,0.1)":"transparent"};
1371
- border: none;
1372
- border-bottom: 1px solid rgba(255,255,255,0.06);
1373
- color: inherit;
1374
- font-size: 13px;
1375
- cursor: pointer;
1376
- text-align: left;
1377
- "
1378
- @click=${()=>{c.active?e.onWifiDismiss():e.onWifiSelectSsid(s===c.ssid?null:c.ssid)}}
1379
- >
1380
- <span style="display: flex; align-items: center; gap: 8px;">
1381
- ${c.active?p`<span style="color: #22c55e;" title="Connected">\u2713</span>`:l?p`<span style="opacity: 0.4; font-size: 11px;" title="Saved">\u2605</span>`:k}
1382
- <span>${c.ssid}</span>
1383
- </span>
1384
- <span style="display: flex; align-items: center; gap: 8px;">
1385
- ${c.security!=="Open"?p`<span style="opacity: 0.4; font-size: 11px;" title="${c.security}">\uD83D\uDD12</span>`:k}
1386
- <span title="Signal: ${c.signal}%">${Qr(c.signal)}</span>
1387
- </span>
1388
- </button>
1389
- `})}
1390
- </div>
1391
-
1392
- ${s&&!i.find(c=>c.ssid===s&&c.active)?p`
1393
- <div style="display: flex; gap: 8px; align-items: center;">
1394
- ${(()=>{const c=i.find(h=>h.ssid===s),l=(c==null?void 0:c.security)!=="Open",d=t.savedSsid===s;return l&&!d?p`
1395
- <input
1396
- type="password"
1397
- placeholder="Password"
1398
- .value=${e.wifiPassword}
1399
- @input=${h=>e.onWifiPasswordChange(h.target.value)}
1400
- @keydown=${h=>{h.key==="Enter"&&e.onWifiConnect()}}
1401
- ?disabled=${n}
1402
- style="
1403
- flex: 1;
1404
- padding: 6px 10px;
1405
- background: rgba(255,255,255,0.06);
1406
- border: 1px solid rgba(255,255,255,0.15);
1407
- border-radius: 4px;
1408
- color: inherit;
1409
- font-size: 13px;
1410
- outline: none;
1411
- "
1412
- />`:k})()}
1413
- <button
1414
- class="setup-button primary"
1415
- style="padding: 6px 16px; font-size: 13px;"
1416
- ?disabled=${n}
1417
- @click=${e.onWifiConnect}
1418
- >${n?"Connecting...":"Connect"}</button>
1419
- ${t.savedSsid===s?p`<button
1420
- class="setup-link-btn"
1421
- ?disabled=${n}
1422
- @click=${e.onWifiForget}
1423
- style="font-size: 12px; opacity: 0.6;"
1424
- >Forget</button>`:k}
1425
- </div>
1426
- `:k}
1427
- </div>
1428
- `:k}
1429
- </div>
1430
- `}function hf(e){var i,s,o;const t=e.updateRunning,n=e.updateLastResult;if(!t&&!n)return k;if(t)return p`
1431
- <div class="setup-info-overlay">
1432
- <div class="setup-info-card" style="max-width: 400px;">
1433
- <h3>Software Update</h3>
1434
- ${e.updateProgressSteps.length>0?p`
1435
- <div class="setup-update-progress">
1436
- ${e.updateProgressSteps.map(r=>p`
1437
- <div class="setup-update-step ${r.status}">
1438
- <span class="setup-update-step-icon">
1439
- ${r.status==="running"?p`<span class="setup-update-spinner"></span>`:r.status==="done"?p`<span class="setup-update-icon-ok">${N.check}</span>`:p`<span class="setup-update-icon-fail">${N.x}</span>`}
1440
- </span>
1441
- <span class="setup-update-step-name">${r.name}</span>
1442
- ${r.durationMs!=null?p`<span class="setup-update-step-time">${Xr(r.durationMs)}</span>`:k}
1443
- </div>
1444
- `)}
1445
- </div>
1446
- `:p`<div class="setup-spinner" style="margin: 16px auto;"></div>`}
1447
- ${e.updateMessage?p`<p style="text-align: center; color: var(--tasker-text-grey); font-size: 13px; margin: 12px 0 0;">${e.updateMessage}</p>`:k}
1448
- </div>
1449
- </div>
1450
- `;if(n){const r=n.status==="ok";let a;if(r){const c=(i=n.before)==null?void 0:i.version,l=((s=n.after)==null?void 0:s.version)??n.currentVersion;a=c?`v${c} → v${l}`:`Updated to v${l}`}else a=n.reason??((o=n.failedStep)==null?void 0:o.name)??"unknown error";const u=n.durationMs!=null?Xr(n.durationMs):null;return p`
1451
- <div class="setup-info-overlay" @click=${c=>{c.target.classList.contains("setup-info-overlay")&&e.onUpdateDismissResult()}}>
1452
- <div class="setup-info-card" style="max-width: 360px; text-align: center;">
1453
- <div class="setup-update-result-icon ${r?"ok":"fail"}">${r?N.circleCheck:N.circleX}</div>
1454
- <h3 style="color: ${r?"#22c55e":"#ef4444"};">
1455
- ${r?"Update Complete":"Update Failed"}
1456
- </h3>
1457
- <p style="color: var(--tasker-text-grey); font-size: 14px; margin: 8px 0;">
1458
- ${a}
1459
- </p>
1460
- ${u?p`<p style="color: rgba(255,255,255,0.3); font-size: 12px; margin: 4px 0 0;">${u}</p>`:k}
1461
- <button
1462
- class="setup-button secondary"
1463
- style="margin-top: 20px; width: 100%; padding: 10px;"
1464
- @click=${e.onUpdateDismissResult}
1465
- >
1466
- Close
1467
- </button>
1468
- </div>
1469
- </div>
1470
- `}return k}function Xr(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),i=t%60;return i>0?`${n}m ${i}s`:`${n}m`}function Zr(e){const t=e.accountHasPin;return p`
1471
- <div class="setup-status-item">
1472
- ${q(t?"good":"bad")}
1473
- <div class="setup-status-info">
1474
- <strong>Account PIN</strong>
1475
- <span>${t?"Set":"Not set"}</span>
1476
- </div>
1477
- ${ce("account-pin",e)}
1478
- <button
1479
- class="setup-link-btn"
1480
- @click=${()=>e.onAccountPinModalOpen()}
1481
- >${t?"Change":"Set PIN"}</button>
1482
- </div>
1483
- `}function Jr(e){if(!e.accountPinModalOpen)return k;const t=e.accountHasPin,n=e.accountPinBusy;let i="",s="",o="";const r=c=>l=>{const d=l.target;d.value=d.value.replace(/\D/g,"").slice(0,6),c(d.value)},a=(c,l)=>{var h;let d=c.querySelector(".pin-modal-validation");d||(d=document.createElement("p"),d.className="login-error pin-modal-validation",(h=c.querySelector("button[type=submit]"))==null||h.before(d)),d.textContent=l},u=c=>{c.preventDefault();const l=c.target;if(!n){if(t&&!i){a(l,"Enter your current PIN");return}if(!s){a(l,"Enter a new PIN");return}if(!o){a(l,"Confirm your new PIN");return}if(s!==o){a(l,"PINs do not match");return}if(s.length<4){a(l,"PIN must be 4–6 digits");return}e.onAccountPinSave(t?i:null,s)}};return p`
1484
- <div class="setup-info-overlay" @click=${c=>{c.target.classList.contains("setup-info-overlay")&&e.onAccountPinModalClose()}}>
1485
- <div class="setup-info-card" style="max-width: 340px;">
1486
- <div class="setup-info-header">
1487
- <h3>${t?"Change Account PIN":"Set Account PIN"}</h3>
1488
- <button class="setup-info-close" @click=${()=>e.onAccountPinModalClose()}>
1489
- ${N.close}
1490
- </button>
1491
- </div>
1492
- <form @submit=${u} style="display: flex; flex-direction: column; gap: 12px; padding: 16px 0 8px;">
1493
- ${t?p`
1494
- <input
1495
- class="login-pin-input"
1496
- type="password"
1497
- inputmode="numeric"
1498
- pattern="[0-9]*"
1499
- minlength="4"
1500
- maxlength="6"
1501
- placeholder="Current PIN"
1502
- ?disabled=${n}
1503
- @input=${r(c=>{i=c})}
1504
- autofocus
1505
- />
1506
- `:k}
1507
- <input
1508
- class="login-pin-input"
1509
- type="password"
1510
- inputmode="numeric"
1511
- pattern="[0-9]*"
1512
- minlength="4"
1513
- maxlength="6"
1514
- placeholder="New PIN (4–6 digits)"
1515
- ?disabled=${n}
1516
- @input=${r(c=>{s=c})}
1517
- ${t?k:p`autofocus`}
1518
- />
1519
- <input
1520
- class="login-pin-input"
1521
- type="password"
1522
- inputmode="numeric"
1523
- pattern="[0-9]*"
1524
- minlength="4"
1525
- maxlength="6"
1526
- placeholder="Confirm PIN"
1527
- ?disabled=${n}
1528
- @input=${r(c=>{o=c})}
1529
- />
1530
- ${e.accountPinError?p`<p class="login-error">${e.accountPinError}</p>`:k}
1531
- ${e.accountPinSuccess?p`<p class="login-success">${e.accountPinSuccess}</p>`:k}
1532
- <button
1533
- class="login-submit"
1534
- type="submit"
1535
- ?disabled=${n}
1536
- >${n?p`<span class="login-spinner"></span>`:t?"Change PIN":"Set PIN"}</button>
1537
- </form>
1538
- </div>
1539
- </div>
1540
- `}function ea(e){if(!e.addingWorkspace)return k;const{workspaceSaving:t}=e;return p`
1541
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1542
- <div class="setup-add-account">
1543
- <strong>New Account</strong>
1544
- <input
1545
- type="text"
1546
- class="setup-add-account-input"
1547
- placeholder=""
1548
- .value=${e.newWorkspaceName}
1549
- @input=${n=>e.onSetNewWorkspaceName(n.target.value)}
1550
- @keydown=${n=>{n.key==="Enter"&&e.newWorkspaceName.trim()&&e.newWorkspacePin.match(/^\d{4,6}$/)&&e.onWorkspaceCreate(e.newWorkspaceName,e.newWorkspacePath||void 0)}}
1551
- />
1552
- <input
1553
- type="password"
1554
- inputmode="numeric"
1555
- pattern="[0-9]*"
1556
- minlength="4"
1557
- maxlength="6"
1558
- class="setup-add-account-input"
1559
- placeholder="PIN for this account (4-6 digits)"
1560
- .value=${e.newWorkspacePin}
1561
- @input=${n=>{const i=n.target;i.value=i.value.replace(/\D/g,"").slice(0,6),e.onSetNewWorkspacePin(i.value)}}
1562
- />
1563
- <details style="margin-top: 8px;">
1564
- <summary style="cursor: pointer; font-size: 12px; color: var(--tasker-text-grey);">
1565
- Use existing workspace (advanced)
1566
- </summary>
1567
- <input
1568
- type="text"
1569
- class="setup-add-account-input"
1570
- placeholder="/path/to/workspace"
1571
- style="margin-top: 8px;"
1572
- .value=${e.newWorkspacePath}
1573
- @input=${n=>e.onSetNewWorkspacePath(n.target.value)}
1574
- />
1575
- </details>
1576
- <div class="setup-add-account-actions" style="margin-top: 8px;">
1577
- <button
1578
- class="setup-button primary"
1579
- ?disabled=${t||!e.newWorkspaceName.trim()||!e.newWorkspacePin.match(/^\d{4,6}$/)}
1580
- @click=${()=>e.onWorkspaceCreate(e.newWorkspaceName,e.newWorkspacePath||void 0)}
1581
- >
1582
- ${t?"Creating…":"Create"}
1583
- </button>
1584
- <button
1585
- class="setup-button secondary"
1586
- @click=${()=>{e.onSetAddingWorkspace(!1),e.onSetNewWorkspaceName(""),e.onSetNewWorkspacePath(""),e.onSetNewWorkspacePin("")}}
1587
- >
1588
- Cancel
1589
- </button>
1590
- </div>
1591
- </div>
1592
- </div>
1593
- `}function ta(e){const t=Wt(e);return!t||t.isDefault?k:e.workspaceRemoveConfirm===t.name?p`
1594
- <div style="margin-top: 16px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 12px;">
1595
- <div style="font-size: 13px; display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
1596
- <span style="color: var(--tasker-danger, #ef4444);">Remove "${t.displayName??t.name}" and its WhatsApp account?</span>
1597
- <button
1598
- class="setup-button danger"
1599
- style="font-size: 12px; padding: 4px 12px;"
1600
- ?disabled=${e.workspaceSaving}
1601
- @click=${()=>e.onWorkspaceRemove(t.name)}
1602
- >
1603
- ${e.workspaceSaving?"Removing…":"Remove"}
1604
- </button>
1605
- <button
1606
- class="setup-button secondary"
1607
- style="font-size: 12px; padding: 4px 12px;"
1608
- @click=${()=>e.onSetWorkspaceRemoveConfirm(null)}
1609
- >
1610
- Cancel
1611
- </button>
1612
- </div>
1613
- </div>
1614
- `:p`
1615
- <p class="setup-hint" style="margin-top: 12px;">
1616
- <a
1617
- href="#"
1618
- class="setup-link-danger"
1619
- @click=${i=>{i.preventDefault(),e.onSetWorkspaceRemoveConfirm(t.name)}}
1620
- >Remove Account</a>
1621
- </p>
1622
- `}function na(e){if(e.uninstallDone)return p`
1623
- <div style="margin-top: 24px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1624
- <p style="color: var(--tasker-danger, #ef4444); font-size: 13px; font-weight: 600; margin: 0 0 8px 0;">
1625
- Taskmaster has been uninstalled.
1626
- </p>
1627
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0;">
1628
- If the npm package was not removed automatically, run:<br/>
1629
- <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>
1630
- </p>
1631
- </div>
1632
- `;if(e.uninstallConfirm){const t=e.uninstallConfirmText==="UNINSTALL";return p`
1633
- <div style="margin-top: 24px; border-top: 1px solid var(--tasker-border, rgba(255,255,255,0.1)); padding-top: 16px;">
1634
- <p style="color: var(--tasker-danger, #ef4444); font-size: 13px; font-weight: 600; margin: 0 0 8px 0;">
1635
- Uninstall Taskmaster
1636
- </p>
1637
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0 0 12px 0;">
1638
- This will stop the gateway, remove all configuration, workspace files, and the npm package.
1639
- This cannot be undone.
1640
- </p>
1641
- <div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
1642
- <input
1643
- type="text"
1644
- placeholder="Type UNINSTALL to confirm"
1645
- .value=${e.uninstallConfirmText}
1646
- ?disabled=${e.uninstallBusy}
1647
- @input=${n=>e.onUninstallConfirmTextChange(n.target.value)}
1648
- 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;"
1649
- />
1650
- <button
1651
- class="setup-button danger"
1652
- style="font-size: 12px; padding: 4px 12px;"
1653
- ?disabled=${!t||e.uninstallBusy}
1654
- @click=${e.onUninstallRun}
1655
- >
1656
- ${e.uninstallBusy?"Uninstalling…":"Uninstall"}
1657
- </button>
1658
- <button
1659
- class="setup-button secondary"
1660
- style="font-size: 12px; padding: 4px 12px;"
1661
- ?disabled=${e.uninstallBusy}
1662
- @click=${e.onUninstallCancel}
1663
- >
1664
- Cancel
1665
- </button>
1666
- </div>
1667
- ${e.uninstallError?p`<p class="setup-error" style="margin-top: 8px; font-size: 12px;">${e.uninstallError}</p>`:k}
1668
- </div>
1669
- `}return p`
1670
- <p class="setup-hint" style="margin-top: 8px;">
1671
- <a
1672
- href="#"
1673
- class="setup-link-danger"
1674
- @click=${t=>{t.preventDefault(),e.onUninstallConfirm()}}
1675
- >Uninstall Taskmaster</a>
1676
- </p>
1677
- `}function ia(){return p`
1678
- <p class="setup-hint" style="margin-top: 4px; font-size: 12px; opacity: 0.6;">
1679
- Need help? <a href="https://wa.me/447591215452" target="_blank" rel="noopener" style="color: var(--tasker-orange);">Message Dave on WhatsApp</a>
1680
- </p>
1681
- `}function ff(e){const{whatsappBusy:t,whatsappLoginMessage:n,whatsappLoginQrDataUrl:i,whatsappLoginConnected:s,whatsappChannelStatus:o}=e;if(i)return p`
1682
- <div class="setup-container">
1683
- <div class="setup-card">
1684
- <h1>Scan with WhatsApp</h1>
1685
- <p>
1686
- On your phone: WhatsApp → Settings → Linked Devices → Link a Device
1687
- </p>
1688
- <div class="setup-qr">
1689
- <img src=${i} alt="WhatsApp QR Code" />
1690
- </div>
1691
- ${t?p`<p class="setup-waiting">Waiting for scan...</p>`:p`<p class="setup-hint">
1692
- Scan the code above with your phone
1693
- </p>`}
1694
- <p class="setup-hint" style="margin-top: 16px;">
1695
- <strong>Important:</strong> If you see "${Xe().name}" in your Linked
1696
- Devices, remove it first before scanning.
1697
- </p>
1698
- <div class="setup-actions" style="margin-top: 24px;">
1699
- <button
1700
- class="setup-button secondary"
1701
- @click=${e.onWhatsAppBack}
1702
- >
1703
- ← Back
1704
- </button>
1705
- </div>
1706
- </div>
1707
- </div>
1708
- `;if(t)return p`
1709
- <div class="setup-container">
1710
- <div class="setup-card">
1711
- <div class="setup-spinner"></div>
1712
- <p>${n||"Connecting to WhatsApp..."}</p>
1713
- </div>
1714
- </div>
1715
- `;const r=(o==null?void 0:o.running)&&(o==null?void 0:o.connected);return o?(e.whatsappAccounts.length>1?e.whatsappAccounts.every(l=>l.running&&l.connected):r)&&e.authConnected?p`
1716
- <div class="setup-container">
1717
- <div class="setup-card setup-success setup-dashboard-wide">
1718
- ${Ur(e)}
1719
- <div class="setup-status-dashboard">
1720
- ${Wr(e)}
1721
- ${Kr(e)}
1722
- ${zr(e)}
1723
- ${jr(e)}
1724
- ${e.serverPlatform==="darwin"?Hr(e):k}
1725
- ${Zr(e)}
1726
- ${Vr(e)}
1727
- ${Gr(e)}
1728
- ${pf(e)}
1729
- ${Yr(e)}
1730
- </div>
1731
-
1732
- ${Jr(e)}
1733
- ${qr(e)}
1734
- ${ea(e)}
1735
- ${ta(e)}
1736
- ${na(e)}
1737
- ${ia()}
1738
- ${e.workspacesError?p`<p class="setup-error" style="margin-top: 8px;">${e.workspacesError}</p>`:k}
1739
- </div>
1740
- </div>
1741
- `:p`
1742
- <div class="setup-container">
1743
- <div class="setup-card setup-dashboard-wide">
1744
- ${Ur(e)}
1745
- <div class="setup-status-dashboard">
1746
- ${Wr(e)}
1747
- ${Kr(e)}
1748
- ${zr(e)}
1749
- ${jr(e)}
1750
- ${e.serverPlatform==="darwin"?Hr(e):k}
1751
- ${Zr(e)}
1752
- ${Vr(e)}
1753
- ${Gr(e)}
1754
- ${Yr(e)}
1755
- </div>
1756
-
1757
- ${Jr(e)}
1758
- ${qr(e)}
1759
- ${ea(e)}
1760
- ${ta(e)}
1761
- ${na(e)}
1762
- ${ia()}
1763
- ${e.workspacesError?p`<p class="setup-error" style="margin-top: 8px;">${e.workspacesError}</p>`:k}
1764
- </div>
1765
- </div>
1766
- `:o?s===!1&&n&&!t?p`
1767
- <div class="setup-container">
1768
- <div class="setup-card">
1769
- ${we("whatsapp")}
1770
- <div class="setup-status-row">
1771
- ${q("bad")}
1772
- <span>Connection Failed</span>
1773
- </div>
1774
- <p class="setup-error">${n}</p>
1775
- <button
1776
- class="setup-button primary"
1777
- ?disabled=${t}
1778
- @click=${e.onWhatsAppRelink}
1779
- >
1780
- Try Again
1781
- </button>
1782
- </div>
1783
- </div>
1784
- `:p`
1785
- <div class="setup-container">
1786
- <div class="setup-card">
1787
- ${we("whatsapp")}
1788
- ${n?p`<p class="setup-error">${n}</p>`:p`<div class="setup-spinner"></div>
1789
- <p>Preparing...</p>`}
1790
- </div>
1791
- </div>
1792
- `:p`
1793
- <div class="setup-container">
1794
- <div class="setup-card">
1795
- ${we("whatsapp")}
1796
- <div class="setup-spinner"></div>
1797
- <p>Checking connection status...</p>
1798
- <button
1799
- class="setup-button secondary"
1800
- style="margin-top: 16px;"
1801
- @click=${e.onRefreshStatus}
1802
- >
1803
- Refresh Status
1804
- </button>
1805
- </div>
1806
- </div>
1807
- `}function gf(e){const{connected:t,currentStep:n}=e;if(t&&ui()&&To(),e.uninstallDone||!t&&ui())return p`
1808
- <div class="setup-container">
1809
- <div class="setup-card">
1810
- <p style="color: var(--tasker-danger, #ef4444); font-size: 16px; font-weight: 600; margin: 0 0 12px 0;">
1811
- Taskmaster has been uninstalled.
1812
- </p>
1813
- <p style="font-size: 13px; color: var(--tasker-text-grey); margin: 0 0 16px 0;">
1814
- The gateway service, configuration, and workspace files have been removed.
1815
- </p>
1816
- <p style="font-size: 13px; color: var(--tasker-text-grey); margin: 0 0 16px 0;">
1817
- If the npm package was not removed automatically, run:
1818
- </p>
1819
- <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>
1820
- <p style="font-size: 12px; color: var(--tasker-text-grey); margin: 0;">You can close this tab.</p>
1821
- </div>
1822
- </div>
1823
- `;if(!t){const o=e.updateRunning;return p`
1824
- <div class="setup-container">
1825
- <div class="setup-card">
1826
- <div class="setup-spinner"></div>
1827
- <p>${o?"Restarting gateway after update…":"Connecting to gateway..."}</p>
1828
- </div>
1829
- </div>
1830
- `}let i;switch(n){case"license":i=Fr(e);break;case"auth":i=sf(e);break;case"whatsapp":case"complete":i=ff(e);break;default:i=Fr(e)}const s=vt("Setup",e.wsProps);return p`${i}${nf(e)}${cf(e)}${lf(e)}${hf(e)}${s}`}function mf(e,t){const n=e.paired?"Paired phone (used to link WhatsApp)":"Admin access via WhatsApp DM";return p`
1831
- <div class="sp-list-item">
1832
- <div class="sp-list-item-main">
1833
- <div class="sp-list-item-title">${e.phone}</div>
1834
- <div class="sp-list-item-sub">${n}</div>
1835
- </div>
1836
- ${e.paired?p`<span style="color: var(--tasker-orange); font-size: 13px; padding: 8px 16px;">Primary</span>`:p`<button
1837
- class="setup-button danger"
1838
- style="padding: 8px 16px; font-size: 13px;"
1839
- ?disabled=${t.saving}
1840
- @click=${()=>t.onRemove(e.phone)}
1841
- >
1842
- Remove
1843
- </button>`}
1844
- </div>
1845
- `}function yf(e){if(!e.connected)return p`
1846
- <div class="setup-container">
1847
- <div class="setup-card">
1848
- <div class="setup-spinner"></div>
1849
- <p>Connecting to gateway...</p>
1850
- </div>
1851
- </div>
1852
- `;const t=n=>{n.preventDefault(),e.newPhone.trim()&&e.onAdd(e.newPhone)};return p`
1853
- <div class="setup-container">
1854
- ${vt("Admins",e.wsProps)}
1855
- <div class="setup-card" style="max-width: 520px;">
1856
- <h1>Admin Phones</h1>
1857
- <p style="margin-bottom: 16px;">
1858
- Phone numbers that route to the admin agent instead of the public agent.
1859
- </p>
1860
-
1861
- <div class="sp-toolbar">
1862
- <button
1863
- class="setup-button secondary"
1864
- style="padding: 10px 20px; font-size: 14px;"
1865
- ?disabled=${e.loading}
1866
- @click=${e.onRefresh}
1867
- >
1868
- ${e.loading?"Loading...":"Refresh"}
1869
- </button>
1870
- </div>
1871
-
1872
- ${e.error?p`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:k}
1873
-
1874
- <form style="display: flex; flex-direction: row; gap: 12px; margin-top: 20px; align-items: stretch;" @submit=${t}>
1875
- <input
1876
- type="tel"
1877
- 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;"
1878
- placeholder="+44..."
1879
- .value=${e.newPhone}
1880
- @input=${n=>e.onNewPhoneChange(n.target.value)}
1881
- ?disabled=${e.saving}
1882
- />
1883
- <button
1884
- type="submit"
1885
- class="setup-button primary"
1886
- style="padding: 10px 20px; font-size: 14px; flex-shrink: 0;"
1887
- ?disabled=${e.saving||!e.newPhone.trim()}
1888
- >
1889
- ${e.saving?"Saving...":"Add"}
1890
- </button>
1891
- </form>
1892
-
1893
- <div class="sp-list" style="margin-top: 20px;">
1894
- ${e.phones.length===0?p`<div class="sp-list-empty">No admin phones configured yet.</div>`:e.phones.map(n=>mf(n,e))}
1895
- </div>
1896
-
1897
- <div class="setup-hint" style="margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;">
1898
- <strong style="color: var(--tasker-white);">How it works:</strong><br/>
1899
- 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.
1900
- 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.
1901
- </div>
1902
-
1903
- </div>
1904
- </div>
1905
- `}function vf(e){return Object.keys(e.fields).length}function bf(e,t){const n=Object.entries(e.fields);return p`
1906
- <div class="contacts-record-fields">
1907
- ${n.length===0?p`<div style="color: rgba(255,255,255,0.4); font-size: 13px; margin-top: 12px;">No fields yet. Add one below.</div>`:n.map(([i,s])=>p`
1908
- <div class="contacts-field-row">
1909
- <input
1910
- class="field-key"
1911
- type="text"
1912
- .value=${i}
1913
- disabled
1914
- title="Field name"
1915
- />
1916
- <input
1917
- class="field-value"
1918
- type="text"
1919
- .value=${s}
1920
- @change=${o=>t.onSetField(e.id,i,o.target.value)}
1921
- ?disabled=${t.saving}
1922
- title="Field value"
1923
- />
1924
- <button
1925
- class="setup-button danger field-delete"
1926
- ?disabled=${t.saving}
1927
- @click=${()=>t.onDeleteField(e.id,i)}
1928
- >
1929
- ×
1930
- </button>
1931
- </div>
1932
- `)}
1933
- <div class="contacts-record-actions">
1934
- <button
1935
- class="setup-button secondary"
1936
- style="font-size: 13px; padding: 8px 14px;"
1937
- ?disabled=${t.saving}
1938
- @click=${()=>{const i=prompt("Field name (e.g. status, plan, notes):");if(!(i!=null&&i.trim()))return;const s=prompt(`Value for "${i.trim()}":`);s!==null&&t.onSetField(e.id,i.trim(),s)}}
1939
- >
1940
- + Add Field
1941
- </button>
1942
- <button
1943
- class="setup-button danger"
1944
- style="font-size: 13px; padding: 8px 14px;"
1945
- ?disabled=${t.saving}
1946
- @click=${()=>{confirm(`Delete contact "${e.name}" (${e.id})?`)&&t.onDelete(e.id)}}
1947
- >
1948
- Delete Contact
1949
- </button>
1950
- </div>
1951
- </div>
1952
- `}function wf(e,t){const n=t.editingId===e.id,i=vf(e),s=i===0?"No fields":`${i} field${i>1?"s":""}`;return p`
1953
- <div class="contacts-record">
1954
- <div
1955
- class="contacts-record-header"
1956
- @click=${()=>t.onToggleExpand(e.id)}
1957
- >
1958
- <div class="contacts-record-info">
1959
- <span class="contacts-record-name">${e.name}</span>
1960
- <span class="contacts-record-phone">${e.id}</span>
1961
- </div>
1962
- <span class="contacts-record-meta">${s}</span>
1963
- </div>
1964
- ${n?bf(e,t):k}
1965
- </div>
1966
- `}function kf(e){if(!e.connected)return p`
1967
- <div class="setup-container">
1968
- <div class="setup-card">
1969
- <div class="setup-spinner"></div>
1970
- <p>Connecting to gateway...</p>
1971
- </div>
1972
- </div>
1973
- `;const t=i=>{i.preventDefault(),e.onSearchSubmit()},n=i=>{i.preventDefault(),e.newRecordPhone.trim()&&e.newRecordName.trim()&&e.onAdd(e.newRecordPhone,e.newRecordName)};return p`
1974
- <div class="setup-container">
1975
- ${vt("Contacts",e.wsProps)}
1976
- <div class="setup-card" style="max-width: 620px;">
1977
- <h1>Contact Records</h1>
1978
- <p style="margin-bottom: 16px;">
1979
- Verified contact data managed by the business owner. Agents can read these records but cannot modify them.
1980
- </p>
1981
-
1982
- <div class="sp-toolbar" style="display: flex; gap: 8px;">
1983
- <button
1984
- class="setup-button secondary"
1985
- style="padding: 10px 20px; font-size: 14px;"
1986
- ?disabled=${e.loading}
1987
- @click=${e.onRefresh}
1988
- >
1989
- ${e.loading?"Loading...":"Refresh"}
1990
- </button>
1991
- <button
1992
- class="setup-button primary"
1993
- style="padding: 10px 20px; font-size: 14px;"
1994
- @click=${e.onShowAddForm}
1995
- >
1996
- + Add Contact
1997
- </button>
1998
- </div>
1999
-
2000
- ${e.error?p`<div class="setup-error" style="margin-top: 16px;">${e.error}</div>`:k}
2001
-
2002
- ${e.showAddForm?p`
2003
- <form class="contacts-add-form" @submit=${n}>
2004
- <input
2005
- type="tel"
2006
- placeholder="+447490553305"
2007
- .value=${e.newRecordPhone}
2008
- @input=${i=>e.onNewRecordPhoneChange(i.target.value)}
2009
- ?disabled=${e.saving}
2010
- />
2011
- <input
2012
- type="text"
2013
- placeholder="Contact name"
2014
- .value=${e.newRecordName}
2015
- @input=${i=>e.onNewRecordNameChange(i.target.value)}
2016
- ?disabled=${e.saving}
2017
- />
2018
- <div class="contacts-add-form-buttons">
2019
- <button
2020
- type="submit"
2021
- class="setup-button primary"
2022
- style="padding: 10px 20px; font-size: 14px;"
2023
- ?disabled=${e.saving||!e.newRecordPhone.trim()||!e.newRecordName.trim()}
2024
- >
2025
- ${e.saving?"Saving...":"Add"}
2026
- </button>
2027
- <button
2028
- type="button"
2029
- class="setup-button secondary"
2030
- style="padding: 10px 20px; font-size: 14px;"
2031
- @click=${e.onCancelAddForm}
2032
- >
2033
- Cancel
2034
- </button>
2035
- </div>
2036
- </form>
2037
- `:k}
2038
-
2039
- <form
2040
- class="contacts-search"
2041
- style="margin-top: 16px;"
2042
- @submit=${t}
2043
- >
2044
- <input
2045
- type="text"
2046
- placeholder="Search by name or phone..."
2047
- .value=${e.searchQuery}
2048
- @input=${i=>e.onSearch(i.target.value)}
2049
- />
2050
- <button
2051
- type="submit"
2052
- class="setup-button secondary"
2053
- style="padding: 10px 20px; font-size: 14px; flex-shrink: 0;"
2054
- >
2055
- Search
2056
- </button>
2057
- </form>
2058
-
2059
- <div style="margin-top: 16px;">
2060
- ${e.records.length===0?p`<div class="contacts-empty">
2061
- ${e.searchQuery.trim()?`No records matching "${e.searchQuery}".`:"No contact records yet. Add one to get started."}
2062
- </div>`:e.records.map(i=>wf(i,e))}
2063
- </div>
2064
-
2065
- <div class="setup-hint" style="margin-top: 20px; padding: 14px; background: rgba(0, 0, 0, 0.2); border-radius: 8px; text-align: left;">
2066
- <strong style="color: var(--tasker-white);">How it works:</strong><br/>
2067
- Records stored here are <strong>read-only for agents</strong> — they use the
2068
- <code style="background: rgba(255,255,255,0.1); padding: 2px 6px; border-radius: 4px; color: var(--tasker-orange);">contact_lookup</code>
2069
- tool to check payment status and account details, but cannot modify them. This prevents prompt injection from altering sensitive data.
2070
- </div>
2071
- </div>
2072
- </div>
2073
- `}const bc={CHILD:2},wc=e=>(...t)=>({_$litDirective$:e,values:t});let kc=class{constructor(t){}get _$AU(){return this._$AM._$AU}_$AT(t,n,i){this._$Ct=t,this._$AM=n,this._$Ci=i}_$AS(t,n){return this.update(t,n)}update(t,n){return this.render(...n)}};const{I:Sf}=ld,sa=e=>e,oa=()=>document.createComment(""),Gt=(e,t,n)=>{var o;const i=e._$AA.parentNode,s=t===void 0?e._$AB:t._$AA;if(n===void 0){const r=i.insertBefore(oa(),s),a=i.insertBefore(oa(),s);n=new Sf(r,a,e,e.options)}else{const r=n._$AB.nextSibling,a=n._$AM,u=a!==e;if(u){let c;(o=n._$AQ)==null||o.call(n,e),n._$AM=e,n._$AP!==void 0&&(c=e._$AU)!==a._$AU&&n._$AP(c)}if(r!==s||u){let c=n._$AA;for(;c!==r;){const l=sa(c).nextSibling;sa(i).insertBefore(c,s),c=l}}}return n},st=(e,t,n=e)=>(e._$AI(t,n),e),xf={},$f=(e,t=xf)=>e._$AH=t,Af=e=>e._$AH,os=e=>{e._$AR(),e._$AA.remove()};const ra=(e,t,n)=>{const i=new Map;for(let s=t;s<=n;s++)i.set(e[s],s);return i},Ef=wc(class extends kc{constructor(e){if(super(e),e.type!==bc.CHILD)throw Error("repeat() can only be used in text expressions")}dt(e,t,n){let i;n===void 0?n=t:t!==void 0&&(i=t);const s=[],o=[];let r=0;for(const a of e)s[r]=i?i(a,r):r,o[r]=n(a,r),r++;return{values:o,keys:s}}render(e,t,n){return this.dt(e,t,n).values}update(e,[t,n,i]){const s=Af(e),{values:o,keys:r}=this.dt(t,n,i);if(!Array.isArray(s))return this.ut=r,o;const a=this.ut??(this.ut=[]),u=[];let c,l,d=0,h=s.length-1,v=0,f=o.length-1;for(;d<=h&&v<=f;)if(s[d]===null)d++;else if(s[h]===null)h--;else if(a[d]===r[v])u[v]=st(s[d],o[v]),d++,v++;else if(a[h]===r[f])u[f]=st(s[h],o[f]),h--,f--;else if(a[d]===r[f])u[f]=st(s[d],o[f]),Gt(e,u[f+1],s[d]),d++,f--;else if(a[h]===r[v])u[v]=st(s[h],o[v]),Gt(e,s[d],s[h]),h--,v++;else if(c===void 0&&(c=ra(r,v,f),l=ra(a,d,h)),c.has(a[d]))if(c.has(a[h])){const b=l.get(r[v]),S=b!==void 0?s[b]:null;if(S===null){const $=Gt(e,s[d]);st($,o[v]),u[v]=$}else u[v]=st(S,o[v]),Gt(e,s[d],S),s[b]=null;v++}else os(s[h]),h--;else os(s[d]),d++;for(;v<=f;){const b=Gt(e,u[f+1]);st(b,o[v]),u[v++]=b}for(;d<=h;){const b=s[d++];b!==null&&os(b)}return this.ut=r,$f(e,u),Qe}});class Os extends kc{constructor(t){if(super(t),this.it=k,t.type!==bc.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(t){if(t===k||t==null)return this._t=void 0,this.it=t;if(t===Qe)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:[]}}}Os.directiveName="unsafeHTML",Os.resultType=1;const di=wc(Os);const{entries:Sc,setPrototypeOf:aa,isFrozen:Cf,getPrototypeOf:Tf,getOwnPropertyDescriptor:_f}=Object;let{freeze:pe,seal:ge,create:Bs}=Object,{apply:Fs,construct:Us}=typeof Reflect<"u"&&Reflect;pe||(pe=function(t){return t});ge||(ge=function(t){return t});Fs||(Fs=function(t,n){for(var i=arguments.length,s=new Array(i>2?i-2:0),o=2;o<i;o++)s[o-2]=arguments[o];return t.apply(n,s)});Us||(Us=function(t){for(var n=arguments.length,i=new Array(n>1?n-1:0),s=1;s<n;s++)i[s-1]=arguments[s];return new t(...i)});const Un=he(Array.prototype.forEach),Mf=he(Array.prototype.lastIndexOf),la=he(Array.prototype.pop),Qt=he(Array.prototype.push),Pf=he(Array.prototype.splice),Xn=he(String.prototype.toLowerCase),rs=he(String.prototype.toString),as=he(String.prototype.match),Yt=he(String.prototype.replace),Lf=he(String.prototype.indexOf),If=he(String.prototype.trim),ye=he(Object.prototype.hasOwnProperty),le=he(RegExp.prototype.test),Xt=Rf(TypeError);function he(e){return function(t){t instanceof RegExp&&(t.lastIndex=0);for(var n=arguments.length,i=new Array(n>1?n-1:0),s=1;s<n;s++)i[s-1]=arguments[s];return Fs(e,t,i)}}function Rf(e){return function(){for(var t=arguments.length,n=new Array(t),i=0;i<t;i++)n[i]=arguments[i];return Us(e,n)}}function F(e,t){let n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Xn;aa&&aa(e,null);let i=t.length;for(;i--;){let s=t[i];if(typeof s=="string"){const o=n(s);o!==s&&(Cf(t)||(t[i]=o),s=o)}e[s]=!0}return e}function Nf(e){for(let t=0;t<e.length;t++)ye(e,t)||(e[t]=null);return e}function Ce(e){const t=Bs(null);for(const[n,i]of Sc(e))ye(e,n)&&(Array.isArray(i)?t[n]=Nf(i):i&&typeof i=="object"&&i.constructor===Object?t[n]=Ce(i):t[n]=i);return t}function Zt(e,t){for(;e!==null;){const i=_f(e,t);if(i){if(i.get)return he(i.get);if(typeof i.value=="function")return he(i.value)}e=Tf(e)}function n(){return null}return n}const ca=pe(["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"]),ls=pe(["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"]),cs=pe(["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"]),Df=pe(["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"]),us=pe(["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"]),Of=pe(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),ua=pe(["#text"]),da=pe(["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"]),ds=pe(["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"]),pa=pe(["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"]),Wn=pe(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),Bf=ge(/\{\{[\w\W]*|[\w\W]*\}\}/gm),Ff=ge(/<%[\w\W]*|[\w\W]*%>/gm),Uf=ge(/\$\{[\w\W]*/gm),Wf=ge(/^data-[\-\w.\u00B7-\uFFFF]+$/),Kf=ge(/^aria-[\-\w]+$/),xc=ge(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),zf=ge(/^(?:\w+script|data):/i),jf=ge(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),$c=ge(/^html$/i),Hf=ge(/^[a-z][.\w]*(-[.\w]+)+$/i);var ha=Object.freeze({__proto__:null,ARIA_ATTR:Kf,ATTR_WHITESPACE:jf,CUSTOM_ELEMENT:Hf,DATA_ATTR:Wf,DOCTYPE_NAME:$c,ERB_EXPR:Ff,IS_ALLOWED_URI:xc,IS_SCRIPT_OR_DATA:zf,MUSTACHE_EXPR:Bf,TMPLIT_EXPR:Uf});const Jt={element:1,text:3,progressingInstruction:7,comment:8,document:9},qf=function(){return typeof window>"u"?null:window},Vf=function(t,n){if(typeof t!="object"||typeof t.createPolicy!="function")return null;let i=null;const s="data-tt-policy-suffix";n&&n.hasAttribute(s)&&(i=n.getAttribute(s));const o="dompurify"+(i?"#"+i:"");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}},fa=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function Ac(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:qf();const t=I=>Ac(I);if(t.version="3.3.1",t.removed=[],!e||!e.document||e.document.nodeType!==Jt.document||!e.Element)return t.isSupported=!1,t;let{document:n}=e;const i=n,s=i.currentScript,{DocumentFragment:o,HTMLTemplateElement:r,Node:a,Element:u,NodeFilter:c,NamedNodeMap:l=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:d,DOMParser:h,trustedTypes:v}=e,f=u.prototype,b=Zt(f,"cloneNode"),S=Zt(f,"remove"),$=Zt(f,"nextSibling"),A=Zt(f,"childNodes"),C=Zt(f,"parentNode");if(typeof r=="function"){const I=n.createElement("template");I.content&&I.content.ownerDocument&&(n=I.content.ownerDocument)}let T,M="";const{implementation:R,createNodeIterator:B,createDocumentFragment:ee,getElementsByTagName:me}=n,{importNode:Ke}=i;let Z=fa();t.isSupported=typeof Sc=="function"&&typeof C=="function"&&R&&R.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:zt,ERB_EXPR:kt,TMPLIT_EXPR:Je,DATA_ATTR:Ri,ARIA_ATTR:Ni,IS_SCRIPT_OR_DATA:Di,ATTR_WHITESPACE:Sn,CUSTOM_ELEMENT:Oi}=ha;let{IS_ALLOWED_URI:xn}=ha,Q=null;const $n=F({},[...ca,...ls,...cs,...us,...ua]);let Y=null;const An=F({},[...da,...ds,...pa,...Wn]);let H=Object.seal(Bs(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}})),et=null,jt=null;const ze=Object.seal(Bs(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let En=!0,x=!0,_=!1,D=!0,O=!1,V=!0,z=!1,ae=!1,je=!1,St=!1,Cn=!1,Tn=!1,Qo=!0,Yo=!1;const Pu="user-content-";let Bi=!0,Ht=!1,xt={},xe=null;const Fi=F({},["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 Xo=null;const Zo=F({},["audio","video","img","source","image","track"]);let Ui=null;const Jo=F({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),_n="http://www.w3.org/1998/Math/MathML",Mn="http://www.w3.org/2000/svg",Re="http://www.w3.org/1999/xhtml";let $t=Re,Wi=!1,Ki=null;const Lu=F({},[_n,Mn,Re],rs);let Pn=F({},["mi","mo","mn","ms","mtext"]),Ln=F({},["annotation-xml"]);const Iu=F({},["title","style","font","a","script"]);let qt=null;const Ru=["application/xhtml+xml","text/html"],Nu="text/html";let J=null,At=null;const Du=n.createElement("form"),er=function(w){return w instanceof RegExp||w instanceof Function},zi=function(){let w=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(At&&At===w)){if((!w||typeof w!="object")&&(w={}),w=Ce(w),qt=Ru.indexOf(w.PARSER_MEDIA_TYPE)===-1?Nu:w.PARSER_MEDIA_TYPE,J=qt==="application/xhtml+xml"?rs:Xn,Q=ye(w,"ALLOWED_TAGS")?F({},w.ALLOWED_TAGS,J):$n,Y=ye(w,"ALLOWED_ATTR")?F({},w.ALLOWED_ATTR,J):An,Ki=ye(w,"ALLOWED_NAMESPACES")?F({},w.ALLOWED_NAMESPACES,rs):Lu,Ui=ye(w,"ADD_URI_SAFE_ATTR")?F(Ce(Jo),w.ADD_URI_SAFE_ATTR,J):Jo,Xo=ye(w,"ADD_DATA_URI_TAGS")?F(Ce(Zo),w.ADD_DATA_URI_TAGS,J):Zo,xe=ye(w,"FORBID_CONTENTS")?F({},w.FORBID_CONTENTS,J):Fi,et=ye(w,"FORBID_TAGS")?F({},w.FORBID_TAGS,J):Ce({}),jt=ye(w,"FORBID_ATTR")?F({},w.FORBID_ATTR,J):Ce({}),xt=ye(w,"USE_PROFILES")?w.USE_PROFILES:!1,En=w.ALLOW_ARIA_ATTR!==!1,x=w.ALLOW_DATA_ATTR!==!1,_=w.ALLOW_UNKNOWN_PROTOCOLS||!1,D=w.ALLOW_SELF_CLOSE_IN_ATTR!==!1,O=w.SAFE_FOR_TEMPLATES||!1,V=w.SAFE_FOR_XML!==!1,z=w.WHOLE_DOCUMENT||!1,St=w.RETURN_DOM||!1,Cn=w.RETURN_DOM_FRAGMENT||!1,Tn=w.RETURN_TRUSTED_TYPE||!1,je=w.FORCE_BODY||!1,Qo=w.SANITIZE_DOM!==!1,Yo=w.SANITIZE_NAMED_PROPS||!1,Bi=w.KEEP_CONTENT!==!1,Ht=w.IN_PLACE||!1,xn=w.ALLOWED_URI_REGEXP||xc,$t=w.NAMESPACE||Re,Pn=w.MATHML_TEXT_INTEGRATION_POINTS||Pn,Ln=w.HTML_INTEGRATION_POINTS||Ln,H=w.CUSTOM_ELEMENT_HANDLING||{},w.CUSTOM_ELEMENT_HANDLING&&er(w.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(H.tagNameCheck=w.CUSTOM_ELEMENT_HANDLING.tagNameCheck),w.CUSTOM_ELEMENT_HANDLING&&er(w.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(H.attributeNameCheck=w.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),w.CUSTOM_ELEMENT_HANDLING&&typeof w.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(H.allowCustomizedBuiltInElements=w.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),O&&(x=!1),Cn&&(St=!0),xt&&(Q=F({},ua),Y=[],xt.html===!0&&(F(Q,ca),F(Y,da)),xt.svg===!0&&(F(Q,ls),F(Y,ds),F(Y,Wn)),xt.svgFilters===!0&&(F(Q,cs),F(Y,ds),F(Y,Wn)),xt.mathMl===!0&&(F(Q,us),F(Y,pa),F(Y,Wn))),w.ADD_TAGS&&(typeof w.ADD_TAGS=="function"?ze.tagCheck=w.ADD_TAGS:(Q===$n&&(Q=Ce(Q)),F(Q,w.ADD_TAGS,J))),w.ADD_ATTR&&(typeof w.ADD_ATTR=="function"?ze.attributeCheck=w.ADD_ATTR:(Y===An&&(Y=Ce(Y)),F(Y,w.ADD_ATTR,J))),w.ADD_URI_SAFE_ATTR&&F(Ui,w.ADD_URI_SAFE_ATTR,J),w.FORBID_CONTENTS&&(xe===Fi&&(xe=Ce(xe)),F(xe,w.FORBID_CONTENTS,J)),w.ADD_FORBID_CONTENTS&&(xe===Fi&&(xe=Ce(xe)),F(xe,w.ADD_FORBID_CONTENTS,J)),Bi&&(Q["#text"]=!0),z&&F(Q,["html","head","body"]),Q.table&&(F(Q,["tbody"]),delete et.tbody),w.TRUSTED_TYPES_POLICY){if(typeof w.TRUSTED_TYPES_POLICY.createHTML!="function")throw Xt('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof w.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Xt('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');T=w.TRUSTED_TYPES_POLICY,M=T.createHTML("")}else T===void 0&&(T=Vf(v,s)),T!==null&&typeof M=="string"&&(M=T.createHTML(""));pe&&pe(w),At=w}},tr=F({},[...ls,...cs,...Df]),nr=F({},[...us,...Of]),Ou=function(w){let E=C(w);(!E||!E.tagName)&&(E={namespaceURI:$t,tagName:"template"});const L=Xn(w.tagName),j=Xn(E.tagName);return Ki[w.namespaceURI]?w.namespaceURI===Mn?E.namespaceURI===Re?L==="svg":E.namespaceURI===_n?L==="svg"&&(j==="annotation-xml"||Pn[j]):!!tr[L]:w.namespaceURI===_n?E.namespaceURI===Re?L==="math":E.namespaceURI===Mn?L==="math"&&Ln[j]:!!nr[L]:w.namespaceURI===Re?E.namespaceURI===Mn&&!Ln[j]||E.namespaceURI===_n&&!Pn[j]?!1:!nr[L]&&(Iu[L]||!tr[L]):!!(qt==="application/xhtml+xml"&&Ki[w.namespaceURI]):!1},$e=function(w){Qt(t.removed,{element:w});try{C(w).removeChild(w)}catch{S(w)}},tt=function(w,E){try{Qt(t.removed,{attribute:E.getAttributeNode(w),from:E})}catch{Qt(t.removed,{attribute:null,from:E})}if(E.removeAttribute(w),w==="is")if(St||Cn)try{$e(E)}catch{}else try{E.setAttribute(w,"")}catch{}},ir=function(w){let E=null,L=null;if(je)w="<remove></remove>"+w;else{const X=as(w,/^[\r\n\t ]+/);L=X&&X[0]}qt==="application/xhtml+xml"&&$t===Re&&(w='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+w+"</body></html>");const j=T?T.createHTML(w):w;if($t===Re)try{E=new h().parseFromString(j,qt)}catch{}if(!E||!E.documentElement){E=R.createDocument($t,"template",null);try{E.documentElement.innerHTML=Wi?M:j}catch{}}const se=E.body||E.documentElement;return w&&L&&se.insertBefore(n.createTextNode(L),se.childNodes[0]||null),$t===Re?me.call(E,z?"html":"body")[0]:z?E.documentElement:se},sr=function(w){return B.call(w.ownerDocument||w,w,c.SHOW_ELEMENT|c.SHOW_COMMENT|c.SHOW_TEXT|c.SHOW_PROCESSING_INSTRUCTION|c.SHOW_CDATA_SECTION,null)},ji=function(w){return w instanceof d&&(typeof w.nodeName!="string"||typeof w.textContent!="string"||typeof w.removeChild!="function"||!(w.attributes instanceof l)||typeof w.removeAttribute!="function"||typeof w.setAttribute!="function"||typeof w.namespaceURI!="string"||typeof w.insertBefore!="function"||typeof w.hasChildNodes!="function")},or=function(w){return typeof a=="function"&&w instanceof a};function Ne(I,w,E){Un(I,L=>{L.call(t,w,E,At)})}const rr=function(w){let E=null;if(Ne(Z.beforeSanitizeElements,w,null),ji(w))return $e(w),!0;const L=J(w.nodeName);if(Ne(Z.uponSanitizeElement,w,{tagName:L,allowedTags:Q}),V&&w.hasChildNodes()&&!or(w.firstElementChild)&&le(/<[/\w!]/g,w.innerHTML)&&le(/<[/\w!]/g,w.textContent)||w.nodeType===Jt.progressingInstruction||V&&w.nodeType===Jt.comment&&le(/<[/\w]/g,w.data))return $e(w),!0;if(!(ze.tagCheck instanceof Function&&ze.tagCheck(L))&&(!Q[L]||et[L])){if(!et[L]&&lr(L)&&(H.tagNameCheck instanceof RegExp&&le(H.tagNameCheck,L)||H.tagNameCheck instanceof Function&&H.tagNameCheck(L)))return!1;if(Bi&&!xe[L]){const j=C(w)||w.parentNode,se=A(w)||w.childNodes;if(se&&j){const X=se.length;for(let fe=X-1;fe>=0;--fe){const De=b(se[fe],!0);De.__removalCount=(w.__removalCount||0)+1,j.insertBefore(De,$(w))}}}return $e(w),!0}return w instanceof u&&!Ou(w)||(L==="noscript"||L==="noembed"||L==="noframes")&&le(/<\/no(script|embed|frames)/i,w.innerHTML)?($e(w),!0):(O&&w.nodeType===Jt.text&&(E=w.textContent,Un([zt,kt,Je],j=>{E=Yt(E,j," ")}),w.textContent!==E&&(Qt(t.removed,{element:w.cloneNode()}),w.textContent=E)),Ne(Z.afterSanitizeElements,w,null),!1)},ar=function(w,E,L){if(Qo&&(E==="id"||E==="name")&&(L in n||L in Du))return!1;if(!(x&&!jt[E]&&le(Ri,E))){if(!(En&&le(Ni,E))){if(!(ze.attributeCheck instanceof Function&&ze.attributeCheck(E,w))){if(!Y[E]||jt[E]){if(!(lr(w)&&(H.tagNameCheck instanceof RegExp&&le(H.tagNameCheck,w)||H.tagNameCheck instanceof Function&&H.tagNameCheck(w))&&(H.attributeNameCheck instanceof RegExp&&le(H.attributeNameCheck,E)||H.attributeNameCheck instanceof Function&&H.attributeNameCheck(E,w))||E==="is"&&H.allowCustomizedBuiltInElements&&(H.tagNameCheck instanceof RegExp&&le(H.tagNameCheck,L)||H.tagNameCheck instanceof Function&&H.tagNameCheck(L))))return!1}else if(!Ui[E]){if(!le(xn,Yt(L,Sn,""))){if(!((E==="src"||E==="xlink:href"||E==="href")&&w!=="script"&&Lf(L,"data:")===0&&Xo[w])){if(!(_&&!le(Di,Yt(L,Sn,"")))){if(L)return!1}}}}}}}return!0},lr=function(w){return w!=="annotation-xml"&&as(w,Oi)},cr=function(w){Ne(Z.beforeSanitizeAttributes,w,null);const{attributes:E}=w;if(!E||ji(w))return;const L={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Y,forceKeepAttr:void 0};let j=E.length;for(;j--;){const se=E[j],{name:X,namespaceURI:fe,value:De}=se,Et=J(X),Hi=De;let ne=X==="value"?Hi:If(Hi);if(L.attrName=Et,L.attrValue=ne,L.keepAttr=!0,L.forceKeepAttr=void 0,Ne(Z.uponSanitizeAttribute,w,L),ne=L.attrValue,Yo&&(Et==="id"||Et==="name")&&(tt(X,w),ne=Pu+ne),V&&le(/((--!?|])>)|<\/(style|title|textarea)/i,ne)){tt(X,w);continue}if(Et==="attributename"&&as(ne,"href")){tt(X,w);continue}if(L.forceKeepAttr)continue;if(!L.keepAttr){tt(X,w);continue}if(!D&&le(/\/>/i,ne)){tt(X,w);continue}O&&Un([zt,kt,Je],dr=>{ne=Yt(ne,dr," ")});const ur=J(w.nodeName);if(!ar(ur,Et,ne)){tt(X,w);continue}if(T&&typeof v=="object"&&typeof v.getAttributeType=="function"&&!fe)switch(v.getAttributeType(ur,Et)){case"TrustedHTML":{ne=T.createHTML(ne);break}case"TrustedScriptURL":{ne=T.createScriptURL(ne);break}}if(ne!==Hi)try{fe?w.setAttributeNS(fe,X,ne):w.setAttribute(X,ne),ji(w)?$e(w):la(t.removed)}catch{tt(X,w)}}Ne(Z.afterSanitizeAttributes,w,null)},Bu=function I(w){let E=null;const L=sr(w);for(Ne(Z.beforeSanitizeShadowDOM,w,null);E=L.nextNode();)Ne(Z.uponSanitizeShadowNode,E,null),rr(E),cr(E),E.content instanceof o&&I(E.content);Ne(Z.afterSanitizeShadowDOM,w,null)};return t.sanitize=function(I){let w=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},E=null,L=null,j=null,se=null;if(Wi=!I,Wi&&(I="<!-->"),typeof I!="string"&&!or(I))if(typeof I.toString=="function"){if(I=I.toString(),typeof I!="string")throw Xt("dirty is not a string, aborting")}else throw Xt("toString is not a function");if(!t.isSupported)return I;if(ae||zi(w),t.removed=[],typeof I=="string"&&(Ht=!1),Ht){if(I.nodeName){const De=J(I.nodeName);if(!Q[De]||et[De])throw Xt("root node is forbidden and cannot be sanitized in-place")}}else if(I instanceof a)E=ir("<!---->"),L=E.ownerDocument.importNode(I,!0),L.nodeType===Jt.element&&L.nodeName==="BODY"||L.nodeName==="HTML"?E=L:E.appendChild(L);else{if(!St&&!O&&!z&&I.indexOf("<")===-1)return T&&Tn?T.createHTML(I):I;if(E=ir(I),!E)return St?null:Tn?M:""}E&&je&&$e(E.firstChild);const X=sr(Ht?I:E);for(;j=X.nextNode();)rr(j),cr(j),j.content instanceof o&&Bu(j.content);if(Ht)return I;if(St){if(Cn)for(se=ee.call(E.ownerDocument);E.firstChild;)se.appendChild(E.firstChild);else se=E;return(Y.shadowroot||Y.shadowrootmode)&&(se=Ke.call(i,se,!0)),se}let fe=z?E.outerHTML:E.innerHTML;return z&&Q["!doctype"]&&E.ownerDocument&&E.ownerDocument.doctype&&E.ownerDocument.doctype.name&&le($c,E.ownerDocument.doctype.name)&&(fe="<!DOCTYPE "+E.ownerDocument.doctype.name+`>
2074
- `+fe),O&&Un([zt,kt,Je],De=>{fe=Yt(fe,De," ")}),T&&Tn?T.createHTML(fe):fe},t.setConfig=function(){let I=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};zi(I),ae=!0},t.clearConfig=function(){At=null,ae=!1},t.isValidAttribute=function(I,w,E){At||zi({});const L=J(I),j=J(w);return ar(L,j,E)},t.addHook=function(I,w){typeof w=="function"&&Qt(Z[I],w)},t.removeHook=function(I,w){if(w!==void 0){const E=Mf(Z[I],w);return E===-1?void 0:Pf(Z[I],E,1)[0]}return la(Z[I])},t.removeHooks=function(I){Z[I]=[]},t.removeAllHooks=function(){Z=fa()},t}var Ws=Ac();function Po(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var bt=Po();function Ec(e){bt=e}var dn={exec:()=>null};function W(e,t=""){let n=typeof e=="string"?e:e.source,i={replace:(s,o)=>{let r=typeof o=="string"?o:o.source;return r=r.replace(ue.caret,"$1"),n=n.replace(s,r),i},getRegex:()=>new RegExp(n,t)};return i}var Gf=(()=>{try{return!!new RegExp("(?<=1)(?<!1)")}catch{return!1}})(),ue={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")},Qf=/^(?:[ \t]*(?:\n|$))+/,Yf=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,Xf=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,wn=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,Zf=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,Lo=/(?:[*+-]|\d{1,9}[.)])/,Cc=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Tc=W(Cc).replace(/bull/g,Lo).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(),Jf=W(Cc).replace(/bull/g,Lo).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(),Io=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,eg=/^[^\n]+/,Ro=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,tg=W(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",Ro).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),ng=W(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,Lo).getRegex(),Mi="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",No=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,ig=W("^ {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",No).replace("tag",Mi).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),_c=W(Io).replace("hr",wn).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",Mi).getRegex(),sg=W(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",_c).getRegex(),Do={blockquote:sg,code:Yf,def:tg,fences:Xf,heading:Zf,hr:wn,html:ig,lheading:Tc,list:ng,newline:Qf,paragraph:_c,table:dn,text:eg},ga=W("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",wn).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",Mi).getRegex(),og={...Do,lheading:Jf,table:ga,paragraph:W(Io).replace("hr",wn).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ga).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",Mi).getRegex()},rg={...Do,html:W(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",No).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:dn,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:W(Io).replace("hr",wn).replace("heading",` *#{1,6} *[^
2075
- ]`).replace("lheading",Tc).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},ag=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,lg=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,Mc=/^( {2,}|\\)\n(?!\s*$)/,cg=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,Pi=/[\p{P}\p{S}]/u,Oo=/[\s\p{P}\p{S}]/u,Pc=/[^\s\p{P}\p{S}]/u,ug=W(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,Oo).getRegex(),Lc=/(?!~)[\p{P}\p{S}]/u,dg=/(?!~)[\s\p{P}\p{S}]/u,pg=/(?:[^\s\p{P}\p{S}]|~)/u,hg=W(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",Gf?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Ic=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,fg=W(Ic,"u").replace(/punct/g,Pi).getRegex(),gg=W(Ic,"u").replace(/punct/g,Lc).getRegex(),Rc="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",mg=W(Rc,"gu").replace(/notPunctSpace/g,Pc).replace(/punctSpace/g,Oo).replace(/punct/g,Pi).getRegex(),yg=W(Rc,"gu").replace(/notPunctSpace/g,pg).replace(/punctSpace/g,dg).replace(/punct/g,Lc).getRegex(),vg=W("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,Pc).replace(/punctSpace/g,Oo).replace(/punct/g,Pi).getRegex(),bg=W(/\\(punct)/,"gu").replace(/punct/g,Pi).getRegex(),wg=W(/^<(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(),kg=W(No).replace("(?:-->|$)","-->").getRegex(),Sg=W("^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",kg).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),pi=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+[^`]*?`+(?!`)|[^\[\]\\`])*?/,xg=W(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",pi).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),Nc=W(/^!?\[(label)\]\[(ref)\]/).replace("label",pi).replace("ref",Ro).getRegex(),Dc=W(/^!?\[(ref)\](?:\[\])?/).replace("ref",Ro).getRegex(),$g=W("reflink|nolink(?!\\()","g").replace("reflink",Nc).replace("nolink",Dc).getRegex(),ma=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Bo={_backpedal:dn,anyPunctuation:bg,autolink:wg,blockSkip:hg,br:Mc,code:lg,del:dn,emStrongLDelim:fg,emStrongRDelimAst:mg,emStrongRDelimUnd:vg,escape:ag,link:xg,nolink:Dc,punctuation:ug,reflink:Nc,reflinkSearch:$g,tag:Sg,text:cg,url:dn},Ag={...Bo,link:W(/^!?\[(label)\]\((.*?)\)/).replace("label",pi).getRegex(),reflink:W(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",pi).getRegex()},Ks={...Bo,emStrongRDelimAst:yg,emStrongLDelim:gg,url:W(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",ma).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:W(/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",ma).getRegex()},Eg={...Ks,br:W(Mc).replace("{2,}","*").getRegex(),text:W(Ks.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},Kn={normal:Do,gfm:og,pedantic:rg},en={normal:Bo,gfm:Ks,breaks:Eg,pedantic:Ag},Cg={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},ya=e=>Cg[e];function Be(e,t){if(t){if(ue.escapeTest.test(e))return e.replace(ue.escapeReplace,ya)}else if(ue.escapeTestNoEncode.test(e))return e.replace(ue.escapeReplaceNoEncode,ya);return e}function va(e){try{e=encodeURI(e).replace(ue.percentDecode,"%")}catch{return null}return e}function ba(e,t){var o;let n=e.replace(ue.findPipe,(r,a,u)=>{let c=!1,l=a;for(;--l>=0&&u[l]==="\\";)c=!c;return c?"|":" |"}),i=n.split(ue.splitPipe),s=0;if(i[0].trim()||i.shift(),i.length>0&&!((o=i.at(-1))!=null&&o.trim())&&i.pop(),t)if(i.length>t)i.splice(t);else for(;i.length<t;)i.push("");for(;s<i.length;s++)i[s]=i[s].trim().replace(ue.slashPipe,"|");return i}function tn(e,t,n){let i=e.length;if(i===0)return"";let s=0;for(;s<i&&e.charAt(i-s-1)===t;)s++;return e.slice(0,i-s)}function Tg(e,t){if(e.indexOf(t[1])===-1)return-1;let n=0;for(let i=0;i<e.length;i++)if(e[i]==="\\")i++;else if(e[i]===t[0])n++;else if(e[i]===t[1]&&(n--,n<0))return i;return n>0?-2:-1}function wa(e,t,n,i,s){let o=t.href,r=t.title||null,a=e[1].replace(s.other.outputLinkReplace,"$1");i.state.inLink=!0;let u={type:e[0].charAt(0)==="!"?"image":"link",raw:n,href:o,title:r,text:a,tokens:i.inlineTokens(a)};return i.state.inLink=!1,u}function _g(e,t,n){let i=e.match(n.other.indentCodeCompensation);if(i===null)return t;let s=i[1];return t.split(`
2076
- `).map(o=>{let r=o.match(n.other.beginningSpace);if(r===null)return o;let[a]=r;return a.length>=s.length?o.slice(s.length):o}).join(`
2077
- `)}var hi=class{constructor(e){U(this,"options");U(this,"rules");U(this,"lexer");this.options=e||bt}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:tn(n,`
2078
- `)}}}fences(e){let t=this.rules.block.fences.exec(e);if(t){let n=t[0],i=_g(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:i}}}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 i=tn(n,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(n=i.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:tn(t[0],`
2079
- `)}}blockquote(e){let t=this.rules.block.blockquote.exec(e);if(t){let n=tn(t[0],`
2080
- `).split(`
2081
- `),i="",s="",o=[];for(;n.length>0;){let r=!1,a=[],u;for(u=0;u<n.length;u++)if(this.rules.other.blockquoteStart.test(n[u]))a.push(n[u]),r=!0;else if(!r)a.push(n[u]);else break;n=n.slice(u);let c=a.join(`
2082
- `),l=c.replace(this.rules.other.blockquoteSetextReplace,`
2083
- $1`).replace(this.rules.other.blockquoteSetextReplace2,"");i=i?`${i}
2084
- ${c}`:c,s=s?`${s}
2085
- ${l}`:l;let d=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(l,o,!0),this.lexer.state.top=d,n.length===0)break;let h=o.at(-1);if((h==null?void 0:h.type)==="code")break;if((h==null?void 0:h.type)==="blockquote"){let v=h,f=v.raw+`
2086
- `+n.join(`
2087
- `),b=this.blockquote(f);o[o.length-1]=b,i=i.substring(0,i.length-v.raw.length)+b.raw,s=s.substring(0,s.length-v.text.length)+b.text;break}else if((h==null?void 0:h.type)==="list"){let v=h,f=v.raw+`
2088
- `+n.join(`
2089
- `),b=this.list(f);o[o.length-1]=b,i=i.substring(0,i.length-h.raw.length)+b.raw,s=s.substring(0,s.length-v.raw.length)+b.raw,n=f.substring(o.at(-1).raw.length).split(`
2090
- `);continue}}return{type:"blockquote",raw:i,tokens:o,text:s}}}list(e){var n,i;let t=this.rules.block.list.exec(e);if(t){let s=t[1].trim(),o=s.length>1,r={type:"list",raw:"",ordered:o,start:o?+s.slice(0,-1):"",loose:!1,items:[]};s=o?`\\d{1,9}\\${s.slice(-1)}`:`\\${s}`,this.options.pedantic&&(s=o?s:"[*+-]");let a=this.rules.other.listItemRegex(s),u=!1;for(;e;){let l=!1,d="",h="";if(!(t=a.exec(e))||this.rules.block.hr.test(e))break;d=t[0],e=e.substring(d.length);let v=t[2].split(`
2091
- `,1)[0].replace(this.rules.other.listReplaceTabs,$=>" ".repeat(3*$.length)),f=e.split(`
2092
- `,1)[0],b=!v.trim(),S=0;if(this.options.pedantic?(S=2,h=v.trimStart()):b?S=t[1].length+1:(S=t[2].search(this.rules.other.nonSpaceChar),S=S>4?1:S,h=v.slice(S),S+=t[1].length),b&&this.rules.other.blankLine.test(f)&&(d+=f+`
2093
- `,e=e.substring(f.length+1),l=!0),!l){let $=this.rules.other.nextBulletRegex(S),A=this.rules.other.hrRegex(S),C=this.rules.other.fencesBeginRegex(S),T=this.rules.other.headingBeginRegex(S),M=this.rules.other.htmlBeginRegex(S);for(;e;){let R=e.split(`
2094
- `,1)[0],B;if(f=R,this.options.pedantic?(f=f.replace(this.rules.other.listReplaceNesting," "),B=f):B=f.replace(this.rules.other.tabCharGlobal," "),C.test(f)||T.test(f)||M.test(f)||$.test(f)||A.test(f))break;if(B.search(this.rules.other.nonSpaceChar)>=S||!f.trim())h+=`
2095
- `+B.slice(S);else{if(b||v.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4||C.test(v)||T.test(v)||A.test(v))break;h+=`
2096
- `+f}!b&&!f.trim()&&(b=!0),d+=R+`
2097
- `,e=e.substring(R.length+1),v=B.slice(S)}}r.loose||(u?r.loose=!0:this.rules.other.doubleBlankLine.test(d)&&(u=!0)),r.items.push({type:"list_item",raw:d,task:!!this.options.gfm&&this.rules.other.listIsTask.test(h),loose:!1,text:h,tokens:[]}),r.raw+=d}let c=r.items.at(-1);if(c)c.raw=c.raw.trimEnd(),c.text=c.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let l of r.items){if(this.lexer.state.top=!1,l.tokens=this.lexer.blockTokens(l.text,[]),l.task){if(l.text=l.text.replace(this.rules.other.listReplaceTask,""),((n=l.tokens[0])==null?void 0:n.type)==="text"||((i=l.tokens[0])==null?void 0:i.type)==="paragraph"){l.tokens[0].raw=l.tokens[0].raw.replace(this.rules.other.listReplaceTask,""),l.tokens[0].text=l.tokens[0].text.replace(this.rules.other.listReplaceTask,"");for(let h=this.lexer.inlineQueue.length-1;h>=0;h--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[h].src)){this.lexer.inlineQueue[h].src=this.lexer.inlineQueue[h].src.replace(this.rules.other.listReplaceTask,"");break}}let d=this.rules.other.listTaskCheckbox.exec(l.raw);if(d){let h={type:"checkbox",raw:d[0]+" ",checked:d[0]!=="[ ]"};l.checked=h.checked,r.loose?l.tokens[0]&&["paragraph","text"].includes(l.tokens[0].type)&&"tokens"in l.tokens[0]&&l.tokens[0].tokens?(l.tokens[0].raw=h.raw+l.tokens[0].raw,l.tokens[0].text=h.raw+l.tokens[0].text,l.tokens[0].tokens.unshift(h)):l.tokens.unshift({type:"paragraph",raw:h.raw,text:h.raw,tokens:[h]}):l.tokens.unshift(h)}}if(!r.loose){let d=l.tokens.filter(v=>v.type==="space"),h=d.length>0&&d.some(v=>this.rules.other.anyLine.test(v.raw));r.loose=h}}if(r.loose)for(let l of r.items){l.loose=!0;for(let d of l.tokens)d.type==="text"&&(d.type="paragraph")}return r}}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," "),i=t[2]?t[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",s=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:i,title:s}}}table(e){var r;let t=this.rules.block.table.exec(e);if(!t||!this.rules.other.tableDelimiter.test(t[2]))return;let n=ba(t[1]),i=t[2].replace(this.rules.other.tableAlignChars,"").split("|"),s=(r=t[3])!=null&&r.trim()?t[3].replace(this.rules.other.tableRowBlankLine,"").split(`
2098
- `):[],o={type:"table",raw:t[0],header:[],align:[],rows:[]};if(n.length===i.length){for(let a of i)this.rules.other.tableAlignRight.test(a)?o.align.push("right"):this.rules.other.tableAlignCenter.test(a)?o.align.push("center"):this.rules.other.tableAlignLeft.test(a)?o.align.push("left"):o.align.push(null);for(let a=0;a<n.length;a++)o.header.push({text:n[a],tokens:this.lexer.inline(n[a]),header:!0,align:o.align[a]});for(let a of s)o.rows.push(ba(a,o.header.length).map((u,c)=>({text:u,tokens:this.lexer.inline(u),header:!1,align:o.align[c]})));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)===`
2099
- `?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=tn(n.slice(0,-1),"\\");if((n.length-o.length)%2===0)return}else{let o=Tg(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 i=t[2],s="";if(this.options.pedantic){let o=this.rules.other.pedanticHrefTitle.exec(i);o&&(i=o[1],s=o[3])}else s=t[3]?t[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(n)?i=i.slice(1):i=i.slice(1,-1)),wa(t,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:s&&s.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 i=(n[2]||n[1]).replace(this.rules.other.multipleSpaceGlobal," "),s=t[i.toLowerCase()];if(!s){let o=n[0].charAt(0);return{type:"text",raw:o,text:o}}return wa(n,s,n[0],this.lexer,this.rules)}}emStrong(e,t,n=""){let i=this.rules.inline.emStrongLDelim.exec(e);if(!(!i||i[3]&&n.match(this.rules.other.unicodeAlphaNumeric))&&(!(i[1]||i[2])||!n||this.rules.inline.punctuation.exec(n))){let s=[...i[0]].length-1,o,r,a=s,u=0,c=i[0][0]==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(c.lastIndex=0,t=t.slice(-1*e.length+s);(i=c.exec(t))!=null;){if(o=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!o)continue;if(r=[...o].length,i[3]||i[4]){a+=r;continue}else if((i[5]||i[6])&&s%3&&!((s+r)%3)){u+=r;continue}if(a-=r,a>0)continue;r=Math.min(r,r+a+u);let l=[...i[0]][0].length,d=e.slice(0,s+i.index+l+r);if(Math.min(s,r)%2){let v=d.slice(1,-1);return{type:"em",raw:d,text:v,tokens:this.lexer.inlineTokens(v)}}let h=d.slice(2,-2);return{type:"strong",raw:d,text:h,tokens:this.lexer.inlineTokens(h)}}}}codespan(e){let t=this.rules.inline.code.exec(e);if(t){let n=t[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(n),s=this.rules.other.startingSpaceChar.test(n)&&this.rules.other.endingSpaceChar.test(n);return i&&s&&(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,i;return t[2]==="@"?(n=t[1],i="mailto:"+n):(n=t[1],i=n),{type:"link",raw:t[0],text:n,href:i,tokens:[{type:"text",raw:n,text:n}]}}}url(e){var n;let t;if(t=this.rules.inline.url.exec(e)){let i,s;if(t[2]==="@")i=t[0],s="mailto:"+i;else{let o;do o=t[0],t[0]=((n=this.rules.inline._backpedal.exec(t[0]))==null?void 0:n[0])??"";while(o!==t[0]);i=t[0],t[1]==="www."?s="http://"+t[0]:s=t[0]}return{type:"link",raw:t[0],text:i,href:s,tokens:[{type:"text",raw:i,text:i}]}}}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}}}},ve=class zs{constructor(t){U(this,"tokens");U(this,"options");U(this,"state");U(this,"inlineQueue");U(this,"tokenizer");this.tokens=[],this.tokens.links=Object.create(null),this.options=t||bt,this.options.tokenizer=this.options.tokenizer||new hi,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:ue,block:Kn.normal,inline:en.normal};this.options.pedantic?(n.block=Kn.pedantic,n.inline=en.pedantic):this.options.gfm&&(n.block=Kn.gfm,this.options.breaks?n.inline=en.breaks:n.inline=en.gfm),this.tokenizer.rules=n}static get rules(){return{block:Kn,inline:en}}static lex(t,n){return new zs(n).lex(t)}static lexInline(t,n){return new zs(n).inlineTokens(t)}lex(t){t=t.replace(ue.carriageReturn,`
2100
- `),this.blockTokens(t,this.tokens);for(let n=0;n<this.inlineQueue.length;n++){let i=this.inlineQueue[n];this.inlineTokens(i.src,i.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,n=[],i=!1){var s,o,r;for(this.options.pedantic&&(t=t.replace(ue.tabCharGlobal," ").replace(ue.spaceLine,""));t;){let a;if((o=(s=this.options.extensions)==null?void 0:s.block)!=null&&o.some(c=>(a=c.call({lexer:this},t,n))?(t=t.substring(a.raw.length),n.push(a),!0):!1))continue;if(a=this.tokenizer.space(t)){t=t.substring(a.raw.length);let c=n.at(-1);a.raw.length===1&&c!==void 0?c.raw+=`
2101
- `:n.push(a);continue}if(a=this.tokenizer.code(t)){t=t.substring(a.raw.length);let c=n.at(-1);(c==null?void 0:c.type)==="paragraph"||(c==null?void 0:c.type)==="text"?(c.raw+=(c.raw.endsWith(`
2102
- `)?"":`
2103
- `)+a.raw,c.text+=`
2104
- `+a.text,this.inlineQueue.at(-1).src=c.text):n.push(a);continue}if(a=this.tokenizer.fences(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.heading(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.hr(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.blockquote(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.list(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.html(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.def(t)){t=t.substring(a.raw.length);let c=n.at(-1);(c==null?void 0:c.type)==="paragraph"||(c==null?void 0:c.type)==="text"?(c.raw+=(c.raw.endsWith(`
2105
- `)?"":`
2106
- `)+a.raw,c.text+=`
2107
- `+a.raw,this.inlineQueue.at(-1).src=c.text):this.tokens.links[a.tag]||(this.tokens.links[a.tag]={href:a.href,title:a.title},n.push(a));continue}if(a=this.tokenizer.table(t)){t=t.substring(a.raw.length),n.push(a);continue}if(a=this.tokenizer.lheading(t)){t=t.substring(a.raw.length),n.push(a);continue}let u=t;if((r=this.options.extensions)!=null&&r.startBlock){let c=1/0,l=t.slice(1),d;this.options.extensions.startBlock.forEach(h=>{d=h.call({lexer:this},l),typeof d=="number"&&d>=0&&(c=Math.min(c,d))}),c<1/0&&c>=0&&(u=t.substring(0,c+1))}if(this.state.top&&(a=this.tokenizer.paragraph(u))){let c=n.at(-1);i&&(c==null?void 0:c.type)==="paragraph"?(c.raw+=(c.raw.endsWith(`
2108
- `)?"":`
2109
- `)+a.raw,c.text+=`
2110
- `+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):n.push(a),i=u.length!==t.length,t=t.substring(a.raw.length);continue}if(a=this.tokenizer.text(t)){t=t.substring(a.raw.length);let c=n.at(-1);(c==null?void 0:c.type)==="text"?(c.raw+=(c.raw.endsWith(`
2111
- `)?"":`
2112
- `)+a.raw,c.text+=`
2113
- `+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=c.text):n.push(a);continue}if(t){let c="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(c);break}else throw new Error(c)}}return this.state.top=!0,n}inline(t,n=[]){return this.inlineQueue.push({src:t,tokens:n}),n}inlineTokens(t,n=[]){var u,c,l,d,h;let i=t,s=null;if(this.tokens.links){let v=Object.keys(this.tokens.links);if(v.length>0)for(;(s=this.tokenizer.rules.inline.reflinkSearch.exec(i))!=null;)v.includes(s[0].slice(s[0].lastIndexOf("[")+1,-1))&&(i=i.slice(0,s.index)+"["+"a".repeat(s[0].length-2)+"]"+i.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(s=this.tokenizer.rules.inline.anyPunctuation.exec(i))!=null;)i=i.slice(0,s.index)+"++"+i.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);let o;for(;(s=this.tokenizer.rules.inline.blockSkip.exec(i))!=null;)o=s[2]?s[2].length:0,i=i.slice(0,s.index+o)+"["+"a".repeat(s[0].length-o-2)+"]"+i.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);i=((c=(u=this.options.hooks)==null?void 0:u.emStrongMask)==null?void 0:c.call({lexer:this},i))??i;let r=!1,a="";for(;t;){r||(a=""),r=!1;let v;if((d=(l=this.options.extensions)==null?void 0:l.inline)!=null&&d.some(b=>(v=b.call({lexer:this},t,n))?(t=t.substring(v.raw.length),n.push(v),!0):!1))continue;if(v=this.tokenizer.escape(t)){t=t.substring(v.raw.length),n.push(v);continue}if(v=this.tokenizer.tag(t)){t=t.substring(v.raw.length),n.push(v);continue}if(v=this.tokenizer.link(t)){t=t.substring(v.raw.length),n.push(v);continue}if(v=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(v.raw.length);let b=n.at(-1);v.type==="text"&&(b==null?void 0:b.type)==="text"?(b.raw+=v.raw,b.text+=v.text):n.push(v);continue}if(v=this.tokenizer.emStrong(t,i,a)){t=t.substring(v.raw.length),n.push(v);continue}if(v=this.tokenizer.codespan(t)){t=t.substring(v.raw.length),n.push(v);continue}if(v=this.tokenizer.br(t)){t=t.substring(v.raw.length),n.push(v);continue}if(v=this.tokenizer.del(t)){t=t.substring(v.raw.length),n.push(v);continue}if(v=this.tokenizer.autolink(t)){t=t.substring(v.raw.length),n.push(v);continue}if(!this.state.inLink&&(v=this.tokenizer.url(t))){t=t.substring(v.raw.length),n.push(v);continue}let f=t;if((h=this.options.extensions)!=null&&h.startInline){let b=1/0,S=t.slice(1),$;this.options.extensions.startInline.forEach(A=>{$=A.call({lexer:this},S),typeof $=="number"&&$>=0&&(b=Math.min(b,$))}),b<1/0&&b>=0&&(f=t.substring(0,b+1))}if(v=this.tokenizer.inlineText(f)){t=t.substring(v.raw.length),v.raw.slice(-1)!=="_"&&(a=v.raw.slice(-1)),r=!0;let b=n.at(-1);(b==null?void 0:b.type)==="text"?(b.raw+=v.raw,b.text+=v.text):n.push(v);continue}if(t){let b="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(b);break}else throw new Error(b)}}return n}},fi=class{constructor(e){U(this,"options");U(this,"parser");this.options=e||bt}space(e){return""}code({text:e,lang:t,escaped:n}){var o;let i=(o=(t||"").match(ue.notSpaceStart))==null?void 0:o[0],s=e.replace(ue.endingNewline,"")+`
2114
- `;return i?'<pre><code class="language-'+Be(i)+'">'+(n?s:Be(s,!0))+`</code></pre>
2115
- `:"<pre><code>"+(n?s:Be(s,!0))+`</code></pre>
2116
- `}blockquote({tokens:e}){return`<blockquote>
2117
- ${this.parser.parse(e)}</blockquote>
2118
- `}html({text:e}){return e}def(e){return""}heading({tokens:e,depth:t}){return`<h${t}>${this.parser.parseInline(e)}</h${t}>
2119
- `}hr(e){return`<hr>
2120
- `}list(e){let t=e.ordered,n=e.start,i="";for(let r=0;r<e.items.length;r++){let a=e.items[r];i+=this.listitem(a)}let s=t?"ol":"ul",o=t&&n!==1?' start="'+n+'"':"";return"<"+s+o+`>
2121
- `+i+"</"+s+`>
2122
- `}listitem(e){return`<li>${this.parser.parse(e.tokens)}</li>
2123
- `}checkbox({checked:e}){return"<input "+(e?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:e}){return`<p>${this.parser.parseInline(e)}</p>
2124
- `}table(e){let t="",n="";for(let s=0;s<e.header.length;s++)n+=this.tablecell(e.header[s]);t+=this.tablerow({text:n});let i="";for(let s=0;s<e.rows.length;s++){let o=e.rows[s];n="";for(let r=0;r<o.length;r++)n+=this.tablecell(o[r]);i+=this.tablerow({text:n})}return i&&(i=`<tbody>${i}</tbody>`),`<table>
2125
- <thead>
2126
- `+t+`</thead>
2127
- `+i+`</table>
2128
- `}tablerow({text:e}){return`<tr>
2129
- ${e}</tr>
2130
- `}tablecell(e){let t=this.parser.parseInline(e.tokens),n=e.header?"th":"td";return(e.align?`<${n} align="${e.align}">`:`<${n}>`)+t+`</${n}>
2131
- `}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>${Be(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 i=this.parser.parseInline(n),s=va(e);if(s===null)return i;e=s;let o='<a href="'+e+'"';return t&&(o+=' title="'+Be(t)+'"'),o+=">"+i+"</a>",o}image({href:e,title:t,text:n,tokens:i}){i&&(n=this.parser.parseInline(i,this.parser.textRenderer));let s=va(e);if(s===null)return Be(n);e=s;let o=`<img src="${e}" alt="${n}"`;return t&&(o+=` title="${Be(t)}"`),o+=">",o}text(e){return"tokens"in e&&e.tokens?this.parser.parseInline(e.tokens):"escaped"in e&&e.escaped?e.text:Be(e.text)}},Fo=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}},be=class js{constructor(t){U(this,"options");U(this,"renderer");U(this,"textRenderer");this.options=t||bt,this.options.renderer=this.options.renderer||new fi,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Fo}static parse(t,n){return new js(n).parse(t)}static parseInline(t,n){return new js(n).parseInline(t)}parse(t){var i,s;let n="";for(let o=0;o<t.length;o++){let r=t[o];if((s=(i=this.options.extensions)==null?void 0:i.renderers)!=null&&s[r.type]){let u=r,c=this.options.extensions.renderers[u.type].call({parser:this},u);if(c!==!1||!["space","hr","heading","code","table","blockquote","list","html","def","paragraph","text"].includes(u.type)){n+=c||"";continue}}let a=r;switch(a.type){case"space":{n+=this.renderer.space(a);break}case"hr":{n+=this.renderer.hr(a);break}case"heading":{n+=this.renderer.heading(a);break}case"code":{n+=this.renderer.code(a);break}case"table":{n+=this.renderer.table(a);break}case"blockquote":{n+=this.renderer.blockquote(a);break}case"list":{n+=this.renderer.list(a);break}case"checkbox":{n+=this.renderer.checkbox(a);break}case"html":{n+=this.renderer.html(a);break}case"def":{n+=this.renderer.def(a);break}case"paragraph":{n+=this.renderer.paragraph(a);break}case"text":{n+=this.renderer.text(a);break}default:{let u='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(u),"";throw new Error(u)}}}return n}parseInline(t,n=this.renderer){var s,o;let i="";for(let r=0;r<t.length;r++){let a=t[r];if((o=(s=this.options.extensions)==null?void 0:s.renderers)!=null&&o[a.type]){let c=this.options.extensions.renderers[a.type].call({parser:this},a);if(c!==!1||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(a.type)){i+=c||"";continue}}let u=a;switch(u.type){case"escape":{i+=n.text(u);break}case"html":{i+=n.html(u);break}case"link":{i+=n.link(u);break}case"image":{i+=n.image(u);break}case"checkbox":{i+=n.checkbox(u);break}case"strong":{i+=n.strong(u);break}case"em":{i+=n.em(u);break}case"codespan":{i+=n.codespan(u);break}case"br":{i+=n.br(u);break}case"del":{i+=n.del(u);break}case"text":{i+=n.text(u);break}default:{let c='Token with "'+u.type+'" type was not found.';if(this.options.silent)return console.error(c),"";throw new Error(c)}}}return i}},Gn,on=(Gn=class{constructor(e){U(this,"options");U(this,"block");this.options=e||bt}preprocess(e){return e}postprocess(e){return e}processAllTokens(e){return e}emStrongMask(e){return e}provideLexer(){return this.block?ve.lex:ve.lexInline}provideParser(){return this.block?be.parse:be.parseInline}},U(Gn,"passThroughHooks",new Set(["preprocess","postprocess","processAllTokens","emStrongMask"])),U(Gn,"passThroughHooksRespectAsync",new Set(["preprocess","postprocess","processAllTokens"])),Gn),Mg=class{constructor(...e){U(this,"defaults",Po());U(this,"options",this.setOptions);U(this,"parse",this.parseMarkdown(!0));U(this,"parseInline",this.parseMarkdown(!1));U(this,"Parser",be);U(this,"Renderer",fi);U(this,"TextRenderer",Fo);U(this,"Lexer",ve);U(this,"Tokenizer",hi);U(this,"Hooks",on);this.use(...e)}walkTokens(e,t){var i,s;let n=[];for(let o of e)switch(n=n.concat(t.call(this,o)),o.type){case"table":{let r=o;for(let a of r.header)n=n.concat(this.walkTokens(a.tokens,t));for(let a of r.rows)for(let u of a)n=n.concat(this.walkTokens(u.tokens,t));break}case"list":{let r=o;n=n.concat(this.walkTokens(r.items,t));break}default:{let r=o;(s=(i=this.defaults.extensions)==null?void 0:i.childTokens)!=null&&s[r.type]?this.defaults.extensions.childTokens[r.type].forEach(a=>{let u=r[a].flat(1/0);n=n.concat(this.walkTokens(u,t))}):r.tokens&&(n=n.concat(this.walkTokens(r.tokens,t)))}}return n}use(...e){let t=this.defaults.extensions||{renderers:{},childTokens:{}};return e.forEach(n=>{let i={...n};if(i.async=this.defaults.async||i.async||!1,n.extensions&&(n.extensions.forEach(s=>{if(!s.name)throw new Error("extension name required");if("renderer"in s){let o=t.renderers[s.name];o?t.renderers[s.name]=function(...r){let a=s.renderer.apply(this,r);return a===!1&&(a=o.apply(this,r)),a}:t.renderers[s.name]=s.renderer}if("tokenizer"in s){if(!s.level||s.level!=="block"&&s.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let o=t[s.level];o?o.unshift(s.tokenizer):t[s.level]=[s.tokenizer],s.start&&(s.level==="block"?t.startBlock?t.startBlock.push(s.start):t.startBlock=[s.start]:s.level==="inline"&&(t.startInline?t.startInline.push(s.start):t.startInline=[s.start]))}"childTokens"in s&&s.childTokens&&(t.childTokens[s.name]=s.childTokens)}),i.extensions=t),n.renderer){let s=this.defaults.renderer||new fi(this.defaults);for(let o in n.renderer){if(!(o in s))throw new Error(`renderer '${o}' does not exist`);if(["options","parser"].includes(o))continue;let r=o,a=n.renderer[r],u=s[r];s[r]=(...c)=>{let l=a.apply(s,c);return l===!1&&(l=u.apply(s,c)),l||""}}i.renderer=s}if(n.tokenizer){let s=this.defaults.tokenizer||new hi(this.defaults);for(let o in n.tokenizer){if(!(o in s))throw new Error(`tokenizer '${o}' does not exist`);if(["options","rules","lexer"].includes(o))continue;let r=o,a=n.tokenizer[r],u=s[r];s[r]=(...c)=>{let l=a.apply(s,c);return l===!1&&(l=u.apply(s,c)),l}}i.tokenizer=s}if(n.hooks){let s=this.defaults.hooks||new on;for(let o in n.hooks){if(!(o in s))throw new Error(`hook '${o}' does not exist`);if(["options","block"].includes(o))continue;let r=o,a=n.hooks[r],u=s[r];on.passThroughHooks.has(o)?s[r]=c=>{if(this.defaults.async&&on.passThroughHooksRespectAsync.has(o))return(async()=>{let d=await a.call(s,c);return u.call(s,d)})();let l=a.call(s,c);return u.call(s,l)}:s[r]=(...c)=>{if(this.defaults.async)return(async()=>{let d=await a.apply(s,c);return d===!1&&(d=await u.apply(s,c)),d})();let l=a.apply(s,c);return l===!1&&(l=u.apply(s,c)),l}}i.hooks=s}if(n.walkTokens){let s=this.defaults.walkTokens,o=n.walkTokens;i.walkTokens=function(r){let a=[];return a.push(o.call(this,r)),s&&(a=a.concat(s.call(this,r))),a}}this.defaults={...this.defaults,...i}}),this}setOptions(e){return this.defaults={...this.defaults,...e},this}lexer(e,t){return ve.lex(e,t??this.defaults)}parser(e,t){return be.parse(e,t??this.defaults)}parseMarkdown(e){return(t,n)=>{let i={...n},s={...this.defaults,...i},o=this.onError(!!s.silent,!!s.async);if(this.defaults.async===!0&&i.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(s.hooks&&(s.hooks.options=s,s.hooks.block=e),s.async)return(async()=>{let r=s.hooks?await s.hooks.preprocess(t):t,a=await(s.hooks?await s.hooks.provideLexer():e?ve.lex:ve.lexInline)(r,s),u=s.hooks?await s.hooks.processAllTokens(a):a;s.walkTokens&&await Promise.all(this.walkTokens(u,s.walkTokens));let c=await(s.hooks?await s.hooks.provideParser():e?be.parse:be.parseInline)(u,s);return s.hooks?await s.hooks.postprocess(c):c})().catch(o);try{s.hooks&&(t=s.hooks.preprocess(t));let r=(s.hooks?s.hooks.provideLexer():e?ve.lex:ve.lexInline)(t,s);s.hooks&&(r=s.hooks.processAllTokens(r)),s.walkTokens&&this.walkTokens(r,s.walkTokens);let a=(s.hooks?s.hooks.provideParser():e?be.parse:be.parseInline)(r,s);return s.hooks&&(a=s.hooks.postprocess(a)),a}catch(r){return o(r)}}}onError(e,t){return n=>{if(n.message+=`
2132
- Please report this to https://github.com/markedjs/marked.`,e){let i="<p>An error occurred:</p><pre>"+Be(n.message+"",!0)+"</pre>";return t?Promise.resolve(i):i}if(t)return Promise.reject(n);throw n}}},gt=new Mg;function K(e,t){return gt.parse(e,t)}K.options=K.setOptions=function(e){return gt.setOptions(e),K.defaults=gt.defaults,Ec(K.defaults),K};K.getDefaults=Po;K.defaults=bt;K.use=function(...e){return gt.use(...e),K.defaults=gt.defaults,Ec(K.defaults),K};K.walkTokens=function(e,t){return gt.walkTokens(e,t)};K.parseInline=gt.parseInline;K.Parser=be;K.parser=be.parse;K.Renderer=fi;K.TextRenderer=Fo;K.Lexer=ve;K.lexer=ve.lex;K.Tokenizer=hi;K.Hooks=on;K.parse=K;K.options;K.setOptions;K.use;K.walkTokens;K.parseInline;be.parse;ve.lex;K.setOptions({gfm:!0,breaks:!0,mangle:!1});const ka=["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"],Sa=["class","href","rel","target","title","start"];let xa=!1;const Pg=14e4,Lg=4e4,Ig=200,ps=5e4,at=new Map;function Rg(e){const t=at.get(e);return t===void 0?null:(at.delete(e),at.set(e,t),t)}function $a(e,t){if(at.set(e,t),at.size<=Ig)return;const n=at.keys().next().value;n&&at.delete(n)}function Ng(){xa||(xa=!0,Ws.addHook("afterSanitizeAttributes",e=>{!(e instanceof HTMLAnchorElement)||!e.getAttribute("href")||(e.setAttribute("rel","noreferrer noopener"),e.setAttribute("target","_blank"))}))}function gi(e){const t=e.trim();if(!t)return"";if(Ng(),t.length<=ps){const r=Rg(t);if(r!==null)return r}const n=gl(t,Pg),i=n.truncated?`
2133
-
2134
- … truncated (${n.total} chars, showing first ${n.text.length}).`:"";if(n.text.length>Lg){const a=`<pre class="code-block">${Dg(`${n.text}${i}`)}</pre>`,u=Ws.sanitize(a,{ALLOWED_TAGS:ka,ALLOWED_ATTR:Sa});return t.length<=ps&&$a(t,u),u}const s=K.parse(`${n.text}${i}`),o=Ws.sanitize(s,{ALLOWED_TAGS:ka,ALLOWED_ATTR:Sa});return t.length<=ps&&$a(t,o),o}function Dg(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#39;")}const Og=1500,Bg=2e3,Oc="Copy as markdown",Fg="Copied",Ug="Copy failed";async function Wg(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 zn(e,t){e.title=t,e.setAttribute("aria-label",t)}function Kg(e){const t=e.label??Oc;return p`
2135
- <button
2136
- class="chat-copy-btn"
2137
- type="button"
2138
- title=${t}
2139
- aria-label=${t}
2140
- @click=${async n=>{const i=n.currentTarget;if(i==null||i.querySelector(".chat-copy-btn__icon"),!i||i.dataset.copying==="1")return;i.dataset.copying="1",i.setAttribute("aria-busy","true"),i.disabled=!0;const s=await Wg(e.text());if(i.isConnected){if(delete i.dataset.copying,i.removeAttribute("aria-busy"),i.disabled=!1,!s){i.dataset.error="1",zn(i,Ug),window.setTimeout(()=>{i.isConnected&&(delete i.dataset.error,zn(i,t))},Bg);return}i.dataset.copied="1",zn(i,Fg),window.setTimeout(()=>{i.isConnected&&(delete i.dataset.copied,zn(i,t))},Og)}}}
2141
- >
2142
- <span class="chat-copy-btn__icon" aria-hidden="true">
2143
- <span class="chat-copy-btn__icon-copy">${N.copy}</span>
2144
- <span class="chat-copy-btn__icon-check">${N.check}</span>
2145
- </span>
2146
- </button>
2147
- `}function zg(e){return Kg({text:()=>e,label:Oc})}function jg(e){const t=e,n=Hg(t.content),i=[];for(const s of n){const o=String(s.type??"").toLowerCase();(["toolcall","tool_call","tooluse","tool_use"].includes(o)||typeof s.name=="string"&&s.arguments!=null)&&i.push({kind:"call",name:s.name??"tool",args:qg(s.arguments??s.args)})}for(const s of n){const o=String(s.type??"").toLowerCase();if(o!=="toolresult"&&o!=="tool_result")continue;const r=Vg(s),a=typeof s.name=="string"?s.name:"tool";i.push({kind:"result",name:a,text:r})}if(wl(e)&&!i.some(s=>s.kind==="result")){const s=typeof t.toolName=="string"&&t.toolName||typeof t.tool_name=="string"&&t.tool_name||"tool",o=ml(e)??void 0;i.push({kind:"result",name:s,text:o})}return i}function Hg(e){return Array.isArray(e)?e.filter(Boolean):[]}function qg(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 Vg(e){if(typeof e.text=="string")return e.text;if(typeof e.content=="string")return e.content}function Gg(e){var s;const n=e.content,i=[];if(Array.isArray(n))for(const o of n){if(typeof o!="object"||o===null)continue;const r=o;if(r.type==="image")if(((s=r.source)==null?void 0:s.type)==="base64"){const a=r.source,u=a.data,c=a.media_type||"image/png",l=u.startsWith("data:")?u:`data:${c};base64,${u}`;i.push({url:l})}else if(typeof r.data=="string"&&r.data){const a=r.data,u=r.mimeType||r.media_type||"image/png",c=a.startsWith("data:")?a:`data:${u};base64,${a}`;i.push({url:c})}else typeof r.url=="string"&&i.push({url:r.url});else if(r.type==="image_url"){const a=r.image_url;typeof(a==null?void 0:a.url)=="string"&&i.push({url:a.url})}}return i}function Qg(e){return p`
2148
- <div class="chat-group assistant">
2149
- <div class="chat-group-messages">
2150
- <div class="chat-bubble chat-reading-indicator" aria-hidden="true">
2151
- <span class="chat-reading-indicator__dots">
2152
- <span></span><span></span><span></span>
2153
- </span>
2154
- </div>
2155
- </div>
2156
- </div>
2157
- `}function Yg(e){return p`
2158
- <div class="chat-group assistant">
2159
- <div class="chat-group-messages">
2160
- <div class="chat-interim fade-in">
2161
- ${di(gi(e))}
2162
- </div>
2163
- </div>
2164
- </div>
2165
- `}function Xg(e,t,n,i){return p`
2166
- <div class="chat-group assistant">
2167
- <div class="chat-group-messages">
2168
- ${Bc({role:"assistant",content:[{type:"text",text:e}],timestamp:t},{isStreaming:!1,showReasoning:!1})}
2169
- </div>
2170
- </div>
2171
- `}function Zg(e,t){const n=bl(e.role),i=n==="user"?"user":n==="assistant"?"assistant":"other",s=new Date(e.timestamp).toLocaleString(void 0,{dateStyle:"medium",timeStyle:"medium"});return p`
2172
- <div class="chat-group ${i}">
2173
- <div class="chat-group-messages">
2174
- ${e.messages.map((o,r)=>Bc(o.message,{isStreaming:e.isStreaming&&r===e.messages.length-1,showReasoning:t.showReasoning}))}
2175
- <div class="chat-group-footer">
2176
- <span class="chat-group-timestamp">${s}</span>
2177
- </div>
2178
- </div>
2179
- </div>
2180
- `}function Jg(e){return e.length===0?k:p`
2181
- <div class="chat-message-images">
2182
- ${e.map(t=>p`
2183
- <img
2184
- src=${t.url}
2185
- alt=${t.alt??"Attached image"}
2186
- class="chat-message-image"
2187
- @click=${()=>window.open(t.url,"_blank")}
2188
- />
2189
- `)}
2190
- </div>
2191
- `}function Bc(e,t,n){const i=e,s=typeof i.role=="string"?i.role:"unknown",o=wl(e)||s.toLowerCase()==="toolresult"||s.toLowerCase()==="tool_result"||typeof i.toolCallId=="string"||typeof i.tool_call_id=="string",a=jg(e).length>0,u=Gg(e),c=u.length>0,l=ml(e),d=t.showReasoning&&s==="assistant"?Ed(e):null,h=l!=null&&l.trim()?l:null,v=d?Td(d):null,f=h,b=(s==="assistant"||s==="user")&&!!(f!=null&&f.trim()),S=["chat-bubble",b?"has-copy":"",t.isStreaming?"streaming":"","fade-in"].filter(Boolean).join(" ");return!f&&(a||o)||!f&&!c?k:p`
2192
- <div class="${S}">
2193
- ${b?zg(f):k}
2194
- ${Jg(u)}
2195
- ${v?p`<div class="chat-thinking">${di(gi(v))}</div>`:k}
2196
- ${f?p`<div class="chat-text">${di(gi(f))}</div>`:k}
2197
- </div>
2198
- `}function em(e){return p`
2199
- <div class="sidebar-panel">
2200
- <div class="sidebar-header">
2201
- <div class="sidebar-title">Tool Output</div>
2202
- <button @click=${e.onClose} class="btn" title="Close sidebar">
2203
- ${N.x}
2204
- </button>
2205
- </div>
2206
- <div class="sidebar-content">
2207
- ${e.error?p`
2208
- <div class="callout danger">${e.error}</div>
2209
- <button @click=${e.onViewRawText} class="btn" style="margin-top: 12px;">
2210
- View Raw Text
2211
- </button>
2212
- `:e.content?p`<div class="sidebar-markdown">${di(gi(e.content))}</div>`:p`<div class="muted">No content available</div>`}
2213
- </div>
2214
- </div>
2215
- `}var tm=Object.defineProperty,nm=Object.getOwnPropertyDescriptor,Li=(e,t,n,i)=>{for(var s=i>1?void 0:i?nm(t,n):t,o=e.length-1,r;o>=0;o--)(r=e[o])&&(s=(i?r(t,n,s):r(s))||s);return i&&s&&tm(t,n,s),s};let Nt=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,s=(e.clientX-this.startX)/n;let o=this.startRatio+s;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 p``}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)}};Nt.styles=ju`
2216
- :host {
2217
- width: 4px;
2218
- cursor: col-resize;
2219
- background: var(--border, #333);
2220
- transition: background 150ms ease-out;
2221
- flex-shrink: 0;
2222
- position: relative;
2223
- }
2224
-
2225
- :host::before {
2226
- content: "";
2227
- position: absolute;
2228
- top: 0;
2229
- left: -4px;
2230
- right: -4px;
2231
- bottom: 0;
2232
- }
2233
-
2234
- :host(:hover) {
2235
- background: var(--accent, #007bff);
2236
- }
2237
-
2238
- :host(.dragging) {
2239
- background: var(--accent, #007bff);
2240
- }
2241
- `;Li([xi({type:Number})],Nt.prototype,"splitRatio",2);Li([xi({type:Number})],Nt.prototype,"minRatio",2);Li([xi({type:Number})],Nt.prototype,"maxRatio",2);Nt=Li([ul("resizable-divider")],Nt);function jn(e){if(typeof e!="string"||!e)throw new Error("expected a non-empty string, got: "+e)}function hs(e){if(typeof e!="number")throw new Error("expected a number, got: "+e)}const im=1,sm=1,wt="emoji",Dt="keyvalue",Uo="favorites",om="tokens",Fc="tokens",rm="unicode",Uc="count",am="group",lm="order",Wc="group-order",Hs="eTag",mi="url",Aa="skinTone",Kt="readonly",Wo="readwrite",Kc="skinUnicodes",cm="skinUnicodes",um="https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json",dm="en";function pm(e,t){const n=new Set,i=[];for(const s of e){const o=t(s);n.has(o)||(n.add(o),i.push(s))}return i}function Ea(e){return pm(e,t=>t.unicode)}function hm(e){function t(n,i,s){const o=i?e.createObjectStore(n,{keyPath:i}):e.createObjectStore(n);if(s)for(const[r,[a,u]]of Object.entries(s))o.createIndex(r,a,{multiEntry:u});return o}t(Dt),t(wt,rm,{[Fc]:[om,!0],[Wc]:[[am,lm]],[Kc]:[cm,!0]}),t(Uo,void 0,{[Uc]:[""]})}const qs={},Zn={},yi={};function zc(e,t,n){n.onerror=()=>t(n.error),n.onblocked=()=>t(new Error("IDB blocked")),n.onsuccess=()=>e(n.result)}async function fm(e){const t=await new Promise((n,i)=>{const s=indexedDB.open(e,im);qs[e]=s,s.onupgradeneeded=o=>{o.oldVersion<sm&&hm(s.result)},zc(n,i,s)});return t.onclose=()=>Ko(e),t}function gm(e){return Zn[e]||(Zn[e]=fm(e)),Zn[e]}function We(e,t,n,i){return new Promise((s,o)=>{const r=e.transaction(t,n,{durability:"relaxed"}),a=typeof t=="string"?r.objectStore(t):t.map(c=>r.objectStore(c));let u;i(a,r,c=>{u=c}),r.oncomplete=()=>s(u),r.onerror=()=>o(r.error)})}function Ko(e){const t=qs[e],n=t&&t.result;if(n){n.close();const i=yi[e];if(i)for(const s of i)s()}delete qs[e],delete Zn[e],delete yi[e]}function mm(e){return new Promise((t,n)=>{Ko(e);const i=indexedDB.deleteDatabase(e);zc(t,n,i)})}function ym(e,t){let n=yi[e];n||(n=yi[e]=[]),n.push(t)}const vm=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 Lt(e){return e.split(/[\s_]+/).map(t=>!t.match(/\w/)||vm.has(t)?t.toLowerCase():t.replace(/[)(:,]/g,"").replace(/’/g,"'").toLowerCase()).filter(Boolean)}const bm=2;function jc(e){return e.filter(Boolean).map(t=>t.toLowerCase()).filter(t=>t.length>=bm)}function wm(e){return e.map(({annotation:n,emoticon:i,group:s,order:o,shortcodes:r,skins:a,tags:u,emoji:c,version:l})=>{const d=[...new Set(jc([...(r||[]).map(Lt).flat(),...(u||[]).map(Lt).flat(),...Lt(n),i]))].sort(),h={annotation:n,group:s,order:o,tags:u,tokens:d,unicode:c,version:l};if(i&&(h.emoticon=i),r&&(h.shortcodes=r),a){h.skinTones=[],h.skinUnicodes=[],h.skinVersions=[];for(const{tone:v,emoji:f,version:b}of a)h.skinTones.push(v),h.skinUnicodes.push(f),h.skinVersions.push(b)}return h})}function Hc(e,t,n,i){e[t](n).onsuccess=s=>i&&i(s.target.result)}function mt(e,t,n){Hc(e,"get",t,n)}function qc(e,t,n){Hc(e,"getAll",t,n)}function zo(e){e.commit&&e.commit()}function km(e,t){let n=e[0];for(let i=1;i<e.length;i++){const s=e[i];t(n)>t(s)&&(n=s)}return n}function Vc(e,t){const n=km(e,s=>s.length),i=[];for(const s of n)e.some(o=>o.findIndex(r=>t(r)===t(s))===-1)||i.push(s);return i}async function Sm(e){return!await jo(e,Dt,mi)}async function xm(e,t,n){const[i,s]=await Promise.all([Hs,mi].map(o=>jo(e,Dt,o)));return i===n&&s===t}async function $m(e,t){return We(e,wt,Kt,(i,s,o)=>{let r;const a=()=>{i.getAll(r&&IDBKeyRange.lowerBound(r,!0),50).onsuccess=u=>{const c=u.target.result;for(const l of c)if(r=l.unicode,t(l))return o(l);if(c.length<50)return o();a()}};a()})}async function Gc(e,t,n,i){{const s=wm(t);await We(e,[wt,Dt],Wo,([o,r],a)=>{let u,c,l=0;function d(){++l===2&&h()}function h(){if(!(u===i&&c===n)){o.clear();for(const v of s)o.put(v);r.put(i,Hs),r.put(n,mi),zo(a)}}mt(r,Hs,v=>{u=v,d()}),mt(r,mi,v=>{c=v,d()})})}}async function Am(e,t){return We(e,wt,Kt,(n,i,s)=>{const o=IDBKeyRange.bound([t,0],[t+1,0],!1,!0);qc(n.index(Wc),o,s)})}async function Qc(e,t){const n=jc(Lt(t));return n.length?We(e,wt,Kt,(i,s,o)=>{const r=[],a=()=>{r.length===n.length&&u()},u=()=>{const c=Vc(r,l=>l.unicode);o(c.sort((l,d)=>l.order<d.order?-1:1))};for(let c=0;c<n.length;c++){const l=n[c],d=c===n.length-1?IDBKeyRange.bound(l,l+"￿",!1,!0):IDBKeyRange.only(l);qc(i.index(Fc),d,h=>{r.push(h),a()})}}):[]}async function Em(e,t){const n=await Qc(e,t);return n.length?n.filter(i=>(i.shortcodes||[]).map(o=>o.toLowerCase()).includes(t.toLowerCase()))[0]||null:await $m(e,s=>(s.shortcodes||[]).includes(t.toLowerCase()))||null}async function Cm(e,t){return We(e,wt,Kt,(n,i,s)=>mt(n,t,o=>{if(o)return s(o);mt(n.index(Kc),t,r=>s(r||null))}))}function jo(e,t,n){return We(e,t,Kt,(i,s,o)=>mt(i,n,o))}function Tm(e,t,n,i){return We(e,t,Wo,(s,o)=>{s.put(i,n),zo(o)})}function _m(e,t){return We(e,Uo,Wo,(n,i)=>mt(n,t,s=>{n.put((s||0)+1,t),zo(i)}))}function Mm(e,t,n){return n===0?[]:We(e,[Uo,wt],Kt,([i,s],o,r)=>{const a=[];i.index(Uc).openCursor(void 0,"prev").onsuccess=u=>{const c=u.target.result;if(!c)return r(a);function l(v){if(a.push(v),a.length===n)return r(a);c.continue()}const d=c.primaryKey,h=t.byName(d);if(h)return l(h);mt(s,d,v=>{if(v)return l(v);c.continue()})}})}const Hn="";function Pm(e,t){const n=new Map;for(const s of e){const o=t(s);for(const r of o){let a=n;for(let c=0;c<r.length;c++){const l=r.charAt(c);let d=a.get(l);d||(d=new Map,a.set(l,d)),a=d}let u=a.get(Hn);u||(u=[],a.set(Hn,u)),u.push(s)}}return(s,o)=>{let r=n;for(let c=0;c<s.length;c++){const l=s.charAt(c),d=r.get(l);if(d)r=d;else return[]}if(o)return r.get(Hn)||[];const a=[],u=[r];for(;u.length;){const l=[...u.shift().entries()].sort((d,h)=>d[0]<h[0]?-1:1);for(const[d,h]of l)d===Hn?a.push(...h):u.push(h)}return a}}const Lm=["name","url"];function Im(e){const t=e&&Array.isArray(e),n=t&&e.length&&(!e[0]||Lm.some(i=>!(i in e[0])));if(!t||n)throw new Error("Custom emojis are in the wrong format")}function Ca(e){Im(e);const t=(h,v)=>h.name.toLowerCase()<v.name.toLowerCase()?-1:1,n=e.sort(t),s=Pm(e,h=>{const v=new Set;if(h.shortcodes)for(const f of h.shortcodes)for(const b of Lt(f))v.add(b);return v}),o=h=>s(h,!0),r=h=>s(h,!1),a=h=>{const v=Lt(h),f=v.map((b,S)=>(S<v.length-1?o:r)(b));return Vc(f,b=>b.name).sort(t)},u=new Map,c=new Map;for(const h of e){c.set(h.name.toLowerCase(),h);for(const v of h.shortcodes||[])u.set(v.toLowerCase(),h)}return{all:n,search:a,byShortcode:h=>u.get(h.toLowerCase()),byName:h=>c.get(h.toLowerCase())}}const Rm=typeof wrappedJSObject<"u";function nn(e){if(!e)return e;if(Rm&&(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 Yc(e){e||console.warn("emoji-picker-element is more efficient if the dataSource server exposes an ETag header.")}const Nm=["annotation","emoji","group","order","version"];function Dm(e){if(!e||!Array.isArray(e)||!e[0]||typeof e[0]!="object"||Nm.some(t=>!(t in e[0])))throw new Error("Emoji data is in the wrong format")}function Xc(e,t){if(Math.floor(e.status/100)!==2)throw new Error("Failed to fetch: "+t+": "+e.status)}async function Om(e){const t=await fetch(e,{method:"HEAD"});Xc(t,e);const n=t.headers.get("etag");return Yc(n),n}async function Vs(e){const t=await fetch(e);Xc(t,e);const n=t.headers.get("etag");Yc(n);const i=await t.json();return Dm(i),[n,i]}function Bm(e){for(var t="",n=new Uint8Array(e),i=n.byteLength,s=-1;++s<i;)t+=String.fromCharCode(n[s]);return t}function Fm(e){for(var t=e.length,n=new ArrayBuffer(t),i=new Uint8Array(n),s=-1;++s<t;)i[s]=e.charCodeAt(s);return n}async function Zc(e){const t=JSON.stringify(e);let n=Fm(t);const i=await crypto.subtle.digest("SHA-1",n),s=Bm(i);return btoa(s)}async function Um(e,t){let n,i=await Om(t);if(!i){const s=await Vs(t);i=s[0],n=s[1],i||(i=await Zc(n))}await xm(e,t,i)||(n||(n=(await Vs(t))[1]),await Gc(e,n,t,i))}async function Wm(e,t){let[n,i]=await Vs(t);n||(n=await Zc(i)),await Gc(e,i,t,n)}async function Km(e,t){try{await Um(e,t)}catch(n){if(n.name!=="InvalidStateError")throw n}}class zm{constructor({dataSource:t=um,locale:n=dm,customEmoji:i=[]}={}){this.dataSource=t,this.locale=n,this._dbName=`emoji-picker-element-${this.locale}`,this._db=void 0,this._lazyUpdate=void 0,this._custom=Ca(i),this._clear=this._clear.bind(this),this._ready=this._init()}async _init(){const t=this._db=await gm(this._dbName);ym(this._dbName,this._clear);const n=this.dataSource;await Sm(t)?await Wm(t,n):this._lazyUpdate=Km(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 hs(t),await this.ready(),Ea(await Am(this._db,t)).map(nn)}async getEmojiBySearchQuery(t){jn(t),await this.ready();const n=this._custom.search(t),i=Ea(await Qc(this._db,t)).map(nn);return[...n,...i]}async getEmojiByShortcode(t){jn(t),await this.ready();const n=this._custom.byShortcode(t);return n||nn(await Em(this._db,t))}async getEmojiByUnicodeOrName(t){jn(t),await this.ready();const n=this._custom.byName(t);return n||nn(await Cm(this._db,t))}async getPreferredSkinTone(){return await this.ready(),await jo(this._db,Dt,Aa)||0}async setPreferredSkinTone(t){return hs(t),await this.ready(),Tm(this._db,Dt,Aa,t)}async incrementFavoriteEmojiCount(t){return jn(t),await this.ready(),_m(this._db,t)}async getTopFavoriteEmoji(t){return hs(t),await this.ready(),(await Mm(this._db,this._custom,t)).map(nn)}set customEmoji(t){this._custom=Ca(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 Ko(this._dbName)}async delete(){await this._shutdown(),await mm(this._dbName)}}const Gs=[[-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})),fs=Gs.slice(1),jm=2,Ta=6,Jc=typeof requestIdleCallback=="function"?requestIdleCallback:setTimeout;function _a(e){return e.unicode.includes("‍")}const Hm={"🫪":17,"🫩":16,"🫨":15.1,"🫠":14,"🥲":13.1,"🥻":12.1,"🥰":11,"🤩":5,"👱‍♀️":4,"🤣":3,"👁️‍🗨️":2,"😀":1,"😐️":.7,"😃":.6},qm=1e3,Vm="🖐️",Gm=8,Qm=["😊","😒","❤️","👍️","😍","😂","😭","☺️","😔","😩","😏","💕","🙌","😘"],eu='"Twemoji Mozilla","Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji","EmojiOne Color","Android Emoji",sans-serif',Ym=(e,t)=>e<t?-1:e>t?1:0,Ma=(e,t)=>{const n=document.createElement("canvas");n.width=n.height=1;const i=n.getContext("2d",{willReadFrequently:!0});return i.textBaseline="top",i.font=`100px ${eu}`,i.fillStyle=t,i.scale(.01,.01),i.fillText(e,0,0),i.getImageData(0,0,1,1).data},Xm=(e,t)=>{const n=[...e].join(","),i=[...t].join(",");return n===i&&!n.startsWith("0,0,0,")};function Zm(e){const t=Ma(e,"#000"),n=Ma(e,"#fff");return t&&n&&Xm(t,n)}function Jm(){const e=Object.entries(Hm);try{for(const[t,n]of e)if(Zm(t))return n}catch{}return e[0][1]}let gs;const ms=()=>(gs||(gs=new Promise(e=>Jc(()=>e(Jm())))),gs),Qs=new Map,ey="️",ty="\uD83C",ny="‍",iy=127995,sy=57339;function oy(e,t){if(t===0)return e;const n=e.indexOf(ny);return n!==-1?e.substring(0,n)+String.fromCodePoint(iy+t-1)+e.substring(n):(e.endsWith(ey)&&(e=e.substring(0,e.length-1)),e+ty+String.fromCodePoint(sy+t-1))}function Ee(e){e.preventDefault(),e.stopPropagation()}function ys(e,t,n){return t+=e?-1:1,t<0?t=n.length-1:t>=n.length&&(t=0),t}function tu(e,t){const n=new Set,i=[];for(const s of e){const o=t(s);n.has(o)||(n.add(o),i.push(s))}return i}function ry(e,t){const n=i=>{const s={};for(const o of i)typeof o.tone=="number"&&o.version<=t&&(s[o.tone]=o.unicode);return s};return e.map(({unicode:i,skins:s,shortcodes:o,url:r,name:a,category:u,annotation:c})=>({unicode:i,name:a,shortcodes:o,url:r,category:u,annotation:c,id:i||a,skins:s&&n(s)}))}const Jn=requestAnimationFrame;let ay=typeof ResizeObserver=="function";function ly(e,t,n){let i;ay?(i=new ResizeObserver(n),i.observe(e)):Jn(n),t.addEventListener("abort",()=>{i&&i.disconnect()})}function Pa(e){{const t=document.createRange();return t.selectNode(e.firstChild),t.getBoundingClientRect().width}}let vs;function cy(e,t,n){let i=!0,s=!1;for(const o of e){const r=n(o);if(!r)continue;const a=Pa(r);a===0&&(s=!0),typeof vs>"u"&&(vs=Pa(t));const u=a/1.8<vs;Qs.set(o.unicode,u),u||(i=!1)}return s&&console.warn(`Emoji support detection failed - emoji character is 0 width.
2242
- This is likely due to using \`display:none\` which is unsupported.
2243
- If this is a Jest/Vitest environment, you can ignore this warning.
2244
- For details see: https://github.com/nolanlawson/emoji-picker-element/issues/514`),i}function uy(e){return tu(e,t=>t)}function dy(e){e&&(e.scrollTop=0)}function pn(e,t,n){let i=e.get(t);return i||(i=n(),e.set(t,i)),i}function La(e){return""+e}function py(e){const t=document.createElement("template");return t.innerHTML=e,t}const hy=new WeakMap,fy=new WeakMap,gy=Symbol("un-keyed"),my="replaceChildren"in Element.prototype;function yy(e,t){my?e.replaceChildren(...t):(e.innerHTML="",e.append(...t))}function vy(e,t){let n=e.firstChild,i=0;for(;n;){if(t[i]!==n)return!0;n=n.nextSibling,i++}return i!==t.length}function by(e,t){const{targetNode:n}=t;let{targetParentNode:i}=t,s=!1;i?s=vy(i,e):(s=!0,t.targetNode=void 0,t.targetParentNode=i=n.parentNode),s&&yy(i,e)}function wy(e,t){for(const n of t){const{targetNode:i,currentExpression:s,binding:{expressionIndex:o,attributeName:r,attributeValuePre:a,attributeValuePost:u}}=n,c=e[o];if(s!==c)if(n.currentExpression=c,r)if(c===null)i.removeAttribute(r);else{const l=a+La(c)+u;i.setAttribute(r,l)}else{let l;Array.isArray(c)?by(c,n):c instanceof Element?(l=c,i.replaceWith(l)):i.nodeValue=La(c),l&&(n.targetNode=l)}}}function ky(e){let t="",n=!1,i=!1,s=-1;const o=new Map,r=[];let a=0;for(let c=0,l=e.length;c<l;c++){const d=e[c];if(t+=d.slice(a),c===l-1)break;for(let A=0;A<d.length;A++)switch(d.charAt(A)){case"<":{d.charAt(A+1)==="/"?r.pop():(n=!0,r.push(++s));break}case">":{n=!1,i=!1;break}case"=":{i=!0;break}}const h=r[r.length-1],v=pn(o,h,()=>[]);let f,b,S;if(i){const A=/(\S+)="?([^"=]*)$/.exec(d);f=A[1],b=A[2];const C=/^([^">]*)("?)/.exec(e[c+1]);S=C[1],t=t.slice(0,-1*A[0].length),a=C[0].length}else a=0;const $={attributeName:f,attributeValuePre:b,attributeValuePost:S,expressionIndex:c};v.push($),!n&&!i&&(t+=" ")}return{template:py(t),elementsToBindings:o}}function Ia(e,t,n){for(let i=0;i<e.length;i++){const s=e[i],o=s.attributeName?t:t.firstChild,r={binding:s,targetNode:o,targetParentNode:void 0,currentExpression:void 0};n.push(r)}}function Sy(e,t){const n=[];let i;if(t.size===1&&(i=t.get(0)))Ia(i,e,n);else{const s=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT);let o=e,r=-1;do{const a=t.get(++r);a&&Ia(a,o,n)}while(o=s.nextNode())}return n}function xy(e){const{template:t,elementsToBindings:n}=pn(hy,e,()=>ky(e)),i=t.cloneNode(!0).content.firstElementChild,s=Sy(i,n);return function(r){return wy(r,s),i}}function $y(e){const t=pn(fy,e,()=>new Map);let n=gy;function i(o,...r){const a=pn(t,o,()=>new Map);return pn(a,n,()=>xy(o))(r)}function s(o,r,a){return o.map((u,c)=>{const l=n;n=a(u);try{return r(u,c)}finally{n=l}})}return{map:s,html:i}}function Ay(e,t,n,i,s,o,r,a,u){const{labelWithSkin:c,titleForEmoji:l,unicodeWithSkin:d}=n,{html:h,map:v}=$y(t);function f(A,C,T){return v(A,(M,R)=>h`<button role="${C?"option":"menuitem"}" aria-selected="${C?R===t.activeSearchItem:null}" aria-label="${c(M,t.currentSkinTone)}" title="${l(M)}" class="${"emoji"+(C&&R===t.activeSearchItem?" active":"")+(M.unicode?"":" custom-emoji")}" id="${`${T}-${M.id}`}" style="${M.unicode?null:`--custom-emoji-background: url(${JSON.stringify(M.url)})`}">${M.unicode?d(M,t.currentSkinTone):""}</button>`,M=>`${T}-${M.id}`)}const S=h`<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,(A,C)=>h`<div id="skintone-${C}" class="emoji ${C===t.activeSkinTone?"active":""}" aria-selected="${C===t.activeSkinTone}" role="option" title="${t.i18n.skinTones[C]}" aria-label="${t.i18n.skinTones[C]}">${A}</div>`,A=>A)}</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,A=>h`<button role="tab" class="nav-button" aria-controls="tab-${A.id}" aria-label="${t.i18n.categories[A.name]}" aria-selected="${!t.searchMode&&t.currentGroup.id===A.id}" title="${t.i18n.categories[A.name]}" data-group-id="${A.id}"><div class="nav-emoji emoji">${A.emoji}</div></button>`,A=>A.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,(A,C)=>h`<div><div id="menu-label-${C}" class="category ${t.currentEmojisWithCategories.length===1&&t.currentEmojisWithCategories[0].category===""?"gone":""}" aria-hidden="true">${t.searchMode?t.i18n.searchResultsLabel:A.category?A.category:t.currentEmojisWithCategories.length>1?t.i18n.categories.custom:t.i18n.categories[t.currentGroup.name]}</div><div class="emoji-menu ${C!==0&&!t.searchMode&&t.currentGroup.id===-1?"visibility-auto":""}" style="${`--num-rows: ${Math.ceil(A.emojis.length/t.numColumns)}`}" data-action="updateOnIntersection" role="${t.searchMode?"listbox":"menu"}" aria-labelledby="menu-label-${C}" id="${t.searchMode?"search-results":null}">${f(A.emojis,t.searchMode,"emo")}</div></div>`,A=>A.category)}</div></div><div class="favorites onscreen emoji-menu ${t.message?"gone":""}" role="menu" aria-label="${t.i18n.favoritesLabel}" data-on-click="onEmojiClick">${f(t.currentFavorites,!1,"fav")}</div><button data-ref="baselineEmoji" aria-hidden="true" tabindex="-1" class="abs-pos hidden emoji baseline-emoji">😀</button></section>`,$=(A,C)=>{for(const T of e.querySelectorAll(`[${A}]`))C(T,T.getAttribute(A))};if(u){e.appendChild(S);for(const A of["click","focusout","input","keydown","keyup"])$(`data-on-${A}`,(C,T)=>{C.addEventListener(A,i[T])});$("data-ref",(A,C)=>{o[C]=A}),r.addEventListener("abort",()=>{e.removeChild(S)})}$("data-action",(A,C)=>{let T=a.get(C);T||a.set(C,T=new WeakSet),T.has(A)||(T.add(A),s[C](A))})}const vi=typeof queueMicrotask=="function"?queueMicrotask:e=>Promise.resolve().then(e);function Ey(e){let t=!1,n;const i=new Map,s=new Set;let o;const r=()=>{if(t)return;const c=[...s];s.clear();try{for(const l of c)l()}finally{o=!1,s.size&&(o=!0,vi(r))}},a=new Proxy({},{get(c,l){if(n){let d=i.get(l);d||(d=new Set,i.set(l,d)),d.add(n)}return c[l]},set(c,l,d){if(c[l]!==d){c[l]=d;const h=i.get(l);if(h){for(const v of h)s.add(v);o||(o=!0,vi(r))}}return!0}}),u=c=>{const l=()=>{const d=n;n=l;try{return c()}finally{n=d}};return l()};return e.addEventListener("abort",()=>{t=!0}),{state:a,createEffect:u}}function bs(e,t,n){if(e.length!==t.length)return!1;for(let i=0;i<e.length;i++)if(!n(e[i],t[i]))return!1;return!0}const Ra=new WeakMap;function Cy(e,t,n){{const i=e.closest(".tabpanel");let s=Ra.get(i);s||(s=new IntersectionObserver(n,{root:i,rootMargin:"50% 0px 50% 0px",threshold:0}),Ra.set(i,s),t.addEventListener("abort",()=>{s.disconnect()})),s.observe(e)}}const ws=[],{assign:qn}=Object;function Ty(e,t){const n={},i=new AbortController,s=i.signal,{state:o,createEffect:r}=Ey(s),a=new Map;qn(o,{skinToneEmoji:void 0,i18n:void 0,database:void 0,customEmoji:void 0,customCategorySorting:void 0,emojiVersion:void 0}),qn(o,t),qn(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:Gm,isRtl:!1,currentGroupIndex:0,groups:fs,databaseLoaded:!1,activeSearchItemId:void 0}),r(()=>{o.currentGroup!==o.groups[o.currentGroupIndex]&&(o.currentGroup=o.groups[o.currentGroupIndex])});const u=x=>{e.getElementById(x).focus()},c=x=>e.getElementById(`emo-${x.id}`),l=(x,_)=>{n.rootElement.dispatchEvent(new CustomEvent(x,{detail:_,bubbles:!0,composed:!0}))},d=(x,_)=>x.id===_.id,h=(x,_)=>{const{category:D,emojis:O}=x,{category:V,emojis:z}=_;return D!==V?!1:bs(O,z,d)},v=x=>{bs(o.currentEmojis,x,d)||(o.currentEmojis=x)},f=x=>{o.searchMode!==x&&(o.searchMode=x)},b=x=>{bs(o.currentEmojisWithCategories,x,h)||(o.currentEmojisWithCategories=x)},S=(x,_)=>_&&x.skins&&x.skins[_]||x.unicode,C={labelWithSkin:(x,_)=>uy([x.name||S(x,_),x.annotation,...x.shortcodes||ws].filter(Boolean)).join(", "),titleForEmoji:x=>x.annotation||(x.shortcodes||ws).join(", "),unicodeWithSkin:S},T={onClickSkinToneButton:H,onEmojiClick:$n,onNavClick:Sn,onNavKeydown:Oi,onSearchKeydown:Di,onSkinToneOptionsClick:An,onSkinToneOptionsFocusOut:ze,onSkinToneOptionsKeydown:et,onSkinToneOptionsKeyup:jt,onSearchInput:En},M={calculateEmojiGridStyle:ee,updateOnIntersection:me};let R=!0;r(()=>{Ay(e,o,C,T,M,n,s,a,R),R=!1}),o.emojiVersion||ms().then(x=>{x||(o.message=o.i18n.emojiUnsupportedMessage)}),r(()=>{async function x(){let _=!1;const D=setTimeout(()=>{_=!0,o.message=o.i18n.loadingMessage},qm);try{await o.database.ready(),o.databaseLoaded=!0}catch(O){console.error(O),o.message=o.i18n.networkErrorMessage}finally{clearTimeout(D),_&&(_=!1,o.message="")}}o.database&&x()}),r(()=>{o.pickerStyle=`
2245
- --num-groups: ${o.groups.length};
2246
- --indicator-opacity: ${o.searchMode?0:1};
2247
- --num-skintones: ${Ta};`}),r(()=>{o.customEmoji&&o.database&&B()}),r(()=>{o.customEmoji&&o.customEmoji.length?o.groups!==Gs&&(o.groups=Gs):o.groups!==fs&&(o.currentGroupIndex&&o.currentGroupIndex--,o.groups=fs)}),r(()=>{async function x(){o.databaseLoaded&&(o.currentSkinTone=await o.database.getPreferredSkinTone())}x()}),r(()=>{o.skinTones=Array(Ta).fill().map((x,_)=>oy(o.skinToneEmoji,_))}),r(()=>{o.skinToneButtonText=o.skinTones[o.currentSkinTone]}),r(()=>{o.skinToneButtonLabel=o.i18n.skinToneLabel.replace("{skinTone}",o.i18n.skinTones[o.currentSkinTone])}),r(()=>{async function x(){const{database:_}=o,D=(await Promise.all(Qm.map(O=>_.getEmojiByUnicodeOrName(O)))).filter(Boolean);o.defaultFavoriteEmojis=D}o.databaseLoaded&&x()});function B(){const{customEmoji:x,database:_}=o,D=x||ws;_.customEmoji!==D&&(_.customEmoji=D)}r(()=>{async function x(){B();const{database:_,defaultFavoriteEmojis:D,numColumns:O}=o,V=await _.getTopFavoriteEmoji(O),z=await Je(tu([...V,...D],ae=>ae.unicode||ae.name).slice(0,O));o.currentFavorites=z}o.databaseLoaded&&o.defaultFavoriteEmojis&&x()});function ee(x){ly(x,s,()=>{{const _=getComputedStyle(n.rootElement),D=parseInt(_.getPropertyValue("--num-columns"),10),O=_.getPropertyValue("direction")==="rtl";o.numColumns=D,o.isRtl=O}})}function me(x){Cy(x,s,_=>{for(const{target:D,isIntersecting:O}of _)D.classList.toggle("onscreen",O)})}r(()=>{async function x(){const{searchText:_,currentGroup:D,databaseLoaded:O,customEmoji:V}=o;if(!O)o.currentEmojis=[],o.searchMode=!1;else if(_.length>=jm){const z=await Ni(_);o.searchText===_&&(v(z),f(!0))}else{const{id:z}=D;if(z!==-1||V&&V.length){const ae=await Ri(z);o.currentGroup.id===z&&(v(ae),f(!1))}}}x()});const Ke=()=>{Jn(()=>dy(n.tabpanelElement))};r(()=>{const{currentEmojis:x,emojiVersion:_}=o,D=x.filter(O=>O.unicode).filter(O=>_a(O)&&!Qs.has(O.unicode));if(!_&&D.length)v(x),Jn(()=>Z(D));else{const O=_?x:x.filter(zt);v(O),Ke()}});function Z(x){cy(x,n.baselineEmoji,c)?Ke():o.currentEmojis=[...o.currentEmojis]}function zt(x){return!x.unicode||!_a(x)||Qs.get(x.unicode)}async function kt(x){const _=o.emojiVersion||await ms();return x.filter(({version:D})=>!D||D<=_)}async function Je(x){return ry(x,o.emojiVersion||await ms())}async function Ri(x){const _=x===-1?o.customEmoji:await o.database.getEmojiByGroup(x);return Je(await kt(_))}async function Ni(x){return Je(await kt(await o.database.getEmojiBySearchQuery(x)))}r(()=>{}),r(()=>{function x(){const{searchMode:D,currentEmojis:O}=o;if(D)return[{category:"",emojis:O}];const V=new Map;for(const z of O){const ae=z.category||"";let je=V.get(ae);je||(je=[],V.set(ae,je)),je.push(z)}return[...V.entries()].map(([z,ae])=>({category:z,emojis:ae})).sort((z,ae)=>o.customCategorySorting(z.category,ae.category))}const _=x();b(_)}),r(()=>{o.activeSearchItemId=o.activeSearchItem!==-1&&o.currentEmojis[o.activeSearchItem].id}),r(()=>{const{rawSearchText:x}=o;Jc(()=>{o.searchText=(x||"").trim(),o.activeSearchItem=-1})});function Di(x){if(!o.searchMode||!o.currentEmojis.length)return;const _=D=>{Ee(x),o.activeSearchItem=ys(D,o.activeSearchItem,o.currentEmojis)};switch(x.key){case"ArrowDown":return _(!1);case"ArrowUp":return _(!0);case"Enter":if(o.activeSearchItem===-1)o.activeSearchItem=0;else return Ee(x),Q(o.currentEmojis[o.activeSearchItem].id)}}function Sn(x){const{target:_}=x,D=_.closest(".nav-button");if(!D)return;const O=parseInt(D.dataset.groupId,10);n.searchElement.value="",o.rawSearchText="",o.searchText="",o.activeSearchItem=-1,o.currentGroupIndex=o.groups.findIndex(V=>V.id===O)}function Oi(x){const{target:_,key:D}=x,O=V=>{V&&(Ee(x),V.focus())};switch(D){case"ArrowLeft":return O(_.previousElementSibling);case"ArrowRight":return O(_.nextElementSibling);case"Home":return O(_.parentElement.firstElementChild);case"End":return O(_.parentElement.lastElementChild)}}async function xn(x){const _=await o.database.getEmojiByUnicodeOrName(x),D=[...o.currentEmojis,...o.currentFavorites].find(V=>V.id===x),O=D.unicode&&S(D,o.currentSkinTone);return await o.database.incrementFavoriteEmojiCount(x),{emoji:_,skinTone:o.currentSkinTone,...O&&{unicode:O},...D.name&&{name:D.name}}}async function Q(x){const _=xn(x);l("emoji-click-sync",_),l("emoji-click",await _)}function $n(x){const{target:_}=x;if(!_.classList.contains("emoji"))return;Ee(x);const D=_.id.substring(4);Q(D)}function Y(x){o.currentSkinTone=x,o.skinTonePickerExpanded=!1,u("skintone-button"),l("skin-tone-change",{skinTone:x}),o.database.setPreferredSkinTone(x)}function An(x){const{target:{id:_}}=x,D=_&&_.match(/^skintone-(\d)/);if(!D)return;Ee(x);const O=parseInt(D[1],10);Y(O)}function H(x){o.skinTonePickerExpanded=!o.skinTonePickerExpanded,o.activeSkinTone=o.currentSkinTone,o.skinTonePickerExpanded&&(Ee(x),Jn(()=>u("skintone-list")))}r(()=>{o.skinTonePickerExpanded?n.skinToneDropdown.addEventListener("transitionend",()=>{o.skinTonePickerExpandedAfterAnimation=!0},{once:!0}):o.skinTonePickerExpandedAfterAnimation=!1});function et(x){if(!o.skinTonePickerExpanded)return;const _=async D=>{Ee(x),o.activeSkinTone=D};switch(x.key){case"ArrowUp":return _(ys(!0,o.activeSkinTone,o.skinTones));case"ArrowDown":return _(ys(!1,o.activeSkinTone,o.skinTones));case"Home":return _(0);case"End":return _(o.skinTones.length-1);case"Enter":return Ee(x),Y(o.activeSkinTone);case"Escape":return Ee(x),o.skinTonePickerExpanded=!1,u("skintone-button")}}function jt(x){if(o.skinTonePickerExpanded&&x.key===" ")return Ee(x),Y(o.activeSkinTone)}async function ze(x){const{relatedTarget:_}=x;(!_||_.id!=="skintone-list")&&(o.skinTonePickerExpanded=!1)}function En(x){o.rawSearchText=x.target.value}return{$set(x){qn(o,x)},$destroy(){i.abort()}}}const _y="https://cdn.jsdelivr.net/npm/emoji-picker-element-data@^1/en/emojibase/data.json",My="en";var Py={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"}},Ly=':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 nu=["customEmoji","customCategorySorting","database","dataSource","i18n","locale","skinToneEmoji","emojiVersion"],Iy=`:host{--emoji-font-family:${eu}}`;class Ho extends HTMLElement{constructor(t){super(),this.attachShadow({mode:"open"});const n=document.createElement("style");n.textContent=Ly+Iy,this.shadowRoot.appendChild(n),this._ctx={locale:My,dataSource:_y,skinToneEmoji:Vm,customCategorySorting:Ym,customEmoji:null,i18n:Py,emojiVersion:null,...t};for(const i of nu)i!=="database"&&Object.prototype.hasOwnProperty.call(this,i)&&(this._ctx[i]=this[i],delete this[i]);this._dbFlush()}connectedCallback(){Na(this),this._cmp||(this._cmp=Ty(this.shadowRoot,this._ctx))}disconnectedCallback(){Na(this),vi(()=>{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,i){this._set(t.replace(/-([a-z])/g,(s,o)=>o.toUpperCase()),t==="emoji-version"?parseFloat(i):i)}_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:i}=this._ctx;(!i||i.locale!==t||i.dataSource!==n)&&this._set("database",new zm({locale:t,dataSource:n}))}_dbFlush(){vi(()=>this._dbCreate())}}const iu={};for(const e of nu)iu[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(Ho.prototype,iu);function Na(e){e instanceof Ho||Object.setPrototypeOf(e,customElements.get(e.tagName.toLowerCase()).prototype)}customElements.get("emoji-picker")||customElements.define("emoji-picker",Ho);function Ry(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 Da(e){e.style.height="44px",e.style.overflowY="hidden"}const Ny=5e3;function Dy(e){return e?e.active?p`
2248
- <div class="callout info compaction-indicator compaction-indicator--active">
2249
- ${N.loader} Compacting context...
2250
- </div>
2251
- `:e.completedAt&&Date.now()-e.completedAt<Ny?p`
2252
- <div class="callout success compaction-indicator compaction-indicator--complete">
2253
- ${N.check} Context compacted
2254
- </div>
2255
- `:k:k}const Fe=5*1024*1024;function Ue(){return`att-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}function ke(e,t){var i,s,o;let n=(i=e.closest(".chat"))==null?void 0:i.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 r=(s=e.closest(".chat"))==null?void 0:s.querySelector(".chat-compose");(o=r==null?void 0:r.parentElement)==null||o.insertBefore(n,r)}n.textContent=t,setTimeout(()=>n==null?void 0:n.remove(),4e3)}const Oy=/\.(md|txt|csv|json|xml|html|css|js|ts|py|sh|yaml|yml|toml|ini|cfg|log|sql)$/i;function su(e){return e.type.startsWith("image/")||/\.(png|jpe?g|gif|webp|bmp|svg)$/i.test(e.name)}function ou(e){return e.type.startsWith("text/")||e.type==="application/json"||e.type==="application/xml"||Oy.test(e.name)}function ru(e){return e.type==="application/pdf"||/\.pdf$/i.test(e.name)}function au(e){return e.type.startsWith("video/")||/\.(mp4|webm|mov|avi|mkv|m4v)$/i.test(e.name)}function By(e,t){if(!t.onAttachmentsChange)return;const n=document.querySelector(".chat");if(su(e)){if(e.size>Fe){n&&ke(n,`Image too large (${(e.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);return}const i=new FileReader;i.onload=()=>{var o;const s={id:Ue(),dataUrl:i.result,mimeType:e.type};(o=t.onAttachmentsChange)==null||o.call(t,[...t.attachments??[],s])},i.readAsDataURL(e)}else if(ou(e)){if(e.size>Fe){n&&ke(n,`File too large (${(e.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);return}const i=new FileReader;i.onload=()=>{var o;const s={id:Ue(),dataUrl:"",mimeType:e.type||"text/plain",fileName:e.name,textContent:i.result};(o=t.onAttachmentsChange)==null||o.call(t,[...t.attachments??[],s])},i.readAsText(e)}else if(ru(e)){if(e.size>Fe){n&&ke(n,`PDF too large (${(e.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);return}const i=new FileReader;i.onload=()=>{var o;const s={id:Ue(),dataUrl:i.result,mimeType:"application/pdf",fileName:e.name};(o=t.onAttachmentsChange)==null||o.call(t,[...t.attachments??[],s])},i.readAsDataURL(e)}else if(au(e)){if(e.size>Fe){n&&ke(n,`Video too large (${(e.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);return}const i=new FileReader;i.onload=()=>{var o;const s={id:Ue(),dataUrl:i.result,mimeType:e.type||"video/mp4",fileName:e.name};(o=t.onAttachmentsChange)==null||o.call(t,[...t.attachments??[],s])},i.readAsDataURL(e)}else n&&ke(n,`Unsupported file type: ${e.name}. Use the Files page to upload to workspace.`)}function Fy(e,t){var s;e.preventDefault(),e.stopPropagation();const n=e.currentTarget;n.classList.remove("chat--dragover");const i=(s=e.dataTransfer)==null?void 0:s.files;if(!(!i||i.length===0))for(let o=0;o<i.length;o++){const r=i[o];if(su(r)){if(!t.onAttachmentsChange)continue;if(r.size>Fe){ke(n,`Image too large (${(r.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const a=new FileReader;a.onload=()=>{var d;const u=a.result,c={id:Ue(),dataUrl:u,mimeType:r.type},l=t.attachments??[];(d=t.onAttachmentsChange)==null||d.call(t,[...l,c])},a.readAsDataURL(r)}else if(ou(r)){if(!t.onAttachmentsChange)continue;if(r.size>Fe){ke(n,`File too large (${(r.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const a=new FileReader;a.onload=()=>{var d;const u=a.result,c={id:Ue(),dataUrl:"",mimeType:r.type||"text/plain",fileName:r.name,textContent:u},l=t.attachments??[];(d=t.onAttachmentsChange)==null||d.call(t,[...l,c])},a.readAsText(r)}else if(ru(r)){if(!t.onAttachmentsChange)continue;if(r.size>Fe){ke(n,`PDF too large (${(r.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const a=new FileReader;a.onload=()=>{var d;const u=a.result,c={id:Ue(),dataUrl:u,mimeType:"application/pdf",fileName:r.name},l=t.attachments??[];(d=t.onAttachmentsChange)==null||d.call(t,[...l,c])},a.readAsDataURL(r)}else if(au(r)){if(!t.onAttachmentsChange)continue;if(r.size>Fe){ke(n,`Video too large (${(r.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const a=new FileReader;a.onload=()=>{var d;const u=a.result,c={id:Ue(),dataUrl:u,mimeType:r.type||"video/mp4",fileName:r.name},l=t.attachments??[];(d=t.onAttachmentsChange)==null||d.call(t,[...l,c])},a.readAsDataURL(r)}else ke(n,`Unsupported file type: ${r.name}. Use the Files page to upload to workspace.`)}}function Uy(e){e.preventDefault(),e.stopPropagation(),e.dataTransfer&&(e.dataTransfer.dropEffect="copy"),e.currentTarget.classList.add("chat--dragover")}function Wy(e){e.preventDefault(),e.stopPropagation();const t=e.currentTarget,n=e.relatedTarget;(!n||!t.contains(n))&&t.classList.remove("chat--dragover")}function Ky(e,t){var s,o,r;const n=(s=e.clipboardData)==null?void 0:s.items;if(!n||!t.onAttachmentsChange)return;const i=[];for(let a=0;a<n.length;a++){const u=n[a];(u.type.startsWith("image/")||u.type.startsWith("video/"))&&i.push(u)}if(i.length!==0){e.preventDefault();for(const a of i){const u=a.getAsFile();if(!u)continue;const c=u.type.startsWith("video/")?"Video":"Image";if(u.size>Fe){const d=((r=(o=e.target)==null?void 0:o.closest)==null?void 0:r.call(o,".chat"))??document.querySelector(".chat");d&&ke(d,`${c} too large (${(u.size/1024/1024).toFixed(1)} MB). Maximum is 5 MB.`);continue}const l=new FileReader;l.onload=()=>{var b;const d=l.result,h=u.type.startsWith("video/"),v={id:Ue(),dataUrl:d,mimeType:u.type,fileName:h?u.name||"video.mp4":void 0},f=t.attachments??[];(b=t.onAttachmentsChange)==null||b.call(t,[...f,v])},l.readAsDataURL(u)}}}function zy(e){const t=e.currentTarget,n=t.closest(".chat-compose"),i=n==null?void 0:n.querySelector(".emoji-picker-popup");if(!i)return;const s=i.classList.toggle("active");if(t.classList.toggle("active",s),s){const o=r=>{i.contains(r.target)||t.contains(r.target)||(i.classList.remove("active"),t.classList.remove("active"),document.removeEventListener("click",o,!0))};requestAnimationFrame(()=>document.addEventListener("click",o,!0))}}function jy(e,t){const n=e.detail,i=n==null?void 0:n.unicode;if(!i)return;const s=e.currentTarget.closest(".chat-compose"),o=s==null?void 0:s.querySelector("textarea");if(!o)return;const r=o.selectionStart??t.draft.length,a=o.selectionEnd??r,u=t.draft.slice(0,r),c=t.draft.slice(a);t.onDraftChange(u+i+c);const l=s==null?void 0:s.querySelector(".emoji-picker-popup"),d=s==null?void 0:s.querySelector(".chat-compose__emoji");l==null||l.classList.remove("active"),d==null||d.classList.remove("active"),requestAnimationFrame(()=>{o.focus();const h=r+i.length;o.setSelectionRange(h,h)})}function Hy(e){const t=e.attachments??[];return t.length===0?k:p`
2256
- <div class="chat-attachments">
2257
- ${t.map(n=>{var i;return n.fileName?p`
2258
- <div class="chat-attachment chat-attachment--file">
2259
- <span class="chat-attachment__icon">${(i=n.mimeType)!=null&&i.startsWith("video/")?N.film:N.fileText}</span>
2260
- <span class="chat-attachment__name" title=${n.fileName}>${n.fileName}</span>
2261
- <button
2262
- class="chat-attachment__remove chat-attachment__remove--file"
2263
- type="button"
2264
- aria-label="Remove attachment"
2265
- @click=${()=>{var o;const s=(e.attachments??[]).filter(r=>r.id!==n.id);(o=e.onAttachmentsChange)==null||o.call(e,s)}}
2266
- >
2267
- ${N.x}
2268
- </button>
2269
- </div>
2270
- `:p`
2271
- <div class="chat-attachment">
2272
- <img
2273
- src=${n.dataUrl}
2274
- alt="Attachment preview"
2275
- class="chat-attachment__img"
2276
- />
2277
- <button
2278
- class="chat-attachment__remove"
2279
- type="button"
2280
- aria-label="Remove attachment"
2281
- @click=${()=>{var o;const s=(e.attachments??[]).filter(r=>r.id!==n.id);(o=e.onAttachmentsChange)==null||o.call(e,s)}}
2282
- >
2283
- ${N.x}
2284
- </button>
2285
- </div>
2286
- `})}
2287
- </div>
2288
- `}function lu(e){var h,v,f;const t=e.connected,n=e.sending||e.stream!==null,i=!!(e.canAbort&&e.onAbort),s=(v=(h=e.sessions)==null?void 0:h.sessions)==null?void 0:v.find(b=>b.key===e.sessionKey),o=(s==null?void 0:s.reasoningLevel)??"off",r=e.showThinking&&o!=="off";e.assistantName,e.assistantAvatar??e.assistantAvatarUrl;const a=(((f=e.attachments)==null?void 0:f.length)??0)>0,u=e.connected?a?"Add a message...":"Message...":"Connecting…",c=e.splitRatio??.6,l=!!(e.sidebarOpen&&e.onCloseSidebar),d=p`
2289
- <div
2290
- class="chat-thread"
2291
- role="log"
2292
- aria-live="polite"
2293
- @scroll=${e.onChatScroll}
2294
- >
2295
- ${e.hasMore?p`<div class="chat-load-more">
2296
- ${e.loadingOlder?p`<span class="chat-load-more__spinner">${N.loader}</span> Loading older messages…`:p`<button class="chat-load-more__btn" type="button" @click=${e.onLoadOlder}>Load older messages</button>`}
2297
- </div>`:k}
2298
- ${e.loading?p`<div class="muted">Loading chat…</div>`:k}
2299
- ${Ef(Zy(e),b=>b.key,b=>b.kind==="interim"?Yg(b.text):b.kind==="reading-indicator"?Qg():b.kind==="stream"?Xg(b.text,b.startedAt,e.onOpenSidebar):b.kind==="group"?Zg(b,{onOpenSidebar:e.onOpenSidebar,showReasoning:r,assistantName:e.assistantName}):k)}
2300
- </div>
2301
- `;return p`
2302
- <section
2303
- class="card chat"
2304
- @drop=${b=>Fy(b,e)}
2305
- @dragover=${Uy}
2306
- @dragleave=${Wy}
2307
- >
2308
- ${e.disabledReason?p`<div class="callout">${e.disabledReason}</div>`:k}
2309
-
2310
- ${e.error?p`<div class="callout danger">${e.error}</div>`:k}
2311
-
2312
- ${Dy(e.compactionStatus)}
2313
-
2314
- ${e.focusMode?p`
2315
- <button
2316
- class="chat-focus-exit"
2317
- type="button"
2318
- @click=${e.onToggleFocusMode}
2319
- aria-label="Exit focus mode"
2320
- title="Exit focus mode"
2321
- >
2322
- ${N.x}
2323
- </button>
2324
- `:k}
2325
-
2326
- <div
2327
- class="chat-split-container ${l?"chat-split-container--open":""}"
2328
- >
2329
- <div
2330
- class="chat-main"
2331
- style="flex: ${l?`0 0 ${c*100}%`:"1 1 100%"}"
2332
- >
2333
- ${d}
2334
- ${e.nearBottom===!1?p`
2335
- <button
2336
- class="chat-scroll-bottom"
2337
- type="button"
2338
- @click=${b=>{const S=b.currentTarget.closest(".chat-main"),$=S==null?void 0:S.querySelector(".chat-thread");$&&$.scrollTo({top:$.scrollHeight,behavior:"smooth"})}}
2339
- aria-label="Scroll to bottom"
2340
- title="Scroll to bottom"
2341
- >
2342
- ${N.chevronDown}
2343
- </button>
2344
- `:k}
2345
- </div>
2346
-
2347
- ${l?p`
2348
- <resizable-divider
2349
- .splitRatio=${c}
2350
- @resize=${b=>{var S;return(S=e.onSplitRatioChange)==null?void 0:S.call(e,b.detail.splitRatio)}}
2351
- ></resizable-divider>
2352
- <div class="chat-sidebar">
2353
- ${em({content:e.sidebarContent??null,error:e.sidebarError??null,onClose:e.onCloseSidebar,onViewRawText:()=>{!e.sidebarContent||!e.onOpenSidebar||e.onOpenSidebar(`\`\`\`
2354
- ${e.sidebarContent}
2355
- \`\`\``)}})}
2356
- </div>
2357
- `:k}
2358
- </div>
2359
-
2360
- ${e.suggestion?p`
2361
- <div class="chat-suggestions">
2362
- <button
2363
- class="chat-suggestion-chip"
2364
- type="button"
2365
- @click=${()=>{var b;return(b=e.onSuggestionClick)==null?void 0:b.call(e,e.suggestion)}}
2366
- >
2367
- ${e.suggestion}
2368
- </button>
2369
- </div>
2370
- `:k}
2371
-
2372
- <div class="chat-compose">
2373
- ${Hy(e)}
2374
- <div class="chat-compose__row">
2375
- <button
2376
- class="chat-compose__emoji"
2377
- type="button"
2378
- @click=${zy}
2379
- aria-label="Emoji"
2380
- title="Emoji"
2381
- >
2382
- ${N.smile}
2383
- </button>
2384
- <button
2385
- class="chat-compose__attach"
2386
- type="button"
2387
- @click=${b=>{var $;const S=($=b.currentTarget.closest(".chat-compose__row"))==null?void 0:$.querySelector(".chat-compose__file-input");S==null||S.click()}}
2388
- aria-label="Attach file"
2389
- title="Attach file"
2390
- >
2391
- ${N.paperclip}
2392
- </button>
2393
- <input
2394
- class="chat-compose__file-input"
2395
- type="file"
2396
- multiple
2397
- accept="image/*,video/*,.pdf,.md,.txt,.csv,.json,.xml,.html,.css,.js,.ts,.py,.sh,.yaml,.yml,.toml,.ini,.cfg,.log,.sql"
2398
- style="display:none"
2399
- @change=${b=>{const S=b.target,$=S.files;if(!(!$||$.length===0||!e.onAttachmentsChange)){for(let A=0;A<$.length;A++)By($[A],e);S.value=""}}}
2400
- />
2401
- <label class="field chat-compose__field">
2402
- <span>Message</span>
2403
- <textarea
2404
- .value=${e.draft}
2405
- ?disabled=${!e.connected}
2406
- @keydown=${b=>{b.key==="Enter"&&(b.isComposing||b.keyCode===229||b.shiftKey||e.connected&&(b.preventDefault(),t&&(e.onSend(),Da(b.target))))}}
2407
- @input=${b=>{const S=b.target;e.onDraftChange(S.value),Ry(S)}}
2408
- @paste=${b=>Ky(b,e)}
2409
- placeholder=${u}
2410
- ></textarea>
2411
- </label>
2412
- ${i?p`
2413
- <button
2414
- class="btn btn--icon chat-compose__send"
2415
- @click=${e.onAbort}
2416
- aria-label="Stop"
2417
- title="Stop generating"
2418
- >
2419
- ${N.square}
2420
- </button>
2421
- `:k}
2422
- <button
2423
- class="btn btn--icon chat-compose__send primary"
2424
- ?disabled=${!e.connected}
2425
- @click=${b=>{var $;e.onSend();const S=($=b.target.closest(".chat-compose"))==null?void 0:$.querySelector("textarea");S&&Da(S)}}
2426
- aria-label="${n?"Queue":"Send"}"
2427
- title="${n?"Queue message":"Send (Enter)"}"
2428
- >
2429
- ${N.send}
2430
- </button>
2431
- </div>
2432
- <div class="emoji-picker-popup">
2433
- <emoji-picker
2434
- @emoji-click=${b=>jy(b,e)}
2435
- ></emoji-picker>
2436
- </div>
2437
- ${e.publicMode?k:Yy(e)}
2438
- </div>
2439
- </section>
2440
- `}const qy=[{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 Vy(e){const t=new Set(e.filter(n=>n.provider==="anthropic").map(n=>n.id));return qy.filter(n=>t.has(n.id)).map(n=>({key:`anthropic/${n.id}`,...n}))}const Gy=[{value:"off",label:"Off"},{value:"minimal",label:"Minimal"},{value:"low",label:"Low"},{value:"medium",label:"Medium"},{value:"high",label:"High"}];function Qy(e){var s;const t=e.currentTarget,n=(s=t.closest(".chat-model-bar"))==null?void 0:s.querySelector(".chat-settings-menu");if(!n)return;const i=n.classList.contains("active");if(document.querySelectorAll(".chat-settings-menu.active").forEach(o=>o.classList.remove("active")),!i){n.classList.add("active");const o=r=>{!n.contains(r.target)&&r.target!==t&&!t.contains(r.target)&&(n.classList.remove("active"),document.removeEventListener("click",o))};requestAnimationFrame(()=>document.addEventListener("click",o))}}function Yy(e){if(!e.connected)return k;const t=e.modelCatalog??[],n=Vy(t);if(n.length===0)return k;const i=e.modelProvider&&e.model?`${e.modelProvider}/${e.model}`:null,s=e.thinkingLevel??"off",o=e.verboseLevel==="on"||e.verboseLevel==="full",r=e.fillerEnabled===!0;return p`
2441
- <div class="chat-model-bar">
2442
- <div class="chat-model-bar__select">
2443
- <select
2444
- class="chat-model-bar__dropdown"
2445
- .value=${i??""}
2446
- @change=${a=>{const u=a.target.value;u&&e.onModelChange&&e.onModelChange(u)}}
2447
- >
2448
- ${n.map(a=>p`
2449
- <option value=${a.key} ?selected=${a.key===i}>
2450
- ${a.shortName} — ${a.description}
2451
- </option>
2452
- `)}
2453
- </select>
2454
- </div>
2455
- <div class="chat-model-bar__select">
2456
- <select
2457
- class="chat-model-bar__dropdown"
2458
- .value=${s}
2459
- @change=${a=>{const u=a.target.value;e.onThinkingLevelChange&&e.onThinkingLevelChange(u)}}
2460
- >
2461
- ${Gy.map(a=>p`
2462
- <option value=${a.value} ?selected=${a.value===s}>
2463
- Thinking: ${a.label}
2464
- </option>
2465
- `)}
2466
- </select>
2467
- </div>
2468
- <button
2469
- class="chat-model-bar__settings-btn"
2470
- type="button"
2471
- @click=${Qy}
2472
- aria-label="Message settings"
2473
- title="Message settings"
2474
- >
2475
- ${N.slidersHorizontal}
2476
- </button>
2477
- <div class="chat-settings-menu">
2478
- <label class="chat-settings-menu__item">
2479
- <input
2480
- type="checkbox"
2481
- .checked=${o}
2482
- @change=${a=>{const u=a.target.checked;e.onVerboseChange&&e.onVerboseChange(u?"on":"off")}}
2483
- />
2484
- <span>Verbose</span>
2485
- <span class="chat-settings-menu__hint">Detailed responses</span>
2486
- </label>
2487
- <label class="chat-settings-menu__item">
2488
- <input
2489
- type="checkbox"
2490
- .checked=${r}
2491
- @change=${a=>{const u=a.target.checked;e.onFillerChange&&e.onFillerChange(u)}}
2492
- />
2493
- <span>Filler</span>
2494
- <span class="chat-settings-menu__hint">Quick acks while thinking</span>
2495
- </label>
2496
- </div>
2497
- </div>
2498
- `}function Xy(e){const t=[];let n=null;for(const i of e){if(i.kind!=="message"){n&&(t.push(n),n=null),t.push(i);continue}const s=vl(i.message),o=bl(s.role),r=s.timestamp||Date.now();!n||n.role!==o?(n&&t.push(n),n={kind:"group",key:`group:${o}:${i.key}`,role:o,messages:[{message:i.message,key:i.key}],timestamp:r,isStreaming:!1}):n.messages.push({message:i.message,key:i.key})}return n&&t.push(n),t}function Zy(e){var o;const t=[],n=Array.isArray(e.messages)?e.messages:[],i=Array.isArray(e.toolMessages)?e.toolMessages:[],s=e.showThinking||e.verboseLevel==="on"||e.verboseLevel==="full";for(let r=0;r<n.length;r++){const a=n[r],u=vl(a);if(!s&&u.role.toLowerCase()==="toolresult"){const c=a,d=(Array.isArray(c.content)?c.content:[]).filter(h=>h.type==="image");d.length>0&&t.push({kind:"message",key:ks(a,r),message:{role:"assistant",content:d,timestamp:u.timestamp}});continue}t.push({kind:"message",key:ks(a,r),message:a})}if(s)for(let r=0;r<i.length;r++)t.push({kind:"message",key:ks(i[r],r+n.length),message:i[r]});if(e.interimText&&t.push({kind:"interim",key:"interim:thinking",text:e.interimText}),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 a=((o=r.attachments)==null?void 0:o.filter(c=>c.fileName).map(c=>c.fileName))??[],u=a.length>0?r.text?`${a.join(", ")}
2499
-
2500
- ${r.text}`:a.join(", "):r.text;t.push({kind:"message",key:`queue:${r.id}`,message:{role:"user",content:[{type:"text",text:u}],timestamp:r.createdAt}})}return Xy(t)}function ks(e,t){const n=e,i=typeof n.toolCallId=="string"?n.toolCallId:"";if(i)return`tool:${i}`;const s=typeof n.id=="string"?n.id:"";if(s)return`msg:${s}`;const o=typeof n.messageId=="string"?n.messageId:"";if(o)return`msg:${o}`;const r=typeof n.timestamp=="number"?n.timestamp:null,a=typeof n.role=="string"?n.role:"unknown";return r!=null?`msg:${a}:${r}:${t}`:`msg:${a}:${t}`}const Jy=p`<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"></path><polyline points="15 3 21 3 21 9"></polyline><line x1="10" y1="14" x2="21" y2="3"></line></svg>`;function ev(e){if(!e.connected)return p`
2501
- <div class="setup-container">
2502
- <div class="setup-card">
2503
- <div class="setup-spinner"></div>
2504
- <p>Connecting to gateway...</p>
2505
- </div>
2506
- </div>
2507
- `;const t=e.publicChatEnabled&&e.publicChatAccountId?p`<a
2508
- class="chat-public-link"
2509
- href="/public/chat/${e.publicChatAccountId}"
2510
- target="_blank"
2511
- rel="noopener"
2512
- title="Open public chat in new tab"
2513
- >Public ${Jy}</a>`:k;return p`
2514
- <div class="setup-container setup-container--full chat-page">
2515
- ${vt("Chat",e.wsProps)}
2516
- ${t}
2517
- <div class="chat-viewport">
2518
- ${lu(e)}
2519
- </div>
2520
- </div>
2521
- `}function tv(e){return e?`${hl(e)} (${$i(e)})`:"n/a"}function cu(e){const t=e.state??{},n=t.lastStatus??"n/a",i=t.lastRunAtMs?$i(t.lastRunAtMs):"never";return`${n} · last ${i}`}function uu(e){const t=e.schedule;return t.kind==="at"?`One-time: ${hl(t.atMs)}`:t.kind==="every"?`Every ${fl(t.everyMs)}`:nv(t.expr,t.tz)}function nv(e,t){const n=e.trim().split(/\s+/);if(n.length!==5)return e;const[i,s,o,r,a]=n,u=t?` (${t.replace(/^.*\//,"").replace(/_/g," ")})`:"",c=(b,S)=>new Date(2e3,0,1,b,S).toLocaleTimeString(void 0,{hour:"numeric",minute:"2-digit"}),l=/^\d{1,2}$/.test(i)?parseInt(i,10):null,d=Oa(s);if(l===null||!d)return`${e}${t?` (${t})`:""}`;const h=d.map(b=>c(b,l)),v=h.length<=3?h.join(" & "):`${h.slice(0,-1).join(", ")} & ${h[h.length-1]}`,f=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];if(o==="*"&&r==="*"){if(a==="*")return`Daily at ${v}${u}`;if(a==="1-5")return`Weekdays at ${v}${u}`;if(a==="0,6"||a==="6,0")return`Weekends at ${v}${u}`;const b=Oa(a);if(b)return`${b.map($=>f[$%7]??String($)).join(", ")} at ${v}${u}`}return`${e}${t?` (${t})`:""}`}function Oa(e){if(e==="*")return null;if(/^\d+(,\d+)*$/.test(e))return e.split(",").map(Number);if(/^\d+-\d+$/.test(e)){const[t,n]=e.split("-").map(Number);if(t>n)return null;const i=[];for(let s=t;s<=n;s++)i.push(s);return i}return null}function iv(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 Ba(e){const t=e.payload;if(t.kind!=="agentTurn")return null;const n=t.channel??t.provider,i=t.to;if(!i&&!n)return null;const s=[];return i&&s.push(i),n&&n!=="last"&&s.push(`via ${n}`),s.join(" ")||null}function sv(e){var s;const t=["last",...e.channels.filter(Boolean)],n=(s=e.form.channel)==null?void 0:s.trim();n&&!t.includes(n)&&t.push(n);const i=new Set;return t.filter(o=>i.has(o)?!1:(i.add(o),!0))}function ov(e,t){var i,s;if(t==="last")return"last";const n=(i=e.channelMeta)==null?void 0:i.find(o=>o.id===t);return n!=null&&n.label?n.label:((s=e.channelLabels)==null?void 0:s[t])??t}function rv(e){return e||"Default"}const Fa=p`<svg viewBox="0 0 24 24"><polygon points="5 3 19 12 5 21 5 3"/></svg>`,av=p`<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>`,lv=p`<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>`,du=p`<svg viewBox="0 0 24 24"><path d="M18 6 6 18"/><path d="m6 6 12 12"/></svg>`,cv=p`<svg viewBox="0 0 24 24"><path d="M12 5v14"/><path d="M5 12h14"/></svg>`;function Ua(e){const t=e.detailJobId?e.jobs.find(n=>n.id===e.detailJobId)??null:null;return p`
2522
- ${uv(e)}
2523
- ${dv(e)}
2524
- ${e.newEventModalOpen?hv(e):k}
2525
- ${t?gv(t,e):k}
2526
- `}function uv(e){const t=e.status,n=(t==null?void 0:t.enabled)??!1,i=(t==null?void 0:t.jobs)??0,s=t==null?void 0:t.nextWakeAtMs;return p`
2527
- <div class="event-status-bar">
2528
- <div class="event-status-bar__info">
2529
- <span class="statusDot ${n?"ok":""}"></span>
2530
- <span>${n?"Active":"Inactive"}</span>
2531
- <span class="event-status-bar__sep">\u00b7</span>
2532
- <span>${i} event${i!==1?"s":""}</span>
2533
- ${s?p`
2534
- <span class="event-status-bar__sep">\u00b7</span>
2535
- <span>Next: ${$i(s)}</span>
2536
- `:k}
2537
- <button
2538
- class="btn btn--sm"
2539
- ?disabled=${e.loading}
2540
- @click=${e.onRefresh}
2541
- style="margin-left: 4px;"
2542
- >
2543
- ${e.loading?"Refreshing…":"Refresh"}
2544
- </button>
2545
- ${e.error?p`<span class="muted">${e.error}</span>`:k}
2546
- </div>
2547
- <button class="btn primary btn--sm" @click=${e.onNewEventModalOpen}>
2548
- ${cv} New Event
2549
- </button>
2550
- </div>
2551
- `}function dv(e){return e.jobs.length===0?p`<div class="muted" style="padding: 20px 0;">No events yet. Create one to get started.</div>`:p`
2552
- <div class="event-grid">
2553
- ${e.jobs.map(t=>pv(t,e))}
2554
- </div>
2555
- `}function pv(e,t){return p`
2556
- <div
2557
- class="event-card ${e.enabled?"":"disabled"}"
2558
- @click=${()=>t.onDetailOpen(e)}
2559
- >
2560
- <div class="event-card__header">
2561
- <div class="event-card__name">${e.name||"Untitled"}</div>
2562
- <span class="chip ${e.enabled?"chip-ok":""}" style="font-size: 11px; padding: 2px 8px;">
2563
- ${e.enabled?"On":"Off"}
2564
- </span>
2565
- </div>
2566
- <div class="event-card__schedule">${uu(e)}</div>
2567
- ${e.agentId?p`<div class="event-card__agent">${rv(e.agentId)}</div>`:k}
2568
- ${Ba(e)?p`<div class="event-card__agent muted" style="font-size: 11px;">\u2192 ${Ba(e)}</div>`:k}
2569
- <div class="event-card__footer">
2570
- <div class="event-card__status">
2571
- <span class="muted" style="font-size: 11px;">${cu(e)}</span>
2572
- </div>
2573
- <div class="event-card__actions" @click=${n=>n.stopPropagation()}>
2574
- <button
2575
- class="btn-icon"
2576
- title="${e.enabled?"Pause":"Resume"}"
2577
- ?disabled=${t.busy}
2578
- @click=${()=>t.onToggle(e,!e.enabled)}
2579
- >
2580
- ${e.enabled?av:Fa}
2581
- </button>
2582
- <button
2583
- class="btn-icon"
2584
- title="Run now"
2585
- ?disabled=${t.busy}
2586
- @click=${()=>t.onRun(e)}
2587
- >
2588
- ${Fa}
2589
- </button>
2590
- <button
2591
- class="btn-icon danger"
2592
- title="Delete"
2593
- ?disabled=${t.busy}
2594
- @click=${()=>t.onRemove(e)}
2595
- >
2596
- ${lv}
2597
- </button>
2598
- </div>
2599
- </div>
2600
- </div>
2601
- `}function hv(e){const t=sv(e);return p`
2602
- <div class="event-modal-overlay" @click=${e.onNewEventModalClose}>
2603
- <div class="event-modal" @click=${n=>n.stopPropagation()}>
2604
- <div class="event-modal__header">
2605
- <div class="event-modal__title">New Event</div>
2606
- <button class="event-modal__close" @click=${e.onNewEventModalClose}>
2607
- ${du}
2608
- </button>
2609
- </div>
2610
-
2611
- <div class="form-grid">
2612
- <label class="field">
2613
- <span>Name</span>
2614
- <input
2615
- .value=${e.form.name}
2616
- @input=${n=>e.onFormChange({name:n.target.value})}
2617
- placeholder="e.g. Morning briefing"
2618
- />
2619
- </label>
2620
- <label class="field">
2621
- <span>Description</span>
2622
- <input
2623
- .value=${e.form.description}
2624
- @input=${n=>e.onFormChange({description:n.target.value})}
2625
- placeholder="What does this event do?"
2626
- />
2627
- </label>
2628
- <label class="field">
2629
- <span>Agent</span>
2630
- <select
2631
- .value=${e.form.agentId}
2632
- @change=${n=>e.onFormChange({agentId:n.target.value})}
2633
- >
2634
- <option value="">Default</option>
2635
- ${e.agentIds.map(n=>p`<option value=${n}>${n}</option>`)}
2636
- </select>
2637
- </label>
2638
- <label class="field checkbox">
2639
- <span>Enabled</span>
2640
- <input
2641
- type="checkbox"
2642
- .checked=${e.form.enabled}
2643
- @change=${n=>e.onFormChange({enabled:n.target.checked})}
2644
- />
2645
- </label>
2646
- <label class="field">
2647
- <span>Timing</span>
2648
- <select
2649
- .value=${e.form.scheduleKind}
2650
- @change=${n=>e.onFormChange({scheduleKind:n.target.value})}
2651
- >
2652
- <option value="every">Repeating</option>
2653
- <option value="at">One-time</option>
2654
- <option value="cron">Custom schedule</option>
2655
- </select>
2656
- </label>
2657
- </div>
2658
-
2659
- ${fv(e)}
2660
-
2661
- <div class="form-grid" style="margin-top: 12px;">
2662
- <label class="field">
2663
- <span>Session type</span>
2664
- <select
2665
- .value=${e.form.sessionTarget}
2666
- @change=${n=>e.onFormChange({sessionTarget:n.target.value})}
2667
- >
2668
- <option value="main">Shared session</option>
2669
- <option value="isolated">Separate session</option>
2670
- </select>
2671
- </label>
2672
- <label class="field">
2673
- <span>When to run</span>
2674
- <select
2675
- .value=${e.form.wakeMode}
2676
- @change=${n=>e.onFormChange({wakeMode:n.target.value})}
2677
- >
2678
- <option value="next-heartbeat">Next available time</option>
2679
- <option value="now">Right away</option>
2680
- </select>
2681
- </label>
2682
- <label class="field">
2683
- <span>Action type</span>
2684
- <select
2685
- .value=${e.form.payloadKind}
2686
- @change=${n=>e.onFormChange({payloadKind:n.target.value})}
2687
- >
2688
- <option value="systemEvent">Background task</option>
2689
- <option value="agentTurn">Send a message</option>
2690
- </select>
2691
- </label>
2692
- </div>
2693
-
2694
- <label class="field" style="margin-top: 12px;">
2695
- <span>${e.form.payloadKind==="systemEvent"?"Task description":"Message to send"}</span>
2696
- <textarea
2697
- .value=${e.form.payloadText}
2698
- @input=${n=>e.onFormChange({payloadText:n.target.value})}
2699
- rows="4"
2700
- placeholder="${e.form.payloadKind==="systemEvent"?"Describe what the assistant should do…":"Type the message to send…"}"
2701
- ></textarea>
2702
- </label>
2703
-
2704
- ${e.form.payloadKind==="agentTurn"?p`
2705
- <div class="form-grid" style="margin-top: 12px;">
2706
- <label class="field checkbox">
2707
- <span>Deliver response</span>
2708
- <input
2709
- type="checkbox"
2710
- .checked=${e.form.deliver}
2711
- @change=${n=>e.onFormChange({deliver:n.target.checked})}
2712
- />
2713
- </label>
2714
- <label class="field">
2715
- <span>Channel</span>
2716
- <select
2717
- .value=${e.form.channel||"last"}
2718
- @change=${n=>e.onFormChange({channel:n.target.value})}
2719
- >
2720
- ${t.map(n=>p`<option value=${n}>
2721
- ${ov(e,n)}
2722
- </option>`)}
2723
- </select>
2724
- </label>
2725
- <label class="field">
2726
- <span>Send to</span>
2727
- <input
2728
- .value=${e.form.to}
2729
- @input=${n=>e.onFormChange({to:n.target.value})}
2730
- placeholder="+1555\u2026 or chat id"
2731
- />
2732
- </label>
2733
- <label class="field">
2734
- <span>Timeout (seconds)</span>
2735
- <input
2736
- .value=${e.form.timeoutSeconds}
2737
- @input=${n=>e.onFormChange({timeoutSeconds:n.target.value})}
2738
- />
2739
- </label>
2740
- ${e.form.sessionTarget==="isolated"?p`
2741
- <label class="field">
2742
- <span>Summary prefix</span>
2743
- <input
2744
- .value=${e.form.postToMainPrefix}
2745
- @input=${n=>e.onFormChange({postToMainPrefix:n.target.value})}
2746
- />
2747
- </label>
2748
- `:k}
2749
- </div>
2750
- `:k}
2751
-
2752
- <div class="row" style="margin-top: 16px; justify-content: flex-end;">
2753
- <button class="btn" @click=${e.onNewEventModalClose}>Cancel</button>
2754
- <button class="btn primary" ?disabled=${e.busy} @click=${e.onAdd}>
2755
- ${e.busy?"Creating…":"Create Event"}
2756
- </button>
2757
- </div>
2758
- </div>
2759
- </div>
2760
- `}function fv(e){const t=e.form;return t.scheduleKind==="at"?p`
2761
- <label class="field" style="margin-top: 12px;">
2762
- <span>Run at</span>
2763
- <input
2764
- type="datetime-local"
2765
- .value=${t.scheduleAt}
2766
- @input=${n=>e.onFormChange({scheduleAt:n.target.value})}
2767
- />
2768
- </label>
2769
- `:t.scheduleKind==="every"?p`
2770
- <div class="form-grid" style="margin-top: 12px;">
2771
- <label class="field">
2772
- <span>Repeat every</span>
2773
- <input
2774
- .value=${t.everyAmount}
2775
- @input=${n=>e.onFormChange({everyAmount:n.target.value})}
2776
- />
2777
- </label>
2778
- <label class="field">
2779
- <span>Unit</span>
2780
- <select
2781
- .value=${t.everyUnit}
2782
- @change=${n=>e.onFormChange({everyUnit:n.target.value})}
2783
- >
2784
- <option value="minutes">Minutes</option>
2785
- <option value="hours">Hours</option>
2786
- <option value="days">Days</option>
2787
- </select>
2788
- </label>
2789
- </div>
2790
- `:p`
2791
- <div class="form-grid" style="margin-top: 12px;">
2792
- <label class="field">
2793
- <span>Cron expression</span>
2794
- <input
2795
- .value=${t.cronExpr}
2796
- @input=${n=>e.onFormChange({cronExpr:n.target.value})}
2797
- placeholder="e.g. 0 7 * * *"
2798
- />
2799
- </label>
2800
- <label class="field">
2801
- <span>Timezone (optional)</span>
2802
- <input
2803
- .value=${t.cronTz}
2804
- @input=${n=>e.onFormChange({cronTz:n.target.value})}
2805
- placeholder="e.g. America/New_York"
2806
- />
2807
- </label>
2808
- </div>
2809
- `}function gv(e,t){var n;return p`
2810
- <div class="event-modal-overlay" @click=${t.onDetailClose}>
2811
- <div class="event-modal" @click=${i=>i.stopPropagation()}>
2812
- <div class="event-modal__header">
2813
- <div class="event-modal__title">${e.name||"Untitled Event"}</div>
2814
- <button class="event-modal__close" @click=${t.onDetailClose}>
2815
- ${du}
2816
- </button>
2817
- </div>
2818
-
2819
- ${e.description?p`<div style="color: var(--muted); font-size: 13px; margin-bottom: 16px;">${e.description}</div>`:k}
2820
-
2821
- <div class="event-detail-section">
2822
- <div class="event-detail-row">
2823
- <span class="event-detail-label">Status</span>
2824
- <span class="event-detail-value">
2825
- <span class="chip ${e.enabled?"chip-ok":""}" style="font-size: 11px; padding: 2px 8px;">
2826
- ${e.enabled?"Enabled":"Disabled"}
2827
- </span>
2828
- </span>
2829
- </div>
2830
- <div class="event-detail-row">
2831
- <span class="event-detail-label">Schedule</span>
2832
- <span class="event-detail-value">${uu(e)}</span>
2833
- </div>
2834
- ${e.agentId?p`
2835
- <div class="event-detail-row">
2836
- <span class="event-detail-label">Agent</span>
2837
- <span class="event-detail-value mono">${e.agentId}</span>
2838
- </div>
2839
- `:k}
2840
- <div class="event-detail-row">
2841
- <span class="event-detail-label">Session</span>
2842
- <span class="event-detail-value">
2843
- ${e.sessionTarget==="main"?"Shared":"Separate"}
2844
- </span>
2845
- </div>
2846
- <div class="event-detail-row">
2847
- <span class="event-detail-label">Run mode</span>
2848
- <span class="event-detail-value">
2849
- ${e.wakeMode==="now"?"Right away":"Next available time"}
2850
- </span>
2851
- </div>
2852
- <div class="event-detail-row" style="flex-direction: column; align-items: stretch; gap: 4px;">
2853
- <span class="event-detail-label">Action</span>
2854
- <span class="event-detail-value" style="text-align: left; white-space: pre-wrap; font-size: 12px; color: var(--muted); line-height: 1.5;">${iv(e,!1)}</span>
2855
- </div>
2856
- ${e.payload.kind==="agentTurn"&&e.payload.to?p`
2857
- <div class="event-detail-row">
2858
- <span class="event-detail-label">Send to</span>
2859
- <span class="event-detail-value mono">${e.payload.to}</span>
2860
- </div>
2861
- `:k}
2862
- ${e.payload.kind==="agentTurn"&&(e.payload.channel??e.payload.provider)?p`
2863
- <div class="event-detail-row">
2864
- <span class="event-detail-label">Channel</span>
2865
- <span class="event-detail-value">${e.payload.channel??e.payload.provider}</span>
2866
- </div>
2867
- `:k}
2868
- ${e.payload.kind==="agentTurn"?p`
2869
- <div class="event-detail-row">
2870
- <span class="event-detail-label">Auto-deliver</span>
2871
- <span class="event-detail-value">${e.payload.deliver?"Yes":"No"}</span>
2872
- </div>
2873
- `:k}
2874
- </div>
2875
-
2876
- <div class="event-detail-section">
2877
- <div class="event-detail-row">
2878
- <span class="event-detail-label">Last run</span>
2879
- <span class="event-detail-value">${cu(e)}</span>
2880
- </div>
2881
- ${(n=e.state)!=null&&n.nextRunAtMs?p`
2882
- <div class="event-detail-row">
2883
- <span class="event-detail-label">Next run</span>
2884
- <span class="event-detail-value">${tv(e.state.nextRunAtMs)}</span>
2885
- </div>
2886
- `:k}
2887
- </div>
2888
-
2889
- <div class="event-detail-section">
2890
- <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 12px;">
2891
- <span class="event-detail-label" style="font-size: 14px;">Recent Activity</span>
2892
- </div>
2893
- ${t.runs.length===0?p`<div class="muted" style="font-size: 13px;">No runs recorded yet.</div>`:p`
2894
- <div class="list">
2895
- ${[...t.runs].sort((i,s)=>s.ts-i.ts).map(i=>yv(i))}
2896
- </div>
2897
- `}
2898
- </div>
2899
-
2900
- <div class="row" style="margin-top: 16px; gap: 8px; justify-content: flex-end;">
2901
- <button
2902
- class="btn"
2903
- ?disabled=${t.busy}
2904
- @click=${()=>t.onToggle(e,!e.enabled)}
2905
- >
2906
- ${e.enabled?"Disable":"Enable"}
2907
- </button>
2908
- <button
2909
- class="btn primary"
2910
- ?disabled=${t.busy}
2911
- @click=${()=>t.onRun(e)}
2912
- >
2913
- Run Now
2914
- </button>
2915
- <button
2916
- class="btn danger"
2917
- ?disabled=${t.busy}
2918
- @click=${()=>{t.onRemove(e),t.onDetailClose()}}
2919
- >
2920
- Delete
2921
- </button>
2922
- </div>
2923
- </div>
2924
- </div>
2925
- `}function mv(e){const t=e.toLowerCase();return t==="ok"||t==="success"?"chip chip-ok":t==="error"||t==="fail"||t==="failed"?"chip chip-warn":"chip"}function yv(e){return p`
2926
- <div class="list-item" style="grid-template-columns: 1fr; gap: 6px;">
2927
- <div style="display: flex; align-items: center; gap: 8px; flex-wrap: wrap;">
2928
- <span class=${mv(e.status)} style="font-size: 11px; padding: 2px 8px;">
2929
- ${e.status}
2930
- </span>
2931
- <span class="muted" style="font-size: 12px;">${$i(e.ts)}</span>
2932
- <span class="muted" style="font-size: 12px;">${fl(e.durationMs)}</span>
2933
- </div>
2934
- ${e.summary?p`<div class="muted" style="font-size: 12px;">${e.summary}</div>`:k}
2935
- ${e.error?p`
2936
- <details style="margin-top: 2px;">
2937
- <summary class="muted" style="cursor: pointer; font-size: 12px;">Error details</summary>
2938
- <div class="muted" style="margin-top: 4px; white-space: pre-wrap; font-size: 12px;">${e.error}</div>
2939
- </details>
2940
- `:k}
2941
- </div>
2942
- `}function vv(e){var s;const t=((s=e.report)==null?void 0:s.skills)??[],n=e.filter.trim().toLowerCase(),i=n?t.filter(o=>[o.name,o.description,o.source].join(" ").toLowerCase().includes(n)):t;return p`
2943
- <section class="card">
2944
- <div class="row" style="justify-content: space-between;">
2945
- <div>
2946
- <div class="card-title">Skills</div>
2947
- <div class="card-sub">Bundled, managed, and workspace skills.</div>
2948
- </div>
2949
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
2950
- ${e.loading?"Loading…":"Refresh"}
2951
- </button>
2952
- </div>
2953
-
2954
- <div class="filters" style="margin-top: 14px;">
2955
- <label class="field" style="flex: 1;">
2956
- <span>Filter</span>
2957
- <input
2958
- .value=${e.filter}
2959
- @input=${o=>e.onFilterChange(o.target.value)}
2960
- placeholder="Search skills"
2961
- />
2962
- </label>
2963
- <div class="muted">${i.length} shown</div>
2964
- </div>
2965
-
2966
- ${e.error?p`<div class="callout danger" style="margin-top: 12px;">${e.error}</div>`:k}
2967
-
2968
- ${i.length===0?p`<div class="muted" style="margin-top: 16px;">No skills found.</div>`:p`
2969
- <div class="list" style="margin-top: 16px;">
2970
- ${i.map(o=>bv(o,e))}
2971
- </div>
2972
- `}
2973
- </section>
2974
- `}function bv(e,t){const n=t.busyKey===e.skillKey,i=t.edits[e.skillKey]??"",s=t.messages[e.skillKey]??null,o=e.install.length>0&&e.missing.bins.length>0,r=[...e.missing.bins.map(u=>`bin:${u}`),...e.missing.env.map(u=>`env:${u}`),...e.missing.config.map(u=>`config:${u}`),...e.missing.os.map(u=>`os:${u}`)],a=[];return e.disabled&&a.push("disabled"),e.blockedByAllowlist&&a.push("blocked by allowlist"),p`
2975
- <div class="list-item">
2976
- <div class="list-main">
2977
- <div class="list-title">
2978
- ${e.emoji?`${e.emoji} `:""}${e.name}
2979
- </div>
2980
- <div class="list-sub">${Sd(e.description,140)}</div>
2981
- <div class="chip-row" style="margin-top: 6px;">
2982
- <span class="chip">${e.source}</span>
2983
- <span class="chip ${e.eligible?"chip-ok":"chip-warn"}">
2984
- ${e.eligible?"eligible":"blocked"}
2985
- </span>
2986
- ${e.disabled?p`<span class="chip chip-warn">disabled</span>`:k}
2987
- </div>
2988
- ${r.length>0?p`
2989
- <div class="muted" style="margin-top: 6px;">
2990
- Missing: ${r.join(", ")}
2991
- </div>
2992
- `:k}
2993
- ${a.length>0?p`
2994
- <div class="muted" style="margin-top: 6px;">
2995
- Reason: ${a.join(", ")}
2996
- </div>
2997
- `:k}
2998
- </div>
2999
- <div class="list-meta">
3000
- <div class="row" style="justify-content: flex-end; flex-wrap: wrap;">
3001
- <button
3002
- class="btn"
3003
- ?disabled=${n}
3004
- @click=${()=>t.onToggle(e.skillKey,e.disabled)}
3005
- >
3006
- ${e.disabled?"Enable":"Disable"}
3007
- </button>
3008
- ${o?p`<button
3009
- class="btn"
3010
- ?disabled=${n}
3011
- @click=${()=>t.onInstall(e.skillKey,e.name,e.install[0].id)}
3012
- >
3013
- ${n?"Installing…":e.install[0].label}
3014
- </button>`:k}
3015
- </div>
3016
- ${s?p`<div
3017
- class="muted"
3018
- style="margin-top: 8px; color: ${s.kind==="error"?"var(--danger-color, #d14343)":"var(--success-color, #0a7f5a)"};"
3019
- >
3020
- ${s.message}
3021
- </div>`:k}
3022
- ${e.primaryEnv?p`
3023
- <div class="field" style="margin-top: 10px;">
3024
- <span>API key</span>
3025
- <input
3026
- type="password"
3027
- .value=${i}
3028
- @input=${u=>t.onEdit(e.skillKey,u.target.value)}
3029
- />
3030
- </div>
3031
- <button
3032
- class="btn primary"
3033
- style="margin-top: 8px;"
3034
- ?disabled=${n}
3035
- @click=${()=>t.onSaveKey(e.skillKey)}
3036
- >
3037
- Save key
3038
- </button>
3039
- `:k}
3040
- </div>
3041
- </div>
3042
- `}const Wa=["user","assistant","tool","thinking","error"],Ka={user:"User",assistant:"Assistant",tool:"Tool",thinking:"Thinking",error:"Error",system:"System"};function wv(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleString(void 0,{day:"numeric",month:"short",hour:"2-digit",minute:"2-digit",second:"2-digit"})}function kv(e){return e.split(":").slice(2).join(":")||e}function Sv(e,t){return t?[e.content,e.agentId,e.sessionKey,e.sessionId,e.toolName].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function xv(e,t=500){return e.length<=t?e:e.slice(0,t)+"..."}function $v(e){const t=e.filterText.trim().toLowerCase();Wa.some(i=>!e.typeFilters[i]),e.agents.some(i=>!e.agentFilters[i]);const n=e.entries.filter(i=>!e.typeFilters[i.type]||e.agents.length>0&&!(e.agentFilters[i.agentId]??!0)?!1:Sv(i,t));return p`
3043
- <div>
3044
- <div class="filters" style="margin-top: 14px;">
3045
- <label class="field" style="min-width: 220px;">
3046
- <span>Filter</span>
3047
- <input
3048
- .value=${e.filterText}
3049
- @input=${i=>e.onFilterTextChange(i.target.value)}
3050
- placeholder="Search session logs"
3051
- />
3052
- </label>
3053
- </div>
3054
-
3055
- <div class="chip-row" style="margin-top: 12px;">
3056
- ${Wa.map(i=>p`
3057
- <label class="chip session-log-chip ${i}">
3058
- <input
3059
- type="checkbox"
3060
- .checked=${e.typeFilters[i]}
3061
- @change=${s=>e.onTypeToggle(i,s.target.checked)}
3062
- />
3063
- <span>${Ka[i]}</span>
3064
- </label>
3065
- `)}
3066
- </div>
3067
-
3068
- <div class="chip-row" style="margin-top: 8px; align-items: center;">
3069
- ${e.agents.map(i=>p`
3070
- <label class="chip agent-chip">
3071
- <input
3072
- type="checkbox"
3073
- .checked=${e.agentFilters[i]??!0}
3074
- @change=${s=>e.onAgentToggle(i,s.target.checked)}
3075
- />
3076
- <span>${i}</span>
3077
- </label>
3078
- `)}
3079
- <label class="chip">
3080
- <input
3081
- type="checkbox"
3082
- .checked=${e.autoFollow}
3083
- @change=${i=>e.onToggleAutoFollow(i.target.checked)}
3084
- />
3085
- <span>Auto-follow</span>
3086
- </label>
3087
- </div>
3088
-
3089
- ${e.error?p`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:k}
3090
-
3091
- <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
3092
- ${n.length===0?p`<div class="muted" style="padding: 12px;">No session log entries.</div>`:n.map(i=>p`
3093
- <div class="log-row session-entry ${i.type}">
3094
- <div class="log-row-header">
3095
- <span class="log-time mono">${wv(i.timestamp)}</span>
3096
- <span class="session-log-type ${i.type}">${Ka[i.type]}</span>
3097
- <span class="log-subsystem mono">${i.agentId}</span>
3098
- <span class="session-label mono">${kv(i.sessionKey)}</span>
3099
- ${i.toolName?p`<span class="session-tool mono">${i.toolName}</span>`:k}
3100
- ${i.model?p`<span class="session-model mono">${i.model}</span>`:k}
3101
- </div>
3102
- <div class="log-message mono">${xv(i.content)}</div>
3103
- </div>
3104
- `)}
3105
- </div>
3106
- </div>
3107
- `}const Ys=["trace","debug","info","warn","error","fatal"];function Av(e){if(!e)return"";const t=new Date(e);return Number.isNaN(t.getTime())?e:t.toLocaleTimeString()}function pu(e,t){return t?[e.message,e.subsystem,e.raw].filter(Boolean).join(" ").toLowerCase().includes(t):!0}function Ev(e){return p`
3108
- <section class="card">
3109
- <div class="row" style="justify-content: space-between;">
3110
- <div>
3111
- <div class="card-title">Logs</div>
3112
- <div class="card-sub">Session transcripts and system logs.</div>
3113
- </div>
3114
- <div class="row" style="gap: 8px;">
3115
- ${e.logsSubTab==="system"?p`
3116
- <button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
3117
- ${e.loading?"Loading…":"Refresh"}
3118
- </button>
3119
- <button
3120
- class="btn"
3121
- ?disabled=${e.entries.length===0}
3122
- @click=${()=>{const t=e.filterText.trim().toLowerCase(),n=Ys.some(o=>!e.levelFilters[o]),i=e.entries.filter(o=>o.level&&!e.levelFilters[o.level]?!1:pu(o,t)),s=t||n?"filtered":"visible";e.onExport(i.map(o=>o.raw),s)}}
3123
- >
3124
- Export
3125
- </button>
3126
- `:p`
3127
- <button class="btn" ?disabled=${e.sessionLogsProps.loading} @click=${e.sessionLogsProps.onRefresh}>
3128
- ${e.sessionLogsProps.loading?"Loading…":"Refresh"}
3129
- </button>
3130
- <button
3131
- class="btn"
3132
- ?disabled=${e.sessionLogsProps.entries.length===0}
3133
- @click=${()=>{const t=e.sessionLogsProps,n=t.filterText.trim().toLowerCase(),s=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.sessionId,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(s,n?"filtered":"visible")}}
3134
- >
3135
- Export
3136
- </button>
3137
- `}
3138
- </div>
3139
- </div>
3140
-
3141
- <div class="sp-tabs" style="margin-top: 12px;">
3142
- <button class="sp-tab ${e.logsSubTab==="session"?"active":""}"
3143
- @click=${()=>e.onSubTabChange("session")}>
3144
- Session Logs
3145
- </button>
3146
- <button class="sp-tab ${e.logsSubTab==="system"?"active":""}"
3147
- @click=${()=>e.onSubTabChange("system")}>
3148
- System Logs
3149
- </button>
3150
- </div>
3151
-
3152
- ${e.logsSubTab==="session"?$v(e.sessionLogsProps):Cv(e)}
3153
- </section>
3154
- `}function Cv(e){const t=e.filterText.trim().toLowerCase();Ys.some(i=>!e.levelFilters[i]);const n=e.entries.filter(i=>i.level&&!e.levelFilters[i.level]?!1:pu(i,t));return p`
3155
- <div class="filters" style="margin-top: 14px;">
3156
- <label class="field" style="min-width: 220px;">
3157
- <span>Filter</span>
3158
- <input
3159
- .value=${e.filterText}
3160
- @input=${i=>e.onFilterTextChange(i.target.value)}
3161
- placeholder="Search logs"
3162
- />
3163
- </label>
3164
- <label class="field checkbox">
3165
- <span>Auto-follow</span>
3166
- <input
3167
- type="checkbox"
3168
- .checked=${e.autoFollow}
3169
- @change=${i=>e.onToggleAutoFollow(i.target.checked)}
3170
- />
3171
- </label>
3172
- </div>
3173
-
3174
- <div class="chip-row" style="margin-top: 12px;">
3175
- ${Ys.map(i=>p`
3176
- <label class="chip log-chip ${i}">
3177
- <input
3178
- type="checkbox"
3179
- .checked=${e.levelFilters[i]}
3180
- @change=${s=>e.onLevelToggle(i,s.target.checked)}
3181
- />
3182
- <span>${i}</span>
3183
- </label>
3184
- `)}
3185
- </div>
3186
-
3187
- ${e.file?p`<div class="muted" style="margin-top: 10px;">File: ${e.file}</div>`:k}
3188
- ${e.truncated?p`<div class="callout" style="margin-top: 10px;">
3189
- Log output truncated; showing latest chunk.
3190
- </div>`:k}
3191
- ${e.error?p`<div class="callout danger" style="margin-top: 10px;">${e.error}</div>`:k}
3192
-
3193
- <div class="log-stream" style="margin-top: 12px;" @scroll=${e.onScroll}>
3194
- ${n.length===0?p`<div class="muted" style="padding: 12px;">No log entries.</div>`:[...n].reverse().map(i=>p`
3195
- <div class="log-row">
3196
- <div class="log-row-header">
3197
- <span class="log-time mono">${Av(i.time)}</span>
3198
- <span class="log-level ${i.level??""}">${i.level??""}</span>
3199
- <span class="log-subsystem mono">${i.subsystem??""}</span>
3200
- </div>
3201
- <div class="log-message mono">${i.message??i.raw}</div>
3202
- </div>
3203
- `)}
3204
- </div>
3205
- `}const Tv=[{id:"cron",label:"Events"},{id:"skills",label:"Skills"},{id:"logs",label:"Logs"}];function _v(e){switch(e.activeTab){case"cron":return Ua(e.cronProps);case"skills":return vv(e.skillsProps);case"logs":return Ev(e.logsProps);default:return Ua(e.cronProps)}}function Mv(e){return e.connected?p`
3206
- <div class="setup-container">
3207
- ${vt("Advanced",e.wsProps)}
3208
- <div class="setup-card sp-card-advanced" style="text-align: left;">
3209
- <h1>Advanced</h1>
3210
- <div class="sp-tabs">
3211
- ${Tv.map(t=>p`
3212
- <button
3213
- class="sp-tab ${e.activeTab===t.id?"active":""}"
3214
- @click=${()=>e.onTabChange(t.id)}
3215
- >
3216
- ${t.label}
3217
- </button>
3218
- `)}
3219
- </div>
3220
- ${_v(e)}
3221
- </div>
3222
- </div>
3223
- `:p`
3224
- <div class="setup-container">
3225
- <div class="setup-card">
3226
- <div class="setup-spinner"></div>
3227
- <p>Connecting to gateway...</p>
3228
- </div>
3229
- </div>
3230
- `}function za(e){if(!e.show)return k;const t=Xe(),n=e.isFirstTime,i=e.changePinMode===!0&&!n,s=e.changePinBusy===!0;let o=e.accounts.length>0?e.accounts[0].id:"";const r=h=>{var f;o=h.target.value;const v=(f=h.target.closest(".login-card"))==null?void 0:f.querySelector(".login-change-pin");v&&(v.style.display=o==="__master__"?"":"none")},a=h=>v=>{const f=v.target;f.value=f.value.replace(/\D/g,"").slice(0,6),h(f.value)},u=!n&&e.accounts.length>1?p`
3231
- <select
3232
- class="login-account-select"
3233
- @change=${r}
3234
- ?disabled=${e.busy||s}
3235
- >
3236
- ${e.accounts.map((h,v)=>p`
3237
- <option value=${h.id} ?selected=${v===0}>
3238
- ${h.displayName}
3239
- </option>
3240
- `)}
3241
- </select>
3242
- `:k;if(i){let h="",v="",f="";const b=S=>{var $;S.preventDefault(),!s&&(!h||!v||!f||v===f&&o&&(($=e.onChangePin)==null||$.call(e,o,h,v)))};return p`
3243
- <div class="login-overlay">
3244
- <div class="login-card">
3245
- <img class="login-logo" src="${t.iconUrl}" alt="${t.name}" />
3246
- <h2 class="login-title">Change PIN</h2>
3247
- <p class="login-subtitle">Enter your current PIN, then choose a new one</p>
3248
- <form class="login-form" @submit=${b}>
3249
- ${u}
3250
- <input
3251
- class="login-pin-input"
3252
- type="password"
3253
- inputmode="numeric"
3254
- pattern="[0-9]*"
3255
- minlength="4"
3256
- maxlength="6"
3257
- placeholder="Current PIN"
3258
- ?disabled=${s}
3259
- @input=${a(S=>{h=S})}
3260
- autofocus
3261
- />
3262
- <input
3263
- class="login-pin-input"
3264
- type="password"
3265
- inputmode="numeric"
3266
- pattern="[0-9]*"
3267
- minlength="4"
3268
- maxlength="6"
3269
- placeholder="New PIN (4-6 digits)"
3270
- ?disabled=${s}
3271
- @input=${a(S=>{v=S})}
3272
- />
3273
- <input
3274
- class="login-pin-input"
3275
- type="password"
3276
- inputmode="numeric"
3277
- pattern="[0-9]*"
3278
- minlength="4"
3279
- maxlength="6"
3280
- placeholder="Confirm new PIN"
3281
- ?disabled=${s}
3282
- @input=${a(S=>{f=S})}
3283
- />
3284
- ${e.changePinError?p`<p class="login-error">${e.changePinError}</p>`:k}
3285
- ${e.changePinSuccess?p`<p class="login-success">${e.changePinSuccess}</p>`:k}
3286
- <button
3287
- class="login-submit"
3288
- type="submit"
3289
- ?disabled=${s}
3290
- >${s?p`<span class="login-spinner"></span>`:"Change PIN"}</button>
3291
- </form>
3292
- <p class="login-hint" style="margin-top: 16px;">
3293
- <a
3294
- class="login-link"
3295
- href="#"
3296
- @click=${S=>{var $;S.preventDefault(),($=e.onToggleChangePinMode)==null||$.call(e)}}
3297
- >Back to login</a>
3298
- </p>
3299
- </div>
3300
- </div>
3301
- `}let c="",l="";const d=h=>{if(h.preventDefault(),!e.busy)if(n){if(!c||!l||c!==l)return;e.onSubmit(c)}else{if(!c||!o)return;e.onSubmit(o,c)}};return p`
3302
- <div class="login-overlay">
3303
- <div class="login-card">
3304
- <img class="login-logo" src="${t.iconUrl}" alt="${t.name}" />
3305
- <h2 class="login-title">${t.name}</h2>
3306
- <p class="login-subtitle">
3307
- ${n?"Set a PIN to protect this device":"Enter your PIN to continue"}
3308
- </p>
3309
- <form class="login-form" @submit=${d}>
3310
- ${u}
3311
- <input
3312
- class="login-pin-input"
3313
- type="password"
3314
- inputmode="numeric"
3315
- pattern="[0-9]*"
3316
- minlength="4"
3317
- maxlength="6"
3318
- placeholder="${n?"Choose a 4-6 digit PIN":"PIN"}"
3319
- ?disabled=${e.busy}
3320
- @input=${a(h=>{c=h})}
3321
- autofocus
3322
- />
3323
- ${n?p`
3324
- <input
3325
- class="login-pin-input"
3326
- type="password"
3327
- inputmode="numeric"
3328
- pattern="[0-9]*"
3329
- minlength="4"
3330
- maxlength="6"
3331
- placeholder="Confirm PIN"
3332
- ?disabled=${e.busy}
3333
- @input=${a(h=>{l=h})}
3334
- />
3335
- `:k}
3336
- ${e.error?p`<p class="login-error">${e.error}</p>`:k}
3337
- <button
3338
- class="login-submit"
3339
- type="submit"
3340
- ?disabled=${e.busy}
3341
- >
3342
- ${e.busy?p`<span class="login-spinner"></span>`:n?"Set PIN":"Unlock"}
3343
- </button>
3344
- </form>
3345
- ${n?p`<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(h=>h.id==="__master__")?p`<p class="login-hint login-change-pin" style="margin-top: 16px;${o!=="__master__"?" display: none;":""}">
3346
- <a
3347
- class="login-link"
3348
- href="#"
3349
- @click=${h=>{var v;h.preventDefault(),(v=e.onToggleChangePinMode)==null||v.call(e)}}
3350
- >Change PIN</a>
3351
- </p>`:k}
3352
- </div>
3353
- </div>
3354
- `}function Pv(e){if(!e.connected)return p`
3355
- <div class="setup-container">
3356
- <div class="setup-card">
3357
- <div class="setup-spinner"></div>
3358
- <p>Connecting...</p>
3359
- </div>
3360
- </div>
3361
- `;const t={...e,sessions:null,focusMode:!1,showThinking:!1,thinkingLevel:null,publicMode:!0,onToggleFocusMode:()=>{},onSessionKeyChange:()=>{},onNewSession:()=>{}},n=e.assistantName||"Assistant";return p`
3362
- <div class="setup-container setup-container--full public-chat-page">
3363
- <div class="public-chat-header">
3364
- <span class="public-chat-header__name">${n}</span>
3365
- </div>
3366
- <div class="chat-viewport">
3367
- ${lu(t)}
3368
- </div>
3369
- </div>
3370
- `}async function Lv(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 kn(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 Iv(e,t){var i,s;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 o=await e.client.request("config.get",{});e.configSnapshot=o;const r=o.hash;if(!r){e.workspacesError="Config hash missing; reload and retry.";return}const a={name:n,baseHash:r,whatsappAccountName:n};(i=t.workspacePath)!=null&&i.trim()&&(a.workspaceDir=t.workspacePath.trim());const u=await e.client.request("workspaces.create",a);e.addingWorkspace=!1,e.newWorkspaceName="",e.newWorkspacePath="",await kn(e),(s=t.onCreated)==null||s.call(t,u)}catch(o){e.workspacesError=String(o)}finally{e.workspaceSaving=!1}}async function Rv(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 i=n.hash;if(!i){e.workspacesError="Config hash missing; reload and retry.";return}await e.client.request("workspaces.remove",{name:t,baseHash:i}),e.workspaceRemoveConfirm=null,await kn(e)}catch(n){e.workspacesError=String(n)}finally{e.workspaceSaving=!1}}}async function Nv(e,t,n){if(!(!e.client||!e.connected)){e.workspacesError=null;try{const i=await e.client.request("config.get",{});e.configSnapshot=i;const s=i.hash;if(!s){e.workspacesError="Config hash missing; reload and retry.";return}await e.client.request("workspaces.rename",{name:t,displayName:n,baseHash:s}),await kn(e)}catch(i){e.workspacesError=String(i)}}}const Vn=Object.freeze(Object.defineProperty({__proto__:null,createWorkspace:Iv,loadWorkspaces:kn,removeWorkspace:Rv,renameWorkspace:Nv},Symbol.toStringTag,{value:"Module"})),hu={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",PUBLIC_CHAT:"public-chat"},ja=hu,Xs={WEBCHAT:"webchat",CLI:"cli",UI:"ui",BACKEND:"backend",NODE:"node",PROBE:"probe",TEST:"test"};new Set(Object.values(hu));new Set(Object.values(Xs));function Dv(e){const t=e.version??(e.nonce?"v2":"v1"),n=e.scopes.join(","),i=e.token??"",s=[t,e.deviceId,e.clientId,e.clientMode,e.role,n,String(e.signedAtMs),i];return t==="v2"&&s.push(e.nonce??""),s.join("|")}const Ov=4008;class Bv{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(){var t;this.closed=!0,(t=this.ws)==null||t.close(),this.ws=null,this.flushPending(new Error("gateway client stopped"))}get connected(){var t;return((t=this.ws)==null?void 0:t.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=>{var i,s;const n=String(t.reason??"");this.ws=null,this.flushPending(new Error(`gateway closed (${t.code}): ${n}`)),(s=(i=this.opts).onClose)==null||s.call(i,{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(){var d;if(this.connectSent)return;this.connectSent=!0,this.connectTimer!==null&&(window.clearTimeout(this.connectTimer),this.connectTimer=null);const t=this.opts.role??"operator",n=this.opts.scopes??["operator.admin","operator.approvals","operator.pairing"],s=!(t!=="operator")&&typeof crypto<"u"&&!!crypto.subtle;let o=null,r=!1,a=this.opts.token;if(s){o=await Up();const h=(d=zp({deviceId:o.deviceId,role:t}))==null?void 0:d.token;a=h??this.opts.token,r=!!(h&&this.opts.token)}const u=a||this.opts.password?{token:a,password:this.opts.password}:void 0;let c;if(s&&o){const h=Date.now(),v=this.connectNonce??void 0,f=Dv({deviceId:o.deviceId,clientId:this.opts.clientName??ja.CONTROL_UI,clientMode:this.opts.mode??Xs.WEBCHAT,role:t,scopes:n,signedAtMs:h,token:a??null,nonce:v}),b=await Wp(o.privateKey,f);c={id:o.deviceId,publicKey:o.publicKey,signature:b,signedAt:h,nonce:v}}const l={minProtocol:3,maxProtocol:3,client:{id:this.opts.clientName??ja.CONTROL_UI,version:this.opts.clientVersion??"dev",platform:this.opts.platform??navigator.platform??"web",mode:this.opts.mode??Xs.WEBCHAT,instanceId:this.opts.instanceId},role:t,scopes:n,device:c,caps:[],auth:u,userAgent:navigator.userAgent,locale:navigator.language};this.request("connect",l).then(h=>{var v,f,b;(v=h==null?void 0:h.auth)!=null&&v.deviceToken&&o&&jp({deviceId:o.deviceId,role:h.auth.role??t,token:h.auth.deviceToken,scopes:h.auth.scopes??[]}),this.backoffMs=800,(b=(f=this.opts).onHello)==null||b.call(f,h)}).catch(()=>{var h;r&&o&&Hp({deviceId:o.deviceId,role:t}),(h=this.ws)==null||h.close(Ov,"connect failed")})}handleMessage(t){var s,o,r,a,u,c;let n;try{n=JSON.parse(t)}catch{return}const i=n;if(i.type==="event"){const l=n;if(l.event==="connect.challenge"){const h=l.payload,v=h&&typeof h.nonce=="string"?h.nonce:null;v&&(this.connectNonce=v,this.sendConnect());return}const d=typeof l.seq=="number"?l.seq:null;d!==null&&(this.lastSeq!==null&&d>this.lastSeq+1&&((o=(s=this.opts).onGap)==null||o.call(s,{expected:this.lastSeq+1,received:d})),this.lastSeq=d);try{(a=(r=this.opts).onEvent)==null||a.call(r,l)}catch(h){console.error("[gateway] event handler error:",h)}return}if(i.type==="res"){const l=n,d=this.pending.get(l.id);if(!d)return;if(this.pending.delete(l.id),l.ok)d.resolve(l.payload);else{const h=new Error(((u=l.error)==null?void 0:u.message)??"request failed");h.payload=l.payload,h.details=(c=l.error)==null?void 0:c.details,d.reject(h)}return}}request(t,n){if(!this.ws||this.ws.readyState!==WebSocket.OPEN)return Promise.reject(new Error("gateway not connected"));const i=oo(),s={type:"req",id:i,method:t,params:n},o=new Promise((r,a)=>{this.pending.set(i,{resolve:u=>r(u),reject:a})});return this.ws.send(JSON.stringify(s)),o}queueConnect(){this.connectNonce=null,this.connectSent=!1,this.connectTimer!==null&&window.clearTimeout(this.connectTimer),this.connectTimer=window.setTimeout(()=>{this.sendConnect()},750)}}function Zs(e){return typeof e=="object"&&e!==null}function Fv(e){if(!Zs(e))return null;const t=typeof e.id=="string"?e.id.trim():"",n=e.request;if(!t||!Zs(n))return null;const i=typeof n.command=="string"?n.command.trim():"";if(!i)return null;const s=typeof e.createdAtMs=="number"?e.createdAtMs:0,o=typeof e.expiresAtMs=="number"?e.expiresAtMs:0;return!s||!o?null:{id:t,request:{command:i,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:s,expiresAtMs:o}}function Uv(e){if(!Zs(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 fu(e){const t=Date.now();return e.filter(n=>n.expiresAtMs>t)}function Wv(e,t){const n=fu(e).filter(i=>i.id!==t.id);return n.push(t),n}function Ha(e,t){return fu(e).filter(n=>n.id!==t)}class Kv{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){if(n!=null&&n.deviceWidth&&(this.deviceWidth=n.deviceWidth),n!=null&&n.deviceHeight&&(this.deviceHeight=n.deviceHeight),this.pendingFrame=t,!this.canvas){const i=document.getElementById("browser-screencast-canvas");i&&this.attach(i)}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 i=this.canvas.getBoundingClientRect(),s=this.canvas.width/i.width,o=this.canvas.height/i.height,r=this.deviceWidth/this.canvas.width,a=this.deviceHeight/this.canvas.height;return{x:Math.round(t*s*r),y:Math.round(n*o*a)}}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 Ss=null;function hn(){return Ss||(Ss=new Kv),Ss}function qo(e){return e instanceof Error?e.message:String(e)}async function zv(e){if(!e.client){console.error("[browser] startScreencast: no client"),e.browserError="Not connected to gateway";return}if(!e.connected){console.error("[browser] startScreencast: client exists but not connected"),e.browserError="Not connected to gateway";return}console.log("[browser] startScreencast: sending request"),e.browserLoading=!0,e.browserError=null;try{const t=await e.client.request("browser.screencast.start",{quality:60,maxWidth:1280,maxHeight:720});console.log("[browser] startScreencast response:",t),t!=null&&t.ok?e.browserScreencastActive=!0:(console.warn("[browser] startScreencast: response did not have ok=true",t),e.browserError="Screencast start failed (no ok in response)")}catch(t){console.error("[browser] startScreencast error:",t),e.browserError=qo(t)}finally{e.browserLoading=!1}}async function jv(e){if(!(!e.client||!e.connected)){e.browserLoading=!0,e.browserFullscreen=!1;try{await e.client.request("browser.screencast.stop",{}),e.browserScreencastActive=!1,e.browserScreencastFrame=null,e.browserScreencastMetadata=null}catch(t){e.browserError=qo(t)}finally{e.browserLoading=!1}}}async function xs(e,t,n,i,s){if(!(!e.client||!e.connected||!e.browserInputMode))try{await e.client.request("browser.screencast.input",{type:"mouse",action:t,x:n,y:i,button:s??"left",clickCount:t==="mousePressed"?1:0})}catch{}}async function $s(e,t,n,i){if(!(!e.client||!e.connected||!e.browserInputMode))try{await e.client.request("browser.screencast.input",{type:"key",action:t,key:n,...i!=null&&i.text?{text:i.text}:{},...i!=null&&i.code?{code:i.code}:{},...i!=null&&i.modifiers?{modifiers:i.modifiers}:{}})}catch{}}async function Hv(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=qo(t)}}function qv(e){e.browserInputMode=!e.browserInputMode}function Vv(e){e.browserFullscreen=!e.browserFullscreen,hn().detach()}function Gv(e,t){if(!(t!=null&&t.data))return;e.browserScreencastFrame=t.data,e.browserScreencastMetadata=t.metadata??null,hn().updateFrame(t.data,t.metadata)}function Qv(e,t){t&&(e.browserHandoffPending=!0,e.browserHandoffReason=t.reason??"Action required",e.browserHandoffId=t.id??null)}function Yv(e){e.browserHandoffPending=!1,e.browserHandoffReason=null,e.browserHandoffId=null}async function Js(e,t){if(!e.client||!e.connected)return;const n=e.sessionKey.trim(),i=n?{sessionKey:n}:{};try{const s=await e.client.request("agent.identity.get",i);if(!s)return;const o=_s(s);e.assistantName=o.name,e.assistantAvatar=o.avatar,e.assistantAgentId=o.agentId??null}catch{}}async function eo(e){return(await e.request("apikeys.list")).providers??[]}async function qa(e,t,n){await e.request("apikeys.set",{provider:t,apiKey:n})}async function Xv(e,t){await e.request("apikeys.remove",{provider:t})}const bi="taskmaster_update_pending";async function gu(e){var t,n;if(!(!e.client||!e.connected)&&!e.updateChecking){e.updateChecking=!0,e.updateMessage=null,(t=e.requestUpdate)==null||t.call(e);try{const i=await e.client.request("update.status",{});e.currentVersion=i.current,e.latestVersion=i.latest,e.updateAvailable=i.updateAvailable,e.updateMessage=i.updateAvailable?`v${i.latest} available`:"Up to date"}catch(i){e.updateMessage=`Check failed: ${String(i)}`,e.updateAvailable=null}finally{e.updateChecking=!1,(n=e.requestUpdate)==null||n.call(e)}}}async function Zv(e){var t,n,i,s;if(!(!e.client||e.updateRunning)){e.updateRunning=!0,e.updateMessage="Starting update...",e.updateProgressSteps=[],e.updateLastResult=null,(t=e.requestUpdate)==null||t.call(e);try{localStorage.setItem(bi,String(Date.now())),localStorage.removeItem(Vo)}catch{}try{const o=await e.client.request("update.run",{restartDelayMs:2e3,note:"Update from setup page"});if(o.ok&&o.result.status==="ok")e.updateMessage="Updated — restarting gateway...",(n=e.requestUpdate)==null||n.call(e);else if(o.ok&&o.result.status==="skipped")fn(),e.updateMessage=o.result.reason||"Update skipped",e.updateRunning=!1,(i=e.requestUpdate)==null||i.call(e);else throw fn(),new Error(o.result.reason||"Update failed")}catch(o){fn(),e.updateMessage=`Update failed: ${String(o)}`,e.updateRunning=!1,e.updateProgressSteps=[],(s=e.requestUpdate)==null||s.call(e)}}}function Jv(e,t){var i,s,o;const n=t.phase;if(n==="step-start"){const r=t.name,a=t.index,u=t.total;e.updateMessage=`Updating: ${r} (${a+1}/${u})`;const c=e.updateProgressSteps.find(l=>l.index===a);c?(c.status="running",c.name=r):e.updateProgressSteps=[...e.updateProgressSteps,{name:r,index:a,total:u,status:"running"}],(i=e.requestUpdate)==null||i.call(e)}else if(n==="step-done"){const r=t.name,a=t.index,u=t.total,c=t.ok,l=t.durationMs,d=e.updateProgressSteps.find(v=>v.index===a);d?(d.status=c?"done":"failed",d.durationMs=l):e.updateProgressSteps=[...e.updateProgressSteps,{name:r,index:a,total:u,status:c?"done":"failed",durationMs:l}];const h=!c&&t.error?`: ${t.error.slice(0,200)}`:"";e.updateMessage=c?`Updating: ${r} done (${a+1}/${u})`:`Update step failed: ${r}${h}`,(s=e.requestUpdate)==null||s.call(e)}else if(n==="complete"){if(t.status==="ok")e.updateMessage="Update complete — restarting gateway...";else{const a=t.reason;e.updateMessage=a?`Update failed: ${a}`:"Update failed",e.updateRunning=!1,fn()}(o=e.requestUpdate)==null||o.call(e)}}async function eb(e){var n,i,s,o;if(!e.client||!e.connected)return;const t=nb();fn();try{const r=await e.client.request("update.lastResult",{});if(!r.ok||!r.result)return;const a=5*6e4,u=Date.now()-r.result.ts<a;if(!t&&!u||ib(r.result.ts))return;e.updateLastResult=r.result;const c=(n=r.result.after)==null?void 0:n.version;if(r.result.status==="ok"&&c&&(e.currentVersion=c),e.updateAvailable=!1,r.result.status==="ok"){const l=(i=r.result.before)==null?void 0:i.version,d=c??r.result.currentVersion;e.updateMessage=l?`Updated: v${l} → v${d}`:`Updated to v${d}`}else{const l=r.result.reason??((s=r.result.failedStep)==null?void 0:s.name)??"unknown error";e.updateMessage=`Update failed: ${l}`}}catch{}finally{e.updateRunning=!1,e.updateProgressSteps=[],(o=e.requestUpdate)==null||o.call(e)}}const Vo="taskmaster_update_dismissed";function tb(e){var t;e.updateLastResult=null,e.updateMessage=null;try{localStorage.setItem(Vo,String(Date.now()))}catch{}(t=e.requestUpdate)==null||t.call(e)}function nb(){try{const e=localStorage.getItem(bi);return e?Date.now()-Number(e)>30*6e4?(localStorage.removeItem(bi),!1):!0:!1}catch{return!1}}function fn(){try{localStorage.removeItem(bi)}catch{}}function ib(e){try{const t=localStorage.getItem(Vo);return t?Number(t)>=e:!1}catch{return!1}}function As(e,t){var a,u,c;const n=(e??"").trim(),i=(a=t.mainSessionKey)==null?void 0:a.trim();if(!i)return n;if(!n)return i;const s=((u=t.mainKey)==null?void 0:u.trim())||"main",o=(c=t.defaultAgentId)==null?void 0:c.trim();return n==="main"||n===s||o&&(n===`agent:${o}:main`||n===`agent:${o}:${s}`)?i:n}function sb(e,t){if(!(t!=null&&t.mainSessionKey))return;const n=As(e.sessionKey,t),i=As(e.settings.sessionKey,t),s=As(e.settings.lastActiveSessionKey,t),o=n||i||e.sessionKey,r={...e.settings,sessionKey:i||o,lastActiveSessionKey:s||o},a=r.sessionKey!==e.settings.sessionKey||r.lastActiveSessionKey!==e.settings.lastActiveSessionKey;o!==e.sessionKey&&(e.sessionKey=o),a&&Ge(e,r)}function Te(e){var s;e.lastError=null,e.hello=null,e.connected=!1,e.execApprovalQueue=[],e.execApprovalError=null;const t=!!e.publicChat,n=e.setup||e.filesPage||e.browserPage||e.chatPage||e.adminsPage||e.contactsPage||e.advancedPage,i=t?"public-chat":n?"setup-ui":"taskmaster-control-ui";(s=e.client)==null||s.stop(),e.client=new Bv({url:e.settings.gatewayUrl,token:t?void 0:e.settings.token.trim()?e.settings.token:void 0,password:t?void 0:e.password.trim()?e.password:void 0,clientName:i,mode:"webchat",role:t?"public":void 0,scopes:t?[]:void 0,onHello:o=>{var r;if(e.connected=!0,e.lastError=null,e.hello=o,t){Va(e,o),Js(e),(((r=e.publicChatConfig)==null?void 0:r.auth)??"anonymous")==="anonymous"&&db(e);return}ui()&&(To(),e.uninstallDone=!1),Va(e,o),e.handleAccessCheck(),eb(e).then(()=>{gu(e)}),Js(e),Lv(e),(e.chatPage||e.setup)&&ab(e),yo(e,{quiet:!0}),mo(e,{quiet:!0}),kn(e).then(()=>{e.initWorkspaceSelection()}),e.startEmbeddingPoll(),(e.setup||e.chatPage)&&Le(e),e.setup&&(lb(e),cb(e),ub(e)),li(e)},onClose:({code:o,reason:r})=>{e.connected=!1,o!==1012&&(e.lastError=`disconnected (${o}): ${r||"no reason"}`)},onEvent:o=>ob(e,o),onGap:({expected:o,received:r})=>{console.warn(`[gateway] event gap: expected seq ${o}, got ${r}`),li(e)}}),e.client.start()}function ob(e,t){try{rb(e,t)}catch(n){console.error("[gateway] handleGatewayEvent error:",t.event,n)}}function rb(e,t){var n;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;qd(e,t.payload);return}if(t.event==="chat"){const i=t.payload;i!=null&&i.sessionKey&&rc(e,i.sessionKey);const s=xl(e,i);if((s==="final"||s==="error"||s==="aborted")&&(ao(e),Dh(e)),s==="final"){const o=e,r=Math.max((((n=o.chatMessages)==null?void 0:n.length)??0)+10,Pe);Me(o,{limit:r})}return}if(t.event==="suggestions"){const i=t.payload;(i==null?void 0:i.sessionKey)===e.sessionKey&&Array.isArray(i.suggestions)&&i.suggestions.length>0&&(e.chatSuggestion=i.suggestions[0]);return}if(t.event==="presence"){const i=t.payload;i!=null&&i.presence&&Array.isArray(i.presence)&&(e.presenceEntries=i.presence,e.presenceError=null,e.presenceStatus=null);return}if(t.event==="cron"&&e.tab==="cron"&&Eo(e),(t.event==="device.pair.requested"||t.event==="device.pair.resolved")&&mo(e,{quiet:!0}),t.event==="exec.approval.requested"){const i=Fv(t.payload);if(i){e.execApprovalQueue=Wv(e.execApprovalQueue,i),e.execApprovalError=null;const s=Math.max(0,i.expiresAtMs-Date.now()+500);window.setTimeout(()=>{e.execApprovalQueue=Ha(e.execApprovalQueue,i.id)},s)}return}if(t.event==="browser.screencast.frame"){Gv(e,t.payload);return}if(t.event==="browser.handoff"){Qv(e,t.payload),e.browserPage||(window.location.href="/browser");return}if(t.event==="browser.handoff.resolved"){Yv(e);return}if(t.event==="exec.approval.resolved"){const i=Uv(t.payload);i&&(e.execApprovalQueue=Ha(e.execApprovalQueue,i.id));return}if(t.event==="update.progress"){Jv(e,t.payload);return}}function Va(e,t){const n=t.snapshot;n!=null&&n.presence&&Array.isArray(n.presence)&&(e.presenceEntries=n.presence),n!=null&&n.health&&(e.debugHealth=n.health),n!=null&&n.sessionDefaults&&sb(e,n.sessionDefaults)}async function ab(e){if(!(!e.client||!e.connected))try{const t=await e.client.request("models.list",{});Array.isArray(t==null?void 0:t.models)&&(e.chatModelCatalog=t.models)}catch{}}async function lb(e){if(!(!e.client||!e.connected))try{e.apiKeyProviders=await eo(e.client)}catch{}}async function cb(e){if(!(!e.client||!e.connected))try{e.tailscaleStatus=await e.client.request("tailscale.status")}catch{}}async function ub(e){if(!(!e.client||!e.connected))try{e.wifiStatus=await e.client.request("wifi.status")}catch{}}const Ga="taskmaster_public_id";function mu(e=30){var s;const t=document.cookie.split(";").map(o=>o.trim()).find(o=>o.startsWith(`${Ga}=`));if(t)return t.split("=")[1];const n=`anon-${((s=crypto.randomUUID)==null?void 0:s.call(crypto))??Math.random().toString(36).slice(2)}`,i=new Date(Date.now()+e*864e5).toUTCString();return document.cookie=`${Ga}=${n}; path=/; expires=${i}; SameSite=Lax`,n}async function db(e){var n,i;if(!e.client||!e.connected)return;const t=mu((n=e.publicChatConfig)==null?void 0:n.cookieTtlDays);try{const s=(i=e.publicChatConfig)==null?void 0:i.accountId,o=await e.client.request("public.session",{cookieId:t,accountId:s});o!=null&&o.sessionKey&&(e.publicChatSessionKey=o.sessionKey,e.sessionKey=o.sessionKey,e.publicChatAuthenticated=!0,e.publicChatAuthStep="ready",Me(e))}catch(s){console.error("[public-chat] failed to resolve anonymous session:",s),e.lastError="Failed to start chat session"}}let Se=!1,de=null,Ot="",wi="";function yu(e){return e.replace(/[\s\-()]/g,"")}function vu(){Se=!1,de=null,Ot="",wi=""}async function pb(e){if(!e.client||!e.connected)return;const t=mu(e.cookieTtlDays);try{const n=await e.client.request("public.session",{cookieId:t,accountId:e.accountId});n!=null&&n.sessionKey&&e.onAuthenticated(n.sessionKey)}catch(n){de=n instanceof Error?n.message:"Failed to start session",e.requestUpdate()}}async function Qa(e){if(!e.client||Se)return;const t=yu(Ot);if(!t){de="Please enter your phone number",e.requestUpdate();return}Se=!0,de=null,e.requestUpdate();try{const n=await e.client.request("public.otp.request",{phone:t,name:wi.trim()||void 0});n!=null&&n.ok?e.onAuthStepChange("otp"):de=(n==null?void 0:n.error)??"Failed to send verification code"}catch(n){de=n instanceof Error?n.message:"Failed to send verification code"}finally{Se=!1,e.requestUpdate()}}async function Ya(e,t){if(!(!e.client||Se)){if(!t.trim()){de="Please enter the verification code",e.requestUpdate();return}Se=!0,de=null,e.requestUpdate();try{const n=await e.client.request("public.otp.verify",{phone:yu(Ot),code:t.trim(),accountId:e.accountId});n!=null&&n.ok&&n.sessionKey?(vu(),e.onAuthenticated(n.sessionKey)):de=(n==null?void 0:n.error)??"Invalid verification code"}catch(n){de=n instanceof Error?n.message:"Verification failed"}finally{Se=!1,e.requestUpdate()}}}function Es(e){return k}function Xa(e){return p`
3371
- <div class="public-auth__form">
3372
- <label class="field public-auth__field">
3373
- <span>Your name (optional)</span>
3374
- <input
3375
- type="text"
3376
- .value=${wi}
3377
- @input=${t=>{wi=t.target.value}}
3378
- placeholder="Name"
3379
- />
3380
- </label>
3381
- <label class="field public-auth__field">
3382
- <span>WhatsApp number</span>
3383
- <input
3384
- type="tel"
3385
- .value=${Ot}
3386
- @input=${t=>{Ot=t.target.value}}
3387
- @keydown=${t=>{t.key==="Enter"&&(t.preventDefault(),Qa(e))}}
3388
- placeholder="+44 7123 456789"
3389
- required
3390
- />
3391
- </label>
3392
- ${de?p`<div class="public-auth__error">${de}</div>`:k}
3393
- <button
3394
- class="btn primary public-auth__btn"
3395
- ?disabled=${Se}
3396
- @click=${()=>{Qa(e)}}
3397
- >
3398
- ${Se?"Sending...":"Send verification code"}
3399
- </button>
3400
- </div>
3401
- `}function Za(e){let t="";return p`
3402
- <div class="public-auth__form">
3403
- <p class="public-auth__hint">
3404
- We sent a verification code to <strong>${Ot}</strong> via WhatsApp.
3405
- </p>
3406
- <label class="field public-auth__field">
3407
- <span>Verification code</span>
3408
- <input
3409
- type="text"
3410
- inputmode="numeric"
3411
- maxlength="6"
3412
- @input=${n=>{t=n.target.value}}
3413
- @keydown=${n=>{n.key==="Enter"&&(n.preventDefault(),Ya(e,t))}}
3414
- placeholder="123456"
3415
- required
3416
- />
3417
- </label>
3418
- ${de?p`<div class="public-auth__error">${de}</div>`:k}
3419
- <button
3420
- class="btn primary public-auth__btn"
3421
- ?disabled=${Se}
3422
- @click=${()=>{Ya(e,t)}}
3423
- >
3424
- ${Se?"Verifying...":"Verify"}
3425
- </button>
3426
- <button
3427
- class="btn public-auth__btn public-auth__btn--link"
3428
- @click=${()=>{de=null,e.onAuthStepChange("phone")}}
3429
- >
3430
- Use a different number
3431
- </button>
3432
- </div>
3433
- `}function hb(e){const{authMode:t,authStep:n}=e;return t==="anonymous"?p`
3434
- <div class="setup-container">
3435
- <div class="setup-card">
3436
- <div class="setup-spinner"></div>
3437
- <p>Starting chat...</p>
3438
- </div>
3439
- </div>
3440
- `:t==="verified"?p`
3441
- <div class="setup-container">
3442
- <div class="public-auth">
3443
- ${Es()}
3444
- <h2 class="public-auth__title">Chat with ${e.assistantName}</h2>
3445
- <p class="public-auth__subtitle">Verify your WhatsApp number to get started.</p>
3446
- ${n==="otp"?Za(e):Xa(e)}
3447
- </div>
3448
- </div>
3449
- `:n==="phone"||n==="otp"?p`
3450
- <div class="setup-container">
3451
- <div class="public-auth">
3452
- ${Es()}
3453
- <h2 class="public-auth__title">Chat with ${e.assistantName}</h2>
3454
- <p class="public-auth__subtitle">Verify your WhatsApp number to continue your conversation across devices.</p>
3455
- ${n==="otp"?Za(e):Xa(e)}
3456
- </div>
3457
- </div>
3458
- `:p`
3459
- <div class="setup-container">
3460
- <div class="public-auth">
3461
- ${Es()}
3462
- <h2 class="public-auth__title">Chat with ${e.assistantName}</h2>
3463
- <p class="public-auth__subtitle">How would you like to get started?</p>
3464
- <div class="public-auth__choices">
3465
- <button
3466
- class="btn primary public-auth__btn"
3467
- @click=${()=>{pb(e)}}
3468
- >
3469
- Chat now
3470
- </button>
3471
- <button
3472
- class="btn public-auth__btn"
3473
- @click=${()=>{vu(),e.onAuthStepChange("phone")}}
3474
- >
3475
- Verify with WhatsApp
3476
- </button>
3477
- </div>
3478
- <p class="public-auth__hint">
3479
- Verifying links your conversation with WhatsApp for seamless cross-device access.
3480
- </p>
3481
- </div>
3482
- </div>
3483
- `}const Go="taskmaster-access-session",bu={checked:!1,hasPins:!1,hasMasterPin:!1,authenticated:!1,workspace:null,master:!1,accounts:[],error:null,busy:!1};function wu(){try{return localStorage.getItem(Go)}catch{return null}}function ku(e){try{localStorage.setItem(Go,e)}catch{}}function fb(){try{localStorage.removeItem(Go)}catch{}}async function Ja(e){if(e.client)try{const t=wu(),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 gb(e,t,n){if(e.client){e.accessState={...e.accessState,busy:!0,error:null};try{const i=await e.client.request("access.verify",{account:t,pin:n});i.ok&&i.token?(ku(i.token),e.accessState={...e.accessState,authenticated:!0,workspace:i.workspace??null,master:i.master??!1,busy:!1,error:null}):e.accessState={...e.accessState,busy:!1,error:i.message??"Incorrect PIN"}}catch{e.accessState={...e.accessState,busy:!1,error:"Failed to verify PIN"}}}}async function mb(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?(ku(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 yb(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 vb(e){const t=wu();if(e.client&&t)try{await e.client.request("access.logout",{token:t})}catch{}fb(),e.accessState={...bu,checked:!0,hasPins:!0,hasMasterPin:e.accessState.hasMasterPin,accounts:e.accessState.accounts}}function bb(e,t="admin"){var s;if(!e)return[];const n=e.bindings;if(!Array.isArray(n))return[];const i=[];for(const o of n){if(!o||typeof o!="object"||o.agentId!==t&&o.agentId!=="management")continue;const r=o.match;if(!r||typeof r!="object"||(r.channel??"").toLowerCase()!=="whatsapp")continue;const u=r.peer;if(!u||typeof u!="object"||u.kind!=="dm")continue;const c=u.id??"";c&&i.push({phone:c,paired:((s=o.meta)==null?void 0:s.paired)===!0})}return i.sort((o,r)=>o.paired&&!r.paired?-1:!o.paired&&r.paired?1:0),i}function Su(e,t,n="admin",i){const s=c=>c===n||c==="management",o=new Map,r=new Map;for(const c of e){if(!c||typeof c!="object"||!s(c.agentId))continue;const l=c.match;if(!l||typeof l!="object"||(l.channel??"").toLowerCase()!=="whatsapp")continue;const h=l.peer;if(!h||typeof h!="object"||h.kind!=="dm")continue;const v=h.id??"";v&&(c.meta&&o.set(v,c.meta),l.accountId&&r.set(v,l.accountId))}const a=e.filter(c=>{if(!c||typeof c!="object"||!s(c.agentId))return!0;const l=c.match;if(!l||typeof l!="object"||(l.channel??"").toLowerCase()!=="whatsapp")return!0;const h=l.peer;return!h||typeof h!="object"?!0:h.kind!=="dm"}),u=t.map(c=>{const l=i??r.get(c.phone),d={channel:"whatsapp",peer:{kind:"dm",id:c.phone}};l&&(d.accountId=l);const h={agentId:n,match:d},v=o.get(c.phone);return v?h.meta=v:c.paired&&(h.meta={paired:!0}),h});return[...a,...u]}async function Ii(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 i=await e.client.request("config.get",{});e.configSnapshot=i;const s=i.config;e.configForm=Ye(s??{}),e.adminPhones=bb(s,n),e.configFormDirty=!1}catch(i){e.adminsError=String(i)}finally{e.adminsLoading=!1}}async function xu(e,t,n,i){var r,a;if(!e.client||!e.connected)return;if(!n){e.adminsError="No business selected.";return}if(e.adminsSaving)return;const s=n;let o=t.replace(/[\s\-\(\)]/g,"");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. Use international format (e.g., +44 7504 472444)";return}if(e.adminPhones.some(u=>u.phone===o)){e.adminsError="Phone number already exists";return}e.adminsSaving=!0,e.adminsError=null;try{const u=Ye(e.configForm??((r=e.configSnapshot)==null?void 0:r.config)??{}),c=u.bindings??[],l=[...e.adminPhones,{phone:o}],d=Su(c,l,s,i);Al(u,["bindings"],d);const h=(a=e.configSnapshot)==null?void 0:a.hash;if(!h){e.adminsError="Config hash missing; reload and retry.";return}const v=ut(u);await e.client.request("config.set",{raw:v,baseHash:h}),await Ii(e,n)}catch(u){e.adminsError=String(u)}finally{e.adminsSaving=!1}}async function $u(e,t,n,i){var r,a;if(!e.client||!e.connected)return;if(!n){e.adminsError="No business selected.";return}if(e.adminsSaving)return;const s=n,o=e.adminPhones.find(u=>u.phone===t);if(o!=null&&o.paired){e.adminsError="Cannot remove the paired phone. Unlink WhatsApp first.";return}e.adminsSaving=!0,e.adminsError=null;try{const u=Ye(e.configForm??((r=e.configSnapshot)==null?void 0:r.config)??{}),c=u.bindings??[],l=e.adminPhones.filter(f=>f.phone!==t),d=Su(c,l,s,i);Al(u,["bindings"],d);const h=(a=e.configSnapshot)==null?void 0:a.hash;if(!h){e.adminsError="Config hash missing; reload and retry.";return}const v=ut(u);await e.client.request("config.set",{raw:v,baseHash:h}),await Ii(e,n)}catch(u){e.adminsError=String(u)}finally{e.adminsSaving=!1}}const wb=Object.freeze(Object.defineProperty({__proto__:null,addAdmin:xu,loadAdmins:Ii,removeAdmin:$u},Symbol.toStringTag,{value:"Module"}));async function yt(e,t){if(!(!e.client||!e.connected)){if(!t){e.contactsRecords=[];return}if(!e.contactsLoading){e.contactsLoading=!0,e.contactsError=null;try{const n=e.contactsSearchQuery.trim(),i=n?await e.client.request("records.search",{query:n,workspace:t}):await e.client.request("records.list",{workspace:t});e.contactsRecords=i.records??[]}catch(n){e.contactsError=String(n)}finally{e.contactsLoading=!1}}}}async function Au(e,t,n,i){if(!e.client||!e.connected||e.contactsSaving)return;let s=t.replace(/[\s\-\(\)]/g,"");const o=n.trim();if(!s){e.contactsError="Phone number is required";return}if(!o){e.contactsError="Name is required";return}if(s.startsWith("+")||(s="+"+s),!/^\+[1-9]\d{6,14}$/.test(s)){e.contactsError="Invalid phone number. Use international format (e.g., +44 7490 553305)";return}e.contactsSaving=!0,e.contactsError=null;try{await e.client.request("records.set",{id:s,name:o,fields:{},workspace:i}),e.contactsShowAddForm=!1,e.contactsNewPhone="",e.contactsNewName="",await yt(e,i)}catch(r){e.contactsError=String(r)}finally{e.contactsSaving=!1}}async function Eu(e,t,n){if(!(!e.client||!e.connected)&&!e.contactsSaving){e.contactsSaving=!0,e.contactsError=null;try{await e.client.request("records.delete",{id:t}),e.contactsEditingId===t&&(e.contactsEditingId=null),await yt(e,n)}catch(i){e.contactsError=String(i)}finally{e.contactsSaving=!1}}}async function Cu(e,t,n,i,s){if(!(!e.client||!e.connected)&&!e.contactsSaving){e.contactsSaving=!0,e.contactsError=null;try{await e.client.request("records.setField",{id:t,key:n,value:i}),await yt(e,s)}catch(o){e.contactsError=String(o)}finally{e.contactsSaving=!1}}}async function Tu(e,t,n,i){if(!(!e.client||!e.connected)&&!e.contactsSaving){e.contactsSaving=!0,e.contactsError=null;try{await e.client.request("records.deleteField",{id:t,key:n}),await yt(e,i)}catch(s){e.contactsError=String(s)}finally{e.contactsSaving=!1}}}const kb=Object.freeze(Object.defineProperty({__proto__:null,addContact:Au,deleteContact:Eu,deleteContactField:Tu,loadContacts:yt,setContactField:Cu},Symbol.toStringTag,{value:"Module"}));function sn(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 Sb(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 xb(e){const t=oe(e);if(!t)return;const n=t.agents.find(i=>i.id.endsWith("-admin")||i.id==="admin");return n==null?void 0:n.id}function $b(e){const t=oe(e);return(t==null?void 0:t.whatsappAccountId)??void 0}function Ab(e){var i;const t=oe(e);if(!t)return;const n=t.agents.find(s=>s.id.endsWith("-admin")||s.id==="admin");return(n==null?void 0:n.id)??((i=t.agents[0])==null?void 0:i.id)}function Eb(e){return e.selectedWorkspace??void 0}function oe(e){return e.selectedWorkspace?e.workspaces.find(t=>t.name===e.selectedWorkspace)??null:null}const Cb=/^data:/i,Tb=/^https?:\/\//i;function el(e){var a,u;const t=((a=e.agentsList)==null?void 0:a.agents)??[],n=pl(e.sessionKey),i=(n==null?void 0:n.agentId)??((u=e.agentsList)==null?void 0:u.defaultId)??"main",s=t.find(c=>c.id===i),o=s==null?void 0:s.identity,r=(o==null?void 0:o.avatarUrl)??(o==null?void 0:o.avatar);if(r)return Cb.test(r)||Tb.test(r)?r:o==null?void 0:o.avatarUrl}function _b(e){var i;if(!e)return null;const t=(i=e.channelAccounts)==null?void 0:i.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 Mb(e){var r;if(!e)return{configured:!1,running:!1,connected:!1,lastError:null,selfChatMode:!1,dmPolicy:null,cliPath:null};const t=(r=e.channelAccounts)==null?void 0:r.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],i=n.running??!1,s=n.probe,o=s!=null?s.ok===!0:i;return{configured:n.configured??!1,running:i,connected:o,lastError:n.lastError??null,selfChatMode:n.mode==="self-chat"||!!n.selfChatMode,dmPolicy:n.dmPolicy??null,cliPath:n.cliPath??null}}function Pb(e){var r;const t=(r=e.configSnapshot)==null?void 0:r.config;if(!t)return null;const n=t.bindings;if(!Array.isArray(n))return null;const i=n.find(a=>{var u,c;return((u=a.match)==null?void 0:u.channel)==="imessage"&&((c=a.meta)==null?void 0:c.imessageOwner)});if(!i)return null;const s=i.agentId;for(const a of e.workspaces)if(a.agents.some(u=>u.id===s))return a.name;if(s==="admin"||s==="public"){const a=e.workspaces.find(u=>u.isDefault);return(a==null?void 0:a.name)??null}const o=s.replace(/-(admin|public)$/,"");if(o!==s){const a=e.workspaces.find(u=>u.name===o);return(a==null?void 0:a.name)??null}return null}function Lb(e){var t,n,i,s,o,r,a,u,c;if(e.embeddingDownloading&&!e.publicChat)return p`
3484
- <div class="setup-container">
3485
- <div class="setup-card" style="text-align:center; max-width:420px;">
3486
- <div class="setup-spinner"></div>
3487
- <h2 style="margin:16px 0 8px; font-size:1.1rem; font-weight:600; color:#fff;">Downloading embedding model</h2>
3488
- <p style="margin:0; color:rgba(255,255,255,0.6); font-size:0.85rem; line-height:1.4;">
3489
- This is a one-time download after install or upgrade.
3490
- It may take a few minutes depending on your connection.
3491
- </p>
3492
- <p style="margin:12px 0 0; color:rgba(255,255,255,0.4); font-size:0.75rem;">
3493
- Memory search will be available when the download completes.
3494
- </p>
3495
- </div>
3496
- </div>
3497
- `;if(e.publicChat)return e.connected?e.publicChatAuthenticated?Pv({connected:e.connected,sessionKey:e.sessionKey,loading:e.chatLoading,sending:e.chatSending,messages:e.chatMessages,toolMessages:e.chatToolMessages,stream:e.chatStream,streamStartedAt:e.chatStreamStartedAt,interimText:e.chatInterimText,assistantAvatarUrl:e.chatAvatarUrl??el(e)??null,draft:e.chatMessage,queue:e.chatQueue,canSend:e.connected,canAbort:!!e.chatRunId,disabledReason:e.connected?null:"Disconnected.",error:e.lastError,assistantName:e.assistantName,assistantAvatar:e.assistantAvatar,suggestion:e.chatSuggestion,onSuggestionClick:l=>{e.chatMessage=l,e.chatSuggestion=null,e.handleSendChat()},onRefresh:()=>(e.resetToolStream(),ie(async()=>{const{loadChatHistory:l}=await Promise.resolve().then(()=>oi);return{loadChatHistory:l}},void 0,import.meta.url).then(({loadChatHistory:l})=>{l(e)})),onDraftChange:l=>e.chatMessage=l,attachments:e.chatAttachments,onAttachmentsChange:l=>e.chatAttachments=l,onSend:()=>e.handleSendChat(),onAbort:()=>{e.handleAbortChat()},onQueueRemove:l=>e.removeQueuedMessage(l),onChatScroll:l=>e.handleChatScroll(l),nearBottom:e.chatUserNearBottom,hasMore:e.chatHistoryHasMore,loadingOlder:e.chatLoadingOlder,onLoadOlder:()=>{e.handleLoadOlderChat()}}):hb({authMode:e.publicChatConfig.auth??"anonymous",authStep:e.publicChatAuthStep,connected:e.connected,client:e.client,assistantName:e.assistantName,assistantAvatar:e.assistantAvatar,accountId:e.publicChatConfig.accountId,cookieTtlDays:e.publicChatConfig.cookieTtlDays,onAuthenticated:l=>{e.publicChatSessionKey=l,e.sessionKey=l,e.publicChatAuthenticated=!0,e.publicChatAuthStep="ready",ie(async()=>{const{loadChatHistory:d}=await Promise.resolve().then(()=>oi);return{loadChatHistory:d}},void 0,import.meta.url).then(({loadChatHistory:d})=>{d(e)})},onAuthStepChange:l=>{e.publicChatAuthStep=l},requestUpdate:()=>{e.requestUpdate()}}):p`
3498
- <div class="setup-container">
3499
- <div class="setup-card">
3500
- <div class="setup-spinner"></div>
3501
- <p>Connecting...</p>
3502
- </div>
3503
- </div>
3504
- `;if(e.connected&&e.accessState.checked){const{accessState:l}=e;if(l.hasPins&&!l.authenticated)return za({show:!0,isFirstTime:!1,accounts:l.accounts,error:l.error,busy:l.busy,onSubmit:(d,h)=>{h!=null&&e.handlePinSubmit(d,h)},changePinMode:e.loginChangePinMode,onToggleChangePinMode:()=>e.toggleChangePinMode(),changePinBusy:e.changePinBusy,changePinError:e.changePinError,changePinSuccess:e.changePinSuccess,onChangePin:(d,h,v)=>e.handleChangePin(d,h,v)});if(!l.hasMasterPin&&!l.authenticated&&e.setup)return za({show:!0,isFirstTime:!0,accounts:[],error:l.error,busy:l.busy,onSubmit:d=>e.handleSetMasterPin(d)});if(!l.hasMasterPin&&!l.authenticated&&!e.setup)return window.location.href="/setup",k}if(e.setup){const l=_b(e.channelsSnapshot),d=((n=(t=e.channelsSnapshot)==null?void 0:t.channelAccounts)==null?void 0:n.whatsapp)??[],h=Mb(e.channelsSnapshot),v=Pb(e);return gf({connected:e.connected,serverPlatform:((s=(i=e.hello)==null?void 0:i.server)==null?void 0:s.platform)??null,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:f=>e.handleLicenseKeyChange(f),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:l,whatsappAccounts:d,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:f=>e.handleUninstallConfirmTextChange(f),onUninstallRun:()=>e.handleUninstallRun(),onUninstallDismiss:()=>e.handleUninstallDismiss(),onStartAuth:()=>e.handleAuthStart(),onSubmitAuthCode:f=>e.handleAuthSubmitCode(f),onAuthCodeChange:f=>e.handleAuthCodeChange(f),onSkipToWhatsApp:()=>e.handleSkipToWhatsApp(),onWhatsAppRelink:async f=>{await e.handleWhatsAppStart(!0,f),e.whatsappLoginQrDataUrl&&(await e.handleWhatsAppWait(f),await G(e,!0),e.requestUpdate())},onWhatsAppUnlink:async f=>{await e.handleWhatsAppLogout(f)},onWhatsAppReset:async f=>{await e.handleWhatsAppLogout(f),await e.handleWhatsAppStart(!0,f),e.whatsappLoginQrDataUrl&&(await e.handleWhatsAppWait(f),await G(e,!0),e.requestUpdate())},onRefreshStatus:async()=>{await G(e,!0),await e.handleGatewayHealthCheck()},onWhatsAppBack:()=>{e.whatsappLoginQrDataUrl=null,e.whatsappLoginMessage=null,e.whatsappLoginConnected=null,e.whatsappActiveQrAccountId=null,e.requestUpdate(),G(e,!0)},onRestartGateway:()=>e.handleGatewayRestart(),onRemoveWhatsAppAccount:f=>e.handleRemoveWhatsAppAccount(f),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:f=>{e.newWorkspacePin=f},onWorkspaceCreate:async(f,b)=>{const S=e.newWorkspacePin;await e.handleWorkspaceCreate(f,b),S.match(/^\d{4,6}$/)&&(await yb(e,f,S),e.newWorkspacePin="")},onWorkspaceRemove:f=>e.handleWorkspaceRemove(f),onSetAddingWorkspace:f=>{e.addingWorkspace=f},onSetNewWorkspaceName:f=>{e.newWorkspaceName=f},onSetNewWorkspacePath:f=>{e.newWorkspacePath=f},onSetWorkspaceRemoveConfirm:f=>{e.workspaceRemoveConfirm=f},renamingWorkspace:e.renamingWorkspace,renameWorkspaceName:e.renameWorkspaceName,onWorkspaceRenameStart:()=>e.handleWorkspaceRenameStart(),onWorkspaceRenameCancel:()=>e.handleWorkspaceRenameCancel(),onWorkspaceRename:(f,b)=>e.handleWorkspaceRename(f,b),whatsappDmPolicy:(()=>{const f=oe(e),b=f==null?void 0:f.whatsappAccountId,S=b?d.find($=>$.accountId===b):d[0];return(S==null?void 0:S.dmPolicy)??null})(),onWhatsAppDmToggle:async()=>{var T;const f=oe(e),b=f==null?void 0:f.whatsappAccountId,S=b?d.find(M=>M.accountId===b):d[0];if(!S)return;const A=S.dmPolicy!=null&&S.dmPolicy!=="disabled"?"disabled":"open",C=A==="open"?{dmPolicy:A,allowFrom:["*"]}:{dmPolicy:A};try{const M=await e.client.request("config.get"),R=M.config,B=(T=R==null?void 0:R.channels)==null?void 0:T.whatsapp,me=((B==null?void 0:B.accounts)??{})[S.accountId]?{channels:{whatsapp:{accounts:{[S.accountId]:C}}}}:{channels:{whatsapp:C}};await e.client.request("config.patch",{raw:JSON.stringify(me),baseHash:M.hash,note:`WhatsApp DM policy → ${A}`,skipRestart:!0}),await G(e,!1)}catch(M){console.error("DM toggle failed:",M)}},whatsappModel:(()=>{var T,M;const f=oe(e);if(!f)return null;const b=f.agents.find(R=>R.id.endsWith("-public")||R.id==="public");if(!b)return null;const S=(T=e.configSnapshot)==null?void 0:T.config,$=(M=S==null?void 0:S.agents)==null?void 0:M.list;if(!Array.isArray($))return null;const A=$.find(R=>R.id===b.id);if(!(A!=null&&A.model))return null;const C=typeof A.model=="string"?A.model:A.model.primary;return(C==null?void 0:C.trim())||null})(),whatsappModelCatalog:e.chatModelCatalog??[],onWhatsAppModelChange:async f=>{const b=oe(e);if(!b)return;const S=b.agents.find($=>$.id.endsWith("-public")||$.id==="public");if(S)try{const $=await e.client.request("config.get"),A=$.config,C=(A==null?void 0:A.agents)??{},T=Array.isArray(C.list)?[...C.list]:[],M=T.findIndex(B=>B.id===S.id);if(f)M>=0?T[M]={...T[M],model:f}:T.push({id:S.id,model:f});else if(M>=0){const{model:B,...ee}=T[M];Object.keys(ee).length<=1?T.splice(M,1):T[M]=ee}const R=T.length>0?{agents:{list:T}}:{agents:{list:null}};await e.client.request("config.patch",{raw:JSON.stringify(R),baseHash:$.hash,note:`Public agent model → ${f||"default"}`,skipRestart:!0}),e.configSnapshot=await e.client.request("config.get")}catch($){console.error("Model change failed:",$)}},whatsappThinkingLevel:(()=>{var C,T,M;const f=oe(e);if(!f)return null;const b=f.agents.find(R=>R.id.endsWith("-public")||R.id==="public");if(!b)return null;const S=(C=e.configSnapshot)==null?void 0:C.config,$=(T=S==null?void 0:S.agents)==null?void 0:T.list;if(!Array.isArray($))return null;const A=$.find(R=>R.id===b.id);return((M=A==null?void 0:A.thinkingLevel)==null?void 0:M.trim())||null})(),onWhatsAppThinkingChange:async f=>{const b=oe(e);if(!b)return;const S=b.agents.find($=>$.id.endsWith("-public")||$.id==="public");if(S)try{const $=await e.client.request("config.get"),A=$.config,C=(A==null?void 0:A.agents)??{},T=Array.isArray(C.list)?[...C.list]:[],M=T.findIndex(ee=>ee.id===S.id),R=f==="off"?void 0:f;if(R)M>=0?T[M]={...T[M],thinkingLevel:R}:T.push({id:S.id,thinkingLevel:R});else if(M>=0){const{thinkingLevel:ee,...me}=T[M];Object.keys(me).length<=1?T.splice(M,1):T[M]=me}const B=T.length>0?{agents:{list:T}}:{agents:{list:null}};await e.client.request("config.patch",{raw:JSON.stringify(B),baseHash:$.hash,note:`Public agent thinking → ${R||"default"}`,skipRestart:!0}),e.configSnapshot=await e.client.request("config.get")}catch($){console.error("Thinking change failed:",$)}},whatsappGroupPolicy:(()=>{var M,R;const f=(M=e.configSnapshot)==null?void 0:M.config,b=(R=f==null?void 0:f.channels)==null?void 0:R.whatsapp,S=oe(e),$=S==null?void 0:S.whatsappAccountId,A=(b==null?void 0:b.accounts)??{},C=$?A[$]:void 0;return(C==null?void 0:C.groupPolicy)??(b==null?void 0:b.groupPolicy)??"allowlist"})(),whatsappGroupRequireMention:(()=>{var R,B;const f=(R=e.configSnapshot)==null?void 0:R.config,b=(B=f==null?void 0:f.channels)==null?void 0:B.whatsapp,S=oe(e),$=S==null?void 0:S.whatsappAccountId,A=(b==null?void 0:b.accounts)??{},C=$?A[$]:void 0,M=((C==null?void 0:C.groups)??(b==null?void 0:b.groups)??{})["*"];return(M==null?void 0:M.requireMention)!==!1})(),onWhatsAppGroupToggle:async()=>{var S;const f=oe(e),b=f==null?void 0:f.whatsappAccountId;try{const $=await e.client.request("config.get"),A=$.config,C=((S=A==null?void 0:A.channels)==null?void 0:S.whatsapp)??{},T=C.accounts??{},M=b?T[b]:void 0,R=(M==null?void 0:M.groupPolicy)??C.groupPolicy??"allowlist",B=R==="disabled"||R==="allowlist",ee=B?"open":"disabled",me=B?{"*":{}}:void 0,Ke={groupPolicy:ee};me&&(Ke.groups=me);const Z=M?{channels:{whatsapp:{accounts:{[b]:Ke}}}}:{channels:{whatsapp:Ke}};await e.client.request("config.patch",{raw:JSON.stringify(Z),baseHash:$.hash,note:`WhatsApp groups → ${ee}`,skipRestart:!0}),e.configSnapshot=await e.client.request("config.get")}catch($){console.error("Group toggle failed:",$)}},onWhatsAppGroupMentionChange:async f=>{var $;const b=oe(e),S=b==null?void 0:b.whatsappAccountId;try{const A=await e.client.request("config.get"),C=A.config,M=((($=C==null?void 0:C.channels)==null?void 0:$.whatsapp)??{}).accounts??{},R=S?M[S]:void 0,B={"*":{requireMention:f}},ee=R?{channels:{whatsapp:{accounts:{[S]:{groups:B}}}}}:{channels:{whatsapp:{groups:B}}};await e.client.request("config.patch",{raw:JSON.stringify(ee),baseHash:A.hash,note:`WhatsApp group mention → ${f?"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:h.configured,imessageRunning:h.running,imessageConnected:h.connected,imessageLastError:h.lastError,imessageSelfChatMode:h.selfChatMode,imessageCliPath:h.cliPath,imessageEnabling:e.imessageEnabling,imessageEnableConfirm:e.imessageEnableConfirm,imessageOwnerWorkspace:v,onIMessageEnable:()=>{e.imessageEnableConfirm=!0},onIMessageEnableConfirm:async()=>{e.imessageEnabling=!0;try{const f=await e.client.request("config.get"),b=f.config,S=(b==null?void 0:b.bindings)??[],$=oe(e),A=$==null?void 0:$.agents.find(B=>B.id.endsWith("-admin")||B.id==="admin"),C=(A==null?void 0:A.id)??"admin",T=S.filter(B=>{var ee;return((ee=B.match)==null?void 0:ee.channel)!=="imessage"}),M=[{agentId:C,match:{channel:"imessage",peer:{kind:"dm",id:"__self__"}},meta:{imessageOwner:!0}}],R=[...T,...M];await e.client.request("config.patch",{raw:JSON.stringify({channels:{imessage:{selfChatMode:!0,dmPolicy:"disabled",allowFrom:["*"]}},bindings:R}),baseHash:f.hash,note:"Enable iMessage (self-chat) for "+(($==null?void 0:$.name)??"default")}),e.imessageEnableConfirm=!1,setTimeout(()=>{Promise.all([G(e,!0),Le(e)]).then(()=>{e.imessageEnabling=!1})},3e3)}catch{e.imessageEnabling=!1}},onIMessageEnableCancel:()=>{e.imessageEnableConfirm=!1},onIMessageProbe:async()=>{e.imessageEnabling=!0,e.requestUpdate();try{await G(e,!0)}finally{e.imessageEnabling=!1}},onIMessageDisconnect:async()=>{e.imessageEnabling=!0;try{const f=await e.client.request("config.get"),b=f.config,$=((b==null?void 0:b.bindings)??[]).filter(A=>{var C;return((C=A.match)==null?void 0:C.channel)!=="imessage"});await e.client.request("config.patch",{raw:JSON.stringify({channels:{imessage:{selfChatMode:!1,dmPolicy:"disabled"}},bindings:$}),baseHash:f.hash,note:"Disconnect iMessage"}),e.imessageEnableConfirm=!1,setTimeout(()=>{Promise.all([G(e,!0),Le(e)]).then(()=>{e.imessageEnabling=!1})},3e3)}catch{e.imessageEnabling=!1}},onIMessageReassign:async()=>{e.imessageEnabling=!0;try{const f=await e.client.request("config.get"),b=f.config,S=(b==null?void 0:b.bindings)??[],$=oe(e),A=$==null?void 0:$.agents.find(R=>R.id.endsWith("-admin")||R.id==="admin"),C=(A==null?void 0:A.id)??"admin",T=S.filter(R=>{var B;return((B=R.match)==null?void 0:B.channel)!=="imessage"}),M=[{agentId:C,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:[...T,...M]}),baseHash:f.hash,note:"Reassign iMessage to "+(($==null?void 0:$.name)??"default")}),e.imessageEnableConfirm=!1,setTimeout(()=>{Promise.all([G(e,!0),Le(e)]).then(()=>{e.imessageEnabling=!1})},3e3)}catch{e.imessageEnabling=!1}},infoModalOpen:e.infoModalOpen,onInfoModalOpen:f=>{e.infoModalOpen=f},onInfoModalClose:()=>{e.infoModalOpen=null},isMaster:e.accessState.master,apiKeyProviders:e.apiKeyProviders,apiKeyModalOpen:e.apiKeyModalOpen,apiKeyBusy:e.apiKeyBusy,apiKeyError:e.apiKeyError,apiKeySuccess:e.apiKeySuccess,apiKeySavingProvider:e.apiKeySavingProvider,onApiKeyModalOpen:()=>{e.apiKeyModalOpen=!0,e.apiKeyError=null,e.apiKeySuccess=null,e.apiKeySavingProvider=null},onApiKeyModalClose:()=>{e.apiKeyModalOpen=!1,e.apiKeyError=null,e.apiKeySuccess=null,e.apiKeySavingProvider=null},onApiKeySave:async(f,b)=>{e.apiKeySavingProvider=f,e.apiKeyBusy=!0,e.apiKeyError=null,e.apiKeySuccess=null;try{await qa(e.client,f,b);const S=`${f} key saved`;e.apiKeySuccess=S,e.apiKeySavingProvider=null;try{e.apiKeyProviders=await eo(e.client)}catch{}f==="anthropic"&&await e.handleAuthStatusCheck(),setTimeout(()=>{e.apiKeySuccess===S&&(e.apiKeySuccess=null)},2500)}catch(S){e.apiKeyError=S instanceof Error?S.message:"Failed to save key",e.apiKeySavingProvider=null}finally{e.apiKeyBusy=!1}},onApiKeyRemove:async f=>{e.apiKeySavingProvider=f,e.apiKeyBusy=!0,e.apiKeyError=null,e.apiKeySuccess=null;try{await Xv(e.client,f);const b=`${f} key removed`;e.apiKeySuccess=b,e.apiKeySavingProvider=null;try{e.apiKeyProviders=await eo(e.client)}catch{}setTimeout(()=>{e.apiKeySuccess===b&&(e.apiKeySuccess=null)},2500)}catch(b){e.apiKeyError=b instanceof Error?b.message:"Failed to remove key",e.apiKeySavingProvider=null}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:f=>{e.authApiKeyInput=f},onAuthApiKeySubmit:async()=>{const f=e.authApiKeyInput.trim();if(f){e.authApiKeyBusy=!0,e.authApiKeyError=null;try{await qa(e.client,"anthropic",f),await e.handleAuthStatusCheck(),e.authApiKeyMode=!1,e.authApiKeyInput=""}catch(b){e.authApiKeyError=b instanceof Error?b.message:"Failed to save API key"}finally{e.authApiKeyBusy=!1}}},accountHasPin:(()=>{var b;const f=e.selectedWorkspace??((b=e.workspaces[0])==null?void 0:b.name);return f?e.accessState.accounts.some(S=>S.id===f):!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:(f,b)=>{var $;const S=e.selectedWorkspace??(($=e.workspaces[0])==null?void 0:$.name);S&&e.handleAccountPinSave(S,f,b)},publicChatEnabled:(()=>{var S;const f=(S=e.configSnapshot)==null?void 0:S.config,b=f==null?void 0:f.publicChat;return(b==null?void 0:b.enabled)===!0})(),publicChatAuthMode:(()=>{var $;const f=($=e.configSnapshot)==null?void 0:$.config,b=f==null?void 0:f.publicChat,S=b==null?void 0:b.auth;return S==="verified"||S==="choice"?S:"anonymous"})(),publicChatBusy:e.publicChatToggleBusy,onPublicChatToggle:async()=>{var f;if(!e.publicChatToggleBusy){e.publicChatToggleBusy=!0;try{const b=await e.client.request("config.get"),S=b.config,$=((f=S==null?void 0:S.publicChat)==null?void 0:f.enabled)===!0;await e.client.request("config.patch",{raw:JSON.stringify({publicChat:{enabled:!$}}),baseHash:b.hash,note:`Public chat → ${$?"disabled":"enabled"}`}),e.configSnapshot=await e.client.request("config.get")}catch(b){console.error("Public chat toggle failed:",b)}finally{e.publicChatToggleBusy=!1}}},onPublicChatAuthModeChange:async f=>{if(!e.publicChatToggleBusy){e.publicChatToggleBusy=!0;try{const b=await e.client.request("config.get");await e.client.request("config.patch",{raw:JSON.stringify({publicChat:{auth:f}}),baseHash:b.hash,note:`Public chat auth → ${f}`}),e.configSnapshot=await e.client.request("config.get")}catch(b){console.error("Public chat auth mode change failed:",b)}finally{e.publicChatToggleBusy=!1}}},tailscaleStatus:e.tailscaleStatus,tailscaleBusy:e.tailscaleBusy,tailscaleAuthUrl:e.tailscaleAuthUrl,tailscaleError:e.tailscaleError,tailscaleFunnelEnableUrl:e.tailscaleFunnelEnableUrl,onTailscaleEnable:async()=>{if(!e.tailscaleBusy){e.tailscaleBusy=!0,e.tailscaleAuthUrl=null;try{const f=await e.client.request("tailscale.enable");if(f.authUrl){e.tailscaleAuthUrl=f.authUrl;const b=setInterval(async()=>{try{const S=await e.client.request("tailscale.status");e.tailscaleStatus=S,S.loggedIn&&(clearInterval(b),e.tailscaleAuthUrl=null,e.tailscaleBusy=!1)}catch{}},3e3);setTimeout(()=>{clearInterval(b),e.tailscaleBusy&&(e.tailscaleBusy=!1)},3e5)}else f.alreadyLoggedIn&&(e.tailscaleStatus=await e.client.request("tailscale.status")),e.tailscaleBusy=!1}catch(f){console.error("Tailscale enable failed:",f),e.tailscaleBusy=!1}}},onTailscaleFunnelEnable:async()=>{var f;if(!e.tailscaleBusy){e.tailscaleBusy=!0,e.tailscaleError=null,e.tailscaleFunnelEnableUrl=null;try{await e.client.request("tailscale.funnel.enable")}catch(b){console.error("Tailscale funnel enable failed:",b);const S=b;(f=S.payload)!=null&&f.enableUrl&&(e.tailscaleFunnelEnableUrl=S.payload.enableUrl),e.tailscaleError=S.message||"Failed to enable Funnel",e.tailscaleBusy=!1}}},onTailscaleFunnelDisable:async()=>{if(!e.tailscaleBusy){e.tailscaleBusy=!0;try{await e.client.request("tailscale.funnel.disable")}catch(f){console.error("Tailscale funnel disable failed:",f),e.tailscaleBusy=!1}}},wifiStatus:e.wifiStatus,wifiNetworks:e.wifiNetworks,wifiBusy:e.wifiBusy,wifiError:e.wifiError,wifiPassword:e.wifiPassword,wifiSelectedSsid:e.wifiSelectedSsid,onWifiScan:async()=>{if(!e.wifiBusy){e.wifiBusy=!0,e.wifiError=null;try{const[f,b]=await Promise.all([e.client.request("wifi.scan"),e.client.request("wifi.status")]);e.wifiNetworks=f.networks,e.wifiStatus=b}catch(f){console.error("WiFi scan failed:",f),e.wifiError=f.message||"Failed to scan networks"}finally{e.wifiBusy=!1}}},onWifiConnect:async()=>{if(e.wifiBusy||!e.wifiSelectedSsid)return;const f=e.wifiSelectedSsid;e.wifiBusy=!0,e.wifiError=null;try{const b=await e.client.request("wifi.connect",{ssid:f,password:e.wifiPassword});e.wifiPassword="",e.wifiSelectedSsid=null,e.wifiNetworks=[],e.wifiStatus={available:!0,connected:b.connected,ssid:b.ssid,signal:null,ip:b.ip,savedSsid:b.ssid,autoconnect:!0},e.wifiBusy=!1;try{const S=await e.client.request("wifi.status");e.wifiStatus=S}catch{}}catch(b){console.error("WiFi connect failed:",b),e.wifiError=b.message||"Failed to connect",e.wifiBusy=!1}},onWifiDisconnect:async()=>{if(!e.wifiBusy){e.wifiBusy=!0,e.wifiError=null;try{await e.client.request("wifi.disconnect"),e.wifiNetworks=[],e.wifiSelectedSsid=null,e.wifiPassword="";const f=await e.client.request("wifi.status");e.wifiStatus=f}catch(f){console.error("WiFi disconnect failed:",f),e.wifiError=f.message||"Failed to disconnect"}finally{e.wifiBusy=!1}}},onWifiForget:async()=>{if(!e.wifiBusy){e.wifiBusy=!0,e.wifiError=null;try{await e.client.request("wifi.forget"),e.wifiNetworks=[],e.wifiSelectedSsid=null,e.wifiPassword="";const f=await e.client.request("wifi.status");e.wifiStatus=f}catch(f){console.error("WiFi forget failed:",f),e.wifiError=f.message||"Failed to forget network"}finally{e.wifiBusy=!1}}},onWifiDismiss:()=>{e.wifiNetworks=[],e.wifiSelectedSsid=null,e.wifiPassword="",e.wifiError=null},onWifiSelectSsid:f=>{e.wifiSelectedSsid=f,e.wifiPassword="",e.wifiError=null},onWifiPasswordChange:f=>{e.wifiPassword=f},wsProps:Sb(e)})}if(e.filesPage){const l=Ab(e);return Jh({connected:e.connected,wsProps:sn(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,currentDir:e.filesCurrentDir,message:e.filesMessage,uploadBusy:e.filesUploadBusy,reindexBusy:e.filesReindexBusy,memoryStatus:e.filesMemoryStatus,onRefresh:()=>Ut(e,l),onReindex:()=>dh(e,l),onSelectFile:d=>{e.filesPendingDeletePath=null,ih(e,d,l)},onToggleSelectFile:d=>sh(e,d,l),onToggleDir:d=>ph(e,d),onUpload:(d,h)=>ah(e,d,h,l),onNewFolder:(d,h)=>lh(e,d,h,l),onDownload:d=>oc(e,d,l),onBulkDownload:()=>oh(e,l),onDelete:d=>{e.filesPendingDeletePath=null,ch(e,d,l)},pendingDeletePath:e.filesPendingDeletePath,onArmDelete:d=>{e.filesPendingDeletePath=d||null},onMoveToDir:(d,h)=>rh(e,d,h,l),searchQuery:e.filesSearchQuery,searchResults:e.filesSearchResults,searchLoading:e.filesSearchLoading,searchAgentId:e.filesSearchAgentId,agentIds:e.workspaceAgentIds??[],onSearch:d=>{const h=e.filesSearchAgentId??l;hh(e,d,h)},onSearchAgentChange:d=>{e.filesSearchAgentId=d},onSearchClear:()=>{fh(e)},onSearchQueryChange:d=>{e.filesSearchQuery=d}})}if(e.browserPage)return Vh({connected:e.connected,active:e.browserScreencastActive,loading:e.browserLoading,error:e.browserError,inputMode:e.browserInputMode,fullscreen:e.browserFullscreen,handoffPending:e.browserHandoffPending,handoffReason:e.browserHandoffReason,onStart:()=>zv(e),onStop:()=>jv(e),onToggleInput:()=>qv(e),onToggleFullscreen:()=>Vv(e),onCompleteHandoff:()=>Hv(e),onCanvasMouseDown:l=>{const h=l.target.getBoundingClientRect(),f=hn().translateCoordinates(l.clientX-h.left,l.clientY-h.top);xs(e,"mousePressed",f.x,f.y,l.button===2?"right":l.button===1?"middle":"left")},onCanvasMouseUp:l=>{const h=l.target.getBoundingClientRect(),f=hn().translateCoordinates(l.clientX-h.left,l.clientY-h.top);xs(e,"mouseReleased",f.x,f.y)},onCanvasMouseMove:l=>{const d=hn();if(d.shouldThrottleMouseMove())return;const v=l.target.getBoundingClientRect(),f=d.translateCoordinates(l.clientX-v.left,l.clientY-v.top);xs(e,"mouseMoved",f.x,f.y)},onCanvasKeyDown:l=>{let d=0;l.altKey&&(d|=1),l.ctrlKey&&(d|=2),l.metaKey&&(d|=4),l.shiftKey&&(d|=8),$s(e,"keyDown",l.key,{code:l.code,modifiers:d||void 0}),l.key.length===1&&$s(e,"char",l.key,{text:l.key})},onCanvasKeyUp:l=>{$s(e,"keyUp",l.key,{code:l.code})}});if(e.adminsPage){const l=xb(e),d=$b(e);return yf({connected:e.connected,wsProps:sn(e),loading:e.adminsLoading,saving:e.adminsSaving,phones:e.adminPhones,error:e.adminsError,newPhone:e.adminsNewPhone,onRefresh:()=>Ii(e,l),onAdd:h=>{xu(e,h,l,d).then(()=>{e.adminsError||(e.adminsNewPhone="")})},onRemove:h=>$u(e,h,l,d),onNewPhoneChange:h=>e.handleAdminsNewPhoneChange(h)})}if(e.contactsPage){const l=Eb(e);return kf({connected:e.connected,wsProps:sn(e),loading:e.contactsLoading,saving:e.contactsSaving,records:e.contactsRecords,error:e.contactsError,searchQuery:e.contactsSearchQuery,editingId:e.contactsEditingId,showAddForm:e.contactsShowAddForm,newRecordPhone:e.contactsNewPhone,newRecordName:e.contactsNewName,onSearch:d=>e.contactsSearchQuery=d,onSearchSubmit:()=>yt(e,l),onAdd:(d,h)=>Au(e,d,h,l),onDelete:d=>Eu(e,d,l),onSetField:(d,h,v)=>Cu(e,d,h,v,l),onDeleteField:(d,h)=>Tu(e,d,h,l),onToggleExpand:d=>{e.contactsEditingId=e.contactsEditingId===d?null:d},onShowAddForm:()=>e.contactsShowAddForm=!0,onCancelAddForm:()=>{e.contactsShowAddForm=!1,e.contactsNewPhone="",e.contactsNewName=""},onNewRecordPhoneChange:d=>e.handleContactsNewPhoneChange(d),onNewRecordNameChange:d=>e.handleContactsNewNameChange(d),onRefresh:()=>yt(e,l)})}if(e.chatPage){const l=e.connected?null:"Disconnected from gateway.",d=el(e),h=e.chatAvatarUrl??d??null,v=(()=>{var S;const f=(S=e.configSnapshot)==null?void 0:S.config,b=f==null?void 0:f.publicChat;return(b==null?void 0:b.enabled)===!0})();return ev({connected:e.connected,wsProps:sn(e),publicChatEnabled:v,publicChatAccountId:e.selectedWorkspace??void 0,sessionKey:e.sessionKey,onSessionKeyChange:f=>{e.sessionKey=f,e.chatMessage="",e.chatAttachments=[],e.chatStream=null,e.chatInterimText=null,e.chatSuggestion=null,e.chatStreamStartedAt=null,e.chatRunId=null,e.chatQueue=[],e.resetToolStream(),e.resetChatScroll(),e.applySettings({...e.settings,sessionKey:f,lastActiveSessionKey:f}),e.loadAssistantIdentity(),Me(e),Ds(e)},thinkingLevel:e.chatThinkingLevel,showThinking:e.settings.chatShowThinking??!1,modelProvider:e.chatModelProvider,model:e.chatModel,modelCatalog:e.chatModelCatalog,onModelChange:f=>{const b=Math.max(e.chatMessages.length+10,Pe);Rn(e,e.sessionKey,{model:f}).then(()=>{Me(e,{limit:b})})},onThinkingLevelChange:f=>{const b=Math.max(e.chatMessages.length+10,Pe);Rn(e,e.sessionKey,{thinkingLevel:f==="off"?null:f}).then(()=>{Me(e,{limit:b})})},verboseLevel:e.chatVerboseLevel,fillerEnabled:e.chatFillerEnabled,suggestion:e.chatSuggestion,onSuggestionClick:f=>{e.chatMessage=f,e.chatSuggestion=null,e.handleSendChat()},onVerboseChange:f=>{const b=Math.max(e.chatMessages.length+10,Pe);Rn(e,e.sessionKey,{verboseLevel:f==="off"?null:f}).then(()=>{Me(e,{limit:b})})},onFillerChange:f=>{const b=Math.max(e.chatMessages.length+10,Pe);Rn(e,e.sessionKey,{fillerEnabled:f}).then(()=>{Me(e,{limit:b})})},loading:e.chatLoading,sending:e.chatSending,compactionStatus:e.compactionStatus,assistantAvatarUrl:h,messages:e.chatMessages,toolMessages:e.chatToolMessages,stream:e.chatStream,streamStartedAt:e.chatStreamStartedAt,interimText:e.chatInterimText,draft:e.chatMessage,queue:e.chatQueue,canSend:e.connected,disabledReason:l,error:e.lastError,sessions:e.sessionsResult,focusMode:!1,onRefresh:()=>{e.resetToolStream();const f=Math.max(e.chatMessages.length+10,Pe);return Promise.all([Me(e,{limit:f}),Ds(e)])},onToggleFocusMode:()=>{},onChatScroll:f=>e.handleChatScroll(f),nearBottom:e.chatUserNearBottom,hasMore:e.chatHistoryHasMore,loadingOlder:e.chatLoadingOlder,onLoadOlder:()=>{e.handleLoadOlderChat()},onDraftChange:f=>e.chatMessage=f,attachments:e.chatAttachments,onAttachmentsChange:f=>e.chatAttachments=f,onSend:()=>e.handleSendChat(),canAbort:!!e.chatRunId,onAbort:()=>{e.handleAbortChat()},onQueueRemove:f=>e.removeQueuedMessage(f),onNewSession:()=>e.handleSendChat("/new",{restoreDraft:!0}),sidebarOpen:e.sidebarOpen,sidebarContent:e.sidebarContent,sidebarError:e.sidebarError,splitRatio:e.splitRatio,onOpenSidebar:f=>e.handleOpenSidebar(f),onCloseSidebar:()=>e.handleCloseSidebar(),onSplitRatioChange:f=>e.handleSplitRatioChange(f),assistantName:e.assistantName,assistantAvatar:e.assistantAvatar})}return e.advancedPage?Mv({connected:e.connected,wsProps:sn(e),activeTab:e.advancedTab,onTabChange:l=>{e.advancedTab=l,l==="cron"&&e.loadCron(),l==="skills"&&ft(e,{clearMessages:!0}),l==="logs"&&(e.logsSubTab==="session"?un(e,{reset:!0}):Pt(e,{reset:!0}))},cronProps:{loading:e.cronLoading,status:e.cronStatus,jobs:e.cronJobs,error:e.cronError,busy:e.cronBusy,form:e.cronForm,channels:(r=(o=e.channelsSnapshot)==null?void 0:o.channelMeta)!=null&&r.length?e.channelsSnapshot.channelMeta.map(l=>l.id):((a=e.channelsSnapshot)==null?void 0:a.channelOrder)??[],channelLabels:((u=e.channelsSnapshot)==null?void 0:u.channelLabels)??{},channelMeta:((c=e.channelsSnapshot)==null?void 0:c.channelMeta)??[],agentIds:(()=>{var d;const l=oe(e);return((d=l==null?void 0:l.agents)==null?void 0:d.map(h=>h.id))??[]})(),runsJobId:e.cronRunsJobId,runs:e.cronRuns,newEventModalOpen:e.cronNewEventModal,onNewEventModalOpen:()=>{e.cronNewEventModal=!0},onNewEventModalClose:()=>{e.cronNewEventModal=!1},detailJobId:e.cronDetailJobId,onDetailOpen:l=>{e.cronDetailJobId=l.id,Ps(e,l.id)},onDetailClose:()=>{e.cronDetailJobId=null},onFormChange:l=>e.cronForm={...e.cronForm,...l},onRefresh:()=>e.loadCron(),onAdd:()=>{rp(e).then(()=>{e.cronNewEventModal=!1})},onToggle:(l,d)=>ap(e,l,d),onRun:l=>lp(e,l),onRemove:l=>cp(e,l),onLoadRuns:l=>Ps(e,l)},skillsProps:{loading:e.skillsLoading,report:e.skillsReport,error:e.skillsError,filter:e.skillsFilter,edits:e.skillEdits,messages:e.skillMessages,busyKey:e.skillsBusyKey,onFilterChange:l=>e.skillsFilter=l,onRefresh:()=>ft(e,{clearMessages:!0}),onToggle:(l,d)=>Yl(e,l,d),onEdit:(l,d)=>Ql(e,l,d),onSaveKey:l=>Xl(e,l),onInstall:(l,d,h)=>Zl(e,l,d,h)},logsProps:{logsSubTab:e.logsSubTab,onSubTabChange:l=>{e.logsSubTab=l,l==="session"?un(e,{reset:!0}):Pt(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,onFilterTextChange:l=>e.sessionLogsFilterText=l,onTypeToggle:(l,d)=>{const h=e;h.sessionLogsTypeFilters={...h.sessionLogsTypeFilters,[l]:d}},onAgentToggle:(l,d)=>{const h=e;h.sessionLogsAgentFilters={...h.sessionLogsAgentFilters,[l]:d}},onToggleAutoFollow:l=>e.sessionLogsAutoFollow=l,onRefresh:()=>{un(e,{reset:!0})},onExport:(l,d)=>e.exportSessionLogs(l,d),onScroll:l=>e.handleSessionLogsScroll(l)},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:l=>e.logsFilterText=l,onLevelToggle:(l,d)=>{e.logsLevelFilters={...e.logsLevelFilters,[l]:d}},onToggleAutoFollow:l=>e.logsAutoFollow=l,onRefresh:()=>Pt(e,{reset:!0}),onExport:(l,d)=>e.exportSessionLogs(l,d),onScroll:l=>e.handleLogsScroll(l)}}):(window.location.replace("/chat"),p``)}function Ib(e){const t=new Date(e),n=t.toLocaleDateString("en-GB",{day:"2-digit",month:"short"}),i=t.toLocaleTimeString("en-GB",{hour:"2-digit",minute:"2-digit"});return`${n} ${i}`}function tl(e){return e.startsWith("memory/public/")?"public":e.startsWith("memory/shared/")?"shared":"other"}function Rb(e,t,n){return p`
3505
- <div class="audit-modal-overlay" @click=${s=>{s.target.classList.contains("audit-modal-overlay")&&n()}}>
3506
- <div class="audit-modal-card">
3507
- <div class="audit-modal-header">
3508
- <h3>Memory Writes to Review</h3>
3509
- <button class="audit-modal-close" @click=${n}>&times;</button>
3510
- </div>
3511
- <p class="audit-modal-desc">
3512
- These files were written to shared or public folders by the agent.
3513
- Review to ensure no sensitive data was misplaced.
3514
- </p>
3515
- ${e.length===0?p`<p class="audit-modal-empty">No unreviewed writes.</p>`:p`
3516
- <div class="audit-modal-list">
3517
- ${e.map(s=>p`
3518
- <div class="audit-modal-entry">
3519
- <div class="audit-modal-entry-path">
3520
- <span class="audit-modal-folder audit-modal-folder--${tl(s.path)}">${tl(s.path)}</span>
3521
- <a href="/files" class="audit-modal-path-link">${s.path}</a>
3522
- </div>
3523
- <div class="audit-modal-entry-meta">
3524
- ${Ib(s.timestamp)}
3525
- <span class="audit-modal-agent">${s.agentId}</span>
3526
- </div>
3527
- </div>
3528
- `)}
3529
- </div>
3530
- <button class="setup-button audit-modal-clear" @click=${t}>
3531
- Mark All Reviewed
3532
- </button>
3533
- `}
3534
- </div>
3535
- </div>
3536
- `}const Nb={trace:!0,debug:!0,info:!0,warn:!0,error:!0,fatal:!0},Db={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:""};function Ob(e){e.basePath=$h();const t=Xe();if(Kh(t.accentColor),window.scrollTo(0,0),yh(e),e.publicChat){const n=window.__TASKMASTER_PUBLIC_CHAT_CONFIG__,i=(n==null?void 0:n.accountId)??"",s=i?i.charAt(0).toUpperCase()+i.slice(1):"Assistant";document.title=`Chat with ${s}`,Te(e);return}if(e.setup){document.title=`${t.name} Setup`,Te(e);return}if(e.filesPage){document.title=`${t.name} Files`,bh(e),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.contactsPage){document.title=`${t.name} Contacts`,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}Th(e,!0),Ah(e),Eh(e),window.addEventListener("popstate",e.popStateHandler),kh(e),Te(e),gh(e),e.tab==="logs"&&(e.logsSubTab==="session"?So(e):wo(e)),e.tab==="debug"&&$o(e)}function Bb(e){ep(e)}function Fb(e){var t;window.removeEventListener("popstate",e.popStateHandler),mh(e),ko(e),xo(e),Ao(e),vh(e),wh(e),Ch(e),(t=e.topbarObserver)==null||t.disconnect(),e.topbarObserver=null}function Ub(e,t){if(!e.publicChat){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.contactsPage&&e.connected&&t.has("connected")&&t.get("connected")===!1&&e.handleContactsLoad&&e.handleContactsLoad(),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 i=t.has("setupStep")&&e.setupStep==="auth";(n||i)&&e.setupStep==="auth"&&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(s=>{e.channelsSnapshot=s,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"),i=t.has("chatLoading")&&t.get("chatLoading")===!0&&e.chatLoading===!1;Bt(e,n||i||!e.chatHasAutoScrolled)}e.tab==="logs"&&!e.advancedPage&&(t.has("logsEntries")||t.has("logsAutoFollow")||t.has("tab"))&&e.logsAutoFollow&&e.logsAtBottom&&$l(e,t.has("tab")||t.has("logsAutoFollow"))}}function Wb(e){const t={name:(e==null?void 0:e.name)??"",displayName:(e==null?void 0:e.displayName)??"",about:(e==null?void 0:e.about)??"",picture:(e==null?void 0:e.picture)??"",banner:(e==null?void 0:e.banner)??"",website:(e==null?void 0:e.website)??"",nip05:(e==null?void 0:e.nip05)??"",lud16:(e==null?void 0:e.lud16)??""};return{values:t,original:{...t},saving:!1,importing:!1,error:null,success:null,fieldErrors:{},showAdvanced:!!(e!=null&&e.banner||e!=null&&e.website||e!=null&&e.nip05||e!=null&&e.lud16)}}async function Kb(e,t,n){await lo(e,t,n),await G(e,!0)}async function zb(e,t){await Cl(e,t),await G(e,!0)}async function jb(e,t){await Tl(e,t),await G(e,!0)}async function Hb(e,t){await _l(e,t)}async function qb(e,t){await Ml(e,t)}async function Vb(e){await ip(e),await Le(e),await G(e,!0)}async function Gb(e){await Le(e),await G(e,!0)}function Qb(e){if(!Array.isArray(e))return{};const t={};for(const n of e){if(typeof n!="string")continue;const[i,...s]=n.split(":");if(!i||s.length===0)continue;const o=i.trim(),r=s.join(":").trim();o&&r&&(t[o]=r)}return t}function _u(e){var n,i,s;return((s=(((i=(n=e.channelsSnapshot)==null?void 0:n.channelAccounts)==null?void 0:i.nostr)??[])[0])==null?void 0:s.accountId)??e.nostrProfileAccountId??"default"}function Mu(e,t=""){return`/api/channels/nostr/${encodeURIComponent(e)}/profile${t}`}function Yb(e,t,n){e.nostrProfileAccountId=t,e.nostrProfileFormState=Wb(n??void 0)}function Xb(e){e.nostrProfileFormState=null,e.nostrProfileAccountId=null}function Zb(e,t,n){const i=e.nostrProfileFormState;i&&(e.nostrProfileFormState={...i,values:{...i.values,[t]:n},fieldErrors:{...i.fieldErrors,[t]:""}})}function Jb(e){const t=e.nostrProfileFormState;t&&(e.nostrProfileFormState={...t,showAdvanced:!t.showAdvanced})}async function ew(e){const t=e.nostrProfileFormState;if(!t||t.saving)return;const n=_u(e);e.nostrProfileFormState={...t,saving:!0,error:null,success:null,fieldErrors:{}};try{const i=await fetch(Mu(n),{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t.values)}),s=await i.json().catch(()=>null);if(!i.ok||(s==null?void 0:s.ok)===!1||!s){const o=(s==null?void 0:s.error)??`Profile update failed (${i.status})`;e.nostrProfileFormState={...t,saving:!1,error:o,success:null,fieldErrors:Qb(s==null?void 0:s.details)};return}if(!s.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 G(e,!0)}catch(i){e.nostrProfileFormState={...t,saving:!1,error:`Profile update failed: ${String(i)}`,success:null}}}async function tw(e){const t=e.nostrProfileFormState;if(!t||t.importing)return;const n=_u(e);e.nostrProfileFormState={...t,importing:!0,error:null,success:null};try{const i=await fetch(Mu(n,"/import"),{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({autoMerge:!0})}),s=await i.json().catch(()=>null);if(!i.ok||(s==null?void 0:s.ok)===!1||!s){const u=(s==null?void 0:s.error)??`Profile import failed (${i.status})`;e.nostrProfileFormState={...t,importing:!1,error:u,success:null};return}const o=s.merged??s.imported??null,r=o?{...t.values,...o}:t.values,a=!!(r.banner||r.website||r.nip05||r.lud16);e.nostrProfileFormState={...t,importing:!1,values:r,error:null,success:s.saved?"Profile imported from relays. Review and publish.":"Profile imported. Review and publish.",showAdvanced:a},s.saved&&await G(e,!0)}catch(i){e.nostrProfileFormState={...t,importing:!1,error:`Profile import failed: ${String(i)}`,success:null}}}async function nw(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 iw(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 sw(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=""):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 ow(e,t){e.authCodeInput=t}function rw(e){e.setupStep="whatsapp"}async function aw(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 lw(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 cw(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 uw(e,t){e.licenseKey=t}async function dw(e){var t,n;if(!(!e.client||!e.connected)&&!e.gatewayHealthLoading){e.gatewayHealthLoading=!0,(t=e.requestUpdate)==null||t.call(e);try{const i=await e.client.request("health",{probe:!0});e.gatewayHealthy=i.ok===!0,e.gatewayHealthMessage=i.ok?`Healthy${i.durationMs?` (${i.durationMs}ms)`:""}`:"Unhealthy"}catch(i){e.gatewayHealthy=!1,e.gatewayHealthMessage=`Error: ${String(i)}`}finally{e.gatewayHealthLoading=!1,(n=e.requestUpdate)==null||n.call(e)}}}async function pw(e){var t,n,i;if(!(!e.client||e.gatewayRestartBusy)){e.gatewayRestartBusy=!0,e.gatewayHealthMessage="Restarting...",(t=e.requestUpdate)==null||t.call(e);try{const s=await e.client.request("gateway.restart",{reason:"Manual restart from setup page",delayMs:1e3});if(s.ok&&((n=s.restart)!=null&&n.ok))e.gatewayHealthMessage="Restarting...",setTimeout(()=>{window.location.reload()},3e3);else throw new Error("Restart not scheduled")}catch(s){e.gatewayHealthMessage=`Restart failed: ${String(s)}`,e.gatewayRestartBusy=!1,(i=e.requestUpdate)==null||i.call(e)}}}var hw=Object.defineProperty,fw=Object.getOwnPropertyDescriptor,m=(e,t,n,i)=>{for(var s=i>1?void 0:i?fw(t,n):t,o=e.length-1,r;o>=0;o--)(r=e[o])&&(s=(i?r(t,n,s):r(s))||s);return i&&s&&hw(t,n,s),s};const Cs=gd();function gw(){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 mw(){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 i=n.trim().toLowerCase();return i==="1"||i==="true"||i==="yes"||i==="on"}function yw(){const e=window.location.pathname;return e==="/files"||e.endsWith("/files")}function vw(){const e=window.location.pathname;return e==="/browser"||e.endsWith("/browser")}function bw(){const e=window.location.pathname;return e==="/admins"||e.endsWith("/admins")}function ww(){const e=window.location.pathname;return e==="/contacts"||e.endsWith("/contacts")}function kw(){const e=window.location.pathname;return e==="/chat"||e.endsWith("/chat")}function Sw(){const e=window.location.pathname;return e==="/advanced"||e.endsWith("/advanced")}let g=class extends Mt{constructor(){super(...arguments),this.settings=Yi(),this.password="",this.tab="chat",this.onboarding=gw(),this.setup=mw(),this.filesPage=yw(),this.browserPage=vw(),this.adminsPage=bw(),this.contactsPage=ww(),this.chatPage=kw(),this.advancedPage=Sw(),this.advancedTab="cron",this.publicChat=!!window.__TASKMASTER_PUBLIC_CHAT__,this.publicChatConfig=window.__TASKMASTER_PUBLIC_CHAT_CONFIG__??{},this.publicChatSessionKey=null,this.publicChatAuthenticated=!1,this.publicChatAuthStep="idle",this.connected=!1,this.accessState=bu,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=Cs.name,this.assistantAvatar=Cs.avatar,this.assistantAgentId=Cs.agentId??null,this.sessionKey=this.settings.sessionKey,this.chatLoading=!1,this.chatSending=!1,this.chatMessage="",this.chatMessages=[],this.chatHistoryTotal=0,this.chatHistoryHasMore=!1,this.chatLoadingOlder=!1,this.chatToolMessages=[],this.chatStream=null,this.chatInterimText=null,this.chatSuggestion=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=`{
3537
- }
3538
- `,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.publicChatToggleBusy=!1,this.tailscaleStatus=null,this.tailscaleBusy=!1,this.tailscaleAuthUrl=null,this.tailscaleError=null,this.tailscaleFunnelEnableUrl=null,this.wifiStatus=null,this.wifiNetworks=[],this.wifiBusy=!1,this.wifiError=null,this.wifiPassword="",this.wifiSelectedSsid=null,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={...Db},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.browserFullscreen=!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.filesCurrentDir=".",this.filesPendingDeletePath=null,this.filesMessage=null,this.filesUploadBusy=!1,this.filesReindexBusy=!1,this.filesMemoryStatus=null,this.embeddingDownloading=!1,this.embeddingPollTimer=null,this.filesSearchQuery="",this.filesSearchResults=null,this.filesSearchLoading=!1,this.filesSearchAgentId=null,this.filesResolvedAgentId=void 0,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.contactsLoading=!1,this.contactsSaving=!1,this.contactsRecords=[],this.contactsError=null,this.contactsSearchQuery="",this.contactsEditingId=null,this.contactsShowAddForm=!1,this.contactsNewPhone="",this.contactsNewName="",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.apiKeySavingProvider=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={...Nb},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.sessionLogsCursors={},this.sessionLogsLastFetchAt=null,this.sessionLogsAtBottom=!0,this.client=null,this.chatScrollFrame=null,this.chatScrollTimeout=null,this.chatHasAutoScrolled=!1,this.chatUserNearBottom=!0,this.onLoadOlder=()=>this.handleLoadOlderChat(),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=()=>_h(this),this.themeMedia=null,this.themeMediaHandler=null,this.topbarObserver=null}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),Ob(this)}firstUpdated(){Bb(this)}disconnectedCallback(){this.stopEmbeddingPoll(),Fb(this),super.disconnectedCallback()}startEmbeddingPoll(){if(this.embeddingPollTimer!=null)return;const e=async()=>{if(!(!this.client||!this.connected)){try{const t=await this.client.request("memory.status",{});if((t==null?void 0:t.embeddingState)==="downloading")this.embeddingDownloading=!0;else{this.embeddingDownloading&&(this.embeddingDownloading=!1),this.stopEmbeddingPoll();return}}catch{this.embeddingDownloading=!1,this.stopEmbeddingPoll();return}this.embeddingPollTimer=window.setTimeout(e,3e3)}};e()}stopEmbeddingPoll(){this.embeddingPollTimer!=null&&(window.clearTimeout(this.embeddingPollTimer),this.embeddingPollTimer=null)}updated(e){Ub(this,e)}connect(){Te(this)}handleChatScroll(e){Vd(this,e)}handleLogsScroll(e){Qd(this,e)}handleSessionLogsScroll(e){Yd(this,e)}exportLogs(e,t){Zd(e,t)}exportSessionLogs(e,t){Jd(e,t)}resetToolStream(){ao(this)}resetChatScroll(){Xd(this)}async loadAssistantIdentity(){await Js(this)}applySettings(e){Ge(this,e)}setTab(e){Sh(this,e)}setTheme(e,t){xh(this,e,t)}async loadOverview(){await cc(this)}async loadCron(){var t;const e=this.getSelectedWorkspaceInfo();this.workspaceAgentIds=((t=e==null?void 0:e.agents)==null?void 0:t.map(n=>n.id))??void 0,this.cronForm={...this.cronForm,accountId:(e==null?void 0:e.whatsappAccountId)??void 0},await Eo(this)}async handleAbortChat(){await dc(this)}removeQueuedMessage(e){Ih(this,e)}async handleSendChat(e,t){await Rh(this,e,t)}async handleWhatsAppStart(e,t){await Kb(this,e,t)}async handleWhatsAppWait(e){await zb(this,e)}async handleWhatsAppLogout(e){await jb(this,e)}async handleAddWhatsAppAccount(e){await Hb(this,e)}async handleRemoveWhatsAppAccount(e){await qb(this,e)}async handleAccessCheck(){await Ja(this)}async handlePinSubmit(e,t){await gb(this,e,t),this.accessState.authenticated&&this.accessState.workspace&&this.handleWorkspaceSelect(this.accessState.workspace)}async handleSetMasterPin(e){await mb(this,e)}async handleLogout(){await vb(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 i=await this.client.request("access.verify",{account:e,pin:t});if(!i.ok){this.changePinError=i.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 i=await this.client.request("access.verify",{account:e,pin:t});if(!i.ok){this.accountPinError=i.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 Ja(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 aw(this)}async handleLicenseActivate(){await lw(this)}async handleLicenseRemove(){await cw(this)}handleLicenseKeyChange(e){uw(this,e)}async handleAuthStatusCheck(){await nw(this)}async handleAuthStart(){await iw(this)}async handleAuthSubmitCode(e){await sw(this,e)}handleAuthCodeChange(e){ow(this,e)}handleSkipToWhatsApp(){rw(this)}async handleGatewayHealthCheck(){await dw(this)}async handleGatewayRestart(){await pw(this)}async handleUpdateCheck(){await gu(this)}async handleUpdateRun(){await Zv(this)}handleUpdateDismissResult(){tb(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 ie(async()=>{const{runUninstall:t}=await Promise.resolve().then(()=>Br);return{runUninstall:t}},void 0,import.meta.url);await e(this)}handleUninstallDismiss(){ie(async()=>{const{clearUninstallDone:e}=await Promise.resolve().then(()=>Br);return{clearUninstallDone:e}},void 0,import.meta.url).then(({clearUninstallDone:e})=>{e()}),this.uninstallDone=!1,this.uninstallConfirm=!1,this.uninstallConfirmText=""}async loadAuditEntries(){await ic(this)}async clearAudit(){await nh(this),this.auditModalOpen=!1}handleFilesLoad(){var n;const e=this.getSelectedWorkspaceInfo();this.workspaceAgentIds=((n=e==null?void 0:e.agents)==null?void 0:n.map(i=>i.id))??void 0;const t=this.resolveFilesAgentId();this.filesResolvedAgentId=t,Ut(this,t),bo(this,t)}handleAdminsLoad(){const e=this.resolveAdminAgentId();ie(async()=>{const{loadAdmins:t}=await Promise.resolve().then(()=>wb);return{loadAdmins:t}},void 0,import.meta.url).then(({loadAdmins:t})=>{t(this,e)})}resolveAdminAgentId(){const e=this.getSelectedWorkspaceInfo();if(!e)return;const t=e.agents.find(n=>n.id.endsWith("-admin")||n.id==="admin");return t==null?void 0:t.id}resolveFilesAgentId(){var n;const e=this.getSelectedWorkspaceInfo();if(!e)return;const t=e.agents.find(i=>i.id.endsWith("-admin")||i.id==="admin");return(t==null?void 0:t.id)??((n=e.agents[0])==null?void 0:n.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.chatInterimText=null,this.chatRunId=null,this.chatSuggestion=null,this.resetChatScroll(),this.applySettings({...this.settings,sessionKey:t,lastActiveSessionKey:t}),this.loadAssistantIdentity())}ie(async()=>{const{loadChatHistory:t}=await Promise.resolve().then(()=>oi);return{loadChatHistory:t}},void 0,import.meta.url).then(({loadChatHistory:t})=>{t(this).then(()=>{Bt(this,!0)})})}async handleLoadOlderChat(){if(this.chatLoadingOlder||!this.chatHistoryHasMore)return;const e=Gd(this),{loadOlderChatHistory:t}=await ie(async()=>{const{loadOlderChatHistory:i}=await Promise.resolve().then(()=>oi);return{loadOlderChatHistory:i}},void 0,import.meta.url);await t(this)&&e&&(await this.updateComplete,e())}handleAdvancedLoad(){var t;const e=this.getSelectedWorkspaceInfo();this.workspaceAgentIds=((t=e==null?void 0:e.agents)==null?void 0:t.map(n=>n.id))??void 0,this.sessionLogsEntries=[],this.sessionLogsCursors={},this.sessionLogsAgents=[],this.advancedTab==="cron"&&this.loadCron(),this.advancedTab==="logs"&&(this.logsSubTab==="session"?ie(async()=>{const{loadSessionLogs:n}=await Promise.resolve().then(()=>nc);return{loadSessionLogs:n}},void 0,import.meta.url).then(({loadSessionLogs:n})=>{n(this,{reset:!0})}):ie(async()=>{const{loadLogs:n}=await Promise.resolve().then(()=>gp);return{loadLogs:n}},void 0,import.meta.url).then(({loadLogs:n})=>{n(this,{reset:!0})})),this.advancedTab==="skills"&&ie(async()=>{const{loadSkills:n}=await Promise.resolve().then(()=>Qp);return{loadSkills:n}},void 0,import.meta.url).then(({loadSkills:n})=>{n(this,{clearMessages:!0})})}async handleChannelConfigSave(){await Vb(this)}async handleChannelConfigReload(){await Gb(this)}handleNostrProfileEdit(e,t){Yb(this,e,t)}handleNostrProfileCancel(){Xb(this)}handleNostrProfileFieldChange(e,t){Zb(this,e,t)}async handleNostrProfileSave(){await ew(this)}async handleNostrProfileImport(){await tw(this)}handleNostrProfileToggleAdvanced(){Jb(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)}handleContactsLoad(){const e=this.selectedWorkspace??void 0;ie(async()=>{const{loadContacts:t}=await Promise.resolve().then(()=>kb);return{loadContacts:t}},void 0,import.meta.url).then(({loadContacts:t})=>{t(this,e)})}handleContactsNewPhoneChange(e){this.contactsNewPhone=e,this.contactsError&&(this.contactsError=null)}handleContactsNewNameChange(e){this.contactsNewName=e,this.contactsError&&(this.contactsError=null)}async handleWorkspacesLoad(){const{loadWorkspaces:e}=await ie(async()=>{const{loadWorkspaces:t}=await Promise.resolve().then(()=>Vn);return{loadWorkspaces:t}},void 0,import.meta.url);await e(this)}async handleWorkspaceCreate(e,t){const{createWorkspace:n}=await ie(async()=>{const{createWorkspace:s}=await Promise.resolve().then(()=>Vn);return{createWorkspace:s}},void 0,import.meta.url),{loadChannels:i}=await ie(async()=>{const{loadChannels:s}=await Promise.resolve().then(()=>up);return{loadChannels:s}},void 0,import.meta.url);await n(this,{name:e,workspacePath:t,onCreated:s=>{if(!s.whatsappAccountId)return;const o=s.whatsappAccountId;this.handleWorkspaceSelect(e),setTimeout(async()=>{try{await i(this,!0),await this.handleWhatsAppStart(!0,o),this.whatsappLoginQrDataUrl&&(await this.handleWhatsAppWait(o),await i(this,!0),await this.handleWorkspacesLoad())}catch{}this.requestUpdate()},3e3)}})}async handleWorkspaceRemove(e){const{removeWorkspace:t}=await ie(async()=>{const{removeWorkspace:n}=await Promise.resolve().then(()=>Vn);return{removeWorkspace:n}},void 0,import.meta.url);await t(this,e)}handleWorkspaceRenameStart(){const e=this.getSelectedWorkspaceInfo();this.renameWorkspaceName=(e==null?void 0:e.displayName)??(e==null?void 0:e.name)??"",this.renamingWorkspace=!0}handleWorkspaceRenameCancel(){this.renamingWorkspace=!1,this.renameWorkspaceName=""}async handleWorkspaceRename(e,t){const{renameWorkspace:n}=await ie(async()=>{const{renameWorkspace:i}=await Promise.resolve().then(()=>Vn);return{renameWorkspace:i}},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),Ar(e),this.settings=Yi(),this.chatMessage="",this.chatAttachments=[],this.chatStream=null,this.chatInterimText=null,this.chatSuggestion=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.contactsPage?this.handleContactsLoad():this.filesPage?this.handleFilesLoad():this.chatPage?this.handleChatLoad():this.advancedPage&&this.handleAdvancedLoad()}initWorkspaceSelection(){if(this.workspaces.length===0){this.reloadCurrentPageData();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(i=>i.isDefault)??this.workspaces[0];this.selectedWorkspace=n.name,localStorage.setItem("taskmaster-selected-workspace",n.name)}Ar(this.selectedWorkspace),this.settings=Yi(),this.reloadCurrentPageData()}render(){return p`${Lb(this)}${this.auditModalOpen?Rb(this.auditEntries,()=>this.clearAudit(),()=>{this.auditModalOpen=!1}):k}`}};m([y()],g.prototype,"settings",2);m([y()],g.prototype,"password",2);m([y()],g.prototype,"tab",2);m([y()],g.prototype,"onboarding",2);m([y()],g.prototype,"setup",2);m([y()],g.prototype,"filesPage",2);m([y()],g.prototype,"browserPage",2);m([y()],g.prototype,"adminsPage",2);m([y()],g.prototype,"contactsPage",2);m([y()],g.prototype,"chatPage",2);m([y()],g.prototype,"advancedPage",2);m([y()],g.prototype,"advancedTab",2);m([y()],g.prototype,"publicChat",2);m([y()],g.prototype,"publicChatConfig",2);m([y()],g.prototype,"publicChatSessionKey",2);m([y()],g.prototype,"publicChatAuthenticated",2);m([y()],g.prototype,"publicChatAuthStep",2);m([y()],g.prototype,"connected",2);m([y()],g.prototype,"accessState",2);m([y()],g.prototype,"theme",2);m([y()],g.prototype,"themeResolved",2);m([y()],g.prototype,"hello",2);m([y()],g.prototype,"lastError",2);m([y()],g.prototype,"eventLog",2);m([y()],g.prototype,"assistantName",2);m([y()],g.prototype,"assistantAvatar",2);m([y()],g.prototype,"assistantAgentId",2);m([y()],g.prototype,"sessionKey",2);m([y()],g.prototype,"chatLoading",2);m([y()],g.prototype,"chatSending",2);m([y()],g.prototype,"chatMessage",2);m([y()],g.prototype,"chatMessages",2);m([y()],g.prototype,"chatHistoryTotal",2);m([y()],g.prototype,"chatHistoryHasMore",2);m([y()],g.prototype,"chatLoadingOlder",2);m([y()],g.prototype,"chatToolMessages",2);m([y()],g.prototype,"chatStream",2);m([y()],g.prototype,"chatInterimText",2);m([y()],g.prototype,"chatSuggestion",2);m([y()],g.prototype,"chatStreamStartedAt",2);m([y()],g.prototype,"chatRunId",2);m([y()],g.prototype,"compactionStatus",2);m([y()],g.prototype,"chatAvatarUrl",2);m([y()],g.prototype,"chatThinkingLevel",2);m([y()],g.prototype,"chatModelProvider",2);m([y()],g.prototype,"chatModel",2);m([y()],g.prototype,"chatModelCatalog",2);m([y()],g.prototype,"chatVerboseLevel",2);m([y()],g.prototype,"chatFillerEnabled",2);m([y()],g.prototype,"chatQueue",2);m([y()],g.prototype,"chatAttachments",2);m([y()],g.prototype,"sidebarOpen",2);m([y()],g.prototype,"sidebarContent",2);m([y()],g.prototype,"sidebarError",2);m([y()],g.prototype,"splitRatio",2);m([y()],g.prototype,"nodesLoading",2);m([y()],g.prototype,"nodes",2);m([y()],g.prototype,"devicesLoading",2);m([y()],g.prototype,"devicesError",2);m([y()],g.prototype,"devicesList",2);m([y()],g.prototype,"execApprovalsLoading",2);m([y()],g.prototype,"execApprovalsSaving",2);m([y()],g.prototype,"execApprovalsDirty",2);m([y()],g.prototype,"execApprovalsSnapshot",2);m([y()],g.prototype,"execApprovalsForm",2);m([y()],g.prototype,"execApprovalsSelectedAgent",2);m([y()],g.prototype,"execApprovalsTarget",2);m([y()],g.prototype,"execApprovalsTargetNodeId",2);m([y()],g.prototype,"execApprovalQueue",2);m([y()],g.prototype,"execApprovalBusy",2);m([y()],g.prototype,"execApprovalError",2);m([y()],g.prototype,"configLoading",2);m([y()],g.prototype,"configRaw",2);m([y()],g.prototype,"configRawOriginal",2);m([y()],g.prototype,"configValid",2);m([y()],g.prototype,"configIssues",2);m([y()],g.prototype,"configSaving",2);m([y()],g.prototype,"configApplying",2);m([y()],g.prototype,"updateRunning",2);m([y()],g.prototype,"applySessionKey",2);m([y()],g.prototype,"configSnapshot",2);m([y()],g.prototype,"configSchema",2);m([y()],g.prototype,"configSchemaVersion",2);m([y()],g.prototype,"configSchemaLoading",2);m([y()],g.prototype,"configUiHints",2);m([y()],g.prototype,"configForm",2);m([y()],g.prototype,"configFormOriginal",2);m([y()],g.prototype,"configFormDirty",2);m([y()],g.prototype,"configFormMode",2);m([y()],g.prototype,"configSearchQuery",2);m([y()],g.prototype,"configActiveSection",2);m([y()],g.prototype,"configActiveSubsection",2);m([y()],g.prototype,"channelsLoading",2);m([y()],g.prototype,"channelsSnapshot",2);m([y()],g.prototype,"channelsError",2);m([y()],g.prototype,"channelsLastSuccess",2);m([y()],g.prototype,"whatsappLoginMessage",2);m([y()],g.prototype,"whatsappLoginQrDataUrl",2);m([y()],g.prototype,"whatsappLoginConnected",2);m([y()],g.prototype,"whatsappBusy",2);m([y()],g.prototype,"whatsappActiveQrAccountId",2);m([y()],g.prototype,"whatsappPairedPhone",2);m([y()],g.prototype,"addingWhatsAppAccount",2);m([y()],g.prototype,"newWhatsAppAccountName",2);m([y()],g.prototype,"whatsappAccountError",2);m([y()],g.prototype,"whatsappAccountSaving",2);m([y()],g.prototype,"whatsappSettingsOpen",2);m([y()],g.prototype,"publicChatToggleBusy",2);m([y()],g.prototype,"tailscaleStatus",2);m([y()],g.prototype,"tailscaleBusy",2);m([y()],g.prototype,"tailscaleAuthUrl",2);m([y()],g.prototype,"tailscaleError",2);m([y()],g.prototype,"tailscaleFunnelEnableUrl",2);m([y()],g.prototype,"wifiStatus",2);m([y()],g.prototype,"wifiNetworks",2);m([y()],g.prototype,"wifiBusy",2);m([y()],g.prototype,"wifiError",2);m([y()],g.prototype,"wifiPassword",2);m([y()],g.prototype,"wifiSelectedSsid",2);m([y()],g.prototype,"licenseKey",2);m([y()],g.prototype,"licenseBusy",2);m([y()],g.prototype,"licenseValid",2);m([y()],g.prototype,"licenseMessage",2);m([y()],g.prototype,"licenseTier",2);m([y()],g.prototype,"licenseDeviceId",2);m([y()],g.prototype,"licenseStoredKey",2);m([y()],g.prototype,"licenseRemoveConfirm",2);m([y()],g.prototype,"authConnected",2);m([y()],g.prototype,"authBusy",2);m([y()],g.prototype,"authMessage",2);m([y()],g.prototype,"authUrl",2);m([y()],g.prototype,"authCodeInput",2);m([y()],g.prototype,"authExpiresIn",2);m([y()],g.prototype,"setupStep",2);m([y()],g.prototype,"gatewayHealthy",2);m([y()],g.prototype,"gatewayHealthLoading",2);m([y()],g.prototype,"gatewayHealthMessage",2);m([y()],g.prototype,"gatewayRestartBusy",2);m([y()],g.prototype,"updateAvailable",2);m([y()],g.prototype,"currentVersion",2);m([y()],g.prototype,"latestVersion",2);m([y()],g.prototype,"updateChecking",2);m([y()],g.prototype,"updateMessage",2);m([y()],g.prototype,"updateProgressSteps",2);m([y()],g.prototype,"updateLastResult",2);m([y()],g.prototype,"uninstallConfirm",2);m([y()],g.prototype,"uninstallBusy",2);m([y()],g.prototype,"uninstallDone",2);m([y()],g.prototype,"uninstallError",2);m([y()],g.prototype,"uninstallConfirmText",2);m([y()],g.prototype,"nostrProfileFormState",2);m([y()],g.prototype,"nostrProfileAccountId",2);m([y()],g.prototype,"presenceLoading",2);m([y()],g.prototype,"presenceEntries",2);m([y()],g.prototype,"presenceError",2);m([y()],g.prototype,"presenceStatus",2);m([y()],g.prototype,"agentsLoading",2);m([y()],g.prototype,"agentsList",2);m([y()],g.prototype,"agentsError",2);m([y()],g.prototype,"sessionsLoading",2);m([y()],g.prototype,"sessionsResult",2);m([y()],g.prototype,"sessionsError",2);m([y()],g.prototype,"cronLoading",2);m([y()],g.prototype,"cronJobs",2);m([y()],g.prototype,"cronStatus",2);m([y()],g.prototype,"cronError",2);m([y()],g.prototype,"cronForm",2);m([y()],g.prototype,"cronRunsJobId",2);m([y()],g.prototype,"cronRuns",2);m([y()],g.prototype,"cronBusy",2);m([y()],g.prototype,"cronNewEventModal",2);m([y()],g.prototype,"cronDetailJobId",2);m([y()],g.prototype,"browserScreencastActive",2);m([y()],g.prototype,"browserScreencastFrame",2);m([y()],g.prototype,"browserScreencastMetadata",2);m([y()],g.prototype,"browserHandoffPending",2);m([y()],g.prototype,"browserHandoffReason",2);m([y()],g.prototype,"browserHandoffId",2);m([y()],g.prototype,"browserInputMode",2);m([y()],g.prototype,"browserFullscreen",2);m([y()],g.prototype,"browserLoading",2);m([y()],g.prototype,"browserError",2);m([y()],g.prototype,"filesLoading",2);m([y()],g.prototype,"filesTree",2);m([y()],g.prototype,"filesRoot",2);m([y()],g.prototype,"filesError",2);m([y()],g.prototype,"filesSelectedPath",2);m([y()],g.prototype,"filesSelectedPaths",2);m([y()],g.prototype,"filesPreviewContent",2);m([y()],g.prototype,"filesPreviewLoading",2);m([y()],g.prototype,"filesPreviewBinary",2);m([y()],g.prototype,"filesPreviewSize",2);m([y()],g.prototype,"filesExpandedDirs",2);m([y()],g.prototype,"filesCurrentDir",2);m([y()],g.prototype,"filesPendingDeletePath",2);m([y()],g.prototype,"filesMessage",2);m([y()],g.prototype,"filesUploadBusy",2);m([y()],g.prototype,"filesReindexBusy",2);m([y()],g.prototype,"filesMemoryStatus",2);m([y()],g.prototype,"embeddingDownloading",2);m([y()],g.prototype,"filesSearchQuery",2);m([y()],g.prototype,"filesSearchResults",2);m([y()],g.prototype,"filesSearchLoading",2);m([y()],g.prototype,"filesSearchAgentId",2);m([y()],g.prototype,"auditEntries",2);m([y()],g.prototype,"auditLoading",2);m([y()],g.prototype,"auditModalOpen",2);m([y()],g.prototype,"skillsLoading",2);m([y()],g.prototype,"skillsReport",2);m([y()],g.prototype,"skillsError",2);m([y()],g.prototype,"skillsFilter",2);m([y()],g.prototype,"skillEdits",2);m([y()],g.prototype,"skillsBusyKey",2);m([y()],g.prototype,"skillMessages",2);m([y()],g.prototype,"adminsLoading",2);m([y()],g.prototype,"adminPhones",2);m([y()],g.prototype,"adminsError",2);m([y()],g.prototype,"adminsSaving",2);m([y()],g.prototype,"adminsNewPhone",2);m([y()],g.prototype,"contactsLoading",2);m([y()],g.prototype,"contactsSaving",2);m([y()],g.prototype,"contactsRecords",2);m([y()],g.prototype,"contactsError",2);m([y()],g.prototype,"contactsSearchQuery",2);m([y()],g.prototype,"contactsEditingId",2);m([y()],g.prototype,"contactsShowAddForm",2);m([y()],g.prototype,"contactsNewPhone",2);m([y()],g.prototype,"contactsNewName",2);m([y()],g.prototype,"imessageEnableConfirm",2);m([y()],g.prototype,"imessageEnabling",2);m([y()],g.prototype,"infoModalOpen",2);m([y()],g.prototype,"workspaces",2);m([y()],g.prototype,"workspacesLoading",2);m([y()],g.prototype,"workspacesError",2);m([y()],g.prototype,"selectedWorkspace",2);m([y()],g.prototype,"addingWorkspace",2);m([y()],g.prototype,"newWorkspaceName",2);m([y()],g.prototype,"newWorkspacePath",2);m([y()],g.prototype,"newWorkspacePin",2);m([y()],g.prototype,"accountPinModalOpen",2);m([y()],g.prototype,"accountPinBusy",2);m([y()],g.prototype,"accountPinError",2);m([y()],g.prototype,"accountPinSuccess",2);m([y()],g.prototype,"apiKeyProviders",2);m([y()],g.prototype,"apiKeyModalOpen",2);m([y()],g.prototype,"apiKeyBusy",2);m([y()],g.prototype,"apiKeyError",2);m([y()],g.prototype,"apiKeySuccess",2);m([y()],g.prototype,"apiKeySavingProvider",2);m([y()],g.prototype,"authApiKeyMode",2);m([y()],g.prototype,"authApiKeyInput",2);m([y()],g.prototype,"authApiKeyBusy",2);m([y()],g.prototype,"authApiKeyError",2);m([y()],g.prototype,"pinChanging",2);m([y()],g.prototype,"pinChangeBusy",2);m([y()],g.prototype,"pinChangeError",2);m([y()],g.prototype,"loginChangePinMode",2);m([y()],g.prototype,"changePinBusy",2);m([y()],g.prototype,"changePinError",2);m([y()],g.prototype,"changePinSuccess",2);m([y()],g.prototype,"workspaceSaving",2);m([y()],g.prototype,"workspaceRemoveConfirm",2);m([y()],g.prototype,"renamingWorkspace",2);m([y()],g.prototype,"renameWorkspaceName",2);m([y()],g.prototype,"debugLoading",2);m([y()],g.prototype,"debugStatus",2);m([y()],g.prototype,"debugHealth",2);m([y()],g.prototype,"debugModels",2);m([y()],g.prototype,"debugHeartbeat",2);m([y()],g.prototype,"debugCallMethod",2);m([y()],g.prototype,"debugCallParams",2);m([y()],g.prototype,"debugCallResult",2);m([y()],g.prototype,"debugCallError",2);m([y()],g.prototype,"logsLoading",2);m([y()],g.prototype,"logsError",2);m([y()],g.prototype,"logsFile",2);m([y()],g.prototype,"logsEntries",2);m([y()],g.prototype,"logsFilterText",2);m([y()],g.prototype,"logsLevelFilters",2);m([y()],g.prototype,"logsAutoFollow",2);m([y()],g.prototype,"logsTruncated",2);m([y()],g.prototype,"logsCursor",2);m([y()],g.prototype,"logsLastFetchAt",2);m([y()],g.prototype,"logsLimit",2);m([y()],g.prototype,"logsMaxBytes",2);m([y()],g.prototype,"logsAtBottom",2);m([y()],g.prototype,"logsSubTab",2);m([y()],g.prototype,"sessionLogsLoading",2);m([y()],g.prototype,"sessionLogsError",2);m([y()],g.prototype,"sessionLogsEntries",2);m([y()],g.prototype,"sessionLogsFilterText",2);m([y()],g.prototype,"sessionLogsTypeFilters",2);m([y()],g.prototype,"sessionLogsAgentFilters",2);m([y()],g.prototype,"sessionLogsAgents",2);m([y()],g.prototype,"sessionLogsAutoFollow",2);m([y()],g.prototype,"sessionLogsCursors",2);m([y()],g.prototype,"sessionLogsLastFetchAt",2);m([y()],g.prototype,"sessionLogsAtBottom",2);m([y()],g.prototype,"chatUserNearBottom",2);g=m([ul("taskmaster-app")],g);
3539
- //# sourceMappingURL=index-DtuDNTAC.js.map