@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.
Files changed (109) hide show
  1. package/README.md +2 -2
  2. package/dist/switchyard.mjs +7073 -5396
  3. package/dist/terminal/holder.js +30 -4
  4. package/package.json +1 -1
  5. package/web-dist/assets/AutomationView-BsTwLnMp.js +2 -0
  6. package/web-dist/assets/{AutomationView-D7Syv1En.js.map → AutomationView-BsTwLnMp.js.map} +1 -1
  7. package/web-dist/assets/Card-CAFxHoHd.js +2 -0
  8. package/web-dist/assets/Card-CAFxHoHd.js.map +1 -0
  9. package/web-dist/assets/Checkbox-rDvnQnxc.js +2 -0
  10. package/web-dist/assets/Checkbox-rDvnQnxc.js.map +1 -0
  11. package/web-dist/assets/Copy-D8xhl7eJ.js +2 -0
  12. package/web-dist/assets/{Copy-B6XSAIUd.js.map → Copy-D8xhl7eJ.js.map} +1 -1
  13. package/web-dist/assets/DangerZone-og55TRug.js +2 -0
  14. package/web-dist/assets/DangerZone-og55TRug.js.map +1 -0
  15. package/web-dist/assets/{Field-D-Ty7fKT.js → Field-Dbg_8KTt.js} +2 -2
  16. package/web-dist/assets/{Field-D-Ty7fKT.js.map → Field-Dbg_8KTt.js.map} +1 -1
  17. package/web-dist/assets/{InteractionCard-DF1EcSpm.js → InteractionCard-Yu5wgLC3.js} +4 -4
  18. package/web-dist/assets/{InteractionCard-DF1EcSpm.js.map → InteractionCard-Yu5wgLC3.js.map} +1 -1
  19. package/web-dist/assets/Menu-euseM8yR.js +2 -0
  20. package/web-dist/assets/Menu-euseM8yR.js.map +1 -0
  21. package/web-dist/assets/Overlay-BNPvMjLX.js +2 -0
  22. package/web-dist/assets/{Overlay-DUQwh6_b.js.map → Overlay-BNPvMjLX.js.map} +1 -1
  23. package/web-dist/assets/Priority-Ca1B2yFr.js +2 -0
  24. package/web-dist/assets/{Priority-CHmzfoHg.js.map → Priority-Ca1B2yFr.js.map} +1 -1
  25. package/web-dist/assets/{SegmentedControl-C_hEVQMB.js → SegmentedControl-D2d-NEr-.js} +2 -2
  26. package/web-dist/assets/{SegmentedControl-C_hEVQMB.js.map → SegmentedControl-D2d-NEr-.js.map} +1 -1
  27. package/web-dist/assets/{Select-Cfql4Nwu.js → Select-C9L1HKMm.js} +2 -2
  28. package/web-dist/assets/{Select-Cfql4Nwu.js.map → Select-C9L1HKMm.js.map} +1 -1
  29. package/web-dist/assets/StatusChip-BYuVxYS7.js +2 -0
  30. package/web-dist/assets/StatusChip-BYuVxYS7.js.map +1 -0
  31. package/web-dist/assets/{Switch-DBfzmqkm.js → Switch-DAcUcSbH.js} +2 -2
  32. package/web-dist/assets/{Switch-DBfzmqkm.js.map → Switch-DAcUcSbH.js.map} +1 -1
  33. package/web-dist/assets/{Tabs-BNuL3_Et.js → Tabs-xtagjtA5.js} +2 -2
  34. package/web-dist/assets/{Tabs-BNuL3_Et.js.map → Tabs-xtagjtA5.js.map} +1 -1
  35. package/web-dist/assets/{TextArea-CKybrQyn.js → TextArea-CKGHwURx.js} +2 -2
  36. package/web-dist/assets/{TextArea-CKybrQyn.js.map → TextArea-CKGHwURx.js.map} +1 -1
  37. package/web-dist/assets/{TextLink-OzzyP2-p.js → TextLink-Bub7sMxr.js} +2 -2
  38. package/web-dist/assets/{TextLink-OzzyP2-p.js.map → TextLink-Bub7sMxr.js.map} +1 -1
  39. package/web-dist/assets/attention-CI4dHY81.js +2 -0
  40. package/web-dist/assets/{attention-V86Gye3I.js.map → attention-CI4dHY81.js.map} +1 -1
  41. package/web-dist/assets/auth-308hUVgi.js +2 -0
  42. package/web-dist/assets/auth-308hUVgi.js.map +1 -0
  43. package/web-dist/assets/automations-BzpsJoa3.js +2 -0
  44. package/web-dist/assets/{automations-Cw5Gacgm.js.map → automations-BzpsJoa3.js.map} +1 -1
  45. package/web-dist/assets/bell-DSwa2PAb.js +2 -0
  46. package/web-dist/assets/bell-DSwa2PAb.js.map +1 -0
  47. package/web-dist/assets/board-CeJxBVHC.js +10 -0
  48. package/web-dist/assets/board-CeJxBVHC.js.map +1 -0
  49. package/web-dist/assets/code-DkNQvMI9.js +12 -0
  50. package/web-dist/assets/code-DkNQvMI9.js.map +1 -0
  51. package/web-dist/assets/describe-CVXeUClF.js +5 -0
  52. package/web-dist/assets/{describe-D6KLGKWa.js.map → describe-CVXeUClF.js.map} +1 -1
  53. package/web-dist/assets/enroll-jnKygG4L.js +2 -0
  54. package/web-dist/assets/{enroll-DwT7AcuS.js.map → enroll-jnKygG4L.js.map} +1 -1
  55. package/web-dist/assets/index-BHGZTS2e.js +16 -0
  56. package/web-dist/assets/index-BHGZTS2e.js.map +1 -0
  57. package/web-dist/assets/index-D2ml031z.css +2 -0
  58. package/web-dist/assets/{more-DQR5uu1c.js → more-DvKHMdBk.js} +2 -2
  59. package/web-dist/assets/{more-DQR5uu1c.js.map → more-DvKHMdBk.js.map} +1 -1
  60. package/web-dist/assets/queue-B2Vl0uSh.js +2 -0
  61. package/web-dist/assets/{queue-DUg1rS8t.js.map → queue-B2Vl0uSh.js.map} +1 -1
  62. package/web-dist/assets/repo-BDS8RBxq.js +2 -0
  63. package/web-dist/assets/repo-BDS8RBxq.js.map +1 -0
  64. package/web-dist/assets/settings-CLt7x9u8.js +8 -0
  65. package/web-dist/assets/settings-CLt7x9u8.js.map +1 -0
  66. package/web-dist/assets/states-C773NlHo.js +56 -0
  67. package/web-dist/assets/states-C773NlHo.js.map +1 -0
  68. package/web-dist/assets/{terminal-login-S5CAd5xA.js → terminal-login-BK5UjUir.js} +2 -2
  69. package/web-dist/assets/{terminal-login-S5CAd5xA.js.map → terminal-login-BK5UjUir.js.map} +1 -1
  70. package/web-dist/assets/useBreakpoint-BphHBrzF.js +2 -0
  71. package/web-dist/assets/useBreakpoint-BphHBrzF.js.map +1 -0
  72. package/web-dist/assets/useNow-Cm-tdyod.js +2 -0
  73. package/web-dist/assets/{useNow-Dj7oEiwn.js.map → useNow-Cm-tdyod.js.map} +1 -1
  74. package/web-dist/assets/{useResource-CDGSq2At.js → useResource-BBqCoY2q.js} +2 -2
  75. package/web-dist/assets/{useResource-CDGSq2At.js.map → useResource-BBqCoY2q.js.map} +1 -1
  76. package/web-dist/index.html +7 -3
  77. package/web-dist/sw.js +1 -1
  78. package/web-dist/sw.js.map +1 -1
  79. package/web-dist/assets/AutomationView-D7Syv1En.js +0 -2
  80. package/web-dist/assets/Checkbox-D6tRfEeI.js +0 -2
  81. package/web-dist/assets/Checkbox-D6tRfEeI.js.map +0 -1
  82. package/web-dist/assets/Copy-B6XSAIUd.js +0 -2
  83. package/web-dist/assets/DangerZone-DfYlxDC1.js +0 -2
  84. package/web-dist/assets/DangerZone-DfYlxDC1.js.map +0 -1
  85. package/web-dist/assets/Menu-BfOszNC4.js +0 -2
  86. package/web-dist/assets/Menu-BfOszNC4.js.map +0 -1
  87. package/web-dist/assets/Overlay-DUQwh6_b.js +0 -2
  88. package/web-dist/assets/Priority-CHmzfoHg.js +0 -2
  89. package/web-dist/assets/attention-V86Gye3I.js +0 -2
  90. package/web-dist/assets/automations-Cw5Gacgm.js +0 -2
  91. package/web-dist/assets/board-B8X7TYYR.js +0 -10
  92. package/web-dist/assets/board-B8X7TYYR.js.map +0 -1
  93. package/web-dist/assets/code-BKroYJmR.js +0 -12
  94. package/web-dist/assets/code-BKroYJmR.js.map +0 -1
  95. package/web-dist/assets/describe-D6KLGKWa.js +0 -5
  96. package/web-dist/assets/enroll-DwT7AcuS.js +0 -2
  97. package/web-dist/assets/index-B3F7WcYf.css +0 -2
  98. package/web-dist/assets/index-hxvDvCS7.js +0 -12
  99. package/web-dist/assets/index-hxvDvCS7.js.map +0 -1
  100. package/web-dist/assets/queue-DUg1rS8t.js +0 -2
  101. package/web-dist/assets/repo-XzzzEI0d.js +0 -2
  102. package/web-dist/assets/repo-XzzzEI0d.js.map +0 -1
  103. package/web-dist/assets/search-C6cn5WOo.js +0 -2
  104. package/web-dist/assets/search-C6cn5WOo.js.map +0 -1
  105. package/web-dist/assets/settings-DyUu0tJM.js +0 -8
  106. package/web-dist/assets/settings-DyUu0tJM.js.map +0 -1
  107. package/web-dist/assets/states-ZhrxQa3K.js +0 -56
  108. package/web-dist/assets/states-ZhrxQa3K.js.map +0 -1
  109. package/web-dist/assets/useNow-Dj7oEiwn.js +0 -2
