openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
739 lines • 68.4 kB
JavaScript
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Br as t,Ji as n,Ui as r,Yi as i,qr as a,zr as o}from"./control-ui-foundation-ZY_Flbbd.js";import{Fi as s,Gl as c,Kl as l,Li as u,Mi as d,N as f,Ni as p,Pi as m,R as h,Ti as g,Xi as _,cc as ee,ea as te,hu as v,ki as ne,lu as re,pu as ie,ql as y,sc as ae,su as oe,uu as b}from"./control-ui-core-3P365fbR.js";import{Br as x,Jt as se,Ma as ce,Sn as le,Xi as S,Xt as ue,Yt as de,Zi as C,Zt as fe,_r as pe,fn as me,fr as he,ja as ge,mn as _e,mr as w,or as ve,sr as ye,va as be,vi as xe,yi as Se}from"./control-ui-core-CFW9Qtjn.js";import{$ as T,X as E,Y as D,c as Ce,ct as O,nt as we,s as Te}from"./lit-runtime-P5vbNq6b.js";import{Ki as Ee,Wn as De,Xi as Oe,Yi as ke,no as Ae,qi as je,ro as Me}from"./control-ui-boot-shared-DoKu-5Ju.js";import{At as k,Et as Ne,Kr as Pe,Mt as A,To as Fe,_t as j,in as Ie,qr as Le,wo as Re,wt as M,xt as N,yt as ze}from"./control-ui-boot-shared-CG9HtEG-.js";import{fr as Be,hr as Ve}from"./control-ui-boot-shared-CApmg5ot.js";import{i as P,n as He,r as F,t as Ue}from"./channel-picker-DAnVfyDn.js";import{n as I,r as We,t as Ge}from"./wizard-step-controls-BmW-9g-y.js";import{n as Ke,t as qe}from"./settings-workspace-whxhPRxQ.js";import{c as Je,l as Ye,n as Xe,o as Ze,t as Qe,u as $e}from"./config-form-CJ1yQ7qT.js";async function et(e,t,n){let r=new AbortController,i=setTimeout(()=>r.abort(new DOMException(`Nostr profile request timed out after 30 seconds`,`TimeoutError`)),ot);try{let i=await se(e,{...t,signal:r.signal},n.authCandidates,n.isCurrent);return await ue(i,r.signal)}finally{clearTimeout(i)}}function tt(e){if(!Array.isArray(e))return{};let t={};for(let n of e){if(typeof n!=`string`)continue;let[e,...r]=n.split(`:`);if(!e||r.length===0)continue;let i=e.trim(),a=r.join(`:`).trim();i&&a&&(t[i]=l(a))}return t}function nt(e,t=``){return`/api/channels/nostr/${encodeURIComponent(e)}/profile${t}`}async function rt(e){return await et(nt(e.accountId),{method:`PUT`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e.values)},e)}function it(e){return n(e)&&[`name`,`displayName`,`about`,`picture`,`banner`,`website`,`nip05`,`lud16`].every(t=>e[t]===void 0||e[t]===null||typeof e[t]==`string`)}async function at(e){let t=await et(nt(e.accountId,`/import`),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({autoMerge:!0})},e);return{...t,data:t.data&&{...t.data,ok:t.data.ok,saved:t.data.saved,imported:it(t.data.imported)?t.data.imported:void 0,merged:it(t.data.merged)?t.data.merged:void 0}}}var ot;function st(){return(st=e((()=>{de(),y(),ot=3e4})))()}function ct(e,t){return e.find(e=>e.hasIcon&&e.id===t)??e.find(e=>e.hasIcon&&e.channelIds?.includes(t))}var lt,ut;function dt(){return(dt=e((()=>{Ve(),lt=1e4,ut=class{constructor(e){this.hooks=e,this.catalog=null,this.iconUrls=new Map,this.request=null,this.pendingEnsureClient=null}get pluginCatalog(){return this.catalog}get pluginIconUrls(){if(!this.catalog)return{};let e=this.catalog.plugins;return Object.fromEntries(this.hooks.getChannelIds().flatMap(t=>{let n=ct(e,t),r=n?this.iconUrls.get(n.id):void 0;return r===void 0?[]:[[t,r]]}))}ensure(e){if(!e)return;if(this.request?.client===e){this.catalog&&(this.pendingEnsureClient=e);return}if(this.catalog){this.startIconLoad(e,this.catalog);return}this.request?.controller.abort();let t=new AbortController,n={client:e,controller:t};this.request=n,e.request(`plugins.list`,{},{signal:t.signal}).then(async t=>{this.request===n&&this.hooks.getContext().gateway.snapshot.client===e&&(this.catalog=t,this.hooks.requestUpdate(),await this.loadIcons(t,n))}).catch(()=>{}).finally(()=>this.finishRequest(n))}startIconLoad(e,t){this.request?.controller.abort();let n={client:e,controller:new AbortController};this.request=n,this.loadIcons(t,n).finally(()=>this.finishRequest(n))}async loadIcons(e,t){t.iconTimeout=setTimeout(()=>t.controller.abort(new DOMException(`plugin icon fetch timed out`,`TimeoutError`)),lt);let n=new Set;for(let t of this.hooks.getChannelIds()){let r=ct(e.plugins,t);r&&!this.iconUrls.has(r.id)&&n.add(r.id)}let r=(await Promise.all([...n].map(async e=>{let n=this.hooks.getContext();return[e,await Be({pluginId:e,resourceBasePath:n.resourceBasePath,gatewayUrl:n.gateway.connection.gatewayUrl,auth:{hello:n.gateway.snapshot.hello,settings:{token:n.gateway.connection.token},password:n.gateway.connection.password},signal:t.controller.signal}).catch(()=>null)]}))).filter(e=>e[1]!==null);if(this.request!==t||!this.hooks.isConnected()){for(let[,e]of r)URL.revokeObjectURL(e);return}for(let[e,t]of r)this.iconUrls.set(e,t);this.hooks.requestUpdate()}finishRequest(e){if(e.iconTimeout&&clearTimeout(e.iconTimeout),this.request!==e)return;this.request=null;let t=this.pendingEnsureClient;this.pendingEnsureClient=null,t&&this.hooks.isConnected()&&this.ensure(t)}reset(){this.request?.controller.abort(),this.request?.iconTimeout&&clearTimeout(this.request.iconTimeout),this.request=null,this.pendingEnsureClient=null;for(let e of this.iconUrls.values())URL.revokeObjectURL(e);this.catalog=null,this.iconUrls.clear(),this.hooks.requestUpdate()}}})))()}function ft(e){let{values:t,original:n}=e;return t.name!==n.name||t.displayName!==n.displayName||t.about!==n.about||t.picture!==n.picture||t.banner!==n.banner||t.website!==n.website||t.nip05!==n.nip05||t.lud16!==n.lud16}function pt(e){let{state:t,callbacks:n,accountId:r}=e,i=ft(t),a=(e,r,i={})=>{let{type:a=`text`,placeholder:o,maxLength:s,help:c}=i,l=t.values[e]??``,u=t.fieldErrors[e],d=`nostr-profile-${e}`,f=`${d}-help`,p=`${d}-error`,m=[c?f:``,u?p:``].filter(Boolean).join(` `),h=a===`textarea`?T`
<textarea
id="${d}"
class="settings-input"
.value=${l}
placeholder=${o??``}
maxlength=${s??2e3}
rows="3"
aria-describedby=${m||E}
aria-invalid=${u?`true`:E}
@input=${t=>{let r=t.target;n.onFieldChange(e,r.value)}}
?disabled=${t.saving}
></textarea>
`:T`
<input
id="${d}"
class="settings-input"
type=${a}
.value=${l}
placeholder=${o??``}
maxlength=${s??256}
aria-describedby=${m||E}
aria-invalid=${u?`true`:E}
@input=${t=>{let r=t.target;n.onFieldChange(e,r.value)}}
?disabled=${t.saving}
/>
`;return T`
<div class="settings-row settings-row--stacked">
<div class="settings-row__text">
<label class="settings-row__title" for="${d}">${r}</label>
${c?T`<span id=${f} class="settings-row__desc">${c}</span>`:E}
${u?T`<span id=${p} class="settings-row__desc" style="color: var(--danger);"
>${u}</span
>`:E}
</div>
<div class="settings-row__control">${h}</div>
</div>
`};return T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${v(`channels.nostr.editProfile`)}</span>
<span class="settings-row__desc">${v(`channels.nostr.account`)}: ${r}</span>
</div>
</div>
${t.error?T`
<div class="settings-row" role="alert">
<div class="settings-row__text">
<span class="settings-row__title"
>${A({kind:`danger`,label:v(`channels.lastError`)})}</span
>
<span class="settings-row__desc">${t.error}</span>
</div>
</div>
`:E}
${t.success?T`
<div class="settings-row" role="status">
<div class="settings-row__text">
<span class="settings-row__desc">${t.success}</span>
</div>
</div>
`:E}
${(()=>{let e=t.values.picture;return e?T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${v(`channels.nostr.profilePicturePreview`)}</span>
</div>
<div class="settings-row__control">
<img
src=${e}
alt=${v(`channels.nostr.profilePicturePreview`)}
style="max-width: 80px; max-height: 80px; border-radius: 50%; object-fit: cover;"
@error=${e=>{let t=e.target;t.style.display=`none`}}
@load=${e=>{let t=e.target;t.style.display=`block`}}
/>
</div>
</div>
`:E})()}
${a(`name`,v(`channels.nostr.username`),{placeholder:v(`channels.nostr.placeholders.username`),maxLength:256,help:v(`channels.nostr.usernameHelp`)})}
${a(`displayName`,v(`channels.nostr.displayName`),{placeholder:v(`channels.nostr.placeholders.displayName`),maxLength:256,help:v(`channels.nostr.displayNameHelp`)})}
${a(`about`,v(`channels.nostr.bio`),{type:`textarea`,placeholder:v(`channels.nostr.bioPlaceholder`),maxLength:2e3,help:v(`channels.nostr.bioHelp`)})}
${a(`picture`,v(`channels.nostr.avatarUrl`),{type:`url`,placeholder:v(`channels.nostr.placeholders.avatarUrl`),help:v(`channels.nostr.avatarHelp`)})}
${t.showAdvanced?T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${v(`channels.nostr.advanced`)}</span>
</div>
</div>
${a(`banner`,v(`channels.nostr.bannerUrl`),{type:`url`,placeholder:v(`channels.nostr.placeholders.bannerUrl`),help:v(`channels.nostr.bannerHelp`)})}
${a(`website`,v(`channels.nostr.website`),{type:`url`,placeholder:v(`channels.nostr.placeholders.website`),help:v(`channels.nostr.websiteHelp`)})}
${a(`nip05`,v(`channels.nostr.nip05Identifier`),{placeholder:v(`channels.nostr.placeholders.nip05`),help:v(`channels.nostr.nip05Help`)})}
${a(`lud16`,v(`channels.nostr.lightningAddress`),{placeholder:v(`channels.nostr.placeholders.lightningAddress`),help:v(`channels.nostr.lightningHelp`)})}
`:E}
<div class="settings-row">
<div class="settings-row__text">
${i?T`<span class="settings-row__desc">${v(`common.unsavedChanges`)}</span>`:E}
</div>
<div class="settings-row__control">
<button
class="btn primary"
@click=${n.onSave}
?disabled=${t.saving||!i}
>
${t.saving?v(`common.saving`):v(`common.saveAndPublish`)}
</button>
<button
class="btn"
@click=${n.onImport}
?disabled=${t.importing||t.saving}
>
${t.importing?v(`common.importing`):v(`common.importFromRelays`)}
</button>
<button
class="btn"
aria-expanded=${String(t.showAdvanced)}
@click=${n.onToggleAdvanced}
>
${t.showAdvanced?v(`common.hideAdvanced`):v(`common.showAdvanced`)}
</button>
<button class="btn" @click=${n.onCancel} ?disabled=${t.saving}>
${v(`common.cancel`)}
</button>
</div>
</div>
`}function mt(e){let t={name:e?.name??``,displayName:e?.displayName??``,about:e?.about??``,picture:e?.picture??``,banner:e?.banner??``,website:e?.website??``,nip05:e?.nip05??``,lud16:e?.lud16??``};return{values:t,original:{...t},saving:!1,importing:!1,error:null,success:null,fieldErrors:{},showAdvanced:!!(e?.banner||e?.website||e?.nip05||e?.lud16)}}function L(){return(L=e((()=>{D(),j(),b()})))()}function ht(e){return`https://docs.openclaw.ai/channels/${encodeURIComponent(e)}`}function gt(e,t){let n=e;for(let e of t){if(!n)return null;if(g(n)===`object`){let t=n.properties??{};if(t[e]){n=t[e];continue}let r=n.additionalProperties;if(r&&typeof r==`object`){n=r;continue}return null}return null}return n}function _t(e){let t=yt.filter(t=>t in e);return t.length===0?null:T`
<div>
${t.map(t=>T`
<div class="settings-row__desc">${t}: ${d(e[t])}</div>
`)}
</div>
`}function vt(e){let t=Xe(e.schema),n=t.schema;if(!n)return T`<div class="settings-row__desc">${v(`channels.config.schemaUnavailable`)}</div>`;let r=gt(n,[`channels`,e.channelId]);if(!r)return T`
<div class="settings-row__desc">${v(`channels.config.channelSchemaUnavailable`)}</div>
`;let i=e.configValue??{},a=s(i,e.channelId)??{},o=[`channels`,e.channelId],c=new Set(t.unsupportedPaths);return T`
<div class="config-form">
${Ze({schema:r,path:o,hints:e.uiHints,revealAdvanced:e.showAdvanced,onShowAdvanced:()=>e.onShowAdvanced(!0),onHideAdvanced:()=>e.onShowAdvanced(!1),renderTier:t=>Je({schema:t,value:a,path:o,hints:e.uiHints,unsupported:c,disabled:e.disabled,showLabel:!1,onPatch:e.onPatch})})}
</div>
${_t(a)}
`}function R(e){let{channelId:t,props:n}=e,r=n.config.configSaving||n.config.configSchemaLoading;return n.config.configSchemaLoading?M({label:v(`channels.config.loadingSchema`),rows:2}):T`
<div class="settings-row settings-row--stacked">
${vt({channelId:t,configValue:n.config.configForm,schema:n.config.configSchema,uiHints:n.config.configUiHints,disabled:r,showAdvanced:n.showAdvancedSettings,onShowAdvanced:n.onShowAdvancedSettings,onPatch:n.onConfigPatch})}
${n.config.lastError?T`<div class="callout danger" role="alert">${n.config.lastError}</div>`:null}
<div class="settings-row__control">
<button
class="btn primary"
?disabled=${r||!n.config.configFormDirty}
@click=${()=>n.onConfigSave()}
>
${n.config.configSaving?v(`common.saving`):v(`common.save`)}
</button>
<button class="btn" ?disabled=${r} @click=${()=>n.onConfigReload()}>
${v(`common.reload`)}
</button>
</div>
</div>
`}var yt;function z(){return(z=e((()=>{D(),Qe(),j(),b(),p(),yt=[`groupPolicy`,`streamMode`,`dmPolicy`]})))()}function bt(e,t){let n=t.channels.channelsSnapshot?.channels;return n&&Object.hasOwn(n,e)?r(n[e])??void 0:void 0}function xt(e,t){let n=m(t.channels.channelsSnapshot?.channelAccounts,e),r=t.channels.channelsSnapshot?.channelDefaultAccountId,i=r&&Object.hasOwn(r,e)?r[e]:void 0;return(i?n.find(e=>e.accountId===i):void 0)??n[0]??null}function B(e,t){let n=bt(e,t),r=xt(e,t);return{configured:typeof n?.configured==`boolean`?n.configured:typeof r?.configured==`boolean`?r.configured:null,running:typeof n?.running==`boolean`?n.running:null,connected:typeof n?.connected==`boolean`?n.connected:null,defaultAccount:r,status:n}}function St(e,t){return ne(t.channels.channelsSnapshot,e)}function Ct(e,t){return B(e,t).configured}function V(e){return v(e==null?`common.na`:e?`common.yes`:`common.no`)}function H(e){return e===!0?`ok`:`muted`}function U(e){return T`
<dl class="settings-kv">
${e.map(e=>T`
<dt>${e.label}</dt>
<dd>
${e.kind===void 0?e.value:A({kind:e.kind,label:e.value})}
</dd>
`)}
</dl>
`}function W(e){return T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title"
>${A({kind:`danger`,label:v(`channels.lastError`)})}</span
>
<span class="settings-row__desc">${c(e)}</span>
</div>
</div>
`}function wt(e){let t=l([e.status??``,e.error??``].filter(Boolean).join(` `));return T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title"
>${A({kind:e.ok?`ok`:`danger`,label:e.ok?v(`common.probeOk`):v(`common.probeFailed`)})}</span
>
${t?T`<span class="settings-row__desc">${t}</span>`:E}
</div>
</div>
`}function G(e){return T`
<div class="settings-row settings-row--actions">
<div class="settings-row__control">${e}</div>
</div>
`}function Tt(e){let t=e.updatedAt?v(`channels.hub.updatedAgo`,{ago:f(e.updatedAt)}):v(`common.na`);return T`<openclaw-tooltip .content=${t}>
<button
type="button"
class="btn btn--xs btn--icon"
aria-label=${v(`common.refresh`)}
?disabled=${e.disabled}
@click=${e.onRefresh}
>
${S.refresh}
</button>
</openclaw-tooltip>`}function Et(e){let t=[e.accountId,...e.facts??[]].join(` · `);return T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${e.title}</span>
<span class="settings-row__desc">${t}</span>
${e.lastError?T`<span class="settings-row__desc"
>${l(e.lastError)}</span
>`:E}
</div>
<div class="settings-row__control">
${A(e.status)}
<span class="settings-row__value"
>${e.lastInboundAt?f(e.lastInboundAt):v(`common.na`)}</span
>
</div>
</div>
`}function Dt(e,t){let n=m(t,e).length;return n>=2?n:void 0}function K(){return(K=e((()=>{D(),C(),j(),b(),p(),y(),h()})))()}function Ot(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:v(`common.na`)}function kt(e){let{props:t,nostr:n,nostrAccounts:r,accountCount:i,profileFormState:a,profileFormCallbacks:o,onEditProfile:s}=e,c=r[0],l=n?.configured??c?.configured??!1,u=n?.running??c?.running??!1,d=n?.publicKey??c?.publicKey,p=n?.lastStartAt??c?.lastStartAt??null,m=n?.lastError??c?.lastError??null,h=r.length>1,g=a!=null,_=e=>{let t=e.publicKey,n=e.profile;return Et({title:n?.displayName??n?.name??e.name??e.accountId,accountId:e.accountId,facts:[`${v(`common.configured`)}: ${e.configured?v(`common.yes`):v(`common.no`)}`,`${v(`common.publicKey`)}: ${Ot(t)}`],status:{kind:H(e.running),label:e.running?v(`common.running`):v(`common.no`)},lastInboundAt:e.lastInboundAt,lastError:e.lastError})},ee=()=>{if(g&&o)return pt({state:a,callbacks:o,accountId:r[0]?.accountId??`default`});let{name:e,displayName:t,about:i,picture:u,nip05:d}=c?.profile??n?.profile??{},f=e||t||i||u||d;return T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${v(`channels.nostr.profile`)}</span>
${f?E:T`<span class="settings-row__desc"
>${v(`channels.nostr.noProfile`)} ${v(`channels.nostr.noProfileHint`)}</span
>`}
</div>
${l?T`
<div class="settings-row__control">
<button class="btn btn--sm" @click=${s}>
${v(`channels.nostr.editProfile`)}
</button>
</div>
`:E}
</div>
${f?T`
<dl class="settings-kv">
${u?T`
<dt>${v(`channels.nostr.profilePicture`)}</dt>
<dd>
<img
style="width: 48px; height: 48px; border-radius: 50%; object-fit: cover;"
src=${u}
alt=${v(`channels.nostr.profilePicture`)}
@error=${e=>{e.target.style.display=`none`}}
/>
</dd>
`:E}
${[[v(`channels.nostr.name`),e],[v(`channels.nostr.displayName`),t],[v(`channels.nostr.about`),i],[`NIP-05`,d]].map(([e,t])=>t?T`<dt>${e}</dt>
<dd>${t}</dd>`:E)}
</dl>
`:E}
`};return k({title:v(`channels.nostr.title`),description:v(`channels.nostr.subtitle`),...i===void 0?{}:{count:i}},T`
${h?r.map(e=>_(e)):U([{label:v(`common.configured`),value:v(l?`common.yes`:`common.no`),kind:H(l)},{label:v(`common.running`),value:v(u?`common.yes`:`common.no`),kind:H(u)},{label:v(`common.publicKey`),value:T`<code title="${d??``}"
>${Ot(d)}</code
>`},{label:v(`common.lastStart`),value:p?f(p):v(`common.na`)}])}
${m?W(m):E}
${ee()} ${R({channelId:`nostr`,props:t})}
${G(T`<button class="btn" @click=${()=>t.onRefresh(!1)}>
${v(`common.refresh`)}
</button>`)}
`)}function At(){return(At=e((()=>{D(),j(),b(),h(),z(),L(),K()})))()}function q(e){return e.accountLabel||e.accountId}function jt(e){let t=Date.parse(e);return Number.isFinite(t)?f(t):e}function Mt(e){let t=e.channels.pairingSnapshot?.accounts??[];return e.pairingChannelFilter?t.filter(t=>t.channel===e.pairingChannelFilter):t}function Nt(e){return(e.channels.pairingSnapshot?.requests??[]).filter(t=>!(e.pairingChannelFilter&&t.channel!==e.pairingChannelFilter||e.pairingAccountFilter&&t.accountId!==e.pairingAccountFilter))}function Pt(e){let t=e.channels.pairingSnapshot?.accounts??[],n=Array.from(new Map(t.map(e=>[e.channel,e.channelLabel])).entries()).toSorted((e,t)=>e[1].localeCompare(t[1])),r=Mt(e);return T`
<div class="channels-pairing-filters">
<label>
<span>${v(`channels.pairing.channelFilter`)}</span>
${He({label:v(`channels.pairing.channelFilter`),value:e.pairingChannelFilter??``,options:[{value:``,label:v(`channels.pairing.allChannels`),kind:`neutral`},...n.map(([e,t])=>({value:e,label:t}))],onChange:t=>e.onPairingFilterChange(t||null,null)})}
</label>
<label>
<span>${v(`channels.pairing.accountFilter`)}</span>
${Le({label:v(`channels.pairing.accountFilter`),value:e.pairingAccountFilter??``,options:[{value:``,label:v(`channels.pairing.allAccounts`)},...r.map(e=>({value:e.accountId,label:q(e)}))],disabled:!e.pairingChannelFilter,onChange:t=>e.onPairingFilterChange(e.pairingChannelFilter,t||null)})}
</label>
</div>
`}function Ft(e,t){let n=!!t.channels.pairingBusyRequestId,r=t.channels.pairingBusyRequestId===e.requestId,i=Object.entries(e.metadata??{});return T`
<div class="settings-row settings-row--stacked channels-pairing-request">
<div class="channels-pairing-request__main">
<div class="settings-row__text">
<span class="settings-row__title">${e.senderId}</span>
<span class="settings-row__desc">
${e.senderLabel} · ${e.channelLabel} · ${q(e)}
(${e.accountId})
</span>
<span class="settings-row__desc">
${v(`channels.pairing.requested`,{ago:jt(e.createdAt)})} ·
${v(`channels.pairing.expires`,{ago:jt(e.expiresAt)})}
</span>
</div>
<div class="settings-row__control channels-pairing-request__actions">
<button
type="button"
class="btn btn--sm primary"
?disabled=${n||!t.canManagePairing}
aria-label=${v(`channels.pairing.approveAria`,{sender:e.senderId,channel:e.channelLabel,account:q(e)})}
@click=${()=>t.onPairingApprove(e)}
>
${v(r?`common.loading`:`channels.pairing.approve`)}
</button>
<button
type="button"
class="btn btn--sm"
?disabled=${n||!t.canManagePairing}
aria-label=${v(`channels.pairing.dismissAria`,{sender:e.senderId,channel:e.channelLabel,account:q(e)})}
@click=${()=>t.onPairingDismiss(e)}
>
${v(`channels.pairing.dismiss`)}
</button>
</div>
</div>
${i.length>0?T`
<details class="channels-pairing-request__details">
<summary>${v(`channels.pairing.senderDetails`)}</summary>
<dl class="settings-kv">
${i.map(([e,t])=>T`<dt>${e}</dt>
<dd>${t}</dd>`)}
</dl>
</details>
`:E}
</div>
`}function It(e){let t=e.canManagePairing?e.channels.pairingSnapshot:null,n=t?.accounts??[],r=e.canManagePairing?Nt(e):[],i=!!(e.pairingChannelFilter||e.pairingAccountFilter),a=t?.requests.length??0;return T`
<div id="channels-pairing-requests">
${k({title:v(`channels.pairing.title`),description:v(`channels.pairing.subtitle`),...a>0?{count:a}:{},actions:Tt({updatedAt:e.canManagePairing?e.channels.pairingLastSuccess:null,disabled:e.channels.pairingLoading||!e.canManagePairing,onRefresh:e.onPairingRefresh})},e.canManagePairing?T`
${e.channels.pairingError?T`
<div class="settings-row channels-pairing-feedback" role="alert">
${A({kind:`danger`,label:e.channels.pairingError})}
</div>
`:E}
${e.pairingNotice?T`
<div class="settings-row channels-pairing-feedback" role="status">
${A({kind:`ok`,label:e.pairingNotice})}
</div>
`:E}
${t?Pt(e):E}
${e.channels.pairingLoading&&!t?M({rows:2}):n.length===0?N(v(`channels.pairing.noAccounts`)):r.length===0?N(v(i?`channels.pairing.noFilteredRequests`:`channels.pairing.noRequests`)):r.map(t=>Ft(t,e))}
${t?T`
<div class="channels-pairing-help">
${v(`channels.pairing.limits`,{count:String(t.limits.pendingPerAccount),minutes:String(Math.round(t.limits.ttlMs/6e4))})}
</div>
`:E}
`:T`
<div class="settings-row channels-pairing-feedback">
${A({kind:`warn`,label:v(`channels.pairing.missingPermission`)})}
</div>
`)}
</div>
`}function Lt(e,t){if(!t.canManagePairing)return E;let n=(t.channels.pairingSnapshot?.accounts??[]).filter(t=>t.channel===e);if(n.length===0)return E;let r=t.channels.pairingSnapshot?.requests??[];return k({title:v(`channels.pairing.detailTitle`),description:v(`channels.pairing.detailSubtitle`)},n.map(e=>{let n=r.filter(t=>t.channel===e.channel&&t.accountId===e.accountId).length;return T`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${q(e)}</span>
<span class="settings-row__desc">${e.accountId}</span>
</div>
<div class="settings-row__control">
${A({kind:n>0?`warn`:`muted`,label:n>0?v(`channels.pairing.pendingCount`,{count:String(n)}):v(`channels.pairing.noPending`)})}
<button
type="button"
class="btn btn--sm"
@click=${()=>t.onPairingReviewAccount(e.channel,e.accountId)}
>
${v(`channels.pairing.review`)}
</button>
</div>
</div>
`}))}function Rt(e){let t=e.pairingPrompt;if(!t||!e.canManagePairing)return E;let n=t.request,r=e.channels.pairingBusyRequestId===n.requestId,i=t.kind===`approve`,a=e.channels.pairingSnapshot?.commandOwnerConfigured===!1,o=v(i?`channels.pairing.approveDialogTitle`:`channels.pairing.dismissDialogTitle`);return T`
<openclaw-modal-dialog label=${o} @modal-cancel=${e.onPairingPromptCancel}>
<div class="channels-pairing-dialog">
<div class="settings-row__title">${o}</div>
<div class="settings-row__desc">
${n.senderId} · ${n.channelLabel} · ${q(n)}
(${n.accountId})
</div>
<div class="callout ${i?`info`:`warn`}">
${v(i?`channels.pairing.approveExplanation`:`channels.pairing.dismissExplanation`)}
</div>
${e.channels.pairingError?T`<div class="callout danger" role="alert">${e.channels.pairingError}</div>`:E}
${i&&n.notifySupported?T`
<label class="channels-pairing-dialog__option">
<input
type="checkbox"
.checked=${t.notify}
@change=${t=>e.onPairingPromptChange({notify:t.currentTarget instanceof HTMLInputElement&&t.currentTarget.checked})}
/>
<span>${v(`channels.pairing.notifyRequester`)}</span>
</label>
`:E}
${i&&a&&e.canAdmin?T`
<label class="channels-pairing-dialog__option">
<input
type="checkbox"
.checked=${t.bootstrapCommandOwner}
@change=${t=>e.onPairingPromptChange({bootstrapCommandOwner:t.currentTarget instanceof HTMLInputElement&&t.currentTarget.checked})}
/>
<span>${v(`channels.pairing.makeCommandOwner`)}</span>
</label>
<div class="settings-row__desc">${v(`channels.pairing.commandOwnerHelp`)}</div>
`:E}
${i&&a&&!e.canAdmin?T`<div class="callout warn">${v(`channels.pairing.commandOwnerNeedsAdmin`)}</div>`:E}
<div class="channels-pairing-dialog__actions">
<button
type="button"
class=${i?`btn primary`:`btn danger`}
?disabled=${r}
@click=${e.onPairingPromptConfirm}
>
${v(i?`channels.pairing.approve`:`channels.pairing.dismiss`)}
</button>
<button type="button" class="btn" ?disabled=${r} @click=${e.onPairingPromptCancel}>
${v(`common.cancel`)}
</button>
</div>
</div>
</openclaw-modal-dialog>
`}function J(){return(J=e((()=>{D(),Ue(),x(),Pe(),j(),b(),h(),K()})))()}function zt(e){let{props:t,whatsapp:n,accountCount:r}=e,i=Ct(`whatsapp`,t),a=n?.linked===!0,o=t.channels.whatsappLoginQrDataUrl!=null,s=n?.self?.e164,c=s?Ye(s,ie.getLocale())??s:void 0;return k({title:v(`channels.whatsapp.title`),description:v(`channels.whatsapp.subtitle`),count:r},T`
${U([{label:v(`common.configured`),value:V(i),kind:H(i)},{label:v(`common.linked`),value:n?.linked?v(`common.yes`):v(`common.no`),kind:H(n?.linked)},...c?[{label:v(`channels.whatsapp.phoneNumber`),value:c}]:[],{label:v(`common.running`),value:n?.running?v(`common.yes`):v(`common.no`),kind:H(n?.running)},{label:v(`common.connected`),value:n?.connected?v(`common.yes`):v(`common.no`),kind:H(n?.connected)},{label:v(`common.lastConnect`),value:n?.lastConnectedAt?f(n.lastConnectedAt):v(`common.na`)},{label:v(`common.lastMessage`),value:n?.lastMessageAt?f(n.lastMessageAt):v(`common.na`)},{label:v(`common.authAge`),value:n?.authAgeMs==null?v(`common.na`):ke(n.authAgeMs)}])}
${n?.lastError?W(n.lastError):E}
${R({channelId:`whatsapp`,props:t})}
${t.channels.whatsappLoginMessage?T`
<div class="settings-row" role="status">
<div class="settings-row__text">
<span class="settings-row__desc">${t.channels.whatsappLoginMessage}</span>
</div>
</div>
`:E}
${t.channels.whatsappLoginQrDataUrl?T`
<div class="settings-row settings-row--stacked">
<div class="qr-wrap">
<img
src=${t.channels.whatsappLoginQrDataUrl}
alt=${v(`channels.setup.whatsappQrAlt`)}
/>
</div>
</div>
`:E}
${G(T`
${a?T`<button
class="btn"
?disabled=${t.channels.whatsappBusy}
@click=${()=>t.onWhatsAppStart(!0)}
>
${v(`common.relink`)}
</button>`:T`<button
class="btn primary"
?disabled=${t.channels.whatsappBusy}
@click=${()=>t.onWhatsAppStart(!1)}
>
${t.channels.whatsappBusy?v(`common.working`):v(`common.showQr`)}
</button>`}
${o?T`<button
class="btn"
?disabled=${t.channels.whatsappBusy}
@click=${()=>t.onWhatsAppWait()}
>
${v(`common.waitForScan`)}
</button>`:E}
<button
class="btn danger"
?disabled=${t.channels.whatsappBusy}
@click=${()=>t.onWhatsAppLogout()}
>
${v(`common.logout`)}
</button>
<button class="btn" @click=${()=>t.onRefresh(!0)}>${v(`common.refresh`)}</button>
`)}
`)}function Bt(){return(Bt=e((()=>{$e(),D(),j(),b(),Oe(),h(),z(),K()})))()}function Vt(e){return Object.hasOwn(Y,e)}function Ht(e,t,n,a){let o=Vt(e)?e:null,s=o?Y[o]:null,c=o?n[o]:void 0,l=B(e,t),u=l.configured,d=m(n.channelAccounts,e),p=o===`telegram`?d.length>1:!o&&d.length>0,h=o===`googlechat`?[{label:v(`common.credential`),value:n.googlechat?.credentialSource??v(`common.na`)},{label:v(`common.audience`),value:n.googlechat?.audienceType?`${n.googlechat.audienceType}${n.googlechat.audience?` · ${n.googlechat.audience}`:``}`:v(`common.na`)}]:o===`signal`?[{label:v(`common.baseUrl`),value:n.signal?.baseUrl??v(`common.na`)}]:o===`telegram`?[{label:v(`common.mode`),value:n.telegram?.mode??v(`common.na`)}]:[],g=[{label:v(`common.configured`),value:V(u),kind:H(u)},{label:v(`common.running`),value:o?o===`googlechat`&&!c?v(`common.na`):V(c?.running??!1):V(l.running),kind:H(o?c?.running:l.running)},...o?[...h,...[`lastStartAt`,`lastProbeAt`].map(e=>({label:v(e===`lastStartAt`?`common.lastStart`:`common.lastProbe`),value:c?.[e]?f(c[e]):v(`common.na`)}))]:[{label:v(`common.connected`),value:V(l.connected),kind:H(l.connected)}]],_=i(r(o?c:l.status),`lastError`);return k({title:s?v(`channels.${s}.title`):i(t.channels.channelsSnapshot?.channelLabels,e)??e,description:v(s?`channels.${s}.subtitle`:`channels.generic.subtitle`),...a===void 0?{}:{count:a}},T`
${p?d.map(e=>{let t=o===`telegram`?i(r(r(e.probe)?.bot),`username`):void 0;return Et({title:t?`@${t}`:e.name||e.accountId,accountId:e.accountId,...o===`telegram`?{facts:[`${v(`common.configured`)}: ${e.configured?v(`common.yes`):v(`common.no`)}`]}:{},status:{kind:H(o===`telegram`?e.running:e.running??e.configured),label:e.running?v(`common.running`):!o&&e.configured?v(`common.configured`):v(`common.no`)},lastInboundAt:e.lastInboundAt,lastError:e.lastError})}):U(g)}
${_?W(_):E}
${o&&c?.probe?wt(c.probe):E}
${R({channelId:e,props:t})}
${o?G(T`
<button
class="btn"
?disabled=${t.channels.channelsLoading}
aria-busy=${String(t.channels.channelsLoading)}
@click=${()=>t.onRefresh(!0)}
>
${v(t.channels.channelsLoading?`common.refreshing`:`common.probe`)}
</button>
`):E}
`)}function Ut(e,t,n){let r=Dt(e,n.channelAccounts);switch(e){case`whatsapp`:return zt({props:t,whatsapp:n.whatsapp,accountCount:r});case`nostr`:{let e=m(n.channelAccounts,`nostr`),i=e[0],a=i?.accountId??`default`,o=i?.profile??null,s=t.nostrProfileAccountId===a?t.nostrProfileFormState:null,c=s?{onFieldChange:t.onNostrProfileFieldChange,onSave:t.onNostrProfileSave,onImport:t.onNostrProfileImport,onCancel:t.onNostrProfileCancel,onToggleAdvanced:t.onNostrProfileToggleAdvanced}:null;return kt({props:t,nostr:n.nostr,nostrAccounts:e,accountCount:r,profileFormState:s,profileFormCallbacks:c,onEditProfile:()=>t.onNostrProfileEdit(a,o)})}default:return Ht(e,t,n,r)}}function Wt(e){let t=Ut(e.channelId,e.props,e.data),n=e.props.channels.channelsSnapshot?.statusIssues?.filter(t=>t.channel===e.channelId);return T`
<openclaw-modal-dialog label=${e.label} @modal-cancel=${()=>e.onClose()}>
<div class="channels-detail">
<div class="channels-detail__header">
${P(e.channelId,e.label,`cover`,{pluginIconUrl:e.pluginIconUrl})}
<div class="channels-detail__header-actions">
<a
class="btn btn--sm"
href=${ht(e.channelId)}
target="_blank"
rel="noreferrer"
>
${v(`common.docs`)}
</a>
<button
type="button"
class="btn btn--sm"
title=${e.props.canAdmin?``:v(`channels.hub.adminRequired`)}
?disabled=${!e.props.canAdmin}
@click=${()=>e.onSetup()}
>
${v(`channels.hub.runSetup`)}
</button>
<button
type="button"
class="btn channels-detail__close"
aria-label=${v(`common.close`)}
@click=${()=>e.onClose()}
>
${S.x}
</button>
</div>
</div>
<div class="channels-detail__body">
${e.props.wizardHost.blockedByDirtyConfig&&e.props.config.configFormDirty?T`<div class="callout warn">${v(`channels.hub.saveBeforeSetup`)}</div>`:E}
${n?.map(e=>T`
<div class="callout warn" role="note">
<strong>
${v(`channels.hub.stateAttention`)} · ${l(e.accountId)}
</strong>
<div>${l(e.message)}</div>
${e.fix?T`<div>${l(e.fix)}</div>`:E}
</div>
`)}
${Lt(e.channelId,e.props)} ${t}
</div>
</div>
</openclaw-modal-dialog>
`}var Y;function Gt(){return(Gt=e((()=>{D(),F(),C(),j(),b(),x(),p(),y(),h(),z(),At(),J(),K(),Bt(),Y={discord:`discord`,googlechat:`googleChat`,imessage:`imessage`,signal:`signal`,slack:`slack`,telegram:`telegram`}})))()}function Kt(e){return e.wizard.phase===`step`&&e.wizard.busy}function qt(e,t){let n=e.message?.trim()??``;if(e.executor===`gateway`)return T`
${e.title?T`<div class="channels-wizard__message">${e.title}</div>`:E}
${n?T`<div class="channels-wizard__message">${n}</div>`:E}
<div class="channels-wizard__footer">
<button type="button" class="btn" @click=${()=>t.onClose()}>
${v(`common.cancel`)}
</button>
${I(n||v(`channels.setup.working`))}
</div>
`;let r=`channels-wizard__output${n.includes(`{`)||n.includes(` `)?` channels-wizard__output--code`:``}`;return T`
${e.title?T`<div class="channels-wizard__message">${e.title}</div>`:E}
${n?T`<div class=${r}>${n}</div>`:E}
<div class="channels-wizard__footer">
${Kt(t)?I(v(`channels.setup.working`)):T`<button type="button" class="btn primary" @click=${()=>t.onAnswer(null)}>
${v(`channels.setup.continue`)}
</button>`}
</div>
`}function Jt(e,t){return e.type===`note`||e.type===`progress`||e.type===`action`?qt(e,t):We({step:e,value:e.type===`multiselect`?t.multiselectValues:e.type===`text`?t.textValue:e.initialValue,busy:Kt(t),inputId:`channel-wizard-text-input`,validationErrorId:t.wizard.phase===`step`&&t.wizard.validationError?`channel-wizard-validation-error`:void 0,presentation:`channels`,channelSelect:t.wizard.phase===`step`&&t.wizard.channel===null,answerLabel:v(`channels.setup.continue`),busyLabel:v(`channels.setup.working`),sensitiveRevealed:t.secretVisible,onValueChange:e.type===`text`?e=>t.onTextInput(typeof e==`string`?e:``):t.onToggleMultiselect,onAnswer:t.onAnswer,onToggleSensitiveVisibility:t.onToggleSecretVisibility})}function Yt(e){let t=e.whatsappConnected===!0;return T`
<div class="channels-wizard__message" role="status">
${v(t?`channels.setup.whatsappLinked`:`channels.setup.whatsappScanTitle`)}
</div>
${e.whatsappMessage?T`<div class="channels-wizard__note" role="status">${e.whatsappMessage}</div>`:E}
${t?E:T`
<div class="channels-wizard__qr">
${e.whatsappQrDataUrl?T`<img
src=${e.whatsappQrDataUrl}
alt=${v(`channels.setup.whatsappQrAlt`)}
/>`:e.whatsappBusy?E:T`<div class="channels-wizard__spinner">
${v(`channels.setup.whatsappQrHint`)}
</div>`}
</div>
<div class="channels-wizard__note">${v(`channels.setup.whatsappScanHelp`)}</div>
`}
<div class="channels-wizard__footer">
${t?T`
<button type="button" class="btn primary" @click=${()=>e.onClose()}>
${v(`channels.setup.finish`)}
</button>
`:T`
${e.whatsappBusy?I(v(`channels.setup.whatsappQrLoading`)):T`
<button type="button" class="btn" @click=${()=>e.onWhatsAppStart(!0)}>
${e.whatsappQrDataUrl?v(`channels.setup.regenerateQr`):v(`common.showQr`)}
</button>
${e.whatsappQrDataUrl?T`
<button
type="button"
class="btn primary"
@click=${()=>e.onWhatsAppWait()}
>
${v(`common.waitForScan`)}
</button>
`:E}
`}
<button type="button" class="btn" @click=${()=>e.onClose()}>
${v(`channels.setup.linkLater`)}
</button>
`}
</div>
`}function Xt(e,t){if(e.includes(`whatsapp`))return Yt(t);let n=e.length>0;return T`
<div class="channels-wizard__message" role="status">
${v(n?`channels.setup.doneTitle`:`channels.setup.doneNoChangesTitle`)}
</div>
<div class="channels-wizard__note">
${v(n?`channels.setup.doneBody`:`channels.setup.doneNoChangesBody`)}
</div>
<div class="channels-wizard__footer">
<button type="button" class="btn primary" @click=${()=>t.onClose()}>
${v(n?`channels.setup.finish`:`common.close`)}
</button>
</div>
`}function Zt(e){return e?.externalUrl?T`
<div class="channels-wizard__links">
<a
class="channels-wizard__link"
href=${e.externalUrl}
target="_blank"
rel="noreferrer noopener"
>
${v(`channels.setup.openLink`)}
</a>
</div>
`:E}function Qt(e){let t=e.wizard;if(t.phase===`idle`)return E;let n=t.channel,r=n?e.channelLabel(n):v(`channels.setup.genericTitle`),i=t.phase===`step`?t.step:null,a;return t.phase===`starting`?a=T`<div class="channels-wizard__footer">
${I(v(`channels.setup.starting`))}
</div>`:t.phase===`error`?a=T`
<div class="channels-wizard__error" role="alert">${t.message}</div>
<div class="channels-wizard__footer">
<button type="button" class="btn" @click=${()=>e.onClose()}>
${v(`common.close`)}
</button>
</div>
`:t.phase===`done`?a=Xt(t.channels,e):i&&(a=T`
${t.phase===`step`&&t.validationError?T`<div
id="channel-wizard-validation-error"
class="channels-wizard__error"
role="alert"
>
${t.validationError}
</div>`:E}
${Jt(i,e)}
`),T`
<openclaw-modal-dialog
label=${v(`channels.setup.dialogLabel`,{channel:r})}
@modal-cancel=${()=>e.onClose()}
>
<div class="channels-wizard">
<div class="channels-wizard__header">
${n?P(n,r,`tile`,{pluginIconUrl:e.channelIconUrl?.(n)}):E}
<div class="channels-wizard__heading">
<h2>${v(`channels.setup.title`,{channel:r})}</h2>
<div class="muted channels-wizard__subtitle">
<span>${v(`channels.setup.subtitle`)}</span>
${n?T`<a
class="channels-wizard__link"
href=${ht(n)}
target="_blank"
rel="noreferrer noopener"
>${v(`channels.setup.viewDocs`)}</a
>`:E}
</div>
</div>
</div>
<div class="channels-wizard__body">${Zt(i)} ${a}</div>
</div>
</openclaw-modal-dialog>
`}function $t(){return($t=e((()=>{D(),F(),Ge(),b(),x()})))()}function en(e){let t=nn(e.channels.channelsSnapshot),n=t.filter(t=>St(t,e)),r=t.filter(t=>!St(t,e)),i=!!(e.channels.channelsLoading&&e.channels.channelsSnapshot&&e.channels.channelsLastSuccess),a=e.channels.channelsSnapshot?.warnings?.filter(e=>e.trim()).map(e=>l(e))??[],o=tn(e),s=e.selectedChannel;return T`
${Ne(T`
${i?T`<div class="callout info">${v(`channels.refreshingStaleSnapshot`)}</div>`:E}
${e.channels.channelsSnapshot?.partial?T`
<div class="callout warn">
${v(`channels.hub.partialSnapshot`)}
${a.length>0?a.slice(0,3).join(`; `):``}
</div>
`:E}
${e.channels.channelsError?T`<div class="callout danger">${e.channels.channelsError}</div>`:E}
${e.wizardHost.blockedByDirtyConfig&&e.config.configFormDirty?T`<div class="callout warn">${v(`channels.hub.saveBeforeSetup`)}</div>`:E}
${k({title:v(`channels.hub.connectedTitle`),...n.length>0?{count:n.length}:{},actions:Tt({updatedAt:e.channels.channelsLastSuccess,disabled:e.channels.channelsLoading,onRefresh:()=>e.onRefresh(!0)})},n.length===0?T`
<div class="channels-empty">
<!-- No configured transports is a true empty state, so Clawd rests here. -->
<openclaw-mascot mood="sleepy" .size=${80}></openclaw-mascot>
${N(v(`channels.hub.noneConnected`))}
</div>
`:Ce(n,e=>e,t=>cn(t,e)))}
${k({title:v(`channels.hub.addTitle`),description:v(`channels.hub.addSubtitle`)},T`
${e.canAdmin?T`${Ce(r,e=>e,t=>ln(t,e))}
${un(e)}`:T`<div class="callout info" role="note">${v(`channels.hub.adminRequired`)}</div>`}
`)}
${It(e)}
`)}
${s?Wt({channelId:s,label:Z(e,s),pluginIconUrl:e.presentation.pluginIconUrls[s],props:e,data:o,onClose:()=>e.onCloseDetail(),onSetup:()=>e.onStartSetup(s)}):E}
${e.canAdmin?Qt({wizard:e.wizardHost.state,channelLabel:t=>Z(e,t),channelIconUrl:t=>e.presentation.pluginIconUrls[t],multiselectValues:e.wizardHost.multiselect,onToggleMultiselect:t=>e.wizardHost.toggleMultiselect(t),textValue:e.wizardHost.textValue,secretVisible:e.wizardHost.secretVisible,onTextInput:t=>e.wizardHost.setTextValue(t),onToggleSecretVisibility:()=>e.wizardHost.toggleSecretVisibility(),onAnswer:t=>e.wizardHost.answer(t),onClose:()=>e.wizardHost.close(),whatsappQrDataUrl:e.channels.whatsappLoginQrDataUrl,whatsappMessage:e.channels.whatsappLoginMessage,whatsappConnected:e.channels.whatsappLoginConnected,whatsappBusy:e.channels.whatsappBusy,onWhatsAppStart:e.onWhatsAppStart,onWhatsAppWait:e.onWhatsAppWait}):E}
${Rt(e)}
`}function tn(e){let t=e.channels.channelsSnapshot?.channels;return{whatsapp:t?.whatsapp??void 0,telegram:t?.telegram??void 0,discord:t?.discord??null,googlechat:t?.googlechat??null,slack:t?.slack??null,signal:t?.signal??null,imessage:t?.imessage??null,nostr:t?.nostr??null,channelAccounts:e.channels.channelsSnapshot?.channelAccounts??null}}function nn(e){let t=e?.channelMeta?.length?e.channelMeta.map(e=>e.id):e?.channelOrder??[];return[...new Set([...t,...dn])]}function X(e,t){return e.presentation.pluginCatalog?.plugins.find(e=>e.id===t)}function Z(e,t){let n=e.channels.channelsSnapshot,r=n?.channelLabels;return X(e,t)?.name??n?.channelMeta?.find(e=>e.id===t)?.label??(r&&Object.hasOwn(r,t)?r[t]:void 0)??t}function rn(e,t){let n=e.channels.channelsSnapshot,r=n?.channelDetailLabels,i=n?.channelMeta?.find(e=>e.id===t)?.detailLabel??(r&&Object.hasOwn(r,t)?r[t]:null);return i&&i!==Z(e,t)?i:null}function an(e,t){let n=B(e,t);return(typeof n.status?.lastError==`string`&&n.status.lastError.trim()?n.status.lastError:m(t.channels.channelsSnapshot?.channelAccounts,e).find(e=>e.lastError)?.lastError)?`attention`:n.running===!0||n.connected===!0?`running`:`configured`}function on(e){switch(e){case`running`:return A({kind:`ok`,label:v(`channels.hub.stateRunning`)});case`configured`:return A({kind:`muted`,label:v(`channels.hub.stateConfigured`)});case`attention`:return A({kind:`danger`,label:v(`channels.hub.stateAttention`)});default:return e}}function sn(e,t){let n=m(t.channels.channelsSnapshot?.channelAccounts,e).reduce((e,t)=>Math.max(e,t.lastInboundAt??0),0);return n?v(`channels.hub.lastMessageAgo`,{ago:f(n)}):null}function cn(e,t){let n=Z(t,e),r=t.channels.channelsSnapshot?.statusIssues?.find(t=>t.channel===e),i=r?l(r.message):sn(e,t)??rn(t,e)??v(`channels.hub.openDetails`);return T`
<button
type="button"
class="settings-row settings-row--nav channels-item"
@click=${()=>t.onShowDetail(e)}
>
${P(e,n,`tile`,{pluginIconUrl:t.presentation.pluginIconUrls[e]})}
<div class="settings-row__text">
<span class="settings-row__title">${n}</span>
<span class="settings-row__desc">${i}</span>
</div>
<div class="settings-row__control">
${on(r?`attention`:an(e,t))}
<span class="settings-row__chevron">${S.chevronRight}</span>
</div>
</button>
`}function ln(e,t){let n=X(t,e),r=Z(t,e),i=n?.description??rn(t,e)??v(`channels.hub.guidedSetup`);return T`
<div class="settings-row channels-item">
<button
type="button"
class="channels-item__detail"
title=${v(`channels.hub.openDetails`)}
@click=${()=>t.onShowDetail(e)}
>
${P(e,r,`tile`,{pluginIconUrl:t.presentation.pluginIconUrls[e]})}
<span class="settings-row__text">
<span class="settings-row__title">${r}</span>
<span class="settings-row__desc">${i}</span>
</span>
</button>
<div class="settings-row__control">
<button type="button" class="btn btn--sm" @click=${()=>t.onStartSetup(e)}>
${v(`channels.hub.setUp`)}
</button>
</div>
</div>
`}function un(e){return T`
<button
type="button"
class="settings-row settings-row--nav channels-item"
@click=${()=>e.onStartSetup(null)}
>
<span
class="channels-tile channels-tile--fallback"
style="--channels-art-a:#64748b;--channels-art-b:#1e293b"
aria-hidden="true"
>
<span>+</span>
</span>
<div class="settings-row__text">
<span class="settings-row__title">${v(`channels.hub.browseAllTitle`)}</span>
<span class="settings-row__desc">${v(`channels.hub.browseAllSubtitle`)}</span>
</div>
<div class="settings-row__control">
<span class="settings-row__chevron">${S.chevronRight}</span>
</div>
</button>
`}var dn;function fn(){return(fn=e((()=>{D(),Te(),F(),C(),Ie(),j(),b(),p(),y(),h(),Gt(),J(),K(),$t(),dn=[`whatsapp`,`telegram`,`discord`,`googlechat`,`slack`,`signal`,`imessage`,`nostr`]})))()}function pn(e,t){let n=e.state.channelsSnapshot,i=t??n?.channelDefaultAccountId.whatsapp??`default`,a=m(n?.channelAccounts,`whatsapp`).find(e=>e.accountId===i);return!a&&t!==void 0?null:{accountId:i,linked:a?.linked??(t===void 0?r(n?.channels.whatsapp)?.linked:void 0)}}async function mn(e){let t=pn(e.channels,e.getWizardAccountId());if(!t||!e.isCurrent()||!await Fe({title:v(`channels.whatsapp.logoutConfirmTitle`,{accountId:t.accountId}),message:v(`channels.whatsapp.logoutConfirmMessage`,{accountId:t.accountId}),confirmLabel:v(`common.logout`),danger:!0})||!e.isCurrent())return;let n=pn(e.channels,e.getWizardAccountId());n&&n.accountId===t.accountId&&n.linked===t.linked&&await e.channels.logoutWhatsApp(t.accountId)}function hn(){return(hn=e((()=>{Re(),b(),p()})))()}async function Q(e,t,n,r){let i,a=!1,o=e.request(t,n).then(e=>(a&&r?.(e),e));try{return await Promise.race([o,new Promise((e,n)=>{i=setTimeout(()=>{a=!0,n(Error(`wizard request timed out: ${t}`))},_n)})])}finally{clearTimeout(i)}}function gn(e,t){t.sessionId&&!t.done&&e.request(`wizard.cancel`,{sessionId:t.sessionId}).catch(()=>{})}var _n,vn;function yn(){return(yn=e((()=>{y(),_(),_n=12e4,vn=class{constructor(e,t,n,r){this.getClient=e,this.onChange=t,this.isKnownChannel=n,this.sessionExpiredMessage=r,this.currentState={phase:`idle`},this.sessionId=null,this.channel=null,this.stepIndex=0,this.generation=0,this.abortController=null,this.pendingCancellation=null}get state(){return this.currentState}async start(e){let t=this.getClient();if(!t)return;let n=++this.generation;this.abortController?.abort(),this.abortController=new AbortController,this.sessionId=null,this.channel=e,this.stepIndex=0,this.setState({phase:`starting`,channel:e});try{let r=this.pendingCancellation;if(r?.client===t&&(await r.completion,this.generation!==n))return;let i=await Q(t,`wizard.start`,{flow:`channels`,...e?{channel:e}:{}},e=>gn(t,e));if(this.generation!==n){gn(t,i);return}this.sessionId=i.sessionId??null,this.applyResult(i)}catch(t){if(this.generation!==n)return;this.setState({phase:`error`,channel:e,message:c(t)})}}async answer(e){let t=this.currentState;if(!this.getClient()||!this.sessionId||t.phase!==`step`||t.busy)return;let n=this.generation;t.step.type===`select`&&typeof e==`string`&&this.isKnownChannel(e)&&(this.channel??=e),this.setState({...t,busy:!0,validationError:null}),await this.advance(n,{stepId:t.step.id,value:e})}async advance(e,t){let n=this.getClient(),r=this.sessionId;if(!n||!r||this.generation!==e)return;let i=this.abortController?.signal;if(t||i)try{let a={sessionId:r,...t?{answer:t}:{}},o=t?await Q(n,`wizard.next`,a):await n.request(`wizard.next`,a,{timeoutMs:null,...i?{signal:i}:{}});if(this.generation!==e)return;this.applyResult(o)}catch(t){if(this.generation!==e)return;if(te(t)){this.sessionId=null,this.abortController?.abort(),this.abortController=null,this.setState({phase:`error`,channel:this.channel,message:this.sessionExpiredMessage()});return}this.setState({phase:`error`,channel:this.channel,message:c(t)})}}async cancel(){let e=this.getClient(),t=this.sessionId;if(this.generation+=1,this.sessionId=null,this.abortController?.abort(),this.abortController=null,this.channel=null,this.setState({phase:`idle`}),e&&t){let n=Promise.resolve().then(()=>Q(e,`wizard.cancel`,{sessionId:t,closeInput:!0})).catch(()=>{});this.pendingCancellation={client:e,completion:n},await n,this.pendingCancellation?.completion===n&&(this.pendingCancellation=null)}}applyResult(e){if(!e.done&&e.step){this.stepIndex+=1;let t=e.step.executor===`gateway`;this.setState({phase:`step`,channel:this.channel,step:e.step,stepIndex:this.stepIndex,busy:t,validationError:e.error?l(e.error):null}),t&&this.advance(this.generation);return}if(e.status===`done`){this.sessionId=null,this.abortController=null;let t=e.channels??[];this.setState({phase:`done`,channel:this.channel??t[0]??null,channels:t,accounts:e.accounts??[]});return}if(e.status===`cancelled`){this.sessionId=null,this.abortController=null,this.channel=null,this.setState({phase:`idle`});return}this.sessionId=null,this.abortController=null,this.setState({phase:`error`,channel:this.channel,message:l(e.error,`Wizard failed.`)})}setState(e){this.currentState=e,this.onChange()}}})))()}var bn;function xn(){return(xn=e((()=>{b(),yn(),bn=class{constructor(e){this.deps=e,this.multiselect=[],this.textValue=``,this.secretVisible=!1,this.blockedByDirtyConfig=!1,this.multiselectStepId=null,this.textStepId=null,this.lastPhase=`idle`,this.controller=new vn(()=>e.getContext()?.gateway.snapshot.client??null,()=>this.handleControllerChange(),t=>e.getContext()?.channels.state.channelsSnapshot?.channelMeta?.some(e=>e.id===t)??!1,()=>v(`channels.setup.sessionExpired`))}get state(){return this.controller.state}startSetup(e){if(this.deps.getContext()?.runtimeConfig.state.configFormDirty){this.blockedByDirtyConfig=!0,this.deps.requestUpdate();return}this.blockedByDirtyConfig=!1,this.whatsappAccountId=void 0,this.deps.clearSelection(),this.controller.start(e)}close(){let e=this.controller.state.phase!==`idle`;this.controller.cancel(),e&&this.deps.getContext()?.channels.refresh(!0)}cancelOnDisconnect(){this.controller.cancel()}answer(e){this.controller.answer(e)}toggleMultiselect(e){this.multiselect=this.multiselect.includes(e)?this.multiselect.filter(t=>t!==e):[...this.multiselect,e],this.deps.requestUpdate()}setTextValue(e){this.textValue=e}toggleSecretVisibility(){this.secretVisible=!this.secretVisible,this.deps.requestUpdate()}handleControllerChange(){let e=this.controller.state,t=e.phase===`step`?e.step.id:null;t!==this.multiselectStepId&&(this.multiselectStepId=t,this.multiselect=e.phase===`step`&&Array.isArray(e.step.initialValue)?[...e.step.initialValue]:[]),t!==this.textStepId&&(this.textStepId=t,this.textValue=e.phase===`step`&&e.step.type===`text`&&typeof e.step.initialValue==`string`?e.step.initialValue:``,this.secretVisible=!1),e.phase===`done`&&this.lastPhase!==`done`&&this.handleCompleted(e.accounts),this.lastPhase=e.phase,this.deps.requestUpdate()}async handleCompleted(e){let t=this.deps.getContext();if(!t)return;await t.runtimeConfig.discardDraft({reloadOnly:!0}),await t.channels.refresh(!0);let n=e.find(e=>e.channel===`whatsapp`);n&&(this.whatsappAccountId=n.accountId,await t.channels.startWhatsApp(!1,n.accountId))}}})))()}function Sn(e,t){return e instanceof DOMException&&e.name===`TimeoutError`?v(`channels.nostr.notices.timeout`):v(`channels.nostr.notices.operationFailed`,{prefix:t,error:c(e)})}var Cn,wn,$;function Tn(){return(Tn=e((()=>{t(),D(),we(),be(),Se(),de(),pe(),me(),ve(),j(),qe(),b(),p(),y(),Me(),re(),je(),ee(),st(),dt(),L(),fn(),hn(),xn(),Cn=3e4,wn=`https://docs.openclaw.ai/channels`,$=class extends oe{constructor(...e){super(...e),this.nostrProfileFormState=null,this.nostrProfileAccountId=null,this.selectedChannel=null,this.pairingChannelFilter=null,this.pairingAccountFilter=null,this.pairingPrompt=null,this.pairingNotice=null,this.pluginPresentation=new ut({getContext:()=>this.context,getChannelIds:()=>nn(this.context.channels.state.channelsSnapshot),isConnected:()=>this.isConnected,requestUpdate:()=>this.requestUpdate()}),this.wizardHost=new bn({getContext:()=>this.context,requestUpdate:()=>this.requestUpdate(),clearSelection:()=>this.selectedChannel=null}),this.schemaLoadStarted=!1,this.gatewayPairingAuthSignature=null,this.gateway=new Ae(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>this.clearNostrForm(),onSnapshot:e=>this.handleGatewaySnapshot(e)}),this.pairingPolling=new Ee(this,Cn,()=>{let e=this.context?.gateway.snapshot;e?.phase===`connected`&&w(e.hello?.auth??null)&&this.context.channels.refreshPairing()},!1,`visible`),this.subscriptions=new ae(this).effect(()=>this.context?.channels,e=>{let t=this.channelsSource!==void 0&&this.channelsSource!==e;this.channelsSource=e,t&&this.invalidateNostrForm();let n=()=>{this.channelsSource===e&&(this.reconcilePairingFilter(e.state.pairingSnapshot),this.pluginPresentation.ensure(this.context.gateway.snapshot.client),this.requestUpdate())};return n(),e.subscribe(n)}).effect(()=>this.context?.runtimeConfig,e=>{this.schemaLoadStarted=!1;let t=()=>{this.context.runtimeConfig===e&&(this.requestUpdate(),this.ensureInitialData())};t();let n=e.subscribe(t);return()=>{n(),this.schemaLoadStarted=!1}}).watch(()=>this.context?.theme,(e,t)=>e.subscribe(t),()=>{this.requestUpdate()})}handleGatewaySnapshot(e){let t=e.snapshot,n=w(t.hello?.auth??null),r=u(t),i=!e.initial&&this.gatewayPairingAuthSignature!==r;(e.identityChanged||t.phase!==`connected`)&&this.clearNostrForm(),(e.identityChanged||e.connectionChanged||t.phase!==`connected`)&&this.pluginPresentation.reset(),(e.identityChanged||i||t.phase!==`connected`||!n)&&(this.pairingPrompt=null,this.pairingChannelFilter=null,this.pairingAccountFilter=null,this.pairingNotice=null),this.gatewayPairingAuthSignature=r,this.syncPairingPolling(t),t.phase===`connected`&&t.client?(e.initial||this.ensureInitialData(),!e.initial&&(e.identityChanged||e.connectionChanged||i)&&n&&this.context.channels.refreshPairing()):this.schemaLoadStarted=!1}syncPairingPolling(e){if(e.phase===`connected`&&e.client&&w(e.hello?.auth??null)){this.pairingPolling.start();return}this.pairingPolling.stop()}ensureInitialData(){let e=this.context,t=e.gateway.snapshot,n=t.client;if(t.phase!==`connected`||!n)return;this.pluginPresentation.ensure(n);let r=e.channels.state,i=e.runtimeConfig.state;!r.channelsSnapshot&&!r.channelsLoading&&e.channels.refresh(!1),w(t.hello?.auth??null)&&!r.pairingSnapshot&&!r.pairingLoading&&e.channels.refreshPairing(),!i.configSnapshot&&!i.configLoading&&e.runtimeConfig.ensureLoaded(),!i.configSchema&&!i.configSchemaLoading&&!this.schemaLoadStarted&&(this.schemaLoadStarted=!0,e.runtimeConfig.ensureSchemaLoaded())}disconnectedCallback(){this.wizardHost.cancelOnDisconnect(),this.selectedChannel=null,this.channelsSource=void 0,this.gatewayPairingAuthSignature=null,this.pairingPrompt=null,this.pairingChannelFilter=null,this.pairingAccountFilter=null,this.pairingNotice=null,this.pairingPolling.stop(),this.pluginPresentation.reset(),this.invalidateNostrForm(),this.subscriptions.clear(),this.schemaLoadStarted=!1,super.disconnectedCallback()}setShowAdvancedSettings(e){le({showAdvancedSettings:e}),this.context.theme.refresh()}async saveChannelConfig(){this.context&&await this.context.runtimeConfig.save()&&await this.context.channels.refresh(!0)}async reloadChannelConfig(){let e=this.context;e&&(await e.runtimeConfig.discardDraft({reloadOnly:!0}),await e.channels.refresh(!0))}async confirmWhatsAppLogout(){let e=this.context,t=e.channels,n=this.gateway.capture();n&&this.channelsSource===t&&await mn({channels:t,getWizardAccountId:()=>this.wizardHost.whatsappAccountId,isCurrent:()=>this.gateway.isCurrent(n)&&this.context===e&&this.channelsSource===t})}resolveNostrAccountId(){let e=this.context?.channels.state.channelsSnapshot?.channelAccounts?.nostr??[];return this.nostrProfileAccountId??e[0]?.accountId??`default`}clearNostrForm(){this.nostrProfileFormState=null,this.nostrProfileAccountId=null}invalidateNostrForm(){this.gateway.invalidate(),this.clearNostrForm()}beginNostrOperation(){let e=this.gateway.gateway,t=this.context.channels,n=this.gateway.capture();return!e||!n||this.channelsSource!==t||this.context.gateway!==e||(this.gateway.invalidate(),n=this.gateway.capture(),!n)?null:{scope:n,gateway:e,channels:t,formAccountId:this.nostrProfileAccountId,accountId:this.resolveNostrAccountId(),authCandidates:fe({hello:e.snapshot.hello,settings:{token:e.connection.token},password:e.connection.password})}}currentNostrForm(e){let t=this.nostrProfileFormState;return!t||!this.gateway.isCurrent(e.scope)||this.nostrProfileAccountId!==e.formAccountId||this.context.gateway!==e.gateway||this.context.channels!==e.channels||e.gateway.snapshot.client!==e.scope.client?null:t}editNostrProfile(e,t){this.gateway.invalidate(),this.nostrProfileAccountId=e,this.nostrProfileFormState=mt(t??void 0)}changeNostrProfileField(e,t){let n=this.nostrProfileFormState;n&&(this.nostrProfileFormState={...n,values:{...n.values,[e]:t},fieldErrors:{...n.fieldErrors,[e]:``}})}toggleNostrProfileAdvanced(){let e=this.nostrProfileFormState;e&&(this.nostrProfileFormState={...e,showAdvanced:!e.showAdvanced})}async updateNostrProfile(e){let t=this.nostrProfileFormState;if(!t||t.saving||t.importing)return;let n=this.beginNostrOperation();if(!n)return;let r=e===`save`?`saving`:`importing`;this.nostrProfileFormState={...t,[r]:!0,error:null,success:null,...e===`save`?{fieldErrors:{}}:{}};try{let i={accountId:n.accountId,authCandidates:n.authCandidates,isCurrent:()=>this.currentNostrForm(n)!==null},a=e===`save`?{action:e,...await rt({...i,values:t.values})}:{action:e,...await at(i)},o=this.currentNostrForm(n);if(!o)return;let s={...o,[r]:!1,error:null,success:null};if(!a.response.ok||a.data?.ok===!1||!a.data){this.nostrProfileFormState={...s,error:a.errorMessage,...a.action===`save`?{fieldErrors:tt(a.data?.details)}:{}};return}if(a.action===`save`){if(!a.data.persisted){this.nostrProfileFormState={...s,error:v(`channels.nostr.notices.publishFailed`)};return}this.nostrProfileFormState={...s,success:v(`channels.nostr.notices.published`),fieldErrors:{},original:{...t.values}}}else{let e=a.data.merged??a.data.imported??null,t=e?{...o.values,...e}:o.values;this.nostrProfileFormState={...s,values:t,success:a.data.saved?v(`channels.nostr.notices.importedFromRelays`):v(`channels.nostr.notices.imported`),showAdvanced:!!(t.banner||t.website||t.nip05||t.lud16)}}(a.action===`save`||a.data.saved)&&await n.channels.refresh(!0)}catch(t){let i=this.currentNostrForm(n);if(!i)return;this.nostrProfileFormState={...i,[r]:!1,error:Sn(t,v(e===`save`?`channels.nostr.notices.updateFailed`:`channels.nostr.notices.importFailed`)),success:null}}}reconcilePairingFilter(e){if(!e||!this.pairingChannelFilter)return;let t=e.accounts.filter(e=>e.channel===this.pairingChannelFilter);if(t.length===0){this.pairingChannelFilter=null,this.pairingAccountFilter=null;return}this.pairingAccountFilter&&!t.some(e=>e.accountId===this.pairingAccountFilter)&&(this.pairingAccountFilter=null)}setPairingFilter(e,t){this.pairingChannelFilter=e,this.pairingAccountFilter=e?t:null}reviewPairingAccount(e,t){this.selectedChannel=null,this.setPairingFilter(e,t),this.updateComplete.then(()=>{this.renderRoot.querySelector(`#channels-pairing-requests`)?.scrollIntoView({behavior:De(),block:`start`})})}openPairingPrompt(e,t){this.context.channels.state.pairingBusyRequestId||(this.pairingNotice=null,this.pairingPrompt={kind:e,request:t,notify:!1,bootstrapCommandOwner:!1})}patchPairingPrompt(e){this.pairingPrompt&&={...this.pairingPrompt,...e}}async confirmPairingPrompt(){let e=this.pairingPrompt;if(!e)return;if(e.kind===`dismiss`){await this.context.channels.dismissPairing({channel:e.request.channel,accountId:e.request.accountId,requestId:e.request.requestId})&&this.pairingPrompt===e&&(this.pairingPrompt=null,this.pairingNotice=v(`channels.pairing.dismissedNotice`));return}let t=await this.context.channels.approvePairing({channel:e.request.channel,accountId:e.request.accountId,requestId:e.request.requestId,notify:e.notify,bootstrapCommandOwner:e.bootstrapCommandOwner});t&&this.pairingPrompt===e&&(this.pairingPrompt=null,this.pairingNotice=t.notification===`failed`&&t.commandOwnerBootstrap===`unavailable`?v(`channels.pairing.approvedFollowupsFailedNotice`):t.commandOwnerBootstrap===`unavailable`?v(`channels.pairing.approvedOwnerFailedNotice`):t.notification===`failed`?v(`channels.pairing.approvedNotificationFailedNotice`):t.commandOwnerBootstrap===`configured`?v(`channels.pairing.approvedOwnerNotice`):v(`channels.pairing.approvedNotice`))}render(){let e=this.context,t=e.channels.state,n=e.runtimeConfig.state,r=e.gateway.snapshot.hello?.auth??null,i=w(r),a=he(r);return T`
<section class="content-header" ${ye({toolbarHeader:!0})}>
<div>
<div class="page-title">${ce(`channels`)}</div>
<div class="page-subtitle">
${ge(`channels`)} ${ze(wn)}
</div>
</div>
</section>
${Ke(en({channels:t,config:n,presentation:this.pluginPresentation,wizardHost:this.wizardHost,pairingChannelFilter:this.pairingChannelFilter,pairingAccountFilter:this.pairingAccountFilter,pairingPrompt:this.pairingPrompt,pairingNotice:this.pairingNotice,canManagePairing:i,canAdmin:a,showAdvancedSettings:_e().showAdvancedSettings===!0,nostrProfileFormState:this.nostrProfileFormState,nostrProfileAccountId:this.nostrProfileAccountId,selectedChannel:this.selectedChannel,onShowDetail:e=>{this.selectedChannel=e},onCloseDetail:()=>{this.selectedChannel=null},onStartSetup:e=>{a&&this.wizardHost.startSetup(e)},onRefresh:t=>void e.channels.refresh(t),onPairingRefresh:()=>void e.channels.refreshPairing(),onPairingFilterChange:(e,t)=>this.setPairingFilter(e,t),onPairingReviewAccount:(e,t)=>this.reviewPairingAccount(e,t),onPairingApprove:e=>this.openPairingPrompt(`approve`,e),onPairingDismiss:e=>this.openPairingPrompt(`dismiss`,e),onPairingPromptChange:e=>this.patchPairingPrompt(e),onPairingPromptCancel:()=>{this.pairingPrompt=null},onPairingPromptConfirm:()=>void this.confirmPairingPrompt(),onWhatsAppStart:t=>void e.channels.startWhatsApp(t,this.wizardHost.whatsappAccountId),onWhatsAppWait:()=>void e.channels.waitWhatsApp(this.wizardHost.whatsappAccountId),onWhatsAppLogout:()=>void this.confirmWhatsAppLogout(),onShowAdvancedSettings:e=>this.setShowAdvancedSettings(e),onConfigPatch:(t,n)=>e.runtimeConfig.patchForm(t,n),onConfigSave:()=>void this.saveChannelConfig(),onConfigReload:()=>void this.reloadChannelConfig(),onNostrProfileEdit:(e,t)=>this.editNostrProfile(e,t),onNostrProfileCancel:()=>this.invalidateNostrForm(),onNostrProfileFieldChange:(e,t)=>this.changeNostrProfileField(e,t),onNostrProfileSave:()=>void this.updateNostrProfile(`save`),onNostrProfileImport:()=>void this.updateNostrProfile(`import`),onNostrProfileToggleAdvanced:()=>this.toggleNostrProfileAdvanced()}))}
`}},a([o({context:xe,subscribe:!0})],$.prototype,`context`,void 0),a([O()],$.prototype,`nostrProfileFormState`,void 0),a([O()],$.prototype,`nostrProfileAccountId`,void 0),a([O()],$.prototype,`selectedChannel`,void 0),a([O()],$.prototype,`pairingChannelFilter`,void 0),a([O()],$.prototype,`pairingAccountFilter`,void 0),a([O()],$.prototype,`pairingPrompt`,void 0),a([O()],$.prototype,`pairingNotice`,void 0),customElements.get(`openclaw-channels-page`)||customElements.define(`openclaw-channels-page`,$)})))()}Tn();