@spencerboucher/switchyard 0.7.0 → 0.9.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 (149) hide show
  1. package/README.md +3 -3
  2. package/dist/bridge/lines.js +33 -0
  3. package/dist/bridge/switchyard-terminal.js +155 -23
  4. package/dist/switchyard.mjs +3879 -2658
  5. package/dist/terminal/holder.js +142 -51
  6. package/package.json +1 -1
  7. package/web-dist/apple-touch-icon.png +0 -0
  8. package/web-dist/assets/AutomationView-D7Syv1En.js +2 -0
  9. package/web-dist/assets/AutomationView-D7Syv1En.js.map +1 -0
  10. package/web-dist/assets/Checkbox-D6tRfEeI.js +2 -0
  11. package/web-dist/assets/Checkbox-D6tRfEeI.js.map +1 -0
  12. package/web-dist/assets/Copy-B6XSAIUd.js +2 -0
  13. package/web-dist/assets/Copy-B6XSAIUd.js.map +1 -0
  14. package/web-dist/assets/DangerZone-DfYlxDC1.js +2 -0
  15. package/web-dist/assets/DangerZone-DfYlxDC1.js.map +1 -0
  16. package/web-dist/assets/Field-D-Ty7fKT.js +2 -0
  17. package/web-dist/assets/Field-D-Ty7fKT.js.map +1 -0
  18. package/web-dist/assets/InteractionCard-DF1EcSpm.js +6 -0
  19. package/web-dist/assets/InteractionCard-DF1EcSpm.js.map +1 -0
  20. package/web-dist/assets/Menu-BfOszNC4.js +2 -0
  21. package/web-dist/assets/Menu-BfOszNC4.js.map +1 -0
  22. package/web-dist/assets/Overlay-DUQwh6_b.js +2 -0
  23. package/web-dist/assets/Overlay-DUQwh6_b.js.map +1 -0
  24. package/web-dist/assets/Priority-CHmzfoHg.js +2 -0
  25. package/web-dist/assets/Priority-CHmzfoHg.js.map +1 -0
  26. package/web-dist/assets/{SegmentedControl-D-2BCZzd.js → SegmentedControl-C_hEVQMB.js} +2 -2
  27. package/web-dist/assets/{SegmentedControl-D-2BCZzd.js.map → SegmentedControl-C_hEVQMB.js.map} +1 -1
  28. package/web-dist/assets/Select-Cfql4Nwu.js +2 -0
  29. package/web-dist/assets/Select-Cfql4Nwu.js.map +1 -0
  30. package/web-dist/assets/Switch-DBfzmqkm.js +2 -0
  31. package/web-dist/assets/Switch-DBfzmqkm.js.map +1 -0
  32. package/web-dist/assets/Tabs-BNuL3_Et.js +184 -0
  33. package/web-dist/assets/Tabs-BNuL3_Et.js.map +1 -0
  34. package/web-dist/assets/TextArea-CKybrQyn.js +2 -0
  35. package/web-dist/assets/TextArea-CKybrQyn.js.map +1 -0
  36. package/web-dist/assets/TextLink-OzzyP2-p.js +2 -0
  37. package/web-dist/assets/TextLink-OzzyP2-p.js.map +1 -0
  38. package/web-dist/assets/arrow-down-C-iLrN8I.js +2 -0
  39. package/web-dist/assets/arrow-down-C-iLrN8I.js.map +1 -0
  40. package/web-dist/assets/arrow-up-Dj-VTKx4.js +2 -0
  41. package/web-dist/assets/arrow-up-Dj-VTKx4.js.map +1 -0
  42. package/web-dist/assets/attention-V86Gye3I.js +2 -0
  43. package/web-dist/assets/attention-V86Gye3I.js.map +1 -0
  44. package/web-dist/assets/automations-Cw5Gacgm.js +2 -0
  45. package/web-dist/assets/automations-Cw5Gacgm.js.map +1 -0
  46. package/web-dist/assets/board-B8X7TYYR.js +10 -0
  47. package/web-dist/assets/board-B8X7TYYR.js.map +1 -0
  48. package/web-dist/assets/code-BKroYJmR.js +12 -0
  49. package/web-dist/assets/code-BKroYJmR.js.map +1 -0
  50. package/web-dist/assets/describe-D6KLGKWa.js +5 -0
  51. package/web-dist/assets/describe-D6KLGKWa.js.map +1 -0
  52. package/web-dist/assets/enroll-DwT7AcuS.js +2 -0
  53. package/web-dist/assets/enroll-DwT7AcuS.js.map +1 -0
  54. package/web-dist/assets/index-B3F7WcYf.css +2 -0
  55. package/web-dist/assets/index-hxvDvCS7.js +12 -0
  56. package/web-dist/assets/index-hxvDvCS7.js.map +1 -0
  57. package/web-dist/assets/logic-B46fwD-8.js +2 -0
  58. package/web-dist/assets/logic-B46fwD-8.js.map +1 -0
  59. package/web-dist/assets/more-DQR5uu1c.js +2 -0
  60. package/web-dist/assets/more-DQR5uu1c.js.map +1 -0
  61. package/web-dist/assets/queue-DUg1rS8t.js +2 -0
  62. package/web-dist/assets/queue-DUg1rS8t.js.map +1 -0
  63. package/web-dist/assets/repo-XzzzEI0d.js +2 -0
  64. package/web-dist/assets/repo-XzzzEI0d.js.map +1 -0
  65. package/web-dist/assets/server-BqZ-w6M8.js +2 -0
  66. package/web-dist/assets/server-BqZ-w6M8.js.map +1 -0
  67. package/web-dist/assets/settings-DyUu0tJM.js +8 -0
  68. package/web-dist/assets/settings-DyUu0tJM.js.map +1 -0
  69. package/web-dist/assets/states-ZhrxQa3K.js +56 -0
  70. package/web-dist/assets/states-ZhrxQa3K.js.map +1 -0
  71. package/web-dist/assets/terminal-BOV_MXPZ.js +2 -0
  72. package/web-dist/assets/terminal-BOV_MXPZ.js.map +1 -0
  73. package/web-dist/assets/terminal-login-S5CAd5xA.js +2 -0
  74. package/web-dist/assets/terminal-login-S5CAd5xA.js.map +1 -0
  75. package/web-dist/assets/useBackTo-BIrCq3W2.js +2 -0
  76. package/web-dist/assets/useBackTo-BIrCq3W2.js.map +1 -0
  77. package/web-dist/assets/useNow-Dj7oEiwn.js +2 -0
  78. package/web-dist/assets/useNow-Dj7oEiwn.js.map +1 -0
  79. package/web-dist/assets/useResource-CDGSq2At.js +2 -0
  80. package/web-dist/assets/useResource-CDGSq2At.js.map +1 -0
  81. package/web-dist/icon-192.png +0 -0
  82. package/web-dist/icon-512.png +0 -0
  83. package/web-dist/icon.svg +20 -8
  84. package/web-dist/index.html +3 -4
  85. package/web-dist/manifest.webmanifest +1 -1
  86. package/web-dist/maskable-512.png +0 -0
  87. package/web-dist/sw.js +1 -1
  88. package/web-dist/sw.js.map +1 -1
  89. package/web-dist/assets/AutomationView-BIW_pO0M.js +0 -2
  90. package/web-dist/assets/AutomationView-BIW_pO0M.js.map +0 -1
  91. package/web-dist/assets/Badge-BiDp7NKI.js +0 -2
  92. package/web-dist/assets/Badge-BiDp7NKI.js.map +0 -1
  93. package/web-dist/assets/InteractionCard-CWxyDv81.js +0 -6
  94. package/web-dist/assets/InteractionCard-CWxyDv81.js.map +0 -1
  95. package/web-dist/assets/Menu-BDt1bxwz.js +0 -2
  96. package/web-dist/assets/Menu-BDt1bxwz.js.map +0 -1
  97. package/web-dist/assets/Tabs-ByiPklAw.js +0 -184
  98. package/web-dist/assets/Tabs-ByiPklAw.js.map +0 -1
  99. package/web-dist/assets/TextArea-BYr88SnV.js +0 -2
  100. package/web-dist/assets/TextArea-BYr88SnV.js.map +0 -1
  101. package/web-dist/assets/arrow-left-C6YWM6y6.js +0 -2
  102. package/web-dist/assets/arrow-left-C6YWM6y6.js.map +0 -1
  103. package/web-dist/assets/attention-Bya8XHKI.js +0 -2
  104. package/web-dist/assets/attention-Bya8XHKI.js.map +0 -1
  105. package/web-dist/assets/automations-DiXKRcnE.js +0 -2
  106. package/web-dist/assets/automations-DiXKRcnE.js.map +0 -1
  107. package/web-dist/assets/board-BrLaJwLJ.js +0 -10
  108. package/web-dist/assets/board-BrLaJwLJ.js.map +0 -1
  109. package/web-dist/assets/code-DKLO8bzz.js +0 -11
  110. package/web-dist/assets/code-DKLO8bzz.js.map +0 -1
  111. package/web-dist/assets/copy-oWgGHmkS.js +0 -2
  112. package/web-dist/assets/copy-oWgGHmkS.js.map +0 -1
  113. package/web-dist/assets/describe-DnvH6_fl.js +0 -5
  114. package/web-dist/assets/describe-DnvH6_fl.js.map +0 -1
  115. package/web-dist/assets/dist-BE_V9dwJ.js +0 -56
  116. package/web-dist/assets/dist-BE_V9dwJ.js.map +0 -1
  117. package/web-dist/assets/enroll-DUDpbJoB.js +0 -2
  118. package/web-dist/assets/enroll-DUDpbJoB.js.map +0 -1
  119. package/web-dist/assets/index-DvRcMGEe.css +0 -2
  120. package/web-dist/assets/index-vIzH1m8u.js +0 -11
  121. package/web-dist/assets/index-vIzH1m8u.js.map +0 -1
  122. package/web-dist/assets/logic-xb-QF00E.js +0 -2
  123. package/web-dist/assets/logic-xb-QF00E.js.map +0 -1
  124. package/web-dist/assets/more-BP5x45cs.js +0 -2
  125. package/web-dist/assets/more-BP5x45cs.js.map +0 -1
  126. package/web-dist/assets/now--XjJC37b.js +0 -2
  127. package/web-dist/assets/now--XjJC37b.js.map +0 -1
  128. package/web-dist/assets/plus-BLP-wIYD.js +0 -2
  129. package/web-dist/assets/plus-BLP-wIYD.js.map +0 -1
  130. package/web-dist/assets/save-DEvZPWlS.js +0 -2
  131. package/web-dist/assets/save-DEvZPWlS.js.map +0 -1
  132. package/web-dist/assets/send-BKjswHxB.js +0 -2
  133. package/web-dist/assets/send-BKjswHxB.js.map +0 -1
  134. package/web-dist/assets/server-SxFxIScj.js +0 -2
  135. package/web-dist/assets/server-SxFxIScj.js.map +0 -1
  136. package/web-dist/assets/settings-D8T1esWq.js +0 -7
  137. package/web-dist/assets/settings-D8T1esWq.js.map +0 -1
  138. package/web-dist/assets/shared-CZ7fcu_B.js +0 -3
  139. package/web-dist/assets/shared-CZ7fcu_B.js.map +0 -1
  140. package/web-dist/assets/sliders-horizontal-DAoirila.js +0 -2
  141. package/web-dist/assets/sliders-horizontal-DAoirila.js.map +0 -1
  142. package/web-dist/assets/states--geW2Ntl.js +0 -2
  143. package/web-dist/assets/states--geW2Ntl.js.map +0 -1
  144. package/web-dist/assets/terminal-login-BJxV78au.js +0 -2
  145. package/web-dist/assets/terminal-login-BJxV78au.js.map +0 -1
  146. package/web-dist/assets/trash-C6X2OLrI.js +0 -2
  147. package/web-dist/assets/trash-C6X2OLrI.js.map +0 -1
  148. package/web-dist/assets/useNow-jxdoOC_1.js +0 -2
  149. package/web-dist/assets/useNow-jxdoOC_1.js.map +0 -1
