UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

28 lines • 23.3 kB
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./agent-avatar-DURlTU5x.js","./gateway-runtime-Cr51Pi7N.js","./session-snapshot-database-BurLa_ut.js","./control-ui-boot-shared-DJkUdZmL.js","./control-ui-boot-shared-Dfs-gZII.js","./control-ui-boot-shared-Sj2zqjOr.js","./control-ui-boot-shared-em9-jnbz.js","./plugin-contracts-runtime-CNCaYops.js","./control-ui-boot-shared-D4XEBdOG.js","./config-runtime-BecGLziM.js","./markdown-runtime-ORQpioyT.js","./control-ui-boot-shared-xfDhIVun.js","./control-ui-boot-shared-styles-BaQ2sAfZ.js","./sidebar-update-runtime-DonYLwN5.js","./control-ui-core-yIvVj14Y.css","./control-ui-boot-shared-styles-DKyMAG_6.css","./control-ui-boot-shared-CXHNz0Bh.css","./sidebar-update-runtime-ah7rgQE7.css","./appearance-picker-CDXCppfM.js","./control-ui-session-summary-B_5L8hCL.js","./control-ui-boot-chat-C8hdsB2M.js","./control-ui-boot-chat-VeeaXyJz.js","./control-ui-boot-chat-Ck7W_FPO.js","./control-ui-boot-chat-DxoNF0Ad.js","./chat-transcript-styles-Dzr3t9kA.js","./control-ui-boot-chat-styles-BRrYkFSc.js","./chat-transcript-styles-B_dd5Ueo.css","./control-ui-boot-chat-styles-C_Ls1c0m.css","./control-ui-boot-chat-mLz7NUiY.css","./control-ui-session-summary-BqeNVsoC.css","./control-ui-dashboard-B9n4QvZP.js","./control-ui-dashboard-BZzcciLT.css"])))=>i.map(i=>d[i]); import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Ac as t,Al as n,Eu as r,Fs as i,Ic as a,Lc as o,Sl as s,Su as c,Tu as l,gu as u,jl as d,ju as f,kc as p,ku as m,mu as h,n as ee,r as te,zc as g}from"./control-ui-core-BncvAZjR.js";import{$a as _,A as v,Ma as y,O as b,Oo as ne,So as re,Sr as x,Ti as S,ai as C,ei as ie,ho as ae,mo as w,na as T,ra as E,wa as oe,wi as D,xr as O,yr as se}from"./control-ui-core-9qYjK5B2.js";import{$ as k,X as A,Y as ce,Z as j,ct as M,d as N,nt as P,u as F,ut as I}from"./lit-runtime-B8uOr6OX.js";import{On as L,kn as R}from"./control-ui-boot-shared-umGE-sEP.js";import{L as z,R as B,Xr as V,Zr as H,ii as U,oa as W,sa as G}from"./ui-DuRgK6kL.js";import{Li as le,Vi as ue,zi as de}from"./control-ui-boot-shared-D3oo_6Fq.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 W(async()=>{let{AgentAvatar:e}=await import(`./agent-avatar-DURlTU5x.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 W(async()=>{let{AppearancePicker:e}=await import(`./appearance-picker-CDXCppfM.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 W(async()=>{let{AppearanceGlyph:e}=await import(`./appearance-picker-CDXCppfM.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 W(()=>import(`./control-ui-core-9qYjK5B2.js`).then(e=>(e.Wr(),e.Gr)),__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 W(()=>import(`./control-ui-boot-shared-xfDhIVun.js`).then(e=>(e._i(),e.gi)),__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?T[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 W(async()=>{let{SelectPicker:e}=await import(`./control-ui-boot-shared-xfDhIVun.js`).then(e=>(e.ln(),e.dn));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 W(()=>import(`./control-ui-session-summary-B_5L8hCL.js`),__vite__mapDeps([19,1,2,3,4,5,6,7,8,9,10,11,12,13,0,20,21,22,23,24,25,14,15,16,17,26,27,28,29]),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 W(()=>import(`./control-ui-dashboard-B9n4QvZP.js`),__vite__mapDeps([30,1,2,20,4,5,6,7,8,9,10,21,3,11,12,13,22,23,24,25,14,15,16,17,26,27,28,31]),import.meta.url),document.createElement(`openclaw-plugin-session-dashboard`)),(e,t,n)=>{let r=n().gateway.snapshot,i=x(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(),O(),E(),G()})))()}function pe(e,t,r){let i=()=>{if(!t.isCurrent(r))throw Error(`This plugin UI activation has ended. Use the current activation.`);return e()},a=e=>(t.isCurrent(r)||(e(),i()),r.disposers.add(e),()=>{r.disposers.delete(e),e()}),o=async e=>{let t=await e(i());return i(),t},s=(e,t)=>{let n=i(),a=n.gateway.snapshot.hello?.controlUiTabs?.find(t=>t.pluginId===r.descriptor.pluginId&&t.id===e.id),o=a?.placement?.startsWith(`route:`)?a.placement.slice(6):null,s=o&&ae(o)?o:null,c=ne(a??{pluginId:r.descriptor.pluginId,id:e.id},n.basePath),l=s?re(s,n.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}`:``}},c=e().assistantDock,l=!1;return{apiVersion:1,pluginId:r.descriptor.pluginId,signal:r.abort.signal,get basePath(){return i().basePath},get locale(){return m.getLocale()},redact:u,components:fe({current:i,signal:r.abort.signal,onError:e=>t.reportError(r.descriptor.pluginId,e)}),get connection(){let e=i().gateway.snapshot,t=x(e);return{connected:e.phase===`connected`,canRead:se(e.hello?.auth??null),canWrite:t.canWrite,canGrant:t.canGrantApprovals,canAdmin:t.canAdmin,assistantAgentId:e.assistantAgentId}},request:(e,t={})=>o(()=>r.client.request(e,t)),onEvent(e,n){return a(i().gateway.subscribeEvents(i=>{t.isCurrent(r)&&i.event===e&&n(i.payload)}))},subscribe(e){let n=i(),o=()=>{t.isCurrent(r)&&e()},s=[n.gateway.subscribe(o),n.sessions.subscribe(o),n.agents.subscribe(o),n.agentSelection.subscribe(o),n.theme.subscribe(o),m.subscribe(o),...c?[c.subscribe(o)]:[]];return a(()=>s.forEach(e=>e()))},sessions:{get rows(){return structuredClone(i().sessions.state.result?.sessions??[])},get selectedKey(){return i().gateway.snapshot.sessionKey},normalizeKey:n,refresh:()=>o(async e=>{if(await e.sessions.refreshReplacement()===null)throw Error(`The session refresh did not complete. Try again.`)}),observe(e,n){let{archived:s,...c}=e,l=!1,u=i().sessions.observeList({...c,archivedFilter:s===`all`?`all`:s?`archived`:`active`},({result:e,loading:i,error:a})=>{if(!l&&t.isCurrent(r))try{n({loading:i,error:a,result:e?{sessions:structuredClone(e.sessions),hasMore:e.hasMore,nextOffset:e.nextOffset,totalCount:e.totalCount}:null})}catch(e){t.reportError(r.descriptor.pluginId,e)}}),d=a(()=>{l=!0,u.dispose()}),f=()=>o(()=>u.refresh());return f().catch(e=>{!l&&t.isCurrent(r)&&t.reportError(r.descriptor.pluginId,e)}),{refresh:f,dispose:d}},open({sessionKey:e,agentId:t}){g(i(),e,t)},create:e=>o(t=>t.sessions.create(e)),patch:({sessionKey:e,agentId:t},n)=>o(async r=>{if(!await r.sessions.patch(e,n,{agentId:t,ownsModelOverride:()=>!1,deferListRefresh:!0}))throw Error(`The session update did not complete. Try again.`);if(i(),await r.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(i().agents.state.agentsList?.agents??[])},get selectedId(){return i().agentSelection.state.selectedId},get defaultId(){return i().agents.state.agentsList?.defaultId??null},get scopeId(){return i().agentSelection.state.scopeId},select(e){i().agentSelection.set(e)},setScope(e){i().agentSelection.setScope(e)},refresh:()=>o(async e=>{if(await e.agents.refreshList()===null)throw Error(`The agent refresh did not complete. Try again.`)})},dock:c?{openSession(e){i().assistantDock.openSession(e,r.abort),l||(l=!0,a(()=>c.close(r.abort)))},close(){i().assistantDock.close()},get openSessionKey(){return i().assistantDock.openSessionKey}}:void 0,navigation:{openPage(e,t){let n=s(e,t),r=i();t?.replace?r.replace(n.route,n):r.navigate(n.route,n)},pageHref(e,t){let n=s(e,t);return`${n.pathname}${n.search}`}},ui:{invalidate:()=>t.invalidate(r),registerPage:e=>t.register(r,`pages`,e),registerNavigation:e=>t.register(r,`navigation`,e),pinNavigation(e){let t=i();if(!r.contributions.navigation.has(e))return;let n=y({type:`plugin`,key:`${r.descriptor.pluginId}/${e}`}),a=t.navigation.snapshot.sidebarEntries;a.includes(n)||t.navigation.update({sidebarEntries:[...a,n]})},registerPanel:e=>t.register(r,`panels`,e),openPanel(e,t){let n=i();if(!r.contributions.panels.has(e))throw Error(`A plugin can open only its own registered panel.`);let a=t?.sessionKey??n.gateway.snapshot.sessionKey;if(!a)throw Error(`Select a session before opening a plugin panel.`);let o={pluginId:r.descriptor.pluginId,panelId:e,sessionKey:a,agentId:t?.agentId??d(a)?.agentId??n.agentSelection.state.selectedId??void 0,open:!0},s=new CustomEvent(ie,{detail:o});v(`plugin:${o.pluginId}/${e}`,s),g(n,a,t?.agentId),window.dispatchEvent(s)},registerAction:e=>t.register(r,`actions`,e),registerAccessory:e=>t.register(r,`accessories`,e),registerWidget:e=>t.register(r,`widgets`,e),registerReplacement:e=>t.register(r,`replacements`,e),selectReplacement(e,n){if(i(),n!==null&&r.contributions.replacements.get(n)?.value.surface!==e)throw Error(`A plugin can select only its own registered UI replacement.`);r.selections.set(e,n),t.registrations(`replacements`).some(e=>e.host.signal===r.abort.signal)&&t.selectReplacement(e,n===null?null:`${r.descriptor.pluginId}/${n}`)}}}}function J(){return(J=e((()=>{oe(),w(),O(),C(),b(),r(),h(),o(),s(),q()})))()}var Y,X;function Z(){return(Z=e((()=>{H(),ce(),P(),F(),S(),E(),r(),o(),l(),t(),le(),ee(),Y=class extends c{constructor(...e){super(...e),this.kind=`replacements`,this.contributionKey=``,this.surface=`workspace`,this.props={},this.defaultView=A,this.replacementCompanion=A,this.presented=!0,this.error=``,this.mountGeneration=0,this.composerGeneration=0,this.ownerChanged=!1,this.defaultContainers=new Set,this.subscriptions=new p(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:ue(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),j(this.defaultView,e,{host:this.defaultHost??this}),t&&this.requestUpdate(),()=>{this.defaultContainers.delete(e)&&(j(A,e),this.defaultContainers.size===0&&this.requestUpdate())}}},this.handle=e.value.mount(t,this.viewContext)}for(let e of this.defaultContainers)j(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)j(A,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=``}} > ${f(`pluginUi.retryView`)} </button> </div>`:A}${this.defaultView}`:k`${this.defaultContainers.size===0?this.replacementCompanion:A}${N(this.mountGeneration,k`<div data-plugin-view-root style="display: contents"></div>`)}`}},U([V({context:D,subscribe:!0})],Y.prototype,`context`,void 0),U([I({attribute:!1})],Y.prototype,`kind`,void 0),U([I({attribute:!1})],Y.prototype,`contributionKey`,void 0),U([I({attribute:!1})],Y.prototype,`surface`,void 0),U([I({attribute:!1})],Y.prototype,`props`,void 0),U([I({attribute:!1})],Y.prototype,`defaultView`,void 0),U([I({attribute:!1})],Y.prototype,`replacementCompanion`,void 0),U([I({attribute:!1})],Y.prototype,`defaultHost`,void 0),U([I({type:Boolean})],Y.prototype,`presented`,void 0),U([M()],Y.prototype,`error`,void 0),X=class extends c{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 p(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?a(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 A;if(this.kind===`navigation`){let t=new URLSearchParams(window.location.search),n=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)}}),r=({entry:e,href:t,active:n},r=!1,a=`plug`)=>{let o=Object.hasOwn(T,a)?a:`plug`;return e.value.icon&&Object.hasOwn(T,e.value.icon)&&(o=e.value.icon),k`<a class="nav-item ${r?`nav-item--child`:``} ${n?`nav-item--active`:``}" href=${t} aria-current=${n?`page`:A} @click=${t=>{i(t)&&(t.preventDefault(),e.host.navigation.openPage(e.value.page))}} ><span class="nav-item__icon" aria-hidden="true">${T[o]}</span ><span class="nav-item__text">${e.value.label}</span></a >`};return n.filter(({entry:e})=>e.key===this.navigationKey).map(e=>{let t=n.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))?r(e):k`<div class="nav-item-group"> ${r(e)} <ul class="nav-item__children"> ${t.map(t=>k`<li>${r(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=>te(`accessories`,e.key,{sessionKey:this.sessionKey,agentId:this.agentId,session:this.session},A,this.presented)):k`${this.actionError?k`<span role="alert">${this.actionError}</span>`:A}${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),A;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 de({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>`})}`}},U([V({context:D,subscribe:!0})],X.prototype,`context`,void 0),U([I({attribute:!1})],X.prototype,`kind`,void 0),U([I({attribute:!1})],X.prototype,`sessionKey`,void 0),U([I({attribute:!1})],X.prototype,`agentId`,void 0),U([I({attribute:!1})],X.prototype,`session`,void 0),U([I({attribute:!1})],X.prototype,`navigationKey`,void 0),U([I({type:Boolean})],X.prototype,`presented`,void 0),U([M()],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(_(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 W(()=>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((()=>{B(),J(),Z(),G()})))()}$();export{me as initializeControlUiPlugin};