@spencerboucher/switchyard 0.6.0 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/bridge/switchyard-terminal.js +62 -1
- package/dist/switchyard.mjs +869 -643
- package/package.json +1 -1
- package/web-dist/assets/AutomationView-BIW_pO0M.js +2 -0
- package/web-dist/assets/AutomationView-BIW_pO0M.js.map +1 -0
- package/web-dist/assets/Badge-BiDp7NKI.js +2 -0
- package/web-dist/assets/Badge-BiDp7NKI.js.map +1 -0
- package/web-dist/assets/InteractionCard-CWxyDv81.js +6 -0
- package/web-dist/assets/InteractionCard-CWxyDv81.js.map +1 -0
- package/web-dist/assets/{Menu-GymfuHGP.js → Menu-BDt1bxwz.js} +2 -2
- package/web-dist/assets/{Menu-GymfuHGP.js.map → Menu-BDt1bxwz.js.map} +1 -1
- package/web-dist/assets/{SegmentedControl-ChdVilXb.js → SegmentedControl-D-2BCZzd.js} +2 -2
- package/web-dist/assets/{SegmentedControl-ChdVilXb.js.map → SegmentedControl-D-2BCZzd.js.map} +1 -1
- package/web-dist/assets/Tabs-ByiPklAw.js +184 -0
- package/web-dist/assets/Tabs-ByiPklAw.js.map +1 -0
- package/web-dist/assets/TextArea-BYr88SnV.js +2 -0
- package/web-dist/assets/TextArea-BYr88SnV.js.map +1 -0
- package/web-dist/assets/attention-Bya8XHKI.js +2 -0
- package/web-dist/assets/attention-Bya8XHKI.js.map +1 -0
- package/web-dist/assets/automations-DiXKRcnE.js +2 -0
- package/web-dist/assets/automations-DiXKRcnE.js.map +1 -0
- package/web-dist/assets/board-BrLaJwLJ.js +10 -0
- package/web-dist/assets/board-BrLaJwLJ.js.map +1 -0
- package/web-dist/assets/c-Cz4nF6n_.js +1 -0
- package/web-dist/assets/c-SSSlmE39.js +2 -0
- package/web-dist/assets/c-SSSlmE39.js.map +1 -0
- package/web-dist/assets/code-DKLO8bzz.js +11 -0
- package/web-dist/assets/code-DKLO8bzz.js.map +1 -0
- package/web-dist/assets/cpp-Cts1PyIS.js +2 -0
- package/web-dist/assets/cpp-Cts1PyIS.js.map +1 -0
- package/web-dist/assets/cpp-DzjeI0uH.js +1 -0
- package/web-dist/assets/css-BGIxQoYs.js +2 -0
- package/web-dist/assets/css-BGIxQoYs.js.map +1 -0
- package/web-dist/assets/css-DgaLhXQH.js +1 -0
- package/web-dist/assets/describe-DnvH6_fl.js +5 -0
- package/web-dist/assets/describe-DnvH6_fl.js.map +1 -0
- package/web-dist/assets/diff-woXpYk--.js +2 -0
- package/web-dist/assets/diff-woXpYk--.js.map +1 -0
- package/web-dist/assets/{dist-Bgkh2hc5.js → dist-BE_V9dwJ.js} +2 -2
- package/web-dist/assets/dist-BE_V9dwJ.js.map +1 -0
- package/web-dist/assets/dockerfile-IyjqRm3v.js +2 -0
- package/web-dist/assets/dockerfile-IyjqRm3v.js.map +1 -0
- package/web-dist/assets/enroll-DUDpbJoB.js +2 -0
- package/web-dist/assets/enroll-DUDpbJoB.js.map +1 -0
- package/web-dist/assets/github-dark-C-LZuMrd.js +2 -0
- package/web-dist/assets/github-dark-C-LZuMrd.js.map +1 -0
- package/web-dist/assets/github-light-EUqPIrTm.js +2 -0
- package/web-dist/assets/github-light-EUqPIrTm.js.map +1 -0
- package/web-dist/assets/go-rLFTqkRN.js +2 -0
- package/web-dist/assets/go-rLFTqkRN.js.map +1 -0
- package/web-dist/assets/html-BMn1ogTm.js +2 -0
- package/web-dist/assets/html-BMn1ogTm.js.map +1 -0
- package/web-dist/assets/html-BWDvXlHg.js +1 -0
- package/web-dist/assets/index-DvRcMGEe.css +2 -0
- package/web-dist/assets/index-vIzH1m8u.js +11 -0
- package/web-dist/assets/index-vIzH1m8u.js.map +1 -0
- package/web-dist/assets/java-BtIQNnN0.js +2 -0
- package/web-dist/assets/java-BtIQNnN0.js.map +1 -0
- package/web-dist/assets/java-_ATy9zCa.js +1 -0
- package/web-dist/assets/javascript-BzbQS41l.js +2 -0
- package/web-dist/assets/javascript-BzbQS41l.js.map +1 -0
- package/web-dist/assets/javascript-CpIGwZ_Y.js +1 -0
- package/web-dist/assets/json-qhed-kSA.js +2 -0
- package/web-dist/assets/json-qhed-kSA.js.map +1 -0
- package/web-dist/assets/jsonc-CYpm1nAK.js +2 -0
- package/web-dist/assets/jsonc-CYpm1nAK.js.map +1 -0
- package/web-dist/assets/jsx-C4yDKi0A.js +1 -0
- package/web-dist/assets/jsx-D3KKoC5L.js +2 -0
- package/web-dist/assets/jsx-D3KKoC5L.js.map +1 -0
- package/web-dist/assets/logic-xb-QF00E.js +2 -0
- package/web-dist/assets/logic-xb-QF00E.js.map +1 -0
- package/web-dist/assets/lua-DjuecEsk.js +2 -0
- package/web-dist/assets/lua-DjuecEsk.js.map +1 -0
- package/web-dist/assets/lua-fPRBWD-V.js +1 -0
- package/web-dist/assets/{more-CRGJsz6E.js → more-BP5x45cs.js} +2 -2
- package/web-dist/assets/{more-CRGJsz6E.js.map → more-BP5x45cs.js.map} +1 -1
- package/web-dist/assets/now--XjJC37b.js +2 -0
- package/web-dist/assets/now--XjJC37b.js.map +1 -0
- package/web-dist/assets/python-gzcpVVnB.js +2 -0
- package/web-dist/assets/python-gzcpVVnB.js.map +1 -0
- package/web-dist/assets/ruby-Bx-U2qjP.js +2 -0
- package/web-dist/assets/ruby-Bx-U2qjP.js.map +1 -0
- package/web-dist/assets/rust-DpiIf5JO.js +2 -0
- package/web-dist/assets/rust-DpiIf5JO.js.map +1 -0
- package/web-dist/assets/scss-8bKmll0B.js +2 -0
- package/web-dist/assets/scss-8bKmll0B.js.map +1 -0
- package/web-dist/assets/send-BKjswHxB.js +2 -0
- package/web-dist/assets/send-BKjswHxB.js.map +1 -0
- package/web-dist/assets/settings-D8T1esWq.js +7 -0
- package/web-dist/assets/settings-D8T1esWq.js.map +1 -0
- package/web-dist/assets/shared-CZ7fcu_B.js +3 -0
- package/web-dist/assets/shared-CZ7fcu_B.js.map +1 -0
- package/web-dist/assets/shellscript-CVTB3cr6.js +1 -0
- package/web-dist/assets/shellscript-CqHdAlCp.js +2 -0
- package/web-dist/assets/shellscript-CqHdAlCp.js.map +1 -0
- package/web-dist/assets/sliders-horizontal-DAoirila.js +2 -0
- package/web-dist/assets/sliders-horizontal-DAoirila.js.map +1 -0
- package/web-dist/assets/sql-CNu3Or2W.js +2 -0
- package/web-dist/assets/sql-CNu3Or2W.js.map +1 -0
- package/web-dist/assets/sql-CfM2IJm3.js +1 -0
- package/web-dist/assets/states--geW2Ntl.js +2 -0
- package/web-dist/assets/states--geW2Ntl.js.map +1 -0
- package/web-dist/assets/swift-CyEgAFGc.js +2 -0
- package/web-dist/assets/swift-CyEgAFGc.js.map +1 -0
- package/web-dist/assets/terminal-login-BJxV78au.js +2 -0
- package/web-dist/assets/terminal-login-BJxV78au.js.map +1 -0
- package/web-dist/assets/toml-CcmNWLt0.js +2 -0
- package/web-dist/assets/toml-CcmNWLt0.js.map +1 -0
- package/web-dist/assets/tsx-BOvsFOI6.js +2 -0
- package/web-dist/assets/tsx-BOvsFOI6.js.map +1 -0
- package/web-dist/assets/tsx-CGosfAUg.js +1 -0
- package/web-dist/assets/typescript-Bb1J8qyy.js +1 -0
- package/web-dist/assets/typescript-j_1H8WHN.js +2 -0
- package/web-dist/assets/typescript-j_1H8WHN.js.map +1 -0
- package/web-dist/assets/useNow-jxdoOC_1.js +2 -0
- package/web-dist/assets/{useNow-Bc_NlDY3.js.map → useNow-jxdoOC_1.js.map} +1 -1
- package/web-dist/assets/xml-DuKfbPI6.js +1 -0
- package/web-dist/assets/xml-WY0zc4PG.js +2 -0
- package/web-dist/assets/xml-WY0zc4PG.js.map +1 -0
- package/web-dist/assets/yaml-DDA_XMNu.js +1 -0
- package/web-dist/assets/yaml-DijMHRDA.js +2 -0
- package/web-dist/assets/yaml-DijMHRDA.js.map +1 -0
- package/web-dist/index.html +4 -3
- package/web-dist/sw.js +1 -1
- package/web-dist/sw.js.map +1 -1
- package/web-dist/assets/AutomationView-DgZn3ltn.js +0 -2
- package/web-dist/assets/AutomationView-DgZn3ltn.js.map +0 -1
- package/web-dist/assets/InteractionCard-cvPWKSu1.js +0 -4
- package/web-dist/assets/InteractionCard-cvPWKSu1.js.map +0 -1
- package/web-dist/assets/Markdown-jXkvZeRp.js +0 -31
- package/web-dist/assets/Markdown-jXkvZeRp.js.map +0 -1
- package/web-dist/assets/Overlay-oYnnwvFM.js +0 -2
- package/web-dist/assets/Overlay-oYnnwvFM.js.map +0 -1
- package/web-dist/assets/TextArea-BsQHOQMe.js +0 -2
- package/web-dist/assets/TextArea-BsQHOQMe.js.map +0 -1
- package/web-dist/assets/attention-Bxg9W15n.js +0 -2
- package/web-dist/assets/attention-Bxg9W15n.js.map +0 -1
- package/web-dist/assets/automations-DdB97dnL.js +0 -2
- package/web-dist/assets/automations-DdB97dnL.js.map +0 -1
- package/web-dist/assets/board-s4LuDPcg.js +0 -10
- package/web-dist/assets/board-s4LuDPcg.js.map +0 -1
- package/web-dist/assets/code-B0KXn7lD.js +0 -8
- package/web-dist/assets/code-B0KXn7lD.js.map +0 -1
- package/web-dist/assets/describe-C_3FJuSs.js +0 -5
- package/web-dist/assets/describe-C_3FJuSs.js.map +0 -1
- package/web-dist/assets/dist-Bgkh2hc5.js.map +0 -1
- package/web-dist/assets/enroll-DijmoolY.js +0 -2
- package/web-dist/assets/enroll-DijmoolY.js.map +0 -1
- package/web-dist/assets/index-C5n2QB-Y.css +0 -2
- package/web-dist/assets/index-Cf6ZUCfK.js +0 -11
- package/web-dist/assets/index-Cf6ZUCfK.js.map +0 -1
- package/web-dist/assets/logic-D_Eq9DMW.js +0 -2
- package/web-dist/assets/logic-D_Eq9DMW.js.map +0 -1
- package/web-dist/assets/now-D6lDofYy.js +0 -2
- package/web-dist/assets/now-D6lDofYy.js.map +0 -1
- package/web-dist/assets/settings-Csal1F-W.js +0 -8
- package/web-dist/assets/settings-Csal1F-W.js.map +0 -1
- package/web-dist/assets/sliders-horizontal-S3tmwxsP.js +0 -2
- package/web-dist/assets/sliders-horizontal-S3tmwxsP.js.map +0 -1
- package/web-dist/assets/states-DrTQuYXw.js +0 -2
- package/web-dist/assets/states-DrTQuYXw.js.map +0 -1
- package/web-dist/assets/useNow-Bc_NlDY3.js +0 -2
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{n as e}from"./jsx-runtime-D13aM9HY.js";var t={name:`chevron-left`,size:24,node:[[`path`,{d:`m15 18-6-6 6-6`,key:`1wnfg3`}]]};t.node;var n=e(t),r={name:`folder-git-2`,size:24,node:[[`path`,{d:`M18 19a5 5 0 0 1-5-5v8`,key:`sz5oeg`}],[`path`,{d:`M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5`,key:`1w6njk`}],[`circle`,{cx:`13`,cy:`12`,r:`2`,key:`1j92g6`}],[`circle`,{cx:`20`,cy:`19`,r:`2`,key:`1obnsp`}]]};r.node;var i=e(r),a={name:`send`,size:24,node:[[`path`,{d:`M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z`,key:`1ffxy3`}],[`path`,{d:`m21.854 2.147-10.94 10.939`,key:`12cjpa`}]]};a.node;var o=e(a),s={name:`sliders-horizontal`,size:24,node:[[`path`,{d:`M10 5H3`,key:`1qgfaw`}],[`path`,{d:`M12 19H3`,key:`yhmn1j`}],[`path`,{d:`M14 3v4`,key:`1sua03`}],[`path`,{d:`M16 17v4`,key:`1q0r14`}],[`path`,{d:`M21 12h-9`,key:`1o4lsq`}],[`path`,{d:`M21 19h-5`,key:`1rlt1p`}],[`path`,{d:`M21 5h-7`,key:`1oszz2`}],[`path`,{d:`M8 10v4`,key:`tgpxqk`}],[`path`,{d:`M8 12H3`,key:`a7s4jb`}]]};s.node;var c=e(s);export{n as i,o as n,i as r,c as t};
|
|
2
|
-
//# sourceMappingURL=sliders-horizontal-S3tmwxsP.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sliders-horizontal-S3tmwxsP.js","names":["__iconData","__iconData","__iconData","createLucideIcon","__iconData$3","ChevronLeft","__iconData$2","FolderGit2","__iconData$1","Send","__iconData","SlidersHorizontal"],"sources":["../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/chevron-left.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/folder-git-2.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/send.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/sliders-horizontal.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: \"chevron-left\",\n size: 24,\n node: [[\"path\", { d: \"m15 18-6-6 6-6\", key: \"1wnfg3\" }]]\n};\n__iconData.node;\nconst ChevronLeft = createLucideIcon(__iconData);\n\nexport { __iconData, ChevronLeft as default };\n//# sourceMappingURL=chevron-left.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"folder-git-2\",\n size: 24,\n node: [\n [\"path\", { d: \"M18 19a5 5 0 0 1-5-5v8\", key: \"sz5oeg\" }],\n [\n \"path\",\n {\n d: \"M9 20H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H20a2 2 0 0 1 2 2v5\",\n key: \"1w6njk\"\n }\n ],\n [\"circle\", { cx: \"13\", cy: \"12\", r: \"2\", key: \"1j92g6\" }],\n [\"circle\", { cx: \"20\", cy: \"19\", r: \"2\", key: \"1obnsp\" }]\n ]\n};\n__iconData.node;\nconst FolderGit2 = createLucideIcon(__iconData);\n\nexport { __iconData, FolderGit2 as default };\n//# sourceMappingURL=folder-git-2.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"send\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M14.536 21.686a.5.5 0 0 0 .937-.024l6.5-19a.496.496 0 0 0-.635-.635l-19 6.5a.5.5 0 0 0-.024.937l7.93 3.18a2 2 0 0 1 1.112 1.11z\",\n key: \"1ffxy3\"\n }\n ],\n [\"path\", { d: \"m21.854 2.147-10.94 10.939\", key: \"12cjpa\" }]\n ]\n};\n__iconData.node;\nconst Send = createLucideIcon(__iconData);\n\nexport { __iconData, Send as default };\n//# sourceMappingURL=send.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"sliders-horizontal\",\n size: 24,\n node: [\n [\"path\", { d: \"M10 5H3\", key: \"1qgfaw\" }],\n [\"path\", { d: \"M12 19H3\", key: \"yhmn1j\" }],\n [\"path\", { d: \"M14 3v4\", key: \"1sua03\" }],\n [\"path\", { d: \"M16 17v4\", key: \"1q0r14\" }],\n [\"path\", { d: \"M21 12h-9\", key: \"1o4lsq\" }],\n [\"path\", { d: \"M21 19h-5\", key: \"1rlt1p\" }],\n [\"path\", { d: \"M21 5h-7\", key: \"1oszz2\" }],\n [\"path\", { d: \"M8 10v4\", key: \"tgpxqk\" }],\n [\"path\", { d: \"M8 12H3\", key: \"a7s4jb\" }]\n ]\n};\n__iconData.node;\nconst SlidersHorizontal = createLucideIcon(__iconData);\n\nexport { __iconData, SlidersHorizontal as default };\n//# sourceMappingURL=sliders-horizontal.mjs.map\n"],"ignoreList":[0,1,2,3],"mappings":"A,8CASA,IAAMA,EAAa,CACjB,KAAM,eACN,KAAM,GACN,KAAM,CAAC,CAAC,OAAQ,CAAE,EAAG,iBAAkB,IAAK,QAAS,CAAC,CAAC,CACzD,EACAA,EAAW,KACX,IAAMK,EAAcF,EAAiBH,CAAU,ECNzCC,EAAa,CACjB,KAAM,eACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,yBAA0B,IAAK,QAAS,CAAC,EACvD,CACE,OACA,CACE,EAAG,yGACH,IAAK,QACP,CACF,EACA,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAS,CAAC,EACxD,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,IAAK,IAAK,QAAS,CAAC,CAC1D,CACF,EACAA,EAAW,KACX,IAAMM,EAAaJ,EAAiBF,CAAU,ECjBxCC,EAAa,CACjB,KAAM,OACN,KAAM,GACN,KAAM,CACJ,CACE,OACA,CACE,EAAG,kIACH,IAAK,QACP,CACF,EACA,CAAC,OAAQ,CAAE,EAAG,6BAA8B,IAAK,QAAS,CAAC,CAC7D,CACF,EACAA,EAAW,KACX,IAAMO,EAAON,EAAiBD,CAAU,ECflCQ,EAAa,CACjB,KAAM,qBACN,KAAM,GACN,KAAM,CACJ,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,EAC1C,CAAC,OAAQ,CAAE,EAAG,YAAa,IAAK,QAAS,CAAC,EAC1C,CAAC,OAAQ,CAAE,EAAG,WAAY,IAAK,QAAS,CAAC,EACzC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,EACxC,CAAC,OAAQ,CAAE,EAAG,UAAW,IAAK,QAAS,CAAC,CAC1C,CACF,EACAA,EAAW,KACX,IAAMC,EAAoBR,EAAiBO,CAAU,E"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,i as t,m as n,n as r,t as i}from"./jsx-runtime-D13aM9HY.js";var a=e(n(),1),o=e=>{let t,n=new Set,r=(e,r)=>{let i=typeof e==`function`?e(t):e;if(!Object.is(i,t)){let e=t;t=r??(typeof i!=`object`||!i)?i:Object.assign({},t,i),n.forEach(n=>n(t,e))}},i=()=>t,a={setState:r,getState:i,getInitialState:()=>o,subscribe:e=>(n.add(e),()=>n.delete(e))},o=t=e(r,i,a);return a},s=(e=>e?o(e):o),c=e=>e;function ee(e,t=c){let n=a.useSyncExternalStore(e.subscribe,a.useCallback(()=>t(e.getState()),[e,t]),()=>t(e.getInitialState()));return a.useDebugValue(n),n}var l=e=>{let t=s(e),n=e=>ee(t,e);return Object.assign(n,t),n},u=(e=>e?l(e):l),d=class extends Error{code;status;details;constructor(e,t,n,r){super(t),this.name=`ApiClientError`,this.code=e,this.status=n,this.details=r}};function te(e,t){return e instanceof d&&(t===void 0||e.code===t)}function f(e){return e instanceof Error?e.message:String(e)}var p=new Set;function ne(e){return p.add(e),()=>p.delete(e)}function re(e,t){if(!t)return e;let n=new URLSearchParams;for(let[e,r]of Object.entries(t))r!=null&&n.set(e,String(r));let r=n.toString();return r?`${e}${e.includes(`?`)?`&`:`?`}${r}`:e}async function m(e,t={}){let n=t.method??(t.body===void 0?`GET`:`POST`),r={Accept:`application/json`,"X-Switchyard-Request":`1`,...t.headers},i;t.body!==void 0&&(r[`Content-Type`]=`application/json`,i=JSON.stringify(t.body));let a;try{a=await fetch(re(e,t.query),{method:n,headers:r,body:i,credentials:`include`,signal:t.signal})}catch(e){throw e instanceof DOMException&&e.name===`AbortError`?e:new d(`network`,`Could not reach the coordinator`,0)}let o=await a.text(),s;if(o)try{s=JSON.parse(o)}catch{s=void 0}if(!a.ok){let e=ie(s),t=e?new d(e.code,e.message,a.status,e.details):new d(a.status===401?`unauthorized`:`http`,`Request failed (${a.status}${a.statusText?` ${a.statusText}`:``})`,a.status);if(a.status===401)for(let e of p)e(t.code);throw t}return s}function ie(e){if(!e||typeof e!=`object`)return null;let t=e.error;if(!t||typeof t!=`object`)return null;let{code:n,message:r,details:i}=t;return typeof n==`string`?{code:n,message:typeof r==`string`?r:n,details:i}:null}var h=(e,t,n)=>m(e,{method:`GET`,query:t,signal:n}),ae=(e,t)=>m(e,{method:`POST`,body:t??{}}),oe=(e,t)=>m(e,{method:`PATCH`,body:t}),se=(e,t)=>m(e,{method:`DELETE`,body:t}),ce=new Set([`starting`,`running`,`waiting_input`]);function g(e,t,n){return`${e}:${t}:${n}`}function _(e){return e.node!==null||e.webRenderer}function le(){return{seq:null,hosts:{},projects:{},checkouts:{},workspaces:{},profiles:{},sessions:{},tasks:{},runs:{},automations:{},attention:{},interactions:{},panels:{},devices:{},adapters:{},occurrences:{},diagnostics:[],dispatchPaused:!1}}function ue(){return{...le(),transcripts:{},streaming:{}}}function v(){return{items:[],loaded:!1,loading:!1,hasMore:!1,stale:!1,error:null}}function y(e){let t={};for(let n of e)t[n.id]=n;return t}function b(e,t,n){return{...e,[t]:n}}function x(e,t){if(!(t in e))return e;let n={...e};return delete n[t],n}function S(e,t,n){let r={};for(let e of n.panels)_(e)&&(r[g(e.sessionId,e.adapterId,e.slot)]=e);let i={};for(let[t,n]of Object.entries(e.transcripts))i[t]={...n,stale:!0};return{...e,seq:t,hosts:y(n.hosts),projects:y(n.projects),checkouts:y(n.checkouts),workspaces:y(n.workspaces),profiles:y(n.profiles),sessions:y(n.sessions),tasks:y(n.tasks),runs:y(n.runs),automations:y(n.automations),attention:y(n.attention.filter(e=>e.resolvedAt===null)),interactions:y(n.interactions),panels:r,devices:y(n.devices),adapters:{...n.adapters},dispatchPaused:n.dispatchPaused,transcripts:i,streaming:{}}}function de(e){return{hosts:Object.values(e.hosts),projects:Object.values(e.projects),checkouts:Object.values(e.checkouts),workspaces:Object.values(e.workspaces),profiles:Object.values(e.profiles),sessions:Object.values(e.sessions),tasks:Object.values(e.tasks),runs:Object.values(e.runs),automations:Object.values(e.automations),attention:Object.values(e.attention),interactions:Object.values(e.interactions),panels:Object.values(e.panels),devices:Object.values(e.devices),adapters:e.adapters,dispatchPaused:e.dispatchPaused}}function C(e,t){if(t.length===0)return e;let n=new Map;for(let t of e)n.set(t.id,t);for(let e of t)n.set(e.id,e);return[...n.values()].sort((e,t)=>e.order-t.order||e.id.localeCompare(t.id))}function w(e,t,n,r){let i=e.transcripts[t]??v(),a=!r.older&&i.stale?[]:i.items,o={...i,items:C(a,n),loaded:!0,loading:!1,stale:r.older?i.stale:!1,error:null,hasMore:r.older||!i.loaded||i.stale?r.hasMore:i.hasMore};return{...e,transcripts:{...e.transcripts,[t]:o}}}function fe(e,t){let n=e.transcripts[t.sessionId]??v(),r={...e.transcripts,[t.sessionId]:{...n,items:C(n.items,[t])}},i=x(e.streaming,t.id);return{...e,transcripts:r,streaming:i}}function T(e,t){return e.seq!==null&&t.seq<=e.seq?e:{...me(e,t.type,t.data),seq:t.seq}}function pe(e,t){let n=e;for(let e of[...t].sort((e,t)=>e.seq-t.seq))n=T(n,e);return n}function me(e,t,n){switch(t){case`host.updated`:{let t=n;return{...e,hosts:b(e.hosts,t.id,t)}}case`project.updated`:{let t=n;return{...e,projects:b(e.projects,t.id,t)}}case`project.deleted`:{let t=n;return{...e,projects:x(e.projects,t.id)}}case`checkout.updated`:{let t=n;return{...e,checkouts:b(e.checkouts,t.id,t)}}case`workspace.updated`:{let t=n;return{...e,workspaces:t.archivedAt?x(e.workspaces,t.id):b(e.workspaces,t.id,t)}}case`workspace.removed`:{let t=n;return{...e,workspaces:x(e.workspaces,t.id)}}case`profile.updated`:{let t=n;return{...e,profiles:b(e.profiles,t.id,t)}}case`session.updated`:{let t=n,r={...e,sessions:b(e.sessions,t.id,t)};return ce.has(t.runtime)?r:ge(r,t.id)}case`transcript.item`:return fe(e,n);case`interaction.updated`:{let t=n,r=e.interactions[t.id];return r&&r.revision>t.revision?e:{...e,interactions:b(e.interactions,t.id,t)}}case`panel.updated`:{let t=n,r=g(t.sessionId,t.adapterId,t.slot);return{...e,panels:_(t)?b(e.panels,r,t):x(e.panels,r)}}case`adapters.updated`:{let t=n;return{...e,adapters:{...e.adapters,[t.hostId]:t.adapters}}}case`diagnostic`:{let t=n;return{...e,diagnostics:[...e.diagnostics,t].slice(-100)}}case`task.updated`:{let t=n;return{...e,tasks:b(e.tasks,t.id,t)}}case`task.deleted`:{let t=n;return{...e,tasks:x(e.tasks,t.id)}}case`run.updated`:{let t=n;return{...e,runs:b(e.runs,t.id,t)}}case`automation.updated`:{let t=n;return{...e,automations:b(e.automations,t.id,t)}}case`automation.deleted`:{let t=n,r={...e.occurrences};return delete r[t.id],{...e,automations:x(e.automations,t.id),occurrences:r}}case`occurrence.created`:{let t=n,r=(e.occurrences[t.automationId]??[]).filter(e=>e.id!==t.id);return{...e,occurrences:{...e.occurrences,[t.automationId]:[t,...r].slice(0,50)}}}case`attention.updated`:{let t=n;return{...e,attention:t.resolvedAt?x(e.attention,t.id):b(e.attention,t.id,t)}}case`device.updated`:{let t=n;return{...e,devices:t.revokedAt?x(e.devices,t.id):b(e.devices,t.id,t)}}case`settings.updated`:{let t=n;return{...e,dispatchPaused:t.dispatchPaused}}default:return e}}function he(e,t){let n=e.streaming[t.itemId]??{sessionId:t.sessionId,itemId:t.itemId,order:t.order??null,text:``,thinking:``,toolArgs:``,toolOutput:``},r=t.kind===`text`?`text`:t.kind===`thinking`?`thinking`:t.kind===`tool_args`?`toolArgs`:`toolOutput`,i={...n,order:n.order??t.order??null,[r]:n[r]+t.delta};return{...e,streaming:{...e.streaming,[t.itemId]:i}}}function ge(e,t){let n={},r=!1;for(let[i,a]of Object.entries(e.streaming))a.sessionId===t?r=!0:n[i]=a;return r?{...e,streaming:n}:e}function E(e,t){let n=Array.isArray(e)?e:e.items??[];return{items:n,hasMore:(Array.isArray(e)?void 0:e.hasMore)??n.length>=t}}var D=new Map,O=u()((e,t)=>({...ue(),hydrated:!1,synced:!1,connection:{state:`connecting`,lastSyncedAt:null,attempts:0},hydrateFromCache(n,r,i){t().synced||e(e=>({...S(e,n,r),hydrated:!0,connection:{...e.connection,lastSyncedAt:e.connection.lastSyncedAt??i}}))},applySnapshot(t,n){e(e=>({...S(e,t,n),hydrated:!0,synced:!0,connection:{...e.connection,lastSyncedAt:new Date().toISOString()}}))},applyReplay(t,n){e(e=>{let r=pe(e,n);return{...r,seq:Math.max(r.seq??0,t),hydrated:!0,synced:!0,connection:{...e.connection,lastSyncedAt:new Date().toISOString()}}})},applyEvent(t){e(e=>({...T(e,t),connection:{...e.connection,lastSyncedAt:new Date().toISOString()}}))},applyStream(t){e(e=>he(e,t))},setConnection(t){e(e=>({connection:{...e.connection,...t}}))},upsertInteraction(t){e(e=>{let n=e.interactions[t.id];return n&&n.revision>t.revision?{}:{interactions:{...e.interactions,[t.id]:t}}})},loadTranscript(n,r){let i=t().transcripts[n];if(i?.loaded&&!i.stale&&!r?.force)return Promise.resolve();let a=`${n}:newest`,o=D.get(a);if(o)return o;k(e,n,{loading:!0,error:null});let s=h(`/api/sessions/${encodeURIComponent(n)}/transcript`,{limit:200}).then(t=>{let r=E(t,200);e(e=>w(e,n,r.items,{hasMore:r.hasMore??!1,older:!1}))}).catch(t=>k(e,n,{loading:!1,error:f(t)})).finally(()=>D.delete(a));return D.set(a,s),s},loadOlderTranscript(n){let r=t().transcripts[n];if(!r?.loaded||!r.hasMore||r.items.length===0)return Promise.resolve();let i=r.items[0].order,a=`${n}:before:${i}`,o=D.get(a);if(o)return o;k(e,n,{loading:!0,error:null});let s=h(`/api/sessions/${encodeURIComponent(n)}/transcript`,{before:i,limit:200}).then(t=>{let r=E(t,200);e(e=>w(e,n,r.items,{hasMore:r.hasMore??!1,older:!0}))}).catch(t=>k(e,n,{loading:!1,error:f(t)})).finally(()=>D.delete(a));return D.set(a,s),s},reset(){e({...ue(),hydrated:!1,synced:!1,connection:{state:`connecting`,lastSyncedAt:null,attempts:0}})}}));function k(e,t,n){e(e=>({transcripts:{...e.transcripts,[t]:{...e.transcripts[t]??v(),...n}}}))}var _e=O;function ve(e){return Object.values(e).filter(e=>e.resolvedAt===null).sort((e,t)=>t.createdAt.localeCompare(e.createdAt))}function ye(e){let t=0;for(let n of Object.values(e))!n.resolvedAt&&!n.acknowledgedAt&&t++;return t}function be(e,t){return Object.values(e).filter(e=>e.sessionId===t&&e.state===`pending`).sort((e,t)=>e.createdAt.localeCompare(t.createdAt))}function A(e,t){return Object.values(e).filter(e=>e.taskId===t).sort((e,t)=>t.attempt-e.attempt||t.createdAt.localeCompare(e.createdAt))}function xe(e,t){return Object.values(e).filter(e=>e.sessionId===t).sort((e,t)=>e.adapterId.localeCompare(t.adapterId)||e.slot.localeCompare(t.slot))}function Se(e,t){return Object.values(e).filter(e=>e.sessionId===t)}var Ce=()=>O(e=>e.connection),we=e=>O(t=>e?t.sessions[e]:void 0),Te=e=>O(t=>e?t.tasks[e]:void 0);function Ee(){let e=O(e=>e.projects);return(0,a.useMemo)(()=>Object.values(e).sort((e,t)=>e.name.localeCompare(t.name)),[e])}function De(){let e=O(e=>e.hosts);return(0,a.useMemo)(()=>Object.values(e).filter(e=>e.revokedAt===null).sort((e,t)=>e.name.localeCompare(t.name)),[e])}function Oe(){let e=O(e=>e.attention);return(0,a.useMemo)(()=>ve(e),[e])}function ke(){return O(e=>ye(e.attention))}function Ae(e){let t=O(e=>e.interactions);return(0,a.useMemo)(()=>e?be(t,e):[],[t,e])}function je(e){let t=O(e=>e.runs);return(0,a.useMemo)(()=>e?A(t,e):[],[t,e])}function Me(e){let t=O(e=>e.panels);return(0,a.useMemo)(()=>e?xe(t,e):[],[t,e])}function Ne(e){let t=O(e=>e.streaming);return(0,a.useMemo)(()=>e?Se(t,e):[],[t,e])}var Pe=v();function Fe(e){let t=O(t=>e?t.transcripts[e]:void 0),n=O(e=>e.loadTranscript),r=!!e&&(!t||(!t.loaded||t.stale)&&!t.loading&&!t.error);return(0,a.useEffect)(()=>{r&&e&&n(e)},[r,e,n]),t??Pe}var j={name:`circle-alert`,size:24,node:[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]],aliases:[`alert-circle`]};j.node;var M=r(j),N={name:`inbox`,size:24,node:[[`polyline`,{points:`22 12 16 12 14 15 10 15 8 12 2 12`,key:`o97t9d`}],[`path`,{d:`M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`oot6mr`}]]};N.node;var P=r(N),F={name:`message-circle-question-mark`,size:24,node:[[`path`,{d:`M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719`,key:`1sd12s`}],[`path`,{d:`M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3`,key:`1u773s`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`message-circle-question`]};F.node;var I=r(F),L={name:`puzzle`,size:24,node:[[`path`,{d:`M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z`,key:`w46dr5`}]]};L.node;var R=r(L),z={name:`refresh-cw`,size:24,node:[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`,key:`v9h5vc`}],[`path`,{d:`M21 3v5h-5`,key:`1q7to0`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`,key:`3uifl3`}],[`path`,{d:`M8 16H3v5`,key:`1cv678`}]]};z.node;var B=r(z),V={name:`server-off`,size:24,node:[[`path`,{d:`M7 2h13a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-5`,key:`bt2siv`}],[`path`,{d:`M10 10 2.5 2.5C2 2 2 2.5 2 5v3a2 2 0 0 0 2 2h6z`,key:`1hjrv1`}],[`path`,{d:`M22 17v-1a2 2 0 0 0-2-2h-1`,key:`1iynyr`}],[`path`,{d:`M4 14a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16.5l1-.5.5.5-8-8H4z`,key:`161ggg`}],[`path`,{d:`M6 18h.01`,key:`uhywen`}],[`path`,{d:`m2 2 20 20`,key:`1ooewy`}]]};V.node;var H=r(V),U={name:`triangle-alert`,size:24,node:[[`path`,{d:`m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3`,key:`wmoenq`}],[`path`,{d:`M12 9v4`,key:`juzpu7`}],[`path`,{d:`M12 17h.01`,key:`p32p05`}]],aliases:[`alert-triangle`]};U.node;var W=r(U);function G(...e){return e.filter(Boolean).join(` `)}var K=typeof Intl<`u`&&`RelativeTimeFormat`in Intl?new Intl.RelativeTimeFormat(void 0,{numeric:`auto`}):null;function q(e,t=Date.now()){if(!e)return`never`;let n=Date.parse(e);if(Number.isNaN(n))return e;let r=Math.round((n-t)/1e3),i=Math.abs(r);return i<30?`just now`:K?i<3600?K.format(Math.round(r/60),`minute`):i<86400?K.format(Math.round(r/3600),`hour`):i<2592e3?K.format(Math.round(r/86400),`day`):new Date(n).toLocaleDateString():new Date(n).toLocaleString()}function J(e){if(e==null)return`unknown`;let t=new Date(e);return Number.isNaN(t.getTime())?String(e):t.toDateString()===new Date().toDateString()?t.toLocaleTimeString(void 0,{hour:`2-digit`,minute:`2-digit`}):t.toLocaleString(void 0,{month:`short`,day:`numeric`,hour:`2-digit`,minute:`2-digit`})}function Ie(e){if(e==null||Number.isNaN(e))return``;if(e<1e3)return`${Math.round(e)} ms`;let t=Math.round(e/1e3);if(t<60)return`${t}s`;let n=Math.floor(t/60);return n<60?`${n}m ${String(t%60).padStart(2,`0`)}s`:`${Math.floor(n/60)}h ${String(n%60).padStart(2,`0`)}m`}var Y=i(),Le={primary:`bg-accent text-accent-fg border-accent hover:bg-accent-hover hover:border-accent-hover`,secondary:`bg-surface text-text border-border hover:bg-surface-2`,ghost:`bg-transparent text-text border-transparent hover:bg-surface-2`,danger:`bg-danger text-danger-fg border-danger hover:bg-danger-hover hover:border-danger-hover`},Re={sm:`h-8 px-2.5 text-sm gap-1.5`,md:`h-9 px-3.5 text-sm gap-2`};function X(e=`secondary`,t=`md`,n){return G(`tap inline-flex items-center justify-center rounded-md border font-medium whitespace-nowrap select-none`,`transition-colors disabled:opacity-55 disabled:pointer-events-none`,Le[e],Re[t],n)}var Z=(0,a.forwardRef)(function({variant:e=`secondary`,size:t=`md`,icon:n,busy:r,block:i,className:a,children:o,disabled:s,type:c,...ee},l){return(0,Y.jsxs)(`button`,{ref:l,type:c??`button`,disabled:s||r,"aria-busy":r||void 0,className:X(e,t,G(i&&`w-full`,a)),...ee,children:[r?(0,Y.jsx)(Q,{}):n,o]})});function Q({className:e,label:t}){return(0,Y.jsxs)(`svg`,{className:G(`size-4 animate-spin`,e),viewBox:`0 0 24 24`,fill:`none`,role:t?`img`:void 0,"aria-label":t,"aria-hidden":!t||void 0,children:[(0,Y.jsx)(`circle`,{cx:`12`,cy:`12`,r:`9`,stroke:`currentColor`,strokeOpacity:`0.25`,strokeWidth:`3`}),(0,Y.jsx)(`path`,{d:`M21 12a9 9 0 0 0-9-9`,stroke:`currentColor`,strokeWidth:`3`,strokeLinecap:`round`})]})}function ze({action:e,primary:n=!0}){return`to`in e?(0,Y.jsxs)(t,{to:e.to,className:X(n?`primary`:`secondary`),children:[e.icon,e.label]}):(0,Y.jsx)(Z,{variant:n?`primary`:`secondary`,icon:e.icon,onClick:e.onClick,children:e.label})}function $({icon:e,title:t,children:n,actions:r,className:i,role:a}){return(0,Y.jsxs)(`div`,{role:a,className:G(`mx-auto flex w-full max-w-md flex-col items-center gap-3 px-4 py-10 text-center`,i),children:[(0,Y.jsx)(`div`,{className:`text-muted`,"aria-hidden":!0,children:e}),(0,Y.jsx)(`h2`,{className:`text-base font-semibold`,children:t}),n&&(0,Y.jsx)(`div`,{className:`text-sm text-muted`,children:n}),r&&(0,Y.jsx)(`div`,{className:`flex flex-wrap justify-center gap-2`,children:r})]})}function Be({label:e=`Loading…`,className:t}){return(0,Y.jsxs)(`div`,{role:`status`,"aria-live":`polite`,className:G(`flex items-center justify-center gap-2 px-4 py-10 text-sm text-muted`,t),children:[(0,Y.jsx)(Q,{}),(0,Y.jsx)(`span`,{children:e})]})}function Ve({title:e,description:t,action:n,secondaryAction:r,icon:i,className:a}){return(0,Y.jsx)($,{icon:i??(0,Y.jsx)(P,{className:`size-8`}),title:e,className:a,actions:(n||r)&&(0,Y.jsxs)(Y.Fragment,{children:[n&&(0,Y.jsx)(ze,{action:n}),r&&(0,Y.jsx)(ze,{action:r,primary:!1})]}),children:t})}function He({state:e,lastSyncedAt:t,onRetry:n,className:r}){if(e===`live`||e===`connecting`&&!t)return null;let i=e===`offline`,a=t?J(t):`an earlier session`;return(0,Y.jsxs)(`div`,{role:`status`,"aria-live":`polite`,className:G(`flex items-center gap-2 border-b border-border bg-warning-soft px-3 py-1.5 text-sm text-text`,r),children:[i?(0,Y.jsx)(H,{"aria-hidden":!0,className:`size-4 shrink-0 text-warning`}):(0,Y.jsx)(B,{"aria-hidden":!0,className:`size-4 shrink-0 animate-spin text-warning`}),(0,Y.jsxs)(`span`,{className:`min-w-0 flex-1`,children:[i?`Offline`:`Reconnecting…`,` showing last known data from`,` `,(0,Y.jsx)(`time`,{dateTime:t??void 0,children:a})]}),n&&(0,Y.jsx)(`button`,{type:`button`,onClick:n,className:`tap shrink-0 rounded px-2 py-0.5 font-medium text-accent hover:bg-surface-2`,children:`Retry now`})]})}function Ue({hostName:e,connectivity:t=`unreachable`,lastSeenAt:n,detail:r,compact:i,className:a}){let o=t===`reconnecting`?`Host ${e} is reconnecting`:`Host ${e} is unreachable`,s=(0,Y.jsxs)(Y.Fragment,{children:[n?`Last seen ${q(n)}. `:``,r??`Work on this host keeps its last known state; nothing is restarted elsewhere.`]});return i?(0,Y.jsxs)(`div`,{role:`status`,className:G(`flex items-start gap-2 rounded-md border border-border bg-danger-soft px-3 py-2 text-sm`,a),children:[(0,Y.jsx)(H,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-danger`}),(0,Y.jsxs)(`div`,{className:`min-w-0`,children:[(0,Y.jsx)(`div`,{className:`font-medium`,children:o}),(0,Y.jsx)(`div`,{className:`text-muted`,children:s})]})]}):(0,Y.jsx)($,{role:`status`,icon:(0,Y.jsx)(H,{className:`size-8`}),title:o,className:a,children:s})}function We({count:e,to:n,onOpen:r,label:i,className:a}){if(e<=0)return null;let o=i??(e===1?`Needs your answer`:`${e} questions need your answer`),s=(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(I,{"aria-hidden":!0,className:`size-4 shrink-0 text-warning`}),(0,Y.jsx)(`span`,{className:`min-w-0 flex-1 truncate font-medium`,children:o}),(0,Y.jsx)(`span`,{className:`shrink-0 text-accent`,children:`Answer`})]}),c=G(`tap flex w-full items-center gap-2 border border-border bg-warning-soft px-3 py-2 text-left text-sm rounded-md`,a);return n?(0,Y.jsx)(t,{to:n,className:c,role:`status`,children:s}):(0,Y.jsx)(`button`,{type:`button`,onClick:r,className:c,children:s})}function Ge({capability:e,reason:t,fallback:n,className:r}){return(0,Y.jsxs)(`div`,{role:`note`,className:G(`flex items-start gap-2 rounded-md border border-border bg-surface-2 px-3 py-2 text-sm`,r),children:[(0,Y.jsx)(R,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-muted`}),(0,Y.jsxs)(`div`,{className:`min-w-0`,children:[(0,Y.jsxs)(`div`,{className:`font-medium`,children:[e,` is not available here`]}),(0,Y.jsx)(`div`,{className:`text-muted`,children:t}),n&&(0,Y.jsx)(`div`,{className:`mt-1`,children:n})]})]})}function Ke({title:e=`Something went wrong`,error:t,onRetry:n,compact:r,className:i}){let a=t instanceof Error?t.message:String(t??``);return r?(0,Y.jsxs)(`div`,{role:`alert`,className:G(`flex items-start gap-2 rounded-md border border-border bg-danger-soft px-3 py-2 text-sm`,i),children:[(0,Y.jsx)(W,{"aria-hidden":!0,className:`mt-0.5 size-4 shrink-0 text-danger`}),(0,Y.jsxs)(`div`,{className:`min-w-0 flex-1`,children:[(0,Y.jsx)(`div`,{className:`font-medium`,children:e}),a&&(0,Y.jsx)(`div`,{className:`break-words text-muted`,children:a})]}),n&&(0,Y.jsx)(Z,{size:`sm`,onClick:n,icon:(0,Y.jsx)(B,{className:`size-3.5`}),children:`Retry`})]}):(0,Y.jsx)($,{role:`alert`,icon:(0,Y.jsx)(W,{className:`size-8 text-danger`}),title:e,className:i,actions:n&&(0,Y.jsx)(Z,{variant:`primary`,onClick:n,icon:(0,Y.jsx)(B,{className:`size-4`}),children:`Retry`}),children:(0,Y.jsx)(`span`,{className:`break-words`,children:a})})}function qe({title:e=`Switchyard cannot show this view`,error:t,diagnosticsHref:n=`/settings/diagnostics`,className:r}){let i=t instanceof Error?t.message:String(t??``);return(0,Y.jsx)($,{role:`alert`,icon:(0,Y.jsx)(M,{className:`size-8 text-danger`}),title:e,className:r,actions:(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`a`,{href:n,className:X(`primary`),children:`Open diagnostics`}),(0,Y.jsx)(Z,{onClick:()=>location.reload(),children:`Reload`})]}),children:(0,Y.jsx)(`span`,{className:`break-words`,children:i})})}export{Ee as A,se as B,_e as C,Oe as D,De as E,Te as F,te as G,oe as H,Fe as I,ne as K,de as L,we as M,Ne as N,Me as O,O as P,d as R,A as S,Ce as T,ae as U,h as V,f as W,B as _,We as a,P as b,Ge as c,X as d,Ie as f,W as g,G as h,Ue as i,je as j,Ae as k,Z as l,J as m,Ke as n,Be as o,q as p,u as q,qe as r,He as s,Ve as t,Q as u,R as v,ke as w,M as x,I as y,m as z};
|
|
2
|
-
//# sourceMappingURL=states-DrTQuYXw.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"states-DrTQuYXw.js","names":["useMemo","__iconData","__iconData","__iconData","__iconData","__iconData","__iconData","forwardRef","_Fragment","MessageCircleQuestion","__toESM","Link","require_react","createLucideIcon","require_jsx_runtime","import_react","createStoreImpl","state","listeners","setState","nextState","partial","previousState","replace","listener","getState","api","initialState","createState","createStore","identity","arg","useStore","slice","selector","createImpl","useBoundStore","create","ApiClientError","message","code","status","details","isApiError","errorMessage","unauthorizedListeners","onUnauthorized","fn","buildUrl","query","path","params","k","v","qs","method","opts","headers","body","res","text","json","err","parseErrorBody","e","apiGet","apiPost","apiPatch","apiDelete","LIVE_RUNTIMES","panelKey","sessionId","adapterId","slot","keepPanel","p","emptyEntities","emptySyncData","emptyTranscript","byId","out","x","list","put","map","id","value","drop","next","applySnapshot","panels","snap","transcripts","t","a","toSyncState","mergeTranscriptItems","incoming","existing","it","b","applyTranscriptPage","prev","base","items","upsertTranscriptItem","item","streaming","applyEvent","event","reduceEvent","applyEvents","s","events","type","d","data","clearSessionStreams","key","occurrences","o","applyStream","delta","field","changed","normalizePage","limit","inflight","useSyncStore","get","set","seq","savedAt","patch","interaction","setTranscript","page","before","syncStore","sortAttention","attention","countAttention","n","pendingInteractionsFor","interactions","i","runsForTask","runs","r","taskId","panelsForSession","streamsForSession","useConnection","useSession","useTask","useProjects","projects","useHosts","hosts","h","useOpenAttention","useAttentionCount","usePendingInteractions","useRunsForTask","usePanels","useStreams","EMPTY_TRANSCRIPT","useTranscript","load","needsLoad","__iconData$6","CircleAlert","__iconData$5","Inbox","__iconData$4","MessageCircleQuestionMark","__iconData$3","Puzzle","__iconData$2","RefreshCw","__iconData$1","ServerOff","__iconData","TriangleAlert","cn","parts","rtf","formatRelative","iso","diff","now","abs","formatTime","formatDuration","ms","m","import_jsx_runtime","VARIANTS","SIZES","buttonClasses","variant","size","extra","Button","rest","disabled","busy","block","className","Spinner","icon","children","label","ActionButton","action","primary","Panel","title","actions","LoadingState","EmptyState","secondaryAction","description","ReconnectingBanner","lastSyncedAt","offline","when","onRetry","HostUnavailable","connectivity","hostName","lastSeenAt","detail","compact","InteractionPending","count","inner","cls","to","onOpen","UnsupportedCapability","capability","reason","fallback","ErrorState","error","FatalError","diagnosticsHref"],"sources":["../../../../node_modules/.pnpm/zustand@5.0.16_@types+react@19.3.0_react@19.3.1/node_modules/zustand/esm/vanilla.mjs","../../../../node_modules/.pnpm/zustand@5.0.16_@types+react@19.3.0_react@19.3.1/node_modules/zustand/esm/react.mjs","../../src/sync/api.ts","../../src/sync/reduce.ts","../../src/sync/store.ts","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/circle-alert.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/inbox.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/message-circle-question-mark.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/puzzle.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/refresh-cw.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/server-off.mjs","../../../../node_modules/.pnpm/lucide-react@1.61.0_@types+react@19.3.0_react@19.3.1/node_modules/lucide-react/dist/esm/icons/triangle-alert.mjs","../../src/lib/cn.ts","../../src/lib/time.ts","../../src/components/ui/Button.tsx","../../src/components/ui/states.tsx"],"sourcesContent":["const createStoreImpl = (createState) => {\n let state;\n const listeners = /* @__PURE__ */ new Set();\n const setState = (partial, replace) => {\n const nextState = typeof partial === \"function\" ? partial(state) : partial;\n if (!Object.is(nextState, state)) {\n const previousState = state;\n state = (replace != null ? replace : typeof nextState !== \"object\" || nextState === null) ? nextState : Object.assign({}, state, nextState);\n listeners.forEach((listener) => listener(state, previousState));\n }\n };\n const getState = () => state;\n const getInitialState = () => initialState;\n const subscribe = (listener) => {\n listeners.add(listener);\n return () => listeners.delete(listener);\n };\n const api = { setState, getState, getInitialState, subscribe };\n const initialState = state = createState(setState, getState, api);\n return api;\n};\nconst createStore = ((createState) => createState ? createStoreImpl(createState) : createStoreImpl);\n\nexport { createStore };\n","import React from 'react';\nimport { createStore } from 'zustand/vanilla';\n\nconst identity = (arg) => arg;\nfunction useStore(api, selector = identity) {\n const slice = React.useSyncExternalStore(\n api.subscribe,\n React.useCallback(() => selector(api.getState()), [api, selector]),\n () => selector(api.getInitialState())\n );\n React.useDebugValue(slice);\n return slice;\n}\nconst createImpl = (createState) => {\n const api = createStore(createState);\n const useBoundStore = (selector) => useStore(api, selector);\n Object.assign(useBoundStore, api);\n return useBoundStore;\n};\nconst create = ((createState) => createState ? createImpl(createState) : createImpl);\n\nexport { create, useStore };\n","import type { ErrorCode } from \"@switchyard/protocol\";\n\n/** Client-side error codes in addition to the protocol's shared codes. */\nexport type ApiClientErrorCode = ErrorCode | \"network\" | \"http\";\n\n/** Every failed REST call rejects with this. `code` is the protocol `ApiError` code. */\nexport class ApiClientError extends Error {\n readonly code: ApiClientErrorCode;\n readonly status: number;\n readonly details?: unknown;\n constructor(code: ApiClientErrorCode, message: string, status: number, details?: unknown) {\n super(message);\n this.name = \"ApiClientError\";\n this.code = code;\n this.status = status;\n this.details = details;\n }\n}\n\nexport function isApiError(e: unknown, code?: ApiClientErrorCode): e is ApiClientError {\n return e instanceof ApiClientError && (code === undefined || e.code === code);\n}\n\n/** Human-readable message for any thrown value. */\nexport function errorMessage(e: unknown): string {\n if (e instanceof Error) return e.message;\n return String(e);\n}\n\ntype Query = Record<string, string | number | boolean | null | undefined>;\n\nexport interface RequestOptions {\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n body?: unknown;\n query?: Query;\n signal?: AbortSignal;\n headers?: Record<string, string>;\n}\n\ntype UnauthorizedListener = (code: ApiClientErrorCode) => void;\nconst unauthorizedListeners = new Set<UnauthorizedListener>();\n\n/** Called when any request comes back 401 (the auth gate redirects to /enroll). */\nexport function onUnauthorized(fn: UnauthorizedListener): () => void {\n unauthorizedListeners.add(fn);\n return () => unauthorizedListeners.delete(fn);\n}\n\nexport function buildUrl(path: string, query?: Query): string {\n if (!query) return path;\n const params = new URLSearchParams();\n for (const [k, v] of Object.entries(query)) {\n if (v === undefined || v === null) continue;\n params.set(k, String(v));\n }\n const qs = params.toString();\n return qs ? `${path}${path.includes(\"?\") ? \"&\" : \"?\"}${qs}` : path;\n}\n\n/**\n * fetch wrapper for the coordinator REST API. Sends cookies, the CSRF header\n * `X-Switchyard-Request: 1`, and JSON bodies; maps `ApiError` bodies to\n * `ApiClientError`.\n */\nexport async function api<T = unknown>(path: string, opts: RequestOptions = {}): Promise<T> {\n const method = opts.method ?? (opts.body === undefined ? \"GET\" : \"POST\");\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"X-Switchyard-Request\": \"1\",\n ...opts.headers,\n };\n let body: string | undefined;\n if (opts.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(opts.body);\n }\n let res: Response;\n try {\n res = await fetch(buildUrl(path, opts.query), {\n method,\n headers,\n body,\n credentials: \"include\",\n signal: opts.signal,\n });\n } catch (e) {\n if (e instanceof DOMException && e.name === \"AbortError\") throw e;\n throw new ApiClientError(\"network\", \"Could not reach the coordinator\", 0);\n }\n const text = await res.text();\n let json: unknown;\n if (text) {\n try {\n json = JSON.parse(text);\n } catch {\n json = undefined;\n }\n }\n if (!res.ok) {\n const err = parseErrorBody(json);\n const e = err\n ? new ApiClientError(err.code, err.message, res.status, err.details)\n : new ApiClientError(\n res.status === 401 ? \"unauthorized\" : \"http\",\n `Request failed (${res.status}${res.statusText ? ` ${res.statusText}` : \"\"})`,\n res.status,\n );\n if (res.status === 401) for (const fn of unauthorizedListeners) fn(e.code);\n throw e;\n }\n return json as T;\n}\n\nfunction parseErrorBody(\n json: unknown,\n): { code: ErrorCode; message: string; details?: unknown } | null {\n if (!json || typeof json !== \"object\") return null;\n const err = (json as { error?: unknown }).error;\n if (!err || typeof err !== \"object\") return null;\n const { code, message, details } = err as {\n code?: unknown;\n message?: unknown;\n details?: unknown;\n };\n if (typeof code !== \"string\") return null;\n return {\n code: code as ErrorCode,\n message: typeof message === \"string\" ? message : code,\n details,\n };\n}\n\nexport const apiGet = <T>(path: string, query?: Query, signal?: AbortSignal) =>\n api<T>(path, { method: \"GET\", query, signal });\nexport const apiPost = <T>(path: string, body?: unknown) =>\n api<T>(path, { method: \"POST\", body: body ?? {} });\nexport const apiPatch = <T>(path: string, body: unknown) => api<T>(path, { method: \"PATCH\", body });\nexport const apiPut = <T>(path: string, body: unknown) => api<T>(path, { method: \"PUT\", body });\nexport const apiDelete = <T>(path: string, body?: unknown) =>\n api<T>(path, { method: \"DELETE\", body });\n","import type {\n AdapterInfo,\n AttentionItem,\n Automation,\n Checkout,\n Device,\n Diagnostic,\n EventData,\n EventEnvelope,\n EventType,\n Host,\n Interaction,\n Occurrence,\n Panel,\n Profile,\n Project,\n Run,\n Session,\n StreamDelta,\n SyncState,\n Task,\n TranscriptItem,\n Workspace,\n} from \"@switchyard/protocol\";\n\n/**\n * Pure reducers for the normalized client state. The zustand store in\n * `store.ts` wraps these; tests exercise them directly.\n */\n\nexport type ById<T> = Record<string, T>;\n\nexport interface EntityState {\n /** Last applied durable event seq (the WS cursor), null before any sync. */\n seq: number | null;\n hosts: ById<Host>;\n projects: ById<Project>;\n checkouts: ById<Checkout>;\n workspaces: ById<Workspace>;\n profiles: ById<Profile>;\n sessions: ById<Session>;\n tasks: ById<Task>;\n runs: ById<Run>;\n automations: ById<Automation>;\n /** Open (unresolved) attention items. Resolved items are dropped. */\n attention: ById<AttentionItem>;\n /** Interactions of any state, so resolution summaries stay visible inline. */\n interactions: ById<Interaction>;\n /** Keyed by `panelKey(sessionId, adapterId, slot)`. */\n panels: ById<Panel>;\n devices: ById<Device>;\n /** Adapters per host id. */\n adapters: Record<string, AdapterInfo[]>;\n /** Occurrences seen live (newest first) per automation id; history loads over REST. */\n occurrences: Record<string, Occurrence[]>;\n /** The latest diagnostics, newest last, bounded. */\n diagnostics: Diagnostic[];\n dispatchPaused: boolean;\n}\n\nexport interface TranscriptState {\n /** Items sorted by `order` ascending, unique by id. */\n items: TranscriptItem[];\n /** True once the newest page has been fetched over REST. */\n loaded: boolean;\n loading: boolean;\n /** Whether older items exist before `items[0]`. */\n hasMore: boolean;\n /** Set after a snapshot resync; the next view reloads the newest page. */\n stale: boolean;\n error: string | null;\n}\n\nexport interface StreamBuffer {\n sessionId: string;\n itemId: string;\n order: number | null;\n text: string;\n thinking: string;\n toolArgs: string;\n toolOutput: string;\n}\n\nexport interface SyncData extends EntityState {\n transcripts: Record<string, TranscriptState>;\n /** Ephemeral stream deltas keyed by item id, appended to the durable item text. */\n streaming: Record<string, StreamBuffer>;\n}\n\nexport const MAX_DIAGNOSTICS = 100;\nconst LIVE_RUNTIMES = new Set<string>([\"starting\", \"running\", \"waiting_input\"]);\nexport const MAX_OCCURRENCES_PER_AUTOMATION = 50;\n\nexport function panelKey(sessionId: string, adapterId: string, slot: string): string {\n return `${sessionId}:${adapterId}:${slot}`;\n}\n\n/** A panel with no node and no web renderer has been removed by its adapter. */\nfunction keepPanel(p: Panel): boolean {\n return p.node !== null || p.webRenderer;\n}\n\nexport function emptyEntities(): EntityState {\n return {\n seq: null,\n hosts: {},\n projects: {},\n checkouts: {},\n workspaces: {},\n profiles: {},\n sessions: {},\n tasks: {},\n runs: {},\n automations: {},\n attention: {},\n interactions: {},\n panels: {},\n devices: {},\n adapters: {},\n occurrences: {},\n diagnostics: [],\n dispatchPaused: false,\n };\n}\n\nexport function emptySyncData(): SyncData {\n return { ...emptyEntities(), transcripts: {}, streaming: {} };\n}\n\nexport function emptyTranscript(): TranscriptState {\n return { items: [], loaded: false, loading: false, hasMore: false, stale: false, error: null };\n}\n\nfunction byId<T extends { id: string }>(list: T[]): ById<T> {\n const out: ById<T> = {};\n for (const x of list) out[x.id] = x;\n return out;\n}\n\nfunction put<T>(map: ById<T>, id: string, value: T): ById<T> {\n return { ...map, [id]: value };\n}\n\nfunction drop<T>(map: ById<T>, id: string): ById<T> {\n if (!(id in map)) return map;\n const next = { ...map };\n delete next[id];\n return next;\n}\n\n/** Replace every entity with a server snapshot. Loaded transcripts are kept but marked stale. */\nexport function applySnapshot<S extends SyncData>(state: S, seq: number, snap: SyncState): S {\n const panels: ById<Panel> = {};\n for (const p of snap.panels)\n if (keepPanel(p)) panels[panelKey(p.sessionId, p.adapterId, p.slot)] = p;\n const transcripts: Record<string, TranscriptState> = {};\n for (const [id, t] of Object.entries(state.transcripts)) transcripts[id] = { ...t, stale: true };\n return {\n ...state,\n seq,\n hosts: byId(snap.hosts),\n projects: byId(snap.projects),\n checkouts: byId(snap.checkouts),\n workspaces: byId(snap.workspaces),\n profiles: byId(snap.profiles),\n sessions: byId(snap.sessions),\n tasks: byId(snap.tasks),\n runs: byId(snap.runs),\n automations: byId(snap.automations),\n attention: byId(snap.attention.filter((a) => a.resolvedAt === null)),\n interactions: byId(snap.interactions),\n panels,\n devices: byId(snap.devices),\n adapters: { ...snap.adapters },\n dispatchPaused: snap.dispatchPaused,\n transcripts,\n streaming: {},\n };\n}\n\n/** Rebuild a SyncState from the entities (used for the offline cache). */\nexport function toSyncState(state: EntityState): SyncState {\n return {\n hosts: Object.values(state.hosts),\n projects: Object.values(state.projects),\n checkouts: Object.values(state.checkouts),\n workspaces: Object.values(state.workspaces),\n profiles: Object.values(state.profiles),\n sessions: Object.values(state.sessions),\n tasks: Object.values(state.tasks),\n runs: Object.values(state.runs),\n automations: Object.values(state.automations),\n attention: Object.values(state.attention),\n interactions: Object.values(state.interactions),\n panels: Object.values(state.panels),\n devices: Object.values(state.devices),\n adapters: state.adapters,\n dispatchPaused: state.dispatchPaused,\n };\n}\n\n/** Insert or replace transcript items by id, keeping `order` ascending. */\nexport function mergeTranscriptItems(\n existing: TranscriptItem[],\n incoming: TranscriptItem[],\n): TranscriptItem[] {\n if (incoming.length === 0) return existing;\n const map = new Map<string, TranscriptItem>();\n for (const it of existing) map.set(it.id, it);\n for (const it of incoming) map.set(it.id, it);\n return [...map.values()].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id));\n}\n\n/** Merge a fetched page into a session transcript. `older` pages only set `hasMore`. */\nexport function applyTranscriptPage<S extends SyncData>(\n state: S,\n sessionId: string,\n items: TranscriptItem[],\n opts: { hasMore: boolean; older: boolean },\n): S {\n const prev = state.transcripts[sessionId] ?? emptyTranscript();\n // A fresh newest page after a resync replaces items, so nothing stale lingers.\n const base = !opts.older && prev.stale ? [] : prev.items;\n const next: TranscriptState = {\n ...prev,\n items: mergeTranscriptItems(base, items),\n loaded: true,\n loading: false,\n stale: opts.older ? prev.stale : false,\n error: null,\n hasMore: opts.older || !prev.loaded || prev.stale ? opts.hasMore : prev.hasMore,\n };\n return { ...state, transcripts: { ...state.transcripts, [sessionId]: next } };\n}\n\nfunction upsertTranscriptItem<S extends SyncData>(state: S, item: TranscriptItem): S {\n const prev = state.transcripts[item.sessionId] ?? emptyTranscript();\n const transcripts = {\n ...state.transcripts,\n [item.sessionId]: { ...prev, items: mergeTranscriptItems(prev.items, [item]) },\n };\n // The durable item is authoritative up to now: drop any buffered deltas for it.\n const streaming = drop(state.streaming, item.id);\n return { ...state, transcripts, streaming };\n}\n\n/**\n * Apply one durable event. Events at or below the current cursor are ignored\n * (replay and live delivery may overlap).\n */\nexport function applyEvent<S extends SyncData>(state: S, event: EventEnvelope): S {\n if (state.seq !== null && event.seq <= state.seq) return state;\n const next = reduceEvent(state, event.type, event.data as never);\n return { ...next, seq: event.seq };\n}\n\nexport function applyEvents<S extends SyncData>(state: S, events: EventEnvelope[]): S {\n let s = state;\n for (const e of [...events].sort((a, b) => a.seq - b.seq)) s = applyEvent(s, e);\n return s;\n}\n\nfunction reduceEvent<S extends SyncData, T extends EventType>(\n state: S,\n type: T,\n data: EventData<T>,\n): S {\n switch (type) {\n case \"host.updated\": {\n const d = data as EventData<\"host.updated\">;\n return { ...state, hosts: put(state.hosts, d.id, d) };\n }\n case \"project.updated\": {\n const d = data as EventData<\"project.updated\">;\n return { ...state, projects: put(state.projects, d.id, d) };\n }\n case \"project.deleted\": {\n const d = data as EventData<\"project.deleted\">;\n return { ...state, projects: drop(state.projects, d.id) };\n }\n case \"checkout.updated\": {\n const d = data as EventData<\"checkout.updated\">;\n return { ...state, checkouts: put(state.checkouts, d.id, d) };\n }\n case \"workspace.updated\": {\n const d = data as EventData<\"workspace.updated\">;\n return {\n ...state,\n workspaces: d.archivedAt ? drop(state.workspaces, d.id) : put(state.workspaces, d.id, d),\n };\n }\n case \"workspace.removed\": {\n const d = data as EventData<\"workspace.removed\">;\n return { ...state, workspaces: drop(state.workspaces, d.id) };\n }\n case \"profile.updated\": {\n const d = data as EventData<\"profile.updated\">;\n return { ...state, profiles: put(state.profiles, d.id, d) };\n }\n case \"session.updated\": {\n const d = data as EventData<\"session.updated\">;\n const next = { ...state, sessions: put(state.sessions, d.id, d) };\n return LIVE_RUNTIMES.has(d.runtime) ? next : clearSessionStreams(next, d.id);\n }\n case \"transcript.item\":\n return upsertTranscriptItem(state, data as EventData<\"transcript.item\">);\n case \"interaction.updated\": {\n const d = data as EventData<\"interaction.updated\">;\n const prev = state.interactions[d.id];\n if (prev && prev.revision > d.revision) return state;\n return { ...state, interactions: put(state.interactions, d.id, d) };\n }\n case \"panel.updated\": {\n const d = data as EventData<\"panel.updated\">;\n const key = panelKey(d.sessionId, d.adapterId, d.slot);\n return {\n ...state,\n panels: keepPanel(d) ? put(state.panels, key, d) : drop(state.panels, key),\n };\n }\n case \"adapters.updated\": {\n const d = data as EventData<\"adapters.updated\">;\n return { ...state, adapters: { ...state.adapters, [d.hostId]: d.adapters } };\n }\n case \"diagnostic\": {\n const d = data as EventData<\"diagnostic\">;\n return { ...state, diagnostics: [...state.diagnostics, d].slice(-MAX_DIAGNOSTICS) };\n }\n case \"task.updated\": {\n const d = data as EventData<\"task.updated\">;\n return { ...state, tasks: put(state.tasks, d.id, d) };\n }\n case \"task.deleted\": {\n const d = data as EventData<\"task.deleted\">;\n return { ...state, tasks: drop(state.tasks, d.id) };\n }\n case \"run.updated\": {\n const d = data as EventData<\"run.updated\">;\n return { ...state, runs: put(state.runs, d.id, d) };\n }\n case \"automation.updated\": {\n const d = data as EventData<\"automation.updated\">;\n return { ...state, automations: put(state.automations, d.id, d) };\n }\n case \"automation.deleted\": {\n const d = data as EventData<\"automation.deleted\">;\n const occurrences = { ...state.occurrences };\n delete occurrences[d.id];\n return { ...state, automations: drop(state.automations, d.id), occurrences };\n }\n case \"occurrence.created\": {\n const d = data as EventData<\"occurrence.created\">;\n const list = (state.occurrences[d.automationId] ?? []).filter((o) => o.id !== d.id);\n return {\n ...state,\n occurrences: {\n ...state.occurrences,\n [d.automationId]: [d, ...list].slice(0, MAX_OCCURRENCES_PER_AUTOMATION),\n },\n };\n }\n case \"attention.updated\": {\n const d = data as EventData<\"attention.updated\">;\n return {\n ...state,\n attention: d.resolvedAt ? drop(state.attention, d.id) : put(state.attention, d.id, d),\n };\n }\n case \"device.updated\": {\n const d = data as EventData<\"device.updated\">;\n return {\n ...state,\n devices: d.revokedAt ? drop(state.devices, d.id) : put(state.devices, d.id, d),\n };\n }\n case \"settings.updated\": {\n const d = data as EventData<\"settings.updated\">;\n return { ...state, dispatchPaused: d.dispatchPaused };\n }\n default:\n return state;\n }\n}\n\n/** Append an ephemeral stream delta to the per-item buffer. */\nexport function applyStream<S extends SyncData>(state: S, delta: StreamDelta): S {\n const prev: StreamBuffer = state.streaming[delta.itemId] ?? {\n sessionId: delta.sessionId,\n itemId: delta.itemId,\n order: delta.order ?? null,\n text: \"\",\n thinking: \"\",\n toolArgs: \"\",\n toolOutput: \"\",\n };\n const field =\n delta.kind === \"text\"\n ? \"text\"\n : delta.kind === \"thinking\"\n ? \"thinking\"\n : delta.kind === \"tool_args\"\n ? \"toolArgs\"\n : \"toolOutput\";\n const next: StreamBuffer = {\n ...prev,\n order: prev.order ?? delta.order ?? null,\n [field]: prev[field] + delta.delta,\n };\n return { ...state, streaming: { ...state.streaming, [delta.itemId]: next } };\n}\n\n/** Drop all stream buffers of a session (for example when it settles). */\nexport function clearSessionStreams<S extends SyncData>(state: S, sessionId: string): S {\n const streaming: Record<string, StreamBuffer> = {};\n let changed = false;\n for (const [id, b] of Object.entries(state.streaming)) {\n if (b.sessionId === sessionId) changed = true;\n else streaming[id] = b;\n }\n return changed ? { ...state, streaming } : state;\n}\n","import type {\n AttentionItem,\n EventEnvelope,\n Interaction,\n Panel,\n Run,\n Session,\n StreamDelta,\n SyncState,\n Task,\n TaskState,\n TranscriptItem,\n} from \"@switchyard/protocol\";\nimport { useEffect, useMemo } from \"react\";\nimport { create } from \"zustand\";\nimport { apiGet, errorMessage } from \"./api\";\nimport {\n applyEvent,\n applyEvents,\n applySnapshot,\n applyStream,\n applyTranscriptPage,\n emptySyncData,\n emptyTranscript,\n type StreamBuffer,\n type SyncData,\n type TranscriptState,\n} from \"./reduce\";\n\nexport type { StreamBuffer, SyncData, TranscriptState } from \"./reduce\";\nexport { panelKey } from \"./reduce\";\n\nexport type ConnectionState = \"connecting\" | \"live\" | \"reconnecting\" | \"offline\";\n\nexport interface ConnectionInfo {\n state: ConnectionState;\n /** When the client last received data from the coordinator (ISO). */\n lastSyncedAt: string | null;\n /** Consecutive failed connection attempts. */\n attempts: number;\n}\n\nexport interface SyncStore extends SyncData {\n /** Some data is present (from the offline cache or the server). */\n hydrated: boolean;\n /** Server data was received during this page load. */\n synced: boolean;\n connection: ConnectionInfo;\n\n hydrateFromCache(seq: number, state: SyncState, savedAt: string): void;\n applySnapshot(seq: number, state: SyncState): void;\n applyReplay(seq: number, events: EventEnvelope[]): void;\n applyEvent(event: EventEnvelope): void;\n applyStream(delta: StreamDelta): void;\n setConnection(patch: Partial<ConnectionInfo>): void;\n /** Store an interaction returned by a REST acknowledgement (answer, 409 already_answered). */\n upsertInteraction(interaction: Interaction): void;\n /** Fetch the newest transcript page (or reload it after a resync). */\n loadTranscript(sessionId: string, opts?: { force?: boolean }): Promise<void>;\n /** Fetch the page before the oldest loaded item. */\n loadOlderTranscript(sessionId: string): Promise<void>;\n /** Clear all data (logout). */\n reset(): void;\n}\n\nexport const TRANSCRIPT_PAGE = 200;\n\ninterface TranscriptPage {\n items: TranscriptItem[];\n hasMore?: boolean;\n}\n\nfunction normalizePage(res: TranscriptPage | TranscriptItem[], limit: number): TranscriptPage {\n const items = Array.isArray(res) ? res : (res.items ?? []);\n const hasMore = Array.isArray(res) ? undefined : res.hasMore;\n return { items, hasMore: hasMore ?? items.length >= limit };\n}\n\nconst inflight = new Map<string, Promise<void>>();\n\nexport const useSyncStore = create<SyncStore>()((set, get) => ({\n ...emptySyncData(),\n hydrated: false,\n synced: false,\n connection: { state: \"connecting\", lastSyncedAt: null, attempts: 0 },\n\n hydrateFromCache(seq, state, savedAt) {\n if (get().synced) return;\n set((s) => ({\n ...applySnapshot(s, seq, state),\n hydrated: true,\n connection: { ...s.connection, lastSyncedAt: s.connection.lastSyncedAt ?? savedAt },\n }));\n },\n applySnapshot(seq, state) {\n set((s) => ({\n ...applySnapshot(s, seq, state),\n hydrated: true,\n synced: true,\n connection: { ...s.connection, lastSyncedAt: new Date().toISOString() },\n }));\n },\n applyReplay(seq, events) {\n set((s) => {\n const next = applyEvents(s, events);\n return {\n ...next,\n seq: Math.max(next.seq ?? 0, seq),\n hydrated: true,\n synced: true,\n connection: { ...s.connection, lastSyncedAt: new Date().toISOString() },\n };\n });\n },\n applyEvent(event) {\n set((s) => ({\n ...applyEvent(s, event),\n connection: { ...s.connection, lastSyncedAt: new Date().toISOString() },\n }));\n },\n applyStream(delta) {\n set((s) => applyStream(s, delta));\n },\n setConnection(patch) {\n set((s) => ({ connection: { ...s.connection, ...patch } }));\n },\n upsertInteraction(interaction) {\n set((s) => {\n const prev = s.interactions[interaction.id];\n if (prev && prev.revision > interaction.revision) return {};\n return { interactions: { ...s.interactions, [interaction.id]: interaction } };\n });\n },\n loadTranscript(sessionId, opts) {\n const t = get().transcripts[sessionId];\n if (t?.loaded && !t.stale && !opts?.force) return Promise.resolve();\n const key = `${sessionId}:newest`;\n const existing = inflight.get(key);\n if (existing) return existing;\n setTranscript(set, sessionId, { loading: true, error: null });\n const p = apiGet<TranscriptPage | TranscriptItem[]>(\n `/api/sessions/${encodeURIComponent(sessionId)}/transcript`,\n { limit: TRANSCRIPT_PAGE },\n )\n .then((res) => {\n const page = normalizePage(res, TRANSCRIPT_PAGE);\n set((s) =>\n applyTranscriptPage(s, sessionId, page.items, {\n hasMore: page.hasMore ?? false,\n older: false,\n }),\n );\n })\n .catch((e) => setTranscript(set, sessionId, { loading: false, error: errorMessage(e) }))\n .finally(() => inflight.delete(key));\n inflight.set(key, p);\n return p;\n },\n loadOlderTranscript(sessionId) {\n const t = get().transcripts[sessionId];\n if (!t?.loaded || !t.hasMore || t.items.length === 0) return Promise.resolve();\n const before = t.items[0]!.order;\n const key = `${sessionId}:before:${before}`;\n const existing = inflight.get(key);\n if (existing) return existing;\n setTranscript(set, sessionId, { loading: true, error: null });\n const p = apiGet<TranscriptPage | TranscriptItem[]>(\n `/api/sessions/${encodeURIComponent(sessionId)}/transcript`,\n { before, limit: TRANSCRIPT_PAGE },\n )\n .then((res) => {\n const page = normalizePage(res, TRANSCRIPT_PAGE);\n set((s) =>\n applyTranscriptPage(s, sessionId, page.items, {\n hasMore: page.hasMore ?? false,\n older: true,\n }),\n );\n })\n .catch((e) => setTranscript(set, sessionId, { loading: false, error: errorMessage(e) }))\n .finally(() => inflight.delete(key));\n inflight.set(key, p);\n return p;\n },\n reset() {\n set({\n ...emptySyncData(),\n hydrated: false,\n synced: false,\n connection: { state: \"connecting\", lastSyncedAt: null, attempts: 0 },\n });\n },\n}));\n\nfunction setTranscript(\n set: (fn: (s: SyncStore) => Partial<SyncStore>) => void,\n sessionId: string,\n patch: Partial<TranscriptState>,\n) {\n set((s) => ({\n transcripts: {\n ...s.transcripts,\n [sessionId]: { ...(s.transcripts[sessionId] ?? emptyTranscript()), ...patch },\n },\n }));\n}\n\nexport const syncStore = useSyncStore;\n\n/* ------------------------------------------------------------------ */\n/* Pure selectors (take entity maps; safe to use in useMemo or tests). */\n/* ------------------------------------------------------------------ */\n\nexport const TASK_COLUMNS: TaskState[] = [\"backlog\", \"ready\", \"in_progress\", \"review\", \"done\"];\n\nexport function compareTasks(a: Task, b: Task): number {\n return (\n a.priority - b.priority || a.position - b.position || a.createdAt.localeCompare(b.createdAt)\n );\n}\n\n/** Tasks grouped by state, sorted by (priority, position, createdAt). Hidden routine tasks are omitted. */\nexport function groupTasksByState(\n tasks: Record<string, Task>,\n opts: { projectId?: string | null; includeHidden?: boolean } = {},\n): Record<TaskState, Task[]> {\n const out: Record<TaskState, Task[]> = {\n backlog: [],\n ready: [],\n in_progress: [],\n review: [],\n done: [],\n canceled: [],\n };\n for (const t of Object.values(tasks)) {\n if (opts.projectId && t.projectId !== opts.projectId) continue;\n if (t.hiddenFromBoard && !opts.includeHidden) continue;\n out[t.state].push(t);\n }\n for (const k of Object.keys(out) as TaskState[]) out[k].sort(compareTasks);\n return out;\n}\n\n/** Non-archived sessions, most recent activity first. */\nexport function sortSessions(sessions: Record<string, Session>): Session[] {\n return Object.values(sessions)\n .filter((s) => s.archivedAt === null)\n .sort((a, b) => b.lastActivityAt.localeCompare(a.lastActivityAt));\n}\n\n/** Open attention, newest first. */\nexport function sortAttention(attention: Record<string, AttentionItem>): AttentionItem[] {\n return Object.values(attention)\n .filter((a) => a.resolvedAt === null)\n .sort((a, b) => b.createdAt.localeCompare(a.createdAt));\n}\n\n/** Count shown on the Attention badge: open and not yet acknowledged. */\nexport function countAttention(attention: Record<string, AttentionItem>): number {\n let n = 0;\n for (const a of Object.values(attention)) if (!a.resolvedAt && !a.acknowledgedAt) n++;\n return n;\n}\n\nexport function pendingInteractionsFor(\n interactions: Record<string, Interaction>,\n sessionId: string,\n): Interaction[] {\n return Object.values(interactions)\n .filter((i) => i.sessionId === sessionId && i.state === \"pending\")\n .sort((a, b) => a.createdAt.localeCompare(b.createdAt));\n}\n\nexport function runsForTask(runs: Record<string, Run>, taskId: string): Run[] {\n return Object.values(runs)\n .filter((r) => r.taskId === taskId)\n .sort((a, b) => b.attempt - a.attempt || b.createdAt.localeCompare(a.createdAt));\n}\n\nexport function panelsForSession(panels: Record<string, Panel>, sessionId: string): Panel[] {\n return Object.values(panels)\n .filter((p) => p.sessionId === sessionId)\n .sort((a, b) => a.adapterId.localeCompare(b.adapterId) || a.slot.localeCompare(b.slot));\n}\n\nexport function streamsForSession(\n streaming: Record<string, StreamBuffer>,\n sessionId: string,\n): StreamBuffer[] {\n return Object.values(streaming).filter((b) => b.sessionId === sessionId);\n}\n\n/* ------------------------------------------------------------------ */\n/* Hooks. Each selects stable maps and derives with useMemo. */\n/* ------------------------------------------------------------------ */\n\nexport const useConnection = () => useSyncStore((s) => s.connection);\nexport const useHost = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.hosts[id] : undefined));\nexport const useProject = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.projects[id] : undefined));\nexport const useWorkspace = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.workspaces[id] : undefined));\nexport const useSession = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.sessions[id] : undefined));\nexport const useTask = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.tasks[id] : undefined));\nexport const useRun = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.runs[id] : undefined));\nexport const useAutomation = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.automations[id] : undefined));\nexport const useInteraction = (id: string | null | undefined) =>\n useSyncStore((s) => (id ? s.interactions[id] : undefined));\n\nexport function useProjects() {\n const projects = useSyncStore((s) => s.projects);\n return useMemo(\n () => Object.values(projects).sort((a, b) => a.name.localeCompare(b.name)),\n [projects],\n );\n}\n\nexport function useHosts() {\n const hosts = useSyncStore((s) => s.hosts);\n return useMemo(\n () =>\n Object.values(hosts)\n .filter((h) => h.revokedAt === null)\n .sort((a, b) => a.name.localeCompare(b.name)),\n [hosts],\n );\n}\n\nexport function useSessions() {\n const sessions = useSyncStore((s) => s.sessions);\n return useMemo(() => sortSessions(sessions), [sessions]);\n}\n\nexport function useTasksByState(opts: { projectId?: string | null; includeHidden?: boolean } = {}) {\n const tasks = useSyncStore((s) => s.tasks);\n const { projectId, includeHidden } = opts;\n return useMemo(\n () => groupTasksByState(tasks, { projectId, includeHidden }),\n [tasks, projectId, includeHidden],\n );\n}\n\nexport function useOpenAttention() {\n const attention = useSyncStore((s) => s.attention);\n return useMemo(() => sortAttention(attention), [attention]);\n}\n\nexport function useAttentionCount() {\n return useSyncStore((s) => countAttention(s.attention));\n}\n\nexport function usePendingInteractions(sessionId: string | null | undefined) {\n const interactions = useSyncStore((s) => s.interactions);\n return useMemo(\n () => (sessionId ? pendingInteractionsFor(interactions, sessionId) : []),\n [interactions, sessionId],\n );\n}\n\nexport function useRunsForTask(taskId: string | null | undefined) {\n const runs = useSyncStore((s) => s.runs);\n return useMemo(() => (taskId ? runsForTask(runs, taskId) : []), [runs, taskId]);\n}\n\nexport function usePanels(sessionId: string | null | undefined) {\n const panels = useSyncStore((s) => s.panels);\n return useMemo(() => (sessionId ? panelsForSession(panels, sessionId) : []), [panels, sessionId]);\n}\n\nexport function useStreams(sessionId: string | null | undefined) {\n const streaming = useSyncStore((s) => s.streaming);\n return useMemo(\n () => (sessionId ? streamsForSession(streaming, sessionId) : []),\n [streaming, sessionId],\n );\n}\n\nconst EMPTY_TRANSCRIPT = emptyTranscript();\n\n/** Transcript for a session; loads the newest page on mount (and after a resync). */\nexport function useTranscript(sessionId: string | null | undefined): TranscriptState {\n const t = useSyncStore((s) => (sessionId ? s.transcripts[sessionId] : undefined));\n const load = useSyncStore((s) => s.loadTranscript);\n const needsLoad = !!sessionId && (!t || ((!t.loaded || t.stale) && !t.loading && !t.error));\n useEffect(() => {\n if (needsLoad && sessionId) void load(sessionId);\n }, [needsLoad, sessionId, load]);\n return t ?? EMPTY_TRANSCRIPT;\n}\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"circle-alert\",\n size: 24,\n node: [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n ],\n aliases: [\"alert-circle\"]\n};\n__iconData.node;\nconst CircleAlert = createLucideIcon(__iconData);\n\nexport { __iconData, CircleAlert as default };\n//# sourceMappingURL=circle-alert.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"inbox\",\n size: 24,\n node: [\n [\"polyline\", { points: \"22 12 16 12 14 15 10 15 8 12 2 12\", key: \"o97t9d\" }],\n [\n \"path\",\n {\n d: \"M5.45 5.11 2 12v6a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-6l-3.45-6.89A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z\",\n key: \"oot6mr\"\n }\n ]\n ]\n};\n__iconData.node;\nconst Inbox = createLucideIcon(__iconData);\n\nexport { __iconData, Inbox as default };\n//# sourceMappingURL=inbox.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"message-circle-question-mark\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M2.992 16.342a2 2 0 0 1 .094 1.167l-1.065 3.29a1 1 0 0 0 1.236 1.168l3.413-.998a2 2 0 0 1 1.099.092 10 10 0 1 0-4.777-4.719\",\n key: \"1sd12s\"\n }\n ],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n ],\n aliases: [\"message-circle-question\"]\n};\n__iconData.node;\nconst MessageCircleQuestionMark = createLucideIcon(__iconData);\n\nexport { __iconData, MessageCircleQuestionMark as default };\n//# sourceMappingURL=message-circle-question-mark.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"puzzle\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"M15.39 4.39a1 1 0 0 0 1.68-.474 2.5 2.5 0 1 1 3.014 3.015 1 1 0 0 0-.474 1.68l1.683 1.682a2.414 2.414 0 0 1 0 3.414L19.61 15.39a1 1 0 0 1-1.68-.474 2.5 2.5 0 1 0-3.014 3.015 1 1 0 0 1 .474 1.68l-1.683 1.682a2.414 2.414 0 0 1-3.414 0L8.61 19.61a1 1 0 0 0-1.68.474 2.5 2.5 0 1 1-3.014-3.015 1 1 0 0 0 .474-1.68l-1.683-1.682a2.414 2.414 0 0 1 0-3.414L4.39 8.61a1 1 0 0 1 1.68.474 2.5 2.5 0 1 0 3.014-3.015 1 1 0 0 1-.474-1.68l1.683-1.682a2.414 2.414 0 0 1 3.414 0z\",\n key: \"w46dr5\"\n }\n ]\n ]\n};\n__iconData.node;\nconst Puzzle = createLucideIcon(__iconData);\n\nexport { __iconData, Puzzle as default };\n//# sourceMappingURL=puzzle.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"refresh-cw\",\n size: 24,\n node: [\n [\"path\", { d: \"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\", key: \"v9h5vc\" }],\n [\"path\", { d: \"M21 3v5h-5\", key: \"1q7to0\" }],\n [\"path\", { d: \"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\", key: \"3uifl3\" }],\n [\"path\", { d: \"M8 16H3v5\", key: \"1cv678\" }]\n ]\n};\n__iconData.node;\nconst RefreshCw = createLucideIcon(__iconData);\n\nexport { __iconData, RefreshCw as default };\n//# sourceMappingURL=refresh-cw.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"server-off\",\n size: 24,\n node: [\n [\"path\", { d: \"M7 2h13a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-5\", key: \"bt2siv\" }],\n [\"path\", { d: \"M10 10 2.5 2.5C2 2 2 2.5 2 5v3a2 2 0 0 0 2 2h6z\", key: \"1hjrv1\" }],\n [\"path\", { d: \"M22 17v-1a2 2 0 0 0-2-2h-1\", key: \"1iynyr\" }],\n [\"path\", { d: \"M4 14a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16.5l1-.5.5.5-8-8H4z\", key: \"161ggg\" }],\n [\"path\", { d: \"M6 18h.01\", key: \"uhywen\" }],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n ]\n};\n__iconData.node;\nconst ServerOff = createLucideIcon(__iconData);\n\nexport { __iconData, ServerOff as default };\n//# sourceMappingURL=server-off.mjs.map\n","/**\n * @license lucide-react v1.61.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.mjs';\n\nconst __iconData = {\n name: \"triangle-alert\",\n size: 24,\n node: [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n ],\n aliases: [\"alert-triangle\"]\n};\n__iconData.node;\nconst TriangleAlert = createLucideIcon(__iconData);\n\nexport { __iconData, TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.mjs.map\n","/** Join class names, skipping falsy values. */\nexport function cn(...parts: (string | false | null | undefined)[]): string {\n return parts.filter(Boolean).join(\" \");\n}\n","const rtf =\n typeof Intl !== \"undefined\" && \"RelativeTimeFormat\" in Intl\n ? new Intl.RelativeTimeFormat(undefined, { numeric: \"auto\" })\n : null;\n\n/** \"3 min ago\", \"in 2 h\", \"just now\". */\nexport function formatRelative(iso: string | null | undefined, now = Date.now()): string {\n if (!iso) return \"never\";\n const t = Date.parse(iso);\n if (Number.isNaN(t)) return iso;\n const diff = Math.round((t - now) / 1000);\n const abs = Math.abs(diff);\n if (abs < 30) return \"just now\";\n if (!rtf) return new Date(t).toLocaleString();\n if (abs < 3600) return rtf.format(Math.round(diff / 60), \"minute\");\n if (abs < 86400) return rtf.format(Math.round(diff / 3600), \"hour\");\n if (abs < 86400 * 30) return rtf.format(Math.round(diff / 86400), \"day\");\n return new Date(t).toLocaleDateString();\n}\n\n/** Short local time, with the date when it is not today. */\nexport function formatTime(iso: string | number | null | undefined): string {\n if (iso === null || iso === undefined) return \"unknown\";\n const d = new Date(iso);\n if (Number.isNaN(d.getTime())) return String(iso);\n const sameDay = d.toDateString() === new Date().toDateString();\n return sameDay\n ? d.toLocaleTimeString(undefined, { hour: \"2-digit\", minute: \"2-digit\" })\n : d.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n });\n}\n\n/** \"1m 05s\" style duration. */\nexport function formatDuration(ms: number | null | undefined): string {\n if (ms === null || ms === undefined || Number.isNaN(ms)) return \"\";\n if (ms < 1000) return `${Math.round(ms)} ms`;\n const s = Math.round(ms / 1000);\n if (s < 60) return `${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `${m}m ${String(s % 60).padStart(2, \"0\")}s`;\n return `${Math.floor(m / 60)}h ${String(m % 60).padStart(2, \"0\")}m`;\n}\n","import { type ButtonHTMLAttributes, forwardRef, type ReactNode } from \"react\";\nimport { cn } from \"../../lib/cn\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"sm\" | \"md\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n /** Icon shown before the label. */\n icon?: ReactNode;\n /** Shows a spinner and sets aria-busy; the button is disabled while busy. */\n busy?: boolean;\n block?: boolean;\n}\n\nconst VARIANTS: Record<ButtonVariant, string> = {\n primary: \"bg-accent text-accent-fg border-accent hover:bg-accent-hover hover:border-accent-hover\",\n secondary: \"bg-surface text-text border-border hover:bg-surface-2\",\n ghost: \"bg-transparent text-text border-transparent hover:bg-surface-2\",\n danger: \"bg-danger text-danger-fg border-danger hover:bg-danger-hover hover:border-danger-hover\",\n};\n\nconst SIZES: Record<ButtonSize, string> = {\n sm: \"h-8 px-2.5 text-sm gap-1.5\",\n md: \"h-9 px-3.5 text-sm gap-2\",\n};\n\nexport function buttonClasses(\n variant: ButtonVariant = \"secondary\",\n size: ButtonSize = \"md\",\n extra?: string,\n): string {\n return cn(\n \"tap inline-flex items-center justify-center rounded-md border font-medium whitespace-nowrap select-none\",\n \"transition-colors disabled:opacity-55 disabled:pointer-events-none\",\n VARIANTS[variant],\n SIZES[size],\n extra,\n );\n}\n\nexport const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(\n {\n variant = \"secondary\",\n size = \"md\",\n icon,\n busy,\n block,\n className,\n children,\n disabled,\n type,\n ...rest\n },\n ref,\n) {\n return (\n <button\n ref={ref}\n type={type ?? \"button\"}\n disabled={disabled || busy}\n aria-busy={busy || undefined}\n className={buttonClasses(variant, size, cn(block && \"w-full\", className))}\n {...rest}\n >\n {busy ? <Spinner /> : icon}\n {children}\n </button>\n );\n});\n\nexport function Spinner({ className, label }: { className?: string; label?: string }) {\n return (\n <svg\n className={cn(\"size-4 animate-spin\", className)}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n role={label ? \"img\" : undefined}\n aria-label={label}\n aria-hidden={label ? undefined : true}\n >\n <circle cx=\"12\" cy=\"12\" r=\"9\" stroke=\"currentColor\" strokeOpacity=\"0.25\" strokeWidth=\"3\" />\n <path d=\"M21 12a9 9 0 0 0-9-9\" stroke=\"currentColor\" strokeWidth=\"3\" strokeLinecap=\"round\" />\n </svg>\n );\n}\n","import {\n CircleAlert,\n Inbox,\n MessageCircleQuestion,\n Puzzle,\n RefreshCw,\n ServerOff,\n TriangleAlert,\n} from \"lucide-react\";\nimport type { ReactNode } from \"react\";\nimport { Link } from \"react-router\";\nimport { cn } from \"../../lib/cn\";\nimport { formatRelative, formatTime } from \"../../lib/time\";\nimport type { ConnectionState } from \"../../sync/store\";\nimport { Button, buttonClasses, Spinner } from \"./Button\";\n\n/*\n * The nine UI states every primary view implements (spec 18):\n * LoadingState, EmptyState, ReconnectingBanner, HostUnavailable,\n * InteractionPending, UnsupportedCapability, ErrorState, FatalError, and\n * toast() for successful mutations (see Toast.tsx).\n */\n\nexport type StateAction =\n | { label: string; onClick: () => void; icon?: ReactNode }\n | { label: string; to: string; icon?: ReactNode };\n\nfunction ActionButton({ action, primary = true }: { action: StateAction; primary?: boolean }) {\n if (\"to\" in action) {\n return (\n <Link to={action.to} className={buttonClasses(primary ? \"primary\" : \"secondary\")}>\n {action.icon}\n {action.label}\n </Link>\n );\n }\n return (\n <Button variant={primary ? \"primary\" : \"secondary\"} icon={action.icon} onClick={action.onClick}>\n {action.label}\n </Button>\n );\n}\n\nfunction Panel({\n icon,\n title,\n children,\n actions,\n className,\n role,\n}: {\n icon: ReactNode;\n title: ReactNode;\n children?: ReactNode;\n actions?: ReactNode;\n className?: string;\n role?: string;\n}) {\n return (\n <div\n role={role}\n className={cn(\n \"mx-auto flex w-full max-w-md flex-col items-center gap-3 px-4 py-10 text-center\",\n className,\n )}\n >\n <div className=\"text-muted\" aria-hidden>\n {icon}\n </div>\n <h2 className=\"text-base font-semibold\">{title}</h2>\n {children && <div className=\"text-sm text-muted\">{children}</div>}\n {actions && <div className=\"flex flex-wrap justify-center gap-2\">{actions}</div>}\n </div>\n );\n}\n\n/** 1. Initial loading. */\nexport function LoadingState({\n label = \"Loading…\",\n className,\n}: {\n label?: string;\n className?: string;\n}) {\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"flex items-center justify-center gap-2 px-4 py-10 text-sm text-muted\",\n className,\n )}\n >\n <Spinner />\n <span>{label}</span>\n </div>\n );\n}\n\n/** 2. Empty state with a next action. */\nexport function EmptyState({\n title,\n description,\n action,\n secondaryAction,\n icon,\n className,\n}: {\n title: string;\n description?: ReactNode;\n action?: StateAction;\n secondaryAction?: StateAction;\n icon?: ReactNode;\n className?: string;\n}) {\n return (\n <Panel\n icon={icon ?? <Inbox className=\"size-8\" />}\n title={title}\n className={className}\n actions={\n (action || secondaryAction) && (\n <>\n {action && <ActionButton action={action} />}\n {secondaryAction && <ActionButton action={secondaryAction} primary={false} />}\n </>\n )\n }\n >\n {description}\n </Panel>\n );\n}\n\n/** 3. Reconnecting with last-known-data indication. Renders nothing while live. */\nexport function ReconnectingBanner({\n state,\n lastSyncedAt,\n onRetry,\n className,\n}: {\n state: ConnectionState;\n lastSyncedAt: string | null;\n onRetry?: () => void;\n className?: string;\n}) {\n if (state === \"live\" || (state === \"connecting\" && !lastSyncedAt)) return null;\n const offline = state === \"offline\";\n const when = lastSyncedAt ? formatTime(lastSyncedAt) : \"an earlier session\";\n return (\n <div\n role=\"status\"\n aria-live=\"polite\"\n className={cn(\n \"flex items-center gap-2 border-b border-border bg-warning-soft px-3 py-1.5 text-sm text-text\",\n className,\n )}\n >\n {offline ? (\n <ServerOff aria-hidden className=\"size-4 shrink-0 text-warning\" />\n ) : (\n <RefreshCw aria-hidden className=\"size-4 shrink-0 animate-spin text-warning\" />\n )}\n <span className=\"min-w-0 flex-1\">\n {offline ? \"Offline\" : \"Reconnecting…\"} showing last known data from{\" \"}\n <time dateTime={lastSyncedAt ?? undefined}>{when}</time>\n </span>\n {onRetry && (\n <button\n type=\"button\"\n onClick={onRetry}\n className=\"tap shrink-0 rounded px-2 py-0.5 font-medium text-accent hover:bg-surface-2\"\n >\n Retry now\n </button>\n )}\n </div>\n );\n}\n\n/** 4. Host unavailable (unreachable or reconnecting). Never claims completion. */\nexport function HostUnavailable({\n hostName,\n connectivity = \"unreachable\",\n lastSeenAt,\n detail,\n compact,\n className,\n}: {\n hostName: string;\n connectivity?: \"reconnecting\" | \"unreachable\";\n lastSeenAt?: string | null;\n detail?: ReactNode;\n /** Inline banner instead of a full panel. */\n compact?: boolean;\n className?: string;\n}) {\n const title =\n connectivity === \"reconnecting\"\n ? `Host ${hostName} is reconnecting`\n : `Host ${hostName} is unreachable`;\n const body = (\n <>\n {lastSeenAt ? `Last seen ${formatRelative(lastSeenAt)}. ` : \"\"}\n {detail ?? \"Work on this host keeps its last known state; nothing is restarted elsewhere.\"}\n </>\n );\n if (compact) {\n return (\n <div\n role=\"status\"\n className={cn(\n \"flex items-start gap-2 rounded-md border border-border bg-danger-soft px-3 py-2 text-sm\",\n className,\n )}\n >\n <ServerOff aria-hidden className=\"mt-0.5 size-4 shrink-0 text-danger\" />\n <div className=\"min-w-0\">\n <div className=\"font-medium\">{title}</div>\n <div className=\"text-muted\">{body}</div>\n </div>\n </div>\n );\n }\n return (\n <Panel\n role=\"status\"\n icon={<ServerOff className=\"size-8\" />}\n title={title}\n className={className}\n >\n {body}\n </Panel>\n );\n}\n\n/** 5. Permission/interaction pending: a strip linking to the first unanswered item. */\nexport function InteractionPending({\n count,\n to,\n onOpen,\n label,\n className,\n}: {\n count: number;\n to?: string;\n onOpen?: () => void;\n label?: string;\n className?: string;\n}) {\n if (count <= 0) return null;\n const text = label ?? (count === 1 ? \"Needs your answer\" : `${count} questions need your answer`);\n const inner = (\n <>\n <MessageCircleQuestion aria-hidden className=\"size-4 shrink-0 text-warning\" />\n <span className=\"min-w-0 flex-1 truncate font-medium\">{text}</span>\n <span className=\"shrink-0 text-accent\">Answer</span>\n </>\n );\n const cls = cn(\n \"tap flex w-full items-center gap-2 border border-border bg-warning-soft px-3 py-2 text-left text-sm rounded-md\",\n className,\n );\n if (to)\n return (\n <Link to={to} className={cls} role=\"status\">\n {inner}\n </Link>\n );\n return (\n <button type=\"button\" onClick={onOpen} className={cls}>\n {inner}\n </button>\n );\n}\n\n/** 6. Unsupported capability: says exactly what is not available and what to do instead. */\nexport function UnsupportedCapability({\n capability,\n reason,\n fallback,\n className,\n}: {\n capability: string;\n reason: ReactNode;\n fallback?: ReactNode;\n className?: string;\n}) {\n return (\n <div\n role=\"note\"\n className={cn(\n \"flex items-start gap-2 rounded-md border border-border bg-surface-2 px-3 py-2 text-sm\",\n className,\n )}\n >\n <Puzzle aria-hidden className=\"mt-0.5 size-4 shrink-0 text-muted\" />\n <div className=\"min-w-0\">\n <div className=\"font-medium\">{capability} is not available here</div>\n <div className=\"text-muted\">{reason}</div>\n {fallback && <div className=\"mt-1\">{fallback}</div>}\n </div>\n </div>\n );\n}\n\n/** 7. Recoverable error with retry. */\nexport function ErrorState({\n title = \"Something went wrong\",\n error,\n onRetry,\n compact,\n className,\n}: {\n title?: string;\n error: unknown;\n onRetry?: () => void;\n compact?: boolean;\n className?: string;\n}) {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n if (compact) {\n return (\n <div\n role=\"alert\"\n className={cn(\n \"flex items-start gap-2 rounded-md border border-border bg-danger-soft px-3 py-2 text-sm\",\n className,\n )}\n >\n <TriangleAlert aria-hidden className=\"mt-0.5 size-4 shrink-0 text-danger\" />\n <div className=\"min-w-0 flex-1\">\n <div className=\"font-medium\">{title}</div>\n {message && <div className=\"break-words text-muted\">{message}</div>}\n </div>\n {onRetry && (\n <Button size=\"sm\" onClick={onRetry} icon={<RefreshCw className=\"size-3.5\" />}>\n Retry\n </Button>\n )}\n </div>\n );\n }\n return (\n <Panel\n role=\"alert\"\n icon={<TriangleAlert className=\"size-8 text-danger\" />}\n title={title}\n className={className}\n actions={\n onRetry && (\n <Button variant=\"primary\" onClick={onRetry} icon={<RefreshCw className=\"size-4\" />}>\n Retry\n </Button>\n )\n }\n >\n <span className=\"break-words\">{message}</span>\n </Panel>\n );\n}\n\n/** 8. Irrecoverable error with a diagnostics link. */\nexport function FatalError({\n title = \"Switchyard cannot show this view\",\n error,\n diagnosticsHref = \"/settings/diagnostics\",\n className,\n}: {\n title?: string;\n error: unknown;\n diagnosticsHref?: string;\n className?: string;\n}) {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n return (\n <Panel\n role=\"alert\"\n icon={<CircleAlert className=\"size-8 text-danger\" />}\n title={title}\n className={className}\n actions={\n <>\n <a href={diagnosticsHref} className={buttonClasses(\"primary\")}>\n Open diagnostics\n </a>\n <Button onClick={() => location.reload()}>Reload</Button>\n </>\n }\n >\n <span className=\"break-words\">{message}</span>\n </Panel>\n );\n}\n"],"ignoreList":[0,1,5,6,7,8,9,10,11],"mappings":"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"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{_ as e,m as t,n,t as r}from"./jsx-runtime-D13aM9HY.js";import{A as i,B as a,E as o,G as s,H as c,P as l,U as u,V as d,W as f,a as p,c as ee,h as m,i as te,l as h,n as g}from"./states-DrTQuYXw.js";import{t as _}from"./search-C6cn5WOo.js";import{M as v,N as y,c as b,g as x,p as S,t as ne}from"./index-Cf6ZUCfK.js";import{n as re}from"./TextArea-BsQHOQMe.js";import{c as C}from"./dist-Bgkh2hc5.js";import{r as ie,t as ae}from"./Overlay-oYnnwvFM.js";var w={name:`funnel`,size:24,node:[[`path`,{d:`M10 20a1 1 0 0 0 .553.895l2 1A1 1 0 0 0 14 21v-7a2 2 0 0 1 .517-1.341L21.74 4.67A1 1 0 0 0 21 3H3a1 1 0 0 0-.742 1.67l7.225 7.989A2 2 0 0 1 10 14z`,key:`sc7q7i`}]],aliases:[`filter`]};w.node;var oe=n(w),T=e(t(),1),E=e=>`/api/tasks/${encodeURIComponent(e)}`;function D(e){if(!e||typeof e!=`object`)return null;let t=e;return t.task&&typeof t.task==`object`?t.task:typeof t.id==`string`&&typeof t.state==`string`?t:null}function O(e){let t=D(e);return t?(l.setState(e=>{let n=e.tasks[t.id];return n&&n.updatedAt>t.updatedAt?{}:{tasks:{...e.tasks,[t.id]:t}}}),t):null}async function k(e){let t=O(await u(`/api/tasks`,e));if(!t)throw Error(`The coordinator returned an unexpected response`);return t}async function A(e,t){return O(await c(E(e),t))}async function j(e){await a(E(e)),l.setState(t=>{if(!t.tasks[e])return{};let{[e]:n,...r}=t.tasks;return{tasks:r}})}async function M(e,t){return O(await u(`${E(e)}/move`,t))}async function N(e,t,n,r){return O(await u(`${E(e)}/${t}${r??``}`,n))}async function P(e,t){return O(await u(`${E(e)}/request-changes`,{feedback:t}))}function F(e,t){return d(`${E(e)}/eligibility`,void 0,t)}async function I(e,t){let n=await d(`${E(e)}/runs`,void 0,t);return Array.isArray(n)?n:n.runs??[]}async function L(e){await u(`/api/dispatch/pause`,{paused:e}),l.setState({dispatchPaused:e})}function R(e){return!s(e)||e.status!==409&&e.code!==`invalid_transition`?!1:e.details?.needsConfirm===!0||/confirm/i.test(e.message)}function z(e){if(!s(e))return!1;let t=e.details;return Array.isArray(t?.choices)||t?.needsChoice===!0||t?.onRunning===!0||/pause automation or stop execution/i.test(e.message)}var B=[`backlog`,`ready`,`in_progress`,`review`,`done`],V={backlog:`Backlog`,ready:`Ready`,in_progress:`In progress`,review:`Review`,done:`Done`,canceled:`Canceled`},H={search:``,priorities:[],hostId:null,attentionOnly:!1,blockedOnly:!1,showCanceled:!1,showCompleted:!0,sort:`priority`};function U(e){let t=e&&typeof e==`object`?e:{};return{search:typeof t.search==`string`?t.search:``,priorities:Array.isArray(t.priorities)?t.priorities.filter(e=>[0,1,2,3].includes(e)):[],hostId:typeof t.hostId==`string`?t.hostId:null,attentionOnly:t.attentionOnly===!0,blockedOnly:t.blockedOnly===!0,showCanceled:t.showCanceled===!0,showCompleted:t.showCompleted!==!1,sort:t.sort===`updated`||t.sort===`created`?t.sort:`priority`}}function W(e,t){let n=[];e.search.trim()&&n.push({key:`search`,label:`Search: ${e.search.trim()}`,clear:e=>({...e,search:``})});for(let t of e.priorities)n.push({key:`priority-${t}`,label:`Priority: ${C[t]}`,clear:e=>({...e,priorities:e.priorities.filter(e=>e!==t)})});return e.hostId&&n.push({key:`host`,label:`Host: ${t(e.hostId)}`,clear:e=>({...e,hostId:null})}),e.attentionOnly&&n.push({key:`attention`,label:`Needs attention`,clear:e=>({...e,attentionOnly:!1})}),e.blockedOnly&&n.push({key:`blocked`,label:`Blocked`,clear:e=>({...e,blockedOnly:!1})}),e.showCanceled&&n.push({key:`canceled`,label:`Including canceled`,clear:e=>({...e,showCanceled:!1})}),n}function G(e,t){return(e.currentRunId?t[e.currentRunId]:void 0)?.hostId??e.policy.hostId??null}function K(e,t,n){if(e.hiddenFromBoard||n.projectId&&e.projectId!==n.projectId||e.state===`canceled`&&!t.showCanceled)return!1;let r=t.search.trim().toLowerCase();return!(r&&!`${e.title}\n${e.objective}`.toLowerCase().includes(r)||t.priorities.length>0&&!t.priorities.includes(e.priority)||t.hostId&&G(e,n.runs)!==t.hostId||t.attentionOnly&&!n.attentionTaskIds.has(e.id)||t.blockedOnly&&!e.blocked)}function q(e,t){let n=[...e];return t===`updated`?n.sort((e,t)=>t.lastActivityAt.localeCompare(e.lastActivityAt)):t===`created`?n.sort((e,t)=>t.createdAt.localeCompare(e.createdAt)):n.sort((e,t)=>e.priority-t.priority||e.position-t.position||e.createdAt.localeCompare(t.createdAt)),n}function se(e,t,n){let r={backlog:[],ready:[],in_progress:[],review:[],done:[],canceled:[]};for(let i of Object.values(e))K(i,t,n)&&r[i.state].push(i);for(let e of Object.keys(r))r[e]=q(r[e],t.sort);return r}function ce(e){return e.showCanceled?[...B,`canceled`]:B}var J={backlog:[`ready`,`canceled`],ready:[`backlog`,`in_progress`,`canceled`],in_progress:[`review`,`ready`,`backlog`,`canceled`,`done`],review:[`in_progress`,`done`,`ready`,`canceled`],done:[`ready`,`backlog`],canceled:[`backlog`]};function le(e){return!!e&&[`queued`,`dispatching`,`uncertain`,`running`,`waiting_input`,`checking`].includes(e.state)}function ue(e,t){let n=[];e.state!==`review`&&n.push(`The task has not been through review.`),e.acceptanceCriteria.length>0&&n.push(`${e.acceptanceCriteria.length} acceptance ${e.acceptanceCriteria.length===1?`criterion has`:`criteria have`} not been confirmed.`);let r=(e.policy.completion.checks?.length??0)>0,i=t?.checks.filter(e=>e.exitCode!==0)??[];return i.length>0?n.push(`Checks failing: ${i.map(e=>e.command).join(`, `)}.`):r&&(!t||t.checks.length===0)&&n.push(`Required checks have not run.`),e.policy.completion.requireHumanReview&&e.state===`review`&&n.push(`Human review is required: moving to Done accepts the work.`),n}function de(e,t,n){if(e.state===t)return{kind:`noop`};let r=e.state;if(!J[r].includes(t))return{kind:`invalid`,reason:fe(r,t)};if(r===`ready`&&t===`in_progress`)return{kind:`run_now`};if(r===`review`&&t===`in_progress`)return{kind:`new_attempt`};if(r===`in_progress`&&(t===`ready`||t===`backlog`))return{kind:`choose_running`};if(t===`done`){let t=ue(e,n);if(t.length>0)return{kind:`confirm_done`,reasons:t}}return{kind:`move`}}function fe(e,t){let n=V[e],r=V[t];return t===`in_progress`?e===`backlog`?`A Backlog task cannot start directly. Move it to Ready first; the dispatcher starts it when it is eligible.`:`${n} tasks cannot be moved to In progress. Only the dispatcher starts work (Run now from Ready).`:t===`review`?`Only a finished run moves a task to Review. Run the task, or use Done to accept it.`:e===`canceled`?`A canceled task can only be restored to Backlog.`:e===`done`&&t===`canceled`?`A Done task cannot be canceled. Reopen it first.`:e===`backlog`&&t===`done`?`A Backlog task cannot be marked Done. Make it ready and review its work first.`:e===`ready`&&t===`done`?`A task that has not run cannot be marked Done. Run it, or cancel it.`:`Moving from ${n} to ${r} is not allowed.`}function pe(e){return J[e.state]}function me(e,t,n){let r=e.filter(e=>e.id!==n);if(r.length===0)return 1;if(t===null)return r[r.length-1].position+1;let i=r.findIndex(e=>e.id===t);if(i<0)return r[r.length-1].position+1;let a=r[i].position;return((i>0?r[i-1].position:a-2)+a)/2}var Y={dependency:`Waiting on dependencies`,host_offline:`Host offline`,project_limit:`Project run limit reached`,workspace_occupied:`Workspace occupied`,scheduled_time:`Scheduled for later`,invalid_configuration:`Invalid configuration`,dispatch_paused:`Dispatch paused`,project_automation_disabled:`Project automation is off`,not_ready:`Not ready`,already_dispatched:`Already dispatched`,retry_backoff:`Retrying after a failure`};function he(e){return e.eligible?`Will start automatically on ${e.hostName}`:`Will wait: ${e.message||Y[e.wait]}`}function ge(e,t){let{project:n}=e;if(!n)return{eligible:!1,wait:`invalid_configuration`,message:`Choose a project`};if(t.dispatchPaused)return{eligible:!1,wait:`dispatch_paused`,message:`Dispatch is paused; resume it to start new work`};if(!n.automationEnabled)return{eligible:!1,wait:`project_automation_disabled`,message:`Automation is off for ${n.name}`};let r=e.dependencies.map(e=>t.tasks[e]).filter(e=>!!e&&e.state!==`done`);if(r.length>0)return{eligible:!1,wait:`dependency`,message:`Waiting on ${r.map(e=>e.title).join(`, `)}`};if(e.notBefore&&Date.parse(e.notBefore)>Date.now())return{eligible:!1,wait:`scheduled_time`,message:`Scheduled for ${new Date(e.notBefore).toLocaleString()}`};let i=e.hostId??n.defaultHostId,a=i?t.hosts[i]:void 0;return!a||a.revokedAt?{eligible:!1,wait:`invalid_configuration`,message:`No host is configured for this project`}:a.piCompatible?a.connectivity===`connected`?(t.runningByProject[n.id]??0)>=n.maxConcurrentRuns?{eligible:!1,wait:`project_limit`,message:`${n.name} already runs ${n.maxConcurrentRuns} of ${n.maxConcurrentRuns} allowed tasks`}:{eligible:!0,hostId:a.id,hostName:a.name}:{eligible:!1,wait:`host_offline`,message:`${a.name} is offline`}:{eligible:!1,wait:`invalid_configuration`,message:`Pi on ${a.name} is not compatible`}}function _e(e){let t=new Map;for(let n of Object.values(e)){if(n.resolvedAt||!n.taskId)continue;let e=t.get(n.taskId)??[];e.push(n),t.set(n.taskId,e)}return t}function ve(e,t){let n=e.dependencies.length;if(n===0)return null;let r=e.dependencies.filter(e=>t[e]?.state!==`done`).length,i=`${n} ${n===1?`dependency`:`dependencies`}`;return r>0?`${i} (${r} open)`:`${i} (all done)`}var X=r(),Z=`tap h-9 min-w-0 rounded-md border border-border bg-surface px-2 text-base text-text md:text-sm`;function ye({board:e,className:t}){let n=i(),r=(0,T.useId)();return(0,X.jsxs)(`div`,{className:m(`flex min-w-0 items-center gap-2`,t),children:[(0,X.jsx)(`label`,{htmlFor:r,className:`sr-only`,children:`Project`}),(0,X.jsxs)(`select`,{id:r,className:m(Z,`w-full max-w-56`),value:e.projectId??``,onChange:t=>e.setProjectId(t.target.value||null),children:[(0,X.jsx)(`option`,{value:``,children:`All projects`}),n.map(e=>(0,X.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]})}function be({board:e,className:t}){let n=(0,T.useId)();return(0,X.jsxs)(`div`,{className:m(`relative min-w-0`,t),children:[(0,X.jsx)(`label`,{htmlFor:n,className:`sr-only`,children:`Search tasks`}),(0,X.jsx)(_,{"aria-hidden":!0,className:`pointer-events-none absolute top-1/2 left-2.5 size-4 -translate-y-1/2 text-subtle`}),(0,X.jsx)(re,{id:n,type:`search`,placeholder:`Search tasks`,className:`pl-8`,value:e.filters.search,onChange:t=>e.setFilters({...e.filters,search:t.target.value})})]})}function xe({board:e}){let t=(0,T.useId)();return(0,X.jsxs)(`div`,{className:`flex items-center gap-1.5 text-sm`,children:[(0,X.jsx)(`label`,{htmlFor:t,className:`text-muted`,children:`Sort`}),(0,X.jsxs)(`select`,{id:t,className:Z,value:e.filters.sort,onChange:t=>e.setFilters({...e.filters,sort:t.target.value}),children:[(0,X.jsx)(`option`,{value:`priority`,children:`Priority`}),(0,X.jsx)(`option`,{value:`updated`,children:`Recently updated`}),(0,X.jsx)(`option`,{value:`created`,children:`Newest`})]})]})}function Se({board:e}){return(0,X.jsxs)(`label`,{className:`tap inline-flex items-center gap-2 text-sm`,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:e.filters.showCompleted,onChange:t=>e.setFilters({...e.filters,showCompleted:t.target.checked})}),`Show completed`]})}function Ce({compact:e}){let t=l(e=>e.dispatchPaused),[n,r]=(0,T.useState)(!1),i=t?y:v;return(0,X.jsxs)(`div`,{className:`flex min-w-0 flex-wrap items-center gap-2 text-sm`,children:[(0,X.jsxs)(`span`,{role:`status`,className:m(`inline-flex items-center gap-1.5 font-medium`,t?`text-warning`:`text-success`),children:[(0,X.jsx)(i,{"aria-hidden":!0,className:`size-4`}),(0,X.jsx)(`span`,{className:`text-text`,children:t?`Automation paused`:`Automation enabled`})]}),(0,X.jsx)(h,{size:`sm`,busy:n,onClick:async()=>{r(!0);try{await L(!t),b.success(t?`Dispatch resumed. Ready tasks start when eligible.`:`Dispatch paused. Running work continues; nothing new starts.`)}catch(e){b.error(`Could not ${t?`resume`:`pause`} dispatch: ${f(e)}`)}finally{r(!1)}},children:t?`Resume dispatch`:e?`Pause`:`Pause dispatch`})]})}function we({value:e,onChange:t,withSort:n}){let r=o(),i=(0,T.useId)(),a=(n,r)=>t({...e,priorities:r?[...e.priorities,n]:e.priorities.filter(e=>e!==n)});return(0,X.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,X.jsxs)(`fieldset`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`legend`,{className:`mb-1 text-sm font-medium`,children:`Priority`}),(0,X.jsx)(`div`,{className:`flex flex-wrap gap-x-4`,children:C.map((t,n)=>(0,X.jsxs)(`label`,{className:`tap inline-flex items-center gap-2 text-sm`,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:e.priorities.includes(n),onChange:e=>a(n,e.target.checked)}),t]},t))})]}),(0,X.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`label`,{htmlFor:`${i}-host`,className:`text-sm font-medium`,children:`Host`}),(0,X.jsxs)(`select`,{id:`${i}-host`,className:Z,value:e.hostId??``,onChange:n=>t({...e,hostId:n.target.value||null}),children:[(0,X.jsx)(`option`,{value:``,children:`Any host`}),r.map(e=>(0,X.jsx)(`option`,{value:e.id,children:e.name},e.id))]})]}),(0,X.jsxs)(`fieldset`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`legend`,{className:`mb-1 text-sm font-medium`,children:`Show`}),(0,X.jsxs)(`label`,{className:`tap inline-flex items-center gap-2 text-sm`,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:e.attentionOnly,onChange:n=>t({...e,attentionOnly:n.target.checked})}),`Only tasks that need attention`]}),(0,X.jsxs)(`label`,{className:`tap inline-flex items-center gap-2 text-sm`,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:e.blockedOnly,onChange:n=>t({...e,blockedOnly:n.target.checked})}),`Only blocked tasks`]}),(0,X.jsxs)(`label`,{className:`tap inline-flex items-center gap-2 text-sm`,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:e.showCanceled,onChange:n=>t({...e,showCanceled:n.target.checked})}),`Canceled tasks`]}),(0,X.jsxs)(`label`,{className:`tap inline-flex items-center gap-2 text-sm`,children:[(0,X.jsx)(`input`,{type:`checkbox`,checked:e.showCompleted,onChange:n=>t({...e,showCompleted:n.target.checked})}),`Completed tasks`]})]}),n&&(0,X.jsxs)(`div`,{className:`flex flex-col gap-1`,children:[(0,X.jsx)(`label`,{htmlFor:`${i}-sort`,className:`text-sm font-medium`,children:`Sort`}),(0,X.jsxs)(`select`,{id:`${i}-sort`,className:Z,value:e.sort,onChange:n=>t({...e,sort:n.target.value}),children:[(0,X.jsx)(`option`,{value:`priority`,children:`Priority`}),(0,X.jsx)(`option`,{value:`updated`,children:`Recently updated`}),(0,X.jsx)(`option`,{value:`created`,children:`Newest`})]})]})]})}function Q({board:e,mobile:t}){let[n,r]=(0,T.useState)(!1),[i,a]=(0,T.useState)(e.filters),o=l(e=>e.hosts),s=W(e.filters,e=>o[e]?.name??`host`).filter(e=>e.key!==`search`).length,c=t?ie:ae;return(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(h,{icon:(0,X.jsx)(oe,{className:`size-4`}),onClick:()=>{a(e.filters),r(!0)},"aria-label":s?`Filters, ${s} active`:`Filters`,children:[`Filters`,s>0&&(0,X.jsx)(S,{tone:`accent`,children:s})]}),(0,X.jsx)(c,{open:n,onClose:()=>r(!1),title:`Filter tasks`,footer:(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(h,{variant:`ghost`,onClick:()=>a({...H,search:i.search}),children:`Reset`}),(0,X.jsx)(h,{variant:`primary`,onClick:()=>{e.setFilters(i),r(!1)},children:`Show results`})]}),children:(0,X.jsx)(we,{value:i,onChange:a,withSort:t})})]})}function Te({board:e,includeSearch:t}){let n=l(e=>e.hosts),r=W(e.filters,e=>n[e]?.name??`Unknown host`).filter(e=>t||e.key!==`search`);return r.length===0?null:(0,X.jsxs)(`ul`,{"data-testid":`filter-chips`,"aria-label":`Active filters`,className:`flex min-w-0 flex-wrap gap-1.5`,children:[r.map(t=>(0,X.jsx)(`li`,{className:`min-w-0`,children:(0,X.jsxs)(`button`,{type:`button`,onClick:()=>e.setFilters(t.clear(e.filters)),"aria-label":`Remove filter ${t.label}`,className:`tap inline-flex max-w-full items-center gap-1 rounded-full border border-border bg-surface-2 px-2.5 py-0.5 text-xs font-medium`,children:[(0,X.jsx)(`span`,{className:`truncate`,children:t.label}),(0,X.jsx)(x,{"aria-hidden":!0,className:`size-3.5 shrink-0`})]})},t.key)),r.length>1&&(0,X.jsx)(`li`,{children:(0,X.jsx)(`button`,{type:`button`,className:`tap rounded px-2 py-0.5 text-xs font-medium text-accent`,onClick:()=>e.setFilters({...H,sort:e.filters.sort}),children:`Clear all`})})]})}function Ee({board:e}){let t=l(e=>e.tasks),n=l(e=>e.runs),r=l(e=>e.hosts),i=l(e=>e.interactions),{offline:a,pending:o}=(0,T.useMemo)(()=>{let a=new Set,o=new Set;for(let i of Object.values(t)){if(e.projectId&&i.projectId!==e.projectId)continue;i.sessionId&&o.add(i.sessionId);let t=i.currentRunId?n[i.currentRunId]:void 0;if(i.state===`in_progress`&&t?.hostId){let e=r[t.hostId];e&&e.connectivity!==`connected`&&a.add(e.id)}}let s=Object.values(i).filter(e=>e.state===`pending`&&o.has(e.sessionId)).sort((e,t)=>e.createdAt.localeCompare(t.createdAt));return{offline:[...a].map(e=>r[e]),pending:s}},[t,n,r,i,e.projectId]),c=e.now.error,u=[];for(let e of a)u.push((0,X.jsx)(te,{compact:!0,hostName:e.name,connectivity:e.connectivity===`reconnecting`?`reconnecting`:`unreachable`,lastSeenAt:e.lastSeenAt,detail:`Its In progress tasks keep their last known state; nothing is restarted elsewhere.`},`host-${e.id}`));return o.length>0&&u.push((0,X.jsx)(p,{count:o.length,to:ne.interaction(o[0].sessionId,o[0].id),label:o.length===1?`A task needs your answer`:`${o.length} questions need your answer`},`pending`)),c!=null&&(s(c)&&c.status===404?u.push((0,X.jsx)(ee,{capability:`Queue details`,reason:`This coordinator does not report why Ready tasks are waiting.`},`now`)):u.push((0,X.jsx)(g,{compact:!0,title:`Could not load the dispatch queue`,error:f(c),onRetry:e.now.reload},`now`))),u.length===0?null:(0,X.jsx)(`div`,{className:`flex flex-col gap-2 px-4 pt-2`,children:u})}function $(e,t,n={}){let[r,i]=(0,T.useState)(void 0),[a,o]=(0,T.useState)(null),[s,c]=(0,T.useState)(e!==null),[l,u]=(0,T.useState)(0),d=(0,T.useRef)(t);return d.current=t,(0,T.useEffect)(()=>{if(e===null){c(!1);return}let t=new AbortController;return c(!0),d.current(t.signal).then(e=>{t.signal.aborted||(i(e),o(null))}).catch(e=>{t.signal.aborted||e instanceof DOMException&&e.name===`AbortError`||o(e)}).finally(()=>{t.signal.aborted||c(!1)}),()=>t.abort()},[e,l]),(0,T.useEffect)(()=>{if(!n.refreshMs||e===null)return;let t=setInterval(()=>{document.visibilityState===`visible`&&u(e=>e+1)},n.refreshMs);return()=>clearInterval(t)},[n.refreshMs,e]),{data:r,error:a,loading:s,reload:(0,T.useCallback)(()=>u(e=>e+1),[])}}function De(e=!0){let t=$(e?`now`:null,e=>d(`/api/now`,void 0,e),{refreshMs:15e3}),n=l(e=>e.tasks),r=l(e=>e.runs),i=l(e=>e.dispatchPaused),a=(0,T.useRef)(!0),{reload:o}=t;return(0,T.useEffect)(()=>{if(a.current){a.current=!1;return}if(!e)return;let t=setTimeout(o,500);return()=>clearTimeout(t)},[n,r,i,e,o]),t}export{R as A,ge as C,F as D,j as E,P as M,N,I as O,A as P,me as S,k as T,le as _,Ce as a,_e as b,ye as c,H as d,V as f,he as g,ve as h,Se as i,z as j,M as k,be as l,se as m,$ as n,Q as o,Y as p,Ee as r,Te as s,De as t,xe as u,pe as v,ce as w,de as x,U as y};
|
|
2
|
-
//# sourceMappingURL=useNow-Bc_NlDY3.js.map
|