@humwick/server 0.130.3 → 0.130.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/docs/openapi.json +103 -1
- package/package.json +6 -6
- package/public/assets/{MessageBubble-Bq9kr21N.js → MessageBubble-BOkmEvgZ.js} +2 -2
- package/public/assets/{PlanGraphPanel-Dqiroy06.js → PlanGraphPanel-BkaDJp0r.js} +2 -2
- package/public/assets/{TraceView-DYU962-H.js → TraceView-B99Uu2yT.js} +2 -2
- package/public/assets/{VaultDecisionCard-DhPfzioE.js → VaultDecisionCard-DUIfTTFF.js} +2 -2
- package/public/assets/{activity-DzCcQTee.js → activity-ZIX0N1El.js} +2 -2
- package/public/assets/{agent-lineage-SgDt9i3T.js → agent-lineage-kq9TPYFw.js} +2 -2
- package/public/assets/agent-liveness-DSQY1Aa_.js +2 -0
- package/public/assets/{agent-name-CcY3Aijy.js → agent-name-C_7F4DFR.js} +2 -2
- package/public/assets/{agent-profiles-cxtRBn6O.js → agent-profiles-BNOcrGcY.js} +2 -2
- package/public/assets/{agent-project-badge-DGYbIhaI.js → agent-project-badge-B6yAh70a.js} +2 -2
- package/public/assets/{agent-tools-DHbftV0N.js → agent-tools-CcrhmOzF.js} +2 -2
- package/public/assets/{agent-type-icon-CY113sp-.js → agent-type-icon-CXSLrKiq.js} +2 -2
- package/public/assets/{agents-BPzY7IlQ.js → agents-DIZG97_X.js} +2 -2
- package/public/assets/{analytics-DENFPv_a.js → analytics-rasmoPjR.js} +2 -2
- package/public/assets/{artifact-viewer-KRvSc7sl.js → artifact-viewer-tBpTrEPb.js} +2 -2
- package/public/assets/{artifacts-C9gSmL3s.js → artifacts-BNkrynP1.js} +2 -2
- package/public/assets/{artifacts-DT-HkI5O.js → artifacts-Bjq-ZyBA.js} +2 -2
- package/public/assets/{automation-BsmjQhKD.js → automation-Cx422L3L.js} +2 -2
- package/public/assets/{backlog-8NYH_62t.js → backlog-RuFQ8PUu.js} +2 -2
- package/public/assets/{busy-health-D3hwvYb4.js → busy-health-BvNQ9g5x.js} +2 -2
- package/public/assets/{channels-DCJ5WL7O.js → channels-DNbKAS0I.js} +2 -2
- package/public/assets/{chat-DAIl357U.js → chat-Bp3Fx73h.js} +2 -2
- package/public/assets/{code-preview-CzrZfr9U.js → code-preview-KIRZA6cz.js} +2 -2
- package/public/assets/{connectors-xTxtlyou.js → connectors-k7vO4vvc.js} +2 -2
- package/public/assets/{cosmos-BpebFLK2.js → cosmos-BuVoq1aw.js} +2 -2
- package/public/assets/{crate-agent-BHvI5wXC.js → crate-agent-irqlt4NH.js} +2 -2
- package/public/assets/{dependency-graph-DGT0o3wJ.js → dependency-graph-D_rurNBz.js} +2 -2
- package/public/assets/{deploys-hqWOHSHE.js → deploys-yzZqIpxE.js} +2 -2
- package/public/assets/{display-CDeH4I8T.js → display-BemJG1f_.js} +2 -2
- package/public/assets/{files-BTeGVmTg.js → files-DXWcrxOz.js} +2 -2
- package/public/assets/{fleet-DgXtNgCa.js → fleet-TEuOCZXE.js} +2 -2
- package/public/assets/{fleet-metrics-BHEt5yc_.js → fleet-metrics-BGoDAFI-.js} +2 -2
- package/public/assets/{formatted-body-impl-CAe664Z8.js → formatted-body-impl-BB9eq9nN.js} +2 -2
- package/public/assets/{formatted-body-MLtodyPp.js → formatted-body-qy2nTD_1.js} +3 -3
- package/public/assets/{host-providers-dialog-mapF4Fj9.js → host-providers-dialog-BGPHxuwT.js} +2 -2
- package/public/assets/{index-CqqgOI5R.js → index-BC5XZc0z.js} +5 -5
- package/public/assets/{index-MYAIwYTX.css → index-D8Rp9pz2.css} +1 -1
- package/public/assets/{insights-DNyf7IzF.js → insights-C-KQG0h-.js} +2 -2
- package/public/assets/{integrations-DlYOHq7T.js → integrations-ClPRPyKU.js} +2 -2
- package/public/assets/{issue-ref-chip-CeWBNWn7.js → issue-ref-chip-DbH8J9Ak.js} +2 -2
- package/public/assets/{log-viewer-Cib8nqdE.js → log-viewer-PH4zVn24.js} +2 -2
- package/public/assets/{maintenance-DSn1cPm7.js → maintenance-5lV43uTL.js} +2 -2
- package/public/assets/{managed-agents-C3CkM81m.js → managed-agents-BdgU35aX.js} +2 -2
- package/public/assets/{markdown-preview-W4VQQPAv.js → markdown-preview-DNT4OUwQ.js} +3 -3
- package/public/assets/{markdown-preview-impl-CMsTdhjq.js → markdown-preview-impl-CnCcPy0A.js} +2 -2
- package/public/assets/{memory-BV17qtO4.js → memory--GgWH1gH.js} +2 -2
- package/public/assets/{messages-Bm_1AqSA.js → messages-CzFl_97O.js} +2 -2
- package/public/assets/{orchestrators-Dg-vfP09.js → orchestrators-CVvJVkzv.js} +2 -2
- package/public/assets/overview-DsrZvE86.js +2 -0
- package/public/assets/{pairs-8o9nuG3V.js → pairs-D2d0d2py.js} +2 -2
- package/public/assets/{profile-icon-BsRyBMea.js → profile-icon-_SMuSbYF.js} +2 -2
- package/public/assets/{project-profile-instructions-DETKFn_E.js → project-profile-instructions-Apn15y43.js} +2 -2
- package/public/assets/{projects-M_m6AHws.js → projects-D3B6kto5.js} +2 -2
- package/public/assets/{prompt-settings-C_mNCgeL.js → prompt-settings-DnPB6Ez6.js} +2 -2
- package/public/assets/provider-display-bWwiuedV.js +2 -0
- package/public/assets/{registry-DDHHHE5N.js → registry-D790cIhN.js} +2 -2
- package/public/assets/{run-card-Dt4I4jaP.js → run-card-BCro-Odj.js} +2 -2
- package/public/assets/{secrets-BkVwxI5O.js → secrets-CVXvfvbU.js} +2 -2
- package/public/assets/{service-access-settings-Crq-6a-B.js → service-access-settings-D3Xxqb9w.js} +2 -2
- package/public/assets/{settings-CYcavMFu.js → settings-CoUC7Jci.js} +2 -2
- package/public/assets/{shipping-H6gzEeZB.js → shipping-D_Lp9n_J.js} +2 -2
- package/public/assets/{stats-BJVeWkpV.js → stats-CXiNjB9S.js} +2 -2
- package/public/assets/{status-dot-BcHyw1Vw.js → status-dot-C703YIy1.js} +2 -2
- package/public/assets/store-BgDALGIX.js +9 -0
- package/public/assets/{tasks-qJjlQPpx.js → tasks-DO0WpJCx.js} +2 -2
- package/public/assets/{teams-Cd5Sk1uX.js → teams-FGkdi_tL.js} +2 -2
- package/public/assets/{terminal-viewer-CpY5_m7W.js → terminal-viewer-Dh8dSC7e.js} +3 -3
- package/public/assets/{terminal-viewer-impl-DI_2llFR.js → terminal-viewer-impl-B5Zriip3.js} +2 -2
- package/public/assets/{use-agent-terminal-0yJA_buM.js → use-agent-terminal-CRUVDvLC.js} +2 -2
- package/public/assets/{use-decisions-uJXHf34W.js → use-decisions-CoaqRh4l.js} +2 -2
- package/public/assets/{use-project-list-CpWl6eHQ.js → use-project-list-X-BgT53X.js} +2 -2
- package/public/assets/{use-selectors-BdxBW8mL.js → use-selectors-0X_UZkk-.js} +2 -2
- package/public/assets/{user-avatar-3IndfpOc.js → user-avatar-CkLhVBGu.js} +2 -2
- package/public/assets/{versioned-prompt-editor-CIVg7XB1.js → versioned-prompt-editor-BkTi7eim.js} +2 -2
- package/public/assets/{work-queue-B9rnLwHZ.js → work-queue-DDOLEyKo.js} +2 -2
- package/public/assets/{workflow-marker-X8wxyhzC.js → workflow-marker-CzOsB8BM.js} +2 -2
- package/public/assets/{workflows-o5YyMFW7.js → workflows-DJilvmRM.js} +2 -2
- package/public/assets/{workspaces-CzEGoAng.js → workspaces-CHcfbLR3.js} +2 -2
- package/public/cosmos.html +4 -4
- package/public/index.html +29 -29
- package/runner/plugins/claude/.claude-plugin/plugin.json +1 -1
- package/runner/src/adapters/claude-api.ts +1 -1
- package/runner/src/provider-setup.ts +2 -2
- package/src/auth/login-link.ts +35 -0
- package/src/cli/index.ts +7 -1
- package/src/cli/init.ts +53 -0
- package/src/cli/orchestrator.ts +1 -7
- package/src/cli/setup.ts +6 -4
- package/src/db/spawn-delegation.ts +2 -1
- package/src/db/workflow-execution.ts +3 -3
- package/src/dev.ts +4 -13
- package/src/init.ts +299 -0
- package/src/invite-link.ts +16 -9
- package/src/routes/auth.ts +30 -2
- package/src/routes/host-providers.ts +18 -0
- package/src/routes/index.ts +5 -2
- package/src/routes/orchestrator-bootstrap.ts +2 -0
- package/src/routes/secrets-backup.ts +2 -3
- package/src/routes/secrets-import.ts +2 -3
- package/src/routes/secrets-vault.ts +5 -7
- package/src/runtime-install.ts +30 -0
- package/src/server.ts +4 -4
- package/src/services/auth-context.ts +6 -0
- package/src/services/provider-api-key.ts +73 -0
- package/src/setup.ts +47 -8
- package/src/utils.ts +7 -0
- package/public/assets/agent-liveness-Bq-s73jW.js +0 -2
- package/public/assets/overview-DcYCrvlr.js +0 -2
- package/public/assets/provider-display-BEeLXC_D.js +0 -2
- package/public/assets/store-DKPDIZBe.js +0 -9
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{p as t,u as n}from"./dist-DeW2Y1R5.js";import{a as r,c as i,l as a,o,s,t as c}from"./store-DKPDIZBe.js";import{h as l}from"./display-CDeH4I8T.js";import{t as u}from"./api-CIIVBtAV.js";import{i as d,r as f,t as p}from"./tabs-jZgNvNHr.js";import{a as m,c as h,i as g,n as _,o as v,r as y,s as b,t as x}from"./warehouse-BanzOanY.js";import{t as S}from"./chevron-right-iljytE0x.js";import{t as C}from"./eye-BAP6fHrX.js";import{t as w}from"./gauge-BIODY-BQ.js";import{t as T}from"./hourglass-txu4ax6n.js";import{t as E}from"./lock-BW8MPKw_.js";import{t as D}from"./rocket-BmO1qSu-.js";import{n as O}from"./workflow-marker-X8wxyhzC.js";import{t as k}from"./button-Do6Z3vvn.js";import{t as A}from"./badge-DqJRtj_p.js";import{n as j}from"./agent-name-CcY3Aijy.js";import{t as M}from"./input-CsTB6jIx.js";import{t as N}from"./crate-agent-BHvI5wXC.js";import{t as P}from"./stats-BJVeWkpV.js";var F=e(t(),1),I=n();function L({incident:e}){let[t,n]=(0,F.useState)(``),[r,i]=(0,F.useState)(!1),[a,o]=(0,F.useState)(``);async function s(){i(!0),o(``);try{await u(`POST`,`/shipping/incidents/${encodeURIComponent(e.incidentId)}/abandon`,{reason:t}),await c.getState().openShipping()}catch(e){o(e.message)}finally{i(!1)}}return(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[(0,I.jsxs)(A,{variant:`destructive`,title:`${e.remote} lane ${e.laneKey}, incident ${e.state}`,children:[e.mainFailurePolicy===`advisory`?`advisory: red main`:`lane stopped: red main`,` `,e.sha.slice(0,12),`, incident `,e.incidentId]}),(0,I.jsx)(M,{"aria-label":`Abandon reason for ${e.incidentId}`,placeholder:`Reason to abandon incident`,value:t,maxLength:1e3,onChange:e=>n(e.target.value)}),(0,I.jsx)(k,{size:`sm`,variant:`outline`,disabled:r||!t.trim(),onClick:s,children:`Abandon incident`}),(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.mainFailurePolicy===`advisory`?`Lands continue. Deployment waits for a successful product check.`:`Releases the lane stop. Red CI still blocks deployment.`}),a&&(0,I.jsx)(`span`,{role:`alert`,children:a}),(0,I.jsx)(z,{incident:e})]})}var R=3;function z({incident:e}){let t=c(e=>e.openTaskDetailById),n=e.failingTests??[];return(0,I.jsxs)(`div`,{className:`flex w-full flex-wrap items-center gap-x-3 gap-y-0.5 text-xs text-muted-foreground`,children:[n.length>0&&(0,I.jsxs)(`span`,{"data-testid":`red-main-failing`,children:[`Failing: `,n.slice(0,R).map(e=>`${e.file} > ${e.name}`).join(`; `),n.length>R&&` (+${n.length-R} more)`]}),e.ownerTaskIds?.map(e=>(0,I.jsxs)(`button`,{type:`button`,className:`font-mono hover:underline`,onClick:()=>t(e),children:[`Owner T`,e]},e)),(0,I.jsx)(`a`,{href:e.runUrl,target:`_blank`,rel:`noreferrer`,className:`hover:underline`,children:`Failed CI run`})]})}function B({incidents:e}){return e?.length?(0,I.jsx)(`div`,{role:`alert`,"aria-label":`Red main`,className:`space-y-1.5`,children:e.map(e=>(0,I.jsx)(L,{incident:e},e.incidentId))}):null}var V={implementation:{label:`Implementation`,icon:v,hue:250},review:{label:`Review`,icon:C,hue:305},gates:{label:`Gates`,icon:g,hue:85},landing:{label:`Landing`,icon:m,hue:50},main:{label:`On main`,icon:x,hue:150},deploy:{label:`Deploy`,icon:D,hue:205},validated:{label:`Validated`,icon:h,hue:170}},H=new Intl.NumberFormat(void 0,{notation:`compact`,maximumFractionDigits:1}),U={done:`Done`,cd:`Relay CD`,steward:`Steward`,landing:`Relay landing`},W={builder:`Owner`,reviewer:`No reviewer yet · owner`,closer:`To close: owner`};function G({responsible:e}){let t=c(e=>e.agentsById);return(0,I.jsxs)(`span`,{"data-testid":`shipping-card-responsible`,className:`flex min-w-0 items-center gap-1`,children:[(0,I.jsx)(`span`,{className:`shrink-0`,children:e.kind===`relay`?U[e.role]??U.landing:W[e.role]??`Owner`}),e.id?(0,I.jsx)(j,{target:e.id,agentsById:t,className:`font-medium`}):e.kind===`owner`&&(0,I.jsx)(`span`,{className:`truncate text-muted-foreground`,children:`unassigned`})]})}var K=e=>e.kind===`relay`?e.role===`done`?`done`:`relay`:`agent`;function q({card:e,holder:t}){let{responsible:n}=e;if(n.kind===`relay`||!t){let e=n.kind===`relay`?n.role===`done`?h:b:_;return(0,I.jsxs)(`div`,{className:`mt-1.5 flex min-w-0 items-center gap-1 text-xs`,title:n.id,children:[(0,I.jsx)(e,{className:`h-3.5 w-3.5 shrink-0`,style:{color:`var(--crate)`},"aria-hidden":!0}),(0,I.jsx)(G,{responsible:n})]})}return(0,I.jsxs)(`div`,{className:`mt-1 text-xs`,children:[(0,I.jsx)(N,{holder:t,prefix:t.id===n.id&&n.role===`reviewer`?`Review:`:void 0}),n.kind===`owner`&&(0,I.jsx)(`div`,{className:`pl-5 text-[11px] text-muted-foreground`,title:n.id,children:(0,I.jsx)(G,{responsible:n})})]})}function J({card:e,holder:t,now:n,maxTokens:i,project:a}){let o=c(e=>e.openTaskDetailById),s=c(t=>t.workflowLiveIndex.byTask[e.taskId]),u=e.tokens?.total??0;return(0,I.jsxs)(`li`,{"data-testid":`shipping-card-${e.taskId}`,"data-owner":K(e.responsible),"data-live":t?.live===!0,"data-workflow":s?s.kind:void 0,onClick:()=>o(e.taskId),className:`ship-crate cursor-pointer rounded-md px-2.5 py-2 text-sm motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-left-3 motion-safe:duration-300`,children:[(0,I.jsxs)(`div`,{className:`flex min-w-0 items-baseline gap-1.5`,children:[(0,I.jsxs)(`span`,{className:`shrink-0 rounded bg-muted px-1 font-mono text-[11px] tabular-nums text-muted-foreground`,children:[`T`,e.taskId]}),e.signals.reviewHold&&(0,I.jsx)(`span`,{"data-testid":`shipping-card-review-hold`,role:`img`,"aria-label":`Review hold`,title:`Review hold: a complete delivery parks for review`,className:`shrink-0 self-center`,children:(0,I.jsx)(E,{className:`h-3 w-3`,style:{color:`var(--crate)`},"aria-hidden":!0})}),(0,I.jsx)(`button`,{type:`button`,className:`truncate rounded text-left font-medium hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,title:e.title,children:e.title})]}),s&&(0,I.jsxs)(`div`,{"data-testid":`shipping-card-workflow`,className:`mt-1 flex min-w-0 items-center gap-1 text-[11px] font-medium`,children:[(0,I.jsx)(O,{workflow:s.workflow,step:s.step}),(0,I.jsx)(`span`,{className:`truncate`,title:`Workflow run ${s.runId}`,children:r(s)})]}),e.signals.staleOwnerGone&&(0,I.jsxs)(`div`,{"data-testid":`shipping-card-stale`,className:`mt-1 flex items-center gap-1 text-[11px] text-tone-warning-fg`,title:`In progress or blocked, no change for 7 days, and its builder agent is gone`,children:[(0,I.jsx)(T,{className:`h-3 w-3 shrink-0`,"aria-hidden":!0}),(0,I.jsx)(`span`,{className:`truncate`,children:`Idle 7d+, builder gone`})]}),(0,I.jsx)(q,{card:e,holder:t}),(0,I.jsxs)(`div`,{className:`mt-1.5 flex items-center gap-2`,title:`Tokens spent on this Task`,children:[(0,I.jsx)(`div`,{className:`ship-meter h-1.5 min-w-0 flex-1 overflow-hidden rounded-full`,"aria-hidden":!0,children:(0,I.jsx)(`span`,{className:`block h-full rounded-full`,style:{width:`${i&&u?Math.max(4,u/i*100):0}%`}})}),(0,I.jsx)(`span`,{className:`shrink-0 font-mono text-xs tabular-nums text-muted-foreground`,children:e.tokens?H.format(e.tokens.total):`—`})]}),(0,I.jsxs)(`div`,{className:`mt-1 flex items-center justify-between gap-2 text-[11px] text-muted-foreground`,title:`In ${V[e.stage].label} since ${new Date(e.stageSince).toLocaleString()}`,children:[(0,I.jsxs)(`span`,{children:[`In stage `,l(n,e.stageSince)]}),a&&(0,I.jsx)(`span`,{className:`truncate`,"data-testid":`shipping-card-project`,children:a})]})]})}function Y({ci:e,all:t}){return e.length?(0,I.jsxs)(`div`,{role:`group`,"aria-label":`CI`,className:`flex flex-wrap items-center gap-1.5`,children:[(0,I.jsx)(`span`,{className:`text-[11px] font-medium uppercase tracking-wider text-muted-foreground`,"aria-hidden":!0,children:`CI`}),e.map(e=>(0,I.jsxs)(A,{variant:e.status===`failing`?`destructive`:`secondary`,title:`CI workflow ${e.workflow} on ${e.branch}, observed ${new Date(e.observedAt).toLocaleString()}`,children:[(0,I.jsx)(`span`,{className:`ship-lamp h-2 w-2 shrink-0 rounded-full`,"data-status":e.status,"aria-hidden":!0}),t?`${e.repository} `:``,e.workflow,` on `,e.branch,`: `,e.status]},`${e.repository}:${e.branch}:${e.workflow}`))]}):(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t?`No CI watches`:`No CI watch for this project`})}function X({board:e}){let t=e.projectLanes.filter(e=>e.gates.length>0);return t.length?(0,I.jsx)(`ul`,{className:`mb-2 space-y-1`,"data-testid":`shipping-gate-names`,children:t.map(t=>(0,I.jsxs)(`li`,{className:`flex flex-wrap gap-1`,children:[e.all&&(0,I.jsx)(`span`,{className:`w-full truncate text-[11px] text-muted-foreground`,children:t.title}),t.gates.map(e=>(0,I.jsx)(A,{variant:`outline`,className:`px-1.5 py-0 font-mono text-[11px] font-normal`,children:e},e))]},t.projectId))}):null}function Z({label:e,value:t,testId:n}){return(0,I.jsxs)(`div`,{"data-testid":n,className:`ship-hud min-w-0 rounded-md px-2.5 py-1.5`,children:[(0,I.jsx)(`div`,{className:`truncate text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:e}),(0,I.jsx)(`div`,{className:`font-mono text-lg font-semibold tabular-nums leading-tight`,children:t})]})}function Q({cards:e,agentsById:t,now:n}){let r=i(e,t,n);return(0,I.jsxs)(`div`,{className:`grid grid-cols-3 gap-2 sm:grid-cols-5`,"aria-label":`Board totals`,children:[(0,I.jsx)(Z,{testId:`shipping-hud-in-flight`,label:`In flight`,value:String(r.inFlight)}),(0,I.jsx)(Z,{testId:`shipping-hud-agents`,label:`With agents`,value:String(r.withAgents)}),(0,I.jsx)(Z,{testId:`shipping-hud-stale`,label:`No live agent`,value:String(r.withoutAgent)}),(0,I.jsx)(Z,{testId:`shipping-hud-relay`,label:`With Relay`,value:String(r.withRelay)}),(0,I.jsx)(Z,{testId:`shipping-hud-tokens`,label:`Tokens spent`,value:H.format(r.tokens)})]})}function $({stage:e,cards:t,holders:n,board:r,projectTitles:i,now:a,maxTokens:s}){let[c,l]=(0,F.useState)(!1),u=o.includes(e),d=e=>u?!n.get(e.taskId)?.live:e.signals.staleOwnerGone===!0,f=t.filter(e=>!d(e)),p=t.filter(d),{label:m,icon:h,hue:g}=V[e],_=e=>(0,I.jsx)(J,{card:e,holder:n.get(e.taskId)??null,now:a,maxTokens:s,project:r.all?i.get(e.projectId??``):void 0},e.taskId);return(0,I.jsxs)(`section`,{"data-testid":`shipping-lane-${e}`,"data-empty":t.length===0,"aria-label":m,className:`ship-lane min-w-0 rounded-lg p-2`,style:{"--stage-hue":g},children:[(0,I.jsxs)(`h3`,{className:`flex items-center gap-1.5 px-0.5 text-sm font-semibold`,children:[(0,I.jsx)(`span`,{className:`ship-lane-badge grid h-6 w-6 shrink-0 place-items-center rounded-md`,children:(0,I.jsx)(h,{className:`h-3.5 w-3.5`,"aria-hidden":!0})}),(0,I.jsx)(`span`,{className:`truncate`,children:m}),(0,I.jsx)(`span`,{"data-testid":`shipping-lane-count-${e}`,className:`ml-auto rounded-full bg-background/70 px-1.5 font-mono text-xs tabular-nums text-muted-foreground`,children:f.length})]}),(0,I.jsx)(`div`,{className:`ship-belt my-2`,"aria-hidden":!0}),e===`gates`&&(0,I.jsx)(X,{board:r}),f.length>0&&(0,I.jsx)(`ul`,{className:`space-y-1.5`,children:f.map(_)}),t.length===0&&(0,I.jsx)(`p`,{className:`max-lg:hidden rounded-md border border-dashed border-border/70 px-2 py-3 text-center text-[11px] text-muted-foreground`,children:`Bay clear`}),p.length>0&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsxs)(`button`,{type:`button`,"data-testid":`shipping-stale-toggle-${e}`,"aria-expanded":c,onClick:()=>l(!c),className:`mt-1.5 flex min-h-8 w-full items-center gap-1 rounded-md px-1.5 text-left text-xs text-muted-foreground hover:bg-background/60 hover:text-foreground`,children:[(0,I.jsx)(S,{className:`h-3.5 w-3.5 shrink-0 ${c?`rotate-90`:``}`,"aria-hidden":!0}),p.length,` `,u?`without a live agent`:`idle, builder gone`]}),c&&(0,I.jsx)(`ul`,{"data-testid":`shipping-stale-${e}`,className:`mt-1 space-y-1.5 opacity-75`,children:p.map(_)})]})]})}function ee({board:e,agentsById:t,now:n}){let r=new Map(e.projectLanes.map(e=>[e.projectId,e.title])),a=new Map(e.tasks.map(e=>[e.taskId,s(e,t,n)])),{maxTokens:o}=i(e.tasks,t,n);return(0,I.jsx)(`div`,{className:`overflow-x-auto pb-2`,children:(0,I.jsx)(`div`,{className:`ship-floor grid gap-2 rounded-xl border border-border p-2 lg:min-w-[calc(var(--lanes)*9.5rem)] lg:grid-cols-[repeat(var(--lanes),minmax(0,1fr))]`,style:{"--lanes":e.lanes.length},children:e.lanes.map(t=>(0,I.jsx)($,{stage:t,cards:e.tasks.filter(e=>e.stage===t),holders:a,board:e,projectTitles:r,now:n,maxTokens:o},t))})})}function te(){let e=c(e=>e.shippingBoard),t=c(e=>e.agents),n=c(e=>e.agentsById),r=Date.now(),i=e?a(e,t,r):null,o=c(e=>e.shippingLoading),s=c(e=>e.shippingError),l=c(e=>e.setShippingProject),u=c(e=>e.shippingTab),m=c(e=>e.setShippingTab),h=c(e=>e.shippingStatsProjectId),g=c(e=>e.setShippingStatsProject),_=c(e=>e.setAnalyticsTab),v=c(e=>e.switchView);return(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(y,{className:`h-5 w-5 text-muted-foreground`}),(0,I.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Shipping`})]}),(0,I.jsx)(p,{value:u,onValueChange:e=>m(e),children:(0,I.jsxs)(f,{children:[(0,I.jsx)(d,{value:`realtime`,children:`Realtime`}),(0,I.jsx)(d,{value:`stats`,children:`Statistics`})]})}),(0,I.jsxs)(`button`,{type:`button`,className:`ml-auto inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground`,onClick:()=>{_(`gates`),v(`analytics`)},children:[(0,I.jsx)(w,{className:`h-3.5 w-3.5`}),` Gate statistics`]}),i&&i.projects.length>0&&(0,I.jsxs)(`select`,{"aria-label":`Project`,className:`h-8 max-w-full min-w-0 rounded-md border border-border bg-background px-2 text-sm`,value:u===`stats`?h:i.all?`*`:i.projectId??``,onChange:e=>u===`stats`?g(e.target.value):l(e.target.value),children:[u===`stats`?(0,I.jsx)(`option`,{value:``,children:`All projects`}):(0,I.jsx)(`option`,{value:`*`,children:`All projects`}),i.projects.map(e=>(0,I.jsx)(`option`,{value:e.id,children:u===`stats`?e.title:`${e.title} (${e.inFlight})`},e.id))]}),u===`realtime`&&i&&(0,I.jsx)(Y,{ci:i.ci,all:i.all===!0}),u===`realtime`&&i&&(0,I.jsx)(B,{incidents:i.redMain})]}),u===`stats`&&(0,I.jsx)(P,{}),u===`realtime`&&s&&(0,I.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:[`Could not load the board: `,s]}),u===`realtime`&&!i&&o&&(0,I.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`Loading the board…`}),u===`realtime`&&i&&!i.projectId&&!i.all&&(0,I.jsx)(`div`,{className:`rounded-md border border-border px-3 py-12 text-center text-sm text-muted-foreground`,children:`No project has Tasks in progress.`}),u===`realtime`&&i&&(i.projectId||i.all)&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(Q,{cards:i.tasks,agentsById:n,now:r}),(0,I.jsx)(ee,{board:i,agentsById:n,now:r})]})]})}export{te as ShippingView};
|
|
2
|
-
//# sourceMappingURL=shipping-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{p as t,u as n}from"./dist-DeW2Y1R5.js";import{a as r,c as i,l as a,o,s,t as c}from"./store-BgDALGIX.js";import{h as l}from"./display-BemJG1f_.js";import{t as u}from"./api-CIIVBtAV.js";import{i as d,r as f,t as p}from"./tabs-jZgNvNHr.js";import{a as m,c as h,i as g,n as _,o as v,r as y,s as b,t as x}from"./warehouse-BanzOanY.js";import{t as S}from"./chevron-right-iljytE0x.js";import{t as C}from"./eye-BAP6fHrX.js";import{t as w}from"./gauge-BIODY-BQ.js";import{t as T}from"./hourglass-txu4ax6n.js";import{t as E}from"./lock-BW8MPKw_.js";import{t as D}from"./rocket-BmO1qSu-.js";import{n as O}from"./workflow-marker-CzOsB8BM.js";import{t as k}from"./button-Do6Z3vvn.js";import{t as A}from"./badge-DqJRtj_p.js";import{n as j}from"./agent-name-C_7F4DFR.js";import{t as M}from"./input-CsTB6jIx.js";import{t as N}from"./crate-agent-irqlt4NH.js";import{t as P}from"./stats-CXiNjB9S.js";var F=e(t(),1),I=n();function L({incident:e}){let[t,n]=(0,F.useState)(``),[r,i]=(0,F.useState)(!1),[a,o]=(0,F.useState)(``);async function s(){i(!0),o(``);try{await u(`POST`,`/shipping/incidents/${encodeURIComponent(e.incidentId)}/abandon`,{reason:t}),await c.getState().openShipping()}catch(e){o(e.message)}finally{i(!1)}}return(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-1.5`,children:[(0,I.jsxs)(A,{variant:`destructive`,title:`${e.remote} lane ${e.laneKey}, incident ${e.state}`,children:[e.mainFailurePolicy===`advisory`?`advisory: red main`:`lane stopped: red main`,` `,e.sha.slice(0,12),`, incident `,e.incidentId]}),(0,I.jsx)(M,{"aria-label":`Abandon reason for ${e.incidentId}`,placeholder:`Reason to abandon incident`,value:t,maxLength:1e3,onChange:e=>n(e.target.value)}),(0,I.jsx)(k,{size:`sm`,variant:`outline`,disabled:r||!t.trim(),onClick:s,children:`Abandon incident`}),(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.mainFailurePolicy===`advisory`?`Lands continue. Deployment waits for a successful product check.`:`Releases the lane stop. Red CI still blocks deployment.`}),a&&(0,I.jsx)(`span`,{role:`alert`,children:a}),(0,I.jsx)(z,{incident:e})]})}var R=3;function z({incident:e}){let t=c(e=>e.openTaskDetailById),n=e.failingTests??[];return(0,I.jsxs)(`div`,{className:`flex w-full flex-wrap items-center gap-x-3 gap-y-0.5 text-xs text-muted-foreground`,children:[n.length>0&&(0,I.jsxs)(`span`,{"data-testid":`red-main-failing`,children:[`Failing: `,n.slice(0,R).map(e=>`${e.file} > ${e.name}`).join(`; `),n.length>R&&` (+${n.length-R} more)`]}),e.ownerTaskIds?.map(e=>(0,I.jsxs)(`button`,{type:`button`,className:`font-mono hover:underline`,onClick:()=>t(e),children:[`Owner T`,e]},e)),(0,I.jsx)(`a`,{href:e.runUrl,target:`_blank`,rel:`noreferrer`,className:`hover:underline`,children:`Failed CI run`})]})}function B({incidents:e}){return e?.length?(0,I.jsx)(`div`,{role:`alert`,"aria-label":`Red main`,className:`space-y-1.5`,children:e.map(e=>(0,I.jsx)(L,{incident:e},e.incidentId))}):null}var V={implementation:{label:`Implementation`,icon:v,hue:250},review:{label:`Review`,icon:C,hue:305},gates:{label:`Gates`,icon:g,hue:85},landing:{label:`Landing`,icon:m,hue:50},main:{label:`On main`,icon:x,hue:150},deploy:{label:`Deploy`,icon:D,hue:205},validated:{label:`Validated`,icon:h,hue:170}},H=new Intl.NumberFormat(void 0,{notation:`compact`,maximumFractionDigits:1}),U={done:`Done`,cd:`Relay CD`,steward:`Steward`,landing:`Relay landing`},W={builder:`Owner`,reviewer:`No reviewer yet · owner`,closer:`To close: owner`};function G({responsible:e}){let t=c(e=>e.agentsById);return(0,I.jsxs)(`span`,{"data-testid":`shipping-card-responsible`,className:`flex min-w-0 items-center gap-1`,children:[(0,I.jsx)(`span`,{className:`shrink-0`,children:e.kind===`relay`?U[e.role]??U.landing:W[e.role]??`Owner`}),e.id?(0,I.jsx)(j,{target:e.id,agentsById:t,className:`font-medium`}):e.kind===`owner`&&(0,I.jsx)(`span`,{className:`truncate text-muted-foreground`,children:`unassigned`})]})}var K=e=>e.kind===`relay`?e.role===`done`?`done`:`relay`:`agent`;function q({card:e,holder:t}){let{responsible:n}=e;if(n.kind===`relay`||!t){let e=n.kind===`relay`?n.role===`done`?h:b:_;return(0,I.jsxs)(`div`,{className:`mt-1.5 flex min-w-0 items-center gap-1 text-xs`,title:n.id,children:[(0,I.jsx)(e,{className:`h-3.5 w-3.5 shrink-0`,style:{color:`var(--crate)`},"aria-hidden":!0}),(0,I.jsx)(G,{responsible:n})]})}return(0,I.jsxs)(`div`,{className:`mt-1 text-xs`,children:[(0,I.jsx)(N,{holder:t,prefix:t.id===n.id&&n.role===`reviewer`?`Review:`:void 0}),n.kind===`owner`&&(0,I.jsx)(`div`,{className:`pl-5 text-[11px] text-muted-foreground`,title:n.id,children:(0,I.jsx)(G,{responsible:n})})]})}function J({card:e,holder:t,now:n,maxTokens:i,project:a}){let o=c(e=>e.openTaskDetailById),s=c(t=>t.workflowLiveIndex.byTask[e.taskId]),u=e.tokens?.total??0;return(0,I.jsxs)(`li`,{"data-testid":`shipping-card-${e.taskId}`,"data-owner":K(e.responsible),"data-live":t?.live===!0,"data-workflow":s?s.kind:void 0,onClick:()=>o(e.taskId),className:`ship-crate cursor-pointer rounded-md px-2.5 py-2 text-sm motion-safe:animate-in motion-safe:fade-in motion-safe:slide-in-from-left-3 motion-safe:duration-300`,children:[(0,I.jsxs)(`div`,{className:`flex min-w-0 items-baseline gap-1.5`,children:[(0,I.jsxs)(`span`,{className:`shrink-0 rounded bg-muted px-1 font-mono text-[11px] tabular-nums text-muted-foreground`,children:[`T`,e.taskId]}),e.signals.reviewHold&&(0,I.jsx)(`span`,{"data-testid":`shipping-card-review-hold`,role:`img`,"aria-label":`Review hold`,title:`Review hold: a complete delivery parks for review`,className:`shrink-0 self-center`,children:(0,I.jsx)(E,{className:`h-3 w-3`,style:{color:`var(--crate)`},"aria-hidden":!0})}),(0,I.jsx)(`button`,{type:`button`,className:`truncate rounded text-left font-medium hover:underline focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring`,title:e.title,children:e.title})]}),s&&(0,I.jsxs)(`div`,{"data-testid":`shipping-card-workflow`,className:`mt-1 flex min-w-0 items-center gap-1 text-[11px] font-medium`,children:[(0,I.jsx)(O,{workflow:s.workflow,step:s.step}),(0,I.jsx)(`span`,{className:`truncate`,title:`Workflow run ${s.runId}`,children:r(s)})]}),e.signals.staleOwnerGone&&(0,I.jsxs)(`div`,{"data-testid":`shipping-card-stale`,className:`mt-1 flex items-center gap-1 text-[11px] text-tone-warning-fg`,title:`In progress or blocked, no change for 7 days, and its builder agent is gone`,children:[(0,I.jsx)(T,{className:`h-3 w-3 shrink-0`,"aria-hidden":!0}),(0,I.jsx)(`span`,{className:`truncate`,children:`Idle 7d+, builder gone`})]}),(0,I.jsx)(q,{card:e,holder:t}),(0,I.jsxs)(`div`,{className:`mt-1.5 flex items-center gap-2`,title:`Tokens spent on this Task`,children:[(0,I.jsx)(`div`,{className:`ship-meter h-1.5 min-w-0 flex-1 overflow-hidden rounded-full`,"aria-hidden":!0,children:(0,I.jsx)(`span`,{className:`block h-full rounded-full`,style:{width:`${i&&u?Math.max(4,u/i*100):0}%`}})}),(0,I.jsx)(`span`,{className:`shrink-0 font-mono text-xs tabular-nums text-muted-foreground`,children:e.tokens?H.format(e.tokens.total):`—`})]}),(0,I.jsxs)(`div`,{className:`mt-1 flex items-center justify-between gap-2 text-[11px] text-muted-foreground`,title:`In ${V[e.stage].label} since ${new Date(e.stageSince).toLocaleString()}`,children:[(0,I.jsxs)(`span`,{children:[`In stage `,l(n,e.stageSince)]}),a&&(0,I.jsx)(`span`,{className:`truncate`,"data-testid":`shipping-card-project`,children:a})]})]})}function Y({ci:e,all:t}){return e.length?(0,I.jsxs)(`div`,{role:`group`,"aria-label":`CI`,className:`flex flex-wrap items-center gap-1.5`,children:[(0,I.jsx)(`span`,{className:`text-[11px] font-medium uppercase tracking-wider text-muted-foreground`,"aria-hidden":!0,children:`CI`}),e.map(e=>(0,I.jsxs)(A,{variant:e.status===`failing`?`destructive`:`secondary`,title:`CI workflow ${e.workflow} on ${e.branch}, observed ${new Date(e.observedAt).toLocaleString()}`,children:[(0,I.jsx)(`span`,{className:`ship-lamp h-2 w-2 shrink-0 rounded-full`,"data-status":e.status,"aria-hidden":!0}),t?`${e.repository} `:``,e.workflow,` on `,e.branch,`: `,e.status]},`${e.repository}:${e.branch}:${e.workflow}`))]}):(0,I.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:t?`No CI watches`:`No CI watch for this project`})}function X({board:e}){let t=e.projectLanes.filter(e=>e.gates.length>0);return t.length?(0,I.jsx)(`ul`,{className:`mb-2 space-y-1`,"data-testid":`shipping-gate-names`,children:t.map(t=>(0,I.jsxs)(`li`,{className:`flex flex-wrap gap-1`,children:[e.all&&(0,I.jsx)(`span`,{className:`w-full truncate text-[11px] text-muted-foreground`,children:t.title}),t.gates.map(e=>(0,I.jsx)(A,{variant:`outline`,className:`px-1.5 py-0 font-mono text-[11px] font-normal`,children:e},e))]},t.projectId))}):null}function Z({label:e,value:t,testId:n}){return(0,I.jsxs)(`div`,{"data-testid":n,className:`ship-hud min-w-0 rounded-md px-2.5 py-1.5`,children:[(0,I.jsx)(`div`,{className:`truncate text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:e}),(0,I.jsx)(`div`,{className:`font-mono text-lg font-semibold tabular-nums leading-tight`,children:t})]})}function Q({cards:e,agentsById:t,now:n}){let r=i(e,t,n);return(0,I.jsxs)(`div`,{className:`grid grid-cols-3 gap-2 sm:grid-cols-5`,"aria-label":`Board totals`,children:[(0,I.jsx)(Z,{testId:`shipping-hud-in-flight`,label:`In flight`,value:String(r.inFlight)}),(0,I.jsx)(Z,{testId:`shipping-hud-agents`,label:`With agents`,value:String(r.withAgents)}),(0,I.jsx)(Z,{testId:`shipping-hud-stale`,label:`No live agent`,value:String(r.withoutAgent)}),(0,I.jsx)(Z,{testId:`shipping-hud-relay`,label:`With Relay`,value:String(r.withRelay)}),(0,I.jsx)(Z,{testId:`shipping-hud-tokens`,label:`Tokens spent`,value:H.format(r.tokens)})]})}function $({stage:e,cards:t,holders:n,board:r,projectTitles:i,now:a,maxTokens:s}){let[c,l]=(0,F.useState)(!1),u=o.includes(e),d=e=>u?!n.get(e.taskId)?.live:e.signals.staleOwnerGone===!0,f=t.filter(e=>!d(e)),p=t.filter(d),{label:m,icon:h,hue:g}=V[e],_=e=>(0,I.jsx)(J,{card:e,holder:n.get(e.taskId)??null,now:a,maxTokens:s,project:r.all?i.get(e.projectId??``):void 0},e.taskId);return(0,I.jsxs)(`section`,{"data-testid":`shipping-lane-${e}`,"data-empty":t.length===0,"aria-label":m,className:`ship-lane min-w-0 rounded-lg p-2`,style:{"--stage-hue":g},children:[(0,I.jsxs)(`h3`,{className:`flex items-center gap-1.5 px-0.5 text-sm font-semibold`,children:[(0,I.jsx)(`span`,{className:`ship-lane-badge grid h-6 w-6 shrink-0 place-items-center rounded-md`,children:(0,I.jsx)(h,{className:`h-3.5 w-3.5`,"aria-hidden":!0})}),(0,I.jsx)(`span`,{className:`truncate`,children:m}),(0,I.jsx)(`span`,{"data-testid":`shipping-lane-count-${e}`,className:`ml-auto rounded-full bg-background/70 px-1.5 font-mono text-xs tabular-nums text-muted-foreground`,children:f.length})]}),(0,I.jsx)(`div`,{className:`ship-belt my-2`,"aria-hidden":!0}),e===`gates`&&(0,I.jsx)(X,{board:r}),f.length>0&&(0,I.jsx)(`ul`,{className:`space-y-1.5`,children:f.map(_)}),t.length===0&&(0,I.jsx)(`p`,{className:`max-lg:hidden rounded-md border border-dashed border-border/70 px-2 py-3 text-center text-[11px] text-muted-foreground`,children:`Bay clear`}),p.length>0&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsxs)(`button`,{type:`button`,"data-testid":`shipping-stale-toggle-${e}`,"aria-expanded":c,onClick:()=>l(!c),className:`mt-1.5 flex min-h-8 w-full items-center gap-1 rounded-md px-1.5 text-left text-xs text-muted-foreground hover:bg-background/60 hover:text-foreground`,children:[(0,I.jsx)(S,{className:`h-3.5 w-3.5 shrink-0 ${c?`rotate-90`:``}`,"aria-hidden":!0}),p.length,` `,u?`without a live agent`:`idle, builder gone`]}),c&&(0,I.jsx)(`ul`,{"data-testid":`shipping-stale-${e}`,className:`mt-1 space-y-1.5 opacity-75`,children:p.map(_)})]})]})}function ee({board:e,agentsById:t,now:n}){let r=new Map(e.projectLanes.map(e=>[e.projectId,e.title])),a=new Map(e.tasks.map(e=>[e.taskId,s(e,t,n)])),{maxTokens:o}=i(e.tasks,t,n);return(0,I.jsx)(`div`,{className:`overflow-x-auto pb-2`,children:(0,I.jsx)(`div`,{className:`ship-floor grid gap-2 rounded-xl border border-border p-2 lg:min-w-[calc(var(--lanes)*9.5rem)] lg:grid-cols-[repeat(var(--lanes),minmax(0,1fr))]`,style:{"--lanes":e.lanes.length},children:e.lanes.map(t=>(0,I.jsx)($,{stage:t,cards:e.tasks.filter(e=>e.stage===t),holders:a,board:e,projectTitles:r,now:n,maxTokens:o},t))})})}function te(){let e=c(e=>e.shippingBoard),t=c(e=>e.agents),n=c(e=>e.agentsById),r=Date.now(),i=e?a(e,t,r):null,o=c(e=>e.shippingLoading),s=c(e=>e.shippingError),l=c(e=>e.setShippingProject),u=c(e=>e.shippingTab),m=c(e=>e.setShippingTab),h=c(e=>e.shippingStatsProjectId),g=c(e=>e.setShippingStatsProject),_=c(e=>e.setAnalyticsTab),v=c(e=>e.switchView);return(0,I.jsxs)(`div`,{className:`space-y-4`,children:[(0,I.jsxs)(`div`,{className:`flex flex-wrap items-center gap-3`,children:[(0,I.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,I.jsx)(y,{className:`h-5 w-5 text-muted-foreground`}),(0,I.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Shipping`})]}),(0,I.jsx)(p,{value:u,onValueChange:e=>m(e),children:(0,I.jsxs)(f,{children:[(0,I.jsx)(d,{value:`realtime`,children:`Realtime`}),(0,I.jsx)(d,{value:`stats`,children:`Statistics`})]})}),(0,I.jsxs)(`button`,{type:`button`,className:`ml-auto inline-flex items-center gap-1 text-xs text-muted-foreground hover:text-foreground`,onClick:()=>{_(`gates`),v(`analytics`)},children:[(0,I.jsx)(w,{className:`h-3.5 w-3.5`}),` Gate statistics`]}),i&&i.projects.length>0&&(0,I.jsxs)(`select`,{"aria-label":`Project`,className:`h-8 max-w-full min-w-0 rounded-md border border-border bg-background px-2 text-sm`,value:u===`stats`?h:i.all?`*`:i.projectId??``,onChange:e=>u===`stats`?g(e.target.value):l(e.target.value),children:[u===`stats`?(0,I.jsx)(`option`,{value:``,children:`All projects`}):(0,I.jsx)(`option`,{value:`*`,children:`All projects`}),i.projects.map(e=>(0,I.jsx)(`option`,{value:e.id,children:u===`stats`?e.title:`${e.title} (${e.inFlight})`},e.id))]}),u===`realtime`&&i&&(0,I.jsx)(Y,{ci:i.ci,all:i.all===!0}),u===`realtime`&&i&&(0,I.jsx)(B,{incidents:i.redMain})]}),u===`stats`&&(0,I.jsx)(P,{}),u===`realtime`&&s&&(0,I.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:[`Could not load the board: `,s]}),u===`realtime`&&!i&&o&&(0,I.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`Loading the board…`}),u===`realtime`&&i&&!i.projectId&&!i.all&&(0,I.jsx)(`div`,{className:`rounded-md border border-border px-3 py-12 text-center text-sm text-muted-foreground`,children:`No project has Tasks in progress.`}),u===`realtime`&&i&&(i.projectId||i.all)&&(0,I.jsxs)(I.Fragment,{children:[(0,I.jsx)(Q,{cards:i.tasks,agentsById:n,now:r}),(0,I.jsx)(ee,{board:i,agentsById:n,now:r})]})]})}export{te as ShippingView};
|
|
2
|
+
//# sourceMappingURL=shipping-D_Lp9n_J.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e,u as t}from"./dist-DeW2Y1R5.js";import{t as n}from"./store-
|
|
2
|
-
//# sourceMappingURL=stats-
|
|
1
|
+
import{o as e,u as t}from"./dist-DeW2Y1R5.js";import{t as n}from"./store-BgDALGIX.js";import{t as r}from"./badge-DqJRtj_p.js";import{a as i,i as a,n as o,r as s,t as c}from"./shipping-stats-BiMTsA4A.js";var l=t(),u=new Intl.NumberFormat(void 0,{notation:`compact`,maximumFractionDigits:1}),d=new Intl.DateTimeFormat(void 0,{month:`short`,day:`numeric`,timeZone:`UTC`});function f({id:e,title:t,note:n,children:r}){return(0,l.jsxs)(`section`,{"data-testid":`shipping-stat-${e}`,"aria-label":t,className:`min-w-0 rounded-lg border border-border border-t-[3px] border-t-primary/60 bg-card p-3`,children:[(0,l.jsxs)(`h3`,{className:`flex flex-wrap items-center gap-2 text-sm font-medium`,children:[t,n]}),(0,l.jsx)(`div`,{className:`mt-2 overflow-x-auto`,children:r})]})}function p({label:t,value:n,hint:r,className:i}){return(0,l.jsxs)(`div`,{className:e(`ship-hud min-w-0 rounded-md px-2.5 py-1.5`,i),children:[(0,l.jsx)(`div`,{className:`truncate text-[10px] font-medium uppercase tracking-wider text-muted-foreground`,children:t}),(0,l.jsx)(`div`,{className:`font-mono text-lg font-semibold tabular-nums`,title:r,children:n})]})}function m({label:e,dist:t,format:n}){let r=e=>e===null?`—`:n(e);return(0,l.jsxs)(`tr`,{className:`border-t border-border/60 first:border-t-0`,children:[(0,l.jsx)(`th`,{scope:`row`,className:`py-1 pr-2 text-left font-normal`,children:e}),(0,l.jsx)(`td`,{className:`px-1.5 py-1 text-right tabular-nums`,children:r(t.p50)}),(0,l.jsx)(`td`,{className:`px-1.5 py-1 text-right tabular-nums`,children:r(t.p90)}),(0,l.jsx)(`td`,{className:`py-1 pl-1.5 text-right tabular-nums text-muted-foreground`,children:t.count})]})}function h({rows:e,format:t,unit:n=`Tasks`}){return(0,l.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,l.jsx)(`thead`,{children:(0,l.jsxs)(`tr`,{className:`text-[11px] text-muted-foreground`,children:[(0,l.jsx)(`th`,{className:`text-left font-normal`}),(0,l.jsx)(`th`,{className:`px-1.5 text-right font-normal`,children:`p50`}),(0,l.jsx)(`th`,{className:`px-1.5 text-right font-normal`,children:`p90`}),(0,l.jsx)(`th`,{className:`pl-1.5 text-right font-normal`,children:n})]})}),(0,l.jsx)(`tbody`,{children:e.map(e=>(0,l.jsx)(m,{...e,format:t},e.label))})]})}function g({label:e,rate:t}){return(0,l.jsx)(p,{label:e,value:o(t.rate),hint:`${t.firstPass} of ${t.total}`})}function _({stats:e}){let t=e.throughput.days,n=Math.max(1,...t.map(e=>e.landed));return(0,l.jsx)(`ul`,{"aria-label":`Landed per day`,className:`mt-2 flex h-14 items-end gap-0.5`,children:t.map(e=>(0,l.jsx)(`li`,{className:`flex h-full min-w-0 flex-1 items-end`,title:`${d.format(e.day)}: ${e.landed} landed, ${e.deployed} deployed, ${e.validated} validated`,children:(0,l.jsx)(`span`,{className:`block w-full rounded-sm bg-primary/70`,style:{height:`${e.landed?Math.max(6,e.landed/n*100):0}%`}})},e.day))})}var v=e=>u.format(e),y=.5;function b({counted:t,landed:n}){let r=n>0&&t/n<y;return(0,l.jsxs)(`p`,{"data-testid":`shipping-tokens-coverage`,className:e(`mt-1 text-[11px]`,r?`text-tone-warning-fg`:`text-muted-foreground`),children:[t,` of `,n,` landed Tasks have recorded token totals (`,o(n?t/n:null),`).`,r?` Too few to stand for the window.`:``]})}function x({stats:e}){let{throughput:t,leadTimeMs:n,tokensPerLanded:a,waitMs:c,gateTimeMs:u,failingGates:d,landOutcomes:m,firstPass:y,deploys:x}=e,S=Object.entries(m).sort((e,t)=>t[1]-e[1]),C=i[e.window]>1&&t.days.length>0;return(0,l.jsxs)(`div`,{className:`grid gap-3 md:grid-cols-2`,children:[(0,l.jsxs)(f,{id:`throughput`,title:`Throughput`,children:[(0,l.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[(0,l.jsx)(p,{label:`Landed`,value:String(t.landed)}),(0,l.jsx)(p,{label:`Deployed`,value:String(t.deployed)}),(0,l.jsx)(p,{label:`Validated`,value:String(t.validated)})]}),C&&(0,l.jsx)(_,{stats:e}),(0,l.jsxs)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[`Tasks reaching each stage for the first time`,C?`; bars show landed per UTC day`:``,`.`]})]}),(0,l.jsxs)(f,{id:`lead-time`,title:`Lead time`,children:[(0,l.jsx)(h,{format:s,rows:[{label:`Started → landed`,dist:n.startToLanded},{label:`Landed → deployed`,dist:n.landedToDeployed}]}),(0,l.jsx)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:`Validation follows a deploy within a second, so it has no lead time of its own.`})]}),(0,l.jsxs)(f,{id:`tokens`,title:`Tokens per landed Task`,children:[(0,l.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[(0,l.jsx)(p,{label:`p50`,value:a.p50===null?`—`:v(a.p50)}),(0,l.jsx)(p,{label:`p90`,value:a.p90===null?`—`:v(a.p90)}),(0,l.jsx)(p,{label:`Total`,value:v(a.total),hint:`${a.count} Tasks with token totals`})]}),(0,l.jsx)(b,{counted:a.count,landed:t.landed})]}),(0,l.jsx)(f,{id:`waiting`,title:`Waiting`,children:(0,l.jsx)(h,{format:s,unit:`Waits`,rows:[{label:`For review`,dist:c.review},{label:`For a land lane`,dist:c.landLane}]})}),(0,l.jsx)(f,{id:`gate-time`,title:`Gate time`,children:(0,l.jsx)(h,{format:s,unit:`Runs`,rows:[{label:`Delivery gates`,dist:u.delivery},{label:`Landing / CI`,dist:u.landing},...u.landingSteps.map(e=>({label:`· ${e.label}`,dist:e.time}))]})}),(0,l.jsxs)(f,{id:`failing-gates`,title:`Most-failing gates`,children:[d.length===0?(0,l.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`No gate failures in this window.`}):(0,l.jsxs)(`table`,{className:`w-full text-sm`,children:[(0,l.jsx)(`thead`,{children:(0,l.jsxs)(`tr`,{className:`text-[11px] text-muted-foreground`,children:[(0,l.jsx)(`th`,{className:`text-left font-normal`,children:`Gate`}),(0,l.jsx)(`th`,{className:`px-1.5 text-right font-normal`,children:`Failed`}),(0,l.jsx)(`th`,{className:`px-1.5 text-right font-normal`,children:`Fail rate`}),(0,l.jsx)(`th`,{className:`pl-1.5 text-right font-normal`,title:`Passed on a commit that had failed it before`,children:`Flaky`})]})}),(0,l.jsx)(`tbody`,{children:d.map(e=>(0,l.jsxs)(`tr`,{className:`border-t border-border/60 first:border-t-0`,children:[(0,l.jsx)(`th`,{scope:`row`,className:`max-w-0 truncate py-1 pr-2 text-left font-normal`,title:e.gate,children:e.gate}),(0,l.jsxs)(`td`,{className:`px-1.5 py-1 text-right tabular-nums`,children:[e.fails,`/`,e.runs]}),(0,l.jsx)(`td`,{className:`px-1.5 py-1 text-right tabular-nums`,children:o(e.failRate)}),(0,l.jsx)(`td`,{className:`py-1 pl-1.5 text-right tabular-nums`,children:o(e.flakeRate)})]},e.gate))})]}),S.length>0&&(0,l.jsxs)(`div`,{className:`mt-2 flex flex-wrap items-center gap-1.5 text-xs`,"aria-label":`Land attempts by outcome`,children:[(0,l.jsx)(`span`,{className:`text-muted-foreground`,children:`Land attempts`}),S.map(([e,t])=>(0,l.jsxs)(r,{variant:`secondary`,children:[e,` `,t]},e))]})]}),(0,l.jsx)(f,{id:`first-pass`,title:`First-pass rates`,children:(0,l.jsxs)(`div`,{className:`grid grid-cols-2 gap-2`,children:[(0,l.jsx)(g,{label:`Review GO after one round`,rate:y.review}),(0,l.jsx)(g,{label:`Land, no regate`,rate:y.land})]})}),(0,l.jsxs)(f,{id:`deploys`,title:`CD deploys`,note:(0,l.jsx)(r,{variant:`outline`,title:`A deploy event names no project, so the project filter does not apply`,children:`Fleet-wide`}),children:[(0,l.jsxs)(`div`,{className:`grid grid-cols-3 gap-2`,children:[(0,l.jsx)(p,{label:`Deploys`,value:String(x.total),hint:`${x.perDay.toFixed(1)} per day`}),(0,l.jsx)(p,{label:`Failed`,value:String(x.failed)}),(0,l.jsx)(p,{label:`Rolled back`,value:String(x.rolledBack)})]}),(0,l.jsxs)(`p`,{className:`mt-1 text-[11px] text-muted-foreground`,children:[x.succeeded,` succeeded · `,x.perDay.toFixed(1),`/day · `,o(x.failureRate),` failed or rolled back.`,e.projectId?` Counts every project: a deploy names none.`:``]})]})]})}function S({keys:t,active:n,onChange:r}){return(0,l.jsx)(`div`,{role:`group`,"aria-label":`Window`,className:`inline-flex rounded-lg bg-muted p-[3px]`,children:t.map(t=>(0,l.jsx)(`button`,{type:`button`,"aria-pressed":t===n,onClick:()=>t!==n&&r(t),className:e(`h-7 rounded-md px-3 text-sm`,t===n?`bg-background font-medium shadow-sm`:`text-muted-foreground hover:text-foreground`),children:t},t))})}function C(){let e=n(e=>e.shippingStats),t=n(e=>e.shippingStatsLoading),r=n(e=>e.shippingStatsError);return(0,l.jsxs)(`div`,{className:`space-y-3`,children:[(0,l.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-3 gap-y-1`,children:[(0,l.jsx)(S,{keys:c,active:n(e=>e.shippingStatsWindow),onChange:n(e=>e.setShippingStatsWindow)}),e&&(0,l.jsx)(`span`,{className:`text-xs text-muted-foreground`,children:e.computedAt===null?`Nothing rolled up yet`:`Data as of ${new Date(e.computedAt).toLocaleString()}`})]}),r&&(0,l.jsxs)(`div`,{className:`rounded-md border border-destructive/40 bg-destructive/10 px-3 py-2 text-sm text-destructive`,children:[`Could not load the statistics: `,r]}),!e&&t&&(0,l.jsx)(`div`,{className:`py-8 text-center text-sm text-muted-foreground`,children:`Loading the statistics…`}),e&&e.missingDays>0&&(0,l.jsxs)(`div`,{role:`status`,className:`rounded-md border border-tone-warning/40 bg-tone-warning/10 px-3 py-2 text-sm`,children:[e.missingDays,` of `,a(e.window),` days in this window are not rolled up yet, so the figures below cover only the other days. The rollup is still backfilling.`]}),e&&(0,l.jsx)(x,{stats:e}),e&&(0,l.jsx)(`p`,{className:`text-[11px] text-muted-foreground`,children:`Percentiles are estimates (about ±9 %); counts and totals are exact.`})]})}export{p as n,S as r,C as t};
|
|
2
|
+
//# sourceMappingURL=stats-CXiNjB9S.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e,u as t}from"./dist-DeW2Y1R5.js";import{Q as n,et as r}from"./display-
|
|
2
|
-
//# sourceMappingURL=status-dot-
|
|
1
|
+
import{o as e,u as t}from"./dist-DeW2Y1R5.js";import{Q as n,et as r}from"./display-BemJG1f_.js";var i={"gate-running":`gate running`,"gate-passed":`gate passed, merging next`,merging:`merging`,"steward-claimed":`steward reconciling`};function a(e){let t=e?.landState;if(!t||t===`landed`)return null;if(e.landBackedOff)return{kind:`attention`,label:`backed off after repeated no-progress attempts`};if(t===`gate-failed`)return{kind:`attention`,label:`gate failed`};if(t===`merge-error`)return{kind:`attention`,label:`merge error`};if(t===`steward-requested`)return{kind:`attention`,label:`conflict, waiting for a steward`};let n=i[t];return n?{kind:`running`,label:n}:t===`queued`||t===`delivery:complete`?{kind:`queued`,label:e.landWaitReason??`waiting to start`}:null}var o={queued:`Land queued`,running:`Landing`,attention:`Land needs attention`};function s(e,t,n){let i=t.landStateAt?r(n,t.landStateAt).replace(` ago`,``):``;return`${o[e.kind]}: ${e.label}${i?`, ${i}`:``}`}var c=t(),l={queued:`text-tone-violet-fg`,running:`text-tone-violet-fg`,attention:`text-tone-warning-fg`};function u({agent:t,now:r,className:i}){let o=a(t),s=e(`relative inline-block w-2.5 h-2.5 rounded-full shrink-0`,n(t,r),i);return!o||!t?(0,c.jsx)(`span`,{className:s}):(0,c.jsx)(d,{agent:t,ring:o,now:r??Date.now(),className:s})}function d({agent:t,ring:n,now:r,className:i}){let a=s(n,t,r);return(0,c.jsx)(`span`,{className:e(i,l[n.kind]),"aria-label":a,title:a,"data-land-ring":n.kind,children:(0,c.jsx)(`svg`,{viewBox:`0 0 16 16`,"aria-hidden":!0,className:`pointer-events-none absolute -inset-1 h-[calc(100%+8px)] w-[calc(100%+8px)] overflow-visible`,children:(0,c.jsx)(`circle`,{cx:`8`,cy:`8`,r:`7`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.75`,pathLength:16,strokeDasharray:n.kind===`queued`?`1 1`:void 0})})})}export{u as t};
|
|
2
|
+
//# sourceMappingURL=status-dot-C703YIy1.js.map
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{p as t}from"./dist-DeW2Y1R5.js";import{A as n,D as r,M as i,N as a,O as o,P as s,c,d as l,f as u,h as d,l as f,t as p}from"./provider-display-bWwiuedV.js";import{A as m,C as h,E as g,F as ee,I as _,W as v,X as te,_t as ne,dt as re,f as ie,ft as y,gt as ae,h as b,ht as oe,j as se,lt as x,m as S,ot as ce,tt as le,ut as ue,z as de}from"./display-BemJG1f_.js";import{_ as fe,d as pe,f as me,h as he,i as ge,l as _e,m as ve,p as ye,r as be,s as xe,t as C}from"./api-CIIVBtAV.js";import{t as Se}from"./agent-liveness-DSQY1Aa_.js";var w=e(t(),1),Ce=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},we=(e=>e?Ce(e):Ce),Te=e=>e;function Ee(e,t=Te){let n=w.useSyncExternalStore(e.subscribe,w.useCallback(()=>t(e.getState()),[e,t]),w.useCallback(()=>t(e.getInitialState()),[e,t]));return w.useDebugValue(n),n}var De=e=>{let t=we(e),n=e=>Ee(t,e);return Object.assign(n,t),n},Oe=(e=>e?De(e):De);function ke(e,t){let n;try{n=e()}catch{return}return{getItem:e=>{let r=e=>e===null?null:JSON.parse(e,t?.reviver),i=n.getItem(e)??null;return i instanceof Promise?i.then(r):r(i)},setItem:(e,r)=>n.setItem(e,JSON.stringify(r,t?.replacer)),removeItem:e=>n.removeItem(e)}}var Ae=e=>t=>{try{let n=e(t);return n instanceof Promise?n:{then(e){return Ae(e)(n)},catch(e){return this}}}catch(e){return{then(e){return this},catch(t){return Ae(t)(e)}}}},je=(e,t)=>(n,r,i)=>{let a={storage:ke(()=>window.localStorage),partialize:e=>e,version:0,merge:(e,t)=>({...t,...e}),...t},o=!1,s=0,c=new Set,l=new Set,u=a.storage;if(!u)return e((...e)=>{console.warn(`[zustand persist middleware] Unable to update item '${a.name}', the given storage is currently unavailable.`),n(...e)},r,i);let d=()=>{let e=a.partialize({...r()});return u.setItem(a.name,{state:e,version:a.version})},f=i.setState;i.setState=(e,t)=>(f(e,t),d());let p=e((...e)=>(n(...e),d()),r,i);i.getInitialState=()=>p;let m,h=()=>{if(!u)return;let e=++s;o=!1,c.forEach(e=>e(r()??p));let t=a.onRehydrateStorage?.call(a,r()??p)||void 0;return Ae(u.getItem.bind(u))(a.name).then(e=>{if(e)if(typeof e.version==`number`&&e.version!==a.version){if(a.migrate){let t=a.migrate(e.state,e.version);return t instanceof Promise?t.then(e=>[!0,e]):[!0,t]}console.error(`State loaded from storage couldn't be migrated since no migrate function was provided`)}else return[!1,e.state];return[!1,void 0]}).then(t=>{if(e!==s)return;let[i,o]=t;if(m=a.merge(o,r()??p),n(m,!0),i)return d()}).then(()=>{e===s&&(t?.(r(),void 0),m=r(),o=!0,l.forEach(e=>e(m)))}).catch(n=>{e===s&&t?.(void 0,n)})};return i.persist={setOptions:e=>{a={...a,...e},e.storage&&(u=e.storage)},clearStorage:()=>{u?.removeItem(a.name)},getOptions:()=>a,rehydrate:()=>h(),hasHydrated:()=>o,onHydrate:e=>(c.add(e),()=>{c.delete(e)}),onFinishHydration:e=>(l.add(e),()=>{l.delete(e)})},a.skipHydration||h(),m||p},Me=e=>Symbol.iterator in e,Ne=e=>`entries`in e,Pe=(e,t)=>{let n=e instanceof Map?e:new Map(e.entries()),r=t instanceof Map?t:new Map(t.entries());if(n.size!==r.size)return!1;for(let[e,t]of n)if(!r.has(e)||!Object.is(t,r.get(e)))return!1;return!0},Fe=(e,t)=>{let n=e[Symbol.iterator](),r=t[Symbol.iterator](),i=n.next(),a=r.next();for(;!i.done&&!a.done;){if(!Object.is(i.value,a.value))return!1;i=n.next(),a=r.next()}return!!i.done&&!!a.done};function Ie(e,t){return Object.is(e,t)?!0:typeof e!=`object`||!e||typeof t!=`object`||!t||Object.getPrototypeOf(e)!==Object.getPrototypeOf(t)?!1:Me(e)&&Me(t)?Ne(e)&&Ne(t)?Pe(e,t):Fe(e,t):Pe({entries:()=>Object.entries(e)},{entries:()=>Object.entries(t)})}function Le(e){let t=ke(e);if(!t)return;let n;return{...t,setItem:(e,r)=>{if(!(n!==void 0&&Ie(n,r.state)))return n=r.state,t.setItem(e,r)},removeItem:e=>(n=void 0,t.removeItem(e))}}var Re=`worker`,ze=[];function Be(e){return e!==void 0&&ze.includes(e)}var Ve=`This runs repo-committed code with this agent's Relay identity token and provider credentials.`,He=`Content review is bounded, not absolute: fingerprint mode covers the declaration plus every directly-named, in-repo, statically-resolved target — it does NOT cover indirect includes (a script that sources or imports another file not itself named in the command) or anything selected only at runtime (an env-var path, a glob, a built string). Commit mode is coarser still: it is invalidated by ANY new commit on the repo, whether or not that commit touches the declaration or its targets, and does not see uncommitted working-tree edits at all. Review reads the spawn cwd off the RELAY server's own filesystem, not the runner's — for a spawn whose orchestrator is on a different host, this relay cannot see that host's disk at all, so review fails closed rather than reviewing the relay's own (possibly unrelated) copy of the same path.`,Ue=`outcome`,We=`Done`,Ge=`Could not do it`;function Ke(e,t){let n=e.requestedByRole;return n===`self`||n===`operator`||n===`coordinator`?n:e.selfRequested===!0||e.requestedBy===t?`self`:s(e.requestedByUser)||e.requestedBy===`dashboard`?`operator`:`coordinator`}function qe(e){if(e.type!==`agent.setEffort`||e.status!==`succeeded`)return;let t=a(e.result?.providerResult)?e.result.providerResult:{},n=s(t.effort)??s(e.params.effort),r=s(t.previousEffort)??s(e.params.previousEffort)??`default`;if(!n||n===r)return;let i=Ke(e.params,e.target),o=s(e.params.requestedByAgentId)??s(e.params.requestedBy),c=s(e.params.requestedByUser),l=s(e.params.reason)?.trim();return{commandId:e.id,agentId:e.target,at:e.updatedAt,effort:n,previousEffort:r,actor:{role:i,...i===`self`?{id:e.target}:o&&o!==`dashboard`?{id:o}:{},...c?{user:c}:{}},...l?{reason:l}:{}}}function Je(e){return e.desiredVersion>e.observedVersion}function T(e){return r(n(e?.id??`default`))}function Ye(){return typeof window<`u`&&typeof window.matchMedia==`function`&&window.matchMedia(`(max-width: 767px)`).matches?4:12}var E=[];function Xe(e){let t=E.indexOf(e);t!==-1&&E.splice(t,1),E.unshift(e)}function Ze(e){let t=E.indexOf(e);t!==-1&&E.splice(t,1)}function Qe(e,t){let n=new Set(Object.keys(e)),r=new Set,i=Ye(),a=e=>{e&&n.has(e)&&r.size<i&&r.add(e)};for(let e of t)a(e);for(let e of E)if(a(e),r.size>=i)break;for(let t of Object.keys(e).reverse())a(t);let o={};for(let t of r)o[t]=e[t];return E.splice(0,E.length,...E.filter(e=>r.has(e))),o}var $e=[`landState`,`landWaitReason`,`landStateAt`,`landBackedOff`];function et(e,t){let n=e?{...e,...t}:t,r=t.meta?{...e?.meta??{},...t.meta}:e?.meta;r&&a(e?.meta?.workspace)&&a(t.meta?.workspace)&&(r.workspace={...e.meta.workspace,...t.meta.workspace});let i=$e.filter(e=>t[e]===null);return{...n,...Object.fromEntries(i.map(e=>[e,void 0])),...r?{meta:r}:{},...!t.issueRepo&&e?.issueRepo?{issueRepo:e.issueRepo}:{}}}function tt(e,t){if(!e)return null;if(t?.id!==e.id)return e;let n=t.meta?.agentProfile;return n?{...e,meta:{...e.meta,agentProfile:n}}:e}function nt(e,t){let n=new Set(t.map(e=>e.id)),r=e.filter(e=>!n.has(e.id)).map(e=>e.status===`offline`?e:{...e,status:`offline`});return O(e,r.length===0?t:[...t,...r])}function rt(e){let t={};for(let n of e)t[n.id]=n;return t}function D(e,t){let n=e.findIndex(e=>e.id===t.id),r=[...e];return n>=0?r[n]=t:r.push(t),r}function it(e,t){let n=e.findIndex(e=>e.id===t.id);if(n<0)return;let r=e[n],i=[...e];return i[n]={...t,meta:r.meta,providerCatalog:r.providerCatalog,managedAgents:t.managedAgents??r.managedAgents,providerStatus:t.providerStatus??r.providerStatus},i}function at(e,t){return e?{...t,...t.projectId===void 0&&e.projectId!==void 0?{projectId:e.projectId}:{},...t.projectSlug===void 0&&e.projectSlug!==void 0?{projectSlug:e.projectSlug}:{},...t.projectTitle===void 0&&e.projectTitle!==void 0?{projectTitle:e.projectTitle}:{},...t.ownerOnline===void 0&&e.ownerOnline!==void 0?{ownerOnline:e.ownerOnline}:{}}:t}var ot=3e3;function st(e,t,n,r=Date.now(),i){if(!t||!n)return e;let a=[...e[t]||[]],o=i||`s-${n}-${r}`;return a.some(e=>e.id===o)||a.some(e=>e.status===n&&Math.abs(e.timestamp-r)<=ot)?e:(a.push({id:o,status:n,timestamp:r}),a.length>200&&a.splice(0,a.length-200),{...e,[t]:a})}function ct(e,t){if(!(!e||e.status===t.status)){if((e.status===`offline`||e.status===`stale`)&&(t.status===`online`||t.status===`idle`||t.status===`busy`))return`online`;if(t.status===`offline`)return`offline`}}var lt=new Set([`compacting`,`compacted`,`clearing-context`,`context-cleared`]);function ut(e){let t=e.meta?.timelineEvent;if(!t||typeof t!=`object`||Array.isArray(t))return;let n=t.status;if(typeof n!=`string`||!n)return;let r=t.id,i=t.timestamp;return{status:n,...typeof r==`string`?{id:r}:{},...typeof i==`number`&&Number.isFinite(i)?{timestamp:i}:{}}}function dt(e){let t=e.params?.agentId;return typeof t==`string`&&t?t:typeof e.target==`string`&&e.target?e.target:void 0}function ft(e,t){if(t===`command.dispatched`)return e.type===`agent.compact`?`compaction-requested`:e.type===`agent.clearContext`?`clear-requested`:e.type===`agent.shutdown`?`shutting-down`:void 0;if(t===`command.succeeded`){if(e.type===`agent.shutdown`)return`shutdown`;if(e.type===`agent.restart`)return`restarted`}}function pt(e){return JSON.stringify(e)}function mt(e,t){let n=new Map(e.map(e=>[e.id,e])),r=!(e.length===t.length&&e.every((e,n)=>e.id===t[n]?.id)),i=t.map(e=>{let t=n.get(e.id);return t&&pt(t)===pt(e)?t:(r=!0,e)});return r?i:e}function O(e,t){return ht(e,t,e=>e.id)}function ht(e,t,n){let r=[...new Map(t.map(e=>[n(e),e])).values()],i=new Map(e.map(e=>[n(e),e])),a=!(e.length===r.length&&e.every((e,t)=>n(e)===n(r[t]))),o=r.map(e=>{let t=i.get(n(e));return t===e?e:t!==void 0&&JSON.stringify(t)===JSON.stringify(e)?t:(a=!0,e)});return a?o:e}function gt(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)?e:t}function _t(){return typeof document>`u`||document.hidden}function vt(e,t){return!!(e&&t.view===`chat`&&t.selectedInboxThread===e&&!_t())}function yt(e){return e.threadPeer||e.agentId||``}function bt(e,t){return vt(yt(e),t)}function xt(e){return e.filter(e=>o(e.to)&&!o(e.from)&&g(e)).reduce((e,t)=>Math.max(e,t.id),0)}function k(e,t){let n;for(let r of t)r in e&&(n??={...e},delete n[r]);return n??e}function St(e,t){return e.some(e=>t.has(e))?e.filter(e=>!t.has(e)):e}function Ct(e,t){return k(e,Object.keys(e).filter(e=>!t.has(e)))}function wt(e){return typeof e?.meta?.cwd==`string`?e.meta.cwd:``}function Tt(e){return new Set([...e.agents.map(e=>e.id),...Object.keys(e.agentChatByAgent),...Object.keys(e.chatStatusEvents),...Object.keys(e.presenceByAgent),...Object.keys(e.issueActivityByAgent),...Object.keys(e.issueLoading).flatMap(e=>e.startsWith(`agent:`)?[e.slice(6)]:[]),...Object.keys(e.issueErrors).flatMap(e=>e.startsWith(`agent:`)?[e.slice(6)]:[]),...Object.keys(e.livenessMismatches),...Object.keys(e.commandStalls),...e.coordinatorFollows,...e.coordinatorMutes,...e.chatCollapsedChildren,...[e.selectedAgent,e.agentDetailId,e.renameModal.agentId,e.selectedInboxThread,e.inboxCompose.toMode===`agent`?e.inboxCompose.to:``].filter(Boolean)])}function Et(e,t){let n=[...t],r=e.agents.filter(e=>t.has(e.id)),i=r.length?e.agents.filter(e=>!t.has(e.id)):e.agents,a=new Set(r.map(wt).filter(Boolean));for(let e of i)a.delete(wt(e));let o=n.map(e=>`agent:${e}`),s=t.has(e.compose.to),c=t.has(e.agentDetailId);return{agents:i,agentsById:k(e.agentsById,n),selectedAgent:t.has(e.selectedAgent)?``:e.selectedAgent,agentDetailOpen:!c&&e.agentDetailOpen,agentDetailId:c?``:e.agentDetailId,agentDetailCard:c?null:e.agentDetailCard,livenessMismatches:k(e.livenessMismatches,n),commandStalls:k(e.commandStalls,n),agentChatByAgent:k(e.agentChatByAgent,n),chatStatusEvents:k(e.chatStatusEvents,n),presenceByAgent:k(e.presenceByAgent,n),issueActivityByAgent:k(e.issueActivityByAgent,n),issueLoading:k(e.issueLoading,o),issueErrors:k(e.issueErrors,o),selectedInboxThread:t.has(e.selectedInboxThread)?``:e.selectedInboxThread,replyTo:s||e.replyTo&&t.has(e.replyTo.from)?null:e.replyTo,composeOpen:!s&&e.composeOpen,compose:s?{...x,from:T(e.sessionUser)}:e.compose,inboxCompose:e.inboxCompose.toMode===`agent`&&t.has(e.inboxCompose.to)?{...ue}:e.inboxCompose,coordinatorFollows:St(e.coordinatorFollows,t),coordinatorMutes:St(e.coordinatorMutes,t),chatCollapsedChildren:St(e.chatCollapsedChildren,t),renameModal:t.has(e.renameModal.agentId)?{show:!1,agentId:``,label:``}:e.renameModal,projectByCwd:k(e.projectByCwd,[...a])}}var Dt=(e,t)=>({agents:[],agentsById:{},_rosterBootstrapped:!1,showOffline:!1,showBuiltIns:!1,agentSort:`status`,agentSortDir:`asc`,agentPresetFilter:``,agentStatusFilter:``,agentTagFilter:``,agentHostFilter:``,selectedAgent:``,agentDetailOpen:!1,agentDetailId:``,agentDetailCard:null,livenessMismatches:{},commandStalls:{},channelDetailOpen:!1,channelDetailId:``,renameModal:{show:!1,agentId:``,label:``},tagFilter:``,async fetchAgents(){try{let n=t()._rosterBootstrapped,r=await C(`GET`,!t().showOffline&&n?`/agents?excludeOffline=1`:`/agents`),i=!Array.isArray(r),a=i?r.agents:r,o=t(),s=i?void 0:new Set(a.map(e=>e.id)),c=s?new Set([...Tt(o)].filter(e=>!s.has(e))):new Set;for(let e of c)Ze(e);let l=c.size?Et(o,c):{},u={...o,...l},d=i?nt(u.agents,a):O(u.agents,a),f=new Set(d.map(wt).filter(Boolean)),p=Ct(u.projectByCwd,f);if(n&&!c.size&&d===o.agents&&p===o.projectByCwd)return;e({...l,agents:d,agentsById:rt(d),projectByCwd:p,...n?{}:{_rosterBootstrapped:!0}})}catch{}},setShowOffline(n){t().showOffline!==n&&(e({showOffline:n}),t().fetchAgents(),t().fetchInboxState())},async fetchAgentCard(n){if(n)try{let r=await C(`GET`,`/agents/`+encodeURIComponent(n));if(t().agentDetailId!==n)return;e({agentDetailCard:r})}catch{}},removeAgentState(t){Ze(t),e(e=>Et(e,new Set([t])))},openAgentDetail(n){e({agentDetailId:n.id,agentDetailOpen:!0,agentDetailCard:null}),t().fetchAgentCard(n.id)},closeAgentDetail(){e({agentDetailOpen:!1,agentDetailCard:null})},openChannelDetail(t){e({channelDetailId:t.id,channelDetailOpen:!0})},closeChannelDetail(){e({channelDetailOpen:!1})},openRename(t){e({renameModal:{show:!0,agentId:t.id,label:t.label||``}})},async doRename(){let n=t(),r=n.renameModal.label.trim()||null;try{await C(`PATCH`,`/agents/`+n.renameModal.agentId+`/label`,{label:r}),e({renameModal:{...n.renameModal,show:!1}})}catch(e){t().showError(`Rename Failed`,e.message,e)}},async doDeleteAgent(e){try{await C(`DELETE`,`/agents/`+e),t().removeAgentState(e)}catch(e){t().showError(`Delete Failed`,e.message,e)}},async setAgentKeep(e,n){try{await C(`PUT`,`/agents/`+encodeURIComponent(e.id)+`/keep`,{keep:n,surface:{component:`agents-grid`}}),t().showNotification(n?`Keeping ${ie(e)}`:`Released keep on ${ie(e)}`)}catch(e){t().showError(`Keep Failed`,e.message,e)}},async doAgentAction(e,n,r,i){try{await C(`POST`,`/agents/`+encodeURIComponent(e.id)+`/actions`,{...i,action:n,...r?{surface:{component:r}}:{}});let a=n===`restart`?`Restart`:n===`resume`?`Resume`:n===`shutdown`?i?.hard===!0?`Force shutdown`:`Shutdown`:n===`compact`?`Compact`:n===`clearContext`?`Clear context`:n===`releaseSubmitHold`?`Release hold`:n;t().showNotification(`${a} command sent to ${ie(e)}`),await Promise.all([t().fetchMessages(),t().fetchActivityEvents()])}catch(e){t().showError(`Action Failed`,e.message,e)}}});function Ot(e,t,n){return t===`agents.changed`?(e.fetchAgents().catch(()=>{}),!0):t===`agent.removed`?(e.removeAgentState(JSON.parse(n).id),!0):!1}function kt(e){if(!e)return``;let t=e.replace(/\r\n/g,`
|
|
2
|
+
`);return t=t.replace(/```[^\n]*\n([\s\S]*?)```/g,(e,t)=>{let n=t.replace(/\n+$/,``).split(`
|
|
3
|
+
`).length;return` code block, ${n} ${n===1?`line`:`lines`}. `}),t=t.replace(/```[^\n]*/g,` code block. `),t=Nt(t),t=t.replace(/^#{1,6}\s+/gm,``),t=t.replace(/^\s*[-*+]\s+/gm,`. `),t=t.replace(/^\s*\d+\.\s+/gm,`. `),t=t.replace(/`([^`]+)`/g,`$1`),t=t.replace(/\[([^\]]+)\]\([^)]+\)/g,`$1`),t=t.replace(/(\*\*|__|\*|_)(.*?)\1/g,`$2`),t=t.replace(/[ \t]+/g,` `),t=t.replace(/\n{2,}/g,`. `),t=t.replace(/\s*\.\s*\.\s*(\.\s*)+/g,`. `),t.trim()}function At(e){return/\|/.test(e)&&e.trim().length>0}function jt(e){return/^\s*\|?\s*:?-{2,}:?\s*(\|\s*:?-{2,}:?\s*)+\|?\s*$/.test(e)}function Mt(e){return e.trim().replace(/^\||\|$/g,``).split(`|`).map(e=>e.trim()).filter(e=>e.length>0)}function Nt(e){let t=e.split(`
|
|
4
|
+
`),n=[],r=0;for(;r<t.length;){if(At(t[r])&&r+1<t.length&&jt(t[r+1])){let e=Mt(t[r]),i=r+2,a=0;for(;i<t.length&&At(t[i])&&!jt(t[i]);)a++,i++;let o=e.length?`with columns ${e.join(`, `)}`:``,s=`${a} ${a===1?`row`:`rows`}`;n.push(`table ${o?`${o}, `:``}${s}.`.replace(/\s+/g,` `).trim()),r=i;continue}n.push(t[r]),r++}return n.join(`
|
|
5
|
+
`)}var Pt={ms:`milliseconds`,s:`seconds`,kb:`kilobytes`,mb:`megabytes`,gb:`gigabytes`,tb:`terabytes`};function Ft(e){return e.split(``).join(` `)}function It(e){return e.split(``).map(e=>/[0-9]/.test(e)?e:e.toUpperCase()).join(` `)}var Lt=[{name:`url`,pattern:/\bhttps?:\/\/\S+/gi,replace:` link `},{name:`path`,pattern:/(?:\/[A-Za-z0-9._-]+){2,}\/?/g,replace:e=>` `+e.replace(/[/._-]+/g,` `).trim()+` `},{name:`slash`,pattern:/(?<=[A-Za-z0-9])\/(?=[A-Za-z0-9])/g,replace:` `},{name:`func-call`,pattern:/\b([A-Za-z_$][\w$]*)\(\)/g,replace:`$1`},{name:`approx`,pattern:/~(?=\s*[\d.])/g,replace:`approximately `},{name:`range`,pattern:/(\d)\s*[-–—]\s*(?=\d)/g,replace:`$1 to `},{name:`version`,pattern:/\b(v?)(\d+(?:\.\d+){2,})\b/gi,replace:(e,t,n)=>`${t?`version `:``}${n.replace(/\./g,` dot `)}`},{name:`decimal`,pattern:/\b(\d+)\.(\d+)\b/g,replace:(e,t,n)=>`${t} point ${Ft(n)}`},{name:`hash`,pattern:/\b(?=[0-9a-f]{7,40}\b)(?=[0-9a-f]*[a-f])(?=[0-9a-f]*\d)[0-9a-f]{7,40}\b/gi,replace:e=>It(e)},{name:`id-camel`,pattern:/([a-z])(Id|ID)(s)?\b/g,replace:(e,t,n,r)=>`${t} I D${r?`s`:``}`},{name:`id-word`,pattern:/\b(?:id|Id|ID)(s)?\b/g,replace:(e,t)=>`I D${t?`s`:``}`},{name:`byte-unit`,pattern:/\b(\d+)\s?(kb|mb|gb|tb)\b/gi,replace:(e,t,n)=>`${t} ${Pt[n.toLowerCase()]}`},{name:`ms-unit`,pattern:/\b(\d{1,5})\s?ms\b/g,replace:(e,t)=>`${t} ${Pt.ms}`},{name:`s-unit`,pattern:/\b(\d{1,3})\s?s\b/g,replace:(e,t)=>`${t} ${Pt.s}`},{name:`live-adjective`,pattern:/\b(is|are|was|were|be|been|being|now|and|stays?|staying|went|go|goes|going|deployed|it's|that's|here's|there's|we're|you're|they're)\s+live\b/gi,replace:(e,t)=>`${t} lyve`},{name:`interior-dot`,pattern:/\.(?=[A-Za-z0-9])/g,replace:` dot `}];function Rt(e){if(!e)return``;let t=e;for(let e of Lt)t=t.replace(e.pattern,e.replace);return t.replace(/[ \t]{2,}/g,` `).trim()}function zt(e){return Rt(kt(e))}var Bt=[{id:`am_michael`,label:`Michael (US ♂)`},{id:`am_adam`,label:`Adam (US ♂)`},{id:`af_heart`,label:`Heart (US ♀)`},{id:`af_bella`,label:`Bella (US ♀)`},{id:`af_nicole`,label:`Nicole (US ♀)`},{id:`af_sarah`,label:`Sarah (US ♀)`},{id:`bm_george`,label:`George (UK ♂)`},{id:`bf_emma`,label:`Emma (UK ♀)`}],Vt=220;function Ht(e){let t=e.match(/[^.!?]+[.!?]*\s*/g)?.map(e=>e.trim()).filter(Boolean)??[e],n=[];for(let e of t){if(e.length<=Vt){n.push(e);continue}let t=e;for(;t.length>Vt;){let e=t.lastIndexOf(` `,Vt);e<=0&&(e=Vt),n.push(t.slice(0,e).trim()),t=t.slice(e).trim()}t&&n.push(t)}return n}function Ut(){return typeof window<`u`&&`speechSynthesis`in window}var A=new class{enabled=!1;lang=`en-US`;mode=`kokoro`;kokoroVoice=`am_michael`;browserVoice=``;active=null;queue=[];currentChat=null;speaking=!1;gen=0;audioEl=null;audioUrl=null;playingKey=null;manual=!1;listeners=new Set;get available(){return Ut()||typeof Audio<`u`}isEnabled(){return this.enabled}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}getPlayingKey(){return this.playingKey}setPlayingKey(e){if(e!==this.playingKey){this.playingKey=e;for(let e of this.listeners)e()}}setEnabled(e){e!==this.enabled&&(this.enabled=e,e||this.reset())}setLang(e){this.lang=e}setMode(e){e!==this.mode&&(this.mode=e,this.reset())}setKokoroVoice(e){this.kokoroVoice=e}setBrowserVoice(e){this.browserVoice=e}setActiveChat(e){e!==this.active&&(this.active=e,this.queue=this.queue.filter(t=>t.chatId===e))}onResponse(e,t){if(!this.enabled||!this.available||!e||e!==this.active)return;let n=zt(t);n&&(this.speaking&&(this.manual||this.currentChat&&this.currentChat!==e)&&(this.queue=[],this.cancel()),this.queue.push({chatId:e,text:n}),this.pump())}speak(e,t){if(!this.available)return;let n=zt(e);if(!n)return;this.reset(),this.manual=!0,this.speaking=!0,this.currentChat=null,this.setPlayingKey(t??null);let r=++this.gen,i=Ht(n),a=()=>{r===this.gen&&(this.speaking=!1,this.manual=!1,this.setPlayingKey(null))};this.mode===`kokoro`?this.speakKokoro(i,0,r,a):this.speakBrowser(i,0,r,a)}bargeIn(){this.reset()}reset(){this.queue=[],this.cancel()}cancel(){this.gen++,this.currentChat=null,this.speaking=!1,this.manual=!1,this.setPlayingKey(null);try{window.speechSynthesis.cancel()}catch{}this.stopAudio()}stopAudio(){if(this.audioEl)try{this.audioEl.pause(),this.audioEl.src=``}catch{}if(this.audioUrl){try{URL.revokeObjectURL(this.audioUrl)}catch{}this.audioUrl=null}}pump(){if(this.speaking)return;let e=this.queue.shift();if(!e)return;this.speaking=!0,this.manual=!1,this.currentChat=e.chatId;let t=++this.gen,n=Ht(e.text),r=()=>{t===this.gen&&(this.speaking=!1,this.currentChat=null,this.pump())};this.mode===`kokoro`?this.speakKokoro(n,0,t,r):this.speakBrowser(n,0,t,r)}speakBrowser(e,t,n,r){if(n!==this.gen)return;if(!Ut()||t>=e.length)return r();let i=new SpeechSynthesisUtterance(e[t]),a=this.browserVoice?window.speechSynthesis.getVoices().find(e=>e.voiceURI===this.browserVoice):void 0;a?(i.voice=a,i.lang=a.lang):i.lang=this.lang||navigator.language||`en-US`,i.onend=()=>this.speakBrowser(e,t+1,n,r),i.onerror=()=>this.speakBrowser(e,t+1,n,r),window.speechSynthesis.speak(i)}speakKokoro(e,t,n,r,i){if(n!==this.gen)return;let a=e[t];if(a===void 0)return r();let o=i??this.fetchSpeech(a),s=e[t+1],c=s===void 0?void 0:this.fetchSpeech(s);o.then(i=>{n===this.gen&&this.playBlob(i,n,()=>this.speakKokoro(e,t+1,n,r,c),()=>{this.speakBrowser(e,t,n,r)})}).catch(()=>{n===this.gen&&this.speakBrowser(e,t,n,r)})}fetchSpeech(e){return ge(`/connectors/voice/call/speak`,{text:e,voice:this.kokoroVoice})}playBlob(e,t,n,r){if(t!==this.gen)return;if(typeof Audio>`u`)return r();this.stopAudio(),this.audioEl||=new Audio;let i=URL.createObjectURL(e);this.audioUrl=i;let a=this.audioEl;a.src=i,a.onended=()=>{t===this.gen&&n()},a.onerror=()=>{t===this.gen&&r()},a.play().catch(()=>{t===this.gen&&r()})}};function Wt(){if(!Ut())return[];try{return window.speechSynthesis.getVoices().map(e=>({uri:e.voiceURI,label:`${e.name} (${e.lang})`,lang:e.lang})).sort((e,t)=>e.lang.localeCompare(t.lang)||e.label.localeCompare(t.label))}catch{return[]}}var Gt=typeof navigator<`u`&&!!navigator.mediaDevices?.getUserMedia&&typeof window<`u`&&`MediaRecorder`in window;function Kt(){for(let e of[`audio/webm;codecs=opus`,`audio/webm`,`audio/ogg;codecs=opus`,`audio/mp4`])if(typeof MediaRecorder<`u`&&MediaRecorder.isTypeSupported?.(e))return e}var qt=class{rec=null;chunks=[];stream=null;async start(){this.stream=await navigator.mediaDevices.getUserMedia({audio:!0}),this.chunks=[];let e=Kt();this.rec=new MediaRecorder(this.stream,e?{mimeType:e}:void 0),this.rec.ondataavailable=e=>{e.data.size&&this.chunks.push(e.data)},this.rec.start()}async stop(){let e=this.rec;if(!e)return this.teardown(),null;let t=new Promise(t=>{e.onstop=()=>t()});try{e.stop()}catch{}await t;let n=e.mimeType||`audio/webm`,r=new Blob(this.chunks,{type:n});return this.teardown(),r.size?r:null}cancel(){try{this.rec?.stop()}catch{}this.teardown()}teardown(){this.stream?.getTracks().forEach(e=>e.stop()),this.rec=null,this.stream=null,this.chunks=[]}};async function Jt(e){return((await be(`/connectors/voice/call/transcribe`,e))?.text??``).trim()}function Yt(){return typeof document<`u`&&document.visibilityState===`hidden`}var j=Oe((e,t)=>{let n=()=>{t()._timer||Yt()||e({now:Date.now(),_timer:setInterval(()=>e({now:Date.now()}),1e3)})},r=()=>{let n=t()._timer;n&&clearInterval(n),e({_timer:null})},i=()=>Yt()?r():n();return{now:Date.now(),_timer:null,_running:!1,start(){t()._running||(e({_running:!0}),typeof document<`u`&&document.addEventListener(`visibilitychange`,i),n())},stop(){t()._running&&(typeof document<`u`&&document.removeEventListener(`visibilitychange`,i),r(),e({_running:!1}))}}});function Xt(e=!0){return j(t=>e?t.now:0)}function Zt(e=3e4){return j(t=>Math.floor(t.now/e))}function Qt(e=1e4){return j(t=>Math.floor(t.now/e)*e)}function $t(e,t){let{[t]:n,...r}=e;return r}function en(e,t){return!t||e.desiredVersion>t.desiredVersion||e.desiredVersion===t.desiredVersion&&e.updatedAt>=t.updatedAt}function tn(e){if(!e?.agentId)return;let{states:t}=nn.getState();en(e,t[e.agentId])&&nn.setState({states:{...t,[e.agentId]:e}})}var nn=Oe((e,t)=>({states:{},refused:{},async request(n,r){e({refused:$t(t().refused,n)});try{let{effortState:e}=await C(`POST`,`/agents/`+encodeURIComponent(n)+`/actions`,{action:`effort`,effort:r,requestId:crypto.randomUUID(),surface:{component:`composer-effort`}});tn(e)}catch(i){e({refused:{...t().refused,[n]:{effort:r,error:i.message}}})}},async load(e){let{state:t}=await C(`GET`,`/agents/`+encodeURIComponent(e)+`/effort`);tn(t)},invalidate(){for(let e of Object.keys(t().states))t().load(e).catch(()=>{})},dismiss(n){t().refused[n]&&e({refused:$t(t().refused,n)})}}));function rn(e){return e&&Je(e)?e.desiredEffort:void 0}function an(e,t){e===`agent.effort`&&tn(JSON.parse(t))}var on={changes:[],coveredFrom:null},sn=new Set;function cn(e,t){let n=new Set(e.map(e=>e.commandId)),r=t.filter(e=>!n.has(e.commandId));return r.length?[...e,...r].sort((e,t)=>e.at-t.at):e}var ln=Oe((e,t)=>({byAgent:{},epoch:0,async ensureCovered(n,r){let i=t().byAgent[n]??on;if(i.coveredFrom!==null&&r>=i.coveredFrom)return;let a=`${n}:${r}`;if(!sn.has(a)){sn.add(a);try{let a=i.coveredFrom===null?``:`&to=${i.coveredFrom}`,o=[],s;do{let e=s?`&afterAt=${s.at}&afterId=${encodeURIComponent(s.id)}`:``,t=await C(`GET`,`/agents/${encodeURIComponent(n)}/effort-changes?from=${r}${a}${e}`);o.push(...t.changes),s=t.next}while(s);let c=t().byAgent[n]??on,l=c.coveredFrom===null?r:Math.min(c.coveredFrom,r);e({byAgent:{...t().byAgent,[n]:{changes:cn(c.changes,o),coveredFrom:l}}})}catch{}finally{sn.delete(a)}}},note(n){let r=t().byAgent;for(let e of n){let t=r[e.agentId]??on,n=cn(t.changes,[e]);n!==t.changes&&(r={...r,[e.agentId]:{...t,changes:n}})}r!==t().byAgent&&e({byAgent:r})},invalidate(){e({byAgent:Object.fromEntries(Object.entries(t().byAgent).map(([e,t])=>[e,{...t,coveredFrom:null}])),epoch:t().epoch+1})}}));function un(e,t){if(e!==`command.succeeded`||!t.includes(`"agent.setEffort"`))return;let n=qe(JSON.parse(t).command);n&&ln.getState().note([n])}var dn=[];function fn(e,t){let n=ln(t=>e?t.byAgent[e]:void 0),r=ln(e=>e.epoch),i=n?.coveredFrom??null;return(0,w.useEffect)(()=>{e&&t!==null&&(i===null||t<i)&&ln.getState().ensureCovered(e,t)},[e,t,i,r]),n?.changes??dn}function pn(e,t){return(e?.providers??[]).filter(e=>f(t?.find(t=>t.provider===e)))}function mn(e,t,n){let r=pn(e,t);return{providers:n&&e?.providers.includes(n)&&!r.includes(n)?[...r,n]:r,enabled:r}}function M(e,t){return pn(e,t)[0]??p().find(e=>f(t?.find(t=>t.provider===e)))??``}function hn(e,t){return c(e,t)?.models.filter(e=>!e.disabled)??[]}function gn(e,t,n,r){return c(e,r)?.effortSwitch!==!0||n===`headless`?[]:hn(e,r).find(e=>e.alias===t)?.efforts??[]}var N=`band`;function _n(e,t){return e.includes(t)?t:N}function vn(e,t){let n=t.indexOf(e);if(!(n<0))return{floor:t[Math.max(0,n-1)],ceiling:t[Math.min(t.length-1,n+1)]}}function P(e,t){let n=c(e,t);return n?l(n).alias??``:``}function yn(e,t){return e.filter(e=>e.status===`online`&&v(t,e.baseDir)).sort((e,t)=>de(t.baseDir).length-de(e.baseDir).length)[0]}function bn(e,t){for(let n of e){let e=n.managedAgents.find(e=>e.agentId===t);if(e)return{orchestrator:n,managed:e}}return null}function xn(e,t){let n=bn(e,t.id)?.orchestrator;if(n)return n;let r=typeof t.meta?.cwd==`string`?t.meta.cwd:``;return r?yn(e,r):void 0}var Sn=`/settings/chat/scroll`,Cn=150,wn=1e3,F=new Map,Tn=new Map,I=new Set,L=null,En=null,Dn=!1;function On(e){if(!e||typeof e!=`object`)return null;let t=e;if(typeof t.stick!=`boolean`||t.topKey!==null&&typeof t.topKey!=`string`||typeof t.offset!=`number`||!Number.isFinite(t.offset))return null;let n=typeof t.anchorMessageId==`number`&&Number.isFinite(t.anchorMessageId)?t.anchorMessageId:void 0,r=typeof t.anchorEndMessageId==`number`&&Number.isFinite(t.anchorEndMessageId)?t.anchorEndMessageId:void 0,i=t.mode===`follow`||t.mode===`anchored`?t.mode:void 0;return{...i===void 0?{}:{mode:i},stick:t.stick,topKey:t.topKey,...n===void 0?{}:{anchorMessageId:n},...r===void 0?{}:{anchorEndMessageId:r},offset:t.offset}}function kn(e){if(!e||typeof e!=`object`)return 0;let t=e.updatedAt;return typeof t==`number`&&Number.isFinite(t)?t:0}function An(e){return F.get(e)}function jn(e,t,n){F.delete(e),F.set(e,t),Tn.set(e,n)}function Mn(e,t){jn(e,t,Date.now()),I.add(e),Nn(),Bn(),In()}function Nn(){for(;F.size>Cn;){let e=F.keys().next().value;if(e===void 0)break;F.delete(e),Tn.delete(e),I.delete(e)}}function Pn(e){let t={};for(let n of e){let e=F.get(n);e&&(t[n]={...e,updatedAt:Tn.get(n)??Date.now()})}return t}function Fn(e){if(!(!e||typeof e!=`object`)){for(let[t,n]of Object.entries(e)){if(I.has(t))continue;let e=On(n);if(!e)continue;let r=kn(n),i=Tn.get(t);i!==void 0&&i>=r||jn(t,e,r)}Nn()}}function In(){L!==null&&clearTimeout(L),L=setTimeout(()=>{Ln(!1)},wn)}async function Ln(e){if(I.size===0)return;let t=I;I=new Set;let n=Pn(t);try{Fn((await C(`PUT`,Sn,{value:n},e?{keepalive:!0}:void 0)).value)}catch{for(let e of t)I.add(e)}}function Rn(){L!==null&&(clearTimeout(L),L=null),Ln(!0)}async function zn(){try{Fn((await C(`GET`,Sn)).value)}catch{}}function Bn(){Dn||typeof document>`u`||typeof window>`u`||(Dn=!0,document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`?Rn():zn()}),window.addEventListener(`pagehide`,Rn))}function Vn(){return Bn(),En||(En=zn(),En)}function Hn(e,t){let n=0,r=0;return{async hydrate(i){let a=n;try{let o=t((await C(`GET`,e)).value);n===a&&r===0&&o!==void 0&&i(o)}catch{}},async save(t){n+=1,r+=1;try{await C(`PUT`,e,{value:t})}finally{--r}}}}var Un=Hn(`/settings/chat/decisionsDock`,e=>{let t=e?.collapsed;return typeof t==`boolean`?t:void 0});function Wn(e){return Un.hydrate(t=>e({decisionsDockCollapsed:t}))}var Gn=(e,t)=>({openDecisions:[],decisionsDockCollapsed:!1,async setDecisionsDockCollapsed(n){let r=t().decisionsDockCollapsed;e({decisionsDockCollapsed:n});try{await Un.save({collapsed:n})}catch(n){e({decisionsDockCollapsed:r}),t().showError(`Could not save panel state`,i(n),n)}},async fetchOpenDecisions(){try{let{decisions:n}=await C(`GET`,`/decisions?status=open`),r=O(t().openDecisions,n);r!==t().openDecisions&&e({openDecisions:r})}catch{}},async declineVaultRequest(n){try{return await C(`POST`,`/decisions/${n}/decline`),e({openDecisions:t().openDecisions.filter(e=>e.id!==n)}),t().showNotification(`Secret request #${n} declined`),!0}catch(e){return t().showError(`Decline failed`,i(e),e),t().fetchOpenDecisions(),!1}},async answerDecision(n,r,a){try{await C(`POST`,`/decisions/${n}/answer`,{answers:r,...a?{note:a}:{}});let i=t().openDecisions.find(e=>e.id===n);e({openDecisions:t().openDecisions.filter(e=>e.id!==n)});let o=i?.kind===`action`?r[Ue]:void 0;return t().showNotification(typeof o==`string`?`${o}: ${i.title}`:`Decision #${n} answered`),!0}catch(e){return t().showError(`Answer failed`,i(e),e),t().fetchOpenDecisions(),!1}}}),Kn=Hn(`/settings/chat/filters`,d);function qn(e){return Kn.hydrate(t=>e({chatFilters:t}))}var Jn=(e,t)=>({chatFilters:u,async setChatFilters(n){let r=t().chatFilters;e({chatFilters:n});try{await Kn.save(n)}catch(n){e({chatFilters:r}),t().showError(`Could not save chat filters`,i(n),n)}}}),Yn={expiresDate:``,expiresTime:``,revision:``,sourceUrl:``,hintEnabled:!0},Xn=e=>String(e).padStart(2,`0`),Zn=`23:59:59.999`;function R(e){let t=e?new Date(e):null;if(!t||Number.isNaN(t.getTime()))return{expiresDate:``,expiresTime:``};let n=t.getHours()===23&&t.getMinutes()===59&&t.getSeconds()===59;return{expiresDate:`${t.getFullYear()}-${Xn(t.getMonth()+1)}-${Xn(t.getDate())}`,expiresTime:n?``:`${Xn(t.getHours())}:${Xn(t.getMinutes())}`}}function Qn(e){if(!e.expiresDate)return null;let t=new Date(`${e.expiresDate}T${e.expiresTime||Zn}`);return!Number.isNaN(t.getTime())&&R(t.toISOString()).expiresDate===e.expiresDate?t.getTime():NaN}function $n(e){let{expiresDate:t,expiresTime:n}=R(e);return n?`${t} ${n}`:t}var er=(e,t)=>e.expiresDate===t.expiresDate&&e.expiresTime===t.expiresTime,tr=(e,t)=>({...R(e.expiresAt),revision:e.revision??``,sourceUrl:e.sourceUrl??``,hintEnabled:t});function nr(e,t={}){let n={},r=t.metadata??{},i={expiresAt:er(e,R(r.expiresAt))?r.expiresAt??``:e.expiresDate?new Date(Qn(e)).toISOString():``,revision:e.revision.trim(),sourceUrl:e.sourceUrl.trim()};for(let e of[`expiresAt`,`revision`,`sourceUrl`])i[e]!==(r[e]??``)&&(n[e]=i[e]||null);return e.hintEnabled!==(t.hintEnabled??!0)&&(n.hintEnabled=e.hintEnabled),Object.keys(n).length?n:void 0}function rr(e,t={},n=Date.now()){let r=Qn(e);return e.expiresBad||Number.isNaN(r)?`Expiry is not a real date.`:!e.expiresDate&&e.expiresTime?`Pick a date for the expiry time.`:r!==null&&r<=n&&!er(e,R(t.metadata?.expiresAt))?`Expiry is in the past.`:e.sourceUrl.trim()&&!/^https?:\/\/[^\s/@]+(?:[/?#]\S*)?$/i.test(e.sourceUrl.trim())?`Source URL must start with http:// or https:// and carry no credentials.`:``}function ir(e,t){let n=e?new Date(e).getTime():NaN;return Number.isFinite(n)?n<=t?{expired:!0,label:`expired ${b(t,n)} ago`}:{expired:!1,label:`expires in ${b(n,t)}`}:null}var ar=(e,t)=>e?`${e}${t?` · …${t}`:``}`:``,or={expiresAt:`expiry`,revision:`revision`,sourceUrl:`source URL`,hintEnabled:`hint`};function sr(e){try{let{field:t,oldValue:n,newValue:r}=JSON.parse(e??``);if(!t)return e??``;let i=e=>e==null?`none`:t===`hintEnabled`?e?`on`:`off`:String(e);return`${or[t]??t}: ${i(n)} → ${i(r)}`}catch{return e??``}}var cr=e=>{let t=e.projectId?`project:${e.projectId}:${e.name}`:e.name;return e.environment&&e.environment!==`prod`?`${t}@${e.environment}`:t},lr=`vault:global`,ur=/^[A-Za-z_][A-Za-z0-9_.-]{0,255}(@[a-z0-9-]{1,32})?$/,dr=e=>e.teamId===lr,fr=(e,t)=>dr(e)&&e.expiresAt!==void 0&&e.expiresAt<=t,pr=(e,t)=>e.reduce((e,n)=>e+ +!fr(n,t),0);function mr(e){let t=e.replace(/^Set secret /,``),n=/^project:([A-Za-z0-9_-]+):(.+)$/.exec(t);return n?{name:n[2],scope:`project`,projectId:n[1]}:{name:t,scope:`global`}}var hr=(e,t)=>t.tab===`global`?!e.projectId:!!e.projectId&&e.projectId===t.projectId;function gr(e){let t=e.message??``,n=/^vault_key_(missing|mismatch|unavailable)$/.exec(t);return e.status===503&&n?{status:`key-problem`,code:t}:e.status===503&&t===`unavailable`||e.status===403||e.status===404?{status:`off`}:typeof e.status==`number`?{status:`error`,message:t||`HTTP ${e.status}`}:null}var _r={requested:`Requested`,set:`Set`,rotated:`Rotated`,resolved:`Used`,deleted:`Deleted`,"metadata-edited":`Metadata edited`},vr=e=>_r[e]??e;function yr(e){let t=e.detail??``;return t?e.action===`requested`&&t.startsWith(`decision:`)?`decision #${t.slice(9)}`:e.action===`resolved`?`command ${t}`:e.action===`metadata-edited`?sr(t):t.startsWith(`requestedBy:`)?`requested by ${t.slice(12)}`:t:``}function br(e){let t=e.detail??``;return e.action===`requested`&&/^decision:\d+$/.test(t)?{decisionId:Number(t.slice(9))}:t.startsWith(`requestedBy:`)?{requestedBy:t.slice(12)}:{}}var xr=e=>/^agent-([0-9a-f]{8})(?:-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.exec(e)?.[1]??null;function Sr(e,t){return new URL(e.replace(/^\//,``),t).toString()}var Cr={vault_key_missing:{title:`Vault key is missing`,body:"Secrets exist but the key file is gone. Relay never makes a new key while secrets exist. Put the key from `secrets export-key` back at $AGENT_RELAY_HOME/secrets/vault.key and restart Relay."},vault_key_mismatch:{title:`Vault key does not match`,body:"The key file on the hub cannot open the stored secrets. Restore the original key from your `secrets export-key` backup and restart Relay."},vault_key_unavailable:{title:`Vault key cannot be read`,body:`The key file exists but the hub cannot read it. Check its owner and permissions (0600), then restart Relay.`}};async function wr(e){try{let[{secrets:t},n,r]=await Promise.all([C(`GET`,`/secrets?scope=all&environment=*`),C(`GET`,`/projects`).then(e=>e.projects??[],()=>null),C(`GET`,`/secrets/backup`).catch(()=>null)]);e({vault:{status:`ready`,secrets:t},vaultBackup:r,...n?{vaultProjects:n}:{}})}catch(t){let n=gr(t);n&&e({vault:n})}}var Tr=e=>({vault:{status:`unknown`},vaultProjects:[],vaultBackup:null,fetchVault:()=>wr(e)});async function Er(e){return(await C(`GET`,`/secrets/${encodeURIComponent(e)}/audit`)).audit}async function Dr(e,t,n,r=`prod`){let i=await C(`POST`,`/mcp`,{jsonrpc:`2.0`,id:1,method:`tools/call`,params:{name:`relay_secret_request`,arguments:{name:r===`prod`?e:`${e}@${r}`,reason:t,...n?{scope:`project`,project:n}:{}}}});if(i.error)throw Error(i.error.message??`Secret request failed`);let a=i.result?.structuredContent;if(i.result?.isError||typeof a?.decisionId!=`number`)throw Error(i.result?.content?.[0]?.text??`Secret request failed`);let o=await C(`GET`,`/decisions/${a.decisionId}`);return{decisionId:a.decisionId,name:a.name??e,formUrl:o.formUrl,createdAt:o.createdAt}}async function Or(e){return C(`POST`,`/secrets`,{name:e.name,value:e.value,environment:e.environment??`prod`,...e.projectId?{scope:`project`,project:e.projectId}:{},...e.description?{description:e.description}:{},...e.metadata?{metadata:e.metadata}:{}})}async function kr(e,t,n,r){return C(`PUT`,`/secrets/${encodeURIComponent(e)}`,{value:t,...n?{reason:n}:{},...r?{metadata:r}:{}})}async function Ar(e,t){return C(`PATCH`,`/secrets/${encodeURIComponent(e)}/metadata`,t)}async function jr(e){return(await C(`GET`,`/secrets/${encodeURIComponent(e)}`)).versions}async function Mr(e){return C(`DELETE`,`/secrets/${encodeURIComponent(e)}`)}async function Nr(e){let t=await Promise.all(e.map(e=>C(`GET`,`/agents/${encodeURIComponent(e)}`).then(t=>[e,t.label||t.name],()=>null)));return Object.fromEntries(t.flatMap(e=>e&&e[1]?[e]:[]))}async function Pr(){return C(`POST`,`/secrets/backup`,{})}function z(e,t,n){if(e.length<=t)return e;let r=new Set(e.map((e,t)=>({item:e,index:t,rank:n(e)})).sort((e,t)=>t.rank-e.rank||t.index-e.index).slice(0,t).map(({index:e})=>e));return e.filter((e,t)=>r.has(t))}var Fr=3e4,B=null,V=new WeakMap;function Ir(e){let t=V.get(e);t!==void 0&&clearTimeout(t),V.delete(e)}function Lr(e){if(o(e.from)||o(e.to))return!0;let t=typeof e.payload?.direction==`string`?e.payload.direction:void 0;return e.kind===`channel.event`&&t===`inbound`}var Rr={enabled:!0,browserEnabled:!1,messages:!0,replies:!0,errors:!0};function zr(e,t){return t.enabled?e.kind===`message`?t.messages:e.kind===`reply`?t.replies:e.kind===`decision`||t.errors:!1}function Br(){return typeof window<`u`&&`Notification`in window}function Vr(){return Br()?window.Notification.permission:`unsupported`}function Hr(e,t){return!zr(e,t.notificationSettings)||!t.notificationSettings.browserEnabled||Vr()!==`granted`||bt(e,t)?!1:_t()||t.view!==`chat`}function Ur(e,t){if(Vr()===`granted`)try{let n=new window.Notification(e.title,{body:e.body,tag:e.id,icon:`icons/humwick-192.png`,data:{view:e.view,threadPeer:e.threadPeer,agentId:e.agentId,messageId:e.messageId}});n.onclick=()=>{window.focus(),t(),n.close()}}catch{}}var Wr=(e,t)=>({notification:null,toastNotification:null,notifications:[],notificationUnread:0,notificationSettings:{...Rr},notificationPermission:Vr(),confirmModal:{show:!1,title:``,message:``,action:null},errorModal:{show:!1,title:``,message:``},openConfirm(t,n,r){e({confirmModal:{show:!0,title:t,message:n,action:r}})},showError(n,r,i,a){let o=t();if(!a?.force&&he(i)&&(!o.connected||o.connectionError))return;let s=`${n} ${r}`;B&&B.key===s&&!B.dismissed&&Date.now()-B.at<Fr||(B={key:s,at:Date.now(),dismissed:!1},e({errorModal:{show:!0,title:n,message:r}}))},dismissError(){B&&={...B,dismissed:!0},e({errorModal:{show:!1,title:``,message:``}})},showNotification(n){Ir(t),e({notification:n,toastNotification:null});let r=setTimeout(()=>{V.delete(t),e({notification:null})},3e3);V.set(t,r)},handleRelayNotification(n){let r=t();if(!zr(n,r.notificationSettings)||r.notifications.some(e=>e.id===n.id))return;if(n.messageId&&(n.kind===`message`||n.kind===`reply`)){let e=r.messages.find(e=>e.id===n.messageId);if(e&&!Lr(e))return}let i=bt(n,r),a=`${n.title}: ${n.body}`;if(e({notifications:[n,...r.notifications].slice(0,100),notificationUnread:i?r.notificationUnread:Math.min(99,r.notificationUnread+1),notification:i?r.notification:a,toastNotification:i?r.toastNotification:n}),!i){Ir(t);let r=n.id,i=setTimeout(()=>{V.delete(t),t().toastNotification?.id===r&&e({notification:null,toastNotification:null})},4500);V.set(t,i)}Hr(n,r)&&Ur(n,()=>t().openNotification(n)),i&&n.threadPeer&&n.messageId&&t().markInboxThreadReadTo(n.threadPeer,n.messageId)},async openNotification(n){if(e({notificationUnread:0}),n.threadPeer&&(t().openInboxThread(n.threadPeer),n.messageId&&t().markInboxThreadReadTo(n.threadPeer,n.messageId)),n.view&&await t().switchView(n.view),n.agentId&&n.view===`agents`){let e=t().agentsById[n.agentId];e&&t().openAgentDetail(e)}},dismissToast(){Ir(t),e({notification:null,toastNotification:null})},markNotificationsRead(){e({notificationUnread:0})},clearNotifications(){e({notifications:[],notificationUnread:0})},async requestBrowserNotifications(){if(!Br()){e({notificationPermission:`unsupported`,notificationSettings:{...t().notificationSettings,browserEnabled:!1}}),t().showNotification(`Browser notifications are not supported here`);return}let n=await window.Notification.requestPermission();e({notificationPermission:n,notificationSettings:{...t().notificationSettings,browserEnabled:n===`granted`}}),t().showNotification(n===`granted`?`Browser notifications enabled`:`Browser notifications not enabled`)}}),Gr={active:ne,idle:oe};function Kr(e){return(e??(typeof document>`u`?void 0:document))?.visibilityState===`hidden`}function qr(e,t=Kr()){return!e.autoRefresh||t?null:e.lowBandwidth?`idle`:Date.now()-e._lastInteractionAt<=3e4?`active`:`idle`}function Jr(e,t){return t?{stop:!0,reconcile:!1,tier:null}:{stop:!1,reconcile:!0,tier:qr(e,!1)}}function Yr(e,t,n=Date.now()){return t||e.lowBandwidth||e._pollTier!==`idle`?!1:n+Gr.active<(e._pollFireAt??1/0)}function Xr(e){e.clearTimer();let t=qr(e.cadenceInput(),e.hidden());t&&e.arm(t)}function Zr(e){if(Jr(e.cadenceInput(),e.hidden()).stop){e.clearTimer();return}e.reconcileAfterGap(),Xr(e)}function Qr(e,t){let n=e.cadenceInput();t-n._lastInteractionAt<1e3||(e.recordInteraction(t),Yr(n,e.hidden(),t)&&Xr(e))}var $r=e=>({voiceTtsEnabled:!1,voiceTtsLang:`en-US`,voiceTtsMode:`kokoro`,voiceTtsKokoroVoice:`am_michael`,voiceTtsBrowserVoice:``,voiceInputMode:`compose`,setVoiceTtsEnabled(t){A.setEnabled(t),e({voiceTtsEnabled:t})},setVoiceTtsLang(t){A.setLang(t),e({voiceTtsLang:t})},setVoiceTtsMode(t){A.setMode(t),e({voiceTtsMode:t})},setVoiceTtsKokoroVoice(t){A.setKokoroVoice(t),e({voiceTtsKokoroVoice:t})},setVoiceTtsBrowserVoice(t){A.setBrowserVoice(t),e({voiceTtsBrowserVoice:t})},setVoiceInputMode(t){e({voiceInputMode:t})}}),ei=null;function ti(e){let t=e.voiceTtsEnabled&&e.view===`chat`&&e.selectedInboxThread||null;t!==ei&&(ei=t,A.setActiveChat(t))}function ni(e){let t=Object.entries(e().agentChatByAgent).filter(([,e])=>e.loadedInitial).map(([e])=>e);return Promise.all(t.map(t=>e().gapFillAgentChat(t)))}function ri(e,t){ni(e);for(let e of[ln,nn])e.getState().invalidate();t||Promise.all([e().refreshLiveData({gap:!0}),e().refreshPlans(),e().refreshIssueRefs(),e().fetchWorkflowLiveRuns()])}var ii=[`chat`,`messages`];function ai(e){let t=[e.fetchOrchestrators(),e.fetchInboxState()];return ii.includes(e.view)&&t.push(e.fetchDeliverableTasks({unfiltered:!0})),t}async function oi(e,t){t!==`shipping`&&(e.shippingBoard||e.shippingLoading)&&e.closeShipping(),t!==`workflows`&&(e.workflowRuns||e.workflowStats||e.workflowDefinitions||e.workflowLoading||e.workflowTab===`catalog`)&&e.closeWorkflows(),t===`shipping`&&await e.openShipping(),t===`workflows`&&await e.openWorkflows()}function si(e,t,n){e.shippingBoard&&(t===`workspace.status`||t===`ci.status`||t.startsWith(`task.`))&&e.shippingEvent(t,n),t===`workflow.changed`&&e.workflowChanged()}function ci(e){return!e||e.role===`admin`}async function li(e,t,n){let r=await fetch(new URL(`api`+e,xe()),{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/json`,...ve(xe()),...n?{"X-Agent-Relay-Token":n}:{}},body:JSON.stringify(t)}),i=await r.text(),a=i?JSON.parse(i):{};if(!r.ok)throw Object.assign(Error(typeof a.error==`string`?a.error:r.statusText),{status:r.status});return a}var ui=120,H=null,di=``,fi=null;function pi(e,t,n){di=n.accessToken,pe(n.accessToken),ye(!ci(n.user)),t({authToken:``,sessionUser:n.user}),H&&clearTimeout(H),H=setTimeout(()=>{gi(e,t)},Math.max(30,n.expiresIn-ui)*1e3)}function mi(){return di!==``}function hi(e){H&&clearTimeout(H),H=null,di&&pe(``),di=``,ye(!1),e({sessionUser:null})}function gi(e,t){let n=()=>li(`/auth/refresh`,{});return fi??=(navigator.locks?navigator.locks.request(`relay-auth-refresh`,n):n()).then(n=>(pi(e,t,n),!0)).catch(e=>((e.status===400||e.status===401)&&hi(t),!1)).finally(()=>{fi=null}),fi}async function _i(e,t){let n=/^#login=([A-Za-z0-9_.-]+)$/.exec(window.location.hash)?.[1];if(n){window.history.replaceState(null,``,window.location.pathname+window.location.search);try{pi(e,t,await li(`/auth/login-links/redeem`,{code:n}))}catch{}}}async function vi(e){try{e({signInEnabled:(await(await fetch(new URL(`api/auth/providers`,xe()))).json()).invitesEnabled===!0})}catch{}}async function yi(e,t){t({authNeeded:!1,connectionError:!1}),e().connectSSE(),await e().refresh(),e().startAutoRefresh()}function bi(e,t){if(e().authNeeded)return;let n=()=>{e().authNeeded||(t({authNeeded:!0,connectionError:!1}),vi(t))};mi()?gi(e,t).then(e=>{e||n()}):n()}var xi=(e,t)=>({sessionUser:null,signInEnabled:!1,async signIn(n,r){pi(t,e,await li(`/auth/login`,{provider:`password`,username:n,password:r})),await yi(t,e)},async acceptInvite({code:n,handle:r,password:i,displayName:a}){pi(t,e,await li(`/auth/invites/accept`,{code:n,handle:r,password:i,...a?{displayName:a}:{}}))},async signOut(){t().disconnectSSE(),t().stopAutoRefresh(),await li(`/auth/logout`,{},di).catch(()=>void 0),window.location.reload()}}),Si={enabled:null,sessions:{},limits:null,fleetError:``},Ci=()=>({browser:Si}),wi=new Set([`starting`,`running`,`stopping`]),Ti=100,Ei=e=>wi.has(e.status);function U(e){return e().browser??Si}function Di(e,t,n){let r={...e};if(n)for(let[e,t]of Object.entries(r))Ei(t)&&!n.has(e)&&delete r[e];for(let e of t){let t=r[e.id];(!t||t.updatedAt<=e.updatedAt)&&(r[e.id]=e)}let i=Object.values(r).filter(e=>!Ei(e)).sort((e,t)=>t.updatedAt-e.updatedAt);for(let e of i.slice(Ti))delete r[e.id];return r}function Oi(e){return e.status}async function ki(e,t){try{let n=await C(`GET`,`/browser/sessions?active=1`),r=U(t);e({browser:{...r,enabled:!0,limits:n.limits,fleetError:``,sessions:Di(r.sessions,n.sessions,new Set(n.sessions.map(e=>e.id)))}})}catch(n){let r=Oi(n),i=U(t);e(r===404?{browser:{...i,enabled:!1}}:{browser:{...i,enabled:r===403||i.enabled,fleetError:r===403?`Only an operator sees every browser session.`:n.message}})}}async function Ai(e,t,n){try{let r=await C(`GET`,`/browser/sessions?agentId=${encodeURIComponent(n)}&limit=1`),i=U(t);e({browser:{...i,enabled:!0,sessions:Di(i.sessions,r.sessions)}})}catch(n){Oi(n)===404&&e({browser:{...U(t),enabled:!1}})}}async function ji(e,t,n){let r=await C(`DELETE`,`/browser/sessions/${encodeURIComponent(n)}`),i=U(t);e({browser:{...i,sessions:Di(i.sessions,[r.session])}})}function Mi(e,t,n,r){if(!n.startsWith(`browser.session.`))return!1;let i=JSON.parse(r),a=U(t);return e({browser:{...a,enabled:!0,sessions:Di(a.sessions,[i])}}),!0}function Ni(e,t){let n=null;for(let r of Object.values(e))r.agentId===t&&(!n||r.createdAt>n.createdAt)&&(n=r);return n}function Pi(e){let t=a(e.result)?e.result:void 0;return s(e.error)??s(t?.error)??s(t?.reason)??s(t?.message)??`spawn command failed`}function Fi(e){let t=e.id||e.correlationId||`${e.type}:${e.updatedAt??e.createdAt??Date.now()}`,n=0;for(let e=0;e<t.length;e++)n=n*31+t.charCodeAt(e)>>>0;return-Math.max(1,n)}function Ii(e){try{let t=JSON.parse(e);return typeof t?.namespace==`string`?t.namespace:void 0}catch{return}}function Li(e,t){if(t.clientId){let n=e.findIndex(e=>e.clientId===t.clientId);if(n>=0){let r=[...e];return r[n]=t,r}}return D(e,t)}var Ri=[`pointerdown`,`pointermove`,`keydown`,`wheel`,`touchstart`];function zi(e,t){return{cadenceInput:()=>{let t=e();return{autoRefresh:t.autoRefresh,lowBandwidth:t.lowBandwidth,_lastInteractionAt:t._lastInteractionAt,_pollTier:t._pollTier,_pollFireAt:t._pollFireAt}},hidden:()=>Kr(),clearTimer:()=>{let n=e();n._refreshTimer&&clearTimeout(n._refreshTimer),t({_refreshTimer:null,_pollTier:null,_pollFireAt:null})},arm:n=>{let r=Date.now()+Gr[n];t({_refreshTimer:setTimeout(()=>{e().refreshLiveData(),e().startAutoRefresh()},Gr[n]),_pollTier:n,_pollFireAt:r})},recordInteraction:e=>t({_lastInteractionAt:e}),reconcileAfterGap:()=>ri(e,!1)}}function Bi(e){if(typeof window>`u`||typeof document>`u`)return()=>{};let t=()=>e().noteUserActivity(),n=()=>e().handleVisibilityChange();for(let e of Ri)window.addEventListener(e,t,{passive:!0});return document.addEventListener(`visibilitychange`,n),()=>{for(let e of Ri)window.removeEventListener(e,t);document.removeEventListener(`visibilitychange`,n)}}var Vi=e=>(t,n)=>({theme:`dark`,view:`overview`,autoRefresh:!0,lowBandwidth:!1,mobileMenuOpen:!1,commandPaletteOpen:!1,commandQuery:``,connected:!1,connectionError:!1,quotaSeq:0,authNeeded:!1,authToken:``,stats:{},fileOrchestratorId:``,filePath:``,fileSelectedPath:``,fileSelectedLine:0,fileOverlayOpen:!1,_es:null,_refreshTimer:null,_pollTier:null,_pollFireAt:null,_lastInteractionAt:Date.now(),_pollDetachListeners:null,_refreshInFlight:!1,set:e=>t(e),async init(){await e.waitForHydration(),await _i(n,t);let r=n().authToken;r?pe(r):mi()||await gi(n,t),fe(n().view),A.setEnabled(n().voiceTtsEnabled),A.setLang(n().voiceTtsLang),A.setMode(n().voiceTtsMode),A.setKokoroVoice(n().voiceTtsKokoroVoice),A.setBrowserVoice(n().voiceTtsBrowserVoice),ti(n()),me(()=>bi(n,t)),Vn(),t({notificationPermission:Vr()}),n().startClock();try{t({stats:await C(`GET`,`/stats`)})}catch(e){if(e.status===401){t({authNeeded:!0}),vi(t);return}}await n().refresh(),n().fetchAllIssueRefs(),n().connectSSE(),n().startAutoRefresh(),n()._pollDetachListeners||t({_pollDetachListeners:Bi(n)})},async switchView(e){fe(e),t({view:e,mobileMenuOpen:!1});let r=n();await oi(r,e),ii.includes(e)&&await Promise.all([r.fetchMessages(),r.fetchInboxState(),r.fetchDeliverableTasks({unfiltered:!0})]),e===`activity`&&await Promise.all([r.fetchMessages(),r.fetchPairs(),r.fetchTasks(),r.fetchActivityEvents()]),e===`work`&&await Promise.all([r.fetchMessages(),r.fetchTasks()]),e===`pairs`&&await r.fetchPairs(),e===`channels`&&await Promise.all([r.fetchChannels(),r.fetchIntegrations()]),e===`connectors`&&await r.fetchConnectors(),e===`integrations`&&await r.fetchIntegrations(),e===`tasks`&&await Promise.all([r.fetchTasks(),r.fetchDeliverableTasks()]),e===`backlog`&&await r.fetchBacklog(),e===`dependencies`&&await r.fetchTaskGraph(),e===`teams`&&await Promise.all([r.fetchTeams(),r.fetchTeamOutcomeAggregates(),r.refreshIssueRefs()]),e===`automation`&&await Promise.all([r.fetchAutomations(),r.fetchAutomationRuns()]),e===`maintenance`&&await Promise.all([r.fetchMaintenanceJobs(),r.fetchMaintenanceRunning()]),e===`workspaces`&&await Promise.all([r.fetchWorkspaces(),r.fetchOrchestrators(),r.fetchAgents()]),(e===`files`||e===`orchestrators`)&&await r.fetchOrchestrators(),e===`analytics`&&await r.fetchAnalytics(),e===`fleet`&&await Promise.all([r.fetchHosts(),r.fetchOrchestrators(),ki(t,n)])},startClock(){j.getState().start()},stopClock(){j.getState().stop()},startAutoRefresh(){Xr(zi(n,t))},stopAutoRefresh(){zi(n,t).clearTimer()},noteUserActivity(){Qr(zi(n,t),Date.now())},handleVisibilityChange(){Zr(zi(n,t))},async apiCall(e,t,n){return C(e,t,n)},async openFilesAt(e){let r=n();t({fileOrchestratorId:e.orchestratorId||yn(r.orchestrators,e.selectedPath||e.path)?.id||r.orchestrators.find(e=>e.status===`online`)?.id||``,filePath:e.path,fileSelectedPath:e.selectedPath||``,fileSelectedLine:e.line||0,fileOverlayOpen:e.overlay===!0}),e.overlay||await n().switchView(`files`)},async openFilesForAgent(e,t=!1){let r=typeof e.meta?.cwd==`string`?e.meta.cwd:``;if(!r){n().showNotification(`Agent has no cwd`);return}let i=xn(n().orchestrators,e);if(!i){n().showNotification(`No online orchestrator covers that cwd`);return}await n().openFilesAt({orchestratorId:i.id,path:r,overlay:t})},closeFileOverlay(){t({fileOverlayOpen:!1})},async refresh(){let e=n();Wn(t),qn(t),wr(t),await Promise.all([e.fetchStats(),e.fetchHealth(),e.fetchAgents(),e.fetchUsers(),e.fetchOrchestrators(),e.fetchPairs(),e.fetchMessages(),e.fetchTasks(),e.fetchDeliverableTasks({unfiltered:!0}),e.fetchChannels(),e.fetchConnectors(),e.fetchIntegrations(),e.fetchAutomations(),e.fetchAutomationRuns(),e.fetchManagedPolicies(),e.fetchAgentProfiles(),e.fetchToolGroupCatalog(),e.fetchWorkspaces(),e.fetchInboxState(),e.fetchActivityEvents(),e.fetchProviderCatalog(),e.fetchOpenDecisions(),e.fetchWorkflowLiveRuns(),e.fetchMaintenanceJobs(),e.fetchMaintenanceRunning()])},async refreshLiveData(e){if(!n().authNeeded){if(n()._refreshInFlight){e?.gap&&await Promise.all(ai(n()));return}t({_refreshInFlight:!0});try{try{let e=gt(n().stats,await C(`GET`,`/stats`));n().connectionError?t({stats:e,connectionError:!1}):e!==n().stats&&t({stats:e})}catch(e){if(e.status===401)return;n().connectionError||t({connectionError:!0});return}let r=n(),i=[r.fetchHealth(),r.fetchAgents(),r.fetchPairs(),r.fetchMessages(),r.fetchTasks(),r.fetchManagedPolicies(),r.fetchOpenDecisions()],a=r.view;e?.gap&&i.push(...ai(r)),a===`activity`&&i.push(r.fetchActivityEvents()),a===`automation`&&i.push(r.fetchAutomations(),r.fetchAutomationRuns()),a===`channels`&&i.push(r.fetchChannels(),r.fetchIntegrations()),a===`connectors`&&i.push(r.fetchConnectors()),a===`integrations`&&i.push(r.fetchIntegrations()),a===`maintenance`&&i.push(r.fetchMaintenanceJobs(),r.fetchMaintenanceRunning()),(a===`profiles`||a===`projects`)&&i.push(r.fetchAgentProfiles()),a===`workspaces`&&i.push(r.fetchWorkspaces()),a===`analytics`&&i.push(r.fetchAnalytics()),a===`teams`&&i.push(r.fetchTeams(),r.fetchTeamOutcomeAggregates(),r.refreshIssueRefs()),r.agentDetailOpen&&r.agentDetailId&&i.push(r.fetchAgentIssueActivity(r.agentDetailId)),a===`tasks`&&i.push(r.fetchDeliverableTasks()),a===`backlog`&&i.push(r.fetchBacklog()),a===`dependencies`&&i.push(r.fetchTaskGraph()),a===`fleet`&&i.push(r.fetchHosts(),ki(t,n)),(a===`orchestrators`||a===`fleet`)&&i.push(r.fetchOrchestrators()),a===`secrets`&&i.push(wr(t)),r.taskDetailOpen&&r.taskDetailId&&i.push(r.fetchTaskDetail(r.taskDetailId)),await Promise.all(i)}finally{t({_refreshInFlight:!1})}}},async fetchStats(){try{let e=gt(n().stats,await C(`GET`,`/stats`));e!==n().stats&&t({stats:e})}catch{}},connectSSE(){n().disconnectSSE(),t({_es:_e(n().authToken,{connected:(e={})=>{t(n().connectionError?{connected:!0,connectionError:!1}:{connected:!0}),ri(n,!!e.replay?.available)},disconnected:()=>t({connected:!1}),message:(e,r)=>{if(e!==`connected`&&(si(n(),e,r),!Mi(t,n,e,r))){if(e===`replay.gap`){ri(n,!1);return}if(e===`message.new`){let e=JSON.parse(r);if(e.kind===`session`&&!o(e.from)){let t=e.payload?.session;t?.type===`response`&&t?.origin===`provider`&&A.onResponse(h(e),e.body)}let i=n();i.messages.some(t=>t.id===e.id)||t({messages:z([...i.messages,e],500,e=>e.id)});let a=h(e),s=n().agentChatByAgent,c=new Set([e.from,e.to,e.resolvedToAgent].filter(e=>!!e));for(let t of c)s[t]&&n().appendChatTail(t,[e]);m(e)&&g(e)&&vt(a,i)&&n().markInboxThreadReadTo(a,e.id);return}if(e===`message.queued`||e===`message.expired`||e===`message.delivery_updated`||e===`message.reaction_updated`||e===`message.finalized`){let e=JSON.parse(r);t({messages:z(D(n().messages,e),500,e=>e.id)}),n().applyChatMessageUpdate(e);return}if(e===`notification.created`){n().handleRelayNotification(JSON.parse(r));return}if(e===`plan.created`||e===`plan.changed`){let e=JSON.parse(r),t=e.plan??e.data?.plan;if(t){let e=new Map(n().plansById[t.id]?.external?.flatMap(e=>e.title?[[e.taskId,e.title]]:[]));n().upsertPlan(t.external?{...t,external:t.external.map(t=>e.has(t.taskId)?{...t,title:e.get(t.taskId)}:t)}:t),t.external?.length&&n().fetchPlan({threadId:t.threadId,...t.channel?{channel:t.channel}:{}})}return}if(e===`plan.deleted`){let e=JSON.parse(r),t=e.plan??e.data?.plan,i=t?.id??e.planId??e.id??e.data?.planId??e.data?.id;(t||i)&&n().removePlan(t??i);return}if(e===`decision.changed`){n().fetchOpenDecisions(),n().view===`secrets`&&wr(t);return}if(e===`team.dissolved`){let e=JSON.parse(r);e.teamId&&n().markTeamDissolved({teamId:e.teamId,outcomeStatus:e.outcomeStatus,reason:e.reason}),Promise.all([n().fetchTeams(),n().fetchTeamOutcomeAggregates()]);return}if(e===`activity.created`){let e=JSON.parse(r);t({activityEvents:z(D(n().activityEvents,e),200,e=>le(e.createdAt??e.ts))}),e.issueRefId&&n().fetchIssueRef(e.issueRefId),e.agentId&&n().agentDetailOpen&&n().agentDetailId===e.agentId&&n().fetchAgentIssueActivity(e.agentId);return}if(e===`workspace.status`){let e=JSON.parse(r),i=n().workspaces;t({workspaces:D(i,at(i.find(t=>t.id===e.id),e))});return}if(e===`agent.status`){let e=JSON.parse(r),i=n(),a=i.agentsById[e.id],o=et(a,e);if(t({agents:D(i.agents,o),agentsById:{...i.agentsById,[o.id]:o}}),i.livenessMismatches[o.id]&&o.status!==`offline`){let e={...i.livenessMismatches};delete e[o.id],t({livenessMismatches:e})}let s=i.commandStalls[o.id];if(s){let e=ut(o);if(e?.status&<.has(e.status)&&(e.timestamp??0)>s.ts){let e={...i.commandStalls};delete e[o.id],t({commandStalls:e})}}let c=ut(o),l=c?.status??ct(a,o);if(l){let e=c?.timestamp??Date.now(),n=c?.id||`agent-status:${o.id}:${l}:${e}`;t({chatStatusEvents:st(i.chatStatusEvents,o.id,l,e,n)})}return}if(e===`dashboard.presence`){let e=JSON.parse(r);e.agentId&&n().applyPresence(e.agentId,e.viewers??[]);return}if(e===`liveness.mismatch`){let e=JSON.parse(r);e.agentId&&t({livenessMismatches:{...n().livenessMismatches,[e.agentId]:{agentId:e.agentId,detail:e.detail??`Process reported running but relay marked it offline`,ts:Date.now(),policyName:e.policyName,spawnRequestId:e.spawnRequestId}}});return}if(e===`command.stalled`){let e=JSON.parse(r);if(e.agentId){let r=Date.now(),i=e.kind??`compact`,a=i===`clear`?`clear-stalled`:`compaction-stalled`;t({commandStalls:{...n().commandStalls,[e.agentId]:{agentId:e.agentId,kind:i,detail:e.detail??`A context command was requested but never started — the session may need manual intervention.`,ts:r,commandId:e.commandId}},chatStatusEvents:st(n().chatStatusEvents,e.agentId,a,r,`command-stalled:${e.agentId}:${e.commandId??r}`)})}return}if(!Ot(n(),e,r)){if(e===`provider-quota.updated`){t({quotaSeq:n().quotaSeq+1});return}if(e===`message.claimed`){let e=JSON.parse(r);t({messages:n().messages.map(t=>t.id===e.messageId?{...t,claimedBy:e.claimedBy,claimExpiresAt:e.claimExpiresAt}:t)});return}if(e===`message.claim_released`){let e=JSON.parse(r);t({messages:n().messages.map(t=>t.id===e.messageId?{...t,claimedBy:void 0,claimedAt:void 0,claimExpiresAt:void 0}:t)});return}if(e===`message.deleted`){let e=JSON.parse(r);t({messages:n().messages.filter(t=>t.id!==e.messageId)});return}if(e===`orchestrator.status`){let e=it(n().orchestrators,JSON.parse(r));e?t({orchestrators:e}):n().fetchOrchestrators();return}if(e===`orchestrator.removed`){let e=JSON.parse(r);t({orchestrators:n().orchestrators.filter(t=>t.id!==e.id)});return}if(e===`policy.state.changed`||e===`config.changed`){n().fetchManagedPolicies(),e===`config.changed`&&Ii(r)===`provider-enablement`&&n().fetchProviderCatalog(),e===`config.changed`&&Ii(r)===`provider-quota-config`&&t({quotaSeq:n().quotaSeq+1});return}if(an(e,r),un(e,r),e===`command.failed`){let e=JSON.parse(r).command;if(e?.type===`agent.spawn`){let r=Pi(e),i=typeof e.updatedAt==`number`?e.updatedAt:typeof e.createdAt==`number`?e.createdAt:Date.now(),o=a(e.params)?e.params:{},c=s(o.spawnRequestId)??e.correlationId,l=s(o.provider),u=`command:${e.id??c??i}:agent-spawn-failed`,d={id:Fi(e),clientId:u,kind:`state`,title:`agent.spawn · failed`,body:r,meta:[l,c].filter(Boolean).join(` · `)||e.target,icon:`ti-alert-triangle`,view:`agents`,createdAt:i,ts:i,metadata:{commandId:e.id,commandType:e.type,status:e.status??`failed`,target:e.target,provider:l,spawnRequestId:c}};t({activityEvents:z(Li(n().activityEvents,d),200,e=>le(e.createdAt??e.ts))}),n().showNotification(`Spawn failed: ${r}`)}return}if(e===`command.dispatched`||e===`command.succeeded`){let i=JSON.parse(r).command;if(i){let r=ft(i,e);if(r){let e=typeof i.updatedAt==`number`?i.updatedAt:typeof i.createdAt==`number`?i.createdAt:Date.now();t({chatStatusEvents:st(n().chatStatusEvents,dt(i),r,e,i.id?`command:${i.id}:${r}`:void 0)})}}return}if(e.startsWith(`task.`)){let e=JSON.parse(r);if(e.kind===`deliverable`){let r=n(),i=D(r.deliverableTasks,e),a=!r.deliverableStatusFilter||(r.deliverableStatusFilter===`owner-gone`?e.staleOwnerGone===!0:e.status===r.deliverableStatusFilter),o=e.deliverableStage??`none`,s=!r.deliverableStageFilter||o===r.deliverableStageFilter,c=!r.deliverableProjectFilter||e.projectId===r.deliverableProjectFilter;t({deliverableTasks:z(a&&s&&c?i:i.filter(t=>t.id!==e.id),200,e=>e.id)}),r.taskDetailById[e.id]&&t({taskDetailById:{...r.taskDetailById,[e.id]:e}})}else t({tasks:z(D(n().tasks,e),100,e=>e.id)})}}}}},`delta`)})},disconnectSSE(){let e=n()._es;e&&(e.close(),t({_es:null}))},openCommandPalette(){t({commandQuery:``,commandPaletteOpen:!0})},closeCommandPalette(){t({commandPaletteOpen:!1,commandQuery:``})},async runCommand(e){let{action:r,payload:i}=e;if(n().closeCommandPalette(),r===`openView`)await n().switchView(i.view);else if(r===`agentPreset`)t({agentPresetFilter:i.preset||``}),n().setShowOffline(!0),await n().switchView(`agents`);else if(r===`copy`)try{await navigator.clipboard?.writeText(i.value||``)}catch{}else if(r===`messageAgent`){let e=n().agentsById[i.agentId];e&&n().openComposeToAgent(e)}else r===`pairAgent`?n().openPairInvite(i.agentId):r===`filterTag`?(t({agentTagFilter:i.tag||``,tagFilter:i.tag||``}),await n().switchView(`agents`)):r===`exportActivity`&&n().exportActivity(i.format||`markdown`)},async saveTokenAndRefresh(){let e=n().authToken;pe(e);try{await C(`GET`,`/stats`)}catch(e){if(e.status===401){t({authNeeded:!0});return}}e&&hi(t),await yi(n,t)},destroy(){me(null),n()._pollDetachListeners?.(),t({_pollDetachListeners:null}),n().disconnectSSE(),n().stopAutoRefresh(),n().stopClock()}}),Hi=(e,t)=>({users:[],usersById:{},presenceByAgent:{},async fetchUsers(){try{let n=await C(`GET`,`/users`),r=O(t().users,n);if(r===t().users)return;let i={};for(let e of r)i[e.id]=e;e({users:r,usersById:i})}catch{}},applyPresence(n,r){let i=t().presenceByAgent;if(!t().agentsById[n]||r.length===0){if(!(n in i))return;let t={...i};delete t[n],e({presenceByAgent:t});return}e({presenceByAgent:{...i,[n]:r}})},async announcePresence(e,n,r){try{let i=await C(`POST`,`/agents/`+encodeURIComponent(e)+`/presence`,{typing:n,...r?{leaving:!0}:{}});t().applyPresence(e,i.viewers??[])}catch{}}}),Ui=800,W=new Map,Wi=!1,Gi=6e4;function Ki(e,t){let n={keepalive:t.length<Gi};t?C(`PUT`,`/inbox/drafts`,{operatorId:ae,peerId:e,body:t},n).catch(()=>{}):C(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(ae)+`&peerId=`+encodeURIComponent(e),void 0,n).catch(()=>{})}function qi(){Wi||typeof document>`u`||typeof window>`u`||(Wi=!0,document.addEventListener(`visibilitychange`,()=>{document.visibilityState===`hidden`&&Yi()}),window.addEventListener(`pagehide`,()=>Yi()))}function Ji(e,t){for(let[n,r]of Array.from(W))e(n)&&(clearTimeout(r.timer),W.delete(n),t&&Ki(n,r.value))}function Yi(e){Ji(t=>e===void 0||t===e,!0)}function Xi(e){Ji(t=>e===void 0||t===e,!1)}function Zi(e,t){qi(),Ji(t=>t!==e,!0);let n=W.get(e);n&&clearTimeout(n.timer);let r=setTimeout(()=>{let t=W.get(e);W.delete(e),t&&Ki(e,t.value)},Ui);W.set(e,{value:t,timer:r})}var G={kind:`follow`};function Qi(e){if(!e||(e.mode?e.mode===`follow`:e.stick))return G;let{topKey:t,anchorMessageId:n,anchorEndMessageId:r,offset:i}=e;return t===null&&n===void 0?G:{kind:`anchored`,anchor:{topKey:t,anchorMessageId:n,anchorEndMessageId:r,offset:i}}}function $i(e,t){if(t.type===`jump-to`)return{kind:`anchored`,anchor:t.anchor};if(e.kind===`follow`)return(t.type===`gesture-up`||t.type===`selection-held`)&&t.fold?{kind:`anchored`,anchor:t.fold}:e;switch(t.type){case`selection-held`:return e;case`reached-end`:return t.tailDetached?e:G;case`own-prompt-sent`:case`latest-click`:case`anchor-unresolvable`:return G;case`scrolled`:case`gesture-up`:return t.fold&&!sa(e.anchor,t.fold)?{kind:`anchored`,anchor:t.fold}:e}}function ea(e){return e.kind===`follow`?{mode:`follow`,stick:!0,topKey:null,offset:0}:{mode:`anchored`,stick:!1,...e.anchor}}function ta(e,{settled:t,resolves:n,around:r}){if(e.kind===`follow`||n)return{kind:`open`,mode:e};if(!t||r===`requested`)return{kind:`wait`};let i=e.anchor.anchorMessageId;return r===`idle`&&i!==void 0?{kind:`fetch-around`,messageId:i}:{kind:`open`,mode:$i(e,{type:`anchor-unresolvable`})}}var na=1,ra=()=>({commands:0});function ia(e,t,n,r){return oa(t,n)||oa(t,r)?`reset`:e.commands<8?`command`:`retire`}function aa(e,t){return t?`reset`:e.commands<8?`command`:`hold`}function oa(e,t){return Math.abs(e-t)<=na}function sa(e,t){return e.topKey===t.topKey&&e.anchorMessageId===t.anchorMessageId&&e.anchorEndMessageId===t.anchorEndMessageId&&e.offset===t.offset}var ca={messages:[],oldestLoadedId:null,hasMore:!0,loading:!1,loadedInitial:!1,gapBeforeId:null,tail:`attached`},la=new Map;function ua(e,t){t?la.set(e,t):la.delete(e)}var da=new Map;function fa(e,t){t?da.set(e,t):da.delete(e)}function pa(e){let t=da.get(e);t?t():Mn(e,ea(G))}function ma(e){let t=la.get(e)?.();if(t)return t;let n=An(e);if(!n)return null;let r=Qi(n);return r.kind===`follow`?r:{kind:`anchored`,anchorId:r.anchor.anchorMessageId??-1/0}}var ha=new Map,ga=new Map;function _a(e){return ha.get(e)??0}function va(e){return ga.get(e)??0}function ya(e){for(let t of e)if(t.id>=0)return t.id;return null}function K(e){for(let t=e.length-1;t>=0;t--){let n=e[t].id;if(n>=0)return n}return null}function ba(e,t,n,r){let i=0,a=0;for(let t of e)t.id<0||(i++,r!==null&&t.id<r&&a++);if(i<=t)return{messages:e,shedOldest:!1,shedNewest:!1};let o=n===`newest`?i-t:0;r!==null&&(o=Math.min(Math.max(o,a+100+1-t),a-100)),o=Math.min(Math.max(o,0),i-t);let s=[],c=0;for(let n of e)(n.id<0||c++>=o&&c<=o+t)&&s.push(n);return{messages:s,shedOldest:o>0,shedNewest:o+t<i}}function q(e,t,n){let r=e.agentChatByAgent[t]??ca,i=n(r);if(!i)return{};let{messages:a,keep:o=`newest`,live:s=!1,tailShed:c=!1,...l}=i;c&&ha.set(t,_a(t)+1);let u={...r,...l};if(a){let n=t===e.selectedInboxThread,i=ba(a,s&&!n?500:ce,o,n?Ta(t,r):null);u.messages=i.messages,u.oldestLoadedId=ya(i.messages),i.shedNewest&&(u.tail=`reader-detached`);let c=K(r.messages),l=c!==null&&(K(i.messages)??-1/0)<c;(i.shedNewest||u.tail!==`attached`&&l)&&ha.set(t,_a(t)+1),i.shedOldest&&ga.set(t,va(t)+1),i.shedOldest&&(u.hasMore=!0);let d=u.gapBeforeId,f=K(i.messages),p=d!==null&&i.messages.some(e=>e.id>=0&&e.id<d);d!==null&&(u.tail!==`attached`&&f!==null&&d>f||i.shedOldest&&!p)&&(u.gapBeforeId=null)}return{agentChatByAgent:Qe({...e.agentChatByAgent,[t]:u},[t,e.selectedAgent,e.selectedInboxThread])}}function xa(e,t){let n=e.selectedInboxThread,r=n&&n!==t?e.agentChatByAgent[n]:void 0;return!r||r.messages.length<=500?{selectedInboxThread:t}:{selectedInboxThread:t,...q({...e,selectedInboxThread:t},n,e=>({messages:e.messages,live:!0}))}}function Sa(e){return!!e&&(e.tail!==`attached`||!!e.tailPaging)}function Ca(e,t){return e.agentChatByAgent[t]?.tail===`reader-detached`&&ma(t)?.kind!==`follow`}function wa(e,t){let n=e.agentChatByAgent[t];return n&&t===e.selectedInboxThread?Ta(t,n):null}function Ta(e,t){let n=ma(e);return n?n.kind===`anchored`?n.anchorId:K(t.messages):null}var Ea=new Set,Da=new Map,Oa=new Set;function ka(e){return Oa.has(e)}function Aa(e){Oa.add(e)}function ja(e){Oa.delete(e)}function Ma(e){return Ea.has(e)}function Na(e){Ea.add(e)}function Pa(e){Ea.delete(e)}function Fa(e,t,n=!1){let r=Da.get(e);Da.set(e,{from:Math.min(r?.from??t,t),paging:n||!!r?.paging})}function Ia(e){let t=Da.get(e);return Da.delete(e),t}var La=1e3,Ra=3e4,za=new Map;function Ba(e){return za.has(e)}function Va(e,t,n=!1){let r=za.get(e);if(n&&r?.timer&&r.delay<=1e3)return;r?.timer&&clearTimeout(r.timer);let i=n||!r?La:Math.min(r.delay*2,Ra),a={delay:i,timer:null};a.timer=setTimeout(()=>{a.timer=null,t()},i),za.set(e,a)}function Ha(e){let t=za.get(e);t?.timer&&clearTimeout(t.timer),za.delete(e)}var J=300,Ua=8e3;function Wa(e,t){let n=new URLSearchParams;for(let[e,r]of Object.entries(t))n.set(e,String(r));return`/agents/${encodeURIComponent(e)}/chat?${n.toString()}`}function Y(e,t){return t.filter(t=>_(e,t)&&!se(t)).sort((e,t)=>e.id-t.id)}function X(e,t){return O(e,[...e,...t].sort((e,t)=>e.id-t.id))}var Ga=10;async function Ka(e,t,n){let r=[],i=t,a=!1;for(let t=0;t<Ga;t++){let t=await C(`GET`,Wa(e,{before:i,limit:J})),o=Y(e,t);if(o.length===0){a=!0;break}r.push(...o);let s=o[0].id;if(n.has(s)||t.length<J){a=!0;break}i=s}return{messages:r,resolved:a,frontier:a?null:i}}function qa(e,t){if(!t.some(e=>o(e.from)))return e;let n=new Set(t.map(e=>e.id));return e.filter(e=>{if(e.id>=0||!o(e.from))return!0;let t=Ja.get(e.id);return t!==void 0&&!n.has(t)?!0:(Ja.delete(e.id),!1)})}var Ja=new Map;function Ya(e,t,n=!1){if(t!==e().selectedInboxThread)return Ha(t);Va(t,()=>{let n=e(),r=n.agentChatByAgent[t];if(!r||t!==n.selectedInboxThread)return Ha(t);!r.loadedInitial||K(r.messages)===null?e().loadAgentChat(t):r.tail===`error-detached`?e().loadNewer(t):Ha(t)},n)}function Xa(e,t,n){let r=e.gapBeforeId;if(r===null)return null;let i=e.messages.reduce((e,t)=>t.id>=0&&t.id<r&&t.id>e?t.id:e,-1/0);return t>i&&n<r?`island`:t<r&&n>=r?{gapBeforeId:t>i?t:null}:null}function Za(e,t,n,r,i){let a=!1;e(e=>q(e,n,e=>{let t=K(e.messages),o=!i&&Ma(n),s=e.tail!==`attached`,c=e.gapBeforeId??ya(e.messages),l=c!==null&&r.some(e=>e.id<c)?new Set(e.messages.map(e=>e.id)):null,u=l?r.filter(e=>e.id>=c||l.has(e.id)):r,d=t!==null&&(s||o)?u.filter(e=>e.id<=t):u,f=d.length<u.length;return f&&o&&!s&&Fa(n,1/0),a=f&&e.tail===`error-detached`,d.length===0?{tailShed:f}:{messages:X(qa(e.messages,d),d),live:!0,tailShed:f}})),a&&Ya(t,n,!0)}var Qa=(e,t)=>({messages:[],agentChatByAgent:{},threadMessages:[],threadOpen:!1,chatHistoryImports:[],selectedInboxThread:``,replyTo:null,composeOpen:!1,chatAgentSearch:``,chatAgentProviderFilter:``,chatAgentStatusFilter:``,chatAgentTagFilter:``,chatAgentCapFilter:``,chatAgentHostFilter:``,chatAgentSort:`status`,chatAgentSortDir:`asc`,chatAgentGroupBy:``,chatAgentFiltersCollapsed:!0,chatCollapsedChildren:[],chatExpandedItems:[],feedObserveAll:!1,coordinatorFollows:[],coordinatorMutes:[],chatStatusEvents:{},chatStickToBottom:!0,chatHasNewItems:!1,inboxReadCursors:{},inboxArchivedThreads:{},inboxDrafts:{},chatSending:!1,inboxSearch:``,inboxSort:`attention`,inboxSortDir:`desc`,inboxShowArchived:!1,channelFilter:``,compose:{...x},inboxCompose:{...ue},async fetchMessages(){try{let n=t(),r=`/messages?limit=100`;n.view===`messages`&&n.selectedAgent&&(r+=`&for=`+encodeURIComponent(n.selectedAgent)),n.view===`messages`&&n.channelFilter&&(r+=`&channel=`+encodeURIComponent(n.channelFilter));let i=await C(`GET`,r),a=mt(t().messages,i);a!==t().messages&&e({messages:a});let o=t(),s=o.selectedInboxThread;if(vt(s,o)){let e=0;for(let t of a)t.id>e&&h(t)===s&&m(t)&&g(t)&&(e=t.id);e&&t().markInboxThreadReadTo(s,e)}}catch{}},async loadAgentChat(n){if(!n)return;Xe(n);let r=t().agentChatByAgent[n];if(ka(n))return Fa(n,1/0);Aa(n),r?.loadedInitial&&r.messages.length>0||e(e=>q(e,n,()=>({loading:!0})));try{let r=_a(n),i=va(n),a=await C(`GET`,Wa(n,{limit:J})),o=Y(n,a),s=t().agentChatByAgent[n],c=s?.loadedInitial&&va(n)!==i?s.oldestLoadedId:null,l=c===null?o:o.filter(e=>e.id>=c),u=t().agentChatByAgent[n]??ca,d=u.loadedInitial?K(u.messages):null,f=d!==null&&a.length===J&&l.length>0&&l[0].id>d?l[0].id:null,p=l.at(-1)?.id??-1/0,m=!1;e(e=>q(e,n,e=>{let t=e.loadedInitial&&l.length?Xa(e,l[0].id,p):null,i=t===`island`?[]:l,o=e.loadedInitial?e.messages:e.messages.filter(e=>e.id<0||!l.length&&e.id>p);return m=!e.loadedInitial&&l.length>0&&e.messages.some(e=>e.id>p),{messages:X(qa(o,i),i),tailShed:m,hasMore:e.loadedInitial?e.hasMore:a.length===J,loading:!1,loadedInitial:!0,gapBeforeId:e.loadedInitial?f!==null&&e.gapBeforeId===null?f:t&&t!==`island`?t.gapBeforeId:e.gapBeforeId:null,tail:_a(n)===r?`attached`:e.tail}})),ja(n);let h=t().agentChatByAgent[n]?.tail;h===`attached`?Ha(n):h===`error-detached`&&t().loadNewer(n);let g=Ia(n),ee=l.at(-1)?.id??1/0;if((m||g&&(g.paging||!Ca(t(),n)))&&t().loadNewer(n,Math.min(g?.from??ee,ee)),f===null)return;let _=t().agentChatByAgent[n];if(_?.tail!==`attached`||_.gapBeforeId!==f){let r=Ca(t(),n);e(e=>q(e,n,e=>({messages:e.messages.filter(e=>e.id<f),gapBeforeId:e.gapBeforeId===f?null:e.gapBeforeId,tailShed:!0,...r?{}:{tail:`attached`}}))),r||t().loadNewer(n);return}try{let t=await Ka(n,f,new Set(u.messages.map(e=>e.id)));e(e=>q(e,n,e=>e.gapBeforeId===f?{messages:X(e.messages,t.messages),gapBeforeId:t.resolved?null:t.frontier}:null))}catch(e){console.warn(`[chat] gap backfill failed for ${n}, marking for retry on next reconnect: ${e.message}`)}}catch(r){ja(n),e(e=>q(e,n,()=>({loading:!1}))),Ba(n)||t().showError(`Chat Load Failed`,r.message,r),Ya(t,n)}},async loadOlder(n){if(!n)return;let r=t().agentChatByAgent[n];if(!r?.loadedInitial){await t().loadAgentChat(n);return}if(!r.loading){if(r.gapBeforeId!==null){await t().gapFillAgentChat(n);return}if(!(!r.hasMore||r.oldestLoadedId===null)){e(e=>q(e,n,()=>({loading:!0})));try{let t=await C(`GET`,Wa(n,{before:r.oldestLoadedId,limit:J})),i=Y(n,t);e(e=>q(e,n,e=>e.oldestLoadedId===r.oldestLoadedId?{messages:O(e.messages,[...i,...e.messages].sort((e,t)=>e.id-t.id)),keep:`oldest`,hasMore:t.length===J,loading:!1,loadedInitial:!0}:{loading:!1}))}catch(r){e(e=>q(e,n,()=>({loading:!1}))),t().showError(`Chat Load Failed`,r.message,r)}}}},async loadChatAround(n,r){if(!n||!Number.isFinite(r))return;let i=t().agentChatByAgent[n];if(i?.loadedInitial&&!(i.oldestLoadedId!==null&&r>=i.oldestLoadedId)){e(e=>q(e,n,()=>({loading:!0})));try{let t=Y(n,await C(`GET`,Wa(n,{around:r,limit:J}),void 0,{timeoutMs:Ua})),i=t.length?t[t.length-1].id:null;e(e=>q(e,n,r=>{if(!(r.oldestLoadedId!==null&&i!==null&&i<r.oldestLoadedId-1)){let e=i===null?null:Xa(r,t[0].id,i);return e===`island`?{loading:!1}:{messages:X(r.messages,t),keep:`oldest`,...e,loading:!1}}let a=r.gapBeforeId;return a!==null&&(wa(e,n)??-1/0)>=a?{loading:!1}:{messages:X(a===null?r.messages:r.messages.filter(e=>e.id<a),t),keep:`oldest`,gapBeforeId:r.oldestLoadedId,tail:a!==null&&r.tail===`attached`?`reader-detached`:r.tail,loading:!1}}))}catch(t){e(e=>q(e,n,()=>({loading:!1}))),console.warn(`[chat] around-anchor load failed for ${n}@${r}: ${t.message}`)}}},async gapFillAgentChat(n){if(!n)return;let r=t().agentChatByAgent[n];if(!r?.loadedInitial||r.messages.length===0){r?.loading&&Fa(n,1/0);return}let i=Ca(t(),n);i&&Fa(n,1/0);let a=i?null:t().loadNewer(n);try{let t=r.gapBeforeId;if(t!==null){let i=await Ka(n,t,new Set(r.messages.map(e=>e.id)));e(e=>q(e,n,e=>e.gapBeforeId===t?{messages:i.messages.length?X(e.messages,i.messages):e.messages,keep:`oldest`,gapBeforeId:i.resolved?null:i.frontier}:null))}}catch(e){console.warn(`[chat] gap backfill retry skipped for ${n}: ${e.message}`)}await a},async loadNewer(n,r){if(!n)return;let i=t().agentChatByAgent[n],a=K(i?.messages??[]);if(Ma(n)){a!==null&&Fa(n,r??1/0,!0);return}if(!i?.loadedInitial||a===null)return;Na(n),i.tail!==`attached`&&e(e=>q(e,n,()=>({tail:`attached`,tailPaging:!0})));let o=!1;try{let i=Math.min(r??a,a);for(;;){let r=i,a=await C(`GET`,Wa(n,{since:i,limit:J})),o=t().agentChatByAgent[n],s=K(o?.messages??[]);if(s===null||s<r&&o.tail!==`attached`)break;if(s<r){i=s;continue}if(a.length===0)break;let c=Y(n,a.filter(e=>e.id>r));if(c.length&&Za(e,t,n,c,!0),t().agentChatByAgent[n]?.tail!==`attached`||(i=a[a.length-1].id,i<=r)||a.length<J)break}}catch(t){console.warn(`[chat] tail catch-up skipped for ${n}: ${t.message}`),o=!0,e(e=>e.agentChatByAgent[n]?q(e,n,e=>e.tail===`reader-detached`?null:{tail:`error-detached`,tailShed:!0}):{})}finally{Pa(n),e(e=>e.agentChatByAgent[n]?.tailPaging?q(e,n,()=>({tailPaging:!1})):{})}let s=Ia(n),c=t().agentChatByAgent[n]?.tail;if(o){c===`error-detached`&&Ya(t,n);return}Ha(n),s&&(s.paging||!Ca(t(),n))&&await t().loadNewer(n,s.from)},appendChatTail(n,r){if(!n||r.length===0)return;let i=Y(n,r);i.length&&Za(e,t,n,i,!1)},async fetchChatHistoryImports(n){try{let r=t().agentsById[n]?.meta?.spawnRequestId,i=new URLSearchParams({targetAgentId:n,limit:`50`});typeof r==`string`&&r&&i.set(`targetSpawnRequestId`,r);let a=O(t().chatHistoryImports,(await C(`GET`,`/chat/history-imports?`+i.toString())).reduce(D,t().chatHistoryImports));a!==t().chatHistoryImports&&e({chatHistoryImports:a})}catch{}},async fetchInboxState(){try{let n=!t().showOffline,r=await C(`GET`,`/inbox/state?operatorId=`+encodeURIComponent(T(t().sessionUser))+(n?`&excludeOffline=1`:``)),i={},a={},o={};for(let e of r?.threads||[])e.readCursorMessageId&&(i[e.peerId]=e.readCursorMessageId),e.archivedAtMessageId&&(a[e.peerId]=e.archivedAtMessageId);for(let e of r?.drafts||[])e.body&&(o[e.peerId]=e.body);if(n){let e=e=>t().agentsById[e]?.status===`offline`,n=(t,n)=>Object.fromEntries([...Object.entries(t).filter(([t])=>e(t)&&!(t in n)),...Object.entries(n)]);Object.assign(i,n(t().inboxReadCursors,i)),Object.assign(a,n(t().inboxArchivedThreads,a))}let s=t(),c={};Ie(s.inboxReadCursors,i)||(c.inboxReadCursors=i),Ie(s.inboxArchivedThreads,a)||(c.inboxArchivedThreads=a),Object.keys(s.inboxDrafts).length===0&&!Ie(s.inboxDrafts,o)&&(c.inboxDrafts=o),Object.keys(c).length&&e(c)}catch{}},openCompose(){e({composeOpen:!0,compose:{...x,from:T(t().sessionUser)}})},openComposeToAgent(n){e({replyTo:null,compose:{...x,from:T(t().sessionUser),to:n.id},composeOpen:!0})},async doSend(){let n=t();if(!n.compose.from||!n.compose.to||!n.compose.body){t().showError(`Validation`,`From, To, and Message are required.`);return}o(n.compose.from)&&n.agentsById[n.compose.to]&&pa(n.compose.to);try{let r={from:n.compose.from,to:n.compose.to,body:n.compose.body};n.compose.channel&&(r.channel=n.compose.channel),n.compose.subject&&(r.subject=n.compose.subject),n.replyTo&&(r.replyTo=n.replyTo.id),n.compose.claimable&&(r.claimable=!0,r.kind=`task`,r.payload={title:n.compose.subject||`Claimable task`}),await C(`POST`,`/messages`,r),e({composeOpen:!1,replyTo:null,compose:{...x,from:T(t().sessionUser)}}),await t().fetchMessages()}catch(e){t().showError(`Send Failed`,e.message,e)}},async doClaim(e){let n=t(),r=n.compose.from||n.selectedAgent;if(!r){t().showError(`Validation`,`Select an agent first.`);return}try{let n=await C(`POST`,`/messages/`+e+`/claim`,{agentId:r});n.ok||t().showError(`Claim Failed`,n.error||`unknown`),n.ok&&await Promise.all([t().fetchMessages(),t().fetchTasks()])}catch(e){t().showError(`Claim Failed`,e.message,e)}},async doDeliveryAction(e,n,r){try{await C(`POST`,`/messages/`+e+`/delivery/actions`,{action:n,reason:r,agentId:t().compose.from||t().selectedAgent||T(t().sessionUser)}),await t().fetchMessages()}catch(e){t().showError(`Delivery Update Failed`,e.message,e)}},async doDeleteMessage(n){try{await C(`DELETE`,`/messages/`+n),e({messages:t().messages.filter(e=>e.id!==n)})}catch(e){t().showError(`Delete Failed`,e.message,e)}},applyChatMessageUpdate(n){let r=Object.entries(t().agentChatByAgent).filter(([,e])=>e.messages.some(e=>e.id===n.id));r.length!==0&&e(e=>r.reduce((t,[r])=>({...t,...q({...e,...t},r,e=>({messages:e.messages.map(e=>e.id===n.id?n:e)}))}),{}))},async reactToMessage(n,r){try{let i=(n.reactions||[]).some(e=>e.actorId===T(t().sessionUser)&&e.emoji===r),a=await C(`POST`,`/messages/`+n.id+`/reactions`,{actorId:T(t().sessionUser),emoji:r,action:i?`remove`:`add`});e({messages:z(D(t().messages,a),500,e=>e.id)}),t().applyChatMessageUpdate(a)}catch(e){t().showError(`Reaction Failed`,e.message,e)}},startReply(n){let r=o(n.from)?n.to:n.from;e({replyTo:{id:n.id,from:n.from},compose:{...x,from:T(t().sessionUser),to:r,channel:n.channel||``},composeOpen:!0})},cancelReply(){e({replyTo:null})},async openThread(n){e({threadMessages:[],threadOpen:!0});try{e({threadMessages:await C(`GET`,`/messages/`+n+`/thread`)})}catch(e){t().showError(`Thread Load Failed`,e.message,e)}},openInboxThread(n,r=[]){e(e=>xa(e,n)),r.length&&t().markInboxThreadRead(n,r)},closeInboxThread(){e(e=>xa(e,``))},async sendChatMessage(n,r,i=[]){if(!n.trim()&&i.length===0||t().chatSending)return;let a=r.peer;e({chatSending:!0});let o=t().inboxDrafts[a];Xi(a);let s={...t().inboxDrafts};delete s[a],e({inboxDrafts:s}),pa(a);let c=t().agentChatByAgent[a];c&&c.tail!==`attached`&&t().loadNewer(a);let l=-Date.now(),u={id:l,from:T(t().sessionUser),to:a,kind:`chat`,body:n.trim()||`Attachment`,...r.lastMessage?.channel?{channel:r.lastMessage.channel}:{},payload:i.length?{attachments:i}:{},readBy:[T(t().sessionUser)],createdAt:Date.now()};e(e=>q(e,a,e=>({messages:[...e.messages,u]})));try{let o={from:T(t().sessionUser),to:a,body:n.trim()||`Attachment`};r.lastMessage?.channel&&(o.channel=r.lastMessage.channel),r.lastMessage?.id&&(o.replyTo=r.lastMessage.id),i.length&&(o.payload={attachments:i});let s=await C(`POST`,`/messages`,o);!s||t().agentChatByAgent[a]?.messages.some(e=>e.id===s.id)?e(e=>e.agentChatByAgent[a]?q(e,a,e=>({messages:e.messages.filter(e=>e.id!==l)})):{}):Ja.set(l,s.id),C(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(T(t().sessionUser))+`&peerId=`+encodeURIComponent(a)).catch(()=>{}),Promise.all([t().fetchMessages(),t().loadAgentChat(a)])}catch(n){o!==void 0&&t().inboxDrafts[a]===void 0&&(e({inboxDrafts:{...t().inboxDrafts,[a]:o}}),Zi(a,o)),e(e=>e.agentChatByAgent[a]?q(e,a,e=>({messages:e.messages.filter(e=>e.id!==l)})):{}),t().showError(`Send Failed`,n.message,n)}e({chatSending:!1})},async sendPermissionDecision(e,n,r,i){try{await C(`POST`,`/agents/`+encodeURIComponent(e)+`/permission-decision`,{approvalId:n,decision:r,...i?{answers:i}:{}});let a=r===`approve`?`Approved`:r===`approve-session`?`Approved for session`:r===`abort`?`Aborted`:r===`answer`?`Answer sent for`:`Denied`;t().showNotification(`${a} ${r===`answer`?`Claude's question`:`permission request`}`),await t().fetchAgents()}catch(e){t().showError(`Permission Failed`,e.message,e)}},markInboxThreadReadTo(n,r){!n||r<=(t().inboxReadCursors[n]||0)||(e({inboxReadCursors:{...t().inboxReadCursors,[n]:r}}),C(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,readCursorMessageId:r}).catch(()=>{}))},markInboxThreadRead(e,n){!e||!n.length||t().markInboxThreadReadTo(e,xt(n))},markInboxThreadUnread(n){let r={...t().inboxReadCursors};delete r[n],e({inboxReadCursors:r}),C(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,readCursorMessageId:null}).catch(()=>{})},archiveInboxThread(n,r){e({inboxArchivedThreads:{...t().inboxArchivedThreads,[n]:r}}),t().selectedInboxThread===n&&t().closeInboxThread(),C(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,archivedAtMessageId:r}).catch(()=>{})},unarchiveInboxThread(n){let r={...t().inboxArchivedThreads};delete r[n],e({inboxArchivedThreads:r}),C(`PATCH`,`/inbox/threads`,{operatorId:T(t().sessionUser),peerId:n,archivedAtMessageId:null}).catch(()=>{})},setReplyDraft(n,r){let i={...t().inboxDrafts};r?i[n]=r:delete i[n],e({inboxDrafts:i}),Zi(n,r)},async sendInboxReply(n,r){let i=(t().inboxDrafts[n]||``).trim();if(!i||t().chatSending){i||t().showError(`Validation`,`Reply body is required.`);return}Xi(n),pa(n),e({chatSending:!0});try{let a={from:T(t().sessionUser),to:n,body:i};r?.channel&&(a.channel=r.channel),r?.id&&(a.replyTo=r.id),await C(`POST`,`/messages`,a);let o={...t().inboxDrafts};delete o[n],e({inboxDrafts:o}),C(`DELETE`,`/inbox/drafts?operatorId=`+encodeURIComponent(T(t().sessionUser))+`&peerId=`+encodeURIComponent(n)).catch(()=>{}),await t().fetchMessages()}catch(e){t().showError(`Reply Failed`,e.message,e),Zi(n,t().inboxDrafts[n]||``)}e({chatSending:!1})},toggleChatChildrenCollapsed(n){let r=t().chatCollapsedChildren;e({chatCollapsedChildren:r.includes(n)?r.filter(e=>e!==n):[...r,n]})},toggleChatItemExpanded(n){let r=t().chatExpandedItems;e({chatExpandedItems:r.includes(n)?r.filter(e=>e!==n):[...r,n]})},setChatItemsExpanded(n,r){let i=t().chatExpandedItems;if(r){let t=new Set(i);for(let e of n)t.add(e);e({chatExpandedItems:Array.from(t)})}else{let t=new Set(n);e({chatExpandedItems:i.filter(e=>!t.has(e))})}},setFeedObserveAll(t){e({feedObserveAll:t})},toggleCoordinatorFollow(n){let r=t().coordinatorFollows,i=t().coordinatorMutes;r.includes(n)?e({coordinatorFollows:r.filter(e=>e!==n)}):e({coordinatorFollows:[...r,n],coordinatorMutes:i.filter(e=>e!==n)})},toggleCoordinatorMute(n){let r=t().coordinatorMutes,i=t().coordinatorFollows;r.includes(n)?e({coordinatorMutes:r.filter(e=>e!==n)}):e({coordinatorMutes:[...r,n],coordinatorFollows:i.filter(e=>e!==n)})},async doSendInboxCompose(){let{inboxCompose:n}=t();if(!n.to)return;let r=n.toMode===`agent`?n.to:`${n.toMode}:${n.to}`;if(!n.body){t().showError(`Validation`,`Message is required.`);return}n.toMode===`agent`&&pa(r);try{let i={from:T(t().sessionUser),to:r,body:n.body};n.channel&&(i.channel=n.channel),n.subject&&(i.subject=n.subject),n.claimable&&(i.claimable=!0,i.kind=`task`,i.payload={title:n.subject||`Claimable task`}),await C(`POST`,`/messages`,i),e({inboxCompose:{...ue,toMode:n.toMode,to:n.to}}),await t().fetchMessages()}catch(e){t().showError(`Send Failed`,e.message,e)}}});function $a(e,t){return JSON.stringify([String(e),t||``])}function Z(e,t){return JSON.stringify([`team`,e,t||``])}function eo(e){return{threadId:String(e.threadId),...e.channel?{channel:e.channel}:{}}}function to(e){return e.teamId?{teamId:e.teamId,...e.channel?{channel:e.channel}:{}}:null}function no(e){return`teamId`in e?Z(e.teamId,e.channel):$a(e.threadId,e.channel)}var ro=100;function io(e){let t=new URLSearchParams({view:`list`,teamId:e.teamId,limit:String(ro)});return e.channel&&t.set(`channel`,e.channel),`/plans?${t.toString()}`}function ao(e){return{id:e.id,threadId:String(e.threadId),teamId:e.teamId,...e.channel?{channel:e.channel}:{},...e.title?{title:e.title}:{},...e.objective?{objective:e.objective}:{},version:e.version,nodeCount:e.nodes.length,edgeCount:e.edges.length,...e.completion?{completion:e.completion}:{},createdAt:e.createdAt,updatedAt:e.updatedAt}}function oo(e,t){return t.updatedAt-e.updatedAt||t.createdAt-e.createdAt||e.id.localeCompare(t.id)}function so(e,t){if(!t.teamId)return e;let n={...t,teamId:t.teamId},r={...e};for(let[i,a]of Object.entries(e)){if(a.teamId!==t.teamId||a.channel&&a.channel!==t.channel)continue;let e=a.plans.filter(e=>e.id!==t.id);r[i]={...a,plans:t.archived?e:[...e,ao(n)].sort(oo)}}return r}function co(e,t){return t&&e.some(e=>e.id===t)?t:e[0]?.id??null}function lo(e,t){let n=e.planListsByTeam[t],r=e.planSelections[t];if(!n)return r?e.plansById[r]??null:e.plansByTeam[t]??null;let i=co(n.plans,r);return i?e.plansById[i]??null:e.plansByTeam[t]??null}function uo(e){let t=new URLSearchParams(`teamId`in e?{teamId:e.teamId}:{threadId:String(e.threadId)});return e.channel&&t.set(`channel`,e.channel),`/plans?${t.toString()}`}var fo=(e,t)=>{async function n(n){try{let r=await C(`GET`,`/plans/${encodeURIComponent(n)}`);return e({plansById:{...t().plansById,[r.id]:r}}),t().hydrateIssueRefsForPlan(r),!0}catch(e){return t().showError(`Plan Load Failed`,e.message,e),!1}}let r=new Set;async function i(){let{planListsByTeam:e,planSelections:i,plansById:a}=t(),o=[];for(let[t,s]of Object.entries(e)){let e=co(s.plans,i[t]),c=s.plans.find(t=>t.id===e);!c||a[c.id]?.version===c.version||r.has(c.id)||(r.add(c.id),o.push(n(c.id).finally(()=>r.delete(c.id))))}await Promise.all(o)}return{plansById:{},plansByThread:{},plansByTeam:{},planListsByTeam:{},planSelections:{},planLookups:{},planLoading:{},planCollapsed:null,sessionTasksCollapsed:!1,setPlanCollapsed(t){e({planCollapsed:t})},setSessionTasksCollapsed(t){e({sessionTasksCollapsed:t})},async fetchPlan(n){let r=`teamId`in n?{teamId:n.teamId,...n.channel?{channel:n.channel}:{}}:{threadId:String(n.threadId),...n.channel?{channel:n.channel}:{}},i=no(r);e({planLookups:{...t().planLookups,[i]:r},planLoading:{...t().planLoading,[i]:!0}});try{let n=await C(`GET`,uo(r)),a=eo(n),o=$a(a.threadId,a.channel),s=to(n),c=s?Z(s.teamId,s.channel):``,l=!(`teamId`in r),u=`teamId`in r;e({plansById:{...t().plansById,[n.id]:n},plansByThread:{...t().plansByThread,...l?{[i]:n}:{},[o]:n},plansByTeam:s?{...t().plansByTeam,...u?{[i]:n}:{},[c]:n}:t().plansByTeam,planLookups:{...t().planLookups,[i]:r,[o]:a,...s?{[c]:s}:{}},planLoading:{...t().planLoading,[i]:!1,[o]:!1,...s?{[c]:!1}:{}}}),t().hydrateIssueRefsForPlan(n)}catch(n){let a=typeof n.status==`number`?n.status:0;e({plansByThread:a===404&&!(`teamId`in r)?{...t().plansByThread,[i]:null}:t().plansByThread,plansByTeam:a===404&&`teamId`in r?{...t().plansByTeam,[i]:null}:t().plansByTeam,planLoading:{...t().planLoading,[i]:!1}}),a&&a!==404&&t().showError(`Plan Load Failed`,n.message,n)}},async fetchTeamPlanList(n){let r={teamId:n.teamId,...n.channel?{channel:n.channel}:{}},a=Z(r.teamId,r.channel);try{let n=await C(`GET`,io(r));e({planListsByTeam:{...t().planListsByTeam,[a]:{...r,plans:n.plans}}}),await i()}catch(e){t().showError(`Plan List Failed`,e.message,e)}},async chooseTeamPlan(r,i){if(!t().plansById[i]&&!await n(i))return;let a=Z(r.teamId,r.channel);e({planSelections:{...t().planSelections,[a]:i}})},async refreshPlans(){let e=Object.values(t().planLookups),n=Object.values(t().planListsByTeam);await Promise.all([...e.map(e=>t().fetchPlan(e)),...n.map(({teamId:e,channel:n})=>t().fetchTeamPlanList({teamId:e,channel:n}))])},async setPlanArchived(e,n){try{let r=await C(`PATCH`,`/plans/${encodeURIComponent(e)}/archive`,{archived:n});t().upsertPlan(r)}catch(e){t().showError(n?`Plan Archive Failed`:`Plan Unarchive Failed`,e.message,e)}},upsertPlan(n){let r=eo(n),a=$a(r.threadId,r.channel),o=to(n),s=o?Z(o.teamId,o.channel):``;e({plansById:{...t().plansById,[n.id]:n},plansByThread:{...t().plansByThread,[a]:n},plansByTeam:o?{...t().plansByTeam,[s]:n}:t().plansByTeam,planListsByTeam:so(t().planListsByTeam,n),planLookups:{...t().planLookups,[a]:r,...o?{[s]:o}:{}},planLoading:{...t().planLoading,[a]:!1,...o?{[s]:!1}:{}}}),t().hydrateIssueRefsForPlan(n),i()},removePlan(n){let r=typeof n==`string`?n:n.id,a={...t().plansById};delete a[r],e({plansById:a,plansByThread:Object.fromEntries(Object.entries(t().plansByThread).filter(([,e])=>e?.id!==r)),plansByTeam:Object.fromEntries(Object.entries(t().plansByTeam).filter(([,e])=>e?.id!==r)),planListsByTeam:Object.fromEntries(Object.entries(t().planListsByTeam).map(([e,t])=>[e,{...t,plans:t.plans.filter(e=>e.id!==r)}])),planLookups:Object.fromEntries(Object.entries(t().planLookups).filter(([e])=>t().plansByThread[e]?.id!==r&&t().plansByTeam[e]?.id!==r))}),i()}}},po=(e,t)=>({teams:[],teamsLoading:!1,teamsError:null,teamOutcomeAggregates:null,teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:null,async fetchTeams(){e({teamsLoading:!0,teamsError:null});try{let n=await C(`GET`,`/teams`),r=O(t().teams,n.teams);return e({teams:r,teamsLoading:!1,teamsError:null}),r}catch(n){return e({teamsLoading:!1,teamsError:i(n)}),t().teams}},async fetchTeamOutcomeAggregates(){e({teamOutcomeAggregatesLoading:!0,teamOutcomeAggregatesError:null});try{let t=await C(`GET`,`/teams/outcomes`);return e({teamOutcomeAggregates:t,teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:null}),t}catch(n){return e({teamOutcomeAggregatesLoading:!1,teamOutcomeAggregatesError:i(n)}),t().teamOutcomeAggregates}},upsertTeam(n){let r=D(t().teams,n);r!==t().teams&&e({teams:r})},markTeamDissolved(n){let r=Date.now();e({teams:t().teams.map(e=>e.id===n.teamId?{...e,status:`dissolved`,updatedAt:r,dissolvedAt:e.dissolvedAt??r,zeroMembersSince:void 0,...n.outcomeStatus?{outcomeStatus:n.outcomeStatus}:{},...n.reason?{outcomeSummary:n.reason}:{}}:e)})},async dissolveTeam(e){try{let n=await C(`POST`,`/teams/${encodeURIComponent(e)}/dissolve`,{});t().upsertTeam(n),t().showNotification(`Team dissolved`),await Promise.all([t().fetchTeams(),t().fetchTeamOutcomeAggregates(),t().fetchActivityEvents()])}catch(e){t().showError(`Dissolve Failed`,i(e),e)}}});function mo(e,t){return JSON.stringify([e,t])}function ho(e){return[...new Set(e.nodes.map(e=>e.refs?.issueId).filter(e=>!!e))]}function go(e,t){let n=!1,r={...e};for(let i of t){let t=e[i.id];(!t||JSON.stringify(t)!==JSON.stringify(i))&&(r[i.id]=i,n=!0)}return n?r:e}var _o=(e,t)=>({issueRefsById:{},issuesByEntity:{},issueActivityByAgent:{},issueLoading:{},issueErrors:{},async fetchAllIssueRefs(){try{let n=await C(`GET`,`/issue-refs?limit=500`);e({issueRefsById:go(t().issueRefsById,n.issueRefs)})}catch{}},async fetchIssueRef(e){try{let n=await C(`GET`,`/issue-refs/${encodeURIComponent(e)}`);return t().upsertIssueRef(n.issueRef),n.issueRef}catch{return t().issueRefsById[e]??null}},async fetchIssuesForEntity(n,r){let a=mo(n,r);e({issueLoading:{...t().issueLoading,[a]:!0},issueErrors:{...t().issueErrors,[a]:null}});try{let i=await C(`GET`,`/issue-associations/entities/${encodeURIComponent(n)}/${encodeURIComponent(r)}/issues`);return e({issuesByEntity:{...t().issuesByEntity,[a]:i.issues},issueRefsById:go(t().issueRefsById,i.issues.map(e=>e.issueRef)),issueLoading:{...t().issueLoading,[a]:!1}}),i.issues}catch(n){return e({issueLoading:{...t().issueLoading,[a]:!1},issueErrors:{...t().issueErrors,[a]:i(n)}}),t().issuesByEntity[a]??[]}},async fetchAgentIssueActivity(n){let r=`agent:${n}`;e({issueLoading:{...t().issueLoading,[r]:!0},issueErrors:{...t().issueErrors,[r]:null}});try{let i=await C(`GET`,`/issue-activity/agents/${encodeURIComponent(n)}`);return t().agentsById[n]?(e({issueActivityByAgent:{...t().issueActivityByAgent,[n]:i.issues},issueRefsById:go(t().issueRefsById,i.issues.map(e=>e.issueRef)),issueLoading:{...t().issueLoading,[r]:!1}}),i.issues):[]}catch(a){return e({issueLoading:{...t().issueLoading,[r]:!1},issueErrors:{...t().issueErrors,[r]:i(a)}}),t().issueActivityByAgent[n]??[]}},async hydrateIssueRefsForPlan(e){let n=ho(e).filter(e=>!t().issueRefsById[e]);await Promise.all(n.map(e=>t().fetchIssueRef(e)))},async refreshIssueRefs(){let e=Object.keys(t().issuesByEntity).map(e=>{try{let[n,r]=JSON.parse(e);return t().fetchIssuesForEntity(n,r)}catch{return Promise.resolve([])}});await Promise.all([...Object.keys(t().issueRefsById).length?[t().fetchAllIssueRefs()]:[],...e])},upsertIssueRef(n){let r=go(t().issueRefsById,[n]);r!==t().issueRefsById&&e({issueRefsById:r})}}),vo={fromIssue:``,title:``,intent:``,doneWhen:``,onDeploy:``,issueRefs:``,dependsOn:``,dispatchComplexity:``,dispatchType:``,dispatchFootprint:``,dispatchCriticality:``},yo=(e,t)=>({pairs:[],tasks:[],taskEvents:[],taskEventCache:{},taskEventsOpen:!1,pairInviteOpen:!1,pairMessageOpen:!1,pairInvite:{...re},deliverableTasks:[],deliverableStatusFilter:``,deliverableStageFilter:``,deliverableProjectFilter:``,deliverableTagFilter:``,deliverablePriorityFilter:``,taskDetailById:{},taskMemoryById:{},taskHistoryById:{},taskDetailOpen:!1,taskDetailId:null,taskCreateOpen:!1,taskCreateForm:{...vo},taskDispatchResultById:{},taskDispatchLoadingId:null,pairMessage:{...y},pairStatusFilter:`open`,taskStatusFilter:``,taskSourceFilter:``,async fetchPairs(){try{let n=t(),r;if(n.view===`activity`)r=await C(`GET`,`/pairs`);else if(n.pairStatusFilter===`open`){let[e,t]=await Promise.all([C(`GET`,`/pairs?status=active`),C(`GET`,`/pairs?status=pending`)]);r=[...e,...t]}else r=n.pairStatusFilter?await C(`GET`,`/pairs?status=`+encodeURIComponent(n.pairStatusFilter)):await C(`GET`,`/pairs`);let i=r.sort((e,t)=>new Date(t.updatedAt).getTime()-new Date(e.updatedAt).getTime()),a=O(t().pairs,i);a!==t().pairs&&e({pairs:a})}catch{}},async fetchTasks(){try{let n=t(),r=new URLSearchParams({limit:`100`});n.taskStatusFilter&&r.set(`status`,n.taskStatusFilter),n.taskSourceFilter&&r.set(`source`,n.taskSourceFilter);let i=O(t().tasks,await C(`GET`,`/tasks?`+r.toString()));i!==t().tasks&&e({tasks:i})}catch{}},async fetchDeliverableTasks(n){try{let r=t(),i=new URLSearchParams({kind:`deliverable`,limit:`200`});n?.unfiltered||(r.deliverableStatusFilter===`owner-gone`?i.set(`staleOwnerGone`,`1`):r.deliverableStatusFilter&&i.set(`status`,r.deliverableStatusFilter),r.deliverableStageFilter&&i.set(`deliverableStage`,r.deliverableStageFilter),r.deliverableProjectFilter&&i.set(`projectId`,r.deliverableProjectFilter),r.deliverableTagFilter&&i.set(`tag`,r.deliverableTagFilter),r.deliverablePriorityFilter&&i.set(`priority`,r.deliverablePriorityFilter));let a=await C(`GET`,`/tasks?`+i.toString()),o=O(t().deliverableTasks,a);o!==t().deliverableTasks&&e({deliverableTasks:o})}catch{}},async fetchTaskDetail(n){try{let r=await C(`GET`,`/tasks/`+n+`/detail`);e({taskDetailById:{...t().taskDetailById,[n]:r}})}catch{}},async fetchTaskMemory(n){try{let r=await C(`GET`,`/tasks/`+n+`/memory`);e({taskMemoryById:{...t().taskMemoryById,[n]:r}})}catch{}},async fetchTaskHistory(n){try{let r=await C(`GET`,`/tasks/`+n+`/history`);e({taskHistoryById:{...t().taskHistoryById,[n]:r}})}catch{}},openTaskDetail(n){e({taskDetailOpen:!0,taskDetailId:n.id}),t().fetchTaskDetail(n.id),t().fetchTaskMemory(n.id),t().fetchTaskHistory(n.id)},openTaskDetailById(n){e({taskDetailOpen:!0,taskDetailId:n}),t().fetchTaskDetail(n),t().fetchTaskMemory(n),t().fetchTaskHistory(n)},closeTaskDetail(){e({taskDetailOpen:!1,taskDetailId:null})},async doClaimTask(e){let n=t(),r=n.compose.from||n.selectedAgent;if(!r){t().showError(`Validation`,`Select an agent first.`);return}try{let n=await C(`POST`,`/tasks/`+e+`/claim`,{agentId:r});n.ok?await Promise.all([t().fetchTasks(),t().fetchMessages()]):t().showError(`Claim Failed`,n.error||`unknown`)}catch(e){t().showError(`Claim Failed`,e.message,e)}},async doUpdateTaskStatus(n,r){if(!(!n||!r||r===n.status))try{let i={status:r},a=n.claimedBy||t().compose.from||t().selectedAgent;a&&(i.agentId=a);let o=await C(`PATCH`,`/tasks/`+n.id+`/status`,i),s=o.task||o;e({tasks:t().tasks.map(e=>e.id===n.id?s:e)})}catch(e){t().showError(`Status Update Failed`,e.message,e),await t().fetchTasks()}},async openTaskEvents(n){e({taskEvents:[],taskEventsOpen:!0});try{let r=await C(`GET`,`/tasks/`+n.id+`/events`);e({taskEvents:r,taskEventCache:{...t().taskEventCache,[n.id]:r}})}catch(e){t().showError(`Task Events Failed`,e.message,e)}},openTaskCreate(){e({taskCreateOpen:!0,taskCreateForm:{...vo}})},closeTaskCreate(){e({taskCreateOpen:!1})},setTaskCreateForm(n){e({taskCreateForm:{...t().taskCreateForm,...n}})},async doCreateTask(){let{taskCreateForm:n}=t(),r=n.title.trim(),i=n.fromIssue?.trim();if(!r&&!i){t().showError(`Validation`,`A title or GitHub issue is required.`);return}let a=n.intent.trim()||r,o={};n.dispatchComplexity&&(o.complexity=n.dispatchComplexity),n.dispatchType&&(o.type=n.dispatchType),n.dispatchFootprint&&(o.contextFootprint=n.dispatchFootprint),n.dispatchCriticality&&(o.criticality=n.dispatchCriticality);let s=n.issueRefs.split(`,`).map(e=>e.trim()).filter(Boolean),c=n.dependsOn.split(`,`).map(e=>Number(e.trim())).filter(e=>Number.isInteger(e)&&e>0),l=n.idempotencyKey||crypto.randomUUID();e({taskCreateForm:{...n,idempotencyKey:l}});try{await C(`POST`,`/tasks`,{...r?{title:r}:{},...!i||n.intent.trim()?{intent:i?n.intent.trim():a}:{},...i?{fromIssue:i,idempotencyKey:l}:{},...n.onDeploy?.trim()?{onDeploy:n.onDeploy.trim()}:{},...n.doneWhen.trim()?{doneWhen:n.doneWhen.trim()}:{},...s.length?{issueRefs:s}:{},...c.length?{dependsOn:c}:{},...Object.keys(o).length?{dispatch:o}:{}}),e({taskCreateOpen:!1,taskCreateForm:{...vo}}),await t().fetchDeliverableTasks()}catch(e){t().showError(`Create Task Failed`,e.message,e)}},async doEditTask(n,r){try{let i=await C(`PATCH`,`/tasks/`+n,r);e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Edit Task Failed`,e.message,e)}},async doSetTaskReviewHold(e,n,r){try{return await C(`PUT`,`/tasks/`+e+`/review-hold`,{held:n,...r?{expectedHeadSha:r}:{}}),await t().fetchTaskDetail(e),!0}catch(r){return t().showError(n?`Set Review Hold Failed`:`Clear Review Hold Failed`,r.message,r),await t().fetchTaskDetail(e),!1}},async doSetTaskParent(n,r){try{let i=await C(`POST`,`/tasks/`+n+`/parent`,{parentTaskId:r});e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Set Parent Failed`,e.message,e)}},async doClearTaskParent(n){try{let r=await C(`DELETE`,`/tasks/`+n+`/parent`);e({taskDetailById:{...t().taskDetailById,[n]:r},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...r}:e)})}catch(e){t().showError(`Clear Parent Failed`,e.message,e)}},async doAddTaskRelated(n,r){try{let i=await C(`POST`,`/tasks/`+n+`/related`,{relatedTaskId:r});e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Add Related Failed`,e.message,e)}},async doRemoveTaskRelated(n,r){try{let i=await C(`DELETE`,`/tasks/`+n+`/related`,{relatedTaskId:r});e({taskDetailById:{...t().taskDetailById,[n]:i},deliverableTasks:t().deliverableTasks.map(e=>e.id===n?{...e,...i}:e)})}catch(e){t().showError(`Remove Related Failed`,e.message,e)}},async doDispatchTask(n,r,i=!0){e({taskDispatchLoadingId:n});try{let a={};r&&Object.keys(r).length&&(a.pin=r),i||(a.createReview=!1);let o=await C(`POST`,`/tasks/`+n+`/dispatch`,a);e({taskDispatchResultById:{...t().taskDispatchResultById,[n]:o},taskDispatchLoadingId:null})}catch(n){e({taskDispatchLoadingId:null}),t().showError(`Dispatch Failed`,n.message,n)}},async doSpawnWithTask(e,n,r=!0){let i=t().spawnOrchId;try{let a={provider:n.provider,taskId:e};n.model&&(a.model=n.model),n.effort&&(a.effort=n.effort),i&&(a.orchestratorId=i),r||(a.workflow=!1);let o=(await C(`POST`,`/agents/spawn`,a))?.workflowRun;t().showNotification(o?o.existing?`T${e} already runs ${o.workflow} (${o.runId}); no worker spawned`:`Workflow ${o.workflow} started on T${e} (${o.runId}); its run spawns the builder`:`Worker spawning for T${e} (${n.provider})`)}catch(e){t().showError(`Spawn Failed`,e.message,e)}},openPairInvite(n){e({pairInvite:{...re,requesterId:n||t().selectedAgent||``},pairInviteOpen:!0})},closePairInvite(){e({pairInviteOpen:!1,pairInvite:{...re}})},async doCreatePair(){let n=t();if(!n.pairInvite.requesterId||!n.pairInvite.targetId){t().showError(`Validation`,`Requester and Target are required.`);return}if(n.pairInvite.requesterId===n.pairInvite.targetId){t().showError(`Validation`,`Requester and Target must be different.`);return}try{let r={from:n.pairInvite.requesterId,target:n.pairInvite.targetId};n.pairInvite.objective&&(r.objective=n.pairInvite.objective),await C(`POST`,`/pairs`,r),e({pairInviteOpen:!1,pairInvite:{...re}}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Pair Invite Failed`,e.message,e)}},openPairMessage(t,n){e({pairMessage:{...y,pairId:t.id,from:n||t.requesterId},pairMessageOpen:!0})},closePairMessage(){e({pairMessageOpen:!1,pairMessage:{...y}})},async doSendPairMessage(){let n=t();if(!n.pairMessage.pairId||!n.pairMessage.from||!n.pairMessage.body){t().showError(`Validation`,`Pair, From, and Message are required.`);return}try{let r={from:n.pairMessage.from,body:n.pairMessage.body};n.pairMessage.subject&&(r.subject=n.pairMessage.subject),await C(`POST`,`/pairs/`+encodeURIComponent(n.pairMessage.pairId)+`/messages`,r),e({pairMessageOpen:!1,pairMessage:{...y}}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Pair Message Failed`,e.message,e)}},async doAcceptPair(e){try{await C(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/accept`,{agentId:e.targetId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Accept Failed`,e.message,e)}},async doRejectPair(e){try{await C(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/reject`,{agentId:e.targetId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Reject Failed`,e.message,e)}},async doHangupPair(e,n){try{await C(`POST`,`/pairs/`+encodeURIComponent(e.id)+`/hangup`,{agentId:n||e.requesterId}),await Promise.all([t().fetchPairs(),t().fetchMessages()])}catch(e){t().showError(`Hang Up Failed`,e.message,e)}}}),bo=25;function xo(e,t){let n=new URLSearchParams({maxItems:String(bo),offset:String(t)});return e.backlogPriorityFilter&&n.set(`priority`,e.backlogPriorityFilter),e.backlogTagFilter&&n.set(`tags`,e.backlogTagFilter),e.backlogSearchFilter&&n.set(`search`,e.backlogSearchFilter),e.backlogProjectFilter&&n.set(`projectId`,e.backlogProjectFilter),n}var So=(e,t)=>({backlogItems:[],backlogTotal:0,backlogOffset:0,backlogMaxItems:bo,backlogHasMore:!1,backlogLoading:!1,backlogError:null,backlogPriorityFilter:``,backlogTagFilter:``,backlogSearchFilter:``,backlogProjectFilter:``,backlogPromotedOpen:!1,backlogPromotedItems:[],backlogPromotedLoading:!1,backlogPromotedFetched:!1,backlogPromoteLoadingId:null,async fetchBacklog(){e({backlogLoading:!0,backlogError:null});try{let n=await C(`GET`,`/backlog?`+xo(t(),0).toString());e({backlogItems:n.items,backlogTotal:n.total,backlogOffset:n.offset,backlogMaxItems:n.maxItems,backlogHasMore:n.hasMore,backlogLoading:!1})}catch(t){e({backlogLoading:!1,backlogError:t.message})}},async loadMoreBacklog(){let n=t();if(!(!n.backlogHasMore||n.backlogLoading)){e({backlogLoading:!0,backlogError:null});try{let r=n.backlogItems.length,i=await C(`GET`,`/backlog?`+xo(n,r).toString());e({backlogItems:[...t().backlogItems,...i.items],backlogTotal:i.total,backlogOffset:r,backlogMaxItems:i.maxItems,backlogHasMore:i.hasMore,backlogLoading:!1})}catch(t){e({backlogLoading:!1,backlogError:t.message})}}},setBacklogPriorityFilter(n){e({backlogPriorityFilter:n}),t().fetchBacklog()},setBacklogTagFilter(n){e({backlogTagFilter:n}),t().fetchBacklog()},setBacklogSearchFilter(n){e({backlogSearchFilter:n}),t().fetchBacklog()},setBacklogProjectFilter(n){e({backlogProjectFilter:n}),t().fetchBacklog()},toggleBacklogPromoted(){let n=!t().backlogPromotedOpen;e({backlogPromotedOpen:n}),n&&!t().backlogPromotedFetched&&t().fetchBacklogPromoted()},async fetchBacklogPromoted(){e({backlogPromotedLoading:!0});try{e({backlogPromotedItems:(await C(`GET`,`/backlog?state=promoted&sort=updated&maxItems=50`)).items,backlogPromotedLoading:!1,backlogPromotedFetched:!0})}catch{e({backlogPromotedLoading:!1,backlogPromotedFetched:!0})}},async doPromoteBacklogTask(n){e({backlogPromoteLoadingId:n});try{await C(`POST`,`/tasks/`+n+`/promote`,{}),e({backlogItems:t().backlogItems.filter(e=>e.id!==n),backlogTotal:Math.max(0,t().backlogTotal-1),backlogPromoteLoadingId:null}),t().backlogPromotedFetched&&t().fetchBacklogPromoted()}catch(n){e({backlogPromoteLoadingId:null}),t().showError(`Promote Failed`,n.message,n)}}}),Co=(e,t)=>({graphNodes:[],graphEdges:[],graphTotal:0,graphMaxNodes:0,graphTruncated:!1,graphLoading:!1,graphError:null,graphProjectFilter:``,async fetchTaskGraph(){e({graphLoading:!0,graphError:null});try{let n=t(),r=new URLSearchParams;n.graphProjectFilter&&r.set(`projectId`,n.graphProjectFilter);let i=r.toString(),a=await C(`GET`,`/task-graph`+(i?`?`+i:``));e({graphNodes:a.nodes,graphEdges:a.edges,graphTotal:a.total,graphMaxNodes:a.maxNodes,graphTruncated:a.truncated,graphLoading:!1})}catch(t){e({graphLoading:!1,graphError:t.message})}},setGraphProjectFilter(n){e({graphProjectFilter:n}),t().fetchTaskGraph()}}),wo=[`implementation`,`review`,`gates`,`landing`,`main`,`deploy`,`validated`],Q=(e,t)=>({kind:`relay`,role:e,...t?{id:t}:{}}),To=(e,t)=>({kind:`owner`,role:t,...e.owner?{id:e.owner}:{}});function Eo(e,t){let n=t?.ownerAgentId??e.ownerAgentId;return n?{kind:`agent`,role:`builder`,id:n}:To(e,`builder`)}function Do(e,t){let n=t?.status,r=t?.landState??``;return e.verified?{stage:`validated`,responsible:Q(`done`)}:e.deliverableStage===`deploying`||e.deliverableStage===`deployed`?{stage:`deploy`,responsible:Q(`cd`)}:e.deliverableStage===`landed-on-main`||n===`landed`||n===`merged`?e.terminalStage===`landed-on-main`?{stage:`main`,responsible:Q(`done`)}:{stage:`main`,responsible:e.cd?Q(`cd`):To(e,`closer`)}:r.startsWith(`steward-`)||(n===`conflict`||n===`stranded`)&&t?.stewardAgentId?{stage:`landing`,responsible:Q(`steward`,t?.stewardAgentId)}:n===`merge_planned`||n===`merging`||r===`queued`||r===`merging`?{stage:`landing`,responsible:Q(`landing`)}:n===`gate_running`?{stage:`gates`,responsible:Q(`landing`)}:n===`gate_failed`?{stage:`gates`,responsible:Eo(e,t)}:(e.reviewHold?e.reviewParked||e.needsReview:n===`review_requested`||e.needsReview)?e.reviewerAgentId?{stage:`review`,responsible:{kind:`agent`,role:`reviewer`,id:e.reviewerAgentId}}:{stage:`review`,responsible:To(e,`reviewer`)}:{stage:`implementation`,responsible:Eo(e,t)}}var Oo=[`deploy`,`validated`];function ko(e,t){let n=e.some(e=>e.cd);return wo.filter(e=>n||!Oo.includes(e)||t.some(t=>t.stage===e))}function Ao(e,t){let n=t.branch?e.filter(e=>e.branch===t.branch):[];return n.length?n:t.ownerAgentId?e.filter(e=>e.signals.ownerAgentId===t.ownerAgentId):[]}var jo=[`abandoned`,`cleanup_requested`,`cleaned`];function Mo(e,t){if(e.signals.reviewerAgentId===t)return e;let n={...e.signals,reviewerAgentId:t};return{...e,signals:n,...Do(n,e.workspace)}}function No(e,t,n){return t.stage===e.stage?e.stageSince:n}function Po(e,t){let n=e.workspace;if(n&&n.id!==t.id&&n.updatedAt>t.updatedAt)return e;if(jo.includes(t.status)){if(n?.id!==t.id)return e;let{workspace:r,...i}=e,a=Do(e.signals);return{...i,...a,stageSince:No(e,a,t.updatedAt)}}let r=Do(e.signals,t);return{...e,workspace:t,...r,stageSince:No(e,r,t.updatedAt)}}var Fo=new Set([`claimed`,`in_progress`,`validating`,`blocked`]),Io=e=>typeof e==`number`?e:Date.parse(e)||Date.now();function Lo(e,t){return{...e,tasks:t,lanes:ko(e.projectLanes,t)}}function Ro(e,t){let n=new Set(Ao(e.tasks,t).map(e=>e.taskId));if(!n.size)return e;let r={id:t.id,status:t.status,...t.branch?{branch:t.branch}:{},...t.landState?{landState:t.landState}:{},...t.ownerAgentId?{ownerAgentId:t.ownerAgentId}:{},...t.stewardAgentId?{stewardAgentId:t.stewardAgentId}:{},updatedAt:t.updatedAt};return Lo(e,e.tasks.map(e=>n.has(e.taskId)?Po(e,r):e))}function zo(e,t,n){let r=e.owner??e.createdBy;return{deliverableStage:e.deliverableStage??`none`,...e.terminalStage?{terminalStage:e.terminalStage}:{},...e.ownerAgentId?{ownerAgentId:e.ownerAgentId}:{},...r?{owner:r}:{},reviewHold:e.reviewHold===!0,reviewParked:e.reviewHold===!0&&(e.pendingReviewDelivery!==void 0||n?.reviewParked===!0),needsReview:n?.needsReview??!1,verified:n?.verified??!1,...n?.reviewerAgentId?{reviewerAgentId:n.reviewerAgentId}:{},cd:t,staleOwnerGone:!1}}function Bo(e,t){if(t.kind!==`deliverable`)return e;let n=e.tasks.find(e=>e.taskId===t.id);if(!n){if(!(e.all?e.projectLanes.some(e=>e.projectId===t.projectId):t.projectId===e.projectId)||!Fo.has(t.status))return e;let n=zo(t,e.projectLanes.some(e=>e.projectId===t.projectId&&e.cd));return Lo(e,[{taskId:t.id,title:t.title,...t.projectId?{projectId:t.projectId}:{},...t.branch?{branch:t.branch}:{},...Do(n),tokens:null,stageSince:Io(t.updatedAt),signals:n},...e.tasks])}if(!Fo.has(t.status)&&t.status!==`done`)return Lo(e,e.tasks.filter(e=>e.taskId!==t.id));let r=zo(t,n.signals.cd===!0,n.signals),i=Do(r,n.workspace),a={...n,title:t.title,...t.branch?{branch:t.branch}:{},...i,stageSince:No(n,i,Io(t.updatedAt)),signals:r};return Lo(e,e.tasks.map(e=>e.taskId===t.id?a:e))}function Vo(e,t){let n=t.repository.toLowerCase(),r=e.ci.find(e=>e.repository.toLowerCase()===n&&e.branch===t.branch&&e.workflow===t.workflow);return!r||r.observedAt>t.observedAt?e:{...e,ci:e.ci.map(e=>e===r?t:e)}}function Ho(e,t,n){let r=new Map;for(let e of t){let t=Number(e.meta?.taskId);e.meta?.profile===`reviewer`&&Se(n,e)&&Number.isSafeInteger(t)&&r.set(t,e.id)}let i=!1,a=e.tasks.map(e=>{let t=r.get(e.taskId);if(e.stage!==`review`||!t)return e;let n=Mo(e,t);return i||=n!==e,n});return i?{...e,tasks:a}:e}var Uo=[`implementation`,`review`];function Wo(e,t,n){let r=[e.responsible.kind===`agent`?e.responsible.id:void 0,e.workspace?.ownerAgentId??e.signals.ownerAgentId],i=null;for(let e of r){if(!e)continue;let r=t[e];if(Se(n,r))return{id:e,agent:r,live:!0};i??={id:e,...r?{agent:r}:{},live:!1}}return i}function Go(e,t,n){let r={inFlight:0,withAgents:0,withoutAgent:0,withRelay:0,tokens:0,maxTokens:0};for(let i of e){let{kind:e,role:a}=i.responsible;if(e===`relay`&&a===`done`)continue;r.inFlight++,e===`relay`?r.withRelay++:Wo(i,t,n)?.live?r.withAgents++:r.withoutAgent++;let o=i.tokens?.total??0;r.tokens+=o,r.maxTokens=Math.max(r.maxTokens,o)}return r}var Ko=((e,t)=>(n,r)=>{async function i(){let{shippingStatsWindow:e,shippingStatsProjectId:i}=r(),a=`?window=${e}${i?`&projectId=${encodeURIComponent(i)}`:``}`;n({shippingStats:null,shippingStatsLoading:!0,shippingStatsError:null});let o=()=>{let t=r();return t.view===`shipping`&&t.shippingTab===`stats`&&t.shippingStatsWindow===e&&t.shippingStatsProjectId===i};try{let e=await t(a);o()&&n({shippingStats:e,shippingStatsLoading:!1})}catch(e){o()&&n({shippingStatsLoading:!1,shippingStatsError:e.message})}}return{shippingBoard:null,shippingLoading:!1,shippingError:null,shippingProjectId:``,shippingTab:`realtime`,shippingStats:null,shippingStatsLoading:!1,shippingStatsError:null,shippingStatsWindow:`7d`,shippingStatsProjectId:``,async openShipping(){let t=r().shippingProjectId;n({shippingLoading:!0,shippingError:null});try{let i=await e(t===`*`?`?scope=all`:t?`?projectId=${encodeURIComponent(t)}`:``);if(r().view!==`shipping`||r().shippingProjectId!==t)return;n({shippingBoard:i,shippingLoading:!1})}catch(e){r().view===`shipping`&&n({shippingLoading:!1,shippingError:e.message})}},closeShipping(){n({shippingBoard:null,shippingLoading:!1,shippingError:null,shippingTab:`realtime`,shippingStats:null,shippingStatsLoading:!1,shippingStatsError:null})},setShippingProject(e){n({shippingProjectId:e,shippingBoard:null}),r().openShipping()},setShippingTab(e){e!==r().shippingTab&&(n({shippingTab:e,shippingStats:null,shippingStatsLoading:!1,shippingStatsError:null}),e===`stats`&&i())},setShippingStatsWindow(e){n({shippingStatsWindow:e}),i()},setShippingStatsProject(e){n({shippingStatsProjectId:e}),i()},shippingEvent(e,t){let i=r().shippingBoard;if(!i)return;let a=e===`workspace.status`?Ro(i,JSON.parse(t)):e===`ci.status`?Vo(i,JSON.parse(t)):Bo(i,JSON.parse(t));a!==i&&n({shippingBoard:a})}}})(e=>C(`GET`,`/shipping/board${e}`),e=>C(`GET`,`/shipping/stats${e}`)),qo={byAgent:{},byTask:{}};function Jo(e){if(!e.length)return qo;let t={},n={};for(let r of e){let e=(e,t,n)=>({runId:r.runId,workflow:r.workflow,step:e,round:t,kind:n});for(let{steps:t,round:i}of r.rounds)for(let a of t)a.taskId!==r.taskId&&(n[a.taskId]=e(a.step,i,`step`));for(let i of r.agents)i.agentId&&(t[i.agentId]=e(i.step,i.round,`step`)),i.taskId!==r.taskId&&(n[i.taskId]=e(i.step,i.round,`step`));n[r.taskId]=e(r.step,r.round,`run`)}return{byAgent:t,byTask:n}}function Yo(e){let t=e?.meta?.workflowRunId;return typeof t==`string`&&t?t:void 0}function Xo(e){let t=e.round>1?`, round ${e.round}`:``;return e.kind===`run`?`${e.workflow} at ${e.step}${t}`:`${e.workflow}, ${e.step} step${t}`}var Zo=100,Qo=750,$o={workflowRuns:null,workflowRecent:null,workflowStats:null,workflowDefinitions:null},es=((e,t=(e,t)=>C(`POST`,e,t))=>(n,r)=>{let i,a=0,o=0;async function s(){let t=++a,{workflowProjectId:i,workflowTab:o,workflowStatsWindow:s}=r(),c=e=>i?`${e}${e.includes(`?`)?`&`:`?`}projectId=${encodeURIComponent(i)}`:e,l=()=>t===a&&r().view===`workflows`;n({workflowLoading:!0,workflowError:null});try{if(o===`stats`){let t=await e(c(`/workflows/stats?window=${s}`));l()&&n({workflowStats:t,workflowLoading:!1})}else if(o===`definitions`){let{workflows:t}=await e(c(`/workflows/definitions`));l()&&n({workflowDefinitions:t,workflowLoading:!1})}else{let t=r().workflowFocusedRun?.runId,[i,a,o]=await Promise.all([e(c(`/workflows/runs?status=running`)),e(c(`/workflows/runs?status=finished&limit=10`)),t?e(`/workflows/runs/${encodeURIComponent(t)}?verbose=true`):void 0]);l()&&n({workflowRuns:i.runs,workflowRecent:a.runs,workflowLoading:!1,...o&&r().workflowFocusedRun?.runId===t?{workflowFocusedRun:{...o,heldCount:o.heldCount??0,taskTitle:o.taskTitle??`T${o.taskId}`,agents:o.agents??[]}}:{}})}}catch(e){l()&&n({workflowLoading:!1,workflowError:e.message})}}async function c(){r().workflowTab===`catalog`?await r().loadWorkflowCatalog():await s()}return{workflowTab:`runs`,workflowFocusedRun:null,async showWorkflowRun(t){await r().switchView(`workflows`);try{let r=await e(`/workflows/runs/${encodeURIComponent(t)}?verbose=true`);n({workflowTab:`runs`,workflowFocusedRun:{...r,heldCount:r.heldCount??0,taskTitle:r.taskTitle??`T${r.taskId}`,agents:r.agents??[]}})}catch(e){n({workflowError:e.message})}},...$o,workflowStatsWindow:`7d`,workflowProjects:[],workflowProjectId:``,workflowLoading:!1,workflowError:null,workflowLiveRuns:[],workflowLiveIndex:qo,async fetchWorkflowLiveRuns(){let t=++o;try{let{runs:r}=await e(`/workflows/runs?status=running&limit=${Zo}`);t===o&&n({workflowLiveRuns:r,workflowLiveIndex:Jo(r)})}catch{}},async openWorkflows(){r().workflowProjects.length||e(`/projects`).then(e=>{r().view===`workflows`&&n({workflowProjects:e.projects??[]})}).catch(()=>{}),await c()},closeWorkflows(){a++,n({...$o,workflowTab:`runs`,workflowLoading:!1,workflowError:null}),r().clearWorkflowCatalog()},setWorkflowTab(e){e!==r().workflowTab&&(a++,n({...$o,workflowTab:e,workflowLoading:!1,workflowError:null}),r().clearWorkflowCatalog(),c())},setWorkflowStatsWindow(e){n({workflowStatsWindow:e,workflowStats:null}),s()},setWorkflowProject(e){n({...$o,workflowProjectId:e}),c()},async pauseWorkflowRun(e,i){try{await t(`/workflows/runs/${encodeURIComponent(e)}/${i===null?`unpause`:`pause`}`,i===null?{}:{reason:i}),n({workflowError:null}),r().fetchWorkflowLiveRuns(),r().view===`workflows`&&await c()}catch(e){n({workflowError:e.message})}},async updateWorkflowPins(e,n){await t(`/workflows/runs/${encodeURIComponent(e)}/resume`,{pins:n}),r().fetchWorkflowLiveRuns(),r().view===`workflows`&&await c()},workflowChanged(){i||=setTimeout(()=>{i=void 0,r().fetchWorkflowLiveRuns(),r().view===`workflows`&&r().workflowTab!==`catalog`&&s()},Qo)}}})(e=>C(`GET`,e)),ts=((e,t)=>(n,r)=>{let i=0;return{workflowCatalog:null,workflowCatalogLoading:!1,workflowCatalogError:null,async loadWorkflowCatalog(){let t=++i,a=r().workflowProjectId,o=()=>t===i&&r().view===`workflows`&&r().workflowTab===`catalog`;n({workflowCatalog:null,workflowCatalogLoading:!0,workflowCatalogError:null});try{let t=await e(a?`?projectId=${encodeURIComponent(a)}`:``);o()&&n({workflowCatalog:t,workflowCatalogLoading:!1})}catch(e){o()&&n({workflowCatalogLoading:!1,workflowCatalogError:e.message})}},clearWorkflowCatalog(){i++,n({workflowCatalog:null,workflowCatalogLoading:!1,workflowCatalogError:null})},async createWorkflowOverrideTask(e){try{return(await t(e)).id}catch(e){return r().showError(`Create Override Task Failed`,e.message,e),null}}}})(e=>C(`GET`,`/workflows/catalog${e}`),e=>C(`POST`,`/tasks`,e));function ns(e){return e.filter(e=>!Be(e.name))}var rs=(e,t)=>({orchestrators:[],providerCatalog:[],orchestratorSpawnOpen:!1,orchestratorInstallOpen:!1,spawnOrchId:``,spawnProvider:M(void 0),spawnModel:P(M(void 0)),spawnEffort:``,spawnSelfEffort:N,spawnProfile:Re,spawnReportVerbosity:``,spawnHarnessSubagents:``,spawnCwd:``,spawnLabel:``,spawnApproval:`guarded`,spawnLaunchMode:``,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,spawnCwdHistory:[],isSpawning:!1,spawnDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``},pendingForkImport:null,async fetchOrchestrators(){try{let n=O(t().orchestrators,await C(`GET`,`/orchestrators`));n!==t().orchestrators&&e({orchestrators:n})}catch{}},async fetchProviderCatalog(){try{e({providerCatalog:(await C(`GET`,`/providers`)).catalog})}catch{}},async refreshOrchestratorProviders(e){try{await C(`GET`,`/orchestrators/`+encodeURIComponent(e)+`/providers?refresh=1`),await t().fetchOrchestrators(),t().showNotification(`Provider status refreshed`)}catch(e){t().showError(`Provider Refresh Failed`,e.message,e)}},hostProvidersById:{},async fetchHostProviders(n){try{let r=await C(`GET`,`/orchestrators/`+encodeURIComponent(n)+`/host-providers`);e({hostProvidersById:{...t().hostProvidersById,[n]:r}})}catch(e){t().showError(`Host Providers Failed`,e.message,e)}},async setHostProvider(n,r,i,a){let o=t().hostProvidersById[n];o&&e({hostProvidersById:{...t().hostProvidersById,[n]:{...o,providers:o.providers.map(e=>e.provider===r?{...e,enabled:i}:e)}}});try{let o=await C(`PUT`,`/orchestrators/`+encodeURIComponent(n)+`/host-providers/`+encodeURIComponent(r),{enabled:i,...a?.trim()?{reason:a.trim()}:{},updatedBy:`dashboard`});e({hostProvidersById:{...t().hostProvidersById,[n]:o}}),t().showNotification(`${r} ${i?`enabled`:`disabled`} on ${n}`)}catch(r){o&&e({hostProvidersById:{...t().hostProvidersById,[n]:o}}),t().showError(`Host Provider Update Failed`,r.message,r)}},openAgentSpawn(){t().openOrchestratorSpawn()},closeAgentSpawn(){e({orchestratorSpawnOpen:!1})},async doSpawnAgent(){await t().submitOrchestratorSpawn()},openOrchestratorSpawn(){t().openOrchestratorSpawnAt()},openOrchestratorSpawnAt(n={}){let r=t().orchestrators.filter(e=>e.status===`online`);if(!r.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}t().fetchProviderCatalog();let i=t(),a=n.orchestratorId?r.find(e=>e.id===n.orchestratorId):void 0;if(n.orchestratorId&&!a){t().showError(`Orchestrator Offline`,`The selected orchestrator is not online.`);return}let o=n.cwd?.trim()||i.spawnCwd,s=o?r.find(e=>v(o,e.baseDir)):void 0,c=i.spawnOrchId?r.find(e=>e.id===i.spawnOrchId):void 0,l=a?.id||s?.id||c?.id||r[0].id,u=r.find(e=>e.id===l),d=i.spawnProvider&&pn(u,i.providerCatalog).includes(i.spawnProvider)?i.spawnProvider:M(u,i.providerCatalog),f=i.spawnProvider===d&&i.spawnModel&&hn(d,i.providerCatalog).some(e=>e.alias===i.spawnModel)?i.spawnModel:P(d,i.providerCatalog),p=o&&v(o,u.baseDir)?o:u.baseDir||``;e({spawnOrchId:l,spawnProvider:d,spawnModel:f,spawnEffort:i.spawnProvider===d&&i.spawnModel===f?i.spawnEffort:``,spawnProfile:i.spawnProfile||`worker`,spawnCwd:p,spawnLabel:``,spawnHarnessSubagents:``,spawnReportVerbosity:``,spawnSelfEffort:N,spawnWorkspaceMode:`inherit`,spawnLaunchMode:``,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},forkFromAgent(n,r){let i=t(),l=i.agentsById[n];if(!l){t().showError(`Fork`,`Agent not found.`);return}let u=i.orchestrators.filter(e=>e.status===`online`);if(!u.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}t().fetchProviderCatalog();let d=l.providerCapabilities,f=d?.model?.provider||(typeof l.meta?.provider==`string`?l.meta.provider:``),p=d?.model?.alias||d?.model?.id||``,m=c(f,i.providerCatalog)?.models.find(e=>e.alias===p||e.providerModel===p)?.alias||``,h=d?.model?.effort||``,g=l.meta?.workspace,_=a(g)?g:{},te=s(_.repoRoot)||s(_.sourceCwd)||(typeof l.meta?.cwd==`string`?l.meta.cwd:``),ne=s(_.mode),re=ne===`isolated`?`isolated`:ne===`shared`?`shared`:`inherit`,y=d?.session?.approvalMode||(typeof l.meta?.approvalMode==`string`?l.meta.approvalMode:`guarded`),ae=l.label?`${l.label} (fork)`:``,b=u.find(e=>e.hostname===l.machine)||u.find(e=>v(te,e.baseDir))||u[0],oe=ie(l),se=[];for(let e of r){let t=ee(e).trim();if(!t)continue;let n=o(e.from)?`user`:`agent`;se.push(`[${n}]: ${t}`)}let x=se.join(`
|
|
6
|
+
`),S=14e3,ce=`You are continuing work from a previous agent session (${oe}). Below is the conversation history. Treat it as context for your work, not as your own actions.\n\n${x.length>S?`...
|
|
7
|
+
`+x.slice(x.length-S):x}`,le=r.filter(e=>typeof e.id==`number`&&e.id>0).map(e=>e.id);e({spawnOrchId:b.id,spawnProvider:f||M(b,i.providerCatalog),spawnModel:m||P(f||M(b,i.providerCatalog),i.providerCatalog),spawnEffort:h,spawnSelfEffort:N,spawnProfile:i.spawnProfile||`worker`,spawnReportVerbosity:``,spawnCwd:te||b.baseDir||``,spawnLabel:ae,spawnApproval:y,spawnWorkspaceMode:re,spawnPrompt:`Continue from this previous session.`,spawnSystemPromptAppend:ce,spawnCount:1,pendingForkImport:{sourcePeerId:l.id,sourceAgentId:l.id,sourceThreadId:l.id,sourceAgentLabel:oe,messageIds:le},orchestratorSpawnOpen:!0})},openOrchestratorInstall(){e({orchestratorInstallOpen:!0})},openOrchestratorSpawnFor(n){let r=t(),i=r.orchestrators.find(e=>e.id===n),a=M(i,r.providerCatalog),o=P(a,r.providerCatalog),s=r.spawnProvider===a&&r.spawnModel===o?r.spawnEffort:``,c=r.spawnCwd&&v(r.spawnCwd,i?.baseDir)?r.spawnCwd:i?.baseDir||``;e({spawnOrchId:n,spawnProvider:a,spawnModel:o,spawnEffort:s,spawnProfile:r.spawnProfile||`worker`,spawnCwd:c,spawnLabel:``,spawnHarnessSubagents:``,spawnReportVerbosity:``,spawnSelfEffort:N,spawnWorkspaceMode:`inherit`,spawnPrompt:``,spawnSystemPromptAppend:``,spawnCount:1,pendingForkImport:null,orchestratorSpawnOpen:!0})},selectSpawnHistory(n,r){let i=t(),a=i.orchestrators.find(e=>e.id===n&&e.status===`online`);if(!a){t().showError(`Unavailable`,`That orchestrator is no longer online.`);return}if(n===i.spawnOrchId){e({spawnCwd:r});return}let o=i.spawnProvider&&pn(a,i.providerCatalog).includes(i.spawnProvider)?i.spawnProvider:M(a,i.providerCatalog),s=i.spawnProvider===o&&i.spawnModel&&hn(o,i.providerCatalog).some(e=>e.alias===i.spawnModel)?i.spawnModel:P(o,i.providerCatalog);e({spawnOrchId:n,spawnProvider:o,spawnModel:s,spawnEffort:i.spawnProvider===o&&i.spawnModel===s?i.spawnEffort:``,spawnCwd:r})},async submitOrchestratorSpawn(){let n=t();if(n.isSpawning)return;if(!n.spawnOrchId){t().showError(`Validation`,`Select an orchestrator.`);return}let r=n.orchestrators.find(e=>e.id===n.spawnOrchId);if(!r){t().showError(`Validation`,`Selected orchestrator is not available.`);return}let i=n.spawnCwd.trim();if(!i){t().showError(`Validation`,`Select a working directory.`);return}if(!v(i,r.baseDir)){t().showError(`Validation`,`Working directory must be under ${r.baseDir}.`);return}let a=n.pendingForkImport,o=a?1:Math.max(1,Math.min(10,Math.round(n.spawnCount)||1));e({isSpawning:!0});let s=`spawn-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,8)}`;try{for(let e=0;e<o;e++){let r={provider:n.spawnProvider,orchestratorId:n.spawnOrchId,approvalMode:n.spawnApproval,workspaceMode:n.spawnWorkspaceMode||`inherit`};n.spawnModel&&(r.model=n.spawnModel),n.spawnEffort&&(r.effort=n.spawnEffort);let s=gn(n.spawnProvider,n.spawnModel,n.spawnLaunchMode,n.providerCatalog),l=_n(s,n.spawnSelfEffort);s.length&&Object.assign(r,n.spawnSelfEffort?{selfEffort:!0,...l===`band`?{}:{selfEffortCeiling:l}}:{selfEffort:!1}),n.spawnProfile&&(r.profile=n.spawnProfile),n.spawnReportVerbosity&&(r.reportVerbosity=n.spawnReportVerbosity),n.spawnHarnessSubagents&&(r.harnessSubagents=n.spawnHarnessSubagents===`on`),n.spawnLaunchMode&&c(n.spawnProvider,n.providerCatalog)?.launchModes?.includes(n.spawnLaunchMode)&&(r.launchMode=n.spawnLaunchMode),r.cwd=i,n.spawnLabel&&(r.label=o>1?`${n.spawnLabel} ${e+1}`:n.spawnLabel),n.spawnPrompt&&(r.prompt=n.spawnPrompt),n.spawnSystemPromptAppend&&(r.systemPromptAppend=n.spawnSystemPromptAppend);let u=(await C(`POST`,`/agents/spawn`,r)).command?.params?.spawnRequestId;a&&u&&a.messageIds.length>0&&await C(`POST`,`/chat/history-imports`,{targetSpawnRequestId:u,sourcePeerId:a.sourcePeerId,sourceAgentId:a.sourceAgentId,sourceThreadId:a.sourceThreadId,sourceAgentLabel:a.sourceAgentLabel,importedBy:T(t().sessionUser),messageIds:a.messageIds})}e({orchestratorSpawnOpen:!1,pendingForkImport:null,isSpawning:!1,spawnCwdHistory:[{orchId:n.spawnOrchId,cwd:i},...n.spawnCwdHistory.filter(e=>!(e.orchId===n.spawnOrchId&&e.cwd===i))].slice(0,5)}),await Promise.all([t().fetchAgents(),t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(n){e({isSpawning:!1});let r=n.status,i=r?`HTTP ${r}`:he(n)?`network error`:`unknown error`;console.error(`[spawn] agent spawn failed (attempt ${s}, ${i}): ${n.message}`),t().showError(`Spawn Failed`,`${n.message} (attempt ${s}, ${i})`,n,{force:!0})}},orchestratorAction(e,n,r,i){let a=n===`restart`?`Restart`:`Shutdown`,o=r?`agent "${r}"`:`all agents`;t().openConfirm(`${a} Agent`,`${a} ${o} on orchestrator "${e}"?`,async()=>{try{await C(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:n,agentId:r,...i?{surface:{component:i}}:{}}),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`${a} Failed`,e.message,e)}})},upgradeOrchestrator(e,n){let r=n?` to v${n}`:` to match the relay`;t().openConfirm(`Upgrade Orchestrator`,`Upgrade "${e}"${r}? It will install the new version and restart itself.`,async()=>{try{await C(`POST`,`/orchestrators/`+encodeURIComponent(e)+`/actions`,{action:`upgrade`,...n?{targetVersion:n}:{}}),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Upgrade Failed`,e.message,e)}})},deleteOrchestrator(e){t().openConfirm(`Remove Orchestrator`,`Remove orchestrator "${e}"?`,async()=>{try{await C(`DELETE`,`/orchestrators/`+encodeURIComponent(e)),await Promise.all([t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Delete Failed`,e.message,e)}})},async browseSpawnDirectory(n){let r=t().spawnOrchId;if(!r)return;let i=t().spawnDirBrowser;e({spawnDirBrowser:{...i,loading:!0,error:``}});try{let i=n?`?path=`+encodeURIComponent(n):``,a=await C(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+i);e({spawnDirBrowser:{open:!0,loading:!1,path:a.path||``,parent:a.parent||``,baseDir:a.baseDir||``,entries:a.entries||[],error:``},spawnCwd:a.path||t().spawnCwd})}catch(n){e({spawnDirBrowser:{...t().spawnDirBrowser,loading:!1,error:n.message}})}},selectSpawnDirectory(n){e({spawnCwd:n||t().spawnDirBrowser.path,spawnDirBrowser:{...t().spawnDirBrowser,open:!1}})}}),is=(e,t)=>({managedPolicies:[],policyModal:{open:!1,editing:``,name:``,description:``,orchestratorId:``,cwd:``,enabled:void 0,provider:M(void 0),rig:``,model:P(M(void 0)),effort:``,profile:Re,providerArgs:``,launchMode:``,prompt:``,tags:``,capabilities:``,label:``,mode:`always-on`,permissionMode:`guarded`,restartOnUpdate:!0,scheduledDailyRestart:!1,keepaliveSeconds:`300`,backoffSchedule:`5,15,60,300`,backoffResetAfterSeconds:`600`,channelId:``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``},agentProfiles:[],toolGroupCatalog:[],toolGroupCatalogStatus:{loading:!1,loaded:!1,error:null},profileModal:{open:!1,mode:`create`,profile:{name:``,description:``,provider:`any`,base:`host`,instructions:{system:``,append:[],repoInstructions:`allow`,globalInstructions:`allow`},relay:{context:!0,skills:!0,plugins:!0,statusLine:!0,mcp:!0},skills:[],plugins:[],mcp:{mode:`host`},hooks:{mode:`host`},permissions:{filesystem:`host`},env:{},providerOptions:{}},relayToolsMode:`full`},async fetchManagedPolicies(){try{let n=ht(t().managedPolicies,await C(`GET`,`/spawn-policies/health`),e=>e.policy.name);n!==t().managedPolicies&&e({managedPolicies:n})}catch{}},async fetchAgentProfiles(){try{e({agentProfiles:(await C(`GET`,`/agent-profiles`)).map(e=>e.value)})}catch{}},async fetchToolGroupCatalog(){e({toolGroupCatalogStatus:{loading:!0,loaded:t().toolGroupCatalogStatus.loaded,error:null}});try{e({toolGroupCatalog:await C(`GET`,`/agent-profiles/tool-groups`),toolGroupCatalogStatus:{loading:!1,loaded:!0,error:null}})}catch(t){e({toolGroupCatalog:[],toolGroupCatalogStatus:{loading:!1,loaded:!0,error:i(t)}})}},openPolicyCreate(){let n=t().orchestrators.filter(e=>e.status===`online`);if(!n.length){t().showError(`No Orchestrators`,`No orchestrators are currently online.`);return}t().fetchProviderCatalog(),e({policyModal:{open:!0,editing:``,name:``,description:``,orchestratorId:n[0].id,cwd:``,enabled:void 0,provider:M(n[0],t().providerCatalog),rig:``,model:P(M(n[0],t().providerCatalog),t().providerCatalog),effort:``,profile:Re,providerArgs:``,launchMode:``,prompt:``,tags:``,capabilities:``,label:``,mode:`always-on`,permissionMode:`guarded`,restartOnUpdate:!0,scheduledDailyRestart:!1,keepaliveSeconds:`300`,backoffSchedule:`5,15,60,300`,backoffResetAfterSeconds:`600`,channelId:``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},openPolicyEdit(n){t().fetchProviderCatalog(),e({policyModal:{open:!0,editing:n.name,name:n.name,enabled:n.enabled,description:n.description||``,orchestratorId:n.orchestratorId,cwd:n.cwd,provider:n.provider,rig:n.rig||``,model:n.model||P(n.provider,t().providerCatalog),effort:n.effort||``,profile:n.profile||`worker`,providerArgs:(n.providerArgs||[]).join(` `),launchMode:n.launchMode||``,prompt:n.prompt||``,tags:(n.tags||[]).join(`, `),capabilities:(n.capabilities||[]).join(`, `),label:n.label||``,mode:n.mode,permissionMode:n.permissionMode,restartOnUpdate:n.restartOnUpdate,scheduledDailyRestart:n.scheduledDailyRestart,keepaliveSeconds:String(n.onDemand?.keepaliveSeconds??300),backoffSchedule:(n.backoff?.schedule||[5,15,60,300]).join(`, `),backoffResetAfterSeconds:String(n.backoff?.resetAfterSeconds??600),channelId:n.binding?.channelId||``},policyDirBrowser:{open:!1,loading:!1,path:``,parent:``,baseDir:``,entries:[],error:``}})},async submitPolicy(){let n=t().policyModal;if(!n.name.trim()){t().showError(`Validation`,`Policy name is required.`);return}if(!n.orchestratorId){t().showError(`Validation`,`Select an orchestrator.`);return}if(!n.cwd.trim()){t().showError(`Validation`,`Working directory is required.`);return}let r=e=>e.split(/[,\s]+/).map(e=>e.trim()).filter(Boolean),i={name:n.name.trim(),...n.description.trim()?{description:n.description.trim()}:{},...n.enabled===void 0?{}:{enabled:n.enabled},orchestratorId:n.orchestratorId,cwd:n.cwd.trim(),provider:n.provider,...n.rig.trim()?{rig:n.rig.trim()}:{},...n.model?{model:n.model}:{},...n.effort?{effort:n.effort}:{},...n.profile?{profile:n.profile}:{},providerArgs:n.providerArgs.trim()?n.providerArgs.trim().split(/\s+/):[],...n.launchMode?{launchMode:n.launchMode}:{},...n.prompt.trim()?{prompt:n.prompt.trim()}:{},tags:r(n.tags),capabilities:r(n.capabilities),...n.label.trim()?{label:n.label.trim()}:{},mode:n.mode,permissionMode:n.permissionMode,restartOnUpdate:n.restartOnUpdate,scheduledDailyRestart:n.scheduledDailyRestart,...n.mode===`on-demand`?{onDemand:{keepaliveSeconds:Number(n.keepaliveSeconds)||300,idleDefinition:`no-activity`}}:{},backoff:{schedule:r(n.backoffSchedule).map(Number).filter(e=>e>0),resetAfterSeconds:Number(n.backoffResetAfterSeconds)||600},...n.channelId.trim()?{binding:{type:`channel`,channelId:n.channelId.trim()}}:{}};i.backoff.schedule.length||(i.backoff.schedule=[5,15,60,300]);try{await C(`PUT`,`/spawn-policy/`+encodeURIComponent(i.name),i),e({policyModal:{...n,open:!1}}),await t().fetchManagedPolicies()}catch(e){t().showError(`Save Failed`,e.message,e)}},deletePolicy(e){t().openConfirm(`Delete Policy`,`Delete managed agent policy "${e}"? This will stop any running agent.`,async()=>{try{await C(`DELETE`,`/spawn-policy/`+encodeURIComponent(e)),await t().fetchManagedPolicies()}catch(e){t().showError(`Delete Failed`,e.message,e)}})},async browsePolicyDirectory(n){let r=t().policyModal.orchestratorId;if(!r)return;let i=t().policyDirBrowser;e({policyDirBrowser:{...i,loading:!0,error:``}});try{let i=n?`?path=`+encodeURIComponent(n):``,a=await C(`GET`,`/orchestrators/`+encodeURIComponent(r)+`/directories`+i);e({policyDirBrowser:{open:!0,loading:!1,path:a.path||``,parent:a.parent||``,baseDir:a.baseDir||``,entries:a.entries||[],error:``},policyModal:{...t().policyModal,cwd:a.path||t().policyModal.cwd}})}catch(n){e({policyDirBrowser:{...t().policyDirBrowser,loading:!1,error:n.message}})}},selectPolicyDirectory(n){e({policyModal:{...t().policyModal,cwd:n||t().policyDirBrowser.path},policyDirBrowser:{...t().policyDirBrowser,open:!1}})},openProfileModal(n,r){t().fetchToolGroupCatalog();let i={name:``,description:``,provider:`any`,base:`host`,instructions:{system:``,append:[],repoInstructions:`allow`,globalInstructions:`allow`},relay:{context:!0,skills:!0,plugins:!0,statusLine:!0,mcp:!0},skills:[],plugins:[],mcp:{mode:`host`},hooks:{mode:`host`},permissions:{filesystem:`host`},env:{},providerOptions:{},hostPinned:!1},a;r&&n===`duplicate`?(a=JSON.parse(JSON.stringify(r)),a.name=r.name+`-copy`,delete a.builtIn,delete a.promptVersions):a=r&&(n===`edit`||n===`view`)?JSON.parse(JSON.stringify(r)):i;let o=a.relay.tools?.groups===void 0?`full`:`custom`;e({profileModal:{open:!0,mode:n,profile:a,relayToolsMode:o}})},closeProfileModal(){e({profileModal:{...t().profileModal,open:!1}})},updateProfileModal(n){let r=t().profileModal.profile,i=typeof n==`function`?n(r):n;e({profileModal:{...t().profileModal,profile:{...r,...i}}})},setRelayToolsMode(n){if(e({profileModal:{...t().profileModal,relayToolsMode:n}}),n===`full`){let{profile:n}=t().profileModal;e({profileModal:{...t().profileModal,profile:{...n,relay:{...n.relay,tools:n.relay.tools?{include:n.relay.tools.include,exclude:n.relay.tools.exclude}:void 0}}}})}},async saveProfile(){let{mode:n,profile:r}=t().profileModal;if(!r.name.trim()){t().showError(`Validation`,`Profile name is required.`);return}if(n!==`view`)try{await C(`PUT`,`/agent-profiles/`+encodeURIComponent(r.name.trim()),r),e({profileModal:{...t().profileModal,open:!1}}),await t().fetchAgentProfiles(),t().showNotification(`Profile "${r.name}" saved`)}catch(e){t().showError(`Save Failed`,e.message,e)}},deleteProfile(e){let n=typeof e==`string`?t().agentProfiles.find(t=>t.name===e):e,r=typeof e==`string`?e:e.name,i=n?.builtIn===!0;t().openConfirm(i?`Reset Profile`:`Delete Profile`,i?`Reset built-in profile "${r}" to its default?`:`Delete agent profile "${r}"?`,async()=>{try{await C(`DELETE`,`/agent-profiles/`+encodeURIComponent(r)),await t().fetchAgentProfiles(),t().showNotification(i?`Profile "${r}" reset to default`:`Profile "${r}" deleted`)}catch(e){t().showError(`Delete Failed`,e.message,e)}})}}),as=(e,t)=>({operatorActivity:[],recordOperatorActivity(n){let r={id:Date.now(),kind:`operator`,title:n.title||`Activity`,body:n.body,meta:n.meta,icon:n.icon,view:n.view,peer:n.peer,messageId:n.messageId,pairId:n.pairId,taskId:n.taskId,agentId:n.agentId,ts:Date.now(),clientId:`op-`+Date.now(),createdAt:Date.now()};e({operatorActivity:[r,...t().operatorActivity.slice(0,79)]}),C(`POST`,`/activity`,{operatorId:T(t().sessionUser),clientId:r.clientId,kind:r.kind,title:r.title,body:r.body,meta:r.meta,icon:r.icon,view:r.view,peer:r.peer,messageId:r.messageId,pairId:r.pairId,taskId:r.taskId,agentId:r.agentId}).catch(()=>{})},async openActivityItem(e){if(e.view&&await t().switchView(e.view===`inbox`?`chat`:e.view),e.peer&&t().openInboxThread(e.peer),e.agentId){let n=t().agentsById[e.agentId];n&&t().openAgentDetail(n)}e.taskId&&t().openTaskDetailById(e.taskId)}});function os(e){return le(e.createdAt??e.ts)}function ss(e,t){let n=[`# Humwick Timeline`,``,`Exported: ${t}`,`Events: ${e.length}`,``];for(let t of e){let e=new Date(os(t)).toISOString();n.push(`## ${t.title||t.kind||`Event`}`),n.push(`- When: ${e}`),t.kind&&n.push(`- Kind: ${t.kind}`),t.agentId&&n.push(`- Agent: ${t.agentId}`),t.peer&&n.push(`- Peer: ${t.peer}`),t.body&&n.push(``,t.body),n.push(``)}return n.join(`
|
|
8
|
+
`)}var cs=(e,t)=>({activityEvents:[],activityFilter:``,async fetchActivityEvents(){try{e({activityEvents:z(await C(`GET`,`/activity?limit=200`),200,os)})}catch{}},exportActivity(e){let n=t(),r=[...n.operatorActivity,...n.activityEvents].sort((e,t)=>os(t)-os(e)),i=new Date().toISOString(),a=`humwick-timeline-${i.slice(0,10)}.${e===`json`?`json`:`md`}`;e===`json`?S(a,JSON.stringify({title:`Humwick Timeline`,exportedAt:i,events:r},null,2),`application/json`):S(a,ss(r,i),`text/markdown`)},exportThread(e,t){let n=`humwick-thread-${te(e.peer)}.${t===`json`?`json`:`md`}`,r={title:`Thread: `+e.peer,importedHistory:e.importedHistory||[],messages:e.messages,exportedAt:new Date().toISOString()};S(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},exportPair(e,t){let n=`humwick-pair-${te(e.id)}.${t===`json`?`json`:`md`}`,r={title:`Pair: `+e.id,pair:e,exportedAt:new Date().toISOString()};S(n,JSON.stringify(r,null,2),t===`json`?`application/json`:`text/markdown`)},async exportTask(n,r){let i=t().taskEventCache[n.id]||[];if(!i.length)try{i=await C(`GET`,`/tasks/`+n.id+`/events`),e({taskEventCache:{...t().taskEventCache,[n.id]:i}})}catch{}let a=`humwick-task-${n.id}.${r===`json`?`json`:`md`}`,o={title:`Task: `+(n.title||`T`+n.id),task:n,events:i,exportedAt:new Date().toISOString()};S(a,JSON.stringify(o,null,2),r===`json`?`application/json`:`text/markdown`)}}),ls=(e,t)=>({channels:[],connectors:[],integrations:[],automations:[],automationRuns:[],health:null,maintenanceJobs:[],maintenanceRunning:[],maintenanceRecentRuns:[],analyticsPeriod:`24h`,analyticsData:null,analyticsTab:`overview`,async fetchChannels(){try{e({channels:await C(`GET`,`/channels`)})}catch{}},async fetchConnectors(){try{e({connectors:await C(`GET`,`/connectors`)})}catch{}},async fetchIntegrations(){try{e({integrations:await C(`GET`,`/integrations`)})}catch{}},async fetchAutomations(){try{e({automations:await C(`GET`,`/automations`)})}catch{}},async fetchAutomationRuns(t){try{let n=new URLSearchParams({limit:`100`});t&&n.set(`automationId`,t),e({automationRuns:await C(`GET`,`/automation-runs?`+n.toString())})}catch{}},async fetchHealth(){try{let n=gt(t().health,await C(`GET`,`/health`));n!==t().health&&e({health:n})}catch{}},async fetchMaintenanceJobs(){try{e({maintenanceJobs:await C(`GET`,`/maintenance/jobs`)})}catch{}},async fetchMaintenanceRunning(){try{let t=await C(`GET`,`/maintenance/running`);e({maintenanceRunning:t.running,maintenanceRecentRuns:t.recent})}catch{}},async runMaintenanceJob(n){try{let r=await C(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/run`,{});return e({maintenanceJobs:r.jobs}),t().showNotification(r.run.status===`succeeded`?`Maintenance job completed`:`Maintenance job skipped`),r.run}catch(e){return t().showError(`Maintenance Job Failed`,e.message,e),await t().fetchMaintenanceJobs(),null}},async pauseMaintenanceJob(n,r){try{let i=await C(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/pause`,r);return i.jobs&&e({maintenanceJobs:i.jobs}),t().showNotification(r.indefinite?`Job paused indefinitely`:`Job paused`),i.pause??null}catch(e){return t().showError(`Pause Failed`,e.message,e),await t().fetchMaintenanceJobs(),null}},async resumeMaintenanceJob(n){try{let r=await C(`POST`,`/maintenance/jobs/`+encodeURIComponent(n)+`/resume`,{});r.jobs&&e({maintenanceJobs:r.jobs});let i=r.drift?` (held ${Math.round(r.drift.heldForMs/6e4)}m)`:``;return t().showNotification(`Job resumed`+i),!0}catch(e){return t().showError(`Resume Failed`,e.message,e),await t().fetchMaintenanceJobs(),!1}},async runHealthAction(n){if(n.preset&&(e({agentPresetFilter:n.preset}),t().setShowOffline(!0)),n.api&&n.path&&(await C(n.api,n.path),await t().refreshLiveData()),n.view&&await t().switchView(n.view),n.copy)try{await navigator.clipboard?.writeText(n.copy)}catch{}},async runConnectorAction(e,n){try{let r=await C(`POST`,`/connectors/`+encodeURIComponent(e)+`/actions`,{action:n});if(await t().fetchConnectors(),!r.ok)throw Error(r.stderr||`${n} failed`);return r}catch(e){throw t().showError(`Connector Action Failed`,e.message,e),e}},async fetchAnalytics(){try{e({analyticsData:await C(`GET`,`/stats/analytics?period=`+t().analyticsPeriod)})}catch{}},setAnalyticsTab(t){e({analyticsTab:t})},setAnalyticsPeriod(n){e({analyticsPeriod:n}),t().fetchAnalytics()}}),us=(e,t)=>({workspaces:[],workspaceFocusId:null,workspaceGitState:{},workspaceMergePreview:{},workspaceDiff:{},workspaceOrphans:[],async openWorkspaceFocus(n){e({workspaceFocusId:n}),await t().switchView(`workspaces`)},async fetchWorkspaces(){try{e({workspaces:await C(`GET`,`/workspaces`)})}catch{}},async fetchWorkspaceGitState(t){try{let n=await C(`GET`,`/workspaces/`+encodeURIComponent(t)+`/git-state`);e(e=>({workspaceGitState:{...e.workspaceGitState,[t]:n}}))}catch(n){e(e=>({workspaceGitState:{...e.workspaceGitState,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceMergePreview(t){try{let n=await C(`GET`,`/workspaces/`+encodeURIComponent(t)+`/merge-preview`);e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[t]:n}}))}catch(n){e(e=>({workspaceMergePreview:{...e.workspaceMergePreview,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceDiff(t){try{let n=await C(`GET`,`/workspaces/`+encodeURIComponent(t)+`/diff`);e(e=>({workspaceDiff:{...e.workspaceDiff,[t]:n}}))}catch(n){e(e=>({workspaceDiff:{...e.workspaceDiff,[t]:{available:!1,reason:n.message}}}))}},async fetchWorkspaceOrphans(){try{e({workspaceOrphans:(await C(`GET`,`/workspaces/orphans`)).orphans??[]})}catch{}},async reclaimWorkspaceOrphan(e){t().openConfirm(`Reclaim Orphan Worktree`,`Remove the orphaned worktree "${e.branch||e.worktreePath}" from disk? It has no live agent.`,async()=>{try{await C(`POST`,`/workspaces/orphans/reclaim`,{worktreePath:e.worktreePath,repoRoot:e.repoRoot,branch:e.branch}),t().showNotification(`Orphan reclaim dispatched`),await Promise.all([t().fetchWorkspaceOrphans(),t().fetchActivityEvents()])}catch(e){t().showError(`Reclaim Failed`,e.message,e)}})},async workspaceAction(e,n){let r=n===`hold-merge`?`Merge held`:n===`resume-merge`?`Merge resumed`:n===`ready`?`Mark ready`:n===`request-review`?`Request review`:n===`merge-plan`?`Mark merge planned`:n===`merge`?`Merge`:n===`abandon`?`Abandon`:`Cleanup`,i=async()=>{try{await C(`POST`,`/workspaces/`+encodeURIComponent(e)+`/actions`,{action:n}),t().showNotification(n===`cleanup`?`Workspace cleanup requested`:n===`merge`?`Workspace merge dispatched`:`Workspace updated: ${r}`),await Promise.all([t().fetchWorkspaces(),t().fetchOrchestrators(),t().fetchActivityEvents()])}catch(e){t().showError(`Workspace Action Failed`,e.message,e)}};if(n===`cleanup`||n===`abandon`||n===`merge`){let r=t().workspaces.find(t=>t.id===e),a=r?.branch||r?.worktreePath||e;if(n===`merge`){let n=t().workspaceMergePreview[e],r=n&&n.available!==!1?` — ${n.strategy===`pr`?`opens a PR`:`rebases & fast-forwards into ${n.baseRef||`base`}, then deletes the branch`}.`:` — lands the work and deletes the branch.`;t().openConfirm(`Merge Workspace`,`Merge workspace "${a}"?${r}`,i);return}if(n===`cleanup`){await t().fetchWorkspaceGitState(e);let n=t().workspaceGitState[e],r=``;if(n&&n.available!==!1&&!n.missing){let e=n.ahead??0,t=n.dirtyCount??0;(e>0||t>0)&&(r=` ⚠ This destroys ${[e>0?`${e} unmerged commit(s)`:``,t>0?`${t} uncommitted change(s)`:``].filter(Boolean).join(` and `)}.`)}t().openConfirm(`Cleanup Workspace`,`Remove the worktree for "${a}" on the host?${r}`,i);return}t().openConfirm(`Abandon Workspace`,`Abandon workspace "${a}"?`,i);return}await i()},async purgeWorkspace(e){let n=t().workspaces.find(t=>t.id===e),r=n?.branch||n?.worktreePath||e;t().openConfirm(`Purge Workspace Record`,`Permanently remove the record for "${r}"? This only clears the dashboard row — it does not touch disk.`,async()=>{try{await C(`DELETE`,`/workspaces/`+encodeURIComponent(e)),t().showNotification(`Workspace record purged`),await Promise.all([t().fetchWorkspaces(),t().fetchActivityEvents()])}catch(e){t().showError(`Purge Failed`,e.message,e)}})}}),ds=(e,t)=>({projectFocusId:null,projectByCwd:{},async openProjectFocus(n){e({projectFocusId:n}),await t().switchView(`projects`)},consumeProjectFocus(){t().projectFocusId!==null&&e({projectFocusId:null})},async fetchProjectForCwd(n){if(!(!n||n in t().projectByCwd))try{let t=await C(`GET`,`/projects/resolve?cwd=`+encodeURIComponent(n));e(e=>({projectByCwd:{...e.projectByCwd,[n]:t.project??null}}))}catch{}}});function fs(e){if(!e||typeof e!=`object`)return[];let t=e;return[...Object.values(t.enabled??{}),...Object.values(t.disabled??{})]}var ps=(e,t)=>({hosts:[],hostsLoading:!1,hostEditModal:{show:!1,hostId:``,label:``,tagsText:``,noLandingWorkspaces:null,maxAgentsText:``,maxLandingSlotsText:``},async setHostAdmission(e,n){try{await C(`PATCH`,`/hosts/`+encodeURIComponent(e)+`/admission`,n),await t().fetchHosts()}catch(e){t().showError(`Failed to Update Host Admission`,e.message,e)}},async setHostGateBudget(e,n){try{return await C(`PATCH`,`/hosts/`+encodeURIComponent(e)+`/gate-budget`,n),await t().fetchHosts(),!0}catch(e){return t().showError(`Failed to Update Gate Budget`,e.message,e),!1}},async fetchHosts(){e({hostsLoading:!0});try{e({hosts:fs(await C(`GET`,`/hosts?mode=verbose`))})}catch(e){t().showError(`Failed to Load Fleet`,e.message,e)}finally{e({hostsLoading:!1})}},openHostEdit(t){e({hostEditModal:{show:!0,hostId:t.id,label:t.label,tagsText:t.tags.join(`, `),noLandingWorkspaces:t.policy?.noLandingWorkspaces??null,maxAgentsText:t.policy?.maxAgents?.toString()??``,maxLandingSlotsText:t.policy?.maxLandingSlots?.toString()??``}})},closeHostEdit(){e({hostEditModal:{show:!1,hostId:``,label:``,tagsText:``,noLandingWorkspaces:null,maxAgentsText:``,maxLandingSlotsText:``}})},async doSaveHostEdit(){let e=t().hostEditModal,n=t().hosts.find(t=>t.id===e.hostId);if(!n)return;let r=e.label.trim(),i=[...new Set(e.tagsText.split(`,`).map(e=>e.trim()).filter(Boolean))],a=e.maxAgentsText.trim(),o=a===``?null:Number(a);if(o!==null&&!(Number.isInteger(o)&&o>=1)){t().showError(`Invalid Agent Cap`,`Max live agents must be a whole number of at least 1, or empty for the default.`);return}let s=e.maxLandingSlotsText.trim(),c=s===``?null:Number(s);if(c!==null&&!(Number.isInteger(c)&&c>=1&&c<=1e3)){t().showError(`Invalid Landing Slots`,`Landing slots must be a whole number from 1 to 1000, or empty for the default.`);return}try{r&&r!==n.label&&await C(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/label`,{label:r}),JSON.stringify(i)!==JSON.stringify(n.tags)&&await C(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/tags`,{tags:i}),e.noLandingWorkspaces!==(n.policy?.noLandingWorkspaces??null)&&await C(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/landing-placement`,{noLandingWorkspaces:e.noLandingWorkspaces}),o!==(n.policy?.maxAgents??null)&&await C(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/agent-cap`,{maxAgents:o}),c!==(n.policy?.maxLandingSlots??null)&&await C(`PATCH`,`/hosts/`+encodeURIComponent(n.id)+`/landing-cap`,{maxLandingSlots:c}),t().closeHostEdit(),await t().fetchHosts()}catch(e){t().showError(`Failed to Update Host`,e.message,e)}},async acceptHostHardware(e){try{await C(`POST`,`/hosts/`+encodeURIComponent(e)+`/accept-hardware`),await t().fetchHosts()}catch(e){t().showError(`Failed to Accept Host Hardware`,e.message,e)}}});function ms(){return $.persist.hasHydrated()?Promise.resolve():new Promise(e=>{let t=$.persist.onFinishHydration(()=>{t(),e()})})}var $=Oe()(je((...e)=>({...Vi({waitForHydration:ms})(...e),...Hi(...e),...Dt(...e),...Qa(...e),...fo(...e),...po(...e),..._o(...e),...yo(...e),...So(...e),...Co(...e),...Ko(...e),...es(...e),...ts(...e),...rs(...e),...is(...e),...Wr(...e),...as(...e),...cs(...e),...$r(...e),...ls(...e),...us(...e),...ds(...e),...ps(...e),...Gn(...e),...Jn(...e),...Tr(...e),...xi(...e),...Ci()}),{name:`humwick-dashboard`,storage:Le(()=>localStorage),merge:(e,t)=>{let n={...e};return delete n.sessionRefreshToken,{...t,...n}},partialize:e=>({theme:e.theme,view:e.view===`shipping`||e.view===`workflows`?`overview`:e.view,showOffline:e.showOffline,showBuiltIns:e.showBuiltIns,autoRefresh:e.autoRefresh,lowBandwidth:e.lowBandwidth,voiceTtsEnabled:e.voiceTtsEnabled,voiceTtsLang:e.voiceTtsLang,voiceTtsMode:e.voiceTtsMode,voiceTtsKokoroVoice:e.voiceTtsKokoroVoice,voiceTtsBrowserVoice:e.voiceTtsBrowserVoice,voiceInputMode:e.voiceInputMode,agentSort:e.agentSort,agentSortDir:e.agentSortDir,agentPresetFilter:e.agentPresetFilter,agentStatusFilter:e.agentStatusFilter,agentTagFilter:e.agentTagFilter,agentHostFilter:e.agentHostFilter,pairStatusFilter:e.pairStatusFilter,inboxSort:e.inboxSort,inboxSortDir:e.inboxSortDir,inboxShowArchived:e.inboxShowArchived,chatAgentProviderFilter:e.chatAgentProviderFilter,chatAgentStatusFilter:e.chatAgentStatusFilter,chatAgentTagFilter:e.chatAgentTagFilter,chatAgentCapFilter:e.chatAgentCapFilter,chatAgentHostFilter:e.chatAgentHostFilter,chatAgentSort:e.chatAgentSort,chatAgentSortDir:e.chatAgentSortDir,chatAgentGroupBy:e.chatAgentGroupBy,chatAgentFiltersCollapsed:e.chatAgentFiltersCollapsed,chatCollapsedChildren:e.chatCollapsedChildren,chatExpandedItems:e.chatExpandedItems,feedObserveAll:e.feedObserveAll,coordinatorFollows:e.coordinatorFollows,coordinatorMutes:e.coordinatorMutes,planCollapsed:e.planCollapsed,planSelections:e.planSelections,sessionTasksCollapsed:e.sessionTasksCollapsed,activityFilter:e.activityFilter,analyticsPeriod:e.analyticsPeriod,authToken:e.authToken,sessionUser:e.sessionUser,inboxDrafts:e.inboxDrafts,operatorActivity:e.operatorActivity,notifications:e.notifications,notificationUnread:e.notificationUnread,notificationSettings:e.notificationSettings,spawnOrchId:e.spawnOrchId,spawnProvider:e.spawnProvider,spawnModel:e.spawnModel,spawnEffort:e.spawnEffort,spawnProfile:e.spawnProfile,spawnCwd:e.spawnCwd,spawnApproval:e.spawnApproval,spawnWorkspaceMode:e.spawnWorkspaceMode,spawnCwdHistory:e.spawnCwdHistory})}));$.subscribe(ti);var hs=()=>()=>{};function gs(e,t){return(0,w.useSyncExternalStore)(e?$.subscribe:hs,()=>t($.getState()))}export{Yn as $,ci as A,Jt as At,Cr as B,Ie as Bt,$i as C,Qt as Ct,Ai as D,qt as Dt,Ei as E,Bt as Et,Nr as F,Ge as Ft,br as G,xr as H,Er as I,Ue as It,dr as J,pr as K,jr as L,Re as Lt,Or as M,tt as Mt,Mr as N,T as Nt,Ni as O,Wt as Ot,Ar as P,We as Pt,cr as Q,Dr as R,Ve as Rt,ta as S,j as St,Yi as T,Zt as Tt,vr as U,ur as V,Oe as Vt,yr as W,Sr as X,hr as Y,mr as Z,G as _,_n as _t,Xo as a,ir as at,ea as b,rn as bt,Go as c,Mn as ct,$a as d,P as dt,tr as et,Z as f,M as ft,Sa as g,gn as gt,ua as h,vn as ht,Yo as i,ar as it,Pr as j,A as jt,ji as k,Gt as kt,Ho as l,N as lt,fa as m,mn as mt,gs as n,rr as nt,Uo as o,An as ot,lo as p,bn as pt,fr as q,ns as r,nr as rt,Wo as s,Vn as st,$ as t,$n as tt,mo as u,hn as ut,aa as v,pn as vt,ia as w,Xt as wt,Qi as x,nn as xt,ra as y,fn as yt,kr as z,He as zt};
|
|
9
|
+
//# sourceMappingURL=store-BgDALGIX.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{p as t,u as n}from"./dist-DeW2Y1R5.js";import{t as r,wt as i}from"./store-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{p as t,u as n}from"./dist-DeW2Y1R5.js";import{t as r,wt as i}from"./store-BgDALGIX.js";import{M as a}from"./provider-display-bWwiuedV.js";import{et as o,v as s}from"./display-BemJG1f_.js";import{o as c,t as l}from"./tasks-BIyeAaPC.js";import{t as u}from"./api-CIIVBtAV.js";import{t as d}from"./scroll-area-CIN4KQse.js";import{n as f}from"./TraceView-B99Uu2yT.js";import{t as p}from"./clipboard-list-W2YeUsxT.js";import{t as m}from"./external-link-BRfu-fHG.js";import{t as h}from"./folder-git-2-CJOmTT06.js";import{t as g}from"./git-branch-yxhV0m8E.js";import{t as _}from"./plus-D5Ek4e2S.js";import{t as v}from"./button-Do6Z3vvn.js";import{t as y}from"./badge-DqJRtj_p.js";import{t as b}from"./input-CsTB6jIx.js";import{o as x,r as S,t as C}from"./card-C4QJ4hCW.js";var w=e(t(),1),T=n(),E=`version: 1
|
|
2
2
|
key: my-feature
|
|
3
3
|
revision: r1
|
|
4
4
|
title: My feature
|
|
@@ -8,4 +8,4 @@ acceptance:
|
|
|
8
8
|
tasks:
|
|
9
9
|
- {key: a, title: Build feature, intent: Implement the feature}
|
|
10
10
|
`;function D(){let[e,t]=(0,w.useState)(E),[n,i]=(0,w.useState)(`yaml`),[o,s]=(0,w.useState)(0),[c,l]=(0,w.useState)(()=>crypto.randomUUID()),[d,f]=(0,w.useState)(null),[p,m]=(0,w.useState)(``),[h,g]=(0,w.useState)(!1),_=r(e=>e.fetchDeliverableTasks),y=r(e=>e.openTaskDetail);function b(){f(null),m(``),l(crypto.randomUUID())}async function x(t){g(!0),m(``);try{let r=await u(`POST`,`/plans/import`,{document:e,format:n,expectedVersion:o,requestKey:c,dryRun:t});f(r),r.applied&&(s(r.version),await _())}catch(e){m(a(e))}finally{g(!1)}}async function S(e){try{y(await u(`GET`,`/tasks/${e}`))}catch(e){m(a(e))}}return(0,T.jsxs)(`section`,{"aria-label":`Import plan`,className:`rounded-lg border p-4 space-y-3`,children:[(0,T.jsx)(`h3`,{className:`font-medium`,children:`Import plan`}),(0,T.jsx)(`p`,{className:`text-sm text-muted-foreground`,children:`Preview a version 1 plan, then import its Tasks. Reuse source keys and change revision for updates. Start the plan separately.`}),(0,T.jsxs)(`div`,{className:`flex flex-wrap gap-3`,children:[(0,T.jsxs)(`label`,{children:[`Format `,(0,T.jsxs)(`select`,{"aria-label":`Plan format`,value:n,onChange:e=>{i(e.target.value),b()},children:[(0,T.jsx)(`option`,{value:`yaml`,children:`YAML`}),(0,T.jsx)(`option`,{value:`json`,children:`JSON`})]})]}),(0,T.jsxs)(`label`,{children:[`Expected version `,(0,T.jsx)(`input`,{className:`w-20 rounded border bg-background px-2`,"aria-label":`Expected version`,type:`number`,min:0,value:o,onChange:e=>{s(Number(e.target.value)),b()}})]}),(0,T.jsx)(`span`,{className:`text-sm text-muted-foreground`,children:`Use 0 for a new plan.`})]}),(0,T.jsx)(`textarea`,{"aria-label":`Plan document`,className:`w-full min-h-56 rounded border bg-background p-3 font-mono text-sm`,value:e,onChange:e=>{t(e.target.value),b()}}),(0,T.jsxs)(`div`,{className:`flex gap-2`,children:[(0,T.jsx)(v,{disabled:h,onClick:()=>void x(!0),children:`Preview import`}),(0,T.jsx)(v,{disabled:h||!d?.dryRun||d.conflicts.length>0,onClick:()=>void x(!1),children:`Import Tasks`})]}),p&&(0,T.jsx)(`p`,{role:`alert`,className:`text-sm text-destructive`,children:p}),d&&(0,T.jsxs)(`div`,{"aria-label":`Import result`,className:`space-y-2 text-sm`,children:[(0,T.jsxs)(`p`,{children:[d.applied?`Imported`:`Preview`,` · version `,d.version,` · source `,d.sourceRevision]}),d.conflicts.map((e,t)=>(0,T.jsxs)(`p`,{role:`alert`,children:[e.key,`.`,e.field,`: `,e.reason]},t)),d.version!==o&&!d.applied&&(0,T.jsxs)(v,{size:`sm`,variant:`outline`,onClick:()=>{s(d.version),b()},children:[`Use version `,d.version]}),d.changes.length>0&&(0,T.jsxs)(`p`,{children:[`Plan changes: `,d.changes.join(`, `)]}),(0,T.jsx)(`ul`,{children:d.tasks.map(e=>(0,T.jsxs)(`li`,{children:[e.taskId?(0,T.jsxs)(`button`,{className:`underline`,onClick:()=>void S(e.taskId),children:[`T`,e.taskId,` · `,e.key]}):e.key,` · `,e.changes.join(`, `)||`unchanged`,` · `,e.execution?.workflow??`no recipe`]},e.key))}),d.omitted.length>0&&(0,T.jsxs)(`p`,{children:[`Retained omitted Tasks: `,d.omitted.join(`, `)]})]})]})}var O={open:`bg-tone-info/10 text-tone-info-fg border-tone-info/20`,validating:`bg-tone-teal/10 text-tone-teal-fg border-tone-teal/20`,in_progress:`bg-tone-purple/10 text-tone-purple-fg border-tone-purple/20`,blocked:`bg-tone-yellow/10 text-tone-yellow-fg border-tone-yellow/20`,done:`bg-tone-success/10 text-tone-success-fg border-tone-success/20`,failed:`bg-tone-danger/10 text-tone-danger-fg border-tone-danger/20`,canceled:`bg-tone-neutral/10 text-tone-neutral-fg border-tone-neutral/20`,claimed:`bg-tone-success/10 text-tone-success-fg border-tone-success/20`},k={none:`bg-tone-neutral/10 text-tone-neutral-fg`,uncommitted:`bg-tone-yellow/10 text-tone-yellow-fg`,"committed-on-branch":`bg-tone-info/10 text-tone-info-fg`,"landed-on-main":`bg-tone-success/10 text-tone-success-fg`,deploying:`bg-tone-purple/10 text-tone-purple-fg`,deployed:`bg-tone-teal/10 text-tone-teal-fg`},A={none:`None`,uncommitted:`Uncommitted`,"committed-on-branch":`On Branch`,"landed-on-main":`Landed`,deploying:`Deploying`,deployed:`Deployed`},j=[`open`,`in_progress`,`validating`,`owner-gone`,`blocked`,`done`,`failed`,`canceled`],M={low:`bg-tone-neutral/10 text-tone-neutral-fg`,medium:`bg-tone-info/10 text-tone-info-fg`,high:`bg-tone-orange/10 text-tone-orange-fg`,urgent:`bg-tone-danger/10 text-tone-danger-fg`};function N(){let e=i(),t=r(e=>e.deliverableTasks),n=r(e=>e.deliverableStatusFilter),a=r(e=>e.deliverableStageFilter),o=r(e=>e.deliverableProjectFilter),s=r(e=>e.deliverableTagFilter),f=r(e=>e.deliverablePriorityFilter),m=r(e=>e.set),h=r(e=>e.fetchDeliverableTasks),g=r(e=>e.openTaskDetail),x=r(e=>e.openTaskCreate),[S,C]=(0,w.useState)(!1),[E,O]=(0,w.useState)([]),[k,M]=(0,w.useState)(s);(0,w.useEffect)(()=>{let e=!1;return u(`GET`,`/projects`).then(t=>{e||O(t.projects??[])}).catch(()=>{e||O([])}),()=>{e=!0}},[]);let N=(0,w.useMemo)(()=>new Map(E.map(e=>[e.id,e])),[E]),F=(0,w.useMemo)(()=>{let e=E.map(e=>({value:e.id,label:e.title||e.slug||e.issueRepo||e.id}));for(let n of t)n.projectId&&!e.some(e=>e.value===n.projectId)&&e.push({value:n.projectId,label:n.repo||n.projectId});return e.sort((e,t)=>e.label.localeCompare(t.label))},[t,E]);function I(e){m({deliverableStatusFilter:e}),h()}function L(e){m({deliverableStageFilter:e}),h()}function R(e){m({deliverableProjectFilter:e}),h()}function z(e){m({deliverablePriorityFilter:e}),h()}function B(){let e=k.trim();M(e),e!==s&&(m({deliverableTagFilter:e}),h())}return(0,T.jsxs)(`div`,{className:`space-y-4`,children:[(0,T.jsxs)(`div`,{className:`flex items-center justify-between flex-wrap gap-2`,children:[(0,T.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,T.jsx)(p,{className:`w-5 h-5 text-muted-foreground`}),(0,T.jsx)(`h2`,{className:`text-lg font-semibold`,children:`Tasks`}),(0,T.jsx)(y,{variant:`secondary`,children:t.length})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-2 flex-wrap`,children:[(0,T.jsx)(v,{size:`sm`,variant:`outline`,onClick:()=>C(!S),children:`Import plan`}),(0,T.jsxs)(v,{size:`sm`,className:`h-8 gap-1.5`,onClick:x,children:[(0,T.jsx)(_,{className:`w-3.5 h-3.5`}),`New Task`]}),(0,T.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:n,onChange:e=>I(e.target.value),children:[(0,T.jsx)(`option`,{value:``,children:`All statuses`}),j.map(e=>(0,T.jsx)(`option`,{value:e,children:e===`validating`?`Needs validation`:e===`owner-gone`?`Owner gone · inactive 7 days`:e},e))]}),(0,T.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:a,onChange:e=>L(e.target.value),children:[(0,T.jsx)(`option`,{value:``,children:`All stages`}),l.map(e=>(0,T.jsx)(`option`,{value:e,children:A[e]??e},e))]}),(0,T.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:o,onChange:e=>R(e.target.value),children:[(0,T.jsx)(`option`,{value:``,children:`All projects`}),F.map(e=>(0,T.jsx)(`option`,{value:e.value,children:e.label},e.value))]}),(0,T.jsxs)(`select`,{className:`rounded-md border border-input bg-background px-3 py-1.5 text-sm`,value:f,onChange:e=>z(e.target.value),children:[(0,T.jsx)(`option`,{value:``,children:`All priorities`}),c.map(e=>(0,T.jsx)(`option`,{value:e,children:e},e))]}),(0,T.jsx)(b,{className:`h-8 w-36 text-sm`,placeholder:`Filter by tag…`,value:k,onChange:e=>M(e.target.value),onBlur:B,onKeyDown:e=>{e.key===`Enter`&&B()}})]})]}),S&&(0,T.jsx)(D,{}),(0,T.jsx)(d,{className:`h-[calc(100dvh-11rem)]`,children:(0,T.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2 lg:grid-cols-3 pr-2`,children:[t.length===0&&(0,T.jsx)(`div`,{className:`col-span-full text-center text-muted-foreground py-16 text-sm`,children:`No deliverable tasks`}),t.map(t=>(0,T.jsx)(P,{task:t,now:e,project:t.projectId?N.get(t.projectId):void 0,onOpen:()=>g(t)},t.id))]})})]})}function P({task:e,now:t,project:n,onOpen:r}){let i=O[e.status]??`bg-tone-neutral/10 text-tone-neutral-fg border-tone-neutral/20`,a=e.deliverableStage?k[e.deliverableStage]??`bg-tone-neutral/10 text-tone-neutral-fg`:``,c=e.label||e.title,l=n?.title||n?.slug||e.repo||e.projectId;return(0,T.jsxs)(C,{className:`flex flex-col cursor-pointer hover:border-tone-neutral transition-colors min-w-0`,onClick:r,children:[(0,T.jsxs)(x,{className:`py-3 px-4 pb-0 space-y-0`,children:[(0,T.jsxs)(`div`,{className:`flex items-start gap-2 justify-between`,children:[(0,T.jsxs)(`div`,{className:`flex gap-1.5 flex-wrap`,children:[(0,T.jsx)(y,{variant:`outline`,className:`text-xs px-1.5 py-0 border ${i}`,children:e.status}),e.deliverableStage&&e.deliverableStage!==`none`&&(0,T.jsx)(y,{variant:`secondary`,className:`text-xs px-1.5 py-0 ${a}`,children:A[e.deliverableStage]??e.deliverableStage}),e.priority&&(0,T.jsx)(y,{variant:`secondary`,className:`text-xs px-1.5 py-0 ${M[e.priority]??`bg-tone-neutral/10 text-tone-neutral-fg`}`,children:e.priority})]}),(0,T.jsxs)(`span`,{className:`text-xs text-muted-foreground shrink-0`,children:[`T`,e.id]})]}),(0,T.jsx)(`p`,{className:`font-medium text-sm mt-2 line-clamp-2`,children:c}),e.staleOwnerGone&&(0,T.jsx)(`p`,{className:`text-xs text-tone-warning-fg`,children:`Owner gone · inactive 7 days`}),e.validationItems?.filter(e=>e.status!==`met`).map(e=>(0,T.jsxs)(`p`,{className:`text-xs text-muted-foreground`,children:[e.status,`: `,e.criterion]},e.id)),e.tags&&e.tags.length>0&&(0,T.jsx)(`div`,{className:`flex gap-1 flex-wrap mt-1.5`,children:e.tags.map(e=>(0,T.jsx)(y,{variant:`outline`,className:`text-[10px] px-1.5 py-0 font-normal`,children:e},e))})]}),(0,T.jsxs)(S,{className:`px-4 py-3 flex-1 flex flex-col justify-between gap-2`,children:[(0,T.jsxs)(`div`,{className:`space-y-0.5 text-xs text-muted-foreground`,children:[l&&(0,T.jsxs)(`div`,{className:`flex items-center gap-1 min-w-0`,children:[(0,T.jsx)(h,{className:`w-3 h-3 shrink-0`}),(0,T.jsx)(`span`,{className:`truncate min-w-0`,children:l})]}),e.ownerAgentId&&(0,T.jsxs)(`div`,{className:`flex items-center gap-1 min-w-0`,children:[(0,T.jsx)(`span`,{className:`text-muted-foreground/60 shrink-0`,children:`owner`}),(0,T.jsx)(f,{agentId:e.ownerAgentId,fallbackLabel:e.ownerAgentLabel,noIcon:!0,className:`text-xs min-w-0`})]}),e.branch&&(0,T.jsxs)(`div`,{className:`flex items-center gap-1 min-w-0`,children:[(0,T.jsx)(g,{className:`w-3 h-3 shrink-0`}),(0,T.jsx)(`span`,{className:`font-mono truncate min-w-0`,children:e.branch})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-1`,title:s(e.updatedAt),children:[(0,T.jsx)(`span`,{className:`text-muted-foreground/60`,children:`updated`}),(0,T.jsx)(`span`,{children:o(t,e.updatedAt)})]})]}),(0,T.jsxs)(`div`,{className:`flex items-center gap-1.5`,children:[(0,T.jsx)(v,{size:`sm`,variant:`outline`,className:`h-7 text-xs`,onClick:e=>{e.stopPropagation(),r()},children:`Details`}),e.externalUrl&&(0,T.jsx)(`a`,{href:e.externalUrl,target:`_blank`,rel:`noopener noreferrer`,className:`ml-auto`,onClick:e=>e.stopPropagation(),children:(0,T.jsx)(v,{size:`sm`,variant:`ghost`,className:`h-7 px-2`,children:(0,T.jsx)(m,{className:`w-3.5 h-3.5`})})})]})]})]})}export{N as TasksView};
|
|
11
|
-
//# sourceMappingURL=tasks-
|
|
11
|
+
//# sourceMappingURL=tasks-DO0WpJCx.js.map
|