openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
31 lines • 17.4 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./logbook-view-BxYMnY_4.js","./gateway-runtime-5YzSCmfV.js","./control-ui-boot-shared-JlZTSJEC.js","./control-ui-boot-shared-3SP_aL-Y.js","./control-ui-boot-shared-90V688bk.js","./control-ui-boot-shared-DBJri5ri.js","./control-ui-boot-shared-BykNRHBP.js","./control-ui-boot-shared-Rs4iS2kF.js","./plugin-contracts-runtime-CsJ0WpAd.js","./markdown-runtime-Hc-lvqnn.js","./config-runtime-CgOgfOrG.js","./control-ui-boot-shared-CG9HtEG-.js","./control-ui-boot-shared-73R4ErOy.js","./control-ui-boot-shared-CcmBeh0v.js","./control-ui-boot-shared-BR12heUA.js","./control-ui-boot-shared-CApmg5ot.js","./css-chat-Ckz95ikh.js","./chat-transcript-layout-w3EszKw8.js","./css-chat-custodian-new-session-B_euK-Vu.js","./sidebar-update-runtime-B0vYzX3D.js","./logbook-controller-DClzowCx.js","./control-ui-core-D-VUH4Gq.css","./control-ui-boot-shared-BJ_QKfFn.css","./css-chat-DCHf01mf.css","./css-chat-custodian-new-session-CEndYuO5.css","./sidebar-update-runtime-ah7rgQE7.css","./logbook-view-DuGdZh-x.css","./logbook-controller-D2s2M0LY.js"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Bi as t,Br as n,G as r,K as i,Ma as a,Na as o,U as s,V as c,W as l,ha as u,ja as ee,ma as d,qr as f,zi as p,zr as m}from"./control-ui-foundation-ZY_Flbbd.js";import{_c as h,cc as g,eo as _,hc as v,hu as y,lu as te,n as ne,no as re,ou as ie,r as ae,sc as oe,uu as b}from"./control-ui-core-3P365fbR.js";import{Fi as x,Ii as S,Li as C,Mi as w,_r as T,ei as E,hr as D,ii as O,or as k,qa as A,ri as j,sr as M,ti as N,vi as P,yi as F}from"./control-ui-core-CFW9Qtjn.js";import{$ as I,X as L,Y as R,ct as z,m as se,nt as B,p as V,ut as H}from"./lit-runtime-P5vbNq6b.js";import{Ar as U,Dr as W,Qn as G,Yn as K,Zn as ce}from"./control-ui-boot-shared-DoKu-5Ju.js";import{n as le,t as ue}from"./control-ui-disabled-DNN1S8_t.js";import{a as de,i as fe}from"./login-runtime-B9V4EbPP.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&&o(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:s}=t;if(!a?.isConnected||!r.contains(a)||e.source!==a.contentWindow||e.origin!==`null`&&e.origin!==window.location.origin||e.ports.length!==0||!q(e.data)||!s?.path||s.requiresGatewayAuth!==!0||!i(s.path)||a.getAttribute(`src`)!==s.path||n.gateway.snapshot.phase!==`connected`||!n.gateway.snapshot.client||!n.gateway.snapshot.hello?.auth||!D(n.gateway.snapshot.hello.auth)||!t.authenticated||Date.now()-t.authenticatedAt>=3e5)return;let{sessionKey:c,agentId:l}=e.data,u=ee(c)?.agentId;u&&(!o(u)||l&&u.toLowerCase()!==l.toLowerCase())||!d({namespace:`chat`,sessionKey:c,fallbackAgentId:l??`main`,exactKey:!0})||h(n,c,l)}function J(){return(J=e((()=>{a(),u(),r(),T(),v()})))()}function me(e,t){if(!t.path||e.pluginId!==t.pluginId)return!1;let n=i(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((()=>{n(),R(),B(),V(),r(),F(),k(),w(),E(),j(),b(),fe(),W(),K(),te(),g(),ue(),ne(),J(),_(),t(),de(),Y=1e4,X=5e3,Z={"logbook/logbook":async()=>{let[{renderLogbook:e},{stopLogbookPolling:t}]=await Promise.all([p(()=>import(`./logbook-view-BxYMnY_4.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,22,23,24,25,26]),import.meta.url),p(()=>import(`./logbook-controller-D2s2M0LY.js`),__vite__mapDeps([27,20,1,21]),import.meta.url)]);return{render:e,stop:t}}},Q=class extends ie{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.externalAuthRefreshMarker=null,this.externalAuthRefreshAbortController=null,this.externalAuthRefreshWatchdog=null,this.externalAuthProbeMarker=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 oe(this).watch(()=>this.context?.gateway,(e,t)=>e.subscribe(t),e=>this.updateGatewaySource(e)).watch(()=>this.context?.plugins,(e,t)=>e.subscribe(t)),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)&&(x(e.error)?S():this.bundledViewState={status:`idle`})},this.handlePluginThemeLoad=e=>{let t=e.currentTarget;t instanceof HTMLIFrameElement&&t===this.pluginThemeFrame&&ce(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 re({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,token:{}};this.bundledViewState=t;let n=n=>{this.bundledViewState.status===`loading`&&this.bundledViewState.token===t.token&&this.hasCurrentBundledDescriptor(e)&&(this.bundledViewState=n,n.status===`error`&&x(n.error)&&C())};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(l,i),n.searchParams.set(s,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.externalAuthRefreshMarker||this.externalAuthProbeMarker)return;let n={},r=Date.now(),i=new AbortController;this.externalAuthUnavailableKey=null,this.externalAuthRefreshMarker=n,this.externalAuthRefreshAbortController=i,this.externalAuthRefreshWatchdog=setTimeout(()=>{this.externalAuthRefreshMarker===n&&this.requestExternalTabAuthRestart(e)},Y),t.config.refresh({signal:i.signal}).then(t=>{if(this.externalAuthRefreshMarker!==n||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,r):t?(this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=e,this.externalAuthRefreshedAt=0):this.scheduleExternalTabAuthRefresh(e,!1)}).catch(()=>{this.externalAuthRefreshMarker===n&&this.externalAuthTargetKey===e&&(this.finishExternalTabAuthRefreshAttempt(e)?this.refreshExternalTabAuth(e):this.scheduleExternalTabAuthRefresh(e,!1))})}startExternalTabAuthProbe(e,t,n){this.cancelExternalTabAuthProbe();let r={},i=new AbortController;this.externalAuthProbeMarker=r,this.externalAuthProbeAbortController=i;let a;try{a=this.probeExternalTabAuth(t,i.signal)}catch{a=Promise.resolve(!1)}a.catch(()=>!1).then(t=>{if(this.externalAuthProbeMarker===r&&this.externalAuthTargetKey===e){if(this.externalAuthProbeMarker=null,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.externalAuthRefreshTimer&&=(clearTimeout(this.externalAuthRefreshTimer),null),this.externalAuthExpiryTimer&&=(clearTimeout(this.externalAuthExpiryTimer),null)}})}cancelExternalTabAuthProbe(){this.externalAuthProbeMarker=null;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.externalAuthRefreshMarker=null,this.externalAuthRestartKey=null,t}requestExternalTabAuthRestart(e){if(this.externalAuthTargetKey===e){if(this.externalAuthRefreshMarker){this.externalAuthRestartKey=e,this.externalAuthRefreshAbortController?.abort();return}this.externalAuthProbeMarker&&this.cancelExternalTabAuthProbe(),this.refreshExternalTabAuth(e)}}scheduleExternalTabAuthExpiry(e,t){this.externalAuthExpiryTimer&&clearTimeout(this.externalAuthExpiryTimer);let n=Math.max(0,t+c-Date.now());this.externalAuthExpiryTimer=setTimeout(()=>{this.externalAuthExpiryTimer=null,this.externalAuthTargetKey===e&&this.externalAuthReadyKey===e&&(this.externalAuthReadyKey=null,this.externalAuthRefreshedAt=0,this.pluginFrameGeneration={},this.externalAuthRefreshTimer&&=(clearTimeout(this.externalAuthRefreshTimer),null),this.requestExternalTabAuthRestart(e))},n)}scheduleExternalTabAuthRefresh(e,t){this.externalAuthRefreshTimer&&clearTimeout(this.externalAuthRefreshTimer);let n=t?c/2:5e3;this.externalAuthRefreshTimer=setTimeout(()=>{this.externalAuthRefreshTimer=null,this.refreshExternalTabAuth(e)},n)}clearExternalTabAuth(){this.pluginFrameGeneration={},this.externalAuthRefreshTimer&&clearTimeout(this.externalAuthRefreshTimer),this.externalAuthExpiryTimer&&clearTimeout(this.externalAuthExpiryTimer),this.externalAuthRefreshWatchdog&&clearTimeout(this.externalAuthRefreshWatchdog),this.externalAuthRefreshAbortController?.abort(),this.cancelExternalTabAuthProbe(),this.externalAuthRefreshTimer=null,this.externalAuthExpiryTimer=null,this.externalAuthRefreshWatchdog=null,this.externalAuthRefreshAbortController=null,this.externalAuthRefreshMarker=null,this.externalAuthRestartKey=null,this.externalAuthTargetKey=null,this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=null,this.externalAuthRefreshedAt=0}resetExternalTabAuthForGatewayChange(e,t){this.pluginFrameGeneration={},this.externalAuthRefreshTimer&&=(clearTimeout(this.externalAuthRefreshTimer),null),this.externalAuthExpiryTimer&&=(clearTimeout(this.externalAuthExpiryTimer),null),this.externalAuthReadyKey=null,this.externalAuthUnavailableKey=null,this.externalAuthRefreshedAt=0,this.externalAuthTargetKey=e,this.cancelExternalTabAuthProbe(),this.externalAuthRefreshMarker?(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&&A(e.path);return e&&t&&t!==e.path?{...e,path:t}:e}render(){let e=this.context;if(!e)return L;let t=this.tabInfo();if(e.plugins?.registrations(`pages`).some(e=>e.key===this.tabKey()))return ae(`pages`,this.tabKey(),this.params);if(t&&this.tabKey()in Z){let t=this.bundledViewState;if(t.status===`loading`)return O();if(t.status===`error`)return N({error:t.error,onRetry:this.retryBundledView,stale:x(t.error)});if(t.status!==`ready`)return L;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 I`
<section class="card lazy-view-state" role="status">
<div class="card-title">${y(`login.failure.insecure.title`)}</div>
<div class="card-sub">${y(`login.failure.insecure.stepHttps`)}</div>
</section>
`;let n=this.externalTabAuthKey(t,!1);return t.requiresGatewayAuth===!0&&this.externalAuthUnavailableKey===n?I`
<section class="card lazy-view-state" role="status">
<div class="card-title">${y(`pluginTabs.unavailableTitle`)}</div>
<div class="card-sub">${y(`pluginTabs.unavailableSubtitle`)}</div>
</section>
`:t.requiresGatewayAuth===!0&&this.externalAuthReadyKey!==n?L:I`
<section class="plugin-tab-embed" ${M({pluginEmbed:!0})}>
${se(this.pluginFrameGeneration,I`<iframe
class="plugin-tab-embed__frame"
src=${t.path}
title=${t.label}
sandbox=${U(e.config.current.embedSandboxMode)}
@load=${this.handlePluginThemeLoad}
></iframe>`)}
</section>
`}if(e.gateway.snapshot.phase!==`connected`||e.plugins?.isLoading(this.pluginId))return O();let n=le(e,this.pluginId);return I`
<section class="card lazy-view-state" role="status">
${n??I`
<div class="card-title">${y(`pluginTabs.unavailableTitle`)}</div>
<div class="card-sub">
${e.plugins?.errors.find(e=>e.pluginId===this.pluginId)?.message??y(`pluginTabs.unavailableSubtitle`)}
</div>
`}
</section>
`}},f([H({attribute:!1})],Q.prototype,`pluginId`,void 0),f([H({attribute:!1})],Q.prototype,`tabId`,void 0),f([H({attribute:!1})],Q.prototype,`params`,void 0),f([m({context:P,subscribe:!0})],Q.prototype,`context`,void 0),f([z()],Q.prototype,`bundledViewState`,void 0),f([z()],Q.prototype,`externalAuthReadyKey`,void 0),f([z()],Q.prototype,`externalAuthUnavailableKey`,void 0),customElements.get(`openclaw-plugin-page`)||customElements.define(`openclaw-plugin-page`,Q)})))()}$();