clawdbot 2026.1.4-1 → 2026.1.5-1

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 (116) hide show
  1. package/CHANGELOG.md +32 -6
  2. package/README.md +26 -1
  3. package/dist/agents/pi-embedded-runner.js +2 -0
  4. package/dist/agents/pi-embedded-subscribe.js +18 -3
  5. package/dist/agents/pi-tools.js +45 -6
  6. package/dist/agents/tools/browser-tool.js +38 -89
  7. package/dist/agents/tools/cron-tool.js +8 -8
  8. package/dist/agents/workspace.js +8 -1
  9. package/dist/auto-reply/command-detection.js +26 -0
  10. package/dist/auto-reply/reply/agent-runner.js +15 -8
  11. package/dist/auto-reply/reply/commands.js +36 -25
  12. package/dist/auto-reply/reply/directive-handling.js +4 -2
  13. package/dist/auto-reply/reply/directives.js +12 -0
  14. package/dist/auto-reply/reply/session-updates.js +2 -4
  15. package/dist/auto-reply/reply.js +26 -4
  16. package/dist/browser/config.js +22 -4
  17. package/dist/browser/profiles-service.js +3 -1
  18. package/dist/browser/profiles.js +14 -3
  19. package/dist/canvas-host/a2ui/.bundle.hash +2 -0
  20. package/dist/cli/gateway-cli.js +2 -2
  21. package/dist/cli/profile.js +81 -0
  22. package/dist/cli/program.js +10 -1
  23. package/dist/cli/run-main.js +33 -0
  24. package/dist/commands/configure.js +5 -0
  25. package/dist/commands/onboard-providers.js +1 -1
  26. package/dist/commands/setup.js +4 -1
  27. package/dist/config/defaults.js +56 -0
  28. package/dist/config/io.js +47 -6
  29. package/dist/config/paths.js +2 -2
  30. package/dist/config/port-defaults.js +32 -0
  31. package/dist/config/sessions.js +3 -2
  32. package/dist/config/validation.js +2 -2
  33. package/dist/config/zod-schema.js +16 -0
  34. package/dist/discord/monitor.js +75 -266
  35. package/dist/entry.js +16 -0
  36. package/dist/gateway/call.js +8 -1
  37. package/dist/gateway/server-methods/chat.js +1 -1
  38. package/dist/gateway/server.js +14 -3
  39. package/dist/index.js +2 -2
  40. package/dist/infra/control-ui-assets.js +118 -0
  41. package/dist/infra/dotenv.js +15 -0
  42. package/dist/infra/shell-env.js +79 -0
  43. package/dist/infra/system-events.js +50 -23
  44. package/dist/macos/relay.js +8 -2
  45. package/dist/telegram/bot.js +24 -1
  46. package/dist/utils.js +8 -2
  47. package/dist/web/auto-reply.js +18 -21
  48. package/dist/web/inbound.js +5 -1
  49. package/dist/web/qr-image.js +4 -4
  50. package/dist/web/session.js +2 -3
  51. package/docs/agent.md +0 -2
  52. package/docs/assets/markdown.css +4 -1
  53. package/docs/audio.md +0 -2
  54. package/docs/clawd.md +0 -2
  55. package/docs/configuration.md +62 -3
  56. package/docs/docs.json +9 -1
  57. package/docs/faq.md +32 -7
  58. package/docs/gateway.md +28 -0
  59. package/docs/images.md +0 -2
  60. package/docs/index.md +2 -4
  61. package/docs/mac/icon.md +1 -1
  62. package/docs/nix.md +57 -11
  63. package/docs/onboarding.md +0 -2
  64. package/docs/refactor/webagent-session.md +0 -2
  65. package/docs/research/memory.md +1 -1
  66. package/docs/skills.md +0 -2
  67. package/docs/templates/AGENTS.md +2 -2
  68. package/docs/tools.md +15 -0
  69. package/docs/whatsapp.md +2 -0
  70. package/package.json +9 -16
  71. package/dist/control-ui/assets/index-BFID3yAA.css +0 -1
  72. package/dist/control-ui/assets/index-CE_axlTS.js +0 -2235
  73. package/dist/control-ui/assets/index-CE_axlTS.js.map +0 -1
  74. package/dist/control-ui/index.html +0 -15
  75. package/dist/daemon/constants.js +0 -10
  76. package/dist/daemon/launchd.js +0 -276
  77. package/dist/daemon/legacy.js +0 -63
  78. package/dist/daemon/program-args.js +0 -76
  79. package/dist/daemon/schtasks.js +0 -257
  80. package/dist/daemon/service.js +0 -60
  81. package/dist/daemon/systemd.js +0 -266
  82. package/dist/imessage/client.js +0 -165
  83. package/dist/imessage/index.js +0 -3
  84. package/dist/imessage/monitor.js +0 -272
  85. package/dist/imessage/probe.js +0 -26
  86. package/dist/imessage/send.js +0 -83
  87. package/dist/imessage/targets.js +0 -176
  88. package/dist/signal/client.js +0 -134
  89. package/dist/signal/daemon.js +0 -69
  90. package/dist/signal/index.js +0 -3
  91. package/dist/signal/monitor.js +0 -336
  92. package/dist/signal/probe.js +0 -46
  93. package/dist/signal/send.js +0 -91
  94. package/dist/slack/actions.js +0 -97
  95. package/dist/slack/index.js +0 -5
  96. package/dist/slack/monitor.js +0 -1029
  97. package/dist/slack/probe.js +0 -47
  98. package/dist/slack/send.js +0 -131
  99. package/dist/slack/token.js +0 -10
  100. package/dist/tui/commands.js +0 -74
  101. package/dist/tui/components/assistant-message.js +0 -16
  102. package/dist/tui/components/chat-log.js +0 -92
  103. package/dist/tui/components/custom-editor.js +0 -53
  104. package/dist/tui/components/selectors.js +0 -8
  105. package/dist/tui/components/tool-execution.js +0 -111
  106. package/dist/tui/components/user-message.js +0 -17
  107. package/dist/tui/gateway-chat.js +0 -140
  108. package/dist/tui/layout.js +0 -41
  109. package/dist/tui/message-list.js +0 -57
  110. package/dist/tui/theme/theme.js +0 -80
  111. package/dist/tui/theme.js +0 -25
  112. package/dist/tui/tui.js +0 -708
  113. package/dist/wizard/clack-prompter.js +0 -56
  114. package/dist/wizard/onboarding.js +0 -452
  115. package/dist/wizard/prompts.js +0 -6
  116. package/dist/wizard/session.js +0 -203
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CE_axlTS.js","sources":["../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/css-tag.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/reactive-element.js","../../../node_modules/.pnpm/lit-html@3.3.2/node_modules/lit-html/lit-html.js","../../../node_modules/.pnpm/lit-element@4.2.2/node_modules/lit-element/lit-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/custom-element.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/property.js","../../../node_modules/.pnpm/@lit+reactive-element@2.1.2/node_modules/@lit/reactive-element/decorators/state.js","../../../ui/src/ui/uuid.ts","../../../ui/src/ui/gateway.ts","../../../ui/src/ui/storage.ts","../../../ui/src/ui/navigation.ts","../../../ui/src/ui/tool-display.ts","../../../ui/src/ui/views/chat.ts","../../../ui/src/ui/views/config-form.ts","../../../ui/src/ui/views/config.ts","../../../ui/src/ui/format.ts","../../../ui/src/ui/views/connections.ts","../../../ui/src/ui/presenter.ts","../../../ui/src/ui/views/cron.ts","../../../ui/src/ui/views/debug.ts","../../../ui/src/ui/views/instances.ts","../../../ui/src/ui/views/nodes.ts","../../../ui/src/ui/views/overview.ts","../../../ui/src/ui/views/sessions.ts","../../../ui/src/ui/views/skills.ts","../../../ui/src/ui/ui-types.ts","../../../ui/src/ui/controllers/connections.ts","../../../ui/src/ui/controllers/presence.ts","../../../ui/src/ui/controllers/sessions.ts","../../../ui/src/ui/controllers/skills.ts","../../../ui/src/ui/controllers/nodes.ts","../../../ui/src/ui/controllers/chat.ts","../../../ui/src/ui/controllers/config.ts","../../../ui/src/ui/controllers/cron.ts","../../../ui/src/ui/controllers/debug.ts","../../../ui/src/ui/app-render.ts","../../../ui/src/ui/theme.ts","../../../ui/src/ui/theme-transition.ts","../../../ui/src/ui/app.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2019 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,e=t.ShadowRoot&&(void 0===t.ShadyCSS||t.ShadyCSS.nativeShadow)&&\"adoptedStyleSheets\"in Document.prototype&&\"replace\"in CSSStyleSheet.prototype,s=Symbol(),o=new WeakMap;class n{constructor(t,e,o){if(this._$cssResult$=!0,o!==s)throw Error(\"CSSResult is not constructable. Use `unsafeCSS` or `css` instead.\");this.cssText=t,this.t=e}get styleSheet(){let t=this.o;const s=this.t;if(e&&void 0===t){const e=void 0!==s&&1===s.length;e&&(t=o.get(s)),void 0===t&&((this.o=t=new CSSStyleSheet).replaceSync(this.cssText),e&&o.set(s,t))}return t}toString(){return this.cssText}}const r=t=>new n(\"string\"==typeof t?t:t+\"\",void 0,s),i=(t,...e)=>{const o=1===t.length?t[0]:e.reduce((e,s,o)=>e+(t=>{if(!0===t._$cssResult$)return t.cssText;if(\"number\"==typeof t)return t;throw Error(\"Value passed to 'css' function must be a 'css' function result: \"+t+\". Use 'unsafeCSS' to pass non-literal values, but take care to ensure page security.\")})(s)+t[o+1],t[0]);return new n(o,t,s)},S=(s,o)=>{if(e)s.adoptedStyleSheets=o.map(t=>t instanceof CSSStyleSheet?t:t.styleSheet);else for(const e of o){const o=document.createElement(\"style\"),n=t.litNonce;void 0!==n&&o.setAttribute(\"nonce\",n),o.textContent=e.cssText,s.appendChild(o)}},c=e?t=>t:t=>t instanceof CSSStyleSheet?(t=>{let e=\"\";for(const s of t.cssRules)e+=s.cssText;return r(e)})(t):t;export{n as CSSResult,S as adoptStyles,i as css,c as getCompatibleStyle,e as supportsAdoptingStyleSheets,r as unsafeCSS};\n//# sourceMappingURL=css-tag.js.map\n","import{getCompatibleStyle as t,adoptStyles as s}from\"./css-tag.js\";export{CSSResult,css,supportsAdoptingStyleSheets,unsafeCSS}from\"./css-tag.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const{is:i,defineProperty:e,getOwnPropertyDescriptor:h,getOwnPropertyNames:r,getOwnPropertySymbols:o,getPrototypeOf:n}=Object,a=globalThis,c=a.trustedTypes,l=c?c.emptyScript:\"\",p=a.reactiveElementPolyfillSupport,d=(t,s)=>t,u={toAttribute(t,s){switch(s){case Boolean:t=t?l:null;break;case Object:case Array:t=null==t?t:JSON.stringify(t)}return t},fromAttribute(t,s){let i=t;switch(s){case Boolean:i=null!==t;break;case Number:i=null===t?null:Number(t);break;case Object:case Array:try{i=JSON.parse(t)}catch(t){i=null}}return i}},f=(t,s)=>!i(t,s),b={attribute:!0,type:String,converter:u,reflect:!1,useDefault:!1,hasChanged:f};Symbol.metadata??=Symbol(\"metadata\"),a.litPropertyMetadata??=new WeakMap;class y extends HTMLElement{static addInitializer(t){this._$Ei(),(this.l??=[]).push(t)}static get observedAttributes(){return this.finalize(),this._$Eh&&[...this._$Eh.keys()]}static createProperty(t,s=b){if(s.state&&(s.attribute=!1),this._$Ei(),this.prototype.hasOwnProperty(t)&&((s=Object.create(s)).wrapped=!0),this.elementProperties.set(t,s),!s.noAccessor){const i=Symbol(),h=this.getPropertyDescriptor(t,i,s);void 0!==h&&e(this.prototype,t,h)}}static getPropertyDescriptor(t,s,i){const{get:e,set:r}=h(this.prototype,t)??{get(){return this[s]},set(t){this[s]=t}};return{get:e,set(s){const h=e?.call(this);r?.call(this,s),this.requestUpdate(t,h,i)},configurable:!0,enumerable:!0}}static getPropertyOptions(t){return this.elementProperties.get(t)??b}static _$Ei(){if(this.hasOwnProperty(d(\"elementProperties\")))return;const t=n(this);t.finalize(),void 0!==t.l&&(this.l=[...t.l]),this.elementProperties=new Map(t.elementProperties)}static finalize(){if(this.hasOwnProperty(d(\"finalized\")))return;if(this.finalized=!0,this._$Ei(),this.hasOwnProperty(d(\"properties\"))){const t=this.properties,s=[...r(t),...o(t)];for(const i of s)this.createProperty(i,t[i])}const t=this[Symbol.metadata];if(null!==t){const s=litPropertyMetadata.get(t);if(void 0!==s)for(const[t,i]of s)this.elementProperties.set(t,i)}this._$Eh=new Map;for(const[t,s]of this.elementProperties){const i=this._$Eu(t,s);void 0!==i&&this._$Eh.set(i,t)}this.elementStyles=this.finalizeStyles(this.styles)}static finalizeStyles(s){const i=[];if(Array.isArray(s)){const e=new Set(s.flat(1/0).reverse());for(const s of e)i.unshift(t(s))}else void 0!==s&&i.push(t(s));return i}static _$Eu(t,s){const i=s.attribute;return!1===i?void 0:\"string\"==typeof i?i:\"string\"==typeof t?t.toLowerCase():void 0}constructor(){super(),this._$Ep=void 0,this.isUpdatePending=!1,this.hasUpdated=!1,this._$Em=null,this._$Ev()}_$Ev(){this._$ES=new Promise(t=>this.enableUpdating=t),this._$AL=new Map,this._$E_(),this.requestUpdate(),this.constructor.l?.forEach(t=>t(this))}addController(t){(this._$EO??=new Set).add(t),void 0!==this.renderRoot&&this.isConnected&&t.hostConnected?.()}removeController(t){this._$EO?.delete(t)}_$E_(){const t=new Map,s=this.constructor.elementProperties;for(const i of s.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 s(t,this.constructor.elementStyles),t}connectedCallback(){this.renderRoot??=this.createRenderRoot(),this.enableUpdating(!0),this._$EO?.forEach(t=>t.hostConnected?.())}enableUpdating(t){}disconnectedCallback(){this._$EO?.forEach(t=>t.hostDisconnected?.())}attributeChangedCallback(t,s,i){this._$AK(t,i)}_$ET(t,s){const i=this.constructor.elementProperties.get(t),e=this.constructor._$Eu(t,i);if(void 0!==e&&!0===i.reflect){const h=(void 0!==i.converter?.toAttribute?i.converter:u).toAttribute(s,i.type);this._$Em=t,null==h?this.removeAttribute(e):this.setAttribute(e,h),this._$Em=null}}_$AK(t,s){const i=this.constructor,e=i._$Eh.get(t);if(void 0!==e&&this._$Em!==e){const t=i.getPropertyOptions(e),h=\"function\"==typeof t.converter?{fromAttribute:t.converter}:void 0!==t.converter?.fromAttribute?t.converter:u;this._$Em=e;const r=h.fromAttribute(s,t.type);this[e]=r??this._$Ej?.get(e)??r,this._$Em=null}}requestUpdate(t,s,i,e=!1,h){if(void 0!==t){const r=this.constructor;if(!1===e&&(h=this[t]),i??=r.getPropertyOptions(t),!((i.hasChanged??f)(h,s)||i.useDefault&&i.reflect&&h===this._$Ej?.get(t)&&!this.hasAttribute(r._$Eu(t,i))))return;this.C(t,s,i)}!1===this.isUpdatePending&&(this._$ES=this._$EP())}C(t,s,{useDefault:i,reflect:e,wrapped:h},r){i&&!(this._$Ej??=new Map).has(t)&&(this._$Ej.set(t,r??s??this[t]),!0!==h||void 0!==r)||(this._$AL.has(t)||(this.hasUpdated||i||(s=void 0),this._$AL.set(t,s)),!0===e&&this._$Em!==t&&(this._$Eq??=new Set).add(t))}async _$EP(){this.isUpdatePending=!0;try{await this._$ES}catch(t){Promise.reject(t)}const t=this.scheduleUpdate();return null!=t&&await t,!this.isUpdatePending}scheduleUpdate(){return this.performUpdate()}performUpdate(){if(!this.isUpdatePending)return;if(!this.hasUpdated){if(this.renderRoot??=this.createRenderRoot(),this._$Ep){for(const[t,s]of this._$Ep)this[t]=s;this._$Ep=void 0}const t=this.constructor.elementProperties;if(t.size>0)for(const[s,i]of t){const{wrapped:t}=i,e=this[s];!0!==t||this._$AL.has(s)||void 0===e||this.C(s,void 0,i,e)}}let t=!1;const s=this._$AL;try{t=this.shouldUpdate(s),t?(this.willUpdate(s),this._$EO?.forEach(t=>t.hostUpdate?.()),this.update(s)):this._$EM()}catch(s){throw t=!1,this._$EM(),s}t&&this._$AE(s)}willUpdate(t){}_$AE(t){this._$EO?.forEach(t=>t.hostUpdated?.()),this.hasUpdated||(this.hasUpdated=!0,this.firstUpdated(t)),this.updated(t)}_$EM(){this._$AL=new Map,this.isUpdatePending=!1}get updateComplete(){return this.getUpdateComplete()}getUpdateComplete(){return this._$ES}shouldUpdate(t){return!0}update(t){this._$Eq&&=this._$Eq.forEach(t=>this._$ET(t,this[t])),this._$EM()}updated(t){}firstUpdated(t){}}y.elementStyles=[],y.shadowRootOptions={mode:\"open\"},y[d(\"elementProperties\")]=new Map,y[d(\"finalized\")]=new Map,p?.({ReactiveElement:y}),(a.reactiveElementVersions??=[]).push(\"2.1.2\");export{y as ReactiveElement,s as adoptStyles,u as defaultConverter,t as getCompatibleStyle,f as notEqual};\n//# sourceMappingURL=reactive-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=globalThis,i=t=>t,s=t.trustedTypes,e=s?s.createPolicy(\"lit-html\",{createHTML:t=>t}):void 0,h=\"$lit$\",o=`lit$${Math.random().toFixed(9).slice(2)}$`,n=\"?\"+o,r=`<${n}>`,l=document,c=()=>l.createComment(\"\"),a=t=>null===t||\"object\"!=typeof t&&\"function\"!=typeof t,u=Array.isArray,d=t=>u(t)||\"function\"==typeof t?.[Symbol.iterator],f=\"[ \\t\\n\\f\\r]\",v=/<(?:(!--|\\/[^a-zA-Z])|(\\/?[a-zA-Z][^>\\s]*)|(\\/?$))/g,_=/-->/g,m=/>/g,p=RegExp(`>|${f}(?:([^\\\\s\"'>=/]+)(${f}*=${f}*(?:[^ \\t\\n\\f\\r\"'\\`<>=]|(\"|')|))|$)`,\"g\"),g=/'/g,$=/\"/g,y=/^(?:script|style|textarea|title)$/i,x=t=>(i,...s)=>({_$litType$:t,strings:i,values:s}),b=x(1),w=x(2),T=x(3),E=Symbol.for(\"lit-noChange\"),A=Symbol.for(\"lit-nothing\"),C=new WeakMap,P=l.createTreeWalker(l,129);function V(t,i){if(!u(t)||!t.hasOwnProperty(\"raw\"))throw Error(\"invalid template strings array\");return void 0!==e?e.createHTML(i):i}const N=(t,i)=>{const s=t.length-1,e=[];let n,l=2===i?\"<svg>\":3===i?\"<math>\":\"\",c=v;for(let i=0;i<s;i++){const s=t[i];let a,u,d=-1,f=0;for(;f<s.length&&(c.lastIndex=f,u=c.exec(s),null!==u);)f=c.lastIndex,c===v?\"!--\"===u[1]?c=_:void 0!==u[1]?c=m:void 0!==u[2]?(y.test(u[2])&&(n=RegExp(\"</\"+u[2],\"g\")),c=p):void 0!==u[3]&&(c=p):c===p?\">\"===u[0]?(c=n??v,d=-1):void 0===u[1]?d=-2:(d=c.lastIndex-u[2].length,a=u[1],c=void 0===u[3]?p:'\"'===u[3]?$:g):c===$||c===g?c=p:c===_||c===m?c=v:(c=p,n=void 0);const x=c===p&&t[i+1].startsWith(\"/>\")?\" \":\"\";l+=c===v?s+r:d>=0?(e.push(a),s.slice(0,d)+h+s.slice(d)+o+x):s+o+(-2===d?i:x)}return[V(t,l+(t[s]||\"<?>\")+(2===i?\"</svg>\":3===i?\"</math>\":\"\")),e]};class S{constructor({strings:t,_$litType$:i},e){let r;this.parts=[];let l=0,a=0;const u=t.length-1,d=this.parts,[f,v]=N(t,i);if(this.el=S.createElement(f,e),P.currentNode=this.el.content,2===i||3===i){const t=this.el.content.firstChild;t.replaceWith(...t.childNodes)}for(;null!==(r=P.nextNode())&&d.length<u;){if(1===r.nodeType){if(r.hasAttributes())for(const t of r.getAttributeNames())if(t.endsWith(h)){const i=v[a++],s=r.getAttribute(t).split(o),e=/([.?@])?(.*)/.exec(i);d.push({type:1,index:l,name:e[2],strings:s,ctor:\".\"===e[1]?I:\"?\"===e[1]?L:\"@\"===e[1]?z:H}),r.removeAttribute(t)}else t.startsWith(o)&&(d.push({type:6,index:l}),r.removeAttribute(t));if(y.test(r.tagName)){const t=r.textContent.split(o),i=t.length-1;if(i>0){r.textContent=s?s.emptyScript:\"\";for(let s=0;s<i;s++)r.append(t[s],c()),P.nextNode(),d.push({type:2,index:++l});r.append(t[i],c())}}}else if(8===r.nodeType)if(r.data===n)d.push({type:2,index:l});else{let t=-1;for(;-1!==(t=r.data.indexOf(o,t+1));)d.push({type:7,index:l}),t+=o.length-1}l++}}static createElement(t,i){const s=l.createElement(\"template\");return s.innerHTML=t,s}}function M(t,i,s=t,e){if(i===E)return i;let h=void 0!==e?s._$Co?.[e]:s._$Cl;const o=a(i)?void 0:i._$litDirective$;return h?.constructor!==o&&(h?._$AO?.(!1),void 0===o?h=void 0:(h=new o(t),h._$AT(t,s,e)),void 0!==e?(s._$Co??=[])[e]=h:s._$Cl=h),void 0!==h&&(i=M(t,h._$AS(t,i.values),h,e)),i}class R{constructor(t,i){this._$AV=[],this._$AN=void 0,this._$AD=t,this._$AM=i}get parentNode(){return this._$AM.parentNode}get _$AU(){return this._$AM._$AU}u(t){const{el:{content:i},parts:s}=this._$AD,e=(t?.creationScope??l).importNode(i,!0);P.currentNode=e;let h=P.nextNode(),o=0,n=0,r=s[0];for(;void 0!==r;){if(o===r.index){let i;2===r.type?i=new k(h,h.nextSibling,this,t):1===r.type?i=new r.ctor(h,r.name,r.strings,this,t):6===r.type&&(i=new Z(h,this,t)),this._$AV.push(i),r=s[++n]}o!==r?.index&&(h=P.nextNode(),o++)}return P.currentNode=l,e}p(t){let i=0;for(const s of this._$AV)void 0!==s&&(void 0!==s.strings?(s._$AI(t,s,i),i+=s.strings.length-2):s._$AI(t[i])),i++}}class k{get _$AU(){return this._$AM?._$AU??this._$Cv}constructor(t,i,s,e){this.type=2,this._$AH=A,this._$AN=void 0,this._$AA=t,this._$AB=i,this._$AM=s,this.options=e,this._$Cv=e?.isConnected??!0}get parentNode(){let t=this._$AA.parentNode;const i=this._$AM;return void 0!==i&&11===t?.nodeType&&(t=i.parentNode),t}get startNode(){return this._$AA}get endNode(){return this._$AB}_$AI(t,i=this){t=M(this,t,i),a(t)?t===A||null==t||\"\"===t?(this._$AH!==A&&this._$AR(),this._$AH=A):t!==this._$AH&&t!==E&&this._(t):void 0!==t._$litType$?this.$(t):void 0!==t.nodeType?this.T(t):d(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!==A&&a(this._$AH)?this._$AA.nextSibling.data=t:this.T(l.createTextNode(t)),this._$AH=t}$(t){const{values:i,_$litType$:s}=t,e=\"number\"==typeof s?this._$AC(t):(void 0===s.el&&(s.el=S.createElement(V(s.h,s.h[0]),this.options)),s);if(this._$AH?._$AD===e)this._$AH.p(i);else{const t=new R(e,this),s=t.u(this.options);t.p(i),this.T(s),this._$AH=t}}_$AC(t){let i=C.get(t.strings);return void 0===i&&C.set(t.strings,i=new S(t)),i}k(t){u(this._$AH)||(this._$AH=[],this._$AR());const i=this._$AH;let s,e=0;for(const h of t)e===i.length?i.push(s=new k(this.O(c()),this.O(c()),this,this.options)):s=i[e],s._$AI(h),e++;e<i.length&&(this._$AR(s&&s._$AB.nextSibling,e),i.length=e)}_$AR(t=this._$AA.nextSibling,s){for(this._$AP?.(!1,!0,s);t!==this._$AB;){const s=i(t).nextSibling;i(t).remove(),t=s}}setConnected(t){void 0===this._$AM&&(this._$Cv=t,this._$AP?.(t))}}class H{get tagName(){return this.element.tagName}get _$AU(){return this._$AM._$AU}constructor(t,i,s,e,h){this.type=1,this._$AH=A,this._$AN=void 0,this.element=t,this.name=i,this._$AM=e,this.options=h,s.length>2||\"\"!==s[0]||\"\"!==s[1]?(this._$AH=Array(s.length-1).fill(new String),this.strings=s):this._$AH=A}_$AI(t,i=this,s,e){const h=this.strings;let o=!1;if(void 0===h)t=M(this,t,i,0),o=!a(t)||t!==this._$AH&&t!==E,o&&(this._$AH=t);else{const e=t;let n,r;for(t=h[0],n=0;n<h.length-1;n++)r=M(this,e[s+n],i,n),r===E&&(r=this._$AH[n]),o||=!a(r)||r!==this._$AH[n],r===A?t=A:t!==A&&(t+=(r??\"\")+h[n+1]),this._$AH[n]=r}o&&!e&&this.j(t)}j(t){t===A?this.element.removeAttribute(this.name):this.element.setAttribute(this.name,t??\"\")}}class I extends H{constructor(){super(...arguments),this.type=3}j(t){this.element[this.name]=t===A?void 0:t}}class L extends H{constructor(){super(...arguments),this.type=4}j(t){this.element.toggleAttribute(this.name,!!t&&t!==A)}}class z extends H{constructor(t,i,s,e,h){super(t,i,s,e,h),this.type=5}_$AI(t,i=this){if((t=M(this,t,i,0)??A)===E)return;const s=this._$AH,e=t===A&&s!==A||t.capture!==s.capture||t.once!==s.once||t.passive!==s.passive,h=t!==A&&(s===A||e);e&&this.element.removeEventListener(this.name,this,s),h&&this.element.addEventListener(this.name,this,t),this._$AH=t}handleEvent(t){\"function\"==typeof this._$AH?this._$AH.call(this.options?.host??this.element,t):this._$AH.handleEvent(t)}}class Z{constructor(t,i,s){this.element=t,this.type=6,this._$AN=void 0,this._$AM=i,this.options=s}get _$AU(){return this._$AM._$AU}_$AI(t){M(this,t)}}const j={M:h,P:o,A:n,C:1,L:N,R,D:d,V:M,I:k,H,N:L,U:z,B:I,F:Z},B=t.litHtmlPolyfillSupport;B?.(S,k),(t.litHtmlVersions??=[]).push(\"3.3.2\");const D=(t,i,s)=>{const e=s?.renderBefore??i;let h=e._$litPart$;if(void 0===h){const t=s?.renderBefore??null;e._$litPart$=h=new k(i.insertBefore(c(),t),t,void 0,s??{})}return h._$AI(t),h};export{j as _$LH,b as html,T as mathml,E as noChange,A as nothing,D as render,w as svg};\n//# sourceMappingURL=lit-html.js.map\n","import{ReactiveElement as t}from\"@lit/reactive-element\";export*from\"@lit/reactive-element\";import{render as e,noChange as r}from\"lit-html\";export*from\"lit-html\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const s=globalThis;class i extends t{constructor(){super(...arguments),this.renderOptions={host:this},this._$Do=void 0}createRenderRoot(){const t=super.createRenderRoot();return this.renderOptions.renderBefore??=t.firstChild,t}update(t){const r=this.render();this.hasUpdated||(this.renderOptions.isConnected=this.isConnected),super.update(t),this._$Do=e(r,this.renderRoot,this.renderOptions)}connectedCallback(){super.connectedCallback(),this._$Do?.setConnected(!0)}disconnectedCallback(){super.disconnectedCallback(),this._$Do?.setConnected(!1)}render(){return r}}i._$litElement$=!0,i[\"finalized\"]=!0,s.litElementHydrateSupport?.({LitElement:i});const o=s.litElementPolyfillSupport;o?.({LitElement:i});const n={_$AK:(t,e,r)=>{t._$AK(e,r)},_$AL:t=>t._$AL};(s.litElementVersions??=[]).push(\"4.2.2\");export{i as LitElement,n as _$LE};\n//# sourceMappingURL=lit-element.js.map\n","/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */\nconst t=t=>(e,o)=>{void 0!==o?o.addInitializer(()=>{customElements.define(t,e)}):customElements.define(t,e)};export{t as customElement};\n//# sourceMappingURL=custom-element.js.map\n","import{notEqual as t,defaultConverter as e}from\"../reactive-element.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */const o={attribute:!0,type:String,converter:e,reflect:!1,hasChanged:t},r=(t=o,e,r)=>{const{kind:n,metadata:i}=r;let s=globalThis.litPropertyMetadata.get(i);if(void 0===s&&globalThis.litPropertyMetadata.set(i,s=new Map),\"setter\"===n&&((t=Object.create(t)).wrapped=!0),s.set(r.name,t),\"accessor\"===n){const{name:o}=r;return{set(r){const n=e.get.call(this);e.set.call(this,r),this.requestUpdate(o,n,t,!0,r)},init(e){return void 0!==e&&this.C(o,void 0,t,e),e}}}if(\"setter\"===n){const{name:o}=r;return function(r){const n=this[o];e.call(this,r),this.requestUpdate(o,n,t,!0,r)}}throw Error(\"Unsupported decorator location: \"+n)};function n(t){return(e,o)=>\"object\"==typeof o?r(t,e,o):((t,e,o)=>{const r=e.hasOwnProperty(o);return e.constructor.createProperty(o,t),r?Object.getOwnPropertyDescriptor(e,o):void 0})(t,e,o)}export{n as property,r as standardProperty};\n//# sourceMappingURL=property.js.map\n","import{property as t}from\"./property.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */function r(r){return t({...r,state:!0,attribute:!1})}export{r as state};\n//# sourceMappingURL=state.js.map\n","export type CryptoLike = {\n randomUUID?: (() => string) | undefined;\n getRandomValues?: ((array: Uint8Array) => Uint8Array) | undefined;\n};\n\nfunction uuidFromBytes(bytes: Uint8Array): string {\n bytes[6] = (bytes[6] & 0x0f) | 0x40; // version 4\n bytes[8] = (bytes[8] & 0x3f) | 0x80; // variant 1\n\n let hex = \"\";\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i]!.toString(16).padStart(2, \"0\");\n }\n\n return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(\n 16,\n 20,\n )}-${hex.slice(20)}`;\n}\n\nfunction weakRandomBytes(): Uint8Array {\n const bytes = new Uint8Array(16);\n const now = Date.now();\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);\n bytes[0] ^= now & 0xff;\n bytes[1] ^= (now >>> 8) & 0xff;\n bytes[2] ^= (now >>> 16) & 0xff;\n bytes[3] ^= (now >>> 24) & 0xff;\n return bytes;\n}\n\nexport function generateUUID(cryptoLike: CryptoLike | null = globalThis.crypto): string {\n if (cryptoLike && typeof cryptoLike.randomUUID === \"function\") return cryptoLike.randomUUID();\n\n if (cryptoLike && typeof cryptoLike.getRandomValues === \"function\") {\n const bytes = new Uint8Array(16);\n cryptoLike.getRandomValues(bytes);\n return uuidFromBytes(bytes);\n }\n\n return uuidFromBytes(weakRandomBytes());\n}\n\n","import { generateUUID } from \"./uuid\";\n\nexport type GatewayEventFrame = {\n type: \"event\";\n event: string;\n payload?: unknown;\n seq?: number;\n stateVersion?: { presence: number; health: number };\n};\n\nexport type GatewayResponseFrame = {\n type: \"res\";\n id: string;\n ok: boolean;\n payload?: unknown;\n error?: { code: string; message: string; details?: unknown };\n};\n\nexport type GatewayHelloOk = {\n type: \"hello-ok\";\n protocol: number;\n features?: { methods?: string[]; events?: string[] };\n snapshot?: unknown;\n policy?: { tickIntervalMs?: number };\n};\n\ntype Pending = {\n resolve: (value: unknown) => void;\n reject: (err: unknown) => void;\n};\n\nexport type GatewayBrowserClientOptions = {\n url: string;\n token?: string;\n password?: string;\n clientName?: string;\n clientVersion?: string;\n platform?: string;\n mode?: string;\n instanceId?: string;\n onHello?: (hello: GatewayHelloOk) => void;\n onEvent?: (evt: GatewayEventFrame) => void;\n onClose?: (info: { code: number; reason: string }) => void;\n onGap?: (info: { expected: number; received: number }) => void;\n};\n\nexport class GatewayBrowserClient {\n private ws: WebSocket | null = null;\n private pending = new Map<string, Pending>();\n private closed = false;\n private lastSeq: number | null = null;\n private backoffMs = 800;\n\n constructor(private opts: GatewayBrowserClientOptions) {}\n\n start() {\n this.closed = false;\n this.connect();\n }\n\n stop() {\n this.closed = true;\n this.ws?.close();\n this.ws = null;\n this.flushPending(new Error(\"gateway client stopped\"));\n }\n\n get connected() {\n return this.ws?.readyState === WebSocket.OPEN;\n }\n\n private connect() {\n if (this.closed) return;\n this.ws = new WebSocket(this.opts.url);\n this.ws.onopen = () => this.sendConnect();\n this.ws.onmessage = (ev) => this.handleMessage(String(ev.data ?? \"\"));\n this.ws.onclose = (ev) => {\n const reason = String(ev.reason ?? \"\");\n this.ws = null;\n this.flushPending(new Error(`gateway closed (${ev.code}): ${reason}`));\n this.opts.onClose?.({ code: ev.code, reason });\n this.scheduleReconnect();\n };\n this.ws.onerror = () => {\n // ignored; close handler will fire\n };\n }\n\n private scheduleReconnect() {\n if (this.closed) return;\n const delay = this.backoffMs;\n this.backoffMs = Math.min(this.backoffMs * 1.7, 15_000);\n window.setTimeout(() => this.connect(), delay);\n }\n\n private flushPending(err: Error) {\n for (const [, p] of this.pending) p.reject(err);\n this.pending.clear();\n }\n\n private sendConnect() {\n const auth =\n this.opts.token || this.opts.password\n ? {\n token: this.opts.token,\n password: this.opts.password,\n }\n : undefined;\n const params = {\n minProtocol: 2,\n maxProtocol: 2,\n client: {\n name: this.opts.clientName ?? \"clawdbot-control-ui\",\n version: this.opts.clientVersion ?? \"dev\",\n platform: this.opts.platform ?? navigator.platform ?? \"web\",\n mode: this.opts.mode ?? \"webchat\",\n instanceId: this.opts.instanceId,\n },\n caps: [],\n auth,\n userAgent: navigator.userAgent,\n locale: navigator.language,\n };\n\n void this.request<GatewayHelloOk>(\"connect\", params)\n .then((hello) => {\n this.backoffMs = 800;\n this.opts.onHello?.(hello);\n })\n .catch(() => {\n this.ws?.close(1008, \"connect failed\");\n });\n }\n\n private handleMessage(raw: string) {\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return;\n }\n\n const frame = parsed as { type?: unknown };\n if (frame.type === \"event\") {\n const evt = parsed as GatewayEventFrame;\n const seq = typeof evt.seq === \"number\" ? evt.seq : null;\n if (seq !== null) {\n if (this.lastSeq !== null && seq > this.lastSeq + 1) {\n this.opts.onGap?.({ expected: this.lastSeq + 1, received: seq });\n }\n this.lastSeq = seq;\n }\n this.opts.onEvent?.(evt);\n return;\n }\n\n if (frame.type === \"res\") {\n const res = parsed as GatewayResponseFrame;\n const pending = this.pending.get(res.id);\n if (!pending) return;\n this.pending.delete(res.id);\n if (res.ok) pending.resolve(res.payload);\n else pending.reject(new Error(res.error?.message ?? \"request failed\"));\n return;\n }\n }\n\n request<T = unknown>(method: string, params?: unknown): Promise<T> {\n if (!this.ws || this.ws.readyState !== WebSocket.OPEN) {\n return Promise.reject(new Error(\"gateway not connected\"));\n }\n const id = generateUUID();\n const frame = { type: \"req\", id, method, params };\n const p = new Promise<T>((resolve, reject) => {\n this.pending.set(id, { resolve: (v) => resolve(v as T), reject });\n });\n this.ws.send(JSON.stringify(frame));\n return p;\n }\n}\n","const KEY = \"clawdbot.control.settings.v1\";\n\nimport type { ThemeMode } from \"./theme\";\n\nexport type UiSettings = {\n gatewayUrl: string;\n token: string;\n sessionKey: string;\n theme: ThemeMode;\n};\n\nexport function loadSettings(): UiSettings {\n const defaultUrl = (() => {\n const proto = location.protocol === \"https:\" ? \"wss\" : \"ws\";\n return `${proto}://${location.host}`;\n })();\n\n const defaults: UiSettings = {\n gatewayUrl: defaultUrl,\n token: \"\",\n sessionKey: \"main\",\n theme: \"system\",\n };\n\n try {\n const raw = localStorage.getItem(KEY);\n if (!raw) return defaults;\n const parsed = JSON.parse(raw) as Partial<UiSettings>;\n return {\n gatewayUrl:\n typeof parsed.gatewayUrl === \"string\" && parsed.gatewayUrl.trim()\n ? parsed.gatewayUrl.trim()\n : defaults.gatewayUrl,\n token: typeof parsed.token === \"string\" ? parsed.token : defaults.token,\n sessionKey:\n typeof parsed.sessionKey === \"string\" && parsed.sessionKey.trim()\n ? parsed.sessionKey.trim()\n : defaults.sessionKey,\n theme:\n parsed.theme === \"light\" ||\n parsed.theme === \"dark\" ||\n parsed.theme === \"system\"\n ? parsed.theme\n : defaults.theme,\n };\n } catch {\n return defaults;\n }\n}\n\nexport function saveSettings(next: UiSettings) {\n localStorage.setItem(KEY, JSON.stringify(next));\n}\n","export const TAB_GROUPS = [\n { label: \"Chat\", tabs: [\"chat\"] },\n {\n label: \"Control\",\n tabs: [\"overview\", \"connections\", \"instances\", \"sessions\", \"cron\"],\n },\n { label: \"Agent\", tabs: [\"skills\", \"nodes\"] },\n { label: \"Settings\", tabs: [\"config\", \"debug\"] },\n] as const;\n\nexport type Tab =\n | \"overview\"\n | \"connections\"\n | \"instances\"\n | \"sessions\"\n | \"cron\"\n | \"skills\"\n | \"nodes\"\n | \"chat\"\n | \"config\"\n | \"debug\";\n\nconst TAB_PATHS: Record<Tab, string> = {\n overview: \"/overview\",\n connections: \"/connections\",\n instances: \"/instances\",\n sessions: \"/sessions\",\n cron: \"/cron\",\n skills: \"/skills\",\n nodes: \"/nodes\",\n chat: \"/chat\",\n config: \"/config\",\n debug: \"/debug\",\n};\n\nconst PATH_TO_TAB = new Map(\n Object.entries(TAB_PATHS).map(([tab, path]) => [path, tab as Tab]),\n);\n\nexport function normalizeBasePath(basePath: string): string {\n if (!basePath) return \"\";\n let base = basePath.trim();\n if (!base.startsWith(\"/\")) base = `/${base}`;\n if (base === \"/\") return \"\";\n if (base.endsWith(\"/\")) base = base.slice(0, -1);\n return base;\n}\n\nexport function normalizePath(path: string): string {\n if (!path) return \"/\";\n let normalized = path.trim();\n if (!normalized.startsWith(\"/\")) normalized = `/${normalized}`;\n if (normalized.length > 1 && normalized.endsWith(\"/\")) {\n normalized = normalized.slice(0, -1);\n }\n return normalized;\n}\n\nexport function pathForTab(tab: Tab, basePath = \"\"): string {\n const base = normalizeBasePath(basePath);\n const path = TAB_PATHS[tab];\n return base ? `${base}${path}` : path;\n}\n\nexport function tabFromPath(pathname: string, basePath = \"\"): Tab | null {\n const base = normalizeBasePath(basePath);\n let path = pathname || \"/\";\n if (base) {\n if (path === base) {\n path = \"/\";\n } else if (path.startsWith(`${base}/`)) {\n path = path.slice(base.length);\n }\n }\n let normalized = normalizePath(path).toLowerCase();\n if (normalized.endsWith(\"/index.html\")) normalized = \"/\";\n if (normalized === \"/\") return \"chat\";\n return PATH_TO_TAB.get(normalized) ?? null;\n}\n\nexport function inferBasePathFromPathname(pathname: string): string {\n let normalized = normalizePath(pathname);\n if (normalized.endsWith(\"/index.html\")) {\n normalized = normalizePath(normalized.slice(0, -\"/index.html\".length));\n }\n if (normalized === \"/\") return \"\";\n const segments = normalized.split(\"/\").filter(Boolean);\n if (segments.length === 0) return \"\";\n for (let i = 0; i < segments.length; i++) {\n const candidate = `/${segments.slice(i).join(\"/\")}`.toLowerCase();\n if (PATH_TO_TAB.has(candidate)) {\n const prefix = segments.slice(0, i);\n return prefix.length ? `/${prefix.join(\"/\")}` : \"\";\n }\n }\n return `/${segments.join(\"/\")}`;\n}\n\nexport function titleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Overview\";\n case \"connections\":\n return \"Connections\";\n case \"instances\":\n return \"Instances\";\n case \"sessions\":\n return \"Sessions\";\n case \"cron\":\n return \"Cron Jobs\";\n case \"skills\":\n return \"Skills\";\n case \"nodes\":\n return \"Nodes\";\n case \"chat\":\n return \"Chat\";\n case \"config\":\n return \"Config\";\n case \"debug\":\n return \"Debug\";\n default:\n return \"Control\";\n }\n}\n\nexport function subtitleForTab(tab: Tab) {\n switch (tab) {\n case \"overview\":\n return \"Gateway status, entry points, and a fast health read.\";\n case \"connections\":\n return \"Link providers and keep transport settings in sync.\";\n case \"instances\":\n return \"Presence beacons from connected clients and nodes.\";\n case \"sessions\":\n return \"Inspect active sessions and adjust per-session defaults.\";\n case \"cron\":\n return \"Schedule wakeups and recurring agent runs.\";\n case \"skills\":\n return \"Manage skill availability and API key injection.\";\n case \"nodes\":\n return \"Paired devices, capabilities, and command exposure.\";\n case \"chat\":\n return \"Direct gateway chat session for quick interventions.\";\n case \"config\":\n return \"Edit ~/.clawdbot/clawdbot.json safely.\";\n case \"debug\":\n return \"Gateway snapshots, events, and manual RPC calls.\";\n default:\n return \"\";\n }\n}\n","import rawConfig from \"./tool-display.json\";\n\ntype ToolDisplayActionSpec = {\n label?: string;\n detailKeys?: string[];\n};\n\ntype ToolDisplaySpec = {\n emoji?: string;\n title?: string;\n label?: string;\n detailKeys?: string[];\n actions?: Record<string, ToolDisplayActionSpec>;\n};\n\ntype ToolDisplayConfig = {\n version?: number;\n fallback?: ToolDisplaySpec;\n tools?: Record<string, ToolDisplaySpec>;\n};\n\nexport type ToolDisplay = {\n name: string;\n emoji: string;\n title: string;\n label: string;\n verb?: string;\n detail?: string;\n};\n\nconst TOOL_DISPLAY_CONFIG = rawConfig as ToolDisplayConfig;\nconst FALLBACK = TOOL_DISPLAY_CONFIG.fallback ?? { emoji: \"🧩\" };\nconst TOOL_MAP = TOOL_DISPLAY_CONFIG.tools ?? {};\n\nfunction normalizeToolName(name?: string): string {\n return (name ?? \"tool\").trim();\n}\n\nfunction defaultTitle(name: string): string {\n const cleaned = name.replace(/_/g, \" \").trim();\n if (!cleaned) return \"Tool\";\n return cleaned\n .split(/\\s+/)\n .map((part) =>\n part.length <= 2 && part.toUpperCase() === part\n ? part\n : `${part.at(0)?.toUpperCase() ?? \"\"}${part.slice(1)}`,\n )\n .join(\" \");\n}\n\nfunction normalizeVerb(value?: string): string | undefined {\n const trimmed = value?.trim();\n if (!trimmed) return undefined;\n return trimmed.replace(/_/g, \" \");\n}\n\nfunction coerceDisplayValue(value: unknown): string | undefined {\n if (value === null || value === undefined) return undefined;\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) return undefined;\n const firstLine = trimmed.split(/\\r?\\n/)[0]?.trim() ?? \"\";\n if (!firstLine) return undefined;\n return firstLine.length > 160 ? `${firstLine.slice(0, 157)}…` : firstLine;\n }\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (Array.isArray(value)) {\n const values = value\n .map((item) => coerceDisplayValue(item))\n .filter((item): item is string => Boolean(item));\n if (values.length === 0) return undefined;\n const preview = values.slice(0, 3).join(\", \");\n return values.length > 3 ? `${preview}…` : preview;\n }\n return undefined;\n}\n\nfunction lookupValueByPath(args: unknown, path: string): unknown {\n if (!args || typeof args !== \"object\") return undefined;\n let current: unknown = args;\n for (const segment of path.split(\".\")) {\n if (!segment) return undefined;\n if (!current || typeof current !== \"object\") return undefined;\n const record = current as Record<string, unknown>;\n current = record[segment];\n }\n return current;\n}\n\nfunction resolveDetailFromKeys(args: unknown, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = lookupValueByPath(args, key);\n const display = coerceDisplayValue(value);\n if (display) return display;\n }\n return undefined;\n}\n\nfunction resolveReadDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n if (!path) return undefined;\n const offset = typeof record.offset === \"number\" ? record.offset : undefined;\n const limit = typeof record.limit === \"number\" ? record.limit : undefined;\n if (offset !== undefined && limit !== undefined) {\n return `${path}:${offset}-${offset + limit}`;\n }\n return path;\n}\n\nfunction resolveWriteDetail(args: unknown): string | undefined {\n if (!args || typeof args !== \"object\") return undefined;\n const record = args as Record<string, unknown>;\n const path = typeof record.path === \"string\" ? record.path : undefined;\n return path;\n}\n\nfunction resolveActionSpec(\n spec: ToolDisplaySpec | undefined,\n action: string | undefined,\n): ToolDisplayActionSpec | undefined {\n if (!spec || !action) return undefined;\n return spec.actions?.[action] ?? undefined;\n}\n\nexport function resolveToolDisplay(params: {\n name?: string;\n args?: unknown;\n meta?: string;\n}): ToolDisplay {\n const name = normalizeToolName(params.name);\n const key = name.toLowerCase();\n const spec = TOOL_MAP[key];\n const emoji = spec?.emoji ?? FALLBACK.emoji ?? \"🧩\";\n const title = spec?.title ?? defaultTitle(name);\n const label = spec?.label ?? name;\n const actionRaw =\n params.args && typeof params.args === \"object\"\n ? ((params.args as Record<string, unknown>).action as string | undefined)\n : undefined;\n const action = typeof actionRaw === \"string\" ? actionRaw.trim() : undefined;\n const actionSpec = resolveActionSpec(spec, action);\n const verb = normalizeVerb(actionSpec?.label ?? action);\n\n let detail: string | undefined;\n if (key === \"read\") detail = resolveReadDetail(params.args);\n if (!detail && (key === \"write\" || key === \"edit\" || key === \"attach\")) {\n detail = resolveWriteDetail(params.args);\n }\n\n const detailKeys =\n actionSpec?.detailKeys ?? spec?.detailKeys ?? FALLBACK.detailKeys ?? [];\n if (!detail && detailKeys.length > 0) {\n detail = resolveDetailFromKeys(params.args, detailKeys);\n }\n\n if (!detail && params.meta) {\n detail = params.meta;\n }\n\n if (detail) {\n detail = shortenHomeInString(detail);\n }\n\n return {\n name,\n emoji,\n title,\n label,\n verb,\n detail,\n };\n}\n\nexport function formatToolDetail(display: ToolDisplay): string | undefined {\n const parts: string[] = [];\n if (display.verb) parts.push(display.verb);\n if (display.detail) parts.push(display.detail);\n if (parts.length === 0) return undefined;\n return parts.join(\" · \");\n}\n\nexport function formatToolSummary(display: ToolDisplay): string {\n const detail = formatToolDetail(display);\n return detail\n ? `${display.emoji} ${display.label}: ${detail}`\n : `${display.emoji} ${display.label}`;\n}\n\nfunction shortenHomeInString(input: string): string {\n if (!input) return input;\n return input\n .replace(/\\/Users\\/[^/]+/g, \"~\")\n .replace(/\\/home\\/[^/]+/g, \"~\");\n}\n","import { html, nothing } from \"lit\";\n\nimport type { SessionsListResult } from \"../types\";\nimport { resolveToolDisplay, formatToolDetail } from \"../tool-display\";\n\nexport type ChatProps = {\n sessionKey: string;\n onSessionKeyChange: (next: string) => void;\n thinkingLevel: string | null;\n loading: boolean;\n sending: boolean;\n messages: unknown[];\n stream: string | null;\n draft: string;\n connected: boolean;\n canSend: boolean;\n disabledReason: string | null;\n sessions: SessionsListResult | null;\n onRefresh: () => void;\n onDraftChange: (next: string) => void;\n onSend: () => void;\n};\n\nexport function renderChat(props: ChatProps) {\n const canInteract = props.connected;\n const canCompose = props.canSend && !props.sending;\n const sessionOptions = resolveSessionOptions(props.sessionKey, props.sessions);\n const composePlaceholder = (() => {\n if (!props.connected) return \"Connect to the gateway to start chatting…\";\n if (!props.canSend) return \"Connect an iOS/Android node to enable Web Chat + Talk…\";\n return \"Message (⌘↩ to send)\";\n })();\n\n return html`\n <section class=\"card chat\">\n <div class=\"chat-header\">\n <div class=\"chat-header__left\">\n <label class=\"field chat-session\">\n <span>Session Key</span>\n <select\n .value=${props.sessionKey}\n ?disabled=${!canInteract}\n @change=${(e: Event) =>\n props.onSessionKeyChange((e.target as HTMLSelectElement).value)}\n >\n ${sessionOptions.map(\n (entry) =>\n html`<option value=${entry.key}>\n ${entry.displayName ?? entry.key}\n </option>`,\n )}\n </select>\n </label>\n <button\n class=\"btn\"\n ?disabled=${props.loading || !canInteract}\n @click=${props.onRefresh}\n >\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"chat-header__right\">\n <div class=\"muted\">Thinking: ${props.thinkingLevel ?? \"inherit\"}</div>\n </div>\n </div>\n\n ${props.disabledReason\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.disabledReason}\n </div>`\n : nothing}\n\n <div class=\"chat-thread\" role=\"log\" aria-live=\"polite\">\n ${props.loading ? html`<div class=\"muted\">Loading chat…</div>` : nothing}\n ${props.messages.map((m) => renderMessage(m))}\n ${props.stream\n ? renderMessage(\n {\n role: \"assistant\",\n content: [{ type: \"text\", text: props.stream }],\n timestamp: Date.now(),\n },\n { streaming: true },\n )\n : nothing}\n </div>\n\n <div class=\"chat-compose\">\n <label class=\"field chat-compose__field\">\n <span>Message</span>\n <textarea\n .value=${props.draft}\n ?disabled=${!props.canSend}\n @keydown=${(e: KeyboardEvent) => {\n if (e.key !== \"Enter\") return;\n if (!e.metaKey && !e.ctrlKey) return;\n e.preventDefault();\n if (canCompose) props.onSend();\n }}\n @input=${(e: Event) =>\n props.onDraftChange((e.target as HTMLTextAreaElement).value)}\n placeholder=${composePlaceholder}\n ></textarea>\n </label>\n <div class=\"row chat-compose__actions\">\n <button\n class=\"btn primary\"\n ?disabled=${!props.canSend || props.sending}\n @click=${props.onSend}\n >\n ${props.sending ? \"Sending…\" : \"Send\"}\n </button>\n </div>\n </div>\n </section>\n `;\n}\n\ntype SessionOption = {\n key: string;\n updatedAt?: number | null;\n displayName?: string;\n};\n\nfunction resolveSessionOptions(\n currentKey: string,\n sessions: SessionsListResult | null,\n) {\n const now = Date.now();\n const cutoff = now - 24 * 60 * 60 * 1000;\n const entries = Array.isArray(sessions?.sessions) ? sessions?.sessions ?? [] : [];\n const sorted = [...entries].sort(\n (a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0),\n );\n const recent: SessionOption[] = [];\n const seen = new Set<string>();\n for (const entry of sorted) {\n if (seen.has(entry.key)) continue;\n seen.add(entry.key);\n if ((entry.updatedAt ?? 0) < cutoff) continue;\n recent.push(entry);\n }\n\n const result: SessionOption[] = [];\n const included = new Set<string>();\n const mainKey = \"main\";\n const mainEntry = sorted.find((entry) => entry.key === mainKey);\n if (mainEntry) {\n result.push(mainEntry);\n included.add(mainKey);\n } else if (currentKey === mainKey) {\n result.push({ key: mainKey, updatedAt: null });\n included.add(mainKey);\n }\n\n for (const entry of recent) {\n if (included.has(entry.key)) continue;\n result.push(entry);\n included.add(entry.key);\n }\n\n if (!included.has(currentKey)) {\n result.push({ key: currentKey, updatedAt: null });\n }\n\n return result;\n}\n\nfunction renderMessage(message: unknown, opts?: { streaming?: boolean }) {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role : \"unknown\";\n const toolCards = extractToolCards(message);\n const hasToolCards = toolCards.length > 0;\n const isToolResult = isToolResultMessage(message);\n const extractedText = extractText(message);\n const contentText = typeof m.content === \"string\" ? m.content : null;\n const fallback = hasToolCards ? null : JSON.stringify(message, null, 2);\n const text = !isToolResult\n ? extractedText?.trim()\n ? extractedText\n : contentText?.trim()\n ? contentText\n : fallback\n : null;\n\n const timestamp =\n typeof m.timestamp === \"number\" ? new Date(m.timestamp).toLocaleTimeString() : \"\";\n const klass = role === \"assistant\" ? \"assistant\" : role === \"user\" ? \"user\" : \"other\";\n const who = role === \"assistant\" ? \"Assistant\" : role === \"user\" ? \"You\" : role;\n return html`\n <div class=\"chat-line ${klass}\">\n <div class=\"chat-msg\">\n <div class=\"chat-bubble ${opts?.streaming ? \"streaming\" : \"\"}\">\n ${text ? html`<div class=\"chat-text\">${text}</div>` : nothing}\n ${toolCards.map((card) => renderToolCard(card))}\n </div>\n <div class=\"chat-stamp mono\">\n ${who}${timestamp ? html` · ${timestamp}` : nothing}\n </div>\n </div>\n </div>\n `;\n}\n\nfunction extractText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (typeof m.text === \"string\") return m.text;\n return null;\n}\n\ntype ToolCard = {\n kind: \"call\" | \"result\";\n name: string;\n args?: unknown;\n text?: string;\n};\n\nfunction extractToolCards(message: unknown): ToolCard[] {\n const m = message as Record<string, unknown>;\n const content = normalizeContent(m.content);\n const cards: ToolCard[] = [];\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n const isToolCall =\n [\"toolcall\", \"tool_call\", \"tooluse\", \"tool_use\"].includes(kind) ||\n (typeof item.name === \"string\" && item.arguments != null);\n if (isToolCall) {\n cards.push({\n kind: \"call\",\n name: (item.name as string) ?? \"tool\",\n args: coerceArgs(item.arguments ?? item.args),\n });\n }\n }\n\n for (const item of content) {\n const kind = String(item.type ?? \"\").toLowerCase();\n if (kind !== \"toolresult\" && kind !== \"tool_result\") continue;\n const text = extractToolText(item);\n const name = typeof item.name === \"string\" ? item.name : \"tool\";\n cards.push({ kind: \"result\", name, text });\n }\n\n if (isToolResultMessage(message) && !cards.some((card) => card.kind === \"result\")) {\n const name =\n (typeof m.toolName === \"string\" && m.toolName) ||\n (typeof m.tool_name === \"string\" && m.tool_name) ||\n \"tool\";\n const text = extractText(message) ?? undefined;\n cards.push({ kind: \"result\", name, text });\n }\n\n return cards;\n}\n\nfunction renderToolCard(card: ToolCard) {\n const display = resolveToolDisplay({ name: card.name, args: card.args });\n const detail = formatToolDetail(display);\n return html`\n <div class=\"chat-tool-card\">\n <div class=\"chat-tool-card__title\">${display.emoji} ${display.label}</div>\n ${detail\n ? html`<div class=\"chat-tool-card__detail\">${detail}</div>`\n : nothing}\n ${card.text\n ? html`<div class=\"chat-tool-card__output\">${card.text}</div>`\n : nothing}\n </div>\n `;\n}\n\nfunction normalizeContent(content: unknown): Array<Record<string, unknown>> {\n if (!Array.isArray(content)) return [];\n return content.filter(Boolean) as Array<Record<string, unknown>>;\n}\n\nfunction coerceArgs(value: unknown): unknown {\n if (typeof value !== \"string\") return value;\n const trimmed = value.trim();\n if (!trimmed) return value;\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\")) return value;\n try {\n return JSON.parse(trimmed);\n } catch {\n return value;\n }\n}\n\nfunction extractToolText(item: Record<string, unknown>): string | undefined {\n if (typeof item.text === \"string\") return item.text;\n if (typeof item.content === \"string\") return item.content;\n return undefined;\n}\n\nfunction isToolResultMessage(message: unknown): boolean {\n const m = message as Record<string, unknown>;\n const role = typeof m.role === \"string\" ? m.role.toLowerCase() : \"\";\n return role === \"toolresult\" || role === \"tool_result\";\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHint, ConfigUiHints } from \"../types\";\n\nexport type ConfigFormProps = {\n schema: unknown | null;\n uiHints: ConfigUiHints;\n value: Record<string, unknown> | null;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n};\n\ntype JsonSchema = {\n type?: string | string[];\n title?: string;\n description?: string;\n properties?: Record<string, JsonSchema>;\n items?: JsonSchema | JsonSchema[];\n enum?: unknown[];\n default?: unknown;\n anyOf?: JsonSchema[];\n oneOf?: JsonSchema[];\n allOf?: JsonSchema[];\n};\n\nexport function renderConfigForm(props: ConfigFormProps) {\n if (!props.schema) {\n return html`<div class=\"muted\">Schema unavailable.</div>`;\n }\n const schema = props.schema as JsonSchema;\n const value = props.value ?? {};\n if (schemaType(schema) !== \"object\" || !schema.properties) {\n return html`<div class=\"callout danger\">Unsupported schema. Use Raw.</div>`;\n }\n const entries = Object.entries(schema.properties);\n const sorted = entries.sort((a, b) => {\n const orderA = hintForPath([a[0]], props.uiHints)?.order ?? 0;\n const orderB = hintForPath([b[0]], props.uiHints)?.order ?? 0;\n if (orderA !== orderB) return orderA - orderB;\n return a[0].localeCompare(b[0]);\n });\n\n return html`\n <div class=\"config-form\">\n ${sorted.map(([key, node]) =>\n renderNode({\n schema: node,\n value: (value as Record<string, unknown>)[key],\n path: [key],\n hints: props.uiHints,\n onPatch: props.onPatch,\n }),\n )}\n </div>\n `;\n}\n\nfunction renderNode(params: {\n schema: JsonSchema;\n value: unknown;\n path: Array<string | number>;\n hints: ConfigUiHints;\n onPatch: (path: Array<string | number>, value: unknown) => void;\n}) {\n const { schema, value, path, hints, onPatch } = params;\n const type = schemaType(schema);\n const hint = hintForPath(path, hints);\n const label = hint?.label ?? schema.title ?? humanize(String(path.at(-1)));\n const help = hint?.help ?? schema.description;\n\n if (schema.anyOf || schema.oneOf || schema.allOf) {\n return html`<div class=\"callout danger\">\n ${label}: unsupported schema node. Use Raw.\n </div>`;\n }\n\n if (type === \"object\") {\n const props = schema.properties ?? {};\n const entries = Object.entries(props);\n if (entries.length === 0) return nothing;\n return html`\n <fieldset class=\"field-group\">\n <legend>${label}</legend>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n ${entries.map(([key, node]) =>\n renderNode({\n schema: node,\n value: value && typeof value === \"object\" ? (value as any)[key] : undefined,\n path: [...path, key],\n hints,\n onPatch,\n }),\n )}\n </fieldset>\n `;\n }\n\n if (type === \"array\") {\n const itemSchema = Array.isArray(schema.items)\n ? schema.items[0]\n : schema.items;\n const arr = Array.isArray(value) ? value : [];\n return html`\n <div class=\"field\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <span>${label}</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [...arr, defaultValue(itemSchema)];\n onPatch(path, next);\n }}\n >\n Add\n </button>\n </div>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n ${arr.map((entry, index) =>\n html`<div class=\"array-item\">\n ${itemSchema\n ? renderNode({\n schema: itemSchema,\n value: entry,\n path: [...path, index],\n hints,\n onPatch,\n })\n : nothing}\n <button\n class=\"btn danger\"\n @click=${() => {\n const next = arr.slice();\n next.splice(index, 1);\n onPatch(path, next);\n }}\n >\n Remove\n </button>\n </div>`,\n )}\n </div>\n `;\n }\n\n if (schema.enum) {\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <select\n .value=${value == null ? \"\" : String(value)}\n @change=${(e: Event) =>\n onPatch(path, (e.target as HTMLSelectElement).value)}\n >\n ${schema.enum.map(\n (opt) => html`<option value=${String(opt)}>${String(opt)}</option>`,\n )}\n </select>\n </label>\n `;\n }\n\n if (type === \"boolean\") {\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <input\n type=\"checkbox\"\n .checked=${Boolean(value)}\n @change=${(e: Event) =>\n onPatch(path, (e.target as HTMLInputElement).checked)}\n />\n </label>\n `;\n }\n\n if (type === \"number\" || type === \"integer\") {\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <input\n type=\"number\"\n .value=${value == null ? \"\" : String(value)}\n @input=${(e: Event) => {\n const raw = (e.target as HTMLInputElement).value;\n const parsed = raw === \"\" ? undefined : Number(raw);\n onPatch(path, parsed);\n }}\n />\n </label>\n `;\n }\n\n if (type === \"string\") {\n const isSensitive = hint?.sensitive ?? isSensitivePath(path);\n const placeholder = hint?.placeholder ?? (isSensitive ? \"••••\" : \"\");\n return html`\n <label class=\"field\">\n <span>${label}</span>\n ${help ? html`<div class=\"muted\">${help}</div>` : nothing}\n <input\n type=${isSensitive ? \"password\" : \"text\"}\n placeholder=${placeholder}\n .value=${value == null ? \"\" : String(value)}\n @input=${(e: Event) =>\n onPatch(path, (e.target as HTMLInputElement).value)}\n />\n </label>\n `;\n }\n\n return html`<div class=\"field\">\n <span>${label}</span>\n <div class=\"muted\">Unsupported type. Use Raw.</div>\n </div>`;\n}\n\nfunction schemaType(schema: JsonSchema): string | undefined {\n if (!schema) return undefined;\n if (Array.isArray(schema.type)) {\n const filtered = schema.type.filter((t) => t !== \"null\");\n return filtered[0] ?? schema.type[0];\n }\n return schema.type;\n}\n\nfunction defaultValue(schema?: JsonSchema): unknown {\n if (!schema) return \"\";\n if (schema.default !== undefined) return schema.default;\n const type = schemaType(schema);\n switch (type) {\n case \"object\":\n return {};\n case \"array\":\n return [];\n case \"boolean\":\n return false;\n case \"number\":\n case \"integer\":\n return 0;\n case \"string\":\n return \"\";\n default:\n return \"\";\n }\n}\n\nfunction hintForPath(path: Array<string | number>, hints: ConfigUiHints) {\n const key = pathKey(path);\n return hints[key];\n}\n\nfunction pathKey(path: Array<string | number>): string {\n return path.filter((segment) => typeof segment === \"string\").join(\".\");\n}\n\nfunction humanize(raw: string) {\n return raw\n .replace(/_/g, \" \")\n .replace(/([a-z0-9])([A-Z])/g, \"$1 $2\")\n .replace(/\\s+/g, \" \")\n .replace(/^./, (m) => m.toUpperCase());\n}\n\nfunction isSensitivePath(path: Array<string | number>): boolean {\n const key = pathKey(path).toLowerCase();\n return (\n key.includes(\"token\") ||\n key.includes(\"password\") ||\n key.includes(\"secret\") ||\n key.includes(\"apikey\") ||\n key.endsWith(\"key\")\n );\n}\n","import { html, nothing } from \"lit\";\nimport type { ConfigUiHints } from \"../types\";\nimport { renderConfigForm } from \"./config-form\";\n\nexport type ConfigProps = {\n raw: string;\n valid: boolean | null;\n issues: unknown[];\n loading: boolean;\n saving: boolean;\n connected: boolean;\n schema: unknown | null;\n schemaLoading: boolean;\n uiHints: ConfigUiHints;\n formMode: \"form\" | \"raw\";\n formValue: Record<string, unknown> | null;\n onRawChange: (next: string) => void;\n onFormModeChange: (mode: \"form\" | \"raw\") => void;\n onFormPatch: (path: Array<string | number>, value: unknown) => void;\n onReload: () => void;\n onSave: () => void;\n};\n\nexport function renderConfig(props: ConfigProps) {\n const validity =\n props.valid == null ? \"unknown\" : props.valid ? \"valid\" : \"invalid\";\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div class=\"row\">\n <div class=\"card-title\">Config</div>\n <span class=\"pill\">${validity}</span>\n </div>\n <div class=\"row\">\n <div class=\"toggle-group\">\n <button\n class=\"btn ${props.formMode === \"form\" ? \"primary\" : \"\"}\"\n ?disabled=${props.schemaLoading || !props.schema}\n @click=${() => props.onFormModeChange(\"form\")}\n >\n Form\n </button>\n <button\n class=\"btn ${props.formMode === \"raw\" ? \"primary\" : \"\"}\"\n @click=${() => props.onFormModeChange(\"raw\")}\n >\n Raw\n </button>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onReload}>\n ${props.loading ? \"Loading…\" : \"Reload\"}\n </button>\n <button\n class=\"btn primary\"\n ?disabled=${props.saving || !props.connected}\n @click=${props.onSave}\n >\n ${props.saving ? \"Saving…\" : \"Save\"}\n </button>\n </div>\n </div>\n\n <div class=\"muted\" style=\"margin-top: 10px;\">\n Writes to <span class=\"mono\">~/.clawdbot/clawdbot.json</span>. Some changes\n require a gateway restart.\n </div>\n\n ${props.formMode === \"form\"\n ? html`<div style=\"margin-top: 12px;\">\n ${props.schemaLoading\n ? html`<div class=\"muted\">Loading schema…</div>`\n : renderConfigForm({\n schema: props.schema,\n uiHints: props.uiHints,\n value: props.formValue,\n onPatch: props.onFormPatch,\n })}\n </div>`\n : html`<label class=\"field\" style=\"margin-top: 12px;\">\n <span>Raw JSON5</span>\n <textarea\n .value=${props.raw}\n @input=${(e: Event) =>\n props.onRawChange((e.target as HTMLTextAreaElement).value)}\n ></textarea>\n </label>`}\n\n ${props.issues.length > 0\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n <pre class=\"code-block\">${JSON.stringify(props.issues, null, 2)}</pre>\n </div>`\n : nothing}\n </section>\n `;\n}\n","export function formatMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n return new Date(ms).toLocaleString();\n}\n\nexport function formatAgo(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n const diff = Date.now() - ms;\n if (diff < 0) return \"just now\";\n const sec = Math.round(diff / 1000);\n if (sec < 60) return `${sec}s ago`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m ago`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h ago`;\n const day = Math.round(hr / 24);\n return `${day}d ago`;\n}\n\nexport function formatDurationMs(ms?: number | null): string {\n if (!ms && ms !== 0) return \"n/a\";\n if (ms < 1000) return `${ms}ms`;\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n if (hr < 48) return `${hr}h`;\n const day = Math.round(hr / 24);\n return `${day}d`;\n}\n\nexport function formatList(values?: Array<string | null | undefined>): string {\n if (!values || values.length === 0) return \"none\";\n return values.filter((v): v is string => Boolean(v && v.trim())).join(\", \");\n}\n\nexport function clampText(value: string, max = 120): string {\n if (value.length <= max) return value;\n return `${value.slice(0, Math.max(0, max - 1))}…`;\n}\n\nexport function toNumber(value: string, fallback: number): number {\n const n = Number(value);\n return Number.isFinite(n) ? n : fallback;\n}\n\nexport function parseList(input: string): string[] {\n return input\n .split(/[,\\n]/)\n .map((v) => v.trim())\n .filter((v) => v.length > 0);\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport type { ProvidersStatusSnapshot } from \"../types\";\nimport type {\n DiscordActionForm,\n DiscordForm,\n IMessageForm,\n SlackActionForm,\n SlackForm,\n SignalForm,\n TelegramForm,\n} from \"../ui-types\";\n\nconst discordActionOptions = [\n { key: \"reactions\", label: \"Reactions\" },\n { key: \"stickers\", label: \"Stickers\" },\n { key: \"polls\", label: \"Polls\" },\n { key: \"permissions\", label: \"Permissions\" },\n { key: \"messages\", label: \"Messages\" },\n { key: \"threads\", label: \"Threads\" },\n { key: \"pins\", label: \"Pins\" },\n { key: \"search\", label: \"Search\" },\n { key: \"memberInfo\", label: \"Member info\" },\n { key: \"roleInfo\", label: \"Role info\" },\n { key: \"channelInfo\", label: \"Channel info\" },\n { key: \"voiceStatus\", label: \"Voice status\" },\n { key: \"events\", label: \"Events\" },\n { key: \"roles\", label: \"Role changes\" },\n { key: \"moderation\", label: \"Moderation\" },\n] satisfies Array<{ key: keyof DiscordActionForm; label: string }>;\n\nconst slackActionOptions = [\n { key: \"reactions\", label: \"Reactions\" },\n { key: \"messages\", label: \"Messages\" },\n { key: \"pins\", label: \"Pins\" },\n { key: \"memberInfo\", label: \"Member info\" },\n { key: \"emojiList\", label: \"Emoji list\" },\n] satisfies Array<{ key: keyof SlackActionForm; label: string }>;\n\nexport type ConnectionsProps = {\n connected: boolean;\n loading: boolean;\n snapshot: ProvidersStatusSnapshot | null;\n lastError: string | null;\n lastSuccessAt: number | null;\n whatsappMessage: string | null;\n whatsappQrDataUrl: string | null;\n whatsappConnected: boolean | null;\n whatsappBusy: boolean;\n telegramForm: TelegramForm;\n telegramTokenLocked: boolean;\n telegramSaving: boolean;\n telegramStatus: string | null;\n discordForm: DiscordForm;\n discordTokenLocked: boolean;\n discordSaving: boolean;\n discordStatus: string | null;\n slackForm: SlackForm;\n slackTokenLocked: boolean;\n slackAppTokenLocked: boolean;\n slackSaving: boolean;\n slackStatus: string | null;\n signalForm: SignalForm;\n signalSaving: boolean;\n signalStatus: string | null;\n imessageForm: IMessageForm;\n imessageSaving: boolean;\n imessageStatus: string | null;\n onRefresh: (probe: boolean) => void;\n onWhatsAppStart: (force: boolean) => void;\n onWhatsAppWait: () => void;\n onWhatsAppLogout: () => void;\n onTelegramChange: (patch: Partial<TelegramForm>) => void;\n onTelegramSave: () => void;\n onDiscordChange: (patch: Partial<DiscordForm>) => void;\n onDiscordSave: () => void;\n onSlackChange: (patch: Partial<SlackForm>) => void;\n onSlackSave: () => void;\n onSignalChange: (patch: Partial<SignalForm>) => void;\n onSignalSave: () => void;\n onIMessageChange: (patch: Partial<IMessageForm>) => void;\n onIMessageSave: () => void;\n};\n\nexport function renderConnections(props: ConnectionsProps) {\n const whatsapp = props.snapshot?.whatsapp;\n const telegram = props.snapshot?.telegram;\n const discord = props.snapshot?.discord ?? null;\n const slack = props.snapshot?.slack ?? null;\n const signal = props.snapshot?.signal ?? null;\n const imessage = props.snapshot?.imessage ?? null;\n const providerOrder: ProviderKey[] = [\n \"whatsapp\",\n \"telegram\",\n \"discord\",\n \"slack\",\n \"signal\",\n \"imessage\",\n ];\n const orderedProviders = providerOrder\n .map((key, index) => ({\n key,\n enabled: providerEnabled(key, props),\n order: index,\n }))\n .sort((a, b) => {\n if (a.enabled !== b.enabled) return a.enabled ? -1 : 1;\n return a.order - b.order;\n });\n\n return html`\n <section class=\"grid grid-cols-2\">\n ${orderedProviders.map((provider) =>\n renderProvider(provider.key, props, {\n whatsapp,\n telegram,\n discord,\n slack,\n signal,\n imessage,\n }),\n )}\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Connection health</div>\n <div class=\"card-sub\">Provider status snapshots from the gateway.</div>\n </div>\n <div class=\"muted\">${props.lastSuccessAt ? formatAgo(props.lastSuccessAt) : \"n/a\"}</div>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n <pre class=\"code-block\" style=\"margin-top: 12px;\">\n${props.snapshot ? JSON.stringify(props.snapshot, null, 2) : \"No snapshot yet.\"}\n </pre>\n </section>\n `;\n}\n\nfunction formatDuration(ms?: number | null) {\n if (!ms && ms !== 0) return \"n/a\";\n const sec = Math.round(ms / 1000);\n if (sec < 60) return `${sec}s`;\n const min = Math.round(sec / 60);\n if (min < 60) return `${min}m`;\n const hr = Math.round(min / 60);\n return `${hr}h`;\n}\n\ntype ProviderKey =\n | \"whatsapp\"\n | \"telegram\"\n | \"discord\"\n | \"slack\"\n | \"signal\"\n | \"imessage\";\n\nfunction providerEnabled(key: ProviderKey, props: ConnectionsProps) {\n const snapshot = props.snapshot;\n if (!snapshot) return false;\n switch (key) {\n case \"whatsapp\":\n return (\n snapshot.whatsapp.configured ||\n snapshot.whatsapp.linked ||\n snapshot.whatsapp.running\n );\n case \"telegram\":\n return snapshot.telegram.configured || snapshot.telegram.running;\n case \"discord\":\n return Boolean(snapshot.discord?.configured || snapshot.discord?.running);\n case \"slack\":\n return Boolean(snapshot.slack?.configured || snapshot.slack?.running);\n case \"signal\":\n return Boolean(snapshot.signal?.configured || snapshot.signal?.running);\n case \"imessage\":\n return Boolean(snapshot.imessage?.configured || snapshot.imessage?.running);\n default:\n return false;\n }\n}\n\nfunction renderProvider(\n key: ProviderKey,\n props: ConnectionsProps,\n data: {\n whatsapp?: ProvidersStatusSnapshot[\"whatsapp\"];\n telegram?: ProvidersStatusSnapshot[\"telegram\"];\n discord?: ProvidersStatusSnapshot[\"discord\"] | null;\n slack?: ProvidersStatusSnapshot[\"slack\"] | null;\n signal?: ProvidersStatusSnapshot[\"signal\"] | null;\n imessage?: ProvidersStatusSnapshot[\"imessage\"] | null;\n },\n) {\n switch (key) {\n case \"whatsapp\": {\n const whatsapp = data.whatsapp;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">WhatsApp</div>\n <div class=\"card-sub\">Link WhatsApp Web and monitor connection health.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${whatsapp?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Linked</span>\n <span>${whatsapp?.linked ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${whatsapp?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Connected</span>\n <span>${whatsapp?.connected ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Last connect</span>\n <span>\n ${whatsapp?.lastConnectedAt\n ? formatAgo(whatsapp.lastConnectedAt)\n : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Last message</span>\n <span>\n ${whatsapp?.lastMessageAt ? formatAgo(whatsapp.lastMessageAt) : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Auth age</span>\n <span>\n ${whatsapp?.authAgeMs != null ? formatDuration(whatsapp.authAgeMs) : \"n/a\"}\n </span>\n </div>\n </div>\n\n ${whatsapp?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${whatsapp.lastError}\n </div>`\n : nothing}\n\n ${props.whatsappMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.whatsappMessage}\n </div>`\n : nothing}\n\n ${props.whatsappQrDataUrl\n ? html`<div class=\"qr-wrap\">\n <img src=${props.whatsappQrDataUrl} alt=\"WhatsApp QR\" />\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px; flex-wrap: wrap;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(false)}\n >\n ${props.whatsappBusy ? \"Working…\" : \"Show QR\"}\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppStart(true)}\n >\n Relink\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppWait()}\n >\n Wait for scan\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.whatsappBusy}\n @click=${() => props.onWhatsAppLogout()}\n >\n Logout\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Refresh\n </button>\n </div>\n </div>\n `;\n }\n case \"telegram\": {\n const telegram = data.telegram;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Telegram</div>\n <div class=\"card-sub\">Bot token and delivery options.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${telegram?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${telegram?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Mode</span>\n <span>${telegram?.mode ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${telegram?.lastStartAt ? formatAgo(telegram.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${telegram?.lastProbeAt ? formatAgo(telegram.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${telegram?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${telegram.lastError}\n </div>`\n : nothing}\n\n ${telegram?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${telegram.probe.ok ? \"ok\" : \"failed\"} ·\n ${telegram.probe.status ?? \"\"}\n ${telegram.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Bot token</span>\n <input\n type=\"password\"\n .value=${props.telegramForm.token}\n ?disabled=${props.telegramTokenLocked}\n @input=${(e: Event) =>\n props.onTelegramChange({\n token: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Require mention in groups</span>\n <select\n .value=${props.telegramForm.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onTelegramChange({\n requireMention: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Allow from</span>\n <input\n .value=${props.telegramForm.allowFrom}\n @input=${(e: Event) =>\n props.onTelegramChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"123456789, @team\"\n />\n </label>\n <label class=\"field\">\n <span>Proxy</span>\n <input\n .value=${props.telegramForm.proxy}\n @input=${(e: Event) =>\n props.onTelegramChange({\n proxy: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"socks5://localhost:9050\"\n />\n </label>\n <label class=\"field\">\n <span>Webhook URL</span>\n <input\n .value=${props.telegramForm.webhookUrl}\n @input=${(e: Event) =>\n props.onTelegramChange({\n webhookUrl: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"https://example.com/telegram-webhook\"\n />\n </label>\n <label class=\"field\">\n <span>Webhook secret</span>\n <input\n .value=${props.telegramForm.webhookSecret}\n @input=${(e: Event) =>\n props.onTelegramChange({\n webhookSecret: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"secret\"\n />\n </label>\n <label class=\"field\">\n <span>Webhook path</span>\n <input\n .value=${props.telegramForm.webhookPath}\n @input=${(e: Event) =>\n props.onTelegramChange({\n webhookPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"/telegram-webhook\"\n />\n </label>\n </div>\n\n ${props.telegramTokenLocked\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n TELEGRAM_BOT_TOKEN is set in the environment. Config edits will not override it.\n </div>`\n : nothing}\n\n ${props.telegramStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.telegramStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.telegramSaving}\n @click=${() => props.onTelegramSave()}\n >\n ${props.telegramSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"discord\": {\n const discord = data.discord;\n const botName = discord?.probe?.bot?.username;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Discord</div>\n <div class=\"card-sub\">Bot connection and probe status.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${discord?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${discord?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Bot</span>\n <span>${botName ? `@${botName}` : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${discord?.lastStartAt ? formatAgo(discord.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${discord?.lastProbeAt ? formatAgo(discord.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${discord?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${discord.lastError}\n </div>`\n : nothing}\n\n ${discord?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${discord.probe.ok ? \"ok\" : \"failed\"} ·\n ${discord.probe.status ?? \"\"}\n ${discord.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.discordForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Bot token</span>\n <input\n type=\"password\"\n .value=${props.discordForm.token}\n ?disabled=${props.discordTokenLocked}\n @input=${(e: Event) =>\n props.onDiscordChange({\n token: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Allow DMs from</span>\n <input\n .value=${props.discordForm.allowFrom}\n @input=${(e: Event) =>\n props.onDiscordChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"123456789, username#1234\"\n />\n </label>\n <label class=\"field\">\n <span>DMs enabled</span>\n <select\n .value=${props.discordForm.dmEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n dmEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Group DMs</span>\n <select\n .value=${props.discordForm.groupEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n groupEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Group channels</span>\n <input\n .value=${props.discordForm.groupChannels}\n @input=${(e: Event) =>\n props.onDiscordChange({\n groupChannels: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"channelId1, channelId2\"\n />\n </label>\n <label class=\"field\">\n <span>Media max MB</span>\n <input\n .value=${props.discordForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onDiscordChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"8\"\n />\n </label>\n <label class=\"field\">\n <span>History limit</span>\n <input\n .value=${props.discordForm.historyLimit}\n @input=${(e: Event) =>\n props.onDiscordChange({\n historyLimit: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"20\"\n />\n </label>\n <label class=\"field\">\n <span>Text chunk limit</span>\n <input\n .value=${props.discordForm.textChunkLimit}\n @input=${(e: Event) =>\n props.onDiscordChange({\n textChunkLimit: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"2000\"\n />\n </label>\n <label class=\"field\">\n <span>Reply to mode</span>\n <select\n .value=${props.discordForm.replyToMode}\n @change=${(e: Event) =>\n props.onDiscordChange({\n replyToMode: (e.target as HTMLSelectElement).value as\n | \"off\"\n | \"first\"\n | \"all\",\n })}\n >\n <option value=\"off\">Off</option>\n <option value=\"first\">First</option>\n <option value=\"all\">All</option>\n </select>\n </label>\n <div class=\"field full\">\n <span>Guilds</span>\n <div class=\"card-sub\">\n Add each guild (id or slug) and optional channel rules. Empty channel\n entries still allow that channel.\n </div>\n <div class=\"list\">\n ${props.discordForm.guilds.map(\n (guild, guildIndex) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"form-grid\">\n <label class=\"field\">\n <span>Guild id / slug</span>\n <input\n .value=${guild.key}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n key: (e.target as HTMLInputElement).value,\n };\n props.onDiscordChange({ guilds: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Slug</span>\n <input\n .value=${guild.slug}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n slug: (e.target as HTMLInputElement).value,\n };\n props.onDiscordChange({ guilds: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Require mention</span>\n <select\n .value=${guild.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n requireMention:\n (e.target as HTMLSelectElement).value === \"yes\",\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Reaction notifications</span>\n <select\n .value=${guild.reactionNotifications}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n reactionNotifications: (e.target as HTMLSelectElement)\n .value as \"off\" | \"own\" | \"all\" | \"allowlist\",\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"off\">Off</option>\n <option value=\"own\">Own</option>\n <option value=\"all\">All</option>\n <option value=\"allowlist\">Allowlist</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Users allowlist</span>\n <input\n .value=${guild.users}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n next[guildIndex] = {\n ...next[guildIndex],\n users: (e.target as HTMLInputElement).value,\n };\n props.onDiscordChange({ guilds: next });\n }}\n placeholder=\"123456789, username#1234\"\n />\n </label>\n </div>\n ${guild.channels.length\n ? html`\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n ${guild.channels.map(\n (channel, channelIndex) => html`\n <label class=\"field\">\n <span>Channel id / slug</span>\n <input\n .value=${channel.key}\n @input=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels[channelIndex] = {\n ...channels[channelIndex],\n key: (e.target as HTMLInputElement).value,\n };\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Allow</span>\n <select\n .value=${channel.allow ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels[channelIndex] = {\n ...channels[channelIndex],\n allow:\n (e.target as HTMLSelectElement).value ===\n \"yes\",\n };\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Require mention</span>\n <select\n .value=${channel.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels[channelIndex] = {\n ...channels[channelIndex],\n requireMention:\n (e.target as HTMLSelectElement).value ===\n \"yes\",\n };\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>&nbsp;</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [\n ...props.discordForm.guilds,\n ];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n ];\n channels.splice(channelIndex, 1);\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n Remove\n </button>\n </label>\n `,\n )}\n </div>\n `\n : nothing}\n </div>\n <div class=\"list-meta\">\n <span>Channels</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [...props.discordForm.guilds];\n const channels = [\n ...(next[guildIndex].channels ?? []),\n { key: \"\", allow: true, requireMention: false },\n ];\n next[guildIndex] = {\n ...next[guildIndex],\n channels,\n };\n props.onDiscordChange({ guilds: next });\n }}\n >\n Add channel\n </button>\n <button\n class=\"btn danger\"\n @click=${() => {\n const next = [...props.discordForm.guilds];\n next.splice(guildIndex, 1);\n props.onDiscordChange({ guilds: next });\n }}\n >\n Remove guild\n </button>\n </div>\n </div>\n `,\n )}\n </div>\n <button\n class=\"btn\"\n style=\"margin-top: 8px;\"\n @click=${() =>\n props.onDiscordChange({\n guilds: [\n ...props.discordForm.guilds,\n {\n key: \"\",\n slug: \"\",\n requireMention: false,\n reactionNotifications: \"own\",\n users: \"\",\n channels: [],\n },\n ],\n })}\n >\n Add guild\n </button>\n </div>\n <label class=\"field\">\n <span>Slash command</span>\n <select\n .value=${props.discordForm.slashEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n slashEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Slash name</span>\n <input\n .value=${props.discordForm.slashName}\n @input=${(e: Event) =>\n props.onDiscordChange({\n slashName: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"clawd\"\n />\n </label>\n <label class=\"field\">\n <span>Slash session prefix</span>\n <input\n .value=${props.discordForm.slashSessionPrefix}\n @input=${(e: Event) =>\n props.onDiscordChange({\n slashSessionPrefix: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"discord:slash\"\n />\n </label>\n <label class=\"field\">\n <span>Slash ephemeral</span>\n <select\n .value=${props.discordForm.slashEphemeral ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n slashEphemeral: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n </div>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Tool actions</div>\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n ${discordActionOptions.map(\n (action) => html`<label class=\"field\">\n <span>${action.label}</span>\n <select\n .value=${props.discordForm.actions[action.key] ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onDiscordChange({\n actions: {\n ...props.discordForm.actions,\n [action.key]: (e.target as HTMLSelectElement).value === \"yes\",\n },\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>`,\n )}\n </div>\n\n ${props.discordTokenLocked\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n DISCORD_BOT_TOKEN is set in the environment. Config edits will not override it.\n </div>`\n : nothing}\n\n ${props.discordStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.discordStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.discordSaving}\n @click=${() => props.onDiscordSave()}\n >\n ${props.discordSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"slack\": {\n const slack = data.slack;\n const botName = slack?.probe?.bot?.name;\n const teamName = slack?.probe?.team?.name;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Slack</div>\n <div class=\"card-sub\">Socket mode status and bot details.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${slack?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${slack?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Bot</span>\n <span>${botName ? botName : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Team</span>\n <span>${teamName ? teamName : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${slack?.lastStartAt ? formatAgo(slack.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${slack?.lastProbeAt ? formatAgo(slack.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${slack?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${slack.lastError}\n </div>`\n : nothing}\n\n ${slack?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${slack.probe.ok ? \"ok\" : \"failed\"} ·\n ${slack.probe.status ?? \"\"}\n ${slack.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.slackForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Bot token</span>\n <input\n type=\"password\"\n .value=${props.slackForm.botToken}\n ?disabled=${props.slackTokenLocked}\n @input=${(e: Event) =>\n props.onSlackChange({\n botToken: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>App token</span>\n <input\n type=\"password\"\n .value=${props.slackForm.appToken}\n ?disabled=${props.slackAppTokenLocked}\n @input=${(e: Event) =>\n props.onSlackChange({\n appToken: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>DMs enabled</span>\n <select\n .value=${props.slackForm.dmEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n dmEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Allow DMs from</span>\n <input\n .value=${props.slackForm.allowFrom}\n @input=${(e: Event) =>\n props.onSlackChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"U123, U456, *\"\n />\n </label>\n <label class=\"field\">\n <span>Group DMs enabled</span>\n <select\n .value=${props.slackForm.groupEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n groupEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Group DM channels</span>\n <input\n .value=${props.slackForm.groupChannels}\n @input=${(e: Event) =>\n props.onSlackChange({\n groupChannels: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"G123, #team\"\n />\n </label>\n <label class=\"field\">\n <span>Reaction notifications</span>\n <select\n .value=${props.slackForm.reactionNotifications}\n @change=${(e: Event) =>\n props.onSlackChange({\n reactionNotifications: (e.target as HTMLSelectElement)\n .value as \"off\" | \"own\" | \"all\" | \"allowlist\",\n })}\n >\n <option value=\"off\">Off</option>\n <option value=\"own\">Own</option>\n <option value=\"all\">All</option>\n <option value=\"allowlist\">Allowlist</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Reaction allowlist</span>\n <input\n .value=${props.slackForm.reactionAllowlist}\n @input=${(e: Event) =>\n props.onSlackChange({\n reactionAllowlist: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"U123, U456\"\n />\n </label>\n <label class=\"field\">\n <span>Text chunk limit</span>\n <input\n .value=${props.slackForm.textChunkLimit}\n @input=${(e: Event) =>\n props.onSlackChange({\n textChunkLimit: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"4000\"\n />\n </label>\n <label class=\"field\">\n <span>Media max (MB)</span>\n <input\n .value=${props.slackForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onSlackChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"20\"\n />\n </label>\n </div>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Slash command</div>\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n <label class=\"field\">\n <span>Slash enabled</span>\n <select\n .value=${props.slackForm.slashEnabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n slashEnabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Slash name</span>\n <input\n .value=${props.slackForm.slashName}\n @input=${(e: Event) =>\n props.onSlackChange({\n slashName: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"clawd\"\n />\n </label>\n <label class=\"field\">\n <span>Slash session prefix</span>\n <input\n .value=${props.slackForm.slashSessionPrefix}\n @input=${(e: Event) =>\n props.onSlackChange({\n slashSessionPrefix: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"slack:slash\"\n />\n </label>\n <label class=\"field\">\n <span>Slash ephemeral</span>\n <select\n .value=${props.slackForm.slashEphemeral ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n slashEphemeral: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n </div>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Channels</div>\n <div class=\"card-sub\">\n Add channel ids or #names and optionally require mentions.\n </div>\n <div class=\"list\">\n ${props.slackForm.channels.map(\n (channel, channelIndex) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"form-grid\">\n <label class=\"field\">\n <span>Channel id / name</span>\n <input\n .value=${channel.key}\n @input=${(e: Event) => {\n const next = [...props.slackForm.channels];\n next[channelIndex] = {\n ...next[channelIndex],\n key: (e.target as HTMLInputElement).value,\n };\n props.onSlackChange({ channels: next });\n }}\n />\n </label>\n <label class=\"field\">\n <span>Allow</span>\n <select\n .value=${channel.allow ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.slackForm.channels];\n next[channelIndex] = {\n ...next[channelIndex],\n allow:\n (e.target as HTMLSelectElement).value === \"yes\",\n };\n props.onSlackChange({ channels: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Require mention</span>\n <select\n .value=${channel.requireMention ? \"yes\" : \"no\"}\n @change=${(e: Event) => {\n const next = [...props.slackForm.channels];\n next[channelIndex] = {\n ...next[channelIndex],\n requireMention:\n (e.target as HTMLSelectElement).value === \"yes\",\n };\n props.onSlackChange({ channels: next });\n }}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>&nbsp;</span>\n <button\n class=\"btn\"\n @click=${() => {\n const next = [...props.slackForm.channels];\n next.splice(channelIndex, 1);\n props.onSlackChange({ channels: next });\n }}\n >\n Remove\n </button>\n </label>\n </div>\n </div>\n </div>\n `,\n )}\n </div>\n <button\n class=\"btn\"\n style=\"margin-top: 8px;\"\n @click=${() =>\n props.onSlackChange({\n channels: [\n ...props.slackForm.channels,\n { key: \"\", allow: true, requireMention: false },\n ],\n })}\n >\n Add channel\n </button>\n\n <div class=\"card-sub\" style=\"margin-top: 16px;\">Tool actions</div>\n <div class=\"form-grid\" style=\"margin-top: 8px;\">\n ${slackActionOptions.map(\n (action) => html`<label class=\"field\">\n <span>${action.label}</span>\n <select\n .value=${props.slackForm.actions[action.key] ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSlackChange({\n actions: {\n ...props.slackForm.actions,\n [action.key]: (e.target as HTMLSelectElement).value === \"yes\",\n },\n })}\n >\n <option value=\"yes\">Enabled</option>\n <option value=\"no\">Disabled</option>\n </select>\n </label>`,\n )}\n </div>\n\n ${props.slackTokenLocked || props.slackAppTokenLocked\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.slackTokenLocked ? \"SLACK_BOT_TOKEN \" : \"\"}\n ${props.slackAppTokenLocked ? \"SLACK_APP_TOKEN \" : \"\"}\n is set in the environment. Config edits will not override it.\n </div>`\n : nothing}\n\n ${props.slackStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.slackStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.slackSaving}\n @click=${() => props.onSlackSave()}\n >\n ${props.slackSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"signal\": {\n const signal = data.signal;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">Signal</div>\n <div class=\"card-sub\">REST daemon status and probe details.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${signal?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${signal?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Base URL</span>\n <span>${signal?.baseUrl ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>${signal?.lastStartAt ? formatAgo(signal.lastStartAt) : \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>${signal?.lastProbeAt ? formatAgo(signal.lastProbeAt) : \"n/a\"}</span>\n </div>\n </div>\n\n ${signal?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${signal.lastError}\n </div>`\n : nothing}\n\n ${signal?.probe\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe ${signal.probe.ok ? \"ok\" : \"failed\"} ·\n ${signal.probe.status ?? \"\"}\n ${signal.probe.error ?? \"\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.signalForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Account</span>\n <input\n .value=${props.signalForm.account}\n @input=${(e: Event) =>\n props.onSignalChange({\n account: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"+15551234567\"\n />\n </label>\n <label class=\"field\">\n <span>HTTP URL</span>\n <input\n .value=${props.signalForm.httpUrl}\n @input=${(e: Event) =>\n props.onSignalChange({\n httpUrl: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"http://127.0.0.1:8080\"\n />\n </label>\n <label class=\"field\">\n <span>HTTP host</span>\n <input\n .value=${props.signalForm.httpHost}\n @input=${(e: Event) =>\n props.onSignalChange({\n httpHost: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"127.0.0.1\"\n />\n </label>\n <label class=\"field\">\n <span>HTTP port</span>\n <input\n .value=${props.signalForm.httpPort}\n @input=${(e: Event) =>\n props.onSignalChange({\n httpPort: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"8080\"\n />\n </label>\n <label class=\"field\">\n <span>CLI path</span>\n <input\n .value=${props.signalForm.cliPath}\n @input=${(e: Event) =>\n props.onSignalChange({\n cliPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"signal-cli\"\n />\n </label>\n <label class=\"field\">\n <span>Auto start</span>\n <select\n .value=${props.signalForm.autoStart ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n autoStart: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Receive mode</span>\n <select\n .value=${props.signalForm.receiveMode}\n @change=${(e: Event) =>\n props.onSignalChange({\n receiveMode: (e.target as HTMLSelectElement).value as\n | \"on-start\"\n | \"manual\"\n | \"\",\n })}\n >\n <option value=\"\">Default</option>\n <option value=\"on-start\">on-start</option>\n <option value=\"manual\">manual</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Ignore attachments</span>\n <select\n .value=${props.signalForm.ignoreAttachments ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n ignoreAttachments:\n (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Ignore stories</span>\n <select\n .value=${props.signalForm.ignoreStories ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n ignoreStories: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Send read receipts</span>\n <select\n .value=${props.signalForm.sendReadReceipts ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onSignalChange({\n sendReadReceipts:\n (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Allow from</span>\n <input\n .value=${props.signalForm.allowFrom}\n @input=${(e: Event) =>\n props.onSignalChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"12345, +1555\"\n />\n </label>\n <label class=\"field\">\n <span>Media max MB</span>\n <input\n .value=${props.signalForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onSignalChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"8\"\n />\n </label>\n </div>\n\n ${props.signalStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.signalStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.signalSaving}\n @click=${() => props.onSignalSave()}\n >\n ${props.signalSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n case \"imessage\": {\n const imessage = data.imessage;\n return html`\n <div class=\"card\">\n <div class=\"card-title\">iMessage</div>\n <div class=\"card-sub\">imsg CLI and database availability.</div>\n\n <div class=\"status-list\" style=\"margin-top: 16px;\">\n <div>\n <span class=\"label\">Configured</span>\n <span>${imessage?.configured ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">Running</span>\n <span>${imessage?.running ? \"Yes\" : \"No\"}</span>\n </div>\n <div>\n <span class=\"label\">CLI</span>\n <span>${imessage?.cliPath ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">DB</span>\n <span>${imessage?.dbPath ?? \"n/a\"}</span>\n </div>\n <div>\n <span class=\"label\">Last start</span>\n <span>\n ${imessage?.lastStartAt ? formatAgo(imessage.lastStartAt) : \"n/a\"}\n </span>\n </div>\n <div>\n <span class=\"label\">Last probe</span>\n <span>\n ${imessage?.lastProbeAt ? formatAgo(imessage.lastProbeAt) : \"n/a\"}\n </span>\n </div>\n </div>\n\n ${imessage?.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${imessage.lastError}\n </div>`\n : nothing}\n\n ${imessage?.probe && !imessage.probe.ok\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n Probe failed · ${imessage.probe.error ?? \"unknown error\"}\n </div>`\n : nothing}\n\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Enabled</span>\n <select\n .value=${props.imessageForm.enabled ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onIMessageChange({\n enabled: (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>CLI path</span>\n <input\n .value=${props.imessageForm.cliPath}\n @input=${(e: Event) =>\n props.onIMessageChange({\n cliPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"imsg\"\n />\n </label>\n <label class=\"field\">\n <span>DB path</span>\n <input\n .value=${props.imessageForm.dbPath}\n @input=${(e: Event) =>\n props.onIMessageChange({\n dbPath: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"~/Library/Messages/chat.db\"\n />\n </label>\n <label class=\"field\">\n <span>Service</span>\n <select\n .value=${props.imessageForm.service}\n @change=${(e: Event) =>\n props.onIMessageChange({\n service: (e.target as HTMLSelectElement).value as\n | \"auto\"\n | \"imessage\"\n | \"sms\",\n })}\n >\n <option value=\"auto\">Auto</option>\n <option value=\"imessage\">iMessage</option>\n <option value=\"sms\">SMS</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Region</span>\n <input\n .value=${props.imessageForm.region}\n @input=${(e: Event) =>\n props.onIMessageChange({\n region: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"US\"\n />\n </label>\n <label class=\"field\">\n <span>Allow from</span>\n <input\n .value=${props.imessageForm.allowFrom}\n @input=${(e: Event) =>\n props.onIMessageChange({\n allowFrom: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"chat_id:101, +1555\"\n />\n </label>\n <label class=\"field\">\n <span>Include attachments</span>\n <select\n .value=${props.imessageForm.includeAttachments ? \"yes\" : \"no\"}\n @change=${(e: Event) =>\n props.onIMessageChange({\n includeAttachments:\n (e.target as HTMLSelectElement).value === \"yes\",\n })}\n >\n <option value=\"yes\">Yes</option>\n <option value=\"no\">No</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Media max MB</span>\n <input\n .value=${props.imessageForm.mediaMaxMb}\n @input=${(e: Event) =>\n props.onIMessageChange({\n mediaMaxMb: (e.target as HTMLInputElement).value,\n })}\n placeholder=\"16\"\n />\n </label>\n </div>\n\n ${props.imessageStatus\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.imessageStatus}\n </div>`\n : nothing}\n\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button\n class=\"btn primary\"\n ?disabled=${props.imessageSaving}\n @click=${() => props.onIMessageSave()}\n >\n ${props.imessageSaving ? \"Saving…\" : \"Save\"}\n </button>\n <button class=\"btn\" @click=${() => props.onRefresh(true)}>\n Probe\n </button>\n </div>\n </div>\n `;\n }\n default:\n return nothing;\n }\n}\n","import { formatAgo, formatDurationMs, formatMs } from \"./format\";\nimport type { CronJob, GatewaySessionRow, PresenceEntry } from \"./types\";\n\nexport function formatPresenceSummary(entry: PresenceEntry): string {\n const host = entry.host ?? \"unknown\";\n const ip = entry.ip ? `(${entry.ip})` : \"\";\n const mode = entry.mode ?? \"\";\n const version = entry.version ?? \"\";\n return `${host} ${ip} ${mode} ${version}`.trim();\n}\n\nexport function formatPresenceAge(entry: PresenceEntry): string {\n const ts = entry.ts ?? null;\n return ts ? formatAgo(ts) : \"n/a\";\n}\n\nexport function formatNextRun(ms?: number | null) {\n if (!ms) return \"n/a\";\n return `${formatMs(ms)} (${formatAgo(ms)})`;\n}\n\nexport function formatSessionTokens(row: GatewaySessionRow) {\n if (row.totalTokens == null) return \"n/a\";\n const total = row.totalTokens ?? 0;\n const ctx = row.contextTokens ?? 0;\n return ctx ? `${total} / ${ctx}` : String(total);\n}\n\nexport function formatEventPayload(payload: unknown): string {\n if (payload == null) return \"\";\n try {\n return JSON.stringify(payload, null, 2);\n } catch {\n return String(payload);\n }\n}\n\nexport function formatCronState(job: CronJob) {\n const state = job.state ?? {};\n const next = state.nextRunAtMs ? formatMs(state.nextRunAtMs) : \"n/a\";\n const last = state.lastRunAtMs ? formatMs(state.lastRunAtMs) : \"n/a\";\n const status = state.lastStatus ?? \"n/a\";\n return `${status} · next ${next} · last ${last}`;\n}\n\nexport function formatCronSchedule(job: CronJob) {\n const s = job.schedule;\n if (s.kind === \"at\") return `At ${formatMs(s.atMs)}`;\n if (s.kind === \"every\") return `Every ${formatDurationMs(s.everyMs)}`;\n return `Cron ${s.expr}${s.tz ? ` (${s.tz})` : \"\"}`;\n}\n\nexport function formatCronPayload(job: CronJob) {\n const p = job.payload;\n if (p.kind === \"systemEvent\") return `System: ${p.text}`;\n return `Agent: ${p.message}`;\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatMs } from \"../format\";\nimport {\n formatCronPayload,\n formatCronSchedule,\n formatCronState,\n formatNextRun,\n} from \"../presenter\";\nimport type { CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronProps = {\n loading: boolean;\n status: CronStatus | null;\n jobs: CronJob[];\n error: string | null;\n busy: boolean;\n form: CronFormState;\n runsJobId: string | null;\n runs: CronRunLogEntry[];\n onFormChange: (patch: Partial<CronFormState>) => void;\n onRefresh: () => void;\n onAdd: () => void;\n onToggle: (job: CronJob, enabled: boolean) => void;\n onRun: (job: CronJob) => void;\n onRemove: (job: CronJob) => void;\n onLoadRuns: (jobId: string) => void;\n};\n\nexport function renderCron(props: CronProps) {\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"card-title\">Scheduler</div>\n <div class=\"card-sub\">Gateway-owned cron scheduler status.</div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">Enabled</div>\n <div class=\"stat-value\">\n ${props.status\n ? props.status.enabled\n ? \"Yes\"\n : \"No\"\n : \"n/a\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Jobs</div>\n <div class=\"stat-value\">${props.status?.jobCount ?? \"n/a\"}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Next wake</div>\n <div class=\"stat-value\">${formatNextRun(props.status?.nextWakeAtMs ?? null)}</div>\n </div>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n ${props.error ? html`<span class=\"muted\">${props.error}</span>` : nothing}\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">New Job</div>\n <div class=\"card-sub\">Create a scheduled wakeup or agent run.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Name</span>\n <input\n .value=${props.form.name}\n @input=${(e: Event) =>\n props.onFormChange({ name: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>Description</span>\n <input\n .value=${props.form.description}\n @input=${(e: Event) =>\n props.onFormChange({ description: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Enabled</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.enabled}\n @change=${(e: Event) =>\n props.onFormChange({ enabled: (e.target as HTMLInputElement).checked })}\n />\n </label>\n <label class=\"field\">\n <span>Schedule</span>\n <select\n .value=${props.form.scheduleKind}\n @change=${(e: Event) =>\n props.onFormChange({\n scheduleKind: (e.target as HTMLSelectElement).value as CronFormState[\"scheduleKind\"],\n })}\n >\n <option value=\"every\">Every</option>\n <option value=\"at\">At</option>\n <option value=\"cron\">Cron</option>\n </select>\n </label>\n </div>\n ${renderScheduleFields(props)}\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Session</span>\n <select\n .value=${props.form.sessionTarget}\n @change=${(e: Event) =>\n props.onFormChange({\n sessionTarget: (e.target as HTMLSelectElement).value as CronFormState[\"sessionTarget\"],\n })}\n >\n <option value=\"main\">Main</option>\n <option value=\"isolated\">Isolated</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Wake mode</span>\n <select\n .value=${props.form.wakeMode}\n @change=${(e: Event) =>\n props.onFormChange({\n wakeMode: (e.target as HTMLSelectElement).value as CronFormState[\"wakeMode\"],\n })}\n >\n <option value=\"next-heartbeat\">Next heartbeat</option>\n <option value=\"now\">Now</option>\n </select>\n </label>\n <label class=\"field\">\n <span>Payload</span>\n <select\n .value=${props.form.payloadKind}\n @change=${(e: Event) =>\n props.onFormChange({\n payloadKind: (e.target as HTMLSelectElement).value as CronFormState[\"payloadKind\"],\n })}\n >\n <option value=\"systemEvent\">System event</option>\n <option value=\"agentTurn\">Agent turn</option>\n </select>\n </label>\n </div>\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>${props.form.payloadKind === \"systemEvent\" ? \"System text\" : \"Agent message\"}</span>\n <textarea\n .value=${props.form.payloadText}\n @input=${(e: Event) =>\n props.onFormChange({\n payloadText: (e.target as HTMLTextAreaElement).value,\n })}\n rows=\"4\"\n ></textarea>\n </label>\n ${props.form.payloadKind === \"agentTurn\"\n ? html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field checkbox\">\n <span>Deliver</span>\n <input\n type=\"checkbox\"\n .checked=${props.form.deliver}\n @change=${(e: Event) =>\n props.onFormChange({\n deliver: (e.target as HTMLInputElement).checked,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Channel</span>\n <select\n .value=${props.form.channel}\n @change=${(e: Event) =>\n props.onFormChange({\n channel: (e.target as HTMLSelectElement).value as CronFormState[\"channel\"],\n })}\n >\n <option value=\"last\">Last</option>\n <option value=\"whatsapp\">WhatsApp</option>\n <option value=\"telegram\">Telegram</option>\n </select>\n </label>\n <label class=\"field\">\n <span>To</span>\n <input\n .value=${props.form.to}\n @input=${(e: Event) =>\n props.onFormChange({ to: (e.target as HTMLInputElement).value })}\n placeholder=\"+1555… or chat id\"\n />\n </label>\n <label class=\"field\">\n <span>Timeout (seconds)</span>\n <input\n .value=${props.form.timeoutSeconds}\n @input=${(e: Event) =>\n props.onFormChange({\n timeoutSeconds: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n ${props.form.sessionTarget === \"isolated\"\n ? html`\n <label class=\"field\">\n <span>Post to main prefix</span>\n <input\n .value=${props.form.postToMainPrefix}\n @input=${(e: Event) =>\n props.onFormChange({\n postToMainPrefix: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `\n : nothing}\n </div>\n `\n : nothing}\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn primary\" ?disabled=${props.busy} @click=${props.onAdd}>\n ${props.busy ? \"Saving…\" : \"Add job\"}\n </button>\n </div>\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Jobs</div>\n <div class=\"card-sub\">All scheduled jobs stored in the gateway.</div>\n ${props.jobs.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">No jobs yet.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.jobs.map((job) => renderJob(job, props))}\n </div>\n `}\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Run history</div>\n <div class=\"card-sub\">Latest runs for ${props.runsJobId ?? \"(select a job)\"}.</div>\n ${props.runs.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">No runs yet.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.runs.map((entry) => renderRun(entry))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderScheduleFields(props: CronProps) {\n const form = props.form;\n if (form.scheduleKind === \"at\") {\n return html`\n <label class=\"field\" style=\"margin-top: 12px;\">\n <span>Run at</span>\n <input\n type=\"datetime-local\"\n .value=${form.scheduleAt}\n @input=${(e: Event) =>\n props.onFormChange({\n scheduleAt: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n `;\n }\n if (form.scheduleKind === \"every\") {\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Every</span>\n <input\n .value=${form.everyAmount}\n @input=${(e: Event) =>\n props.onFormChange({\n everyAmount: (e.target as HTMLInputElement).value,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Unit</span>\n <select\n .value=${form.everyUnit}\n @change=${(e: Event) =>\n props.onFormChange({\n everyUnit: (e.target as HTMLSelectElement).value as CronFormState[\"everyUnit\"],\n })}\n >\n <option value=\"minutes\">Minutes</option>\n <option value=\"hours\">Hours</option>\n <option value=\"days\">Days</option>\n </select>\n </label>\n </div>\n `;\n }\n return html`\n <div class=\"form-grid\" style=\"margin-top: 12px;\">\n <label class=\"field\">\n <span>Expression</span>\n <input\n .value=${form.cronExpr}\n @input=${(e: Event) =>\n props.onFormChange({ cronExpr: (e.target as HTMLInputElement).value })}\n />\n </label>\n <label class=\"field\">\n <span>Timezone (optional)</span>\n <input\n .value=${form.cronTz}\n @input=${(e: Event) =>\n props.onFormChange({ cronTz: (e.target as HTMLInputElement).value })}\n />\n </label>\n </div>\n `;\n}\n\nfunction renderJob(job: CronJob, props: CronProps) {\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${job.name}</div>\n <div class=\"list-sub\">${formatCronSchedule(job)}</div>\n <div class=\"muted\">${formatCronPayload(job)}</div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${job.enabled ? \"enabled\" : \"disabled\"}</span>\n <span class=\"chip\">${job.sessionTarget}</span>\n <span class=\"chip\">${job.wakeMode}</span>\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatCronState(job)}</div>\n <div class=\"row\" style=\"justify-content: flex-end; margin-top: 8px;\">\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${() => props.onToggle(job, !job.enabled)}\n >\n ${job.enabled ? \"Disable\" : \"Enable\"}\n </button>\n <button class=\"btn\" ?disabled=${props.busy} @click=${() => props.onRun(job)}>\n Run\n </button>\n <button\n class=\"btn\"\n ?disabled=${props.busy}\n @click=${() => props.onLoadRuns(job.id)}\n >\n Runs\n </button>\n <button\n class=\"btn danger\"\n ?disabled=${props.busy}\n @click=${() => props.onRemove(job)}\n >\n Remove\n </button>\n </div>\n </div>\n </div>\n `;\n}\n\nfunction renderRun(entry: CronRunLogEntry) {\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.status}</div>\n <div class=\"list-sub\">${entry.summary ?? \"\"}</div>\n </div>\n <div class=\"list-meta\">\n <div>${formatMs(entry.ts)}</div>\n <div class=\"muted\">${entry.durationMs ?? 0}ms</div>\n ${entry.error ? html`<div class=\"muted\">${entry.error}</div>` : nothing}\n </div>\n </div>\n `;\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatEventPayload } from \"../presenter\";\n\ntype EventLogEntry = {\n ts: number;\n event: string;\n payload?: unknown;\n};\n\nexport type DebugProps = {\n loading: boolean;\n status: Record<string, unknown> | null;\n health: Record<string, unknown> | null;\n models: unknown[];\n heartbeat: unknown;\n eventLog: EventLogEntry[];\n callMethod: string;\n callParams: string;\n callResult: string | null;\n callError: string | null;\n onCallMethodChange: (next: string) => void;\n onCallParamsChange: (next: string) => void;\n onRefresh: () => void;\n onCall: () => void;\n};\n\nexport function renderDebug(props: DebugProps) {\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Snapshots</div>\n <div class=\"card-sub\">Status, health, and heartbeat data.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Refreshing…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"stack\" style=\"margin-top: 12px;\">\n <div>\n <div class=\"muted\">Status</div>\n <pre class=\"code-block\">${JSON.stringify(props.status ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Health</div>\n <pre class=\"code-block\">${JSON.stringify(props.health ?? {}, null, 2)}</pre>\n </div>\n <div>\n <div class=\"muted\">Last heartbeat</div>\n <pre class=\"code-block\">${JSON.stringify(props.heartbeat ?? {}, null, 2)}</pre>\n </div>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">Manual RPC</div>\n <div class=\"card-sub\">Send a raw gateway method with JSON params.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>Method</span>\n <input\n .value=${props.callMethod}\n @input=${(e: Event) =>\n props.onCallMethodChange((e.target as HTMLInputElement).value)}\n placeholder=\"system-presence\"\n />\n </label>\n <label class=\"field\">\n <span>Params (JSON)</span>\n <textarea\n .value=${props.callParams}\n @input=${(e: Event) =>\n props.onCallParamsChange((e.target as HTMLTextAreaElement).value)}\n rows=\"6\"\n ></textarea>\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 12px;\">\n <button class=\"btn primary\" @click=${props.onCall}>Call</button>\n </div>\n ${props.callError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.callError}\n </div>`\n : nothing}\n ${props.callResult\n ? html`<pre class=\"code-block\" style=\"margin-top: 12px;\">${props.callResult}</pre>`\n : nothing}\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Models</div>\n <div class=\"card-sub\">Catalog from models.list.</div>\n <pre class=\"code-block\" style=\"margin-top: 12px;\">${JSON.stringify(\n props.models ?? [],\n null,\n 2,\n )}</pre>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Event Log</div>\n <div class=\"card-sub\">Latest gateway events.</div>\n ${props.eventLog.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 12px;\">No events yet.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 12px;\">\n ${props.eventLog.map(\n (evt) => html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${evt.event}</div>\n <div class=\"list-sub\">${new Date(evt.ts).toLocaleTimeString()}</div>\n </div>\n <div class=\"list-meta\">\n <pre class=\"code-block\">${formatEventPayload(evt.payload)}</pre>\n </div>\n </div>\n `,\n )}\n </div>\n `}\n </section>\n `;\n}\n\n","import { html, nothing } from \"lit\";\n\nimport { formatPresenceAge, formatPresenceSummary } from \"../presenter\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type InstancesProps = {\n loading: boolean;\n entries: PresenceEntry[];\n lastError: string | null;\n statusMessage: string | null;\n onRefresh: () => void;\n};\n\nexport function renderInstances(props: InstancesProps) {\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Connected Instances</div>\n <div class=\"card-sub\">Presence beacons from the gateway and clients.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">\n ${props.lastError}\n </div>`\n : nothing}\n ${props.statusMessage\n ? html`<div class=\"callout\" style=\"margin-top: 12px;\">\n ${props.statusMessage}\n </div>`\n : nothing}\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.entries.length === 0\n ? html`<div class=\"muted\">No instances reported yet.</div>`\n : props.entries.map((entry) => renderEntry(entry))}\n </div>\n </section>\n `;\n}\n\nfunction renderEntry(entry: PresenceEntry) {\n const lastInput =\n entry.lastInputSeconds != null\n ? `${entry.lastInputSeconds}s ago`\n : \"n/a\";\n const mode = entry.mode ?? \"unknown\";\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${entry.host ?? \"unknown host\"}</div>\n <div class=\"list-sub\">${formatPresenceSummary(entry)}</div>\n <div class=\"chip-row\">\n <span class=\"chip\">${mode}</span>\n ${entry.platform ? html`<span class=\"chip\">${entry.platform}</span>` : nothing}\n ${entry.deviceFamily\n ? html`<span class=\"chip\">${entry.deviceFamily}</span>`\n : nothing}\n ${entry.modelIdentifier\n ? html`<span class=\"chip\">${entry.modelIdentifier}</span>`\n : nothing}\n ${entry.version ? html`<span class=\"chip\">${entry.version}</span>` : nothing}\n </div>\n </div>\n <div class=\"list-meta\">\n <div>${formatPresenceAge(entry)}</div>\n <div class=\"muted\">Last input ${lastInput}</div>\n <div class=\"muted\">Reason ${entry.reason ?? \"\"}</div>\n </div>\n </div>\n `;\n}\n","import { html } from \"lit\";\n\nexport type NodesProps = {\n loading: boolean;\n nodes: Array<Record<string, unknown>>;\n onRefresh: () => void;\n};\n\nexport function renderNodes(props: NodesProps) {\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Nodes</div>\n <div class=\"card-sub\">Paired devices and live connections.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${props.nodes.length === 0\n ? html`<div class=\"muted\">No nodes found.</div>`\n : props.nodes.map((n) => renderNode(n))}\n </div>\n </section>\n `;\n}\n\nfunction renderNode(node: Record<string, unknown>) {\n const connected = Boolean(node.connected);\n const paired = Boolean(node.paired);\n const title =\n (typeof node.displayName === \"string\" && node.displayName.trim()) ||\n (typeof node.nodeId === \"string\" ? node.nodeId : \"unknown\");\n const caps = Array.isArray(node.caps) ? (node.caps as unknown[]) : [];\n const commands = Array.isArray(node.commands) ? (node.commands as unknown[]) : [];\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">${title}</div>\n <div class=\"list-sub\">\n ${typeof node.nodeId === \"string\" ? node.nodeId : \"\"}\n ${typeof node.remoteIp === \"string\" ? ` · ${node.remoteIp}` : \"\"}\n ${typeof node.version === \"string\" ? ` · ${node.version}` : \"\"}\n </div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${paired ? \"paired\" : \"unpaired\"}</span>\n <span class=\"chip ${connected ? \"chip-ok\" : \"chip-warn\"}\">\n ${connected ? \"connected\" : \"offline\"}\n </span>\n ${caps.slice(0, 12).map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n ${commands\n .slice(0, 8)\n .map((c) => html`<span class=\"chip\">${String(c)}</span>`)}\n </div>\n </div>\n </div>\n `;\n}\n\n","import { html } from \"lit\";\n\nimport type { GatewayHelloOk } from \"../gateway\";\nimport { formatAgo, formatDurationMs } from \"../format\";\nimport { formatNextRun } from \"../presenter\";\nimport type { UiSettings } from \"../storage\";\n\nexport type OverviewProps = {\n connected: boolean;\n hello: GatewayHelloOk | null;\n settings: UiSettings;\n password: string;\n lastError: string | null;\n presenceCount: number;\n sessionsCount: number | null;\n cronEnabled: boolean | null;\n cronNext: number | null;\n lastProvidersRefresh: number | null;\n onSettingsChange: (next: UiSettings) => void;\n onPasswordChange: (next: string) => void;\n onSessionKeyChange: (next: string) => void;\n onRefresh: () => void;\n};\n\nexport function renderOverview(props: OverviewProps) {\n const snapshot = props.hello?.snapshot as\n | { uptimeMs?: number; policy?: { tickIntervalMs?: number } }\n | undefined;\n const uptime = snapshot?.uptimeMs ? formatDurationMs(snapshot.uptimeMs) : \"n/a\";\n const tick = snapshot?.policy?.tickIntervalMs\n ? `${snapshot.policy.tickIntervalMs}ms`\n : \"n/a\";\n\n return html`\n <section class=\"grid grid-cols-2\">\n <div class=\"card\">\n <div class=\"card-title\">Gateway Access</div>\n <div class=\"card-sub\">Where the dashboard connects and how it authenticates.</div>\n <div class=\"form-grid\" style=\"margin-top: 16px;\">\n <label class=\"field\">\n <span>WebSocket URL</span>\n <input\n .value=${props.settings.gatewayUrl}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, gatewayUrl: v });\n }}\n placeholder=\"ws://100.x.y.z:18789\"\n />\n </label>\n <label class=\"field\">\n <span>Gateway Token</span>\n <input\n .value=${props.settings.token}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSettingsChange({ ...props.settings, token: v });\n }}\n placeholder=\"CLAWDBOT_GATEWAY_TOKEN\"\n />\n </label>\n <label class=\"field\">\n <span>Password (not stored)</span>\n <input\n type=\"password\"\n .value=${props.password}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onPasswordChange(v);\n }}\n placeholder=\"system or shared password\"\n />\n </label>\n <label class=\"field\">\n <span>Default Session Key</span>\n <input\n .value=${props.settings.sessionKey}\n @input=${(e: Event) => {\n const v = (e.target as HTMLInputElement).value;\n props.onSessionKeyChange(v);\n }}\n />\n </label>\n </div>\n <div class=\"row\" style=\"margin-top: 14px;\">\n <button class=\"btn\" @click=${() => props.onRefresh()}>Refresh</button>\n <span class=\"muted\">Reconnect to apply changes.</span>\n </div>\n </div>\n\n <div class=\"card\">\n <div class=\"card-title\">Snapshot</div>\n <div class=\"card-sub\">Latest gateway handshake information.</div>\n <div class=\"stat-grid\" style=\"margin-top: 16px;\">\n <div class=\"stat\">\n <div class=\"stat-label\">Status</div>\n <div class=\"stat-value ${props.connected ? \"ok\" : \"warn\"}\">\n ${props.connected ? \"Connected\" : \"Disconnected\"}\n </div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Uptime</div>\n <div class=\"stat-value\">${uptime}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Tick Interval</div>\n <div class=\"stat-value\">${tick}</div>\n </div>\n <div class=\"stat\">\n <div class=\"stat-label\">Last Providers Refresh</div>\n <div class=\"stat-value\">\n ${props.lastProvidersRefresh\n ? formatAgo(props.lastProvidersRefresh)\n : \"n/a\"}\n </div>\n </div>\n </div>\n ${props.lastError\n ? html`<div class=\"callout danger\" style=\"margin-top: 14px;\">\n ${props.lastError}\n </div>`\n : html`<div class=\"callout\" style=\"margin-top: 14px;\">\n Use Connections to link WhatsApp, Telegram, Discord, Signal, or iMessage.\n </div>`}\n </div>\n </section>\n\n <section class=\"grid grid-cols-3\" style=\"margin-top: 18px;\">\n <div class=\"card stat-card\">\n <div class=\"stat-label\">Instances</div>\n <div class=\"stat-value\">${props.presenceCount}</div>\n <div class=\"muted\">Presence beacons in the last 5 minutes.</div>\n </div>\n <div class=\"card stat-card\">\n <div class=\"stat-label\">Sessions</div>\n <div class=\"stat-value\">${props.sessionsCount ?? \"n/a\"}</div>\n <div class=\"muted\">Recent session keys tracked by the gateway.</div>\n </div>\n <div class=\"card stat-card\">\n <div class=\"stat-label\">Cron</div>\n <div class=\"stat-value\">\n ${props.cronEnabled == null\n ? \"n/a\"\n : props.cronEnabled\n ? \"Enabled\"\n : \"Disabled\"}\n </div>\n <div class=\"muted\">Next wake ${formatNextRun(props.cronNext)}</div>\n </div>\n </section>\n\n <section class=\"card\" style=\"margin-top: 18px;\">\n <div class=\"card-title\">Notes</div>\n <div class=\"card-sub\">Quick reminders for remote control setups.</div>\n <div class=\"note-grid\" style=\"margin-top: 14px;\">\n <div>\n <div class=\"note-title\">Tailscale serve</div>\n <div class=\"muted\">\n Prefer serve mode to keep the gateway on loopback with tailnet auth.\n </div>\n </div>\n <div>\n <div class=\"note-title\">Session hygiene</div>\n <div class=\"muted\">Use /new or sessions.patch to reset context.</div>\n </div>\n <div>\n <div class=\"note-title\">Cron reminders</div>\n <div class=\"muted\">Use isolated sessions for recurring runs.</div>\n </div>\n </div>\n </section>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { formatAgo } from \"../format\";\nimport { formatSessionTokens } from \"../presenter\";\nimport type { GatewaySessionRow, SessionsListResult } from \"../types\";\n\nexport type SessionsProps = {\n loading: boolean;\n result: SessionsListResult | null;\n error: string | null;\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n onFiltersChange: (next: {\n activeMinutes: string;\n limit: string;\n includeGlobal: boolean;\n includeUnknown: boolean;\n }) => void;\n onRefresh: () => void;\n onPatch: (\n key: string,\n patch: { thinkingLevel?: string | null; verboseLevel?: string | null },\n ) => void;\n};\n\nconst THINK_LEVELS = [\"\", \"off\", \"minimal\", \"low\", \"medium\", \"high\"] as const;\nconst VERBOSE_LEVELS = [\"\", \"off\", \"on\"] as const;\n\nexport function renderSessions(props: SessionsProps) {\n const rows = props.result?.sessions ?? [];\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Sessions</div>\n <div class=\"card-sub\">Active session keys and per-session overrides.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\">\n <span>Active within (minutes)</span>\n <input\n .value=${props.activeMinutes}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: (e.target as HTMLInputElement).value,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field\">\n <span>Limit</span>\n <input\n .value=${props.limit}\n @input=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: (e.target as HTMLInputElement).value,\n includeGlobal: props.includeGlobal,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Include global</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeGlobal}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: (e.target as HTMLInputElement).checked,\n includeUnknown: props.includeUnknown,\n })}\n />\n </label>\n <label class=\"field checkbox\">\n <span>Include unknown</span>\n <input\n type=\"checkbox\"\n .checked=${props.includeUnknown}\n @change=${(e: Event) =>\n props.onFiltersChange({\n activeMinutes: props.activeMinutes,\n limit: props.limit,\n includeGlobal: props.includeGlobal,\n includeUnknown: (e.target as HTMLInputElement).checked,\n })}\n />\n </label>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n <div class=\"muted\" style=\"margin-top: 12px;\">\n ${props.result ? `Store: ${props.result.path}` : \"\"}\n </div>\n\n <div class=\"table\" style=\"margin-top: 16px;\">\n <div class=\"table-head\">\n <div>Key</div>\n <div>Kind</div>\n <div>Updated</div>\n <div>Tokens</div>\n <div>Thinking</div>\n <div>Verbose</div>\n </div>\n ${rows.length === 0\n ? html`<div class=\"muted\">No sessions found.</div>`\n : rows.map((row) => renderRow(row, props.onPatch))}\n </div>\n </section>\n `;\n}\n\nfunction renderRow(row: GatewaySessionRow, onPatch: SessionsProps[\"onPatch\"]) {\n const updated = row.updatedAt ? formatAgo(row.updatedAt) : \"n/a\";\n const thinking = row.thinkingLevel ?? \"\";\n const verbose = row.verboseLevel ?? \"\";\n return html`\n <div class=\"table-row\">\n <div class=\"mono\">${row.displayName ?? row.key}</div>\n <div>${row.kind}</div>\n <div>${updated}</div>\n <div>${formatSessionTokens(row)}</div>\n <div>\n <select\n .value=${thinking}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { thinkingLevel: value || null });\n }}\n >\n ${THINK_LEVELS.map((level) =>\n html`<option value=${level}>${level || \"inherit\"}</option>`,\n )}\n </select>\n </div>\n <div>\n <select\n .value=${verbose}\n @change=${(e: Event) => {\n const value = (e.target as HTMLSelectElement).value;\n onPatch(row.key, { verboseLevel: value || null });\n }}\n >\n ${VERBOSE_LEVELS.map((level) =>\n html`<option value=${level}>${level || \"inherit\"}</option>`,\n )}\n </select>\n </div>\n </div>\n `;\n}\n","import { html, nothing } from \"lit\";\n\nimport { clampText } from \"../format\";\nimport type { SkillStatusEntry, SkillStatusReport } from \"../types\";\n\nexport type SkillsProps = {\n loading: boolean;\n report: SkillStatusReport | null;\n error: string | null;\n filter: string;\n edits: Record<string, string>;\n busyKey: string | null;\n onFilterChange: (next: string) => void;\n onRefresh: () => void;\n onToggle: (skillKey: string, enabled: boolean) => void;\n onEdit: (skillKey: string, value: string) => void;\n onSaveKey: (skillKey: string) => void;\n onInstall: (name: string, installId: string) => void;\n};\n\nexport function renderSkills(props: SkillsProps) {\n const skills = props.report?.skills ?? [];\n const filter = props.filter.trim().toLowerCase();\n const filtered = filter\n ? skills.filter((skill) =>\n [skill.name, skill.description, skill.source]\n .join(\" \")\n .toLowerCase()\n .includes(filter),\n )\n : skills;\n\n return html`\n <section class=\"card\">\n <div class=\"row\" style=\"justify-content: space-between;\">\n <div>\n <div class=\"card-title\">Skills</div>\n <div class=\"card-sub\">Bundled, managed, and workspace skills.</div>\n </div>\n <button class=\"btn\" ?disabled=${props.loading} @click=${props.onRefresh}>\n ${props.loading ? \"Loading…\" : \"Refresh\"}\n </button>\n </div>\n\n <div class=\"filters\" style=\"margin-top: 14px;\">\n <label class=\"field\" style=\"flex: 1;\">\n <span>Filter</span>\n <input\n .value=${props.filter}\n @input=${(e: Event) =>\n props.onFilterChange((e.target as HTMLInputElement).value)}\n placeholder=\"Search skills\"\n />\n </label>\n <div class=\"muted\">${filtered.length} shown</div>\n </div>\n\n ${props.error\n ? html`<div class=\"callout danger\" style=\"margin-top: 12px;\">${props.error}</div>`\n : nothing}\n\n ${filtered.length === 0\n ? html`<div class=\"muted\" style=\"margin-top: 16px;\">No skills found.</div>`\n : html`\n <div class=\"list\" style=\"margin-top: 16px;\">\n ${filtered.map((skill) => renderSkill(skill, props))}\n </div>\n `}\n </section>\n `;\n}\n\nfunction renderSkill(skill: SkillStatusEntry, props: SkillsProps) {\n const busy = props.busyKey === skill.skillKey || props.busyKey === skill.name;\n const apiKey = props.edits[skill.skillKey] ?? \"\";\n const missing = [\n ...skill.missing.bins.map((b) => `bin:${b}`),\n ...skill.missing.env.map((e) => `env:${e}`),\n ...skill.missing.config.map((c) => `config:${c}`),\n ...skill.missing.os.map((o) => `os:${o}`),\n ];\n const reasons: string[] = [];\n if (skill.disabled) reasons.push(\"disabled\");\n if (skill.blockedByAllowlist) reasons.push(\"blocked by allowlist\");\n return html`\n <div class=\"list-item\">\n <div class=\"list-main\">\n <div class=\"list-title\">\n ${skill.emoji ? `${skill.emoji} ` : \"\"}${skill.name}\n </div>\n <div class=\"list-sub\">${clampText(skill.description, 140)}</div>\n <div class=\"chip-row\" style=\"margin-top: 6px;\">\n <span class=\"chip\">${skill.source}</span>\n <span class=\"chip ${skill.eligible ? \"chip-ok\" : \"chip-warn\"}\">\n ${skill.eligible ? \"eligible\" : \"blocked\"}\n </span>\n ${skill.disabled ? html`<span class=\"chip chip-warn\">disabled</span>` : nothing}\n </div>\n ${missing.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Missing: ${missing.join(\", \")}\n </div>\n `\n : nothing}\n ${reasons.length > 0\n ? html`\n <div class=\"muted\" style=\"margin-top: 6px;\">\n Reason: ${reasons.join(\", \")}\n </div>\n `\n : nothing}\n </div>\n <div class=\"list-meta\">\n <div class=\"row\" style=\"justify-content: flex-end; flex-wrap: wrap;\">\n <button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() => props.onToggle(skill.skillKey, skill.disabled)}\n >\n ${skill.disabled ? \"Enable\" : \"Disable\"}\n </button>\n ${skill.install.length > 0\n ? html`<button\n class=\"btn\"\n ?disabled=${busy}\n @click=${() => props.onInstall(skill.name, skill.install[0].id)}\n >\n ${skill.install[0].label}\n </button>`\n : nothing}\n </div>\n ${skill.primaryEnv\n ? html`\n <div class=\"field\" style=\"margin-top: 10px;\">\n <span>API key</span>\n <input\n type=\"password\"\n .value=${apiKey}\n @input=${(e: Event) =>\n props.onEdit(skill.skillKey, (e.target as HTMLInputElement).value)}\n />\n </div>\n <button\n class=\"btn primary\"\n style=\"margin-top: 8px;\"\n ?disabled=${busy}\n @click=${() => props.onSaveKey(skill.skillKey)}\n >\n Save key\n </button>\n `\n : nothing}\n </div>\n </div>\n `;\n}\n","export type TelegramForm = {\n token: string;\n requireMention: boolean;\n allowFrom: string;\n proxy: string;\n webhookUrl: string;\n webhookSecret: string;\n webhookPath: string;\n};\n\nexport type DiscordForm = {\n enabled: boolean;\n token: string;\n dmEnabled: boolean;\n allowFrom: string;\n groupEnabled: boolean;\n groupChannels: string;\n mediaMaxMb: string;\n historyLimit: string;\n textChunkLimit: string;\n replyToMode: \"off\" | \"first\" | \"all\";\n guilds: DiscordGuildForm[];\n actions: DiscordActionForm;\n slashEnabled: boolean;\n slashName: string;\n slashSessionPrefix: string;\n slashEphemeral: boolean;\n};\n\nexport type DiscordGuildForm = {\n key: string;\n slug: string;\n requireMention: boolean;\n reactionNotifications: \"off\" | \"own\" | \"all\" | \"allowlist\";\n users: string;\n channels: DiscordGuildChannelForm[];\n};\n\nexport type DiscordGuildChannelForm = {\n key: string;\n allow: boolean;\n requireMention: boolean;\n};\n\nexport type DiscordActionForm = {\n reactions: boolean;\n stickers: boolean;\n polls: boolean;\n permissions: boolean;\n messages: boolean;\n threads: boolean;\n pins: boolean;\n search: boolean;\n memberInfo: boolean;\n roleInfo: boolean;\n channelInfo: boolean;\n voiceStatus: boolean;\n events: boolean;\n roles: boolean;\n moderation: boolean;\n};\n\nexport type SlackChannelForm = {\n key: string;\n allow: boolean;\n requireMention: boolean;\n};\n\nexport type SlackActionForm = {\n reactions: boolean;\n messages: boolean;\n pins: boolean;\n memberInfo: boolean;\n emojiList: boolean;\n};\n\nexport type SlackForm = {\n enabled: boolean;\n botToken: string;\n appToken: string;\n dmEnabled: boolean;\n allowFrom: string;\n groupEnabled: boolean;\n groupChannels: string;\n mediaMaxMb: string;\n textChunkLimit: string;\n reactionNotifications: \"off\" | \"own\" | \"all\" | \"allowlist\";\n reactionAllowlist: string;\n slashEnabled: boolean;\n slashName: string;\n slashSessionPrefix: string;\n slashEphemeral: boolean;\n actions: SlackActionForm;\n channels: SlackChannelForm[];\n};\n\nexport const defaultDiscordActions: DiscordActionForm = {\n reactions: true,\n stickers: true,\n polls: true,\n permissions: true,\n messages: true,\n threads: true,\n pins: true,\n search: true,\n memberInfo: true,\n roleInfo: true,\n channelInfo: true,\n voiceStatus: true,\n events: true,\n roles: false,\n moderation: false,\n};\n\nexport const defaultSlackActions: SlackActionForm = {\n reactions: true,\n messages: true,\n pins: true,\n memberInfo: true,\n emojiList: true,\n};\n\nexport type SignalForm = {\n enabled: boolean;\n account: string;\n httpUrl: string;\n httpHost: string;\n httpPort: string;\n cliPath: string;\n autoStart: boolean;\n receiveMode: \"on-start\" | \"manual\" | \"\";\n ignoreAttachments: boolean;\n ignoreStories: boolean;\n sendReadReceipts: boolean;\n allowFrom: string;\n mediaMaxMb: string;\n};\n\nexport type IMessageForm = {\n enabled: boolean;\n cliPath: string;\n dbPath: string;\n service: \"auto\" | \"imessage\" | \"sms\";\n region: string;\n allowFrom: string;\n includeAttachments: boolean;\n mediaMaxMb: string;\n};\n\nexport type CronFormState = {\n name: string;\n description: string;\n enabled: boolean;\n scheduleKind: \"at\" | \"every\" | \"cron\";\n scheduleAt: string;\n everyAmount: string;\n everyUnit: \"minutes\" | \"hours\" | \"days\";\n cronExpr: string;\n cronTz: string;\n sessionTarget: \"main\" | \"isolated\";\n wakeMode: \"next-heartbeat\" | \"now\";\n payloadKind: \"systemEvent\" | \"agentTurn\";\n payloadText: string;\n deliver: boolean;\n channel: \"last\" | \"whatsapp\" | \"telegram\";\n to: string;\n timeoutSeconds: string;\n postToMainPrefix: string;\n};\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { parseList } from \"../format\";\nimport type { ConfigSnapshot, ProvidersStatusSnapshot } from \"../types\";\nimport {\n defaultDiscordActions,\n defaultSlackActions,\n type DiscordActionForm,\n type DiscordForm,\n type DiscordGuildChannelForm,\n type DiscordGuildForm,\n type IMessageForm,\n type SlackActionForm,\n type SlackForm,\n type SignalForm,\n type TelegramForm,\n} from \"../ui-types\";\n\nexport type ConnectionsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n providersLoading: boolean;\n providersSnapshot: ProvidersStatusSnapshot | null;\n providersError: string | null;\n providersLastSuccess: number | null;\n whatsappLoginMessage: string | null;\n whatsappLoginQrDataUrl: string | null;\n whatsappLoginConnected: boolean | null;\n whatsappBusy: boolean;\n telegramForm: TelegramForm;\n telegramSaving: boolean;\n telegramTokenLocked: boolean;\n telegramConfigStatus: string | null;\n discordForm: DiscordForm;\n discordSaving: boolean;\n discordTokenLocked: boolean;\n discordConfigStatus: string | null;\n slackForm: SlackForm;\n slackSaving: boolean;\n slackTokenLocked: boolean;\n slackAppTokenLocked: boolean;\n slackConfigStatus: string | null;\n signalForm: SignalForm;\n signalSaving: boolean;\n signalConfigStatus: string | null;\n imessageForm: IMessageForm;\n imessageSaving: boolean;\n imessageConfigStatus: string | null;\n configSnapshot: ConfigSnapshot | null;\n};\n\nexport async function loadProviders(state: ConnectionsState, probe: boolean) {\n if (!state.client || !state.connected) return;\n if (state.providersLoading) return;\n state.providersLoading = true;\n state.providersError = null;\n try {\n const res = (await state.client.request(\"providers.status\", {\n probe,\n timeoutMs: 8000,\n })) as ProvidersStatusSnapshot;\n state.providersSnapshot = res;\n state.providersLastSuccess = Date.now();\n state.telegramTokenLocked = res.telegram.tokenSource === \"env\";\n state.discordTokenLocked = res.discord?.tokenSource === \"env\";\n state.slackTokenLocked = res.slack?.botTokenSource === \"env\";\n state.slackAppTokenLocked = res.slack?.appTokenSource === \"env\";\n } catch (err) {\n state.providersError = String(err);\n } finally {\n state.providersLoading = false;\n }\n}\n\nexport async function startWhatsAppLogin(state: ConnectionsState, force: boolean) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.start\", {\n force,\n timeoutMs: 30000,\n })) as { message?: string; qrDataUrl?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginQrDataUrl = res.qrDataUrl ?? null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function waitWhatsAppLogin(state: ConnectionsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n const res = (await state.client.request(\"web.login.wait\", {\n timeoutMs: 120000,\n })) as { connected?: boolean; message?: string };\n state.whatsappLoginMessage = res.message ?? null;\n state.whatsappLoginConnected = res.connected ?? null;\n if (res.connected) state.whatsappLoginQrDataUrl = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n state.whatsappLoginConnected = null;\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport async function logoutWhatsApp(state: ConnectionsState) {\n if (!state.client || !state.connected || state.whatsappBusy) return;\n state.whatsappBusy = true;\n try {\n await state.client.request(\"web.logout\", {});\n state.whatsappLoginMessage = \"Logged out.\";\n state.whatsappLoginQrDataUrl = null;\n state.whatsappLoginConnected = null;\n } catch (err) {\n state.whatsappLoginMessage = String(err);\n } finally {\n state.whatsappBusy = false;\n }\n}\n\nexport function updateTelegramForm(\n state: ConnectionsState,\n patch: Partial<TelegramForm>,\n) {\n state.telegramForm = { ...state.telegramForm, ...patch };\n}\n\nexport function updateDiscordForm(\n state: ConnectionsState,\n patch: Partial<DiscordForm>,\n) {\n if (patch.actions) {\n state.discordForm = {\n ...state.discordForm,\n ...patch,\n actions: { ...state.discordForm.actions, ...patch.actions },\n };\n return;\n }\n state.discordForm = { ...state.discordForm, ...patch };\n}\n\nexport function updateSlackForm(\n state: ConnectionsState,\n patch: Partial<SlackForm>,\n) {\n if (patch.actions) {\n state.slackForm = {\n ...state.slackForm,\n ...patch,\n actions: { ...state.slackForm.actions, ...patch.actions },\n };\n return;\n }\n state.slackForm = { ...state.slackForm, ...patch };\n}\n\nexport function updateSignalForm(\n state: ConnectionsState,\n patch: Partial<SignalForm>,\n) {\n state.signalForm = { ...state.signalForm, ...patch };\n}\n\nexport function updateIMessageForm(\n state: ConnectionsState,\n patch: Partial<IMessageForm>,\n) {\n state.imessageForm = { ...state.imessageForm, ...patch };\n}\n\nexport async function saveTelegramConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.telegramSaving) return;\n state.telegramSaving = true;\n state.telegramConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const telegram = { ...(config.telegram ?? {}) } as Record<string, unknown>;\n if (!state.telegramTokenLocked) {\n const token = state.telegramForm.token.trim();\n if (token) telegram.botToken = token;\n else delete telegram.botToken;\n }\n const groups =\n telegram.groups && typeof telegram.groups === \"object\"\n ? ({ ...(telegram.groups as Record<string, unknown>) } as Record<\n string,\n unknown\n >)\n : {};\n const defaultGroup =\n groups[\"*\"] && typeof groups[\"*\"] === \"object\"\n ? ({ ...(groups[\"*\"] as Record<string, unknown>) } as Record<\n string,\n unknown\n >)\n : {};\n defaultGroup.requireMention = state.telegramForm.requireMention;\n groups[\"*\"] = defaultGroup;\n telegram.groups = groups;\n delete telegram.requireMention;\n const allowFrom = parseList(state.telegramForm.allowFrom);\n if (allowFrom.length > 0) telegram.allowFrom = allowFrom;\n else delete telegram.allowFrom;\n const proxy = state.telegramForm.proxy.trim();\n if (proxy) telegram.proxy = proxy;\n else delete telegram.proxy;\n const webhookUrl = state.telegramForm.webhookUrl.trim();\n if (webhookUrl) telegram.webhookUrl = webhookUrl;\n else delete telegram.webhookUrl;\n const webhookSecret = state.telegramForm.webhookSecret.trim();\n if (webhookSecret) telegram.webhookSecret = webhookSecret;\n else delete telegram.webhookSecret;\n const webhookPath = state.telegramForm.webhookPath.trim();\n if (webhookPath) telegram.webhookPath = webhookPath;\n else delete telegram.webhookPath;\n\n config.telegram = telegram;\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.telegramConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.telegramConfigStatus = String(err);\n } finally {\n state.telegramSaving = false;\n }\n}\n\nexport async function saveDiscordConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.discordSaving) return;\n state.discordSaving = true;\n state.discordConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const discord = { ...(config.discord ?? {}) } as Record<string, unknown>;\n const form = state.discordForm;\n\n if (form.enabled) {\n delete discord.enabled;\n } else {\n discord.enabled = false;\n }\n\n if (!state.discordTokenLocked) {\n const token = form.token.trim();\n if (token) discord.token = token;\n else delete discord.token;\n }\n\n const allowFrom = parseList(form.allowFrom);\n const groupChannels = parseList(form.groupChannels);\n const dm = { ...(discord.dm ?? {}) } as Record<string, unknown>;\n if (form.dmEnabled) delete dm.enabled;\n else dm.enabled = false;\n if (allowFrom.length > 0) dm.allowFrom = allowFrom;\n else delete dm.allowFrom;\n if (form.groupEnabled) dm.groupEnabled = true;\n else delete dm.groupEnabled;\n if (groupChannels.length > 0) dm.groupChannels = groupChannels;\n else delete dm.groupChannels;\n if (Object.keys(dm).length > 0) discord.dm = dm;\n else delete discord.dm;\n\n const mediaMaxMb = Number(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n discord.mediaMaxMb = mediaMaxMb;\n } else {\n delete discord.mediaMaxMb;\n }\n\n const historyLimitRaw = form.historyLimit.trim();\n if (historyLimitRaw.length === 0) {\n delete discord.historyLimit;\n } else {\n const historyLimit = Number(historyLimitRaw);\n if (Number.isFinite(historyLimit) && historyLimit >= 0) {\n discord.historyLimit = historyLimit;\n } else {\n delete discord.historyLimit;\n }\n }\n\n const chunkLimitRaw = form.textChunkLimit.trim();\n if (chunkLimitRaw.length === 0) {\n delete discord.textChunkLimit;\n } else {\n const chunkLimit = Number(chunkLimitRaw);\n if (Number.isFinite(chunkLimit) && chunkLimit > 0) {\n discord.textChunkLimit = chunkLimit;\n } else {\n delete discord.textChunkLimit;\n }\n }\n\n if (form.replyToMode === \"off\") {\n delete discord.replyToMode;\n } else {\n discord.replyToMode = form.replyToMode;\n }\n\n const guildsForm = Array.isArray(form.guilds) ? form.guilds : [];\n const guilds: Record<string, unknown> = {};\n guildsForm.forEach((guild: DiscordGuildForm) => {\n const key = String(guild.key ?? \"\").trim();\n if (!key) return;\n const entry: Record<string, unknown> = {};\n const slug = String(guild.slug ?? \"\").trim();\n if (slug) entry.slug = slug;\n if (guild.requireMention) entry.requireMention = true;\n if (\n guild.reactionNotifications === \"off\" ||\n guild.reactionNotifications === \"all\" ||\n guild.reactionNotifications === \"own\" ||\n guild.reactionNotifications === \"allowlist\"\n ) {\n entry.reactionNotifications = guild.reactionNotifications;\n }\n const users = parseList(guild.users);\n if (users.length > 0) entry.users = users;\n const channels: Record<string, unknown> = {};\n const channelForms = Array.isArray(guild.channels) ? guild.channels : [];\n channelForms.forEach((channel: DiscordGuildChannelForm) => {\n const channelKey = String(channel.key ?? \"\").trim();\n if (!channelKey) return;\n const channelEntry: Record<string, unknown> = {};\n if (channel.allow === false) channelEntry.allow = false;\n if (channel.requireMention) channelEntry.requireMention = true;\n channels[channelKey] = channelEntry;\n });\n if (Object.keys(channels).length > 0) entry.channels = channels;\n guilds[key] = entry;\n });\n if (Object.keys(guilds).length > 0) discord.guilds = guilds;\n else delete discord.guilds;\n\n const actions: Partial<DiscordActionForm> = {};\n const applyAction = (key: keyof DiscordActionForm) => {\n const value = form.actions[key];\n if (value !== defaultDiscordActions[key]) actions[key] = value;\n };\n applyAction(\"reactions\");\n applyAction(\"stickers\");\n applyAction(\"polls\");\n applyAction(\"permissions\");\n applyAction(\"messages\");\n applyAction(\"threads\");\n applyAction(\"pins\");\n applyAction(\"search\");\n applyAction(\"memberInfo\");\n applyAction(\"roleInfo\");\n applyAction(\"channelInfo\");\n applyAction(\"voiceStatus\");\n applyAction(\"events\");\n applyAction(\"roles\");\n applyAction(\"moderation\");\n if (Object.keys(actions).length > 0) {\n discord.actions = actions;\n } else {\n delete discord.actions;\n }\n\n const slash = { ...(discord.slashCommand ?? {}) } as Record<string, unknown>;\n if (form.slashEnabled) {\n slash.enabled = true;\n } else {\n delete slash.enabled;\n }\n if (form.slashName.trim()) slash.name = form.slashName.trim();\n else delete slash.name;\n if (form.slashSessionPrefix.trim())\n slash.sessionPrefix = form.slashSessionPrefix.trim();\n else delete slash.sessionPrefix;\n if (form.slashEphemeral) {\n delete slash.ephemeral;\n } else {\n slash.ephemeral = false;\n }\n if (Object.keys(slash).length > 0) discord.slashCommand = slash;\n else delete discord.slashCommand;\n\n if (Object.keys(discord).length > 0) {\n config.discord = discord;\n } else {\n delete config.discord;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.discordConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.discordConfigStatus = String(err);\n } finally {\n state.discordSaving = false;\n }\n}\n\nexport async function saveSlackConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.slackSaving) return;\n state.slackSaving = true;\n state.slackConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const slack = { ...(config.slack ?? {}) } as Record<string, unknown>;\n const form = state.slackForm;\n\n if (form.enabled) {\n delete slack.enabled;\n } else {\n slack.enabled = false;\n }\n\n if (!state.slackTokenLocked) {\n const token = form.botToken.trim();\n if (token) slack.botToken = token;\n else delete slack.botToken;\n }\n if (!state.slackAppTokenLocked) {\n const token = form.appToken.trim();\n if (token) slack.appToken = token;\n else delete slack.appToken;\n }\n\n const dm = { ...(slack.dm ?? {}) } as Record<string, unknown>;\n dm.enabled = form.dmEnabled;\n const allowFrom = parseList(form.allowFrom);\n if (allowFrom.length > 0) dm.allowFrom = allowFrom;\n else delete dm.allowFrom;\n if (form.groupEnabled) {\n dm.groupEnabled = true;\n } else {\n delete dm.groupEnabled;\n }\n const groupChannels = parseList(form.groupChannels);\n if (groupChannels.length > 0) dm.groupChannels = groupChannels;\n else delete dm.groupChannels;\n if (Object.keys(dm).length > 0) slack.dm = dm;\n else delete slack.dm;\n\n const mediaMaxMb = Number.parseFloat(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n slack.mediaMaxMb = mediaMaxMb;\n } else {\n delete slack.mediaMaxMb;\n }\n\n const textChunkLimit = Number.parseInt(form.textChunkLimit, 10);\n if (Number.isFinite(textChunkLimit) && textChunkLimit > 0) {\n slack.textChunkLimit = textChunkLimit;\n } else {\n delete slack.textChunkLimit;\n }\n\n if (form.reactionNotifications === \"own\") {\n delete slack.reactionNotifications;\n } else {\n slack.reactionNotifications = form.reactionNotifications;\n }\n const reactionAllowlist = parseList(form.reactionAllowlist);\n if (reactionAllowlist.length > 0) {\n slack.reactionAllowlist = reactionAllowlist;\n } else {\n delete slack.reactionAllowlist;\n }\n\n const slash = { ...(slack.slashCommand ?? {}) } as Record<string, unknown>;\n if (form.slashEnabled) {\n slash.enabled = true;\n } else {\n delete slash.enabled;\n }\n if (form.slashName.trim()) slash.name = form.slashName.trim();\n else delete slash.name;\n if (form.slashSessionPrefix.trim())\n slash.sessionPrefix = form.slashSessionPrefix.trim();\n else delete slash.sessionPrefix;\n if (form.slashEphemeral) {\n delete slash.ephemeral;\n } else {\n slash.ephemeral = false;\n }\n if (Object.keys(slash).length > 0) slack.slashCommand = slash;\n else delete slack.slashCommand;\n\n const actions: Partial<SlackActionForm> = {};\n const applyAction = (key: keyof SlackActionForm) => {\n const value = form.actions[key];\n if (value !== defaultSlackActions[key]) actions[key] = value;\n };\n applyAction(\"reactions\");\n applyAction(\"messages\");\n applyAction(\"pins\");\n applyAction(\"memberInfo\");\n applyAction(\"emojiList\");\n if (Object.keys(actions).length > 0) {\n slack.actions = actions;\n } else {\n delete slack.actions;\n }\n\n const channels = form.channels\n .map((entry): [string, Record<string, unknown>] | null => {\n const key = entry.key.trim();\n if (!key) return null;\n const record: Record<string, unknown> = {\n allow: entry.allow,\n requireMention: entry.requireMention,\n };\n return [key, record];\n })\n .filter((value): value is [string, Record<string, unknown>] => Boolean(value));\n if (channels.length > 0) {\n slack.channels = Object.fromEntries(channels);\n } else {\n delete slack.channels;\n }\n\n if (Object.keys(slack).length > 0) {\n config.slack = slack;\n } else {\n delete config.slack;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.slackConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.slackConfigStatus = String(err);\n } finally {\n state.slackSaving = false;\n }\n}\n\nexport async function saveSignalConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.signalSaving) return;\n state.signalSaving = true;\n state.signalConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const signal = { ...(config.signal ?? {}) } as Record<string, unknown>;\n const form = state.signalForm;\n\n if (form.enabled) {\n delete signal.enabled;\n } else {\n signal.enabled = false;\n }\n\n const account = form.account.trim();\n if (account) signal.account = account;\n else delete signal.account;\n\n const httpUrl = form.httpUrl.trim();\n if (httpUrl) signal.httpUrl = httpUrl;\n else delete signal.httpUrl;\n\n const httpHost = form.httpHost.trim();\n if (httpHost) signal.httpHost = httpHost;\n else delete signal.httpHost;\n\n const httpPort = Number(form.httpPort);\n if (Number.isFinite(httpPort) && httpPort > 0) {\n signal.httpPort = httpPort;\n } else {\n delete signal.httpPort;\n }\n\n const cliPath = form.cliPath.trim();\n if (cliPath) signal.cliPath = cliPath;\n else delete signal.cliPath;\n\n if (form.autoStart) {\n delete signal.autoStart;\n } else {\n signal.autoStart = false;\n }\n\n if (form.receiveMode === \"on-start\" || form.receiveMode === \"manual\") {\n signal.receiveMode = form.receiveMode;\n } else {\n delete signal.receiveMode;\n }\n\n if (form.ignoreAttachments) signal.ignoreAttachments = true;\n else delete signal.ignoreAttachments;\n if (form.ignoreStories) signal.ignoreStories = true;\n else delete signal.ignoreStories;\n if (form.sendReadReceipts) signal.sendReadReceipts = true;\n else delete signal.sendReadReceipts;\n\n const allowFrom = parseList(form.allowFrom);\n if (allowFrom.length > 0) signal.allowFrom = allowFrom;\n else delete signal.allowFrom;\n\n const mediaMaxMb = Number(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n signal.mediaMaxMb = mediaMaxMb;\n } else {\n delete signal.mediaMaxMb;\n }\n\n if (Object.keys(signal).length > 0) {\n config.signal = signal;\n } else {\n delete config.signal;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.signalConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.signalConfigStatus = String(err);\n } finally {\n state.signalSaving = false;\n }\n}\n\nexport async function saveIMessageConfig(state: ConnectionsState) {\n if (!state.client || !state.connected) return;\n if (state.imessageSaving) return;\n state.imessageSaving = true;\n state.imessageConfigStatus = null;\n try {\n const base = state.configSnapshot?.config ?? {};\n const config = { ...base } as Record<string, unknown>;\n const imessage = { ...(config.imessage ?? {}) } as Record<string, unknown>;\n const form = state.imessageForm;\n\n if (form.enabled) {\n delete imessage.enabled;\n } else {\n imessage.enabled = false;\n }\n\n const cliPath = form.cliPath.trim();\n if (cliPath) imessage.cliPath = cliPath;\n else delete imessage.cliPath;\n\n const dbPath = form.dbPath.trim();\n if (dbPath) imessage.dbPath = dbPath;\n else delete imessage.dbPath;\n\n if (form.service === \"auto\") {\n delete imessage.service;\n } else {\n imessage.service = form.service;\n }\n\n const region = form.region.trim();\n if (region) imessage.region = region;\n else delete imessage.region;\n\n const allowFrom = parseList(form.allowFrom);\n if (allowFrom.length > 0) imessage.allowFrom = allowFrom;\n else delete imessage.allowFrom;\n\n if (form.includeAttachments) imessage.includeAttachments = true;\n else delete imessage.includeAttachments;\n\n const mediaMaxMb = Number(form.mediaMaxMb);\n if (Number.isFinite(mediaMaxMb) && mediaMaxMb > 0) {\n imessage.mediaMaxMb = mediaMaxMb;\n } else {\n delete imessage.mediaMaxMb;\n }\n\n if (Object.keys(imessage).length > 0) {\n config.imessage = imessage;\n } else {\n delete config.imessage;\n }\n\n const raw = `${JSON.stringify(config, null, 2).trimEnd()}\\n`;\n await state.client.request(\"config.set\", { raw });\n state.imessageConfigStatus = \"Saved. Restart gateway if needed.\";\n } catch (err) {\n state.imessageConfigStatus = String(err);\n } finally {\n state.imessageSaving = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { PresenceEntry } from \"../types\";\n\nexport type PresenceState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n presenceLoading: boolean;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: string | null;\n};\n\nexport async function loadPresence(state: PresenceState) {\n if (!state.client || !state.connected) return;\n if (state.presenceLoading) return;\n state.presenceLoading = true;\n state.presenceError = null;\n state.presenceStatus = null;\n try {\n const res = (await state.client.request(\"system-presence\", {})) as\n | PresenceEntry[]\n | undefined;\n if (Array.isArray(res)) {\n state.presenceEntries = res;\n state.presenceStatus = res.length === 0 ? \"No instances yet.\" : null;\n } else {\n state.presenceEntries = [];\n state.presenceStatus = \"No presence payload.\";\n }\n } catch (err) {\n state.presenceError = String(err);\n } finally {\n state.presenceLoading = false;\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { toNumber } from \"../format\";\nimport type { SessionsListResult } from \"../types\";\n\nexport type SessionsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionsLoading: boolean;\n sessionsResult: SessionsListResult | null;\n sessionsError: string | null;\n sessionsFilterActive: string;\n sessionsFilterLimit: string;\n sessionsIncludeGlobal: boolean;\n sessionsIncludeUnknown: boolean;\n};\n\nexport async function loadSessions(state: SessionsState) {\n if (!state.client || !state.connected) return;\n if (state.sessionsLoading) return;\n state.sessionsLoading = true;\n state.sessionsError = null;\n try {\n const params: Record<string, unknown> = {\n includeGlobal: state.sessionsIncludeGlobal,\n includeUnknown: state.sessionsIncludeUnknown,\n };\n const activeMinutes = toNumber(state.sessionsFilterActive, 0);\n const limit = toNumber(state.sessionsFilterLimit, 0);\n if (activeMinutes > 0) params.activeMinutes = activeMinutes;\n if (limit > 0) params.limit = limit;\n const res = (await state.client.request(\"sessions.list\", params)) as\n | SessionsListResult\n | undefined;\n if (res) state.sessionsResult = res;\n } catch (err) {\n state.sessionsError = String(err);\n } finally {\n state.sessionsLoading = false;\n }\n}\n\nexport async function patchSession(\n state: SessionsState,\n key: string,\n patch: { thinkingLevel?: string | null; verboseLevel?: string | null },\n) {\n if (!state.client || !state.connected) return;\n const params: Record<string, unknown> = { key };\n if (\"thinkingLevel\" in patch) params.thinkingLevel = patch.thinkingLevel;\n if (\"verboseLevel\" in patch) params.verboseLevel = patch.verboseLevel;\n try {\n await state.client.request(\"sessions.patch\", params);\n await loadSessions(state);\n } catch (err) {\n state.sessionsError = String(err);\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { SkillStatusReport } from \"../types\";\n\nexport type SkillsState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n skillsLoading: boolean;\n skillsReport: SkillStatusReport | null;\n skillsError: string | null;\n skillsBusyKey: string | null;\n skillEdits: Record<string, string>;\n};\n\nexport async function loadSkills(state: SkillsState) {\n if (!state.client || !state.connected) return;\n if (state.skillsLoading) return;\n state.skillsLoading = true;\n state.skillsError = null;\n try {\n const res = (await state.client.request(\"skills.status\", {})) as\n | SkillStatusReport\n | undefined;\n if (res) state.skillsReport = res;\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsLoading = false;\n }\n}\n\nexport function updateSkillEdit(\n state: SkillsState,\n skillKey: string,\n value: string,\n) {\n state.skillEdits = { ...state.skillEdits, [skillKey]: value };\n}\n\nexport async function updateSkillEnabled(\n state: SkillsState,\n skillKey: string,\n enabled: boolean,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n await state.client.request(\"skills.update\", { skillKey, enabled });\n await loadSkills(state);\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function saveSkillApiKey(state: SkillsState, skillKey: string) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = skillKey;\n state.skillsError = null;\n try {\n const apiKey = state.skillEdits[skillKey] ?? \"\";\n await state.client.request(\"skills.update\", { skillKey, apiKey });\n await loadSkills(state);\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\nexport async function installSkill(\n state: SkillsState,\n name: string,\n installId: string,\n) {\n if (!state.client || !state.connected) return;\n state.skillsBusyKey = name;\n state.skillsError = null;\n try {\n await state.client.request(\"skills.install\", {\n name,\n installId,\n timeoutMs: 120000,\n });\n await loadSkills(state);\n } catch (err) {\n state.skillsError = String(err);\n } finally {\n state.skillsBusyKey = null;\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\n\nexport type NodesState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n nodesLoading: boolean;\n nodes: Array<Record<string, unknown>>;\n lastError: string | null;\n};\n\nexport async function loadNodes(\n state: NodesState,\n opts?: { quiet?: boolean },\n) {\n if (!state.client || !state.connected) return;\n if (state.nodesLoading) return;\n state.nodesLoading = true;\n if (!opts?.quiet) state.lastError = null;\n try {\n const res = (await state.client.request(\"node.list\", {})) as {\n nodes?: Array<Record<string, unknown>>;\n };\n state.nodes = Array.isArray(res.nodes) ? res.nodes : [];\n } catch (err) {\n if (!opts?.quiet) state.lastError = String(err);\n } finally {\n state.nodesLoading = false;\n }\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport { generateUUID } from \"../uuid\";\n\nexport type ChatState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n sessionKey: string;\n chatLoading: boolean;\n chatMessages: unknown[];\n chatThinkingLevel: string | null;\n chatSending: boolean;\n chatMessage: string;\n chatRunId: string | null;\n chatStream: string | null;\n lastError: string | null;\n};\n\nexport type ChatEventPayload = {\n runId: string;\n sessionKey: string;\n state: \"delta\" | \"final\" | \"aborted\" | \"error\";\n message?: unknown;\n errorMessage?: string;\n};\n\nexport async function loadChatHistory(state: ChatState) {\n if (!state.client || !state.connected) return;\n state.chatLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"chat.history\", {\n sessionKey: state.sessionKey,\n limit: 200,\n })) as { messages?: unknown[]; thinkingLevel?: string | null };\n state.chatMessages = Array.isArray(res.messages) ? res.messages : [];\n state.chatThinkingLevel = res.thinkingLevel ?? null;\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.chatLoading = false;\n }\n}\n\nexport async function sendChat(state: ChatState) {\n if (!state.client || !state.connected) return;\n const msg = state.chatMessage.trim();\n if (!msg) return;\n\n state.chatSending = true;\n state.chatMessage = \"\";\n state.lastError = null;\n const runId = generateUUID();\n state.chatRunId = runId;\n state.chatStream = \"\";\n try {\n await state.client.request(\"chat.send\", {\n sessionKey: state.sessionKey,\n message: msg,\n deliver: false,\n idempotencyKey: runId,\n });\n } catch (err) {\n state.chatRunId = null;\n state.chatStream = null;\n state.chatMessage = msg;\n state.lastError = String(err);\n } finally {\n state.chatSending = false;\n }\n}\n\nexport function handleChatEvent(\n state: ChatState,\n payload?: ChatEventPayload,\n) {\n if (!payload) return null;\n if (payload.sessionKey !== state.sessionKey) return null;\n if (payload.runId && state.chatRunId && payload.runId !== state.chatRunId)\n return null;\n\n if (payload.state === \"delta\") {\n state.chatStream = extractText(payload.message) ?? state.chatStream;\n } else if (payload.state === \"final\") {\n state.chatStream = null;\n state.chatRunId = null;\n } else if (payload.state === \"error\") {\n state.chatStream = null;\n state.chatRunId = null;\n state.lastError = payload.errorMessage ?? \"chat error\";\n }\n return payload.state;\n}\n\nfunction extractText(message: unknown): string | null {\n const m = message as Record<string, unknown>;\n const content = m.content;\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n const parts = content\n .map((p) => {\n const item = p as Record<string, unknown>;\n if (item.type === \"text\" && typeof item.text === \"string\") return item.text;\n return null;\n })\n .filter((v): v is string => typeof v === \"string\");\n if (parts.length > 0) return parts.join(\"\\n\");\n }\n if (typeof m.text === \"string\") return m.text;\n return null;\n}\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type {\n ConfigSchemaResponse,\n ConfigSnapshot,\n ConfigUiHints,\n} from \"../types\";\nimport {\n defaultDiscordActions,\n defaultSlackActions,\n type DiscordActionForm,\n type DiscordForm,\n type DiscordGuildChannelForm,\n type DiscordGuildForm,\n type IMessageForm,\n type SlackChannelForm,\n type SlackForm,\n type SignalForm,\n type TelegramForm,\n} from \"../ui-types\";\n\nexport type ConfigState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n configLoading: boolean;\n configRaw: string;\n configValid: boolean | null;\n configIssues: unknown[];\n configSaving: boolean;\n configSnapshot: ConfigSnapshot | null;\n configSchema: unknown | null;\n configSchemaVersion: string | null;\n configSchemaLoading: boolean;\n configUiHints: ConfigUiHints;\n configForm: Record<string, unknown> | null;\n configFormDirty: boolean;\n configFormMode: \"form\" | \"raw\";\n lastError: string | null;\n telegramForm: TelegramForm;\n discordForm: DiscordForm;\n slackForm: SlackForm;\n signalForm: SignalForm;\n imessageForm: IMessageForm;\n telegramConfigStatus: string | null;\n discordConfigStatus: string | null;\n slackConfigStatus: string | null;\n signalConfigStatus: string | null;\n imessageConfigStatus: string | null;\n};\n\nexport async function loadConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configLoading = true;\n state.lastError = null;\n try {\n const res = (await state.client.request(\"config.get\", {})) as ConfigSnapshot;\n applyConfigSnapshot(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configLoading = false;\n }\n}\n\nexport async function loadConfigSchema(state: ConfigState) {\n if (!state.client || !state.connected) return;\n if (state.configSchemaLoading) return;\n state.configSchemaLoading = true;\n try {\n const res = (await state.client.request(\n \"config.schema\",\n {},\n )) as ConfigSchemaResponse;\n applyConfigSchema(state, res);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSchemaLoading = false;\n }\n}\n\nexport function applyConfigSchema(\n state: ConfigState,\n res: ConfigSchemaResponse,\n) {\n state.configSchema = res.schema ?? null;\n state.configUiHints = res.uiHints ?? {};\n state.configSchemaVersion = res.version ?? null;\n}\n\nexport function applyConfigSnapshot(state: ConfigState, snapshot: ConfigSnapshot) {\n state.configSnapshot = snapshot;\n if (typeof snapshot.raw === \"string\") {\n state.configRaw = snapshot.raw;\n } else if (snapshot.config && typeof snapshot.config === \"object\") {\n state.configRaw = `${JSON.stringify(snapshot.config, null, 2).trimEnd()}\\n`;\n }\n state.configValid = typeof snapshot.valid === \"boolean\" ? snapshot.valid : null;\n state.configIssues = Array.isArray(snapshot.issues) ? snapshot.issues : [];\n\n const config = snapshot.config ?? {};\n const telegram = (config.telegram ?? {}) as Record<string, unknown>;\n const discord = (config.discord ?? {}) as Record<string, unknown>;\n const signal = (config.signal ?? {}) as Record<string, unknown>;\n const imessage = (config.imessage ?? {}) as Record<string, unknown>;\n const toList = (value: unknown) =>\n Array.isArray(value)\n ? value\n .map((v) => String(v ?? \"\").trim())\n .filter((v) => v.length > 0)\n .join(\", \")\n : \"\";\n const telegramGroups =\n telegram.groups && typeof telegram.groups === \"object\"\n ? (telegram.groups as Record<string, unknown>)\n : {};\n const telegramDefaultGroup =\n telegramGroups[\"*\"] && typeof telegramGroups[\"*\"] === \"object\"\n ? (telegramGroups[\"*\"] as Record<string, unknown>)\n : {};\n const allowFrom = Array.isArray(telegram.allowFrom)\n ? toList(telegram.allowFrom)\n : typeof telegram.allowFrom === \"string\"\n ? telegram.allowFrom\n : \"\";\n\n state.telegramForm = {\n token: typeof telegram.botToken === \"string\" ? telegram.botToken : \"\",\n requireMention:\n typeof telegramDefaultGroup.requireMention === \"boolean\"\n ? telegramDefaultGroup.requireMention\n : true,\n allowFrom,\n proxy: typeof telegram.proxy === \"string\" ? telegram.proxy : \"\",\n webhookUrl: typeof telegram.webhookUrl === \"string\" ? telegram.webhookUrl : \"\",\n webhookSecret:\n typeof telegram.webhookSecret === \"string\" ? telegram.webhookSecret : \"\",\n webhookPath: typeof telegram.webhookPath === \"string\" ? telegram.webhookPath : \"\",\n };\n\n const discordDm = (discord.dm ?? {}) as Record<string, unknown>;\n const slash = (discord.slashCommand ?? {}) as Record<string, unknown>;\n const discordActions = (discord.actions ?? {}) as Record<string, unknown>;\n const discordGuilds = discord.guilds;\n const readAction = (key: keyof DiscordActionForm) =>\n typeof discordActions[key] === \"boolean\"\n ? (discordActions[key] as boolean)\n : defaultDiscordActions[key];\n state.discordForm = {\n enabled: typeof discord.enabled === \"boolean\" ? discord.enabled : true,\n token: typeof discord.token === \"string\" ? discord.token : \"\",\n dmEnabled: typeof discordDm.enabled === \"boolean\" ? discordDm.enabled : true,\n allowFrom: toList(discordDm.allowFrom),\n groupEnabled:\n typeof discordDm.groupEnabled === \"boolean\" ? discordDm.groupEnabled : false,\n groupChannels: toList(discordDm.groupChannels),\n mediaMaxMb:\n typeof discord.mediaMaxMb === \"number\" ? String(discord.mediaMaxMb) : \"\",\n historyLimit:\n typeof discord.historyLimit === \"number\" ? String(discord.historyLimit) : \"\",\n textChunkLimit:\n typeof discord.textChunkLimit === \"number\"\n ? String(discord.textChunkLimit)\n : \"\",\n replyToMode:\n discord.replyToMode === \"first\" || discord.replyToMode === \"all\"\n ? discord.replyToMode\n : \"off\",\n guilds: Array.isArray(discordGuilds)\n ? []\n : typeof discordGuilds === \"object\" && discordGuilds\n ? Object.entries(discordGuilds as Record<string, unknown>).map(\n ([key, value]): DiscordGuildForm => {\n const entry =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n const channelsRaw =\n entry.channels && typeof entry.channels === \"object\"\n ? (entry.channels as Record<string, unknown>)\n : {};\n const channels = Object.entries(channelsRaw).map(\n ([channelKey, channelValue]): DiscordGuildChannelForm => {\n const channel =\n channelValue && typeof channelValue === \"object\"\n ? (channelValue as Record<string, unknown>)\n : {};\n return {\n key: channelKey,\n allow:\n typeof channel.allow === \"boolean\" ? channel.allow : true,\n requireMention:\n typeof channel.requireMention === \"boolean\"\n ? channel.requireMention\n : false,\n };\n },\n );\n return {\n key,\n slug: typeof entry.slug === \"string\" ? entry.slug : \"\",\n requireMention:\n typeof entry.requireMention === \"boolean\"\n ? entry.requireMention\n : false,\n reactionNotifications:\n entry.reactionNotifications === \"off\" ||\n entry.reactionNotifications === \"all\" ||\n entry.reactionNotifications === \"own\" ||\n entry.reactionNotifications === \"allowlist\"\n ? entry.reactionNotifications\n : \"own\",\n users: toList(entry.users),\n channels,\n };\n },\n )\n : [],\n actions: {\n reactions: readAction(\"reactions\"),\n stickers: readAction(\"stickers\"),\n polls: readAction(\"polls\"),\n permissions: readAction(\"permissions\"),\n messages: readAction(\"messages\"),\n threads: readAction(\"threads\"),\n pins: readAction(\"pins\"),\n search: readAction(\"search\"),\n memberInfo: readAction(\"memberInfo\"),\n roleInfo: readAction(\"roleInfo\"),\n channelInfo: readAction(\"channelInfo\"),\n voiceStatus: readAction(\"voiceStatus\"),\n events: readAction(\"events\"),\n roles: readAction(\"roles\"),\n moderation: readAction(\"moderation\"),\n },\n slashEnabled: typeof slash.enabled === \"boolean\" ? slash.enabled : false,\n slashName: typeof slash.name === \"string\" ? slash.name : \"\",\n slashSessionPrefix:\n typeof slash.sessionPrefix === \"string\" ? slash.sessionPrefix : \"\",\n slashEphemeral:\n typeof slash.ephemeral === \"boolean\" ? slash.ephemeral : true,\n };\n\n const slackDm = (slack.dm ?? {}) as Record<string, unknown>;\n const slackChannels = slack.channels;\n const slackSlash = (slack.slashCommand ?? {}) as Record<string, unknown>;\n const slackActions =\n (slack.actions ?? {}) as Partial<Record<keyof typeof defaultSlackActions, unknown>>;\n state.slackForm = {\n enabled: typeof slack.enabled === \"boolean\" ? slack.enabled : true,\n botToken: typeof slack.botToken === \"string\" ? slack.botToken : \"\",\n appToken: typeof slack.appToken === \"string\" ? slack.appToken : \"\",\n dmEnabled: typeof slackDm.enabled === \"boolean\" ? slackDm.enabled : true,\n allowFrom: toList(slackDm.allowFrom),\n groupEnabled:\n typeof slackDm.groupEnabled === \"boolean\" ? slackDm.groupEnabled : false,\n groupChannels: toList(slackDm.groupChannels),\n mediaMaxMb:\n typeof slack.mediaMaxMb === \"number\" ? String(slack.mediaMaxMb) : \"\",\n textChunkLimit:\n typeof slack.textChunkLimit === \"number\"\n ? String(slack.textChunkLimit)\n : \"\",\n reactionNotifications:\n slack.reactionNotifications === \"off\" ||\n slack.reactionNotifications === \"all\" ||\n slack.reactionNotifications === \"allowlist\"\n ? slack.reactionNotifications\n : \"own\",\n reactionAllowlist: toList(slack.reactionAllowlist),\n slashEnabled:\n typeof slackSlash.enabled === \"boolean\" ? slackSlash.enabled : false,\n slashName: typeof slackSlash.name === \"string\" ? slackSlash.name : \"\",\n slashSessionPrefix:\n typeof slackSlash.sessionPrefix === \"string\"\n ? slackSlash.sessionPrefix\n : \"\",\n slashEphemeral:\n typeof slackSlash.ephemeral === \"boolean\" ? slackSlash.ephemeral : true,\n actions: {\n ...defaultSlackActions,\n reactions:\n typeof slackActions.reactions === \"boolean\"\n ? slackActions.reactions\n : defaultSlackActions.reactions,\n messages:\n typeof slackActions.messages === \"boolean\"\n ? slackActions.messages\n : defaultSlackActions.messages,\n pins:\n typeof slackActions.pins === \"boolean\"\n ? slackActions.pins\n : defaultSlackActions.pins,\n memberInfo:\n typeof slackActions.memberInfo === \"boolean\"\n ? slackActions.memberInfo\n : defaultSlackActions.memberInfo,\n emojiList:\n typeof slackActions.emojiList === \"boolean\"\n ? slackActions.emojiList\n : defaultSlackActions.emojiList,\n },\n channels: Array.isArray(slackChannels)\n ? []\n : typeof slackChannels === \"object\" && slackChannels\n ? Object.entries(slackChannels as Record<string, unknown>).map(\n ([key, value]): SlackChannelForm => {\n const entry =\n value && typeof value === \"object\"\n ? (value as Record<string, unknown>)\n : {};\n return {\n key,\n allow:\n typeof entry.allow === \"boolean\" ? entry.allow : true,\n requireMention:\n typeof entry.requireMention === \"boolean\"\n ? entry.requireMention\n : false,\n };\n },\n )\n : [],\n };\n\n state.signalForm = {\n enabled: typeof signal.enabled === \"boolean\" ? signal.enabled : true,\n account: typeof signal.account === \"string\" ? signal.account : \"\",\n httpUrl: typeof signal.httpUrl === \"string\" ? signal.httpUrl : \"\",\n httpHost: typeof signal.httpHost === \"string\" ? signal.httpHost : \"\",\n httpPort: typeof signal.httpPort === \"number\" ? String(signal.httpPort) : \"\",\n cliPath: typeof signal.cliPath === \"string\" ? signal.cliPath : \"\",\n autoStart: typeof signal.autoStart === \"boolean\" ? signal.autoStart : true,\n receiveMode:\n signal.receiveMode === \"on-start\" || signal.receiveMode === \"manual\"\n ? signal.receiveMode\n : \"\",\n ignoreAttachments:\n typeof signal.ignoreAttachments === \"boolean\" ? signal.ignoreAttachments : false,\n ignoreStories:\n typeof signal.ignoreStories === \"boolean\" ? signal.ignoreStories : false,\n sendReadReceipts:\n typeof signal.sendReadReceipts === \"boolean\" ? signal.sendReadReceipts : false,\n allowFrom: toList(signal.allowFrom),\n mediaMaxMb:\n typeof signal.mediaMaxMb === \"number\" ? String(signal.mediaMaxMb) : \"\",\n };\n\n state.imessageForm = {\n enabled: typeof imessage.enabled === \"boolean\" ? imessage.enabled : true,\n cliPath: typeof imessage.cliPath === \"string\" ? imessage.cliPath : \"\",\n dbPath: typeof imessage.dbPath === \"string\" ? imessage.dbPath : \"\",\n service:\n imessage.service === \"imessage\" ||\n imessage.service === \"sms\" ||\n imessage.service === \"auto\"\n ? imessage.service\n : \"auto\",\n region: typeof imessage.region === \"string\" ? imessage.region : \"\",\n allowFrom: toList(imessage.allowFrom),\n includeAttachments:\n typeof imessage.includeAttachments === \"boolean\"\n ? imessage.includeAttachments\n : false,\n mediaMaxMb:\n typeof imessage.mediaMaxMb === \"number\" ? String(imessage.mediaMaxMb) : \"\",\n };\n\n const configInvalid = snapshot.valid === false ? \"Config invalid.\" : null;\n state.telegramConfigStatus = configInvalid;\n state.discordConfigStatus = configInvalid;\n state.slackConfigStatus = configInvalid;\n state.signalConfigStatus = configInvalid;\n state.imessageConfigStatus = configInvalid;\n\n if (!state.configFormDirty) {\n state.configForm = cloneConfigObject(snapshot.config ?? {});\n }\n}\n\nexport async function saveConfig(state: ConfigState) {\n if (!state.client || !state.connected) return;\n state.configSaving = true;\n state.lastError = null;\n try {\n const raw =\n state.configFormMode === \"form\" && state.configForm\n ? `${JSON.stringify(state.configForm, null, 2).trimEnd()}\\n`\n : state.configRaw;\n await state.client.request(\"config.set\", { raw });\n state.configFormDirty = false;\n await loadConfig(state);\n } catch (err) {\n state.lastError = String(err);\n } finally {\n state.configSaving = false;\n }\n}\n\nexport function updateConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n value: unknown,\n) {\n const base = cloneConfigObject(state.configForm ?? {});\n setPathValue(base, path, value);\n state.configForm = base;\n state.configFormDirty = true;\n}\n\nexport function removeConfigFormValue(\n state: ConfigState,\n path: Array<string | number>,\n) {\n const base = cloneConfigObject(state.configForm ?? {});\n removePathValue(base, path);\n state.configForm = base;\n state.configFormDirty = true;\n}\n\nfunction cloneConfigObject<T>(value: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction setPathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n value: unknown,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n const nextKey = path[i + 1];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n if (current[key] == null) {\n current[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n const record = current as Record<string, unknown>;\n if (record[key] == null) {\n record[key] =\n typeof nextKey === \"number\" ? [] : ({} as Record<string, unknown>);\n }\n current = record[key] as Record<string, unknown> | unknown[];\n }\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) {\n current[lastKey] = value;\n }\n return;\n }\n if (typeof current === \"object\" && current != null) {\n (current as Record<string, unknown>)[lastKey] = value;\n }\n}\n\nfunction removePathValue(\n obj: Record<string, unknown> | unknown[],\n path: Array<string | number>,\n) {\n if (path.length === 0) return;\n let current: Record<string, unknown> | unknown[] = obj;\n for (let i = 0; i < path.length - 1; i += 1) {\n const key = path[i];\n if (typeof key === \"number\") {\n if (!Array.isArray(current)) return;\n current = current[key] as Record<string, unknown> | unknown[];\n } else {\n if (typeof current !== \"object\" || current == null) return;\n current = (current as Record<string, unknown>)[key] as\n | Record<string, unknown>\n | unknown[];\n }\n if (current == null) return;\n }\n const lastKey = path[path.length - 1];\n if (typeof lastKey === \"number\") {\n if (Array.isArray(current)) {\n current.splice(lastKey, 1);\n }\n return;\n }\n if (typeof current === \"object\" && current != null) {\n delete (current as Record<string, unknown>)[lastKey];\n }\n}\n","import { toNumber } from \"../format\";\nimport type { GatewayBrowserClient } from \"../gateway\";\nimport type { CronJob, CronRunLogEntry, CronStatus } from \"../types\";\nimport type { CronFormState } from \"../ui-types\";\n\nexport type CronState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n cronLoading: boolean;\n cronJobs: CronJob[];\n cronStatus: CronStatus | null;\n cronError: string | null;\n cronForm: CronFormState;\n cronRunsJobId: string | null;\n cronRuns: CronRunLogEntry[];\n cronBusy: boolean;\n};\n\nexport async function loadCronStatus(state: CronState) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.status\", {})) as CronStatus;\n state.cronStatus = res;\n } catch (err) {\n state.cronError = String(err);\n }\n}\n\nexport async function loadCronJobs(state: CronState) {\n if (!state.client || !state.connected) return;\n if (state.cronLoading) return;\n state.cronLoading = true;\n state.cronError = null;\n try {\n const res = (await state.client.request(\"cron.list\", {\n includeDisabled: true,\n })) as { jobs?: CronJob[] };\n state.cronJobs = Array.isArray(res.jobs) ? res.jobs : [];\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronLoading = false;\n }\n}\n\nexport function buildCronSchedule(form: CronFormState) {\n if (form.scheduleKind === \"at\") {\n const ms = Date.parse(form.scheduleAt);\n if (!Number.isFinite(ms)) throw new Error(\"Invalid run time.\");\n return { kind: \"at\" as const, atMs: ms };\n }\n if (form.scheduleKind === \"every\") {\n const amount = toNumber(form.everyAmount, 0);\n if (amount <= 0) throw new Error(\"Invalid interval amount.\");\n const unit = form.everyUnit;\n const mult = unit === \"minutes\" ? 60_000 : unit === \"hours\" ? 3_600_000 : 86_400_000;\n return { kind: \"every\" as const, everyMs: amount * mult };\n }\n const expr = form.cronExpr.trim();\n if (!expr) throw new Error(\"Cron expression required.\");\n return { kind: \"cron\" as const, expr, tz: form.cronTz.trim() || undefined };\n}\n\nexport function buildCronPayload(form: CronFormState) {\n if (form.payloadKind === \"systemEvent\") {\n const text = form.payloadText.trim();\n if (!text) throw new Error(\"System event text required.\");\n return { kind: \"systemEvent\" as const, text };\n }\n const message = form.payloadText.trim();\n if (!message) throw new Error(\"Agent message required.\");\n const payload: {\n kind: \"agentTurn\";\n message: string;\n deliver?: boolean;\n channel?: \"last\" | \"whatsapp\" | \"telegram\";\n to?: string;\n timeoutSeconds?: number;\n } = { kind: \"agentTurn\", message };\n if (form.deliver) payload.deliver = true;\n if (form.channel) payload.channel = form.channel;\n if (form.to.trim()) payload.to = form.to.trim();\n const timeoutSeconds = toNumber(form.timeoutSeconds, 0);\n if (timeoutSeconds > 0) payload.timeoutSeconds = timeoutSeconds;\n return payload;\n}\n\nexport async function addCronJob(state: CronState) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n const schedule = buildCronSchedule(state.cronForm);\n const payload = buildCronPayload(state.cronForm);\n const job = {\n name: state.cronForm.name.trim(),\n description: state.cronForm.description.trim() || undefined,\n enabled: state.cronForm.enabled,\n schedule,\n sessionTarget: state.cronForm.sessionTarget,\n wakeMode: state.cronForm.wakeMode,\n payload,\n isolation:\n state.cronForm.postToMainPrefix.trim() &&\n state.cronForm.sessionTarget === \"isolated\"\n ? { postToMainPrefix: state.cronForm.postToMainPrefix.trim() }\n : undefined,\n };\n if (!job.name) throw new Error(\"Name required.\");\n await state.client.request(\"cron.add\", job);\n state.cronForm = {\n ...state.cronForm,\n name: \"\",\n description: \"\",\n payloadText: \"\",\n };\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function toggleCronJob(\n state: CronState,\n job: CronJob,\n enabled: boolean,\n) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.update\", { id: job.id, patch: { enabled } });\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function runCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.run\", { id: job.id, mode: \"force\" });\n await loadCronRuns(state, job.id);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function removeCronJob(state: CronState, job: CronJob) {\n if (!state.client || !state.connected || state.cronBusy) return;\n state.cronBusy = true;\n state.cronError = null;\n try {\n await state.client.request(\"cron.remove\", { id: job.id });\n if (state.cronRunsJobId === job.id) {\n state.cronRunsJobId = null;\n state.cronRuns = [];\n }\n await loadCronJobs(state);\n await loadCronStatus(state);\n } catch (err) {\n state.cronError = String(err);\n } finally {\n state.cronBusy = false;\n }\n}\n\nexport async function loadCronRuns(state: CronState, jobId: string) {\n if (!state.client || !state.connected) return;\n try {\n const res = (await state.client.request(\"cron.runs\", {\n id: jobId,\n limit: 50,\n })) as { entries?: CronRunLogEntry[] };\n state.cronRunsJobId = jobId;\n state.cronRuns = Array.isArray(res.entries) ? res.entries : [];\n } catch (err) {\n state.cronError = String(err);\n }\n}\n\n","import type { GatewayBrowserClient } from \"../gateway\";\nimport type { HealthSnapshot, StatusSummary } from \"../types\";\n\nexport type DebugState = {\n client: GatewayBrowserClient | null;\n connected: boolean;\n debugLoading: boolean;\n debugStatus: StatusSummary | null;\n debugHealth: HealthSnapshot | null;\n debugModels: unknown[];\n debugHeartbeat: unknown | null;\n debugCallMethod: string;\n debugCallParams: string;\n debugCallResult: string | null;\n debugCallError: string | null;\n};\n\nexport async function loadDebug(state: DebugState) {\n if (!state.client || !state.connected) return;\n if (state.debugLoading) return;\n state.debugLoading = true;\n try {\n const [status, health, models, heartbeat] = await Promise.all([\n state.client.request(\"status\", {}),\n state.client.request(\"health\", {}),\n state.client.request(\"models.list\", {}),\n state.client.request(\"last-heartbeat\", {}),\n ]);\n state.debugStatus = status as StatusSummary;\n state.debugHealth = health as HealthSnapshot;\n const modelPayload = models as { models?: unknown[] } | undefined;\n state.debugModels = Array.isArray(modelPayload?.models)\n ? modelPayload?.models\n : [];\n state.debugHeartbeat = heartbeat as unknown;\n } catch (err) {\n state.debugCallError = String(err);\n } finally {\n state.debugLoading = false;\n }\n}\n\nexport async function callDebugMethod(state: DebugState) {\n if (!state.client || !state.connected) return;\n state.debugCallError = null;\n state.debugCallResult = null;\n try {\n const params = state.debugCallParams.trim()\n ? (JSON.parse(state.debugCallParams) as unknown)\n : {};\n const res = await state.client.request(state.debugCallMethod.trim(), params);\n state.debugCallResult = JSON.stringify(res, null, 2);\n } catch (err) {\n state.debugCallError = String(err);\n }\n}\n\n","import { html, nothing } from \"lit\";\n\nimport type { GatewayBrowserClient, GatewayHelloOk } from \"./gateway\";\nimport {\n TAB_GROUPS,\n pathForTab,\n subtitleForTab,\n titleForTab,\n type Tab,\n} from \"./navigation\";\nimport type { UiSettings } from \"./storage\";\nimport type { ThemeMode } from \"./theme\";\nimport type { ThemeTransitionContext } from \"./theme-transition\";\nimport type {\n ConfigSnapshot,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n PresenceEntry,\n ProvidersStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n} from \"./types\";\nimport type {\n CronFormState,\n DiscordForm,\n IMessageForm,\n SlackForm,\n SignalForm,\n TelegramForm,\n} from \"./ui-types\";\nimport { renderChat } from \"./views/chat\";\nimport { renderConfig } from \"./views/config\";\nimport { renderConnections } from \"./views/connections\";\nimport { renderCron } from \"./views/cron\";\nimport { renderDebug } from \"./views/debug\";\nimport { renderInstances } from \"./views/instances\";\nimport { renderNodes } from \"./views/nodes\";\nimport { renderOverview } from \"./views/overview\";\nimport { renderSessions } from \"./views/sessions\";\nimport { renderSkills } from \"./views/skills\";\nimport {\n loadProviders,\n updateDiscordForm,\n updateIMessageForm,\n updateSlackForm,\n updateSignalForm,\n updateTelegramForm,\n} from \"./controllers/connections\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { loadSessions, patchSession } from \"./controllers/sessions\";\nimport {\n installSkill,\n loadSkills,\n saveSkillApiKey,\n updateSkillEdit,\n updateSkillEnabled,\n} from \"./controllers/skills\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport { loadChatHistory } from \"./controllers/chat\";\nimport { loadConfig, saveConfig, updateConfigFormValue } from \"./controllers/config\";\nimport { loadCronRuns, toggleCronJob, runCronJob, removeCronJob, addCronJob } from \"./controllers/cron\";\nimport { loadDebug, callDebugMethod } from \"./controllers/debug\";\n\nexport type EventLogEntry = {\n ts: number;\n event: string;\n payload?: unknown;\n};\n\nexport type AppViewState = {\n settings: UiSettings;\n password: string;\n tab: Tab;\n basePath: string;\n connected: boolean;\n theme: ThemeMode;\n themeResolved: \"light\" | \"dark\";\n hello: GatewayHelloOk | null;\n lastError: string | null;\n eventLog: EventLogEntry[];\n sessionKey: string;\n chatLoading: boolean;\n chatSending: boolean;\n chatMessage: string;\n chatMessages: unknown[];\n chatToolMessages: unknown[];\n chatStream: string | null;\n chatRunId: string | null;\n chatThinkingLevel: string | null;\n nodesLoading: boolean;\n nodes: Array<Record<string, unknown>>;\n configLoading: boolean;\n configRaw: string;\n configValid: boolean | null;\n configIssues: unknown[];\n configSaving: boolean;\n configSnapshot: ConfigSnapshot | null;\n configSchema: unknown | null;\n configSchemaLoading: boolean;\n configUiHints: Record<string, unknown>;\n configForm: Record<string, unknown> | null;\n configFormMode: \"form\" | \"raw\";\n providersLoading: boolean;\n providersSnapshot: ProvidersStatusSnapshot | null;\n providersError: string | null;\n providersLastSuccess: number | null;\n whatsappLoginMessage: string | null;\n whatsappLoginQrDataUrl: string | null;\n whatsappLoginConnected: boolean | null;\n whatsappBusy: boolean;\n telegramForm: TelegramForm;\n telegramSaving: boolean;\n telegramTokenLocked: boolean;\n telegramConfigStatus: string | null;\n discordForm: DiscordForm;\n discordSaving: boolean;\n discordTokenLocked: boolean;\n discordConfigStatus: string | null;\n slackForm: SlackForm;\n slackSaving: boolean;\n slackTokenLocked: boolean;\n slackAppTokenLocked: boolean;\n slackConfigStatus: string | null;\n signalForm: SignalForm;\n signalSaving: boolean;\n signalConfigStatus: string | null;\n imessageForm: IMessageForm;\n imessageSaving: boolean;\n imessageConfigStatus: string | null;\n presenceLoading: boolean;\n presenceEntries: PresenceEntry[];\n presenceError: string | null;\n presenceStatus: string | null;\n sessionsLoading: boolean;\n sessionsResult: SessionsListResult | null;\n sessionsError: string | null;\n sessionsFilterActive: string;\n sessionsFilterLimit: string;\n sessionsIncludeGlobal: boolean;\n sessionsIncludeUnknown: boolean;\n cronLoading: boolean;\n cronJobs: CronJob[];\n cronStatus: CronStatus | null;\n cronError: string | null;\n cronForm: CronFormState;\n cronRunsJobId: string | null;\n cronRuns: CronRunLogEntry[];\n cronBusy: boolean;\n skillsLoading: boolean;\n skillsReport: SkillStatusReport | null;\n skillsError: string | null;\n skillsFilter: string;\n skillEdits: Record<string, string>;\n skillsBusyKey: string | null;\n debugLoading: boolean;\n debugStatus: StatusSummary | null;\n debugHealth: HealthSnapshot | null;\n debugModels: unknown[];\n debugHeartbeat: unknown | null;\n debugCallMethod: string;\n debugCallParams: string;\n debugCallResult: string | null;\n debugCallError: string | null;\n client: GatewayBrowserClient | null;\n connect: () => void;\n setTab: (tab: Tab) => void;\n setTheme: (theme: ThemeMode, context?: ThemeTransitionContext) => void;\n applySettings: (next: UiSettings) => void;\n loadOverview: () => Promise<void>;\n loadCron: () => Promise<void>;\n handleWhatsAppStart: (force: boolean) => Promise<void>;\n handleWhatsAppWait: () => Promise<void>;\n handleWhatsAppLogout: () => Promise<void>;\n handleTelegramSave: () => Promise<void>;\n handleSendChat: () => Promise<void>;\n resetToolStream: () => void;\n};\n\nexport function renderApp(state: AppViewState) {\n const presenceCount = state.presenceEntries.length;\n const sessionsCount = state.sessionsResult?.count ?? null;\n const cronNext = state.cronStatus?.nextWakeAtMs ?? null;\n const hasConnectedMobileNode = state.nodes.some((n) => {\n if (!Boolean(n.connected)) return false;\n const p = typeof n.platform === \"string\" ? n.platform.trim().toLowerCase() : \"\";\n return p.startsWith(\"ios\") || p.startsWith(\"ipados\") || p.startsWith(\"android\");\n });\n const chatDisabledReason = !state.connected\n ? \"Disconnected from gateway.\"\n : hasConnectedMobileNode\n ? null\n : \"No connected iOS/Android node — Web Chat + Talk are disabled.\";\n\n return html`\n <div class=\"shell\">\n <header class=\"topbar\">\n <div class=\"brand\">\n <div class=\"brand-title\">Clawdbot Control</div>\n <div class=\"brand-sub\">Gateway dashboard</div>\n </div>\n <div class=\"topbar-status\">\n <div class=\"pill\">\n <span class=\"statusDot ${state.connected ? \"ok\" : \"\"}\"></span>\n <span>Health</span>\n <span class=\"mono\">${state.connected ? \"OK\" : \"Offline\"}</span>\n </div>\n ${renderThemeToggle(state)}\n </div>\n </header>\n <aside class=\"nav\">\n ${TAB_GROUPS.map(\n (group) => html`\n <div class=\"nav-group\">\n <div class=\"nav-label\">${group.label}</div>\n ${group.tabs.map((tab) => renderTab(state, tab))}\n </div>\n `,\n )}\n </aside>\n <main class=\"content\">\n <section class=\"content-header\">\n <div>\n <div class=\"page-title\">${titleForTab(state.tab)}</div>\n <div class=\"page-sub\">${subtitleForTab(state.tab)}</div>\n </div>\n <div class=\"page-meta\">\n ${state.lastError\n ? html`<div class=\"pill danger\">${state.lastError}</div>`\n : nothing}\n </div>\n </section>\n\n ${state.tab === \"overview\"\n ? renderOverview({\n connected: state.connected,\n hello: state.hello,\n settings: state.settings,\n password: state.password,\n lastError: state.lastError,\n presenceCount,\n sessionsCount,\n cronEnabled: state.cronStatus?.enabled ?? null,\n cronNext,\n lastProvidersRefresh: state.providersLastSuccess,\n onSettingsChange: (next) => state.applySettings(next),\n onPasswordChange: (next) => (state.password = next),\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.resetToolStream();\n state.applySettings({ ...state.settings, sessionKey: next });\n },\n onRefresh: () => state.loadOverview(),\n })\n : nothing}\n\n ${state.tab === \"connections\"\n ? renderConnections({\n connected: state.connected,\n loading: state.providersLoading,\n snapshot: state.providersSnapshot,\n lastError: state.providersError,\n lastSuccessAt: state.providersLastSuccess,\n whatsappMessage: state.whatsappLoginMessage,\n whatsappQrDataUrl: state.whatsappLoginQrDataUrl,\n whatsappConnected: state.whatsappLoginConnected,\n whatsappBusy: state.whatsappBusy,\n telegramForm: state.telegramForm,\n telegramTokenLocked: state.telegramTokenLocked,\n telegramSaving: state.telegramSaving,\n telegramStatus: state.telegramConfigStatus,\n discordForm: state.discordForm,\n discordTokenLocked: state.discordTokenLocked,\n discordSaving: state.discordSaving,\n discordStatus: state.discordConfigStatus,\n slackForm: state.slackForm,\n slackTokenLocked: state.slackTokenLocked,\n slackAppTokenLocked: state.slackAppTokenLocked,\n slackSaving: state.slackSaving,\n slackStatus: state.slackConfigStatus,\n signalForm: state.signalForm,\n signalSaving: state.signalSaving,\n signalStatus: state.signalConfigStatus,\n imessageForm: state.imessageForm,\n imessageSaving: state.imessageSaving,\n imessageStatus: state.imessageConfigStatus,\n onRefresh: (probe) => loadProviders(state, probe),\n onWhatsAppStart: (force) => state.handleWhatsAppStart(force),\n onWhatsAppWait: () => state.handleWhatsAppWait(),\n onWhatsAppLogout: () => state.handleWhatsAppLogout(),\n onTelegramChange: (patch) => updateTelegramForm(state, patch),\n onTelegramSave: () => state.handleTelegramSave(),\n onDiscordChange: (patch) => updateDiscordForm(state, patch),\n onDiscordSave: () => state.handleDiscordSave(),\n onSlackChange: (patch) => updateSlackForm(state, patch),\n onSlackSave: () => state.handleSlackSave(),\n onSignalChange: (patch) => updateSignalForm(state, patch),\n onSignalSave: () => state.handleSignalSave(),\n onIMessageChange: (patch) => updateIMessageForm(state, patch),\n onIMessageSave: () => state.handleIMessageSave(),\n })\n : nothing}\n\n ${state.tab === \"instances\"\n ? renderInstances({\n loading: state.presenceLoading,\n entries: state.presenceEntries,\n lastError: state.presenceError,\n statusMessage: state.presenceStatus,\n onRefresh: () => loadPresence(state),\n })\n : nothing}\n\n ${state.tab === \"sessions\"\n ? renderSessions({\n loading: state.sessionsLoading,\n result: state.sessionsResult,\n error: state.sessionsError,\n activeMinutes: state.sessionsFilterActive,\n limit: state.sessionsFilterLimit,\n includeGlobal: state.sessionsIncludeGlobal,\n includeUnknown: state.sessionsIncludeUnknown,\n onFiltersChange: (next) => {\n state.sessionsFilterActive = next.activeMinutes;\n state.sessionsFilterLimit = next.limit;\n state.sessionsIncludeGlobal = next.includeGlobal;\n state.sessionsIncludeUnknown = next.includeUnknown;\n },\n onRefresh: () => loadSessions(state),\n onPatch: (key, patch) => patchSession(state, key, patch),\n })\n : nothing}\n\n ${state.tab === \"cron\"\n ? renderCron({\n loading: state.cronLoading,\n status: state.cronStatus,\n jobs: state.cronJobs,\n error: state.cronError,\n busy: state.cronBusy,\n form: state.cronForm,\n runsJobId: state.cronRunsJobId,\n runs: state.cronRuns,\n onFormChange: (patch) => (state.cronForm = { ...state.cronForm, ...patch }),\n onRefresh: () => state.loadCron(),\n onAdd: () => addCronJob(state),\n onToggle: (job, enabled) => toggleCronJob(state, job, enabled),\n onRun: (job) => runCronJob(state, job),\n onRemove: (job) => removeCronJob(state, job),\n onLoadRuns: (jobId) => loadCronRuns(state, jobId),\n })\n : nothing}\n\n ${state.tab === \"skills\"\n ? renderSkills({\n loading: state.skillsLoading,\n report: state.skillsReport,\n error: state.skillsError,\n filter: state.skillsFilter,\n edits: state.skillEdits,\n busyKey: state.skillsBusyKey,\n onFilterChange: (next) => (state.skillsFilter = next),\n onRefresh: () => loadSkills(state),\n onToggle: (key, enabled) => updateSkillEnabled(state, key, enabled),\n onEdit: (key, value) => updateSkillEdit(state, key, value),\n onSaveKey: (key) => saveSkillApiKey(state, key),\n onInstall: (name, installId) => installSkill(state, name, installId),\n })\n : nothing}\n\n ${state.tab === \"nodes\"\n ? renderNodes({\n loading: state.nodesLoading,\n nodes: state.nodes,\n onRefresh: () => loadNodes(state),\n })\n : nothing}\n\n ${state.tab === \"chat\"\n ? renderChat({\n sessionKey: state.sessionKey,\n onSessionKeyChange: (next) => {\n state.sessionKey = next;\n state.chatMessage = \"\";\n state.chatStream = null;\n state.chatRunId = null;\n state.resetToolStream();\n state.applySettings({ ...state.settings, sessionKey: next });\n void loadChatHistory(state);\n },\n thinkingLevel: state.chatThinkingLevel,\n loading: state.chatLoading,\n sending: state.chatSending,\n messages: [...state.chatMessages, ...state.chatToolMessages],\n stream: state.chatStream,\n draft: state.chatMessage,\n connected: state.connected,\n canSend: state.connected && hasConnectedMobileNode,\n disabledReason: chatDisabledReason,\n sessions: state.sessionsResult,\n onRefresh: () => {\n state.resetToolStream();\n return loadChatHistory(state);\n },\n onDraftChange: (next) => (state.chatMessage = next),\n onSend: () => state.handleSendChat(),\n })\n : nothing}\n\n ${state.tab === \"config\"\n ? renderConfig({\n raw: state.configRaw,\n valid: state.configValid,\n issues: state.configIssues,\n loading: state.configLoading,\n saving: state.configSaving,\n connected: state.connected,\n schema: state.configSchema,\n schemaLoading: state.configSchemaLoading,\n uiHints: state.configUiHints,\n formMode: state.configFormMode,\n formValue: state.configForm,\n onRawChange: (next) => (state.configRaw = next),\n onFormModeChange: (mode) => (state.configFormMode = mode),\n onFormPatch: (path, value) => updateConfigFormValue(state, path, value),\n onReload: () => loadConfig(state),\n onSave: () => saveConfig(state),\n })\n : nothing}\n\n ${state.tab === \"debug\"\n ? renderDebug({\n loading: state.debugLoading,\n status: state.debugStatus,\n health: state.debugHealth,\n models: state.debugModels,\n heartbeat: state.debugHeartbeat,\n eventLog: state.eventLog,\n callMethod: state.debugCallMethod,\n callParams: state.debugCallParams,\n callResult: state.debugCallResult,\n callError: state.debugCallError,\n onCallMethodChange: (next) => (state.debugCallMethod = next),\n onCallParamsChange: (next) => (state.debugCallParams = next),\n onRefresh: () => loadDebug(state),\n onCall: () => callDebugMethod(state),\n })\n : nothing}\n </main>\n </div>\n `;\n}\n\nfunction renderTab(state: AppViewState, tab: Tab) {\n const href = pathForTab(tab, state.basePath);\n return html`\n <a\n href=${href}\n class=\"nav-item ${state.tab === tab ? \"active\" : \"\"}\"\n @click=${(event: MouseEvent) => {\n if (\n event.defaultPrevented ||\n event.button !== 0 ||\n event.metaKey ||\n event.ctrlKey ||\n event.shiftKey ||\n event.altKey\n ) {\n return;\n }\n event.preventDefault();\n state.setTab(tab);\n }}\n >\n <span>${titleForTab(tab)}</span>\n </a>\n `;\n}\n\nconst THEME_ORDER: ThemeMode[] = [\"system\", \"light\", \"dark\"];\n\nfunction renderThemeToggle(state: AppViewState) {\n const index = Math.max(0, THEME_ORDER.indexOf(state.theme));\n const applyTheme = (next: ThemeMode) => (event: MouseEvent) => {\n const element = event.currentTarget as HTMLElement;\n const context: ThemeTransitionContext = { element };\n if (event.clientX || event.clientY) {\n context.pointerClientX = event.clientX;\n context.pointerClientY = event.clientY;\n }\n state.setTheme(next, context);\n };\n\n return html`\n <div class=\"theme-toggle\" style=\"--theme-index: ${index};\">\n <div class=\"theme-toggle__track\" role=\"group\" aria-label=\"Theme\">\n <span class=\"theme-toggle__indicator\"></span>\n <button\n class=\"theme-toggle__button ${state.theme === \"system\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"system\")}\n aria-pressed=${state.theme === \"system\"}\n aria-label=\"System theme\"\n title=\"System\"\n >\n ${renderMonitorIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"light\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"light\")}\n aria-pressed=${state.theme === \"light\"}\n aria-label=\"Light theme\"\n title=\"Light\"\n >\n ${renderSunIcon()}\n </button>\n <button\n class=\"theme-toggle__button ${state.theme === \"dark\" ? \"active\" : \"\"}\"\n @click=${applyTheme(\"dark\")}\n aria-pressed=${state.theme === \"dark\"}\n aria-label=\"Dark theme\"\n title=\"Dark\"\n >\n ${renderMoonIcon()}\n </button>\n </div>\n </div>\n `;\n}\n\nfunction renderSunIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"4\"></circle>\n <path d=\"M12 2v2\"></path>\n <path d=\"M12 20v2\"></path>\n <path d=\"m4.93 4.93 1.41 1.41\"></path>\n <path d=\"m17.66 17.66 1.41 1.41\"></path>\n <path d=\"M2 12h2\"></path>\n <path d=\"M20 12h2\"></path>\n <path d=\"m6.34 17.66-1.41 1.41\"></path>\n <path d=\"m19.07 4.93-1.41 1.41\"></path>\n </svg>\n `;\n}\n\nfunction renderMoonIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path\n d=\"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401\"\n ></path>\n </svg>\n `;\n}\n\nfunction renderMonitorIcon() {\n return html`\n <svg class=\"theme-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"3\" rx=\"2\"></rect>\n <line x1=\"8\" x2=\"16\" y1=\"21\" y2=\"21\"></line>\n <line x1=\"12\" x2=\"12\" y1=\"17\" y2=\"21\"></line>\n </svg>\n `;\n}\n","export type ThemeMode = \"system\" | \"light\" | \"dark\";\nexport type ResolvedTheme = \"light\" | \"dark\";\n\nexport function getSystemTheme(): ResolvedTheme {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return \"dark\";\n }\n return window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"dark\"\n : \"light\";\n}\n\nexport function resolveTheme(mode: ThemeMode): ResolvedTheme {\n if (mode === \"system\") return getSystemTheme();\n return mode;\n}\n","import type { ThemeMode } from \"./theme\";\n\nexport type ThemeTransitionContext = {\n element?: HTMLElement | null;\n pointerClientX?: number;\n pointerClientY?: number;\n};\n\nexport type ThemeTransitionOptions = {\n nextTheme: ThemeMode;\n applyTheme: () => void;\n context?: ThemeTransitionContext;\n currentTheme?: ThemeMode | null;\n};\n\ntype DocumentWithViewTransition = Document & {\n startViewTransition?: (callback: () => void) => { finished: Promise<void> };\n};\n\nconst clamp01 = (value: number) => {\n if (Number.isNaN(value)) return 0.5;\n if (value <= 0) return 0;\n if (value >= 1) return 1;\n return value;\n};\n\nconst hasReducedMotionPreference = () => {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\") {\n return false;\n }\n return window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches ?? false;\n};\n\nconst cleanupThemeTransition = (root: HTMLElement) => {\n root.classList.remove(\"theme-transition\");\n root.style.removeProperty(\"--theme-switch-x\");\n root.style.removeProperty(\"--theme-switch-y\");\n};\n\nexport const startThemeTransition = ({\n nextTheme,\n applyTheme,\n context,\n currentTheme,\n}: ThemeTransitionOptions) => {\n if (currentTheme === nextTheme) return;\n\n const documentReference = globalThis.document ?? null;\n if (!documentReference) {\n applyTheme();\n return;\n }\n\n const root = documentReference.documentElement;\n const document_ = documentReference as DocumentWithViewTransition;\n const prefersReducedMotion = hasReducedMotionPreference();\n\n const canUseViewTransition =\n Boolean(document_.startViewTransition) && !prefersReducedMotion;\n\n if (canUseViewTransition) {\n let xPercent = 0.5;\n let yPercent = 0.5;\n\n if (\n context?.pointerClientX !== undefined &&\n context?.pointerClientY !== undefined &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01(context.pointerClientX / window.innerWidth);\n yPercent = clamp01(context.pointerClientY / window.innerHeight);\n } else if (context?.element) {\n const rect = context.element.getBoundingClientRect();\n if (\n rect.width > 0 &&\n rect.height > 0 &&\n typeof window !== \"undefined\"\n ) {\n xPercent = clamp01((rect.left + rect.width / 2) / window.innerWidth);\n yPercent = clamp01((rect.top + rect.height / 2) / window.innerHeight);\n }\n }\n\n root.style.setProperty(\"--theme-switch-x\", `${xPercent * 100}%`);\n root.style.setProperty(\"--theme-switch-y\", `${yPercent * 100}%`);\n root.classList.add(\"theme-transition\");\n\n try {\n const transition = document_.startViewTransition?.(() => {\n applyTheme();\n });\n if (transition?.finished) {\n void transition.finished.finally(() => cleanupThemeTransition(root));\n } else {\n cleanupThemeTransition(root);\n }\n } catch {\n cleanupThemeTransition(root);\n applyTheme();\n }\n return;\n }\n\n applyTheme();\n cleanupThemeTransition(root);\n};\n","import { LitElement, html, nothing } from \"lit\";\nimport { customElement, state } from \"lit/decorators.js\";\n\nimport { GatewayBrowserClient, type GatewayEventFrame, type GatewayHelloOk } from \"./gateway\";\nimport { loadSettings, saveSettings, type UiSettings } from \"./storage\";\nimport { renderApp } from \"./app-render\";\nimport {\n inferBasePathFromPathname,\n normalizeBasePath,\n normalizePath,\n pathForTab,\n tabFromPath,\n type Tab,\n} from \"./navigation\";\nimport {\n resolveTheme,\n type ResolvedTheme,\n type ThemeMode,\n} from \"./theme\";\nimport {\n startThemeTransition,\n type ThemeTransitionContext,\n} from \"./theme-transition\";\nimport type {\n ConfigSnapshot,\n ConfigUiHints,\n CronJob,\n CronRunLogEntry,\n CronStatus,\n HealthSnapshot,\n PresenceEntry,\n ProvidersStatusSnapshot,\n SessionsListResult,\n SkillStatusReport,\n StatusSummary,\n} from \"./types\";\nimport {\n defaultDiscordActions,\n defaultSlackActions,\n type CronFormState,\n type DiscordForm,\n type IMessageForm,\n type SlackForm,\n type SignalForm,\n type TelegramForm,\n} from \"./ui-types\";\nimport {\n loadChatHistory,\n sendChat,\n handleChatEvent,\n type ChatEventPayload,\n} from \"./controllers/chat\";\nimport { loadNodes } from \"./controllers/nodes\";\nimport {\n loadConfig,\n loadConfigSchema,\n updateConfigFormValue,\n} from \"./controllers/config\";\nimport {\n loadProviders,\n logoutWhatsApp,\n saveDiscordConfig,\n saveIMessageConfig,\n saveSlackConfig,\n saveSignalConfig,\n saveTelegramConfig,\n startWhatsAppLogin,\n waitWhatsAppLogin,\n} from \"./controllers/connections\";\nimport { loadPresence } from \"./controllers/presence\";\nimport { loadSessions } from \"./controllers/sessions\";\nimport {\n loadCronJobs,\n loadCronStatus,\n} from \"./controllers/cron\";\nimport {\n loadSkills,\n} from \"./controllers/skills\";\nimport { loadDebug } from \"./controllers/debug\";\n\ntype EventLogEntry = {\n ts: number;\n event: string;\n payload?: unknown;\n};\n\nconst TOOL_STREAM_LIMIT = 50;\n\ntype AgentEventPayload = {\n runId: string;\n seq: number;\n stream: string;\n ts: number;\n sessionKey?: string;\n data: Record<string, unknown>;\n};\n\ntype ToolStreamEntry = {\n toolCallId: string;\n runId: string;\n sessionKey?: string;\n name: string;\n args?: unknown;\n output?: string;\n startedAt: number;\n updatedAt: number;\n message: Record<string, unknown>;\n};\n\nfunction extractToolOutputText(value: unknown): string | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as Record<string, unknown>;\n if (typeof record.text === \"string\") return record.text;\n const content = record.content;\n if (!Array.isArray(content)) return null;\n const parts = content\n .map((item) => {\n if (!item || typeof item !== \"object\") return null;\n const entry = item as Record<string, unknown>;\n if (entry.type === \"text\" && typeof entry.text === \"string\") return entry.text;\n return null;\n })\n .filter((part): part is string => Boolean(part));\n if (parts.length === 0) return null;\n return parts.join(\"\\n\");\n}\n\nfunction formatToolOutput(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n const contentText = extractToolOutputText(value);\n if (contentText) return contentText;\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\ndeclare global {\n interface Window {\n __CLAWDBOT_CONTROL_UI_BASE_PATH__?: string;\n }\n}\n\nconst DEFAULT_CRON_FORM: CronFormState = {\n name: \"\",\n description: \"\",\n enabled: true,\n scheduleKind: \"every\",\n scheduleAt: \"\",\n everyAmount: \"30\",\n everyUnit: \"minutes\",\n cronExpr: \"0 7 * * *\",\n cronTz: \"\",\n sessionTarget: \"main\",\n wakeMode: \"next-heartbeat\",\n payloadKind: \"systemEvent\",\n payloadText: \"\",\n deliver: false,\n channel: \"last\",\n to: \"\",\n timeoutSeconds: \"\",\n postToMainPrefix: \"\",\n};\n\n@customElement(\"clawdbot-app\")\nexport class ClawdbotApp extends LitElement {\n @state() settings: UiSettings = loadSettings();\n @state() password = \"\";\n @state() tab: Tab = \"chat\";\n @state() connected = false;\n @state() theme: ThemeMode = this.settings.theme ?? \"system\";\n @state() themeResolved: ResolvedTheme = \"dark\";\n @state() hello: GatewayHelloOk | null = null;\n @state() lastError: string | null = null;\n @state() eventLog: EventLogEntry[] = [];\n\n @state() sessionKey = this.settings.sessionKey;\n @state() chatLoading = false;\n @state() chatSending = false;\n @state() chatMessage = \"\";\n @state() chatMessages: unknown[] = [];\n @state() chatToolMessages: unknown[] = [];\n @state() chatStream: string | null = null;\n @state() chatRunId: string | null = null;\n @state() chatThinkingLevel: string | null = null;\n\n @state() nodesLoading = false;\n @state() nodes: Array<Record<string, unknown>> = [];\n\n @state() configLoading = false;\n @state() configRaw = \"{\\n}\\n\";\n @state() configValid: boolean | null = null;\n @state() configIssues: unknown[] = [];\n @state() configSaving = false;\n @state() configSnapshot: ConfigSnapshot | null = null;\n @state() configSchema: unknown | null = null;\n @state() configSchemaVersion: string | null = null;\n @state() configSchemaLoading = false;\n @state() configUiHints: ConfigUiHints = {};\n @state() configForm: Record<string, unknown> | null = null;\n @state() configFormDirty = false;\n @state() configFormMode: \"form\" | \"raw\" = \"form\";\n\n @state() providersLoading = false;\n @state() providersSnapshot: ProvidersStatusSnapshot | null = null;\n @state() providersError: string | null = null;\n @state() providersLastSuccess: number | null = null;\n @state() whatsappLoginMessage: string | null = null;\n @state() whatsappLoginQrDataUrl: string | null = null;\n @state() whatsappLoginConnected: boolean | null = null;\n @state() whatsappBusy = false;\n @state() telegramForm: TelegramForm = {\n token: \"\",\n requireMention: true,\n allowFrom: \"\",\n proxy: \"\",\n webhookUrl: \"\",\n webhookSecret: \"\",\n webhookPath: \"\",\n };\n @state() telegramSaving = false;\n @state() telegramTokenLocked = false;\n @state() telegramConfigStatus: string | null = null;\n @state() discordForm: DiscordForm = {\n enabled: true,\n token: \"\",\n dmEnabled: true,\n allowFrom: \"\",\n groupEnabled: false,\n groupChannels: \"\",\n mediaMaxMb: \"\",\n historyLimit: \"\",\n textChunkLimit: \"\",\n guilds: [],\n actions: { ...defaultDiscordActions },\n slashEnabled: false,\n slashName: \"\",\n slashSessionPrefix: \"\",\n slashEphemeral: true,\n };\n @state() discordSaving = false;\n @state() discordTokenLocked = false;\n @state() discordConfigStatus: string | null = null;\n @state() slackForm: SlackForm = {\n enabled: true,\n botToken: \"\",\n appToken: \"\",\n dmEnabled: true,\n allowFrom: \"\",\n groupEnabled: false,\n groupChannels: \"\",\n mediaMaxMb: \"\",\n textChunkLimit: \"\",\n reactionNotifications: \"own\",\n reactionAllowlist: \"\",\n slashEnabled: false,\n slashName: \"\",\n slashSessionPrefix: \"\",\n slashEphemeral: true,\n actions: { ...defaultSlackActions },\n channels: [],\n };\n @state() slackSaving = false;\n @state() slackTokenLocked = false;\n @state() slackAppTokenLocked = false;\n @state() slackConfigStatus: string | null = null;\n @state() signalForm: SignalForm = {\n enabled: true,\n account: \"\",\n httpUrl: \"\",\n httpHost: \"\",\n httpPort: \"\",\n cliPath: \"\",\n autoStart: true,\n receiveMode: \"\",\n ignoreAttachments: false,\n ignoreStories: false,\n sendReadReceipts: false,\n allowFrom: \"\",\n mediaMaxMb: \"\",\n };\n @state() signalSaving = false;\n @state() signalConfigStatus: string | null = null;\n @state() imessageForm: IMessageForm = {\n enabled: true,\n cliPath: \"\",\n dbPath: \"\",\n service: \"auto\",\n region: \"\",\n allowFrom: \"\",\n includeAttachments: false,\n mediaMaxMb: \"\",\n };\n @state() imessageSaving = false;\n @state() imessageConfigStatus: string | null = null;\n\n @state() presenceLoading = false;\n @state() presenceEntries: PresenceEntry[] = [];\n @state() presenceError: string | null = null;\n @state() presenceStatus: string | null = null;\n\n @state() sessionsLoading = false;\n @state() sessionsResult: SessionsListResult | null = null;\n @state() sessionsError: string | null = null;\n @state() sessionsFilterActive = \"\";\n @state() sessionsFilterLimit = \"120\";\n @state() sessionsIncludeGlobal = true;\n @state() sessionsIncludeUnknown = false;\n\n @state() cronLoading = false;\n @state() cronJobs: CronJob[] = [];\n @state() cronStatus: CronStatus | null = null;\n @state() cronError: string | null = null;\n @state() cronForm: CronFormState = { ...DEFAULT_CRON_FORM };\n @state() cronRunsJobId: string | null = null;\n @state() cronRuns: CronRunLogEntry[] = [];\n @state() cronBusy = false;\n\n @state() skillsLoading = false;\n @state() skillsReport: SkillStatusReport | null = null;\n @state() skillsError: string | null = null;\n @state() skillsFilter = \"\";\n @state() skillEdits: Record<string, string> = {};\n @state() skillsBusyKey: string | null = null;\n\n @state() debugLoading = false;\n @state() debugStatus: StatusSummary | null = null;\n @state() debugHealth: HealthSnapshot | null = null;\n @state() debugModels: unknown[] = [];\n @state() debugHeartbeat: unknown | null = null;\n @state() debugCallMethod = \"\";\n @state() debugCallParams = \"{}\";\n @state() debugCallResult: string | null = null;\n @state() debugCallError: string | null = null;\n\n client: GatewayBrowserClient | null = null;\n private chatScrollFrame: number | null = null;\n private chatScrollTimeout: number | null = null;\n private nodesPollInterval: number | null = null;\n private toolStreamById = new Map<string, ToolStreamEntry>();\n private toolStreamOrder: string[] = [];\n basePath = \"\";\n private popStateHandler = () => this.onPopState();\n private themeMedia: MediaQueryList | null = null;\n private themeMediaHandler: ((event: MediaQueryListEvent) => void) | null = null;\n\n createRenderRoot() {\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.basePath = this.inferBasePath();\n this.syncTabWithLocation(true);\n this.syncThemeWithSettings();\n this.attachThemeListener();\n window.addEventListener(\"popstate\", this.popStateHandler);\n this.applySettingsFromUrl();\n this.connect();\n this.startNodesPolling();\n }\n\n disconnectedCallback() {\n window.removeEventListener(\"popstate\", this.popStateHandler);\n this.stopNodesPolling();\n this.detachThemeListener();\n super.disconnectedCallback();\n }\n\n protected updated(changed: Map<PropertyKey, unknown>) {\n if (\n this.tab === \"chat\" &&\n (changed.has(\"chatMessages\") ||\n changed.has(\"chatToolMessages\") ||\n changed.has(\"chatStream\") ||\n changed.has(\"chatLoading\") ||\n changed.has(\"chatMessage\") ||\n changed.has(\"tab\"))\n ) {\n this.scheduleChatScroll();\n }\n }\n\n connect() {\n this.lastError = null;\n this.hello = null;\n this.connected = false;\n\n this.client?.stop();\n this.client = new GatewayBrowserClient({\n url: this.settings.gatewayUrl,\n token: this.settings.token.trim() ? this.settings.token : undefined,\n password: this.password.trim() ? this.password : undefined,\n clientName: \"clawdbot-control-ui\",\n mode: \"webchat\",\n onHello: (hello) => {\n this.connected = true;\n this.hello = hello;\n this.applySnapshot(hello);\n void loadNodes(this, { quiet: true });\n void this.refreshActiveTab();\n },\n onClose: ({ code, reason }) => {\n this.connected = false;\n this.lastError = `disconnected (${code}): ${reason || \"no reason\"}`;\n },\n onEvent: (evt) => this.onEvent(evt),\n onGap: ({ expected, received }) => {\n this.lastError = `event gap detected (expected seq ${expected}, got ${received}); refresh recommended`;\n },\n });\n this.client.start();\n }\n\n private scheduleChatScroll() {\n if (this.chatScrollFrame) cancelAnimationFrame(this.chatScrollFrame);\n if (this.chatScrollTimeout != null) {\n clearTimeout(this.chatScrollTimeout);\n this.chatScrollTimeout = null;\n }\n this.chatScrollFrame = requestAnimationFrame(() => {\n this.chatScrollFrame = null;\n const container = this.querySelector(\".chat-thread\") as HTMLElement | null;\n if (!container) return;\n container.scrollTop = container.scrollHeight;\n this.chatScrollTimeout = window.setTimeout(() => {\n this.chatScrollTimeout = null;\n const latest = this.querySelector(\".chat-thread\") as HTMLElement | null;\n if (!latest) return;\n latest.scrollTop = latest.scrollHeight;\n }, 120);\n });\n }\n\n private startNodesPolling() {\n if (this.nodesPollInterval != null) return;\n this.nodesPollInterval = window.setInterval(\n () => void loadNodes(this, { quiet: true }),\n 5000,\n );\n }\n\n private stopNodesPolling() {\n if (this.nodesPollInterval == null) return;\n clearInterval(this.nodesPollInterval);\n this.nodesPollInterval = null;\n }\n\n private hasConnectedMobileNode() {\n return this.nodes.some((n) => {\n if (!Boolean(n.connected)) return false;\n const p =\n typeof n.platform === \"string\" ? n.platform.trim().toLowerCase() : \"\";\n return (\n p.startsWith(\"ios\") || p.startsWith(\"ipados\") || p.startsWith(\"android\")\n );\n });\n }\n\n resetToolStream() {\n this.toolStreamById.clear();\n this.toolStreamOrder = [];\n this.chatToolMessages = [];\n }\n\n private trimToolStream() {\n if (this.toolStreamOrder.length <= TOOL_STREAM_LIMIT) return;\n const overflow = this.toolStreamOrder.length - TOOL_STREAM_LIMIT;\n const removed = this.toolStreamOrder.splice(0, overflow);\n for (const id of removed) this.toolStreamById.delete(id);\n }\n\n private syncToolStreamMessages() {\n this.chatToolMessages = this.toolStreamOrder\n .map((id) => this.toolStreamById.get(id)?.message)\n .filter((msg): msg is Record<string, unknown> => Boolean(msg));\n }\n\n private buildToolStreamMessage(entry: ToolStreamEntry): Record<string, unknown> {\n const content: Array<Record<string, unknown>> = [];\n content.push({\n type: \"toolcall\",\n name: entry.name,\n arguments: entry.args ?? {},\n });\n if (entry.output) {\n content.push({\n type: \"toolresult\",\n name: entry.name,\n text: entry.output,\n });\n }\n return {\n role: \"assistant\",\n toolCallId: entry.toolCallId,\n runId: entry.runId,\n content,\n timestamp: entry.startedAt,\n };\n }\n\n private handleAgentEvent(payload?: AgentEventPayload) {\n if (!payload || payload.stream !== \"tool\") return;\n const sessionKey =\n typeof payload.sessionKey === \"string\" ? payload.sessionKey : undefined;\n if (sessionKey && sessionKey !== this.sessionKey) return;\n // Fallback: only accept session-less events for the active run.\n if (!sessionKey && this.chatRunId && payload.runId !== this.chatRunId) return;\n\n const data = payload.data ?? {};\n const toolCallId =\n typeof data.toolCallId === \"string\" ? data.toolCallId : \"\";\n if (!toolCallId) return;\n const name = typeof data.name === \"string\" ? data.name : \"tool\";\n const phase = typeof data.phase === \"string\" ? data.phase : \"\";\n const args = phase === \"start\" ? data.args : undefined;\n const output =\n phase === \"update\"\n ? formatToolOutput(data.partialResult)\n : phase === \"result\"\n ? formatToolOutput(data.result)\n : undefined;\n\n const now = Date.now();\n let entry = this.toolStreamById.get(toolCallId);\n if (!entry) {\n entry = {\n toolCallId,\n runId: payload.runId,\n sessionKey,\n name,\n args,\n output,\n startedAt: typeof payload.ts === \"number\" ? payload.ts : now,\n updatedAt: now,\n message: {},\n };\n this.toolStreamById.set(toolCallId, entry);\n this.toolStreamOrder.push(toolCallId);\n } else {\n entry.name = name;\n if (args !== undefined) entry.args = args;\n if (output !== undefined) entry.output = output;\n entry.updatedAt = now;\n }\n\n entry.message = this.buildToolStreamMessage(entry);\n this.trimToolStream();\n this.syncToolStreamMessages();\n }\n\n private onEvent(evt: GatewayEventFrame) {\n this.eventLog = [\n { ts: Date.now(), event: evt.event, payload: evt.payload },\n ...this.eventLog,\n ].slice(0, 250);\n\n if (evt.event === \"agent\") {\n this.handleAgentEvent(evt.payload as AgentEventPayload | undefined);\n return;\n }\n\n if (evt.event === \"chat\") {\n const payload = evt.payload as ChatEventPayload | undefined;\n const state = handleChatEvent(this, payload);\n if (state === \"final\") void loadChatHistory(this);\n return;\n }\n\n if (evt.event === \"presence\") {\n const payload = evt.payload as { presence?: PresenceEntry[] } | undefined;\n if (payload?.presence && Array.isArray(payload.presence)) {\n this.presenceEntries = payload.presence;\n this.presenceError = null;\n this.presenceStatus = null;\n }\n return;\n }\n\n if (evt.event === \"cron\" && this.tab === \"cron\") {\n void this.loadCron();\n }\n }\n\n private applySnapshot(hello: GatewayHelloOk) {\n const snapshot = hello.snapshot as\n | { presence?: PresenceEntry[]; health?: HealthSnapshot }\n | undefined;\n if (snapshot?.presence && Array.isArray(snapshot.presence)) {\n this.presenceEntries = snapshot.presence;\n }\n if (snapshot?.health) {\n this.debugHealth = snapshot.health;\n }\n }\n\n applySettings(next: UiSettings) {\n this.settings = next;\n saveSettings(next);\n if (next.theme !== this.theme) {\n this.theme = next.theme;\n this.applyResolvedTheme(resolveTheme(next.theme));\n }\n }\n\n private applySettingsFromUrl() {\n if (!window.location.search) return;\n const params = new URLSearchParams(window.location.search);\n const token = params.get(\"token\")?.trim();\n if (!token) return;\n if (!this.settings.token) {\n this.applySettings({ ...this.settings, token });\n }\n params.delete(\"token\");\n const url = new URL(window.location.href);\n url.search = params.toString();\n window.history.replaceState({}, \"\", url.toString());\n }\n\n setTab(next: Tab) {\n if (this.tab !== next) this.tab = next;\n void this.refreshActiveTab();\n this.syncUrlWithTab(next, false);\n }\n\n setTheme(next: ThemeMode, context?: ThemeTransitionContext) {\n const applyTheme = () => {\n this.theme = next;\n this.applySettings({ ...this.settings, theme: next });\n this.applyResolvedTheme(resolveTheme(next));\n };\n startThemeTransition({\n nextTheme: next,\n applyTheme,\n context,\n currentTheme: this.theme,\n });\n }\n\n private async refreshActiveTab() {\n if (this.tab === \"overview\") await this.loadOverview();\n if (this.tab === \"connections\") await this.loadConnections();\n if (this.tab === \"instances\") await loadPresence(this);\n if (this.tab === \"sessions\") await loadSessions(this);\n if (this.tab === \"cron\") await this.loadCron();\n if (this.tab === \"skills\") await loadSkills(this);\n if (this.tab === \"nodes\") await loadNodes(this);\n if (this.tab === \"chat\") {\n await Promise.all([loadChatHistory(this), loadSessions(this)]);\n this.scheduleChatScroll();\n }\n if (this.tab === \"config\") {\n await loadConfigSchema(this);\n await loadConfig(this);\n }\n if (this.tab === \"debug\") await loadDebug(this);\n }\n\n private inferBasePath() {\n if (typeof window === \"undefined\") return \"\";\n const configured = window.__CLAWDBOT_CONTROL_UI_BASE_PATH__;\n if (typeof configured === \"string\" && configured.trim()) {\n return normalizeBasePath(configured);\n }\n return inferBasePathFromPathname(window.location.pathname);\n }\n\n private syncThemeWithSettings() {\n this.theme = this.settings.theme ?? \"system\";\n this.applyResolvedTheme(resolveTheme(this.theme));\n }\n\n private applyResolvedTheme(resolved: ResolvedTheme) {\n this.themeResolved = resolved;\n if (typeof document === \"undefined\") return;\n const root = document.documentElement;\n root.dataset.theme = resolved;\n root.style.colorScheme = resolved;\n }\n\n private attachThemeListener() {\n if (typeof window === \"undefined\" || typeof window.matchMedia !== \"function\")\n return;\n this.themeMedia = window.matchMedia(\"(prefers-color-scheme: dark)\");\n this.themeMediaHandler = (event) => {\n if (this.theme !== \"system\") return;\n this.applyResolvedTheme(event.matches ? \"dark\" : \"light\");\n };\n if (typeof this.themeMedia.addEventListener === \"function\") {\n this.themeMedia.addEventListener(\"change\", this.themeMediaHandler);\n return;\n }\n const legacy = this.themeMedia as MediaQueryList & {\n addListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.addListener(this.themeMediaHandler);\n }\n\n private detachThemeListener() {\n if (!this.themeMedia || !this.themeMediaHandler) return;\n if (typeof this.themeMedia.removeEventListener === \"function\") {\n this.themeMedia.removeEventListener(\"change\", this.themeMediaHandler);\n return;\n }\n const legacy = this.themeMedia as MediaQueryList & {\n removeListener: (cb: (event: MediaQueryListEvent) => void) => void;\n };\n legacy.removeListener(this.themeMediaHandler);\n this.themeMedia = null;\n this.themeMediaHandler = null;\n }\n\n private syncTabWithLocation(replace: boolean) {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, this.basePath) ?? \"chat\";\n this.setTabFromRoute(resolved);\n this.syncUrlWithTab(resolved, replace);\n }\n\n private onPopState() {\n if (typeof window === \"undefined\") return;\n const resolved = tabFromPath(window.location.pathname, this.basePath);\n if (!resolved) return;\n this.setTabFromRoute(resolved);\n }\n\n private setTabFromRoute(next: Tab) {\n if (this.tab !== next) this.tab = next;\n if (this.connected) void this.refreshActiveTab();\n }\n\n private syncUrlWithTab(tab: Tab, replace: boolean) {\n if (typeof window === \"undefined\") return;\n const targetPath = normalizePath(pathForTab(tab, this.basePath));\n const currentPath = normalizePath(window.location.pathname);\n if (currentPath === targetPath) return;\n const url = new URL(window.location.href);\n url.pathname = targetPath;\n if (replace) {\n window.history.replaceState({}, \"\", url.toString());\n } else {\n window.history.pushState({}, \"\", url.toString());\n }\n }\n\n async loadOverview() {\n await Promise.all([\n loadProviders(this, false),\n loadPresence(this),\n loadSessions(this),\n loadCronStatus(this),\n loadDebug(this),\n ]);\n }\n\n private async loadConnections() {\n await Promise.all([loadProviders(this, true), loadConfig(this)]);\n }\n\n async loadCron() {\n await Promise.all([loadCronStatus(this), loadCronJobs(this)]);\n }\n\n async handleSendChat() {\n if (!this.connected || !this.hasConnectedMobileNode()) return;\n await sendChat(this);\n void loadChatHistory(this);\n }\n\n async handleWhatsAppStart(force: boolean) {\n await startWhatsAppLogin(this, force);\n await loadProviders(this, true);\n }\n\n async handleWhatsAppWait() {\n await waitWhatsAppLogin(this);\n await loadProviders(this, true);\n }\n\n async handleWhatsAppLogout() {\n await logoutWhatsApp(this);\n await loadProviders(this, true);\n }\n\n async handleTelegramSave() {\n await saveTelegramConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleDiscordSave() {\n await saveDiscordConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleSlackSave() {\n await saveSlackConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleSignalSave() {\n await saveSignalConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n async handleIMessageSave() {\n await saveIMessageConfig(this);\n await loadConfig(this);\n await loadProviders(this, true);\n }\n\n render() {\n return renderApp(this);\n }\n}\n"],"names":["t","e","s","o","n$3","r","n","S","c","i","h","a","l","p","d","u","f","b","y$1","y","v","_","m","g","$","x","E","A","C","P","V","N","I","L","z","H","M","R","k","Z","B","D","uuidFromBytes","bytes","hex","weakRandomBytes","now","generateUUID","cryptoLike","GatewayBrowserClient","opts","ev","reason","delay","err","auth","params","hello","raw","parsed","frame","evt","seq","res","pending","method","id","resolve","reject","KEY","loadSettings","defaults","saveSettings","next","TAB_GROUPS","TAB_PATHS","PATH_TO_TAB","tab","path","normalizeBasePath","basePath","base","normalizePath","normalized","pathForTab","tabFromPath","pathname","inferBasePathFromPathname","segments","candidate","prefix","titleForTab","subtitleForTab","TOOL_DISPLAY_CONFIG","rawConfig","FALLBACK","TOOL_MAP","normalizeToolName","name","defaultTitle","cleaned","part","normalizeVerb","value","trimmed","coerceDisplayValue","firstLine","values","item","preview","lookupValueByPath","args","current","segment","resolveDetailFromKeys","keys","key","display","resolveReadDetail","record","offset","limit","resolveWriteDetail","resolveActionSpec","spec","action","resolveToolDisplay","emoji","title","label","actionRaw","actionSpec","verb","detail","detailKeys","shortenHomeInString","formatToolDetail","parts","input","renderChat","props","canInteract","canCompose","sessionOptions","resolveSessionOptions","composePlaceholder","html","entry","nothing","renderMessage","currentKey","sessions","cutoff","sorted","recent","seen","result","included","mainKey","mainEntry","message","role","toolCards","extractToolCards","hasToolCards","isToolResult","isToolResultMessage","extractedText","extractText","contentText","fallback","text","timestamp","klass","who","card","renderToolCard","content","normalizeContent","cards","kind","coerceArgs","extractToolText","renderConfigForm","schema","schemaType","orderA","hintForPath","orderB","node","renderNode","hints","onPatch","type","hint","humanize","help","entries","itemSchema","arr","defaultValue","index","opt","isSensitive","isSensitivePath","placeholder","pathKey","renderConfig","validity","formatMs","ms","formatAgo","diff","sec","min","hr","formatDurationMs","clampText","max","toNumber","parseList","discordActionOptions","slackActionOptions","renderConnections","whatsapp","telegram","discord","slack","signal","imessage","orderedProviders","providerEnabled","provider","renderProvider","formatDuration","snapshot","data","botName","guild","guildIndex","channel","channelIndex","channels","teamName","formatPresenceSummary","host","ip","mode","version","formatPresenceAge","ts","formatNextRun","formatSessionTokens","row","total","ctx","formatEventPayload","payload","formatCronState","job","state","last","formatCronSchedule","formatCronPayload","renderCron","renderScheduleFields","renderJob","renderRun","form","renderDebug","renderInstances","renderEntry","lastInput","renderNodes","connected","paired","caps","commands","renderOverview","uptime","tick","THINK_LEVELS","VERBOSE_LEVELS","renderSessions","rows","renderRow","updated","thinking","verbose","level","renderSkills","skills","filter","filtered","skill","renderSkill","busy","apiKey","missing","reasons","defaultDiscordActions","defaultSlackActions","loadProviders","probe","startWhatsAppLogin","force","waitWhatsAppLogin","logoutWhatsApp","updateTelegramForm","patch","updateDiscordForm","updateSlackForm","updateSignalForm","updateIMessageForm","saveTelegramConfig","config","token","groups","defaultGroup","allowFrom","proxy","webhookUrl","webhookSecret","webhookPath","saveDiscordConfig","groupChannels","dm","mediaMaxMb","historyLimitRaw","historyLimit","chunkLimitRaw","chunkLimit","guildsForm","guilds","slug","users","channelKey","channelEntry","actions","applyAction","slash","saveSlackConfig","textChunkLimit","reactionAllowlist","saveSignalConfig","account","httpUrl","httpHost","httpPort","cliPath","saveIMessageConfig","dbPath","region","loadPresence","loadSessions","activeMinutes","patchSession","loadSkills","updateSkillEdit","skillKey","updateSkillEnabled","enabled","saveSkillApiKey","installSkill","installId","loadNodes","loadChatHistory","sendChat","msg","runId","handleChatEvent","loadConfig","applyConfigSnapshot","loadConfigSchema","applyConfigSchema","toList","telegramGroups","telegramDefaultGroup","discordDm","discordActions","discordGuilds","readAction","channelsRaw","channelValue","slackDm","slackChannels","slackSlash","slackActions","configInvalid","cloneConfigObject","saveConfig","updateConfigFormValue","setPathValue","obj","nextKey","lastKey","loadCronStatus","loadCronJobs","buildCronSchedule","amount","unit","expr","buildCronPayload","timeoutSeconds","addCronJob","schedule","toggleCronJob","runCronJob","loadCronRuns","removeCronJob","jobId","loadDebug","status","health","models","heartbeat","modelPayload","callDebugMethod","renderApp","presenceCount","sessionsCount","cronNext","hasConnectedMobileNode","chatDisabledReason","renderThemeToggle","group","renderTab","href","event","THEME_ORDER","applyTheme","context","renderMonitorIcon","renderSunIcon","renderMoonIcon","getSystemTheme","resolveTheme","clamp01","hasReducedMotionPreference","cleanupThemeTransition","root","startThemeTransition","nextTheme","currentTheme","documentReference","document_","prefersReducedMotion","xPercent","yPercent","rect","transition","TOOL_STREAM_LIMIT","extractToolOutputText","formatToolOutput","DEFAULT_CRON_FORM","ClawdbotApp","LitElement","changed","code","expected","received","container","latest","overflow","removed","sessionKey","toolCallId","phase","output","url","configured","resolved","replace","targetPath","__decorateClass","customElement"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6]}