5706 lines
576 KiB
JavaScript
5706 lines
576 KiB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./composer-draft-store.runtime-ChgPeVSK.js","./control-ui-boot-Cdpgu1Gm.js","./rolldown-runtime-DkW27tQK.js","./control-ui-foundation-CeFMP1Ly.js","./control-ui-core-pH6nakZ-.js","./lit-runtime-BEtFSUCp.js","./control-ui-core-DGVkFhVB.js","./control-ui-core-Br5DB0Zj.js","./gateway-runtime-DUNO4Mi1.js","./control-ui-core-C8H8-RSs.css","./control-ui-boot-wpHCbPL9.js","./control-ui-boot-gfE6fZcA.js","./config-runtime-C4gfjhZc.js","./control-ui-boot-CKTkvwFZ.js","./control-ui-boot-BPFwXC8p.js","./control-ui-boot-DdPrPuw0.js","./control-ui-boot-9_2QGLIL.js","./control-ui-boot-J-x6DHHT.js","./control-ui-boot-Clhp68JE.js","./control-ui-boot-D1DWJlBr.js","./control-ui-boot-CQvujP8f.js","./control-ui-boot-BW_XZcbY.js","./control-ui-boot-__AsqpzJ.css","./markdown-runtime-BcrsAQtF.js","./attachments-F-SP_8KB.css","./chat-diff-highlight.runtime-CbXKn64d.js","./dist-CknG_5Uc.js","./code-language-Dtrc3ZLp.js","./mcp-app-view-registration-BaqCYBMP.js","./file-editor-view-DCKb7O64.js"])))=>i.map(i=>d[i]);
|
||
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ci as t,Dn as n,Ei as r,Fi as i,It as a,Jt as o,Mt as s,Nr as c,Ot as l,Pr as u,Pt as d,Sn as f,an as p,bn as m,er as h,jt as g,ki as _,kt as v,sn as y,un as b,vn as x,wn as S,yn as C}from"./control-ui-foundation-CeFMP1Ly.js";import{Ac as w,At as T,Co as E,Dc as D,Do as O,Ft as k,G as ee,Ga as A,Ic as te,It as j,J as ne,Jc as M,Kc as N,Ks as re,Mt as ie,Na as ae,Nt as P,Pc as oe,Pt as se,Qa as ce,Qc as F,Rc as le,Sc as ue,To as de,Tt as fe,U as I,Vc as L,W as pe,Wa as me,Yc as he,_i as ge,b as _e,bc as ve,d as ye,di as be,dl as xe,dr as Se,f as Ce,fl as we,fr as Te,fs as Ee,g as De,gl as Oe,hl as ke,jt as Ae,kt as je,lr as Me,mc as Ne,ml as Pe,ms as Fe,nl as Ie,no as Le,pl as Re,pr as ze,ps as Be,qs as Ve,ro as He,tl as Ue,u as We,uo as Ge,vc as Ke,vr as qe,w as Je,wo as Ye,wt as Xe,x as Ze,xo as Qe,y as $e,yc as et,yr as tt,zc as nt}from"./control-ui-core-pH6nakZ-.js";import{C as rt,E as it,G as R,H as at,I as ot,J as z,O as st,R as ct,W as B,X as lt,Z as ut,_ as V,a as dt,at as H,b as U,c as ft,d as pt,f as mt,h as ht,i as gt,lt as _t,m as vt,n as yt,q as bt,rt as W,s as xt,t as St,u as Ct,w as wt,x as Tt}from"./lit-runtime-BEtFSUCp.js";import{$n as Et,$t as Dt,At as Ot,B as kt,Dn as At,Dt as jt,En as Mt,J as Nt,Jt as Pt,Kn as Ft,Nt as It,Pt as Lt,U as Rt,Un as zt,Ut as Bt,Y as Vt,Z as Ht,b as Ut,d as Wt,en as Gt,et as Kt,f as qt,jt as Jt,m as Yt,nn as Xt,p as Zt,qn as Qt,qt as $t,rt as en,tr as tn,wt as nn,y as rn,zn as an}from"./control-ui-core-DGVkFhVB.js";import{$ as on,A as sn,Bt as cn,D as ln,Ft as G,Gt as un,Ht as K,I as dn,J as fn,L as pn,Lt as q,N as mn,Nt as hn,O as gn,P as _n,Q as vn,Rt as J,Vt as yn,X as bn,Y as xn,Z as Sn,bt as Cn,d as wn,et as Tn,g as En,j as Dn,kt as On,l as kn,p as An,qt as Y,w as jn,xt as Mn,zt as Nn}from"./control-ui-core-Br5DB0Zj.js";import{F as Pn,I as Fn,In,Ln,a as Rn,at as zn,c as Bn,dt as Vn,f as Hn,ft as Un,i as Wn,l as Gn,n as Kn,o as qn,r as Jn,s as Yn,z as Xn}from"./control-ui-boot-wpHCbPL9.js";import{a as Zn,r as Qn}from"./gateway-runtime-DUNO4Mi1.js";import{$ as $n,$i as er,$n as tr,$u as nr,Aa as rr,Ac as ir,Ai as ar,Al as or,Bc as sr,Bi as cr,Bn as lr,Bt as ur,Bu as dr,Ci as fr,Da as pr,Di as mr,Ea as hr,Ei as gr,Eo as _r,Er as vr,F as yr,Fc as br,Fl as xr,Ft as Sr,Fu as Cr,Gi as wr,Gl as Tr,Gn as Er,Go as Dr,Gs as Or,Gt as kr,Gu as Ar,Hi as jr,Hl as Mr,Hn as Nr,Ho as Pr,I as Fr,Ic as Ir,Il as Lr,Io as Rr,It as zr,Jc as Br,Jn as Vr,Jt as Hr,Ki as Ur,Kl as Wr,Ks as Gr,Ku as Kr,L as qr,Lc as Jr,Ln as Yr,Lt as Xr,M as Zr,Ma as Qr,Mc as $r,Mi as ei,Ml as ti,Mo as ni,Ms as ri,Mu as ii,Nc as ai,Nu as oi,O as si,Oa as ci,Oi as li,P as ui,Pc as di,Pi as fi,Pl as pi,Pu as mi,Q as hi,Qc as gi,Qi as _i,Qn as vi,Qr as yi,Qu as bi,R as xi,Rc as Si,Ri as Ci,Rn as wi,Ro as Ti,Rt as Ei,Ru as Di,S as Oi,Sa as ki,Si as Ai,St as ji,Ta as Mi,Ti as Ni,To as Pi,Tr as Fi,Uc as Ii,Un as Li,Uu as Ri,Vi as zi,Vn as Bi,Vt as Vi,Vu as Hi,Wc as Ui,Wi,Wl as Gi,Wn as Ki,Wo as qi,Wu as Ji,X as Yi,Xc as Xi,Xi as Zi,Xn as Qi,Xu as $i,Yc as ea,Yi as ta,Yl as na,Yn as ra,Yu as ia,Zc as aa,Zi as oa,Zn as sa,Zt as ca,Zu as la,_i as ua,_l as da,a as fa,aa as pa,ai as ma,an as ha,ao as ga,ba as _a,bd as va,bi as ya,bo as ba,bt as xa,ca as Sa,ci as Ca,d as wa,dd as Ta,do as Ea,ea as Da,ed as Oa,et as ka,fl as Aa,fo as ja,ga as Ma,gd as Na,gl as Pa,ha as Fa,hi as Ia,hl as La,ho as Ra,i as za,ia as Ba,id as Va,ii as Ha,io as Ua,j as Wa,ja as Ga,jc as Ka,ji as qa,jl as Ja,ju as Ya,ki as Xa,kl as Za,l as Qa,la as $a,ld as eo,lo as to,m as no,ma as ro,mo as io,n as ao,na as oo,nd as so,ni as co,nt as lo,o as uo,oa as fo,od as po,oi as mo,p as ho,pa as go,pl as _o,po as vo,qc as yo,qi as bo,ql as xo,qn as So,qu as Co,r as wo,ra as To,rd as Eo,ri as Do,sa as Oo,sd as ko,si as Ao,t as jo,ta as Mo,td as No,tt as Po,u as Fo,ul as Io,uo as Lo,vi as Ro,vl as zo,w as Bo,wi as Vo,x as Ho,xa as Uo,xi as Wo,y as Go,ya as Ko,yi as qo,yo as Jo,yt as Yo,z as Xo,zn as Zo,zt as Qo,zu as $o}from"./control-ui-boot-Cdpgu1Gm.js";import{c as es,l as ts}from"./control-ui-boot-Clhp68JE.js";import{A as ns,B as rs,D as is,E as as,F as os,H as ss,I as cs,L as ls,M as us,N as ds,O as fs,P as ps,Q as ms,R as hs,T as gs,U as _s,V as vs,X as ys,Z as bs,at as xs,f as Ss,g as Cs,gt as ws,it as Ts,j as Es,k as Ds,mt as Os,nt as ks,o as As,ot as js,rt as Ms,s as Ns,xt as Ps,z as Fs}from"./control-ui-boot-J-x6DHHT.js";import{$n as Is,A as Ls,C as Rs,D as zs,E as Bs,F as Vs,Ht as Hs,M as Us,Mt as Ws,N as Gs,O as Ks,Ot as qs,P as Js,Pt as Ys,Qn as Xs,S as Zs,T as Qs,Xn as $s,Z as ec,Zn as tc,ar as nc,et as rc,ir as ic,k as ac,kt as oc,nr as sc,q as cc,rr as lc,sr as uc,tr as dc,w as fc}from"./control-ui-boot-D1DWJlBr.js";import{O as pc,i as mc,k as hc,n as gc,r as _c,t as vc}from"./control-ui-boot-BPFwXC8p.js";function yc(e){return e.trim().length===0?``:e}function bc(e){return JSON.stringify([e.gatewayOwner,e.recoveryScope])}function xc(e){return JSON.stringify([e.gatewayOwner,e.recoveryScope,e.scopeKey])}function Sc(e,t){let n=bc(e);Mc.has(n)||(Mc.add(n),t())}function Cc(e,t,n){return JSON.stringify([e,n??null,t.map(e=>[e.id,e.mimeType,e.fileName??``,e.sizeBytes??-1,e.browserAnnotation??null])])}function wc(e){let t=/^data:([^,]*),(.*)$/s.exec(e);if(!t)return null;let n=t[1]??``,r=t[2]??``;try{if(n.toLowerCase().includes(`;base64`)){let e=atob(r.replace(/\s+/gu,``)),t=Uint8Array.from(e,e=>e.charCodeAt(0));return new Blob([t],{type:n.split(`;`,1)[0]})}return new Blob([decodeURIComponent(r.replace(/\+/gu,`%20`))],{type:n.split(`;`,1)[0]})}catch{return null}}function Tc(e){return new Promise((t,n)=>{let r=new FileReader;r.addEventListener(`error`,()=>n(r.error??Error(`Blob read failed`)),{once:!0}),r.addEventListener(`load`,()=>typeof r.result==`string`?t(r.result):n(Error(`Blob read returned no data`)),{once:!0}),r.readAsDataURL(e)})}async function Ec(e){let t=e.blob.type===e.attachment.mimeType?e.blob:e.blob.slice(0,e.blob.size,e.attachment.mimeType),n=await Tc(t),r=new File([t],e.attachment.fileName??`attachment`,{type:e.attachment.mimeType});return se({attachment:e.attachment,dataUrl:n,file:r})}function Dc(e){let t=[];for(let n of e){let e=Ae(n),r=T(n)??(e?wc(e):null);if(!r)return null;t.push({blob:r,mimeType:n.mimeType,...n.fileName?{fileName:n.fileName}:{},...typeof n.sizeBytes==`number`?{sizeBytes:n.sizeBytes}:{},...n.browserAnnotation?{browserAnnotation:{...n.browserAnnotation}}:{}})}return t}async function Oc(e){let t=[];try{for(let n of e)t.push(await Ec({attachment:{id:je(),mimeType:n.mimeType,...n.fileName?{fileName:n.fileName}:{},...typeof n.sizeBytes==`number`?{sizeBytes:n.sizeBytes}:{},...n.browserAnnotation?{browserAnnotation:{...n.browserAnnotation}}:{}},blob:n.blob}));return t}catch(e){throw j(t),e}}async function kc(e){let{writeDurableComposerDraft:t}=await Pc(),n=e.storedAttachments===null;return{result:await t(e.scope,{revision:e.revision,text:n?``:e.text,...e.goalMode?{goalMode:e.goalMode}:{},attachments:e.storedAttachments??[]},{expectedRevision:e.expectedRevision,...e.expectedWriteId?{expectedWriteId:e.expectedWriteId}:{},...e.expectedWriteIds?.length?{expectedWriteIds:e.expectedWriteIds}:{},writeId:e.writeId}),payloadUnavailable:n}}async function Ac(e,t){if(e.size!==t.size||e.type!==t.type)return!1;let[n,r]=await Promise.all([e.arrayBuffer(),t.arrayBuffer()]),i=new Uint8Array(n),a=new Uint8Array(r);return i.every((e,t)=>e===a[t])}async function jc(e,t,n){if(n===null||e.text!==t||e.attachments.length!==n.length)return!1;for(let[t,r]of e.attachments.entries()){let e=n[t];if(!e||r.mimeType!==e.mimeType||r.fileName!==e.fileName||r.sizeBytes!==e.sizeBytes||JSON.stringify(r.browserAnnotation)!==JSON.stringify(e.browserAnnotation)||!await Ac(r.blob,e.blob))return!1}return!0}var Mc,Nc,Pc,Fc;function Ic(){return(Ic=e((()=>{P(),u(),Mc=new Set,Nc=c(()=>import(`./composer-draft-store.runtime-ChgPeVSK.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),Pc=()=>Nc,Fc=class{constructor(e,t){this.onStorageError=e,this.onConflict=t,this.restoreGeneration=0,this.restoredScopeKey=``}resetRestoreScope(){this.restoreGeneration+=1,this.restoredScopeKey=``}persist(e){(async()=>{let{result:t,payloadUnavailable:n}=await kc(e);n&&Sc(e.scope,this.onStorageError),t.status===`storage-failed`||t.status===`payload-too-large`?Sc(e.scope,this.onStorageError):t.status===`conflict`&&(this.resetRestoreScope(),this.onConflict())})()}retire(e,t){this.resetRestoreScope(),(async()=>{let{retireDurableComposerDraft:n}=await Pc();(await n(e,t)).status===`storage-failed`&&Sc(e,this.onStorageError)})()}restore(e,t,n,r){let i=xc(e.scope);if(this.restoredScopeKey===i)return;this.restoredScopeKey=i;let a=++this.restoreGeneration;this.restoreScope(e,a,t,n,r)}async restoreScope(e,t,n,r,i){let{readDurableComposerDraft:a,prepareDurableComposerRecovery:o}=await Pc();if(e.scope.scopeKey.startsWith(`chat:v3:`)&&(await o(e.scope)).status===`storage-failed`){Sc(e.scope,this.onStorageError);return}let s=await a(e.scope);if(s.status===`storage-failed`){Sc(e.scope,this.onStorageError);return}let c=s.status===`found`?s.draft.revision:s.revision;if(c===void 0||c<e.latestRevision){this.isBaselineCurrent(e,t,n())&&i(c??0);return}let l=[];if(s.status===`found`)try{l=await Oc(s.draft.attachments)}catch{j(l),Sc(e.scope,this.onStorageError);return}if(!this.isBaselineCurrent(e,t,n())){j(l);return}r({revision:c,text:s.status===`found`?s.draft.text:``,...s.status===`found`&&s.draft.goalMode?{goalMode:s.draft.goalMode}:{},attachments:l})}isBaselineCurrent(e,t,n){return t===this.restoreGeneration&&n.scope?.gatewayOwner===e.scope.gatewayOwner&&n.scope.recoveryScope===e.scope.recoveryScope&&n.scope.scopeKey===e.scope.scopeKey&&n.signature===e.signature&&n.revision===e.latestRevision}}})))()}function Lc(e){let t=Ae(e);return t?{id:e.id,mimeType:e.mimeType,...e.fileName?{fileName:e.fileName}:{},...typeof e.sizeBytes==`number`?{sizeBytes:e.sizeBytes}:{},dataUrl:t}:null}function Rc(e){if(!e.id?.trim()||!e.text?.trim()&&!e.attachments?.length&&!e.attachmentPayload&&!e.attachmentStorageError||e.pendingRunId||e.sendState===`sending`&&!e.sendRunId)return null;let t=(e.attachments??[]).map(t=>{let{dataUrl:n,previewUrl:r,...i}=t;return e.attachmentPayload?i:Lc(t)??(e.attachmentStorageError?i:null)});return e.attachments?.length&&t.some(e=>e===null)?null:Va({...e,attachments:t.length?t:void 0,...e.sendState===`waiting-model`?{sendError:so}:{}})}function zc(e,t){let n=Rc(e);return n?Di(n,t):null}function Bc(e,t,n){let r=zc(t,n);return!!(r&&e.id===r.id&&e.sendRunId===r.sendRunId&&e.sendAttempts===r.sendAttempts&&e.sendState===r.sendState&&e.agentId===r.agentId&&e.sessionKey===r.sessionKey&&e.orderKey===r.orderKey&&e.attachmentPayload?.key===r.attachmentPayload?.key)}function Vc(e,t,n){let r=zc(e,n),i=zc(t,n);return!!(r&&i&&JSON.stringify(r)===JSON.stringify(i))}function Hc(e,t,n,r){if(!n?.draft&&!n?.goalMode&&n?.draftRevision===void 0&&r.length===0){delete e.sessions[t];return}e.sessions[t]={...n?.awaitingDefaults?{awaitingDefaults:!0}:{},...n?.draft?{draft:n.draft}:{},...n?.goalMode?{goalMode:n.goalMode}:{},...n?.draftRevision===void 0?{}:{draftRevision:n.draftRevision},...r.length?{queue:r}:{},updatedAt:Date.now()}}function Uc(e,t){let n=Oe();if(!n)return{committed:0,latestAttempt:0};try{let r=Kr(e.settings?.gatewayUrl),i=Ri(n,r),a=Ji(i,e),o=Co(t),s=i.sessions[o]??null;if(a)try{ia(n,r,i)}catch{}let c=s?.draftRevision;nr(n,r.key,o,c);let l=Math.max(c??0,No(n,r.key,o));return{committed:l,latestAttempt:Math.max(l,Oa(n,r.key,o))}}catch{return{committed:0,latestAttempt:0}}}function Wc(e,t,n){return Uc(e,Ar(e,t,n)).latestAttempt}function Gc(e,t,n){return Uc(e,Ar(e,t,n)).committed}function Kc(e,t,n){return qc(e,Ar(e,t,n))}function qc(e,t){let n=Oe();if(!n)return null;try{let r=Kr(e.settings?.gatewayUrl),i=Ri(n,r);if(Ji(i,e))try{ia(n,r,i)}catch{}let a=i.sessions[Co(t)],o=yc(a?.draft??``);return!a||!o&&!a.goalMode&&!a.queue?.length?null:{draft:o,...a.goalMode?{goalMode:a.goalMode}:{},queue:(a.queue??[]).filter(t=>Ta(e,t)).map(e=>zc(e,t)).filter(e=>e!==null)}}catch{return null}}function Jc(e,t=e.sessionKey,n={}){return Yc(e,$o(e,t,n.agentId),n)}function Yc(e,t,n={}){let r=Oe();if(!r||!t.scope.sessionKey.trim())return`storage-failed`;try{let i=Kr(e.settings?.gatewayUrl),a=Ri(r,i),o=Co(t.scope),s=a.sessions[o]??null,c=yc(Object.hasOwn(n,`draft`)?n.draft??``:e.chatMessage),l=Object.hasOwn(n,`goalMode`)?n.goalMode:e.chatGoalDraftMode,u=s?.draftRevision;nr(r,i.key,o,u);let d=Math.max(u??0,No(r,i.key,o)),f=Math.max(d,Oa(r,i.key,o)),p=n.draftRevision??la(f);if(!Number.isSafeInteger(p)||p<=0)return`conflict`;let m=yc(s?.draft??``),h=m===c&&JSON.stringify(s?.goalMode??null)===JSON.stringify(l??null),g=n.expectedDraftRevision;if(!(g===void 0||d===g||u===p&&h)||p<f||u===p&&!h)return`conflict`;bi(r,i.key,o,p),a.sessions[o]={...t.awaitingDefaults?{awaitingDefaults:!0}:{},...c?{draft:c}:{},...l?{goalMode:l}:{},draftRevision:p,...s?.queue?.length?{queue:s.queue}:{},updatedAt:Date.now()},ia(r,i,a);let _=Ri(r,i).sessions[o];return _?.draftRevision===p&&(_.draft??``)===c&&JSON.stringify(_.goalMode??null)===JSON.stringify(l??null)?(!!m!=!!c&&Hi(),`persisted`):(_?.draftRevision??0)>=p?`conflict`:`storage-failed`}catch{return`storage-failed`}}function Xc(e,t=e.sessionKey,n={}){return Jc(e,t,n)===`persisted`}function Zc(e,t,n,r,i,a=$o(e,t,r??n.agentId)){let o=Oe();if(!o||!t.trim())return!1;try{let t=Kr(e.settings?.gatewayUrl),r=Ri(o,t),s=a.scope,c=zc(n,s);if(!c)return!1;let l=Ji(r,e),u=Co(s),d=r.sessions[u]??null,f=d?.queue??[];if(i&&!f.some(e=>e.id===i.id&&Bc(e,i.expected,s)))return!1;let p=f.filter(e=>e.id!==i?.id),m=p.find(e=>e.id===c.id);if(m)return Vc(m,c,s)?(l&&(ia(o,t,r),Hi()),!0):!1;if(p.length>=50)return!1;Hc(r,u,d,[...p,c]),a.awaitingDefaults&&(r.sessions[u].awaitingDefaults=!0),ia(o,t,r);let h=Ri(o,t).sessions[u]?.queue?.find(e=>e.id===c.id),g=!!(h&&Vc(h,c,s));return Hi(),g}catch{return!1}}function Qc(e,t,n,r){if(n.length===0)return!0;let i=Oe();if(!i||!t.trim()||n.some(({expected:e,next:t})=>e.id!==t.id))return!1;try{let a=Kr(e.settings?.gatewayUrl),o=Ri(i,a),s={sessionKey:t,agentId:r??n[0].expected.agentId??n[0].next.agentId},c=Co(s),l=o.sessions[c]??null,u=(l?.queue??[]).slice();for(let{expected:e,next:t}of n){let n=u.findIndex(t=>t.id===e.id),r=n>=0?u[n]:void 0,i=r&&Bc(r,e,s)?zc(t,s):null;if(!i)return!1;u[n]=i}Hc(o,c,l,u),ia(i,a,o),Hi();let d=Ri(i,a).sessions[c]?.queue??[];return n.every(({next:e})=>{let t=zc(e,s),n=d.find(t=>t.id===e.id);return!!(n&&t&&Vc(n,t,s))})}catch{return!1}}function $c(e,t,n,r,i){return Qc(e,t,[{expected:n,next:r}],i)}function el(e,t,n,r,i){let a=Oe();if(!a||!t.trim()||!n.trim())return!1;try{let o=Kr(e.settings?.gatewayUrl),s=Ri(a,o),c={sessionKey:t,agentId:i??r?.agentId},l=Co(c),u=s.sessions[l]??null,d=u?.queue??[],f=d.findIndex(e=>e.id===n);if(f<0)return!0;let p=d[f];return!p||r&&!Bc(p,r,c)?!1:(Hc(s,l,u,d.filter((e,t)=>t!==f)),ia(a,o,s),Hi(),!Ri(a,o).sessions[l]?.queue?.some(e=>e.id===n))}catch{return!1}}function tl(e,t={}){e.chatMessage=yc(e.chatMessage);let n=Kc(e,t.sessionKey??e.sessionKey);return n?((!t.preserveCurrent||!e.chatMessage&&!e.chatGoalDraftMode)&&(e.chatMessage=yc(n.draft),e.chatGoalDraftMode=n.goalMode??null),(!t.preserveCurrent&&n.queue.length>0||e.chatQueue.length===0)&&(e.chatQueue=n.queue),!0):!1}var nl,rl,il;function al(){return(al=e((()=>{eo(),Eo(),$i(),dr(),ve(),P(),Ic(),Cr(),nl=200,rl=`Could not store the previous draft in browser storage. It remains available in this tab.`,il=class{constructor(e){this.getState=e,this.timer=null,this.ready=!1,this.pending=null,this.lastPersisted=null,this.committedDraftRevision=0,this.latestDraftRevision=0,this.durableRestoreProtected=!1,this.durableOwner=null,this.durableRetiredScopeKey=``,this.forceDurableOwnerRestore=!1,this.durablePersistence=new Fc(()=>{let e=this.getState();e&&(e.lastError=rl,e.chatError=rl,e.requestUpdate?.())},()=>this.getState()?.requestUpdate?.())}start(){let e=this.getState();if(!e)return;this.ready=!0,this.pending=null;let t=this.readDraftRevisions(e);this.committedDraftRevision=t.committed,this.latestDraftRevision=t.latestAttempt;let n=Kc(e,e.sessionKey);this.durableRestoreProtected=(e.chatAttachments?.length??0)>0||(n?.draft??``)!==e.chatMessage||JSON.stringify(n?.goalMode??null)!==JSON.stringify(e.chatGoalDraftMode??null),this.durablePersistence.resetRestoreScope(),this.lastPersisted=this.snapshot(e,t.committed,t.committed),this.synchronizeDurablePersistence()}stop(){this.persistNow(),this.ready=!1,this.pending=null,this.clearTimer()}restore(e={}){let t=this.getState();if(!t)return!1;let n=tl(t,e);this.pending=null,this.clearTimer();let r=this.readDraftRevisions(t);return this.committedDraftRevision=r.committed,this.latestDraftRevision=r.latestAttempt,this.lastPersisted=this.snapshot(t,r.committed,r.committed),this.durableRestoreProtected=!1,this.durablePersistence.resetRestoreScope(),n}schedule(){let e=this.getState();if(!this.ready||!e)return;let t=this.snapshot(e);if(this.isUnchanged(t)){if(!this.pending){this.clearTimer();return}if(Cc(this.pending.chatMessage,this.pending.attachments,this.pending.goalMode)===Cc(t.chatMessage,t.attachments,t.goalMode)){this.clearTimer(),this.timer=globalThis.setTimeout(()=>this.persistNow(),nl);return}}let n=Math.max(this.latestDraftRevision,this.pending?.draftRevision??0),r=la(n);this.latestDraftRevision=r,this.pending=this.snapshot(e,r,this.committedDraftRevision),this.clearTimer(),this.timer=globalThis.setTimeout(()=>this.persistNow(),nl)}persistNow(){let e=this.getState();if(!this.ready||!e)return;let t=this.pending;if(!t){let n=this.snapshot(e);if(this.isUnchanged(n))return;t=this.snapshot(e,la(this.latestDraftRevision),this.committedDraftRevision),this.latestDraftRevision=t.draftRevision}this.clearTimer(),this.pending=this.persistSnapshot(e,t).status===`persisted`?null:t}persistChangedState(){this.persistNow(),this.synchronizeDurablePersistence()}scopeForRouteSwitch(){let e=this.getState();if(!e)return null;let t=this.snapshot(e);return(this.pending??(this.isUnchanged(t)?this.lastPersisted??t:t)).scope}persistForRouteSwitch(){return this.persistForRouteSwitchResult().status===`persisted`}persistForRouteSwitchResult(){let e=this.getState();if(!e)return{status:`persisted`};let t=this.pending,n=!1,r=this.snapshot(e);if(!t&&this.ready&&this.isUnchanged(r)){let i=this.lastPersisted??r;if(!i.chatMessage&&!i.goalMode&&i.attachments.length===0)return this.pending=null,this.clearTimer(),{status:`persisted`};let a=this.readDraftRevisions(e,i.scope),o=a.committed,s=qc(e,i.scope);if(i.attachments.length===0&&o===i.draftRevision&&s?.draft===i.chatMessage&&JSON.stringify(s?.goalMode??null)===JSON.stringify(i.goalMode??null))return this.pending=null,this.clearTimer(),{status:`persisted`};if(o!==i.draftRevision||s?.draft||s?.goalMode||a.latestAttempt>i.draftRevision)return{status:`conflict`};t={...i,expectedDraftRevision:o,draftRevision:la(Math.max(o,a.latestAttempt,this.latestDraftRevision))},this.latestDraftRevision=t.draftRevision,n=!0}else if(!t&&!this.ready&&!r.chatMessage&&!r.goalMode)return this.pending=null,this.clearTimer(),{status:`persisted`};t??=this.snapshot(e,la(this.latestDraftRevision),this.committedDraftRevision),this.latestDraftRevision=Math.max(this.latestDraftRevision,t.draftRevision),this.clearTimer();let i=this.persistSnapshot(e,t,n);return this.pending=i.status===`persisted`?null:t,i}adoptCurrentRoute(){let e=this.getState();if(!e)return;this.pending=null,this.clearTimer();let t=this.readDraftRevisions(e);this.committedDraftRevision=t.committed,this.latestDraftRevision=t.latestAttempt,this.lastPersisted=this.snapshot(e,t.committed,t.committed),this.durableRestoreProtected=!1,this.durablePersistence.resetRestoreScope()}persistSnapshot(e,t,n=!1){let r=Yc(e,t,{agentId:t.agentId,draft:t.chatMessage,goalMode:t.goalMode??null,draftRevision:t.draftRevision,...n?{expectedDraftRevision:t.expectedDraftRevision}:{}});return t.durable&&this.durablePersistence.persist(t.durable),r===`persisted`?(this.committedDraftRevision=t.draftRevision,this.latestDraftRevision=Math.max(this.latestDraftRevision,t.draftRevision),this.lastPersisted=t,{status:r}):r===`storage-failed`?{status:r,expectedDraftRevision:t.expectedDraftRevision,draftRevision:t.draftRevision}:{status:r}}clearTimer(){this.timer!==null&&(globalThis.clearTimeout(this.timer),this.timer=null)}isUnchanged(e){let t=this.lastPersisted;return!!(t&&t.sessionKey===e.sessionKey&&Cc(t.chatMessage,t.attachments,t.goalMode)===Cc(e.chatMessage,e.attachments,e.goalMode))}snapshot(e,t=this.latestDraftRevision,n=this.committedDraftRevision){let r=Ar(e,e.sessionKey),i=this.resolveDurableScope(e,r),a=e.chatGoalDraftMode?{...e.chatGoalDraftMode}:void 0,o=(e.chatAttachments??[]).map(e=>Object.assign({},e,e.browserAnnotation?{browserAnnotation:Object.assign({},e.browserAnnotation)}:{})),s=i?{scope:i,expectedRevision:n,revision:t,text:yc(e.chatMessage),...a?{goalMode:a}:{},attachments:o,storedAttachments:Dc(o),writeId:`${t}:${Math.random().toString(36).slice(2)}`}:void 0;return{scope:r,awaitingDefaults:!et(e),sessionKey:e.sessionKey,chatMessage:yc(e.chatMessage),...a?{goalMode:a}:{},...r.agentId?{agentId:r.agentId}:{},expectedDraftRevision:n,draftRevision:t,attachments:o,...s?{durable:s}:{}}}resolveDurableScope(e,t=Ar(e,e.sessionKey)){return e.selectedChatSessionIncognito?null:this.resolveConnectedDurableScope(e,t)??(this.durableOwner&&!e.connected&&this.durableOwner.client===e.client&&this.durableOwner.gatewayOwner===Kr(e.settings?.gatewayUrl).gatewayOwner?{...this.durableOwner,scopeKey:`chat:v3:${Co(t)}`}:null)}resolveConnectedDurableScope(e,t=Ar(e,e.sessionKey)){let n=e.client?.recoveryScope?.trim();return!e.connected||!e.client?.recoveryScopeReady||!n?null:{gatewayOwner:Kr(e.settings?.gatewayUrl).gatewayOwner,recoveryScope:n,scopeKey:`chat:v3:${Co(t)}`}}synchronizeDurablePersistence(){let e=this.getState();if(!this.ready||!e)return;let t=this.resolveConnectedDurableScope(e);if(e.selectedChatSessionIncognito){if(t){let e=xc(t);this.durableRetiredScopeKey!==e&&(this.durableRetiredScopeKey=e,this.durableOwner=null,this.forceDurableOwnerRestore=!1,this.durableRestoreProtected=!1,this.durablePersistence.retire(t,this.latestDraftRevision))}return}this.durableRetiredScopeKey=``;let n=t;if(!n)return;let r=this.durableOwner;if(this.durableOwner={client:e.client,gatewayOwner:n.gatewayOwner,recoveryScope:n.recoveryScope},r&&(r.gatewayOwner!==n.gatewayOwner||r.recoveryScope!==n.recoveryScope)){j(e.chatAttachments),e.chatMessage=``,e.chatGoalDraftMode=null,e.chatAttachments=[],this.pending=null;let t=this.readDraftRevisions(e);this.committedDraftRevision=t.committed,this.latestDraftRevision=la(t.latestAttempt),Jc(e,e.sessionKey,{draft:``,goalMode:null,draftRevision:this.latestDraftRevision}),this.committedDraftRevision=this.latestDraftRevision,this.lastPersisted=this.snapshot(e,this.latestDraftRevision,this.latestDraftRevision),this.durableRestoreProtected=!1,this.forceDurableOwnerRestore=!0,this.durablePersistence.resetRestoreScope()}if(this.durableRestoreProtected){this.durableRestoreProtected=!1;let t=this.snapshot(e,la(this.latestDraftRevision),this.committedDraftRevision);this.latestDraftRevision=t.draftRevision,this.persistSnapshot(e,t);return}let i=this.snapshot(e,this.latestDraftRevision,this.committedDraftRevision),a=this.forceDurableOwnerRestore?0:this.latestDraftRevision;this.durablePersistence.restore({scope:n,committedRevision:this.committedDraftRevision,latestRevision:a,signature:Cc(e.chatMessage,e.chatAttachments??[],e.chatGoalDraftMode)},()=>({scope:this.resolveDurableScope(e),signature:Cc(e.chatMessage,e.chatAttachments??[],e.chatGoalDraftMode),revision:this.forceDurableOwnerRestore?0:this.latestDraftRevision}),t=>{let n=this.forceDurableOwnerRestore;this.forceDurableOwnerRestore=!1;let r=e.chatAttachments??[];e.chatMessage=yc(t.text),e.chatGoalDraftMode=t.goalMode??null,e.chatAttachments=t.attachments,j(r);let i=n?la(Math.max(this.latestDraftRevision,t.revision)):t.revision;this.committedDraftRevision=i,this.latestDraftRevision=i,this.lastPersisted=this.snapshot(e,i,i),Jc(e,e.sessionKey,{agentId:Ar(e,e.sessionKey).agentId,draft:e.chatMessage,goalMode:e.chatGoalDraftMode,draftRevision:i}),n&&this.lastPersisted.durable&&this.durablePersistence.persist({...this.lastPersisted.durable,expectedRevision:t.revision}),e.requestUpdate?.()},t=>{this.forceDurableOwnerRestore=!1,i.durable&&(e.chatMessage||e.chatGoalDraftMode||(e.chatAttachments?.length??0)>0)&&this.durablePersistence.persist({...i.durable,expectedRevision:t})})}readDraftRevisions(e,t=Ar(e,e.sessionKey)){return Uc(e,t)}}})))()}function ol(e){return z`
|
||
<div
|
||
class="chat-divider__rule"
|
||
role="separator"
|
||
aria-label=${e.metric?`${e.label}, ${e.metric}`:e.label}
|
||
>
|
||
<span class="chat-divider__line"></span>
|
||
<span class="chat-divider__label">
|
||
${e.icon?z`<span class="chat-divider__icon" aria-hidden="true"
|
||
>${yn[e.icon]}</span
|
||
>`:R}
|
||
<span class="chat-divider__title">${e.label}</span>
|
||
${e.metric?z`
|
||
<span class="chat-divider__separator" aria-hidden="true">·</span>
|
||
<span class="chat-divider__metric">${e.metric}</span>
|
||
`:R}
|
||
</span>
|
||
<span class="chat-divider__line"></span>
|
||
</div>
|
||
`}function sl(e,t){let n=e.action?.kind===`session-checkpoints`&&t?e.action:void 0;return z`
|
||
<div class="chat-divider" data-chat-row-key=${e.key} data-ts=${String(e.timestamp)}>
|
||
${ol(e)}
|
||
${e.description||n?z`
|
||
<div class="chat-divider__details">
|
||
${e.description?z`<span class="chat-divider__description">${e.description}</span>`:R}
|
||
${e.description&&n?z`<span class="chat-divider__details-separator" aria-hidden="true">·</span>`:R}
|
||
${n?z`
|
||
<button
|
||
type="button"
|
||
class="chat-divider__action"
|
||
@click=${()=>t?.()}
|
||
>
|
||
${n.label}
|
||
</button>
|
||
`:R}
|
||
</div>
|
||
`:R}
|
||
</div>
|
||
`}function cl(e){let t=e.text?z`
|
||
<div class="chat-text chat-notice__body" dir=${oa(e.text)}>
|
||
${gt(Da(e.text,{codeBlockChrome:`none`}))}
|
||
</div>
|
||
`:R;return z`
|
||
<div
|
||
class="chat-notice ${e.tone===`danger`?`chat-notice--danger callout danger`:``}"
|
||
data-chat-row-key=${e.key}
|
||
data-ts=${String(e.timestamp)}
|
||
role=${e.tone===`danger`?`alert`:R}
|
||
>
|
||
${e.label?ol({icon:e.icon,label:e.label}):R}
|
||
${e.collapsedBody&&e.text?z`
|
||
<details class="chat-notice__collapse">
|
||
<summary class="chat-notice__toggle">${Y(`chat.systemNotice.showContent`)}</summary>
|
||
${t}
|
||
</details>
|
||
`:t}
|
||
</div>
|
||
`}function ll(){return(ll=e((()=>{B(),yt(),Nn(),er(),K(),_i()})))()}function ul(e,t){return`${e}\0${t}`}function dl(e){let t=Ul.get(e);return t||(t={resources:new Map,children:new Set},Ul.set(e,t)),t}function fl(e,t){!t.owner&&t.children.size===0&&t.resources.size===0&&Ul.delete(e)}function pl(e,t){if(e.subscribers.delete(t),e.subscribers.size>0)return;e.refresh&&=(clearTimeout(e.refresh.timer),void 0);let n=ul(e.kind,e.cacheKey);Hl.get(n)===e&&Hl.delete(n),e.abortController?.abort(),e.abortController=void 0}function ml(e,t,n,r=t){let i=ul(e,t),a=Hl.get(i);if(a||(a={kind:e,cacheKey:t,value:void 0,pending:void 0,subscribers:new Set,retryAttempted:!1,unavailableAt:void 0,abortController:void 0,refresh:void 0},Hl.set(i,a)),n){let t=dl(n).resources,i=ul(e,r),o=t.get(i);o&&o!==a&&pl(o,n),t.set(i,a),a.subscribers.add(n)}return a}function hl(e){return Hl.get(ul(e.kind,e.cacheKey))===e}function gl(){return Kl}function _l(e){if(hl(e)){Kl=(Kl+1)%(2**53-1);for(let t of Array.from(e.subscribers))e.subscribers.has(t)&&t()}}function vl(e,t,n){if(e.refresh?.at===t||(e.refresh&&=(clearTimeout(e.refresh.timer),void 0),t===void 0||e.subscribers.size===0))return;let r={at:t,timer:setTimeout(()=>{!hl(e)||e.refresh!==r||(e.refresh=void 0,n())},Math.max(0,t-Date.now()))};e.refresh=r}function yl(e,t){let n=dl(t);if(n.owner!==e){if(n.owner){let e=n.owner,r=Ul.get(e);r&&(r.children.delete(t),fl(e,r))}dl(e).children.add(t),n.owner=e}}function bl(e){let t=e&&Ul.get(e);if(!(!e||!t)){Ul.delete(e);for(let e of t.children)bl(e);if(t.owner){let n=Ul.get(t.owner);n&&(n.children.delete(e),fl(t.owner,n))}for(let n of new Set(t.resources.values()))pl(n,e)}}function xl(){let e=[...Hl.entries()].filter(([,e])=>e.kind===`managed-image`&&e.value===null&&e.subscribers.size===0&&!e.pending);for(let[t]of e.slice(0,-64))Hl.delete(t)}function Sl(e){let t=Wl.get(e);if(t)return Wl.delete(e),Wl.set(e,t),t.url}function Cl(){for(;Wl.size>Gl;){let e=[...Wl].find(([,e])=>e.retainCount===0);if(!e)return;let[t,n]=e;Wl.delete(t);let r=ul(`managed-image`,t),i=Hl.get(r);i?.value===n.url&&i.subscribers.size===0&&Hl.delete(r),URL.revokeObjectURL(n.url)}}function wl(e){let t=Wl.get(e);if(!t)return;t.retainCount+=1;let n=!1;return()=>{if(n)return;n=!0;let t=Wl.get(e);t&&t.retainCount>0&&--t.retainCount,Cl()}}function Tl(e,t){let n=Wl.get(e);Wl.delete(e),Wl.set(e,{url:t,retainCount:n?.retainCount??0}),n&&n.url!==t&&URL.revokeObjectURL(n.url),Cl()}function El(e,t){e.some(e=>e.url===t.url&&e.alt===t.alt)||e.push(t)}function Dl(e){return e.data.startsWith(`data:`)?e.data:`data:${e.mediaType??`image/png`};base64,${e.data}`}function Ol(e,t){if(typeof t==`string`&&t.trim()){let e=t.trim().toLowerCase();if(e.startsWith(`image/`))return!0;if(e!==`application/octet-stream`)return!1}let n=Ya(e);return n!==void 0&&[`png`,`jpg`,`jpeg`,`gif`,`webp`,`bmp`,`svg`,`heic`,`heif`,`avif`].includes(n)}function kl(e,t){return(typeof t==`string`?t.split(`;`,1)[0]?.trim().toLowerCase():``)===`image/svg+xml`||Ya(e)===`svg`}function Al(e,t){if(typeof t==`string`&&t.trim().toLowerCase().startsWith(`audio/`))return!0;let n=Ya(e);return n!==void 0&&[`aac`,`flac`,`m2a`,`m4a`,`mp3`,`oga`,`ogg`,`opus`,`wav`].includes(n)}function jl(e,t){return typeof t==`string`&&t.trim().toLowerCase().startsWith(`video/`)?!0:oi(e)}function Ml(e){let t=e.trim();if(t.startsWith(ql)){let e=t.split(`/`).pop()?.trim()||t;return e.replace(Jl,``)||e}try{if(/^https?:\/\//i.test(t)){let e=new URL(t);return ii(t)?.trim()||e.hostname||t}}catch{}return t.split(/[\\/]/).pop()?.trim()||t}function Nl(e,t,n={}){if(typeof e!=`string`||!kl(e,t))return null;try{let t=new URL(e,window.location.href);if(t.protocol!==`http:`&&t.protocol!==`https:`||t.origin===window.location.origin)return null}catch{return null}let r=p(n.sizeBytes);return{type:`attachment`,attachment:{url:e,kind:`image`,label:typeof n.fileName==`string`&&n.fileName.trim()||typeof n.alt==`string`&&n.alt.trim()||Ml(e),mimeType:typeof t==`string`?t:`image/svg+xml`,...typeof n.artifactId==`string`?{artifactId:n.artifactId}:{},...r===void 0?{}:{sizeBytes:r}}}}function Pl(e){let t=x(e).content;if(!Array.isArray(t))return[];let n=[],r=e=>{e&&!n.some(t=>t.attachment.url===e.attachment.url)&&n.push(e)};for(let e of t){if(!e||typeof e!=`object`)continue;let t=x(e);if(t.type===`image`){let e=f(t.source);r(Nl(t.url,t.mimeType??e?.media_type,t))}else if(t.type===`image_url`)r(Nl(f(t.image_url)?.url,void 0));else if(t.type===`input_image`){let e=t.image_url,n=f(t.source);r(Nl(typeof e==`string`?e:f(e)?.url,void 0)),r(Nl(n?.url,n?.media_type))}}return n}function Fl(e){let t=e.content,n=[];if(Array.isArray(t))for(let e of t){if(typeof e!=`object`||!e)continue;let t=e;if(t.type===`image`){let e=t.source,r={artifactId:typeof t.artifactId==`string`?t.artifactId:void 0,alt:typeof t.alt==`string`?t.alt:void 0,fileName:typeof t.fileName==`string`?t.fileName:void 0,openUrl:typeof t.openUrl==`string`?t.openUrl:void 0,sizeBytes:p(t.sizeBytes),width:typeof t.width==`number`?t.width:void 0,height:typeof t.height==`number`?t.height:void 0};e?.type===`base64`&&typeof e.data==`string`?El(n,{url:Dl({data:e.data,mediaType:typeof e.media_type==`string`?e.media_type:void 0}),...r}):typeof t.data==`string`?El(n,{url:Dl({data:t.data,mediaType:typeof t.mimeType==`string`?t.mimeType:void 0}),...r}):typeof t.url==`string`&&!Nl(t.url,t.mimeType??e?.media_type,t)&&El(n,{url:t.url,...r})}else if(t.type===`image_url`){let e=t.image_url;typeof e?.url==`string`&&!Nl(e.url,void 0)&&El(n,{url:e.url})}else if(t.type===`input_image`){let e=t.image_url;if(typeof e==`string`&&!Nl(e,void 0))El(n,{url:e});else if(e&&typeof e==`object`){let t=e.url;typeof t==`string`&&!Nl(t,void 0)&&El(n,{url:t})}let r=t.source;typeof r?.url==`string`&&!Nl(r.url,r.media_type)?El(n,{url:r.url}):typeof r?.data==`string`&&El(n,{url:Dl({data:r.data,mediaType:typeof r.media_type==`string`?r.media_type:void 0})})}else if(t.type===`openclaw_pairing_qr`){if(Ll(t))continue;let e=t.image_url;typeof e==`string`&&El(n,{url:e,alt:typeof t.alt==`string`?t.alt:void 0})}}for(let{path:t,mediaType:r,fileName:i,sizeBytes:a}of pi(e))!Ol(t,r)||kl(t,r)||El(n,{url:t,fileName:i,sizeBytes:a});return n}function Il(e){return p(e.expiresAtMs)}function Ll(e,t=Date.now()){let n=Il(e);return n!==void 0&&n<=t}function Rl(e,t=Date.now()){let n=e.content;if(!Array.isArray(n))return[];let r=[];for(let e of n){if(!e||typeof e!=`object`)continue;let n=e;n.type===`openclaw_pairing_qr`&&Ll(n,t)&&r.push({title:Y(`chat.pairingQrExpired.title`),reason:Y(`chat.pairingQrExpired.reason`)})}return r}function zl(e,t=Date.now()){let n=e.content;if(!Array.isArray(n))return;let r;for(let e of n){if(!e||typeof e!=`object`)continue;let n=e;if(n.type!==`openclaw_pairing_qr`)continue;let i=Il(n);i===void 0||i<=t||(r=r===void 0?i:Math.min(r,i))}return r}function Bl(e,t,n){if(!n)return;let r=zl(t);if(r===void 0){let t=Ul.get(n),r=ul(`pairing-qr`,e),i=t?.resources.get(r);t&&i&&(t.resources.delete(r),pl(i,n),fl(n,t));return}let i=ml(`pairing-qr`,e,n);vl(i,r,()=>_l(i))}function Vl(e){let t=[];for(let{path:n,mediaType:r,fileName:i,sizeBytes:a,durationMs:o,width:s,height:c}of pi(e)){let e=Ol(n,r),l=e&&kl(n,r);if(e&&!l)continue;let u=l?`image`:Al(n,r)?`audio`:jl(n,r)?`video`:`document`;t.push({type:`attachment`,attachment:{url:n,kind:u,label:i?.trim()||Ml(n),...typeof r==`string`?{mimeType:r}:{},...a===void 0?{}:{sizeBytes:a},...o===void 0?{}:{durationMs:o},...s===void 0?{}:{width:s},...c===void 0?{}:{height:c}}})}return t}var Hl,Ul,Wl,Gl,Kl,ql,Jl;function Yl(){return(Yl=e((()=>{b(),K(),ti(),mi(),Hl=new Map,Ul=new Map,Wl=new Map,Gl=64,Kl=0,ql=`media://inbound/`,Jl=/---[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}(?=\.[^./]*$|$)/i})))()}function Xl(e){try{return ke()?.getItem(e)===`1`}catch{return!1}}function Zl(e,t){let n=cu.get(e);if(n){n(t);return}e.remove()}function Ql(e){for(let t of uu){let n=lu.get(t);n&&e instanceof Node&&e.contains(n)&&Zl(t)}}function $l(){let e=window.visualViewport,t=e?.offsetLeft??0,n=e?.offsetTop??0,r=e?.width??window.innerWidth??document.documentElement.clientWidth;return{bottom:n+(e?.height??window.innerHeight??document.documentElement.clientHeight),left:t,right:t+r,top:n}}function eu(e,t,n){return n<t?t:Math.min(Math.max(e,t),n)}function tu(e,t){let n=e.getBoundingClientRect(),r=t.getBoundingClientRect(),i=$l(),a=ou,o=su,s=i.right-i.left,c=i.bottom-i.top,l=Math.min(r.width,s-16),u=Math.min(r.height,c-16),d=n.top-i.top-a-o,f=i.bottom-n.bottom-a-o,p=d<u&&f>=d,m=eu(n.right-l,i.left+a,i.right-a-l),h=eu(p?n.bottom+o:n.top-o-u,i.top+a,i.bottom-a-u);t.style.left=`${Math.round(m)}px`,t.style.top=`${Math.round(h)}px`,t.dataset.placement=p?`below`:`above`}function nu(e,t){let n=Y(`chat.messages.rewind`),r={action:e,confirmLabel:n,confirmText:Y(`chat.messages.rewindConfirm`),preferenceName:au};return z`
|
||
<span class="chat-confirm-wrap chat-rewind-wrap">
|
||
<openclaw-tooltip .content=${t?Y(`chat.messages.rewindUnavailable`):n}>
|
||
<button
|
||
class="chat-group-rewind"
|
||
aria-label=${n}
|
||
?disabled=${t}
|
||
@click=${e=>iu(e.currentTarget,r)}
|
||
>
|
||
${q.refresh}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</span>
|
||
`}function ru(e,t){iu(e,{action:t,confirmLabel:Y(`chat.messages.rewind`),confirmText:Y(`chat.messages.rewindConfirm`),preferenceName:au})}function iu(e,t){if(Xl(t.preferenceName)){t.action();return}let n=e.closest(`.chat-confirm-wrap`);if(!n)return;let r=n,i=du.get(r);if(i){Zl(i,{restoreFocus:!0});return}let a=document.createElement(`div`);a.className=`chat-confirm-popover`,a.setAttribute(`role`,`dialog`),a.setAttribute(`aria-modal`,`true`),a.setAttribute(`aria-label`,t.confirmText),a.innerHTML=`
|
||
<p class="chat-confirm-popover__text"></p>
|
||
<label class="chat-confirm-popover__remember">
|
||
<input type="checkbox" class="chat-confirm-popover__check" />
|
||
<span></span>
|
||
</label>
|
||
<div class="chat-confirm-popover__actions">
|
||
<button class="chat-confirm-popover__cancel" type="button"></button>
|
||
<button class="chat-confirm-popover__yes" type="button"></button>
|
||
</div>
|
||
`;let o=a.querySelector(`.chat-confirm-popover__text`),s=a.querySelector(`.chat-confirm-popover__remember span`),c=a.querySelector(`.chat-confirm-popover__cancel`),l=a.querySelector(`.chat-confirm-popover__yes`);o&&(o.textContent=t.confirmText),l&&(l.textContent=t.confirmLabel),s&&(s.textContent=Y(`chat.messages.dontAskAgain`)),c&&(c.textContent=Y(`common.cancel`)),r.ownerDocument.body.appendChild(a),lu.set(a,r),uu.add(a),du.set(r,a),tu(e,a);let u=a.querySelector(`.chat-confirm-popover__cancel`),d=a.querySelector(`.chat-confirm-popover__yes`),f=a.querySelector(`.chat-confirm-popover__check`),p=!1,m=null;function h(t){p||(p=!0,m?.disconnect(),document.removeEventListener(`click`,g,!0),document.removeEventListener(`contextmenu`,_,!0),window.removeEventListener(`keydown`,v,!0),cu.delete(a),lu.delete(a),uu.delete(a),du.delete(r),a.remove(),t?.restoreFocus&&e.isConnected&&e.focus({preventScroll:!0}))}function g(t){let n=t.target;n instanceof Node&&!a.contains(n)&&!e.contains(n)&&h()}function _(e){let t=e.target;t instanceof Node&&!a.contains(t)&&h()}function v(e){e.key!==`Escape`||!a.contains(document.activeElement)||(e.preventDefault(),e.stopImmediatePropagation(),h({restoreFocus:!0}))}function y(e){if(e.key!==`Tab`)return;let t=f,n=d;e.shiftKey&&document.activeElement===t?(e.preventDefault(),n.focus()):!e.shiftKey&&document.activeElement===n&&(e.preventDefault(),t.focus())}cu.set(a,h),u.addEventListener(`click`,()=>h({restoreFocus:!0})),d.addEventListener(`click`,()=>{if(f.checked)try{ke()?.setItem(t.preferenceName,`1`)}catch{}h(),t.action()}),a.addEventListener(`keydown`,y),document.addEventListener(`contextmenu`,_,!0),window.addEventListener(`keydown`,v,!0),m=new MutationObserver(()=>{(!n.isConnected||!e.isConnected)&&h()}),m.observe(n.ownerDocument.body,{childList:!0,subtree:!0}),u.focus({preventScroll:!0}),requestAnimationFrame(()=>{!p&&a.isConnected&&(tu(e,a),document.addEventListener(`click`,g,!0))})}var au,ou,su,cu,lu,uu,du;function fu(){return(fu=e((()=>{B(),J(),K(),au=`openclaw:skip-rewind-confirm`,ou=8,su=6,cu=new WeakMap,lu=new WeakMap,uu=new Set,du=new WeakMap})))()}function pu(e,t=!1){let n=e.colorSeed%360;return z`
|
||
<span
|
||
class="chat-author-avatar__initials ${t?`chat-author-avatar__fallback`:``}"
|
||
style=${`--chat-author-avatar-hue: ${n}`}
|
||
aria-hidden="true"
|
||
>
|
||
${e.initials}
|
||
</span>
|
||
`}function mu(e){return e.imageUrl?z`
|
||
${aa({view:e,fallbackSelector:`.chat-author-avatar`,className:`chat-author-avatar__image`,ariaHidden:!0})}${pu(e.fallback,!0)}
|
||
`:pu(e.fallback)}function hu(e){let t=po(e);if(!e||!t)return R;let n=gi(e),r=mu(n);return z`<span
|
||
class=${ea(`chat-author-avatar`,n)}
|
||
role="img"
|
||
aria-label=${t}
|
||
title=${t}
|
||
>
|
||
${r}
|
||
</span>`}function gu(){return(gu=e((()=>{B(),Xi(),ko()})))()}function _u(e,t){let n=Ya(e),r=t?.split(`;`,1)[0]?.trim().toLowerCase(),i=(n?xu.find(e=>e.extensions.includes(n)):void 0)??(r?xu.find(e=>e.mimeTypes.includes(r)):void 0)??Su,a=n?i.compactByExtension?.[n]??i.compact:i.compact,o=(n?i.accentByExtension?.[n]:void 0)??(r?i.accentByMimeType?.[r]:void 0)??i.accent;return{family:i.family,accent:o,extension:n,extensionLabel:n?.toUpperCase()??(i.family===`unknown`?`FILE`:i.family.toUpperCase()),compact:a}}function vu(e){return Mt(`file-icons/${e}.svg`)}function yu(e){bu??=c(()=>Promise.resolve({}),__vite__mapDeps([24]),import.meta.url);let t=_u(e.filename,e.mimeType),n=t.compact?vu(`compact/light/${t.compact}`):vu(`compact/unknown-light`),r=t.compact?vu(`compact/dark/${t.compact}`):vu(`compact/unknown-dark`);return z`<span
|
||
class="chat-attachment-file-icon ${e.unavailable?`chat-attachment-file-icon--unavailable`:``}"
|
||
data-family=${t.family}
|
||
data-mode=${e.mode}
|
||
aria-hidden="true"
|
||
style=${st({"--chat-file-icon-shell-light":`url("${vu(`large/shell-light`)}")`,"--chat-file-icon-shell-dark":`url("${vu(`large/shell-dark`)}")`,"--chat-file-icon-overlay":`url("${vu(`overlays/${t.family}`)}")`,"--chat-file-icon-accent":t.accent,"--chat-file-icon-compact-light":`url("${n}")`,"--chat-file-icon-compact-dark":`url("${r}")`})}
|
||
>
|
||
<span class="chat-attachment-file-icon__large">
|
||
<span class="chat-attachment-file-icon__overlay"></span>
|
||
</span>
|
||
<span class="chat-attachment-file-icon__compact"></span>
|
||
</span>`}var bu,xu,Su;function Cu(){return(Cu=e((()=>{B(),it(),At(),mi(),u(),xu=[{family:`unknown`,accent:`#929292`,extensions:[],mimeTypes:[`application/octet-stream`]},{family:`pdf`,accent:`#E94B64`,extensions:[`pdf`],mimeTypes:[`application/pdf`],compact:`pdf`},{family:`document`,accent:`#5B7FD6`,extensions:[`doc`,`docx`,`rtf`,`odt`,`pages`],mimeTypes:[`application/msword`,`application/vnd.openxmlformats-officedocument.wordprocessingml.document`,`application/rtf`,`text/rtf`,`application/vnd.oasis.opendocument.text`],compact:`docx`,compactByExtension:{rtf:`rtf`}},{family:`spreadsheet`,accent:`#3FA66B`,extensions:[`csv`,`xls`,`xlsx`,`ods`,`numbers`],mimeTypes:[`text/csv`,`application/vnd.ms-excel`,`application/vnd.openxmlformats-officedocument.spreadsheetml.sheet`,`application/vnd.oasis.opendocument.spreadsheet`],compact:`xlsx`,compactByExtension:{csv:`csv`}},{family:`image`,accent:`#3FA66B`,extensions:[`gif`,`jpg`,`jpeg`,`png`,`webp`,`avif`,`heic`],mimeTypes:[`image/gif`,`image/jpeg`,`image/png`,`image/webp`,`image/avif`,`image/heic`],compact:`png`,compactByExtension:{gif:`gif`,jpg:`jpg`,jpeg:`jpg`}},{family:`video`,accent:`#E94B64`,extensions:[`mp4`,`mov`,`m4v`,`webm`,`mkv`],mimeTypes:[`video/mp4`,`video/quicktime`,`video/webm`,`video/x-matroska`],compact:`mp4`},{family:`audio`,accent:`#E86672`,extensions:[`mp3`,`wav`,`m4a`,`aac`,`flac`,`ogg`],mimeTypes:[`audio/mpeg`,`audio/wav`,`audio/x-wav`,`audio/mp4`,`audio/aac`,`audio/flac`,`audio/ogg`],compact:`wav`,compactByExtension:{mp3:`mp3`}},{family:`archive`,accent:`#8B7CF6`,extensions:[`zip`,`rar`,`7z`,`tar`,`gz`,`tgz`,`bz2`],mimeTypes:[`application/zip`,`application/x-rar-compressed`,`application/x-7z-compressed`,`application/x-tar`,`application/gzip`],compact:`zip`},{family:`text`,accent:`#5B7FD6`,extensions:[`txt`,`log`],mimeTypes:[`text/plain`],compact:`txt`},{family:`markdown`,accent:`#5B7FD6`,extensions:[`md`,`mdx`,`markdown`],mimeTypes:[`text/markdown`,`text/x-markdown`],compact:`md`},{family:`code`,accent:`#E76F3C`,accentByExtension:{css:`#8B7CF6`},accentByMimeType:{"text/css":`#8B7CF6`},extensions:[`css`,`html`,`htm`,`xml`,`jsx`,`tsx`,`ts`,`sh`,`bash`,`zsh`],mimeTypes:[`text/css`,`text/html`,`application/xml`,`text/xml`,`application/typescript`,`text/x-shellscript`],compact:`html`,compactByExtension:{css:`css`,xml:`xml`}},{family:`javascript`,accent:`#F2A93B`,extensions:[`js`,`cjs`,`mjs`],mimeTypes:[`text/javascript`,`application/javascript`],compact:`js`},{family:`json`,accent:`#F2A93B`,extensions:[`json`,`jsonl`,`geojson`],mimeTypes:[`application/json`,`application/ld+json`,`application/x-ndjson`,`application/geo+json`],compact:`json`},{family:`python`,accent:`#F2A93B`,extensions:[`py`,`pyw`,`pyi`],mimeTypes:[`text/x-python`,`application/x-python-code`],compact:`py`},{family:`svg`,accent:`#E76F3C`,extensions:[`svg`,`svgz`],mimeTypes:[`image/svg+xml`],compact:`svg`},{family:`yaml`,accent:`#E86672`,extensions:[`yaml`,`yml`],mimeTypes:[`application/yaml`,`text/yaml`,`application/x-yaml`,`text/x-yaml`],compact:`yaml`}],Su=xu[0]})))()}function wu(e){return z`<div
|
||
class="chat-assistant-attachment-card chat-assistant-attachment-card--compact"
|
||
?data-openable=${!!e.onExpand}
|
||
@click=${t=>Tu(t,e.onExpand)}
|
||
>
|
||
${Ou({...e,visualMode:`large-placeholder`})}
|
||
</div>`}function Tu(e,t){if(!t||e.defaultPrevented)return;let n=e.target,r=e.currentTarget;if(n instanceof Element&&r instanceof Element){let e=n.closest(ku);if(e&&r.contains(e))return}t()}function Eu(e,t,n){return e===`audio`?Y(`chat.attachments.audio`):e===`video`?Y(`chat.attachments.video`):e===`image`?Y(`chat.attachments.attachedFile`):_u(t,n).extensionLabel}function Du(e){return yu({filename:e.label,mimeType:e.mimeType,mode:e.visualMode??`large-placeholder`,unavailable:e.unavailable})}function Ou(e){let t=e.visualMode===`preview-with-favicon`,n=e.sizeBytes===void 0?void 0:re(e.sizeBytes),r=[Eu(e.kind,e.label,e.mimeType),n].filter(Boolean).join(` · `),i=Y(`chat.mediaPlayer.download`,{filename:e.label}),a=e.onExpand!==void 0,o=e.expandLabel??Y(`chat.attachments.expand`,{filename:e.label}),s=`chat-assistant-attachment-card__action chat-assistant-attachment-card__download chat-assistant-attachment-card__download--ghost ${a?`chat-assistant-attachment-card__download--secondary`:``}`;return z`
|
||
<div
|
||
class="chat-assistant-attachment-card__header ${t?`chat-assistant-attachment-card__header--preview`:``}"
|
||
>
|
||
<div class="chat-assistant-attachment-card__identity">
|
||
${Du({label:e.label,mimeType:e.mimeType,visualMode:e.visualMode})}
|
||
<span
|
||
class="chat-assistant-attachment-card__details ${t?`chat-assistant-attachment-card__details--preview`:``}"
|
||
>
|
||
<span class="chat-assistant-attachment-card__title" title=${e.label}
|
||
>${e.label}</span
|
||
>
|
||
${t?n?z`<span class="chat-assistant-attachment-card__separator" aria-hidden="true"
|
||
>·</span
|
||
><span class="chat-assistant-attachment-card__meta">${n}</span>`:null:z`<span class="chat-assistant-attachment-card__meta">${r}</span>`}
|
||
</span>
|
||
</div>
|
||
<span class="chat-assistant-attachment-card__actions">
|
||
${e.voiceNote&&!t?z`<span class="chat-assistant-attachment-badge"
|
||
>${Y(`chat.messages.voiceNote`)}</span
|
||
>`:null}
|
||
${e.downloadHref?z`<a
|
||
class=${s}
|
||
href=${e.downloadHref}
|
||
download=${e.label}
|
||
target="_blank"
|
||
rel="noreferrer"
|
||
aria-label=${i}
|
||
title=${i}
|
||
>${q.download}</a
|
||
>`:null}
|
||
${a?z`<button
|
||
type="button"
|
||
class="chat-assistant-attachment-card__action ${t?`chat-assistant-attachment-card__expand--icon`:`chat-assistant-attachment-card__action--labeled`} chat-assistant-attachment-card__expand"
|
||
aria-label=${o}
|
||
title=${o}
|
||
@click=${e.onExpand}
|
||
>
|
||
${t?q.chevronsUpDown:z`<span>${Y(`chat.attachments.open`)}</span>`}
|
||
</button>`:null}
|
||
</span>
|
||
</div>
|
||
`}var ku;function Au(){return(Au=e((()=>{B(),J(),K(),Ve(),Cu(),ku=`a, button, input, select, textarea, audio, video, iframe, [contenteditable='true'], [tabindex], [role='button']`})))()}function ju(e){let t=e.trim();if(t){if(t.startsWith(`/`)&&!t.startsWith(`//`)&&!t.startsWith(`/\\`))return t;try{return Nu.has(new URL(t).protocol.toLowerCase())?t:void 0}catch{return}}}function Mu(e,t){let n=e.trim(),r=Pu.exec(n),i=r?.[2];return i===void 0?ju(n):(!t||r?.[1]?.toLowerCase()===t)&&i.length%4==0?n:void 0}var Nu,Pu;function Fu(){return(Fu=e((()=>{Nu=new Set([`http:`,`https:`,`blob:`]),Pu=/^data:(audio|video)\/[a-z0-9!#$&^_.+-]+;base64,([a-z0-9+/]+={0,2})$/i})))()}function Iu(e,t){if(typeof IntersectionObserver!=`function`)return t(),()=>void 0;let n=new IntersectionObserver(e=>{e.some(e=>e.isIntersecting)&&(n.disconnect(),t())},{rootMargin:Ru});return n.observe(e),()=>n.disconnect()}function Lu(e){if(!(e instanceof HTMLElement))return;let t=()=>{let t=e.scrollWidth>e.clientWidth+1;e.dataset.scrollable=String(t),e.dataset.atStart=String(!t||e.scrollLeft<=1),e.dataset.atEnd=String(!t||e.scrollLeft+e.clientWidth>=e.scrollWidth-1)};t(),requestAnimationFrame(t)}var Ru;function zu(){return(zu=e((()=>{Ru=`240px 0px`})))()}function Bu(e,t){if(Uu?.media===e){Uu.onSuperseded=t;return}Uu?.onSuperseded(),Uu?.media.pause(),Uu={media:e,onSuperseded:t}}function Vu(e){Uu?.media===e&&(Uu=null)}function Hu(e){return Uu===null||Uu.media===e}var Uu;function Wu(){return(Wu=e((()=>{Uu=null})))()}function Gu(e){return e.durationSeconds!==void 0&&Number.isFinite(e.durationSeconds)&&e.durationSeconds>=0&&e.durationSeconds<=td&&(e.sizeBytes===void 0||Number.isFinite(e.sizeBytes)&&e.sizeBytes>=0&&e.sizeBytes<=8388608)}function Ku(e){return Number.isFinite(e.sizeBytes)&&e.sizeBytes>=0&&e.sizeBytes<=8388608&&e.durationSeconds!==void 0&&Number.isFinite(e.durationSeconds)&&e.durationSeconds>=0&&e.durationSeconds<=td}function qu(e,t=nd){let n=Math.max(1,Math.floor(t));if(e.length<=0||e.numberOfChannels<=0)return Array.from({length:n},()=>0);let r=Array.from({length:e.numberOfChannels},(t,n)=>e.getChannelData(n)),i=Array.from({length:n},()=>0);for(let t=0;t<n;t+=1){let a=Math.floor(t*e.length/n),o=Math.max(a+1,Math.floor((t+1)*e.length/n)),s=0;for(let e of r)for(let t=a;t<Math.min(o,e.length);t+=1)s=Math.max(s,Math.abs(e[t]??0));i[t]=s}let a=Math.max(...i);return a>0?i.map(e=>e/a):i}function Ju(){for(;rd.size>id||[...rd.values()].reduce((e,t)=>e+t.sizeBytes,0)>ad;){let e=[...rd].find(([,e])=>e.retainCount===0);if(!e)return;let[t,n]=e;rd.delete(t),URL.revokeObjectURL(n.blobUrl)}}function Yu(e){if(e>ad)return!1;let t=()=>[...rd.values()].reduce((e,t)=>e+t.sizeBytes,0);for(;rd.size+1>id||t()+e>ad;){let e=[...rd].find(([,e])=>e.retainCount===0);if(!e)return!1;let[t,n]=e;rd.delete(t),URL.revokeObjectURL(n.blobUrl)}return!0}function Xu(e,t){t.retainCount+=1;let n=!1;return{value:t,release:()=>{if(n)return;n=!0;let t=rd.get(e);t&&t.retainCount>0&&--t.retainCount,Ju()}}}function Zu(e){let t=rd.get(e);return t?(rd.delete(e),rd.set(e,t),Xu(e,t)):null}function Qu(e,t){let n=rd.get(e);if(n)return n.blobUrl!==t.blobUrl&&URL.revokeObjectURL(t.blobUrl),Zu(e);if(!Yu(t.sizeBytes))return URL.revokeObjectURL(t.blobUrl),null;let r={...t,retainCount:0};return rd.set(e,r),Xu(e,r)}var $u,ed,td,nd,rd,id,ad;function od(){return(od=e((()=>{$u=8388608,ed=16e3,td=300,nd=96,rd=new Map,id=32,ad=50331648})))()}function sd(e){let t=e.trim();return/^\/(?:__openclaw__|media|api\/chat\/media\/outgoing)\//.test(t)?!1:cd(t)||/^file:/iu.test(t)||t.startsWith(`~`)||t.startsWith(`/`)||/^[a-zA-Z]:[\\/]/.test(t)}function cd(e){let t=/^media:\/\/inbound\/([^/?#]+)$/i.exec(e.trim());if(!t?.[1])return!1;try{let e=decodeURIComponent(t[1]);return e!==`.`&&e!==`..`&&!e.includes(`/`)&&!e.includes(`\\`)&&!e.includes(`\0`)}catch{return!1}}function ld(e){let t=e.trim();if(!sd(t)||cd(t))return null;if(/^file:/iu.test(t))try{let e=new URL(t);if(e.hostname||/%2f|%5c/iu.test(e.pathname))return null;let n=decodeURIComponent(e.pathname);return/^\/[a-zA-Z]:\//.test(n)?n.slice(1):n}catch{return null}return t.startsWith(`~`)?null:t}function ud(e){let t=new Set;for(let n of e){let e=dd(n.trim()),r=e.match(/^(\/Users\/[^/]+|\/home\/[^/]+)(?:\/|$)/);if(r?.[1]){t.add(r[1]);continue}let i=e.match(/^([a-z]:\/Users\/[^/]+)(?:\/|$)/i);i?.[1]&&t.add(i[1])}return[...t]}function dd(e){let t=e.replace(/\\/g,`/`).replace(/\/+$/,``);return/^\/[a-zA-Z]:\//.test(t)&&(t=t.slice(1)),/^[a-zA-Z]:\//.test(t)?t.toLowerCase():t}function fd(e,t){if(cd(e))return!0;let n=ld(e),r=n?[dd(n)]:e.trim().startsWith(`~`)?ud(t).map(t=>dd(e.trim().replace(/^~(?=$|[\\/])/,()=>t))):[];return r.length!==0&&t.some(e=>{let t=dd(e.trim());return t.length>0&&r.some(e=>e===t||e.startsWith(`${t}/`))})}function pd(e,t,n){return sd(e)?Ua(e,t,n):e}function md(e,t,n){let r=e.trim();if(!r)return r;let i=r.indexOf(`#`),a=i===-1?``:r.slice(i),o=i===-1?r:r.slice(0,i),s=o.indexOf(`?`),c=s===-1?o:o.slice(0,s),l=new URLSearchParams(s===-1?``:o.slice(s+1));return l.set(t,n),`${c}?${l.toString()}${a}`}function hd(){return(hd=e((()=>{ga()})))()}function gd(e){return e.reason instanceof Error?e.reason:new DOMException(`playback preparation aborted`,`AbortError`)}function _d(e){return md(e,`playback`,`1`)}function vd(e){let t=new Headers,n=e?.trim();return n&&t.set(`Authorization`,`Bearer ${n}`),t}function yd(e,t){return t.aborted?Promise.reject(gd(t)):new Promise((n,r)=>{let i=()=>{clearTimeout(a),r(gd(t))},a=setTimeout(()=>{t.removeEventListener(`abort`,i),n()},e);t.addEventListener(`abort`,i,{once:!0})})}async function bd(e){let{fetchImpl:t}=e,n=new AbortController,r,i=new Promise((e,t)=>{r=t}),a=()=>{let t=gd(e.signal);n.abort(t),r?.(t)};e.signal.addEventListener(`abort`,a,{once:!0}),e.signal.aborted&&a();let o=setTimeout(()=>{let e=new DOMException(`playback readiness request timed out`,`TimeoutError`);n.abort(e),r?.(e)},e.timeoutMs);try{return await Promise.race([t(e.source,{method:`HEAD`,headers:e.headers,credentials:`same-origin`,signal:n.signal}),i])}finally{clearTimeout(o),e.signal.removeEventListener(`abort`,a)}}async function xd(e){let t=e.fetchImpl??fetch,n=e.retryDelaysMs??Sd,r=e.waitImpl??yd,i=vd(e.authToken);i.set(`Accept`,`audio/*, video/*`);let a=Date.now()+wd;for(let o=0;;o+=1){if(e.signal.aborted)return`aborted`;try{let s=a-Date.now();if(s<=0)return`unavailable`;let c=await bd({source:e.source,headers:i,signal:e.signal,timeoutMs:Math.min(e.requestTimeoutMs??Cd,s),fetchImpl:t});if(c.status!==202)return c.ok?`ready`:`unavailable`;e.onPreparing?.();let l=n[o];if(l===void 0)return`unavailable`;let u=a-Date.now();if(u<=0)return`unavailable`;await r(Math.min(l,u),e.signal)}catch{return e.signal.aborted?`aborted`:`unavailable`}}}var Sd,Cd,wd;function Td(){return(Td=e((()=>{hd(),Sd=[2e3,4e3,8e3,16e3,3e4,3e4,2e4],Cd=3e4,wd=12e4})))()}function Ed(e){return Number.isFinite(e)&&e>0?e:0}var Dd;function Od(){return(Od=e((()=>{Td(),Dd=class{constructor(){this.appliedSource=``,this.appliedIdentity=``,this.pendingSource=``,this.pendingIdentity=``,this.restore=null,this.sourceFailed=!1,this.authorizationKey=``,this.readinessRequest=null,this.playbackSource=``,this.playbackReadiness=`idle`}get currentIdentity(){return this.appliedIdentity}get readySource(){return this.playbackSource}get readiness(){return this.playbackReadiness}sync(e,t,n,r,i){let a=t.trim(),o=n.trim(),s=i?.trim()??``;if(!a||!o)return null;let c=`${o}\0${s}`;this.authorizationKey&&c!==this.authorizationKey&&this.reset(e),this.authorizationKey=c;let l=r===`transcode`?_d(a):a;if(r!==`transcode`)return this.abortReadiness(),this.sourceFailed=!1,this.playbackReadiness=`ready`,this.playbackSource=l,this.updateSource(e,l,o),null;let u=[l,o,s].join(`\0`);if(u===this.readinessRequest?.key)return this.playbackSource===l&&this.updateSource(e,l,o),this.readinessRequest.promise;this.abortReadiness();let d=new AbortController,f=()=>this.appliedIdentity===o&&!this.sourceFailed;this.playbackSource=``,this.playbackReadiness=f()?`ready`:`preparing`;let p=xd({source:l,authToken:s||null,signal:d.signal}).then(t=>{if(this.readinessRequest?.controller===d&&t!==`aborted`){if(t!==`ready`){f()?(this.playbackSource=this.appliedSource,this.playbackReadiness=`ready`):this.playbackReadiness=`unavailable`;return}this.playbackSource=l,this.playbackReadiness=`ready`,this.updateSource(e,l,o)}});return this.readinessRequest={key:u,controller:d,promise:p},p}cancel(){this.abortReadiness(),this.cancelPendingResume(),this.playbackSource=``,this.playbackReadiness=`idle`}updateSource(e,t,n=t){let r=t.trim(),i=n.trim();if(!(!r||!i)){if(this.playbackReadiness=`ready`,this.appliedIdentity&&i!==this.appliedIdentity){e.paused||e.pause(),this.applySource(e,r,i,null);return}if(!(r===this.pendingSource&&i===this.pendingIdentity||r===this.appliedSource&&i===this.appliedIdentity)){if(e.error){this.applySource(e,r,i,{currentTime:Ed(e.currentTime),paused:e.paused});return}if(!this.appliedSource||e.ended||e.paused&&Ed(e.currentTime)===0){this.applySource(e,r,i,null);return}this.pendingSource=r,this.pendingIdentity=i}}}handleEnded(e){return this.pendingSource?(this.applySource(e,this.pendingSource,this.pendingIdentity,null),!0):!1}handleError(e){return this.pendingSource?(this.applySource(e,this.pendingSource,this.pendingIdentity,{currentTime:Ed(e.currentTime),paused:e.paused}),!0):(this.sourceFailed=!0,this.playbackSource=``,this.playbackReadiness=`unavailable`,!1)}applyPendingSource(e){return this.pendingSource?(this.applySource(e,this.pendingSource,this.pendingIdentity,{currentTime:Ed(e.currentTime),paused:e.paused}),!0):!1}seek(e,t){let n=Math.max(0,Ed(t));try{return e.currentTime=n,!0}catch{return this.pendingSource?(this.applySource(e,this.pendingSource,this.pendingIdentity,{currentTime:n,paused:e.paused}),!0):!1}}cancelPendingResume(){this.restore&&!this.restore.paused&&(this.restore={...this.restore,paused:!0})}reset(e){e.paused||e.pause(),this.appliedSource=``,this.appliedIdentity=``,this.pendingSource=``,this.pendingIdentity=``,this.restore=null,this.sourceFailed=!1,this.playbackSource=``,e.removeAttribute(`src`),e.load()}handleLoadedMetadata(e,t=()=>!0){this.sourceFailed=!1;let n=this.restore;if(!n)return;this.restore=null;let r=Number.isFinite(e.duration)?e.duration:n.currentTime;e.currentTime=Math.min(n.currentTime,Math.max(0,r)),!n.paused&&e.isConnected&&t()&&e.play().catch(()=>void 0)}applySource(e,t,n,r){this.appliedSource=t,this.appliedIdentity=n,this.pendingSource=``,this.pendingIdentity=``,this.restore=r,this.sourceFailed=!1,e.src=t}abortReadiness(){this.readinessRequest?.controller.abort(),this.readinessRequest=null}}})))()}async function kd(e,t){let n=e.headers.get(`Content-Length`),r=n===null?void 0:Number(n);if(r!==void 0&&Number.isFinite(r)&&r>t)return await e.body?.cancel().catch(()=>void 0),null;let i=e.body?.getReader();if(!i)return null;let a=[],o=0;try{for(;;){let{done:e,value:n}=await i.read();if(e)break;if(o+=n.byteLength,o>t)return await i.cancel().catch(()=>void 0),null;a.push(n)}}finally{i.releaseLock()}let s=new Uint8Array(o),c=0;for(let e of a)s.set(e,c),c+=e.byteLength;return s.buffer}function Ad(e){if(!Number.isFinite(e)||e<0)return`0:00`;let t=Math.floor(e),n=Math.floor(t/60),r=t%60;return`${n}:${String(r).padStart(2,`0`)}`}var jd,Md,Nd,X;function Pd(){return(Pd=e((()=>{B(),ut(),V(),it(),J(),K(),Pe(),Au(),Fu(),zu(),Wu(),od(),Td(),Od(),jd=5,Md=3e4,Nd=1.2,X=class extends xe{constructor(...e){super(...e),this.src=``,this.sourceIdentity=``,this.label=``,this.mimeType=``,this.playback=`native`,this.authToken=null,this.voiceNote=!1,this.currentTime=0,this.duration=0,this.buffered=0,this.playing=!1,this.muted=!1,this.waveformPeaks=null,this.waveformWidth=0,this.media=null,this.waveformElement=null,this.waveformResizeObserver=null,this.sourceController=new Dd,this.cancelPendingResume=()=>this.sourceController.cancelPendingResume(),this.playRequest=null,this.waveformController=null,this.waveformAttempted=!1,this.waveformVisible=!1,this.viewportElement=null,this.setMedia=e=>{this.media=e instanceof HTMLAudioElement?e:null,this.media&&(this.media.muted=this.muted),this.syncSource()},this.setViewportElement=e=>{let t=e instanceof HTMLElement?e:null;this.viewportElement!==t&&(this.stopObservingViewport?.(),this.stopObservingViewport=void 0,this.viewportElement=t,t&&(this.stopObservingViewport=Iu(t,()=>{this.waveformVisible=!0,this.prepareWaveformAudio().catch(()=>void 0)})))},this.setWaveform=e=>{let t=e instanceof HTMLElement?e:null;if(this.waveformElement!==t){if(this.waveformResizeObserver?.disconnect(),this.waveformResizeObserver=null,this.waveformElement=t,!t){this.waveformWidth=0;return}this.updateWaveformWidth(t.getBoundingClientRect().width),!(typeof ResizeObserver>`u`)&&(this.waveformResizeObserver=new ResizeObserver(([e])=>{e&&this.waveformElement===e.target&&this.updateWaveformWidth(e.contentRect.width)}),this.waveformResizeObserver.observe(t))}}}connectedCallback(){super.connectedCallback(),queueMicrotask(()=>this.syncSource())}disconnectedCallback(){this.stopObservingViewport?.(),this.stopObservingViewport=void 0,this.viewportElement=null,this.sourceController.cancel(),this.releaseWaveformBlob?.(),this.releaseWaveformBlob=void 0,this.waveformController?.abort(),this.waveformController=null,this.waveformAttempted=!1,this.waveformResizeObserver?.disconnect(),this.waveformResizeObserver=null,this.waveformElement=null,this.media&&(this.media.paused||this.media.pause(),Vu(this.media)),super.disconnectedCallback()}willUpdate(e){this.sourceController.readiness===`unavailable`&&(e.has(`src`)||e.has(`sourceIdentity`)||e.has(`playback`)||e.has(`authToken`))&&(this.releaseWaveformBlob?.(),this.releaseWaveformBlob=void 0,this.sourceController.cancel())}updated(e){(e.has(`src`)||e.has(`sourceIdentity`)||e.has(`playback`)||e.has(`authToken`)||e.has(`sizeBytes`)||e.has(`serverDurationMs`))&&((e.has(`sourceIdentity`)&&this.sourceController.currentIdentity&&this.sourceController.currentIdentity!==this.sourceIdentity.trim()||e.has(`playback`)||e.has(`authToken`))&&(this.waveformController?.abort(),this.waveformController=null,this.releaseWaveformBlob?.(),this.releaseWaveformBlob=void 0,this.waveformPeaks=null,this.waveformAttempted=!1,this.currentTime=0,this.duration=0,this.buffered=0,this.media&&!this.media.paused&&(this.media.pause(),Vu(this.media))),this.syncSource(),this.waveformVisible&&this.prepareWaveformAudio().catch(()=>void 0))}updateWaveformWidth(e){let t=Math.max(0,e);Math.abs(t-this.waveformWidth)>=.5&&(this.waveformWidth=t)}syncSource(){let e=this.media;if(!e||!this.isConnected||this.releaseWaveformBlob)return;let t=this.sourceController.sync(e,this.src,this.sourceIdentity,this.playback,this.authToken);this.requestUpdate(),t?.then(()=>{this.isConnected&&(this.requestUpdate(),this.waveformVisible&&this.prepareWaveformAudio().catch(()=>void 0))})}resolveWaveformCacheKey(){return[this.sourceIdentity.trim(),this.playback,this.src.trim(),this.authToken?.trim()??``].join(`\0`)}applyPreparedAudio(e,t){let n=this.media;if(!n||e!==this.resolveWaveformCacheKey()){t.release();return}this.releaseWaveformBlob?.(),this.releaseWaveformBlob=t.release,this.waveformPeaks=t.value.peaks?.length?t.value.peaks:null,t.value.durationSeconds!==void 0&&(this.duration=t.value.durationSeconds),this.sourceController.updateSource(n,t.value.blobUrl,this.sourceIdentity)}adoptPreparedAudioForPlayback(){let e=this.media;if(e){if(!this.releaseWaveformBlob){let e=this.resolveWaveformCacheKey(),t=Zu(e);t&&this.applyPreparedAudio(e,t)}this.sourceController.applyPendingSource(e)}}async prepareWaveformAudio(){let e=this.media,t=this.sourceController.readySource;if(!e||!t||this.releaseWaveformBlob||this.waveformAttempted)return;let n=this.resolveWaveformCacheKey(),r=Zu(n);if(r){this.applyPreparedAudio(n,r);return}let i=this.serverDurationMs===void 0?void 0:this.serverDurationMs/1e3;if(i===void 0||!Gu({sizeBytes:this.sizeBytes,durationSeconds:i}))return;let a=globalThis.AudioContext;if(!a)return;this.waveformAttempted=!0;let o=vd(this.authToken);o.set(`Accept`,`audio/*`);let s=new AbortController;this.waveformController=s;let c=setTimeout(()=>s.abort(new DOMException(`waveform fetch timed out`,`TimeoutError`)),Md),l,u;try{if(l=await fetch(t,{method:`GET`,headers:o,credentials:`same-origin`,signal:s.signal}),!l.ok)return;let e=await kd(l,$u);if(!e)return;u=e}finally{clearTimeout(c),this.waveformController===s&&(this.waveformController=null)}let d=new Blob([u],{type:l.headers.get(`Content-Type`)?.split(`;`,1)[0]?.trim()||`audio/mpeg`}),f=URL.createObjectURL(d),p,m;if(Ku({sizeBytes:u.byteLength,durationSeconds:i})){let e=null;try{e=new a({sampleRate:ed});let t=await e.decodeAudioData(u.slice(0)),n=Number.isFinite(t.duration)?t.duration:void 0;n!==void 0&&n<=i*Nd&&(p=qu(t),m=n)}catch{}finally{await e?.close().catch(()=>void 0)}}if(!this.isConnected||n!==this.resolveWaveformCacheKey()){URL.revokeObjectURL(f);return}let h=Qu(n,{blobUrl:f,sizeBytes:u.byteLength,...p?{peaks:p}:{},...m===void 0?{}:{durationSeconds:m}});h&&this.applyPreparedAudio(n,h)}togglePlayback(){let e=this.media;if(!(!e||this.sourceController.readiness!==`ready`)){if(e.paused){this.adoptPreparedAudioForPlayback(),Bu(e,this.cancelPendingResume);let t=e.play();this.playRequest?t.catch(()=>{Vu(e),this.playing=!1}):this.playRequest=t.then(()=>this.prepareWaveformAudio().catch(()=>void 0)).catch(()=>{Vu(e),this.playing=!1}).finally(()=>{this.playRequest=null})}else e.pause()}}seekTo(e){let t=this.media;t&&this.sourceController.seek(t,Math.min(e,this.duration||e))&&(this.currentTime=t.currentTime)}toggleMuted(){this.muted=!this.muted,this.media&&(this.media.muted=this.muted)}handlePlayerKeydown(e){if(e.target===e.currentTarget){if(e.key===` `){e.preventDefault(),this.togglePlayback();return}if(e.key===`ArrowLeft`||e.key===`ArrowRight`){e.preventDefault();let t=e.key===`ArrowLeft`?-1:1;this.seekTo(this.currentTime+t*jd)}}}updateBuffered(){let e=this.media;if(!e||!this.duration||e.buffered.length===0){this.buffered=0;return}this.buffered=Math.min(1,e.buffered.end(e.buffered.length-1)/this.duration)}renderSeek(e){let t=this.waveformPeaks,n=z`<input
|
||
class=${t?`chat-audio-player__seek chat-audio-player__seek--waveform`:`chat-audio-player__seek`}
|
||
type="range"
|
||
min="0"
|
||
max=${String(this.duration||0)}
|
||
step="0.01"
|
||
.value=${String(Math.min(this.currentTime,this.duration||this.currentTime))}
|
||
aria-label=${Y(`chat.mediaPlayer.seek`)}
|
||
style=${st({"--chat-audio-progress":`${e*100}%`,"--chat-audio-buffered":`${Math.max(e,this.buffered)*100}%`})}
|
||
@input=${e=>this.seekTo(Number(e.currentTarget.value))}
|
||
/>`;if(!t)return n;let r=this.waveformWidth>0?Math.max(1,Math.min(t.length,Math.floor(this.waveformWidth/5))):t.length,i=Array.from({length:r},(e,n)=>{let i=Math.floor(n*t.length/r),a=Math.max(i+1,Math.floor((n+1)*t.length/r)),o=0;for(let e=i;e<a;e+=1)o+=t[e]??0;let s=o/Math.max(1,a-i);return Math.min(1,Math.max(0,s))});return z`<div class="chat-audio-player__waveform" ${U(this.setWaveform)}>
|
||
<svg viewBox="0 0 ${r} 24" preserveAspectRatio="none" aria-hidden="true">
|
||
${i.map((t,n)=>{let i=Math.max(2,t*20);return lt`<rect
|
||
class=${n/r<e?`is-played`:``}
|
||
x=${String(n+.25)}
|
||
y=${String((24-i)/2)}
|
||
width="0.5"
|
||
height=${String(i)}
|
||
rx="0.25"
|
||
></rect>`})}
|
||
</svg>
|
||
${n}
|
||
</div>`}render(){let e=this.duration>0?Math.min(1,this.currentTime/this.duration):0,t=Mu(this.src);if(this.sourceController.readiness===`unavailable`)return wu({kind:`audio`,label:this.label,mimeType:this.mimeType,sizeBytes:this.sizeBytes,downloadHref:t,onExpand:this.onExpand,voiceNote:this.voiceNote});let n=`${Ad(this.currentTime)} / ${Ad(this.duration)}`;return z`
|
||
<div
|
||
class="chat-assistant-attachment-card chat-assistant-attachment-card--audio"
|
||
${U(this.setViewportElement)}
|
||
?data-openable=${!!this.onExpand}
|
||
@click=${e=>Tu(e,this.onExpand)}
|
||
>
|
||
${Ou({kind:`audio`,label:this.label,mimeType:this.mimeType,sizeBytes:this.sizeBytes,downloadHref:t,onExpand:this.onExpand,visualMode:`preview-with-favicon`,voiceNote:this.voiceNote})}
|
||
${this.sourceController.readiness===`preparing`?z`<div class="chat-assistant-attachment-card__reason chat-media-preparing">
|
||
${Y(`chat.mediaPlayer.preparing`)}
|
||
</div>`:z`<div
|
||
class="chat-audio-player"
|
||
tabindex="0"
|
||
@keydown=${e=>this.handlePlayerKeydown(e)}
|
||
>
|
||
<button
|
||
type="button"
|
||
class="chat-audio-player__toggle"
|
||
?disabled=${this.playback===`transcode`&&this.sourceController.readiness!==`ready`}
|
||
aria-label=${Y(this.playing?`chat.mediaPlayer.pause`:`chat.mediaPlayer.play`)}
|
||
@click=${()=>this.togglePlayback()}
|
||
>
|
||
${this.playing?q.pause:q.play}
|
||
</button>
|
||
<div class="chat-audio-player__time" aria-live="off">
|
||
<span>${n}</span>
|
||
</div>
|
||
<div class="chat-audio-player__timeline">${this.renderSeek(e)}</div>
|
||
<button
|
||
type="button"
|
||
class="chat-audio-player__volume"
|
||
aria-label=${Y(this.muted?`chat.mediaPlayer.unmute`:`chat.mediaPlayer.mute`)}
|
||
aria-pressed=${this.muted?`true`:`false`}
|
||
@click=${()=>this.toggleMuted()}
|
||
>
|
||
${this.muted?q.volumeX:q.volume2}
|
||
</button>
|
||
</div>`}
|
||
<audio
|
||
class="chat-audio-player__media"
|
||
preload="metadata"
|
||
${U(this.setMedia)}
|
||
@loadedmetadata=${()=>{this.media&&(this.sourceController.handleLoadedMetadata(this.media,()=>Hu(this.media)),this.duration=Number.isFinite(this.media.duration)?this.media.duration:0,this.currentTime=this.media.currentTime,this.updateBuffered(),this.onMediaLoaded?.())}}
|
||
@durationchange=${()=>{this.media&&(this.duration=Number.isFinite(this.media.duration)?this.media.duration:0)}}
|
||
@timeupdate=${()=>{this.media&&(this.currentTime=this.media.currentTime,this.updateBuffered())}}
|
||
@progress=${()=>this.updateBuffered()}
|
||
@play=${()=>{this.media&&Bu(this.media,this.cancelPendingResume),this.playing=!0}}
|
||
@pause=${()=>{this.playing=!1}}
|
||
@ended=${()=>{this.media&&(Vu(this.media),this.sourceController.handleEnded(this.media)),this.playing=!1}}
|
||
@error=${()=>{this.media&&!this.sourceController.handleError(this.media)&&(Vu(this.media),this.playing=!1),this.requestUpdate()}}
|
||
></audio>
|
||
</div>
|
||
`}},h([H()],X.prototype,`src`,void 0),h([H()],X.prototype,`sourceIdentity`,void 0),h([H()],X.prototype,`label`,void 0),h([H()],X.prototype,`mimeType`,void 0),h([H()],X.prototype,`playback`,void 0),h([H()],X.prototype,`authToken`,void 0),h([H({type:Number})],X.prototype,`sizeBytes`,void 0),h([H({type:Number})],X.prototype,`serverDurationMs`,void 0),h([H({type:Boolean})],X.prototype,`voiceNote`,void 0),h([H({attribute:!1})],X.prototype,`onExpand`,void 0),h([H({attribute:!1})],X.prototype,`onMediaLoaded`,void 0),h([W()],X.prototype,`currentTime`,void 0),h([W()],X.prototype,`duration`,void 0),h([W()],X.prototype,`buffered`,void 0),h([W()],X.prototype,`playing`,void 0),h([W()],X.prototype,`muted`,void 0),h([W()],X.prototype,`waveformPeaks`,void 0),h([W()],X.prototype,`waveformWidth`,void 0),customElements.get(`openclaw-chat-audio-player`)||customElements.define(`openclaw-chat-audio-player`,X)})))()}function Fd(e){try{let t=new URL(e,window.location.href);return(t.protocol===`http:`||t.protocol===`https:`)&&t.origin!==location.origin}catch{return!1}}var Id,Ld,Rd;function zd(){return(zd=e((()=>{B(),ut(),K(),Pe(),Au(),zu(),Id=262144,Ld=1e4,Rd=class extends xe{constructor(...e){super(...e),this.src=``,this.sourceIdentity=``,this.label=``,this.mimeType=`image/svg+xml`,this.downloadHref=``,this.failed=!1,this.loadVersion=0,this.handleImageError=()=>{this.renderSource&&=(this.retireSource(this.renderSource),void 0),this.showFallback()},this.handleOpen=()=>{let e=this.renderSource;if(!e||!this.onOpen)return;let t=this.retainSource(e);try{this.onOpen(e.url,t)}catch(e){throw t(),e}}}connectedCallback(){super.connectedCallback(),this.src.trim()&&!this.renderSource&&!this.failed&&this.observeViewport()}disconnectedCallback(){this.stopObservingViewport?.(),this.stopObservingViewport=void 0,this.releaseSource(),super.disconnectedCallback()}updated(e){(e.has(`src`)||e.has(`sourceIdentity`)||e.has(`sizeBytes`))&&(this.releaseSource(),this.failed=!1,this.observeViewport())}observeViewport(){this.stopObservingViewport?.();let e=this.parentElement??this;this.stopObservingViewport=Iu(e,()=>{this.stopObservingViewport=void 0,this.loadSource()})}retireSource(e){e.retired=!0,e.revokeOnRetire&&e.retainCount===0&&URL.revokeObjectURL(e.url)}releaseSource(){this.loadVersion+=1,this.abortController?.abort(),this.abortController=void 0,this.renderSource&&=(this.retireSource(this.renderSource),void 0)}retainSource(e){e.retainCount+=1;let t=!1;return()=>{t||(t=!0,e.retainCount=Math.max(0,e.retainCount-1),e.revokeOnRetire&&e.retired&&e.retainCount===0&&URL.revokeObjectURL(e.url))}}showFallback(){this.failed||(this.failed=!0,this.onMediaLoaded?.())}async loadSource(){let e=this.loadVersion;if(this.sizeBytes!==void 0&&this.sizeBytes>Id){this.showFallback();return}if(Fd(this.src)){this.showFallback();return}let t=new AbortController;this.abortController=t;let n;try{let r=await Promise.race([fetch(this.src,{credentials:`same-origin`,headers:{Accept:`image/svg+xml`},method:`GET`,signal:t.signal}),new Promise((e,r)=>{n=setTimeout(()=>{t.abort(),r(new DOMException(`SVG attachment fetch timed out`,`TimeoutError`))},Ld)})]);if(!r.ok)throw await r.body?.cancel().catch(()=>void 0),Error(`SVG attachment is unavailable`);let i=await kd(r,Id);if(!i)throw Error(`SVG attachment exceeds the preview budget`);let a=URL.createObjectURL(new Blob([i],{type:`image/svg+xml`}));if(e!==this.loadVersion||!this.isConnected){URL.revokeObjectURL(a);return}this.renderSource={url:a,retainCount:0,retired:!1,revokeOnRetire:!0}}catch{e===this.loadVersion&&this.showFallback()}finally{clearTimeout(n),this.abortController===t&&(this.abortController=void 0)}}render(){if(this.failed)return z`<div
|
||
class="chat-assistant-attachment-card chat-assistant-attachment-card--compact"
|
||
?data-openable=${!!this.onExpand}
|
||
@click=${e=>Tu(e,this.onExpand)}
|
||
>
|
||
${Ou({kind:`document`,label:this.label,mimeType:this.mimeType,sizeBytes:this.sizeBytes,downloadHref:this.downloadHref,onExpand:this.onExpand,visualMode:`large-placeholder`})}
|
||
</div>`;let e=this.renderSource;return e?z`<button
|
||
type="button"
|
||
class="chat-message-image-button"
|
||
aria-label=${Y(`chat.imageLightbox.open`,{title:this.label})}
|
||
@click=${this.handleOpen}
|
||
>
|
||
<img
|
||
src=${e.url}
|
||
alt=${this.label}
|
||
class="chat-message-image"
|
||
@load=${this.onMediaLoaded}
|
||
@error=${this.handleImageError}
|
||
/>
|
||
</button>`:R}},h([H()],Rd.prototype,`src`,void 0),h([H()],Rd.prototype,`sourceIdentity`,void 0),h([H()],Rd.prototype,`label`,void 0),h([H()],Rd.prototype,`mimeType`,void 0),h([H({type:Number})],Rd.prototype,`sizeBytes`,void 0),h([H()],Rd.prototype,`downloadHref`,void 0),h([H({attribute:!1})],Rd.prototype,`onOpen`,void 0),h([H({attribute:!1})],Rd.prototype,`onExpand`,void 0),h([H({attribute:!1})],Rd.prototype,`onMediaLoaded`,void 0),h([W()],Rd.prototype,`renderSource`,void 0),h([W()],Rd.prototype,`failed`,void 0),customElements.get(`openclaw-chat-svg-attachment`)||customElements.define(`openclaw-chat-svg-attachment`,Rd)})))()}var Bd;function Vd(){return(Vd=e((()=>{B(),ut(),V(),it(),K(),Pe(),Au(),Fu(),zu(),Od(),Bd=class extends xe{constructor(...e){super(...e),this.src=``,this.sourceIdentity=``,this.label=``,this.mimeType=``,this.playback=`native`,this.authToken=null,this.media=null,this.mediaVisible=!1,this.viewportElement=null,this.sourceController=new Dd,this.setMedia=e=>{this.media=e instanceof HTMLVideoElement?e:null,this.syncSource()},this.setViewportElement=e=>{let t=e instanceof HTMLElement?e:null;this.viewportElement!==t&&(this.stopObservingViewport?.(),this.stopObservingViewport=void 0,this.viewportElement=t,t&&(this.stopObservingViewport=Iu(t,()=>{this.mediaVisible=!0,this.syncSource()})))},this.expand=()=>{let e=this.sourceController.readySource;e&&(this.media?.pause(),this.onExpand?.(e))}}connectedCallback(){super.connectedCallback(),queueMicrotask(()=>this.syncSource())}disconnectedCallback(){this.stopObservingViewport?.(),this.stopObservingViewport=void 0,this.viewportElement=null,this.sourceController.cancel(),this.media&&this.sourceController.reset(this.media),super.disconnectedCallback()}willUpdate(e){this.sourceController.readiness===`unavailable`&&(e.has(`src`)||e.has(`sourceIdentity`)||e.has(`playback`)||e.has(`authToken`))&&this.sourceController.cancel()}updated(e){(e.has(`src`)||e.has(`sourceIdentity`)||e.has(`playback`)||e.has(`authToken`))&&this.syncSource()}syncSource(){let e=this.media;if(!e||!this.isConnected||!this.mediaVisible)return;let t=this.sourceController.sync(e,this.src,this.sourceIdentity,this.playback,this.authToken);this.requestUpdate(),t?.then(()=>{this.isConnected&&this.requestUpdate()})}adoptPendingSource(){return!this.media||!this.sourceController.applyPendingSource(this.media)?!1:(this.requestUpdate(),!0)}render(){let e=Mu(this.src),t=this.sourceController.readiness===`preparing`;if(this.sourceController.readiness===`unavailable`)return wu({kind:`video`,label:this.label,mimeType:this.mimeType,sizeBytes:this.sizeBytes,downloadHref:e,onExpand:this.onFallbackExpand});let n=this.onExpand&&this.sourceController.readySource?this.expand:void 0,r=this.mediaWidth&&this.mediaHeight?{"aspect-ratio":`${this.mediaWidth} / ${this.mediaHeight}`}:{};return z`
|
||
<div
|
||
class="chat-assistant-attachment-card chat-assistant-attachment-card--video"
|
||
${U(this.setViewportElement)}
|
||
?data-openable=${!!n}
|
||
@click=${e=>Tu(e,n)}
|
||
>
|
||
${Ou({kind:`video`,label:this.label,mimeType:this.mimeType,sizeBytes:this.sizeBytes,downloadHref:e,expandLabel:Y(`chat.mediaPlayer.openVideo`,{filename:this.label}),onExpand:n,visualMode:`preview-with-favicon`})}
|
||
${t?z`<div class="chat-assistant-attachment-card__reason chat-media-preparing">
|
||
${Y(`chat.mediaPlayer.preparing`)}
|
||
</div>`:null}
|
||
<div class="chat-assistant-video-frame" ?hidden=${t}>
|
||
<video
|
||
controls
|
||
preload="metadata"
|
||
style=${st(r)}
|
||
${U(this.setMedia)}
|
||
@loadedmetadata=${()=>{this.media&&(this.sourceController.handleLoadedMetadata(this.media),this.onMediaLoaded?.())}}
|
||
@ended=${()=>{this.media&&this.sourceController.handleEnded(this.media)&&this.requestUpdate()}}
|
||
@play=${()=>this.adoptPendingSource()}
|
||
@seeking=${()=>{!this.adoptPendingSource()&&this.media?.error&&this.sourceController.handleError(this.media)&&this.requestUpdate()}}
|
||
@error=${()=>{this.media&&(this.sourceController.handleError(this.media),this.requestUpdate())}}
|
||
></video>
|
||
</div>
|
||
</div>
|
||
`}},h([H()],Bd.prototype,`src`,void 0),h([H()],Bd.prototype,`sourceIdentity`,void 0),h([H()],Bd.prototype,`label`,void 0),h([H()],Bd.prototype,`mimeType`,void 0),h([H()],Bd.prototype,`playback`,void 0),h([H()],Bd.prototype,`authToken`,void 0),h([H({type:Number})],Bd.prototype,`sizeBytes`,void 0),h([H({type:Number})],Bd.prototype,`mediaWidth`,void 0),h([H({type:Number})],Bd.prototype,`mediaHeight`,void 0),h([H({attribute:!1})],Bd.prototype,`onExpand`,void 0),h([H({attribute:!1})],Bd.prototype,`onFallbackExpand`,void 0),h([H({attribute:!1})],Bd.prototype,`onMediaLoaded`,void 0),customElements.get(`openclaw-chat-video-player`)||customElements.define(`openclaw-chat-video-player`,Bd)})))()}function Hd(e,t,n,r,i){if(!sd(e))return{status:`available`};if(t.length>0&&!fd(e,t))return{status:`unavailable`,reason:Y(`chat.attachments.outsideAllowedFolders`),checkedAt:Date.now(),recoverable:!1};let a=r?.trim()??``,o=ml(`assistant-attachment`,`${n??``}::${a}::${e}`,i,e),s=o.value,c=null;if(s){let e=Date.now();if(s.status===`unavailable`&&s.recoverable&&!s.retryAttempted&&e-s.checkedAt>=5e3)o.retryAttempted=!0,o.value=void 0;else if(s.status===`available`&&s.mediaTicket&&s.mediaTicketExpiresAt!==void 0&&s.mediaTicketExpiresAt<=e){let e=Wd(`Attachment unavailable`,o.retryAttempted);return Kd(o,e),e}else if(s.status===`available`&&s.mediaTicket&&(s.refreshAfter===void 0?!s.mediaTicketExpiresAt||s.mediaTicketExpiresAt-e<=3e4:s.refreshAfter<=e)){if(o.pending)return s;c=s}else return qd(o,s),s}c||Kd(o,{status:`checking`});let l=()=>{if(!c)return null;let e=Date.now(),t=c.mediaTicketExpiresAt,n=c.refreshAttempts??0;if(t===void 0||t<=e||n>=2)return null;let r={...c,refreshAfter:Math.min(e+Qd,t),refreshAttempts:n+1};return Kd(o,r),r};if(typeof fetch==`function`){let t=new Headers({Accept:`application/json`});a&&t.set(`Authorization`,`Bearer ${a}`);let r=new AbortController;o.abortController=r;let i=setTimeout(()=>r.abort(new DOMException(`assistant attachment metadata fetch timed out`,`TimeoutError`)),$d),s=fetch(Gd(e,n),{method:`GET`,headers:t,credentials:`same-origin`,signal:r.signal}).then(async e=>{let t=await e.json().catch(()=>null);if(t?.available===!0){let e=t.mediaTicket?.trim(),n=Date.parse(t.mediaTicketExpiresAt??``);if(e&&!Number.isFinite(n)){let e=l();if(e)return e;let t=Wd(Y(`chat.attachments.unavailable`),o.retryAttempted);return Kd(o,t),t}let r={status:`available`,...e?{mediaTicket:e,mediaTicketExpiresAt:n}:{},...t.playback===`native`||t.playback===`transcode`?{playback:t.playback}:{},...typeof t.sizeBytes==`number`?{sizeBytes:t.sizeBytes}:{},...typeof t.durationMs==`number`?{durationMs:t.durationMs}:{},...typeof t.width==`number`?{width:t.width}:{},...typeof t.height==`number`?{height:t.height}:{}};return o.retryAttempted=!1,Kd(o,r),r}let n=Wd(Be(t?.reason,Y(`chat.attachments.unavailable`)),o.retryAttempted,t?.retryable!==!1);return Kd(o,n),n}).catch(()=>{let e=l();if(e)return e;let t=Wd(Y(`chat.attachments.unavailable`),o.retryAttempted);return Kd(o,t),t}).finally(()=>{clearTimeout(i),o.abortController===r&&(o.abortController=void 0),o.pending===s&&(o.pending=void 0),_l(o)});o.pending=s}return c??{status:`checking`}}function Ud(e,t,n,r){if(!sd(e)){r?.();return}let i=n?.trim()??``,a=ml(`assistant-attachment`,`${t??``}::${i}::${e}`,r,e);a.abortController?.abort(),a.abortController=void 0,a.pending=void 0,a.value=void 0,a.retryAttempted=!1,qd(a,{status:`checking`}),_l(a),r?.()}function Wd(e,t,n=!0){return{status:`unavailable`,reason:e,checkedAt:Date.now(),recoverable:n,...t?{retryAttempted:!0}:{}}}function Gd(e,t){let n=pd(e,t);return`${n}${n.includes(`?`)?`&`:`?`}meta=1`}function Kd(e,t){hl(e)&&(e.value=t,qd(e,t))}function qd(e,t){vl(e,t.status===`unavailable`&&t.recoverable&&!t.retryAttempted?t.checkedAt+Qd:t.status===`available`&&t.mediaTicket&&t.mediaTicketExpiresAt?t.refreshAfter??t.mediaTicketExpiresAt-3e4:void 0,()=>{e.value===t&&(t.status===`checking`&&(e.value=void 0),_l(e))})}function Jd(e){return Qd*2**Math.max(0,e-1)}function Yd(e,t){return e?.expiresAt!==void 0&&e.expiresAt>=(t.expiresAt??0)?e:t}function Xd(e){try{let t=new URL(e,window.location.origin);return t.origin===window.location.origin&&t.pathname.startsWith(`/api/chat/media/outgoing/`)}catch{return!1}}function Zd(e){try{let t=new URL(e,window.location.origin).pathname.split(`/`)[5];return t?decodeURIComponent(t):null}catch{return null}}var Qd,$d,ef;function tf(){return(tf=e((()=>{K(),Fe(),hd(),Yl(),Qd=5e3,$d=3e4,ef=3e4})))()}function nf(e){return Y(e===`file-not-found`?`chat.attachments.failureFileNotFound`:e===`unsupported-format`?`chat.attachments.failureUnsupportedFormat`:`chat.attachments.failureDeliveryFailed`)}function rf(e){let t=e.reason!==void 0,n=t&&e.onRetry!==void 0;return z`
|
||
<div
|
||
class="chat-assistant-attachment-card chat-assistant-attachment-card--blocked ${t?n?`chat-assistant-attachment-card--recoverable`:`chat-assistant-attachment-card--definitive`:`chat-assistant-attachment-card--checking`}"
|
||
aria-busy=${t?R:`true`}
|
||
>
|
||
<div class="chat-assistant-attachment-card__header">
|
||
<div class="chat-assistant-attachment-card__identity">
|
||
${Du({label:e.label,mimeType:e.mimeType,visualMode:`large-placeholder`,unavailable:t})}
|
||
<span class="chat-assistant-attachment-card__details">
|
||
<span
|
||
class="chat-assistant-attachment-card__title ${t?`chat-assistant-attachment-card__title--unavailable`:``}"
|
||
title=${e.label}
|
||
>${e.label}</span
|
||
>
|
||
<span
|
||
class="chat-assistant-attachment-card__meta chat-assistant-attachment-card__status-meta ${t?``:`skeleton skeleton-line`}"
|
||
aria-hidden=${t?R:`true`}
|
||
>
|
||
<span class="chat-assistant-attachment-card__status-badge">${e.badge}</span>
|
||
${e.reason?z`
|
||
<span
|
||
class="chat-assistant-attachment-card__status-separator"
|
||
aria-hidden="true"
|
||
>·</span
|
||
>
|
||
<span class="chat-assistant-attachment-card__status-reason"
|
||
>${e.reason}</span
|
||
>
|
||
`:R}
|
||
</span>
|
||
</span>
|
||
</div>
|
||
${e.onRetry?z`<button
|
||
class="chat-assistant-attachment-card__action chat-assistant-attachment-card__action--labeled chat-assistant-attachment-card__retry"
|
||
type="button"
|
||
@click=${e.onRetry}
|
||
>
|
||
${q.refresh} ${Y(`common.retry`)}
|
||
</button>`:t?R:z`<span
|
||
class="chat-assistant-attachment-card__actions chat-assistant-attachment-card__actions--loading"
|
||
aria-hidden="true"
|
||
data-label=${Y(`chat.attachments.open`)}
|
||
>
|
||
<span
|
||
class="chat-assistant-attachment-card__action-skeleton skeleton"
|
||
aria-hidden="true"
|
||
></span>
|
||
</span>`}
|
||
</div>
|
||
</div>
|
||
`}function af(){return(af=e((()=>{B(),J(),K(),Au()})))()}function of(e,t,n,r,i){let a=Ra(t,window.location.href,{allowDataImage:!0});if(!a){r?.();return}if(e){let t={src:a,title:n,...r?{release:r}:{}};i===void 0?e(t):e(t,i);return}r?.(),vo(a,{allowDataImage:!0})}function sf(){return(sf=e((()=>{ja()})))()}function cf(e,t,n){if(!t?.expiresAt||t.expiresAt<=Date.now())return null;let r={...t,refreshAfter:t.expiresAt,refreshAttempts:n};return uf(e,r),r}function lf(e,t){if(!e.startsWith(`/`)||e.startsWith(`//`))return e;try{let n=new URL(e,window.location.origin),r=zt(t??``);return`${r&&n.pathname!==r&&!n.pathname.startsWith(`${r}/`)?`${r}${n.pathname}`:n.pathname}${n.search}${n.hash}`}catch{return e}}function uf(e,t,n=!1){hl(e)&&(e.value=t,vl(e,t.status===`checking`?t.refreshAfter:t.status===`available`&&t.expiresAt!==void 0?n?t.expiresAt:Math.min(t.refreshAfter??t.expiresAt-3e4,t.expiresAt):t.status===`unavailable`&&!e.retryAttempted?t.checkedAt+Qd:void 0,()=>{e.value?.status===`unavailable`&&(e.retryAttempted=!0,e.value=void 0),_l(e)}))}function df(e,t,n,r){if(!Xd(e.url))return{status:`available`,url:e.url};if(!e.artifactId||!t)return new URL(e.url,window.location.origin).searchParams.get(`mediaTicket`)?.trim()?{status:`available`,url:e.url}:{status:`unavailable`,reason:Y(`chat.attachments.unavailable`),checkedAt:Date.now()};let i=Zd(e.url);if(!i)return{status:`unavailable`,reason:Y(`chat.attachments.unavailable`),checkedAt:Date.now()};let a=ml(`managed-media`,`${r??0}::${e.url}::${e.artifactId}`,n,e.url),o=a.value,s=Date.now();if(o?.status===`unavailable`||o?.status===`checking`&&o.refreshAfter!==void 0&&o.refreshAfter>s)return uf(a,o),o;if(o?.status===`available`){if(o.expiresAt!==void 0&&o.expiresAt<=s&&(o.refreshAttempts??0)>=2){a.retryAttempted=!0;let e={status:`unavailable`,reason:Y(`chat.attachments.unavailable`),checkedAt:s};return uf(a,e),e}if(o.expiresAt!==void 0&&o.expiresAt<=s&&(a.pending||o.refreshAfter!==void 0&&o.refreshAfter>s)){let e={status:`checking`,...!a.pending&&o.refreshAfter!==void 0?{refreshAfter:o.refreshAfter}:{},refreshAttempts:o.refreshAttempts};return uf(a,e),e}let e=o.refreshAfter??(o.expiresAt===void 0?void 0:o.expiresAt-3e4);if(e===void 0||e>s)return uf(a,o),o}if(a.pending)return o?.status===`available`?o:{status:`checking`};let c=o?.status===`available`&&(o.expiresAt===void 0||o.expiresAt>s)?o:null,l=()=>{if(!c&&o?.status!==`checking`)return null;let e=c?.refreshAttempts??o?.refreshAttempts??0;if(e>=2)return cf(a,c,e);let t=e+1,n=Date.now()+Jd(t),r=!c||c.expiresAt!==void 0&&c.expiresAt<=Date.now()?{status:`checking`,refreshAfter:n,refreshAttempts:t}:{...c,refreshAfter:n,refreshAttempts:t};return uf(a,r),r};c||uf(a,{status:`checking`});let u=Promise.resolve().then(()=>t({sessionKey:i,artifactId:e.artifactId})).then(e=>{if(!hl(a))return null;let t=e?.url.trim();if(!t){let e=l();if(e)return e;(o?.refreshAttempts??0)>=2&&(a.retryAttempted=!0);let t={status:`unavailable`,reason:Y(`chat.attachments.unavailable`),checkedAt:Date.now()};return uf(a,t),t}let n=Date.parse(e?.expiresAt??``),r=Number.isFinite(n)?n:Date.now()+3e5,i=o?.refreshAttempts??0;if(r-Date.now()<=3e4&&i>=2){let e=cf(a,Yd(c,{status:`available`,url:t,expiresAt:r}),i);if(e)return e;a.retryAttempted=!0;let n={status:`unavailable`,reason:Y(`chat.attachments.unavailable`),checkedAt:Date.now()};return uf(a,n),n}let s=i+1,u=r-Date.now()<=ef;if(r<=Date.now()){let e={status:`checking`,refreshAfter:Date.now()+Jd(s),refreshAttempts:s};return uf(a,e),e}let d={status:`available`,url:t,expiresAt:r,...u?{refreshAfter:Date.now()+Jd(s),refreshAttempts:s}:{}};return u||(a.retryAttempted=!1),uf(a,d),d}).catch(()=>{let e=l();if(e)return e;(o?.refreshAttempts??0)>=2&&(a.retryAttempted=!0);let t={status:`unavailable`,reason:Y(`chat.attachments.unavailable`),checkedAt:Date.now()};return uf(a,t),t}).finally(()=>{a.pending===u&&(a.pending=void 0),_l(a)});return a.pending=u,c&&uf(a,c,!0),c??{status:`checking`}}function ff(e,t,n){if(!e.artifactId||!Xd(e.url))return;let r=ml(`managed-media`,`${n??0}::${e.url}::${e.artifactId}`,t,e.url);r.value=void 0,r.retryAttempted=!1,r.unavailableAt=void 0,_l(r),t?.()}function pf(e,t,n,r,i=!0){if(e.length===0)return R;let{connectionEpoch:a,localMediaPreviewRoots:o=[],resourceBasePath:s,authToken:c,onRequestUpdate:l,onRequestOpenImage:u,onOpenImage:d,resolveArtifactDownload:f}=t;return z` <div class="chat-assistant-attachments">${e.map(e=>{if(e.type===`attachment_error`){let{attachment:t}=e;return rf({label:t.label,mimeType:t.mimeType,badge:Y(`chat.attachments.notSent`),reason:nf(t.code)})}let{attachment:t}=e,p=sd(t.url),m=Hd(t.url,o,s,c,l),h=m.status===`available`?df(t,f,l,a):null,g=m.status===`available`&&(h?.status===`unavailable`||h?.status===`checking`)?h:m,_=m.status===`available`&&h?.status===`available`?p?pd(t.url,s,m.mediaTicket):Xd(t.url)?lf(h.url,s):h.url:null,v=m.status===`available`?m.sizeBytes??t.sizeBytes:t.sizeBytes,y=m.status===`available`?m.playback??t.playback??`native`:t.playback??`native`,b=m.status===`available`?m.durationMs??t.durationMs:t.durationMs,x=m.status===`available`?m.width??t.width:t.width,S=m.status===`available`?m.height??t.height:t.height,C=p?c??null:null,w=t.kind===`audio`||t.kind===`video`?Mu(_??``,t.kind):ju(_??``),T=t.kind===`video`&&d&&w?e=>{let n=u?.(),r={kind:`video`,src:e,originalSrc:w,title:t.label};n===void 0?d(r):d(r,n)}:void 0,E=p||Xd(t.url)&&!!(t.artifactId&&f),D=m.status===`unavailable`&&m.recoverable?()=>Ud(t.url,s,c,l):h?.status===`unavailable`&&t.artifactId&&f?()=>ff(t,l,a):void 0,O=n&&_&&(E||w)?()=>n({kind:`attachment`,attachmentKind:t.kind,title:t.label,...E?{}:{src:w},mimeType:t.mimeType,sourceIdentity:t.url,playback:y,authToken:C,sizeBytes:v,durationMs:b,width:x,height:S,voiceNote:t.isVoiceNote===!0,...E?{resolveSource:(e,n)=>{let r=Hd(t.url,n.localMediaPreviewRoots,n.resourceBasePath,n.authToken,e);if(r.status!==`available`)return null;let i=df(t,n.resolveArtifactDownload,e,n.connectionEpoch);return i.status===`available`?{src:p?pd(t.url,n.resourceBasePath,r.mediaTicket):lf(i.url,n.resourceBasePath),playback:r.playback??t.playback??`native`,authToken:p?n.authToken??null:null,sizeBytes:r.sizeBytes??t.sizeBytes,durationMs:r.durationMs??t.durationMs,width:r.width??t.width,height:r.height??t.height}:null}}:{}}):void 0,k=t.mimeType?.split(`;`,1)[0]?.trim().toLowerCase()??``,ee=!k||k===`application/octet-stream`,A=k===`image/svg+xml`||ee&&(kl(t.url,void 0)||_!==null&&kl(_,void 0)||kl(t.label,void 0));if(t.kind===`image`||t.kind===`document`&&(A||Ol(t.url,ee?void 0:t.mimeType)||ee&&!kl(t.label,void 0)&&Ol(t.label,void 0))){if(!_)return rf({label:t.label,mimeType:t.mimeType,badge:g.status===`unavailable`?Y(`chat.attachments.unavailable`):``,reason:g.status===`unavailable`?g.reason:void 0,onRetry:D});let e=t.label.trim()||Y(`chat.imageLightbox.untitled`);return A?z`<openclaw-chat-svg-attachment
|
||
.src=${_}
|
||
.sourceIdentity=${t.url}
|
||
.label=${e}
|
||
.mimeType=${t.mimeType??`image/svg+xml`}
|
||
.sizeBytes=${v}
|
||
.downloadHref=${ju(_)}
|
||
.onOpen=${(t,n)=>of(d,t,e,n,u?.())}
|
||
.onExpand=${O}
|
||
.onMediaLoaded=${r}
|
||
></openclaw-chat-svg-attachment>`:z`
|
||
<button
|
||
type="button"
|
||
class="chat-message-image-button"
|
||
aria-label=${Y(`chat.imageLightbox.open`,{title:e})}
|
||
@click=${()=>of(d,_,e,void 0,u?.())}
|
||
>
|
||
<img src=${_} alt=${e} class="chat-message-image" />
|
||
</button>
|
||
`}return _?(t.kind===`audio`||t.kind===`video`)&&!w?rf({label:t.label,mimeType:t.mimeType,badge:Y(`chat.attachments.unavailable`),reason:Y(`chat.attachments.previewUnavailable`)}):i&&t.kind===`audio`?z`<openclaw-chat-audio-player
|
||
.src=${w}
|
||
.sourceIdentity=${t.url}
|
||
.label=${t.label}
|
||
.mimeType=${t.mimeType??``}
|
||
.playback=${y}
|
||
.authToken=${C}
|
||
.sizeBytes=${v}
|
||
.serverDurationMs=${b}
|
||
.voiceNote=${t.isVoiceNote===!0}
|
||
.onExpand=${O}
|
||
.onMediaLoaded=${r}
|
||
></openclaw-chat-audio-player>`:i&&t.kind===`video`?z`<openclaw-chat-video-player
|
||
.src=${w}
|
||
.sourceIdentity=${t.url}
|
||
.label=${t.label}
|
||
.mimeType=${t.mimeType??``}
|
||
.playback=${y}
|
||
.authToken=${C}
|
||
.sizeBytes=${v}
|
||
.mediaWidth=${x}
|
||
.mediaHeight=${S}
|
||
.onExpand=${T}
|
||
.onFallbackExpand=${O}
|
||
.onMediaLoaded=${r}
|
||
></openclaw-chat-video-player>`:wu({kind:t.kind,label:t.label,mimeType:t.mimeType,sizeBytes:v,downloadHref:w,onExpand:O,voiceNote:t.isVoiceNote===!0}):rf({label:t.label,mimeType:t.mimeType,badge:g.status===`unavailable`?Y(`chat.attachments.unavailable`):``,reason:g.status===`unavailable`?g.reason:void 0,onRetry:D})})}</div> `}function mf(){return(mf=e((()=>{B(),an(),K(),Pd(),zd(),Vd(),Au(),Fu(),tf(),af(),sf(),hd(),Yl()})))()}function hf(e,t){return e.flatMap(e=>{let n=sd(e.url),r=t?.localMediaPreviewRoots??[],i=n&&(r.length===0||fd(e.url,r));if(n&&!i)return[];let a=i?Hd(e.url,r,t?.resourceBasePath,t?.authToken,t?.onRequestUpdate):{status:`available`};if(a.status!==`available`)return[];let o=i?pd(e.url,t?.resourceBasePath,a.mediaTicket):e.url;return[{...e,displayUrl:o}]})}function gf(e,t){if(e.length===0)return R;let n=(e,n)=>{let r=e.alt?.trim()||Y(`chat.imageLightbox.untitled`),i=t?.onRequestOpenImage?.();if(!_f(e.displayUrl)){of(t?.onOpenImage,n,r,void 0,i);return}let a=yf(e.displayUrl,t,e.artifactId,`full`),o=bf(e.displayUrl,t,e.artifactId,`full`);if(o){let e=t?.onOpenImage?wl(a):void 0;of(t?.onOpenImage,o,r,e,i);return}if(!t?.onOpenImage){let n=io();xf(e.displayUrl,t,e.artifactId,`full`).then(e=>{let t=e?Ra(e,window.location.href,{allowDataImage:!0}):null;t?n?n.location.replace(t):vo(t,{allowDataImage:!0}):(n?.close(),A({message:Y(`chat.imageLightbox.loadFailed`)}))}).catch(()=>{n?.close(),A({message:Y(`chat.imageLightbox.loadFailed`)})});return}xf(e.displayUrl,t,e.artifactId,`full`).then(e=>{if(!e){A({message:Y(`chat.imageLightbox.loadFailed`)});return}let n=a?wl(a):void 0;of(t.onOpenImage,e,r,n,i)}).catch(()=>A({message:Y(`chat.imageLightbox.loadFailed`)}))},r=(e,r)=>{let i=e.alt?.trim()||Y(`chat.imageLightbox.untitled`),a=_f(e.displayUrl),o=e.width!==void 0&&e.width<Mf?`chat-message-image chat-message-image--small`:`chat-message-image`;return z`
|
||
<span class="chat-image-frame ${a?`chat-image-frame--managed`:``}">
|
||
<button
|
||
type="button"
|
||
class="chat-message-image-button"
|
||
aria-label=${Y(`chat.imageLightbox.open`,{title:i})}
|
||
@click=${t=>{t.stopPropagation(),n(e,r)}}
|
||
>
|
||
<img
|
||
src=${r}
|
||
alt=${i}
|
||
class=${o}
|
||
width=${e.width??R}
|
||
height=${e.height??R}
|
||
/>
|
||
</button>
|
||
${a?Of(e,t):R}
|
||
</span>
|
||
`},i=e=>_f(e.displayUrl)?Pf(e,t,r):r(e,e.displayUrl),a=[`chat-message-images`,e.length===1?`chat-message-images--single`:`chat-message-images--gallery`,e.length===2||e.length===4?`chat-message-images--two-column`:``,e.length===5?`chat-message-images--five`:``].filter(Boolean).join(` `);return z` <div class=${a}>${e.map(e=>i(e))}</div> `}function _f(e){let t=e.trim();if(t.startsWith(`/api/chat/media/outgoing/`))return!0;try{let e=new URL(t,window.location.origin);return e.origin===window.location.origin&&e.pathname.startsWith(`/api/chat/media/outgoing/`)}catch{return!1}}function vf(e){try{let t=new URL(e,window.location.origin).pathname.split(`/`)[5];return t?decodeURIComponent(t):null}catch{return null}}function yf(e,t,n,r=`thumbnail`){let i=t?.authToken?.trim()??``;return`${Sf(e,r,t?.resourceBasePath)}::${i}::${n?.trim()??``}`}function bf(e,t,n,r=`thumbnail`){return Sl(yf(e,t,n,r))}async function xf(e,t,n,r=`thumbnail`){let i=yf(e,t,n,r),a=ml(`managed-image`,i,t?.onRequestUpdate,`${Sf(e,r,t?.resourceBasePath)}::${n?.trim()??``}`),o=Sl(i);if(o)return a.value=o,a.retryAttempted=!1,a.unavailableAt=void 0,o;if(a.value===null){if(a.retryAttempted||a.unavailableAt===void 0||Date.now()-a.unavailableAt<jf)return null;a.retryAttempted=!0,a.value=void 0}if(!a.pending){let o=new AbortController;a.abortController=o;let s=(async()=>{let s=await Cf(e,t,n,r,o);if(!s)return kf(a);if(!hl(a))return null;let c=URL.createObjectURL(s);return Tl(i,c),a.value=c,a.retryAttempted=!1,a.unavailableAt=void 0,c})().finally(()=>{a.abortController===o&&(a.abortController=void 0),a.pending===s&&(a.pending=void 0),xl(),_l(a)});a.pending=s}return a.pending}function Sf(e,t,n){try{let r=new URL(e,window.location.origin);if(r.pathname=r.pathname.replace(/\/(?:full|thumbnail)$/u,`/${t}`),/^https?:\/\//iu.test(e))return r.href;let i=zt(n??``);return`${i&&(r.pathname===i||r.pathname.startsWith(`${i}/`))?r.pathname:`${i}${r.pathname}`}${r.search}${r.hash}`}catch{return e.replace(/\/(?:full|thumbnail)(?=$|[?#])/u,`/${t}`)}}async function Cf(e,t,n,r,i=new AbortController){let a=vf(e),o=a&&n&&t?.resolveArtifactDownload?await t.resolveArtifactDownload({sessionKey:a,artifactId:n}).catch(()=>null):null,s=Sf(o?.url??e,r,t?.resourceBasePath),c=new Headers({Accept:`image/*`}),l=t?.authToken?.trim();!o&&l&&c.set(`Authorization`,`Bearer ${l}`),!o&&a&&c.set(`x-openclaw-requester-session-key`,a);let u=globalThis.setTimeout(()=>{i.abort(new DOMException(`managed outgoing image fetch timed out`,`TimeoutError`))},Af);try{let e=await fetch(s,{method:`GET`,headers:c,credentials:`same-origin`,signal:i.signal});if(!e.ok)return null;let t=await e.blob();return t.type.startsWith(`image/`)?t:null}catch{return null}finally{globalThis.clearTimeout(u)}}async function wf(e,t,n){let r=await xf(e,t,n,`full`);if(!r)throw Error(`managed image is unavailable`);let i=await(await fetch(r)).blob();if(!i.type.startsWith(`image/`))throw Error(`managed image response is invalid`);return i}function Tf(e,t){let n=t===`image/jpeg`?`jpg`:t.split(`/`,2)[1]||`img`;return`${Array.from(e,e=>e.codePointAt(0)<=31||`<>:"/\\|?*`.includes(e)?`-`:e).join(``).replace(/\.[a-z0-9]{1,10}$/iu,``).replace(/[. -]+$/u,``).slice(0,120)||`generated-image`}.${/^[a-z0-9.+-]{1,12}$/u.test(n)?n:`img`}`}function Ef(e,t){let n=URL.createObjectURL(e),r=document.createElement(`a`);r.href=n,r.download=t,r.click(),globalThis.setTimeout(()=>URL.revokeObjectURL(n),3e4)}async function Df(e){if(e.type===`image/png`)return e;let t=await createImageBitmap(e);try{let e=document.createElement(`canvas`);e.width=t.width,e.height=t.height;let n=e.getContext(`2d`);if(!n)throw Error(`image conversion context is unavailable`);return n.drawImage(t,0,0),await new Promise((t,n)=>{e.toBlob(e=>e?t(e):n(Error(`image conversion failed`)),`image/png`)})}finally{t.close()}}function Of(e,t){let n=e.alt?.trim()||Y(`chat.imageLightbox.untitled`),r=async()=>{try{let r=await wf(e.displayUrl,t,e.artifactId);Ef(r,Tf(n,r.type))}catch{A({message:Y(`chat.imageLightbox.downloadFailed`)})}},i=async()=>{try{if(!navigator.clipboard?.write||typeof ClipboardItem>`u`)throw Error(`image clipboard is unavailable`);let n=wf(e.displayUrl,t,e.artifactId).then(Df);n.catch(()=>{}),await navigator.clipboard.write([new ClipboardItem({"image/png":n})]),A({message:Y(`common.copied`)})}catch{A({message:Y(`chat.imageLightbox.copyFailed`)})}};return z`
|
||
<span class="chat-image-actions">
|
||
<button
|
||
type="button"
|
||
class="chat-image-action"
|
||
title=${Y(`chat.imageLightbox.download`)}
|
||
aria-label=${Y(`chat.imageLightbox.download`)}
|
||
@click=${()=>void r()}
|
||
>
|
||
${q.download}
|
||
</button>
|
||
<button
|
||
type="button"
|
||
class="chat-image-action"
|
||
title=${Y(`chat.imageLightbox.copy`)}
|
||
aria-label=${Y(`chat.imageLightbox.copy`)}
|
||
@click=${()=>void i()}
|
||
>
|
||
${q.copy}
|
||
</button>
|
||
</span>
|
||
`}function kf(e){return hl(e)?(e.value=null,e.unavailableAt=Date.now(),e.retryAttempted||vl(e,Date.now()+jf,()=>{e.value===null&&(e.retryAttempted=!0,e.value=void 0,e.unavailableAt=void 0,_l(e))}),null):null}var Af,jf,Mf,Nf,Pf;function Ff(){return(Ff=e((()=>{B(),St(),dt(),an(),J(),K(),ja(),me(),tf(),sf(),hd(),Yl(),Af=3e4,jf=5e3,Mf=160,Nf=class extends Tt{constructor(...e){super(...e),this.requestUpdate=()=>this.onRequestUpdate?.()}render(e,t,n){if(this.image=e,this.options=t,this.renderImageElement=n,!this.isConnected)return bl(this.requestUpdate),this.cacheKey=void 0,this.onRequestUpdate=t?.onRequestUpdate,bt;let r=yf(e.displayUrl,t,e.artifactId);(this.cacheKey!==void 0&&this.cacheKey!==r||this.onRequestUpdate!==t?.onRequestUpdate)&&bl(this.requestUpdate),this.cacheKey=r,this.onRequestUpdate=t?.onRequestUpdate,this.onRequestUpdate&&yl(this.onRequestUpdate,this.requestUpdate);let i=this.onRequestUpdate?{...t,onRequestUpdate:this.requestUpdate}:t,a=xf(e.displayUrl,i,e.artifactId).then(t=>t?n(e,t):R);return xt(a,R)}disconnected(){bl(this.requestUpdate)}reconnected(){this.image&&this.renderImageElement&&this.setValue(this.render(this.image,this.options,this.renderImageElement))}},Pf=at(Nf)})))()}function If(e){let t=e.trim();if(t.length>Zf)return null;if(t.startsWith(`{`)&&t.endsWith(`}`)||t.startsWith(`[`)&&t.endsWith(`]`))try{return{parsed:JSON.parse(t),text:t}}catch{return null}return null}function Lf(e){if(Array.isArray(e))return Y(e.length===1?`chat.codeBlock.jsonArrayItem`:`chat.codeBlock.jsonArrayItems`,{count:String(e.length)});if(e&&typeof e==`object`){let t=Object.keys(e);return t.length<=4?`{ ${t.join(`, `)} }`:Y(`chat.codeBlock.jsonObjectKeys`,{count:String(t.length)})}return Y(`chat.codeBlock.jsonBadge`)}function Rf(e){return e.content.reduce((e,t)=>(t.type===`text`&&typeof t.text==`string`&&e.push(t.text),e),[]).join(`
|
||
`).trim()}function zf(e,t){let n=m(m(e)?.__openclaw);if(n?.truncated===!0&&n.reason===`oversized`)return Y(`chat.messages.tooLargeToDisplay`);let r=Rf(t);return bo(t.role)===`assistant`?Lr(r).trim():r.trim()}function Bf(e){return zf(e,Ur(e))}function Vf(e){let{message:t,messageId:n,canFetchFullMessage:r,onReply:i,senderLabel:a}=e,s=t,c=s.__openclaw&&typeof s.__openclaw==`object`&&!Array.isArray(s.__openclaw)?s.__openclaw:null,l=typeof c?.id==`string`?c.id:typeof s.messageId==`string`?s.messageId:void 0,u=Ur(t),d=bo(u.role),f=l?.startsWith(Vn)===!0,p=zf(t,u),m=!!((d===`assistant`||f)&&r&&l&&!s.openclawMessageToolMirror&&c?.truncated===!0),h=m&&l?e.getAssistantMessageExpansion?.(l):void 0,g=h?.status===`loaded`?h.markdown:p,_=d===`assistant`?Lr(g).trim():g,v=d===`assistant`||f?_:void 0,y=i&&!f?o(_,500):``;if(!v&&!y&&!m)return null;let b=bs(t);return{...v===void 0?{}:{markdown:v},messageId:l,...y?{replyTarget:{messageId:n,text:y,senderLabel:a,...b?{sourceMessageId:b}:{}}}:{},shouldFetchFullMessage:m}}function Hf(e,t){return z`
|
||
${e.replyTarget&&t.onReply?Uf(e.replyTarget,t.onReply):R}
|
||
${e.markdown?on(e.markdown):R}
|
||
`}function Uf(e,t){return z`
|
||
<openclaw-tooltip .content=${Y(`chat.messages.reply`)}>
|
||
<button
|
||
class="chat-reply-btn"
|
||
type="button"
|
||
aria-label=${Y(`chat.messages.replyToMessage`)}
|
||
@click=${()=>t(e)}
|
||
>
|
||
${q.messageSquare}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`}function Wf(e){return e.length>Qf||e.split(`
|
||
`,41).length>$f}function Gf(e){let t=null;return n=>{if(t?.disconnect(),t=null,!(n instanceof HTMLElement))return;let r=()=>{let t=n.parentElement,r=t?.querySelector(`:scope > .chat-message-disclosure__toggle`);if(!t||!r)return;let i=e||n.scrollHeight>n.clientHeight+1;t.classList.toggle(`has-overflow`,i),r.hidden=!i};queueMicrotask(r),typeof ResizeObserver==`function`&&(t=new ResizeObserver(r),t.observe(n))}}function Kf(e,t,n,r,i){if(n.assistantMessageDisclosure?.onRetryFullMessage)return qf(e,n.isStreaming,n.assistantMessageDisclosure,r,i);if(!n.onToggleUserMessageExpanded||!Wf(e))return Jf(e,n.isStreaming,r,i);let a=`user-message:${t}`,o=n.isUserMessageExpanded?.(a)??!1;return z`
|
||
<div class="chat-message-disclosure ${o?`is-expanded has-overflow`:``}">
|
||
<div class="chat-message-disclosure__content" ${U(Gf(o))}>
|
||
${Jf(e,n.isStreaming,r,i)}
|
||
</div>
|
||
<button
|
||
class="chat-message-disclosure__toggle"
|
||
type="button"
|
||
?hidden=${!o}
|
||
aria-label=${Y(o?`chat.messages.showLess`:`chat.messages.showMore`)}
|
||
aria-expanded=${String(o)}
|
||
@click=${()=>n.onToggleUserMessageExpanded?.(a)}
|
||
>
|
||
${o?q.chevronUp:q.chevronDown}
|
||
</button>
|
||
</div>
|
||
`}function qf(e,t,n,r,i,a){let o=Jf(n?.expanded?n.markdown??e:e,t,n?.expanded?{...r,mode:`document`}:r,i,a);return n?.onRetryFullMessage?z`
|
||
${o}
|
||
<div class="chat-message-load-error">
|
||
${Y(`chat.messages.fullContentLoadExhausted`)}
|
||
<button
|
||
type="button"
|
||
class="chat-message-load-error__retry"
|
||
@click=${n.onRetryFullMessage}
|
||
>
|
||
${Y(`common.retry`)}
|
||
</button>
|
||
</div>
|
||
`:o}function Jf(e,t,n,r,i){let a=t?Mo(e,n,i):Da(e,n),o=r?Yf(a,r):a;return z`
|
||
<div class="chat-text" dir="${oa(e)}">${gt(o)}</div>
|
||
`}function Yf(e,t){let n=document.createElement(`template`);n.innerHTML=e;let r=n.content.lastElementChild,i=r?Xf(r):null,a=document.createElement(`span`);return a.className=`chat-duplicate-count`,a.setAttribute(`aria-label`,t.label),a.textContent=`×${t.count}`,(i??n.content).append(document.createTextNode(`\xA0`),a),n.innerHTML}function Xf(e){if(/^(?:P|H[1-6])$/u.test(e.tagName))return e;if(!/^(?:BLOCKQUOTE|LI|OL|UL)$/u.test(e.tagName))return null;let t=e.lastElementChild;return t?Xf(t):e.textContent?.trim()?e:null}var Zf,Qf,$f;function ep(){return(ep=e((()=>{B(),V(),yt(),Un(),vn(),J(),er(),K(),Wi(),xr(),_i(),us(),Zf=2e4,Qf=1200,$f=40})))()}var tp,np;function rp(){return(rp=e((()=>{St(),u(),tp=class extends Tt{constructor(...e){super(...e),this.highlighted=new Map,this.renderLine=e=>this.highlighted.get(e)??(e.text||` `)}render(e,t,n){let{path:r,oldPath:i=r}=t;return this.renderDiff=n,(this.lines!==e||this.path!==r||this.oldPath!==i)&&(this.lines=e,this.path=r,this.oldPath=i,this.highlighted=new Map,c(async()=>{let{highlightDiffLines:e}=await import(`./chat-diff-highlight.runtime-CbXKn64d.js`);return{highlightDiffLines:e}},__vite__mapDeps([25,2,5,3,4,6,7,8,9,26,27]),import.meta.url).then(({highlightDiffLines:t})=>t(e,r,i)).then(t=>{this.lines===e&&this.path===r&&this.oldPath===i&&(this.highlighted=t,this.isConnected&&this.setValue(this.renderDiff?.(this.renderLine)))}).catch(()=>{})),n(this.renderLine)}reconnected(){this.setValue(this.renderDiff?.(this.renderLine))}},np=at(tp)})))()}function ip(e){return e.modified===void 0?z`<span class="chat-diffstat">
|
||
<span class="chat-diffstat__add">+${e.added}</span>
|
||
<span class="chat-diffstat__del">-${e.removed}</span>
|
||
</span>`:e.added===0&&e.removed===0&&!e.modified?R:z`<span class="chat-diffstat">
|
||
${e.added>0?z`<span class="chat-diffstat__add">+${e.added}</span>`:R}
|
||
${e.removed>0?z`<span class="chat-diffstat__del">-${e.removed}</span>`:R}
|
||
${e.modified>0?z`<span class="chat-diffstat__mod">~${e.modified}</span>`:R}
|
||
</span>`}function ap(e,t=`succeeded`,n,r={path:``}){let i=e.some(e=>e.lineNo!==void 0);return np(e,r,r=>z`
|
||
<div
|
||
class="chat-diff code-highlight"
|
||
role="figure"
|
||
aria-label=${Y(t===`succeeded`?`chat.toolCards.fileChanges`:`chat.toolCards.attemptedChanges`)}
|
||
>
|
||
${e.map(e=>{if(e.kind===`skip`)return z`<div class="chat-diff__row chat-diff__row--skip">
|
||
${i?z`<span class="chat-diff__gutter"></span>`:R}
|
||
<span class="chat-diff__sign"></span>
|
||
<span class="chat-diff__text">${(n?.(e)??e.text)||`⋯`}</span>
|
||
</div>`;let t=e.kind===`add`?`chat-diff__row--add`:e.kind===`del`?`chat-diff__row--del`:e.kind===`file`?`chat-diff__row--file`:``,a=e.kind===`add`?`+`:e.kind===`del`?`-`:``;return z`<div class="chat-diff__row ${t}">
|
||
${i?z`<span class="chat-diff__gutter">${e.lineNo??``}</span>`:R}
|
||
<span class="chat-diff__sign">${a}</span>
|
||
<span class="chat-diff__text">${r(e)}</span>
|
||
</div>`})}
|
||
</div>
|
||
`)}function op(){return(op=e((()=>{B(),K(),rp()})))()}function sp(e,t={}){let n=e.contentWindow;if(!n)return Promise.reject(Error(`widget frame is unavailable`));let r=t.id??Array.from(crypto.getRandomValues(new Uint32Array(4)),e=>e.toString(16).padStart(8,`0`)).join(``),i=t.timeoutMs??fp;return new Promise((e,t)=>{let a=()=>{window.removeEventListener(`message`,s),globalThis.clearTimeout(c)},o=e=>{a(),t(e)},s=t=>{if(t.source!==n)return;let i=t.data;!i||i.type!==dp||i.id!==r||(typeof i.error==`string`?o(Error(i.error)):typeof i.dataUrl!=`string`||!i.dataUrl.startsWith(`data:image/png;base64,`)||i.dataUrl.length>pp?o(Error(`widget returned an invalid snapshot`)):(a(),e(i.dataUrl)))};window.addEventListener(`message`,s);let c=globalThis.setTimeout(()=>o(new mp(`widget snapshot request timed out`)),i);try{n.postMessage({type:up,id:r},`*`)}catch(e){o(e instanceof Error?e:Error(String(e)))}})}function cp(e,t){let n=document.createElement(`a`);n.href=e,n.download=t,n.click()}async function lp(e,t,n,r={}){let i=Array.from((n??``).trim(),e=>{let t=e.codePointAt(0)??0;return t<=31||t===127||`<>:"/\\|?*`.includes(e)?`-`:e}).join(``).replace(/\s+/g,`-`).replace(/-+/g,`-`).replace(/^[. -]+|[. -]+$/g,``).slice(0,120).replace(/[. -]+$/g,``)||`widget`,a=(r.requestSnapshot??sp)(t,r.timeoutMs===void 0?{}:{timeoutMs:r.timeoutMs});if(e===`copy`){let e=r.copyImage??(e=>{if(!navigator.clipboard?.write||typeof ClipboardItem>`u`)throw Error(`image clipboard is unavailable`);let t=e.then(async e=>(await globalThis.fetch(e)).blob());return t.catch(()=>{}),navigator.clipboard.write([new ClipboardItem({"image/png":t})])});try{return await e(a),`png`}catch(e){let t=await a.then(()=>null,e=>e);if(t instanceof mp)return`rerender-required`;throw t??e}}try{let e=await a;return(r.download??cp)(e,`${i}.png`),`png`}catch(e){if(!(e instanceof mp))throw e;let n=t.getAttribute(`src`);if(!n)throw Error(`widget document URL is unavailable`,{cause:e});let a=new URL(n,window.location.href);if(a.origin!==window.location.origin)throw Error(`widget document URL is not same-origin`,{cause:e});let o=await(r.fetch??globalThis.fetch)(a.href);if(!o.ok)throw Error(`widget document download failed (${o.status})`,{cause:e});let s=URL.createObjectURL(await o.blob());try{(r.download??cp)(s,`${i}.html`)}finally{URL.revokeObjectURL(s)}return`html`}}var up,dp,fp,pp,mp;function hp(){return(hp=e((()=>{up=`openclaw:widget-snapshot-request`,dp=`openclaw:widget-snapshot`,fp=5e3,pp=33554432,mp=class extends Error{}})))()}var gp;function _p(){return(_p=e((()=>{Ln(),B(),ut(),Yt(),nn(),rn(),Ga(),J(),mn(),jn(),K(),mo(),ja(),Pe(),tt(),gp=class extends Re{constructor(){super(),this.latest=!1,this.subscriptions=new qe(this),this.openPanel=()=>{let e=Qr(this.preview);e&&this.dispatchEvent(new CustomEvent(En,{detail:{open:!0,browserTab:e},bubbles:!0,composed:!0}))},this.onMenuSelect=e=>{let t=this.preview?.url;t&&(e.detail.item.value===`copy-url`?navigator.clipboard.writeText(t).catch(()=>{}):e.detail.item.value===`open-new-tab`&&vo(t))},this.subscriptions.watch(()=>this.context?.gateway,(e,t)=>e.subscribe(t))}static{this.styles=_t`
|
||
:host {
|
||
display: block;
|
||
max-width: 320px;
|
||
margin-block: 6px;
|
||
}
|
||
.card {
|
||
overflow: hidden;
|
||
background: var(--card);
|
||
border: 1px solid var(--border);
|
||
border-radius: var(--radius-md);
|
||
}
|
||
.shot {
|
||
display: block;
|
||
width: 100%;
|
||
padding: 0;
|
||
background: none;
|
||
border: 0;
|
||
cursor: default;
|
||
}
|
||
.shot img {
|
||
display: block;
|
||
width: 100%;
|
||
height: auto;
|
||
max-height: 240px;
|
||
object-fit: cover;
|
||
object-position: top;
|
||
}
|
||
.bar {
|
||
position: relative;
|
||
display: flex;
|
||
align-items: center;
|
||
gap: 8px;
|
||
min-width: 0;
|
||
padding: 7px 8px 7px 10px;
|
||
}
|
||
.shot + .bar {
|
||
border-top: 1px solid var(--border);
|
||
}
|
||
.icon {
|
||
display: flex;
|
||
flex: 0 0 16px;
|
||
color: var(--muted);
|
||
}
|
||
.icon svg {
|
||
width: 16px;
|
||
height: 16px;
|
||
}
|
||
.identity {
|
||
display: grid;
|
||
flex: 1;
|
||
min-width: 0;
|
||
gap: 1px;
|
||
}
|
||
.title,
|
||
.url {
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
white-space: nowrap;
|
||
}
|
||
.title {
|
||
font-size: 0.8rem;
|
||
font-weight: 500;
|
||
}
|
||
.url {
|
||
color: var(--muted);
|
||
font-size: 0.72rem;
|
||
}
|
||
.actions {
|
||
display: flex;
|
||
flex: none;
|
||
gap: 2px;
|
||
align-items: center;
|
||
opacity: 0;
|
||
transition: opacity 120ms ease;
|
||
}
|
||
.card:hover .actions,
|
||
.card:focus-within .actions,
|
||
.actions:has(wa-dropdown[open]) {
|
||
opacity: 1;
|
||
}
|
||
.actions button {
|
||
display: flex;
|
||
align-items: center;
|
||
padding: 4px 8px;
|
||
color: var(--text);
|
||
font: inherit;
|
||
font-size: 0.75rem;
|
||
background: none;
|
||
border: 0;
|
||
border-radius: var(--radius-sm);
|
||
cursor: default;
|
||
}
|
||
.actions button:hover {
|
||
background: var(--panel-hover);
|
||
}
|
||
.actions button:focus-visible {
|
||
outline: 2px solid var(--accent);
|
||
outline-offset: -2px;
|
||
}
|
||
.actions .more svg {
|
||
width: 16px;
|
||
height: 16px;
|
||
}
|
||
`}updated(){let e=this.preview,t=this.context,n=t?.gateway.snapshot,r=n?.client,i=this.revision;if(!e||!t||!n||!r||!Ut(n)||!this.latest||!i){(!this.latest||!n||!Ut(n))&&(this.requestIdentity=void 0,this.thumbnailSrc=void 0);return}let a=JSON.stringify([rr(e),i]);if(this.requestIdentity?.key===a&&this.requestIdentity.client===r)return;let o={client:r,key:a};this.requestIdentity=o,this.thumbnailSrc=void 0,Ca({client:r,tab:e,revision:i,resourceBasePath:t.resourceBasePath,authToken:jt({hello:n.hello,settings:{token:t.gateway.connection.token},password:t.gateway.connection.password})}).then(e=>{this.requestIdentity===o&&(this.thumbnailSrc=e)})}render(){let e=this.preview;if(!e)return R;let t=this.requestIdentity?.client===this.context?.gateway.snapshot.client&&this.requestIdentity?.key===JSON.stringify([rr(e),this.revision])?this.thumbnailSrc:void 0,n=e.url;try{n=new URL(e.url??``).host||e.url}catch{}let r=e.title?.trim()||n||Y(`browser.title`),i=e.url?`${r} — ${e.url}`:r;return z`
|
||
<div class="card">
|
||
${t?z`
|
||
<button
|
||
type="button"
|
||
class="shot"
|
||
aria-label=${i}
|
||
title=${Y(`browser.openPanel`)}
|
||
@click=${this.openPanel}
|
||
>
|
||
<img src=${t} alt="" />
|
||
</button>
|
||
`:R}
|
||
<div class="bar">
|
||
<span class="icon" aria-hidden="true">${q.globe}</span>
|
||
<span class="identity">
|
||
<span class="title">${r}</span>
|
||
${e.url?z`<span class="url">${e.url}</span>`:R}
|
||
</span>
|
||
<span class="actions">
|
||
<button type="button" title=${Y(`browser.openPanel`)} @click=${this.openPanel}>
|
||
${Y(`browser.open`)}
|
||
</button>
|
||
<wa-dropdown placement="bottom-end" @wa-select=${this.onMenuSelect}>
|
||
<button
|
||
slot="trigger"
|
||
type="button"
|
||
class="more"
|
||
aria-haspopup="menu"
|
||
title=${Y(`browser.moreActions`)}
|
||
>
|
||
${q.moreHorizontal}
|
||
</button>
|
||
<wa-dropdown-item value="copy-url">${Y(`browser.copyUrl`)}</wa-dropdown-item>
|
||
<wa-dropdown-item value="open-new-tab" data-new-tab-action>
|
||
${Y(`browser.openNewTab`)}
|
||
</wa-dropdown-item>
|
||
</wa-dropdown>
|
||
</span>
|
||
</div>
|
||
</div>
|
||
`}},h([In({context:Zt,subscribe:!0}),H({attribute:!1})],gp.prototype,`context`,void 0),h([H({attribute:!1})],gp.prototype,`preview`,void 0),h([H({attribute:!1})],gp.prototype,`revision`,void 0),h([H({type:Boolean})],gp.prototype,`latest`,void 0),h([W()],gp.prototype,`thumbnailSrc`,void 0),customElements.get(`openclaw-browser-tab-card`)||customElements.define(`openclaw-browser-tab-card`,gp)})))()}async function vp(e,t){let n=e.currentTarget;if(n instanceof HTMLButtonElement){n.disabled=!0,n.title=n.ariaLabel=Y(`chat.toolCards.pinToDashboardPending`);try{await t(),n.title=n.ariaLabel=Y(`chat.toolCards.pinnedToDashboard`),n.dataset.pinned=`true`}catch{n.disabled=!1,n.ariaLabel=Y(`chat.toolCards.pinToDashboard`);let e=Y(`chat.toolCards.pinToDashboardFailed`);n.title=e,A({message:e})}}}async function yp(e,t,n,r){let i=t.viewId?.trim();if(i)return vp(e,()=>n.pinWidget({docId:i,name:r,...t.title?.trim()?{title:t.title.trim()}:{}}))}async function bp(e,t,n,r,i){return vp(e,()=>n.pinMcpApp({viewId:i,name:r,...t.title?.trim()?{title:t.title.trim()}:{}}))}function xp(e){if(e.boardWidgetName)return e.boardWidgetName;let t=e.viewId?.trim();return t?Rr(t):void 0}function Sp(e){let t=e.viewId?.trim(),n=e.url?.trim();if(!t||!n)return!1;try{let e=new URL(n,`http://localhost`);if(e.origin!==`http://localhost`||!e.pathname.startsWith(`/__openclaw__/canvas/documents/`))return!1;let[r,i]=e.pathname.slice(31).split(`/`,2);if(!r||!i)return!1;let a=decodeURIComponent(r);return/^[A-Za-z0-9._-]+$/u.test(a)&&a===t}catch{return!1}}function Cp(e,t){if(!Wp.has(e)&&Wp.size>=Kp){let e=Wp.keys().next().value;e!==void 0&&Wp.delete(e)}Wp.set(e,t)}function wp(e){let t=e.currentTarget;t instanceof HTMLIFrameElement&&Up.add(t)}function Tp(e,t){let n=t;!n||n.type!==Rp||Jo(e,n.prompt,e.getAttribute(`src`)??``)}function Ep(e){let t=e.contentWindow;if(Zp.has(e)||!Xp.has(e)||!t)return;let n=Jp.get(t);n&&(Zp.add(e),Jp.delete(t),n.addEventListener(`message`,t=>{Tp(e,t.data)}),n.start(),n.postMessage({type:zp}))}function Dp(){typeof window>`u`||Qp.has(window)||(Qp.add(window),window.addEventListener(`message`,e=>{let t=e.data;if(!t||t.type!==Lp)return;let n=e.source,r=e.ports[0];if(!(!n||!r||e.origin!==`null`)){if(Yp.has(n)){r.close();return}Yp.add(n),Jp.set(n,r);for(let e of Up)if(e.contentWindow===n){Ep(e);return}}}))}function Op(e){Xp.add(e),Ep(e)}function kp(){typeof window>`u`||qp.has(window)||(qp.add(window),window.addEventListener(`message`,e=>{let t=e.data;if(!(!t||t.type!==Ip||typeof t.height!=`number`))for(let n of Up){if(!n.isConnected){Up.delete(n);continue}if(n.contentWindow===e.source){let e=Math.min(Math.max(Math.trunc(t.height),Vp),Hp);n.style.height=`${e}px`,n.style.minHeight=`${e}px`;let r=n.getAttribute(Gp)??n.getAttribute(`src`);r&&Cp(r,e);return}}}))}function Ap(e){kp(),Lo();let t=e.sandbox??``,n=e.src??``,r=e.frameKey||n,i=(r?Wp.get(r):void 0)??e.height;return e.promptCapable&&Dp(),wt(`${t}\u0000${e.frameKey??``}\u0000${+!!n}\u0000${e.connectionGeneration??0}\u0000${e.height??``}`,z`
|
||
<iframe
|
||
${U(e=>{e instanceof HTMLIFrameElement&&(r&&e.setAttribute(Gp,r),n&&!e.hasAttribute(`src`)&&e.setAttribute(`src`,n))})}
|
||
class="chat-tool-card__preview-frame"
|
||
title=${e.title}
|
||
sandbox=${t}
|
||
style=${i?`height:${i}px;min-height:${i}px`:``}
|
||
@load=${t=>{if(wp(t),t.currentTarget instanceof HTMLIFrameElement){let n=t.currentTarget;e.promptCapable&&Op(n),Ea(n),n.contentWindow?.postMessage({type:Bp},`*`)}}}
|
||
></iframe>
|
||
`)}function jp(e){return It(`mcp-app-view`,$p).catch(e=>{console.error(`[openclaw] failed to load MCP App view`,e)}),z`<mcp-app-view
|
||
.sessionKey=${e.sessionKey}
|
||
.viewId=${e.viewId}
|
||
.height=${e.height}
|
||
.title=${e.title}
|
||
></mcp-app-view>`}function Mp(e,t,n){switch(e){case`canvas-html`:{let e=li(t.url);return Ap({title:t.title?.trim()||Y(`chat.toolCards.canvas`),src:Xa(t.url,n?.canvasPluginSurfaceUrl,n?.allowExternalEmbedUrls??!1),frameKey:t.url?.trim()||t.viewId?.trim(),connectionGeneration:e?Xe():void 0,height:t.preferredHeight,sandbox:ar(n?.embedSandboxMode??`scripts`,t.sandbox),promptCapable:e})}case`mcp-app`:return t.mcpApp?jp({sessionKey:n?.sessionKey??``,viewId:t.mcpApp.viewId,height:t.preferredHeight??600,title:t.title?.trim()||Y(`mcpApp.title`)}):R}return R}function Np(e,t){let n=e.detail.item.value;if(n===`raw-details`){let t=e.currentTarget,n=(t instanceof HTMLElement?t.closest(`.chat-tool-card__widget-host`):null)?.querySelector(`.chat-tool-card__widget-raw .chat-tool-card__raw-toggle`);n?.click(),(t instanceof HTMLElement?t.querySelector(`[data-raw-label]`):null)?.replaceChildren(Y(n&&n.getAttribute(`aria-expanded`)===`true`?`chat.toolCards.hideRawDetails`:`chat.toolCards.showRawDetails`));return}if(n!==`copy`&&n!==`download`)return;let r=e.currentTarget,i=r instanceof HTMLElement?r.closest(`.chat-tool-card__preview`)?.querySelector(`.chat-tool-card__preview-frame`):null;if(!i){A({message:Y(`chat.toolCards.widgetExportFailed`)});return}lp(n,i,t).then(e=>{e===`rerender-required`?A({message:Y(`chat.toolCards.widgetExportRerender`)}):e===`html`?A({message:Y(`chat.toolCards.widgetExportHtmlFallback`)}):n===`copy`&&A({message:Y(`common.copied`)})}).catch(()=>{A({message:Y(`chat.toolCards.widgetExportFailed`)})})}function Pp(e,t){let n=!e.mcpApp&&li(e.url);return!n&&!t?R:z`
|
||
<wa-dropdown
|
||
class="chat-tool-card__widget-actions"
|
||
placement="bottom-end"
|
||
aria-label=${Y(`chat.toolCards.widgetActions`)}
|
||
@wa-select=${t=>Np(t,e.title)}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
type="button"
|
||
class="btn btn--ghost btn--icon chat-tool-card__widget-actions-trigger"
|
||
aria-label=${Y(`chat.toolCards.widgetActions`)}
|
||
title=${Y(`chat.toolCards.widgetActions`)}
|
||
>
|
||
${q.moreHorizontal}
|
||
</button>
|
||
${n?z`
|
||
<wa-dropdown-item class="session-menu__item" value="copy">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true"
|
||
>${q.copyImage}</span
|
||
>
|
||
<span class="session-menu__text">${Y(`chat.toolCards.copyAsImage`)}</span>
|
||
</wa-dropdown-item>
|
||
<wa-dropdown-item class="session-menu__item" value="download">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true"
|
||
>${q.download}</span
|
||
>
|
||
<span class="session-menu__text">${Y(`chat.toolCards.downloadAsImage`)}</span>
|
||
</wa-dropdown-item>
|
||
`:R}
|
||
${t?z`<wa-dropdown-item class="session-menu__item" value="raw-details">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.fileText}</span>
|
||
<span class="session-menu__text" data-raw-label
|
||
>${Y(`chat.toolCards.showRawDetails`)}</span
|
||
>
|
||
</wa-dropdown-item>`:R}
|
||
</wa-dropdown>
|
||
`}function Fp(e,t,n){if(!e)return R;if(e.kind===`browser-tab`)return t===`chat_tool`?z`<openclaw-browser-tab-card
|
||
.preview=${e}
|
||
.revision=${n?.browserTabRevision}
|
||
.latest=${n?.browserTabLatest??!1}
|
||
></openclaw-browser-tab-card>`:R;if(e.kind!==`canvas`||t===`chat_tool`||e.mcpApp&&t!==`chat_message`||e.surface!==`assistant_message`)return R;let r=e.mcpApp?`mcp-app`:`canvas-html`,i=n?.boardProvider,a=e.mcpApp?.viewId?.trim(),o=e.mcpApp?a?Ti(a):void 0:xp(e),s=!!(o&&i?.snapshot$.value.widgets.find(e=>e.name===o)),c=Y(s?`chat.toolCards.pinnedToDashboard`:`chat.toolCards.pinToDashboard`),l=i&&(r===`mcp-app`?i.canPinMcpApps:i.canPinWidgets)&&o&&(r===`canvas-html`&&e.sandbox===`scripts`&&Sp(e)||r===`mcp-app`&&a)?z`<button
|
||
class="btn btn--ghost btn--icon chat-tool-card__widget-action"
|
||
type="button"
|
||
data-pin-widget
|
||
?disabled=${s}
|
||
?data-pinned=${s}
|
||
title=${c}
|
||
aria-label=${c}
|
||
@click=${t=>r===`mcp-app`&&a?void bp(t,e,i,o,a):void yp(t,e,i,o)}
|
||
>
|
||
${q.pin}
|
||
</button>`:R,u=Pp(e,!!n?.rawText),d=l===R&&u===R?R:z`<div class="chat-tool-card__preview-actions" data-widget-actions>
|
||
${l} ${u}
|
||
</div>`;return z`
|
||
<div
|
||
class="chat-tool-card__preview"
|
||
data-content-kind=${r}
|
||
?data-has-widget-actions=${d!==R}
|
||
data-kind="canvas"
|
||
data-surface=${t}
|
||
>
|
||
${d}
|
||
<div class="chat-tool-card__preview-panel" data-side="canvas">
|
||
${Mp(r,e,n)}
|
||
</div>
|
||
</div>
|
||
`}var Ip,Lp,Rp,zp,Bp,Vp,Hp,Up,Wp,Gp,Kp,qp,Jp,Yp,Xp,Zp,Qp,$p,em;function tm(){return(tm=e((()=>{B(),rt(),V(),Lt(),J(),ba(),mn(),K(),ni(),fe(),mr(),me(),to(),hp(),_p(),u(),Ip=`openclaw:widget-size`,Lp=`openclaw:widget-prompt-offer`,Rp=`openclaw:widget-prompt`,zp=`openclaw:widget-prompt-host-ready`,Bp=`openclaw:widget-chat-host`,Vp=48,Hp=8e3,Up=new Set,Wp=new Map,Gp=`data-frame-key`,Kp=100,qp=new WeakSet,Jp=new WeakMap,Yp=new WeakSet,Xp=new WeakSet,Zp=new WeakSet,Qp=new WeakSet,$p=async()=>{(await c(()=>import(`./mcp-app-view-registration-BaqCYBMP.js`),__vite__mapDeps([28,2,3,4,5,6,7,8,9,10,11,1,12,13,14,15,16,17,18,19,20,21,22,23]),import.meta.url)).registerMcpAppView()},em=Fp})))()}function nm(e,t){let n=e.flatMap(e=>e.messages.flatMap(e=>Ia(e.message,e.key))),r=new Map;for(let e of n)e.preview?.kind===`browser-tab`&&fr(e,!1)===`succeeded`&&r.set(rr(e.preview),e);return[...r.values()].map(e=>{let n=e.preview;if(n?.kind!==`browser-tab`)return R;let r=ma(e);return em(n,`chat_tool`,{browserTabRevision:r?JSON.stringify([t.sessionKey,r]):void 0,browserTabLatest:!!(r&&t.latestBrowserTabs?.get(rr(n))?.revision===r)})})}function rm(e){if(e.detail===0)return!0;let t=e.currentTarget,n=window.getSelection();return!(t instanceof Node)||!n||n.isCollapsed?!0:![n.anchorNode,n.focusNode].some(e=>e!==null&&t.contains(e))}function im(e){if(ki(e))return"```\n"+e+"\n```";let t=e.trim();if(t.startsWith(`{`)||t.startsWith(`[`))try{return JSON.parse(t),"```json\n"+t+"\n```"}catch{return e}return e}function am(e){return q[e]??q.puzzle}function om(e,t=`text`){if(!e?.trim())return``;if(t===`json`)return`\`\`\`json
|
||
${e}
|
||
\`\`\``;let n=im(e);return n.includes("```")?n:`\`\`\`text
|
||
${e}
|
||
\`\`\``}function sm(e){let t=qa({name:e.name,args:e.args}),n=gr(t),r=Wo(e),i=fr(e,!1),a=[`## ${t.label}`,`**${Y(`chat.toolCards.tool`)}:** \`${t.name}\``];if(n&&a.push(`**${Y(`chat.toolCards.summary`)}:** ${n}`),e.inputText?.trim()){let t=typeof e.args==`object`&&e.args!==null;a.push(`### ${Y(`chat.toolCards.toolInput`)}\n${om(e.inputText,t?`json`:`text`)}`)}return e.outputText?.trim()?a.push(`### ${Y(r?`chat.toolCards.toolError`:`chat.toolCards.toolOutput`)}\n${im(e.outputText)}`):a.push(r?`### ${Y(`chat.toolCards.toolError`)}\n*${Y(`chat.toolCards.noOutputFailed`)}*`:i===`succeeded`?`### ${Y(`chat.toolCards.toolOutput`)}\n*${Y(`chat.toolCards.noOutputSucceeded`)}*`:`### ${Y(`chat.toolCards.toolOutput`)}\n*${Y(`chat.toolCards.noResult`)}*`),a.join(`
|
||
|
||
`)}function cm(e){let t=e.currentTarget,n=(t?.closest(`.chat-tool-card__raw`))?.querySelector(`.chat-tool-card__raw-body`);if(!t||!n)return;let r=t.getAttribute(`aria-expanded`)===`true`;t.setAttribute(`aria-expanded`,String(!r)),n.hidden=r}function lm(e,t){return{kind:`markdown`,content:e,...t?.rawText?{rawText:t.rawText}:{}}}function um(e,t){return e.kind!==`canvas`||e.render!==`url`||!e.viewId||!e.url?null:{kind:`canvas`,docId:e.viewId,entryUrl:e.url,...e.title?{title:e.title}:{},...e.preferredHeight?{preferredHeight:e.preferredHeight}:{},...e.sandbox?{sandbox:e.sandbox}:{},...t?{rawText:t}:{}}}function dm(e){return z`
|
||
<div class="chat-tool-card__raw">
|
||
<button
|
||
class="chat-inline-disclosure chat-tool-card__raw-toggle"
|
||
type="button"
|
||
aria-expanded="false"
|
||
@click=${cm}
|
||
>
|
||
<span>${Y(`chat.toolCards.rawDetails`)}</span>
|
||
<span class="chat-inline-disclosure__chevron" aria-hidden="true">${q.chevronDown}</span>
|
||
</button>
|
||
<div class="chat-tool-card__raw-body" hidden>${fm({text:e})}</div>
|
||
</div>
|
||
`}function fm(e){let{label:t,text:n}=e,r=ki(n)?`markdown-block-art`:``;return z`
|
||
<div class="chat-tool-card__block">
|
||
${t?z`<div class="chat-tool-card__block-header">
|
||
<span class="chat-tool-card__block-icon">${q.zap}</span>
|
||
<span class="chat-tool-card__block-label">${t}</span>
|
||
</div>`:R}
|
||
<pre class="chat-tool-card__block-content"><code class=${r}>${n}</code></pre>
|
||
</div>
|
||
`}function pm(e){if(e.kind===`write`)return`write`;if(e.kind!==`edit`)return;let t=new Set(e.fileOperations?.map(({operation:e})=>e));return t.size>1?`mixed`:t.values().next().value??`update`}function mm(e,t){let n=pm(e);if(n){let e=Um[n],r=t===`running`?e.running:t===`succeeded`?e.succeeded:e.fallback;return Y(r)}let r=Hm[e.kind];return r?Y(r):void 0}function hm(e){return e.split(`
|
||
`)[0]?.trim()??``}function gm(e,t){return t!==`edit`&&t!==`write`?e:e.split(/[\\/]/u).findLast(Boolean)??e}function _m(e){let t=e.currentTarget;if(!(t instanceof HTMLElement))return;let n=t.querySelector(`.chat-tool-disclosure__content`);t.classList.toggle(`chat-tool-disclosure--overflowing`,!!(n&&n.scrollWidth>n.clientWidth))}function vm(e,t,n){if(t.kind===`command`&&t.command){let e=hm(t.command);return z`
|
||
<span class="chat-tool-row__prompt" aria-hidden="true">$</span>
|
||
<code class="chat-tool-row__cmd">${Cm(e)}</code>
|
||
`}let r=mm(t,n);if(r&&t.target){let i=n===`succeeded`?t.stat:n===`running`&&(t.kind===`edit`||t.kind===`write`)?e.liveDiffStat:void 0;return z`
|
||
<span class="chat-tool-row__verb">${r}</span>
|
||
<span class="chat-tool-row__target">${gm(t.target,t.kind)}</span>
|
||
${i?ip(i):R}
|
||
${t.targetDetail&&t.kind!==`edit`&&t.kind!==`write`?z`<span class="chat-tool-row__detail">${t.targetDetail}</span>`:R}
|
||
`}let i=qa({name:e.name,args:e.args,detailMode:`explain`}),a=Fm({card:e,displayLabel:i.label,displayDetail:i.detail}),o=Ro(a.label)??a.label,s=Ai(e.args),c=qo(s??a.name,o),l=$s(e.name,e.args);return l?z`
|
||
<span class="chat-tool-row__title">${l}</span>
|
||
<span class="chat-tool-row__detail">${s??o}</span>
|
||
`:z`
|
||
<span class="chat-tool-msg-summary__label">${o}</span>
|
||
${c?z`<span class="chat-tool-msg-summary__names">${c}</span>`:R}
|
||
`}function ym(e){return Array.isArray(e)?e.flatMap(e=>{let t=m(e);return typeof t?.step!=`string`||t.status!==`pending`&&t.status!==`in_progress`&&t.status!==`completed`?[]:[{step:t.step,status:t.status}]}):[]}function bm(e,t){if(e.name.trim().toLowerCase()!==`progress_card`)return null;let n=m(e.args),r=ym(n?.plan),i=typeof n?.markdown==`string`?n.markdown.trim():``,a=r.filter(e=>e.status===`completed`).length,o=r.find(e=>e.status===`in_progress`)??r.find(e=>e.status===`pending`)??r.findLast(e=>e.status===`completed`),s=t===`failed`?Y(`sessionProgressCard.receipt.failed`):t===`running`?Y(`sessionProgressCard.receipt.updating`):r.length>0?Y(`sessionProgressCard.receipt.updated`,{completed:String(a),current:o?.step??``,total:String(r.length)}):Y(i?`sessionProgressCard.receipt.noteUpdated`:`sessionProgressCard.receipt.cleared`);return z`<div class="chat-tool-msg-collapse chat-progress-card-receipt">
|
||
<div class="chat-tool-msg-summary chat-tool-row" role="status">
|
||
<span class="chat-tool-msg-summary__icon">${am(`listChecks`)}</span>
|
||
<span class="chat-tool-msg-summary__label">${s}</span>
|
||
</div>
|
||
</div>`}function xm(e,t,n,r,i){let a=mm(t,n);if(!a||!t.target)return vm(e,t,n);let o=n===`succeeded`?t.stat:n===`running`&&(t.kind===`edit`||t.kind===`write`)?e.liveDiffStat:void 0,s=gm(t.target,t.kind);return z`
|
||
<span class="chat-tool-row__verb">${a}</span>
|
||
${r&&i?z`<button
|
||
class="chat-tool-row__file-link"
|
||
type="button"
|
||
title=${Y(`chat.toolCards.openFile`)}
|
||
@click=${e=>{e.stopPropagation(),i({path:r})}}
|
||
>
|
||
${s}
|
||
</button>`:z`<span class="chat-tool-row__target">${s}</span>`}
|
||
${o?ip(o):R}
|
||
`}function Sm(e){let t=[],n=0,r=!0;for(;n<e.length;){let i=e.charAt(n);if(/\s/.test(i)){let r=n;for(;r<e.length&&/\s/.test(e.charAt(r));)r++;t.push({text:e.slice(n,r),cls:`ws`}),n=r;continue}if(i===`'`||i===`"`){let a=n+1;for(;a<e.length&&e.charAt(a)!==i;)a+=e.charAt(a)===`\\`?2:1;a=Math.min(a+1,e.length),t.push({text:e.slice(n,a),cls:`str`}),n=a,r=!1;continue}if(Km.has(i)){let i=n;for(;i<e.length&&Km.has(e.charAt(i));)i++;t.push({text:e.slice(n,i),cls:`op`}),n=i,r=!0;continue}let a=n;for(;a<e.length&&!/\s/.test(e.charAt(a))&&!Km.has(e.charAt(a))&&e.charAt(a)!==`'`&&e.charAt(a)!==`"`;)a++;let o=e.slice(n,a),s=r?`name`:o.startsWith(`-`)?`flag`:/^\d+(?:[.,]\d+)?$/.test(o)?`num`:`plain`;t.push({text:o,cls:s}),n=a,r=!1}return t}function Cm(e){return e.length>Gm?z`${e}`:z`${Sm(e).map(e=>e.cls===`ws`||e.cls===`plain`?z`${e.text}`:z`<span class="chat-cmd--${e.cls}">${e.text}</span>`)}`}function wm(e){if(typeof e==`string`)return o(e,Jm);if(e==null||typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);try{return o(JSON.stringify(e),Jm)}catch{return Object.prototype.toString.call(e)}}function Tm(e){return z`
|
||
<div class="chat-tool-kv">
|
||
${Object.entries(e).map(([e,t])=>z`
|
||
<div class="chat-tool-kv__row">
|
||
<span class="chat-tool-kv__key">${e}:</span>
|
||
<span class="chat-tool-kv__value">${wm(t)}</span>
|
||
</div>
|
||
`)}
|
||
</div>
|
||
`}function Em(e){if(!S(e))return!1;let t=Object.keys(e);return t.length>0&&t.length<=qm}function Dm(e,t){if(!S(e))return null;let n=Ym[t];if(!n)return e;let r=Object.fromEntries(Object.entries(e).filter(([e])=>!n.has(e)));return Object.keys(r).length>0?r:null}function Om(e,t){let n=t.fileOperations?.length===1?t.fileOperations[0]:void 0;if(n?.operation===`delete`)return null;let r=m(e.args);if(r)for(let e of[`path`,`file_path`,`filePath`,`notebook_path`]){let t=r[e];if(typeof t==`string`&&t.trim())return t}let i=`${t.targetDetail?`${t.targetDetail}/`:``}${t.target??``}`.trim();return t.fileOperations?n?.path===i?n.path:null:i||null}function km(e,t,n){return t&&n?z`
|
||
<button
|
||
class="chat-tool-card__detail chat-tool-card__detail-link"
|
||
type="button"
|
||
title=${Y(`chat.toolCards.openFile`)}
|
||
@click=${()=>n({path:t})}
|
||
>
|
||
${e}
|
||
</button>
|
||
`:z`<div class="chat-tool-card__detail">${e}</div>`}function Am(e,t){let n=e===`failed`?t===void 0?Y(`chat.toolCards.failed`):Y(`chat.toolCards.exitCode`,{code:String(t)}):e===`running`?Y(`chat.toolCards.running`):e===`succeeded`?Y(`chat.toolCards.completed`):null;return n?z`<div class="chat-tool-card__outcome">${n}</div>`:R}function jm(e,t){return z`
|
||
<div class="chat-tool-term">
|
||
<div class="chat-tool-term__cmd">
|
||
<span class="chat-tool-term__prompt">$</span
|
||
><code>${Cm(e)}</code>
|
||
</div>
|
||
${t?.trim()?z`<pre class="chat-tool-term__out"><code>${t}</code></pre>`:R}
|
||
</div>
|
||
`}function Mm(e,t,n,r,i){let a=r?`raw`:`diff`,o=Y(`chat.toolCards.viewMode`);return z`
|
||
<wa-tab-group
|
||
class="chat-tool-card__modes"
|
||
aria-label=${o}
|
||
.active=${a}
|
||
activation="auto"
|
||
without-scroll-controls
|
||
${U(e=>_r(e,o))}
|
||
>
|
||
<wa-tab slot="nav" id=${`${e.id}-diff-tab`} panel="diff" ?active=${a===`diff`}>
|
||
${Y(`chat.toolCards.diff`)}
|
||
</wa-tab>
|
||
<wa-tab slot="nav" id=${`${e.id}-raw-tab`} panel="raw" ?active=${a===`raw`}>
|
||
${Y(`chat.toolCards.raw`)}
|
||
</wa-tab>
|
||
<wa-tab-panel id=${`${e.id}-diff-panel`} name="diff" ?active=${a===`diff`}>
|
||
${ap(t,n,void 0,i)}
|
||
</wa-tab-panel>
|
||
<wa-tab-panel id=${`${e.id}-raw-panel`} name="raw" ?active=${a===`raw`}>
|
||
${fm({...r?{label:Y(`chat.toolCards.toolError`)}:{},text:e.outputText})}
|
||
</wa-tab-panel>
|
||
</wa-tab-group>
|
||
`}function Nm(e){return e.map(e=>`${e.kind===`add`?`+`:e.kind===`del`?`-`:` `}${e.text}`).join(`
|
||
`)}function Pm(e,t){if(t?.trim())return t;if(typeof e.args!=`string`)return;let n=e.inputText?.trim()?e.inputText:e.args;return ua(n)}function Fm(e){let t=e.displayDetail?.trim();return t?{label:e.displayLabel,name:t}:{label:typeof e.card.args==`string`?Pm(e.card,void 0)??e.displayLabel:e.displayLabel}}function Im(e,t){return fr(e,t)===`running`}function Lm(e,t){let n=fi({name:e.name,args:e.args,details:e.details});if(n.kind===`command`&&n.command)return`$ ${hm(n.command)}`;let r=mm(n,fr(e,t));return r&&n.target?`${r} ${n.target}`:[qa({name:e.name,args:e.args,detailMode:`explain`}).label,Ai(e.args)].filter(Boolean).join(` `)}function Rm(e){let t=e.status===`in_progress`?`reviewing`:e.status===`timed_out`?`timedOut`:e.status;return Y(`chat.toolCards.review.${t}`,{reviewer:e.label})}function zm(e){let t=zi(e.details);return t.length===0?R:z`
|
||
<div class="chat-tool-reviews">
|
||
${t.map(e=>{let t=[`denied`,`timed_out`,`aborted`].includes(e.status);return z`
|
||
<div class="chat-tool-review" data-review-status=${e.status}>
|
||
<div class="chat-tool-review__header">
|
||
<span class="chat-tool-review__icon"
|
||
>${t?q.shieldX:q.shieldCheck}</span
|
||
>
|
||
<span class="chat-tool-review__label">${Rm(e)}</span>
|
||
${e.riskLevel?z`<span class="chat-tool-review__chip"
|
||
>${Y(`chat.toolCards.review.risk`,{level:e.riskLevel})}</span
|
||
>`:R}
|
||
${e.userAuthorization?z`<span class="chat-tool-review__chip"
|
||
>${Y(`chat.toolCards.review.authorization`,{level:e.userAuthorization})}</span
|
||
>`:R}
|
||
</div>
|
||
${e.status===`in_progress`?R:z`<div class="chat-tool-review__rationale">
|
||
${e.rationale??Y(`chat.toolCards.review.noRationale`)}
|
||
</div>`}
|
||
</div>
|
||
`})}
|
||
</div>
|
||
`}function Bm(e,t){let n=fr(e,t.runActive),r=bm(e,n);if(r)return r;let i=fi({name:e.name,args:e.args,details:e.details}),a=qa({name:e.name,args:e.args,detailMode:`explain`}),o=n===`running`,s=t.expanded,c=Wm[i.kind]??a.icon,l=i.kind===`read`||i.kind===`edit`||i.kind===`write`?Om(e,i):null;return z`
|
||
<div class="chat-tool-msg-collapse chat-tool-msg-collapse--manual ${s?`is-open`:``}">
|
||
${l?z`<div
|
||
class="chat-inline-disclosure chat-tool-msg-summary chat-tool-row chat-tool-row--file ${o?`chat-tool-row--running`:``}"
|
||
@pointerenter=${_m}
|
||
@focusin=${_m}
|
||
>
|
||
<button
|
||
class="chat-tool-row__toggle"
|
||
type="button"
|
||
aria-expanded=${String(s)}
|
||
aria-label=${Lm(e,t.runActive)}
|
||
@click=${()=>t.onToggleExpanded(e.id)}
|
||
></button>
|
||
<span class="chat-tool-msg-summary__icon">${am(c)}</span>
|
||
<span class="chat-tool-disclosure__content"
|
||
>${xm(e,i,n,l,t.onOpenWorkspaceFile)}</span
|
||
>
|
||
<span class="chat-tool-row__chevron" aria-hidden="true">${q.chevronRight}</span>
|
||
</div>`:z`<button
|
||
class="chat-inline-disclosure chat-tool-msg-summary chat-tool-row ${o?`chat-tool-row--running`:``}"
|
||
type="button"
|
||
aria-expanded=${String(s)}
|
||
@pointerenter=${_m}
|
||
@focus=${_m}
|
||
@click=${n=>{rm(n)&&t.onToggleExpanded(e.id)}}
|
||
>
|
||
<span class="chat-tool-msg-summary__icon">${am(c)}</span>
|
||
<span class="chat-tool-disclosure__content"
|
||
>${vm(e,i,n)}</span
|
||
>
|
||
<span class="chat-tool-row__chevron" aria-hidden="true">${q.chevronRight}</span>
|
||
</button>`}
|
||
${s?z`
|
||
<div class="chat-tool-msg-body">
|
||
${Vm(e,t.sessionKey,t.onOpenSidebar,t.canvasPluginSurfaceUrl,t.embedSandboxMode??`scripts`,t.allowExternalEmbedUrls??!1,t.runActive,t.onOpenWorkspaceFile)}
|
||
</div>
|
||
`:R}
|
||
${t.showApprovalReviews===!1?R:zm(e)}
|
||
</div>
|
||
`}function Vm(e,t,n,r,i=`scripts`,a=!1,o,s){let c=fi({name:e.name,args:e.args,details:e.details}),l=qa({name:e.name,args:e.args}),u=c.kind===`read`||c.kind===`search`||c.kind===`fetch`?l.detail:gr(l),d=!!e.outputText?.trim(),f=!!e.inputText?.trim(),p=Wo(e),h=fr(e,o),g=c.kind===`read`||c.kind===`edit`||c.kind===`write`?Om(e,c):null,_=!!n,v=(e.preview?.kind===`canvas`?um(e.preview,e.outputText):null)??lm(sm(e),{rawText:e.outputText??null}),y=e.preview?.kind===`canvas`?em(e.preview,`chat_tool`,{onOpenSidebar:n,rawText:e.outputText,canvasPluginSurfaceUrl:r,embedSandboxMode:i,allowExternalEmbedUrls:a,sessionKey:t}):R,b=_?z`
|
||
<openclaw-tooltip content=${Y(`chat.toolCards.openDetails`)}>
|
||
<button
|
||
class="chat-tool-card__action-btn"
|
||
type="button"
|
||
@click=${()=>n?.(v)}
|
||
aria-label=${Y(`chat.toolCards.openDetails`)}
|
||
>
|
||
<span class="chat-tool-card__action-icon">${q.panelRightOpen}</span>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R,x=c.diff&&c.diff.length>0?Tn(Nm(c.diff),Y(`common.copy`)):R;if(c.kind===`command`&&c.command&&!e.preview){let t=m(e.args),n=Object.fromEntries(Object.entries(t??{}).filter(([e])=>e!==`command`));return z`
|
||
<div class="chat-tool-card chat-tool-card--flush ${p?`chat-tool-card--error`:``}">
|
||
<div class="chat-tool-card__actions">${b}</div>
|
||
${jm(c.command,e.outputText)}
|
||
${Object.keys(n).length>0?Tm(n):R}
|
||
${Am(h,e.exitCode)}
|
||
</div>
|
||
`}if((c.kind===`edit`||c.kind===`write`)&&c.diff&&c.diff.length>0){let t=c.fileOperations?.[0]??{path:c.target??``};return z`
|
||
<div class="chat-tool-card ${p?`chat-tool-card--error`:``}">
|
||
<div class="chat-tool-card__header">
|
||
${km(g??c.target??``,g,s)}
|
||
<div class="chat-tool-card__actions">${x}${b}</div>
|
||
</div>
|
||
${d?Mm(e,c.diff,h,p,t):ap(c.diff,h,void 0,t)}
|
||
${Am(h,e.exitCode)}
|
||
</div>
|
||
`}let S=c.kind===`read`||c.kind===`search`||c.kind===`fetch`,C=S?Dm(e.args,c.kind):e.args,w=f&&(!S||C!==null);return z`
|
||
<div class="chat-tool-card ${p?`chat-tool-card--error`:``}">
|
||
${u||_?z`
|
||
<div class="chat-tool-card__header">
|
||
${u?c.kind===`read`?km(u,g,s):z`<div class="chat-tool-card__detail">${u}</div>`:R}
|
||
<div class="chat-tool-card__actions">${b}</div>
|
||
</div>
|
||
`:R}
|
||
${w?Em(C)?Tm(C):fm({label:Y(`chat.toolCards.toolInput`),text:e.inputText}):R}
|
||
${d?e.preview?.kind===`canvas`?z`${y} ${dm(e.outputText)}`:fm({...p?{label:Y(`chat.toolCards.toolError`)}:{},text:e.outputText}):p?fm({label:Y(`chat.toolCards.toolError`),text:Y(`chat.toolCards.noOutputFailed`)}):R}
|
||
${Am(h,e.exitCode)}
|
||
</div>
|
||
`}var Hm,Um,Wm,Gm,Km,qm,Jm,Ym;function Xm(){return(Xm=e((()=>{B(),V(),Ga(),vn(),J(),Uo(),G(),Pi(),K(),mo(),Ci(),ei(),ya(),mr(),Xs(),op(),tm(),Hm={read:`chat.toolCards.verbs.read`,search:`chat.toolCards.verbs.searched`,fetch:`chat.toolCards.verbs.fetched`},Um={update:{running:`chat.toolCards.verbs.editing`,succeeded:`chat.toolCards.verbs.edited`,fallback:`chat.toolCards.verbs.edit`},add:{running:`chat.toolCards.verbs.creating`,succeeded:`chat.toolCards.verbs.created`,fallback:`chat.toolCards.verbs.create`},delete:{running:`chat.toolCards.verbs.deleting`,succeeded:`chat.toolCards.verbs.deleted`,fallback:`chat.toolCards.verbs.delete`},mixed:{running:`chat.toolCards.verbs.changing`,succeeded:`chat.toolCards.verbs.changed`,fallback:`chat.toolCards.verbs.change`},write:{running:`chat.toolCards.verbs.writing`,succeeded:`chat.toolCards.verbs.wrote`,fallback:`chat.toolCards.verbs.write`}},Wm={command:`squareTerminal`,read:`fileText`,edit:`pencil`,write:`fileCode`,search:`search`,fetch:`globe`},Gm=2e3,Km=new Set([`|`,`;`,`&`,`<`,`>`]),qm=12,Jm=400,Ym={read:new Set([`path`,`file_path`,`filePath`,`notebook_path`]),search:new Set([`pattern`,`query`,`glob`,`path`]),fetch:new Set([`url`])}})))()}function Zm(e,t){return z`<button
|
||
class="btn btn--sm chat-copy-btn"
|
||
type="button"
|
||
@click=${n=>void Sn(n,e,t)}
|
||
>
|
||
<span data-copy-label>${t}</span>
|
||
</button>`}function Qm(e){let t=e.conflict;if(!t)return R;let n=lc(t),r=sc(t),i=ic(t),a=Y(n===1?`chat.workspaceConflict.titleOne`:`chat.workspaceConflict.titleMany`,{count:String(n)});return z`
|
||
<details
|
||
class="chat-composer-neighbor-card chat-composer-neighbor-card--warn chat-workspace-conflict-notice"
|
||
role="status"
|
||
>
|
||
<summary class="chat-workspace-conflict-notice__summary">
|
||
<span class="chat-composer-neighbor-card__icon" aria-hidden="true"
|
||
>${q.alertTriangle}</span
|
||
>
|
||
<span class="chat-composer-neighbor-card__copy">
|
||
<strong>${a}</strong>
|
||
<span>${Y(`chat.workspaceConflict.summary`)}</span>
|
||
</span>
|
||
<span class="chat-workspace-conflict-notice__chevron" aria-hidden="true"
|
||
>${q.chevronUp}</span
|
||
>
|
||
${e.onDismiss?z`<button
|
||
class="chat-error__dismiss"
|
||
type="button"
|
||
@click=${t=>{t.preventDefault(),t.stopPropagation(),e.onDismiss?.()}}
|
||
aria-label=${Y(`chat.workspaceConflict.dismiss`)}
|
||
>
|
||
${q.x}
|
||
</button>`:R}
|
||
</summary>
|
||
<div class="chat-workspace-conflict-notice__content">
|
||
<ul class="chat-workspace-conflict-paths">
|
||
${r.paths.map(e=>{let n=ic(t,e);return z`<li>
|
||
<code>${nc(e)}</code>
|
||
${n?z`<span class="chat-workspace-conflict-path-actions">
|
||
${Zm(n.inspect,Y(`chat.workspaceConflict.inspectCloud`))}
|
||
${Zm(n.takeCloud,Y(`chat.workspaceConflict.takeCloud`))}
|
||
</span>`:R}
|
||
</li>`})}
|
||
</ul>
|
||
${r.remaining>0?z`<div class="chat-workspace-conflict-more">
|
||
${Y(`chat.workspaceConflict.morePaths`,{count:String(r.remaining)})}
|
||
</div>`:R}
|
||
<details class="chat-workspace-conflict-commands-disclosure">
|
||
<summary>${Y(`chat.workspaceConflict.showCommands`)}</summary>
|
||
<div class="chat-workspace-conflict-ref">
|
||
<span>${Y(`chat.workspaceConflict.stagedResult`)}</span>
|
||
<code>${t.stagedResultRef}</code>
|
||
${Tn(t.stagedResultRef,Y(`chat.workspaceConflict.copyStagedResult`))}
|
||
</div>
|
||
${i?z`<div class="chat-workspace-conflict-commands">
|
||
<div>
|
||
<span>${Y(`chat.workspaceConflict.inspectCloud`)}</span>
|
||
<code>${i.inspect}</code>
|
||
${Tn(i.inspect,Y(`chat.workspaceConflict.copyInspectCommand`))}
|
||
</div>
|
||
<div>
|
||
<span>${Y(`chat.workspaceConflict.takeCloud`)}</span>
|
||
<code>${i.takeCloud}</code>
|
||
${Tn(i.takeCloud,Y(`chat.workspaceConflict.copyTakeCommand`))}
|
||
</div>
|
||
</div>
|
||
<p class="chat-workspace-conflict-command-help">
|
||
${Y(`chat.workspaceConflict.commandHelp`)}
|
||
</p>`:z`<p class="chat-workspace-conflict-command-help">
|
||
${Y(`chat.workspaceConflict.commandsUnavailable`)}
|
||
</p>`}
|
||
</details>
|
||
</div>
|
||
</details>
|
||
`}function $m(e,t,n){let r=lc(e),i=sc(e);return z`
|
||
<div
|
||
class="chat-bubble chat-bubble--workspace-conflict"
|
||
data-message-id=${t}
|
||
data-entry-id=${n||R}
|
||
>
|
||
<div class="chat-workspace-conflict-event" role="status">
|
||
<div class="chat-workspace-conflict-event__header">
|
||
<span aria-hidden="true">${q.alertTriangle}</span>
|
||
<strong
|
||
>${Y(r===1?`chat.workspaceConflict.eventTitleOne`:`chat.workspaceConflict.eventTitleMany`,{count:String(r)})}</strong
|
||
>
|
||
</div>
|
||
<p>${Y(`chat.workspaceConflict.eventDescription`)}</p>
|
||
<ul class="chat-workspace-conflict-paths">
|
||
${i.paths.map(e=>z`<li><code>${nc(e)}</code></li>`)}
|
||
</ul>
|
||
${i.remaining>0?z`<div class="chat-workspace-conflict-more">
|
||
${Y(`chat.workspaceConflict.morePaths`,{count:String(i.remaining)})}
|
||
</div>`:R}
|
||
<div class="chat-workspace-conflict-ref">
|
||
<span>${Y(`chat.workspaceConflict.stagedResult`)}</span>
|
||
<code>${e.stagedResultRef}</code>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`}function eh(){return(eh=e((()=>{B(),vn(),J(),K(),dc()})))()}function th(e){return q[e]??q.zap}function nh(e,t){return z`
|
||
<div class="chat-tools-inline">
|
||
${e.map((e,n)=>{let r=`${t.messageKey}:toolcard:${n}`,i=t.isToolExpanded?.(r)??!1;return Bm(e,{expanded:i,runActive:t.runActive,onToggleExpanded:t.onToggleToolExpanded?()=>t.onToggleToolExpanded?.(r,i):()=>void 0,sessionKey:t.sessionKey,agentId:t.agentId,onOpenSidebar:t.onOpenSidebar,onOpenWorkspaceFile:t.onOpenWorkspaceFile,canvasPluginSurfaceUrl:t.canvasPluginSurfaceUrl,embedSandboxMode:t.embedSandboxMode??`scripts`,allowExternalEmbedUrls:t.allowExternalEmbedUrls??!1,showApprovalReviews:t.showApprovalReviews})})}
|
||
</div>
|
||
`}function rh(e,t,n,r,i){if(!e)return R;let a=e.kind===`id`?e.id:null,s=t?.senderLabel?.trim()?t.senderLabel:e.kind===`current`?Y(`chat.messages.currentMessage`):Y(`chat.messages.message`),c=t?.text.trim()??``,l=e=>{e&&a&&!t&&r?.(a)},u=z`
|
||
<span class="chat-reply-preview__icon"
|
||
>${i?z`<span class="session-run-spinner" aria-hidden="true"></span>`:q.messageSquare}</span
|
||
>
|
||
<span class="chat-reply-preview__label"> ${Y(`chat.messages.replyingTo`,{name:s})} </span>
|
||
${c?z`<span class="chat-reply-preview__text"
|
||
>${o(c,120)}${c.length>120?`...`:``}</span
|
||
>`:R}
|
||
`;return a&&n?z`
|
||
<button
|
||
${U(l)}
|
||
type="button"
|
||
class="chat-reply-preview chat-reply-preview--message"
|
||
?disabled=${i}
|
||
aria-busy=${i?`true`:`false`}
|
||
@click=${()=>n(a)}
|
||
>
|
||
${u}
|
||
</button>
|
||
`:z`
|
||
<div
|
||
${U(l)}
|
||
class="chat-reply-preview chat-reply-preview--message chat-reply-preview--unavailable"
|
||
>
|
||
${u}
|
||
</div>
|
||
`}function ih(e){return e.length===0?R:z`
|
||
<div class="chat-pairing-qr-notices">
|
||
${e.map(e=>z`
|
||
<div
|
||
class="chat-assistant-attachment-card chat-assistant-attachment-card--blocked chat-pairing-qr-expired"
|
||
>
|
||
<div class="chat-assistant-attachment-card__header">
|
||
<span class="chat-assistant-attachment-card__icon">${q.alertTriangle}</span>
|
||
<span class="chat-assistant-attachment-card__title">${e.title}</span>
|
||
<span class="chat-assistant-attachment-badge chat-assistant-attachment-badge--muted"
|
||
>${Y(`chat.pairingQrExpired.badge`)}</span
|
||
>
|
||
</div>
|
||
<div class="chat-assistant-attachment-card__reason">${e.reason}</div>
|
||
</div>
|
||
`)}
|
||
</div>
|
||
`}function ah(e,t,n,r){let i=e,a=typeof i.role==`string`?i.role:`unknown`,o=bo(a),s=Ur(e),c=bo(s.role),l=uc(e);if(l)return $m(l,t,n.entryId);let u=c===`tool`,d=wr(e),f=n.showToolCalls??!0?Ia(e,t):[],p=f.length>0,m={connectionEpoch:n.connectionEpoch,localMediaPreviewRoots:n.localMediaPreviewRoots??[],resourceBasePath:n.resourceBasePath,authToken:n.assistantAttachmentAuthToken,onRequestUpdate:n.onRequestUpdate,onRequestOpenImage:n.onRequestOpenImage,onOpenImage:n.onOpenImage,resolveArtifactDownload:n.resolveArtifactDownload};Bl(t,e,n.onRequestUpdate);let h=hf(Fl(e),m),g=h.length>0,_=Rl(e),v=_.length>0,y=zf(e,s),b=n.actionMarkdown??y,x=s.content.filter(e=>e.type===`attachment`||e.type===`attachment_error`),S=new Set,C=[...x,...Pl(e),...Vl(e)].filter(e=>{if(e.type===`attachment_error`)return!0;let{attachment:t}=e;return!S.has(t.url)&&(S.add(t.url),!0)}),w=s.content.filter(e=>e.type===`canvas`),T=n.showReasoning&&a===`assistant`?or(e):null,E=T?Ja(T):null,D=(c===`user`?n.actionMarkdown:void 0)??(y||null),O={assistantTranscriptRoleHeaders:a===`assistant`,codeBlockChrome:a===`user`?`none`:`copy`,codeBlockInteraction:a===`assistant`?`interactive`:`static`,fileLinks:!0,interactiveImages:n.onOpenImage!==void 0,sessionLinks:!0,tableInteractions:`enabled`,linkFavicons:!!n.fetchLinkFavicon&&!n.isStreaming},k=D&&!n.isStreaming?If(D):null,ee=[`chat-bubble`,g?`chat-bubble--with-images`:``,u?`chat-bubble--tool-shell`:``,n.isStreaming?`streaming`:``,n.entryAnimated?`chat-bubble--user-turn-enter`:``].filter(Boolean).join(` `),A=p&&(n.showToolCalls??!0);if(!D&&!A&&!g&&!v&&C.length===0&&w.length===0&&!s.replyTarget)return R;let te=`toolmsg:${t}`,j=n.isToolMessageExpanded?.(te)??!1,ne=[...new Set(f.map(e=>e.name))],M=f.length===1?f[0]:null,N=d&&!!D&&!k&&!g&&M?.outputText?.trim()===D?.trim(),re=N?null:D,ie=!!M&&(!D||N)&&!g,ae=ie?void 0:f.find(Wo),P=M?qa({name:M.name,args:M.args,detailMode:`explain`}):null,oe=M&&P?Pm(M,P.detail):void 0,se=oe?!D&&!g?oe:M?.outputText?.trim()?`output`:void 0:ne.length<=3?ne.join(`, `):`${ne.slice(0,2).join(`, `)} +${ne.length-2} more`,ce=D?ua(D)??``:``,F=P&&!D&&!g?P.label:Y(`chat.toolCards.toolOutput`),le=Ro(F)??F,ue=qo(se,le),de=P?th(P.icon):q.zap,fe=o===`assistant`&&w.length>0?z`${w.map(e=>z`<div class="chat-tool-card__widget-host">
|
||
${em(e.preview,`chat_message`,{onOpenSidebar:r,rawText:e.rawText??null,canvasPluginSurfaceUrl:n.canvasPluginSurfaceUrl,boardProvider:n.boardProvider,embedSandboxMode:n.embedSandboxMode??`scripts`,sessionKey:n.sessionKey})}
|
||
${e.rawText?z`<div class="chat-tool-card__widget-raw">
|
||
${dm(e.rawText)}
|
||
</div>`:R}
|
||
</div>`)}`:R,I=Math.max(1,Math.floor(n.duplicateCount??1)),L=I>1?{count:I,label:Y(`chat.messages.duplicatesCollapsed`,{count:String(I)})}:void 0;return d&&p&&!D&&!g&&!v&&C.length===0&&w.length===0&&!E?z`
|
||
<div
|
||
class="${ee}"
|
||
data-message-id=${t}
|
||
data-entry-id=${n.entryId||R}
|
||
data-message-text=${b||R}
|
||
>
|
||
${rh(s.replyTarget,s.replyTarget?.kind===`id`?n.resolveReplyPreview?.(s.replyTarget.id)??s.replyPreview:void 0,n.onOpenReply,n.onResolveReply,s.replyTarget?.kind===`id`&&n.replyNavigationId===s.replyTarget.id)}
|
||
${nh(f,{messageKey:t,sessionKey:n.sessionKey,agentId:n.agentId,onOpenSidebar:r,onOpenWorkspaceFile:n.onOpenWorkspaceFile,isToolExpanded:n.isToolExpanded,onToggleToolExpanded:n.onToggleToolExpanded,runActive:n.runActive,canvasPluginSurfaceUrl:n.canvasPluginSurfaceUrl,embedSandboxMode:n.embedSandboxMode??`scripts`,allowExternalEmbedUrls:n.allowExternalEmbedUrls??!1})}
|
||
${I>1?z`<div
|
||
class="chat-duplicate-count"
|
||
aria-label=${Y(`chat.messages.duplicatesCollapsed`,{count:String(I)})}
|
||
>
|
||
×${I}
|
||
</div>`:R}
|
||
</div>
|
||
`:z`
|
||
<div
|
||
class="${ee}"
|
||
data-message-id=${t}
|
||
data-entry-id=${n.entryId||R}
|
||
data-message-text=${b||R}
|
||
>
|
||
${rh(s.replyTarget,s.replyTarget?.kind===`id`?n.resolveReplyPreview?.(s.replyTarget.id)??s.replyPreview:void 0,n.onOpenReply,n.onResolveReply,s.replyTarget?.kind===`id`&&n.replyNavigationId===s.replyTarget.id)}
|
||
${d?z`
|
||
<div
|
||
class="chat-tool-msg-collapse chat-tool-msg-collapse--manual ${j?`is-open`:``}"
|
||
>
|
||
<button
|
||
class="chat-inline-disclosure chat-tool-msg-summary"
|
||
type="button"
|
||
aria-expanded=${String(j)}
|
||
@pointerenter=${_m}
|
||
@focus=${_m}
|
||
@click=${e=>{rm(e)&&n.onToggleToolMessageExpanded?.(te,j)}}
|
||
>
|
||
<span class="chat-tool-msg-summary__icon">${de}</span>
|
||
<span class="chat-tool-disclosure__content">
|
||
<span class="chat-tool-msg-summary__label">${le}</span>
|
||
${ue?z`<span class="chat-tool-msg-summary__names">${ue}</span>`:ce?z`<span class="chat-tool-msg-summary__preview">${ce}</span>`:R}
|
||
</span>
|
||
<span class="chat-tool-row__chevron" aria-hidden="true">${q.chevronRight}</span>
|
||
</button>
|
||
${j?z`
|
||
<div class="chat-tool-msg-body">
|
||
${ih(_)}
|
||
${gf(h,m)}
|
||
${pf(C,m,r,n.onAssistantAttachmentLoaded,c===`assistant`)}
|
||
${fe}
|
||
${E?z`<div class="chat-thinking">
|
||
${gt(Da(E,{codeBlockInteraction:`interactive`}))}
|
||
</div>`:R}
|
||
${k?z`<details
|
||
class="chat-json-collapse"
|
||
?open=${!!n.autoExpandToolCalls}
|
||
>
|
||
<summary class="chat-json-summary">
|
||
<span class="chat-json-badge">${Y(`chat.codeBlock.jsonBadge`)}</span>
|
||
<span class="chat-json-label"
|
||
>${Lf(k.parsed)}</span
|
||
>
|
||
</summary>
|
||
<pre class="chat-json-content"><code>${k.text}</code></pre>
|
||
</details>`:re?Jf(re,n.isStreaming,O,L):R}
|
||
${p?ie&&M?Vm(M,n.sessionKey,r,n.canvasPluginSurfaceUrl,n.embedSandboxMode??`scripts`,n.allowExternalEmbedUrls??!1,n.runActive,n.onOpenWorkspaceFile):nh(f,{messageKey:t,sessionKey:n.sessionKey,agentId:n.agentId,onOpenSidebar:r,onOpenWorkspaceFile:n.onOpenWorkspaceFile,isToolExpanded:n.isToolExpanded,onToggleToolExpanded:n.onToggleToolExpanded,runActive:n.runActive,canvasPluginSurfaceUrl:n.canvasPluginSurfaceUrl,embedSandboxMode:n.embedSandboxMode??`scripts`,allowExternalEmbedUrls:n.allowExternalEmbedUrls??!1,showApprovalReviews:!1}):R}
|
||
${ae?Am(`failed`,ae.exitCode):R}
|
||
</div>
|
||
`:R}
|
||
${f.map(e=>zm(e))}
|
||
</div>
|
||
`:z`
|
||
${ih(_)}
|
||
${gf(h,m)}
|
||
${pf(C,m,r,n.onAssistantAttachmentLoaded,c===`assistant`)}
|
||
${E?z`<div class="chat-thinking">
|
||
${gt(Da(E,{codeBlockInteraction:`interactive`}))}
|
||
</div>`:R}
|
||
${fe}
|
||
${k?z`<details class="chat-json-collapse">
|
||
<summary class="chat-json-summary">
|
||
<span class="chat-json-badge">${Y(`chat.codeBlock.jsonBadge`)}</span>
|
||
<span class="chat-json-label">${Lf(k.parsed)}</span>
|
||
</summary>
|
||
<pre class="chat-json-content"><code>${k.text}</code></pre>
|
||
</details>`:re?c===`user`?Kf(re,t,n,O,L):c===`assistant`?qf(re,n.isStreaming,n.assistantMessageDisclosure,O,L,n.isStreaming?t:void 0):Jf(re,n.isStreaming,O,L):R}
|
||
${p?nh(f,{messageKey:t,sessionKey:n.sessionKey,agentId:n.agentId,onOpenSidebar:r,onOpenWorkspaceFile:n.onOpenWorkspaceFile,isToolExpanded:n.isToolExpanded,onToggleToolExpanded:n.onToggleToolExpanded,runActive:n.runActive,canvasPluginSurfaceUrl:n.canvasPluginSurfaceUrl,embedSandboxMode:n.embedSandboxMode??`scripts`,allowExternalEmbedUrls:n.allowExternalEmbedUrls??!1}):R}
|
||
`}
|
||
${I>1&&(!D||k)?z`<div
|
||
class="chat-duplicate-count"
|
||
aria-label=${Y(`chat.messages.duplicatesCollapsed`,{count:String(I)})}
|
||
>
|
||
×${I}
|
||
</div>`:R}
|
||
</div>
|
||
`}function oh(){return(oh=e((()=>{B(),V(),yt(),J(),er(),K(),ti(),Wi(),ya(),mr(),dc(),mf(),Ff(),ep(),Yl(),Xm(),eh()})))()}function sh(e){let t=new Date(e);return Number.isFinite(t.getTime())?{label:t.toLocaleString([],{month:`short`,day:`numeric`,year:`numeric`,hour:`numeric`,minute:`2-digit`,timeZoneName:`short`}),title:t.toLocaleString([],{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`,hour:`numeric`,minute:`2-digit`,second:`2-digit`,timeZoneName:`short`}),dateTime:t.toISOString()}:{label:Y(`chat.messages.unknownDate`),title:Y(`chat.messages.unknownDate`),dateTime:``}}function ch(e,t=Date.now()){let n=new Date(e);if(!Number.isFinite(n.getTime()))return Y(`chat.messages.unknownDate`);let r=t-n.getTime();return r>=-12e4&&r<fh?Ze(Math.max(0,r)):n.toLocaleDateString([],{month:`short`,day:`numeric`,...n.getFullYear()===new Date(t).getFullYear()?{}:{year:`numeric`}})}function lh(e,t=[]){let n=sh(e),r=z`
|
||
<time class="chat-group-timestamp" datetime=${n.dateTime} aria-live="off">
|
||
${ch(e)}
|
||
</time>
|
||
`;return z`
|
||
<openclaw-tooltip
|
||
class="msg-meta"
|
||
?open-on-click=${t.length>0}
|
||
content=${t.length?``:n.label}
|
||
>
|
||
${t.length?z`<button
|
||
type="button"
|
||
class="msg-meta__summary"
|
||
aria-label=${Y(`chat.messages.contextFor`,{timestamp:n.title})}
|
||
>
|
||
${r}
|
||
</button>`:r}
|
||
${t.length?z`<span slot="content" class="msg-meta__details">
|
||
<span class="msg-meta__time">${n.label}</span>${t}
|
||
</span>`:R}
|
||
</openclaw-tooltip>
|
||
`}function uh(e,t){let n=0,r=0,i=0,a=0,o=0,s=null,c=!1,l=0;for(let{message:t}of e.messages){let e=t;if(e.role!==`assistant`)continue;let u=e.usage;if(u){c=!0;let e=u.input??u.inputTokens??0,t=u.output??u.outputTokens??0,o=u.cacheRead??u.cache_read_input_tokens??0,s=u.cacheWrite??u.cache_creation_input_tokens??0;n+=e,r+=t,i+=o,a+=s,l=Math.max(l,e+o+s)}let d=u?.cost??e.cost;d?.total&&(o+=d.total),typeof e.model==`string`&&e.model!==`gateway-injected`&&(s=e.model)}if(!c&&!s)return null;let u=t&&l>0?Math.min(Math.round(l/t*100),100):null;return{input:n,output:r,cacheRead:i,cacheWrite:a,cost:o,model:s,contextPercent:u}}function dh(e,t){if(!t)return lh(e);let n=[];if(t.input&&n.push(z`<span class="msg-meta__tokens">↑${We(t.input)}</span>`),t.output&&n.push(z`<span class="msg-meta__tokens">↓${We(t.output)}</span>`),t.cacheRead&&n.push(z`<span class="msg-meta__cache">R${We(t.cacheRead)}</span>`),t.cacheWrite&&n.push(z`<span class="msg-meta__cache">W${We(t.cacheWrite)}</span>`),t.cost>0&&n.push(z`<span class="msg-meta__cost">${Ce(t.cost)}</span>`),t.contextPercent!==null){let e=t.contextPercent,r=e>=90?`msg-meta__ctx msg-meta__ctx--danger`:e>=75?`msg-meta__ctx msg-meta__ctx--warn`:`msg-meta__ctx`;n.push(z`<span class="${r}">${e}% ctx</span>`)}if(t.model){let e=t.model.includes(`/`)?t.model.split(`/`).pop():t.model;n.push(z`<span class="msg-meta__model">${e}</span>`)}return lh(e,n)}var fh;function ph(){return(ph=e((()=>{B(),K(),Je(),fh=6048e5})))()}function mh(e){return Object.fromEntries(e.questions.map(t=>{let n=e.drafts.get(t.questionId),r=t.isSecret?n?.freeText:n?.freeText.trim();return[t.questionId,[...n?.selected??[],...r?[r]:[]]]}))}function hh(e,t){for(let n of e.questions){let r=t[n.questionId]??[],i=new Set(n.options.map(e=>e.label));e.drafts.set(n.questionId,{selected:new Set(r.filter(e=>i.has(e))),freeText:r.find(e=>!i.has(e))??``})}}function gh(e,t){return{model:{requestKey:e.id,title:Y(`chat.questions.eyebrow`),questions:e.questions,agentId:e.agentId,sessionKey:e.sessionKey,secretStoreAllowedHostsDraft:e.secretStoreAllowedHostsDraft,collapsed:t.collapsed??!1,disabled:e.status!==`pending`||e.submitting,submitting:e.submitting,answersById:mh(e),error:e.error,requestPosition:t.requestPosition},onAnswersChange:n=>{hh(e,n),t.onChange?.()},onSecretStoreAllowedHostsChange:n=>{e.secretStoreAllowedHostsDraft=n,t.onChange?.()},onSubmit:t.onSubmit?async n=>{if(await t.onSubmit?.(n),e.status===`pending`&&e.error)throw Error(e.error)}:void 0,onSkip:t.onSkip?async()=>{if(await t.onSkip?.(),e.status===`pending`&&e.error)throw Error(e.error)}:void 0,onDismissError:e.error&&t.onChange?()=>{e.error=null,t.onChange?.()}:void 0,onCollapsedChange:t.onCollapsedChange,onPreviousRequest:t.onPreviousRequest,onNextRequest:t.onNextRequest}}function _h(e,t){return e.status===`cancelled`?Y(`chat.questions.skipped`):e.status===`expired`?Y(`chat.questions.expired`):e.status===`unavailable`?Y(`chat.questions.unavailable`):t.isSecret?Y(`chat.questions.answered`):e.answers?.answers[t.questionId]?.join(`, `)||(e.answeredElsewhere?Y(`chat.questions.answeredElsewhere`):Y(`chat.questions.answered`))}function vh(e){return e.status===`pending`?R:z`
|
||
<div class="chat-question-summary" aria-label=${Y(`chat.questions.summaryLabel`)}>
|
||
${e.questions.map(t=>z`
|
||
<div class="chat-question-summary__line">
|
||
<strong>${t.header}:</strong>
|
||
<span>${_h(e,t)}</span>
|
||
</div>
|
||
`)}
|
||
</div>
|
||
`}function yh(e){return JSON.stringify(Object.entries(e).toSorted(([e],[t])=>e.localeCompare(t)).map(([e,t])=>[e,t]))}var bh;function xh(){return(xh=e((()=>{B(),ut(),J(),K(),Je(),bh=class extends i{constructor(...e){super(...e),this.selectedById=new Map,this.freeTextById=new Map,this.currentQuestionIndex=0,this.pendingAction=null,this.requestKey=null,this.collapsed=!1,this.focusAfterUpdate=!1,this.syncedAnswersSignature=null}createRenderRoot(){return this}setCollapsed(e){if(this.props?.onCollapsedChange){this.props.onCollapsedChange(e);return}this.collapsed=e,this.focusAfterUpdate=!e,this.requestUpdate()}willUpdate(){let e=this.props?.model,t=e?.requestKey??null,n=e?.collapsed??!1;if(t===this.requestKey?this.props?.onCollapsedChange&&(this.collapsed&&!n&&(this.focusAfterUpdate=!0),this.collapsed=n):(this.requestKey=t,this.selectedById=new Map,this.freeTextById=new Map,this.currentQuestionIndex=0,this.pendingAction=null,this.syncedAnswersSignature=null,this.collapsed=n,this.focusAfterUpdate=!n),!e?.answersById)return;let r=yh(e.answersById);if(r===this.syncedAnswersSignature)return;this.syncedAnswersSignature=r;let i=new Map,a=new Map;for(let t of e.questions){let n=new Set(t.options.map(e=>e.label)),r=e.answersById[t.questionId]??[];i.set(t.questionId,r.filter(e=>n.has(e)));let o=r.filter(e=>!n.has(e)).join(`, `);o&&a.set(t.questionId,o)}this.selectedById=i,this.freeTextById=a}updated(){!this.focusAfterUpdate||this.collapsed||(this.focusAfterUpdate=!1,this.querySelector(`.chat-question-panel`)?.focus({preventScroll:!0}))}freeTextValue(e){let t=this.freeTextById.get(e.questionId);return e.isSecret?t:t?.trim()}answerValues(e){let t=this.selectedById.get(e.questionId)??[],n=this.freeTextValue(e);return[...t,...n?[n]:[]]}buildAnswers(e){return Object.fromEntries(e.questions.map(e=>[e.questionId,this.answerValues(e)]))}answersChanged(e){let t=this.buildAnswers(e);e.answersById=t,this.syncedAnswersSignature=yh(t),this.props?.onAnswersChange?.(t)}focusPanel(){this.updateComplete.then(()=>this.querySelector(`.chat-question-panel`)?.focus({preventScroll:!0}))}toggleOption(e,t,n,r=!0){let i=new Map(this.selectedById),a=i.get(t.questionId)??[];if(i.set(t.questionId,t.multiSelect?a.includes(n)?a.filter(e=>e!==n):[...a,n]:[n]),this.selectedById=i,!t.multiSelect){let e=new Map(this.freeTextById);e.delete(t.questionId),this.freeTextById=e}this.answersChanged(e),r&&!t.multiSelect&&this.currentQuestionIndex<e.questions.length-1&&(this.currentQuestionIndex+=1,this.focusPanel())}setFreeText(e,t,n){this.freeTextById=new Map(this.freeTextById).set(t.questionId,n),!t.multiSelect&&(t.isSecret?n:n.trim())&&(this.selectedById=new Map(this.selectedById).set(t.questionId,[])),this.answersChanged(e)}async submit(e){if(!this.props?.onSubmit||!e.questions.every(e=>this.answerValues(e).length>0))return;let t=e.requestKey;this.pendingAction=`submit`;try{await this.props.onSubmit(this.buildAnswers(e))}catch{this.requestKey===t&&(this.pendingAction=null)}}async skip(e){if(!this.props?.onSkip)return;let t=e.requestKey;this.pendingAction=`skip`;try{await this.props.onSkip()}catch{this.requestKey===t&&(this.pendingAction=null)}}advanceOrSubmit(e,t){if(this.answerValues(t).length!==0){if(this.currentQuestionIndex<e.questions.length-1){this.currentQuestionIndex+=1,this.focusPanel();return}this.submit(e)}}goBack(){this.currentQuestionIndex!==0&&(--this.currentQuestionIndex,this.focusPanel())}handleKeyDown(e,t,n,r){if(r||e.isComposing||e.keyCode===229||e.metaKey||e.ctrlKey||e.altKey)return;if(e.target instanceof HTMLInputElement){e.key===`Enter`&&this.answerValues(n).length>0&&(e.preventDefault(),this.advanceOrSubmit(t,n));return}if(e.target instanceof HTMLButtonElement&&e.target.getAttribute(`role`)===`radio`&&[`ArrowDown`,`ArrowLeft`,`ArrowRight`,`ArrowUp`,`End`,`Home`].includes(e.key)){e.preventDefault();let r=Number(e.target.dataset.optionIndex??`0`),i=n.options.length-1,a=e.key===`Home`?0:e.key===`End`?i:e.key===`ArrowLeft`||e.key===`ArrowUp`?(r-1+n.options.length)%n.options.length:(r+1)%n.options.length,o=n.options[a];if(!o)return;let s=this.currentQuestionIndex;this.toggleOption(t,n,o.label,!1),this.currentQuestionIndex===s&&this.updateComplete.then(()=>this.querySelector(`.chat-question-panel__option[data-option-index="${a}"]`)?.focus({preventScroll:!0}));return}let i=Number(e.key)-1;if(i>=0&&i<4&&n.options[i]){e.preventDefault(),this.toggleOption(t,n,n.options[i].label);return}if(n.isOther&&i===n.options.length){e.preventDefault(),this.querySelector(`.chat-question-panel__other`)?.focus({preventScroll:!0});return}e.key===`Enter`&&!(e.target instanceof HTMLButtonElement)&&this.answerValues(n).length>0&&(e.preventDefault(),this.advanceOrSubmit(t,n))}render(){let e=this.props;if(!e)return R;let{model:t}=e,n=t.questions[this.currentQuestionIndex];if(!n)return R;let r=t.disabled||this.pendingAction!==null,i=this.currentQuestionIndex===t.questions.length-1,a=this.answerValues(n).length>0,o=`${this.currentQuestionIndex+1}/${t.questions.length}`,s=t.requestPosition?`${t.requestPosition.current}/${t.requestPosition.total}`:null,c=s?z`<div class="chat-question-panel__request-nav">
|
||
<button
|
||
type="button"
|
||
aria-label=${Y(`common.previous`)}
|
||
@click=${e.onPreviousRequest}
|
||
>
|
||
${q.chevronLeft}
|
||
</button>
|
||
<span>${s}</span>
|
||
<button type="button" aria-label=${Y(`common.next`)} @click=${e.onNextRequest}>
|
||
${q.chevronRight}
|
||
</button>
|
||
</div>`:R;return this.collapsed?z`
|
||
<section
|
||
class="chat-question-panel chat-question-panel--collapsed"
|
||
aria-label=${t.title}
|
||
>
|
||
<button
|
||
class="chat-question-panel__collapsed-button"
|
||
type="button"
|
||
@click=${()=>{this.setCollapsed(!1)}}
|
||
aria-label=${Y(`chat.questions.expand`)}
|
||
>
|
||
<span>${n.header}</span>
|
||
<span class="chat-question-panel__progress">${o}</span>
|
||
<span class="chat-question-panel__chevron">${q.chevronDown}</span>
|
||
</button>
|
||
${c}
|
||
</section>
|
||
`:z`
|
||
<section
|
||
class="chat-question-panel"
|
||
role="group"
|
||
aria-label=${t.title}
|
||
tabindex="0"
|
||
@keydown=${e=>this.handleKeyDown(e,t,n,r)}
|
||
>
|
||
<div class="chat-question-panel__topline">
|
||
<div class="chat-question-panel__title">${t.title}</div>
|
||
${c}
|
||
<span class="chat-question-panel__progress">${o}</span>
|
||
<button
|
||
class="chat-question-panel__collapse"
|
||
type="button"
|
||
@click=${()=>this.setCollapsed(!0)}
|
||
aria-label=${Y(`chat.questions.collapse`)}
|
||
>
|
||
${q.chevronDown}
|
||
</button>
|
||
</div>
|
||
|
||
<div class="chat-question-panel__heading">
|
||
<span class="chat-question-panel__prompt">${n.question}</span>
|
||
</div>
|
||
|
||
<div
|
||
class="chat-question-panel__options"
|
||
role=${n.multiSelect?`group`:`radiogroup`}
|
||
aria-label=${n.header}
|
||
>
|
||
${n.options.map((e,i)=>{let a=(this.selectedById.get(n.questionId)??[]).includes(e.label),o=a||!this.selectedById.get(n.questionId)?.length&&i===0?0:-1;return z`
|
||
<button
|
||
class="chat-question-panel__option ${a?`chat-question-panel__option--selected`:``}"
|
||
type="button"
|
||
role=${n.multiSelect?`checkbox`:`radio`}
|
||
aria-checked=${a?`true`:`false`}
|
||
tabindex=${n.multiSelect?0:o}
|
||
data-option-index=${i}
|
||
?disabled=${r}
|
||
@click=${()=>this.toggleOption(t,n,e.label)}
|
||
>
|
||
<span class="chat-question-panel__option-marker" aria-hidden="true">
|
||
${a?`✓`:``}
|
||
</span>
|
||
<span class="chat-question-panel__option-copy">
|
||
<strong>${e.label}</strong>
|
||
${e.description?z`<small>${e.description}</small>`:R}
|
||
</span>
|
||
<kbd>${i+1}</kbd>
|
||
</button>
|
||
`})}
|
||
</div>
|
||
|
||
${n.secretStore?z`
|
||
<div class="chat-question-panel__store">
|
||
<div class="chat-question-panel__store-requester">
|
||
${Y(`chat.questions.storeRequestedBy`,{agent:t.agentId??Y(`common.unknown`),session:t.sessionKey??Y(`common.unknown`)})}
|
||
</div>
|
||
<div class="chat-question-panel__store-entry">
|
||
${Y(`chat.questions.storeEntry`,{name:n.secretStore.name,kind:n.secretStore.kind===`secret`?Y(`secretsStore.protectedSecret`):Y(`secretsStore.agentReadable`)})}
|
||
</div>
|
||
${n.secretStore.reason?z`<div class="chat-question-panel__store-reason">
|
||
${n.secretStore.reason}
|
||
</div>`:R}
|
||
${n.secretStoreExisting?z`<div class="chat-question-panel__store-replacement">
|
||
${n.secretStoreExisting.updatedBy?Y(`chat.questions.storeReplacementBy`,{name:n.secretStore.name,updated:_e(n.secretStoreExisting.updatedAtMs),updatedBy:n.secretStoreExisting.updatedBy}):Y(`chat.questions.storeReplacement`,{name:n.secretStore.name,updated:_e(n.secretStoreExisting.updatedAtMs)})}
|
||
</div>`:R}
|
||
${n.secretStore.kind===`secret`?z`<label class="chat-question-panel__store-hosts">
|
||
<span>${Y(`secretsStore.allowedHosts`)}</span>
|
||
<input
|
||
class="chat-question-panel__other chat-question-panel__hosts"
|
||
type="text"
|
||
autocomplete="off"
|
||
placeholder=${Y(`secretsStore.allowedHostsPlaceholder`)}
|
||
.value=${t.secretStoreAllowedHostsDraft??n.secretStore.allowedHosts?.join(`, `)??``}
|
||
?disabled=${r}
|
||
@input=${t=>{let n=t.target;n instanceof HTMLInputElement&&e.onSecretStoreAllowedHostsChange?.(n.value)}}
|
||
/>
|
||
</label>`:R}
|
||
</div>
|
||
`:R}
|
||
${n.isOther||n.options.length===0?z`
|
||
<label
|
||
class="chat-question-panel__option chat-question-panel__option--other ${this.freeTextValue(n)?`chat-question-panel__option--selected`:``}"
|
||
>
|
||
<span class="chat-question-panel__option-marker" aria-hidden="true"></span>
|
||
<input
|
||
class="chat-question-panel__other"
|
||
type=${n.isSecret?`password`:`text`}
|
||
autocomplete="off"
|
||
placeholder=${Y(`chat.questions.other`)}
|
||
aria-label=${Y(`chat.questions.ownAnswerFor`,{header:n.header})}
|
||
.value=${this.freeTextById.get(n.questionId)??``}
|
||
?disabled=${r}
|
||
@input=${e=>this.setFreeText(t,n,e.target.value)}
|
||
/>
|
||
<kbd>${n.options.length+1}</kbd>
|
||
</label>
|
||
`:R}
|
||
|
||
<div class="chat-question-panel__footer">
|
||
${t.error?z`<span class="chat-question-panel__error" role="status">
|
||
${Y(`chat.questions.submitFailed`,{error:t.error})}
|
||
${e.onDismissError?z`<button
|
||
type="button"
|
||
class="chat-question-panel__error-dismiss"
|
||
aria-label=${Y(`chat.actions.dismissError`)}
|
||
@click=${e.onDismissError}
|
||
>
|
||
×
|
||
</button>`:R}
|
||
</span>`:R}
|
||
${this.currentQuestionIndex>0?z`<button
|
||
class="btn btn--sm chat-question-panel__back"
|
||
type="button"
|
||
?disabled=${r}
|
||
@click=${()=>this.goBack()}
|
||
>
|
||
${Y(`chat.questions.back`)}
|
||
</button>`:R}
|
||
${e.onSkip?z`<button
|
||
class="btn btn--sm chat-question-panel__skip"
|
||
type="button"
|
||
?disabled=${r}
|
||
@click=${()=>void this.skip(t)}
|
||
>
|
||
${this.pendingAction===`skip`?Y(`chat.questions.skipping`):Y(`chat.questions.skip`)}
|
||
</button>`:R}
|
||
<button
|
||
class="btn btn--sm primary chat-question-panel__advance"
|
||
type="button"
|
||
?disabled=${r||!a||!e.onSubmit}
|
||
@click=${()=>this.advanceOrSubmit(t,n)}
|
||
>
|
||
${this.pendingAction===`submit`||t.submitting?Y(`chat.questions.submitting`):Y(i?`chat.questions.submit`:`chat.questions.next`)}
|
||
</button>
|
||
</div>
|
||
</section>
|
||
`}},h([H({attribute:!1})],bh.prototype,`props`,void 0),h([W()],bh.prototype,`selectedById`,void 0),h([W()],bh.prototype,`freeTextById`,void 0),h([W()],bh.prototype,`currentQuestionIndex`,void 0),h([W()],bh.prototype,`pendingAction`,void 0),customElements.get(`openclaw-chat-question-panel`)||customElements.define(`openclaw-chat-question-panel`,bh)})))()}function Sh(e,t={}){if(t.eligible===!1)return``;let n=(_o(e)^(t.salt??Ch))>>>0;return n%1e3>=wh?``:Th[Math.floor(n/1e3)%Th.length]??``}var Ch,wh,Th;function Eh(){return(Eh=e((()=>{Ch=Math.trunc(Math.random()*4294967295),wh=50,Th=[`chat-reading-indicator--southpaw`,`chat-reading-indicator--flurry`,`chat-reading-indicator--spin`,`chat-reading-indicator--shadowbox`,`chat-reading-indicator--backflip`,`chat-reading-indicator--zen`,`chat-reading-indicator--drummer`,`chat-reading-indicator--peekaboo`,`chat-reading-indicator--nodoff`,`chat-reading-indicator--curious`,`chat-reading-indicator--omnom`,`chat-reading-indicator--fakeout`]})))()}function Dh(e){let t=Math.max(1,Math.round(e/1e3)),n=un.getLocale(),r=[];for(let{seconds:e,unit:i}of Mh){let a=Math.floor(t/e);if(a!==0&&(r.push(new Intl.NumberFormat(n,{style:`unit`,unit:i,unitDisplay:`long`}).format(a)),t-=a*e,r.length===2))break}return new Intl.ListFormat(n,{style:`long`,type:`unit`}).format(r)}function Oh(e){return e===1?Y(`chat.turnRecap.tokensOne`):Y(`chat.turnRecap.tokens`,{count:We(e)})}function kh(e){return e==null?R:z`
|
||
<span aria-hidden="true">·</span>
|
||
<span class="chat-working-indicator__tokens">${Oh(e)}</span>
|
||
`}function Ah(e,t={}){let n=t.waitingApproval===!0,r=t.presentation===`continuation`,i=t.outputTokens!==null&&t.outputTokens!==void 0;return z`
|
||
<div
|
||
class="chat-working-indicator ${r?`chat-working-indicator--continuation`:``}"
|
||
role="status"
|
||
aria-live="off"
|
||
>
|
||
${r?R:z`
|
||
<div
|
||
class="chat-bubble chat-reading-indicator ${Sh(e.key,{eligible:!n})}"
|
||
aria-hidden="true"
|
||
>
|
||
${q.claw}
|
||
</div>
|
||
`}
|
||
<span class="chat-working-indicator__status">
|
||
${n?z`<span>${Y(`chat.waitingForApproval`)}</span>`:t.startupLabel?z`
|
||
<span>${t.startupLabel}</span>
|
||
<openclaw-elapsed-time
|
||
class="chat-working-indicator__elapsed"
|
||
.startMs=${e.startedAt}
|
||
></openclaw-elapsed-time>
|
||
${kh(t.outputTokens)}
|
||
`:z`
|
||
<span class=${r?``:`sr-only`}>${Y(`common.working`)}</span>
|
||
<openclaw-elapsed-time
|
||
class="chat-working-indicator__elapsed"
|
||
.startMs=${e.startedAt}
|
||
></openclaw-elapsed-time>
|
||
${i?kh(t.outputTokens):z`
|
||
<openclaw-working-phrase
|
||
aria-hidden="true"
|
||
.startMs=${e.startedAt}
|
||
.seed=${e.key}
|
||
></openclaw-working-phrase>
|
||
`}
|
||
`}
|
||
</span>
|
||
</div>
|
||
`}function jh(e,t={}){let n=t.presentation===`continuation`,r=Dh(e.runtimeMs),i=typeof e.outputTokens==`number`?Oh(e.outputTokens):null;return z`
|
||
<div
|
||
class="chat-tasks-status chat-turn-recap ${n?`chat-turn-recap--continuation`:``}"
|
||
role="status"
|
||
>
|
||
${n?R:z`<span class="chat-tasks-status__claw" aria-hidden="true">${q.claw}</span>`}
|
||
<span>${Y(`chat.turnRecap.doneIn`,{duration:r})}</span>
|
||
${i===null?R:z`
|
||
<span class="chat-tasks-status__sep" aria-hidden="true">·</span>
|
||
<span>${i}</span>
|
||
`}
|
||
</div>
|
||
`}var Mh;function Nh(){return(Nh=e((()=>{B(),ri(),Ha(),J(),K(),Je(),Eh(),Mh=[{seconds:86400,unit:`day`},{seconds:3600,unit:`hour`},{seconds:60,unit:`minute`},{seconds:1,unit:`second`}]})))()}function Ph(e,t){let n=t.questionPrompts?.get(e.questionId);return n?vh(n):R}function Fh(e,t,n){return e.map(e=>e.kind===`reading-indicator`?Ah(e,{waitingApproval:t.waitingApproval===!0,startupLabel:t.startupLabel,outputTokens:t.runOutputTokens,presentation:n}):e.kind===`question`?Ph(e,t):ah({role:`assistant`,content:[{type:`text`,text:e.text}],timestamp:e.startedAt},e.key,{isStreaming:e.isStreaming,showReasoning:!1,sessionKey:t.sessionKey,boardProvider:t.boardProvider,agentId:t.agentId,runActive:t.runActive,onRequestUpdate:t.onRequestUpdate,canvasPluginSurfaceUrl:t.canvasPluginSurfaceUrl,resourceBasePath:t.resourceBasePath,localMediaPreviewRoots:t.localMediaPreviewRoots,connectionEpoch:t.connectionEpoch,assistantAttachmentAuthToken:t.assistantAttachmentAuthToken,resolveArtifactDownload:t.resolveArtifactDownload,onRequestOpenImage:t.onRequestOpenImage,onOpenImage:t.onOpenImage,onAssistantAttachmentLoaded:t.onAssistantAttachmentLoaded,embedSandboxMode:t.embedSandboxMode,allowExternalEmbedUrls:t.allowExternalEmbedUrls,fetchLinkFavicon:t.fetchLinkFavicon,onOpenWorkspaceFile:t.onOpenWorkspaceFile},t.onOpenSidebar))}function Ih(e,t={}){let{assistant:n,resourceBasePath:r,assistantAttachmentAuthToken:i}=t,a=n?.name??`Assistant`,o=e.flatMap(e=>e.kind===`stream`?[e.startedAt]:[]),s=o.length>0?Math.min(...o):null,c=e.some(e=>e.kind===`reading-indicator`||e.kind===`stream`&&e.isStreaming),l=e.every(e=>e.kind!==`stream`),u=l||t.showAssistantAvatar===!1?R:js(`assistant`,n,void 0,r,i);return z`
|
||
<div class=${`chat-group assistant${l?` chat-group--working`:``}${s===null?``:` chat-group--with-footer`}`} data-chat-row-key=${e[0]?.key??R}>
|
||
${u}
|
||
<div class="chat-group-messages">${Fh(e,t,`standalone`)}</div>
|
||
${s!==null&&!c?z`
|
||
<div class="chat-group-footer">
|
||
<div class="chat-group-footer__meta">
|
||
<span class="chat-sender-name">${a}</span>
|
||
${lh(s)}
|
||
</div>
|
||
</div>
|
||
`:R}
|
||
</div>
|
||
`}function Lh(e,t){let n=De(e.durationMs),r=n?Y(`chat.workRun.workedFor`,{duration:n}):Y(`chat.workRun.worked`),i=z`
|
||
<div class="chat-activity-group chat-work-group ${t.expanded?`is-open`:``}">
|
||
<button
|
||
class="chat-inline-disclosure chat-activity-group__summary"
|
||
type="button"
|
||
aria-expanded=${String(t.expanded)}
|
||
@pointerenter=${_m}
|
||
@focus=${_m}
|
||
@click=${e=>{rm(e)&&t.onToggle()}}
|
||
>
|
||
<span class="chat-tool-disclosure__content">
|
||
<span class="chat-activity-group__label" title=${r}>${r}</span>
|
||
</span>
|
||
<span class="chat-tool-row__chevron" aria-hidden="true">${q.chevronRight}</span>
|
||
</button>
|
||
<div class="chat-work-group__separator" aria-hidden="true"></div>
|
||
${t.expanded?R:t.browserTabPreviews??R}
|
||
</div>
|
||
`;return t.presentation===`continuation`?i:z`
|
||
<div class="chat-group tool chat-group--work" data-chat-row-key=${e.key}>
|
||
<div class="chat-group-messages">${i}</div>
|
||
</div>
|
||
`}function Rh(){return(Rh=e((()=>{B(),J(),K(),Je(),xs(),oh(),ph(),xh(),Xm(),Nh()})))()}function zh(e,t,n,r,i){let a;if(i?.shouldFetchFullMessage&&i.messageId&&r.loadFullAssistantMessage&&r.onToggleAssistantMessageExpanded){let e=i.messageId,t=r.getAssistantMessageExpansion?.(e),n=t?.status===`error`&&t.revision>=Kh;a={expanded:t?.status===`loaded`,...t?.status===`loaded`?{markdown:i.markdown}:{},...n?{onRetryFullMessage:()=>r.onToggleAssistantMessageExpanded?.(e)}:{}}}return{isStreaming:e.isStreaming&&n===e.messages.length-1,sessionKey:r.sessionKey,boardProvider:r.boardProvider,agentId:r.agentId,entryId:bs(t.message)??void 0,entryAnimated:bo(e.role)===`user`&&Vh(t.key,t.message),onOpenWorkspaceFile:r.onOpenWorkspaceFile,duplicateCount:t.duplicateCount??1,showReasoning:r.showReasoning,showToolCalls:r.showToolCalls??!0,runActive:r.runActive,autoExpandToolCalls:r.autoExpandToolCalls??!1,isToolMessageExpanded:r.isToolMessageExpanded,onToggleToolMessageExpanded:r.onToggleToolMessageExpanded,isUserMessageExpanded:r.isUserMessageExpanded,onToggleUserMessageExpanded:r.onToggleUserMessageExpanded,assistantMessageDisclosure:a,actionMarkdown:i?.markdown,isToolExpanded:r.isToolExpanded,onToggleToolExpanded:r.onToggleToolExpanded,onRequestUpdate:r.onRequestUpdate,onRequestOpenImage:r.onRequestOpenImage,onOpenImage:r.onOpenImage,onAssistantAttachmentLoaded:r.onAssistantAttachmentLoaded,canvasPluginSurfaceUrl:r.canvasPluginSurfaceUrl,resourceBasePath:r.resourceBasePath,localMediaPreviewRoots:r.localMediaPreviewRoots,connectionEpoch:r.connectionEpoch,assistantAttachmentAuthToken:r.assistantAttachmentAuthToken,resolveArtifactDownload:r.resolveArtifactDownload,embedSandboxMode:r.embedSandboxMode,allowExternalEmbedUrls:r.allowExternalEmbedUrls,fetchLinkFavicon:r.fetchLinkFavicon,resolveReplyPreview:r.resolveReplyPreview,onResolveReply:r.onResolveReply,onOpenReply:r.onOpenReply,replyNavigationId:r.replyNavigationId}}function Bh(e,t){let n=e.sender?.identity;return!!(e.sender&&!(t&&n?.type===`profile`&&n.id===t))}function Vh(e,t){let n=Date.now(),r=qh.get(e);if(r!==void 0)return r>0&&n-r<Jh;if(!ys(t))return!1;let i=t.timestamp,a=typeof i==`number`&&n-i<Yh;for(;qh.size>=Xh;){let e=qh.keys().next().value;if(e===void 0)break;qh.delete(e)}return qh.set(e,a?n:0),a}function Hh(e,t,n=`standalone`){let r=e[0];if(!r||t.showToolCalls===!1)return R;let i=e.flatMap(e=>e.messages.flatMap(e=>Ia(e.message,e.key))),a=(e[e.length-1]??r).messages.flatMap(e=>Ia(e.message,e.key)),o=t.runActive?a.findLast(e=>Im(e,t.runActive)):void 0,s=o?`${Lm(o,t.runActive)}…`:Ni(i.map(e=>({name:e.name,args:e.args}))),c=`activity:${r.key}`,l=`activity-body-${_o(r.key).toString(16)}`,u=t.isToolMessageExpanded?.(c)??!1,d=i.flatMap(e=>zi(e.details)),f=i.flatMap(e=>{let t=cr(e.details);return t?[t]:[]}),p=jr(d,f),m=d[0]?.label??`Review`,h=p?Y(`chat.toolCards.review.${p===`reviewing`?`reviewing`:p}`,{reviewer:m}):``,g=z`
|
||
<div class="chat-activity-group ${u?`is-open`:``}">
|
||
<button
|
||
class="chat-inline-disclosure chat-activity-group__summary"
|
||
type="button"
|
||
aria-expanded=${String(u)}
|
||
aria-controls=${l}
|
||
@pointerenter=${_m}
|
||
@focus=${_m}
|
||
@click=${e=>{rm(e)&&t.onToggleToolMessageExpanded?.(c,u)}}
|
||
>
|
||
<span class="chat-activity-group__icon">${q.listTree}</span>
|
||
<span class="chat-tool-disclosure__content">
|
||
<span class="chat-activity-group__label" title=${s}
|
||
>${s}</span
|
||
>
|
||
</span>
|
||
${p?z`<span
|
||
class="chat-activity-group__review-status"
|
||
data-outcome=${p}
|
||
role="img"
|
||
aria-label=${h}
|
||
>${p===`denied`?q.shieldX:p===`reviewing`?q.shieldQuestion:q.shieldCheck}</span
|
||
>`:R}
|
||
<span class="chat-tool-row__chevron" aria-hidden="true">${q.chevronRight}</span>
|
||
</button>
|
||
<div class="chat-activity-group__body" id=${l} ?hidden=${!u}>
|
||
${u?e.map(e=>e.messages.map((n,r)=>ah(n.message,n.key,zh(e,n,r,t),t.onOpenSidebar))):R}
|
||
</div>
|
||
${nm(e,t)}
|
||
</div>
|
||
`;return n===`continuation`?g:z`
|
||
<div
|
||
class="chat-group tool chat-group--activity chat-group--with-footer"
|
||
data-chat-row-key=${r.key}
|
||
>
|
||
<div class="chat-group-messages">${g}</div>
|
||
</div>
|
||
`}function Uh(e,t){let n=bo(e.role),r=t.assistantName??`Assistant`,i=en({name:t.userName??null,avatar:t.userAvatar??null}),a=e.senderLabel?.trim(),o=n===`user`&&Bh(e,t.userId),s=n===`user`&&!!e.sender&&!o;return n===`user`?s?i:a??i:n===`assistant`?a??r:n===`tool`?Y(`chat.messages.toolSender`):e.messages.every(e=>!!uc(e.message))?Y(`chat.workspaceConflict.eventSender`):n}function Wh(e,t){if(bo(e.role)===`tool`){let n=e.messages.flatMap(e=>Ia(e.message,e.key));if(e.messages.length>1||n.length>1||n.some(e=>zi(e.details).length>0))return Hh([e],t,`continuation`)}let n=Uh(e,t),r=e.messages.map((r,i)=>{let a=Vf({message:r.message,messageId:r.key,canFetchFullMessage:!!(t.loadFullAssistantMessage&&t.sessionKey),getAssistantMessageExpansion:t.getAssistantMessageExpansion,onReply:t.onReply,senderLabel:n});if(a?.shouldFetchFullMessage&&a.messageId&&t.loadFullAssistantMessage&&t.onToggleAssistantMessageExpanded){let e=t.getAssistantMessageExpansion?.(a.messageId);(!e||e.status===`error`&&e.revision<Kh)&&t.onToggleAssistantMessageExpanded(a.messageId)}return ah(r.message,r.key,zh(e,r,i,t,a),t.onOpenSidebar)});return z`${r}${t.showToolCalls===!1?R:nm([e],t)}`}function Gh(e,t){let n=bo(e.role),r=e.messages.every(e=>!!uc(e.message)),i=t.assistantName??`Assistant`,a=n===`user`&&Bh(e,t.userId),o=Uh(e,t),s=n===`user`?`user`:n===`assistant`?`assistant`:n===`tool`?`tool`:r?`workspace-conflict`:`other`,c=t.showAvatarGutter!==!1,l=n===`user`&&c,u=uh(e,t.contextWindow??null);if(n===`tool`&&t.showToolCalls===!1)return R;let d=n===`tool`?e.messages.flatMap(e=>Ia(e.message,e.key)):[];if(n===`tool`&&(e.messages.length>1||d.length>1||d.some(e=>zi(e.details).length>0)))return Hh([e],t);let f=t.frameContent!==void 0,p=(f?t.frameActionOwner?[t.frameActionOwner]:[]:e.messages).map(e=>Vf({message:e.message,messageId:e.key,canFetchFullMessage:!!(t.loadFullAssistantMessage&&t.sessionKey),getAssistantMessageExpansion:t.getAssistantMessageExpansion,onReply:t.onReply,senderLabel:o}));for(let e of p){if(!e?.shouldFetchFullMessage||!e.messageId)continue;let n=t.getAssistantMessageExpansion?.(e.messageId);(!n||n.status===`error`&&n.revision<Kh)&&t.onToggleAssistantMessageExpanded?.(e.messageId)}let m=e.messages.length-1,h=f?p[0]??null:p[m]??null,g=f?t.frameActionOwner?.key:e.messages[m]?.key,_=n===`user`&&(h?.replyTarget&&t.onReply||t.onRewind||h?.markdown)?z`
|
||
<div
|
||
class="chat-group-footer-actions"
|
||
data-message-actions-for=${g??R}
|
||
>
|
||
${h?.replyTarget&&t.onReply?Uf(h.replyTarget,t.onReply):R}
|
||
${t.onRewind?nu(t.onRewind,!!t.rewindDisabled):R}
|
||
${h?.markdown?Hf(h,{}):R}
|
||
</div>
|
||
`:R,v=n===`user`&&e.sender?Aa(e.sender):null,y=ms(e.messages.at(-1)?.message),b=t.queuedMessageAction?.id===y?.id?t.queuedMessageAction:void 0,x=n===`assistant`?po(e.replyToSender):null,S=x?Y(`chat.messages.replyingTo`,{name:x}):null;return z`
|
||
<div
|
||
class="chat-group ${s} chat-group--with-footer${t.latestAssistant?` chat-group--latest-assistant`:``}${a?` chat-group--peer`:``}${v===null?``:` chat-group--sender-tint`}"
|
||
style=${v===null?R:`--chat-sender-hue: ${v}`}
|
||
data-chat-row-key=${e.key}
|
||
>
|
||
${n!==`tool`&&c&&(n!==`assistant`||t.showAssistantAvatar!==!1)?js(e.role,{name:i,avatar:t.assistantAvatar??null},{name:t.userName??null,avatar:t.userAvatar??null},t.resourceBasePath,t.assistantAttachmentAuthToken,e.sender):R}
|
||
<div class="chat-group-messages">
|
||
${x?z`
|
||
<div class="chat-reply-attribution" title=${S} aria-label=${S}>
|
||
<span class="chat-reply-attribution__icon" aria-hidden="true"
|
||
>${q.cornerDownLeft}</span
|
||
>
|
||
<span>${x}</span>
|
||
</div>
|
||
`:R}
|
||
${t.frameContent??e.messages.map((n,r)=>{let i=p[r];return z`
|
||
${ah(n.message,n.key,zh(e,n,r,t,i),t.onOpenSidebar)}
|
||
${i&&r<m&&!f?z`
|
||
<div class="chat-message-actions-row" data-message-actions-for=${n.key}>
|
||
${Hf(i,t)}
|
||
</div>
|
||
`:R}
|
||
`})}
|
||
${f||t.showToolCalls===!1?R:nm([e],t)}
|
||
${t.activeContinuation?Fh(t.activeContinuation.parts,t.activeContinuation.options,`continuation`):t.turnRecap?jh(t.turnRecap,{presentation:`continuation`}):R}
|
||
</div>
|
||
${n===`tool`||e.isStreaming||t.activeContinuation?R:z`<div
|
||
class="chat-group-footer ${l?`chat-group-footer--persistent-identity`:``}${y?` chat-group-footer--send-failure`:``}"
|
||
>
|
||
<div class="chat-group-footer__meta">
|
||
${a?R:_}
|
||
${n===`user`&&!c?hu(e.sender):R}
|
||
${yo(o,a&&e.sender?.identity?.type===`profile`?Ui(e.sender.identity.id,t.personActivity):null,`chat-sender-name`)}
|
||
${y?z`<span
|
||
class="chat-send-status"
|
||
title=${y.error??R}
|
||
data-send-state=${y.state}
|
||
>
|
||
<span aria-hidden="true">·</span>
|
||
<span
|
||
>${Y(y.state===`unconfirmed`?`chat.queue.deliveryUnconfirmed`:`chat.queue.notSent`)}</span
|
||
>
|
||
${b?.onAction||t.onRetryQueuedMessage?z`
|
||
<span aria-hidden="true">·</span>
|
||
<button
|
||
class="chat-send-status__retry"
|
||
type="button"
|
||
aria-label=${b?.label??Y(`chat.queue.retryQueuedMessage`)}
|
||
@click=${()=>b?.onAction?b.onAction():t.onRetryQueuedMessage?.(y.id)}
|
||
>
|
||
${b?.label??Y(`chat.queue.retry`)}
|
||
</button>
|
||
`:R}
|
||
</span>`:R}
|
||
${dh(e.timestamp,u)}
|
||
</div>
|
||
${a?_:n!==`user`&&h?z`
|
||
<div
|
||
class="chat-group-footer-actions"
|
||
data-message-actions-for=${g??R}
|
||
>
|
||
${Hf(h,t)}
|
||
</div>
|
||
`:R}
|
||
</div>`}
|
||
</div>
|
||
`}var Kh,qh,Jh,Yh,Xh;function Zh(){return(Zh=e((()=>{B(),Kt(),J(),Ii(),K(),Wi(),ko(),Ci(),Vo(),ya(),Io(),xs(),us(),dc(),gu(),oh(),fu(),ep(),Rh(),ph(),Xm(),Nh(),Kh=6,qh=new Map,Jh=400,Yh=2e3,Xh=256})))()}function Qh(){return(Qh=e((()=>{G(),Yl(),fu(),Zh(),Rh()})))()}function $h(e){return typeof e==`string`?e:e instanceof Error&&typeof e.message==`string`?e.message:`unknown error`}function eg(e){let t=$h(e.message),n=r(t),i=a(e.details),o=d(t),s=i?.reason??o?.reason;if(n.startsWith(`pairing required:`)&&s)return`gateway pairing required: ${v(s)}`;if(o&&n!==`pairing required`)return t;let c=i?.approvedRoles?.join(`, `)??`none`,l=i?.requestedRole??`none`,u=i?.approvedScopes?.join(`, `)??`none`,f=i?.requestedScopes?.join(`, `)??`none`;switch(i?.reason){case`scope-upgrade`:return i.approvedScopes||i.requestedScopes?`device scope upgrade requires approval (approved: ${u}; requested: ${f})`:g(e.details);case`role-upgrade`:return i.approvedRoles||i.requestedRole?`device role upgrade requires approval (approved: ${c}; requested: ${l})`:g(e.details);case`metadata-upgrade`:return`device reconnect details changed and require approval`;default:return`gateway pairing required`}}function tg(e){let t=$h(e.message);switch(Xt(e)){case l.AUTH_TOKEN_MISMATCH:return`gateway token mismatch`;case l.AUTH_UNAUTHORIZED:return`gateway auth failed`;case l.AUTH_RATE_LIMITED:return`too many failed authentication attempts`;case l.PAIRING_REQUIRED:return eg(e);case l.CONTROL_UI_DEVICE_IDENTITY_REQUIRED:return`device identity required (use HTTPS or localhost)`;case l.CONTROL_UI_ORIGIN_NOT_ALLOWED:return`origin not allowed (open the Control UI from the gateway host or allow it in gateway.controlUi.allowedOrigins)`;case l.AUTH_TOKEN_MISSING:return`gateway token missing`}let n=r(t);return n===`fetch failed`||n===`failed to fetch`||n===`connect failed`?`gateway connect failed`:t}function ng(e){let t=e&&typeof e==`object`?tg(e):$h(e);return Ee(t)}function rg(){return(rg=e((()=>{s(),Gt(),Fe()})))()}function ig(e){let n=_(e.sessionKey)?.toLowerCase(),r=n===`global`?null:w(e.sessionKey),i=Ge(e,e.sessionKey).agentId,a=t(e.assistantAgentId??e.agentsList?.defaultId??e.agentsList?.agents?.[0]?.id??`main`);return n===`global`?i??a:r??i??a}function ag(e){e?.browserSearchTimer&&(globalThis.clearTimeout(e.browserSearchTimer),e.browserSearchTimer=null)}function og(e){ag(e.sessionWorkspaceState)}function sg(e){_g.add(e)}function cg(e,t){sg(t),e.handleOpenSidebar(t)}function lg(e){e.sidebarContent&&_g.has(e.sidebarContent)&&e.handleOpenSidebar(null)}function ug(e,t){return{activeId:null,agentId:ig(e),browserPath:``,browserSearch:``,browserSearchTimer:null,collapsed:t?.collapsed??!0,connectionEpoch:e.connectionEpoch,dock:t?.dock??Vt(e.settings?.chatWorkspaceDock),error:null,list:null,loading:!1,pendingReload:!1,sessionKey:e.sessionKey}}function dg(e,t){return e.sessionWorkspaceState===t&&t.sessionKey===e.sessionKey&&t.agentId===ig(e)&&t.connectionEpoch===e.connectionEpoch}function fg(e){let t=e.sessionWorkspaceState;if(t&&dg(e,t))return t;lg(e),ag(t);let n=ug(e,t);return e.sessionWorkspaceState=n,n}function pg(e){e.requestUpdate?.()}function mg(e,t,n=!1){if(!e.client||!e.connected)return;if(t.loading){n&&(t.pendingReload=!0);return}t.loading=!0,t.error=null,n&&(t.list=null),t.pendingReload=!1;let r=e.sessionKey,i=t.agentId,a=e.client;(async()=>{try{let n=await e.sessions.listFiles(r,{path:t.browserSearch?``:t.browserPath,search:t.browserSearch,agentId:i});if(!dg(e,t))return;let o=await a.request(`artifacts.list`,{sessionKey:r,...i?{agentId:i}:{}});if(!dg(e,t))return;let s=n?.files??[],c=o?.artifacts??[],l=n?.browser?.entries??[];t.list={sessionKey:r,...n?.root?{root:n.root}:{},...typeof n?.gitCheckout==`boolean`?{gitCheckout:n.gitCheckout}:{},files:s,...n?.browser?{browser:n.browser}:{},artifacts:c},t.activeId&&!s.some(e=>`file:${e.path}`===t.activeId)&&!l.some(e=>`file:${e.path}`===t.activeId)&&!c.some(e=>`artifact:${e.id}`===t.activeId)&&(t.activeId=null)}catch(n){dg(e,t)&&(t.error=Ee(n))}finally{dg(e,t)&&(t.loading=!1),pg(e)}})()}function hg(e,t){let n=e.sessionWorkspaceState;if(!n||n.sessionKey!==e.sessionKey)return!1;let r=n.diffContent!==void 0&&e.sidebarContent===n.diffContent;return delete n.diffContent,t?(n.loading?n.pendingReload=!0:mg(e,n),r):(n.pendingReload=!0,r)}function gg(e){let t=e.sessionWorkspaceState;!t||t.sessionKey!==e.sessionKey||(lg(e),ag(t),e.sessionWorkspaceState=ug(e,t),pg(e))}var _g;function vg(){return(vg=e((()=>{kt(),Fe(),ae(),ve(),_g=new WeakSet})))()}function yg(e){return e.composedPath().some(e=>e instanceof HTMLElement&&e.localName===`openclaw-image-lightbox`)}function bg(e){let t=e.composedPath().find(e=>e instanceof HTMLElement&&(e.classList.contains(`markdown-inline-image`)||e.classList.contains(`markdown-inline-image-button`))),n=t instanceof HTMLImageElement?t:t?.querySelector(`.markdown-inline-image`)??null;return n?.closest(`a`)?null:n}function xg(e,t){if(e.defaultPrevented)return!1;let n=bg(e);return n?(e.preventDefault(),of(t,n.currentSrc||n.src,n.alt.trim()||Y(`chat.imageLightbox.untitled`)),!0):!1}function Sg(e,t){return e?z`
|
||
<openclaw-image-lightbox
|
||
.mediaKind=${e.kind??`image`}
|
||
src=${e.src}
|
||
.originalSrc=${e.originalSrc??``}
|
||
.imageTitle=${e.title}
|
||
@image-lightbox-close=${t}
|
||
></openclaw-image-lightbox>
|
||
`:R}function Cg(){return(Cg=e((()=>{B(),Vi(),K(),sf()})))()}function wg(e){if(!e.absolutePath)return R;let t=`Open in editor`;return z`
|
||
<div class="sidebar-file-view__editor">
|
||
<openclaw-tooltip .content=${t}>
|
||
<wa-dropdown
|
||
class="sidebar-file-view__editor-menu"
|
||
placement="bottom-end"
|
||
.open=${e.open}
|
||
@wa-select=${t=>{let n=t.detail.item.value;n&&La.includes(n)&&e.onOpenEditor(n)}}
|
||
@wa-show=${()=>e.onOpenChange(!0)}
|
||
@wa-hide=${()=>e.onOpenChange(!1)}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
class="btn btn--sm sidebar-file-view__action"
|
||
type="button"
|
||
aria-label=${t}
|
||
>
|
||
${q.externalLink}
|
||
</button>
|
||
${La.map(e=>z`
|
||
<wa-dropdown-item class="sidebar-file-view__editor-item" value=${e}>
|
||
${Pa[e]}
|
||
</wa-dropdown-item>
|
||
`)}
|
||
</wa-dropdown>
|
||
</openclaw-tooltip>
|
||
</div>
|
||
`}function Tg(){return(Tg=e((()=>{B(),J(),G(),mn(),da()})))()}function Eg(e){return e.draftKey??`${e.root??``}\u0000${e.path}`}function Dg(e){return Ng.get(Eg(e))}function Og(e,t){let n=Eg(e);Ng.delete(n),t&&Ng.set(n,t)}function kg(e){return[e.split(`\r
|
||
`).length-1,(e.match(/\r(?!\n)/g)??[]).length,(e.match(/(?<!\r)\n/g)??[]).length].filter(e=>e>0).length<=1}function Ag(e,t){let n=t.toLocaleLowerCase();return n?e.split(`
|
||
`).flatMap((e,t)=>e.toLocaleLowerCase().includes(n)?[t+1]:[]):[]}function jg(e,t){let n=t?.copyFeedback[e],r=Y(n===`failed`?`common.copyFailed`:n===`copied`?`common.copied`:e===`path`?`chat.detailPanel.copyPath`:`chat.detailPanel.copyContents`);return z`
|
||
<openclaw-tooltip .content=${r}>
|
||
<button
|
||
class="btn btn--sm sidebar-file-view__action ${n===`copied`?`copied`:``}"
|
||
type="button"
|
||
aria-label=${r}
|
||
@click=${()=>t?.onCopy(e)}
|
||
>
|
||
${n===`copied`?q.check:q.copy}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`}function Mg(e,t,n){let r=qi(e,n?.execNode),i=n?.matches.length?n.currentMatchIndex+1:0;return z`
|
||
<section class="sidebar-file-view">
|
||
<div class="sidebar-file-view__path-bar">
|
||
<div class="sidebar-file-view__path-field">
|
||
<span class="sidebar-file-view__path" title=${e.path}>${e.path}</span>
|
||
${jg(`path`,n)}
|
||
</div>
|
||
${n?z`
|
||
<div class="sidebar-file-view__actions">
|
||
${n.editing?z`
|
||
<button
|
||
class="btn btn--sm"
|
||
type="button"
|
||
?disabled=${!n.dirty||n.saving}
|
||
@click=${n.onSave}
|
||
>
|
||
${n.saving?Y(`common.saving`):Y(`common.save`)}
|
||
</button>
|
||
<button
|
||
class="btn btn--sm"
|
||
type="button"
|
||
?disabled=${n.saving}
|
||
@click=${n.onDiscard}
|
||
>
|
||
${Y(`chat.detailPanel.discard`)}
|
||
</button>
|
||
`:z`
|
||
${e.edit?z`
|
||
<openclaw-tooltip .content=${Y(`chat.detailPanel.editFile`)}>
|
||
<button
|
||
class="btn btn--sm sidebar-file-view__action"
|
||
type="button"
|
||
aria-label=${Y(`chat.detailPanel.editFile`)}
|
||
?disabled=${n.loadingEditor}
|
||
@click=${n.onEdit}
|
||
>
|
||
${q.edit}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
<openclaw-tooltip .content=${Y(`chat.detailPanel.searchInFile`)}>
|
||
<button
|
||
class="btn btn--sm sidebar-file-view__action"
|
||
type="button"
|
||
aria-label=${Y(`chat.detailPanel.searchInFile`)}
|
||
aria-pressed=${String(n.searchOpen)}
|
||
@click=${n.onToggleSearch}
|
||
>
|
||
${q.search}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
${n.onReveal?z`
|
||
<openclaw-tooltip .content=${Y(`chat.detailPanel.showInFiles`)}>
|
||
<button
|
||
class="btn btn--sm sidebar-file-view__action"
|
||
type="button"
|
||
aria-label=${Y(`chat.detailPanel.showInFiles`)}
|
||
@click=${()=>n.onReveal?.(e.path)}
|
||
>
|
||
${q.folder}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
${wg({absolutePath:r,open:n.editorMenuOpen,onOpenChange:n.onEditorMenuOpenChange,onOpenEditor:n.onOpenEditor})}
|
||
${jg(`contents`,n)}
|
||
`}
|
||
</div>
|
||
`:R}
|
||
</div>
|
||
${Object.values(n?.copyFeedback??{}).includes(`failed`)?z`<div class="file-view__save-notice" role="alert">${Y(`common.copyFailed`)}</div>`:R}
|
||
${n?.searchOpen?z`
|
||
<div class="file-view__search">
|
||
<input
|
||
type="search"
|
||
aria-label=${Y(`chat.detailPanel.searchInFile`)}
|
||
placeholder=${Y(`common.search`)}
|
||
.value=${n.query}
|
||
@input=${e=>n.onSearchInput(e.currentTarget.value)}
|
||
@keydown=${n.onSearchKeydown}
|
||
/>
|
||
<span class="file-view__search-counter"
|
||
>${i}/${n.matches.length}</span
|
||
>
|
||
<button
|
||
class="btn btn--sm file-view__search-action file-view__search-action--previous"
|
||
type="button"
|
||
aria-label=${Y(`chat.detailPanel.previousMatch`)}
|
||
?disabled=${n.matches.length===0}
|
||
@click=${n.onPreviousMatch}
|
||
>
|
||
${q.chevronDown}
|
||
</button>
|
||
<button
|
||
class="btn btn--sm file-view__search-action"
|
||
type="button"
|
||
aria-label=${Y(`chat.detailPanel.nextMatch`)}
|
||
?disabled=${n.matches.length===0}
|
||
@click=${n.onNextMatch}
|
||
>
|
||
${q.chevronDown}
|
||
</button>
|
||
</div>
|
||
`:R}
|
||
${n?.saveNotice?z`
|
||
<div class="file-view__save-notice" role="alert">
|
||
<span>
|
||
${n.saveNotice.kind===`conflict`?Y(`chat.detailPanel.fileChanged`):n.saveNotice.message}
|
||
</span>
|
||
${n.saveNotice.kind===`conflict`?z`
|
||
<div class="file-view__save-notice-actions">
|
||
<button
|
||
class="btn btn--sm"
|
||
type="button"
|
||
?disabled=${n.saving}
|
||
@click=${n.onReload}
|
||
>
|
||
${Y(`common.reload`)}
|
||
</button>
|
||
<button
|
||
class="btn btn--sm"
|
||
type="button"
|
||
?disabled=${n.saving}
|
||
@click=${n.onOverwrite}
|
||
>
|
||
${Y(`chat.detailPanel.overwrite`)}
|
||
</button>
|
||
</div>
|
||
`:R}
|
||
</div>
|
||
`:R}
|
||
<div class="file-view">
|
||
${wt(n?.mountKey??e,z`<div class="file-view__mount"></div>`)}
|
||
${n?.loadingEditor?hr(`review`,Y(`common.loading`),!1,!0):R}
|
||
</div>
|
||
${n?.editing?R:z`
|
||
<div class="sidebar-file-view__footer">
|
||
<button @click=${t} class="btn btn--sm" type="button">
|
||
${Y(`chat.detailPanel.viewRawText`)}
|
||
</button>
|
||
</div>
|
||
`}
|
||
</section>
|
||
`}var Ng,Pg;function Fg(){return(Fg=e((()=>{B(),rt(),Pr(),J(),Mi(),G(),K(),Tg(),Ng=new Map,Pg={}})))()}var Ig;function Lg(){return(Lg=e((()=>{B(),ut(),vn(),Dn(),J(),dn(),mn(),K(),da(),Pe(),Ig=class extends we{constructor(...e){super(...e),this.menu=null,this.onAction=()=>{},this.onClose=()=>{},this.menuLifecycle=new sn(this,{getTrigger:()=>this.menu?.trigger??null,onClose:()=>this.onClose()}),this.handleSelect=e=>{e.preventDefault();let t=e.detail.item.value;if(!t)return;let n={"collapse-all":{kind:`collapse-all`},"expand-all":{kind:`expand-all`},"toggle-split":{kind:`toggle-split`},"toggle-wrap":{kind:`toggle-wrap`},"scope:all":{kind:`scope`,value:{scope:`all`}},"scope:uncommitted":{kind:`scope`,value:{scope:`uncommitted`}}},r=this.menu?.kind===`file`?this.menu:null;if(r&&t===`open-file`){this.run({kind:`open-file`,path:r.path});return}if(r&&t===`reveal-file`){this.run({kind:`reveal-file`,path:r.path});return}let i=n[t];if(i){this.run(i);return}if(t.startsWith(`open-editor:`)){let e=t.slice(12);if(La.includes(e)){let t=this.menu?.kind===`file`?this.menu.absolutePath:void 0;t&&this.run({kind:`open-editor`,editor:e,path:t})}return}t.startsWith(`scope:commit:`)&&this.run({kind:`scope`,value:{scope:`commit`,commit:t.slice(13)}})},this.handleAfterHide=e=>{e.currentTarget instanceof Node&&e.currentTarget.isConnected&&this.onClose()}}connectedCallback(){super.connectedCallback(),pn(this)}run(e){this.onClose(),this.onAction(e)}renderFileMenu(e){return z`
|
||
${this.renderCopyRow(e.path,Y(`chat.sessionDiff.copyPath`))}
|
||
<wa-dropdown-item class="session-menu__item" value="open-file" ?disabled=${!e.canOpenFile}>
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.fileText}</span>
|
||
<span class="session-menu__text">${Y(`chat.sessionDiff.openFile`)}</span>
|
||
</wa-dropdown-item>
|
||
${e.canReveal?z`<wa-dropdown-item class="session-menu__item" value="reveal-file">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.folder}</span>
|
||
<span class="session-menu__text">${Y(`chat.sessionDiff.revealInFileTree`)}</span>
|
||
</wa-dropdown-item>`:R}
|
||
${e.absolutePath?z`<wa-dropdown-item class="session-menu__item">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true"
|
||
>${q.externalLink}</span
|
||
>
|
||
<span class="session-menu__text">${Y(`chat.sessionDiff.openInEditor`)}</span>
|
||
${La.map(e=>z`<wa-dropdown-item
|
||
slot="submenu"
|
||
class="session-menu__item"
|
||
value=${`open-editor:${e}`}
|
||
>
|
||
<span class="session-menu__text">${Pa[e]}</span>
|
||
</wa-dropdown-item>`)}
|
||
</wa-dropdown-item>`:R}
|
||
`}renderViewMenu(e){return z`
|
||
<wa-dropdown-item class="session-menu__item" value="collapse-all">
|
||
<span class="session-menu__text">${Y(`chat.sessionDiff.collapseAll`)}</span>
|
||
</wa-dropdown-item>
|
||
<wa-dropdown-item class="session-menu__item" value="expand-all">
|
||
<span class="session-menu__text">${Y(`chat.sessionDiff.expandAll`)}</span>
|
||
</wa-dropdown-item>
|
||
<div class="session-menu__separator" role="separator"></div>
|
||
<wa-dropdown-item class="session-menu__item" value="toggle-wrap">
|
||
<span class="session-menu__text"
|
||
>${Y(e.wrap?`chat.sessionDiff.disableWrapping`:`chat.sessionDiff.enableWrapping`)}</span
|
||
>
|
||
</wa-dropdown-item>
|
||
<wa-dropdown-item class="session-menu__item" value="toggle-split">
|
||
<span class="session-menu__text"
|
||
>${Y(e.split?`chat.sessionDiff.switchUnified`:`chat.sessionDiff.switchSplit`)}</span
|
||
>
|
||
</wa-dropdown-item>
|
||
`}renderScopeMenu(e){let t=e.active.scope===`commit`?e.active.commit:null;return z`
|
||
${this.renderScopeItem(`scope:all`,Y(`chat.sessionDiff.allChanges`),e.active.scope===`all`)}
|
||
${this.renderScopeItem(`scope:uncommitted`,Y(`chat.sessionDiff.uncommitted`),e.active.scope===`uncommitted`)}
|
||
${e.result.commits?.length?z`<div class="session-menu__separator" role="separator"></div>
|
||
${e.result.commits.map((e,n)=>this.renderScopeItem(`scope:commit:${e.sha}`,z`<span class="session-diff-menu__sha">${e.sha}</span>
|
||
<span class="session-diff-menu__subject">${e.subject}</span>
|
||
${n===0?z`<span class="session-diff-menu__head"
|
||
>${Y(`chat.sessionDiff.head`)}</span
|
||
>`:R}`,t===e.sha))}`:R}
|
||
${e.result.mergeBase?z`<div class="session-menu__separator" role="separator"></div>
|
||
<div class="session-diff-menu__merge-base">
|
||
<span>${Y(`chat.sessionDiff.mergeBase`)}</span>
|
||
<span class="session-diff-menu__sha">${e.result.mergeBase.sha}</span>
|
||
<span class="session-diff-menu__subject">${e.result.mergeBase.subject}</span>
|
||
</div>`:R}
|
||
`}renderScopeItem(e,t,n){return z`<wa-dropdown-item
|
||
class="session-menu__item session-diff-menu__scope-item"
|
||
value=${e}
|
||
role="menuitemradio"
|
||
aria-checked=${String(n)}
|
||
>
|
||
<span class="session-menu__text">${t}</span>
|
||
${n?z`<span slot="details" class="session-menu__check" aria-hidden="true"
|
||
>${q.check}</span
|
||
>`:R}
|
||
</wa-dropdown-item>`}renderSyncMenu(e){return z`<div class="session-diff-menu__sync">
|
||
<strong>${Y(`chat.sessionDiff.syncLocally`)}</strong>
|
||
<p>${Y(`chat.sessionDiff.syncDescription`)}</p>
|
||
${this.renderCopyRow(e.command,Y(`chat.sessionDiff.copyCommand`),!0)}
|
||
${this.renderCopyRow(e.root,Y(`chat.sessionDiff.checkoutPath`))}
|
||
${this.renderCopyRow(e.branch,Y(`chat.sessionDiff.branchName`))}
|
||
<p class="session-diff-menu__note">${Y(`chat.sessionDiff.uncommittedStay`)}</p>
|
||
</div>`}renderCopyRow(e,t,n=!1){return z`<div class="session-diff-menu__copy-row ${n?`is-command`:``}">
|
||
<span class="session-diff-menu__copy-label">${t}</span>
|
||
<code title=${e}>${e}</code>
|
||
${Tn(e,t)}
|
||
</div>`}render(){let e=this.menu;if(!e)return R;let t=e.kind===`scope`?e.placement??`top-start`:`bottom-end`,n=e.kind===`sync`?360:e.kind===`scope`?340:240,r=e.kind===`file`?Y(`chat.sessionDiff.fileActions`,{path:e.path}):e.kind===`scope`?Y(`chat.sessionDiff.scopeMenu`):e.kind===`sync`?Y(`chat.sessionDiff.syncLocally`):Y(`chat.sessionDiff.viewOptions`),i=Math.max(8,Math.min(e.anchor.x,window.innerWidth-8)),a=Math.max(8,Math.min(e.anchor.y,window.innerHeight-8));return z`<wa-dropdown
|
||
class="session-menu session-diff-menu session-diff-menu--${e.kind}"
|
||
style=${`--session-diff-menu-width:${n}px`}
|
||
.open=${!0}
|
||
placement=${t}
|
||
.distance=${4}
|
||
aria-label=${r}
|
||
@wa-select=${this.handleSelect}
|
||
@wa-after-hide=${this.handleAfterHide}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
type="button"
|
||
tabindex="-1"
|
||
aria-hidden="true"
|
||
style="position:fixed;left:${i}px;top:${a}px;width:1px;height:1px;opacity:0;pointer-events:none"
|
||
></button>
|
||
${e.kind===`file`?this.renderFileMenu(e):e.kind===`scope`?this.renderScopeMenu(e):e.kind===`sync`?this.renderSyncMenu(e):this.renderViewMenu(e)}
|
||
</wa-dropdown>`}},h([H({attribute:!1})],Ig.prototype,`menu`,void 0),h([H({attribute:!1})],Ig.prototype,`onAction`,void 0),h([H({attribute:!1})],Ig.prototype,`onClose`,void 0),customElements.get(`openclaw-session-diff-menu`)||customElements.define(`openclaw-session-diff-menu`,Ig)})))()}function Rg(e,t,n){let r=t===`left`?`-`:`+`;return z`<div
|
||
class="session-diff-split__side session-diff-split__side--${t} ${e?`session-diff-split__side--filled`:``}"
|
||
>
|
||
<span class="session-diff-split__gutter">${e?.lineNo??``}</span>
|
||
<span class="session-diff-split__sign">${e?r:``}</span>
|
||
<span class="session-diff-split__text">${e?n(e):``}</span>
|
||
</div>`}function zg(e,t,n={path:``}){let r=Sr(e);return np(e,n,e=>z`<div
|
||
class="session-diff-split code-highlight"
|
||
role="figure"
|
||
aria-label=${Y(`chat.toolCards.fileChanges`)}
|
||
>
|
||
${r.map(n=>n.kind===`pair`?z`<div class="session-diff-split__row session-diff-split__row--pair">
|
||
${Rg(n.left,`left`,e)}
|
||
${Rg(n.right,`right`,e)}
|
||
</div>`:n.line.kind===`skip`?z`<div class="session-diff-split__row session-diff-split__row--skip">
|
||
${(t?.(n.line)??n.line.text)||`⋯`}
|
||
</div>`:z`<div class="session-diff-split__row session-diff-split__row--context">
|
||
<span class="session-diff-split__gutter">${n.line.lineNo??``}</span>
|
||
<span class="session-diff-split__sign"></span>
|
||
<span class="session-diff-split__text">${e(n.line)}</span>
|
||
</div>`)}
|
||
</div>`)}function Bg(){return(Bg=e((()=>{B(),K(),rp()})))()}function Vg(){try{let e=JSON.parse(ke()?.getItem(Zg)??`null`);return{split:e?.split===!0,wrap:e?.wrap===!0}}catch{return{split:!1,wrap:!1}}}function Hg(e){try{ke()?.setItem(Zg,JSON.stringify(e))}catch{}}function Ug(e){switch(e.status){case`added`:return Y(`chat.sessionDiff.statusAdded`);case`deleted`:return Y(`chat.sessionDiff.statusDeleted`);case`renamed`:return Y(`chat.sessionDiff.statusRenamed`);default:return Y(`chat.sessionDiff.statusModified`)}}function Wg(e){return e.status===`added`?`A`:e.status===`deleted`?`D`:e.status===`renamed`?`R`:`M`}function Gg(e){let t=Math.min(e.additions,e.deletions);return{added:e.additions-t,removed:e.deletions-t,modified:t}}function Kg(e){return e.reduce((e,t)=>{let n=Gg(t);return e.added+=n.added,e.removed+=n.removed,e.modified+=n.modified,e},{added:0,removed:0,modified:0})}function qg(e){let t=e.replaceAll(`\\`,`/`),n=t.lastIndexOf(`/`);return n<0?{directory:``,name:t}:{directory:t.slice(0,n),name:t.slice(n+1)}}function Jg(e){return/^[A-Za-z0-9_./:@+-]+$/.test(e)?e:`'${e.replaceAll(`'`,`'\\''`)}'`}function Yg(e){return e.scope===`commit`?{scope:`commit`,commit:e.commit}:{scope:e.scope}}function Xg(e){return{result:e,views:e.files.map(e=>({file:e,parsed:e.patch?Xr(e.patch,e=>Y(`chat.sessionDiff.unmodifiedLines`,{count:String(e)})):null}))}}var Zg,Qg;function $g(){return($g=e((()=>{Pn(),B(),ut(),rt(),Pr(),J(),Mi(),K(),G(),Qo(),zr(),da(),Fe(),Pe(),op(),Lg(),Bg(),Zg=`openclaw.control.sessionDiff.v1`,Qg=class extends we{constructor(){super(),this.execNode=null,this.loader=null,this.loadFileText=null,this.openFile=null,this.revealFile=null,this.collapsedPaths=new Set,this.menu=null,this.scope={scope:`all`},this.split=Vg().split,this.wrap=Vg().wrap,this.fileTextCache=new WeakMap,this.unavailableFileText=new WeakSet,this.prefetchedDiffResult=null,this.diffTask=new Fn(this,{args:()=>[this.loader,this.scope.scope,this.scope.scope===`commit`?this.scope.commit:null],task:async([e,t,n])=>{if(!e)return null;let r=t===`commit`?{scope:t,commit:n}:{scope:t},i=this.prefetchedDiffResult??await e(r);return this.prefetchedDiffResult=null,Xg(i)},onComplete:e=>{let t=new Set(e?.views.map(e=>e.file.path)??[]);this.collapsedPaths=new Set([...this.collapsedPaths].filter(e=>t.has(e)))}}),Dr(this,()=>{this.menu=null})}get loading(){return this.loader!==null&&this.diffTask.status===Xn.PENDING}refresh(){return this.diffTask.run()}toggleFile(e){let t=new Set(this.collapsedPaths);t.has(e)?t.delete(e):t.add(e),this.collapsedPaths=t}openAnchoredMenu(e,t,n=`bottom-end`){e.stopPropagation();let r=e.currentTarget;if(!(r instanceof HTMLElement))return;let i=r.getBoundingClientRect();this.menu={...t,...t.kind===`scope`&&n!==`bottom-end`?{placement:n}:{},anchor:{x:n.endsWith(`start`)?i.left:i.right,y:n.startsWith(`top`)?i.top:i.bottom},trigger:r}}handleMenuAction(e){switch(e.kind){case`collapse-all`:{let e=this.diffTask.value?.views??[];this.collapsedPaths=new Set(e.map(e=>e.file.path));return}case`expand-all`:this.collapsedPaths=new Set;return;case`toggle-wrap`:this.wrap=!this.wrap,Hg({split:this.split,wrap:this.wrap});return;case`toggle-split`:this.split=!this.split,Hg({split:this.split,wrap:this.wrap});return;case`scope`:this.scope=e.value;return;case`open-file`:this.openFile?.(e.path);return;case`reveal-file`:this.revealFile?.(e.path);return;case`open-editor`:zo(e.editor,e.path)}}renderSummary(e){let t=e.baseRef&&e.branch&&e.baseRef!==e.branch?`${e.baseRef} → ${e.branch}`:e.branch??e.baseRef??``,n=e.root&&e.branch?`git fetch ${Jg(e.root)} ${Jg(e.branch)} && git checkout FETCH_HEAD`:null;return z`
|
||
<div class="session-diff__summary">
|
||
<span class="session-diff__branch" title=${e.root??``}>
|
||
${q.gitBranch}
|
||
<span class="session-diff__branch-label">${t}</span>
|
||
</span>
|
||
${ip(Kg(e.files))}
|
||
<span class="session-diff__summary-spacer"></span>
|
||
${n&&e.root&&e.branch?z`<button
|
||
class="btn btn--ghost btn--sm session-diff__toolbar-button"
|
||
type="button"
|
||
@click=${t=>this.openAnchoredMenu(t,{kind:`sync`,command:n,root:e.root,branch:e.branch})}
|
||
>
|
||
${Y(`chat.sessionDiff.sync`)} ${q.chevronDown}
|
||
</button>`:R}
|
||
<openclaw-tooltip .content=${Y(`chat.sessionDiff.viewOptions`)}>
|
||
<button
|
||
class="btn btn--ghost btn--icon session-diff__toolbar-icon"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.viewOptions`)}
|
||
@click=${e=>this.openAnchoredMenu(e,{kind:`view`,split:this.split,wrap:this.wrap})}
|
||
>
|
||
${q.moreHorizontal}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
<openclaw-tooltip .content=${Y(`chat.sessionDiff.refresh`)}>
|
||
<button
|
||
class="btn btn--ghost btn--icon session-diff__refresh"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.refresh`)}
|
||
?disabled=${this.loading}
|
||
@click=${()=>void this.refresh()}
|
||
>
|
||
${q.refresh}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</div>
|
||
`}canExpandGaps(e){return this.scope.scope!==`commit`&&!!this.loadFileText&&e.file.binary!==!0&&e.parsed!==null&&!e.parsed.truncated&&!this.unavailableFileText.has(e)}loadFileLines(e){let t=this.fileTextCache.get(e);if(t)return t;let n=this.loadFileText,r=n?n(e.file.path).then(e=>e===null?null:ur(e)).catch(()=>null):Promise.resolve(null);return this.fileTextCache.set(e,r),r}async expandGap(e,t,n){let r=e.parsed,i=this.loader;if(!r||!t.gap||!i||!this.canExpandGaps(e))return;let a=this.scope,o;try{o=await i(Yg(a))}catch{return}if(this.loader!==i||this.scope!==a||!this.diffTask.value?.views.includes(e))return;let s=o.files.find(t=>t.path===e.file.path);if(!s||s.patch!==e.file.patch){this.fileTextCache.delete(e),this.prefetchedDiffResult=o,await this.diffTask.run();return}let c=await this.loadFileLines(e);if(!c||!this.diffTask.value?.views.includes(e)){this.unavailableFileText.add(e),this.requestUpdate();return}let l=Ei(r.lines,t.gap,c,n,e=>Y(`chat.sessionDiff.unmodifiedLines`,{count:String(e)}));if(!l){this.unavailableFileText.add(e),this.requestUpdate();return}r.lines=l,this.requestUpdate()}renderGap(e,t){let n=t.gap;if(!n||!this.canExpandGaps(e))return t.text;let r=n.count<=25?n.count:Math.min(20,n.count);return z`<span class="session-diff__gap-controls">
|
||
<button
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.expandPreviousLines`,{count:String(r)})}
|
||
@click=${()=>void this.expandGap(e,t,`up`)}
|
||
>
|
||
${q.chevronUp}
|
||
</button>
|
||
<button
|
||
class="session-diff__gap-count"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.expandAllLines`,{count:String(n.count)})}
|
||
@click=${()=>void this.expandGap(e,t,`all`)}
|
||
>
|
||
${t.text}
|
||
</button>
|
||
<button
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.expandNextLines`,{count:String(r)})}
|
||
@click=${()=>void this.expandGap(e,t,`down`)}
|
||
>
|
||
${q.chevronDown}
|
||
</button>
|
||
</span>`}renderFileBody(e){let{file:t,parsed:n}=e;if(t.binary===!0)return z`<div class="session-diff__note">${Y(`chat.sessionDiff.binaryFile`)}</div>`;if(!n)return z`<div class="session-diff__note">${Y(`chat.sessionDiff.tooLarge`)}</div>`;let r=t=>this.renderGap(e,t);return z`
|
||
${this.split?zg(n.lines,r,t):ap(n.lines,`succeeded`,r,t)}
|
||
${n.truncated?z`<div class="session-diff__note">${Y(`chat.sessionDiff.truncatedFile`)}</div>`:R}
|
||
`}renderFile(e,t){let{file:n}=e,r=this.collapsedPaths.has(n.path),{directory:i,name:a}=qg(n.path),o=t.root?qi({root:t.root,path:n.path},this.execNode)??void 0:void 0,s=n.oldPath?`${n.oldPath} → ${n.path}`:n.path;return z`
|
||
<section class="session-diff__file" data-status=${n.status}>
|
||
<div class="session-diff__file-header">
|
||
<button
|
||
class="session-diff__file-toggle"
|
||
type="button"
|
||
aria-expanded=${String(!r)}
|
||
title=${s}
|
||
@click=${()=>this.toggleFile(n.path)}
|
||
>
|
||
<span class="session-diff__chevron ${r?``:`session-diff__chevron--open`}">
|
||
${q.chevronRight}
|
||
</span>
|
||
<span
|
||
class="session-diff__status session-diff__status--${n.status}"
|
||
title=${Ug(n)}
|
||
>${Wg(n)}</span
|
||
>
|
||
<span class="session-diff__path">
|
||
${n.oldPath?z`<span class="session-diff__old-path">${n.oldPath} →</span>`:R}
|
||
<span class="session-diff__filename">${a}</span>
|
||
${i?z`<span class="session-diff__directory">${i}</span>`:R}
|
||
</span>
|
||
${n.untracked===!0?z`<span class="session-diff__badge">${Y(`chat.sessionDiff.untracked`)}</span>`:R}
|
||
${ip(Gg(n))}
|
||
</button>
|
||
<button
|
||
class="btn btn--ghost btn--icon session-diff__file-menu"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.fileActions`,{path:n.path})}
|
||
@click=${e=>this.openAnchoredMenu(e,{kind:`file`,path:n.path,...o?{absolutePath:o}:{},canOpenFile:!!this.openFile,canReveal:!!this.revealFile})}
|
||
>
|
||
${q.moreHorizontal}
|
||
</button>
|
||
</div>
|
||
${r?R:z`<div
|
||
class="session-diff__file-body"
|
||
style=${`contain-intrinsic-size:auto ${Math.max(80,Math.min(12e3,(e.parsed?.lines.length??2)*19))}px`}
|
||
>
|
||
${this.renderFileBody(e)}
|
||
</div>`}
|
||
</section>
|
||
`}scopeTitle(e){let t=this.scope;if(t.scope===`uncommitted`)return Y(`chat.sessionDiff.uncommitted`);if(t.scope===`commit`){let n=e.commits?.find(e=>e.sha===t.commit);return n?`${n.sha} ${n.subject}`:t.commit}return Y(`chat.sessionDiff.allChanges`)}renderFooter(e){let t=e.branch??e.baseRef??Y(`chat.sessionDiff.allChanges`),n=e.aheadCount&&e.baseRef?Y(`chat.sessionDiff.commitsAhead`,{count:String(e.aheadCount),base:e.baseRef}):t;return z`<button
|
||
class="session-diff__footer"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.scopeMenu`)}
|
||
@click=${t=>this.openAnchoredMenu(t,{kind:`scope`,active:this.scope,result:e},`top-start`)}
|
||
>
|
||
<span>${n}</span>${q.chevronUp}
|
||
</button>`}renderBody(){if(this.diffTask.status===Xn.ERROR){let e=this.diffTask.error;return z`<div class="callout danger">${Ee(e)}</div>`}if(this.loading)return hr(`review`,Y(`chat.sessionDiff.loading`));let e=this.diffTask.value;if(!e)return R;let{result:t,views:n}=e;return t.unavailableReason===`not_git`?z`<div class="session-diff__note">${Y(`chat.sessionDiff.notGit`)}</div>`:t.unavailableReason===`unknown_session`?z`<div class="session-diff__note">${Y(`chat.sessionDiff.unknownSession`)}</div>`:z`
|
||
${this.renderSummary(t)}
|
||
<button
|
||
class="session-diff__section-title"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.scopeMenu`)}
|
||
@click=${e=>this.openAnchoredMenu(e,{kind:`scope`,active:this.scope,result:t},`bottom-start`)}
|
||
>
|
||
<span>${this.scopeTitle(t)}</span>${q.chevronDown}
|
||
</button>
|
||
<div class="session-diff__files">
|
||
${t.unavailableReason===`unknown_commit`?z`<div class="session-diff__note">${Y(`chat.sessionDiff.unknownCommit`)}</div>`:t.files.length===0?z`<div class="session-diff__note">${Y(`chat.sessionDiff.empty`)}</div>`:n.map(e=>this.renderFile(e,t))}
|
||
${t.truncated===!0?z`<div class="session-diff__note">${Y(`chat.sessionDiff.truncatedResult`)}</div>`:R}
|
||
</div>
|
||
${this.renderFooter(t)}
|
||
`}render(){return z`
|
||
<div
|
||
class="session-diff ${this.wrap?`session-diff--wrap`:``}"
|
||
aria-busy=${String(this.loading)}
|
||
>
|
||
${this.renderBody()}
|
||
${this.menu?wt(this.menu,z`<openclaw-session-diff-menu
|
||
.menu=${this.menu}
|
||
.onAction=${e=>this.handleMenuAction(e)}
|
||
.onClose=${()=>{this.menu=null}}
|
||
></openclaw-session-diff-menu>`):R}
|
||
</div>
|
||
`}},h([H({attribute:!1})],Qg.prototype,`execNode`,void 0),h([H({attribute:!1})],Qg.prototype,`loader`,void 0),h([H({attribute:!1})],Qg.prototype,`loadFileText`,void 0),h([H({attribute:!1})],Qg.prototype,`openFile`,void 0),h([H({attribute:!1})],Qg.prototype,`revealFile`,void 0),h([W()],Qg.prototype,`collapsedPaths`,void 0),h([W()],Qg.prototype,`menu`,void 0),h([W()],Qg.prototype,`scope`,void 0),h([W()],Qg.prototype,`split`,void 0),h([W()],Qg.prototype,`wrap`,void 0),customElements.get(`openclaw-session-diff`)||customElements.define(`openclaw-session-diff`,Qg)})))()}function e_(e){try{let t=new URL(e,window.location.href);return(t.protocol===`http:`||t.protocol===`https:`)&&t.origin!==location.origin}catch{return!1}}function t_(e,t,n){let r=e.resolveSource?.(t,n),i=e.resolveSource?r:e,a=i?.src??``,o=e.attachmentKind===`audio`||e.attachmentKind===`video`||e.mimeType?.toLowerCase().startsWith(`audio/`)||e.mimeType?.toLowerCase().startsWith(`video/`)?Mu(a):ju(a),s=e.resolveSource?r?.authToken??null:e.authToken??null,c=e.mimeType?.split(`;`,1)[0]?.trim().toLowerCase()??``;return o?e.attachmentKind===`video`||c.startsWith(`video/`)?z`<openclaw-chat-video-player
|
||
.src=${o}
|
||
.sourceIdentity=${e.sourceIdentity??e.src??o}
|
||
.label=${e.title}
|
||
.mimeType=${e.mimeType??``}
|
||
.playback=${i?.playback??e.playback??`native`}
|
||
.authToken=${s}
|
||
.sizeBytes=${i?.sizeBytes??e.sizeBytes}
|
||
.mediaWidth=${i?.width??e.width}
|
||
.mediaHeight=${i?.height??e.height}
|
||
></openclaw-chat-video-player>`:e.attachmentKind===`audio`||c.startsWith(`audio/`)?z`<openclaw-chat-audio-player
|
||
.src=${o}
|
||
.sourceIdentity=${e.sourceIdentity??e.src??o}
|
||
.label=${e.title}
|
||
.mimeType=${e.mimeType??``}
|
||
.playback=${i?.playback??e.playback??`native`}
|
||
.authToken=${s}
|
||
.sizeBytes=${i?.sizeBytes??e.sizeBytes}
|
||
.serverDurationMs=${i?.durationMs??e.durationMs}
|
||
.voiceNote=${e.voiceNote===!0}
|
||
></openclaw-chat-audio-player>`:!((c===`image/svg+xml`||(!c||c===`application/octet-stream`)&&(kl(e.sourceIdentity??``,void 0)||kl(o,void 0)||kl(e.title,void 0)))&&e_(o))&&(e.attachmentKind===`image`||c.startsWith(`image/`))?z`<img class="sidebar-attachment-preview__image" src=${o} alt=${e.title} />`:wu({kind:e.attachmentKind??`document`,label:e.title,mimeType:e.mimeType??void 0,sizeBytes:i?.sizeBytes??e.sizeBytes,downloadHref:o}):z`<div class="sidebar-attachment-preview__unavailable">
|
||
${Y(`chat.attachments.previewUnavailable`)}
|
||
</div>`}function n_(e,t=``){return`${t?`\`\`\`${t}`:"```"}\n${e}\n\`\`\``}function r_(e){if(!e)return null;if(e.kind===`markdown`){let t=e.rawText??e.content;return{kind:`markdown`,content:n_(t),rawText:t}}if(e.kind===`file`){let t=e.rawText??e.content;return{kind:`markdown`,content:n_(t,e.language),rawText:t}}return e.rawText?.trim()?{kind:`markdown`,content:n_(e.rawText,`json`),rawText:e.rawText}:null}function i_(e,t){return e.kind===`canvas`?ar(t,e.sandbox):`allow-scripts`}function a_(e){let t=e.content,n=t?.kind===`markdown`&&t.content.trim()?Da(t.content,{codeBlockInteraction:`interactive`,fileLinks:!0,interactiveImages:e.onOpenImage!==void 0,sessionLinks:!0}):``,r=t?.kind===`canvas`?i_(t,e.embedSandboxMode??`scripts`):``,i=t?.kind===`canvas`?Xa(t.entryUrl,e.canvasPluginSurfaceUrl,e.allowExternalEmbedUrls??!1):null,a=t?.kind===`canvas`?t.title?.trim()||Y(`chat.detailPanel.renderPreview`):t?.kind===`image`?t.title.trim()||Y(`chat.detailPanel.imagePreview`):t?.kind===`attachment`?t.title.trim()||Y(`chat.detailPanel.file`):t?.kind===`file`?t.name.trim()||Y(`chat.detailPanel.file`):t?.kind===`session-diff`?Y(`chat.sessionDiff.title`):t?.kind===`markdown`?Y(`chat.detailPanel.markdownPreview`):Y(`chat.detailPanel.toolDetails`);return z`
|
||
<div class="sidebar-panel">
|
||
${e.embedded?R:z`<div class="sidebar-header">
|
||
<div class="sidebar-title">${a}</div>
|
||
<div class="sidebar-header__actions">
|
||
<openclaw-tooltip .content=${Y(`chat.detailPanel.close`)}>
|
||
<button
|
||
@click=${e.onClose}
|
||
class="btn"
|
||
type="button"
|
||
aria-label=${Y(`chat.detailPanel.close`)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</div>
|
||
</div> `}
|
||
<div class="sidebar-content">
|
||
${e.error?z`
|
||
<div class="callout danger">${e.error}</div>
|
||
${t?.rawText?.trim()?z`
|
||
<button
|
||
@click=${e.onViewRawText}
|
||
class="btn"
|
||
type="button"
|
||
style="margin-top: 12px;"
|
||
>
|
||
${Y(`chat.detailPanel.viewRawText`)}
|
||
</button>
|
||
`:R}
|
||
`:t?t.kind===`file`?Mg(t,e.onViewRawText,e.fileView):t.kind===`session-diff`?z`<openclaw-session-diff
|
||
.loader=${t.load}
|
||
.loadFileText=${t.loadFileText??null}
|
||
.execNode=${e.fileView?.execNode??null}
|
||
.openFile=${t.openFile??null}
|
||
.revealFile=${e.fileView?.onReveal??null}
|
||
></openclaw-session-diff>`:t.kind===`canvas`?z`
|
||
<div class="chat-tool-card__preview" data-kind="canvas">
|
||
<div class="chat-tool-card__preview-panel" data-side="front">
|
||
${wt(`${r}\u0000${i??``}\u0000${t.preferredHeight??``}`,z`
|
||
<iframe
|
||
class="chat-tool-card__preview-frame"
|
||
title=${t.title?.trim()||Y(`chat.detailPanel.renderPreview`)}
|
||
sandbox=${r}
|
||
src=${i??R}
|
||
style=${t.preferredHeight?`height:${t.preferredHeight}px`:``}
|
||
></iframe>
|
||
`)}
|
||
</div>
|
||
${t.rawText?.trim()?z`
|
||
<div style="margin-top: 12px;">
|
||
<button @click=${e.onViewRawText} class="btn" type="button">
|
||
${Y(`chat.detailPanel.viewRawText`)}
|
||
</button>
|
||
</div>
|
||
`:R}
|
||
</div>
|
||
`:t.kind===`image`?z`
|
||
<div class="chat-tool-card__preview" data-kind="image">
|
||
<div class="chat-tool-card__preview-panel" data-side="front">
|
||
<button
|
||
type="button"
|
||
class="chat-tool-card__preview-image-button"
|
||
aria-label=${Y(`chat.imageLightbox.open`,{title:a})}
|
||
@click=${()=>of(e.onOpenImage,t.src,a)}
|
||
>
|
||
<img
|
||
class="chat-tool-card__preview-image"
|
||
src=${t.src}
|
||
alt=${a}
|
||
style="display:block;max-width:100%;height:auto;border-radius:8px;"
|
||
/>
|
||
</button>
|
||
</div>
|
||
${t.rawText?.trim()?z`
|
||
<div style="margin-top: 12px;">
|
||
<button @click=${e.onViewRawText} class="btn" type="button">
|
||
${Y(`chat.detailPanel.viewRawText`)}
|
||
</button>
|
||
</div>
|
||
`:R}
|
||
</div>
|
||
`:t.kind===`attachment`?z`<div class="sidebar-attachment-preview">
|
||
${t_(t,e.onAttachmentUpdate,e.attachmentRuntime)}
|
||
</div>`:z`
|
||
<section class="sidebar-markdown-shell">
|
||
<div class="sidebar-markdown-shell__toolbar">
|
||
<div class="sidebar-markdown-shell__intro">
|
||
<div class="sidebar-markdown-shell__eyebrow">
|
||
${q.scrollText}
|
||
<span>${Y(`chat.detailPanel.renderedMarkdown`)}</span>
|
||
</div>
|
||
<div class="sidebar-markdown-shell__hint">
|
||
${Y(`chat.detailPanel.renderedMarkdownHint`)}
|
||
</div>
|
||
</div>
|
||
<button
|
||
@click=${e.onViewRawText}
|
||
class="btn btn--sm"
|
||
type="button"
|
||
>
|
||
${Y(`chat.detailPanel.viewRawText`)}
|
||
</button>
|
||
</div>
|
||
${n?z`
|
||
<article
|
||
class="sidebar-markdown-reader sidebar-markdown"
|
||
dir=${oa(t.content)}
|
||
>
|
||
${gt(n)}
|
||
</article>
|
||
`:z`
|
||
<div class="sidebar-markdown-empty">
|
||
${Y(`chat.detailPanel.noPreviewableMarkdown`)}
|
||
</div>
|
||
`}
|
||
</section>
|
||
`:z` <div class="muted">${Y(`chat.detailPanel.noContent`)}</div> `}
|
||
</div>
|
||
</div>
|
||
`}function o_(e){let t=e.content?.kind===`file`||e.content?.kind===`markdown`||e.content?.kind===`attachment`||e.content?.kind===`session-diff`;return z`
|
||
<div
|
||
class=${t?`sidebar-panel-host--fill`:``}
|
||
${U(e=>{e instanceof HTMLElement&&_a(e)})}
|
||
@click=${e.onClick}
|
||
@keydown=${e.onKeydown}
|
||
>
|
||
${a_(e)}
|
||
</div>
|
||
`}function s_(e,t){if(xg(e,t.onOpenImage??void 0))return;Ma(e);let n=ro(e);if(n){t.onOpenWorkspaceFile?.(n);return}let r=Sa(e)??Oo(e,Jt,t.basePath);r&&I(e)&&(e.preventDefault(),t.onOpenSessionLink?.(r))}function c_(e,t){let n=Fa(e);if(n){t.onOpenWorkspaceFile?.(n);return}let r=$a(e)??(e.key===`Enter`?Oo(e,Jt,t.basePath):null);r&&(e.preventDefault(),t.onOpenSessionLink?.(r))}function l_(){return(l_=e((()=>{B(),rt(),V(),yt(),Ot(),J(),Ko(),go(),fo(),er(),G(),K(),mr(),_i(),Au(),Fu(),Cg(),Pd(),Vd(),sf(),Yl(),Fg(),$g()})))()}var Z;function u_(){return(u_=e((()=>{ut(),Pr(),K(),da(),Fe(),Pe(),Yl(),l_(),Fg(),u(),Z=class extends we{constructor(){super(),this.content=null,this.execNode=null,this.attachmentRuntime={localMediaPreviewRoots:[]},this.basePath=``,this.canvasPluginSurfaceUrl=null,this.embedSandboxMode=`scripts`,this.allowExternalEmbedUrls=!1,this.embedded=!1,this.onOpenWorkspaceFile=null,this.onOpenSessionLink=null,this.onRevealInWorkspace=null,this.onOpenImage=null,this.visibleContent=null,this.error=null,this.fileSearchOpen=!1,this.fileSearchQuery=``,this.fileSearchMatchIndex=0,this.fileEditorMenuOpen=!1,this.fileCopyFeedback=Pg,this.fileEditorLoading=!1,this.fileEditing=!1,this.fileDirty=!1,this.fileReloading=!1,this.fileSaving=!1,this.fileSaveNotice=null,this.fileOperationVersion=0,this.showingRawText=!1,this.fileEditor=null,this.fileEditorLoad=null,this.fileDraftContent=null,this.fileSavedContent=``,this.fileHash=``,this.copyAttempts=new Map,this.copyFeedbackTimers=new Map,this.requestAttachmentUpdate=()=>this.requestUpdate(),this.handleDocumentPointerDown=e=>{if(!this.fileEditorMenuOpen)return;let t=this.querySelector(`.sidebar-file-view__editor`);(!t||!e.composedPath().includes(t))&&(this.fileEditorMenuOpen=!1)},this.toggleFileSearch=()=>{if(this.fileSearchOpen=!this.fileSearchOpen,this.fileEditorMenuOpen=!1,!this.fileSearchOpen){this.fileSearchQuery=``,this.fileSearchMatchIndex=0;return}this.updateComplete.then(()=>{this.querySelector(`.file-view__search input`)?.focus()})},this.updateFileSearch=e=>{this.fileSearchQuery=e,this.fileSearchMatchIndex=0,this.scrollToCurrentFileMatch()},this.handleFileSearchKeydown=e=>{if(e.key===`Escape`){e.preventDefault(),e.stopPropagation(),this.fileSearchOpen=!1,this.fileSearchQuery=``,this.fileSearchMatchIndex=0;return}e.key===`Enter`&&(e.preventDefault(),this.moveFileSearch(e.shiftKey?-1:1))},this.openInEditor=e=>{let t=this.visibleContent;if(t?.kind!==`file`)return;let n=qi(t,this.execNode);n&&(this.fileEditorMenuOpen=!1,zo(e,n,t.line))},this.copyFileValue=e=>{let t=this.visibleContent;if(t?.kind!==`file`)return;let n=(this.copyAttempts.get(e)??0)+1;this.copyAttempts.set(e,n),Me(e===`path`?t.path:t.content).then(r=>{this.copyAttempts.get(e)!==n||this.visibleContent!==t||!this.isConnected||(this.fileCopyFeedback={...this.fileCopyFeedback,[e]:r?`copied`:`failed`},globalThis.clearTimeout(this.copyFeedbackTimers.get(e)),this.copyFeedbackTimers.set(e,globalThis.setTimeout(()=>{this.copyFeedbackTimers.delete(e),this.fileCopyFeedback={...this.fileCopyFeedback,[e]:void 0}},r?1500:2e3)))})},this.editFile=()=>{let e=this.visibleContent;e?.kind!==`file`||!e.edit||!this.fileEditor||(this.fileSavedContent=e.content,this.fileHash=e.edit.hash,this.fileDirty=!1,this.fileSaveNotice=null,this.fileSearchOpen=!1,this.fileSearchQuery=``,this.fileSearchMatchIndex=0,this.fileEditorMenuOpen=!1,this.fileEditing=!0,this.fileEditor.setEditable(!0),this.updateComplete.then(()=>this.fileEditor?.focus()))},this.discardFileEdits=()=>{if(!this.fileEditing||this.fileSaving)return;this.fileEditor?.setContent(this.fileSavedContent);let e=this.visibleContent;e?.kind===`file`&&(Og(e,null),this.fileHash=e.edit?.hash??``),this.fileDirty=!1,this.fileSaveNotice=null,this.fileEditing=!1,this.fileEditor?.setEditable(!1)},this.saveFile=()=>{let e=this.visibleContent,t=this.fileEditor;if(e?.kind!==`file`||!e.edit||!t||!this.fileEditing||!this.fileDirty||this.fileSaving)return;let n=this.fileOperationVersion;this.fileSaving=!0,this.fileSaveNotice=null,this.saveFileContent(e,t.getContent(),this.fileHash,n).catch(e=>{n===this.fileOperationVersion&&(this.fileSaveNotice={kind:`error`,message:Ee(e)})}).finally(()=>{n===this.fileOperationVersion&&(this.fileSaving=!1)})},this.reloadFile=()=>{let e=this.visibleContent,t=this.fileEditor;if(e?.kind!==`file`||!e.edit||!t||this.fileSaving)return;let n=this.fileOperationVersion;this.fileSaving=!0,this.fileReloading=!0,t.setEditable(!1),e.edit.fetchLatest().then(e=>{if(n===this.fileOperationVersion&&this.visibleContent?.kind===`file`){if(!e){this.fileSaveNotice={kind:`error`,message:Y(`chat.detailPanel.reloadFailed`)};return}if(this.fileEditor?.setContent(e.content),this.updateSavedFile(this.visibleContent,e.content,e.hash),!e.editable&&this.visibleContent?.kind===`file`){this.fileEditing=!1,this.fileDirty=!1;let{edit:e,...t}=this.visibleContent;this.visibleContent=t}}}).catch(e=>{n===this.fileOperationVersion&&(this.fileSaveNotice={kind:`error`,message:Ee(e)})}).finally(()=>{n===this.fileOperationVersion&&(this.fileReloading=!1,this.fileSaving=!1,this.fileEditor?.setEditable(this.fileEditing))})},this.overwriteFile=()=>{let e=this.visibleContent,t=this.fileEditor;if(e?.kind!==`file`||!e.edit||!t||this.fileSaving)return;let n=this.fileOperationVersion,r=t.getContent();this.fileSaving=!0,e.edit.fetchLatest().then(async t=>{if(n===this.fileOperationVersion){if(!t){this.fileSaveNotice={kind:`error`,message:Y(`chat.detailPanel.overwriteLoadFailed`)};return}await this.saveFileContent(e,r,t.hash,n)}}).catch(e=>{n===this.fileOperationVersion&&(this.fileSaveNotice={kind:`error`,message:Ee(e)})}).finally(()=>{n===this.fileOperationVersion&&(this.fileSaving=!1)})},this.close=()=>{this.dispatchEvent(new CustomEvent(`chat-detail-panel-close`,{bubbles:!0}))},this.showRawText=()=>{let e=r_(this.visibleContent);e&&(this.showingRawText=!0,this.visibleContent=e,this.error=null)},this.handlePanelClick=e=>{s_(e,this)},this.handlePanelKeyDown=e=>{c_(e,this)},Dr(this)}connectedCallback(){super.connectedCallback(),this.fileCopyFeedback=Pg,document.addEventListener(`pointerdown`,this.handleDocumentPointerDown)}disconnectedCallback(){document.removeEventListener(`pointerdown`,this.handleDocumentPointerDown),this.destroyFileEditor(),this.clearFileCopyFeedback(),bl(this.requestAttachmentUpdate),super.disconnectedCallback()}willUpdate(e){let t=e.get(`attachmentRuntime`);if(t&&typeof t==`object`&&`connectionEpoch`in t&&t.connectionEpoch!==this.attachmentRuntime.connectionEpoch&&bl(this.requestAttachmentUpdate),!e.has(`content`))return;bl(this.requestAttachmentUpdate),this.visibleContent=this.content,this.error=null,this.showingRawText=!1,this.fileSearchOpen=!1,this.fileSearchQuery=``,this.fileSearchMatchIndex=0,this.fileEditorMenuOpen=!1,this.clearFileCopyFeedback(),this.fileCopyFeedback=Pg,this.fileOperationVersion+=1,this.fileEditing=!1,this.fileDirty=!1,this.fileReloading=!1,this.fileSaving=!1,this.fileSaveNotice=null;let n=this.content?.kind===`file`&&this.content.edit?Dg(this.content):void 0,r=this.content?.kind===`file`&&n?.content!==this.content.content?n:void 0;n&&!r&&this.content?.kind===`file`&&Og(this.content,null),this.fileDraftContent=r?.content??null,this.fileSavedContent=this.content?.kind===`file`?this.content.content:``,this.fileHash=r?.expectedHash??(this.content?.kind===`file`?this.content.edit?.hash??``:``),this.fileEditing=!!r,this.fileDirty=!!r,this.fileEditorLoading=this.content?.kind===`file`,this.destroyFileEditor()}clearFileCopyFeedback(){for(let e of this.copyFeedbackTimers.values())globalThis.clearTimeout(e);this.copyFeedbackTimers.clear();for(let[e,t]of this.copyAttempts)this.copyAttempts.set(e,t+1)}updated(e){let t=this.visibleContent;t?.kind===`file`&&!this.showingRawText&&this.ensureFileEditor().then(()=>{this.syncFileEditor(),e.has(`content`)&&t.line!=null&&this.scrollToFileLine(t)})}scrollToFileLine(e){this.visibleContent!==e||this.showingRawText||e.line!=null&&this.fileEditor?.scrollToLine(e.line,!0)}destroyFileEditor(){this.fileOperationVersion+=1,this.fileEditor?.destroy(),this.fileEditor=null,this.fileEditorLoad=null}ensureFileEditor(){if(this.fileEditor)return Promise.resolve();if(this.fileEditorLoad)return this.fileEditorLoad;let e=this.visibleContent,t=this.querySelector(`.file-view__mount`);if(e?.kind!==`file`||!t)return Promise.resolve();let n=this.fileOperationVersion;return this.fileEditorLoading=!0,this.fileEditorLoad=c(async()=>{let{createFileEditorView:e}=await import(`./file-editor-view-DCKb7O64.js`);return{createFileEditorView:e}},__vite__mapDeps([29,2,26,27,3,4,5,6,7,8,9]),import.meta.url).then(async({createFileEditorView:e})=>{let r=this.visibleContent;if(n!==this.fileOperationVersion||r?.kind!==`file`)return;let i=await e({parent:t,content:this.fileDraftContent??r.content,name:r.name,editable:this.fileEditing,onSave:this.saveFile});if(n!==this.fileOperationVersion||!this.isConnected||this.visibleContent?.kind!==`file`){i.destroy();return}this.fileEditor=i,this.fileDraftContent=null,i.onDocChanged(e=>{let t=e!==this.fileSavedContent;t!==this.fileDirty&&(this.fileDirty=t),!t&&this.visibleContent?.kind===`file`&&(this.fileHash=this.visibleContent.edit?.hash??``),Og(r,t?{content:e,expectedHash:this.fileHash}:null),this.fileSaveNotice?.kind===`error`&&(this.fileSaveNotice=null)})}).finally(()=>{n===this.fileOperationVersion&&(this.fileEditorLoad=null,this.fileEditorLoading=!1)}),this.fileEditorLoad}syncFileEditor(){let e=this.visibleContent,t=this.fileEditor;if(e?.kind!==`file`||!t)return;this.fileEditing||t.setContent(e.content),t.setEditable(this.fileEditing&&!this.fileReloading);let n=this.fileSearchMatches();t.setDecorations({targetLine:e.line,matches:n,currentMatch:n[this.fileSearchMatchIndex]??null})}fileSearchMatches(){let e=this.visibleContent;return e?.kind===`file`?Ag(e.content,this.fileSearchQuery):[]}async scrollToCurrentFileMatch(){await this.updateComplete;let e=this.fileSearchMatches()[this.fileSearchMatchIndex];e!=null&&this.fileEditor?.scrollToLine(e,!0)}moveFileSearch(e){let t=this.fileSearchMatches();t.length!==0&&(this.fileSearchMatchIndex=(this.fileSearchMatchIndex+e+t.length)%t.length,this.scrollToCurrentFileMatch())}updateSavedFile(e,t,n){this.fileSavedContent=t,this.fileHash=n,this.fileDirty=this.fileEditor?.getContent()!==t;let r=this.fileEditor?.getContent();Og(e,this.fileDirty&&r!=null?{content:r,expectedHash:n}:null),this.fileSaveNotice=null,this.visibleContent={...e,content:t,rawText:t,...e.edit?{edit:{...e.edit,hash:n}}:{}}}async saveFileContent(e,t,n,r){if(!e.edit)return;let i=await e.edit.save({content:t,expectedHash:n});r===this.fileOperationVersion&&this.visibleContent?.kind===`file`&&(i.ok?this.updateSavedFile(this.visibleContent,t,i.hash):this.fileSaveNotice=i.code===`conflict`?{kind:`conflict`}:{kind:`error`,message:i.message})}render(){let e=this.fileSearchMatches(),t=e.length?Math.min(this.fileSearchMatchIndex,e.length-1):0;return o_({content:this.visibleContent,error:this.error,fileView:{copyFeedback:this.fileCopyFeedback,currentMatchIndex:t,dirty:this.fileDirty,execNode:this.execNode,editorMenuOpen:this.fileEditorMenuOpen,editing:this.fileEditing,loadingEditor:this.fileEditorLoading,mountKey:this.fileOperationVersion,matches:e,query:this.fileSearchQuery,saveNotice:this.fileSaveNotice,saving:this.fileSaving,searchOpen:this.fileSearchOpen,onCopy:this.copyFileValue,onDiscard:this.discardFileEdits,onEdit:this.editFile,onNextMatch:()=>this.moveFileSearch(1),onOpenEditor:this.openInEditor,onOverwrite:this.overwriteFile,onPreviousMatch:()=>this.moveFileSearch(-1),onReload:this.reloadFile,onReveal:this.onRevealInWorkspace??void 0,onSave:this.saveFile,onSearchInput:this.updateFileSearch,onSearchKeydown:this.handleFileSearchKeydown,onEditorMenuOpenChange:e=>{this.fileEditorMenuOpen=e},onToggleSearch:this.toggleFileSearch},canvasPluginSurfaceUrl:this.canvasPluginSurfaceUrl,embedSandboxMode:this.embedSandboxMode,allowExternalEmbedUrls:this.allowExternalEmbedUrls,embedded:this.embedded,onClose:this.close,onOpenImage:this.onOpenImage??void 0,onViewRawText:this.showRawText,onClick:this.handlePanelClick,onKeydown:this.handlePanelKeyDown,onAttachmentUpdate:this.requestAttachmentUpdate,attachmentRuntime:this.attachmentRuntime})}},h([H({attribute:!1})],Z.prototype,`content`,void 0),h([H({attribute:!1})],Z.prototype,`execNode`,void 0),h([H({attribute:!1})],Z.prototype,`attachmentRuntime`,void 0),h([H()],Z.prototype,`basePath`,void 0),h([H()],Z.prototype,`canvasPluginSurfaceUrl`,void 0),h([H()],Z.prototype,`embedSandboxMode`,void 0),h([H({type:Boolean})],Z.prototype,`allowExternalEmbedUrls`,void 0),h([H({type:Boolean})],Z.prototype,`embedded`,void 0),h([H({attribute:!1})],Z.prototype,`onOpenWorkspaceFile`,void 0),h([H({attribute:!1})],Z.prototype,`onOpenSessionLink`,void 0),h([H({attribute:!1})],Z.prototype,`onRevealInWorkspace`,void 0),h([H({attribute:!1})],Z.prototype,`onOpenImage`,void 0),h([W()],Z.prototype,`visibleContent`,void 0),h([W()],Z.prototype,`error`,void 0),h([W()],Z.prototype,`fileSearchOpen`,void 0),h([W()],Z.prototype,`fileSearchQuery`,void 0),h([W()],Z.prototype,`fileSearchMatchIndex`,void 0),h([W()],Z.prototype,`fileEditorMenuOpen`,void 0),h([W()],Z.prototype,`fileCopyFeedback`,void 0),h([W()],Z.prototype,`fileEditorLoading`,void 0),h([W()],Z.prototype,`fileEditing`,void 0),h([W()],Z.prototype,`fileDirty`,void 0),h([W()],Z.prototype,`fileReloading`,void 0),h([W()],Z.prototype,`fileSaving`,void 0),h([W()],Z.prototype,`fileSaveNotice`,void 0),customElements.get(`openclaw-chat-detail-panel`)||customElements.define(`openclaw-chat-detail-panel`,Z)})))()}function d_(){return(d_=e((()=>{u_(),Fg()})))()}function f_(e){let t=e.size;return typeof t!=`number`||!Number.isFinite(t)||t<0?``:n(t,{style:`legacy-binary`,maxUnit:`mega`,separator:` `,fractionDigits:(e,t)=>t===`byte`?null:Math.round(e*10)%10?1:0})}function p_(e){return f_({size:e.sizeBytes})}function m_(e,t){return t===R?R:z`
|
||
<section class="chat-workspace-rail__section">
|
||
<div class="chat-workspace-rail__section-title">${e}</div>
|
||
${t}
|
||
</section>
|
||
`}function h_(e,t={}){if(!e||e.collapsed&&!t.embedded)return R;let n=e.narrowLayout?`bottom`:e.dock,r=e.onToggleTerminal?z`
|
||
<openclaw-tooltip .content=${Y(`terminal.toggle`)}>
|
||
<button
|
||
type="button"
|
||
class="rail-header__action chat-workspace-rail__terminal"
|
||
aria-label=${Y(`terminal.toggle`)}
|
||
@click=${e.onToggleTerminal}
|
||
>
|
||
${q.terminal}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R,i=e.onToggleBrowser?z`
|
||
<openclaw-tooltip .content=${Y(`browser.toggle`)}>
|
||
<button
|
||
type="button"
|
||
class="rail-header__action chat-workspace-rail__terminal"
|
||
aria-label=${Y(`browser.toggle`)}
|
||
@click=${e.onToggleBrowser}
|
||
>
|
||
${q.globe}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R,a=e.onToggleCustodian?z`
|
||
<openclaw-tooltip .content=${Y(`custodian.panel.toggle`)}>
|
||
<button
|
||
type="button"
|
||
class="rail-header__action chat-workspace-rail__terminal"
|
||
aria-label=${Y(`custodian.panel.toggle`)}
|
||
@click=${e.onToggleCustodian}
|
||
>
|
||
${q.lobster}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R,o=e.onOpenDiff?z`
|
||
<openclaw-tooltip .content=${Y(`chat.sessionDiff.show`)}>
|
||
<button
|
||
type="button"
|
||
class="rail-header__action chat-workspace-rail__terminal chat-session-diff-toggle"
|
||
aria-label=${Y(`chat.sessionDiff.show`)}
|
||
@click=${e.onOpenDiff}
|
||
>
|
||
${q.diff}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R,s=e.list?.files??[],c=s.filter(e=>e.kind===`modified`),l=s.filter(e=>e.kind===`read`),u=e.list?.artifacts??[],d=e.list?.browser??null,f=s.length>0||u.length>0,p=(d?.entries.length??0)>0,m=f||p,h=(t,n)=>z`
|
||
<span
|
||
class="chat-workspace-rail__row-actions"
|
||
role="group"
|
||
aria-label=${Y(`chat.workspaceFiles.actions`)}
|
||
>
|
||
<openclaw-tooltip .content=${Y(`chat.workspaceFiles.preview`)}>
|
||
<button
|
||
class="chat-workspace-rail__row-action"
|
||
type="button"
|
||
aria-label=${Y(`chat.workspaceFiles.preview`)}
|
||
@click=${r=>{r.stopPropagation(),e.onOpenFile(t,n)}}
|
||
>
|
||
${q.eye}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
<span @click=${e=>e.stopPropagation()}>
|
||
${Tn(t,Y(`chat.workspaceFiles.copyPath`))}
|
||
</span>
|
||
</span>
|
||
`,g=()=>{if(!e.list)return R;let t=d?.entries.length??0;return z`
|
||
<div class="chat-workspace-rail__summary" aria-label=${Y(`chat.workspaceFiles.summary`)}>
|
||
<span
|
||
>${Y(`chat.workspaceFiles.changedCount`,{count:String(c.length)})}</span
|
||
>
|
||
<span>${Y(`chat.workspaceFiles.readCount`,{count:String(l.length)})}</span>
|
||
<span>${Y(`chat.workspaceFiles.artifactCount`,{count:String(u.length)})}</span>
|
||
<span>${Y(`chat.workspaceFiles.browserCount`,{count:String(t)})}</span>
|
||
</div>
|
||
`},_=t=>t.length===0?R:z`
|
||
<div class="chat-workspace-rail__list" role="list">
|
||
${t.map(t=>{let n=f_(t),r=`file:${t.path}`===e.activeId;return z`
|
||
<div
|
||
class="chat-workspace-rail__file ${r?`chat-workspace-rail__file--active`:``}"
|
||
role="listitem"
|
||
>
|
||
<button
|
||
class="chat-workspace-rail__file-open"
|
||
type="button"
|
||
@click=${()=>e.onOpenFile(t.path,`session`)}
|
||
>
|
||
<span class="chat-workspace-rail__file-icon">${q.fileText}</span>
|
||
<span class="chat-workspace-rail__file-main">
|
||
<openclaw-tooltip .content=${t.path||t.name}>
|
||
<span class="chat-workspace-rail__file-name"
|
||
>${t.path||t.name}</span
|
||
>
|
||
</openclaw-tooltip>
|
||
${n?z`<span class="chat-workspace-rail__file-meta">${n}</span>`:R}
|
||
</span>
|
||
</button>
|
||
${t.missing?z`<span class="chat-workspace-rail__file-badge"
|
||
>${Y(`chat.workspaceFiles.missing`)}</span
|
||
>`:R}
|
||
${h(t.path,`session`)}
|
||
</div>
|
||
`})}
|
||
</div>
|
||
`,v=e=>{if(!e)return R;let t=Y(e===`modified`?`chat.workspaceFiles.changed`:e===`read`?`chat.workspaceFiles.read`:`chat.workspaceFiles.session`);return z`<span class="chat-workspace-rail__file-badge">${t}</span>`};return z`
|
||
<aside class="chat-workspace-rail" aria-label=${Y(`chat.workspaceFiles.label`)}>
|
||
${t.embedded?R:z`<div class="rail-header chat-workspace-rail__header">
|
||
<div class="rail-header__copy chat-workspace-rail__title">
|
||
<span class="rail-header__eyebrow chat-workspace-rail__eyebrow"
|
||
>${Y(`chat.workspaceFiles.workspace`)}</span
|
||
>
|
||
<strong class="rail-header__title">${Y(`chat.workspaceFiles.files`)}</strong>
|
||
</div>
|
||
<div class="rail-header__actions chat-workspace-rail__actions">
|
||
${o} ${r} ${i} ${a}
|
||
${e.narrowLayout?R:z`
|
||
<openclaw-tooltip
|
||
.content=${Y(n===`bottom`?`chat.workspaceFiles.dockRight`:`chat.workspaceFiles.dockBottom`)}
|
||
>
|
||
<button
|
||
class="rail-header__action chat-workspace-rail__dock"
|
||
type="button"
|
||
aria-label=${Y(n===`bottom`?`chat.workspaceFiles.dockRight`:`chat.workspaceFiles.dockBottom`)}
|
||
@click=${()=>e.onSetDock(n===`bottom`?`right`:`bottom`)}
|
||
>
|
||
${n===`bottom`?q.panelRightOpen:q.panelBottomOpen}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`}
|
||
<openclaw-tooltip .content=${Y(`chat.workspaceFiles.refresh`)}>
|
||
<button
|
||
class="rail-header__action chat-workspace-rail__refresh"
|
||
type="button"
|
||
aria-label=${Y(`chat.workspaceFiles.refresh`)}
|
||
?disabled=${e.loading}
|
||
@click=${e.onRefresh}
|
||
>
|
||
${q.refresh}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
<openclaw-tooltip
|
||
.content=${`${Y(`chat.workspaceFiles.collapse`)} (${ee(pe.workspaceFiles)})`}
|
||
>
|
||
<button
|
||
type="button"
|
||
class="rail-header__action chat-workspace-rail__collapse-toggle"
|
||
aria-label=${Y(`chat.workspaceFiles.collapse`)}
|
||
aria-keyshortcuts=${ne()?`Meta+Shift+B`:`Control+Shift+B`}
|
||
aria-expanded="true"
|
||
@click=${e.onToggleCollapsed}
|
||
>
|
||
<span class="nav-collapse-toggle__icon" aria-hidden="true"
|
||
>${n===`bottom`?q.panelBottomClose:q.panelRightClose}</span
|
||
>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</div>
|
||
</div>`}
|
||
${e.list?.root?z`
|
||
<openclaw-tooltip .content=${e.list.root}>
|
||
<div class="chat-workspace-rail__path">${e.list.root}</div>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
${g()}
|
||
${e.error?z`<div class="chat-workspace-rail__state chat-workspace-rail__state--error">
|
||
${e.error}
|
||
</div>`:e.loading&&!m?hr(`files`,Y(`chat.workspaceFiles.loading`)):z`
|
||
<div class="chat-workspace-rail__scroll">
|
||
${f?z`
|
||
${m_(Y(`chat.workspaceFiles.changed`),_(c))}
|
||
${m_(Y(`chat.workspaceFiles.read`),_(l))}
|
||
${m_(Y(`chat.workspaceFiles.artifacts`),u.length===0?R:z`
|
||
<div class="chat-workspace-rail__list" role="list">
|
||
${u.map(t=>{let n=p_(t),r=`artifact:${t.id}`===e.activeId,i=t.mimeType?.startsWith(`image/`);return z`
|
||
<div
|
||
class="chat-workspace-rail__file ${r?`chat-workspace-rail__file--active`:``}"
|
||
role="listitem"
|
||
>
|
||
<button
|
||
class="chat-workspace-rail__file-open"
|
||
type="button"
|
||
@click=${()=>e.onOpenArtifact(t.id)}
|
||
>
|
||
<span class="chat-workspace-rail__file-icon"
|
||
>${i?q.image:q.paperclip}</span
|
||
>
|
||
<span class="chat-workspace-rail__file-main">
|
||
<openclaw-tooltip .content=${t.title}>
|
||
<span class="chat-workspace-rail__file-name">${t.title}</span>
|
||
</openclaw-tooltip>
|
||
${n||t.mimeType?z`<span class="chat-workspace-rail__file-meta"
|
||
>${[t.mimeType,n].filter(Boolean).join(` / `)}</span
|
||
>`:R}
|
||
</span>
|
||
</button>
|
||
<span class="chat-workspace-rail__row-actions">
|
||
<openclaw-tooltip .content=${Y(`chat.workspaceFiles.preview`)}>
|
||
<button
|
||
class="chat-workspace-rail__row-action"
|
||
type="button"
|
||
aria-label=${Y(`chat.workspaceFiles.preview`)}
|
||
@click=${n=>{n.stopPropagation(),e.onOpenArtifact(t.id)}}
|
||
>
|
||
${q.eye}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</span>
|
||
</div>
|
||
`})}
|
||
</div>
|
||
`)}
|
||
`:R}
|
||
${m_(Y(`chat.workspaceFiles.browser`),d?(()=>{let t=d?.entries??[],n=d?.parentPath;return z`
|
||
<section class="chat-workspace-rail__browser">
|
||
<div class="chat-workspace-rail__browser-tools">
|
||
<label class="chat-workspace-rail__search">
|
||
<span class="chat-workspace-rail__search-icon" aria-hidden="true">${q.search}</span>
|
||
<input
|
||
type="search"
|
||
placeholder=${Y(`chat.workspaceFiles.search`)}
|
||
aria-label=${Y(`chat.workspaceFiles.search`)}
|
||
.value=${d?.search??``}
|
||
@input=${t=>{e.onSearch(t.currentTarget.value)}}
|
||
/>
|
||
</label>
|
||
</div>
|
||
${d?.search?z`<div class="chat-workspace-rail__browser-caption">
|
||
${Y(`chat.workspaceFiles.searchResults`)}
|
||
</div>`:R}
|
||
<div class="chat-workspace-rail__list chat-workspace-rail__list--browser" role="list">
|
||
${!d?.search&&n!=null?z`
|
||
<div
|
||
class="chat-workspace-rail__file chat-workspace-rail__file--directory"
|
||
role="listitem"
|
||
>
|
||
<button
|
||
class="chat-workspace-rail__file-open"
|
||
type="button"
|
||
@click=${()=>e.onBrowsePath(n)}
|
||
>
|
||
<span class="chat-workspace-rail__file-icon">${q.folder}</span>
|
||
<span class="chat-workspace-rail__file-main">
|
||
<span class="chat-workspace-rail__file-name">..</span>
|
||
<span class="chat-workspace-rail__file-meta"
|
||
>${Y(`chat.workspaceFiles.parentFolder`)}</span
|
||
>
|
||
</span>
|
||
</button>
|
||
</div>
|
||
`:R}
|
||
${t.length===0?z`<div class="chat-workspace-rail__state">
|
||
${d?.search?Y(`chat.workspaceFiles.noSearchResults`):Y(`chat.workspaceFiles.noBrowserFiles`)}
|
||
</div>`:t.map(t=>{let n=t.kind===`file`?f_(t):``,r=`file:${t.path}`===e.activeId;return z`
|
||
<div
|
||
class="chat-workspace-rail__file ${t.kind===`directory`?`chat-workspace-rail__file--directory`:``} ${r?`chat-workspace-rail__file--active`:``}"
|
||
role="listitem"
|
||
>
|
||
<button
|
||
class="chat-workspace-rail__file-open"
|
||
type="button"
|
||
@click=${()=>t.kind===`directory`?e.onBrowsePath(t.path):e.onOpenFile(t.path,`workspace`)}
|
||
>
|
||
<span class="chat-workspace-rail__file-icon"
|
||
>${t.kind===`directory`?q.folder:q.fileText}</span
|
||
>
|
||
<span class="chat-workspace-rail__file-main">
|
||
<openclaw-tooltip .content=${t.path||t.name}>
|
||
<span class="chat-workspace-rail__file-name">${t.name}</span>
|
||
</openclaw-tooltip>
|
||
<span class="chat-workspace-rail__file-meta">
|
||
${t.kind===`directory`?t.path||Y(`chat.workspaceFiles.root`):[t.path,n].filter(Boolean).join(` / `)}
|
||
</span>
|
||
</span>
|
||
</button>
|
||
${v(t.sessionKind)}
|
||
${t.kind===`file`?h(t.path,`workspace`):R}
|
||
</div>
|
||
`})}
|
||
</div>
|
||
${d?.truncated?z`<div class="chat-workspace-rail__state">
|
||
${Y(`chat.workspaceFiles.truncated`)}
|
||
</div>`:R}
|
||
</section>
|
||
`})():R)}
|
||
</div>
|
||
`}
|
||
</aside>
|
||
`}function g_(){return(g_=e((()=>{B(),vn(),J(),Mi(),G(),K(),Je(),yi()})))()}function __(e){let t=e.match(/\.([a-z0-9_-]+)$/i)?.[1]?.toLowerCase()??``;return t===`yml`?`yaml`:t}function v_(e){return e.split(/[\\/]/).findLast(e=>e)??e}function y_(e){let t=e.replace(/\r/g,`\\r`).replace(/\n/g,`\\n`),n=Math.max(0,...t.match(/`+/g)?.map(e=>e.length)??[]),r="`".repeat(n+1),i=t.startsWith(` `)&&t.endsWith(` `),a=/^ +$/.test(t),o=t.startsWith("`")||t.endsWith("`")||i&&!a?` `:``;return`${r}${o}${t}${o}${r}`}function b_(e){if(typeof e!=`number`)return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()}function x_(e,t){let n=e.workspacePath||e.path||t,r=b_(e.updatedAtMs),i=[`This file is not previewable inline.`,``,`- Path: ${y_(n)}`,e.mimeType?`- Type: ${y_(e.mimeType)}`:null,typeof e.size==`number`?`- Size: ${e.size.toLocaleString()} bytes`:null,r?`- Updated: ${r}`:null].filter(e=>e!==null).join(`
|
||
`);return{kind:`markdown`,content:i,rawText:i}}function S_(e,t){if(!e)return t;let n=e.includes(`\\`)&&!e.includes(`/`)?`\\`:`/`,r=e.replace(/[\\/]+$/,``),i=t.replace(/^[\\/]+/,``).replaceAll(/[\\/]/g,n);return r?`${r}${n}${i}`:`${n}${i}`}function C_(e){let{data:t,encoding:n,mimeType:r,title:i,url:a}=e;if(n===`base64`&&t&&r.startsWith(`image/`))return{kind:`image`,title:i,src:`data:${r};base64,${t}`,mimeType:r,rawText:a??null};if(n===`base64`&&t&&(r===`application/json`||r.startsWith(`text/`))){let e=Uint8Array.from(globalThis.atob(t),e=>e.charCodeAt(0)),n=new TextDecoder().decode(e);return{kind:`markdown`,content:`# ${i}\n\n\`\`\`${r===`application/json`?`json`:``}\n${n}\n\`\`\``,rawText:n}}if(a){let e=`# ${i}\n\n[Open artifact](${a})`;return{kind:`markdown`,content:e,rawText:e}}let o=`# ${i}\n\nArtifact download is not previewable in the sidebar.`;return{kind:`markdown`,content:o,rawText:o}}function w_(e,t){hg(e,t)&&e.handleOpenSidebar(I_(e))}function T_(e,t){return e.activeId=t,e.openRequest={}}function E_(e,t,n,r){return t.openRequest===n&&dg(e,t)&&t.activeId===r}function D_(e){let t=e.sessionWorkspaceState;return!!(t&&dg(e,t)&&t.openRequest!==void 0)}function O_(e,t,n,r,i,a){if(!e.client||!e.connected)return;let o=T_(t,n);(async()=>{e.handleOpenSidebar(null),t.error=null;try{let s=await r(),c=s==null?null:i(s);if(!c){E_(e,t,o,n)&&(t.error=a);return}E_(e,t,o,n)&&cg(e,c)}catch(r){E_(e,t,o,n)&&(t.error=Ee(r))}finally{t.openRequest===o&&delete t.openRequest,pg(e)}})()}function k_(e,t,n,r={}){let i=r.requestPath??n;O_(e,t,`file:${n}`,()=>e.sessions.getFile(t.sessionKey,i,{agentId:t.agentId}),a=>{let o=a.file;if(!o)return null;let s=o.name||v_(n);if(o.previewKind===`image`)return o.contentEncoding!==`base64`||typeof o.content!=`string`||!o.mimeType||!R_.has(o.mimeType)?null:{kind:`image`,title:s,src:`data:${o.mimeType};base64,${o.content}`,mimeType:o.mimeType,rawText:o.workspacePath||o.path||n};if(o.previewKind===`unsupported`)return x_(o,n);if(o.previewKind!==void 0&&o.previewKind!==`text`||o.previewKind===`text`&&o.contentEncoding!==void 0&&o.contentEncoding!==`utf8`||typeof o.content!=`string`)return null;let c=typeof o.hash==`string`&&kg(o.content)&&Zn(e,`sessions.files.set`)===!0&&Bt(e.hello?.auth??null)?{hash:o.hash,save:async({content:n,expectedHash:r})=>{try{let o=await e.sessions.setFile(a.sessionKey,i,n,{agentId:t.agentId,expectedHash:r}),s=o?.file.hash,c=o?.file.updatedAtMs;return typeof s==`string`?{ok:!0,hash:s,...typeof c==`number`?{updatedAtMs:c}:{}}:{ok:!1,code:`error`,message:`Save failed.`}}catch(e){let t=e instanceof Dt&&e.details&&typeof e.details==`object`?e.details:null;return t?.type===`session_file_conflict`?{ok:!1,code:`conflict`,...typeof t.currentHash==`string`?{currentHash:t.currentHash}:{}}:{ok:!1,code:`error`,message:Ee(e)}}},fetchLatest:async()=>{let n=(await e.sessions.getFile(a.sessionKey,i,{agentId:t.agentId}))?.file;return!n||typeof n.content!=`string`||typeof n.hash!=`string`?null:{content:n.content,hash:n.hash,editable:kg(n.content)}}}:void 0;return{kind:`file`,path:o.workspacePath||o.path||n,name:s,content:o.content,draftKey:[e.settings?.gatewayUrl??``,e.sessionWorkspaceDraftScope??``,a.sessionKey,a.root??``,o.workspacePath||o.path||n].join(`\0`),root:a.root??null,language:__(s),line:r.line??null,rawText:o.content,...c?{edit:c}:{}}},`Failed to load ${n}`)}function A_(e,t){k_(e,fg(e),t.path,{line:t.line})}function j_(e){let t=fg(e);t.collapsed=!t.collapsed,!t.collapsed&&t.list?.sessionKey!==e.sessionKey&&mg(e,t),pg(e)}function M_(e,t){let n=fg(e);n.dock!==t&&(n.dock=t,e.settings&&={...e.settings,chatWorkspaceDock:t},Ht({chatWorkspaceDock:t})),pg(e)}function N_(e,t){let n=fg(e);ag(n);let r=t.replaceAll(`\\`,`/`),i=r.lastIndexOf(`/`);n.collapsed=!1,n.browserPath=i>0?r.slice(0,i):``,n.browserSearch=``,n.activeId=`file:${t}`,mg(e,n,!0),pg(e)}function P_(e,t,n){O_(e,t,`artifact:${n}`,()=>e.client.request(`artifacts.download`,{sessionKey:t.sessionKey,artifactId:n,...t.agentId?{agentId:t.agentId}:{}}),e=>e.artifact?C_({data:e.data,encoding:e.encoding,mimeType:e.artifact.mimeType??``,title:e.artifact.title,url:e.url}):null,`Failed to load artifact ${n}`)}function F_(e,t){e.sessionWorkspaceDraftScope=t?.draftScope;let n=fg(e);(t?.expanded===!1||t?.presented===!1)&&n.browserSearchTimer&&(ag(n),n.pendingReload=!0),t?.presented!==!1&&t?.expanded===!0&&e.connected&&e.agentsList&&!n.loading&&(!n.error||n.pendingReload)&&(n.pendingReload||n.list?.sessionKey!==e.sessionKey)&&mg(e,n);let r=I_(e);return{collapsed:t?.expanded!==!0&&n.collapsed,sessionKey:e.sessionKey,list:n.list?.sessionKey===e.sessionKey?n.list:null,loading:n.loading,error:n.error,activeId:n.activeId,dock:n.dock,narrowLayout:t?.narrowLayout===!0,onToggleCollapsed:()=>j_(e),onSetDock:t=>M_(e,t),onRefresh:()=>mg(e,n,!0),onBrowsePath:t=>{ag(n),n.browserPath=t,n.browserSearch=``,mg(e,n,!0)},onOpenFile:(t,r)=>{let i=r===`workspace`?{requestPath:S_(n.list?.root,t)}:{};k_(e,n,t,i)},onSearch:t=>{n.browserSearch=t,ag(n),n.browserSearchTimer=globalThis.setTimeout(()=>{n.browserSearchTimer=null,mg(e,n,!0)},160)},onOpenArtifact:t=>P_(e,n,t),onOpenDiff:r?()=>cg(e,r):void 0}}function I_(e){let t=fg(e);if(!(Zn(e,`sessions.diff`)===!0&&e.client))return null;if(t.diffContent)return t.diffContent;let n=L_(e,t);return sg(n),t.diffContent=n,n}function L_(e,t){let n=e.sessionKey,r=e.client,i=t.agentId;return{kind:`session-diff`,load:async e=>{if(!r)throw Error(Y(`chat.sessionDiff.disconnected`));return await r.request(`sessions.diff`,{sessionKey:n,...i?{agentId:i}:{},...e})},loadFileText:Zn(e,`sessions.files.get`)===!0&&e.client?async t=>{try{let r=(await e.sessions.getFile(n,t,{agentId:i}))?.file;return!r||r.previewKind!==void 0&&r.previewKind!==`text`||r.contentEncoding!==void 0&&r.contentEncoding!==`utf8`||typeof r.content!=`string`?null:r.content}catch{return null}}:void 0,openFile:t=>k_(e,fg(e),t)}}var R_;function z_(){return(z_=e((()=>{Gt(),Pt(),kt(),K(),Fe(),Qn(),vg(),d_(),g_(),R_=new Set([`image/avif`,`image/gif`,`image/jpeg`,`image/png`,`image/webp`])})))()}function B_(e,t){t.length!==0&&A({message:Y(e,{names:t.slice(0,3).map(e=>e.name).join(`, `),more:t.length>3?` +${t.length-3}`:``})})}function V_(e,t){let n=e=>e.type.startsWith(`image/`)?t?.maxImageBytes:t?.maxBytes,r=e.filter(e=>e.size===0),i=e.filter(e=>e.size>0&&t!==void 0&&e.size>(n(e)??1/0));return B_(`chat.attachments.readFailed`,r),B_(`chat.attachments.tooLarge`,i),e.filter(e=>!r.includes(e)&&!i.includes(e))}function H_(){return(H_=e((()=>{K(),me()})))()}function U_(e){return Array.from(e?.types??[]).includes(`Files`)}function W_(e){let t=e.target;if(!(t instanceof Element))return!1;let n=t.closest(`textarea, input, [contenteditable]`);return n instanceof HTMLInputElement?Ov.has(n.type)&&!n.disabled&&!n.readOnly:n instanceof HTMLTextAreaElement?!n.disabled&&!n.readOnly:n instanceof HTMLElement&&n.isContentEditable}function G_(e){return e.getAttachments?.()??e.attachments??[]}function K_(e,t){e.closest(`details`)?.removeAttribute(`open`),e.closest(`.agent-chat__composer-shell, .new-session-page__composer`)?.querySelector(t)?.click()}function q_(e,t){let n={id:je(),mimeType:e.type||`application/octet-stream`,fileName:e.name||void 0,sizeBytes:e.size};return se({attachment:n,dataUrl:t,file:e})}function J_(e){return Tv.has(e)}function Y_(e){let t=new TextEncoder().encode(e),n=[],r=32768;for(let e=0;e<t.length;e+=r)n.push(String.fromCharCode(...t.subarray(e,e+r)));return`data:${Sv};base64,${btoa(n.join(``))}`}function X_(e,t){let n=q_(t,Y_(e));Tv.add(n);let r=Q_(e);return r&&Ev.set(n,r),n}function Z_(e){let t=/^data:([^,]*),(.*)$/s.exec(e);if(!t)return null;let n=t[1],r=t[2];if(n===void 0||r===void 0)return null;if(n.toLowerCase().includes(`;base64`))try{let e=atob(r),t=Uint8Array.from(e,e=>e.charCodeAt(0));return new TextDecoder().decode(t)}catch{return null}try{return decodeURIComponent(r.replace(/\+/g,`%20`))}catch{return null}}function Q_(e){let t=e.replace(/\s+/gu,` `).trim();return t?t.length<=wv?t:`${o(t,wv).trimEnd()}...`:null}function $_(e){return Ev.get(e)??e.fileName??Y(`chat.attachments.attachedFile`)}function ev(e){let t=_u(e.fileName??`attachment`,e.mimeType),n=t.family===`video`?q.play:t.family===`audio`?q.music:q.fileText;return z`
|
||
<openclaw-tooltip .content=${e.fileName??Y(`chat.attachments.attachedFile`)}>
|
||
<div class="chat-attachment-file">
|
||
<span class="chat-attachment-file__icon" data-family=${t.family}>${n}</span>
|
||
<span class="chat-attachment-file__body">
|
||
<span class="chat-attachment-file__name"
|
||
>${e.fileName??Y(`chat.attachments.attachedFile`)}</span
|
||
>
|
||
<span class="chat-attachment-file__type">${t.extensionLabel}</span>
|
||
</span>
|
||
</div>
|
||
</openclaw-tooltip>
|
||
`}function tv(e,t){return e.trim()?`${e.replace(/\s+$/u,``)}\n\n${t}`:t}function nv(e,t){if(!t.onAttachmentsChange)return!1;let n=e.clipboardData?.getData(`text/plain`);if(!n||n.length<=xv)return!1;e.preventDefault();let r=new File([n],`${Cv}${Date.now()}.txt`,{type:Sv});if(V_([r],t.attachmentLimits).length===0)return!0;let i=X_(n,r);return t.onAttachmentsChange([...G_(t),i]),!0}function rv(e,t=`pasted-image`){let n=/^\s*data:(image\/[a-z0-9.+-]+);base64,([a-z0-9+/=\s]+)\s*$/i.exec(e);if(!n)return null;let r=n[1]?.toLowerCase(),i=n[2];if(!r||!i)return null;let a=i.replace(/\s+/g,``);try{let e=atob(a),n=new Uint8Array(e.length);for(let t=0;t<e.length;t++)n[t]=e.charCodeAt(t);let i=r.split(`/`)[1]?.replace(/[^a-z0-9.+-]/gi,``)||`png`;return{file:new File([n],`${t}.${i}`,{type:r}),dataUrl:`data:${r};base64,${a}`}}catch{return null}}function iv(e,t,n){let r=rv(e,t.replace(/\.[a-z0-9]+$/i,``)||`image`);return!r||V_([r.file],n).length===0?null:q_(r.file,r.dataUrl)}function av(e,t){return t.readSignal?.aborted?Promise.resolve(null):new Promise(n=>{let r=new FileReader,i=!1,a=e=>{i||(i=!0,t.readSignal?.removeEventListener(`abort`,o),n(e))},o=()=>{r.abort(),a(null)};t.readSignal?.addEventListener(`abort`,o,{once:!0}),r.addEventListener(`error`,()=>a(null),{once:!0}),r.addEventListener(`abort`,()=>a(null),{once:!0}),r.addEventListener(`load`,()=>{let n=typeof r.result==`string`?r.result:null;a(n&&!t.readSignal?.aborted?q_(e,n):null)},{once:!0}),r.readAsDataURL(e)})}async function ov(e,t){if(!t.onAttachmentsChange||e.length===0)return;let n=V_(e,t.attachmentLimits);if(n.length!==0){t.onPendingReadsChange?.(1);try{let e=await Promise.all(n.map(e=>av(e,t))),r=e.filter(e=>e!==null);if(t.readSignal?.aborted){for(let e of r)k(e.id);return}let i=e.map((e,t)=>e===null?n[t]?.name:void 0).filter(e=>!!e);if(i.length>0&&A({message:Y(`chat.attachments.readFailed`,{names:i.slice(0,3).join(`, `),more:i.length>3?` +${i.length-3}`:``})}),r.length===0)return;t.onAttachmentsChange([...G_(t),...r])}finally{t.onPendingReadsChange?.(-1)}}}function sv(e,t){let n=e.clipboardData?.items;if(!n||!t.onAttachmentsChange)return;let r=Array.from(n).filter(e=>e.type.startsWith(`image/`)).map(e=>e.getAsFile()).filter(e=>e!==null);if(r.length===0){let n=e.clipboardData?.getData(`text/plain`),r=n?rv(n):null;if(!r){nv(e,t);return}if(e.preventDefault(),V_([r.file],t.attachmentLimits).length===0)return;t.onAttachmentsChange([...G_(t),q_(r.file,r.dataUrl)]);return}e.preventDefault(),ov(r,t)}function cv(e,t){let n=Ae(e),r=n?Z_(n):null;if(!r||!t.onDraftChange)return;let i=G_(t).filter(t=>t.id!==e.id);k(e.id),t.onAttachmentsChange?.(i),t.onDraftChange(tv(t.getDraft?.()??t.draft??``,r)),t.onRequestUpdate?.()}function lv(e,t){let n=e.target;if(!(n instanceof HTMLInputElement))return;let r=[...n.files??[]];n.value=``,ov(r,t)}function uv(e,t){e.preventDefault(),ov([...e.dataTransfer?.files??[]],t)}function dv(e){let t=0,n=(n,r)=>{let i=n.currentTarget;if(i instanceof HTMLElement){if(r){if(!e.canCompose||!U_(n.dataTransfer))return;t+=1}else t=Math.max(0,t-1);i.toggleAttribute(`data-attachment-drop-active`,t>0)}},r=e=>{t=0;let n=e.currentTarget;n instanceof HTMLElement&&n.removeAttribute(`data-attachment-drop-active`)};return{onDragenter:e=>n(e,!0),onDragleave:e=>n(e,!1),onDragover:t=>{if(!U_(t.dataTransfer)){W_(t)||(t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect=`none`));return}t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect=e.canCompose?`copy`:`none`)},onDrop:t=>{if(!U_(t.dataTransfer)){W_(t)||t.preventDefault();return}t.preventDefault(),r(t),e.canCompose&&uv(t,e)}}}function fv(e){return z`
|
||
${[`file`,`photo`,`camera`].map(t=>z`
|
||
<input
|
||
type="file"
|
||
accept=${t===`file`?bv:`image/*`}
|
||
?multiple=${t!==`camera`}
|
||
capture=${t===`camera`?`environment`:R}
|
||
class=${`agent-chat__${t}-input`}
|
||
?disabled=${e.disabled}
|
||
@change=${t=>{e.disabled||lv(t,e)}}
|
||
/>
|
||
`)}
|
||
`}function pv(e){let t=e.detail.item.value;if(t!==`camera`&&t!==`photo`&&t!==`file`)return!1;let n=e.currentTarget;return n instanceof HTMLElement&&K_(n,`.agent-chat__${t}-input`),!0}function mv(e,t=!1){return z`
|
||
<button
|
||
slot="trigger"
|
||
type="button"
|
||
class="agent-chat__input-btn agent-chat__input-btn--attach ${t?`agent-chat__input-btn--has-overrides`:``}"
|
||
aria-label=${Y(`chat.composer.addAttachment`)}
|
||
?disabled=${e}
|
||
title=${Y(`chat.composer.addAttachment`)}
|
||
>
|
||
${q.plus}
|
||
</button>
|
||
`}function hv(e=q.folder){return z`
|
||
<wa-dropdown-item class="agent-chat__attach-menu-option" value="camera">
|
||
<span slot="icon" aria-hidden="true">${q.camera}</span>
|
||
<span>${Y(`chat.composer.takePhoto`)}</span>
|
||
</wa-dropdown-item>
|
||
<wa-dropdown-item class="agent-chat__attach-menu-option" value="photo">
|
||
<span slot="icon" aria-hidden="true">${q.image}</span>
|
||
<span>${Y(`chat.composer.attachPhoto`)}</span>
|
||
</wa-dropdown-item>
|
||
<wa-dropdown-item class="agent-chat__attach-menu-option" value="file">
|
||
<span slot="icon" aria-hidden="true">${e}</span>
|
||
<span>${Y(`chat.composer.attachFileOption`)}</span>
|
||
</wa-dropdown-item>
|
||
`}function gv(e,t){if(t.onRemoveAttachment){t.onRemoveAttachment(e);return}let n=G_(t).filter(t=>t.id!==e.id);k(e.id),t.onAttachmentsChange?.(n)}function _v(e,t,n,r){let i=ie(e);return i?r.onOpenImage?z`
|
||
<button
|
||
type="button"
|
||
class="chat-message-image-button chat-attachment-image-button"
|
||
aria-label=${Y(`chat.imageLightbox.open`,{title:n})}
|
||
@click=${()=>r.onOpenImage?.({src:i,title:n})}
|
||
>
|
||
<img src=${i} alt=${t} />
|
||
</button>
|
||
`:z`<img src=${i} alt=${t} />`:R}function vv(e,t,n){let r=t.title.trim()||t.displayUrl.trim()||e.fileName||Y(`chat.attachments.attachedFile`),i=Y(t.markedRegionCount===1?`chat.composer.browserAnnotationRegion`:`chat.composer.browserAnnotationRegions`,{count:String(t.markedRegionCount)}),a=Y(`chat.composer.removeBrowserAnnotation`,{name:r});return z`
|
||
<div
|
||
class="chat-attachment-thumb chat-attachment-thumb--browser-annotation"
|
||
data-attachment-id=${e.id}
|
||
role="group"
|
||
aria-label=${`${Y(`chat.composer.browserAnnotation`)}: ${r}`}
|
||
>
|
||
<div class="chat-browser-annotation-card__preview">
|
||
${_v(e,Y(`chat.composer.browserAnnotationPreview`),r,n)}
|
||
</div>
|
||
<div class="chat-attachment-file__body chat-browser-annotation-card__body">
|
||
<span
|
||
class="chat-attachment-file__name chat-browser-annotation-card__identity"
|
||
title=${r}
|
||
>${r}</span
|
||
>
|
||
<span class="chat-attachment-file__meta chat-browser-annotation-card__meta">
|
||
<span>${i}</span>
|
||
</span>
|
||
</div>
|
||
<openclaw-tooltip .content=${a}>
|
||
<button
|
||
class="chat-attachment-remove chat-browser-annotation-card__remove"
|
||
type="button"
|
||
aria-label=${a}
|
||
?disabled=${n.disabled}
|
||
@click=${()=>gv(e,n)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</div>
|
||
`}function yv(e){let t=e.attachments??[];return t.length===0?R:z`
|
||
<div
|
||
class="chat-attachments-preview"
|
||
${U(Lu)}
|
||
@scroll=${e=>{e.currentTarget instanceof Element&&Lu(e.currentTarget)}}
|
||
>
|
||
${t.map(t=>t.browserAnnotation?vv(t,t.browserAnnotation,e):z`
|
||
<div
|
||
class=${[`chat-attachment-thumb`,t.mimeType.startsWith(`image/`)?``:`chat-attachment-thumb--file`,J_(t)?`chat-attachment-thumb--pasted-text`:``].filter(Boolean).join(` `)}
|
||
>
|
||
${t.mimeType.startsWith(`image/`)&&ie(t)?_v(t,t.fileName?.trim()||Y(`chat.composer.attachmentPreview`),t.fileName?.trim()||Y(`chat.imageLightbox.untitled`),e):J_(t)?z`
|
||
<div class="chat-attachment-file chat-attachment-file--pasted-text">
|
||
<span class="chat-attachment-file__icon">${q.fileText}</span>
|
||
<span class="chat-attachment-file__body">
|
||
<span class="chat-attachment-file__name"
|
||
>${$_(t)}</span
|
||
>
|
||
<button
|
||
class="chat-attachment-text-action"
|
||
type="button"
|
||
aria-label=${Y(`chat.attachments.showInTextField`)}
|
||
?disabled=${e.disabled}
|
||
@click=${()=>cv(t,e)}
|
||
>
|
||
${Y(`chat.attachments.showInTextField`)}
|
||
<span aria-hidden="true">${q.chevronRight}</span>
|
||
</button>
|
||
</span>
|
||
</div>
|
||
`:ev(t)}
|
||
<openclaw-tooltip .content=${Y(`chat.composer.removeAttachment`)}>
|
||
<button
|
||
class="chat-attachment-remove"
|
||
type="button"
|
||
aria-label=${Y(`chat.composer.removeAttachment`)}
|
||
?disabled=${e.disabled}
|
||
@click=${()=>{let n=G_(e).filter(e=>e.id!==t.id);k(t.id),e.onAttachmentsChange?.(n)}}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</div>
|
||
`)}
|
||
</div>
|
||
`}var bv,xv,Sv,Cv,wv,Tv,Ev,Dv,Ov;function kv(){return(kv=e((()=>{B(),V(),J(),G(),mn(),K(),me(),P(),H_(),Cu(),zu(),bv=`image/*,audio/*,video/*,application/pdf,text/*,.csv,.json,.md,.txt,.zip,.doc,.docx,.xls,.xlsx,.ppt,.pptx`,xv=1e3,Sv=`text/plain`,Cv=`pasted-text-`,wv=20,Tv=new WeakSet,Ev=new WeakMap,Dv=class{constructor(e){this.notify=e,this.pendingReads=0,this.controller=new AbortController}get readSignal(){return this.controller.signal}updatePending(e,t){this.controller.signal===e&&(this.pendingReads=Math.max(0,this.pendingReads+t),this.notify())}abortReads(){this.controller.abort(),this.controller=new AbortController,this.pendingReads=0,this.notify()}},Ov=new Set([`email`,`number`,`password`,`search`,`tel`,`text`,`url`])})))()}function Av(e){return Zo(e)?sa(e.status):e.status===`completed`?Y(`tasksPage.status.completed`):Y(`tasksPage.status.failed`)}var jv;function Mv(){return(Mv=e((()=>{K(),wi(),jv={queued:`warn`,running:`warn`,completed:`ok`,failed:`danger`,cancelled:`danger`,timed_out:`danger`}})))()}function Nv(e){let t=e.now??Date.now(),n=e.canonicalizeSessionKey(e.sessionKey),r=Vr(e.tasks.filter(t=>{let r=e.canonicalizeSessionKey(t.sessionKey);return t.runtime===`subagent`&&!!n&&r===n})),i=r.filter(Zo),a=[],o=null;for(let n of r){if(Zo(n))continue;let r=e.terminalObservedAtByTask.get(n.id)??vi(n.endedAt??n.updatedAt),i=r+Bv;r<=0||i<=t||(a.push(n),o=o===null?i:Math.min(o,i))}let s=[...i,...a];return{rows:s.slice(0,zv),overflowWorking:s.slice(zv).filter(e=>e.status===`running`).length,taskIds:new Set(s.map(e=>e.id)),nextExpiryAt:o}}function Pv(e){return Zo(e)?Y(`chat.backgroundTasks.subagentActivity.working`):e.status===`cancelled`?Y(`chat.backgroundTasks.subagentActivity.cancelled`):e.status===`failed`||e.status===`timed_out`?Y(`chat.backgroundTasks.subagentActivity.failed`):Y(`chat.backgroundTasks.subagentActivity.finished`)}function Fv(e){return!Zo(e)&&e.terminalSummary?.trim()?e.terminalSummary.trim():e.lastActivity?.trim()||e.progressSummary?.trim()||e.lastToolName?.trim()||void 0}function Iv(e){if(Zo(e))return z`<span
|
||
class="chat-subagent-activity__indicator chat-reading-indicator"
|
||
aria-hidden="true"
|
||
>${q.claw}</span
|
||
>`;let t=e.status!==`completed`;return z`<span
|
||
class="chat-subagent-activity__indicator chat-subagent-activity__indicator--${t?`failed`:`finished`}"
|
||
aria-hidden="true"
|
||
>${t?q.x:q.check}</span
|
||
>`}function Lv(e,t){let n=Fv(e),r=Pv(e),i=z`
|
||
${Iv(e)}
|
||
<span class="chat-subagent-activity__label">${r}</span>
|
||
${n?wt(`${e.status}:${n}`,z`<span
|
||
class="chat-subagent-activity__snippet chat-subagent-activity__snippet--updated"
|
||
title=${n}
|
||
>${n}</span
|
||
>`):R}
|
||
${e.diffStat?ip(e.diffStat):R}
|
||
`;return t?z`<button
|
||
class="chat-subagent-activity__row chat-subagent-activity__row--interactive"
|
||
data-subagent-task-id=${e.id}
|
||
type="button"
|
||
aria-label=${Y(`chat.backgroundTasks.subagentActivity.openDetails`,{title:tr(e)})}
|
||
@click=${()=>t(e)}
|
||
>
|
||
${i}
|
||
</button>`:z`<div
|
||
class="chat-subagent-activity__row"
|
||
data-subagent-task-id=${e.id}
|
||
role="status"
|
||
aria-live="off"
|
||
>
|
||
${i}
|
||
</div> `}function Rv(e,t){return e.rows.length===0?R:z`
|
||
<div
|
||
class="chat-subagent-activity"
|
||
aria-label=${Y(`chat.backgroundTasks.subagentActivity.label`)}
|
||
>
|
||
${ht(e.rows,e=>e.id,e=>Lv(e,t))}
|
||
${e.overflowWorking>0?z`<div class="chat-subagent-activity__overflow">
|
||
${Y(`chat.backgroundTasks.subagentActivity.moreWorking`,{count:String(e.overflowWorking)})}
|
||
</div>`:R}
|
||
</div>
|
||
`}var zv,Bv;function Vv(){return(Vv=e((()=>{B(),rt(),vt(),J(),K(),wi(),op(),zv=5,Bv=6e4})))()}function Hv(e){e.refreshTimer!==null&&(window.clearTimeout(e.refreshTimer),e.refreshTimer=null)}function Uv(e){let t=e.taskDetailState;t&&(Hv(t),e.taskDetailState=void 0)}function Wv(e,t){if(e.taskDetailState!==t||t.inFlight)return;let n=qv-(Date.now()-t.lastRequestStartedAt);if(n>0){t.refreshTimer===null&&(t.refreshTimer=window.setTimeout(()=>{t.refreshTimer=null,Wv(e,t)},n));return}Hv(t);let r=e.client;if(!r||!e.connected||r!==t.client||e.connectionEpoch!==t.connectionEpoch){t.load={status:`error`},e.requestUpdate?.();return}let i=++t.requestId,a=t.eventVersion;t.inFlight=!0,t.lastRequestStartedAt=Date.now(),t.load.status!==`loaded`&&(t.load={status:`loading`}),e.requestUpdate?.(),(async()=>{let n;try{let e=await r.request(`chat.history`,{sessionKey:t.sessionKey,limit:100});n={status:`loaded`,messages:Cs(e.messages)}}catch{n={status:`error`}}let o=e.taskDetailState;o===t&&o.requestId===i&&e.client===r&&e.connectionEpoch===t.connectionEpoch&&(t.inFlight=!1,t.load=n,e.requestUpdate?.(),t.eventVersion>a&&Wv(e,t))})()}function Gv(e,t){let n=e.client,r=e.taskDetailState;if(r&&r.taskId===t.taskId&&r.sessionKey===t.sessionKey&&r.client===n&&r.connectionEpoch===e.connectionEpoch)return r.load;if(Uv(e),!n||!e.connected)return{status:`error`};let i={client:n,connectionEpoch:e.connectionEpoch,eventVersion:0,inFlight:!1,lastRequestStartedAt:-1/0,load:{status:`loading`},refreshTimer:null,requestId:0,sessionKey:t.sessionKey,taskId:t.taskId};return e.taskDetailState=i,Wv(e,i),i.load}function Kv(e,t){let n=e.taskDetailState;if(n){if(t.action===`deleted`){t.taskId===n.taskId&&Uv(e);return}t.action===`upserted`&&t.task.id===n.taskId&&(n.eventVersion+=1,Wv(e,n))}}var qv;function Jv(){return(Jv=e((()=>{Ss(),qv=2e3})))()}function Yv(e){let t=Ke(e,e.sessionKey)||_(e.sessionKey)||e.sessionKey,n=e.backgroundTasksState;if(n?.sessionKey===t&&n.connectionClient===e.client&&n.connectionEpoch===e.connectionEpoch)return n;n?.subagentActivityExpiryTimer!==null&&n?.subagentActivityExpiryTimer!==void 0&&window.clearTimeout(n.subagentActivityExpiryTimer),uy+=1;let r={cancellingTaskIds:new Set,collapsed:n?.collapsed??!0,connectionClient:e.client,connectionEpoch:e.connectionEpoch,error:null,finishedCollapsed:n?.finishedCollapsed??!0,loadedClient:null,loading:!1,pendingTaskEvents:null,pendingReload:!1,requestId:0,sessionKey:t,statusRowId:`chat-tasks-status-${uy}`,subagentActivityExpiryAt:null,subagentActivityExpiryTimer:null,taskActivityById:new Map,terminalObservedAtByTask:new Map,tasks:null,taskDetails:new Map,taskDetailErrors:new Map,taskDetailLoadingIds:new Set};return e.backgroundTasksState=r,r}function Xv(e,t){let n=e.taskActivityById.get(t.id),r=t.lastActivity??n?.lastActivity,i=t.diffStat??n?.diffStat;return(r||i)&&e.taskActivityById.set(t.id,{...r?{lastActivity:r}:{},...i?{diffStat:i}:{}}),r===t.lastActivity&&i===t.diffStat?t:{...t,...r?{lastActivity:r}:{},...i?{diffStat:i}:{}}}function Zv(e,t){let n=Xv(e,t);return Zo(n)&&e.terminalObservedAtByTask.delete(n.id),n}function Qv(e,t,n){if(Zo(t)){e.terminalObservedAtByTask.delete(t.id);return}if(!e.terminalObservedAtByTask.has(t.id)){let r=n===`event`?Date.now():vi(t.endedAt??t.updatedAt);r>0&&e.terminalObservedAtByTask.set(t.id,r)}}function $v(e,t,n){t.subagentActivityExpiryAt!==n&&(t.subagentActivityExpiryTimer!==null&&window.clearTimeout(t.subagentActivityExpiryTimer),t.subagentActivityExpiryAt=n,t.subagentActivityExpiryTimer=null,n!==null&&(t.subagentActivityExpiryTimer=window.setTimeout(()=>{Yv(e)===t&&(t.subagentActivityExpiryAt=null,t.subagentActivityExpiryTimer=null,e.requestUpdate?.())},Math.max(0,n-Date.now()))))}function ey(e,t,n=!1){let r=e.client;if(!r||!e.connected)return;if(t.loading){n&&(t.pendingReload=!0);return}let i=++t.requestId,a={requestId:i,client:r,connectionEpoch:t.connectionEpoch,sessionKey:t.sessionKey,events:[]};t.pendingTaskEvents=a,t.loading=!0,t.error=null,t.pendingReload=!1;let o=t.sessionKey;(async()=>{try{let[n,s]=await Promise.all([r.request(`tasks.list`,{sessionKey:o,status:[`queued`,`running`],limit:cy}),r.request(`tasks.list`,{sessionKey:o,limit:ly})]),c=Er(n)?.tasks.map(e=>Zv(t,e)),l=Er(s)?.tasks.map(e=>Zv(t,e));if(!c||!l)throw Error(Y(`tasksPage.invalidResponse`));let u=Yv(e);if(u!==t||u.requestId!==i)return;let d=lr(c,l);for(let e of a.events)d=Yr(d,e).tasks;u.tasks=Vr(d.map(e=>Bi(e,u.taskDetails.get(e.id))));for(let e of u.tasks)Qv(u,e,`snapshot`);u.loadedClient=r}catch(n){let r=Yv(e);if(r===t&&r.requestId===i){if(r.tasks===null&&a.events.length>0){r.tasks=a.events.reduce((e,t)=>Yr(e,t).tasks,[]);for(let e of r.tasks)Qv(r,e,`event`)}r.error=Ee(n,Y(`tasksPage.loadFailed`))}}finally{let n=Yv(e);if(n===t&&n.requestId===i){n.pendingTaskEvents===a&&(n.pendingTaskEvents=null),n.loading=!1;let t=n.pendingReload;n.pendingReload=!1,t&&ey(e,n,!0)}e.requestUpdate?.()}})()}function ty(e,t,n){return[t.sessionKey,t.childSessionKey,t.ownerKey].some(t=>Ke(e,t)===n||_(t)===n)}function ny(e,t,n){let r=t.pendingTaskEvents;return n.action===`restored`||!r||!t.loading||r.requestId!==t.requestId||r.client!==e.client||r.connectionEpoch!==e.connectionEpoch||r.sessionKey!==t.sessionKey||n.action===`upserted`&&!ty(e,n.task,t.sessionKey)?!1:(r.events.push(n),!0)}function ry(e,t,n=!0){let r=e.backgroundTasksState;if(!r||r.connectionClient!==e.client||r.connectionEpoch!==e.connectionEpoch)return;let i=Nr(t);if(!i||i.action===`upserted`&&!ty(e,i.task,r.sessionKey))return;Kv(e,i);let a=i.action===`upserted`?{...i,task:Zv(r,i.task)}:i,o=ny(e,r,a);if(a.action===`restored`&&!n){r.requestId+=1,r.pendingTaskEvents=null,r.pendingReload=!1,r.loading=!1,r.tasks=null,r.loadedClient=null,r.error=null,e.requestUpdate?.();return}if(r.tasks===null){n&&!o&&ey(e,r,!0);return}if(a.action===`restored`){ey(e,r,!0);return}if(a.action===`deleted`){if(!r.tasks.some(e=>e.id===a.taskId))return;r.tasks=r.tasks.filter(e=>e.id!==a.taskId),r.taskDetails.delete(a.taskId),r.taskActivityById.delete(a.taskId),r.terminalObservedAtByTask.delete(a.taskId),r.taskDetailErrors.delete(a.taskId),r.taskDetailLoadingIds.delete(a.taskId),e.requestUpdate?.();return}let s=r.tasks.find(e=>e.id===a.task.id),c=r.taskDetails.get(a.task.id),l=s?Bi(s,a.task,`event`):a.task;l=Bi(l,c),Qv(r,l,`event`),r.tasks=Vr([l,...r.tasks.filter(e=>e.id!==a.task.id)]),c&&(r.taskDetails=new Map(r.taskDetails).set(a.task.id,{...l,...c.prompt?{prompt:c.prompt}:{}})),e.requestUpdate?.()}async function iy(e,t,n){let r=n.id,i=e.client;if(!i||!e.connected||t.taskDetails.has(r)||t.taskDetailLoadingIds.has(r))return;t.taskDetailLoadingIds=new Set(t.taskDetailLoadingIds).add(r);let a=new Map(t.taskDetailErrors);a.delete(r),t.taskDetailErrors=a,e.requestUpdate?.();try{let n=await i.request(`tasks.get`,{taskId:r});if(Yv(e)!==t)return;let a=Ki(n),o=a?Zv(t,a):null;if(!o||o.id!==r)throw Error(Y(`chat.backgroundTasks.detailFailed`));let s=t.tasks?.find(e=>e.id===r);if(!s)return;let c=Bi(s,o);Qv(t,c,`snapshot`),t.taskDetails=new Map(t.taskDetails).set(r,{...c,...o.prompt?{prompt:o.prompt}:{}}),t.tasks&&=Vr([c,...t.tasks.filter(e=>e.id!==r)])}catch(n){if(Yv(e)===t){let e=Ee(n,Y(`chat.backgroundTasks.detailFailed`));t.taskDetailErrors=new Map(t.taskDetailErrors).set(r,e)}}finally{if(Yv(e)===t){let e=new Set(t.taskDetailLoadingIds);e.delete(r),t.taskDetailLoadingIds=e}e.requestUpdate?.()}}async function ay(e,t,n){let r=e.client;if(!(!r||!e.connected||t.cancellingTaskIds.has(n))){t.cancellingTaskIds=new Set([...t.cancellingTaskIds,n]),t.error=null,e.requestUpdate?.();try{let i=await r.request(`tasks.cancel`,{taskId:n});if(Yv(e)!==t)return;let a=Li(i);if(a?.task&&t.tasks!==null){let n=Zv(t,a.task);Qv(t,n,`event`);let r=Nr({action:`upserted`,task:n});r&&ny(e,t,r),t.tasks=Vr([n,...t.tasks.filter(e=>e.id!==n.id)])}if(!a?.cancelled){let e=a?.reason?.trim();t.error=e?Ee(e):Y(`tasksPage.cancelFailed`)}}catch(n){Yv(e)===t&&(t.error=Ee(n,Y(`tasksPage.cancelFailed`)))}finally{if(Yv(e)===t){let e=new Set(t.cancellingTaskIds);e.delete(n),t.cancellingTaskIds=e}e.requestUpdate?.()}}}function oy(e){let t=Yv(e);t.collapsed=!t.collapsed,e.requestUpdate?.()}function sy(e,t={}){let n=Yv(e);e.connected||(n.loadedClient=null),t.presented!==!1&&e.connected&&!n.loading&&!n.error&&(n.tasks===null||n.loadedClient!==e.client)&&ey(e,n);let r=Nv({tasks:n.tasks??[],sessionKey:n.sessionKey,terminalObservedAtByTask:n.terminalObservedAtByTask,canonicalizeSessionKey:t=>Ke(e,t)||_(t)||``});return $v(e,n,r.nextExpiryAt),{sessionKey:n.sessionKey,statusRowId:n.statusRowId,collapsed:n.collapsed,narrowLayout:t.narrowLayout===!0,connected:e.connected,canCancel:e.connected&&$t(e.hello?.auth??null),loading:n.loading,error:n.error,tasks:n.tasks,activeCount:n.tasks?.filter(Zo).length??0,subagentActivity:r,openTaskId:t.openTaskId,taskDetails:n.taskDetails,taskDetailErrors:n.taskDetailErrors,taskDetailLoadingIds:n.taskDetailLoadingIds,cancellingTaskIds:n.cancellingTaskIds,finishedCollapsed:n.finishedCollapsed,onToggleCollapsed:()=>oy(e),onToggleFinished:()=>{n.finishedCollapsed=!n.finishedCollapsed,e.requestUpdate?.()},onRefresh:()=>ey(e,n,!0),onCancel:t=>void ay(e,n,t),onLoadDetail:t=>void iy(e,n,t),onOpenTaskDetail:t.onOpenTaskDetail?e=>{if(n.taskDetailErrors.has(e.id)){let t=new Map(n.taskDetailErrors);t.delete(e.id),n.taskDetailErrors=t}t.onOpenTaskDetail?.(e)}:void 0}}var cy,ly,uy;function dy(){return(dy=e((()=>{Pt(),K(),Fe(),ve(),wi(),Mv(),Vv(),Jv(),cy=200,ly=100,uy=0})))()}function fy(e){let t=e.loading?Y(`chat.thread.loadingEarlier`):Y(`chat.thread.showEarlier`);return z`
|
||
<div class="chat-history-boundary ${e.loading?`chat-history-boundary--loading`:``}">
|
||
<span class="chat-history-boundary__line" aria-hidden="true"></span>
|
||
<button
|
||
class="chat-history-boundary__action"
|
||
type="button"
|
||
?disabled=${e.loading}
|
||
aria-busy=${e.loading?`true`:`false`}
|
||
aria-label=${Y(`chat.thread.showEarlier`)}
|
||
@click=${e.onShowEarlier}
|
||
>
|
||
<span role="status">${t}</span>
|
||
</button>
|
||
<span class="chat-history-boundary__line" aria-hidden="true"></span>
|
||
</div>
|
||
`}function py(){return(py=e((()=>{B(),K()})))()}function my(){xy!==null&&(window.clearTimeout(xy),xy=null),yy?.remove(),yy=null,by?.(),by=null}function hy(e,t){if(e.isCollapsed||e.rangeCount===0)return null;let n=e.getRangeAt(0).commonAncestorContainer,r=(n instanceof Element?n:n.parentElement)?.closest(`.chat-bubble`);if(!r||!t.contains(r))return null;let i=e.toString();return i.trim()?i:null}function gy(e,t,n){let r=document.createElement(`button`);r.type=`button`,r.setAttribute(`aria-label`,e);let i=document.createElementNS(`http://www.w3.org/2000/svg`,`svg`);i.setAttribute(`viewBox`,`0 0 24 24`),i.setAttribute(`width`,`14`),i.setAttribute(`height`,`14`),i.setAttribute(`fill`,`none`),i.setAttribute(`stroke`,`currentColor`),i.setAttribute(`stroke-width`,`2`),i.setAttribute(`stroke-linecap`,`round`),i.setAttribute(`stroke-linejoin`,`round`),i.setAttribute(`aria-hidden`,`true`),i.setAttribute(`focusable`,`false`);let a=document.createElementNS(`http://www.w3.org/2000/svg`,`path`);a.setAttribute(`d`,t),i.appendChild(a);let o=document.createElement(`span`);return o.textContent=e,r.append(i,o),r.addEventListener(`pointerdown`,e=>e.preventDefault()),r.addEventListener(`click`,n),r}function _y(e,t,n){my();let r=document.createElement(`div`);r.className=`chat-selection-popup`,r.setAttribute(`role`,`toolbar`),r.setAttribute(`aria-label`,Y(`chat.messages.selectionActions`)),r.addEventListener(`pointerdown`,e=>e.preventDefault());let i=e=>{my(),window.getSelection()?.removeAllRanges(),e(t)};r.append(gy(Y(`chat.messages.moreDetails`),`M12 3v2m0 14v2M5.6 5.6l1.5 1.5m9.8 9.8 1.5 1.5M3 12h2m14 0h2M5.6 18.4l1.5-1.5m9.8-9.8 1.5-1.5`,()=>i(n.onMoreDetails)),gy(Y(`chat.messages.askInSideChat`),`M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z`,()=>i(n.onAskSideChat))),document.body.appendChild(r),yy=r;let a=r.getBoundingClientRect(),o=e.left+e.width/2-a.width/2,s=e.top-a.height-8;s<8&&(s=e.bottom+8),o=Math.min(Math.max(8,o),window.innerWidth-a.width-8),r.style.left=`${o}px`,r.style.top=`${s}px`;let c=e=>{r.contains(e.target)||my()},l=()=>{let e=window.getSelection();(!e||e.isCollapsed)&&my()},u=e=>{e.key===`Escape`&&my()},d=()=>my();document.addEventListener(`pointerdown`,c,!0),document.addEventListener(`selectionchange`,l),document.addEventListener(`keydown`,u),document.addEventListener(`scroll`,d,{capture:!0,passive:!0}),by=()=>{document.removeEventListener(`pointerdown`,c,!0),document.removeEventListener(`selectionchange`,l),document.removeEventListener(`keydown`,u),document.removeEventListener(`scroll`,d,{capture:!0})}}function vy(e,t){let n=e.currentTarget instanceof HTMLElement?e.currentTarget:null;n&&(my(),xy=window.setTimeout(()=>{xy=null;let e=window.getSelection(),r=e?hy(e,n):null;if(!r||!e){my();return}_y(e.getRangeAt(0).getBoundingClientRect(),r,t)},0))}var yy,by,xy;function Sy(){return(Sy=e((()=>{K(),yy=null,by=null,xy=null})))()}function Cy(){return{searchOpen:!1,searchQuery:``,searchFocusPending:!1,searchReturnFocusTarget:null,searchReturnFocusOwner:null,transcriptRenderDependencies:[],transcriptRenderContext:{}}}function wy(e){let t=zy.get(e);if(t)return t;let n=Cy();return zy.set(e,n),n}function Ty(e,t){jy(e),t&&Ql(t),my()}function Ey(e,t){Ty(e,t);let n=zy.get(e);n&&(n.searchOpen=!1,n.searchQuery=``,n.searchFocusPending=!1,n.searchReturnFocusTarget=null,n.searchReturnFocusOwner=null)}function Dy(e,t){Ty(e,t),e?(zy.delete(e),ds(e)):(zy.clear(),ds())}function Oy(e,t){let n=wy(e);return n.searchOpen?z`
|
||
<div class="agent-chat__search-bar">
|
||
${q.search}
|
||
<input
|
||
type="text"
|
||
placeholder=${Y(`chat.thread.searchPlaceholder`)}
|
||
aria-label=${Y(`chat.thread.search`)}
|
||
.value=${n.searchQuery}
|
||
${n.searchFocusPending?U(e=>{e instanceof HTMLInputElement&&(n.searchFocusPending=!1,queueMicrotask(()=>{e.isConnected&&e.focus({preventScroll:!0})}))}):R}
|
||
@input=${e=>{n.searchQuery=e.target.value,t()}}
|
||
/>
|
||
<openclaw-tooltip .content=${Y(`chat.thread.closeSearch`)}>
|
||
<button
|
||
class="btn btn--ghost"
|
||
aria-label=${Y(`chat.thread.closeSearch`)}
|
||
@click=${()=>ky(n,t)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
</div>
|
||
`:R}function ky(e,t){let n=e.searchReturnFocusTarget,r=e.searchReturnFocusOwner;e.searchOpen=!1,e.searchQuery=``,e.searchFocusPending=!1,e.searchReturnFocusTarget=null,e.searchReturnFocusOwner=null,t(),queueMicrotask(()=>{(n?.isConnected?n:r?.querySelector(`.agent-chat__composer-combobox > textarea`))?.focus({preventScroll:!0})})}function Ay(e,t,n){let r=wy(e);if(r.searchOpen){ky(r,t);return}r.searchOpen=!0,r.searchFocusPending=!0;let i=n?.target,a=n?.currentTarget;r.searchReturnFocusTarget=i instanceof HTMLElement&&i.isConnected?i:null,r.searchReturnFocusOwner=a instanceof HTMLElement&&a.isConnected?a:null,t()}function jy(e){if(e&&e!==Vy)return;By&&(Ql(By),By.remove()),By=null,Vy=null;let t=document.querySelector(`.chat-reply-context-menu`);t&&(Ql(t),t.remove()),Hy&&=(document.removeEventListener(`click`,Hy),null),Uy&&=(document.removeEventListener(`contextmenu`,Uy,!0),null),Wy&&=(document.removeEventListener(`keydown`,Wy),null)}function My(e,t){let n=`${e??``}\n${t}`;return`reply:${_o(n).toString(16)}`}function Ny(e){let t=document.createElement(`button`);return t.type=`button`,t.setAttribute(`role`,`menuitem`),t.setAttribute(`aria-label`,Y(`chat.messages.replyToMessage`)),t.textContent=Y(`chat.messages.reply`),t.addEventListener(`click`,e),t}function Py(e){let t=document.createElement(`button`);t.type=`button`,t.disabled=e.disabled,t.setAttribute(`role`,`menuitem`);let n=document.createElement(`span`);n.dataset.copyLabel=``,n.textContent=e.label,t.append(n),t.addEventListener(`click`,e.onClick);let r=document.createElement(`openclaw-tooltip`);return r.content=e.tooltip,r.append(t),{element:r,button:t}}function Fy(e){let t=e.currentTarget,n=e.target;if(e.pointerType!==`touch`||!(t instanceof HTMLElement)||!(n instanceof Element))return;let r=n.closest(`.chat-group--with-footer`);if(!(r instanceof HTMLElement)||!t.contains(r)||n.closest(`a, button, details, input, label, select, textarea, [contenteditable]`))return;let i=window.getSelection();if(i&&!i.isCollapsed)return;let a=!r.classList.contains(`chat-group--meta-revealed`);for(let e of t.querySelectorAll(`.chat-group--meta-revealed`))e.classList.remove(`chat-group--meta-revealed`);r.classList.toggle(`chat-group--meta-revealed`,a)}function Iy(e,t){Fy(e),!(e.button!==0||e.ctrlKey||typeof t.onCompanionQuestion!=`function`||typeof t.onCompanionPrefill!=`function`)&&vy(e,{onMoreDetails:e=>{let n=xa(e);n&&t.onCompanionQuestion?.(n)},onAskSideChat:e=>{let n=Yo(e);n&&t.onCompanionPrefill?.(n)}})}function Ly(e,t){if(!e||e.isCollapsed)return!1;for(let n=0;n<e.rangeCount;n+=1)if(e.getRangeAt(n).intersectsNode(t))return!0;return!1}function Ry(e,t){if(e.composedPath().some(e=>e instanceof HTMLAnchorElement))return;let n=e.target.closest(`.chat-bubble`);if(!n)return;let r=n.closest(`.chat-group`);if(!r||r.querySelector(`.chat-reading-indicator`)||r.querySelector(`.chat-bubble.streaming`))return;let i=r.querySelector(`.chat-sender-name`)?.textContent?.trim()??void 0,a=o(n.dataset.messageText?.trim()??``,500),s=n.dataset.entryId?.trim()??``,c=n.dataset.messageId?.trim()??``,l=r.classList.contains(`user`)&&!!s,u=[...r.querySelectorAll(`[data-message-actions-for]`)].find(e=>e.dataset.messageActionsFor===c),d=u?.querySelector(`.chat-copy-btn`),f=r.dataset.chatRowKey?.startsWith(`agent-run:`)===!0,p=!!(a&&t.onSetReply&&(!f||u)),m=l&&typeof t.onRewindMessage==`function`,h=!!d,g=l&&typeof t.onForkMessage==`function`;if(!p&&!m&&!h&&!g)return;let _=window.getSelection(),v=Ly(_,n)?_?.toString():``;e.preventDefault(),e.stopPropagation(),jy();let y=document.createElement(`div`);y.className=`chat-reply-context-menu`,y.setAttribute(`role`,`menu`),y.setAttribute(`aria-label`,Y(`chat.messages.actions`)),y.style.left=`${e.clientX}px`,y.style.top=`${e.clientY}px`;let b=[];if(v){let e=Py({label:Y(`chat.messages.copySelection`),disabled:!1,tooltip:Y(`chat.messages.copySelection`),onClick:e=>{Sn(e,v,Y(`chat.messages.copySelection`)).then(e=>{e&&jy(t.paneId)})}});y.append(e.element),b.push(e.button)}if(p){let e=c||My(i,a),n=Ny(()=>{t.onSetReply?.({messageId:e,text:a,senderLabel:i,...s?{sourceMessageId:s}:{}}),jy(),t.onFocusComposer?.()});y.append(n),b.push(n)}let x=!!(t.runActive||t.runWorking);if(m){let e=Py({label:Y(`chat.messages.rewindToHere`),disabled:x,tooltip:Y(x?`chat.messages.rewindUnavailable`:`chat.messages.rewindToHere`),onClick:()=>{ru(e.button,()=>{jy(),Promise.resolve(t.onRewindMessage?.(s)).then(e=>{e&&t.onFocusComposer?.()})})}});e.element.classList.add(`chat-confirm-wrap`,`chat-rewind-wrap`),y.append(e.element),b.push(e.button)}if(h){let e=Py({label:bn(),disabled:!1,tooltip:bn(),onClick:()=>{jy(),d?.click()}});y.append(e.element),b.push(e.button)}if(g){let e=Py({label:Y(`chat.messages.forkFromHere`),disabled:x,tooltip:Y(x?`chat.messages.forkUnavailable`:`chat.messages.forkFromHere`),onClick:()=>{jy(),t.onForkMessage?.(s)}});y.append(e.element),b.push(e.button)}document.body.appendChild(y),By=y,Vy=t.paneId;let S=y.getBoundingClientRect(),C=e.clientX,w=e.clientY;C+S.width>window.innerWidth&&(C=window.innerWidth-S.width-8),w+S.height>window.innerHeight&&(w=window.innerHeight-S.height-8),y.style.left=`${Math.max(0,C)}px`,y.style.top=`${Math.max(0,w)}px`,b.find(e=>!e.disabled)?.focus(),requestAnimationFrame(()=>{if(!y.isConnected||By!==y)return;Hy=e=>{y.contains(e.target)||jy()},Uy=e=>{y.contains(e.target)||jy()};let e=e=>{e.key===`Escape`&&(e.preventDefault(),e.stopPropagation(),jy(),t.onFocusComposer?.())};Wy=e,document.addEventListener(`click`,Hy),document.addEventListener(`contextmenu`,Uy,!0),document.addEventListener(`keydown`,e)})}var zy,By,Vy,Hy,Uy,Wy;function Gy(){return(Gy=e((()=>{B(),V(),vn(),J(),G(),K(),ji(),us(),Qh(),Sy(),zy=new Map,By=null,Vy=null,Hy=null,Uy=null,Wy=null})))()}function Ky(e){let t=f(e)?.content;return(Array.isArray(t)?t:[]).flatMap(e=>(Zi(e)??[]).filter(e=>e.type===`attachment_error`)).map(({attachment:e})=>`${e.label}: ${Y(`chat.attachments.notSent`)}. ${nf(e.code)}`).join(` `)||null}function qy(e){let t=Za(e)?.trim();return[Ky(e),t].filter(Boolean).join(` `)||null}function Jy(e,t=qy){if(e.role.toLowerCase()!==`assistant`)return null;for(let n=e.messages.length-1;n>=0;--n){let r=e.messages[n],i=t(r?.message);if(i)return{key:r?.key??e.key,text:i}}return null}function Yy(e){let t=(e,t)=>({key:e,text:o(t,Xy)});for(let n=e.length-1;n>=0;--n){let r=e[n];if(!r)continue;if(r.kind===`agent-run-frame`){if(r.outcome.kind===`completed`){let e=r.outcome.actionOwner,n=e?qy(e.message):null;if(e&&n)return t(e.key,n);for(let e of r.parts.toReversed()){if(e.kind===`stream-run`)continue;let n=e.kind===`group`?[e]:e.groups.toReversed();for(let e of n){let n=Jy(e,Ky);if(n)return t(n.key,n.text)}}continue}if(r.outcome.kind===`failed`)continue;for(let e=r.parts.length-1;e>=0;--e){let n=r.parts[e];if(!n)continue;if(n.kind===`stream-run`){let e=n.parts.findLast(e=>e.kind===`stream`&&e.text.trim());if(e?.kind===`stream`)return t(e.key,e.text.trim());continue}let i=n.kind===`group`?[n]:n.groups.toReversed();for(let e of i){let n=Jy(e);if(n)return t(n.key,n.text)}}continue}let i=r.kind===`group`?[r]:r.kind===`work-group`||r.kind===`activity-run`?r.groups.toReversed():[];for(let e of i){let n=Jy(e);if(n)return t(n.key,n.text)}}return null}var Xy,Zy;function Qy(){return(Qy=e((()=>{K(),ti(),ta(),af(),Xy=500,Zy=class{constructor(){this.text=``}sync(e,t){this.key===void 0||!t?(this.key=e?.key??null,this.text=``):e&&e.key!==this.key&&(this.key=e.key,this.text=e.text)}}})))()}function $y(e){if(!(e instanceof HTMLElement)||typeof getComputedStyle!=`function`)return 0;let t=Number.parseFloat(getComputedStyle(e).paddingTop);return Number.isFinite(t)?t:0}function eb(e,t){return $y(e)+t}function tb(e,t,n){let r=eb(e,n);r!==t.options.scrollMargin&&t.setOptions({...t.options,scrollMargin:r})}function nb(e){let t=e instanceof HTMLElement?e.clientWidth:0,n=e instanceof HTMLElement?e.clientHeight:0;return{width:t||(typeof window>`u`?0:window.innerWidth),height:n||(typeof window>`u`?0:window.innerHeight)}}function rb(e,t){let n=e?.getBoundingClientRect();if(!(!e||t.scrollElement!==e||!n?.width||!n.height))for(let n of e.querySelectorAll(`.chat-virtual-row`))t.resizeItem(t.indexFromElement(n),n.offsetHeight)}function ib(e){return e?Math.max(0,e.scrollHeight-e.clientHeight):null}function ab(e){let t=e.target,n=(t instanceof Element?t.closest(`button[aria-expanded], button[aria-pressed], summary`):null)?.closest(`.chat-virtual-row`);return n?{row:n,top:n.getBoundingClientRect().top}:null}function ob(e,t,n,r){if(!e)return!0;let i=e.row;if(i.closest(`.sidebar-region__right-runtime`)&&!(t instanceof Element&&t.contains(i)))return!1;if(!i.isConnected||!n?.contains(i))return!0;let a=r.indexFromElement(i),o=r.options;return r.setOptions({...o,anchorTo:`start`}),r.resizeItem(a,i.offsetHeight),r.setOptions(o),n.scrollTop+=i.getBoundingClientRect().top-e.top,!0}function sb({rows:e,renderRow:t,virtualizer:n,overlay:r,header:i,scrollElementRef:a,captureInteractionResize:o,measureRowRefFor:s}){let c=n.getVirtualItems();return z`
|
||
<div
|
||
class="chat-thread-inner chat-thread-inner--virtual"
|
||
${U(a)}
|
||
@click=${{handleEvent:o,capture:!0}}
|
||
>
|
||
${i}
|
||
<div
|
||
class="chat-virtual-sizer"
|
||
style=${st({height:`${n.getTotalSize()}px`})}
|
||
>
|
||
${r}
|
||
<div
|
||
class="chat-virtual-block"
|
||
style=${st({transform:`translateY(${(c[0]?.start??n.options.scrollMargin)-n.options.scrollMargin}px)`})}
|
||
>
|
||
${ht(c,e=>e.key,(n,r)=>{let i=e[n.index];if(!i)return R;let a=c[r-1],o=a&&n.index>a.index+1?n.start-a.end:0;return z`
|
||
${o>0?z`<div aria-hidden="true" style=${st({height:`${o}px`})}></div>`:R}
|
||
<div
|
||
class="chat-virtual-row ${n.index===0?`chat-virtual-row--first`:``}"
|
||
style=${st({containIntrinsicBlockSize:`auto ${n.size}px`})}
|
||
data-index=${String(n.index)}
|
||
data-virtual-row-key=${i.key}
|
||
${U(s(i.key))}
|
||
>
|
||
${t(i)}
|
||
</div>
|
||
`})}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`}function cb(){return(cb=e((()=>{B(),V(),vt(),it()})))()}function lb(e,t,n){let r=Rn(e),i=n===null?void 0:t.get(n);return i===void 0||i<0||i>=e.count||r.includes(i)?r:[...r,i].toSorted((e,t)=>e-t)}function ub(e,t,n){let r=new Map(t.map((e,t)=>[e,t])),i=new Wn({...e.options,initialMeasurementsCache:e.takeSnapshot(),initialOffset:e.scrollOffset??e.options.initialOffset,initialRect:e.scrollRect??e.options.initialRect,onChange:()=>void 0,rangeExtractor:e=>lb(e,r,n)});return i.scrollElement=e.scrollElement,i.setOptions({...i.options,count:t.length,getItemKey:e=>t[e]??`missing:${e}`}),new Set(i.getVirtualIndexes().flatMap(e=>t[e]??[]))}function db(e,t){if(!(t instanceof Element)||!e?.contains(t))return null;let n=t.closest(`.chat-virtual-row[data-virtual-row-key]`);return n&&e.contains(n)&&n.dataset.virtualRowKey||null}function fb(){return(fb=e((()=>{qn()})))()}var pb;function mb(){return(mb=e((()=>{Jn(),qn(),B(),Mn(),Ws(),ec(),Qy(),cb(),fb(),pb=class{get scrollElement(){let e=this.threadInnerElement?.parentElement;return this.connected&&e instanceof HTMLDivElement&&e.isConnected?e:null}queueScrollElementAttach(){this.scrollElementAttachQueued||(this.scrollElementAttachQueued=!0,queueMicrotask(()=>{this.scrollElementAttachQueued=!1;let e=this.virtualizerController.getVirtualizer();this.connected&&e.scrollElement!==this.scrollElement&&(this.virtualizerController.hostUpdated(),this.host.requestUpdate())}))}measureConnectedRows(){rb(this.scrollElement,this.virtualizerController.getVirtualizer())}queueConnectedRowMeasure(){if(this.pendingRowMeasureFrame!==null)return;let e=this.scrollElement;this.pendingRowMeasureFrame=requestAnimationFrame(()=>{this.pendingRowMeasureFrame=null,e===this.scrollElement&&this.measureConnectedRows()})}measureRowRefFor(e){let t=this.measureRowRefs.get(e);return t||(t=t=>{if(t instanceof HTMLElement){t.isConnected?this.virtualizerController.getVirtualizer().measureElement(t):queueMicrotask(()=>{t.isConnected&&this.threadInnerElement?.contains(t)&&t.dataset.virtualRowKey===e&&this.rowIndexesByKey.has(e)&&this.virtualizerController.getVirtualizer().measureElement(t)});return}this.pruneDetachedRowsQueued||(this.pruneDetachedRowsQueued=!0,queueMicrotask(()=>{this.pruneDetachedRowsQueued=!1,this.virtualizerController.getVirtualizer().measureElement(null)}))},this.measureRowRefs.set(e,t)),t}constructor(e,t=null,n,r={}){this.host=e,this.callbacks=r,this.controllers=new Set,this.threadInnerElement=null,this.connected=!1,this.observedWidth=null,this.observedHeight=null,this.contentReady=!1,this.headerHeight=0,this.appliedHeaderHeight=0,this.pendingScrollOffset=null,this.pendingScrollFrame=null,this.scrollCommand=null,this.scrollElementRef=e=>{let t=e instanceof HTMLDivElement?e:null;t!==this.threadInnerElement&&(this.threadInnerElement=t,this.queueScrollElementAttach())},this.scrollElementAttachQueued=!1,this.measureRowRefs=new Map,this.pruneDetachedRowsQueued=!1,this.pendingRowMeasureFrame=null,this.pendingInteractionAnchor=null,this.captureInteractionResize=e=>{let t=ab(e);t&&(this.pendingInteractionAnchor=t,queueMicrotask(()=>this.pendingInteractionAnchor===t&&this.host.requestUpdate()))},this.handleGeometryCommit=e=>{if(this.reconcileInteractionResize(e.target),e instanceof CustomEvent&&e.detail?.widthChanged===!1)return;let t=this.scrollElement?.getBoundingClientRect();!t||t.width===0||t.height===0||(this.observedWidth=Math.round(t.width),this.measureConnectedRows())},this.rowKeys=[],this.rowIndexesByKey=new Map,this.messageRowKeysById=new Map,this.focusedRowKey=null,this.announcement=new Zy,this.mcpAppUnmountGate=new Cn(this),this.requestUpdate=()=>this.host.requestUpdate(),this.implicitEndAnchorPending=t===null,this.virtualizerController=new Kn(this,{count:0,getScrollElement:()=>this.scrollElement,estimateSize:()=>120,getItemKey:()=>``,initialRect:nb(e),initialOffset:t??2**53-1,anchorTo:`end`,followOnAppend:!1,observeElementRect:(e,t)=>Gn(e,n=>{if(e.scrollElement!==this.scrollElement||!n.width||!n.height)return;let r=this.observedHeight,i=this.observedWidth!==null&&this.observedWidth!==n.width,a=r!==null&&r!==n.height;this.observedWidth=n.width,this.observedHeight=n.height,tb(e.scrollElement,e,this.appliedHeaderHeight),t(n),i&&(this.measureConnectedRows(),this.queueConnectedRowMeasure()),(i||a)&&this.callbacks.onViewportResize?.()}),observeElementOffset:(e,t)=>{let n=this.scrollElement,r=t=>{n===this.scrollElement&&e.scrollElement===n&&(t instanceof KeyboardEvent&&![`ArrowUp`,`ArrowDown`,`PageUp`,`PageDown`,`Home`,`End`,` `].includes(t.key)||t instanceof PointerEvent&&t.target!==n||(this.pendingInteractionAnchor=null,this.cancelScroll(),this.callbacks.onReaderScroll?.()))};for(let e of[`wheel`,`touchstart`,`keydown`,`pointerdown`])n?.addEventListener(e,r,{passive:!0});let i=Bn(e,(e,r)=>{n===this.scrollElement&&(t(e,r),!r&&Math.abs((ib(n)??0)-(n?.scrollTop??0))<=1&&this.scrollCommand?.target===`end`&&(this.scrollCommand.behavior===`smooth`?this.cancelScroll():this.scrollCommand=null))});return()=>{i?.();for(let e of[`wheel`,`touchstart`,`keydown`,`pointerdown`])n?.removeEventListener(e,r)}},measureElement:Yn,rangeExtractor:e=>lb(e,this.rowIndexesByKey,this.focusedRowKey),scrollEndThreshold:-1,overscan:6}),t!==null&&(this.pendingScrollOffset={offset:t,stableFrames:0,zeroMaxFrames:0,onSettled:n})}get updateComplete(){return this.host.updateComplete}get liveAnnouncementText(){return this.announcement.text}addController(e){this.controllers.add(e)}removeController(e){this.controllers.delete(e)}connect(){if(!this.connected){this.connected=!0,this.host instanceof HTMLElement&&this.host.addEventListener(cc,this.handleGeometryCommit);for(let e of this.controllers)e.hostConnected?.();this.pendingScrollOffset&&this.host.requestUpdate()}}update(){for(let e of this.controllers)e.hostUpdated?.();this.reconcileInteractionResize(),this.reconcileImplicitEndAnchor(),this.applyPendingScrollOffset()}disconnect(){if(this.scrollCommand=null,this.pendingRowMeasureFrame!==null&&(cancelAnimationFrame(this.pendingRowMeasureFrame),this.pendingRowMeasureFrame=null),this.pendingScrollFrame!==null&&(cancelAnimationFrame(this.pendingScrollFrame),this.pendingScrollFrame=null),!this.connected){this.threadInnerElement=null;return}this.connected=!1,this.host instanceof HTMLElement&&this.host.removeEventListener(cc,this.handleGeometryCommit);for(let e of this.controllers)e.hostDisconnected?.();this.threadInnerElement=null}dispose(){this.disconnect(),this.measureRowRefs.clear(),this.rowKeys=[],this.rowIndexesByKey.clear(),this.messageRowKeysById.clear(),this.focusedRowKey=null,this.pendingScrollOffset=null}render(e,t,n,r,i=R,a=null){let o=e.map(e=>e.key),s=o.length!==this.rowKeys.length||o.some((e,t)=>e!==this.rowKeys[t]),c=this.virtualizerController.getVirtualizer(),l=s?o:c.getVirtualItems().flatMap(({index:t})=>e[t]?.key??[]);return this.mcpAppUnmountGate.render(s?o:JSON.stringify(l),()=>(this.headerHeight=a?.height??0,s?this.syncRows(o):this.syncHeaderMargin(),this.announcement.sync(n,r),sb({rows:e,renderRow:t,virtualizer:c,overlay:i,header:a?.template??R,scrollElementRef:this.scrollElementRef,captureInteractionResize:this.captureInteractionResize,measureRowRefFor:e=>this.measureRowRefFor(e)})),()=>{let e=new Set([...this.threadInnerElement?.querySelectorAll(`mcp-app-view`)??[]].flatMap(e=>e.closest(`.chat-virtual-row`)??[]));if(e.size===0)return[];let t=s?ub(c,o,this.focusedRowKey):new Set(l);return[...e].filter(e=>!t.has(e.dataset.virtualRowKey??``))})}get isProgrammaticScroll(){let e=this.scrollElement,t=(ib(e)??0)-(e?.scrollTop??0);return this.pendingScrollOffset!==null||this.scrollCommand!==null&&t>8}scrollToEnd({source:e=`manual`,behavior:t=`auto`}={}){return e===`auto`&&this.pendingScrollOffset?!1:(this.cancelScroll(),this.scrollCommand={behavior:t,target:`end`},this.virtualizerController.getVirtualizer().scrollToEnd({behavior:t}),!0)}cancelScroll(){if(this.scrollCommand===null&&!this.pendingScrollOffset)return;this.scrollCommand?.behavior===`smooth`&&this.queueConnectedRowMeasure(),this.scrollCommand=null,this.pendingScrollOffset=null,this.pendingScrollFrame!==null&&(cancelAnimationFrame(this.pendingScrollFrame),this.pendingScrollFrame=null);let e=this.scrollElement;e&&this.virtualizerController.getVirtualizer().scrollToOffset(e.scrollTop,{behavior:`instant`})}syncMessageRows(e){this.messageRowKeysById=new Map(e)}revealMessage(e){let t=this.messageRowKeysById.get(e),n=t?this.rowIndexesByKey.get(t):void 0;if(n===void 0)return!1;this.cancelScroll();let r=this.scrollCommand={behavior:ha(),target:`index`};return this.virtualizerController.getVirtualizer().scrollToIndex(n,{align:`center`}),this.host.requestUpdate(),this.host.updateComplete.then(()=>{if(this.scrollCommand!==r)return;let t=[...this.threadInnerElement?.querySelectorAll(`.chat-bubble`)??[]].find(t=>t.dataset.entryId===e);t&&(this.threadInnerElement?.querySelector(`.chat-bubble--reply-target`)?.classList.remove(`chat-bubble--reply-target`),t.scrollIntoView?.({behavior:r.behavior,block:`center`}),t.classList.add(`chat-bubble--reply-target`),t.addEventListener(`animationend`,()=>t.classList.remove(`chat-bubble--reply-target`),{once:!0}))}),!0}setContentReady(e){this.contentReady=e}restoreScrollOffset(e,t){this.cancelScroll(),this.implicitEndAnchorPending=!1,this.pendingScrollOffset={offset:e,stableFrames:0,zeroMaxFrames:0,onSettled:t},this.connected&&this.host.requestUpdate()}handleFocusIn(e){this.focusedRowKey=db(this.scrollElement,e.target)}handleFocusOut(e){this.focusedRowKey=db(this.scrollElement,e.relatedTarget)}reconcileInteractionResize(e){let t=this.virtualizerController.getVirtualizer();ob(this.pendingInteractionAnchor,e,this.scrollElement,t)&&(this.pendingInteractionAnchor=null)}syncRows(e){let t=this.virtualizerController.getVirtualizer(),n=!this.rowIndexesByKey.has(`presence:typing`)&&e.includes(`presence:typing`)&&!this.pendingScrollOffset&&t.isAtEnd(8);this.rowKeys=Object.freeze(e);let r=new Map(this.rowKeys.map((e,t)=>[e,t]));this.rowIndexesByKey=r;for(let e of this.measureRowRefs.keys())this.rowIndexesByKey.has(e)||this.measureRowRefs.delete(e);this.appliedHeaderHeight=this.headerHeight,t.setOptions({...t.options,count:e.length,getItemKey:t=>e[t]??`missing:${t}`,followOnAppend:!1,rangeExtractor:e=>lb(e,r,this.focusedRowKey),scrollMargin:eb(this.scrollElement,this.headerHeight)}),n&&(this.cancelScroll(),this.scrollCommand={behavior:`auto`,target:`index`},t.scrollToIndex(e.indexOf(`presence:typing`),{align:`end`}))}syncHeaderMargin(){if(this.headerHeight===this.appliedHeaderHeight)return;let e=this.headerHeight-this.appliedHeaderHeight;this.appliedHeaderHeight=this.headerHeight;let t=this.virtualizerController.getVirtualizer();t.setOptions({...t.options,scrollMargin:eb(this.scrollElement,this.headerHeight)});let n=t.scrollOffset,r=n===null?null:Math.max(0,n+e);r!==null&&r!==n&&(t.scrollOffset=r,t.scrollToOffset(r))}reconcileImplicitEndAnchor(){if(!this.implicitEndAnchorPending||!this.connected||!this.contentReady)return;let e=ib(this.scrollElement),t=this.virtualizerController.getVirtualizer(),n=t.scrollOffset;if(e!==null&&n!==null){if(n>=0&&n<=e){this.implicitEndAnchorPending=!1;return}e===0&&(this.implicitEndAnchorPending=!1,t.scrollOffset=0,t.scrollToOffset(0),this.host.requestUpdate())}}applyPendingScrollOffset(){let e=this.pendingScrollOffset;if(!e||!this.connected)return;if(this.contentReady&&this.rowKeys.length===0){this.settlePendingScroll(0);return}let t=ib(this.scrollElement);if(t===null)return;if(t===0&&e.offset>0){this.contentReady&&(++e.zeroMaxFrames>60?this.settlePendingScroll(0):this.schedulePendingScrollRetry());return}e.zeroMaxFrames=0;let n=Math.min(e.offset,t);this.scrollElement&&(this.scrollElement.scrollTop=n),this.virtualizerController.getVirtualizer().scrollToOffset(n);let r=this.scrollElement?.scrollTop;e.stableFrames=r!=null&&Math.abs(r-n)<=1?e.stableFrames+1:0,r!=null&&e.stableFrames>12?this.settlePendingScroll(r):this.schedulePendingScrollRetry()}schedulePendingScrollRetry(){!this.connected||this.pendingScrollFrame!==null||(this.pendingScrollFrame=requestAnimationFrame(()=>{this.pendingScrollFrame=null,this.connected&&this.pendingScrollOffset&&this.host.requestUpdate()}))}settlePendingScroll(e){let t=this.pendingScrollOffset;if(this.pendingScrollOffset=null,!t)return;let n=ib(this.scrollElement);t.onSettled?.({scrollTop:e,anchorToEnd:n===null?this.contentReady&&this.rowKeys.length===0:n-e<=8}),this.callbacks.onReaderScroll?.()}}})))()}var hb;function gb(){return(gb=e((()=>{ve(),Ws(),mb(),hb=class{constructor(e,t={}){this.host=e,this.callbacks=t,this.activeSessionKey=null,this.sessionVirtualizer=null,this.connected=!1,e.addController(this)}get renderedSessionKey(){return this.activeSessionKey}renderSession(e,t,n){if(!this.sessionVirtualizer||this.activeSessionKey===null||!Ne(this.activeSessionKey,t)){this.sessionVirtualizer?.dispose();let n=oc(e,t),r=n?.anchorToEnd?null:n?.scrollTop??null;this.activeSessionKey=t,this.sessionVirtualizer=new pb(this.host,r,n=>Ys(e,t,n),this.callbacks),this.connected&&this.sessionVirtualizer.connect()}return n(this.sessionVirtualizer)}get isProgrammaticScroll(){return this.sessionVirtualizer?.isProgrammaticScroll??!1}scrollToEnd(e={}){return this.sessionVirtualizer?.scrollToEnd(e)??!1}scrollToOffset(e,t){this.sessionVirtualizer?.restoreScrollOffset(e,t)}revealMessage(e){return this.sessionVirtualizer?.revealMessage(e)??!1}get scrollElement(){return this.sessionVirtualizer?.scrollElement??null}hostConnected(){this.connected=!0,this.sessionVirtualizer?.connect()}hostUpdated(){this.sessionVirtualizer?.update()}hostDisconnected(){this.connected=!1,this.sessionVirtualizer?.disconnect()}}})))()}function _b(e,t){let n=cs(e);if(n)return Ih(n,{...t.streamOptions,questionPrompts:t.questionPrompts});let r=ls(e),i=r.find(e=>e.role===`assistant`),a=e.outcome.kind===`completed`?e.outcome.actionOwner:null,o=i??r[0],s=e.parts.flatMap(e=>e.kind===`stream-run`?e.parts.map(e=>e.startedAt):[]),c={key:e.key,kind:`group`,role:`assistant`,senderLabel:i?.senderLabel,replyToSender:i?.replyToSender,messages:o?.messages??[],timestamp:Math.min(...r.map(e=>e.timestamp),...s,Date.now()),isStreaming:e.outcome.kind===`active`,runId:e.runId},l=e=>Wh(e,t.renderGroupOptions(e)),u=e.parts.map(e=>{if(e.kind===`stream-run`)return Fh(e.parts,t.streamOptions,`standalone`);if(e.kind===`work-group`){let n=t.isWorkExpanded(e.key);return z`
|
||
${Lh(e,{expanded:n,onToggle:()=>t.onToggleWork(e.key,n),presentation:`continuation`,browserTabPreviews:nm(e.groups,t.renderGroupOptions(c))})}
|
||
${n?e.groups.map(l):R}
|
||
`}if(e.kind===`activity-run`){let n=e.groups[0];return n?Hh(e.groups,t.renderGroupOptions(n),`continuation`):R}return l(e)});return Gh(c,{...t.renderGroupOptions(c),frameContent:u,frameActionOwner:a,turnRecap:t.turnRecap})}function vb(){return(vb=e((()=>{B(),Fs(),Qh(),Xm()})))()}function yb(e){let t=e.filter(Zo);if(t.length===0)return null;let n=null;for(let e of t){let t=vi(e.startedAt??e.createdAt);t>0&&(n===null||t<n)&&(n=t)}return{count:t.length,startedMs:n}}function bb(e){let t=Zo(e),n=jv[e.status],r=vi(t?e.startedAt??e.createdAt:e.updatedAt??e.createdAt);return z`
|
||
<div class="chat-tasks-preview__row">
|
||
${e.status===`running`?z`<span class="chat-tasks-rail__task-pulse" aria-hidden="true"></span>`:R}
|
||
<span class="chat-tasks-preview__title">${tr(e)}</span>
|
||
<span class="chat-tasks-preview__meta">
|
||
<span class="chat-tasks-rail__task-status chat-tasks-rail__task-status--${n}"
|
||
>${sa(e.status)}</span
|
||
>
|
||
${r>0?z`<span class="chat-tasks-rail__task-sep" aria-hidden="true">·</span>
|
||
<span>
|
||
${t?z`<openclaw-elapsed-time .startMs=${r}></openclaw-elapsed-time>`:_e(r)}
|
||
</span>`:R}
|
||
</span>
|
||
</div>
|
||
`}function xb(e){let{active:t,recent:n}=So(e),r=[...t,...n],i=r.slice(0,Cb),a=r.length-i.length;return z`
|
||
<div slot="content" class="chat-tasks-preview">
|
||
<div class="chat-tasks-preview__heading">
|
||
<span>${Y(`chat.backgroundTasks.title`)}</span>
|
||
<span>${Y(`chat.backgroundTasks.running`,{count:String(t.length)})}</span>
|
||
</div>
|
||
${i.map(e=>bb(e))}
|
||
${a>0?z`<div class="chat-tasks-preview__more">
|
||
${Y(`chat.backgroundTasks.statusPreviewMore`,{count:String(a)})}
|
||
</div>`:R}
|
||
</div>
|
||
`}function Sb(e){if(!e?.connected)return R;let t=Rv(e.subagentActivity,e.onOpenTaskDetail),n=(e.tasks??[]).filter(t=>!e.subagentActivity.taskIds.has(t.id)),r=yb(n);if(t===R&&!r)return R;if(!r)return t;let i=r.count===1?Y(`chat.backgroundTasks.statusRunningOne`):Y(`chat.backgroundTasks.statusRunningMany`,{count:String(r.count)}),a=z`
|
||
<div class="chat-tasks-status" id=${e.statusRowId}>
|
||
<span class="chat-tasks-status__claw" aria-hidden="true">${q.claw}</span>
|
||
${r.startedMs===null?R:z`
|
||
<span class="chat-tasks-status__time" aria-hidden="true">
|
||
<openclaw-elapsed-time .startMs=${r.startedMs}></openclaw-elapsed-time>
|
||
</span>
|
||
<span class="chat-tasks-status__sep" aria-hidden="true">·</span>
|
||
`}
|
||
<span class="sr-only" role="status">${i}</span>
|
||
<openclaw-tooltip class="chat-tasks-status__preview">
|
||
<button class="chat-tasks-status__link" type="button" @click=${()=>{e.collapsed&&e.onToggleCollapsed()}}>${i}</button>
|
||
${xb(n)}
|
||
</openclaw-tooltip>
|
||
</div>
|
||
`;return t===R?a:z`${t}${a}`}var Cb;function wb(){return(wb=e((()=>{B(),ri(),J(),G(),K(),Je(),wi(),Mv(),Vv(),Cb=5})))()}function Tb(e){let t=e.realtimeTalkConversation??[];return t.length===0?R:z`
|
||
<div
|
||
class="agent-chat__voice-turns"
|
||
role="log"
|
||
aria-label=${Y(`chat.composer.voiceTranscript`)}
|
||
>
|
||
${ht(t,e=>e.id,t=>{let n=t.role===`user`?e.userName?.trim()||`You`:e.assistantName;return z`
|
||
<div
|
||
class="agent-chat__voice-turn agent-chat__voice-turn--${t.role}"
|
||
data-role=${t.role}
|
||
>
|
||
<span class="agent-chat__voice-turn-speaker">${n}</span>
|
||
<span class="agent-chat__voice-turn-text">${t.text}</span>
|
||
${t.isStreaming?z`<span
|
||
class="agent-chat__voice-turn-stream"
|
||
aria-label=${Y(`chat.composer.stillListening`)}
|
||
></span>`:R}
|
||
</div>
|
||
`})}
|
||
</div>
|
||
`}function Eb(){return(Eb=e((()=>{B(),vt(),K()})))()}function Db(e){return e.kind===`stream-run`?[e.key,...e.parts]:e.kind===`work-group`?[e.key,e.durationMs,...e.groups]:e.kind===`activity-run`?[e.key,...e.groups]:e.kind===`agent-run-frame`?[e.key,e.outcome,...e.parts]:[e]}function Ob(e,t){let n=e.transcriptRenderDependencies,r=t.length-1,i=n.length!==r;for(let e=0;!i&&e<r;e+=1)i=!Object.is(n[e],t[e+1]);return i&&(e.transcriptRenderDependencies=t.slice(1),e.transcriptRenderContext={}),t}function kb(e,t,n){return r=>mt([...Db(r),e.transcriptRenderContext,t(r)],()=>n(r))}function Ab(){return(Ab=e((()=>{pt()})))()}function jb(e){if(!e?.length)return null;let t=e.filter(e=>e.preview?.trim()),n=e.filter(e=>!e.preview?.trim()),r=e.length===1?Y(`chat.sessionSuggestions.typing`,{name:e[0]?.label??``}):Y(`chat.sessionSuggestions.typingMany`,{names:e.map(e=>e.label).join(`, `)});return z`<div class="agent-chat__typing-indicator agent-chat__typing-indicator--outside">
|
||
${t.map(e=>z`<div class="agent-chat__typing-preview-row">
|
||
${js(`user`,void 0,void 0,void 0,void 0,{id:e.id,name:e.label})}
|
||
<div class="agent-chat__typing-preview-content">
|
||
<span class="agent-chat__typing-preview-label">
|
||
${Y(`chat.sessionSuggestions.typing`,{name:e.label})}
|
||
</span>
|
||
<span class="agent-chat__typing-preview-bubble">${e.preview}</span>
|
||
</div>
|
||
</div>`)}
|
||
${n.length?z`<div class="agent-chat__typing-dots-row">
|
||
<span class="agent-chat__typing-avatars" aria-hidden="true">
|
||
${n.slice(0,3).map(e=>js(`user`,void 0,void 0,void 0,void 0,{id:e.id,name:e.label}))}
|
||
</span>
|
||
<span class="agent-chat__typing-bubble" aria-hidden="true">
|
||
<svg class="agent-chat__typing-tail" viewBox="0 0 12 12">
|
||
<path d="M12 0c-.5 5.5-3.5 9.5-11 11 4.5-3.5 5.5-7 5.5-11H12Z"></path>
|
||
</svg>
|
||
<span></span><span></span><span></span>
|
||
</span>
|
||
</div>`:null}
|
||
<span class="sr-only" role="status">${r}</span>
|
||
</div>`}function Mb(){return(Mb=e((()=>{B(),K(),xs()})))()}function Nb(e){return Ie(e.assistantAvatarUrl,{identity:{avatar:e.assistantAvatar??void 0,avatarUrl:e.assistantAvatarUrl??void 0}})}function Pb(e){return Nb(e)??Ue(e.assistantAvatar)}function Fb(e){if(!e.sessions)return[];let t=e.sessionHost??{},n=te(t),r=D(e.sessionKey)?.agentId??n;return Le(e.sessions,{agentId:r,defaultAgentId:n,filterByAgent:!0}).filter(t=>!Ne(t.key,e.sessionKey)&&!Ye(t.key,t.channel).channelSession).toSorted((e,t)=>(t.updatedAt??0)-(e.updatedAt??0)||e.key.localeCompare(t.key)).slice(0,Hb)}function Ib(){return z`
|
||
<div class="agent-chat__welcome-clawd" aria-hidden="true">
|
||
<openclaw-mascot mood="idle" .size=${112}></openclaw-mascot>
|
||
</div>
|
||
`}function Lb(e,t){return z`
|
||
<div class="agent-chat__recents">
|
||
<div class="agent-chat__recents-title">${Y(`chat.welcome.recentSessions`)}</div>
|
||
${e.map(e=>{let n=O(e);return z`
|
||
<button type="button" class="agent-chat__recent" @click=${()=>t?.(e.key)}>
|
||
<span class="agent-chat__recent-name">${de(e.key,e)}</span>
|
||
${n?z`<span class="agent-chat__recent-sub">${n}</span>`:R}
|
||
<span class="agent-chat__recent-time">
|
||
${_e(e.updatedAt,{fallback:``})}
|
||
</span>
|
||
</button>
|
||
`})}
|
||
</div>
|
||
`}function Rb(e){return z`
|
||
<div class="agent-chat__suggestions">
|
||
${Vb.map(t=>{let n=Y(t);return z`
|
||
<button
|
||
type="button"
|
||
class="agent-chat__suggestion"
|
||
@click=${()=>{e.onDraftChange(n),e.onSend()}}
|
||
>
|
||
${n}
|
||
</button>
|
||
`})}
|
||
</div>
|
||
`}function zb(e){let t=e.assistantName||`Assistant`,n=Nb(e),r=n?null:Ue(e.assistantAvatar);return z`
|
||
<div class="agent-chat__welcome-identity">
|
||
${n?z`<img class="agent-chat__welcome-avatar" src=${n} alt=${t} />`:r?z`<div class="agent-chat__avatar agent-chat__avatar--text" aria-label=${t}>
|
||
${r}
|
||
</div>`:Ib()}
|
||
<div class="agent-chat__welcome-identity-copy">
|
||
<h2>${t}</h2>
|
||
<p class="agent-chat__hint">${e.hint}</p>
|
||
</div>
|
||
</div>
|
||
`}function Bb(e){if(e.modelSetupRequired)return z`
|
||
<div class="agent-chat__welcome agent-chat__welcome--setup" role="alert">
|
||
${Ib()}
|
||
<h2>${Y(`modelSetup.required.title`)}</h2>
|
||
<p class="agent-chat__hint">${Y(`modelSetup.required.body`)}</p>
|
||
<button class="btn primary" type="button" @click=${e.onModelSetup}>
|
||
${Y(`modelSetup.required.action`)}
|
||
</button>
|
||
</div>
|
||
`;let t=Fb(e),n=0,r=e=>{let t=e.currentTarget;return t instanceof HTMLElement?t.querySelector(`.agent-chat__welcome-clawd openclaw-mascot`):null};return z`
|
||
<div
|
||
class="agent-chat__welcome"
|
||
style="--agent-color: var(--accent)"
|
||
@dragenter=${e=>{if(!Array.from(e.dataTransfer?.types??[]).includes(`Files`))return;n+=1;let t=r(e);t&&(t.tease=!0)}}
|
||
@dragleave=${e=>{n=Math.max(0,n-1);let t=r(e);t&&n===0&&(t.tease=!1)}}
|
||
@drop=${e=>{if(!Array.from(e.dataTransfer?.types??[]).includes(`Files`))return;n=0;let t=r(e);t&&(t.tease=!1,t.catchOnce())}}
|
||
>
|
||
${zb({assistantName:e.assistantName,assistantAvatar:e.assistantAvatar,assistantAvatarUrl:e.assistantAvatarUrl,hint:e.hint??z`${Y(`chat.welcome.hintBeforeShortcut`)} <kbd>/</kbd> ${Y(`chat.welcome.hintAfterShortcut`)}`})}
|
||
${e.composer??R}
|
||
${e.hideSecondaryContent?R:z`<div
|
||
class="agent-chat__welcome-secondary ${e.fadeSecondaryContent?`agent-chat__welcome-secondary--hidden`:``}"
|
||
aria-hidden=${e.fadeSecondaryContent?`true`:`false`}
|
||
?inert=${e.fadeSecondaryContent}
|
||
>
|
||
<div class="agent-chat__welcome-secondary-inner">
|
||
${t.length>0?Lb(t,e.onOpenSession):Rb(e)}
|
||
</div>
|
||
</div>`}
|
||
</div>
|
||
`}var Vb,Hb;function Ub(){return(Ub=e((()=>{B(),On(),K(),F(),Je(),Qe(),He(),ve(),Vb=[`chat.welcome.suggestions.whatCanYouDo`,`chat.welcome.suggestions.summarizeRecentSessions`,`chat.welcome.suggestions.configureChannel`,`chat.welcome.suggestions.checkSystemHealth`],Hb=5})))()}function Wb(e,t,n){let r=Ur(e),i=zf(e,r);if(!i)return;let a={kind:`group`,key:t,role:r.role,senderLabel:r.senderLabel,...r.sender?{sender:r.sender}:{},messages:[{key:t,message:e}],timestamp:r.timestamp,isStreaming:!1},o=bs(e)??t;return{messageId:o,sourceMessageId:o,senderLabel:Uh(a,n),text:i}}function Gb(e,t){let n=wy(e.paneId),r=e.onRequestUpdate??(()=>{}),i=e.stream??null,a=e.sessionHost??null,o=e.selectedSession,s=D(e.sessionKey)?.rest===`global`||a!==null&&ue(a)&&oe(a,e.sessionKey)!==null,c=o?.reasoningLevel??`off`,l=e.showThinking&&c!==`off`,u={name:e.assistantName,avatar:Pb(e)},d=un.getLocale(),f=n.searchOpen&&!!n.searchQuery.trim(),p=o?.archivedBy,m=o?.archived&&o.archivedAt!==void 0&&p?.id?{kind:`notice`,key:`archive:${o.sessionId??o.key}:${o.archivedAt}`,label:Y(`sessionsView.archivedBy`,{name:p.label??p.id}),text:``,timestamp:o.archivedAt}:void 0,h=as({paneId:e.paneId,sessionKey:e.sessionKey,archiveNotice:m,runId:e.runId??null,locale:d,messages:e.messages,toolMessages:e.toolMessages,guardianNotices:e.guardianNotices,streamSegments:e.streamSegments,stream:i,streamStartedAt:e.streamStartedAt,queue:e.queue,pendingInputs:e.pendingInputs,showToolCalls:e.showToolCalls,persistCommentary:e.persistCommentary,runWorking:!!e.runWorking,runActive:!!e.runActive,questionPrompts:e.questionPrompts,loading:e.loading,searchOpen:n.searchOpen,searchQuery:n.searchQuery});e.showToolCalls&&!f&&Is(is(h));let g=e.browserTabPreviewsActive===!1?Ao([],[]):Ao(e.messages,e.toolMessages);os(e.sessionKey,h,!!e.autoExpandToolCalls,f||!e.showToolCalls);let _=Ds(e.sessionKey),v=ns(e.sessionKey),y=fs(e.sessionKey),b=new Map((e.questionPrompts??[]).map(e=>[e.id,e])),x=(e,t)=>{ps(_,e,!(t??_.get(e)??!1)),r()},S=t=>{let n=y.get(t),i=e.loadFullAssistantMessage;if(!i||n?.status===`loading`)return;let a=(n?.revision??0)+1;y.set(t,{status:`loading`,revision:a}),r(),i({sessionKey:e.sessionKey,...e.fullMessageAgentId?{agentId:e.fullMessageAgentId}:{},messageId:t}).then(e=>{let n=y.get(t);if(n?.status!==`loading`||n.revision!==a)return;let i=e?.ok&&e.message&&typeof e.message==`object`?Za(e.message):null;y.set(t,i===null?{status:`error`,revision:a+1}:{status:`loaded`,markdown:i,revision:a+1}),r()},()=>{let e=y.get(t);e?.status===`loading`&&e.revision===a&&(y.set(t,{status:`error`,revision:a+1}),r())})},C=(e.realtimeTalkConversation?.length??0)>0,w=(e.typingActors?.length??0)>0,T=h.length===0&&!e.loading&&!C&&!w;t.setContentReady(!e.loading);let E=o?.kind,O=E&&E!==`unknown`?E:s?`global`:pc(e.sessionKey),k=(O===`direct`||O===`cron`||O===`spawn-child`)&&!e.userId,ee=e.loading&&h.length===0&&!w,A=o?.contextTokens??e.sessions?.defaults?.contextTokens??null,te=new Map,j=new Map,ne=new Map,M=new Map,N=new Map,re=t=>{if(N.has(t))return N.get(t);let n=ne.get(t),r=n?Bf(n.message):void 0;if(n&&r){let e={messageId:n.messageId,sourceMessageId:t,senderLabel:n.senderLabel,text:r};return N.set(t,e),e}let i=e.replyMessageAccess?.read(t),a=i?Wb(i,t,e):void 0;return N.set(t,a),a},ie={onOpenSidebar:e.onOpenSidebar,sessionKey:e.sessionKey,boardProvider:e.boardProvider,agentId:e.fullMessageAgentId,runActive:e.runActive,onOpenWorkspaceFile:e.onOpenWorkspaceFile,onRequestUpdate:r,resourceBasePath:e.resourceBasePath,localMediaPreviewRoots:e.localMediaPreviewRoots??[],connectionEpoch:e.connectionEpoch,assistantAttachmentAuthToken:e.assistantAttachmentAuthToken??null,resolveArtifactDownload:e.resolveArtifactDownload,onRequestOpenImage:e.onRequestOpenImage,onOpenImage:e.onOpenImage,onAssistantAttachmentLoaded:e.onAssistantAttachmentLoaded,canvasPluginSurfaceUrl:e.canvasPluginSurfaceUrl,embedSandboxMode:e.embedSandboxMode??`scripts`,allowExternalEmbedUrls:e.allowExternalEmbedUrls??!1,fetchLinkFavicon:e.fetchLinkFavicon,showAssistantAvatar:!1},ae={...ie,assistant:u,startupLabel:e.startupLabel,waitingApproval:e.waitingApproval,runOutputTokens:e.runOutputTokens},P=null,se=t=>{let i=t.messages.at(-1)?.message,a=t.role.toLowerCase()===`user`&&i?bs(i):null;return{...ie,latestBrowserTabs:g,showReasoning:l,showToolCalls:e.showToolCalls,autoExpandToolCalls:!!e.autoExpandToolCalls,isToolMessageExpanded:e=>_.get(e),onToggleToolMessageExpanded:x,isUserMessageExpanded:e=>v.get(e)??!1,onToggleUserMessageExpanded:e=>{ps(v,e,!v.get(e)),r()},loadFullAssistantMessage:e.loadFullAssistantMessage??void 0,getAssistantMessageExpansion:e=>y.get(e),onToggleAssistantMessageExpanded:S,isToolExpanded:e=>_.get(e)??!1,onToggleToolExpanded:x,assistantName:e.assistantName,assistantAvatar:u.avatar,userId:e.userId??null,userName:e.userName??null,userAvatar:e.userAvatar??null,onRetryQueuedMessage:e.onRetryQueuedMessage,queuedMessageAction:e.queuedMessageAction,personActivity:e.personActivity,showAvatarGutter:!k,contextWindow:A,onReply:e.onSetReply?e=>n.transcriptRenderContext.onSetReply?.(e):void 0,resolveReplyPreview:re,onResolveReply:e.replyMessageAccess?.request,onOpenReply:e=>n.transcriptRenderContext.onOpenReply?.(e),replyNavigationId:e.replyMessageAccess?.navigationId,onRewind:a&&e.onRewindMessage?()=>{Promise.resolve(e.onRewindMessage?.(a)).then(t=>{t&&e.onFocusComposer?.()})}:void 0,rewindDisabled:!!(e.runActive||e.runWorking),activeContinuation:te.get(t.key),turnRecap:j.get(t.key),latestAssistant:t.key===P}},ce=e=>Gh(e,se(e)),F=`usage:${e.runOutputTokens??``}`,le=kb(n,e=>{if(e.kind===`agent-run-frame`){let t=e.parts.some(e=>e.kind===`stream-run`&&e.parts.some(e=>e.kind===`reading-indicator`)),n=j.get(e.key);return`${t?F:``}|${n?`${n.runtimeMs}:${n.outputTokens??``}`:``}|${e.key===P?`latest-assistant`:``}`}if(e.kind===`stream-run`)return e.parts.some(e=>e.kind===`reading-indicator`)?F:``;if(e.kind!==`group`)return``;let t=te.get(e.key),n=j.get(e.key);return`${t?`${t.parts.map(e=>e.key).join(` `)}${F}`:``}|${n?`${n.runtimeMs}:${n.outputTokens??``}`:``}|${e.key===P?`latest-assistant`:``}`},t=>{if(t.kind===`divider`)return sl(t,e.onOpenSessionCheckpoints);if(t.kind===`notice`)return cl(t);if(t.kind===`stream-run`)return Ih(t.parts,{...ae,questionPrompts:b});if(t.kind===`work-group`){let n=_.get(t.key)??!1;return Lh(t,{expanded:n,browserTabPreviews:nm(t.groups,{sessionKey:e.sessionKey,latestBrowserTabs:g}),onToggle:()=>{ps(_,t.key,!n),r()}})}if(t.kind===`activity-run`){let e=t.groups[0];return e?t.groups.length===1?ce(e):Hh(t.groups,se(e)):R}return t.kind===`agent-run-frame`?_b(t,{questionPrompts:b,streamOptions:{...ae,questionPrompts:b},renderGroupOptions:se,isWorkExpanded:e=>_.get(e)??!1,onToggleWork:(e,t)=>{ps(_,e,!t),r()},turnRecap:j.get(t.key)}):t.kind===`group`?ce(t):t.kind===`question`?Ih([t],{questionPrompts:b}):R}),de=vs(_s(ss(h),{sessionKey:e.sessionKey,runWorking:!!e.runWorking,searchActive:f}),{searchActive:f}),fe=hs(de,{searchActive:f}),I=h.some(e=>e.kind===`reading-indicator`),L=Ts(e.sessionKey,I,o,e.runOutputTokens??null),pe=fe.filter((e,t)=>{let n=fe[t-1],r=e.kind===`stream-run`&&e.parts.every(e=>e.kind===`reading-indicator`)?e.parts:e.kind===`agent-run-frame`?cs(e):void 0,i=e.kind===`stream-run`||e.kind===`agent-run-frame`?e.runId:void 0;return n?.kind!==`group`||!r||!rs(n)||n.runId!==void 0&&i!==void 0&&n.runId!==i||(te.set(n.key,{parts:r,options:ae}),!1)}),me=pe.at(-1);P=e.runActive||e.runWorking||f?null:me?.kind===`agent-run-frame`&&me.outcome.kind===`completed`&&me.outcome.actionOwner!==null||me?.kind===`group`&&!me.isStreaming&&rs(me)?me.key:null;for(let t of pe){let n=t.kind===`agent-run-frame`?ls(t):t.kind===`group`?[t]:[],r=n.find(e=>e.role===`assistant`)??n[0];if(!r)continue;let i=Uh(r,{assistantName:e.assistantName,userId:e.userId,userName:e.userName,userAvatar:e.userAvatar});for(let e of n)for(let n of e.messages){let e=bs(n.message);e&&Za(n.message)?.trim()&&(M.set(e,t.key),ne.set(e,{message:n.message,messageId:n.key,senderLabel:i}))}}t.syncMessageRows(M);let he=null;if(L!==null){let e=pe.at(-1);(e?.kind===`group`&&rs(e)||e?.kind===`agent-run-frame`&&e.outcome.kind===`completed`&&e.outcome.actionOwner)&&(j.set(e.key,L),he=e.key)}let ge=[];for(let e of pe)if(ge.push({kind:`item`,key:e.key,item:e}),e.kind===`work-group`&&_.get(e.key))for(let t of e.groups)ge.push({kind:`item`,key:`${e.key}:${t.key}`,item:t});let _e=Tb(e);_e!==R&&ge.push({kind:`content`,key:`realtime-talk`,content:_e}),L!==null&&he===null&&!T&&!ee&&ge.push({kind:`content`,key:`turn-recap`,content:jh(L)});let ve=!e.runWorking&&!T&&!ee?Sb(e.backgroundTasks):R;ve!==R&&ge.push({kind:`content`,key:`background-tasks`,content:ve});let ye=jb(e.typingActors);return ye&&ge.push({kind:`content`,key:`presence:typing`,content:ye}),Ob(n,[h,d,_,Es(_),v,Es(v),gs(y),gl(),Math.floor(Date.now()/6e4),tc(),JSON.stringify([...g]),e.sessionKey,e.selectedSession,e.boardProvider,e.boardProvider?.canPinWidgets,e.boardProvider?.canPinMcpApps,e.boardProvider?.snapshot$.value.revision,e.fullMessageAgentId,!!e.loadFullAssistantMessage,l,e.showToolCalls,!!e.runActive,!!e.runWorking,e.startupLabel,!!e.waitingApproval,e.questionPrompts,!!e.autoExpandToolCalls,e.assistantName,u.avatar,e.userId,e.userName,e.userAvatar,e.resourceBasePath,(e.localMediaPreviewRoots??[]).join(`\0`),e.assistantAttachmentAuthToken,e.canvasPluginSurfaceUrl,e.embedSandboxMode??`scripts`,e.allowExternalEmbedUrls??!1,!!e.fetchLinkFavicon,A,!!e.onSetReply,!!e.onRetryQueuedMessage,e.queuedMessageAction?.id,e.queuedMessageAction?.label,e.queuedMessageAction?.onAction,e.replyMessageAccess?.revision??0,e.replyMessageAccess?.navigationId??``,L===null?``:`${L.runtimeMs}:${L.outputTokens??``}`,e.runStatus?.phase??``,e.runStatus?.occurredAt??0]),n.transcriptRenderContext.onSetReply=e.onSetReply,n.transcriptRenderContext.onOpenReply=i=>{let a=ne.get(i);if(a&&Bf(a.message)){t.revealMessage(i);return}f&&ky(n,r),e.replyMessageAccess?.open(i)},{isDirectThread:k,isEmpty:T,showLoadingSkeleton:ee,searchOpen:n.searchOpen,renderRows:(r=R,i=null)=>t.render(ge,e=>e.kind===`item`?le(e.item):e.content,Yy(fe),e.announceTranscript!==!1&&!n.searchOpen&&!e.loading,r,i)}}function Kb(){return(Kb=e((()=>{B(),hc(),K(),mo(),ti(),Wi(),ve(),Fs(),ks(),us(),Xs(),vb(),wb(),ll(),Zh(),ep(),Qh(),Eb(),Gy(),Xm(),Qy(),Ab(),Mb(),Ub(),Nh()})))()}function qb(e){let t=Xb.get(e);if(t)return t;let n=null,r=e=>{let t=e instanceof HTMLElement?e:null;n&&n!==t&&pa(n),n=t,n&&oo(n)};return Xb.set(e,r),r}function Jb(e,t){return t.renderSession(e.paneId,e.sessionKey,t=>Yb(e,t))}function Yb(e,t){let n=Gb(e,t),r=e.historyPagination?z`<div class="chat-history-sentinel"></div>`:R,i=e.historyPagination?{template:fy(e.historyPagination),height:44}:null,a=n.showLoadingSkeleton||n.isEmpty?z`
|
||
<div class="chat-thread-inner" ${U(t.scrollElementRef)}>
|
||
${r}
|
||
${n.isEmpty&&!n.showLoadingSkeleton&&i?i.template:R}
|
||
${n.showLoadingSkeleton?hr(`chat`,Y(`chat.thread.loading`)):R}
|
||
${n.isEmpty&&!n.searchOpen?Bb(e):R}
|
||
${n.isEmpty&&n.searchOpen?z` <div class="agent-chat__empty">${Y(`chat.thread.noMatches`)}</div> `:R}
|
||
</div>
|
||
`:n.renderRows(r,i);return z`
|
||
<div
|
||
class="chat-thread ${n.isDirectThread?`chat-thread--direct`:``}"
|
||
${U(t=>{t instanceof HTMLElement&&(_a(t),es(t,e.fetchLinkFavicon))})}
|
||
role="log"
|
||
aria-live="off"
|
||
aria-relevant="additions"
|
||
tabindex="0"
|
||
${U(qb(t))}
|
||
@focusin=${e=>t.handleFocusIn(e)}
|
||
@focusout=${e=>t.handleFocusOut(e)}
|
||
@scroll=${e.onChatScroll}
|
||
@wheel=${e.onHistoryIntent?{handleEvent:e.onHistoryIntent,passive:!0}:null}
|
||
@keydown=${t=>{let n=Fa(t);if(n){e.onOpenWorkspaceFile?.(n);return}let r=$a(t)??(t.key===`Enter`?Oo(t,Jt,e.basePath):null);if(r){t.preventDefault(),e.onOpenSessionLink?.(r);return}e.onHistoryIntent?.(t)}}
|
||
@touchstart=${e.onHistoryIntent?{handleEvent:e.onHistoryIntent,passive:!0}:null}
|
||
@touchmove=${e.onHistoryIntent?{handleEvent:e.onHistoryIntent,passive:!0}:null}
|
||
@touchend=${e.onHistoryIntent}
|
||
@touchcancel=${e.onHistoryIntent}
|
||
@click=${t=>{Ma(t),To(t);let n=ro(t);if(n){e.onOpenWorkspaceFile?.(n);return}let r=Sa(t)??Oo(t,Jt,e.basePath);r&&I(t)&&(t.preventDefault(),e.onOpenSessionLink?.(r))}}
|
||
@contextmenu=${t=>Ry(t,e)}
|
||
@pointerup=${t=>Iy(t,e)}
|
||
>
|
||
<span
|
||
class="chat-transcript-announcement sr-only"
|
||
role="status"
|
||
aria-live=${e.announceTranscript===!1?`off`:`polite`}
|
||
aria-atomic="true"
|
||
>${t.liveAnnouncementText}</span
|
||
>
|
||
${a}
|
||
</div>
|
||
`}var Xb;function Zb(){return(Zb=e((()=>{B(),V(),Ot(),Ko(),go(),fo(),Ba(),Mi(),K(),ts(),py(),Gy(),gb(),Kb(),Ub(),Xb=new WeakMap})))()}function Qb(e){let{chat:t}=e;return Jb({paneId:e.paneId,sessionKey:e.sessionKey,selectedSession:t.selectedSession,announceTranscript:!1,loading:!1,messages:e.messages,toolMessages:[],streamSegments:[],stream:null,streamStartedAt:null,runId:null,queue:[],showThinking:t.showThinking,showToolCalls:t.showToolCalls,persistCommentary:t.persistCommentary,sessions:t.sessions,sessionHost:t.sessionHost,assistantName:t.assistantName,assistantAvatar:t.assistantAvatar,assistantAvatarUrl:t.assistantAvatarUrl,userId:t.userId,userName:t.userName,userAvatar:t.userAvatar,personActivity:t.personActivity,basePath:t.basePath,fullMessageAgentId:t.fullMessageAgentId,loadFullAssistantMessage:t.loadFullAssistantMessage,localMediaPreviewRoots:t.localMediaPreviewRoots,assistantAttachmentAuthToken:t.assistantAttachmentAuthToken,resolveArtifactDownload:t.resolveArtifactDownload,canvasPluginSurfaceUrl:t.canvasPluginSurfaceUrl,embedSandboxMode:t.embedSandboxMode,allowExternalEmbedUrls:t.allowExternalEmbedUrls,fetchLinkFavicon:t.fetchLinkFavicon,autoExpandToolCalls:t.autoExpandToolCalls,onRequestUpdate:t.onRequestUpdate??(()=>{}),onDraftChange:()=>void 0,onSend:()=>void 0},e.transcript)}function $b(){return($b=e((()=>{Zb()})))()}function ex(e){let{backgroundTasks:t,task:n}=e;if(!n)return Uv(e.host),z`
|
||
<div class="sidebar-panel chat-task-detail" data-task-detail-panel>
|
||
${tx(Y(`chat.backgroundTasks.taskDetailTitle`))}
|
||
<div class="sidebar-content chat-task-detail__state">
|
||
${Y(`chat.backgroundTasks.taskUnavailable`)}
|
||
</div>
|
||
</div>
|
||
`;let r=t.taskDetails.get(n.id),i=Bi(n,r),a=_(i.runtime===`subagent`?i.childSessionKey:i.childSessionKey??i.sessionKey),o=a&&!nt(e.host,e.host.sessionKey,a,i.agentId)?nx({...e,task:i,sessionKey:a}):rx(i,t,e.host);return z`
|
||
<div class="sidebar-panel chat-task-detail" data-task-detail-panel>
|
||
${tx(tr(i),i,t)} ${o}
|
||
</div>
|
||
`}function tx(e,t,n){let r=t?Zo(t):!1,i=t?vi(t.startedAt??t.createdAt):0,a=t?n?.cancellingTaskIds.has(t.id)===!0:!1;return z`
|
||
<div class="sidebar-header chat-task-detail__header">
|
||
<div class="chat-task-detail__heading">
|
||
<div class="sidebar-title" title=${e}>${e}</div>
|
||
${t?z`<div class="chat-task-detail__meta">
|
||
${t.status===`running`?z`<span class="chat-tasks-rail__task-pulse" aria-hidden="true"></span>`:R}
|
||
<span
|
||
class="chat-tasks-rail__task-status chat-tasks-rail__task-status--${jv[t.status]}"
|
||
>${Av(t)}</span
|
||
>
|
||
<span aria-hidden="true">·</span>
|
||
<span>${Qi(t)}</span>
|
||
${r&&i>0?z`<span aria-hidden="true">·</span>
|
||
<openclaw-elapsed-time .startMs=${i}></openclaw-elapsed-time>`:R}
|
||
${t.lastToolName?z`<span aria-hidden="true">·</span>
|
||
<span class="chat-task-detail__tool">${t.lastToolName}</span>`:R}
|
||
${t.diffStat?ip(t.diffStat):R}
|
||
</div>`:R}
|
||
</div>
|
||
${t&&r&&n?.canCancel?z`<div class="sidebar-header__actions">
|
||
<button
|
||
class="btn btn--ghost btn--sm"
|
||
type="button"
|
||
aria-label=${Y(`chat.backgroundTasks.stopTask`,{title:e})}
|
||
?disabled=${a||!n.connected}
|
||
@click=${()=>n.onCancel(t.id)}
|
||
>
|
||
${a?q.loader:q.stop} ${Y(`chat.runControls.stop`)}
|
||
</button>
|
||
</div>`:R}
|
||
</div>
|
||
`}function nx(e){let n=Gv(e.host,{taskId:e.task.id,sessionKey:e.sessionKey});if(n.status===`loading`)return hr(`review`,Y(`chat.backgroundTasks.transcriptLoading`));if(n.status===`error`)return z`<div class="sidebar-content chat-task-detail__state chat-task-detail__state--error">
|
||
${Y(`chat.backgroundTasks.transcriptFailed`)}
|
||
</div>`;if(n.messages.length===0)return z`<div class="sidebar-content chat-task-detail__state">
|
||
${Y(`chat.backgroundTasks.transcriptEmpty`)}
|
||
</div>`;let r=e.chat.sessions?.sessions.find(n=>(n.key!==`global`||ue(e.host)&&t(e.host.sessionsResultAgentId??``)===t(e.task.agentId))&&L(e.host,n.key,e.sessionKey));return z`<div class="sidebar-content chat-task-detail__content">
|
||
<div class="chat-task-detail__transcript">
|
||
${Qb({chat:{...e.chat,selectedSession:r},messages:n.messages,paneId:`${e.chat.paneId}:task-sidebar`,sessionKey:e.sessionKey,transcript:e.transcript})}
|
||
</div>
|
||
</div>`}function rx(e,t,n){return Uv(n),!t.taskDetails.has(e.id)&&!t.taskDetailErrors.has(e.id)&&!t.taskDetailLoadingIds.has(e.id)&&t.onLoadDetail?.(e),z`<div class="sidebar-content chat-task-detail__fallback">
|
||
${ix(e,t)}
|
||
</div>`}function ix(e,t){let n=t.taskDetails.get(e.id),r=Bi(e,n),i=ra(r),a=t.taskDetailLoadingIds.has(e.id),o=t.taskDetailErrors.get(e.id);return a&&!o?hr(`review`,Y(`chat.backgroundTasks.detailLoading`)):z`
|
||
${o?z`<div
|
||
class="chat-tasks-rail__task-inspector-state chat-tasks-rail__task-inspector-state--error"
|
||
>
|
||
${o}
|
||
<!-- The render-driven load skips errored tasks to avoid a per-paint
|
||
retry loop, so without this the panel dead-ends whenever the task
|
||
row that could re-open it is not on screen. -->
|
||
<button
|
||
class="chat-tasks-rail__task-inspector-retry"
|
||
type="button"
|
||
?disabled=${a}
|
||
@click=${()=>t.onLoadDetail?.(e)}
|
||
>
|
||
${Y(`chat.backgroundTasks.detailRetry`)}
|
||
</button>
|
||
</div>`:R}
|
||
<div class="chat-tasks-rail__detail-blocks">
|
||
<section class="chat-tasks-rail__task-inspector-block">
|
||
<div class="chat-tasks-rail__task-inspector-label">${Y(`chat.backgroundTasks.prompt`)}</div>
|
||
<pre>${n?.prompt??Y(`chat.backgroundTasks.promptUnavailable`)}</pre>
|
||
</section>
|
||
<section class="chat-tasks-rail__task-inspector-block">
|
||
<div class="chat-tasks-rail__task-inspector-label">${Y(`chat.backgroundTasks.output`)}</div>
|
||
<pre>${i??Y(`chat.backgroundTasks.outputPending`)}</pre>
|
||
</section>
|
||
</div>
|
||
`}function ax(){return(ax=e((()=>{B(),ri(),J(),Mi(),K(),ve(),wi(),Mv(),op(),$b(),Jv()})))()}function ox(e){return e.columns.some(e=>e.panels.some(e=>e.slot===`detail`))}function sx(e,t){return e?.kind===`task`&&ox(t)?e.taskId:void 0}function cx(e){let{content:t,host:n}=e,r=n,i=sx(t,e.layout);return i===void 0&&r.taskDetailState!==void 0&&Uv(r),{task:i===void 0?z``:ex({backgroundTasks:e.backgroundTasks,chat:e.chat,host:n,task:e.backgroundTasks.tasks?.find(e=>e.id===i)??void 0,transcript:e.transcript})}[t.kind]??z`<openclaw-chat-detail-panel
|
||
class="chat-sidebar"
|
||
.content=${t}
|
||
.execNode=${Ns(n)?.execNode??null}
|
||
.attachmentRuntime=${{authToken:e.chat.assistantAttachmentAuthToken,connectionEpoch:e.chat.connectionEpoch,localMediaPreviewRoots:e.chat.localMediaPreviewRoots??[],resourceBasePath:e.chat.resourceBasePath,resolveArtifactDownload:e.chat.resolveArtifactDownload}}
|
||
.basePath=${e.chat.basePath??``}
|
||
.canvasPluginSurfaceUrl=${n.canvasPluginSurfaceUrl}
|
||
.embedSandboxMode=${n.embedSandboxMode}
|
||
.allowExternalEmbedUrls=${n.allowExternalEmbedUrls}
|
||
.onOpenWorkspaceFile=${e=>A_(n,e)}
|
||
.onOpenSessionLink=${e.chat.onOpenSessionLink}
|
||
.onRevealInWorkspace=${e=>{N_(n,e),n.updateSidebarLayout(rc(n.sidebarLayout,`workspace`))}}
|
||
.onOpenImage=${e=>n.handleOpenImage(e,n.beginImageOpen())}
|
||
.embedded=${!0}
|
||
@chat-detail-panel-close=${()=>n.handleCloseSidebar(t.kind===`attachment`?`workspace`:`detail`)}
|
||
></openclaw-chat-detail-panel>`}function lx(){return(lx=e((()=>{B(),As(),ec(),d_(),z_(),Jv(),ax()})))()}function ux(e){return m(m(m(e?.tools)?.web)?.search)?.enabled!==!1}function dx(e){let t=Object.values(e.missing).some(e=>e.length>0),n=e.blockedByAllowlist||e.blockedByAgentFilter===!0,r=!e.disabled;return{key:e.skillKey,name:e.name,enabled:r&&!t&&!n,baseEnabled:r,...t?{missingDeps:!0}:{},...n?{blocked:!0}:{}}}var fx;function px(){return(px=e((()=>{be(),fx=class{constructor(e){this.notify=e,this.skills=new Map,this.loading=new Set,this.loadErrors=new Set,this.client=null}synchronize(e,t){(this.client!==e||this.connectionEpoch!==t)&&(this.client=e,this.connectionEpoch=t,this.skills.clear(),this.loading.clear(),this.loadErrors.clear())}load(e,t,n,r){if(this.synchronize(e,t),!e||!r()||this.skills.has(n)||this.loading.has(n))return;let i=()=>this.client===e&&this.connectionEpoch===t&&r();this.loadErrors.delete(n),this.loading.add(n),this.notify(),ge(e,n).then(e=>{e&&i()&&this.skills.set(n,e.skills.map(dx).toSorted((e,t)=>e.name.localeCompare(t.name)))}).catch(()=>{i()&&this.loadErrors.add(n)}).finally(()=>{i()&&(this.loading.delete(n),this.notify())})}rows(e,t){return this.skills.get(e)?.map(e=>Object.assign({},e,{enabled:e.missingDeps||e.blocked?!1:Po(t?.skills,e.key)??e.baseEnabled}))??null}isLoading(e){return this.loading.has(e)}hasError(e){return this.loadErrors.has(e)}}})))()}function mx(e){let t=window.visualViewport?.offsetTop??0,n=document.documentElement.clientHeight||window.innerHeight,r=e.getBoundingClientRect().top,i=n-r+Mx,a=r-t-Nx;e.style.setProperty(`--chat-composer-popover-bottom`,`${Math.max(0,i)}px`),e.style.setProperty(`--chat-composer-popover-max-height`,`${Math.max(0,a)}px`)}function hx(e){if(jx.has(e))return;let t=window.visualViewport,n={resizeObserver:null,toggleObserver:null,viewport:t,updateFrame:null,scheduleUpdate:()=>{n.updateFrame===null&&(n.updateFrame=requestAnimationFrame(()=>{n.updateFrame=null,jx.get(e)===n&&mx(e)}))}};typeof ResizeObserver==`function`&&(n.resizeObserver=new ResizeObserver(n.scheduleUpdate),n.resizeObserver.observe(e)),typeof MutationObserver==`function`&&(n.toggleObserver=new MutationObserver(n.scheduleUpdate),n.toggleObserver.observe(e,{attributes:!0,attributeFilter:[`open`],subtree:!0})),window.addEventListener(`resize`,n.scheduleUpdate),t?.addEventListener(`resize`,n.scheduleUpdate),t?.addEventListener(`scroll`,n.scheduleUpdate),jx.set(e,n),mx(e)}function gx(e){let t=jx.get(e);jx.delete(e),t&&(t.resizeObserver?.disconnect(),t.toggleObserver?.disconnect(),window.removeEventListener(`resize`,t.scheduleUpdate),t.viewport?.removeEventListener(`resize`,t.scheduleUpdate),t.viewport?.removeEventListener(`scroll`,t.scheduleUpdate),t.updateFrame!==null&&cancelAnimationFrame(t.updateFrame))}function _x(e,t){let n=t instanceof HTMLElement?t:null;return e&&e!==n&&gx(e),n&&hx(n),n}function vx(e){let t=e.scrollHeight>e.clientHeight+1,n=t&&e.clientHeight>=64,r=n&&e.scrollTop>1,i=n&&e.scrollTop+e.clientHeight<e.scrollHeight-1;e.style.overflowY=t?`auto`:`hidden`,e.toggleAttribute(`data-scroll-fade-top`,r),e.toggleAttribute(`data-scroll-fade-bottom`,i)}function yx(e){if(e.closest(`[data-composer-layout="single-line"]`)){e.style.height=``,e.style.overflowY=``,e.removeAttribute(`data-scroll-fade-top`),e.removeAttribute(`data-scroll-fade-bottom`);return}let t=e.closest(`.chat`)?.querySelector(`.chat-thread`)??null,n=t?qs(t).anchorToEnd:!1;e.style.overflowY=`hidden`,e.style.height=`auto`;let r=getComputedStyle(e).maxHeight.trim(),i=/^(\d+(?:\.\d+)?)px$/u.exec(r),a=i?Number(i[1]):150;e.style.height=`${Math.min(e.scrollHeight,a)}px`,vx(e),t&&n&&(t.scrollTop=t.scrollHeight)}function bx(e){if(Ax.has(e))return;let t=e.getBoundingClientRect().width,n=()=>vx(e),r=typeof ResizeObserver==`function`?new ResizeObserver(()=>{let n=e.getBoundingClientRect().width;if(n!==t){t=n;let r=Ax.get(e);r&&r.adjustmentFrame===null&&(r.adjustmentFrame=requestAnimationFrame(()=>{r.adjustmentFrame=null,Ax.get(e)===r&&yx(e)}));return}vx(e)}):null;e.addEventListener(`scroll`,n,{passive:!0}),r?.observe(e),Ax.set(e,{observer:r,adjustmentFrame:null,onScroll:n}),vx(e)}function xx(e){let t=Ax.get(e);Ax.delete(e),t&&(t.observer?.disconnect(),e.removeEventListener(`scroll`,t.onScroll),t.adjustmentFrame!==null&&cancelAnimationFrame(t.adjustmentFrame))}function Sx(e){queueMicrotask(()=>{e.isConnected&&yx(e)})}function Cx(e,t){if(e.defaultPrevented)return;let n=e.target;if(!(n instanceof Element))return;if(e.type===`pointerdown`){e.button===0&&n.closest(`summary, wa-dropdown>[slot='trigger']`)&&e.preventDefault();return}if(!t||n.closest(kx))return;let r=e.currentTarget;r instanceof HTMLElement&&r.querySelector(`.agent-chat__composer-combobox > textarea`)?.focus({preventScroll:!0})}function wx(e,t){let n=t?.closest(`.agent-chat__composer-shell`);document.activeElement===t&&n&&e.preventDefault()}function Tx(e,t){requestAnimationFrame(()=>{if(document.activeElement!==e)return;yx(e);let n=t===`up`?0:e.value.length;e.selectionStart=n,e.selectionEnd=n})}function Ex(e){e&&requestAnimationFrame(()=>{let t=document.getElementById(e),n=t?.closest(`.slash-menu__scroll`);if(!t||!n)return;let r=n.getBoundingClientRect(),i=t.getBoundingClientRect();i.top<r.top?n.scrollTop-=r.top-i.top:i.bottom>r.bottom&&(n.scrollTop+=i.bottom-r.bottom)})}function Dx(e){if(!(e instanceof HTMLElement))return;let t=()=>{let t=e.scrollHeight>e.clientHeight+1;e.dataset.scrollable=String(t),e.dataset.atStart=String(!t||e.scrollTop<=1),e.dataset.atEnd=String(!t||e.scrollTop+e.clientHeight>=e.scrollHeight-1)};t(),requestAnimationFrame(t)}function Ox(e,t){return`chat-${encodeURIComponent(e)}-${t}`}var kx,Ax,jx,Mx,Nx;function Px(){return(Px=e((()=>{Ws(),kx=[`a[href]`,`button`,`input`,`select`,`textarea`,`summary`,`wa-dropdown`,`[contenteditable='true']`,`[role='button']`,`[role='listbox']`,`[role='option']`].join(`,`),Ax=new WeakMap,jx=new WeakMap,Mx=6,Nx=28})))()}function Fx(e){let t=Hx.get(e);t!==void 0&&(clearInterval(t),Hx.delete(e))}function Ix(e){let t=e.scrollHeight>e.clientHeight+1;e.dataset.scrollable=String(t),e.dataset.atStart=String(!t||e.scrollTop<=1),e.dataset.atEnd=String(!t||e.scrollTop+e.clientHeight>=e.scrollHeight-1)}function Lx(){let e;return t=>{if(e?.disconnect(),e=void 0,!(t instanceof HTMLElement))return;let n=()=>Ix(t);n(),typeof ResizeObserver==`function`&&(e=new ResizeObserver(n),e.observe(t))}}function Rx(e){let t=null;return n=>{if(t&&=(Fx(t),null),!(n instanceof HTMLElement)||(n.textContent=Fo(no(e,Date.now())),e.status!==`active`))return;t=n;let r=setInterval(()=>{if(!n.isConnected){Fx(n);return}n.textContent=Fo(no(e,Date.now()))},1e3);Hx.set(n,r)}}function zx(e){return z`
|
||
<openclaw-tooltip content=${e.label}>
|
||
<button
|
||
class="agent-chat__goal-action ${e.className}"
|
||
type="button"
|
||
aria-label=${e.label}
|
||
@click=${e.onClick}
|
||
>
|
||
${e.icon}
|
||
<span class="agent-chat__goal-action-label">${e.chipLabel}</span>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`}function Bx(e,t,n){if(!t)return R;let r=Fo(no(t,Date.now())),i=ho(t),a=e.goalExpandedId===t.id,o=n.canAct&&!!n.onGoalAction,s=t.status===`paused`||t.status===`blocked`||t.status===`usage_limited`||t.status===`budget_limited`;return z`
|
||
<div
|
||
class="agent-chat__goal agent-chat__goal--${t.status}"
|
||
data-expanded=${String(a)}
|
||
role="group"
|
||
aria-label=${Qa(t)}
|
||
>
|
||
<div class="agent-chat__goal-row">
|
||
<span class="agent-chat__goal-icon">${Ux}</span>
|
||
<span class="agent-chat__goal-copy">
|
||
<span class="agent-chat__goal-label">${wa(t.status)}</span>
|
||
<span class="agent-chat__goal-objective">${t.objective}</span>
|
||
</span>
|
||
<span class="agent-chat__goal-elapsed" ${U(Rx(t))}></span>
|
||
<span class="agent-chat__goal-actions">
|
||
<span class="agent-chat__goal-command-actions">
|
||
${o&&n.onGoalEdit&&t.status!==`complete`?zx({className:`agent-chat__goal-edit`,label:Y(`chat.goals.edit`),chipLabel:Y(`chat.goals.editChip`),icon:q.penLine,onClick:()=>n.onGoalEdit?.(t)}):R}
|
||
${o&&t.status===`active`?zx({className:`agent-chat__goal-pause`,label:Y(`chat.goals.pause`),chipLabel:Y(`chat.goals.pauseChip`),icon:q.pause,onClick:()=>n.onGoalAction?.(t.id,`pause`)}):R}
|
||
${o&&s?zx({className:`agent-chat__goal-resume`,label:Y(`chat.goals.resume`),chipLabel:Y(`chat.goals.resumeChip`),icon:q.play,onClick:()=>n.onGoalAction?.(t.id,`resume`)}):R}
|
||
${o?zx({className:`agent-chat__goal-clear`,label:Y(`chat.goals.clear`),chipLabel:Y(`chat.goals.clearChip`),icon:q.trash,onClick:()=>n.onGoalAction?.(t.id,`clear`)}):R}
|
||
</span>
|
||
<button
|
||
class="agent-chat__goal-action agent-chat__goal-expand"
|
||
type="button"
|
||
aria-expanded=${a?`true`:`false`}
|
||
aria-label=${Y(a?`chat.goals.hideDetails`:`chat.goals.showDetails`)}
|
||
@click=${()=>{e.goalExpandedId=a?null:t.id,n.requestUpdate()}}
|
||
>
|
||
${a?q.chevronDown:q.chevronRight}
|
||
</button>
|
||
</span>
|
||
</div>
|
||
<div
|
||
class="agent-chat__goal-detail"
|
||
data-expanded=${String(a)}
|
||
aria-hidden=${String(!a)}
|
||
?inert=${!a}
|
||
>
|
||
<div class="agent-chat__goal-detail-content">
|
||
<div
|
||
class="agent-chat__goal-detail-objective"
|
||
${U(Lx())}
|
||
.textContent=${t.objective}
|
||
@scroll=${e=>{let t=e.currentTarget;t instanceof HTMLElement&&Ix(t)}}
|
||
></div>
|
||
${t.lastStatusNote?z`<div class="agent-chat__goal-detail-note">${t.lastStatusNote}</div>`:R}
|
||
<div class="agent-chat__goal-detail-meta">
|
||
${i?z`
|
||
<span class="agent-chat__goal-detail-usage">${i}</span>
|
||
<span class="agent-chat__goal-detail-separator" aria-hidden="true">·</span>
|
||
`:R}
|
||
<span class="agent-chat__goal-detail-duration">${r}</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`}function Vx(){for(let e of Hx.values())clearInterval(e);Hx.clear()}var Hx,Ux;function Wx(){return(Wx=e((()=>{B(),V(),Nn(),J(),K(),Hx=new Map,Ux=cn(lt` <path d="M12 13V2l8 4-8 4" />
|
||
<path d="M20.561 10.222a9 9 0 1 1-12.55-5.29" />
|
||
<path d="M8.002 9.997a5 5 0 1 0 8.9 2.02" />`)})))()}function Gx(e,t){let n=e.toLowerCase().startsWith(t.toLowerCase())?t.length:0;return n===0?z`${e}`:z`<mark>${e.slice(0,n)}</mark>${e.slice(n)}`}function Kx(){return{skillMenuOpen:!1,skillMenuItems:[],skillMenuIndex:0,skillMenuTarget:null,skillCommandRefreshPending:!1,skillCommandRefreshGeneration:0,skillCommandRefreshTargetStart:null}}function qx(e,t){let n=0;for(let r=t-1;r>=0&&e[r]===`\\`;--r)n+=1;return n%2==1}function Jx(e,t){let n=Math.max(0,Math.min(t,e.length)),r=n;for(;r>0&&sS.test(e[r-1]??``);)--r;if(r===0||e[r-1]!==`$`)return null;let i=r-1;if(qx(e,i))return null;let a=n;for(;a<e.length&&sS.test(e[a]??``);)a+=1;let o=a;for(;o>r&&e[o-1]===`:`;)--o;let s=e.slice(r,o);return s.length>0&&!/[a-z]/u.test(s)?null:{start:i,end:o,query:s}}function Yx(e){return e.skillMenuOpen||e.skillMenuItems.length>0||e.skillMenuTarget!==null||e.skillCommandRefreshPending}function Xx(e){e.skillCommandRefreshGeneration+=1,e.skillCommandRefreshPending=!1,e.skillCommandRefreshTargetStart=null,e.skillMenuOpen=!1,e.skillMenuItems=[],e.skillMenuIndex=0,e.skillMenuTarget=null}function Zx(e,t){Yx(e)&&(Xx(e),t())}function Qx(e,t,n){if(!t.refreshCommands||e.skillCommandRefreshPending)return;let r=t.refreshCommands();if(!r||typeof r.then!=`function`)return;let i=e.skillCommandRefreshGeneration+1;e.skillCommandRefreshGeneration=i,e.skillCommandRefreshPending=!0,Promise.resolve(r).catch(()=>void 0).finally(()=>{if(e.skillCommandRefreshGeneration!==i)return;e.skillCommandRefreshPending=!1;let r=t.getDraft();$x(r,t.getTextarea()?.selectionStart??r.length,e,t,n,{skipRefresh:!0})})}function $x(e,t,n,r,i,a={}){if(e.trimStart().startsWith(`/`)){Zx(n,i);return}let o=Jx(e,t);if(!o){Zx(n,i);return}!a.skipRefresh&&n.skillCommandRefreshTargetStart!==o.start&&(n.skillCommandRefreshTargetStart=o.start,Qx(n,r,i));let s=ui(o.query);n.skillMenuTarget=o,n.skillMenuItems=s,n.skillMenuIndex=Math.min(n.skillMenuIndex,Math.max(0,s.length-1)),n.skillMenuOpen=s.length>0||n.skillCommandRefreshPending,i()}function eS(e,t){return Ox(e,`skill-option-${t.name.replace(/[^a-z0-9_-]+/giu,`-`).replace(/^-+|-+$/gu,``)||`skill`}`)}function tS(e){return e.skillMenuOpen&&(e.skillMenuItems.length>0||e.skillCommandRefreshPending)}function nS(e,t){if(!tS(e)||e.skillCommandRefreshPending)return null;let n=e.skillMenuItems[e.skillMenuIndex];return n?eS(t,n):null}function rS(e){if(e.skillCommandRefreshPending)return``;let t=e.skillMenuItems[e.skillMenuIndex];return t?`${yr(t)} ${xi(t)}`:``}function iS(e,t,n,r){if(t.skillCommandRefreshPending)return;let i=n.getTextarea(),a=i?.value??n.getDraft(),o=i?.selectionStart??t.skillMenuTarget?.end??a.length,s=Jx(a,o);if(!s){Xx(t),r();return}let c=s.end===a.length?` `:``,l=`$${e.name}${c}`,u=`${a.slice(0,s.start)}${l}${a.slice(s.end)}`,d=Math.max(0,o-s.end),f=s.start+l.length+d;n.commitDraft(u),Xx(t),r(),queueMicrotask(()=>{let e=n.getTextarea();e&&(e.focus({preventScroll:!0}),e.setSelectionRange(f,f))})}function aS(e,t,n,r){if(!t.skillMenuOpen)return!1;if(e.key===`Escape`)return e.preventDefault(),Xx(t),r(),!0;let i=t.skillCommandRefreshPending?[]:t.skillMenuItems;if(i.length===0)return[`ArrowDown`,`ArrowUp`,`Enter`,`Tab`].includes(e.key)?(e.preventDefault(),!0):!1;if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let a=e.key===`ArrowDown`?1:i.length-1;return t.skillMenuIndex=(t.skillMenuIndex+a)%i.length,r(),Ex(nS(t,n.paneId)),!0}if(e.key===`Tab`||e.key===`Enter`){e.preventDefault();let a=i[t.skillMenuIndex];return a&&iS(a,t,n,r),!0}return!1}function oS(e,t,n){if(!tS(e))return R;let r=Ox(t.paneId,`skill-menu-listbox`);return z`
|
||
<div
|
||
id=${r}
|
||
class="slash-menu skill-menu"
|
||
role="listbox"
|
||
aria-label=${Y(`chat.skills.menu`)}
|
||
>
|
||
<div
|
||
class="slash-menu__scroll"
|
||
${U(Dx)}
|
||
@scroll=${e=>Dx(e.currentTarget instanceof Element?e.currentTarget:void 0)}
|
||
>
|
||
${e.skillCommandRefreshPending||e.skillMenuItems.length===0?z`<div class="slash-menu-group">
|
||
<div class="slash-menu-group__label">${Y(`chat.skills.loading`)}</div>
|
||
</div>`:z`<div class="slash-menu-group">
|
||
<div class="slash-menu-group__label">${Y(`chat.skills.label`)}</div>
|
||
${e.skillMenuItems.map((r,i)=>z`
|
||
<div
|
||
id=${eS(t.paneId,r)}
|
||
class="slash-menu-item ${i===e.skillMenuIndex?`slash-menu-item--active`:``}"
|
||
role="option"
|
||
aria-selected=${i===e.skillMenuIndex}
|
||
@mousedown=${e=>e.preventDefault()}
|
||
@click=${()=>iS(r,e,t,n)}
|
||
@mouseenter=${()=>{e.skillMenuIndex=i,n()}}
|
||
>
|
||
<span class="slash-menu-icon">${q.pencilSparkles}</span>
|
||
<span class="slash-menu-copy">
|
||
<span class="slash-menu-name"
|
||
>${Gx(yr(r),e.skillMenuTarget?.query??``)}</span
|
||
>
|
||
<span class="slash-menu-desc">${xi(r)}</span>
|
||
</span>
|
||
</div>
|
||
`)}
|
||
</div>`}
|
||
</div>
|
||
</div>
|
||
`}var sS;function cS(){return(cS=e((()=>{B(),V(),J(),K(),Xo(),Px(),sS=/[-a-zA-Z0-9_:]/u})))()}function lS(e,t,n){let r=e.getTextarea();r&&(r.value=t,yx(r)),e.commitDraft(t),queueMicrotask(()=>{let t=e.getTextarea();t&&(t.focus({preventScroll:!0}),t.selectionStart=n,t.selectionEnd=n)})}function uS(e,t,n){let r=t.slashMenuCompletion;if(!r?.inline)return!1;let i=n.getTextarea()?.value??n.getDraft(),a=i.slice(r.end),o=a.length===0||!/^\s/u.test(a)?` `:``;return lS(n,`${i.slice(0,r.start)}${e}${o}${a}`,r.start+e.length+o.length),!0}function dS(e,t,n){let r=t.slashMenuCompletion;if(!r?.inline)return!1;let i=n.getTextarea()?.value??n.getDraft(),a=`/${e} `,o=`${i.slice(0,r.start)}${a}${i.slice(r.end)}`,s=r.start+a.length;return lS(n,o,s),t.slashMenuCompletion={query:e,start:r.start,end:s,inline:!0,argumentStart:s},!0}function fS(e,t){let n=e.slashMenuCompletion;if(!n?.inline)return!1;let r=t.getTextarea()?.value??t.getDraft(),i=r.slice(0,n.start),a=r.slice(n.end);return(/\s$/u.test(i)&&/^\s/u.test(a)||i.length===0&&/^\s/u.test(a))&&(a=a.slice(1)),lS(t,`${i}${a}`,i.length),!0}function pS(e,t,n,r){let i=`/${n.query}`,a=n.argumentStart??n.start+`/${r} `.length,o=e.slice(n.start,a);return t>=a&&o.startsWith(i)&&/^\s+$/u.test(o.slice(i.length))}function mS(e,t=e.length){let n=Math.max(0,Math.min(t,e.length)),r=e.slice(0,n),i=/(?:^|\s)\/([^\s/:]+)\s+/gu,a=null;for(let t of r.matchAll(i)){let i=t[1]?.toLowerCase();if(!i||t.index===void 0)continue;let o=qr(i,{showAll:!0,inlineOnly:!0}).find(e=>e.name.toLowerCase()===i||e.aliases?.some(e=>e.replace(/^\//u,``).toLowerCase()===i));if(!o?.args||o.source===`skill`)continue;let s=t.index+t[0].indexOf(`/`),c=r.slice(t.index+t[0].length).trim();!c||/\s/u.test(c)||(a={command:o,completion:{query:i,start:s,end:n,inline:e.slice(0,s).trim().length>0||e.slice(n).trim().length>0,argumentStart:t.index+t[0].length}})}return a?.completion.inline?a:null}function hS(){return(hS=e((()=>{Xo(),Px()})))()}function gS(e){return e.toLowerCase().replace(/[^a-z0-9_-]+/gu,`-`).replace(/^-+|-+$/gu,``)||`item`}function _S(e,t){return Ox(e,`slash-option-command-${gS(t.name)}`)}function vS(e,t,n){return Ox(e,`slash-option-arg-${gS(t)}-${gS(n)}`)}function yS(){return(yS=e((()=>{Px()})))()}function bS(){return{slashCommandDispatchConnected:!1,slashMenuOpen:!1,slashMenuItems:[],slashMenuIndex:0,slashMenuMode:`command`,slashMenuCommand:null,slashMenuArgItems:[],slashMenuCompletion:null,slashCommandRefreshPending:!1}}function Q(e){e.slashMenuOpen=!1,e.slashMenuMode=`command`,e.slashMenuCommand=null,e.slashMenuArgItems=[],e.slashMenuItems=[],e.slashMenuCompletion=null}function xS(e){return e.slashMenuOpen||e.slashMenuMode!==`command`||e.slashMenuCommand!==null||e.slashMenuArgItems.length>0||e.slashMenuItems.length>0}function SS(e,t){xS(e)&&(Q(e),t())}function CS(e,t,n){if(!t.refreshCommands||e.slashCommandRefreshPending)return;let r=t.refreshCommands();!r||typeof r.then!=`function`||(e.slashCommandRefreshPending=!0,Promise.resolve(r).catch(()=>void 0).finally(()=>{e.slashCommandRefreshPending=!1;let r=t.getDraft();if(e.slashMenuMode===`freeform-args`&&e.slashMenuCompletion?.inline){wS(r,e,t,n,{skipSlashIntent:!0});return}if(e.slashMenuMode===`args`&&e.slashMenuCompletion?.inline)return;let i=t.getTextarea()?.selectionStart??r.length;if(!Zr(r,i)){SS(e,n);return}wS(r,e,t,n,{skipSlashIntent:!0})}))}function wS(e,t,n,r,i={}){if(t.slashMenuMode===`freeform-args`&&t.slashMenuCompletion?.inline&&t.slashMenuCommand){let i=n.getTextarea()?.selectionStart??e.length,a=t.slashMenuCompletion;if(pS(e,i,a,t.slashMenuCommand.name)){t.slashMenuCompletion.end=i,r();return}Q(t)}let a=e.match(/^\/(\S+)\s(.*)$/);if(a){i.skipSlashIntent||CS(t,n,r);let e=a[1]?.toLowerCase(),o=a[2]?.toLowerCase();if(e===void 0||o===void 0){SS(t,r);return}let s=si.find(t=>t.name===e&&(n.commandFilter?.(t)??!0)),c=s?n.resolveArgOptions(s):[];if(s&&c.length>0){let e=o?c.filter(e=>e.toLowerCase().startsWith(o)):c;if(e.length>0){t.slashMenuMode=`args`,t.slashMenuCommand=s,t.slashMenuArgItems=e,t.slashMenuOpen=!0,t.slashMenuIndex=0,t.slashMenuItems=[],t.slashMenuCompletion=null,r();return}}SS(t,r);return}let o=n.getTextarea()?.selectionStart??e.length,s=Zr(e,o);if(!s){SS(t,r);return}i.skipSlashIntent||CS(t,n,r);let c=qr(s.query,{showAll:!0,inlineOnly:s.inline,allowImmediateInlineCommands:n.canRunInlineCommand()&&!s.skillOnly}).filter(e=>n.commandFilter?.(e)??!0);t.slashMenuCompletion=s,t.slashMenuItems=[...c.filter(e=>e.source!==`skill`),...c.filter(e=>e.source===`skill`)],t.slashMenuOpen=c.length>0,t.slashMenuIndex=0,t.slashMenuMode=`command`,t.slashMenuCommand=null,t.slashMenuArgItems=[],r()}function TS(e,t,n,r){if(!t.slashMenuCompletion?.inline||e.source===`skill`||!e.args||!n.canRunInlineCommand()||!n.runInlineCommand)return!1;t.slashMenuCommand=e,t.slashMenuIndex=0,t.slashMenuItems=[];let i=n.resolveArgOptions(e);return i.length>0?(t.slashMenuMode=`args`,t.slashMenuArgItems=i,t.slashMenuOpen=!0,r(),!0):dS(e.name,t,n)?(t.slashMenuMode=`freeform-args`,t.slashMenuArgItems=[],t.slashMenuOpen=!1,r(),!0):!1}function ES(e,t,n,r){if(n.activateComposerMode?.(e)||e.source!==`skill`&&!n.canRunInlineCommand()&&t.slashMenuCompletion?.inline)return;let i=e.source===`skill`?`$${e.name}`:`/${e.name}`;if(TS(e,t,n,r))return;if(t.slashMenuCompletion?.inline&&Wa(e)&&n.canRunInlineCommand()&&n.runInlineCommand&&fS(t,n)){Q(t),r(),n.runInlineCommand(`/${e.name}`);return}if(uS(i,t,n)){Q(t),r();return}let a=n.resolveArgOptions(e);if(a.length>0){n.commitDraft(`/${e.name} `),t.slashMenuMode=`args`,t.slashMenuCommand=e,t.slashMenuArgItems=a,t.slashMenuOpen=!0,t.slashMenuIndex=0,t.slashMenuItems=[],r();return}e.executeLocal&&!e.args?(Q(t),n.commitDraft(`/${e.name}`),n.runCommand()):(n.commitDraft(`/${e.name} `),SS(t,r))}function DS(e,t,n,r){let i=e.source===`skill`?`$${e.name}`:`/${e.name}`;if(TS(e,t,n,r))return;if(uS(i,t,n)){Q(t),r();return}let a=n.resolveArgOptions(e);if(a.length>0){n.commitDraft(`/${e.name} `),t.slashMenuMode=`args`,t.slashMenuCommand=e,t.slashMenuArgItems=a,t.slashMenuOpen=!0,t.slashMenuIndex=0,t.slashMenuItems=[],r();return}n.commitDraft(e.args?`/${e.name} `:`/${e.name}`),Q(t),r()}function OS(e,t,n,r,i){let a=t.slashMenuCommand;if(a?.source!==`skill`&&!n.canRunInlineCommand())return;let o=a?.name??``;if(i&&t.slashMenuCompletion?.inline&&a&&Wa(a)&&n.canRunInlineCommand()&&n.runInlineCommand&&fS(t,n)){Q(t),r(),n.runInlineCommand(`/${o} ${e}`);return}if(t.slashMenuCompletion?.inline&&(!i||!a||!Wa(a))&&uS(`/${o} ${e}`,t,n)){Q(t),r();return}Q(t),n.commitDraft(`/${o} ${e}`),i&&n.runCommand(),r()}function kS(e,t,n){let r=e.slashMenuCommand,i=e.slashMenuCompletion;if(e.slashMenuMode!==`freeform-args`||!i?.inline||!r||!Wa(r)||!t.canRunInlineCommand()||!t.runInlineCommand)return!1;let a=t.getTextarea()?.value??t.getDraft(),o=i.argumentStart??i.start+`/${r.name} `.length,s=a.slice(o,i.end).trim();return fS(e,t)?(Q(e),n(),t.runInlineCommand(`/${r.name}${s?` ${s}`:``}`),!0):!1}function AS(e,t){if(!t.canRunInlineCommand()||!t.runInlineCommand)return!1;let n=t.getTextarea()?.value??t.getDraft(),r=mS(n,t.getTextarea()?.selectionStart??n.length);return r?(e.slashMenuMode=`freeform-args`,e.slashMenuCommand=r.command,e.slashMenuCompletion=r.completion,!0):!1}function jS(e,t,n,r,i){if(e.key===`Escape`)return t.slashMenuMode!==`freeform-args`||!t.slashMenuCompletion?.inline?!1:(e.preventDefault(),Q(t),r(),!0);let a=i===`enter`||e.metaKey||e.ctrlKey;return e.key!==`Enter`||e.shiftKey||!a||(t.slashMenuMode!==`freeform-args`||!t.slashMenuCompletion?.inline)&&!AS(t,n)||!t.slashMenuCommand||!Wa(t.slashMenuCommand)?!1:(e.preventDefault(),kS(t,n,r))}function MS(e,t,n,r){if(!t.slashMenuOpen)return!1;if(e.key===`Escape`)return e.preventDefault(),Q(t),r(),!0;let i=t.slashMenuMode===`args`?t.slashMenuArgItems:t.slashMenuItems;if(i.length===0)return!1;if(e.key===`ArrowDown`||e.key===`ArrowUp`){e.preventDefault();let a=e.key===`ArrowDown`?1:i.length-1;return t.slashMenuIndex=(t.slashMenuIndex+a)%i.length,r(),Ex(FS(t,n.paneId)),!0}if(e.key!==`Tab`&&e.key!==`Enter`)return!1;if(e.preventDefault(),t.slashMenuMode===`args`){let i=t.slashMenuArgItems[t.slashMenuIndex];i!==void 0&&OS(i,t,n,r,e.key===`Enter`)}else{let i=t.slashMenuItems[t.slashMenuIndex];i&&(e.key===`Enter`?ES(i,t,n,r):DS(i,t,n,r))}return!0}function NS(e){Dx(e.currentTarget instanceof Element?e.currentTarget:void 0)}function PS(e){return e.slashMenuOpen?e.slashMenuMode===`args`?!!(e.slashMenuCommand&&e.slashMenuArgItems.length>0):e.slashMenuItems.length>0:!1}function FS(e,t){if(!PS(e))return null;if(e.slashMenuMode===`args`){let n=e.slashMenuCommand?.name,r=e.slashMenuArgItems[e.slashMenuIndex];return n&&r?vS(t,n,r):null}let n=e.slashMenuItems[e.slashMenuIndex];return n?_S(t,n):null}function IS(e){if(!PS(e))return``;if(e.slashMenuMode===`args`){let t=e.slashMenuCommand?.name,n=e.slashMenuArgItems[e.slashMenuIndex];return t&&n?`/${t} ${n}`:``}let t=e.slashMenuItems[e.slashMenuIndex];return t?`${`/${t.name}${t.args?` ${t.args}`:``}`} ${xi(t)}`:``}function LS(e){return q[e]??q.terminal}function RS(e,t){let n=e.toLowerCase().startsWith(t.toLowerCase())?t.length:0;return n===0?z`${e}`:z`<mark>${e.slice(0,n)}</mark>${e.slice(n)}`}function zS(e){let{cmd:t,index:n,query:r,requestUpdate:i,host:a,state:o}=e;return z`
|
||
<div
|
||
id=${_S(a.paneId,t)}
|
||
class="slash-menu-item ${n===o.slashMenuIndex?`slash-menu-item--active`:``}"
|
||
role="option"
|
||
aria-selected=${n===o.slashMenuIndex}
|
||
@mousedown=${e=>e.preventDefault()}
|
||
@click=${()=>ES(t,o,a,i)}
|
||
@mouseenter=${()=>{o.slashMenuIndex=n,i()}}
|
||
>
|
||
<span class="slash-menu-icon"
|
||
>${t.source===`skill`?q.pencilSparkles:t.icon?LS(t.icon):q.terminal}</span
|
||
>
|
||
<span class="slash-menu-copy">
|
||
<span class="slash-menu-name"
|
||
>/${RS(t.name,r)}${t.args?z`<span class="slash-menu-args"> ${t.args}</span>`:R}</span
|
||
>
|
||
<span class="slash-menu-desc">${xi(t)}</span>
|
||
</span>
|
||
</div>
|
||
`}function BS(e,t,n,r){let i=Ox(t.paneId,`slash-menu-listbox`);if(!e.slashMenuOpen)return R;if(e.slashMenuMode===`args`&&e.slashMenuCommand&&e.slashMenuArgItems.length>0)return z`
|
||
<div
|
||
id=${i}
|
||
class="slash-menu"
|
||
role="listbox"
|
||
aria-label=${Y(`chat.commands.arguments`)}
|
||
>
|
||
<div
|
||
class="slash-menu__scroll"
|
||
${U(Dx)}
|
||
@scroll=${NS}
|
||
>
|
||
<div class="slash-menu-group">
|
||
<div class="slash-menu-group__label">
|
||
/${e.slashMenuCommand.name} ${xi(e.slashMenuCommand)}
|
||
</div>
|
||
${e.slashMenuArgItems.map((n,i)=>z`
|
||
<div
|
||
id=${vS(t.paneId,e.slashMenuCommand?.name??``,n)}
|
||
class="slash-menu-item ${i===e.slashMenuIndex?`slash-menu-item--active`:``}"
|
||
role="option"
|
||
aria-selected=${i===e.slashMenuIndex}
|
||
@click=${()=>OS(n,e,t,r,!0)}
|
||
@mouseenter=${()=>{e.slashMenuIndex=i,r()}}
|
||
>
|
||
<span class="slash-menu-icon"
|
||
>${e.slashMenuCommand?.icon?LS(e.slashMenuCommand.icon):q.terminal}</span
|
||
>
|
||
<span class="slash-menu-copy">
|
||
<span class="slash-menu-name">${n}</span>
|
||
<span class="slash-menu-desc">/${e.slashMenuCommand?.name} ${n}</span>
|
||
</span>
|
||
</div>
|
||
`)}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
`;if(e.slashMenuItems.length===0)return R;let a=n.slice(1),o=e.slashMenuItems.filter(e=>e.source!==`skill`),s=e.slashMenuItems.filter(e=>e.source===`skill`),c=[];for(let[e,t]of o.entries()){let r=t.category??`session`,i=n===`/`?c.find(([e])=>e===r):c.at(-1);i?.[0]===r?i[1].push({command:t,index:e}):c.push([r,[{command:t,index:e}]])}return z`
|
||
<div id=${i} class="slash-menu" role="listbox" aria-label=${Y(`chat.commands.menu`)}>
|
||
<div
|
||
class="slash-menu__scroll"
|
||
${U(Dx)}
|
||
@scroll=${NS}
|
||
>
|
||
${c.map(([n,i])=>z`<div class="slash-menu-group">
|
||
<div class="slash-menu-group__label">${Fr(n)}</div>
|
||
${i.map(({command:n,index:i})=>zS({cmd:n,index:i,query:a,requestUpdate:r,host:t,state:e}))}
|
||
</div>`)}
|
||
${s.length>0?z`<div class="slash-menu-group slash-menu-group--skills">
|
||
<div class="slash-menu-group__label">${Y(`chat.skills.label`)}</div>
|
||
${s.map((n,i)=>zS({cmd:n,index:o.length+i,query:a,requestUpdate:r,host:t,state:e}))}
|
||
</div>`:R}
|
||
</div>
|
||
</div>
|
||
`}function VS(){return(VS=e((()=>{B(),V(),J(),K(),Xo(),Px(),hS(),yS()})))()}function HS(){return{...bS(),...Kx(),composerComposing:!1,composingDraft:null,composerInputIntentKey:null,pendingClearedSubmittedDraft:null,goalExpandedId:null,goalComposer:null,activeGatewayQuestionId:null,gatewayQuestionCollapsed:!1,questionTakeoverActive:!1,restoreComposerFocus:!1,composerInput:null,composerTextarea:null,microphonePicker:null,capabilityMenuOpen:!1,capabilityMenuView:`root`,textareaRef:null,composerInputRef:null,dictation:null,composerDraftScopeKey:null,dictationError:null,dictationSelection:null}}function US(e){let t=nC.get(e);if(t)return t;let n=HS();return nC.set(e,n),n}function WS(e){return e?.phase===`done`||e?.phase===`interrupted`}function GS(e,t,n){return e.sessionKey===t&&!e.pendingRunId&&(e.sendState===`sending`||e.sendState===`waiting-model`)&&(n==null||e.sendRunId!==n.runId)}function KS(e){return!!(e.canAbort&&e.onAbort)&&!WS(e.runStatus)||e.queue.some(t=>GS(t,e.sessionKey,e.runStatus))}function qS(e){return`${e.currentAgentId}\u0000${e.sessionKey}`}function JS(e,t){e.getDraft?.()!==t&&e.draft!==t&&e.onDraftChange(t)}function YS(e,t){e.composerInputIntentKey=t}function XS(e,t){return e.composerInputIntentKey===t&&(e.composerInputIntentKey=null,!0)}function ZS(e,t){e.pendingClearedSubmittedDraft?.key===t&&(e.pendingClearedSubmittedDraft=null)}function QS(e){return e.inputType===`insertFromPaste`||e.inputType===`insertFromDrop`}function $S(e,t,n,r,i){let a=i.pendingClearedSubmittedDraft;return!a||e.value!==a.value||r||QS(t)?!1:(e.value=n,yx(e),!0)}function eC(e){e.composerDraftScopeKey=null,e.dictation?.dispose(),e.microphonePicker?.dispose(),e.composerInput&&gx(e.composerInput)}function tC(e){if(e){let t=nC.get(e);t&&eC(t),nC.delete(e);return}for(let e of nC.values())eC(e);nC.clear(),Vx()}var nC;function rC(){return(rC=e((()=>{Px(),Wx(),cS(),VS(),nC=new Map})))()}function iC(e){return e===`draft`?z`<span aria-hidden="true">👻</span>`:e===`shared`?q.users:q.lock}function aC(e,t){let n=new Set(e.state?.result?.members.map(e=>e.identityId)??[]);if(t?.startsWith(`visibility:`)){e.visibilityDisabledReason||e.onVisibilityChange(t.slice(11));return}if(!t?.startsWith(`member:`))return;let r=t.slice(7),i=!n.has(r);(i?e.memberAddDisabledReason:e.memberRemoveDisabledReason)||e.onMemberChange(r,i)}function oC(e){return e.sharingRole===`admin`||e.sharingRole===`owner`}function sC(e,t=!1){let n=e.session;if(!n)return R;let r=n.visibility??`shared`;if(!oC(n))return r===`draft`?z`<span class="chat-pane__draft-indicator" title=${Y(`chat.sessionSharing.draft`)}
|
||
>👻</span
|
||
>`:R;let i=e.state?.result,a=new Set(i?.members.map(e=>e.identityId)??[]),o=i?.identities.filter(e=>e.id!==i.owner?.id)??[],s=i?.allowedVisibilities??e.allowedVisibilities??[r],c=r===`draft`&&s.includes(`shared`),l=e.membersAvailable!==!1,u=s.filter(e=>!c||e!==`shared`),d=l&&u.length+o.length+ +!!c>12,f=z`
|
||
${c?z`<wa-dropdown-item
|
||
value="visibility:shared"
|
||
class="session-menu__item chat-pane__publish-draft"
|
||
?disabled=${!!e.visibilityDisabledReason}
|
||
title=${e.visibilityDisabledReason??R}
|
||
>
|
||
<span class="session-menu__text">${Y(`chat.sessionSharing.publishDraft`)}</span>
|
||
<span slot="details" aria-hidden="true">${q.users}</span>
|
||
</wa-dropdown-item>
|
||
<div class="session-menu__separator" role="separator"></div>`:R}
|
||
<div class="chat-pane__sharing-title chat-pane__sharing-visibility-title">
|
||
${Y(`chat.sessionSharing.visibility`)}
|
||
</div>
|
||
${u.map(t=>z`
|
||
<wa-dropdown-item
|
||
class="session-menu__item chat-pane__sharing-visibility-item"
|
||
value=${`visibility:${t}`}
|
||
?disabled=${t===r||!!e.visibilityDisabledReason}
|
||
title=${e.visibilityDisabledReason??R}
|
||
>
|
||
<span class="session-menu__text">${Y(cC[t])}</span>
|
||
${t===r?z`<span slot="details" aria-hidden="true">${q.check}</span>`:R}
|
||
</wa-dropdown-item>
|
||
`)}
|
||
${l?z`
|
||
<div class="chat-pane__sharing-title chat-pane__sharing-members-title">
|
||
${Y(`chat.sessionSharing.members`)}
|
||
</div>
|
||
${e.state?.loading?z`<div class="chat-pane__sharing-status">${Y(`common.loading`)}</div>`:o.length>0?o.map(t=>{let n=a.has(t.id)?e.memberRemoveDisabledReason:e.memberAddDisabledReason;return z`
|
||
<wa-dropdown-item
|
||
class="session-menu__item chat-pane__sharing-member"
|
||
value=${`member:${t.id}`}
|
||
?disabled=${!!n}
|
||
title=${n??R}
|
||
>
|
||
<span slot="icon" class="chat-pane__sharing-member-icon" aria-hidden="true">
|
||
${t.type===`human`?sr(t,`header`):q.bot}
|
||
</span>
|
||
<span
|
||
class="session-menu__text chat-pane__sharing-member-label"
|
||
title=${n?R:t.label??t.id}
|
||
>${t.label??t.id}</span
|
||
>
|
||
${a.has(t.id)?z`<span
|
||
slot="details"
|
||
class="session-menu__check"
|
||
aria-label=${Y(`chat.sessionSharing.selected`)}
|
||
>${q.check}</span
|
||
>`:R}
|
||
</wa-dropdown-item>
|
||
`}):z`<div class="chat-pane__sharing-status">
|
||
${Y(`chat.sessionSharing.noPeople`)}
|
||
</div>`}
|
||
`:R}
|
||
${e.state?.error?z`<div class="chat-pane__sharing-status chat-pane__sharing-status--error" role="alert">
|
||
${e.state.error}
|
||
</div>`:R}
|
||
`;return t?f:z`
|
||
<wa-dropdown
|
||
class="chat-pane__sharing-menu ${d?`chat-pane__sharing-menu--capped`:``}"
|
||
placement="bottom-end"
|
||
@wa-show=${()=>{e.openDisabledReason||e.onOpen()}}
|
||
@wa-select=${t=>{aC(e,t.detail.item.value)}}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-pane__sharing-trigger"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionSharing.menu`)}
|
||
?disabled=${!!e.openDisabledReason}
|
||
title=${e.openDisabledReason??Y(`chat.sessionSharing.current`,{visibility:Y(cC[r])})}
|
||
>
|
||
${iC(r)}
|
||
</button>
|
||
${f}
|
||
</wa-dropdown>
|
||
`}var cC;function lC(){return(lC=e((()=>{B(),J(),Si(),mn(),K(),cC={shared:`chat.sessionSharing.shared`,"read-only":`chat.sessionSharing.readOnly`,suggest:`chat.sessionSharing.suggest`,draft:`chat.sessionSharing.draft`}})))()}function uC(e){return`${e.owner}/${e.repo}#${e.number}`.toLowerCase()}function dC(e){try{let t=JSON.parse(e.getItem(EC)??`{}`);if(!S(t))return{};let n={};for(let[e,r]of Object.entries(t))Array.isArray(r)&&(n[e]=r.filter(e=>typeof e==`string`));return n}catch{return{}}}function fC(e){let t=ke();return!t||!e?new Set:new Set(dC(t)[e]??[])}function pC(e,t){let n=ke();if(!n||!e)return new Set([uC(t)]);let r=dC(n),i=new Set(r[e]??[]);i.add(uC(t)),delete r[e],r[e]=[...i];let a=Object.keys(r).slice(0,-20);for(let e of a)delete r[e];try{n.setItem(EC,JSON.stringify(r))}catch{}return i}function mC(e){switch(e){case`merged`:return Y(`chat.pullRequests.merged`);case`draft`:return Y(`chat.pullRequests.draft`);case`closed`:return Y(`chat.pullRequests.closed`);default:return Y(`chat.pullRequests.open`)}}function hC(e){switch(e.state){case`passing`:return Y(`chat.pullRequests.checksPassing`);case`failing`:return Y(`chat.pullRequests.checksFailing`);default:return Y(`chat.pullRequests.checksPending`)}}function gC(e,t,n){return t===0?R:z`
|
||
<div class="chat-pr__checks-row chat-pr__checks-row--${n}">
|
||
<span class="chat-pr__checks-row-dot" aria-hidden="true"></span>
|
||
<span class="chat-pr__checks-row-label">${e}</span>
|
||
<span class="chat-pr__checks-row-count">${t}</span>
|
||
</div>
|
||
`}function _C(e){let t=e.checks;if(!t)return R;let n=hC(t);return z`
|
||
<details class="chat-pr__checks" data-checks=${t.state}>
|
||
<summary class="chat-pr__checks-pill" aria-label=${n} title=${n}>
|
||
<span class="chat-pr__checks-dot" aria-hidden="true"></span>
|
||
${Y(`chat.pullRequests.checks`)}
|
||
</summary>
|
||
<div
|
||
class="chat-pr__checks-menu"
|
||
role="group"
|
||
aria-label=${Y(`chat.pullRequests.ciMonitoring`)}
|
||
>
|
||
<div class="chat-pr__checks-menu-header">
|
||
<span>${Y(`chat.pullRequests.ciMonitoring`)}</span>
|
||
<a
|
||
href=${e.checksUrl??e.url}
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label=${Y(`chat.pullRequests.openChecks`)}
|
||
>
|
||
${q.externalLink}
|
||
</a>
|
||
</div>
|
||
${gC(Y(`chat.pullRequests.checksPassed`),t.passed,`passed`)}
|
||
${gC(Y(`chat.pullRequests.checksFailed`),t.failed,`failed`)}
|
||
${gC(Y(`chat.pullRequests.checksRunning`),t.running,`running`)}
|
||
${gC(Y(`chat.pullRequests.checksSkipped`),t.skipped,`skipped`)}
|
||
</div>
|
||
</details>
|
||
`}function vC(e){return e.toLocaleString()}function yC(e,t){if(t&&!e.some(e=>e.state===`open`||e.state===`draft`))return t}function bC(e,t){let n=e.filter(e=>e.state===`open`||e.state===`draft`),r=e.filter(e=>e.state!==`open`&&e.state!==`draft`),i=[...n,...r];return t||i.length<=DC?{visible:i,hiddenCount:0}:{visible:i.slice(0,DC),hiddenCount:i.length-DC}}function xC(e,t){if(typeof e.additions!=`number`&&typeof e.deletions!=`number`)return R;let n=z`<span class="chat-pr__additions"
|
||
>+${vC(e.additions??0)}</span
|
||
>`,r=z`<span class="chat-pr__deletions"
|
||
>−${vC(e.deletions??0)}</span
|
||
>`;return t?z`
|
||
<button
|
||
class="chat-pr__diff"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionDiff.show`)}
|
||
@click=${t}
|
||
>
|
||
${n} ${r}
|
||
</button>
|
||
`:z` <span class="chat-pr__diff">${n} ${r}</span> `}function SC(){return z`
|
||
<openclaw-tooltip content=${Y(`chat.pullRequests.rateLimited`)}>
|
||
<span class="chat-pr__warning" role="img" aria-label=${Y(`chat.pullRequests.rateLimited`)}>
|
||
${q.alertTriangle}
|
||
</span>
|
||
</openclaw-tooltip>
|
||
`}function CC(e){return e.createUrl?z`
|
||
<a
|
||
class="chat-pr__create"
|
||
href=${e.createUrl}
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label=${Y(`chat.pullRequests.createPrLabel`,{branch:e.branch})}
|
||
>
|
||
${Y(`chat.pullRequests.createPr`)}
|
||
</a>
|
||
`:R}function wC(e,t,n,r){return z`
|
||
<article class="chat-pr" data-state="branch">
|
||
<span class="chat-pr__link chat-pr__link--static">
|
||
<span class="chat-pr__icon" aria-hidden="true">${q.gitBranch}</span>
|
||
<span class="chat-pr__identity">
|
||
<span class="chat-pr__repo">${e.repo}</span>
|
||
<span class="chat-pr__branch">${e.branch}</span>
|
||
</span>
|
||
</span>
|
||
<span class="chat-pr__meta">
|
||
${xC(e,n)}
|
||
${t?SC():R}
|
||
${r?.result?.status===`published`?z`
|
||
<a
|
||
class="chat-pr__create"
|
||
href=${r.result.url}
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
>
|
||
${Y(`chat.pullRequests.openPublishedPr`)}
|
||
</a>
|
||
`:r?.onPublish?z`
|
||
<button
|
||
class="chat-pr__create"
|
||
type="button"
|
||
?disabled=${r.busy}
|
||
title=${r.error??``}
|
||
@click=${r.onPublish}
|
||
>
|
||
${r.busy?Y(`chat.pullRequests.publishing`):r.result?.status===`requested`?Y(`chat.pullRequests.publicationRequested`):r.error||r.result?.status===`failed`?Y(`chat.pullRequests.retryPublication`):Y(`chat.pullRequests.publishPr`)}
|
||
</button>
|
||
${r.error||r.result?.status===`failed`?CC(e):R}
|
||
`:CC(e)}
|
||
</span>
|
||
${r?.result?.status===`failed`?z`<div class="chat-pr__publication-outcome" data-state="failed" role="status">
|
||
<span>${r.result.message}</span>
|
||
<span>${r.result.nextAction}</span>
|
||
</div>`:r?.error?z`<div class="chat-pr__publication-outcome" data-state="failed" role="status">
|
||
${r.error}
|
||
</div>`:r?.guidance?z`<div class="chat-pr__publication-outcome" data-state="guidance">
|
||
${r.guidance}
|
||
</div>`:R}
|
||
</article>
|
||
`}function TC(e){if(e.pullRequests.length===0&&!e.branch)return R;let{visible:t,hiddenCount:n}=bC(e.pullRequests,e.expanded);return z`
|
||
<div class="chat-prs" aria-live="polite">
|
||
${e.branch?wC(e.branch,e.rateLimited,e.onOpenSessionDiff,{busy:e.publicationBusy===!0,result:e.publicationResult,error:e.publicationError,guidance:e.publicationGuidance,onPublish:e.onPublish}):R}
|
||
${t.map(t=>{let n=t.state===`merged`;return z`
|
||
<article class="chat-pr" data-state=${t.state}>
|
||
<a
|
||
class="chat-pr__link"
|
||
href=${t.url}
|
||
target="_blank"
|
||
rel="noopener noreferrer"
|
||
aria-label=${Y(`chat.pullRequests.linkLabel`,{number:String(t.number),title:t.title})}
|
||
>
|
||
<span class="chat-pr__icon" aria-hidden="true">
|
||
${n?q.gitMerge:q.gitPullRequest}
|
||
</span>
|
||
<span class="chat-pr__number">#${t.number}</span>
|
||
<span class="chat-pr__identity">
|
||
<span class="chat-pr__repo">${t.repo}</span>
|
||
<span class="chat-pr__branch">${t.branch}</span>
|
||
</span>
|
||
</a>
|
||
<span class="chat-pr__meta">
|
||
${xC(t)} ${_C(t)}
|
||
${t.state===`open`?R:z`<span class="chat-pr__state">${mC(t.state)}</span>`}
|
||
${e.rateLimited&&!n?SC():R}
|
||
<button
|
||
class="chat-pr__dismiss"
|
||
type="button"
|
||
aria-label=${Y(`chat.pullRequests.dismiss`,{number:String(t.number)})}
|
||
@click=${()=>e.onDismiss(t)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</span>
|
||
</article>
|
||
`})}
|
||
${n>0?z`
|
||
<button class="chat-prs__more" type="button" @click=${e.onExpand}>
|
||
${Y(`chat.pullRequests.showMore`,{count:String(n)})}
|
||
</button>
|
||
`:R}
|
||
</div>
|
||
`}var EC,DC;function OC(){return(OC=e((()=>{B(),J(),G(),K(),EC=`openclaw.chat.dismissedPullRequests`,DC=2})))()}function kC(e){return z`<resizable-divider
|
||
${U(e.onElement??(()=>{}))}
|
||
class=${e.className??R}
|
||
.splitRatio=${e.splitRatio}
|
||
.minRatio=${e.minRatio??.4}
|
||
.maxRatio=${e.maxRatio??.7}
|
||
.measureRatio=${e.measureRatio}
|
||
.measureSize=${e.measureSize}
|
||
.label=${e.label}
|
||
.orientation=${e.orientation}
|
||
@dragover=${e.onDragover??(()=>{})}
|
||
@drop=${e.onDrop??(()=>{})}
|
||
@resize=${e.onResize}
|
||
></resizable-divider>`}function AC(){return(AC=e((()=>{B(),V()})))()}function jC(e){return e.event!==`talk.event`||!e.payload||typeof e.payload!=`object`?null:e.payload}function MC(e){return e instanceof DOMException?Ls(e):Ee(e)}function NC(e){return e instanceof DOMException&&e.name===`AbortError`}function PC(e,t,n,r){let i=t.trim();if(!i)return{value:e,caret:r};let a=Math.max(0,Math.min(n,e.length)),o=Math.max(a,Math.min(r,e.length)),s=e.slice(0,a),c=e.slice(o),l=`${s&&!/\s$/.test(s)&&!/^\s|^[,.;:!?)]/.test(i)?` `:``}${i}${c&&!/^\s|^[,.;:!?)]/.test(c)&&!/[\s([{]$/.test(i)?` `:``}`;return{value:`${s}${l}${c}`,caret:s.length+l.length}}var FC,IC,LC,RC,zC,BC,VC;function HC(){return(HC=e((()=>{kt(),K(),Fe(),Bs(),Gs(),Ks(),FC=150,IC=350,LC=`g711_ulaw`,RC=8e3,zC=RC*10,BC=class{constructor(e,t){this.client=e,this.callbacks=t,this.input=new ac(e=>this.reportFailure(e)),this.context=null,this.inputPump=new Rs,this.inputMeter=null,this.unsubscribe=null,this.sessionId=null,this.transcriptionSessionId=null,this.finalTranscripts=[],this.currentPartial=``,this.startPromise=null,this.pendingAudio=[],this.pendingAudioSamples=0,this.appendChain=Promise.resolve(),this.closePromise=null,this.stopped=!1,this.discarded=!1,this.failed=!1}start(){return this.startPromise??=this.startInternal(),this.startPromise}async startInternal(){let e=Rt().realtimeTalkInputDeviceId?.trim()||void 0,t=await this.input.open(e);if(this.stopped)return;this.unsubscribe=this.client.addEventListener(e=>this.handleEvent(e));try{this.context=new AudioContext({sampleRate:RC})}catch{throw Error(Y(`chat.composer.dictationBrowserAudioUnsupported`))}if(this.context.sampleRate!==RC)throw Error(Y(`chat.composer.dictationBrowserAudioUnsupported`));this.inputMeter=new Zs(this.callbacks.onLevel),this.inputMeter.start(t,this.context),this.inputPump.start(t,this.context,e=>this.appendAudio(e)),this.callbacks.onReady();let n=await this.client.request(`talk.session.create`,{mode:`transcription`,transport:`gateway-relay`,brain:`none`});if(this.sessionId=n.sessionId,this.transcriptionSessionId=n.transcriptionSessionId??n.sessionId,n.audio?.inputEncoding!==LC||n.audio.inputSampleRateHz!==RC)throw await this.closeRemote(),Error(Y(`chat.composer.dictationAudioUnsupported`));this.discarded?(this.pendingAudio.length=0,this.pendingAudioSamples=0):this.flushPendingAudio(),this.stopped&&(await this.appendChain,await this.closeRemote())}transcriptSnapshot(){return this.transcriptIncludingPartial()}async finish(){await this.stopCapture(),await this.startPromise?.catch(e=>{NC(e)||this.reportFailure(MC(e))}),await this.appendChain,await this.closeRemote()}async cancel(){this.discarded=!0,await this.stopCapture(),await this.startPromise?.catch(()=>void 0),await this.appendChain,await this.closeRemote()}markGatewayDisconnected(){return this.hasTranscript()}appendAudio(e){if(!this.stopped){if(!this.sessionId){let t=zC-this.pendingAudioSamples;if(t<=0)return;let n=e.slice(0,t);this.pendingAudio.push(n),this.pendingAudioSamples+=n.length;return}this.queueAudio(e)}}flushPendingAudio(){let e=this.pendingAudio.splice(0);this.pendingAudioSamples=0;for(let t of e)this.queueAudio(t)}queueAudio(e){if(!this.sessionId)return;let t=this.sessionId,n=fc(Qs(e));this.appendChain=this.appendChain.then(async()=>{await this.client.request(`talk.session.appendAudio`,{sessionId:t,audioBase64:n})}).catch(e=>{this.reportFailure(MC(e))})}handleEvent(e){let t=jC(e);if(!(!t||t.transcriptionSessionId!==this.transcriptionSessionId||this.stopped)){if(t.type===`partial`&&typeof t.text==`string`){this.currentPartial=t.text.trim(),this.callbacks.onTranscriptChange();return}if(t.type===`transcript`&&typeof t.text==`string`){let e=t.text.trim();if(t.final!==!0){this.currentPartial=e,this.callbacks.onTranscriptChange();return}e&&(this.finalTranscripts.push(e),this.currentPartial=``),this.callbacks.onTranscriptChange();return}if(t.type===`error`){this.reportFailure(Be(typeof t.message==`string`?t.message:void 0,Y(`chat.composer.dictationFailed`)));return}t.type===`close`&&t.reason===`error`&&this.reportFailure(Y(`chat.composer.dictationDisconnected`))}}reportFailure(e){this.failed||(this.failed=!0,this.callbacks.onError(e,this.hasTranscript()))}hasTranscript(){return this.finalTranscripts.length>0||!!this.currentPartial}transcriptIncludingPartial(){return[...this.finalTranscripts,this.currentPartial].filter(Boolean).join(` `).trim()}async stopCapture(){this.stopped||(this.stopped=!0,this.input.stop(),this.inputPump.stop(),this.unsubscribe?.(),this.unsubscribe=null,this.inputMeter?.stop(),this.inputMeter=null,await this.context?.close(),this.context=null)}closeRemote(){return this.sessionId?(this.closePromise??=this.client.request(`talk.session.close`,{sessionId:this.sessionId}).then(()=>void 0).catch(()=>void 0),this.closePromise):Promise.resolve()}},VC=class{constructor(e){this.inputLevel=new zs,this.phase=`idle`,this.pointerId=null,this.pointerTarget=null,this.pointerBounds=null,this.holdTimer=null,this.session=null,this.suppressClick=!1,this.suppressedPointerId=null,this.suppressClickTimer=null,this.disposed=!1,this.handleDocumentPointerMove=e=>{if(e.pointerId!==this.pointerId||!this.pointerBounds)return;let t=this.pointerBounds;(e.clientX<t.left||e.clientX>t.right||e.clientY<t.top||e.clientY>t.bottom)&&this.stop({commit:!1})},this.handleDocumentPointerUp=e=>{if(e.pointerId===this.pointerId){if(this.phase===`pressing`||this.phase===`holding`){let e=this.phase===`pressing`;this.clearPointerGesture(),this.setPhase(`idle`),e&&this.options.onTap?.(),this.expireClickSuppression();return}this.stop({commit:!0})}},this.handleDocumentPointerCancel=e=>{e.pointerId===this.pointerId&&this.stop({commit:!1})},this.handleSuppressedPointerRelease=e=>{e.pointerId===this.suppressedPointerId&&this.expireClickSuppression()},this.handleDocumentKeyDown=e=>{e.key===`Escape`&&this.phase!==`idle`&&(e.preventDefault(),e.stopPropagation(),this.stop({commit:!1}))},this.handleLostPointerCapture=e=>{e.pointerId===this.pointerId&&this.stop({commit:!1})},this.handleVisibilityChange=()=>{document.visibilityState===`hidden`&&(this.clearClickSuppression(),this.stop({commit:!1}))},this.handleWindowBlur=()=>{this.clearClickSuppression(),this.stop({commit:!1})},this.options=e}get active(){return this.phase===`connecting`||this.phase===`recording`||this.phase===`stopping`}get connecting(){return this.phase===`connecting`}get arming(){return this.phase===`holding`}get finalizing(){return this.phase===`stopping`}get locksComposer(){return this.phase!==`idle`}get transcript(){return this.session?.transcriptSnapshot()??``}finishActive(){return this.stop({commit:!0})}startDirect(){return this.phase!==`idle`||!this.canHold()?!1:(this.setPhase(`holding`),this.start(),!0)}update(e){if(this.options=e,this.phase!==`stopping`&&(this.phase!==`idle`&&!this.canHold()||this.active&&!e.connected)){let t=this.active&&!e.connected,n=t?this.session?.markGatewayDisconnected()??!1:!1;this.stop({commit:t}),t&&e.onError(Y(`chat.composer.dictationDisconnected`),{kind:`interrupted`,preservesText:n})}}handlePointerDown(e){return e.button!==0||this.phase!==`idle`||!this.canHold()?!1:(e.preventDefault(),this.pointerId=e.pointerId,this.pointerTarget=e.currentTarget instanceof HTMLElement?e.currentTarget:null,this.pointerBounds=this.pointerTarget?.getBoundingClientRect()??null,this.pointerTarget?.setPointerCapture?.(e.pointerId),this.pointerTarget?.addEventListener(`lostpointercapture`,this.handleLostPointerCapture),this.suppressClick=!0,this.suppressedPointerId=e.pointerId,this.setPhase(`pressing`),this.holdTimer=globalThis.setTimeout(()=>{this.phase===`pressing`&&(this.setPhase(`holding`),this.holdTimer=globalThis.setTimeout(()=>void this.start(),IC))},FC),document.addEventListener(`pointermove`,this.handleDocumentPointerMove),document.addEventListener(`pointerup`,this.handleDocumentPointerUp),document.addEventListener(`pointercancel`,this.handleDocumentPointerCancel),document.addEventListener(`pointerup`,this.handleSuppressedPointerRelease),document.addEventListener(`pointercancel`,this.handleSuppressedPointerRelease),!0)}handleClick(e){if(this.suppressClick){this.clearClickSuppression(),e.preventDefault();return}if(this.active){e.preventDefault(),this.finishActive();return}if(this.phase!==`idle`){e.preventDefault();return}this.options.onTap?.()}handleContextMenu(e){this.phase!==`idle`&&e.preventDefault()}dispose(){this.disposed=!0,this.clearClickSuppression(),this.stop({commit:!1})}canHold(){return this.options.enabled&&this.options.connected&&!this.options.realtimeTalkActive&&this.options.client!==null}async start(){let e=this.options.client;if(this.phase!==`holding`||!e||!this.canHold()){await this.stop({commit:!1});return}if(this.options.dictationAvailable===!1){this.clearPointerGesture(),this.setPhase(`idle`),this.options.onDictationUnavailable?.();return}this.clearPointerGesture(),this.setPhase(`connecting`);let t=new BC(e,{onError:(e,n)=>{if(this.session===t)try{this.options.onError(e,{kind:`interrupted`,preservesText:n})}finally{this.stop({commit:!0})}},onLevel:e=>this.inputLevel.set(e),onTranscriptChange:()=>this.options.onStateChange(),onReady:()=>{this.session===t&&this.phase===`connecting`&&this.setPhase(`recording`)}});this.session=t;try{await t.start()}catch(e){if(this.session!==t||this.disposed||this.isStopping())return;this.options.onError(MC(e),{kind:`start`,preservesText:!1}),await this.stop({commit:!1})}}stop(e){if(this.phase===`idle`||this.phase===`stopping`)return Promise.resolve(!1);let t=this.active;this.clearPointerGesture();let n=this.session;if(!n)return this.reset(),Promise.resolve(!1);this.setPhase(`stopping`);let r=e.commit?n.transcriptSnapshot():``,i=!!(e.commit&&r&&t&&!this.disposed);return this.session=null,this.reset(),i&&this.options.onCommit(r),(e.commit?n.finish():n.cancel()).catch(()=>void 0),Promise.resolve(i)}reset(){this.inputLevel.set(0),this.setPhase(`idle`)}clearPointerGesture(){if(this.holdTimer!==null&&(globalThis.clearTimeout(this.holdTimer),this.holdTimer=null),this.pointerId!==null){this.pointerTarget?.removeEventListener(`lostpointercapture`,this.handleLostPointerCapture);try{this.pointerTarget?.releasePointerCapture?.(this.pointerId)}catch{}}this.pointerId=null,this.pointerTarget=null,this.pointerBounds=null,document.removeEventListener(`pointermove`,this.handleDocumentPointerMove),document.removeEventListener(`pointerup`,this.handleDocumentPointerUp),document.removeEventListener(`pointercancel`,this.handleDocumentPointerCancel)}expireClickSuppression(){!this.suppressClick||this.suppressClickTimer!==null||(this.suppressClickTimer=globalThis.setTimeout(()=>this.clearClickSuppression(),0))}clearClickSuppression(){this.suppressClickTimer!==null&&(globalThis.clearTimeout(this.suppressClickTimer),this.suppressClickTimer=null),document.removeEventListener(`pointerup`,this.handleSuppressedPointerRelease),document.removeEventListener(`pointercancel`,this.handleSuppressedPointerRelease),this.suppressedPointerId=null,this.suppressClick=!1}isStopping(){return this.phase===`stopping`}setPhase(e){this.phase!==e&&(this.phase===`idle`?(document.addEventListener(`keydown`,this.handleDocumentKeyDown),document.addEventListener(`visibilitychange`,this.handleVisibilityChange),window.addEventListener(`blur`,this.handleWindowBlur)):e===`idle`&&(document.removeEventListener(`keydown`,this.handleDocumentKeyDown),document.removeEventListener(`visibilitychange`,this.handleVisibilityChange),window.removeEventListener(`blur`,this.handleWindowBlur)),this.phase=e,this.options.onStateChange())}}})))()}var UC;function WC(){return(WC=e((()=>{Gs(),UC=class{constructor(e){this.requestUpdate=e,this.devicesValue=[],this.loadingValue=!1,this.openValue=!1,this.issueValue=null,this.deviceWatch=null,this.discoveryRequest=0,this.catalogClient=null,this.catalogConnected=!1,this.catalogRequest=0,this.realtimeStatusValue=`unknown`,this.dictationStatusValue=`unknown`,this.refreshOnFocus=()=>this.loadCatalog(),this.handleOpen=()=>{this.openValue||(this.openValue=!0,this.deviceWatch??=Js(this.discover),this.discover(),this.loadCatalog())},this.handleClose=()=>{this.openValue&&(this.release(),this.openValue=!1,this.requestUpdate())},this.discover=()=>{this.loadingValue=!0,this.issueValue=null;let e=++this.discoveryRequest;this.requestUpdate(),Us(!0).then(t=>{e===this.discoveryRequest&&(this.devicesValue=t.devices,this.issueValue=t.issue)}).catch(()=>{e===this.discoveryRequest&&(this.devicesValue=[],this.issueValue=`failed`)}).finally(()=>{e===this.discoveryRequest&&(this.loadingValue=!1,this.requestUpdate())})}}get devices(){return this.devicesValue}get loading(){return this.loadingValue}get open(){return this.openValue}get issue(){return this.issueValue}get realtimeStatus(){return this.realtimeStatusValue}get dictationStatus(){return this.dictationStatusValue}syncCatalog(e,t){if(e!==this.catalogClient||t!==this.catalogConnected){if(window.removeEventListener(`focus`,this.refreshOnFocus),this.catalogClient=e,this.catalogConnected=t,this.catalogRequest++,!e||!t){this.realtimeStatusValue=`unknown`,this.dictationStatusValue=`unknown`;return}window.addEventListener(`focus`,this.refreshOnFocus),this.loadCatalog(!1)}}release(){this.deviceWatch?.(),this.deviceWatch=null}dispose(){window.removeEventListener(`focus`,this.refreshOnFocus),this.release(),this.discoveryRequest++,this.catalogRequest++,this.catalogClient=null,this.catalogConnected=!1,this.realtimeStatusValue=`unknown`,this.dictationStatusValue=`unknown`,this.openValue=!1,this.loadingValue=!1}loadCatalog(e=!0){let t=this.catalogClient;if(!t||!this.catalogConnected)return;let n=++this.catalogRequest;this.realtimeStatusValue===`unknown`&&(this.realtimeStatusValue=`checking`),this.dictationStatusValue===`unknown`&&(this.dictationStatusValue=`checking`),e&&this.requestUpdate(),t.request(`talk.catalog`,{}).then(e=>{n===this.catalogRequest&&(this.realtimeStatusValue=e.realtime?.ready===!0?`ready`:`unavailable`,this.dictationStatusValue=e.transcription?.ready===!0?`ready`:`unavailable`)}).catch(()=>{n===this.catalogRequest&&(this.realtimeStatusValue===`checking`&&(this.realtimeStatusValue=`unknown`),this.dictationStatusValue===`checking`&&(this.dictationStatusValue=`unknown`))}).finally(()=>{n===this.catalogRequest&&this.requestUpdate()})}}})))()}function GC(e){return e instanceof HTMLDetailsElement?e.open:`open`in e&&e.open===!0||e.hasAttribute(`open`)}function KC(e=document){return Array.from(e.querySelectorAll(`.agent-chat__input details, .agent-chat__input wa-dropdown`)).filter(GC)}function qC(e){aw.delete(e),e.removeAttribute(sw),e instanceof HTMLDetailsElement?e.open=!1:(`open`in e&&(e.open=!1),e.removeAttribute(`open`))}function JC(e){return e instanceof HTMLDetailsElement?e.querySelector(`summary`):e.querySelector(`[slot=trigger]`)}function YC(e){let t=e.composedPath();for(let e of KC())t.includes(e)||qC(e);for(let e of document.querySelectorAll(`.agent-chat__input > :is(.slash-menu, .skill-menu)`))t.includes(e)||e.closest(`.agent-chat__input`)?.dispatchEvent(new CustomEvent(cw))}function XC(e){if(e.key!==`Escape`||document.querySelector(`.shell-nav[aria-modal='true']`))return;let t=KC(),n=document.querySelector(`.agent-chat__input > :is(.slash-menu, .skill-menu)`)?.closest(`.agent-chat__input`);if(t.length===0&&!n)return;e.preventDefault(),e.stopPropagation();let r=t.at(-1);t.forEach(qC),n?.dispatchEvent(new CustomEvent(cw)),n?.querySelector(`.agent-chat__composer-combobox > textarea`)?.focus({preventScroll:!0}),r&&JC(r)?.focus({preventScroll:!0})}function ZC(){lw||typeof document>`u`||(lw=!0,document.addEventListener(`pointerdown`,YC,!0),window.addEventListener(`keydown`,XC,!0),document.addEventListener(`keydown`,e=>{let t=e.composedPath().find(e=>e instanceof HTMLElement&&e.localName===`wa-dropdown`);t&&(aw.delete(t),t.removeAttribute(sw))},!0))}function QC(e){let t=e.closest(`.agent-chat__input`);if(t)for(let n of KC(t))n!==e&&qC(n)}function $C(e){let t=e.currentTarget;t instanceof HTMLDetailsElement&&t.open&&(ZC(),QC(t))}function ew(e){let t=e.target;t instanceof HTMLElement&&t.localName===`wa-dropdown`&&(aw.has(t)||t.removeAttribute(sw),ZC(),QC(t))}function tw(e){let t=e.composedPath().find(e=>e instanceof HTMLElement&&e.localName===`wa-dropdown`);t&&(aw.add(t),t.setAttribute(sw,``))}function nw(e){let t=e.target instanceof HTMLElement&&e.target.localName===`wa-dropdown`?e.target:e.currentTarget;if(t instanceof HTMLElement&&t.localName===`wa-dropdown`&&aw.delete(t)){let e=JC(t);if(!e)return;e.setAttribute(ow,``);let n=()=>e.removeAttribute(ow);e.addEventListener(`blur`,n,{once:!0}),e.addEventListener(`keydown`,n,{once:!0}),e.focus({preventScroll:!0})}}function rw(e){let t=typeof window.matchMedia==`function`&&window.matchMedia(iw).matches?e.closest(`.agent-chat__input`)??void 0:void 0;wo(e,`top`,{alignment:`end`,anchor:t})}var iw,aw,ow,sw,cw,lw;function uw(){return(uw=e((()=>{ao(),iw=`(max-width: 640px), (max-width: 932px) and (max-height: 500px) and (orientation: landscape)`,aw=new WeakSet,ow=`data-chat-pointer-restored-focus`,sw=`data-chat-pointer-opened-picker`,cw=`openclaw-composer-dismiss-invocations`,lw=!1})))()}function dw(e,t){return y(e?.[t])}function fw(e){for(let t=(e?.length??0)-1;t>=0;--t){let n=C(e?.[t]);if(n?.role===`user`)return null;if(n?.role!==`assistant`||mc(n))continue;let r=C(n.cost),i=C(C(n.usage)?.cost),a={};for(let e of[`input`,`output`,`cacheRead`,`cacheWrite`]){let t=dw(r,e)??dw(i,e);t!==void 0&&(a[e]=t)}if([a.input,a.output,a.cacheRead,a.cacheWrite].some(e=>e!=null))return a}return null}function pw(e){for(let t=(e?.length??0)-1;t>=0;--t){let n=C(e?.[t]);if(!(n?.role!==`assistant`||mc(n)))return typeof n.provider==`string`&&n.provider.trim()||null}return null}function mw(e){let t=e.trim().replace(/^#/,``);return/^[0-9a-fA-F]{6}$/.test(t)?[Number.parseInt(t.slice(0,2),16),Number.parseInt(t.slice(2,4),16),Number.parseInt(t.slice(4,6),16)]:null}function hw(){if(Tw)return Tw;let e=getComputedStyle(document.documentElement),t=e.getPropertyValue(`--warn`).trim()||`#f59e0b`,n=e.getPropertyValue(`--danger`).trim()||`#ef4444`;return Tw={warnHex:t,dangerHex:n,warnRgb:mw(t)??[245,158,11],dangerRgb:mw(n)??[239,68,68]},Tw}function gw(e,t){let n=e?.totalTokens,r=e?.contextTokens??t??0;if(typeof n!=`number`||!Number.isFinite(n)||n<0||!r)return null;let i=e?.totalTokensFresh===!1,a=n/r,o=Math.min(Math.round(a*100),100),s=!i&&a>=ww,c={used:n,limit:r,input:Number.isFinite(e?.inputTokens)?e?.inputTokens??null:null,output:Number.isFinite(e?.outputTokens)?e?.outputTokens??null:null,cost:typeof e?.estimatedCostUsd==`number`&&Number.isFinite(e.estimatedCostUsd)&&e.estimatedCostUsd>=0?e.estimatedCostUsd:null};if(!s)return{pct:o,...c,detail:`${i?`~`:``}${We(n)} / ${We(r)}`,color:`var(--muted)`,bg:`color-mix(in srgb, var(--muted) 8%, transparent)`,warning:s,approximate:i};let{warnRgb:l,dangerRgb:u}=hw(),[d,f,p]=l,[m,h,g]=u,_=Math.min(Math.max((a-.85)/.1,0),1),v=Math.round(d+(m-d)*_),y=Math.round(f+(h-f)*_),b=Math.round(p+(g-p)*_),x=`rgb(${v}, ${y}, ${b})`,S=`rgba(${v}, ${y}, ${b}, ${.08+.08*_})`;return{pct:o,...c,detail:`${We(n)} / ${We(r)}`,color:x,bg:S,warning:s,approximate:i}}function _w(e){if(e===`5h`)return Y(`chat.composer.contextUsage.limitFiveHour`);if(e===`Week`)return Y(`chat.composer.contextUsage.limitWeekly`);if(e===`Day`)return Y(`chat.composer.contextUsage.limitDaily`);let t=/^(\d+)h$/.exec(e);return t?Y(`chat.composer.contextUsage.limitHours`,{hours:t[1]??``}):e}function vw(e,t){if(/^[A-Za-z]{3}$/.test(t))try{return new Intl.NumberFormat(void 0,{style:`currency`,currency:t.toUpperCase(),maximumFractionDigits:2}).format(e)}catch{}return`${e.toFixed(2)} ${t}`}function yw(e,t){let n=e>=90?`danger`:e>=75?`warn`:null;return z`
|
||
<div
|
||
class="context-usage__limit-bar"
|
||
role="progressbar"
|
||
aria-label=${t}
|
||
aria-valuemin="0"
|
||
aria-valuemax="100"
|
||
aria-valuenow=${e}
|
||
>
|
||
<span
|
||
class=${n?`context-usage__limit-fill--${n}`:``}
|
||
style="width: ${e}%"
|
||
></span>
|
||
</div>
|
||
`}function bw(e){let t=_w(e.label),n=fa(e.resetAt);return z`
|
||
<div class="context-usage__limit">
|
||
<div class="context-usage__limit-head">
|
||
<span class="context-usage__limit-label">${t}</span>
|
||
<span class="context-usage__limit-meta">
|
||
${n?z`<span class="context-usage__limit-reset"
|
||
>${Y(`chat.composer.contextUsage.resets`,{time:n})}</span
|
||
>`:R}
|
||
<strong>${e.usedPercent}%</strong>
|
||
</span>
|
||
</div>
|
||
${yw(e.usedPercent,t)}
|
||
</div>
|
||
`}function xw(e){let t=e.label||Y(`chat.composer.contextUsage.usageCredits`),n=Math.max(0,Math.min(100,Math.round(e.used/e.limit*100))),r=Y(`chat.composer.contextUsage.budgetValue`,{used:vw(e.used,e.unit),limit:vw(e.limit,e.unit)});return z`
|
||
<div class="context-usage__limit">
|
||
<div class="context-usage__limit-head">
|
||
<span class="context-usage__limit-label">${t}</span>
|
||
<span class="context-usage__limit-meta"><strong>${r}</strong></span>
|
||
</div>
|
||
${yw(n,t)}
|
||
</div>
|
||
`}function Sw(e,t){return z`
|
||
<div class="context-usage__section-label context-usage__plan-header">
|
||
<span>${Y(`chat.composer.contextUsage.planUsage`)}</span>
|
||
<a
|
||
class="context-usage__plan-link"
|
||
href=${t}
|
||
data-chat-provider-usage="true"
|
||
aria-label=${Y(`chat.composer.contextUsage.openUsage`)}
|
||
>
|
||
${e.plan?z`<span class="context-usage__plan-badge">${e.plan}</span>`:R}
|
||
${q.externalLink}
|
||
</a>
|
||
</div>
|
||
${e.accountEmail?z`<div class="context-usage__account" data-chat-usage-account="true">
|
||
${e.accountEmail}
|
||
</div>`:R}
|
||
<div class="context-usage__limits">
|
||
${e.windows.map(e=>bw(e))}
|
||
${e.budgets.map(e=>xw(e))}
|
||
</div>
|
||
<div class="context-usage__provenance" data-chat-usage-provider="true">
|
||
<span>${Y(`sessionsView.provider`)}:</span>
|
||
<strong>${e.displayName}</strong>
|
||
</div>
|
||
`}function Cw(e,t,n={}){let r=gw(e,t),i=n.providerUsage?za(n.providerUsage.modelAuthStatusResult??null,Gr):[],a=(e?.modelProvider?.trim()||pw(n.messages))?.toLowerCase(),o=a?i.find(e=>e.providers.some(e=>e.trim().toLowerCase()===a)):void 0;if(!r&&!o)return R;let s=r?Y(`chat.composer.contextUsage.summary`,{used:`${r.approximate?`~`:``}${We(r.used)}`,limit:We(r.limit),pct:`${r.approximate?`~`:``}${r.pct}`}):Y(`chat.usageRemaining`),c=r?`${r.approximate?`~`:``}${r.pct}%`:null,l=r?Dw*(1-r.pct/100):Dw,u=r?fw(n.messages):null,d=!o,f=`${zt(n.providerUsage?.basePath??``)}/usage`,p=e=>e===null?Y(`usage.common.emptyValue`):We(e),m=(e,t)=>t===void 0||t<=0?R:z`
|
||
<div>
|
||
<dt>${e}</dt>
|
||
<dd>${Ce(t)}</dd>
|
||
</div>
|
||
`,h=u?[u.input,u.output,u.cacheRead,u.cacheWrite].some(e=>e!==void 0&&e>0):!1;return z`
|
||
<div
|
||
class="context-usage"
|
||
style=${r?`--ctx-color:${r.color};--ctx-bg:${r.bg}`:``}
|
||
>
|
||
<details @toggle=${$C}>
|
||
<summary
|
||
class="context-ring ${r?.warning?`context-ring--warning`:``}"
|
||
aria-label=${s}
|
||
title=${Y(`chat.composer.contextUsage.open`)}
|
||
>
|
||
<svg
|
||
class="context-ring__dial"
|
||
viewBox="0 0 16 16"
|
||
width="16"
|
||
height="16"
|
||
aria-hidden="true"
|
||
>
|
||
<circle class="context-ring__track" cx="8" cy="8" r=${Ew} />
|
||
<circle
|
||
class="context-ring__fill"
|
||
cx="8"
|
||
cy="8"
|
||
r=${Ew}
|
||
stroke-dasharray=${Dw.toFixed(2)}
|
||
stroke-dashoffset=${l.toFixed(2)}
|
||
/>
|
||
</svg>
|
||
</summary>
|
||
<section class="context-usage__popover" aria-label=${Y(`chat.composer.contextUsage.title`)}>
|
||
${r?z`
|
||
<div class="context-usage__header">
|
||
<span class="context-usage__title"
|
||
>${Y(`chat.composer.contextUsage.contextWindow`)}</span
|
||
>
|
||
<strong class="context-usage__context-value"
|
||
>${r.detail} · ${c}</strong
|
||
>
|
||
</div>
|
||
<div
|
||
class="context-usage__bar"
|
||
role="progressbar"
|
||
aria-label=${s}
|
||
aria-valuemin="0"
|
||
aria-valuemax="100"
|
||
aria-valuenow=${r.pct}
|
||
>
|
||
<span style="width: ${r.pct}%"></span>
|
||
</div>
|
||
`:R}
|
||
${r?z`
|
||
<div class="context-usage__section-label">
|
||
${Y(`chat.composer.contextUsage.latestRunTokens`)}
|
||
</div>
|
||
<dl class="context-usage__stats">
|
||
<div>
|
||
<dt>${Y(`usage.breakdown.input`)}</dt>
|
||
<dd>${p(r.input)}</dd>
|
||
</div>
|
||
<div>
|
||
<dt>${Y(`usage.breakdown.output`)}</dt>
|
||
<dd>${p(r.output)}</dd>
|
||
</div>
|
||
${!d||r.cost===null?R:z`
|
||
<div>
|
||
<dt>${Y(`chat.composer.contextUsage.estimatedCost`)}</dt>
|
||
<dd>${Ce(r.cost)}</dd>
|
||
</div>
|
||
`}
|
||
</dl>
|
||
`:R}
|
||
${d&&u&&h?z`
|
||
<div class="context-usage__section-label">${Y(`usage.breakdown.costByType`)}</div>
|
||
<dl class="context-usage__stats">
|
||
${m(Y(`usage.breakdown.input`),u.input)}
|
||
${m(Y(`usage.breakdown.output`),u.output)}
|
||
${m(Y(`usage.breakdown.cacheRead`),u.cacheRead)}
|
||
${m(Y(`usage.breakdown.cacheWrite`),u.cacheWrite)}
|
||
</dl>
|
||
`:R}
|
||
${o?Sw(o,f):R}
|
||
</section>
|
||
</details>
|
||
</div>
|
||
`}var ww,Tw,Ew,Dw;function Ow(){return(Ow=e((()=>{b(),B(),_c(),an(),J(),K(),Je(),Or(),uo(),uw(),ww=.85,Tw=null,Ew=6.5,Dw=2*Math.PI*Ew})))()}function kw(e){return e===Pw.length?Pw:Array.from({length:e},(t,n)=>.35+.65*Math.sin(Math.PI*((n+.5)/e)))}function Aw(e){return e===`connecting`||e===`thinking`?e:`listening`}function jw(e,t){return t?.trim()||Y(e===`thinking`?`chat.voice.asking`:e===`connecting`?`chat.voice.connecting`:`chat.voice.listening`)}function Mw(e){return z`
|
||
<openclaw-microphone-activity
|
||
class="agent-chat__voice-activity"
|
||
data-status=${Aw(e.status)}
|
||
data-source="microphone"
|
||
bars=${ct(e.bars)}
|
||
mode=${ct(e.mode)}
|
||
aria-hidden="true"
|
||
.signal=${e.inputLevel??Iw}
|
||
>
|
||
</openclaw-microphone-activity>
|
||
`}function Nw(e){return e.status!==`error`||!e.detail?R:z`
|
||
<div class="agent-chat__composer-error agent-chat__talk-status" role="alert">
|
||
<span class="agent-chat__composer-error-icon" aria-hidden="true">${q.alertTriangle}</span>
|
||
<span class="agent-chat__talk-status-text">${e.detail}</span>
|
||
${e.onDismissError?z`
|
||
<button
|
||
class="callout__dismiss"
|
||
type="button"
|
||
@click=${e.onDismissError}
|
||
aria-label=${Y(`chat.composer.dismissVoiceInputError`)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
`:R}
|
||
</div>
|
||
`}var Pw,Fw,Iw,Lw;function Rw(){return(Rw=e((()=>{B(),ot(),J(),G(),K(),Ks(),Pw=[.38,.62,.84,1,.84,.62,.38],Fw=`openclaw-microphone-activity`,Iw=new zs,Lw=class extends HTMLElement{constructor(...e){super(...e),this.unsubscribe=null,this.gains=Pw,this.history=null}set signal(e){e!==this.levelSignal&&(this.unsubscribe?.(),this.unsubscribe=null,this.levelSignal=e,this.ensureBars(),this.renderLevel(e?.value??0),this.isConnected&&this.subscribe())}connectedCallback(){this.ensureBars(),this.subscribe()}disconnectedCallback(){this.unsubscribe?.(),this.unsubscribe=null}ensureBars(){if(!this.firstElementChild){let e=Number(this.getAttribute(`bars`));this.gains=kw(Number.isInteger(e)&&e>0?e:Pw.length),this.history=this.getAttribute(`mode`)===`scroll`?this.gains.map(()=>0):null;for(let[e]of this.gains.entries()){let t=document.createElement(`span`);t.className=`agent-chat__voice-activity-bar`,t.style.setProperty(`--talk-bar-delay`,`${e*-70}ms`),this.append(t)}}}subscribe(){this.unsubscribe?.(),this.unsubscribe=this.levelSignal?.subscribe(e=>this.renderLevel(e))??null}renderLevel(e){this.dataset.level=String(e),this.history&&(this.history.push(e),this.history.shift());for(let[t,n]of[...this.children].entries()){let r=this.history?.12+(this.history[t]??0)*.88:.18+e*(this.gains[t]??1)*.82;n.style.setProperty(`--talk-bar-scale`,String(r))}}},customElements.get(Fw)||customElements.define(Fw,Lw)})))()}function zw(e,t){t.matches(`:focus-visible`)||e instanceof HTMLElement&&queueMicrotask(()=>{let t=e.querySelector(`.chat-talk-input-picker__trigger`);t&&document.activeElement===t&&t.blur()})}function Bw(e){let t=!e.loading&&e.devices.length===0?e.issue:null,n=t?[]:[{deviceId:``,label:Y(`chat.composer.systemDefaultMicrophone`)},...e.loading?[]:e.devices],r=t!==null&&t!==`none-found`&&t!==`list-unsupported`,i=Y(`chat.composer.microphoneInput`),a=[{key:`realtime`,label:Y(`chat.composer.realtimeTalkCapability`),status:e.realtimeStatus,unavailableReason:Y(`chat.composer.realtimeTalkProviderUnavailable`),onOpenSettings:e.onOpenTalkSettings},{key:`dictation`,label:Y(`chat.composer.dictationCapability`),status:e.dictationStatus,unavailableReason:Y(`chat.composer.dictationProviderUnavailableShort`),onOpenSettings:e.onOpenDictationSettings}].filter(t=>t.status!==`ready`&&(t.key!==`realtime`||e.showRealtimeCapability!==!1));return z`
|
||
<wa-dropdown
|
||
class="chat-talk-input-picker"
|
||
placement="top-end"
|
||
aria-label=${i}
|
||
.open=${e.open}
|
||
@wa-show=${e.onOpen}
|
||
@wa-hide=${e.onClose}
|
||
@wa-select=${t=>{e.onSelect(t.detail.item.value??``),zw(t.currentTarget,t.detail.item)}}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
type="button"
|
||
class="chat-talk-input-picker__trigger"
|
||
aria-label=${i}
|
||
aria-haspopup="menu"
|
||
aria-expanded=${String(e.open)}
|
||
>
|
||
${q.chevronDown}
|
||
</button>
|
||
<div class="chat-talk-input-picker__heading">${i}</div>
|
||
${t?z`<div
|
||
class="chat-talk-input-picker__empty${r?` chat-talk-input-picker__empty--fault`:``}"
|
||
role="status"
|
||
>
|
||
${Vs(t,`audioinput`)}
|
||
</div>`:z`
|
||
${n.map(t=>{let n=t.deviceId===e.selectedDeviceId;return z`
|
||
<wa-dropdown-item
|
||
class="chat-talk-input-picker__item"
|
||
value=${t.deviceId}
|
||
role="menuitemradio"
|
||
aria-checked=${String(n)}
|
||
${U(e=>_n(e,n))}
|
||
>
|
||
<span slot="icon" class="chat-talk-input-picker__option-icon" aria-hidden="true"
|
||
>${q.mic}</span
|
||
>
|
||
<span class="chat-talk-input-picker__label">${t.label}</span>
|
||
<span slot="details" class="chat-talk-input-picker__check" aria-hidden="true"
|
||
>${n?q.check:R}</span
|
||
>
|
||
</wa-dropdown-item>
|
||
`})}
|
||
${e.loading?z`<div class="chat-talk-input-picker__note" role="status">
|
||
${Y(`common.loading`)}
|
||
</div>`:R}
|
||
${e.issue?z`<div class="chat-talk-input-picker__warning" role="alert">
|
||
${Vs(e.issue,`audioinput`)}
|
||
</div>`:R}
|
||
${e.voiceActive?z`<div class="chat-talk-input-picker__hint">
|
||
${Y(`chat.composer.microphoneAppliesNextSession`)}
|
||
</div>`:R}
|
||
`}
|
||
${a.length>0?z`
|
||
<div class="chat-talk-input-picker__capabilities">
|
||
${a.map(e=>z`
|
||
<div
|
||
class="chat-talk-input-picker__capability"
|
||
data-chat-talk-capability=${e.key}
|
||
data-status=${e.status}
|
||
role="status"
|
||
>
|
||
<span class="chat-talk-input-picker__capability-copy">
|
||
<strong>
|
||
${e.status===`unavailable`?z`<span
|
||
class="chat-talk-input-picker__capability-alert"
|
||
aria-hidden="true"
|
||
>${q.alertTriangle}</span
|
||
>`:R}
|
||
<span>${e.label}</span>
|
||
</strong>
|
||
<span>
|
||
${e.status===`checking`?Y(`chat.composer.talkCapabilityChecking`):e.status===`unknown`?Y(`chat.composer.talkCapabilityUnknown`):e.unavailableReason}
|
||
</span>
|
||
</span>
|
||
${e.onOpenSettings?z`
|
||
<button
|
||
type="button"
|
||
class="chat-talk-input-picker__settings"
|
||
@click=${t=>{t.stopPropagation(),e.onOpenSettings?.()}}
|
||
>
|
||
${q.settings}<span>${Y(`chat.composer.configureCapability`)}</span>
|
||
</button>
|
||
`:R}
|
||
</div>
|
||
`)}
|
||
</div>
|
||
`:R}
|
||
${e.onHoldToDictateChange?z`
|
||
<div class="chat-talk-input-picker__preference">
|
||
<span>${Y(`chat.composer.holdToDictate`)}</span>
|
||
<button
|
||
class="chat-controls__speed-toggle ${e.holdToDictate===!1?``:`chat-controls__speed-toggle--active`}"
|
||
type="button"
|
||
role="switch"
|
||
aria-checked=${e.holdToDictate===!1?`false`:`true`}
|
||
aria-label=${Y(`chat.composer.holdToDictate`)}
|
||
@click=${t=>{t.stopPropagation(),e.onHoldToDictateChange?.(e.holdToDictate===!1)}}
|
||
>
|
||
<span class="chat-controls__speed-toggle-thumb"></span>
|
||
</button>
|
||
</div>
|
||
`:R}
|
||
</wa-dropdown>
|
||
`}function Vw(e){let t=e.dictation?.active===!0,n=e.dictation?.arming===!0,r=e.dictation?.finalizing===!0,i=e.dictation?.locksComposer===!0,a=e.dictation!==void 0&&e.onToggleVoice===void 0,o=t?Y(`chat.composer.dictationStopAndKeep`):e.idleLabel??Y(`chat.composer.startVoiceInput`),s=e.dictation&&!a&&!(t||r)?Y(`chat.composer.voiceGestureHint`):o;return z`
|
||
<span class="chat-talk-control${i?` chat-talk-control--holding`:``}">
|
||
<openclaw-tooltip .content=${s}>
|
||
<button
|
||
class=${t?`chat-send-btn chat-send-btn--dictating`:`chat-send-btn chat-send-btn--voice${e.dictation&&!a?` chat-send-btn--hold-enabled`:``}${n?` chat-send-btn--dictation-arming`:``}`}
|
||
type="button"
|
||
@pointerdown=${t=>e.onDictationPointerDown?.(t)}
|
||
@click=${n=>{if(t){n.preventDefault(),r||e.dictation?.finishActive();return}if(a){n.preventDefault(),e.onDirectDictationStart?.(),e.dictation?.startDirect();return}e.dictation?e.dictation.handleClick(n):e.onToggleVoice?.()}}
|
||
@contextmenu=${t=>e.dictation?.handleContextMenu(t)}
|
||
?disabled=${!t&&(!e.connected||e.sending||e.isBusy)}
|
||
aria-disabled=${String(r)}
|
||
aria-label=${o}
|
||
>
|
||
${t?q.stop:z`
|
||
${q.mic}
|
||
<span class="agent-chat__control-label">${o}</span>
|
||
`}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
${e.microphonePicker}
|
||
</span>
|
||
`}function Hw(e,t,n){return e.active?z`
|
||
<span class="sr-only" role="status" aria-live="polite" aria-atomic="true"
|
||
>${e.finalizing?Y(`chat.composer.dictationFinalizing`):e.connecting?Y(`chat.composer.dictationConnecting`):Y(`chat.composer.dictationListening`)}</span
|
||
>
|
||
<openclaw-tooltip .content=${Y(`chat.runControls.send`)}>
|
||
<button
|
||
class="chat-send-btn chat-send-btn--send chat-send-btn--dictation-commit"
|
||
type="button"
|
||
@pointerdown=${n}
|
||
@click=${async()=>{e.finalizing||(await e.finishActive(),t())}}
|
||
aria-disabled=${String(e.finalizing)}
|
||
aria-label=${Y(`chat.runControls.send`)}
|
||
>
|
||
${q.arrowUp}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R}function Uw(e){if(!e?.active)return R;let t=!e.connecting&&!e.finalizing;return z`
|
||
<div class="agent-chat__composer-status-stack">
|
||
<div
|
||
class=${`agent-chat__dictation-status${e.finalizing?` agent-chat__dictation-status--finalizing`:``}`}
|
||
>
|
||
<span
|
||
class="agent-chat__dictation-phase${t?` agent-chat__dictation-phase--listening`:``}"
|
||
>
|
||
${e.connecting?Y(`chat.composer.dictationConnecting`):e.finalizing?Y(`chat.composer.dictationFinalizing`):Y(`chat.composer.dictationListening`)}
|
||
</span>
|
||
</div>
|
||
</div>
|
||
`}function Ww(e){let t=!!(e.draft.trim()||e.hasAttachments),n=e.followUpMode===`steer`,r=e.followUpMode===`interrupt`,i=e.submissionLabel??(e.suggestionComposer?Y(`chat.sessionSuggestions.suggest`):!e.canAbort||e.followUpMode===void 0?Y(`chat.runControls.send`):Y(n?`chat.queue.steer`:r?`chat.runControls.send`:`chat.runControls.queue`)),a=e.submissionLabel??(e.suggestionComposer?Y(`chat.sessionSuggestions.suggestMessage`):!e.canAbort||e.followUpMode===void 0?Y(`chat.runControls.sendMessage`):Y(n?`chat.followUpModeSteer`:r?`chat.runControls.sendMessage`:`chat.runControls.queueMessage`)),o=Y(e.alternateFollowUpMode===`queue`?`chat.runControls.queue`:`chat.queue.steer`),s=e.alternateFollowUpMode&&e.canSend&&t?`${i} ⏎ · ${o} ${Y(`chat.sendShortcutModifierEnter`)}`:i,c=t=>e.onSend(t),l=e.canAbort?z`
|
||
<openclaw-tooltip .content=${Y(`chat.runControls.stop`)}>
|
||
<button
|
||
class="chat-send-btn chat-send-btn--stop"
|
||
@pointerdown=${e.onPrimaryActionPointerDown}
|
||
@click=${e.onAbort}
|
||
aria-label=${Y(`chat.runControls.stopGenerating`)}
|
||
>
|
||
${q.stop}
|
||
<span class="agent-chat__control-label">${Y(`chat.runControls.stop`)}</span>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R,u=e.voiceStatus===`error`,d=Vw(e),f=e.dictation||e.onToggleVoice?d:R,p=e.dictation?z`
|
||
<span class="chat-mobile-dictation-action">
|
||
${Vw({connected:e.connected,sending:e.sending,isBusy:e.isBusy,dictation:e.dictation,idleLabel:Y(`chat.composer.dictationCapability`)})}
|
||
</span>
|
||
`:R,m=!t&&!e.dictation?.active&&e.onToggleVoice?z`
|
||
<openclaw-tooltip
|
||
class="chat-mobile-talk-action"
|
||
.content=${Y(`chat.composer.realtimeTalkCapability`)}
|
||
>
|
||
<button
|
||
class="chat-send-btn chat-send-btn--talk-mode"
|
||
type="button"
|
||
@pointerdown=${e.onPrimaryActionPointerDown}
|
||
@click=${e.onToggleVoice}
|
||
?disabled=${!e.connected||e.sending||e.isBusy}
|
||
aria-label=${Y(`chat.composer.realtimeTalkCapability`)}
|
||
>
|
||
${q.audioLines}
|
||
<span class="agent-chat__control-label"
|
||
>${Y(`chat.composer.realtimeTalkCapability`)}</span
|
||
>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R,h=z`
|
||
<openclaw-tooltip
|
||
.content=${e.sending?Y(`chat.composer.sendingMessage`):t?s:Y(`chat.composer.emptyHint`)}
|
||
>
|
||
<button
|
||
class="chat-send-btn chat-send-btn--send${e.sending?` chat-send-btn--sending`:``}"
|
||
@pointerdown=${e.onPrimaryActionPointerDown}
|
||
@click=${c}
|
||
?disabled=${!e.canSend||e.sending||!t}
|
||
aria-label=${e.sending?Y(`chat.composer.sendingMessage`):t?a:Y(`chat.composer.emptyHint`)}
|
||
aria-busy=${e.sending?`true`:`false`}
|
||
>
|
||
${e.sending?z`<span class="btn__spinner" aria-hidden="true"></span>`:q.arrowUp}
|
||
<span class="agent-chat__control-label">${i}</span>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`,g=e.dictation?Hw(e.dictation,()=>e.onSend(),e.onPrimaryActionPointerDown):R,_=e.dictation?.active?g:e.canAbort?t?h:l:h,v=e.dictation?.active?g:t?h:e.canAbort?l:e.onToggleVoice?m:h,y=v===_?z`<span class="chat-mobile-primary-action chat-desktop-primary-action"
|
||
>${_}</span
|
||
>`:z`
|
||
<span class="chat-mobile-primary-action">${v}</span>
|
||
<span class="chat-desktop-primary-action">${_}</span>
|
||
`;return z`
|
||
${e.voiceActive&&e.onToggleVoice?z`
|
||
<span class="chat-talk-control chat-talk-control--active">
|
||
<openclaw-tooltip .content=${Y(`chat.composer.stopVoiceInput`)}>
|
||
<button
|
||
class="chat-send-btn chat-send-btn--voice-live${u?` chat-send-btn--voice-error`:``}"
|
||
@click=${e.onToggleVoice}
|
||
aria-label=${Y(`chat.composer.stopVoiceInput`)}
|
||
>
|
||
${u?R:Mw({status:e.voiceStatus,inputLevel:e.voiceInputLevel})}
|
||
<span class="chat-send-btn__voice-stop-glyph">${q.stop}</span>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
${e.microphonePicker}
|
||
</span>
|
||
${u?R:z`
|
||
<span
|
||
class="sr-only agent-chat__voice-status"
|
||
role="status"
|
||
aria-live="polite"
|
||
aria-atomic="true"
|
||
>${jw(e.voiceStatus,e.voiceDetail)}</span
|
||
>
|
||
`}
|
||
${e.voiceVideoCapable&&e.onToggleCamera?z`
|
||
<openclaw-tooltip
|
||
.content=${e.voiceVideoEnabled?Y(`chat.composer.turnCameraOff`):Y(`chat.composer.turnCameraOn`)}
|
||
>
|
||
<button
|
||
class="chat-send-btn chat-send-btn--voice"
|
||
@click=${e.onToggleCamera}
|
||
?disabled=${e.voiceVideoPending||e.voiceStatus===`connecting`||e.voiceStatus===`error`}
|
||
aria-label=${e.voiceVideoEnabled?Y(`chat.composer.turnCameraOff`):Y(`chat.composer.turnCameraOn`)}
|
||
aria-pressed=${e.voiceVideoEnabled?`true`:`false`}
|
||
>
|
||
${e.voiceVideoEnabled?q.cameraOff:q.camera}
|
||
<span class="agent-chat__control-label"
|
||
>${e.voiceVideoEnabled?Y(`chat.composer.turnCameraOff`):Y(`chat.composer.turnCameraOn`)}</span
|
||
>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
<span class="chat-mobile-primary-action chat-desktop-primary-action">${l}</span>
|
||
`:z` ${f} ${p} ${y} `}
|
||
`}function Gw(){return(Gw=e((()=>{B(),V(),J(),mn(),K(),Gs(),Rw()})))()}function Kw(e,t,n){let r=qS(e),i=()=>t.composerDraftScopeKey===r&&t.goalComposer?.key===r?t.goalComposer:null;if(e.goalDraftMode!==void 0){let n=e.goalDraftMode,a=i();a&&n&&a.action===n.action&&a.sessionId===n.sessionId&&(a.action!==`edit`||n.action===`edit`&&a.goalId===n.goalId&&a.previousDraft===n.previousDraft)||(t.goalComposer=n?{...n,key:r,pending:!1}:null)}let a=n=>{JS(e,n);let r=t.composerTextarea;r&&(r.value=n,yx(r))},o=()=>queueMicrotask(()=>t.composerTextarea?.focus({preventScroll:!0})),s=()=>{let r=i();!r||r.pending||(t.goalComposer=null,e.onGoalDraftModeChange?.(null),r.action===`edit`&&a(r.previousDraft),n(),o())},c=s=>{if(!e.onGoalSubmit||i()?.pending)return;let c=t.composerTextarea?.value??e.getDraft?.()??e.draft,l={...e.currentSessionId?{sessionId:e.currentSessionId}:{},...s?{action:`edit`,goalId:s.id,previousDraft:c}:{action:`start`}};t.goalComposer={...l,key:r,pending:!1},e.onGoalDraftModeChange?.(l),Q(t),Xx(t),a(s?.objective??``),n(),o()};return{get active(){return i()!==null},get pending(){return i()?.pending===!0},get submissionLabel(){let e=i();return e?Y(e.action===`edit`?`chat.goals.save`:`chat.goals.start`):void 0},begin:c,activateCommand(n){return n.key!==`goal`||n.source!==`native`||t.slashMenuCompletion?.inline||!e.onGoalSubmit?!1:(c(),!0)},cancel:s,async submit(r){let o=i(),s=t.composerTextarea?.value??e.getDraft?.()??e.draft;if(!(!o||o.pending||!e.onGoalSubmit||!s.trim())){a(s),o.pending=!0,n();try{await e.onGoalSubmit({...o.sessionId?{sessionId:o.sessionId}:{},...o.action===`start`?{action:`start`,objective:s}:{action:`edit`,goalId:o.goalId,objective:s}},r)&&i()===o&&(t.goalComposer=null,e.onGoalDraftModeChange?.(null),o.action===`edit`&&a(o.previousDraft))}finally{o.pending=!1,n()}}},render(){let e=i();return e?z`<div
|
||
class="agent-chat__goal-mode"
|
||
role="group"
|
||
aria-label=${Y(`chat.goals.composerMode`)}
|
||
>
|
||
<span class="agent-chat__goal-mode-label"
|
||
>${q.flag}${Y(e.action===`edit`?`chat.goals.edit`:`chat.goals.composerMode`)}</span
|
||
>
|
||
<span class="agent-chat__goal-mode-hint"
|
||
>${Y(e.action===`edit`?`chat.goals.editHint`:`chat.goals.startHint`)}</span
|
||
>
|
||
<button
|
||
type="button"
|
||
class="agent-chat__goal-action"
|
||
aria-label=${Y(`chat.goals.cancel`)}
|
||
?disabled=${e.pending}
|
||
@click=${s}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</div>`:R}}}function qw(){return(qw=e((()=>{B(),J(),K(),Px(),cS(),VS(),rC()})))()}function Jw({state:e,props:t,skillMenuHost:n,slashMenuHost:r,requestUpdate:i,sendShortcut:a,canSubmitDraft:o,commitDraft:s,syncDraftAfterSend:c,showAbortableUi:l,alternateFollowUpMode:u,goalComposer:d}){return f=>{let p=f.target;if(!(p instanceof HTMLTextAreaElement)||e.composerComposing||f.isComposing||f.keyCode===229)return;if(d.active){f.key===`Escape`?(f.preventDefault(),d.cancel()):f.key===`Enter`&&!f.shiftKey&&(a===`enter`||f.metaKey||f.ctrlKey)&&o(p.value)&&(f.preventDefault(),s(p.value),d.submit(f));return}if(t.connected&&aS(f,e,n,i)||t.connected&&jS(f,e,r,i,a)||t.connected&&MS(f,e,r,i))return;if((f.key===`ArrowUp`||f.key===`ArrowDown`)&&t.onHistoryKeydown){s(p.value);let e=t.onHistoryKeydown({key:f.key,selectionStart:p.selectionStart,selectionEnd:p.selectionEnd,valueLength:p.value.length,altKey:f.altKey,ctrlKey:f.ctrlKey,metaKey:f.metaKey,shiftKey:f.shiftKey,isComposing:f.isComposing,keyCode:f.keyCode});if(e.handled){e.preventDefault&&f.preventDefault(),i(),e.restoreCaret&&Tx(p,e.restoreCaret);return}}if(f.key===`Escape`&&!e.skillMenuOpen&&!e.slashMenuOpen&&!t.replyTarget&&!e.dictation?.active&&l&&t.onAbort){f.preventDefault(),t.onAbort();return}let m=a===`enter`||f.metaKey||f.ctrlKey;if(f.key===`Enter`&&!f.shiftKey&&m){if(f.repeat){f.preventDefault();return}let e=t.getAttachments?.()??t.attachments??[];if(!(p.value.trim()||e.length)){let e=l&&t.connected&&t.canSend&&t.onQueueSteer?Ps(t.queue):void 0;if(e){f.preventDefault(),t.onQueueSteer?.(e.id);return}o(p.value)&&f.preventDefault();return}if(!o(p.value))return;f.preventDefault(),s(p.value);let n=(f.metaKey||f.ctrlKey)&&!f.altKey?u:void 0;t.onSend(n,f),c(p)}}}function Yw(){return(Yw=e((()=>{Os(),Px(),cS(),VS()})))()}function Xw(){return z`<div class="agent-chat__capability-menu-divider" role="separator"></div>`}function Zw(e,t){return z`<a
|
||
class="agent-chat__capability-menu-link"
|
||
href=${e}
|
||
tabindex="-1"
|
||
@click=${e=>e.preventDefault()}
|
||
>${t}</a
|
||
>`}function Qw(){return z`
|
||
<wa-dropdown-item class="agent-chat__capability-menu-item" value="back">
|
||
<span slot="icon" aria-hidden="true">${q.arrowLeft}</span>
|
||
<span>${Y(`chat.composer.menu.back`)}</span>
|
||
</wa-dropdown-item>
|
||
${Xw()}
|
||
`}function $w(e){return z`
|
||
<wa-dropdown-item
|
||
class="agent-chat__capability-menu-item agent-chat__capability-menu-toggle"
|
||
value=${e.value}
|
||
type=${e.checkbox?`checkbox`:`normal`}
|
||
.checked=${e.checked}
|
||
?disabled=${e.disabled}
|
||
title=${e.title??``}
|
||
>
|
||
${e.icon?z`<span slot="icon" aria-hidden="true">${e.icon}</span>`:R}
|
||
<span class="agent-chat__capability-menu-label">
|
||
<span>${e.label}</span>
|
||
${e.note??R}
|
||
</span>
|
||
${e.checkbox?R:z`<wa-switch
|
||
slot="details"
|
||
class="agent-chat__capability-menu-switch"
|
||
size="s"
|
||
tabindex="-1"
|
||
.checked=${e.checked}
|
||
?disabled=${e.disabled}
|
||
aria-label=${e.label}
|
||
></wa-switch>`}
|
||
</wa-dropdown-item>
|
||
`}function eT(e){let t=Yi(e.toolOverrides),n=e.mcpServers.filter(t=>lo(t.enabled,Po(e.toolOverrides?.mcpServers,t.name))).length,r=Object.keys(e.toolOverrides?.skills??{}).length>0,i=e.skills?.filter(e=>e.enabled).length??0,a=lo(e.webSearchBaseEnabled,e.toolOverrides?.webSearch),o=hv(q.paperclip),s=e.rootToggles??[];return!e.showCapabilities&&s.length===0?o:z`
|
||
${o} ${Xw()}
|
||
${s.map(e=>$w({value:e.value,label:e.label,icon:e.icon,checked:e.checked,disabled:e.disabled,title:e.title}))}
|
||
${e.showCapabilities?z`<wa-dropdown-item class="agent-chat__capability-menu-item" value="open-skills">
|
||
<span slot="icon" aria-hidden="true">${q.book}</span>
|
||
<span>${Y(`chat.composer.menu.skills`)}</span>
|
||
<span slot="details" class="agent-chat__capability-menu-details">
|
||
${r?z`<span class="agent-chat__capability-menu-badge"
|
||
>${Y(`chat.composer.menu.enabledCount`,{count:String(i)})}</span
|
||
>`:R}
|
||
<span class="agent-chat__capability-menu-chevron" aria-hidden="true"
|
||
>${q.chevronRight}</span
|
||
>
|
||
</span>
|
||
</wa-dropdown-item>
|
||
<wa-dropdown-item class="agent-chat__capability-menu-item" value="open-connectors">
|
||
<span slot="icon" aria-hidden="true">${q.puzzle}</span>
|
||
<span>${Y(`chat.composer.menu.connectors`)}</span>
|
||
<span slot="details" class="agent-chat__capability-menu-details">
|
||
<span class="agent-chat__capability-menu-badge">${n}</span>
|
||
<span class="agent-chat__capability-menu-chevron" aria-hidden="true"
|
||
>${q.chevronRight}</span
|
||
>
|
||
</span>
|
||
</wa-dropdown-item>
|
||
${$w({value:`toggle-web-search`,label:Y(`chat.composer.menu.webSearch`),checked:a,disabled:e.mutationBlockedReason!==null,title:e.mutationBlockedReason,icon:q.globe,checkbox:!0})}
|
||
${Xw()}
|
||
<wa-dropdown-item class="agent-chat__capability-menu-item" value="manage-plugins">
|
||
<span slot="icon" aria-hidden="true">${q.puzzle}</span>
|
||
${Zw(Qt(`plugins`,e.basePath),Y(`chat.composer.menu.managePlugins`))}
|
||
</wa-dropdown-item>
|
||
${t>0?z`
|
||
<wa-dropdown-item
|
||
class="agent-chat__capability-menu-item agent-chat__capability-menu-overrides"
|
||
value="clear-overrides"
|
||
?disabled=${e.mutationBlockedReason!==null}
|
||
title=${e.mutationBlockedReason??``}
|
||
>
|
||
<span slot="icon" aria-hidden="true">${q.settings}</span>
|
||
<span
|
||
>${Y(t===1?`chat.composer.overrides.countOne`:`chat.composer.overrides.count`,{count:String(t)})}</span
|
||
>
|
||
<span
|
||
slot="details"
|
||
class="agent-chat__capability-menu-clear-overrides"
|
||
aria-hidden="true"
|
||
>${q.x}</span
|
||
>
|
||
</wa-dropdown-item>
|
||
`:R}`:R}
|
||
`}function tT(e){let t=e.mutationBlockedReason,n=e.skillsLoading?z`<div class="agent-chat__capability-menu-state" role="status">
|
||
${Y(`chat.composer.menu.loadingSkills`)}
|
||
</div>`:e.skillsError?z`<div class="agent-chat__capability-menu-state" role="alert">
|
||
${Y(`chat.composer.menu.skillsLoadFailed`)}
|
||
</div>`:!e.skills||e.skills.length===0?z`<div class="agent-chat__capability-menu-state">
|
||
${Y(`chat.composer.menu.noSkills`)}
|
||
</div>`:e.skills.map((e,n)=>{let r=e.missingDeps?Y(`chat.composer.menu.depsMissing`):e.blocked?Y(`chat.composer.menu.skillBlocked`):t;return $w({value:`skill:${n}`,label:e.name,checked:e.enabled,disabled:e.missingDeps||e.blocked||t!==null,title:r,note:e.missingDeps||e.blocked?z`<span class="agent-chat__capability-menu-note">${r}</span>`:R})});return z`
|
||
${Qw()} ${n} ${Xw()}
|
||
<wa-dropdown-item class="agent-chat__capability-menu-item" value="manage-skills">
|
||
${Zw(Qt(`skills`,e.basePath),Y(`chat.composer.menu.manageSkills`))}
|
||
</wa-dropdown-item>
|
||
`}function nT(e){let t=e.mutationBlockedReason,n=e.mcpServers.length===0?z`<div class="agent-chat__capability-menu-state">
|
||
${Y(`chat.composer.menu.noConnectors`)}
|
||
</div>`:e.mcpServers.map((n,r)=>{let i=Po(e.toolOverrides?.mcpServers,n.name),a=lo(n.enabled,i);return z`
|
||
${$w({value:`connector:${r}`,label:n.name,checked:a,disabled:t!==null,title:t,note:z`<span class="agent-chat__capability-menu-note">
|
||
${Y(a?`common.enabled`:`common.disabled`)}
|
||
${i===void 0?R:z`<span class="agent-chat__capability-menu-session-tag"
|
||
>${Y(`chat.composer.menu.sessionTag`)}</span
|
||
>`}
|
||
</span>`})}
|
||
${e.onOpenToolAccess?z`<wa-dropdown-item
|
||
class="agent-chat__capability-menu-item agent-chat__capability-menu-subrow"
|
||
value=${`tools:${r}`}
|
||
>
|
||
<span slot="icon" aria-hidden="true">${q.wrench}</span>
|
||
<span>${Y(`chat.composer.menu.toolAccess.label`)}</span>
|
||
</wa-dropdown-item>`:R}
|
||
`}),r=!e.canAdmin;return z`
|
||
${Qw()} ${n} ${Xw()}
|
||
${e.onAddServer?z`<wa-dropdown-item
|
||
class="agent-chat__capability-menu-item"
|
||
value="add-server"
|
||
?disabled=${r}
|
||
title=${r?e.adminBlockedReason??``:``}
|
||
>
|
||
<span slot="icon" aria-hidden="true">${q.plus}</span>
|
||
<span>${Y(`chat.composer.menu.addMcpServer`)}</span>
|
||
</wa-dropdown-item>`:R}
|
||
<wa-dropdown-item
|
||
class="agent-chat__capability-menu-item"
|
||
value="browse-connectors"
|
||
?disabled=${r}
|
||
title=${r?e.adminBlockedReason??``:``}
|
||
>
|
||
<span slot="icon" aria-hidden="true">${q.search}</span>
|
||
${Zw(Ft(`discover`,e.basePath),Y(`chat.composer.menu.browseConnectors`))}
|
||
</wa-dropdown-item>
|
||
`}function rT(e,t){return(e?.groups??[]).flatMap(e=>e.tools).filter(e=>e.source===`mcp`&&e.mcpServer===t&&!!e.mcpToolName)}function iT(e,t){return e?.notices?.find(e=>uT.has(e.id)&&e.servers?.includes(t)===!0)}function aT(e,t){let n=t.mcpServer,r=t.mcpToolName;return!n||!r?!1:e.toolOverrides==null?t.deniedBySession===!0:Po(e.toolOverrides.mcpToolsDeny,n)?.includes(r)??!1}function oT(e,t){let n=rT(e.toolsEffectiveResult,t),r=n.length===0?iT(e.toolsEffectiveResult,t):null,i=n.filter(t=>!aT(e,t)).length,a=Y(n.length===1?`chat.composer.menu.toolAccess.summaryOne`:`chat.composer.menu.toolAccess.summary`,{enabled:String(i),total:String(n.length)}),o=e.toolsEffectiveLoading?z`<div class="agent-chat__capability-menu-state" role="status">
|
||
${Y(`chat.composer.menu.toolAccess.loading`)}
|
||
</div>`:e.toolsEffectiveError?z`<div class="agent-chat__capability-menu-state" role="alert">
|
||
${Y(`chat.composer.menu.toolAccess.loadFailed`)}
|
||
</div>`:r?z`<div class="agent-chat__capability-menu-state" role="status">
|
||
${Be(r.message)}
|
||
</div>`:n.length===0?z`<div class="agent-chat__capability-menu-state">
|
||
${Y(`chat.composer.menu.toolAccess.noTools`)}
|
||
</div>`:n.map((t,n)=>{let r=t.mcpToolName,i=t.label?.trim(),a=aT(e,t);return $w({value:`mcp-tool:${n}`,label:r,checked:!a,disabled:e.toolAccessMutationBlockedReason!==null,title:e.toolAccessMutationBlockedReason,note:i&&i!==r?z`<span class="agent-chat__capability-menu-note">${i}</span>`:R})});return z`
|
||
${Qw()}
|
||
<div class="agent-chat__capability-menu-state">
|
||
<span class="agent-chat__capability-menu-label">
|
||
<strong translate="no">${t}</strong>
|
||
${n.length>0?z`<span class="agent-chat__capability-menu-note">${a}</span>`:R}
|
||
</span>
|
||
</div>
|
||
${o}
|
||
`}function sT(e,t){let n=e.detail.item.value??``;if(pv(e))return;let r=t.rootToggles?.find(e=>e.value===n);if(r){e.preventDefault(),r.disabled||r.onChange(!r.checked);return}let i=e.currentTarget,a=e=>{t.onViewChange(e),requestAnimationFrame(()=>i.querySelector(`wa-dropdown-item:not([disabled])`)?.focus())};if(n===`back`){e.preventDefault(),a(t.view.startsWith(`tools:`)?`connectors`:`root`);return}if(n===`open-skills`||n===`open-connectors`){e.preventDefault(),a(n===`open-skills`?`skills`:`connectors`);return}if(n===`toggle-web-search`){if(e.preventDefault(),t.mutationBlockedReason)return;let n=lo(t.webSearchBaseEnabled,t.toolOverrides?.webSearch);t.onPatchToolOverrides(ka(t.toolOverrides,!n,t.webSearchBaseEnabled));return}if(n===`clear-overrides`){e.preventDefault(),t.mutationBlockedReason||t.onPatchToolOverrides(null);return}if(n.startsWith(`skill:`)){e.preventDefault();let r=t.skills?.[Number(n.slice(6))];r&&!r.missingDeps&&!r.blocked&&!t.mutationBlockedReason&&t.onPatchToolOverrides(hi(t.toolOverrides,`skills`,r.key,!r.enabled,r.baseEnabled));return}if(n.startsWith(`connector:`)){e.preventDefault();let r=t.mcpServers[Number(n.slice(10))];if(r&&!t.mutationBlockedReason){let e=lo(r.enabled,Po(t.toolOverrides?.mcpServers,r.name));t.onPatchToolOverrides(hi(t.toolOverrides,`mcpServers`,r.name,!e,r.enabled))}return}if(n.startsWith(`tools:`)){e.preventDefault();let r=t.mcpServers[Number(n.slice(6))];r&&(t.onOpenToolAccess?.(r.name),a(`tools:${r.name}`));return}if(n.startsWith(`mcp-tool:`)&&t.view.startsWith(`tools:`)){if(e.preventDefault(),t.toolAccessMutationBlockedReason)return;let r=t.view.slice(6),i=rT(t.toolsEffectiveResult,r)[Number(n.slice(9))];i?.mcpToolName&&t.onPatchToolOverrides($n(t.toolOverrides,r,i.mcpToolName,!aT(t,i)));return}if(n===`add-server`){t.onAddServer?.();return}n===`manage-skills`?t.onNavigate(`skills`):n===`manage-plugins`?t.onNavigate(`plugins`):n===`browse-connectors`&&t.onNavigate(`plugins`,{pathname:Ft(`discover`,t.basePath)})}function cT(e){let t=Yi(e.toolOverrides)>0,n=e.showCapabilities?e.view:`root`;n.startsWith(`tools:`)&&e.onEnsureToolAccess?.(n.slice(6));let r=n===`skills`?tT(e):n===`connectors`?nT(e):n.startsWith(`tools:`)?oT(e,n.slice(6)):eT(e);return z`
|
||
<wa-dropdown
|
||
class="agent-chat__attach-menu agent-chat__capability-menu"
|
||
placement="top-start"
|
||
aria-label=${Y(`chat.composer.addAttachment`)}
|
||
.open=${e.open}
|
||
@wa-select=${t=>sT(t,e)}
|
||
@wa-show=${()=>{e.open||e.onOpenChange(!0),e.onLoadSkills()}}
|
||
@wa-hide=${()=>{e.open&&e.onOpenChange(!1)}}
|
||
data-view=${n}
|
||
>
|
||
${mv(e.disabled,t)} ${r}
|
||
</wa-dropdown>
|
||
${e.addServerDialog??R}
|
||
`}function lT(e){let t=e.capabilityMenu;return cT({attachments:e.attachments,showCapabilities:t!==void 0,basePath:t?.basePath??``,disabled:e.disabled,open:e.open,view:e.view,toolOverrides:e.toolOverrides,skills:t?.skills??null,skillsLoading:t?.skillsLoading??!1,skillsError:t?.skillsError??!1,mcpServers:t?.mcpServers??[],toolsEffectiveResult:t?.toolsEffectiveResult??null,toolsEffectiveLoading:t?.toolsEffectiveLoading??!1,toolsEffectiveError:t?.toolsEffectiveError??!1,toolAccessMutationBlockedReason:t?.toolAccessMutationBlockedReason??null,webSearchBaseEnabled:t?.webSearchBaseEnabled??!0,mutationBlockedReason:t?.mutationBlockedReason??null,canAdmin:t?.canAdmin??!1,adminBlockedReason:t?.adminBlockedReason??null,rootToggles:e.rootToggles,addServerDialog:t?.addServerDialog,onOpenChange:e.onOpenChange,onViewChange:e.onViewChange,onLoadSkills:t?.onLoadSkills??(()=>{}),onPatchToolOverrides:t?.onPatchToolOverrides??(()=>{}),onNavigate:t?.onNavigate??(()=>{}),onAddServer:t?.onAddServer,onEnsureToolAccess:t?.onEnsureToolAccess,onOpenToolAccess:t?.onOpenToolAccess})}var uT;function dT(){return(dT=e((()=>{Hn(),B(),an(),J(),G(),mn(),K(),Fe(),kv(),uT=new Set([`mcp-not-yet-connected`,`mcp-not-yet-listed`,`mcp-stale-catalog`])})))()}function fT(){AT?.frame!=null&&cancelAnimationFrame(AT.frame),AT=void 0}function pT(){let e=AT;if(!e||e.velocity===0)return;let t=e.container.scrollTop;if(e.container.scrollTop+=e.velocity,e.container.scrollTop===t){fT();return}e.frame=requestAnimationFrame(pT)}function mT(e,t){let n=e.getBoundingClientRect(),r=Math.min(ET,Math.max(0,ET-(t-n.top))),i=Math.min(ET,Math.max(0,ET-(n.bottom-t))),a=(i>0?i:-r)/ET*DT;if(a===0){fT();return}if(AT?.container===e){AT.velocity=a,AT.frame??(AT.frame=requestAnimationFrame(pT));return}fT(),AT={container:e,velocity:a,frame:requestAnimationFrame(pT)}}function hT(e,t){e?.toggleAttribute(wT,t)}function gT(e){e.style.height=`auto`;let t=Number.parseFloat(getComputedStyle(e).maxHeight)||101;e.style.height=`${Math.min(e.scrollHeight,t)}px`,e.style.overflowY=e.scrollHeight>t?`auto`:`hidden`}function _T(e,t){e instanceof HTMLTextAreaElement&&!OT.has(e)&&(OT.add(e),e.value=t,queueMicrotask(()=>{e.isConnected&&(gT(e),e.focus(),e.setSelectionRange(t.length,t.length))}))}function vT(e,t){if(t&&e.sendState!==`failed`&&e.sendState!==`unconfirmed`)return Y(`chat.queue.states.waitingForReconnect`);switch(e.sendState){case`waiting-model`:case`waiting-idle`:return null;case`executing-command`:return Y(`chat.queue.states.runningCommand`);case`waiting-reconnect`:return Y(`chat.queue.states.waitingForReconnect`);case`unconfirmed`:return Y(`chat.queue.states.needsReview`);case`failed`:return Y(`common.failed`);default:return null}}function yT(e){let t=e.queue.filter(e=>e.sendState!==`sending`&&!Ms(e));if(e.editingSource&&e.editingId===e.editingSource.id&&!t.some(t=>t.id===e.editingId)&&t.push(e.editingSource),!t.length)return R;let n={segments:Na(t,t=>va(t)&&t.id!==e.editingId).map(e=>e.map(e=>e.id)),offered:t.filter(va).length>1},r=t.some(e=>e.sendState===`waiting-model`)&&!e.offline?{label:Y(`chat.queue.states.applyingSettings`),tone:`settings`}:null;return z`
|
||
<div class="chat-queue" role="status" aria-live="polite">
|
||
${r?z`<div
|
||
class="chat-queue__global-state"
|
||
data-chat-queue-global-state=${r.tone}
|
||
>
|
||
${r.label}
|
||
</div>`:R}
|
||
<div
|
||
class="chat-queue__scroll"
|
||
data-scrollable=${t.length>3?`true`:`false`}
|
||
data-at-start="true"
|
||
data-at-end=${t.length>3?`false`:`true`}
|
||
@dragover=${e=>{if(!e.dataTransfer?.types.includes(ST))return;let t=e.currentTarget;t instanceof HTMLElement&&mT(t,e.clientY)}}
|
||
@dragleave=${e=>{let t=e.currentTarget;t instanceof HTMLElement&&e.relatedTarget instanceof Node&&t.contains(e.relatedTarget)||fT()}}
|
||
@drop=${fT}
|
||
@scroll=${e=>{let t=e.currentTarget;t instanceof HTMLElement&&(t.dataset.atStart=String(t.scrollTop<=1),t.dataset.atEnd=String(t.scrollTop+t.clientHeight>=t.scrollHeight-1))}}
|
||
>
|
||
${ht(t,e=>e.id,t=>xT(t,e,n))}
|
||
</div>
|
||
</div>
|
||
`}function bT(e,t){let n=e.currentTarget;n instanceof HTMLElement&&n.classList.toggle(CT,t)}function xT(e,t,n){let r=hu(e.sender),i=r!==R,a=e.sendState===`failed`||e.sendState===`unconfirmed`,o=!a&&(t.offline||e.sendState===`waiting-reconnect`),s=vT(e,t.offline===!0),c=e.queueMode===`steer`&&s===null,l=e.sendState===`executing-command`,u=t.editingId===e.id,d=!!(t.canAbort&&t.onQueueSteer)&&ws(e)&&!u,f=!!(t.canAbort&&t.onQueueSteer)&&!u&&!e.localCommandName&&!e.intent&&(ws(e)||e.sendState===`waiting-model`),p=n.segments.find(t=>t.includes(e.id))??[],m=p.indexOf(e.id),h=t.onQueueMove,g=!!h&&n.offered,_=g&&m>=0&&p.length>1,v=!!t.onQueueEdit&&va(e)&&!e.localCommandName,y=v&&!t.editingId,b=e.text||(e.attachments?.length?Y(`chat.queue.imageCount`,{count:String(e.attachments.length)}):``),x=kT;return z`
|
||
<div
|
||
class=${`chat-queue__item${i?``:` chat-queue__item--no-avatar`}${c?` chat-queue__item--steered`:``}${a?` chat-queue__item--failed`:``}${o?` chat-queue__item--reconnect`:``}${u?` chat-queue__item--editing`:``}`}
|
||
data-chat-queue-item=${e.id}
|
||
@click=${e=>{let t=e.currentTarget,n=e.target;!(t instanceof Element)||!(n instanceof Element)||(!y||n.closest(TT)?jT.delete(t):e.detail===1&&jT.add(t))}}
|
||
@dblclick=${y?n=>{let r=n.currentTarget;!(r instanceof Element)||!jT.has(r)||(jT.delete(r),n.stopPropagation(),hT(r,!1),t.onQueueEdit?.(e.id))}:void 0}
|
||
@dragover=${_?e=>{e.dataTransfer?.types.includes(ST)&&(e.preventDefault(),e.dataTransfer.dropEffect=`move`,bT(e,!0))}:void 0}
|
||
@dragleave=${_?e=>bT(e,!1):void 0}
|
||
@drop=${_?t=>{let n=t.dataTransfer?.getData(ST);bT(t,!1),!(!n||n===e.id||!p.includes(n))&&(t.preventDefault(),h?.(n,m))}:void 0}
|
||
>
|
||
${g?z`<button
|
||
class="chat-queue__leading chat-queue__grip"
|
||
type="button"
|
||
draggable=${_?`true`:`false`}
|
||
?disabled=${!_}
|
||
aria-label=${Y(_?`chat.queue.reorderQueuedMessage`:`chat.queue.reorderUnavailable`)}
|
||
aria-keyshortcuts=${ct(_?`ArrowUp ArrowDown`:void 0)}
|
||
@dragstart=${_?t=>{t.dataTransfer?.setData(ST,e.id),t.dataTransfer&&(t.dataTransfer.effectAllowed=`move`)}:void 0}
|
||
@dragend=${fT}
|
||
@keydown=${t=>{if(!_)return;let n=t.key===`ArrowUp`?-1:+(t.key===`ArrowDown`);n!==0&&(t.preventDefault(),h?.(e.id,m+n))}}
|
||
>
|
||
<span class="chat-queue__grip-state chat-queue__grip-state--idle" aria-hidden="true"
|
||
>${x}</span
|
||
>
|
||
${_?z`<span
|
||
class="chat-queue__grip-state chat-queue__grip-state--active"
|
||
aria-hidden="true"
|
||
>${q.gripVertical}</span
|
||
>`:R}
|
||
</button>`:z`<span class="chat-queue__leading chat-queue__icon" aria-hidden="true"
|
||
>${x}</span
|
||
>`}
|
||
${r}
|
||
${u?z`<textarea
|
||
class="chat-queue__edit-input"
|
||
rows="1"
|
||
${U(n=>_T(n,t.editingText??e.text))}
|
||
aria-label=${Y(`chat.queue.editQueuedMessage`)}
|
||
@input=${e=>{e.currentTarget instanceof HTMLTextAreaElement&&(gT(e.currentTarget),t.onQueueEditChange?.(e.currentTarget.value))}}
|
||
@keydown=${e=>{e.isComposing||e.keyCode===229||(e.key===`Escape`?(e.preventDefault(),e.stopPropagation(),t.onQueueEditCancel?.()):e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),t.onQueueEditSubmit?.()))}}
|
||
></textarea>`:z`<span class="chat-queue__copy">
|
||
<span class="chat-queue__text" title=${b}>${b}</span>
|
||
${c?z`<span class="chat-queue__badge chat-queue__badge--steered"
|
||
>${Y(`chat.queue.steer`)}</span
|
||
>`:R}
|
||
${s&&(!a||!e.sendError)?z`<span
|
||
class=${a?`chat-queue__badge`:o?`chat-queue__badge chat-queue__badge--reconnect`:`chat-queue__state`}
|
||
title=${ct(o?e.sendError:void 0)}
|
||
>${s}</span
|
||
>`:R}
|
||
</span>`}
|
||
<span class="chat-queue__actions">
|
||
${a&&!u&&t.onQueueRetry?z`
|
||
<button
|
||
class="chat-queue__action chat-queue__retry"
|
||
type="button"
|
||
aria-label=${Y(`chat.queue.retryQueuedMessage`)}
|
||
@click=${()=>t.onQueueRetry?.(e.id)}
|
||
>
|
||
${q.refresh}
|
||
<span>${Y(`chat.queue.retry`)}</span>
|
||
</button>
|
||
`:R}
|
||
${f?z`
|
||
<button
|
||
class="chat-queue__action chat-queue__steer"
|
||
type="button"
|
||
?disabled=${!d}
|
||
aria-label=${Y(`chat.queue.steerQueuedMessage`)}
|
||
@click=${()=>t.onQueueSteer?.(e.id)}
|
||
>
|
||
${q.arrowUp}
|
||
<span>${Y(`chat.queue.steer`)}</span>
|
||
</button>
|
||
`:R}
|
||
${u?z`
|
||
<button
|
||
class="chat-queue__edit-submit"
|
||
type="button"
|
||
aria-label=${Y(`chat.runControls.sendMessage`)}
|
||
@click=${()=>t.onQueueEditSubmit?.()}
|
||
>
|
||
${q.check}
|
||
</button>
|
||
<button
|
||
class="chat-queue__edit-cancel"
|
||
type="button"
|
||
aria-label=${Y(`chat.queue.cancelEdit`)}
|
||
@click=${()=>t.onQueueEditCancel?.()}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
`:R}
|
||
${l||u?R:z`
|
||
<openclaw-tooltip .content=${Y(`chat.queue.removeQueuedMessage`)}>
|
||
<button
|
||
class="chat-queue__remove"
|
||
type="button"
|
||
?disabled=${u}
|
||
aria-label=${Y(`chat.queue.removeQueuedMessage`)}
|
||
@click=${n=>{n.detail<=1&&t.onQueueRemove(e.id)}}
|
||
@dblclick=${e=>e.stopPropagation()}
|
||
>
|
||
${q.trash}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`}
|
||
${u||!v?R:z`
|
||
<wa-dropdown
|
||
class="chat-queue__overflow"
|
||
placement="top-end"
|
||
@wa-select=${n=>{let r=n.detail.item;if(r.value===`edit`&&y){let i=n.currentTarget;hT(i instanceof Element?i.closest(`.chat-queue__item`):null,r.matches(`:focus-visible`)),t.onQueueEdit?.(e.id)}}}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
class="chat-queue__more"
|
||
type="button"
|
||
?disabled=${!y}
|
||
aria-label=${Y(`chat.queue.moreActions`)}
|
||
@dblclick=${e=>e.stopPropagation()}
|
||
>
|
||
${q.moreHorizontal}
|
||
</button>
|
||
<wa-dropdown-item value="edit" ?disabled=${!y}>
|
||
<span slot="icon" aria-hidden="true">${q.pencil}</span>
|
||
${Y(`chat.queue.editQueuedMessage`)}
|
||
</wa-dropdown-item>
|
||
</wa-dropdown>
|
||
`}
|
||
</span>
|
||
${e.sendError&&!o?z`<span class="chat-queue__error">
|
||
${a&&s?z`<span class="chat-queue__badge">${s}</span>`:R}
|
||
<span class="chat-queue__error-text">${e.sendError}</span>
|
||
</span>`:R}
|
||
</div>
|
||
`}var ST,CT,wT,TT,ET,DT,OT,kT,AT,jT;function MT(){return(MT=e((()=>{B(),ot(),V(),vt(),Nn(),J(),K(),ks(),Os(),gu(),ST=`application/x-openclaw-queued-message`,CT=`chat-queue__item--drop-target`,wT=`data-edit-keyboard-focus`,TT=`a, button, input, select, textarea, wa-dropdown, wa-dropdown-item`,ET=24,DT=12,OT=new WeakSet,kT=cn(lt` <path d="M16 5H3" />
|
||
<path d="M16 12H3" />
|
||
<path d="M9 19H3" />
|
||
<path d="m16 16-3 3 3 3" />
|
||
<path d="M21 5v12a2 2 0 0 1-2 2h-6" />`),jT=new WeakSet})))()}function NT(e){if(e?.phase!==`interrupted`||Date.now()-e.occurredAt>=5e3)return R;let t=Y(`chat.composer.runInterrupted`);return z`
|
||
<span
|
||
class="agent-chat__run-status agent-chat__run-status--interrupted"
|
||
aria-label=${Y(`chat.composer.runStatus`,{status:t})}
|
||
>
|
||
${q.square}<span class="agent-chat__run-status-label">${t}</span>
|
||
</span>
|
||
`}function PT(e){return e?e.phase===`active`||e.phase===`retrying`?z`
|
||
<div
|
||
class="compaction-indicator compaction-indicator--active"
|
||
role="status"
|
||
aria-live="polite"
|
||
>
|
||
${q.loader} ${Y(`chat.composer.compactingContext`)}
|
||
</div>
|
||
`:e.completedAt&&Date.now()-e.completedAt<IT?z`
|
||
<div
|
||
class="compaction-indicator compaction-indicator--complete"
|
||
role="status"
|
||
aria-live="polite"
|
||
>
|
||
${q.check} ${Y(`chat.composer.contextCompacted`)}
|
||
</div>
|
||
`:R:R}function FT(e){if(!e)return R;let t=e.phase??`active`;if(Date.now()-e.occurredAt>=LT)return R;let n=[Y(`chat.composer.fallbackSelected`,{model:e.selected}),Y(`chat.composer.fallbackCurrent`,{model:t===`cleared`?e.selected:e.active}),t===`cleared`&&e.previous?Y(`chat.composer.fallbackPrevious`,{model:e.previous}):null,e.reason?Y(`chat.composer.fallbackReason`,{reason:e.reason}):null,e.attempts.length>0?Y(`chat.composer.fallbackAttempts`,{attempts:e.attempts.slice(0,3).join(` | `)}):null].filter(Boolean).join(` • `),r=t===`cleared`?Y(`chat.composer.fallbackCleared`,{model:e.selected}):Y(`chat.composer.fallbackActive`,{model:e.active}),i=t===`cleared`?`compaction-indicator compaction-indicator--fallback-cleared`:`compaction-indicator compaction-indicator--fallback`,a=t===`cleared`?q.check:q.brain;return z`
|
||
<openclaw-tooltip .content=${n}>
|
||
<div class=${i} role="status" aria-live="polite" aria-label=${n}>
|
||
${a} ${r}
|
||
</div>
|
||
</openclaw-tooltip>
|
||
`}var IT,LT;function RT(){return(RT=e((()=>{B(),J(),K(),Hs(),IT=5e3,LT=8e3})))()}function zT(e){let{props:t,state:n,canCompose:r,showAbortableUi:i,activeSession:a,visibleDraft:s,contextNotice:c,composerControls:l,composerLeadControl:u,runStatusAnnouncement:d,composerRunStatus:f,requestUpdate:p,sendShortcut:m,questionPanelProps:h,showComposer:g,placeholder:_,handleKeyDown:v,handleBeforeInput:y,handleInput:b,handleSelect:x,draftKey:S,handleCompositionEnd:C,handleBlur:w,dictation:T,runControlsProps:E,mirrorCameraPreview:D,slashMenuVisible:O,skillMenuVisible:k,skillMenuHost:ee,slashMenuHost:A,activeSlashMenuOptionId:te,activeSlashMenuOptionLabel:j,slashMenuListboxId:ne,slashMenuAnnouncementId:M,goalComposer:N}=e;(O||k)&&ZC();let re=t.disabledBanner?z`
|
||
<div
|
||
class="agent-chat__disabled-banner ${t.disabledBanner.kind===`composer-replacement`?`agent-chat__disabled-banner--replacement`:``} callout ${t.disabledBanner.tone===`neutral`?`agent-chat__disabled-banner--neutral`:`info`} callout--action"
|
||
role="status"
|
||
>
|
||
${t.disabledBanner.icon?z`<span
|
||
class="agent-chat__disabled-banner-icon agent-chat__disabled-banner-icon--${t.disabledBanner.icon}"
|
||
aria-hidden="true"
|
||
>${t.disabledBanner.icon===`archive`?q.archive:q.alertTriangle}</span
|
||
>`:R}
|
||
<div class="callout__content">
|
||
${t.disabledBanner.title?z`<div class="agent-chat__disabled-banner-title">
|
||
${t.disabledBanner.title}
|
||
</div>`:R}
|
||
<div class="agent-chat__disabled-banner-detail">${t.disabledBanner.text}</div>
|
||
</div>
|
||
<button
|
||
type="button"
|
||
class="btn btn--sm ${t.disabledBanner.actionStyle??``}"
|
||
?disabled=${!!t.disabledBanner.disabledReason||t.disabledBanner.busy}
|
||
aria-busy=${t.disabledBanner.busy?`true`:`false`}
|
||
title=${t.disabledBanner.disabledReason??R}
|
||
@click=${t.disabledBanner.onAction}
|
||
>
|
||
${t.disabledBanner.busy?z`<span class="btn__spinner" aria-hidden="true"></span>${t.disabledBanner.busyLabel??t.disabledBanner.actionLabel}`:t.disabledBanner.actionLabel}
|
||
</button>
|
||
${t.disabledBanner.kind===`composer-replacement`&&i?Ww(E):R}
|
||
</div>
|
||
`:R,ie=g&&t.disabledBanner?.kind!==`composer-replacement`;t.capabilityMenu||(n.capabilityMenuView=`root`);let ae=Ox(t.paneId,`disabled-reason`),P=ie?Nw({status:t.realtimeTalkCameraError?`error`:t.realtimeTalkStatus,detail:t.realtimeTalkDetail,onDismissError:t.realtimeTalkCameraError?void 0:t.onDismissRealtimeTalkError}):R,oe=P===R?R:z`<div class="agent-chat__composer-errors agent-chat__composer-errors--standalone">
|
||
${P}
|
||
</div>`,se=t.offline?t.queuedOutboxCount?Y(`chat.composer.offlineQueuedHint`,{count:String(t.queuedOutboxCount)}):Y(`chat.composer.offlineHint`):null,ce=t.disabledReason?{text:t.disabledReason,tone:t.disabledReasonTone??`danger`,icon:(t.disabledReasonTone??`danger`)===`danger`?q.alertTriangle:q.shieldQuestion}:n.dictationError?{text:n.dictationError,tone:`danger`,icon:q.alertTriangle}:se?{text:se,tone:`warn`,icon:q.globeOff}:null,F=ie&&ce?z`<div class="agent-chat__composer-underlaps" data-tone=${ce.tone}>
|
||
<div
|
||
id=${t.disabledReason?ae:R}
|
||
class="agent-chat__composer-status-band"
|
||
role=${ce.tone===`danger`?`alert`:`status`}
|
||
aria-live="polite"
|
||
>
|
||
<span class="agent-chat__composer-status-icon" aria-hidden="true"
|
||
>${ce.icon}</span
|
||
>
|
||
<span class="agent-chat__composer-status-text">${ce.text}</span>
|
||
</div>
|
||
</div>`:R,le=T?.active?PC(n.dictationSelection?.value??s,T.transcript,n.dictationSelection?.start??s.length,n.dictationSelection?.end??s.length).value:s,ue=oa(le),de=t.runError?R:NT(f),fe=FT(t.fallbackStatus),I=PT(t.compactionStatus),L=t.progressCard?z`<div class="agent-chat__progress-float">
|
||
${vr(t.progressCard,`composer`,t.onDismissProgressCard,a?.status,a?.startedAt,a?.endedAt,t.progressCardHasActiveRun,t.collapseTaskProgress)}
|
||
</div>`:R,pe=yT({queue:t.queue,offline:t.offline,canAbort:i,onQueueRetry:t.connected&&r?t.onQueueRetry:void 0,onQueueSteer:t.connected&&r?t.onQueueSteer:void 0,onQueueMove:t.onQueueMove,onQueueEdit:t.queuedEdit?.onEdit,onQueueEditChange:t.queuedEdit?.onEditChange,onQueueEditSubmit:t.queuedEdit?.onEditSubmit,onQueueEditCancel:t.queuedEdit?.onCancel,editingId:t.queuedEdit?.editingId??null,editingText:t.queuedEdit?.editingText,editingSource:t.queuedEdit?.source,onQueueRemove:t.onQueueRemove}),me=a?.goal?z`<div class="agent-chat__goal-float">
|
||
${Bx(n,a.goal,{canAct:t.connected&&r,onGoalAction:t.onGoalAction,onGoalEdit:t.onGoalSubmit?e=>N.begin(e):void 0,requestUpdate:p})}
|
||
</div>`:R;return z`
|
||
<div
|
||
class="agent-chat__composer-shell ${h&&ie?`agent-chat__composer-shell--question-composer`:``}"
|
||
>
|
||
<div class="agent-chat__composer-overlay">
|
||
${t.anchoredNotices??R} ${oe} ${fe} ${I}
|
||
${de===R?R:z`<div class="agent-chat__composer-run-status">${de}</div>`}
|
||
</div>
|
||
${h?z`
|
||
<div class="agent-chat__question-dock">
|
||
<openclaw-chat-question-panel
|
||
.props=${h}
|
||
></openclaw-chat-question-panel>
|
||
</div>
|
||
`:R}
|
||
${re} ${L} ${pe} ${me}
|
||
${ie?z`<div
|
||
class="agent-chat__input agent-chat__input--chat agent-chat__input--mobile-toolbar ${t.offline?`agent-chat__input--offline`:``}${T?.active?` agent-chat__input--dictating`:``}"
|
||
@wa-show=${ew}
|
||
@wa-after-show=${nw}
|
||
@openclaw-composer-dismiss-invocations=${()=>{n.slashMenuOpen=!1,Q(n),Xx(n),p()}}
|
||
@click=${e=>Cx(e,r)}
|
||
@pointerdown=${e=>{tw(e),Cx(e,r)}}
|
||
${U(n.composerInputRef??void 0)}
|
||
>
|
||
${O?BS(n,A,s,p):R}
|
||
${k?oS(n,ee,p):R}
|
||
<div class="agent-chat__composer-lede">
|
||
${N.render()} ${yv(t)}
|
||
${t.replyTarget?z`
|
||
<div class="chat-reply-preview">
|
||
<span class="chat-reply-preview__icon">${q.messageSquare}</span>
|
||
<span class="chat-reply-preview__label"
|
||
>${Y(`chat.messages.replyingTo`,{name:t.replyTarget.senderLabel??Y(`chat.messages.message`)})}</span
|
||
>
|
||
<span class="chat-reply-preview__text"
|
||
>${o(t.replyTarget.text,120)}${t.replyTarget.text.length>120?`...`:``}</span
|
||
>
|
||
<button
|
||
type="button"
|
||
class="chat-reply-preview__dismiss"
|
||
@click=${()=>t.onClearReply?.()}
|
||
aria-label=${Y(`chat.composer.cancelReply`)}
|
||
title=${Y(`chat.composer.cancelReply`)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</div>
|
||
`:R}
|
||
${Uw(T)}
|
||
${fv({...t,disabled:!r})}
|
||
${t.realtimeTalkVideoStream?z`
|
||
<div class="agent-chat__video-preview">
|
||
<video
|
||
class=${D?`agent-chat__video-preview-mirrored`:R}
|
||
autoplay
|
||
.muted=${!0}
|
||
playsinline
|
||
aria-label=${Y(`chat.composer.cameraPreview`)}
|
||
.srcObject=${Ct(t.realtimeTalkVideoStream)}
|
||
></video>
|
||
${t.realtimeTalkCameraDevices&&t.realtimeTalkCameraDevices.length>=2&&t.onSwitchRealtimeCamera?z`
|
||
<openclaw-tooltip
|
||
class="agent-chat__video-preview-switch-tooltip"
|
||
.content=${Y(`chat.composer.switchCamera`)}
|
||
>
|
||
<button
|
||
type="button"
|
||
class="agent-chat__video-preview-switch"
|
||
aria-label=${Y(`chat.composer.switchCamera`)}
|
||
?disabled=${t.realtimeTalkVideoPending}
|
||
@click=${t.onSwitchRealtimeCamera}
|
||
>
|
||
${q.switchCamera}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
</div>
|
||
`:R}
|
||
</div>
|
||
|
||
<div class="agent-chat__composer-input-row">
|
||
<div class="agent-chat__composer-combobox">
|
||
<textarea
|
||
${U(n.textareaRef??void 0)}
|
||
.value=${mt([le],()=>Ct(le))}
|
||
dir=${ue}
|
||
?disabled=${!r}
|
||
?readonly=${T?.locksComposer===!0||N.pending}
|
||
aria-autocomplete="list"
|
||
aria-controls=${ct(O||k?ne:void 0)}
|
||
aria-expanded=${ct(O||k?`true`:void 0)}
|
||
aria-activedescendant=${ct(te??void 0)}
|
||
aria-describedby=${`${M}${t.disabledReason?` ${ae}`:``}`}
|
||
aria-keyshortcuts=${m===`enter`?`Enter`:`Control+Enter Meta+Enter`}
|
||
@keydown=${v}
|
||
@beforeinput=${y}
|
||
@input=${b}
|
||
@select=${x}
|
||
@focus=${x}
|
||
@pointerup=${x}
|
||
@compositionstart=${e=>{n.composerComposing=!0,n.composingDraft={key:S,value:e.target.value}}}
|
||
@compositionend=${C}
|
||
@blur=${w}
|
||
@paste=${e=>{r&&!t.suggestionComposer&&sv(e,t)}}
|
||
aria-label=${_}
|
||
placeholder=${T?.active?``:_}
|
||
rows="1"
|
||
></textarea>
|
||
<span
|
||
id=${M}
|
||
class="sr-only"
|
||
role="status"
|
||
aria-live="polite"
|
||
aria-atomic="true"
|
||
>${j}</span
|
||
>
|
||
<span
|
||
class="agent-chat__run-status-announcement sr-only"
|
||
role="status"
|
||
aria-live="polite"
|
||
aria-atomic="true"
|
||
>${d}</span
|
||
>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="agent-chat__composer-footer">
|
||
<div class="agent-chat__composer-lead agent-chat__composer-meta">
|
||
${lT({attachments:t,capabilityMenu:t.capabilityMenu,disabled:!r||t.suggestionComposer===!0,open:n.capabilityMenuOpen,view:n.capabilityMenuView,toolOverrides:t.toolOverrides,onOpenChange:e=>{n.capabilityMenuOpen=e,e||(n.capabilityMenuView=`root`),p()},onViewChange:e=>{n.capabilityMenuView=e,p()}})}
|
||
${u}
|
||
</div>
|
||
<div class="agent-chat__composer-trail">
|
||
<div class="agent-chat__composer-meta agent-chat__composer-context">
|
||
${c}
|
||
</div>
|
||
${l===R?R:z` <div class="agent-chat__composer-controls">${l}</div> `}
|
||
<div class="agent-chat__composer-actions">
|
||
${Ww(E)}
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div> `:R}
|
||
${F}
|
||
</div>
|
||
`}function BT(){return(BT=e((()=>{B(),pt(),ot(),ft(),V(),J(),Fi(),K(),_i(),HC(),kv(),Gw(),Px(),Wx(),dT(),MT(),cS(),VS(),RT(),uw(),Rw()})))()}function VT(e,t){let n=e.currentTarget;if(!(n instanceof HTMLElement)||!n.hasAttribute(`open`)||!/^[1-5]$/u.test(e.key))return;let r=n.querySelector(`[data-chat-permission-shortcut="${e.key}"]`);if(!r||r.hasAttribute(`disabled`))return;let i=GT(r.dataset.chatPermissionOption);i!==void 0&&(e.preventDefault(),e.stopPropagation(),t(i),n.removeAttribute(`open`),n.querySelector(`[slot=trigger]`)?.focus())}function HT(e,t){return e?Y(`chat.permissionControls.modes.${e}.label`):t?Y(`chat.permissionControls.defaultWithMode`,{mode:Y(`chat.permissionControls.modes.${t}.label`)}):Y(`chat.permissionControls.default`)}function UT(e){switch(e){case`read-only`:return q.shieldEllipsis;case`guarded`:return q.shieldLock;case`workspace`:return q.shieldCog;case`full`:return q.shieldAlert;default:return q.shieldCheck}}function WT(e){return e!==void 0&&JT.some(t=>t===e)}function GT(e){return e===YT?null:WT(e)?e:void 0}function KT(e){let t=t=>{e.disabled||t===`full`&&!e.canSelectFull||t!==(e.mode??null)&&e.onSelect(t)};return z`
|
||
<wa-dropdown
|
||
class="chat-controls__inline-select chat-controls__permission-picker"
|
||
placement="top-start"
|
||
@wa-after-show=${nw}
|
||
@keydown=${e=>VT(e,t)}
|
||
@wa-select=${e=>{let n=GT(e.detail.item.value);n!==void 0&&t(n)}}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
type="button"
|
||
class="chat-controls__inline-select-trigger chat-controls__permission-trigger ${e.disabled?`chat-controls__inline-select-trigger--disabled`:``} ${e.mode?``:`chat-controls__permission-trigger--default`} ${e.mode===`full`?`chat-controls__permission-trigger--full`:``}"
|
||
data-chat-permission-select="true"
|
||
data-chat-select-value=${e.mode??``}
|
||
aria-label=${`${Y(`chat.permissionControls.label`)}: ${HT(e.mode,e.defaultMode)}`}
|
||
aria-disabled=${e.disabled?`true`:`false`}
|
||
title=${e.disabledReason??Y(`chat.permissionControls.help`)}
|
||
?disabled=${e.disabled}
|
||
>
|
||
<span class="chat-controls__permission-icon" aria-hidden="true"
|
||
>${UT(e.mode??null)}</span
|
||
>
|
||
<span
|
||
class="chat-controls__inline-select-label ${e.mode===`full`?`chat-controls__permission-label--full`:``}"
|
||
>
|
||
${HT(e.mode,e.defaultMode)}
|
||
</span>
|
||
</button>
|
||
<div class="chat-controls__popover-title chat-controls__permission-heading">
|
||
<span>${Y(`chat.permissionControls.label`)}</span>
|
||
<a
|
||
class="chat-controls__permission-learn-more learn-more-link"
|
||
href=${qT}
|
||
target=${Se}
|
||
rel=${Te()}
|
||
>${Y(`common.learnMore`)}</a
|
||
>
|
||
</div>
|
||
${XT.map((t,n)=>{let r=t??YT,i=(e.mode??null)===t,a=t===`full`&&!e.canSelectFull;return z`
|
||
<wa-dropdown-item
|
||
class="chat-controls__permission-option ${i?`chat-controls__permission-option--selected`:``}"
|
||
value=${r}
|
||
data-chat-permission-option=${r}
|
||
data-chat-permission-shortcut=${String(n+1)}
|
||
role="menuitemradio"
|
||
aria-checked=${i?`true`:`false`}
|
||
aria-label=${a?`${HT(t,e.defaultMode)}. ${Y(`chat.permissionControls.fullRequiresAdmin`)}`:HT(t,e.defaultMode)}
|
||
title=${a?Y(`chat.permissionControls.fullRequiresAdmin`):R}
|
||
?disabled=${e.disabled||a}
|
||
>
|
||
<span slot="icon" class="chat-controls__permission-option-icon" aria-hidden="true"
|
||
>${UT(t)}</span
|
||
>
|
||
<span class="chat-controls__permission-option-copy">
|
||
<span class="chat-controls__permission-option-title">
|
||
<span>${HT(t,e.defaultMode)}</span>
|
||
</span>
|
||
<span class="chat-controls__permission-option-description">
|
||
${Y(t?`chat.permissionControls.modes.${t}.description`:`chat.permissionControls.defaultDescription`)}
|
||
</span>
|
||
</span>
|
||
<span slot="details" class="chat-controls__permission-option-state" aria-hidden="true">
|
||
${i||a?R:z`<span class="chat-controls__permission-shortcut">${n+1}</span>`}
|
||
${a?z`<span class="chat-controls__permission-lock">${q.lock}</span>`:R}
|
||
${i&&!a?z`<span class="chat-controls__inline-select-check">${q.check}</span>`:R}
|
||
</span>
|
||
</wa-dropdown-item>
|
||
`})}
|
||
</wa-dropdown>
|
||
`}var qT,JT,YT,XT;function ZT(){return(ZT=e((()=>{B(),J(),K(),ze(),uw(),qT=`https://docs.openclaw.ai/gateway/permission-modes`,JT=[`read-only`,`guarded`,`workspace`,`full`],YT=`default`,XT=[null,...JT]})))()}function QT(e,t){return e.key===`think`?t.modelSwitching?[]:Bo(t.selectedSession,t.sessions?.defaults,t.modelCatalog):e.argOptions??[]}function $T(e){let t=US(e.paneId);t.slashCommandDispatchConnected=e.connected;let n=e.canSend,r=e.sending||e.stream!==null,i=!!(e.canAbort&&e.onAbort),a=WS(e.runStatus),o=i&&!a,s=e.queue.find(t=>GS(t,e.sessionKey,e.runStatus)),c=e.queue.some(e=>!e.pendingRunId&&(e.sendState===`sending`||e.sendState===`waiting-model`)),l=e.sending&&(!c||s!==void 0),u=l||o||s?{phase:`in-progress`}:e.runStatus,d=qS(e);t.composerDraftScopeKey!==null&&t.composerDraftScopeKey!==d&&(t.dictation?.dispose(),t.dictation=null,t.dictationSelection=null),t.composerDraftScopeKey=d;let f=t.composingDraft?.key===d?t.composingDraft.value:e.draft;t.composerInputRef??=e=>{t.composerInput=_x(t.composerInput,e)},t.textareaRef??=e=>{let n=e instanceof HTMLTextAreaElement?e:null,r=t.composerTextarea;r&&r!==n&&xx(r),t.composerTextarea=n,n&&(bx(n),Sx(n),t.restoreComposerFocus&&(t.restoreComposerFocus=!1,queueMicrotask(()=>t.composerTextarea?.focus({preventScroll:!0}))))},t.composerTextarea?.isConnected&&t.composerTextarea.value!==f&&Sx(t.composerTextarea);let p=(e.attachments??[]).some(e=>!J_(e)),m=Cw(e.selectedSession,e.sessions?.defaults?.contextTokens??null,{messages:e.messages,providerUsage:e.providerUsage}),h=e.composerControls??R,g=e.permissionPicker?KT(e.permissionPicker):R,_=e.assistantName||`OpenClaw`,v=e.waitingApproval?Y(`chat.waitingForApproval`):s?.sendState===`waiting-model`?Y(`chat.composer.preparingModel`):e.stream===null?l||s?Y(`chat.composer.sendingMessage`):Y(`chat.composer.working`,{name:_}):Y(`chat.composer.responding`,{name:_}),y=u==null?``:u.phase===`in-progress`?v:u.phase===`done`?Y(`chat.composer.runDone`):Y(`chat.composer.runInterrupted`),b=e.onRequestUpdate??(()=>{}),x=Kw(e,t,b),S={paneId:e.paneId,getDraft:()=>t.composerTextarea?.value??e.getDraft?.()??e.draft,commitDraft:t=>{JS(e,t),e.onTypingChange?.(!!t.trim(),t)},getTextarea:()=>t.composerTextarea,refreshCommands:e.onSlashIntent},C={paneId:e.paneId,getDraft:S.getDraft,commitDraft:S.commitDraft,getTextarea:()=>t.composerTextarea,resolveArgOptions:t=>QT(t,e),runCommand:()=>e.onSend(),canRunInlineCommand:()=>t.slashCommandDispatchConnected&&!!e.onSlashCommand,runInlineCommand:e.connected?e.onSlashCommand:void 0,refreshCommands:e.onSlashIntent,activateComposerMode:e=>x.activateCommand(e)},w=Nt(e.sendShortcut),T=e.connected&&w===`enter`&&o&&!e.suggestionComposer&&e.followUpMode!==void 0&&e.followUpMode!==`interrupt`?e.followUpMode===`steer`?`queue`:`steer`:void 0,E=e.gatewayQuestionPrompts?.filter(t=>t.status===`pending`&&t.sessionKey!==void 0&&Ne(t.sessionKey,e.sessionKey))??[],D=E.findIndex(e=>e.id===t.activeGatewayQuestionId);D<0&&E.length>0?(D=0,t.activeGatewayQuestionId=E[0]?.id??null,t.gatewayQuestionCollapsed=!1):E.length===0&&(t.activeGatewayQuestionId=null,t.gatewayQuestionCollapsed=!1);let O=E[D],k=e=>{let n=E[e];n&&(t.activeGatewayQuestionId=n.id,t.gatewayQuestionCollapsed=!1,b())},ee=O?gh(O,{collapsed:t.gatewayQuestionCollapsed,onCollapsedChange:e=>{t.gatewayQuestionCollapsed=e,t.restoreComposerFocus=e,b()},onChange:e.onGatewayQuestionChange,onSubmit:e.onGatewayQuestionSubmit?t=>e.onGatewayQuestionSubmit?.(O.id,t):void 0,onSkip:e.onGatewayQuestionSkip?()=>e.onGatewayQuestionSkip?.(O.id):void 0,requestPosition:E.length>1?{current:D+1,total:E.length}:void 0,onPreviousRequest:()=>k((D-1+E.length)%E.length),onNextRequest:()=>k((D+1)%E.length)}):null,A=!!(ee&&!t.gatewayQuestionCollapsed);!t.questionTakeoverActive&&A&&(t.composingDraft?.key===d&&(JS(e,t.composingDraft.value),t.composingDraft=null),t.composerComposing=!1),t.questionTakeoverActive&&!A&&(t.restoreComposerFocus=!0),t.questionTakeoverActive=A;let te=!A,j=x.active?Y(`chat.goals.objectivePlaceholder`):p?Y(`chat.composer.placeholderWithAttachments`):Y(`chat.composer.placeholder`,{name:e.assistantName||`agent`}),ne=r=>n&&!x.pending&&t.dictation?.locksComposer!==!0&&!(t.skillMenuOpen&&t.skillCommandRefreshPending)&&(e.getPendingAttachmentReads?.()??e.pendingAttachmentReads??0)===0&&(e.connected||!r.trimStart().startsWith(`/`)),M=n=>{let r=n?.value??e.getDraft?.()??e.draft,i=e.getDraft?.()??e.draft;i===``&&r!==``&&n?.value===r?t.pendingClearedSubmittedDraft={key:d,value:r}:ZS(t,d),n&&n.value!==i&&(n.value=i,yx(n))},N=Jw({state:t,props:e,skillMenuHost:S,slashMenuHost:C,requestUpdate:b,sendShortcut:w,canSubmitDraft:ne,commitDraft:t=>JS(e,t),syncDraftAfterSend:M,showAbortableUi:o,alternateFollowUpMode:T,goalComposer:x}),re=n=>{yx(n),JS(e,n.value),x.active||(wS(n.value,t,C,b),$x(n.value,n.selectionStart,t,S,b)),b()},ie=n=>{n.target instanceof HTMLTextAreaElement&&!t.composerComposing&&!n.isComposing&&YS(t,qS(e))},ae=n=>{let r=n.target,i=XS(t,d);if(t.composerComposing||n.isComposing){t.composingDraft={key:d,value:r.value},b();return}t.composingDraft?.key===d&&(t.composingDraft=null),!$S(r,n,e.getDraft?.()??e.draft,i,t)&&(re(r),e.onTypingChange?.(!!r.value.trim(),r.value))},P=e=>{let n=e.target;x.active||(wS(n.value,t,C,b),$x(n.value,n.selectionStart,t,S,b))},oe=n=>{t.composerComposing=!1,t.composingDraft?.key===d&&(t.composingDraft=null),re(n.target);let r=n.target.value;e.onTypingChange?.(!!r.trim(),r)},se=n=>{let r=n.target;if(t.composerComposing=!1,t.composingDraft?.key===d&&(t.composingDraft=null),!t.dictation?.locksComposer){let t=yc(r.value);r.value!==t&&(r.value=t,yx(r)),JS(e,t)}e.onTypingChange?.(!1)},ce=n=>{let r=t.composerTextarea?.value??e.draft;if(ne(r)){if(t.composerComposing=!1,t.composingDraft=null,JS(e,r),e.onTypingChange?.(!1),x.active){x.submit(n);return}e.onSend(void 0,n),M(t.composerTextarea)}};t.microphonePicker??=new UC(b);let F=t.microphonePicker;F.syncCatalog(e.gatewayClient??null,e.connected);let le=()=>{if(F.realtimeStatus!==`ready`){F.handleOpen();return}e.onToggleRealtimeTalk?.()},ue=()=>{if(e.realtimeTalkActive){e.onToggleRealtimeTalk?.();return}if((t.composerTextarea?.value??f).trim()||e.attachments?.length){ce();return}le()},de=Rt().realtimeTalkInputDeviceId?.trim()??``,fe=e.onToggleRealtimeTalk?Bw({devices:F.devices,loading:F.loading,open:F.open,selectedDeviceId:de,voiceActive:!!e.realtimeTalkActive,issue:F.issue,holdToDictate:e.composerHoldToRecord!==!1,realtimeStatus:F.realtimeStatus,dictationStatus:F.dictationStatus,onOpen:F.handleOpen,onClose:F.handleClose,onSelect:e=>{Ht({realtimeTalkInputDeviceId:e.trim()||void 0}),F.handleClose()},onHoldToDictateChange:t=>{e.onComposerHoldToRecordChange?e.onComposerHoldToRecordChange(t):Ht({composerHoldToRecord:t}),b()},onOpenTalkSettings:e.onOpenTalkSettings,onOpenDictationSettings:e.onOpenDictationSettings}):R,I={client:e.gatewayClient??null,connected:e.connected,enabled:e.composerHoldToRecord!==!1,dictationAvailable:F.dictationStatus===`ready`,realtimeTalkActive:e.realtimeTalkActive===!0,onCommit:n=>{let r=t.composerTextarea,i=t.dictationSelection??{start:r?.selectionStart??f.length,end:r?.selectionEnd??f.length,value:e.getDraft?.()??e.draft},a=PC(i.value,n,i.start,i.end);r&&(r.value=a.value,yx(r)),JS(e,a.value),t.dictationSelection=null,b(),queueMicrotask(()=>{let e=t.composerTextarea;e&&(e.focus({preventScroll:!0}),e.selectionStart=a.caret,e.selectionEnd=a.caret)})},onError:(e,n)=>{let r=n.kind===`interrupted`&&n.preservesText?Y(`chat.composer.dictationInterruptedRecovery`):Y(`chat.composer.dictationStartRecovery`);t.dictationError=`${e} ${r}`,b()},onStateChange:b,onDictationUnavailable:F.handleOpen,onTap:f.trim()||e.attachments?.length?le:ue};t.dictation??=new VC(I),t.dictation.update(I);let L=e.onToggleRealtimeTalk&&e.composerHoldToRecord!==!1?t.dictation:void 0,pe={canAbort:o,canSend:ne(f),connected:e.connected,draft:f,hasAttachments:!e.suggestionComposer&&!!e.attachments?.length,isBusy:r,followUpMode:e.followUpMode,alternateFollowUpMode:T,suggestionComposer:e.suggestionComposer,submissionLabel:x.submissionLabel,sending:e.sending,voiceActive:e.realtimeTalkActive,voiceStatus:e.realtimeTalkStatus,voiceDetail:e.realtimeTalkDetail,voiceInputLevel:e.realtimeTalkInputLevel,voiceVideoCapable:e.realtimeTalkVideoCapable,voiceVideoEnabled:!!e.realtimeTalkVideoStream,voiceVideoPending:e.realtimeTalkVideoPending,onAbort:e.onAbort,onSend:ce,onToggleVoice:e.onToggleRealtimeTalk?ue:void 0,onToggleCamera:e.onToggleRealtimeCamera,microphonePicker:fe,dictation:L,onDictationPointerDown:e=>{t.dictationError&&(t.dictationError=null,b());let n=t.composerTextarea,r={start:n?.selectionStart??f.length,end:n?.selectionEnd??f.length,value:n?.value??f};L?.handlePointerDown(e)&&(t.dictationSelection=r,n&&(n.readOnly=!0))},onPrimaryActionPointerDown:e=>wx(e,t.composerTextarea)},me=e.realtimeTalkVideoStream?.getVideoTracks?.()[0]?.getSettings?.().facingMode!==`environment`;e.modelSwitching&&t.slashMenuCommand?.key===`think`&&Q(t);let he=e.connected&&n&&PS(t),ge=e.connected&&n&&tS(t);!ge&&t.skillMenuOpen&&!t.skillCommandRefreshPending&&Xx(t);let _e=ge?nS(t,e.paneId):FS(t,e.paneId),ve=ge?rS(t):IS(t),ye=Ox(e.paneId,ge?`skill-menu-listbox`:`slash-menu-listbox`),be=Ox(e.paneId,`slash-active-announcement`);return zT({props:e,state:t,canCompose:n,showAbortableUi:o,activeSession:e.selectedSession,visibleDraft:f,contextNotice:m,composerControls:h,composerLeadControl:g,runStatusAnnouncement:y,composerRunStatus:u,requestUpdate:b,sendShortcut:w,questionPanelProps:ee,showComposer:te,placeholder:j,handleKeyDown:N,handleBeforeInput:ie,handleInput:ae,handleSelect:P,draftKey:d,handleCompositionEnd:oe,handleBlur:se,dictation:L,runControlsProps:pe,mirrorCameraPreview:me,slashMenuVisible:he,skillMenuVisible:ge,skillMenuHost:S,slashMenuHost:C,activeSlashMenuOptionId:_e,activeSlashMenuOptionLabel:ve,slashMenuListboxId:ye,slashMenuAnnouncementId:be,goalComposer:x})}function eE(){return(eE=e((()=>{B(),kt(),G(),K(),Go(),ve(),HC(),WC(),kv(),Ow(),Gw(),Px(),qw(),Yw(),cS(),VS(),rC(),BT(),ZT(),xh()})))()}function tE(e,t){let n=e.options.find(t=>t.id===e.selected);if(!n)return R;let r=Y(`chat.modelControls.contextWindowAria`,{state:n.label}),i;if(e.options.length===2){let[a,o]=[...e.options].toSorted((e,t)=>e.contextWindow-t.contextWindow);if(!a||!o)return R;let s=n.id===o.id,c=s?a:o;i=z`
|
||
<button
|
||
class="chat-controls__speed-toggle ${s?`chat-controls__speed-toggle--active`:``}"
|
||
data-chat-context-window-toggle=${c.id}
|
||
type="button"
|
||
role="switch"
|
||
aria-checked=${s?`true`:`false`}
|
||
aria-label=${r}
|
||
?disabled=${e.disabled}
|
||
@click=${n=>{if(n.stopPropagation(),e.disabled){n.preventDefault();return}e.onSelect(c.id,t)}}
|
||
>
|
||
<span class="chat-controls__speed-toggle-thumb"></span>
|
||
</button>
|
||
`}else i=z`
|
||
<div
|
||
class="settings-segmented chat-controls__context-window-options"
|
||
role="group"
|
||
aria-label=${r}
|
||
>
|
||
${e.options.map(r=>z`
|
||
<button
|
||
class="settings-segmented__btn ${r.id===n.id?`settings-segmented__btn--active`:``}"
|
||
data-chat-context-window-option=${r.id}
|
||
type="button"
|
||
aria-pressed=${r.id===n.id?`true`:`false`}
|
||
?disabled=${e.disabled}
|
||
@click=${i=>{if(i.stopPropagation(),e.disabled||r.id===n.id){i.preventDefault();return}e.onSelect(r.id,t)}}
|
||
>
|
||
${r.label}
|
||
</button>
|
||
`)}
|
||
</div>
|
||
`;return z`
|
||
<div class="chat-controls__fast-mode-row chat-controls__context-window-row">
|
||
<span
|
||
class="chat-controls__fast-mode-icon chat-controls__context-window-icon"
|
||
aria-hidden="true"
|
||
>${q.scrollText}</span
|
||
>
|
||
<span class="chat-controls__fast-mode-copy">
|
||
<span class="chat-controls__fast-mode-title">
|
||
${Y(`chat.modelControls.contextWindow`)}
|
||
</span>
|
||
<span class="chat-controls__fast-mode-description">${n.label}</span>
|
||
</span>
|
||
${i}
|
||
</div>
|
||
`}function nE(){return(nE=e((()=>{B(),J(),K()})))()}function rE(e,t,n,r,i=Y(`chat.modelControls.modelsUnavailable`),a){if(!e||e.status===`ready`&&n||e.status===`error`&&t)return R;let o=e.status===`offline`?Y(`common.offline`):e.status===`error`?i:e.status===`ready`?Y(`chat.modelControls.noModelsAvailable`):Y(`chat.modelControls.loadingModels`);return z`
|
||
<div
|
||
class="chat-controls__model-catalog-state ${t?``:`chat-controls__model-catalog-state--empty`}"
|
||
data-chat-model-catalog-state=${e.status}
|
||
aria-live="polite"
|
||
>
|
||
<span class="chat-controls__model-catalog-state-label">
|
||
${e.status===`error`?q.alertTriangle:R}
|
||
<span>${o}</span>
|
||
</span>
|
||
${e.status===`error`&&a?z`
|
||
<button
|
||
class="chat-controls__model-catalog-action"
|
||
data-chat-model-target-retry=${a.groupId}
|
||
type="button"
|
||
?disabled=${a.disabled}
|
||
@click=${e=>{e.stopPropagation(),a.onRetry(a.groupId)}}
|
||
>
|
||
${Y(`common.retry`)}
|
||
</button>
|
||
`:R}
|
||
${e.status===`ready`&&!n&&r?z`
|
||
<button
|
||
class="chat-controls__model-catalog-action"
|
||
data-chat-model-setup="true"
|
||
type="button"
|
||
@click=${e=>{e.stopPropagation(),r()}}
|
||
>
|
||
${Y(`chat.modelControls.emptyModelsAction`)}
|
||
</button>
|
||
`:R}
|
||
</div>
|
||
`}function iE(){return(iE=e((()=>{B(),J(),K()})))()}function aE(e){let t=e.contextTokens,n=e.contextWindow;return t&&n&&t!==n?Y(`chat.modelControls.contextActiveAndMax`,{active:ye(t),maximum:ye(n)}):n?ye(n):``}function oE(e){let t=e.trim().toLowerCase();return dE[t]??`${t.charAt(0).toUpperCase()}${t.slice(1)}`}function sE(e){let t=[Gi(e.provider),xo(e.provider)].toSorted((e,t)=>t.length-e.length);for(let n of t){if(e.label.toLowerCase().startsWith(`${n.toLowerCase()} `))return e.label.slice(n.length+1);let t=` (${n.toLowerCase()})`;if(e.label.toLowerCase().endsWith(t))return e.label.slice(0,e.label.length-t.length)}return e.label}function cE(e){return na(e,{className:`chat-controls__provider-icon`})}function lE(e){let t=e.entry.value===e.selectedModelValue||e.entry.isDefault&&e.selectedModelValue===``,n=sE(e.entry),r=e.entry.disabled&&(e.entry.unavailableReason===`missing-auth`||e.entry.unavailableReason===`auth-failed`),i=r?e.onModelSetup:void 0,a=[aE(e.entry),e.entry.agentRuntimeId?oE(e.entry.agentRuntimeId):``,r?Y(`modelSetup.candidates.signInNeeded`):``].filter(Boolean).join(` · `),o=z`<button
|
||
class="chat-controls__inline-select-option chat-controls__model-option ${t?`chat-controls__inline-select-option--selected`:``}"
|
||
data-chat-model-option=${e.entry.value}
|
||
data-chat-model-default=${e.entry.isDefault?`true`:R}
|
||
data-chat-model-index=${e.index}
|
||
data-chat-model-keywords=${e.entry.isDefault?Y(`chat.modelControls.default`).toLocaleLowerCase():R}
|
||
data-chat-model-name=${n.toLocaleLowerCase()}
|
||
data-chat-model-provider-label=${xo(e.entry.provider).toLocaleLowerCase()}
|
||
role="option"
|
||
aria-selected=${t?`true`:`false`}
|
||
aria-label=${e.entry.supportsTools===!1?`${n}. ${Y(`chat.modelControls.chatOnlyHelp`)}`:n}
|
||
type="button"
|
||
?disabled=${e.disabled||e.entry.disabled&&!i}
|
||
data-chat-model-setup=${i?`true`:R}
|
||
@mouseenter=${t=>e.onHighlight(t.currentTarget)}
|
||
@click=${t=>{if(e.entry.disabled){t.stopPropagation(),i?.();return}e.onSelect(e.entry,t)}}
|
||
>
|
||
<span class="chat-controls__model-option-provider">
|
||
${cE(e.entry.provider)}
|
||
</span>
|
||
<span class="chat-controls__model-option-copy">
|
||
<span class="chat-controls__model-option-title">
|
||
<span class="chat-controls__model-option-name">${n}</span>
|
||
${e.entry.isDefault?z`<span
|
||
class="chat-controls__model-state-label chat-controls__model-state-label--default"
|
||
>${Y(`chat.modelControls.default`)}</span
|
||
>`:R}
|
||
${a?z`<span class="chat-controls__model-option-meta">${a}</span>`:R}
|
||
${e.entry.supportsTools===!1?z`<span class="chat-controls__model-chat-only-info" aria-hidden="true"
|
||
>${q.info}</span
|
||
>`:R}
|
||
</span>
|
||
</span>
|
||
<span class="chat-controls__model-option-action">
|
||
${t?z`<span class="chat-controls__inline-select-check" aria-hidden="true"
|
||
>${q.check}</span
|
||
>`:z`<kbd data-chat-model-shortcut="true" aria-hidden="true" hidden></kbd>`}
|
||
</span>
|
||
</button>`;return e.entry.supportsTools===!1?z`<openclaw-tooltip .content=${Y(`chat.modelControls.chatOnlyHelp`)}>
|
||
${o}
|
||
</openclaw-tooltip>`:o}function uE(e){return z`
|
||
<button
|
||
class="chat-controls__inline-select-option chat-controls__model-option"
|
||
data-chat-model-option=${`target:${e.groupId}:${e.entry.value}`}
|
||
data-chat-model-target=${e.entry.value}
|
||
data-chat-model-index=${e.index}
|
||
data-chat-model-name=${e.entry.label.toLocaleLowerCase()}
|
||
data-chat-model-provider-label=${e.groupLabel.toLocaleLowerCase()}
|
||
role="option"
|
||
aria-selected="false"
|
||
type="button"
|
||
?disabled=${e.disabled}
|
||
@mouseenter=${t=>e.onHighlight(t.currentTarget)}
|
||
@click=${t=>e.onSelect(e.groupId,e.entry.value,t)}
|
||
>
|
||
<span
|
||
class="chat-controls__model-option-provider chat-controls__target-icon"
|
||
aria-hidden="true"
|
||
>${q.terminal}</span
|
||
>
|
||
<span class="chat-controls__model-option-copy">
|
||
<span class="chat-controls__model-option-title">
|
||
<span class="chat-controls__model-option-name">${e.entry.label}</span>
|
||
</span>
|
||
</span>
|
||
<span class="chat-controls__model-option-action">
|
||
<kbd data-chat-model-shortcut="true" aria-hidden="true" hidden></kbd>
|
||
</span>
|
||
</button>
|
||
`}var dE;function fE(){return(fE=e((()=>{B(),J(),G(),Wr(),K(),Je(),dE={"claude-cli":`Claude CLI`,codex:`Codex`,"codex-cli":`Codex`,"google-gemini-cli":`Gemini CLI`,openclaw:`OpenClaw`}})))()}function pE(e){return e instanceof Element?e.closest(`.chat-controls__model-menu`):null}function mE(e){return[...e.querySelectorAll(`[data-chat-model-option]`)].filter(e=>!e.hidden).toSorted((e,t)=>Number(e.dataset.chatModelRank??e.dataset.chatModelIndex??0)-Number(t.dataset.chatModelRank??t.dataset.chatModelIndex??0))}function hE(e){return mE(e).filter(e=>!e.disabled)}function gE(e){let t=e.closest(`.chat-controls__model-picker`),n=e.querySelector(`[data-chat-model-search]`),r=e.querySelector(`[data-chat-model-list]`);if(!t||!n||!r)return;let i=t.dataset.chatModelPickerId??`chat-model-picker-${crypto.randomUUID()}`;t.dataset.chatModelPickerId=i,r.id=`${i}-listbox`,e.querySelectorAll(`[data-chat-model-option]`).forEach((e,t)=>{e.id=`${i}-option-${t}`}),n.setAttribute(`aria-controls`,r.id),n.setAttribute(`aria-expanded`,t.open?`true`:`false`)}function _E(e,t){e.querySelectorAll(`[data-chat-model-option]`).forEach(e=>{e.toggleAttribute(`data-chat-model-highlighted`,e===t)});let n=e.querySelector(`[data-chat-model-search]`);t?.id?n?.setAttribute(`aria-activedescendant`,t.id):n?.removeAttribute(`aria-activedescendant`)}function vE(e,t){e.querySelectorAll(`[data-chat-model-shortcut]`).forEach(e=>{e.hidden=!0,e.removeAttribute(`data-chat-model-shortcut-number`)}),t.slice(0,9).forEach((e,t)=>{let n=e.querySelector(`[data-chat-model-shortcut]`);n&&(n.hidden=!1,n.setAttribute(`data-chat-model-shortcut-number`,String(t+1)))})}function yE(e,t){let n=e.dataset.chatModelName??``,r=e.dataset.chatModelKeywords??``,i=e.dataset.chatModelProviderLabel??``;return n.startsWith(t)?0:n.includes(t)?1:r.includes(t)?2:i.startsWith(t)?3:i.includes(t)?4:null}function bE(e){let t=pE(e);if(!t)return;gE(t);let n=e.value.trim().toLocaleLowerCase();t.toggleAttribute(`data-chat-model-filtering`,!!n);let r=[...t.querySelectorAll(`[data-chat-model-option]`)],i=[];r.forEach((e,t)=>{let r=n?yE(e,n):0;e.hidden=r===null,e.style.removeProperty(`--chat-model-rank`),delete e.dataset.chatModelRank,r!==null&&i.push({row:e,score:r,index:t})}),i.toSorted((e,t)=>e.score-t.score||e.index-t.index).forEach(({row:e},t)=>{e.dataset.chatModelRank=String(t),e.style.setProperty(`--chat-model-rank`,String(t))});let a=mE(t),o=hE(t);vE(t,o);let s=o.find(e=>e.getAttribute(`aria-selected`)===`true`);_E(t,n?o[0]:s??o[0]);let c=t.querySelector(`[data-chat-model-search-empty]`);c&&(c.hidden=!n||a.length>0)}function xE(e){let t=e.querySelector(`[data-chat-model-search]`);t&&(t.value=``,bE(t))}function SE(e){if(e.key!==`Escape`)return!1;let t=e.composedPath().find(e=>e instanceof HTMLInputElement&&e.matches(`[data-chat-model-search]`));return t?.value?(t.value=``,bE(t),e.preventDefault(),e.stopPropagation(),!0):!1}function CE(e){let t=e.currentTarget,n=pE(t);if(!n)return;let r=hE(n);if(r.length===0)return;if(e.key===`Enter`){let t=r.find(e=>e.hasAttribute(`data-chat-model-highlighted`));t&&(e.preventDefault(),t.click());return}if(e.key!==`ArrowDown`&&e.key!==`ArrowUp`)return;e.preventDefault();let i=r.findIndex(e=>e.hasAttribute(`data-chat-model-highlighted`)),a=e.key===`ArrowDown`?1:r.length-1,o=i<0?0:(i+a)%r.length;_E(n,r[o]),r[o]?.scrollIntoView?.({block:`nearest`})}function wE(e){let t=e.currentTarget;if(!t.open||e.target instanceof HTMLInputElement||!/^[1-9]$/u.test(e.key))return;let n=hE(t)[Number(e.key)-1];e.preventDefault(),n?.click()}function TE(e){let t=e.modelOptions.find(e=>e.isDefault),n=e.selectedModelValue===``?t:e.modelOptions.find(t=>t.value===e.selectedModelValue),r=n?.supportsTools===!1,i=e.contextWindow?.options.find(t=>t.id===e.contextWindow?.selected),a=i!==void 0&&e.contextWindow?.selected!==e.contextWindow?.defaultId,o=[e.triggerStatusLabel??e.triggerModelLabel,r?Y(`chat.modelControls.chatOnly`):``].filter(Boolean).join(` · `),s=!e.triggerLoading&&!e.triggerStatusLabel&&n&&Tr(n.provider)?na(n.provider,{className:`chat-controls__trigger-provider-icon`}):R,c=new Map;for(let t of e.modelOptions){let e=c.get(t.provider);e?e.push(t):c.set(t.provider,[t])}let l=[...c],u=l.findIndex(([e])=>e===t?.provider);if(u>0){let[e]=l.splice(u,1);e&&l.unshift(e)}let d=l.flatMap(([,e])=>e),f=new Map(d.map((e,t)=>[e.value,t])),p=e.targetGroups??[],m=p.reduce((e,t)=>e+t.options.length,0),h=e.modelOptions.length+m>0||p.some(e=>e.status!==`ready`),g=e.modelOptions.some(e=>!e.disabled),_=t=>{e.modelSelectionLocked||(e.onModelSelect(t,e.sessionKey).finally(()=>e.onRequestUpdate?.()),e.onRequestUpdate?.())},v=(t,n)=>{if(n.stopPropagation(),e.disabled||e.modelSelectionLocked||t.disabled){n.preventDefault();return}t.commitValue!==e.selectedModelValue&&_(t.commitValue);let r=n.currentTarget.closest(`details`);r&&(r.open=!1,n.detail===0&&r.querySelector(`summary`)?.focus({preventScroll:!0}))},y=(t,n,r)=>{if(r.stopPropagation(),e.disabled||e.modelSelectionLocked){r.preventDefault();return}e.onTargetSelect?.(t,n);let i=r.currentTarget.closest(`details`);i&&(i.open=!1,r.detail===0&&i.querySelector(`summary`)?.focus({preventScroll:!0}))},b=e=>{let t=pE(e);t&&_E(t,e)};return z`
|
||
<details
|
||
class="chat-controls__inline-select chat-controls__model-picker"
|
||
?open=${e.open===!0}
|
||
@keydown=${wE}
|
||
@toggle=${t=>{let n=t.currentTarget;if(e.onOpenChange?.(n.open),$C(t),rw(n),!n.open){xE(n);return}e.onOpen?.(),queueMicrotask(()=>{let e=n.querySelector(`[data-chat-model-search]`);e&&bE(e)})}}
|
||
>
|
||
<summary
|
||
class="chat-controls__inline-select-trigger chat-controls__model-trigger ${e.triggerLoading?`chat-controls__model-trigger--loading`:``} ${e.disabled?`chat-controls__inline-select-trigger--disabled`:``}"
|
||
data-chat-model-select="true"
|
||
data-chat-model-locked=${e.modelSelectionLocked?`true`:`false`}
|
||
data-chat-select-value=${e.selectedModelValue}
|
||
data-chat-model-tools=${r?`unavailable`:`available`}
|
||
aria-label=${`${Y(`chat.selectors.model`)}: ${o}`}
|
||
aria-busy=${e.triggerLoading?`true`:`false`}
|
||
aria-disabled=${e.disabled?`true`:`false`}
|
||
title=${e.disabledReason??o}
|
||
@click=${t=>{if(e.disabled){t.preventDefault();return}t.currentTarget.focus({preventScroll:!0})}}
|
||
>
|
||
${r?z`
|
||
<openclaw-tooltip .content=${Y(`chat.modelControls.chatOnlyHelp`)}>
|
||
<span class="chat-controls__model-capability-badge" aria-hidden="true">
|
||
${q.alertTriangle}
|
||
<span>${Y(`chat.modelControls.chatOnly`)}</span>
|
||
</span>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
${s}
|
||
<span class="chat-controls__inline-select-label">
|
||
${e.triggerLoading?z`<span
|
||
class="skeleton chat-controls__model-trigger-skeleton"
|
||
aria-hidden="true"
|
||
></span>`:e.triggerStatusLabel??e.triggerModelLabel}
|
||
</span>
|
||
${a?z`
|
||
<span
|
||
class="chat-controls__locked-model-badge chat-controls__model-context-badge"
|
||
data-chat-model-context-badge
|
||
>
|
||
${i.label}
|
||
</span>
|
||
`:R}
|
||
<span class="chat-controls__inline-select-chevron" aria-hidden="true"
|
||
>${q.chevronUp}</span
|
||
>
|
||
</summary>
|
||
<wa-popup data-anchored-overlay>
|
||
<div
|
||
class="chat-controls__inline-select-menu chat-controls__model-menu"
|
||
aria-label=${Y(`chat.selectors.model`)}
|
||
>
|
||
${e.modelSelectionLocked?z`
|
||
<div
|
||
class="chat-controls__locked-model"
|
||
aria-label=${Y(`chat.selectors.modelLockedLabel`)}
|
||
>
|
||
<span class="chat-controls__inline-select-section-label">
|
||
${Y(`chat.selectors.modelSection`)}
|
||
</span>
|
||
<span class="chat-controls__locked-model-value">${e.triggerModelLabel}</span>
|
||
<span class="chat-controls__locked-model-badge">
|
||
${Y(`chat.selectors.modelLocked`)}
|
||
</span>
|
||
</div>
|
||
`:z`
|
||
${e.modelOptions.length>0?z`
|
||
<div class="chat-controls__model-search-wrap">
|
||
${q.search}
|
||
<input
|
||
class="chat-controls__model-search"
|
||
data-chat-model-search="true"
|
||
type="search"
|
||
role="combobox"
|
||
aria-autocomplete="list"
|
||
autocomplete="off"
|
||
spellcheck="false"
|
||
placeholder=${Y(`chat.modelControls.searchModels`)}
|
||
aria-label=${Y(`chat.modelControls.searchModels`)}
|
||
?disabled=${e.disabled}
|
||
@input=${e=>bE(e.currentTarget)}
|
||
@keydown=${CE}
|
||
/>
|
||
</div>
|
||
`:R}
|
||
${rE(e.modelCatalogState,e.modelOptions.length>0,g,e.onModelSetup)}
|
||
${h?z`
|
||
<div
|
||
class="chat-controls__model-options"
|
||
data-chat-model-list="true"
|
||
role="listbox"
|
||
aria-label=${Y(`chat.selectors.model`)}
|
||
>
|
||
${ht(l,([e])=>e,([t,n])=>z`
|
||
<section
|
||
class="chat-controls__provider-model-group"
|
||
data-chat-model-provider-group=${t}
|
||
aria-label=${Y(`chat.modelControls.providerModels`,{provider:xo(t)})}
|
||
>
|
||
<div
|
||
class="chat-controls__provider-heading"
|
||
data-chat-model-provider=${t}
|
||
>
|
||
${cE(t)}
|
||
<span>${xo(t)}</span>
|
||
</div>
|
||
${ht(n,e=>e.value,t=>lE({disabled:e.disabled,entry:t,index:f.get(t.value)??0,selectedModelValue:e.selectedModelValue,onHighlight:b,onSelect:v,onModelSetup:e.onModelSetup}))}
|
||
</section>
|
||
`)}
|
||
${ht(p,e=>e.id,t=>z`
|
||
<section
|
||
class="chat-controls__provider-model-group"
|
||
data-chat-model-target-group=${t.id}
|
||
aria-label=${t.label}
|
||
>
|
||
<div class="chat-controls__provider-heading">
|
||
<span
|
||
class="chat-controls__provider-icon chat-controls__target-icon"
|
||
aria-hidden="true"
|
||
>${q.terminal}</span
|
||
>
|
||
<span>${t.label}</span>
|
||
</div>
|
||
${t.status===`ready`?R:rE({hasSnapshot:!1,status:t.status},!1,!1,void 0,t.errorLabel,e.onTargetRetry?{disabled:e.disabled,groupId:t.id,onRetry:e.onTargetRetry}:void 0)}
|
||
${ht(t.options,e=>e.value,(n,r)=>uE({disabled:e.disabled,entry:n,groupId:t.id,groupLabel:t.label,index:d.length+r,onHighlight:b,onSelect:y}))}
|
||
</section>
|
||
`)}
|
||
</div>
|
||
<div
|
||
class="chat-controls__model-search-empty"
|
||
data-chat-model-search-empty
|
||
hidden
|
||
>
|
||
${Y(`chat.modelControls.noMatchingModels`)}
|
||
</div>
|
||
${e.contextWindow?tE(e.contextWindow,e.sessionKey):R}
|
||
${e.sessionModelPinned&&e.modelOptions.length>0?z`<footer class="chat-controls__model-provenance">
|
||
<span>${Y(`chat.modelControls.onlyForSession`)}</span>
|
||
<button
|
||
class="chat-controls__model-reset"
|
||
data-chat-model-reset="true"
|
||
type="button"
|
||
?disabled=${e.disabled}
|
||
@click=${t=>{if(t.stopPropagation(),e.disabled){t.preventDefault();return}_(``);let n=t.currentTarget;if(!(n instanceof HTMLElement))return;let r=n.closest(`details`);r&&(r.open=!1,t.detail===0&&r.querySelector(`summary`)?.focus({preventScroll:!0}))}}
|
||
>
|
||
${Y(`chat.modelControls.useDefaultModel`,{model:e.defaultModelLabel})}
|
||
</button>
|
||
</footer>`:R}
|
||
`:R}
|
||
`}
|
||
</div>
|
||
</wa-popup>
|
||
</details>
|
||
`}function EE(){return(EE=e((()=>{B(),vt(),J(),G(),Wr(),K(),nE(),iE(),fE(),uw()})))()}function DE(e){let{gatewayUrl:t,sessionKey:n}=e,r;try{r=new URL(t)}catch{return{ok:!1,reason:`unavailable`}}if(r.hash)return{ok:!1,reason:`unavailable`};if((r.protocol===`ws:`||r.protocol===`wss:`)&&r.search)return{ok:!1,reason:`query-routed`};let i=n;if(!D(n)){let t=e.rowAgentId||e.selectedAgentId;if(!t)return{ok:!1,reason:`unavailable`};i=`agent:${t}:${n}`}try{return{ok:!0,command:`openclaw resume --handoff ${vc({sessionKey:i,gatewayUrl:t})}`,qualifiedSessionKey:i}}catch{return{ok:!1,reason:`unavailable`}}}function OE(){return(OE=e((()=>{gc(),ve()})))()}function kE(e){let t=Zo(e),n=vi(e.startedAt??e.createdAt),r=vi(e.endedAt);return{active:t,finishedDuration:!t&&r>n&&n>0?De(r-n):void 0,startedMs:n,timestamp:vi(e.updatedAt??e.createdAt),title:tr(e),toolUseCount:e.toolUseCount??0}}function AE(e,t){let n=jv[e.status];return z`
|
||
<div class="chat-tasks-rail__task-meta">
|
||
<span class="chat-tasks-rail__task-status chat-tasks-rail__task-status--${n}"
|
||
>${Av(e)}</span
|
||
>
|
||
<span class="chat-tasks-rail__task-sep" aria-hidden="true">·</span>
|
||
<span>${Qi(e)}</span>
|
||
${t.active&&t.startedMs>0?z`<span class="chat-tasks-rail__task-sep" aria-hidden="true">·</span>
|
||
<span
|
||
><openclaw-elapsed-time .startMs=${t.startedMs}></openclaw-elapsed-time
|
||
></span>`:R}
|
||
${t.finishedDuration?z`<span class="chat-tasks-rail__task-sep" aria-hidden="true">·</span>
|
||
<span>${t.finishedDuration}</span>`:R}
|
||
${!t.active&&t.timestamp>0?z`<span class="chat-tasks-rail__task-sep" aria-hidden="true">·</span>
|
||
<span title=${$e(t.timestamp)}
|
||
>${_e(t.timestamp)}</span
|
||
>`:R}
|
||
${t.toolUseCount>0?z`<span class="chat-tasks-rail__task-sep" aria-hidden="true">·</span>
|
||
<span
|
||
>${t.toolUseCount===1?Y(`chat.backgroundTasks.toolUseOne`):Y(`chat.backgroundTasks.toolUseMany`,{count:String(t.toolUseCount)})}</span
|
||
>`:R}
|
||
${t.active&&e.lastToolName?z`<span class="chat-tasks-rail__task-sep" aria-hidden="true">·</span>
|
||
<span class="chat-tasks-rail__task-tool">${e.lastToolName}</span>`:R}
|
||
</div>
|
||
`}function jE(e,t){let n=kE(e),r=ra(e),i=t.cancellingTaskIds.has(e.id),a=t.openTaskId===e.id;return z`
|
||
<div
|
||
class="chat-tasks-rail__task ${a?`chat-tasks-rail__task--open`:``}"
|
||
role="listitem"
|
||
data-task-id=${e.id}
|
||
aria-current=${a?`true`:R}
|
||
@click=${n=>{let r=n.target;r instanceof Element&&r.closest(`button, a`)||t.onOpenTaskDetail?.(e)}}
|
||
>
|
||
<div class="chat-tasks-rail__task-head">
|
||
<button
|
||
class="chat-tasks-rail__task-open"
|
||
type="button"
|
||
@click=${()=>t.onOpenTaskDetail?.(e)}
|
||
>
|
||
${e.status===`running`?z`<span class="chat-tasks-rail__task-pulse" aria-hidden="true"></span>`:R}
|
||
<openclaw-tooltip .content=${n.title}>
|
||
<span class="chat-tasks-rail__task-title">${n.title}</span>
|
||
</openclaw-tooltip>
|
||
</button>
|
||
${n.active&&t.canCancel?z`
|
||
<openclaw-tooltip
|
||
.content=${Y(`chat.backgroundTasks.stopTask`,{title:n.title})}
|
||
>
|
||
<button
|
||
class="chat-tasks-rail__task-stop"
|
||
type="button"
|
||
aria-label=${Y(`chat.backgroundTasks.stopTask`,{title:n.title})}
|
||
?disabled=${i||!t.connected}
|
||
@click=${n=>{n.stopPropagation(),t.onCancel(e.id)}}
|
||
>
|
||
${i?q.loader:q.stop}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
</div>
|
||
${AE(e,n)}
|
||
${r?z`<div class="chat-tasks-rail__task-detail">${r}</div>`:R}
|
||
</div>
|
||
`}function ME(){return(ME=e((()=>{B(),ri(),J(),G(),K(),Je(),wi(),Mv()})))()}function NE(e){if(!e)return R;let t=!e.collapsed,n=Y(t?`chat.backgroundTasks.collapse`:`chat.backgroundTasks.show`);return z`<openclaw-tooltip .content=${n}>
|
||
<button
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-tasks-toggle"
|
||
type="button"
|
||
aria-label=${n}
|
||
aria-expanded=${String(t)}
|
||
@click=${e.onToggleCollapsed}
|
||
>
|
||
${q.listChecks}
|
||
${!t&&e.activeCount>0?z`<span class="chat-tasks-toggle__badge" aria-hidden="true"
|
||
>${e.activeCount}</span
|
||
>`:R}
|
||
</button>
|
||
</openclaw-tooltip>`}function PE(e,t){return z`
|
||
<div class="chat-tasks-rail__list" role="list">
|
||
${ht(e,e=>e.id,e=>jE(e,t))}
|
||
</div>
|
||
`}function FE(e,t={}){if(!e||e.collapsed&&!t.embedded)return R;let{active:n,recent:r}=So(e.tasks??[]),i=e.tasks!==null,a=i&&n.length===0&&r.length===0,o=z`
|
||
<openclaw-tooltip .content=${Y(`chat.backgroundTasks.collapse`)}>
|
||
<button
|
||
type="button"
|
||
class="rail-header__action chat-tasks-rail__collapse-toggle"
|
||
aria-label=${Y(`chat.backgroundTasks.collapse`)}
|
||
aria-expanded="true"
|
||
@click=${e.onToggleCollapsed}
|
||
>
|
||
<span class="nav-collapse-toggle__icon" aria-hidden="true"
|
||
>${e.narrowLayout?q.panelBottomClose:q.panelRightClose}</span
|
||
>
|
||
</button>
|
||
</openclaw-tooltip>
|
||
`;return z`
|
||
<aside
|
||
id=${`${e.statusRowId}-rail`}
|
||
class="chat-tasks-rail"
|
||
aria-label=${Y(`chat.backgroundTasks.label`)}
|
||
>
|
||
${t.embedded?R:z`<div class="rail-header chat-tasks-rail__header">
|
||
<div class="rail-header__copy chat-tasks-rail__title">
|
||
<span class="rail-header__eyebrow chat-tasks-rail__eyebrow"
|
||
>${e.sessionKey}</span
|
||
>
|
||
<strong class="rail-header__title">${Y(`chat.backgroundTasks.title`)}</strong>
|
||
</div>
|
||
<div class="rail-header__actions chat-tasks-rail__actions">
|
||
<openclaw-tooltip .content=${Y(`chat.backgroundTasks.refresh`)}>
|
||
<button
|
||
class="rail-header__action chat-tasks-rail__refresh"
|
||
type="button"
|
||
aria-label=${Y(`chat.backgroundTasks.refresh`)}
|
||
?disabled=${e.loading||!e.connected}
|
||
@click=${e.onRefresh}
|
||
>
|
||
${q.refresh}
|
||
</button>
|
||
</openclaw-tooltip>
|
||
${o}
|
||
</div>
|
||
</div>`}
|
||
${e.connected?R:z`<div class="chat-tasks-rail__state">${Y(`tasksPage.disconnected`)}</div>`}
|
||
${e.error?z`<div class="chat-tasks-rail__state chat-tasks-rail__state--error">
|
||
${e.error}
|
||
</div>`:R}
|
||
${e.loading&&!i?hr(`tasks`,Y(`chat.backgroundTasks.loading`)):R}
|
||
${a?ci({icon:q.listChecks,heading:Y(`chat.sidePanel.tasks`),description:Y(`chat.sidePanel.tasksEmpty`)}):R}
|
||
<div class="chat-tasks-rail__scroll chat-tasks-rail__scroll--split" ?hidden=${a}>
|
||
${n.length>0?z`
|
||
<section class="chat-tasks-rail__section" data-tasks-section="running">
|
||
<div class="chat-tasks-rail__section-title">
|
||
${Y(`chat.backgroundTasks.running`,{count:String(n.length)})}
|
||
</div>
|
||
${PE(n,e)}
|
||
</section>
|
||
`:R}
|
||
${r.length>0?z`
|
||
<section class="chat-tasks-rail__section" data-tasks-section="finished">
|
||
<button
|
||
class="chat-tasks-rail__section-toggle"
|
||
type="button"
|
||
aria-expanded=${String(!e.finishedCollapsed)}
|
||
@click=${e.onToggleFinished}
|
||
>
|
||
<span class="chat-tasks-rail__section-title">
|
||
${Y(`chat.backgroundTasks.finished`,{count:String(r.length)})}
|
||
</span>
|
||
<span class="chat-tasks-rail__section-chevron" aria-hidden="true">
|
||
${e.finishedCollapsed?q.chevronRight:q.chevronDown}
|
||
</span>
|
||
</button>
|
||
${e.finishedCollapsed?R:PE(r,e)}
|
||
</section>
|
||
`:R}
|
||
</div>
|
||
</aside>
|
||
`}function IE(){return(IE=e((()=>{B(),vt(),J(),pr(),Mi(),G(),K(),wi(),ME()})))()}var LE,RE,$;function zE(){return(zE=e((()=>{B(),ut(),J(),gn(),$r(),Ir(),K(),Pe(),lC(),LE={},RE={"compact:open-layout":`layout`,"compact:open-panels":`panels`,"compact:open-sharing":`sharing`,"compact:open-view":`view`},$=class extends we{constructor(...e){super(...e),this.session=ir,this.worktreePath=null,this.onboarding=!1,this.preferencesBrowserOnly=!1,this.compact=!1,this.settings=LE,this.panelActions=[],this.layoutActions=[],this.statusActions=[],this.sharing=null,this.groups=[],this.ownerOptions=[],this.selfOwner=null,this.currentOwnerId=null,this.actionDisabledReasons={},this.forkDisabled=!1,this.forkFromLastCompleted=!1,this.archiveAllowed=!1,this.deleteAllowed=!1,this.onOpen=()=>{},this.onOpenCommandPalette=()=>{},this.onSettingsChange=()=>{},this.onAction=()=>{},this.compactView=`root`,this.managementActions=new Ka(this,()=>({session:this.session,selectionCount:1,compact:this.compact,disabled:!1,actionDisabledReasons:this.actionDisabledReasons,forkDisabled:this.forkDisabled,forkFromLastCompleted:this.forkFromLastCompleted,archiveAllowed:this.archiveAllowed,deleteAllowed:this.deleteAllowed,groups:this.groups,ownerOptions:this.ownerOptions,selfOwner:this.selfOwner,currentOwnerId:this.currentOwnerId,worktreePath:this.worktreePath}),e=>this.onAction(e),()=>{let e=this.querySelector(`wa-dropdown`);e&&(e.open=!1)}),this.handleSelect=e=>{let t=e.detail.item.value;if(!t)return;let n=br(t)??RE[t];if(n){e.preventDefault(),this.compactView=n,n===`root`||n===`open-in`||n===`assign-owner`||n===`icon`||n===`group`?this.managementActions.prepareCompactView(n):n===`sharing`&&!this.sharing?.openDisabledReason&&this.sharing?.onOpen(),this.updateComplete.then(()=>{this.querySelector(`wa-dropdown-item:not([disabled])`)?.focus()});return}if(t===`open-command-palette`){this.onOpenCommandPalette();return}if(t.startsWith(`status:`)){let n=this.statusActions.find(e=>e.id===t.slice(7));n&&(e.currentTarget.open=!1,n.onActivate());return}if(t.startsWith(`quick:`)){let[,e,n]=t.split(`:`),r=(e===`panels`?this.panelActions:this.layoutActions).find(e=>e.id===n);r&&r.onActivate();return}if(t.startsWith(`view:`)){if(e.preventDefault(),this.onboarding)return;let n=t.slice(5);n===`reasoning`?this.onSettingsChange({chatShowThinking:!this.settings.chatShowThinking}):n===`tool-calls`?this.onSettingsChange({chatShowToolCalls:!this.settings.chatShowToolCalls}):n===`commentary`&&this.onSettingsChange({chatPersistCommentary:this.settings.chatPersistCommentary===!1});return}if(t.startsWith(`visibility:`)||t.startsWith(`member:`)){this.sharing&&aC(this.sharing,t);return}this.managementActions.handleSelect(t)||t===`continue-in-terminal`&&!this.actionDisabled(t)&&(e.currentTarget.open=!1,this.onAction({kind:t}))},this.handleShow=()=>{this.compactView=`root`,this.onOpen()},this.handleAfterHide=()=>{this.compactView=`root`}}actionDisabled(e,t=!1){return t||!!this.actionDisabledReasons[e]}actionTitle(e){return this.actionDisabledReasons[e]??R}renderQuickActionItems(e,t,n=!1){return t.map(t=>{let r=typeof t.badge==`number`&&t.badge>0?z`<span slot="details" class="session-menu__sub">${t.badge}</span>`:R;return z`
|
||
<wa-dropdown-item
|
||
slot=${n?R:`submenu`}
|
||
class="session-menu__item"
|
||
value=${`quick:${e}:${t.id}`}
|
||
type=${t.active===void 0?R:`checkbox`}
|
||
.checked=${t.active??!1}
|
||
>
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${t.icon}</span>
|
||
<span class="session-menu__text">${t.label}</span>
|
||
${r}
|
||
</wa-dropdown-item>
|
||
`})}renderCompactNavigationItem(e,t,n,r=!1){return z`
|
||
<wa-dropdown-item
|
||
class="session-menu__item"
|
||
value=${`compact:open-${e}`}
|
||
?disabled=${r}
|
||
>
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${n}</span>
|
||
<span class="session-menu__text">${t}</span>
|
||
<span slot="details" class="session-menu__icon session-menu__chevron" aria-hidden="true"
|
||
>${q.chevronRight}</span
|
||
>
|
||
</wa-dropdown-item>
|
||
`}renderQuickActions(e,t){if(t.length===0)return R;let n=Y(e===`panels`?`chat.sessionHeader.panels`:`chat.sessionHeader.layout`),r=e===`panels`?q.panelRightOpen:q.columns2;return this.compact?this.renderCompactNavigationItem(e,n,r):z`
|
||
<wa-dropdown-item class="session-menu__item">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${r}</span>
|
||
<span class="session-menu__text">${n}</span>
|
||
${this.renderQuickActionItems(e,t)}
|
||
</wa-dropdown-item>
|
||
`}renderViewSubmenu(e=!1){let t=!this.onboarding&&this.settings.chatShowThinking,n=this.onboarding?!0:this.settings.chatShowToolCalls,r=this.settings.chatPersistCommentary!==!1,i=this.onboarding?Y(`chat.onboardingDisabled`):R,a=(t,n,r)=>z`
|
||
<wa-dropdown-item
|
||
slot=${e?R:`submenu`}
|
||
class="session-menu__item"
|
||
type="checkbox"
|
||
value=${`view:${t}`}
|
||
.checked=${r}
|
||
?disabled=${this.onboarding}
|
||
title=${i}
|
||
>
|
||
<span class="session-menu__text">${n}</span>
|
||
</wa-dropdown-item>
|
||
`;return z`
|
||
${a(`reasoning`,Y(`chat.view.reasoning`),t)}
|
||
${a(`tool-calls`,Y(`chat.view.toolCalls`),n)}
|
||
${a(`commentary`,Y(`chat.view.commentary`),r)}
|
||
${this.preferencesBrowserOnly?z`<div slot=${e?R:`submenu`} class="session-menu__info" role="note">
|
||
${Y(`quickSettings.personal.browserOnly`)}
|
||
</div>`:R}
|
||
`}renderCompactView(){if(this.compactView===`root`||this.compactView===`open-in`||this.compactView===`assign-owner`||this.compactView===`icon`||this.compactView===`group`)return this.managementActions.renderCompactView(this.compactView);let e=z`${this.compactView===`panels`?this.renderQuickActionItems(`panels`,this.panelActions,!0):this.compactView===`layout`?this.renderQuickActionItems(`layout`,this.layoutActions,!0):this.compactView===`sharing`&&this.sharing?sC(this.sharing,!0):this.renderViewSubmenu(!0)}`;return Jr(e)}renderRootView(){return z`
|
||
${this.compact?z`<wa-dropdown-item class="session-menu__item" value="open-command-palette">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.search}</span>
|
||
<span class="session-menu__text">${Y(`chat.openCommandPalette`)}</span>
|
||
</wa-dropdown-item>
|
||
<div class="session-menu__separator" role="separator"></div>`:R}
|
||
${this.compact&&this.statusActions.length>0?z`${this.statusActions.map(e=>z`<wa-dropdown-item
|
||
class="session-menu__item chat-header-session-menu__status-item"
|
||
value=${`status:${e.id}`}
|
||
>
|
||
<span
|
||
slot="icon"
|
||
class="session-menu__icon chat-header-session-menu__status-icon"
|
||
data-tone=${e.tone}
|
||
aria-hidden="true"
|
||
>${e.icon}</span
|
||
>
|
||
<span class="session-menu__text">${e.label}</span>
|
||
</wa-dropdown-item>`)}
|
||
<div class="session-menu__separator" role="separator"></div>`:R}
|
||
${this.worktreePath?z`
|
||
${this.managementActions.renderOpenInEntry(this.worktreePath)}
|
||
<div class="session-menu__separator" role="separator"></div>
|
||
`:R}
|
||
${this.renderQuickActions(`panels`,this.panelActions)}
|
||
${this.renderQuickActions(`layout`,this.layoutActions)}
|
||
${this.compact&&this.sharing?.session&&oC(this.sharing.session)?this.renderCompactNavigationItem(`sharing`,Y(`chat.sessionSharing.menu`),q.users,!!this.sharing.openDisabledReason):R}
|
||
${this.compact?this.renderCompactNavigationItem(`view`,Y(`chat.view.menu`),q.eye):z`<wa-dropdown-item class="session-menu__item">
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.eye}</span>
|
||
<span class="session-menu__text">${Y(`chat.view.menu`)}</span>
|
||
${this.renderViewSubmenu()}
|
||
</wa-dropdown-item>`}
|
||
<div class="session-menu__separator" role="separator"></div>
|
||
${this.managementActions.renderPrimaryActions()} ${this.managementActions.renderGroupAction()}
|
||
<wa-dropdown-item
|
||
class="session-menu__item"
|
||
value="continue-in-terminal"
|
||
?disabled=${this.actionDisabled(`continue-in-terminal`)}
|
||
title=${this.actionTitle(`continue-in-terminal`)}
|
||
>
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.terminal}</span>
|
||
<span class="session-menu__text">${Y(`chat.sessionHeader.continueInTerminal.action`)}</span>
|
||
</wa-dropdown-item>
|
||
<div class="session-menu__separator" role="separator"></div>
|
||
${this.managementActions.renderLifecycleActions()}
|
||
`}render(){let e=Y(`chat.sidebar.sessionMenu`,{session:this.session.label}),t=this.statusActions.find(e=>e.tone===`danger`)?.tone??this.statusActions.find(e=>e.tone===`warn`)?.tone??this.statusActions[0]?.tone;return z`
|
||
<wa-dropdown
|
||
class=${`session-menu chat-header-session-menu${this.compact?` chat-header-session-menu--compact`:``}${this.compact&&this.compactView===`sharing`?` chat-header-session-menu--compact-sharing`:``}`}
|
||
placement="bottom-end"
|
||
aria-label=${e}
|
||
@keydown=${e=>{this.managementActions.handleKeydown(e)||ln(this,e)}}
|
||
@wa-show=${this.handleShow}
|
||
@wa-after-hide=${this.handleAfterHide}
|
||
@wa-select=${this.handleSelect}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-header-session-menu__trigger"
|
||
type="button"
|
||
aria-label=${e}
|
||
aria-haspopup="menu"
|
||
>
|
||
${q.moreHorizontal}
|
||
${this.compact&&t?z`<span
|
||
class="chat-header-session-menu__status-dot"
|
||
data-tone=${t}
|
||
aria-hidden="true"
|
||
></span>`:R}
|
||
</button>
|
||
${this.compact&&this.compactView!==`root`?this.renderCompactView():this.renderRootView()}
|
||
</wa-dropdown>
|
||
`}},h([H({attribute:!1})],$.prototype,`session`,void 0),h([H({attribute:!1})],$.prototype,`worktreePath`,void 0),h([H({attribute:!1})],$.prototype,`onboarding`,void 0),h([H({attribute:!1})],$.prototype,`preferencesBrowserOnly`,void 0),h([H({attribute:!1})],$.prototype,`compact`,void 0),h([H({attribute:!1})],$.prototype,`settings`,void 0),h([H({attribute:!1})],$.prototype,`panelActions`,void 0),h([H({attribute:!1})],$.prototype,`layoutActions`,void 0),h([H({attribute:!1})],$.prototype,`statusActions`,void 0),h([H({attribute:!1})],$.prototype,`sharing`,void 0),h([H({attribute:!1})],$.prototype,`groups`,void 0),h([H({attribute:!1})],$.prototype,`ownerOptions`,void 0),h([H({attribute:!1})],$.prototype,`selfOwner`,void 0),h([H({attribute:!1})],$.prototype,`currentOwnerId`,void 0),h([H({attribute:!1})],$.prototype,`actionDisabledReasons`,void 0),h([H({attribute:!1})],$.prototype,`forkDisabled`,void 0),h([H({attribute:!1})],$.prototype,`forkFromLastCompleted`,void 0),h([H({attribute:!1})],$.prototype,`archiveAllowed`,void 0),h([H({attribute:!1})],$.prototype,`deleteAllowed`,void 0),h([H({attribute:!1})],$.prototype,`onOpen`,void 0),h([H({attribute:!1})],$.prototype,`onOpenCommandPalette`,void 0),h([H({attribute:!1})],$.prototype,`onSettingsChange`,void 0),h([H({attribute:!1})],$.prototype,`onAction`,void 0),h([W()],$.prototype,`compactView`,void 0),customElements.get(`openclaw-chat-header-session-menu`)||customElements.define(`openclaw-chat-header-session-menu`,$)})))()}function BE(e){let t=e.session?.placement,n=t?.state;if(!zn(n))return R;let r=e.session?.placementMove,i=t&&t.state!==`local`&&t.state!==`requested`?t:void 0,a=i?.providerId,o=i?.profileId,s=i?.environmentId,c=!!(a||o||s),l=t?.state===`active`?t.runner:void 0,u=l?.kind===`device`&&l.status===`offline`,d=r?.target.kind===`gateway`?Y(`sessionsView.moveSessionGatewayTarget`):r?.target.kind===`profile`?r.target.profileId:r?.target.kind===`device`?r.target.deviceId:void 0,f=r?.error?Y(`sessionsView.moveSessionFailed`):r&&d?Y(`sessionsView.movingSession`,{target:d}):e.placementMoving?Y(`sessionsView.movingSessionGeneric`):u?Y(`sessionsView.deviceOffline`):l?.kind===`device`?Y(`sessionsView.runsOnDevice`):a&&o?`${a} · ${o}`:Y(`newSession.runsOn`,{place:Y(`newSession.cloud`)}),p=e.placementMoveDisabledReason,m=e.placementReclaimDisabledReason,h=_e(t?.stateChangedAtMs,{fallback:``}),g=r?.error?r.error:n===`active`||c?R:`${n}${h?` · ${h}`:``}`;return z`
|
||
<div class="chat-pane__placement-control">
|
||
<wa-dropdown class="chat-pane__placement-menu" placement="bottom-start">
|
||
<button slot="trigger" class="chat-pane__placement-chip" type="button">${f}</button>
|
||
${g===R?R:z`<div class="chat-pane__placement-state">${g}</div>`}
|
||
${c?z`<dl class="chat-pane__placement-facts">
|
||
${a?z`<dt>${Y(`sessionsView.placementFactService`)}</dt>
|
||
<dd>${a}</dd>`:R}
|
||
${o?z`<dt>${Y(`sessionsView.placementFactProfile`)}</dt>
|
||
<dd>${o}</dd>`:R}
|
||
${s?z`<dt>${Y(`sessionsView.placementFactMachine`)}</dt>
|
||
<dd>…${s.slice(-6)}</dd>`:R}
|
||
<dt>${Y(`sessionsView.placementFactState`)}</dt>
|
||
<dd>${n}${h?` · ${h}`:``}</dd>
|
||
${t?.state===`active`&&t.diskSpace?z`<dt>${Y(`sessionsView.placementFactDisk`)}</dt>
|
||
<dd>
|
||
${Y(`sessionsView.placementDiskFree`,{free:re(t.diskSpace.availableBytes)})}
|
||
</dd>`:R}
|
||
</dl>`:R}
|
||
<wa-dropdown-item
|
||
class="session-menu__item chat-pane__placement-move ${u?`session-menu__item--destructive`:``}"
|
||
variant=${u?`danger`:R}
|
||
?disabled=${!!p}
|
||
title=${p??R}
|
||
@click=${()=>!p&&e.onPlacementMove?.()}
|
||
>
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.monitor}</span>
|
||
<span class="session-menu__text"
|
||
>${Y(u?`sessionsView.continueOnGatewayMenu`:`sessionsView.moveSession`)}</span
|
||
>
|
||
</wa-dropdown-item>
|
||
<wa-dropdown-item
|
||
class="session-menu__item session-menu__item--destructive chat-pane__placement-reclaim"
|
||
variant="danger"
|
||
?disabled=${!!m}
|
||
title=${m??R}
|
||
@click=${()=>!m&&e.onPlacementReclaim?.()}
|
||
>
|
||
<span slot="icon" class="session-menu__icon" aria-hidden="true">${q.stop}</span>
|
||
<span class="session-menu__text"
|
||
>${l?.kind===`device`?Y(`sessionsView.stopDeviceWorker`):Y(`sessionsView.stopCloudWorker`)}</span
|
||
>
|
||
</wa-dropdown-item>
|
||
</wa-dropdown>
|
||
${u?z`<div class="chat-pane__placement-note" role="status">
|
||
${Y(`sessionsView.waitingForDevice`)}
|
||
</div>`:R}
|
||
</div>
|
||
`}function VE(){return(VE=e((()=>{B(),J(),Mr(),K(),co(),Ve(),Je(),Do()})))()}function HE(e){return Y(e===`darwin`?`chat.sessionHeader.revealFinder`:e===`win32`?`chat.sessionHeader.revealFileExplorer`:`chat.sessionHeader.revealFileManager`)}function UE(e){let t=e.replace(/[\\/]+$/,``);return t.split(/[\\/]/).pop()||t}function WE(e){let t=e?Date.parse(e):NaN;return Number.isFinite(t)?_e(t,{fallback:``}):``}function GE(e){let t=e.session;if(!t)return{root:null,label:null};let n=t.execNode?t.execCwd?.trim()||null:t.spawnedWorkspaceDir?.trim()||t.spawnedCwd?.trim()||e.worktreePath?.trim()||(t.worktree?``:e.agentWorkspace?.trim())||null;return{root:n,label:t.worktree?.repoRoot?UE(t.worktree.repoRoot):n?UE(n):null}}function KE(e,t){let n=le(e);if(!n||e&&Ne(n,e.key))return null;let r=t.find(e=>Ne(e.key,n));return r?{key:r.key,title:de(r.key,r)}:null}function qE(e,t,n,r){let i=XE(e,t,n,r),a=JE(e);return z`
|
||
<div class="chat-pane__crumbs">
|
||
${i?z`<div class="chat-pane__project-row">${i}</div>`:R}
|
||
<div class="chat-pane__session-trail">
|
||
${i?z`<span class="chat-pane__crumb-sep" aria-hidden="true">/</span>`:R}
|
||
${a?z`${a}<span class="chat-pane__crumb-sep" aria-hidden="true">/</span>`:R}
|
||
${YE(e)}
|
||
</div>
|
||
</div>
|
||
`}function JE(e){let t=e.parentSession;if(!t)return null;let n=Y(`chat.sessionHeader.openParent`,{title:t.title});return z`<button
|
||
class="chat-pane__parent-session"
|
||
type="button"
|
||
title=${n}
|
||
aria-label=${n}
|
||
@click=${()=>e.onOpenParentSession(t.key)}
|
||
>
|
||
<span class="chat-pane__parent-session-text">${t.title}</span>
|
||
</button>`}function YE(e){return e.editing?z`<input
|
||
class="chat-pane__session-title-input"
|
||
.value=${e.renameValue}
|
||
aria-label=${Y(`chat.sessionHeader.renameInputAria`)}
|
||
placeholder=${Y(`chat.sessionHeader.renameInputPlaceholder`)}
|
||
@input=${t=>e.onRenameInput(t.currentTarget.value)}
|
||
@keydown=${t=>{t.key===`Enter`?(t.preventDefault(),e.onCommitRename()):t.key===`Escape`&&(t.preventDefault(),e.onCancelRename())}}
|
||
@blur=${e.onCommitRename}
|
||
/>`:e.catalog||!e.session||e.renameDisabledReason?z`<span class="chat-pane__session-title" title=${e.renameDisabledReason??e.title}
|
||
>${di(e.catalog?e.catalogColor:e.session?.color)}<span
|
||
class="chat-pane__session-title-text"
|
||
>${e.title}</span
|
||
></span
|
||
>`:z`<button
|
||
class="chat-pane__session-title chat-pane__session-title-button"
|
||
type="button"
|
||
title=${Y(`chat.sessionHeader.renameTooltip`)}
|
||
aria-label=${Y(`chat.sessionHeader.renameAria`,{title:e.title})}
|
||
@click=${e.onBeginRename}
|
||
>
|
||
${di(e.catalog?e.catalogColor:e.session?.color)}<span
|
||
class="chat-pane__session-title-text"
|
||
>${e.title}</span
|
||
>
|
||
</button>`}function XE(e,t,n,r){return e.catalog||!e.workspaceLabel?null:z`
|
||
<wa-dropdown
|
||
class="chat-pane__workspace-menu"
|
||
placement="bottom-start"
|
||
@wa-select=${t=>{let n=t.detail.item.value;(n===`reveal`||n===`copy-path`||n===`copy-branch`)&&e.onMenuAction(n)}}
|
||
@wa-show=${()=>e.onMenuOpenChange(!0)}
|
||
@wa-hide=${()=>e.onMenuOpenChange(!1)}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
class=${`chat-pane__workspace-chip${!t&&!e.workspaceIcon?` chat-pane__workspace-chip--fallback-icon`:``}`}
|
||
type="button"
|
||
title=${e.workspaceRoot??e.workspaceLabel}
|
||
aria-label=${Y(`chat.sessionHeader.workspaceAria`,{workspace:e.workspaceLabel})}
|
||
>
|
||
${t?q.check:ZE(e.workspaceIcon)}<span
|
||
>${t?Y(`chat.sessionHeader.copied`):e.workspaceLabel}</span
|
||
>
|
||
</button>
|
||
${e.canReveal&&e.workspaceRoot?z`<wa-dropdown-item value="reveal">${HE(e.platform)}</wa-dropdown-item>`:R}
|
||
${e.workspaceRoot?z`<wa-dropdown-item value="copy-path">${n}</wa-dropdown-item>`:R}
|
||
${e.branch?z`<wa-dropdown-item value="copy-branch">${r}</wa-dropdown-item>`:R}
|
||
</wa-dropdown>
|
||
`}function ZE(e){return e?z`<openclaw-workspace-icon
|
||
.routeUrl=${e.routeUrl}
|
||
.authTokens=${e.authTokens}
|
||
.authReady=${e.authReady}
|
||
></openclaw-workspace-icon>`:q.folder}function QE(e){return!!(e.workspaceRoot&&e.methodAdvertised&&e.hasAdminAccess&&!e.session?.execNode&&!zn(e.session?.placement?.state))}function $E(e){return e.health===`ok`?Y(`chat.sessionHeader.gatewayPicker.connected`):e.health===`error`?Y(`chat.sessionHeader.gatewayPicker.unreachable`):Y(`chat.sessionHeader.gatewayPicker.unknown`)}function eD(e){let t=e.nativeGateways,n=e.gatewaysSnapshot;if(!t||!n||n.gateways.length<=1||e.onboarding||!qt())return R;let r=n.gateways.find(e=>e.id===n.currentId);if(!r)return R;let i=r.isPrimary||!r.canPromote;return z`
|
||
<wa-dropdown class="chat-pane__gateway-menu" placement="bottom-start">
|
||
<button
|
||
slot="trigger"
|
||
class="chat-pane__gateway-chip"
|
||
type="button"
|
||
aria-label=${Y(`chat.sessionHeader.gatewayPicker.menuLabel`,{gateway:r.name})}
|
||
>
|
||
<span class="chat-pane__gateway-health" data-health=${r.health}></span>
|
||
<span class="chat-pane__gateway-name">${r.name}</span>
|
||
<span class="chat-pane__gateway-chevron">${q.chevronUp}</span>
|
||
</button>
|
||
${n.gateways.map(e=>{let r=e.id===n.currentId;return z`<wa-dropdown-item
|
||
class="chat-pane__gateway-menu-item chat-pane__gateway-item"
|
||
role="menuitemradio"
|
||
aria-checked=${String(r)}
|
||
${U(e=>_n(e,r))}
|
||
@click=${n=>{n.altKey?t.openWindow(e.id):r||t.select(e.id)}}
|
||
>
|
||
<span
|
||
slot="icon"
|
||
class="chat-pane__gateway-health"
|
||
data-health=${e.health}
|
||
role="img"
|
||
aria-label=${$E(e)}
|
||
></span>
|
||
<span>${e.name}</span>
|
||
<span slot="details" class="chat-pane__gateway-details">
|
||
${e.isPrimary?z`<span class="chat-pane__gateway-primary"
|
||
>${Y(`chat.sessionHeader.gatewayPicker.primaryTag`)}</span
|
||
>`:R}
|
||
${r?z`<span class="chat-pane__gateway-check">${q.check}</span>`:R}
|
||
</span>
|
||
</wa-dropdown-item>`})}
|
||
<div class="chat-pane__gateway-divider" role="separator"></div>
|
||
<wa-dropdown-item
|
||
class="chat-pane__gateway-menu-item"
|
||
?disabled=${i}
|
||
@click=${()=>!i&&t.setPrimary(r.id)}
|
||
>${Y(`chat.sessionHeader.gatewayPicker.setPrimary`)}</wa-dropdown-item
|
||
>
|
||
<wa-dropdown-item
|
||
class="chat-pane__gateway-menu-item"
|
||
@click=${()=>t.openSettings()}
|
||
>${Y(`chat.sessionHeader.gatewayPicker.openSettings`)}</wa-dropdown-item
|
||
>
|
||
</wa-dropdown>
|
||
`}function tD(e){let t=e.copiedAction===`copy-path`?Y(`chat.sessionHeader.copied`):Y(`chat.sessionHeader.copyPath`),n=e.copiedAction===`copy-branch`?Y(`chat.sessionHeader.copied`):Y(`chat.sessionHeader.copyBranch`),r=e.copiedAction===`copy-path`||e.copiedAction===`copy-branch`,i=e.navDrawerOpen?Y(`nav.collapse`):Y(`nav.expand`),a=e.narrow&&e.sessionMenuAction!==R;return z`
|
||
<div class="chat-pane__header" @mousedown=${Et}>
|
||
${e.mergedChrome?z`<openclaw-tooltip .content=${i}>
|
||
<button
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-pane__nav-toggle"
|
||
type="button"
|
||
aria-label=${i}
|
||
aria-expanded=${String(!!e.navDrawerOpen)}
|
||
@click=${e=>{window.dispatchEvent(new CustomEvent(wn,{detail:{trigger:e.currentTarget}}))}}
|
||
>
|
||
${q.menu}
|
||
</button>
|
||
</openclaw-tooltip>`:R}
|
||
${e.session?.incognito?z`<span
|
||
class="chat-pane__incognito"
|
||
role="img"
|
||
aria-label=${Y(`chat.sessionHeader.incognito`)}
|
||
title=${Y(`chat.sessionHeader.incognito`)}
|
||
>${q.lock}</span
|
||
>`:R}
|
||
${qE(e,r,t,n)}
|
||
${Br(sr(e.showOwnerChip?e.session?.owner?.actor:void 0,`header`,e.session?.owner?.assignedAt===void 0?`created`:`owned`,e.ownerViewing),e.showOwnerChip?Ui(e.session?.owner?.actor.identity?.type===`profile`?e.session.owner.actor.identity.id:void 0,e.personActivity):null)}
|
||
${e.showOwnerChip&&e.session?.participants?.length?z`<openclaw-viewer-facepile
|
||
class="chat-pane__participants"
|
||
.staticParticipants=${e.session.participants}
|
||
.totalCount=${e.session.participantCount}
|
||
.maxVisible=${4}
|
||
.personActivity=${e.personActivity}
|
||
variant="session"
|
||
></openclaw-viewer-facepile>`:R}
|
||
${BE(e)} ${e.presence??R} ${e.faceControl??R}
|
||
${e.sharingControl??R}
|
||
${!e.catalog&&e.branches.length>1?z`
|
||
<openclaw-tooltip
|
||
.content=${e.branchSwitchDisabledReason??Y(`chat.sessionHeader.branches`)}
|
||
>
|
||
<wa-dropdown
|
||
class="chat-pane__branches-menu"
|
||
placement="bottom-end"
|
||
@wa-select=${t=>{let n=t.detail.item.value,r=e.branches.find(e=>e.leafEntryId===n);n&&r&&!r.active&&!e.branchSwitchDisabledReason&&e.onBranchSelect(n)}}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-pane__branches-trigger"
|
||
type="button"
|
||
?disabled=${!!e.branchSwitchDisabledReason}
|
||
aria-label=${Y(`chat.sessionHeader.branches`)}
|
||
>
|
||
${q.gitBranch}
|
||
</button>
|
||
${e.branches.map(t=>{let n=WE(t.updatedAt);return z`
|
||
<wa-dropdown-item
|
||
class="chat-pane__branch-item"
|
||
value=${t.leafEntryId}
|
||
?disabled=${t.active||!!e.branchSwitchDisabledReason}
|
||
data-active=${t.active?`true`:`false`}
|
||
>
|
||
<span class="chat-pane__branch-copy">
|
||
<span class="chat-pane__branch-headline"
|
||
>${t.headline||Y(`chat.sessionHeader.untitledBranch`)}</span
|
||
>
|
||
<span class="chat-pane__branch-meta"
|
||
>${Y(t.messageCount===1?`chat.sessionHeader.oneMessage`:`chat.sessionHeader.messages`,{count:String(t.messageCount)})}${n?` · ${n}`:``}</span
|
||
>
|
||
</span>
|
||
${t.active?z`<span
|
||
class="chat-pane__branch-active"
|
||
aria-label=${Y(`chat.sessionHeader.activeBranch`)}
|
||
>${q.check}</span
|
||
>`:R}
|
||
</wa-dropdown-item>
|
||
`})}
|
||
</wa-dropdown>
|
||
</openclaw-tooltip>
|
||
`:R}
|
||
${eD(e)}
|
||
<div class="chat-pane__actions">
|
||
${a?R:e.panelActions}
|
||
${a?R:e.discussionAction}
|
||
${e.catalog||a?R:z`${e.diffAction} ${e.backgroundTasksAction} ${e.workspaceAction}
|
||
${e.sessionRailAction}`}
|
||
${e.onOpenSplitView&&!a?z`<openclaw-tooltip .content=${Y(`chat.splitView.open`)}>
|
||
<button
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-open-split-view"
|
||
type="button"
|
||
aria-label=${Y(`chat.splitView.open`)}
|
||
@click=${e.onOpenSplitView}
|
||
>
|
||
${q.columns2}
|
||
</button>
|
||
</openclaw-tooltip>`:R}
|
||
${!e.narrow&&e.onSplitDown?z`<openclaw-tooltip .content=${Y(`chat.splitView.splitDown`)}>
|
||
<button
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-pane__split-down"
|
||
type="button"
|
||
aria-label=${Y(`chat.splitView.splitDown`)}
|
||
@click=${()=>e.onSplitDown?.(e.paneId)}
|
||
>
|
||
${q.panelBottomOpen}
|
||
</button>
|
||
</openclaw-tooltip>`:R}
|
||
${!e.narrow&&e.onSplitRight?z`<openclaw-tooltip .content=${Y(`chat.splitView.splitRight`)}>
|
||
<button
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-pane__split-right"
|
||
type="button"
|
||
aria-label=${Y(`chat.splitView.splitRight`)}
|
||
@click=${()=>e.onSplitRight?.(e.paneId)}
|
||
>
|
||
${q.panelRightOpen}
|
||
</button>
|
||
</openclaw-tooltip>`:R}
|
||
${e.onClosePane?z`<openclaw-tooltip .content=${Y(`chat.splitView.closePane`)}>
|
||
<button
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-pane__close-pane"
|
||
type="button"
|
||
aria-label=${Y(`chat.splitView.closePane`)}
|
||
@click=${()=>e.onClosePane?.(e.paneId)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
</openclaw-tooltip>`:R}
|
||
${e.mergedChrome&&!a?z`<openclaw-tooltip .content=${Y(`chat.openCommandPalette`)}>
|
||
<button
|
||
class="btn btn--ghost btn--icon chat-icon-btn chat-pane__palette-open"
|
||
type="button"
|
||
aria-label=${Y(`chat.openCommandPalette`)}
|
||
@click=${()=>window.dispatchEvent(new Event(kn))}
|
||
>
|
||
${q.search}
|
||
</button>
|
||
</openclaw-tooltip>`:R}
|
||
${e.sessionMenuAction}
|
||
</div>
|
||
</div>
|
||
`}function nD(){return(nD=e((()=>{B(),V(),Wt(),tn(),An(),J(),Ii(),ai(),Si(),Mr(),mn(),G(),jo(),K(),Je(),Qe(),ve(),VE()})))()}function rD(e){let t=Y(`chat.sessionHeader.continueInTerminal.title`),n=Y(`chat.sessionHeader.continueInTerminal.description`);return z`
|
||
<openclaw-modal-dialog
|
||
class="continue-in-terminal-dialog"
|
||
label=${t}
|
||
description=${n}
|
||
@modal-cancel=${e.onClose}
|
||
>
|
||
<section class="exec-approval-card continue-in-terminal-dialog__card">
|
||
<header class="continue-in-terminal-dialog__header">
|
||
<h2>${t}</h2>
|
||
<p>${n}</p>
|
||
</header>
|
||
${xn(e.command)}
|
||
<p class="continue-in-terminal-dialog__note">
|
||
${Y(`chat.sessionHeader.continueInTerminal.authNote`)}
|
||
</p>
|
||
<footer class="exec-approval-actions">
|
||
<button type="button" class="btn primary" @click=${e.onClose}>
|
||
${Y(`common.close`)}
|
||
</button>
|
||
</footer>
|
||
</section>
|
||
</openclaw-modal-dialog>
|
||
`}function iD(){return(iD=e((()=>{B(),fn(),hn(),K()})))()}function aD(e){return z`
|
||
<button
|
||
class="btn btn--ghost btn--icon session-suggestion__action"
|
||
type="button"
|
||
?disabled=${e.busy}
|
||
aria-label=${e.label}
|
||
title=${e.label}
|
||
@click=${e.onClick}
|
||
>
|
||
${e.icon}
|
||
</button>
|
||
`}function oD(e){if(e.suggestions.length===0)return R;let t=e.canResolve&&(e.role===`owner`||e.role===`admin`);return z`
|
||
<div class="session-suggestions" aria-live="polite">
|
||
${e.suggestions.map(n=>{let r=e.busyIds.has(n.id),i=n.author.label??n.author.id;return z`
|
||
<article class="session-suggestion" data-suggestion-id=${n.id}>
|
||
<span class="session-suggestion__author">${i}</span>
|
||
<span class="session-suggestion__text">${n.text}</span>
|
||
${t&&n.state===`pending`?z`
|
||
<div class="session-suggestion__actions">
|
||
${e.archived?R:z`
|
||
${aD({icon:q.arrowUp,label:Y(`chat.sessionSuggestions.sendNow`,{author:i}),busy:r,onClick:()=>e.onResolve(n,`send`)})}
|
||
${aD({icon:q.check,label:Y(`chat.sessionSuggestions.queue`,{author:i}),busy:r,onClick:()=>e.onResolve(n,`queue`)})}
|
||
${aD({icon:q.edit,label:Y(`chat.sessionSuggestions.edit`,{author:i}),busy:r,onClick:()=>e.onResolve(n,`edit`)})}
|
||
`}
|
||
${aD({icon:q.trash,label:Y(`chat.sessionSuggestions.dismiss`,{author:i}),busy:r,onClick:()=>e.onResolve(n,`dismiss`)})}
|
||
</div>
|
||
`:z`<span class="session-suggestion__state"
|
||
>${Y(`chat.sessionSuggestions.state.${n.state}`)}</span
|
||
>`}
|
||
</article>
|
||
`})}
|
||
</div>
|
||
`}function sD(){return(sD=e((()=>{B(),J(),K()})))()}function cD(e){return e.status===`queued`?`queued`:ce(e)?`running`:e.status===`done`?`done`:e.status===`failed`||e.status===`killed`||e.status===`timeout`?`failed`:e.subagentRunState===`active`?`queued`:null}function lD(e){return e.split(`:`).findLast(Boolean)??e}function uD(e){let t=e.swarmPhaseRank;return typeof t==`number`&&Number.isFinite(t)?t:2**53-1}function dD(e){let t=e.swarmPhase;return typeof t==`string`&&t.trim()?t.trim():void 0}function fD(e,t){if(e.parentSessionKey&&Ne(e.parentSessionKey,t)||e.spawnedBy&&Ne(e.spawnedBy,t))return!0;let n=e.swarmGroupId?.split(`:`).slice(1,-1).join(`:`);return!!(n&&Ne(n,t))}function pD(e,t){if(t===`queued`)return`—`;let n=e.runtimeMs;if(n!=null&&t===`running`&&e.runtimeSampledAt!=null)n+=Math.max(0,Date.now()-e.runtimeSampledAt);else if(n==null&&e.startedAt!=null){let r=e.endedAt??(t===`running`?Date.now():void 0);r!=null&&(n=Math.max(0,r-e.startedAt))}return De(n)??`—`}function mD(e,t){let n=new Map;for(let r of e){let e=r.swarmGroupId?.trim();if(!e||!fD(r,t))continue;let i=cD(r);if(!i)continue;let a=n.get(e)??[];a.push({phase:dD(r),phaseRank:uD(r),dot:{key:r.key,label:r.label?.trim()||r.displayName?.trim()||r.derivedTitle?.trim()||r.key,status:i,duration:pD(r,i)}}),n.set(e,a)}return[...n.entries()].map(([e,t])=>{let n=new Map;for(let e of t){let t=n.get(e.phase)??{rank:e.phaseRank,dots:[]};t.rank=Math.min(t.rank,e.phaseRank),t.dots.push(e.dot),n.set(e.phase,t)}return{groupId:e,label:lD(e),phases:[...n.entries()].toSorted((e,t)=>e[1].rank-t[1].rank).map(([e,t])=>({title:e,dots:t.dots.length>_D?t.dots.toSorted((e,t)=>gD[e.status]-gD[t.status]):t.dots}))}}).filter(e=>e.phases.some(e=>e.dots.some(e=>e.status===`queued`||e.status===`running`))).toSorted((e,t)=>e.groupId.localeCompare(t.groupId))}function hD({sessions:e,sessionKey:t}){let n=mD(e,t);return n.length===0?R:z`
|
||
<aside
|
||
class="chat-swarm"
|
||
data-test-id="chat-swarm"
|
||
role="status"
|
||
aria-live="off"
|
||
aria-label=${Y(`labsPage.swarm.title`)}
|
||
>
|
||
${n.map(e=>{let t=e.phases.flatMap(e=>e.dots),n=e.phases.flatMap(e=>e.dots.slice(0,_D)),r=t.filter(e=>e.status===`done`||e.status===`failed`).length,i=t.some(e=>e.status===`failed`),a=null;return z`
|
||
<div
|
||
class="chat-swarm__group ${i?`chat-swarm__group--failed`:``}"
|
||
data-swarm-group=${e.groupId}
|
||
tabindex="0"
|
||
${U(e=>{a=_x(a,e)})}
|
||
>
|
||
<div class="chat-swarm__header">
|
||
<strong title=${e.groupId}>${e.label}</strong>
|
||
<span
|
||
>${Y(`labsPage.swarm.progress`,{complete:String(r),total:String(t.length)})}</span
|
||
>
|
||
</div>
|
||
<div class="chat-swarm__progress" aria-hidden="true">
|
||
${e.phases.map(e=>{let t=e.dots.length===0?0:Math.round(e.dots.filter(e=>e.status===`done`||e.status===`failed`).length/e.dots.length*100),n=e.dots.some(e=>e.status===`failed`);return z`<span class="chat-swarm__progress-segment">
|
||
<span
|
||
class=${n?`chat-swarm__progress-fill--failed`:``}
|
||
style=${`width:${t}%`}
|
||
></span>
|
||
</span>`})}
|
||
</div>
|
||
<div class="chat-swarm__tasks" role="list">
|
||
${n.map(e=>z`
|
||
<div class="chat-swarm__task" role="listitem">
|
||
<span class=${`chat-swarm__task-icon chat-swarm__task-icon--${e.status}`}>
|
||
${e.status===`done`?q.check:e.status===`failed`?q.alertTriangle:e.status===`running`?q.loader:q.clock}
|
||
</span>
|
||
<span class="chat-swarm__task-name">${e.label}</span>
|
||
<span class="chat-swarm__task-duration">${e.duration}</span>
|
||
</div>
|
||
`)}
|
||
</div>
|
||
</div>
|
||
`})}
|
||
</aside>
|
||
`}var gD,_D;function vD(){return(vD=e((()=>{B(),V(),J(),K(),Je(),ve(),Px(),gD={running:0,queued:1,failed:2,done:3},_D=256})))()}function yD(e){return SD({suggestions:e.taskSuggestions??[],busyIds:e.taskSuggestionBusyIds??new Set,cloudProfiles:e.taskSuggestionCloudProfiles??[],copiedIds:e.taskSuggestionCopiedIds??new Set,activeId:e.activeTaskSuggestionId,swapDirection:e.taskSuggestionSwapDirection,swapGeneration:e.taskSuggestionSwapGeneration??0,onCopyPrompt:t=>e.onCopyTaskSuggestionPrompt?.(t),canAccept:e.canAcceptTaskSuggestions===!0,canAcceptModes:e.canAcceptTaskSuggestionModes===!0,canDismiss:e.canDismissTaskSuggestions===!0,onAccept:(t,n,r)=>e.onAcceptTaskSuggestion?.(t,n,r),onDismiss:t=>e.onDismissTaskSuggestion?.(t),onNavigate:(t,n)=>e.onNavigateTaskSuggestion?.(t,n)})}function bD(e){return e.replace(/[\u061c\u200e\u200f\u202a-\u202e\u2066-\u2069]/g,``)}function xD(e){if(!(e instanceof HTMLElement))return;let t=e.scrollLeft+e.clientWidth<e.scrollWidth-1;e.toggleAttribute(`data-overflow-right`,t)}function SD(e){if(e.suggestions.length===0)return R;let t=e.suggestions.length>1,n=e.suggestions.some(t=>t.id===e.activeId)?e.activeId:e.suggestions[0]?.id;return z`
|
||
<div class="task-suggestions ${t?`task-suggestions--stack`:``}" aria-live="polite">
|
||
${e.suggestions.map((r,i)=>{let a=e.busyIds.has(r.id),o=bD(r.title),s=bD(r.tldr),c=bD(r.cwd),l=bD(r.prompt),u=bD(E(c)),d=e.cloudProfiles.map(e=>({id:e.id,label:bD(e.id)})),f=(t,n)=>{!a&&e.canAccept&&e.onAccept(r,t,n)},p=r.id===n,m=z`
|
||
<article
|
||
class="task-suggestion"
|
||
data-task-id=${r.id}
|
||
data-swap-direction=${p&&e.swapDirection?e.swapDirection:R}
|
||
?hidden=${!p}
|
||
>
|
||
<header class="task-suggestion__header">
|
||
<div class="task-suggestion__eyebrow" title=${c}>
|
||
${Y(`chat.taskSuggestions.eyebrow`,{repo:u})}
|
||
${t?z`<span class="task-suggestion__position"
|
||
>${i+1} / ${e.suggestions.length}</span
|
||
>`:R}
|
||
</div>
|
||
<div class="task-suggestion__header-actions">
|
||
${t?z`
|
||
<button
|
||
class="task-suggestion__header-action"
|
||
type="button"
|
||
aria-label=${Y(`chat.taskSuggestions.previous`)}
|
||
data-task-prev
|
||
@click=${()=>e.onNavigate(r.id,`previous`)}
|
||
>
|
||
${q.chevronLeft}
|
||
</button>
|
||
<button
|
||
class="task-suggestion__header-action"
|
||
type="button"
|
||
aria-label=${Y(`chat.taskSuggestions.next`)}
|
||
data-task-next
|
||
@click=${()=>e.onNavigate(r.id,`next`)}
|
||
>
|
||
${q.chevronRight}
|
||
</button>
|
||
`:R}
|
||
${e.canDismiss?z`
|
||
<button
|
||
class="task-suggestion__header-action task-suggestion__dismiss"
|
||
type="button"
|
||
?disabled=${a}
|
||
aria-label=${Y(`chat.taskSuggestions.dismiss`,{title:o})}
|
||
@click=${()=>e.onDismiss(r)}
|
||
>
|
||
${q.x}
|
||
</button>
|
||
`:R}
|
||
</div>
|
||
</header>
|
||
<div class="task-suggestion__body">
|
||
<div class="task-suggestion__title">${o}</div>
|
||
<div class="task-suggestion__summary">${s}</div>
|
||
<details class="task-suggestion__instructions">
|
||
<summary>
|
||
<span class="task-suggestion__instructions-chevron" aria-hidden="true"
|
||
>${q.chevronRight}</span
|
||
>
|
||
<span class="task-suggestion__show"
|
||
>${Y(`chat.taskSuggestions.showInstructions`)}</span
|
||
>
|
||
<span class="task-suggestion__hide"
|
||
>${Y(`chat.taskSuggestions.hideInstructions`)}</span
|
||
>
|
||
</summary>
|
||
<div class="task-suggestion__instruction-body">
|
||
<code
|
||
${U(e=>{e&&requestAnimationFrame(()=>xD(e))})}
|
||
@scroll=${e=>xD(e.currentTarget)}
|
||
>${c}</code
|
||
>
|
||
<pre>${l}</pre>
|
||
</div>
|
||
</details>
|
||
</div>
|
||
<div class="task-suggestion__actions">
|
||
<div class="task-suggestion__split">
|
||
<button
|
||
class="btn task-suggestion__start"
|
||
type="button"
|
||
?disabled=${a||!e.canAccept}
|
||
title=${e.canAccept?``:Y(`chat.taskSuggestions.adminRequired`)}
|
||
@click=${()=>f(`worktree`)}
|
||
>
|
||
${q.play}
|
||
${Y(a?`chat.taskSuggestions.starting`:`chat.taskSuggestions.startWorktree`)}
|
||
</button>
|
||
${z`
|
||
<wa-dropdown
|
||
class="task-suggestion__menu"
|
||
placement="bottom-end"
|
||
@wa-select=${t=>{let n=t.detail.item;if(n.value===`local`)f(`local`);else if(n.value===`session`)f(`session`);else if(n.value===`cloud`){let e=n.dataset.cloudProfile;e&&f(`cloud`,e)}else n.value===`copy-prompt`&&e.onCopyPrompt(r)}}
|
||
>
|
||
<button
|
||
slot="trigger"
|
||
class="btn task-suggestion__menu-trigger"
|
||
type="button"
|
||
?disabled=${a}
|
||
aria-label=${Y(`chat.taskSuggestions.moreActions`)}
|
||
aria-haspopup="menu"
|
||
aria-expanded="false"
|
||
>
|
||
${q.chevronDown}
|
||
</button>
|
||
${e.canAcceptModes?z`
|
||
<wa-dropdown-item value="local" ?disabled=${a||!e.canAccept}>
|
||
${Y(`chat.taskSuggestions.startLocal`)}
|
||
</wa-dropdown-item>
|
||
${d.length===0?z`
|
||
<wa-dropdown-item
|
||
value="cloud"
|
||
disabled
|
||
title=${Y(`chat.taskSuggestions.noCloudConfigured`)}
|
||
>
|
||
${Y(`chat.taskSuggestions.startCloudGeneric`)}
|
||
</wa-dropdown-item>
|
||
`:d.map(t=>z`
|
||
<wa-dropdown-item
|
||
value="cloud"
|
||
data-cloud-profile=${t.id}
|
||
?disabled=${a||!e.canAccept}
|
||
>
|
||
${d.length>1?Y(`chat.taskSuggestions.startCloud`,{profile:t.label}):Y(`chat.taskSuggestions.startCloudGeneric`)}
|
||
</wa-dropdown-item>
|
||
`)}
|
||
<wa-dropdown-item value="session" ?disabled=${a||!e.canAccept}>
|
||
${Y(`chat.taskSuggestions.fixInSession`)}
|
||
</wa-dropdown-item>
|
||
`:R}
|
||
<wa-dropdown-item value="copy-prompt">
|
||
${e.copiedIds.has(r.id)?Y(`chat.taskSuggestions.promptCopied`):Y(`chat.taskSuggestions.copyPrompt`)}
|
||
</wa-dropdown-item>
|
||
</wa-dropdown>
|
||
`}
|
||
</div>
|
||
</div>
|
||
</article>
|
||
`;return wt(p?`${r.id}:${e.swapGeneration}`:`${r.id}:inactive`,m)})}
|
||
</div>
|
||
`}function CD(){return(CD=e((()=>{B(),rt(),V(),J(),mn(),K(),Qe()})))()}function wD(e){return e.replace(/^Inherited:\s*/u,``)}function TD(e){let t=e.thinking.options,n=t.length>0;if(!e.reserved&&!n&&!e.fastMode.supported)return R;let r=e.thinking.selection,i=Ho(r.value)===`off`,a=-120+(i||r.kind===`unanchored`?0:t.length>1?r.index/(t.length-1):1)*240,o=r.source===`override`,s=o?r.value:``,c=r.kind===`anchored`?r.index:0,l=r.kind===`unanchored`,u=e=>t.length>1?e/(t.length-1)*100:0,d=wD(e.thinking.inherited.displayLabel),f=wD(r.displayLabel),p=o?f:Y(`chat.modelControls.defaultWithLevel`,{level:d}),m=n?f:Y(`chat.modelControls.fastMode`),h=n?e.fastMode.active?`${m} · ${Y(`chat.modelControls.fastMode`)}`:m:`${m}: ${e.fastMode.label}`,g=t=>{e.onThinkingSelect(t,e.sessionKey).finally(()=>e.onRequestUpdate?.()),e.onRequestUpdate?.()},_=t=>{e.onFastModeSelect(t,e.sessionKey).finally(()=>e.onRequestUpdate?.()),e.onRequestUpdate?.()},v=(e,t=!1)=>{t&&(e.value=String(c)),e.style.setProperty(`--reasoning-fill`,`${u(c)}%`),e.setAttribute(`aria-valuetext`,p);let n=e.closest(`.chat-controls__reasoning-panel`);n?.querySelectorAll(`[data-chat-thinking-preview-index]`).forEach(e=>{e.hidden=!0});let r=n?.querySelector(`[data-chat-thinking-preview-committed]`);r&&(r.hidden=!1)},y=e=>{let n=e.currentTarget,r=t[Number(n.value)];if(!r)return;n.style.setProperty(`--reasoning-fill`,`${u(Number(n.value))}%`),n.setAttribute(`aria-valuetext`,wD(r.label));let i=n.closest(`.chat-controls__reasoning-panel`);i?.querySelectorAll(`[data-chat-thinking-preview-index]`).forEach(e=>{e.hidden=e.dataset.chatThinkingPreviewIndex!==n.value});let a=i?.querySelector(`[data-chat-thinking-preview-committed]`);a&&(a.hidden=!0)},b=n=>{let r=n.currentTarget,i=t[Number(r.value)];v(r),!(e.thinkingDisabled||!i||i.value===s)&&g(i.value)},x=e=>{let t=e.currentTarget;l&&Number(t.value)===c&&b(e)},S=e=>{l&&[`Home`,`ArrowLeft`,`ArrowDown`,`PageDown`].includes(e.key)&&b(e)},C=t.length===1?t[0]:void 0,w=r.kind===`anchored`&&r.index===0;return z`
|
||
<details
|
||
class="chat-controls__inline-select chat-controls__effort-picker ${e.reserved?`chat-controls__effort-picker--reserved`:``}"
|
||
aria-hidden=${String(e.reserved===!0)}
|
||
?inert=${e.reserved===!0}
|
||
@toggle=${e=>{let t=e.currentTarget;$C(e),rw(t)}}
|
||
>
|
||
<summary
|
||
class="chat-controls__inline-select-trigger chat-controls__effort-trigger ${e.fastMode.active?`chat-controls__effort-trigger--fast`:``} ${e.disabled?`chat-controls__inline-select-trigger--disabled`:``}"
|
||
data-chat-thinking-select="true"
|
||
data-chat-thinking-value=${s}
|
||
data-chat-thinking-disabled=${e.thinkingDisabled?`true`:`false`}
|
||
data-chat-fast-mode=${e.fastMode.active?`true`:`false`}
|
||
aria-label=${n?`${Y(`chat.selectors.thinkingLevel`)}: ${h}`:h}
|
||
aria-disabled=${e.disabled?`true`:`false`}
|
||
title=${e.disabledReason??h}
|
||
@click=${t=>{e.disabled&&t.preventDefault()}}
|
||
>
|
||
${e.fastMode.active?z`<span class="chat-controls__effort-zap" aria-hidden="true">${q.zap}</span>`:R}
|
||
${n?z`
|
||
<span
|
||
class="chat-controls__effort-gauge ${i?`chat-controls__effort-gauge--off`:``}"
|
||
aria-hidden="true"
|
||
>
|
||
${cn(lt`
|
||
<path class="chat-controls__effort-gauge-dial" d="M3.34 17a10 10 0 1 1 17.32 0" />
|
||
<path
|
||
class="chat-controls__effort-gauge-needle"
|
||
d="M12 12V6"
|
||
style=${`transform: rotate(${a}deg)`}
|
||
/>
|
||
<circle cx="12" cy="12" r="1" fill="currentColor" stroke="none" />
|
||
`)}
|
||
${e.fastMode.active?z`<span class="chat-controls__effort-fast-badge">${q.zap}</span>`:R}
|
||
</span>
|
||
`:z`<span class="chat-controls__effort-speed" aria-hidden="true">${q.zap}</span>`}
|
||
<span class="chat-controls__inline-select-label">${m}</span>
|
||
<span class="chat-controls__inline-select-chevron" aria-hidden="true"
|
||
>${q.chevronUp}</span
|
||
>
|
||
</summary>
|
||
<wa-popup data-anchored-overlay>
|
||
<div
|
||
class="chat-controls__inline-select-menu chat-controls__effort-menu"
|
||
aria-label=${Y(n?`chat.modelControls.effort`:`chat.modelControls.fastMode`)}
|
||
>
|
||
${n?z`
|
||
<div class="chat-controls__reasoning-panel">
|
||
<div class="chat-controls__reasoning-head">
|
||
<span class="chat-controls__effort-heading">
|
||
${Y(`chat.modelControls.effort`)}
|
||
</span>
|
||
<span class="chat-controls__effort-value" aria-hidden="true">
|
||
<span data-chat-thinking-preview-committed>${f}</span>
|
||
${t.map((e,t)=>z`<span data-chat-thinking-preview-index=${t} hidden
|
||
>${wD(e.label)}</span
|
||
>`)}
|
||
</span>
|
||
</div>
|
||
${t.length>1?z`
|
||
<div class="chat-controls__reasoning-slider">
|
||
<div class="chat-controls__reasoning-dots" aria-hidden="true">
|
||
${t.map(e=>z`<span
|
||
class="chat-controls__reasoning-dot"
|
||
data-stop=${e.value}
|
||
></span>`)}
|
||
</div>
|
||
<input
|
||
class="chat-controls__reasoning-range ${o?``:`chat-controls__reasoning-range--inherit`} ${l?`chat-controls__reasoning-range--unanchored`:``}"
|
||
type="range"
|
||
min="0"
|
||
max=${t.length-1}
|
||
step="1"
|
||
.value=${String(c)}
|
||
style=${`--reasoning-fill: ${u(c)}%`}
|
||
data-chat-thinking-slider="true"
|
||
data-chat-thinking-values=${t.map(e=>e.value).join(`,`)}
|
||
aria-label=${Y(`chat.selectors.thinkingLevel`)}
|
||
aria-valuetext=${p}
|
||
?disabled=${e.thinkingDisabled}
|
||
@input=${y}
|
||
@change=${b}
|
||
@click=${x}
|
||
@keydown=${S}
|
||
@pointercancel=${e=>v(e.currentTarget,!0)}
|
||
@blur=${e=>v(e.currentTarget,!0)}
|
||
/>
|
||
</div>
|
||
<div class="chat-controls__effort-scale" aria-hidden="true">
|
||
<span>${Y(`chat.modelControls.faster`)}</span>
|
||
<span>${Y(`chat.modelControls.smarter`)}</span>
|
||
</div>
|
||
`:C?z`
|
||
<button
|
||
class="chat-controls__reasoning-option ${w?`chat-controls__reasoning-option--selected`:``}"
|
||
data-chat-thinking-option=${C.value}
|
||
type="button"
|
||
aria-pressed=${w?`true`:`false`}
|
||
?disabled=${e.thinkingDisabled}
|
||
@click=${t=>{if(t.stopPropagation(),e.thinkingDisabled||w){t.preventDefault();return}g(C.value)}}
|
||
>
|
||
<span>${C.label}</span>
|
||
${w?z`<span
|
||
class="chat-controls__inline-select-check"
|
||
aria-hidden="true"
|
||
>${q.check}</span
|
||
>`:R}
|
||
</button>
|
||
`:R}
|
||
</div>
|
||
`:R}
|
||
<div class="chat-controls__fast-mode-row">
|
||
<span class="chat-controls__fast-mode-icon" aria-hidden="true">${q.zap}</span>
|
||
<span class="chat-controls__fast-mode-copy">
|
||
<span class="chat-controls__fast-mode-title">
|
||
${Y(`chat.modelControls.fastMode`)}
|
||
</span>
|
||
<span class="chat-controls__fast-mode-description">
|
||
${Y(`chat.modelControls.fastHelp`)}
|
||
</span>
|
||
</span>
|
||
<button
|
||
class="chat-controls__speed-toggle ${e.fastMode.active?`chat-controls__speed-toggle--active`:``}"
|
||
data-chat-speed-toggle=${e.fastMode.nextValue}
|
||
type="button"
|
||
role="switch"
|
||
aria-checked=${e.fastMode.active?`true`:`false`}
|
||
aria-label=${Y(`chat.modelControls.fastResponsesAria`,{state:e.fastMode.label})}
|
||
?disabled=${e.fastMode.disabled}
|
||
@click=${t=>{if(t.stopPropagation(),e.fastMode.disabled){t.preventDefault();return}_(e.fastMode.nextValue)}}
|
||
>
|
||
<span class="chat-controls__speed-toggle-thumb"></span>
|
||
</button>
|
||
</div>
|
||
</div>
|
||
</wa-popup>
|
||
</details>
|
||
`}function ED(){return(ED=e((()=>{B(),Nn(),J(),G(),K(),Go(),uw()})))()}function DD(e){let t=M(e);return PD[t]??t}function OD(e,t,n=``,r=``){let i=(e||n).trim(),a=i.toLowerCase(),o=t.find(e=>{let t=e.id.trim().toLowerCase();return`${M(e.provider)}/${t}`===a});if(o)return DD(o.provider);let s=t.filter(e=>e.id.trim().toLowerCase()===a),c=M(r),l=s.some(e=>M(e.provider)===c);if(c&&(s.length===0||l))return DD(c);if(s.length===1)return DD(s[0]?.provider??``);let u=i.indexOf(`/`);return u>0?DD(i.slice(0,u)):`other`}function kD(e,t){let n=e.trim().toLowerCase(),r=n.indexOf(`/`),i=r>0?`${M(n.slice(0,r))}/${n.slice(r+1)}`:n;if(!i)return;let a=t.filter(e=>`${M(e.provider)}/${e.id.trim().toLowerCase()}`===i);if(a.length>0)return a.find(e=>e.provider.trim().toLowerCase()===`openai`)??a[0];let o=t.filter(e=>e.id.trim().toLowerCase()===i);return o.length===1?o[0]:void 0}function AD(e,t,n){let r=kD(e,n);return r&&M(r.provider)===`openai`&&r.name.trim()||t}function jD(e){return/^Default \((.+)\)$/u.exec(e)?.[1]??e}function MD(e,t){if(e.status!==`offline`){if(e.status===`error`)return t===0?Y(`chat.modelControls.modelsUnavailable`):void 0;if(!e.hasSnapshot&&[`idle`,`loading`].includes(e.status))return Y(`chat.modelControls.loadingModels`);if(e.hasSnapshot&&t===0)return Y(`chat.modelControls.noModelsAvailable`)}}function ND(e){let{currentOverride:t,defaultModel:n,defaultLabel:r,modelOverrideSource:i,options:a}=ca({activeSession:e.selectedSession,agentDefaultModel:e.agentDefaultModel,chatModelCatalog:e.modelCatalog,modelOverrides:e.modelOverrides??{},sessionKey:e.sessionKey,sessionsResult:e.sessionsResult}),o=Oi({catalog:e.modelCatalog,defaults:e.thinkingDefaults,session:e.thinkingSession,sessionKey:e.sessionKey,sessionsResult:e.sessionsResult}),s=Hr({activeRunId:e.activeRunId,catalog:e.modelCatalog,connected:e.connected,currentModelOverride:t,fastModeTarget:e.fastModeTarget??e.selectedSession,gatewayAvailable:e.gatewayAvailable,loading:e.loading,sending:e.sending,sessionsResult:e.sessionsResult,stream:e.stream}),c=e.modelSwitching?{...s,disabled:!0}:s,l=e.selectedSession,u=l?.modelProvider??``,d=e.sessionsResult?.defaults?.modelProvider??``,f=kD(n,e.modelCatalog),p=AD(n,r,e.modelCatalog),m=n&&p!==r?Y(`chat.modelControls.defaultWithModel`,{model:p}):r,h=n.trim().toLowerCase(),g=a.map(n=>{let r=kD(n.value,e.modelCatalog),i=n.value.trim().toLowerCase()===h||r!==void 0&&r===f,a=r?.agentRuntime,o=a&&(a.source===`model`||a.source===`provider`)?a.id.trim():void 0,s={commitValue:i?``:n.value,isDefault:i,value:n.value,label:AD(n.value,n.label,e.modelCatalog),provider:OD(n.value,e.modelCatalog,``,i?d:n.value===t?u:``)};return o&&(s.agentRuntimeId=o),r?.contextWindow&&(s.contextWindow=r.contextWindow),typeof r?.supportsTools==`boolean`&&(s.supportsTools=r.supportsTools),n.disabled&&(s.disabled=!0,s.unavailableReason=n.unavailableReason),s}),_=kD(t,e.modelCatalog);t&&g.length>0&&!g.some(e=>e.value===t)&&g.push({commitValue:t,..._?.contextWindow?{contextWindow:_.contextWindow}:{},...typeof _?.supportsTools==`boolean`?{supportsTools:_.supportsTools}:{},..._?.available===!1?{disabled:!0,unavailableReason:_.unavailableReason}:{},isDefault:!1,value:t,label:_?.name.trim()||t,provider:OD(t,e.modelCatalog,``,u)});let v=i===null?``:t,y=v===``?g.find(e=>e.isDefault):g.find(e=>e.value===v),b=l?.model?kD(he(l.model,l.modelProvider,e.modelCatalog),e.modelCatalog):void 0,x=y?kD(y.value,e.modelCatalog):void 0,S=l?.agentRuntime?.id.trim().toLowerCase(),C=(x?.agentRuntime?.id??(y?.isDefault?e.sessionsResult?.defaults?.agentRuntime?.id:void 0))?.trim().toLowerCase(),w=!!S&&S===C;!e.modelSwitching&&y&&l?.contextTokens&&w&&b!==void 0&&b===x&&(y.contextTokens=l.contextTokens);let T=e.modelSelectionRuntimeId?.trim().toLowerCase()===`codex`?Y(`chat.selectors.nativeCodexModel`):Y(`chat.selectors.lockedSessionModel`),E=e.modelSelectionLocked===!0?T:g.find(e=>e.value===t)?.label??AD(t,t||m,e.modelCatalog),D=e.modelCatalogState??{hasSnapshot:!e.modelsLoading,status:e.modelsLoading?`loading`:`ready`},O=!D.hasSnapshot&&[`idle`,`loading`].includes(D.status),k=MD(D,g.length),ee=D.status===`ready`&&(g.some(e=>!e.disabled)||e.modelSelectionLocked===!0&&y!==void 0),A=e.loading||e.sending||!!e.activeRunId||e.stream!==null,te=!e.connected||A||e.modelSwitching||!e.gatewayAvailable,j=!!e.effortMutationDisabledReason,ne=te||!!e.modelMutationDisabledReason,M=te||j||!D.hasSnapshot||o.options.length===0&&o.selection.source==="default",N=e.contextWindowTarget??l??e.sessionsResult?.defaults,re=N?.contextWindows??[],ie=N?.contextWindow??N?.contextWindowDefault??``,ae=N?.contextWindowDefault,P=te||j||o.options.length===0&&c.disabled,oe=!ee&&(O||e.modelPickerOpen===!0),se=ee||oe;return z`
|
||
<div class="chat-controls__session chat-controls__model chat-controls__model-settings">
|
||
${TE({contextWindow:re.length>1?{options:re,selected:ie,...ae?{defaultId:ae}:{},disabled:te||j,onSelect:async(t,n)=>{await e.onContextWindowSelect?.(t,n)}}:void 0,defaultModelLabel:jD(m),disabled:ne,disabledReason:e.modelMutationDisabledReason,modelCatalogState:D,open:e.modelPickerOpen,modelSelectionLocked:e.modelSelectionLocked===!0,modelOptions:g,targetGroups:e.modelPickerTargetGroups,selectedModelValue:v,sessionModelPinned:i===`user`,sessionKey:e.sessionKey,triggerModelLabel:jD(E),triggerStatusLabel:k,triggerLoading:O,onModelSetup:e.onModelSetup,onOpen:e.onModelPickerOpen,onOpenChange:e.onModelPickerOpenChange,onModelSelect:async(t,n)=>e.onModelSelect?.(t,n),onTargetRetry:e.onModelPickerTargetRetry,onTargetSelect:e.onModelPickerTargetSelect,onRequestUpdate:e.onRequestUpdate})}
|
||
${se?TD({disabled:P,disabledReason:e.effortMutationDisabledReason,fastMode:{...c,disabled:c.disabled||te||j},sessionKey:e.sessionKey,thinkingDisabled:M,thinking:o,onFastModeSelect:async(t,n)=>e.onFastModeSelect?.(t,n),onRequestUpdate:e.onRequestUpdate,onThinkingSelect:async(t,n)=>e.onThinkingSelect?.(t,n),reserved:oe}):R}
|
||
</div>
|
||
`}var PD;function FD(){return(FD=e((()=>{B(),K(),N(),kr(),Go(),ED(),EE(),PD={"google-gemini-cli":`google`,"moonshot-ai":`moonshot`,moonshotai:`moonshot`,"opencode-go":`opencode`,"opencode-zen":`opencode`}})))()}export{KS as $,Tc as $n,kv as $t,Gw as A,Mu as An,sx as At,AC as B,al as Bn,Oy as Bt,EE as C,gh as Cn,Ox as Ct,KT as D,Qm as Dn,px as Dt,ZT as E,eh as En,ux as Et,UC as F,ll as Fn,Bb as Ft,OC as G,$c as Gn,ry as Gt,uC as H,Wc as Hn,Ey as Ht,WC as I,sl as In,hb as It,oC as J,Cc as Jn,Uv as Jt,fC as K,Qc as Kn,dy as Kt,VC as L,rl as Ln,gb as Lt,Uw as M,fu as Mn,Zb as Mt,Vw as N,Yl as Nn,Jb as Nt,dT as O,Xm as On,ox as Ot,Bw as P,bl as Pn,Ub as Pt,rC as Q,Ic as Qn,sv as Qt,HC as R,il as Rn,Ty as Rt,SE as S,Gh as Sn,bx as St,$T as T,vh as Tn,fx as Tt,yC as U,Xc as Un,Ay as Ut,kC as V,Gc as Vn,Dy as Vt,pC as W,el as Wn,sy as Wt,sC as X,xc as Xn,iv as Xt,lC as Y,jc as Yn,Dv as Yt,US as Z,Oc as Zn,dv as Zt,IE as _,gg as _n,Xx as _t,vD as a,A_ as an,VS as at,DE as b,Qh as bn,xx as bt,oD as c,N_ as cn,Q as ct,QE as d,Cg as dn,nS as dt,yv as en,Sc as er,tC as et,nD as f,yg as fn,rS as ft,zE as g,vg as gn,oS as gt,GE as h,og as hn,tS as ht,yD as i,D_ as in,MS as it,Hw as j,Ql as jn,cx as jt,lT as k,Fu as kn,lx as kt,iD as l,g_ as ln,wS as lt,KE as m,Sg as mn,cS as mt,ND as n,F_ as nn,FS as nt,hD as o,w_ as on,PS as ot,tD as p,xg as pn,aS as pt,TC as q,Dc as qn,Jv as qt,CD as r,z_ as rn,IS as rt,sD as s,I_ as sn,BS as st,FD as t,fv as tn,kc as tr,bS as tt,rD as u,h_ as un,Kx as ut,FE as v,ng as vn,$x as vt,eE as w,xh as wn,Sx as wt,OE as x,Zh as xn,Px as xt,NE as y,rg as yn,yx as yt,PC as z,Zc as zn,Gy as zt};
|
||
//# sourceMappingURL=control-ui-boot-B1lcIXow.js.map
|