UNPKG

openclaw

Version:

Multi-channel AI gateway with extensible messaging integrations

191 lines 29.5 kB
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./channel-avatar-Q3fUqgJ5.js","./rolldown-runtime-DkW27tQK.js","./control-ui-foundation-Cydpkyqa.js","./control-ui-core-Rwzhj6nO.js","./lit-runtime-CV_MH99K.js","./control-ui-core-YphAl4aM.js","./control-ui-core-vvcQQV2m.js","./gateway-runtime-Bqqcp9-I.js","./control-ui-core-ClxHIvNM.css","./control-ui-boot-chat-_QSl8fbH.js","./control-ui-boot-shared-BYq7Cchl.js","./control-ui-boot-shared-Deak_Sjt.js","./control-ui-boot-shared-gfE6fZcA.js","./markdown-runtime-Bn6OdBVq.js","./control-ui-boot-shared-DfZ39Yj9.js","./control-ui-boot-shared-CXVvK2AW.js","./control-ui-boot-shared-3juXI2I2.js","./control-ui-boot-shared-BVNXvWX-.js","./control-ui-boot-shared-KspYIvAF.css","./control-ui-boot-chat-Cgwe4GEM.js","./config-runtime-D-5ybyEi.js"])))=>i.map(i=>d[i]); import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ii as t,Jn as n,Kn as r,Mi as i,bn as a,ii as o,na as s,ri as c,wi as l}from"./control-ui-foundation-Cydpkyqa.js";import{As as u,Ls as d,Ts as f,Vs as p,ws as m}from"./control-ui-core-Rwzhj6nO.js";import{J as h,K as g,X as _,q as v,ut as y}from"./lit-runtime-CV_MH99K.js";import{B as ee,Nt as te,Pt as ne,V as re,an as ie,in as ae}from"./control-ui-core-YphAl4aM.js";import{Gt as oe,Ht as se,Qt as b,Wt as x,Yt as S,en as C}from"./control-ui-core-vvcQQV2m.js";import{Bi as w,Hi as ce,Ii as le,Ri as ue,Ui as de,Vi as T,Wi as E,_r as fe,gr as pe,hr as D,vr as O,zi as me}from"./control-ui-boot-shared-DfZ39Yj9.js";import{ct as he,d as ge,f as k,l as _e,lt as ve,p as ye,u as be}from"./control-ui-boot-chat-_QSl8fbH.js";import{ns as xe,rs as A,ts as j}from"./control-ui-boot-shared-CXVvK2AW.js";import{v as M,y as Se}from"./control-ui-boot-chat-CMe3QBDk.js";import{n as Ce,r as we,t as Te}from"./portaled-hovercard-CdHol2CK.js";function N(e){return e.label?.trim()||e.identity.id}function Ee(e,t,n){return e.identity.type===`profile`&&e.identity.id===n||JSON.stringify(e.identity)===JSON.stringify(t?.identity)}function De(){Ve??=c(()=>import(`./channel-avatar-Q3fUqgJ5.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]),import.meta.url)}function Oe(e){return C(`sessionHovercard.states.${e}`)}function ke(e){switch(e.state){case`passing`:return C(`sessionHovercard.checks.passing`);case`failing`:return C(`sessionHovercard.checks.failing`);case`pending`:return C(`sessionHovercard.checks.pending`);default:return e.state}}function Ae(e){switch(e){case`open`:return x.gitPullRequest;case`draft`:return x.gitPullRequestDraft;case`merged`:return x.gitMerge;case`closed`:return x.gitPullRequestClosed;default:return e}}function P(e){return e.additions===void 0&&e.deletions===void 0?v:_`<span class="session-hovercard__diff"> ${e.additions===void 0?v:_`<span class="session-hovercard__additions" >+${e.additions.toLocaleString()}</span >`} ${e.deletions===void 0?v:_`<span class="session-hovercard__deletions" >−${e.deletions.toLocaleString()}</span >`} </span>`}function je(e){let t=Math.abs(e)/864e5;return t>=365?{value:Math.max(1,Math.round(t/365)),unit:`year`}:t>=28?{value:Math.max(1,Math.round(t/30)),unit:`month`}:t>=7?{value:Math.max(1,Math.round(t/7)),unit:`week`}:t>=1?{value:Math.max(1,Math.round(t)),unit:`day`}:n(Math.abs(e))}function F(e,t){if(typeof e!=`number`||!Number.isFinite(e))return``;let n=e-Date.now(),{value:r,unit:i}=je(n);if(t)return i===`second`&&n<=0?C(`common.justNow`):new Intl.RelativeTimeFormat(b.getLocale(),{numeric:`always`,style:`narrow`}).format(n<=0?-r:r,i);if(b.getLocale().toLowerCase().startsWith(`en`)){let e={second:`s`,minute:`m`,hour:`h`,day:`d`,week:`w`,month:`mo`,year:`y`}[i];if(e)return`${r}${e}`}return new Intl.NumberFormat(b.getLocale(),{style:`unit`,unit:i,unitDisplay:`short`,maximumFractionDigits:0}).format(r)}function I(e,t){let n=e.createdActor,r=n?.label?.trim()||n?.id?.trim(),i=new Set,a=0,o=(e.expandedParticipants??e.participants??[]).filter(e=>{let r=JSON.stringify(e.identity);return!i.has(r)&&(i.add(r),!Ee(e,n,t)||(a+=1,!1))}),s=Math.max(o.length,(e.participantCount??0)-a);if(n&&r)return{creator:n,primaryIdentity:n.identity,primaryLabel:r,participants:o,otherCount:s};let c=o[0];if(c)return{primaryIdentity:c.identity,primaryLabel:N(c),participants:o,otherCount:Math.max(0,s-1)}}function Me(e,t,n){let r=Math.max(0,t-e.length);return _`<div slot="content" class="session-hovercard__participant-menu" role="list" style="min-width: 150px; max-height: min(280px, 60vh); overflow-y: auto;" aria-label=${C(`sessionHovercard.moreParticipantsLabel`,{count:String(t)})} > ${e.map(e=>{let t=N(e),r=e.identity.type===`profile`?T(e.identity.id,n,t):null;return _`<div role="listitem"> ${E(t,r,`session-menu__item learn-more-link session-hovercard__participant-link`)} </div>`})} ${r>0?_`<div class="session-hovercard__more" role="listitem"> ${C(`sessionHovercard.moreParticipantsLabel`,{count:String(r)})} </div>`:v} </div>`}function Ne({row:e,selfUserId:t,avatarAuth:n,personActivity:r}){if(!e)return v;let i=I(e,t);if(!i)return v;let{creator:a,primaryIdentity:o,primaryLabel:s,participants:c,otherCount:l}=i,u=a?void 0:c[0],d=o?.type===`profile`?T(o.id,r,s):null,f=a?ue(a):``,p=f?_`<span class="session-hovercard__creator-avatar-fallback" aria-hidden="true" >${f}</span >`:v;a&&e.channelAvatarUrl&&De();let m=a?e.channelAvatarUrl?_`<openclaw-channel-avatar class="session-hovercard__creator-avatar" .routeUrl=${e.channelAvatarUrl} .authTokens=${n?.authTokens??[]} .authReady=${n?.authReady??!1} .fallback=${p} aria-hidden="true" ></openclaw-channel-avatar>`:_`<openclaw-viewer-avatar class="session-hovercard__creator-avatar" .user=${{id:a.id,name:a.label,avatarUrl:a.avatarUrl,watchedSessions:[]}} .markAsViewer=${!1} .identity=${a.identity} variant="session" aria-hidden="true" ></openclaw-viewer-avatar>`:u?_`<openclaw-viewer-avatar class="session-hovercard__creator-avatar" .user=${{id:u.identity.id,name:u.label,avatarUrl:u.avatarUrl,watchedSessions:[]}} .markAsViewer=${!1} .identity=${u.identity} variant="session" aria-hidden="true" ></openclaw-viewer-avatar>`:v,h=a?c:c.slice(1),g=[s,l>0?C(`sessionHovercard.moreParticipantsLabel`,{count:String(l)}):``].filter(Boolean).join(`, `),y=l>0?C(l===1?`sessionHovercard.attributionOther`:`sessionHovercard.attributionOthers`,{count:String(l)}):``;return _`<div class="session-hovercard__attribution" aria-label=${g}> <span class="session-hovercard__attribution-copy"> ${E(s,d,`session-hovercard__attribution-name`)} ${l>0?h.length>0?_`<openclaw-tooltip class="session-hovercard__participants-tooltip" .describe=${!1} open-on-click > <button type="button" class="session-hovercard__attribution-others" style="padding: 1px 3px; border: 0; border-radius: var(--radius-sm); background: transparent; font: inherit;" aria-label=${C(`sessionHovercard.moreParticipantsLabel`,{count:String(l)})} > ${y} </button> ${Me(h,l,r)} </openclaw-tooltip>`:_`<span class="session-hovercard__attribution-others">${y}</span>`:v} </span> <span class="session-hovercard__attribution-avatars"> ${de(m,d)} ${h.length>0?_`<openclaw-viewer-facepile .staticParticipants=${h} .totalCount=${l} .maxVisible=${Math.min(h.length,L)} .personActivity=${r} ></openclaw-viewer-facepile>`:v} </span> </div>`}function Pe(e){let t=e.row,n=typeof t.createdAt==`number`&&Number.isFinite(t.createdAt),r=n?F(t.createdAt,!0):``,i=n?F(t.createdAt,!1):``;return _`<header class="session-hovercard__header"> <span class="session-hovercard__heading"> <span class="session-hovercard__title">${be(t.color)}${t.label}</span> ${Ne(e)} </span> ${i?_`<span class="session-hovercard__created-age" title=${r}>${i}</span>`:v} </header>`}function Fe(e,t,n){let r=k(e,t,n);if(!r)return v;let i=C(r.status===`in_progress`?`sessionProgressCard.status.inProgress`:r.status===`paused`?`sessionProgressCard.status.paused`:`sessionProgressCard.status.pending`);return _`<div class="session-hovercard__context-row session-hovercard__plan-row" aria-label=${C(`sessionProgressCard.stepLabel`,{status:i,step:r.step})} title=${r.step} > <span class="session-hovercard__context-icon" aria-hidden="true" >${r.status===`in_progress`?_`<span class="session-run-spinner"></span>`:x.clock}</span > <span class="session-hovercard__context-value session-hovercard__plan-step" >${r.step}</span > <span class="session-hovercard__plan-count">${r.completed}/${r.total}</span> </div>`}function Ie({row:e,progressCard:t}){let n=e?.workContext,r=e?.placementProviderId&&e.placementProfileId?{label:`${e.placementProviderId} · ${e.placementProfileId}`,title:C(`sessionHovercard.runsOn`,{providerId:e.placementProviderId,profileId:e.placementProfileId})}:void 0;return!n&&!r&&e?.boardFace!==`dashboard`&&e?.hasAutomation!==!0&&!k(t,e?.status,e?.startedAt)?v:_`<div class="session-hovercard__context"> ${n?_`<div class="session-hovercard__context-row" aria-label=${`${C(n.kind===`project`?`sessionHovercard.projectLabel`:`sessionHovercard.workspaceLabel`)}: ${n.name}`} title=${`${C(n.kind===`project`?`sessionHovercard.projectLabel`:`sessionHovercard.workspaceLabel`)}: ${n.path}`} > <span class="session-hovercard__context-icon" aria-hidden="true">${x.folder}</span> <span class="session-hovercard__context-value session-hovercard__context-text" title=${n.path} >${n.name}</span > </div>`:v} ${r?_`<div class="session-hovercard__context-row" aria-label=${r.title} title=${r.title} > <span class="session-hovercard__context-icon" aria-hidden="true">${x.server}</span> <span class="session-hovercard__context-value session-hovercard__context-text" >${r.label}</span > </div>`:v} ${e?.boardFace===`dashboard`?_`<div class="session-hovercard__context-row" aria-label=${C(`sessionsView.opensAsDashboard`)} > <span class="session-hovercard__context-icon" aria-hidden="true" >${x.layoutDashboard}</span > <span class="session-hovercard__context-value session-hovercard__context-text" >${C(`sessionsView.opensAsDashboard`)}</span > </div>`:v} ${e?.hasAutomation===!0?_`<div class="session-hovercard__context-row" aria-label=${C(`sessionsView.automationAttached`)} > <span class="session-hovercard__context-icon" aria-hidden="true">${x.clock}</span> <span class="session-hovercard__context-value session-hovercard__context-text" >${C(`sessionsView.automationAttached`)}</span > </div>`:v} ${Fe(t,e?.status,e?.startedAt)} </div>`}function Le(e){return e?.markdown?.trim()?_`<section class="session-hovercard__section session-hovercard__notepad" aria-label=${C(`sessionHovercard.agentNotepad`)} > <div class="session-hovercard__notepad-title">${C(`sessionHovercard.agentNotepad`)}</div> ${ye(e.markdown,{promoteProgress:!0})} </section>`:v}function Re(e){let t=Oe(e.state),n=e.checks?ke(e.checks):null,r=[e.title,n,e.additions===void 0?null:`+${e.additions.toLocaleString()}`,e.deletions===void 0?null:`−${e.deletions.toLocaleString()}`].filter(e=>!!e);return _`<a class="session-hovercard__pr-row" data-state=${e.state} href=${e.url} target="_blank" rel="noopener noreferrer" aria-label=${`${C(`sessionHovercard.pullRequestLabel`,{number:String(e.number),state:t})}${r.length>0?`, ${r.join(`, `)}`:``}`} > <span class="session-hovercard__pr-state-icon" role="img" data-checks=${e.checks?.state??v} aria-label=${n?`${t} · ${n}`:t} title=${n?`${t} · ${n}`:t} >${Ae(e.state)}</span > <span class="session-hovercard__pr-title">${e.title}</span> ${P(e)} </a>`}function ze(e){if(!e)return v;if(e.pullRequests.length>0){let t=e.pullRequests.slice(0,1),n=e.pullRequests.length-t.length;return _`<div class="session-hovercard__pr-list"> ${t.map(Re)} ${n>0?_`<span class="session-hovercard__more" >${C(`sessionHovercard.more`,{count:String(n)})}</span >`:v} </div>`}let t=e.branch;if(!t)return v;let n=C(`chat.pullRequests.createPr`),r=C(`chat.pullRequests.createPrLabel`,{branch:t.branch});return _`<div class="session-hovercard__branch-row"> <span class="session-hovercard__branch-icon" aria-hidden="true">${x.gitBranch}</span> ${t.createUrl?_`<a class="session-hovercard__branch-action" href=${t.createUrl} target="_blank" rel="noopener noreferrer" aria-label=${r} title=${r} >${n}</a >`:_`<span class="session-hovercard__branch-label">${C(`chat.sessionDiff.title`)}</span>`} ${P(t)} </div>`}function Be(e){let t=!!(e.pullRequests&&(e.pullRequests.pullRequests.length>0||e.pullRequests.branch)),n=!!(e.row?.workContext||e.row?.placementProviderId&&e.row.placementProfileId||e.row?.boardFace===`dashboard`||e.row?.hasAutomation===!0||k(e.progressCard,e.row?.status,e.row?.startedAt)),r=e.progressCard?void 0:e.row?.lastMessagePreview?.trim()||void 0;return!e.row&&!t&&!e.progressCard?v:_`<div class="session-hovercard"> ${e.row?_`<section class="session-hovercard__section session-hovercard__section--header"> ${Pe(e)} </section>`:v} ${n?_`<section class="session-hovercard__section session-hovercard__section--metadata"> ${Ie(e)} </section>`:v} ${t?_`<section class="session-hovercard__section session-hovercard__section--prs"> ${ze(e.pullRequests)} </section>`:v} ${r?_`<section class="session-hovercard__section session-hovercard__section--optional"> <div class="session-hovercard__excerpt">${r}</div> </section>`:v} ${Le(e.progressCard)} </div>`}var L,Ve;function R(){return(R=e((()=>{a(),g(),S(),oe(),w(),_e(),le(),ge(),se(),me(),o(),L=4})))()}function He(e){if(!r(e)||e.status!==`ok`)throw Error(`Session title unavailable`);let t=s(e.sessionKey),n=s(e.agentId);if(!t||!n)throw Error(`Session title response was incomplete`);return{sessionKey:t,agentId:n,namespace:`chat`,title:s(e.title)??s(e.derivedTitle)}}function Ue(e,t){return{...t,sessionKey:e.key,agentId:e.agentId??d(e.key)?.agentId??t.agentId,title:e.displayName??e.derivedTitle}}var z,B,V,H,U;function W(){return(W=e((()=>{l(),ae(),te(),u(),M(),z=`a.markdown-session-link`,B=3e5,V=3e4,H=100,U=class{constructor(e){this.host=e,this.client=null,this.context=null,this.cache=new Map,this.observer=new MutationObserver(e=>{for(let t of e)for(let e of t.addedNodes)if(e instanceof Element){e instanceof HTMLAnchorElement&&e.matches(z)&&this.decorate(e);for(let t of e.querySelectorAll(z))this.decorate(t)}})}connect(){this.observer.observe(this.host,{childList:!0,subtree:!0}),this.refresh()}refresh(){for(let e of this.host.querySelectorAll(z))this.decorate(e)}disconnect(){this.observer.disconnect()}async decorate(e,t=!1){let n=this.targetForAnchor(e);if(!n)return;let r=this.cachedOrSeededEntry(n);if(this.stampAnchor(e,n,r?.value),!(!t||r?.value))try{this.stampAnchor(e,n,await this.loadTitle(n))}catch{}}mainKey(){let e=this.context;return e?p({agentsList:e.agents.state.agentsList,hello:e.gateway.snapshot.hello}):`main`}resolveShortTarget(e){let n=this.context?.sessions.state.result?.sessions??[];for(let r of n){let n=d(r.key),a=Se(r.key);if(n&&t(n.agentId)===t(e.agentId)&&a?.startsWith(e.shortId.toLowerCase().replaceAll(`-`,``))&&(!e.slugHint||i(r.displayName)===e.slugHint))return r.key}return null}targetForAnchor(e){let t=e.dataset.sessionKey?.trim();if(t){let e=d(t);return e?{sessionKey:t,agentId:e.agentId,namespace:`chat`}:null}let n;try{n=new URL(e.href,globalThis.location?.href??`http://localhost/`)}catch{return null}if(n.origin!==globalThis.location?.origin)return null;let r=ne(n.pathname,this.context?.basePath??``,this.mainKey());if(!r)return null;let i=r.kind===`main`?f({agentId:r.agentId,mainKey:this.mainKey()}):r.kind===`literal`?r.sessionKey:this.resolveShortTarget(r);return i?{sessionKey:i,agentId:r.agentId,namespace:r.namespace}:null}findSeedRow(e){return this.context?.sessions.state.result?.sessions.find(t=>m(t.key,e.sessionKey))}setCacheEntry(e,t){for(this.cache.delete(e),this.cache.set(e,t);this.cache.size>H;){let e=this.cache.keys().next().value;if(!e)break;this.cache.delete(e)}}cachedOrSeededEntry(e){let t=Date.now(),n=this.cache.get(e.sessionKey);if(n&&n.expiresAt>t)return this.setCacheEntry(e.sessionKey,n),n;n&&this.cache.delete(e.sessionKey);let r=this.findSeedRow(e);if(!r)return;let i=Ue(r,e),a={expiresAt:t+B,promise:Promise.resolve(i),value:i};return this.setCacheEntry(e.sessionKey,a),a}loadTitle(e){let t=this.cachedOrSeededEntry(e);if(t)return t.promise;let n={expiresAt:Date.now()+B,promise:Promise.resolve().then(async()=>{if(!this.client)throw Error(`Session title requires a connected Gateway`);return{...He(await this.client.request(`controlUi.sessionPreview`,{sessionKey:e.sessionKey})),namespace:e.namespace}})};return n.promise=n.promise.then(e=>(n.value=e,e),e=>{throw n.expiresAt=Date.now()+V,e}),this.setCacheEntry(e.sessionKey,n),n.promise}stampAnchor(e,t,n){let r=n?.title,i=ie(t.namespace,t.agentId,t.sessionKey,this.context?.basePath,{displayName:r,exactKey:!0,mainKey:this.mainKey()});i&&e.getAttribute(`href`)!==i&&e.setAttribute(`href`,i),!(!r||e.classList.contains(`markdown-session-link--titled`))&&(e.classList.add(`markdown-session-link--titled`),e.textContent=r,e.title=t.sessionKey)}}})))()}function G(e){return e.querySelector(`[data-session-menu][aria-expanded="true"], [data-catalog-session-menu][aria-expanded="true"]`)!==null}var K,q,J,Y,X,Z,Q;function $(){return($=e((()=>{g(),ee(),S(),he(),j(),u(),w(),we(),R(),W(),pe(),K=450,q=80,J=300,Y=100,X=100,Z=0,Q=class extends y{constructor(...e){super(...e),this.applicationClient=null,this.applicationContext=null,this.applicationGateway=null,this.progressCards=null,this.stopProgressCardUpdates=null,this.stopSessionUpdates=null,this.pullRequests=null,this.stopPullRequestUpdates=null,this.activeTarget=null,this.activeTrigger=null,this.activeSessionKey=null,this.activePullRequestKey=null,this.suppressFocusOpen=!1,this.open=!1,this.delayed=!0,this.animateNextOpen=!0,this.skipDelayTimer=null,this.lastProgressCard=null,this.hovercard=new Te(()=>this.close(!0),Y),this.sessionLinkTitler=new U(this),this.loadGeneration=0,this.activeTargetObserver=new MutationObserver(()=>{if(this.activeTarget&&(!this.contains(this.activeTarget)||G(this))){this.close();return}this.open&&this.showCurrent()}),this.handleProgressCardUpdate=()=>{let e=this.activeSessionKey;if(!e||!this.open||!this.hovercard.held)return;let t=this.progressCards?.get(e);t!==void 0&&(this.lastProgressCard=t),this.showCurrent()},this.handleSessionUpdate=()=>{this.open&&this.hovercard.held&&this.showCurrent()},this.handlePullRequestUpdate=()=>{this.open&&this.hovercard.held&&this.showCurrent()},this.handlePointerOver=e=>{if(e.pointerType===`touch`||!globalThis.matchMedia?.(`(hover: hover)`).matches)return;let t=O(e);if(!t||G(this))return;let n=this.delayed;this.activate(t,t,n?K:q,n),this.hovercard.pointerInside=!0},this.handlePointerOut=e=>{let t=O(e);!t||t!==this.activeTarget||e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)||this.hovercard.schedulePointerExit()},this.handleFocusIn=e=>{if(this.suppressFocusOpen)return;let t=O(e),n=e.target instanceof HTMLElement?e.target:null,r=t?.matches(`.sidebar-recent-session`)?n?.closest(`a.sidebar-recent-session__link`):n;!t||!r||G(this)||(this.activate(t,r,0,!1),this.hovercard.focusInside=!0)},this.handleFocusOut=e=>{this.activeTarget&&(e.relatedTarget instanceof Node&&this.activeTarget.contains(e.relatedTarget)||(this.hovercard.focusInside=!1,this.hovercard.scheduleClose()))},this.handleKeyDown=e=>{if(e.key===`Escape`){this.close();return}if(e.key!==`Tab`||e.shiftKey||e.target!==this.activeTrigger)return;let t=this.cardFocusables()[0];t&&(e.preventDefault(),t.focus())},this.handleClick=e=>{O(e)&&this.close()},this.handleSessionMenuOpen=()=>{this.close()},this.handleCardPointerEnter=()=>{this.hovercard.pointerOverCard=!0,this.hovercard.clearClose()},this.handleCardPointerLeave=()=>{this.hovercard.pointerOverCard=!1,this.hovercard.scheduleClose()},this.handleCardFocusIn=()=>{this.hovercard.cardFocusInside=!0,this.hovercard.clearClose()},this.handleCardFocusOut=e=>{e.relatedTarget instanceof Node&&this.hovercard.card?.contains(e.relatedTarget)||(this.hovercard.cardFocusInside=!1,this.hovercard.scheduleClose())},this.handleCardKeyDown=e=>{if(e.key!==`Escape`&&e.key!==`Tab`)return;let t=this.cardFocusables(),n=e.shiftKey?t[0]:t.at(-1);if(e.key===`Tab`&&document.activeElement!==n)return;e.preventDefault();let r=this.activeTrigger;this.close(),this.suppressFocusOpen=!0,r?.focus({preventScroll:!0}),this.suppressFocusOpen=!1}}static{this.properties={client:{attribute:!1,noAccessor:!0},context:{attribute:!1,noAccessor:!0},gateway:{attribute:!1,noAccessor:!0}}}get client(){return this.applicationClient}set client(e){this.applicationClient=e,this.sessionLinkTitler.client=e}get context(){return this.applicationContext}set context(e){this.stopSessionUpdates?.(),this.stopSessionUpdates=null,this.applicationContext=e,this.sessionLinkTitler.context=e,this.isConnected&&(this.sessionLinkTitler.refresh(),this.connectStore())}get gateway(){return this.applicationGateway}set gateway(e){e!==this.applicationGateway&&(this.disconnectStore(),this.applicationGateway=e,this.close(),this.isConnected&&this.connectStore())}createRenderRoot(){return this}connectedCallback(){super.connectedCallback(),this.style.display=`contents`,this.addEventListener(`pointerover`,this.handlePointerOver),this.addEventListener(`pointerout`,this.handlePointerOut),this.addEventListener(`focusin`,this.handleFocusIn),this.addEventListener(`focusout`,this.handleFocusOut),this.addEventListener(`keydown`,this.handleKeyDown),this.addEventListener(`click`,this.handleClick),this.addEventListener(D,this.handleSessionMenuOpen),this.sessionLinkTitler.connect(),this.connectStore()}disconnectedCallback(){this.removeEventListener(`pointerover`,this.handlePointerOver),this.removeEventListener(`pointerout`,this.handlePointerOut),this.removeEventListener(`focusin`,this.handleFocusIn),this.removeEventListener(`focusout`,this.handleFocusOut),this.removeEventListener(`keydown`,this.handleKeyDown),this.removeEventListener(`click`,this.handleClick),this.removeEventListener(D,this.handleSessionMenuOpen),this.sessionLinkTitler.disconnect(),this.disconnectStore(),this.close(),this.clearSkipDelayTimer(),super.disconnectedCallback()}connectStore(){this.applicationContext&&!this.stopSessionUpdates&&(this.stopSessionUpdates=this.applicationContext.sessions.subscribe(this.handleSessionUpdate)),!(!this.applicationGateway||this.progressCards)&&(this.progressCards=ve(this.applicationGateway),this.stopProgressCardUpdates=this.progressCards.subscribe(this.handleProgressCardUpdate))}disconnectStore(){this.progressCards?.unwatch(this),this.stopProgressCardUpdates?.(),this.stopProgressCardUpdates=null,this.stopSessionUpdates?.(),this.stopSessionUpdates=null,this.progressCards=null,this.releasePullRequestStore()}activate(e,t,n,r){let i=e.dataset.sessionKey;if(!i)return;if(e===this.activeTarget&&i===this.activeSessionKey){if(t!==this.activeTrigger){if(this.hovercard.reset(),this.activeTrigger=t,this.hovercard.markTrigger(t),this.open)this.showCurrent();else{this.animateNextOpen=r;let e=++this.loadGeneration;this.hovercard.scheduleOpen(n,()=>void this.loadAndShow(i,e))}}return}this.close(n>0),this.activeTarget=e,this.activeTrigger=t,this.activeSessionKey=i,this.open=!1,this.animateNextOpen=r,this.lastProgressCard=null,this.progressCards?.watch(this,[i]),this.hovercard.markTrigger(t),this.activeTargetObserver.observe(this,{attributes:!0,attributeFilter:[`aria-expanded`],childList:!0,subtree:!0});let a=++this.loadGeneration;this.hovercard.scheduleOpen(n,()=>void this.loadAndShow(i,a))}async loadAndShow(e,t){let n=this.activeTarget;if(n instanceof HTMLAnchorElement&&n.dataset.sessionKey===e&&this.sessionLinkTitler.decorate(n,!0),!(t!==this.loadGeneration||this.activeSessionKey!==e||!n||G(this)||!this.hovercard.held)){this.open=!0,this.delayed=!1,this.clearSkipDelayTimer(),this.watchPullRequests(e),this.showCurrent();try{await this.progressCards?.load(e)}catch{}t===this.loadGeneration&&this.activeSessionKey===e&&this.hovercard.held&&this.showCurrent()}}watchPullRequests(e){let t=this.applicationGateway;if(!t)return;this.releasePullRequestStore();let n=d(e)?.agentId??t.snapshot.assistantAgentId;this.activePullRequestKey=xe(e,n??void 0),this.pullRequests=A(t),this.stopPullRequestUpdates=this.pullRequests.subscribe(this.handlePullRequestUpdate),this.pullRequests.watch(this,[this.activePullRequestKey],{foreground:!0})}releasePullRequestStore(){this.pullRequests?.unwatch(this),this.stopPullRequestUpdates?.(),this.stopPullRequestUpdates=null,this.pullRequests=null,this.activePullRequestKey=null}showCurrent(){let e=this.activeTarget,t=this.activeSessionKey;if(!e||!t||!this.open)return;let n=this.querySelector(`openclaw-app-sidebar`)?.findSidebarHovercardRowByKey(t),r=this.activePullRequestKey?this.pullRequests?.get(this.activePullRequestKey):void 0,i=this.progressCards?.get(t);i!==void 0&&(this.lastProgressCard=i);let a=this.applicationGateway,o={authTokens:a?re({hello:a.snapshot.hello,settings:{token:a.connection.token},password:a.connection.password}):[],authReady:!!(a&&(a.snapshot.hello||a.connection.token.trim()||a.connection.password.trim()))},s=JSON.stringify({progress:this.lastProgressCard?.revision??null,pullRequests:r?{branch:r.branch,pullRequests:r.pullRequests}:null,row:n?{label:n.label,boardFace:n.boardFace,hasAutomation:n.hasAutomation,channelAvatarUrl:n.channelAvatarUrl,lastMessagePreview:n.lastMessagePreview,createdActor:n.createdActor,participants:n.participants,expandedParticipants:n.expandedParticipants,participantCount:n.participantCount,workContext:n.workContext,createdAt:n.createdAt,startedAt:n.startedAt,updatedAt:n.updatedAt,status:n.status,endedAt:n.endedAt}:null});if(this.hovercard.card?.dataset.revision===s)return;let c=this.hovercard.card,l=c?.contains(document.activeElement)&&document.activeElement instanceof HTMLElement?document.activeElement:null,u=l?this.cardFocusables().indexOf(l):-1,d=l instanceof HTMLAnchorElement?l.href:null,f=!c&&this.animateNextOpen,p=c;if(p||(Z+=1,p=Ce(`openclaw-session-progress-hovercard-${Z}`,`session-progress-hovercard`),this.animateNextOpen=!1,f?p.dataset.open=`false`:p.dataset.instant=`true`),p.dataset.revision=s,p.setAttribute(`aria-label`,C(`sessionHovercard.ariaLabel`)),h(Be({row:n,selfUserId:this.applicationContext?.gateway.snapshot.selfUser?.id,avatarAuth:o,personActivity:this.personActivity(),pullRequests:r,progressCard:this.lastProgressCard}),p),!p.firstElementChild){this.hovercard.clearCard(),this.hovercard.pointerOverCard=!1,this.hovercard.cardFocusInside=!1;return}if(c){if(l&&!p.contains(document.activeElement)){let e=this.cardFocusables(),t=(d?e.find(e=>e instanceof HTMLAnchorElement&&e.href===d):void 0)??e[u];t?t.focus({preventScroll:!0}):(this.hovercard.cardFocusInside=!1,this.suppressFocusOpen=!0,this.activeTrigger?.focus({preventScroll:!0}),this.suppressFocusOpen=!1,this.hovercard.focusInside=document.activeElement===this.activeTrigger)}this.hovercard.position();return}p.addEventListener(`pointerenter`,this.handleCardPointerEnter),p.addEventListener(`pointerleave`,this.handleCardPointerLeave),p.addEventListener(`focusin`,this.handleCardFocusIn),p.addEventListener(`focusout`,this.handleCardFocusOut),p.addEventListener(`keydown`,this.handleCardKeyDown),this.hovercard.mount(e,p,fe(e),!1,()=>h(v,p)),f&&(p.offsetWidth,window.setTimeout(()=>{this.hovercard.card===p&&this.open&&(p.dataset.open=`true`)},0))}cardFocusables(){return this.hovercard.focusables()}personActivity(){let e=this.applicationContext;return e?ce(e,()=>this.close()):void 0}close(e=!1){let t=this.open;this.hovercard.reset(e?X:0),this.loadGeneration+=1,this.open=!1,this.animateNextOpen=!0,this.lastProgressCard=null,this.activeTargetObserver.disconnect(),this.progressCards?.unwatch(this),this.releasePullRequestStore(),this.activeTarget=null,this.activeTrigger=null,this.activeSessionKey=null,t&&(this.clearSkipDelayTimer(),this.skipDelayTimer=window.setTimeout(()=>{this.skipDelayTimer=null,this.delayed=!0},J))}clearSkipDelayTimer(){this.skipDelayTimer!==null&&(window.clearTimeout(this.skipDelayTimer),this.skipDelayTimer=null)}}})))()}$();export{Q as SessionProgressHovercardProvider}; //# sourceMappingURL=session-progress-hovercard.runtime-BGOKu33u.js.map