openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
1,403 lines • 189 kB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{$i as t,Cn as n,Kn as r,Mn as i,R as a,Un as o,Vn as s,jn as c,ta as l,wr as u,z as d}from"./control-ui-foundation-Cydpkyqa.js";import{$r as f,Bn as p,Do as m,Eo as h,Ho as g,J as _,Oo as v,Sc as y,So as b,T as ee,Un as te,Uo as ne,Vn as re,Yr as ie,Zr as ae,_o as x,bc as S,bs as C,cr as oe,cs as se,dn as ce,ei as le,fn as ue,go as de,k as fe,lr as pe,os as w,pn as me,ss as he,un as ge,w as _e,xs as ve,y as ye,yo as be,ys as T,zn as xe,zo as E}from"./control-ui-core-Rwzhj6nO.js";import{$ as D,D as Se,K as O,X as k,at as A,k as Ce,q as j,r as we,st as M,t as Te}from"./lit-runtime-CV_MH99K.js";import{$ as Ee,An as De,Ct as Oe,Dt as ke,E as Ae,G as je,J as Me,K as Ne,Q as Pe,St as Fe,T as Ie,W as Le,Yn as Re,Z as ze,Zt as Be,_ as Ve,_n as He,_t as Ue,a as We,at as Ge,b as Ke,bt as qe,c as Je,dt as Ye,er as Xe,ft as Ze,g as Qe,gt as $e,ht as et,i as tt,it as nt,jn as rt,l as it,mt as at,n as ot,nn as st,nr as ct,nt as lt,o as ut,pt as dt,q as N,r as ft,rn as pt,s as mt,tn as ht,tt as gt,vt as _t,w as vt,wt as yt,x as bt,xt,yt as St}from"./control-ui-core-YphAl4aM.js";import{Gt as Ct,Ht as wt,Qt as Tt,St as Et,Tt as Dt,Wt as P,Yt as F,en as I,rn as Ot,tn as kt}from"./control-ui-core-vvcQQV2m.js";import{B as At,U as jt,V as Mt,z as Nt}from"./control-ui-boot-shared-BYq7Cchl.js";import{a as Pt,n as Ft,r as It}from"./gateway-runtime-Bqqcp9-I.js";import{Aa as Lt,An as Rt,C as zt,D as Bt,Da as Vt,E as Ht,M as Ut,N as Wt,O as Gt,Oa as Kt,S as qt,Sa as Jt,T as Yt,_t as Xt,b as Zt,br as Qt,ft as $t,gt as en,ht as tn,j as nn,k as rn,ka as an,kn as on,mt as sn,pt as cn,vt as ln,w as un,wa as dn,x as fn,yr as pn,yt as mn}from"./control-ui-boot-shared-DfZ39Yj9.js";import{B as L,G as hn,Gt as gn,H as _n,J as R,K as vn,L as z,Q as B,R as yn,V as bn,W as xn,X as V,Z as Sn,et as H,jr as Cn,nt as wn,q as Tn,qt as En,rt as Dn,tt as U,z as W}from"./control-ui-boot-chat-_QSl8fbH.js";import{Bt as On,Ft as kn,It as An,Lt as jn,Rt as Mn,hs as Nn,ms as Pn,ui as Fn}from"./control-ui-boot-shared-CXVvK2AW.js";import{t as In}from"./update-run-view-DVwiT6Fy.js";import{n as Ln,t as Rn}from"./en-settings-D_ebb5Hk.js";import{D as zn}from"./control-ui-boot-new-Bj2SAUyl.js";import{a as Bn,i as Vn}from"./control-ui-boot-chat-Bia0O-uD.js";import{i as Hn,n as Un,t as Wn}from"./select-picker-BNhpItgu.js";import{_ as Gn,a as Kn,c as qn,d as Jn,f as Yn,g as Xn,l as Zn,m as Qn,n as $n,o as er,p as G,r as tr,s as nr,t as rr}from"./setup-schema-BzY-uJ6H.js";import{a as ir,t as ar}from"./settings-targets-BmloFKW8.js";import{n as or,t as sr}from"./hub-tabs-DLM-pY5z.js";import{n as cr,t as lr}from"./settings-workspace-Bseic8Tf.js";import{a as ur,c as dr,n as fr,o as pr,s as mr,t as hr}from"./tool-catalog-4WDY1rLB.js";import{n as gr,t as _r}from"./model-picker-CB45-l8O.js";import{a as vr,c as yr,d as br,f as xr,h as Sr,m as Cr,n as wr,p as Tr,s as Er,t as Dr}from"./config-form-LQdB5j_F.js";import{n as Or,r as kr,t as Ar}from"./system-info-B4YQhtbY.js";import{n as jr,t as Mr}from"./en-memory-import-CaHj1BLH.js";function Nr(e){return H({title:I(`browserLinkPreferences.openInControlUi`),checked:e.enabled,onChange:e.onChange})}function Pr(){return(Pr=e((()=>{z(),F()})))()}var Fr,Ir;function Lr(){return(Lr=e((()=>{v(),Fr={url:``,busy:!1,message:null,expanded:!1,focusToken:0},Ir=class{constructor(e){this.publish=e,this.requestRevision=0,this.activationIntent={revision:0,theme:null},this.gatewayScope=``,this.serverSelectionRevision=0,this.state=Fr}get snapshot(){return this.state}connect(e,t){this.gatewayScope=e,this.serverSelectionRevision=this.selectionForScope(e,t)?.revision??0}synchronizeScope(e,t){this.gatewayScope&&e!==this.gatewayScope&&this.retireImport(),this.connect(e,t)}adoptSettings(e,t,n){let r=this.selectionForScope(this.gatewayScope,n),i=this.serverSelectionRevision!==(r?.revision??0);return this.serverSelectionRevision=r?.revision??0,t.customTheme?.importedAt===e.customTheme?.importedAt?(i&&this.recordActivation(r?.theme??null),t.theme!==e.theme&&this.recordActivation(t.theme),t):(this.retireImport(),t)}recordActivation(e){this.activationIntent={revision:this.activationIntent.revision+1,theme:e}}open(){this.update({expanded:!0,focusToken:this.state.focusToken+1})}setUrl(e){e!==this.state.url&&this.retireImport(),this.update({url:e,...this.state.message?.kind===`error`?{message:null}:{}})}retireForConfigMutation(e){this.state.busy&&(this.retireImport(),this.update({message:{kind:`error`,text:e}}))}async import(e){let t=this.blockedReason(e.config);if(t){this.update({expanded:!0,message:{kind:`error`,text:e.messages.blocked(t)}});return}let n=this.beginImport(),r=this.state.url;this.update({expanded:!0,busy:!0,message:null});try{let t=await e.load(r);if(!this.ownsImport(n))return;e.apply(t,!e.hasCustomTheme&&this.mayActivate(n)),this.update({url:``,message:{kind:`success`,text:e.messages.imported(t.label)}})}catch(e){if(!this.ownsImport(n))return;this.update({message:{kind:`error`,text:h(e)}})}finally{this.ownsImport(n)&&this.update({busy:!1})}}clear(e){this.retireImport(),e.apply(),this.update({expanded:!0,message:{kind:`success`,text:e.message}})}retireImport(){this.requestRevision+=1,this.state.busy&&this.update({busy:!1})}beginImport(){return this.requestRevision+=1,{requestRevision:this.requestRevision,activationRevision:this.activationIntent.revision}}ownsImport(e){return e.requestRevision===this.requestRevision}mayActivate(e){return e.activationRevision===this.activationIntent.revision||this.activationIntent.theme===`custom`}blockedReason(e){return e.connected&&(e.configLoading||!e.configSnapshot)?`loading`:e.configFormDirty||e.configSaving||e.configApplying||e.configAutoSaveStatus===`saving`?`unsaved`:null}update(e){this.state={...this.state,...e},this.publish(this.state)}selectionForScope(e,t){return t?.scope===e?t:null}}})))()}function Rr(e){let t=e.split(`/`).filter(Boolean),n=t.at(-1);return n&&(t.length===2&&t[0]===`themes`||t.length===3&&t[0]===`r`&&t[1]===`themes`)?(yt(n),n):null}function zr(e){let t=l(e);if(!t)throw Error(`Paste a tweakcn theme link to import.`);let n=t.replace(/[.,;:]+$/,``);return _t.test(n)?`https://tweakcn.com/themes/${n}`:n.startsWith(`/themes/`)||n.startsWith(`/r/themes/`)?`https://tweakcn.com${n}`:/^(?:www\.)?tweakcn\.com\//i.test(n)?`https://${n}`:n.match(/https?:\/\/(?:www\.)?tweakcn\.com\/[^\s<>"')]+/i)?.[0]?.replace(/[.,;:]+$/,``)??n}function Br(e){let t=Rr(e.pathname);if(t)return t;let n=e.searchParams.get(`theme`)??e.searchParams.get(`themeId`)??e.searchParams.get(`id`);if(n)return yt(n),n;throw Error(`Unsupported tweakcn link. Expected a theme share URL.`)}function Vr(e,t){let n=Fe(e,t),r=n.toLowerCase();if(ei.has(r)||ni.test(n)||ti.test(n))return n;throw Error(`Unsupported tweakcn token: ${t}`)}function Hr(e,t){return t===`font-sans`||t===`font-mono`?Oe(e,t):Vr(e,t)}function K(e,t,n,r){let i=l(e[n]);if(i)return Hr(i,n);let a=l(t?.[n]);if(a)return Hr(a,n);if(r!=null)return n===`font-sans`||n===`font-mono`?Oe(r,n):Fe(r,n);throw Error(`tweakcn theme is missing required token: ${n}`)}function Ur(e,t,n){let r=e===`light`,i=r?`black`:`white`,a=K(t,n,`background`),o=K(t,n,`foreground`),s=K(t,n,`card`),c=K(t,n,`card-foreground`),l=K(t,n,`popover`),u=K(t,n,`popover-foreground`),d=K(t,n,`primary`),f=K(t,n,`primary-foreground`),p=K(t,n,`secondary`),m=K(t,n,`secondary-foreground`),h=K(t,n,`muted`),g=K(t,n,`muted-foreground`),_=K(t,n,`accent`),v=K(t,n,`accent-foreground`),y=K(t,n,`destructive`),b=K(t,n,`destructive-foreground`),ee=K(t,n,`border`),te=K(t,n,`input`),ne=K(t,n,`ring`),re=K(t,n,`font-sans`,Qr),ie=K(t,n,`font-mono`,$r);return xt([[`bg`,a],[`bg-accent`,`color-mix(in srgb, var(--bg) 88%, var(--card) 12%)`],[`bg-elevated`,s],[`bg-hover`,`color-mix(in srgb, var(--muted) 68%, var(--bg) 32%)`],[`bg-muted`,h],[`bg-content`,`color-mix(in srgb, var(--bg) 92%, var(--card) 8%)`],[`card`,s],[`card-foreground`,c],[`card-highlight`,`color-mix(in srgb, var(--text) ${r?`3`:`5`}%, transparent)`],[`popover`,l],[`popover-foreground`,u],[`panel`,a],[`panel-strong`,s],[`panel-hover`,`color-mix(in srgb, var(--card) 76%, var(--muted) 24%)`],[`chrome`,`color-mix(in srgb, var(--bg) 96%, transparent)`],[`chrome-strong`,`color-mix(in srgb, var(--bg) 98%, transparent)`],[`text`,o],[`text-strong`,o],[`chat-text`,o],[`muted`,g],[`muted-strong`,`color-mix(in srgb, var(--muted) 84%, var(--text) 16%)`],[`muted-foreground`,g],[`border`,ee],[`border-strong`,`color-mix(in srgb, var(--border) 72%, var(--text) 28%)`],[`border-hover`,`color-mix(in srgb, var(--border) 55%, var(--text) 45%)`],[`input`,te],[`ring`,ne],[`accent`,_],[`accent-hover`,`color-mix(in srgb, var(--accent) 82%, ${i} 18%)`],[`accent-muted`,_],[`accent-subtle`,`color-mix(in srgb, var(--accent) ${r?`10`:`16`}%, transparent)`],[`accent-foreground`,v],[`accent-glow`,`color-mix(in srgb, var(--accent) ${r?`18`:`30`}%, transparent)`],[`primary`,d],[`primary-foreground`,f],[`secondary`,p],[`secondary-foreground`,m],[`accent-2`,d],[`accent-2-muted`,`color-mix(in srgb, var(--accent-2) 72%, transparent)`],[`accent-2-subtle`,`color-mix(in srgb, var(--accent-2) ${r?`8`:`12`}%, transparent)`],[`destructive`,y],[`destructive-foreground`,b],[`danger`,y],[`danger-muted`,`color-mix(in srgb, var(--danger) 75%, transparent)`],[`danger-subtle`,`color-mix(in srgb, var(--danger) ${r?`8`:`12`}%, transparent)`],[`focus`,`color-mix(in srgb, var(--ring) ${r?`14`:`22`}%, transparent)`],[`focus-ring`,`0 0 0 2px var(--bg), 0 0 0 3px color-mix(in srgb, var(--ring) ${r?`70`:`80`}%, transparent)`],[`focus-glow`,`0 0 0 2px var(--bg), 0 0 0 3px var(--ring), 0 0 16px var(--accent-glow)`],[`font-body`,re],[`font-display`,re],[`mono`,ie],[`grid-line`,`color-mix(in srgb, var(--text) ${r?`4`:`3`}%, transparent)`]])}function Wr(e){let t=zr(e),n;try{n=new URL(t)}catch{throw Error(`Paste a full tweakcn URL.`)}if(!Yr.has(n.hostname))throw Error(`Only tweakcn.com theme links are supported.`);let r=Br(n);return{themeId:r,sourceUrl:`https://tweakcn.com/themes/${r}`,fetchUrl:`https://tweakcn.com/r/themes/${r}`}}function Gr(e,t){let n=s(e),r=s(n?.cssVars),i=s(r?.light),a=s(r?.dark),o=r?.theme===void 0?void 0:s(r.theme);if(!n||!r||!i||!a||o===null)throw Error(`tweakcn returned an invalid theme payload.`);return{sourceUrl:t.sourceUrl,themeId:t.themeId,label:St(l(n.name)),importedAt:new Date().toISOString(),light:Ur(`light`,i,o),dark:Ur(`dark`,a,o)}}function Kr(e){if(!e)return;let t;try{t=new URL(e)}catch{throw Error(`Unexpected tweakcn import response URL.`)}if(t.protocol!==`https:`||!Yr.has(t.hostname))throw Error(`Unexpected redirect during tweakcn import.`)}async function qr(e){let t=await Cn(e,{maxBytes:Xr,tooLargeMessage:`tweakcn theme payload is too large.`,missingBodyMessage:`tweakcn returned an unreadable theme payload.`});try{return JSON.parse(t)}catch{throw Error(`tweakcn returned invalid JSON.`)}}async function Jr(e,t=fetch){let n=Wr(e),r=new AbortController,i=setTimeout(()=>r.abort(),Zr);try{let e=await t(n.fetchUrl,{headers:{accept:`application/json`},redirect:`error`,signal:r.signal});if(Kr(e.url),!e.ok)throw Error(`tweakcn import failed (${e.status}).`);return Gr(await qr(e),n)}catch(e){throw r.signal.aborted?Error(`tweakcn import timed out.`,{cause:e}):e}finally{clearTimeout(i)}}var Yr,Xr,Zr,Qr,$r,ei,ti,ni;function ri(){return(ri=e((()=>{qe(),Yr=new Set([`tweakcn.com`,`www.tweakcn.com`]),Xr=2e5,Zr=1e4,Qr=`"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,$r=`"JetBrains Mono", ui-monospace, SFMono-Regular, "SF Mono", Menlo, Monaco, Consolas, monospace`,ei=new Set([`black`,`white`,`transparent`,`currentcolor`]),ti=/^(?:rgb|rgba|hsl|hsla|hwb|lab|lch|oklab|oklch)\([a-z0-9+\-.,/%\s]+\)$/i,ni=/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i})))()}function ii(e){return/^[A-Za-z0-9._:/-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`}function ai(e){switch(e){case`verify-off`:return I(`mcpPage.tlsVerifyOff`);case`mtls`:return I(`mcpPage.mtls`);default:return null}}var q;function oi(){return(oi=e((()=>{d(),O(),D(),Ve(),st(),F(),C(),en(),v(),y(),p(),Ct(),wn(),z(),q=class extends S{constructor(...e){super(...e),this.pluginsHref=``,this.docsUrl=`https://docs.openclaw.ai/tools/mcp`,this.rows=null,this.busy=!1,this.message=null,this.formOpen=!1,this.feedbackGeneration=0,this.subscriptions=new xe(this).effect(()=>this.context?.runtimeConfig,e=>{let t=this.feedbackGeneration;this.syncRows(),e.ensureLoaded().catch(n=>{t!==this.feedbackGeneration||!this.isConnected||e!==this.context?.runtimeConfig||(this.message={kind:`error`,text:h(n)})});let n=e.subscribe(()=>this.syncRows());return()=>{this.feedbackGeneration+=1,this.busy=!1,this.message=null,n()}}).effect(()=>this.context?.gateway,e=>e.subscribe(()=>this.requestUpdate()))}disconnectedCallback(){this.subscriptions.clear(),super.disconnectedCallback()}syncRows(){let e=this.context?.runtimeConfig.state.configSnapshot;this.rows=mn(ve(e))}mutationBlockedReason(){let e=this.context?.gateway;return e?.snapshot.phase===`connected`?Be(e.snapshot.hello?.auth??null)?null:I(`mcpServers.adminRequired`):I(`mcpServers.connectRequired`)}canMutate(){return this.context!==void 0&&this.mutationBlockedReason()===null}async mutate(e){if(!this.context||!this.canMutate()||this.busy)return!1;let t=this.feedbackGeneration;this.busy=!0,this.message=null;let n=await ln(this.context.runtimeConfig,e);return t===this.feedbackGeneration&&(this.busy=!1,n.ok?(this.syncRows(),this.message={kind:`success`,text:e.successText},!0):(this.message={kind:`error`,text:n.error},!1))}async addServer(e){let t=e.name.trim();if(!$t.test(t)){this.message={kind:`error`,text:I(`mcpServers.nameInvalid`)};return}let n=Xt(e.target,e.transport);if(!n){this.message={kind:`error`,text:I(`mcpServers.targetInvalid`)};return}await this.mutate({buildPatch:e=>cn(e,t,n),note:`mcp settings: add server ${t}`,successText:I(`mcpServers.addedSuccess`,{name:t})})&&(this.formOpen=!1)}async toggleServer(e,t){await this.mutate({buildPatch:n=>tn(n,e,t),note:`mcp settings: ${t?`enable`:`disable`} server ${e}`,successText:I(t?`mcpServers.enabledSuccess`:`mcpServers.disabledSuccess`,{name:e})})}async removeServer(e){await this.mutate({buildPatch:t=>sn(t,e),note:`mcp settings: remove server ${e}`,successText:I(`mcpServers.removedSuccess`,{name:e})})}renderRow(e){let t=`openclaw mcp ${e.auth===`oauth`?`login`:`probe`} ${ii(e.name)}`,n=[e.transport,e.auth,e.toolFilter?I(`mcpPage.toolFilter`):null,e.parallel?I(`mcpPage.parallel`):null,ai(e.tls)].filter(e=>!!e),r=this.mutationBlockedReason(),i=this.busy||!this.canMutate();return k`
<div class="settings-row mcp-server-row" data-mcp-name=${e.name}>
<div class="settings-row__text">
<span class="settings-row__title">${e.name}</span>
<span class="settings-row__desc mcp-server-row__launch">
${e.target||I(`mcpServers.missingTransport`)}
</span>
<span class="settings-row__desc">${n.join(` · `)}</span>
</div>
<div class="settings-row__control">
${B({kind:e.enabled?`ok`:`muted`,label:e.enabled?I(`common.enabled`):I(`common.disabled`)})}
<code>${t}</code>
<button
type="button"
class="btn btn--sm"
title=${r??``}
?disabled=${i}
@click=${()=>void this.toggleServer(e.name,!e.enabled)}
>
${this.busy?I(`mcpServers.working`):e.enabled?I(`mcpServers.disable`):I(`mcpServers.enable`)}
</button>
<button
type="button"
class="btn btn--sm btn--icon mcp-server-remove"
aria-label=${I(`mcpServers.removeNamed`,{name:e.name})}
title=${r??I(`mcpServers.removeNamed`,{name:e.name})}
?disabled=${i}
@click=${()=>void this.removeServer(e.name)}
>
${P.trash}
</button>
</div>
</div>
`}render(){let e=this.mutationBlockedReason(),t=this.rows,n=t?t.length===0?bn(k`
${I(`mcpPage.noServers`)} ${yn(this.docsUrl,I(`mcpPage.setUpFirstServer`))}
`):t.map(e=>this.renderRow(e)):xn({rows:2});return k`
<div class="mcp-server-list">
${V({title:I(`mcpPage.configuredServers`),description:k`
${I(`mcpPage.runtimeHint`)} ${W(this.pluginsHref)}
`,actions:k`
<button
type="button"
class="btn btn--sm"
title=${e??``}
?disabled=${this.busy||!this.canMutate()}
@click=${()=>{this.formOpen=!this.formOpen,this.formOpen&&(this.message=null)}}
>
<span aria-hidden="true">${P.plus}</span>
${I(`mcpServers.add`)}
</button>
`},k`
${this.formOpen?Dn({busy:this.busy,disabled:!this.canMutate(),blockedReason:e,onSubmit:e=>void this.addServer(e),onCancel:()=>{this.formOpen=!1}}):j}
${this.message?k`<div
class="mcp-server-message mcp-server-message--${this.message.kind}"
role=${this.message.kind===`error`?`alert`:`status`}
>
${this.message.text}
</div>`:j}
${n}
`)}
</div>
`}},u([a({context:Qe,subscribe:!0})],q.prototype,`context`,void 0),u([M()],q.prototype,`pluginsHref`,void 0),u([M()],q.prototype,`docsUrl`,void 0),u([A()],q.prototype,`rows`,void 0),u([A()],q.prototype,`busy`,void 0),u([A()],q.prototype,`message`,void 0),u([A()],q.prototype,`formOpen`,void 0),customElements.get(`openclaw-mcp-servers-card`)||customElements.define(`openclaw-mcp-servers-card`,q)})))()}function si(e){let t=mn(e.configObject)??[],n=t.filter(e=>e.enabled).length,r=t.filter(e=>e.auth===`oauth`).length,i=t.filter(e=>e.toolFilter).length;return k`
<section class="mcp-page">
<div class="settings-page">
<section class="settings-section mcp-page__summary">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`mcpPage.servers`)}</h2>
</div>
<div class="settings-group">
${R({title:I(`mcpPage.servers`),control:U(t.length)})}
${R({title:I(`common.enabled`),control:U(n)})}
${R({title:I(`mcpPage.oauth`),control:U(r)})}
${R({title:I(`mcpPage.filtered`),control:U(i)})}
</div>
</section>
<section class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`mcpPage.operatorCommands`)}</h2>
</div>
<p class="settings-section__desc">${I(`mcpPage.operatorCommandsHint`)}</p>
<div class="settings-group">
<div class="settings-row settings-row--stacked">
<div class="mcp-command-card__grid">
<code>openclaw mcp status --verbose</code>
<code>openclaw mcp doctor --probe</code>
<code>openclaw mcp login <name></code>
<code>openclaw mcp reload</code>
</div>
</div>
</div>
</section>
<openclaw-mcp-servers-card
.pluginsHref=${e.pluginsHref}
.docsUrl=${ci}
></openclaw-mcp-servers-card>
</div>
${e.editor}
</section>
`}var ci;function li(){return(li=e((()=>{O(),oi(),z(),F(),en(),ci=`https://docs.openclaw.ai/tools/mcp`})))()}var ui;function di(){return(di=e((()=>{O(),D(),y(),ur(),ui=class extends S{constructor(...e){super(...e),this.agentId=null}render(){return k`
${this.agentId?k`<openclaw-agent-memory-panel
.agentId=${this.agentId}
></openclaw-agent-memory-panel>`:j}
`}},u([M()],ui.prototype,`agentId`,void 0),customElements.get(`openclaw-memory-dreaming`)||customElements.define(`openclaw-memory-dreaming`,ui)})))()}function fi(e,t){return`${t}:${e.path}:${e.startLine}:${e.endLine}`}function pi(e){let t=e.path.replaceAll(`\\`,`/`),n=!t.startsWith(`/`)&&!t.startsWith(`sessions/`)&&!/^[a-zA-Z]:\//.test(t)&&t.split(`/`).every(e=>e&&e!==`.`&&e!==`..`),r=t===`MEMORY.md`||t.startsWith(`memory/`);return e.source===`memory`&&n&&r}function mi(e,t){let n=e.split(/\r?\n/),r=Math.max(0,t.startLine-1),i=Math.min(n.length,t.endLine),a=n.slice(0,r),o=n.slice(r,i),s=n.slice(i);return k`<pre class="memory-memories__file" tabindex="0"><span
>${a.join(`
`)}${a.length?`
`:``}</span
><mark data-memory-match="true">${o.join(`
`)}</mark
><span>${s.length?`\n${s.join(`
`)}`:``}</span></pre>`}var J;function hi(){return(hi=e((()=>{O(),D(),F(),v(),y(),J=class extends S{constructor(...e){super(...e),this.client=null,this.connected=!1,this.methodAdvertised=!0,this.agentId=null,this.query=``,this.searchState={kind:`idle`},this.openResultKey=null,this.details=new Map,this.searchRequest=null,this.detailRequests=new Map}updated(e){(e.has(`agentId`)||e.has(`client`)||e.has(`connected`)||e.has(`methodAdvertised`))&&this.resetSearch()}resetSearch(){this.searchRequest=null,this.detailRequests.clear(),this.query=``,this.searchState={kind:`idle`},this.openResultKey=null,this.details=new Map}async search(e){let t=e.trim(),n=this.connected?this.client:null,r=this.agentId;if(!t||!n||!r||!this.methodAdvertised)return;let i={client:n,agentId:r,query:t};this.searchRequest=i,this.query=t,this.searchState={kind:`loading`,query:t},this.openResultKey=null,this.details=new Map,this.detailRequests.clear();try{let e=await n.request(`memory.search`,{query:t,agentId:r});if(this.searchRequest!==i||this.agentId!==r||this.client!==n)return;this.searchState={kind:`ready`,query:t,...e}}catch(e){if(this.searchRequest!==i||this.agentId!==r||this.client!==n)return;this.searchState={kind:`error`,query:t,message:h(e)}}}toggleResult(e,t){let n=fi(e,t);if(this.openResultKey===n){this.openResultKey=null;return}this.openResultKey=n,this.details.has(n)||this.loadDetail(n,e)}async loadDetail(e,t){let n=this.connected?this.client:null,r=this.agentId;if(!n||!r)return;let i={client:n,agentId:r,path:t.path};this.detailRequests.set(e,i),this.details=new Map(this.details).set(e,{kind:`loading`});try{let a=await n.request(`agents.workspace.get`,{agentId:r,path:t.path});if(this.detailRequests.get(e)!==i||this.agentId!==r)return;let o=a.file.encoding===`utf8`?{kind:`ready`,content:a.file.content}:{kind:`error`,message:I(`memoryPage.memories.fileUnsupported`)};this.details=new Map(this.details).set(e,o)}catch(t){if(this.detailRequests.get(e)!==i||this.agentId!==r)return;this.details=new Map(this.details).set(e,{kind:`error`,message:h(t)})}finally{this.detailRequests.get(e)===i&&this.detailRequests.delete(e)}}renderDetail(e,t,n){if(this.openResultKey!==e)return j;let r=this.details.get(e);return k`<div id=${t} class="memory-memories__detail">
${!r||r.kind===`loading`?k`<p role="status">${I(`memoryPage.memories.fileLoading`)}</p>`:r.kind===`error`?k`<p class="memory-memories__detail-error" role="alert">
${I(`memoryPage.memories.fileError`,{message:r.message})}
</p>`:mi(r.content,n)}
</div>`}renderResults(e){let t=e.searchMode===`hybrid`?I(`memoryPage.memories.hybridSearch`):I(`memoryPage.memories.keywordSearch`);return k`
<div class="memory-memories__results-heading">
<span>${I(`memoryPage.memories.results`,{count:String(e.results.length)})}</span>
<span class="memory-memories__mode">${t}</span>
</div>
${e.results.length===0?k`<p class="memory-memories__state">
${I(`memoryPage.memories.empty`,{query:e.query})}
</p>`:k`<div class="settings-group memory-memories__results">
${e.results.map((e,t)=>{let n=fi(e,t),r=this.openResultKey===n,i=pi(e),a=`memory-detail-${t}`,o=k`
<span class="settings-row__text">
<span class="settings-row__title">${e.snippet}</span>
<span class="settings-row__desc memory-memories__path"
>${e.path} ·
${I(`memoryPage.memories.lineRange`,{start:String(e.startLine),end:String(e.endLine)})}</span
>
</span>
<span class="settings-row__control memory-memories__meta">
<span class="memory-memories__source"
>${I(e.source===`sessions`?`memoryPage.memories.sourceSessions`:`memoryPage.memories.sourceMemory`)}</span
>
<span
>${I(`memoryPage.memories.score`,{score:e.score.toFixed(2)})}</span
>
</span>
`;return k`<article class="memory-memories__result">
${i?k`<button
type="button"
class="settings-row settings-row--nav"
aria-expanded=${String(r)}
aria-controls=${a}
@click=${()=>this.toggleResult(e,t)}
>
${o}
</button>`:k`<div class="settings-row">${o}</div>`}
${i?this.renderDetail(n,a,e):j}
</article>`})}
</div>`}
`}renderSearchState(){switch(this.searchState.kind){case`loading`:return k`<p class="memory-memories__state" role="status">
${I(`memoryPage.memories.searching`)}
</p>`;case`error`:{let e=this.searchState;return k`<div class="memory-memories__state" role="alert">
<p>${I(`memoryPage.memories.error`,{message:e.message})}</p>
<button class="btn btn--sm" @click=${()=>void this.search(e.query)}>
${I(`memoryPage.memories.retry`)}
</button>
</div>`}case`ready`:return this.renderResults(this.searchState);default:return k`<p class="memory-memories__state">${I(`memoryPage.memories.idle`)}</p>`}}render(){return k`<div class="settings-page memory-memories">
${this.methodAdvertised?k`<form
class="memory-memories__search"
role="search"
@submit=${e=>{e.preventDefault(),this.search(this.query)}}
>
<label class="settings-control__sr-label" for="memory-search-input"
>${I(`memoryPage.memories.searchLabel`)}</label
>
<input
id="memory-search-input"
type="search"
class="settings-input"
.value=${this.query}
placeholder=${I(`memoryPage.memories.searchPlaceholder`)}
@input=${e=>{this.query=e.currentTarget.value}}
/>
<button
class="btn btn--sm primary"
type="submit"
?disabled=${!this.connected||!this.agentId||!this.query.trim()||this.searchState.kind===`loading`}
>
${I(`memoryPage.memories.searchButton`)}
</button>
</form>
${this.renderSearchState()}`:k`<p class="memory-memories__unavailable">
${I(`memoryPage.memories.gatewayUpdateRequired`)}
</p>`}
</div>`}},u([M({attribute:!1})],J.prototype,`client`,void 0),u([M({type:Boolean})],J.prototype,`connected`,void 0),u([M({type:Boolean})],J.prototype,`methodAdvertised`,void 0),u([M()],J.prototype,`agentId`,void 0),u([A()],J.prototype,`query`,void 0),u([A()],J.prototype,`searchState`,void 0),u([A()],J.prototype,`openResultKey`,void 0),u([A()],J.prototype,`details`,void 0),customElements.get(`openclaw-memory-memories`)||customElements.define(`openclaw-memory-memories`,J)})))()}function gi(e,t){return[`plugins`,`entries`,e,`config`,`dreaming`,...t]}function _i(e){let t=s(e?.agents),n=s(t?.defaults)?.userTimezone;return typeof n==`string`&&n.trim()?n.trim():null}function vi(){return(vi=e((()=>{})))()}function yi(e,t){let n=e;for(let[e,r]of t.entries()){if(!n)return;let i=n[r];if(e===t.length-1)return i;n=s(i)}}function bi(e,t){let n=e;for(let[e,r]of t.entries()){if(!n||!Object.hasOwn(n,r))return!1;if(e===t.length-1)return!0;n=s(n[r])}return!1}function xi(e){return ji.find(t=>t===e)??Mi}function Si(e){let t=yi(e,[`execution`,`defaults`,`model`]);return typeof t==`string`&&t.trim()?t.trim():I(`memoryPage.dreaming.model.default`)}function Ci(e,t){let n=Number(e);return!Number.isFinite(n)||n<t.min||t.integer&&!Number.isInteger(n)||t.max!==void 0&&n>t.max?null:n}function wi(e,t){let n=yi(e.dreaming,t.path),r=bi(e.dreaming,t.path),i=t.kind===`toggle`?t.fallback?I(`common.enabled`):I(`common.disabled`):t.kind===`number`?String(t.defaultValue):t.path[0]===`timezone`?e.timezoneDefault??I(`memoryPage.dreaming.timezone.default`):t.path[0]===`model`?Si(e.dreaming):t.defaultValue?t.defaultValue:t.defaultLabelKey?I(t.defaultLabelKey):``,a=L(i,r);if(t.kind===`toggle`)return H({title:I(t.labelKey),description:k`${I(t.helpKey)} ${a}`,checked:typeof n==`boolean`?n:t.fallback,disabled:e.disabled,onChange:n=>e.onPatch(t.path,n)});let o=t.kind===`number`?typeof n==`number`?String(n):``:typeof n==`string`?n:``,s=t.kind===`number`?t.bounds:null;if(t.kind===`text`&&t.path[0]===`model`){let n=dn(i);return R({title:I(t.labelKey),description:k`${I(t.helpKey)} ${a}`,control:gr({label:I(t.labelKey),value:o,options:[{value:``,label:i,...n?{provider:n}:{}}],disabled:e.disabled,custom:{label:I(`cron.form.customModel`),placeholder:t.placeholderKey?I(t.placeholderKey):``,commit:`change`},onChange:n=>e.onPatch(t.path,n.trim()||void 0)})})}return R({title:I(t.labelKey),description:k`${I(t.helpKey)} ${a}`,control:k`
<input
class="settings-input"
type=${t.kind===`number`?`number`:`text`}
min=${s?String(s.min):j}
max=${s?.max===void 0?j:String(s.max)}
step=${s?s.integer?`1`:`any`:j}
spellcheck="false"
aria-label=${I(t.labelKey)}
?disabled=${e.disabled}
.value=${o}
placeholder=${i}
@change=${n=>{let r=n.currentTarget,i=r.value.trim();if(!i){e.onPatch(t.path,void 0);return}if(s){let n=Ci(i,s);if(n===null){r.value=o;return}e.onPatch(t.path,n);return}e.onPatch(t.path,i)}}
/>
`})}function Ti(e){let t=xi(yi(e.dreaming,[`storage`,`mode`])),n=L(I(`memoryPage.dreaming.storage.modes.separate`),bi(e.dreaming,[`storage`,`mode`]));return k`
${V({title:I(`memoryPage.dreaming.schedule.title`),description:I(`memoryPage.dreaming.schedule.description`)},ki.map(t=>wi(e,t)))}
${V({title:I(`memoryPage.dreaming.storage.title`),description:I(`memoryPage.dreaming.storage.description`)},k`
${R({title:I(`memoryPage.dreaming.storage.modeLabel`),description:k`
${I(`memoryPage.dreaming.storage.modeHelp`)} ${n}
`,stacked:!0,control:Sn({value:t,options:ji.map(e=>({value:e,label:I(`memoryPage.dreaming.storage.modes.${e}`)})),ariaLabel:I(`memoryPage.dreaming.storage.modeLabel`),disabled:e.disabled,onChange:t=>e.onPatch([`storage`,`mode`],t)})})}
${wi(e,{kind:`toggle`,path:[`storage`,`separateReports`],labelKey:`memoryPage.dreaming.storage.separateReportsLabel`,helpKey:`memoryPage.dreaming.storage.separateReportsHelp`,fallback:!1})}
`)}
${Ai.map(t=>V({title:I(t.titleKey),description:I(t.descriptionKey)},t.fields.map(t=>wi(e,t))))}
`}function Ei(e){return V({title:I(`memoryPage.dreaming.unsupported.title`)},R({title:I(`memoryPage.dreaming.unsupported.rowTitle`),description:I(`memoryPage.dreaming.unsupported.description`,{plugin:e})}))}var Y,Di,Oi,ki,Ai,ji,Mi;function Ni(){return(Ni=e((()=>{O(),_r(),Jt(),z(),F(),Y={integer:!0,min:0},Di={integer:!0,min:1},Oi={integer:!1,min:0,max:1},ki=[{kind:`text`,path:[`frequency`],labelKey:`memoryPage.dreaming.frequency.label`,helpKey:`memoryPage.dreaming.frequency.help`,placeholderKey:`memoryPage.dreaming.frequency.placeholder`,defaultValue:`0 3 * * *`},{kind:`text`,path:[`timezone`],labelKey:`memoryPage.dreaming.timezone.label`,helpKey:`memoryPage.dreaming.timezone.help`,placeholderKey:`memoryPage.dreaming.timezone.placeholder`},{kind:`text`,path:[`model`],labelKey:`memoryPage.dreaming.model.label`,helpKey:`memoryPage.dreaming.model.help`,placeholderKey:`memoryPage.dreaming.model.placeholder`,defaultLabelKey:`memoryPage.dreaming.model.default`},{kind:`toggle`,path:[`verboseLogging`],labelKey:`memoryPage.dreaming.verboseLogging.label`,helpKey:`memoryPage.dreaming.verboseLogging.help`,fallback:!1}],Ai=[{titleKey:`memoryPage.dreaming.phases.light.title`,descriptionKey:`memoryPage.dreaming.phases.light.description`,fields:[{kind:`toggle`,path:[`phases`,`light`,`enabled`],labelKey:`memoryPage.dreaming.phaseFields.enabled`,helpKey:`memoryPage.dreaming.phaseFields.enabledHelp`,fallback:!0},{kind:`number`,path:[`phases`,`light`,`lookbackDays`],labelKey:`memoryPage.dreaming.phaseFields.lookbackDays`,helpKey:`memoryPage.dreaming.phaseFields.lookbackDaysHelp`,bounds:Y,defaultValue:2},{kind:`number`,path:[`phases`,`light`,`limit`],labelKey:`memoryPage.dreaming.phaseFields.limit`,helpKey:`memoryPage.dreaming.phaseFields.limitHelp`,bounds:Y,defaultValue:100},{kind:`number`,path:[`phases`,`light`,`dedupeSimilarity`],labelKey:`memoryPage.dreaming.phaseFields.dedupeSimilarity`,helpKey:`memoryPage.dreaming.phaseFields.dedupeSimilarityHelp`,bounds:Oi,defaultValue:.9}]},{titleKey:`memoryPage.dreaming.phases.deep.title`,descriptionKey:`memoryPage.dreaming.phases.deep.description`,fields:[{kind:`toggle`,path:[`phases`,`deep`,`enabled`],labelKey:`memoryPage.dreaming.phaseFields.enabled`,helpKey:`memoryPage.dreaming.phaseFields.enabledHelp`,fallback:!0},{kind:`number`,path:[`phases`,`deep`,`limit`],labelKey:`memoryPage.dreaming.phaseFields.limit`,helpKey:`memoryPage.dreaming.phaseFields.limitHelp`,bounds:Y,defaultValue:10},{kind:`number`,path:[`phases`,`deep`,`minScore`],labelKey:`memoryPage.dreaming.phaseFields.minScore`,helpKey:`memoryPage.dreaming.phaseFields.minScoreHelp`,bounds:Oi,defaultValue:.75},{kind:`number`,path:[`phases`,`deep`,`minRecallCount`],labelKey:`memoryPage.dreaming.phaseFields.minRecallCount`,helpKey:`memoryPage.dreaming.phaseFields.minRecallCountHelp`,bounds:Y,defaultValue:3},{kind:`number`,path:[`phases`,`deep`,`minUniqueQueries`],labelKey:`memoryPage.dreaming.phaseFields.minUniqueQueries`,helpKey:`memoryPage.dreaming.phaseFields.minUniqueQueriesHelp`,bounds:Y,defaultValue:3},{kind:`number`,path:[`phases`,`deep`,`recencyHalfLifeDays`],labelKey:`memoryPage.dreaming.phaseFields.recencyHalfLifeDays`,helpKey:`memoryPage.dreaming.phaseFields.recencyHalfLifeDaysHelp`,bounds:Y,defaultValue:14},{kind:`number`,path:[`phases`,`deep`,`maxAgeDays`],labelKey:`memoryPage.dreaming.phaseFields.maxAgeDays`,helpKey:`memoryPage.dreaming.phaseFields.maxAgeDaysHelp`,bounds:Di,defaultValue:30},{kind:`number`,path:[`phases`,`deep`,`maxPromotedSnippetTokens`],labelKey:`memoryPage.dreaming.phaseFields.maxPromotedSnippetTokens`,helpKey:`memoryPage.dreaming.phaseFields.maxPromotedSnippetTokensHelp`,bounds:Di,defaultValue:160}]},{titleKey:`memoryPage.dreaming.phases.rem.title`,descriptionKey:`memoryPage.dreaming.phases.rem.description`,fields:[{kind:`toggle`,path:[`phases`,`rem`,`enabled`],labelKey:`memoryPage.dreaming.phaseFields.enabled`,helpKey:`memoryPage.dreaming.phaseFields.enabledHelp`,fallback:!0},{kind:`number`,path:[`phases`,`rem`,`lookbackDays`],labelKey:`memoryPage.dreaming.phaseFields.lookbackDays`,helpKey:`memoryPage.dreaming.phaseFields.lookbackDaysHelp`,bounds:Y,defaultValue:7},{kind:`number`,path:[`phases`,`rem`,`limit`],labelKey:`memoryPage.dreaming.phaseFields.limit`,helpKey:`memoryPage.dreaming.phaseFields.limitHelp`,bounds:Y,defaultValue:10},{kind:`number`,path:[`phases`,`rem`,`minPatternStrength`],labelKey:`memoryPage.dreaming.phaseFields.minPatternStrength`,helpKey:`memoryPage.dreaming.phaseFields.minPatternStrengthHelp`,bounds:Oi,defaultValue:.75}]}],ji=[`inline`,`separate`,`both`],Mi=`separate`})))()}function Pi(e){return!e.embedding.ok&&e.embedding.checked!==!1}function Fi(e){return e.provider===`none`?I(`memoryPage.overview.hero.keywordSearch`):I(`memoryPage.overview.hero.hybridSearch`)}function Ii(e){let t=G(e.engineSelection),n=e.engineSelection.kind===`off`||e.engineDisabled,r=e.status.kind===`ready`?e.status.payload:null,i=e.status.kind===`error`||r!==null&&Pi(r),a=fn(Qt(e.agentId??`memory`)),o=n?I(`memoryPage.overview.hero.hibernating`):e.status.kind===`loading`||e.status.kind===`idle`?I(`memoryPage.overview.hero.waking`):I(i?`memoryPage.overview.hero.needsAttention`:`memoryPage.overview.hero.awake`),s=n?I(e.engineDisabled?`memoryPage.overview.hero.disabledDescription`:`memoryPage.overview.hero.offDescription`):e.status.kind===`error`?e.status.message:r?Pi(r)?r.embedding.error??I(`memoryPage.overview.health.unavailable`):I(`memoryPage.overview.hero.activeDescription`,{engine:t??I(`common.unknown`),mode:Fi(r)}):I(`memoryPage.overview.hero.loadingDescription`),c=n?{sleeping:!0}:i?{grumpy:!0,standalone:!0}:r?{reading:!0,standalone:!0}:{standalone:!0};return k`
<section class="memory-overview__hero ${n?`memory-overview__hero--sleeping`:``}">
<div class="memory-overview__lobster" style=${zt(a)}>
${un(a,c)}
</div>
<div class="memory-overview__hero-copy">
<h2>${o}</h2>
<p class=${i?`memory-overview__hero-error`:``}>${s}</p>
<div class="memory-overview__hero-actions">
${n?k`<button class="btn btn--sm" @click=${()=>e.onNavigate(`settings`)}>
${I(`memoryPage.overview.hero.openSettings`)}
</button>`:k`<button class="btn btn--sm" @click=${e.onRefresh}>
${e.status.kind===`error`?I(`memoryPage.overview.hero.retry`):I(`memoryPage.overview.hero.refresh`)}
</button>`}
</div>
</div>
</section>
`}function Li(e,t,n){return[e.cron||I(`common.na`),t,n&&e.nextRunAtMs?I(`memoryPage.overview.schedule.nextRun`,{time:_e(e.nextRunAtMs)}):null,e.lastRunAtMs?I(`memoryPage.overview.schedule.lastRun`,{time:_e(e.lastRunAtMs)}):null].filter(e=>!!e).join(` · `)}function Ri(e){let t=[[`light`,e.phases.light],[`rem`,e.phases.rem],[`deep`,e.phases.deep]];return V({title:I(`memoryPage.overview.schedule.title`)},k`
${t.map(([t,n])=>R({title:I(`memoryPage.dreaming.phases.${t}.title`),description:k`
${I(`memoryPage.overview.schedule.${t}Description`)}<br />
${Li(n,e.timezone,e.enabled&&n.enabled&&n.managedCronPresent)}
`,control:B({kind:e.enabled&&n.enabled&&n.managedCronPresent?`ok`:`muted`,label:!e.enabled||!n.enabled?I(`common.disabled`):n.managedCronPresent?I(`common.enabled`):I(`memoryPage.overview.schedule.notScheduled`)})}))}
${R({title:I(`memoryPage.overview.schedule.learnMore`),control:k`<a
class="memory-page__link"
href="https://docs.openclaw.ai/concepts/dreaming"
target="_blank"
rel="noreferrer noopener"
>${I(`memoryPage.overview.schedule.openDocs`)}</a
>`})}
`)}function zi(e){let t=[[`promotedToday`,e.promotedToday],[`promotedTotal`,e.promotedTotal],[`shortTermCount`,e.shortTermCount],[`phaseHitCount`,e.phaseSignalCount],[`lightPhaseHitCount`,e.lightPhaseHitCount],[`remPhaseHitCount`,e.remPhaseHitCount]];return V({title:I(`memoryPage.overview.activity.title`)},t.map(([e,t])=>R({title:I(`memoryPage.overview.activity.${e}`),control:U(t)})))}function Bi(e,t){let n=e.embedding.checked===!1,r=e.embedding.ok?`ok`:n?`muted`:`danger`,i=t.probingEmbeddings?I(`memoryPage.overview.health.checking`):e.embedding.ok?I(`memoryPage.overview.health.healthy`):I(n?`memoryPage.overview.health.notChecked`:`memoryPage.overview.health.unavailable`);return V({title:I(`memoryPage.overview.health.title`)},k`
${R({title:I(`memoryPage.overview.health.provider`),control:U(e.provider??I(`common.unknown`),{mono:!0})})}
${R({title:I(`memoryPage.overview.health.embeddings`),description:e.embedding.ok?j:n?I(`memoryPage.overview.health.notCheckedDescription`):e.embedding.error,control:k`
${B({kind:r,label:i})}
${n?k`<button
type="button"
class="btn btn--sm"
?disabled=${t.probingEmbeddings}
@click=${t.onProbeEmbeddings}
>
${t.probingEmbeddings?I(`memoryPage.overview.health.testing`):I(`memoryPage.overview.health.test`)}
</button>`:j}
`})}
${e.embeddingRuntime?R({title:I(`memoryPage.overview.health.runtime`),description:e.embeddingRuntime.loadError,control:U([e.embeddingRuntime.engine,e.embeddingRuntime.backend,e.embeddingRuntime.buildInfo,e.embeddingRuntime.model?.id,e.embeddingRuntime.endpoints?Object.entries(e.embeddingRuntime.endpoints).map(([e,t])=>`${e}=${t}`).join(` `):void 0].filter(Boolean).join(` · `))}):j}
`)}function Vi(e){return e.status.kind===`ready`?k`
${e.status.payload.dreaming?Ri(e.status.payload.dreaming):j}
${e.status.payload.dreaming?zi(e.status.payload.dreaming):j}
${Bi(e.status.payload,e)}
`:j}function Hi(e){return V({title:I(`memoryPage.overview.shortcuts.title`)},k`
${hn({title:I(`memoryPage.overview.shortcuts.memories`),onClick:()=>e.onNavigate(`memories`)})}
${hn({title:I(`memoryPage.overview.shortcuts.diary`),onClick:()=>e.onNavigate(`dreams`)})}
${hn({title:I(`memoryPage.overview.shortcuts.settings`),onClick:()=>e.onNavigate(`settings`)})}
`)}function Ui(e){let t=e.engineSelection.kind!==`off`&&!e.engineDisabled;return k`
<div class="settings-page memory-overview">
${Ii(e)} ${t?Vi(e):j} ${Hi(e)}
</div>
`}function Wi(){return(Wi=e((()=>{O(),pn(),qt(),z(),F(),fe(),nr()})))()}function Gi(e,t){if(e.kind!==`ready`)return[];let n=e.plugins.filter(e=>e.installed&&e.kind?.includes(`memory`)===!0).map(e=>({id:e.id,label:e.id===Kn?I(`memoryPage.engine.openClawMemory`):e.name,available:!0})).toSorted((e,t)=>{let n=e.id===Kn;return n===(t.id===Kn)?e.label.localeCompare(t.label):n?-1:1}),r=G(t);if(r&&!n.some(e=>e.id===r)){let e={id:r,label:r===Kn?I(`memoryPage.engine.openClawMemory`):r,available:!1};r===Kn?n.unshift(e):n.push(e)}return n}function Ki(e,t){return e.kind===`ready`?!t?.installed||t.state===`not-installed`||t.state===`error`?`unknown`:t.enabled?`enabled`:`disabled`:e.kind===`loading`?`loading`:`unknown`}function qi(e,t){return e.kind===`ready`&&t?e.plugins.find(e=>e.id===t):void 0}function Ji(e,t){return na.map(n=>{let r=qi(e,n.id);return{id:n.id,label:I(n.labelKey),description:r?.description??n.id,state:Ki(e,r),busy:t.busy.has(n.id),error:t.errors.get(n.id)??null,notice:[t.notices.get(n.id)?.message,t.refreshWarnings.get(n.id)].filter(Boolean).join(` `)||null}})}function Yi(e){switch(e.kind){case`auto`:return`memoryPage.engine.autoHint`;case`off`:return`memoryPage.engine.offHint`;default:return`memoryPage.engine.explicitHint`}}function Xi(e){let t=G(e.engineSelection),n=e.engineOptions.find(e=>e.id===Kn)?.label??I(`memoryPage.engine.openClawMemory`),r=L(n,e.engineSelection.kind!==`auto`);if(e.engineOptions.length===0)return V({title:I(`memoryPage.engine.title`),description:I(`memoryPage.engine.description`)},R({title:I(`memoryPage.engine.rowTitle`),description:k`
${I(`memoryPage.engine.catalogUnavailable`)} ${I(Yi(e.engineSelection))}
${r}
`,control:U(t??I(`memoryPage.engine.off`),{mono:!0})}));let i=[...e.engineOptions.map(e=>({value:e.id,label:e.available?e.label:`${e.label} (${I(`memoryPage.engine.unavailable`)})`})),{value:aa,label:I(`memoryPage.engine.off`)}];return V({title:I(`memoryPage.engine.title`),description:I(`memoryPage.engine.description`)},k`
${R({title:I(`memoryPage.engine.rowTitle`),description:k`${I(Yi(e.engineSelection))} ${r}`,stacked:!0,control:Sn({value:t??aa,options:i,disabled:e.engineBusy,ariaLabel:I(`memoryPage.engine.rowTitle`),onChange:t=>e.onEngineChange(t||null)})})}
${Zi(e,t)}
${e.engineOutcome===null?j:R({title:I(e.engineOutcome.kind===`error`?`memoryPage.engine.changeFailed`:`pluginsPage.needsAttention`),description:e.engineOutcome.message,control:B({kind:e.engineOutcome.kind===`error`?`danger`:`warn`,label:I(e.engineOutcome.kind===`error`?`common.failed`:`pluginsPage.needsAttention`)})})}
`)}function Zi(e,t){return t===null||e.engineState!==`disabled`?j:R({title:I(`memoryPage.engine.disabledTitle`),description:I(`memoryPage.engine.disabledHint`),control:k`
<button
class="btn btn--sm"
?disabled=${e.engineBusy}
@click=${()=>e.onEngineChange(t)}
>
${I(`memoryPage.engine.enable`)}
</button>
`})}function Qi(e){switch(e){case`enabled`:return B({kind:`ok`,label:I(`common.enabled`)});case`disabled`:return B({kind:`muted`,label:I(`common.disabled`)});case`loading`:return B({kind:`muted`,label:I(`common.loading`)});default:return B({kind:`muted`,label:I(`memoryPage.addons.stateUnknown`)})}}function $i(e){return V({title:I(`memoryPage.addons.title`),description:I(`memoryPage.addons.description`)},k`
${e.addons.map(t=>k`
${e.canToggleAddons&&(t.state===`enabled`||t.state===`disabled`)?H({title:t.label,ariaLabel:I(`memoryPage.addons.toggleAriaLabel`,{plugin:t.label}),description:t.description,checked:t.state===`enabled`,disabled:t.busy,onChange:n=>e.onAddonChange(t.id,n)}):R({title:t.label,description:t.description,control:Qi(t.state)})}
${t.error===null?j:R({title:I(`memoryPage.addons.changeFailed`,{plugin:t.label}),description:t.error,control:B({kind:`danger`,label:I(`common.failed`)})})}
${t.notice===null?j:R({title:I(`pluginsPage.needsAttention`),description:t.notice,control:B({kind:`warn`,label:I(`pluginsPage.needsAttention`)})})}
`)}
${R({title:I(`memoryPage.addons.manage`),control:k`<a class="memory-page__link" href=${e.pluginsHref}
>${I(`memoryPage.addons.manageLink`)}</a
>`})}
`)}function ea(e){return k`
<div class="settings-page">
${Xi(e)} ${$i(e)}
<p class="settings-page__intro">${I(`memoryPage.search.intro`)}</p>
</div>
${e.editor}
<div class="settings-page">
${e.dreamingSettings}
${V({title:I(`memoryPage.import.title`),description:I(`memoryPage.import.description`)},R({title:I(`tabs.memoryImport`),description:I(`subtitles.memoryImport`),control:e.canImportMemory?k`<a class="memory-page__link" href=${e.memoryImportHref}
>${I(`memoryPage.import.link`)}</a
>`:U(I(`memoryImport.adminRequired`))}))}
</div>
`}function ta(e){return k`
<section class="memory-page">
<section class="content-header content-header--settings content-header--page hub-page-header">
<div class="hub-page-header__title">
<div class="page-title">${I(`tabs.memory`)}</div>
<div class="page-subtitle">
${I(`memoryPage.intro`)} ${W(ia)}
</div>
</div>
<div class="hub-page-header__tabs">
${or({id:`memory`,active:e.activeTab,tabs:[{value:`overview`,label:I(`memoryPage.tabs.overview`)},{value:`memories`,label:I(`memoryPage.tabs.memories`)},{value:`dreams`,label:I(`memoryPage.tabs.dreams`)},{value:`settings`,label:I(`memoryPage.tabs.settings`)}],ariaLabel:I(`memoryPage.tablistLabel`),panelId:ra,onSelect:t=>e.onTabChange(t)})}
</div>
<div class="hub-page-header__actions">
${e.activeTab===`settings`||e.agents.length<=1?j:k`
<div class="agent-scope-control">
<span class="agent-scope-control__label"
>${I(`memoryPage.dreaming.agentScope.rowTitle`)}</span
>
<openclaw-agent-select
.options=${e.agents}
.value=${e.agentId??``}
.accessibleLabel=${I(`memoryPage.dreaming.agentScope.rowTitle`)}
.onSelect=${t=>e.onAgentChange(t||null)}
></openclaw-agent-select>
</div>
`}
</div>
</section>
<div id=${ra} class="memory-page__panel" role="tabpanel">
${e.activeTab===`overview`?e.overview:e.activeTab===`memories`?e.memories:e.activeTab===`dreams`?e.dreams:ea(e)}
</div>
</section>
`}var na,ra,ia,aa;function oa(){return(oa=e((()=>{O(),zn(),sr(),z(),F(),Mr(),nr(),jr(),na=[{id:`active-memory`,labelKey:`memoryPage.addons.activeMemory.title`},{id:`memory-wiki`,labelKey:`memoryPage.addons.memoryWiki.title`}],ra=`memory-settings-panel`,ia=`https://docs.openclaw.ai/concepts/memory`,aa=``})))()}function sa(e){return k`
<openclaw-memory-settings
.configObject=${e.configObject}
.mutationDisabled=${e.mutationDisabled}
.pluginsHref=${e.pluginsHref}
.memoryImportHref=${e.memoryImportHref}
.routeData=${e.routeData}
.buildEditor=${e.buildEditor}
></openclaw-memory-settings>
`}var ca,la,ua,X;function da(){return(da=e((()=>{d(),O(),D(),Re(),Ve(),st(),z(),F(),w(),C(),v(),It(),ie(),y(),p(),pr(),di(),hi(),vi(),Ni(),Wi(),nr(),oa(),ca=`none`,la=[`plugins`,`slots`,`memory`],ua=`https://docs.openclaw.ai/concepts/dreaming`,X=class extends S{constructor(...e){super(...e),this.configObject={},this.mutationDisabled=!1,this.pluginsHref=``,this.memoryImportHref=``,this.routeData=null,this.buildEditor=()=>k``,this.catalog={kind:`unavailable`},this.engineBusy=!1,this.engineOutcome=null,this.addonBusy=new Set,this.addonErrors=new Map,this.addonNotices=new Map,this.addonRefreshWarnings=new Map,this.selectedAgentId=null,this.overviewStatus={kind:`idle`},this.probingEmbeddings=!1,this.support=`unknown`,this.connection=null,this.catalogRequest=0,this.overviewRequest=null,this.supportPluginId=null,this.supportProbe=null,this.addonNoticeOperations=new Map,this.normalizedLocation=``,this.subscriptions=new xe(this).watch(()=>this.context?.gateway,(e,t)=>e.subscribe(t),e=>this.syncGateway(e.snapshot.client,e.snapshot.phase===`connected`)).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t),e=>this.syncSupport(e)).watch(()=>this.context?.agents,(e,t)=>e.subscribe(t),e=>{!e.state.agentsList&&!e.state.agentsLoading&&e.ensureList().catch(()=>void 0),this.loadOverviewStatus()})}disconnectedCallback(){this.subscriptions.clear(),this.connection=null,this.overviewRequest=null,this.probingEmbeddings=!1,this.catalog={kind:`unavailable`},this.supportPluginId=null,this.supportProbe=null,this.addonNoticeOperations.clear(),super.disconnectedCallback()}connectedCallback(){super.connectedCallback(),this.syncCanonicalLocation()}updated(e){if(e.has(`routeData`)&&(this.activeTab(e.get(`routeData`)??null)!==this.activeTab()&&(this.overviewRequest=null,this.probingEmbeddings=!1,this.loadOverviewStatus()),this.syncCanonicalLocation()),e.has(`configObject`)){let t=e.get(`configObject`),n=t?G(Yn(t)):null,r=G(Yn(this.configObject));t&&n!==r&&(this.overviewRequest=null,this.probingEmbeddings=!1,this.loadOverviewStatus())}}activeTab(e=this.routeData){return Zn(e??{},this.context?.basePath??``)??`overview`}syncCanonicalLocation(){let e=this.context,t=this.routeData;if(!e||!t)return;let n=er(t,e.basePath);if(!n){this.normalizedLocation=``;return}let r=`${t.pathname}${t.search}${t.hash}`;this.normalizedLocation!==r&&(this.normalizedLocation=r,e.replace(`memory`,n))}syncGateway(e,t){if(this.connection?.client===e&&this.connection.connected===t)return;let n={client:e,connected:t};if(this.connection=n,this.engineBusy=!1,this.engineOutcome=null,this.addonBusy=new Set,this.addonRefreshWarnings=new Map,this.overviewRequest=null,this.probingEmbeddings=!1,!e||!t){this.catalog={kind:`unavailable`},this.activeTab()===`overview`&&(this.overviewStatus={kind:`error`,message:I(`memoryPage.overview.hero.gatewayOffline`)});return}this.catalog={kind:`loading`},this.loadCatalog(e,n),this.reconcileAddonNotices(e,n),this.loadOverviewStatus()}async readProcessInstanceId(e){if(!Pt(this.context.gateway.snapshot,`system.info`))return null;try{return(await e.request(`system.info`,{})).processInstanceId??null}catch{return null}}async reconcileAddonNotices(e,t){if(this.addonNotices.size===0)return;let n=await this.readProcessInstanceId(e);if(!n||!this.isConnected||this.connection!==t)return;let r=new Map;for(let[e,t]of this.addonNotices)t.processInstanceId===null?r.set(e,{...t,processInstanceId:n}):t.processInstanceId===n&&r.set(e,t);(r.size!==this.addonNotices.size||[...r].some(([e,t])=>this.addonNotices.get(e)!==t))&&(this.addonNotices=r)}async loadCatalog(e,t){let n=++this.catalogRequest;try{let r=await ae(e);this.applyCatalog(t,n,{kind:`ready`,plugins:r.plugins,mutationAllowed:r.mutationAllowed})}catch{this.applyCatalog(t,n,{kind:`unavailable`})}}applyCatalog(e,t,n){!this.isConnected||this.connection!==e||this.catalogRequest!==t||(this.catalog=n)}resolveAgentId(){let e=this.context.agents.state.agentsList,t=he(e?.agents??[]);return this.selectedAgentId&&t.some(e=>e.id===this.selectedAgentId)?this.selectedAgentId:e?.defaultId??t[0]?.id??null}agentOptions(){return he(this.context.agents.state.agentsList?.agents??[]).map(e=>({value:e.id,label:se(e),agent:e}))}selectAgent(e){this.selectedAgentId!==e&&(this.selectedAgentId=e,this.overviewRequest=null,this.probingEmbeddings=!1,this.loadOverviewStatus())}async loadOverviewStatus(e={}){if(this.activeTab()!==`overview`)return;if(Yn(this.configObject).kind===`off`){this.overviewRequest=null,this.overviewStatus={kind:`idle`},this.probingEmbeddings=!1;return}let t=this.connection,n=t?.connected?t.client:null,r=this.resolveAgentId();if(!t||!n){this.overviewStatus={kind:`error`,message:I(`memoryPage.overview.hero.gatewayOffline`)},this.probingEmbeddings=!1;return}if(!r||!e.force&&this.overviewRequest?.connection===t&&this.overviewRequest.agentId===r)return;let i=e.probeEmbeddings===!0,a={connection:t,agentId:r,probeEmbeddings:i};this.overviewRequest=a,this.probingEmbeddings=i,i||(this.overviewStatus={kind:`loading`});try{let e=await n.request(`doctor.memory.status`,{agentId:r,...i?{probe:!0}:{}});if(!this.isConnected||this.overviewRequest!==a)return;this.overviewStatus={kind:`ready`,payload:e}}catch(e){if(!this.isConnected||this.overviewRequest!==a)return;this.overviewStatus={kind:`error`,message:h(e)}}finally{this.overviewRequest===a&&(this.probingEmbeddings=!1)}}engineState(e){let t=G(e);return t===null?`unknown`:Ki(this.catalog,qi(this.catalog,t))}applyPluginRefreshOutcome(e,t,n){if(this.connection!==e)return;if(!t){this.addonRefreshWarnings=new Map,this.engineOutcome?.kind===`warning`&&(this.engineOutcome=null);return}let r=I(`pluginsPage.configRefreshFailed`,{error:t});n?this.addonRefreshWarnings=new Map(this.addonRefreshWarnings).set(n,r):this.engineOutcome={kind:`warning`,message:r}}async changeAddon(e,t){if(this.addonBusy.has(e)||this.mutationDisabled||this.catalog.kind!==`ready`||!this.catalog.mutationAllowed||!pt(this.context.gateway.snapshot).canAdmin)return;let n=qi(this.catalog,e),r=Ki(this.catalog,n),i=this.connection,a=i?.connected?i.client:null;if(!i||!a||r!==`enabled`&&r!==`disabled`)return;let o={};this.addonNoticeOperations.set(e,o),this.addonBusy=new Set(this.addonBusy).add(e);let s=new Map(this.addonErrors);s.delete(e),this.addonErrors=s;let c=new Map(this.addonRefreshWarnings);c.delete(e),this.addonRefreshWarnings=c;try{let n=await f(this.context.runtimeConfig,a,async n=>{let r=this.readProcessInstanceId(n);return{result:await le(n,e,t),processInstanceId:r}}),{result:r,processInstanceId:s}=n.value,c=t?`pluginsPage.enabledRestart`:`pluginsPage.disabledRestart`,l=`warnings`in r?r.warnings??[]:[],u=[r.restartRequired?I(c,{name:r.plugin.name}):null,...l].filter(Boolean).join(` `);if(this.addonNoticeOperations.get(e)===o){this.applyPluginRefreshOutcome(i,n.refreshError,e);let t=u?await s:null;if(this.addonNoticeOperations.get(e)===o){let n=new Map(this.addonNotices);if(u?n.set(e,{message:u,processInstanceId:t}):n.delete(e),this.addonNotices=n,u){let e=this.connection;e?.connected&&e.client&&this.reconcileAddonNotices(e.client,e)}}}let d=this.connection;d?.connected&&d.client&&await this.loadCatalog(d.client,d)}catch(t){this.connection===i&&(this.addonErrors=new Map(this.addonErrors).set(e,h(t)))}finally{if(this.addonNoticeOperations.get(e)===o&&this.addonNoticeOperations.delete(e),this.connection===i){let t=new Set(this.addonBusy);t.delete(e),this.addonBusy=t}}}async changeEngine(e,t){if(this.engineBusy||this.mutationDisabled||this.catalog.kind===`ready`&&!this.catalog.mutationAllowed||e===G(t)&&(e===null||this.engineState(t)===`enabled`))return;if(this.engineOutcome=null,!e){this.context.runtimeConfig.patchForm(la,ca);return}let n=this.connection,r=n?.connected?n.client:null;if(!(!n||!r)){this.engineBusy=!0;try{let t=await f(this.context.runtimeConfig,r,t=>le(t,e,!0));this.applyPluginRefreshOutcome(n,t.refreshError);let i=this.connection;i?.connected&&i.client&&await this.loadCatalog(i.client,i)}catch(e){this.connection===n&&(this.engineOutcome={kind:`error`,message:h(e)})}finally{this.connection===n&&(this.engineBusy=!1)}}}configObjectFromController(){return T(this.context.runtimeConfig.state)}dreamingPluginId(){return mr(this.configObjectFromController()).pluginId}dreamingConfig(){let e=s(this.configObjectFromController()?.plugins),t=s(s(e?.entries)?.[this.dreamingPluginId()]);return s(s(t?.config)?.dreaming)}syncSupport(e){let t=mr(T(e.state)).pluginId;t!==this.supportPluginId&&(this.supportPluginId=t,this.support=`unknown`);let n=e.state.connected;if(this.supportProbe&&(this.supportProbe.pluginId!==t||!n)&&(this.supportProbe=null),this.support!==`unknown`||this.supportProbe||!n)return;let r={pluginId:t};this.supportProbe=r,dr(e,t).then(e=>{this.supportProbe===r&&(this.supportProbe=null,this.isConnected&&(this.support=e))})}patchDreaming(e,t){if(this.mutationDisabled)return;let n=gi(this.dreamingPluginId(),e);if(t===void 0){this.context.runtimeConfig.removeFormValue(n);return}this.context.runtimeConfig.patchForm(n,t)}renderDreamingControls(){let e=this.dreamingPluginId();return k`
<p class="settings-page__intro">
${I(`memoryPage.dreaming.intro`,{plugin:e})}
${W(ua)}
</p>
${this.support===`unsupported`?Ei(e):Ti({dreaming:this.dreamingConfig(),timezoneDefault:_i(this.configObjectFromController()),disabled:this.mutationDisabled,onPatch:(e,t)=>this.patchDreaming(e,t)})}
`}navigateTab(e){this.context.navigate(`memory`,{pathname:Xe(e,this.context.basePath)})}render(){let e=Yn(this.configObject),t=this.mutationDisabled||this.catalog.kind===`ready`&&!this.catalog.mutationAllowed,n=this.activeTab(),r=this.resolveAgentId();return ta({activeTab:n,onTabChange:e=>this.navigateTab(e),engineOptions:Gi(this.catalog,e),engineSelection:e,engineState:this.engineState(e),engineBusy:this.engineBusy||t,engineOutcome:this.engineOutcome,onEngineChange:t=>void this.changeEngine(t,e),addons:Ji(this.catalog,{busy:this.addonBusy,errors:this.addonErrors,notices:this.addonNotices,refreshWarnings:this.addonRefreshWarnings}),canToggleAddons:this.catalog.kind===`ready`&&this.catalog.mutationAllowed&&!this.mutationDisabled&&pt(this.context.gateway.snapshot).canAdmin,onAddonChange:(e,t)=>void this.changeAddon(e,t),pluginsHref:this.pluginsHref,memoryImportHref:this.memoryImportHref,canImportMemory:pt(this.context.gateway.snapshot).canAdmin,agentId:r,agents:this.agentOptions(),onAgentChange:e=>this.selectAgent(e),overview:Ui({agentId:r,engineSelection:e,engineDisabled:this.engineState(e)===`disabled`,status:this.overviewStatus,probingEmbeddings:this.probingEmbeddings,onRefresh:()=>void this.loadOverviewStatus({force:!0}),onProbeEmbeddings:()=>void this.loadOverviewStatus({force:!0,probeEmbeddings:!0}),onNavigate:e=>this.navigateTab(e)}),memories:k`
<openclaw-memory-memories
.client=${this.context.gateway.snapshot.client}
.connected=${this.context.gateway.snapshot.phase===`connected`}
.methodAdvertised=${Pt(this.context.gateway.snapshot,`memory.search`)===!0}
.agentId=${r}
></openclaw-memory-memories>
`,dreams:k` <openclaw-memory-dreaming .agentId=${r}></openclaw-memory-dreaming> `,editor:n===`settings`?this.buildEditor(qn(`settings`)):k``,dreamingSettings:n===`settings`?this.renderDreamingControls():k``})}},u([a({context:Qe,subscribe:!0})],X.prototype,`context`,void 0),u([M({attribute:!1})],X.prototype,`configObject`,void 0),u([M({type:Boolean})],X.prototype,`mutationDisabled`,void 0),u([M()],X.prototype,`pluginsHref`,void 0),u([M()],X.prototype,`memoryImportHref`,void 0),u([M({attribute:!1})],X.prototype,`routeData`,void 0),u([M({attribute:!1})],X.prototype,`buildEditor`,void 0),u([A()],X.prototype,`catalog`,void 0),u([A()],X.prototype,`engineBusy`,void 0),u([A()],X.prototype,`engineOutcome`,void 0),u([A()],X.prototype,`addonBusy`,void 0),u([A()],X.prototype,`addonErrors`,void 0),u([A()],X.prototype,`addonNotices`,void 0),u([A()],X.prototype,`addonRefreshWarnings`,void 0),u([A()],X.prototype,`selectedAgentId`,void 0),u([A()],X.prototype,`overviewStatus`,void 0),u([A()],X.prototype,`probingEmbeddings`,void 0),u([A()],X.prototype,`support`,void 0),customElements.get(`openclaw-memory-settings`)||customElements.define(`openclaw-memory-settings`,X)})))()}function fa(e){let{gatewayAuth:t,execPolicy:n,browserEnabled:r,browserEnabledOverridden:i,toolProfile:a,toolProfileOverridden:o}=e.security,s=a.trim()||`full`,c=hr.map(e=>({value:e.id,label:I(e.labelKey)}));return c.some(e=>e.value===s)||c.push({value:s,label:s}),V({title:I(`quickSettings.security.title`)},[R({title:I(`quickSettings.security.gatewayAuth`),control:B({kind:t===`none`?`warn`:t===`unknown`?`muted`:`ok`,label:t})}),R({title:I(`quickSettings.security.execPolicy`),control:U(n)}),H({title:I(`quickSettings.security.browserEnabled`),description:L(I(`common.enabled`),i),checked:r,disabled:e.configBusy,onChange:t=>e.onBrowserEnabledToggle?.(t)}),R({title:I(`quickSettings.security.toolProfile`),description:L(I(`agents.toolCatalog.profiles.full`),o),stacked:!0,control:Sn({value:s,options:c,disabled:e.configBusy,onChange:t=>e.onToolProfileChange?.(t)})}),R({title:I(`devices.pairing.title`),control:k`
<button
class="btn"
title=${e.canPairDevice?``:I(`devices.pairing.adminRequired`)}
?disabled=${!e.canPairDevice}
@click=${e.onPairMobile}
>
${P.smartphone} ${I(`devices.pairing.button`)}
</button>
`})])}function pa(e){return k`
<section class="security-page">
<div class="settings-page">${fa(e)}</div>
${e.editor}
</section>
`}function ma(){return(ma=e((()=>{O(),Ct(),z(),F(),fr()})))()}function ha(e){return{gateway:{controlUi:{sessionObserver:e?null:!1}}}}function ga(e){return{agents:{defaults:{utilityModel:e.kind===`auto`?null:e.kind===`disabled`?``:e.model}}}}function _a(e){return!e||e.status===`unavailable`?I(`configView.sessionObserver.modelUnavailable`):e.status===`disabled`?I(`configView.sessionObserver.modelDisabled`):I(e.status===`auto`?`configView.sessionObserver.modelAuto`:`configView.sessionObserver.modelConfigured`,{model:e.model})}function va(e){let t=new Set;return e.filter(e=>e.available!==!1).map(e=>({value:e.id.startsWith(`${e.provider}/`)?e.id:`${e.provider}/${e.id}`,label:e.name||e.id,provider:e.provider})).filter(e=>!t.has(e.value)&&(t.add(e.value),!0)).toSorted((e,t)=>e.label.localeCompare(t.label))}function ya(e){let t=e.utilityModel===void 0?ba:e.utilityModel,n=va(e.models),r=n.some(e=>e.value===t),i=dn(t);return k`
<div class="settings-group">
${H({title:I(`configView.sessionObserver.toggle`),description:I(`configView.sessionObserver.toggleHint`),checked:e.enabled,disabled:e.disabled,onChange:e.onEnabledChange})}
${R({title:I(`configView.sessionObserver.resolvedModel`),description:_a(e.resolvedUtilityModel)})}
${R({title:I(`configView.sessionObserver.modelPicker`),description:e.modelsUnavailable?I(`configView.sessionObserver.modelCatalogUnavailable`):I(`configView.sessionObserver.modelPickerHint`),control:gr({label:I(`configView.sessionObserver.modelPicker`),value:t,options:[{value:ba,label:I(`configView.sessionObserver.auto`)},{value:``,label:I(`configView.sessionObserver.disabled`)},...t!==ba&&t!==``&&!r?[{value:t,label:t,disabled:e.modelsUnavailable,...i?{provider:i}:{}}]:[],...n.map(({value:t,label:n,provider:r})=>({value:t,label:n,provider:r,disabled:e.modelsUnavailable}))],disabled:e.disabled,onChange:t=>e.onUtilityModelChange(t===ba?{kind:`auto`}:t===``?{kind:`disabled`}:{kind:`model`,model:t})})})}
</div>
`}var ba;function xa(){return(xa=e((()=>{O(),_r(),Jt(),z(),F(),Rn(),Ln(),ba=`__openclaw_observer_auto__`})))()}function Sa(e){let n=o(o(e.talk)?.realtime),r=o(n?.providers)??{},i={};for(let[e,n]of Object.entries(r)){let r=o(n);r&&(i[e]={model:t(r.model),speakerVoice:t(r.speakerVoice)??t(r.voice)})}return{provider:t(n?.provider),model:t(n?.model),speakerVoice:t(n?.speakerVoice)??t(n?.speakerVoiceId),transport:t(n?.transport),consultRouting:t(n?.consultRouting)?.toLowerCase()??null,providerEntries:i}}function Ca(e){let t=e?.trim().toLowerCase();return t===`gpt-live`||t?.startsWith(`gpt-live-`)===!0}function wa(e,t){return e!==void 0&&e.length>0&&!e.includes(t)}function Ta(){return(Ta=e((()=>{})))()}function Z(e){return R({title:e.title,description:e.description,control:k`
<select
class="settings-select"
?data-settings-send-shortcut=${e.setting===`send-shortcut`}
?data-settings-follow-up-mode=${e.setting===`follow-up-mode`}
?data-settings-catalog-open-target=${e.setting===`catalog-open-target`}
aria-label=${e.title}
?disabled=${e.disabled??!1}
.value=${e.value}
@change=${t=>e.onChange(t.currentTarget.value)}
>
${e.options.map(t=>k`
<option value=${t.value} ?selected=${e.value===t.value}>
${t.label}
</option>
`)}
</select>
`})}function Ea(){return(Ea=e((()=>{O(),z()})))()}function Da(e){let t=e.snapshot?.voice.locale;if(!t)return null;let n=ja.get(e),r=n?.primary??t.primary;return{primary:r,additional:[...new Set(n?.additional??t.additional)].filter(e=>e!==r)}}function Oa(e,t){let n=ja.get(e);if(n)Object.assign(n,t);else{let n={...t};ja.set(e,n);let r=e.subscribe(t=>{let i=t.voice.locale;n.primary===i.primary&&delete n.primary,n.additional&&n.additional.length===i.additional.length&&n.additional.every((e,t)=>e===i.additional[t])&&delete n.additional,n.primary===void 0&&n.additional===void 0&&(ja.delete(e),r())})}t.additional&&e.set(`voice.locale.additional`,t.additional),t.primary!==void 0&&e.set(`voice.locale.primary`,t.primary)}function ka(e,t,n){return V({title:I(`configPage.deviceTalk.triggerWords`)},R({title:I(`configPage.deviceTalk.triggerWords`),description:I(`configPage.deviceTalk.triggerWordsHint`),stacked:!0,control:k`
${e.kind===`ready`?k`<textarea
class="settings-input"
aria-label=${I(`configPage.deviceTalk.triggerWords`)}
rows="4"
.value=${e.text}
@input=${e=>{t(e.currentTarget.value)}}
></textarea>`:j}
${e.kind===`error`||e.kind===`ready`&&e.error?k`<div class="callout danger" role="alert">
${e.error}
<button class="btn btn--sm" type="button" @click=${n}>
${I(`common.retry`)}
</button>
</div>`:e.kind===`unavailable`?k`<span class="muted"
>${I(`configPage.deviceTalk.triggerWordsUnavailable`)}</span
>`:k`<span class="muted" role="status"
>${e.kind===`loading`?I(`common.loading`):e.kind===`ready`&&e.phase!==`saved`?I(`common.saving`):I(`configPage.deviceTalk.saved`)}</span
>`}
`}))}function Aa(e){if(!e)return j;let t=e.snapshot?.voice;if(!t)return V({title:I(`configPage.deviceTalk.title`)},R({title:I(`common.loading`)}));let n=[{value:``,label:I(`configPage.deviceTalk.systemDefault`)},...t.microphone.devices.map(({id:e,name:t})=>({value:e,label:t}))];t.microphone.selectedId&&!t.microphone.devices.some(({id:e})=>e===t.microphone.selectedId)&&n.push({value:t.microphone.selectedId,label:I(`configPage.deviceTalk.disconnectedMicrophone`,{id:t.microphone.selectedId})});let r=t.locale.available.map(({id:e,name:t})=>({value:e,label:t})),i=Da(e);return i?V({title:I(`configPage.deviceTalk.title`)},[...[`wakeEnabled`,`wakeTriggersTalkMode`,`pushToTalkEnabled`,`talkShiftToStopEnabled`,`talkPhaseSoundsEnabled`,`realtimeRelayEnabled`,`triggerChime`,`sendChime`].map(n=>H({title:I(`configPage.deviceTalk.${n}`),checked:t[n],disabled:n===`wakeEnabled`&&!t.supported,description:n===`wakeEnabled`&&!t.supported?I(`configPage.deviceTalk.unsupported`):n===`realtimeRelayEnabled`?I(`configPage.deviceTalk.realtimeRelayHint`):void 0,onChange:t=>e.set(`voice.${n}`,t)})),Z({title:I(`configPage.deviceTalk.microphone`),value:t.microphone.selectedId??``,options:n,onChange:t=>e.set(`voice.microphone`,t||null)}),Z({title:I(`configPage.deviceTalk.primaryLanguage`),value:i.primary,options:r,onChange:t=>{let n=Da(e);n&&Oa(e,{primary:t,...n.additional.includes(t)?{additional:n.additional.filter(e=>e!==t)}:{}})}}),R({title:I(`configPage.deviceTalk.additionalLanguages`),stacked:!0,control:k`
${i.additional.map(n=>{let r=t.locale.available.find(e=>e.id===n)?.name??n;return k`<div>
${r}
<button
class="btn btn--sm"
type="button"
aria-label=${I(`configPage.deviceTalk.removeLanguage`,{name:r})}
@click=${()=>{let t=Da(e);t&&Oa(e,{additional:t.additional.filter(e=>e!==n)})}}
>
${I(`common.remove`)}
</button>
</div>`})}
<select
class="settings-select"
aria-label=${I(`configPage.deviceTalk.addLanguage`)}
@change=${t=>{let n=t.currentTarget,r=Da(e);n.value&&r&&n.value!==r.primary&&!r.additional.includes(n.value)&&(Oa(e,{additional:[...r.additional,n.value]}),n.value=``)}}
>
<option value="">${I(`configPage.deviceTalk.addLanguage`)}</option>
${r.filter(({value:e})=>e!==i.primary&&!i.additional.includes(e)).map(({value:e,label:t})=>k`<option value=${e}>${t}</option>`)}
</select>
`}),R({title:I(`configPage.deviceTalk.microphoneTest`),control:k`<button
class="btn btn--sm"
type="button"
@click=${()=>e.openPanel(`microphone-test`)}
>
${I(`configPage.deviceTalk.microphoneTest`)}
</button>`})]):j}var ja;function Ma(){return(Ma=e((()=>{O(),z(),F(),Rn(),Ea(),Ln(),ja=new WeakMap})))()}function Na(e,t){if(t)return e.find(e=>e.id===t||e.aliases.includes(t))}function Pa(e,t){if(e.kind===`ready`)return t.provider?Na(e.providers,t.provider):Na(e.providers,e.activeProvider)}function Fa(e,t){let n=[e.provider,t?.id,...t?.aliases??[]],r=[];for(let t of n)t&&t in e.providerEntries&&!r.includes(t)&&r.push(t);return r}function Ia(e,t){let n=e.model,r=e.speakerVoice;for(let i of Fa(e,t)){let t=e.providerEntries[i];n??=t?.model??null,r??=t?.speakerVoice??null}return{model:n,speakerVoice:r}}function La(e){let t=e.catalog;return t.kind===`loading`?R({title:I(`talkPage.status.title`),control:B({kind:`muted`,label:I(`common.loading`)})}):t.kind===`unavailable`?R({title:I(`talkPage.status.title`),description:I(`talkPage.status.unavailableHint`),control:B({kind:`muted`,label:I(`talkPage.status.unavailable`)})}):R({title:I(`talkPage.status.title`),description:t.activeProvider?I(`talkPage.status.activeProvider`,{provider:t.activeProvider}):I(`talkPage.status.noProvider`),control:t.ready?B({kind:`ok`,label:I(`talkPage.status.ready`)}):B({kind:`warn`,label:I(`talkPage.status.notReady`)})})}function Ra(e){if(e.catalog.kind!==`ready`||e.catalog.providers.length===0)return R({title:I(`talkPage.provider.title`),description:I(`talkPage.provider.description`),control:U(e.selection.provider??I(`talkPage.provider.auto`),{mono:!0})});let t=Na(e.catalog.providers,e.selection.provider),n=e.selection.provider&&!t?e.selection.provider:null;return R({title:I(`talkPage.provider.title`),description:I(`talkPage.provider.description`),stacked:!0,control:Sn({value:t?.id??n??Ua,options:[...e.catalog.providers.map(e=>({value:e.id,label:e.label})),...n?[{value:n,label:n}]:[],{value:Ua,label:I(`talkPage.provider.auto`)}],disabled:e.configBusy,ariaLabel:I(`talkPage.provider.title`),onChange:t=>e.onProviderChange(t||null)})})}function za(e){let t=Pa(e.catalog,e.selection),{model:n}=Ia(e.selection,t);if(!t)return R({title:I(`talkPage.model.title`),description:I(`talkPage.model.description`),control:U(n??I(`talkPage.model.default`),{mono:!0})});let r=t.models.length?t.models:t.defaultModel?[t.defaultModel]:[],i=[{value:Ua,label:t.defaultModel?I(`talkPage.model.defaultNamed`,{model:t.defaultModel}):I(`talkPage.model.default`)},...r.map(e=>({value:e,label:e})),...n&&!r.includes(n)?[{value:n,label:n}]:[]];return R({title:I(`talkPage.model.title`),description:I(`talkPage.model.description`),control:gr({label:I(`talkPage.model.title`),value:n??Ua,options:i.map(({value:e,label:n})=>({value:e,label:n,provider:t.id})),disabled:e.configBusy,onChange:t=>e.onModelChange(t||null)})})}function Ba(e){let t=Pa(e.catalog,e.selection),{model:n,speakerVoice:r}=Ia(e.selection,t),i=t?.voicesByModel?.[n??t.defaultModel??``]??t?.voices??[];if(i.length===0)return R({title:I(`talkPage.voice.title`),description:I(`talkPage.voice.description`),control:U(r??I(`talkPage.voice.default`),{mono:!0})});let a=[{value:Ua,label:I(`talkPage.voice.default`)},...i.map(e=>({value:e,label:e})),...r&&!i.includes(r)?[{value:r,label:r}]:[]];return Z({title:I(`talkPage.voice.title`),description:I(`talkPage.voice.description`),value:r??Ua,options:a,disabled:e.configBusy,onChange:t=>e.onVoiceChange(t||null)})}function Va(e){let t=Pa(e.catalog,e.selection),{model:n}=Ia(e.selection,t);return t?.id!==`openai`||!Ca(n)?j:R({title:I(`talkPage.gptLive.title`),description:I(`talkPage.gptLive.hint`),control:t.configured?B({kind:`ok`,label:I(`talkPage.gptLive.ready`)}):B({kind:`warn`,label:I(`talkPage.status.notReady`)})})}function Ha(e){return k`
<section class="talk-page">
<div class="settings-page">
${Aa(e.nativeDeviceSettings)}
${e.voiceWake?ka(e.voiceWake.state,e.voiceWake.onInput,e.voiceWake.onRetry):j}
${V({title:I(`talkPage.voiceSection.title`),description:I(`talkPage.voiceSection.description`)},k`
${La(e)} ${Ra(e)} ${za(e)}
${Ba(e)} ${Va(e)}
`)}
</div>
${e.editor}
</section>
`}var Ua;function Wa(){return(Wa=e((()=>{O(),_r(),z(),F(),Ea(),Ma(),Ta(),Ua=``})))()}function Ga(e){return{id:e.id,label:e.label,configured:e.configured,aliases:e.aliases??[],models:e.models??[],voices:e.voices??[],voicesByModel:e.voicesByModel,transports:e.transports??[],defaultModel:e.defaultModel??null}}function Ka(e,t){return Ca(e)&&t===`provider-websocket`}function qa(e){let t=Xa.get(e);return t||(t=new Za(e),Xa.set(e,t)),t}function Ja(e){return k`
<openclaw-talk-settings
.configObject=${e.configObject}
.mutationDisabled=${e.mutationDisabled}
.buildEditor=${e.buildEditor}
></openclaw-talk-settings>
`}var Ya,Xa,Za,Qa;function $a(){return($a=e((()=>{d(),O(),D(),Ve(),F(),It(),y(),p(),Ta(),Wa(),Ya=new Set([`webrtc`,`provider-websocket`]),Xa=new WeakMap,Za=class{constructor(e){this.gateway=e,this.value={kind:`unavailable`},this.connection=null,this.voiceWakeWrite=null,this.listeners=new Set,e.subscribe(()=>this.sync())}get state(){return this.value}update(e){this.value=e;for(let e of this.listeners)e()}subscribe(e){this.listeners.add(e),this.sync();let t=this.connection;return t?.connected&&t.voiceWake&&this.state.kind!==`loading`&&(this.state.kind!==`ready`||this.state.phase===`saved`)&&this.loadVoiceWake(t),()=>{this.listeners.delete(e)}}flush(){this.voiceWakeTimer!==void 0&&(clearTimeout(this.voiceWakeTimer),this.voiceWakeTimer=void 0,this.saveVoiceWake())}retry(){this.state.kind===`ready`?this.saveVoiceWake():this.connection&&this.loadVoiceWake(this.connection)}sync(){let e=this.gateway.snapshot,t=this.gateway.connection.gatewayUrl,n=e.client,r=e.phase===`connected`,i=Pt(e,`voicewake.get`)===!0&&Pt(e,`voicewake.set`)===!0;if(this.connection?.gatewayUrl===t&&this.connection.client===n&&this.connection.connected===r&&this.connection.voiceWake===i)return;clearTimeout(this.voiceWakeTimer),this.voiceWakeTimer=void 0,this.voiceWakeWrite&&=(this.voiceWakeWrite.next=null,null);let a=this.connection?.gatewayUrl===t&&this.state.kind===`ready`&&this.state.phase!==`saved`?this.state:null,o={gatewayUrl:t,client:n,connected:r,voiceWake:i};this.connection=o,this.update(a?{...a,phase:`pending`,error:I(`configPage.deviceTalk.triggerWordsDisconnected`)}:{kind:`unavailable`}),n&&r&&i&&!a&&this.listeners.size>0&&this.loadVoiceWake(o)}async loadVoiceWake(e){if(!(!e.client||!e.voiceWake)){this.update({kind:`loading`});try{let t=await e.client.request(`voicewake.get`,{});this.connection===e&&this.update({kind:`ready`,text:t.triggers.join(`
`),phase:`saved`,error:null})}catch(t){this.connection===e&&this.update({kind:`error`,error:I(`configPage.deviceTalk.triggerWordsLoadError`,{error:String(t)})})}}}edit(e){if(this.state.kind!==`ready`)return;this.update({kind:`ready`,text:e,phase:`pending`,error:null});let t=this.voiceWakeWrite;t?.connection===this.connection&&t.next!==null&&(t.next=e===t.text?null:e),clearTimeout(this.voiceWakeTimer),this.voiceWakeTimer=setTimeout(()=>{this.voiceWakeTimer=void 0,this.saveVoiceWake()},400)}async saveVoiceWake(){let e=this.connection,t=this.state;if(t.kind!==`ready`||t.phase===`saved`)return;if(!e?.client||!e.connected||!e.voiceWake){this.update({...t,phase:`pending`,error:I(`configPage.deviceTalk.triggerWordsDisconnected`)});return}if(this.voiceWakeWrite?.connection===e){this.voiceWakeWrite.next=t.text===this.voiceWakeWrite.text?null:t.text;return}let n={connection:e,text:t.text,next:t.text};for(this.voiceWakeWrite=n;n.next!==null;){n.text=n.next,n.next=null;let t=this.state;this.connection===e&&t.kind===`ready`&&t.text===n.text&&this.update({...t,phase:`saving`,error:null});try{let t=await e.client.request(`voicewake.set`,{triggers:n.text.split(`
`)});this.connection===e&&this.state.kind===`ready`&&this.state.text===n.text&&this.update({kind:`ready`,text:t.triggers.join(`
`),phase:`saved`,error:null})}catch(t){this.connection===e&&this.state.kind===`ready`&&this.update({...this.state,phase:`pending`,error:I(`configPage.deviceTalk.triggerWordsError`,{error:String(t)})})}}this.voiceWakeWrite===n&&(this.voiceWakeWrite=null)}},Qa=class extends S{constructor(...e){super(...e),this.configObject={},this.mutationDisabled=!1,this.buildEditor=()=>k``,this.catalog={kind:`unavailable`},this.connection=null,this.catalogRequestId=0,this.subscriptions=new xe(this).watch(()=>this.context?.gateway?qa(this.context.gateway):void 0,(e,t)=>e.subscribe(t)).watch(()=>this.context?.nativeDeviceSettings,(e,t)=>e.subscribe(t)).watch(()=>this.context?.gateway,(e,t)=>e.subscribe(t),e=>this.syncCatalog(e.connection.gatewayUrl,e.snapshot.client,e.snapshot.phase===`connected`,Pt(e.snapshot,`voicewake.get`)===!0&&Pt(e.snapshot,`voicewake.set`)===!0)).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t),e=>this.refreshCatalogOnConfigChange(e.state)),this.refreshOnFocus=()=>{let e=this.connection;e?.client&&e.connected&&this.loadCatalog(e.client,e)}}connectedCallback(){super.connectedCallback(),window.addEventListener(`focus`,this.refreshOnFocus)}disconnectedCallback(){window.removeEventListener(`focus`,this.refreshOnFocus),qa(this.context.gateway).flush(),this.subscriptions.clear(),this.connection=null,this.catalog={kind:`unavailable`},super.disconnectedCallback()}syncCatalog(e,t,n,r){if(this.connection?.gatewayUrl===e&&this.connection.client===t&&this.connection.connected===n&&this.connection.voiceWake===r)return;let i={gatewayUrl:e,client:t,connected:n,voiceWake:r};if(this.connection=i,!t||!n){this.catalog={kind:`unavailable`};return}this.catalog={kind:`loading`},this.loadCatalog(t,i)}async loadCatalog(e,t){let n=++this.catalogRequestId;try{let r=await e.request(`talk.catalog`,{});this.applyCatalog(t,n,{kind:`ready`,ready:r.realtime.ready===!0,activeProvider:r.realtime.activeProvider??null,providers:r.realtime.providers.map(Ga)})}catch{this.applyCatalog(t,n,{kind:`unavailable`})}}applyCatalog(e,t,n){!this.isConnected||this.connection!==e||this.catalogRequestId!==t||(this.catalog=n)}refreshCatalogOnConfigChange(e){let t=e.configSnapshot?.hash??null;if(this.lastCatalogConfigHash===void 0){this.lastCatalogConfigHash=t;return}if(t===null||t===this.lastCatalogConfigHash)return;this.lastCatalogConfigHash=t;let n=this.connection;n?.client&&n.connected&&this.loadCatalog(n.client,n)}changeModel(e){if(this.mutationDisabled)return;let t=this.context.runtimeConfig;if(e!==null){t.patchForm([`talk`,`realtime`,`model`],e);let n=this.liveSelection(),r=n.transport,i=Pa(this.catalog,n),a=r!==null&&(Ka(e,r)||wa(i?.transports,r));Ca(e)&&a?t.removeFormValue([`talk`,`realtime`,`transport`]):i?.id===`openai`&&Ca(e)&&r===`gateway-relay`&&n.consultRouting===`force-agent-consult`&&t.removeFormValue([`talk`,`realtime`,`consultRouting`]);return}t.removeFormValue([`talk`,`realtime`,`model`]);for(let e of this.selectedProviderConfigKeys())t.removeFormValue([`talk`,`realtime`,`providers`,e,`model`])}changeVoice(e){if(this.mutationDisabled)return;let t=this.context.runtimeConfig;if(e!==null){t.patchForm([`talk`,`realtime`,`speakerVoice`],e);return}t.removeFormValue([`talk`,`realtime`,`speakerVoice`]),t.removeFormValue([`talk`,`realtime`,`speakerVoiceId`]);for(let e of this.selectedProviderConfigKeys())t.removeFormValue([`talk`,`realtime`,`providers`,e,`speakerVoice`]),t.removeFormValue([`talk`,`realtime`,`providers`,e,`voice`])}selectedProviderConfigKeys(){let e=this.liveSelection();return Fa(e,Pa(this.catalog,e))}liveSelection(){let e=this.context.runtimeConfig.state.configForm;return Sa(e&&typeof e==`object`?e:this.configObject)}changeProvider(e){if(this.mutationDisabled)return;let t=this.context.runtimeConfig,n=this.liveSelection();for(let e of[`model`,`speakerVoice`,`speakerVoiceId`])t.removeFormValue([`talk`,`realtime`,e]);if(e===null){t.removeFormValue([`talk`,`realtime`,`provider`]);return}let r=n.transport,i=this.catalog.kind===`ready`?this.catalog.providers.find(t=>t.id===e):void 0,a=Ia({...n,provider:e,model:null,speakerVoice:null},i).model??i?.defaultModel,o=r!==null&&(Ka(a??null,r)||wa(i?.transports,r));o&&t.removeFormValue([`talk`,`realtime`,`transport`]),t.patchForm([`talk`,`realtime`,`provider`],e);let s=i!==void 0&&i.transports.length>0&&!i.transports.some(e=>Ya.has(e)),c=o?null:r;s&&r!==`gateway-relay`&&(t.patchForm([`talk`,`realtime`,`transport`],`gateway-relay`),c=`gateway-relay`),i?.id===`openai`&&Ca(a??null)&&c===`gateway-relay`&&n.consultRouting===`force-agent-consult`&&t.removeFormValue([`talk`,`realtime`,`consultRouting`])}render(){let e=this.context.runtimeConfig.state,t=qa(this.context.gateway);return Ha({nativeDeviceSettings:this.context.nativeDeviceSettings,voiceWake:{state:t.state,onInput:e=>t.edit(e),onRetry:()=>t.retry()},selection:Sa(this.configObject),catalog:this.catalog,configBusy:this.mutationDisabled||e.configLoading||e.configSaving||e.configApplying,onProviderChange:e=>this.changeProvider(e),onModelChange:e=>this.changeModel(e),onVoiceChange:e=>this.changeVoice(e),editor:this.buildEditor()})}},u([a({context:Qe,subscribe:!0})],Qa.prototype,`context`,void 0),u([M({attribute:!1})],Qa.prototype,`configObject`,void 0),u([M({type:Boolean})],Qa.prototype,`mutationDisabled`,void 0),u([M({attribute:!1})],Qa.prototype,`buildEditor`,void 0),u([A()],Qa.prototype,`catalog`,void 0),customElements.get(`openclaw-talk-settings`)||customElements.define(`openclaw-talk-settings`,Qa)})))()}function eo(e){if(!e)return j;let t=e.snapshot;return V({title:I(`updates.device.title`)},t?[R({title:I(`updates.device.version`),control:U(I(`updates.device.versionBuild`,{version:t.device.appVersion,build:t.device.appBuild}))}),t.updates.available?k`${H({title:I(`updates.device.automatic`),checked:t.updates.automatic,onChange:t=>e.set(`updates.automatic`,t)})}${R({title:I(`updates.device.check`),control:k`<button
class="btn btn--sm"
type="button"
@click=${()=>e.checkForUpdates()}
>
${I(`updates.device.check`)}
</button>`})}`:R({title:I(`updates.device.unavailable`),description:t.updates.unavailableReason})]:R({title:I(`common.loading`)}))}function to(e){let t=e.run;if(!t&&!e.statusBanner)return j;let n=!t||t.status===`failed`||t.status===`rolled-back`||t.status===`skipped`,r=e.canUpdate&&!e.updateBusy;return V({title:I(`updates.page.latestAttempt`)},[t?k`<div class="settings-row settings-row--stacked">
<openclaw-update-run-view
.run=${t}
.connected=${e.connected}
></openclaw-update-run-view>
</div>`:j,...n?[R({title:I(`updates.page.recoveryActions`),control:k`<div class="updates-status-control">
<button
class="btn btn--sm"
type="button"
title=${e.canCheckStatus?``:I(`updates.adminRequired`)}
?disabled=${!e.canCheckStatus||e.updateBusy}
@click=${()=>void e.onCheckStatus()}
>
${I(`updates.page.checkStatus`)}
</button>
<button
class="btn btn--sm primary"
type="button"
title=${r?``:I(`updates.adminRequired`)}
?disabled=${!r}
@click=${e.onUpdateNow}
>
${I(`updates.page.retryUpdate`)}
</button>
</div>`}),R({title:I(`updates.page.cliFallback`),description:I(`updates.triage.hostHint`),stacked:!0,control:k`<details class="updates-attempt-details">
<summary>${I(`updates.page.showCliFallback`)}</summary>
<pre><code>openclaw triage</code></pre>
</details>`})]:[]])}function no(e,t){let n=s(e.update),r=s(n?.auto),i=n?.channel,a=i===`extended-stable`;return{channel:i===`stable`||i===`beta`||i===`dev`||a?i:t?.channel===`beta`||t?.channel===`dev`?t.channel:`stable`,autoEnabled:typeof r?.enabled==`boolean`?r.enabled:t?.autoEnabled??!1,extendedStableAuthored:a}}function ro(e){return i(e)??null}function io(e,t=Date.now()){let n=ee(Math.max(0,t-e));return U(k`<time datetime=${new Date(e).toISOString()} title=${n}
>${ye(e,{dateStyle:`medium`,timeStyle:`short`})}
<span class="muted">· ${n}</span></time
>`)}function ao(e){let t=e.schedule?.install?.kind,n=e.schedule?.install?.git,r=ro(e.controlUiBuiltAt),i=n?.commitAtMs??ro(e.controlUiCommitAt);return V({title:I(`updates.page.buildTitle`)},[R({title:I(`updates.page.gatewayVersion`),control:U(e.gatewayVersion?k`<code dir="ltr" title=${e.gatewayVersion}>${e.gatewayVersion}</code>`:I(`common.na`),{mono:!0})}),R({title:I(`updates.page.controlUiCommit`),control:U(e.controlUiCommit?k`<code dir="ltr" title=${e.controlUiCommit}
>${e.controlUiCommit.slice(0,12)}</code
>`:I(`common.na`),{mono:!0})}),r===null?j:R({title:I(`updates.page.builtAt`),control:io(r,e.nowMs)}),t===`git`?R({title:I(`updates.page.installedAt`),control:n?.installedAtMs===void 0?U(I(`updates.page.installedAtUnknown`)):io(n.installedAtMs,e.nowMs)}):j,i===null?j:R({title:I(`updates.page.lastCommitAt`),control:io(i,e.nowMs)}),t?R({title:I(`updates.page.installKind`),control:U(I(`updates.installKind.${t}`))}):j])}function oo(e){let t=e.schedule?.campaign,n=vt(e.schedule,e.nowMs),r=Ie(e.schedule,e.updateAvailable),i=`muted`,a;if(n)i=t?.state===`waiting-for-idle`?`warn`:`accent`,a=n;else if(e.statusBanner)i=e.statusBanner.tone===`danger`?`danger`:e.statusBanner.tone===`warn`?`warn`:`accent`,a=e.statusBanner.text;else if(e.schedule?.install?.kind===`git`){let t=e.schedule.install.git;if(!t)a=I(`updates.page.statusUnavailable`);else if(t.status===`current`)i=`ok`,a=I(`updates.page.upToDate`);else if(t.status===`behind`){i=`accent`;let e=I(t.commitsBehind===1?`updates.target.commitBehind`:`updates.target.commitsBehind`,{count:String(t.commitsBehind)});a=I(`updates.page.available`,{target:e})}else t.status===`ahead`?a=I(t.commitsAhead===1?`updates.page.gitCommitAhead`:`updates.page.gitCommitsAhead`,{count:String(t.commitsAhead)}):t.status===`diverged`?(i=`warn`,a=I(`updates.page.gitDiverged`,{ahead:String(t.commitsAhead),behind:String(t.commitsBehind)})):(i=`warn`,a=t.reason===`fetch-failed`?I(`updates.page.gitFetchFailed`):t.reason===`no-upstream`?I(`updates.page.gitNoUpstream`):I(`updates.page.gitComparisonFailed`))}else r?(i=`accent`,a=I(`updates.page.available`,{target:r})):e.schedule?.install?.kind===`package`?(i=`ok`,a=I(`updates.page.upToDate`)):a=I(`updates.page.statusUnavailable`);let o=t?.state===`waiting-for-idle`||t?.state===`countdown`;return k`<span role=${o?`timer`:j} aria-live=${o?`off`:j}
>${B({kind:i,label:a,dot:!1})}</span
>`}function so(e){let t=e.updateAvailable,n=e.schedule?.target?.kind===`git`||!!t?.currentSha,r=e.schedule?.install?.git;if(r&&r.status!==`behind`&&r.status!==`diverged`)return[];let i=r?.status===`behind`||r?.status===`diverged`?r.commitsBehind:void 0,a=i===void 0||i===t?.commitsBehind;return n&&a?t?.commits??[]:[]}function co(e){let t=so(e);return t.length===0?j:R({title:I(`updates.page.commits`),stacked:!0,control:k`
<div class="updates-commit-list" role="list" aria-label=${I(`updates.page.commits`)}>
${t.map(e=>k`
<div class="updates-commit-list__row" role="listitem">
<code title=${e.sha}>${e.sha}</code>
<span>${e.subject}</span>
</div>
`)}
</div>
`})}function lo(e){let t=no(e.configObject,e.schedule),n=[{value:`stable`,label:I(`updates.channel.stable`)},{value:`beta`,label:I(`updates.channel.beta`)},{value:`dev`,label:I(`updates.channel.dev`)}];t.extendedStableAuthored&&n.push({value:`extended-stable`,label:I(`updates.channel.extendedStable`)});let r=t.channel!==`extended-stable`,i=s(e.configObject.update)?.checkOnStart===!1,a=t.channel===`dev`&&e.schedule?.install?.kind===`package`,o=e.schedule?.campaign,c=o?.holdUntilMs!==void 0&&o.holdUntilMs>(e.nowMs??Date.now()),l=!!(o&&o.state!==`applying`&&e.canUpdate&&e.canHoldUpdate&&!c&&e.heldUpdateCampaignId!==o.id),u=[R({title:I(`updates.page.channel`),description:I(`updates.page.channelDescription`),stacked:!0,control:Sn({value:t.channel,options:n,ariaLabel:I(`updates.page.channel`),disabled:e.configBusy,onChange:e.onChannelChange})}),H({title:I(`updates.page.checkForUpdates`),description:I(`updates.page.checkForUpdatesDescription`),checked:!i,disabled:e.configBusy,onChange:e.onUpdateChecksChange}),H({title:I(`updates.page.automaticUpdates`),description:I(r?a?`updates.page.devPackageAutomaticHint`:i?`updates.page.checksDisabledAutomaticHint`:`updates.page.automaticUpdatesDescription`:`updates.page.extendedStableAutomaticHint`),checked:r&&t.autoEnabled,disabled:e.configBusy||i||!r||a,onChange:e.onAutomaticUpdatesChange})],d=e.canAdmin?``:I(`updates.adminRequired`);return k`
<div id="config-section-update">
${vn([eo(e.nativeDeviceSettings),e.canAdmin?j:k`<div class="callout warning" role="note">${I(`updates.adminRequired`)}</div>`,ao(e),to(e),V({title:I(`updates.page.policyTitle`)},u),V({title:I(`updates.page.statusTitle`)},[R({title:I(`updates.page.scheduleStatus`),control:k`
<div class="updates-status-control">
${oo(e)}
${l?k`
<button
type="button"
class="btn btn--sm"
?disabled=${e.updateBusy}
@click=${()=>void e.onHoldUpdate()}
>
${I(`updates.holdOneHour`)}
</button>
`:j}
</div>
`}),co(e),R({title:I(`updates.page.updateNow`),description:I(`updates.page.updateNowDescription`),control:k`
<button
type="button"
class="btn primary"
title=${d}
?disabled=${e.updateBusy||!e.canUpdate}
@click=${e.onUpdateNow}
>
${P.download}
${e.updateBusy?I(`chat.updating`):I(`updates.page.updateNow`)}
</button>
`})]),k`<p class="settings-page__hint">
<a href="https://docs.openclaw.ai/install/update-troubleshooting" target="_blank"
>${I(`updates.page.troubleshoot`)}</a
>
</p>`])}
</div>
`}function uo(){return(uo=e((()=>{c(),O(),In(),Ae(),Ct(),z(),F(),Rn(),fe(),Ln()})))()}function fo(e){return`${String(Math.floor(e/60)).padStart(2,`0`)}:${String(e%60).padStart(2,`0`)}`}function po(e,t){let n=/^(\d{2}):(\d{2})$/u.exec(e);return n?Number(n[1])*60+Number(n[2]):t}function mo(e){return e.currentTarget}function ho(e){return e===`identified`||e===`detailed`?e:`private`}function go(){return[{value:`private`,label:I(`configView.notifications.private`)},{value:`identified`,label:I(`configView.notifications.namesOnly`)},{value:`detailed`,label:I(`configView.notifications.detailed`)}]}function _o(e){return[{value:`inherit`,label:e},{value:`on`,label:I(`configForm.enumOn`)},{value:`off`,label:I(`configForm.enumOff`)}]}function vo(e,t){return k`
${R({title:I(`configView.notifications.quietHoursWindow`),control:k`
<input
type="time"
class="settings-input"
aria-label=${I(`configView.notifications.quietHoursStart`)}
.value=${fo(e.startMinute)}
@change=${n=>t({...e,startMinute:po(mo(n).value,e.startMinute)})}
/>
<span class="settings-row__value" aria-hidden="true">–</span>
<input
type="time"
class="settings-input"
aria-label=${I(`configView.notifications.quietHoursEnd`)}
.value=${fo(e.endMinute)}
@change=${n=>t({...e,endMinute:po(mo(n).value,e.endMinute)})}
/>
`})}
${R({title:I(`configView.notifications.timeZone`),control:k`<input
type="text"
class="settings-input"
aria-label=${I(`configView.notifications.timeZone`)}
.value=${e.timeZone}
@change=${n=>t({...e,timeZone:mo(n).value})}
/>`})}
`}function yo(e,t){return R({title:I(`configView.notifications.onlyAgents`),control:k`<input
type="text"
class="settings-input"
aria-label=${I(`configView.notifications.onlyAgents`)}
.value=${e.join(`, `)}
@change=${e=>t(mo(e).value.split(`,`).map(e=>e.trim()).filter(Boolean))}
/>`})}function bo(e,t){let n=n=>t({...e,...n});return k`
<section class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.notifications.accountDefaults`)}</h2>
</div>
<div class="settings-group">
${wo.map(([t,r])=>H({title:r(),checked:e.categories[t]===!0,onChange:r=>n({categories:{...e.categories,[t]:r}})}))}
${Z({title:I(`configView.notifications.lockScreenDetail`),description:I(`configView.notifications.lockScreenDetailHint`),value:e.detailLevel,options:go(),onChange:e=>n({detailLevel:ho(e)})})}
${H({title:I(`configView.notifications.quietHours`),checked:e.quietHours.enabled,onChange:t=>n({quietHours:{...e.quietHours,enabled:t}})})}
${e.quietHours.enabled?vo(e.quietHours,e=>n({quietHours:e})):j}
${yo(e.agentIds,e=>n({agentIds:e}))}
</div>
</section>
`}function xo(e,t){let n=n=>t({...e,...n}),r=e.quietHours;return k`
<section class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.notifications.installedApp`)}</h2>
</div>
<div class="settings-group">
${H({title:I(`configView.notifications.deliverDevice`),checked:e.enabled,onChange:e=>n({enabled:e})})}
${R({title:I(`configView.notifications.notificationLabel`),control:k`<input
type="text"
class="settings-input"
aria-label=${I(`configView.notifications.notificationLabel`)}
maxlength="80"
.value=${e.label}
@change=${e=>n({label:mo(e).value})}
/>`})}
${Z({title:I(`configView.notifications.lockScreenDetail`),value:e.detailLevel??`inherit`,options:[{value:`inherit`,label:I(`configView.notifications.inheritDetail`)},...go()],onChange:e=>n({detailLevel:e===`inherit`?void 0:ho(e)})})}
${Z({title:I(`configView.notifications.quietHours`),value:r===void 0?`inherit`:r.enabled?`on`:`off`,options:_o(I(`configView.notifications.inheritQuietHours`)),onChange:e=>n({quietHours:e===`inherit`?void 0:{enabled:e===`on`,startMinute:r?.startMinute??1320,endMinute:r?.endMinute??420,timeZone:r?.timeZone??`UTC`}})})}
${r?.enabled?vo(r,e=>n({quietHours:e})):j}
${Z({title:I(`configView.notifications.onlyAgents`),value:e.agentIds===void 0?`inherit`:`override`,options:[{value:`inherit`,label:I(`configView.notifications.inherit`)},{value:`override`,label:I(`configView.notifications.overrideAgents`)}],onChange:e=>n({agentIds:e===`inherit`?void 0:[]})})}
${e.agentIds===void 0?j:yo(e.agentIds,e=>n({agentIds:e}))}
${wo.map(([t,r])=>Z({title:r(),value:e.categories?.[t]===void 0?`inherit`:e.categories[t]?`on`:`off`,options:_o(I(`configView.notifications.inherit`)),onChange:r=>{let i={...e.categories};r===`inherit`?delete i[t]:i[t]=r===`on`,n({categories:i})}}))}
</div>
</section>
`}function So(e){switch(e){case`granted`:return{kind:`ok`,label:I(`configView.notifications.granted`)};case`denied`:return{kind:`danger`,label:I(`configView.notifications.denied`)};case`notDetermined`:return{kind:`accent`,label:I(`configView.notifications.notRequested`)};default:return{kind:`muted`,label:I(`configView.notifications.checking`)}}}function Co(e){let t=e.nativeNotifications;if(t){let n=So(t.permission),r=t.test?.state===`pending`,i=t.permission===`notDetermined`?k`
<button
class="btn primary"
@click=${()=>e.onNativeNotificationsRequestPermission?.()}
>
${I(`configView.notifications.enable`)}
</button>
`:t.permission===`denied`?k`
<button class="btn" @click=${()=>e.onNativeNotificationsRequestPermission?.()}>
${I(`configView.notifications.openSystemSettings`)}
</button>
`:t.permission===`granted`?k`
<button
class="btn primary"
?disabled=${r}
@click=${()=>e.onNativeNotificationsSendTest?.()}
>
${r?P.loader:P.send}
${I(r?`configView.notifications.sendingTest`:`configView.notifications.sendTest`)}
</button>
`:j;return k`
<div class="settings-page">
<section class="settings-section" id=${ar.notifications}>
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.notifications.nativeTitle`)}</h2>
<div class="settings-section__actions">${B(n)}</div>
</div>
<div class="settings-group">
${R({title:I(`configView.notifications.permission`),control:U(n.label)})}
${i===j?j:k`
<div class="settings-row">
<div class="settings-row__control">${i}</div>
</div>
`}
${t.permission===`denied`?R({title:I(`configView.notifications.blocked`),description:I(`configView.notifications.nativeBlockedHint`),control:B({kind:`danger`,label:I(`configView.notifications.denied`)})}):j}
${t.test?R({title:I(`configView.notifications.testOutcome`),description:t.test.state===`error`?t.test.message:void 0,control:B(t.test.state===`pending`?{kind:`accent`,label:I(`configView.notifications.sendingTest`)}:t.test.state===`sent`?{kind:`ok`,label:I(`configView.notifications.testQueued`)}:{kind:`danger`,label:I(`configView.notifications.testFailed`)})}):j}
</div>
</section>
</div>
`}let n=e.webPush;if(!n)return k`
<div class="settings-page">
<section class="settings-section" id=${ar.notifications}>
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.notifications.title`)}</h2>
<div class="settings-section__actions">
${B({kind:`muted`,label:I(`configView.notifications.unavailable`)})}
</div>
</div>
<div class="settings-group">
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__desc">
${I(`configView.notifications.unavailableHint`)}
</span>
</div>
</div>
</div>
</section>
</div>
`;let r=n.permission===`granted`?I(`configView.notifications.granted`):n.permission===`denied`?I(`configView.notifications.denied`):n.permission==="default"?I(`configView.notifications.notRequested`):I(`configView.notifications.unsupported`),i=n.subscription===`registered`,a=i||n.subscription===`vapid-mismatch`,o=i?I(`configView.notifications.subscribed`):n.subscription===`unknown`?I(`configView.notifications.checking`):I(`configView.notifications.notSubscribed`),s=n.supported?n.permission===`denied`?I(`configView.notifications.blocked`):i?I(`configView.notifications.subscribed`):n.subscription===`vapid-mismatch`?I(`configView.notifications.unavailable`):n.subscription===`unknown`?I(`configView.notifications.checking`):I(`configView.notifications.ready`):I(`configView.notifications.unsupported`),c=n.supported?n.permission===`denied`||n.subscription===`vapid-mismatch`?`danger`:i?`ok`:`accent`:`muted`,l=n.supported&&n.permission!==`denied`?a?k`
<button
class="btn"
?disabled=${n.loading||!e.connected}
@click=${()=>e.onWebPushUnsubscribe?.()}
>
${P.x} ${I(`configView.notifications.unsubscribe`)}
</button>
${i?k`<button
class="btn primary"
?disabled=${n.loading||!e.connected}
@click=${()=>e.onWebPushTest?.()}
>
${P.send} ${I(`configView.notifications.sendTest`)}
</button>`:j}
`:k`
<button
class="btn primary"
?disabled=${n.loading||!e.connected}
@click=${()=>e.onWebPushSubscribe?.()}
>
${n.loading?P.loader:j}
${n.loading?I(`configView.notifications.subscribing`):I(`configView.notifications.enable`)}
</button>
`:j;return k`
<div class="settings-page">
<section class="settings-section" id=${ar.notifications}>
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.notifications.title`)}</h2>
<div class="settings-section__actions">
${B({kind:c,label:s})}
</div>
</div>
${n.permission===`install-required`?k`<p class="settings-section__desc">
${I(`configView.notifications.iosInstallRequired`)}
</p>`:j}
<div class="settings-group">
${R({title:I(`configView.notifications.browserSupport`),control:U(n.supported?I(`configView.notifications.available`):I(`configView.notifications.notSupported`))})}
${R({title:I(`configView.notifications.permission`),control:U(r)})}
${R({title:I(`configView.notifications.status`),control:B({kind:i?`ok`:`muted`,label:o})})}
${l===j?j:k`
<div class="settings-row">
<div class="settings-row__control">${l}</div>
</div>
`}
${n.permission===`denied`?R({title:I(`configView.notifications.blocked`),description:I(`configView.notifications.blockedHint`),control:B({kind:`danger`,label:I(`configView.notifications.denied`)})}):j}
${n.error?k`
<div class="settings-row">
<div class="settings-row__text">
<span class="cfg-field__error">${m(n.error)}</span>
</div>
</div>
`:j}
</div>
</section>
${i&&n.preferences?k`<div class="settings-stack" ?inert=${n.loading}>
${n.preferences.durableIdentity?bo(n.preferences.user,t=>e.onWebPushSetUserPreferences?.(t)):j}
${xo(n.preferences.device,t=>e.onWebPushSetDevicePreferences?.(t))}
</div>`:j}
</div>
`}var wo;function To(){return(To=e((()=>{O(),Ct(),z(),F(),Rn(),v(),Ea(),ir(),Ln(),wo=[[`approvalRequested`,()=>I(`configView.notifications.approvalRequested`)],[`agentFinished`,()=>I(`configView.notifications.agentFinished`)],[`agentQuestion`,()=>I(`configView.notifications.agentQuestion`)],[`humanMentioned`,()=>I(`configView.notifications.humanMentioned`)],[`scheduledTaskFailed`,()=>I(`configView.notifications.scheduledTaskFailed`)],[`backgroundTaskFailed`,()=>I(`configView.notifications.backgroundTaskFailed`)]]})))()}function Eo(e,t,n){let i=r(t.formValue?.wizard)?t.formValue.wizard:{};return vn(k`
<details
class="settings-section config-advanced-disclosure"
id="config-section-wizard"
?open=${t.forceAdvancedSection===`wizard`}
>
<summary class="settings-section__heading config-advanced-disclosure__summary">
${I(`configForm.sections.wizard.label`)}
</summary>
<p class="settings-section__desc">${I(`configForm.sections.wizard.description`)}</p>
${_n(Object.entries(rr).map(([r,a])=>{let o=e.properties?.[r];return o?yr({schema:{...o,default:a},value:i[r],path:[`wizard`,r],hints:t.uiHints,unsupported:new Set,disabled:n,onPatch:t.onFormPatch,onRemove:t.onFormRemove}):j}))}
${_n($n.flatMap(n=>{let r=i[n];if(typeof r!=`string`||!r)return[];let a=de([`wizard`,n],t.uiHints);return[R({title:a?.label??e.properties?.[n]?.title??x(n),description:r})]}))}
</details>
`)}function Do(){return(Do=e((()=>{O(),Er(),xr(),z(),F(),tr()})))()}function Oo(e){let t=e.replace(/-([a-zA-Z])/g,(e,t)=>t.toUpperCase());return I(`languages.${t}`)}function ko(e,t,n){let r=e??`system`,i=`${I(`common.system`)} (${Oo(t)})`;return k`
<wa-select
class="settings-select"
.value=${r}
@change=${e=>{let t=e.currentTarget.value;n(t===`system`?void 0:t)}}
>
<span slot="label" class="settings-control__sr-label">${I(`quickSettings.language`)}</span>
<wa-option value="system" .label=${i} .selected=${r===`system`}>
${i}
</wa-option>
${kt.map(e=>{let t=Oo(e);return k`
<wa-option value=${e} .label=${t} .selected=${e===r}>
${t}
</wa-option>
`})}
</wa-select>
`}function Ao(){return(Ao=e((()=>{O(),Hn(),F()})))()}function jo(e){return I(e===`profile`?`configView.profileSyncedHint`:e===`device-local`?`quickSettings.personal.browserOnly`:e===`pending`?`configView.syncPendingHint`:`configView.syncedHint`)}function Mo(e){let t=L(e.localeResetValue?Oo(e.localeResetValue):I(`common.system`),e.localeOverridden),n=jo(e.localeProvenance);return k`
<section id=${E.language} class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`quickSettings.language`)}</h2>
</div>
<div class="settings-group">
${R({title:I(`quickSettings.language`),description:k`${t} ${n}`,control:ko(e.localeOverride,e.systemLocale,e.onLocaleChange)})}
</div>
</section>
`}function No(e){let t=e.state;if(!t||!e.onSelect)return j;let n=t.selectedDeviceId.trim(),r=t.devices.some(e=>e.deviceId===n),i=[{label:e.systemDefaultLabel,value:``},...t.devices.map(e=>({label:e.label,value:e.deviceId})),...n&&!r?[{label:e.fallbackLabel(t.devices.length+1),value:n}]:[]],a=!1,o=()=>{a||!t.permissionRequired||(a=!0,e.onRefresh?.())},s=e=>{e.button===0&&o()},c=e=>{[`Enter`,` `,`ArrowDown`,`ArrowUp`,`F4`].includes(e.key)&&o()},l=t.error?k`<span role="alert">${t.error}</span>`:!t.loading&&t.devices.length===0?e.emptyLabel:void 0;return R({title:e.title,description:k`${l?k`${l}<br />`:j}${I(`quickSettings.personal.browserOnly`)}`,control:k`
<select
class="settings-select settings-select--media-device"
data-settings-microphone=${e.dataAttribute===`microphone`?``:j}
data-settings-camera=${e.dataAttribute===`camera`?``:j}
aria-label=${e.title}
.value=${n}
@pointerdown=${s}
@keydown=${c}
@change=${t=>e.onSelect?.(t.currentTarget.value)}
>
${i.map(e=>k`
<option value=${e.value} ?selected=${e.value===n}>
${e.label}
</option>
`)}
</select>
`})}function Po(e){return No({state:e.microphone,title:I(`chat.composer.microphoneInput`),systemDefaultLabel:I(`chat.composer.systemDefaultMicrophone`),emptyLabel:I(`chat.composer.noMicrophones`),fallbackLabel:e=>I(`chat.composer.microphoneFallback`,{number:String(e)}),dataAttribute:`microphone`,onRefresh:e.onMicrophoneRefresh,onSelect:e.onMicrophoneSelect})}function Fo(e){return No({state:e.camera,title:I(`chat.composer.cameraInput`),systemDefaultLabel:I(`chat.composer.systemDefaultCamera`),emptyLabel:I(`chat.composer.noCameras`),fallbackLabel:e=>I(`chat.composer.cameraFallback`,{number:String(e)}),dataAttribute:`camera`,onRefresh:e.onCameraRefresh,onSelect:e.onCameraSelect})}function Io(e,t){let n=e.chatFollowUpMode??`server`,r=e.serverQueueMode??I(`chat.followUpModeLoading`),i=e.chatFollowUpMode?I(`chat.followUpModeOverriding`,{mode:r}):I(`chat.followUpModeUsingServer`,{mode:r}),a=L(N.chatMessageMaxWidth,e.chatMessageMaxWidth!==void 0),o=L(e.chatSendShortcutResetValue===`modifier-enter`?I(`chat.sendShortcutModifierEnter`):I(`chat.sendShortcutEnter`),e.chatSendShortcutOverridden),s=jo(e.chatSendShortcutProvenance),c=jo(e.chatFollowUpModeProvenance),l=L(I(`chat.catalogOpenTargetViewer`),e.catalogOpenTarget!==N.catalogOpenTarget),u=L(I(`common.enabled`),(e.composerHoldToRecord??N.composerHoldToRecord)!==N.composerHoldToRecord),d=L(I(`common.disabled`),e.chatCollapseTaskProgress!==N.chatCollapseTaskProgress);return k`
<section id=${E.chat} class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.chatPrefs.title`)}</h2>
</div>
<div class="settings-group">
${R({title:I(`configView.chatPrefs.messageWidth`),description:k`${I(`configView.chatPrefs.messageWidthHint`)}<br />
${a} ${I(`quickSettings.personal.browserOnly`)}`,control:t})}
${H({title:I(`configView.chatPrefs.collapseTaskProgress`),description:k`${I(`configView.chatPrefs.collapseTaskProgressHint`)}<br />
${d} ${I(`quickSettings.personal.browserOnly`)}`,checked:e.chatCollapseTaskProgress,onChange:e.setChatCollapseTaskProgress})}
${Z({title:I(`chat.sendShortcut`),value:e.chatSendShortcut,setting:`send-shortcut`,description:k`${o} ${s}`,options:[{value:`enter`,label:I(`chat.sendShortcutEnter`)},{value:`modifier-enter`,label:I(`chat.sendShortcutModifierEnter`)}],onChange:t=>e.setChatSendShortcut(lt(t))})}
${R({title:I(`chat.followUpMode`),description:k`${i} ${c}`,control:k`
<select
class="settings-select"
data-settings-follow-up-mode
aria-label=${I(`chat.followUpMode`)}
.value=${n}
@change=${t=>{let n=t.currentTarget.value;e.setChatFollowUpMode(n===`server`?void 0:Ee(n))}}
>
<option value="server" ?selected=${n===`server`}>
${I(`chat.followUpModeServer`,{mode:r})}
</option>
<option value="steer" ?selected=${n===`steer`}>
${I(`chat.followUpModeSteer`)}
</option>
<option value="queue" ?selected=${n===`queue`}>
${I(`chat.followUpModeQueue`)}
</option>
</select>
${e.chatFollowUpModeOverridden?k`<button
type="button"
class="btn btn--sm"
@click=${e.resetChatFollowUpMode}
>
${I(`chat.followUpModeReset`)}
</button>`:j}
`})}
${Z({title:I(`chat.catalogOpenTarget`),value:e.catalogOpenTarget,setting:`catalog-open-target`,description:k`${l}
${I(`quickSettings.personal.browserOnly`)}`,options:[{value:`viewer`,label:I(`chat.catalogOpenTargetViewer`)},{value:`terminal`,label:I(`chat.catalogOpenTargetTerminal`)}],onChange:t=>e.setCatalogOpenTarget(Pe(t))})}
${Po(e)} ${Fo(e)}
${e.setComposerHoldToRecord?H({title:I(`chat.composer.holdToRecordSetting`),description:k`${I(`chat.composer.holdToRecordSettingDescription`)}<br />
${u} ${I(`quickSettings.personal.browserOnly`)}`,checked:e.composerHoldToRecord??N.composerHoldToRecord,onChange:e.setComposerHoldToRecord}):j}
</div>
</section>
`}function Lo(e){if(!e.setLobsterPetVisits||!e.setLobsterPetSounds)return j;let t=e.lobsterPetVisits??N.lobsterPetVisits,n=e.lobsterPetSounds??N.lobsterPetSounds,r=L(I(`common.enabled`),t!==N.lobsterPetVisits),i=L(I(`common.disabled`),n!==N.lobsterPetSounds),a=Ut(),o=Yt.filter(e=>a.has(e.id)).length;return k`
<section class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`quickSettings.appearance.lobsterdex`)}</h2>
</div>
<div class="settings-group">
${H({title:I(`quickSettings.appearance.lobsterVisits`),description:t?k`${I(`quickSettings.appearance.lobsterVisitsOn`)}<br />
${r} ${I(`quickSettings.personal.browserOnly`)}`:k`${I(`quickSettings.appearance.lobsterVisitsOff`)}<br />
${r} ${I(`quickSettings.personal.browserOnly`)}`,checked:t,onChange:t=>e.setLobsterPetVisits?.(t)})}
${H({title:I(`quickSettings.appearance.lobsterSounds`),description:n?k`${I(`quickSettings.appearance.lobsterSoundsOn`)}<br />
${i} ${I(`quickSettings.personal.browserOnly`)}`:k`${I(`quickSettings.appearance.lobsterSoundsOff`)}<br />
${i} ${I(`quickSettings.personal.browserOnly`)}`,checked:n,onChange:t=>e.setLobsterPetSounds?.(t),onAct:e=>{e&&nn()}})}
${R({title:I(`quickSettings.appearance.lobsterdex`),description:I(`quickSettings.appearance.lobsterdexSeen`,{seen:String(o),total:String(Yt.length)}),stacked:!0,control:k`
<div class="lobsterdex__gallery">
<div class="lobsterdex">
${Yt.map(e=>{let t=Zt(e),n=a.get(e.id),r=n!==void 0,i=n?.shinySeenAt!=null,o=r?n.name??rn(e.id):`?`,s=i?`${o} ✦`:o,c=Bt[e.id],l=r?c.flavor:c.hint,u=r&&n.firstSeenAt!==null?I(`quickSettings.appearance.lobsterdexFirstVisited`,{name:o,date:new Date(n.firstSeenAt).toLocaleDateString()}):null,d=[s,l,u].filter(e=>e!==null).join(`
`);return k`
<openclaw-tooltip>
<span
class="lobsterdex__mini lobster-pet--palette-${e.id} ${r?``:`lobsterdex__mini--unseen`}"
style=${zt(t)}
tabindex="0"
role="img"
aria-label=${d}
>
${un(t,{standalone:!0})}
${i?k`<span class="lobsterdex__mini-star" aria-hidden="true">✦</span>`:j}
</span>
<span slot="content" class="lobsterdex__tooltip">
<strong>${s}</strong>
<span>${l}</span>
${u?k`<span>${u}</span>`:j}
</span>
</openclaw-tooltip>
`})}
</div>
${e.lobsterdexHref?k`<a
class="btn btn--sm lobsterdex__open"
href=${e.lobsterdexHref}
@click=${t=>{_(t)&&(t.preventDefault(),e.onOpenLobsterdex?.())}}
>${I(`quickSettings.appearance.lobsterdexOpen`)}</a
>`:j}
</div>
`})}
</div>
</section>
`}function Ro(e){let t=[...e.hiddenSessionCatalogIds].toSorted(),n=L(I(`common.enabled`),e.sidebarLiveActivity!==N.sidebarLiveActivity),r=e.setSessionDeleteConfirm,i=e.sessionDeleteConfirm??N.sessionDeleteConfirm,a=L(I(`common.enabled`),i!==N.sessionDeleteConfirm);return k`
<section id=${E.sidebar} class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.sidebarPrefs.title`)}</h2>
</div>
<p class="settings-section__desc">${I(`configView.sidebarPrefs.hint`)}</p>
<div class="settings-group">
${H({title:I(`configView.sidebarPrefs.liveActivity`),description:k`${I(`configView.sidebarPrefs.liveActivityHint`)}<br />
${n} ${I(`quickSettings.personal.browserOnly`)}`,checked:e.sidebarLiveActivity,onChange:e.setSidebarLiveActivity})}
${r?H({title:I(`configView.sidebarPrefs.deleteConfirm`),description:k`${I(`configView.sidebarPrefs.deleteConfirmHint`)}<br />
${a} ${I(`quickSettings.personal.browserOnly`)}`,checked:i,onChange:r}):j}
</div>
${t.length>0?k`
<div class="settings-section__header settings-section__header--subsection">
<h3 class="settings-section__heading">
${I(`chat.sidebar.hiddenSessionSections`)}
</h3>
</div>
<div class="settings-group">
${t.map(t=>R({title:e.hiddenSessionCatalogLabels.get(t)??t,description:I(`quickSettings.personal.browserOnly`),control:k`<button
type="button"
class="btn btn--sm"
@click=${()=>e.setSessionCatalogHidden(t,!1)}
>
${I(`chat.sidebar.showSessionSection`)}
</button>`}))}
</div>
`:j}
<div class="settings-section__header settings-section__header--subsection">
<h3 class="settings-section__heading">${I(`configView.sessionObserver.title`)}</h3>
</div>
<p class="settings-section__desc">${I(`configView.sessionObserver.hint`)}</p>
${ya({enabled:e.sessionObserverEnabled!==!1,utilityModel:e.sessionObserverUtilityModel,resolvedUtilityModel:e.sessionObserverResolvedModel,models:e.sessionObserverModels??[],modelsUnavailable:e.sessionObserverModelsUnavailable===!0,disabled:e.sessionObserverDisabled===!0,onEnabledChange:t=>e.setSessionObserverEnabled?.(t),onUtilityModelChange:t=>e.setSessionObserverUtilityModel?.(t)})}
</section>
`}function zo(){return(zo=e((()=>{O(),Me(),Wt(),qt(),Gt(),Ht(),wt(),z(),F(),Ao(),ne(),xa(),Ea()})))()}function Bo(e,t){return e===`custom`&&t!==`custom`?k`<span class="settings-theme-card__icon" aria-hidden="true"
>${P.download}</span
>`:k`
<span class="settings-theme-card__palette" aria-hidden="true">
<span class="settings-theme-card__chip settings-theme-card__chip--accent"></span>
<span class="settings-theme-card__chip settings-theme-card__chip--accent-2"></span>
<span class="settings-theme-card__chip settings-theme-card__chip--bg"></span>
</span>
`}function Vo(e){return e.hasCustomTheme&&e.customThemeLabel?e.customThemeLabel:I(`configView.appearance.importedTheme`)}function Ho(){(typeof requestAnimationFrame==`function`?requestAnimationFrame:e=>window.setTimeout(()=>e(0),0))(()=>{let e=globalThis.document?.querySelector(`[data-custom-theme-import-input]`);e&&(typeof e.scrollIntoView==`function`&&e.scrollIntoView({block:`center`,behavior:Fn()}),e.focus(),e.select())})}function Uo(e,t){let n=Object.entries(Ze).map(([e,t])=>({value:e,label:e===`system`?I(`configView.appearance.fonts.system`):t.label,description:I(`configView.appearance.fontNotes.${e}`),labelStyle:`font-family: ${t.stack}`}));return k`
<section class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.appearance.typography`)}</h2>
</div>
<div class="settings-group">
${[`ui`,`chat`].map(r=>{let i=r===`ui`,a=I(`configView.appearance.fonts.${r}`),o=Ye[e.theme][r];return R({title:a,description:jo(i?e.fontUiProvenance:e.fontChatProvenance),stackedOnNarrow:!0,control:Un({id:`settings-font-${r}`,label:a,value:(i?e.fontUi:e.fontChat)??`theme`,options:[{value:`theme`,label:I(`configView.appearance.fonts.themeDefault`),description:I(`configView.appearance.fonts.themeFace`,{theme:t,face:Ze[o].label}),labelStyle:`font-family: ${Ze[o].stack}`},...n],onOpen:at,onChange:t=>(i?e.setFontUi:e.setFontChat)(et(t))})})})}
<div class="settings-row settings-row--stacked">
<div class="settings-typography-preview">
<div class="settings-typography-preview__caption">
${I(`configView.appearance.fonts.previewCaption`)}
</div>
<p class="settings-typography-preview__prose">
${I(`configView.appearance.fonts.previewProse`)}
</p>
<code class="settings-typography-preview__code"
>${I(`configView.appearance.fonts.previewCode`)}</code
>
</div>
</div>
</div>
</section>
`}function Wo(e,t){let n=e.viewState,r=e.hasCustomTheme||e.customThemeImportExpanded===!0;r&&e.customThemeImportFocusToken!=null&&e.customThemeImportFocusToken!==n.lastCustomThemeImportFocusToken&&(n.lastCustomThemeImportFocusToken=e.customThemeImportFocusToken,Ho());let i=Vo(e),a=[...Ko.map(e=>({id:e.id,label:I(e.labelKey),description:I(e.descriptionKey)})),{id:`custom`,label:e.hasCustomTheme?i:I(`configView.appearance.import`),description:e.hasCustomTheme?I(`configView.appearance.importedFrom`,{name:i}):I(`configView.appearance.importHint`)}],o=a.find(t=>t.id===e.themeResetValue)?.label??I(`configView.themes.claw.label`),s=e.themeModeResetValue===`light`?I(`common.light`):e.themeModeResetValue===`dark`?I(`common.dark`):I(`common.system`),c=jo(e.themeProvenance),l=jo(e.themeModeProvenance),u=jo(e.accentProvenance),d=e.accent===e.accentResetValue,f=e.accentResetValue??`var(--theme-chip-accent)`,p=!!(!d&&e.accent&&!qo.some(t=>t.hex===e.accent)),m=qo.find(t=>t.hex!==void 0&&t.hex===e.accent),h=d?I(`configView.appearance.usingInheritedAccent`):I(`configView.appearance.usingAccent`,{value:I(m?m.labelKey:`configView.appearance.customAccent`)});return k`
<div class="settings-page">
${Mo(e)}
<section id=${E.theme} class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.appearance.theme`)}</h2>
</div>
<p class="settings-section__desc">
${I(`configView.appearance.chooseTheme`)}
${L(o,e.themeOverridden)}
${c}
</p>
<div class="settings-group">
<div class="settings-row settings-row--stacked">
<div class="settings-theme-grid">
${a.map(t=>k`
<button
class="settings-theme-card settings-theme-card--${t.id} ${t.id===e.theme?`settings-theme-card--active`:``}"
aria-pressed=${t.id===`custom`&&!e.hasCustomTheme?j:String(t.id===e.theme)}
title=${t.description}
@click=${n=>{if(t.id===`custom`&&!e.hasCustomTheme){e.onOpenCustomThemeImport?.();return}if(t.id!==e.theme||t.id===e.themeResetValue&&e.themeOverridden){let r={element:n.currentTarget??void 0};e.setTheme(t.id,r)}}}
>
${Bo(t.id,e.theme)}
<span class="settings-theme-card__label">${t.label}</span>
</button>
`)}
</div>
</div>
${R({title:I(`common.colorMode`),description:k`${L(s,e.themeModeOverridden)}
${l}`,stackedOnNarrow:!0,control:Sn({value:e.themeMode,options:[{value:`system`,label:I(`common.system`)},{value:`light`,label:I(`common.light`)},{value:`dark`,label:I(`common.dark`)}],ariaLabel:I(`common.colorMode`),onChange:(t,n)=>e.setThemeMode(t,{element:n}),onReselect:(t,n)=>{e.themeModeOverridden&&t===e.themeModeResetValue&&e.setThemeMode(t,{element:n})}})})}
<div class="settings-row settings-row--stacked">
${r?k`
<div class="settings-theme-import">
<div class="settings-theme-import__copy">
<div class="settings-theme-import__title">
${I(`configView.appearance.importFromTweakcn`)}
</div>
<p class="settings-theme-import__hint">
${I(`configView.appearance.tweakcnInstructions`)}
</p>
</div>
<a
class="settings-theme-import__external"
href="https://tweakcn.com/editor/theme"
target="_blank"
rel="noreferrer noopener"
>
${I(`configView.appearance.browseTweakcn`)} ${P.externalLink}
</a>
<label class="settings-theme-import__field">
<span class="settings-theme-import__label"
>${I(`configView.appearance.themeLink`)}</span
>
${t.customThemeImport}
</label>
<div class="settings-theme-import__actions">
<button
class="btn btn--sm primary"
?disabled=${e.customThemeImportBusy||e.customThemeImportUrl.trim().length===0}
@click=${e.onImportCustomTheme}
>
${e.customThemeImportBusy?I(`common.importing`):e.hasCustomTheme?I(`configView.appearance.replace`,{name:i}):I(`configView.appearance.importTheme`)}
</button>
${e.hasCustomTheme?k`<button
class="btn btn--sm danger"
@click=${e.onClearCustomTheme}
>
${I(`configView.appearance.clear`,{name:i})}
</button>`:j}
</div>
${e.hasCustomTheme?k`<div class="settings-theme-import__meta">
<span class="settings-theme-import__meta-label"
>${I(`configView.appearance.loaded`)}</span
>
<span class="settings-theme-import__meta-value"
>${i} · ${e.customThemeSourceUrl??`tweakcn`}</span
>
</div>`:j}
${e.customThemeImportMessage?k`<div
class="settings-theme-import__message settings-theme-import__message--${e.customThemeImportMessage.kind}"
role=${e.customThemeImportMessage.kind===`error`?`alert`:`status`}
>
${e.customThemeImportMessage.text}
</div>`:j}
</div>
`:k`<p class="settings-theme-import__inline-hint">
${I(`configView.appearance.inlineHintBefore`)}
<strong>${I(`configView.appearance.import`)}</strong>
${I(`configView.appearance.inlineHintAfter`)}
</p>`}
</div>
</div>
</section>
<section id=${E.accent} class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.appearance.accent`)}</h2>
</div>
<p class="settings-section__desc">${I(`configView.appearance.accentHint`)}</p>
<div class="settings-group">
<div class="settings-row settings-row--stacked">
<div class="settings-accent-swatches">
${qo.map(t=>{let n=t.hex===void 0,r=n?d:!d&&t.hex===e.accent,i=I(t.labelKey),a=n?` settings-accent-theme--${e.theme}`:``;return k`
<button
type="button"
class="settings-accent-swatch${a} ${r?`settings-accent-swatch--active`:``}"
style=${Ce({"--settings-accent-swatch":t.hex??f})}
data-accent-preset=${t.id}
aria-label=${i}
aria-pressed=${String(r)}
title=${i}
@click=${()=>e.setAccent(t.hex)}
>
${n&&!d?k`<span class="settings-accent-swatch__reset" aria-hidden="true"
>${P.rotateCcw}</span
>`:r?k`<span class="settings-accent-swatch__check" aria-hidden="true"
>${P.check}</span
>`:j}
</button>
`})}
<span
class="settings-accent-swatch settings-accent-swatch--custom ${p?`settings-accent-swatch--active`:``}"
style=${Ce({"--settings-accent-swatch":e.accent??qo[1].hex,"--settings-accent-swatch-ink":ke(e.accent??qo[1].hex)})}
>
<input
type="color"
class="settings-accent-swatch__input"
data-accent-custom
aria-label=${I(`configView.appearance.customAccent`)}
aria-describedby="settings-accent-status"
title=${I(`configView.appearance.customAccent`)}
.value=${e.accent??qo[1].hex}
@input=${t=>e.setAccent(t.currentTarget.value)}
/>
<span class="settings-accent-swatch__picker" aria-hidden="true"
>${P.pipette}</span
>
</span>
</div>
</div>
</div>
<p id="settings-accent-status" class="settings-section__desc settings-accent-status">
<span class="settings-accent-status__selection">${h}</span>
<span class="settings-accent-status__scope">${u}</span>
</p>
</section>
${Uo(e,a.find(t=>t.id===e.theme).label)}
<section id=${E.textSize} class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.appearance.textSize`)}</h2>
</div>
<p class="settings-section__desc">
${L(`${N.textScale}%`,e.textScaleOverridden)}
${I(`quickSettings.personal.browserOnly`)}
</p>
<div class="settings-group">
<div class="settings-row settings-row--stacked">
<div class="settings-text-scale">
<div class="settings-text-scale__options">
${Ne.map(t=>k`
<button
type="button"
class="settings-text-scale__btn ${t===e.textScale?`active`:``}"
aria-pressed=${String(t===e.textScale)}
@click=${()=>e.setTextScale(t)}
>
<span class="settings-text-scale__sample">${I(Go[t])}</span>
<span class="settings-text-scale__label">${t}%</span>
</button>
`)}
</div>
</div>
</div>
</div>
</section>
${Ro(e)} ${Lo(e)}
${Io(e,t.chatMessageWidth)}
<section id=${E.connection} class="settings-section">
<div class="settings-section__header">
<h2 class="settings-section__heading">${I(`configView.connection.title`)}</h2>
</div>
<div class="settings-group">
${R({title:I(`configView.connection.gateway`),control:U(e.gatewayUrl||`-`,{mono:!0})})}
${R({title:I(`configView.connection.status`),control:B({kind:e.connected?`ok`:`muted`,label:e.connected?I(`common.connected`):I(`common.offline`)})})}
${e.assistantName?R({title:I(`configView.connection.assistant`),control:U(e.assistantName)}):j}
</div>
</section>
</div>
`}var Go,Ko,qo;function Jo(){return(Jo=e((()=>{O(),Se(),Me(),dt(),Ct(),Wn(),z(),F(),ne(),zo(),Go={90:`configView.textSizes.small`,100:`configView.textSizes.default`,110:`configView.textSizes.large`,125:`configView.textSizes.xl`,140:`configView.textSizes.xxl`},Ko=[{id:`claw`,labelKey:`configView.themes.claw.label`,descriptionKey:`configView.themes.claw.description`},{id:`knot`,labelKey:`configView.themes.knot.label`,descriptionKey:`configView.themes.knot.description`},{id:`dash`,labelKey:`configView.themes.dash.label`,descriptionKey:`configView.themes.dash.description`},{id:`absolutely`,labelKey:`configView.themes.absolutely.label`,descriptionKey:`configView.themes.absolutely.description`},{id:`tide`,labelKey:`configView.themes.tide.label`,descriptionKey:`configView.themes.tide.description`},{id:`beacon`,labelKey:`configView.themes.beacon.label`,descriptionKey:`configView.themes.beacon.description`},{id:`phosphor`,labelKey:`configView.themes.phosphor.label`,descriptionKey:`configView.themes.phosphor.description`},{id:`crt`,labelKey:`configView.themes.crt.label`,descriptionKey:`configView.themes.crt.description`},{id:`manuscript`,labelKey:`configView.themes.manuscript.label`,descriptionKey:`configView.themes.manuscript.description`},{id:`rose`,labelKey:`configView.themes.rose.label`,descriptionKey:`configView.themes.rose.description`},{id:`miami`,labelKey:`configView.themes.miami.label`,descriptionKey:`configView.themes.miami.description`}],qo=[{id:`default`,hex:void 0,labelKey:`configView.appearance.accents.default`},{id:`claw`,hex:`#ff5c5c`,labelKey:`configView.appearance.accents.claw`},{id:`coral`,hex:`#ff8066`,labelKey:`configView.appearance.accents.coral`},{id:`amber`,hex:`#f5b942`,labelKey:`configView.appearance.accents.amber`},{id:`mint`,hex:`#52c99a`,labelKey:`configView.appearance.accents.mint`},{id:`teal`,hex:`#35b9b0`,labelKey:`configView.appearance.accents.teal`},{id:`blue`,hex:`#5b9cf6`,labelKey:`configView.appearance.accents.blue`},{id:`violet`,hex:`#a78bfa`,labelKey:`configView.appearance.accents.violet`},{id:`pink`,hex:`#f472b6`,labelKey:`configView.appearance.accents.pink`},{id:`slate`,hex:`#8795a8`,labelKey:`configView.appearance.accents.slate`}]})))()}function Yo(e){return e.length>0?e.join(`.`):I(`configView.root`)}function Xo(e,t){if(!e||!t)return[];let n=[],r=0;function i(e,t,r){n.length<as&&n.push({path:e,from:t,to:r})}function a(e,t,n){if(e.length!==t.length||e.length>os)return!0;for(let r=0;r<e.length;r+=1)if(s(e[r],t[r],n+1))return!0;return!1}function o(e,t,n){let r=Object.keys(e),i=Object.keys(t);if(r.length!==i.length)return!0;for(let i of r)if(!Object.hasOwn(t,i)||s(e[i],t[i],n+1))return!0;return!1}function s(e,t,n){return r+=1,r>is||n>rs?!0:e===t?!1:typeof e==typeof t?typeof e!=`object`||!e||t===null?e!==t:Array.isArray(e)||Array.isArray(t)?Array.isArray(e)&&Array.isArray(t)?a(e,t,n+1):!0:o(e,t,n+1):!0}function c(e,t,o,s){if(r+=1,r>is||s>rs||n.length>=as||e===t)return;if(typeof e!=typeof t){i(o,e,t);return}if(typeof e!=`object`||!e||t===null){e!==t&&i(o,e,t);return}if(Array.isArray(e)||Array.isArray(t)){(Array.isArray(e)&&Array.isArray(t)&&a(e,t,s+1)||!Array.isArray(e)||!Array.isArray(t))&&i(o,e,t);return}let l=e,u=t,d=new Set([...Object.keys(l),...Object.keys(u)]);for(let e of d)c(l[e],u[e],[...o,e],s+1)}return c(e,t,[],0),n}function Zo(e,t,n){if(e.rawDiffCache?.original===t&&e.rawDiffCache.current===n)return e.rawDiffCache.diff;if(t.length>ss||n.length>ss)return e.rawDiffCache={original:t,current:n,diff:[]},e.rawDiffCache.diff;try{let r=ue(t),i=ue(n);if(!r||!i||typeof r!=`object`||typeof i!=`object`||Array.isArray(r)||Array.isArray(i))return e.rawDiffCache={original:t,current:n,diff:[]},[];let a=Xo(r,i);return e.rawDiffCache={original:t,current:n,diff:a},a}catch{return ce()&&(e.rawDiffCache={original:t,current:n,diff:[]}),[]}}function Qo(e,t=40){if(Array.isArray(e))return I(e.length===1?`configView.itemCount`:`configView.itemCountPlural`,{count:String(e.length)});let r;try{r=JSON.stringify(e)??String(e)}catch{r=String(e)}return r.length<=t?r:n(r,t-3)+`...`}function $o(e,t){let n=e.split(`.`);return n.length===t.length&&n.every((e,n)=>e===`*`||e===t[n])}function es(e,t){return Object.entries(t).some(([t,n])=>!!n.sensitive&&$o(t,e))}function ts(e,t){for(let n=1;n<=e.length;n+=1){let r=e.slice(0,n),i=Yo(r);if((de(r,t)?.sensitive??!1)||es(r,t)||Sr(i))return!0}return!1}function ns(e,t,n,r){let i=br(t,e,n)>0;return!r&&t!=null&&(ts(e,n)||i)?Tr():Qo(t)}var rs,is,as,os,ss;function cs(){return(cs=e((()=>{Cr(),xr(),F(),ge(),rs=64,is=2e4,as=1e3,os=2e3,ss=2e5})))()}function ls(e){return us.has(e)}var us;function ds(){return(ds=e((()=>{us=new Set([`defaults`,`modelByChannel`])})))()}function fs(e,t){let n=Object.entries(e.properties??{}),r=n.filter(([e])=>!ls(e)).map(([e,n])=>({key:e,label:de([`channels`,e],t)?.label??n.title??x(e),keys:[e]})).toSorted((e,t)=>e.label.localeCompare(t.label)||e.key.localeCompare(t.key)),i=n.filter(([e])=>ls(e)).map(([e])=>e);return[...r,...i.length>0?[{key:null,label:I(`configView.categories.other`),keys:i}]:[]]}function ps(e){return hs[e]??P.file}function ms(e,t,n){return k`
<div class="config-accordion-nav">
${t.map(t=>{let r=t.sections.some(t=>t.key===e.activeSection),i=`config-accordion-panel-${t.id}`;return k`
<div class="config-accordion-group">
<button
class="config-accordion-group__header ${r?`config-accordion-group__header--active`:``}"
aria-expanded=${r?`true`:`false`}
aria-controls=${i}
@click=${i=>{let a=t.sections[0]?.key??null;e.onSectionChange(r?null:a),n(i.currentTarget)}}
>
<span class="config-accordion-group__icon">
${ps(t.sections[0]?.key??`default`)}
</span>
<span>${t.label}</span>
<svg
class="config-accordion-group__chevron ${r?`config-accordion-group__chevron--open`:``}"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
width="14"
height="14"
>
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</button>
<div id=${i} class="config-accordion-group__items" ?hidden=${!r}>
${t.sections.map(t=>k`<button
class="config-accordion-group__item ${e.activeSection===t.key?`config-accordion-group__item--active`:``}"
aria-current=${e.activeSection===t.key?`true`:j}
@click=${r=>{e.onSectionChange(t.key),n(r.currentTarget)}}
>
<span class="config-accordion-group__item-icon">
${ps(t.key)}
</span>
${t.label}
</button>`)}
</div>
</div>
`})}
</div>
`}var hs,gs,_s;function vs(){return(vs=e((()=>{O(),ds(),xr(),Ct(),F(),hs={all:P.layoutGrid,env:P.settings,update:P.download,agents:P.bot,auth:P.lock,channels:P.messageSquare,messages:P.mail,commands:P.terminal,hooks:P.link,skills:P.star,tools:P.wrench,gateway:P.globe,wizard:P.wandSparkles,meta:P.penLine,logging:P.fileText,browser:P.chrome,ui:P.panelsTopLeft,models:P.box,bindings:P.server,broadcast:P.radio,tts:P.music,session:P.users,cron:P.clock,discovery:P.search,talk:P.mic,plugins:P.asterisk,diagnostics:P.activity,cli:P.terminal,secrets:P.key,acp:P.users,mcp:P.server,__appearance__:P.sun,__notifications__:P.bell},gs=[{id:`core`,sections:[`env`,`auth`,`update`,`meta`,`logging`,`diagnostics`,`cli`,`secrets`,`wizard`]},{id:`ai`,sections:[`agents`,`models`,`skills`,`tools`,`memory`,`session`]},{id:`communication`,sections:[`channels`,`messages`,`broadcast`,`__notifications__`,`talk`,`tts`]},{id:`security`,sections:[`security`,`approvals`]},{id:`automation`,sections:[`commands`,`hooks`,`bindings`,`cron`,`plugins`]},{id:`infrastructure`,sections:[`gateway`,`browser`,`nodeHost`,`discovery`,`acp`,`mcp`]},{id:`appearance`,sections:[`__appearance__`,`ui`]}],_s=new Set(gs.flatMap(e=>e.sections))})))()}function ys(e,t){if(!e||b(e)!==`object`||!e.properties)return e;let n=t.include,r=t.exclude,i={};for(let t of Object.keys(e.properties)){if(n&&n.size>0&&!n.has(t)||r&&r.size>0&&r.has(t))continue;let a=e.properties[t];a&&(i[t]=a)}return{...e,properties:i}}function bs(e){return r(e)?e:null}function xs(e){return e?.length?e.join(``):``}function Ss(e,t,n,r,i,a){let o=xs(n),s=xs(r),c=e.schemaAnalysisCache;if(c&&c.schema===t&&c.includeKey===o&&c.excludeKey===s)return c.analysis;let l=ys(t,{include:i,exclude:a}),u=wr(l);return e.schemaAnalysisCache={schema:t,includeKey:o,excludeKey:s,analysis:u},u}function Cs(e,t){if(!e||t===`<root>`)return!1;let n=t.split(`.`),r=(e,t)=>{if(t===n.length)return e!==void 0;if(typeof e!=`object`||!e)return!1;let i=n[t];return i===`*`?Object.values(e).some(e=>r(e,t+1)):!i||!Object.hasOwn(e,i)?!1:r(e[i],t+1)};return r(e,0)}function ws(e){let t=`__OPENCLAW_CONFIG_PATHS__`,n=e.length===1?`configView.formUnsafeCount`:`configView.formUnsafeCountPlural`,[r,i=``]=I(n,{count:String(e.length),paths:t}).split(t);return k`
<span class="config-content-callout__text">
${r}${e.slice(0,3).map((e,t)=>k`${t>0?`, `:``}<code>${e}</code>`)}${i}${e.length>3?k` ${I(`configView.formUnsafeMore`,{count:String(e.length-3)})}`:j}
</span>
`}function Ts(){return(Ts=e((()=>{O(),xr(),Dr(),F()})))()}function Es(){return{rawRevealed:!1,rawDiffOpen:!1,envRevealed:!1,validityDismissed:!1,revealedSensitivePaths:new Set,lastCustomThemeImportFocusToken:null,lastConfigContextKey:null,lastFormModeForScroll:null}}function Ds(e){e.rawRevealed=!1,e.rawDiffOpen=!1,e.envRevealed=!1,e.validityDismissed=!1,e.revealedSensitivePaths.clear(),e.lastCustomThemeImportFocusToken=null,e.rawDiffCache=void 0}function Os(e){let t=e.includeSections?.join(``)??``,n=e.excludeSections?.join(``)??``;return[e.configPath??``,e.gatewayUrl,e.navRootLabel??``,t,n].join(``)}function ks(e,t){let n=be(t);return n?e.revealedSensitivePaths.has(n):!1}function As(e,t){let n=be(t);n&&(e.revealedSensitivePaths.has(n)?e.revealedSensitivePaths.delete(n):e.revealedSensitivePaths.add(n))}function js(){return(js=e((()=>{xr()})))()}function Ms(e){return Wo(e,{chatMessageWidth:k`
<input
class="settings-input"
data-settings-chat-message-width
type="text"
spellcheck="false"
placeholder="48rem"
.value=${e.chatMessageMaxWidth??``}
@change=${t=>{let n=t.currentTarget,r=gt(n.value);if(n.value.trim()&&!r){n.setCustomValidity(I(`configView.chatPrefs.messageWidthInvalid`)),n.reportValidity();return}n.setCustomValidity(``),n.value=r??``,e.setChatMessageMaxWidth(r)}}
/>
`,customThemeImport:k`
<input
class="settings-theme-import__input"
data-custom-theme-import-input
type="text"
spellcheck="false"
placeholder="https://tweakcn.com/editor/theme?theme=... or amethyst-haze"
.value=${e.customThemeImportUrl}
@input=${t=>e.onCustomThemeImportUrlChange(t.currentTarget.value)}
/>
`})}function Ns(e){let t=e.viewState,n=e.showModeToggle??!1,r=e.showRootTab??!0,i=e.valid==null?`unknown`:e.valid?`valid`:`invalid`,a=e.includeVirtualSections??!0,o=e.includeSections?.length?new Set(e.includeSections):null,s=e.excludeSections?.length?new Set(e.excludeSections):null,c=Ss(t,bs(e.schema),e.includeSections,e.excludeSections,o,s),l=c.unsupportedPaths.filter(t=>t!==`<root>`&&(!e.activeSection||t===e.activeSection||t.startsWith(`${e.activeSection}.`))&&Cs(e.formValue,t)),u=l.length>0,d=e.forceShowAdvanced===!0||e.showAdvancedSettings,f=e.rawAvailable??!0,p=!!e.rawDraftPending&&f,m=n&&f?e.formMode:`form`,h=p?`raw`:m,g=e.onViewStateChange,_=e=>{queueMicrotask(()=>{let t=[(e instanceof Element?e:null)?.closest(`.config-lead`)?.parentElement?.querySelector(`.config-content`)??globalThis.document?.querySelector(`.config-content`),globalThis.document?.querySelector(`.shell--settings .content`)];for(let e of t)e&&(typeof e.scrollTo==`function`?e.scrollTo({top:0,left:0,behavior:`auto`}):(e.scrollTop=0,e.scrollLeft=0))})};t.lastFormModeForScroll!==null&&t.lastFormModeForScroll!==h&&_(null),t.lastFormModeForScroll=h;let v=Os(e);t.lastConfigContextKey!==v&&(Ds(t),t.lastConfigContextKey=v);let y=t.envRevealed,b=c.schema?.properties??{},ee=new Set([`__appearance__`,`__notifications__`]),te=e=>a&&ee.has(e)&&(e===`__appearance__`||o?.has(e)===!0),ne=e=>I(`configView.sections.${e===`__appearance__`?`theme`:e===`__notifications__`?`notifications`:e}`),re=gs.map(e=>({id:e.id,label:I(`configView.categories.${e.id}`),sections:e.sections.filter(e=>(te(e)||e in b)&&(!o||o.has(e))&&(!s||!s.has(e))).map(e=>({key:e,label:ne(e)}))})).filter(e=>e.sections.length>0),ie=Object.keys(b).filter(e=>!_s.has(e)).map(e=>({key:e,label:e.charAt(0).toUpperCase()+e.slice(1)})),ae=ie.length>0?{id:`other`,label:I(`configView.categories.other`),sections:ie}:null,x=e.activeSection===`channels`?b.channels:void 0,S=x?fs(x,e.uiHints):[],C=S.find(t=>t.key===e.activeSubsection)??S[0],oe=x&&C?{...c.schema,properties:{...b,channels:{...x,properties:Object.fromEntries(Object.entries(x.properties??{}).filter(([e])=>C.keys.includes(e))),required:x.required?.filter(e=>C.keys.includes(e)),additionalProperties:!1}}}:c.schema,se=oe?.properties?.wizard,le=se&&(!e.activeSection||e.activeSection===`wizard`),ue=se?{...oe,properties:Object.fromEntries(Object.entries(oe.properties??{}).filter(([e])=>e!==`wizard`))}:oe,de=[...r?[{key:null,label:e.navRootLabel??I(`nav.settings`)}]:[],...[...re,...ae?[ae]:[]].flatMap(e=>e.sections.map(e=>({key:e.key,label:e.label})))],fe=e.settingsLayout??`tabs`,pe=[...re,...ae?[ae]:[]],w=h===`raw`&&e.raw!==e.originalRaw;(!w||h!==`raw`)&&t.rawDiffOpen&&(t.rawDiffOpen=!1),(!w||h!==`raw`||!t.rawDiffOpen)&&(t.rawDiffCache=void 0);let he=h===`raw`&&w&&t.rawDiffOpen?Zo(t,e.originalRaw,e.raw):[];h===`raw`&&w&&t.rawDiffOpen&&!ce()&&me().then(()=>g()).catch(()=>void 0);let ge=e.loading||e.saving||e.applying||e.updating,_e=e.mutationAllowed!==!1,ve=e.connected&&_e&&!ge&&w,ye=a&&h===`form`&&e.activeSection===null&&!!o?.has(`__appearance__`),be=w&&h===`raw`?k`<details
class="config-diff"
?open=${t.rawDiffOpen}
@toggle=${e=>{let n=e.target;t.rawDiffOpen!==n.open&&(t.rawDiffOpen=n.open,n.open||(t.rawDiffCache=void 0),g())}}
>
<summary class="config-diff__summary">
<span>${I(`configView.viewPendingChangesRaw`)}</span>
<svg
class="config-diff__chevron"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
>
<polyline points="6 9 12 15 18 9"></polyline>
</svg>
</summary>
<div class="config-diff__content">
${he.length>0?he.map(n=>k`<div class="config-diff__item">
<div class="config-diff__path">${Yo(n.path)}</div>
<div class="config-diff__values">
<span class="config-diff__from"
>${ns(n.path,n.from,e.uiHints,t.rawRevealed)}</span
>
<span class="config-diff__arrow">→</span>
<span class="config-diff__to"
>${ns(n.path,n.to,e.uiHints,t.rawRevealed)}</span
>
</div>
</div>`):k`<div class="config-diff__item">${I(`configView.rawDiffUnavailable`)}</div>`}
</div>
</details>`:j,T=fe!==`accordion`&&de.length>1,xe=T?or({id:`config-sections`,active:e.activeSection??`root`,tabs:de.map(e=>({value:e.key??`root`,label:e.label})),ariaLabel:I(`common.settingsSections`),panelId:`config-section-panel`,onSelect:t=>e.onSectionChange(t===`root`?null:t),onActivate:_}):j,E=n||T,D=i===`invalid`&&!t.validityDismissed,Se=E||fe===`accordion`||D||!!C,O=k`<div class="config-lead">
${E?k`<div class="config-toolbar">
${n?k`<div class="config-mode-toggle">
<button
class="config-mode-toggle__btn ${h===`form`?`active`:``}"
aria-pressed=${h===`form`?`true`:`false`}
?disabled=${e.schemaLoading||!e.schema||p}
title=${p?I(`configView.rawDraftPendingFormTitle`):u?I(`configView.formUnsafeTitle`):``}
@click=${()=>e.onFormModeChange(`form`)}
>
${I(`configView.form`)}
</button>
<button
class="config-mode-toggle__btn ${h===`raw`?`active`:``}"
aria-pressed=${h===`raw`?`true`:`false`}
?disabled=${!f}
title=${I(f?`configView.rawTitle`:`configView.rawUnavailableTitle`)}
@click=${()=>e.onFormModeChange(`raw`)}
>
${I(`configView.raw`)}
</button>
</div>`:j}
${xe}
</div>`:j}
${fe===`accordion`?ms(e,pe,_):j}
${C&&h===`form`?k`<div class="config-toolbar">
<label class="field">
<span>${I(`configView.channelSettings`)}</span>
<select
class="settings-select"
.value=${C.key??``}
@change=${t=>{let n=t.currentTarget;e.onSubsectionChange(n.value||null),_(t.currentTarget)}}
>
${S.map(e=>k`<option
value=${e.key??``}
?selected=${e.key===C.key}
>
${e.label}
</option>`)}
</select>
</label>
</div>`:j}
${D?k`<div class="config-validity-warning">
<svg
class="config-validity-warning__icon"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="2"
stroke-linecap="round"
stroke-linejoin="round"
width="16"
height="16"
>
<path
d="M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z"
></path>
<line x1="12" y1="9" x2="12" y2="13"></line>
<line x1="12" y1="17" x2="12.01" y2="17"></line>
</svg>
<span class="config-validity-warning__text">${I(`configView.invalidConfig`)}</span>
<button
class="btn btn--sm"
@click=${()=>{t.validityDismissed=!0,g()}}
>
${I(`configView.dismissWarning`)}
</button>
</div>`:j}
</div>`;return k`
${Se?O:j}
<div
id="config-section-panel"
class="config-content"
role=${T?`tabpanel`:`region`}
aria-labelledby=${T?`config-sections-tab-${e.activeSection??`root`}`:j}
aria-label=${T?j:I(`common.settingsSections`)}
>
${e.activeSection===`__appearance__`?a?Ms(e):j:e.activeSection===`__notifications__`?a?Co(e):j:h===`form`?k`
${u&&n&&f?k`<div class="config-content-callout">
<div class="callout info">
${ws(l)}
<button
type="button"
class="btn btn--sm"
@click=${()=>e.onFormModeChange(`raw`)}
>
${I(`configView.openRawEditor`)}
</button>
</div>
</div>`:j}
${ye?Ms(e):j}
${e.schemaLoading?k`<div class="config-loading">
<div class="config-loading__spinner"></div>
<span>${I(`configView.loadingSchema`)}</span>
</div>`:vr({schema:ue,uiHints:e.uiHints,value:e.formValue,embedded:e.embeddedEditor===!0||!!le,rawAvailable:f,disabled:ge||!e.formValue||!_e,unsupportedPaths:c.unsupportedPaths,onPatch:e.onFormPatch,onRemove:e.onFormRemove,activeSection:e.activeSection,activeSubsection:null,showAdvanced:d,forceAdvancedSection:e.forceAdvancedSection,onShowAdvanced:()=>e.setShowAdvancedSettings(!0),onHideAdvanced:e.forceShowAdvanced?void 0:()=>e.setShowAdvancedSettings(!1),sectionActions:e.activeSection===`env`?k`<button
class="btn btn--sm ${y?`active`:``}"
aria-pressed=${y?`true`:`false`}
title=${I(y?`configView.hideEnvValues`:`configView.revealEnvValues`)}
@click=${()=>{t.envRevealed=!t.envRevealed,g()}}
>
${y?P.eyeOff:P.eye}
${I(`configView.peek`)}
</button>`:void 0,showSectionDocs:e.showSectionDocs,sectionPrelude:e.sectionPrelude,revealSensitive:e.activeSection===`env`&&y,isSensitivePathRevealed:e=>ks(t,e),onToggleSensitivePath:e=>{As(t,e),g()}})}
${le&&!e.schemaLoading?Eo(se,e,ge||!e.formValue||!_e):j}
`:(()=>{let n=br(e.formValue,[],e.uiHints),r=n>0&&!t.rawRevealed;return k`<div class="settings-page">
${be}
<!-- Raw editor: one group surface owning file-level operations. -->
<div class="settings-group">
<div class="settings-row settings-row--stacked">
<div class="config-raw-actions">
${e.onOpenFile&&e.openFileAllowed!==!1?k`<button class="btn btn--sm" @click=${e.onOpenFile}>
${P.fileText} ${I(`configView.open`)}
</button>`:j}
<button
class="btn btn--sm"
?disabled=${ge||!w}
@click=${e.onRawDiscard}
>
${I(`configView.rawDiscard`)}
</button>
<button
class="btn btn--sm primary"
?disabled=${!ve}
aria-busy=${e.saving?`true`:`false`}
@click=${e.onSave}
>
${e.saving?k`<span class="config-action-spinner" aria-hidden="true"
>${P.loader}</span
>${I(`common.saving`)}`:I(`common.save`)}
</button>
</div>
<div class="field config-raw-field">
<span style="display:flex;align-items:center;gap:8px;">
${I(`configView.rawConfig`)}
${n>0?k`<span class="settings-count"
>${I(n===1?`configView.secretCount`:`configView.secretCountPlural`,{count:String(n)})}
${I(r?`configView.redacted`:`configView.visible`)}</span
>
<openclaw-tooltip
.content=${I(r?`configView.revealSensitive`:`configView.hideSensitive`)}
>
<button
class="btn btn--icon config-raw-toggle ${r?``:`active`}"
aria-label=${I(`configView.toggleRawRedaction`)}
aria-pressed=${!r}
@click=${()=>{t.rawRevealed=!t.rawRevealed,g()}}
>
${r?P.eyeOff:P.eye}
</button>
</openclaw-tooltip>`:j}
</span>
${r?k`<div class="callout info" style="margin-top: 12px">
${I(n===1?`configView.sensitiveHidden`:`configView.sensitiveHiddenPlural`,{count:String(n)})}
</div>`:k`<textarea
placeholder=${I(`configView.rawConfig`)}
.value=${e.raw}
?disabled=${ge||!_e}
@input=${t=>{e.onRawChange(t.target.value)}}
></textarea>`}
</div>
</div>
</div>
</div>`})()}
${e.issues.length>0?k`<div class="config-content-callout">
<div class="callout danger">
<pre class="code-block">
${we(on(JSON.stringify(e.issues,null,2)))}</pre>
</div>
</div>`:j}
</div>
`}function Ps(){return(Ps=e((()=>{O(),Te(),Me(),xr(),Dr(),sr(),wt(),Ct(),Rt(),F(),Rn(),ge(),To(),Do(),Jo(),cs(),vs(),Ts(),js(),Ln(),me().catch(()=>void 0)})))()}function Q(e){switch(e){case`communications`:return{activeSection:`messages`,activeSubsection:null};case`appearance`:return{activeSection:`__appearance__`,activeSubsection:null};case`notifications`:return{activeSection:`__notifications__`,activeSubsection:null};case`security`:return{activeSection:`security`,activeSubsection:null};case`automation`:return{activeSection:`commands`,activeSubsection:null};case`mcp`:return{activeSection:`mcp`,activeSubsection:null};case`memory`:return{activeSection:`memory`,activeSubsection:null};case`talk`:return{activeSection:`talk`,activeSubsection:null};case`infrastructure`:return{activeSection:`gateway`,activeSubsection:null};case`updates`:return{activeSection:`update`,activeSubsection:null};case`ai-agents`:return{activeSection:`agents`,activeSubsection:null};case`advanced`:return{activeSection:null,activeSubsection:null}}throw Error(`Unknown config page`)}function Fs(e,t,n){let r=Xn(e)??null;return e===`advanced`&&t&&Qn.has(t)?{activeSection:null,activeSubsection:null}:r&&(!t||!r.includes(t))?Q(e):{activeSection:t,activeSubsection:n}}function Is(e,t){let n=new URLSearchParams(t).get(`section`);return n?Fs(e,n,null):Q(e)}function Ls(e){return rt(e)}function Rs(e){switch(e){case`appearance`:return k`${I(`configView.appearance.intro`)}
${W(`https://docs.openclaw.ai/web/control-ui`)}`;case`mcp`:return k`${I(`mcpPage.intro`)} ${W(`https://docs.openclaw.ai/tools/mcp`)}`;case`security`:return k`${I(`quickSettings.security.intro`)}
${W(`https://docs.openclaw.ai/gateway/security`)}`;case`talk`:return k`${I(`talkPage.intro`)}
${W(`https://docs.openclaw.ai/nodes/talk`)}`;case`updates`:return I(`updates.page.intro`);default:return De(e)}}function zs(e){let t=s(e?.configForm)??s(e);if(!t)return{gatewayAuth:`unknown`,execPolicy:`unknown`,browserEnabled:!0,browserEnabledOverridden:!1,toolProfile:`full`,toolProfileOverridden:!1};let n=s(t.gateway),r=s(n?.auth),i=s(t.tools),a=s(i?.exec)??{},o=s(t.browser),c=`unknown`;r&&(c=(typeof r.mode==`string`?r.mode.trim():``)||(r.password?`password`:r.token?`token`:r.trustedProxy?`trusted-proxy`:`none`));let l=i?.profile,u=a.security;return{gatewayAuth:c,execPolicy:typeof u==`string`&&u.trim()?u.trim():`allowlist`,browserEnabled:o?.enabled!==!1,browserEnabledOverridden:o!==null&&Object.hasOwn(o,`enabled`),toolProfile:typeof l==`string`&&l.trim()?l.trim():`full`,toolProfileOverridden:i!==null&&Object.hasOwn(i,`profile`)}}function Bs(e){typeof document>`u`||document.documentElement.style.setProperty(`--control-ui-text-scale`,(nt(e)/100).toFixed(2))}var Vs,Hs,Us,$;function Ws(){return(Ws=e((()=>{d(),Nt(),O(),D(),He(),Re(),Ve(),st(),Ke(),Je(),We(),Me(),Le(),$e(),tt(),Dt(),Kt(),z(),lr(),F(),Rn(),gn(),v(),oe(),It(),re(),y(),Nn(),p(),jn(),Vn(),Ar(),Pr(),Gn(),Lr(),ri(),li(),da(),nr(),ne(),ma(),xa(),$a(),uo(),Ps(),Ln(),Vs={"communications:__notifications__":{routeId:`notifications`,keepSection:!1},"communications:channels":{routeId:`channels`,keepSection:!1},"communications:broadcast":{routeId:`advanced`,keepSection:!0},"communications:talk":{routeId:`talk`,keepSection:!0},"appearance:wizard":{routeId:`advanced`,keepSection:!0},"automation:approvals":{routeId:`security`,keepSection:!0},"ai-agents:memory":{routeId:`memory`,keepSection:!0},"ai-agents:models":{routeId:`model-providers`,keepSection:!1}},Hs=1e4,Us=new Map,$=class extends S{constructor(...e){super(...e),this.pageId=`advanced`,this.routeData=null,this.settings=ze(),this.hiddenSessionCatalogIds=an(),this.systemInfo=null,this.systemInfoUnavailable=!1,this.sessionObserverModels=[],this.sessionObserverModelsUnavailable=!1,this.mediaDeviceWatch=null,this.microphoneDevices=[],this.microphonePermissionRequired=!0,this.microphoneLoading=!1,this.microphoneError=null,this.microphoneLoaded=!1,this.microphoneRefreshRequestsPermission=!1,this.cameraDevices=[],this.cameraPermissionRequired=!0,this.cameraLoading=!1,this.cameraError=null,this.cameraLoaded=!1,this.cameraRefreshRequestsPermission=!1,this.cameraSelectionRequest=0,this.formModes={communications:`form`,appearance:`form`,notifications:`form`,security:`form`,automation:`form`,mcp:`form`,memory:`form`,talk:`form`,infrastructure:`form`,updates:`form`,"ai-agents":`form`,advanced:`form`},this.selections={communications:Q(`communications`),appearance:Q(`appearance`),notifications:Q(`notifications`),security:Q(`security`),automation:Q(`automation`),mcp:Q(`mcp`),memory:Q(`memory`),talk:Q(`talk`),infrastructure:Q(`infrastructure`),updates:Q(`updates`),"ai-agents":Q(`ai-agents`),advanced:Q(`advanced`)},this.customThemeImport=Fr,this.customThemeImportOwner=new Ir(e=>{this.customThemeImport=e}),this.configViewState=Es(),this.runtimeConfigSource=null,this.systemInfoGatewaySource=null,this.systemInfoClient=null,this.updateStatusClient=null,this.sessionObserverModelsClient=null,this.sessionObserverModelsAgentId=null,this.sessionObserverModelsRequest=null,this.systemInfoPolling=new Pn(this,Hs,()=>{this.systemInfoTask.status!==jt.PENDING&&this.systemInfoTask.run()},!1),this.updateCountdownPolling=new Pn(this,1e3,()=>this.requestUpdate(),!1),this.systemInfoTask=new At(this,{autoRun:!1,args:()=>[this.systemInfoGatewaySource,this.systemInfoRequestClient()],task:([e,t],{signal:n})=>e&&t?t.request(`system.info`,{},{signal:n}):Mt,onComplete:e=>{this.systemInfo=e;let t=this.systemInfoRequestClient();t&&this.ensureSessionObserverModels(t,this.context.agentSelection.state.selectedId)},onError:e=>{(pe(e)||Or(e))&&(this.systemInfo=null,this.systemInfoUnavailable=!0,this.systemInfoPolling.stop())}}),this.hiddenSessionCatalogLabelsTask=new At(this,{args:()=>{let e=this.context?.gateway.snapshot,t=[...this.hiddenSessionCatalogIds].toSorted();return[this.pageId===`appearance`&&t.length>0&&Ft(e,`sessions.catalog.list`,`operator.read`)?e?.client:null,this.context?.agentSelection.state.selectedId??null,t.join(`\0`)]},task:async([e,t],{signal:n})=>{if(!e)return Us;try{let r=await e.request(`sessions.catalog.list`,{...t?{agentId:t}:{},limitPerHost:1},{signal:n});return new Map(r.catalogs.map(e=>[e.id,e.label]))}catch{return Us}}}),this.pendingRouteTargetId=null,this.subscriptions=new xe(this).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t),e=>this.synchronizeRuntimeConfig(e)).watch(()=>this.context?.overlays,(e,t)=>e.subscribe(t)).watch(()=>this.context?.config,(e,t)=>e.subscribe(t)).watch(()=>this.context?.gateway,(e,t)=>e.subscribe(t),e=>this.synchronizeSystemInfoGateway(e)).watch(()=>this.context?.agentSelection,(e,t)=>e.subscribe(t),e=>this.synchronizeSessionObserverAgent(e.state.selectedId)).watch(()=>this.context?.nativeDeviceSettings??void 0,(e,t)=>e.subscribe(t)).watch(()=>this.context?.nativeNotifications??void 0,(e,t)=>e.subscribe(t)).watch(()=>this.context?.webPush,(e,t)=>e.subscribe(t)).watch(()=>this.context?.theme,(e,t)=>e.subscribe(t),()=>{this.settings=this.customThemeImportOwner.adoptSettings(this.settings,ze(),this.context.theme.serverSelection)}),this.hiddenSessionCatalogsChanged=()=>{this.hiddenSessionCatalogIds=an()},this.watchUpdateProgress=e=>ft(this.context)(e)}retireMediaPermissionRequests(){this.microphoneRefreshRequestsPermission=!1,this.cameraRefreshRequestsPermission=!1}connectedCallback(){super.connectedCallback(),this.hiddenSessionCatalogsChanged(),window.addEventListener(Vt,this.hiddenSessionCatalogsChanged),this.customThemeImportOwner.connect(this.context.gateway.connection.gatewayUrl,this.context.theme.serverSelection),this.settings=ze(),this.mediaDeviceWatch=Mn(()=>{this.refreshMicrophones(!1),this.refreshCameras(!1)}),this.syncRouteData()}disconnectedCallback(){window.removeEventListener(Vt,this.hiddenSessionCatalogsChanged),this.customThemeImportOwner.retireImport(),this.retireMediaPermissionRequests(),this.mediaDeviceWatch?.(),this.mediaDeviceWatch=null,this.systemInfoPolling.stop(),this.updateCountdownPolling.stop(),this.invalidateSystemInfoRequest(),this.runtimeConfigSource=null,this.resetConfigViewState(),this.systemInfoGatewaySource=null,this.systemInfoClient=null,this.updateStatusClient=null,this.subscriptions.clear(),super.disconnectedCallback()}willUpdate(e){e.get(`pageId`)===`appearance`&&this.pageId!==`appearance`&&(this.customThemeImportOwner.retireImport(),this.retireMediaPermissionRequests()),(e.has(`pageId`)||e.has(`routeData`))&&this.syncRouteData()}updated(e){e.has(`pageId`)&&e.get(`pageId`)!==void 0&&this.invalidateSystemInfoRequest(),this.syncSystemInfoPolling(),this.syncUpdateStatusRefresh(),this.syncUpdateCountdownPolling(),this.scrollToPendingRouteTarget(),this.pageId===`appearance`&&!this.microphoneLoaded&&(this.microphoneLoaded=!0,this.refreshMicrophones(!1)),this.pageId===`appearance`&&!this.cameraLoaded&&(this.cameraLoaded=!0,this.refreshCameras(!1))}async refreshMicrophones(e){if(this.microphoneLoading){this.microphoneRefreshRequestsPermission||=e;return}this.microphoneLoading=!0,this.microphoneRefreshRequestsPermission=e,this.microphoneError=null;try{let e=await An(()=>this.microphoneRefreshRequestsPermission);this.microphoneDevices=e.devices,this.microphonePermissionRequired=e.permissionRequired,this.microphoneError=e.issue?On(e.issue,`audioinput`):null}catch(e){this.microphoneError=h(e)}finally{this.microphoneLoading=!1,this.microphoneRefreshRequestsPermission=!1}}async refreshCameras(e){if(this.cameraLoading){this.cameraRefreshRequestsPermission||=e;return}this.cameraLoading=!0,this.cameraRefreshRequestsPermission=e,this.cameraError=null;try{let e=await kn(()=>this.cameraRefreshRequestsPermission);this.cameraDevices=e.devices,this.cameraPermissionRequired=e.permissionRequired,this.cameraError=e.issue?On(e.issue,`videoinput`):null}catch(e){this.cameraError=h(e)}finally{this.cameraLoading=!1,this.cameraRefreshRequestsPermission=!1}}syncRouteData(){let e=this.routeData?this.routeData.section:new URLSearchParams(globalThis.location?.search??``).get(`section`);if(e){let t=Vs[`${this.pageId}:${e}`];if(t){this.context?.navigate(t.routeId,{search:t.keepSection?`?section=${encodeURIComponent(e)}`:``,hash:globalThis.location?.hash??``});return}}let t=this.routeData?Fs(this.pageId,this.routeData.section,null):Is(this.pageId,globalThis.location?.search??``);this.selections={...this.selections,[this.pageId]:t};let n=this.routeData?.targetBlockId??g(globalThis.location?.hash??``);this.pendingRouteTargetId=n}scrollToPendingRouteTarget(){let e=this.pendingRouteTargetId;if(!e)return;let t=[...this.renderRoot.querySelectorAll(`[id]`)].find(t=>t.id===e);t&&(t.scrollIntoView?.({behavior:Fn(),block:`start`}),this.pendingRouteTargetId=null)}isSystemInfoVisible(){return this.pageId===`appearance`}syncUpdateCountdownPolling(){let e=this.context?.overlays.snapshot.updateSchedule?.campaign;if(this.pageId===`updates`&&(e?.state===`countdown`||e?.state===`waiting-for-idle`)){this.updateCountdownPolling.start();return}this.updateCountdownPolling.stop()}syncUpdateStatusRefresh(){let e=this.context.gateway.snapshot,t=this.pageId===`updates`&&e.phase===`connected`&&Ft(e,`update.status`,`operator.admin`)?e.client:null;t!==this.updateStatusClient&&(this.updateStatusClient=t,t&&this.context.overlays.refreshUpdateStatus())}synchronizeRuntimeConfig(e){e!==this.runtimeConfigSource&&(this.runtimeConfigSource&&this.customThemeImportOwner.retireImport(),this.runtimeConfigSource=e,this.resetConfigViewState());let t=e.state;if(!t.configSnapshot&&!t.configLoading){e.ensureLoaded().then(()=>this.runtimeConfigSource===e&&this.pageId!==`updates`?e.ensureSchemaLoaded():void 0).catch(()=>void 0);return}this.pageId!==`updates`&&!t.configSchema&&!t.configSchemaLoading&&e.ensureSchemaLoaded().catch(()=>void 0)}synchronizeSystemInfoGateway(e){this.customThemeImportOwner.synchronizeScope(e.connection.gatewayUrl,this.context.theme.serverSelection),e!==this.systemInfoGatewaySource&&(this.systemInfoPolling.stop(),this.invalidateSystemInfoRequest(),this.systemInfoGatewaySource=e,this.resetConfigViewState(),this.systemInfoClient=null,this.updateStatusClient=null,this.systemInfo=null,this.systemInfoUnavailable=!1,this.resetSessionObserverModels()),this.handleSystemInfoGatewaySnapshot(e.snapshot),this.syncUpdateStatusRefresh()}resetConfigViewState(){this.configViewState=Es()}handleSystemInfoGatewaySnapshot(e){let t=e.client!==this.systemInfoClient,n=kr(e.hello);this.systemInfoClient=e.client,t?(this.invalidateSystemInfoRequest(),this.systemInfo=null,this.systemInfoUnavailable=!1,this.resetSessionObserverModels()):e.phase!==`connected`&&(this.invalidateSystemInfoRequest(),this.systemInfo=null),e.phase===`connected`&&e.hello&&(this.systemInfoUnavailable=!n,n||(this.invalidateSystemInfoRequest(),this.systemInfo=null)),this.syncSystemInfoPolling(t)}syncSystemInfoPolling(e=!1){let t=this.context.gateway.snapshot;if(!(this.isConnected&&this.isSystemInfoVisible()&&!this.systemInfoUnavailable&&t.phase===`connected`&&kr(t.hello)&&t.client!=null)){this.systemInfoPolling.stop();return}(this.systemInfoPolling.start()||e)&&this.systemInfoTask.run()}invalidateSystemInfoRequest(){this.systemInfoTask.run([null,null])}systemInfoRequestClient(){let e=this.systemInfoGatewaySource,t=e?.snapshot;return!e||!t||!this.isConnected||!this.isSystemInfoVisible()||this.context.gateway!==e||t.phase!==`connected`||!kr(t.hello)||this.systemInfoUnavailable?null:t.client}synchronizeSessionObserverAgent(e){if(this.sessionObserverModelsAgentId===e&&(e!==null||this.sessionObserverModelsUnavailable))return;this.resetSessionObserverModels(!e);let t=this.systemInfoRequestClient();this.systemInfo&&t&&this.ensureSessionObserverModels(t,e)}ensureSessionObserverModels(e,t){if(!t)return this.resetSessionObserverModels(!0),Promise.resolve();if(this.sessionObserverModelsClient===e&&this.sessionObserverModelsAgentId===t)return Promise.resolve();let n=this.sessionObserverModelsRequest;if(n?.client===e&&n.agentId===t)return n.promise;let r=this.systemInfoGatewaySource,i=()=>this.isConnected&&this.systemInfoGatewaySource===r&&this.context.gateway.snapshot.client===e&&this.context.agentSelection.state.selectedId===t&&this.sessionObserverModelsRequest?.promise===a,a=te(e,{agentId:t,preparedOnly:!0}).then(({models:n})=>{i()&&(this.sessionObserverModels=n,this.sessionObserverModelsClient=e,this.sessionObserverModelsAgentId=t,this.sessionObserverModelsUnavailable=!1)}).catch(()=>{i()&&this.resetSessionObserverModels(!0)}).finally(()=>{this.sessionObserverModelsRequest?.promise===a&&(this.sessionObserverModelsRequest=null)});return this.sessionObserverModelsRequest={client:e,agentId:t,promise:a},a}resetSessionObserverModels(e=!1){this.sessionObserverModels=[],this.sessionObserverModelsClient=null,this.sessionObserverModelsAgentId=null,this.sessionObserverModelsUnavailable=e}setFormMode(e){this.formModes={...this.formModes,[this.pageId]:e}}setActiveSection(e){this.selections={...this.selections,[this.pageId]:{activeSection:e,activeSubsection:null}}}setActiveSubsection(e){this.selections={...this.selections,[this.pageId]:{...this.selections[this.pageId],activeSubsection:e}}}applySettings(e){this.settings=Ge(e),Bs(this.settings.textScale),this.context.theme.refresh()}setLocale(e){if(e===void 0){this.resetLocale();return}this.settings=Ge({locale:e}),Tt.setLocale(e)}currentSyncedPref(e){return mt(this.context.runtimeConfig.state.configSnapshot?.config,e,this.context.gateway.connection.gatewayUrl,this.settings,it(e)?{canSync:this.serverUiPrefsCanSync(e),profileId:this.context.gateway.snapshot?.selfUser?.id}:{canSync:this.serverUiPrefsCanSync()})}setFont(e,t){let n=this.currentSyncedPref(e);n.overridden&&t===n.resetValue?this.resetSyncedAppearancePref(e):this.applySettings({[e]:t})}serverUiPrefsCanSync(e){let t=this.context.runtimeConfig;if(!t.state.connected)return null;let n=this.context.gateway.snapshot;return(e===`fontUi`||e===`fontChat`)&&!n?.selfUser?!1:e&&n?.selfUser?ht(n.hello?.auth??null):t.canPatch!==!1}resetLocale(){this.settings=ut(`locale`,this.currentSyncedPref(`locale`),this.context.gateway.connection.gatewayUrl),Ot(this.settings.locale)?Tt.setLocale(this.settings.locale):Tt.useSystemLocale()}resetSyncedAppearancePref(e){this.settings=ut(e,this.currentSyncedPref(e),this.context.gateway.connection.gatewayUrl),this.context.theme.refresh()}setTheme(e,t){let n=this.currentSyncedPref(`theme`),r=n.overridden&&e===n.resetValue;this.customThemeImportOwner.recordActivation(r?null:e);let i=Ue(this.settings.theme,this.settings.themeMode);je({currentTheme:i,nextTheme:Ue(e,this.settings.themeMode),context:t,applyTheme:()=>r?this.resetSyncedAppearancePref(`theme`):this.applySettings({theme:e})})}setThemeMode(e,t){let n=this.currentSyncedPref(`themeMode`),r=n.overridden&&e===n.resetValue,i=Ue(this.settings.theme,this.settings.themeMode);je({currentTheme:i,nextTheme:Ue(this.settings.theme,e),context:t,applyTheme:()=>r?this.resetSyncedAppearancePref(`themeMode`):this.applySettings({themeMode:e})})}setSetting(e,t){this.applySettings({[e]:t})}selectMicrophone(e){this.applySettings({realtimeTalkInputDeviceId:e.trim()||void 0})}async selectCamera(e){let t=++this.cameraSelectionRequest,n=e.trim()||void 0;this.cameraError=null;try{if(await Bn(n),t!==this.cameraSelectionRequest)return;this.applySettings({realtimeTalkVideoDeviceId:n})}catch(e){t===this.cameraSelectionRequest&&(this.cameraError=h(e))}}async importCustomTheme(){await this.customThemeImportOwner.import({config:this.context.runtimeConfig.state,hasCustomTheme:!!this.settings.customTheme,load:Jr,apply:(e,t)=>this.applySettings({customTheme:e,theme:t?`custom`:this.settings.theme}),messages:{blocked:e=>I(e===`loading`?`common.loading`:`common.unsavedChanges`),imported:e=>I(`configPage.themeImported`,{name:e})}})}clearCustomTheme(){this.customThemeImportOwner.clear({apply:()=>this.applySettings({theme:this.settings.theme===`custom`?`claw`:this.settings.theme,customTheme:void 0}),message:I(`configPage.themeRemoved`)})}includeSections(){return Xn(this.pageId)}isUpdateBusy(){let e=this.context.overlays.snapshot;return e.updateRunning||e.updateStatusRefreshing||e.updateReconciliationPending}isCuratedConfigMutationDisabled(){let e=this.context.runtimeConfig.state;return!e.connected||e.configLoading||e.configSaving||e.configApplying||this.isUpdateBusy()||!this.context.runtimeConfig.canSet||!Be(this.context.gateway.snapshot.hello?.auth??null)}renderAdvancedConfig(e){let t=this.context.runtimeConfig,n=t.state;if(this.pageId===`updates`){let n=this.context.gateway.snapshot,r=this.context.overlays.snapshot,i=Be(n.hello?.auth??null);return lo({nativeDeviceSettings:this.context.nativeDeviceSettings,configObject:e,gatewayVersion:this.context.config.current.serverVersion??n.hello?.server?.version??null,controlUiCommit:Et.commit,controlUiCommitAt:Et.commitAt,controlUiBuiltAt:Et.builtAt,schedule:r.updateSchedule,heldUpdateCampaignId:r.heldUpdateCampaignId,updateAvailable:r.updateAvailable,statusBanner:r.updateStatusBanner,run:r.updateRun,connected:n.phase===`connected`,configBusy:this.isCuratedConfigMutationDisabled(),canAdmin:i,canUpdate:Ft(n,`update.run`,`operator.admin`),canCheckStatus:Ft(n,`update.status`,`operator.admin`),canHoldUpdate:Ft(n,`update.hold`,`operator.admin`),updateBusy:this.isUpdateBusy(),onChannelChange:e=>t.patchForm([`update`,`channel`],e),onUpdateChecksChange:e=>t.patchForm([`update`,`checkOnStart`],e),onAutomaticUpdatesChange:e=>t.patchForm([`update`,`auto`,`enabled`],e),onUpdateNow:()=>void ot({startGatewayUpdate:()=>void this.context.overlays.runUpdate(),watchUpdateProgress:this.watchUpdateProgress,onCheckStatus:()=>this.context.overlays.refreshUpdateStatus(),onAcknowledge:()=>this.context.overlays.acknowledgeUpdateRun(),updateAvailable:r.updateAvailable,updateSchedule:r.updateSchedule,viaNativeApp:!1}),onHoldUpdate:()=>this.context.overlays.holdUpdate(),onCheckStatus:()=>this.context.overlays.refreshUpdateStatus()})}let r=this.includeSections(),i=this.pageId===`advanced`?[...Qn]:void 0,a=Fs(this.pageId,this.selections[this.pageId].activeSection,this.selections[this.pageId].activeSubsection),o=this.pageId===`mcp`?`mcp`:a.activeSection,c=bt(this.context.gateway.snapshot),l=this.pageId===`mcp`?null:a.activeSubsection,u=s(e.gateway),d=s(u?.controlUi),f=s(s(e.agents)?.defaults),p=this.currentSyncedPref(`theme`),m=this.currentSyncedPref(`themeMode`),h=this.currentSyncedPref(`accent`),g=this.currentSyncedPref(`locale`),_=this.currentSyncedPref(`chatSendShortcut`),v=this.currentSyncedPref(`chatFollowUpMode`),y=!n.connected||n.configSaving||n.configApplying||this.isUpdateBusy()||!Be(this.context.gateway.snapshot.hello?.auth??null),b={raw:n.configRaw,originalRaw:n.configRawOriginal,valid:n.configValid,issues:n.configIssues,loading:n.configLoading,saving:n.configSaving,applying:n.configApplying,updating:this.isUpdateBusy(),connected:n.connected,mutationAllowed:t.canSet,openFileAllowed:t.canOpenFile,schema:n.configSchema,schemaLoading:n.configSchemaLoading,uiHints:n.configUiHints,formMode:this.formModes[this.pageId],rawDraftPending:n.configFormMode===`raw`&&n.configFormDirty,viewState:this.configViewState,rawAvailable:!!(n.configSnapshot?.config||n.configForm||n.configRaw),showModeToggle:this.pageId===`advanced`,formValue:n.configForm,originalValue:n.configFormOriginal,activeSection:o,activeSubsection:l,onRawChange:e=>{this.customThemeImportOwner.retireForConfigMutation(I(`common.unsavedChanges`)),t.setRaw(e)},onFormModeChange:e=>this.setFormMode(e),onViewStateChange:()=>this.requestUpdate(),onFormPatch:(e,n)=>{this.customThemeImportOwner.retireForConfigMutation(I(`common.unsavedChanges`)),t.patchForm(e,n)},onFormRemove:e=>{this.customThemeImportOwner.retireForConfigMutation(I(`common.unsavedChanges`)),t.removeFormValue(e)},onSectionChange:e=>this.setActiveSection(e),onSubsectionChange:e=>this.setActiveSubsection(e),onSave:()=>void t.save(),onRawDiscard:()=>void t.discardDraft(),onOpenFile:()=>void t.openFile(),version:this.context.config.current.serverVersion??this.context.gateway.snapshot.hello?.server?.version??``,theme:this.settings.theme,themeOverridden:p.overridden,themeProvenance:p.provenance,themeResetValue:p.resetValue??N.theme,themeMode:this.settings.themeMode,themeModeOverridden:m.overridden,themeModeProvenance:m.provenance,themeModeResetValue:m.resetValue??N.themeMode,accent:this.settings.accent,accentProvenance:h.provenance,accentResetValue:h.resetValue,fontUi:this.settings.fontUi,fontChat:this.settings.fontChat,fontUiProvenance:this.currentSyncedPref(`fontUi`).provenance,fontChatProvenance:this.currentSyncedPref(`fontChat`).provenance,setFontUi:e=>this.setFont(`fontUi`,e),setFontChat:e=>this.setFont(`fontChat`,e),systemLocale:Tt.getSystemLocale(),localeOverride:Ot(g.value)?g.value:void 0,localeOverridden:g.overridden,localeProvenance:g.provenance,localeResetValue:Ot(g.resetValue)?g.resetValue:void 0,onLocaleChange:e=>this.setLocale(e),setTheme:(e,t)=>this.setTheme(e,t),setThemeMode:(e,t)=>this.setThemeMode(e,t),setAccent:e=>e===void 0?this.resetSyncedAppearancePref(`accent`):this.applySettings({accent:e}),hasCustomTheme:!!this.settings.customTheme,customThemeLabel:this.settings.customTheme?.label??null,customThemeSourceUrl:this.settings.customTheme?.sourceUrl??null,customThemeImportUrl:this.customThemeImport.url,customThemeImportBusy:this.customThemeImport.busy,customThemeImportMessage:this.customThemeImport.message,customThemeImportExpanded:this.customThemeImport.expanded,customThemeImportFocusToken:this.customThemeImport.focusToken,onCustomThemeImportUrlChange:e=>this.customThemeImportOwner.setUrl(e),onImportCustomTheme:()=>void this.importCustomTheme(),onClearCustomTheme:()=>this.clearCustomTheme(),onOpenCustomThemeImport:()=>this.customThemeImportOwner.open(),textScale:this.settings.textScale??N.textScale,textScaleOverridden:this.settings.textScale!==void 0,setTextScale:e=>this.setSetting(`textScale`,e===N.textScale?void 0:nt(e)),sidebarLiveActivity:this.settings.sidebarLiveActivity??N.sidebarLiveActivity,setSidebarLiveActivity:e=>this.setSetting(`sidebarLiveActivity`,e),hiddenSessionCatalogIds:this.hiddenSessionCatalogIds,hiddenSessionCatalogLabels:this.hiddenSessionCatalogLabelsTask.status===jt.COMPLETE?this.hiddenSessionCatalogLabelsTask.value??Us:Us,setSessionCatalogHidden:Lt,chatMessageMaxWidth:this.settings.chatMessageMaxWidth,setChatMessageMaxWidth:e=>this.setSetting(`chatMessageMaxWidth`,e),chatCollapseTaskProgress:this.settings.chatCollapseTaskProgress===!0,setChatCollapseTaskProgress:e=>this.setSetting(`chatCollapseTaskProgress`,e),showAdvancedSettings:this.settings.showAdvancedSettings===!0,setShowAdvancedSettings:e=>this.setSetting(`showAdvancedSettings`,e),forceShowAdvanced:this.pageId===`advanced`,forceAdvancedSection:this.routeData?.advanced?this.routeData.section:null,sessionObserverEnabled:d?.sessionObserver!==!1,sessionObserverUtilityModel:typeof f?.utilityModel==`string`?f.utilityModel:void 0,sessionObserverResolvedModel:this.systemInfo?.defaultAgentUtilityModel,sessionObserverModels:this.sessionObserverModels,sessionObserverModelsUnavailable:this.sessionObserverModelsUnavailable,sessionObserverDisabled:y,setSessionObserverEnabled:e=>{t.patch({raw:ha(e),note:I(`configView.sessionObserver.toggleNote`)})},setSessionObserverUtilityModel:e=>{t.patch({raw:ga(e),note:I(`configView.sessionObserver.modelNote`)}).then(e=>{e&&this.systemInfoTask.run()})},lobsterPetVisits:this.settings.lobsterPetVisits??N.lobsterPetVisits,setLobsterPetVisits:e=>this.applySettings({lobsterPetVisits:e}),sessionDeleteConfirm:this.settings.sessionDeleteConfirm??N.sessionDeleteConfirm,setSessionDeleteConfirm:e=>this.applySettings({sessionDeleteConfirm:e}),lobsterPetSounds:this.settings.lobsterPetSounds??N.lobsterPetSounds,setLobsterPetSounds:e=>this.applySettings({lobsterPetSounds:e}),lobsterdexHref:ct(`lobsterdex`,this.context.basePath),onOpenLobsterdex:()=>this.context.navigate(`lobsterdex`),chatSendShortcut:lt(this.settings.chatSendShortcut),chatSendShortcutOverridden:_.overridden,chatSendShortcutProvenance:_.provenance,chatSendShortcutResetValue:_.resetValue??N.chatSendShortcut,setChatSendShortcut:e=>this.setSetting(`chatSendShortcut`,e),chatFollowUpMode:this.settings.chatFollowUpMode,chatFollowUpModeOverridden:v.overridden,chatFollowUpModeProvenance:v.provenance,serverQueueMode:n.configSnapshot?En(n.configSnapshot.runtimeConfig,{configNeedsApply:n.configNeedsApply}):void 0,setChatFollowUpMode:e=>this.setSetting(`chatFollowUpMode`,e),resetChatFollowUpMode:()=>this.resetSyncedAppearancePref(`chatFollowUpMode`),catalogOpenTarget:Pe(this.settings.catalogOpenTarget),setCatalogOpenTarget:e=>this.setSetting(`catalogOpenTarget`,e),microphone:{devices:this.microphoneDevices,permissionRequired:this.microphonePermissionRequired,selectedDeviceId:this.settings.realtimeTalkInputDeviceId??``,loading:this.microphoneLoading,error:this.microphoneError},composerHoldToRecord:this.settings.composerHoldToRecord!==!1,setComposerHoldToRecord:e=>this.setSetting(`composerHoldToRecord`,e),onMicrophoneRefresh:()=>void this.refreshMicrophones(!0),onMicrophoneSelect:e=>this.selectMicrophone(e),camera:{devices:this.cameraDevices,permissionRequired:this.cameraPermissionRequired,selectedDeviceId:this.settings.realtimeTalkVideoDeviceId??``,loading:this.cameraLoading,error:this.cameraError},onCameraRefresh:()=>void this.refreshCameras(!0),onCameraSelect:e=>void this.selectCamera(e),gatewayUrl:this.context.gateway.connection.gatewayUrl,assistantName:this.context.config.current.assistantIdentity.name,configPath:n.configSnapshot?.path??null,navRootLabel:this.pageId===`advanced`?void 0:Ls(this.pageId),showSectionDocs:this.pageId!==`communications`,sectionPrelude:o===`browser`&&c?Nr({enabled:this.settings.openLinksInControlUiBrowser===!0,onChange:e=>this.setSetting(`openLinksInControlUiBrowser`,e)}):void 0,showRootTab:!r?.length,includeSections:r?[...r]:void 0,excludeSections:i,includeVirtualSections:this.pageId===`appearance`||this.pageId===`notifications`,settingsLayout:this.pageId===`advanced`?`accordion`:void 0,nativeNotifications:this.context.nativeNotifications?.snapshot,onNativeNotificationsRequestPermission:()=>this.context.nativeNotifications?.requestPermission(),onNativeNotificationsSendTest:()=>this.context.nativeNotifications?.sendTest(),webPush:this.context.webPush.snapshot,onWebPushSubscribe:()=>void this.context.webPush.run({kind:`enable`}),onWebPushUnsubscribe:()=>void this.context.webPush.run({kind:`disable`}),onWebPushTest:()=>void this.context.webPush.run({kind:`test`}),onWebPushSetUserPreferences:e=>void this.context.webPush.run({kind:`set`,scope:`user`,preferences:e}),onWebPushSetDevicePreferences:e=>void this.context.webPush.run({kind:`set`,scope:`device`,preferences:e})};if(this.pageId===`mcp`)return si({configObject:e,pluginsHref:ct(`plugins`,this.context.basePath),editor:Ns({...b,activeSection:`mcp`,activeSubsection:null,showModeToggle:!1,embeddedEditor:!0,navRootLabel:`MCP`})});if(this.pageId===`memory`)return sa({configObject:e,mutationDisabled:this.isCuratedConfigMutationDisabled(),pluginsHref:ct(`plugins`,this.context.basePath),memoryImportHref:ct(`memory-import`,this.context.basePath),routeData:this.routeData,buildEditor:e=>Ns({...b,schema:Jn(b.schema,e),activeSection:`memory`,activeSubsection:null,showModeToggle:!1,embeddedEditor:!0,navRootLabel:I(`tabs.memory`)})});if(this.pageId===`talk`)return Ja({configObject:e,mutationDisabled:this.isCuratedConfigMutationDisabled(),buildEditor:()=>Ns({...b,activeSection:`talk`,activeSubsection:null,showModeToggle:!1,embeddedEditor:!0,navRootLabel:I(`tabs.talk`)})});if(this.pageId===`security`){let n=t.state,r=this.isCuratedConfigMutationDisabled();return pa({security:zs(e),configBusy:r,canPairDevice:n.connected&&Be(this.context.gateway.snapshot.hello?.auth??null),onPairMobile:()=>void this.context.overlays.openDevicePairSetup(),onBrowserEnabledToggle:e=>{if(e){t.removeFormValue([`browser`,`enabled`]);return}t.patchForm([`browser`,`enabled`],!1)},onToolProfileChange:e=>{if(e===`full`){t.removeFormValue([`tools`,`profile`]);return}t.patchForm([`tools`,`profile`],e)},editor:Ns({...b,embeddedEditor:!0})})}return Ns(b)}render(){let e=this.context.runtimeConfig.state,t=s(e.configForm??e.configSnapshot?.config)??{},n=this.renderAdvancedConfig(t);return k`
${this.pageId===`memory`?j:k`
${Tn({title:Ls(this.pageId),subtitle:Rs(this.pageId)})}
`}
${cr(n)}
`}},u([a({context:Qe,subscribe:!0})],$.prototype,`context`,void 0),u([M({attribute:`page-id`})],$.prototype,`pageId`,void 0),u([M({attribute:!1})],$.prototype,`routeData`,void 0),u([A()],$.prototype,`settings`,void 0),u([A()],$.prototype,`hiddenSessionCatalogIds`,void 0),u([A()],$.prototype,`systemInfo`,void 0),u([A()],$.prototype,`systemInfoUnavailable`,void 0),u([A()],$.prototype,`sessionObserverModels`,void 0),u([A()],$.prototype,`sessionObserverModelsUnavailable`,void 0),u([A()],$.prototype,`microphoneDevices`,void 0),u([A()],$.prototype,`microphonePermissionRequired`,void 0),u([A()],$.prototype,`microphoneLoading`,void 0),u([A()],$.prototype,`microphoneError`,void 0),u([A()],$.prototype,`cameraDevices`,void 0),u([A()],$.prototype,`cameraPermissionRequired`,void 0),u([A()],$.prototype,`cameraLoading`,void 0),u([A()],$.prototype,`cameraError`,void 0),u([A()],$.prototype,`formModes`,void 0),u([A()],$.prototype,`selections`,void 0),u([A()],$.prototype,`customThemeImport`,void 0),customElements.get(`openclaw-config-page`)||customElements.define(`openclaw-config-page`,$)})))()}Ws();
//# sourceMappingURL=config-page-CjGWfrmZ.js.map