UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

31 lines • 16.6 kB
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./logbook-view-DqlcbM_Q.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-umGE-sEP.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-D3oo_6Fq.js","./control-ui-boot-shared-styles-BaQ2sAfZ.js","./sidebar-update-runtime-DonYLwN5.js","./logbook-controller-Zycfay0b.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","./logbook-view-CcweRaNm.css"])))=>i.map(i=>d[i]); import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Ac as t,Ba as n,Eu as r,Ha as i,Lc as a,Su as o,Tu as s,ju as c,kc as l,n as ee,r as u,zc as d}from"./control-ui-core-BncvAZjR.js";import{$a as f,Hi as p,Ri as m,Ti as h,Ui as g,Vi as _,ir as v,li as y,oi as te,rr as ne,si as re,ui as b,wi as ie,xr as ae,yr as oe}from"./control-ui-core-9qYjK5B2.js";import{$ as x,X as S,Y as C,ct as w,d as T,nt as E,u as D,ut as O}from"./lit-runtime-B8uOr6OX.js";import{La as k,Ra as A,Xr as j,Zr as M,at as N,eo as P,ii as F,it as I,no as L,nt as R,oa as z,ot as B,sa as se,st as V,to as H}from"./ui-DuRgK6kL.js";import{F as U,L as W,R as G}from"./control-ui-boot-chat-Ck7W_FPO.js";import{ar as K,nr as ce}from"./control-ui-boot-chat-C8hdsB2M.js";import{n as le,t as ue}from"./control-ui-disabled-DfZ2EcL3.js";import{a as de,o as fe}from"./login-runtime-ULR4eeNT.js";function q(e){return!e||typeof e!=`object`||Array.isArray(e)?!1:`type`in e&&e.type===`openclaw-plugin-session-open`&&`sessionKey`in e&&typeof e.sessionKey==`string`&&e.sessionKey.length>0&&e.sessionKey.length<=512&&e.sessionKey.trim()===e.sessionKey&&!/[\p{Cc}\p{Cs}]/u.test(e.sessionKey)&&!/^(?:[a-z][a-z\d+.-]*:)?\/\//iu.test(e.sessionKey)&&(!(`agentId`in e)||typeof e.agentId==`string`&&e.agentId.trim()===e.agentId&&L(e.agentId))&&Object.keys(e).every(e=>e===`type`||e===`sessionKey`||e===`agentId`)}function pe(e,t){let{context:n,element:r,frame:i,descriptor:a}=t;if(!i?.isConnected||!r.contains(i)||e.source!==i.contentWindow||e.origin!==`null`&&e.origin!==window.location.origin||e.ports.length!==0||!q(e.data)||!a?.path||a.requiresGatewayAuth!==!0||!V(a.path)||i.getAttribute(`src`)!==a.path||n.gateway.snapshot.phase!==`connected`||!n.gateway.snapshot.client||!n.gateway.snapshot.hello?.auth||!oe(n.gateway.snapshot.hello.auth)||!t.authenticated||Date.now()-t.authenticatedAt>=3e5)return;let{sessionKey:o,agentId:s}=e.data,c=P(o)?.agentId;c&&(!L(c)||s&&c.toLowerCase()!==s.toLowerCase())||!k({namespace:`chat`,sessionKey:o,fallbackAgentId:s??`main`,exactKey:!0})||d(n,o,s)}function J(){return(J=e((()=>{H(),A(),B(),ae(),a()})))()}function me(e,t){if(!t.path||e.pluginId!==t.pluginId)return!1;let n=V(t.path);return n?e.match===`exact`?n===e.path:n===e.path||n.startsWith(e.path)&&(e.path.endsWith(`/`)||n.at(e.path.length)===`/`):!1}var Y,X,Z,Q;function $(){return($=e((()=>{M(),C(),E(),D(),B(),h(),ne(),m(),te(),y(),r(),de(),ce(),U(),s(),t(),ue(),ee(),J(),n(),se(),fe(),Y=1e4,X=5e3,Z={"logbook/logbook":async()=>{let[{renderLogbook:e},{stopLogbookPolling:t}]=await Promise.all([z(()=>import(`./logbook-view-DqlcbM_Q.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21]),import.meta.url),z(()=>import(`./logbook-controller-Zycfay0b.js`).then(e=>(e.i(),e.l)),__vite__mapDeps([16,1,2,17]),import.meta.url)]);return{render:e,stop:t}}},Q=class extends o{constructor(...e){super(...e),this.pluginId=``,this.tabId=``,this.params={},this.bundledViewState={status:`idle`},this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=null,this.bundledViewHost={},this.gatewayClient=null,this.gatewayConnected=!1,this.gatewayHello=null,this.gatewayConnectionRevision=0,this.pluginFrameGeneration={},this.externalAuthTargetKey=null,this.externalAuthRefreshAbortController=null,this.externalAuthRefreshWatchdog=null,this.externalAuthProbeAbortController=null,this.externalAuthRestartKey=null,this.externalAuthRefreshTimer=null,this.externalAuthExpiryTimer=null,this.externalAuthRefreshedAt=0,this.pluginThemeFrame=null,this.releasePluginTheme=null,this.subscriptions=new l(this).watchStore(()=>this.context?.gateway,e=>this.updateGatewaySource(e)).watchStore(()=>this.context?.plugins),this.handleVisibilityChange=()=>{if(document.visibilityState===`visible`&&this.externalAuthTargetKey){if(Date.now()-this.externalAuthRefreshedAt>=3e5){this.externalAuthReadyKey=null,this.externalAuthRefreshedAt=0,this.pluginFrameGeneration={},this.requestExternalTabAuthRestart(this.externalAuthTargetKey);return}this.refreshExternalTabAuth(this.externalAuthTargetKey)}},this.retryBundledView=()=>{let e=this.bundledViewState;e.status===`error`&&this.hasCurrentBundledDescriptor(e.id)&&(_(e.error)?p():this.bundledViewState={status:`idle`})},this.handlePluginThemeLoad=e=>{let t=e.currentTarget;t instanceof HTMLIFrameElement&&t===this.pluginThemeFrame&&W(t)},this.handlePluginSessionOpen=e=>{let t=this.context,n=this.tabInfo();this.isConnected&&t&&this.gatewaySource===t.gateway&&this.gatewayClient===t.gateway.snapshot.client&&this.gatewayHello===t.gateway.snapshot.hello&&this.gatewayConnectionRevision===t.gateway.connectionRevision&&this.externalAuthTargetKey===this.externalTabAuthKey(n,!1)&&pe(e,{context:t,element:this,frame:this.pluginThemeFrame,descriptor:n,authenticated:this.externalAuthReadyKey!==null&&this.externalAuthReadyKey===this.externalAuthTargetKey,authenticatedAt:this.externalAuthRefreshedAt})}}connectedCallback(){super.connectedCallback(),document.addEventListener(`visibilitychange`,this.handleVisibilityChange),window.addEventListener(`message`,this.handlePluginSessionOpen)}disconnectedCallback(){document.removeEventListener(`visibilitychange`,this.handleVisibilityChange),window.removeEventListener(`message`,this.handlePluginSessionOpen),this.syncPluginThemeFrame(null),this.clearExternalTabAuth(),this.subscriptions.clear(),this.stopBundledView(),super.disconnectedCallback()}tabKey(){return i({pluginId:this.pluginId,id:this.tabId})}loadBundledView(e){let t=Z[e];return t?t():Promise.reject(Error(`Unknown bundled plugin tab: ${e}`))}hasCurrentBundledDescriptor(e){return this.tabKey()===e&&this.tabInfo()!==void 0&&e in Z}startBundledViewLoad(e){let t={status:`loading`,id:e};this.bundledViewState=t;let n=n=>{this.bundledViewState===t&&this.hasCurrentBundledDescriptor(e)&&(this.bundledViewState=n,n.status===`error`&&_(n.error)&&g())};this.loadBundledView(e).then(t=>n({status:`ready`,id:e,view:t}),t=>n({status:`error`,id:e,error:t}))}willUpdate(){if(!this.isConnected)return;let e=this.tabKey(),t=this.tabInfo(),n=t!==void 0&&e in Z,r=this.bundledViewState;r.status!==`idle`&&(r.id!==e||!n)&&this.stopBundledView(),this.bundledViewState.status===`idle`&&n&&this.startBundledViewLoad(e),this.syncExternalTabAuth(t,n)}updated(){this.isConnected&&this.syncPluginThemeFrame(this.querySelector(`.plugin-tab-embed__frame`))}syncPluginThemeFrame(e){e!==this.pluginThemeFrame&&(this.releasePluginTheme?.(),this.pluginThemeFrame=e,this.releasePluginTheme=e?G(e,`*`):null)}externalTabAuthKey(e,t){return e?.path&&e.requiresGatewayAuth===!0&&!t&&this.isExternalTabAuthSupported()?`${this.tabKey()}\n${e.path}`:null}isExternalTabAuthSupported(){return window.isSecureContext}probeExternalTabAuth(e,t){let n=new URL(e,window.location.href);if(n.origin!==window.location.origin)return Promise.resolve(!1);let r=new Uint8Array(16);crypto.getRandomValues(r);let i=Array.from(r,e=>e.toString(16).padStart(2,`0`)).join(``);return n.searchParams.set(N,i),n.searchParams.set(I,window.location.origin),new Promise(e=>{let r=document.createElement(`iframe`);r.hidden=!0,r.setAttribute(`aria-hidden`,`true`),r.setAttribute(`sandbox`,`allow-scripts`);let a=null,o=n=>{a&&clearTimeout(a),window.removeEventListener(`message`,s),t.removeEventListener(`abort`,c),r.remove(),e(n)},s=e=>{e.source===r.contentWindow&&e.data?.type===`openclaw-plugin-frame-auth-probe`&&e.data?.nonce===i&&o(!0)},c=()=>o(!1);window.addEventListener(`message`,s),t.addEventListener(`abort`,c,{once:!0}),a=setTimeout(()=>o(!1),X),r.src=n.toString(),document.body.append(r)})}syncExternalTabAuth(e,t){let n=this.externalTabAuthKey(e,t);this.externalAuthTargetKey!==n&&(this.clearExternalTabAuth(),this.externalAuthTargetKey=n),n&&this.externalAuthReadyKey!==n&&this.externalAuthUnavailableKey!==n&&this.refreshExternalTabAuth(n)}refreshExternalTabAuth(e){let t=this.context;if(!t||t.gateway.snapshot.phase!==`connected`||this.externalAuthTargetKey!==e||this.externalAuthRefreshAbortController||this.externalAuthProbeAbortController)return;let n=Date.now(),r=new AbortController;this.externalAuthUnavailableKey=null,this.externalAuthRefreshAbortController=r,this.externalAuthRefreshWatchdog=setTimeout(()=>{this.externalAuthRefreshAbortController===r&&this.requestExternalTabAuthRestart(e)},Y),t.config.refresh({signal:r.signal}).then(t=>{if(this.externalAuthRefreshAbortController!==r||this.externalAuthTargetKey!==e)return;if(this.finishExternalTabAuthRefreshAttempt(e)){this.refreshExternalTabAuth(e);return}let i=this.tabInfo(),a=i?.path;t!==null&&i!==void 0&&a!==void 0&&t.pluginFrameGrants.some(e=>me(e,i))?this.startExternalTabAuthProbe(e,a,n):t?(this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=e,this.externalAuthRefreshedAt=0):this.scheduleExternalTabAuthRefresh(e,!1)}).catch(()=>{this.externalAuthRefreshAbortController===r&&this.externalAuthTargetKey===e&&(this.finishExternalTabAuthRefreshAttempt(e)?this.refreshExternalTabAuth(e):this.scheduleExternalTabAuthRefresh(e,!1))})}startExternalTabAuthProbe(e,t,n){this.cancelExternalTabAuthProbe();let r=new AbortController;this.externalAuthProbeAbortController=r;let i;try{i=this.probeExternalTabAuth(t,r.signal)}catch{i=Promise.resolve(!1)}i.catch(()=>!1).then(t=>{if(this.externalAuthProbeAbortController===r&&this.externalAuthTargetKey===e){if(this.externalAuthProbeAbortController=null,t){this.externalAuthReadyKey=e,this.externalAuthRefreshedAt=n,this.scheduleExternalTabAuthExpiry(e,n),this.scheduleExternalTabAuthRefresh(e,!0);return}this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=e,this.externalAuthRefreshedAt=0,this.clearExternalTabAuthTimers()}})}cancelExternalTabAuthProbe(){let e=this.externalAuthProbeAbortController;this.externalAuthProbeAbortController=null,e?.abort()}finishExternalTabAuthRefreshAttempt(e){let t=this.externalAuthRestartKey===e;return this.externalAuthRefreshWatchdog&&clearTimeout(this.externalAuthRefreshWatchdog),this.externalAuthRefreshWatchdog=null,this.externalAuthRefreshAbortController=null,this.externalAuthRestartKey=null,t}requestExternalTabAuthRestart(e){if(this.externalAuthTargetKey===e){if(this.externalAuthRefreshAbortController){this.externalAuthRestartKey=e,this.externalAuthRefreshAbortController?.abort();return}this.externalAuthProbeAbortController&&this.cancelExternalTabAuthProbe(),this.refreshExternalTabAuth(e)}}scheduleExternalTabAuthExpiry(e,t){this.externalAuthExpiryTimer&&clearTimeout(this.externalAuthExpiryTimer);let n=Math.max(0,t+R-Date.now());this.externalAuthExpiryTimer=setTimeout(()=>{this.externalAuthExpiryTimer=null,this.externalAuthTargetKey===e&&this.externalAuthReadyKey===e&&(this.externalAuthReadyKey=null,this.externalAuthRefreshedAt=0,this.pluginFrameGeneration={},this.clearExternalTabAuthTimers(),this.requestExternalTabAuthRestart(e))},n)}scheduleExternalTabAuthRefresh(e,t){this.externalAuthRefreshTimer&&clearTimeout(this.externalAuthRefreshTimer);let n=t?R/2:5e3;this.externalAuthRefreshTimer=setTimeout(()=>{this.externalAuthRefreshTimer=null,this.refreshExternalTabAuth(e)},n)}clearExternalTabAuthTimers(){clearTimeout(this.externalAuthRefreshTimer??void 0),clearTimeout(this.externalAuthExpiryTimer??void 0),this.externalAuthRefreshTimer=null,this.externalAuthExpiryTimer=null}clearExternalTabAuth(){this.pluginFrameGeneration={},this.clearExternalTabAuthTimers(),this.externalAuthRefreshWatchdog&&clearTimeout(this.externalAuthRefreshWatchdog),this.externalAuthRefreshAbortController?.abort(),this.cancelExternalTabAuthProbe(),this.externalAuthRefreshWatchdog=null,this.externalAuthRefreshAbortController=null,this.externalAuthRestartKey=null,this.externalAuthTargetKey=null,this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=null,this.externalAuthRefreshedAt=0}resetExternalTabAuthForGatewayChange(e,t){this.pluginFrameGeneration={},this.clearExternalTabAuthTimers(),this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=null,this.externalAuthRefreshedAt=0,this.externalAuthTargetKey=e,this.cancelExternalTabAuthProbe(),this.externalAuthRefreshAbortController?(this.externalAuthRestartKey=t?e:null,this.externalAuthRefreshAbortController?.abort()):t&&this.refreshExternalTabAuth(e)}stopBundledView(){this.replaceBundledViewHost(),this.bundledViewState={status:`idle`}}replaceBundledViewHost(){this.bundledViewState.status===`ready`&&this.bundledViewState.view.stop(this.bundledViewHost),this.bundledViewHost={}}updateGatewaySource(e){let{client:t,hello:n}=e.snapshot,r=e.snapshot.phase===`connected`;if(this.gatewaySource===e&&this.gatewayClient===t&&this.gatewayHello===n&&this.gatewayConnectionRevision===e.connectionRevision&&this.gatewayConnected===r)return;let i=this.externalAuthTargetKey;this.replaceBundledViewHost(),this.gatewaySource=e,this.gatewayClient=t,this.gatewayHello=n,this.gatewayConnectionRevision=e.connectionRevision,this.gatewayConnected=r,i&&this.resetExternalTabAuthForGatewayChange(i,r)}tabInfo(){let e=(this.context?.gateway.snapshot.hello?.controlUiTabs??[]).find(e=>e.pluginId===this.pluginId&&e.id===this.tabId),t=e?.path&&f(e.path);return e&&t&&t!==e.path?{...e,path:t}:e}render(){let e=this.context;if(!e)return S;let t=this.tabInfo();if(e.plugins?.registrations(`pages`).some(e=>e.key===this.tabKey()))return u(`pages`,this.tabKey(),this.params);if(t&&this.tabKey()in Z){let t=this.bundledViewState;if(t.status===`loading`)return b();if(t.status===`error`)return re({error:t.error,onRetry:this.retryBundledView,stale:_(t.error)});if(t.status!==`ready`)return S;let n=e.gateway.snapshot;return t.view.render({host:this.bundledViewHost,client:n.client,connected:n.phase===`connected`,onRequestUpdate:()=>this.requestUpdate()})}if(t?.path){if(t.requiresGatewayAuth===!0&&!this.isExternalTabAuthSupported())return x` <section class="card lazy-view-state" role="status"> <div class="card-title">${c(`login.failure.insecure.title`)}</div> <div class="card-sub">${c(`login.failure.insecure.stepHttps`)}</div> </section> `;let n=this.externalTabAuthKey(t,!1);return t.requiresGatewayAuth===!0&&this.externalAuthUnavailableKey===n?x` <section class="card lazy-view-state" role="status"> <div class="card-title">${c(`pluginTabs.unavailableTitle`)}</div> <div class="card-sub">${c(`pluginTabs.unavailableSubtitle`)}</div> </section> `:t.requiresGatewayAuth===!0&&this.externalAuthReadyKey!==n?S:x` <section class="plugin-tab-embed" ${v({pluginEmbed:!0})}> ${T(this.pluginFrameGeneration,x`<iframe class="plugin-tab-embed__frame" src=${t.path} title=${t.label} sandbox=${K(e.config.current.embedSandboxMode)} @load=${this.handlePluginThemeLoad} ></iframe>`)} </section> `}if(e.gateway.snapshot.phase!==`connected`||e.plugins?.isLoading(this.pluginId))return b();let n=le(e,this.pluginId);return x` <section class="card lazy-view-state" role="status"> ${n??x` <div class="card-title">${c(`pluginTabs.unavailableTitle`)}</div> <div class="card-sub"> ${e.plugins?.errors.find(e=>e.pluginId===this.pluginId)?.message??c(`pluginTabs.unavailableSubtitle`)} </div> `} </section> `}},F([O({attribute:!1})],Q.prototype,`pluginId`,void 0),F([O({attribute:!1})],Q.prototype,`tabId`,void 0),F([O({attribute:!1})],Q.prototype,`params`,void 0),F([j({context:ie,subscribe:!0})],Q.prototype,`context`,void 0),F([w()],Q.prototype,`bundledViewState`,void 0),F([w()],Q.prototype,`externalAuthReadyKey`,void 0),F([w()],Q.prototype,`externalAuthUnavailableKey`,void 0),customElements.get(`openclaw-plugin-page`)||customElements.define(`openclaw-plugin-page`,Q)})))()}$();