UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

2 lines • 7.87 kB
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./native-session-menu.runtime-Bhg9YfRh.js"])))=>i.map(i=>d[i]); import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{$l as t,Fc as n,Fl as r,Hs as i,Nc as a,Pu as o,Rs as s,Wc as c,Xc as l,Yl as u,_u as d,ac as ee,jc as f,kl as p,nc as m,vu as h,wl as g,zu as te}from"./control-ui-core-CBJ5efDh.js";import{No as ne,Xa as re,go as _,qa as v}from"./control-ui-core-DtLivg_r.js";import{ea as y,ma as b,mt as ie,pa as ae,wa as x}from"./ui-CmSP4d14.js";import{C as S,M as C,_ as w,b as T,f as E,k as D,p as O,w as k}from"./config-runtime-BecGLziM.js";function A(e){let n=window,o=n.__OPENCLAW_NATIVE_CONVERSATION__,c=n.webkit?.messageHandlers?.openclawConversation;if(re()?.surface!==`conversation`||!x(o)||o.contract!==1||typeof c?.postMessage!=`function`)return null;let d={contract:1,documentId:crypto.randomUUID()},p=[`session-facts-v1`,`session-actions-v1`].filter(e=>Array.isArray(o.features)&&o.features.includes(e));n.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__=d;let m=c.postMessage,_=m.bind(c),v=!1,b={visible:!0,active:!0},S,C,w=``,T=0,E=0,D=``,O=!1,k=Promise.resolve(),A=Promise.resolve(`accepted`),N=Promise.resolve(`rejected`),z=!1,V=new Set,H=new Set,U=new Set,W=()=>!v&&n.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__===d&&n.webkit?.messageHandlers?.openclawConversation===c&&c.postMessage===m,G=(e,t,n=Date.now()+M)=>new Promise(r=>{let i=!1,a=new AbortController,o=e=>{i||(i=!0,clearTimeout(c),U.delete(s),a.abort(),r(e))},s=()=>o(t),c=setTimeout(s,Math.max(0,n-Date.now()));U.add(s),e(()=>!i&&W()&&Date.now()<n,a.signal).then(o,s)}),K=async e=>{if(!W())return`rejected`;try{let t=await _(e);return W()&&x(t)&&t.ok===!0?`accepted`:`rejected`}catch{return`rejected`}},q=(e,t,n=W)=>{let r=A;return A=G(async t=>(await r,t()&&n()?K(e):`timeout`),`timeout`,t),A},J=(t,n)=>{if(!S||!W())return Promise.resolve(`rejected`);let{phase:r,lastErrorAuthReason:i}=e.gateway.snapshot,a=r===`connected`?`connected`:i?`signed-out`:r===`connecting`||r===`starting`||r===`reconnecting`?`connecting`:`offline`,o={...S,connection:a},s=JSON.stringify(o);if(s!==w||n&&z){w=s,z=!1;let e=q({...d,type:`state`,revision:++T,...o},t,n);N=e,e.then(t=>{N===e&&(z=t!==`accepted`)})}return N},Y=e=>{if(!W()||!p.includes(`session-facts-v1`))return;let t=B.safeParse(e?.filter(e=>e.agentId)),n={...d,type:`session-facts`,revision:E+1,sessions:t.success?t.data:null};new TextEncoder().encode(JSON.stringify(n)).length>65536&&(n.sessions=null);let r=JSON.stringify(n.sessions);r!==D&&(D=r,E++,q(n))},X=()=>{let n=e.router.getState().matches[0],i=n?.routeId===`chat`?n.data:void 0;if(n?.status===`success`&&i?.kind===`session`){let n=i.sessionKey,a={agentsList:e.agents.state.agentsList,hello:e.gateway.snapshot.hello,assistantAgentId:i.agentId??e.gateway.snapshot.assistantAgentId},o=u(a,n);if(!o)return;let s=e.sessions.presentation,c=s.result?.sessions.find(e=>t(a,n,e.key,e.agentId??(r(e.key)?s.agentId:void 0),o)),l=[...document.querySelectorAll(`openclaw-chat-page openclaw-chat-pane`)].find(e=>g(e.sessionKey,n))?.runActivity,d=l?.client===e.gateway.snapshot.client&&l?.agentId===o&&l.working;S={context:{agentId:o,sessionKey:n},title:ee(n,c),run:{active:d||(c?ie(c):!1)}}}if(!O&&S){let e=S.context;C&&(C.agentId!==e.agentId||C.sessionKey!==e.sessionKey)&&q({...d,type:`route-changed`,...e,reason:`other`}),C=e,J()}},Z=t=>{let n=ne(t.pathname,e.basePath);return!n||n===`chat`?!1:(q({...d,type:`open-dashboard`,path:t.pathname,...t.search?{search:t.search}:{}}).then(e=>{e!==`accepted`&&W()&&h({message:te(`nativeConversation.openDashboardFailed`)})}),!0)},oe=async(n,r,i,a)=>{let o=P.safeParse(n);if(!o.success)return x(n)&&n.contract!==1?`unsupported`:`invalid-command`;let s=o.data;if(s.documentId!==d.documentId||!W())return`stale-document`;switch(s.type){case`navigate`:case`open-session-actions`:{let n=s.type===`open-session-actions`;if(n&&!p.includes(`session-actions-v1`))return`unsupported`;if(n&&(!b.visible||!b.active))return`unavailable`;let o=I.safeParse(s.payload);if(!o.success)return`invalid-command`;let c=l({context:e,face:`chat`,exactKey:!0,...o.data}).options;O=!0;try{await e.navigateAndWait(`chat`,c)}catch{return`navigate-rejected`}if(!r())return`navigate-timeout`;X();let u=()=>{let n=e.router.getState();return n.pendingMatches.length===0&&n.matches[0]?.routeId===`chat`&&n.matches[0]?.status===`success`&&x(n.matches[0]?.data)&&n.matches[0].data.kind===`session`&&S!==void 0&&t({agentsList:e.agents.state.agentsList,hello:e.gateway.snapshot.hello},S.context.sessionKey,o.data.sessionKey,o.data.agentId,S.context.agentId)};if(!u())return`navigate-rejected`;C=S?.context;let d=await J(i,r);if(!r()||d===`timeout`)return`navigate-timeout`;if(d!==`accepted`||!u())return`navigate-rejected`;if(n){let e=document.querySelector(`openclaw-chat-page`);await e?.updateComplete;let t=e?.querySelector(`.chat-pane-cache__pane--active`);if(await t?.updateComplete,!r()||!u()||!t)return`unavailable`;let{openNativeSessionMenu:n}=await ae(async()=>{let{openNativeSessionMenu:e}=await import(`./native-session-menu.runtime-Bhg9YfRh.js`);return{openNativeSessionMenu:e}},__vite__mapDeps([0]),import.meta.url);return await n({pane:t,signal:a,isCurrent:()=>r()&&u()})?void 0:`unavailable`}return}case`presentation`:{let e=L.safeParse(s.payload);if(!e.success)return`invalid-command`;b=e.data,H.forEach(e=>e());return}case`focus-composer`:{if(!R.safeParse(s.payload).success)return`invalid-command`;let e=document.querySelector(`openclaw-chat-pane.chat-pane-cache__pane--active .agent-chat__composer-combobox textarea`);if(!b.visible||!b.active||!e||e.disabled)return`unavailable`;e.focus({preventScroll:!0});return}default:return`unsupported`}},Q=e=>{let t=e instanceof CustomEvent?e.detail:null,n=F.safeParse(t);if(!n.success)return;let{documentId:r,requestId:i}=n.data,a=JSON.stringify([r,i]);if(V.has(a))return;V.add(a);let o=Date.now()+M,s=k;k=G(async(e,n)=>{if(await s,!e())return`navigate-timeout`;try{return await oe(t,e,o,n)}catch{return`command-failed`}},`navigate-timeout`,o).then(e=>{W()&&(G(()=>K({...d,type:`command-result`,documentId:r,requestId:i,ok:e===void 0,...e?{error:e}:{}}),`timeout`),O=!1,X())})},$=t=>{if(!i(t))return;let n=s(t);if(!n?.hasAttribute(`href`)||n.hasAttribute(`download`)||n.hasAttribute(`data-file-path`)||n.target&&n.target!==`_self`)return;let r=new URL(n.href,window.location.href);r.origin!==window.location.origin||e.basePath&&!r.pathname.startsWith(`${e.basePath}/`)||Z(r)&&t.preventDefault()};window.addEventListener(j,Q),document.addEventListener(`click`,$),q({...d,type:`ready`,surface:`conversation`,capabilities:[`navigate`,`presentation`,`focus-composer`,...p]}),document.addEventListener(a,X),document.addEventListener(f,X);let se=[`gateway`,`router`,`sessions`].map(t=>e[t].subscribe(X));return X(),{supportsSessionActions:p.includes(`session-actions-v1`),get presentation(){return b},subscribe:e=>y(H,e),interceptNavigation:Z,publishSessionFacts:Y,dispose(){v=!0,U.forEach(e=>e()),document.removeEventListener(a,X),document.removeEventListener(f,X),se.forEach(e=>e()),H.clear(),window.removeEventListener(j,Q),document.removeEventListener(`click`,$),n.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__===d&&delete n.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__}}}var j,M,N,P,F,I,L,R,z,B;function V(){return(V=e((()=>{w(),_(),o(),m(),c(),p(),d(),n(),v(),b(),j=`openclaw:native-conversation-command`,M=15e3,N=D().min(1).refine(e=>e.trim()===e),P=k({contract:T(1),documentId:N,requestId:N,type:D(),payload:C()}),F=P.pick({documentId:!0,requestId:!0}),I=k({agentId:N,sessionKey:N}).strict(),L=k({visible:O(),active:O()}).strict(),R=k({}).strict(),z=N.refine(e=>new TextEncoder().encode(e).length<=4096),B=E(k({agentId:z,sessionKey:z,hasComposerDraft:O(),outboxAttentionCount:S().int().nonnegative().safe()}).strict()).max(64)})))()}V();export{A as createNativeConversationBridge};