719 lines
70 KiB
JavaScript
719 lines
70 KiB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Di as t,Ei as n,Sn as r,Tn as i,Yt as a,bn as o,er as s,nn as c,yn as l}from"./control-ui-foundation-CeFMP1Ly.js";import{Bc as u,C as d,Da as f,E as p,Na as m,S as ee,To as te,U as ne,ao as re,b as ie,bc as ae,bt as oe,dl as se,fl as ce,g as le,gs as ue,hs as de,ja as fe,ka as pe,ml as me,ni as he,ti as ge,vr as _e,w as h,x as ve,xo as ye,xt as be,yr as xe,yt as Se}from"./control-ui-core-pH6nakZ-.js";import{G as g,J as _,W as v,Z as Ce,at as y,rt as b}from"./lit-runtime-BEtFSUCp.js";import{$t as we,An as Te,B as Ee,Cn as De,F as Oe,U as ke,en as Ae,ln as je,m as Me,p as Ne,qn as Pe,zn as x}from"./control-ui-core-DGVkFhVB.js";import{Ht as S,Lt as C,Qt as Fe,Rt as w,Zt as Ie,qt as T}from"./control-ui-core-Br5DB0Zj.js";import{In as Le,Ln as Re}from"./control-ui-boot-wpHCbPL9.js";import{a as ze,n as Be,r as Ve}from"./gateway-runtime-DUNO4Mi1.js";import{Hc as He,bn as Ue,cl as We,il as Ge,ol as E,on as Ke,rl as qe,xn as Je}from"./control-ui-boot-Cdpgu1Gm.js";import{ct as Ye,st as Xe}from"./control-ui-boot-BPFwXC8p.js";import{t as Ze}from"./web-awesome-popover-DTDr8XNA.js";import{n as Qe,t as $e}from"./hub-tabs-mHLCJmKB.js";import{n as et,t as tt}from"./settings-workspace-Bo4nqRhI.js";import{n as nt,t as rt}from"./stream-auto-follow-controller-DQpG-yCd.js";function it(e){return e===`24h`||e===`7d`||e===`30d`||e===`all`}function D(e){return e?.trim()||void 0}function at(e){let t=new URLSearchParams(e),n=t.get(`time`);return{personId:D(t.get(`person`))??null,query:t.get(`q`)?.trim()??``,time:it(n)?n:k}}function ot(e){let t=new URLSearchParams;e.time!==k&&t.set(`time`,e.time),e.personId&&t.set(Te,e.personId),e.query&&t.set(`q`,e.query);let n=t.toString();return n?`?${n}`:``}function O(e){return e.lastActivityAt??e.updatedAt??e.createdAt??0}function st(e,t){return O(t)-O(e)||(e.key<t.key?-1:+(e.key>t.key))}function ct(e){let t=e.owner?.actor??e.createdActor,n=D(e.agentId),{resourceBasePath:r}=oe();return{id:D(t?.id)??n??`system`,name:D(t?.label)??n,avatarUrl:t?D(t.avatarUrl):n?Xe(`agentAvatar`,r,n):void 0,watchedSessions:[]}}function lt(e){let t=new Date(e),n=String(t.getMonth()+1).padStart(2,`0`),r=String(t.getDate()).padStart(2,`0`);return`${t.getFullYear()}-${n}-${r}`}function ut(e){let t=new Date(e);return new Date(t.getFullYear(),t.getMonth(),t.getDate()).getTime()}function dt(e){let t=e?.sessions??[],n=(e?.people??[]).map(e=>({id:e.identity.id,name:e.label,avatarUrl:e.avatarUrl,watchedSessions:[],count:e.sessionCount})),r=new Map;for(let e of t){let t=O(e),n=t>0?lt(t):`unknown`,i=r.get(n);i?i.push(e):r.set(n,[e])}return{days:[...r.entries()].map(([e,t])=>({key:e,timestamp:e===`unknown`?null:ut(O(t[0])),sessions:t})),matchedCount:e?.totalCount??t.length,people:n,sessions:t,timeCount:e?.peopleSessionCount??t.length}}function ft(e,t){let n=new Set(e.watchedSessions);return t.filter(e=>n.has(e.key)).toSorted(st)}var pt,k;function A(){return(A=e((()=>{Ye(),x(),Se(),pt=[`24h`,`7d`,`30d`,`all`],k=`7d`})))()}function mt(e,t){let n=`?view=run&${e.kind}=${encodeURIComponent(e.id)}`;return t&&(n+=`&receipt=${encodeURIComponent(t.id)}`,t.decisionCursor&&(n+=`&decision=${encodeURIComponent(t.decisionCursor)}`)),n}function j(e,t,n){return`${Pe(`activity`,t)}${mt(e,n)}`}function ht(e,t){return j({kind:`run`,id:e},t)}function gt(e){let t=new URLSearchParams(e);if(t.get(`view`)===`live`)return{mode:`live`,selector:null};if(t.get(`view`)!==`run`)return{mode:`sessions`,filters:at(e),selector:null};let n=t.get(`execution`),r=t.get(`receipt`)?.trim()||null,i=r&&t.get(`decision`)?.trim()||null;if(n?.trim())return{mode:`run`,selector:{kind:`execution`,id:n},selectorId:r,decisionCursor:i};let a=t.get(`run`);return{mode:`run`,selector:a?.trim()?{kind:`run`,id:a}:null,selectorId:r,decisionCursor:i}}function _t(e,t){return new Map(e.map(e=>[e.selectorId,t]))}function vt(e,t){if(e.identity.state!==`present`||t.identity.state!==`present`||e.run.executionId!==t.run.executionId||e.identity.context.contextId!==t.identity.context.contextId)return null;let n=new Map(e.decisionDisplays.map(e=>[e.selectorId,e]));for(let e of t.decisionDisplays)n.set(e.selectorId,e);return{...t,decisionDisplays:[...n.values()]}}function yt(e){let t=e.identity;return t.state===`present`?`present`:t.state===`ambiguous`?`ambiguous`:t.reasonCode===`run_not_found`||t.reasonCode===`execution_not_found`?`not-found`:t.reasonCode===`identity_context_corrupt`?`corrupt`:t.state===`unsupported`&&t.remediation.some(e=>e.code===`run_again_after_expiry`)?`expired`:t.state}function M(){return(M=e((()=>{x(),A()})))()}var N,P;function F(){return(F=e((()=>{Fe(),N={activity:{title:`Activity`,visibleCount:`{visible} of {total}`,search:`Search`,searchPlaceholder:`Filter by activity, summary, run, session`,filters:`Filters`,toolFilter:`Tool`,allTools:`All tools`,statusFilters:`Status filters`,autoFollow:`Auto-follow`,expandAll:`Expand all`,collapseAll:`Collapse all`,clear:`Clear`,empty:`No activity yet.`,emptyFiltered:`No activity matches these filters.`,argumentHiddenOne:`1 argument hidden`,argumentsHidden:`{count} arguments hidden`,streamLabel:`Agent activity entries`,toolCallId:`Tool call`,runId:`Run`,session:`Session`,outputTruncated:`Preview redacted and truncated.`,noOutputPreview:`No output preview.`,answerCandidate:{title:`Answer candidate`,itemId:`Item`,candidate:`Candidate answer`,superseded:`Superseded answer`,selected:`Selected answer`},status:{running:`Running`,done:`Done`,error:`Error`},runInspector:{activityView:`Activity view`,liveMode:`Live activity`,mode:`Run inspector`,intro:`Durable Gateway-backed identity evidence for one run. Reloading this page queries the Gateway again.`,bestEffortWarning:`Best-effort audit warning: this view is for operational diagnostics, not a lossless compliance record. Absence of evidence does not prove that an action or run did not occur.`,evidenceStateLabel:`Evidence state: {state}`,evidenceState:{present:`Present`,absent:`Absent`,unknown:`Unknown`,unsupported:`Unsupported`},coverageStatusLabel:`Inspection coverage: {state}`,coverage:{enforced:{label:`Enforced`,description:`A decision receipt proves identity-aware evaluation; it does not by itself mean the action was allowed.`},attributionOnly:{label:`Attribution only`,description:`Identity facts were recorded, but no identity-aware policy or grant evaluation is proven.`},unattributed:{label:`Unattributed`,description:`The supported path was observed without a usable invoker principal.`},unknown:{label:`Unknown`,description:`Expected evidence is missing, corrupt, expired unexpectedly, or unreadable.`},unsupported:{label:`Unsupported`,description:`This path has no Phase 0 identity evidence contract.`}},facts:{trustDomain:`Trust domain`,ingress:`Ingress`,invoker:`Invoker`,representedSubject:`Represented subject`,sponsor:`Sponsor`,agentPrincipal:`Agent principal`,agentDefinition:`Agent definition`,runtimeInstance:`Runtime instance`,applicableGrants:`Applicable grants`,applicableGrant:`Applicable grant {index}`,assuranceEvidence:`Assurance evidence`,assuranceEvidenceItem:`Assurance evidence {index}`,lineage:`Lineage`},values:{label:`Label`,kind:`Kind`,operation:`Operation`,principalReference:`Principal reference`,domainReference:`Domain reference`,owningBoundary:`Owning boundary`,sourceReference:`Source reference`,relationshipReference:`Relationship reference`,definitionReference:`Definition reference`,revisionReference:`Revision reference`,runtimeReference:`Runtime reference`,grantReference:`Grant reference`,strength:`Strength`,evidenceReference:`Evidence reference`,depth:`Depth`,parentRunReference:`Parent run reference`,parentExecutionReference:`Parent execution reference`,parentContextReference:`Parent context reference`,delegationReference:`Delegation reference`},reasons:{absent:`No {label} was recorded at the owning boundary.`,unknown:`The {label} was expected, but its evidence is unavailable or unreadable.`,unsupported:`This execution path does not provide {label} evidence.`,invokerAbsent:`The supported ingress boundary recorded no usable invoker principal.`,noGrants:`No applicable grants were recorded for this run.`,noAssurance:`No assurance evidence was recorded for this run.`,noLineage:`No parent or subagent lineage was recorded for this run.`},identityHeading:`Identity and authority`,missingEvidenceHeading:`Missing evidence`,noMissingEvidence:`No missing evidence was reported for this projection.`,nextStepsHeading:`Next steps`,decisions:{heading:`Decision receipts`,none:`No decision receipts were returned for this bounded page.`,returned:`Showing {count} retained decision receipts.`,listLabel:`Decision receipt list`,inspectLabel:`{summary}. Outcome: {outcome}. Evidence classification: {classification}.`,detailHeading:`Receipt detail`,requestedHeading:`What was requested`,outcomeHeading:`What happened`,outcomeLabel:`Outcome`,classificationLabel:`Evidence classification`,reasonLabel:`Recorded reason`,occurredAtLabel:`Recorded at`,ownerHeading:`Display provenance`,durableOwnerLabel:`Verified producer`,boundaryLabel:`Decision boundary`,ownerNote:`The Gateway exposes explanations only from a verified owning call path. Receipt-controlled explanations and next steps are hidden; the Control UI does not infer trust from receipt metadata.`,evidenceHeading:`Evidence limits`,contextFieldsLabel:`Context fields used`,noContextFields:`No context fields were recorded as used.`,policyCountLabel:`Policy references used`,grantCountLabel:`Grant references used`,notFoundTitle:`Receipt not found on this page`,notFoundDescription:`The selected receipt is not present in this retained page. Return to the first page or use a current receipt link.`,readOnly:`Decision receipts are read-only. This view cannot approve, edit, or repeat an action.`,more:`Additional decision receipts are available.`,loadMore:`Load more receipts`,loadingMore:`Loading receipts…`,loadMoreError:`More receipts could not be loaded. The receipts already shown remain unchanged.`,bounded:`Decision inspection is bounded to at most 50 records per request.`,outcomes:{allowed:`Allowed`,denied:`Denied`,notApplicable:`Not applicable`,unknown:`Unknown`}},diagnosticReason:`Diagnostic reason:`,diagnostic:{notFound:{title:`Run not found`,description:`No retained run or identity record matched this reference. Missing best-effort evidence does not prove that the run never occurred.`},expired:{title:`Identity evidence expired`,description:`The Gateway found the run, but its identity context is outside the 30-day retention window.`},corrupt:{title:`Identity evidence is corrupt`,description:`The Gateway found evidence for this run but could not validate the stored identity context.`},ambiguous:{title:`Multiple executions match this run`,description:`A run reference can correlate more than one execution. The inspector will not guess which execution you meant.`},unsupported:{title:`Identity evidence unsupported`,description:`The run is known, but this execution path did not retain a supported identity context.`},unknown:{title:`Identity evidence unknown`,description:`The path promises evidence, but the expected record is missing, unreadable, or otherwise unavailable.`}},candidates:{listLabel:`Matching executions`,recorded:`Recorded {date}`,executionReference:`Inspect execution`,more:`More matching executions exist beyond this bounded page.`,loadMore:`Load more executions`,loadingMore:`Loading executions…`,loadMoreError:`More executions could not be loaded. Try again.`},panels:{empty:{title:`No run selected`,description:`Open a link shaped like /activity?view=run&run=<run-id> to inspect durable identity evidence.`},waiting:{title:`Waiting for the Gateway`,description:`The durable projection will load when this browser reconnects.`},loading:{title:`Loading run inspection`,description:`Reading the Gateway's retained identity projection…`},disconnected:{title:`Gateway disconnected`,description:`Run identity is durable on the Gateway, but it cannot be read while this browser is disconnected.`},unauthorized:{title:`Operator read access required`,description:`This connection does not have operator.read, so retained run identity cannot be loaded.`},unsupported:{title:`Run inspection unsupported`,description:`This Gateway does not offer audit.run.inspect. Upgrade the Gateway, enable execution identity collection, and record a new run.`},error:{title:`Run inspection failed`,description:`The Gateway could not return this diagnostic projection. No identity facts were inferred from Live activity.`}},restart:`Restart inspection`,retry:`Retry inspection`}}},P=Object.assign(()=>{Ie.activity=N.activity},{catalog:N})})))()}function I(e){return e===`attribution-only`?`attributionOnly`:e}function L(e){return T(`activity.runInspector.coverage.${I(e)}.label`)}function R(e,t=!1,n){let r=_`<bdi
|
||
class=${t?`run-inspector__ref mono`:`run-inspector__ref`}
|
||
dir="ltr"
|
||
>${e}</bdi
|
||
>`;return n?_`<a href=${n}>${r}</a>`:r}function bt(e,t,n){return n===6?_`<h6 id=${t}>${e}</h6>`:_`<h3 id=${t}>${e}</h3>`}function z(e,t={}){let n=t.headingId??`run-inspector-missing-heading`;return _`
|
||
<section class="run-inspector__section" aria-labelledby=${n}>
|
||
${bt(T(`activity.runInspector.missingEvidenceHeading`),n,t.headingLevel??3)}
|
||
${e.length===0?_`<p>${T(`activity.runInspector.noMissingEvidence`)}</p>`:_`<ul class="run-inspector__code-list">
|
||
${e.map(e=>_`<li>${R(e,!0)}</li>`)}
|
||
</ul>`}
|
||
</section>
|
||
`}function xt(e,t={}){if(e.length===0)return g;let n=t.headingId??`run-inspector-remediation-heading`;return _`
|
||
<section class="run-inspector__section" aria-labelledby=${n}>
|
||
${bt(T(`activity.runInspector.nextStepsHeading`),n,t.headingLevel??3)}
|
||
<ul class="run-inspector__remediation-list">
|
||
${e.map(e=>_`<li>
|
||
<span>${e.text}</span> ${R(e.code,!0)}
|
||
</li>`)}
|
||
</ul>
|
||
</section>
|
||
`}function St(e,t,n,r){return j(e,r,{id:t,decisionCursor:n})}function B(e){return T(`activity.runInspector.decisions.outcomes.${e===`not-applicable`?`notApplicable`:e}`)}function Ct(e,t){return e.length===0?_`<p class="run-inspector__reason">${t}</p>`:_`<ul class="run-inspector__code-list">
|
||
${e.map(e=>_`<li>${R(e,!0)}</li>`)}
|
||
</ul>`}function wt(e){let t=e.enforcement.coverageState;return _`
|
||
<article class="run-inspector__receipt-detail" aria-labelledby="run-inspector-receipt-detail">
|
||
<h4 id="run-inspector-receipt-detail">
|
||
${T(`activity.runInspector.decisions.detailHeading`)}
|
||
</h4>
|
||
<section aria-labelledby="run-inspector-receipt-requested">
|
||
<h5 id="run-inspector-receipt-requested">
|
||
${T(`activity.runInspector.decisions.requestedHeading`)}
|
||
</h5>
|
||
${e.action.summary?_`<p>${e.action.summary}</p>`:g}
|
||
<dl class="run-inspector__values">
|
||
<div>
|
||
<dt>${T(`activity.runInspector.values.kind`)}</dt>
|
||
<dd>${R(e.action.family)}</dd>
|
||
</div>
|
||
<div>
|
||
<dt>${T(`activity.runInspector.values.operation`)}</dt>
|
||
<dd>${R(e.action.operation)}</dd>
|
||
</div>
|
||
</dl>
|
||
</section>
|
||
<section aria-labelledby="run-inspector-receipt-outcome">
|
||
<h5 id="run-inspector-receipt-outcome">
|
||
${T(`activity.runInspector.decisions.outcomeHeading`)}
|
||
</h5>
|
||
<div class="run-inspector__receipt-badges">
|
||
<span
|
||
class="run-inspector__receipt-badge run-inspector__receipt-badge--${e.decision.outcome}"
|
||
aria-label=${`${T(`activity.runInspector.decisions.outcomeLabel`)}: ${B(e.decision.outcome)}`}
|
||
>
|
||
${B(e.decision.outcome)}
|
||
</span>
|
||
<span
|
||
class="run-inspector__receipt-badge run-inspector__receipt-badge--${t}"
|
||
aria-label=${`${T(`activity.runInspector.decisions.classificationLabel`)}: ${L(t)}`}
|
||
>
|
||
${L(t)}
|
||
</span>
|
||
</div>
|
||
<p class="run-inspector__reason">
|
||
${T(`activity.runInspector.coverage.${I(t)}.description`)}
|
||
</p>
|
||
<dl class="run-inspector__values">
|
||
<div>
|
||
<dt>${T(`activity.runInspector.decisions.reasonLabel`)}</dt>
|
||
<dd>${R(e.decision.reasonCode,!0)}</dd>
|
||
</div>
|
||
<div>
|
||
<dt>${T(`activity.runInspector.decisions.occurredAtLabel`)}</dt>
|
||
<dd>${new Date(e.occurredAt).toLocaleString()}</dd>
|
||
</div>
|
||
</dl>
|
||
</section>
|
||
<section aria-labelledby="run-inspector-receipt-owner">
|
||
<h5 id="run-inspector-receipt-owner">
|
||
${T(`activity.runInspector.decisions.ownerHeading`)}
|
||
</h5>
|
||
${e.provenance.state===`verified`?_`<dl class="run-inspector__values">
|
||
<div>
|
||
<dt>${T(`activity.runInspector.decisions.durableOwnerLabel`)}</dt>
|
||
<dd>${R(e.provenance.producer)}</dd>
|
||
</div>
|
||
</dl>
|
||
<p class="run-inspector__reason">
|
||
${T(`activity.runInspector.decisions.ownerNote`)}
|
||
</p>`:_`<p class="run-inspector__reason">
|
||
${T(`activity.runInspector.decisions.ownerNote`)}
|
||
</p>`}
|
||
</section>
|
||
<section aria-labelledby="run-inspector-receipt-evidence">
|
||
<h5 id="run-inspector-receipt-evidence">
|
||
${T(`activity.runInspector.decisions.evidenceHeading`)}
|
||
</h5>
|
||
<dl class="run-inspector__values">
|
||
<div>
|
||
<dt>${T(`activity.runInspector.decisions.policyCountLabel`)}</dt>
|
||
<dd>${e.enforcement.policyCount}</dd>
|
||
</div>
|
||
<div>
|
||
<dt>${T(`activity.runInspector.decisions.grantCountLabel`)}</dt>
|
||
<dd>${e.enforcement.grantCount}</dd>
|
||
</div>
|
||
</dl>
|
||
<h6>${T(`activity.runInspector.decisions.contextFieldsLabel`)}</h6>
|
||
${Ct(e.enforcement.contextFieldsUsed,T(`activity.runInspector.decisions.noContextFields`))}
|
||
${z(e.missingEvidence,{headingId:`run-inspector-receipt-missing-heading`,headingLevel:6})}
|
||
</section>
|
||
${xt(e.remediation,{headingId:`run-inspector-receipt-remediation-heading`,headingLevel:6})}
|
||
</article>
|
||
`}function Tt(e,t,n,r,i){let a=e.result,o=n?a.decisionDisplays.find(e=>e.selectorId===n):a.decisionDisplays[0];return _`
|
||
<section class="run-inspector__section" aria-labelledby="run-inspector-decisions-heading">
|
||
<h3 id="run-inspector-decisions-heading">${T(`activity.runInspector.decisions.heading`)}</h3>
|
||
${a.decisionDisplays.length===0?_`<p>${T(`activity.runInspector.decisions.none`)}</p>`:_`<p>
|
||
${T(`activity.runInspector.decisions.returned`,{count:String(a.decisionDisplays.length)})}
|
||
</p>`}
|
||
<div class="run-inspector__warning" role="note">
|
||
${T(`activity.runInspector.decisions.readOnly`)}
|
||
</div>
|
||
${a.decisionDisplays.length>0&&t?_`<ol
|
||
class="run-inspector__receipt-list"
|
||
aria-label=${T(`activity.runInspector.decisions.listLabel`)}
|
||
>
|
||
${a.decisionDisplays.map(n=>{let i=o?.selectorId===n.selectorId;return _`<li>
|
||
<a
|
||
href=${St(t,n.selectorId,e.receiptPageCursors.get(n.selectorId),r)}
|
||
aria-current=${i?`true`:g}
|
||
aria-label=${T(`activity.runInspector.decisions.inspectLabel`,{summary:n.action.summary??`${n.action.family} · ${n.action.operation}`,outcome:B(n.decision.outcome),classification:L(n.enforcement.coverageState)})}
|
||
>
|
||
<span
|
||
>${n.action.summary??`${n.action.family} · ${n.action.operation}`}</span
|
||
>
|
||
<span class="run-inspector__receipt-badges" aria-hidden="true">
|
||
<span
|
||
class="run-inspector__receipt-badge run-inspector__receipt-badge--${n.decision.outcome}"
|
||
>${B(n.decision.outcome)}</span
|
||
>
|
||
<span
|
||
class="run-inspector__receipt-badge run-inspector__receipt-badge--${n.enforcement.coverageState}"
|
||
>${L(n.enforcement.coverageState)}</span
|
||
>
|
||
</span>
|
||
</a>
|
||
</li>`})}
|
||
</ol>`:g}
|
||
${a.nextDecisionCursor?_`<div class="run-inspector__pagination">
|
||
<span>${T(`activity.runInspector.decisions.more`)}</span>
|
||
<button
|
||
type="button"
|
||
class="btn"
|
||
?disabled=${e.decisionPageStatus===`loading`}
|
||
@click=${i}
|
||
>
|
||
${e.decisionPageStatus===`loading`?T(`activity.runInspector.decisions.loadingMore`):T(`activity.runInspector.decisions.loadMore`)}
|
||
</button>
|
||
${e.decisionPageStatus===`error`?_`<span role="alert">
|
||
${T(`activity.runInspector.decisions.loadMoreError`)}
|
||
</span>`:g}
|
||
</div>`:_`<div class="run-inspector__pagination" role="note">
|
||
${T(`activity.runInspector.decisions.bounded`)}
|
||
</div>`}
|
||
${n&&!o?_`<div class="run-inspector__result-state" role="status">
|
||
<h4>${T(`activity.runInspector.decisions.notFoundTitle`)}</h4>
|
||
<p>${T(`activity.runInspector.decisions.notFoundDescription`)}</p>
|
||
${t?_`<a href=${j(t,r)}>
|
||
${T(`activity.runInspector.decisions.heading`)}
|
||
</a>`:g}
|
||
</div>`:o?wt(o):g}
|
||
</section>
|
||
`}function Et(){return(Et=e((()=>{v(),S(),M()})))()}function Dt(e){return T(`activity.runInspector.evidenceState.${e}`)}function Ot(e,t){switch(t){case`absent`:return T(`activity.runInspector.reasons.absent`,{label:e.toLowerCase()});case`unknown`:return T(`activity.runInspector.reasons.unknown`,{label:e.toLowerCase()});case`unsupported`:return T(`activity.runInspector.reasons.unsupported`,{label:e.toLowerCase()});case`present`:return}return t}function V(e){return e?[...e.displayLabel?[{label:T(`activity.runInspector.values.label`),value:e.displayLabel}]:[],{label:T(`activity.runInspector.values.kind`),value:e.kind},{label:T(`activity.runInspector.values.principalReference`),value:e.principalRef,mono:!0},{label:T(`activity.runInspector.values.domainReference`),value:e.domainRef,mono:!0}]:[]}function kt(e){let t=e.values??[],n=e.reason??Ot(e.label,e.state);return _`
|
||
<div class="run-inspector__fact" data-state=${e.state}>
|
||
<dt>
|
||
<span>${e.label}</span>
|
||
<span
|
||
class="run-inspector__state run-inspector__state--${e.state}"
|
||
aria-label=${T(`activity.runInspector.evidenceStateLabel`,{state:Dt(e.state)})}
|
||
>
|
||
${Dt(e.state)}
|
||
</span>
|
||
</dt>
|
||
<dd>
|
||
${t.length>0?_`<dl class="run-inspector__values">
|
||
${t.map(e=>_`
|
||
<div>
|
||
<dt>${e.label}</dt>
|
||
<dd>${R(e.value,e.mono,e.href)}</dd>
|
||
</div>
|
||
`)}
|
||
</dl>`:g}
|
||
${n?_`<p class="run-inspector__reason">${n}</p>`:g}
|
||
</dd>
|
||
</div>
|
||
`}function At(e,t){let n=e.representedSubject,r=e.sponsor,i=e.lineage;return[{label:T(`activity.runInspector.facts.trustDomain`),state:e.trustDomain.state,values:[{label:T(`activity.runInspector.values.kind`),value:e.trustDomain.kind},{label:T(`activity.runInspector.values.domainReference`),value:e.trustDomain.domainRef,mono:!0}]},{label:T(`activity.runInspector.facts.ingress`),state:e.ingress.state,values:[{label:T(`activity.runInspector.values.kind`),value:e.ingress.kind},{label:T(`activity.runInspector.values.owningBoundary`),value:e.ingress.boundary,mono:!0},...e.ingress.sourceRef?[{label:T(`activity.runInspector.values.sourceReference`),value:e.ingress.sourceRef,mono:!0}]:[]]},{label:T(`activity.runInspector.facts.invoker`),state:e.invoker.state,values:V(e.invoker.principal),reason:e.invoker.state===`absent`?T(`activity.runInspector.reasons.invokerAbsent`):void 0},{label:T(`activity.runInspector.facts.representedSubject`),state:n?.state??`absent`,values:V(n?.principal)},{label:T(`activity.runInspector.facts.sponsor`),state:r?.state??`absent`,values:[...V(r?.principal),...r?.relationshipRef?[{label:T(`activity.runInspector.values.relationshipReference`),value:r.relationshipRef,mono:!0}]:[]]},{label:T(`activity.runInspector.facts.agentDefinition`),state:e.agentDefinition.state,values:[{label:T(`activity.runInspector.values.definitionReference`),value:e.agentDefinition.definitionRef,mono:!0},...e.agentDefinition.revisionRef?[{label:T(`activity.runInspector.values.revisionReference`),value:e.agentDefinition.revisionRef,mono:!0}]:[]]},{label:T(`activity.runInspector.facts.agentPrincipal`),state:`present`,values:V(e.agentPrincipal)},{label:T(`activity.runInspector.facts.runtimeInstance`),state:e.runtimeInstance.state,values:[{label:T(`activity.runInspector.values.kind`),value:e.runtimeInstance.kind},{label:T(`activity.runInspector.values.runtimeReference`),value:e.runtimeInstance.runtimeRef,mono:!0}]},...e.applicableGrants.length===0?[{label:T(`activity.runInspector.facts.applicableGrants`),state:`absent`,reason:T(`activity.runInspector.reasons.noGrants`)}]:e.applicableGrants.map((e,t)=>({label:T(`activity.runInspector.facts.applicableGrant`,{index:String(t+1)}),state:e.state,values:[{label:T(`activity.runInspector.values.grantReference`),value:e.grantRef,mono:!0}]})),...e.assurance.length===0?[{label:T(`activity.runInspector.facts.assuranceEvidence`),state:`absent`,reason:T(`activity.runInspector.reasons.noAssurance`)}]:e.assurance.map((e,t)=>({label:T(`activity.runInspector.facts.assuranceEvidenceItem`,{index:String(t+1)}),state:`present`,values:[{label:T(`activity.runInspector.values.kind`),value:e.kind},{label:T(`activity.runInspector.values.strength`),value:e.strength},{label:T(`activity.runInspector.values.evidenceReference`),value:e.evidenceRef,mono:!0}]})),{label:T(`activity.runInspector.facts.lineage`),state:i?`present`:`absent`,values:i?[{label:T(`activity.runInspector.values.depth`),value:i.depth},...i.parentRunId?[{label:T(`activity.runInspector.values.parentRunReference`),value:i.parentRunId,mono:!0,href:j({kind:`run`,id:i.parentRunId},t)}]:[],...i.parentExecutionId?[{label:T(`activity.runInspector.values.parentExecutionReference`),value:i.parentExecutionId,mono:!0}]:[],...i.parentContextId?[{label:T(`activity.runInspector.values.parentContextReference`),value:i.parentContextId,mono:!0}]:[],...i.delegationRef?[{label:T(`activity.runInspector.values.delegationReference`),value:i.delegationRef,mono:!0}]:[],...V(i.parentAgentPrincipal)]:[],reason:i?void 0:T(`activity.runInspector.reasons.noLineage`)}]}function jt(e){let t=yt(e);switch(t){case`not-found`:return{title:T(`activity.runInspector.diagnostic.notFound.title`),description:T(`activity.runInspector.diagnostic.notFound.description`)};case`expired`:return{title:T(`activity.runInspector.diagnostic.expired.title`),description:T(`activity.runInspector.diagnostic.expired.description`)};case`corrupt`:return{title:T(`activity.runInspector.diagnostic.corrupt.title`),description:T(`activity.runInspector.diagnostic.corrupt.description`)};case`ambiguous`:return{title:T(`activity.runInspector.diagnostic.ambiguous.title`),description:T(`activity.runInspector.diagnostic.ambiguous.description`)};case`unsupported`:return{title:T(`activity.runInspector.diagnostic.unsupported.title`),description:T(`activity.runInspector.diagnostic.unsupported.description`)};case`unknown`:return{title:T(`activity.runInspector.diagnostic.unknown.title`),description:T(`activity.runInspector.diagnostic.unknown.description`)};case`present`:return null}return t}function Mt(e,t,n,r){let i=jt(e);if(!i||e.identity.state===`present`)return g;let a=e.identity;return _`
|
||
<div class="run-inspector__result-state" role="status" aria-label=${i.title}>
|
||
<h3>${i.title}</h3>
|
||
<p>${i.description}</p>
|
||
<p>
|
||
${T(`activity.runInspector.diagnosticReason`)}
|
||
${R(a.reasonCode,!0)}
|
||
</p>
|
||
</div>
|
||
${a.state===`ambiguous`?_`
|
||
<ol
|
||
class="run-inspector__candidate-list"
|
||
aria-label=${T(`activity.runInspector.candidates.listLabel`)}
|
||
>
|
||
${a.candidates.map(e=>_`
|
||
<li>
|
||
<span
|
||
>${T(`activity.runInspector.candidates.recorded`,{date:new Date(e.createdAt).toLocaleString()})}</span
|
||
>
|
||
<a
|
||
href=${j({kind:`execution`,id:e.executionId},t)}
|
||
>
|
||
${T(`activity.runInspector.candidates.executionReference`)}
|
||
${R(e.executionId,!0)}
|
||
</a>
|
||
</li>
|
||
`)}
|
||
</ol>
|
||
${e.nextExecutionCursor?_`<div class="run-inspector__pagination">
|
||
<span>${T(`activity.runInspector.candidates.more`)}</span>
|
||
<button
|
||
type="button"
|
||
class="btn"
|
||
?disabled=${n===`loading`}
|
||
@click=${r}
|
||
>
|
||
${T(n===`loading`?`activity.runInspector.candidates.loadingMore`:`activity.runInspector.candidates.loadMore`)}
|
||
</button>
|
||
${n===`error`?_`<span role="alert">
|
||
${T(`activity.runInspector.candidates.loadMoreError`)}
|
||
</span>`:g}
|
||
</div>`:g}
|
||
`:g}
|
||
${z(a.missingEvidence)}
|
||
${xt(a.remediation)}
|
||
`}function Nt(e,t,n,r,i,a){let o=e.result,s=L(o.coverage.state);return _`
|
||
<div
|
||
class="run-inspector__coverage run-inspector__coverage--${o.coverage.state}"
|
||
role="status"
|
||
aria-label=${T(`activity.runInspector.coverageStatusLabel`,{state:s})}
|
||
>
|
||
<strong>${s}</strong>
|
||
<span>
|
||
${T(`activity.runInspector.coverage.${I(o.coverage.state)}.description`)}
|
||
</span>
|
||
</div>
|
||
${o.identity.state===`present`?_`
|
||
<section class="run-inspector__section" aria-labelledby="run-inspector-identity-heading">
|
||
<h3 id="run-inspector-identity-heading">
|
||
${T(`activity.runInspector.identityHeading`)}
|
||
</h3>
|
||
<dl class="run-inspector__facts">
|
||
${At(o.identity.context,t).map(kt)}
|
||
</dl>
|
||
</section>
|
||
${z(o.coverage.missingEvidence)}
|
||
${Tt(e,n,r,t,i)}
|
||
`:Mt(o,t,e.executionPageStatus,a)}
|
||
`}function H(e,t,n={}){return _`
|
||
<div class="run-inspector__panel" role=${n.role??`status`}>
|
||
<h3>${e}</h3>
|
||
<p>${t}</p>
|
||
${n.action?_`<button type="button" class="btn" @click=${n.action.onClick}>
|
||
${n.action.label}
|
||
</button>`:g}
|
||
</div>
|
||
`}function Pt(e){let t=e.state,n;switch(t.status){case`empty`:n=H(T(`activity.runInspector.panels.empty.title`),T(`activity.runInspector.panels.empty.description`));break;case`loading`:n=H(t.waitingForGateway?T(`activity.runInspector.panels.waiting.title`):T(`activity.runInspector.panels.loading.title`),t.waitingForGateway?T(`activity.runInspector.panels.waiting.description`):T(`activity.runInspector.panels.loading.description`));break;case`disconnected`:n=H(T(`activity.runInspector.panels.disconnected.title`),T(`activity.runInspector.panels.disconnected.description`));break;case`unauthorized`:n=H(T(`activity.runInspector.panels.unauthorized.title`),T(`activity.runInspector.panels.unauthorized.description`),{role:`alert`});break;case`unsupported`:n=H(T(`activity.runInspector.panels.unsupported.title`),T(`activity.runInspector.panels.unsupported.description`));break;case`error`:n=H(T(`activity.runInspector.panels.error.title`),T(`activity.runInspector.panels.error.description`),{action:t.recovery===`restart`?{label:T(`activity.runInspector.restart`),onClick:e.onRestart}:{label:T(`activity.runInspector.retry`),onClick:e.onRetry},role:`alert`});break;case`ready`:n=Nt(t,e.basePath,e.selector,e.selectorId,e.onLoadMoreDecisions,e.onLoadMoreExecutions)}return _`
|
||
<section
|
||
id="activity-run-panel"
|
||
class="run-inspector"
|
||
aria-label=${T(`activity.runInspector.mode`)}
|
||
>
|
||
<div class="settings-section__header">
|
||
<div>
|
||
<h2 class="settings-section__heading">${T(`activity.runInspector.mode`)}</h2>
|
||
<p class="run-inspector__intro">${T(`activity.runInspector.intro`)}</p>
|
||
</div>
|
||
</div>
|
||
<div class="run-inspector__warning" role="note">
|
||
${T(`activity.runInspector.bestEffortWarning`)}
|
||
</div>
|
||
${n}
|
||
</section>
|
||
`}function Ft(){return(Ft=e((()=>{v(),S(),F(),Et(),M(),P()})))()}var It;function Lt(){return(Lt=e((()=>{It=class{constructor(e){this.host=e,this.loading=!1,this.client=null,this.refreshPending=!1,e.addController(this)}hostDisconnected(){this.pending?.abort(),this.pending=void 0,this.client=null,this.queryKey=void 0,this.result=void 0,this.refreshPending=!1}load(e,t,n=!1){if(!e||!t){this.hostDisconnected(),this.loading=!1,this.host.requestUpdate();return}let r={archived:`all`,includeGlobal:!0,includeUnknown:!0,includePeople:!0,includeDerivedTitles:!0,limit:100,...t.personId?{involvingProfileId:t.personId}:{},...t.query?{search:t.query}:{},...t.time===`all`?{}:{activeMinutes:t.time===`24h`?1440:t.time===`7d`?10080:43200}},i=JSON.stringify(r),a=this.client===e&&this.queryKey===i;if(a&&this.pending){this.refreshPending||=n;return}if(!n&&a)return;this.pending?.abort();let o=new AbortController;this.pending=o,this.client=e,this.queryKey=i,this.loading=!0,this.error=void 0,a||(this.result=void 0),this.refreshPending=!1,this.host.requestUpdate(),e.request(`sessions.list`,r,{signal:o.signal}).then(e=>{this.pending===o&&(this.result=e)}).catch(e=>{this.pending===o&&!o.signal.aborted&&(this.error=e instanceof Error?e.message:String(e))}).finally(()=>{this.pending===o&&(this.pending=void 0,this.loading=!1,this.host.requestUpdate(),this.refreshPending&&this.load(e,t,!0))})}}})))()}function Rt(){U.clear()}function zt(e){let t=r(e);if(t?.found!==!0)return{status:`absent`};let n=e=>e?.trim()?e:void 0,a=r(t.attribution),o=n(i(a,`text`)),s=n(i(a,`url`)),c=n(i(t,`city`)),l=n(i(t,`region`)),u=n(i(t,`country`)),d={...c?{city:c}:{},...l?{region:l}:{},...u?{country:u}:{},...o&&s?{attribution:{text:o,url:s}}:{}};return Object.keys(d).length>0?{status:`located`,location:d}:{status:`absent`}}async function Bt(e){let{origin:t,authHeader:n}=oe();try{let r=await fetch(`${t??``}/plugins/geolocation/lookup?ip=${encodeURIComponent(e)}`,{credentials:`include`,...n?{headers:{Authorization:n}}:{},signal:AbortSignal.timeout(Ht)});return r.ok?zt(await r.json()):{status:`unavailable`}}catch{return{status:`unavailable`}}}function Vt(e){let t=U.get(e);if(t)return t;let n=Bt(e).then(t=>(t.status===`unavailable`&&U.delete(e),t));if(U.size>=Ut){let e=U.keys().next();e.done||U.delete(e.value)}return U.set(e,n),n}var Ht,Ut,U;function Wt(){return(Wt=e((()=>{Se(),Ht=15e3,Ut=256,U=new Map,be(Rt)})))()}var Gt,W;function Kt(){return(Kt=e((()=>{v(),Ce(),Wt(),me(),w(),Gt=[5e3,15e3,45e3],W=class extends se{constructor(...e){super(...e),this.location=null,this.retryAttempt=0}disconnectedCallback(){super.disconnectedCallback(),this.clearRetry()}willUpdate(){let e=this.ip?.trim();!e||e===this.requestedIp||(this.clearRetry(),this.requestedIp=e,this.retryAttempt=0,this.location=null,this.resolve(e))}clearRetry(){this.retryTimer!==void 0&&(clearTimeout(this.retryTimer),this.retryTimer=void 0)}resolve(e){Vt(e).then(t=>{if(this.requestedIp!==e)return;if(t.status===`located`){this.location=t.location;return}if(t.status===`absent`)return;let n=Gt[this.retryAttempt];n!==void 0&&(this.retryAttempt+=1,this.retryTimer=setTimeout(()=>{this.retryTimer=void 0,this.requestedIp===e&&this.isConnected&&this.resolve(e)},n))})}render(){let e=[this.location?.city,this.location?.region??this.location?.country].filter(Boolean).join(`, `);if(!e)return g;let t=this.location?.attribution;return _`<span class="activity-feed__device-location"
|
||
>${e}${t?_`<a
|
||
class="activity-feed__device-attribution"
|
||
href=${t.url}
|
||
target="_blank"
|
||
rel="noreferrer noopener"
|
||
aria-label=${t.text}
|
||
title=${t.text}
|
||
>${C.info}</a
|
||
>`:g}</span
|
||
>`}},s([y({attribute:!1})],W.prototype,`ip`,void 0),s([b()],W.prototype,`location`,void 0),globalThis.customElements&&(customElements.get(`openclaw-ip-location`)||customElements.define(`openclaw-ip-location`,W))})))()}function G(e){return!e.name&&!e.email&&E(e)===e.id}function qt(e){return G(e)&&e.id.length>8?`${e.id.slice(0,8)}…`:E(e)}function K(e,t=!1){return G(e)?_`<span
|
||
class="viewer-avatar viewer-avatar--overflow activity-feed__unknown-avatar"
|
||
aria-hidden="true"
|
||
>${C.users}</span
|
||
>`:_`<span class="activity-feed__person-avatar">
|
||
<openclaw-viewer-avatar
|
||
.identity=${{type:`profile`,id:e.id}}
|
||
.user=${e}
|
||
.markAsViewer=${!1}
|
||
variant="footer"
|
||
></openclaw-viewer-avatar>
|
||
${t&&(e.entries?.length??0)>0?_`<span
|
||
class="activity-feed__presence-dot"
|
||
aria-label=${T(`activityFeed.online`)}
|
||
></span>`:g}
|
||
</span>`}function Jt(e,t,n){e.currentTarget instanceof Element&&e.currentTarget.closest(`wa-popover`)?.removeAttribute(`open`),t.onFiltersChange({...t.filters,personId:n})}function Yt(e,t){e.currentTarget instanceof Element&&e.currentTarget.parentElement?.querySelector(`.activity-feed__people-trigger`)?.setAttribute(`aria-expanded`,String(t))}function Xt(e,t){return _`<button
|
||
type="button"
|
||
class="session-menu__item activity-feed__people-row"
|
||
data-activity-person=${e.id}
|
||
aria-pressed=${String(t.filters.personId===e.id)}
|
||
@click=${n=>Jt(n,t,e.id)}
|
||
>
|
||
${K(e,!0)}
|
||
<span class="activity-feed__people-copy">
|
||
<span class="activity-feed__people-name">${qt(e)}</span>
|
||
</span>
|
||
<span class="activity-feed__people-count">${e.count}</span>
|
||
</button>`}function Zt(e,t,n,r){let i=t.slice(0,3),a=t.length-i.length,o=t.filter(e=>!G(e)),s=t.filter(G);return _`<div class="activity-feed__people-control">
|
||
<button
|
||
id="activity-feed-people-trigger"
|
||
type="button"
|
||
class="btn btn--sm activity-feed__people-trigger"
|
||
aria-label=${T(`activityFeed.peopleButtonLabel`)}
|
||
aria-haspopup="dialog"
|
||
aria-expanded="false"
|
||
>
|
||
${n?_`${K(n)}<span class="activity-feed__selected-person"
|
||
>${qt(n)}</span
|
||
>`:_`<span class="activity-feed__facepile" aria-hidden="true">
|
||
${i.length>0?i.map(e=>K(e)):_`<span
|
||
class="viewer-avatar viewer-avatar--overflow activity-feed__unknown-avatar"
|
||
>${C.users}</span
|
||
>`}
|
||
${a>0?_`<span class="viewer-avatar viewer-avatar--overflow">+${a}</span>`:g}
|
||
</span>`}
|
||
</button>
|
||
${n?_`<button
|
||
type="button"
|
||
class="btn btn--sm activity-feed__people-clear"
|
||
aria-label=${T(`activityFeed.clearPersonFilter`)}
|
||
@click=${()=>e.onFiltersChange({...e.filters,personId:null})}
|
||
>
|
||
×
|
||
</button>`:g}
|
||
<wa-popover
|
||
class="activity-feed__people-popover"
|
||
for="activity-feed-people-trigger"
|
||
placement="bottom-end"
|
||
without-arrow
|
||
@wa-show=${e=>Yt(e,!0)}
|
||
@wa-hide=${e=>Yt(e,!1)}
|
||
>
|
||
<div class="activity-feed__people-panel" aria-label=${T(`activityFeed.peopleButtonLabel`)}>
|
||
<button
|
||
type="button"
|
||
class="session-menu__item activity-feed__people-row"
|
||
data-activity-person=""
|
||
aria-pressed=${String(e.filters.personId===null)}
|
||
@click=${t=>Jt(t,e,null)}
|
||
>
|
||
<span
|
||
class="viewer-avatar viewer-avatar--overflow activity-feed__unknown-avatar"
|
||
aria-hidden="true"
|
||
>${C.users}</span
|
||
>
|
||
<span class="activity-feed__people-copy">
|
||
<span class="activity-feed__people-name">${T(`activityFeed.everyone`)}</span>
|
||
</span>
|
||
<span class="activity-feed__people-count">${r}</span>
|
||
</button>
|
||
${o.map(t=>Xt(t,e))}
|
||
${s.length>0?_`<div class="session-menu__separator" role="separator"></div>
|
||
<div class="activity-feed__people-group-label">
|
||
${T(`activityFeed.unresolvedIdentities`)}
|
||
</div>
|
||
<div data-activity-unresolved>
|
||
${s.map(t=>Xt(t,e))}
|
||
</div>`:g}
|
||
</div>
|
||
</wa-popover>
|
||
</div>`}function Qt(e,t,n){if(!ne(e))return;e.preventDefault();let r=pe(n),i=fe({context:t,face:r,sessionKey:n.key});t.navigate(r,i.options)}function $t(e,t){return fe({context:e,face:pe(t),sessionKey:t.key}).href}function en(e,t=Date.now()){if(e===null)return T(`activityFeed.unknownDate`);let n=new Date(t),r=new Date(n.getFullYear(),n.getMonth(),n.getDate()).getTime(),i=new Date(r);return i.setDate(i.getDate()-1),e===r?T(`activityFeed.today`):e===i.getTime()?T(`activityFeed.yesterday`):new Intl.DateTimeFormat(void 0,{day:`numeric`,month:`long`,year:`numeric`}).format(e)}function q(e,t){let n=ct(t),r=E(n),i=O(t),a=t.observerDigest?.runId,o=t.hasActiveRun===!0&&a&&t.activeRunIds?.includes(a)?a:void 0,s=o?t.observerDigest?.headline.trim():``,c=t.channel?T(`activityFeed.channelLabel`,{value:t.channel}):t.agentId?T(`activityFeed.agentLabel`,{value:t.agentId}):null,l=t.createdVia===`cron`?T(`activityFeed.automation`):null;return _`<div class="activity-feed__session-row">
|
||
<a
|
||
class="activity-feed__session"
|
||
data-activity-session=${t.key}
|
||
href=${$t(e,t)}
|
||
@click=${n=>Qt(n,e,t)}
|
||
>
|
||
<span class="activity-feed__session-avatar">
|
||
${t.hasActiveRun===!0?_`<span
|
||
class="activity-feed__presence-dot activity-feed__run-dot"
|
||
aria-hidden="true"
|
||
></span>`:g}
|
||
<openclaw-viewer-avatar
|
||
.identity=${t.owner?.actor.identity??t.createdActor?.identity}
|
||
.user=${n}
|
||
.markAsViewer=${!1}
|
||
variant="footer"
|
||
></openclaw-viewer-avatar>
|
||
</span>
|
||
<span class="activity-feed__session-main">
|
||
<span class="activity-feed__session-title">${te(t.key,t)}</span>
|
||
<span class="activity-feed__session-meta">
|
||
${s?_`<span
|
||
class="activity-feed__session-headline"
|
||
data-health=${t.observerDigest?.health??g}
|
||
>${s}</span
|
||
>`:_`<span>${r}</span>`}${l?_`<span class="activity-feed__session-source" data-activity-created-via="cron"
|
||
>· ${l}${c?` ·`:``}</span
|
||
>`:g}${c?_`<span class="activity-feed__session-scope">${c}</span>`:g}
|
||
</span>
|
||
</span>
|
||
<span class="activity-feed__session-time">
|
||
${s?_`<span class="activity-feed__session-owner">${r}</span>`:g}
|
||
${i>0?_`<span>${ie(i,{fallback:``})}</span>`:g}
|
||
</span>
|
||
</a>
|
||
${o?_`<a
|
||
class="activity-feed__inspect-run"
|
||
href=${ht(o,e.basePath)}
|
||
>${T(`activityFeed.inspectRun`)}</a
|
||
>`:g}
|
||
</div>`}function tn(e,t){if(e.filters.query||e.filters.personId)return t.sessions.map(t=>q(e.context,t));let n=t.sessions.filter(e=>e.hasAutomation===!0);if(n.length<2)return t.sessions.map(t=>q(e.context,t));let r=e.expandedAutomationDays.has(t.key);return _`
|
||
${t.sessions.filter(e=>e.hasAutomation!==!0).map(t=>q(e.context,t))}
|
||
<button
|
||
type="button"
|
||
class="activity-feed__session activity-feed__automation-group"
|
||
data-activity-automation-group=${t.key}
|
||
aria-expanded=${String(r)}
|
||
@click=${()=>e.onAutomationDayToggle(t.key)}
|
||
>
|
||
<span class="activity-feed__automation-group-icon" aria-hidden="true">${C.clock}</span>
|
||
<span>${T(`activityFeed.automationGroup`,{count:String(n.length)})}</span>
|
||
<span class="activity-feed__automation-group-chevron" aria-hidden="true"
|
||
>${C.chevronRight}</span
|
||
>
|
||
</button>
|
||
${r?n.map(t=>q(e.context,t)):g}
|
||
`}function nn(e,t,n){let r=(t.entries?.length??0)>0,i=r&&Ge(t),a=T(r?i?`activityFeed.idle`:`activityFeed.online`:`activityFeed.offline`),o=t.entries??[],s=ft(t,n);return _`
|
||
<section class="activity-feed__identity" data-activity-identity=${t.id}>
|
||
<div class="activity-feed__identity-main">
|
||
<openclaw-viewer-avatar
|
||
.identity=${{type:`profile`,id:t.id}}
|
||
.user=${t}
|
||
.markAsViewer=${!1}
|
||
variant="profile"
|
||
></openclaw-viewer-avatar>
|
||
<div class="activity-feed__identity-copy">
|
||
<h2>${E(t)}</h2>
|
||
${t.email?_`<p>${t.email}</p>`:g}
|
||
</div>
|
||
${Ue({kind:r?i?`warn`:`ok`:`muted`,label:a})}
|
||
</div>
|
||
${o.length>0?_`<div class="activity-feed__devices">
|
||
${o.map(e=>{let t=[e.deviceFamily,e.platform,e.ip,e.timeZone].filter(Boolean).join(` · `);return _`<div class="activity-feed__device">
|
||
<span class="activity-feed__device-name"
|
||
>${e.host??T(`activityFeed.unknownDevice`)}</span
|
||
>
|
||
${t?_`<span>${t}</span>`:g}
|
||
${e.ip?_`<openclaw-ip-location .ip=${e.ip}></openclaw-ip-location>`:g}
|
||
${e.lastInputSeconds===void 0?g:_`<span
|
||
>${T(`activityFeed.lastInput`,{time:ve(e.lastInputSeconds*1e3,{suffix:!1})})}</span
|
||
>`}
|
||
</div>`})}
|
||
</div>`:g}
|
||
<div class="activity-feed__viewing">
|
||
<h3>${T(`activityFeed.viewingNow`)}</h3>
|
||
${s.length>0?_`<div class="activity-feed__viewing-list">
|
||
${s.map(t=>q(e,t))}
|
||
</div>`:_`<p class="activity-feed__empty-note">${T(`activityFeed.notViewing`)}</p>`}
|
||
</div>
|
||
</section>
|
||
`}function rn(e){let t=dt(e.result),n=new Map(e.presenceViewers.flatMap(e=>e.identity?[[e.identity.id,e]]:[])),r=e.filters.personId?n.get(e.filters.personId)??t.people.find(t=>t.id===e.filters.personId)??null:null,i=t.people.map(e=>{let t=n.get(e.id);return t?{...e,...t,count:e.count}:e}),a=e.filters.personId?i.find(t=>t.id===e.filters.personId)??r:null;return _`
|
||
<div class="activity-feed">
|
||
<div class="activity-feed__toolbar">
|
||
<label class="data-table-search activity-feed__search">
|
||
${C.search}
|
||
<input
|
||
type="search"
|
||
.value=${e.filters.query}
|
||
placeholder=${T(`activityFeed.searchPlaceholder`)}
|
||
@input=${t=>{t.currentTarget instanceof HTMLInputElement&&e.onFiltersChange({...e.filters,query:t.currentTarget.value})}}
|
||
/>
|
||
</label>
|
||
<div
|
||
class="settings-segmented activity-feed__time-filter"
|
||
role="group"
|
||
aria-label=${T(`activityFeed.time`)}
|
||
>
|
||
${pt.map(t=>_`<button
|
||
type="button"
|
||
class="settings-segmented__btn ${e.filters.time===t?`settings-segmented__btn--active`:``}"
|
||
data-compact-label=${t===`all`?T(J[t]):t}
|
||
aria-label=${T(J[t])}
|
||
aria-pressed=${String(e.filters.time===t)}
|
||
@click=${()=>e.onFiltersChange({...e.filters,time:t})}
|
||
>
|
||
${T(J[t])}
|
||
</button>`)}
|
||
</div>
|
||
${Zt(e,i,a,t.timeCount)}
|
||
</div>
|
||
<div class="activity-feed__main">
|
||
${e.loading?_`<p role="status">${T(`common.loading`)}</p>`:g}
|
||
${e.error?_`<p role="alert">
|
||
${e.error}
|
||
<button class="btn" @click=${e.onRetry}>${T(`common.retry`)}</button>
|
||
</p>`:g}
|
||
${e.result?.peopleIncomplete?_`<p role="status">${T(`activityFeed.partialHistory`)}</p>`:g}
|
||
${e.result&&e.filters.personId?r?nn(e.context,r,t.sessions):_`<section class="activity-feed__not-found" role="status">
|
||
<h2>${T(`activityFeed.notFoundTitle`)}</h2>
|
||
<p>${T(`activityFeed.notFoundDescription`)}</p>
|
||
</section>`:g}
|
||
${e.result&&(!e.filters.personId||r)?_`
|
||
<div class="activity-feed__summary">
|
||
<h2>${T(`activityFeed.sessions`)}</h2>
|
||
<span
|
||
>${T(`activityFeed.showing`,{shown:String(t.sessions.length),total:String(t.matchedCount)})}</span
|
||
>
|
||
</div>
|
||
${t.days.length>0?t.days.map(t=>_`<section class="activity-feed__day">
|
||
<h3>${en(t.timestamp)}</h3>
|
||
<div class="activity-feed__sessions">${tn(e,t)}</div>
|
||
</section>`):_`<section class="activity-feed__empty" role="status">
|
||
${T(`activityFeed.noSessions`)}
|
||
</section>`}
|
||
`:g}
|
||
</div>
|
||
</div>
|
||
`}var J;function an(){return(an=e((()=>{v(),w(),Kt(),He(),Ze(),Ke(),S(),h(),qe(),ye(),f(),M(),A(),J={"24h":`activityFeed.time24h`,"7d":`activityFeed.time7d`,"30d":`activityFeed.time30d`,all:`activityFeed.timeAll`}})))()}function on(e,n=Date.now()){let r=l(e),i=t(r?.runId),a=l(r?.data),o=r?.stream===`tool`,s=r?.stream===`item`&&t(a?.kind)===`answer_candidate`;if(!r||!o&&!s||!i||!a)return null;let c=t(r.sessionKey),u=t(r.agentId);return{stream:o?`tool`:`item`,runId:i,ts:typeof r.ts==`number`?r.ts:n,receivedAt:n,...c?{sessionKey:c}:{},...u?{agentId:u}:{},data:a}}function sn(e){if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`)return String(e);let t=l(e);if(!t)return null;if(typeof t.text==`string`)return t.text;let n=t.content;if(!Array.isArray(n))return null;let r=n.map(e=>{let t=l(e);return t?.type===`text`&&typeof t.text==`string`?t.text:null}).filter(e=>!!e);return r.length>0?r.join(`
|
||
`):null}function cn(e){let t=sn(e);if(t!==null)return t;if(e==null)return null;try{return JSON.stringify(e,null,2)}catch{return d(e)}}function ln(e){let t=cn(e);if(!t)return{truncated:!1};let n=ue(t),r=p(n,vn);return{text:r.text,truncated:r.truncated}}function un(e){if(e==null)return 0;if(Array.isArray(e))return e.length;let t=l(e);return t?Object.keys(t).length:1}function dn(e){return e?.isError===!0||e?.is_error===!0}function fn(e){if(t(e.phase)!==`result`)return`running`;let n=l(e.result);if(dn(e)||dn(n))return`error`;let r=t(e.status)??t(n?.status);if(r&&/error|fail|failed|failure/i.test(r))return`error`;let i=Number(n?.exitCode??e.exitCode);return Number.isFinite(i)&&i!==0?`error`:`done`}function pn(e){return yn[e]}function mn(e,t,n){let r=`${n} argument${n===1?``:`s`} hidden`;return`${e} ${pn(t)}; ${r}`}function hn(e,n){let r=n.data??{};if(n.stream===`item`)return _n(e,n);let i=t(r.toolCallId);if(!i)return e;let a=t(r.name)??`tool`,o=`${n.runId}:${i}`,s=n.receivedAt,c=typeof n.ts==`number`?n.ts:s,l=fn(r),u=ln(r.phase===`update`?r.partialResult:r.phase===`result`?r.result:null),d=e.find(e=>e.id===o),f=r.args===void 0?d?.hiddenArgumentCount??0:un(r.args),p=u.text??d?.outputPreview,m={id:o,toolCallId:i,runId:n.runId,...n.sessionKey?{sessionKey:n.sessionKey}:{},toolName:a,entryKind:`tool`,status:l,startedAt:d?.startedAt??c,updatedAt:s,durationMs:Math.max(0,s-(d?.startedAt??c)),outputTruncated:u.truncated||d?.outputTruncated===!0,summary:mn(a,l,f),hiddenArgumentCount:f,...p?{outputPreview:p}:{}};return(d?e.map(e=>e.id===o?m:e):[...e,m]).slice(-100)}function gn(e){return e===`candidate`||e===`superseded`||e===`selected`?e:null}function _n(e,n){let r=t(n.data.itemId),i=gn(n.data.status);if(!r||!i)return e;let a=`${n.runId}:answer_candidate:${r}`,o=e.find(e=>e.id===a),s=n.receivedAt,c=o?.startedAt??n.ts,l=ln(n.data.progressText),u={id:a,toolCallId:r,itemId:r,runId:n.runId,...n.sessionKey?{sessionKey:n.sessionKey}:{},toolName:`answer_candidate`,entryKind:`answer_candidate`,candidateStatus:i,status:i===`candidate`?`running`:`done`,startedAt:c,updatedAt:s,durationMs:Math.max(0,s-c),outputTruncated:l.truncated||o?.outputTruncated===!0,summary:`answer_candidate.${i}`,hiddenArgumentCount:0,...l.text?{outputPreview:l.text}:{}};return(o?e.map(e=>e.id===a?u:e):[...e,u]).slice(-100)}var vn,yn;function bn(){return(bn=e((()=>{de(),h(),vn=2e3,yn={running:`running`,done:`completed`,error:`failed`}})))()}function xn(e){return ee(e,{hour:`numeric`,minute:`2-digit`,second:`2-digit`},``)}function Sn(e){return!Number.isFinite(e)||e<0?T(`common.na`):le(e)??`0ms`}function Cn(e){return T(`activity.status.${e}`)}function Y(e){return e===1?T(`activity.argumentHiddenOne`):T(`activity.argumentsHidden`,{count:String(e)})}function wn(e){return e.entryKind===`answer_candidate`?T(`activity.answerCandidate.${e.candidateStatus??`candidate`}`):Y(e.hiddenArgumentCount)}function Tn(e){return e.entryKind===`answer_candidate`?T(`activity.answerCandidate.title`):e.toolName}function En(e,t){return!t||n([e.toolName,Tn(e),e.candidateStatus,e.status,e.summary,wn(e),e.outputPreview,e.runId,e.toolCallId,e.sessionKey].filter(Boolean).join(` `)).includes(t)}function Dn(e){return c(e.map(e=>e.toolName))}function On(e){let t=n(e.filterText);return e.entries.filter(n=>!e.statusFilters[n.status]||e.toolFilter&&n.toolName!==e.toolFilter?!1:En(n,t))}function kn(e,t){return _`
|
||
<label class="activity-status-filter">
|
||
<input
|
||
type="checkbox"
|
||
.checked=${e.statusFilters[t]}
|
||
@change=${n=>e.onStatusToggle(t,n.target.checked)}
|
||
/>
|
||
<span>${Cn(t)}</span>
|
||
</label>
|
||
`}function An(e,t){e.currentTarget instanceof Element&&e.currentTarget.previousElementSibling?.setAttribute(`aria-expanded`,String(t))}function jn(e,t){let n=!!e.toolFilter;return _`
|
||
<button
|
||
id="activity-live-filter-trigger"
|
||
type="button"
|
||
class="btn btn--sm activity-live-filter-trigger ${n?`active`:``}"
|
||
title=${T(`activity.filters`)}
|
||
aria-label=${T(`activity.filters`)}
|
||
aria-haspopup="dialog"
|
||
aria-expanded="false"
|
||
>
|
||
${C.listFilter}
|
||
</button>
|
||
<wa-popover
|
||
class="activity-live-filter-popover"
|
||
for="activity-live-filter-trigger"
|
||
placement="bottom-end"
|
||
without-arrow
|
||
@wa-show=${e=>An(e,!0)}
|
||
@wa-hide=${e=>An(e,!1)}
|
||
>
|
||
<div class="activity-live-filter-popover__panel">
|
||
<label class="field">
|
||
<span>${T(`activity.toolFilter`)}</span>
|
||
<select
|
||
class="settings-select"
|
||
aria-label=${T(`activity.toolFilter`)}
|
||
.value=${e.toolFilter}
|
||
@change=${t=>{t.currentTarget instanceof HTMLSelectElement&&e.onToolFilterChange(t.currentTarget.value)}}
|
||
>
|
||
<option value="">${T(`activity.allTools`)}</option>
|
||
${t.map(e=>_`<option value=${e}>${e}</option>`)}
|
||
</select>
|
||
</label>
|
||
</div>
|
||
</wa-popover>
|
||
`}function Mn(e,t){return _`
|
||
<div class="activity-live-toolbar">
|
||
<div class="activity-feed__search activity-live-search">
|
||
<span aria-hidden="true">${C.search}</span>
|
||
<input
|
||
class="settings-input"
|
||
type="search"
|
||
aria-label=${T(`activity.search`)}
|
||
.value=${e.filterText}
|
||
placeholder=${T(`activity.searchPlaceholder`)}
|
||
@input=${t=>{t.currentTarget instanceof HTMLInputElement&&e.onFilterTextChange(t.currentTarget.value)}}
|
||
/>
|
||
</div>
|
||
<span role="group" aria-label=${T(`activity.statusFilters`)} class="activity-status-filters">
|
||
${X.map(t=>kn(e,t))}
|
||
</span>
|
||
<span class="activity-live-autofollow">
|
||
<span>${T(`activity.autoFollow`)}</span>
|
||
${Je({checked:e.autoFollow,ariaLabel:T(`activity.autoFollow`),onChange:t=>e.onToggleAutoFollow(t)})}
|
||
</span>
|
||
${jn(e,t)}
|
||
</div>
|
||
`}function Nn(e){return In[e]}function Pn(e,t){let n=e.expandedIds.has(t.id);return _`
|
||
<details
|
||
class="activity-entry activity-entry--${t.status}"
|
||
role="listitem"
|
||
.open=${n}
|
||
@toggle=${n=>e.onEntryToggle(t.id,n.currentTarget.open)}
|
||
>
|
||
<summary class="activity-entry__summary">
|
||
<span class="activity-entry__chevron" aria-hidden="true">${C.chevronRight}</span>
|
||
<span class="activity-entry__main">
|
||
<span class="activity-entry__title">
|
||
${Ue({kind:Nn(t.status),label:Cn(t.status)})}
|
||
<span class="activity-entry__tool mono">${Tn(t)}</span>
|
||
</span>
|
||
<span class="activity-entry__text">${wn(t)}</span>
|
||
</span>
|
||
<span class="activity-entry__meta">
|
||
<span>${xn(t.updatedAt)}</span>
|
||
<span>${Sn(t.durationMs)}</span>
|
||
</span>
|
||
</summary>
|
||
<div class="activity-entry__body">
|
||
<div class="activity-entry__facts">
|
||
${t.entryKind===`answer_candidate`?_`<span class="mono"
|
||
>${T(`activity.answerCandidate.itemId`)}: ${t.itemId}</span
|
||
>`:_`
|
||
<span>${Y(t.hiddenArgumentCount)}</span>
|
||
<span class="mono">${T(`activity.toolCallId`)}: ${t.toolCallId}</span>
|
||
`}
|
||
<a
|
||
class="activity-entry__run-link mono"
|
||
href=${ht(t.runId,e.basePath)}
|
||
>${T(`activity.runId`)}: ${t.runId}</a
|
||
>
|
||
${t.sessionKey?_`<span class="mono">${T(`activity.session`)}: ${t.sessionKey}</span>`:g}
|
||
</div>
|
||
${t.outputPreview?_`
|
||
<pre class="activity-entry__preview">${t.outputPreview}</pre>
|
||
${t.outputTruncated?_`<div class="activity-entry__note">${T(`activity.outputTruncated`)}</div>`:g}
|
||
`:_`<div class="activity-entry__note">${T(`activity.noOutputPreview`)}</div>`}
|
||
</div>
|
||
</details>
|
||
`}function Fn(e){let t=Dn(e.entries),n=On(e),r=e.filterText.trim()||e.toolFilter||X.some(t=>!e.statusFilters[t]);return _`
|
||
<section class="activity-page" aria-label=${T(`activity.title`)}>
|
||
<div class="settings-section__header">
|
||
<h2 class="settings-section__heading">${T(`activity.title`)}</h2>
|
||
<div class="settings-section__actions">
|
||
<span class="activity-count" aria-live="polite">
|
||
${T(`activity.visibleCount`,{visible:String(n.length),total:String(e.entries.length)})}
|
||
</span>
|
||
<button
|
||
type="button"
|
||
class="btn btn--sm"
|
||
?disabled=${n.length===0}
|
||
@click=${e.onExpandAll}
|
||
>
|
||
${T(`activity.expandAll`)}
|
||
</button>
|
||
<button
|
||
type="button"
|
||
class="btn btn--sm"
|
||
?disabled=${e.expandedIds.size===0}
|
||
@click=${e.onCollapseAll}
|
||
>
|
||
${T(`activity.collapseAll`)}
|
||
</button>
|
||
<button
|
||
type="button"
|
||
class="btn btn--sm danger"
|
||
?disabled=${e.entries.length===0}
|
||
@click=${e.onClear}
|
||
>
|
||
${T(`activity.clear`)}
|
||
</button>
|
||
</div>
|
||
</div>
|
||
<div class="settings-group activity-group">
|
||
${Mn(e,t)}
|
||
<div
|
||
class="activity-stream"
|
||
role="list"
|
||
aria-label=${T(`activity.streamLabel`)}
|
||
@scroll=${e.onScroll}
|
||
>
|
||
${n.length===0?_`
|
||
<div class="activity-empty">
|
||
${e.entries.length===0||!r?T(`activity.empty`):T(`activity.emptyFiltered`)}
|
||
</div>
|
||
`:n.map(t=>Pn(e,t))}
|
||
</div>
|
||
</div>
|
||
</section>
|
||
`}var X,In;function Ln(){return(Ln=e((()=>{a(),v(),w(),Ke(),S(),F(),h(),M(),P(),X=[`running`,`done`,`error`],In={running:`warn`,done:`ok`,error:`danger`}})))()}function Rn(e){return e?`${e.kind}:${e.id}`:null}function Z(e){return e.mode!==`run`||!e.selector?null:`${Rn(e.selector)}:${e.decisionCursor??``}`}function zn(e){let t=o(e);return(t?.gatewayCode===`INVALID_REQUEST`||t?.code===`INVALID_REQUEST`)&&t.retryable!==!0}var Q,$,Bn;function Vn(){return(Vn=e((()=>{Re(),v(),Ce(),Ae(),je(),x(),Me(),Ee(),$e(),w(),tt(),S(),ge(),Ve(),qe(),m(),ae(),me(),nt(),xe(),M(),Ft(),Lt(),an(),A(),bn(),Ln(),$=class extends ce{constructor(...e){super(...e),this.routeSearch=``,this.routeData={mode:`sessions`,filters:{personId:null,query:``,time:`7d`},selector:null},this.entries=[],this.filterText=``,this.statusFilters={running:!0,done:!0,error:!0},this.toolFilter=``,this.expandedIds=new Set,this.expandedAutomationDays=new Set,this.autoFollow=!0,this.runInspector={status:`empty`},this.sessionKey=``,this.sessionActivity=new It(this),this.inspectorAbort=null,this.inspectorClient=null,this.inspectorEpoch=0,this.inspectorSelectorKey=null,this.presenceClient=null,this.streamFollow=new rt(this,{selector:`.activity-stream`,isEnabled:()=>this.autoFollow}),this.subscriptions=new _e(this).effect(()=>this.context?.gateway,e=>{this.applyGatewaySnapshot(e,e.snapshot,!0);let t=e.subscribeEvents(t=>{this.applyGatewayEvent(e,t,Date.now())}),n=e.subscribe(t=>this.applyGatewaySnapshot(e,t,!1));return()=>{n(),t()}})}willUpdate(e){e.has(`routeSearch`)&&(this.routeData=gt(this.routeSearch))}updated(e){e.has(`routeSearch`)&&(this.bindInspectorRoute(),this.syncSessionActivity()),this.autoFollow&&this.streamFollow.atBottom&&(e.has(`entries`)||e.has(`autoFollow`))&&this.streamFollow.schedule(e.has(`autoFollow`))}disconnectedCallback(){this.subscriptions.clear(),this.cancelInspectorRequest(),super.disconnectedCallback()}applyGatewaySnapshot(e,t,n){let r=this.sessionKey;if(this.sessionKey=re(ke().sessionKey,t.hello),(n||this.sessionKey!==r)&&this.rebuildEntries(e,t),n||t.client!==this.presenceClient){this.presenceClient=t.client;let e=t.phase===`connected`?Oe(t.hello?.snapshot):void 0;this.presencePayload=e?{presence:e}:void 0}else t.phase!==`connected`&&this.presencePayload&&(this.presencePayload=void 0);this.syncRunInspector(e,t,n),this.syncSessionActivity()}syncSessionActivity(e=!1){let t=this.context?.gateway.snapshot;this.sessionActivity.load(t?.phase===`connected`?t.client:null,this.routeData.mode===`sessions`?this.routeData.filters:null,e)}bindInspectorRoute(){let e=this.routeData,t=e?.mode===`run`?e.selector:null,n=Z(e);(n!==this.inspectorSelectorKey||e?.mode!==`run`)&&(this.inspectorSelectorKey=n,this.cancelInspectorRequest(),this.inspectorClient=null,this.runInspector=t?{status:`loading`,waitingForGateway:!0}:{status:`empty`},e?.mode===`run`&&this.syncRunInspector(this.context.gateway,this.context.gateway.snapshot,!0))}cancelInspectorRequest(){this.inspectorEpoch+=1,this.inspectorAbort?.abort(),this.inspectorAbort=null}syncRunInspector(e,t,n=!1){let r=this.routeData;if(r?.mode!==`run`)return;let i=r.selector;if(!i){this.runInspector={status:`empty`};return}if(this.inspectorSelectorKey=Z(r),t.phase!==`connected`||!t.client){this.cancelInspectorRequest(),this.inspectorClient=null,this.runInspector={status:`disconnected`};return}if(ze(t,`audit.run.inspect`)===!1){this.cancelInspectorRequest(),this.inspectorClient=t.client,this.runInspector={status:`unsupported`};return}if(!Be(t,`audit.run.inspect`,`operator.read`)){this.cancelInspectorRequest(),this.inspectorClient=t.client,this.runInspector={status:`unauthorized`};return}!n&&this.inspectorClient===t.client&&(this.runInspector.status===`loading`||this.runInspector.status===`ready`)||this.loadRunInspector(e,t.client,i)}isUnknownInspectMethod(e){return e instanceof we&&e.gatewayCode===`INVALID_REQUEST`&&(e.message===`unknown method: audit.run.inspect`||e.message===`missing scope: operator.admin`)}async loadRunInspector(e,t,n,r){this.cancelInspectorRequest();let i=this.inspectorEpoch,a=new AbortController;this.inspectorAbort=a,this.inspectorClient=t,this.runInspector=r?{...r,executionPageStatus:`loading`}:{status:`loading`,waitingForGateway:!1};let o=Z(this.routeData),s=()=>this.inspectorEpoch===i&&this.context.gateway===e&&e.snapshot.client===t&&e.snapshot.phase===`connected`&&this.routeData?.mode===`run`&&Z(this.routeData)===o,c=this.routeData.mode===`run`?this.routeData.decisionCursor:null;try{let e=n.kind===`run`?{runId:n.id,decisionLimit:50,executionLimit:50,...c?{decisionCursor:c}:{},...r?.result.nextExecutionCursor?{executionCursor:r.result.nextExecutionCursor}:{}}:{executionId:n.id,decisionLimit:50,...c?{decisionCursor:c}:{}},i=await t.request(`audit.run.inspect`,e,{signal:a.signal});if(s()){if(r?.result.identity.state===`ambiguous`&&i.identity.state===`ambiguous`){let e=new Map(r.result.identity.candidates.map(e=>[e.executionId,e]));for(let t of i.identity.candidates)e.set(t.executionId,t);this.runInspector={status:`ready`,result:{...i,identity:{...i.identity,candidates:[...e.values()]}},receiptPageCursors:r.receiptPageCursors}}else this.runInspector={status:`ready`,result:i,receiptPageCursors:_t(i.decisionDisplays,c??void 0)}}}catch(e){if(!s()||a.signal.aborted)return;this.runInspector=he(e)?{status:`unauthorized`}:this.isUnknownInspectMethod(e)?{status:`unsupported`}:r?{...r,executionPageStatus:`error`}:{status:`error`,recovery:c&&zn(e)?`restart`:`retry`}}finally{this.inspectorAbort===a&&(this.inspectorAbort=null)}}loadMoreExecutions(){let e=this.routeData,t=this.context.gateway.snapshot,n=this.runInspector;e?.mode!==`run`||e.selector?.kind!==`run`||t.phase!==`connected`||!t.client||n.status!==`ready`||n.executionPageStatus===`loading`||n.result.identity.state!==`ambiguous`||!n.result.nextExecutionCursor||this.loadRunInspector(this.context.gateway,t.client,e.selector,n)}loadMoreDecisions(){let e=this.routeData,t=this.context.gateway,n=t.snapshot,r=this.runInspector;if(e.mode!==`run`||!e.selector||n.phase!==`connected`||!n.client||r.status!==`ready`||r.decisionPageStatus===`loading`||r.result.identity.state!==`present`||!r.result.nextDecisionCursor)return;let i=r.result.nextDecisionCursor,a=e.selector,o=n.client,s=Z(e);this.cancelInspectorRequest();let c=this.inspectorEpoch,l=new AbortController;this.inspectorAbort=l,this.runInspector={...r,decisionPageStatus:`loading`};let u=()=>this.inspectorEpoch===c&&this.context.gateway===t&&t.snapshot.client===o&&t.snapshot.phase===`connected`&&Z(this.routeData)===s,d=a.kind===`run`?{runId:a.id,decisionCursor:i,decisionLimit:50,executionLimit:50}:{executionId:a.id,decisionCursor:i,decisionLimit:50};o.request(`audit.run.inspect`,d,{signal:l.signal}).then(e=>{if(!u())return;let t=vt(r.result,e);if(!t){this.runInspector={...r,decisionPageStatus:`error`};return}let n=new Map(r.receiptPageCursors);for(let t of e.decisionDisplays)n.set(t.selectorId,i);this.runInspector={status:`ready`,result:t,receiptPageCursors:n}}).catch(e=>{!u()||l.signal.aborted||(this.runInspector=he(e)?{status:`unauthorized`}:this.isUnknownInspectMethod(e)?{status:`unsupported`}:{...r,decisionPageStatus:`error`})}).finally(()=>{this.inspectorAbort===l&&(this.inspectorAbort=null)})}restartRunInspector(){let e=this.routeData;e.mode!==`run`||!e.selector||this.context.navigate(`activity`,{search:mt(e.selector)})}selectMode(e){if(e===`sessions`){this.context.navigate(`activity`,{search:``});return}e===`live`&&this.context.navigate(`activity`,{search:`?view=live`})}rebuildEntries(e,t){let n=[],r=e.eventLog,i=Q?r.indexOf(Q):-1,a=i<0?r:r.slice(0,i);for(let e of a.toReversed())n=this.reduceGatewayEvent(n,t,e.event,e.payload,e.ts);(n.length>0||this.entries.length>0)&&(this.entries=n),this.expandedIds.size>0&&(this.expandedIds=new Set),this.streamFollow.atBottom=!0}applyGatewayEvent(e,t,n){if(this.context.gateway!==e)return;if(t.event===`sessions.changed`&&this.syncSessionActivity(!0),t.event===`presence`){let e=Oe(t.payload);this.presencePayload=e?{presence:e}:void 0;return}let r=this.reduceGatewayEvent(this.entries,e.snapshot,t.event,t.payload,n);r!==this.entries&&(this.entries=r)}reduceGatewayEvent(e,t,n,r,i){if(n!==`agent`&&n!==`session.tool`)return e;let a=on(r,i);return!a||!u({sessionKey:this.sessionKey,assistantAgentId:t.assistantAgentId,hello:t.hello},a.sessionKey,a.agentId)?e:hn(e,a)}clearEntries(){Q=this.context.gateway.eventLog[0],this.entries=[],this.expandedIds=new Set,this.streamFollow.atBottom=!0}render(){let e=Fn({basePath:this.context.basePath,entries:this.entries,filterText:this.filterText,statusFilters:this.statusFilters,toolFilter:this.toolFilter,expandedIds:this.expandedIds,autoFollow:this.autoFollow,onFilterTextChange:e=>this.filterText=e,onToolFilterChange:e=>this.toolFilter=e,onStatusToggle:(e,t)=>{this.statusFilters={...this.statusFilters,[e]:t}},onToggleAutoFollow:e=>{this.autoFollow=e,e&&this.streamFollow.schedule(!0)},onClear:()=>this.clearEntries(),onExpandAll:()=>{this.expandedIds=new Set(this.entries.map(e=>e.id))},onCollapseAll:()=>{this.expandedIds=new Set},onEntryToggle:(e,t)=>{let n=new Set(this.expandedIds);t?n.add(e):n.delete(e),this.expandedIds=n},onScroll:e=>this.streamFollow.handleScroll(e)}),t=this.routeData?.mode??`live`,n=this.routeData.mode===`sessions`?this.routeData.filters:{personId:null,query:``,time:`7d`},r=We(this.presencePayload).users,i=this.sessionActivity.result?.involvingProfileId??n.personId,a=_`
|
||
${t===`run`?g:Qe({id:`activity-mode`,active:t,tabs:[{value:`sessions`,label:T(`activityFeed.sessionsMode`)},{value:`live`,label:T(`activity.runInspector.liveMode`)}],ariaLabel:T(`activity.runInspector.activityView`),panelId:`activity-mode-panel`,className:`activity-mode-tabs`,variant:`sub`,onSelect:e=>this.selectMode(e)})}
|
||
<div
|
||
id="activity-mode-panel"
|
||
role=${t===`run`?g:`tabpanel`}
|
||
aria-labelledby=${t===`run`?g:`activity-mode-tab-${t}`}
|
||
>
|
||
${t===`sessions`?rn({context:this.context,expandedAutomationDays:this.expandedAutomationDays,filters:{...n,personId:i},presenceViewers:r,result:this.sessionActivity.result,loading:this.sessionActivity.loading,error:this.sessionActivity.error,onRetry:()=>this.syncSessionActivity(!0),onAutomationDayToggle:e=>{let t=new Set(this.expandedAutomationDays);t.has(e)?t.delete(e):t.add(e),this.expandedAutomationDays=t},onFiltersChange:e=>this.context.navigate(`activity`,{search:ot(e)})}):t===`run`?_`<a
|
||
class="activity-run-inspector-back"
|
||
href=${Pe(`activity`,this.context.basePath)}
|
||
>${C.arrowLeft}${T(`activityFeed.backToSessions`)}</a
|
||
>
|
||
${Pt({basePath:this.context.basePath,state:this.runInspector,onLoadMoreExecutions:()=>this.loadMoreExecutions(),onLoadMoreDecisions:()=>this.loadMoreDecisions(),selectorId:this.routeData.mode===`run`?this.routeData.selectorId:null,selector:this.routeData.mode===`run`?this.routeData.selector:null,onRestart:()=>this.restartRunInspector(),onRetry:()=>this.syncRunInspector(this.context.gateway,this.context.gateway.snapshot,!0)})}`:_`<div id="activity-live-panel">${e}</div>`}
|
||
</div>
|
||
`;return _`
|
||
<section class="content-header">
|
||
<div>
|
||
<div class="page-title">${De(`activity`)}</div>
|
||
${t===`live`?g:_`<div class="page-sub">${T(`subtitles.activity`)}</div>`}
|
||
</div>
|
||
</section>
|
||
${et(a,{fillHeight:!0})}
|
||
`}},s([Le({context:Ne,subscribe:!0})],$.prototype,`context`,void 0),s([y({attribute:!1})],$.prototype,`routeSearch`,void 0),s([b()],$.prototype,`entries`,void 0),s([b()],$.prototype,`filterText`,void 0),s([b()],$.prototype,`statusFilters`,void 0),s([b()],$.prototype,`toolFilter`,void 0),s([b()],$.prototype,`expandedIds`,void 0),s([b()],$.prototype,`expandedAutomationDays`,void 0),s([b()],$.prototype,`autoFollow`,void 0),s([b()],$.prototype,`runInspector`,void 0),s([b()],$.prototype,`presencePayload`,void 0),Bn={header:!0,render:e=>_`<openclaw-activity-page
|
||
.routeSearch=${typeof e==`string`?e:``}
|
||
></openclaw-activity-page>`},customElements.get(`openclaw-activity-page`)||customElements.define(`openclaw-activity-page`,$)})))()}Vn();export{Bn as activityPageComponent};
|
||
//# sourceMappingURL=activity-page-D7YouqRi.js.map
|