103 lines
13 KiB
JavaScript
103 lines
13 KiB
JavaScript
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{er as t}from"./control-ui-foundation-CeFMP1Ly.js";import{Aa as n,Da as r,Dc as i,Ea as a,Oa as o,U as s,Zn as c,b as l,bc as u,fl as d,fs as f,ja as p,jc as m,ka as h,lr as ee,ml as te,ms as g,ps as _,vr as v,w as y,y as b,yr as x}from"./control-ui-core-pH6nakZ-.js";import{G as S,J as C,W as w,Z as ne,h as re,m as ie,rt as T}from"./lit-runtime-BEtFSUCp.js";import{Cn as ae,Jt as oe,Kt as se,ln as ce,m as E,p as D,qt as O}from"./control-ui-core-DGVkFhVB.js";import{Ht as k,qt as A}from"./control-ui-core-Br5DB0Zj.js";import{F as j,I as M,In as N,L as P,Ln as F,z as I}from"./control-ui-boot-wpHCbPL9.js";import{$n as L,Bn as R,Gn as z,Hn as B,Kn as V,Ld as H,Ln as U,Qn as W,Rn as G,Un as le,Wn as ue,Xn as de,Yn as fe,Zn as pe,bn as me,mn as he,on as ge,qn as _e,un as K,vn as ve}from"./control-ui-boot-Cdpgu1Gm.js";import{n as ye,t as be}from"./settings-workspace-Bo4nqRhI.js";import{n as xe,t as Se}from"./gateway-page-controller-bzyUg03c.js";import{n as Ce,t as we}from"./agent-scope-control-C6P46hJO.js";function Te(e,t){let n=e.childSessionKey??e.sessionKey;if(!n)return S;let r=t.sessionRow(n),i=p({face:h(r),sessionKey:n,fallbackAgentId:t.agentId,basePath:t.basePath,mainKey:t.mainKey,row:r,preferenceDerivedFace:!0}).href;return C`<a
|
|
class="session-link"
|
|
href=${i}
|
|
@click=${e=>{s(e)&&(e.preventDefault(),t.onNavigateToChat(n))}}
|
|
>${A(`tasksPage.openSession`)}</a
|
|
>`}function Ee(e,t){let n=e.status===`queued`||e.status===`running`,r=W(e.updatedAt??e.createdAt),i=fe(e),a=L(e),o=t.cancellingTaskIds.has(e.id),s=e.terminalOutcome===`blocked`,c=s&&e.deliveryStatus===`failed`,u=s&&e.deliveryStatus===`dismissed`,d=n&&t.canCancel||s&&t.canCopy||c&&t.canCancel;return C`
|
|
<div class="settings-row task-row" data-task-id=${e.id}>
|
|
<div class="settings-row__text task-row__content">
|
|
<div class="settings-row__title">${a}</div>
|
|
<div class="task-row__facts">
|
|
<span data-task-status
|
|
>${me({kind:q(e.status),label:pe(e.status)})}</span
|
|
>
|
|
<span>${de(e)}</span>
|
|
${e.agentId?C`<span>${A(`tasksPage.agent`,{agent:e.agentId})}</span>`:S}
|
|
</div>
|
|
${i?C`<div class="settings-row__desc">${i}</div>`:S}
|
|
${s?C`<div class="task-row__warning">
|
|
<span
|
|
>${A(u?`tasksPage.deliveryDismissed`:`tasksPage.deliveryBlocked`)}</span
|
|
>
|
|
${c?C`<span class="muted">${A(`tasksPage.duplicateRisk`)}</span>`:S}
|
|
</div>`:S}
|
|
</div>
|
|
<div class="settings-row__control task-row__control">
|
|
<div class="task-row__links">
|
|
${r>0?C`<span title=${b(r)}>${l(r)}</span>`:C`<span>${A(`common.na`)}</span>`}
|
|
${Te(e,t)}
|
|
</div>
|
|
${d?C`<div class="task-row__actions">
|
|
${n&&t.canCancel?C`<button
|
|
class="btn btn--sm"
|
|
type="button"
|
|
aria-label=${A(`tasksPage.cancelTask`,{title:a})}
|
|
?disabled=${o||!t.connected}
|
|
@click=${()=>t.onCancel(e.taskId)}
|
|
>
|
|
${A(o?`tasksPage.cancelling`:`common.cancel`)}
|
|
</button>`:S}
|
|
${s&&t.canCopy?C`<button
|
|
class="btn btn--sm"
|
|
type="button"
|
|
?disabled=${o||!t.connected}
|
|
@click=${()=>t.onCopyResult(e.taskId)}
|
|
>
|
|
${A(`tasksPage.copyResult`)}
|
|
</button>`:S}
|
|
${c&&t.canCancel?C`
|
|
<button
|
|
class="btn btn--sm"
|
|
type="button"
|
|
?disabled=${o||!t.connected}
|
|
@click=${()=>t.onRetry(e.taskId)}
|
|
>
|
|
${A(`tasksPage.retryDelivery`)}
|
|
</button>
|
|
<button
|
|
class="btn btn--sm"
|
|
type="button"
|
|
?disabled=${o||!t.connected}
|
|
@click=${()=>t.onDismiss(e.taskId)}
|
|
>
|
|
${A(`tasksPage.dismissDelivery`)}
|
|
</button>
|
|
`:S}
|
|
</div>`:S}
|
|
</div>
|
|
</div>
|
|
`}function q(e){switch(e){case`completed`:return`ok`;case`failed`:case`timed_out`:return`danger`;case`queued`:case`running`:return`warn`;case`cancelled`:return`muted`}return e}function J(e,...t){return e.filter(e=>t.includes(e.status)).length}function De(e,t){let n=e===`active`?[[J(t,`running`),A(`tasksPage.status.running`)],[J(t,`queued`),A(`tasksPage.status.queued`)]]:[[J(t,`completed`),A(`tasksPage.status.completed`)],[J(t,`failed`,`timed_out`),A(`tasksPage.status.failed`)]];return C`<span class="task-heading-facts">
|
|
${n.map(([e,t],n)=>C`
|
|
${n>0?C`<span aria-hidden="true">·</span>`:S}
|
|
<span><strong>${e}</strong> ${t}</span>
|
|
`)}
|
|
</span>`}function Y(e,t,n,r,i){let a=n.length===0?K(r):re(n,e=>e.id,e=>Ee(e,i));return C`<div data-task-section=${e}>
|
|
${ve({title:C`${t}${De(e,n)}`},a)}
|
|
</div>`}function Oe(e){let{active:t,recent:n}=_e(e.tasks);return he(C`<div class="tasks-page-list">
|
|
${e.connected?S:C`<div class="callout warn">${A(`tasksPage.disconnected`)}</div>`}
|
|
${e.error?C`<div class="callout danger" role="alert">${e.error}</div>`:S}
|
|
${e.copyResultError?C`<div class="callout danger" role="alert">${e.copyResultError}</div>`:S}
|
|
${e.loading&&e.tasks.length===0?K(A(`tasksPage.loading`)):S}
|
|
${!e.loading&&e.tasks.length===0?K(A(`tasksPage.empty`)):S}
|
|
${Y(`active`,A(`tasksPage.active`),t,A(`tasksPage.emptyActive`),e)}
|
|
${Y(`recent`,A(`tasksPage.recent`),n,A(`tasksPage.emptyRecent`),e)}
|
|
</div>`,{wide:!0})}function X(){return(X=e((()=>{w(),ie(),ge(),k(),y(),r(),G()})))()}function Z(e,t){return t?e.agentId?.trim()?e.agentId.trim().toLowerCase()===t:[e.sessionKey,e.childSessionKey,e.ownerKey].some(e=>i(e)?.agentId===t):!0}async function ke(e){let t=[],n,r=new Set;for(;;){let i=await e.client.request(`tasks.list`,{status:[`queued`,`running`],limit:500,...e.agentId?{agentId:e.agentId}:{},...n===void 0?{}:{cursor:n}},{signal:e.signal}),a=z(i);if(!a)throw Error(A(`tasksPage.invalidResponse`));if(t=R(t,a.tasks),a.nextCursor===void 0)return t;if(!a.nextCursor||r.has(a.nextCursor))throw Error(A(`tasksPage.invalidResponse`));r.add(a.nextCursor),n=a.nextCursor}}var Q;function $(){return($=e((()=>{F(),j(),w(),ne(),ce(),E(),oe(),we(),be(),k(),c(),g(),r(),u(),G(),xe(),te(),x(),X(),Q=class extends d{constructor(...e){super(...e),this.tasks=[],this.error=null,this.copyResultError=null,this.cancellingTaskIds=new Set,this.taskRefreshEvents=null,this.copyResultAttempt=0,this.gateway=new Se(this,{getGateway:()=>this.context?.gateway,onIdentityChange:()=>{this.tasks=[],this.error=null,this.copyResultError=null},invalidateRequests:()=>this.cancelGatewayWork(),onSnapshot:()=>{this.gateway.connected&&this.context.agents.ensureList()},ensureInitialData:()=>void this.refreshTasks()}),this.observeAgentScope=H(()=>{this.gateway.invalidate(),this.cancelGatewayWork(),this.tasks=[],this.gateway.connected&&this.refreshTasks(),this.requestUpdate()}),this.listTask=new M(this,{autoRun:!1,args:()=>[this.gateway.connected?this.gateway.gateway:null,this.gateway.connected?this.gateway.client:null,this.context?.agentSelection.state.scopeId??null],task:async([e,t,n],{signal:r})=>{if(!e||!t)return P;let i={gateway:e,client:t,scopeId:n,events:[]};this.taskRefreshEvents=i;let a=n??void 0,[o,s]=await Promise.all([ke({client:t,agentId:a,signal:r}),t.request(`tasks.list`,{status:[`completed`,`failed`,`timed_out`,`cancelled`],limit:200,...a?{agentId:a}:{}},{signal:r})]),c=z(s);if(!c)throw Error(A(`tasksPage.invalidResponse`));return{active:o,recent:c.tasks,buffer:i}},onComplete:({active:e,recent:t,buffer:n})=>{let r=R(e,t);for(let e of n.events)r=U(r,e).tasks;this.tasks=r,this.taskRefreshEvents===n&&(this.taskRefreshEvents=null)},onError:e=>{this.taskRefreshEvents=null,this.error=f(e,A(`tasksPage.loadFailed`))}}),this.subscriptions=new v(this).effect(()=>this.context?.gateway,e=>e.subscribeEvents(t=>{if(this.gateway.gateway!==e||this.context.gateway!==e||!this.gateway.connected||t.event!==`task`)return;let n=U(this.tasks,t.payload);if(n.refetch){this.refreshTasks();return}let r=this.context.agentSelection.state.scopeId,i=B(t.payload);(i?.action===`deleted`||i?.action===`upserted`&&Z(i.task,r))&&this.bufferTaskRefreshEvent(i),this.tasks=n.tasks.filter(e=>Z(e,r))})).effect(()=>this.context?.agentSelection,e=>this.observeAgentScope(e)).watch(()=>this.context?.agents,(e,t)=>e.subscribe(t))}bufferTaskRefreshEvent(e){let t=this.taskRefreshEvents;e&&e.action!==`restored`&&t&&t.gateway===this.gateway.gateway&&t.client===this.gateway.client&&t.scopeId===this.context.agentSelection.state.scopeId&&t.events.push(e)}disconnectedCallback(){this.copyResultAttempt+=1,this.copyResultError=null,this.subscriptions.clear(),super.disconnectedCallback()}cancelGatewayWork(){this.copyResultAttempt+=1,this.copyResultError=null,this.taskRefreshEvents=null,this.listTask.run([null,null,null]),this.cancellingTaskIds=new Set}refreshTasks(){let e=this.gateway.gateway,t=this.gateway.client;if(!e||this.context.gateway!==e||!this.gateway.connected||!t)return Promise.resolve();let n=this.context.agentSelection.state.scopeId;return this.error=null,this.copyResultError=null,this.listTask.run([e,t,n])}async cancelTask(e){let t=this.gateway.capture(),n=this.gateway.gateway;if(!(!t||!n||this.context.gateway!==n||this.cancellingTaskIds.has(e))){this.cancellingTaskIds=new Set([...this.cancellingTaskIds,e]),this.error=null;try{let n=await t.client.request(`tasks.cancel`,{taskId:e});if(!this.gateway.isCurrent(t))return;let r=le(n);if(r?.task){let e=B({action:`upserted`,task:r.task});this.bufferTaskRefreshEvent(e),this.tasks=U(this.tasks,{action:`upserted`,task:r.task}).tasks}r?.cancelled||(this.error=_(r?.reason,A(`tasksPage.cancelFailed`)))}catch(e){this.gateway.isCurrent(t)&&(this.error=f(e,A(`tasksPage.cancelFailed`)))}finally{if(this.gateway.isCurrent(t)){let t=new Set(this.cancellingTaskIds);t.delete(e),this.cancellingTaskIds=t}}}}async recoverTask(e,t){let n=this.gateway.capture(),r=this.gateway.gateway;if(!(!n||!r||this.context.gateway!==r||this.cancellingTaskIds.has(e))){this.cancellingTaskIds=new Set([...this.cancellingTaskIds,e]),this.error=null;try{let r=t===`retry`?await n.client.request(`tasks.retry`,{taskIds:[e]}):await n.client.request(`tasks.dismiss`,{taskIds:[e]});if(!this.gateway.isCurrent(n))return;let i=V(r)?.results[0];if(!i?.ok){this.error=_(i?.reason,A(`tasksPage.recoveryFailed`));return}if(i.task){let e=B({action:`upserted`,task:i.task});this.bufferTaskRefreshEvent(e),this.tasks=U(this.tasks,e).tasks}}catch(e){this.gateway.isCurrent(n)&&(this.error=f(e,A(`tasksPage.recoveryFailed`)))}finally{if(this.gateway.isCurrent(n)){let t=new Set(this.cancellingTaskIds);t.delete(e),this.cancellingTaskIds=t}}}}async copyTaskResult(e){let t=++this.copyResultAttempt,n=this.gateway.capture(),r=this.gateway.gateway;if(!(!n||!r||this.context.gateway!==r))try{let r=ue(await n.client.request(`tasks.get`,{taskId:e}));if(!this.gateway.isCurrent(n)||t!==this.copyResultAttempt)return;let i=r?.result??r?.progressSummary;if(!i){this.copyResultError=A(`tasksPage.recoveryFailed`);return}let a=await ee(i,()=>this.gateway.isCurrent(n)&&t===this.copyResultAttempt);this.gateway.isCurrent(n)&&t===this.copyResultAttempt&&(this.copyResultError=a?null:A(`common.copyFailed`))}catch(e){this.gateway.isCurrent(n)&&t===this.copyResultAttempt&&(this.copyResultError=f(e,A(`tasksPage.recoveryFailed`)))}}render(){let e=o(this.context);return C`
|
|
<section class="content-header content-header--page">
|
|
<div>
|
|
<div class="page-title">${ae(`tasks`)}</div>
|
|
</div>
|
|
<div class="page-header-actions">
|
|
${Ce({agents:this.context.agents.state.agentsList?.agents??[],selection:this.context.agentSelection})}
|
|
<button
|
|
class="btn"
|
|
type="button"
|
|
?disabled=${!this.gateway.connected||this.listTask.status===I.PENDING}
|
|
@click=${()=>void this.refreshTasks()}
|
|
>
|
|
${this.listTask.status===I.PENDING?A(`common.refreshing`):A(`common.refresh`)}
|
|
</button>
|
|
</div>
|
|
</section>
|
|
${ye(Oe({basePath:this.context.basePath,agentId:e,mainKey:m({agentsList:this.context.agents.state.agentsList,hello:this.context.gateway.snapshot.hello}),connected:this.gateway.connected,canCopy:se(this.context.gateway.snapshot.hello?.auth??null),canCancel:O(this.context.gateway.snapshot.hello?.auth??null),loading:this.listTask.status===I.PENDING,error:this.error,copyResultError:this.copyResultError,tasks:this.tasks,cancellingTaskIds:this.cancellingTaskIds,sessionRow:e=>a(this.context,e),onCancel:e=>void this.cancelTask(e),onRetry:e=>void this.recoverTask(e,`retry`),onDismiss:e=>void this.recoverTask(e,`dismiss`),onCopyResult:e=>void this.copyTaskResult(e),onNavigateToChat:e=>{let t=n(this.context,e);this.context.navigate(t,p({context:this.context,face:t,sessionKey:e,preferenceDerivedFace:!0}).options)}}))}
|
|
`}},t([N({context:D,subscribe:!0})],Q.prototype,`context`,void 0),t([T()],Q.prototype,`tasks`,void 0),t([T()],Q.prototype,`error`,void 0),t([T()],Q.prototype,`copyResultError`,void 0),t([T()],Q.prototype,`cancellingTaskIds`,void 0),customElements.get(`openclaw-tasks-page`)||customElements.define(`openclaw-tasks-page`,Q)})))()}$();
|
|
//# sourceMappingURL=tasks-page-B8OWMI3Z.js.map
|