openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
644 lines • 71.8 kB
JavaScript
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./input-dialog-C6w2KAqY.js","./rolldown-runtime-DkW27tQK.js","./control-ui-core-Rwzhj6nO.js","./control-ui-foundation-Cydpkyqa.js","./lit-runtime-CV_MH99K.js","./control-ui-core-YphAl4aM.js","./control-ui-core-vvcQQV2m.js","./gateway-runtime-Bqqcp9-I.js","./control-ui-core-ClxHIvNM.css"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Pn as t,Qi as n,R as r,ii as i,jn as a,ri as o,ta as s,tt as c,vn as l,wr as u,z as d}from"./control-ui-foundation-Cydpkyqa.js";import{As as f,Bi as p,Bn as m,C as h,Cc as g,Do as _,Ds as v,Eo as y,Es as b,Fa as x,Hi as S,Ia as C,Ir as w,J as ee,Ki as T,Ls as E,Oo as D,Pr as te,Rs as ne,Sc as re,Ts as ie,Ui as ae,Vi as O,Vs as k,Wi as A,aa as oe,b as se,bc as ce,ea as le,k as ue,m as de,ma as fe,nt as pe,oa as me,os as he,sa as ge,ta as _e,tt as ve,w as j,wa as ye,wn as be,ws as xe,zn as Se}from"./control-ui-core-Rwzhj6nO.js";import{$ as Ce,K as M,X as N,at as P,q as F,st as we}from"./lit-runtime-CV_MH99K.js";import{An as Te,Mt as Ee,_ as De,_n as Oe,g as ke,jn as Ae,jt as je}from"./control-ui-core-YphAl4aM.js";import{Gt as Me,Ht as Ne,Wt as I,Yt as Pe,Z as Fe,en as L}from"./control-ui-core-vvcQQV2m.js";import{B as Ie,U as Le,V as Re,z as ze}from"./control-ui-boot-shared-BYq7Cchl.js";import{a as R,r as Be}from"./gateway-runtime-Bqqcp9-I.js";import{B as Ve,Ct as He,G as z,H as Ue,Hr as We,Mi as Ge,St as Ke,U as qe,Uo as Je,Vr as Ye,cr as Xe,na as Ze,ra as Qe,sr as $e}from"./control-ui-boot-shared-DfZ39Yj9.js";import{K as et,L as tt,Q as B,X as nt,Z as rt,ft as it,in as V,pt as at,rn as ot,z as st}from"./control-ui-boot-chat-_QSl8fbH.js";import{p as ct,u as lt}from"./control-ui-boot-chat-Cgwe4GEM.js";import{$o as ut,Is as dt,Jn as ft,Kn as pt,Ks as mt,Ls as ht,Qo as gt,Qt as _t,Yn as vt,Ys as yt,Zs as bt,a as xt,ba as St,ec as Ct,nc as H,ns as wt,o as Tt,rc as Et,rs as Dt,s as Ot,ts as kt,xa as At}from"./control-ui-boot-shared-CXVvK2AW.js";import{_ as jt,l as Mt,u as Nt}from"./control-ui-boot-new-Bj2SAUyl.js";import{n as Pt,t as Ft}from"./transcript-search-BNkA0vxn.js";import{n as It,r as Lt}from"./worktree-preservation-BzBdreYx.js";import{n as Rt,t as zt}from"./cloud-worker-stop.runtime-CEd3IinU.js";import{n as Bt,t as Vt}from"./settings-workspace-Bseic8Tf.js";import{o as Ht,s as Ut}from"./presenter-DkWDWjgv.js";import{n as Wt,t as Gt}from"./agent-scope-control-6x2VZZ2e.js";import{n as Kt,t as qt}from"./sessions-hub-header-CjvNBRq9.js";function Jt(e){return[...new Set((e?.sessions??[]).map(e=>E(e.key)?.agentId).filter(e=>!!e))]}function Yt(e,t){return Object.fromEntries(Jt(e).map(e=>[e,t(e)]).filter(e=>!!e[1]))}function Xt(){return(Xt=e((()=>{f()})))()}function Zt(e,t){let n=(e?.sessions??[]).map(e=>e.category?.trim()).filter(e=>!!e);return[...new Set([...t,...n.toSorted((e,t)=>e.localeCompare(t))])]}async function Qt(e){if(!e.sessions||e.knownCategories.includes(e.name))return`completed`;try{return await e.sessions.groupsPut([...e.sessions.state.groups??[],e.name])===`completed`&&e.isCurrent()?`completed`:`stale`}catch(t){return e.isCurrent()?(e.onError(y(t)),`failed`):`stale`}}function $t(){return($t=e((()=>{D()})))()}function en(){return Ct(g()?.getItem(U))}function tn(e){try{g()?.setItem(U,e)}catch{}}var U;function nn(){return(nn=e((()=>{bt(),U=`openclaw:sessions:group-by`})))()}function rn(e,t){return Object.hasOwn(e,t)?e[t]??null:null}function an(e,t){let n=_t(e,t),r=Ve(e.thinkingDefault??(n?t?.thinkingDefault:void 0)),i=e.thinkingLevels?.length?e.thinkingLevels:n&&t?.thinkingLevels?.length?t.thinkingLevels:(e.thinkingOptions?.length?e.thinkingOptions:n&&t?.thinkingOptions?.length?t.thinkingOptions:In).map(e=>({id:z(e),label:e}));return[{value:``,label:r},...i.map(e=>({value:z(e.id),label:Ue(e.id,e.label)}))]}function W(e,t){return!t||e.some(e=>e.value===t)?[...e]:[...e,{value:t,label:Ue(t)}]}function G(e,t=!1){return e.map(e=>({value:e,label:L(e===``?`sessionsView.inherit`:t&&e===`off`?`sessionsView.offExplicit`:`sessionsView.${e}`)}))}function on(e){return L(Bn[e]??`sessionsView.statusUnknown`)}function sn(e){let t=c(e),n=e.hasActiveRun===!1&&(!e.status||e.status===`running`),r=e.status===`queued`?L(`sessionsView.statusQueued`):t?L(`sessionsView.statusLive`):n?L(`sessionsView.statusIdle`):e.status?on(e.status):L(`sessionsView.statusUnknown`),i=e.status===`queued`?`warn`:t||e.status===`done`?`ok`:n||!e.status?`muted`:`danger`,a=`${L(`sessionsView.status`)}: ${r}`;return N`
<openclaw-tooltip .content=${a}>
${B({kind:i,label:r})}
</openclaw-tooltip>
`}function K(e){return C(e.key)?`cron`:e.kind}function cn(e){let t=K(e);return N`
<span class="session-avatar session-avatar--${t}" aria-hidden="true">
${Vn[t]??I.circle}
${c(e)?N`<span class="session-avatar__status"></span>`:F}
</span>
`}function ln(e){let t=e.totalTokens;if(typeof t!=`number`||!Number.isFinite(t))return N`<span class="muted">${L(`common.na`)}</span>`;let n=e.totalTokensFresh!==!1,r=`${n?``:`~`}${de(t)}`,i=typeof e.contextTokens==`number`&&e.contextTokens>0?e.contextTokens:null;if(!i)return N`<span class="session-tokens__value">${r}</span>`;let a=Math.min(100,Math.round(t/i*100)),o=n?a>=Un?`danger`:a>=Hn?`warn`:`ok`:`stale`,s=L(n?`sessionsView.contextUsage`:`sessionsView.contextUsageApprox`,{percent:String(a),used:t.toLocaleString(),context:i.toLocaleString()});return N`
<openclaw-tooltip .content=${s}>
<div class="session-tokens">
<span class="session-tokens__value"
>${r} / ${de(i)}</span
>
${Nt({mode:`continuous`,percent:a,tone:o,label:s})}
</div>
</openclaw-tooltip>
`}function un(e,t,n){let r=e.filter(e=>e.unread===!0&&e.archived!==!0).length,i=e.filter(e=>e.archived===!0).length,a=[[String(t),L(`sessionsView.statusLive`),t>0],[String(r),L(`sessionsView.unread`),r>0]];return n!==`active`&&a.push([String(i),L(`sessionsView.archived`),!1]),N`
<span class="sessions-heading-facts">
${a.map(([e,t,n],r)=>N`
${r>0?N`<span class="sessions-heading-fact__separator" aria-hidden="true">·</span>`:F}
<span
class=${n?`sessions-heading-fact sessions-heading-fact--active`:`sessions-heading-fact`}
>
<strong>${e}</strong> ${t}
</span>
`)}
</span>
`}function dn(e,t){let n=t.find(t=>t.key===e.sessionKey);return s(n?.label)??s(n?.displayName)??e.sessionKey}function fn(e,t){let n=e.transcriptSearchQuery.trim().length>0,r=e.transcriptSearch,i=r.status===`results`?r.results:[],a=r.status===`loading`;return N`
<section
class="sessions-transcript-search"
aria-label=${L(`sessionsView.transcriptSearchTitle`)}
>
<form
class="sessions-transcript-search__form"
role="search"
aria-label=${L(`sessionsView.transcriptSearchTitle`)}
@submit=${t=>{t.preventDefault(),e.transcriptSearchAvailable&&n&&!a&&e.onTranscriptSearch()}}
>
<div class="data-table-search sessions-transcript-search__input">
<input
type="search"
maxlength="4096"
aria-label=${L(`sessionsView.transcriptSearchInputLabel`)}
placeholder=${L(`sessionsView.transcriptSearchPlaceholder`)}
.value=${e.transcriptSearchQuery}
?disabled=${!e.transcriptSearchAvailable}
@input=${t=>e.onTranscriptSearchChange(t.target.value)}
/>
</div>
<button
class="btn primary"
type="submit"
?disabled=${!e.transcriptSearchAvailable||!n||a}
>
${L(a?`sessionsView.transcriptSearchSearching`:`sessionsView.transcriptSearchAction`)}
</button>
${n?N`
<button class="btn" type="button" @click=${e.onClearTranscriptSearch}>
${L(`sessionsView.transcriptSearchClear`)}
</button>
`:F}
</form>
${e.transcriptSearchAvailable?F:N`
<div class="muted" role="status">
${L(`sessionsView.transcriptSearchUnavailable`)}
</div>
`}
<div
class="sessions-transcript-search__status"
aria-live="polite"
aria-busy=${a?`true`:`false`}
>
${a?N`<span class="muted">${L(`sessionsView.transcriptSearchSearching`)}</span>`:F}
${r.status===`error`?N`
<div
class="sessions-transcript-search__notice sessions-transcript-search__notice--danger"
>
<span>${L(`sessionsView.transcriptSearchError`)}: ${r.message}</span>
<button class="btn btn--sm" type="button" @click=${e.onTranscriptSearch}>
${L(`sessionsView.transcriptSearchRetry`)}
</button>
</div>
`:F}
${r.status===`results`&&r.indexing?N`
<div class="sessions-transcript-search__notice">
<span>${L(`sessionsView.transcriptSearchIndexing`)}</span>
<button
class="btn btn--sm"
type="button"
?disabled=${a}
@click=${e.onTranscriptSearch}
>
${L(`sessionsView.transcriptSearchRetry`)}
</button>
</div>
`:F}
${r.status===`results`&&i.length===0&&!r.indexing?N`
<div class="sessions-transcript-search__empty" role="status">
${L(`sessionsView.transcriptSearchEmpty`)}
</div>
`:F}
${i.length>0?N`
<div class="sessions-transcript-search__results">
<div class="sessions-transcript-search__summary">
<strong
>${L(`sessionsView.transcriptSearchMatches`,{count:String(i.length)})}</strong
>
${r.status===`results`&&r.truncated?N`<span class="muted"
>${L(`sessionsView.transcriptSearchTruncated`)}</span
>`:F}
</div>
<div class="sessions-transcript-search__list">
${i.map(n=>{let r=n.timestamp>0?j(n.timestamp):L(`common.na`),i=n.timestamp>0?h(n.timestamp):r;return N`
<button
class="sessions-transcript-search__result"
type="button"
@click=${()=>e.onNavigateToChat?.(n.sessionKey)}
>
<span class="sessions-transcript-search__result-header">
<strong>${dn(n,t)}</strong>
<span class="muted" title=${i}>
${L(`sessionsView.${n.role}`)} · ${r}
</span>
</span>
<span class="sessions-transcript-search__snippet">${n.snippet}</span>
<span class="sessions-transcript-search__key">${n.sessionKey}</span>
</button>
`})}
</div>
</div>
`:F}
</div>
</section>
`}function pn(e){return Array.from({length:Wn},(t,n)=>N`
<tr class="session-skeleton-row" aria-hidden="true">
${Array.from({length:e},(e,t)=>t===0?N`<td class="data-table-checkbox-col"></td>`:N`<td>
<span
class="session-skeleton ${t===1?`session-skeleton--key`:``}"
style=${`animation-delay: ${n*120}ms`}
></span>
</td>`)}
</tr>
`)}function mn(e,t,n){let r=n===`asc`?1:-1;return[...e].toSorted((e,n)=>{let i=(n.pinnedAt??0)-(e.pinnedAt??0);return i===0?(t===`key`||t===`kind`?(e[t]??``).localeCompare(n[t]??``):t===`updated`?(e.updatedAt??0)-(n.updatedAt??0):(e.totalTokens??e.inputTokens??e.outputTokens??0)-(n.totalTokens??n.inputTokens??n.outputTokens??0))*r:i})}function hn(e,t,n){let r=t*n;return e.slice(r,r+n)}function gn(e){return n(e.searchQuery).length>0||t(e.activeMinutes)!==void 0||!e.includeGlobal}function _n(e){let t=Gn[e];return t?L(t):e}function vn(e){return L(e===1?`sessionsView.checkpoint`:`sessionsView.checkpoints`,{count:String(e)})}function yn(e){return typeof e.tokensBefore==`number`&&typeof e.tokensAfter==`number`&&Number.isFinite(e.tokensBefore)&&Number.isFinite(e.tokensAfter)?L(`sessionsView.tokenRange`,{before:e.tokensBefore.toLocaleString(),after:e.tokensAfter.toLocaleString()}):typeof e.tokensBefore==`number`&&Number.isFinite(e.tokensBefore)?L(`sessionsView.tokensBefore`,{count:e.tokensBefore.toLocaleString()}):L(`sessionsView.tokenDeltaUnavailable`)}function bn(e){return typeof e!=`number`||!Number.isFinite(e)||e<0?null:se(e)??`0ms`}function xn(e){if(!e)return F;let t=e.status===`active`?`accent`:e.status===`complete`?`ok`:e.status===`blocked`||e.status===`budget_limited`||e.status===`usage_limited`?`warn`:`muted`,n=lt(e);return N`
<openclaw-tooltip .content=${n}>
<span tabindex="0" aria-label=${n}>
${B({kind:t,label:ct(e)})}
</span>
</openclaw-tooltip>
`}function Sn(e){let{row:t,updated:n,checkpointCount:r}=e,i=[{label:L(`sessionsView.key`),value:t.key},{label:L(`sessionsView.kind`),value:t.kind},{label:L(`sessionsView.updated`),value:n},{label:L(`sessionsView.tokens`),value:Ht(t)},{label:L(`sessionsView.compaction`),value:vn(r)}],a=(e,t)=>{let n=s(t);n&&i.push({label:e,value:n})};a(L(`sessionsView.group`),t.category),a(L(`sessionsView.status`),t.status),t.goal&&i.push({label:L(`sessionsView.goal`),value:lt(t.goal)}),a(L(`sessionsView.goalNote`),t.goal?.lastStatusNote),a(L(`sessionsView.model`),t.model),a(L(`sessionsView.provider`),t.modelProvider),a(L(`sessionsView.runtime`),l(t.agentRuntime)),a(L(`sessionsView.runDuration`),bn(t.runtimeMs)),a(L(`sessionsView.surface`),t.surface),a(L(`sessionsView.subject`),t.subject),a(L(`sessionsView.room`),t.room),a(L(`sessionsView.space`),t.space),a(L(`sessionsView.sessionId`),t.sessionId),t.archiveReason&&i.push({label:L(`sessionsView.archiveReason`),value:it(t.archiveReason)});for(let[e,n]of[[L(`sessionsView.activeRun`),t.hasActiveRun],[L(`sessionsView.archived`),t.archived],[L(`sessionsView.pinned`),t.pinned]])typeof n==`boolean`&&i.push({label:e,value:L(n?`common.yes`:`common.no`)});return i}function q(e){return e.groupBy===`category`?8:7}function Cn(e){return L(Q[e]??Q.none)}function wn(e,t){let{id:n}=e;if(t.groupBy===`date`)return L({today:`sessionsView.dateToday`,yesterday:`sessionsView.dateYesterday`,week:`sessionsView.dateThisWeek`,older:`sessionsView.dateOlder`}[n]??`sessionsView.dateNoActivity`);if(n===``)return L(`sessionsView.ungrouped`);if(t.groupBy===`agent`){let e=rn(t.agentIdentityById,n),r=s(e?.name);if(r){let t=s(e?.emoji);return t?`${t} ${r}`:r}}return t.groupBy===`person`&&e.rows[0]?.owner?.actor.label?.trim()||n}function J(e,t){e.currentTarget?.classList.toggle(`session-drop-target--active`,t)}function Tn(e,t){if(e.groupBy!==`category`||e.groupWriteDisabledReason)return{dragover:F,dragleave:F,drop:F};let n=e=>e.dataTransfer?.types.includes(H)===!0;return{dragover:e=>{n(e)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`move`),J(e,!0))},dragleave:e=>J(e,!1),drop:r=>{if(!n(r))return;r.preventDefault(),J(r,!1);let i=r.dataTransfer?.getData(H);i&&e.onAssignCategory(i,t)}}}function En(e,t){let n=wn(e,t),r=e.rows.length===1?L(`sessionsView.groupRowCountOne`,{count:`1`}):L(`sessionsView.groupRowCount`,{count:String(e.rows.length)}),i=Tn(t,e.id===``?null:e.id);return N`
<tr
class="session-group-row"
@dragover=${i.dragover}
@dragleave=${i.dragleave}
@drop=${i.drop}
>
<td colspan=${q(t)}>
<div class="session-group-row__header">
<span class="session-group-row__icon" aria-hidden="true">${I.folder}</span>
<span class="session-group-row__label">${n}</span>
<span class="session-group-row__count">${r}</span>
</div>
</td>
</tr>
`}function Dn(e,t){let n=s(e.category)??``,r=[...t.knownCategories];return n&&!r.includes(n)&&r.push(n),N`
<td>
<select
?disabled=${t.loading||!!t.groupWriteDisabledReason}
title=${t.groupWriteDisabledReason??F}
aria-label=${L(`sessionsView.moveToGroup`)}
class="session-group-select"
@change=${r=>{if(t.groupWriteDisabledReason)return;let i=r.target;if(i.value===Z){i.value=n,t.onRequestNewCategory(e.key);return}t.onAssignCategory(e.key,i.value||null)}}
>
<option value="" ?selected=${!n}>${L(`sessionsView.ungrouped`)}</option>
${r.map(e=>N`<option value=${e} ?selected=${n===e}>${e}</option>`)}
<option value=${Z}>${L(`sessionsView.newGroup`)}</option>
</select>
</td>
`}function On(e){return e instanceof Element&&!!e.closest(`a, button, input, label, select, textarea`)}function kn(e){let t=[`session-filter-check`,`session-filter-toggle`,e.extraClass??``,e.checked?`session-filter-check--active`:``].filter(Boolean).join(` `);return N`
<openclaw-tooltip .content=${e.title}>
<label class=${t}>
<input
name=${e.name}
class="session-filter-check__input"
type="checkbox"
.checked=${e.checked}
@change=${t=>e.onChange(t.target.checked)}
/>
<span class="session-filter-check__mark" aria-hidden="true">${I.check}</span>
<span class="session-filter-check__label">${e.label}</span>
</label>
</openclaw-tooltip>
`}function Y(e){return N`
<label class="session-override-field">
<span class="session-override-field__label">${e.label}</span>
<select
class="settings-select"
?disabled=${e.disabled}
title=${e.disabledReason??F}
@change=${t=>e.onChange(t.target.value)}
>
${e.options.map(t=>N`<option value=${t.value} ?selected=${e.current===t.value}>
${t.label}
</option>`)}
</select>
</label>
`}function An(e){let t=e.result?.sessions??[],n=mn(t,e.sortColumn,e.sortDir),r=n.length,i=Math.max(1,Math.ceil(r/e.pageSize)),a=Math.min(e.page,i-1),o=e.groupBy===`none`?null:yt({rows:n,mode:e.groupBy,knownCategories:e.knownCategories}),s=hn(o?o.flatMap(e=>e.rows):n,a,e.pageSize),l=t.length===0&&gn(e),u=t.filter(e=>c(e)).length,d=t.filter(e=>e.archived===!0).length,f=e.statusFilter===`archived`?L(`sessionsView.noArchivedSessions`):e.statusFilter===`active`?L(`sessionsView.noActiveSessions`):L(`sessionsView.noSessions`),p=(t,n,r=``)=>{let i=e.sortColumn===t,a=i&&e.sortDir===`asc`?`desc`:`asc`;return N`
<th
class=${r}
data-sortable
data-sort-dir=${i?e.sortDir:``}
aria-sort=${i?e.sortDir===`asc`?`ascending`:`descending`:F}
@click=${()=>e.onSortChange(t,i?a:`desc`)}
>
<button class="data-table-sort-button" type="button">
${n}
<span class="data-table-sort-icon" aria-hidden="true">${I.arrowUpDown}</span>
</button>
</th>
`},m=N`
${L(`sessionsView.title`)}
${e.result?N`
<openclaw-tooltip .content=${L(`sessionsView.store`,{path:e.result.path})}>
<span class="settings-count">${t.length}</span>
</openclaw-tooltip>
`:F}
${e.result?un(t,u,e.statusFilter):F}
`,h=N`
${e.statusFilter===`archived`?N`
<button
class="btn danger"
?disabled=${e.loading||d===0||!!e.deleteArchivedDisabledReason}
title=${e.deleteArchivedDisabledReason??F}
@click=${e.onDeleteAllArchived}
>
${I.trash} ${L(`sessionsView.deleteAllArchived`)}
</button>
`:F}
<button class="btn" ?disabled=${e.loading} @click=${e.onRefresh}>
${e.loading?L(`common.loading`):L(`common.refresh`)}
</button>
`,g=[e.error?N`<div class="sessions-error" role="alert">${e.error}</div>`:F,nt({title:L(`sessionsView.transcriptSearchTitle`)},fn(e,t)),nt({title:m,actions:h},Nn(e,{paginated:s,groups:o,emptyBecauseFiltered:l,emptyMessage:f,totalRows:r,totalPages:i,page:a,sortHeader:p}))];return et(g,{wide:!0})}function jn(e,t){e.currentTarget instanceof Element&&e.currentTarget.previousElementSibling?.setAttribute(`aria-expanded`,String(t))}function Mn(e){let t=[[`activeMinutes`,`minutes`,L(`sessionsView.active`),L(`sessionsView.activeTooltip`,{count:e.activeMinutes.trim()}),L(`sessionsView.minutesPlaceholder`),e.statusFilter!==`active`],[`limit`,`limit`,L(`sessionsView.limit`),L(`sessionsView.limitTooltip`),F,!1]],n=[[`includeGlobal`,L(`sessionsView.global`),L(`sessionsView.globalTooltip`)],[`includeUnknown`,L(`sessionsView.unknown`),L(`sessionsView.unknownTooltip`)]],{activeMinutes:r,limit:i,includeGlobal:a,includeUnknown:o}=e,s=(t,n)=>e.onFiltersChange({activeMinutes:r,limit:i,includeGlobal:a,includeUnknown:o,[t]:n}),c=r.trim()!==``||i.trim()!==`50`||!a||o||e.groupBy!==`none`;return N`
<button
id="sessions-filter-popover-trigger"
type="button"
class="btn btn--sm sessions-filter-popover__trigger ${c?`active`:``}"
title=${L(`sessionsView.filters`)}
aria-label=${L(`sessionsView.filters`)}
aria-haspopup="dialog"
aria-expanded="false"
>
${I.listFilter}
</button>
<wa-popover
class="sessions-filter-popover"
for="sessions-filter-popover-trigger"
placement="bottom-end"
without-arrow
@wa-show=${e=>jn(e,!0)}
@wa-hide=${e=>jn(e,!1)}
>
<div class="sessions-filter-popover__panel">
<div class="sessions-filter-popover__fields">
${t.map(([t,n,r,i,a,o])=>N`
<openclaw-tooltip .content=${i}>
<label class="session-filter-field">
<span class="session-filter-label">${r}</span>
<input
class="session-filter-input session-filter-input--${n}"
placeholder=${a}
.value=${e[t]}
?disabled=${o}
@input=${e=>s(t,e.target.value)}
/>
</label>
</openclaw-tooltip>
`)}
</div>
<div
class="session-filter-toggle-group"
role="group"
aria-label=${L(`sessionsView.sourceFilters`)}
>
${n.map(([t,n,r])=>kn({name:t,checked:e[t],label:n,title:r,onChange:e=>s(t,e)}))}
</div>
<label class="session-groupby">
<span class="session-groupby__label">${L(`sessionsView.groupBy`)}</span>
<select
class="session-groupby__select"
@change=${t=>e.onGroupByChange(t.target.value)}
>
${mt.filter(t=>t!==`person`||e.personGroupingAvailable).map(t=>N`
<option value=${t} ?selected=${e.groupBy===t}>
${Cn(t)}
</option>
`)}
</select>
</label>
${e.groupBy===`category`?N`
<button
class="btn btn--sm"
?disabled=${!!e.groupWriteDisabledReason}
title=${e.groupWriteDisabledReason??F}
@click=${()=>e.onRequestNewCategory()}
>
${I.plus} ${L(`sessionsView.newGroup`)}
</button>
`:F}
</div>
</wa-popover>
`}function Nn(e,t){let{paginated:n,groups:r,emptyBecauseFiltered:i,emptyMessage:a,totalRows:o,totalPages:s,page:c}=t,l=t.sortHeader,u=i?L(`sessionsView.noSessionsMatchFilters`):a,d=r?new Set(n.map(e=>e.key)):null;return N`
<div
class="sessions-toolbar sessions-filter-bar"
aria-label=${L(`sessionsView.filterControls`)}
>
<div class="data-table-search sessions-toolbar__search">
${I.search}
<input
type="text"
placeholder=${L(`sessionsView.searchPlaceholder`)}
.value=${e.searchQuery}
@input=${t=>e.onSearchChange(t.target.value)}
/>
</div>
${rt({value:e.statusFilter,ariaLabel:L(`sessionsView.sessionState`),className:`sessions-view-segment`,options:[{value:`active`,label:L(`common.active`)},{value:`archived`,label:L(`sessionsView.archived`),title:L(`sessionsView.archivedOnlyTooltip`)},{value:`all`,label:L(`sessionsView.all`)}],onChange:t=>e.onStatusFilterChange(t)})}
${Mn(e)}
</div>
${e.selectedKeys.size>0?N`
<div class="data-table-bulk-bar">
<span>${L(`sessionsView.selected`,{count:String(e.selectedKeys.size)})}</span>
<button class="btn btn--sm" @click=${e.onDeselectAll}>
${L(`common.unselect`)}
</button>
<button
class="btn btn--sm danger"
?disabled=${e.loading||!!e.deleteSelectedDisabledReason}
title=${e.deleteSelectedDisabledReason??F}
@click=${e.onDeleteSelected}
>
${I.trash} ${L(`sessionsView.deleteSelected`)}
</button>
</div>
`:F}
<div class="data-table-container">
<table class="data-table sessions-table">
<thead>
<tr>
<th class="data-table-checkbox-col">
${n.length>0?N`<input
type="checkbox"
.checked=${n.length>0&&n.every(t=>e.selectedKeys.has(t.key))}
.indeterminate=${n.some(t=>e.selectedKeys.has(t.key))&&!n.every(t=>e.selectedKeys.has(t.key))}
@change=${()=>{n.every(t=>e.selectedKeys.has(t.key))?e.onDeselectPage(n.map(e=>e.key)):e.onSelectPage(n.map(e=>e.key))}}
aria-label=${L(`sessionsView.selectAllOnPage`)}
/>`:F}
</th>
${l(`key`,L(`sessionsView.key`),`data-table-key-col`)}
${e.groupBy===`category`?N`<th>${L(`sessionsView.group`)}</th>`:F}
${l(`kind`,L(`sessionsView.kind`))}
<th class="session-status-col">${L(`sessionsView.status`)}</th>
${l(`updated`,L(`sessionsView.updated`))}
${l(`tokens`,L(`sessionsView.tokens`))}
<th class="session-actions-col">
<span class="sr-only">${L(`sessionsView.actions`)}</span>
</th>
</tr>
</thead>
<tbody>
${e.loading&&!e.result?pn(q(e)):n.length===0&&(e.loading||e.error||!e.result)?F:n.length===0?N`
<tr>
<td
colspan=${q(e)}
class="data-table-empty-cell"
>
<div class="data-table-empty-state" role="status" aria-live="polite">
<div class="data-table-empty-state__message">
${i?I.search:I.messageSquare}
<span>${u}</span>
</div>
${i?N`
<button class="btn btn--sm" @click=${e.onClearFilters}>
${L(`sessionsView.showAll`)}
</button>
`:F}
</div>
</td>
</tr>
`:r?r.flatMap(t=>{let n=t.rows.filter(e=>d?.has(e.key));if(n.length===0&&t.rows.length>0)return[];let r=n.flatMap(t=>Pn(t,e));return r.unshift(En(t,e)),r}):n.flatMap(t=>Pn(t,e))}
</tbody>
</table>
</div>
${o>0?N`
<div class="data-table-pagination">
<div class="data-table-pagination__info">
${L(`sessionsView.pagination`,{start:String(c*e.pageSize+1),end:String(Math.min((c+1)*e.pageSize,o)),total:String(o)})}
</div>
<div class="data-table-pagination__controls">
<select
class="data-table-pagination__size"
aria-label=${L(`sessionsView.pageSize`)}
.value=${String(e.pageSize)}
@change=${t=>e.onPageSizeChange(Number(t.target.value))}
>
${zn.map(t=>N`<option value=${t} ?selected=${t===e.pageSize}>
${L(`sessionsView.rowsPerPage`,{count:String(t)})}
</option>`)}
</select>
${e.result?.hasMore&&e.result.nextOffset!=null?N` <button ?disabled=${e.loading} @click=${e.onLoadMore}>
${L(`chat.selectors.loadMoreRosterSessions`)}
</button>`:F}
<button ?disabled=${c<=0} @click=${()=>e.onPageChange(c-1)}>
${L(`common.previous`)}
</button>
<button
?disabled=${c>=s-1}
@click=${()=>e.onPageChange(c+1)}
>
${L(`common.next`)}
</button>
</div>
</div>
`:F}
`}function Pn(e,t){let n=e.updatedAt?j(e.updatedAt):L(`common.na`),r=e.latestCompactionCheckpoint,i=e.compactionCheckpointCount??0,a=Math.max(i,+!!r),o=i>0||!!r,c=t.expandedSessionKey===e.key,l=`session-details-${encodeURIComponent(e.key)}`,u=s(e.displayName)??null,d=s(e.label)??``,f=!!(u&&u!==e.key&&u!==d),p=ne(e.key),m=p?rn(t.agentIdentityById,p.agentId):null,h=s(m?.emoji)??``,g=s(m?.name)??``,_=g&&p?`${h?`${h} `:``}${g} (${p.channel})`:null,v=_??e.key,y=e.kind!==`global`,b=y?A({face:S(e),sessionKey:e.key,fallbackAgentId:t.agentId,basePath:t.basePath,row:e,mainKey:t.mainKey,preferenceDerivedFace:!0}).href:null,x=`session-kind session-kind--${K(e)}`,C=[`session-data-row`,`session-data-row--expandable`,t.statusFilter===`all`&&e.archived===!0?`session-data-row--archived`:``,c?`session-data-row--expanded`:``,t.sessionMenu?.key===e.key?`session-data-row--menu-open`:``].filter(Boolean).join(` `),w=L(c?`sessionsView.hideSessionDetails`:`sessionsView.showSessionDetails`,{count:v}),T=t.groupBy===`category`,E=Tn(t,s(e.category)??null),D=n=>ve(n,n instanceof KeyboardEvent?n.currentTarget.querySelector(`button[aria-haspopup="menu"]`):null,(n,r,i)=>t.onOpenSessionMenu(e,{x:r,y:i},n));return[N`<tr
class=${C}
tabindex="0"
aria-expanded=${String(c)}
aria-controls=${l}
draggable=${T?`true`:F}
aria-description=${T?L(`sessionsView.dragSessionHint`):F}
@dragstart=${T?t=>{t.dataTransfer?.setData(H,e.key),t.dataTransfer&&(t.dataTransfer.effectAllowed=`move`)}:F}
@dragover=${E.dragover}
@dragleave=${E.dragleave}
@drop=${E.drop}
@contextmenu=${D}
@click=${n=>{On(n.target)||t.onToggleDetails(e.key)}}
@keydown=${n=>{D(n),!n.defaultPrevented&&(On(n.target)||(n.key===`Enter`||n.key===` `)&&(n.preventDefault(),t.onToggleDetails(e.key)))}}
>
<td class="data-table-checkbox-col">
<input
type="checkbox"
.checked=${t.selectedKeys.has(e.key)}
@change=${()=>t.onToggleSelect(e.key)}
aria-label=${`${L(`sessionsView.selectSession`)}: ${e.key}`}
/>
</td>
<td class="data-table-key-col">
<openclaw-tooltip .content=${v}>
<div class=${_?`session-key-cell`:`mono session-key-cell`}>
${cn(e)}
<div class="session-key-cell__text">
<span class="session-key-cell__primary">
${e.unread===!0?N`<span
class="session-unread-dot"
role="img"
aria-label=${L(`sessionsView.unread`)}
></span>`:F}
${y?N`<a
href=${b}
class="session-link"
@click=${n=>{ee(n)&&t.onNavigateToChat&&(n.preventDefault(),t.onNavigateToChat(e.key))}}
>${_??e.key}</a
>`:N`<span>${_??e.key}</span>`}
${d?N`<span class="session-label-chip" title=${d}
>${d}</span
>`:F}
</span>
${f?N`<span class="muted session-key-display-name">${u}</span>`:F}
</div>
</div>
</openclaw-tooltip>
</td>
${T?Dn(e,t):F}
<td>
<span class=${x}>${K(e)}</span>
</td>
<td class="session-status-col">
<div class="session-status-stack">
${sn(e)} ${xn(e.goal)}
${t.statusFilter===`all`&&e.archived===!0?B({kind:`muted`,label:L(`sessionsView.archived`)}):F}
</div>
</td>
<td>${n}</td>
<td class="session-token-cell">${ln(e)}</td>
<td class="session-actions-cell">
<div class="session-actions">
<button
class="session-details-toggle"
type="button"
aria-expanded=${String(c)}
aria-controls=${l}
aria-label=${w}
@click=${n=>{n.stopPropagation(),t.onToggleDetails(e.key)}}
>
${a>0?N`<span class="settings-count session-compaction-count"
>${a}</span
>`:F}
${I.chevronDown}
</button>
<button
class="icon-btn"
type="button"
title=${L(`chat.sidebar.openSessionMenu`)}
aria-label=${L(`chat.sidebar.openSessionMenu`)}
aria-haspopup="menu"
aria-expanded=${String(t.sessionMenu?.key===e.key)}
@click=${n=>{n.stopPropagation();let r=n.currentTarget,i=r.getBoundingClientRect();t.onOpenSessionMenu(e,{x:i.right,y:i.bottom+4},r)}}
>
${I.moreHorizontal}
</button>
</div>
</td>
</tr>`,...c?[Fn({row:e,props:t,detailsId:l,friendlyKeyLabel:_,displayName:u,showDisplayName:f,kindClass:x,updated:n,visibleCheckpointCount:a,hasCheckpoints:o})]:[]]}function Fn(e){let{row:t,props:n,detailsId:r,friendlyKeyLabel:i,displayName:a,showDisplayName:o,kindClass:c,updated:l,visibleCheckpointCount:u,hasCheckpoints:d}=e,f=t.thinkingLevel??``,p=f?z(f):``,m=W(an(t,n.result?.defaults),p),h=t.fastMode===`auto`?`auto`:t.fastMode===!0?`on`:t.fastMode===!1?`off`:``,g=W(G(Ln),h),_=t.verboseLevel??``,v=W(G(X,!0),_),y=t.reasoningLevel??``,b=W(G(Rn),y),x=n.checkpointItemsByKey[t.key]??[],S=n.checkpointErrorByKey[t.key],C=vn(u),w=Sn({row:t,updated:l,checkpointCount:u});return N`<tr id=${r} class="session-details-row">
<td colspan=${q(n)}>
<div class="session-details-panel">
<div class="session-details-panel__hero">
<div>
<div class="session-details-panel__eyebrow">${L(`sessionsView.sessionDetails`)}</div>
<div class="session-details-panel__title">${i??t.key}</div>
${o?N`<div class="muted session-details-panel__subtitle">${a}</div>`:F}
</div>
<div class="session-details-panel__badges">
${sn(t)} ${xn(t.goal)}
<span class=${c}>${K(t)}</span>
</div>
</div>
<div class="session-details-section">
<div class="session-details-panel__eyebrow">${L(`sessionsView.overrides`)}</div>
<div class="session-overrides-grid">
<label class="session-override-field">
<span class="session-override-field__label">${L(`sessionsView.label`)}</span>
<input
class="settings-input"
.value=${t.label??``}
?disabled=${n.loading||!!n.patchWriteDisabledReason}
title=${n.patchWriteDisabledReason??F}
placeholder=${L(`sessionsView.optionalPlaceholder`)}
@change=${e=>{let r=s(e.target.value)??null;n.onPatch(t.key,{label:r})}}
/>
</label>
${Y({label:L(`sessionsView.thinking`),disabled:n.loading||!!n.patchAdminDisabledReason,disabledReason:n.patchAdminDisabledReason,options:m,current:p,onChange:e=>n.onPatch(t.key,{thinkingLevel:e||null})})}
${Y({label:L(`sessionsView.fast`),disabled:n.loading||!!n.patchAdminDisabledReason,disabledReason:n.patchAdminDisabledReason,options:g,current:h,onChange:e=>n.onPatch(t.key,{fastMode:e===``?null:e===`auto`?`auto`:e===`on`})})}
${Y({label:L(`sessionsView.verbose`),disabled:n.loading||!!n.patchAdminDisabledReason,disabledReason:n.patchAdminDisabledReason,options:v,current:_,onChange:e=>n.onPatch(t.key,{verboseLevel:e||null})})}
${Y({label:L(`sessionsView.reasoning`),disabled:n.loading||!!n.patchAdminDisabledReason,disabledReason:n.patchAdminDisabledReason,options:b,current:y,onChange:e=>n.onPatch(t.key,{reasoningLevel:e||null})})}
</div>
</div>
<div class="session-details-grid">
${w.map(e=>N`
<div class="session-detail-stat">
<div class="session-detail-stat__label">${e.label}</div>
<openclaw-tooltip .content=${e.value}>
<div class="session-detail-stat__value">${e.value}</div>
</openclaw-tooltip>
</div>
`)}
</div>
<div class="session-details-section">
<div class="session-details-section__header">
<div>
<div class="session-details-panel__eyebrow">
${L(`sessionsView.compactionHistory`)}
</div>
<div class="session-details-section__title">${C}</div>
</div>
</div>
${n.checkpointLoadingKey===t.key?N`<div class="muted session-details-empty">
${L(`sessionsView.loadingCheckpoints`)}
</div>`:S?N`<div class="callout danger" role="alert">${S}</div>`:!d||x.length===0?N`<div class="muted session-details-empty">
${L(`sessionsView.noCheckpoints`)}
</div>`:N`
<div class="session-checkpoint-list">
${x.map(e=>N`
<div class="session-checkpoint-card">
<div class="session-checkpoint-card__header">
<strong>
${_n(e.reason)} ·
${j(e.createdAt)}
</strong>
<span class="muted session-checkpoint-card__delta">
${yn(e)}
</span>
</div>
${e.summary?N`<div class="session-checkpoint-card__summary">
${e.summary}
</div>`:N`<div class="muted">${L(`sessionsView.noSummary`)}</div>`}
<div class="session-checkpoint-card__actions">
<button
class="btn btn--sm"
?disabled=${n.checkpointBusyKey===e.checkpointId||!!n.checkpointBranchDisabledReason}
title=${n.checkpointBranchDisabledReason??F}
@click=${()=>n.onBranchFromCheckpoint(t.key,e.checkpointId)}
>
${L(`sessionsView.branchFromCheckpoint`)}
</button>
<button
class="btn btn--sm"
?disabled=${n.checkpointBusyKey===e.checkpointId||!!n.checkpointRestoreDisabledReason}
title=${n.checkpointRestoreDisabledReason??F}
@click=${()=>n.onRestoreCheckpoint(t.key,e.checkpointId)}
>
${L(`sessionsView.restoreCheckpoint`)}
</button>
</div>
</div>
`)}
</div>
`}
</div>
</div>
</td>
</tr>`}var In,X,Ln,Rn,zn,Bn,Vn,Hn,Un,Wn,Gn,Z,Q;function Kn(){return(Kn=e((()=>{a(),M(),Mt(),Me(),Ne(),Fe(),jt(),tt(),Pe(),he(),qe(),ue(),pe(),Ut(),x(),Et(),bt(),p(),at(),f(),oe(),In=[`off`,`minimal`,`low`,`medium`,`high`],X=[``,`off`,`on`,`full`],Ln=[``,`auto`,`on`,`off`],Rn=[``,`off`,`on`,`stream`],zn=[10,25,50,100],Bn={queued:`sessionsView.statusQueued`,running:`sessionsView.statusRunning`,done:`sessionsView.statusDone`,failed:`sessionsView.statusFailed`,killed:`sessionsView.statusKilled`,timeout:`sessionsView.statusTimeout`},Vn={cron:I.clock,direct:I.messageSquare,group:I.users,global:I.globe,unknown:I.circle},Hn=65,Un=85,Wn=4,Gn={manual:`sessionsView.manual`,"auto-threshold":`sessionsView.autoThreshold`,"overflow-retry":`sessionsView.overflowRetry`,"timeout-retry":`sessionsView.timeoutRetry`},Z=`__new-group__`,Q={none:`sessionsView.groupByNone`,category:`sessionsView.groupByCategory`,person:`sessionsView.groupByPerson`,channel:`sessionsView.groupByChannel`,kind:`sessionsView.groupByKind`,agent:`sessionsView.groupByAgent`,date:`sessionsView.groupByDate`}})))()}var qn,Jn,$;function Yn(){return(Yn=e((()=>{d(),ze(),a(),M(),Ce(),Oe(),je(),De(),Gt(),zt(),Ye(),ot(),Ke(),Xe(),Ge(),qt(),tt(),Vt(),Pe(),be(),Ze(),D(),Be(),St(),le(),kt(),T(),ut(),p(),f(),ft(),Ft(),Lt(),me(),ht(),re(),m(),xt(),Xt(),$t(),nn(),te(),Kn(),i(),qn=`https://docs.openclaw.ai/concepts/session`,Jn=200,$=class extends ce{constructor(...e){super(...e),this.result=null,this.loading=!1,this.error=null,this.activeMinutes=``,this.limit=`50`,this.includeGlobal=!0,this.includeUnknown=!1,this.statusFilter=`active`,this.searchQuery=``,this.transcriptSearchQuery=``,this.submittedTranscriptSearchQuery=``,this.sortColumn=`updated`,this.sortDir=`desc`,this.groupBy=en(),this.page=0,this.pageSize=25,this.selectedKeys=new Set,this.sessionMenu=null,this.sessionMenuWork=null,this.expandedSessionKey=null,this.deepLinkSessionKey=null,this.checkpointItemsByKey={},this.checkpointTaskKey=null,this.checkpointBusyKey=null,this.checkpointErrorByKey={},this.pageEpoch=0,this.pluginActionLifetime=new AbortController,this.routeDataEnabled=!0,this.sessionMutationPending=!1,this.sessionMenuTrigger=null,this.sessionMenuWorkVersion=0,this.observeAgentScope=Je(()=>{this.resetTranscriptSearchState(this.transcriptSearchQuery),this.deepLinkSessionKey||(this.page=0,this.selectedKeys=new Set,this.routeDataEnabled=!1,this.clearSearchTimer(),this.bindSessionList()),this.requestUpdate()}),this.subscriptions=new Se(this).watch(()=>this.context?.agentIdentity,(e,t)=>e.subscribe(t)).effect(()=>this.context?.agentSelection,e=>this.observeAgentScope(e)).watch(()=>this.context?.runtimeConfig,(e,t)=>e.subscribe(t)).watch(()=>this.context?.plugins,(e,t)=>e.subscribe(t)),this.gatewayLifecycle=new dt(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>{let e=this.listBinding?.sessions.listSnapshot(this.listBinding.query).result;this.resetProviderState(),this.appliedListResult=e},invalidateRequests:()=>this.invalidatePageWork()}),this.transcriptSearchTask=new Ie(this,{args:()=>{let e=this.context,t=e?.gateway.snapshot;return[t?.phase===`connected`?t.client??null:null,this.submittedTranscriptSearchQuery,e??null,e?.agentSelection.state.scopeId??null,t?R(t,`sessions.search`)===!0:!1]},task:async([e,t,n,r,i],{signal:a})=>{if(!e||!t||!n||!i)return Re;let{results:o,indexing:s=!1,truncated:c=!1}=await Pt({client:e,query:t,listSessions:n.sessions.list,listOptions:this.sessionListOptions(n,``),isCurrent:()=>!a.aborted,resolveAgentId:e=>E(e)?.agentId??this.sessionAgentId(e,n)});return{results:o,indexing:s,truncated:c}}}),this.checkpointTask=new Ie(this,{autoRun:!1,args:()=>[null,``],task:async([e,t])=>!e||!t?Re:{sessionKey:t,checkpoints:await e.sessions.listCheckpoints(t,{agentId:this.sessionAgentId(t,e.context)})},onComplete:({sessionKey:e,checkpoints:t})=>{this.checkpointItemsByKey={...this.checkpointItemsByKey,[e]:t}},onError:e=>{let t=this.checkpointTaskKey;t&&(this.checkpointErrorByKey={...this.checkpointErrorByKey,[t]:y(e)})}}),this.dialogLifecycle=null}willUpdate(e){let t=this.context?.sessions;t&&this.listBinding&&this.listBinding.sessions!==t&&(this.unsubscribeList?.(),this.unsubscribeList=void 0,this.listBinding=void 0,this.invalidatePageWork(),this.resetProviderState()),(e.has(`routeData`)||e.has(`context`))&&this.applyRouteData(),this.bindSessionList()}disconnectedCallback(){this.unsubscribeList?.(),this.unsubscribeList=void 0,this.listBinding=void 0,this.subscriptions.clear(),this.invalidatePageWork(),this.dialogLifecycle?.abort(),super.disconnectedCallback()}invalidatePageWork(){this.pluginActionLifetime.abort(),this.pluginActionLifetime=new AbortController,this.pageEpoch+=1,this.clearSearchTimer(),this.listRequest=void 0,this.resetTranscriptSearchState(this.transcriptSearchQuery),this.resetCheckpointTask(),this.loading=!1,this.checkpointBusyKey=null,this.sessionMutationPending=!1,this.closeSessionMenu()}resetProviderState(){this.result=null,this.error=null,this.loading=!1,this.resetTranscriptSearchState(``),this.selectedKeys=new Set,this.expandedSessionKey=null,this.deepLinkSessionKey=null,this.checkpointItemsByKey={},this.checkpointTaskKey=null,this.checkpointBusyKey=null,this.checkpointErrorByKey={},this.appliedListResult=void 0}captureRequestScope(){let e=this.context;if(!this.isConnected||!e)return null;let t=e.gateway,n=this.gatewayLifecycle.gateway===t?this.gatewayLifecycle.client:null;return!this.gatewayLifecycle.connected||!n?null:{epoch:this.pageEpoch,context:e,gateway:t,sessions:e.sessions,client:n}}isRequestScopeCurrent(e){let t=this.context,n=t?.gateway;return this.isConnected&&this.pageEpoch===e.epoch&&t===e.context&&n===e.gateway&&t.sessions===e.sessions&&n.snapshot.phase===`connected`&&n.snapshot.client===e.client}mutationDisabledReason(e){let t=_e(this.context?.gateway.snapshot,e);return t.allowed?void 0:t.reason}requireMutationAccess(e,t){let n=_e(e.gateway.snapshot,t);return n.allowed?!0:(this.error=n.reason,!1)}selectedDeleteDisabledReason(){let e=new Map(this.result?.sessions.map(e=>[e.key,e])??[]);for(let t of this.selectedKeys){let n=e.get(t),r=this.mutationDisabledReason({method:`sessions.delete`,params:{key:t,...n?.archived===!0?{archivedOnly:!0}:{}}});if(r)return r}}applyRouteData(){let e=this.routeData,t=this.context;!e||!t||(e!==this.appliedRouteData&&(this.appliedRouteData=e,this.routeDataEnabled=!0),this.routeDataEnabled&&(this.statusFilter=e.statusFilter,e.expandedSessionKey?(this.activeMinutes=``,this.limit=`50`,this.includeGlobal=!0,this.includeUnknown=!0,this.searchQuery=``,this.page=0,this.selectedKeys=new Set):(this.activeMinutes=``,this.limit=`50`,this.includeGlobal=!0,this.includeUnknown=!1),this.expandedSessionKey=e.expandedSessionKey,this.deepLinkSessionKey=e.expandedSessionKey,e.expandedSessionKey&&this.loadCheckpoint(e.expandedSessionKey)))}sessionAgentId(e,t=this.context){if(!t)return;let{agentId:n}=ye({assistantAgentId:t.agentSelection.state.selectedId,hello:t.gateway.snapshot.hello},e);return n}sessionPathAgentId(e,t){return this.sessionAgentId(e,t)??O(t)}sessionListOptions(e,n=this.searchQuery){return w(e,{activeMinutes:t(this.activeMinutes),limit:t(this.limit)??50,includeGlobal:this.includeGlobal,includeUnknown:this.includeUnknown,statusFilter:this.statusFilter,deepLinkSessionKey:this.deepLinkSessionKey,search:n})}bindSessionList(e=!0){let t=this.context;if(!t||!this.isConnected)return;let n=t.sessions,r=this.sessionListOptions(t),i=JSON.stringify(r),a=this.listBinding,o=JSON.stringify(this.sessionListOptions(t,``));(a?.sessions!==n||a.key!==i)&&(a?.sessions===n&&n.listSnapshot(a.query).loading&&this.loadSessionList(a),this.unsubscribeList?.(),this.unsubscribeList=void 0,(a?.sessions!==n||a.transcriptKey!==o)&&this.resetTranscriptSearchState(this.transcriptSearchQuery),this.result=null,this.error=null,this.selectedKeys=new Set,this.page=0,this.listBinding={sessions:n,query:r,key:i,transcriptKey:o},this.appliedListResult=void 0);let s=this.listBinding;if(this.unsubscribeList||(this.loading=t.gateway.snapshot.phase===`connected`,!this.captureRequestScope()||this.searchTimer!==void 0||this.listRequest))return s;let c=e=>{this.applyListSnapshot(s,e)};this.unsubscribeList=n.subscribeList(r,c);let l=n.listSnapshot(r);return c(l),e&&(!l.result||l.loading)&&this.loadSessionList(s),s}applyListSnapshot(e,t){if(this.listBinding!==e||this.context?.sessions!==e.sessions)return;this.loading=t.loading,this.error=t.error;let n=t.result;if(!n||n===this.appliedListResult)return;let r=this.result;this.appliedListResult=n,this.result=fe(n,{archivedFilter:this.statusFilter}),this.ensureAgentIdentities(this.result);let i=this.reconcileCheckpointCache(r,this.result);i&&this.loadCheckpoint(i)}async refreshSessionList(e=this.captureRequestScope()){if(!e)return;this.routeDataEnabled=!1,this.clearSearchTimer();let t=this.bindSessionList(!1);!t||t.sessions!==e.sessions||!this.isRequestScopeCurrent(e)||(await this.loadSessionList(t,{force:!0}),this.isRequestScopeCurrent(e)&&this.listBinding===t&&this.applyListSnapshot(t,t.sessions.listSnapshot(t.query)))}loadSessionList(e,t={}){if(this.listRequest)return t.force&&this.unsubscribeList&&e.sessions.refreshList({...e.query,...t}),this.listRequest;if(!this.captureRequestScope())return Promise.resolve();let n,r=new Promise(e=>{n=e}).finally(()=>{this.listRequest===r&&(this.listRequest=void 0,this.bindSessionList())});return this.listRequest=r,n(e.sessions.refreshList({...e.query,...t})),r}clearSearchTimer(){clearTimeout(this.searchTimer),this.searchTimer=void 0}adoptCurrentListSnapshot(){let e=this.listBinding;e&&this.applyListSnapshot(e,e.sessions.listSnapshot(e.query))}resetTranscriptSearchState(e){this.transcriptSearchQuery=e,this.submittedTranscriptSearchQuery=``,this.transcriptSearchTask.run()}updateTranscriptSearchQuery(e){e!==this.transcriptSearchQuery&&this.resetTranscriptSearchState(e)}async runTranscriptSearch(){let e=this.transcriptSearchQuery.trim();if(!e){this.resetTranscriptSearchState(``);return}let t=this.captureRequestScope();!t||R(t.gateway.snapshot,`sessions.search`)!==!0||(this.transcriptSearchQuery=e,this.submittedTranscriptSearchQuery=e,await this.transcriptSearchTask.run())}ensureAgentIdentities(e){let t=this.context;if(!t||!e)return;let n=Jt(e).filter(e=>!t.agentIdentity.get(e));n.length!==0&&t.agentIdentity.ensure(n)}reconcileCheckpointCache(e,t){let n=new Map((t?.sessions??[]).map(e=>[e.key,e])),r=new Map((e?.sessions??[]).map(e=>[e.key,e])),i={...this.checkpointItemsByKey},a={...this.checkpointErrorByKey},o=null;for(let e of Object.keys(i)){let t=n.get(e),s=r.get(e);(!t||!s||s.compactionCheckpointCount!==t.compactionCheckpointCount||s.latestCompactionCheckpoint?.checkpointId!==t.latestCompactionCheckpoint?.checkpointId)&&(delete i[e],delete a[e],this.expandedSessionKey===e&&(o=e))}return this.checkpointItemsByKey=i,this.checkpointErrorByKey=a,o}updateFilters(e){this.activeMinutes=e.activeMinutes,this.limit=e.limit,this.includeGlobal=e.includeGlobal,this.includeUnknown=e.includeUnknown,this.page=0,this.selectedKeys=new Set,this.deepLinkSessionKey=null,this.refreshSessionList()}updateStatusFilter(e){let t=this.context;e===this.statusFilter||!t||(this.statusFilter=e,this.clearSearchTimer(),this.page=0,this.selectedKeys=new Set,this.deepLinkSessionKey=null,this.loading=!0,this.error=null,t.navigate(`sessions`,e===`active`?void 0:{search:`?status=${e}`}))}async deleteSelected(){let e=[...this.selectedKeys];if(e.length===0||this.loading||this.sessionMutationPending)return;let t=this.captureRequestScope();if(!t)return;let n=new Map(this.result?.sessions.map(e=>[e.key,e])??[]),r=e.map(e=>n.get(e)??{key:e}),i=L(e.length===1?`sessionsView.deleteSelectedConfirmOne`:`sessionsView.deleteSelectedConfirm`,{count:String(e.length)});!await V({message:i,confirmLabel:L(`common.delete`),danger:!0})||!this.isRequestScopeCurrent(t)||await this.deleteSessions(r)}async deleteSessions(e,t={}){if(e.length===0||this.loading||this.sessionMutationPending)return;let n=this.captureRequestScope();if(!n)return;let r=e.map(e=>({key:e.key,agentId:this.sessionAgentId(e.key,n.context),...t,...e.sessionId?{expectedSessionId:e.sessionId}:{},...e.archived===!0?{archivedOnly:!0}:{}}));for(let e of r)if(!this.requireMutationAccess(n,{method:`sessions.delete`,params:e}))return;this.sessionMutationPending=!0;let i=null;try{let e=await n.sessions.deleteMany(r);if(!this.isRequestScopeCurrent(n))return;if(e.preservedWorktrees.length>0&&window.alert(It(e.preservedWorktrees)),e.deleted.length>0){let t=new Set(e.deleted),r=new Set(this.selectedKeys);for(let t of e.deleted)r.delete(t);this.selectedKeys=r,this.expandedSessionKey&&t.has(this.expandedSessionKey)&&(this.expandedSessionKey=null),this.deepLinkSessionKey&&t.has(this.deepLinkSessionKey)&&(this.deepLinkSessionKey=null);let i=e.deleted.find(e=>xe(e,n.gateway.snapshot.sessionKey));if(i){let e=E(i)?.agentId??n.context.agentSelection.state.selectedId??`main`;Ee({selection:n.context.agentSelection,gateway:n.gateway,agentId:e,sessionKey:ie({agentId:e,mainKey:k({agentsList:n.context.agents.state.agentsList,hello:n.gateway.snapshot.hello})})})}}await this.refreshSessionList(n),e.errors.length>0&&(i=_(e.errors.join(`; `)))}catch(e){this.isRequestScopeCurrent(n)&&(i=y(e))}finally{this.isRequestScopeCurrent(n)&&(this.sessionMutationPending=!1,this.adoptCurrentListSnapshot(),i&&(this.error=i))}}async deleteAllArchived(){let e=this.captureRequestScope();if(!e||this.loading||this.sessionMutationPending)return;let t;try{let{search:n,agentId:r,...i}=this.sessionListOptions(e.context),a=e.context.agentSelection.state.scopeId?.trim(),o={...i,...a?{agentId:a}:{}},s=await gt({list:t=>e.sessions.list({...o,limit:1e3,offset:t}),isCurrent:()=>this.isRequestScopeCurrent(e),missingResultError:e.sessions.state.error??`archived session enumeration returned no result`,stalledPaginationError:`archived session enumeration did not advance`,incompletePaginationError:`archived session enumeration was incomplete`});if(!s)return;t=s}catch(t){this.isRequestScopeCurrent(e)&&(this.error=y(t));return}let n=t.filter(e=>e.archived===!0);n.length!==0&&(!await V({message:L(`sessionsView.deleteAllArchivedConfirm`,{count:String(n.length)}),confirmLabel:L(`common.delete`),danger:!0})||!this.isRequestScopeCurrent(e)||await this.deleteSessions(n,{deleteTranscript:!0}))}async deleteSessionFromMenu(e){let t=s(e.label)??e.key,n=this.captureRequestScope();!n||!await V({message:L(`sessionsView.deleteSessionConfirm`,{session:t}),confirmLabel:L(`common.delete`),danger:!0})||!this.isRequestScopeCurrent(n)||await this.deleteSessions([e])}async stopCloudWorker(e){let t=s(e.label)??e.key,n=We(e.placement);if(!n||n.blocksActiveRun&&e.hasActiveRun===!0)return;let r=this.captureRequestScope();if(!r||!await V({message:L(`sessionsView.stopCloudWorkerConfirm`,{session:t}),confirmLabel:L(`sessionsView.stopCloudWorkerConfirmAction`),danger:!0})||!this.isRequestScopeCurrent(r)||!this.requireMutationAccess(r,n))return;this.sessionMutationPending=!0;let i=null;try{let t=E(e.key)?.agentId;await Rt(r.client,{key:e.key,...t?{agentId:t}:{}},r.context.placementStartup),this.isRequestScopeCurrent(r)&&await this.refreshSessionList(r)}catch(e){this.isRequestScopeCurrent(r)&&(i=y(e))}finally{this.isRequestScopeCurrent(r)&&(this.sessionMutationPending=!1,this.adoptCurrentListSnapshot(),i&&(this.error=i))}}knownCategories(){return Zt(this.result,this.context?.sessions.state.groups??[])}setGroupBy(e){this.groupBy=e,this.page=0,tn(e)}async rememberCustomGroup(e,t=this.captureRequestScope()){return t?this.requireMutationAccess(t,{method:`sessions.groups.put`,requiredScope:`operator.write`})?Qt({name:e,knownCategories:this.knownCategories(),sessions:t.sessions,isCurrent:()=>this.isRequestScopeCurrent(t),onError:e=>{this.error=e}}):`failed`:`stale`}assignCategory(e,t){let n=this.result?.sessions.find(t=>t.key===e);n&&(n.category?.trim()||null)!==t&&(t&&this.rememberCustomGroup(t),this.patchSession(e,{category:t}))}async withDialogLifecycle(e){let t=this.dialogLifecycle;if(t)return e(t.signal);let n=new AbortController;this.dialogLifecycle=n;try{return await e(n.signal)}finally{this.dialogLifecycle===n&&(this.dialogLifecycle=null)}}async loadInputDialog(){try{return(await o(async()=>{let{showInputDialog:e}=await import(`./input-dialog-C6w2KAqY.js`);return{showInputDialog:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8]),import.meta.url)).showInputDialog}catch(e){return this.error=y(e),null}}async requestNewCategory(e){let t=this.result?.sessions.find(t=>t.key===e);if(e&&!t?.sessionId){this.error=L(`common.refresh`);return}await this.withDialogLifecycle(async e=>{await(await this.loadInputDialog())?.({signal:e,title:L(`sessionsView.newGroupTitle`),label:L(`sessionsView.newGroupPrompt`),submitLabel:L(`sessionsView.newGroupCreate`),requireValue:!0,submit:e=>this.writeNewCategory(e,t)})})}async writeNewCategory(e,t){this.error=null;let n=this.captureRequestScope();if(!n)return L(`sessionsView.newGroupFailed`);let r=await this.rememberCustomGroup(e,n);if(r!==`completed`)return r===`failed`?this.error??L(`sessionsView.newGroupFailed`):L(`sessionsView.newGroupStale`);if(!t)return null;let i=await this.patchSession(t.key,{category:e},n,t.sessionId);return i===`failed`?this.error??L(`sessionsView.newGroupFailed`):i===`stale`?L(`sessionsView.newGroupStale`):null}async renameSession(e){let t=await this.withDialogLifecycle(async t=>await(await this.loadInputDialog())?.({signal:t,title:L(`sessionsView.renameSessionPrompt`),defaultValue:s(e.label)??``})??null);if(t===null)return;let n={label:s(t)??null};this.patchSession(e.key,n,void 0,e.sessionId)}async patchSession(e,t,n=this.captureRequestScope(),r){if(!n)return this.error=L(`sessionsView.actionRequiresConnection`),`failed`;if(typeof t.archived==`boolean`&&!r?.trim())return this.error=`Session lifecycle action requires a durable session identity.`,`failed`;let i=this.sessionAgentId(e,n.context);if(!this.requireMutationAccess(n,{method:`sessions.patch`,params:{key:e,...t,...i?{agentId:i}:{}}}))return`failed`;try{let a=await n.sessions.patch(e,t,{agentId:i,...r?{expectedSessionId:r}:{}});if(!this.isRequestScopeCurrent(n))return`stale`;if(!a)return this.error=n.sessions.state.error,`failed`;if(await this.refreshSessionList(n),!this.isRequestScopeCurrent(n))return`stale`;let o=new Set(this.selectedKeys);return o.delete(e),this.selectedKeys=o,`completed`}catch(e){return this.isRequestScopeCurrent(n)?(this.error=y(e),`failed`):`stale`}}async archiveSessionWithUndo(e){let t=this.captureRequestScope();if(!t||await this.patchSession(e.key,{archived:!0},t,e.sessionId)!==`completed`||!this.isRequestScopeCurrent(t))return;let n=this.sessionAgentId(e.key,t.context);ge({message:L(`sessionsView.sessionArchived`),actionLabel:L(`common.undo`),onAction:()=>{t.sessions.patch(e.key,{archived:!1,...e.pinned===!0?{pinned:!0}:{}},{agentId:n,expectedSessionId:e.sessionId})}})}async forkSession(e,t=!1){let n=this.captureRequestScope();if(!n)return;let r=this.sessionAgentId(e,n.context),i={parentSessionKey:e,fork:!0,...t?{forkFrom:`last-completed`}:{},...r?{agentId:r}:{}};if(this.requireMutationAccess(n,{method:`sessions.create`,params:i}))try{let e=await n.sessions.create(i);if(!this.isRequestScopeCurrent(n))return;e?n.context.navigate(`chat`,{...A({context:n.context,face:`chat`,sessionKey:e,agentId:r??this.sessionPathAgentId(e,n.context)}).options,hash:``}):n.sessions.state.error&&(this.error=n.sessions.state.error)}catch(e){this.isRequestScopeCurrent(n)&&(this.error=y(e))}}async toggleSessionDetails(e){if(!this.context)return;let t=this.deepLinkSessionKey!==null;if(this.deepLinkSessionKey=null,t&&this.refreshSessionList(),this.expandedSessionKey===e){this.resetCheckpointTask(),this.expandedSessionKey=null;return}this.expandedSessionKey=e;let n=this.result?.sessions.find(t=>t.key===e);if(!((n?.compactionCheckpointCount??0)>0||n?.latestCompactionCheckpoint)){this.checkpointItemsByKey[e]||(this.checkpointItemsByKey={...this.checkpointItemsByKey,[e]:[]});return}this.checkpointItemsByKey[e]||await this.loadCheckpoint(e)}async loadCheckpoint(e){let t=this.captureRequestScope();if(!t){this.checkpointErrorByKey={...this.checkpointErrorByKey,[e]:L(`sessionsView.actionRequiresConnection`)};return}this.checkpointTaskKey=e,this.checkpointErrorByKey={...this.checkpointErrorByKey,[e]:``},await this.checkpointTask.run([t,e])}resetCheckpointTask(){this.checkpointTaskKey=null,this.checkpointTask.run([null,``])}get checkpointLoadingKey(){return this.checkpointTask.status===Le.PENDING?this.checkpointTaskKey:null}async branchCheckpoint(e,t){let n=this.captureRequestScope();if(!(!n||!await V({message:L(`sessionsView.branchCheckpointConfirm`),confirmLabel:L(`common.create`)})||!this.isRequestScopeCurrent(n))&&this.requireMutationAccess(n,{method:`sessions.compaction.branch`,requiredScope:`operator.write`})){this.checkpointBusyKey=t;try{let r=await n.sessions.branchCheckpoint(e,t,{agentId:this.sessionAgentId(e,n.context)});this.isRequestScopeCurrent(n)&&n.context.navigate(`chat`,{...A({context:n.context,face:`chat`,sessionKey:r.key,agentId:this.sessionPathAgentId(r.key,n.context)}).options,hash:``})}catch(e){this.isRequestScopeCurrent(n)&&(this.error=y(e))}finally{this.isRequestScopeCurrent(n)&&this.checkpointBusyKey===t&&(this.checkpointBusyKey=null)}}}async restoreCheckpoint(e,t){let n=this.captureRequestScope();if(!(!n||!await V({message:L(`sessionsView.restoreCheckpointConfirm`),confirmLabel:L(`common.restore`),danger:!0})||!this.isRequestScopeCurrent(n))&&this.requireMutationAccess(n,{method:`sessions.compaction.restore`,requiredScope:`operator.admin`})){this.checkpointBusyKey=t;try{await n.sessions.restoreCheckpoint(e,t,{agentId:this.sessionAgentId(e,n.context)})}catch(e){this.isRequestScopeCurrent(n)&&(this.error=y(e))}finally{this.isRequestScopeCurrent(n)&&this.checkpointBusyKey===t&&(this.checkpointBusyKey=null)}}}openSessionMenu(e,t,n){if(this.sessionMenu?.key===e.key&&this.sessionMenu.sessionId===e.sessionId&&n){this.closeSessionMenu();return}this.sessionMenu={key:e.key,sessionId:e.sessionId,...t},this.sessionMenuTrigger=n,this.loadSessionMenuWork(e)}closeSessionMenu(){this.context&&Dt(this.context.gateway).unwatch(this),this.sessionMenu=null,this.sessionMenuTrigger=null,this.sessionMenuWorkVersion+=1,this.sessionMenuWork=null}loadSessionMenuWork(e){let t=++this.sessionMenuWorkVersion;if(!e.worktree){this.sessionMenuWork=null;return}this.sessionMenuWork={loading:!0,pullRequestUrl:null,worktreePath:null};let n=this.captureRequestScope();if(!n){this.sessionMenuWork={loading:!1,pullRequestUrl:null,worktreePath:null};return}let r=Dt(n.context.gateway),i=wt(e.key,this.sessionAgentId(e.key,n.context));$e({client:n.client,loadPullRequests:R(n.context.gateway.snapshot,`controlUi.sessionPullRequests.subscribe`)===!0?()=>r.load(this,i):void 0,worktreeId:e.worktree.id,execNode:e.execNode}).then(e=>{t===this.sessionMenuWorkVersion&&(this.sessionMenuWork={loading:!1,...e})})}renderSessionMenu(){let e=this.sessionMenu,t=this.context,n=e?this.result?.sessions.find(t=>t.key===e.key&&t.sessionId===e.sessionId):null;if(!e||!t||!n)return F;let r=t.gateway.snapshot,i=k({agentsList:t.agents.state.agentsList,hello:r.hello}),a=b(n,i),o=v([n],i),c=We(n.placement),l=!!(c&&(c.method!==`sessions.reclaim`||n.hasActiveRun!==!0)&&R(r,c.method)===!0);return N`
<openclaw-session-menu
.session=${{label:s(n.label)??n.key,sessionId:s(n.sessionId)??null,pinned:n.pinned===!0,unread:n.unread===!0,archived:n.archived===!0,category:s(n.category)??null,icon:s(n.icon)??null,color:s(n.color)??null,categoryClearReturnsToGroups:!1}}
.anchor=${e}
.trigger=${this.sessionMenuTrigger}
.disabled=${this.loading}
.navigationAllowed=${!0}
.copyMarkdownAllowed=${pt(r)}
.splitAllowed=${!1}
.actionDisabledReasons=${He({snapshot:r,session:n,cloudWorkerStopAction:c})}
.forkDisabled=${n.modelSelectionLocked===!0}
.forkFromLastCompleted=${n.hasActiveRun===!0}
.archiveAllowed=${a}
.deleteAllowed=${o}
.cloudWorkerStopAllowed=${l}
.groups=${this.knownCategories()}
.work=${this.sessionMenuWork}
.pluginActions=${Tt(t.plugins,n)}
.onClose=${()=>this.closeSessionMenu()}
.onAction=${r=>{switch(r.kind){case`open-pr`:At(r.url);break;case`open-in`:Qe(r.editor,r.path);break;case`copy-session-id`:case`copy-session-link`:case`copy-markdown`:case`open-new-tab`:case`open-new-window`:case`split-right`:case`split-below`:vt(r.kind,{context:t,session:n,agentId:n.agentId,isCurrent:()=>this.isConnected&&this.context===t});break;case`toggle-pin`:this.patchSession(n.key,{pinned:n.pinned!==!0});break;case`toggle-unread`:this.patchSession(n.key,{unread:n.unread!==!0});break;case`rename`:this.renameSession(n);break;case`set-color`:this.patchSession(n.key,{color:r.color});break;case`set-icon`:this.patchSession(n.key,{icon:r.icon});break;case`reset-appearance`:this.patchSession(n.key,{icon:null,color:null});break;case`fork`:this.forkSession(n.key,n.hasActiveRun===!0);break;case`plugin`:this.runPluginAction(r.id,e);break;case`move-to-group`:this.assignCategory(n.key,r.category);break;case`new-group`:this.requestNewCategory(n.key);break;case`toggle-archived`:n.archived===!0?this.patchSession(n.key,{archived:!1},void 0,n.sessionId):this.archiveSessionWithUndo(n);break;case`assign-owner`:this.context?.sessions.assignOwner(n.key,r.owner);break;case`stop-cloud-worker`:this.stopCloudWorker(n);break;case`delete`:this.deleteSessionFromMenu(n)}}}
></openclaw-session-menu>
`}render(){let e=this.context,t=(this.result?.owners?.length??0)>1;return e?N`
${Kt({active:`sessions`,title:Ae(`sessions`),subtitle:N`${Te(`sessions`)} ${st(qn)}`,actions:Wt({agents:e.agents.state.agentsList?.agents??[],selection:e.agentSelection}),onSelect:t=>{t!==`sessions`&&e.navigate(t)}})}
${Bt(An({loading:this.loading,result:this.result,error:this.error,activeMinutes:this.activeMinutes,limit:this.limit,includeGlobal:this.includeGlobal,includeUnknown:this.includeUnknown,statusFilter:this.statusFilter,basePath:e.basePath,agentId:O(e),mainKey:k({agentsList:e.agents.state.agentsList,hello:e.gateway.snapshot.hello}),searchQuery:this.searchQuery,transcriptSearchAvailable:R(e.gateway.snapshot,`sessions.search`)===!0,transcriptSearchQuery:this.transcriptSearchQuery,transcriptSearch:this.transcriptSearchTask.render({initial:()=>({status:`idle`}),pending:()=>({status:`loading`}),complete:e=>({status:`results`,...e}),error:e=>({status:`error`,message:y(e)})}),agentIdentityById:Yt(this.result,t=>e.agentIdentity.get(t)??void 0),sortColumn:this.sortColumn,sortDir:this.sortDir,groupBy:t||this.groupBy!==`person`?this.groupBy:`none`,personGroupingAvailable:t,knownCategories:this.knownCategories(),page:this.page,pageSize:this.pageSize,selectedKeys:this.selectedKeys,sessionMenu:this.sessionMenu,expandedSessionKey:this.expandedSessionKey,checkpointItemsByKey:this.checkpointItemsByKey,checkpointLoadingKey:this.checkpointLoadingKey,checkpointBusyKey:this.checkpointBusyKey,checkpointErrorByKey:this.checkpointErrorByKey,patchWriteDisabledReason:this.mutationDisabledReason({method:`sessions.patch`,params:{key:``,label:null}}),patchAdminDisabledReason:this.mutationDisabledReason({method:`sessions.patch`,params:{key:``,thinkingLevel:null}}),groupWriteDisabledReason:this.mutationDisabledReason({method:`sessions.groups.put`,requiredScope:`operator.write`}),deleteArchivedDisabledReason:this.mutationDisabledReason({method:`sessions.delete`,params:{key:``,archivedOnly:!0,deleteTranscript:!0}}),checkpointBranchDisabledReason:this.mutationDisabledReason({method:`sessions.compaction.branch`,requiredScope:`operator.write`}),checkpointRestoreDisabledReason:this.mutationDisabledReason({method:`sessions.compaction.restore`,requiredScope:`operator.admin`}),deleteSelectedDisabledReason:this.selectedDeleteDisabledReason(),onFiltersChange:e=>this.updateFilters(e),onClearFilters:()=>{this.activeMinutes=``,this.limit=`50`,this.includeGlobal=!0,this.includeUnknown=!1,this.searchQuery=``,this.page=0,this.selectedKeys=new Set,this.deepLinkSessionKey=null,this.refreshSessionList()},onSearchChange:e=>{this.routeDataEnabled=!1,this.deepLinkSessionKey=null,this.searchQuery=e,this.page=0,this.selectedKeys=new Set,this.clearSearchTimer(),this.captureRequestScope()&&(this.searchTimer=setTimeout(()=>{this.searchTimer=void 0,this.bindSessionList()},Jn)),this.bindSessionList()},onTranscriptSearchChange:e=>this.updateTranscriptSearchQuery(e),onTranscriptSearch:()=>void this.runTranscriptSearch(),onClearTranscriptSearch:()=>this.resetTranscriptSearchState(``),onSortChange:(e,t)=>{this.sortColumn=e,this.sortDir=t,this.page=0},onGroupByChange:e=>this.setGroupBy(e),onAssignCategory:(e,t)=>this.assignCategory(e,t),onRequestNewCategory:e=>void this.requestNewCategory(e),onLoadMore:()=>{let e=this.listBinding,t=this.result?.nextOffset;e&&this.result?.hasMore&&t!=null&&!this.loading&&this.loadSessionList(e,{offset:t,append:!0})},onPageChange:e=>{this.page=e},onPageSizeChange:e=>{this.pageSize=e,this.page=0},onRefresh:()=>void this.refreshSessionList(),onStatusFilterChange:e=>this.updateStatusFilter(e),onDeleteAllArchived:()=>void this.deleteAllArchived(),onPatch:(e,t)=>void this.patchSession(e,t),onToggleSelect:e=>{let t=new Set(this.selectedKeys);t.has(e)?t.delete(e):t.add(e),this.selectedKeys=t},onSelectPage:e=>{this.selectedKeys=new Set([...this.selectedKeys,...e])},onDeselectPage:e=>{let t=new Set(this.selectedKeys);for(let n of e)t.delete(n);this.selectedKeys=t},onDeselectAll:()=>{this.selectedKeys=new Set},onDeleteSelected:()=>void this.deleteSelected(),onNavigateToChat:t=>{let n=ae(e,t);e.navigate(n,{...A({context:e,face:n,sessionKey:t,agentId:this.sessionPathAgentId(t,e),preferenceDerivedFace:!0}).options,hash:``})},onOpenSessionMenu:(e,t,n)=>this.openSessionMenu(e,t,n),onToggleDetails:e=>void this.toggleSessionDetails(e),onBranchFromCheckpoint:(e,t)=>void this.branchCheckpoint(e,t),onRestoreCheckpoint:(e,t)=>void this.restoreCheckpoint(e,t)}),{id:`sessions-hub-panel`})}
${this.renderSessionMenu()}
`:N``}async runPluginAction(e,t){let n=this.captureRequestScope();if(n)try{await Ot({runtime:n.context.plugins,id:e,placement:`session`,sessionKey:t.key,session:this.result?.sessions.find(e=>e.key===t.key&&e.sessionId===t.sessionId),signal:this.pluginActionLifetime.signal})}catch(e){this.isRequestScopeCurrent(n)&&(this.error=y(e))}}},u([r({context:ke,subscribe:!0})],$.prototype,`context`,void 0),u([we({attribute:!1})],$.prototype,`routeData`,void 0),u([P()],$.prototype,`result`,void 0),u([P()],$.prototype,`loading`,void 0),u([P()],$.prototype,`error`,void 0),u([P()],$.prototype,`activeMinutes`,void 0),u([P()],$.prototype,`limit`,void 0),u([P()],$.prototype,`includeGlobal`,void 0),u([P()],$.prototype,`includeUnknown`,void 0),u([P()],$.prototype,`statusFilter`,void 0),u([P()],$.prototype,`searchQuery`,void 0),u([P()],$.prototype,`transcriptSearchQuery`,void 0),u([P()],$.prototype,`submittedTranscriptSearchQuery`,void 0),u([P()],$.prototype,`sortColumn`,void 0),u([P()],$.prototype,`sortDir`,void 0),u([P()],$.prototype,`groupBy`,void 0),u([P()],$.prototype,`page`,void 0),u([P()],$.prototype,`pageSize`,void 0),u([P()],$.prototype,`selectedKeys`,void 0),u([P()],$.prototype,`sessionMenu`,void 0),u([P()],$.prototype,`sessionMenuWork`,void 0),u([P()],$.prototype,`expandedSessionKey`,void 0),u([P()],$.prototype,`checkpointItemsByKey`,void 0),u([P()],$.prototype,`checkpointTaskKey`,void 0),u([P()],$.prototype,`checkpointBusyKey`,void 0),u([P()],$.prototype,`checkpointErrorByKey`,void 0),customElements.get(`openclaw-sessions-page`)||customElements.define(`openclaw-sessions-page`,$)})))()}Yn();
//# sourceMappingURL=sessions-page-BQweWmCm.js.map