openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
1 lines • 6.33 kB
JavaScript
import{n as e}from"./rolldown-runtime-8BhlS34s.js";import{Ji as t,et as n}from"./control-ui-foundation-ZY_Flbbd.js";import{Ns as r,Tl as i,Ul as a,Wl as o,Zc as s,bs as c,gs as l,hc as u,hu as d,ic as f,ks as p,nc as m,nl as h,oc as g,sl as _,uu as v,xc as y,xl as b}from"./control-ui-core-3P365fbR.js";import{Ha as x,To as S,co as C,za as w}from"./control-ui-core-CFW9Qtjn.js";import{C as T,O as E,g as D,j as O,p as k,y as A}from"./config-runtime-CgOgfOrG.js";function j(e){let a=window,u=a.__OPENCLAW_NATIVE_CONVERSATION__,p=a.webkit?.messageHandlers?.openclawConversation;if(x()?.surface!==`conversation`||!t(u)||u.contract!==1||typeof p?.postMessage!=`function`)return null;let h={contract:1,documentId:crypto.randomUUID()};a.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__=h;let g=p.postMessage,v=g.bind(p),C=!1,w={visible:!0,active:!0},T,E,D=``,O=0,k=!1,A=Promise.resolve(),j=Promise.resolve(`accepted`),P=Promise.resolve(`rejected`),B=!1,V=new Set,H=new Set,U=new Set,W=()=>!C&&a.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__===h&&a.webkit?.messageHandlers?.openclawConversation===p&&p.postMessage===g,G=(e,t,n=Date.now()+N)=>new Promise(r=>{let i=!1,a=e=>{i||(i=!0,clearTimeout(s),U.delete(o),r(e))},o=()=>a(t),s=setTimeout(o,Math.max(0,n-Date.now()));U.add(o),e(()=>!i&&W()&&Date.now()<n).then(a,o)}),K=async e=>{if(!W())return`rejected`;try{let n=await v(e);return W()&&t(n)&&n.ok===!0?`accepted`:`rejected`}catch{return`rejected`}},q=(e,t,n=W)=>{let r=j;return j=G(async t=>(await r,t()&&n()?K(e):`timeout`),`timeout`,t),j},J=(t,n)=>{if(!T||!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={...T,connection:a},s=JSON.stringify(o);if(s!==D||n&&B){D=s,B=!1;let e=q({...h,type:`state`,revision:++O,...o},t,n);P=e,e.then(t=>{P===e&&(B=t!==`accepted`)})}return P},Y=()=>{let t=e.router.getState().matches[0],a=t?.routeId===`chat`?t.data:void 0;if(t?.status===`success`&&a?.kind===`session`){let t=a.sessionKey,o={agentsList:e.agents.state.agentsList,hello:e.gateway.snapshot.hello,assistantAgentId:a.agentId??e.gateway.snapshot.assistantAgentId},c=b(o,t);if(!c)return;let l=e.sessions.presentation,u=l.result?.sessions.find(e=>i(o,t,e.key,e.agentId??(_(e.key)?l.agentId:void 0),c)),d=[...document.querySelectorAll(`openclaw-chat-page openclaw-chat-pane`)].find(e=>s(e.sessionKey,t))?.runActivity,f=d?.client===e.gateway.snapshot.client&&d?.agentId===c&&d.working;T={context:{agentId:c,sessionKey:t},title:r(t,u),run:{active:f||(u?n(u):!1)}}}if(!k&&T){let e=T.context;E&&(E.agentId!==e.agentId||E.sessionKey!==e.sessionKey)&&q({...h,type:`route-changed`,...e,reason:`other`}),E=e,J()}},X=t=>{let n=S(t.pathname,e.basePath);return!n||n===`chat`?!1:(q({...h,type:`open-dashboard`,path:t.pathname,...t.search?{search:t.search}:{}}).then(e=>{e!==`accepted`&&W()&&o({message:d(`nativeConversation.openDashboardFailed`)})}),!0)},Z=async(n,r,a)=>{let o=F.safeParse(n);if(!o.success)return t(n)&&n.contract!==1?`unsupported`:`invalid-command`;let s=o.data;if(s.documentId!==h.documentId||!W())return`stale-document`;switch(s.type){case`navigate`:{let n=L.safeParse(s.payload);if(!n.success)return`invalid-command`;let o=y({context:e,face:`chat`,exactKey:!0,...n.data}).options;k=!0;try{await e.navigateAndWait(`chat`,o)}catch{return`navigate-rejected`}if(!r())return`navigate-timeout`;Y();let c=()=>{let r=e.router.getState();return r.pendingMatches.length===0&&r.matches[0]?.routeId===`chat`&&r.matches[0]?.status===`success`&&t(r.matches[0]?.data)&&r.matches[0].data.kind===`session`&&T&&i({agentsList:e.agents.state.agentsList,hello:e.gateway.snapshot.hello},T.context.sessionKey,n.data.sessionKey,n.data.agentId,T.context.agentId)};if(!c())return`navigate-rejected`;E=T?.context;let l=await J(a,r);return!r()||l===`timeout`?`navigate-timeout`:l===`accepted`&&c()?void 0:`navigate-rejected`}case`presentation`:{let e=R.safeParse(s.payload);if(!e.success)return`invalid-command`;w=e.data,H.forEach(e=>e());return}case`focus-composer`:{if(!z.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(!w.visible||!w.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=I.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()+N,s=A;A=G(async e=>{if(await s,!e())return`navigate-timeout`;try{return await Z(t,e,o)}catch{return`command-failed`}},`navigate-timeout`,o).then(e=>{W()&&(G(()=>K({...h,type:`command-result`,documentId:r,requestId:i,ok:e===void 0,...e?{error:e}:{}}),`timeout`),k=!1,Y())})},$=t=>{if(!c(t))return;let n=l(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}/`)||X(r)&&t.preventDefault()};window.addEventListener(M,Q),document.addEventListener(`click`,$),q({...h,type:`ready`,surface:`conversation`,capabilities:[`navigate`,`presentation`,`focus-composer`]}),document.addEventListener(f,Y),document.addEventListener(m,Y);let ee=e.gateway.subscribe(Y),te=e.router.subscribe(Y),ne=e.sessions.subscribe(Y);return Y(),{get presentation(){return w},subscribe(e){return H.add(e),()=>H.delete(e)},interceptNavigation:X,dispose(){C=!0,U.forEach(e=>e()),document.removeEventListener(f,Y),document.removeEventListener(m,Y),ee(),te(),ne(),H.clear(),window.removeEventListener(M,Q),document.removeEventListener(`click`,$),a.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__===h&&delete a.__OPENCLAW_NATIVE_CONVERSATION_DOCUMENT__}}}var M,N,P,F,I,L,R,z;function B(){return(B=e((()=>{D(),C(),v(),p(),u(),h(),a(),g(),w(),M=`openclaw:native-conversation-command`,N=15e3,P=E().min(1).refine(e=>e.trim()===e),F=T({contract:A(1),documentId:P,requestId:P,type:E(),payload:O()}),I=F.pick({documentId:!0,requestId:!0}),L=T({agentId:P,sessionKey:P}).strict(),R=T({visible:k(),active:k()}).strict(),z=T({}).strict()})))()}B();export{j as createNativeConversationBridge};