UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

24 lines 18.7 kB
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./modal-dialog-DIUpFxKy.js","./control-ui-foundation-Cydpkyqa.js","./rolldown-runtime-DkW27tQK.js","./control-ui-core-Rwzhj6nO.js","./lit-runtime-CV_MH99K.js","./control-ui-core-YphAl4aM.js","./control-ui-core-vvcQQV2m.js","./gateway-runtime-Bqqcp9-I.js","./control-ui-core-ClxHIvNM.css","./agent-select-registration-WzfrKN4f.js","./control-ui-boot-new-Bj2SAUyl.js","./control-ui-boot-shared-BYq7Cchl.js","./control-ui-boot-shared-Deak_Sjt.js","./control-ui-boot-shared-gfE6fZcA.js","./markdown-runtime-Bn6OdBVq.js","./control-ui-boot-shared-DfZ39Yj9.js","./control-ui-boot-shared-CXVvK2AW.js","./control-ui-boot-shared-3juXI2I2.js","./control-ui-boot-shared-BVNXvWX-.js","./control-ui-boot-shared-KspYIvAF.css","./control-ui-boot-new-DTUE5TUM.css","./control-ui-dashboard-G7sXFRgq.js","./control-ui-boot-chat-_QSl8fbH.js","./control-ui-boot-chat-Cgwe4GEM.js","./config-runtime-D-5ybyEi.js","./control-ui-dashboard-BZzcciLT.css"])))=>i.map(i=>d[i]); import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{F as t,P as n,R as r,ii as i,ri as a,wr as o,z as s}from"./control-ui-foundation-Cydpkyqa.js";import{Ao as c,As as l,Bi as u,Bn as d,Is as f,J as p,Sc as m,Ui as h,Wi as g,ko as _,n as v,r as y,yc as b,zi as ee,zn as x}from"./control-ui-core-Rwzhj6nO.js";import{$ as S,J as C,K as w,X as T,_ as E,at as D,q as O,st as k,v as A}from"./lit-runtime-CV_MH99K.js";import{Mt as j,Xn as te,Yn as ne,_ as re,en as ie,g as M,jt as N,nn as P,nr as F,rn as I}from"./control-ui-core-YphAl4aM.js";import{Gt as L,Qt as R,Wt as z,Yt as B,en as V}from"./control-ui-core-vvcQQV2m.js";import{a as H,l as U,s as W}from"./control-ui-boot-shared-CXVvK2AW.js";function G(e){function t(t,n,r,i,a){e.current(),e.signal.throwIfAborted();let o=n,s,c=!0,l,u,d=()=>{if(!c)throw Error(`This plugin component has been disposed.`);return e.signal.throwIfAborted(),e.current()},f=()=>{s&&c&&i(s,o,d)},p=()=>{c&&(c=!1,e.signal.removeEventListener(`abort`,p),l?.(),u?.(),s?.remove())};return e.signal.addEventListener(`abort`,p,{once:!0}),r().then(n=>{if(!c||e.signal.aborted)return;d(),s=n,u=a?.(s,()=>(d(),o)),f(),t.append(s);let r=d(),i=[r.gateway.subscribe(f),r.agents.subscribe(f)];l=()=>i.forEach(e=>e())}).catch(t=>{c&&(p(),e.onError(t))}),{update(e){d(),o=e,f()},dispose:p}}return{mountDialog:(e,n)=>t(e,n,async()=>(await a(()=>import(`./modal-dialog-DIUpFxKy.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8]),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 a(()=>import(`./agent-select-registration-WzfrKN4f.js`),__vite__mapDeps([9,10,2,1,3,4,5,6,7,8,11,12,13,14,15,16,17,18,19,20]),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?z[e.icon]:void 0})),e.value=t.value,e.placeholder=t.placeholder??``,e.accessibleLabel=t.accessibleLabel,e.menuLabel=t.menuLabel??``,e.disabled=t.disabled??!1,e.onSelect=e=>{n(),t.onSelect(e)}}),mountDashboard:(e,n)=>t(e,n,async()=>(await a(()=>import(`./control-ui-dashboard-G7sXFRgq.js`),__vite__mapDeps([21,2,1,3,4,5,6,7,8,22,11,12,13,14,15,16,17,18,19,23,24,25]),import.meta.url),document.createElement(`openclaw-plugin-session-dashboard`)),(e,t,n)=>{let r=n().gateway.snapshot,i=I(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 K(){return(K=e((()=>{P(),L(),i()})))()}function q(e,t,n){let r=()=>{if(!t.isCurrent(n))throw Error(`This plugin UI activation has ended. Use the current activation.`);return e()},i=e=>(t.isCurrent(n)||(e(),r()),n.disposers.add(e),()=>{n.disposers.delete(e),e()}),a=async e=>{let t=await e(r());return r(),t},o=(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&&te(o)?o:null,c=F(s??`plugin`,i.basePath),l=s?e.path?.map(encodeURIComponent).join(`/`):void 0,u=new URLSearchParams(t?.preserveSearch?window.location.search:``);s||(u.set(`plugin`,n.descriptor.pluginId),u.set(`id`,e.id));for(let[t,n]of Object.entries(e.params??{}))u.set(`p.${t}`,n);return{route:s??`plugin`,pathname:l?`${c}/${l}`:c,search:u.size?`?${u}`:``}};return{apiVersion:1,pluginId:n.descriptor.pluginId,signal:n.abort.signal,get basePath(){return r().basePath},get locale(){return R.getLocale()},redact:c,components:G({current:r,signal:n.abort.signal,onError:e=>t.reportError(n.descriptor.pluginId,e)}),get connection(){let e=r().gateway.snapshot,t=I(e);return{connected:e.phase===`connected`,canRead:ie(e.hello?.auth??null),canWrite:t.canWrite,canGrant:t.canGrantApprovals,canAdmin:t.canAdmin,assistantAgentId:e.assistantAgentId}},request:(e,t={})=>a(()=>n.client.request(e,t)),onEvent(e,a){return i(r().gateway.subscribeEvents(r=>{t.isCurrent(n)&&r.event===e&&a(r.payload)}))},subscribe(e){let a=r(),o=()=>{t.isCurrent(n)&&e()},s=[a.gateway.subscribe(o),a.sessions.subscribe(o),a.agents.subscribe(o),a.agentSelection.subscribe(o),a.theme.subscribe(o),R.subscribe(o)];return i(()=>s.forEach(e=>e()))},sessions:{get rows(){return structuredClone(r().sessions.state.result?.sessions??[])},get selectedKey(){return r().gateway.snapshot.sessionKey},normalizeKey:f,refresh:()=>a(async e=>{if(await e.sessions.refreshReplacement()===null)throw Error(`The session refresh did not complete. Try again.`)}),observe(e,o){let{archived:s,...c}=e,l=!1,u=r().sessions.observeList({...c,archivedFilter:s===`all`?`all`:s?`archived`:`active`},({result:e,loading:r,error:i})=>{if(!(l||!t.isCurrent(n)))try{o({loading:r,error:i,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=i(()=>{l=!0,u.dispose()}),f=()=>a(()=>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}){let n=r(),i=h(n,e,t),a=g({context:n,face:i,sessionKey:e,agentId:t,preferenceDerivedFace:!0,exactKey:!0});j({selection:n.agentSelection,gateway:n.gateway,sessionKey:e,agentId:t}),n.navigate(i,a.options)},create:e=>a(t=>t.sessions.create(e)),patch:({sessionKey:e,agentId:t},n)=>a(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:()=>a(async e=>{if(await e.agents.refreshList()===null)throw Error(`The agent refresh did not complete. Try again.`)})},navigation:{openPage(e,t){let n=o(e,t),i=r();t?.replace?i.replace(n.route,n):i.navigate(n.route,n)},pageHref(e,t){let n=o(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),registerPanel:e=>t.register(n,`panels`,e),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((()=>{ne(),N(),P(),B(),_(),u(),l(),K()})))()}var Y,X;function Z(){return(Z=e((()=>{s(),w(),S(),E(),re(),L(),B(),u(),m(),d(),H(),v(),Y=class extends b{constructor(...e){super(...e),this.kind=`replacements`,this.contributionKey=``,this.surface=`workspace`,this.props={},this.defaultView=O,this.presented=!0,this.error=``,this.mountGeneration=0,this.ownerChanged=!1,this.defaultContainers=new Set,this.subscriptions=new x(this).watch(()=>this.context?.plugins,(e,t)=>e.subscribe(t),()=>{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===`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:U(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.`);return this.defaultContainers.add(e),this.toggleAttribute(`data-plugin-default-mounted`,!0),C(this.defaultView,e,{host:this.defaultHost??this}),()=>{this.defaultContainers.delete(e),this.toggleAttribute(`data-plugin-default-mounted`,this.defaultContainers.size>0),C(O,e)}}},this.handle=e.value.mount(t,this.viewContext)}for(let e of this.defaultContainers)C(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=()=>{if(e.aborted||this.registration?.signal.aborted)throw Error(`This plugin UI view has ended.`)};return{...t,setDraft:e=>{n(),t.setDraft(e)},send:async()=>{n();let e=await t.send();return n(),e},abort:t.abort?()=>{n(),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)C(O,e);this.defaultContainers.clear(),this.removeAttribute(`data-plugin-default-mounted`),this.viewContext=void 0}connectedCallback(){super.connectedCallback(),this.requestUpdate()}disconnectedCallback(){this.unmount(),this.subscriptions.clear(),super.disconnectedCallback()}render(){return!this.registration||this.error?T`${this.error?T`<div class="card" role="alert"> ${this.error}<button class="btn btn--sm" @click=${()=>{this.error=``}} > ${V(`pluginUi.retryView`)} </button> </div>`:O}${this.defaultView}`:A(this.mountGeneration,T`<div data-plugin-view-root style="display: contents"></div>`)}},o([r({context:M,subscribe:!0})],Y.prototype,`context`,void 0),o([k({attribute:!1})],Y.prototype,`kind`,void 0),o([k({attribute:!1})],Y.prototype,`contributionKey`,void 0),o([k({attribute:!1})],Y.prototype,`surface`,void 0),o([k({attribute:!1})],Y.prototype,`props`,void 0),o([k({attribute:!1})],Y.prototype,`defaultView`,void 0),o([k({attribute:!1})],Y.prototype,`defaultHost`,void 0),o([k({type:Boolean})],Y.prototype,`presented`,void 0),o([D()],Y.prototype,`error`,void 0),X=class extends b{constructor(...e){super(...e),this.lifetime=new AbortController,this.actionLifetimes=new Map,this.kind=`navigation`,this.sessionKey=``,this.navigationKey=``,this.excludedNavigationKeys=[],this.presented=!0,this.actionError=``,this.subscriptions=new x(this).watch(()=>this.context?.plugins,(e,t)=>e.subscribe(t),()=>this.retireHiddenActions()).watch(()=>this.kind===`header`||this.kind===`composer`?this.context?.sessions:void 0,(e,t)=>e.subscribe(t),()=>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?ee(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;return e?this.kind===`navigation`?e.registrations(`navigation`).filter(e=>this.navigationKey?e.key===this.navigationKey:e.value.defaultVisible!==!1&&!this.excludedNavigationKeys.includes(e.key)).toSorted((e,t)=>(e.value.order??0)-(t.value.order??0)||e.key.localeCompare(t.key)).map(e=>{let t=e.host.navigation.pageHref(e.value.page),n=t===`${window.location.pathname}${window.location.search}`,r=`puzzle`;return e.value.icon&&Object.hasOwn(z,e.value.icon)&&(r=e.value.icon),T`<a class="nav-item ${n?`nav-item--active`:``}" href=${t} aria-current=${n?`page`:O} @click=${t=>{p(t)&&(t.preventDefault(),e.host.navigation.openPage(e.value.page))}} ><span class="nav-item__icon" aria-hidden="true">${z[r]}</span ><span class="nav-item__text">${e.value.label}</span></a >`}):this.kind===`session-header`?e.registrations(`accessories`).filter(e=>e.value.placement===`session-header`).map(e=>y(`accessories`,e.key,{sessionKey:this.sessionKey,agentId:this.agentId},O,this.presented)):T`${this.actionError?T`<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 T`<button class="btn btn--sm" type="button" ?disabled=${n?.disabled??!1} @click=${async()=>{if(!(i.aborted||!this.presented||!this.isConnected)){this.actionError=``;try{await W({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>`})}`:O}},o([r({context:M,subscribe:!0})],X.prototype,`context`,void 0),o([k({attribute:!1})],X.prototype,`kind`,void 0),o([k({attribute:!1})],X.prototype,`sessionKey`,void 0),o([k({attribute:!1})],X.prototype,`agentId`,void 0),o([k({attribute:!1})],X.prototype,`navigationKey`,void 0),o([k({attribute:!1})],X.prototype,`excludedNavigationKeys`,void 0),o([k({type:Boolean})],X.prototype,`presented`,void 0),o([D()],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 ae(e,t,r,i,o){if(!t.isCurrent(r))return;let{descriptor:s,abort:c}=r,l=`${n(s.pluginId,e().resourceBasePath)}${encodeURIComponent(s.revision)}/`,u=Object.assign(r,{host:q(e,t,r)}),d=Q(s.entryUrl,l);for(let e of s.styles){let t=document.createElement(`link`);t.rel=`stylesheet`,t.media=`not all`,t.href=Q(e,l);let n=new Promise((e,n)=>{t.addEventListener(`load`,()=>e(),{once:!0,signal:c.signal}),t.addEventListener(`error`,()=>n(Error(`Could not load plugin stylesheet: ${s.pluginId}`)),{once:!0,signal:c.signal}),c.signal.addEventListener(`abort`,()=>n(Error(`Plugin UI activation ended.`)),{once:!0})});document.head.append(t),u.disposers.add(()=>t.remove()),i.push(t),await n}let f=await a(()=>import(d),[],import.meta.url);if(!t.isCurrent(r)){o();return}if(f.default?.id!==s.pluginId||typeof f.default.activate!=`function`)throw Error(`Native UI entry must export its matching defineControlUiPlugin definition.`);let p=await f.default.activate(u.host);if(p&&u.disposers.add(p),!t.isCurrent(r)){o();return}return u}function $(){return($=e((()=>{t(),J(),Z(),i()})))()}$();export{ae as initializeControlUiPlugin}; //# sourceMappingURL=control-ui-loader-B-xQzYuq.js.map