openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
31 lines • 16.4 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./logbook-view-Bn7tXbEZ.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-CkXlyZBY.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-dOnP4mAA.js","./control-ui-boot-shared-styles-BXPMRytW.js","./sidebar-update-runtime-DQZboSgD.js","./logbook-controller-BJXMKXDl.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","./logbook-view-CcweRaNm.css"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Au as t,Ga as n,Ic as r,Kc as i,Lc as a,Nu as o,Pu as s,Ua as c,Wc as l,n as ee,r as u,zu as d}from"./control-ui-core-CBJ5efDh.js";import{Ai as te,Ji as f,Ki as p,Sr as m,Ui as h,di as ne,fi as re,hi as g,ki as _,mi as v,or as ie,qi as y,sr as b,to as ae,wr as oe}from"./control-ui-core-DtLivg_r.js";import{G as x,J as S,W as C,Z as w,at as T,c as E,l as D,rt as O}from"./lit-runtime-IOnANfcZ.js";import{$ as k,Ga as A,Q as j,Ur as M,Wa as N,Wr as P,Y as F,Z as I,Zr as L,co as R,et as z,lo as B,ma as V,pa as H,so as U}from"./ui-CmSP4d14.js";import{B as W,R as G,V as K}from"./control-ui-boot-chat-XPUNenUd.js";import{at as q,nt as se}from"./control-ui-boot-chat-CGYcTLro.js";import{n as ce,t as le}from"./control-ui-disabled-B8wp3jVt.js";import{a as ue,o as de}from"./login-runtime-WXCKwuhW.js";function fe(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&&B(e.agentId))&&Object.keys(e).every(e=>e===`type`||e===`sessionKey`||e===`agentId`)}function pe(e,t){let{context:n,element:r,frame:a,descriptor:o}=t;if(!a?.isConnected||!r.contains(a)||e.source!==a.contentWindow||e.origin!==`null`&&e.origin!==window.location.origin||e.ports.length!==0||!fe(e.data)||!o?.path||o.requiresGatewayAuth!==!0||!z(o.path)||a.getAttribute(`src`)!==o.path||n.gateway.snapshot.phase!==`connected`||!n.gateway.snapshot.client||!n.gateway.snapshot.hello?.auth||!m(n.gateway.snapshot.hello.auth)||!t.authenticated||Date.now()-t.authenticatedAt>=3e5)return;let{sessionKey:s,agentId:c}=e.data,l=U(s)?.agentId;l&&(!B(l)||c&&l.toLowerCase()!==c.toLowerCase())||!N({namespace:`chat`,sessionKey:s,fallbackAgentId:c??`main`,exactKey:!0})||i(n,s,c)}function J(){return(J=e((()=>{R(),A(),k(),oe(),l()})))()}function me(e,t){if(!t.path||e.pluginId!==t.pluginId)return!1;let n=z(t.path);return n?n===e.path||e.match!==`exact`&&n.startsWith(e.path)&&(e.path.endsWith(`/`)||n.at(e.path.length)===`/`):!1}var Y,X,Z,Q;function $(){return($=e((()=>{P(),C(),w(),E(),k(),te(),ie(),h(),ne(),v(),s(),ue(),se(),G(),o(),a(),le(),ee(),J(),c(),V(),de(),Y=1e4,X=5e3,Z={"logbook/logbook":async()=>{let[{renderLogbook:e},{stopLogbookPolling:t}]=await Promise.all([H(()=>import(`./logbook-view-Bn7tXbEZ.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),H(()=>import(`./logbook-controller-BJXMKXDl.js`).then(e=>(e.i(),e.l)),__vite__mapDeps([16,1,2,17]),import.meta.url)]);return{render:e,stop:t}}},Q=class extends t{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 r(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)&&(p(e.error)?y():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 n({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`&&p(n.error)&&f())};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?K(e,`*`):null)}externalTabAuthKey(e,t){return e?.path&&e.requiresGatewayAuth===!0&&!t&&window.isSecureContext?`${this.tabKey()}\n${e.path}`:null}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(j,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);let i=()=>this.externalAuthRefreshAbortController!==r||this.externalAuthTargetKey!==e?!1:!this.finishExternalTabAuthRefreshAttempt(e)||(this.refreshExternalTabAuth(e),!1);t.config.refresh({signal:r.signal}).then(t=>{if(!i())return;let r=this.tabInfo(),a=r?.path;t!==null&&r!==void 0&&a!==void 0&&t.pluginFrameGrants.some(e=>me(e,r))?this.startExternalTabAuthProbe(e,a,n):t?(this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=e,this.externalAuthRefreshedAt=0):this.scheduleExternalTabAuthRefresh(e,!1)}).catch(()=>{i()&&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.cancelExternalTabAuthProbe(),this.refreshExternalTabAuth(e)}}scheduleExternalTabAuthExpiry(e,t){this.externalAuthExpiryTimer&&clearTimeout(this.externalAuthExpiryTimer);let n=Math.max(0,t+F-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?F/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&&ae(e.path);return e&&t&&t!==e.path?{...e,path:t}:e}render(){let e=this.context;if(!e)return x;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 g();if(t.status===`error`)return re({error:t.error,onRetry:this.retryBundledView,stale:p(t.error)});if(t.status!==`ready`)return x;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&&!window.isSecureContext)return S`
<section class="card lazy-view-state" role="status">
<div class="card-title">${d(`login.failure.insecure.title`)}</div>
<div class="card-sub">${d(`login.failure.insecure.stepHttps`)}</div>
</section>
`;let n=this.externalTabAuthKey(t,!1);return t.requiresGatewayAuth===!0&&this.externalAuthUnavailableKey===n?S`
<section class="card lazy-view-state" role="status">
<div class="card-title">${d(`pluginTabs.unavailableTitle`)}</div>
<div class="card-sub">${d(`pluginTabs.unavailableSubtitle`)}</div>
</section>
`:t.requiresGatewayAuth===!0&&this.externalAuthReadyKey!==n?x:S`
<section class="plugin-tab-embed" ${b({pluginEmbed:!0})}>
${D(this.pluginFrameGeneration,S`<iframe
class="plugin-tab-embed__frame"
src=${t.path}
title=${t.label}
sandbox=${q(e.config.current.embedSandboxMode)}
@load=${this.handlePluginThemeLoad}
></iframe>`)}
</section>
`}if(e.gateway.snapshot.phase!==`connected`||e.plugins?.isLoading(this.pluginId))return g();let n=ce(e,this.pluginId);return S`
<section class="card lazy-view-state" role="status">
${n??S`
<div class="card-title">${d(`pluginTabs.unavailableTitle`)}</div>
<div class="card-sub">
${e.plugins?.errors.find(e=>e.pluginId===this.pluginId)?.message??d(`pluginTabs.unavailableSubtitle`)}
</div>
`}
</section>
`}},L([T({attribute:!1})],Q.prototype,`pluginId`,void 0),L([T({attribute:!1})],Q.prototype,`tabId`,void 0),L([T({attribute:!1})],Q.prototype,`params`,void 0),L([M({context:_,subscribe:!0})],Q.prototype,`context`,void 0),L([O()],Q.prototype,`bundledViewState`,void 0),L([O()],Q.prototype,`externalAuthReadyKey`,void 0),L([O()],Q.prototype,`externalAuthUnavailableKey`,void 0),customElements.get(`openclaw-plugin-page`)||customElements.define(`openclaw-plugin-page`,Q)})))()}$();