openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
219 lines • 57.3 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./session-progress-wfy54q9G.js","./gateway-runtime-Cr51Pi7N.js","./session-snapshot-database-BurLa_ut.js","./control-ui-boot-shared-umGE-sEP.js","./control-ui-boot-shared-Dfs-gZII.js","./control-ui-boot-shared-Sj2zqjOr.js","./control-ui-boot-shared-em9-jnbz.js","./config-runtime-BecGLziM.js","./control-ui-boot-shared-D4XEBdOG.js","./plugin-contracts-runtime-CNCaYops.js","./markdown-runtime-ORQpioyT.js","./control-ui-boot-chat-VeeaXyJz.js","./control-ui-boot-shared-DJkUdZmL.js","./control-ui-boot-shared-D3oo_6Fq.js","./control-ui-boot-shared-styles-BaQ2sAfZ.js","./sidebar-update-runtime-DonYLwN5.js","./control-ui-boot-chat-DxoNF0Ad.js","./chat-transcript-styles-Dzr3t9kA.js","./control-ui-boot-chat-styles-BRrYkFSc.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","./chat-transcript-styles-B_dd5Ueo.css","./control-ui-boot-chat-styles-C_Ls1c0m.css","./control-ui-boot-chat-mLz7NUiY.css","./report-L89u6Qae.js","./board-layout-BmeSfx17.js","./report-Cegj5HJR.css","./website-LmWBolIx.js","./website-DHaa5x94.css","./browser-DPecUAS0.js","./browser-panel-CpBLyCyg.js","./scrollbar-styles-BIL0YPCY.js","./dock-panel-styles-C_3Cdw6M.js","./panel-tab-strip-DvSbDG3-.js","./gateway-websocket-url-cYJwVUmD.js","./dock-destination-controls-CzLuh1pj.js","./panel-empty-state-DS_rQC2v.js","./browser-QJsz_Ze0.css","./mcp-app-view-registration-f68t3LcT.js","./mcp-app-routing-BHjVXpEf.js"])))=>i.map(i=>d[i]);
import{n as e,r as t}from"./rolldown-runtime-8BhlS34s.js";import{Ac as n,Cu as r,Ei as i,Eu as a,Rs as o,Tu as s,Vs as c,dn as l,du as u,fn as ee,ju as d,kc as te,lu as ne,n as re,pu as f,r as ie,uu as ae}from"./control-ui-core-BncvAZjR.js";import{Ai as oe,Fi as se,Ii as ce,Li as le,Pi as ue,Ti as de,W as fe,oi as pe,q as me,si as he,wi as ge}from"./control-ui-core-9qYjK5B2.js";import{$ as p,S as _e,X as m,Y as h,a as ve,ct as g,d as ye,i as be,nt as _,u as xe,ut as v,v as Se,x as Ce}from"./lit-runtime-B8uOr6OX.js";import{Ft as we,Pt as y,Xr as Te,Zr as Ee,_a as b,ii as x,oa as S,sa as C}from"./ui-DuRgK6kL.js";import{bi as w,dt as De}from"./control-ui-boot-shared-xfDhIVun.js";import{F as Oe,I as ke,L as Ae}from"./control-ui-boot-chat-Ck7W_FPO.js";import{$ as T,Q as je,Qt as Me,Zt as Ne,_n as Pe,a as Fe,at as Ie,c as Le,ct as Re,d as ze,dn as Be,et as E,g as Ve,gn as He,h as Ue,ht as We,it as Ge,l as D,m as Ke,mt as qe,nt as Je,o as Ye,ot as Xe,p as Ze,rt as O,s as Qe,st as $e,tt as k,u as A,un as et}from"./control-ui-boot-chat-C8hdsB2M.js";import{n as tt,t as nt}from"./control-ui-disabled-DfZ2EcL3.js";import{n as rt,t as it}from"./near-viewport-observer-WgGck829.js";import{a as j,i as at,r as ot}from"./widget-sandbox-host-BtiBzdny.js";import{n as st,t as ct}from"./mcp-app-confirm-C5ZrOS-h.js";function M(e){return e?.split(`:`,1)[0]?.trim()||`unknown`}function N(e,t){if(!e)return null;let n=P.find(t=>t.kind===e);if(!n)return null;let r=M(e);return t.some(t=>t.kind===e&&t.pluginId===r)?n:null}function lt(e,t){return e.contentKind===`html`||e.contentKind===`plugin`&&!e.frameUrl&&N(e.pluginKind,t)?.previewSafe===!0}var P;function F(){return(F=e((()=>{a(),C(),P=[{kind:`session:progress`,tagName:`openclaw-session-progress-widget`,get label(){return d(`sessionProgressCard.widgetLabel`)},loadModule:()=>S(()=>import(`./session-progress-wfy54q9G.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]),import.meta.url),previewSafe:!1},{kind:`session:report`,tagName:`openclaw-report-widget`,get label(){return d(`board.widget.kindReport`)},loadModule:()=>S(()=>import(`./report-L89u6Qae.js`),__vite__mapDeps([26,1,2,7,4,3,5,6,9,8,10,11,12,13,14,15,16,17,18,27,19,20,21,22,23,24,25,28]),import.meta.url),previewSafe:!0},{kind:`session:website`,tagName:`openclaw-website-widget`,get label(){return d(`board.widget.kindWebsite`)},loadModule:()=>S(()=>import(`./website-LmWBolIx.js`),__vite__mapDeps([29,1,2,7,4,3,5,6,9,8,10,11,12,13,14,15,16,17,18,27,19,20,21,22,23,24,25,30]),import.meta.url),previewSafe:!1},{kind:`browser:dashboard`,tagName:`openclaw-browser-dashboard-widget`,get label(){return d(`board.widget.kindBrowserDashboard`)},loadModule:()=>S(()=>import(`./browser-DPecUAS0.js`),__vite__mapDeps([31,1,2,4,3,5,6,9,8,7,10,11,12,13,14,15,16,17,18,32,33,34,35,36,37,38,19,20,21,22,23,24,25,39]),import.meta.url),previewSafe:!1}]})))()}function I(e){return e.toSorted((e,t)=>e.position-t.position||e.tabId.localeCompare(t.tabId))}function ut(e,t,n){let r=e.tabId===t,i=e.tabId===n;return p`
<wa-tab
class=${`board-tabs__tab ${r?`board-tabs__tab--active`:``} ${i?`board-tabs__tab--drop`:``}`}
panel=${e.tabId}
?active=${r}
data-board-tab-id=${e.tabId}
>
${e.title}
</wa-tab>
`}function dt(e){let{tabs:t,activeTabId:n,hoverTabId:r,onTabShow:i,onOverflowSelect:a}=e;if(t.length<=1)return m;let o=t.slice(0,6),s=t.find(e=>e.tabId===n);s&&!o.some(e=>e.tabId===s.tabId)&&(o[o.length-1]=s);let c=new Set(o.map(e=>e.tabId)),l=t.filter(e=>!c.has(e.tabId));return p`
<nav class="board-tabs" aria-label=${d(`board.tabsLabel`)}>
<wa-tab-group
class="board-tabs__track"
.active=${n}
activation="manual"
without-scroll-controls
@wa-tab-show=${i}
>
${o.map(e=>ut(e,n,r))}
</wa-tab-group>
${l.length>0?p`
<wa-dropdown
class="board-tabs__overflow"
placement="bottom-end"
@wa-select=${a}
>
<button
class="board-tabs__overflow-trigger"
slot="trigger"
type="button"
aria-label=${d(`board.moreTabs`)}
title=${d(`board.moreTabs`)}
>
•••
</button>
${l.map(e=>p`
<wa-dropdown-item
class="board-tabs__overflow-item"
value=${e.tabId}
data-board-tab-id=${e.tabId}
>
${e.title}
</wa-dropdown-item>
`)}
</wa-dropdown>
`:m}
</nav>
`}function L(){return(L=e((()=>{h(),a()})))()}function ft(e){let{appView:t,widget:n}=e,r=t?.status===`ready`&&t.expiresAtMs>Date.now()?t:void 0,i=p`<div class="board-widget__app-loading" data-test-id="board-mcp-app-loading">
${d(`board.widget.appLoading`)}
</div>`,a=r&&(!e.active||e.nearVisible)?p`<mcp-app-view
class="board-widget__mcp-app-view"
.sessionKey=${e.sessionKey}
.viewId=${r.viewId}
.fillContainer=${!0}
.surface=${`board`}
.title=${n.title||n.name}
@openclaw-mcp-app-view-expired=${e.expired}
></mcp-app-view>`:!e.nearVisible||!t?i:t.status===`stale`?p`<div class="board-widget__stale" data-test-id="board-mcp-app-stale">
<strong>${d(`board.widget.appStaleTitle`)}</strong>
<span>${d(`board.widget.appStaleDetail`)}</span>
<div class="board-widget__grant-actions">
<button
class="btn btn--small btn--primary"
type="button"
?disabled=${e.loading}
@click=${e.retry}
>
${d(`board.widget.retry`)}
</button>
<button
class="btn btn--small"
type="button"
?disabled=${e.busy}
@click=${e.remove}
>
${d(`board.widget.remove`)}
</button>
</div>
</div>`:i;return p`<div class="board-widget__mcp-app">${e.accessNotice}${a}</div>`}function R(){return(R=e((()=>{h(),a()})))()}function z(e,t){return`${e}\0${t.name}\0${t.revision}\0${t.instanceId??``}\0${t.grantState}`}function B(e){e!==void 0&&window.clearTimeout(e)}var V,H;function U(){return(U=e((()=>{f(),rt(),V=5e3,H=class{constructor(e){this.host=e,this.loading=!1,this.appViewGeneration=0,this.key=``,this.generation=0,this.visibility=new it(600,()=>this.visibilityChanged())}get nearVisible(){return this.visibility.nearVisible}update(e,t){if(this.callbacks=t,!e||e.contentKind!==`mcp-app`||!t){this.reset();return}let n=z(this.host.sessionKey(),e),r=t.appViewGeneration();(n!==this.key||r!==this.appViewGeneration)&&(this.reset(),this.key=n,this.appViewGeneration=r)}activityChanged(){this.host.active()||(this.visibility.disconnect(),this.clearTimers())}observe(e,t){if(!e||!t){this.visibility.disconnect();return}this.visibility.observe(e)}sync(){let e=this.host.widget(),t=this.callbacks;if(!this.host.active()||!e||e.contentKind!==`mcp-app`||!t){this.renewalTimer=B(this.renewalTimer);return}if(!this.nearVisible){this.loading||(this.renewalTimer=B(this.renewalTimer));return}!this.state&&!this.loading?this.load(e,t,`cached`):this.state?.status===`ready`&&!this.loading&&this.renewalTimer===void 0&&this.expiryTimer===void 0&&this.scheduleRenewal(e,t,this.state,!1)}disconnect(){this.visibility.disconnect(),this.reset(),this.callbacks=void 0}retry(){let e=this.host.widget();this.host.active()&&e&&this.callbacks&&this.load(e,this.callbacks,`refresh`)}expire(){let e=this.host.widget(),t=this.callbacks;if(!e||!t)return;let n=this.loading;this.state={status:`stale`,error:`MCP App view expired`},this.loading=!1,this.host.requestUpdate(),this.host.active()&&!n&&this.load(e,t,`expired`)}reset(){this.clearTimers(),this.generation+=1,this.key=``,this.appViewGeneration=0,this.state=void 0,this.loading=!1}clearTimers(){this.renewalTimer=B(this.renewalTimer),this.expiryTimer=B(this.expiryTimer)}visibilityChanged(){queueMicrotask(()=>{this.host.connected()&&this.host.requestUpdate()}),!this.nearVisible&&!this.loading&&(this.renewalTimer=B(this.renewalTimer))}async load(e,t,n){if(!this.host.active()||this.loading||!this.nearVisible)return;let r=z(this.host.sessionKey(),e);if(r!==this.key)return;let i=++this.generation,a=()=>{let e=this.host.widget();return this.host.connected()&&i===this.generation&&this.key===r&&e?.contentKind===`mcp-app`&&z(this.host.sessionKey(),e)===r};this.clearTimers(),this.loading=!0;let o=n===`refresh`&&this.state?.status===`ready`?this.state:null;n===`expired`&&(this.state=void 0),this.host.requestUpdate(),o&&(this.expiryTimer=window.setTimeout(()=>{this.expiryTimer=void 0,a()&&(this.state={status:`stale`,error:`MCP App lease expired while renewing`},this.loading=!1,this.host.requestUpdate())},Math.max(0,o.expiresAtMs-Date.now())));let s;try{s=await(n===`cached`?t.widgetAppView(e.name,e.revision):t.refreshWidgetAppView(e.name,e.revision))}catch(e){if(!a())return;s={status:`stale`,error:u(e)}}if(a()){if(s.status===`stale`&&o&&o.expiresAtMs>Date.now()){this.loading=!1,this.host.requestUpdate();return}this.clearTimers(),this.state=s,this.loading=!1,this.scheduleRenewal(e,t,s,n!==`cached`),this.host.requestUpdate()}}scheduleExpiry(e,t){if(t.status!==`ready`)return;this.expiryTimer=B(this.expiryTimer);let n=this.key;this.expiryTimer=window.setTimeout(()=>{this.expiryTimer=void 0;let r=this.host.widget(),i=this.state;this.host.connected()&&this.key===n&&r?.name===e.name&&r.revision===e.revision&&i?.status===`ready`&&i.viewId===t.viewId&&i.expiresAtMs===t.expiresAtMs&&(this.state={status:`stale`,error:`MCP App lease expired`},this.host.requestUpdate())},Math.max(0,t.expiresAtMs-Date.now()))}scheduleRenewal(e,t,n,r){if(this.renewalTimer=B(this.renewalTimer),n.status!==`ready`||!this.host.active())return;let i=this.key,a=n.expiresAtMs-Date.now()-V;if(!this.nearVisible){r&&a<=0&&this.scheduleExpiry(e,n);return}if(a<=0){r?this.scheduleExpiry(e,n):this.load(e,t,`refresh`);return}this.renewalTimer=window.setTimeout(()=>{this.renewalTimer=void 0;let n=this.host.widget();this.host.connected()&&this.host.active()&&this.nearVisible&&this.key===i&&n?.name===e.name&&n.revision===e.revision&&this.load(n,t,`refresh`)},a)}}})))()}function W(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.type===`openclaw:widget-bridge-request`&&typeof t.id==`string`&&t.id.length>0&&t.id.length<=128&&typeof t.method==`string`&&typeof t.ticket==`string`}function pt(e){if(!b(e))throw Error(`widget host request params are invalid`);return e}function G(e,t){let n=e[t];if(typeof n!=`string`||n.length===0)throw Error(`widget host request ${t} is required`);return n}var K,q,mt,ht,gt;function _t(){return(_t=e((()=>{Be(),l(),K=8192,q=5e3,mt=6e4,ht=12,gt=class{constructor(e){this.recentStatePayloads=new Map,this.pendingStates=new Map,this.stateAttemptTimes=[],this.frame=e.frame,this.ticket=e.ticket,this.client=e.client,this.rateKey=e.rateKey,this.confirmPrompt=e.confirmPrompt}updateIdentity(e,t){this.frame=e,this.ticket=t}async emitState(e){let t=JSON.stringify(e);if(t===void 0)throw Error(`widget state payload must be JSON`);if(new TextEncoder().encode(t).byteLength>K)throw Error(`widget state payload exceeds ${K} UTF-8 bytes`);let n=Date.now();for(let[e,t]of this.recentStatePayloads)n-t>=q&&this.recentStatePayloads.delete(e);if(this.recentStatePayloads.has(t))return{ok:!0,appended:!1,coalesced:!0};let r=this.pendingStates.get(t);if(r)return await r;if(this.stateAttemptTimes=this.stateAttemptTimes.filter(e=>n-e<mt),this.stateAttemptTimes.length>=ht)throw Error(`widget state emission rate limit exceeded`);this.stateAttemptTimes.push(n);let i=this.client.request(`board.event`,{ticket:this.ticket,payload:e});this.pendingStates.set(t,i);try{let e=await i;return this.recentStatePayloads.set(t,Date.now()),e}finally{this.pendingStates.get(t)===i&&this.pendingStates.delete(t)}}async handle(e,t={}){if(e.ticket!==this.ticket)throw Error(`widget view ticket does not match the active frame`);let n=pt(e.params);switch(e.method){case`host.open`:{let e=G(n,`url`);if(!/^https?:\/\//i.test(e))throw Error(`widget link url is invalid`);if(!ee(e))throw Error(`widget link could not be opened`);return{ok:!0}}case`prompt.send`:{if(t.promptUserActivated!==!0)throw Error(`widget prompt requires active user interaction`);let e=G(n,`text`),r=await this.client.request(`board.prompt.authorize`,{ticket:this.ticket});if(t.isCurrent?.()===!1)throw Error(`widget prompt request is no longer current`);if(!await et(this.frame,e,this.rateKey,r.confirmationRequired===!1?void 0:this.confirmPrompt,t.isCurrent))throw Error(`widget prompt was not accepted`);return{ok:!0}}case`state.emit`:return await this.emitState(n.payload);case`data.read`:{let e=G(n,`bindingId`),t=n.params;if(t!==void 0&&!b(t))throw Error(`widget data binding params are invalid`);return await this.client.request(`board.data.read`,{ticket:this.ticket,bindingId:e,...t?{params:t}:{}})}case`action.run`:{let e=G(n,`action`),t=n.params;if(t!==void 0&&!b(t))throw Error(`widget action params are invalid`);return await this.client.request(`board.action`,{ticket:this.ticket,action:e,params:t??{}})}case`cron.trigger`:return await this.client.request(`board.action`,{ticket:this.ticket,action:`cron.trigger`,jobId:G(n,`jobId`)});default:throw Error(`widget host method is not supported: ${e.method}`)}}}})))()}function vt(e){return e instanceof J&&e.kind===`unavailable`||e instanceof DOMException&&e.name===`TimeoutError`||e instanceof TypeError}var J,yt;function bt(){return(bt=e((()=>{f(),j(),_t(),J=class extends Error{constructor(e,t){super(t),this.kind=e}},yt=class{constructor(e){this.options=e,this.active=!0,this.bridgeController=null,this.bridgePort=null,this.adoptedTicket=``,this.retiredTicket=``,this.offeredTicket=``,this.requestGeneration=0,this.pendingRequests=new Map,this.documentHost=new at(this.documentOptions()),this.documentHost.setActive(e.connected!==!1)}get frame(){return this.options.frame}setActive(e){if(e!==this.active){if(this.active=e,this.documentHost.setActive(e&&this.options.connected!==!1),!e){this.cancelPendingRequests(`Widget inactive`),this.requestGeneration+=1;return}this.postHostInit()}}update(e){let t=this.options.client,n=this.options.connected!==!1&&e.connected===!1,r=this.documentKey(),i=this.options.sandboxUrl;this.options=e;let a=r!==this.documentKey(),o=i!==e.sandboxUrl;(a||o)&&(this.reset(),this.bridgeController=null,this.bridgeClient=void 0),(t!==e.client||n)&&(this.retiredTicket=this.adoptedTicket||e.widget.viewTicket||``,this.cancelPendingRequests(`Gateway connection changed`),this.requestGeneration+=1,this.bridgeController=null,this.bridgeClient=void 0,this.documentHost.loaded||this.documentHost.reset());let s=this.active&&e.connected!==!1;s||this.documentHost.setActive(!1),this.documentHost.update(this.documentOptions()),s&&this.documentHost.setActive(!0),e.widget.viewTicket&&!a&&(this.adoptedTicket&&this.bridgeController?.updateIdentity(e.frame,this.adoptedTicket),this.postHostInit())}reset(){this.documentHost.reset(),this.requestGeneration+=1,this.pendingRequests.clear(),this.bridgePort?.close(),this.bridgePort=null,this.adoptedTicket=``,this.retiredTicket=``,this.offeredTicket=``}dispose(){this.active=!1,this.reset(),this.documentHost.dispose(),this.bridgeController=null,this.bridgeClient=void 0}handleFrameError(){this.documentHost.handleFrameError()}handleMessage(e){if(e.source===this.options.frame.contentWindow&&e.origin===this.options.sandboxOrigin&&(this.documentHost.handleMessage(e),e.data?.method!==`ui/notifications/sandbox-proxy-ready`&&this.documentHost.ready)){if(e.data?.type===`openclaw:widget-prompt-offer`){e.ports[0]?.close();return}if(e.data?.type===`openclaw:widget-bridge-port-offer`){let t=e.ports[0];if(this.options.bridgeEnabled===!1||!t||this.bridgePort){t?.close();return}this.bridgePort=t,t.addEventListener(`message`,e=>{this.handleBridgeMessage(e.data)}),t.start(),this.postHostInit();return}e.data?.type===`openclaw:widget-bridge-ready`&&this.postHostInit()}}handleBridgeMessage(e){if(this.options.bridgeEnabled!==!1){if(e&&typeof e==`object`&&Reflect.get(e,`type`)===`openclaw:widget-host-init-ack`&&typeof Reflect.get(e,`ticket`)==`string`){let t=Reflect.get(e,`ticket`);if(t!==this.offeredTicket)return;this.offeredTicket=``,this.adoptedTicket=t,this.bridgeController?.updateIdentity(this.options.frame,t),this.postHostInit();return}if(!this.active){W(e)&&this.postResponse(e.id,!1,void 0,`Widget inactive`);return}this.handleBridgeRequest(e)}}handleBridgeRequest(e){if(!this.documentHost.ready||!W(e))return;let t=this.options.client,n=this.adoptedTicket;if(!t||!n||n===this.retiredTicket||this.options.connected===!1){this.postResponse(e.id,!1,void 0,`Gateway unavailable`);return}!this.bridgeController||this.bridgeClient!==t?(this.bridgeClient=t,this.bridgeController=new gt({frame:this.options.frame,ticket:n,client:t,rateKey:this.documentKey(),confirmPrompt:this.options.confirmPrompt})):this.bridgeController.updateIdentity(this.options.frame,n);let r=this.requestGeneration,i=this.options.frame;this.pendingRequests.set(e.id,r),this.bridgeController.handle(e,{promptUserActivated:e.method===`prompt.send`,isCurrent:()=>r===this.requestGeneration&&i===this.options.frame}).then(t=>{this.completeRequest(e.id,r,!0,t)}).catch(t=>{this.completeRequest(e.id,r,!1,void 0,u(t))})}completeRequest(e,t,n,r,i){t===this.requestGeneration&&this.pendingRequests.get(e)===t&&(this.pendingRequests.delete(e),this.postResponse(e,n,r,i))}cancelPendingRequests(e){for(let[t,n]of this.pendingRequests)n===this.requestGeneration&&this.postResponse(t,!1,void 0,e);this.pendingRequests.clear()}documentKey(){let e=this.options.resolveFrameUrl(this.options.widget.name,this.options.widget.revision).split(/[?#]/u,1)[0],t=this.options.widget.viewGeneration??this.options.widget.viewTicket??``,n=this.options.bridgeEnabled===!1?`passive`:`interactive`;return`${e}\0${this.options.widget.revision}\0${t}\0${n}`}postHostInit(){let e=this.options.widget.viewTicket;if(this.options.bridgeEnabled===!1||this.options.connected===!1||!this.documentHost.ready||!this.active||!this.bridgePort||!e||!this.documentHost.loaded||e===this.adoptedTicket||this.offeredTicket!==``)return;this.offeredTicket=e;let t=this.options.controlUiBaseUrl?.trim();this.bridgePort.postMessage({type:`openclaw:widget-host-init`,ticket:e,...t?{controlUiBaseUrl:t}:{}},[])}documentOptions(){let e=this.options;return{frame:e.frame,sandboxOrigin:e.sandboxOrigin,sandboxUrl:e.sandboxUrl,documentKey:this.documentKey(),loadDocument:t=>this.fetchDocument(e,t),retryDocument:vt,onLoaded:()=>{this.options.onLoaded(),this.postHostInit()},onPending:()=>this.options.onPending?.(),onRendered:e.onRendered?()=>this.options.onRendered?.():void 0,onError:e=>{e instanceof J&&e.kind===`unauthorized`?this.options.onUnauthorized(this.options.widget):vt(e)?this.options.onLoadFailed(this.options.widget):this.options.onError(e)},onReadyTimeout:()=>{this.reset(),this.options.onReadyTimeout()}}}async fetchDocument(e,t){let{widget:n,resolveFrameUrl:r,sourceOrigin:i}=e,a;try{a=new URL(r(n.name,n.revision),i)}catch(e){throw new J(`invalid-url`,u(e))}if(a.origin!==i)throw new J(`invalid-url`,`widget content URL is outside the active Gateway`);e.onFrameUrl(a.href);let o=await fetch(a.href,{cache:`no-store`,signal:t});if(o.status===401)throw new J(`unauthorized`,`widget content request failed (401)`);if(!o.ok)throw new J(o.status===408||o.status>=500?`unavailable`:`rejected`,`widget content request failed (${o.status})`);return await o.text()}postResponse(e,t,n,r){this.bridgePort?.postMessage({type:`openclaw:widget-bridge-response`,id:e,ok:t,...t?{result:n}:{error:r??`widget host request failed`}})}}})))()}function xt(){return typeof document<`u`&&document.visibilityState===`hidden`}function St(e,t){if(!e.sandboxOrigin&&t)try{if(!i(new URL(t).hostname))return d(`board.widget.sandboxOriginRequired`)}catch{}return d(`board.widget.frameAuthorizationFailed`)}var Ct,wt,Tt,Et,Dt,Y,Ot,kt,X,At,jt,Mt;function Nt(){return(Nt=e((()=>{h(),a(),bt(),Ne(),f(),o(),we(),j(),Oe(),me(),st(),qe(),Ct=`openclaw:widget-size`,wt=`openclaw:widget-board-host`,Tt=`openclaw:widget-scroll`,Et=`openclaw:widget-command-palette`,Dt=`openclaw:widget-shortcut-host`,Y=3,Ot=15e3,kt=1e3,X=1e3,At=3e4,jt=class{constructor(e,t){this.currentTicket=e,this.canRefresh=t,this.timer=null,this.attempts=0,this.scheduledTicket=``}clearTimer(){this.timer!==null&&(window.clearTimeout(this.timer),this.timer=null)}reset(){this.clearTimer(),this.attempts=0,this.scheduledTicket=``}schedule(e,t){let n=e?.viewTicket,r=e?Me(e):void 0;if(!this.canRefresh()||!e||!t||!n||r===void 0){this.reset();return}if(this.scheduledTicket===n)return;this.clearTimer(),this.attempts=0,this.scheduledTicket=n;let i=Math.max(kt,r-Ot);this.timer=window.setTimeout(()=>{this.timer=null,this.refresh(e.name,n,t)},i)}refresh(e,t,n){if(!this.canRefresh()){this.reset();return}if(this.currentTicket()!==t||this.scheduledTicket!==t)return;this.attempts+=1;let r=()=>{this.currentTicket()===t&&this.scheduledTicket===t&&(this.clearTimer(),this.timer=window.setTimeout(()=>{this.timer=null,this.refresh(e,t,n)},Math.min(X*this.attempts,At)))};n(e).then(r,r)}},Mt=class{constructor(e){this.host=e,this.error=``,this.waiting=!1,this.renderStalled=!1,this.frameFailureKey=``,this.frameRefreshAttempts=0,this.frameProbeGeneration=0,this.boardHostNonce=``,this.keyboardHostNonce=``,this.lastFrameUrl=``,this.messageListening=!1,this.visibilityListening=!1,this.sandboxOrigin=``,this.sandboxHost=null,this.contentVisible=!1,this.revealFrame=0,this.confirmation=new ct(()=>this.host.requestUpdate()),this.ticketRefresh=new jt(()=>this.host.widget()?.viewTicket,()=>this.host.active()&&!xt()&&this.gatewayAvailable()),this.handleVisibilityChange=()=>{if(xt()){this.ticketRefresh.reset();return}this.ticketRefresh.schedule(this.host.widget(),this.host.refreshFrame())},this.handleWindowMessage=e=>{if(!this.host.connected())return;let t=this.host.root().querySelector(`.board-widget__frame`);if(!t||e.source!==t.contentWindow)return;let n=this.host.widget();if(!this.host.active()){e.origin===this.sandboxOrigin&&this.sandboxHost?.handleMessage(e);return}let r=e.data;if(n&&r?.type===Ct&&typeof r.height==`number`&&Number.isFinite(r.height)&&r.height>0&&this.host.reportContentHeight(n.name,r.height),n&&r?.type===Tt&&r.nonce===this.boardHostNonce&&typeof r.deltaY==`number`&&Number.isFinite(r.deltaY)&&r.deltaY!==0&&this.host.scrollBy(r.deltaY),n&&r?.type===Et&&this.keyboardHostNonce&&r.nonce===this.keyboardHostNonce&&e.origin===this.sandboxOrigin&&t.isConnected&&document.activeElement===t&&!document.openClawModalLayers?.size&&window.dispatchEvent(new CustomEvent(fe)),!n?.viewTicket||e.origin!==this.sandboxOrigin)return;let i=this.syncSandboxHost(t,n);i&&i.handleMessage(e)}}gatewayAvailable(){let e=this.host.context()?.gateway.snapshot;return!e||c(e)}connect(){this.messageListening||=(window.addEventListener(`message`,this.handleWindowMessage),!0),this.host.active()&&!this.visibilityListening&&(document.addEventListener(`visibilitychange`,this.handleVisibilityChange),this.visibilityListening=!0),ke()}disconnect(){this.resetPresentation(),this.stopWork(),this.messageListening&&=(window.removeEventListener(`message`,this.handleWindowMessage),!1),this.sandboxHost?.dispose(),this.sandboxHost=null}suspend(){this.stopWork(),this.sandboxHost?.setActive(!1)}stopWork(){this.confirmation.cancel(),this.visibilityListening&&=(document.removeEventListener(`visibilitychange`,this.handleVisibilityChange),!1),this.ticketRefresh.reset()}activityChanged(){if(this.host.active()){this.connect(),this.sandboxHost?.setActive(this.gatewayAvailable());let e=this.host.root().querySelector(`.board-widget__frame`);e&&this.postBoardHostState(e)}else this.suspend()}widgetChanged(e,t){if(e.name!==t?.name||e.revision!==t?.revision){this.resetFailures(!1);return}if(!t||!this.error)return;let n=this.host.resolveFrameUrl()?.(t.name,t.revision)??``;n&&n!==this.lastFrameUrl&&this.setError(``,!1)}update(){if(this.confirmation.update(),!this.host.active()){this.suspend();return}this.connect(),this.ticketRefresh.schedule(this.host.widget(),this.host.refreshFrame()),this.updateSandboxHost()}render(e){let t=this.host.resolveFrameUrl();if(!t)throw Error(d(`board.widget.frameResolverMissing`));let n=t(e.name,e.revision);this.lastFrameUrl=n;let r=this.resolveSandboxFrameUrl(e);if(r)return p`
<div class="board-widget__frame-pane">
${this.confirmation.render()}
${this.contentVisible?m:this.renderStalled?p`<div class="board-widget__notice" role="status">
${d(`board.widget.resourceUnavailable`)}
<button class="btn btn--small" @click=${()=>this.retryContent()}>
${d(`common.retry`)}
</button>
</div>`:this.waiting?p`<div class="board-widget__notice" role="status">
${d(`board.widget.waitingForConnection`)}
</div>`:We(`discussion`,d(`common.loading`),!1,!0)}
<iframe
class="board-widget__frame"
style=${this.contentVisible?``:`opacity: 0`}
?inert=${!this.contentVisible}
sandbox="allow-scripts allow-same-origin allow-forms"
referrerpolicy="origin"
loading="eager"
title=${e.title||e.name}
src=${r}
@openclaw:restore-focus=${e=>{let t=e.currentTarget;t instanceof HTMLIFrameElement&&this.host.active()&&document.activeElement===t&&this.keyboardHostNonce&&t.contentWindow?.postMessage({type:`openclaw:widget-shortcut-focus`,nonce:this.keyboardHostNonce},this.sandboxOrigin)}}
@error=${()=>{this.sandboxHost?this.sandboxHost.handleFrameError():this.refreshFailedFrame(e)}}
@load=${e=>this.notifyBoardHost(e)}
></iframe>
</div>
`;if(e.sandboxUrl||e.sandboxPort||e.viewTicket)throw Error(d(`board.widget.sandboxUnavailable`));return p`
<iframe
class="board-widget__frame"
sandbox="allow-scripts"
referrerpolicy="no-referrer"
loading="lazy"
title=${e.title||e.name}
src=${n}
@error=${()=>this.refreshFailedFrame(e)}
@load=${t=>{this.notifyBoardHost(t),this.verifyAuthorization(t,e)}}
></iframe>
`}setError(e,t=!0){this.error!==e&&(this.error=e,t&&this.host.requestUpdate())}resetFailures(e=!0){this.confirmation.cancel(),this.waiting=!1,this.renderStalled=!1,this.resetPresentation(),this.frameProbeGeneration+=1,this.frameFailureKey=``,this.frameRefreshAttempts=0,this.setError(``,e),this.sandboxHost?.reset()}resetPresentation(){window.cancelAnimationFrame(this.revealFrame),this.revealFrame=0,this.contentVisible=!1}revealContent(){this.contentVisible||this.revealFrame||(this.revealFrame=window.requestAnimationFrame(()=>{this.revealFrame=window.requestAnimationFrame(()=>{this.revealFrame=0,this.contentVisible=!0,this.host.requestUpdate()})}))}refreshFailedFrame(e){if(!this.host.active())return;this.frameProbeGeneration+=1;let t=`${e.name}:${e.revision}`;if(this.frameFailureKey!==t&&(this.resetFailures(!1),this.frameFailureKey=t),this.frameRefreshAttempts>=Y){this.setError(St(e,this.sandboxOrigin));return}let n=this.host.refreshFrame();if(!n){this.setError(d(`board.widget.frameResolverMissing`));return}this.frameRefreshAttempts+=1,n(e.name).catch(e=>{this.setError(u(e))}),this.frameRefreshAttempts>=Y&&this.setError(St(e,this.sandboxOrigin))}verifyAuthorization(e,t){let n=e.currentTarget,r=n instanceof HTMLIFrameElement?n.getAttribute(`src`)??``:``;if(!r.startsWith(`/__openclaw__/board/`))return;let i=this.frameProbeGeneration+1;this.frameProbeGeneration=i;let a=()=>n instanceof HTMLIFrameElement&&n.isConnected&&n.getAttribute(`src`)===r&&this.frameProbeGeneration===i&&this.host.active()&&this.host.widget()?.name===t.name&&this.host.widget()?.revision===t.revision;fetch(r,{cache:`no-store`}).then(e=>{a()&&(e.status===401?this.refreshFailedFrame(t):e.ok&&this.resetFailures())}).catch(()=>{a()&&this.refreshFailedFrame(t)})}notifyBoardHost(e){let t=e.currentTarget;t instanceof HTMLIFrameElement&&this.postBoardHostState(t)}postBoardHostState(e){this.boardHostNonce=y(),this.keyboardHostNonce=this.sandboxOrigin?y():``,Ae(e,this.sandboxOrigin||`*`),e.contentWindow?.postMessage({type:wt,nonce:this.boardHostNonce},this.sandboxOrigin||`*`),this.keyboardHostNonce&&e.contentWindow?.postMessage({type:Dt,nonce:this.keyboardHostNonce},this.sandboxOrigin)}resolveSandboxFrameUrl(e){let t=this.host.context()?.gateway.connection.gatewayUrl;if(!e.sandboxUrl||!e.sandboxPort||!e.viewTicket||t===void 0)return;let n=Pe(e.sandboxUrl,e.sandboxPort,e.sandboxOrigin,t,window.location.origin);return this.sandboxOrigin=new URL(n).origin,n}sandboxHostOptions(e,t){let n=this.host.resolveFrameUrl();if(!n)return;let r=this.host.context(),i=r?.gateway.snapshot.client,a=r?.gateway.connectionRevision,o=r?.gateway.snapshot.hello;return{frame:e,widget:t,bridgeEnabled:this.host.bridgeEnabled?.()??!0,connected:!r||r.gateway.snapshot.phase===`connected`,sandboxOrigin:this.sandboxOrigin,sandboxUrl:e.src,sourceOrigin:He(r?.gateway.connection.gatewayUrl??``,window.location.origin),controlUiBaseUrl:`${window.location.origin}${r?.basePath??``}`,client:r?.gateway.snapshot.client??void 0,resolveFrameUrl:n,confirmPrompt:n=>this.confirmation.request({frame:e,title:t.title||t.name,text:n,kind:`message`,isCurrent:()=>{let n=this.host.widget(),r=this.host.context()?.gateway;return this.host.active()&&this.host.connected()&&this.gatewayAvailable()&&e===this.host.root().querySelector(`.board-widget__frame`)&&n?.name===t.name&&n.revision===t.revision&&n.viewGeneration===t.viewGeneration&&r?.snapshot.client===i&&r?.connectionRevision===a&&r?.snapshot.hello===o}}),onFrameUrl:e=>{this.lastFrameUrl=e},onLoadFailed:()=>this.waitForConnection(),onUnauthorized:e=>this.refreshFailedFrame(e),onReadyTimeout:()=>this.waitForConnection(),onPending:()=>this.waitForConnection(),onLoaded:()=>{this.waiting=!1,this.resetPresentation(),this.frameFailureKey=``,this.frameRefreshAttempts=0,this.setError(``,!1),this.host.requestUpdate()},onRendered:()=>{this.postBoardHostState(e),this.waiting=!1,this.renderStalled=!1,this.setError(``),this.revealContent()},onError:e=>{if(e instanceof ot){this.renderStalled=!0,this.host.requestUpdate();return}this.setError(u(e))}}}retryContent(){this.renderStalled=!1,this.waiting=!1,this.sandboxHost?.reset(),this.host.requestUpdate()}waitForConnection(){this.waiting=!0,this.host.requestUpdate()}updateSandboxHost(){let e=this.host.root().querySelector(`.board-widget__frame`),t=this.host.widget();if(!e?.isConnected||!t||!t.sandboxUrl||!t.sandboxPort||!t.viewTicket){this.sandboxHost?.dispose(),this.sandboxHost=null;return}this.syncSandboxHost(e,t)}syncSandboxHost(e,t){let n=this.sandboxHostOptions(e,t);if(!n)return;let r=this.host.active()&&this.gatewayAvailable();return r||this.sandboxHost?.setActive(!1),!this.sandboxHost||this.sandboxHost.frame!==e?(this.sandboxHost?.dispose(),this.sandboxHost=new yt(n)):this.sandboxHost.update(n),this.sandboxHost.setActive(r),this.sandboxHost}}})))()}var Pt,Z;function Ft(){return(Ft=e((()=>{Ee(),h(),_(),Se(),de(),ce(),a(),O(),F(),f(),ne(),s(),n(),nt(),re(),pe(),R(),U(),Ke(),Qe(),Nt(),oe(),w(),C(),Pt=()=>S(()=>import(`./mcp-app-view-registration-f68t3LcT.js`),__vite__mapDeps([40,1,2,12,4,3,5,6,9,8,7,10,13,14,15,41,11,16,17,18,19,20,21,22,23,24,25]),import.meta.url),Z=class extends r{constructor(...e){super(...e),this.fitAutoContent=!1,this.pageChrome=!1,this.tabs=[],this.session={sessionKey:``},this.sessionKey=``,this.active=!0,this.bridgeEnabled=!0,this.dragging=!1,this.focusTabIndex=-1,this.positionInSet=1,this.setSize=1,this.busy=!1,this.canMutate=!0,this.canGrant=!0,this.actionError=``,this.actionPending=!1,this.coreWidgetLoader=new ue(this),this.pluginSubscriptions=new te(this).watchStore(()=>this.context?.plugins),this.appView=new H({active:()=>this.active,connected:()=>this.isConnected,requestUpdate:()=>this.requestUpdate(),sessionKey:()=>this.sessionKey,widget:()=>this.widget}),this.frame=new Mt({active:()=>this.active,bridgeEnabled:()=>this.bridgeEnabled,connected:()=>this.isConnected,context:()=>this.context,refreshFrame:()=>this.callbacks?.frameLoadFailed,reportContentHeight:(e,t)=>this.callbacks?.reportContentHeight(e,t),scrollBy:e=>{this.closest(`openclaw-board-view`)?.scrollBy({top:e,behavior:`auto`})},requestUpdate:()=>this.requestUpdate(),resolveFrameUrl:()=>this.widgetFrameUrl,root:()=>this,widget:()=>this.widget})}connectedCallback(){super.connectedCallback(),this.frame.connect(),this.requestUpdate()}willUpdate(e){let t=e.get(`widget`);t&&t!==this.widget&&(this.actionError=``,this.frame.widgetChanged(t,this.widget)),this.appView.update(this.widget,this.callbacks),e.has(`active`)&&(this.appView.activityChanged(),this.frame.activityChanged(),this.active&&this.appView.observe(this.querySelector(`.board-widget`),this.widget?.contentKind===`mcp-app`)),this.syncCoreWidget()}updated(){if(!this.isConnected){this.appView.observe(null,!1);return}this.appView.observe(this.querySelector(`.board-widget`),this.active&&this.widget?.contentKind===`mcp-app`),queueMicrotask(()=>{this.isConnected&&this.appView.sync()}),this.frame.update()}disconnectedCallback(){this.pluginSubscriptions.clear();for(let e of P)this.coreWidgetLoader.requestWhileActive(e,!1);this.frame.disconnect(),this.appView.disconnect(),super.disconnectedCallback()}async runAction(e,t){if(!(this.actionPending||this.busy)){this.actionPending=!0,this.actionError=``,Ye(this);try{await e()}catch(e){this.actionError=u(e),t&&ae({message:t})}finally{this.actionPending=!1}}}runGrantDecision(e,t,n){let r=d(n===`granted`?`board.widget.allowFailed`:`board.widget.rejectFailed`);this.runAction(()=>t.grant(e.name,n),r)}selectMenuItem(e){let t=this.widget,n=this.callbacks;if(t&&n&&this.active&&this.canMutate){if(e===`remove`){this.runAction(()=>n.remove(t));return}if(e?.startsWith(`move:`)){this.runAction(()=>n.moveToTab(t,e.slice(5)));return}if(e?.startsWith(`resize:`)){let r=e.slice(7),i=Fe[r];i&&this.runAction(()=>n.resizeTo(t,i.w,i.h));return}if(e===`height:auto`){let e=t.heightMode===`fixed`?`auto`:`fixed`;this.runAction(()=>n.setHeightMode(t,e))}}}renderBody(e,t){e.contentKind===`mcp-app`&&se(`mcp-app-view`,Pt).catch(()=>void 0);let n=e.grantState===`pending`?Ve({widget:e,disabled:this.busy||this.actionPending||!this.canGrant,onGrant:n=>this.runGrantDecision(e,t,n),...this.actionError?{error:D(this.actionError,!0)}:{}}):e.grantState===`rejected`?Ze({disabled:this.busy||this.actionPending||!this.canMutate,onRemove:()=>void this.runAction(()=>t.remove(e))}):m;if(e.contentKind===`mcp-app`)return ft({accessNotice:n,appView:this.appView.state,busy:this.busy||this.actionPending||!this.canMutate,active:this.active,loading:this.appView.loading,nearVisible:this.appView.nearVisible,sessionKey:this.sessionKey,widget:e,expired:()=>this.appView.expire(),remove:()=>void this.runAction(()=>t.remove(e)),retry:()=>this.appView.retry()});if(n!==m)return n;if(e.contentKind===`plugin`&&e.frameUrl)return this.frame.render(e);if(e.contentKind===`plugin`){let n=M(e.pluginKind),r=this.context?.gateway.snapshot.hello?.controlUiWidgetKinds??[],i=N(e.pluginKind,r);if(i){let t=this.coreWidgetLoader.visibleState;if(t?.element===i&&t.status===`error`)return he({error:t.error,stale:t.stale,subtitle:i.label,onRetry:()=>this.coreWidgetLoader.retry()});if(!le(i))return p`<p class="board-widget__plugin-loading">
${d(`board.widget.pluginLoading`)}
</p>`;let n=Ce(i.tagName);return _e`<${n} .widget=${e} .session=${this.session} .active=${this.active}></${n}>`}let a=this.context?.plugins,o=`${n}/${e.pluginKind?.slice(n.length+1)}`,s=r.some(t=>t.kind===e.pluginKind&&t.pluginId===n);if(s&&a?.registrations(`widgets`).find(e=>e.key===o))return ie(`widgets`,o,{...this.session,widget:{name:e.name,props:e.props},canMutate:this.canMutate,canGrant:this.canGrant},m,this.active);if(this.context&&this.context.gateway.snapshot.phase!==`connected`||a?.isLoading(n))return p`<p class="board-widget__plugin-loading">${d(`board.widget.pluginLoading`)}</p>`;let c=tt(this.context,n);if(!c&&s&&a){let e=a.errors.find(e=>e.pluginId===n||e.pluginId===`host`);if(e)return A(e.message,()=>void a.refresh())}return Le({pluginId:n,content:c,disabled:this.busy||this.actionPending||!this.canMutate,onRemove:()=>void this.runAction(()=>t.remove(e))})}return this.frame.render(e)}syncCoreWidget(){let e=this.widget,t=this.context?.gateway.snapshot.hello?.controlUiWidgetKinds??[],n=e?.contentKind===`plugin`&&!e.frameUrl?N(e.pluginKind,t):null;for(let e of P)this.coreWidgetLoader.requestWhileActive(e,this.isConnected&&this.active&&n===e)}handleKeyDown(e,t,n){if(e.target!==e.currentTarget||!this.canMutate||this.pageChrome)return;let r=e.key===`ArrowLeft`?`left`:e.key===`ArrowRight`?`right`:e.key===`ArrowUp`?`up`:e.key===`ArrowDown`?`down`:null;r&&(e.preventDefault(),e.altKey?this.runAction(()=>n.nudge(t,r)):n.focus(t,r))}render(){let e=this.widget,t=this.rect,n=this.callbacks;if(!e||!t||!n)return m;let r,i;try{r=this.frame.error?A(this.frame.error):this.renderBody(e,n),i=!!this.frame.error}catch(e){r=A(e),i=!0}let a=e.title||e.name,o=!this.canMutate,s=i||this.actionError!==``||e.grantState===`pending`||e.grantState===`rejected`||e.contentKind===`mcp-app`||e.contentKind===`plugin`&&!e.frameUrl,c=e.contentKind===`html`||e.frameUrl?e.presentation??`card`:void 0,l=this.dragging||this.pageChrome?void 0:Je(e,this.contentHeightPx,T(),this.fitAutoContent?240:void 0),u=l===void 0?``:` height: calc(${l}px - var(--board-widget-height-trim, 0px)); align-self: start;`;return p`
<section
class=${`board-widget ${this.pageChrome?`board-widget--page-chrome`:``} ${this.dragging?`board-widget--dragging`:``} ${c?`board-widget--${c}`:``}`}
style=${`${Re(t)} --board-widget-rows: ${t.h}; --board-widget-order: ${this.positionInSet};${u}`}
role="listitem"
tabindex=${this.focusTabIndex}
aria-posinset=${this.positionInSet}
aria-setsize=${this.setSize}
aria-label=${o||this.pageChrome?a:d(`board.widget.cellLabel`,{title:a})}
data-widget-name=${e.name}
data-test-id="board-widget"
@focus=${()=>n.focusChanged(e.name)}
@keydown=${t=>this.handleKeyDown(t,e,n)}
>
${this.pageChrome?m:p`<header class="board-widget__bar">
${o?m:p`<span
class="board-widget__drag-handle"
aria-hidden="true"
title=${d(`board.widget.moveHandle`,{title:a})}
@pointerdown=${t=>n.movePointerDown(e,t)}
>
<span aria-hidden="true">⠿</span>
</span>`}
<span class="board-widget__title" title=${a}>${a}</span>
<span class="board-widget__kind"
>${e.contentKind===`mcp-app`?d(`board.widget.kindMcp`):e.contentKind===`plugin`?e.kindLabel||N(e.pluginKind,this.context?.gateway.snapshot.hello?.controlUiWidgetKinds??[])?.label||d(`board.widget.kindPlugin`):d(`board.widget.kindHtml`)}</span
>
${Ue(e)}
${o?m:ze({widget:e,tabs:this.tabs,disabled:this.busy||this.actionPending,onSelect:e=>this.selectMenuItem(e.detail.item.value)})}
</header>`}
<div
class=${`board-widget__body ${s?`board-widget__body--scrollable`:``} ${c===`card`?`board-widget__body--card`:``}`}
>
${r}
${this.actionError&&e.grantState!==`pending`?p`<div class="board-widget__error-overlay">
${D(this.actionError)}
</div>`:m}
</div>
${o||this.pageChrome?m:p`<span
class="board-widget__resize-handle"
aria-hidden="true"
title=${d(`board.widget.resizeHandle`,{title:a})}
@pointerdown=${t=>n.resizePointerDown(e,t)}
></span>`}
${e.grantState===`granted`&&!this.pageChrome?p`<span class="board-widget__grant-dot" aria-hidden="true"></span>`:m}
</section>
`}},x([Te({context:ge,subscribe:!0})],Z.prototype,`context`,void 0),x([v({attribute:!1})],Z.prototype,`widget`,void 0),x([v({attribute:!1})],Z.prototype,`rect`,void 0),x([v({attribute:!1})],Z.prototype,`contentHeightPx`,void 0),x([v({type:Boolean})],Z.prototype,`fitAutoContent`,void 0),x([v({type:Boolean})],Z.prototype,`pageChrome`,void 0),x([v({attribute:!1})],Z.prototype,`tabs`,void 0),x([v({attribute:!1})],Z.prototype,`session`,void 0),x([v({attribute:!1})],Z.prototype,`sessionKey`,void 0),x([v({attribute:!1})],Z.prototype,`widgetFrameUrl`,void 0),x([v({attribute:!1})],Z.prototype,`callbacks`,void 0),x([v({type:Boolean})],Z.prototype,`active`,void 0),x([v({type:Boolean})],Z.prototype,`bridgeEnabled`,void 0),x([v({type:Boolean})],Z.prototype,`dragging`,void 0),x([v({type:Number})],Z.prototype,`focusTabIndex`,void 0),x([v({type:Number})],Z.prototype,`positionInSet`,void 0),x([v({type:Number})],Z.prototype,`setSize`,void 0),x([v({type:Boolean})],Z.prototype,`busy`,void 0),x([v({type:Boolean})],Z.prototype,`canMutate`,void 0),x([v({type:Boolean})],Z.prototype,`canGrant`,void 0),x([g()],Z.prototype,`actionError`,void 0),x([g()],Z.prototype,`actionPending`,void 0),customElements.get(`openclaw-board-widget-cell`)||customElements.define(`openclaw-board-widget-cell`,Z)})))()}var It=t({});function Q(e,t){return e.widgets.filter(e=>e.tabId===t).toSorted((e,t)=>e.position-t.position||e.name.localeCompare(t.name))}var $;function Lt(){return(Lt=e((()=>{h(),_(),xe(),be(),a(),O(),s(),De(),w(),L(),Ft(),$=class extends r{constructor(...e){super(...e),this.session={sessionKey:``},this.activeTabId=``,this.active=!0,this.bridgeEnabled=!0,this.canMutate=!0,this.canGrant=!0,this.fitAutoContent=!1,this.pageWidgetName=``,this.previewItems=null,this.gestureName=``,this.hoverTabId=``,this.announcement=``,this.announcementRevision=0,this.actionError=``,this.focusName=``,this.mutationPending=!1,this.gesture=null,this.mutationRequestId=0,this.stableCellOrder=new Map,this.stableCellOrderSequence=0,this.visitedTabs=new Set,this.contentHeights=new Map,this.finePointerQuery=typeof window.matchMedia==`function`?window.matchMedia(je):null,this.handlePointerModeChange=()=>this.requestUpdate(),this.cellCallbacks={appViewGeneration:()=>this.callbacks?.appViewGeneration??0,grant:async(e,t)=>{if(!this.callbacks)return;let n=this.snapshot?.sessionKey;await this.callbacks.grant(e,t),n===this.snapshot?.sessionKey&&this.announce(d(t===`granted`?`board.announcement.granted`:`board.announcement.rejected`))},movePointerDown:(e,t)=>this.beginGesture(`move`,e,t),resizePointerDown:(e,t)=>this.beginGesture(`resize`,e,t),moveToTab:(e,t)=>this.moveWidget(e,this.nextPosition(t),t),resizeTo:async(e,t,n)=>this.applyOps([{kind:`widget_resize`,name:e.name,sizeW:t,sizeH:n,heightMode:`fixed`}],d(`board.announcement.resized`,{title:e.title||e.name})),setHeightMode:async(e,t)=>{let n=t===`fixed`?k(e,this.contentHeights.get(e.name),e.name===this.pageWidgetName?0:T()):e.sizeH;await this.applyOps([{kind:`widget_resize`,name:e.name,sizeW:e.sizeW,sizeH:n,heightMode:t}],d(`board.announcement.resized`,{title:e.title||e.name}))},reportContentHeight:(e,t)=>{let n=this.snapshot?.widgets.find(t=>t.name===e);n&&n.contentKind===`html`&&this.contentHeights.get(e)!==t&&(this.contentHeights.set(e,t),this.requestUpdate())},remove:async e=>this.applyOps([{kind:`widget_remove`,name:e.name}],d(`board.announcement.removed`,{title:e.title||e.name})),nudge:async(e,t)=>this.nudgeWidget(e,t),focus:(e,t)=>this.focusWidget(e,t),focusChanged:e=>{this.focusName=e},frameLoadFailed:async e=>this.callbacks?.frameLoadFailed?.(e),widgetAppView:async(e,t)=>await this.callbacks?.widgetAppView?.(e,t)??{status:`stale`,error:`MCP App view unavailable`},refreshWidgetAppView:async(e,t)=>await this.callbacks?.refreshWidgetAppView?.(e,t)??{status:`stale`,error:`MCP App view unavailable`}},this.handlePointerMove=e=>{let t=this.gesture;if(!t||e.pointerId!==t.pointerId)return;if(t.mode===`move`){let n=document.elementFromPoint(e.clientX,e.clientY)?.closest(`[data-board-tab-id]`),r=n?.closest(`openclaw-board-view`)===this?n.dataset.boardTabId??``:``,i=r!==``&&(this.snapshot?.tabs.some(e=>e.tabId===r)??!1),a=this.snapshot?this.activeTab(I(this.snapshot.tabs))?.tabId:this.activeTabId;if(this.hoverTabId=i&&r!==a?r:``,n){this.previewItems=t.items,t.dropValid=this.hoverTabId!==``;return}let o=this.querySelector(`.board-grid`),s=document.elementFromPoint(e.clientX,e.clientY);if(!o||s?.closest(`.board-grid`)!==o){this.hoverTabId=``,this.previewItems=t.items,t.dropValid=!1;return}t.dropValid=!0;let c=o.getBoundingClientRect(),l=Math.max(1,(c.width-132)/12),u=this.previewItems??t.items,ee=s?.closest(`openclaw-board-widget-cell`)?.widget?.name;this.previewItems=Xe(u,t.name,{name:ee,x:Math.floor((e.clientX-c.left)/(l+12)),y:Math.floor((e.clientY-c.top)/68)});return}let n=this.querySelector(`.board-grid`)?.getBoundingClientRect(),r=n?Math.max(1,(n.width-132)/12):56,i=Math.round((e.clientX-t.originClientX)/(r+12)),a=Math.round((e.clientY-t.originClientY)/68);this.previewItems=$e(t.items,t.name,t.originW+i,t.originH+a)},this.handlePointerUp=e=>{let t=this.gesture;if(!t||e.pointerId!==t.pointerId)return;this.handlePointerMove(e);let n=this.previewItems,r=this.hoverTabId;this.cancelGesture();let i=this.snapshot?.widgets.find(e=>e.name===t.name);if(!i)return;if(t.mode===`move`){if(!t.dropValid)return;let e=r?this.nextPosition(r):n?.find(e=>e.name===t.name)?.order??i.position;if(!r&&e===i.position)return;this.moveWidget(i,e,r||void 0).catch(()=>void 0);return}let a=n?.find(e=>e.name===t.name);a&&(a.w!==t.originW||a.h!==t.originH)&&this.cellCallbacks.resizeTo(i,a.w,a.h).catch(()=>void 0)},this.handlePointerCancel=e=>{this.gesture&&e.pointerId===this.gesture.pointerId&&this.cancelGesture()},this.handleTabShow=e=>{let t=this.snapshot?I(this.snapshot.tabs):[],n=this.activeTab(t)?.tabId??this.activeTabId;e.detail.name!==n&&t.some(t=>t.tabId===e.detail.name)&&this.callbacks?.selectTab(e.detail.name)},this.handleOverflowSelect=e=>{let t=e.detail.item.value;t&&this.snapshot?.tabs.some(e=>e.tabId===t)&&this.callbacks?.selectTab(t)}}connectedCallback(){super.connectedCallback(),this.finePointerQuery?.addEventListener(`change`,this.handlePointerModeChange)}willUpdate(e){let t=e.get(`session`);if((e.has(`session`)&&(t?.agentId!==this.session.agentId||t?.sessionKey!==this.session.sessionKey)||e.has(`snapshot`)&&e.get(`snapshot`)?.sessionKey!==this.snapshot?.sessionKey)&&(this.visitedTabs.clear(),this.stableCellOrder.clear(),this.stableCellOrderSequence=0,this.contentHeights.clear()),e.has(`snapshot`)){this.actionError=``;let t=e.get(`snapshot`);if(t?.sessionKey!==this.snapshot?.sessionKey)this.mutationRequestId+=1,this.mutationPending=!1,this.focusName=``;else if(t&&this.snapshot){let e=new Map(t.widgets.map(e=>[e.name,e]));for(let t of this.contentHeights.keys()){let n=e.get(t),r=this.snapshot.widgets.find(e=>e.name===t);(!r||r.contentKind!==`html`||n?.revision!==r.revision)&&this.contentHeights.delete(t)}}let n=new Set(this.snapshot?.tabs.map(e=>e.tabId));for(let e of this.visitedTabs)n.has(e)||this.visitedTabs.delete(e);let r=new Set(this.snapshot?.widgets.map(e=>e.name));for(let e of this.stableCellOrder.keys())r.has(e)||this.stableCellOrder.delete(e)}e.has(`activeTabId`)&&(this.focusName=``),this.gesture&&(e.has(`snapshot`)||e.has(`activeTabId`)||e.has(`pageWidgetName`)||e.has(`active`)&&!this.active)&&this.cancelGesture()}disconnectedCallback(){this.finePointerQuery?.removeEventListener(`change`,this.handlePointerModeChange),this.cancelGesture(),super.disconnectedCallback()}activeTab(e){return e.find(e=>e.tabId===this.activeTabId)??e[0]}announce(e){this.announcement=e,this.announcementRevision+=1}async applyOps(e,t){if(!this.callbacks)return;if(this.mutationPending)throw Error(d(`board.actionInProgress`));let n=this.snapshot?.sessionKey,r=this.mutationRequestId+1;this.mutationRequestId=r,this.mutationPending=!0,this.actionError=``;try{await this.callbacks.applyOps(e),r===this.mutationRequestId&&n===this.snapshot?.sessionKey&&this.announce(t)}catch(e){throw r===this.mutationRequestId&&n===this.snapshot?.sessionKey&&(this.actionError=d(`board.actionFailed`),this.announce(this.actionError)),e}finally{r===this.mutationRequestId&&(this.mutationPending=!1)}}nextPosition(e){let t=this.snapshot?.widgets.filter(t=>t.tabId===e).map(e=>e.position)??[0];return Math.max(-1,...t)+1}moveWidget(e,t,n){return this.applyOps([{kind:`widget_move`,name:e.name,position:t,...n===void 0?{}:{tabId:n}}],d(`board.announcement.moved`,{title:e.title||e.name}))}selectPageWidgetMenuItem(e,t,n){let r=this.snapshot?.widgets.find(t=>t.name===e);this.active&&this.canMutate&&this.pageWidgetName===e&&r?.revision===t&&r.tabId===this.activeTabId&&[...this.querySelectorAll(`openclaw-board-widget-cell`)].find(e=>e.pageChrome&&e.widget===r)?.selectMenuItem(n)}beginGesture(e,t,n){if(!this.active||!this.canMutate||n.button!==0||this.gesture||this.mutationPending)return;let r=this.snapshot,i=r?I(r.tabs):[],a=this.activeTab(i);if(!r||!a)return;n.preventDefault(),n.stopPropagation();try{n.currentTarget?.setPointerCapture?.(n.pointerId)}catch{}let o=E(Q(r,a.tabId),this.contentHeights);this.gesture={dropValid:!1,mode:e,name:t.name,originClientX:n.clientX,originClientY:n.clientY,originW:t.sizeW,originH:k(t,this.contentHeights.get(t.name),T()),pointerId:n.pointerId,items:o},this.previewItems=o,this.gestureName=t.name,window.addEventListener(`pointermove`,this.handlePointerMove),window.addEventListener(`pointerup`,this.handlePointerUp),window.addEventListener(`pointercancel`,this.handlePointerCancel)}cancelGesture(){window.removeEventListener(`pointermove`,this.handlePointerMove),window.removeEventListener(`pointerup`,this.handlePointerUp),window.removeEventListener(`pointercancel`,this.handlePointerCancel),this.gesture=null,this.previewItems=null,this.gestureName=``,this.hoverTabId=``}async nudgeWidget(e,t){let n=this.snapshot;if(!n)return;let r=E(Q(n,e.tabId),this.contentHeights),i=Ie(r,e.name,t).find(t=>t.name===e.name);i&&i.order!==e.position&&await this.moveWidget(e,i.order)}focusWidget(e,t){let n=this.snapshot;if(!n)return;let r=Q(n,e.tabId),i=r.findIndex(t=>t.name===e.name);if(i<0)return;let a=r[Math.max(0,Math.min(i+(t===`left`||t===`up`?-1:1),r.length-1))];a&&a.name!==e.name&&(this.focusName=a.name,this.updateComplete.then(()=>{[...this.querySelectorAll(`openclaw-board-widget-cell`)].find(e=>e.widget?.name===a.name)?.querySelector(`.board-widget`)?.focus()}))}renderGrid(e,t,n,r){let i=t.flatMap(t=>{let n=e.filter(e=>e.tabId===t.tabId),i=(t.tabId===r?this.previewItems:null)??E(n,this.contentHeights,this.fitAutoContent,this.pageWidgetName);return Ge(i,this.fitAutoContent?240:void 0)}),a=new Set(e.filter(e=>e.tabId===r).map(e=>e.name)),o=i.filter(e=>a.has(e.name));for(let e of i)this.stableCellOrder.has(e.name)||(this.stableCellOrder.set(e.name,this.stableCellOrderSequence),this.stableCellOrderSequence+=1);let s=i.toSorted((e,t)=>(this.stableCellOrder.get(e.name)??0)-(this.stableCellOrder.get(t.name)??0)||e.name.localeCompare(t.name)),c=new Map(o.map((e,t)=>[e.name,t])),l=o.some(e=>e.name===this.focusName)?this.focusName:o[0]?.name??``,u=new Map(e.map(e=>[e.name,e]));return p`
<div
class="board-grid"
role="list"
aria-label=${d(`board.gridLabel`)}
?hidden=${o.length===0}
>
${ve(s,e=>JSON.stringify([this.session.agentId,this.session.sessionKey,n,e.name]),e=>{let r=u.get(e.name);return r?p`
<openclaw-board-widget-cell
?hidden=${!a.has(r.name)}
?inert=${!a.has(r.name)}
.widget=${r}
.rect=${e}
.contentHeightPx=${this.contentHeights.get(r.name)}
.fitAutoContent=${this.fitAutoContent}
.pageChrome=${r.name===this.pageWidgetName}
.tabs=${t}
.session=${this.session}
.sessionKey=${n}
.widgetFrameUrl=${this.widgetFrameUrl}
.callbacks=${this.cellCallbacks}
.active=${this.active&&a.has(r.name)}
.bridgeEnabled=${this.bridgeEnabled}
.dragging=${r.name===this.gestureName}
.focusTabIndex=${r.name===l?0:-1}
.positionInSet=${(c.get(r.name)??0)+1}
.setSize=${o.length}
.busy=${this.mutationPending}
.canMutate=${this.canMutate}
.canGrant=${this.canGrant}
></openclaw-board-widget-cell>
`:m})}
${this.gesture?.mode===`move`?p`<div class="board-grid__append-zone" aria-hidden="true"></div>`:m}
</div>
${o.length===0?p`
<div class="board-empty" data-test-id="board-empty">
<span class="board-empty__mark" aria-hidden="true">+</span>
<strong>${d(`board.emptyTitle`)}</strong>
<span>${d(`board.emptyHint`)}</span>
</div>
`:m}
`}render(){let e=this.snapshot;if(!e)return m;let t=I(e.tabs),n=this.activeTab(t),r=n?.tabId??this.activeTabId,i=n?Q(e,n.tabId):[];n&&this.visitedTabs.add(r);let a=e.widgets.filter(e=>this.visitedTabs.has(e.tabId)||this.stableCellOrder.has(e.name)),o=i.length===1&&i[0]?.sizeW===12,s=o&&(i[0]?.name===this.pageWidgetName||i[0]?.pluginKind===`session:website`||i[0]?.pluginKind===`browser:dashboard`);return p`
<section
class=${`board-view ${o?`board-view--single-full-width`:``} ${s?`board-view--page`:``}`}
aria-label=${d(`board.label`)}
>
${dt({tabs:t,activeTabId:r,hoverTabId:this.hoverTabId,onTabShow:this.handleTabShow,onOverflowSelect:this.handleOverflowSelect})}
${this.renderGrid(a,t,e.sessionKey,r)}
${this.actionError?p`<div class="board-view__error" role="alert">${this.actionError}</div>`:m}
<div class="board-announcer" aria-live="polite" aria-atomic="true">
${this.announcement?ye(this.announcementRevision,p`<span data-announcement-revision=${this.announcementRevision}
>${this.announcement}</span
>`):m}
</div>
</section>
`}},x([v({attribute:!1})],$.prototype,`session`,void 0),x([v({attribute:!1})],$.prototype,`snapshot`,void 0),x([v({attribute:!1})],$.prototype,`activeTabId`,void 0),x([v({attribute:!1})],$.prototype,`widgetFrameUrl`,void 0),x([v({attribute:!1})],$.prototype,`callbacks`,void 0),x([v({type:Boolean})],$.prototype,`active`,void 0),x([v({type:Boolean})],$.prototype,`bridgeEnabled`,void 0),x([v({type:Boolean})],$.prototype,`canMutate`,void 0),x([v({type:Boolean})],$.prototype,`canGrant`,void 0),x([v({type:Boolean})],$.prototype,`fitAutoContent`,void 0),x([v({attribute:!1})],$.prototype,`pageWidgetName`,void 0),x([g()],$.prototype,`previewItems`,void 0),x([g()],$.prototype,`gestureName`,void 0),x([g()],$.prototype,`hoverTabId`,void 0),x([g()],$.prototype,`announcement`,void 0),x([g()],$.prototype,`announcementRevision`,void 0),x([g()],$.prototype,`actionError`,void 0),x([g()],$.prototype,`focusName`,void 0),x([g()],$.prototype,`mutationPending`,void 0),customElements.get(`openclaw-board-view`)||customElements.define(`openclaw-board-view`,$)})))()}export{lt as i,Lt as n,F as r,It as t};