UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

2,227 lines • 247 kB
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{$r as t,Ac as n,B as r,Cu as i,Eu as a,Fa as o,Fs as s,Fu as c,I as l,Ji as u,La as d,Nu as ee,Qr as te,Ra as f,Sl as p,Tu as m,W as h,Xi as g,Zr as ne,ci as re,cs as _,du as v,ei as ie,fi as ae,fu as oe,hl as se,ii as ce,is as y,ju as b,kc as le,ku as x,li as ue,ml as de,pl as fe,pu as S,ri as pe,ss as me,z as he}from"./control-ui-core-BncvAZjR.js";import{Ai as ge,An as _e,Ca as C,Cn as ve,Fn as ye,In as be,Kr as xe,La as Se,Ln as Ce,Mn as we,Nn as Te,Pn as Ee,Ra as De,Rn as Oe,Sn as ke,So as Ae,Sr as je,Ti as Me,Vn as Ne,Yi as Pe,_ as Fe,_n as Ie,_t as Le,b as Re,bn as ze,br as Be,d as Ve,dt as He,fn as Ue,ft as We,g as Ge,gn as Ke,gr as qe,gt as Je,h as Ye,ht as Xe,ir as w,it as Ze,jn as Qe,kn as $e,l as et,m as tt,mn as nt,mo as rt,mt as it,na as T,on as at,ot,pn as E,qi as st,ra as ct,rr as D,sn as lt,u as ut,un as dt,ut as ft,v as pt,vn as mt,wa as ht,wi as gt,xn as _t,xr as vt,y as yt,yo as bt,yr as xt}from"./control-ui-core-9qYjK5B2.js";import{$ as O,D as St,E as Ct,X as k,Y as A,a as wt,at as Tt,ct as j,d as Et,h as Dt,i as Ot,j as kt,k as At,mt as jt,nt as M,p as Mt,r as Nt,t as Pt,u as Ft,ut as N,vt as It}from"./lit-runtime-B8uOr6OX.js";import{c as Lt,d as Rt,l as zt}from"./gateway-runtime-Cr51Pi7N.js";import{K as Bt,at as Vt,ct as Ht,dt as Ut,h as Wt,it as Gt,lt as Kt,nt as qt,ot as Jt,p as Yt,q as Xt,rt as Zt,st as Qt,ut as $t}from"./control-ui-boot-shared-DJkUdZmL.js";import{$n as en,Bn as tn,C as nn,Cr as rn,D as an,Di as on,Do as sn,Ei as cn,Gn as ln,Hn as un,In as dn,Jn as fn,Kn as pn,Li as mn,Ln as hn,Qn as gn,Rn as _n,S as vn,Sr as yn,To as bn,Un as xn,Vn as Sn,Wn as Cn,Xr as wn,Yn as Tn,Zr as En,_a as Dn,_r as On,bo as kn,br as An,d as jn,dr as Mn,er as Nn,f as Pn,fa as P,fr as Fn,gr as In,h as Ln,hr as Rn,ii as F,ir as zn,lo as Bn,lr as Vn,m as Hn,ma as Un,mr as Wn,nr as Gn,or as Kn,p as qn,pr as Jn,qi as Yn,qn as Xn,ro as Zn,rr as I,sr as Qn,tr as $n,ur as er,vr as tr,wr as nr,xr as rr,yr as ir,zn as ar}from"./ui-DuRgK6kL.js";import{A as or,M as L,O as sr,a as cr,c as lr,k as ur,l as dr,nt as fr,o as pr,tt as mr}from"./control-ui-boot-shared-em9-jnbz.js";import{n as hr,t as gr}from"./response-body-DtENYz2O.js";import{B as R,G as _r,Gi as vr,Gt as yr,I as z,K as br,Kt as xr,L as Sr,R as Cr,U as wr,V as Tr,W as Er,Wi as Dr,X as Or,Y as B,Z as V,a as kr,dr as Ar,et as H,fi as jr,fr as Mr,l as Nr,ln as Pr,m as Fr,o as Ir,p as Lr,pi as Rr,pr as zr,q as U,tt as W,u as Br,ui as Vr,un as Hr,ur as Ur,z as G}from"./control-ui-boot-shared-xfDhIVun.js";import{Cc as Wr,Gi as Gr,Hc as Kr,Hi as qr,Jt as Jr,Kt as Yr,So as Xr,Uc as Zr,Ui as Qr,Wi as $r,Yt as ei,Zt as ti,i as ni,qt as ri,r as ii,wc as ai}from"./control-ui-boot-shared-D3oo_6Fq.js";import{n as oi,t as si}from"./theme-palette-BXs1N4qF.js";import"./control-ui-boot-shared-styles-BaQ2sAfZ.js";import{t as ci}from"./update-run-view--bA96Nt4.js";import{n as K,t as q}from"./en-settings-KEcvGj5Z.js";import{G as li,H as ui,K as di,W as fi,dr as pi,fr as mi}from"./control-ui-boot-chat-C8hdsB2M.js";import{Bt as hi,Vt as gi}from"./control-ui-boot-chat-XcDaYmck.js";import{S as _i,b as vi,c as yi,d as bi,f as xi,g as Si,h as Ci,l as wi,m as Ti,p as Ei,s as Di,u as Oi,v as ki,x as Ai,y as ji}from"./control-ui-boot-new-CxgnwT6A.js";import"./control-ui-boot-new-styles-Bb6Ub5D3.js";import{i as Mi,o as Ni,t as Pi}from"./settings-targets-B_ZHOn2L.js";import{a as Fi,c as Ii,d as Li,f as Ri,g as zi,h as Bi,l as Vi,n as Hi,p as Ui,r as Wi,s as Gi,t as Ki,u as qi}from"./setup-schema-CsxjHw97.js";import{c as Ji,d as Yi,l as Xi,n as Zi,t as Qi,u as $i}from"./tool-catalog--o1DKbxU.js";import{a as ea,c as ta,n as na,s as ra,t as ia}from"./config-form-D5QdC_Am.js";import{B as aa,G as oa,H as sa,U as ca,W as la}from"./config-form.node.shared-BDgoYpu6.js";import{n as ua,t as da}from"./system-info-C3-P4Ofh.js";import{n as fa,t as pa}from"./wizard-login-controller-DkwUVM4m.js";import{n as ma,t as ha}from"./en-transcripts-CRsx6m0e.js";import{n as ga,t as _a}from"./en-memory-import-DGOlPbGX.js";import{n as J,t as va}from"./settings-select-row-C4LcPBBS.js";import{i as ya,r as ba,t as xa}from"./settings-model-D2N5Sxkb.js";function Sa(e){return H({title:b(`browserLinkPreferences.openInControlUi`),checked:e.enabled,onChange:e.onChange})}function Ca(){return(Ca=e((()=>{z(),a()})))()}var wa;function Ta(){return(Ta=e((()=>{wa=class{constructor(e){this.host=e,this.targetId=null,this.frame=null,e.addController(this)}setTarget(e){this.frame!==null&&(cancelAnimationFrame(this.frame),this.frame=null),this.targetId=e}hostDisconnected(){this.setTarget(null)}hostUpdated(){this.targetId&&this.frame===null&&(this.frame=requestAnimationFrame(()=>{this.frame=null;let e=this.targetId;if(!this.host.isConnected||!e)return;let t=[...this.host.renderRoot.querySelectorAll(`[id]`)].find(t=>t.id===e);t&&(t.scrollIntoView?.({behavior:Xr(),block:`start`}),this.targetId=null)}))}}})))()}var Ea,Da;function Oa(){return(Oa=e((()=>{S(),Ea={url:``,busy:!1,message:null,expanded:!1,focusToken:0},Da=class{constructor(e){this.publish=e,this.currentImport=null,this.activationIntent={theme:null},this.gatewayScope=``,this.serverSelectionRevision=0,this.state=Ea}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={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={},r=this.activationIntent;this.currentImport=n;let i=this.state.url;this.update({expanded:!0,busy:!0,message:null});try{let t=await e.load(i);if(this.currentImport!==n)return;e.apply(t,!e.hasCustomTheme&&(this.activationIntent===r||this.activationIntent.theme===`custom`)),this.update({url:``,message:{kind:`success`,text:e.messages.imported(t.label)}})}catch(e){if(this.currentImport!==n)return;this.update({message:{kind:`error`,text:v(e)}})}finally{this.currentImport===n&&this.update({busy:!1})}}clear(e){this.retireImport(),e.apply(),this.update({expanded:!0,message:{kind:`success`,text:e.message}})}retireImport(){this.currentImport=null,this.state.busy&&this.update({busy:!1})}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 ka(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`)?(Ne(n),n):null}function Aa(e){let t=sn(e);if(!t)throw Error(`Paste a tweakcn theme link to import.`);let n=t.replace(/[.,;:]+$/,``);return be.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 ja(e){let t=ka(e.pathname);if(t)return t;let n=e.searchParams.get(`theme`)??e.searchParams.get(`themeId`)??e.searchParams.get(`id`);if(n)return Ne(n),n;throw Error(`Unsupported tweakcn link. Expected a theme share URL.`)}function Ma(e){let t=Aa(e),n;try{n=new URL(t)}catch{throw Error(`Paste a full tweakcn URL.`)}if(!La.has(n.hostname))throw Error(`Only tweakcn.com theme links are supported.`);let r=ja(n);return{themeId:r,sourceUrl:`https://tweakcn.com/themes/${r}`,fetchUrl:`https://tweakcn.com/r/themes/${r}`}}function Na(e,t){let n=P(e),r=P(n?.cssVars),i=P(r?.light),a=P(r?.dark),o=r?.theme===void 0?void 0:P(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:Ce(sn(n.name)),importedAt:new Date().toISOString(),light:oi(`light`,i,o),dark:oi(`dark`,a,o)}}function Pa(e){if(!e)return;let t;try{t=new URL(e)}catch{throw Error(`Unexpected tweakcn import response URL.`)}if(t.protocol!==`https:`||!La.has(t.hostname))throw Error(`Unexpected redirect during tweakcn import.`)}async function Fa(e){let t=await hr(e,{maxBytes:Ra,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 Ia(e,t=fetch){let n=Ma(e),r=new AbortController,i=setTimeout(()=>r.abort(),za);try{let e=await t(n.fetchUrl,{headers:{accept:`application/json`},redirect:`error`,signal:r.signal});if(Pa(e.url),!e.ok)throw Error(`tweakcn import failed (${e.status}).`);return Na(await Fa(e),n)}catch(e){throw r.signal.aborted?Error(`tweakcn import timed out.`,{cause:e}):e}finally{clearTimeout(i)}}var La,Ra,za;function Ba(){return(Ba=e((()=>{Oe(),si(),gr(),La=new Set([`tweakcn.com`,`www.tweakcn.com`]),Ra=2e5,za=1e4})))()}function Va(e){return/^[A-Za-z0-9._:/-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`}function Ha(e){switch(e){case`verify-off`:return b(`mcpPage.tlsVerifyOff`);case`mtls`:return b(`mcpPage.mtls`);default:return null}}var Ua;function Wa(){return(Wa=e((()=>{En(),A(),M(),Me(),vt(),a(),$t(),de(),Jt(),S(),zt(),m(),n(),ct(),li(),z(),fa(),Ut(),Ua=class extends i{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.login=new pa(this,{getClient:()=>this.context?.gateway.snapshot.client??null,getAgentId:()=>null,onClose:()=>this.login.reset(),requestFailedMessage:()=>b(`mcpServers.signInFailed`),sessionExpiredMessage:()=>b(`mcpServers.signInExpired`)}),this.subscriptions=new le(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:v(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())).effect(()=>this.context?.gateway.snapshot.hello,()=>()=>this.login.reset()).effect(()=>this.context?.agentSelection,e=>e.subscribe(()=>this.login.reset()))}disconnectedCallback(){this.login.reset(),this.subscriptions.clear(),super.disconnectedCallback()}syncRows(){let e=this.context?.runtimeConfig.state.configSnapshot;this.rows=Kt(se(e))}mutationBlockedReason(){let e=this.context?.gateway;return e?.snapshot.phase===`connected`?qe(e.snapshot.hello?.auth??null)?null:b(`mcpServers.adminRequired`):b(`mcpServers.connectRequired`)}canMutate(){return this.context!==void 0&&this.mutationBlockedReason()===null&&this.login.runner.state.phase===`idle`}signIn(e){!this.busy&&this.canMutate()&&e.enabled&&e.signIn===`operator`&&Lt(this.context?.gateway.snapshot,`mcp.authLogin`,`operator.admin`)&&(this.message=null,this.login.runner.prepareSignIn(`oauth`,e.name),this.login.runner.startMcpLogin(e.name))}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 Ht(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(!qt.test(t)){this.message={kind:`error`,text:b(`mcpServers.nameInvalid`)};return}let n=Qt(e.target,e.transport);if(!n){this.message={kind:`error`,text:b(`mcpServers.targetInvalid`)};return}await this.mutate({buildPatch:e=>Zt(e,t,n),note:`mcp settings: add server ${t}`,successText:b(`mcpServers.addedSuccess`,{name:t})})&&(this.formOpen=!1)}async toggleServer(e,t){await this.mutate({buildPatch:n=>Vt(n,e,t),note:`mcp settings: ${t?`enable`:`disable`} server ${e}`,successText:b(t?`mcpServers.enabledSuccess`:`mcpServers.disabledSuccess`,{name:e})})}async removeServer(e){await this.mutate({buildPatch:t=>Gt(t,e),note:`mcp settings: remove server ${e}`,successText:b(`mcpServers.removedSuccess`,{name:e})})}renderRow(e){let t=`openclaw mcp ${e.auth===`oauth`?`login`:`probe`} ${Va(e.name)}`,n=[e.transport,e.auth,e.toolFilter?b(`mcpPage.toolFilter`):null,e.parallel?b(`mcpPage.parallel`):null,Ha(e.tls)].filter(e=>!!e),r=this.mutationBlockedReason(),i=this.busy||!this.canMutate();return O`
      <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||b(`mcpServers.missingTransport`)}
          </span>
          <span class="settings-row__desc">${n.join(` · `)}</span>
        </div>
        <div class="settings-row__control">
          ${V({kind:e.enabled?`ok`:`muted`,label:e.enabled?b(`common.enabled`):b(`common.disabled`)})}
          ${e.signIn===`profile`?O`<span class="settings-row__desc">${b(`mcpServers.profileSignIn`)}</span>`:e.signIn===`requester`?O`<span class="settings-row__desc">${b(`mcpServers.requesterSignIn`)}</span>`:O`<code>${t}</code>`}
          ${e.enabled&&e.signIn===`operator`&&Lt(this.context?.gateway.snapshot,`mcp.authLogin`,`operator.admin`)?O`<button
                  type="button"
                  class="btn btn--sm"
                  ?disabled=${i}
                  @click=${()=>this.signIn(e)}
                >
                  ${b(`mcpServers.signIn`)}
                </button>`:k}
          <button
            type="button"
            class="btn btn--sm"
            title=${r??``}
            ?disabled=${i}
            @click=${()=>void this.toggleServer(e.name,!e.enabled)}
          >
            ${this.busy?b(`mcpServers.working`):e.enabled?b(`mcpServers.disable`):b(`mcpServers.enable`)}
          </button>
          <button
            type="button"
            class="btn btn--sm btn--icon mcp-server-remove"
            aria-label=${b(`mcpServers.removeNamed`,{name:e.name})}
            title=${r??b(`mcpServers.removeNamed`,{name:e.name})}
            ?disabled=${i}
            @click=${()=>void this.removeServer(e.name)}
          >
            ${T.trash}
          </button>
        </div>
      </div>
    `}render(){let e=this.mutationBlockedReason(),t=this.rows,n=t?t.length===0?R(O`
            ${b(`mcpPage.noServers`)} ${Sr(this.docsUrl,b(`mcpPage.setUpFirstServer`))}
          `):t.map(e=>this.renderRow(e)):wr({rows:2});return O`
      <div class="mcp-server-list">
        ${B({title:b(`mcpPage.configuredServers`),description:O`
              ${b(`mcpPage.runtimeHint`)} ${Cr(this.pluginsHref)}
            `,actions:O`
              <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">${T.plus}</span>
                ${b(`mcpServers.add`)}
              </button>
            `},O`
            ${this.formOpen?di({busy:this.busy,disabled:!this.canMutate(),blockedReason:e,onSubmit:e=>void this.addServer(e),onCancel:()=>{this.formOpen=!1}}):k}
            ${this.message?O`<div
                    class="mcp-server-message mcp-server-message--${this.message.kind}"
                    role=${this.message.kind===`error`?`alert`:`status`}
                  >
                    ${this.message.text}
                  </div>`:k}
            ${n}
          `)}
      </div>
      ${this.login.render({doneMessage:b(`mcpServers.authenticationSaved`)})}
    `}},F([wn({context:gt,subscribe:!0})],Ua.prototype,`context`,void 0),F([N()],Ua.prototype,`pluginsHref`,void 0),F([N()],Ua.prototype,`docsUrl`,void 0),F([j()],Ua.prototype,`rows`,void 0),F([j()],Ua.prototype,`busy`,void 0),F([j()],Ua.prototype,`message`,void 0),F([j()],Ua.prototype,`formOpen`,void 0),customElements.get(`openclaw-mcp-servers-card`)||customElements.define(`openclaw-mcp-servers-card`,Ua)})))()}function Ga(){return O`${b(`mcpPage.intro`)} ${Cr(qa)}`}function Ka(e){let t=Kt(e.configObject)??[];return O`
    <section class="mcp-page">
      <div class="settings-page" ${w({settingsPage:!0})}>
        <section class="settings-section mcp-page__summary">
          <div class="settings-section__header">
            <h2 class="settings-section__heading">${b(`mcpPage.servers`)}</h2>
          </div>
          <div class="settings-group">
            ${[[`mcpPage.servers`,t.length],[`common.enabled`,t.filter(e=>e.enabled).length],[`mcpPage.oauth`,t.filter(e=>e.auth===`oauth`).length],[`mcpPage.filtered`,t.filter(e=>e.toolFilter).length]].map(([e,t])=>U({title:b(e),control:W(t)}))}
          </div>
        </section>

        <section class="settings-section">
          <div class="settings-section__header">
            <h2 class="settings-section__heading">${b(`mcpPage.operatorCommands`)}</h2>
          </div>
          <p class="settings-section__desc">${b(`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 &lt;name&gt;</code>
                <code>openclaw mcp reload</code>
              </div>
            </div>
          </div>
        </section>

        <openclaw-mcp-servers-card
          .pluginsHref=${e.pluginsHref}
          .docsUrl=${qa}
        ></openclaw-mcp-servers-card>
      </div>

      ${e.editor}
    </section>
  `}var qa;function Ja(){return(Ja=e((()=>{A(),D(),z(),Wa(),a(),$t(),Jt(),Ut(),qa=`https://docs.openclaw.ai/tools/mcp`})))()}function Ya(e){return e?.availability===`enabled`&&e.canStart!==!1&&!!e.autoStart}var Xa,Za,Qa;function $a(){return($a=e((()=>{En(),sr(),A(),M(),Ft(),Ot(),Me(),vt(),D(),ct(),z(),a(),ha(),S(),Zr(),m(),n(),Ni(),ma(),Xa=[`accountId`,`guildId`,`channelId`,`meetingUrl`],Za=[`title`,...Xa,`sessionId`],Qa=class extends i{constructor(...e){super(...e),this.mutationDisabled=!1,this.editor=k,this.advancedExpanded=!1,this.editing=null,this.editError=null,this.editedProviderId=``,this.sourceDraft={},this.gateway=new Kr(this,{getGateway:()=>this.context?.gateway,invalidateRequests:()=>this.statusTask.abort(),onSnapshot:({snapshot:{hello:e}})=>{(e!==this.connectionHello||e?.auth!==this.connectionAuth)&&(this.gateway.invalidate(),this.statusTask.abort()),this.connectionHello=e,this.connectionAuth=e?.auth}}),this.subscriptions=new le(this).watchStore(()=>this.context?.runtimeConfig),this.statusTask=new ur(this,{args:()=>[this.client,this.gateway.epoch,this.context?.runtimeConfig.state.configSnapshot?.hash],task:async([e,,t],{signal:n})=>{if(!e)return or;let r=this.gateway.capture(),i=this.context.gateway,a=i.snapshot.hello,o=a?.auth,s=await e.request(`transcripts.status`,{},{signal:n}),c=()=>this.client===e&&r!==null&&this.gateway.isCurrent(r)&&this.context.gateway===i&&i.snapshot.hello===a&&a?.auth===o&&this.context.runtimeConfig.state.configSnapshot?.hash===t;return c()?{status:s,isCurrent:c}:or},onComplete:e=>{e.isCurrent()&&this.retainLocatorRequirements(e.status)}})}get client(){let e=this.context?.gateway.snapshot;return this.isConnected&&e?.phase===`connected`&&xt(e.hello?.auth??null)?e.client:null}disconnectedCallback(){this.statusTask.abort(),this.subscriptions.clear(),this.editSource(null),super.disconnectedCallback()}get disabled(){let e=this.context.runtimeConfig;return this.mutationDisabled||!e.canSet||!e.state.connected||e.state.configLoading||e.state.configSaving||e.state.configApplying||this.rawDraftPending||!qe(this.context.gateway.snapshot.hello?.auth??null)}get rawDraftPending(){let e=this.context.runtimeConfig.state;return e.configFormMode===`raw`&&e.configFormDirty}get config(){let e=this.context.runtimeConfig.state;return P(P(e.configForm??e.configSnapshot?.config)?.transcripts)}get sources(){return Array.isArray(this.config?.autoStart)?this.config.autoStart:[]}editSource(e){if(this.editing===e)return;this.editing=e,this.editedSource=typeof e==`number`?this.sources[e]:void 0,this.sourceDraft={...P(this.editedSource)},this.locatorRequirements=this.originalLocatorRequirements=void 0;let t=P(this.editedSource)?.providerId;this.selectProvider(typeof t==`string`?t:``),this.editError=null}selectProvider(e){this.editedProviderId!==e&&(this.locatorRequirements=void 0),this.editedProviderId=e,this.retainLocatorRequirements(this.knownCaptureStatus)}retainLocatorRequirements(e){if(this.editing===null)return;let t=(t,n)=>{let r=e?.providers.find(e=>e.providerId===sn(t))?.autoStart;return r?{...n,...r}:n},n=P(this.editedSource)?.providerId;this.originalLocatorRequirements=t(n,this.originalLocatorRequirements),this.locatorRequirements=sn(this.editedProviderId)===sn(n)?this.originalLocatorRequirements:t(this.editedProviderId,this.locatorRequirements)}saveSource(e){if(e.preventDefault(),this.disabled||this.editing===null)return;let t=[...this.sources];if(this.editing!==`new`&&t[this.editing]!==this.editedSource){this.editError=b(`meetingCapture.sourceChanged`);return}let n=e.currentTarget;if(!n.reportValidity())return;let r=new FormData(n),i={...P(this.editedSource)},a=sn(r.get(`providerId`)),o=this.captureStatus?.providers.find(e=>e.providerId===a);if((this.editing===`new`||this.editedProviderId!==i.providerId)&&!Ya(o)){this.editError=b(`meetingCapture.autoStartUnavailable`);return}for(let e of[`providerId`,...Za]){let t=e===`providerId`?this.editedProviderId:this.sourceDraft[e];if(!r.has(e)||this.editing!==`new`&&t===i[e])continue;let n=sn(r.get(e));n?i[e]=n:delete i[e]}let s=Xa.find(e=>this.locatorRequirements?.[e]===`required`&&!sn(i[e]));if(s){this.editError=b(`meetingCapture.requiredLocator`,{field:b(`meetingCapture.fields.${s}`)});return}this.editing===`new`?t.push(i):t[this.editing]=i,this.context.runtimeConfig.patchForm([`transcripts`,`autoStart`],[...t]),this.editSource(null)}renderSourceEditor(e){if(this.editing===null)return k;let t=this.sourceDraft,n=e?.providers.filter(Ya).toSorted((e,t)=>e.name.localeCompare(t.name))??[],r=typeof t?.providerId==`string`?t.providerId:``,i=n.map(e=>({id:e.providerId,label:`${e.name} · ${b(`meetingCapture.availability.${e.availability}`)}`}));for(let e of[r,this.editedProviderId])e&&!i.some(t=>t.id===e)&&i.push({id:e,label:e});let a=e?.providers.find(e=>e.providerId===this.editedProviderId),o=[`title`,...Xa.filter(e=>this.locatorRequirements?.[e]||t?.[e]!==void 0),`sessionId`];return O`<form @submit=${e=>this.saveSource(e)}>
      ${B({title:b(this.editing===`new`?`meetingCapture.addSource`:`meetingCapture.editSource`)},O`
          ${U({title:b(`meetingCapture.fields.providerId`),control:O`<select
              class="settings-select"
              name="providerId"
              aria-label=${b(`meetingCapture.fields.providerId`)}
              required
              ?disabled=${this.disabled}
              .value=${this.editedProviderId}
              @change=${e=>{this.selectProvider(e.target.value)}}
            >
              <option value="">${b(`meetingCapture.chooseProvider`)}</option>
              ${wt(i,e=>e.id,e=>O`<option value=${e.id} ?selected=${e.id===this.editedProviderId}>
                    ${e.label}
                  </option>`)}
            </select>`})}
          ${this.editedProviderId&&!Ya(a)?R(b(`meetingCapture.autoStartUnavailable`)):k}
          ${wt(o,e=>e,e=>U({title:b(`meetingCapture.fields.${e}`),description:e===`sessionId`?b(t.whenOccupied===!0?`meetingCapture.occupancySessionIdHint`:`meetingCapture.sessionIdHint`):e===`title`?b(`meetingCapture.titleHint`):void 0,control:O`<input
                  class="settings-input"
                  name=${e}
                  type=${e===`meetingUrl`?`url`:`text`}
                  aria-label=${b(`meetingCapture.fields.${e}`)}
                  ?disabled=${this.disabled||e===`sessionId`&&t.whenOccupied===!0}
                  ?required=${e!==`title`&&e!==`sessionId`&&this.locatorRequirements?.[e]===`required`}
                  .value=${typeof t?.[e]==`string`?t[e]:``}
                  @input=${t=>{this.sourceDraft[e]=t.target.value}}
                />`}))}
          ${U({title:b(`meetingCapture.locatorsHint`),control:O` <button
                type="button"
                class="btn"
                @click=${()=>{this.editSource(null)}}
              >
                ${b(`common.cancel`)}
              </button>
              <button
                type="submit"
                class="btn"
                ?disabled=${this.disabled||!this.editedProviderId}
              >
                ${b(`meetingCapture.saveSource`)}
              </button>`})}
          ${this.editError?R(O`<span role="alert">${this.editError}</span>`):k}
        `)}
    </form>`}get knownCaptureStatus(){let e=this.statusTask.value;return e?.isCurrent()?e.status:null}get captureStatus(){return this.statusTask.status===L.COMPLETE?this.knownCaptureStatus:null}render(){let e=this.captureStatus,t=this.statusTask.status===L.ERROR?v(this.statusTask.error):null,n=e?.latestTranscript,r=this.sources.map((t,n)=>{let r=P(t),i=e?.providers.find(e=>e.providerId===r?.providerId);return U({title:typeof r?.title==`string`?r.title:sn(r?.providerId)??b(`transcripts.unknown`),description:[i?.name,r?.accountId,r?.guildId,r?.channelId,r?.meetingUrl].filter(e=>typeof e==`string`&&e).join(` · `),control:O`<button
            class="btn"
            ?disabled=${this.disabled}
            aria-label=${b(`meetingCapture.editSourceNumber`,{number:String(n+1)})}
            @click=${()=>this.editSource(n)}
          >
            ${T.edit}${b(`meetingCapture.edit`)}
          </button>
          <button
            class="btn"
            ?disabled=${this.disabled}
            aria-label=${b(`meetingCapture.removeSourceNumber`,{number:String(n+1)})}
            @click=${()=>{this.disabled||(this.context.runtimeConfig.patchForm([`transcripts`,`autoStart`],this.sources.filter((e,t)=>t!==n)),this.editSource(null))}}
          >
            ${T.trash}${b(`common.remove`)}
          </button>`})});return O`${_r(O`
        <div class="settings-stack" id=${Pi.meetingCapture}>
          ${B({title:b(`meetingCapture.title`),description:b(`meetingCapture.description`)},O`
              ${H({title:b(`meetingCapture.enabled`),description:b(`meetingCapture.enabledHint`),checked:this.config?.enabled!==!1,disabled:this.disabled,onChange:e=>{this.disabled||this.context.runtimeConfig.patchForm([`transcripts`,`enabled`],e)}})}
              ${Er({title:b(`transcripts.library`),description:b(`meetingCapture.libraryHint`),onClick:()=>this.context.navigate(`meetings`)})}
              ${U({title:b(`meetingCapture.observedState`),description:b(`meetingCapture.stateHint`),control:V({kind:`muted`,label:b(e?e.enabled?`meetingCapture.states.enabled`:`meetingCapture.states.disabled`:`meetingCapture.states.unknown`)})})}
              ${U({title:b(`meetingCapture.latestTranscript`),description:n?n.title:b(e?`meetingCapture.noSaved`:`transcripts.unknown`),control:W(n?b(`transcripts.savedCount`,{count:String(n.utteranceCount)}):b(`transcripts.unknown`))})}
              ${n?U({title:b(`meetingCapture.lastUtterance`),control:W(n.lastUtteranceAt?new Date(n.lastUtteranceAt).toLocaleString():b(`transcripts.unknown`))}):k}
              ${U({title:b(`meetingCapture.health`),control:O`<button
                  class="btn"
                  ?disabled=${!this.client||this.statusTask.status===L.PENDING}
                  @click=${()=>void this.statusTask.run()}
                >
                  ${T.refresh}${b(`common.refresh`)}
                </button>`})}
              ${t?R(O`<span role="alert">${b(`meetingCapture.healthError`)} ${t}</span>`):k}
              ${this.statusTask.status===L.PENDING?R(O`<span role="status">${b(`common.loading`)}</span>`):k}
              ${qe(this.context.gateway.snapshot.hello?.auth??null)?k:R(b(`configView.adminRequired`))}
              ${this.rawDraftPending?R(b(`meetingCapture.rawDraftPending`)):k}
            `)}
          ${B({title:b(`meetingCapture.sources`),description:b(`meetingCapture.sourcesHint`),actions:O`<button
                class="btn"
                ?disabled=${this.disabled||!e?.providers.some(Ya)}
                @click=${()=>this.editSource(`new`)}
              >
                ${T.plus}${b(`meetingCapture.addSource`)}
              </button>`},r.length?r:R(b(`meetingCapture.noSources`)))}
          ${Et(this.editing,this.renderSourceEditor(e))}
          ${e&&!e.providers.some(Ya)?R(b(`meetingCapture.noAutoStartProviders`)):k}
          ${e?.configuredSources.length?B({title:b(`meetingCapture.sourceHealth`),description:b(`meetingCapture.armedHint`)},e.configuredSources.map(e=>U({title:e.title??e.source.providerId,description:[e.source.accountId,e.source.guildId,e.source.channelId,e.source.meetingUrl,e.startDiagnostic?b(`meetingCapture.startDiagnostics.${e.startDiagnostic}`):void 0].filter(Boolean).join(` · `),control:V({kind:`muted`,label:b(`meetingCapture.states.${e.state}`)})}))):k}
          ${e&&Object.values(e.omitted).some(e=>e>0)?O`<p class="settings-page__intro">
                  ${b(`meetingCapture.omitted`,{count:String(Object.values(e.omitted).reduce((e,t)=>e+t,0))})}
                </p>`:k}
          <p class="settings-page__intro">${b(`meetingCapture.safetyHint`)}</p>
          <p class="settings-page__intro">${b(`meetingCapture.durationHint`)}</p>
          <p class="settings-page__intro">${b(`meetingCapture.sttHint`)}</p>
        </div>
      `)}
      <details
        class="settings-page"
        ?open=${this.advancedExpanded}
        ${w({settingsPage:!0})}
      >
        <summary class="settings-section__heading">${b(`meetingCapture.advancedSettings`)}</summary>
        ${this.editor}
      </details>`}},F([wn({context:gt,subscribe:!0})],Qa.prototype,`context`,void 0),F([N({type:Boolean})],Qa.prototype,`mutationDisabled`,void 0),F([N({attribute:!1})],Qa.prototype,`editor`,void 0),F([N({type:Boolean})],Qa.prototype,`advancedExpanded`,void 0),F([j()],Qa.prototype,`editing`,void 0),F([j()],Qa.prototype,`editError`,void 0),F([j()],Qa.prototype,`editedProviderId`,void 0),customElements.get(`openclaw-meeting-capture-settings`)||customElements.define(`openclaw-meeting-capture-settings`,Qa)})))()}function eo(e,t){return`${t}:${e.path}:${e.startLine}:${e.endLine}`}function to(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 no(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 O`<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 ro;function io(){return(io=e((()=>{A(),M(),D(),a(),q(),S(),m(),K(),ro=class extends i{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}updated(e){(e.has(`agentId`)||e.has(`client`)||e.has(`connected`)||e.has(`methodAdvertised`))&&this.resetSearch()}resetSearch(){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={kind:`loading`,query:t};this.query=t,this.searchState=i,this.openResultKey=null,this.details=new Map;try{let e=await n.request(`memory.search`,{query:t,agentId:r});if(this.searchState!==i||this.agentId!==r||this.client!==n)return;this.searchState={kind:`ready`,query:t,...e}}catch(e){if(this.searchState!==i||this.agentId!==r||this.client!==n)return;this.searchState={kind:`error`,query:t,message:v(e)}}}toggleResult(e,t){let n=eo(e,t);if(this.openResultKey===n){this.openResultKey=null;return}this.openResultKey=n,this.details.has(e.path)||this.loadDetail(e.path)}async loadDetail(e){let t=this.connected?this.client:null,n=this.agentId;if(!t||!n)return;let r={kind:`loading`};this.details=new Map(this.details).set(e,r);try{let i=await t.request(`agents.workspace.get`,{agentId:n,path:e});if(this.details.get(e)!==r||this.agentId!==n)return;let a=i.file.encoding===`utf8`?{kind:`ready`,content:i.file.content}:{kind:`error`,message:b(`memoryPage.memories.fileUnsupported`)};this.details=new Map(this.details).set(e,a)}catch(t){if(this.details.get(e)!==r||this.agentId!==n)return;this.details=new Map(this.details).set(e,{kind:`error`,message:v(t)})}}renderDetail(e,t,n){if(this.openResultKey!==e)return k;let r=this.details.get(n.path);return O`<div id=${t} class="memory-memories__detail">
      ${!r||r.kind===`loading`?O`<p role="status">${b(`memoryPage.memories.fileLoading`)}</p>`:r.kind===`error`?O`<p class="memory-memories__detail-error" role="alert">
                ${b(`memoryPage.memories.fileError`,{message:r.message})}
              </p>`:no(r.content,n)}
    </div>`}renderResults(e){let t=e.searchMode===`hybrid`?b(`memoryPage.memories.hybridSearch`):b(`memoryPage.memories.keywordSearch`);return O`
      ${e.stale?O`<div class="callout warn" role="status">
              ${e.warning?O`<p>${e.warning}</p>`:k}
              ${e.action?O`<p>${e.action}</p>`:k}
            </div>`:k}
      <div class="memory-memories__results-heading">
        <span>${b(`memoryPage.memories.results`,{count:String(e.results.length)})}</span>
        <span class="memory-memories__mode">${t}</span>
      </div>
      ${e.results.length===0?O`<p class="memory-memories__state">
              ${b(`memoryPage.memories.empty`,{query:e.query})}
            </p>`:O`<div class="settings-group memory-memories__results">
              ${e.results.map((e,t)=>{let n=eo(e,t),r=this.openResultKey===n,i=to(e),a=`memory-detail-${t}`,o=O`
                  <span class="settings-row__text">
                    <span class="settings-row__title">${e.snippet}</span>
                    <span class="settings-row__desc memory-memories__path"
                      >${e.path} ·
                      ${b(`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"
                      >${b(e.source===`sessions`?`memoryPage.memories.sourceSessions`:`memoryPage.memories.sourceMemory`)}</span
                    >
                    <span
                      >${b(`memoryPage.memories.score`,{score:e.score.toFixed(2)})}</span
                    >
                  </span>
                `;return O`<article class="memory-memories__result">
                  ${i?O`<button
                          type="button"
                          class="settings-row settings-row--nav"
                          aria-expanded=${String(r)}
                          aria-controls=${a}
                          @click=${()=>this.toggleResult(e,t)}
                        >
                          ${o}
                        </button>`:O`<div class="settings-row">${o}</div>`}
                  ${i?this.renderDetail(n,a,e):k}
                </article>`})}
            </div>`}
    `}renderSearchState(){switch(this.searchState.kind){case`loading`:return O`<p class="memory-memories__state" role="status">
          ${b(`memoryPage.memories.searching`)}
        </p>`;case`error`:{let e=this.searchState;return O`<div class="memory-memories__state" role="alert">
          <p>${b(`memoryPage.memories.error`,{message:e.message})}</p>
          <button class="btn btn--sm" @click=${()=>void this.search(e.query)}>
            ${b(`memoryPage.memories.retry`)}
          </button>
        </div>`}case`ready`:return this.renderResults(this.searchState);default:return O`<p class="memory-memories__state">${b(`memoryPage.memories.idle`)}</p>`}}render(){return O`<div
      class="settings-page memory-memories"
      ${w({settingsPage:!0})}
    >
      ${this.methodAdvertised?O`<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"
                  >${b(`memoryPage.memories.searchLabel`)}</label
                >
                <input
                  id="memory-search-input"
                  type="search"
                  class="settings-input"
                  .value=${this.query}
                  placeholder=${b(`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`}
                >
                  ${b(`memoryPage.memories.searchButton`)}
                </button>
              </form>
              ${this.renderSearchState()}`:O`<p class="memory-memories__unavailable">
              ${b(`memoryPage.memories.gatewayUpdateRequired`)}
            </p>`}
    </div>`}},F([N({attribute:!1})],ro.prototype,`client`,void 0),F([N({type:Boolean})],ro.prototype,`connected`,void 0),F([N({type:Boolean})],ro.prototype,`methodAdvertised`,void 0),F([N()],ro.prototype,`agentId`,void 0),F([j()],ro.prototype,`query`,void 0),F([j()],ro.prototype,`searchState`,void 0),F([j()],ro.prototype,`openResultKey`,void 0),F([j()],ro.prototype,`details`,void 0),customElements.get(`openclaw-memory-memories`)||customElements.define(`openclaw-memory-memories`,ro)})))()}function ao(e,t){return[`plugins`,`entries`,e,`config`,`dreaming`,...t]}function oo(e){let t=P(e?.agents),n=P(t?.defaults)?.userTimezone;return typeof n==`string`&&n.trim()?n.trim():null}function so(){return(so=e((()=>{})))()}function co(e,t){let n=e;for(let e of t)n=P(n)?.[e];return t.length?n:void 0}function lo(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=P(n[r])}return!1}function uo(e){return So.find(t=>t===e)??Co}function fo(e){let t=co(e,[`execution`,`defaults`,`model`]);return typeof t==`string`&&t.trim()?t.trim():b(`memoryPage.dreaming.model.default`)}function po(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 mo(e,t){let n=co(e.dreaming,t.path),r=lo(e.dreaming,t.path),i=t.kind===`toggle`?t.fallback?b(`common.enabled`):b(`common.disabled`):t.kind===`number`?String(t.defaultValue):t.path[0]===`timezone`?e.timezoneDefault??b(`memoryPage.dreaming.timezone.default`):t.path[0]===`model`?fo(e.dreaming):t.defaultValue??``,a=G(i,r);if(t.kind===`toggle`)return H({title:b(t.labelKey),description:O`${b(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=jr(i);return U({title:b(t.labelKey),description:O`${b(t.helpKey)} ${a}`,control:Ir({label:b(t.labelKey),value:o,options:[{value:``,label:i,...n?{provider:n}:{}}],disabled:e.disabled,custom:{label:b(`cron.form.customModel`),placeholder:t.placeholderKey?b(t.placeholderKey):``,commit:`change`},onChange:n=>e.onPatch(t.path,n.trim()||void 0)})})}return U({title:b(t.labelKey),description:O`${b(t.helpKey)} ${a}`,control:O`
      <input
        class="settings-input"
        type=${t.kind===`number`?`number`:`text`}
        min=${s?String(s.min):k}
        max=${s?.max===void 0?k:String(s.max)}
        step=${s?s.integer?`1`:`any`:k}
        spellcheck="false"
        aria-label=${b(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=po(i,s);if(n===null){r.value=o;return}e.onPatch(t.path,n);return}e.onPatch(t.path,i)}}
      />
    `})}function ho(e){let t=uo(co(e.dreaming,[`storage`,`mode`])),n=G(b(`memoryPage.dreaming.storage.modes.separate`),lo(e.dreaming,[`storage`,`mode`]));return O`
    ${B({title:b(`memoryPage.dreaming.schedule.title`),description:b(`memoryPage.dreaming.schedule.description`)},bo.map(t=>mo(e,t)))}
    ${B({title:b(`memoryPage.dreaming.storage.title`),description:b(`memoryPage.dreaming.storage.description`)},O`
        ${U({title:b(`memoryPage.dreaming.storage.modeLabel`),description:O`
            ${b(`memoryPage.dreaming.storage.modeHelp`)} ${n}
          `,stacked:!0,control:Or({value:t,options:So.map(e=>({value:e,label:b(`memoryPage.dreaming.storage.modes.${e}`)})),ariaLabel:b(`memoryPage.dreaming.storage.modeLabel`),disabled:e.disabled,onChange:t=>e.onPatch([`storage`,`mode`],t)})})}
        ${mo(e,{kind:`toggle`,path:[`storage`,`separateReports`],labelKey:`memoryPage.dreaming.storage.separateReportsLabel`,helpKey:`memoryPage.dreaming.storage.separateReportsHelp`,fallback:!1})}
      `)}
    ${Object.entries(xo).map(([t,n])=>B({title:b(`memoryPage.dreaming.phases.${t}.title`),description:b(`memoryPage.dreaming.phases.${t}.description`)},[mo(e,{kind:`toggle`,path:[`phases`,t,`enabled`],labelKey:`memoryPage.dreaming.phaseFields.enabled`,helpKey:`memoryPage.dreaming.phaseFields.enabledHelp`,fallback:!0}),...n.map(([n,r,i])=>mo(e,{kind:`number`,path:[`phases`,t,n],labelKey:`memoryPage.dreaming.phaseFields.${n}`,helpKey:`memoryPage.dreaming.phaseFields.${n}Help`,bounds:r,defaultValue:i}))]))}
  `}function go(e){return B({title:b(`memoryPage.dreaming.unsupported.title`)},U({title:b(`memoryPage.dreaming.unsupported.rowTitle`),description:b(`memoryPage.dreaming.unsupported.description`,{plugin:e})}))}var _o,vo,yo,bo,xo,So,Co;function wo(){return(wo=e((()=>{A(),kr(),Vr(),z(),a(),q(),K(),_o={integer:!0,min:0},vo={integer:!0,min:1},yo={integer:!1,min:0,max:1},bo=[...[`frequency`,`timezone`,`model`].map(e=>({kind:`text`,path:[e],labelKey:`memoryPage.dreaming.${e}.label`,helpKey:`memoryPage.dreaming.${e}.help`,placeholderKey:`memoryPage.dreaming.${e}.placeholder`,defaultValue:e===`frequency`?`0 3 * * *`:void 0})),{kind:`toggle`,path:[`verboseLogging`],labelKey:`memoryPage.dreaming.verboseLogging.label`,helpKey:`memoryPage.dreaming.verboseLogging.help`,fallback:!1}],xo={light:[[`lookbackDays`,_o,2],[`limit`,_o,100],[`dedupeSimilarity`,yo,.9]],deep:[[`limit`,_o,10],[`minScore`,yo,.75],[`minRecallCount`,_o,3],[`minUniqueQueries`,_o,3],[`recencyHalfLifeDays`,_o,14],[`maxAgeDays`,vo,30],[`maxPromotedSnippetTokens`,vo,160]],rem:[[`lookbackDays`,_o,7],[`limit`,_o,10],[`minPatternStrength`,yo,.75]]},So=[`inline`,`separate`,`both`],Co=`separate`})))()}function To(e){return!e.embedding.ok&&e.embedding.checked!==!1}function Eo(e){return e.provider===`none`?b(`memoryPage.overview.hero.keywordSearch`):b(`memoryPage.overview.hero.hybridSearch`)}function Do(e){let t=Ri(e.engineSelection),n=e.engineSelection.kind===`off`||e.engineDisabled,r=e.status.kind===`ready`?e.status.payload:null,i=r?.searchRuntimeRegistered===!1,a=e.status.kind===`error`||!i&&r!==null&&To(r),o=yi(vi(e.agentId??`memory`)),s=n?b(`memoryPage.overview.hero.hibernating`):e.status.kind===`loading`||e.status.kind===`idle`?b(`memoryPage.overview.hero.waking`):b(i?`memoryPage.overview.hero.noSearchRuntime`:a?`memoryPage.overview.hero.needsAttention`:`memoryPage.overview.hero.awake`),c=n?b(e.engineDisabled?`memoryPage.overview.hero.disabledDescription`:`memoryPage.overview.hero.offDescription`):e.status.kind===`error`?e.status.message:r?i?b(`memoryPage.overview.hero.noSearchRuntimeDescription`,{engine:t??b(`common.unknown`)}):To(r)?r.embedding.error??b(`memoryPage.overview.health.unavailable`):b(`memoryPage.overview.hero.activeDescription`,{engine:t??b(`common.unknown`),mode:Eo(r)}):b(`memoryPage.overview.hero.loadingDescription`),l=n?{sleeping:!0}:a?{grumpy:!0,standalone:!0}:r&&!i?{reading:!0,standalone:!0}:{standalone:!0};return O`
    <section class="memory-overview__hero ${n?`memory-overview__hero--sleeping`:``}">
      <div class="memory-overview__lobster" style=${Oi(o)}>
        ${bi(o,l)}
      </div>
      <div class="memory-overview__hero-copy">
        <h2>${s}</h2>
        <p class=${a?`memory-overview__hero-error`:``}>${c}</p>
        <div class="memory-overview__hero-actions">
          ${n?O`<button class="btn btn--sm" @click=${()=>e.onNavigate(`settings`)}>
                  ${b(`memoryPage.overview.hero.openSettings`)}
                </button>`:O`<button class="btn btn--sm" @click=${e.onRefresh}>
                  ${e.status.kind===`error`?b(`memoryPage.overview.hero.retry`):b(`memoryPage.overview.hero.refresh`)}
                </button>`}
        </div>
      </div>
    </section>
  `}function Oo(e,t,n){return[e.cron||b(`common.na`),t,n&&e.nextRunAtMs?b(`memoryPage.overview.schedule.nextRun`,{time:he(e.nextRunAtMs)}):null,e.lastRunAtMs?b(`memoryPage.overview.schedule.lastRun`,{time:he(e.lastRunAtMs)}):null].filter(e=>!!e).join(` · `)}function ko(e){let t=[[`light`,e.phases.light],[`rem`,e.phases.rem],[`deep`,e.phases.deep]];return B({title:b(`memoryPage.overview.schedule.title`)},O`
      ${t.map(([t,n])=>U({title:b(`memoryPage.dreaming.phases.${t}.title`),description:O`
            ${b(`memoryPage.overview.schedule.${t}Description`)}<br />
            ${Oo(n,e.timezone,e.enabled&&n.enabled&&n.managedCronPresent)}
          `,control:V({kind:e.enabled&&n.enabled&&n.managedCronPresent?`ok`:`muted`,label:!e.enabled||!n.enabled?b(`common.disabled`):n.managedCronPresent?b(`common.enabled`):b(`memoryPage.overview.schedule.notScheduled`)})}))}
      ${U({title:b(`memoryPage.overview.schedule.learnMore`),control:O`<a
          class="memory-page__link"
          href="https://docs.openclaw.ai/concepts/dreaming"
          target="_blank"
          rel="noreferrer noopener"
          >${b(`memoryPage.overview.schedule.openDocs`)}</a
        >`})}
    `)}function Ao(e){let t=[[`promotedToday`,e.promotedToday],[`promotedTotal`,e.promotedTotal],[`shortTermCount`,e.shortTermCount],[`phaseHitCount`,e.phaseSignalCount],[`lightPhaseHitCount`,e.lightPhaseHitCount],[`remPhaseHitCount`,e.remPhaseHitCount]];return B({title:b(`memoryPage.overview.activity.title`)},t.map(([e,t])=>U({title:b(`memoryPage.overview.activity.${e}`),control:W(t)})))}function jo(e,t){let n=e.embedding.checked===!1,r=e.embedding.ok?`ok`:n?`muted`:`danger`,i=t.probingEmbeddings?b(`memoryPage.overview.health.checking`):e.embedding.ok?b(`memoryPage.overview.health.healthy`):b(n?`memoryPage.overview.health.notChecked`:`memoryPage.overview.health.unavailable`);return B({title:b(`memoryPage.overview.health.title`)},O`
      ${U({title:b(`memoryPage.overview.health.provider`),control:W(e.provider??b(`common.unknown`),{mono:!0})})}
      ${U({title:b(`memoryPage.overview.health.embeddings`),description:e.embedding.ok?k:n?b(`memoryPage.overview.health.notCheckedDescription`):e.embedding.error,control:O`
          ${V({kind:r,label:i})}
          ${n?O`<button
                  type="button"
                  class="btn btn--sm"
                  ?disabled=${t.probingEmbeddings}
                  @click=${t.onProbeEmbeddings}
                >
                  ${t.probingEmbeddings?b(`memoryPage.overview.health.testing`):b(`memoryPage.overview.health.test`)}
                </button>`:k}
        `})}
      ${e.embeddingRuntime?U({title:b(`memoryPage.overview.health.runtime`),description:e.embeddingRuntime.loadError,control:W([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(` · `))}):k}
    `)}function Mo(e){return e.status.kind===`ready`?O`
    ${e.status.payload.dreaming?ko(e.status.payload.dreaming):k}
    ${e.status.payload.dreaming?Ao(e.status.payload.dreaming):k}
    ${e.status.payload.searchRuntimeRegistered===!1?k:jo(e.status.payload,e)}
  `:k}function No(e){return B({title:b(`memoryPage.overview.shortcuts.title`)},[[`memories`,`memoryPage.overview.shortcuts.memories`],[`dreams`,`memoryPage.overview.shortcuts.diary`],[`settings`,`memoryPage.overview.shortcuts.settings`]].map(([t,n])=>Er({title:b(n),onClick:()=>e.onNavigate(t)})))}function Po(e){let t=e.engineSelection.kind!==`off`&&!e.engineDisabled;return O`
    <div class="settings-page memory-overview" ${w({settingsPage:!0})}>
      ${Do(e)} ${t?Mo(e):k} ${No(e)}
    </div>
  `}function Fo(){return(Fo=e((()=>{A(),D(),ji(),wi(),z(),a(),q(),h(),Ii(),K()})))()}function Io(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===Fi?b(`memoryPage.engine.openClawMemory`):e.name,available:!0})).toSorted((e,t)=>{let n=e.id===Fi;return n===(t.id===Fi)?e.label.localeCompare(t.label):n?-1:1}),r=Ri(t);if(r&&!n.some(e=>e.id===r)){let e={id:r,label:r===Fi?b(`memoryPage.engine.openClawMemory`):r,available:!1};r===Fi?n.unshift(e):n.push(e)}return n}function Lo(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 Ro(e,t){return e.kind===`ready`&&t?e.plugins.find(e=>e.id===t):void 0}function zo(e,t){return qo.map(n=>{let r=Ro(e,n.id);return{id:n.id,label:b(n.labelKey),description:r?.description??n.id,state:Lo(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 Bo(e){switch(e.kind){case`auto`:return`memoryPage.engine.autoHint`;case`off`:return`memoryPage.engine.offHint`;default:return`memoryPage.engine.explicitHint`}}function Vo(e){let t=Ri(e.engineSelection),n=e.engineOptions.find(e=>e.id===Fi)?.label??b(`memoryPage.engine.openClawMemory`),r=G(n,e.engineSelection.kind!==`auto`);if(e.engineOptions.length===0)return B({title:b(`memoryPage.engine.title`),description:b(`memoryPage.engine.description`)},U({title:b(`memoryPage.engine.rowTitle`),description:O`
          ${b(`memoryPage.engine.catalogUnavailable`)} ${b(Bo(e.engineSelection))}
          ${r}
        `,control:W(t??b(`memoryPage.engine.off`),{mono:!0})}));let i=[...e.engineOptions.map(e=>({value:e.id,label:e.available?e.label:`${e.label} (${b(`memoryPage.engine.unavailable`)})`})),{value:Xo,label:b(`memoryPage.engine.off`)}];return B({title:b(`memoryPage.engine.title`),description:b(`memoryPage.engine.description`)},O`
      ${U({title:b(`memoryPage.engine.rowTitle`),description:O`${b(Bo(e.engineSelection))} ${r}`,stacked:!0,control:Or({value:t??Xo,options:i,disabled:e.engineBusy,ariaLabel:b(`memoryPage.engine.rowTitle`),onChange:t=>e.onEngineChange(t||null)})})}
      ${Ho(e,t)}
      ${e.engineOutcome===null?k:U({title:b(e.engineOutcome.kind===`error`?`memoryPage.engine.changeFailed`:`pluginsPage.needsAttention`),description:e.engineOutcome.message,control:V({kind:e.engineOutcome.kind===`error`?`danger`:`warn`,label:b(e.engineOutcome.kind===`error`?`common.failed`:`pluginsPage.needsAttention`)})})}
    `)}function Ho(e,t){return t===null||e.engineState!==`disabled`?k:U({title:b(`memoryPage.engine.disabledTitle`),description:b(`memoryPage.engine.disabledHint`),control:O`
      <button
        class="btn btn--sm"
        ?disabled=${e.engineBusy}
        @click=${()=>e.onEngineChange(t)}
      >
        ${b(`memoryPage.engine.enable`)}
      </button>
    `})}function Uo(e){return V({kind:e===`enabled`?`ok`:`muted`,label:b(e===`enabled`||e===`disabled`||e===`loading`?`common.${e}`:`memoryPage.addons.stateUnknown`)})}function Wo(e){return B({title:b(`memoryPage.addons.title`),description:b(`memoryPage.addons.description`)},O`
      ${e.addons.map(t=>O`
          ${e.canToggleAddons&&(t.state===`enabled`||t.state===`disabled`)?H({title:t.label,ariaLabel:b(`memoryPage.addons.toggleAriaLabel`,{plugin:t.label}),description:t.description,checked:t.state===`enabled`,disabled:t.busy,onChange:n=>e.onAddonChange(t.id,n)}):U({title:t.label,description:t.description,control:Uo(t.state)})}
          ${t.error===null?k:U({title:b(`memoryPage.addons.changeFailed`,{plugin:t.label}),description:t.error,control:V({kind:`danger`,label:b(`common.failed`)})})}
          ${t.notice===null?k:U({title:b(`pluginsPage.needsAttention`),description:t.notice,control:V({kind:`warn`,label:b(`pluginsPage.needsAttention`)})})}
        `)}
      ${U({title:b(`memoryPage.addons.manage`),control:O`<a class="memory-page__link" href=${e.pluginsHref}
          >${b(`memoryPage.addons.manageLink`)}</a
        >`})}
    `)}function Go(e){return O`
    <div class="settings-page" ${w({settingsPage:!0})}>
      ${Vo(e)} ${Wo(e)}
      <p class="settings-page__intro">${b(`memoryPage.search.intro`)}</p>
    </div>
    ${e.editor}
    <div class="settings-page" ${w({settingsPage:!0})}>
      ${e.dreamingSettings}
      ${B({title:b(`memoryPage.import.title`),description:b(`memoryPage.import.description`)},U({title:b(`tabs.memoryImport`),description:b(`subtitles.memoryImport`),control:e.canImportMemory?O`<a class="memory-page__link" href=${e.memoryImportHref}
                >${b(`memoryPage.import.link`)}</a
              >`:W(b(`memoryImport.adminRequired`))}))}
    </div>
  `}function Ko(e){return O`
    <section class="memory-page" ${w({memoryPage:!0})}>
      <section
        class="content-header content-header--settings content-header--page hub-page-header"
        ${w({toolbarHeader:!0})}
      >
        <div class="hub-page-header__title">
          <div class="page-title">${b(`tabs.memory`)}</div>
          <div class="page-subtitle">
            ${b(`memoryPage.intro`)} ${Cr(Yo)}
          </div>
        </div>
        <div class="hub-page-header__tabs">
          ${Fr({id:`memory`,active:e.activeTab,tabs:[{value:`overview`,label:b(`memoryPage.tabs.overview`)},{value:`memories`,label:b(`memoryPage.tabs.memories`)},{value:`dreams`,label:b(`memoryPage.tabs.dreams`)},{value:`settings`,label:b(`memoryPage.tabs.settings`)}],ariaLabel:b(`memoryPage.tablistLabel`),panelId:Jo,onSelect:t=>e.onTabChange(t)})}
        </div>
      </section>
      <div id=${Jo} class="memory-page__panel" role="tabpanel">
        ${e.activeTab===`overview`?e.overview:e.activeTab===`memories`?e.memories:e.activeTab===`dreams`?e.dreams:Go(e)}
      </div>
    </section>
  `}var qo,Jo,Yo,Xo;function Zo(){return(Zo=e((()=>{A(),D(),Lr(),z(),a(),_a(),pi(),q(),Ii(),K(),mi(),ga(),qo=[{id:`active-memory`,labelKey:`memoryPage.addons.activeMemory.title`},{id:`memory-wiki`,labelKey:`memoryPage.addons.memoryWiki.title`}],Jo=`memory-settings-panel`,Yo=`https://docs.openclaw.ai/concepts/memory`,Xo=``})))()}var Qo,$o,es,Y;function ts(){return(ts=e((()=>{En(),A(),M(),rt(),Me(),vt(),z(),a(),q(),de(),S(),zt(),p(),m(),n(),Xi(),Ji(),io(),so(),wo(),Fo(),Ii(),Zo(),K(),Qo=`none`,$o=[`plugins`,`slots`,`memory`],es=`https://docs.openclaw.ai/concepts/dreaming`,Y=class extends i{constructor(...e){super(...e),this.configObject={},this.mutationDisabled=!1,this.pluginsHref=``,this.memoryImportHref=``,this.routeData=null,this.buildEditor=()=>O``,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 le(this).effect(()=>this.context?.settingsAgentSelection,()=>{this.syncRouteAgent()}).watchStore(()=>this.context?.settingsAgentSelection,e=>this.selectAgent(e.state.selectedId)).watchStore(()=>this.context?.gateway,e=>this.syncGateway(e.snapshot)).watchStore(()=>this.context?.runtimeConfig,e=>this.syncSupport(e)).watchStore(()=>this.context?.agents,()=>void 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()}syncRouteAgent(){let e=new URLSearchParams(this.routeData?.search).get(`agent`)?.trim(),t=this.routeData?.agentSelectionIntent,n=this.context.settingsAgentSelection;e&&t?.owner===n&&t.revision===n.intentRevision&&n.set(Zn(e))}willUpdate(e){if(e.has(`routeData`)){let t=e.get(`routeData`),n=this.activeTab(t??null),r=this.activeTab();n!==r&&(this.overviewRequest=null,this.probingEmbeddings=!1),this.syncRouteAgent(),n!==r&&this.loadOverviewStatus()}}updated(e){if(e.has(`routeData`)&&this.syncCanonicalLocation(),e.has(`configObject`)){let t=e.get(`configObject`),n=t?Ri(Li(t)):null,r=Ri(Li(this.configObject));t&&n!==r&&(this.overviewRequest=null,this.probingEmbeddings=!1,this.loadOverviewStatus())}}activeTab(e=this.routeData){return qi(e??{},this.context?.basePath??``)??`overview`}syncCanonicalLocation(){let e=this.context,t=this.routeData;if(!e||!t)return;let n=Gi(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){let{client:t}=e,n=e.phase===`connected`,r=e.hello?.server?.bootId,i=e.pluginCapabilities?.generation,a=i!==this.pluginGeneration;if(this.pluginGeneration=i,this.connection?.client===t&&this.connection.connected===n&&this.connection.bootId===r){a&&t&&n&&this.refreshPluginReads(t,this.connection);return}let o={client:t,connected:n,bootId:r};if(this.connection=o,this.engineBusy=!1,this.engineOutcome=null,this.addonBusy=new Set,this.addonRefreshWarnings=new Map,this.overviewRequest=null,this.probingEmbeddings=!1,!t||!n){this.catalog={kind:`unavailable`},this.activeTab()===`overview`&&(this.overviewStatus={kind:`error`,message:b(`memoryPage.overview.hero.gatewayOffline`)});return}this.catalog={kind:`loading`},this.addonNotices=new Map([...this.addonNotices].filter(([,e])=>e.bootId&&e.bootId===r)),this.refreshPluginReads(t,o)}refreshPluginReads(e,t){this.overviewRequest=null,this.probingEmbeddings=!1,this.supportPluginId=null,this.supportProbe=null,this.syncSupport(this.context.runtimeConfig),this.loadCatalog(e,t),this.loadOverviewStatus()}async loadCatalog(e,t){let n=++this.catalogRequest;try{let r=await o(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)}selectAgent(e){this.selectedAgentId!==e&&(this.selectedAgentId=e,this.overviewRequest=null,this.overviewStatus={kind:`idle`},this.probingEmbeddings=!1,this.loadOverviewStatus())}async loadOverviewStatus(e={}){if(this.activeTab()!==`overview`)return;if(Li(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.selectedAgentId;if(!t||!n){this.overviewStatus={kind:`error`,message:b(`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:v(e)}}finally{this.overviewRequest===a&&(this.probingEmbeddings=!1)}}engineState(e){let t=Ri(e);return t===null?`unknown`:Lo(this.catalog,Ro(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=b(`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||!je(this.context.gateway.snapshot).canAdmin)return;let n=Ro(this.catalog,e),r=Lo(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 d(this.context.runtimeConfig,a,async n=>{let r=this.context.gateway.snapshot.hello?.server?.bootId;return{result:await f(n,e,t),bootId:r}},{canDispatch:()=>this.canDispatchPluginMutation(i)}),{result:r,bootId:s}=n.value,c=(`warnings`in r?r.warnings??[]:[]).join(` `);if(this.addonNoticeOperations.get(e)===o){this.applyPluginRefreshOutcome(i,n.refreshError,e);let t=new Map(this.addonNotices),r=this.context.gateway.snapshot.hello?.server?.bootId;c&&(s&&r?s===r:this.connection===i)?t.set(e,{message:c,bootId:s}):t.delete(e),this.addonNotices=t}let l=this.connection;l?.connected&&l.client&&await this.loadCatalog(l.client,l)}catch(t){this.connection===i&&(this.addonErrors=new Map(this.addonErrors).set(e,v(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}}}canDispatchPluginMutation(e){return this.connection===e&&!this.mutationDisabled&&(this.catalog.kind!==`ready`||this.catalog.mutationAllowed)&&je(this.context.gateway.snapshot).canAdmin}async changeEngine(e,t){if(this.engineBusy||this.mutationDisabled||this.catalog.kind===`ready`&&!this.catalog.mutationAllowed||e===Ri(t)&&(e===null||this.engineState(t)===`enabled`))return;if(this.engineOutcome=null,!e){this.context.runtimeConfig.patchForm($o,Qo);return}let n=this.connection,r=n?.connected?n.client:null;if(n&&r){this.engineBusy=!0;try{let t=await d(this.context.runtimeConfig,r,t=>f(t,e,!0),{canDispatch:()=>this.canDispatchPluginMutation(n)});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:v(e)})}finally{this.connection===n&&(this.engineBusy=!1)}}}dreamingPluginId(){return $i(fe(this.context.runtimeConfig.state)).pluginId}syncSupport(e){let t=$i(fe(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,Yi(e,t).then(e=>{this.supportProbe===r&&(this.supportProbe=null,this.isConnected&&(this.support=e))})}patchDreaming(e,t){if(this.mutationDisabled)return;let n=ao(this.dreamingPluginId(),e);if(t===void 0){this.context.runtimeConfig.removeFormValue(n);return}this.context.runtimeConfig.patchForm(n,t)}renderDreamingControls(){let e=fe(this.context.runtimeConfig.state),{pluginId:t}=$i(e),n=P(e?.plugins),r=P(P(n?.entries)?.[t]);return O`
      <p class="settings-page__intro">
        ${b(`memoryPage.dreaming.intro`,{plugin:t})}
        ${Cr(es)}
      </p>
      ${this.support===`unsupported`?go(t):ho({dreaming:P(P(r?.config)?.dreaming),timezoneDefault:oo(e),disabled:this.mutationDisabled,onPatch:(e,t)=>this.patchDreaming(e,t)})}
    `}navigateTab(e){this.context.navigate(`memory`,{pathname:bt(e,this.context.basePath)})}render(){let e=Li(this.configObject),t=this.mutationDisabled||this.catalog.kind===`ready`&&!this.catalog.mutationAllowed,n=this.activeTab(),r=this.selectedAgentId,i=r?null:this.context.agents.state.agentsError,a=this.engineState(e);return Ko({activeTab:n,onTabChange:e=>this.navigateTab(e),engineOptions:Io(this.catalog,e),engineSelection:e,engineState:a,engineBusy:this.engineBusy||t,engineOutcome:this.engineOutcome,onEngineChange:t=>void this.changeEngine(t,e),addons:zo(this.catalog,{busy:this.addonBusy,errors:this.addonErrors,notices:this.addonNotices,refreshWarnings:this.addonRefreshWarnings}),canToggleAddons:this.catalog.kind===`ready`&&this.catalog.mutationAllowed&&!this.mutationDisabled&&je(this.context.gateway.snapshot).canAdmin,onAddonChange:(e,t)=>void this.changeAddon(e,t),pluginsHref:this.pluginsHref,memoryImportHref:this.memoryImportHref,canImportMemory:je(this.context.gateway.snapshot).canAdmin,overview:Po({agentId:r,engineSelection:e,engineDisabled:a===`disabled`,status:i?{kind:`error`,message:i}:this.overviewStatus,probingEmbeddings:this.probingEmbeddings,onRefresh:()=>r?void this.loadOverviewStatus({force:!0}):void this.context.agents.ensureList(),onProbeEmbeddings:()=>void this.loadOverviewStatus({force:!0,probeEmbeddings:!0}),onNavigate:e=>this.navigateTab(e)}),memories:O`
        <openclaw-memory-memories
          .client=${this.context.gateway.snapshot.client}
          .connected=${this.context.gateway.snapshot.phase===`connected`}
          .methodAdvertised=${Rt(this.context.gateway.snapshot,`memory.search`)===!0}
          .agentId=${r}
        ></openclaw-memory-memories>
      `,dreams:r?O`<openclaw-agent-memory-panel .agentId=${r}></openclaw-agent-memory-panel>`:O``,editor:n===`settings`?this.buildEditor():O``,dreamingSettings:n===`settings`?this.renderDreamingControls():O``})}},F([wn({context:gt,subscribe:!0})],Y.prototype,`context`,void 0),F([N({attribute:!1})],Y.prototype,`configObject`,void 0),F([N({type:Boolean})],Y.prototype,`mutationDisabled`,void 0),F([N()],Y.prototype,`pluginsHref`,void 0),F([N()],Y.prototype,`memoryImportHref`,void 0),F([N({attribute:!1})],Y.prototype,`routeData`,void 0),F([N({attribute:!1})],Y.prototype,`buildEditor`,void 0),F([j()],Y.prototype,`catalog`,void 0),F([j()],Y.prototype,`engineBusy`,void 0),F([j()],Y.prototype,`engineOutcome`,void 0),F([j()],Y.prototype,`addonBusy`,void 0),F([j()],Y.prototype,`addonErrors`,void 0),F([j()],Y.prototype,`addonNotices`,void 0),F([j()],Y.prototype,`addonRefreshWarnings`,void 0),F([j()],Y.prototype,`selectedAgentId`,void 0),F([j()],Y.prototype,`overviewStatus`,void 0),F([j()],Y.prototype,`probingEmbeddings`,void 0),F([j()],Y.prototype,`support`,void 0),customElements.get(`openclaw-memory-settings`)||customElements.define(`openclaw-memory-settings`,Y)})))()}function ns(e){let{gatewayAuth:t,execPolicy:n,browserEnabled:r,browserEnabledOverridden:i,toolProfile:a,toolProfileOverridden:o}=e.security,s=a.trim(),c=Qi.map(e=>({value:e.id,label:b(e.labelKey)}));return s&&!c.some(e=>e.value===s)&&c.push({value:s,label:s}),B({title:b(`quickSettings.security.title`)},[U({title:b(`quickSettings.security.gatewayAuth`),control:V({kind:t===`none`?`warn`:t===`unknown`?`muted`:`ok`,label:t})}),U({title:b(`quickSettings.security.execPolicy`),control:W(n)}),H({title:b(`quickSettings.security.browserEnabled`),description:G(b(`common.enabled`),i),checked:r,disabled:e.configBusy,onChange:t=>e.onBrowserEnabledToggle?.(t)}),U({title:b(`quickSettings.security.toolProfile`),description:o?void 0:b(`quickSettings.security.toolProfileDefault`),stacked:!0,control:Or({value:s,options:c,ariaLabel:b(`quickSettings.security.toolProfile`),disabled:e.configBusy,onChange:t=>e.onToolProfileChange?.(t)})}),U({title:b(`devices.pairing.title`),control:O`
        <button
          class="btn"
          title=${e.canPairDevice?``:b(`devices.pairing.adminRequired`)}
          ?disabled=${!e.canPairDevice}
          @click=${e.onPairMobile}
        >
          ${T.smartphone} ${b(`devices.pairing.button`)}
        </button>
      `})])}function rs(e){return O`
    <section class="security-page">
      <div class="settings-page" ${w({settingsPage:!0})}>
        ${ns(e)}
      </div>
      ${e.editor}
    </section>
  `}function is(){return(is=e((()=>{A(),D(),ct(),z(),a(),Zi()})))()}function as(e){return{gateway:{controlUi:{sessionObserver:e?null:!1}}}}function os(e){return{agents:{defaults:{utilityModel:e.kind===`auto`?null:e.kind===`disabled`?``:e.model}}}}function ss(e){if(!e||e.status===`unavailable`)return b(`configView.sessionObserver.modelUnavailable`);if(e.status===`disabled`)return b(`configView.sessionObserver.modelDisabled`);let t=Yt(e.runtime)?.label;return b(e.status===`auto`?`configView.sessionObserver.modelAuto`:`configView.sessionObserver.modelConfigured`,{model:t?`${e.model} · ${t}`:e.model})}function cs(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 ls(e){let t=e.utilityModel===void 0?us:e.utilityModel,n=cs(e.models),r=n.some(e=>e.value===t),i=jr(t);return O`
    <div class="settings-group">
      ${H({title:b(`configView.sessionObserver.toggle`),description:b(`configView.sessionObserver.toggleHint`),checked:e.enabled,disabled:e.disabled,onChange:e.onEnabledChange})}
      ${U({title:b(`configView.sessionObserver.resolvedModel`),description:ss(e.resolvedUtilityModel)})}
      ${U({title:b(`configView.sessionObserver.modelPicker`),description:e.modelsUnavailable?b(`configView.sessionObserver.modelCatalogUnavailable`):b(`configView.sessionObserver.modelPickerHint`),control:Ir({label:b(`configView.sessionObserver.modelPicker`),value:t,options:[{value:us,label:b(`configView.sessionObserver.auto`)},{value:``,label:b(`configView.sessionObserver.disabled`)},...t!==us&&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===us?{kind:`auto`}:t===``?{kind:`disabled`}:{kind:`model`,model:t})})})}
    </div>
  `}var us;function ds(){return(ds=e((()=>{A(),kr(),Vr(),z(),a(),q(),Wt(),K(),us=`__openclaw_observer_auto__`})))()}function fs(e){return mn(e,{style:`iec`,maxUnit:`tera`,separator:` `,fractionDigits:(e,t)=>t===`byte`?0:1})}var X;function ps(){return(ps=e((()=>{En(),sr(),A(),M(),Mt(),Me(),vt(),D(),z(),a(),q(),S(),h(),Zr(),m(),ai(),n(),Ni(),K(),X=class extends i{constructor(...e){super(...e),this.mutationDisabled=!1,this.editor=k,this.advancedExpanded=!1,this.ageDraft=null,this.runBusy=!1,this.runError=null,this.runOutcome=null,this.runOperation=null,this.followingRun=!1,this.gateway=new Kr(this,{getGateway:()=>this.context?.gateway,invalidateRequests:()=>this.retireRequests(),onSnapshot:({snapshot:{hello:e}})=>{(e!==this.connectionHello||e?.auth!==this.connectionAuth)&&(this.gateway.invalidate(),this.retireRequests()),this.connectionHello=e,this.connectionAuth=e?.auth}}),this.subscriptions=new le(this).watch(()=>this.context?.runtimeConfig,(e,t)=>(this.gateway.invalidate(),this.retireRequests(),e.subscribe(t))),this.statusTask=new ur(this,{args:()=>[this.client,this.gateway.epoch,this.context?.gateway.snapshot.hello,this.context?.gateway.snapshot.hello?.auth,this.context?.runtimeConfig.state.configSnapshot?.appliedConfigHash],task:async([e,,t,n,r],{signal:i})=>{if(!e)return or;let a=this.gateway.capture(),o=this.context.gateway,s=await e.request(`sessions.storage.status`,{},{signal:i}),c=()=>this.client===e&&a!==null&&this.gateway.isCurrent(a)&&this.context.gateway===o&&o.snapshot.hello===t&&t?.auth===n&&this.context.runtimeConfig.state.configSnapshot?.appliedConfigHash===r;return c()?{status:s,isCurrent:c}:or},onComplete:e=>{e.isCurrent()&&this.observeMaintenance(e.status)},onError:()=>{this.maintenancePoll.stop(),this.runOutcome=null}}),this.maintenancePoll=new Wr(this,2e3,()=>{this.client?this.statusTask.status!==L.PENDING&&this.statusTask.run():this.maintenancePoll.stop()},!1)}retireRequests(){this.statusTask.abort(),this.maintenancePoll.stop(),this.followingRun=!1,this.ageDraft=null,this.runOperation=null,this.runBusy=!1,this.runError=null,this.runOutcome=null}get client(){let e=this.context?.gateway.snapshot;return this.isConnected&&e?.phase===`connected`&&qe(e.hello?.auth??null)?e.client:null}observeMaintenance(e){if(e.maintenance.running){this.followingRun=!0,this.maintenancePoll.start();return}this.maintenancePoll.stop(),this.followingRun&&=(this.runOutcome=e.maintenance.lastError?null:[b(`configView.sessionStorage.runCompleted`,{count:String(e.maintenance.archivedTranscripts)}),e.maintenance.externalizedTranscripts>0?b(`configView.sessionStorage.externalized`,{count:String(e.maintenance.externalizedTranscripts)}):``].filter(Boolean).join(` `),this.runError=null,!1)}disconnectedCallback(){this.retireRequests(),this.subscriptions.clear(),super.disconnectedCallback()}get disabled(){let e=this.context.runtimeConfig;return this.mutationDisabled||this.runBusy||!this.client||!e.canSet||!e.state.connected||e.state.configLoading||e.state.configSaving||e.state.configApplying||e.state.configFormMode===`raw`&&e.state.configFormDirty}get coldStorage(){let e=this.context.runtimeConfig.state,t=P(P(e.configForm??e.configSnapshot?.config)?.session),n=P(P(t?.maintenance)?.coldStorage);return{enabled:n?.enabled===!0,afterDays:typeof n?.afterDays==`number`?n.afterDays:30}}get canRun(){let e=this.context.runtimeConfig.state,t=P(P(e.configSnapshot?.config)?.session),n=P(P(t?.maintenance)?.coldStorage),r=this.statusTask.value;return!this.disabled&&this.ageDraft===null&&!e.configFormDirty&&!e.configNeedsApply&&typeof e.configSnapshot?.appliedConfigHash==`string`&&n?.enabled===!0&&this.statusTask.status===L.COMPLETE&&r?.isCurrent()===!0&&!r.status.maintenance.running}async runNow(){let e=this.client,t=this.gateway.capture();if(!this.canRun||!e||!t)return;let n={},r=this.context.gateway,i=r.snapshot.hello;this.runOperation=n,this.runBusy=!0,this.runError=null,this.runOutcome=null;let a=()=>this.runOperation===n&&this.client===e&&this.gateway.isCurrent(t)&&this.context.gateway===r&&r.snapshot.hello===i;try{let t=await e.request(`sessions.storage.run`,{});if(!a())return;this.followingRun=!0,this.runOutcome=t.maintenance.running?b(`configView.sessionStorage.runStarted`):null,this.observeMaintenance(t),await this.statusTask.run()}catch(e){a()&&(this.runError=v(e))}finally{a()&&(this.runBusy=!1,this.runOperation=null)}}setAge(e){let t=e.currentTarget;this.ageDraft!==null&&!this.disabled&&t.reportValidity()&&(this.context.runtimeConfig.patchForm([`session`,`maintenance`,`coldStorage`,`afterDays`],t.valueAsNumber),this.ageDraft=null)}renderInventory(e){let t=e.agents.reduce((e,t)=>({transcripts:e.transcripts+t.hotTranscripts+t.coldTranscripts,cold:e.cold+t.coldTranscripts,database:e.database+t.databaseBytes,wal:e.wal+t.walBytes,archives:e.archives+t.archiveBytes,embedded:e.embedded+t.embeddedArchiveBytes}),{transcripts:0,cold:0,database:0,wal:0,archives:0,embedded:0}),n=e.maintenance.externalizedTranscripts>0?b(`configView.sessionStorage.externalized`,{count:String(e.maintenance.externalizedTranscripts)}):``;return O`
      ${U({title:b(`configView.sessionStorage.transcripts`),description:b(`configView.sessionStorage.transcriptCounts`,{hot:String(t.transcripts-t.cold),cold:String(t.cold)}),control:W(String(t.transcripts))})}
      ${U({title:b(`configView.sessionStorage.database`),description:b(`configView.sessionStorage.walSize`,{size:fs(t.wal)}),control:W(fs(t.database))})}
      ${U({title:b(`configView.sessionStorage.archives`),control:W(fs(t.archives))})}
      ${U({title:b(`configView.sessionStorage.embeddedArchives`),description:b(`configView.sessionStorage.embeddedArchivesHint`),control:W(fs(t.embedded))})}
      ${e.agents.length>1?O`<details class="settings-row settings-row--stacked">
              <summary>${b(`configView.sessionStorage.byAgent`)}</summary>
              ${e.agents.map(e=>U({title:e.agentId,description:b(`configView.sessionStorage.agentCounts`,{hot:String(e.hotTranscripts),cold:String(e.coldTranscripts),database:fs(e.databaseBytes),wal:fs(e.walBytes),archives:fs(e.archiveBytes),embedded:fs(e.embeddedArchiveBytes)})}))}
            </details>`:k}
      ${U({title:b(`configView.sessionStorage.worker`),description:e.maintenance.running?b(`configView.sessionStorage.runningProgress`,{archived:String(e.maintenance.archivedTranscripts),externalized:String(e.maintenance.externalizedTranscripts)}):e.maintenance.lastCompletedAt?[b(`configView.sessionStorage.completed`,{time:l(e.maintenance.lastCompletedAt),count:String(e.maintenance.archivedTranscripts)}),n].filter(Boolean).join(` `):b(`configView.sessionStorage.notRun`),control:V({kind:e.maintenance.lastError?`danger`:e.maintenance.running?`accent`:`muted`,label:b(e.maintenance.running?`configView.sessionStorage.running`:e.maintenance.lastError?`configView.sessionStorage.failed`:`configView.sessionStorage.idle`)})})}
      ${e.maintenance.lastError?R(O`<span role="alert">${e.maintenance.lastError}</span>`):k}
    `}render(){let e=this.statusTask.value,t=this.statusTask.status!==L.ERROR&&e?.isCurrent()?e.status:null,n=this.coldStorage;return O`
      ${_r(O`
        <div class="settings-stack" id=${Mi}>
          ${B({title:b(`configView.sessionStorage.title`),description:b(`configView.sessionStorage.description`),actions:O`<button
                class="btn"
                ?disabled=${!this.client||this.statusTask.status===L.PENDING}
                @click=${()=>void this.statusTask.run()}
              >
                ${b(`common.refresh`)}
              </button>`},t?this.renderInventory(t):R(this.statusTask.status===L.ERROR?O`<span role="alert"
                        >${v(this.statusTask.error)}
                        ${b(`configView.sessionStorage.refreshAfterError`)}</span
                      >`:b(this.client?`common.loading`:this.context.gateway.snapshot.phase===`connected`?`configView.sessionStorage.adminRequired`:`configView.sessionStorage.disconnected`)))}
          ${B({title:b(`configView.sessionStorage.automatic`)},O`
              ${H({title:b(`configView.sessionStorage.enabled`),description:b(`configView.sessionStorage.enabledHint`),checked:n.enabled,disabled:this.disabled,onChange:e=>{this.disabled||this.context.runtimeConfig.patchForm([`session`,`maintenance`,`coldStorage`,`enabled`],e)}})}
              ${U({title:b(`configView.sessionStorage.afterDays`),description:b(`configView.sessionStorage.afterDaysHint`),control:O`<input
                  type="number"
                  class="settings-input"
                  aria-label=${b(`configView.sessionStorage.afterDays`)}
                  min="1"
                  max=${2**53-1}
                  step="1"
                  required
                  ?disabled=${this.disabled}
                  .value=${Dt(this.ageDraft??String(n.afterDays))}
                  @input=${e=>{this.ageDraft=e.currentTarget.value}}
                  @change=${e=>this.setAge(e)}
                  @blur=${()=>{this.ageDraft===String(n.afterDays)&&(this.ageDraft=null)}}
                />`})}
              ${U({title:b(`configView.sessionStorage.runNow`),description:b(`configView.sessionStorage.runHint`),control:O`<button
                  class="btn"
                  ?disabled=${!this.canRun}
                  @click=${()=>void this.runNow()}
                >
                  ${b(this.runBusy||t?.maintenance.running?`configView.sessionStorage.running`:`configView.sessionStorage.runNow`)}
                </button>`})}
              ${this.runError&&this.runError!==t?.maintenance.lastError?R(O`<span role="alert">${this.runError}</span>`):this.runOutcome?R(O`<span role="status">${this.runOutcome}</span>`):k}
            `)}
          <p class="settings-page__intro">${b(`configView.sessionStorage.backupHint`)}</p>
          ${Cr(`https://docs.openclaw.ai/gateway/config-agents/sessions#cold-storage`)}
        </div>
      `)}
      <details
        class="settings-page"
        ?open=${this.advancedExpanded}
        ${w({settingsPage:!0})}
      >
        <summary class="settings-section__heading">
          ${b(`configView.sessionStorage.advanced`)}
        </summary>
        ${this.editor}
      </details>
    `}},F([wn({context:gt,subscribe:!0})],X.prototype,`context`,void 0),F([N({type:Boolean})],X.prototype,`mutationDisabled`,void 0),F([N({attribute:!1})],X.prototype,`editor`,void 0),F([N({type:Boolean})],X.prototype,`advancedExpanded`,void 0),F([j()],X.prototype,`ageDraft`,void 0),F([j()],X.prototype,`runBusy`,void 0),F([j()],X.prototype,`runError`,void 0),F([j()],X.prototype,`runOutcome`,void 0),customElements.get(`openclaw-session-storage-settings`)||customElements.define(`openclaw-session-storage-settings`,X)})))()}function ms(e){let t=Un(Un(e.talk)?.realtime),n=Un(t?.providers)??{},r={};for(let[e,t]of Object.entries(n)){let n=Un(t);n&&(r[e]={model:bn(n.model),speakerVoice:bn(n.speakerVoice)??bn(n.voice)})}return{provider:bn(t?.provider),model:bn(t?.model),speakerVoice:bn(t?.speakerVoice)??bn(t?.speakerVoiceId),transport:bn(t?.transport),consultRouting:bn(t?.consultRouting)?.toLowerCase()??null,providerEntries:r}}function hs(e){let t=e?.trim().toLowerCase();return t===`gpt-live`||t?.startsWith(`gpt-live-`)===!0}function gs(e,t){return e!==void 0&&e.length>0&&!e.includes(t)}function _s(){return(_s=e((()=>{})))()}function vs(e){let t=e.snapshot?.voice.locale;if(!t)return null;let n=Ss.get(e),r=n?.primary??t.primary;return{primary:r,additional:[...new Set(n?.additional??t.additional)].filter(e=>e!==r)}}function ys(e,t){let n=Ss.get(e);if(n)Object.assign(n,t);else{let n={...t};Ss.set(e,n);let r=e.subscribe(t=>{let i=t.voice.locale;if(!i){Ss.delete(e),r();return}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&&(Ss.delete(e),r())})}t.additional&&e.set(`voice.locale.additional`,t.additional),t.primary!==void 0&&e.set(`voice.locale.primary`,t.primary)}function bs(e,t,n){return B({title:b(`configPage.deviceTalk.triggerWords`)},U({title:b(`configPage.deviceTalk.triggerWords`),description:b(`configPage.deviceTalk.triggerWordsHint`),stacked:!0,control:O`
        ${e.kind===`ready`?O`<textarea
                class="settings-input"
                aria-label=${b(`configPage.deviceTalk.triggerWords`)}
                rows="4"
                .value=${e.text}
                @input=${e=>{t(e.currentTarget.value)}}
              ></textarea>`:k}
        ${e.kind===`error`||e.kind===`ready`&&e.error?O`<div class="callout danger" role="alert">
                ${e.error}
                <button class="btn btn--sm" type="button" @click=${n}>
                  ${b(`common.retry`)}
                </button>
              </div>`:e.kind===`unavailable`?O`<span class="muted"
                  >${b(`configPage.deviceTalk.triggerWordsUnavailable`)}</span
                >`:O`<span class="muted" role="status"
                  >${e.kind===`loading`?b(`common.loading`):e.kind===`ready`&&e.phase!==`saved`?b(`common.saving`):b(`configPage.deviceTalk.saved`)}</span
                >`}
      `}))}function xs(e){if(!e)return k;let t=e.snapshot?.voice;if(!t)return B({title:b(C(e.snapshot))},U({title:b(`common.loading`)}));let n=t.microphone,r=[{value:``,label:b(`configPage.deviceTalk.systemDefault`)},...n?.devices.map(({id:e,name:t})=>({value:e,label:t}))??[]];n?.selectedId&&!n.devices.some(({id:e})=>e===n.selectedId)&&r.push({value:n.selectedId,label:b(`configPage.deviceTalk.disconnectedMicrophone`,{id:n.selectedId})});let i=(t.locale?.available??[]).map(({id:e,name:t})=>({value:e,label:t})),a=vs(e);return B({title:b(C(e.snapshot))},[...[`wakeEnabled`,`wakeTriggersTalkMode`,`pushToTalkEnabled`,`talkShiftToStopEnabled`,`talkPhaseSoundsEnabled`,`realtimeRelayEnabled`,`triggerChime`,`sendChime`,`talkEnabled`,`talkButtonEnabled`,`talkBackgroundEnabled`,`speakerphoneEnabled`].map(n=>{let r=t[n];return r===void 0?k:H({title:b(`configPage.deviceTalk.${n}`),checked:r,disabled:n===`wakeEnabled`&&!t.supported&&!t.wakeEnabled,description:n===`wakeEnabled`&&!t.supported?b(e.snapshot?.device.platform===`macos`?`configPage.deviceTalk.unsupported`:`configPage.deviceTalk.unsupportedDevice`):n===`realtimeRelayEnabled`?b(`configPage.deviceTalk.realtimeRelayHint`):void 0,onChange:t=>e.set(`voice.${n}`,t)})}),n?J({title:b(`configPage.deviceTalk.microphone`),value:n.selectedId??``,options:r,onChange:t=>e.set(`voice.microphone`,t||null)}):k,a?J({title:b(`configPage.deviceTalk.primaryLanguage`),value:a.primary,options:i,onChange:t=>{let n=vs(e);n&&ys(e,{primary:t,...n.additional.includes(t)?{additional:n.additional.filter(e=>e!==t)}:{}})}}):k,a?U({title:b(`configPage.deviceTalk.additionalLanguages`),stacked:!0,control:O`
            ${a.additional.map(t=>{let n=i.find(e=>e.value===t)?.label??t;return O`<div>
                ${n}
                <button
                  class="btn btn--sm"
                  type="button"
                  aria-label=${b(`configPage.deviceTalk.removeLanguage`,{name:n})}
                  @click=${()=>{let n=vs(e);n&&ys(e,{additional:n.additional.filter(e=>e!==t)})}}
                >
                  ${b(`common.remove`)}
                </button>
              </div>`})}
            <select
              class="settings-select"
              aria-label=${b(`configPage.deviceTalk.addLanguage`)}
              @change=${t=>{let n=t.currentTarget,r=vs(e);n.value&&r&&n.value!==r.primary&&!r.additional.includes(n.value)&&(ys(e,{additional:[...r.additional,n.value]}),n.value=``)}}
            >
              <option value="">${b(`configPage.deviceTalk.addLanguage`)}</option>
              ${i.filter(({value:e})=>e!==a.primary&&!a.additional.includes(e)).map(({value:e,label:t})=>O`<option value=${e}>${t}</option>`)}
            </select>
          `}):k,n?U({title:b(`configPage.deviceTalk.microphoneTest`),control:O`<button
            class="btn btn--sm"
            type="button"
            @click=${()=>e.openPanel(`microphone-test`)}
          >
            ${b(`configPage.deviceTalk.microphoneTest`)}
          </button>`}):k])}var Ss;function Cs(){return(Cs=e((()=>{A(),ht(),z(),a(),q(),va(),K(),Ss=new WeakMap})))()}function ws(e,t){if(t)return e.find(e=>e.id===t||e.aliases?.includes(t))}function Ts(e,t){if(e.kind===`ready`)return ws(e.providers,t.provider||e.activeProvider)}function Es(e,t){return kn([e.provider,t?.id,...t?.aliases??[]].flatMap(t=>t&&t in e.providerEntries?[t]:[]))}function Ds(e,t){let n=e.model,r=e.speakerVoice;for(let i of Es(e,t)){let t=e.providerEntries[i];n??=t?.model??null,r??=t?.speakerVoice??null}return{model:n,speakerVoice:r}}function Os(e){let t=e.catalog;return t.kind===`loading`?U({title:b(`talkPage.status.title`),control:V({kind:`muted`,label:b(`common.loading`)})}):t.kind===`unavailable`?U({title:b(`talkPage.status.title`),description:b(`talkPage.status.unavailableHint`),control:V({kind:`muted`,label:b(`talkPage.status.unavailable`)})}):U({title:b(`talkPage.status.title`),description:t.activeProvider?b(`talkPage.status.activeProvider`,{provider:t.activeProvider}):b(`talkPage.status.noProvider`),control:t.ready?V({kind:`ok`,label:b(`talkPage.status.ready`)}):V({kind:`warn`,label:b(`talkPage.status.notReady`)})})}function ks(e,t){return U({title:b(`talkPage.${e}.title`),description:b(`talkPage.${e}.description`),control:W(t,{mono:!0})})}function As(e){if(e.catalog.kind!==`ready`||e.catalog.providers.length===0)return ks(`provider`,e.selection.provider??b(`talkPage.provider.auto`));let t=ws(e.catalog.providers,e.selection.provider),n=e.selection.provider&&!t?e.selection.provider:null;return U({title:b(`talkPage.provider.title`),description:b(`talkPage.provider.description`),stacked:!0,control:Or({value:t?.id??n??Fs,options:[...e.catalog.providers.map(e=>({value:e.id,label:e.label})),...n?[{value:n,label:n}]:[],{value:Fs,label:b(`talkPage.provider.auto`)}],disabled:e.configBusy,ariaLabel:b(`talkPage.provider.title`),onChange:t=>e.onProviderChange(t||null)})})}function js(e){let t=Ts(e.catalog,e.selection),{model:n}=Ds(e.selection,t);if(!t)return ks(`model`,n??b(`talkPage.model.default`));let r=t.models?.length?t.models:t.defaultModel?[t.defaultModel]:[],i=[{value:Fs,label:t.defaultModel?b(`talkPage.model.defaultNamed`,{model:t.defaultModel}):b(`talkPage.model.default`)},...r.map(e=>({value:e,label:e})),...n&&!r.includes(n)?[{value:n,label:n}]:[]];return U({title:b(`talkPage.model.title`),description:b(`talkPage.model.description`),control:Ir({label:b(`talkPage.model.title`),value:n??Fs,options:i.map(({value:e,label:n})=>({value:e,label:n,provider:t.id})),disabled:e.configBusy,onChange:t=>e.onModelChange(t||null)})})}function Ms(e){let t=Ts(e.catalog,e.selection),{model:n,speakerVoice:r}=Ds(e.selection,t),i=e.modelDefaultPending?t?.defaultModel:n,a=t?.voicesByModel?.[i??``],o=e.modelDefaultPending!==!0&&(n===null||hs(n)&&a===void 0),s=o?t?.activeVoices??t?.voices??[]:a??t?.voices??[],c=o&&t?.activeVoiceSelectionPolicy===`allowlist-default`&&r!==null&&!s.includes(r);if(s.length===0)return ks(`voice`,r??b(`talkPage.voice.default`));let l=[{value:Fs,label:b(`talkPage.voice.default`)},...s.map(e=>({value:e,label:e})),...r&&!s.includes(r)?[{value:r,label:c?`${r} (${b(`talkPage.voice.unsupported`)})`:r}]:[]];return J({title:b(`talkPage.voice.title`),description:b(c?`talkPage.voice.unsupportedDefault`:`talkPage.voice.description`),value:r??Fs,options:l,disabled:e.configBusy,onChange:t=>e.onVoiceChange(t||null)})}function Ns(e){let t=Ts(e.catalog,e.selection),{model:n}=Ds(e.selection,t);return t?.id!==`openai`||!hs(n)?k:U({title:b(`talkPage.gptLive.title`),description:b(`talkPage.gptLive.hint`),control:t.configured?V({kind:`ok`,label:b(`talkPage.gptLive.ready`)}):V({kind:`warn`,label:b(`talkPage.status.notReady`)})})}function Ps(e){return O`
    <section class="talk-page">
      <div class="settings-page" ${w({settingsPage:!0})}>
        ${xs(e.nativeDeviceSettings)}
        ${e.voiceWake?bs(e.voiceWake.state,e.voiceWake.onInput,e.voiceWake.onRetry):k}
        ${B({title:b(`talkPage.voiceSection.title`),description:b(`talkPage.voiceSection.description`)},O`
            ${Os(e)} ${As(e)} ${js(e)}
            ${Ms(e)} ${Ns(e)}
          `)}
      </div>
      ${e.editor}
    </section>
  `}var Fs;function Is(){return(Is=e((()=>{Bn(),A(),D(),kr(),z(),a(),va(),Cs(),_s(),Fs=``})))()}function Ls(e){return e?.configRevisionHash??e?.hash??null}function Rs(e,t){return hs(e)&&t===`provider-websocket`}function zs(e){let t=Vs.get(e);return t||(t=new Hs(e),Vs.set(e,t)),t}var Bs,Vs,Hs,Us;function Ws(){return(Ws=e((()=>{En(),A(),M(),Me(),a(),zt(),m(),n(),_s(),Is(),Bs=new Set([`webrtc`,`provider-websocket`]),Vs=new WeakMap,Hs=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=Rt(e,`voicewake.get`)===!0&&Rt(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:b(`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:b(`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:b(`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:b(`configPage.deviceTalk.triggerWordsError`,{error:String(t)})})}}this.voiceWakeWrite===n&&(this.voiceWakeWrite=null)}},Us=class extends i{constructor(...e){super(...e),this.configObject={},this.mutationDisabled=!1,this.buildEditor=()=>O``,this.catalog={kind:`unavailable`},this.modelDefaultResetIntent=null,this.connection=null,this.catalogRequestId=0,this.subscriptions=new le(this).watchStore(()=>this.context?.gateway?zs(this.context.gateway):void 0).watchStore(()=>this.context?.nativeDeviceSettings).watchStore(()=>this.context?.gateway,e=>this.syncCatalog(e.connection.gatewayUrl,e.snapshot.client,e.snapshot.phase===`connected`,Rt(e.snapshot,`voicewake.get`)===!0&&Rt(e.snapshot,`voicewake.set`)===!0)).watchStore(()=>this.context?.runtimeConfig,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),zs(this.context.gateway).flush(),this.subscriptions.clear(),this.connection=null,this.catalog={kind:`unavailable`},super.disconnectedCallback()}syncCatalog(e,t,n,r){if(this.modelDefaultResetIntent&&this.modelDefaultResetIntent.gatewayUrl!==e&&(this.modelDefaultResetIntent=null),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})&&this.acknowledgeModelDefaultReset(t)}catch{this.applyCatalog(t,n,{kind:`unavailable`})}}applyCatalog(e,t,n){return!this.isConnected||this.connection!==e||this.catalogRequestId!==t?!1:(this.catalog=n,!0)}acknowledgeModelDefaultReset(e){let t=this.modelDefaultResetIntent,n=this.lastCatalogConfigRevision;n!=null&&t?.gatewayUrl===e.gatewayUrl&&t.configRevision!==n&&(this.modelDefaultResetIntent=null)}refreshCatalogOnConfigChange(e){let t=Ls(e.configSnapshot);if(this.lastCatalogConfigRevision===void 0){this.lastCatalogConfigRevision=t;return}if(t===null||t===this.lastCatalogConfigRevision)return;this.lastCatalogConfigRevision=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){this.modelDefaultResetIntent=null,t.patchForm([`talk`,`realtime`,`model`],e);let n=this.liveSelection(),r=n.transport,i=Ts(this.catalog,n),a=r!==null&&(Rs(e,r)||gs(i?.transports,r));hs(e)&&a?t.removeFormValue([`talk`,`realtime`,`transport`]):i?.id===`openai`&&hs(e)&&r===`gateway-relay`&&n.consultRouting===`force-agent-consult`&&t.removeFormValue([`talk`,`realtime`,`consultRouting`]);return}this.modelDefaultResetIntent={gatewayUrl:this.context.gateway.connection.gatewayUrl,configRevision:Ls(t.state.configSnapshot)},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 Es(e,Ts(this.catalog,e))}liveSelection(){let e=this.context.runtimeConfig.state.configForm;return ms(e??this.configObject)}changeProvider(e){if(this.mutationDisabled)return;this.modelDefaultResetIntent=null;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=Ds({...n,provider:e,model:null,speakerVoice:null},i).model??i?.defaultModel,o=r!==null&&(Rs(a??null,r)||gs(i?.transports,r));o&&t.removeFormValue([`talk`,`realtime`,`transport`]),t.patchForm([`talk`,`realtime`,`provider`],e);let s=i?.transports!==void 0&&i.transports.length>0&&!i.transports.some(e=>Bs.has(e)),c=o?null:r;s&&r!==`gateway-relay`&&(t.patchForm([`talk`,`realtime`,`transport`],`gateway-relay`),c=`gateway-relay`),i?.id===`openai`&&hs(a??null)&&c===`gateway-relay`&&n.consultRouting===`force-agent-consult`&&t.removeFormValue([`talk`,`realtime`,`consultRouting`])}render(){let e=this.context.runtimeConfig.state,t=zs(this.context.gateway);return Ps({nativeDeviceSettings:this.context.nativeDeviceSettings,voiceWake:{state:t.state,onInput:e=>t.edit(e),onRetry:()=>t.retry()},selection:ms(this.configObject),catalog:this.catalog,modelDefaultPending:this.modelDefaultResetIntent!==null,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()})}},F([wn({context:gt,subscribe:!0})],Us.prototype,`context`,void 0),F([N({attribute:!1})],Us.prototype,`configObject`,void 0),F([N({type:Boolean})],Us.prototype,`mutationDisabled`,void 0),F([N({attribute:!1})],Us.prototype,`buildEditor`,void 0),F([j()],Us.prototype,`catalog`,void 0),F([j()],Us.prototype,`modelDefaultResetIntent`,void 0),customElements.get(`openclaw-talk-settings`)||customElements.define(`openclaw-talk-settings`,Us)})))()}function Gs(e){let t=e?.snapshot,n=t?.updates;return!e||!t||!n?k:B({title:b(C(t))},[U({title:b(`updates.device.version`),control:W(b(`updates.device.versionBuild`,{version:t.device.appVersion,build:t.device.appBuild}))}),n.available?O`${H({title:b(`updates.device.automatic`),checked:n.automatic,onChange:t=>e.set(`updates.automatic`,t)})}${U({title:b(`updates.device.check`),control:O`<button
            class="btn btn--sm"
            type="button"
            @click=${()=>e.checkForUpdates()}
          >
            ${b(`updates.device.check`)}
          </button>`})}`:U({title:b(`updates.device.unavailable`),description:n.unavailableReason})])}function Ks(e){let t=e.update.updateRun;if(!t&&!e.update.updateStatusBanner)return k;let n=t?!Ln(t)&&qn(t):!e.update.recordedUpdateAttempt||jn(e.update.recordedUpdateAttempt)!==`noop`,r=e.update.updateStatusBanner?.source===`read`,i=e.canUpdate&&!e.updateBusy&&!e.update.updateStatusRefreshing;return B({title:b(`updates.page.latestAttempt`)},[t?O`<div class="settings-row settings-row--stacked">
          <openclaw-update-run-view
            .run=${t}
            .connected=${e.connected}
          ></openclaw-update-run-view>
        </div>`:e.update.updateStatusBanner&&!e.updateBusy&&(e.update.updateStatusRefreshing||e.update.updateStatusCheckBanner)?U({title:b(`updates.page.failedStep`),description:e.update.updateStatusBanner.text}):k,...!n&&!r?[]:[U({title:b(`updates.page.recoveryActions`),control:O`<div class="updates-status-control">
              <button
                class="btn btn--sm"
                type="button"
                title=${e.canCheckStatus?``:b(`updates.adminRequired`)}
                ?disabled=${!e.canCheckStatus||e.updateBusy||e.update.updateStatusRefreshing}
                @click=${()=>void e.onCheckStatus()}
              >
                ${b(`updates.page.checkStatus`)}
              </button>
              ${e.update.diagnosableUpdateFailureId?O`<button
                      class="btn btn--sm"
                      type="button"
                      title=${e.canDiagnose?``:b(`updates.adminRequired`)}
                      ?disabled=${!e.canDiagnose||e.updateBusy||e.update.updateStatusRefreshing||e.update.updateFailureReportBusy}
                      @click=${()=>e.onDiagnoseFailure(e.update.diagnosableUpdateFailureId)}
                    >
                      ${b(`updates.page.diagnoseFailure`)}
                    </button>`:k}
              ${n?O`<button
                      class="btn btn--sm primary"
                      type="button"
                      title=${i?``:b(`updates.adminRequired`)}
                      ?disabled=${!i}
                      @click=${e.onUpdateNow}
                    >
                      ${b(`updates.page.retryUpdate`)}
                    </button>`:k}
              ${n&&e.update.reportableUpdateFailureId?O`<button
                      class="btn btn--sm"
                      type="button"
                      title=${e.canReport?``:b(`updates.page.reportOwnerRequired`)}
                      ?disabled=${!e.canReport||e.updateBusy||e.update.updateStatusRefreshing||e.update.updateFailureReportBusy}
                      @click=${()=>void e.onReportFailure(e.update.reportableUpdateFailureId)}
                    >
                      ${e.update.updateFailureReportBusy?b(`updates.page.reportSubmitting`):b(`updates.page.reportFailure`)}
                    </button>`:k}
            </div>`}),n&&t?.target.installationMethod!==`ocm`?U({title:b(`updates.page.cliFallback`),description:b(`updates.triage.hostHint`),stacked:!0,control:O`<details class="updates-attempt-details">
                  <summary>${b(`updates.page.showCliFallback`)}</summary>
                  <pre><code>openclaw triage</code></pre>
                </details>`}):k],e.update.updateFailureReportNotice?qs(e.update.updateFailureReportNotice):k])}function qs(e){let t=e.result,n=t.status===`created`?b(`updates.page.reportCreated`):t.status===`fallback`?b(`updates.page.reportFallback`):t.status===`pending`?b(`updates.page.reportPending`):t.status===`retryable`?b(`updates.page.reportRetryable`):t.status===`duplicate`?b(`updates.page.reportDuplicate`):b(`updates.page.reportError`),r=`url`in t&&t.url?t.url:null,i=`fallbackUrl`in t&&t.fallbackUrl?t.fallbackUrl:null;return U({title:b(`updates.page.reportResult`),stacked:!0,control:O`<div class="updates-attempt-details" role="status">
      <div>${n}</div>
      ${r?O`<div>
              <a href=${r} target="_blank" rel="noreferrer">${b(`updates.page.openIssue`)}</a>
            </div>`:k}
      ${i?O`<div>
              <a href=${i} target="_blank" rel="noreferrer"
                >${b(`updates.page.openPrefilledIssue`)}</a
              >
            </div>`:k}
      ${`message`in t&&t.message?O`<div>${t.message}</div>`:k}
    </div>`})}function Js(e,t){let n=P(e.update),r=P(n?.auto),i=ec.find(e=>e===n?.channel)??ec.find(e=>e===t?.channel)??`stable`;return{channel:i,autoEnabled:typeof r?.enabled==`boolean`?r.enabled:t?.autoEnabled??!1,extendedStable:i===`extended-stable`}}function Ys(e,t=Date.now()){let n=r(Math.max(0,t-e));return W(O`<time datetime=${new Date(e).toISOString()} title=${n}
      >${l(e,{dateStyle:`medium`,timeStyle:`short`})}
      <span class="muted">· ${n}</span></time
    >`)}function Xs(e){let t=e.update.updateSchedule?.install?.kind,n=e.update.updateSchedule?.install?.git,r=on(e.controlUiBuiltAt)??null,i=n?.commitAtMs??on(e.controlUiCommitAt)??null;return B({title:b(`updates.page.buildTitle`)},[U({title:b(`updates.page.gatewayVersion`),control:W(e.gatewayVersion?O`<code dir="ltr" title=${e.gatewayVersion}>${e.gatewayVersion}</code>`:b(`common.na`),{mono:!0})}),U({title:b(`updates.page.controlUiCommit`),control:W(e.controlUiCommit?O`<code dir="ltr" title=${e.controlUiCommit}
              >${e.controlUiCommit.slice(0,12)}</code
            >`:b(`common.na`),{mono:!0})}),r===null?k:U({title:b(`updates.page.builtAt`),control:Ys(r,e.nowMs)}),t===`git`?U({title:b(`updates.page.installedAt`),control:n?.installedAtMs===void 0?W(b(`updates.page.installedAtUnknown`)):Ys(n.installedAtMs,e.nowMs)}):k,i===null?k:U({title:b(`updates.page.lastCommitAt`),control:Ys(i,e.nowMs)}),t?U({title:b(`updates.page.installKind`),control:W(b(`updates.installKind.${t}`))}):k])}function Zs(e){let t=e.update.updateRun,n=t?.status===`running`,r=e.update.updateSchedule?.campaign,i=ft(e.update.updateSchedule,e.nowMs),a=He(e.update.updateSchedule,e.update.updateAvailable),o=`muted`,s;if(n)o=`accent`,s=b(`updates.page.activePhase`,{phase:b(`updates.run.phase.${t.phase}`)});else if(e.update.updateStatusRefreshing&&!e.updateBusy)s=b(`updates.page.checking`);else if(e.update.updateStatusCheckBanner&&!e.updateBusy)o=`warn`,s=e.update.updateStatusCheckBanner.text;else if(i)o=r?.state===`waiting-for-idle`?`warn`:`accent`,s=i;else if(e.update.updateStatusBanner)o=e.update.updateStatusBanner.tone===`danger`?`danger`:e.update.updateStatusBanner.tone===`warn`?`warn`:`accent`,s=e.update.updateStatusBanner.text;else if(e.update.updateSchedule?.install?.kind===`git`){let t=e.update.updateSchedule.install.git;if(!t)s=b(`updates.page.statusUnavailable`);else if(t.status===`current`)o=`ok`,s=b(`updates.page.upToDate`);else if(t.status===`behind`){o=`accent`;let e=b(t.commitsBehind===1?`updates.target.commitBehind`:`updates.target.commitsBehind`,{count:String(t.commitsBehind)});s=b(`updates.page.available`,{target:e})}else t.status===`ahead`?s=b(t.commitsAhead===1?`updates.page.gitCommitAhead`:`updates.page.gitCommitsAhead`,{count:String(t.commitsAhead)}):t.status===`diverged`?(o=`warn`,s=b(`updates.page.gitDiverged`,{ahead:String(t.commitsAhead),behind:String(t.commitsBehind)})):(o=`warn`,s=t.reason===`fetch-failed`?b(`updates.page.gitFetchFailed`):t.reason===`no-upstream`?b(`updates.page.gitNoUpstream`):b(`updates.page.gitComparisonFailed`))}else a?(o=`accent`,s=b(`updates.page.available`,{target:a})):e.update.updateSchedule?.install?.kind===`package`?(o=`ok`,s=b(`updates.page.upToDate`)):s=b(`updates.page.statusUnavailable`);let c=e.update.updateStatusCheckBanner&&!e.update.updateStatusRefreshing&&!e.updateBusy,l=!n&&(r?.state===`waiting-for-idle`||r?.state===`countdown`);return O`<span
    class=${c?`updates-status-check-failed`:k}
    role=${l?`timer`:k}
    aria-live=${l?`off`:k}
    >${V({kind:o,label:s,dot:!1})}</span
  >`}function Qs(e){let t=e.update.updateAvailable,n=We(e.update.updateSchedule,t),r=n&&n.commitsBehind===t?.commitsBehind&&n.currentSha===t?.currentSha&&n.upstreamSha===t?.upstreamSha?t?.commits??[]:[];return r.length===0?k:U({title:b(`updates.page.commits`),stacked:!0,control:O`
      <div class="updates-commit-list" role="list" aria-label=${b(`updates.page.commits`)}>
        ${r.map(e=>O`
            <div class="updates-commit-list__row" role="listitem">
              <code title=${e.sha}>${e.sha}</code>
              <span>${e.subject}</span>
            </div>
          `)}
      </div>
    `})}function $s(e){let t=e.update.updateRun?.status===`running`?e.update.updateRun:null,n=t?.steps.findLast(e=>e.status===`in_progress`&&e.step!==t.phase&&!e.step.startsWith(`notice:`)),r=t?.target.sha??t?.target.version??t?.target.tag,i=Js(e.configObject,e.update.updateSchedule),a=[{value:`stable`,label:b(`updates.channel.stable`)},{value:`beta`,label:b(`updates.channel.beta`)},{value:`dev`,label:b(`updates.channel.dev`)}];i.extendedStable&&a.push({value:`extended-stable`,label:b(`updates.channel.extendedStable`)});let o=i.channel!==`extended-stable`,s=P(e.configObject.update)?.checkOnStart===!1,c=i.channel===`dev`&&e.update.updateSchedule?.install?.kind===`package`,l=e.update.updateSchedule?.campaign,u=t&&l&&t.origin.campaignId!==l.id,d=l?.holdUntilMs!==void 0&&l.holdUntilMs>(e.nowMs??Date.now()),ee=!!(!t&&l&&l.state!==`applying`&&e.canUpdate&&e.canHoldUpdate&&!d&&e.update.heldUpdateCampaignId!==l.id),te=[U({title:b(`updates.page.channel`),description:b(`updates.page.channelDescription`),stacked:!0,control:Or({value:i.channel,options:a,ariaLabel:b(`updates.page.channel`),disabled:e.configBusy,onChange:e.onChannelChange})}),H({title:b(`updates.page.checkForUpdates`),description:b(`updates.page.checkForUpdatesDescription`),checked:!s,disabled:e.configBusy,onChange:e.onUpdateChecksChange}),H({title:b(`updates.page.automaticUpdates`),description:b(o?c?`updates.page.devPackageAutomaticHint`:s?`updates.page.checksDisabledAutomaticHint`:`updates.page.automaticUpdatesDescription`:`updates.page.extendedStableAutomaticHint`),checked:o&&i.autoEnabled,disabled:e.configBusy||s||!o||c,onChange:e.onAutomaticUpdatesChange})],f=!(!e.update.updateStatusCheckBanner||Xe(e.update.updateAvailable,e.update.updateSchedule,e.updateBusy)||e.update.updateSchedule?.target?.kind===`package`||e.update.updateSchedule?.install?.git?.status===`behind`||e.update.updateSchedule?.install?.git?.status===`diverged`),p=e.update.updateStatusRefreshing&&!e.updateBusy?b(`updates.page.checking`):e.canAdmin?f?b(`updates.page.checkRequired`):``:b(`updates.adminRequired`);return O`
    <div id="config-section-update">
      ${_r([Gs(e.nativeDeviceSettings),e.canAdmin?k:O`<div class="callout warning" role="note">${b(`updates.adminRequired`)}</div>`,Xs(e),Ks(e),B({title:b(`updates.page.policyTitle`)},te),B({title:b(`updates.page.statusTitle`)},[U({title:b(`updates.page.scheduleStatus`),description:t&&e.update.updateStatusBanner?.source===`read`?e.update.updateStatusBanner.text:void 0,control:O`
              <div class="updates-status-control">
                <div>
                  ${Zs(e)}
                  ${!t&&!e.update.updateStatusRefreshing?vr(e.update.updateSchedule,e.update.updateAvailable):k}
                </div>
                ${e.update.updateStatusCheckBanner?O`
                        <button
                          type="button"
                          class="btn btn--sm"
                          title=${e.update.updateStatusRefreshing?b(`updates.page.checking`):e.canCheckStatus?``:b(`updates.adminRequired`)}
                          ?disabled=${!e.canCheckStatus||e.update.updateStatusRefreshing||e.updateBusy}
                          @click=${()=>void e.onCheckStatus()}
                        >
                          ${b(`updates.page.checkForUpdates`)}
                        </button>
                      `:k}
                ${ee?O`
                        <button
                          type="button"
                          class="btn btn--sm"
                          ?disabled=${e.updateBusy||e.update.updateStatusRefreshing}
                          @click=${()=>void e.onHoldUpdate()}
                        >
                          ${b(`updates.holdOneHour`)}
                        </button>
                      `:k}
              </div>
            `}),n?U({title:b(`updates.page.currentStep`),control:W(n.step)}):k,r?U({title:b(`updates.page.runTarget`),control:W(O`<code dir="ltr" title=${r}
                    >${t?.target.sha?r.slice(0,12):r}</code
                  >`)}):k,t?U({title:b(`updates.page.lastProgress`),control:Ys(t.updatedAtMs,e.nowMs)}):k,u?U({title:b(`updates.page.scheduledUpdate`),control:O`<div>
                  <span role="timer" aria-live="off"
                    >${ft(e.update.updateSchedule,e.nowMs)}</span
                  >
                  ${vr(e.update.updateSchedule,e.update.updateAvailable)}
                </div>`}):k,t?k:Qs(e),U({title:b(`updates.page.updateNow`),description:b(`updates.page.updateNowDescription`),control:O`
              <button
                type="button"
                class="btn primary"
                title=${p}
                ?disabled=${e.updateBusy||e.update.updateStatusRefreshing||!e.canUpdate||f}
                @click=${e.onUpdateNow}
              >
                ${T.download}
                ${e.updateBusy?b(`updates.page.updating`):b(`updates.page.updateNow`)}
              </button>
            `})]),O`<p class="settings-page__hint">
          <a href="https://docs.openclaw.ai/install/update-troubleshooting" target="_blank"
            >${b(`updates.page.troubleshoot`)}</a
          >
        </p>`])}
    </div>
  `}var ec;function tc(){return(tc=e((()=>{cn(),A(),Hn(),Pn(),ci(),ht(),it(),ct(),z(),Dr(),a(),q(),h(),K(),ec=[`stable`,`beta`,`dev`,`extended-stable`]})))()}function nc({context:e,configObject:t,configBusy:n,updateBusy:r}){let i=e.runtimeConfig,a=e.gateway.snapshot,o=e.overlays.snapshot,s=qe(a.hello?.auth??null);return $s({update:o,nativeDeviceSettings:e.nativeDeviceSettings,configObject:t,gatewayVersion:e.config.current.serverVersion??a.hello?.server?.version??null,controlUiCommit:st.commit,controlUiCommitAt:st.commitAt,controlUiBuiltAt:st.builtAt,connected:a.phase===`connected`,configBusy:n,canAdmin:s,canUpdate:Lt(a,`update.run`,`operator.admin`),canCheckStatus:Lt(a,`update.status`,`operator.admin`),canHoldUpdate:Lt(a,`update.hold`,`operator.admin`),canReport:Je(a),canDiagnose:Lt(a,`openclaw.chat`,`operator.admin`),updateBusy:r,onChannelChange:e=>i.patchForm([`update`,`channel`],e),onUpdateChecksChange:e=>i.patchForm([`update`,`checkOnStart`],e),onAutomaticUpdatesChange:e=>i.patchForm([`update`,`auto`,`enabled`],e),onUpdateNow:()=>void et({startGatewayUpdate:()=>void e.overlays.runUpdate(),watchUpdateProgress:ut(e),onCheckStatus:()=>e.overlays.refreshUpdateStatus(),onAcknowledge:()=>e.overlays.acknowledgeUpdateRun(),updateAvailable:o.updateAvailable,updateSchedule:o.updateSchedule,viaNativeApp:!1}),onHoldUpdate:()=>e.overlays.holdUpdate(),onCheckStatus:()=>e.overlays.refreshUpdateStatus(),onReportFailure:t=>e.overlays.reportUpdateFailure(t),onDiagnoseFailure:t=>e.overlays.diagnoseUpdateFailure(t)})}function rc(){return(rc=e((()=>{vt(),Ve(),Le(),Pe(),zt(),tc()})))()}function ic(e){return`${String(Math.floor(e/60)).padStart(2,`0`)}:${String(e%60).padStart(2,`0`)}`}function ac(e,t){let n=/^(\d{2}):(\d{2})$/u.exec(e);return n?Number(n[1])*60+Number(n[2]):t}function oc(e){return e.currentTarget}function sc(e){return e===`identified`||e===`detailed`?e:`private`}function cc(){return[{value:`private`,label:b(`configView.notifications.private`)},{value:`identified`,label:b(`configView.notifications.namesOnly`)},{value:`detailed`,label:b(`configView.notifications.detailed`)}]}function lc(e){return[{value:`inherit`,label:e},{value:`on`,label:b(`configForm.enumOn`)},{value:`off`,label:b(`configForm.enumOff`)}]}function uc(e,t){let n=O`
    ${U({title:b(`configView.notifications.quietHoursWindow`),control:O`
        <input
          type="time"
          class="settings-input"
          aria-label=${b(`configView.notifications.quietHoursStart`)}
          .value=${ic(e.startMinute)}
          @change=${n=>t({...e,startMinute:ac(oc(n).value,e.startMinute)})}
        />
        <span class="settings-row__value" aria-hidden="true">–</span>
        <input
          type="time"
          class="settings-input"
          aria-label=${b(`configView.notifications.quietHoursEnd`)}
          .value=${ic(e.endMinute)}
          @change=${n=>t({...e,endMinute:ac(oc(n).value,e.endMinute)})}
        />
      `})}
    ${J({title:b(`configView.notifications.timeZone`),value:e.timeZone,options:ni([e.timeZone]).map(e=>({value:e,label:e.replaceAll(`_`,` `)})),onChange:n=>t({...e,timeZone:n})})}
  `;return O`<div class="settings-subrows quiet-hours-window">${n}</div>`}function dc(e,t){return U({title:b(`configView.notifications.onlyAgents`),control:O`<input
      type="text"
      class="settings-input"
      aria-label=${b(`configView.notifications.onlyAgents`)}
      .value=${e.join(`, `)}
      @change=${e=>t(oc(e).value.split(`,`).map(e=>e.trim()).filter(Boolean))}
    />`})}function fc(e,t){let n=n=>t({...e,...n});return O`
    <section class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`configView.notifications.accountDefaults`)}</h2>
      </div>
      <div class="settings-group">
        ${_c.map(([t,r])=>H({title:r(),checked:e.categories[t]===!0,onChange:r=>n({categories:{...e.categories,[t]:r}})}))}
        ${J({title:b(`configView.notifications.lockScreenDetail`),description:b(`configView.notifications.lockScreenDetailHint`),value:e.detailLevel,options:cc(),onChange:e=>n({detailLevel:sc(e)})})}
        ${H({title:b(`configView.notifications.quietHours`),checked:e.quietHours.enabled,onChange:t=>n({quietHours:{...e.quietHours,enabled:t}})})}
        ${e.quietHours.enabled?uc(e.quietHours,e=>n({quietHours:e})):k}
        ${dc(e.agentIds,e=>n({agentIds:e}))}
      </div>
    </section>
  `}function pc(e,t){let n=n=>t({...e,...n}),r=e.quietHours;return O`
    <section class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`configView.notifications.installedApp`)}</h2>
      </div>
      <div class="settings-group">
        ${H({title:b(`configView.notifications.deliverDevice`),checked:e.enabled,onChange:e=>n({enabled:e})})}
        ${U({title:b(`configView.notifications.notificationLabel`),control:O`<input
            type="text"
            class="settings-input"
            aria-label=${b(`configView.notifications.notificationLabel`)}
            maxlength="80"
            .value=${e.label}
            @change=${e=>n({label:oc(e).value})}
          />`})}
        ${J({title:b(`configView.notifications.lockScreenDetail`),value:e.detailLevel??`inherit`,options:[{value:`inherit`,label:b(`configView.notifications.inheritDetail`)},...cc()],onChange:e=>n({detailLevel:e===`inherit`?void 0:sc(e)})})}
        ${J({title:b(`configView.notifications.quietHours`),value:r===void 0?`inherit`:r.enabled?`on`:`off`,options:lc(b(`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?uc(r,e=>n({quietHours:e})):k}
        ${J({title:b(`configView.notifications.onlyAgents`),value:e.agentIds===void 0?`inherit`:`override`,options:[{value:`inherit`,label:b(`configView.notifications.inherit`)},{value:`override`,label:b(`configView.notifications.overrideAgents`)}],onChange:e=>n({agentIds:e===`inherit`?void 0:[]})})}
        ${e.agentIds===void 0?k:dc(e.agentIds,e=>n({agentIds:e}))}
        ${_c.map(([t,r])=>J({title:r(),value:e.categories?.[t]===void 0?`inherit`:e.categories[t]?`on`:`off`,options:lc(b(`configView.notifications.inherit`)),onChange:r=>{let i={...e.categories};r===`inherit`?delete i[t]:i[t]=r===`on`,n({categories:i})}}))}
      </div>
    </section>
  `}function mc(e){switch(e){case`granted`:return{kind:`ok`,label:b(`configView.notifications.granted`)};case`denied`:return{kind:`danger`,label:b(`configView.notifications.denied`)};case`notDetermined`:return{kind:`accent`,label:b(`configView.notifications.notRequested`)};default:return{kind:`muted`,label:b(`configView.notifications.checking`)}}}function hc(e,t,n,r=k){return O`
    <section class="settings-section" id=${Pi.notifications}>
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${e}</h2>
        <div class="settings-section__actions">${t}</div>
      </div>
      ${r}
      <div class="settings-group">${n}</div>
    </section>
  `}function gc(e){let t=e.nativeNotifications;if(t){let n=mc(t.permission),r=t.test?.state===`pending`,i=t.permission===`notDetermined`||t.permission===`denied`?O`
            <button
              class=${t.permission===`notDetermined`?`btn primary`:`btn`}
              @click=${()=>e.onNativeNotificationsRequestPermission?.()}
            >
              ${b(t.permission===`notDetermined`?`configView.notifications.enable`:`configView.notifications.openSystemSettings`)}
            </button>
          `:t.permission===`granted`?O`
              <button
                class="btn primary"
                ?disabled=${r}
                @click=${()=>e.onNativeNotificationsSendTest?.()}
              >
                ${r?T.loader:T.send}
                ${b(r?`configView.notifications.sendingTest`:`configView.notifications.sendTest`)}
              </button>
            `:k;return O`
      <div class="settings-page" ${w({settingsPage:!0})}>
        ${hc(b(`configView.notifications.nativeTitle`),V(n),O`
            ${U({title:b(`configView.notifications.permission`),control:W(n.label)})}
            ${i===k?k:O`
                    <div class="settings-row">
                      <div class="settings-row__control">${i}</div>
                    </div>
                  `}
            ${t.permission===`denied`?U({title:b(`configView.notifications.blocked`),description:b(`configView.notifications.nativeBlockedHint`),control:V({kind:`danger`,label:b(`configView.notifications.denied`)})}):k}
            ${t.test?U({title:b(`configView.notifications.testOutcome`),description:t.test.state===`error`?t.test.message:void 0,control:V({kind:r?`accent`:t.test.state===`sent`?`ok`:`danger`,label:b(r?`configView.notifications.sendingTest`:t.test.state===`sent`?`configView.notifications.testQueued`:`configView.notifications.testFailed`)})}):k}
          `)}
      </div>
    `}let n=e.webPush;if(!n)return O`
      <div class="settings-page" ${w({settingsPage:!0})}>
        ${hc(b(`configView.notifications.title`),V({kind:`muted`,label:b(`configView.notifications.unavailable`)}),O`
            <div class="settings-row">
              <div class="settings-row__text">
                <span class="settings-row__desc">
                  ${b(`configView.notifications.unavailableHint`)}
                </span>
              </div>
            </div>
          `)}
      </div>
    `;let r=n.permission===`granted`?b(`configView.notifications.granted`):n.permission===`denied`?b(`configView.notifications.denied`):n.permission==="default"?b(`configView.notifications.notRequested`):b(`configView.notifications.unsupported`),i=n.subscription===`registered`,a=i||n.subscription===`vapid-mismatch`,o=i?b(`configView.notifications.subscribed`):n.subscription===`unknown`?b(`configView.notifications.checking`):b(`configView.notifications.notSubscribed`),s=n.supported?n.permission===`denied`?b(`configView.notifications.blocked`):i?b(`configView.notifications.subscribed`):n.subscription===`vapid-mismatch`?b(`configView.notifications.unavailable`):n.subscription===`unknown`?b(`configView.notifications.checking`):b(`configView.notifications.ready`):b(`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?O`
            <button
              class="btn"
              ?disabled=${n.loading||!e.connected}
              @click=${()=>e.onWebPushUnsubscribe?.()}
            >
              ${T.x} ${b(`configView.notifications.unsubscribe`)}
            </button>
            ${i?O`<button
                    class="btn primary"
                    ?disabled=${n.loading||!e.connected}
                    @click=${()=>e.onWebPushTest?.()}
                  >
                    ${T.send} ${b(`configView.notifications.sendTest`)}
                  </button>`:k}
          `:O`
            <button
              class="btn primary"
              ?disabled=${n.loading||!e.connected}
              @click=${()=>e.onWebPushSubscribe?.()}
            >
              ${n.loading?T.loader:k}
              ${n.loading?b(`configView.notifications.subscribing`):b(`configView.notifications.enable`)}
            </button>
          `:k;return O`
    <div class="settings-page" ${w({settingsPage:!0})}>
      ${hc(b(`configView.notifications.title`),V({kind:c,label:s}),O`
          ${U({title:b(`configView.notifications.browserSupport`),control:W(n.supported?b(`configView.notifications.available`):b(`configView.notifications.notSupported`))})}
          ${U({title:b(`configView.notifications.permission`),control:W(r)})}
          ${U({title:b(`configView.notifications.status`),control:V({kind:i?`ok`:`muted`,label:o})})}
          ${l===k?k:O`
                  <div class="settings-row">
                    <div class="settings-row__control">${l}</div>
                  </div>
                `}
          ${n.permission===`denied`?U({title:b(`configView.notifications.blocked`),description:b(`configView.notifications.blockedHint`),control:V({kind:`danger`,label:b(`configView.notifications.denied`)})}):k}
          ${n.error?O`
                  <div class="settings-row">
                    <div class="settings-row__text">
                      <span class="cfg-field__error">${oe(n.error)}</span>
                    </div>
                  </div>
                `:k}
        `,n.permission===`install-required`?O`<p class="settings-section__desc">
              ${b(`configView.notifications.iosInstallRequired`)}
            </p>`:k)}
      ${i&&n.preferences?O`<div class="settings-stack" ?inert=${n.loading}>
              ${n.preferences.durableIdentity?fc(n.preferences.user,t=>e.onWebPushSetUserPreferences?.(t)):k}
              ${pc(n.preferences.device,t=>e.onWebPushSetDevicePreferences?.(t))}
            </div>`:k}
    </div>
  `}var _c;function vc(){return(vc=e((()=>{A(),D(),ct(),z(),a(),q(),S(),ii(),va(),Ni(),K(),_c=[[`approvalRequested`,()=>b(`configView.notifications.approvalRequested`)],[`agentFinished`,()=>b(`configView.notifications.agentFinished`)],[`agentQuestion`,()=>b(`configView.notifications.agentQuestion`)],[`humanMentioned`,()=>b(`configView.notifications.humanMentioned`)],[`scheduledTaskFailed`,()=>b(`configView.notifications.scheduledTaskFailed`)]]})))()}function yc(e,t,n){let r=Dn(t.formValue?.wizard)?t.formValue.wizard:{};return _r(O`
    <details
      class="settings-section config-advanced-disclosure"
      id="config-section-wizard"
      ?open=${t.forceAdvancedSection===`wizard`}
    >
      <summary class="settings-section__heading config-advanced-disclosure__summary">
        ${b(`configForm.sections.wizard.label`)}
      </summary>
      <p class="settings-section__desc">${b(`configForm.sections.wizard.description`)}</p>
      ${Tr(Object.entries(Ki).map(([i,a])=>{let o=e.properties?.[i];return o?ta({schema:{...o,default:a},value:r[i],path:[`wizard`,i],hints:t.uiHints,unsupported:new Set,disabled:n,onPatch:t.onFormPatch,onRemove:t.onFormRemove}):k}))}
      ${Tr(Hi.flatMap(n=>{let i=r[n];if(typeof i!=`string`||!i)return[];let a=re([`wizard`,n],t.uiHints);return[U({title:a?.label??e.properties?.[n]?.title??ce(n),description:i})]}))}
    </details>
  `)}function bc(){return(bc=e((()=>{A(),ra(),sa(),z(),a(),q(),Wi(),K()})))()}function xc(e){return Dn(e)?e:null}function Sc(e,t,n,r){let i=n?[...n].join(``):``,a=r?[...r].join(``):``,o=e.schemaAnalysisCache;if(o&&o.schema===t&&o.includeKey===i&&o.excludeKey===a)return o.analysis;let s=t;if(t&&ae(t)===`object`&&t.properties){let e={};for(let[i,a]of Object.entries(t.properties))a&&(!n?.size||n.has(i))&&!r?.has(i)&&(e[i]=a);s={...t,properties:e}}let c=na(s);return e.schemaAnalysisCache={schema:t,includeKey:i,excludeKey:a,analysis:c},c}function Cc(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 wc(e){let t=`__OPENCLAW_CONFIG_PATHS__`,n=e.length===1?`configView.formUnsafeCount`:`configView.formUnsafeCountPlural`,[r,i=``]=b(n,{count:String(e.length),paths:t}).split(t);return O`
    <span class="config-content-callout__text">
      ${r}${e.slice(0,3).map((e,t)=>O`${t>0?`, `:``}<code>${e}</code>`)}${i}${e.length>3?O` ${b(`configView.formUnsafeMore`,{count:String(e.length-3)})}`:k}
    </span>
  `}function Tc(){return(Tc=e((()=>{A(),sa(),ia(),a()})))()}function Ec(e){let t=xc(e.schema),n=Dc.filter(t=>e.installedSessionSourcePluginIds?.has(t.pluginId)).map(e=>{let n=ba(t,e.pluginId)?.properties?.[e.key]?.properties?.enabled;return Object.assign({},e,{enabledSchema:n})}),r=!e.connected||e.mutationAllowed===!1||e.loading||e.schemaLoading||e.saving||e.applying||e.updating||e.rawDraftPending===!0;return O`
    <section id=${y.sessionSources} class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`configView.sessionSources.title`)}</h2>
        ${e.pluginsHref?O`<a class="btn btn--sm" href=${e.pluginsHref}
                >${b(`configView.sessionSources.managePlugins`)}</a
              >`:k}
      </div>
      <p class="settings-section__desc">${b(`configView.sessionSources.hint`)}</p>
      ${n.length>0?O`<div class="settings-group">
              ${n.map(({pluginId:t,plugin:n,icon:i,key:a,labelKey:o,enabledSchema:s})=>{let c=P(ya(e.formValue,t).config),l=P(c?.[a])?.enabled;return H({icon:Rr(i,{className:`session-source__icon`}),title:b(o),description:s?b(`configView.sessionSources.sourceHint`,{plugin:n}):b(e.schemaLoading?`common.loading`:`configView.sessionSources.unavailable`),checked:typeof l==`boolean`?l:s?.default===!0,disabled:r||!s,onChange:n=>e.onFormPatch([`plugins`,`entries`,t,`config`,a,`enabled`],n)})})}
            </div>`:O`<p class="settings-section__desc">
              ${b(e.sessionSourcePluginsLoading?`common.loading`:e.installedSessionSourcePluginIds?`configView.sessionSources.empty`:`configView.sessionSources.unavailable`)}
            </p>`}
      <p class="settings-section__desc">${b(`configView.sessionSources.scope`)}</p>
    </section>
  `}var Dc;function Oc(){return(Oc=e((()=>{A(),Vr(),z(),a(),xa(),_(),Tc(),Dc=[{pluginId:`anthropic`,plugin:`Anthropic`,icon:`claude`,key:`sessionCatalog`,labelKey:`configView.sessionSources.claude`},{pluginId:`codex`,plugin:`Codex`,icon:`codex`,key:`sessionCatalog`,labelKey:`configView.sessionSources.codex`},{pluginId:`opencode`,plugin:`OpenCode`,icon:`opencode`,key:`sessionCatalog`,labelKey:`configView.sessionSources.opencode`},{pluginId:`acpx`,plugin:`ACPX`,icon:`pi`,key:`piSessionCatalog`,labelKey:`configView.sessionSources.pi`}]})))()}var kc;function Ac(){return(Ac=e((()=>{A(),kc=jt`
  :host {
    --current-text-color: var(--wa-color-brand-on-loud);

    display: block;
    color: var(--wa-color-text-normal);
    -webkit-user-select: none;
    user-select: none;

    position: relative;
    display: flex;
    align-items: center;
    font: inherit;
    padding: 0.5em 1em 0.5em 0.25em;
    border-radius: var(--wa-border-radius-s);
    line-height: var(--wa-line-height-condensed);
    transition: var(--wa-transition-fast) background-color var(--wa-transition-easing);
    cursor: pointer;
  }

  :host(:focus) {
    outline: none;
  }

  @media (hover: hover) {
    :host(:not(:state(disabled), :state(current)):is(:state(hover), :hover)) {
      background-color: var(--wa-color-neutral-fill-normal);
      color: var(--wa-color-neutral-on-normal);
    }
  }

  :host(:state(current)),
  :host(:state(disabled):state(current)) {
    background-color: var(--wa-form-control-activated-color);
    color: var(--current-text-color);
    opacity: 1;
  }

  :host(:state(disabled)) {
    outline: none;
    opacity: 0.5;
    cursor: not-allowed;
  }

  .label {
    flex: 1 1 auto;
    display: inline-block;
  }

  .check {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: var(--wa-font-size-smaller);
    visibility: hidden;
    width: 2em;
  }

  :host(:state(selected)) .check {
    visibility: visible;
  }

  .start,
  .end {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
  }

  .start::slotted(*) {
    margin-inline-end: 0.5em;
  }

  .end::slotted(*) {
    margin-inline-start: 0.5em;
  }

  @media (forced-colors: active) {
    :host(:hover:not([aria-disabled='true'])) {
      outline: dashed 1px SelectedItem;
      outline-offset: -1px;
    }
  }
`})))()}function jc(e,t=0){if(!e||!globalThis.Node)return``;if(typeof e[Symbol.iterator]==`function`)return(Array.isArray(e)?e:[...e]).map(e=>jc(e,--t)).join(``);let n=e;if(n.nodeType===Node.TEXT_NODE)return n.textContent??``;if(n.nodeType===Node.ELEMENT_NODE){let e=n;if(e.hasAttribute(`slot`)||e.matches(`style, script`))return``;if(e instanceof HTMLSlotElement){let n=e.assignedNodes({flatten:!0});if(n.length>0)return jc(n,--t)}return t>-1?jc(e,--t):e.textContent??``}return n.hasChildNodes()?jc(n.childNodes,--t):``}var Z;function Mc(){return(Mc=e((()=>{Ac(),Gn(),en(),zn(),A(),M(),Z=class extends $n{constructor(){super(...arguments),this.localize=new gn(this),this.cachedDefaultLabel=``,this.isInitialized=!1,this.isDefaultLabelDirty=!0,this.current=!1,this.value=``,this.disabled=!1,this.selected=!1,this.defaultSelected=!1,this._label=``,this.handleHover=e=>{e.type===`mouseenter`?this.customStates.set(`hover`,!0):e.type===`mouseleave`&&this.customStates.set(`hover`,!1)}}set label(e){let t=this._label;this._label=e||``,this._label!==t&&this.requestUpdate(`label`,t)}get label(){return this._label?this._label:this.defaultLabel}get defaultLabel(){return(this.isDefaultLabelDirty||!this.cachedDefaultLabel)&&this.updateDefaultLabel(),this.cachedDefaultLabel}connectedCallback(){super.connectedCallback(),this.setAttribute(`role`,`option`),this.setAttribute(`aria-selected`,`false`),this.addEventListener(`mouseenter`,this.handleHover),this.addEventListener(`mouseleave`,this.handleHover)}disconnectedCallback(){super.disconnectedCallback(),this.removeEventListener(`mouseenter`,this.handleHover),this.removeEventListener(`mouseleave`,this.handleHover)}handleDefaultSlotChange(){this.isDefaultLabelDirty=!0,this.isInitialized?(customElements.whenDefined(`wa-select`).then(()=>{let e=this.closest(`wa-select`);e&&e.handleDefaultSlotChange?.()}),customElements.whenDefined(`wa-combobox`).then(()=>{let e=this.closest(`wa-combobox`);e&&e.handleDefaultSlotChange?.()})):this.isInitialized=!0}willUpdate(e){e.has(`defaultSelected`)&&(this.didSSR&&this.hasUpdated||!this.didSSR)&&this.syncDefaultSelected(),super.willUpdate(e)}syncDefaultSelected(){if(`closest`in this&&!this.closest(`wa-combobox, wa-select`)?.hasInteracted&&this.defaultSelected){let e=this.selected;this.selected=this.defaultSelected,this.requestUpdate(`selected`,e)}}updated(e){e.has(`disabled`)&&(this.setAttribute(`aria-disabled`,this.disabled?`true`:`false`),this.customStates.set(`disabled`,this.disabled)),e.has(`selected`)&&(this.setAttribute(`aria-selected`,this.selected?`true`:`false`),this.customStates.set(`selected`,this.selected)),e.has(`value`)&&(typeof this.value!=`string`&&(this.value=String(this.value)),this.handleDefaultSlotChange()),e.has(`current`)&&this.customStates.set(`current`,this.current),super.updated(e)}async firstUpdated(e){if(super.firstUpdated(e),this.didSSR&&!this.hasUpdated&&await this.updateComplete,this.syncDefaultSelected(),this.selected&&!this.defaultSelected){let e=this.closest(`wa-select, wa-combobox`);e&&!e.hasInteracted&&(await customElements.whenDefined(e?.localName),await e.updateComplete,e.selectionChanged?.())}}updateDefaultLabel(){let e=this.cachedDefaultLabel;this.cachedDefaultLabel=jc(this).trim(),this.isDefaultLabelDirty=!1;let t=this.cachedDefaultLabel!==e;return!this._label&&t&&this.requestUpdate(`label`,e),t}render(){let e=this.selected;return this.didSSR&&!this.hasUpdated?(this.updateComplete.then(()=>{this.requestUpdate()}),k):O`
      ${e?O`<wa-icon
            part="checked-icon"
            class="check"
            name="check"
            library="system"
            variant="solid"
            aria-hidden="true"
          ></wa-icon>`:O`<span part="checked-icon" class="check" aria-hidden="true"></span>`}
      <slot part="start" name="start" class="start"></slot>
      <slot part="label" class="label" @slotchange=${this.handleDefaultSlotChange}></slot>
      <slot part="end" name="end" class="end"></slot>
    `}},Z.css=kc,I([Tt(`.label`)],Z.prototype,`defaultSlot`,2),I([j()],Z.prototype,`current`,2),I([N({reflect:!0})],Z.prototype,`value`,2),I([N({type:Boolean})],Z.prototype,`disabled`,2),I([N({type:Boolean,attribute:!1})],Z.prototype,`selected`,2),I([N({type:Boolean,attribute:`selected`})],Z.prototype,`defaultSelected`,2),I([N()],Z.prototype,`label`,1),Z=I([It(`wa-option`)],Z)})))()}function Nc(){return(Nc=e((()=>{Mc(),Ac(),dn(),hn(),Gn(),en(),Nn()})))()}var Pc;function Fc(){return(Fc=e((()=>{A(),Pc=jt`
  :host {
    --tag-max-size: 10ch;
    --show-duration: var(--wa-transition-fast);
    --hide-duration: var(--wa-transition-fast);
  }

  /* Add ellipses to multi select options */
  :host wa-tag::part(content) {
    display: initial;
    white-space: nowrap;
    text-overflow: ellipsis;
    overflow: hidden;
    max-width: var(--tag-max-size);
  }

  :host .disabled [part~='combobox'] {
    opacity: 0.5;
    cursor: not-allowed;
    outline: none;
  }

  :host .enabled:is(.open, :focus-within) [part~='combobox'] {
    outline-color: var(--wa-color-focus);
  }

  /** The popup */
  .select {
    flex: 1 1 auto;
    display: inline-flex;
    width: 100%;
    position: relative;
    vertical-align: middle;

    /* Pass through from select to the popup */
    --show-duration: inherit;
    --hide-duration: inherit;

    &::part(popup) {
      z-index: 900;
    }

    &[data-current-placement^='top']::part(popup) {
      transform-origin: bottom;
    }

    &[data-current-placement^='bottom']::part(popup) {
      transform-origin: top;
    }
  }

  /* Combobox */
  .combobox {
    flex: 1;
    display: flex;
    width: 100%;
    min-width: 0;
    align-items: center;
    justify-content: start;

    min-height: var(--wa-form-control-height);

    background-color: var(--wa-form-control-background-color);
    border-color: var(--wa-form-control-border-color);
    border-radius: var(--wa-form-control-border-radius);
    border-style: var(--wa-form-control-border-style);
    border-width: var(--wa-form-control-border-width);
    color: var(--wa-form-control-value-color);
    cursor: pointer;
    font-family: inherit;
    font-weight: var(--wa-form-control-value-font-weight);
    line-height: var(--wa-form-control-value-line-height);
    overflow: hidden;
    padding: 0 var(--wa-form-control-padding-inline);
    position: relative;
    vertical-align: middle;
    transition:
      background-color var(--wa-transition-normal),
      border-color var(--wa-transition-normal),
      outline-color var(--wa-transition-fast);
    transition-timing-function: var(--wa-transition-easing);
    outline: var(--wa-focus-ring-style) var(--wa-focus-ring-width) transparent;
    outline-offset: var(--wa-focus-ring-offset);

    /* Pills */
    :host([pill]) & {
      border-radius: var(--wa-border-radius-pill);
    }
  }

  /* Appearance modifiers */
  :host([appearance='outlined']) .combobox {
    background-color: var(--wa-form-control-background-color);
    border-color: var(--wa-form-control-border-color);
  }

  :host([appearance='filled']) .combobox {
    background-color: var(--wa-color-neutral-fill-quiet);
    border-color: var(--wa-color-neutral-fill-quiet);
  }

  :host([appearance='filled-outlined']) .combobox {
    background-color: var(--wa-color-neutral-fill-quiet);
    border-color: var(--wa-form-control-border-color);
  }

  .display-input {
    position: relative;
    width: 100%;
    font: inherit;
    border: none;
    background: none;
    line-height: var(--wa-form-control-value-line-height);
    color: var(--wa-form-control-value-color);
    cursor: inherit;
    overflow: hidden;
    padding: 0;
    margin: 0;
    -webkit-appearance: none;

    &:focus {
      outline: none;
    }

    &::placeholder {
      color: var(--wa-form-control-placeholder-color);
    }
  }

  /* Manage spacing when tags are present */
  :host([multiple]) {
    --_padding-with-tags: calc(var(--wa-form-control-height) * 0.1 - var(--wa-form-control-border-width));

    & .combobox:has(.tags wa-tag) {
      padding-block: var(--_padding-with-tags);
      padding-inline-start: var(--_padding-with-tags);
    }
  }

  /* Visually hide the display input when multiple is enabled */
  :host([multiple]) .combobox:has(.tags wa-tag) .display-input {
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
  }

  .value-input {
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    opacity: 0;
    padding: 0;
    margin: 0;
  }

  .tags {
    display: flex;
    flex: 1;
    align-items: center;
    flex-wrap: wrap;
    gap: 0.25em;

    /* Nested inside the box, so a step down from the box's radius */
    & wa-tag:not([pill]) {
      border-radius: var(--wa-border-radius-s);
    }

    .disabled & {
      cursor: not-allowed !important;
    }
  }

  /* Start and End */

  .start,
  .end {
    flex: 0;
    display: inline-flex;
    align-items: center;
    color: var(--wa-color-neutral-on-quiet);
  }

  .end::slotted(*) {
    margin-inline-start: var(--wa-form-control-padding-inline);
  }

  .start::slotted(*) {
    margin-inline-end: var(--wa-form-control-padding-inline);
  }

  :host([multiple]) .combobox:has(.tags wa-tag) .start::slotted(*) {
    margin-inline-start: calc(var(--wa-form-control-padding-inline) - var(--_padding-with-tags));
  }

  /* Clear button */
  [part~='clear-button'] {
    flex: 0 0 auto;
    display: inline-flex;
    align-self: stretch;
    align-items: center;
    justify-content: center;
    inline-size: 1.5em;
    font-size: inherit;
    color: var(--wa-color-neutral-on-quiet);
    border: none;
    background: none;
    padding: 0;
    transition: color var(--wa-transition-normal);
    cursor: pointer;
    /* The box is wider than the glyph, so overhang half that growth on each side. Keeps the glyph
       on the same trailing axis as the segmented-field pickers' clear buttons. */
    margin-inline-start: calc(var(--wa-form-control-padding-inline) - 0.125em);
    margin-inline-end: -0.125em;

    &:focus {
      outline: none;
    }

    @media (hover: hover) {
      &:hover {
        color: color-mix(in oklab, currentColor, var(--wa-color-mix-hover));
      }
    }

    &:active {
      color: color-mix(in oklab, currentColor, var(--wa-color-mix-active));
    }
  }

  /* Expand icon */
  .expand-icon {
    flex: 0 0 auto;
    display: flex;
    align-items: center;
    color: var(--wa-color-neutral-on-quiet);
    transition: rotate var(--wa-transition-slow) var(--wa-transition-easing);
    rotate: 0deg;
    margin-inline-start: var(--wa-form-control-padding-inline);

    .open & {
      rotate: -180deg;
    }
  }

  /* Listbox */
  .listbox {
    display: block;
    position: relative;
    font: inherit;
    box-shadow: var(--wa-shadow-m);
    background: var(--wa-color-surface-raised);
    border-color: var(--wa-color-surface-border);
    border-radius: var(--wa-border-radius-m);
    border-style: var(--wa-border-style);
    border-width: var(--wa-border-width-s);
    padding: 0.25em;
    overflow: auto;
    overscroll-behavior: none;

    /* Make sure it adheres to the popup's auto size */
    max-width: var(--auto-size-available-width);
    max-height: var(--auto-size-available-height);

    &::slotted(wa-divider) {
      --spacing: 0.5em;
    }
  }

  /* Space options with half the listbox's padding */
  .listbox slot:not([name]) {
    display: flex;
    flex-direction: column;
    gap: 0.125em;
  }

  slot:not([name])::slotted(small) {
    display: block;
    font-size: var(--wa-font-size-smaller);
    font-weight: var(--wa-font-weight-semibold);
    color: var(--wa-color-text-quiet);
    padding-block: 0.5em;
    padding-inline: 2.25em;
  }
`})))()}var Ic;function Lc(){return(Lc=e((()=>{Ic=class extends Event{constructor(){super(`wa-clear`,{bubbles:!0,cancelable:!1,composed:!0})}}})))()}var Q;function Rc(){return(Rc=e((()=>{Fc(),rn(),yn(),An(),tr(),In(),Lc(),Mn(),pr(),dr(),Tn(),er(),ln(),xn(),en(),zn(),A(),M(),Ct(),Pt(),Q=class extends fn{constructor(){super(...arguments),this.assumeInteractionOn=[`blur`,`input`],this.cachedOptions=null,this.hasSlotController=new Vn(this,`hint`,`label`),this.localize=new gn(this),this.selectionOrder=new Map,this.typeToSelectString=``,this.slotChangePending=!1,this.openTransition={open:!1},this.displayLabel=``,this.selectedOptions=[],this.name=``,this._defaultValue=null,this.size=`m`,this.placeholder=``,this.multiple=!1,this.maxOptionsVisible=3,this.disabled=!1,this.withClear=!1,this.open=!1,this.appearance=`outlined`,this.pill=!1,this.label=``,this.placement=`bottom`,this.hint=``,this.withLabel=!1,this.withHint=!1,this.required=!1,this.getTag=e=>O`
        <wa-tag
          part="tag"
          exportparts="
            base:tag__base,
            content:tag__content,
            remove-button:tag__remove-button,
            remove-button__base:tag__remove-button__base
          "
          ?pill=${this.pill}
          size=${this.size}
          with-remove
          data-value=${e.value}
          @wa-remove=${t=>this.handleTagRemove(t,e)}
        >
          ${e.label}
        </wa-tag>
      `,this.handleDocumentFocusIn=e=>{let t=e.composedPath();this&&!t.includes(this)&&this.hide()},this.handleDocumentKeyDown=e=>{let t=e.target,n=t.closest(`[part~="clear-button"]`)!==null,r=t.closest(`wa-button`)!==null;if(!(n||r)){if(e.key===`Escape`&&this.open&&Fn(this)&&(e.preventDefault(),e.stopPropagation(),this.hide(),this.displayInput.focus({preventScroll:!0})),e.key===`Enter`||e.key===` `&&this.typeToSelectString===``){if(e.preventDefault(),e.stopImmediatePropagation(),!this.open){this.show();return}this.currentOption&&!this.currentOption.disabled&&(this.valueHasChanged=!0,this.hasInteracted=!0,this.multiple?this.toggleOptionSelection(this.currentOption):this.setSelectedOptions(this.currentOption),this.updateComplete.then(()=>{this.dispatchEvent(new InputEvent(`input`,{bubbles:!0,composed:!0})),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0}))}),this.multiple||(this.hide(),this.displayInput.focus({preventScroll:!0})));return}if([`ArrowUp`,`ArrowDown`,`Home`,`End`].includes(e.key)){let t=this.getAllOptions(),n=t.indexOf(this.currentOption),r=Math.max(0,n);if(e.preventDefault(),!this.open&&(this.show(),this.currentOption))return;e.key===`ArrowDown`?(r=n+1,r>t.length-1&&(r=0)):e.key===`ArrowUp`?(r=n-1,r<0&&(r=t.length-1)):e.key===`Home`?r=0:e.key===`End`&&(r=t.length-1),this.setCurrentOption(t[r])}if(e.key?.length===1||e.key===`Backspace`){let t=this.getAllOptions();if(e.metaKey||e.ctrlKey||e.altKey)return;if(!this.open){if(e.key===`Backspace`)return;this.show()}e.stopPropagation(),e.preventDefault(),clearTimeout(this.typeToSelectTimeout),this.typeToSelectTimeout=window.setTimeout(()=>this.typeToSelectString=``,1e3),e.key===`Backspace`?this.typeToSelectString=this.typeToSelectString.slice(0,-1):this.typeToSelectString+=e.key.toLowerCase();for(let e of t)if(e.label.toLowerCase().startsWith(this.typeToSelectString)){this.setCurrentOption(e);break}}}},this.handleDocumentMouseDown=e=>{let t=e.composedPath();this&&!t.includes(this)&&this.hide()}}static get validators(){let e=[cr({validationElement:Object.assign(document.createElement(`select`),{required:!0})})];return[...super.validators,...e]}get validationTarget(){return this.valueInput}set defaultValue(e){this._defaultValue=this.convertDefaultValue(e)}get defaultValue(){return this.convertDefaultValue(this._defaultValue)}rawValuesEqual(e,t){return e==null&&t==null?!0:e==null||t==null||e.length!==t.length?!1:e.every((e,n)=>e===t[n])}convertDefaultValue(e){return!(this.multiple||this.hasAttribute(`multiple`))&&Array.isArray(e)&&(e=e[0]),e}set value(e){let t=this.value;e instanceof FormData&&(e=e.getAll(this.name)),e!=null&&!Array.isArray(e)&&(e=[e]);let n=this._value;this._value=e??null,this.rawValuesEqual(n,this._value)||(this.valueHasChanged=!0,this.requestUpdate(`value`,t))}get value(){let e=this._value??this.defaultValue??null;e!=null&&(e=Array.isArray(e)?e:[e]),this.optionValues=new Set(this.getAllOptions().filter(e=>!e.disabled).map(e=>e.value));let t=e;return e!=null&&(t=e.filter(e=>this.optionValues.has(e)),t=this.multiple?t:t[0],t??=null),t}handleSizeChange(){pn(this.localName,this.size)}connectedCallback(){super.connectedCallback(),this.processSlotChange(),this.open=!1}disconnectedCallback(){super.disconnectedCallback(),this.openTransition.controller?.abort(),this.openTransition={open:!1},this.popup?.popup?.classList.remove(`show`,`hide`),this.listbox&&(this.listbox.hidden=!0),this.popup&&(this.popup.active=!1),Wn(this),this.cachedOptions=null}updateDefaultValue(){let e=this.getAllOptions().filter(e=>e.hasAttribute(`selected`)||e.defaultSelected);if(e.length>0){let t=e.map(e=>e.value);this._defaultValue=this.multiple?t:t[0]}this.hasAttribute(`value`)&&(this._defaultValue=this.getAttribute(`value`)||null)}handleFocus(){this.displayInput.setSelectionRange(0,0)}handleLabelClick(){this.displayInput.focus()}handleComboboxClick(e){e.preventDefault()}handleComboboxMouseDown(e){let t=e.composedPath().some(e=>e instanceof Element&&e.tagName.toLowerCase()===`wa-button`);this.disabled||t||(e.preventDefault(),this.displayInput.focus({preventScroll:!0}),this.open=!this.open)}handleComboboxKeyDown(e){e.stopPropagation(),this.handleDocumentKeyDown(e)}handleClearClick(e){e.stopPropagation(),this.hasInteracted=!0,this.valueHasChanged=!0,this.value!==null&&(this.displayLabel=``,this.selectionOrder.clear(),this.setSelectedOptions([]),this.displayInput.focus({preventScroll:!0}),this.updateComplete.then(()=>{this.dispatchEvent(new Ic),this.dispatchEvent(new InputEvent(`input`,{bubbles:!0,composed:!0})),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0}))}))}handleClearMouseDown(e){e.stopPropagation(),e.preventDefault()}handleOptionClick(e){let t=e.target.closest(`wa-option`);t&&!t.disabled&&(this.hasInteracted=!0,this.valueHasChanged=!0,this.multiple?this.toggleOptionSelection(t):this.setSelectedOptions(t),this.updateComplete.then(()=>this.displayInput.focus({preventScroll:!0})),this.requestUpdate(`value`),this.updateComplete.then(()=>{this.dispatchEvent(new InputEvent(`input`,{bubbles:!0,composed:!0})),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0}))}),this.multiple||(this.hide(),this.displayInput.focus({preventScroll:!0})))}handleDefaultSlotChange(){this.slotChangePending||(this.slotChangePending=!0,queueMicrotask(()=>{this.slotChangePending=!1,this.processSlotChange()}))}processSlotChange(){if(customElements.get(`wa-option`)||customElements.whenDefined(`wa-option`).then(()=>this.handleDefaultSlotChange()),this.didSSR&&!this.hasUpdated){this.updateComplete.then(()=>{this.handleDefaultSlotChange()});return}this.cachedOptions=null;let e=this.getAllOptions();this.updateDefaultValue();let t=this.value;if(t==null||!this.valueHasChanged&&!this.hasInteracted){this.selectionChanged();return}Array.isArray(t)||(t=[t]);let n=e.filter(e=>t.includes(e.value));this.setSelectedOptions(n)}handleTagRemove(e,t){if(e.stopPropagation(),this.disabled)return;this.hasInteracted=!0,this.valueHasChanged=!0;let n=t;if(!n){let t=e.target.closest(`wa-tag[data-value]`);if(t){let e=t.dataset.value;n=this.selectedOptions.find(t=>t.value===e)}}n&&(this.toggleOptionSelection(n,!1),this.updateComplete.then(()=>{this.dispatchEvent(new InputEvent(`input`,{bubbles:!0,composed:!0})),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0}))}))}getAllOptions(){return this.cachedOptions?this.cachedOptions:this?.querySelectorAll?(this.cachedOptions=[...this.querySelectorAll(`wa-option`)],this.cachedOptions):[]}getFirstOption(){return this.querySelector(`wa-option`)}setCurrentOption(e){this.getAllOptions().forEach(e=>{e.current=!1,e.tabIndex=-1}),e&&(this.currentOption=e,e.current=!0,e.tabIndex=0,e.focus({preventScroll:!0}),this.open&&!this.listbox.hidden&&nr(e,this.listbox,`vertical`,`auto`))}setSelectedOptions(e){let t=this.getAllOptions(),n=Array.isArray(e)?e:[e];t.forEach(e=>{n.includes(e)||(e.selected=!1)}),n.length&&n.forEach(e=>e.selected=!0),this.selectionChanged()}toggleOptionSelection(e,t){e.selected=t===!0||t===!1?t:!e.selected,this.selectionChanged()}selectionChanged(){let e=this.getAllOptions().filter(e=>{if(!this.hasInteracted&&!this.valueHasChanged){let t=this.defaultValue,n=Array.isArray(t)?t:[t];return e.hasAttribute(`selected`)||e.defaultSelected||e.selected||n?.includes(e.value)}return e.selected}),t=new Set(e.map(e=>e.value));for(let e of this.selectionOrder.keys())t.has(e)||this.selectionOrder.delete(e);let n=(this.selectionOrder.size>0?Math.max(...this.selectionOrder.values()):-1)+1;for(let t of e)this.selectionOrder.has(t.value)||this.selectionOrder.set(t.value,n++);this.selectedOptions=e.sort((e,t)=>(this.selectionOrder.get(e.value)??0)-(this.selectionOrder.get(t.value)??0));let r=new Set(this.selectedOptions.map(e=>e.value));if(r.size>0||this._value){let e=this._value;if(this._value==null){let e=this.defaultValue??[];this._value=Array.isArray(e)?e:[e]}this._value=this._value?.filter(e=>!this.optionValues?.has(e))??null,this._value?.unshift(...r),this.requestUpdate(`value`,e)}if(this.multiple)this.displayLabel=this.placeholder&&!this.value?.length?``:this.localize.term(`numOptionsSelected`,this.selectedOptions.length);else{let e=this.selectedOptions[0];this.displayLabel=e?.label??``}this.updateComplete.then(()=>{this.updateValidity()})}get tags(){return this.selectedOptions.map((e,t)=>{if(t<this.maxOptionsVisible||this.maxOptionsVisible<=0){let n=this.getTag(e,t);return n?typeof n==`string`?Nt(n):n:null}return t===this.maxOptionsVisible?O`
          <wa-tag
            part="tag"
            exportparts="
              base:tag__base,
              content:tag__content,
              remove-button:tag__remove-button,
              remove-button__base:tag__remove-button__base
            "
            ?pill=${this.pill}
            size=${this.size}
            >+${this.selectedOptions.length-t}</wa-tag
          >
        `:null})}updated(e){super.updated(e),(e.has(`value`)||e.has(`displayLabel`))&&this.customStates.set(`blank`,!this.value&&!this.displayLabel)}handleDisabledChange(){this.disabled&&this.open&&(this.open=!1,this.handleOpenChange())}handleValueChange(){let e=this.getAllOptions(),t=Array.isArray(this.value)?this.value:[this.value],n=e.filter(e=>t.includes(e.value));this.setSelectedOptions(n),this.updateValidity()}async handleOpenChange(){let e=this.open&&!this.disabled;if(!this.isConnected||this.openTransition.open===e)return this.openAnimation;e&&this.setCurrentOption(this.selectedOptions[0]||this.getFirstOption());let t=e?new rr:new ir;if(this.dispatchEvent(t),t.defaultPrevented&&!this.disabled)return this.open=this.openTransition.open,this.openAnimation;if(!this.isConnected||(this.open&&!this.disabled)!==e)return this.openAnimation;this.openTransition.controller?.abort(),this.openTransition={open:e,controller:new AbortController};let{signal:n}=this.openTransition.controller,r=()=>!n.aborted&&this.isConnected&&(this.open&&!this.disabled)===e;if(e){document.addEventListener(`focusin`,this.handleDocumentFocusIn,{signal:n}),document.addEventListener(`keydown`,this.handleDocumentKeyDown,{signal:n}),document.addEventListener(`mousedown`,this.handleDocumentMouseDown,{signal:n}),Jn(this);let e=this.getRootNode();e!==document&&e.addEventListener(`focusin`,this.handleDocumentFocusIn,{signal:n}),this.listbox.hidden=!1,this.popup.active=!0,requestAnimationFrame(()=>{r()&&this.setCurrentOption(this.currentOption)})}else Wn(this);this.popup.popup.classList.remove(`show`,`hide`);let i=this.openAnimation;return this.openAnimation=(async()=>{await i,r()&&(await Qn(this.popup.popup,e?`show`:`hide`),r()&&(e&&this.currentOption&&nr(this.currentOption,this.listbox,`vertical`,`auto`),e||(this.listbox.hidden=!0,this.popup.active=!1),this.dispatchEvent(e?new Rn:new On)))})(),this.openAnimation}async show(){if(this.disabled){this.open=!1;return}if(this.isConnected)return this.open=!0,await this.updateComplete,this.handleOpenChange()}async hide(){if(this.open=!1,this.isConnected)return await this.updateComplete,this.openAnimation}focus(e){this.displayInput.focus(e)}blur(){this.displayInput.blur()}formResetCallback(){this.selectionOrder.clear(),this.value=this.defaultValue,super.formResetCallback(),this.handleValueChange(),this.updateComplete.then(()=>{this.dispatchEvent(new InputEvent(`input`,{bubbles:!0,composed:!0})),this.dispatchEvent(new Event(`change`,{bubbles:!0,composed:!0}))})}render(){let e=this.hasSlotController.test(`label`,`withLabel`),t=this.hasSlotController.test(`hint`,`withHint`),n=this.label?!0:!!e,r=this.hint?!0:!!t,i=(this.hasUpdated||!1)&&this.withClear&&!this.disabled&&(this.displayLabel||this.value&&this.value.length>0);return O`
      <div
        part="form-control"
        class=${St({"form-control":!0,"form-control-has-label":n})}
      >
        <label
          id="label"
          part="form-control-label label"
          class=${St({label:!0,"has-label":n})}
          aria-hidden=${n?`false`:`true`}
          @click=${this.handleLabelClick}
        >
          <slot name="label">${this.label}</slot>
        </label>

        <div part="form-control-input" class="form-control-input">
          <wa-popup
            class=${St({select:!0,open:this.open,disabled:this.disabled,enabled:!this.disabled,multiple:this.multiple})}
            placement=${this.placement}
            flip
            shift
            sync="width"
            auto-size="vertical"
            auto-size-padding="10"
          >
            <div
              part="combobox"
              class="combobox"
              slot="anchor"
              @keydown=${this.handleComboboxKeyDown}
              @mousedown=${this.handleComboboxMouseDown}
              @click=${this.handleComboboxClick}
            >
              <slot part="start" name="start" class="start"></slot>

              <input
                part="display-input"
                class="display-input"
                type="text"
                placeholder=${this.placeholder}
                .disabled=${this.disabled}
                .value=${this.displayLabel}
                ?required=${this.required}
                autocomplete="off"
                spellcheck="false"
                autocapitalize="off"
                readonly
                aria-invalid=${!this.validity.valid}
                aria-controls="listbox"
                aria-expanded=${this.open?`true`:`false`}
                aria-haspopup="listbox"
                aria-labelledby="label"
                aria-disabled=${this.disabled?`true`:`false`}
                aria-describedby="hint"
                role="combobox"
                tabindex="0"
                @focus=${this.handleFocus}
              />

              <!-- Tags need to wait for first hydration before populating otherwise it will create a hydration mismatch. -->
              ${this.multiple&&this.hasUpdated?O`<div part="tags" class="tags" @wa-remove=${this.handleTagRemove}>${this.tags}</div>`:``}

              <input
                class="value-input"
                type="text"
                ?disabled=${this.disabled}
                ?required=${this.required}
                .value=${Array.isArray(this.value)?this.value.join(`, `):this.value}
                tabindex="-1"
                aria-hidden="true"
                @focus=${()=>this.focus()}
              />

              ${i?O`
                    <button
                      part="clear-button"
                      type="button"
                      aria-label=${this.localize.term(`clearEntry`)}
                      @mousedown=${this.handleClearMouseDown}
                      @click=${this.handleClearClick}
                      tabindex="-1"
                    >
                      <slot name="clear-icon">
                        <wa-icon name="circle-xmark" library="system" variant="regular"></wa-icon>
                      </slot>
                    </button>
                  `:``}

              <slot name="end" part="end" class="end"></slot>

              <slot name="expand-icon" part="expand-icon" class="expand-icon">
                <wa-icon library="system" name="chevron-down" variant="solid"></wa-icon>
              </slot>
            </div>

            <div
              id="listbox"
              role="listbox"
              aria-expanded=${this.open?`true`:`false`}
              aria-multiselectable=${this.multiple?`true`:`false`}
              aria-labelledby="label"
              part="listbox"
              class="listbox"
              tabindex="-1"
              @mouseup=${this.handleOptionClick}
            >
              <slot @slotchange=${this.handleDefaultSlotChange}></slot>
            </div>
          </wa-popup>
        </div>

        <slot
          id="hint"
          name="hint"
          part="hint"
          class=${St({"has-slotted":r})}
          aria-hidden=${r?`false`:`true`}
          >${this.hint}</slot
        >
      </div>
    `}},Q.css=[Pc,lr,Cn],I([Tt(`.select`)],Q.prototype,`popup`,2),I([Tt(`.combobox`)],Q.prototype,`combobox`,2),I([Tt(`.display-input`)],Q.prototype,`displayInput`,2),I([Tt(`.value-input`)],Q.prototype,`valueInput`,2),I([Tt(`.listbox`)],Q.prototype,`listbox`,2),I([j()],Q.prototype,`displayLabel`,2),I([j()],Q.prototype,`currentOption`,2),I([j()],Q.prototype,`selectedOptions`,2),I([N({reflect:!0})],Q.prototype,`name`,2),I([N({attribute:!1})],Q.prototype,`defaultValue`,1),I([N({attribute:`value`,reflect:!1})],Q.prototype,`value`,1),I([N({reflect:!0})],Q.prototype,`size`,2),I([Kn(`size`)],Q.prototype,`handleSizeChange`,1),I([N()],Q.prototype,`placeholder`,2),I([N({type:Boolean,reflect:!0})],Q.prototype,`multiple`,2),I([N({attribute:`max-options-visible`,type:Number})],Q.prototype,`maxOptionsVisible`,2),I([N({type:Boolean})],Q.prototype,`disabled`,2),I([N({attribute:`with-clear`,type:Boolean})],Q.prototype,`withClear`,2),I([N({type:Boolean,reflect:!0})],Q.prototype,`open`,2),I([N({reflect:!0})],Q.prototype,`appearance`,2),I([N({type:Boolean,reflect:!0})],Q.prototype,`pill`,2),I([N()],Q.prototype,`label`,2),I([N({reflect:!0})],Q.prototype,`placement`,2),I([N({attribute:`hint`})],Q.prototype,`hint`,2),I([N({attribute:`with-label`,type:Boolean})],Q.prototype,`withLabel`,2),I([N({attribute:`with-hint`,type:Boolean})],Q.prototype,`withHint`,2),I([N({type:Boolean,reflect:!0})],Q.prototype,`required`,2),I([N({attribute:!1})],Q.prototype,`getTag`,2),I([Kn(`disabled`,{waitUntilFirstUpdate:!0})],Q.prototype,`handleDisabledChange`,1),I([Kn(`value`,{waitUntilFirstUpdate:!0})],Q.prototype,`handleValueChange`,1),I([Kn(`open`,{waitUntilFirstUpdate:!0})],Q.prototype,`handleOpenChange`,1),Q=I([It(`wa-select`)],Q),Q.disableWarning?.(`change-in-update`)})))()}var zc;function Bc(){return(Bc=e((()=>{zc=class extends Event{constructor(){super(`wa-remove`,{bubbles:!0,cancelable:!1,composed:!0})}}})))()}var Vc;function Hc(){return(Hc=e((()=>{A(),Vc=jt`
  @layer wa-component {
    :host {
      display: inline-flex;
      gap: 0.5em;
      border-radius: var(--wa-border-radius-m);
      align-items: center;
      background-color: var(--wa-color-fill-quiet, var(--wa-color-neutral-fill-quiet));
      border-color: var(--wa-color-border-normal, var(--wa-color-neutral-border-normal));
      border-style: var(--wa-border-style);
      border-width: var(--wa-border-width-s);
      color: var(--wa-color-on-quiet, var(--wa-color-neutral-on-quiet));
      font-size: inherit;
      line-height: 1;
      white-space: nowrap;
      user-select: none;
      -webkit-user-select: none;
      height: calc(var(--wa-form-control-height) * 0.8);
      line-height: calc(var(--wa-form-control-height) - var(--wa-form-control-border-width) * 2);
      padding: 0 0.75em;
    }

    /* Appearance modifiers */
    :host([appearance='outlined']) {
      color: var(--wa-color-on-quiet, var(--wa-color-neutral-on-quiet));
      background-color: transparent;
      border-color: var(--wa-color-border-loud, var(--wa-color-neutral-border-loud));
    }

    :host([appearance='filled']) {
      color: var(--wa-color-on-quiet, var(--wa-color-neutral-on-quiet));
      background-color: var(--wa-color-fill-quiet, var(--wa-color-neutral-fill-quiet));
      border-color: transparent;
    }

    :host([appearance='filled-outlined']) {
      color: var(--wa-color-on-quiet, var(--wa-color-neutral-on-quiet));
      background-color: var(--wa-color-fill-quiet, var(--wa-color-neutral-fill-quiet));
      border-color: var(--wa-color-border-normal, var(--wa-color-neutral-border-normal));
    }

    :host([appearance='accent']) {
      color: var(--wa-color-on-loud, var(--wa-color-neutral-on-loud));
      background-color: var(--wa-color-fill-loud, var(--wa-color-neutral-fill-loud));
      border-color: transparent;
    }
  }

  .content {
    font-size: var(--wa-font-size-smaller);
  }

  [part='remove-button'] {
    line-height: 1;
  }

  [part='remove-button']::part(base) {
    padding: 0;
    height: 1em;
    width: 1em;
    color: currentColor;
  }

  @media (hover: hover) {
    :host(:hover) > [part='remove-button']::part(base) {
      background-color: transparent;
      color: color-mix(in oklab, currentColor, var(--wa-color-mix-hover));
    }
  }

  :host(:active) > [part='remove-button']::part(base) {
    background-color: transparent;
    color: color-mix(in oklab, currentColor, var(--wa-color-mix-active));
  }

  /*
   * Pill modifier
   */
  :host([pill]) {
    border-radius: var(--wa-border-radius-pill);
  }
`})))()}var Uc;function Wc(){return(Wc=e((()=>{Bc(),Hc(),ln(),xn(),Sn(),Gn(),en(),zn(),A(),M(),Uc=class extends $n{constructor(){super(...arguments),this.localize=new gn(this),this.variant=`neutral`,this.appearance=`filled-outlined`,this.size=`m`,this.pill=!1,this.withRemove=!1}handleSizeChange(){pn(this.localName,this.size)}handleRemoveClick(){this.dispatchEvent(new zc)}render(){return O`
      <slot part="content" class="content"></slot>

      ${this.withRemove?O`
            <wa-button
              part="remove-button"
              exportparts="base:remove-button__base"
              class="remove"
              appearance="plain"
              size=${this.size}
              @click=${this.handleRemoveClick}
              tabindex="-1"
            >
              <wa-icon name="xmark" library="system" variant="solid" label=${this.localize.term(`remove`)}></wa-icon>
            </wa-button>
          `:``}
    `}},Uc.css=[Vc,un,Cn],I([N({reflect:!0})],Uc.prototype,`variant`,2),I([N({reflect:!0})],Uc.prototype,`appearance`,2),I([N({reflect:!0})],Uc.prototype,`size`,2),I([Kn(`size`)],Uc.prototype,`handleSizeChange`,1),I([N({type:Boolean,reflect:!0})],Uc.prototype,`pill`,2),I([N({attribute:`with-remove`,type:Boolean})],Uc.prototype,`withRemove`,2),Uc=I([It(`wa-tag`)],Uc)})))()}function Gc(){return(Gc=e((()=>{Rc(),Wc(),Hc(),Fc(),Mc(),Ac(),mr(),fr(),dr(),tn(),_n(),ar(),Tn(),Xn(),xn(),Sn(),dn(),hn(),Gn(),en(),Nn()})))()}function Kc(){return(Kc=e((()=>{Nc(),Gc()})))()}function qc(e){let t=e.replace(/-([a-zA-Z])/g,(e,t)=>t.toUpperCase());return b(`languages.${t}`)}function Jc(e,t,n){let r=e??`system`,i=`${b(`common.system`)} (${qc(t)})`;return O`
    <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">${b(`quickSettings.language`)}</span>
      <wa-option value="system" .label=${i} .selected=${r===`system`}>
        ${i}
      </wa-option>
      ${ee.map(e=>{let t=qc(e);return O`
          <wa-option value=${e} .label=${t} .selected=${e===r}>
            ${t}
          </wa-option>
        `})}
    </wa-select>
  `}function Yc(){return(Yc=e((()=>{A(),Kc(),a()})))()}function Xc(e){return b(e===`profile`?`configView.profileSyncedHint`:e===`device-local`?`quickSettings.personal.browserOnly`:e===`pending`?`configView.syncPendingHint`:`configView.syncedHint`)}function Zc(e){let t=G(e.localeResetValue?qc(e.localeResetValue):b(`common.system`),e.localeOverridden),n=Xc(e.localeProvenance);return O`
    <section id=${y.language} class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`quickSettings.language`)}</h2>
      </div>
      <div class="settings-group">
        ${U({title:b(`quickSettings.language`),description:O`${t} ${n}`,control:Jc(e.localeOverride,e.systemLocale,e.onLocaleChange)})}
      </div>
    </section>
  `}function Qc(e){let t=e.state;if(!t||!e.onSelect)return k;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?O`<span role="alert">${t.error}</span>`:!t.loading&&t.devices.length===0?e.emptyLabel:void 0;return U({title:e.title,description:O`${l?O`${l}<br />`:k}${b(`quickSettings.personal.browserOnly`)}`,control:O`
      <select
        class="settings-select settings-select--media-device"
        data-settings-microphone=${e.dataAttribute===`microphone`?``:k}
        data-settings-camera=${e.dataAttribute===`camera`?``:k}
        aria-label=${e.title}
        .value=${n}
        @pointerdown=${s}
        @keydown=${c}
        @change=${t=>e.onSelect?.(t.currentTarget.value)}
      >
        ${i.map(e=>O`
            <option value=${e.value} ?selected=${e.value===n}>
              ${e.label}
            </option>
          `)}
      </select>
    `})}function $c(e){return Qc({state:e.microphone,title:b(`chat.composer.microphoneInput`),systemDefaultLabel:b(`chat.composer.systemDefaultMicrophone`),emptyLabel:b(`chat.composer.noMicrophones`),fallbackLabel:e=>b(`chat.composer.microphoneFallback`,{number:String(e)}),dataAttribute:`microphone`,onRefresh:e.onMicrophoneRefresh,onSelect:e.onMicrophoneSelect})}function el(e){return Qc({state:e.camera,title:b(`chat.composer.cameraInput`),systemDefaultLabel:b(`chat.composer.systemDefaultCamera`),emptyLabel:b(`chat.composer.noCameras`),fallbackLabel:e=>b(`chat.composer.cameraFallback`,{number:String(e)}),dataAttribute:`camera`,onRefresh:e.onCameraRefresh,onSelect:e.onCameraSelect})}function tl(e){let t=e.chatFollowUpMode??`server`,n=e.serverQueueMode??b(`chat.followUpModeLoading`),r=e.chatFollowUpMode?b(`chat.followUpModeOverriding`,{mode:n}):k,i=G(E.chatMessageMaxWidth,e.chatMessageMaxWidth!==void 0),a=G(e.chatSendShortcutResetValue===`modifier-enter`?b(`chat.sendShortcutModifierEnter`):b(`chat.sendShortcutEnter`),e.chatSendShortcutOverridden),o=Xc(e.chatSendShortcutProvenance),s=Xc(e.chatFollowUpModeProvenance),c=G(b(`chat.catalogOpenTargetViewer`),e.catalogOpenTarget!==E.catalogOpenTarget),l=G(b(`common.enabled`),e.composerHoldToRecord!==E.composerHoldToRecord),u=G(b(`common.enabled`),e.chatShowTaskProgress!==E.chatShowTaskProgress),d=G(b(`common.disabled`),e.chatCollapseTaskProgress!==E.chatCollapseTaskProgress);return O`
    <section id=${y.chat} class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`configView.chatPrefs.title`)}</h2>
      </div>
      <div class="settings-group">
        ${U({title:b(`configView.chatPrefs.messageWidth`),description:O`${b(`configView.chatPrefs.messageWidthHint`)}<br />
            ${i} ${b(`quickSettings.personal.browserOnly`)}`,control:O`
            <input
              class="settings-input"
              data-settings-chat-message-width
              aria-label=${b(`configView.chatPrefs.messageWidth`)}
              type="text"
              spellcheck="false"
              placeholder="48rem"
              .value=${e.chatMessageMaxWidth??``}
              @change=${t=>{let n=t.currentTarget,r=ze(n.value);if(n.value.trim()&&!r){n.setCustomValidity(b(`configView.chatPrefs.messageWidthInvalid`)),n.reportValidity();return}n.setCustomValidity(``),n.value=r??``,e.setChatMessageMaxWidth(r)}}
            />
          `})}
        ${H({title:b(`configView.chatPrefs.showTaskProgress`),description:O`${b(`configView.chatPrefs.showTaskProgressHint`)}<br />
            ${u} ${b(`quickSettings.personal.browserOnly`)}`,checked:e.chatShowTaskProgress,onChange:e.setChatShowTaskProgress})}
        ${H({title:b(`configView.chatPrefs.collapseTaskProgress`),description:O`${b(`configView.chatPrefs.collapseTaskProgressHint`)}<br />
            ${d} ${b(`quickSettings.personal.browserOnly`)}`,checked:e.chatCollapseTaskProgress,onChange:e.setChatCollapseTaskProgress,disabled:!e.chatShowTaskProgress})}
        ${J({title:b(`chat.sendShortcut`),value:e.chatSendShortcut,setting:`send-shortcut`,description:O`${a} ${o}`,options:[{value:`enter`,label:b(`chat.sendShortcutEnter`)},{value:`modifier-enter`,label:b(`chat.sendShortcutModifierEnter`)}],onChange:t=>e.setChatSendShortcut(_t(t))})}
        ${U({title:b(`chat.followUpMode`),description:O`${r} ${s}`,control:O`
            <select
              class="settings-select"
              data-settings-follow-up-mode
              aria-label=${b(`chat.followUpMode`)}
              .value=${t}
              @change=${t=>{let n=t.currentTarget.value;e.setChatFollowUpMode(n===`server`?void 0:mt(n))}}
            >
              <option value="server" ?selected=${t===`server`}>
                ${b(`chat.followUpModeServer`,{mode:n})}
              </option>
              <option value="steer" ?selected=${t===`steer`}>
                ${b(`chat.followUpModeSteer`)}
              </option>
              <option value="queue" ?selected=${t===`queue`}>
                ${b(`chat.followUpModeQueue`)}
              </option>
            </select>
            ${e.chatFollowUpModeOverridden?O`<button
                    type="button"
                    class="btn btn--sm"
                    @click=${e.resetChatFollowUpMode}
                  >
                    ${b(`chat.followUpModeReset`)}
                  </button>`:k}
          `})}
        ${J({title:b(`chat.catalogOpenTarget`),value:e.catalogOpenTarget,setting:`catalog-open-target`,description:O`${c}
          ${b(`quickSettings.personal.browserOnly`)}`,options:[{value:`viewer`,label:b(`chat.catalogOpenTargetViewer`)},{value:`terminal`,label:b(`chat.catalogOpenTargetTerminal`)}],onChange:t=>e.setCatalogOpenTarget(Ie(t))})}
        ${H({title:b(`configView.chatPrefs.openLinksExternally`),description:O`${b(`configView.chatPrefs.openLinksExternallyHint`)}<br />
            ${b(`configView.chatPrefs.openLinksExternallyStorage`)}`,checked:e.openLinksExternally,onChange:e.setOpenLinksExternally})}
        ${$c(e)} ${el(e)}
        ${H({title:b(`chat.composer.holdToRecordSetting`),description:O`${b(`chat.composer.holdToRecordSettingDescription`)}<br />
            ${l} ${b(`quickSettings.personal.browserOnly`)}`,checked:e.composerHoldToRecord,onChange:e.setComposerHoldToRecord})}
      </div>
    </section>
  `}function nl(e){let{lobsterPetVisits:t,lobsterPetSounds:n}=e,r=vn.find(t=>t.id===e.theme)??e.themeCatalog?.themes.find(t=>t.id===e.theme),i=an(r).mascot===`none`?O`<br />${b(`quickSettings.appearance.lobsterVisitsThemeHidden`,{theme:r?.source===`builtin`?b(`configView.themes.${r.id}.label`):r?.name??e.theme})}`:k,a=G(b(`common.enabled`),t!==E.lobsterPetVisits),o=G(b(`common.disabled`),n!==E.lobsterPetSounds),c=Ai(),l=xi.filter(e=>c.has(e.id)).length;return O`
    <section class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`quickSettings.appearance.lobsterdex`)}</h2>
      </div>
      <div class="settings-group">
        ${H({title:b(`quickSettings.appearance.lobsterVisits`),description:O`${b(t?`quickSettings.appearance.lobsterVisitsOn`:`quickSettings.appearance.lobsterVisitsOff`)}<br />
            ${a}
            ${b(`quickSettings.personal.browserOnly`)}${i}`,checked:t,onChange:e.setLobsterPetVisits})}
        ${H({title:b(`quickSettings.appearance.lobsterSounds`),description:O`${b(n?`quickSettings.appearance.lobsterSoundsOn`:`quickSettings.appearance.lobsterSoundsOff`)}<br />
            ${o} ${b(`quickSettings.personal.browserOnly`)}`,checked:n,onChange:e.setLobsterPetSounds,onAct:e=>{e&&ki()}})}
        ${U({title:b(`quickSettings.appearance.lobsterdex`),description:b(`quickSettings.appearance.lobsterdexSeen`,{seen:String(l),total:String(xi.length)}),stacked:!0,control:O`
            <div class="lobsterdex__gallery">
              <div class="lobsterdex">
                ${xi.map(e=>{let t=Di(e),n=c.get(e.id),r=n!==void 0,i=n?.shinySeenAt!=null,a=r?n.name??Si(e.id):`?`,o=i?`${a} ✦`:a,s=Ti[e.id],l=r?s.flavor:s.hint,u=r&&n.firstSeenAt!==null?b(`quickSettings.appearance.lobsterdexFirstVisited`,{name:a,date:new Date(n.firstSeenAt).toLocaleDateString()}):null,d=[o,l,u].filter(e=>e!==null).join(`
`);return O`
                    <openclaw-tooltip>
                      <span
                        class="lobsterdex__mini lobster-pet--palette-${e.id} ${r?``:`lobsterdex__mini--unseen`}"
                        style=${Oi(t)}
                        tabindex="0"
                        role="img"
                        aria-label=${d}
                      >
                        ${bi(t,{standalone:!0})}
                        ${i?O`<span class="lobsterdex__mini-star" aria-hidden="true">✦</span>`:k}
                      </span>
                      <span slot="content" class="lobsterdex__tooltip">
                        <strong>${o}</strong>
                        <span>${l}</span>
                        ${u?O`<span>${u}</span>`:k}
                      </span>
                    </openclaw-tooltip>
                  `})}
              </div>
              ${e.lobsterdexHref?O`<a
                      class="btn btn--sm lobsterdex__open"
                      href=${e.lobsterdexHref}
                      @click=${t=>{s(t)&&(t.preventDefault(),e.onOpenLobsterdex?.())}}
                      >${b(`quickSettings.appearance.lobsterdexOpen`)}</a
                    >`:k}
            </div>
          `})}
      </div>
    </section>
  `}function rl(e){let t=[...e.hiddenSessionCatalogIds].toSorted(),n=G(b(`common.enabled`),e.sidebarLiveActivity!==E.sidebarLiveActivity),r=e.sessionDeleteConfirm,i=G(b(`common.enabled`),r!==E.sessionDeleteConfirm);return O`
    <section id=${y.sidebar} class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`configView.sidebarPrefs.title`)}</h2>
      </div>
      <p class="settings-section__desc">${b(`configView.sidebarPrefs.hint`)}</p>
      <div class="settings-group">
        ${H({title:b(`configView.sidebarPrefs.liveActivity`),description:O`${b(`configView.sidebarPrefs.liveActivityHint`)}<br />
            ${n} ${b(`quickSettings.personal.browserOnly`)}`,checked:e.sidebarLiveActivity,onChange:e.setSidebarLiveActivity})}
        ${H({title:b(`configView.sidebarPrefs.deleteConfirm`),description:O`${b(`configView.sidebarPrefs.deleteConfirmHint`)}<br />
            ${i} ${b(`quickSettings.personal.browserOnly`)}`,checked:r,onChange:e.setSessionDeleteConfirm})}
      </div>
      ${t.length>0?O`
              <div class="settings-section__header settings-section__header--subsection">
                <h3 class="settings-section__heading">
                  ${b(`chat.sidebar.hiddenSessionSections`)}
                </h3>
              </div>
              <div class="settings-group">
                ${t.map(t=>U({title:e.hiddenSessionCatalogLabels.get(t)??t,description:b(`quickSettings.personal.browserOnly`),control:O`<button
                      type="button"
                      class="btn btn--sm"
                      @click=${()=>e.setSessionCatalogHidden(t,!1)}
                    >
                      ${b(`chat.sidebar.showSessionSection`)}
                    </button>`}))}
              </div>
            `:k}
      <div class="settings-section__header settings-section__header--subsection">
        <h3 class="settings-section__heading">${b(`configView.sessionObserver.title`)}</h3>
      </div>
      <p class="settings-section__desc">${b(`configView.sessionObserver.hint`)}</p>
      ${ls({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 il(){return(il=e((()=>{A(),nn(),nt(),_i(),wi(),Ci(),Ei(),ge(),z(),a(),Yc(),_(),ds(),va()})))()}function al(e,t){return(e===`custom`||e.includes(`/`))&&t!==e?O`<span class="settings-theme-card__icon" aria-hidden="true"
      >${T.download}</span
    >`:O`
    <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 ol(e){return e.hasCustomTheme&&e.customThemeLabel?e.customThemeLabel:b(`configView.appearance.importedTheme`)}function sl(){(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:Xr()}),e.focus(),e.select())})}function cl(e,t){let n=Object.entries($e).map(([e,t])=>({value:e,label:e===`system`?b(`configView.appearance.fonts.system`):t.label,description:b(`configView.appearance.fontNotes.${e}`),labelStyle:`font-family: ${t.stack}`}));return O`
    <section id=${y.typography} class="settings-section">
      <div class="settings-section__header">
        <h2 class="settings-section__heading">${b(`configView.appearance.typography`)}</h2>
      </div>
      <div class="settings-group">
        ${[`ui`,`chat`].map(r=>{let i=r===`ui`,a=b(`configView.appearance.fonts.${r}`),o=Te(t.id)[r];return U({title:a,description:Xc(i?e.fontUiProvenance:e.fontChatProvenance),stackedOnNarrow:!0,control:Hr({id:`settings-font-${r}`,label:a,value:(i?e.fontUi:e.fontChat)??`theme`,options:[{value:`theme`,label:b(`configView.appearance.fonts.themeDefault`),description:b(`configView.appearance.fonts.themeFace`,{theme:t.label,face:$e[o].label}),labelStyle:`font-family: ${$e[o].stack}`},...n],onOpen:Qe,onChange:t=>(i?e.setFontUi:e.setFontChat)(we(t))})})})}
        <div class="settings-row settings-row--stacked">
          <div class="settings-typography-preview">
            <div class="settings-typography-preview__caption">
              ${b(`configView.appearance.fonts.previewCaption`)}
            </div>
            <p class="settings-typography-preview__prose">
              ${b(`configView.appearance.fonts.previewProse`)}
            </p>
            <code class="settings-typography-preview__code"
              >${b(`configView.appearance.fonts.previewCode`)}</code
            >
          </div>
        </div>
      </div>
    </section>
  `}function ll(e){let t=e.viewState,n=e.hasCustomTheme||e.customThemeImportExpanded===!0;n&&e.customThemeImportFocusToken!=null&&e.customThemeImportFocusToken!==t.lastCustomThemeImportFocusToken&&(t.lastCustomThemeImportFocusToken=e.customThemeImportFocusToken,sl());let r=ol(e),i=[...(e.themeCatalog?.themes.length?e.themeCatalog.themes:vn).map(e=>({id:e.id,label:e.source===`builtin`?b(`configView.themes.${e.id}.label`):e.name,description:e.source===`builtin`?b(`configView.themes.${e.id}.description`):e.description})),{id:`custom`,label:e.hasCustomTheme?r:b(`configView.appearance.import`),description:e.hasCustomTheme?b(`configView.appearance.importedFrom`,{name:r}):b(`configView.appearance.importHint`)}],a=i.find(t=>t.id===e.theme),o=e.themeCatalog?.unavailableId===e.theme||e.theme.includes(`/`)&&!!e.themeCatalog?.themes.length&&!a,s=a??{id:E.theme,label:b(`configView.themes.claw.label`)},c=i.find(t=>t.id===e.themeResetValue)?.label??b(`configView.themes.claw.label`),l=e.themeModeResetValue===`light`?b(`common.light`):e.themeModeResetValue===`dark`?b(`common.dark`):b(`common.system`),u=Xc(e.themeProvenance),d=Xc(e.themeModeProvenance),ee=Xc(e.accentProvenance),te=e.accent===`theme`,f=te?void 0:e.accent,p=e.accent===e.accentResetValue||te&&e.accentResetValue===void 0,m=e.accentResetValue&&e.accentResetValue!==`theme`?e.accentResetValue:`var(--theme-chip-accent)`,h=!(p||te||!e.accent||dl.some(t=>t.hex===e.accent)),g=dl.find(t=>t.hex!==void 0&&t.hex===e.accent),ne=te?b(`configView.appearance.usingThemeAccent`):p?null:b(`configView.appearance.usingAccent`,{value:b(g?g.labelKey:`configView.appearance.customAccent`)});return O`
    <div class="settings-page" ${w({settingsPage:!0})}>
      ${Zc(e)}
      <section id=${y.theme} class="settings-section">
        <div class="settings-section__header">
          <h2 class="settings-section__heading">${b(`configView.appearance.theme`)}</h2>
        </div>
        <p class="settings-section__desc">
          ${b(`configView.appearance.chooseTheme`)}
          ${G(c,e.themeOverridden)}
          ${u}
        </p>
        ${o?O`<p class="settings-section__desc" role="status">
                ${b(`configView.appearance.themeUnavailable`,{id:e.theme})}
              </p>`:k}
        ${e.themeCatalog?.error?O`<p class="settings-status settings-status--error" role="alert">
                ${e.themeCatalog.error}
                <button type="button" class="btn btn--sm" @click=${e.onRetryThemeCatalog}>
                  ${b(`common.retry`)}
                </button>
              </p>`:k}
        <div class="settings-group">
          <div class="settings-row settings-row--stacked">
            <div class="settings-theme-grid">
              ${i.map(t=>O`
                  <button
                    class="settings-theme-card settings-theme-card--${t.id.includes(`/`)?`custom`:t.id} ${t.id===s.id?`settings-theme-card--active`:``}"
                    aria-pressed=${t.id===`custom`&&!e.hasCustomTheme?k:String(t.id===s.id)}
                    title=${t.description}
                    data-theme-id=${t.id}
                    @click=${()=>{if(t.id===`custom`&&!e.hasCustomTheme){e.onOpenCustomThemeImport?.();return}(t.id!==e.theme||t.id===e.themeResetValue&&e.themeOverridden)&&e.setTheme(t.id)}}
                  >
                    ${al(t.id,s.id)}
                    <span class="settings-theme-card__label">${t.label}</span>
                  </button>
                `)}
            </div>
          </div>
          ${U({title:b(`common.colorMode`),description:O`${G(l,e.themeModeOverridden)}
            ${d}`,stackedOnNarrow:!0,control:Or({value:e.themeMode,options:[{value:`system`,label:b(`common.system`)},{value:`light`,label:b(`common.light`)},{value:`dark`,label:b(`common.dark`)}],ariaLabel:b(`common.colorMode`),onChange:t=>e.setThemeMode(t),onReselect:t=>{e.themeModeOverridden&&t===e.themeModeResetValue&&e.setThemeMode(t)}})})}
          <div class="settings-row settings-row--stacked">
            ${n?O`
                    <div class="settings-theme-import">
                      <div class="settings-theme-import__copy">
                        <div class="settings-theme-import__title">
                          ${b(`configView.appearance.importFromTweakcn`)}
                        </div>
                        <p class="settings-theme-import__hint">
                          ${b(`configView.appearance.tweakcnInstructions`)}
                        </p>
                      </div>
                      <a
                        class="settings-theme-import__external"
                        href="https://tweakcn.com/editor/theme"
                        target="_blank"
                        rel="noreferrer noopener"
                      >
                        ${b(`configView.appearance.browseTweakcn`)} ${T.externalLink}
                      </a>
                      <label class="settings-theme-import__field">
                        <span class="settings-theme-import__label"
                          >${b(`configView.appearance.themeLink`)}</span
                        >
                        <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)}
                        />
                      </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?b(`common.importing`):e.hasCustomTheme?b(`configView.appearance.replace`,{name:r}):b(`configView.appearance.importTheme`)}
                        </button>
                        ${e.hasCustomTheme?O`<button
                                class="btn btn--sm danger"
                                @click=${e.onClearCustomTheme}
                              >
                                ${b(`configView.appearance.clear`,{name:r})}
                              </button>`:k}
                      </div>
                      ${e.hasCustomTheme?O`<div class="settings-theme-import__meta">
                              <span class="settings-theme-import__meta-label"
                                >${b(`configView.appearance.loaded`)}</span
                              >
                              <span class="settings-theme-import__meta-value"
                                >${r} · ${e.customThemeSourceUrl??`tweakcn`}</span
                              >
                            </div>`:k}
                      ${e.customThemeImportMessage?O`<div
                              class="settings-theme-import__message settings-theme-import__message--${e.customThemeImportMessage.kind}"
                              role=${e.customThemeImportMessage.kind===`error`?`alert`:`status`}
                            >
                              ${e.customThemeImportMessage.text}
                            </div>`:k}
                    </div>
                  `:O`<p class="settings-theme-import__inline-hint">
                    ${b(`configView.appearance.inlineHintBefore`)}
                    <strong>${b(`configView.appearance.import`)}</strong>
                    ${b(`configView.appearance.inlineHintAfter`)}
                  </p>`}
          </div>
        </div>
      </section>

      <section id=${y.accent} class="settings-section">
        <div class="settings-section__header">
          <h2 class="settings-section__heading">${b(`configView.appearance.accent`)}</h2>
        </div>
        <p class="settings-section__desc">${b(`configView.appearance.accentHint`)}</p>
        <div class="settings-group">
          <div class="settings-row settings-row--stacked">
            <div class="settings-accent-swatches">
              ${dl.map(t=>{let n=t.hex===void 0,r=n?p:!p&&t.hex===e.accent,i=b(t.labelKey),a=n?` settings-accent-theme--${s.id.includes(`/`)?`custom`:s.id}`:``;return O`
                  <button
                    type="button"
                    class="settings-accent-swatch${a} ${r?`settings-accent-swatch--active`:``}"
                    style=${kt({"--settings-accent-swatch":t.hex??m})}
                    data-accent-preset=${t.id}
                    aria-label=${i}
                    aria-pressed=${String(r)}
                    title=${i}
                    @click=${()=>e.setAccent(t.hex)}
                  >
                    ${n&&!p?O`<span class="settings-accent-swatch__reset" aria-hidden="true"
                            >${T.rotateCcw}</span
                          >`:r?O`<span class="settings-accent-swatch__check" aria-hidden="true"
                              >${T.check}</span
                            >`:k}
                  </button>
                `})}
              <span
                class="settings-accent-swatch settings-accent-swatch--custom ${h?`settings-accent-swatch--active`:``}"
                style=${kt({"--settings-accent-swatch":f??dl[1].hex,"--settings-accent-swatch-ink":dt(f??dl[1].hex)})}
              >
                <input
                  type="color"
                  class="settings-accent-swatch__input"
                  data-accent-custom
                  aria-label=${b(`configView.appearance.customAccent`)}
                  aria-describedby="settings-accent-status"
                  title=${b(`configView.appearance.customAccent`)}
                  .value=${f??dl[1].hex}
                  @input=${t=>e.setAccent(t.currentTarget.value)}
                />
                <span class="settings-accent-swatch__picker" aria-hidden="true"
                  >${T.pipette}</span
                >
              </span>
            </div>
          </div>
        </div>
        <p id="settings-accent-status" class="settings-section__desc settings-accent-status">
          ${ne?O`<span class="settings-accent-status__selection"
                  >${ne}</span
                >`:k}
          <span class="settings-accent-status__scope">${ee}</span>
        </p>
      </section>

      ${cl(e,s)}

      <section id=${y.textSize} class="settings-section">
        <div class="settings-section__header">
          <h2 class="settings-section__heading">${b(`configView.appearance.textSize`)}</h2>
        </div>
        <p class="settings-section__desc">
          ${G(`${E.textScale}%`,e.textScaleOverridden)}
          ${b(`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">
                ${Ue.map(t=>O`
                    <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">${b(ul[t])}</span>
                      <span class="settings-text-scale__label">${t}%</span>
                    </button>
                  `)}
              </div>
            </div>
          </div>
        </div>
      </section>

      ${rl(e)} ${nl(e)}
      ${tl(e)} ${Ec(e)}

      <section id=${y.connection} class="settings-section">
        <div class="settings-section__header">
          <h2 class="settings-section__heading">${b(`configView.connection.title`)}</h2>
        </div>
        <div class="settings-group">
          ${U({title:b(`configView.connection.gateway`),control:W(e.gatewayUrl||`-`,{mono:!0})})}
          ${U({title:b(`configView.connection.status`),control:V({kind:e.connected?`ok`:`muted`,label:e.connected?b(`common.connected`):b(`common.offline`)})})}
          ${e.assistantName?U({title:b(`configView.connection.assistant`),control:W(e.assistantName)}):k}
        </div>
      </section>
    </div>
  `}var ul,dl;function fl(){return(fl=e((()=>{A(),At(),nn(),nt(),D(),_e(),ct(),Pr(),z(),a(),_(),Oc(),il(),ul={90:`configView.textSizes.small`,100:`configView.textSizes.default`,110:`configView.textSizes.large`,125:`configView.textSizes.xl`,140:`configView.textSizes.xxl`},dl=[{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 pl(e){return e.length>0?e.join(`.`):b(`configView.root`)}function ml(e,t){let n=[],r=0;function i(e,t,r){n.length<Cl&&n.push({path:e,from:t,to:r})}function a(e,t,n){if(e.length!==t.length||e.length>wl)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>Sl||n>xl?!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>Sl||s>xl||n.length>=Cl||e===t)return;if(typeof e!=typeof t||typeof e!=`object`||!e||t===null){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 hl(e,n,r){if(e.rawDiffCache?.original===n&&e.rawDiffCache.current===r)return e.rawDiffCache.diff;if(n.length>Tl||r.length>Tl)return e.rawDiffCache={original:n,current:r,diff:[]},e.rawDiffCache.diff;try{let i=P(t(n)),a=P(t(r));if(!i||!a)return e.rawDiffCache={original:n,current:r,diff:[]},[];let o=ml(i,a);return e.rawDiffCache={original:n,current:r,diff:o},o}catch{return te()&&(e.rawDiffCache={original:n,current:r,diff:[]}),[]}}function gl(e,t=40){if(Array.isArray(e))return b(e.length===1?`configView.itemCount`:`configView.itemCountPlural`,{count:String(e.length)});let n;try{n=JSON.stringify(e)??String(e)}catch{n=String(e)}return n.length<=t?n:Yn(n,t-3)+`...`}function _l(e,t){let n=e.split(`.`);return n.length===t.length&&n.every((e,n)=>e===`*`||e===t[n])}function vl(e,t){return Object.entries(t).some(([t,n])=>!!n.sensitive&&_l(t,e))}function yl(e,t){for(let n=1;n<=e.length;n+=1){let r=e.slice(0,n),i=pl(r);if((pe(r,t)?.sensitive??!1)||vl(r,t)||oa(i))return!0}return!1}function bl(e,t,n,r){let i=aa(t,e,n)>0;return!r&&t!=null&&(yl(e,n)||i)?ca():gl(t)}var xl,Sl,Cl,wl,Tl;function El(){return(El=e((()=>{la(),sa(),a(),ne(),xl=64,Sl=2e4,Cl=1e3,wl=2e3,Tl=2e5})))()}function Dl(e){return Ol.has(e)}var Ol;function kl(){return(kl=e((()=>{Ol=new Set([`defaults`,`modelByChannel`])})))()}function Al(e,t){let n=Object.entries(e.properties??{}),r=n.filter(([e])=>!Dl(e)).map(([e,n])=>({key:e,label:re([`channels`,e],t)?.label??n.title??ce(e),keys:[e]})).toSorted((e,t)=>e.label.localeCompare(t.label)||e.key.localeCompare(t.key)),i=n.filter(([e])=>Dl(e)).map(([e])=>e);return[...r,...i.length>0?[{key:null,label:b(`configView.categories.other`),keys:i}]:[]]}function jl(e){return Nl[e]??T.file}function Ml(e,t,n){return O`
    <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 O`
          <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">
                ${jl(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="9 6 15 12 9 18"></polyline>
              </svg>
            </button>
            <div id=${i} class="config-accordion-group__items" ?hidden=${!r}>
              ${t.sections.map(t=>O`<button
                  class="config-accordion-group__item ${e.activeSection===t.key?`config-accordion-group__item--active`:``}"
                  aria-current=${e.activeSection===t.key?`true`:k}
                  @click=${r=>{e.onSectionChange(t.key),n(r.currentTarget)}}
                >
                  <span class="config-accordion-group__item-icon">
                    ${jl(t.key)}
                  </span>
                  ${t.label}
                </button>`)}
            </div>
          </div>
        `})}
    </div>
  `}var Nl,Pl,Fl;function Il(){return(Il=e((()=>{A(),kl(),sa(),ct(),a(),Nl={all:T.layoutGrid,env:T.settings,update:T.download,agents:T.bot,auth:T.lock,channels:T.messageSquare,messages:T.mail,commands:T.terminal,hooks:T.link,skills:T.star,tools:T.wrench,gateway:T.globe,wizard:T.wandSparkles,meta:T.penLine,logging:T.fileText,browser:T.chrome,ui:T.panelsTopLeft,models:T.box,bindings:T.server,broadcast:T.radio,tts:T.music,transcripts:T.book,session:T.users,cron:T.clock,discovery:T.search,talk:T.mic,plugins:T.asterisk,diagnostics:T.activity,cli:T.terminal,secrets:T.key,acp:T.users,mcp:T.server,__appearance__:T.sun,__notifications__:T.bell},Pl=[{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`,`transcripts`]},{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`]}],Fl=new Set(Pl.flatMap(e=>e.sections))})))()}function Ll(){return{rawRevealed:!1,rawDiffOpen:!1,envRevealed:!1,validityDismissed:!1,revealedSensitivePaths:new Set,lastCustomThemeImportFocusToken:null,lastConfigContextKey:null,lastFormModeForScroll:null}}function Rl(e){e.rawRevealed=!1,e.rawDiffOpen=!1,e.envRevealed=!1,e.validityDismissed=!1,e.revealedSensitivePaths.clear(),e.lastCustomThemeImportFocusToken=null,e.rawDiffCache=void 0}function zl(e){let t=e.includeSections?.join(``)??``,n=e.excludeSections?.join(``)??``;return[e.configPath??``,e.gatewayUrl,e.navRootLabel??``,t,n].join(``)}function Bl(e,t){let n=ue(t);return n?e.revealedSensitivePaths.has(n):!1}function Vl(e,t){let n=ue(t);n&&(e.revealedSensitivePaths.has(n)?e.revealedSensitivePaths.delete(n):e.revealedSensitivePaths.add(n))}function Hl(){return(Hl=e((()=>{sa()})))()}function Ul(e){let t=e.renderSection??(e=>e),n=e.viewState,r=e.showModeToggle??!1,i=e.showRootTab??!0,a=e.valid==null?`unknown`:e.valid?`valid`:`invalid`,o=e.includeVirtualSections??!0,s=e.includeSections?.length?new Set(e.includeSections):null,c=e.excludeSections?.length?new Set(e.excludeSections):null,l=Sc(n,xc(e.schema),s,c),u=l.unsupportedPaths.filter(t=>t!==`<root>`&&(!e.activeSection||t===e.activeSection||t.startsWith(`${e.activeSection}.`))&&Cc(e.formValue,t)),d=u.length>0,ee=e.forceShowAdvanced===!0||e.showAdvancedSettings,f=e.rawAvailable??!0,p=!!e.rawDraftPending&&f,m=r&&f?e.formMode:`form`,h=p?`raw`:m,g=e.onViewStateChange,ne=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))})};n.lastFormModeForScroll!==null&&n.lastFormModeForScroll!==h&&ne(null),n.lastFormModeForScroll=h;let re=zl(e);n.lastConfigContextKey!==re&&(Rl(n),n.lastConfigContextKey=re);let _=n.envRevealed,v=l.schema?.properties??{},ae=new Set([`__appearance__`,`__notifications__`]),oe=e=>o&&ae.has(e)&&(e===`__appearance__`||s?.has(e)===!0),se=e=>b(`configView.sections.${e===`__appearance__`?`theme`:e===`__notifications__`?`notifications`:e}`),ce=Pl.map(e=>({id:e.id,label:b(`configView.categories.${e.id}`),sections:e.sections.filter(e=>(oe(e)||e in v)&&(!s||s.has(e))&&(!c||!c.has(e))).map(e=>({key:e,label:se(e)}))})).filter(e=>e.sections.length>0),y=Object.keys(v).filter(e=>!Fl.has(e)).map(e=>({key:e,label:e.charAt(0).toUpperCase()+e.slice(1)})),le=y.length>0?{id:`other`,label:b(`configView.categories.other`),sections:y}:null,x=e.activeSection===`channels`?v.channels:void 0,ue=x?Al(x,e.uiHints):[],de=ue.find(t=>t.key===e.activeSubsection)??ue[0],fe=x&&de?{...l.schema,properties:{...v,channels:{...x,properties:Object.fromEntries(Object.entries(x.properties??{}).filter(([e])=>de.keys.includes(e))),required:x.required?.filter(e=>de.keys.includes(e)),additionalProperties:!1}}}:l.schema,S=fe?.properties?.wizard,pe=S&&(!e.activeSection||e.activeSection===`wizard`),me=S?{...fe,properties:Object.fromEntries(Object.entries(fe.properties??{}).filter(([e])=>e!==`wizard`))}:fe,he=[...ce,...le?[le]:[]],ge=[...i?[{key:null,label:e.navRootLabel??b(`nav.settings`)}]:[],...he.flatMap(e=>e.sections)],_e=e.settingsLayout??`tabs`,C=h===`raw`&&e.raw!==e.originalRaw;C||(n.rawDiffOpen=!1),(!C||!n.rawDiffOpen)&&(n.rawDiffCache=void 0);let ve=C&&n.rawDiffOpen?hl(n,e.originalRaw,e.raw):[];C&&n.rawDiffOpen&&!te()&&ie().then(()=>g()).catch(()=>void 0);let ye=e.loading||e.saving||e.applying||e.updating,be=e.mutationAllowed!==!1,xe=e.connected&&be&&!ye&&C,Se=o&&h===`form`&&e.activeSection===null&&!!s?.has(`__appearance__`),Ce=C?O`<details
        class="config-diff"
        ?open=${n.rawDiffOpen}
        @toggle=${e=>{let t=e.target;n.rawDiffOpen!==t.open&&(n.rawDiffOpen=t.open,t.open||(n.rawDiffCache=void 0),g())}}
      >
        <summary class="config-diff__summary">
          <span>${b(`configView.viewPendingChangesRaw`)}</span>
          <svg
            class="config-diff__chevron"
            viewBox="0 0 24 24"
            fill="none"
            stroke="currentColor"
            stroke-width="2"
          >
            <polyline points="9 6 15 12 9 18"></polyline>
          </svg>
        </summary>
        <div class="config-diff__content">
          ${ve.length>0?ve.map(t=>O`<div class="config-diff__item">
                    <div class="config-diff__path">${pl(t.path)}</div>
                    <div class="config-diff__values">
                      <span class="config-diff__from"
                        >${bl(t.path,t.from,e.uiHints,n.rawRevealed)}</span
                      >
                      <span class="config-diff__arrow">→</span>
                      <span class="config-diff__to"
                        >${bl(t.path,t.to,e.uiHints,n.rawRevealed)}</span
                      >
                    </div>
                  </div>`):O`<div class="config-diff__item">${b(`configView.rawDiffUnavailable`)}</div>`}
        </div>
      </details>`:k,we=_e!==`accordion`&&ge.length>1,Te=we?Fr({id:`config-sections`,active:e.activeSection??`root`,tabs:ge.map(e=>({value:e.key??`root`,label:e.label})),ariaLabel:b(`common.settingsSections`),panelId:`config-section-panel`,onSelect:t=>e.onSectionChange(t===`root`?null:t),onActivate:ne}):k,Ee=r||we,De=a===`invalid`&&!n.validityDismissed,Oe=Ee||_e===`accordion`||De||!!de,ke=O`<div class="config-lead">
    ${Ee?O`<div class="config-toolbar">
            ${r?Or({mode:`buttons`,variant:`primary`,value:h,onChange:e.onFormModeChange,onReselect:e.onFormModeChange,options:[{value:`form`,label:b(`configView.form`),disabled:e.schemaLoading||!e.schema||p,title:p?b(`configView.rawDraftPendingFormTitle`):d?b(`configView.formUnsafeTitle`):``},{value:`raw`,label:b(`configView.raw`),disabled:!f,title:b(f?`configView.rawTitle`:`configView.rawUnavailableTitle`)}]}):k}
            ${Te}
          </div>`:k}
    ${_e===`accordion`?Ml(e,he,ne):k}
    ${de&&h===`form`?O`<div class="config-toolbar">
            <label class="field">
              <span>${b(`configView.channelSettings`)}</span>
              <select
                class="settings-select"
                .value=${de.key??``}
                @change=${t=>{let n=t.currentTarget;e.onSubsectionChange(n.value||null),ne(t.currentTarget)}}
              >
                ${ue.map(e=>O`<option
                      value=${e.key??``}
                      ?selected=${e.key===de.key}
                    >
                      ${e.label}
                    </option>`)}
              </select>
            </label>
          </div>`:k}
    ${De?O`<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">${b(`configView.invalidConfig`)}</span>
            <button
              class="btn btn--sm"
              @click=${()=>{n.validityDismissed=!0,g()}}
            >
              ${b(`configView.dismissWarning`)}
            </button>
          </div>`:k}
  </div>`;return O`
    ${Oe?ke:k}
    <div
      id="config-section-panel"
      class="config-content"
      role=${we?`tabpanel`:`region`}
      aria-labelledby=${we?`config-sections-tab-${e.activeSection??`root`}`:k}
      aria-label=${we?k:b(`common.settingsSections`)}
    >
      ${e.activeSection===`__appearance__`?o?ll(e):k:e.activeSection===`__notifications__`?o?gc(e):k:h===`form`?O`
                  ${d&&r&&f?O`<div class="config-content-callout">
                          <div class="callout info">
                            ${wc(u)}
                            <button
                              type="button"
                              class="btn btn--sm"
                              @click=${()=>e.onFormModeChange(`raw`)}
                            >
                              ${b(`configView.openRawEditor`)}
                            </button>
                          </div>
                        </div>`:k}
                  ${Se?ll(e):k}
                  ${e.schemaLoading?O`<div class="config-loading">
                          <div class="config-loading__spinner"></div>
                          <span>${b(`configView.loadingSchema`)}</span>
                        </div>`:t(ea({schema:me,uiHints:e.uiHints,value:e.formValue,embedded:e.embeddedEditor===!0||!!pe,rawAvailable:f,disabled:ye||!e.formValue||!be,unsupportedPaths:l.unsupportedPaths,onPatch:e.onFormPatch,onRemove:e.onFormRemove,activeSection:e.activeSection,activeSubsection:null,showAdvanced:ee,forceAdvancedSection:e.forceAdvancedSection,onShowAdvanced:()=>e.setShowAdvancedSettings(!0),onHideAdvanced:e.forceShowAdvanced?void 0:()=>e.setShowAdvancedSettings(!1),sectionActions:e.activeSection===`env`?O`<button
                                    class="btn btn--sm ${_?`active`:``}"
                                    aria-pressed=${_?`true`:`false`}
                                    title=${b(_?`configView.hideEnvValues`:`configView.revealEnvValues`)}
                                    @click=${()=>{n.envRevealed=!n.envRevealed,g()}}
                                  >
                                    ${_?T.eyeOff:T.eye}
                                    ${b(`configView.peek`)}
                                  </button>`:void 0,showSectionDocs:e.showSectionDocs,sectionPrelude:e.sectionPrelude,revealSensitive:e.activeSection===`env`&&_,maskSensitive:!0,isSensitivePathRevealed:e=>Bl(n,e),onToggleSensitivePath:e=>{Vl(n,e),g()}}))}
                  ${pe&&!e.schemaLoading?yc(S,e,ye||!e.formValue||!be):k}
                `:(()=>{let t=aa(e.formValue,[],e.uiHints),r=t>0&&!n.rawRevealed;return O`<div
                    class="settings-page"
                    ${w({settingsPage:!0})}
                  >
                    ${Ce}
                    <!-- 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?O`<button class="btn btn--sm" @click=${e.onOpenFile}>
                                  ${T.fileText} ${b(`configView.open`)}
                                </button>`:k}
                          <button
                            class="btn btn--sm"
                            ?disabled=${ye||!C}
                            @click=${e.onRawDiscard}
                          >
                            ${b(`configView.rawDiscard`)}
                          </button>
                          <button
                            class="btn btn--sm primary"
                            ?disabled=${!xe}
                            aria-busy=${e.saving?`true`:`false`}
                            @click=${e.onSave}
                          >
                            ${e.saving?O`<span class="config-action-spinner" aria-hidden="true"
                                      >${T.loader}</span
                                    >${b(`common.saving`)}`:b(`common.save`)}
                          </button>
                        </div>
                        <div class="field config-raw-field">
                          <span style="display:flex;align-items:center;gap:8px;">
                            ${b(`configView.rawConfig`)}
                            ${t>0?O`<span class="settings-count"
                                      >${b(t===1?`configView.secretCount`:`configView.secretCountPlural`,{count:String(t)})}
                                      ${b(r?`configView.redacted`:`configView.visible`)}</span
                                    >
                                    <openclaw-tooltip
                                      .content=${b(r?`configView.revealSensitive`:`configView.hideSensitive`)}
                                    >
                                      <button
                                        class="btn btn--icon config-raw-toggle ${r?``:`active`}"
                                        aria-label=${b(`configView.toggleRawRedaction`)}
                                        aria-pressed=${!r}
                                        @click=${()=>{n.rawRevealed=!n.rawRevealed,g()}}
                                      >
                                        ${r?T.eyeOff:T.eye}
                                      </button>
                                    </openclaw-tooltip>`:k}
                          </span>
                          ${r?O`<div class="callout info" style="margin-top: 12px">
                                  ${b(t===1?`configView.sensitiveHidden`:`configView.sensitiveHiddenPlural`,{count:String(t)})}
                                </div>`:O`<textarea
                                  aria-label=${b(`configView.rawConfig`)}
                                  placeholder=${b(`configView.rawConfig`)}
                                  .value=${e.raw}
                                  ?disabled=${ye||!be}
                                  @input=${t=>{e.onRawChange(t.target.value)}}
                                ></textarea>`}
                        </div>
                      </div>
                    </div>
                  </div>`})()}
      ${e.issues.length>0?O`<div class="config-content-callout">
              <div class="callout danger">
                <pre class="code-block">
${Nt(yr(JSON.stringify(e.issues,null,2)))}</pre>
              </div>
            </div>`:k}
    </div>
  `}function Wl(){return(Wl=e((()=>{A(),Pt(),D(),sa(),ia(),Lr(),ct(),ge(),xr(),z(),a(),q(),ne(),vc(),bc(),fl(),El(),Il(),Tc(),Hl(),K(),ie().catch(()=>void 0)})))()}function Gl(){return{devices:[],permissionRequired:!0,loading:!1,error:null,loaded:!1,requestsPermission:!1}}function Kl(e){let t=Bi(e)?.[0]??null;if(t===null&&e!==`advanced`)throw Error(`Unknown config page`);return{activeSection:t,activeSubsection:null}}function ql(e,t,n){let r=Bi(e)??null;return e===`advanced`&&t&&Ui.has(t)?{activeSection:null,activeSubsection:null}:r&&(!t||!r.includes(t))?Kl(e):{activeSection:t,activeSubsection:n}}function Jl(e,t){let n=new URLSearchParams(t).get(`section`);return n?ql(e,n,null):Kl(e)}function Yl(e){switch(e){case`appearance`:return O`${b(`configView.appearance.intro`)}
      ${Cr(`https://docs.openclaw.ai/web/control-ui`)}`;case`mcp`:return Ga();case`security`:return O`${b(`quickSettings.security.intro`)}
      ${Cr(`https://docs.openclaw.ai/gateway/security`)}`;case`talk`:return O`${b(`talkPage.intro`)}
      ${Cr(`https://docs.openclaw.ai/nodes/talk`)}`;case`updates`:return b(`updates.page.intro`);default:return Se(e)}}function Xl(e){let t=P(e.gateway),n=P(t?.auth),r=P(e.tools),i=P(r?.exec)??{},a=P(e.browser),o=`unknown`;n&&(o=(typeof n.mode==`string`?n.mode.trim():``)||(n.password?`password`:n.token?`token`:n.trustedProxy?`trusted-proxy`:`none`));let s=r?.profile,c=i.security;return{gatewayAuth:o,execPolicy:typeof c==`string`&&c.trim()?c.trim():`allowlist`,browserEnabled:a?.enabled!==!1,browserEnabledOverridden:a!==null&&Object.hasOwn(a,`enabled`),toolProfile:typeof s==`string`?s.trim():``,toolProfileOverridden:r!==null&&Object.hasOwn(r,`profile`)}}function Zl(e){typeof document<`u`&&document.documentElement.style.setProperty(`--control-ui-text-scale`,(ke(e)/100).toFixed(2))}var Ql,$;function $l(){return($l=e((()=>{En(),sr(),A(),M(),ht(),rt(),Me(),vt(),Ze(),Fe(),yt(),tt(),nt(),at(),Ee(),Ar(),z(),Nr(),a(),q(),ui(),S(),u(),zt(),Bt(),$r(),Zr(),m(),ai(),n(),Jr(),hi(),da(),Ca(),Ta(),zi(),Oa(),Ba(),Ja(),$a(),ts(),Ii(),_(),is(),ds(),ps(),Ws(),rc(),Wl(),K(),Ql=new Map,$=class extends i{constructor(...e){super(...e),this.pageId=`advanced`,this.routeData=null,this.settings=Ke(),this.hiddenSessionCatalogIds=Mr(),this.systemInfo=null,this.systemInfoUnavailable=!1,this.sessionObserverModels=[],this.sessionObserverModelsUnavailable=!1,this.mediaDeviceWatch=null,this.mediaDevices={microphone:Gl(),camera:Gl()},this.cameraSelectionRequest=0,this.formModes={},this.selections={},this.customThemeImport=Ea,this.customThemeImportOwner=new Da(e=>{this.customThemeImport=e}),this.configViewState=Ll(),this.runtimeConfigSource=null,this.updateStatusClient=null,this.systemInfoPolling=new Wr(this,qr,()=>{this.systemInfoTask.status!==L.PENDING&&this.systemInfoTask.run()},!1,`visible`),this.updateCountdownPolling=new Wr(this,1e3,()=>this.requestUpdate(),!1),this.systemInfoTask=new ur(this,{autoRun:!1,args:()=>[this.gateway.gateway,this.systemInfoRequestClient()],task:([e,t],{signal:n})=>e&&t?Gr(e,n).then(e=>e.value):or,onComplete:e=>{this.systemInfo=e,this.systemInfoPolling.stop(),this.systemInfoPolling.start(),this.sessionObserverModelsTask.status!==L.PENDING&&this.sessionObserverModelsTask.run()},onError:e=>{(g(e)||ua(e))&&(this.systemInfo=null,this.systemInfoUnavailable=!0,this.systemInfoPolling.stop())}}),this.sessionObserverModelsTask=new ur(this,{args:()=>[this.gateway.gateway,this.systemInfo?this.systemInfoRequestClient():null,this.context?.settingsAgentSelection.state.selectedId??null],task:async([e,t,n],{signal:r})=>{if(!e||!t||!n)return this.resetSessionObserverModels(!n),or;let i=this.sessionObserverModelsTask.value;(i?.gateway!==e||i.client!==t||i.agentId!==n)&&this.resetSessionObserverModels();let{models:a}=await Xt(t,{agentId:n,preparedOnly:!0,signal:r});return{gateway:e,client:t,agentId:n,models:a}},onComplete:({models:e})=>{this.sessionObserverModels=e,this.sessionObserverModelsUnavailable=!1},onError:()=>this.resetSessionObserverModels(!0)}),this.sessionSourcePluginsTask=new ur(this,{args:()=>{let e=this.context?.gateway.snapshot;return[this.gateway.gateway,this.pageId===`appearance`&&Lt(e,`plugins.list`,`operator.read`)?e?.client:null]},task:async([,e],{signal:t})=>{if(!e)return null;let n=await e.request(`plugins.list`,{},{signal:t});return new Set(n.plugins.filter(e=>e.installed).map(e=>e.id))}}),this.hiddenSessionCatalogLabelsTask=new ur(this,{args:()=>{let e=this.context?.gateway.snapshot,t=[...this.hiddenSessionCatalogIds].toSorted();return[this.pageId===`appearance`&&t.length>0&&Lt(e,`sessions.catalog.list`,`operator.read`)?e?.client:null,this.context?.settingsAgentSelection.state.selectedId??null,t.join(`\0`)]},task:async([e,t],{signal:n})=>{if(!e)return Ql;try{let r=await e.request(`sessions.catalog.list`,{...t?{agentId:t}:{},metadataOnly:!0},{signal:n});return new Map(r.catalogs.map(e=>[e.id,e.label]))}catch{return Ql}}}),this.routeTargetScroll=new wa(this),this.gateway=new Kr(this,{getGateway:()=>this.context?.gateway,invalidateRequests:()=>this.invalidateSystemInfoRequest(),onSnapshot:e=>this.handleGatewaySnapshot(e),onPageActivation:()=>this.syncSystemInfoPolling()}),this.subscriptions=new le(this).watchStore(()=>this.context?.runtimeConfig,e=>this.synchronizeRuntimeConfig(e)).watchStore(()=>this.context?.overlays).watchStore(()=>this.context?.config).watchStore(()=>this.context?.settingsAgentSelection).watchStore(()=>this.context?.nativeDeviceSettings??void 0).watchStore(()=>this.context?.nativeNotifications??void 0).watchStore(()=>this.context?.webPush).watchStore(()=>this.context?.theme,()=>{this.settings=this.customThemeImportOwner.adoptSettings(this.settings,Ke(),this.context.theme.serverSelection)}),this.hiddenSessionCatalogsChanged=()=>{this.hiddenSessionCatalogIds=Mr()}}retireMediaPermissionRequests(){for(let e of Object.values(this.mediaDevices))e.requestsPermission=!1}connectedCallback(){super.connectedCallback(),this.hiddenSessionCatalogsChanged(),window.addEventListener(Ur,this.hiddenSessionCatalogsChanged),this.customThemeImportOwner.connect(this.context.gateway.connection.gatewayUrl,this.context.theme.serverSelection),this.settings=Ke(),this.mediaDeviceWatch=ei(()=>{this.refreshMediaDevices(`microphone`,!1),this.refreshMediaDevices(`camera`,!1)}),this.syncRouteData()}disconnectedCallback(){window.removeEventListener(Ur,this.hiddenSessionCatalogsChanged),this.customThemeImportOwner.retireImport(),this.retireMediaPermissionRequests(),this.mediaDeviceWatch?.(),this.mediaDeviceWatch=null,this.systemInfoPolling.stop(),this.updateCountdownPolling.stop(),this.runtimeConfigSource=null,this.resetConfigViewState(),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){if(e.has(`pageId`)&&e.get(`pageId`)!==void 0&&this.invalidateSystemInfoRequest(),this.syncSystemInfoPolling(),this.syncUpdateStatusRefresh(),this.syncUpdateCountdownPolling(),this.pageId===`appearance`)for(let e of[`microphone`,`camera`])this.mediaDevices[e].loaded||(this.mediaDevices[e].loaded=!0,this.refreshMediaDevices(e,!1))}async refreshMediaDevices(e,t){let n=this.mediaDevices[e];if(n.loading){n.requestsPermission||=t;return}n.loading=!0,n.requestsPermission=t,n.error=null,this.requestUpdate();try{let t=await(e===`microphone`?ri:Yr)(()=>n.requestsPermission);n.devices=t.devices,n.permissionRequired=t.permissionRequired,n.error=t.issue?ti(t.issue,e===`microphone`?`audioinput`:`videoinput`):null}catch(e){n.error=v(e)}finally{n.loading=!1,n.requestsPermission=!1,this.requestUpdate()}}syncRouteData(){let e=this.routeData?ql(this.pageId,this.routeData.section,null):Jl(this.pageId,globalThis.location?.search??``);this.selections={...this.selections,[this.pageId]:e};let t=this.routeData?.targetBlockId??me(globalThis.location?.hash??``);this.routeTargetScroll.setTarget(t)}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`&&Lt(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)}resetConfigViewState(){this.configViewState=Ll()}handleGatewaySnapshot({snapshot:e,initial:t,sourceChanged:n,clientChanged:r}){this.customThemeImportOwner.synchronizeScope(this.context.gateway.connection.gatewayUrl,this.context.theme.serverSelection),(t||n)&&(this.systemInfoPolling.stop(),this.resetConfigViewState(),this.updateStatusClient=null),t||n||r?(this.systemInfo=null,this.systemInfoUnavailable=!1,this.resetSessionObserverModels()):e.phase!==`connected`&&(this.systemInfo=null),e.phase===`connected`&&e.hello&&(this.systemInfoUnavailable=!Qr(e),this.systemInfoUnavailable&&(this.invalidateSystemInfoRequest(),this.systemInfo=null)),this.syncSystemInfoPolling(r),this.syncUpdateStatusRefresh()}syncSystemInfoPolling(e=!1){if(!this.systemInfoRequestClient()){this.systemInfoPolling.stop(),this.systemInfoTask.status===L.PENDING&&this.systemInfoTask.run([null,null]);return}(this.systemInfoPolling.start()||e)&&this.systemInfoTask.run()}invalidateSystemInfoRequest(){this.systemInfoTask.run([null,null]),this.sessionObserverModelsTask.run([null,null,null]),this.resetSessionObserverModels()}systemInfoRequestClient(){let e=this.gateway.gateway;return!this.isConnected||document.visibilityState===`hidden`||this.pageId!==`appearance`||this.context.gateway!==e||!Qr(e?.snapshot)||this.systemInfoUnavailable?null:e?.snapshot.client??null}resetSessionObserverModels(e=!1){this.sessionObserverModels=[],this.sessionObserverModelsUnavailable=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]??Kl(this.pageId),activeSubsection:e}}}applySettings(e,t){this.settings=t?pt(t,e):ve(e),Zl(this.settings.textScale),this.context.theme.refresh()}setLocale(e){if(e===void 0){this.resetLocale();return}this.settings=ve({locale:e}),x.setLocale(e)}currentSyncedPref(e){let t=Re(e);return Ge(this.context.runtimeConfig.state.configSnapshot?.config,e,this.context.gateway.connection.gatewayUrl,this.settings,{canSync:this.serverUiPrefsCanSync(t?e:void 0),profileId:t?this.context.gateway.snapshot?.selfUser?.id:void 0})}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?Be(n.hello?.auth??null):t.canPatch!==!1}resetLocale(){this.settings=Ye(`locale`,this.currentSyncedPref(`locale`),this.context.gateway.connection.gatewayUrl),c(this.settings.locale)?x.setLocale(this.settings.locale):x.useSystemLocale()}resetSyncedAppearancePref(e){this.settings=Ye(e,this.currentSyncedPref(e),this.context.gateway.connection.gatewayUrl,this.context.gateway.snapshot?.selfUser?.id),this.context.theme.refresh()}setTheme(e){let t=this.currentSyncedPref(`theme`),n=t.overridden&&e===t.resetValue;this.customThemeImportOwner.recordActivation(n?null:e),lt({currentTheme:ye(this.settings.theme,this.settings.themeMode),nextTheme:ye(e,this.settings.themeMode),applyTheme:()=>n?this.resetSyncedAppearancePref(`theme`):this.applySettings({},e)})}setThemeMode(e){let t=this.currentSyncedPref(`themeMode`);t.overridden&&e===t.resetValue?this.resetSyncedAppearancePref(`themeMode`):this.context.theme.setMode(e)}async selectCamera(e){let t=++this.cameraSelectionRequest,n=e.trim()||void 0;this.mediaDevices.camera.error=null,this.requestUpdate();try{if(await gi(n),t!==this.cameraSelectionRequest)return;this.applySettings({realtimeTalkVideoDeviceId:n})}catch(e){t===this.cameraSelectionRequest&&(this.mediaDevices.camera.error=v(e),this.requestUpdate())}}async importCustomTheme(){await this.customThemeImportOwner.import({config:this.context.runtimeConfig.state,hasCustomTheme:!!this.settings.customTheme,load:Ia,apply:(e,t)=>this.applySettings({customTheme:e},t?`custom`:this.settings.theme),messages:{blocked:e=>b(e===`loading`?`common.loading`:`common.unsavedChanges`),imported:e=>b(`configPage.themeImported`,{name:e})}})}clearCustomTheme(){this.customThemeImportOwner.clear({apply:()=>this.applySettings({customTheme:void 0},this.settings.theme===`custom`?`claw`:this.settings.theme),message:b(`configPage.themeRemoved`)})}isUpdateBusy(){let e=this.context.overlays.snapshot;return e.updateRunning||e.updateReconciliationPending}isCuratedConfigMutationDisabled(){let e=this.context.runtimeConfig.state;return!e.connected||e.configLoading||e.configSaving||e.configApplying||this.isUpdateBusy()||this.context.overlays.snapshot.updateStatusRefreshing||!this.context.runtimeConfig.canSet||!qe(this.context.gateway.snapshot.hello?.auth??null)}renderAdvancedConfig(e){let t=this.context.runtimeConfig,n=t.state;if(this.pageId===`updates`)return nc({context:this.context,configObject:e,configBusy:this.isCuratedConfigMutationDisabled(),updateBusy:this.isUpdateBusy()});let r=Bi(this.pageId),i=this.pageId===`advanced`?[...Ui]:void 0,a=this.selections[this.pageId]??Kl(this.pageId),o=ql(this.pageId,a.activeSection,a.activeSubsection),s=this.pageId===`mcp`?`mcp`:o.activeSection,l=ot(this.context.gateway.snapshot),u=this.pageId===`mcp`?null:o.activeSubsection,d=P(e.gateway),ee=P(d?.controlUi),te=P(P(e.agents)?.defaults),f=this.currentSyncedPref(`theme`),p=this.currentSyncedPref(`themeMode`),m=this.currentSyncedPref(`accent`),h=this.currentSyncedPref(`locale`),g=this.currentSyncedPref(`chatSendShortcut`),ne=this.currentSyncedPref(`chatFollowUpMode`),re=!n.connected||n.configSaving||n.configApplying||this.isUpdateBusy()||this.context.overlays.snapshot.updateStatusRefreshing||!qe(this.context.gateway.snapshot.hello?.auth??null),_={raw:n.configRaw,originalRaw:n.configRawOriginal,valid:n.configValid,issues:n.configIssues,loading:n.configLoading,saving:n.configSaving,applying:n.configApplying,updating:this.isUpdateBusy()||this.context.overlays.snapshot.updateStatusRefreshing,connected:n.connected,mutationAllowed:t.canSet,openFileAllowed:t.canOpenFile,schema:n.configSchema,schemaLoading:n.configSchemaLoading,uiHints:n.configUiHints,formMode:this.formModes[this.pageId]??`form`,rawDraftPending:n.configFormMode===`raw`&&n.configFormDirty,viewState:this.configViewState,rawAvailable:!!(n.configSnapshot?.config||n.configForm||n.configRaw),showModeToggle:this.pageId===`advanced`,formValue:n.configForm,activeSection:s,activeSubsection:u,onRawChange:e=>{this.customThemeImportOwner.retireForConfigMutation(b(`common.unsavedChanges`)),t.setRaw(e)},onFormModeChange:e=>{this.formModes={...this.formModes,[this.pageId]:e}},onViewStateChange:()=>this.requestUpdate(),onFormPatch:(e,n)=>{this.customThemeImportOwner.retireForConfigMutation(b(`common.unsavedChanges`)),t.patchForm(e,n)},onFormRemove:e=>{this.customThemeImportOwner.retireForConfigMutation(b(`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(),theme:this.settings.theme,themeOverridden:f.overridden,themeProvenance:f.provenance,themeResetValue:f.resetValue??E.theme,themeMode:this.settings.themeMode,themeModeOverridden:p.overridden,themeModeProvenance:p.provenance,themeModeResetValue:p.resetValue??E.themeMode,accent:this.settings.accent,accentProvenance:m.provenance,accentResetValue:m.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:x.getSystemLocale(),localeOverride:c(h.value)?h.value:void 0,localeOverridden:h.overridden,localeProvenance:h.provenance,localeResetValue:c(h.resetValue)?h.resetValue:void 0,onLocaleChange:e=>this.setLocale(e),themeCatalog:this.pageId===`appearance`?this.context.theme.catalog:void 0,onRetryThemeCatalog:()=>this.context.theme.retryCatalog?.(),setTheme:e=>this.setTheme(e),setThemeMode:e=>this.setThemeMode(e),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??E.textScale,textScaleOverridden:this.settings.textScale!==void 0,setTextScale:e=>this.applySettings({textScale:e===E.textScale?void 0:ke(e)}),sidebarLiveActivity:this.settings.sidebarLiveActivity??E.sidebarLiveActivity,setSidebarLiveActivity:e=>this.applySettings({sidebarLiveActivity:e}),hiddenSessionCatalogIds:this.hiddenSessionCatalogIds,hiddenSessionCatalogLabels:this.hiddenSessionCatalogLabelsTask.status===L.COMPLETE?this.hiddenSessionCatalogLabelsTask.value??Ql:Ql,setSessionCatalogHidden:zr,chatMessageMaxWidth:this.settings.chatMessageMaxWidth,setChatMessageMaxWidth:e=>this.applySettings({chatMessageMaxWidth:e}),chatShowTaskProgress:this.settings.chatShowTaskProgress??E.chatShowTaskProgress,setChatShowTaskProgress:e=>this.applySettings({chatShowTaskProgress:e}),openLinksExternally:this.settings.openLinksExternally===!0,setOpenLinksExternally:e=>this.applySettings({openLinksExternally:e}),chatCollapseTaskProgress:this.settings.chatCollapseTaskProgress===!0,setChatCollapseTaskProgress:e=>this.applySettings({chatCollapseTaskProgress:e}),showAdvancedSettings:this.settings.showAdvancedSettings===!0,setShowAdvancedSettings:e=>this.applySettings({showAdvancedSettings:e}),forceShowAdvanced:this.pageId===`advanced`,forceAdvancedSection:this.routeData?.advanced?this.routeData.section:null,sessionObserverEnabled:ee?.sessionObserver!==!1,sessionObserverUtilityModel:typeof te?.utilityModel==`string`?te.utilityModel:void 0,sessionObserverResolvedModel:this.systemInfo?.defaultAgentUtilityModel,sessionObserverModels:this.sessionObserverModels,sessionObserverModelsUnavailable:this.sessionObserverModelsUnavailable,sessionObserverDisabled:re,setSessionObserverEnabled:e=>{t.patch({raw:as(e),note:b(`configView.sessionObserver.toggleNote`)})},setSessionObserverUtilityModel:e=>{t.patch({raw:os(e),note:b(`configView.sessionObserver.modelNote`)}).then(e=>{e&&this.systemInfoTask.run()})},lobsterPetVisits:this.settings.lobsterPetVisits??E.lobsterPetVisits,setLobsterPetVisits:e=>this.applySettings({lobsterPetVisits:e}),sessionDeleteConfirm:this.settings.sessionDeleteConfirm??E.sessionDeleteConfirm,setSessionDeleteConfirm:e=>this.applySettings({sessionDeleteConfirm:e}),lobsterPetSounds:this.settings.lobsterPetSounds??E.lobsterPetSounds,setLobsterPetSounds:e=>this.applySettings({lobsterPetSounds:e}),lobsterdexHref:Ae(`lobsterdex`,this.context.basePath),onOpenLobsterdex:()=>this.context.navigate(`lobsterdex`),chatSendShortcut:_t(this.settings.chatSendShortcut),chatSendShortcutOverridden:g.overridden,chatSendShortcutProvenance:g.provenance,chatSendShortcutResetValue:g.resetValue??E.chatSendShortcut,setChatSendShortcut:e=>this.applySettings({chatSendShortcut:e}),chatFollowUpMode:this.settings.chatFollowUpMode,chatFollowUpModeOverridden:ne.overridden,chatFollowUpModeProvenance:ne.provenance,serverQueueMode:n.configSnapshot?fi(n.configSnapshot.runtimeConfig,{configNeedsApply:n.configNeedsApply}):void 0,setChatFollowUpMode:e=>this.applySettings({chatFollowUpMode:e}),resetChatFollowUpMode:()=>this.resetSyncedAppearancePref(`chatFollowUpMode`),catalogOpenTarget:Ie(this.settings.catalogOpenTarget),pluginsHref:Ae(`plugin-settings`,this.context.basePath),installedSessionSourcePluginIds:this.sessionSourcePluginsTask.status===L.COMPLETE?this.sessionSourcePluginsTask.value:null,sessionSourcePluginsLoading:this.sessionSourcePluginsTask.status===L.PENDING,setCatalogOpenTarget:e=>this.applySettings({catalogOpenTarget:e}),microphone:{...this.mediaDevices.microphone,selectedDeviceId:this.settings.realtimeTalkInputDeviceId??``},composerHoldToRecord:this.settings.composerHoldToRecord!==!1,setComposerHoldToRecord:e=>this.applySettings({composerHoldToRecord:e}),onMicrophoneRefresh:()=>void this.refreshMediaDevices(`microphone`,!0),onMicrophoneSelect:e=>this.applySettings({realtimeTalkInputDeviceId:e.trim()||void 0}),camera:{...this.mediaDevices.camera,selectedDeviceId:this.settings.realtimeTalkVideoDeviceId??``},onCameraRefresh:()=>void this.refreshMediaDevices(`camera`,!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:De(this.pageId),showSectionDocs:this.pageId!==`communications`,renderSection:this.pageId===`communications`&&s===`transcripts`?e=>O`<openclaw-meeting-capture-settings
              .mutationDisabled=${this.isCuratedConfigMutationDisabled()}
              .advancedExpanded=${this.routeData?.advanced===!0||this.routeData?.targetBlockId===`config-section-transcripts`}
              .editor=${e}
            ></openclaw-meeting-capture-settings>`:this.pageId===`ai-agents`&&s===`session`?e=>O`<openclaw-session-storage-settings
                .mutationDisabled=${this.isCuratedConfigMutationDisabled()}
                .advancedExpanded=${this.routeData?.advanced===!0||this.routeData?.targetBlockId===`config-section-session`}
                .editor=${e}
              ></openclaw-session-storage-settings>`:void 0,sectionPrelude:s===`browser`&&l&&!xe()?Sa({enabled:this.settings.openLinksInControlUiBrowser===!0,onChange:e=>this.applySettings({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})},v=(e,t,n=_.schema)=>Ul({..._,schema:n,activeSection:e,activeSubsection:null,showModeToggle:!1,embeddedEditor:!0,navRootLabel:t});if(this.pageId===`mcp`)return Ka({configObject:e,pluginsHref:Ae(`plugins`,this.context.basePath),editor:v(`mcp`,`MCP`)});if(this.pageId===`memory`)return O`<openclaw-memory-settings
        .configObject=${e}
        .mutationDisabled=${this.isCuratedConfigMutationDisabled()}
        .pluginsHref=${Ae(`plugins`,this.context.basePath)}
        .memoryImportHref=${Ae(`memory-import`,this.context.basePath)}
        .routeData=${this.routeData}
        .buildEditor=${()=>v(`memory`,b(`tabs.memory`),Vi(_.schema))}
      ></openclaw-memory-settings>`;if(this.pageId===`talk`)return O`<openclaw-talk-settings
        .configObject=${e}
        .mutationDisabled=${this.isCuratedConfigMutationDisabled()}
        .buildEditor=${()=>v(`talk`,b(`tabs.talk`))}
      ></openclaw-talk-settings>`;if(this.pageId===`security`){let n=t.state,r=this.isCuratedConfigMutationDisabled();return rs({security:Xl(e),configBusy:r,canPairDevice:n.connected&&qe(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=>{t.patchForm([`tools`,`profile`],e)},editor:Ul({..._,embeddedEditor:!0})})}return Ul(_)}render(){let e=this.context.runtimeConfig.state,t=P(e.configForm??e.configSnapshot?.config)??{},n=this.renderAdvancedConfig(t);return O`
      ${this.pageId===`memory`?k:O`
              ${br({title:De(this.pageId),subtitle:Yl(this.pageId)})}
            `}
      ${Br(n)}
    `}},F([wn({context:gt,subscribe:!0})],$.prototype,`context`,void 0),F([N({attribute:`page-id`})],$.prototype,`pageId`,void 0),F([N({attribute:!1})],$.prototype,`routeData`,void 0),F([j()],$.prototype,`settings`,void 0),F([j()],$.prototype,`hiddenSessionCatalogIds`,void 0),F([j()],$.prototype,`systemInfo`,void 0),F([j()],$.prototype,`systemInfoUnavailable`,void 0),F([j()],$.prototype,`sessionObserverModels`,void 0),F([j()],$.prototype,`sessionObserverModelsUnavailable`,void 0),F([j()],$.prototype,`formModes`,void 0),F([j()],$.prototype,`selections`,void 0),F([j()],$.prototype,`customThemeImport`,void 0),customElements.get(`openclaw-config-page`)||customElements.define(`openclaw-config-page`,$)})))()}$l();