Files

526 lines
41 KiB
JavaScript

const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./workboard-card-dashboard-DaEhM7sA.js","./rolldown-runtime-DkW27tQK.js","./control-ui-foundation-CeFMP1Ly.js","./control-ui-core-pH6nakZ-.js","./lit-runtime-BEtFSUCp.js","./control-ui-core-DGVkFhVB.js","./control-ui-core-Br5DB0Zj.js","./gateway-runtime-DUNO4Mi1.js","./control-ui-core-C8H8-RSs.css","./control-ui-boot-Cdpgu1Gm.js","./control-ui-boot-wpHCbPL9.js","./control-ui-boot-gfE6fZcA.js","./config-runtime-C4gfjhZc.js","./control-ui-boot-CKTkvwFZ.js","./control-ui-boot-BPFwXC8p.js","./control-ui-boot-DdPrPuw0.js","./control-ui-boot-9_2QGLIL.js","./control-ui-boot-J-x6DHHT.js","./control-ui-boot-B1lcIXow.js","./control-ui-boot-Clhp68JE.js","./control-ui-boot-D1DWJlBr.js","./control-ui-boot-CQvujP8f.js","./control-ui-boot-BW_XZcbY.js","./control-ui-boot-__AsqpzJ.css","./markdown-runtime-BcrsAQtF.js"])))=>i.map(i=>d[i]);
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{Ci as t,Nr as n,Pr as r,Zr as i}from"./control-ui-foundation-CeFMP1Ly.js";import{$t as a,An as o,Cn as s,Dc as c,En as l,Js as u,Pn as d,Sn as f,bc as p,g as m,h,l as g,m as _,ms as v,ps as y,qs as b,vn as x,w as S,wn as C}from"./control-ui-core-pH6nakZ-.js";import{G as w,J as T,W as E}from"./lit-runtime-BEtFSUCp.js";import{Nt as D,Pt as O}from"./control-ui-core-DGVkFhVB.js";import{Ht as k,Lt as A,Rt as j,qt as M}from"./control-ui-core-Br5DB0Zj.js";import{n as ee,t as te}from"./workboard-board-glyph-f8SLNsbu.js";import{n as ne,t as re}from"./select-picker-BINM0f88.js";import{n as ie,o as ae,r as oe,s as se,t as ce}from"./mutations-BYbn2CZG.js";import{b as le,i as ue,r as de,t as N,x as fe,y as pe}from"./workboard-D4DxP9hk.js";function me(){return(me=e((()=>{})))()}function he(e,t){return e?.name??e?.identity?.name??e?.id??t}function ge(e,t){return e.agentId?.trim()||t?.defaultId||``}function _e(e,t){let n=ge(e,t);return n?t?.agents.find(e=>e.id===n):void 0}function ve(e,t){let n=e.agentId?.trim()||M(`workboard.defaultAgent`);return he(_e(e,t),n)}function ye(e,t,n){if(n===`all`)return!0;let r=e.agentId?.trim();return n==="default"?!r:r===n}function be(e,t,n){if(!n)return!0;let r=e.agentId?.trim();return r===n||!r&&t?.defaultId===n}function P(e){return typeof e==`string`?e.trim():``}function xe(e){let t=new Set,n=P(e?.defaultId),r=[];for(let i of e?.agents??[]){let e=P(i.id);!e||t.has(e)||(t.add(e),r.push({id:e,label:he(i,e),isDefault:!!(n&&e===n)}))}return r}function Se(e){return e.find(e=>e.isDefault)?.label??M(`workboard.defaultAgent`)}function Ce(e,t){let n=xe(e),r=new Set(n.map(e=>e.id)),i=[...new Set(t.map(e=>P(e.agentId)).filter(e=>e&&!r.has(e)))].toSorted((e,t)=>e.localeCompare(t)),a=[{id:`all`,label:M(`workboard.allAgents`)},{id:`default`,label:M(`workboard.agentFilterUnassigned`,{agent:Se(n)}),description:M(`workboard.agentFilterUnassignedHelp`)}];for(let e of n)a.push({id:e.id,label:e.isDefault?M(`workboard.agentFilterConfiguredDefault`,{agent:e.label}):e.label,...e.isDefault?{description:M(`workboard.agentFilterConfiguredDefaultHelp`)}:{}});for(let e of i)a.push({id:e,label:M(`workboard.agentCurrentUnconfigured`,{agent:e})});return a}function we(e,t){let n=xe(e?{...e,agents:u(e.agents)}:null),r=P(t),i=e?.agents.some(e=>e.id===r&&e.kind===`system`),a=!r||n.some(e=>e.id===r)||i;return[{id:``,label:M(`workboard.agentFilterUnassigned`,{agent:Se(n)})},...n.map(e=>({id:e.id,label:e.isDefault?M(`workboard.agentFilterConfiguredDefault`,{agent:e.label}):e.label})),...a?[]:[{id:r,label:M(`workboard.agentCurrentUnconfigured`,{agent:r})}]]}function Te(e,t){return e.some(e=>e.id===t)?t:`all`}function F(){return(F=e((()=>{k(),b()})))()}function Ee(e){return e?_(e,{month:`short`,day:`numeric`},``):``}function De(e){return new Intl.DateTimeFormat(void 0,{hour:`numeric`,minute:`2-digit`}).format(new Date(e))}function I(e){return e?h(e,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`},``):``}function Oe(e){return e?m(Math.max(0,Date.now()-e))??`0ms`:``}function L(e){return e.canWrite!==!1&&x(a(e.host))}function ke(e){return e.kind===`moved`&&e.toStatus?M(`workboard.eventMovedTo`,{status:z(e.toStatus)}):M(Be[e.kind])}function Ae(e,t){if(t.priority!==`all`&&e.priority!==t.priority)return!1;let n=t.query.trim().toLowerCase();return!n||[e.title,e.notes,e.agentId,e.sessionKey,e.execution?.engine,e.execution?.mode,e.execution?.model,e.execution?.sessionKey,e.metadata?.templateId,e.metadata?.automation?.tenant,e.metadata?.automation?.idempotencyKey,e.metadata?.automation?.workspace?.kind,e.metadata?.automation?.workspace?.path,e.metadata?.automation?.workspace?.branch,...e.metadata?.automation?.skills??[],...e.metadata?.automation?.createdCardIds??[],...(e.metadata?.comments??[]).map(e=>e.body),...(e.metadata?.links??[]).flatMap(e=>[e.title,e.url,e.targetCardId]),...(e.metadata?.proof??[]).flatMap(e=>[e.label,e.command,e.url,e.note]),...(e.metadata?.artifacts??[]).flatMap(e=>[e.label,e.url,e.path,e.mimeType]),...(e.metadata?.attachments??[]).flatMap(e=>[e.fileName,e.mimeType,e.note]),...(e.metadata?.workerLogs??[]).map(e=>e.message),e.metadata?.workerProtocol?.state,e.metadata?.workerProtocol?.detail,e.metadata?.claim?.ownerId,...(e.metadata?.diagnostics??[]).flatMap(e=>[e.kind,e.severity,e.title,e.detail]),...(e.metadata?.notifications??[]).map(e=>e.message),...e.labels].filter(e=>typeof e==`string`).some(e=>e.toLowerCase().includes(n))}function je(e){if(e.archived||e.kind===`global`)return!1;let t=[e.key,e.label,e.displayName].filter(e=>typeof e==`string`).join(`:`).toLowerCase();return!/(^|:)heartbeat(:|$)/.test(t)}function Me(e,t,n){if(!n)return null;let r=_e(t,e.agentsList),i=r?.agentRuntime?.id?.trim();if(!i)return null;let a=i.toLowerCase();return a===`openclaw`||a===`pi`?null:M(`workboard.engineDisabledRuntime`,{agent:he(r,t.agentId??M(`workboard.defaultAgent`)),runtime:i})}function Ne(e){let[t,n,r]=Ve[e.state];return{label:M(t),detail:n===void 0?void 0:M(n),tone:r}}function R(e){return e.status===`queued`||e.status===`running`?e.progressSummary??e.title??e.taskId:e.terminalSummary??e.error??e.progressSummary??e.title??e.taskId}function Pe(e,t){switch(e.status){case`queued`:case`running`:return t.state===`running`;case`completed`:return t.state===`succeeded`;case`failed`:case`cancelled`:case`timed_out`:return t.state===`failed`}throw Error(`Unknown workboard task status.`)}function Fe(e,t,n){return!!(e.taskId&&!t&&!n.has(e.taskId))}function Ie(e,t,n){return V(t)||e.status===`running`&&Fe(e,t,n)}function Le(e){let t=e.sessionKey??e.execution?.sessionKey,n=e.runId??e.execution?.runId;return e.status===`running`&&!!(t&&n)}function Re(e,t,n){let r=e.tasksByCardId.get(n.id),i=le(n,t),a=V(r)||Fe(n,r,e.missingTaskIds),o=n.sessionKey??n.execution?.sessionKey;return!a&&!Le(n)&&(!o||!i)}function ze(e){return e.blockedParents.length===0?null:M(`workboard.dependenciesBlockedTitle`,{parents:e.blockedParents.map(e=>{if(e.missing)return M(`workboard.dependencyMissing`,{parent:e.title});let t=e.status?z(e.status):M(`workboard.unknownStatus`);return`${e.title} (${t})`}).join(`, `)})}var Be,Ve,z,B,V;function H(){return(H=e((()=>{k(),S(),N(),F(),Be={created:`workboard.eventCreated`,edited:`workboard.eventEdited`,moved:`workboard.eventMoved`,linked:`workboard.eventLinked`,specified:`workboard.eventSpecified`,decomposed:`workboard.eventDecomposed`,claimed:`workboard.eventClaimed`,heartbeat:`workboard.eventHeartbeat`,execution_updated:`workboard.eventExecutionUpdated`,attempt_started:`workboard.eventAttemptStarted`,attempt_updated:`workboard.eventAttemptUpdated`,comment_added:`workboard.eventCommentAdded`,link_added:`workboard.eventLinkAdded`,proof_added:`workboard.eventProofAdded`,artifact_added:`workboard.eventArtifactAdded`,attachment_added:`workboard.eventAttachmentAdded`,diagnostic:`workboard.eventDiagnostic`,notification:`workboard.eventNotification`,dispatch:`workboard.eventDispatch`,orchestration:`workboard.eventOrchestration`,protocol_violation:`workboard.eventProtocolViolation`,archived:`workboard.eventArchived`,unarchived:`workboard.eventUnarchived`,stale:`workboard.eventStale`},Ve={queued:[`sessionsView.statusQueued`,void 0,`idle`],running:[`workboard.lifecycleRunning`,`workboard.lifecycleRunningDetail`,`live`],succeeded:[`workboard.lifecycleDone`,`workboard.lifecycleDoneDetail`,`done`],failed:[`workboard.lifecycleNeedsReview`,`workboard.lifecycleNeedsReviewDetail`,`blocked`],stale:[`workboard.lifecycleStale`,`workboard.lifecycleStaleDetail`,`blocked`],idle:[`workboard.lifecycleLinked`,`workboard.lifecycleIdleDetail`,`idle`],missing:[`workboard.lifecycleMissing`,`workboard.lifecycleMissingDetail`,`blocked`],unlinked:[`workboard.lifecycleUnlinked`,`workboard.lifecycleUnlinkedDetail`,`idle`]},z=e=>M(`workboard.status.${e}`),B=e=>e.charAt(0).toUpperCase()+e.slice(1),V=e=>e?.status===`queued`||e?.status===`running`})))()}function U(e){let t=ne({value:e.value,options:e.options,label:e.label,className:`workboard-select ${e.className??``}`,disabled:e.disabled,renderLeading:e=>e.boardId?ee({id:e.boardId,name:e.label,icon:e.icon,color:e.color}):w,onChange:t=>{e.onChange(t),e.requestUpdate?.()}});return e.showLabel===!1?t:T`
<div class="workboard-field">
<span>${e.label}</span>
${t}
</div>
`}function W(){return(W=e((()=>{E(),re(),te()})))()}function He(e,t,n,r){if(n.classList.contains(`workboard-draft__title`))e.draftTitle=n.value;else if(n.classList.contains(`workboard-draft__notes`))e.draftNotes=n.value;else if(n.classList.contains(`workboard-draft__labels`))e.draftLabels=n.value;else if(n.classList.contains(`workboard-comments__input`))e.draftCommentBody=n.value;else return;let i=t.querySelector(`.workboard-draft__submit`);i&&(i.disabled=r||!e.draftTitle.trim());let a=t.querySelector(`.workboard-comments__submit`);a&&(a.disabled=r||!e.draftCommentBody.trim())}function G(e,t,n,r){return{id:e,draftKey:t,labels:n,priority:r}}function Ue(e,t){o(e);let n=t.scopeAgentId?.trim(),r=t.agentsList?.defaultId?.trim()??t.defaultAgentId?.trim(),i=n?n===r?``:n:e.agentFilter===`all`||e.agentFilter==="default"?``:e.agentFilter;i&&(t.agentsList?we(t.agentsList,``).some(e=>e.id===i):n)&&(e.draftAgentId=i),e.draftOpen=!0}function We(e,t){e.draftOpen=!0,e.editingCardId=t.id,e.editingCardBase=t,e.draftTitle=t.title,e.draftNotes=t.notes??``,e.draftStatus=t.status,e.draftPriority=t.priority,e.draftLabels=t.labels.join(`, `),e.draftAgentId=t.agentId??``,e.draftSessionKey=d(t)??``,e.draftTemplateId=t.metadata?.templateId??``,e.draftCommentBody=``}function Ge(e,t){let n=q.find(e=>e.id===t);n&&(e.draftTemplateId=n.id,e.draftTitle=M(`workboard.templateDraft.${n.draftKey}Title`),e.draftNotes=M(`workboard.templateDraft.${n.draftKey}Notes`),e.draftLabels=n.labels,e.draftPriority=n.priority)}function Ke(e){let t=a(e.host),n=we(e.agentsList,t.draftAgentId),r=e.sessions.filter(je),s=t.statuses.map(e=>({value:e,label:z(e)})),c=i.map(e=>({value:e,label:B(e)})),l=n.map(t=>({value:t.id,label:t.label,agent:t.id?e.agentsList?.agents.find(e=>e.id===t.id)??{id:t.id}:void 0,icon:t.id?void 0:A.bot})),u=[{value:``,label:M(`workboard.noLinkedSession`)},...r.map(e=>({value:e.key,label:e.displayName??e.label??e.key}))];if(t.draftSessionKey&&!u.some(e=>e.value===t.draftSessionKey)&&u.push({value:t.draftSessionKey,label:t.draftSessionKey}),!t.draftOpen)return w;let d=!!t.editingCardId,f=(t.editingCardId?t.cards.find(e=>e.id===t.editingCardId)??null:null)?.metadata?.comments??[],p=d&&t.busyCardIds.has(t.editingCardId??``),m=!L(e)||t.loading||t.dispatching||p,h=t.draftSaving,g=()=>!h&&(o(t),!0);return T`
<openclaw-modal-dialog
label=${M(d?`workboard.editCard`:`workboard.newCard`)}
description=${M(d?`workboard.editCardHelp`:`workboard.newCardHelp`)}
style="--openclaw-modal-width: min(1120px, calc(100vw - 56px)); --openclaw-modal-max-height: calc(100dvh - 56px);"
@modal-cancel=${t=>{if(!g()){t.preventDefault();return}e.onRequestUpdate?.()}}
>
<form
id=${K}
class="workboard-draft"
aria-busy=${m?`true`:`false`}
@input=${e=>{let n=e.target;(n instanceof HTMLInputElement||n instanceof HTMLTextAreaElement)&&He(t,e.currentTarget,n,m)}}
@submit=${t=>{t.preventDefault(),!m&&se({host:e.host,client:e.client,requestUpdate:e.onRequestUpdate})}}
>
<div class="workboard-modal__header">
<div>
<h2 id=${qe}>
${M(d?`workboard.editCard`:`workboard.newCard`)}
</h2>
<p id=${Je}>
${M(d?`workboard.editCardHelp`:`workboard.newCardHelp`)}
</p>
</div>
<openclaw-tooltip .content=${M(`common.cancel`)}>
<button
class="btn btn--icon workboard-card__icon"
type="button"
aria-label=${M(`common.cancel`)}
?disabled=${h}
@click=${()=>{g()&&e.onRequestUpdate?.()}}
>
${A.x}
</button>
</openclaw-tooltip>
</div>
<div class="workboard-draft__body">
${d?w:T`
<div class="workboard-template-strip" aria-label=${M(`workboard.templatesLabel`)}>
${q.map(n=>T`
<button
class="btn btn--xs ${t.draftTemplateId===n.id?`workboard-template-strip__button--active`:``}"
type="button"
?disabled=${m}
@click=${()=>{Ge(t,n.id),e.onRequestUpdate?.()}}
>
${M(`workboard.template.${n.id}`)}
</button>
`)}
</div>
`}
<div class="workboard-draft__main">
<label class="workboard-field">
<span>${M(`workboard.fieldTitle`)}</span>
<input
class="input workboard-draft__title"
autofocus
placeholder=${M(`workboard.titlePlaceholder`)}
?disabled=${m}
.value=${t.draftTitle}
/>
</label>
<label class="workboard-field">
<span>${M(`workboard.fieldNotes`)}</span>
<textarea
class="input workboard-draft__notes"
placeholder=${M(`workboard.notesPlaceholder`)}
?disabled=${m}
.value=${t.draftNotes}
></textarea>
</label>
</div>
<div class="workboard-draft__meta">
${U({value:t.draftStatus,options:s,label:M(`workboard.fieldStatus`),onChange:e=>{t.draftStatus=e},requestUpdate:e.onRequestUpdate,disabled:m})}
${U({value:t.draftPriority,options:c,label:M(`workboard.fieldPriority`),onChange:e=>{t.draftPriority=e},requestUpdate:e.onRequestUpdate,disabled:m})}
<div class="workboard-field">
<span>${M(`workboard.fieldAgent`)}</span>
<openclaw-agent-select
class="workboard-agent-select"
.options=${l}
.value=${t.draftAgentId}
.accessibleLabel=${M(`workboard.fieldAgent`)}
.disabled=${m}
.onSelect=${n=>{t.draftAgentId=n,e.onRequestUpdate?.()}}
></openclaw-agent-select>
</div>
${U({value:t.draftSessionKey,options:u,label:M(`workboard.fieldSession`),onChange:e=>{t.draftSessionKey=e},requestUpdate:e.onRequestUpdate,disabled:m})}
<label class="workboard-field workboard-field--wide">
<span>${M(`workboard.fieldLabels`)}</span>
<input
class="input workboard-draft__labels"
placeholder=${M(`workboard.labelsPlaceholder`)}
?disabled=${m}
.value=${t.draftLabels}
/>
</label>
</div>
${d?T`
<section
class="workboard-field workboard-field--wide"
aria-labelledby="workboard-card-comments-title"
>
<span id="workboard-card-comments-title">
${M(`workboard.badgeComments`,{count:String(f.length)})}
</span>
${f.length?T`
<ol>
${f.map(e=>T`<li>${e.body}</li>`)}
</ol>
`:w}
<textarea
class="input workboard-comments__input"
aria-labelledby="workboard-card-comments-title"
maxlength="2000"
?disabled=${m}
.value=${t.draftCommentBody}
></textarea>
<div class="workboard-modal__actions">
<button
class="btn workboard-comments__submit"
type="button"
?disabled=${m||!t.draftCommentBody.trim()}
@click=${()=>{ce({host:e.host,client:e.client,requestUpdate:e.onRequestUpdate})}}
>
${A.plus} ${M(`common.create`)}
</button>
</div>
</section>
`:w}
</div>
<div class="workboard-modal__actions">
<button
class="btn primary workboard-draft__submit"
?disabled=${m||!t.draftTitle.trim()}
>
${M(d?`common.save`:`common.create`)}
</button>
<button
class="btn"
type="button"
?disabled=${h}
@click=${()=>{g()&&e.onRequestUpdate?.()}}
>
${M(`common.cancel`)}
</button>
</div>
</form>
</openclaw-modal-dialog>
`}var qe,Je,K,q;function Ye(){return(Ye=e((()=>{E(),j(),k(),s(),N(),F(),H(),W(),qe=`workboard-card-modal-title`,Je=`workboard-card-modal-description`,K=`workboard-card-modal`,q=[G(`bugfix`,`bugfix`,`fix, test`,`high`),G(`docs`,`docs`,`docs`,`normal`),G(`release`,`release`,`release`,`urgent`),G(`pr_review`,`prReview`,`review`,`normal`),G(`plugin`,`plugin`,`plugin`,`normal`)]})))()}function Xe(e,t,n){let r=a(e.host);!C(t)||n===t.status||r.busyCardIds.has(t.id)||r.dispatching||!L(e)||!e.connected||!e.client||ae({host:e.host,client:e.client,cardId:t.id,status:n,position:l(r.cards,t,n),requestUpdate:e.onRequestUpdate})}function Ze(e,t,n,r={}){let i=a(e.host),o=i.statuses.includes(t.status)?i.statuses:[t.status,...i.statuses];return!C(t)||o.length<2?w:T`
<label
class="workboard-card__move ${r.wide?`workboard-card__move--wide`:``}"
title=${M(`workboard.fieldStatus`)}
>
<span class="workboard-card__move-icon" aria-hidden="true">${A.cornerDownRight}</span>
<select
class="workboard-card__move-select"
aria-keyshortcuts="ArrowLeft ArrowRight"
aria-label=${`${M(`workboard.fieldStatus`)}: ${t.title}`}
.value=${t.status}
?disabled=${n||!e.connected||!e.client}
@change=${n=>{Xe(e,t,n.currentTarget.value)}}
@keydown=${n=>{if(n.key!==`ArrowLeft`&&n.key!==`ArrowRight`)return;if(i.busyCardIds.has(t.id)||i.dispatching||!e.connected||!e.client){n.preventDefault();return}let r=n.key===`ArrowRight`?1:-1,a=o[o.indexOf(t.status)+r];a&&(n.preventDefault(),Xe(e,t,a))}}
>
${o.map(e=>T`<option value=${e} ?selected=${e===t.status}>
${z(e)}
</option>`)}
</select>
</label>
`}function J(e){return T`
<span class="workboard-card__action-slot">
${e===w?T`<span class="workboard-card__action-placeholder" aria-hidden="true"></span>`:e}
</span>
`}function Qe(e,t){let n=a(e.host),r=n.tasksByCardId.get(t.id),i=le(t,e.sessions),o=n.busyCardIds.has(t.id)||n.dispatching,s=Ie(t,r,n.missingTaskIds),c=L(e);return{state:n,task:r,busy:o,activeTask:s,live:s||Le(t)||i?.hasActiveRun===!0||i?.hasActiveRun!==!1&&i?.status===`running`,linkedSessionKey:t.sessionKey??t.execution?.sessionKey,writable:c,showStartControls:c&&Re(n,e.sessions,t),archived:!!t.metadata?.archivedAt}}function Y(e){let t=T`
<button
class=${e.iconOnly?`btn btn--icon workboard-card__icon ${e.className??``}`:`btn ${e.className??``}`}
type="button"
aria-label=${e.label}
aria-haspopup=${e.ariaHaspopup??w}
?disabled=${e.disabled}
@click=${e.onClick}
>
${e.icon}${e.iconOnly?w:T`<span>${e.label}</span>`}
</button>
`;return e.iconOnly?T`<openclaw-tooltip .content=${e.label}>${t}</openclaw-tooltip>`:t}function $e(e,t,n={}){let r=a(e.host);return Y({label:M(`workboard.editCard`),icon:A.edit,iconOnly:n.iconOnly,ariaHaspopup:`dialog`,disabled:r.dispatching,onClick:()=>{We(r,t),e.onRequestUpdate?.()}})}function et(e,t,n,r,i={}){return Y({label:M(r?`workboard.unarchiveCard`:`workboard.archiveCard`),icon:r?A.archiveRestore:A.archive,iconOnly:i.iconOnly,disabled:n,onClick:()=>{ie({host:e.host,client:e.client,cardId:t.id,archived:!r,requestUpdate:e.onRequestUpdate})}})}function tt(e,t,n={}){return t?Y({label:M(`workboard.openSession`),icon:A.messageSquare,iconOnly:n.iconOnly,onClick:()=>e.onOpenSession(t)}):w}function nt(e,t,n,r={}){return Y({label:M(`workboard.stopSession`),icon:A.stop,iconOnly:r.iconOnly,disabled:n||!e.connected,onClick:()=>{ue({host:e.host,client:e.client,card:t,requestUpdate:e.onRequestUpdate})}})}function rt(e,t,n,r={}){return Y({label:M(`workboard.deleteCard`),icon:A.trash,iconOnly:r.iconOnly,className:`workboard-card__delete`,disabled:n,onClick:()=>{oe({host:e.host,client:e.client,cardId:t.id,requestUpdate:e.onRequestUpdate})}})}function it(e){return T`
<span class="workboard-engine-mark workboard-engine-mark--${e}" aria-hidden="true">
${e===`codex`?`OpenAI`:`Claude`}
</span>
`}function X(e,t,n,r,i={}){let o=a(e.host),s=o.busyCardIds.has(t.id)||o.dispatching,c=Me(e,t,n),l=M(n===`codex`?`workboard.engineOpenAI`:`workboard.engineClaude`),u=s||!e.connected||!!c||!!t.metadata?.archivedAt,d=c||(n?M(r===`autonomous`?`workboard.runEngine`:`workboard.openEngine`,{engine:l}):M(`workboard.runDefaultAgent`)),f=T`
<button
class="btn btn--xs workboard-card__start workboard-card__start--${r} ${i.iconOnly?`workboard-card__start--icon`:``} ${n?``:`workboard-card__start--default`}"
type="button"
aria-label=${d}
?disabled=${u}
@click=${async()=>{let i=await de({host:e.host,client:e.client,card:t,...n?{engine:n}:{},mode:r,requestUpdate:e.onRequestUpdate});i&&e.onOpenSession(i)}}
>
${n?T`${it(n)}${i.iconOnly?w:T`<span
>${M(r===`autonomous`?`workboard.run`:`workboard.open`)}</span
>`}`:T`${r===`autonomous`?A.play:A.penLine}${i.iconOnly?w:T`<span>${M(`workboard.start`)}</span>`}`}
</button>
`;return i.iconOnly?T`<openclaw-tooltip .content=${d}>${f}</openclaw-tooltip>`:f}function at(e,t){let n=e.canModelOverride!==!1;return T`
<div class="workboard-card__execution-controls">
${X(e,t,null,`autonomous`)}
${n?T`${X(e,t,`codex`,`autonomous`)}
${X(e,t,`claude`,`autonomous`)}`:w}
${X(e,t,`codex`,`manual`)}
${X(e,t,`claude`,`manual`)}
</div>
`}function ot(){return(ot=e((()=>{E(),j(),k(),s(),N(),Ye(),H()})))()}function st(){return D(`openclaw-workboard-card-dashboard`,()=>n(()=>import(`./workboard-card-dashboard-DaEhM7sA.js`),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24]),import.meta.url))}function ct(e,n){return!n||c(e)?e:`agent:${t(n)}:${e}`}function lt(e,t){e.detailCardId=t.id,e.detailCommentBody=``}function ut(e){e.detailCardId=null,e.detailCommentBody=``}function dt(e){if(!e.detailCardId||e.draftOpen)return null;let t=e.cards.find(t=>t.id===e.detailCardId)??null;return!t||t.metadata?.archivedAt&&!e.showArchived?null:t}function ft(e){return e.parents.length===0?w:T`
<section class="workboard-detail__section">
<h3>${M(`workboard.dependencies`)}</h3>
<ul class="workboard-detail__list workboard-detail__dependencies">
${e.parents.map(e=>T`
<li class=${e.done?`is-done`:`is-blocked`}>
${e.done?T`<span class="workboard-detail__dependency-spacer"></span>`:A.alertTriangle}
<span>${e.title}</span>
<span>
${e.missing?M(`workboard.dependencyStatusMissing`):e.status?z(e.status):M(`workboard.unknownStatus`)}
</span>
</li>
`)}
</ul>
</section>
`}function Z(e,t){if(typeof t!=`string`&&typeof t!=`number`)return w;let n=String(t).trim();return n?T`
<div class="workboard-detail__row">
<span>${e}</span>
<strong>${n}</strong>
</div>
`:w}function pt(e,t){let n=t.map(e=>e.trim()).filter(Boolean).slice(-6);return n.length===0?w:T`
<section class="workboard-detail__section">
<h3>${e}</h3>
<ol class="workboard-detail__list">
${n.map(e=>T`<li>${e}</li>`)}
</ol>
</section>
`}function mt(...e){return e.filter(Boolean).join(` - `)}function Q(e,...t){return e.map(e=>mt(...t.map(t=>e[t])))}function ht(e){let t=a(e.host),n=dt(t);if(!n)return w;let{task:r,busy:i,activeTask:o,live:s,linkedSessionKey:c,writable:l,showStartControls:u,archived:d}=Qe(e,n);c&&st().catch(()=>void 0);let p=fe(n,e.sessions,r),m=Ne(p),h=r?Pe(r,p):!1,g=n.metadata?.comments??[],_=n.metadata?.attempts??[],v=n.metadata?.links??[],b=n.metadata?.proof??[],x=n.metadata?.artifacts??[],S=n.metadata?.attachments??[],C=n.metadata?.diagnostics??[],E=n.metadata?.workerLogs??[],D=n.metadata?.workerProtocol,O=n.metadata?.automation,k=(n.events??[]).slice(-6).toReversed(),j=f(n,t.cards),ee=[[M(`workboard.fieldLabels`),n.labels],[M(`workboard.badgeAttempts`,{count:String(_.length)}),_.map(e=>mt(e.status,e.model,e.sessionKey,y(e.error)))],[M(`workboard.badgeLinks`,{count:String(v.length)}),Q(v,`type`,`title`,`targetCardId`,`url`)],[M(`workboard.detailProof`),Q(b,`status`,`label`,`command`,`url`,`note`)],[M(`workboard.badgeArtifacts`,{count:String(x.length)}),Q(x,`label`,`url`,`path`,`mimeType`)],[M(`workboard.badgeAttachments`,{count:String(S.length)}),Q(S,`fileName`,`mimeType`,`note`)],[M(`workboard.detailDiagnostics`),C.map(e=>`${e.severity}: ${e.title}`)],[M(`workboard.detailWorkerLogs`),E.map(e=>`${e.level}: ${y(e.message)}`)],[M(`workboard.detailWorkerProtocol`),D?[D.state,y(D.detail),D.updatedAt?M(`workboard.detailUpdatedValue`,{time:I(D.updatedAt)}):``]:[]],[M(`workboard.detailAutomation`),O?[O.tenant?M(`workboard.detailAutomationTenant`,{tenant:O.tenant}):``,O.boardId?M(`workboard.detailAutomationBoard`,{board:O.boardId}):``,O.skills?.length?M(`workboard.detailAutomationSkills`,{skills:O.skills.join(`, `)}):``,O.workspace?M(`workboard.detailAutomationWorkspace`,{workspace:[O.workspace.kind,O.workspace.path,O.workspace.branch].filter(Boolean).join(` `)}):``,O.dispatchCount?M(`workboard.badgeDispatches`,{count:String(O.dispatchCount)}):``,O.lastDispatchAt?M(`workboard.detailUpdatedValue`,{time:I(O.lastDispatchAt)}):``,O.summary?M(`workboard.detailAutomationSummary`,{summary:O.summary}):``]:[]],[M(`workboard.eventsLabel`),k.map(e=>`${ke(e)} ${I(e.at)}`)]];return T`
<openclaw-modal-dialog
class="drawer"
label=${n.title}
description=${r&&h?R(r):p.session?.displayName??m.detail}
style="--openclaw-modal-width: min(460px, 100vw); --openclaw-modal-max-height: 100dvh;"
@modal-cancel=${()=>{ut(t),e.onRequestUpdate?.()}}
>
<aside id=${$} class="workboard-detail-drawer">
<div class="workboard-detail">
<header class="workboard-detail__header">
<div>
<span class="workboard-card__priority">${B(n.priority)}</span>
<h2 id=${gt}>
<span class="sr-only">${M(`workboard.detailTitle`)}: </span>${n.title}
</h2>
</div>
<openclaw-tooltip .content=${M(`common.cancel`)}>
<button
class="btn btn--icon workboard-card__icon"
type="button"
aria-label=${M(`common.cancel`)}
@click=${()=>{ut(t),e.onRequestUpdate?.()}}
>
${A.x}
</button>
</openclaw-tooltip>
</header>
<section class="workboard-detail__section">
<div class="workboard-card__lifecycle">
<span class="workboard-lifecycle workboard-lifecycle--${m.tone}">
${m.label}
</span>
<span id=${_t} class="workboard-card__lifecycle-detail">
${r&&h?R(r):p.session?.displayName??m.detail}
</span>
</div>
<div class="workboard-detail__grid">
${Z(M(`workboard.fieldStatus`),z(n.status))}
${Z(M(`workboard.fieldAgent`),n.agentId??M(`workboard.defaultAgent`))}
${Z(M(`workboard.detailTask`),r?.taskId??n.taskId)}
${Z(M(`workboard.fieldSession`),c)}
${Z(M(`workboard.detailRun`),n.runId??n.execution?.runId)}
${Z(M(`workboard.detailUpdated`),I(n.updatedAt))}
</div>
</section>
${n.notes?T`
<section class="workboard-detail__section">
<h3>${M(`workboard.fieldNotes`)}</h3>
<p>${n.notes}</p>
</section>
`:w}
${c?T`
<openclaw-workboard-card-dashboard
.sessionKey=${ct(c,n.agentId)}
.client=${e.client}
.connected=${e.connected}
.canMutate=${e.canWrite!==!1}
.canGrant=${e.canGrant===!0}
></openclaw-workboard-card-dashboard>
`:w}
${ft(j)}
${ee.map(([e,t])=>pt(e,t))}
<section class="workboard-detail__section">
<h3>${M(`workboard.detailOperatorNotes`)}</h3>
${g.length?T`
<ol class="workboard-detail__list">
${g.slice(-6).map(e=>T`<li>${e.body}</li>`)}
</ol>
`:T`<p>${M(`workboard.detailNoNotes`)}</p>`}
${l?T`
<textarea
class="input workboard-detail__note"
maxlength="2000"
placeholder=${M(`workboard.detailNotePlaceholder`)}
.value=${t.detailCommentBody}
@input=${n=>{t.detailCommentBody=n.currentTarget.value,e.onRequestUpdate?.()}}
></textarea>
<button
class="btn"
type="button"
?disabled=${i||!t.detailCommentBody.trim()}
@click=${()=>ce({host:e.host,client:e.client,cardId:n.id,body:t.detailCommentBody,requestUpdate:e.onRequestUpdate})}
>
${A.plus} ${M(`workboard.detailAddNote`)}
</button>
`:w}
</section>
<div class="workboard-detail__actions">
${l&&!d?$e(e,n):w}
${l?et(e,n,i,d):w}
${l&&!d?Ze(e,n,i,{wide:!0}):w}
${l&&(c?s:o)?nt(e,n,i):w}
${tt(e,c)}
${l?rt(e,n,i):w}
${u?at(e,n):w}
</div>
</div>
</aside>
</openclaw-modal-dialog>
`}var $,gt,_t;function vt(){return(vt=e((()=>{E(),O(),j(),k(),v(),p(),N(),ot(),H(),r(),$=`workboard-card-detail-drawer`,gt=`workboard-card-detail-title`,_t=`workboard-card-detail-description`})))()}function yt(e){let t=(e.events??[]).toReversed().slice(0,4);return t.length===0?w:T`
<ol class="workboard-events" aria-label=${M(`workboard.eventsLabel`)}>
${t.map(e=>T`
<li>
<span>${ke(e)}</span>
<time>${Ee(e.at)}</time>
</li>
`)}
</ol>
`}function bt(e,t){return T`<span>${M(e,{count:String(t)})}</span>`}function xt(e,t){let n=e.metadata,r=[],i=n?.diagnostics?.toSorted((e,t)=>t.lastSeenAt-e.lastSeenAt)[0],a=e.status===`blocked`?n?.notifications?.at(-1)?.message??n?.workerProtocol?.detail??i?.detail:void 0;if(n?.templateId&&r.push(T`<span>${M(`workboard.template.${n.templateId}`)}</span>`),(t??e.taskId)&&r.push(T`<span>${M(`workboard.badgeTaskLinked`)}</span>`),n?.attempts?.length&&r.push(bt(`workboard.badgeAttempts`,n.attempts.length)),n?.failureCount&&r.push(T`
<span class="workboard-card__badge--warning">
${A.alertTriangle}${M(`workboard.badgeFailures`,{count:String(n.failureCount)})}
</span>
`),n?.comments?.length&&r.push(bt(`workboard.badgeComments`,n.comments.length)),n?.proof?.length&&r.push(bt(`workboard.badgeProof`,n.proof.length)),n?.claim){r.push(T`<span>${M(`workboard.badgeClaimed`,{owner:n.claim.ownerId})}</span>`);let e=Oe(n.claim.lastHeartbeatAt);e&&r.push(T`<span>${M(`workboard.badgeHeartbeat`,{age:e})}</span>`)}return i&&r.push(T`<span
class="workboard-card__badge--warning"
title=${y(i.detail)}
>
${A.alertTriangle}${g(i.title.trim(),64)}
</span>`),a&&r.push(T`<span
class="workboard-card__badge--warning"
title=${y(a)}
>
${A.alertTriangle}${g(y(a),64)}
</span>`),n?.stale&&r.push(T`<span class="workboard-card__badge--warning"
>${A.alertTriangle}${M(`workboard.badgeStale`)}</span
>`),r.length?T` <div class="workboard-card__badges">${r}</div> `:w}function St(e){return e.target instanceof Element&&!!e.target.closest(`button, a, input, select, textarea`)}function Ct(e,t){let n=ve(t,e.agentsList),r=t.agentId?M(`workboard.agentLinked`,{agent:n}):M(`workboard.agentDefaultLinked`,{agent:n});return T`<span class="workboard-agent-chip" title=${r}>${n}</span>`}function wt(e){if(e.parents.length===0)return w;let t=e.blockedParents.length,n=ze(e)??M(`workboard.dependenciesReadyTitle`,{count:String(e.parents.length)});return T`
<div class="workboard-dependencies" title=${n}>
${t>0?T`
<span class="workboard-dependency workboard-dependency--blocked">
${A.alertTriangle}${M(`workboard.dependenciesBlocked`,{count:String(t)})}
</span>
`:T`
<span class="workboard-dependency workboard-dependency--ready">
${M(`workboard.dependenciesReady`,{count:String(e.parents.length)})}
</span>
`}
</div>
`}function Tt(e,t,n){let r=fe(e,t.sessions,n),i=Ne(r),a=r.state===`stale`,o=n?Pe(n,r):!1,s=n&&o?M(`workboard.taskStatus.${n.status}`):null;return T`
<div class="workboard-card__lifecycle">
<span class="workboard-lifecycle workboard-lifecycle--${i.tone}">
${s??(a||!e.execution?i.label:`${e.execution.engine?`${e.execution.engine} `:``}${e.execution.mode}`)}
</span>
<span class="workboard-card__lifecycle-detail">
${n&&o?R(n):a?i.detail:r.session?.displayName??r.session?.label??i.detail}
</span>
</div>
`}function Et(e,t,n){let{state:r,task:i,busy:a,activeTask:o,live:s,linkedSessionKey:c,writable:l,showStartControls:u,archived:d}=Qe(e,t),p=n===`widget`,m=r.activeHealthHighlight?pe(t,r.activeHealthHighlight,e.sessions,i):!1,h=f(t,r.cards),g=!p&&u?X(e,t,null,`autonomous`,{iconOnly:!0}):w,_=!p&&l&&!d?$e(e,t,{iconOnly:!0}):w,v=!p&&l?et(e,t,a,d,{iconOnly:!0}):w,y=p?w:T`
<openclaw-tooltip .content=${M(`workboard.viewDetails`)}>
<button
class="btn btn--icon workboard-card__icon"
aria-label=${M(`workboard.viewDetails`)}
aria-haspopup="dialog"
aria-expanded=${r.detailCardId===t.id?`true`:`false`}
aria-controls=${$}
@click=${()=>{lt(r,t),e.onRequestUpdate?.()}}
>
${A.panelRightOpen}
</button>
</openclaw-tooltip>
`,b=p?w:tt(e,c,{iconOnly:!0}),x=!p&&l&&(c?s:o)?nt(e,t,a,{iconOnly:!0}):w,S=!d&&(l||p)?Ze(e,t,a||!l,{wide:p}):w,C=!p&&l?rt(e,t,a,{iconOnly:!0}):w;return T`
<article
class="workboard-card priority-${t.priority} ${a?`workboard-card--busy`:``} ${d?`workboard-card--archived`:``}
${r.draggedCardId===t.id?`workboard-card--dragging`:``} ${m?`workboard-card--health-highlight workboard-card--health-highlight-${r.activeHealthHighlight}`:``} ${p?`workboard-card--widget`:`workboard-card--openable`}"
role=${p?w:`button`}
tabindex=${p?w:`0`}
title=${p?w:M(`workboard.viewDetails`)}
aria-haspopup=${p?w:`dialog`}
aria-expanded=${p?w:r.detailCardId===t.id?`true`:`false`}
aria-controls=${p?w:$}
draggable=${l&&!d&&!r.dispatching?`true`:`false`}
@click=${n=>{!p&&!St(n)&&(lt(r,t),e.onRequestUpdate?.())}}
@keydown=${n=>{p||St(n)||n.key!==`Enter`&&n.key!==` `||(lt(r,t),e.onRequestUpdate?.(),n.preventDefault())}}
@dragstart=${n=>{if(!l||d||r.dispatching){n.preventDefault();return}r.draggedCardId=t.id,n.dataTransfer?.setData(`text/plain`,t.id),n.dataTransfer?.setDragImage(n.currentTarget,16,16),e.onRequestUpdate?.()}}
@dragend=${()=>{r.draggedCardId=null,e.onRequestUpdate?.()}}
>
<div class="workboard-card__top">
<div
class="workboard-card__updated"
title=${M(`workboard.detailUpdatedValue`,{time:I(t.updatedAt)})}
aria-label=${M(`workboard.detailUpdatedValue`,{time:I(t.updatedAt)})}
>
<span class="workboard-card__updated-icon" aria-hidden="true">${A.clock}</span>
<span>${I(t.updatedAt)}</span>
</div>
<div class="workboard-card__quick-actions">
${J(g)} ${J(_)}
${J(v)}
</div>
</div>
<div class="workboard-card__chips">
<span class="workboard-card__priority">${B(t.priority)}</span>
${Ct(e,t)}
${d?T`<span class="workboard-card__archived">${M(`workboard.archived`)}</span>`:w}
${s?T`<span class="workboard-live">${M(`workboard.live`)}</span>`:w}
</div>
<h3>${t.title}</h3>
${t.notes?T`<p>${t.notes}</p>`:w} ${Tt(t,e,i)}
${wt(h)}
${t.labels.length?T`<div class="workboard-labels">
${t.labels.map(e=>T`<span>${e}</span>`)}
</div>`:w}
${xt(t,i)}
<div class="workboard-card__meta">
<span>${c??M(`workboard.noLinkedSession`)}</span>
</div>
${yt(t)}
${p?T`<div class="workboard-card__actions workboard-card__actions--widget">
${S}
</div>`:T`<div class="workboard-card__actions">
${J(y)}
<div class="workboard-card__actions-primary">
${J(b)} ${J(x)}
${J(S)}
</div>
${J(C)}
</div>`}
</article>
`}function Dt(e,t,n,r={}){let i=a(e.host),o=L(e),s=r.surface??`page`,c=s===`page`,u=z(t),d=i.emptyColumnMode===`collapse`&&n.length===0&&!i.expandedEmptyStatuses.has(t),f=c&&(i.collapsedStatuses.has(t)||d);return T`
<section
class="workboard-column workboard-column--${t} ${i.draggedCardId?`workboard-column--drop`:``} ${f?`workboard-column--collapsed`:``}"
aria-label=${`${u}, ${n.length}`}
@dragover=${e=>{o&&i.draggedCardId&&e.preventDefault()}}
@drop=${n=>{if(n.preventDefault(),!o)return;let r=n.dataTransfer?.getData(`text/plain`)||i.draggedCardId,a=i.cards.find(e=>e.id===r);!a||!C(a)||ae({host:e.host,client:e.client,cardId:a.id,status:t,position:l(i.cards,a,t),requestUpdate:e.onRequestUpdate})}}
>
${f?T`
<button
class="workboard-column__rail"
type="button"
aria-label=${M(`workboard.expandColumn`,{column:u})}
aria-expanded="false"
@click=${()=>{i.collapsedStatuses.delete(t),n.length===0&&i.expandedEmptyStatuses.add(t),e.onRequestUpdate?.()}}
>
<span class="workboard-column__rail-title">${u}</span>
<span class="workboard-column__count">${n.length}</span>
<span class="workboard-column__rail-icon" aria-hidden="true">
<span
class="workboard-column__direction-icon workboard-column__direction-icon--expand-horizontal"
>${A.panelRightClose}</span
>
<span
class="workboard-column__direction-icon workboard-column__direction-icon--expand-vertical"
>${A.panelBottomOpen}</span
>
</span>
</button>
`:T`
<div class="workboard-column__header">
<h2>${u}</h2>
${c?T`
<div class="workboard-column__header-actions">
<span class="workboard-column__count">${n.length}</span>
<openclaw-tooltip
.content=${M(`workboard.collapseColumn`,{column:u})}
>
<button
class="btn btn--icon workboard-column__collapse"
type="button"
aria-label=${M(`workboard.collapseColumn`,{column:u})}
aria-expanded="true"
@click=${()=>{i.collapsedStatuses.add(t),i.expandedEmptyStatuses.delete(t),e.onRequestUpdate?.()}}
>
<span class="workboard-column__collapse-icon" aria-hidden="true">
<span
class="workboard-column__direction-icon workboard-column__direction-icon--collapse-horizontal"
>${A.panelRightOpen}</span
>
<span
class="workboard-column__direction-icon workboard-column__direction-icon--collapse-vertical"
>${A.panelBottomClose}</span
>
</span>
</button>
</openclaw-tooltip>
</div>
`:T`<span class="workboard-column__count">${n.length}</span>`}
</div>
<div class="workboard-column__cards">
${n.length?n.map(t=>Et(e,t,s)):T`<div class="workboard-empty">${M(`workboard.emptyColumn`)}</div>`}
</div>
`}
</section>
`}function Ot(){return(Ot=e((()=>{E(),j(),k(),v(),S(),s(),N(),F(),ot(),vt(),H()})))()}export{me as S,Ce as _,ht as a,be as b,Ke as c,U as d,L as f,Ae as g,H as h,vt as i,K as l,De as m,Dt as n,Ye as o,B as p,dt as r,Ue as s,Ot as t,W as u,F as v,Te as x,ye as y};
//# sourceMappingURL=view-card-DMysdVMQ.js.map