@@ -1,2 +0,0 @@
1
- import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{A as i,J as a,P as o,_ as s,_t as c,bt as l,d as u,gt as d,ht as f,i as p,lt as m,n as ee,o as te,u as h,vt as g,yt as _,z as v}from"./states-ZhrxQa3K.js";import{t as ne}from"./search-C6cn5WOo.js";import{D as re,K as y,b,c as x,j as S,k as C,q as w}from"./index-hxvDvCS7.js";import{i as T,n as ie}from"./Overlay-DUQwh6_b.js";import{r as ae}from"./TextArea-CKybrQyn.js";import{t as oe}from"./TextLink-OzzyP2-p.js";import{r as se}from"./useResource-CDGSq2At.js";import{t as E}from"./Select-Cfql4Nwu.js";import{t as D}from"./Checkbox-D6tRfEeI.js";var O={name:`funnel`,size:24,node:[[`path`,{d:`M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z`,key:`sc7q7i`}]],aliases:[`filter`]};O.node;var k=n(O),A=e(t(),1),j=e=>`/api/tasks/${encodeURIComponent(e)}`;function M(e){if(!e||typeof e!=`object`)return null;let t=e;return t.task&&typeof t.task==`object`?t.task:typeof t.id==`string`&&typeof t.state==`string`?t:null}function N(e){let t=M(e);return t?(v.setState(e=>{let n=e.tasks[t.id];return n&&n.updatedAt>t.updatedAt?{}:{tasks:{...e.tasks,[t.id]:t}}}),t):null}async function P(e){let t=N(await g(`/api/tasks`,e));if(!t)throw Error(`The coordinator returned an unexpected response`);return t}async function F(e,t){return N(await c(j(e),t))}async function I(e){await f(j(e)),v.setState(t=>{if(!t.tasks[e])return{};let{[e]:n,...r}=t.tasks;return{tasks:r}})}async function L(e,t){return N(await g(`${j(e)}/move`,t))}async function R(e,t,n,r){return N(await g(`${j(e)}/${t}${r??``}`,n))}async function z(e,t){return N(await g(`${j(e)}/request-changes`,{feedback:t}))}function B(e,t){return d(`${j(e)}/eligibility`,void 0,t)}async function V(e,t){let n=await d(`${j(e)}/runs`,void 0,t);return Array.isArray(n)?n:n.runs??[]}async function H(e){await g(`/api/dispatch/pause`,{paused:e}),v.setState({dispatchPaused:e})}function U(e){return!l(e)||e.status!==409&&e.code!==`invalid_transition`?!1:e.details?.needsConfirm===!0||/confirm/i.test(e.message)}function W(e){if(!l(e))return!1;let t=e.details;return Array.isArray(t?.choices)||t?.needsChoice===!0||t?.onRunning===!0||/pause automation or stop execution/i.test(e.message)}var G=[`backlog`,`ready`,`in_progress`,`review`,`done`],K={backlog:`Backlog`,ready:`Ready`,in_progress:`In progress`,review:`Review`,done:`Done`,canceled:`Canceled`},q={search:``,priorities:[],hostId:null,attentionOnly:!1,blockedOnly:!1,showCanceled:!1,showCompleted:!0,sort:`priority`};function ce(e){let t=e&&typeof e==`object`?e:{};return{search:typeof t.search==`string`?t.search:``,priorities:Array.isArray(t.priorities)?t.priorities.filter(e=>[0,1,2,3].includes(e)):[],hostId:typeof t.hostId==`string`?t.hostId:null,attentionOnly:t.attentionOnly===!0,blockedOnly:t.blockedOnly===!0,showCanceled:t.showCanceled===!0,showCompleted:t.showCompleted!==!1,sort:t.sort===`updated`||t.sort===`created`?t.sort:`priority`}}function J(e,t){let n=[];e.search.trim()&&n.push({key:`search`,label:`Search: ${e.search.trim()}`,clear:e=>({...e,search:``})});for(let t of e.priorities)n.push({key:`priority-${t}`,label:`Priority: ${m[t]}`,clear:e=>({...e,priorities:e.priorities.filter(e=>e!==t)})});return e.hostId&&n.push({key:`host`,label:`Host: ${t(e.hostId)}`,clear:e=>({...e,hostId:null})}),e.attentionOnly&&n.push({key:`attention`,label:`Needs attention`,clear:e=>({...e,attentionOnly:!1})}),e.blockedOnly&&n.push({key:`blocked`,label:`Blocked`,clear:e=>({...e,blockedOnly:!1})}),e.showCanceled&&n.push({key:`canceled`,label:`Including canceled`,clear:e=>({...e,showCanceled:!1})}),n}function le(e,t){return(e.currentRunId?t[e.currentRunId]:void 0)?.hostId??e.policy.hostId??null}function ue(e,t,n){if(e.hiddenFromBoard||n.projectId&&e.projectId!==n.projectId||e.state===`canceled`&&!t.showCanceled)return!1;let r=t.search.trim().toLowerCase();return!(r&&!`${e.title}\n${e.objective}`.toLowerCase().includes(r)||t.priorities.length>0&&!t.priorities.includes(e.priority)||t.hostId&&le(e,n.runs)!==t.hostId||t.attentionOnly&&!n.attentionTaskIds.has(e.id)||t.blockedOnly&&!e.blocked)}function de(e,t){let n=[...e];return t===`updated`?n.sort((e,t)=>t.lastActivityAt.localeCompare(e.lastActivityAt)):t===`created`?n.sort((e,t)=>t.createdAt.localeCompare(e.createdAt)):n.sort((e,t)=>e.priority-t.priority||e.position-t.position||e.createdAt.localeCompare(t.createdAt)),n}function fe(e,t,n){let r={backlog:[],ready:[],in_progress:[],review:[],done:[],canceled:[]};for(let i of Object.values(e))ue(i,t,n)&&r[i.state].push(i);for(let e of Object.keys(r))r[e]=de(r[e],t.sort);return r}function pe(e){return e.showCanceled?[...G,`canceled`]:G}var Y={backlog:[`ready`,`canceled`],ready:[`backlog`,`in_progress`,`canceled`],in_progress:[`review`,`ready`,`backlog`,`canceled`,`done`],review:[`in_progress`,`done`,`ready`,`canceled`],done:[`ready`,`backlog`],canceled:[`backlog`]};function me(e){return!!e&&[`queued`,`dispatching`,`uncertain`,`running`,`waiting_input`,`checking`].includes(e.state)}function he(e,t){let n=[];e.state!==`review`&&n.push(`The task has not been through review.`),e.acceptanceCriteria.length>0&&n.push(`${e.acceptanceCriteria.length} acceptance ${e.acceptanceCriteria.length===1?`criterion has`:`criteria have`} not been confirmed.`);let r=(e.policy.completion.checks?.length??0)>0,i=t?.checks.filter(e=>e.exitCode!==0)??[];return i.length>0?n.push(`Checks failing: ${i.map(e=>e.command).join(`, `)}.`):r&&(!t||t.checks.length===0)&&n.push(`Required checks have not run.`),e.policy.completion.requireHumanReview&&e.state===`review`&&n.push(`Human review is required: moving to Done accepts the work.`),n}var ge=[`backlog`,`ready`,`in_progress`,`review`,`done`,`canceled`];function _e(e){switch(e.kind){case`invalid`:return e.reason;case`choose_running`:return`Asks whether to pause automation or stop execution.`;case`confirm_done`:return`Asks you to confirm acceptance.`;case`run_now`:return`Starts now if the task is eligible.`;default:return null}}function ve(e,t,n){if(e.state===t)return{kind:`noop`};let r=e.state;if(!Y[r].includes(t))return{kind:`invalid`,reason:ye(r,t)};if(r===`ready`&&t===`in_progress`)return{kind:`run_now`};if(r===`review`&&t===`in_progress`)return{kind:`new_attempt`};if(r===`in_progress`&&(t===`ready`||t===`backlog`))return{kind:`choose_running`};if(t===`done`){let t=he(e,n);if(t.length>0)return{kind:`confirm_done`,reasons:t}}return{kind:`move`}}function ye(e,t){let n=K[e],r=K[t];return t===`in_progress`?e===`backlog`?`A Backlog task cannot start directly. Move it to Ready first; the dispatcher starts it when it is eligible.`:`${n} tasks cannot be moved to In progress. Only the dispatcher starts work (Run now from Ready).`:t===`review`?`Only a finished run moves a task to Review. Run the task, or use Done to accept it.`:e===`canceled`?`A canceled task can only be restored to Backlog.`:e===`done`&&t===`canceled`?`A Done task cannot be canceled. Reopen it first.`:e===`backlog`&&t===`done`?`A Backlog task cannot be marked Done. Make it ready and review its work first.`:e===`ready`&&t===`done`?`A task that has not run cannot be marked Done. Run it, or cancel it.`:`Moving from ${n} to ${r} is not allowed.`}function be(e){return Y[e.state]}function xe(e,t,n){let r=e.filter(e=>e.id!==n);if(r.length===0)return 1;if(t===null)return r[r.length-1].position+1;let i=r.findIndex(e=>e.id===t);if(i<0)return r[r.length-1].position+1;let a=r[i].position;return((i>0?r[i-1].position:a-2)+a)/2}var X={dependency:`Waiting on dependencies`,host_offline:`Host offline`,project_limit:`Project run limit reached`,workspace_occupied:`Workspace occupied`,scheduled_time:`Scheduled for later`,invalid_configuration:`Invalid configuration`,dispatch_paused:`Dispatch paused`,project_automation_disabled:`Auto-start is off for this project`,not_ready:`Not ready`,already_dispatched:`Already dispatched`,retry_backoff:`Retrying after a failure`};function Se(e){return e.eligible?`Will start automatically on ${e.hostName}`:`Will wait: ${e.message||X[e.wait]}`}function Ce(e,t){let{project:n}=e;if(!n)return{eligible:!1,wait:`invalid_configuration`,message:`Choose a project`};if(t.dispatchPaused)return{eligible:!1,wait:`dispatch_paused`,message:`Dispatch is paused; resume it to start new work`};if(!n.automationEnabled)return{eligible:!1,wait:`project_automation_disabled`,message:`Auto-start is off for ${n.name}`};let r=e.dependencies.map(e=>t.tasks[e]).filter(e=>!!e&&e.state!==`done`);if(r.length>0)return{eligible:!1,wait:`dependency`,message:`Waiting on ${r.map(e=>e.title).join(`, `)}`};if(e.notBefore&&Date.parse(e.notBefore)>Date.now())return{eligible:!1,wait:`scheduled_time`,message:`Scheduled for ${new Date(e.notBefore).toLocaleString()}`};let i=e.hostId??n.defaultHostId,a=i?t.hosts[i]:void 0;return!a||a.revokedAt?{eligible:!1,wait:`invalid_configuration`,message:`No host is configured for this project`}:a.piCompatible?a.connectivity===`connected`?(t.runningByProject[n.id]??0)>=n.maxConcurrentRuns?{eligible:!1,wait:`project_limit`,message:`${n.name} already runs ${n.maxConcurrentRuns} of ${n.maxConcurrentRuns} allowed tasks`}:{eligible:!0,hostId:a.id,hostName:a.name}:{eligible:!1,wait:`host_offline`,message:`${a.name} is offline`}:{eligible:!1,wait:`invalid_configuration`,message:`Pi on ${a.name} is not compatible`}}function we(e){let t=new Map;for(let n of Object.values(e)){if(n.resolvedAt||!n.taskId)continue;let e=t.get(n.taskId)??[];e.push(n),t.set(n.taskId,e)}return t}function Te(e,t){let n=e.dependencies.length;if(n===0)return null;let r=e.dependencies.filter(e=>t[e]?.state!==`done`).length,i=`${n} ${n===1?`dependency`:`dependencies`}`;return r>0?`${i} (${r} open)`:`${i} (all done)`}var Z=r();function Ee({board:e,className:t,labelVisible:n}){let r=o(),i=(0,A.useId)();return(0,Z.jsxs)(`div`,{className:s(n?`flex min-w-0 flex-col gap-1`:`flex min-w-0 items-center gap-2`,t),children:[(0,Z.jsx)(`label`,{htmlFor:i,className:n?`text-sm font-medium`:`sr-only`,children:`Project`}),(0,Z.jsxs)(E,{id:i,className:n?`w-full`:`max-w-56`,value:e.projectId??``,onChange:t=>e.setProjectId(t.target.value||null),children:[(0,Z.jsx)(`option`,{value:``,children:`All projects`}),r.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]})}function De({board:e,className:t,autoFocus:n}){let r=(0,A.useId)();return(0,Z.jsxs)(`div`,{className:s(`relative min-w-0`,t),children:[(0,Z.jsx)(`label`,{htmlFor:r,className:`sr-only`,children:`Search tasks`}),(0,Z.jsx)(ne,{"aria-hidden":!0,className:`pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-subtle`}),(0,Z.jsx)(ae,{id:r,type:`search`,placeholder:`Search tasks`,autoFocus:n,className:`pl-8`,value:e.filters.search,onChange:t=>e.setFilters({...e.filters,search:t.target.value})})]})}function Oe({board:e}){let t=(0,A.useId)();return(0,Z.jsxs)(`div`,{className:`flex items-center gap-1.5 text-sm`,children:[(0,Z.jsx)(`label`,{htmlFor:t,className:`text-muted`,children:`Sort`}),(0,Z.jsxs)(E,{id:t,width:`auto`,value:e.filters.sort,onChange:t=>e.setFilters({...e.filters,sort:t.target.value}),children:[(0,Z.jsx)(`option`,{value:`priority`,children:`Priority`}),(0,Z.jsx)(`option`,{value:`updated`,children:`Recently updated`}),(0,Z.jsx)(`option`,{value:`created`,children:`Newest`})]})]})}function ke({board:e}){return(0,Z.jsx)(D,{label:`Show completed`,checked:e.filters.showCompleted,onChange:t=>e.setFilters({...e.filters,showCompleted:t})})}function Ae(){let e=v(e=>e.dispatchPaused),[t,n]=(0,A.useState)(!1);return{paused:e,busy:t,toggle:async()=>{n(!0);try{await H(!e),b.success(e?`Dispatch resumed. Ready tasks start when eligible.`:`Dispatch paused. Running work continues; nothing new starts.`)}catch(t){b.error(`Could not ${e?`resume`:`pause`} dispatch: ${_(t)}`)}finally{n(!1)}}}}function Q(){let{paused:e,busy:t,toggle:n}=Ae(),r=e?w:y;return(0,Z.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2 text-sm`,children:[(0,Z.jsxs)(`span`,{role:`status`,className:s(`inline-flex items-center gap-1.5 font-medium`,e?`text-warning`:`text-success`),children:[(0,Z.jsx)(r,{"aria-hidden":!0,className:`size-4`}),(0,Z.jsx)(`span`,{className:`text-text`,children:e?`Dispatch paused`:`Dispatch on`})]}),(0,Z.jsx)(u,{size:`sm`,busy:t,onClick:()=>void n(),children:e?`Resume dispatch`:`Pause dispatch`})]})}function $({queueCount:e}){let t=v(e=>e.dispatchPaused),[n,r]=(0,A.useState)(!1),i=t?w:y;return(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(`button`,{type:`button`,"aria-haspopup":`dialog`,onClick:()=>r(!0),className:s(`tap inline-flex items-center gap-1 rounded-full border px-2.5 text-xs leading-6 font-medium`,t?C.warning:C.neutral),children:[(0,Z.jsx)(i,{"aria-hidden":!0,className:s(`size-3.5`,t?`text-warning`:`text-success`)}),(0,Z.jsx)(`span`,{className:`text-text`,children:t?`Dispatch paused`:`Dispatch on`}),(0,Z.jsxs)(`span`,{children:[`· `,e,` queued`]})]}),(0,Z.jsx)(T,{open:n,onClose:()=>r(!1),title:`Dispatch`,description:`Pausing stops new work from starting. Runs already in progress keep going.`,children:(0,Z.jsx)(Q,{})})]})}function je({value:e,onChange:t,withSort:n}){let r=i(),a=(0,A.useId)(),o=(n,r)=>t({...e,priorities:r?[...e.priorities,n]:e.priorities.filter(e=>e!==n)});return(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,Z.jsxs)(`fieldset`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`legend`,{className:`mb-1 text-sm font-medium`,children:`Priority`}),(0,Z.jsx)(`div`,{className:`flex flex-wrap gap-x-4`,children:m.map((t,n)=>(0,Z.jsx)(D,{label:t,checked:e.priorities.includes(n),onChange:e=>o(n,e)},t))})]}),(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`label`,{htmlFor:`${a}-host`,className:`text-sm font-medium`,children:`Host`}),(0,Z.jsxs)(E,{id:`${a}-host`,value:e.hostId??``,onChange:n=>t({...e,hostId:n.target.value||null}),children:[(0,Z.jsx)(`option`,{value:``,children:`Any host`}),r.map(e=>(0,Z.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]}),(0,Z.jsxs)(`fieldset`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`legend`,{className:`mb-1 text-sm font-medium`,children:`Show`}),(0,Z.jsx)(D,{label:`Only tasks that need attention`,checked:e.attentionOnly,onChange:n=>t({...e,attentionOnly:n})}),(0,Z.jsx)(D,{label:`Only blocked tasks`,checked:e.blockedOnly,onChange:n=>t({...e,blockedOnly:n})}),(0,Z.jsx)(D,{label:`Canceled tasks`,checked:e.showCanceled,onChange:n=>t({...e,showCanceled:n})}),(0,Z.jsx)(D,{label:`Completed tasks`,checked:e.showCompleted,onChange:n=>t({...e,showCompleted:n})})]}),n&&(0,Z.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,Z.jsx)(`label`,{htmlFor:`${a}-sort`,className:`text-sm font-medium`,children:`Sort`}),(0,Z.jsxs)(E,{id:`${a}-sort`,value:e.sort,onChange:n=>t({...e,sort:n.target.value}),children:[(0,Z.jsx)(`option`,{value:`priority`,children:`Priority`}),(0,Z.jsx)(`option`,{value:`updated`,children:`Recently updated`}),(0,Z.jsx)(`option`,{value:`created`,children:`Newest`})]})]})]})}function Me({board:e,mobile:t,extra:n,extraCount:r=0}){let[i,a]=(0,A.useState)(!1),[o,s]=(0,A.useState)(e.filters),c=v(e=>e.hosts),l=J(e.filters,e=>c[e]?.name??`host`).filter(e=>e.key!==`search`).length+r,d=t?T:ie;return(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsxs)(u,{size:t?`sm`:`md`,icon:(0,Z.jsx)(k,{className:`size-4`}),onClick:()=>{s(e.filters),a(!0)},"aria-label":l?`Filters, ${l} active`:`Filters`,children:[`Filters`,l>0&&(0,Z.jsx)(re,{tone:`accent`,children:l})]}),(0,Z.jsx)(d,{open:i,onClose:()=>a(!1),title:`Filter tasks`,footer:(0,Z.jsxs)(Z.Fragment,{children:[(0,Z.jsx)(u,{variant:`ghost`,onClick:()=>s({...q,search:o.search}),children:`Reset`}),(0,Z.jsx)(u,{variant:`primary`,onClick:()=>{e.setFilters(o),a(!1)},children:`Show results`})]}),children:(0,Z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[n&&(0,Z.jsx)(`div`,{className:`flex flex-col gap-4 border-b border-border pb-4`,children:n}),(0,Z.jsx)(je,{value:o,onChange:s,withSort:t})]})})]})}function Ne({board:e,includeSearch:t}){let n=v(e=>e.hosts),r=J(e.filters,e=>n[e]?.name??`Unknown host`).filter(e=>t||e.key!==`search`);return r.length===0?null:(0,Z.jsxs)(`ul`,{"data-testid":`filter-chips`,"aria-label":`Active filters`,className:`flex min-w-0 flex-wrap gap-1.5`,children:[r.map(t=>(0,Z.jsx)(`li`,{className:`min-w-0`,children:(0,Z.jsxs)(`button`,{type:`button`,onClick:()=>e.setFilters(t.clear(e.filters)),"aria-label":`Remove filter ${t.label}`,className:`tap inline-flex max-w-full items-center gap-1 rounded-full border border-border bg-surface-2 px-2.5 py-0.5 text-xs font-medium`,children:[(0,Z.jsx)(`span`,{className:`truncate`,children:t.label}),(0,Z.jsx)(S,{"aria-hidden":!0,className:`size-3.5 shrink-0`})]})},t.key)),r.length>1&&(0,Z.jsx)(`li`,{children:(0,Z.jsx)(oe,{size:`xs`,onClick:()=>e.setFilters({...q,sort:e.filters.sort}),children:`Clear all`})})]})}function Pe({board:e}){let t=v(e=>e.tasks),n=v(e=>e.runs),r=v(e=>e.hosts),i=v(e=>e.interactions),{offline:o,pending:s}=(0,A.useMemo)(()=>{let o=new Set,s=new Set;for(let i of Object.values(t)){if(e.projectId&&i.projectId!==e.projectId)continue;i.sessionId&&s.add(i.sessionId);let t=i.currentRunId?n[i.currentRunId]:void 0;if(i.state===`in_progress`&&t?.hostId){let e=r[t.hostId];e&&e.connectivity!==`connected`&&o.add(e.id)}}let c=a(i,s);return{offline:[...o].map(e=>r[e]),pending:c}},[t,n,r,i,e.projectId]),c=e.now.error,u=[];for(let e of o)u.push((0,Z.jsx)(p,{compact:!0,hostName:e.name,connectivity:e.connectivity===`reconnecting`?`reconnecting`:`unreachable`,lastSeenAt:e.lastSeenAt,detail:`Its In progress tasks keep their last known state; nothing is restarted elsewhere.`},`host-${e.id}`));return s.length>0&&u.push((0,Z.jsx)(te,{count:s.length,to:x.interaction(s[0].sessionId,s[0].id),label:s.length===1?`A task needs input`:`${s.length} questions need input`},`pending`)),c!=null&&(l(c)&&c.status===404?u.push((0,Z.jsx)(h,{capability:`Queue details`,reason:`This coordinator does not report why Ready tasks are waiting.`},`now`)):u.push((0,Z.jsx)(ee,{compact:!0,title:`Could not load the dispatch queue`,error:_(c),onRetry:e.now.reload},`now`))),u.length===0?null:(0,Z.jsx)(`div`,{className:`flex flex-col gap-2 px-4 pt-2`,children:u})}function Fe(e=!0){let t=se(e?`now`:null,e=>d(`/api/now`,void 0,e),{refreshMs:15e3}),n=v(e=>e.tasks),r=v(e=>e.runs),i=v(e=>e.dispatchPaused),a=(0,A.useRef)(!0),{reload:o}=t;return(0,A.useEffect)(()=>{if(a.current){a.current=!1;return}if(!e)return;let t=setTimeout(o,500);return()=>clearTimeout(t)},[n,r,i,e,o]),t}export{V as A,ve as C,P as D,pe as E,R as F,F as I,U as M,W as N,I as O,z as P,we as S,Ce as T,Se as _,Q as a,be as b,Ee as c,ge as d,q as f,Te as g,fe as h,$ as i,L as j,B as k,De as l,X as m,Pe as n,Me as o,K as p,ke as r,Ne as s,Fe as t,Oe as u,me as v,xe as w,ce as x,_e as y};
2
- //# sourceMappingURL=useNow-Dj7oEiwn.js.map