@@ -0,0 +1,2 @@
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(),o=r(`rounded-md border border-border bg-surface text-base text-text placeholder:text-subtle md:text-sm`,`outline-none focus:border-accent focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-0 focus-visible:outline-[var(--sy-focus)]`,`aria-[invalid=true]:border-danger aria-[invalid=true]:focus:border-danger`,`disabled:cursor-not-allowed disabled:opacity-55`),s=(0,i.forwardRef)(function({maxHeight:e=`33vh`,minRows:t=1,className:n,value:s,style:c,...l},u){let d=(0,i.useRef)(null),f=(0,i.useCallback)(e=>{d.current=e,typeof u==`function`?u(e):u&&(u.current=e)},[u]);return(0,i.useLayoutEffect)(()=>{let e=d.current;e&&(e.style.height=`auto`,e.style.height=`${e.scrollHeight+(e.offsetHeight-e.clientHeight)}px`)},[s]),(0,a.jsx)(`textarea`,{ref:f,rows:t,value:s,style:{maxHeight:e,...c},className:r(`block w-full resize-none overflow-y-auto px-3 py-2`,o,n),...l})}),c=(0,i.forwardRef)(function({className:e,...t},n){return(0,a.jsx)(`input`,{ref:n,className:r(`tap block h-9 w-full px-3`,o,e),...t})});export{s as n,c as r,o as t};
2
+ //# sourceMappingURL=TextArea-CKybrQyn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextArea-CKybrQyn.js","names":["forwardRef","useRef","useCallback","__toESM","require_react","require_jsx_runtime","cn","import_react","import_jsx_runtime","CONTROL_CLASSES","TextArea","rest","inner","setRef","el","ref","value","minRows","style","className","TextInput"],"sources":["../../src/components/ui/TextArea.tsx"],"sourcesContent":["import {\n forwardRef,\n type TextareaHTMLAttributes,\n useCallback,\n useLayoutEffect,\n useRef,\n} from \"react\";\nimport { cn } from \"../../lib/cn\";\n\n/** Shared look of text controls: border, focus ring, invalid and disabled states. */\nexport const CONTROL_CLASSES = cn(\n \"rounded-md border border-border bg-surface text-base text-text placeholder:text-subtle md:text-sm\",\n \"outline-none focus:border-accent focus-visible:outline-2 focus-visible:outline-solid focus-visible:outline-offset-0 focus-visible:outline-[var(--sy-focus)]\",\n \"aria-[invalid=true]:border-danger aria-[invalid=true]:focus:border-danger\",\n \"disabled:cursor-not-allowed disabled:opacity-55\",\n);\n\nexport interface TextAreaProps extends TextareaHTMLAttributes<HTMLTextAreaElement> {\n /** Max height before scrolling internally (CSS length; default \"33vh\"). */\n maxHeight?: string;\n /** Minimum rows (default 1). */\n minRows?: number;\n}\n\n/** Auto-growing textarea that scrolls internally past `maxHeight`. */\nexport const TextArea = forwardRef<HTMLTextAreaElement, TextAreaProps>(function TextArea(\n { maxHeight = \"33vh\", minRows = 1, className, value, style, ...rest },\n ref,\n) {\n const inner = useRef<HTMLTextAreaElement | null>(null);\n const setRef = useCallback(\n (el: HTMLTextAreaElement | null) => {\n inner.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n },\n [ref],\n );\n // biome-ignore lint/correctness/useExhaustiveDependencies: re-measure when the value changes\n useLayoutEffect(() => {\n const el = inner.current;\n if (!el) return;\n el.style.height = \"auto\";\n el.style.height = `${el.scrollHeight + (el.offsetHeight - el.clientHeight)}px`;\n }, [value]);\n return (\n <textarea\n ref={setRef}\n rows={minRows}\n value={value}\n style={{ maxHeight, ...style }}\n className={cn(\n \"block w-full resize-none overflow-y-auto px-3 py-2\",\n CONTROL_CLASSES,\n className,\n )}\n {...rest}\n />\n );\n});\n\n/** Single-line input with the same styling. */\nexport const TextInput = forwardRef<HTMLInputElement, React.InputHTMLAttributes<HTMLInputElement>>(\n function TextInput({ className, ...rest }, ref) {\n return (\n <input\n ref={ref}\n className={cn(\"tap block h-9 w-full px-3\", CONTROL_CLASSES, className)}\n {...rest}\n />\n );\n },\n);\n"],"mappings":"A,0HAUaS,EAAkBH,EAC7B,oGACA,8JACA,4EACA,iDACF,EAUaI,GAAA,EAAWV,EAAAA,WAAAA,CAA+C,SACrE,CAAE,YAAY,OAAQ,UAAU,EAAG,YAAW,QAAO,QAAO,GAAGW,GAC/D,EACA,CACA,IAAMC,GAAA,EAAQX,EAAAA,OAAAA,CAAmC,IAAI,EAC/CY,GAAA,EAASX,EAAAA,YAAAA,CACZ,GAAmC,CAClC,EAAM,QAAUY,EACZ,OAAOC,GAAQ,WAAYA,EAAID,CAAE,EAC5BC,IAAK,EAAI,QAAUD,EAC9B,EACA,CAACC,CAAG,CACN,EAQA,OANA,EAAAR,EAAA,gBAAA,KAAsB,CACpB,IAAMO,EAAKF,EAAM,QACZE,IACL,EAAG,MAAM,OAAS,OAClB,EAAG,MAAM,OAAS,GAAGA,EAAG,cAAgBA,EAAG,aAAeA,EAAG,cAAc,IAC7E,EAAG,CAACE,CAAK,CAAC,GAER,EAAAR,EAAA,IAAA,CAAC,WAAD,CACE,IAAKK,EACL,KAAMI,EACC,QACP,MAAO,CAAE,YAAW,GAAGC,CAAM,EAC7B,UAAWZ,EACT,qDACAG,EACAU,CACF,EACA,GAAIR,CACL,CAAA,CAEL,CAAC,EAGYS,GAAA,EAAYpB,EAAAA,WAAAA,CACvB,SAAmB,CAAE,YAAW,GAAGW,GAAQ,EAAK,CAC9C,OACE,EAAAH,EAAA,IAAA,CAAC,QAAD,CACO,MACL,UAAWF,EAAG,4BAA6BG,EAAiBU,CAAS,EACrE,GAAIR,CACL,CAAA,CAEL,CACF,E"}
@@ -0,0 +1,2 @@
1
+ import{i as e,t}from"./jsx-runtime-D13aM9HY.js";import{_ as n}from"./states-ZhrxQa3K.js";var r=t(),i={xs:`text-xs`,sm:`text-sm`,inherit:``};function a(t){let{icon:a,size:o=`inherit`,variant:s,className:c,children:l}=t,u=`to`in t&&t.to!==void 0,d=`href`in t&&t.href!==void 0,f=n(`tap inline-flex min-w-0 items-center gap-1 rounded-sm text-left font-medium text-accent underline-offset-2`,(s??(u||d?`inline`:`action`))===`inline`?`underline`:`hover:underline`,i[o],c),p=(0,r.jsxs)(r.Fragment,{children:[a,l]});if(u){let{icon:n,size:i,variant:a,className:o,children:s,...c}=t;return(0,r.jsx)(e,{...c,className:f,children:p})}if(d){let{icon:e,size:n,variant:i,className:a,children:o,external:s,...c}=t;return(0,r.jsx)(`a`,{...c,className:f,...s?{target:`_blank`,rel:`noreferrer`}:{},children:p})}let{icon:m,size:h,variant:g,className:_,children:v,...y}=t;return(0,r.jsx)(`button`,{type:`button`,...y,className:f,children:p})}export{a as t};
2
+ //# sourceMappingURL=TextLink-OzzyP2-p.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextLink-OzzyP2-p.js","names":["_Fragment","Link","cn","import_jsx_runtime","require_jsx_runtime","SIZES","TextLink","props","isLink","isAnchor","style","variant","size","className","content","icon","children","_i","_s","_v","_c","_ch","rest","external"],"sources":["../../src/components/ui/TextLink.tsx"],"sourcesContent":["import type { AnchorHTMLAttributes, ButtonHTMLAttributes, ReactNode } from \"react\";\nimport { Link, type LinkProps } from \"react-router\";\nimport { cn } from \"../../lib/cn\";\n\ntype Common = {\n children: ReactNode;\n icon?: ReactNode;\n size?: \"xs\" | \"sm\" | \"inherit\";\n /** \"inline\" underlines (default for links); \"action\" underlines on hover (default for buttons). */\n variant?: \"inline\" | \"action\";\n className?: string;\n};\n\nexport type TextLinkProps =\n | (Common & { to: string } & Omit<LinkProps, \"className\" | \"children\" | \"to\">)\n | (Common & { href: string; external?: boolean } & Omit<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n \"className\" | \"children\" | \"href\"\n >)\n | (Common & { to?: undefined; href?: undefined } & Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"className\" | \"children\"\n >);\n\nconst SIZES = { xs: \"text-xs\", sm: \"text-sm\", inherit: \"\" } as const;\n\n/** A link or link-styled button for text. Always inline-flex so `.tap` can size its touch target. */\nexport function TextLink(props: TextLinkProps) {\n const { icon, size = \"inherit\", variant, className, children } = props;\n const isLink = \"to\" in props && props.to !== undefined;\n const isAnchor = \"href\" in props && props.href !== undefined;\n const style = cn(\n \"tap inline-flex min-w-0 items-center gap-1 rounded-sm text-left font-medium text-accent underline-offset-2\",\n (variant ?? (isLink || isAnchor ? \"inline\" : \"action\")) === \"inline\"\n ? \"underline\"\n : \"hover:underline\",\n SIZES[size],\n className,\n );\n const content = (\n <>\n {icon}\n {children}\n </>\n );\n if (isLink) {\n const {\n icon: _i,\n size: _s,\n variant: _v,\n className: _c,\n children: _ch,\n ...rest\n } = props as Common & LinkProps;\n return (\n <Link {...rest} className={style}>\n {content}\n </Link>\n );\n }\n if (isAnchor) {\n const {\n icon: _i,\n size: _s,\n variant: _v,\n className: _c,\n children: _ch,\n external,\n ...rest\n } = props as Common & AnchorHTMLAttributes<HTMLAnchorElement> & { external?: boolean };\n return (\n <a {...rest} className={style} {...(external ? { target: \"_blank\", rel: \"noreferrer\" } : {})}>\n {content}\n </a>\n );\n }\n const {\n icon: _i,\n size: _s,\n variant: _v,\n className: _c,\n children: _ch,\n ...rest\n } = props as Common & ButtonHTMLAttributes<HTMLButtonElement>;\n return (\n <button type=\"button\" {...rest} className={style}>\n {content}\n </button>\n );\n}\n"],"mappings":"A,mGAwBMK,EAAQ,CAAE,GAAI,UAAW,GAAI,UAAW,QAAS,EAAG,EAG1D,SAAgBC,EAAS,EAAsB,CAC7C,GAAM,CAAE,OAAM,OAAO,UAAW,UAAS,YAAW,YAAaC,EAC3DC,EAAS,OAAQD,GAASA,EAAM,KAAO,IAAA,GACvCE,EAAW,SAAUF,GAASA,EAAM,OAAS,IAAA,GAC7CG,EAAQR,EACZ,8GACCS,IAAYH,GAAUC,EAAW,SAAW,aAAe,SACxD,YACA,kBACJJ,EAAMO,GACNC,CACF,EACMC,GACJ,EAAAX,EAAA,KAAA,CAAAH,EAAAA,SAAA,CAAA,SAAA,CACGe,EACAC,CACD,CAAA,CAAA,EAEJ,GAAIR,EAAQ,CACV,GAAM,CACJ,KAAMS,EACN,KAAMC,EACN,QAASC,EACT,UAAWC,EACX,SAAUC,EACV,GAAGC,GACDf,EACJ,OACE,EAAAJ,EAAA,IAAA,CAACF,EAAD,CAAM,GAAIqB,EAAM,UAAWZ,EACxB,SAAAI,CACG,CAAA,CAEV,CACA,GAAIL,EAAU,CACZ,GAAM,CACJ,KAAMQ,EACN,KAAMC,EACN,QAASC,EACT,UAAWC,EACX,SAAUC,EACV,WACA,GAAGC,GACDf,EACJ,OACE,EAAAJ,EAAA,IAAA,CAAC,IAAD,CAAG,GAAImB,EAAM,UAAWZ,EAAO,GAAKa,EAAW,CAAE,OAAQ,SAAU,IAAK,YAAa,EAAI,CAAC,EACvF,SAAAT,CACA,CAAA,CAEP,CACA,GAAM,CACJ,KAAMG,EACN,KAAMC,EACN,QAASC,EACT,UAAWC,EACX,SAAUC,EACV,GAAGC,GACDf,EACJ,OACE,EAAAJ,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,GAAImB,EAAM,UAAWZ,EACxC,SAAAI,CACK,CAAA,CAEZ,C"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./jsx-runtime-D13aM9HY.js";var t={name:`arrow-down`,size:24,node:[[`path`,{d:`M12 5v14`,key:`s699le`}],[`path`,{d:`m19 12-7 7-7-7`,key:`1idqje`}]]};t.node;var n=e(t);export{n as t};
2
+ //# sourceMappingURL=arrow-down-C-iLrN8I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-down-C-iLrN8I.js","names":["createLucideIcon","__iconData","ArrowDown"],"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/arrow-down.mjs"],"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: \"arrow-down\",\n size: 24,\n node: [\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }],\n [\"path\", { d: \"m19 12-7 7-7-7\", key: \"1idqje\" }]\n ]\n};\n__iconData.node;\nconst ArrowDown = createLucideIcon(__iconData);\n\nexport { __iconData, ArrowDown as default };\n//# sourceMappingURL=arrow-down.mjs.map\n"],"ignoreList":[0],"mappings":"A,8CASA,IAAMC,EAAa,CACjB,KAAM,aACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAS,CAAC,CACjD,CACF,EACAA,EAAW,KACX,IAAMC,EAAYF,EAAiBC,CAAU,E"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./jsx-runtime-D13aM9HY.js";var t={name:`arrow-up`,size:24,node:[[`path`,{d:`m5 12 7-7 7 7`,key:`hav0vg`}],[`path`,{d:`M12 19V5`,key:`x0mq9r`}]]};t.node;var n=e(t);export{n as t};
2
+ //# sourceMappingURL=arrow-up-Dj-VTKx4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arrow-up-Dj-VTKx4.js","names":["createLucideIcon","__iconData","ArrowUp"],"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/arrow-up.mjs"],"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: \"arrow-up\",\n size: 24,\n node: [\n [\"path\", { d: \"m5 12 7-7 7 7\", key: \"hav0vg\" }],\n [\"path\", { d: \"M12 19V5\", key: \"x0mq9r\" }]\n ]\n};\n__iconData.node;\nconst ArrowUp = createLucideIcon(__iconData);\n\nexport { __iconData, ArrowUp as default };\n//# sourceMappingURL=arrow-up.mjs.map\n"],"ignoreList":[0],"mappings":"A,8CASA,IAAMC,EAAa,CACjB,KAAM,WACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,gBAAiB,IAAK,QAAS,CAAC,EAC9C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,CAC3C,CACF,EACAA,EAAW,KACX,IAAMC,EAAUF,EAAiBC,CAAU,E"}
@@ -0,0 +1,2 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attention-V86Gye3I.js","names":["useRef","useMemo","History","_Fragment","useState","__toESM","Link","require_react","createLucideIcon","require_jsx_runtime","RotateCcwClock","LoadingState","Button","buttonClasses","apiGet","formatRelative","HostUnavailable","useOpenAttention","ErrorState","LastKnownNote","EmptyState","UnsupportedCapability","apiPost","errorMessage","useSyncStore","ExternalLink","isDocumentPresentation","InteractionCard","Server","StatusChip","Eye","CircleCheck","Bell","toast","ROUTES","useFilter","ATTENTION_STATUS","SegmentedControl","useResource","__iconData","ListTodo","import_react","ATTENTION_GROUPS","groupAttention","out","r","a","items","normalizeShow","v","visibleAttention","show","all","attentionMeta","project","task","session","useAttentionHistory","res","enabled","signal","attention","s","first","reload","import_jsx_runtime","GROUP_HINT","AttentionView","hydrated","stored","setStored","setShow","dismissedCount","groups","history","HistoryRow","info","reason","Icon","AttentionRow","item","host","interaction","busy","setBusy","ackError","setAckError","acknowledge","next","sessionHref","hostOffline","action","metaText","showsCard"],"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/list-todo.mjs","../../src/features/attention/logic.ts","../../src/features/attention/useAttentionHistory.ts","../../src/features/attention/index.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: \"list-todo\",\n size: 24,\n node: [\n [\"path\", { d: \"M13 5h8\", key: \"a7qcls\" }],\n [\"path\", { d: \"M13 12h8\", key: \"h98zly\" }],\n [\"path\", { d: \"M13 19h8\", key: \"c3s6r1\" }],\n [\"path\", { d: \"m3 17 2 2 4-4\", key: \"1jhpwq\" }],\n [\"rect\", { x: \"3\", y: \"4\", width: \"6\", height: \"6\", rx: \"1\", key: \"cif1o7\" }]\n ]\n};\n__iconData.node;\nconst ListTodo = createLucideIcon(__iconData);\n\nexport { __iconData, ListTodo as default };\n//# sourceMappingURL=list-todo.mjs.map\n","import type { AttentionItem, AttentionReason, Project, Session, Task } from \"@switchyard/protocol\";\n\nexport const ATTENTION_GROUPS: AttentionReason[] = [\n \"needs_input\",\n \"failed\",\n \"ready_for_review\",\n \"unsupported_interaction\",\n \"host_unreachable\",\n];\n\n/** Group open attention by reason, keeping the input order within a group. */\nexport function groupAttention(items: AttentionItem[]): Record<AttentionReason, AttentionItem[]> {\n const out = Object.fromEntries(ATTENTION_GROUPS.map((r) => [r, [] as AttentionItem[]])) as Record<\n AttentionReason,\n AttentionItem[]\n >;\n for (const a of items) out[a.reason]?.push(a);\n return out;\n}\n\nexport type AttentionShow = \"open\" | \"dismissed\" | \"history\";\n\n/** Stored prefs from before History: \"all\" (open + dismissed) and unknown values read as \"open\". */\nexport function normalizeShow(v: unknown): AttentionShow {\n return v === \"dismissed\" || v === \"history\" ? v : \"open\";\n}\n\n/** Unacknowledged items for \"open\", acknowledged for \"dismissed\"; [] for \"history\". */\nexport function visibleAttention(all: AttentionItem[], show: AttentionShow): AttentionItem[] {\n if (show === \"history\") return [];\n return all.filter((a) => (show === \"open\" ? !a.acknowledgedAt : !!a.acknowledgedAt));\n}\n\n/** \"project · task · session\" (session only when its title differs from the task's), else \"Switchyard\". */\nexport function attentionMeta(project?: Project, task?: Task, session?: Session): string {\n return (\n [project?.name, task?.title, session && session.title !== task?.title ? session.title : null]\n .filter(Boolean)\n .join(\" · \") || \"Switchyard\"\n );\n}\n","import type { AttentionItem } from \"@switchyard/protocol\";\nimport { useEffect, useRef } from \"react\";\nimport { type Resource, useResource } from \"../../lib/useResource\";\nimport { apiGet } from \"../../sync/api\";\nimport { useSyncStore } from \"../../sync/store\";\n\nexport const HISTORY_LIMIT = 200;\n\n/**\n * Resolved attention items, newest first. The sync store drops resolved items, so they come\n * from the API; refetched when open attention changes (debounced) and every 30 s.\n */\nexport function useAttentionHistory(enabled: boolean): Resource<AttentionItem[]> {\n const res = useResource<AttentionItem[]>(\n enabled ? \"attention-history\" : null,\n (signal) =>\n apiGet<AttentionItem[]>(\n \"/api/attention\",\n { resolvedOnly: \"true\", limit: HISTORY_LIMIT },\n signal,\n ),\n { refreshMs: 30_000, check: Array.isArray },\n );\n const attention = useSyncStore((s) => s.attention);\n const first = useRef(true);\n const { reload } = res;\n // biome-ignore lint/correctness/useExhaustiveDependencies: refetch on attention changes\n useEffect(() => {\n if (first.current) {\n first.current = false;\n return;\n }\n if (!enabled) return;\n const t = setTimeout(reload, 500);\n return () => clearTimeout(t);\n }, [attention, enabled, reload]);\n return res;\n}\n","import type { AttentionItem, AttentionReason } from \"@switchyard/protocol\";\nimport { Bell, CircleCheck, ExternalLink, Eye, History, ListTodo, Server } from \"lucide-react\";\nimport { useMemo, useState } from \"react\";\nimport { Link } from \"react-router\";\nimport { ROUTES } from \"../../app/routes\";\nimport { InteractionCard, isDocumentPresentation } from \"../../components/intent/InteractionCard\";\nimport { Button, buttonClasses } from \"../../components/ui/Button\";\nimport { SegmentedControl } from \"../../components/ui/SegmentedControl\";\nimport { ATTENTION_STATUS, StatusChip } from \"../../components/ui/StatusChip\";\nimport {\n EmptyState,\n ErrorState,\n HostUnavailable,\n LastKnownNote,\n LoadingState,\n UnsupportedCapability,\n} from \"../../components/ui/states\";\nimport { toast } from \"../../components/ui/Toast\";\nimport { formatRelative } from \"../../lib/time\";\nimport { useFilter } from \"../../prefs\";\nimport { apiPost, errorMessage } from \"../../sync/api\";\nimport { useOpenAttention, useSyncStore } from \"../../sync/store\";\nimport {\n ATTENTION_GROUPS,\n type AttentionShow,\n attentionMeta,\n groupAttention,\n normalizeShow,\n visibleAttention,\n} from \"./logic\";\nimport { HISTORY_LIMIT, useAttentionHistory } from \"./useAttentionHistory\";\n\nconst GROUP_HINT: Record<AttentionReason, string> = {\n needs_input: \"Questions from Pi waiting for your answer.\",\n failed: \"Runs that failed or were blocked. Open the task to see why.\",\n ready_for_review: \"Finished runs waiting for your review.\",\n unsupported_interaction:\n \"Questions this client cannot display. Answer them in a terminal attached to the session.\",\n host_unreachable:\n \"Running work on hosts that stopped responding. Nothing is restarted elsewhere.\",\n};\n\n/** /attention: Needs input, Failed, Ready for review (plus unsupported and unreachable). */\nexport default function AttentionView() {\n const all = useOpenAttention();\n const hydrated = useSyncStore((s) => s.hydrated);\n const [stored, setStored] = useFilter<AttentionShow | \"all\">(\"attentionShow\", \"open\");\n const show = normalizeShow(stored);\n const setShow = (v: AttentionShow) => setStored(v);\n const items = useMemo(() => visibleAttention(all, show), [all, show]);\n const dismissedCount = useMemo(() => visibleAttention(all, \"dismissed\").length, [all]);\n const groups = useMemo(() => groupAttention(items), [items]);\n const history = useAttentionHistory(show === \"history\");\n\n return (\n <div className=\"flex w-full min-w-0 flex-col gap-4 px-4 pb-4 safe-pt-4 md:px-6\">\n <header className=\"flex min-w-0 flex-wrap items-center gap-3\">\n <h1 className=\"flex-1 text-lg font-semibold\">Attention</h1>\n <SegmentedControl\n label=\"Show\"\n className=\"max-sm:w-full max-sm:basis-full\"\n value={show}\n onChange={setShow}\n options={[\n { value: \"open\", label: \"Open\" },\n { value: \"dismissed\", label: \"Dismissed\" },\n { value: \"history\", label: \"History\" },\n ]}\n />\n </header>\n <LastKnownNote\n subject=\"attention items\"\n consequence=\"Answers are sent once the connection is back.\"\n show={hydrated}\n />\n {show === \"history\" ? (\n <div data-testid=\"attention-history\" className=\"flex min-w-0 flex-col gap-2\">\n {!history.data && history.loading ? (\n <LoadingState label=\"Loading history…\" />\n ) : !history.data && history.error ? (\n <ErrorState\n compact\n title=\"Could not load history\"\n error={errorMessage(history.error)}\n onRetry={history.reload}\n />\n ) : !history.data || history.data.length === 0 ? (\n <EmptyState\n icon={<History className=\"size-8\" />}\n title=\"No history yet\"\n description=\"Resolved questions, failures and reviews show up here.\"\n />\n ) : (\n <>\n <ul className=\"flex min-w-0 flex-col gap-2\">\n {history.data.map((a) => (\n <li key={a.id} className=\"min-w-0\">\n <HistoryRow item={a} />\n </li>\n ))}\n </ul>\n {history.data.length >= HISTORY_LIMIT && (\n <p className=\"text-sm text-muted\">Showing the {HISTORY_LIMIT} most recent.</p>\n )}\n </>\n )}\n </div>\n ) : !hydrated ? (\n <LoadingState label=\"Loading attention…\" />\n ) : items.length === 0 ? (\n show === \"dismissed\" ? (\n <EmptyState\n icon={<Bell className=\"size-8\" />}\n title=\"No dismissed items\"\n description=\"Items you dismiss stay here until their question or task is resolved.\"\n action={{ label: \"Show open\", onClick: () => setShow(\"open\") }}\n />\n ) : (\n <EmptyState\n icon={<Bell className=\"size-8\" />}\n title={dismissedCount > 0 ? \"All caught up\" : \"Nothing needs your attention\"}\n description={\n dismissedCount > 0\n ? `${dismissedCount} dismissed ${dismissedCount === 1 ? \"item is\" : \"items are\"} still open.`\n : \"Questions, failures and finished work show up here.\"\n }\n action={\n dismissedCount > 0\n ? { label: \"Show dismissed\", onClick: () => setShow(\"dismissed\") }\n : { label: \"Go to Sessions\", to: ROUTES.code }\n }\n secondaryAction={\n dismissedCount > 0\n ? { label: \"Go to Sessions\", to: ROUTES.code }\n : { label: \"Go to Board\", to: ROUTES.board }\n }\n />\n )\n ) : (\n ATTENTION_GROUPS.filter((r) => groups[r].length > 0).map((reason) => {\n const info = ATTENTION_STATUS[reason];\n const Icon = info.icon;\n return (\n <section\n key={reason}\n data-testid={`attention-group-${reason}`}\n aria-labelledby={`att-${reason}`}\n className=\"flex min-w-0 flex-col gap-2\"\n >\n <div>\n <h2\n id={`att-${reason}`}\n className=\"flex items-center gap-2 text-base font-semibold\"\n >\n <Icon aria-hidden className=\"size-4 text-muted\" />\n {info.label}\n <span className=\"text-sm font-normal text-muted\">({groups[reason].length})</span>\n </h2>\n <p className=\"text-sm text-muted\">{GROUP_HINT[reason]}</p>\n </div>\n <ul className=\"flex min-w-0 flex-col gap-2\">\n {groups[reason].map((a) => (\n <li key={a.id} className=\"min-w-0\">\n <AttentionRow item={a} />\n </li>\n ))}\n </ul>\n </section>\n );\n })\n )}\n </div>\n );\n}\n\nfunction AttentionRow({ item }: { item: AttentionItem }) {\n const project = useSyncStore((s) => (item.projectId ? s.projects[item.projectId] : undefined));\n const task = useSyncStore((s) => (item.taskId ? s.tasks[item.taskId] : undefined));\n const session = useSyncStore((s) => (item.sessionId ? s.sessions[item.sessionId] : undefined));\n const host = useSyncStore((s) => (session ? s.hosts[session.hostId] : undefined));\n const interaction = useSyncStore((s) =>\n item.interactionId ? s.interactions[item.interactionId] : undefined,\n );\n const [busy, setBusy] = useState(false);\n const [ackError, setAckError] = useState<unknown>(null);\n\n const acknowledge = async () => {\n setBusy(true);\n setAckError(null);\n try {\n const res = await apiPost<AttentionItem>(\n `/api/attention/${encodeURIComponent(item.id)}/acknowledge`,\n );\n const next =\n res && typeof res === \"object\" && \"id\" in res\n ? res\n : { ...item, acknowledgedAt: new Date().toISOString() };\n useSyncStore.setState((s) =>\n s.attention[item.id] ? { attention: { ...s.attention, [item.id]: next } } : {},\n );\n toast.success(\"Dismissed. It stays under All until the task or question is resolved.\");\n } catch (e) {\n setAckError(e);\n } finally {\n setBusy(false);\n }\n };\n\n const sessionHref = item.sessionId\n ? item.interactionId\n ? ROUTES.interaction(item.sessionId, item.interactionId)\n : ROUTES.session(item.sessionId)\n : null;\n const hostOffline = !!host && host.connectivity !== \"connected\";\n\n let action: React.ReactNode = null;\n switch (item.reason) {\n case \"needs_input\":\n action =\n interaction && interaction.state === \"pending\" ? (\n <InteractionCard\n flush\n interaction={interaction}\n readOnlyReason={\n hostOffline\n ? `Host ${host?.name} is offline. You can answer once it reconnects.`\n : session?.readOnly\n ? \"This session is read-only.\"\n : null\n }\n />\n ) : interaction ? (\n <InteractionCard flush interaction={interaction} />\n ) : sessionHref ? (\n <Link to={sessionHref} className={buttonClasses(\"primary\", \"sm\")}>\n <ExternalLink aria-hidden className=\"size-3.5\" />\n Answer in session\n </Link>\n ) : null;\n break;\n case \"failed\":\n action = item.taskId ? (\n <Link to={ROUTES.task(item.taskId)} className={buttonClasses(\"primary\", \"sm\")}>\n <ListTodo aria-hidden className=\"size-3.5\" />\n Open task\n </Link>\n ) : null;\n break;\n case \"ready_for_review\":\n action = item.sessionId ? (\n <Link\n to={`${ROUTES.session(item.sessionId)}?tab=changes`}\n className={buttonClasses(\"primary\", \"sm\")}\n >\n <Eye aria-hidden className=\"size-3.5\" />\n Review changes\n </Link>\n ) : item.taskId ? (\n <Link to={ROUTES.task(item.taskId)} className={buttonClasses(\"primary\", \"sm\")}>\n <Eye aria-hidden className=\"size-3.5\" />\n Open review\n </Link>\n ) : null;\n break;\n case \"unsupported_interaction\":\n action = interaction ? (\n <InteractionCard\n interaction={interaction}\n readOnlyReason={\n hostOffline\n ? `Host ${host?.name} is offline. You can choose once it reconnects.`\n : session?.readOnly\n ? \"This session is read-only.\"\n : null\n }\n />\n ) : (\n <UnsupportedCapability\n capability=\"This dialog\"\n reason=\"An extension opened a terminal-only dialog. In RPC mode Pi gave it no answer, so the extension continued without one.\"\n />\n );\n break;\n case \"host_unreachable\":\n action = host ? (\n <HostUnavailable\n compact\n hostName={host.name}\n connectivity={host.connectivity === \"reconnecting\" ? \"reconnecting\" : \"unreachable\"}\n lastSeenAt={host.lastSeenAt}\n />\n ) : null;\n break;\n }\n\n const metaText = attentionMeta(project, task, session);\n\n const showsCard =\n !!interaction && (item.reason === \"needs_input\" || item.reason === \"unsupported_interaction\");\n\n // A plan awaiting approval gets the whole width: one meta line, no card around it.\n if (\n item.reason === \"needs_input\" &&\n interaction?.state === \"pending\" &&\n isDocumentPresentation(interaction.presentation)\n ) {\n return (\n <article\n aria-label={`Plan awaiting approval: ${metaText}`}\n className=\"flex min-w-0 flex-col gap-2\"\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-x-2 gap-y-1 text-sm text-muted\">\n <span className=\"min-w-0 basis-full truncate sm:basis-auto sm:flex-1\">{metaText}</span>\n {sessionHref && (\n <Link to={sessionHref} className={buttonClasses(\"ghost\", \"sm\")}>\n <ExternalLink aria-hidden className=\"size-3.5\" />\n Open session\n </Link>\n )}\n <time dateTime={item.createdAt} className=\"shrink-0 text-xs text-subtle sm:ml-auto\">\n {formatRelative(item.createdAt)}\n </time>\n {!item.acknowledgedAt && (\n <Button size=\"sm\" variant=\"ghost\" busy={busy} onClick={() => void acknowledge()}>\n Dismiss\n </Button>\n )}\n </div>\n {action}\n {ackError !== null && (\n <ErrorState\n compact\n title=\"Could not dismiss\"\n error={errorMessage(ackError)}\n onRetry={() => void acknowledge()}\n />\n )}\n </article>\n );\n }\n\n return (\n <article\n aria-label={`${ATTENTION_STATUS[item.reason].label}: ${task?.title ?? session?.title ?? item.summary}`}\n className=\"flex min-w-0 flex-col gap-2 rounded-lg border border-border bg-surface p-3\"\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <StatusChip kind=\"attention\" value={item.reason} size=\"sm\" />\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted\">{metaText}</span>\n <time dateTime={item.createdAt} className=\"shrink-0 text-xs text-subtle\">\n {formatRelative(item.createdAt)}\n </time>\n </div>\n {!showsCard && <p className=\"min-w-0 text-sm break-words\">{item.summary}</p>}\n {action && <div className=\"flex min-w-0 flex-col items-start\">{action}</div>}\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n {item.reason !== \"failed\" && item.taskId && (\n <Link to={ROUTES.task(item.taskId)} className={buttonClasses(\"ghost\", \"sm\")}>\n <ListTodo aria-hidden className=\"size-3.5\" />\n Task\n </Link>\n )}\n {sessionHref && (\n <Link to={sessionHref} className={buttonClasses(\"ghost\", \"sm\")}>\n <ExternalLink aria-hidden className=\"size-3.5\" />\n Open session\n </Link>\n )}\n {item.reason === \"host_unreachable\" && host && (\n <Link\n to={`${ROUTES.settings(\"hosts\")}/${encodeURIComponent(host.id)}`}\n className={buttonClasses(\"ghost\", \"sm\")}\n >\n <Server aria-hidden className=\"size-3.5\" />\n Host details\n </Link>\n )}\n <span className=\"ml-auto\" />\n {item.acknowledgedAt ? (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted\">\n <CircleCheck aria-hidden className=\"size-3.5\" />\n Dismissed {formatRelative(item.acknowledgedAt)}\n </span>\n ) : (\n <Button size=\"sm\" busy={busy} onClick={() => void acknowledge()}>\n Dismiss\n </Button>\n )}\n </div>\n {ackError !== null && (\n <ErrorState\n compact\n title=\"Could not dismiss\"\n error={errorMessage(ackError)}\n onRetry={() => void acknowledge()}\n />\n )}\n </article>\n );\n}\n\nfunction HistoryRow({ item }: { item: AttentionItem }) {\n const project = useSyncStore((s) => (item.projectId ? s.projects[item.projectId] : undefined));\n const task = useSyncStore((s) => (item.taskId ? s.tasks[item.taskId] : undefined));\n const session = useSyncStore((s) => (item.sessionId ? s.sessions[item.sessionId] : undefined));\n return (\n <article\n aria-label={`${ATTENTION_STATUS[item.reason].label}: ${task?.title ?? session?.title ?? item.summary}`}\n className=\"flex min-w-0 flex-col gap-2 rounded-lg border border-border bg-surface p-3\"\n >\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n <StatusChip kind=\"attention\" value={item.reason} size=\"sm\" />\n <span className=\"min-w-0 flex-1 truncate text-xs text-muted\">\n {attentionMeta(project, task, session)}\n </span>\n {item.resolvedAt && (\n <time dateTime={item.resolvedAt} className=\"shrink-0 text-xs text-subtle\">\n Resolved {formatRelative(item.resolvedAt)}\n </time>\n )}\n </div>\n <p className=\"min-w-0 text-sm break-words\">{item.summary}</p>\n {(item.taskId || item.sessionId) && (\n <div className=\"flex min-w-0 flex-wrap items-center gap-2\">\n {item.taskId && (\n <Link to={ROUTES.task(item.taskId)} className={buttonClasses(\"ghost\", \"sm\")}>\n <ListTodo aria-hidden className=\"size-3.5\" />\n Task\n </Link>\n )}\n {item.sessionId && (\n <Link to={ROUTES.session(item.sessionId)} className={buttonClasses(\"ghost\", \"sm\")}>\n <ExternalLink aria-hidden className=\"size-3.5\" />\n Open session\n </Link>\n )}\n </div>\n )}\n </article>\n );\n}\n"],"ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,2 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automations-Cw5Gacgm.js","names":["useState","useCallback","useMemo","__toESM","Link","require_react","createLucideIcon","require_jsx_runtime","cn","LoadingState","Button","buttonClasses","apiGet","formatRelative","ErrorState","FatalError","LastKnownNote","EmptyState","AutomationView","useSyncStore","CalendarClock","ChevronRight","Hand","Link2","Play","Plus","BACK_STATE","Workflow","WifiOff","Clock","useBreakpoint","Switch","FailureCount","useMergedAutomations","useRunNow","useLocalAutomations","modeLabel","describeTrigger","useToggleEnabled","formatAbsolute","__iconData","Webhook","import_react","import_jsx_runtime","NEW_PATH","editPath","id","TRIGGER_ICONS","AutomationsView","hydrated","s","automations","projects","hosts","tasks","bp","fetchState","setFetchState","load","res","list","parsed","rows","a","b","haveData","body","AutomationRows","TABLE_COLS","toggling","running","taskTitle","table","project","hostId","host","props","toggle","next","run","TableRow","CardRow","TriggerText","Icon","automation","trigger","NextOccurrence","k","HostWarning","RunButton","onRun","name","p"],"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/webhook.mjs","../../src/features/automations/index.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: \"webhook\",\n size: 24,\n node: [\n [\n \"path\",\n {\n 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\",\n key: \"q3hayz\"\n }\n ],\n [\"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\" }],\n [\"path\", { d: \"m12 6 3.13 5.73C15.66 12.7 16.9 13 18 13a4 4 0 0 1 0 8\", key: \"qlwsc0\" }]\n ]\n};\n__iconData.node;\nconst Webhook = createLucideIcon(__iconData);\n\nexport { __iconData, Webhook as default };\n//# sourceMappingURL=webhook.mjs.map\n","import {\n type Automation,\n AutomationView,\n type Host,\n type Project,\n type Task,\n} from \"@switchyard/protocol\";\nimport {\n CalendarClock,\n ChevronRight,\n Clock,\n Hand,\n Link2,\n type LucideIcon,\n Play,\n Plus,\n Webhook,\n WifiOff,\n Workflow,\n} from \"lucide-react\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Link } from \"react-router\";\nimport { BACK_STATE } from \"../../app/useBackTo\";\nimport { useBreakpoint } from \"../../app/useBreakpoint\";\nimport { Button, buttonClasses } from \"../../components/ui/Button\";\nimport { Switch } from \"../../components/ui/Switch\";\nimport {\n EmptyState,\n ErrorState,\n FatalError,\n LastKnownNote,\n LoadingState,\n} from \"../../components/ui/states\";\nimport { cn } from \"../../lib/cn\";\nimport { formatRelative } from \"../../lib/time\";\nimport { apiGet } from \"../../sync/api\";\nimport { useSyncStore } from \"../../sync/store\";\nimport {\n FailureCount,\n useLocalAutomations,\n useMergedAutomations,\n useRunNow,\n useToggleEnabled,\n} from \"./controls\";\nimport { describeTrigger, formatAbsolute, modeLabel, type TriggerKind } from \"./describe\";\n\nconst NEW_PATH = \"/automations/new\";\nconst editPath = (id: string) => `/automations/${encodeURIComponent(id)}`;\n\nconst TRIGGER_ICONS: Record<TriggerKind, LucideIcon> = {\n manual: Hand,\n once: Clock,\n cron: CalendarClock,\n webhook: Webhook,\n dependency: Link2,\n};\n\ntype FetchState =\n | { status: \"idle\" | \"loading\" | \"done\" }\n | { status: \"error\"; error: unknown }\n | { status: \"fatal\"; error: unknown };\n\n/** Automations list (spec 15): enabled state, trigger, next occurrence, last outcome, failures. */\nexport default function AutomationsView() {\n const hydrated = useSyncStore((s) => s.hydrated);\n const automations = useMergedAutomations();\n const projects = useSyncStore((s) => s.projects);\n const hosts = useSyncStore((s) => s.hosts);\n const tasks = useSyncStore((s) => s.tasks);\n const bp = useBreakpoint();\n const [fetchState, setFetchState] = useState<FetchState>({ status: \"idle\" });\n\n // REST fallback while the sync snapshot has not arrived (and for retry after a failure).\n const load = useCallback(async () => {\n setFetchState({ status: \"loading\" });\n try {\n const res = await apiGet<unknown>(\"/api/automations\");\n const list = Array.isArray(res)\n ? res\n : res && typeof res === \"object\" && Array.isArray((res as { items?: unknown }).items)\n ? (res as { items: unknown[] }).items\n : null;\n const parsed = list ? AutomationView.array().safeParse(list) : null;\n if (!parsed?.success) {\n setFetchState({\n status: \"fatal\",\n error: new Error(\"The coordinator returned automations in an unexpected format.\"),\n });\n return;\n }\n useLocalAutomations.getState().putMany(parsed.data);\n setFetchState({ status: \"done\" });\n } catch (e) {\n setFetchState({ status: \"error\", error: e });\n }\n }, []);\n\n useEffect(() => {\n if (!hydrated) void load();\n }, [hydrated, load]);\n\n const rows = useMemo(\n () => Object.values(automations).sort((a, b) => a.name.localeCompare(b.name)),\n [automations],\n );\n\n const haveData = hydrated || fetchState.status === \"done\";\n\n let body: ReactNode;\n if (!haveData) {\n if (fetchState.status === \"fatal\") body = <FatalError error={fetchState.error} />;\n else if (fetchState.status === \"error\")\n body = (\n <ErrorState\n title=\"Could not load automations\"\n error={fetchState.error}\n onRetry={() => void load()}\n />\n );\n else body = <LoadingState label=\"Loading automations…\" />;\n } else if (rows.length === 0) {\n body = (\n <EmptyState\n icon={<Workflow className=\"size-8\" />}\n title=\"No automations yet\"\n description=\"Automations create tasks on a schedule, from a webhook, or when another task is done.\"\n action={{ label: \"Create an automation\", to: NEW_PATH, icon: <Plus className=\"size-4\" /> }}\n />\n );\n } else {\n body = (\n <AutomationRows\n automations={rows}\n projects={projects}\n hosts={hosts}\n tasks={tasks}\n table={bp === \"desktop\"}\n />\n );\n }\n\n return (\n <div className=\"flex w-full min-w-0 flex-col gap-4 px-4 py-4 md:px-6\">\n <header className=\"flex flex-wrap items-center justify-between gap-3\">\n <div className=\"min-w-0\">\n <h1 className=\"text-lg font-semibold\">Automations</h1>\n <p className=\"text-sm text-muted\">\n Scheduled, webhook and dependency automations. Routine successes stay in each\n automation's history.\n </p>\n </div>\n <Link to={NEW_PATH} state={BACK_STATE} className={buttonClasses(\"primary\")}>\n <Plus aria-hidden className=\"size-4\" />\n New automation\n </Link>\n </header>\n <LastKnownNote\n subject=\"automations\"\n consequence=\"Changes are sent once the coordinator is reachable again.\"\n />\n {body}\n </div>\n );\n}\n\nconst TABLE_COLS =\n \"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\";\n\nfunction AutomationRows({\n automations,\n projects,\n hosts,\n tasks,\n table,\n}: {\n automations: Automation[];\n projects: Record<string, Project>;\n hosts: Record<string, Host>;\n tasks: Record<string, Task>;\n table: boolean;\n}) {\n const { busy: toggling, toggle } = useToggleEnabled();\n const { busy: running, run } = useRunNow();\n const taskTitle = useCallback((id: string) => tasks[id]?.title, [tasks]);\n\n return (\n <div className=\"min-w-0 overflow-hidden rounded-lg border border-border bg-surface\">\n {table && (\n <div\n aria-hidden\n className={cn(\n TABLE_COLS,\n \"border-b border-border bg-surface-2 px-4 py-2 text-xs font-medium text-muted\",\n )}\n >\n <span>Automation</span>\n <span>Project</span>\n <span>Mode</span>\n <span>Next occurrence</span>\n <span>Last outcome</span>\n <span>Failures</span>\n <span>Enabled</span>\n <span className=\"sr-only\">Actions</span>\n </div>\n )}\n <ul data-testid=\"automations-list\" className=\"divide-y divide-border\">\n {automations.map((a) => {\n const project = projects[a.projectId];\n const hostId = a.hostId ?? project?.defaultHostId ?? null;\n const host = hostId ? hosts[hostId] : undefined;\n const props: RowProps = {\n automation: a,\n projectName: project?.name ?? \"Unknown project\",\n host,\n trigger: describeTrigger(a.trigger, { taskTitle }),\n toggling: !!toggling[a.id],\n running: !!running[a.id],\n onToggle: (next) => void toggle(a, next),\n onRun: () => void run(a),\n };\n return (\n <li key={a.id} data-testid=\"automation-row\" data-automation-id={a.id}>\n {table ? <TableRow {...props} /> : <CardRow {...props} />}\n </li>\n );\n })}\n </ul>\n </div>\n );\n}\n\ninterface RowProps {\n automation: Automation;\n projectName: string;\n host: Host | undefined;\n trigger: string;\n toggling: boolean;\n running: boolean;\n onToggle: (next: boolean) => void;\n onRun: () => void;\n}\n\nfunction TriggerText({ automation, trigger }: { automation: Automation; trigger: string }) {\n const Icon = TRIGGER_ICONS[automation.trigger.kind];\n return (\n <span className=\"flex min-w-0 items-start gap-1.5 text-sm text-muted\">\n <Icon aria-hidden className=\"mt-0.5 size-3.5 shrink-0\" />\n <span className=\"min-w-0 break-words\">{trigger}</span>\n </span>\n );\n}\n\nfunction NextOccurrence({ automation }: { automation: Automation }) {\n if (!automation.enabled) return <span className=\"text-sm text-muted\">Disabled</span>;\n if (!automation.nextAt) {\n const k = automation.trigger.kind;\n const text =\n k === \"manual\"\n ? \"On demand\"\n : k === \"webhook\"\n ? \"On webhook\"\n : k === \"dependency\"\n ? \"When the task is done\"\n : \"None scheduled\";\n return <span className=\"text-sm text-muted\">{text}</span>;\n }\n return (\n <span className=\"flex min-w-0 flex-col text-sm\">\n <span>{formatRelative(automation.nextAt)}</span>\n <time dateTime={automation.nextAt} className=\"text-xs text-muted\">\n {formatAbsolute(automation.nextAt)}\n </time>\n </span>\n );\n}\n\nfunction HostWarning({ host }: { host: Host | undefined }) {\n if (!host || host.connectivity === \"connected\") return null;\n return (\n <span className=\"flex items-center gap-1 text-xs text-danger\">\n <WifiOff aria-hidden className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 break-words\">\n Host {host.name} {host.connectivity === \"reconnecting\" ? \"reconnecting\" : \"unreachable\"}\n </span>\n </span>\n );\n}\n\nfunction RunButton({\n running,\n onRun,\n name,\n}: {\n running: boolean;\n onRun: () => void;\n name: string;\n}) {\n return (\n <Button\n size=\"sm\"\n busy={running}\n icon={<Play className=\"size-3.5\" />}\n onClick={onRun}\n aria-label={`Run ${name} now`}\n >\n Run now\n </Button>\n );\n}\n\nfunction TableRow(p: RowProps) {\n const a = p.automation;\n return (\n <div className={cn(TABLE_COLS, \"px-4 py-3\")}>\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <Link\n to={editPath(a.id)}\n state={BACK_STATE}\n className=\"truncate font-medium text-text hover:underline focus-visible:underline\"\n >\n {a.name}\n </Link>\n <TriggerText automation={a} trigger={p.trigger} />\n </div>\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"sr-only\">Project: </span>\n <span className=\"truncate text-sm\">{p.projectName}</span>\n <HostWarning host={p.host} />\n </div>\n <span className=\"text-sm\">\n <span className=\"sr-only\">Mode: </span>\n {modeLabel(a.mode)}\n </span>\n <div className=\"min-w-0\">\n <span className=\"sr-only\">Next occurrence: </span>\n <NextOccurrence automation={a} />\n </div>\n <div className=\"min-w-0 text-sm break-words\">\n <span className=\"sr-only\">Last outcome: </span>\n {a.lastOutcome ?? <span className=\"text-muted\">No runs yet</span>}\n </div>\n <FailureCount count={a.failureCount} />\n <Switch\n checked={a.enabled}\n onChange={p.onToggle}\n busy={p.toggling}\n label={`Enable ${a.name}`}\n onText=\"Enabled\"\n offText=\"Disabled\"\n />\n <div className=\"flex items-center gap-1\">\n <RunButton running={p.running} onRun={p.onRun} name={a.name} />\n <Link\n to={editPath(a.id)}\n state={BACK_STATE}\n aria-label={`Edit ${a.name}`}\n title=\"Edit\"\n className=\"tap inline-flex size-9 items-center justify-center rounded-md text-muted hover:bg-surface-2 hover:text-text\"\n >\n <ChevronRight aria-hidden className=\"size-4\" />\n </Link>\n </div>\n </div>\n );\n}\n\nfunction CardRow(p: RowProps) {\n const a = p.automation;\n return (\n <div className=\"flex min-w-0 flex-col gap-2 px-4 py-3\">\n <div className=\"flex min-w-0 items-start justify-between gap-2\">\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n <Link\n to={editPath(a.id)}\n state={BACK_STATE}\n className=\"font-medium break-words text-text hover:underline focus-visible:underline\"\n >\n {a.name}\n </Link>\n <TriggerText automation={a} trigger={p.trigger} />\n </div>\n <Switch\n checked={a.enabled}\n onChange={p.onToggle}\n busy={p.toggling}\n label={`Enable ${a.name}`}\n onText=\"Enabled\"\n offText=\"Disabled\"\n />\n </div>\n <dl className=\"grid min-w-0 grid-cols-[auto_minmax(0,1fr)] gap-x-3 gap-y-1 text-sm\">\n <dt className=\"text-muted\">Project</dt>\n <dd className=\"flex min-w-0 flex-col break-words\">\n {p.projectName}\n <HostWarning host={p.host} />\n </dd>\n <dt className=\"text-muted\">Mode</dt>\n <dd>{modeLabel(a.mode)}</dd>\n <dt className=\"text-muted\">Next</dt>\n <dd className=\"min-w-0\">\n <NextOccurrence automation={a} />\n </dd>\n <dt className=\"text-muted\">Last outcome</dt>\n <dd className=\"min-w-0 break-words\">\n {a.lastOutcome ?? <span className=\"text-muted\">No runs yet</span>}\n </dd>\n <dt className=\"text-muted\">Failures</dt>\n <dd>\n <FailureCount count={a.failureCount} />\n </dd>\n </dl>\n <div className=\"flex flex-wrap gap-2\">\n <RunButton running={p.running} onRun={p.onRun} name={a.name} />\n <Link to={editPath(a.id)} state={BACK_STATE} className={buttonClasses(\"ghost\", \"sm\")}>\n Edit\n <ChevronRight aria-hidden className=\"size-3.5\" />\n </Link>\n </div>\n </div>\n );\n}\n"],"ignoreList":[0],"mappings":"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"}
@@ -0,0 +1,10 @@
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