openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
31 lines • 24.2 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./agent-avatar-DPLn2tSe.js","./gateway-runtime-C77LeWZN.js","./session-snapshot-database-BBKeXATO.js","./control-ui-boot-shared-UG5ko-VG.js","./control-ui-boot-shared-gZIpWrfw.js","./control-ui-boot-shared-SQHdJTzb.js","./control-ui-boot-shared-VLPz5vN2.js","./plugin-contracts-runtime-ByiEPbv_.js","./control-ui-boot-shared-Q8KG_noF.js","./config-runtime-BecGLziM.js","./markdown-runtime-ORQpioyT.js","./control-ui-boot-shared-XreXSF7h.js","./control-ui-boot-shared-styles-BXPMRytW.js","./sidebar-update-runtime-DQZboSgD.js","./control-ui-core-DI-Q_yCI.css","./control-ui-boot-shared-styles-DUf4zEvn.css","./control-ui-boot-shared-DIWJGbGi.css","./sidebar-update-runtime-Bpn2ByHA.css","./appearance-picker-Bq3_lQyf.js","./control-ui-session-summary-BoN_TV_Z.js","./control-ui-boot-chat-CmENwCKi.js","./control-ui-boot-chat-Ye5j4vAg.js","./control-ui-boot-chat-XPUNenUd.js","./control-ui-boot-chat-CGYcTLro.js","./control-ui-boot-chat-k_u3nGjS.js","./chat-transcript-styles-BN-TorbW.js","./control-ui-boot-chat-styles-BcslGtWC.js","./chat-transcript-styles-B0IJwY9P.css","./control-ui-boot-chat-styles-SRk09zDG.css","./control-ui-boot-chat-C2DT0d4M.css","./control-ui-session-summary-C-mJ1E_e.css","./control-ui-dashboard-BvkmzK1a.js","./control-ui-dashboard-BZzcciLT.css"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Au as t,Hs as n,Ic as r,Kc as i,Lc as a,Lu as o,Nu as s,Pu as c,Rl as l,Su as u,Uc as d,Wc as f,kl as p,n as m,r as ee,wu as te,zl as ne,zu as h}from"./control-ui-core-CBJ5efDh.js";import{Aa as g,Ai as re,Ao as ie,La as _,Sr as v,Tr as y,_o as ae,ai as b,ca as x,go as S,j as C,k as w,ki as T,sa as E,to as oe,ui as se,wo as ce,wr as D}from"./control-ui-core-DtLivg_r.js";import{G as O,J as k,K as A,W as j,Z as M,at as N,c as P,l as F,rt as I}from"./lit-runtime-IOnANfcZ.js";import{An as L,jn as R}from"./control-ui-boot-shared-CkXlyZBY.js";import{A as z,Ur as B,Wr as V,Zr as H,j as U,ma as W,pa as G}from"./ui-CmSP4d14.js";import{da as le,la as ue,sa as de}from"./control-ui-boot-shared-dOnP4mAA.js";function K(e){let t=R(e??``);if(t)return`var(--session-color-${t})`;let n=e?.trim()??``;return/^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/iu.test(n)?n:``}function fe(e){function t(t,n,r,i,a,o){e.current(),e.signal.throwIfAborted();let s=n,c,l=!0,u,d,f=()=>{if(!l)throw Error(`This plugin component has been disposed.`);return e.signal.throwIfAborted(),e.current()},p=()=>{c&&l&&i(c,s,f)},m=()=>{l&&(l=!1,e.signal.removeEventListener(`abort`,m),u?.(),d?.(),c?.remove())};return e.signal.addEventListener(`abort`,m,{once:!0}),r().then(n=>{if(!l||e.signal.aborted)return;f(),c=n,d=a?.(c,()=>(f(),s)),p(),t.append(c);let r=f(),i=[r.gateway.subscribe(p),r.agents.subscribe(p)];o&&i.push(o(r,p)),u=()=>i.forEach(e=>e())}).catch(t=>{l&&(m(),e.onError(t))}),{update(e){f(),s=e,p()},dispose:m}}return{resolveAppearanceColor(t){return e.current(),e.signal.throwIfAborted(),K(t)},mountAgentAvatar:(e,n)=>t(e,n,async()=>{let{AgentAvatar:e}=await G(async()=>{let{AgentAvatar:e}=await import(`./agent-avatar-DPLn2tSe.js`).then(e=>(e.n(),e.t));return{AgentAvatar:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17]),import.meta.url);return new e},(e,t,n)=>{let r=n(),i=r.agents.state.agentsList,a=t.agentId||i?.defaultId||``;e.option={value:a,label:t.label,agent:i?.agents.find(e=>e.id===a)??{id:a}},e.identity=r.agentIdentity.get(a),r.agentIdentity.ensure([a])},void 0,(e,t)=>e.agentIdentity.subscribe(t)),mountAppearancePicker:(e,n)=>t(e,n,async()=>{let{AppearancePicker:e}=await G(async()=>{let{AppearancePicker:e}=await import(`./appearance-picker-Bq3_lQyf.js`);return{AppearancePicker:e}},__vite__mapDeps([18,1,2,4,5,6,9,8,7,10,11,3,12,13,14,15,16,17]),import.meta.url);return new e},(e,t,n)=>{e.props={...t,onChange:e=>{n(),t.onChange(e)}}}),mountAppearanceGlyph:(e,n)=>t(e,n,async()=>{let{AppearanceGlyph:e}=await G(async()=>{let{AppearanceGlyph:e}=await import(`./appearance-picker-Bq3_lQyf.js`);return{AppearanceGlyph:e}},__vite__mapDeps([18,1,2,4,5,6,9,8,7,10,11,3,12,13,14,15,16,17]),import.meta.url);return new e},(e,t)=>{e.props=t,e.style.setProperty(`--appearance-color`,K(t.color)||`var(--muted)`)}),mountDialog:(e,n)=>t(e,n,async()=>(await G(()=>import(`./control-ui-core-DtLivg_r.js`).then(e=>(e.qr(),e.Jr)),__vite__mapDeps([1,2,14]),import.meta.url),document.createElement(`openclaw-modal-dialog`)),(e,t)=>{e.label=t.label,e.description=t.description??``,e.className=t.className??``,e.style.cssText=t.style??``,t.returnFocusTarget!==void 0&&e.setReturnFocusTarget(t.returnFocusTarget),e.firstChild!==t.content&&e.replaceChildren(t.content)},(e,t)=>{let n=e=>{t().onCancel()===!1&&e.preventDefault()};return e.addEventListener(`modal-cancel`,n),()=>e.removeEventListener(`modal-cancel`,n)}),mountAgentPicker:(e,n)=>t(e,n,async()=>(await G(()=>import(`./control-ui-boot-shared-XreXSF7h.js`).then(e=>(e.ki(),e.Oi)),__vite__mapDeps([11,1,2,4,5,6,7,8,9,10,3,12,13,14,15,16,17]),import.meta.url),document.createElement(`openclaw-agent-select`)),(e,t,n)=>{let r=n().agents.state.agentsList?.agents??[];e.options=t.options.map(e=>({...e,agent:r.find(t=>t.id===e.agent?.id)??e.agent,icon:e.icon?E[e.icon]:void 0})),e.value=t.value,e.placeholder=t.placeholder??``,e.accessibleLabel=t.accessibleLabel,e.menuLabel=t.menuLabel??``,e.variant=t.variant??`default`,e.disabled=t.disabled??!1,e.onSelect=e=>{n(),t.onSelect(e)}}),mountSelectPicker:(e,n)=>t(e,n,async()=>{let{SelectPicker:e}=await G(async()=>{let{SelectPicker:e}=await import(`./control-ui-boot-shared-XreXSF7h.js`).then(e=>(e.dn(),e.pn));return{SelectPicker:e}},__vite__mapDeps([11,1,2,4,5,6,7,8,9,10,3,12,13,14,15,16,17]),import.meta.url);return new e},(e,t,n)=>{e.className=`settings-select picker-select`,e.params={options:t.options,value:t.value,label:t.accessibleLabel,searchable:t.searchable,disabled:t.disabled,onChange:e=>{n(),t.onSelect(e)}}}),mountSessionSummary:(e,n)=>t(e,n,async()=>(await G(()=>import(`./control-ui-session-summary-BoN_TV_Z.js`),__vite__mapDeps([19,1,2,3,4,5,6,7,8,9,10,11,12,13,0,20,21,22,23,24,25,26,14,15,16,17,27,28,29,30]),import.meta.url),document.createElement(`openclaw-plugin-session-summary`)),(e,t,n)=>{e.session=t.session,e.gateway=n().gateway,e.agents=n().agents.state.agentsList?.agents??[],e.agentIdentity=n().agentIdentity,e.presented=t.presented,e.requestUpdate()}),mountDashboard:(e,n)=>t(e,n,async()=>(await G(()=>import(`./control-ui-dashboard-BvkmzK1a.js`),__vite__mapDeps([31,1,2,23,4,5,6,7,8,9,10,21,3,11,12,13,20,22,24,25,26,14,15,16,17,27,28,29,32]),import.meta.url),document.createElement(`openclaw-plugin-session-dashboard`)),(e,t,n)=>{let r=n().gateway.snapshot,i=y(r);e.session=t.session,e.client=r.client,e.connected=r.phase===`connected`,e.canMutate=t.canMutate&&i.canWrite,e.canGrant=t.canGrant&&i.canGrantApprovals,e.presented=t.presented??!0})}}function q(){return(q=e((()=>{L(),D(),x(),W()})))()}function pe(e,t,n){let r=()=>{if(!t.isCurrent(n))throw Error(`This plugin UI activation has ended. Use the current activation.`);return e()},a=e=>(t.isCurrent(n)||(e(),r()),n.disposers.add(e),()=>{n.disposers.delete(e),e()}),s=async e=>{let t=await e(r());return r(),t},c=(e,t)=>{let i=r(),a=i.gateway.snapshot.hello?.controlUiTabs?.find(t=>t.pluginId===n.descriptor.pluginId&&t.id===e.id),o=a?.placement?.startsWith(`route:`)?a.placement.slice(6):null,s=o&&ae(o)?o:null,c=ie(a??{pluginId:n.descriptor.pluginId,id:e.id},i.basePath),l=s?ce(s,i.basePath):c.pathname,u=s?e.path?.map(encodeURIComponent).join(`/`):void 0,d=new URLSearchParams(t?.preserveSearch?window.location.search:``);if(!s){d.delete(`plugin`),d.delete(`id`);for(let[e,t]of new URLSearchParams(c.search))d.set(e,t)}for(let[t,n]of Object.entries(e.params??{}))d.set(`p.${t}`,n);return{route:s??`plugin`,pathname:u?`${l}/${u}`:l,search:d.size?`?${d}`:``}},u=e().assistantDock,d=!1;return{apiVersion:1,pluginId:n.descriptor.pluginId,signal:n.abort.signal,get basePath(){return r().basePath},get locale(){return o.getLocale()},redact:te,components:fe({current:r,signal:n.abort.signal,onError:e=>t.reportError(n.descriptor.pluginId,e)}),get connection(){let e=r().gateway.snapshot,t=y(e);return{connected:e.phase===`connected`,canRead:v(e.hello?.auth??null),canWrite:t.canWrite,canGrant:t.canGrantApprovals,canAdmin:t.canAdmin,assistantAgentId:e.assistantAgentId}},request:(e,t={})=>s(()=>n.client.request(e,t)),onEvent(e,i){return a(r().gateway.subscribeEvents(r=>{t.isCurrent(n)&&r.event===e&&i(r.payload)}))},subscribe(e){let i=r(),s=()=>{t.isCurrent(n)&&e()},c=[i.gateway.subscribe(s),i.sessions.subscribe(s),i.agents.subscribe(s),i.agentSelection.subscribe(s),i.theme.subscribe(s),o.subscribe(s),...u?[u.subscribe(s)]:[]];return a(()=>c.forEach(e=>e()))},sessions:{get rows(){return structuredClone(r().sessions.state.result?.sessions??[])},get selectedKey(){return r().gateway.snapshot.sessionKey},normalizeKey:l,refresh:()=>s(async e=>{if(await e.sessions.refreshReplacement()===null)throw Error(`The session refresh did not complete. Try again.`)}),observe(e,i){let{archived:o,...c}=e,l=!1,u=r().sessions.observeList({...c,archivedFilter:o===`all`?`all`:o?`archived`:`active`},({result:e,loading:r,error:a})=>{if(!l&&t.isCurrent(n))try{i({loading:r,error:a,result:e?{sessions:structuredClone(e.sessions),hasMore:e.hasMore,nextOffset:e.nextOffset,totalCount:e.totalCount}:null})}catch(e){t.reportError(n.descriptor.pluginId,e)}}),d=a(()=>{l=!0,u.dispose()}),f=()=>s(()=>u.refresh());return f().catch(e=>{!l&&t.isCurrent(n)&&t.reportError(n.descriptor.pluginId,e)}),{refresh:f,dispose:d}},open({sessionKey:e,agentId:t}){i(r(),e,t)},create:e=>s(t=>t.sessions.create(e)),patch:({sessionKey:e,agentId:t},n)=>s(async i=>{if(!await i.sessions.patch(e,n,{agentId:t,ownsModelOverride:()=>!1,deferListRefresh:!0}))throw Error(`The session update did not complete. Try again.`);if(r(),await i.sessions.refreshReplacement()===null)throw Error(`The session was updated, but the session list could not be refreshed. Refresh the list to see the change.`)})},agents:{get rows(){return structuredClone(r().agents.state.agentsList?.agents??[])},get selectedId(){return r().agentSelection.state.selectedId},get defaultId(){return r().agents.state.agentsList?.defaultId??null},get scopeId(){return r().agentSelection.state.scopeId},select(e){r().agentSelection.set(e)},setScope(e){r().agentSelection.setScope(e)},refresh:()=>s(async e=>{if(await e.agents.refreshList()===null)throw Error(`The agent refresh did not complete. Try again.`)})},dock:u?{openSession(e){r().assistantDock.openSession(e,n.abort),d||(d=!0,a(()=>u.close(n.abort)))},close(){r().assistantDock.close()},get openSessionKey(){return r().assistantDock.openSessionKey}}:void 0,navigation:{openPage(e,t){let n=c(e,t),i=r();t?.replace?i.replace(n.route,n):i.navigate(n.route,n)},pageHref(e,t){let n=c(e,t);return`${n.pathname}${n.search}`}},ui:{invalidate:()=>t.invalidate(n),registerPage:e=>t.register(n,`pages`,e),registerNavigation:e=>t.register(n,`navigation`,e),pinNavigation(e){let t=r();if(!n.contributions.navigation.has(e))return;let i=_({type:`plugin`,key:`${n.descriptor.pluginId}/${e}`}),a=t.navigation.snapshot.sidebarEntries;a.includes(i)||t.navigation.update({sidebarEntries:[...a,i]})},unpinNavigation(e){let t=r(),i=_({type:`plugin`,key:`${n.descriptor.pluginId}/${e}`}),a=t.navigation.snapshot.sidebarEntries;a.includes(i)&&t.navigation.update({sidebarEntries:a.filter(e=>e!==i)})},isNavigationPinned(e){return r().navigation.snapshot.sidebarEntries.includes(_({type:`plugin`,key:`${n.descriptor.pluginId}/${e}`}))},registerPanel:e=>t.register(n,`panels`,e),openPanel(e,t){let a=r();if(!n.contributions.panels.has(e))throw Error(`A plugin can open only its own registered panel.`);let o=t?.sessionKey??a.gateway.snapshot.sessionKey;if(!o)throw Error(`Select a session before opening a plugin panel.`);let s={pluginId:n.descriptor.pluginId,panelId:e,sessionKey:o,agentId:t?.agentId??ne(o)?.agentId??a.agentSelection.state.selectedId??void 0,open:!0},c=new CustomEvent(b,{detail:s});C(`plugin:${s.pluginId}/${e}`,c),i(a,o,t?.agentId),window.dispatchEvent(c)},registerAction:e=>t.register(n,`actions`,e),registerAccessory:e=>t.register(n,`accessories`,e),registerWidget:e=>t.register(n,`widgets`,e),registerReplacement:e=>t.register(n,`replacements`,e),selectReplacement(e,i){if(r(),i!==null&&n.contributions.replacements.get(i)?.value.surface!==e)throw Error(`A plugin can select only its own registered UI replacement.`);n.selections.set(e,i),t.registrations(`replacements`).some(e=>e.host.signal===n.abort.signal)&&t.selectReplacement(e,i===null?null:`${n.descriptor.pluginId}/${i}`)}}}}function J(){return(J=e((()=>{g(),S(),D(),se(),w(),c(),u(),f(),p(),q()})))()}var Y,X;function Z(){return(Z=e((()=>{V(),j(),M(),P(),re(),x(),c(),f(),s(),a(),de(),m(),Y=class extends t{constructor(...e){super(...e),this.kind=`replacements`,this.contributionKey=``,this.surface=`workspace`,this.props={},this.defaultView=O,this.replacementCompanion=O,this.presented=!0,this.error=``,this.mountGeneration=0,this.composerGeneration=0,this.ownerChanged=!1,this.defaultContainers=new Set,this.subscriptions=new r(this).watchStore(()=>this.context?.plugins,()=>{let e=this.resolveRegistration();(this.registration?.value!==e?.value||this.registration?.signal!==e?.signal)&&(this.ownerChanged=!0,this.mountAbort?.abort())})}resolveRegistration(){let e=this.context?.plugins;return this.kind===`replacements`?e?.selectedReplacement(this.surface):e?.registrations(this.kind).find(e=>e.key===this.contributionKey)}requestUpdate(...e){let[t,n]=e;if(t===`presented`&&this.presented!==n&&(this.composerGeneration+=1),t===`props`){let e=n,t=this.props;(e?.sessionKey!==t?.sessionKey||e?.agentId!==t?.agentId)&&(this.ownerChanged=!0,this.mountAbort?.abort())}super.requestUpdate(...e)}shouldUpdate(){return this.isConnected}willUpdate(){this.renderOptions.host=this.defaultHost??this;let e=this.resolveRegistration();(this.registration?.value!==e?.value||this.registration?.signal!==e?.signal||this.ownerChanged)&&(this.ownerChanged=!1,this.unmount(),this.registration=e,this.error=``)}updated(){let e=this.registration;if(!(!e||this.error||e.signal.aborted))try{if(this.mountAbort)this.viewContext&&(this.viewContext={...this.viewContext,props:this.scopedProps(this.mountAbort.signal),presented:this.presented},this.handle?.update?.(this.viewContext));else{let t=this.querySelector(`[data-plugin-view-root]`);if(!t)return;let n=new AbortController;this.mountAbort=n,e.signal.addEventListener(`abort`,()=>{this.unmount(),this.requestUpdate()},{once:!0,signal:n.signal}),this.viewContext={host:le(e.host,n.signal),signal:n.signal,props:this.scopedProps(n.signal),presented:this.presented,mountDefault:e=>{if(n.signal.aborted)throw Error(`This plugin UI view has ended.`);let t=this.defaultContainers.size===0;return this.defaultContainers.add(e),A(this.defaultView,e,{host:this.defaultHost??this}),t&&this.requestUpdate(),()=>{this.defaultContainers.delete(e)&&(A(O,e),this.defaultContainers.size===0&&this.requestUpdate())}}},this.handle=e.value.mount(t,this.viewContext)}for(let e of this.defaultContainers)A(this.defaultView,e,{host:this.defaultHost??this})}catch(e){this.fail(e)}}scopedProps(e){if(this.kind!==`replacements`||this.surface!==`composer`)return structuredClone(this.props);let t=this.props,n=this.composerGeneration,r=()=>{if(!this.presented||n!==this.composerGeneration||e.aborted||this.registration?.signal.aborted)throw Error(`This plugin UI view has ended.`)};return{...t,setDraft:e=>{r(),t.setDraft(e)},send:async()=>{r();let e=await t.send();return r(),e},abort:t.abort?()=>{r(),t.abort()}:void 0}}focus(e){if(this.handle?.focus){this.handle.focus();return}let t=this.querySelector(`textarea, input, [contenteditable=true]`);t?t.focus(e):super.focus(e)}fail(e){let t=this.registration?.pluginId??`host`;this.unmount(),this.error=e instanceof Error?e.message:String(e),this.context?.plugins.reportError(t,e)}unmount(){this.mountGeneration+=1,this.mountAbort?.abort(),this.mountAbort=void 0;let e=this.handle;this.handle=void 0;try{e?.dispose?.()}catch(e){this.context?.plugins.reportError(this.registration?.pluginId??`host`,e)}for(let e of this.defaultContainers)A(O,e);this.defaultContainers.clear(),this.viewContext=void 0}connectedCallback(){super.connectedCallback(),this.requestUpdate()}disconnectedCallback(){this.unmount(),this.subscriptions.clear(),super.disconnectedCallback()}render(){return!this.registration||this.error?k`${this.error?k`<div class="card" role="alert">
${this.error}<button
class="btn btn--sm"
@click=${()=>{this.error=``}}
>
${h(`pluginUi.retryView`)}
</button>
</div>`:O}${this.defaultView}`:k`${this.defaultContainers.size===0?this.replacementCompanion:O}${F(this.mountGeneration,k`<div data-plugin-view-root style="display: contents"></div>`)}`}},H([B({context:T,subscribe:!0})],Y.prototype,`context`,void 0),H([N({attribute:!1})],Y.prototype,`kind`,void 0),H([N({attribute:!1})],Y.prototype,`contributionKey`,void 0),H([N({attribute:!1})],Y.prototype,`surface`,void 0),H([N({attribute:!1})],Y.prototype,`props`,void 0),H([N({attribute:!1})],Y.prototype,`defaultView`,void 0),H([N({attribute:!1})],Y.prototype,`replacementCompanion`,void 0),H([N({attribute:!1})],Y.prototype,`defaultHost`,void 0),H([N({type:Boolean})],Y.prototype,`presented`,void 0),H([I()],Y.prototype,`error`,void 0),X=class extends t{constructor(...e){super(...e),this.lifetime=new AbortController,this.actionLifetimes=new Map,this.kind=`navigation`,this.sessionKey=``,this.navigationKey=``,this.presented=!0,this.actionError=``,this.subscriptions=new r(this).watchStore(()=>this.context?.plugins,()=>this.retireHiddenActions()).watchStore(()=>this.kind===`navigation`?this.context?.router:void 0).watchStore(()=>this.kind===`header`||this.kind===`composer`?this.context?.sessions:void 0,()=>this.retireHiddenActions())}connectedCallback(){this.lifetime.signal.aborted&&(this.lifetime=new AbortController),super.connectedCallback()}disconnectedCallback(){this.lifetime.abort(),this.actionLifetimes.clear(),this.subscriptions.clear(),super.disconnectedCallback()}requestUpdate(...e){let[t,n]=e;(t===`sessionKey`||t===`agentId`||t===`presented`)&&this[t]!==n&&(this.lifetime.abort(),this.actionLifetimes.clear(),this.lifetime=new AbortController),super.requestUpdate(...e)}currentSession(){return this.context?d(this.context,this.sessionKey,this.agentId):void 0}resolveAction(e){let t=this.currentSession();try{return e.value.resolve?.({sessionKey:this.sessionKey,agentId:this.agentId??t?.agentId,session:t?structuredClone(t):void 0})}catch(t){return this.retireAction(e.signal),this.context?.plugins.reportError(e.pluginId,t),{hidden:!0}}}retireAction(e){let t=this.actionLifetimes.get(e);this.actionLifetimes.delete(e),t?.abort.abort()}retireHiddenActions(){for(let[e,{entry:t}]of this.actionLifetimes)(e.aborted||this.resolveAction(t)?.hidden)&&this.retireAction(e)}render(){let e=this.context?.plugins;if(!e)return O;if(this.kind===`navigation`){let t=new URLSearchParams(window.location.search),r=e.registrations(`navigation`).map(e=>{let n=e.host.navigation.pageHref(e.value.page),r=new URL(n,window.location.href);return{entry:e,href:n,active:r.pathname===window.location.pathname&&[...r.searchParams].every(([e,n])=>t.get(e)===n)}}),i=({entry:e,href:t,active:r},i=!1,a=`plug`)=>{let o=Object.hasOwn(E,a)?a:`plug`;return e.value.icon&&Object.hasOwn(E,e.value.icon)&&(o=e.value.icon),k`<a
class="nav-item ${i?`nav-item--child`:``} ${r?`nav-item--active`:``}"
href=${t}
aria-current=${r?`page`:O}
aria-haspopup=${e.value.actions?.length?`menu`:O}
@contextmenu=${e.value.actions?.length?t=>{t.preventDefault(),t.stopPropagation();let n=t.currentTarget;this.navigationMenus?.openPluginNavigationMenu(e,t.clientX,t.clientY,n)}:O}
@keydown=${e.value.actions?.length?t=>{if(t.key!==`ContextMenu`&&!(t.shiftKey&&t.key===`F10`))return;t.preventDefault(),t.stopPropagation();let n=t.currentTarget,r=n.getBoundingClientRect();this.navigationMenus?.openPluginNavigationMenu(e,r.left,r.bottom,n)}:O}
@click=${t=>{n(t)&&(t.preventDefault(),e.host.navigation.openPage(e.value.page))}}
><span class="nav-item__icon" aria-hidden="true">${E[o]}</span
><span class="nav-item__text">${e.value.label}</span></a
>`};return r.filter(({entry:e})=>e.key===this.navigationKey).map(e=>{let t=r.filter(({entry:t})=>t.pluginId===e.entry.pluginId&&t.value.parent===e.entry.value.id&&t.key!==e.entry.key).toSorted((e,t)=>(e.entry.value.order??0)-(t.entry.value.order??0)||e.entry.value.label.localeCompare(t.entry.value.label));return!t.length||!(e.active||t.some(e=>e.active))?i(e):k`<div class="nav-item-group">
${i(e)}
<ul class="nav-item__children">
${t.map(t=>k`<li>${i(t,!0,e.entry.value.icon)}</li>`)}
</ul>
</div>`})}return this.kind===`session-header`?e.registrations(`accessories`).filter(e=>e.value.placement===`session-header`).map(e=>ee(`accessories`,e.key,{sessionKey:this.sessionKey,agentId:this.agentId},this.presented)):k`${this.actionError?k`<span role="alert">${this.actionError}</span>`:O}${e.registrations(`actions`).filter(e=>e.value.placement===this.kind).map(t=>{let n=this.resolveAction(t);if(n?.hidden)return this.retireAction(t.signal),O;let r=this.actionLifetimes.get(t.signal);r||(r={entry:t,abort:new AbortController},this.actionLifetimes.set(t.signal,r));let i=AbortSignal.any([this.lifetime.signal,t.signal,r.abort.signal]);return k`<button
class="btn btn--sm"
type="button"
?disabled=${n?.disabled??!1}
@click=${async()=>{if(!i.aborted&&this.presented&&this.isConnected){this.actionError=``;try{await ue({runtime:e,id:t.key,placement:t.value.placement,sessionKey:this.sessionKey,agentId:this.agentId,session:this.currentSession(),signal:i})}catch(e){i.aborted||(this.actionError=e instanceof Error?e.message:String(e))}}}}
>
${n?.label??t.value.label}
</button>`})}`}},H([B({context:T,subscribe:!0})],X.prototype,`context`,void 0),H([N({attribute:!1})],X.prototype,`kind`,void 0),H([N({attribute:!1})],X.prototype,`sessionKey`,void 0),H([N({attribute:!1})],X.prototype,`agentId`,void 0),H([N({attribute:!1})],X.prototype,`navigationKey`,void 0),H([N({attribute:!1})],X.prototype,`navigationMenus`,void 0),H([N({type:Boolean})],X.prototype,`presented`,void 0),H([I()],X.prototype,`actionError`,void 0),customElements.get(`openclaw-plugin-contributions`)||customElements.define(`openclaw-plugin-contributions`,X),customElements.get(`openclaw-plugin-view`)||customElements.define(`openclaw-plugin-view`,Y)})))()}function Q(e,t){let n=new URL(oe(e),window.location.href);if(n.origin!==window.location.origin||!n.pathname.startsWith(t))throw Error(`Native plugin assets must be served by this Control UI Gateway.`);return n.href}async function me(e,t,n,r,i){if(!t.isCurrent(n))return;let{descriptor:a,abort:o}=n,s=`${z(a.pluginId,e().resourceBasePath)}${encodeURIComponent(a.revision)}/`,c=Object.assign(n,{host:pe(e,t,n)}),l=Q(a.entryUrl,s);for(let e of a.styles){let t=document.createElement(`link`);t.rel=`stylesheet`,t.media=`not all`,t.href=Q(e,s);let n=new Promise((e,n)=>{t.addEventListener(`load`,()=>e(),{once:!0,signal:o.signal}),t.addEventListener(`error`,()=>n(Error(`Could not load plugin stylesheet: ${a.pluginId}`)),{once:!0,signal:o.signal}),o.signal.addEventListener(`abort`,()=>n(Error(`Plugin UI activation ended.`)),{once:!0})});document.head.append(t),c.disposers.add(()=>t.remove()),r.push(t),await n}let u=await G(()=>import(l),[],import.meta.url);if(!t.isCurrent(n)){i();return}if(u.default?.id!==a.pluginId||typeof u.default.activate!=`function`)throw Error(`Native UI entry must export its matching defineControlUiPlugin definition.`);let d=await u.default.activate(c.host);if(d&&c.disposers.add(d),!t.isCurrent(n)){i();return}return c}function $(){return($=e((()=>{U(),J(),Z(),W()})))()}$();export{me as initializeControlUiPlugin};