UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

207 lines • 54.1 kB
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./session-progress-BkRR9Ndm.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-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","./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","./report-DBMeRLfv.js","./board-layout-BmeSfx17.js","./report-Cegj5HJR.css","./website-BFZu3NIE.js","./website-DHaa5x94.css","./browser-BIJXvPg-.js","./browser-panel-DNPuq5oF.js","./scrollbar-styles-BielkyQ9.js","./dock-panel-styles-lbOjSYYD.js","./panel-tab-strip-BM8uM2tc.js","./gateway-websocket-url-cYJwVUmD.js","./dock-destination-controls-BlZlW68m.js","./panel-empty-state-BO6bnLg_.js","./browser-QJsz_Ze0.css","./mcp-app-view-registration-hYRvDC-S.js"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Bi as t,Br as n,Et as r,Ji as i,Tt as a,qr as o,zi as s,zr as c}from"./control-ui-foundation-ZY_Flbbd.js";import{Gl as l,Ul as u,Wl as ee,an as te,cc as ne,fa as re,hu as d,lu as ie,n as ae,on as oe,ql as f,r as se,sc as ce,su as p,uu as m}from"./control-ui-core-3P365fbR.js";import{Ai as le,Oi as ue,ei as de,ji as fe,ki as pe,ti as me,vi as he,wi as ge,yi as _e}from"./control-ui-core-CFW9Qtjn.js";import{$ as h,S as ve,X as g,Y as _,c as ye,ct as v,m as be,nt as y,p as xe,s as Se,ut as b,v as Ce,x as we}from"./lit-runtime-P5vbNq6b.js";import{$t as Te,Gt as x,Jt as S,Kt as C,Qt as Ee,Ut as De,Wt as w,Xn as Oe,Xt as ke,Yn as Ae,Yt as je,Zn as Me,Zt as Ne,ar as Pe,ir as Fe,qt as Ie}from"./control-ui-boot-shared-DoKu-5Ju.js";import{B as Le,F as T,H as Re,I as E,L as ze,M as Be,N as Ve,P as He,V as Ue,Ya as D,_n as We,fn as Ge,gn as Ke,j as qe,nn as Je,pn as Ye,rn as Xe,vn as Ze,z as Qe}from"./control-ui-boot-shared-CG9HtEG-.js";import{n as $e,t as et}from"./control-ui-disabled-DNN1S8_t.js";import{n as tt,t as nt}from"./near-viewport-observer-WgGck829.js";import{i as rt,n as it,r as at}from"./widget-sandbox-host-BQH21b5-.js";function O(e){return e?.split(`:`,1)[0]?.trim()||`unknown`}function k(e,t){if(!e)return null;let n=A.find(t=>t.kind===e);if(!n)return null;let r=O(e);return t.some(t=>t.kind===e&&t.pluginId===r)?n:null}function ot(e,t){return e.contentKind===`html`||e.contentKind===`plugin`&&!e.frameUrl&&k(e.pluginKind,t)?.previewSafe===!0}var A;function j(){return(j=e((()=>{m(),t(),A=[{kind:`session:progress`,tagName:`openclaw-session-progress-widget`,get label(){return d(`sessionProgressCard.widgetLabel`)},loadModule:()=>s(()=>import(`./session-progress-BkRR9Ndm.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]),import.meta.url),previewSafe:!1},{kind:`session:report`,tagName:`openclaw-report-widget`,get label(){return d(`board.widget.kindReport`)},loadModule:()=>s(()=>import(`./report-DBMeRLfv.js`),__vite__mapDeps([24,1,10,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,25,19,20,21,22,23,26]),import.meta.url),previewSafe:!0},{kind:`session:website`,tagName:`openclaw-website-widget`,get label(){return d(`board.widget.kindWebsite`)},loadModule:()=>s(()=>import(`./website-BFZu3NIE.js`),__vite__mapDeps([27,1,10,2,3,4,5,6,7,8,9,11,12,13,14,15,16,17,18,25,19,20,21,22,23,28]),import.meta.url),previewSafe:!1},{kind:`browser:dashboard`,tagName:`openclaw-browser-dashboard-widget`,get label(){return d(`board.widget.kindBrowserDashboard`)},loadModule:()=>s(()=>import(`./browser-BIJXvPg-.js`),__vite__mapDeps([29,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,30,31,32,33,34,35,36,19,20,21,22,23,37]),import.meta.url),previewSafe:!1}]})))()}function M(){return(M=e((()=>{})))()}function N(e){return e.toSorted((e,t)=>e.position-t.position||e.tabId.localeCompare(t.tabId))}function st(e,t,n){let r=e.tabId===t,i=e.tabId===n;return h`
    <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 ct(e){let{tabs:t,activeTabId:n,hoverTabId:r,onTabShow:i,onOverflowSelect:a}=e;if(t.length<=1)return g;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 h`
    <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=>st(e,n,r))}
      </wa-tab-group>
      ${l.length>0?h`
              <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=>h`
                    <wa-dropdown-item
                      class="board-tabs__overflow-item"
                      value=${e.tabId}
                      data-board-tab-id=${e.tabId}
                    >
                      ${e.title}
                    </wa-dropdown-item>
                  `)}
              </wa-dropdown>
            `:g}
    </nav>
  `}function P(){return(P=e((()=>{_(),m()})))()}function lt(e){let{appView:t,widget:n}=e,r=t?.status===`ready`&&t.expiresAtMs>Date.now()?t:void 0,i=h`<div class="board-widget__app-loading" data-test-id="board-mcp-app-loading">
    ${d(`board.widget.appLoading`)}
  </div>`,a=r&&(!e.active||e.nearVisible)?h`<mcp-app-view
          class="board-widget__mcp-app-view"
          .sessionKey=${e.sessionKey}
          .viewId=${r.viewId}
          .fillContainer=${!0}
          .title=${n.title||n.name}
          @openclaw-mcp-app-view-expired=${e.expired}
        ></mcp-app-view>`:!e.nearVisible||!t?i:t.status===`stale`?h`<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 h`<div class="board-widget__mcp-app">${e.accessNotice}${a}</div>`}function F(){return(F=e((()=>{_(),m()})))()}function I(e,t){return`${e}\0${t.name}\0${t.revision}\0${t.instanceId??``}\0${t.grantState}`}function L(e){e!==void 0&&window.clearTimeout(e)}var R,z;function B(){return(B=e((()=>{f(),tt(),R=5e3,z=class{constructor(e){this.host=e,this.loading=!1,this.appViewGeneration=0,this.key=``,this.generation=0,this.visibility=new nt(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=I(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=L(this.renewalTimer);return}if(!this.nearVisible){this.loading||(this.renewalTimer=L(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=L(this.renewalTimer),this.expiryTimer=L(this.expiryTimer)}visibilityChanged(){queueMicrotask(()=>{this.host.connected()&&this.host.requestUpdate()}),!this.nearVisible&&!this.loading&&(this.renewalTimer=L(this.renewalTimer))}async load(e,t,n){if(!this.host.active()||this.loading||!this.nearVisible)return;let r=I(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`&&I(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:l(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=L(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=L(this.renewalTimer),n.status!==`ready`||!this.host.active())return;let i=this.key,a=n.expiresAtMs-Date.now()-R;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 ut(e){return oe(e)!==null}function V(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 dt(e){if(!i(e))throw Error(`widget host request params are invalid`);return e}function H(e,t){let n=e[t];if(typeof n!=`string`||n.length===0)throw Error(`widget host request ${t} is required`);return n}var U,W,ft,G,pt;function mt(){return(mt=e((()=>{Ye(),te(),U=8192,W=5e3,ft=6e4,G=12,pt=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,this.dispatchPrompt=e.dispatchPrompt??Ge,this.now=e.now??Date.now,this.openUrl=e.openUrl??ut}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>U)throw Error(`widget state payload exceeds ${U} UTF-8 bytes`);let n=this.now();for(let[e,t]of this.recentStatePayloads)n-t>=W&&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<ft),this.stateAttemptTimes.length>=G)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,this.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=dt(e.params);switch(e.method){case`host.open`:{let e=H(n,`url`);if(!/^https?:\/\//i.test(e))throw Error(`widget link url is invalid`);if(!this.openUrl(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=H(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(!this.dispatchPrompt(this.frame,e,this.rateKey,r.confirmationRequired===!1?void 0:this.confirmPrompt))throw Error(`widget prompt was not accepted`);return{ok:!0}}case`state.emit`:return await this.emitState(n.payload);case`data.read`:{let e=H(n,`bindingId`),t=n.params;if(t!==void 0&&!i(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=H(n,`action`),t=n.params;if(t!==void 0&&!i(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:H(n,`jobId`)});default:throw Error(`widget host method is not supported: ${e.method}`)}}}})))()}var K,ht;function gt(){return(gt=e((()=>{f(),rt(),mt(),K=class extends Error{constructor(e,t){super(t),this.kind=e}},ht=class{constructor(e){this.active=!0,this.bridgeController=null,this.bridgePort=null,this.adoptedTicket=``,this.offeredTicket=``,this.requestGeneration=0,this.pendingRequests=new Map,this.options=e,this.documentHost=new at(this.documentOptions())}get frame(){return this.options.frame}setActive(e){if(e!==this.active){if(this.active=e,this.documentHost.setActive(e),!e){this.cancelPendingRequests(`Widget inactive`),this.requestGeneration+=1;return}this.postHostInit()}}update(e){let t=this.options.client,n=this.documentKey(),r=this.options.sandboxUrl;this.options=e;let i=n!==this.documentKey(),a=r!==e.sandboxUrl;(i||a)&&(this.reset(),this.bridgeController=null,this.bridgeClient=void 0),t!==e.client&&(this.cancelPendingRequests(`Gateway connection changed`),this.requestGeneration+=1,this.bridgeController=null,this.bridgeClient=void 0,this.documentHost.loaded||this.documentHost.reset()),this.documentHost.update(this.documentOptions()),e.widget.viewTicket&&!i&&(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.offeredTicket=``}dispose(){this.active=!1,this.reset(),this.documentHost.dispose(),this.bridgeController=null,this.bridgeClient=void 0}accepts(e){return e.source===this.options.frame.contentWindow&&e.origin===this.options.sandboxOrigin}handleFrameError(){this.documentHost.handleFrameError()}handleMessage(e){if(this.accepts(e)&&(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){V(e)&&this.postResponse(e.id,!1,void 0,`Widget inactive`);return}this.handleBridgeRequest(e)}}handleBridgeRequest(e){if(!this.documentHost.ready||!V(e))return;let t=this.options.client,n=this.adoptedTicket;if(!t||!n){this.postResponse(e.id,!1,void 0,`Gateway unavailable`);return}!this.bridgeController||this.bridgeClient!==t?(this.bridgeClient=t,this.bridgeController=new pt({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,l(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.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),onLoaded:()=>{this.options.onLoaded(),this.postHostInit()},onRendered:e.onRendered?()=>this.options.onRendered?.():void 0,onError:e=>{if(e instanceof it){this.options.onError(e);return}if(e instanceof K){e.kind===`unauthorized`?this.options.onUnauthorized(this.options.widget):this.options.onError(e);return}this.options.onLoadFailed(this.options.widget)},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 K(`invalid-url`,l(e))}if(a.origin!==i)throw new K(`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 K(`unauthorized`,`widget content request failed (401)`);if(!o.ok)throw Error(`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 _t(){return typeof document<`u`&&document.visibilityState===`hidden`}function vt(e,t){if(!e.sandboxOrigin&&t)try{if(!re(new URL(t).hostname))return d(`board.widget.sandboxOriginRequired`)}catch{}return d(`board.widget.frameAuthorizationFailed`)}var yt,bt,xt,q,St,Ct,wt,J,Tt,Et;function Dt(){return(Dt=e((()=>{_(),m(),gt(),Fe(),f(),r(),Ae(),Je(),yt=`openclaw:widget-size`,bt=`openclaw:widget-board-host`,xt=`openclaw:widget-scroll`,q=3,St=15e3,Ct=1e3,wt=1e3,J=3e4,Tt=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?Pe(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(Ct,r-St);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(wt*this.attempts,J)))};n(e).then(r,r)}},Et=class{constructor(e){this.host=e,this.error=``,this.frameFailureKey=``,this.frameRefreshAttempts=0,this.frameProbeGeneration=0,this.boardHostNonce=``,this.lastFrameUrl=``,this.messageListening=!1,this.visibilityListening=!1,this.sandboxOrigin=``,this.sandboxHost=null,this.contentVisible=!1,this.revealFrame=0,this.ticketRefresh=new Tt(()=>this.host.widget()?.viewTicket,()=>this.host.active()&&!_t()),this.handleVisibilityChange=()=>{if(_t()){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===yt&&typeof r.height==`number`&&Number.isFinite(r.height)&&r.height>0&&this.host.reportContentHeight(n.name,r.height),n&&r?.type===xt&&r.nonce===this.boardHostNonce&&typeof r.deltaY==`number`&&Number.isFinite(r.deltaY)&&r.deltaY!==0&&this.host.scrollBy(r.deltaY),!n?.viewTicket||e.origin!==this.sandboxOrigin)return;let i=this.syncSandboxHost(t,n);i&&(i.handleMessage(e),e.data?.type===`openclaw:widget-bridge-ready`&&this.postBoardHostState(t))}}connect(){this.messageListening||=(window.addEventListener(`message`,this.handleWindowMessage),!0),this.host.active()&&!this.visibilityListening&&(document.addEventListener(`visibilitychange`,this.handleVisibilityChange),this.visibilityListening=!0),Oe()}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.visibilityListening&&=(document.removeEventListener(`visibilitychange`,this.handleVisibilityChange),!1),this.ticketRefresh.reset()}activityChanged(){if(this.host.active()){this.connect(),this.sandboxHost?.setActive(!0);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.host.active()){this.suspend();return}this.connect(),this.ticketRefresh.schedule(this.host.widget(),this.host.refreshFrame()),this.updateSandboxHost(),this.sandboxHost?.setActive(!0)}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 h`
        ${this.contentVisible?g:Xe(`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}
          @error=${()=>{this.sandboxHost?this.sandboxHost.handleFrameError():this.refreshFailedFrame(e)}}
          @load=${e=>this.notifyBoardHost(e)}
        ></iframe>
      `;if(e.sandboxUrl||e.sandboxPort||e.viewTicket)throw Error(d(`board.widget.sandboxUnavailable`));return h`
      <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.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>=q){this.setError(vt(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(l(e))}),this.frameRefreshAttempts>=q&&this.setError(vt(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=a(),Me(e,this.sandboxOrigin||`*`),e.contentWindow?.postMessage({type:bt,nonce:this.boardHostNonce},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=We(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{frame:e,widget:t,bridgeEnabled:this.host.bridgeEnabled?.()??!0,sandboxOrigin:this.sandboxOrigin,sandboxUrl:e.src,sourceOrigin:Ke(this.host.context()?.gateway.connection.gatewayUrl??``,window.location.origin),controlUiBaseUrl:`${window.location.origin}${this.host.context()?.basePath??``}`,client:this.host.context()?.gateway.snapshot.client??void 0,resolveFrameUrl:n,confirmPrompt:e=>window.confirm(`${d(`common.confirm`)}:\n\n${e}`),onFrameUrl:e=>{this.lastFrameUrl=e},onLoadFailed:e=>this.refreshFailedFrame(e),onUnauthorized:e=>this.refreshFailedFrame(e),onReadyTimeout:()=>this.refreshFailedFrame(t),onLoaded:()=>{this.resetPresentation(),this.frameFailureKey=``,this.frameRefreshAttempts=0,this.setError(``,!1),this.host.requestUpdate()},onRendered:()=>{this.setError(``),this.revealContent()},onError:e=>{this.setError(l(e))}}}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!this.sandboxHost||this.sandboxHost.frame!==e?(this.sandboxHost?.dispose(),this.sandboxHost=new ht(n)):this.sandboxHost.update(n),this.sandboxHost}}})))()}var Ot,Y;function X(){return(X=e((()=>{n(),_(),y(),Ce(),_e(),le(),m(),S(),j(),f(),u(),ie(),ne(),et(),ae(),de(),F(),B(),Le(),Ve(),Dt(),ge(),D(),t(),Ot=()=>s(()=>import(`./mcp-app-view-registration-hYRvDC-S.js`),__vite__mapDeps([38,1,5,4,10,2,3,6,7,8,9,11,12,13,14,15,16,17,18,19,20,21,22,23]),import.meta.url),Y=class extends p{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 ce(this).watch(()=>this.context?.plugins,(e,t)=>e.subscribe(t)),this.appView=new z({active:()=>this.active,connected:()=>this.isConnected,requestUpdate:()=>this.requestUpdate(),sessionKey:()=>this.sessionKey,widget:()=>this.widget}),this.frame=new Et({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 A)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=``,Be(this);try{await e()}catch(e){this.actionError=l(e),t&&ee({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=qe[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`&&pe(`mcp-app-view`,Ot).catch(()=>void 0);let n=e.grantState===`pending`?Re({widget:e,disabled:this.busy||this.actionPending||!this.canGrant,onGrant:n=>this.runGrantDecision(e,t,n),...this.actionError?{error:T(this.actionError,!0)}:{}}):e.grantState===`rejected`?Qe({widget:e,disabled:this.busy||this.actionPending||!this.canMutate,onRemove:()=>void this.runAction(()=>t.remove(e))}):g;if(e.contentKind===`mcp-app`)return lt({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!==g)return n;if(e.contentKind===`plugin`&&e.frameUrl)return this.frame.render(e);if(e.contentKind===`plugin`){let n=O(e.pluginKind),r=this.context?.gateway.snapshot.hello?.controlUiWidgetKinds??[],i=k(e.pluginKind,r);if(i){let t=this.coreWidgetLoader.visibleState;if(t?.element===i&&t.status===`error`)return me({error:t.error,stale:t.stale,subtitle:i.label,onRetry:()=>this.coreWidgetLoader.retry()});if(!fe(i))return h`<p class="board-widget__plugin-loading">
            ${d(`board.widget.pluginLoading`)}
          </p>`;let n=we(i.tagName);return ve`<${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 se(`widgets`,o,{...this.session,widget:{name:e.name,props:e.props},canMutate:this.canMutate,canGrant:this.canGrant},g,this.active);if(this.context&&this.context.gateway.snapshot.phase!==`connected`||a?.isLoading(n))return h`<p class="board-widget__plugin-loading">${d(`board.widget.pluginLoading`)}</p>`;let c=$e(this.context,n);if(!c&&s&&a){let e=a.errors.find(e=>e.pluginId===n||e.pluginId===`host`);if(e)return E(e.message,()=>void a.refresh())}return He({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?k(e.pluginKind,t):null;for(let e of A)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 g;let r,i;try{r=this.frame.error?E(this.frame.error):this.renderBody(e,n),i=!!this.frame.error}catch(e){r=E(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:Ie(e,this.contentHeightPx,w(),this.fitAutoContent?240:void 0),u=l===void 0?``:` height: calc(${l}px - var(--board-widget-height-trim, 0px)); align-self: start;`;return h`
      <section
        class=${`board-widget ${this.pageChrome?`board-widget--page-chrome`:``} ${this.dragging?`board-widget--dragging`:``} ${c?`board-widget--${c}`:``}`}
        style=${`${Te(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?g:h`<header class="board-widget__bar">
                ${o?g:h`<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||k(e.pluginKind,this.context?.gateway.snapshot.hello?.controlUiWidgetKinds??[])?.label||d(`board.widget.kindPlugin`):d(`board.widget.kindHtml`)}</span
                >
                ${Ue(e)}
                ${o?g: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`?h`<div class="board-widget__error-overlay">
                  ${T(this.actionError)}
                </div>`:g}
        </div>
        ${o||this.pageChrome?g:h`<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?h`<span class="board-widget__grant-dot" aria-hidden="true"></span>`:g}
      </section>
    `}},o([c({context:he,subscribe:!0})],Y.prototype,`context`,void 0),o([b({attribute:!1})],Y.prototype,`widget`,void 0),o([b({attribute:!1})],Y.prototype,`rect`,void 0),o([b({attribute:!1})],Y.prototype,`contentHeightPx`,void 0),o([b({type:Boolean})],Y.prototype,`fitAutoContent`,void 0),o([b({type:Boolean})],Y.prototype,`pageChrome`,void 0),o([b({attribute:!1})],Y.prototype,`tabs`,void 0),o([b({attribute:!1})],Y.prototype,`session`,void 0),o([b({attribute:!1})],Y.prototype,`sessionKey`,void 0),o([b({attribute:!1})],Y.prototype,`widgetFrameUrl`,void 0),o([b({attribute:!1})],Y.prototype,`callbacks`,void 0),o([b({type:Boolean})],Y.prototype,`active`,void 0),o([b({type:Boolean})],Y.prototype,`bridgeEnabled`,void 0),o([b({type:Boolean})],Y.prototype,`dragging`,void 0),o([b({type:Number})],Y.prototype,`focusTabIndex`,void 0),o([b({type:Number})],Y.prototype,`positionInSet`,void 0),o([b({type:Number})],Y.prototype,`setSize`,void 0),o([b({type:Boolean})],Y.prototype,`busy`,void 0),o([b({type:Boolean})],Y.prototype,`canMutate`,void 0),o([b({type:Boolean})],Y.prototype,`canGrant`,void 0),o([v()],Y.prototype,`actionError`,void 0),o([v()],Y.prototype,`actionPending`,void 0),customElements.get(`openclaw-board-widget-cell`)||customElements.define(`openclaw-board-widget-cell`,Y)})))()}function Z(e,t){return e.widgets.filter(e=>e.tabId===t).toSorted((e,t)=>e.position-t.position||e.name.localeCompare(t.name))}var Q;function $(){return($=e((()=>{_(),y(),xe(),Se(),m(),S(),ie(),Ze(),D(),P(),X(),Q=class extends p{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(De):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:async(e,t)=>this.applyOps([{kind:`widget_move`,name:e.name,tabId:t,position:this.nextPosition(t)}],d(`board.announcement.moved`,{title:e.title||e.name})),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`?C(e,this.contentHeights.get(e.name),e.name===this.pageWidgetName?0:w()):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(N(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=Ne(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=Ee(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.applyOps([{kind:`widget_move`,name:t.name,...r?{tabId:r}:{},position:e}],d(`board.announcement.moved`,{title:i.title||i.name})).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?N(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}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?N(r.tabs):[],a=this.activeTab(i);if(!r||!a)return;n.preventDefault(),n.stopPropagation();try{n.currentTarget?.setPointerCapture?.(n.pointerId)}catch{}let o=x(Z(r,a.tabId),this.contentHeights);this.gesture={dropValid:!1,mode:e,name:t.name,originClientX:n.clientX,originClientY:n.clientY,originW:t.sizeW,originH:C(t,this.contentHeights.get(t.name),w()),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=x(Z(n,e.tabId),this.contentHeights),i=ke(r,e.name,t).find(t=>t.name===e.name);i&&i.order!==e.position&&await this.applyOps([{kind:`widget_move`,name:e.name,position:i.order}],d(`board.announcement.moved`,{title:e.title||e.name}))}focusWidget(e,t){let n=this.snapshot;if(!n)return;let r=Z(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)??x(n,this.contentHeights,this.fitAutoContent,this.pageWidgetName);return je(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 h`
      <div
        class="board-grid"
        role="list"
        aria-label=${d(`board.gridLabel`)}
        ?hidden=${o.length===0}
      >
        ${ye(s,e=>JSON.stringify([this.session.agentId,this.session.sessionKey,n,e.name]),e=>{let r=u.get(e.name);return r?h`
              <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>
            `:g})}
        ${this.gesture?.mode===`move`?h`<div class="board-grid__append-zone" aria-hidden="true"></div>`:g}
      </div>
      ${o.length===0?h`
              <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>
            `:g}
    `}render(){let e=this.snapshot;if(!e)return g;let t=N(e.tabs),n=this.activeTab(t),r=n?.tabId??this.activeTabId,i=n?Z(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 h`
      <section
        class=${`board-view ${o?`board-view--single-full-width`:``} ${s?`board-view--page`:``}`}
        aria-label=${d(`board.label`)}
      >
        ${ct({tabs:t,activeTabId:r,hoverTabId:this.hoverTabId,onTabShow:this.handleTabShow,onOverflowSelect:this.handleOverflowSelect})}
        ${this.renderGrid(a,t,e.sessionKey,r)}
        ${this.actionError?h`<div class="board-view__error" role="alert">${this.actionError}</div>`:g}
        <div class="board-announcer" aria-live="polite" aria-atomic="true">
          ${this.announcement?be(this.announcementRevision,h`<span data-announcement-revision=${this.announcementRevision}
                    >${this.announcement}</span
                  >`):g}
        </div>
      </section>
    `}},o([b({attribute:!1})],Q.prototype,`session`,void 0),o([b({attribute:!1})],Q.prototype,`snapshot`,void 0),o([b({attribute:!1})],Q.prototype,`activeTabId`,void 0),o([b({attribute:!1})],Q.prototype,`widgetFrameUrl`,void 0),o([b({attribute:!1})],Q.prototype,`callbacks`,void 0),o([b({type:Boolean})],Q.prototype,`active`,void 0),o([b({type:Boolean})],Q.prototype,`bridgeEnabled`,void 0),o([b({type:Boolean})],Q.prototype,`canMutate`,void 0),o([b({type:Boolean})],Q.prototype,`canGrant`,void 0),o([b({type:Boolean})],Q.prototype,`fitAutoContent`,void 0),o([b({attribute:!1})],Q.prototype,`pageWidgetName`,void 0),o([v()],Q.prototype,`previewItems`,void 0),o([v()],Q.prototype,`gestureName`,void 0),o([v()],Q.prototype,`hoverTabId`,void 0),o([v()],Q.prototype,`announcement`,void 0),o([v()],Q.prototype,`announcementRevision`,void 0),o([v()],Q.prototype,`actionError`,void 0),o([v()],Q.prototype,`focusName`,void 0),o([v()],Q.prototype,`mutationPending`,void 0),customElements.get(`openclaw-board-view`)||customElements.define(`openclaw-board-view`,Q)})))()}export{ot as a,j as i,X as n,M as r,$ as t};