openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
295 lines • 19.2 kB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{As as t,Bi as n,Eo as r,J as i,Oo as a,Wi as o,k as s,w as c,ws as l,y as u}from"./control-ui-core-Rwzhj6nO.js";import{K as d,X as f,q as p}from"./lit-runtime-CV_MH99K.js";import{R as m,Yn as h,cn as g,d as _,nr as v,sn as y,u as b,z as x}from"./control-ui-core-YphAl4aM.js";import{Gt as S,Wt as C,Yt as w,en as T,et as E}from"./control-ui-core-vvcQQV2m.js";import{n as D,r as O}from"./gateway-runtime-Bqqcp9-I.js";import{Ai as k,Oi as A,ki as j,zi as M}from"./control-ui-boot-shared-DfZ39Yj9.js";import{$t as ee,Zt as N}from"./control-ui-boot-chat-_QSl8fbH.js";import{n as P,t as F}from"./hub-tabs-DLM-pY5z.js";import{t as I}from"./sidebar-update-card-CE6rs-4H.js";var L;function R(){return(R=e((()=>{g(),a(),m(),L=class{constructor(e,t){this.onChange=t,this.operation=null,this.value={phase:`hidden`},this.current=e,this.sync(e)}get state(){return this.value}sync(e){this.current=e;let t=e.client,n=x(e);if(!t||n.phase!==`available`){this.retireOperation(),this.setState(n);return}this.operation&&this.operation.client!==t&&(this.retireOperation(),this.setState({phase:`available`})),(this.value.phase===`hidden`||this.value.phase===`guidance`)&&this.setState({phase:`available`})}request(){this.start(!1)}retry(){this.start(!0)}cancel(){this.retireOperation(),this.setState(x(this.current))}dispose(){this.retireOperation()}start(e){let t=this.current.client;if(!t||x(this.current).phase!==`available`)return;if(this.operation){if(!e)return;this.retireOperation()}let n={client:t};this.operation=n,this.setState({phase:`requesting`}),t.requestScopeUpgrade({onPending:e=>{this.isCurrent(n)&&this.setState({phase:`pending`,requestId:e})}}).then(e=>{!this.isCurrent(n)||e.status===`approved`||this.setState({phase:`rejected`,requestId:e.requestId,expired:e.status===`expired`})}).catch(e=>{!this.isCurrent(n)||e instanceof Error&&e.name===`AbortError`||this.setState({phase:`error`,message:r(e),retryable:!(e instanceof y)||e.retryable})}).finally(()=>{this.isCurrent(n)&&(this.operation=null)})}isCurrent(e){return this.operation===e&&this.current.client===e.client}retireOperation(){let e=this.operation;this.operation=null,e?.client.cancelScopeUpgrade()}setState(e){JSON.stringify(this.value)!==JSON.stringify(e)&&(this.value=e,this.onChange())}}})))()}function z(e,t){if(!t)return p;let n=T(`attention.dismissItem`,{item:e});return f`<button
type="button"
class="sidebar-issues-panel__dismiss"
aria-label=${n}
title=${n}
@click=${e=>{e.preventDefault(),e.stopPropagation(),t()}}
>
${C.x}
</button>`}function B(e){let{mention:t,context:n}=e,r={id:t.senderProfileId,identity:{type:`profile`,id:t.senderProfileId},name:t.senderLabel,avatarUrl:t.senderAvatarUrl,watchedSessions:[]},a=T(`attention.mentions.from`,{sender:t.senderLabel}),s=o({face:`chat`,sessionKey:t.sessionKey,fallbackAgentId:t.agentId,basePath:n.basePath,row:{key:t.sessionKey,displayName:t.sessionTitle},exactKey:!0});return f`<article
class="sidebar-mention-row"
data-attention-kind="mention"
data-mention-id=${t.id}
aria-label=${a}
>
<div class="sidebar-issues-panel__summary sidebar-mention-row__summary">
<span class="sidebar-mention-row__avatar" aria-hidden="true">
<openclaw-viewer-avatar
.user=${r}
.markAsViewer=${!1}
variant="footer"
></openclaw-viewer-avatar>
</span>
<div class="sidebar-issues-panel__content">
<div class="sidebar-mention-row__header">
<span class="sidebar-issues-panel__entity" title=${a}>${a}</span>
<time
class="sidebar-mention-row__age"
datetime=${new Date(t.createdAt).toISOString()}
title=${u(t.createdAt)}
>${c(t.createdAt)}</time
>
</div>
<span class="sidebar-issues-panel__state" title=${t.sessionTitle}
>${t.sessionTitle}</span
>
${t.excerpt?f`<p class="sidebar-mention-row__excerpt">${t.excerpt}</p>`:p}
<div class="sidebar-issues-panel__actions sidebar-mention-row__actions">
<a
class="sidebar-issues-panel__action sidebar-issues-panel__action--primary"
href=${s.href}
data-issue-row-focus
@click=${t=>{i(t)&&(t.preventDefault(),e.onClosePanel(),n.navigate(`chat`,s.options))}}
>${T(`attention.mentions.open`)}</a
>
<button
type="button"
class="sidebar-issues-panel__action"
?disabled=${e.dismissing}
@click=${e.onDismiss}
>
${T(e.dismissing?`attention.mentions.dismissing`:`attention.mentions.dismiss`)}
</button>
</div>
</div>
</div>
</article>`}function V(e){let t=e.context;if(!t)return p;let n=t.overlays.snapshot,r=e.approval.request.sessionKey?.trim(),a=r?t.sessions.state.result?.sessions.find(e=>l(e.key,r)):void 0,s=r?o({context:t,face:`chat`,sessionKey:r}):null;return ee({approval:e.approval,busy:n.approvalBusy,canGrant:n.approvalCanGrant,error:n.approvalErrors.get(e.approval.id)??null,openSessionHref:s?.href,sessionTitle:a?.displayName?.trim()||a?.label?.trim(),onDecision:e.onDecision,onOpenSession:s?n=>{i(n)&&(n.preventDefault(),e.onClosePanel(),t.navigate(`chat`,s.options))}:void 0})}function H(e){let t=e.context;if(!e.visible||!t)return p;let n=t.overlays.snapshot,r=t.gateway.snapshot;return f`<openclaw-sidebar-update-card
class="sidebar-issues-panel__update"
data-attention-kind="updateAvailable"
.compact=${!0}
.updateAvailable=${n.updateAvailable}
.updateSchedule=${n.updateSchedule}
.heldUpdateCampaignId=${n.heldUpdateCampaignId}
.updateBusy=${n.updateRunning||n.updateReconciliationPending}
.updateRun=${n.updateRun}
.updateRunAcknowledged=${n.updateRunAcknowledged}
.connected=${r.phase===`connected`}
.onAcknowledge=${()=>t.overlays.acknowledgeUpdateRun()}
.onCheckStatus=${()=>t.overlays.refreshUpdateStatus()}
.statusBanner=${n.updateStatusBanner}
.watchUpdateProgress=${e.watchUpdateProgress}
.canUpdate=${D(r,`update.run`,`operator.admin`)}
.canHoldUpdate=${D(r,`update.hold`,`operator.admin`)}
.onUpdate=${()=>void t.overlays.runUpdate()}
.refreshRequired=${!1}
.onHoldUpdate=${()=>t.overlays.holdUpdate()}
.onReviewUpdate=${e.onNavigate}
.onDismiss=${n.updateRun&&n.updateRun.status!==`running`?()=>t.overlays.acknowledgeUpdateRun():e.onDismiss}
></openclaw-sidebar-update-card>`}function U(e){switch(e.phase){case`guidance`:return T(`connection.scopeUpgrade.guidance`);case`available`:return T(`connection.scopeUpgrade.limited`);case`requesting`:return T(`connection.scopeUpgrade.requesting`);case`pending`:return T(`connection.scopeUpgrade.pending`);case`rejected`:return T(e.expired?`connection.scopeUpgrade.expired`:`connection.scopeUpgrade.rejected`);case`error`:return T(`connection.scopeUpgrade.error`,{error:e.message})}return e}function W(e){if(e.state.phase===`hidden`)return p;let t=U(e.state),n=T(`connection.scopeUpgrade.inboxState`),r=e.state.phase===`error`?e.state.retryable:e.state.phase===`pending`||e.state.phase===`rejected`;return f`<details
class="sidebar-issues-panel__details sidebar-issues-panel__details--${e.state.phase===`error`||e.state.phase===`rejected`?`error`:`warning`}"
data-attention-kind="scopeUpgrade"
>
<summary class="sidebar-issues-panel__summary" data-issue-row-focus>
<span class="sidebar-issues-panel__icon" aria-hidden="true">${C.shieldQuestion}</span>
<span class="sidebar-issues-panel__content">
<span class="sidebar-issues-panel__entity">${T(`connection.scopeUpgrade.status`)}</span>
<span class="sidebar-issues-panel__state" title=${n}>${n}</span>
</span>
${e.onDismiss?z(T(`connection.scopeUpgrade.status`),e.onDismiss):p}
<span class="sidebar-issues-panel__chevron" aria-hidden="true">${C.chevronRight}</span>
</summary>
<div class="sidebar-issues-panel__body" role="status" aria-live="polite">
<div>${t}</div>
${e.state.phase===`available`?f`<div class="sidebar-issues-panel__actions">
<button
type="button"
class="sidebar-issues-panel__action sidebar-issues-panel__action--primary"
@click=${e.onRequest}
>
${T(`connection.scopeUpgrade.request`)}
</button>
</div>`:e.state.phase===`requesting`?f`<div class="sidebar-issues-panel__actions">
<button
type="button"
class="sidebar-issues-panel__action sidebar-issues-panel__action--primary"
disabled
>
${T(`connection.scopeUpgrade.requestingAction`)}
</button>
</div>`:r||e.state.phase===`error`?f`<div class="sidebar-issues-panel__actions">
${r?f`<button
type="button"
class="sidebar-issues-panel__action sidebar-issues-panel__action--primary"
@click=${e.onRetry}
>
${T(`connection.scopeUpgrade.retry`)}
</button>`:p}
<button
type="button"
class="sidebar-issues-panel__action"
@click=${e.onCancel}
>
${T(`connection.scopeUpgrade.cancel`)}
</button>
</div>`:p}
</div>
</details>`}function G(e){return e.meta?f`<span class="sidebar-issues-panel__state-row" title=${e.detail}>
${e.meta.context?f`<span class="sidebar-issues-panel__meta-context">${e.meta.context}</span>
<span aria-hidden="true">·</span>`:p}
<span class="sidebar-issues-panel__meta-status">${e.meta.status}</span>
<span aria-hidden="true">·</span>
<span class="sidebar-issues-panel__meta-time">${e.meta.time}</span>
</span>`:f`<span class="sidebar-issues-panel__state" title=${e.detail}
>${e.detail}</span
>`}function K(e,t){if(e.action.kind!==`navigate`)return p;let n=e.action.routeId;return f`<div
class="sidebar-issues-panel__details sidebar-issues-panel__details--${e.severity}"
data-attention-kind=${e.kind}
>
<div class="sidebar-issues-panel__summary sidebar-issues-panel__summary--navigation">
<a
class="sidebar-issues-panel__navigation-link"
href=${v(n,t.basePath)}
data-issue-row-focus
@click=${e=>{i(e)&&(e.preventDefault(),t.onNavigate(n))}}
>
<span class="sidebar-issues-panel__icon" aria-hidden="true">${C[e.icon]}</span>
<span class="sidebar-issues-panel__content">
<span class="sidebar-issues-panel__entity" title=${e.label}>${e.label}</span>
${G(e)}
</span>
</a>
${z(e.label,t.onDismiss)}
<span class="sidebar-issues-panel__chevron" aria-hidden="true">${C.chevronRight}</span>
</div>
</div>`}function q(e,t){if(e.action.kind===`navigate`)return K(e,t);let n=(e.action.kind===`askCustodian`?e.action.alert.facts:[]).filter(t=>t!==e.label),r=e.action.kind===`askCustodian`?T(`nav.askOpenClaw`):e.label,i=e.inlineAction;return f`<details
class="sidebar-issues-panel__details sidebar-issues-panel__details--${e.severity}"
data-attention-kind=${e.kind}
>
<summary class="sidebar-issues-panel__summary" data-issue-row-focus>
<span
class="sidebar-issues-panel__icon ${e.kind===`modelAuthExpired`?`sidebar-issues-panel__icon--critical`:``}"
aria-hidden="true"
>${C[e.icon]}</span
>
<span class="sidebar-issues-panel__content">
<span class="sidebar-issues-panel__entity" title=${e.label}>${e.label}</span>
${G(e)}
</span>
${z(e.label,t.onDismiss)}
<span class="sidebar-issues-panel__chevron" aria-hidden="true">${C.chevronRight}</span>
</summary>
<div class="sidebar-issues-panel__body">
${n.length?f`<ul class="sidebar-issues-panel__facts">
${n.map(e=>f`<li>${e}</li>`)}
</ul>`:p}
<div class="sidebar-issues-panel__actions">
${i?f`<button
type="button"
class="sidebar-issues-panel__action sidebar-issues-panel__action--primary"
@click=${()=>t.onNavigate(i.routeId)}
>
${i.label}
</button>`:p}
<button
type="button"
class="sidebar-issues-panel__action ${i?``:`sidebar-issues-panel__action--primary`}"
@click=${()=>t.onOpen(e)}
>
${r}
</button>
</div>
</div>
</details>`}function J(){return(J=e((()=>{d(),h(),w(),s(),O(),n(),t(),N(),S(),I(),M()})))()}function Y(e){return T(Z[e])}var X,Z;function Q(){return(Q=e((()=>{w(),X=[`all`,`approvals`,`mentions`,`automations`,`system`],Z={all:`attention.tabs.all`,approvals:`attention.tabs.approvals`,mentions:`attention.tabs.mentions`,automations:`attention.tabs.automations`,system:`attention.tabs.system`}})))()}function te(e){let{anchor:t}=e.panelPosition,n=e.panelPosition.anchor===`top`?e.panelPosition.top:e.panelPosition.bottom,r=`left:${e.panelPosition.left}px;${t}:${n}px;--sidebar-issues-panel-${t}:${n}px`,a=e.entries.filter(t=>j(t,e.selectedTab)),o=a.flatMap(e=>e.dismissal?[e.dismissal]:[]),s=e.mentions.snapshot,c=a.flatMap(e=>e.type===`mention`?[e.mention.id]:[]),l=c.filter(e=>!s.dismissing.includes(e)),u=o.length>0||c.length>0,d=o.length>0||l.length>0,m=e.selectedTab===`mentions`,h=(m||e.selectedTab===`all`)&&(s.error!==null||s.phase===`loading`||m&&s.phase===`unavailable`),g=k(e.entries);return f`<button
type="button"
class="sidebar-issues-panel__backdrop"
aria-label=${T(`common.close`)}
@click=${()=>e.onClose(!0)}
></button>
<openclaw-menu-surface>
<section
id="sidebar-issues-panel"
class="sidebar-issues-panel"
role="dialog"
aria-modal=${_()?`true`:p}
aria-labelledby="sidebar-issues-panel-heading"
style=${r}
@keydown=${e.onKeydown}
>
<div class="sidebar-issues-panel__grabber" aria-hidden="true"></div>
<header class="sidebar-issues-panel__header">
<h2 id="sidebar-issues-panel-heading" class="sidebar-issues-panel__heading">
<span class="sidebar-issues-panel__heading-icon" aria-hidden="true"
>${C.inbox}</span
>
${T(`attention.issues`)}
</h2>
<div class="sidebar-issues-panel__header-actions">
<button
type="button"
class="btn btn--xs btn--ghost sidebar-issues-panel__dismiss-shown"
style=${u?p:`visibility:hidden`}
?disabled=${!d}
aria-hidden=${u?p:`true`}
@click=${()=>{for(let t of o)e.onDismiss(t);l.length>0&&e.mentions.dismiss(l)}}
>
${T(`attention.dismissShown`)}
</button>
<button
type="button"
class="sidebar-brand__icon sidebar-issues-panel__mobile-close"
aria-label=${T(`common.close`)}
@click=${()=>e.onClose(!0)}
>
${C.x}
</button>
</div>
</header>
${P({id:`sidebar-issues`,active:e.selectedTab,tabs:X.map(e=>({value:e,label:Y(e),count:g[e]>0?g[e]:null})),ariaLabel:T(`attention.tabs.label`),panelId:`sidebar-issues-tabpanel`,className:`sidebar-issues-panel__tabs`,variant:`sub`,onSelect:e.onSelectTab})}
<div class="sidebar-issues-panel__list-wrap">
<div
id="sidebar-issues-tabpanel"
class="sidebar-issues-panel__list"
role="tabpanel"
aria-labelledby=${`sidebar-issues-tab-${e.selectedTab}`}
tabindex="0"
@scroll=${e.onScroll}
>
${h?f`<div class="sidebar-issues-panel__mentions-note" role="status">
<span
>${T(s.error===null?s.phase===`loading`?`attention.mentions.loading`:`attention.mentions.unavailable`:`attention.mentions.error`)}</span
>
${s.error===null?p:f`<span>${s.error}</span>
<button
type="button"
class="sidebar-issues-panel__action"
?disabled=${s.phase===`loading`}
@click=${()=>void e.mentions.refresh()}
>
${T(`attention.mentions.refresh`)}
</button>`}
</div>`:p}
${a.length===0&&!h?f`<div class="sidebar-issues-panel__empty">
<span class="sidebar-issues-panel__empty-icon" aria-hidden="true"
>${C.inbox}</span
>
<strong
>${T(m?`attention.mentions.emptyTitle`:`attention.emptyTitle`)}</strong
>
<span
>${T(m?`attention.mentions.emptyBody`:`attention.emptyBody`)}</span
>
</div>`:p}
${a.map(t=>{let n=t.dismissal,r=n?()=>e.onDismiss(n):void 0;switch(t.type){case`approval`:return V({approval:t.approval,context:e.context,onClosePanel:()=>e.onClose(!1),onDecision:e.onApprovalDecision});case`attention`:return q(t,{basePath:e.context.basePath,onDismiss:r,onNavigate:e.onNavigate,onOpen:e.onOpen});case`mention`:return B({mention:t.mention,context:e.context,dismissing:s.dismissing.includes(t.mention.id),onDismiss:()=>void e.mentions.dismiss([t.mention.id]),onClosePanel:()=>e.onClose(!1)});case`scopeUpgrade`:return W({state:t.state,onCancel:()=>e.context.scopeUpgrade.cancel(),onDismiss:r,onRequest:()=>e.context.scopeUpgrade.request(),onRetry:()=>e.context.scopeUpgrade.retry()});case`update`:return H({context:e.context,onDismiss:r,onNavigate:()=>e.onNavigate(`updates`),visible:!0,watchUpdateProgress:e.watchUpdateProgress})}return t})}
</div>
<div
class="sidebar-issues-panel__overflow-cue sidebar-issues-panel__overflow-cue--top"
?hidden=${!e.overflowAbove}
aria-hidden="true"
></div>
<div
class="sidebar-issues-panel__overflow-cue sidebar-issues-panel__overflow-cue--bottom"
?hidden=${!e.overflowBelow}
aria-hidden="true"
></div>
</div>
${m?f`<footer class="sidebar-issues-panel__mentions-note">
<span>${T(`attention.mentions.retention`)}</span>
<a
href=${v(`notifications`,e.context.basePath)}
@click=${t=>{i(t)&&(t.preventDefault(),e.onNavigate(`notifications`))}}
>${T(`attention.mentions.notifications`)}</a
>
</footer>`:p}
</section>
</openclaw-menu-surface>`}function $(){return($=e((()=>{d(),h(),R(),b(),w(),F(),S(),A(),J(),Q(),E()})))()}$();export{L as ScopeUpgradeController,te as renderSidebarAttentionPanel};
//# sourceMappingURL=sidebar-attention-panel.runtime-BOkCPpjt.js.map