openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
720 lines • 68.1 kB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{R as t,Vn as n,qn as r,wr as i,z as a}from"./control-ui-foundation-Cydpkyqa.js";import{Bn as o,Do as s,Eo as c,Oo as l,Sc as u,Sn as d,So as f,_n as p,bc as m,bn as h,cr as g,dr as ee,k as _,mn as te,vn as v,w as y,x as ne,yn as b,zn as re}from"./control-ui-core-Rwzhj6nO.js";import{$ as ie,K as x,X as S,at as C,h as ae,m as oe,q as w}from"./lit-runtime-CV_MH99K.js";import{$t as T,An as se,B as ce,H as le,J as ue,Z as de,Zt as fe,_ as pe,_n as me,at as he,g as ge,jn as _e,nn as ve}from"./control-ui-core-YphAl4aM.js";import{Ft as ye,Gt as be,Qt as xe,Rt as E,Wt as D,Yt as O,en as k}from"./control-ui-core-vvcQQV2m.js";import{K as Se,L as A,Q as j,V as M,W as Ce,X as N,in as we,rn as Te,z as Ee}from"./control-ui-boot-chat-_QSl8fbH.js";import{Is as De,Ls as Oe,hs as ke,ms as Ae,ui as je}from"./control-ui-boot-shared-CXVvK2AW.js";import{i as P,n as Me,r as F,t as Ne}from"./channel-picker-Bws61IbA.js";import{n as Pe,t as Fe}from"./select-picker-BNhpItgu.js";import{n as I,r as Ie,t as Le}from"./wizard-step-controls-BcNiLuAR.js";import{f as Re,p as ze}from"./control-ui-boot-chat-D85X0PFX.js";import{n as Be,t as Ve}from"./settings-workspace-Bseic8Tf.js";import{c as He,l as Ue,n as We,o as Ge,t as Ke,u as qe}from"./config-form-LQdB5j_F.js";async function Je(e,t){let n=new AbortController,r=setTimeout(()=>n.abort(new DOMException(`Nostr profile request timed out after 30 seconds`,`TimeoutError`)),$e);try{let r=await fetch(e,{...t,signal:n.signal}),i=null;try{i=await r.json()}catch(e){if(n.signal.aborted)throw n.signal.reason??e}return{data:i,response:r}}finally{clearTimeout(r)}}function Ye(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]=s(a))}return t}function Xe(e,t=``){return`/api/channels/nostr/${encodeURIComponent(e)}/profile${t}`}async function Ze(e){return await Je(Xe(e.accountId),{method:`PUT`,headers:{"Content-Type":`application/json`,...e.headers},body:JSON.stringify(e.values)})}async function Qe(e){return await Je(Xe(e.accountId,`/import`),{method:`POST`,headers:{"Content-Type":`application/json`,...e.headers},body:JSON.stringify({autoMerge:!0})})}var $e;function et(){return(et=e((()=>{l(),$e=3e4})))()}var tt,nt;function rt(){return(rt=e((()=>{ze(),tt=1e4,nt=class{constructor(e){this.hooks=e,this.catalog=null,this.iconUrls={},this.request=null,this.pendingEnsureClient=null}get pluginCatalog(){return this.catalog}get pluginIconUrls(){return this.iconUrls}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`)),tt);let n=new Set(this.hooks.getChannelIds()),r=await Promise.all(e.plugins.filter(e=>e.hasIcon&&n.has(e.id)&&!this.iconUrls[e.id]).map(async e=>{let n=this.hooks.getContext(),r=await Re({pluginId:e.id,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);return[e.id,r]})),i=Object.fromEntries(r.filter(e=>e[1]!==null));if(this.request!==t||!this.hooks.isConnected()){for(let e of Object.values(i))URL.revokeObjectURL(e);return}this.iconUrls={...this.iconUrls,...i},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 Object.values(this.iconUrls))URL.revokeObjectURL(e);this.catalog=null,this.iconUrls={},this.hooks.requestUpdate()}}})))()}function it(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 at(e){let{state:t,callbacks:n,accountId:r}=e,i=it(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=a===`textarea`?S`
<textarea
id="${d}"
class="settings-input"
.value=${l}
placeholder=${o??``}
maxlength=${s??2e3}
rows="3"
@input=${t=>{let r=t.target;n.onFieldChange(e,r.value)}}
?disabled=${t.saving}
></textarea>
`:S`
<input
id="${d}"
class="settings-input"
type=${a}
.value=${l}
placeholder=${o??``}
maxlength=${s??256}
@input=${t=>{let r=t.target;n.onFieldChange(e,r.value)}}
?disabled=${t.saving}
/>
`;return S`
<div class="settings-row settings-row--stacked">
<div class="settings-row__text">
<label class="settings-row__title" for="${d}">${r}</label>
${c?S`<span class="settings-row__desc">${c}</span>`:w}
${u?S`<span class="settings-row__desc" style="color: var(--danger);">${u}</span>`:w}
</div>
<div class="settings-row__control">${f}</div>
</div>
`};return S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${k(`channels.nostr.editProfile`)}</span>
<span class="settings-row__desc">${k(`channels.nostr.account`)}: ${r}</span>
</div>
</div>
${t.error?S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title"
>${j({kind:`danger`,label:k(`channels.lastError`)})}</span
>
<span class="settings-row__desc">${t.error}</span>
</div>
</div>
`:w}
${t.success?S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__desc">${t.success}</span>
</div>
</div>
`:w}
${(()=>{let e=t.values.picture;return e?S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${k(`channels.nostr.profilePicturePreview`)}</span>
</div>
<div class="settings-row__control">
<img
src=${e}
alt=${k(`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>
`:w})()}
${a(`name`,k(`channels.nostr.username`),{placeholder:k(`channels.nostr.placeholders.username`),maxLength:256,help:k(`channels.nostr.usernameHelp`)})}
${a(`displayName`,k(`channels.nostr.displayName`),{placeholder:k(`channels.nostr.placeholders.displayName`),maxLength:256,help:k(`channels.nostr.displayNameHelp`)})}
${a(`about`,k(`channels.nostr.bio`),{type:`textarea`,placeholder:k(`channels.nostr.bioPlaceholder`),maxLength:2e3,help:k(`channels.nostr.bioHelp`)})}
${a(`picture`,k(`channels.nostr.avatarUrl`),{type:`url`,placeholder:k(`channels.nostr.placeholders.avatarUrl`),help:k(`channels.nostr.avatarHelp`)})}
${t.showAdvanced?S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${k(`channels.nostr.advanced`)}</span>
</div>
</div>
${a(`banner`,k(`channels.nostr.bannerUrl`),{type:`url`,placeholder:k(`channels.nostr.placeholders.bannerUrl`),help:k(`channels.nostr.bannerHelp`)})}
${a(`website`,k(`channels.nostr.website`),{type:`url`,placeholder:k(`channels.nostr.placeholders.website`),help:k(`channels.nostr.websiteHelp`)})}
${a(`nip05`,k(`channels.nostr.nip05Identifier`),{placeholder:k(`channels.nostr.placeholders.nip05`),help:k(`channels.nostr.nip05Help`)})}
${a(`lud16`,k(`channels.nostr.lightningAddress`),{placeholder:k(`channels.nostr.placeholders.lightningAddress`),help:k(`channels.nostr.lightningHelp`)})}
`:w}
<div class="settings-row">
<div class="settings-row__text">
${i?S`<span class="settings-row__desc">${k(`common.unsavedChanges`)}</span>`:w}
</div>
<div class="settings-row__control">
<button
class="btn primary"
@click=${n.onSave}
?disabled=${t.saving||!i}
>
${t.saving?k(`common.saving`):k(`common.saveAndPublish`)}
</button>
<button
class="btn"
@click=${n.onImport}
?disabled=${t.importing||t.saving}
>
${t.importing?k(`common.importing`):k(`common.importFromRelays`)}
</button>
<button class="btn" @click=${n.onToggleAdvanced}>
${t.showAdvanced?k(`common.hideAdvanced`):k(`common.showAdvanced`)}
</button>
<button class="btn" @click=${n.onCancel} ?disabled=${t.saving}>
${k(`common.cancel`)}
</button>
</div>
</div>
`}function ot(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((()=>{x(),A(),O()})))()}function st(e){return`https://docs.openclaw.ai/channels/${encodeURIComponent(e)}`}function ct(e,t){let n=e;for(let e of t){if(!n)return null;let t=f(n);if(t===`object`){let t=n.properties??{};if(typeof e==`string`&&t[e]){n=t[e];continue}let r=n.additionalProperties;if(typeof e==`string`&&r&&typeof r==`object`){n=r;continue}return null}if(t===`array`){if(typeof e!=`number`)return null;n=(Array.isArray(n.items)?n.items[0]:n.items)??null;continue}return null}return n}function lt(e,t){return h(e,t)??{}}function ut(e){let t=ft.flatMap(t=>t in e?[[t,e[t]]]:[]);return t.length===0?null:S`
<div>
${t.map(([e,t])=>S`
<div class="settings-row__desc">${e}: ${p(t)}</div>
`)}
</div>
`}function dt(e){let t=We(e.schema),n=t.schema;if(!n)return S`<div class="settings-row__desc">${k(`channels.config.schemaUnavailable`)}</div>`;let r=ct(n,[`channels`,e.channelId]);if(!r)return S`
<div class="settings-row__desc">${k(`channels.config.channelSchemaUnavailable`)}</div>
`;let i=lt(e.configValue??{},e.channelId),a=[`channels`,e.channelId],o=new Set(t.unsupportedPaths);return S`
<div class="config-form">
${Ge({schema:r,path:a,hints:e.uiHints,revealAdvanced:e.showAdvanced,onShowAdvanced:()=>e.onShowAdvanced(!0),onHideAdvanced:()=>e.onShowAdvanced(!1),renderTier:t=>He({schema:t,value:i,path:a,hints:e.uiHints,unsupported:o,disabled:e.disabled,showLabel:!1,onPatch:e.onPatch})})}
</div>
${ut(i)}
`}function R(e){let{channelId:t,props:n}=e,r=n.configSaving||n.configSchemaLoading;return n.configSchemaLoading?Ce({label:k(`channels.config.loadingSchema`),rows:2}):S`
<div class="settings-row settings-row--stacked">
${dt({channelId:t,configValue:n.configForm,schema:n.configSchema,uiHints:n.configUiHints,disabled:r,showAdvanced:n.showAdvancedSettings,onShowAdvanced:n.onShowAdvancedSettings,onPatch:n.onConfigPatch})}
${n.configError?S`<div class="callout danger" role="alert">${n.configError}</div>`:null}
<div class="settings-row__control">
<button
class="btn primary"
?disabled=${r||!n.configFormDirty}
@click=${()=>n.onConfigSave()}
>
${n.configSaving?k(`common.saving`):k(`common.save`)}
</button>
<button class="btn" ?disabled=${r} @click=${()=>n.onConfigReload()}>
${k(`common.reload`)}
</button>
</div>
</div>
`}var ft;function z(){return(z=e((()=>{x(),Ke(),A(),O(),v(),ft=[`groupPolicy`,`streamMode`,`dmPolicy`]})))()}function pt(e,t){let r=t.snapshot?.channels;return r&&Object.hasOwn(r,e)?n(r[e])??void 0:void 0}function mt(e,t){let n=b(t.snapshot?.channelAccounts,e),r=t.snapshot?.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=pt(e,t),r=mt(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 ht(e,t){return te(t.snapshot,e)}function gt(e,t){return B(e,t).configured}function V(e){return k(e==null?`common.na`:e?`common.yes`:`common.no`)}function H(e){return e===!0?`ok`:`muted`}function U(e){return S`
<dl class="settings-kv">
${e.map(e=>S`
<dt>${e.label}</dt>
<dd>
${e.kind===void 0?e.value:j({kind:e.kind,label:e.value})}
</dd>
`)}
</dl>
`}function W(e){return S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title"
>${j({kind:`danger`,label:k(`channels.lastError`)})}</span
>
<span class="settings-row__desc">${c(e)}</span>
</div>
</div>
`}function _t(e){let t=s([e.status??``,e.error??``].filter(Boolean).join(` `));return S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title"
>${j({kind:e.ok?`ok`:`danger`,label:e.ok?k(`common.probeOk`):k(`common.probeFailed`)})}</span
>
${t?S`<span class="settings-row__desc">${t}</span>`:w}
</div>
</div>
`}function G(e){return S`
<div class="settings-row settings-row--actions">
<div class="settings-row__control">${e}</div>
</div>
`}function vt(e){let t=e.updatedAt?k(`channels.hub.updatedAgo`,{ago:y(e.updatedAt)}):k(`common.na`);return S`<openclaw-tooltip .content=${t}>
<button
type="button"
class="btn btn--xs btn--icon"
aria-label=${k(`common.refresh`)}
?disabled=${e.disabled}
@click=${e.onRefresh}
>
${D.refresh}
</button>
</openclaw-tooltip>`}function yt(e){let t=[e.accountId,...e.facts??[]].join(` · `);return S`
<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?S`<span class="settings-row__desc"
>${s(e.lastError)}</span
>`:w}
</div>
<div class="settings-row__control">
${j(e.status)}
<span class="settings-row__value"
>${e.lastInboundAt?y(e.lastInboundAt):k(`common.na`)}</span
>
</div>
</div>
`}function bt(e){return N({title:e.title,description:e.subtitle,...e.accountCount===void 0?{}:{count:e.accountCount}},S`
${U(e.statusRows)}
${e.lastError?W(e.lastError):w}
${e.secondaryCallout??w} ${e.configSection}
${e.extraContent??w}
${e.footer?G(e.footer):w}
`)}function xt(e,t){let n=b(t,e).length;return n>=2?n:void 0}function K(){return(K=e((()=>{x(),be(),A(),O(),v(),l(),_()})))()}function St(e){return e?e.length<=20?e:`${e.slice(0,8)}...${e.slice(-8)}`:k(`common.na`)}function Ct(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,f=n?.lastStartAt??c?.lastStartAt??null,p=n?.lastError??c?.lastError??null,m=r.length>1,h=a!=null,g=e=>{let t=e.publicKey,n=e.profile;return yt({title:n?.displayName??n?.name??e.name??e.accountId,accountId:e.accountId,facts:[`${k(`common.configured`)}: ${e.configured?k(`common.yes`):k(`common.no`)}`,`${k(`common.publicKey`)}: ${St(t)}`],status:{kind:H(e.running),label:e.running?k(`common.running`):k(`common.no`)},lastInboundAt:e.lastInboundAt,lastError:e.lastError})},ee=()=>{if(h&&o)return at({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 S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${k(`channels.nostr.profile`)}</span>
${f?w:S`<span class="settings-row__desc"
>${k(`channels.nostr.noProfile`)} ${k(`channels.nostr.noProfileHint`)}</span
>`}
</div>
${l?S`
<div class="settings-row__control">
<button class="btn btn--sm" @click=${s}>
${k(`channels.nostr.editProfile`)}
</button>
</div>
`:w}
</div>
${f?S`
<dl class="settings-kv">
${u?S`
<dt>${k(`channels.nostr.profilePicture`)}</dt>
<dd>
<img
style="width: 48px; height: 48px; border-radius: 50%; object-fit: cover;"
src=${u}
alt=${k(`channels.nostr.profilePicture`)}
@error=${e=>{e.target.style.display=`none`}}
/>
</dd>
`:w}
${e?S`<dt>${k(`channels.nostr.name`)}</dt>
<dd>${e}</dd>`:w}
${t?S`<dt>${k(`channels.nostr.displayName`)}</dt>
<dd>${t}</dd>`:w}
${i?S`<dt>${k(`channels.nostr.about`)}</dt>
<dd>${i}</dd>`:w}
${d?S`<dt>NIP-05</dt>
<dd>${d}</dd>`:w}
</dl>
`:w}
`};return N({title:k(`channels.nostr.title`),description:k(`channels.nostr.subtitle`),...i===void 0?{}:{count:i}},S`
${m?r.map(e=>g(e)):U([{label:k(`common.configured`),value:k(l?`common.yes`:`common.no`),kind:H(l)},{label:k(`common.running`),value:k(u?`common.yes`:`common.no`),kind:H(u)},{label:k(`common.publicKey`),value:S`<code title="${d??``}"
>${St(d)}</code
>`},{label:k(`common.lastStart`),value:f?y(f):k(`common.na`)}])}
${p?W(p):w}
${ee()} ${R({channelId:`nostr`,props:t})}
${G(S`<button class="btn" @click=${()=>t.onRefresh(!1)}>
${k(`common.refresh`)}
</button>`)}
`)}function wt(){return(wt=e((()=>{x(),A(),O(),_(),z(),L(),K()})))()}function Tt(e){return e.accountLabel||e.accountId}function q(e){return e.accountLabel||e.accountId}function Et(e){let t=Date.parse(e);return Number.isFinite(t)?y(t):e}function Dt(e){let t=e.pairingSnapshot?.accounts??[];return e.pairingChannelFilter?t.filter(t=>t.channel===e.pairingChannelFilter):t}function Ot(e){return(e.pairingSnapshot?.requests??[]).filter(t=>!(e.pairingChannelFilter&&t.channel!==e.pairingChannelFilter||e.pairingAccountFilter&&t.accountId!==e.pairingAccountFilter))}function kt(e){let t=e.pairingSnapshot?.accounts??[],n=Array.from(new Map(t.map(e=>[e.channel,e.channelLabel])).entries()).toSorted((e,t)=>e[1].localeCompare(t[1])),r=Dt(e);return S`
<div class="channels-pairing-filters">
<label>
<span>${k(`channels.pairing.channelFilter`)}</span>
${Me({label:k(`channels.pairing.channelFilter`),value:e.pairingChannelFilter??``,options:[{value:``,label:k(`channels.pairing.allChannels`),kind:`neutral`},...n.map(([e,t])=>({value:e,label:t}))],onChange:t=>e.onPairingFilterChange(t||null,null)})}
</label>
<label>
<span>${k(`channels.pairing.accountFilter`)}</span>
${Pe({label:k(`channels.pairing.accountFilter`),value:e.pairingAccountFilter??``,options:[{value:``,label:k(`channels.pairing.allAccounts`)},...r.map(e=>({value:e.accountId,label:Tt(e)}))],disabled:!e.pairingChannelFilter,onChange:t=>e.onPairingFilterChange(e.pairingChannelFilter,t||null)})}
</label>
</div>
`}function At(e,t){let n=!!t.pairingBusyRequestId,r=t.pairingBusyRequestId===e.requestId,i=Object.entries(e.metadata??{});return S`
<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">
${k(`channels.pairing.requested`,{ago:Et(e.createdAt)})} ·
${k(`channels.pairing.expires`,{ago:Et(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=${k(`channels.pairing.approveAria`,{sender:e.senderId,channel:e.channelLabel,account:q(e)})}
@click=${()=>t.onPairingApprove(e)}
>
${k(r?`common.loading`:`channels.pairing.approve`)}
</button>
<button
type="button"
class="btn btn--sm"
?disabled=${n||!t.canManagePairing}
aria-label=${k(`channels.pairing.dismissAria`,{sender:e.senderId,channel:e.channelLabel,account:q(e)})}
@click=${()=>t.onPairingDismiss(e)}
>
${k(`channels.pairing.dismiss`)}
</button>
</div>
</div>
${i.length>0?S`
<details class="channels-pairing-request__details">
<summary>${k(`channels.pairing.senderDetails`)}</summary>
<dl class="settings-kv">
${i.map(([e,t])=>S`<dt>${e}</dt>
<dd>${t}</dd>`)}
</dl>
</details>
`:w}
</div>
`}function jt(e){let t=e.canManagePairing?e.pairingSnapshot:null,n=t?.accounts??[],r=e.canManagePairing?Ot(e):[],i=!!(e.pairingChannelFilter||e.pairingAccountFilter),a=t?.requests.length??0;return S`
<div id="channels-pairing-requests">
${N({title:k(`channels.pairing.title`),description:k(`channels.pairing.subtitle`),...a>0?{count:a}:{},actions:vt({updatedAt:e.canManagePairing?e.pairingLastSuccessAt:null,disabled:e.pairingLoading||!e.canManagePairing,onRefresh:e.onPairingRefresh})},e.canManagePairing?S`
${e.pairingError?S`
<div class="settings-row channels-pairing-feedback" role="alert">
${j({kind:`danger`,label:e.pairingError})}
</div>
`:w}
${e.pairingNotice?S`
<div class="settings-row channels-pairing-feedback" role="status">
${j({kind:`ok`,label:e.pairingNotice})}
</div>
`:w}
${t?kt(e):w}
${e.pairingLoading&&!t?Ce({rows:2}):n.length===0?M(k(`channels.pairing.noAccounts`)):r.length===0?M(k(i?`channels.pairing.noFilteredRequests`:`channels.pairing.noRequests`)):r.map(t=>At(t,e))}
${t?S`
<div class="channels-pairing-help">
${k(`channels.pairing.limits`,{count:String(t.limits.pendingPerAccount),minutes:String(Math.round(t.limits.ttlMs/6e4))})}
</div>
`:w}
`:S`
<div class="settings-row channels-pairing-feedback">
${j({kind:`warn`,label:k(`channels.pairing.missingPermission`)})}
</div>
`)}
</div>
`}function Mt(e,t){if(!t.canManagePairing)return w;let n=(t.pairingSnapshot?.accounts??[]).filter(t=>t.channel===e);if(n.length===0)return w;let r=t.pairingSnapshot?.requests??[];return N({title:k(`channels.pairing.detailTitle`),description:k(`channels.pairing.detailSubtitle`)},n.map(e=>{let n=r.filter(t=>t.channel===e.channel&&t.accountId===e.accountId).length;return S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__title">${Tt(e)}</span>
<span class="settings-row__desc">${e.accountId}</span>
</div>
<div class="settings-row__control">
${j({kind:n>0?`warn`:`muted`,label:n>0?k(`channels.pairing.pendingCount`,{count:String(n)}):k(`channels.pairing.noPending`)})}
<button
type="button"
class="btn btn--sm"
@click=${()=>t.onPairingReviewAccount(e.channel,e.accountId)}
>
${k(`channels.pairing.review`)}
</button>
</div>
</div>
`}))}function Nt(e){let t=e.pairingPrompt;if(!t||!e.canManagePairing)return w;let n=t.request,r=e.pairingBusyRequestId===n.requestId,i=t.kind===`approve`,a=e.pairingSnapshot?.commandOwnerConfigured===!1,o=k(i?`channels.pairing.approveDialogTitle`:`channels.pairing.dismissDialogTitle`);return S`
<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`}">
${k(i?`channels.pairing.approveExplanation`:`channels.pairing.dismissExplanation`)}
</div>
${e.pairingError?S`<div class="callout danger" role="alert">${e.pairingError}</div>`:w}
${i&&n.notifySupported?S`
<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>${k(`channels.pairing.notifyRequester`)}</span>
</label>
`:w}
${i&&a&&e.canAdmin?S`
<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>${k(`channels.pairing.makeCommandOwner`)}</span>
</label>
<div class="settings-row__desc">${k(`channels.pairing.commandOwnerHelp`)}</div>
`:w}
${i&&a&&!e.canAdmin?S`<div class="callout warn">${k(`channels.pairing.commandOwnerNeedsAdmin`)}</div>`:w}
<div class="channels-pairing-dialog__actions">
<button
type="button"
class=${i?`btn primary`:`btn danger`}
?disabled=${r}
@click=${e.onPairingPromptConfirm}
>
${k(i?`channels.pairing.approve`:`channels.pairing.dismiss`)}
</button>
<button type="button" class="btn" ?disabled=${r} @click=${e.onPairingPromptCancel}>
${k(`common.cancel`)}
</button>
</div>
</div>
</openclaw-modal-dialog>
`}function J(){return(J=e((()=>{x(),Ne(),E(),Fe(),A(),O(),_(),K()})))()}function Pt(e){let{props:t,whatsapp:n,accountCount:r}=e,i=gt(`whatsapp`,t),a=n?.linked===!0,o=t.whatsappQrDataUrl!=null,s=n?.self?.e164,c=s?Ue(s,xe.getLocale())??s:void 0;return bt({title:k(`channels.whatsapp.title`),subtitle:k(`channels.whatsapp.subtitle`),accountCount:r,statusRows:[{label:k(`common.configured`),value:V(i),kind:H(i)},{label:k(`common.linked`),value:n?.linked?k(`common.yes`):k(`common.no`),kind:H(n?.linked)},...c?[{label:k(`channels.whatsapp.phoneNumber`),value:c}]:[],{label:k(`common.running`),value:n?.running?k(`common.yes`):k(`common.no`),kind:H(n?.running)},{label:k(`common.connected`),value:n?.connected?k(`common.yes`):k(`common.no`),kind:H(n?.connected)},{label:k(`common.lastConnect`),value:n?.lastConnectedAt?y(n.lastConnectedAt):k(`common.na`)},{label:k(`common.lastMessage`),value:n?.lastMessageAt?y(n.lastMessageAt):k(`common.na`)},{label:k(`common.authAge`),value:n?.authAgeMs==null?k(`common.na`):ne(n.authAgeMs)}],lastError:n?.lastError,extraContent:S`
${t.whatsappMessage?S`
<div class="settings-row">
<div class="settings-row__text">
<span class="settings-row__desc">${t.whatsappMessage}</span>
</div>
</div>
`:w}
${t.whatsappQrDataUrl?S`
<div class="settings-row settings-row--stacked">
<div class="qr-wrap">
<img src=${t.whatsappQrDataUrl} alt=${k(`channels.setup.whatsappQrAlt`)} />
</div>
</div>
`:w}
`,configSection:R({channelId:`whatsapp`,props:t}),footer:S`
${a?S`<button
class="btn"
?disabled=${t.whatsappBusy}
@click=${()=>t.onWhatsAppStart(!0)}
>
${k(`common.relink`)}
</button>`:S`<button
class="btn primary"
?disabled=${t.whatsappBusy}
@click=${()=>t.onWhatsAppStart(!1)}
>
${t.whatsappBusy?k(`common.working`):k(`common.showQr`)}
</button>`}
${o?S`<button
class="btn"
?disabled=${t.whatsappBusy}
@click=${()=>t.onWhatsAppWait()}
>
${k(`common.waitForScan`)}
</button>`:w}
<button
class="btn danger"
?disabled=${t.whatsappBusy}
@click=${()=>t.onWhatsAppLogout()}
>
${k(`common.logout`)}
</button>
<button class="btn" @click=${()=>t.onRefresh(!0)}>${k(`common.refresh`)}</button>
`})}function Ft(){return(Ft=e((()=>{qe(),x(),O(),_(),z(),K()})))()}function It(e){return Object.hasOwn(Y,e)}function Lt(e,t,i,a){let o=It(e)?e:null,s=o?Y[o]:null,c=o?i[o]:void 0,l=B(e,t),u=l.configured,d=b(i.channelAccounts,e),f=o===`telegram`?d.length>1:!o&&d.length>0,p=o===`googlechat`?[{label:k(`common.credential`),value:i.googlechat?.credentialSource??k(`common.na`)},{label:k(`common.audience`),value:i.googlechat?.audienceType?`${i.googlechat.audienceType}${i.googlechat.audience?` · ${i.googlechat.audience}`:``}`:k(`common.na`)}]:o===`signal`?[{label:k(`common.baseUrl`),value:i.signal?.baseUrl??k(`common.na`)}]:o===`telegram`?[{label:k(`common.mode`),value:i.telegram?.mode??k(`common.na`)}]:[],m=[{label:k(`common.configured`),value:V(u),kind:H(u)},{label:k(`common.running`),value:o?o===`googlechat`&&!c?k(`common.na`):V(c?.running??!1):V(l.running),kind:H(o?c?.running:l.running)},...o?[...p,...[`lastStartAt`,`lastProbeAt`].map(e=>({label:k(e===`lastStartAt`?`common.lastStart`:`common.lastProbe`),value:c?.[e]?y(c[e]):k(`common.na`)}))]:[{label:k(`common.connected`),value:V(l.connected),kind:H(l.connected)}]],h=r(n(o?c:l.status),`lastError`);return N({title:s?k(`channels.${s}.title`):r(t.snapshot?.channelLabels,e)??e,description:k(s?`channels.${s}.subtitle`:`channels.generic.subtitle`),...a===void 0?{}:{count:a}},S`
${f?d.map(e=>{let t=o===`telegram`?r(n(n(e.probe)?.bot),`username`):void 0;return yt({title:t?`@${t}`:e.name||e.accountId,accountId:e.accountId,...o===`telegram`?{facts:[`${k(`common.configured`)}: ${e.configured?k(`common.yes`):k(`common.no`)}`]}:{},status:{kind:H(o===`telegram`?e.running:e.running??e.configured),label:e.running?k(`common.running`):!o&&e.configured?k(`common.configured`):k(`common.no`)},lastInboundAt:e.lastInboundAt,lastError:e.lastError})}):U(m)}
${h?W(h):w}
${o&&c?.probe?_t(c.probe):w}
${R({channelId:e,props:t})}
${o?G(S`
<button
class="btn"
?disabled=${t.loading}
aria-busy=${String(t.loading)}
@click=${()=>t.onRefresh(!0)}
>
${k(t.loading?`common.refreshing`:`common.probe`)}
</button>
`):w}
`)}function Rt(e,t,n){let r=xt(e,n.channelAccounts);switch(e){case`whatsapp`:return Pt({props:t,whatsapp:n.whatsapp,accountCount:r});case`nostr`:{let e=b(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 Ct({props:t,nostr:n.nostr,nostrAccounts:e,accountCount:r,profileFormState:s,profileFormCallbacks:c,onEditProfile:()=>t.onNostrProfileEdit(a,o)})}default:return Lt(e,t,n,r)}}function zt(e){let t=Rt(e.channelId,e.props,e.data);return S`
<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,preferPluginIcon:e.preferPluginIcon})}
<div class="channels-detail__header-actions">
<a
class="btn btn--sm"
href=${st(e.channelId)}
target="_blank"
rel="noreferrer"
>
${k(`common.docs`)}
</a>
<button
type="button"
class="btn btn--sm"
title=${e.props.canAdmin?``:k(`channels.hub.adminRequired`)}
?disabled=${!e.props.canAdmin}
@click=${()=>e.onSetup()}
>
${k(`channels.hub.runSetup`)}
</button>
<button
type="button"
class="btn channels-detail__close"
aria-label=${k(`common.close`)}
@click=${()=>e.onClose()}
>
✕
</button>
</div>
</div>
<div class="channels-detail__body">
${e.props.setupBlockedByDirtyConfig&&e.props.configFormDirty?S`<div class="callout warn">${k(`channels.hub.saveBeforeSetup`)}</div>`:w}
${Mt(e.channelId,e.props)} ${t}
</div>
</div>
</openclaw-modal-dialog>
`}var Y;function Bt(){return(Bt=e((()=>{x(),F(),A(),O(),E(),v(),_(),z(),wt(),J(),K(),Ft(),Y={discord:`discord`,googlechat:`googleChat`,imessage:`imessage`,signal:`signal`,slack:`slack`,telegram:`telegram`}})))()}function Vt(e){return e.wizard.phase===`step`&&e.wizard.busy}function Ht(e,t){let n=e.message?.trim()??``;if(e.executor===`gateway`)return S`
${e.title?S`<div class="channels-wizard__message">${e.title}</div>`:w}
${n?S`<div class="channels-wizard__message">${n}</div>`:w}
<div class="channels-wizard__footer">
<button type="button" class="btn" @click=${()=>t.onClose()}>
${k(`common.cancel`)}
</button>
${I(n||k(`channels.setup.working`))}
</div>
`;let r=`channels-wizard__output${n.includes(`{`)||n.includes(` `)?` channels-wizard__output--code`:``}`;return S`
${e.title?S`<div class="channels-wizard__message">${e.title}</div>`:w}
${n?S`<div class=${r}>${n}</div>`:w}
<div class="channels-wizard__footer">
${Vt(t)?I(k(`channels.setup.working`)):S`<button type="button" class="btn primary" @click=${()=>t.onAnswer(null)}>
${k(`channels.setup.continue`)}
</button>`}
</div>
`}function Ut(e,t){return e.type===`note`||e.type===`progress`||e.type===`action`?Ht(e,t):Ie({step:e,value:e.type===`multiselect`?t.multiselectValues:e.type===`text`?t.textValue:e.initialValue,busy:Vt(t),inputId:`channel-wizard-text-input`,presentation:`channels`,channelSelect:t.wizard.phase===`step`&&t.wizard.channel===null,answerLabel:k(`channels.setup.continue`),busyLabel:k(`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 Wt(e){let t=e.whatsappConnected===!0;return S`
<div class="channels-wizard__message">
${k(t?`channels.setup.whatsappLinked`:`channels.setup.whatsappScanTitle`)}
</div>
${e.whatsappMessage?S`<div class="channels-wizard__note">${e.whatsappMessage}</div>`:w}
${t?w:S`
<div class="channels-wizard__qr">
${e.whatsappQrDataUrl?S`<img
src=${e.whatsappQrDataUrl}
alt=${k(`channels.setup.whatsappQrAlt`)}
/>`:e.whatsappBusy?w:S`<div class="channels-wizard__spinner">
${k(`channels.setup.whatsappQrHint`)}
</div>`}
</div>
<div class="channels-wizard__note">${k(`channels.setup.whatsappScanHelp`)}</div>
`}
<div class="channels-wizard__footer">
${t?S`
<button type="button" class="btn primary" @click=${()=>e.onClose()}>
${k(`channels.setup.finish`)}
</button>
`:S`
${e.whatsappBusy?I(k(`channels.setup.whatsappQrLoading`)):S`
<button type="button" class="btn" @click=${()=>e.onWhatsAppStart(!0)}>
${e.whatsappQrDataUrl?k(`channels.setup.regenerateQr`):k(`common.showQr`)}
</button>
${e.whatsappQrDataUrl?S`
<button
type="button"
class="btn primary"
@click=${()=>e.onWhatsAppWait()}
>
${k(`common.waitForScan`)}
</button>
`:w}
`}
<button type="button" class="btn" @click=${()=>e.onClose()}>
${k(`channels.setup.linkLater`)}
</button>
`}
</div>
`}function Gt(e,t){if(e.includes(`whatsapp`))return Wt(t);let n=e.length>0;return S`
<div class="channels-wizard__message">
${k(n?`channels.setup.doneTitle`:`channels.setup.doneNoChangesTitle`)}
</div>
<div class="channels-wizard__note">
${k(n?`channels.setup.doneBody`:`channels.setup.doneNoChangesBody`)}
</div>
<div class="channels-wizard__footer">
<button type="button" class="btn primary" @click=${()=>t.onClose()}>
${k(n?`channels.setup.finish`:`common.close`)}
</button>
</div>
`}function Kt(e){return e?.externalUrl?S`
<div class="channels-wizard__links">
<a
class="channels-wizard__link"
href=${e.externalUrl}
target="_blank"
rel="noreferrer noopener"
>
${k(`channels.setup.openLink`)}
</a>
</div>
`:w}function qt(e){let t=e.wizard;if(t.phase===`idle`)return w;let n=t.channel,r=n?e.channelLabel(n):k(`channels.setup.genericTitle`),i=t.phase===`step`?t.step:null,a;return t.phase===`starting`?a=S`<div class="channels-wizard__footer">
${I(k(`channels.setup.starting`))}
</div>`:t.phase===`error`?a=S`
<div class="channels-wizard__error">${t.message}</div>
<div class="channels-wizard__footer">
<button type="button" class="btn" @click=${()=>e.onClose()}>
${k(`common.close`)}
</button>
</div>
`:t.phase===`done`?a=Gt(t.channels,e):i&&(a=S`
${t.phase===`step`&&t.validationError?S`<div class="channels-wizard__error">${t.validationError}</div>`:w}
${Ut(i,e)}
`),S`
<openclaw-modal-dialog
label=${k(`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),preferPluginIcon:e.channelHasPluginIcon?.(n)}):w}
<div class="channels-wizard__heading">
<h2>${k(`channels.setup.title`,{channel:r})}</h2>
<div class="muted channels-wizard__subtitle">
<span>${k(`channels.setup.subtitle`)}</span>
${n?S`<a
class="channels-wizard__link"
href=${st(n)}
target="_blank"
rel="noreferrer noopener"
>${k(`channels.setup.viewDocs`)}</a
>`:w}
</div>
</div>
</div>
<div class="channels-wizard__body">${Kt(i)} ${a}</div>
</div>
</openclaw-modal-dialog>
`}function Jt(){return(Jt=e((()=>{x(),F(),Le(),O(),E()})))()}function Yt(e){let t=Zt(e.snapshot),n=t.filter(t=>ht(t,e)),r=t.filter(t=>!ht(t,e)),i=!!(e.loading&&e.snapshot&&e.lastSuccessAt),a=e.snapshot?.warnings?.filter(e=>e.trim()).map(e=>s(e))??[],o=Xt(e),c=e.selectedChannel,l=c?X(e,c):void 0;return S`
${Se(S`
${i?S`<div class="callout info">${k(`channels.refreshingStaleSnapshot`)}</div>`:w}
${e.snapshot?.partial?S`
<div class="callout warn">
${k(`channels.hub.partialSnapshot`)}
${a.length>0?a.slice(0,3).join(`; `):``}
</div>
`:w}
${e.lastError?S`<div class="callout danger">${e.lastError}</div>`:w}
${e.setupBlockedByDirtyConfig&&e.configFormDirty?S`<div class="callout warn">${k(`channels.hub.saveBeforeSetup`)}</div>`:w}
${N({title:k(`channels.hub.connectedTitle`),...n.length>0?{count:n.length}:{},actions:vt({updatedAt:e.lastSuccessAt,disabled:e.loading,onRefresh:()=>e.onRefresh(!0)})},n.length===0?S`
<div class="channels-empty">
<!-- No configured transports is a true empty state, so Clawd rests here. -->
<openclaw-mascot mood="sleepy" .size=${80}></openclaw-mascot>
${M(k(`channels.hub.noneConnected`))}
</div>
`:ae(n,e=>e,t=>nn(t,e)))}
${N({title:k(`channels.hub.addTitle`),description:k(`channels.hub.addSubtitle`)},S`
${e.canAdmin?S`${ae(r,e=>e,t=>rn(t,e))}
${an(e)}`:S`<div class="callout info" role="note">${k(`channels.hub.adminRequired`)}</div>`}
`)}
${jt(e)}
`)}
${c?zt({channelId:c,label:Z(e,c),pluginIconUrl:e.pluginIconUrls[c],preferPluginIcon:l?.hasIcon===!0,props:e,data:o,onClose:()=>e.onCloseDetail(),onSetup:()=>e.onStartSetup(c)}):w}
${e.canAdmin?qt({wizard:e.wizard,channelLabel:t=>Z(e,t),channelIconUrl:t=>e.pluginIconUrls[t],channelHasPluginIcon:t=>X(e,t)?.hasIcon===!0,multiselectValues:e.wizardMultiselect,onToggleMultiselect:e.onWizardToggleMultiselect,textValue:e.wizardTextValue,secretVisible:e.wizardSecretVisible,onTextInput:e.onWizardTextInput,onToggleSecretVisibility:e.onWizardToggleSecretVisibility,onAnswer:e.onWizardAnswer,onClose:e.onWizardClose,whatsappQrDataUrl:e.whatsappQrDataUrl,whatsappMessage:e.whatsappMessage,whatsappConnected:e.whatsappConnected,whatsappBusy:e.whatsappBusy,onWhatsAppStart:e.onWhatsAppStart,onWhatsAppWait:e.onWhatsAppWait}):w}
${Nt(e)}
`}function Xt(e){let t=e.snapshot?.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.snapshot?.channelAccounts??null}}function Zt(e){let t=e?.channelMeta?.length?e.channelMeta.map(e=>e.id):e?.channelOrder??[];return[...new Set([...t,...on])]}function X(e,t){return e.pluginCatalog?.plugins.find(e=>e.id===t)}function Z(e,t){let n=e.snapshot,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 Qt(e,t){let n=e.snapshot,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 $t(e,t){let n=B(e,t);return(typeof n.status?.lastError==`string`&&n.status.lastError.trim()?n.status.lastError:b(t.snapshot?.channelAccounts,e).find(e=>e.lastError)?.lastError)?`attention`:n.running===!0||n.connected===!0?`running`:`configured`}function en(e){switch(e){case`running`:return j({kind:`ok`,label:k(`channels.hub.stateRunning`)});case`configured`:return j({kind:`muted`,label:k(`channels.hub.stateConfigured`)});case`attention`:return j({kind:`danger`,label:k(`channels.hub.stateAttention`)});default:return e}}function tn(e,t){let n=b(t.snapshot?.channelAccounts,e).reduce((e,t)=>Math.max(e,t.lastInboundAt??0),0);return n?k(`channels.hub.lastMessageAgo`,{ago:y(n)}):null}function nn(e,t){let n=Z(t,e),r=tn(e,t)??Qt(t,e)??k(`channels.hub.openDetails`);return S`
<button
type="button"
class="settings-row settings-row--nav channels-item"
@click=${()=>t.onShowDetail(e)}
>
${P(e,n,`tile`,{pluginIconUrl:t.pluginIconUrls[e],preferPluginIcon:X(t,e)?.hasIcon===!0})}
<div class="settings-row__text">
<span class="settings-row__title">${n}</span>
<span class="settings-row__desc">${r}</span>
</div>
<div class="settings-row__control">
${en($t(e,t))}
<span class="settings-row__chevron">${D.chevronRight}</span>
</div>
</button>
`}function rn(e,t){let n=X(t,e),r=Z(t,e),i=n?.description??Qt(t,e)??k(`channels.hub.guidedSetup`);return S`
<div class="settings-row channels-item">
<button
type="button"
class="channels-item__detail"
title=${k(`channels.hub.openDetails`)}
@click=${()=>t.onShowDetail(e)}
>
${P(e,r,`tile`,{pluginIconUrl:t.pluginIconUrls[e],preferPluginIcon:n?.hasIcon===!0})}
<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)}>
${k(`channels.hub.setUp`)}
</button>
</div>
</div>
`}function an(e){return S`
<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">${k(`channels.hub.browseAllTitle`)}</span>
<span class="settings-row__desc">${k(`channels.hub.browseAllSubtitle`)}</span>
</div>
<div class="settings-row__control">
<span class="settings-row__chevron">${D.chevronRight}</span>
</div>
</button>
`}var on;function sn(){return(sn=e((()=>{x(),oe(),F(),be(),ye(),A(),O(),v(),l(),_(),Bt(),J(),K(),Jt(),on=[`whatsapp`,`telegram`,`discord`,`googlechat`,`slack`,`signal`,`imessage`,`nostr`]})))()}function cn(e,t){let r=e.state.channelsSnapshot,i=t??r?.channelDefaultAccountId.whatsapp??`default`,a=b(r?.channelAccounts,`whatsapp`).find(e=>e.accountId===i);return!a&&t!==void 0?null:{accountId:i,linked:a?.linked??(t===void 0?n(r?.channels.whatsapp)?.linked:void 0)}}async function ln(e){let t=cn(e.channels,e.getWizardAccountId());if(!t||!e.isCurrent()||!await we({title:k(`channels.whatsapp.logoutConfirmTitle`,{accountId:t.accountId}),message:k(`channels.whatsapp.logoutConfirmMessage`,{accountId:t.accountId}),confirmLabel:k(`common.logout`),danger:!0})||!e.isCurrent())return;let n=cn(e.channels,e.getWizardAccountId());!n||n.accountId!==t.accountId||n.linked!==t.linked||await e.channels.logoutWhatsApp(t.accountId)}function un(){return(un=e((()=>{Te(),O(),v()})))()}async function dn(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}`))},Q)})])}finally{clearTimeout(i)}}function fn(e,t){!t.sessionId||t.done||e.request(`wizard.cancel`,{sessionId:t.sessionId}).catch(()=>{})}var Q,pn;function mn(){return(mn=e((()=>{l(),g(),Q=12e4,pn=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}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=await dn(t,`wizard.start`,{flow:`channels`,...e?{channel:e}:{}},e=>fn(t,e));if(this.generation!==n){fn(t,r);return}this.sessionId=r.sessionId??null,this.applyResult(r)}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 dn(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(ee(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)try{await e.request(`wizard.cancel`,{sessionId:t})}catch{}}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?s(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:s(e.error,`Wizard failed.`)})}setState(e){this.currentState=e,this.onChange()}}})))()}var hn;function gn(){return(gn=e((()=>{O(),mn(),hn=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 pn(()=>e.getContext()?.gateway.snapshot.client??null,()=>this.handleControllerChange(),t=>e.getContext()?.channels.state.channelsSnapshot?.channelMeta?.some(e=>e.id===t)??!1,()=>k(`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.refresh({discardPendingChanges:!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 _n(e,t){return e instanceof DOMException&&e.name===`TimeoutError`?k(`channels.nostr.notices.timeout`):k(`channels.nostr.notices.operationFailed`,{prefix:t,error:c(e)})}var vn,yn,$;function bn(){return(bn=e((()=>{a(),x(),ie(),me(),pe(),ce(),ve(),ue(),A(),Ve(),O(),v(),l(),Oe(),u(),ke(),o(),et(),rt(),L(),sn(),un(),gn(),vn=3e4,yn=`https://docs.openclaw.ai/channels`,$=class extends m{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 nt({getContext:()=>this.context,getChannelIds:()=>Zt(this.context.channels.state.channelsSnapshot),isConnected:()=>this.isConnected,requestUpdate:()=>this.requestUpdate()}),this.wizardHost=new hn({getContext:()=>this.context,requestUpdate:()=>this.requestUpdate(),clearSelection:()=>this.selectedChannel=null}),this.schemaLoadStarted=!1,this.gatewayPairingAuthSignature=null,this.gateway=new De(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>this.clearNostrForm(),onSnapshot:e=>this.handleGatewaySnapshot(e)}),this.pairingPolling=new Ae(this,vn,()=>{let e=this.context?.gateway.snapshot;e?.phase===`connected`&&T(e.hello?.auth??null)&&this.context.channels.refreshPairing()},!1),this.subscriptions=new re(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=T(t.hello?.auth??null),r=d(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&&T(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),T(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){he({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.refresh({discardPendingChanges:!0}),await e.channels.refresh(!0))}async confirmWhatsAppLogout(){let e=this.context,t=e.channels,n=this.gateway.capture();!n||this.channelsSource!==t||await ln({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`}buildGatewayHttpHeaders(e){let t=le({hello:e.snapshot.hello,settings:{token:e.connection.token},password:e.connection.password});return t?{Authorization:t}:{}}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(),headers:this.buildGatewayHttpHeaders(e)}}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=ot(t??void 0)}cancelNostrProfile(){this.invalidateNostrForm()}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 saveNostrProfile(){let e=this.nostrProfileFormState;if(!e||e.saving||e.importing)return;let t=this.beginNostrOperation();if(!t)return;let n={...e,saving:!0,error:null,success:null,fieldErrors:{}};this.nostrProfileFormState=n;try{let{data:n,response:r}=await Ze({accountId:t.accountId,headers:t.headers,values:e.values}),i=this.currentNostrForm(t);if(!i)return;if(!r.ok||n?.ok===!1||!n){this.nostrProfileFormState={...i,saving:!1,error:s(n?.error,k(`channels.nostr.notices.updateFailedStatus`,{status:String(r.status)})),success:null,fieldErrors:Ye(n?.details)};return}if(!n.persisted){this.nostrProfileFormState={...i,saving:!1,error:k(`channels.nostr.notices.publishFailed`),success:null};return}this.nostrProfileFormState={...i,saving:!1,error:null,success:k(`channels.nostr.notices.published`),fieldErrors:{},original:{...e.values}},await t.channels.refresh(!0)}catch(e){let n=this.currentNostrForm(t);if(!n)return;this.nostrProfileFormState={...n,saving:!1,error:_n(e,k(`channels.nostr.notices.updateFailed`)),success:null}}}async importNostrProfile(){let e=this.nostrProfileFormState;if(!e||e.importing||e.saving)return;let t=this.beginNostrOperation();if(t){this.nostrProfileFormState={...e,importing:!0,error:null,success:null};try{let{data:e,response:n}=await Qe({accountId:t.accountId,headers:t.headers}),r=this.currentNostrForm(t);if(!r)return;if(!n.ok||e?.ok===!1||!e){this.nostrProfileFormState={...r,importing:!1,error:s(e?.error,k(`channels.nostr.notices.importFailedStatus`,{status:String(n.status)})),success:null};return}let i=e.merged??e.imported??null,a=i?{...r.values,...i}:r.values;this.nostrProfileFormState={...r,importing:!1,values:a,error:null,success:e.saved?k(`channels.nostr.notices.importedFromRelays`):k(`channels.nostr.notices.imported`),showAdvanced:!!(a.banner||a.website||a.nip05||a.lud16)},e.saved&&await t.channels.refresh(!0)}catch(e){let n=this.currentNostrForm(t);if(!n)return;this.nostrProfileFormState={...n,importing:!1,error:_n(e,k(`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:je(),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=k(`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`?k(`channels.pairing.approvedFollowupsFailedNotice`):t.commandOwnerBootstrap===`unavailable`?k(`channels.pairing.approvedOwnerFailedNotice`):t.notification===`failed`?k(`channels.pairing.approvedNotificationFailedNotice`):t.commandOwnerBootstrap===`configured`?k(`channels.pairing.approvedOwnerNotice`):k(`channels.pairing.approvedNotice`))}render(){let e=this.context,t=e.channels.state,n=e.runtimeConfig.state,r=e.gateway.snapshot.hello?.auth??null,i=T(r),a=fe(r);return S`
<section class="content-header">
<div>
<div class="page-title">${_e(`channels`)}</div>
<div class="page-subtitle">
${se(`channels`)} ${Ee(yn)}
</div>
</div>
</section>
${Be(Yt({connected:t.connected,loading:t.channelsLoading,snapshot:t.channelsSnapshot,pluginCatalog:this.pluginPresentation.pluginCatalog,pluginIconUrls:this.pluginPresentation.pluginIconUrls,lastError:t.channelsError,lastSuccessAt:t.channelsLastSuccess,pairingLoading:t.pairingLoading,pairingSnapshot:t.pairingSnapshot,pairingError:t.pairingError,pairingLastSuccessAt:t.pairingLastSuccess,pairingBusyRequestId:t.pairingBusyRequestId,pairingChannelFilter:this.pairingChannelFilter,pairingAccountFilter:this.pairingAccountFilter,pairingPrompt:this.pairingPrompt,pairingNotice:this.pairingNotice,canManagePairing:i,canAdmin:a,whatsappMessage:t.whatsappLoginMessage,whatsappQrDataUrl:t.whatsappLoginQrDataUrl,whatsappConnected:t.whatsappLoginConnected,whatsappBusy:t.whatsappBusy,configSchema:n.configSchema,configSchemaLoading:n.configSchemaLoading,configForm:n.configForm,configUiHints:n.configUiHints,configSaving:n.configSaving,configError:n.lastError,configFormDirty:n.configFormDirty,showAdvancedSettings:de().showAdvancedSettings===!0,nostrProfileFormState:this.nostrProfileFormState,nostrProfileAccountId:this.nostrProfileAccountId,selectedChannel:this.selectedChannel,wizard:this.wizardHost.state,wizardMultiselect:this.wizardHost.multiselect,wizardTextValue:this.wizardHost.textValue,wizardSecretVisible:this.wizardHost.secretVisible,setupBlockedByDirtyConfig:this.wizardHost.blockedByDirtyConfig,onShowDetail:e=>{this.selectedChannel=e},onCloseDetail:()=>{this.selectedChannel=null},onStartSetup:e=>{a&&this.wizardHost.startSetup(e)},onWizardAnswer:e=>this.wizardHost.answer(e),onWizardToggleMultiselect:e=>this.wizardHost.toggleMultiselect(e),onWizardTextInput:e=>this.wizardHost.setTextValue(e),onWizardToggleSecretVisibility:()=>this.wizardHost.toggleSecretVisibility(),onWizardClose:()=>this.wizardHost.close(),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.cancelNostrProfile(),onNostrProfileFieldChange:(e,t)=>this.changeNostrProfileField(e,t),onNostrProfileSave:()=>void this.saveNostrProfile(),onNostrProfileImport:()=>void this.importNostrProfile(),onNostrProfileToggleAdvanced:()=>this.toggleNostrProfileAdvanced()}))}
`}},i([t({context:ge,subscribe:!0})],$.prototype,`context`,void 0),i([C()],$.prototype,`nostrProfileFormState`,void 0),i([C()],$.prototype,`nostrProfileAccountId`,void 0),i([C()],$.prototype,`selectedChannel`,void 0),i([C()],$.prototype,`pairingChannelFilter`,void 0),i([C()],$.prototype,`pairingAccountFilter`,void 0),i([C()],$.prototype,`pairingPrompt`,void 0),i([C()],$.prototype,`pairingNotice`,void 0),customElements.get(`openclaw-channels-page`)||customElements.define(`openclaw-channels-page`,$)})))()}bn();
//# sourceMappingURL=channels-page-Dw5C3qwr.js.map