@spencerboucher/switchyard 0.9.0 → 0.10.0
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/README.md +2 -2
- package/dist/switchyard.mjs +7073 -5396
- package/dist/terminal/holder.js +30 -4
- package/package.json +1 -1
- package/web-dist/assets/AutomationView-BsTwLnMp.js +2 -0
- package/web-dist/assets/{AutomationView-D7Syv1En.js.map → AutomationView-BsTwLnMp.js.map} +1 -1
- package/web-dist/assets/Card-CAFxHoHd.js +2 -0
- package/web-dist/assets/Card-CAFxHoHd.js.map +1 -0
- package/web-dist/assets/Checkbox-rDvnQnxc.js +2 -0
- package/web-dist/assets/Checkbox-rDvnQnxc.js.map +1 -0
- package/web-dist/assets/Copy-D8xhl7eJ.js +2 -0
- package/web-dist/assets/{Copy-B6XSAIUd.js.map → Copy-D8xhl7eJ.js.map} +1 -1
- package/web-dist/assets/DangerZone-og55TRug.js +2 -0
- package/web-dist/assets/DangerZone-og55TRug.js.map +1 -0
- package/web-dist/assets/{Field-D-Ty7fKT.js → Field-Dbg_8KTt.js} +2 -2
- package/web-dist/assets/{Field-D-Ty7fKT.js.map → Field-Dbg_8KTt.js.map} +1 -1
- package/web-dist/assets/{InteractionCard-DF1EcSpm.js → InteractionCard-Yu5wgLC3.js} +4 -4
- package/web-dist/assets/{InteractionCard-DF1EcSpm.js.map → InteractionCard-Yu5wgLC3.js.map} +1 -1
- package/web-dist/assets/Menu-euseM8yR.js +2 -0
- package/web-dist/assets/Menu-euseM8yR.js.map +1 -0
- package/web-dist/assets/Overlay-BNPvMjLX.js +2 -0
- package/web-dist/assets/{Overlay-DUQwh6_b.js.map → Overlay-BNPvMjLX.js.map} +1 -1
- package/web-dist/assets/Priority-Ca1B2yFr.js +2 -0
- package/web-dist/assets/{Priority-CHmzfoHg.js.map → Priority-Ca1B2yFr.js.map} +1 -1
- package/web-dist/assets/{SegmentedControl-C_hEVQMB.js → SegmentedControl-D2d-NEr-.js} +2 -2
- package/web-dist/assets/{SegmentedControl-C_hEVQMB.js.map → SegmentedControl-D2d-NEr-.js.map} +1 -1
- package/web-dist/assets/{Select-Cfql4Nwu.js → Select-C9L1HKMm.js} +2 -2
- package/web-dist/assets/{Select-Cfql4Nwu.js.map → Select-C9L1HKMm.js.map} +1 -1
- package/web-dist/assets/StatusChip-BYuVxYS7.js +2 -0
- package/web-dist/assets/StatusChip-BYuVxYS7.js.map +1 -0
- package/web-dist/assets/{Switch-DBfzmqkm.js → Switch-DAcUcSbH.js} +2 -2
- package/web-dist/assets/{Switch-DBfzmqkm.js.map → Switch-DAcUcSbH.js.map} +1 -1
- package/web-dist/assets/{Tabs-BNuL3_Et.js → Tabs-xtagjtA5.js} +2 -2
- package/web-dist/assets/{Tabs-BNuL3_Et.js.map → Tabs-xtagjtA5.js.map} +1 -1
- package/web-dist/assets/{TextArea-CKybrQyn.js → TextArea-CKGHwURx.js} +2 -2
- package/web-dist/assets/{TextArea-CKybrQyn.js.map → TextArea-CKGHwURx.js.map} +1 -1
- package/web-dist/assets/{TextLink-OzzyP2-p.js → TextLink-Bub7sMxr.js} +2 -2
- package/web-dist/assets/{TextLink-OzzyP2-p.js.map → TextLink-Bub7sMxr.js.map} +1 -1
- package/web-dist/assets/attention-CI4dHY81.js +2 -0
- package/web-dist/assets/{attention-V86Gye3I.js.map → attention-CI4dHY81.js.map} +1 -1
- package/web-dist/assets/auth-308hUVgi.js +2 -0
- package/web-dist/assets/auth-308hUVgi.js.map +1 -0
- package/web-dist/assets/automations-BzpsJoa3.js +2 -0
- package/web-dist/assets/{automations-Cw5Gacgm.js.map → automations-BzpsJoa3.js.map} +1 -1
- package/web-dist/assets/bell-DSwa2PAb.js +2 -0
- package/web-dist/assets/bell-DSwa2PAb.js.map +1 -0
- package/web-dist/assets/board-CeJxBVHC.js +10 -0
- package/web-dist/assets/board-CeJxBVHC.js.map +1 -0
- package/web-dist/assets/code-DkNQvMI9.js +12 -0
- package/web-dist/assets/code-DkNQvMI9.js.map +1 -0
- package/web-dist/assets/describe-CVXeUClF.js +5 -0
- package/web-dist/assets/{describe-D6KLGKWa.js.map → describe-CVXeUClF.js.map} +1 -1
- package/web-dist/assets/enroll-jnKygG4L.js +2 -0
- package/web-dist/assets/{enroll-DwT7AcuS.js.map → enroll-jnKygG4L.js.map} +1 -1
- package/web-dist/assets/index-BHGZTS2e.js +16 -0
- package/web-dist/assets/index-BHGZTS2e.js.map +1 -0
- package/web-dist/assets/index-D2ml031z.css +2 -0
- package/web-dist/assets/{more-DQR5uu1c.js → more-DvKHMdBk.js} +2 -2
- package/web-dist/assets/{more-DQR5uu1c.js.map → more-DvKHMdBk.js.map} +1 -1
- package/web-dist/assets/queue-B2Vl0uSh.js +2 -0
- package/web-dist/assets/{queue-DUg1rS8t.js.map → queue-B2Vl0uSh.js.map} +1 -1
- package/web-dist/assets/repo-BDS8RBxq.js +2 -0
- package/web-dist/assets/repo-BDS8RBxq.js.map +1 -0
- package/web-dist/assets/settings-CLt7x9u8.js +8 -0
- package/web-dist/assets/settings-CLt7x9u8.js.map +1 -0
- package/web-dist/assets/states-C773NlHo.js +56 -0
- package/web-dist/assets/states-C773NlHo.js.map +1 -0
- package/web-dist/assets/{terminal-login-S5CAd5xA.js → terminal-login-BK5UjUir.js} +2 -2
- package/web-dist/assets/{terminal-login-S5CAd5xA.js.map → terminal-login-BK5UjUir.js.map} +1 -1
- package/web-dist/assets/useBreakpoint-BphHBrzF.js +2 -0
- package/web-dist/assets/useBreakpoint-BphHBrzF.js.map +1 -0
- package/web-dist/assets/useNow-Cm-tdyod.js +2 -0
- package/web-dist/assets/{useNow-Dj7oEiwn.js.map → useNow-Cm-tdyod.js.map} +1 -1
- package/web-dist/assets/{useResource-CDGSq2At.js → useResource-BBqCoY2q.js} +2 -2
- package/web-dist/assets/{useResource-CDGSq2At.js.map → useResource-BBqCoY2q.js.map} +1 -1
- package/web-dist/index.html +7 -3
- package/web-dist/sw.js +1 -1
- package/web-dist/sw.js.map +1 -1
- package/web-dist/assets/AutomationView-D7Syv1En.js +0 -2
- package/web-dist/assets/Checkbox-D6tRfEeI.js +0 -2
- package/web-dist/assets/Checkbox-D6tRfEeI.js.map +0 -1
- package/web-dist/assets/Copy-B6XSAIUd.js +0 -2
- package/web-dist/assets/DangerZone-DfYlxDC1.js +0 -2
- package/web-dist/assets/DangerZone-DfYlxDC1.js.map +0 -1
- package/web-dist/assets/Menu-BfOszNC4.js +0 -2
- package/web-dist/assets/Menu-BfOszNC4.js.map +0 -1
- package/web-dist/assets/Overlay-DUQwh6_b.js +0 -2
- package/web-dist/assets/Priority-CHmzfoHg.js +0 -2
- package/web-dist/assets/attention-V86Gye3I.js +0 -2
- package/web-dist/assets/automations-Cw5Gacgm.js +0 -2
- package/web-dist/assets/board-B8X7TYYR.js +0 -10
- package/web-dist/assets/board-B8X7TYYR.js.map +0 -1
- package/web-dist/assets/code-BKroYJmR.js +0 -12
- package/web-dist/assets/code-BKroYJmR.js.map +0 -1
- package/web-dist/assets/describe-D6KLGKWa.js +0 -5
- package/web-dist/assets/enroll-DwT7AcuS.js +0 -2
- package/web-dist/assets/index-B3F7WcYf.css +0 -2
- package/web-dist/assets/index-hxvDvCS7.js +0 -12
- package/web-dist/assets/index-hxvDvCS7.js.map +0 -1
- package/web-dist/assets/queue-DUg1rS8t.js +0 -2
- package/web-dist/assets/repo-XzzzEI0d.js +0 -2
- package/web-dist/assets/repo-XzzzEI0d.js.map +0 -1
- package/web-dist/assets/search-C6cn5WOo.js +0 -2
- package/web-dist/assets/search-C6cn5WOo.js.map +0 -1
- package/web-dist/assets/settings-DyUu0tJM.js +0 -8
- package/web-dist/assets/settings-DyUu0tJM.js.map +0 -1
- package/web-dist/assets/states-ZhrxQa3K.js +0 -56
- package/web-dist/assets/states-ZhrxQa3K.js.map +0 -1
- package/web-dist/assets/useNow-Dj7oEiwn.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,f as t,i as n,m as r,n as i,p as a,t as o,u as s}from"./jsx-runtime-D13aM9HY.js";import{A as c,P as l,_ as u,_t as ee,bt as d,c as f,d as p,gt as m,h,ht as te,i as ne,it as g,n as _,nt as re,r as v,s as ie,t as y,u as b,v as x,vt as ae,yt as oe,z as S}from"./states-ZhrxQa3K.js";import{a as se,i as ce,n as le,t as C}from"./Field-D-Ty7fKT.js";import{t as w}from"./calendar-clock-B8zE4JsX.js";import{n as T,r as E}from"./Copy-B6XSAIUd.js";import{n as D,r as O,t as ue}from"./Priority-CHmzfoHg.js";import{t as de}from"./key-round-VDbE9E4X.js";import{t as fe}from"./play-CjoDg3ws.js";import{i as pe,n as me,r as he}from"./useBackTo-BIrCq3W2.js";import{n as k,r as ge,t as _e}from"./DangerZone-DfYlxDC1.js";import{J as ve,M as ye,T as be,V as xe,X as A,Y as Se,b as j,j as Ce,m as we,z as M}from"./index-hxvDvCS7.js";import{o as Te,t as Ee}from"./Overlay-DUQwh6_b.js";import{n as N,r as P}from"./TextArea-CKybrQyn.js";import{t as F}from"./TextLink-OzzyP2-p.js";import{t as I}from"./SegmentedControl-C_hEVQMB.js";import{t as L}from"./Select-Cfql4Nwu.js";import{t as R}from"./Switch-DBfzmqkm.js";import{E as z,O as De,S as Oe,T as B,a as V,b as ke,d as Ae,f as H,g as je,h as U,i as W,l as G,m as Me,n as Ne,o as Pe,p as K,r as Fe,s as Ie,t as Le,u as Re,v as ze,w as q,x as Be,y as Ve}from"./describe-D6KLGKWa.js";var J={name:`scroll-text`,size:24,node:[[`path`,{d:`M15 12h-5`,key:`r7krc0`}],[`path`,{d:`M15 8h-5`,key:`1khuty`}],[`path`,{d:`M19 17V5a2 2 0 0 0-2-2H4`,key:`zz82l3`}],[`path`,{d:`M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3`,key:`1ph1d7`}]]};J.node;var He=i(J),Y=e(r(),1),X=o(),Ue=e=>`/tasks/${encodeURIComponent(e)}`;function Z(e){return d(e)&&(e.status===404||e.status===405||e.status===501)}function We({summary:e,errorCount:t}){return(0,X.jsxs)(k,{stack:!0,title:`Summary`,testId:`automation-summary`,children:[(0,X.jsx)(`p`,{className:`text-sm break-words`,children:e}),t>0&&(0,X.jsxs)(`p`,{className:`flex items-center gap-1.5 text-sm text-danger`,children:[(0,X.jsx)(x,{"aria-hidden":!0,className:`size-4 shrink-0`}),t===1?`1 field needs attention`:`${t} fields need attention`]})]})}async function Q(e,t,n){return e&&!n?m(q(e,`/preview`)):ae(`/api/automations/preview`,t)}function Ge({automationId:e,dirty:t,getInput:n,currentKey:r}){let[i,a]=(0,Y.useState)({status:`idle`}),o=async()=>{let r=n();if(!r)j.error(`Fix the highlighted fields to preview the task`);else{a({status:`loading`});try{let n=await Q(e,r,t);a({status:`done`,preview:n,key:JSON.stringify(r)})}catch(e){a(Z(e)?{status:`unsupported`}:{status:`error`,error:e})}}};return(0,X.jsxs)(k,{stack:!0,title:`Preview`,description:`See the task an occurrence would create, and when it would run next.`,testId:`automation-preview`,children:[(0,X.jsx)(`div`,{children:(0,X.jsx)(p,{icon:(0,X.jsx)(xe,{className:`size-4`}),busy:i.status===`loading`,onClick:()=>void o(),children:`Preview resulting task`})}),i.status===`unsupported`&&(0,X.jsx)(b,{capability:`Task preview`,reason:`This coordinator does not offer automation previews.`,fallback:`Read the summary above, or save and use Run now to see a real task.`}),i.status===`error`&&(0,X.jsx)(_,{compact:!0,title:`Could not preview`,error:i.error,onRetry:()=>void o()}),i.status===`done`&&(0,X.jsx)(Ke,{preview:i.preview,stale:i.key!==r})]})}function Ke({preview:e,stale:t}){let{task:n}=e;return(0,X.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-3`,children:[t&&(0,X.jsxs)(`p`,{className:`flex items-center gap-1.5 text-xs text-warning`,role:`status`,children:[(0,X.jsx)(x,{"aria-hidden":!0,className:`size-3.5 shrink-0`}),`The form changed since this preview. Preview again to refresh it.`]}),(0,X.jsx)(`p`,{className:`text-sm break-words text-muted`,children:e.summary}),(0,X.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2 rounded-md border border-border bg-surface-2 p-3`,children:[(0,X.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-2`,children:[(0,X.jsx)(`h3`,{className:`min-w-0 font-medium break-words`,children:n.title}),(0,X.jsx)(D,{priority:n.priority,muted:!0,className:`shrink-0 text-xs`})]}),n.objective?(0,X.jsx)(`p`,{className:`text-sm break-words whitespace-pre-wrap`,children:n.objective}):(0,X.jsx)(`p`,{className:`text-sm text-muted`,children:`No objective.`}),n.acceptanceCriteria.length>0&&(0,X.jsxs)(`div`,{children:[(0,X.jsxs)(`h4`,{className:`flex items-center gap-1 text-xs font-medium text-muted`,children:[(0,X.jsx)(M,{"aria-hidden":!0,className:`size-3.5`}),`Acceptance criteria`]}),(0,X.jsx)(`ul`,{className:`mt-1 list-disc pl-5 text-sm`,children:n.acceptanceCriteria.map((e,t)=>(0,X.jsx)(`li`,{className:`break-words`,children:e},t))})]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`h3`,{className:`text-sm font-medium`,children:`Next occurrences`}),e.next.length===0?(0,X.jsx)(`p`,{className:`text-sm text-muted`,children:`No scheduled times: this trigger fires on demand, on a webhook, or when a task is done.`}):(0,X.jsx)(`ol`,{className:`mt-1 flex flex-col gap-0.5 text-sm`,children:e.next.slice(0,5).map(e=>(0,X.jsxs)(`li`,{className:`flex flex-wrap gap-x-2`,children:[(0,X.jsx)(`time`,{dateTime:e,children:K(e)}),(0,X.jsx)(`span`,{className:`text-muted`,children:h(e)})]},e))})]})]})}function qe({label:e,value:t,mono:n=!0}){return(0,X.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-1`,children:[(0,X.jsx)(`span`,{className:`text-xs font-medium text-muted`,children:e}),(0,X.jsxs)(`div`,{className:`flex min-w-0 items-start gap-2`,children:[(0,X.jsx)(`code`,{className:`min-w-0 flex-1 rounded border border-border bg-surface px-2 py-1.5 text-xs break-all select-all ${n?`font-mono`:``}`,children:t}),(0,X.jsx)(p,{size:`sm`,icon:(0,X.jsx)(E,{className:`size-3.5`}),onClick:()=>void T(t,`${e} copied`),"aria-label":`Copy ${e.toLowerCase()}`,children:`Copy`})]})]})}function Je({automation:e}){let[t,n]=(0,Y.useState)(!1),[r,i]=(0,Y.useState)(!1),[a,o]=(0,Y.useState)(null),[s,c]=(0,Y.useState)(!1),l=e.webhookTokenSet||a!==null,u=async()=>{i(!1),n(!0);try{let t=await ae(q(e.id,`/webhook-token`)),n=re.safeParse(t);if(!n.success)throw Error(`The coordinator returned an unexpected token response`);let r=new URL(n.data.url,window.location.origin).toString();o({token:n.data.token,url:r}),j.success(l?`Webhook token rotated`:`Webhook token created`)}catch(e){Z(e)?c(!0):j.error(`Could not issue a webhook token: ${oe(e)}`)}finally{n(!1)}};return(0,X.jsxs)(k,{stack:!0,title:`Webhook`,description:`POST JSON to the URL with the token as a Bearer header. Filters decide which payloads fire.`,testId:`webhook-token`,children:[(0,X.jsx)(`p`,{className:`flex items-center gap-1.5 text-sm`,children:l?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(A,{"aria-hidden":!0,className:`size-4 shrink-0 text-success`}),`A token is set`]}):(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(Se,{"aria-hidden":!0,className:`size-4 shrink-0 text-muted`}),`No token yet: webhook calls are rejected until you create one`]})}),s?(0,X.jsx)(b,{capability:`Webhook tokens`,reason:`This coordinator does not issue webhook tokens.`}):(0,X.jsx)(`div`,{children:(0,X.jsx)(p,{icon:(0,X.jsx)(de,{className:`size-4`}),busy:t,onClick:()=>l?i(!0):void u(),children:l?`Rotate token`:`Create token`})}),a&&(0,X.jsxs)(`div`,{role:`alert`,className:`flex min-w-0 flex-col gap-3 rounded-md border border-warning bg-warning-soft p-3`,children:[(0,X.jsxs)(`p`,{className:`flex items-center gap-1.5 text-sm font-medium`,children:[(0,X.jsx)(x,{"aria-hidden":!0,className:`size-4 shrink-0 text-warning`}),`This token is shown once. Copy it now.`]}),(0,X.jsx)(qe,{label:`Token`,value:a.token}),(0,X.jsx)(qe,{label:`URL`,value:a.url}),(0,X.jsx)(qe,{label:`Example`,value:Pe(a.token,a.url)}),(0,X.jsx)(`div`,{children:(0,X.jsx)(p,{size:`sm`,onClick:()=>o(null),children:`I have copied it`})})]}),(0,X.jsx)(Ee,{open:r,onClose:()=>i(!1),title:`Rotate webhook token?`,description:`The current token stops working immediately. Update every sender with the new token.`,confirmLabel:`Rotate token`,busy:t,onConfirm:()=>void u()})]})}var Ye=[];function Xe({automationId:e,refreshKey:t,onRun:n}){let r=S(t=>t.occurrences[e]??Ye),i=S(e=>e.tasks),[a,o]=(0,Y.useState)({status:`loading`}),s=(0,Y.useCallback)(async t=>{o(e=>e.status===`done`?e:{status:`loading`});try{let n=await m(q(e,`/history`),{},t);o({status:`done`,items:ze(n)})}catch(e){if(t?.aborted)return;o(Z(e)?{status:`unsupported`}:{status:`error`,error:e})}},[e]);(0,Y.useEffect)(()=>{let e=new AbortController;return s(e.signal),()=>e.abort()},[s,t]);let c=je(a.status===`done`?a.items:[],r);return(0,X.jsxs)(k,{stack:!0,title:`History`,description:`Occurrences of this automation. Routine successes are hidden from the board and appear only here.`,testId:`automation-history`,children:[a.status===`unsupported`&&(0,X.jsx)(b,{capability:`Automation history`,reason:`This coordinator does not serve stored history; only occurrences seen live in this session are shown.`}),a.status===`error`&&(0,X.jsx)(_,{compact:!0,title:`Could not load history`,error:a.error,onRetry:()=>void s()}),a.status===`loading`&&c.length===0?(0,X.jsx)(f,{label:`Loading history…`,className:`py-4`}):c.length===0&&a.status!==`error`?(0,X.jsx)(y,{className:`py-4`,icon:(0,X.jsx)(He,{className:`size-6`}),title:`No occurrences yet`,description:`Occurrences appear here when the trigger fires or you run it.`,action:{label:`Run now`,onClick:n,icon:(0,X.jsx)(fe,{className:`size-4`})}}):(0,X.jsx)(`ol`,{className:`flex flex-col divide-y divide-border`,children:c.map(e=>{let t=Ve(e),n=e.taskId?i[e.taskId]:void 0,r=[e.reason,e.outcome].filter(Boolean).join(` · `);return(0,X.jsxs)(`li`,{className:`flex min-w-0 flex-col gap-1 py-2 first:pt-0 last:pb-0`,children:[(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center gap-x-2 gap-y-1`,children:[(0,X.jsx)(be,{kind:`occurrence`,value:e.state,size:`sm`}),(0,X.jsx)(`time`,{dateTime:t,className:`text-sm`,children:K(t)}),(0,X.jsx)(`span`,{className:`text-xs text-muted`,children:h(t)})]}),r&&(0,X.jsx)(`p`,{className:`text-sm break-words text-muted`,children:r}),e.taskId&&(0,X.jsxs)(F,{to:Ue(e.taskId),variant:`action`,size:`sm`,className:`self-start`,children:[(0,X.jsx)(`span`,{className:`min-w-0 truncate`,children:n?`Task: ${n.title}`:`Open task`}),n?.hiddenFromBoard&&(0,X.jsx)(`span`,{className:`shrink-0 text-xs text-muted`,children:`(hidden from board)`})]})]},e.id)})})]})}var Ze=`/automations`,Qe=e=>`/automations/${encodeURIComponent(e)}`,$e=`sy:automation-draft`;function et(){let{automationId:e=`new`}=a();return(0,X.jsx)(tt,{automationId:e},e)}function tt({automationId:e}){let t=e===`new`,n=S(e=>e.hydrated),r=z(t?void 0:e),[i,a]=(0,Y.useState)({status:`idle`}),o=(0,Y.useCallback)(async()=>{a({status:`loading`});try{let t=await m(q(e)),n=g.safeParse(t);if(!n.success){a({status:`fatal`,error:Error(`The coordinator returned this automation in an unexpected format.`)});return}B.getState().put(n.data),a({status:`idle`})}catch(e){d(e)&&e.status===404?a({status:`notfound`}):a({status:`error`,error:e})}},[e]),s=!t&&!r;return(0,Y.useEffect)(()=>{s&&i.status===`idle`&&o()},[s,i.status,o]),t?(0,X.jsx)(at,{automation:null}):r?(0,X.jsx)(at,{automation:r}):i.status===`notfound`?(0,X.jsx)(y,{icon:(0,X.jsx)(ye,{className:`size-8`}),title:`Automation not found`,description:`It may have been deleted, or the link is wrong.`,action:{label:`Back to automations`,to:Ze}}):i.status===`error`?(0,X.jsx)(_,{title:`Could not load this automation`,error:i.error,onRetry:()=>void o()}):i.status===`fatal`?(0,X.jsx)(v,{error:i.error}):(0,X.jsx)(f,{label:n?`Loading automation…`:`Loading…`})}function nt(e){let t=Ae({projectId:e,timezone:U()});try{let e=sessionStorage.getItem($e);if(!e)return t;let n=JSON.parse(e);return!n||typeof n!=`object`?t:{...t,...n,filters:Array.isArray(n.filters)?n.filters:[]}}catch{return t}}function rt(e){try{e?sessionStorage.setItem($e,JSON.stringify(e)):sessionStorage.removeItem($e)}catch{}}var $=e=>JSON.stringify(Re(e));function it(e){if(!d(e))return{};let t=e.details,n=Array.isArray(t)?t:t&&typeof t==`object`&&Array.isArray(t.issues)?t.issues:[],r={};for(let e of n){if(!e||typeof e!=`object`)continue;let{path:t,message:n}=e;if(!Array.isArray(t)||typeof n!=`string`)continue;let i=H(t);i!==`form`&&!r[i]&&(r[i]=n)}return r}function at({automation:e}){let r=t(),i=s(),a=he(Ze),o=we(),d=o===`desktop`,f=l(),m=c(),h=S(e=>e.hosts),g=S(e=>e.profiles),_=S(e=>e.tasks),re=S(e=>e.projects),v=e===null,y=(0,Y.useId)(),b=(0,Y.useRef)(null),[C,w]=(0,Y.useState)(()=>e?G(e):nt(f[0]?.id)),[T,E]=(0,Y.useState)(()=>$(C)),[D,O]=(0,Y.useState)(!1),[ue,de]=(0,Y.useState)({}),[pe,k]=(0,Y.useState)(!1),[ye,be]=(0,Y.useState)(!1),[xe,A]=(0,Y.useState)(!1),[Se,M]=(0,Y.useState)(!1),[Te,N]=(0,Y.useState)(0),P=(0,Y.useRef)(e?.updatedAt),F=$(C),I=F!==T;(0,Y.useEffect)(()=>{if(!e||e.updatedAt===P.current)return;P.current=e.updatedAt;let t=G(e),n=$(t);F===T?(w(t),M(!1)):n!==F&&M(!0),E(n)},[e,F,T]),(0,Y.useEffect)(()=>{v&&rt(C)},[v,C]),(0,Y.useEffect)(()=>{v&&!C.projectId&&f[0]&&w(e=>e.projectId?e:{...e,projectId:f[0].id})},[v,C.projectId,f]);let L=(0,Y.useCallback)((e,t)=>{w(n=>({...n,[e]:t})),de(e=>Object.keys(e).length?{}:e)},[]),R=(0,Y.useMemo)(()=>Oe(C),[C]),z={...ue,...D?R.errors:{}},V=e=>z[e],H=re[C.projectId],je=C.hostId||H?.defaultHostId||null,W=je?h[je]:void 0,Me=C.profileId||H?.defaultProfileId||null,Ne=(0,Y.useCallback)(e=>_[e]?.title,[_]),Pe=(0,Y.useMemo)(()=>ke(Re(C),{projectName:H?.name,hostName:C.hostId?h[C.hostId]?.name??null:null,profileName:C.profileId?g[C.profileId]?.name??null:null,taskTitle:Ne}),[C,H?.name,h,g,Ne]),K=()=>{requestAnimationFrame(()=>{b.current?.querySelector(`[aria-invalid="true"]`)?.focus()})},Fe=()=>(O(!0),R.input||K(),R.input),Ie=async()=>{let t=Fe();if(!t)j.error(`Fix the highlighted fields before saving`);else{k(!0);try{if(v){let e=await ae(`/api/automations`,t);if(!e||typeof e!=`object`||!e.id)throw Error(`The coordinator did not return the new automation`);B.getState().put(e),rt(null),j.success(`Created ${e.name}`),r(Qe(e.id),{replace:!0,state:i.state});return}let n=await ee(q(e.id),t);if(n&&typeof n==`object`&&n.id){B.getState().put(n),P.current=n.updatedAt;let e=G(n);w(e),E($(e))}else E(F);M(!1),O(!1),j.success(`Saved ${t.name}`)}catch(e){let t=it(e);de(t),Object.keys(t).length&&K(),j.error(`Could not save: ${oe(e)}. Your changes are kept.`)}finally{k(!1)}}},Le=async()=>{if(e){be(!0);try{await te(q(e.id)),A(!1),j.success(`Deleted ${e.name}`),a(),B.getState().remove(e.id)}catch(e){j.error(`Could not delete: ${oe(e)}`)}finally{be(!1)}}},{busy:ze,run:Be}=De(()=>N(e=>e+1)),Ve=e?!!ze[e.id]:!1,J=()=>e&&void Be(e),He=()=>{let e=Ae({projectId:f[0]?.id,timezone:U()});w(e),O(!1),rt(null)},Ue=v?`New automation`:e.name,Z=(0,X.jsxs)(X.Fragment,{children:[!v&&(0,X.jsx)(p,{icon:(0,X.jsx)(fe,{className:`size-4`}),busy:Ve,onClick:J,title:I?`Runs the saved version`:void 0,children:`Run now`}),v&&I&&(0,X.jsx)(p,{variant:`ghost`,icon:(0,X.jsx)(Ce,{className:`size-4`}),onClick:He,children:`Discard draft`})]}),Q=e=>(0,X.jsx)(p,{type:`submit`,form:y,variant:`primary`,busy:pe,block:e,icon:(0,X.jsx)(ge,{className:`size-4`}),children:v?`Create automation`:`Save`}),Ke=(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(We,{summary:Pe,errorCount:D?Object.keys(R.errors).length:0}),(0,X.jsx)(Ge,{automationId:e?.id??null,dirty:I,getInput:Fe,currentKey:JSON.stringify(R.input)}),e&&e.trigger.kind===`webhook`&&(0,X.jsx)(Je,{automation:e}),e&&(0,X.jsx)(Xe,{automationId:e.id,refreshKey:Te,onRun:J})]});return(0,X.jsxs)(`div`,{"data-testid":`automation-editor`,className:`flex w-full min-w-0 flex-col gap-4 px-4 pt-4 md:px-6`,children:[(0,X.jsxs)(`header`,{className:`flex min-w-0 flex-col gap-2`,children:[(0,X.jsxs)(n,{to:Ze,onClick:me(a),className:`tap inline-flex items-center gap-1 self-start rounded text-sm text-muted hover:text-text`,children:[(0,X.jsx)(se,{"aria-hidden":!0,className:`size-4`}),`Automations`]}),(0,X.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center justify-between gap-2`,children:[(0,X.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,X.jsx)(`h1`,{className:`min-w-0 text-lg font-semibold break-words`,children:Ue}),I&&(0,X.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-xs text-muted`,children:[(0,X.jsx)(ve,{"aria-hidden":!0,className:`size-3.5`}),`Unsaved changes`]})]}),(0,X.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[Z,d&&Q()]})]})]}),(0,X.jsx)(ie,{subject:`automations`,consequence:`Changes are sent once the coordinator is reachable again.`}),W&&W.connectivity!==`connected`&&(0,X.jsx)(ne,{compact:!0,hostName:W.name,connectivity:W.connectivity,lastSeenAt:W.lastSeenAt,detail:`Occurrences are still recorded; their tasks wait until the host is reachable.`}),Se&&(0,X.jsxs)(`p`,{role:`status`,className:`flex items-start gap-1.5 rounded-md border border-border bg-warning-soft px-3 py-2 text-sm`,children:[(0,X.jsx)(x,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-warning`}),`This automation changed elsewhere. Saving overwrites those changes with yours.`]}),(0,X.jsxs)(`div`,{className:u(`grid min-w-0 gap-4`,d?`grid-cols-[minmax(0,1fr)_minmax(320px,400px)] items-start`:`grid-cols-1`),children:[(0,X.jsxs)(`form`,{id:y,ref:b,noValidate:!0,"aria-label":Ue,onSubmit:e=>{e.preventDefault(),Ie()},className:`flex min-w-0 flex-col gap-4`,children:[(0,X.jsx)(ot,{draft:C,update:L,err:V,projects:f}),(0,X.jsx)(lt,{draft:C,update:L,err:V,tasks:_,projectsById:re,savedAutomation:e,segmented:o!==`mobile`}),(0,X.jsx)(ut,{draft:C,setDraft:w,err:V}),(0,X.jsx)(dt,{draft:C,update:L,err:V}),(0,X.jsx)(pt,{draft:C,update:L,err:V,hosts:m,profiles:Object.values(g).sort((e,t)=>e.name.localeCompare(t.name)),defaultHostName:H?.defaultHostId?h[H.defaultHostId]?.name:void 0,defaultProfileName:H?.defaultProfileId?g[H.defaultProfileId]?.name:void 0,selectedProfileMissing:!!Me&&!g[Me]}),(0,X.jsx)(mt,{draft:C,update:L}),(0,X.jsx)(ht,{draft:C,update:L,err:V}),(0,X.jsx)(gt,{draft:C,update:L,err:V,projectChecks:H?.checks}),z.form&&(0,X.jsx)(le,{children:z.form})]}),(0,X.jsx)(`aside`,{"aria-label":`Summary, preview and history`,className:`flex min-w-0 flex-col gap-4`,children:Ke})]}),!v&&e&&(0,X.jsx)(_e,{description:`Future occurrences stop. Tasks it already created stay on the board; its history is removed.`,children:(0,X.jsx)(p,{variant:`danger`,icon:(0,X.jsx)(ce,{className:`size-4`}),onClick:()=>A(!0),children:`Delete automation`})}),d?(0,X.jsx)(`div`,{className:`h-4`}):(0,X.jsxs)(`div`,{className:`sticky bottom-0 z-10 -mx-4 flex items-center gap-3 border-t border-border bg-surface px-4 py-2 md:-mx-6 md:px-6`,children:[(0,X.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-sm text-muted`,children:I?`Unsaved changes`:v?`Not saved yet`:`All changes saved`}),Q()]}),(0,X.jsx)(Ee,{open:xe,onClose:()=>A(!1),title:`Delete ${e?.name??`automation`}?`,description:`Future occurrences stop. Tasks it already created stay on the board; its history is removed.`,confirmLabel:`Delete automation`,confirmIcon:(0,X.jsx)(ce,{className:`size-4`}),busy:ye,onConfirm:()=>void Le()})]})}function ot({draft:e,update:t,err:n,projects:r}){return(0,X.jsxs)(k,{stack:!0,title:`Basics`,children:[(0,X.jsx)(C,{label:`Name`,error:n(`name`),children:n=>(0,X.jsx)(P,{...n,value:e.name,onChange:e=>t(`name`,e.target.value),placeholder:`Daily dependency check`,autoComplete:`off`})}),(0,X.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,X.jsx)(C,{label:`Project`,error:n(`projectId`),hint:r.length===0?(0,X.jsxs)(X.Fragment,{children:[`No projects yet.`,` `,(0,X.jsx)(F,{to:`/settings/projects`,children:`Add a project in Settings`}),`.`]}):void 0,children:n=>(0,X.jsxs)(L,{...n,value:e.projectId,onChange:e=>t(`projectId`,e.target.value),children:[(0,X.jsx)(`option`,{value:``,children:`Choose a project`}),r.map(e=>(0,X.jsx)(`option`,{value:e.id,children:e.name},e.id))]})}),(0,X.jsx)(C,{label:`Status`,hint:`Disabled automations keep their history and can still run manually.`,children:n=>(0,X.jsx)(R,{...n,checked:e.enabled,onChange:e=>t(`enabled`,e),label:`Enabled`,onText:`Enabled`,offText:`Disabled`,className:`self-start`})})]})]})}var st=[`manual`,`once`,`cron`,`webhook`,`dependency`],ct={manual:`Runs only when you press Run now (or from the CLI).`,once:`Runs a single time at the chosen moment.`,cron:`Runs on a timezone-aware cron schedule.`,webhook:`Runs when an authenticated JSON POST arrives at this automation's webhook URL.`,dependency:`Runs when the chosen task is done.`};function lt({draft:e,update:t,err:n,tasks:r,projectsById:i,savedAutomation:a,segmented:o}){let s=S(e=>e.hydrated),c=e.triggerKind===`cron`?Be(e.cronExpr):null,l=e.triggerKind===`cron`&&!c?Ie(e.cronExpr,e.cronTimezone.trim()||void 0)??`Valid expression (no plain-language description available)`:null,u=(0,Y.useMemo)(()=>{try{return Intl.supportedValuesOf?.(`timeZone`)}catch{return}},[]),ee=(0,Y.useId)(),d=U(),f=(0,Y.useMemo)(()=>Object.values(r).filter(t=>t.state!==`canceled`||t.id===e.dependencyTaskId).sort((e,t)=>e.title.localeCompare(t.title)),[r,e.dependencyTaskId]),p=e.triggerKind===`once`?Me(e.onceAt):``;return(0,X.jsxs)(k,{stack:!0,title:`Trigger`,description:ct[e.triggerKind],children:[o?(0,X.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-1`,children:[(0,X.jsx)(`span`,{"aria-hidden":!0,className:`text-sm font-medium`,children:`Trigger kind`}),(0,X.jsx)(`div`,{className:`overflow-x-auto`,children:(0,X.jsx)(I,{label:`Trigger kind`,value:e.triggerKind,onChange:e=>t(`triggerKind`,e),options:st.map(e=>({value:e,label:V[e]}))})})]}):(0,X.jsx)(C,{label:`Trigger kind`,children:n=>(0,X.jsx)(L,{...n,value:e.triggerKind,onChange:e=>t(`triggerKind`,e.target.value),children:st.map(e=>(0,X.jsx)(`option`,{value:e,children:V[e]},e))})}),e.triggerKind===`once`&&(0,X.jsx)(C,{label:`Run at`,error:n(`onceAt`),hint:`Local time (${d})${p?`; saved as ${p}`:``}.`,children:n=>(0,X.jsx)(P,{...n,type:`datetime-local`,value:e.onceAt,onChange:e=>t(`onceAt`,e.target.value)})}),e.triggerKind===`cron`&&(0,X.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,X.jsx)(C,{label:`Cron expression`,error:n(`cronExpr`)??c??void 0,hint:`minute hour day-of-month month day-of-week, e.g. 0 9 * * 1-5`,children:n=>(0,X.jsx)(P,{...n,"aria-invalid":c?!0:n[`aria-invalid`],value:e.cronExpr,onChange:e=>t(`cronExpr`,e.target.value),className:`font-mono`,autoComplete:`off`,spellCheck:!1,autoCapitalize:`off`})}),(0,X.jsx)(C,{label:`Timezone`,error:n(`cronTimezone`),hint:e.cronTimezone.trim()===d?`IANA timezone name; daylight saving is handled.`:(0,X.jsxs)(F,{onClick:()=>t(`cronTimezone`,d),children:[`Use this device's timezone (`,d,`)`]}),children:n=>(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(P,{...n,list:u?ee:void 0,value:e.cronTimezone,onChange:e=>t(`cronTimezone`,e.target.value),autoComplete:`off`,spellCheck:!1,autoCapitalize:`off`}),u&&(0,X.jsx)(`datalist`,{id:ee,children:u.map(e=>(0,X.jsx)(`option`,{value:e},e))})]})}),l&&(0,X.jsxs)(`p`,{className:`flex items-start gap-1.5 text-sm sm:col-span-2`,"aria-live":`polite`,"data-testid":`cron-description`,children:[(0,X.jsx)(w,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-muted`}),(0,X.jsx)(`span`,{className:`min-w-0 break-words`,children:l})]})]}),e.triggerKind===`webhook`&&(0,X.jsxs)(`div`,{className:`flex flex-col gap-1 text-sm text-muted`,children:[(0,X.jsxs)(`p`,{children:[`Senders POST a JSON body (up to 256 KB) with`,` `,(0,X.jsx)(`code`,{children:`Authorization: Bearer <token>`}),`. Use the filters below to fire only for matching payloads, and `,(0,X.jsx)(`code`,{children:`{{payload.<path>}}`}),` to copy payload values into the task.`]}),a?a.trigger.kind===`webhook`?(0,X.jsxs)(`p`,{children:[`Token:`,` `,a.webhookTokenSet?`set (see Webhook below to rotate)`:`not created yet`]}):(0,X.jsx)(`p`,{children:`Save to switch this automation to a webhook trigger, then create a token.`}):(0,X.jsx)(`p`,{children:`Save the automation to create its webhook token and URL.`})]}),e.triggerKind===`dependency`&&(0,X.jsx)(C,{label:`When this task is done`,error:n(`dependencyTaskId`),hint:`Fires once each time the task enters Done.`,children:n=>(0,X.jsxs)(L,{...n,value:e.dependencyTaskId,onChange:e=>t(`dependencyTaskId`,e.target.value),children:[(0,X.jsx)(`option`,{value:``,children:`Choose a task`}),e.dependencyTaskId&&!r[e.dependencyTaskId]&&(0,X.jsx)(`option`,{value:e.dependencyTaskId,children:s?`Deleted task`:`Loading task…`}),f.map(e=>(0,X.jsxs)(`option`,{value:e.id,children:[e.title,i[e.projectId]?` (${i[e.projectId].name})`:``,e.state===`done`?` - done`:``]},e.id))]})})]})}function ut({draft:e,setDraft:t,err:n}){let r=(e,n)=>t(t=>({...t,filters:t.filters.map((t,r)=>r===e?{...t,...n}:t)})),i=e.triggerKind===`webhook`;return(0,X.jsxs)(k,{stack:!0,title:`Filters`,description:`Filters apply to webhook payloads. Each row compares a dot path (for example pull_request.base.ref) with an exact value; all rows must match. Payloads that do not match are recorded as Filtered out.`,children:[!i&&(0,X.jsx)(`p`,{className:`text-sm text-muted`,children:`Filters are ignored unless the trigger is Webhook.`}),e.filters.length===0&&(0,X.jsx)(`p`,{className:`text-sm text-muted`,children:`No filters: every payload fires.`}),e.filters.map((e,i)=>(0,X.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[minmax(0,1fr)_auto] items-end gap-2 sm:grid-cols-[minmax(0,1fr)_minmax(0,1fr)_auto]`,children:[(0,X.jsx)(C,{label:`Path ${i+1}`,error:n(`filters.${i}.path`),children:t=>(0,X.jsx)(P,{...t,value:e.path,onChange:e=>r(i,{path:e.target.value}),placeholder:`action`,className:`font-mono`,autoCapitalize:`off`,spellCheck:!1})}),(0,X.jsx)(C,{label:`Equals ${i+1}`,error:n(`filters.${i}.equals`),className:`col-start-1 row-start-2 sm:col-start-auto sm:row-start-auto`,children:t=>(0,X.jsx)(P,{...t,value:e.equals,onChange:e=>r(i,{equals:e.target.value}),placeholder:`opened`})}),(0,X.jsx)(Te,{label:`Remove filter ${i+1}`,icon:(0,X.jsx)(Ce,{className:`size-4`}),onClick:()=>t(e=>({...e,filters:e.filters.filter((e,t)=>t!==i)}))})]},i)),(0,X.jsx)(`div`,{children:(0,X.jsx)(p,{size:`sm`,icon:(0,X.jsx)(pe,{className:`size-3.5`}),onClick:()=>t(e=>({...e,filters:[...e.filters,{path:``,equals:``}]})),children:`Add filter`})})]})}function dt({draft:e,update:t,err:n}){return(0,X.jsxs)(k,{stack:!0,title:`Task template`,description:`Use ${W.join(`, `)} in the title, objective, criteria and grouping key.`,children:[(0,X.jsx)(C,{label:`Task title`,error:n(`title`),children:n=>(0,X.jsx)(P,{...n,value:e.title,onChange:e=>t(`title`,e.target.value),placeholder:`Triage new issues for {{date}}`})}),(0,X.jsx)(C,{label:`Objective`,error:n(`objective`),children:n=>(0,X.jsx)(N,{...n,minRows:4,value:e.objective,onChange:e=>t(`objective`,e.target.value)})}),(0,X.jsx)(C,{label:`Acceptance criteria`,error:n(`criteria`),hint:`One criterion per line.`,optional:!0,children:n=>(0,X.jsx)(N,{...n,minRows:3,value:e.criteria,onChange:e=>t(`criteria`,e.target.value)})}),(0,X.jsx)(C,{label:`Priority`,error:n(`priority`),children:n=>(0,X.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,X.jsx)(ue,{priority:e.priority}),(0,X.jsx)(O,{...n,value:e.priority,onChange:e=>t(`priority`,e),className:`sm:max-w-48`})]})})]})}function ft({legend:e,value:t,options:n,onChange:r,hint:i}){let a=(0,Y.useId)();return(0,X.jsxs)(`fieldset`,{className:`flex min-w-0 flex-col gap-2`,children:[(0,X.jsx)(`legend`,{className:`mb-1 text-sm font-medium`,children:e}),(0,X.jsx)(`div`,{className:`grid min-w-0 gap-2 sm:grid-cols-3`,children:n.map(e=>(0,X.jsxs)(`label`,{className:u(`tap flex min-w-0 cursor-pointer items-start gap-2 rounded-md border p-2.5 text-sm`,`has-[:focus-visible]:outline-2 has-[:focus-visible]:outline-offset-1`,t===e.value?`border-accent bg-accent-soft`:`border-border hover:bg-surface-2`),children:[(0,X.jsx)(`input`,{type:`radio`,name:a,value:e.value,checked:t===e.value,onChange:()=>r(e.value),className:`mt-0.5 size-4 shrink-0 accent-[var(--color-accent)]`}),(0,X.jsxs)(`span`,{className:`min-w-0`,children:[(0,X.jsx)(`span`,{className:`block font-medium`,children:e.label}),(0,X.jsx)(`span`,{className:`block text-xs text-muted`,children:e.explanation})]})]},e.value))}),i&&(0,X.jsx)(`p`,{className:`text-xs text-muted`,children:i})]})}function pt({draft:e,update:t,err:n,hosts:r,profiles:i,defaultHostName:a,defaultProfileName:o,selectedProfileMissing:s}){return(0,X.jsxs)(k,{stack:!0,title:`Where and how it runs`,children:[(0,X.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,X.jsx)(C,{label:`Host`,error:n(`hostId`),children:n=>(0,X.jsxs)(L,{...n,value:e.hostId,onChange:e=>t(`hostId`,e.target.value),children:[(0,X.jsxs)(`option`,{value:``,children:[`Project default`,a?` (${a})`:``]}),e.hostId&&!r.some(t=>t.id===e.hostId)&&(0,X.jsx)(`option`,{value:e.hostId,children:`Unknown host`}),r.map(e=>(0,X.jsxs)(`option`,{value:e.id,children:[e.name,e.connectivity===`connected`?``:` (${e.connectivity})`]},e.id))]})}),(0,X.jsx)(C,{label:`Profile`,error:n(`profileId`),hint:s?`The selected profile is no longer available.`:void 0,children:n=>(0,X.jsxs)(L,{...n,value:e.profileId,onChange:e=>t(`profileId`,e.target.value),children:[(0,X.jsxs)(`option`,{value:``,children:[`Project default`,o?` (${o})`:``]}),e.profileId&&!i.some(t=>t.id===e.profileId)&&(0,X.jsx)(`option`,{value:e.profileId,children:`Unknown profile`}),i.map(e=>(0,X.jsx)(`option`,{value:e.id,children:e.name},e.id))]})})]}),(0,X.jsx)(ft,{legend:`Mode`,value:e.mode,options:Ne,onChange:e=>t(`mode`,e)}),(0,X.jsx)(C,{label:`Grouping key`,optional:e.mode!==`continue`,error:n(`groupingKey`),hint:`Occurrences with the same rendered key are the same work: Continue reuses that task and overlap checks compare it. Supports template variables, e.g. pr-{{payload.number}}.`,children:n=>(0,X.jsx)(P,{...n,value:e.groupingKey,onChange:e=>t(`groupingKey`,e.target.value),className:`font-mono`,autoCapitalize:`off`,spellCheck:!1})})]})}function mt({draft:e,update:t}){let n=e.triggerKind===`cron`||e.triggerKind===`once`;return(0,X.jsxs)(k,{stack:!0,title:`Overlap and missed runs`,children:[(0,X.jsx)(ft,{legend:`When previous work is still open`,value:e.overlap,options:Fe,onChange:e=>t(`overlap`,e)}),(0,X.jsx)(ft,{legend:`Missed runs`,value:e.missed,options:Le,onChange:e=>t(`missed`,e),hint:n?`A run is missed when the coordinator was down at its scheduled time.`:`Only applies to Schedule and Once triggers.`})]})}function ht({draft:e,update:t,err:n}){return(0,X.jsxs)(k,{stack:!0,title:`Limits`,description:`Continuation prompts the agent to keep going after a turn ends without finishing. It is off by default.`,children:[(0,X.jsx)(C,{label:`Automatic continuation`,children:n=>(0,X.jsx)(R,{...n,checked:e.continuationEnabled,onChange:e=>t(`continuationEnabled`,e),label:`Automatic continuation`,className:`self-start`})}),e.continuationEnabled&&(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(C,{label:`Continuation objective`,error:n(`continuationObjective`),hint:`What the agent must achieve before it reports done.`,children:n=>(0,X.jsx)(N,{...n,minRows:2,value:e.continuationObjective,onChange:e=>t(`continuationObjective`,e.target.value)})}),(0,X.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,X.jsx)(C,{label:`Max continuations`,error:n(`maxContinuations`),hint:`1–50`,children:n=>(0,X.jsx)(P,{...n,type:`number`,inputMode:`numeric`,min:1,max:50,step:1,value:e.maxContinuations,onChange:e=>t(`maxContinuations`,e.target.value)})}),(0,X.jsx)(C,{label:`Max elapsed minutes`,error:n(`maxElapsedMinutes`),hint:`1–1440`,children:n=>(0,X.jsx)(P,{...n,type:`number`,inputMode:`numeric`,min:1,max:1440,step:1,value:e.maxElapsedMinutes,onChange:e=>t(`maxElapsedMinutes`,e.target.value)})}),(0,X.jsx)(C,{label:`Max tokens`,optional:!0,error:n(`maxTokens`),children:n=>(0,X.jsx)(P,{...n,type:`number`,inputMode:`numeric`,min:1,step:1,value:e.maxTokens,onChange:e=>t(`maxTokens`,e.target.value)})}),(0,X.jsx)(C,{label:`Max cost (USD)`,optional:!0,error:n(`maxCostUsd`),children:n=>(0,X.jsx)(P,{...n,type:`number`,inputMode:`decimal`,min:.01,step:.01,value:e.maxCostUsd,onChange:e=>t(`maxCostUsd`,e.target.value)})})]}),(0,X.jsx)(`p`,{className:`text-xs text-muted`,children:`Token and cost limits are enforced only when the provider reports accounting; otherwise the run shows that accounting is unavailable and only the count and time limits apply.`})]})]})}function gt({draft:e,update:t,err:n,projectChecks:r}){let i=r&&r.length>0?`the project's checks (${r.join(`, `)})`:`the project's checks`;return(0,X.jsxs)(k,{stack:!0,title:`Review`,children:[(0,X.jsx)(C,{label:`Checks`,optional:!0,error:n(`checks`),hint:`One command per line. Leave empty to use ${i}.`,children:n=>(0,X.jsx)(N,{...n,minRows:2,value:e.checks,onChange:e=>t(`checks`,e.target.value),className:`font-mono`,spellCheck:!1,autoCapitalize:`off`})}),(0,X.jsx)(C,{label:`Human review`,hint:`When on, finished work waits in Review for you instead of completing on passing checks.`,children:n=>(0,X.jsx)(R,{...n,checked:e.requireHumanReview,onChange:e=>t(`requireHumanReview`,e),label:`Require human review`,onText:`Required`,offText:`Not required`,className:`self-start`})})]})}export{et as default};
|
|
2
|
-
//# sourceMappingURL=AutomationView-D7Syv1En.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t,t as n}from"./jsx-runtime-D13aM9HY.js";import{_ as r}from"./states-ZhrxQa3K.js";var i=e(t(),1),a=n();function o({label:e,description:t,checked:n,onChange:o,className:s,id:c,...l}){let u=(0,i.useId)(),d=t?`${c??u}-desc`:void 0;return(0,a.jsxs)(`div`,{className:`flex min-w-0 flex-col`,children:[(0,a.jsxs)(`label`,{className:r(`tap inline-flex min-w-0 cursor-pointer items-center gap-2 text-sm`,s),children:[(0,a.jsx)(`input`,{...l,id:c,type:`checkbox`,checked:n,onChange:e=>o(e.target.checked),"aria-describedby":d??l[`aria-describedby`],className:`size-4 shrink-0 accent-[var(--sy-accent)]`}),(0,a.jsx)(`span`,{className:r(`min-w-0`,!!t&&`font-medium`),children:e})]}),t&&(0,a.jsx)(`p`,{id:d,className:`pl-6 text-sm text-muted`,children:t})]})}export{o as t};
|
|
2
|
-
//# sourceMappingURL=Checkbox-D6tRfEeI.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Checkbox-D6tRfEeI.js","names":["useId","__toESM","require_react","require_jsx_runtime","cn","import_react","import_jsx_runtime","Checkbox","rest","generated","descId","description","id","className","onChange","label"],"sources":["../../src/components/ui/Checkbox.tsx"],"sourcesContent":["import { type InputHTMLAttributes, type ReactNode, useId } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CheckboxProps\n extends Omit<\n InputHTMLAttributes<HTMLInputElement>,\n \"type\" | \"checked\" | \"onChange\" | \"className\"\n > {\n label: ReactNode;\n /** Shown under the label; kept outside the label so it is not part of the accessible name. */\n description?: ReactNode;\n checked: boolean;\n onChange(checked: boolean): void;\n /** Classes for the clickable label row. */\n className?: string;\n}\n\n/** Native checkbox with its label; the whole row is the touch target. */\nexport function Checkbox({\n label,\n description,\n checked,\n onChange,\n className,\n id,\n ...rest\n}: CheckboxProps) {\n const generated = useId();\n const descId = description ? `${id ?? generated}-desc` : undefined;\n return (\n <div className=\"flex min-w-0 flex-col\">\n <label\n className={cn(\n \"tap inline-flex min-w-0 cursor-pointer items-center gap-2 text-sm\",\n className,\n )}\n >\n <input\n {...rest}\n id={id}\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n aria-describedby={descId ?? rest[\"aria-describedby\"]}\n className=\"size-4 shrink-0 accent-[var(--sy-accent)]\"\n />\n <span className={cn(\"min-w-0\", !!description && \"font-medium\")}>{label}</span>\n </label>\n {description && (\n <p id={descId} className=\"pl-6 text-sm text-muted\">\n {description}\n </p>\n )}\n </div>\n );\n}\n"],"mappings":"A,0HAkBA,SAAgBO,EAAS,CACvB,QACA,cACA,UACA,WACA,YACA,KACA,GAAGC,GACa,CAChB,IAAMC,GAAA,EAAYT,EAAAA,MAAAA,CAAM,EAClBU,EAASC,EAAc,GAAGC,GAAMH,EAAU,OAAS,IAAA,GACzD,OACE,EAAAH,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,wBAAf,SAAA,EACE,EAAAA,EAAA,KAAA,CAAC,QAAD,CACE,UAAWF,EACT,oEACAS,CACF,EAJF,SAAA,EAME,EAAAP,EAAA,IAAA,CAAC,QAAD,CACE,GAAIE,EACA,KACJ,KAAK,WACI,UACT,SAAW,GAAMM,EAAS,EAAE,OAAO,OAAO,EAC1C,mBAAkBJ,GAAUF,EAAK,oBACjC,UAAU,2CACX,CAAA,GACD,EAAAF,EAAA,IAAA,CAAC,OAAD,CAAM,UAAWF,EAAG,UAAW,CAAC,CAACO,GAAe,aAAa,EAAI,SAAAI,CAAY,CAAA,CACxE,CACN,CAAA,EAAAJ,IACC,EAAAL,EAAA,IAAA,CAAC,IAAD,CAAG,GAAII,EAAQ,UAAU,0BACtB,SAAAC,CACA,CAAA,CAEF,C,EAET,C"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{d as i}from"./states-ZhrxQa3K.js";import{b as a}from"./index-hxvDvCS7.js";var o={name:`check`,size:24,node:[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]};o.node;var s=n(o),c={name:`copy`,size:24,node:[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]};c.node;var l=n(c),u=e(t(),1),d=r();async function f(e,t=`Copied to clipboard`){try{return await navigator.clipboard.writeText(e),t&&a.success(t),!0}catch{return a.error(`Could not copy. Select the text and copy it manually.`),!1}}function p({text:e,label:t=`Copy`,toastMessage:n,size:r=`sm`}){let[a,o]=(0,u.useState)(!1),c=(0,u.useRef)(null);return(0,u.useEffect)(()=>()=>void(c.current&&clearTimeout(c.current)),[]),(0,d.jsx)(i,{size:r,icon:a?(0,d.jsx)(s,{className:`size-4`}):(0,d.jsx)(l,{className:`size-4`}),onClick:async()=>{await f(e,n)&&(o(!0),c.current&&clearTimeout(c.current),c.current=setTimeout(()=>o(!1),2e3))},children:a?`Copied`:t})}function m({text:e,label:t,copyLabel:n=`Copy`}){return(0,d.jsxs)(`figure`,{className:`m-0 flex min-w-0 flex-col gap-2 sm:flex-row sm:items-start`,children:[(0,d.jsx)(`figcaption`,{className:`sr-only`,children:t}),(0,d.jsx)(`pre`,{className:`min-w-0 flex-1 whitespace-pre-wrap break-all rounded-md border border-border bg-surface-2 px-3 py-2 font-mono text-sm`,children:e}),(0,d.jsx)(p,{text:e,label:n})]})}export{s as i,f as n,l as r,m as t};
|
|
2
|
-
//# sourceMappingURL=Copy-B6XSAIUd.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{_ as i}from"./states-ZhrxQa3K.js";var a={name:`save`,size:24,node:[[`path`,{d:`M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z`,key:`1c8476`}],[`path`,{d:`M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7`,key:`1ydtos`}],[`path`,{d:`M7 3v4a1 1 0 0 0 1 1h7`,key:`t51u73`}]]};a.node;var o=n(a),s=e(t(),1),c=r();function l({title:e,description:t,actions:n,children:r,className:a,testId:o,stack:l}){let u=(0,s.useId)();return(0,c.jsxs)(`section`,{"aria-labelledby":e?u:void 0,"data-testid":o,className:i(`min-w-0 rounded-lg border border-border bg-surface p-4`,a),children:[(e||n)&&(0,c.jsxs)(`div`,{className:`mb-3 flex min-w-0 flex-wrap items-start gap-2`,children:[(0,c.jsxs)(`div`,{className:`min-w-0 flex-[1_1_12rem]`,children:[e&&(0,c.jsx)(`h2`,{id:u,className:`text-base font-semibold`,children:e}),t&&(0,c.jsx)(`p`,{className:`text-sm text-muted`,children:t})]}),n&&(0,c.jsx)(`div`,{className:`flex flex-wrap items-center gap-2`,children:n})]}),l?(0,c.jsx)(`div`,{className:`flex flex-col gap-4`,children:r}):r]})}function u({description:e,children:t}){let n=(0,s.useId)();return(0,c.jsxs)(`section`,{"aria-labelledby":n,"data-testid":`danger-zone`,className:`min-w-0 rounded-lg border border-danger/50 bg-surface p-4`,children:[(0,c.jsx)(`h2`,{id:n,className:`text-base font-semibold text-danger`,children:`Danger zone`}),e&&(0,c.jsx)(`p`,{className:`text-sm text-muted`,children:e}),(0,c.jsx)(`div`,{className:`mt-3 flex flex-wrap items-center gap-2`,children:t})]})}export{l as n,o as r,u as t};
|
|
2
|
-
//# sourceMappingURL=DangerZone-DfYlxDC1.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"DangerZone-DfYlxDC1.js","names":["useId","useId","__toESM","require_react","require_jsx_runtime","cn","__iconData","Save","createLucideIcon","import_react","import_jsx_runtime","Card","titleId","title","testId","className","actions","description","stack","children","DangerZone","id"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/save.mjs","../../src/components/ui/Card.tsx","../../src/components/ui/DangerZone.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"save\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n ]\n};\n__iconData.node;\nconst Save = createLucideIcon(__iconData);\n\nexport { __iconData, Save as default };\n//# sourceMappingURL=save.mjs.map\n","import { type ReactNode, useId } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface CardProps {\n title?: ReactNode;\n description?: ReactNode;\n actions?: ReactNode;\n children?: ReactNode;\n className?: string;\n testId?: string;\n /** Wrap the children in a flex column with gap-4. */\n stack?: boolean;\n}\n\n/** A titled, bordered block. The title is its accessible name. */\nexport function Card({\n title,\n description,\n actions,\n children,\n className,\n testId,\n stack,\n}: CardProps) {\n const titleId = useId();\n return (\n <section\n aria-labelledby={title ? titleId : undefined}\n data-testid={testId}\n className={cn(\"min-w-0 rounded-lg border border-border bg-surface p-4\", className)}\n >\n {(title || actions) && (\n <div className=\"mb-3 flex min-w-0 flex-wrap items-start gap-2\">\n <div className=\"min-w-0 flex-[1_1_12rem]\">\n {title && (\n <h2 id={titleId} className=\"text-base font-semibold\">\n {title}\n </h2>\n )}\n {description && <p className=\"text-sm text-muted\">{description}</p>}\n </div>\n {actions && <div className=\"flex flex-wrap items-center gap-2\">{actions}</div>}\n </div>\n )}\n {stack ? <div className=\"flex flex-col gap-4\">{children}</div> : children}\n </section>\n );\n}\n","import { type ReactNode, useId } from \"react\";\n\n/** Destructive actions, set apart at the bottom of a detail page. */\nexport function DangerZone({\n description,\n children,\n}: {\n description?: ReactNode;\n children: ReactNode;\n}) {\n const id = useId();\n return (\n <section\n aria-labelledby={id}\n data-testid=\"danger-zone\"\n className=\"min-w-0 rounded-lg border border-danger/50 bg-surface p-4\"\n >\n <h2 id={id} className=\"text-base font-semibold text-danger\">\n Danger zone\n </h2>\n {description && <p className=\"text-sm text-muted\">{description}</p>}\n <div className=\"mt-3 flex flex-wrap items-center gap-2\">{children}</div>\n </section>\n );\n}\n"],"ignoreList":[0],"mappings":"A,uGASA,IAAMM,EAAa,CACjB,KAAM,OACN,KAAM,GACN,KAAM,CACJ,CACE,OACA,CACE,EAAG,qGACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,4CAA6C,IAAK,QAAS,CAAC,EAC1E,CAAC,OAAQ,CAAE,EAAG,yBAA0B,IAAK,QAAS,CAAC,CACzD,CACF,EACAA,EAAW,KACX,IAAMC,EAAOC,EAAiBF,CAAU,E,iBCVxC,SAAgBK,EAAK,CACnB,QACA,cACA,UACA,WACA,YACA,SACA,SACY,CACZ,IAAMC,GAAA,EAAUZ,EAAAA,MAAAA,CAAM,EACtB,OACE,EAAAU,EAAA,KAAA,CAAC,UAAD,CACE,kBAAiBG,EAAQD,EAAU,IAAA,GACnC,cAAaE,EACb,UAAWT,EAAG,yDAA0DU,CAAS,EAHnF,SAAA,EAKIF,GAASG,KACT,EAAAN,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,gDAAf,SAAA,EACE,EAAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,2BAAf,SAAA,CACGG,IACC,EAAAH,EAAA,IAAA,CAAC,KAAD,CAAI,GAAIE,EAAS,UAAU,0BACxB,SAAAC,CACC,CAAA,EAELI,IAAe,EAAAP,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,qBAAsB,SAAAO,CAAe,CAAA,CAC/D,CACJ,CAAA,EAAAD,IAAW,EAAAN,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,oCAAqC,SAAAM,CAAa,CAAA,CAC1E,CAEN,CAAA,EAAAE,GAAQ,EAAAR,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,sBAAuB,UAAc,CAAA,EAAIS,CAC1D,C,EAEb,CC5CA,SAAgBC,EAAW,CACzB,cACA,YAIC,CACD,IAAMC,GAAA,EAAKpB,EAAAA,MAAAA,CAAM,EACjB,OACE,EAAAS,EAAA,KAAA,CAAC,UAAD,CACE,kBAAiBW,EACjB,cAAY,cACZ,UAAU,4DAHZ,SAAA,EAKE,EAAAX,EAAA,IAAA,CAAC,KAAD,CAAQ,KAAI,UAAU,sCAAsC,SAAA,aAExD,CAAA,EACHO,IAAe,EAAAP,EAAA,IAAA,CAAC,IAAD,CAAG,UAAU,qBAAsB,SAAAO,CAAe,CAAA,GAClE,EAAAP,EAAA,IAAA,CAAC,MAAD,CAAK,UAAU,yCAA0C,UAAc,CAAA,CAChE,C,EAEb,C"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{_ as i}from"./states-ZhrxQa3K.js";import{i as a}from"./Copy-B6XSAIUd.js";var o={name:`chevron-down`,size:24,node:[[`path`,{d:`m6 9 6 6 6-6`,key:`qrunsl`}]]};o.node;var s=n(o),c={name:`panel-right-open`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}],[`path`,{d:`m10 15-3-3 3-3`,key:`1pgupc`}]]};c.node;var l=n(c),u=e(t(),1),d=r();function f({trigger:e,items:t,align:n=`end`,side:r=`bottom`,label:o,className:s}){let[c,l]=(0,u.useState)(!1),f=(0,u.useId)(),m=(0,u.useRef)(null),h=(0,u.useRef)(null),g=e=>p(h.current,e);(0,u.useEffect)(()=>{if(!c)return;requestAnimationFrame(()=>p(h.current,`first`));let e=e=>{!h.current?.contains(e.target)&&!m.current?.contains(e.target)&&l(!1)};return document.addEventListener(`pointerdown`,e),()=>document.removeEventListener(`pointerdown`,e)},[c]);let _=(e=!0)=>{l(!1),e&&m.current?.focus()};return(0,d.jsxs)(`div`,{className:i(`relative inline-flex`,s),children:[e({ref:m,onClick:()=>l(e=>!e),onKeyDown:e=>{(e.key===`ArrowDown`||e.key===`ArrowUp`)&&(e.preventDefault(),l(!0))},"aria-haspopup":`menu`,"aria-expanded":c,"aria-controls":f}),c&&(0,d.jsx)(`div`,{ref:h,id:f,role:`menu`,"aria-label":o,tabIndex:-1,className:i(`absolute z-40 min-w-48 max-w-[min(20rem,calc(100vw-1rem))] rounded-lg border border-border bg-surface py-1 shadow-pop`,r===`top`?`bottom-full mb-1`:`top-full mt-1`,n===`end`?`right-0`:`left-0`),onKeyDown:e=>{e.key===`ArrowDown`?(e.preventDefault(),g(1)):e.key===`ArrowUp`?(e.preventDefault(),g(-1)):e.key===`Home`?(e.preventDefault(),g(`first`)):e.key===`End`?(e.preventDefault(),g(`last`)):e.key===`Escape`?(e.preventDefault(),e.stopPropagation(),_()):e.key===`Tab`&&_(!1)},children:t.map((e,t)=>e===`separator`?(0,d.jsx)(`hr`,{className:`my-1 border-t border-border`},`sep-${t}`):`heading`in e?(0,d.jsx)(`div`,{role:`presentation`,className:`px-3 pt-1.5 pb-1 text-xs font-medium text-muted`,children:e.heading},e.id):(0,d.jsxs)(`button`,{type:`button`,role:e.kind===`radio`?`menuitemradio`:e.kind===`checkbox`?`menuitemcheckbox`:`menuitem`,"aria-checked":e.kind?!!e.checked:void 0,disabled:e.disabled,className:i(`tap flex w-full items-start gap-2 px-3 py-2 text-left text-sm hover:bg-surface-2 focus:bg-surface-2 focus:outline-none disabled:opacity-55`,e.danger?`text-danger`:`text-text`),onClick:()=>{_(),e.onSelect()},children:[e.kind?(0,d.jsx)(`span`,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0`,children:e.checked&&(0,d.jsx)(a,{className:`size-4`})}):e.icon&&(0,d.jsx)(`span`,{className:`mt-0.5 shrink-0`,children:e.icon}),(0,d.jsxs)(`span`,{className:`min-w-0`,children:[(0,d.jsx)(`span`,{className:`block`,children:e.label}),e.hint&&(0,d.jsx)(`span`,{className:`block text-xs text-muted`,children:e.hint})]})]},e.id))})]})}function p(e,t){let n=[...e?.querySelectorAll(`[role^="menuitem"]:not([disabled])`)??[]];if(n.length===0)return;let r=n.indexOf(document.activeElement),i=0;i=t===`first`?0:t===`last`?n.length-1:(r+t+n.length)%n.length,n[i].focus()}export{l as n,s as r,f as t};
|
|
2
|
-
//# sourceMappingURL=Menu-BfOszNC4.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Menu-BfOszNC4.js","names":["__iconData","useState","useId","useRef","__toESM","require_react","require_jsx_runtime","cn","Check","__iconData$1","ChevronDown","createLucideIcon","__iconData","PanelRightOpen","import_react","import_jsx_runtime","Menu","open","setOpen","id","btnRef","menuRef","focusItem","focusMenuItem","dir","onDoc","close","refocus","className","trigger","o","label","side","align","items","item","i","els","menu","idx","next"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/chevron-down.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/panel-right-open.mjs","../../src/components/ui/Menu.tsx"],"sourcesContent":["/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"chevron-down\",\n size: 24,\n node: [[\"path\", { d: \"m6 9 6 6 6-6\", key: \"qrunsl\" }]]\n};\n__iconData.node;\nconst ChevronDown = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronDown as default };\n//# sourceMappingURL=chevron-down.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"panel-right-open\",\n size: 24,\n node: [\n [\"rect\", { width: \"18\", height: \"18\", x: \"3\", y: \"3\", rx: \"2\", key: \"afitv7\" }],\n [\"path\", { d: \"M15 3v18\", key: \"14nvp0\" }],\n [\"path\", { d: \"m10 15-3-3 3-3\", key: \"1pgupc\" }]\n ]\n};\n__iconData.node;\nconst PanelRightOpen = createLucideIcon(__iconData);\n\nexport { __iconData, PanelRightOpen as default };\n//# sourceMappingURL=panel-right-open.mjs.map\n","import { Check } from \"lucide-react\";\nimport { type ReactNode, useEffect, useId, useRef, useState } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport interface MenuItem {\n id: string;\n label: string;\n icon?: ReactNode;\n onSelect: () => void;\n danger?: boolean;\n disabled?: boolean;\n /** Short explanation shown under the label (e.g. why it is disabled). */\n hint?: string;\n /** A radio or checkbox item shows a check mark when `checked`. */\n kind?: \"radio\" | \"checkbox\";\n checked?: boolean;\n}\n\n/** A non-interactive label above a group of items. */\nexport interface MenuHeading {\n id: string;\n heading: string;\n}\n\nexport interface MenuProps {\n /** Render the trigger; spread the given props onto a button. */\n trigger: (props: {\n ref: React.Ref<HTMLButtonElement>;\n onClick: () => void;\n onKeyDown: (e: React.KeyboardEvent) => void;\n \"aria-haspopup\": \"menu\";\n \"aria-expanded\": boolean;\n \"aria-controls\": string;\n }) => ReactNode;\n items: (MenuItem | MenuHeading | \"separator\")[];\n align?: \"start\" | \"end\";\n /** Open below (default) or above the trigger. */\n side?: \"bottom\" | \"top\";\n /** Extra classes for the wrapper (e.g. `w-full`). */\n className?: string;\n /** Accessible name of the menu. */\n label: string;\n}\n\n/** Popup menu with arrow-key navigation, Escape and outside click to close. */\nexport function Menu({\n trigger,\n items,\n align = \"end\",\n side = \"bottom\",\n label,\n className,\n}: MenuProps) {\n const [open, setOpen] = useState(false);\n const id = useId();\n const btnRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n\n const focusItem = (dir: 1 | -1 | \"first\" | \"last\") => focusMenuItem(menuRef.current, dir);\n\n useEffect(() => {\n if (!open) return;\n requestAnimationFrame(() => focusMenuItem(menuRef.current, \"first\"));\n const onDoc = (e: PointerEvent) => {\n if (\n !menuRef.current?.contains(e.target as Node) &&\n !btnRef.current?.contains(e.target as Node)\n ) {\n setOpen(false);\n }\n };\n document.addEventListener(\"pointerdown\", onDoc);\n return () => document.removeEventListener(\"pointerdown\", onDoc);\n }, [open]);\n\n const close = (refocus = true) => {\n setOpen(false);\n if (refocus) btnRef.current?.focus();\n };\n\n return (\n <div className={cn(\"relative inline-flex\", className)}>\n {trigger({\n ref: btnRef,\n onClick: () => setOpen((o) => !o),\n onKeyDown: (e) => {\n if (e.key === \"ArrowDown\" || e.key === \"ArrowUp\") {\n e.preventDefault();\n setOpen(true);\n }\n },\n \"aria-haspopup\": \"menu\",\n \"aria-expanded\": open,\n \"aria-controls\": id,\n })}\n {open && (\n <div\n ref={menuRef}\n id={id}\n role=\"menu\"\n aria-label={label}\n tabIndex={-1}\n className={cn(\n \"absolute z-40 min-w-48 max-w-[min(20rem,calc(100vw-1rem))] rounded-lg border border-border bg-surface py-1 shadow-pop\",\n side === \"top\" ? \"bottom-full mb-1\" : \"top-full mt-1\",\n align === \"end\" ? \"right-0\" : \"left-0\",\n )}\n onKeyDown={(e) => {\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n focusItem(1);\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n focusItem(-1);\n } else if (e.key === \"Home\") {\n e.preventDefault();\n focusItem(\"first\");\n } else if (e.key === \"End\") {\n e.preventDefault();\n focusItem(\"last\");\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n close();\n } else if (e.key === \"Tab\") {\n close(false);\n }\n }}\n >\n {items.map((item, i) =>\n item === \"separator\" ? (\n // biome-ignore lint/suspicious/noArrayIndexKey: separators have no identity\n <hr key={`sep-${i}`} className=\"my-1 border-t border-border\" />\n ) : \"heading\" in item ? (\n <div\n key={item.id}\n role=\"presentation\"\n className=\"px-3 pt-1.5 pb-1 text-xs font-medium text-muted\"\n >\n {item.heading}\n </div>\n ) : (\n // biome-ignore lint/a11y/useAriaPropsSupportedByRole: aria-checked is only set with the menuitemradio/menuitemcheckbox roles\n <button\n key={item.id}\n type=\"button\"\n role={\n item.kind === \"radio\"\n ? \"menuitemradio\"\n : item.kind === \"checkbox\"\n ? \"menuitemcheckbox\"\n : \"menuitem\"\n }\n aria-checked={item.kind ? !!item.checked : undefined}\n disabled={item.disabled}\n className={cn(\n \"tap flex w-full items-start gap-2 px-3 py-2 text-left text-sm hover:bg-surface-2 focus:bg-surface-2 focus:outline-none disabled:opacity-55\",\n item.danger ? \"text-danger\" : \"text-text\",\n )}\n onClick={() => {\n close();\n item.onSelect();\n }}\n >\n {item.kind ? (\n <span aria-hidden className=\"mt-0.5 size-4 shrink-0\">\n {item.checked && <Check className=\"size-4\" />}\n </span>\n ) : (\n item.icon && <span className=\"mt-0.5 shrink-0\">{item.icon}</span>\n )}\n <span className=\"min-w-0\">\n <span className=\"block\">{item.label}</span>\n {item.hint && <span className=\"block text-xs text-muted\">{item.hint}</span>}\n </span>\n </button>\n ),\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction focusMenuItem(menu: HTMLElement | null, dir: 1 | -1 | \"first\" | \"last\"): void {\n const els = [\n ...(menu?.querySelectorAll<HTMLElement>('[role^=\"menuitem\"]:not([disabled])') ?? []),\n ];\n if (els.length === 0) return;\n const idx = els.indexOf(document.activeElement as HTMLElement);\n let next = 0;\n if (dir === \"first\") next = 0;\n else if (dir === \"last\") next = els.length - 1;\n else next = (idx + dir + els.length) % els.length;\n els[next]!.focus();\n}\n"],"ignoreList":[0,1],"mappings":"A,8IASA,IAAMA,EAAa,CACjB,KAAM,eACN,KAAM,GACN,KAAM,CAAC,CAAC,OAAQ,CAAE,EAAG,eAAgB,IAAK,QAAS,CAAC,CAAC,CACvD,EACAA,EAAW,KACX,IAAMU,EAAcC,EAAiBX,CAAU,ECNzCY,EAAa,CACjB,KAAM,mBACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,MAAO,KAAM,OAAQ,KAAM,EAAG,IAAK,EAAG,IAAK,GAAI,IAAK,IAAK,QAAS,CAAC,EAC9E,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAS,CAAC,CACjD,CACF,EACAA,EAAW,KACX,IAAMC,EAAiBF,EAAiBC,CAAU,E,iBC0BlD,SAAgBI,EAAK,CACnB,UACA,QACA,QAAQ,MACR,OAAO,SACP,QACA,aACY,CACZ,GAAM,CAACC,EAAMC,IAAA,EAAWjB,EAAAA,SAAAA,CAAS,EAAK,EAChCkB,GAAA,EAAKjB,EAAAA,MAAAA,CAAM,EACXkB,GAAA,EAASjB,EAAAA,OAAAA,CAA0B,IAAI,EACvCkB,GAAA,EAAUlB,EAAAA,OAAAA,CAAuB,IAAI,EAErCmB,EAAa,GAAmCC,EAAcF,EAAQ,QAASG,CAAG,GAExF,EAAAV,EAAA,UAAA,KAAgB,CACd,GAAI,CAACG,EAAM,OACX,0BAA4BM,EAAcF,EAAQ,QAAS,OAAO,CAAC,EACnE,IAAMI,EAAS,GAAoB,CAE/B,CAACJ,EAAQ,SAAS,SAAS,EAAE,MAAc,GAC3C,CAACD,EAAO,SAAS,SAAS,EAAE,MAAc,GAE1CF,EAAQ,EAAK,CAEjB,EAEA,OADA,SAAS,iBAAiB,cAAeO,CAAK,MACjC,SAAS,oBAAoB,cAAeA,CAAK,CAChE,EAAG,CAACR,CAAI,CAAC,EAET,IAAMS,GAAS,EAAU,KAAS,CAChCR,EAAQ,EAAK,EACTS,GAASP,EAAO,SAAS,MAAM,CACrC,EAEA,OACE,EAAAL,EAAA,KAAA,CAAC,MAAD,CAAK,UAAWR,EAAG,uBAAwBqB,CAAS,EAApD,SAAA,CACGC,EAAQ,CACP,IAAKT,EACL,YAAeF,EAAS,GAAM,CAACY,CAAC,EAChC,UAAY,GAAM,EACZ,EAAE,MAAQ,aAAe,EAAE,MAAQ,aACrC,EAAE,eAAe,EACjBZ,EAAQ,EAAI,EAEhB,EACA,gBAAiB,OACjB,gBAAiBD,EACjB,gBAAiBE,CACnB,CAAC,EACAF,IACC,EAAAF,EAAA,IAAA,CAAC,MAAD,CACE,IAAKM,EACD,KACJ,KAAK,OACL,aAAYU,EACZ,SAAU,GACV,UAAWxB,EACT,wHACAyB,IAAS,MAAQ,mBAAqB,gBACtCC,IAAU,MAAQ,UAAY,QAChC,EACA,UAAY,GAAM,CACZ,EAAE,MAAQ,aACZ,EAAE,eAAe,EACjBX,EAAU,CAAC,GACF,EAAE,MAAQ,WACnB,EAAE,eAAe,EACjBA,EAAU,EAAE,GACH,EAAE,MAAQ,QACnB,EAAE,eAAe,EACjBA,EAAU,OAAO,GACR,EAAE,MAAQ,OACnB,EAAE,eAAe,EACjBA,EAAU,MAAM,GACP,EAAE,MAAQ,UACnB,EAAE,eAAe,EACjB,EAAE,gBAAgB,EAClBI,EAAM,GACG,EAAE,MAAQ,OACnBA,EAAM,EAAK,CAEf,EAEC,SAAAQ,EAAM,KAAK,EAAM,IAChBC,IAAS,aAEP,EAAApB,EAAA,IAAA,CAAC,KAAD,CAAqB,UAAU,6BAA+B,EAArD,OAAOqB,GAA8C,EAC5D,YAAaD,GACf,EAAApB,EAAA,IAAA,CAAC,MAAD,CAEE,KAAK,eACL,UAAU,kDAET,SAAAoB,EAAK,OACH,EALEA,EAAK,EAKP,GAGL,EAAApB,EAAA,KAAA,CAAC,SAAD,CAEE,KAAK,SACL,KACEoB,EAAK,OAAS,QACV,gBACAA,EAAK,OAAS,WACZ,mBACA,WAER,eAAcA,EAAK,KAAO,CAAC,CAACA,EAAK,QAAU,IAAA,GAC3C,SAAUA,EAAK,SACf,UAAW5B,EACT,6IACA4B,EAAK,OAAS,cAAgB,WAChC,EACA,YAAe,CACbT,EAAM,EACNS,EAAK,SAAS,CAChB,EAnBF,SAAA,CAqBGA,EAAK,MACJ,EAAApB,EAAA,IAAA,CAAC,OAAD,CAAM,cAAA,GAAY,UAAU,yBACzB,SAAAoB,EAAK,UAAW,EAAApB,EAAA,IAAA,CAACP,EAAD,CAAO,UAAU,QAAU,CAAA,CACxC,CAAA,EAEN2B,EAAK,OAAQ,EAAApB,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,kBAAmB,SAAAoB,EAAK,IAAW,CAAA,GAElE,EAAApB,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,UAAhB,SAAA,EACE,EAAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,QAAS,SAAAoB,EAAK,KAAY,CAAA,EACzCA,EAAK,OAAQ,EAAApB,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,2BAA4B,SAAAoB,EAAK,IAAW,CAAA,CACtE,CACA,CAAA,CAAA,CA/BD,EAAAA,EAAK,EA+BJ,CAEZ,CACG,CAAA,CAEJ,C,EAET,CAEA,SAASZ,EAAc,EAA0B,EAAsC,CACrF,IAAMc,EAAM,CACV,GAAIC,GAAM,iBAA8B,oCAAoC,GAAK,CAAC,CACpF,EACA,GAAID,EAAI,SAAW,EAAG,OACtB,IAAME,EAAMF,EAAI,QAAQ,SAAS,aAA4B,EACzDG,EAAO,EACX,AAEKA,EAFDhB,IAAQ,QAAgB,EACnBA,IAAQ,OAAea,EAAI,OAAS,GAChCE,EAAMf,EAAMa,EAAI,QAAUA,EAAI,OAC3CA,EAAIG,EAAK,CAAE,MAAM,CACnB,C"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t,t as n}from"./jsx-runtime-D13aM9HY.js";import{_ as r,a as i,d as a,n as o,yt as s}from"./states-ZhrxQa3K.js";import{j as c,rt as l}from"./index-hxvDvCS7.js";var u=l(),d=e(t(),1),f=n(),p=(0,d.forwardRef)(function({label:e,icon:t,variant:n=`ghost`,size:i=`md`,className:a,type:o,...s},c){return(0,f.jsx)(`button`,{ref:c,type:o??`button`,"aria-label":e,title:e,className:r(`tap inline-flex shrink-0 items-center justify-center rounded-md border transition-colors`,`disabled:opacity-55 disabled:pointer-events-none`,i===`sm`?`size-8`:`size-9`,n===`ghost`&&`border-transparent text-muted hover:bg-surface-2 hover:text-text`,n===`secondary`&&`border-border bg-surface text-text hover:bg-surface-2`,n===`danger`&&`border-transparent text-danger hover:bg-danger-soft`,a),...s,children:t})}),m=`a[href], area[href], button:not([disabled]), input:not([disabled]):not([type="hidden"]), select:not([disabled]), textarea:not([disabled]), iframe, [tabindex]:not([tabindex="-1"]), [contenteditable="true"]`;function h(e){return[...e.querySelectorAll(m)].filter(e=>!e.hasAttribute(`inert`)&&e.getClientRects().length>0)}function g(e,t,n,r){let i=(0,d.useRef)(n);i.current=n;let a=(0,d.useRef)(null),o=(0,d.useRef)(!1);t&&!o.current&&typeof document<`u`&&(a.current=document.activeElement),o.current=t,(0,d.useEffect)(()=>{if(!t)return;let n=e.current;if(!n)return;let o=a.current,s=o&&!n.contains(o)?o:document.activeElement,c=r?.current??h(n)[0]??n,l=requestAnimationFrame(()=>{(r?.current||!n.contains(document.activeElement))&&c.focus({preventScroll:!0})}),u=e=>{if(e.key===`Escape`&&i.current){e.stopPropagation(),i.current();return}if(e.key!==`Tab`)return;let t=h(n);if(t.length===0){e.preventDefault(),n.focus();return}let r=t[0],a=t[t.length-1],o=document.activeElement;e.shiftKey&&(o===r||!n.contains(o))?(e.preventDefault(),a.focus()):e.shiftKey||o!==a&&n.contains(o)||(e.preventDefault(),r.focus())};return n.addEventListener(`keydown`,u),()=>{cancelAnimationFrame(l),n.removeEventListener(`keydown`,u),s&&document.contains(s)&&s.focus({preventScroll:!0})}},[t,e,r])}function _(e){(0,d.useEffect)(()=>{if(!e)return;let t=document.body.style.overflow;return document.body.style.overflow=`hidden`,()=>{document.body.style.overflow=t}},[e])}function v({placement:e,open:t,onClose:n,title:i,description:a,children:o,footer:s,initialFocus:l,dismissOnBackdrop:m=!0,headerActions:h,className:v,flush:y,bodyClassName:b,fullHeight:x,style:S}){let C=(0,d.useRef)(null),w=(0,d.useId)(),T=(0,d.useId)();return g(C,t,n,l),_(t),t?(0,u.createPortal)((0,f.jsxs)(`div`,{className:r(`fixed inset-0 z-50 flex`,e===`right`&&`justify-end`,e===`bottom`&&`items-end`,e===`center`&&`items-center justify-center p-4`),children:[(0,f.jsx)(`div`,{className:`absolute inset-0 bg-overlay`,"aria-hidden":!0,onClick:m?n:void 0}),(0,f.jsxs)(`div`,{ref:C,role:`dialog`,"aria-modal":`true`,"aria-labelledby":w,"aria-describedby":a?T:void 0,tabIndex:-1,style:S,className:r(`relative flex flex-col bg-surface text-text shadow-pop outline-none`,e===`right`&&`h-full max-w-full border-l border-border safe-pt safe-pb`,e===`bottom`&&(x?`h-dvh w-full safe-pt safe-pb`:`max-h-[90dvh] w-full rounded-t-xl border-t border-border safe-pb`),e===`center`&&`max-h-[min(90dvh,720px)] w-full max-w-lg rounded-xl border border-border`,v),children:[e===`bottom`&&!x&&(0,f.jsx)(`div`,{className:`flex justify-center pt-2`,"aria-hidden":!0,children:(0,f.jsx)(`div`,{className:`h-1 w-10 rounded-full bg-border-strong`})}),(0,f.jsxs)(`div`,{className:`flex items-start gap-2 border-b border-border px-4 py-3`,children:[(0,f.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,f.jsx)(`h2`,{id:w,className:`text-base font-semibold leading-6`,children:i}),a&&(0,f.jsx)(`p`,{id:T,className:`text-sm text-muted`,children:a})]}),h,(0,f.jsx)(p,{label:`Close`,icon:(0,f.jsx)(c,{className:`size-4`}),onClick:n})]}),(0,f.jsx)(`div`,{className:r(`min-h-0 flex-1 overflow-y-auto overscroll-contain`,!y&&`px-4 py-3`,b),children:o}),s&&(0,f.jsx)(`div`,{className:`flex flex-wrap items-center justify-end gap-2 border-t border-border px-4 py-3`,children:s})]})]}),document.body):null}function y({width:e=520,...t}){return(0,f.jsx)(v,{...t,placement:`right`,style:{width:`min(${e}px, 100vw)`}})}function b(e){return(0,f.jsx)(v,{...e,placement:`bottom`})}function x(e){return(0,f.jsx)(v,{...e,placement:`center`})}function S({open:e,onClose:t,title:n,description:r,confirmLabel:c,onConfirm:l,busy:u,error:d,errorTitle:p,danger:m=!0,confirmIcon:h,confirmDisabled:g,disabledReason:_,children:v}){return(0,f.jsx)(x,{open:e,onClose:u?()=>void 0:t,dismissOnBackdrop:!u,title:n,description:r,footer:(0,f.jsxs)(f.Fragment,{children:[g&&_&&(0,f.jsx)(`p`,{className:`mr-auto min-w-0 flex-1 basis-full text-xs text-muted sm:basis-auto`,children:_}),(0,f.jsx)(a,{onClick:t,disabled:u,children:`Cancel`}),(0,f.jsx)(a,{variant:m?`danger`:`primary`,icon:h,busy:u,disabled:g,onClick:l,children:c})]}),children:(0,f.jsxs)(`div`,{className:`flex flex-col gap-3`,children:[v,p?!!d&&(0,f.jsx)(o,{compact:!0,title:p,error:s(d)}):(0,f.jsx)(i,{error:d})]})})}export{g as a,b as i,x as n,p as o,y as r,S as t};
|
|
2
|
-
//# sourceMappingURL=Overlay-DUQwh6_b.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e,t}from"./jsx-runtime-D13aM9HY.js";import{_ as n,lt as r}from"./states-ZhrxQa3K.js";import{t as i}from"./arrow-down-C-iLrN8I.js";import{t as a}from"./arrow-up-Dj-VTKx4.js";import{A as o}from"./index-hxvDvCS7.js";import{t as s}from"./Select-Cfql4Nwu.js";var c={name:`chevrons-up`,size:24,node:[[`path`,{d:`m17 11-5-5-5 5`,key:`e8nh98`}],[`path`,{d:`m17 18-5-5-5 5`,key:`2avn1x`}]]};c.node;var l=e(c),u={name:`minus`,size:24,node:[[`path`,{d:`M5 12h14`,key:`1ays0h`}]]};u.node;var d=e(u),f=t(),p={0:{label:r[0],icon:l,tone:`danger`},1:{label:r[1],icon:a,tone:`warning`},2:{label:r[2],icon:d,tone:`neutral`},3:{label:r[3],icon:i,tone:`neutral`}};function m({priority:e,className:t,colored:r=!0}){let i=p[e]??p[2],a=i.icon;return(0,f.jsx)(a,{"aria-hidden":!0,className:n(`shrink-0`,r&&o[i.tone],t??`size-4`)})}function h({priority:e,className:t,suffix:r,muted:i}){let a=p[e]??p[2];return(0,f.jsxs)(`span`,{className:n(`inline-flex items-center gap-1`,i?`text-muted`:o[a.tone],t),children:[(0,f.jsx)(m,{priority:e,className:`size-3.5`}),a.label,r]})}function g({value:e,onChange:t,...n}){return(0,f.jsx)(s,{...n,value:e,onChange:e=>t(Number(e.target.value)),children:r.map((e,t)=>(0,f.jsx)(`option`,{value:t,children:e},e))})}export{h as n,g as r,m as t};
|
|
2
|
-
//# sourceMappingURL=Priority-CHmzfoHg.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,i as t,m as n,n as r,t as i}from"./jsx-runtime-D13aM9HY.js";import{b as a,c as o,d as s,f as c,gt as l,h as u,i as d,j as f,n as p,s as m,t as h,u as g,vt as _,yt as v,z as y}from"./states-ZhrxQa3K.js";import{t as b}from"./external-link-3jjTxo92.js";import{n as x,t as S}from"./InteractionCard-DF1EcSpm.js";import{t as C}from"./server-BqZ-w6M8.js";import{T as w,V as T,X as E,Z as D,b as O,c as k,v as A,x as j}from"./index-hxvDvCS7.js";import{t as M}from"./SegmentedControl-C_hEVQMB.js";import{r as N}from"./useResource-CDGSq2At.js";var P={name:`list-todo`,size:24,node:[[`path`,{d:`M13 5h8`,key:`a7qcls`}],[`path`,{d:`M13 12h8`,key:`h98zly`}],[`path`,{d:`M13 19h8`,key:`c3s6r1`}],[`path`,{d:`m3 17 2 2 4-4`,key:`1jhpwq`}],[`rect`,{x:`3`,y:`4`,width:`6`,height:`6`,rx:`1`,key:`cif1o7`}]]};P.node;var F=r(P),I=e(n(),1),L=[`needs_input`,`failed`,`ready_for_review`,`unsupported_interaction`,`host_unreachable`];function R(e){let t=Object.fromEntries(L.map(e=>[e,[]]));for(let n of e)t[n.reason]?.push(n);return t}function z(e){return e===`dismissed`||e===`history`?e:`open`}function B(e,t){return t===`history`?[]:e.filter(e=>t===`open`?!e.acknowledgedAt:!!e.acknowledgedAt)}function V(e,t,n){return[e?.name,t?.title,n&&n.title!==t?.title?n.title:null].filter(Boolean).join(` · `)||`Switchyard`}function H(e){let t=N(e?`attention-history`:null,e=>l(`/api/attention`,{resolvedOnly:`true`,limit:200},e),{refreshMs:3e4,check:Array.isArray}),n=y(e=>e.attention),r=(0,I.useRef)(!0),{reload:i}=t;return(0,I.useEffect)(()=>{if(r.current){r.current=!1;return}if(!e)return;let t=setTimeout(i,500);return()=>clearTimeout(t)},[n,e,i]),t}var U=i(),W={needs_input:`Questions from Pi waiting for your answer.`,failed:`Runs that failed or were blocked. Open the task to see why.`,ready_for_review:`Finished runs waiting for your review.`,unsupported_interaction:`Questions this client cannot display. Answer them in a terminal attached to the session.`,host_unreachable:`Running work on hosts that stopped responding. Nothing is restarted elsewhere.`};function G(){let e=f(),t=y(e=>e.hydrated),[n,r]=A(`attentionShow`,`open`),i=z(n),s=e=>r(e),c=(0,I.useMemo)(()=>B(e,i),[e,i]),l=(0,I.useMemo)(()=>B(e,`dismissed`).length,[e]),u=(0,I.useMemo)(()=>R(c),[c]),d=H(i===`history`);return(0,U.jsxs)(`div`,{className:`flex w-full min-w-0 flex-col gap-4 px-4 pb-4 safe-pt-4 md:px-6`,children:[(0,U.jsxs)(`header`,{className:`flex min-w-0 flex-wrap items-center gap-3`,children:[(0,U.jsx)(`h1`,{className:`flex-1 text-lg font-semibold`,children:`Attention`}),(0,U.jsx)(M,{label:`Show`,className:`max-sm:w-full max-sm:basis-full`,value:i,onChange:s,options:[{value:`open`,label:`Open`},{value:`dismissed`,label:`Dismissed`},{value:`history`,label:`History`}]})]}),(0,U.jsx)(m,{subject:`attention items`,consequence:`Answers are sent once the connection is back.`,show:t}),i===`history`?(0,U.jsx)(`div`,{"data-testid":`attention-history`,className:`flex min-w-0 flex-col gap-2`,children:!d.data&&d.loading?(0,U.jsx)(o,{label:`Loading history…`}):!d.data&&d.error?(0,U.jsx)(p,{compact:!0,title:`Could not load history`,error:v(d.error),onRetry:d.reload}):!d.data||d.data.length===0?(0,U.jsx)(h,{icon:(0,U.jsx)(a,{className:`size-8`}),title:`No history yet`,description:`Resolved questions, failures and reviews show up here.`}):(0,U.jsxs)(U.Fragment,{children:[(0,U.jsx)(`ul`,{className:`flex min-w-0 flex-col gap-2`,children:d.data.map(e=>(0,U.jsx)(`li`,{className:`min-w-0`,children:(0,U.jsx)(q,{item:e})},e.id))}),d.data.length>=200&&(0,U.jsxs)(`p`,{className:`text-sm text-muted`,children:[`Showing the `,200,` most recent.`]})]})}):t?c.length===0?i===`dismissed`?(0,U.jsx)(h,{icon:(0,U.jsx)(D,{className:`size-8`}),title:`No dismissed items`,description:`Items you dismiss stay here until their question or task is resolved.`,action:{label:`Show open`,onClick:()=>s(`open`)}}):(0,U.jsx)(h,{icon:(0,U.jsx)(D,{className:`size-8`}),title:l>0?`All caught up`:`Nothing needs your attention`,description:l>0?`${l} dismissed ${l===1?`item is`:`items are`} still open.`:`Questions, failures and finished work show up here.`,action:l>0?{label:`Show dismissed`,onClick:()=>s(`dismissed`)}:{label:`Go to Sessions`,to:k.code},secondaryAction:l>0?{label:`Go to Sessions`,to:k.code}:{label:`Go to Board`,to:k.board}}):L.filter(e=>u[e].length>0).map(e=>{let t=j[e],n=t.icon;return(0,U.jsxs)(`section`,{"data-testid":`attention-group-${e}`,"aria-labelledby":`att-${e}`,className:`flex min-w-0 flex-col gap-2`,children:[(0,U.jsxs)(`div`,{children:[(0,U.jsxs)(`h2`,{id:`att-${e}`,className:`flex items-center gap-2 text-base font-semibold`,children:[(0,U.jsx)(n,{"aria-hidden":!0,className:`size-4 text-muted`}),t.label,(0,U.jsxs)(`span`,{className:`text-sm font-normal text-muted`,children:[`(`,u[e].length,`)`]})]}),(0,U.jsx)(`p`,{className:`text-sm text-muted`,children:W[e]})]}),(0,U.jsx)(`ul`,{className:`flex min-w-0 flex-col gap-2`,children:u[e].map(e=>(0,U.jsx)(`li`,{className:`min-w-0`,children:(0,U.jsx)(K,{item:e})},e.id))})]},e)}):(0,U.jsx)(o,{label:`Loading attention…`})]})}function K({item:e}){let n=y(t=>e.projectId?t.projects[e.projectId]:void 0),r=y(t=>e.taskId?t.tasks[e.taskId]:void 0),i=y(t=>e.sessionId?t.sessions[e.sessionId]:void 0),a=y(e=>i?e.hosts[i.hostId]:void 0),o=y(t=>e.interactionId?t.interactions[e.interactionId]:void 0),[l,f]=(0,I.useState)(!1),[m,h]=(0,I.useState)(null),D=async()=>{f(!0),h(null);try{let t=await _(`/api/attention/${encodeURIComponent(e.id)}/acknowledge`),n=t&&typeof t==`object`&&`id`in t?t:{...e,acknowledgedAt:new Date().toISOString()};y.setState(t=>t.attention[e.id]?{attention:{...t.attention,[e.id]:n}}:{}),O.success(`Dismissed. It stays under All until the task or question is resolved.`)}catch(e){h(e)}finally{f(!1)}},A=e.sessionId?e.interactionId?k.interaction(e.sessionId,e.interactionId):k.session(e.sessionId):null,M=!!a&&a.connectivity!==`connected`,N=null;switch(e.reason){case`needs_input`:N=o&&o.state===`pending`?(0,U.jsx)(S,{flush:!0,interaction:o,readOnlyReason:M?`Host ${a?.name} is offline. You can answer once it reconnects.`:i?.readOnly?`This session is read-only.`:null}):o?(0,U.jsx)(S,{flush:!0,interaction:o}):A?(0,U.jsxs)(t,{to:A,className:c(`primary`,`sm`),children:[(0,U.jsx)(b,{"aria-hidden":!0,className:`size-3.5`}),`Answer in session`]}):null;break;case`failed`:N=e.taskId?(0,U.jsxs)(t,{to:k.task(e.taskId),className:c(`primary`,`sm`),children:[(0,U.jsx)(F,{"aria-hidden":!0,className:`size-3.5`}),`Open task`]}):null;break;case`ready_for_review`:N=e.sessionId?(0,U.jsxs)(t,{to:`${k.session(e.sessionId)}?tab=changes`,className:c(`primary`,`sm`),children:[(0,U.jsx)(T,{"aria-hidden":!0,className:`size-3.5`}),`Review changes`]}):e.taskId?(0,U.jsxs)(t,{to:k.task(e.taskId),className:c(`primary`,`sm`),children:[(0,U.jsx)(T,{"aria-hidden":!0,className:`size-3.5`}),`Open review`]}):null;break;case`unsupported_interaction`:N=o?(0,U.jsx)(S,{interaction:o,readOnlyReason:M?`Host ${a?.name} is offline. You can choose once it reconnects.`:i?.readOnly?`This session is read-only.`:null}):(0,U.jsx)(g,{capability:`This dialog`,reason:`An extension opened a terminal-only dialog. In RPC mode Pi gave it no answer, so the extension continued without one.`});break;case`host_unreachable`:N=a?(0,U.jsx)(d,{compact:!0,hostName:a.name,connectivity:a.connectivity===`reconnecting`?`reconnecting`:`unreachable`,lastSeenAt:a.lastSeenAt}):null}let P=V(n,r,i),L=!!o&&(e.reason===`needs_input`||e.reason===`unsupported_interaction`);return e.reason===`needs_input`&&o?.state===`pending`&&x(o.presentation)?(0,U.jsxs)(`article`,{"aria-label":`Plan awaiting approval: ${P}`,className:`flex min-w-0 flex-col gap-2`,children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-sm text-muted`,children:[(0,U.jsx)(`span`,{className:`min-w-0 basis-full truncate sm:basis-auto sm:flex-1`,children:P}),A&&(0,U.jsxs)(t,{to:A,className:c(`ghost`,`sm`),children:[(0,U.jsx)(b,{"aria-hidden":!0,className:`size-3.5`}),`Open session`]}),(0,U.jsx)(`time`,{dateTime:e.createdAt,className:`shrink-0 text-xs text-subtle sm:ml-auto`,children:u(e.createdAt)}),!e.acknowledgedAt&&(0,U.jsx)(s,{size:`sm`,variant:`ghost`,busy:l,onClick:()=>void D(),children:`Dismiss`})]}),N,m!==null&&(0,U.jsx)(p,{compact:!0,title:`Could not dismiss`,error:v(m),onRetry:()=>void D()})]}):(0,U.jsxs)(`article`,{"aria-label":`${j[e.reason].label}: ${r?.title??i?.title??e.summary}`,className:`flex min-w-0 flex-col gap-2 rounded-lg border border-border bg-surface p-3`,children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,U.jsx)(w,{kind:`attention`,value:e.reason,size:`sm`}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs text-muted`,children:P}),(0,U.jsx)(`time`,{dateTime:e.createdAt,className:`shrink-0 text-xs text-subtle`,children:u(e.createdAt)})]}),!L&&(0,U.jsx)(`p`,{className:`min-w-0 text-sm break-words`,children:e.summary}),N&&(0,U.jsx)(`div`,{className:`flex min-w-0 flex-col items-start`,children:N}),(0,U.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[e.reason!==`failed`&&e.taskId&&(0,U.jsxs)(t,{to:k.task(e.taskId),className:c(`ghost`,`sm`),children:[(0,U.jsx)(F,{"aria-hidden":!0,className:`size-3.5`}),`Task`]}),A&&(0,U.jsxs)(t,{to:A,className:c(`ghost`,`sm`),children:[(0,U.jsx)(b,{"aria-hidden":!0,className:`size-3.5`}),`Open session`]}),e.reason===`host_unreachable`&&a&&(0,U.jsxs)(t,{to:`${k.settings(`hosts`)}/${encodeURIComponent(a.id)}`,className:c(`ghost`,`sm`),children:[(0,U.jsx)(C,{"aria-hidden":!0,className:`size-3.5`}),`Host details`]}),(0,U.jsx)(`span`,{className:`ml-auto`}),e.acknowledgedAt?(0,U.jsxs)(`span`,{className:`inline-flex items-center gap-1 text-xs text-muted`,children:[(0,U.jsx)(E,{"aria-hidden":!0,className:`size-3.5`}),`Dismissed `,u(e.acknowledgedAt)]}):(0,U.jsx)(s,{size:`sm`,busy:l,onClick:()=>void D(),children:`Dismiss`})]}),m!==null&&(0,U.jsx)(p,{compact:!0,title:`Could not dismiss`,error:v(m),onRetry:()=>void D()})]})}function q({item:e}){let n=y(t=>e.projectId?t.projects[e.projectId]:void 0),r=y(t=>e.taskId?t.tasks[e.taskId]:void 0),i=y(t=>e.sessionId?t.sessions[e.sessionId]:void 0);return(0,U.jsxs)(`article`,{"aria-label":`${j[e.reason].label}: ${r?.title??i?.title??e.summary}`,className:`flex min-w-0 flex-col gap-2 rounded-lg border border-border bg-surface p-3`,children:[(0,U.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[(0,U.jsx)(w,{kind:`attention`,value:e.reason,size:`sm`}),(0,U.jsx)(`span`,{className:`min-w-0 flex-1 truncate text-xs text-muted`,children:V(n,r,i)}),e.resolvedAt&&(0,U.jsxs)(`time`,{dateTime:e.resolvedAt,className:`shrink-0 text-xs text-subtle`,children:[`Resolved `,u(e.resolvedAt)]})]}),(0,U.jsx)(`p`,{className:`min-w-0 text-sm break-words`,children:e.summary}),(e.taskId||e.sessionId)&&(0,U.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2`,children:[e.taskId&&(0,U.jsxs)(t,{to:k.task(e.taskId),className:c(`ghost`,`sm`),children:[(0,U.jsx)(F,{"aria-hidden":!0,className:`size-3.5`}),`Task`]}),e.sessionId&&(0,U.jsxs)(t,{to:k.session(e.sessionId),className:c(`ghost`,`sm`),children:[(0,U.jsx)(b,{"aria-hidden":!0,className:`size-3.5`}),`Open session`]})]})]})}export{G as default};
|
|
2
|
-
//# sourceMappingURL=attention-V86Gye3I.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,i as t,m as n,n as r,t as i}from"./jsx-runtime-D13aM9HY.js";import{_ as a,c as o,d as s,f as c,gt as l,h as u,n as d,r as f,s as p,t as m,tt as h,z as g}from"./states-ZhrxQa3K.js";import{t as _}from"./calendar-clock-B8zE4JsX.js";import{t as v}from"./chevron-right-evVLS6hq.js";import{t as y}from"./hand-UPoHamrn.js";import{t as b}from"./link-2-CaMlUDRG.js";import{t as x}from"./play-CjoDg3ws.js";import{i as S,t as C}from"./useBackTo-BIrCq3W2.js";import{M as w,N as T,U as E,m as D}from"./index-hxvDvCS7.js";import{t as O}from"./Switch-DBfzmqkm.js";import{C as k,D as A,O as j,T as M,_ as N,c as P,k as F,p as I}from"./describe-D6KLGKWa.js";var L={name:`webhook`,size:24,node:[[`path`,{d:`M18 16.98h-5.99c-1.1 0-1.95.94-2.48 1.9A4 4 0 0 1 2 17c.01-.7.2-1.4.57-2`,key:`q3hayz`}],[`path`,{d:`m6 17 3.13-5.78c.53-.97.1-2.18-.5-3.1a4 4 0 1 1 6.89-4.06`,key:`1go1hn`}],[`path`,{d:`m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8`,key:`qlwsc0`}]]};L.node;var R=r(L),z=e(n(),1),B=i(),V=`/automations/new`,H=e=>`/automations/${encodeURIComponent(e)}`,U={manual:y,once:E,cron:_,webhook:R,dependency:b};function W(){let e=g(e=>e.hydrated),n=A(),r=g(e=>e.projects),i=g(e=>e.hosts),a=g(e=>e.tasks),s=D(),[u,_]=(0,z.useState)({status:`idle`}),v=(0,z.useCallback)(async()=>{_({status:`loading`});try{let e=await l(`/api/automations`),t=Array.isArray(e)?e:e&&typeof e==`object`&&Array.isArray(e.items)?e.items:null,n=t?h.array().safeParse(t):null;if(!n?.success){_({status:`fatal`,error:Error(`The coordinator returned automations in an unexpected format.`)});return}M.getState().putMany(n.data),_({status:`done`})}catch(e){_({status:`error`,error:e})}},[]);(0,z.useEffect)(()=>{e||v()},[e,v]);let y=(0,z.useMemo)(()=>Object.values(n).sort((e,t)=>e.name.localeCompare(t.name)),[n]),b=e||u.status===`done`,x;return x=b?y.length===0?(0,B.jsx)(m,{icon:(0,B.jsx)(w,{className:`size-8`}),title:`No automations yet`,description:`Automations create tasks on a schedule, from a webhook, or when another task is done.`,action:{label:`Create an automation`,to:V,icon:(0,B.jsx)(S,{className:`size-4`})}}):(0,B.jsx)(K,{automations:y,projects:r,hosts:i,tasks:a,table:s===`desktop`}):u.status===`fatal`?(0,B.jsx)(f,{error:u.error}):u.status===`error`?(0,B.jsx)(d,{title:`Could not load automations`,error:u.error,onRetry:()=>void v()}):(0,B.jsx)(o,{label:`Loading automations…`}),(0,B.jsxs)(`div`,{className:`flex w-full min-w-0 flex-col gap-4 px-4 py-4 md:px-6`,children:[(0,B.jsxs)(`header`,{className:`flex flex-wrap items-center justify-between gap-3`,children:[(0,B.jsxs)(`div`,{className:`min-w-0`,children:[(0,B.jsx)(`h1`,{className:`text-lg font-semibold`,children:`Automations`}),(0,B.jsx)(`p`,{className:`text-sm text-muted`,children:`Scheduled, webhook and dependency automations. Routine successes stay in each automation's history.`})]}),(0,B.jsxs)(t,{to:V,state:C,className:c(`primary`),children:[(0,B.jsx)(S,{"aria-hidden":!0,className:`size-4`}),`New automation`]})]}),(0,B.jsx)(p,{subject:`automations`,consequence:`Changes are sent once the coordinator is reachable again.`}),x]})}var G=`grid grid-cols-[minmax(0,2.4fr)_minmax(0,1fr)_5.5rem_minmax(0,1.2fr)_minmax(0,1.4fr)_7.5rem_7rem_auto] items-center gap-3`;function K({automations:e,projects:t,hosts:n,tasks:r,table:i}){let{busy:o,toggle:s}=F(),{busy:c,run:l}=j(),u=(0,z.useCallback)(e=>r[e]?.title,[r]);return(0,B.jsxs)(`div`,{className:`min-w-0 overflow-hidden rounded-lg border border-border bg-surface`,children:[i&&(0,B.jsxs)(`div`,{"aria-hidden":!0,className:a(G,`border-b border-border bg-surface-2 px-4 py-2 text-xs font-medium text-muted`),children:[(0,B.jsx)(`span`,{children:`Automation`}),(0,B.jsx)(`span`,{children:`Project`}),(0,B.jsx)(`span`,{children:`Mode`}),(0,B.jsx)(`span`,{children:`Next occurrence`}),(0,B.jsx)(`span`,{children:`Last outcome`}),(0,B.jsx)(`span`,{children:`Failures`}),(0,B.jsx)(`span`,{children:`Enabled`}),(0,B.jsx)(`span`,{className:`sr-only`,children:`Actions`})]}),(0,B.jsx)(`ul`,{"data-testid":`automations-list`,className:`divide-y divide-border`,children:e.map(e=>{let r=t[e.projectId],a=e.hostId??r?.defaultHostId??null,d=a?n[a]:void 0,f={automation:e,projectName:r?.name??`Unknown project`,host:d,trigger:P(e.trigger,{taskTitle:u}),toggling:!!o[e.id],running:!!c[e.id],onToggle:t=>void s(e,t),onRun:()=>void l(e)};return(0,B.jsx)(`li`,{"data-testid":`automation-row`,"data-automation-id":e.id,children:i?(0,B.jsx)(Z,{...f}):(0,B.jsx)(Q,{...f})},e.id)})})]})}function q({automation:e,trigger:t}){let n=U[e.trigger.kind];return(0,B.jsxs)(`span`,{className:`flex min-w-0 items-start gap-1.5 text-sm text-muted`,children:[(0,B.jsx)(n,{"aria-hidden":!0,className:`mt-0.5 size-3.5 shrink-0`}),(0,B.jsx)(`span`,{className:`min-w-0 break-words`,children:t})]})}function J({automation:e}){if(!e.enabled)return(0,B.jsx)(`span`,{className:`text-sm text-muted`,children:`Disabled`});if(!e.nextAt){let t=e.trigger.kind;return(0,B.jsx)(`span`,{className:`text-sm text-muted`,children:t===`manual`?`On demand`:t===`webhook`?`On webhook`:t===`dependency`?`When the task is done`:`None scheduled`})}return(0,B.jsxs)(`span`,{className:`flex min-w-0 flex-col text-sm`,children:[(0,B.jsx)(`span`,{children:u(e.nextAt)}),(0,B.jsx)(`time`,{dateTime:e.nextAt,className:`text-xs text-muted`,children:I(e.nextAt)})]})}function Y({host:e}){return!e||e.connectivity===`connected`?null:(0,B.jsxs)(`span`,{className:`flex items-center gap-1 text-xs text-danger`,children:[(0,B.jsx)(T,{"aria-hidden":!0,className:`size-3.5 shrink-0`}),(0,B.jsxs)(`span`,{className:`min-w-0 break-words`,children:[`Host `,e.name,` `,e.connectivity===`reconnecting`?`reconnecting`:`unreachable`]})]})}function X({running:e,onRun:t,name:n}){return(0,B.jsx)(s,{size:`sm`,busy:e,icon:(0,B.jsx)(x,{className:`size-3.5`}),onClick:t,"aria-label":`Run ${n} now`,children:`Run now`})}function Z(e){let n=e.automation;return(0,B.jsxs)(`div`,{className:a(G,`px-4 py-3`),children:[(0,B.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,B.jsx)(t,{to:H(n.id),state:C,className:`truncate font-medium text-text hover:underline focus-visible:underline`,children:n.name}),(0,B.jsx)(q,{automation:n,trigger:e.trigger})]}),(0,B.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,B.jsx)(`span`,{className:`sr-only`,children:`Project: `}),(0,B.jsx)(`span`,{className:`truncate text-sm`,children:e.projectName}),(0,B.jsx)(Y,{host:e.host})]}),(0,B.jsxs)(`span`,{className:`text-sm`,children:[(0,B.jsx)(`span`,{className:`sr-only`,children:`Mode: `}),N(n.mode)]}),(0,B.jsxs)(`div`,{className:`min-w-0`,children:[(0,B.jsx)(`span`,{className:`sr-only`,children:`Next occurrence: `}),(0,B.jsx)(J,{automation:n})]}),(0,B.jsxs)(`div`,{className:`min-w-0 text-sm break-words`,children:[(0,B.jsx)(`span`,{className:`sr-only`,children:`Last outcome: `}),n.lastOutcome??(0,B.jsx)(`span`,{className:`text-muted`,children:`No runs yet`})]}),(0,B.jsx)(k,{count:n.failureCount}),(0,B.jsx)(O,{checked:n.enabled,onChange:e.onToggle,busy:e.toggling,label:`Enable ${n.name}`,onText:`Enabled`,offText:`Disabled`}),(0,B.jsxs)(`div`,{className:`flex items-center gap-1`,children:[(0,B.jsx)(X,{running:e.running,onRun:e.onRun,name:n.name}),(0,B.jsx)(t,{to:H(n.id),state:C,"aria-label":`Edit ${n.name}`,title:`Edit`,className:`tap inline-flex size-9 items-center justify-center rounded-md text-muted hover:bg-surface-2 hover:text-text`,children:(0,B.jsx)(v,{"aria-hidden":!0,className:`size-4`})})]})]})}function Q(e){let n=e.automation;return(0,B.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-2 px-4 py-3`,children:[(0,B.jsxs)(`div`,{className:`flex min-w-0 items-start justify-between gap-2`,children:[(0,B.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-0.5`,children:[(0,B.jsx)(t,{to:H(n.id),state:C,className:`font-medium break-words text-text hover:underline focus-visible:underline`,children:n.name}),(0,B.jsx)(q,{automation:n,trigger:e.trigger})]}),(0,B.jsx)(O,{checked:n.enabled,onChange:e.onToggle,busy:e.toggling,label:`Enable ${n.name}`,onText:`Enabled`,offText:`Disabled`})]}),(0,B.jsxs)(`dl`,{className:`grid min-w-0 grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 text-sm`,children:[(0,B.jsx)(`dt`,{className:`text-muted`,children:`Project`}),(0,B.jsxs)(`dd`,{className:`flex min-w-0 flex-col break-words`,children:[e.projectName,(0,B.jsx)(Y,{host:e.host})]}),(0,B.jsx)(`dt`,{className:`text-muted`,children:`Mode`}),(0,B.jsx)(`dd`,{children:N(n.mode)}),(0,B.jsx)(`dt`,{className:`text-muted`,children:`Next`}),(0,B.jsx)(`dd`,{className:`min-w-0`,children:(0,B.jsx)(J,{automation:n})}),(0,B.jsx)(`dt`,{className:`text-muted`,children:`Last outcome`}),(0,B.jsx)(`dd`,{className:`min-w-0 break-words`,children:n.lastOutcome??(0,B.jsx)(`span`,{className:`text-muted`,children:`No runs yet`})}),(0,B.jsx)(`dt`,{className:`text-muted`,children:`Failures`}),(0,B.jsx)(`dd`,{children:(0,B.jsx)(k,{count:n.failureCount})})]}),(0,B.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,B.jsx)(X,{running:e.running,onRun:e.onRun,name:n.name}),(0,B.jsxs)(t,{to:H(n.id),state:C,className:c(`ghost`,`sm`),children:[`Edit`,(0,B.jsx)(v,{"aria-hidden":!0,className:`size-3.5`})]})]})]})}export{W as default};
|
|
2
|
-
//# sourceMappingURL=automations-Cw5Gacgm.js.map
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{_ as e,d as t,f as n,i as r,m as i,n as a,t as o}from"./jsx-runtime-D13aM9HY.js";import{A as s,B as c,C as l,E as u,K as d,P as f,T as p,U as m,_ as h,bt as g,c as _,d as v,f as y,g as b,h as x,i as S,m as C,n as w,o as T,p as E,q as D,t as O,u as ee,w as k,yt as A,z as j}from"./states-ZhrxQa3K.js";import{a as M,i as te,t as N}from"./Field-D-Ty7fKT.js";import{n as P,r as ne,t as re}from"./Menu-BfOszNC4.js";import{t as ie}from"./chevron-right-evVLS6hq.js";import{n as F,r as ae}from"./Priority-CHmzfoHg.js";import{t as I}from"./external-link-3jjTxo92.js";import{A as oe,C as L,D as se,E as ce,F as le,I as ue,M as de,N as R,O as fe,P as pe,S as me,T as he,_ as ge,a as _e,b as ve,c as ye,d as be,f as xe,g as Se,h as Ce,i as we,j as Te,k as Ee,l as De,m as Oe,n as ke,o as Ae,p as z,r as je,s as Me,t as Ne,u as Pe,v as Fe,w as Ie,x as Le,y as Re}from"./useNow-Dj7oEiwn.js";import{n as ze,t as Be}from"./pencil-DI8QbCN8.js";import{t as Ve}from"./link-2-CaMlUDRG.js";import{t as He}from"./play-CjoDg3ws.js";import{i as Ue,r as We,t as Ge}from"./useBackTo-BIrCq3W2.js";import{t as Ke}from"./search-C6cn5WOo.js";import{t as qe}from"./server-BqZ-w6M8.js";import{A as Je,D as Ye,E as Xe,F as Ze,H as Qe,I as $e,T as et,U as tt,V as nt,X as rt,Z as it,b as B,c as V,g as at,m as ot,q as st,rt as ct,v as lt,w as ut,x as dt,y as ft}from"./index-hxvDvCS7.js";import{i as pt,n as mt,o as ht,r as gt,t as _t}from"./Overlay-DUQwh6_b.js";import{n as vt,r as H}from"./TextArea-CKybrQyn.js";import{t as yt}from"./TextLink-OzzyP2-p.js";import{n as bt,r as xt,t as St}from"./Tabs-BNuL3_Et.js";import{t as Ct}from"./SegmentedControl-C_hEVQMB.js";import{r as wt}from"./useResource-CDGSq2At.js";import{t as Tt}from"./Select-Cfql4Nwu.js";import{t as Et}from"./Checkbox-D6tRfEeI.js";var Dt={name:`arrow-right-left`,size:24,node:[[`path`,{d:`m16 3 4 4-4 4`,key:`1x1c3m`}],[`path`,{d:`M20 7H4`,key:`zbl0bi`}],[`path`,{d:`m8 21-4-4 4-4`,key:`h9nckh`}],[`path`,{d:`M4 17h16`,key:`g4d7ey`}]]};Dt.node;var Ot=a(Dt),kt={name:`columns-3`,size:24,node:[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`M15 3v18`,key:`14nvp0`}]],aliases:[`panels-left-right`]};kt.node;var At=a(kt),jt={name:`grip-vertical`,size:24,node:[[`circle`,{cx:`9`,cy:`12`,r:`1`,key:`1vctgf`}],[`circle`,{cx:`9`,cy:`5`,r:`1`,key:`hp0tcf`}],[`circle`,{cx:`9`,cy:`19`,r:`1`,key:`fkjjf6`}],[`circle`,{cx:`15`,cy:`12`,r:`1`,key:`1tmaij`}],[`circle`,{cx:`15`,cy:`5`,r:`1`,key:`19l28e`}],[`circle`,{cx:`15`,cy:`19`,r:`1`,key:`f4zoj3`}]]};jt.node;var Mt=a(jt),Nt={name:`list`,size:24,node:[[`path`,{d:`M3 5h.01`,key:`18ugdj`}],[`path`,{d:`M3 12h.01`,key:`nlz23k`}],[`path`,{d:`M3 19h.01`,key:`noohij`}],[`path`,{d:`M8 5h13`,key:`1pao27`}],[`path`,{d:`M8 12h13`,key:`1za7za`}],[`path`,{d:`M8 19h13`,key:`m83p4d`}]]};Nt.node;var Pt=a(Nt),Ft={name:`message-square-warning`,size:24,node:[[`path`,{d:`M22 17a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 21.286V5a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2z`,key:`18887p`}],[`path`,{d:`M12 15h.01`,key:`q59x07`}],[`path`,{d:`M12 7v4`,key:`xawao1`}]]};Ft.node;var It=a(Ft),Lt={name:`rotate-ccw`,size:24,node:[[`path`,{d:`M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8`,key:`1357e3`}],[`path`,{d:`M3 3v5h5`,key:`1xhq8a`}]]};Lt.node;var Rt=a(Lt),zt=ct(),U=e(i()),Bt=typeof window<`u`&&window.document!==void 0&&window.document.createElement!==void 0;function Vt(e){let t=Object.prototype.toString.call(e);return t===`[object Window]`||t===`[object global]`}function Ht(e){return`nodeType`in e}function W(e){return e?Vt(e)?e:Ht(e)?e.ownerDocument?.defaultView??window:window:window}function Ut(e){let{Document:t}=W(e);return e instanceof t}function Wt(e){return!Vt(e)&&e instanceof W(e).HTMLElement}function Gt(e){return e instanceof W(e).SVGElement}function Kt(e){return e?Vt(e)?e.document:Ht(e)?Ut(e)?e:Wt(e)||Gt(e)?e.ownerDocument:document:document:document}var G=Bt?U.useLayoutEffect:U.useEffect;function qt(e){let t=(0,U.useRef)(e);return G(()=>{t.current=e}),(0,U.useCallback)(function(){var e=[...arguments];return t.current==null?void 0:t.current(...e)},[])}function Jt(){let e=(0,U.useRef)(null);return[(0,U.useCallback)((t,n)=>{e.current=setInterval(t,n)},[]),(0,U.useCallback)(()=>{e.current!==null&&(clearInterval(e.current),e.current=null)},[])]}function Yt(e,t){t===void 0&&(t=[e]);let n=(0,U.useRef)(e);return G(()=>{n.current!==e&&(n.current=e)},t),n}function Xt(e,t){let n=(0,U.useRef)();return(0,U.useMemo)(()=>{let t=e(n.current);return n.current=t,t},[...t])}function Zt(e){let t=qt(e),n=(0,U.useRef)(null);return[n,(0,U.useCallback)(e=>{e!==n.current&&t?.(e,n.current),n.current=e},[])]}function Qt(e){let t=(0,U.useRef)();return(0,U.useEffect)(()=>{t.current=e},[e]),t.current}var $t={};function en(e,t){return(0,U.useMemo)(()=>{if(t)return t;let n=$t[e]==null?0:$t[e]+1;return $t[e]=n,e+`-`+n},[e,t])}function tn(e){return function(t){return[...arguments].slice(1).reduce((t,n)=>{let r=Object.entries(n);for(let[n,i]of r){let r=t[n];r!=null&&(t[n]=r+e*i)}return t},{...t})}}var nn=tn(1),rn=tn(-1);function an(e){return`clientX`in e&&`clientY`in e}function on(e){if(!e)return!1;let{KeyboardEvent:t}=W(e.target);return t&&e instanceof t}function sn(e){if(!e)return!1;let{TouchEvent:t}=W(e.target);return t&&e instanceof t}function cn(e){if(sn(e)){if(e.touches&&e.touches.length){let{clientX:t,clientY:n}=e.touches[0];return{x:t,y:n}}if(e.changedTouches&&e.changedTouches.length){let{clientX:t,clientY:n}=e.changedTouches[0];return{x:t,y:n}}}return an(e)?{x:e.clientX,y:e.clientY}:null}var ln=Object.freeze({Translate:{toString(e){if(!e)return;let{x:t,y:n}=e;return`translate3d(`+(t?Math.round(t):0)+`px, `+(n?Math.round(n):0)+`px, 0)`}},Scale:{toString(e){if(!e)return;let{scaleX:t,scaleY:n}=e;return`scaleX(`+t+`) scaleY(`+n+`)`}},Transform:{toString(e){if(e)return[ln.Translate.toString(e),ln.Scale.toString(e)].join(` `)}},Transition:{toString(e){let{property:t,duration:n,easing:r}=e;return t+` `+n+`ms `+r}}}),un=`a,frame,iframe,input:not([type=hidden]):not(:disabled),select:not(:disabled),textarea:not(:disabled),button:not(:disabled),*[tabindex]`;function dn(e){return e.matches(un)?e:e.querySelector(un)}var fn={display:`none`};function pn(e){let{id:t,value:n}=e;return U.createElement(`div`,{id:t,style:fn},n)}function mn(e){let{id:t,announcement:n,ariaLiveType:r=`assertive`}=e;return U.createElement(`div`,{id:t,style:{position:`fixed`,top:0,left:0,width:1,height:1,margin:-1,border:0,padding:0,overflow:`hidden`,clip:`rect(0 0 0 0)`,clipPath:`inset(100%)`,whiteSpace:`nowrap`},role:`status`,"aria-live":r,"aria-atomic":!0},n)}function hn(){let[e,t]=(0,U.useState)(``);return{announce:(0,U.useCallback)(e=>{e!=null&&t(e)},[]),announcement:e}}var gn=(0,U.createContext)(null);function _n(e){let t=(0,U.useContext)(gn);(0,U.useEffect)(()=>{if(!t)throw Error(`useDndMonitor must be used within a children of <DndContext>`);return t(e)},[e,t])}function vn(){let[e]=(0,U.useState)(()=>new Set),t=(0,U.useCallback)(t=>(e.add(t),()=>e.delete(t)),[e]);return[(0,U.useCallback)(t=>{let{type:n,event:r}=t;e.forEach(e=>e[n]?.call(e,r))},[e]),t]}var yn={draggable:`
|
|
2
|
-
To pick up a draggable item, press the space bar.
|
|
3
|
-
While dragging, use the arrow keys to move the item.
|
|
4
|
-
Press space again to drop the item in its new position, or press escape to cancel.
|
|
5
|
-
`},bn={onDragStart(e){let{active:t}=e;return`Picked up draggable item `+t.id+`.`},onDragOver(e){let{active:t,over:n}=e;return n?`Draggable item `+t.id+` was moved over droppable area `+n.id+`.`:`Draggable item `+t.id+` is no longer over a droppable area.`},onDragEnd(e){let{active:t,over:n}=e;return n?`Draggable item `+t.id+` was dropped over droppable area `+n.id:`Draggable item `+t.id+` was dropped.`},onDragCancel(e){let{active:t}=e;return`Dragging was cancelled. Draggable item `+t.id+` was dropped.`}};function xn(e){let{announcements:t=bn,container:n,hiddenTextDescribedById:r,screenReaderInstructions:i=yn}=e,{announce:a,announcement:o}=hn(),s=en(`DndLiveRegion`),[c,l]=(0,U.useState)(!1);if((0,U.useEffect)(()=>{l(!0)},[]),_n((0,U.useMemo)(()=>({onDragStart(e){let{active:n}=e;a(t.onDragStart({active:n}))},onDragMove(e){let{active:n,over:r}=e;t.onDragMove&&a(t.onDragMove({active:n,over:r}))},onDragOver(e){let{active:n,over:r}=e;a(t.onDragOver({active:n,over:r}))},onDragEnd(e){let{active:n,over:r}=e;a(t.onDragEnd({active:n,over:r}))},onDragCancel(e){let{active:n,over:r}=e;a(t.onDragCancel({active:n,over:r}))}}),[a,t])),!c)return null;let u=U.createElement(U.Fragment,null,U.createElement(pn,{id:r,value:i.draggable}),U.createElement(mn,{id:s,announcement:o}));return n?(0,zt.createPortal)(u,n):u}var K;(function(e){e.DragStart=`dragStart`,e.DragMove=`dragMove`,e.DragEnd=`dragEnd`,e.DragCancel=`dragCancel`,e.DragOver=`dragOver`,e.RegisterDroppable=`registerDroppable`,e.SetDroppableDisabled=`setDroppableDisabled`,e.UnregisterDroppable=`unregisterDroppable`})(K||={});function Sn(){}function Cn(e,t){return(0,U.useMemo)(()=>({sensor:e,options:t??{}}),[e,t])}function wn(){var e=[...arguments];return(0,U.useMemo)(()=>[...e].filter(e=>e!=null),[...e])}var q=Object.freeze({x:0,y:0});function Tn(e,t){return Math.sqrt((e.x-t.x)**2+(e.y-t.y)**2)}function En(e,t){let n=cn(e);if(!n)return`0 0`;let r={x:(n.x-t.left)/t.width*100,y:(n.y-t.top)/t.height*100};return r.x+`% `+r.y+`%`}function Dn(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return n-r}function On(e,t){let{data:{value:n}}=e,{data:{value:r}}=t;return r-n}function kn(e){let{left:t,top:n,height:r,width:i}=e;return[{x:t,y:n},{x:t+i,y:n},{x:t,y:n+r},{x:t+i,y:n+r}]}function An(e,t){if(!e||e.length===0)return null;let[n]=e;return t?n[t]:n}function jn(e,t,n){return t===void 0&&(t=e.left),n===void 0&&(n=e.top),{x:t+e.width*.5,y:n+e.height*.5}}var Mn=e=>{let{collisionRect:t,droppableRects:n,droppableContainers:r}=e,i=jn(t,t.left,t.top),a=[];for(let e of r){let{id:t}=e,r=n.get(t);if(r){let n=Tn(jn(r),i);a.push({id:t,data:{droppableContainer:e,value:n}})}}return a.sort(Dn)};function Nn(e,t){let n=Math.max(t.top,e.top),r=Math.max(t.left,e.left),i=Math.min(t.left+t.width,e.left+e.width),a=Math.min(t.top+t.height,e.top+e.height),o=i-r,s=a-n;if(r<i&&n<a){let n=t.width*t.height,r=e.width*e.height,i=o*s,a=i/(n+r-i);return Number(a.toFixed(4))}return 0}var Pn=e=>{let{collisionRect:t,droppableRects:n,droppableContainers:r}=e,i=[];for(let e of r){let{id:r}=e,a=n.get(r);if(a){let n=Nn(a,t);n>0&&i.push({id:r,data:{droppableContainer:e,value:n}})}}return i.sort(On)};function Fn(e,t){let{top:n,left:r,bottom:i,right:a}=t;return n<=e.y&&e.y<=i&&r<=e.x&&e.x<=a}var In=e=>{let{droppableContainers:t,droppableRects:n,pointerCoordinates:r}=e;if(!r)return[];let i=[];for(let e of t){let{id:t}=e,a=n.get(t);if(a&&Fn(r,a)){let n=kn(a).reduce((e,t)=>e+Tn(r,t),0),o=Number((n/4).toFixed(4));i.push({id:t,data:{droppableContainer:e,value:o}})}}return i.sort(Dn)};function Ln(e,t,n){return{...e,scaleX:t&&n?t.width/n.width:1,scaleY:t&&n?t.height/n.height:1}}function Rn(e,t){return e&&t?{x:e.left-t.left,y:e.top-t.top}:q}function zn(e){return function(t){return[...arguments].slice(1).reduce((t,n)=>({...t,top:t.top+e*n.y,bottom:t.bottom+e*n.y,left:t.left+e*n.x,right:t.right+e*n.x}),{...t})}}var Bn=zn(1);function Vn(e){if(e.startsWith(`matrix3d(`)){let t=e.slice(9,-1).split(/, /);return{x:+t[12],y:+t[13],scaleX:+t[0],scaleY:+t[5]}}if(e.startsWith(`matrix(`)){let t=e.slice(7,-1).split(/, /);return{x:+t[4],y:+t[5],scaleX:+t[0],scaleY:+t[3]}}return null}function Hn(e,t,n){let r=Vn(t);if(!r)return e;let{scaleX:i,scaleY:a,x:o,y:s}=r,c=e.left-o-(1-i)*parseFloat(n),l=e.top-s-(1-a)*parseFloat(n.slice(n.indexOf(` `)+1)),u=i?e.width/i:e.width,d=a?e.height/a:e.height;return{width:u,height:d,top:l,right:c+u,bottom:l+d,left:c}}var Un={ignoreTransform:!1};function Wn(e,t){t===void 0&&(t=Un);let n=e.getBoundingClientRect();if(t.ignoreTransform){let{transform:t,transformOrigin:r}=W(e).getComputedStyle(e);t&&(n=Hn(n,t,r))}let{top:r,left:i,width:a,height:o,bottom:s,right:c}=n;return{top:r,left:i,width:a,height:o,bottom:s,right:c}}function Gn(e){return Wn(e,{ignoreTransform:!0})}function Kn(e){let t=e.innerWidth,n=e.innerHeight;return{top:0,left:0,right:t,bottom:n,width:t,height:n}}function qn(e,t){return t===void 0&&(t=W(e).getComputedStyle(e)),t.position===`fixed`}function Jn(e,t){t===void 0&&(t=W(e).getComputedStyle(e));let n=/(auto|scroll|overlay)/;return[`overflow`,`overflowX`,`overflowY`].some(e=>{let r=t[e];return typeof r==`string`&&n.test(r)})}function Yn(e,t){let n=[];function r(i){if(t!=null&&n.length>=t||!i)return n;if(Ut(i)&&i.scrollingElement!=null&&!n.includes(i.scrollingElement))return n.push(i.scrollingElement),n;if(!Wt(i)||Gt(i)||n.includes(i))return n;let a=W(e).getComputedStyle(i);return i!==e&&Jn(i,a)&&n.push(i),qn(i,a)?n:r(i.parentNode)}return e?r(e):n}function Xn(e){let[t]=Yn(e,1);return t??null}function Zn(e){return!Bt||!e?null:Vt(e)?e:Ht(e)?Ut(e)||e===Kt(e).scrollingElement?window:Wt(e)?e:null:null}function Qn(e){return Vt(e)?e.scrollX:e.scrollLeft}function $n(e){return Vt(e)?e.scrollY:e.scrollTop}function er(e){return{x:Qn(e),y:$n(e)}}var J;(function(e){e[e.Forward=1]=`Forward`,e[e.Backward=-1]=`Backward`})(J||={});function tr(e){return!Bt||!e?!1:e===document.scrollingElement}function nr(e){let t={x:0,y:0},n=tr(e)?{height:window.innerHeight,width:window.innerWidth}:{height:e.clientHeight,width:e.clientWidth},r={x:e.scrollWidth-n.width,y:e.scrollHeight-n.height};return{isTop:e.scrollTop<=t.y,isLeft:e.scrollLeft<=t.x,isBottom:e.scrollTop>=r.y,isRight:e.scrollLeft>=r.x,maxScroll:r,minScroll:t}}var rr={x:.2,y:.2};function ir(e,t,n,r,i){let{top:a,left:o,right:s,bottom:c}=n;r===void 0&&(r=10),i===void 0&&(i=rr);let{isTop:l,isBottom:u,isLeft:d,isRight:f}=nr(e),p={x:0,y:0},m={x:0,y:0},h={height:t.height*i.y,width:t.width*i.x};return!l&&a<=t.top+h.height?(p.y=J.Backward,m.y=r*Math.abs((t.top+h.height-a)/h.height)):!u&&c>=t.bottom-h.height&&(p.y=J.Forward,m.y=r*Math.abs((t.bottom-h.height-c)/h.height)),!f&&s>=t.right-h.width?(p.x=J.Forward,m.x=r*Math.abs((t.right-h.width-s)/h.width)):!d&&o<=t.left+h.width&&(p.x=J.Backward,m.x=r*Math.abs((t.left+h.width-o)/h.width)),{direction:p,speed:m}}function ar(e){if(e===document.scrollingElement){let{innerWidth:e,innerHeight:t}=window;return{top:0,left:0,right:e,bottom:t,width:e,height:t}}let{top:t,left:n,right:r,bottom:i}=e.getBoundingClientRect();return{top:t,left:n,right:r,bottom:i,width:e.clientWidth,height:e.clientHeight}}function or(e){return e.reduce((e,t)=>nn(e,er(t)),q)}function sr(e){return e.reduce((e,t)=>e+Qn(t),0)}function cr(e){return e.reduce((e,t)=>e+$n(t),0)}function lr(e,t){if(t===void 0&&(t=Wn),!e)return;let{top:n,left:r,bottom:i,right:a}=t(e);Xn(e)&&(i<=0||a<=0||n>=window.innerHeight||r>=window.innerWidth)&&e.scrollIntoView({block:`center`,inline:`center`})}var ur=[[`x`,[`left`,`right`],sr],[`y`,[`top`,`bottom`],cr]],dr=class{constructor(e,t){this.rect=void 0,this.width=void 0,this.height=void 0,this.top=void 0,this.bottom=void 0,this.right=void 0,this.left=void 0;let n=Yn(t),r=or(n);this.rect={...e},this.width=e.width,this.height=e.height;for(let[e,t,i]of ur)for(let a of t)Object.defineProperty(this,a,{get:()=>{let t=i(n),o=r[e]-t;return this.rect[a]+o},enumerable:!0});Object.defineProperty(this,"rect",{enumerable:!1})}},fr=class{constructor(e){this.target=void 0,this.listeners=[],this.removeAll=()=>{this.listeners.forEach(e=>this.target?.removeEventListener(...e))},this.target=e}add(e,t,n){var r;(r=this.target)==null||r.addEventListener(e,t,n),this.listeners.push([e,t,n])}};function pr(e){let{EventTarget:t}=W(e);return e instanceof t?e:Kt(e)}function mr(e,t){let n=Math.abs(e.x),r=Math.abs(e.y);return typeof t==`number`?Math.sqrt(n**2+r**2)>t:`x`in t&&`y`in t?n>t.x&&r>t.y:`x`in t?n>t.x:`y`in t&&r>t.y}var Y;(function(e){e.Click=`click`,e.DragStart=`dragstart`,e.Keydown=`keydown`,e.ContextMenu=`contextmenu`,e.Resize=`resize`,e.SelectionChange=`selectionchange`,e.VisibilityChange=`visibilitychange`})(Y||={});function hr(e){e.preventDefault()}function gr(e){e.stopPropagation()}var X;(function(e){e.Space=`Space`,e.Down=`ArrowDown`,e.Right=`ArrowRight`,e.Left=`ArrowLeft`,e.Up=`ArrowUp`,e.Esc=`Escape`,e.Enter=`Enter`,e.Tab=`Tab`})(X||={});var _r={start:[X.Space,X.Enter],cancel:[X.Esc],end:[X.Space,X.Enter,X.Tab]},vr=(e,t)=>{let{currentCoordinates:n}=t;switch(e.code){case X.Right:return{...n,x:n.x+25};case X.Left:return{...n,x:n.x-25};case X.Down:return{...n,y:n.y+25};case X.Up:return{...n,y:n.y-25}}},yr=class{constructor(e){this.props=void 0,this.autoScrollEnabled=!1,this.referenceCoordinates=void 0,this.listeners=void 0,this.windowListeners=void 0,this.props=e;let{event:{target:t}}=e;this.props=e,this.listeners=new fr(Kt(t)),this.windowListeners=new fr(W(t)),this.handleKeyDown=this.handleKeyDown.bind(this),this.handleCancel=this.handleCancel.bind(this),this.attach()}attach(){this.handleStart(),this.windowListeners.add(Y.Resize,this.handleCancel),this.windowListeners.add(Y.VisibilityChange,this.handleCancel),setTimeout(()=>this.listeners.add(Y.Keydown,this.handleKeyDown))}handleStart(){let{activeNode:e,onStart:t}=this.props,n=e.node.current;n&&lr(n),t(q)}handleKeyDown(e){if(on(e)){let{active:t,context:n,options:r}=this.props,{keyboardCodes:i=_r,coordinateGetter:a=vr,scrollBehavior:o=`smooth`}=r,{code:s}=e;if(i.end.includes(s)){this.handleEnd(e);return}if(i.cancel.includes(s)){this.handleCancel(e);return}let{collisionRect:c}=n.current,l=c?{x:c.left,y:c.top}:q;this.referenceCoordinates||=l;let u=a(e,{active:t,context:n.current,currentCoordinates:l});if(u){let t=rn(u,l),r={x:0,y:0},{scrollableAncestors:i}=n.current;for(let n of i){let i=e.code,{isTop:a,isRight:s,isLeft:c,isBottom:l,maxScroll:d,minScroll:f}=nr(n),p=ar(n),m={x:Math.min(i===X.Right?p.right-p.width/2:p.right,Math.max(i===X.Right?p.left:p.left+p.width/2,u.x)),y:Math.min(i===X.Down?p.bottom-p.height/2:p.bottom,Math.max(i===X.Down?p.top:p.top+p.height/2,u.y))},h=i===X.Right&&!s||i===X.Left&&!c,g=i===X.Down&&!l||i===X.Up&&!a;if(h&&m.x!==u.x){let e=n.scrollLeft+t.x,a=i===X.Right&&e<=d.x||i===X.Left&&e>=f.x;if(a&&!t.y){n.scrollTo({left:e,behavior:o});return}r.x=a?n.scrollLeft-e:i===X.Right?n.scrollLeft-d.x:n.scrollLeft-f.x,r.x&&n.scrollBy({left:-r.x,behavior:o});break}if(g&&m.y!==u.y){let e=n.scrollTop+t.y,a=i===X.Down&&e<=d.y||i===X.Up&&e>=f.y;if(a&&!t.x){n.scrollTo({top:e,behavior:o});return}r.y=a?n.scrollTop-e:i===X.Down?n.scrollTop-d.y:n.scrollTop-f.y,r.y&&n.scrollBy({top:-r.y,behavior:o});break}}this.handleMove(e,nn(rn(u,this.referenceCoordinates),r))}}}handleMove(e,t){let{onMove:n}=this.props;e.preventDefault(),n(t)}handleEnd(e){let{onEnd:t}=this.props;e.preventDefault(),this.detach(),t()}handleCancel(e){let{onCancel:t}=this.props;e.preventDefault(),this.detach(),t()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll()}};yr.activators=[{eventName:`onKeyDown`,handler:(e,t,n)=>{let{keyboardCodes:r=_r,onActivation:i}=t,{active:a}=n,{code:o}=e.nativeEvent;if(r.start.includes(o)){let t=a.activatorNode.current;return t&&e.target!==t?!1:(e.preventDefault(),i?.({event:e.nativeEvent}),!0)}return!1}}];function br(e){return!!(e&&`distance`in e)}function xr(e){return!!(e&&`delay`in e)}var Sr=class{constructor(e,t,n){n===void 0&&(n=pr(e.event.target)),this.props=void 0,this.events=void 0,this.autoScrollEnabled=!0,this.document=void 0,this.activated=!1,this.initialCoordinates=void 0,this.timeoutId=null,this.listeners=void 0,this.documentListeners=void 0,this.windowListeners=void 0,this.props=e,this.events=t;let{event:r}=e,{target:i}=r;this.props=e,this.events=t,this.document=Kt(i),this.documentListeners=new fr(this.document),this.listeners=new fr(n),this.windowListeners=new fr(W(i)),this.initialCoordinates=cn(r)??q,this.handleStart=this.handleStart.bind(this),this.handleMove=this.handleMove.bind(this),this.handleEnd=this.handleEnd.bind(this),this.handleCancel=this.handleCancel.bind(this),this.handleKeydown=this.handleKeydown.bind(this),this.removeTextSelection=this.removeTextSelection.bind(this),this.attach()}attach(){let{events:e,props:{options:{activationConstraint:t,bypassActivationConstraint:n}}}=this;if(this.listeners.add(e.move.name,this.handleMove,{passive:!1}),this.listeners.add(e.end.name,this.handleEnd),e.cancel&&this.listeners.add(e.cancel.name,this.handleCancel),this.windowListeners.add(Y.Resize,this.handleCancel),this.windowListeners.add(Y.DragStart,hr),this.windowListeners.add(Y.VisibilityChange,this.handleCancel),this.windowListeners.add(Y.ContextMenu,hr),this.documentListeners.add(Y.Keydown,this.handleKeydown),t){if(n!=null&&n({event:this.props.event,activeNode:this.props.activeNode,options:this.props.options}))return this.handleStart();if(xr(t)){this.timeoutId=setTimeout(this.handleStart,t.delay),this.handlePending(t);return}if(br(t)){this.handlePending(t);return}}this.handleStart()}detach(){this.listeners.removeAll(),this.windowListeners.removeAll(),setTimeout(this.documentListeners.removeAll,50),this.timeoutId!==null&&(clearTimeout(this.timeoutId),this.timeoutId=null)}handlePending(e,t){let{active:n,onPending:r}=this.props;r(n,e,this.initialCoordinates,t)}handleStart(){let{initialCoordinates:e}=this,{onStart:t}=this.props;e&&(this.activated=!0,this.documentListeners.add(Y.Click,gr,{capture:!0}),this.removeTextSelection(),this.documentListeners.add(Y.SelectionChange,this.removeTextSelection),t(e))}handleMove(e){let{activated:t,initialCoordinates:n,props:r}=this,{onMove:i,options:{activationConstraint:a}}=r;if(!n)return;let o=cn(e)??q,s=rn(n,o);if(!t&&a){if(br(a)){if(a.tolerance!=null&&mr(s,a.tolerance))return this.handleCancel();if(mr(s,a.distance))return this.handleStart()}if(xr(a)&&mr(s,a.tolerance))return this.handleCancel();this.handlePending(a,s)}else e.cancelable&&e.preventDefault(),i(o)}handleEnd(){let{onAbort:e,onEnd:t}=this.props;this.detach(),this.activated||e(this.props.active),t()}handleCancel(){let{onAbort:e,onCancel:t}=this.props;this.detach(),this.activated||e(this.props.active),t()}handleKeydown(e){e.code===X.Esc&&this.handleCancel()}removeTextSelection(){var e;(e=this.document.getSelection())==null||e.removeAllRanges()}},Cr={cancel:{name:`pointercancel`},move:{name:`pointermove`},end:{name:`pointerup`}},wr=class extends Sr{constructor(e){let{event:t}=e,n=Kt(t.target);super(e,Cr,n)}};wr.activators=[{eventName:`onPointerDown`,handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return!n.isPrimary||n.button!==0?!1:(r?.({event:n}),!0)}}];var Tr={move:{name:`mousemove`},end:{name:`mouseup`}},Er;(function(e){e[e.RightClick=2]=`RightClick`})(Er||={});var Dr=class extends Sr{constructor(e){super(e,Tr,Kt(e.event.target))}};Dr.activators=[{eventName:`onMouseDown`,handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t;return n.button!==Er.RightClick&&(r?.({event:n}),!0)}}];var Or={cancel:{name:`touchcancel`},move:{name:`touchmove`},end:{name:`touchend`}},kr=class extends Sr{constructor(e){super(e,Or)}static setup(){return window.addEventListener(Or.move.name,e,{capture:!1,passive:!1}),function(){window.removeEventListener(Or.move.name,e)};function e(){}}};kr.activators=[{eventName:`onTouchStart`,handler:(e,t)=>{let{nativeEvent:n}=e,{onActivation:r}=t,{touches:i}=n;return i.length>1?!1:(r?.({event:n}),!0)}}];var Ar;(function(e){e[e.Pointer=0]=`Pointer`,e[e.DraggableRect=1]=`DraggableRect`})(Ar||={});var jr;(function(e){e[e.TreeOrder=0]=`TreeOrder`,e[e.ReversedTreeOrder=1]=`ReversedTreeOrder`})(jr||={});function Mr(e){let{acceleration:t,activator:n=Ar.Pointer,canScroll:r,draggingRect:i,enabled:a,interval:o=5,order:s=jr.TreeOrder,pointerCoordinates:c,scrollableAncestors:l,scrollableAncestorRects:u,delta:d,threshold:f}=e,p=Pr({delta:d,disabled:!a}),[m,h]=Jt(),g=(0,U.useRef)({x:0,y:0}),_=(0,U.useRef)({x:0,y:0}),v=(0,U.useMemo)(()=>{switch(n){case Ar.Pointer:return c?{top:c.y,bottom:c.y,left:c.x,right:c.x}:null;case Ar.DraggableRect:return i}},[n,i,c]),y=(0,U.useRef)(null),b=(0,U.useCallback)(()=>{let e=y.current;if(!e)return;let t=g.current.x*_.current.x,n=g.current.y*_.current.y;e.scrollBy(t,n)},[]),x=(0,U.useMemo)(()=>s===jr.TreeOrder?[...l].reverse():l,[s,l]);(0,U.useEffect)(()=>{if(!a||!l.length||!v)h();else{for(let e of x){if(r?.(e)===!1)continue;let n=l.indexOf(e),i=u[n];if(!i)continue;let{direction:a,speed:s}=ir(e,i,v,t,f);for(let e of[`x`,`y`])p[e][a[e]]||(s[e]=0,a[e]=0);if(s.x>0||s.y>0){h(),y.current=e,m(b,o),g.current=s,_.current=a;return}}g.current={x:0,y:0},_.current={x:0,y:0},h()}},[t,b,r,h,a,o,JSON.stringify(v),JSON.stringify(p),m,l,x,u,JSON.stringify(f)])}var Nr={x:{[J.Backward]:!1,[J.Forward]:!1},y:{[J.Backward]:!1,[J.Forward]:!1}};function Pr(e){let{delta:t,disabled:n}=e,r=Qt(t);return Xt(e=>{if(n||!r||!e)return Nr;let i={x:Math.sign(t.x-r.x),y:Math.sign(t.y-r.y)};return{x:{[J.Backward]:e.x[J.Backward]||i.x===-1,[J.Forward]:e.x[J.Forward]||i.x===1},y:{[J.Backward]:e.y[J.Backward]||i.y===-1,[J.Forward]:e.y[J.Forward]||i.y===1}}},[n,t,r])}function Fr(e,t){let n=t==null?void 0:e.get(t),r=n?n.node.current:null;return Xt(e=>t==null?null:r??e??null,[r,t])}function Ir(e,t){return(0,U.useMemo)(()=>e.reduce((e,n)=>{let{sensor:r}=n,i=r.activators.map(e=>({eventName:e.eventName,handler:t(e.handler,n)}));return[...e,...i]},[]),[e,t])}var Lr;(function(e){e[e.Always=0]=`Always`,e[e.BeforeDragging=1]=`BeforeDragging`,e[e.WhileDragging=2]=`WhileDragging`})(Lr||={});var Rr;(function(e){e.Optimized=`optimized`})(Rr||={});var zr=new Map;function Br(e,t){let{dragging:n,dependencies:r,config:i}=t,[a,o]=(0,U.useState)(null),{frequency:s,measure:c,strategy:l}=i,u=(0,U.useRef)(e),d=g(),f=Yt(d),p=(0,U.useCallback)(function(e){e===void 0&&(e=[]),!f.current&&o(t=>t===null?e:t.concat(e.filter(e=>!t.includes(e))))},[f]),m=(0,U.useRef)(null),h=Xt(t=>{if(d&&!n)return zr;if(!t||t===zr||u.current!==e||a!=null){let t=new Map;for(let n of e){if(!n)continue;if(a&&a.length>0&&!a.includes(n.id)&&n.rect.current){t.set(n.id,n.rect.current);continue}let e=n.node.current,r=e?new dr(c(e),e):null;n.rect.current=r,r&&t.set(n.id,r)}return t}return t},[e,a,n,d,c]);return(0,U.useEffect)(()=>{u.current=e},[e]),(0,U.useEffect)(()=>{d||p()},[n,d]),(0,U.useEffect)(()=>{a&&a.length>0&&o(null)},[JSON.stringify(a)]),(0,U.useEffect)(()=>{d||typeof s!=`number`||m.current!==null||(m.current=setTimeout(()=>{p(),m.current=null},s))},[s,d,p,...r]),{droppableRects:h,measureDroppableContainers:p,measuringScheduled:a!=null};function g(){switch(l){case Lr.Always:return!1;case Lr.BeforeDragging:return n;default:return!n}}}function Vr(e,t){return Xt(n=>e?n||(typeof t==`function`?t(e):e):null,[t,e])}function Hr(e,t){return Vr(e,t)}function Ur(e){let{callback:t,disabled:n}=e,r=qt(t),i=(0,U.useMemo)(()=>{if(n||typeof window>`u`||window.MutationObserver===void 0)return;let{MutationObserver:e}=window;return new e(r)},[r,n]);return(0,U.useEffect)(()=>()=>i?.disconnect(),[i]),i}function Wr(e){let{callback:t,disabled:n}=e,r=qt(t),i=(0,U.useMemo)(()=>{if(n||typeof window>`u`||window.ResizeObserver===void 0)return;let{ResizeObserver:e}=window;return new e(r)},[n]);return(0,U.useEffect)(()=>()=>i?.disconnect(),[i]),i}function Gr(e){return new dr(Wn(e),e)}function Kr(e,t,n){t===void 0&&(t=Gr);let[r,i]=(0,U.useState)(null);function a(){i(r=>{if(!e)return null;if(e.isConnected===!1)return r??n??null;let i=t(e);return JSON.stringify(r)===JSON.stringify(i)?r:i})}let o=Ur({callback(t){if(e)for(let n of t){let{type:t,target:r}=n;if(t===`childList`&&r instanceof HTMLElement&&r.contains(e)){a();break}}}}),s=Wr({callback:a});return G(()=>{a(),e?(s?.observe(e),o?.observe(document.body,{childList:!0,subtree:!0})):(s?.disconnect(),o?.disconnect())},[e]),r}function qr(e){return Rn(e,Vr(e))}var Jr=[];function Yr(e){let t=(0,U.useRef)(e),n=Xt(n=>e?n&&n!==Jr&&e&&t.current&&e.parentNode===t.current.parentNode?n:Yn(e):Jr,[e]);return(0,U.useEffect)(()=>{t.current=e},[e]),n}function Xr(e){let[t,n]=(0,U.useState)(null),r=(0,U.useRef)(e),i=(0,U.useCallback)(e=>{let t=Zn(e.target);t&&n(e=>e?(e.set(t,er(t)),new Map(e)):null)},[]);return(0,U.useEffect)(()=>{let t=r.current;if(e!==t){a(t);let o=e.map(e=>{let t=Zn(e);return t?(t.addEventListener(`scroll`,i,{passive:!0}),[t,er(t)]):null}).filter(e=>e!=null);n(o.length?new Map(o):null),r.current=e}return()=>{a(e),a(t)};function a(e){e.forEach(e=>{Zn(e)?.removeEventListener(`scroll`,i)})}},[i,e]),(0,U.useMemo)(()=>e.length?t?Array.from(t.values()).reduce((e,t)=>nn(e,t),q):or(e):q,[e,t])}function Zr(e,t){t===void 0&&(t=[]);let n=(0,U.useRef)(null);return(0,U.useEffect)(()=>{n.current=null},t),(0,U.useEffect)(()=>{let t=e!==q;t&&!n.current&&(n.current=e),!t&&n.current&&(n.current=null)},[e]),n.current?rn(e,n.current):q}function Qr(e){(0,U.useEffect)(()=>{if(!Bt)return;let t=e.map(e=>{let{sensor:t}=e;return t.setup==null?void 0:t.setup()});return()=>{for(let e of t)e?.()}},e.map(e=>{let{sensor:t}=e;return t}))}function $r(e,t){return(0,U.useMemo)(()=>e.reduce((e,n)=>{let{eventName:r,handler:i}=n;return e[r]=e=>{i(e,t)},e},{}),[e,t])}function ei(e){return(0,U.useMemo)(()=>e?Kn(e):null,[e])}var ti=[];function ni(e,t){t===void 0&&(t=Wn);let[n]=e,r=ei(n?W(n):null),[i,a]=(0,U.useState)(ti);function o(){a(()=>e.length?e.map(e=>tr(e)?r:new dr(t(e),e)):ti)}let s=Wr({callback:o});return G(()=>{s?.disconnect(),o(),e.forEach(e=>s?.observe(e))},[e]),i}function ri(e){if(!e)return null;if(e.children.length>1)return e;let t=e.children[0];return Wt(t)?t:e}function ii(e){let{measure:t}=e,[n,r]=(0,U.useState)(null),i=Wr({callback:(0,U.useCallback)(e=>{for(let{target:n}of e)if(Wt(n)){r(e=>{let r=t(n);return e?{...e,width:r.width,height:r.height}:r});break}},[t])}),[a,o]=Zt((0,U.useCallback)(e=>{let n=ri(e);i?.disconnect(),n&&i?.observe(n),r(n?t(n):null)},[t,i]));return(0,U.useMemo)(()=>({nodeRef:a,rect:n,setRef:o}),[n,a,o])}var ai=[{sensor:wr,options:{}},{sensor:yr,options:{}}],oi={current:{}},si={draggable:{measure:Gn},droppable:{measure:Gn,strategy:Lr.WhileDragging,frequency:Rr.Optimized},dragOverlay:{measure:Wn}},ci=class extends Map{get(e){return e==null?void 0:super.get(e)??void 0}toArray(){return Array.from(this.values())}getEnabled(){return this.toArray().filter(e=>{let{disabled:t}=e;return!t})}getNodeFor(e){return this.get(e)?.node.current??void 0}},li={activatorEvent:null,active:null,activeNode:null,activeNodeRect:null,collisions:null,containerNodeRect:null,draggableNodes:new Map,droppableRects:new Map,droppableContainers:new ci,over:null,dragOverlay:{nodeRef:{current:null},rect:null,setRef:Sn},scrollableAncestors:[],scrollableAncestorRects:[],measuringConfiguration:si,measureDroppableContainers:Sn,windowRect:null,measuringScheduled:!1},ui={activatorEvent:null,activators:[],active:null,activeNodeRect:null,ariaDescribedById:{draggable:``},dispatch:Sn,draggableNodes:new Map,over:null,measureDroppableContainers:Sn},di=(0,U.createContext)(ui),fi=(0,U.createContext)(li);function pi(){return{draggable:{active:null,initialCoordinates:{x:0,y:0},nodes:new Map,translate:{x:0,y:0}},droppable:{containers:new ci}}}function mi(e,t){switch(t.type){case K.DragStart:return{...e,draggable:{...e.draggable,initialCoordinates:t.initialCoordinates,active:t.active}};case K.DragMove:return e.draggable.active==null?e:{...e,draggable:{...e.draggable,translate:{x:t.coordinates.x-e.draggable.initialCoordinates.x,y:t.coordinates.y-e.draggable.initialCoordinates.y}}};case K.DragEnd:case K.DragCancel:return{...e,draggable:{...e.draggable,active:null,initialCoordinates:{x:0,y:0},translate:{x:0,y:0}}};case K.RegisterDroppable:{let{element:n}=t,{id:r}=n,i=new ci(e.droppable.containers);return i.set(r,n),{...e,droppable:{...e.droppable,containers:i}}}case K.SetDroppableDisabled:{let{id:n,key:r,disabled:i}=t,a=e.droppable.containers.get(n);if(!a||r!==a.key)return e;let o=new ci(e.droppable.containers);return o.set(n,{...a,disabled:i}),{...e,droppable:{...e.droppable,containers:o}}}case K.UnregisterDroppable:{let{id:n,key:r}=t,i=e.droppable.containers.get(n);if(!i||r!==i.key)return e;let a=new ci(e.droppable.containers);return a.delete(n),{...e,droppable:{...e.droppable,containers:a}}}default:return e}}function hi(e){let{disabled:t}=e,{active:n,activatorEvent:r,draggableNodes:i}=(0,U.useContext)(di),a=Qt(r),o=Qt(n?.id);return(0,U.useEffect)(()=>{if(!t&&!r&&a&&o!=null){if(!on(a)||document.activeElement===a.target)return;let e=i.get(o);if(!e)return;let{activatorNode:t,node:n}=e;if(!t.current&&!n.current)return;requestAnimationFrame(()=>{for(let e of[t.current,n.current]){if(!e)continue;let t=dn(e);if(t){t.focus();break}}})}},[r,t,i,o,a]),null}function gi(e,t){let{transform:n,...r}=t;return e!=null&&e.length?e.reduce((e,t)=>t({transform:e,...r}),n):n}function _i(e){return(0,U.useMemo)(()=>({draggable:{...si.draggable,...e?.draggable},droppable:{...si.droppable,...e?.droppable},dragOverlay:{...si.dragOverlay,...e?.dragOverlay}}),[e?.draggable,e?.droppable,e?.dragOverlay])}function vi(e){let{activeNode:t,measure:n,initialRect:r,config:i=!0}=e,a=(0,U.useRef)(!1),{x:o,y:s}=typeof i==`boolean`?{x:i,y:i}:i;G(()=>{if(!o&&!s||!t){a.current=!1;return}if(a.current||!r)return;let e=t?.node.current;if(!e||e.isConnected===!1)return;let i=Rn(n(e),r);if(o||(i.x=0),s||(i.y=0),a.current=!0,Math.abs(i.x)>0||Math.abs(i.y)>0){let t=Xn(e);t&&t.scrollBy({top:i.y,left:i.x})}},[t,o,s,r,n])}var yi=(0,U.createContext)({...q,scaleX:1,scaleY:1}),bi;(function(e){e[e.Uninitialized=0]=`Uninitialized`,e[e.Initializing=1]=`Initializing`,e[e.Initialized=2]=`Initialized`})(bi||={});var xi=(0,U.memo)(function(e){let{id:t,accessibility:n,autoScroll:r=!0,children:i,sensors:a=ai,collisionDetection:o=Pn,measuring:s,modifiers:c,...l}=e,[u,d]=(0,U.useReducer)(mi,void 0,pi),[f,p]=vn(),[m,h]=(0,U.useState)(bi.Uninitialized),g=m===bi.Initialized,{draggable:{active:_,nodes:v,translate:y},droppable:{containers:b}}=u,x=_==null?null:v.get(_),S=(0,U.useRef)({initial:null,translated:null}),C=(0,U.useMemo)(()=>_==null?null:{id:_,data:x?.data??oi,rect:S},[_,x]),w=(0,U.useRef)(null),[T,E]=(0,U.useState)(null),[D,O]=(0,U.useState)(null),ee=Yt(l,Object.values(l)),k=en(`DndDescribedBy`,t),A=(0,U.useMemo)(()=>b.getEnabled(),[b]),j=_i(s),{droppableRects:M,measureDroppableContainers:te,measuringScheduled:N}=Br(A,{dragging:g,dependencies:[y.x,y.y],config:j.droppable}),P=Fr(v,_),ne=(0,U.useMemo)(()=>D?cn(D):null,[D]),re=Ae(),ie=Hr(P,j.draggable.measure);vi({activeNode:_==null?null:v.get(_),config:re.layoutShiftCompensation,initialRect:ie,measure:j.draggable.measure});let F=Kr(P,j.draggable.measure,ie),ae=Kr(P?P.parentElement:null),I=(0,U.useRef)({activatorEvent:null,active:null,activeNode:P,collisionRect:null,collisions:null,droppableRects:M,draggableNodes:v,draggingNode:null,draggingNodeRect:null,droppableContainers:b,over:null,scrollableAncestors:[],scrollAdjustedTranslate:null}),oe=b.getNodeFor(I.current.over?.id),L=ii({measure:j.dragOverlay.measure}),se=L.nodeRef.current??P,ce=g?L.rect??F:null,le=!!(L.nodeRef.current&&L.rect),ue=qr(le?null:F),de=ei(se?W(se):null),R=Yr(g?oe??P:null),fe=ni(R),pe=gi(c,{transform:{x:y.x-ue.x,y:y.y-ue.y,scaleX:1,scaleY:1},activatorEvent:D,active:C,activeNodeRect:F,containerNodeRect:ae,draggingNodeRect:ce,over:I.current.over,overlayNodeRect:L.rect,scrollableAncestors:R,scrollableAncestorRects:fe,windowRect:de}),me=ne?nn(ne,y):null,he=Xr(R),ge=Zr(he),_e=Zr(he,[F]),ve=nn(pe,ge),ye=ce?Bn(ce,pe):null,be=C&&ye?o({active:C,collisionRect:ye,droppableRects:M,droppableContainers:A,pointerCoordinates:me}):null,xe=An(be,`id`),[Se,Ce]=(0,U.useState)(null),we=Ln(le?pe:nn(pe,_e),Se?.rect??null,F),Te=(0,U.useRef)(null),Ee=(0,U.useCallback)((e,t)=>{let{sensor:n,options:r}=t;if(w.current==null)return;let i=v.get(w.current);if(!i)return;let a=e.nativeEvent,o=new n({active:w.current,activeNode:i,event:a,options:r,context:I,onAbort(e){if(!v.get(e))return;let{onDragAbort:t}=ee.current,n={id:e};t?.(n),f({type:`onDragAbort`,event:n})},onPending(e,t,n,r){if(!v.get(e))return;let{onDragPending:i}=ee.current,a={id:e,constraint:t,initialCoordinates:n,offset:r};i?.(a),f({type:`onDragPending`,event:a})},onStart(e){let t=w.current;if(t==null)return;let n=v.get(t);if(!n)return;let{onDragStart:r}=ee.current,i={activatorEvent:a,active:{id:t,data:n.data,rect:S}};(0,zt.unstable_batchedUpdates)(()=>{r?.(i),h(bi.Initializing),d({type:K.DragStart,initialCoordinates:e,active:t}),f({type:`onDragStart`,event:i}),E(Te.current),O(a)})},onMove(e){d({type:K.DragMove,coordinates:e})},onEnd:s(K.DragEnd),onCancel:s(K.DragCancel)});Te.current=o;function s(e){return async function(){let{active:t,collisions:n,over:r,scrollAdjustedTranslate:i}=I.current,o=null;if(t&&i){let{cancelDrop:s}=ee.current;o={activatorEvent:a,active:t,collisions:n,delta:i,over:r},e===K.DragEnd&&typeof s==`function`&&await Promise.resolve(s(o))&&(e=K.DragCancel)}w.current=null,(0,zt.unstable_batchedUpdates)(()=>{d({type:e}),h(bi.Uninitialized),Ce(null),E(null),O(null),Te.current=null;let t=e===K.DragEnd?`onDragEnd`:`onDragCancel`;if(o){let e=ee.current[t];e?.(o),f({type:t,event:o})}})}}},[v]),De=Ir(a,(0,U.useCallback)((e,t)=>(n,r)=>{let i=n.nativeEvent,a=v.get(r);if(w.current!==null||!a||i.dndKit||i.defaultPrevented)return;let o={active:a};e(n,t.options,o)===!0&&(i.dndKit={capturedBy:t.sensor},w.current=r,Ee(n,t))},[v,Ee]));Qr(a),G(()=>{F&&m===bi.Initializing&&h(bi.Initialized)},[F,m]),(0,U.useEffect)(()=>{let{onDragMove:e}=ee.current,{active:t,activatorEvent:n,collisions:r,over:i}=I.current;if(!t||!n)return;let a={active:t,activatorEvent:n,collisions:r,delta:{x:ve.x,y:ve.y},over:i};(0,zt.unstable_batchedUpdates)(()=>{e?.(a),f({type:`onDragMove`,event:a})})},[ve.x,ve.y]),(0,U.useEffect)(()=>{let{active:e,activatorEvent:t,collisions:n,droppableContainers:r,scrollAdjustedTranslate:i}=I.current;if(!e||w.current==null||!t||!i)return;let{onDragOver:a}=ee.current,o=r.get(xe),s=o&&o.rect.current?{id:o.id,rect:o.rect.current,data:o.data,disabled:o.disabled}:null,c={active:e,activatorEvent:t,collisions:n,delta:{x:i.x,y:i.y},over:s};(0,zt.unstable_batchedUpdates)(()=>{Ce(s),a?.(c),f({type:`onDragOver`,event:c})})},[xe]),G(()=>{I.current={activatorEvent:D,active:C,activeNode:P,collisionRect:ye,collisions:be,droppableRects:M,draggableNodes:v,draggingNode:se,draggingNodeRect:ce,droppableContainers:b,over:Se,scrollableAncestors:R,scrollAdjustedTranslate:ve},S.current={initial:ce,translated:ye}},[C,P,be,ye,v,se,ce,M,b,Se,R,ve]),Mr({...re,delta:y,draggingRect:ye,pointerCoordinates:me,scrollableAncestors:R,scrollableAncestorRects:fe});let Oe=(0,U.useMemo)(()=>({active:C,activeNode:P,activeNodeRect:F,activatorEvent:D,collisions:be,containerNodeRect:ae,dragOverlay:L,draggableNodes:v,droppableContainers:b,droppableRects:M,over:Se,measureDroppableContainers:te,scrollableAncestors:R,scrollableAncestorRects:fe,measuringConfiguration:j,measuringScheduled:N,windowRect:de}),[C,P,F,D,be,ae,L,v,b,M,Se,te,R,fe,j,N,de]),ke=(0,U.useMemo)(()=>({activatorEvent:D,activators:De,active:C,activeNodeRect:F,ariaDescribedById:{draggable:k},dispatch:d,draggableNodes:v,over:Se,measureDroppableContainers:te}),[D,De,C,F,d,k,v,Se,te]);return U.createElement(gn.Provider,{value:p},U.createElement(di.Provider,{value:ke},U.createElement(fi.Provider,{value:Oe},U.createElement(yi.Provider,{value:we},i)),U.createElement(hi,{disabled:n?.restoreFocus===!1})),U.createElement(xn,{...n,hiddenTextDescribedById:k}));function Ae(){let e=T?.autoScrollEnabled===!1,t=typeof r==`object`?r.enabled===!1:r===!1,n=g&&!e&&!t;return typeof r==`object`?{...r,enabled:n}:{enabled:n}}}),Si=(0,U.createContext)(null),Ci=`button`,wi=`Draggable`;function Ti(e){let{id:t,data:n,disabled:r=!1,attributes:i}=e,a=en(wi),{activators:o,activatorEvent:s,active:c,activeNodeRect:l,ariaDescribedById:u,draggableNodes:d,over:f}=(0,U.useContext)(di),{role:p=Ci,roleDescription:m=`draggable`,tabIndex:h=0}=i??{},g=c?.id===t,_=(0,U.useContext)(g?yi:Si),[v,y]=Zt(),[b,x]=Zt(),S=$r(o,t),C=Yt(n);return G(()=>(d.set(t,{id:t,key:a,node:v,activatorNode:b,data:C}),()=>{let e=d.get(t);e&&e.key===a&&d.delete(t)}),[d,t]),{active:c,activatorEvent:s,activeNodeRect:l,attributes:(0,U.useMemo)(()=>({role:p,tabIndex:h,"aria-disabled":r,"aria-pressed":g&&p===Ci?!0:void 0,"aria-roledescription":m,"aria-describedby":u.draggable}),[r,p,h,g,m,u.draggable]),isDragging:g,listeners:r?void 0:S,node:v,over:f,setNodeRef:y,setActivatorNodeRef:x,transform:_}}function Ei(){return(0,U.useContext)(fi)}var Di=`Droppable`,Oi={timeout:25};function ki(e){let{data:t,disabled:n=!1,id:r,resizeObserverConfig:i}=e,a=en(Di),{active:o,dispatch:s,over:c,measureDroppableContainers:l}=(0,U.useContext)(di),u=(0,U.useRef)({disabled:n}),d=(0,U.useRef)(!1),f=(0,U.useRef)(null),p=(0,U.useRef)(null),{disabled:m,updateMeasurementsFor:h,timeout:g}={...Oi,...i},_=Yt(h??r),v=Wr({callback:(0,U.useCallback)(()=>{d.current?(p.current!=null&&clearTimeout(p.current),p.current=setTimeout(()=>{l(Array.isArray(_.current)?_.current:[_.current]),p.current=null},g)):d.current=!0},[g]),disabled:m||!o}),[y,b]=Zt((0,U.useCallback)((e,t)=>{v&&(t&&(v.unobserve(t),d.current=!1),e&&v.observe(e))},[v])),x=Yt(t);return(0,U.useEffect)(()=>{v&&y.current&&(v.disconnect(),d.current=!1,v.observe(y.current))},[y,v]),(0,U.useEffect)(()=>(s({type:K.RegisterDroppable,element:{id:r,key:a,disabled:n,node:y,rect:f,data:x}}),()=>s({type:K.UnregisterDroppable,key:a,id:r})),[r]),(0,U.useEffect)(()=>{n!==u.current.disabled&&(s({type:K.SetDroppableDisabled,id:r,key:a,disabled:n}),u.current.disabled=n)},[r,a,n,s]),{active:o,rect:f,isOver:c?.id===r,node:y,over:c,setNodeRef:b}}function Ai(e){let{animation:t,children:n}=e,[r,i]=(0,U.useState)(null),[a,o]=(0,U.useState)(null),s=Qt(n);return!n&&!r&&s&&i(s),G(()=>{if(!a)return;let e=r?.key,n=r?.props.id;e==null||n==null?i(null):Promise.resolve(t(n,a)).then(()=>{i(null)})},[t,r,a]),U.createElement(U.Fragment,null,n,r?(0,U.cloneElement)(r,{ref:o}):null)}var ji={x:0,y:0,scaleX:1,scaleY:1};function Mi(e){let{children:t}=e;return U.createElement(di.Provider,{value:ui},U.createElement(yi.Provider,{value:ji},t))}var Ni={position:`fixed`,touchAction:`none`},Pi=e=>on(e)?`transform 250ms ease`:void 0,Fi=(0,U.forwardRef)((e,t)=>{let{as:n,activatorEvent:r,adjustScale:i,children:a,className:o,rect:s,style:c,transform:l,transition:u=Pi}=e;if(!s)return null;let d=i?l:{...l,scaleX:1,scaleY:1},f={...Ni,width:s.width,height:s.height,top:s.top,left:s.left,transform:ln.Transform.toString(d),transformOrigin:i&&r?En(r,s):void 0,transition:typeof u==`function`?u(r):u,...c};return U.createElement(n,{className:o,style:f,ref:t},a)}),Ii={duration:250,easing:`ease`,keyframes:e=>{let{transform:{initial:t,final:n}}=e;return[{transform:ln.Transform.toString(t)},{transform:ln.Transform.toString(n)}]},sideEffects:(e=>t=>{let{active:n,dragOverlay:r}=t,i={},{styles:a,className:o}=e;if(a!=null&&a.active)for(let[e,t]of Object.entries(a.active))t!==void 0&&(i[e]=n.node.style.getPropertyValue(e),n.node.style.setProperty(e,t));if(a!=null&&a.dragOverlay)for(let[e,t]of Object.entries(a.dragOverlay))t!==void 0&&r.node.style.setProperty(e,t);return o!=null&&o.active&&n.node.classList.add(o.active),o!=null&&o.dragOverlay&&r.node.classList.add(o.dragOverlay),function(){for(let[e,t]of Object.entries(i))n.node.style.setProperty(e,t);o!=null&&o.active&&n.node.classList.remove(o.active)}})({styles:{active:{opacity:`0`}}})};function Li(e){let{config:t,draggableNodes:n,droppableContainers:r,measuringConfiguration:i}=e;return qt((e,a)=>{if(t===null)return;let o=n.get(e);if(!o)return;let s=o.node.current;if(!s)return;let c=ri(a);if(!c)return;let{transform:l}=W(a).getComputedStyle(a),u=Vn(l);if(!u)return;let d=typeof t==`function`?t:Ri(t);return lr(s,i.draggable.measure),d({active:{id:e,data:o.data,node:s,rect:i.draggable.measure(s)},draggableNodes:n,dragOverlay:{node:a,rect:i.dragOverlay.measure(c)},droppableContainers:r,measuringConfiguration:i,transform:u})})}function Ri(e){let{duration:t,easing:n,sideEffects:r,keyframes:i}={...Ii,...e};return e=>{let{active:a,dragOverlay:o,transform:s,...c}=e;if(!t)return;let l={x:o.rect.left-a.rect.left,y:o.rect.top-a.rect.top},u={scaleX:s.scaleX===1?1:a.rect.width*s.scaleX/o.rect.width,scaleY:s.scaleY===1?1:a.rect.height*s.scaleY/o.rect.height},d={x:s.x-l.x,y:s.y-l.y,...u},f=i({...c,active:a,dragOverlay:o,transform:{initial:s,final:d}}),[p]=f,m=f[f.length-1];if(JSON.stringify(p)===JSON.stringify(m))return;let h=r?.({active:a,dragOverlay:o,...c}),g=o.node.animate(f,{duration:t,easing:n,fill:`forwards`});return new Promise(e=>{g.onfinish=()=>{h?.(),e()}})}}var zi=0;function Bi(e){return(0,U.useMemo)(()=>{if(e!=null)return zi++,zi},[e])}var Vi=U.memo(e=>{let{adjustScale:t=!1,children:n,dropAnimation:r,style:i,transition:a,modifiers:o,wrapperElement:s=`div`,className:c,zIndex:l=999}=e,{activatorEvent:u,active:d,activeNodeRect:f,containerNodeRect:p,draggableNodes:m,droppableContainers:h,dragOverlay:g,over:_,measuringConfiguration:v,scrollableAncestors:y,scrollableAncestorRects:b,windowRect:x}=Ei(),S=(0,U.useContext)(yi),C=Bi(d?.id),w=gi(o,{activatorEvent:u,active:d,activeNodeRect:f,containerNodeRect:p,draggingNodeRect:g.rect,over:_,overlayNodeRect:g.rect,scrollableAncestors:y,scrollableAncestorRects:b,transform:S,windowRect:x}),T=Vr(f),E=Li({config:r,draggableNodes:m,droppableContainers:h,measuringConfiguration:v}),D=T?g.setRef:void 0;return U.createElement(Mi,null,U.createElement(Ai,{animation:E},d&&C?U.createElement(Fi,{key:C,id:d.id,ref:D,as:s,activatorEvent:u,adjustScale:t,className:c,transition:a,rect:T,style:{zIndex:l,...i},transform:w},n):null))}),Z=o(),Hi=(0,U.createContext)(null);function Ui(){let e=(0,U.useContext)(Hi);if(!e)throw Error(`useTaskMover must be used inside <MoveProvider>`);return e}var Wi=`Accepting marks the task Done. It does not merge or push.`;function Gi({children:e}){let[t,n]=(0,U.useState)({}),[r,i]=(0,U.useState)(null),[a,o]=(0,U.useState)(null),s=(0,U.useCallback)(async(e,t)=>{n(t=>({...t,[e]:!0}));try{await t()}finally{n(t=>{let{[e]:n,...r}=t;return r})}},[]),c=(0,U.useCallback)(async(e,t)=>{if(t===`ready`)try{let t=await Ee(e.id);B.success(`Moved to Ready. ${ge(t)}.`)}catch{B.success(`Moved to Ready. The dispatcher starts it when it is eligible.`)}else B.success(`Moved "${e.title}" to ${z[t]}`)},[]),l=(0,U.useCallback)(async(e,t,n)=>{try{return await Te(e.id,{to:t,...n}),await c(e,t),!0}catch(r){return!n.onRunning&&R(r)?(i({kind:`choice`,task:e,to:t,position:n.position,reasons:[],carry:{confirm:n.confirm}}),!1):!n.confirm&&de(r)?(i({kind:`confirm_done`,task:e,to:t,position:n.position,reasons:[A(r)],carry:{onRunning:n.onRunning}}),!1):(B.error(`Could not move "${e.title}": ${A(r)}`),!1)}},[c]),u=(0,U.useCallback)(e=>s(e.id,async()=>{try{await le(e.id,`run-now`),B.info(`Dispatch requested for "${e.title}". Waiting for the host to confirm.`)}catch(t){B.error(`Cannot run "${e.title}" now: ${A(t)}`)}}),[s]),d=(0,U.useCallback)(e=>s(e.id,async()=>{try{await le(e.id,`new-attempt`),B.info(`New attempt requested for "${e.title}".`)}catch(t){if(g(t,`native_session_missing`)){i({kind:`fresh_attempt`,task:e,to:`in_progress`,reasons:[A(t)]});return}B.error(`Could not start a new attempt: ${A(t)}`)}}),[s]),f=(0,U.useCallback)(async(e,t,n={})=>{let r=e.currentRunId?j.getState().runs[e.currentRunId]:void 0,a=L(e,t,r);switch(a.kind){case`noop`:return;case`invalid`:B.error(a.reason);return;case`run_now`:return u(e);case`new_attempt`:return d(e);case`choose_running`:i({kind:`choice`,task:e,to:t,position:n.position,reasons:[]});return;case`confirm_done`:i({kind:`confirm_done`,task:e,to:t,position:n.position,reasons:a.reasons});return;case`move`:await s(e.id,async()=>{await l(e,t,{position:n.position})})}},[u,d,l,s]),p=(0,U.useCallback)((e,t)=>s(e.id,async()=>{try{await ue(e.id,{position:t})}catch(e){B.error(`Could not reorder: ${A(e)}`)}}),[s]),m=async e=>{if(!r)return;let t=r;o(e);try{if(t.kind===`fresh_attempt`)try{await le(t.task.id,`new-attempt`,{},`?fresh=true`),B.info(`New attempt in a fresh session requested for "${t.task.title}".`)}catch(e){B.error(`Could not start a new attempt: ${A(e)}`)}else t.via===`accept`?await s(t.task.id,async()=>{try{await le(t.task.id,`accept`,{confirm:!0}),B.success(`Accepted "${t.task.title}". It is Done.`)}catch(e){B.error(`Could not accept: ${A(e)}`)}}):await s(t.task.id,async()=>{await l(t.task,t.to,{position:t.position,...t.carry,...e===`confirm`?{confirm:!0}:{onRunning:e}})})}finally{o(null),i(e=>e===t?null:e)}},h=(0,U.useCallback)(e=>s(e.id,async()=>{try{await le(e.id,`accept`,{}),B.success(`Accepted "${e.title}". It is Done.`)}catch(t){if(de(t)){i({kind:`confirm_done`,task:e,to:`done`,reasons:[A(t)],via:`accept`});return}B.error(`Could not accept: ${A(t)}`)}}),[s]),_=(0,U.useMemo)(()=>({move:f,runNow:u,newAttempt:d,reorder:p,accept:h,isBusy:e=>!!t[e]}),[f,u,d,p,h,t]),y=()=>{a||i(null)};return(0,Z.jsxs)(Hi.Provider,{value:_,children:[e,(0,Z.jsx)(mt,{open:r?.kind===`choice`,onClose:y,title:`This task is running`,description:r?`Moving "${r.task.title}" to ${z[r.to]} needs a decision about its active run. Nothing changes until you choose.`:void 0,footer:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(v,{onClick:y,disabled:!!a,children:`Keep running`}),(0,Z.jsx)(v,{icon:(0,Z.jsx)(st,{className:`size-4`}),busy:a===`pause`,disabled:!!a,onClick:()=>void m(`pause`),children:`Pause automation`}),(0,Z.jsx)(v,{variant:`danger`,icon:(0,Z.jsx)(Ze,{className:`size-4`}),busy:a===`stop`,disabled:!!a,onClick:()=>void m(`stop`),children:`Stop execution`})]}),children:(0,Z.jsxs)(`ul`,{className:`flex flex-col gap-2 text-sm`,children:[(0,Z.jsxs)(`li`,{children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:`Pause automation`}),`: you take over the session. The agent keeps its current turn, and automatic continuations, retries and successor runs stop until you return it to automation.`]}),(0,Z.jsxs)(`li`,{children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:`Stop execution`}),`: aborts the current run. The session and its workspace are kept.`]})]})}),(0,Z.jsxs)(_t,{open:r?.kind===`confirm_done`,onClose:y,title:`Accept and mark Done?`,description:Wi,danger:!1,confirmLabel:`Accept and mark Done`,busy:a===`confirm`,onConfirm:()=>void m(`confirm`),children:[(0,Z.jsx)(`p`,{className:`mb-2 text-sm`,children:`These items are unresolved:`}),(0,Z.jsx)(`ul`,{className:`list-disc space-y-1 pl-5 text-sm`,children:r?.reasons.map(e=>(0,Z.jsx)(`li`,{children:e},e))}),r&&r.task.acceptanceCriteria.length>0&&(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`p`,{className:`mt-3 mb-1 text-sm font-medium`,children:`Acceptance criteria`}),(0,Z.jsx)(`ul`,{className:`list-disc space-y-1 pl-5 text-sm text-muted`,children:r.task.acceptanceCriteria.map(e=>(0,Z.jsx)(`li`,{children:e},e))})]})]}),(0,Z.jsx)(_t,{open:r?.kind===`fresh_attempt`,onClose:y,title:`Start a fresh session?`,description:r?.reasons[0],danger:!1,confirmLabel:`Start fresh session`,busy:a===`confirm`,onConfirm:()=>void m(`confirm`),children:(0,Z.jsx)(`p`,{className:`text-sm`,children:`The previous Pi session is no longer available on the host, so the new attempt cannot continue it. A fresh session starts with the task objective and your review feedback.`})})]})}function Ki(e){let t=j(e=>e.runs),n=j(e=>e.hosts),r=j(e=>e.sessions),i=j(e=>e.workspaces),a=j(e=>e.projects),o=j(e=>e.attention),s=j(e=>e.interactions);return(0,U.useMemo)(()=>{if(!e)return{run:void 0,hostName:null,hostOffline:!1,branch:null,projectName:null,attention:[],pendingInteraction:void 0};let c=e.currentRunId?t[e.currentRunId]:void 0,l=e.sessionId?r[e.sessionId]:void 0,u=c?.hostId??l?.hostId??e.policy.hostId??null,f=u?n[u]:void 0,p=(l?.workspaceId?i[l.workspaceId]:void 0)?.branch??(e.policy.workspace.mode===`new_worktree`?e.policy.workspace.branch:null)??(e.policy.workspace.mode===`existing`?i[e.policy.workspace.workspaceId]?.branch??null:null),m=Object.values(o).filter(t=>d(t)&&(t.taskId===e.id||!!e.sessionId&&t.sessionId===e.sessionId)),h=e.sessionId?D(s,e.sessionId)[0]:void 0;return{run:c,hostName:f?.name??null,hostOffline:!!f&&f.connectivity!==`connected`,branch:p??null,projectName:a[e.projectId]?.name??null,attention:m,pendingInteraction:h}},[e,t,n,r,i,a,o,s])}function qi(e,t,n){if(e.blocked)return{icon:p,text:`Blocked: ${e.blocked.reason}`,tone:`danger`};if(e.state===`in_progress`&&t){let e=ut[t.state],n=t.controlMode===`human`?` · You have control`:``;return{icon:e.icon,text:`${e.label}${n}`,tone:e.tone,spin:e.spin,pulse:e.pulse}}return e.state===`ready`?n&&!n.eligible?{icon:tt,text:n.message||Oe[n.wait],tone:`warning`}:n?.eligible?{icon:tt,text:`Starting on ${n.hostName}`,tone:`info`}:{icon:tt,text:`Queued for dispatch`,tone:`neutral`}:e.state===`review`?e.review.changesRequested?{icon:p,text:`Changes requested`,tone:`warning`}:t?.outcome?{icon:ut.succeeded.icon,text:t.outcome.summary||`Ready for review`,tone:`info`}:{icon:ut.succeeded.icon,text:`Ready for review`,tone:`info`}:null}var Ji=`Accepting marks the task Done. It does not merge or push.`;function Yi(e){return e.sessionId?`${V.session(e.sessionId)}?tab=changes`:null}function Xi(e){let t=!!e&&(e.state===`ready`||e.state===`backlog`),n=t?`${e.id}:${e.state}:${e.updatedAt}`:null,r=wt(n,t=>Ee(e.id,t)),i=j(e=>e.hosts),a=j(e=>e.tasks),o=j(e=>e.projects),s=j(e=>e.runs),c=j(e=>e.dispatchPaused),l=(0,U.useMemo)(()=>{if(!e)return;let t={};for(let e of Object.values(s)){if(!Fe(e))continue;let n=a[e.taskId]?.projectId;n&&(t[n]=(t[n]??0)+1)}return he({project:o[e.projectId],hostId:e.policy.hostId,dependencies:e.dependencies,notBefore:e.notBefore},{hosts:i,tasks:a,dispatchPaused:c,runningByProject:t})},[e,i,a,o,s,c]),u=r.data,d;return t?u?d=!u.eligible&&u.wait===`not_ready`?l:u:r.error&&(d=l):d=void 0,{eligibility:d,loading:r.loading&&!r.data,error:r.error,estimated:!!d&&d===l}}function Zi({title:e,children:t,action:n}){let r=(0,U.useId)();return(0,Z.jsxs)(`section`,{"aria-labelledby":r,className:`flex min-w-0 flex-col gap-2 border-b border-border py-4 last:border-b-0`,children:[(0,Z.jsxs)(`div`,{className:`flex items-center gap-2`,children:[(0,Z.jsx)(`h3`,{id:r,className:`min-w-0 flex-1 text-sm font-semibold`,children:e}),n]}),t]})}function Q({label:e,children:t}){return(0,Z.jsxs)(`div`,{className:`grid min-w-0 grid-cols-[minmax(7rem,auto)_1fr] gap-x-3 text-sm`,children:[(0,Z.jsx)(`dt`,{className:`text-muted`,children:e}),(0,Z.jsx)(`dd`,{className:`min-w-0 break-words`,children:t})]})}function Qi({task:e,eligibility:t,block:n}){let i=Ui(),a=i.isBusy(e.id),o=t?(0,Z.jsx)($i,{e:t,prefix:e.state===`backlog`?`If made ready: `:``}):null;switch(e.state){case`backlog`:return(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-1`,children:[(0,Z.jsx)(v,{variant:`primary`,block:n,busy:a,icon:(0,Z.jsx)(He,{className:`size-4`}),onClick:()=>void i.move(e,`ready`),children:`Make ready`}),o]});case`ready`:return(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col gap-1`,children:[(0,Z.jsx)(v,{variant:`primary`,block:n,busy:a,icon:(0,Z.jsx)(He,{className:`size-4`}),onClick:()=>void i.runNow(e),children:`Run now`}),o]});case`in_progress`:return e.sessionId?(0,Z.jsxs)(r,{to:V.session(e.sessionId),className:y(`primary`,`md`,n?`w-full`:void 0),children:[(0,Z.jsx)(I,{"aria-hidden":!0,className:`size-4`}),`Open session`]}):(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:e.blocked?`No session is attached to this task.`:`The session is starting; Open session appears once the host confirms the launch.`});case`review`:{let t=Yi(e);return t?(0,Z.jsxs)(r,{to:t,className:y(`primary`,`md`,n?`w-full`:void 0),children:[(0,Z.jsx)(nt,{"aria-hidden":!0,className:`size-4`}),`Review changes`]}):(0,Z.jsxs)(`a`,{href:`#task-review`,className:y(`primary`,`md`,n?`w-full`:void 0),children:[(0,Z.jsx)(nt,{"aria-hidden":!0,className:`size-4`}),`Review changes`]})}case`done`:return(0,Z.jsx)(v,{variant:`primary`,block:n,busy:a,icon:(0,Z.jsx)(Rt,{className:`size-4`}),onClick:()=>void i.move(e,`backlog`),children:`Reopen to Backlog`});case`canceled`:return(0,Z.jsx)(v,{variant:`primary`,block:n,busy:a,icon:(0,Z.jsx)(Rt,{className:`size-4`}),onClick:()=>void i.move(e,`backlog`),children:`Restore to Backlog`})}}function $i({e,prefix:t=``}){let n=e.eligible?rt:tt;return(0,Z.jsxs)(`p`,{role:`status`,className:h(`flex items-start gap-1.5 text-sm`,e.eligible?`text-success`:`text-warning`),children:[(0,Z.jsx)(n,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0`}),(0,Z.jsxs)(`span`,{className:`min-w-0 break-words text-text`,children:[t,ge(e)]})]})}function ea({task:e,onDeleted:t}){let n=Ki(e),{eligibility:i,error:a}=Xi(e),o=j(e=>e.tasks),s=j(e=>e.hosts),c=j(e=>e.profiles),l=j(e=>e.projects),d=j(e=>e.workspaces),f=j(e=>e.runs),h=wt(`${e.id}:${e.currentRunId??``}`,t=>oe(e.id,t)),_=(0,U.useMemo)(()=>{let t=new Map;for(let e of h.data??[])t.set(e.id,e);for(let n of u(f,e.id)){let e=t.get(n.id);(!e||e.updatedAt<=n.updatedAt)&&t.set(n.id,n)}return[...t.values()].sort((e,t)=>t.attempt-e.attempt||t.createdAt.localeCompare(e.createdAt))},[h.data,f,e.id]),[E,D]=(0,U.useState)(!1),O=l[e.projectId],k=n.run,M=qi(e,k,i),te=e.policy.hostId??O?.defaultHostId??null,N=te?s[te]:void 0,P=k?.hostId?s[k.hostId]:void 0,ne=P&&P.connectivity!==`connected`?P:void 0,re=e.policy.profileId??O?.defaultProfileId??null,ie=j(t=>e.sessionId?m(t.interactions,e.sessionId):0);return(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col`,"data-testid":`task-detail`,children:[ie>0&&e.sessionId&&n.pendingInteraction&&(0,Z.jsx)(T,{count:ie,to:V.interaction(e.sessionId,n.pendingInteraction.id),className:`mt-3`}),ne&&(0,Z.jsx)(S,{compact:!0,className:`mt-3`,hostName:ne.name,connectivity:ne.connectivity===`reconnecting`?`reconnecting`:`unreachable`,lastSeenAt:ne.lastSeenAt,detail:`The run keeps its last known state. Switchyard does not restart it on another host.`}),(0,Z.jsx)(Zi,{title:`Objective and acceptance criteria`,action:!E&&(0,Z.jsx)(v,{size:`sm`,variant:`ghost`,icon:(0,Z.jsx)(Be,{className:`size-3.5`}),onClick:()=>D(!0),children:`Edit`}),children:E?(0,Z.jsx)(ia,{task:e,onDone:()=>D(!1)}):(0,Z.jsxs)(Z.Fragment,{children:[e.objective.trim()?(0,Z.jsx)(xt,{text:e.objective}):(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:`No objective yet. Edit the task to describe what done looks like.`}),(0,Z.jsx)(`h4`,{className:`pt-1 text-xs font-semibold tracking-wide text-muted uppercase`,children:`Acceptance criteria`}),e.acceptanceCriteria.length>0?(0,Z.jsx)(`ul`,{className:`list-disc space-y-1 pl-5 text-sm`,children:e.acceptanceCriteria.map(e=>(0,Z.jsx)(`li`,{className:`break-words`,children:e},e))}):(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:`No acceptance criteria.`})]})}),(0,Z.jsxs)(Zi,{title:`State`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsx)(et,{kind:`task`,value:e.state}),(0,Z.jsx)(F,{priority:e.priority,suffix:` priority`,muted:!0,className:`text-sm`})]}),e.blocked&&(0,Z.jsxs)(`p`,{className:`flex items-start gap-1.5 rounded-md bg-danger-soft px-3 py-2 text-sm`,children:[(0,Z.jsx)(p,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-danger`}),(0,Z.jsxs)(`span`,{className:`min-w-0 break-words`,children:[(0,Z.jsx)(`span`,{className:`font-medium`,children:`Blocked:`}),` `,e.blocked.reason]})]}),M&&!e.blocked&&!(e.state===`ready`&&i)&&(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:M.text}),(e.state===`ready`||e.state===`backlog`)&&i&&(0,Z.jsx)($i,{e:i,prefix:e.state===`backlog`?`If made ready: `:``}),a!==null&&g(a)&&a.status===404&&(0,Z.jsx)(`p`,{className:`text-xs text-muted`,children:`Eligibility is estimated on this device; the coordinator did not report it.`}),e.notBefore&&(0,Z.jsxs)(`p`,{className:`text-sm text-muted`,children:[`Not before `,b(e.notBefore)]})]}),(0,Z.jsxs)(Zi,{title:`Current run`,children:[k?(0,Z.jsxs)(`dl`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(Q,{label:`Status`,children:(0,Z.jsx)(et,{kind:`run`,value:k.state,size:`sm`})}),(0,Z.jsx)(Q,{label:`Attempt`,children:k.attempt}),(0,Z.jsx)(Q,{label:`Control`,children:k.controlMode===`human`?`You (taken over from automation)`:`Automation`}),P&&(0,Z.jsx)(Q,{label:`Host`,children:P.name}),k.startedAt&&(0,Z.jsx)(Q,{label:`Started`,children:x(k.startedAt)}),(0,Z.jsx)(Q,{label:`Continuations`,children:k.continuationsUsed}),(0,Z.jsx)(Q,{label:`Usage`,children:k.usage.accounting===`available`?`${k.usage.tokens??0} tokens${k.usage.costUsd===null?``:` · $${k.usage.costUsd.toFixed(2)}`}`:k.usage.note??`Token/cost accounting not reported`}),k.outcome&&(0,Z.jsx)(Q,{label:`Outcome`,children:k.outcome.summary})]}):(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:`No run yet.`}),e.sessionId&&e.state!==`in_progress`&&e.state!==`review`&&(0,Z.jsx)(`div`,{children:(0,Z.jsxs)(r,{to:V.session(e.sessionId),className:y(`secondary`,`sm`),children:[(0,Z.jsx)(I,{"aria-hidden":!0,className:`size-3.5`}),`Open session`]})})]}),e.state===`review`&&(0,Z.jsx)(ra,{task:e}),(0,Z.jsx)(Zi,{title:`Dependencies`,children:e.dependencies.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:`No dependencies.`}):(0,Z.jsx)(`ul`,{className:`flex flex-col gap-1`,children:e.dependencies.map(e=>{let t=o[e];return(0,Z.jsx)(`li`,{className:`flex min-w-0 items-center gap-2 text-sm`,children:t?(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(et,{kind:`task`,value:t.state,size:`sm`}),(0,Z.jsx)(yt,{to:V.task(e),variant:`action`,className:`truncate`,children:t.title})]}):(0,Z.jsx)(`span`,{className:`text-muted`,children:`A task that is no longer available`})},e)})})}),(0,Z.jsxs)(Zi,{title:`Host, profile and workspace`,children:[(0,Z.jsxs)(`dl`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(Q,{label:`Project`,children:O?.name??`Unknown project`}),(0,Z.jsx)(Q,{label:`Host`,children:e.policy.hostId?N?.name??`Unknown host`:`Project default${N?` (${N.name})`:``}`}),(0,Z.jsx)(Q,{label:`Profile`,children:e.policy.profileId?c[e.policy.profileId]?.name??`Unknown profile`:`Project default${re&&c[re]?` (${c[re].name})`:``}`}),(0,Z.jsx)(Q,{label:`Workspace`,children:e.policy.workspace.mode===`existing`?`Existing: ${d[e.policy.workspace.workspaceId]?.branch??d[e.policy.workspace.workspaceId]?.path??`unknown workspace`}`:`New worktree${e.policy.workspace.branch?` on ${e.policy.workspace.branch}`:``}${e.policy.workspace.base?` from ${e.policy.workspace.base}`:``}`}),O&&(0,Z.jsx)(Q,{label:`Sharing`,children:O.workspaceSharing===`single_writer`?`Single writer`:`Shared`})]}),N&&!N.piCompatible&&(0,Z.jsx)(ee,{capability:`Running on this host`,reason:`Pi ${N.piVersion??`(unknown version)`} on ${N.name} is not compatible with Switchyard.`})]}),(0,Z.jsxs)(Zi,{title:`Limits and completion`,children:[(0,Z.jsxs)(`dl`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(Q,{label:`Continuation`,children:e.policy.continuation.enabled?`Up to ${e.policy.continuation.maxContinuations} continuations within ${e.policy.continuation.maxElapsedMinutes} min${e.policy.continuation.maxTokens?`, ${e.policy.continuation.maxTokens} tokens`:``}${e.policy.continuation.maxCostUsd?`, $${e.policy.continuation.maxCostUsd}`:``}`:`Off`}),(0,Z.jsx)(Q,{label:`Checks`,children:e.policy.completion.checks===null?`Project default${O?.checks.length?` (${O.checks.join(`, `)})`:` (none)`}`:e.policy.completion.checks.length>0?e.policy.completion.checks.join(`, `):`None`}),(0,Z.jsx)(Q,{label:`Human review`,children:e.policy.completion.requireHumanReview?`Required`:`Not required`})]}),k&&k.checks.length>0&&(0,Z.jsx)(`ul`,{className:`flex flex-col gap-1 text-sm`,children:k.checks.map(e=>(0,Z.jsxs)(`li`,{className:`flex min-w-0 items-start gap-1.5`,children:[e.exitCode===0?(0,Z.jsx)(rt,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-success`}):(0,Z.jsx)(p,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-danger`}),(0,Z.jsx)(`span`,{className:`min-w-0 break-all font-mono text-xs`,children:e.command}),(0,Z.jsx)(`span`,{className:`shrink-0 text-xs text-muted`,children:e.exitCode===0?`Passed`:`Failed (${e.exitCode??`no exit code`})`})]},e.command))})]}),(0,Z.jsxs)(Zi,{title:`Run history and activity`,children:[h.error!==null&&!h.data&&_.length===0&&(0,Z.jsx)(w,{compact:!0,title:`Could not load run history`,error:A(h.error),onRetry:h.reload}),_.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:h.loading?`Loading runs…`:`No runs yet.`}):(0,Z.jsx)(`ol`,{className:`flex flex-col gap-2`,children:_.map(e=>(0,Z.jsxs)(`li`,{className:`flex min-w-0 flex-col gap-0.5 rounded-md border border-border px-3 py-2 text-sm`,children:[(0,Z.jsxs)(`div`,{className:`flex flex-wrap items-center gap-2`,children:[(0,Z.jsxs)(`span`,{className:`font-medium`,children:[`Attempt `,e.attempt]}),(0,Z.jsx)(et,{kind:`run`,value:e.state,size:`sm`})]}),e.outcome&&(0,Z.jsx)(`p`,{className:`break-words text-muted`,children:e.outcome.summary}),(0,Z.jsxs)(`p`,{className:`text-xs text-subtle`,children:[e.startedAt?`Started ${b(e.startedAt)}`:`Created ${b(e.createdAt)}`,e.startedAt&&e.endedAt?` · ${C(Date.parse(e.endedAt)-Date.parse(e.startedAt))}`:``,e.infraRetries>0?` · ${e.infraRetries} infrastructure retries`:``]})]},e.id))}),e.review.feedback.length>0&&(0,Z.jsxs)(`div`,{className:`text-sm`,children:[(0,Z.jsx)(`p`,{className:`font-medium`,children:`Review feedback`}),(0,Z.jsx)(`ul`,{className:`list-disc pl-5 text-muted`,children:e.review.feedback.map(e=>(0,Z.jsx)(`li`,{className:`break-words`,children:e},e))})]}),(0,Z.jsxs)(`p`,{className:`text-xs text-subtle`,children:[`Created `,b(e.createdAt),` · last activity `,x(e.lastActivityAt),e.origin.kind===`automation`?` · created by an automation`:``]})]}),(0,Z.jsx)(ta,{task:e,onDeleted:t})]})}function ta({task:e,onDeleted:t}){let[n,r]=(0,U.useState)(!1),[i,a]=(0,U.useState)(!1);return e.state!==`backlog`&&e.state!==`canceled`&&e.state!==`done`?null:(0,Z.jsxs)(`div`,{className:`py-4`,children:[(0,Z.jsx)(v,{variant:`ghost`,size:`sm`,icon:(0,Z.jsx)(te,{className:`size-4`}),className:`text-danger`,onClick:()=>r(!0),children:`Delete task`}),(0,Z.jsx)(_t,{open:n,onClose:()=>r(!1),title:`Delete this task?`,description:`"${e.title}" and its history are removed from the board. Sessions and workspaces are kept.`,confirmLabel:`Delete task`,busy:i,onConfirm:async()=>{a(!0);try{await fe(e.id),B.success(`Deleted "${e.title}"`),r(!1),t?.()}catch(e){B.error(`Could not delete: ${A(e)}`)}finally{a(!1)}}})]})}var na=e=>`sy:feedback:${e}`;function ra({task:e}){let t=Ui(),[n,r]=(0,U.useState)(()=>sessionStorage.getItem(na(e.id))??``),[i,a]=(0,U.useState)(null),o=(0,U.useId)();(0,U.useEffect)(()=>{n?sessionStorage.setItem(na(e.id),n):sessionStorage.removeItem(na(e.id))},[n,e.id]);let s=n.split(`
|
|
6
|
-
`).map(e=>e.replace(/^[-*]\s*/,``).trim()).filter(Boolean);return(0,Z.jsxs)(`section`,{id:`task-review`,"aria-labelledby":`${o}-h`,className:`flex min-w-0 flex-col gap-3 border-b border-border py-4`,children:[(0,Z.jsx)(`h3`,{id:`${o}-h`,className:`text-sm font-semibold`,children:`Review`}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`label`,{htmlFor:o,className:`text-sm font-medium`,children:`Feedback for the next attempt`}),(0,Z.jsx)(vt,{id:o,minRows:3,maxHeight:`40vh`,placeholder:`One change per line`,value:n,onChange:e=>r(e.target.value)}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsx)(v,{icon:(0,Z.jsx)(It,{className:`size-4`}),busy:i===`changes`,disabled:i!==null||s.length===0,onClick:async()=>{a(`changes`);try{await pe(e.id,s),r(``),B.success(`Changes requested. Start a new attempt when ready.`)}catch(e){B.error(`Could not request changes: ${A(e)}`)}finally{a(null)}},children:`Request changes`}),(0,Z.jsx)(v,{icon:(0,Z.jsx)(Rt,{className:`size-4`}),busy:t.isBusy(e.id),disabled:i!==null,onClick:()=>void t.newAttempt(e),children:`Start new attempt`})]}),s.length===0&&(0,Z.jsx)(`p`,{className:`text-xs text-muted`,children:`Write at least one line of feedback to request changes.`})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(v,{variant:`primary`,icon:(0,Z.jsx)(rt,{className:`size-4`}),busy:t.isBusy(e.id),disabled:i!==null,onClick:()=>void t.accept(e),children:`Accept task`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted`,children:Ji})]})]})}function ia({task:e,onDone:t}){let n=j(e=>e.tasks),[r,i]=(0,U.useState)(e.title),[a,o]=(0,U.useState)(e.objective),[s,c]=(0,U.useState)(e.acceptanceCriteria.join(`
|
|
7
|
-
`)),[l,u]=(0,U.useState)(e.priority),[d,f]=(0,U.useState)(e.dependencies),[p,m]=(0,U.useState)(!1),[h,g]=(0,U.useState)(null),_=(0,U.useId)(),y=Object.values(n).filter(t=>t.projectId===e.projectId&&t.id!==e.id&&t.state!==`canceled`&&!t.hiddenFromBoard).sort((e,t)=>e.title.localeCompare(t.title));return(0,Z.jsxs)(`form`,{className:`flex flex-col gap-3`,onSubmit:async n=>{if(n.preventDefault(),!r.trim())g(`Title is required.`);else{m(!0),g(null);try{await ue(e.id,{title:r.trim(),objective:a,acceptanceCriteria:s.split(`
|
|
8
|
-
`).map(e=>e.trim()).filter(Boolean),priority:l,dependencies:d}),B.success(`Task saved`),t()}catch(e){g(A(e))}finally{m(!1)}}},children:[(0,Z.jsx)(N,{id:`${_}-title`,label:`Title`,children:(0,Z.jsx)(H,{id:`${_}-title`,value:r,onChange:e=>i(e.target.value),required:!0})}),(0,Z.jsx)(N,{id:`${_}-obj`,label:`Objective`,children:(0,Z.jsx)(vt,{id:`${_}-obj`,minRows:4,maxHeight:`40vh`,value:a,onChange:e=>o(e.target.value)})}),(0,Z.jsx)(N,{id:`${_}-crit`,label:`Acceptance criteria (one per line)`,children:(0,Z.jsx)(vt,{id:`${_}-crit`,minRows:2,maxHeight:`30vh`,value:s,onChange:e=>c(e.target.value)})}),(0,Z.jsx)(N,{id:`${_}-prio`,label:`Priority`,children:e=>(0,Z.jsx)(ae,{...e,value:l,onChange:u})}),(0,Z.jsx)(aa,{candidates:y,value:d,onChange:f}),h&&(0,Z.jsx)(`p`,{role:`alert`,className:`text-sm text-danger`,children:h}),(0,Z.jsxs)(`div`,{className:`flex gap-2`,children:[(0,Z.jsx)(v,{type:`submit`,variant:`primary`,busy:p,children:`Save`}),(0,Z.jsx)(v,{onClick:t,disabled:p,children:`Cancel`})]})]})}function aa({candidates:e,value:t,onChange:n}){let[r,i]=(0,U.useState)(``),a=(0,U.useId)(),o=e.filter(e=>t.includes(e.id)||e.title.toLowerCase().includes(r.toLowerCase())).slice(0,50);return(0,Z.jsxs)(`fieldset`,{className:`flex min-w-0 flex-col gap-1`,children:[(0,Z.jsx)(`legend`,{className:`text-sm font-medium`,children:`Dependencies`}),e.length===0?(0,Z.jsx)(`p`,{className:`text-sm text-muted`,children:`No other tasks in this project.`}):(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(`label`,{htmlFor:a,className:`sr-only`,children:`Filter tasks`}),(0,Z.jsx)(H,{id:a,placeholder:`Filter tasks`,value:r,onChange:e=>i(e.target.value)}),(0,Z.jsx)(`ul`,{className:`max-h-48 overflow-y-auto rounded-md border border-border`,children:o.map(e=>(0,Z.jsx)(`li`,{children:(0,Z.jsx)(Et,{className:`w-full px-3 py-1.5 hover:bg-surface-2`,label:(0,Z.jsxs)(`span`,{className:`flex min-w-0 items-center gap-2`,children:[(0,Z.jsx)(`span`,{className:`min-w-0 flex-1 truncate`,children:e.title}),(0,Z.jsx)(`span`,{className:`shrink-0 text-xs text-muted`,children:z[e.state]})]}),checked:t.includes(e.id),onChange:r=>n(r?[...t,e.id]:t.filter(t=>t!==e.id))})},e.id))}),t.length>0&&(0,Z.jsxs)(`p`,{className:`text-xs text-muted`,children:[t.length,` selected. The task waits until they are Done.`]})]})]})}var oa=`sy:new-task-draft`;function sa(e){return{title:``,objective:``,projectId:e,advanced:!1,priority:2,dependencies:[],hostId:``,profileId:``,branch:``,criteria:``,continuation:!1,contObjective:``,maxContinuations:`3`,maxMinutes:`60`,maxTokens:``,maxCost:``,checks:``,checksMode:`default`,humanReview:!0}}function ca(e){try{let t=sessionStorage.getItem(oa);if(t)return{...sa(e),...JSON.parse(t)}}catch{}return sa(e)}var la=e=>e.split(`
|
|
9
|
-
`).map(e=>e.trim()).filter(Boolean);function ua(e){let t={},n={};if(e.hostId&&(n.hostId=e.hostId),e.profileId&&(n.profileId=e.profileId),e.branch.trim()&&(n.workspace={mode:`new_worktree`,branch:e.branch.trim(),base:null}),e.continuation){let r=Number(e.maxContinuations),i=Number(e.maxMinutes),a=e.maxTokens.trim()?Number(e.maxTokens):null,o=e.maxCost.trim()?Number(e.maxCost):null;e.contObjective.trim()||(t.contObjective=`Continuation needs an objective.`),(!Number.isInteger(r)||r<1||r>50)&&(t.maxContinuations=`Use 1 to 50.`),(!Number.isInteger(i)||i<1||i>1440)&&(t.maxMinutes=`Use 1 to 1440 minutes.`),a!==null&&(!Number.isInteger(a)||a<=0)&&(t.maxTokens=`Use a positive whole number.`),o!==null&&(!Number.isFinite(o)||o<=0)&&(t.maxCost=`Use a positive amount.`),n.continuation={enabled:!0,objective:e.contObjective.trim(),maxContinuations:r,maxElapsedMinutes:i,maxTokens:a,maxCostUsd:o}}return e.checksMode!==`custom`&&e.humanReview||(n.completion={checks:e.checksMode===`custom`?la(e.checks):null,requireHumanReview:e.humanReview}),{policy:n,errors:t}}function da({defaultProjectId:e,onCreated:t,onCancel:n}){let r=f(),i=s(),a=j(e=>e.profiles),o=j(e=>e.tasks),c=j(e=>e.runs),l=j(e=>e.hosts),u=j(e=>e.dispatchPaused),[d,p]=(0,U.useState)(()=>ca(e??r[0]?.id??``)),[m,h]=(0,U.useState)(null),[g,_]=(0,U.useState)({}),[y,b]=(0,U.useState)(null),x=(0,U.useId)(),S=(e,t)=>p(n=>({...n,[e]:t}));(0,U.useEffect)(()=>{!d.projectId&&r[0]&&p(e=>({...e,projectId:r[0].id}))},[d.projectId,r]),(0,U.useEffect)(()=>{sessionStorage.setItem(oa,JSON.stringify(d))},[d]);let C=r.find(e=>e.id===d.projectId),w=C?.defaultHostId?l[C.defaultHostId]:void 0,T=C?.defaultProfileId?a[C.defaultProfileId]:void 0,E=Object.values(o).filter(e=>e.projectId===d.projectId&&e.state!==`canceled`&&!e.hiddenFromBoard).sort((e,t)=>e.title.localeCompare(t.title)),D=(0,U.useMemo)(()=>{let e={};for(let t of Object.values(c)){if(!Fe(t))continue;let n=o[t.taskId]?.projectId;n&&(e[n]=(e[n]??0)+1)}return he({project:C,hostId:d.hostId||null,dependencies:d.dependencies},{hosts:l,tasks:o,dispatchPaused:u,runningByProject:e})},[C,d.hostId,d.dependencies,l,o,c,u]),O=async e=>{let n={};d.title.trim()||(n.title=`Give the task a title.`),C||(n.projectId=`Choose a project.`);let{policy:r,errors:i}=ua(d);if(Object.assign(n,i),_(n),Object.keys(n).length>0)Object.keys(i).length>0&&S(`advanced`,!0);else{h(e),b(null);try{let n=await se({projectId:d.projectId,title:d.title.trim(),objective:d.objective,acceptanceCriteria:la(d.criteria),dependencies:d.dependencies,priority:d.priority,state:e,...Object.keys(r).length>0?{policy:r}:{}});if(sessionStorage.removeItem(oa),e===`ready`){let e=ge(D);try{e=ge(await Ee(n.id))}catch{}B.success(`Created "${n.title}" in Ready. ${e}.`)}else B.success(`Created "${n.title}" in Backlog.`);t(n)}catch(e){b(A(e))}finally{h(null)}}};return(0,Z.jsxs)(`form`,{"data-testid":`new-task-form`,className:`flex min-w-0 flex-col gap-4`,onSubmit:e=>{e.preventDefault(),O(`backlog`)},children:[(0,Z.jsx)(N,{id:`${x}-title`,label:`Title`,error:g.title,children:e=>(0,Z.jsx)(H,{...e,value:d.title,autoFocus:!0,onChange:e=>S(`title`,e.target.value),placeholder:`What should be done?`})}),(0,Z.jsx)(N,{id:`${x}-objective`,label:`Objective`,children:(0,Z.jsx)(vt,{id:`${x}-objective`,minRows:3,maxHeight:`35vh`,value:d.objective,onChange:e=>S(`objective`,e.target.value),placeholder:`Context, constraints and what done looks like`})}),(0,Z.jsx)(N,{id:`${x}-project`,label:`Project`,error:g.projectId,children:e=>(0,Z.jsxs)(Tt,{...e,value:d.projectId,onChange:e=>p(t=>({...t,projectId:e.target.value,dependencies:[]})),children:[r.length===0&&(0,Z.jsx)(`option`,{value:``,children:`No projects yet`}),r.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.name},e.id))]})}),(0,Z.jsxs)(`div`,{children:[(0,Z.jsx)(yt,{size:`sm`,"aria-expanded":d.advanced,"aria-controls":`${x}-adv`,icon:d.advanced?(0,Z.jsx)(ne,{"aria-hidden":!0,className:`size-4`}):(0,Z.jsx)(ie,{"aria-hidden":!0,className:`size-4`}),onClick:()=>S(`advanced`,!d.advanced),children:`Advanced options`}),(0,Z.jsx)(`p`,{className:`text-xs text-muted`,children:`Unset options inherit the project defaults.`})]}),d.advanced&&(0,Z.jsxs)(`div`,{id:`${x}-adv`,className:`flex flex-col gap-4 rounded-lg border border-border p-3`,children:[(0,Z.jsx)(N,{id:`${x}-prio`,label:`Priority`,children:e=>(0,Z.jsx)(ae,{...e,value:d.priority,onChange:e=>S(`priority`,e)})}),(0,Z.jsx)(N,{id:`${x}-criteria`,label:`Acceptance criteria (one per line)`,children:(0,Z.jsx)(vt,{id:`${x}-criteria`,minRows:2,maxHeight:`25vh`,value:d.criteria,onChange:e=>S(`criteria`,e.target.value)})}),(0,Z.jsx)(aa,{candidates:E,value:d.dependencies,onChange:e=>S(`dependencies`,e)}),(0,Z.jsxs)(`div`,{className:`grid gap-4 sm:grid-cols-2`,children:[(0,Z.jsx)(N,{id:`${x}-host`,label:`Host`,children:(0,Z.jsxs)(Tt,{id:`${x}-host`,value:d.hostId,onChange:e=>S(`hostId`,e.target.value),children:[(0,Z.jsxs)(`option`,{value:``,children:[`Project default`,w?` (${w.name})`:``]}),i.map(e=>(0,Z.jsxs)(`option`,{value:e.id,children:[e.name,e.connectivity===`connected`?``:` (offline)`]},e.id))]})}),(0,Z.jsx)(N,{id:`${x}-profile`,label:`Pi profile`,children:(0,Z.jsxs)(Tt,{id:`${x}-profile`,value:d.profileId,onChange:e=>S(`profileId`,e.target.value),children:[(0,Z.jsxs)(`option`,{value:``,children:[`Project default`,T?` (${T.name})`:``]}),Object.values(a).map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.name},e.id))]})})]}),(0,Z.jsx)(N,{id:`${x}-branch`,label:`Branch`,hint:`Work happens in a new worktree on this branch.`,children:e=>(0,Z.jsx)(H,{...e,value:d.branch,placeholder:`Generated from the title`,onChange:e=>S(`branch`,e.target.value)})}),(0,Z.jsxs)(`fieldset`,{className:`flex flex-col gap-2`,children:[(0,Z.jsx)(`legend`,{className:`text-sm font-medium`,children:`Continuation limits`}),(0,Z.jsx)(Et,{label:`Continue automatically until done (off by default)`,checked:d.continuation,onChange:e=>S(`continuation`,e)}),d.continuation&&(0,Z.jsxs)(`div`,{className:`grid gap-3 sm:grid-cols-2`,children:[(0,Z.jsx)(N,{id:`${x}-cobj`,label:`Continuation objective`,error:g.contObjective,className:`sm:col-span-2`,children:e=>(0,Z.jsx)(H,{...e,value:d.contObjective,onChange:e=>S(`contObjective`,e.target.value)})}),(0,Z.jsx)(N,{id:`${x}-cmax`,label:`Max continuations`,error:g.maxContinuations,children:e=>(0,Z.jsx)(H,{...e,inputMode:`decimal`,value:d.maxContinuations,onChange:e=>S(`maxContinuations`,e.target.value)})}),(0,Z.jsx)(N,{id:`${x}-cmin`,label:`Max minutes`,error:g.maxMinutes,children:e=>(0,Z.jsx)(H,{...e,inputMode:`decimal`,value:d.maxMinutes,onChange:e=>S(`maxMinutes`,e.target.value)})}),(0,Z.jsx)(N,{id:`${x}-ctok`,label:`Max tokens (optional)`,error:g.maxTokens,children:e=>(0,Z.jsx)(H,{...e,inputMode:`decimal`,value:d.maxTokens,onChange:e=>S(`maxTokens`,e.target.value)})}),(0,Z.jsx)(N,{id:`${x}-ccost`,label:`Max cost USD (optional)`,error:g.maxCost,children:e=>(0,Z.jsx)(H,{...e,inputMode:`decimal`,value:d.maxCost,onChange:e=>S(`maxCost`,e.target.value)})}),(0,Z.jsx)(`p`,{className:`text-xs text-muted sm:col-span-2`,children:`Token and cost limits apply only when the Pi provider reports usage.`})]})]}),(0,Z.jsxs)(`fieldset`,{className:`flex flex-col gap-2`,children:[(0,Z.jsx)(`legend`,{className:`text-sm font-medium`,children:`Checks and review`}),(0,Z.jsx)(Et,{label:(0,Z.jsxs)(Z.Fragment,{children:[`Use custom checks instead of the project's`,C?.checks.length?` (${C.checks.join(`, `)})`:` (none)`]}),checked:d.checksMode===`custom`,onChange:e=>S(`checksMode`,e?`custom`:`default`)}),d.checksMode===`custom`&&(0,Z.jsx)(N,{id:`${x}-checks`,label:`Check commands (one per line; empty means no checks)`,children:(0,Z.jsx)(vt,{id:`${x}-checks`,minRows:2,className:`font-mono`,value:d.checks,onChange:e=>S(`checks`,e.target.value)})}),(0,Z.jsx)(Et,{label:`Require human review before Done`,checked:d.humanReview,onChange:e=>S(`humanReview`,e)})]})]}),y&&(0,Z.jsxs)(`p`,{role:`alert`,className:`rounded-md bg-danger-soft px-3 py-2 text-sm`,children:[`Could not create the task: `,y]}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-2 border-t border-border pt-3`,children:[(0,Z.jsx)($i,{e:D,prefix:`Make ready: `}),(0,Z.jsxs)(`div`,{className:`flex flex-wrap gap-2`,children:[(0,Z.jsx)(v,{type:`submit`,icon:(0,Z.jsx)(k,{className:`size-4`}),busy:m===`backlog`,disabled:m!==null,children:`Save to Backlog`}),(0,Z.jsx)(v,{variant:`primary`,icon:(0,Z.jsx)(He,{className:`size-4`}),busy:m===`ready`,disabled:m!==null,onClick:()=>void O(`ready`),children:`Make ready`}),(0,Z.jsx)(v,{variant:`ghost`,onClick:n,disabled:m!==null,children:`Cancel`})]}),(0,Z.jsx)(`p`,{className:`text-xs text-muted`,children:`Make ready authorizes dispatch. Nothing starts until the coordinator confirms.`})]})]})}function fa({task:e,showProject:t,wait:i,onOpen:a,drag:o,full:s,selected:c}){let u=Ki(e),d=j(e=>e.tasks),f=Ui(),p=n(),m=f.isBusy(e.id),g=qi(e,u.run,i),_=Se(e,d),v=u.attention[0],y=[{id:`open`,label:`Open details`,icon:(0,Z.jsx)(P,{className:`size-4`}),onSelect:()=>a(e)}];if(e.sessionId){let t=e.sessionId;y.push({id:`session`,label:`Open session`,icon:(0,Z.jsx)(I,{className:`size-4`}),onSelect:()=>p(V.session(t))})}y.push(`separator`);for(let t of ve(e))y.push({id:`move-${t}`,label:ha(e.state,t),icon:(0,Z.jsx)(ma,{state:t}),onSelect:()=>void f.move(e,t)});return(0,Z.jsxs)(`article`,{ref:o?.setNodeRef,"data-testid":`task-card`,"data-task-id":e.id,"aria-label":e.title,"aria-busy":m||void 0,style:o?.style,...o?.cardProps,className:h(`group relative flex min-w-0 flex-col gap-1.5 rounded-lg border bg-surface p-3 text-sm shadow-sm`,c?`border-accent`:`border-border`,o?.dragging&&`opacity-60`,s?`w-full`:``),children:[(0,Z.jsxs)(`div`,{className:`flex min-w-0 items-start gap-1`,children:[o&&(0,Z.jsx)(`button`,{type:`button`,ref:o.setHandleRef,...o.handleProps,"aria-label":`Drag ${e.title}`,title:`Drag to move (Space to pick up, arrows to move, Space to drop)`,className:`tap -ml-1.5 inline-flex h-7 w-5 shrink-0 cursor-grab items-center justify-center rounded text-subtle hover:bg-surface-2 hover:text-text`,children:(0,Z.jsx)(Mt,{"aria-hidden":!0,className:`size-4`})}),(0,Z.jsx)(`button`,{type:`button`,"data-card-open":e.id,onClick:()=>a(e),className:`tap min-w-0 flex-1 rounded text-left font-medium leading-snug`,children:(0,Z.jsx)(`span`,{className:`line-clamp-2 break-words`,children:e.title})}),m&&(0,Z.jsx)(E,{label:`Updating`,className:`mt-0.5 shrink-0`}),(0,Z.jsx)(re,{label:`Actions for ${e.title}`,items:y,trigger:t=>(0,Z.jsx)(`button`,{type:`button`,...t,"aria-label":`Move to… and other actions for ${e.title}`,title:`Move to…`,className:`tap -mr-1.5 inline-flex size-7 shrink-0 items-center justify-center rounded text-muted hover:bg-surface-2 hover:text-text`,children:(0,Z.jsx)(Qe,{"aria-hidden":!0,className:`size-4`})})})]}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted`,children:[(0,Z.jsx)(F,{priority:e.priority}),t&&u.projectName&&(0,Z.jsx)(`span`,{className:`min-w-0 truncate`,children:u.projectName})]}),g&&(0,Z.jsx)(pa,{icon:g.spin?(0,Z.jsx)(E,{className:`size-3.5`}):(0,Z.jsx)(g.icon,{"aria-hidden":!0,className:h(`size-3.5`,g.pulse&&`animate-pulse`)}),className:Je[g.tone],children:g.text}),(u.hostName||u.branch)&&(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1 text-xs text-muted`,children:[u.hostName&&(0,Z.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1`,children:[(0,Z.jsx)(qe,{"aria-hidden":!0,className:`size-3.5 shrink-0`}),(0,Z.jsxs)(`span`,{className:`truncate`,children:[u.hostName,u.hostOffline?` (offline)`:``]})]}),u.branch&&(0,Z.jsxs)(`span`,{className:`inline-flex min-w-0 items-center gap-1`,children:[(0,Z.jsx)(ze,{"aria-hidden":!0,className:`size-3.5 shrink-0`}),(0,Z.jsx)(`span`,{className:`truncate`,children:u.branch})]})]}),_&&(0,Z.jsx)(pa,{icon:(0,Z.jsx)(Ve,{"aria-hidden":!0,className:`size-3.5`}),className:`text-muted`,children:_}),u.pendingInteraction&&e.sessionId?(0,Z.jsxs)(r,{to:V.interaction(e.sessionId,u.pendingInteraction.id),className:`tap inline-flex min-w-0 items-center gap-1 rounded text-xs font-medium text-warning hover:underline`,children:[(0,Z.jsx)(l,{"aria-hidden":!0,className:`size-3.5 shrink-0`}),(0,Z.jsxs)(`span`,{className:`truncate`,children:[`Needs input: `,u.pendingInteraction.title]})]}):v?(0,Z.jsxs)(pa,{icon:(0,Z.jsx)(it,{"aria-hidden":!0,className:`size-3.5`}),className:Je[dt[v.reason].tone],children:[dt[v.reason].label,u.attention.length>1?` (+${u.attention.length-1})`:``]}):null,(0,Z.jsxs)(`div`,{className:`text-xs text-subtle`,children:[`Updated `,(0,Z.jsx)(`time`,{dateTime:e.lastActivityAt,children:x(e.lastActivityAt)})]})]})}function pa({icon:e,children:t,className:n}){return(0,Z.jsxs)(`div`,{className:h(`flex min-w-0 items-start gap-1 text-xs`,n),children:[(0,Z.jsx)(`span`,{className:`mt-0.5 shrink-0`,children:e}),(0,Z.jsx)(`span`,{className:`min-w-0 break-words line-clamp-2`,children:t})]})}function ma({state:e,className:t}){let n=Xe[e].icon;return(0,Z.jsx)(n,{"aria-hidden":!0,className:h(`size-4`,t)})}function ha(e,t){return e===`ready`&&t===`in_progress`?`Run now (In progress)`:e===`review`&&t===`in_progress`?`Start new attempt (In progress)`:e===`backlog`&&t===`ready`?`Make ready`:(e===`done`||e===`canceled`)&&t!==`canceled`?`Reopen to ${z[t]}`:t===`canceled`?`Cancel task`:t===`done`?`Accept (Done)`:`Move to ${z[t]}`}function ga(){let e=ft(e=>e.filters.board),t=ft(e=>e.setFilter),n=ft(e=>e.selectedProjectId),r=ft(e=>e.set),i=(0,U.useMemo)(()=>Le(e),[e]),a=j(e=>e.tasks),o=j(e=>e.runs),s=j(e=>e.attention),c=j(e=>e.projects),l=Ne(),u=n&&c[n]?n:null,d=(0,U.useMemo)(()=>{let e=new Set(me(s).keys());return Ce(a,i,{projectId:u,runs:o,attentionTaskIds:e})},[a,i,u,o,s]),f=(0,U.useMemo)(()=>{let e=new Map;for(let t of l.data?.queued??[])e.set(t.taskId,t.eligibility);return e},[l.data]),p=(0,U.useMemo)(()=>l.data?l.data.queued.filter(e=>!u||a[e.taskId]?.projectId===u).length:Object.values(a).filter(e=>e.state===`ready`&&!e.hiddenFromBoard&&(!u||e.projectId===u)).length,[l.data,a,u]),m=ce(i),h=(0,U.useMemo)(()=>Object.values(a).filter(e=>!e.hiddenFromBoard&&(!u||e.projectId===u)).length,[a,u]),g=m.reduce((e,t)=>e+d[t].length,0);return{filters:i,setFilters:e=>t(`board`,e),projectId:u,setProjectId:e=>r(`selectedProjectId`,e),columns:d,states:m,waits:f,queueCount:p,now:l,showProject:!u&&Object.keys(c).length>1,totalTasks:h,visibleCount:g}}var $={mainScrollTop:0,boardScrollLeft:0,columnScroll:{},focusTaskId:null},_a=`col:`,va=`card:`,ya=`task:`,ba=(e,{currentCoordinates:t,context:n})=>{if(e.code===`ArrowDown`)return{...t,y:t.y+72};if(e.code===`ArrowUp`)return{...t,y:t.y-72};if(e.code!==`ArrowRight`&&e.code!==`ArrowLeft`)return;e.preventDefault();let r=n.droppableContainers.toArray().filter(e=>String(e.id).startsWith(_a)).map(e=>({id:e.id,rect:n.droppableRects.get(e.id)})).filter(e=>!!e.rect).sort((e,t)=>e.rect.left-t.rect.left);if(r.length===0)return;let i=n.collisionRect?.width??0,a=t.x+i/2,o=r.findIndex(e=>a>=e.rect.left&&a<=e.rect.left+e.rect.width);o<0&&(o=0);let s=r[Math.max(0,Math.min(r.length-1,o+(e.code===`ArrowRight`?1:-1)))];return{x:s.rect.left+(s.rect.width-i)/2,y:t.y}},xa=e=>{let t=In(e);if(t.length>0){let e=t.find(e=>String(e.id).startsWith(va));return e?[e]:t}return Mn(e)};function Sa(e,t){if(e.startsWith(_a))return{state:e.slice(4),beforeId:null};if(e.startsWith(va)){let n=t[e.slice(5)];return n?{state:n.state,beforeId:n.id}:null}return null}function Ca({taskId:e}){let t=ga(),r=j(e=>e.hydrated),i=j(e=>e.projects),a=j(e=>e.tasks),o=Ui(),s=n(),c=We(V.board),l=ft(e=>e.paneSizes.boardColumn),[u,d]=(0,U.useState)(null),[f,p]=(0,U.useState)(!1),m=wn(Cn(wr,{activationConstraint:{distance:6}}),Cn(yr,{coordinateGetter:ba,keyboardCodes:{start:[`Space`],cancel:[`Escape`],end:[`Space`,`Enter`]}})),h=(0,U.useCallback)(e=>{e&&(e.scrollLeft=$.boardScrollLeft)},[]);(0,U.useEffect)(()=>{if(e||!$.focusTaskId)return;let t=$.focusTaskId;$.focusTaskId=null,requestAnimationFrame(()=>document.querySelector(`[data-card-open="${CSS.escape(t)}"]`)?.focus({preventScroll:!1}))},[e]);let g=e=>{$.focusTaskId=e.id,s(V.task(e.id),{state:Ge})},y=()=>{e&&($.focusTaskId=e),c()},b=e=>d(String(e.active.id).slice(5)),x=e=>{d(null);let n=String(e.active.id).slice(5),r=a[n];if(!r||!e.over)return;let i=Sa(String(e.over.id),a);if(!i||i.beforeId===n)return;let s=t.columns[i.state],c=Ie(s,i.beforeId,n);i.state===r.state?t.filters.sort===`priority`&&o.reorder(r,c):o.move(r,i.state,{position:c})},S={onDragStart:({active:e})=>`Picked up ${Ta(e.id,a)}.`,onDragOver:({active:e,over:t})=>t?`${Ta(e.id,a)} is over ${Ea(String(t.id),a)}.`:void 0,onDragEnd:({active:e,over:t})=>t?`Dropped ${Ta(e.id,a)} on ${Ea(String(t.id),a)}.`:`Dropped ${Ta(e.id,a)}. It did not move.`,onDragCancel:({active:e})=>`Moving ${Ta(e.id,a)} was canceled.`},C=u?a[u]:void 0,w=e?a[e]:void 0,T=r&&Object.keys(i).length===0,E=j(e=>e.runs),D=e=>{if(!C||e===C.state)return null;let t=C.currentRunId?E[C.currentRunId]:void 0;return L(C,e,t).kind===`invalid`?`invalid`:`valid`};return(0,Z.jsxs)(`div`,{"data-testid":`board`,className:`absolute inset-0 flex min-w-0 flex-col`,children:[(0,Z.jsxs)(`header`,{className:`flex min-w-0 flex-wrap items-center gap-2 border-b border-border px-4 py-2.5`,children:[(0,Z.jsx)(`h1`,{className:`mr-2 text-lg font-semibold`,children:`Board`}),(0,Z.jsx)(ye,{board:t}),(0,Z.jsx)(De,{board:t,className:`w-56 max-w-full`}),(0,Z.jsx)(Ae,{board:t}),(0,Z.jsxs)(`div`,{className:`ml-auto flex items-center gap-2`,children:[T&&(0,Z.jsx)(`span`,{className:`text-xs text-muted`,children:`Add a project first`}),(0,Z.jsx)(v,{variant:`primary`,icon:(0,Z.jsx)(Ue,{className:`size-4`}),onClick:()=>p(!0),disabled:T,children:`New task`})]})]}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-x-5 gap-y-2 border-b border-border px-4 py-2`,children:[(0,Z.jsx)(_e,{}),(0,Z.jsxs)(`span`,{className:`text-sm text-muted`,role:`status`,children:[t.queueCount,` queued`]}),(0,Z.jsx)(Pe,{board:t}),(0,Z.jsx)(je,{board:t}),(0,Z.jsx)(Me,{board:t})]}),(0,Z.jsx)(ke,{board:t}),r?T?(0,Z.jsx)(O,{icon:(0,Z.jsx)($e,{className:`size-8`}),title:`No projects yet`,description:`Tasks belong to a project. Add a project from a host checkout to start planning work.`,action:{label:`Add a project`,to:V.settings(`projects`)}}):t.totalTasks===0?(0,Z.jsx)(O,{icon:(0,Z.jsx)($e,{className:`size-8`}),title:`No tasks yet`,description:`Create a task in Backlog, or make it ready so the dispatcher starts it.`,action:{label:`New task`,onClick:()=>p(!0)}}):(0,Z.jsxs)(xi,{sensors:m,collisionDetection:xa,onDragStart:b,onDragEnd:x,onDragCancel:()=>d(null),accessibility:{announcements:S,screenReaderInstructions:{draggable:`To move a task, press Space to pick it up, use the arrow keys to move between columns, then press Space to drop or Escape to cancel. The task menu offers Move to… without dragging.`}},children:[t.visibleCount===0&&(0,Z.jsxs)(`p`,{role:`status`,className:`px-4 pt-3 text-sm text-muted`,children:[`No tasks match the filters.`,` `,(0,Z.jsx)(yt,{onClick:()=>t.setFilters({...xe,sort:t.filters.sort}),children:`Clear filters`})]}),(0,Z.jsx)(`section`,{ref:h,"aria-label":`Board columns`,onScroll:e=>{$.boardScrollLeft=e.currentTarget.scrollLeft},className:`min-h-0 flex-1 overflow-x-auto overflow-y-hidden overscroll-x-contain`,children:(0,Z.jsx)(`div`,{className:`flex h-full w-max gap-3 p-4`,children:t.states.map(n=>(0,Z.jsx)(Da,{state:n,board:t,width:l,onOpen:g,selectedId:e,drop:D(n),onNew:()=>p(!0)},n))})}),(0,Z.jsx)(Vi,{dropAnimation:null,children:C&&(0,Z.jsx)(`div`,{className:`rotate-1 shadow-pop`,style:{width:`clamp(272px, ${l-16}px, 344px)`},children:(0,Z.jsx)(fa,{task:C,showProject:t.showProject,wait:t.waits.get(C.id),onOpen:()=>void 0})})})]}):(0,Z.jsx)(_,{label:`Loading tasks…`}),(0,Z.jsx)(gt,{open:!!e,onClose:y,width:520,title:w?.title??(r?`Task not found`:`Loading task…`),description:w?z[w.state]:void 0,footer:w?(0,Z.jsx)(wa,{task:w}):void 0,children:(0,Z.jsx)(`div`,{"data-testid":`task-drawer`,className:`min-w-0`,children:w?(0,Z.jsx)(ea,{task:w,onDeleted:()=>s(V.board,{replace:!0})}):r?(0,Z.jsx)(O,{title:`Task not found`,description:`It may have been deleted, or this link is from another coordinator.`,action:{label:`Back to board`,to:V.board}}):(0,Z.jsx)(_,{label:`Loading task…`})})}),(0,Z.jsx)(mt,{open:f,onClose:()=>p(!1),title:`New task`,className:`max-w-xl`,children:(0,Z.jsx)(da,{defaultProjectId:t.projectId,onCancel:()=>p(!1),onCreated:e=>{p(!1),$.focusTaskId=e.id,requestAnimationFrame(()=>document.querySelector(`[data-card-open="${CSS.escape(e.id)}"]`)?.focus())}})})]})}function wa({task:e}){let{eligibility:t}=Xi(e),n=Ui(),r=j(t=>e.currentRunId?t.runs[e.currentRunId]:void 0),i=be.filter(t=>t!==e.state).map(t=>{let i=L(e,t,r);return{id:`move-${t}`,label:ha(e.state,t),icon:(0,Z.jsx)(ma,{state:t}),disabled:i.kind===`invalid`,hint:Re(i)??void 0,onSelect:()=>void n.move(e,t)}});return(0,Z.jsxs)(`div`,{className:`flex w-full min-w-0 items-start gap-2`,children:[(0,Z.jsx)(`div`,{className:`min-w-0 flex-1`,children:(0,Z.jsx)(Qi,{task:e,eligibility:t})}),(0,Z.jsx)(re,{label:`Move ${e.title}`,side:`top`,align:`end`,items:i,trigger:e=>(0,Z.jsx)(v,{...e,icon:(0,Z.jsx)(Ot,{className:`size-4`}),children:`Move to…`})})]})}function Ta(e,t){let n=t[String(e).replace(ya,``)];return n?`task ${n.title}`:`task`}function Ea(e,t){if(e.startsWith(_a))return`the ${z[e.slice(4)]} column`;let n=t[e.slice(5)];return n?`${n.title} in ${z[n.state]}`:`a task`}function Da({state:e,board:t,width:n,onOpen:r,selectedId:i,drop:a,onNew:o}){let{setNodeRef:s,isOver:c}=ki({id:`${_a}${e}`}),[l,u]=(0,U.useState)(!1),d=t.columns[e],f=Xe[e].icon,p=e===`done`&&!t.filters.showCompleted&&!l,m=`col-${e}-title`,g=(0,U.useCallback)(t=>{t&&(t.scrollTop=$.columnScroll[e]??0)},[e]);return(0,Z.jsx)(`section`,{ref:s,"data-testid":`column-${e}`,"aria-labelledby":m,style:{width:`clamp(288px, ${n}px, 360px)`},"data-drop":a??void 0,className:h(`flex h-full shrink-0 flex-col rounded-lg border bg-surface-2`,a===`invalid`?h(`border-dashed opacity-50`,c?`border-danger`:`border-border`):c?`border-accent`:`border-border`),children:(0,Z.jsxs)(`div`,{ref:g,"data-column-scroll":e,onScroll:t=>{$.columnScroll[e]=t.currentTarget.scrollTop},className:`min-h-0 flex-1 overflow-y-auto overscroll-y-contain`,children:[(0,Z.jsxs)(`h2`,{id:m,className:`sticky top-0 z-10 flex items-center gap-2 rounded-t-lg border-b border-border bg-surface-2 px-3 py-2 text-sm font-semibold`,children:[(0,Z.jsx)(f,{"aria-hidden":!0,className:`size-4 text-muted`}),(0,Z.jsx)(`span`,{className:`flex-1`,children:z[e]}),a===`invalid`&&(0,Z.jsx)(`span`,{className:`text-xs font-normal text-muted`,children:`Can't move here`}),(0,Z.jsxs)(`span`,{className:`rounded-full bg-surface px-2 text-xs font-medium text-muted tabular-nums`,children:[d.length,(0,Z.jsx)(`span`,{className:`sr-only`,children:` tasks`})]})]}),(0,Z.jsx)(`ul`,{className:`flex flex-col gap-2 p-2`,children:p?(0,Z.jsxs)(`li`,{className:`flex flex-col items-start gap-1 px-1 py-2 text-sm text-muted`,children:[d.length,` completed `,d.length===1?`task is`:`tasks are`,` hidden.`,d.length>0&&(0,Z.jsx)(yt,{onClick:()=>u(!0),children:`Show completed`})]}):d.length===0?(0,Z.jsx)(`li`,{className:`px-1 py-2 text-sm text-muted`,children:e===`backlog`?(0,Z.jsx)(yt,{icon:(0,Z.jsx)(Ue,{"aria-hidden":!0,className:`size-4`}),onClick:o,children:`New task`}):`No tasks`}):d.map(e=>(0,Z.jsx)(`li`,{children:(0,Z.jsx)(Oa,{task:e,board:t,onOpen:r,selected:e.id===i})},e.id))})]})})}function Oa({task:e,board:t,onOpen:n,selected:r}){let i=Ti({id:`${ya}${e.id}`}),a=ki({id:`${va}${e.id}`,disabled:i.isDragging}),{onPointerDown:o,onKeyDown:s}=i.listeners??{},c={setNodeRef:e=>{i.setNodeRef(e),a.setNodeRef(e)},setHandleRef:i.setActivatorNodeRef,cardProps:{onPointerDown:o},handleProps:{...i.attributes,onKeyDown:s},dragging:i.isDragging,style:a.isOver?{boxShadow:`0 -3px 0 0 var(--sy-accent)`}:void 0};return(0,Z.jsx)(fa,{task:e,showProject:t.showProject,wait:t.waits.get(e.id),onOpen:n,drag:c,selected:r})}var ka=()=>document.getElementById(`main`);function Aa(){let e=ga(),t=j(e=>e.hydrated),r=j(e=>e.projects),i=n(),[a,o]=lt(`board-mobile`,{tab:`ready`,layout:`column`}),[s,c]=(0,U.useState)(!1),l=(0,U.useId)(),[u,d]=(0,U.useState)(()=>e.filters.search!==``),f=u||e.filters.search!==``,p=e.states.includes(a.tab)?a.tab:`ready`;(0,U.useLayoutEffect)(()=>{if(!t)return;let e=ka(),n=$.mainScrollTop;e&&(e.scrollTop=n);let r=requestAnimationFrame(()=>{r=requestAnimationFrame(()=>{e&&e.scrollTop<n&&(e.scrollTop=n)})}),i=$.focusTaskId;return $.focusTaskId=null,i&&requestAnimationFrame(()=>document.querySelector(`[data-card-open="${CSS.escape(i)}"]`)?.focus({preventScroll:!0})),()=>cancelAnimationFrame(r)},[t]);let m=e=>{$.mainScrollTop=ka()?.scrollTop??0,$.focusTaskId=e.id,i(V.task(e.id),{state:Ge})},h=t&&Object.keys(r).length===0,g=(t,n)=>t.length===0?(0,Z.jsxs)(`p`,{className:`px-1 py-3 text-sm text-muted`,children:[`No `,z[n],` tasks.`]}):(0,Z.jsx)(`ul`,{className:`flex flex-col gap-2`,children:t.map(t=>(0,Z.jsx)(`li`,{children:(0,Z.jsx)(fa,{task:t,full:!0,showProject:e.showProject,wait:e.waits.get(t.id),onOpen:m})},t.id))});return(0,Z.jsxs)(`div`,{"data-testid":`board`,className:`flex min-w-0 flex-col`,children:[(0,Z.jsxs)(`header`,{"data-testid":`board-header`,className:`sticky top-0 z-20 flex min-w-0 flex-col border-b border-border bg-bg safe-pt`,children:[(0,Z.jsxs)(`div`,{className:`flex h-14 min-w-0 items-center gap-1 px-3`,children:[(0,Z.jsx)(`h1`,{className:`min-w-0 flex-1 truncate text-lg font-semibold`,children:`Board`}),(0,Z.jsx)(ht,{label:f?`Hide search`:`Show search`,"aria-expanded":f,"aria-controls":l,icon:(0,Z.jsx)(Ke,{className:`size-5`}),onClick:()=>{f?(e.setFilters({...e.filters,search:``}),d(!1)):d(!0)}}),(0,Z.jsx)(Ae,{board:e,mobile:!0,extraCount:+!!e.projectId,extra:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(ye,{board:e,labelVisible:!0}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`span`,{className:`text-sm font-medium`,children:`Layout`}),(0,Z.jsx)(Ct,{label:`Board layout`,block:!0,value:a.layout,onChange:e=>o({...a,layout:e}),options:[{value:`column`,label:`Columns`,icon:(0,Z.jsx)(At,{"aria-hidden":!0,className:`size-4`})},{value:`list`,label:`List`,icon:(0,Z.jsx)(Pt,{"aria-hidden":!0,className:`size-4`})}]})]})]})}),(0,Z.jsx)(v,{variant:`primary`,size:`sm`,icon:(0,Z.jsx)(Ue,{className:`size-4`}),"aria-label":`New task`,onClick:()=>c(!0),disabled:h,children:`New`})]}),h&&(0,Z.jsx)(`p`,{className:`px-3 pb-2 text-xs text-muted`,children:`Add a project to create tasks.`}),f&&(0,Z.jsx)(`div`,{id:l,className:`px-3 pb-2`,children:(0,Z.jsx)(De,{board:e,autoFocus:u&&!e.filters.search})}),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2 px-3 pb-2`,children:[(0,Z.jsx)(we,{queueCount:e.queueCount}),(0,Z.jsx)(Me,{board:e})]}),a.layout===`column`&&(0,Z.jsx)(`div`,{"data-testid":`status-tabs`,className:`px-1`,children:(0,Z.jsx)(bt,{label:`Task status`,idPrefix:`board-tab`,scrollable:!0,className:`border-b-0`,value:p,onChange:e=>o({...a,tab:e}),tabs:e.states.map(t=>{let n=Xe[t].icon;return{id:t,label:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(n,{"aria-hidden":!0,className:`size-4`}),z[t]]}),badge:(0,Z.jsx)(Ye,{label:`${e.columns[t].length} tasks`,children:e.columns[t].length})}})})})]}),(0,Z.jsx)(ke,{board:e}),(0,Z.jsx)(`div`,{className:`flex min-w-0 flex-col gap-3 px-3 py-3`,children:t?h?(0,Z.jsx)(O,{icon:(0,Z.jsx)($e,{className:`size-8`}),title:`No projects yet`,description:`Tasks belong to a project. Add a project from a host checkout first.`,action:{label:`Add a project`,to:V.settings(`projects`)}}):e.totalTasks===0?(0,Z.jsx)(O,{icon:(0,Z.jsx)($e,{className:`size-8`}),title:`No tasks yet`,description:`Create a task in Backlog, or make it ready so the dispatcher starts it.`,action:{label:`New task`,onClick:()=>c(!0)}}):e.visibleCount===0?(0,Z.jsx)(O,{title:`No tasks match the filters`,action:{label:`Clear filters`,onClick:()=>e.setFilters({...xe,sort:e.filters.sort})}}):a.layout===`column`?(0,Z.jsx)(St,{idPrefix:`board-tab`,id:p,children:p===`done`&&!e.filters.showCompleted?(0,Z.jsxs)(`p`,{className:`text-sm text-muted`,children:[`Completed tasks are hidden.`,` `,(0,Z.jsx)(yt,{onClick:()=>e.setFilters({...e.filters,showCompleted:!0}),children:`Show completed`})]}):g(e.columns[p],p)}):e.states.filter(t=>t!==`done`||e.filters.showCompleted).map(t=>(0,Z.jsxs)(`section`,{"aria-labelledby":`grp-${t}`,"data-testid":`column-${t}`,className:`flex flex-col gap-2`,children:[(0,Z.jsxs)(`h2`,{id:`grp-${t}`,className:`flex items-center gap-2 pt-1 text-sm font-semibold`,children:[(0,Z.jsx)(ma,{state:t,className:`text-muted`}),z[t],(0,Z.jsxs)(`span`,{className:`text-muted`,children:[`(`,e.columns[t].length,`)`]})]}),g(e.columns[t],t)]},t)):(0,Z.jsx)(_,{label:`Loading tasks…`})}),(0,Z.jsx)(pt,{open:s,onClose:()=>c(!1),title:`New task`,children:(0,Z.jsx)(da,{defaultProjectId:e.projectId,onCancel:()=>c(!1),onCreated:e=>{c(!1),o({...a,tab:e.state})}})})]})}function ja({taskId:e}){at();let t=c(e),n=j(e=>e.hydrated),[r,i]=(0,U.useState)(!1),{eligibility:a}=Xi(t),o=We(V.board);return(0,U.useLayoutEffect)(()=>{let e=ka();e&&(e.scrollTop=0)},[]),(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col`,"data-testid":`task-page`,children:[(0,Z.jsxs)(`header`,{className:`sticky top-0 z-20 flex min-w-0 items-center gap-1 border-b border-border bg-surface px-1 pb-1 safe-pt-1`,children:[(0,Z.jsx)(ht,{label:`Back to board`,icon:(0,Z.jsx)(M,{className:`size-5`}),onClick:o}),(0,Z.jsx)(`h1`,{className:`min-w-0 flex-1 truncate text-base font-semibold`,children:t?.title??`Task`}),t&&(0,Z.jsx)(v,{size:`sm`,icon:(0,Z.jsx)(Ot,{className:`size-4`}),onClick:()=>i(!0),children:`Move task`})]}),t?(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-col px-4 pt-3 pb-8`,children:[(0,Z.jsx)(`div`,{children:(0,Z.jsx)(Qi,{task:t,eligibility:a,block:!0})}),(0,Z.jsx)(ea,{task:t,onDeleted:o}),(0,Z.jsx)(Ma,{task:t,open:r,onClose:()=>i(!1)})]}):n?(0,Z.jsx)(O,{title:`Task not found`,description:`It may have been deleted.`,action:{label:`Back to board`,to:V.board}}):(0,Z.jsx)(_,{label:`Loading task…`})]})}function Ma({task:e,open:t,onClose:n}){let r=Ui(),i=j(e=>e.runs),a=e.currentRunId?i[e.currentRunId]:void 0,o=new Set(ve(e));return(0,Z.jsx)(pt,{open:t,onClose:n,title:`Move task`,description:`Currently ${z[e.state]}`,children:(0,Z.jsx)(`ul`,{"data-testid":`move-sheet`,className:`flex flex-col`,children:be.filter(t=>t!==e.state).map(t=>{let i=L(e,t,a),s=Re(i);return(0,Z.jsx)(`li`,{children:(0,Z.jsxs)(`button`,{type:`button`,disabled:!o.has(t),onClick:()=>{n(),r.move(e,t)},className:`tap flex w-full items-start gap-3 rounded-md px-2 py-3 text-left hover:bg-surface-2 disabled:opacity-60`,children:[(0,Z.jsx)(ma,{state:t,className:`mt-0.5 text-muted`}),(0,Z.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[(0,Z.jsx)(`span`,{className:`block font-medium`,children:ha(e.state,t)}),s&&(0,Z.jsx)(`span`,{className:`block text-sm text-muted`,children:s})]})]})},t)})})})}function Na(){let e=ot(),n=t(`/tasks/:taskId`)?.params.taskId;return(0,Z.jsx)(Gi,{children:e===`mobile`?n?(0,Z.jsx)(ja,{taskId:n},n):(0,Z.jsx)(Aa,{}):(0,Z.jsx)(Ca,{taskId:n})})}export{Na as default};
|
|
10
|
-
//# sourceMappingURL=board-B8X7TYYR.js.map
|