@runfusion/fusion 0.43.1 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/dist/automation-store-EKXXEE2S.js +10 -0
- package/dist/automation-store-PLNG3X72.js +10 -0
- package/dist/automation-store-RDDYZFUJ.js +10 -0
- package/dist/bin.js +14420 -3360
- package/dist/chunk-2JI3F6MG.js +948 -0
- package/dist/chunk-4L6CLWJC.js +8345 -0
- package/dist/chunk-4VNS5WPM.js +42 -0
- package/dist/chunk-5RGECGQL.js +1139 -0
- package/dist/chunk-6JDLN7IL.js +409 -0
- package/dist/chunk-AICJATVW.js +948 -0
- package/dist/chunk-AWKNRUOR.js +1148 -0
- package/dist/chunk-BHM3UYWS.js +4651 -0
- package/dist/chunk-BMUXDSBF.js +4647 -0
- package/dist/chunk-GETECT6V.js +353 -0
- package/dist/chunk-GUV4QQT3.js +1143 -0
- package/dist/chunk-JKQO7YYZ.js +8369 -0
- package/dist/chunk-LYZVU6UV.js +409 -0
- package/dist/chunk-MAN4WYHO.js +353 -0
- package/dist/chunk-MCUG2Z7M.js +4651 -0
- package/dist/chunk-PSDYB45U.js +948 -0
- package/dist/chunk-RR2HM46R.js +8345 -0
- package/dist/chunk-RXMQ5OMY.js +9226 -0
- package/dist/chunk-S2EVJUY3.js +353 -0
- package/dist/chunk-UXR5XZFZ.js +409 -0
- package/dist/client/.vite/manifest.json +1138 -340
- package/dist/client/assets/AgentDetailView-CgbB51Iw.css +1 -0
- package/dist/client/assets/AgentDetailView-DJTi6hKC.js +18 -0
- package/dist/client/assets/{AgentPermissionPolicyEditor-BiY1a4KR.js → AgentPermissionPolicyEditor-C5DR9dUS.js} +2 -2
- package/dist/client/assets/AgentsView-BNd90PSx.js +29 -0
- package/dist/client/assets/AgentsView-CzMa5Olf.css +1 -0
- package/dist/client/assets/ChatView-B7JaZCL_.js +19 -0
- package/dist/client/assets/ChatView-BtjkE0V7.css +1 -0
- package/dist/client/assets/CommandCenter-CHO21xEW.js +74 -0
- package/dist/client/assets/CommandCenter-Xs5Ftv8s.css +1 -0
- package/dist/client/assets/DevServerView-B_p91Mj_.css +1 -0
- package/dist/client/assets/DevServerView-H9OkT1ld.js +1 -0
- package/dist/client/assets/{DirectoryPicker-DTKtd8L2.css → DirectoryPicker-0rspvcMz.css} +1 -1
- package/dist/client/assets/DirectoryPicker-DegxT8ia.js +1 -0
- package/dist/client/assets/DocumentsView-kVVQYISc.js +1 -0
- package/dist/client/assets/EvalsView-C9-iTSat.js +1 -0
- package/dist/client/assets/EvalsView-CTbgPUne.css +1 -0
- package/dist/client/assets/ExperimentalAgentOnboardingModal-3ZEFv8sr.css +1 -0
- package/dist/client/assets/ExperimentalAgentOnboardingModal-DjP_xNkc.js +1 -0
- package/dist/client/assets/GoalsView-CUh8JBnJ.css +1 -0
- package/dist/client/assets/GoalsView-VoIHJJ5l.js +2 -0
- package/dist/client/assets/InsightsView-BIZaUcpd.js +11 -0
- package/dist/client/assets/InsightsView-C7yRTMPn.css +1 -0
- package/dist/client/assets/MemoryView-7v7rv6ns.js +2 -0
- package/dist/client/assets/MemoryView-CBDUr2Jy.css +1 -0
- package/dist/client/assets/PiExtensionsManager-CB89rV4U.js +11 -0
- package/dist/client/assets/PluginManager-BNSuW_R4.js +1 -0
- package/dist/client/assets/PluginManager-DSiHizRD.css +1 -0
- package/dist/client/assets/PullRequestView-CI5jdKBL.js +6 -0
- package/dist/client/assets/PullRequestView-CpdE3Yo_.css +1 -0
- package/dist/client/assets/ResearchView-BT5dR_m8.js +1 -0
- package/dist/client/assets/ResearchView-DIVNQF4_.css +1 -0
- package/dist/client/assets/SecretsView-CvFioX7R.css +1 -0
- package/dist/client/assets/SecretsView-WPYI58Uo.js +1 -0
- package/dist/client/assets/SessionTerminal-C6gyOWLt.js +2 -0
- package/dist/client/assets/SessionTerminal-D4R3ScvQ.css +1 -0
- package/dist/client/assets/SettingsModal-BESN59Ao.css +1 -0
- package/dist/client/assets/SettingsModal-BZokaNyx.css +1 -0
- package/dist/client/assets/SettingsModal-Bq_3AbaB.js +1 -0
- package/dist/client/assets/SettingsModal-JHACoQJe.js +21 -0
- package/dist/client/assets/SetupWizardModal-CrgbnR_d.js +2 -0
- package/dist/client/assets/ShadcnColorPicker-1icHuwhC.js +11 -0
- package/dist/client/assets/ShadcnColorPicker-pqVWCC5-.css +1 -0
- package/dist/client/assets/SkillsView-CJ8snrma.css +1 -0
- package/dist/client/assets/SkillsView-byuSe3e0.js +1 -0
- package/dist/client/assets/TodoView-CIsL_uvQ.css +1 -0
- package/dist/client/assets/TodoView-CQ9GjYBg.js +6 -0
- package/dist/client/assets/WorkflowNodeEditor-DW7sJZUX.js +8 -0
- package/dist/client/assets/WorkflowNodeEditor-f_XPV5Jd.css +1 -0
- package/dist/client/assets/{addon-fit-B4jkcKk4.js → addon-fit-C1WQXRvu.js} +1 -1
- package/dist/client/assets/{addon-unicode11-Cdne2Sj4.js → addon-unicode11-BVmNDUBM.js} +1 -1
- package/dist/client/assets/{addon-web-links-CRNLzj7m.js → addon-web-links-CkVew5xs.js} +1 -1
- package/dist/client/assets/{addon-webgl-CeCSULF1.js → addon-webgl-uLc0RKcC.js} +1 -1
- package/dist/client/assets/agentSkills-CeytXLHF.js +1 -0
- package/dist/client/assets/agentSkills-bQJ4X1gH.css +1 -0
- package/dist/client/assets/agentsOrgChartLayout-BMvyuaLA.js +1 -0
- package/dist/client/assets/app-3wbZ08YC.js +13 -0
- package/dist/client/assets/app-7-5DWLtg.js +13 -0
- package/dist/client/assets/app-CSvE5Noc.js +13 -0
- package/dist/client/assets/app-CZ2LTFce.js +13 -0
- package/dist/client/assets/app-Cv9xEnll.js +13 -0
- package/dist/client/assets/app-x_yPcO5Y.js +13 -0
- package/dist/client/assets/arc-cxkkNsnK.js +1 -0
- package/dist/client/assets/architectureDiagram-3BPJPVTR-BRI0QwDf.js +36 -0
- package/dist/client/assets/band-CquvqAHh.js +1 -0
- package/dist/client/assets/blockDiagram-GPEHLZMM-BXkN8Hv_.js +132 -0
- package/dist/client/assets/c4Diagram-AAUBKEIU-C_Kcokep.js +10 -0
- package/dist/client/assets/channel-Clzpzu32.js +1 -0
- package/dist/client/assets/chunk-2J33WTMH-BGeuCz9C.js +1 -0
- package/dist/client/assets/chunk-4BX2VUAB-DcVdctr0.js +1 -0
- package/dist/client/assets/chunk-55IACEB6-Dg6gDigQ.js +1 -0
- package/dist/client/assets/chunk-727SXJPM-B9B-vlEb.js +206 -0
- package/dist/client/assets/chunk-AQP2D5EJ-LrWQ-2yi.js +231 -0
- package/dist/client/assets/chunk-FMBD7UC4-Bnd6hAED.js +15 -0
- package/dist/client/assets/chunk-ND2GUHAM-nAw93UB5.js +1 -0
- package/dist/client/assets/chunk-QZHKN3VN-CgprKcZo.js +1 -0
- package/dist/client/assets/classDiagram-4FO5ZUOK-CzYHP-af.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-CzYHP-af.js +1 -0
- package/dist/client/assets/common-BDp2y6CF.js +1 -0
- package/dist/client/assets/common-BnEo5fLN.js +1 -0
- package/dist/client/assets/common-Bzr_Y8h4.js +1 -0
- package/dist/client/assets/common-CvwyFzfv.js +1 -0
- package/dist/client/assets/common-CztCXRkz.js +1 -0
- package/dist/client/assets/common-DPe2mbb7.js +1 -0
- package/dist/client/assets/cose-bilkent-S5V4N54A-Bhn0g_iK.js +1 -0
- package/dist/client/assets/cytoscape.esm-OyMbaexL.js +331 -0
- package/dist/client/assets/dagre-BM42HDAG-CP4kfwqd.js +4 -0
- package/dist/client/assets/{dashboard-view-C3SsjXo1.js → dashboard-view-CM6Xin_H.js} +1680 -1620
- package/dist/client/assets/dashboard-view-DV1nEhh9.js +1 -0
- package/dist/client/assets/dashboard-view-D_zsA-kz.css +1 -0
- package/dist/client/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/client/assets/diagram-2AECGRRQ-DPhzVEUf.js +43 -0
- package/dist/client/assets/diagram-5GNKFQAL-8QOC3K_L.js +10 -0
- package/dist/client/assets/diagram-KO2AKTUF-C1twgEch.js +3 -0
- package/dist/client/assets/diagram-LMA3HP47-3bEegSuf.js +24 -0
- package/dist/client/assets/diagram-OG6HWLK6-BJ_x0rm6.js +24 -0
- package/dist/client/assets/erDiagram-TEJ5UH35-DNiiS5q6.js +85 -0
- package/dist/client/assets/flowDiagram-I6XJVG4X-DoouPklt.js +162 -0
- package/dist/client/assets/{folder-open-Bw1mxVfa.js → folder-open-CuUs2W7f.js} +1 -1
- package/dist/client/assets/ganttDiagram-6RSMTGT7-BrR6VnP5.js +292 -0
- package/dist/client/assets/gitGraphDiagram-PVQCEYII-BV8_J6Ee.js +106 -0
- package/dist/client/assets/graph--OzhPTMs.js +1 -0
- package/dist/client/assets/index-BZBQ_KsL.css +1 -0
- package/dist/client/assets/index-CZcWjLAb.js +1459 -0
- package/dist/client/assets/infoDiagram-5YYISTIA-DGwIIFkR.js +2 -0
- package/dist/client/assets/init-Dmth1JHB.js +1 -0
- package/dist/client/assets/ishikawaDiagram-YF4QCWOH-D5dEH4RE.js +70 -0
- package/dist/client/assets/journeyDiagram-JHISSGLW-BuuSWPw5.js +139 -0
- package/dist/client/assets/kanban-definition-UN3LZRKU-DA34uUla.js +89 -0
- package/dist/client/assets/katex-HP8lGamR.js +257 -0
- package/dist/client/assets/layout-SsrduOYp.js +1 -0
- package/dist/client/assets/linear-dXivciGL.js +1 -0
- package/dist/client/assets/mermaid.core-Ch4HatqA.js +309 -0
- package/dist/client/assets/mindmap-definition-RKZ34NQL-DUCG-qD3.js +96 -0
- package/dist/client/assets/ordinal-DILIJJjt.js +1 -0
- package/dist/client/assets/pieDiagram-4H26LBE5-DWvFGiLa.js +30 -0
- package/dist/client/assets/quadrantDiagram-W4KKPZXB-OPTVW3WT.js +7 -0
- package/dist/client/assets/requirementDiagram-4Y6WPE33-D7feZvlU.js +84 -0
- package/dist/client/assets/sankeyDiagram-5OEKKPKP-AtnSsEX1.js +40 -0
- package/dist/client/assets/sequenceDiagram-3UESZ5HK-BZjHUeI5.js +162 -0
- package/dist/client/assets/shield-alert-CzaF9ROV.js +6 -0
- package/dist/client/assets/stateDiagram-AJRCARHV-C8j23Pvn.js +1 -0
- package/dist/client/assets/stateDiagram-v2-BHNVJYJU-CiZR_S5-.js +1 -0
- package/dist/client/assets/step-yuy0qJer.js +1 -0
- package/dist/client/assets/time-DoDTxsna.js +1 -0
- package/dist/client/assets/timeline-definition-PNZ67QCA-DvfNz25n.js +120 -0
- package/dist/client/assets/{upload-BCmd-1I0.js → upload-DTsYywhN.js} +1 -1
- package/dist/client/assets/{users-DO_t3V1p.js → users-yAd09tKP.js} +1 -1
- package/dist/client/assets/{vendor-i18n-CV0mwX_-.js → vendor-i18n-GF3RlKbq.js} +2 -2
- package/dist/client/assets/vendor-react-SZ_qB27O.js +49 -0
- package/dist/client/assets/vendor-reactflow-Bg-Qjzh8.js +15 -0
- package/dist/client/assets/{vendor-xterm-tcedd2Jt.js → vendor-xterm-BNq00GSj.js} +1 -1
- package/dist/client/assets/vennDiagram-CIIHVFJN-CG2aMt3v.js +34 -0
- package/dist/client/assets/wardley-L42UT6IY-BnhBteen.js +173 -0
- package/dist/client/assets/wardleyDiagram-YWT4CUSO-DwqTzM3T.js +78 -0
- package/dist/client/assets/xychartDiagram-2RQKCTM6-5Cv2ZKMV.js +7 -0
- package/dist/client/assets/zoom-out-NWbVkreR.js +41 -0
- package/dist/client/icons/icon-192.png +0 -0
- package/dist/client/icons/icon-512.png +0 -0
- package/dist/client/index.html +30 -10
- package/dist/client/sw.js +1 -1
- package/dist/client/theme-data.css +3348 -469
- package/dist/client/version.json +1 -1
- package/dist/droid-cli/index.ts +56 -40
- package/dist/droid-cli/package.json +1 -1
- package/dist/droid-cli/src/__tests__/execsync-guard.test.ts +17 -0
- package/dist/droid-cli/src/__tests__/index.test.ts +47 -21
- package/dist/droid-cli/src/__tests__/process-manager.test.ts +51 -78
- package/dist/extension.js +9651 -1556
- package/dist/extract-zip-WL55Z3AU.js +2497 -0
- package/dist/index.min-CHQ3ABYJ.js +2926 -0
- package/dist/memory-dreams-7USISKVE.js +32 -0
- package/dist/memory-dreams-PBPISUDD.js +32 -0
- package/dist/memory-dreams-XNO2B2QF.js +32 -0
- package/dist/migration-EH2YOCYQ.js +15 -0
- package/dist/migration-PLGTTKL5.js +15 -0
- package/dist/migration-WZEZK22R.js +15 -0
- package/dist/pi-claude-cli/index.ts +47 -8
- package/dist/pi-claude-cli/package.json +4 -1
- package/dist/pi-claude-cli/src/__tests__/acp-dispatch.test.ts +80 -0
- package/dist/pi-claude-cli/src/__tests__/acp-driver.test.ts +423 -0
- package/dist/pi-claude-cli/src/__tests__/execsync-guard.test.ts +14 -0
- package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +26 -45
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +0 -1
- package/dist/pi-claude-cli/src/acp-driver.ts +585 -0
- package/dist/pi-claude-cli/src/event-bridge.ts +7 -0
- package/dist/pi-claude-cli/src/mcp-config.ts +29 -0
- package/dist/pi-claude-cli/src/process-manager.ts +17 -39
- package/dist/plugin-sdk/index.d.ts +5305 -5148
- package/dist/plugins/fusion-plugin-acp-runtime/bundled.js +263 -19
- package/dist/plugins/fusion-plugin-acp-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-cli-printing-press/package.json +1 -1
- package/dist/plugins/fusion-plugin-compound-engineering/bundled.js +37 -7
- package/dist/plugins/fusion-plugin-compound-engineering/manifest.json +4 -4
- package/dist/plugins/fusion-plugin-compound-engineering/package.json +1 -1
- package/dist/plugins/fusion-plugin-cursor-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-dependency-graph/package.json +1 -1
- package/dist/plugins/fusion-plugin-droid-runtime/bundled.js +69 -45
- package/dist/plugins/fusion-plugin-droid-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-hermes-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-openclaw-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-paperclip-runtime/package.json +1 -1
- package/dist/plugins/fusion-plugin-reports/package.json +1 -1
- package/dist/plugins/fusion-plugin-roadmap/bundled.js +5 -11
- package/dist/plugins/fusion-plugin-roadmap/manifest.json +1 -11
- package/dist/plugins/fusion-plugin-roadmap/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/src/__tests__/index.test.ts +5 -1
- package/dist/routine-store-GIJ6MXWY.js +10 -0
- package/dist/routine-store-HTVC2PUQ.js +10 -0
- package/dist/routine-store-KGHZBPDF.js +10 -0
- package/package.json +3 -3
- package/skill/fusion/SKILL.md +1 -1
- package/skill/fusion/references/cli-commands.md +2 -1
- package/skill/fusion/references/engine-tools.md +6 -4
- package/skill/fusion/references/extension-tools.md +10 -0
- package/skill/fusion/references/fusion-capabilities.md +3 -1
- package/dist/client/assets/AgentDetailView-BGN03dyz.css +0 -1
- package/dist/client/assets/AgentDetailView-DKMz3r04.js +0 -18
- package/dist/client/assets/AgentsView-Co-k4vjh.js +0 -29
- package/dist/client/assets/AgentsView-DfznJDek.css +0 -1
- package/dist/client/assets/ChatView-BkAG99bj.js +0 -6
- package/dist/client/assets/ChatView-DwJAd5G1.css +0 -1
- package/dist/client/assets/DevServerView-C6DC0URX.js +0 -1
- package/dist/client/assets/DevServerView-VTQY28P7.css +0 -1
- package/dist/client/assets/DirectoryPicker-CkcGjyv0.js +0 -1
- package/dist/client/assets/DocumentsView-OCK1Vsw_.js +0 -1
- package/dist/client/assets/DocumentsView-WfVoTZt8.css +0 -1
- package/dist/client/assets/EvalsView-CUNJ1TLc.css +0 -1
- package/dist/client/assets/EvalsView-CUfyj5GW.js +0 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-BNpveCEk.css +0 -1
- package/dist/client/assets/ExperimentalAgentOnboardingModal-Dau9RTU_.js +0 -499
- package/dist/client/assets/GoalsView-CNLTn0rX.js +0 -2
- package/dist/client/assets/GoalsView-DI66UsjT.css +0 -1
- package/dist/client/assets/InsightsView-BQPxHxKI.js +0 -11
- package/dist/client/assets/InsightsView-C9-mqVvf.css +0 -1
- package/dist/client/assets/MemoryView-D3xQIFjj.js +0 -2
- package/dist/client/assets/MemoryView-zaXewZzi.css +0 -1
- package/dist/client/assets/NodesView-7VInxyf_.css +0 -1
- package/dist/client/assets/NodesView-CSMvGwDU.js +0 -14
- package/dist/client/assets/PiExtensionsManager-BtqXF3fl.js +0 -11
- package/dist/client/assets/PluginManager-CSSDb3VO.js +0 -1
- package/dist/client/assets/PluginManager-UHVLvWWl.css +0 -1
- package/dist/client/assets/PullRequestView-Bjyfffdu.js +0 -6
- package/dist/client/assets/PullRequestView-WQIS0zUC.css +0 -1
- package/dist/client/assets/ReliabilityView-QKMUDebT.js +0 -1
- package/dist/client/assets/ReliabilityView-eoKBhBc4.css +0 -1
- package/dist/client/assets/ResearchView-CRU_NPho.js +0 -1
- package/dist/client/assets/ResearchView-DTh8FLUm.css +0 -1
- package/dist/client/assets/SecretsView-Bs8ySyC5.js +0 -1
- package/dist/client/assets/SecretsView-Djo1rahi.css +0 -1
- package/dist/client/assets/SessionTerminal-BiigPP2l.css +0 -1
- package/dist/client/assets/SessionTerminal-Dk1NgmN2.js +0 -2
- package/dist/client/assets/SettingsModal-DpAxDq6M.css +0 -1
- package/dist/client/assets/SettingsModal-JCaNvdAb.js +0 -31
- package/dist/client/assets/SettingsModal-Nw5cTKAK.js +0 -1
- package/dist/client/assets/SettingsModal-nF_GaeeK.css +0 -1
- package/dist/client/assets/SetupWizardModal-CE79myEy.js +0 -1
- package/dist/client/assets/SetupWizardModal-CIqFbkrD.css +0 -1
- package/dist/client/assets/SkillsView-3bhGyWs1.css +0 -1
- package/dist/client/assets/SkillsView-Dc8YskAX.js +0 -1
- package/dist/client/assets/StashRecoveryView-B_8WIQEo.css +0 -1
- package/dist/client/assets/StashRecoveryView-CqKOFiXT.js +0 -1
- package/dist/client/assets/TodoView-7xIh-Fmi.css +0 -1
- package/dist/client/assets/TodoView-BqIRwcZw.js +0 -6
- package/dist/client/assets/WorkflowNodeEditor-2jDuk2FR.js +0 -8
- package/dist/client/assets/WorkflowNodeEditor-BokhW3de.css +0 -1
- package/dist/client/assets/app-B2ZxMfJT.js +0 -13
- package/dist/client/assets/app-BffGU_HQ.js +0 -13
- package/dist/client/assets/app-C8AHhs5N.js +0 -13
- package/dist/client/assets/app-CUu1sm3x.js +0 -13
- package/dist/client/assets/app-Ri9Te2Dv.js +0 -13
- package/dist/client/assets/app-sEkTyT-w.js +0 -13
- package/dist/client/assets/common-BRyX4VxB.js +0 -1
- package/dist/client/assets/common-CN9QPI2d.js +0 -1
- package/dist/client/assets/common-CNbjPELi.js +0 -1
- package/dist/client/assets/common-DFDqu_n0.js +0 -1
- package/dist/client/assets/common-DgWWKG8Z.js +0 -1
- package/dist/client/assets/common-X6PzBnVA.js +0 -1
- package/dist/client/assets/createLucideIcon-BYvOGRiO.js +0 -21
- package/dist/client/assets/dashboard-view-BhbN8LPh.js +0 -1
- package/dist/client/assets/dashboard-view-DdGlfuu-.css +0 -1
- package/dist/client/assets/dashboard-view-DlKsVySD.js +0 -3
- package/dist/client/assets/dashboard-view-Du53JbmQ.css +0 -1
- package/dist/client/assets/index-CpTBp1RG.js +0 -793
- package/dist/client/assets/index-DqhCiU35.css +0 -1
- package/dist/client/assets/vendor-react-D37HfzIf.js +0 -49
- package/dist/client/assets/vendor-reactflow-CRZcPCXF.js +0 -15
- package/dist/client/assets/x-CqNX_9E2.js +0 -61
- package/dist/client/assets/zoom-out-CSTHbJgD.js +0 -21
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={cancel:"Cancelar",close:"Cerrar",save:"Guardar"},o={ratings:{trendDeclining:"",trendImproving:"",trendInsufficient:"",trendStable:""},reflections:{triggerManual:"",triggerPeriodic:"",triggerPostTask:"",triggerUserRequested:""},time:{daysAgo_one:"",daysAgo_other:"",hoursAgo_one:"",hoursAgo_other:"",inAMoment:"",inDays_one:"",inDays_other:"",inHours_one:"",inHours_other:"",inMinutes_one:"",inMinutes_other:"",justNow:"",minutesAgo_one:"",minutesAgo_other:""}},t="Archivar",n={rejection:{capacityExhausted:"",guardRejected:"",mergeBlocked:"",unknownColumn:"",workflowMismatch:""}},i="Cancelar",r={failedToGetResponse:"",failureReferenceId:"",failureReferenceKind:"",failureReferenceLabel:"",failureReferenceMetaLabel:"",openMailboxMessage:"",toolCallArgsPrefix:"",toolCallResultPrefix:"",toolCallStatusCompleted:"",toolCallStatusError:"",toolCallStatusErrors:"",toolCallStatusRunning:"",toolCallsCount_one:"",toolCallsCount_other:"",toolCallsHeader:"",viewFailureDetails:""},a="Cerrar",s={archived:"Archivado",done:"Hecho","in-progress":"En progreso","in-review":"En revisión",todo:"Por hacer",triage:"Planificación"},l={anomaly:{duplicateActiveId:"",idInBothStorages:"",sequenceOverlap:"",unknownPrefix:""}},c={connecting:"",error:"",offline:"",online:""},u={unknown:""},d={autopilotStateActivating:"",autopilotStateCompleting:"",autopilotStateInactive:"",autopilotStateUnknown:"",autopilotStateWatching:"",interviewStatusAwaitingInput:"",interviewStatusComplete:"",interviewStatusError:"",interviewStatusGenerating:"",runHelperActive:"",runHelperBlocked:"",runHelperPlanning:""},g={messages:{modelSetTo:"",modelSetToDefault:""}},p={connecting:"",error:"",offline:"",online:"",unknown:""},m={auth:{differ:"",differProviders:"",match:"",notSynced:""},status:{connecting:"",creating:"",deleting:"",error:"",exited:"",offline:"",online:"",recreating:"",running:"",stopped:""}},f="Actualizar",h={providerGitHub:"",providerLlmSynthesis:"",providerLocalDocs:"",providerPageFetch:"",providerWebSearch:""},S="Reintentar",k={policyLabel:{block:"",fallback:"",notConfigured:""}},v={apiKeyFormatError:"",apiKeyLabel:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyPlaceholder:{fallback:"",kimiCoding:"",minimax:"",zai:""},apiKeyRequired:"",apiKeySetup:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyUsage:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},providerDesc:{anthropic:"",fallback:"",gemini:"",google:"",kimi:"",kimiCoding:"",minimax:"",moonshot:"",ollama:"",openai:"",openaiCodex:"",openrouter:"",zai:""}},C="Omitir",w={nodeStatusConnecting:"",nodeStatusError:"",nodeStatusOffline:"",nodeStatusOnline:"",phasePostMerge:"",phasePreMerge:""},y={never:"",refreshSourceBackground:"",refreshSourceInitialLoad:"",refreshSourceManual:""},A="Reintentar",b={postMerge:"",preMerge:"",statusAdvisory:"",statusFailed:"",statusPassed:"",statusRunning:"",statusSkipped:"",waitingForOutput:""},P={actions:e,agents:o,archive:t,board:n,cancel:i,chat:r,close:a,columns:s,delete:"Eliminar",health:l,inline:c,merge:u,missions:d,models:g,nodeStatus:p,nodes:m,refresh:f,research:h,retry:S,routing:k,setup:v,skip:C,taskForm:w,taskReview:y,tryAgain:A,workflow:b};export{e as actions,o as agents,t as archive,n as board,i as cancel,r as chat,a as close,s as columns,P as default,l as health,c as inline,u as merge,d as missions,g as models,p as nodeStatus,m as nodes,f as refresh,h as research,S as retry,k as routing,v as setup,C as skip,w as taskForm,y as taskReview,A as tryAgain,b as workflow};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={cancel:"Cancel",close:"Close",save:"Save"},o={ratings:{trendDeclining:"↓ Declining",trendImproving:"↑ Improving",trendInsufficient:"Insufficient data",trendStable:"→ Stable"},reflections:{triggerManual:"Manual",triggerPeriodic:"Periodic",triggerPostTask:"Post-Task",triggerUserRequested:"User Requested"},time:{daysAgo_one:"{{count}}d ago",daysAgo_other:"{{count}}d ago",hoursAgo_one:"{{count}}h ago",hoursAgo_other:"{{count}}h ago",inAMoment:"in a moment",inDays_one:"in {{count}}d",inDays_other:"in {{count}}d",inHours_one:"in {{count}}h",inHours_other:"in {{count}}h",inMinutes_one:"in {{count}}m",inMinutes_other:"in {{count}}m",justNow:"just now",minutesAgo_one:"{{count}}m ago",minutesAgo_other:"{{count}}m ago"}},n="Archive",t={rejection:{capacityExhausted:"That column is at capacity. Try again when a slot frees up.",guardRejected:"This move is not allowed by the workflow.",mergeBlocked:"This task is blocked from completing until its merge step finishes.",unknownColumn:"That column doesn't exist in this task's workflow.",workflowMismatch:"Drag can't move a card between workflows. Use the workflow switcher instead."}},i="Cancel",a={failedToGetResponse:"Failed to get response",failureReferenceId:"ID",failureReferenceKind:"Kind",failureReferenceLabel:"Reference",failureReferenceMetaLabel:"Label",openMailboxMessage:"Open mailbox message",toolCallArgsPrefix:"args",toolCallResultPrefix:"result",toolCallStatusCompleted:"completed",toolCallStatusError:"error",toolCallStatusErrors:"errors",toolCallStatusRunning:"running",toolCallsCount_one:"{{count}} tool calls",toolCallsCount_other:"{{count}} tool calls",toolCallsHeader:"Tool calls",viewFailureDetails:"View failure details"},r="Close",s={archived:"Archived",done:"Done","in-progress":"In Progress","in-review":"In Review",todo:"Todo",triage:"Planning"},l={anomaly:{duplicateActiveId:"Duplicate active task ID",idInBothStorages:"Task ID present in active and archived storage",sequenceOverlap:"Allocator next sequence overlaps an existing task ID",unknownPrefix:"Task row uses a prefix outside allocator state"}},c={connecting:"Connecting",error:"Error",offline:"Offline",online:"Online"},u={unknown:"Unknown"},d={autopilotStateActivating:"Activating slice",autopilotStateCompleting:"Completing",autopilotStateInactive:"Off",autopilotStateUnknown:"Unknown",autopilotStateWatching:"Watching",interviewStatusAwaitingInput:"Awaiting input",interviewStatusComplete:"Plan ready",interviewStatusError:"Needs retry",interviewStatusGenerating:"Generating plan",runHelperActive:"Stopping pauses linked tasks and marks the mission blocked.",runHelperBlocked:"Resuming re-activates the mission and continues execution.",runHelperPlanning:"Starting activates the first slice so work can begin."},g={messages:{modelSetTo:"{{label}} model set to {{provider}}/{{modelId}}",modelSetToDefault:"{{label}} model set to default"}},m={connecting:"Connecting",error:"Error",offline:"Offline",online:"Online",unknown:"Unknown"},p={auth:{differ:"Auth credentials differ",differProviders:"Auth credentials differ: {{providers}}",match:"Auth credentials match",notSynced:"Auth not synced"},status:{connecting:"Connecting",creating:"Creating",deleting:"Deleting",error:"Error",exited:"Exited",offline:"Offline",online:"Online",recreating:"Recreating",running:"Running",stopped:"Stopped"}},f="Refresh",h={providerGitHub:"GitHub",providerLlmSynthesis:"LLM Synthesis",providerLocalDocs:"Local Docs",providerPageFetch:"Page Fetch",providerWebSearch:"Web Search"},k="Retry",y={policyLabel:{block:"Block execution",fallback:"Fall back to local",notConfigured:"Not configured"}},A={apiKeyFormatError:"{{providerName}} keys should follow this format: {{hint}} (e.g. {{example}})",apiKeyLabel:{fallback:"API Key",kimiCoding:"Kimi API Key",minimax:"MiniMax API Key",ollama:"Ollama Endpoint",openai:"OpenAI API Key",openrouter:"OpenRouter API Key",zai:"Zhipu AI API Key"},apiKeyPlaceholder:{fallback:"Enter API key",kimiCoding:"Enter your Kimi API key",minimax:"Enter your MiniMax API key",zai:"Enter your Zhipu AI API key"},apiKeyRequired:"API key is required",apiKeySetup:{fallback:"Enter your API key for this provider.",kimiCoding:"Create your API key in the Moonshot platform account settings.",minimax:"Generate an API key from the MiniMax platform developer console.",ollama:"Enter your Ollama endpoint URL (for example http://localhost:11434).",openai:"Create an API key from your OpenAI dashboard under API keys.",openrouter:"Create an API key from your OpenRouter account key management page.",zai:"Create an API key in the Zhipu AI open platform account settings."},apiKeyUsage:{fallback:"Used by Fusion to authenticate requests to this provider",kimiCoding:"Used for Kimi/Moonshot AI models in task execution and planning",minimax:"Used for MiniMax models in task execution",ollama:"Connects to your local Ollama instance",openai:"Used for GPT models in task execution and planning",openrouter:"Routes to multiple AI model providers through a single key",zai:"Used for GLM models in task execution"},providerDesc:{anthropic:"Claude models — strong at reasoning, analysis, and code",fallback:"AI provider — connect to start using AI models",gemini:"Gemini models — multimodal with strong reasoning",google:"Gemini models — multimodal with strong reasoning",kimi:"Kimi by Moonshot AI — long-context capabilities",kimiCoding:"Kimi by Moonshot AI — long-context capabilities",minimax:"MiniMax models — cost-effective for high-volume usage",moonshot:"Kimi by Moonshot AI — long-context capabilities",ollama:"Run open-source models locally on your machine",openai:"GPT models — versatile for a wide range of tasks",openaiCodex:"Codex models by OpenAI — optimized for coding tasks",openrouter:"OpenRouter — route requests across multiple AI providers",zai:"GLM models by Zhipu AI — strong multilingual support"}},v="Skip",I={nodeStatusConnecting:"Connecting",nodeStatusError:"Error",nodeStatusOffline:"Offline",nodeStatusOnline:"Online",phasePostMerge:"Post-merge",phasePreMerge:"Pre-merge"},w={never:"Never",refreshSourceBackground:"Background",refreshSourceInitialLoad:"Initial load",refreshSourceManual:"Manual"},P="Try Again",C={postMerge:"Post-merge",preMerge:"Pre-merge",statusAdvisory:"Advisory failure",statusFailed:"Failed",statusPassed:"Passed",statusRunning:"Running…",statusSkipped:"Skipped",waitingForOutput:"Waiting for agent output…"},b={actions:e,agents:o,archive:n,board:t,cancel:i,chat:a,close:r,columns:s,delete:"Delete",health:l,inline:c,merge:u,missions:d,models:g,nodeStatus:m,nodes:p,refresh:f,research:h,retry:k,routing:y,setup:A,skip:v,taskForm:I,taskReview:w,tryAgain:P,workflow:C};export{e as actions,o as agents,n as archive,t as board,i as cancel,a as chat,r as close,s as columns,b as default,l as health,c as inline,u as merge,d as missions,g as models,m as nodeStatus,p as nodes,f as refresh,h as research,k as retry,y as routing,A as setup,v as skip,I as taskForm,w as taskReview,P as tryAgain,C as workflow};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={cancel:"取消",close:"關閉",save:"儲存"},o={ratings:{trendDeclining:"",trendImproving:"",trendInsufficient:"",trendStable:""},reflections:{triggerManual:"",triggerPeriodic:"",triggerPostTask:"",triggerUserRequested:""},time:{daysAgo_one:"",daysAgo_other:"",hoursAgo_one:"",hoursAgo_other:"",inAMoment:"",inDays_one:"",inDays_other:"",inHours_one:"",inHours_other:"",inMinutes_one:"",inMinutes_other:"",justNow:"",minutesAgo_one:"",minutesAgo_other:""}},t="封存",n={rejection:{capacityExhausted:"",guardRejected:"",mergeBlocked:"",unknownColumn:"",workflowMismatch:""}},i="取消",a={failedToGetResponse:"",failureReferenceId:"",failureReferenceKind:"",failureReferenceLabel:"",failureReferenceMetaLabel:"",openMailboxMessage:"",toolCallArgsPrefix:"",toolCallResultPrefix:"",toolCallStatusCompleted:"",toolCallStatusError:"",toolCallStatusErrors:"",toolCallStatusRunning:"",toolCallsCount_one:"",toolCallsCount_other:"",toolCallsHeader:"",viewFailureDetails:""},r="關閉",s={archived:"已封存",done:"已完成","in-progress":"進行中","in-review":"審查中",todo:"待辦",triage:"規劃"},l={anomaly:{duplicateActiveId:"",idInBothStorages:"",sequenceOverlap:"",unknownPrefix:""}},c={connecting:"",error:"",offline:"",online:""},u={unknown:""},d={autopilotStateActivating:"",autopilotStateCompleting:"",autopilotStateInactive:"",autopilotStateUnknown:"",autopilotStateWatching:"",interviewStatusAwaitingInput:"",interviewStatusComplete:"",interviewStatusError:"",interviewStatusGenerating:"",runHelperActive:"",runHelperBlocked:"",runHelperPlanning:""},g={messages:{modelSetTo:"",modelSetToDefault:""}},p={connecting:"",error:"",offline:"",online:"",unknown:""},m={auth:{differ:"",differProviders:"",match:"",notSynced:""},status:{connecting:"",creating:"",deleting:"",error:"",exited:"",offline:"",online:"",recreating:"",running:"",stopped:""}},f="重新整理",h={providerGitHub:"",providerLlmSynthesis:"",providerLocalDocs:"",providerPageFetch:"",providerWebSearch:""},S="重試",k={policyLabel:{block:"",fallback:"",notConfigured:""}},v={apiKeyFormatError:"",apiKeyLabel:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyPlaceholder:{fallback:"",kimiCoding:"",minimax:"",zai:""},apiKeyRequired:"",apiKeySetup:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyUsage:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},providerDesc:{anthropic:"",fallback:"",gemini:"",google:"",kimi:"",kimiCoding:"",minimax:"",moonshot:"",ollama:"",openai:"",openaiCodex:"",openrouter:"",zai:""}},C="略過",w={nodeStatusConnecting:"",nodeStatusError:"",nodeStatusOffline:"",nodeStatusOnline:"",phasePostMerge:"",phasePreMerge:""},y={never:"",refreshSourceBackground:"",refreshSourceInitialLoad:"",refreshSourceManual:""},b="重試",A={postMerge:"",preMerge:"",statusAdvisory:"",statusFailed:"",statusPassed:"",statusRunning:"",statusSkipped:"",waitingForOutput:""},_={actions:e,agents:o,archive:t,board:n,cancel:i,chat:a,close:r,columns:s,delete:"刪除",health:l,inline:c,merge:u,missions:d,models:g,nodeStatus:p,nodes:m,refresh:f,research:h,retry:S,routing:k,setup:v,skip:C,taskForm:w,taskReview:y,tryAgain:b,workflow:A};export{e as actions,o as agents,t as archive,n as board,i as cancel,a as chat,r as close,s as columns,_ as default,l as health,c as inline,u as merge,d as missions,g as models,p as nodeStatus,m as nodes,f as refresh,h as research,S as retry,k as routing,v as setup,C as skip,w as taskForm,y as taskReview,b as tryAgain,A as workflow};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={cancel:"Annuler",close:"Fermer",save:"Enregistrer"},o={ratings:{trendDeclining:"",trendImproving:"",trendInsufficient:"",trendStable:""},reflections:{triggerManual:"",triggerPeriodic:"",triggerPostTask:"",triggerUserRequested:""},time:{daysAgo_one:"",daysAgo_other:"",hoursAgo_one:"",hoursAgo_other:"",inAMoment:"",inDays_one:"",inDays_other:"",inHours_one:"",inHours_other:"",inMinutes_one:"",inMinutes_other:"",justNow:"",minutesAgo_one:"",minutesAgo_other:""}},n="Archiver",t={rejection:{capacityExhausted:"",guardRejected:"",mergeBlocked:"",unknownColumn:"",workflowMismatch:""}},i="Annuler",r={failedToGetResponse:"",failureReferenceId:"",failureReferenceKind:"",failureReferenceLabel:"",failureReferenceMetaLabel:"",openMailboxMessage:"",toolCallArgsPrefix:"",toolCallResultPrefix:"",toolCallStatusCompleted:"",toolCallStatusError:"",toolCallStatusErrors:"",toolCallStatusRunning:"",toolCallsCount_one:"",toolCallsCount_other:"",toolCallsHeader:"",viewFailureDetails:""},a="Fermer",s={archived:"Archivé",done:"Terminé","in-progress":"En cours","in-review":"En revue",todo:"À faire",triage:"Planification"},l={anomaly:{duplicateActiveId:"",idInBothStorages:"",sequenceOverlap:"",unknownPrefix:""}},c={connecting:"",error:"",offline:"",online:""},u={unknown:""},d={autopilotStateActivating:"",autopilotStateCompleting:"",autopilotStateInactive:"",autopilotStateUnknown:"",autopilotStateWatching:"",interviewStatusAwaitingInput:"",interviewStatusComplete:"",interviewStatusError:"",interviewStatusGenerating:"",runHelperActive:"",runHelperBlocked:"",runHelperPlanning:""},g={messages:{modelSetTo:"",modelSetToDefault:""}},p={connecting:"",error:"",offline:"",online:"",unknown:""},m={auth:{differ:"",differProviders:"",match:"",notSynced:""},status:{connecting:"",creating:"",deleting:"",error:"",exited:"",offline:"",online:"",recreating:"",running:"",stopped:""}},f="Actualiser",h={providerGitHub:"",providerLlmSynthesis:"",providerLocalDocs:"",providerPageFetch:"",providerWebSearch:""},S="Réessayer",k={policyLabel:{block:"",fallback:"",notConfigured:""}},v={apiKeyFormatError:"",apiKeyLabel:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyPlaceholder:{fallback:"",kimiCoding:"",minimax:"",zai:""},apiKeyRequired:"",apiKeySetup:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyUsage:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},providerDesc:{anthropic:"",fallback:"",gemini:"",google:"",kimi:"",kimiCoding:"",minimax:"",moonshot:"",ollama:"",openai:"",openaiCodex:"",openrouter:"",zai:""}},C="Ignorer",y={nodeStatusConnecting:"",nodeStatusError:"",nodeStatusOffline:"",nodeStatusOnline:"",phasePostMerge:"",phasePreMerge:""},w={never:"",refreshSourceBackground:"",refreshSourceInitialLoad:"",refreshSourceManual:""},A="Réessayer",b={postMerge:"",preMerge:"",statusAdvisory:"",statusFailed:"",statusPassed:"",statusRunning:"",statusSkipped:"",waitingForOutput:""},R={actions:e,agents:o,archive:n,board:t,cancel:i,chat:r,close:a,columns:s,delete:"Supprimer",health:l,inline:c,merge:u,missions:d,models:g,nodeStatus:p,nodes:m,refresh:f,research:h,retry:S,routing:k,setup:v,skip:C,taskForm:y,taskReview:w,tryAgain:A,workflow:b};export{e as actions,o as agents,n as archive,t as board,i as cancel,r as chat,a as close,s as columns,R as default,l as health,c as inline,u as merge,d as missions,g as models,p as nodeStatus,m as nodes,f as refresh,h as research,S as retry,k as routing,v as setup,C as skip,y as taskForm,w as taskReview,A as tryAgain,b as workflow};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={cancel:"取消",close:"关闭",save:"保存"},o={ratings:{trendDeclining:"",trendImproving:"",trendInsufficient:"",trendStable:""},reflections:{triggerManual:"",triggerPeriodic:"",triggerPostTask:"",triggerUserRequested:""},time:{daysAgo_one:"",daysAgo_other:"",hoursAgo_one:"",hoursAgo_other:"",inAMoment:"",inDays_one:"",inDays_other:"",inHours_one:"",inHours_other:"",inMinutes_one:"",inMinutes_other:"",justNow:"",minutesAgo_one:"",minutesAgo_other:""}},t="归档",n={rejection:{capacityExhausted:"",guardRejected:"",mergeBlocked:"",unknownColumn:"",workflowMismatch:""}},i="取消",a={failedToGetResponse:"",failureReferenceId:"",failureReferenceKind:"",failureReferenceLabel:"",failureReferenceMetaLabel:"",openMailboxMessage:"",toolCallArgsPrefix:"",toolCallResultPrefix:"",toolCallStatusCompleted:"",toolCallStatusError:"",toolCallStatusErrors:"",toolCallStatusRunning:"",toolCallsCount_one:"",toolCallsCount_other:"",toolCallsHeader:"",viewFailureDetails:""},r="关闭",s={archived:"已归档",done:"已完成","in-progress":"进行中","in-review":"审核中",todo:"待办",triage:"规划"},l={anomaly:{duplicateActiveId:"",idInBothStorages:"",sequenceOverlap:"",unknownPrefix:""}},c={connecting:"",error:"",offline:"",online:""},u={unknown:""},d={autopilotStateActivating:"",autopilotStateCompleting:"",autopilotStateInactive:"",autopilotStateUnknown:"",autopilotStateWatching:"",interviewStatusAwaitingInput:"",interviewStatusComplete:"",interviewStatusError:"",interviewStatusGenerating:"",runHelperActive:"",runHelperBlocked:"",runHelperPlanning:""},g={messages:{modelSetTo:"",modelSetToDefault:""}},p={connecting:"",error:"",offline:"",online:"",unknown:""},m={auth:{differ:"",differProviders:"",match:"",notSynced:""},status:{connecting:"",creating:"",deleting:"",error:"",exited:"",offline:"",online:"",recreating:"",running:"",stopped:""}},f="刷新",h={providerGitHub:"",providerLlmSynthesis:"",providerLocalDocs:"",providerPageFetch:"",providerWebSearch:""},S="重试",k={policyLabel:{block:"",fallback:"",notConfigured:""}},v={apiKeyFormatError:"",apiKeyLabel:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyPlaceholder:{fallback:"",kimiCoding:"",minimax:"",zai:""},apiKeyRequired:"",apiKeySetup:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyUsage:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},providerDesc:{anthropic:"",fallback:"",gemini:"",google:"",kimi:"",kimiCoding:"",minimax:"",moonshot:"",ollama:"",openai:"",openaiCodex:"",openrouter:"",zai:""}},C="跳过",w={nodeStatusConnecting:"",nodeStatusError:"",nodeStatusOffline:"",nodeStatusOnline:"",phasePostMerge:"",phasePreMerge:""},y={never:"",refreshSourceBackground:"",refreshSourceInitialLoad:"",refreshSourceManual:""},b="重试",A={postMerge:"",preMerge:"",statusAdvisory:"",statusFailed:"",statusPassed:"",statusRunning:"",statusSkipped:"",waitingForOutput:""},_={actions:e,agents:o,archive:t,board:n,cancel:i,chat:a,close:r,columns:s,delete:"删除",health:l,inline:c,merge:u,missions:d,models:g,nodeStatus:p,nodes:m,refresh:f,research:h,retry:S,routing:k,setup:v,skip:C,taskForm:w,taskReview:y,tryAgain:b,workflow:A};export{e as actions,o as agents,t as archive,n as board,i as cancel,a as chat,r as close,s as columns,_ as default,l as health,c as inline,u as merge,d as missions,g as models,p as nodeStatus,m as nodes,f as refresh,h as research,S as retry,k as routing,v as setup,C as skip,w as taskForm,y as taskReview,b as tryAgain,A as workflow};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e={cancel:"취소",close:"닫기",save:"저장"},o={ratings:{trendDeclining:"",trendImproving:"",trendInsufficient:"",trendStable:""},reflections:{triggerManual:"",triggerPeriodic:"",triggerPostTask:"",triggerUserRequested:""},time:{daysAgo_one:"",daysAgo_other:"",hoursAgo_one:"",hoursAgo_other:"",inAMoment:"",inDays_one:"",inDays_other:"",inHours_one:"",inHours_other:"",inMinutes_one:"",inMinutes_other:"",justNow:"",minutesAgo_one:"",minutesAgo_other:""}},t="보관",n={rejection:{capacityExhausted:"",guardRejected:"",mergeBlocked:"",unknownColumn:"",workflowMismatch:""}},i="취소",a={failedToGetResponse:"",failureReferenceId:"",failureReferenceKind:"",failureReferenceLabel:"",failureReferenceMetaLabel:"",openMailboxMessage:"",toolCallArgsPrefix:"",toolCallResultPrefix:"",toolCallStatusCompleted:"",toolCallStatusError:"",toolCallStatusErrors:"",toolCallStatusRunning:"",toolCallsCount_one:"",toolCallsCount_other:"",toolCallsHeader:"",viewFailureDetails:""},r="닫기",s={archived:"보관됨",done:"완료","in-progress":"진행 중","in-review":"검토 중",todo:"할 일",triage:"계획"},l={anomaly:{duplicateActiveId:"",idInBothStorages:"",sequenceOverlap:"",unknownPrefix:""}},c={connecting:"",error:"",offline:"",online:""},u={unknown:""},d={autopilotStateActivating:"",autopilotStateCompleting:"",autopilotStateInactive:"",autopilotStateUnknown:"",autopilotStateWatching:"",interviewStatusAwaitingInput:"",interviewStatusComplete:"",interviewStatusError:"",interviewStatusGenerating:"",runHelperActive:"",runHelperBlocked:"",runHelperPlanning:""},g={messages:{modelSetTo:"",modelSetToDefault:""}},p={connecting:"",error:"",offline:"",online:"",unknown:""},m={auth:{differ:"",differProviders:"",match:"",notSynced:""},status:{connecting:"",creating:"",deleting:"",error:"",exited:"",offline:"",online:"",recreating:"",running:"",stopped:""}},f="새로고침",h={providerGitHub:"",providerLlmSynthesis:"",providerLocalDocs:"",providerPageFetch:"",providerWebSearch:""},S="재시도",k={policyLabel:{block:"",fallback:"",notConfigured:""}},v={apiKeyFormatError:"",apiKeyLabel:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyPlaceholder:{fallback:"",kimiCoding:"",minimax:"",zai:""},apiKeyRequired:"",apiKeySetup:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},apiKeyUsage:{fallback:"",kimiCoding:"",minimax:"",ollama:"",openai:"",openrouter:"",zai:""},providerDesc:{anthropic:"",fallback:"",gemini:"",google:"",kimi:"",kimiCoding:"",minimax:"",moonshot:"",ollama:"",openai:"",openaiCodex:"",openrouter:"",zai:""}},C="건너뛰기",w={nodeStatusConnecting:"",nodeStatusError:"",nodeStatusOffline:"",nodeStatusOnline:"",phasePostMerge:"",phasePreMerge:""},y={never:"",refreshSourceBackground:"",refreshSourceInitialLoad:"",refreshSourceManual:""},b="다시 시도",A={postMerge:"",preMerge:"",statusAdvisory:"",statusFailed:"",statusPassed:"",statusRunning:"",statusSkipped:"",waitingForOutput:""},_={actions:e,agents:o,archive:t,board:n,cancel:i,chat:a,close:r,columns:s,delete:"삭제",health:l,inline:c,merge:u,missions:d,models:g,nodeStatus:p,nodes:m,refresh:f,research:h,retry:S,routing:k,setup:v,skip:C,taskForm:w,taskReview:y,tryAgain:b,workflow:A};export{e as actions,o as agents,t as archive,n as board,i as cancel,a as chat,r as close,s as columns,_ as default,l as health,c as inline,u as merge,d as missions,g as models,p as nodeStatus,m as nodes,f as refresh,h as research,S as retry,k as routing,v as setup,C as skip,w as taskForm,y as taskReview,b as tryAgain,A as workflow};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import{r as s}from"./vendor-react-D37HfzIf.js";/**
|
|
2
|
-
* @license lucide-react v0.542.0 - ISC
|
|
3
|
-
*
|
|
4
|
-
* This source code is licensed under the ISC license.
|
|
5
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
6
|
-
*/const C=t=>t.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),w=t=>t.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,r,o)=>o?o.toUpperCase():r.toLowerCase()),i=t=>{const e=w(t);return e.charAt(0).toUpperCase()+e.slice(1)},l=(...t)=>t.filter((e,r,o)=>!!e&&e.trim()!==""&&o.indexOf(e)===r).join(" ").trim(),f=t=>{for(const e in t)if(e.startsWith("aria-")||e==="role"||e==="title")return!0};/**
|
|
7
|
-
* @license lucide-react v0.542.0 - ISC
|
|
8
|
-
*
|
|
9
|
-
* This source code is licensed under the ISC license.
|
|
10
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
11
|
-
*/var h={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/**
|
|
12
|
-
* @license lucide-react v0.542.0 - ISC
|
|
13
|
-
*
|
|
14
|
-
* This source code is licensed under the ISC license.
|
|
15
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
16
|
-
*/const g=s.forwardRef(({color:t="currentColor",size:e=24,strokeWidth:r=2,absoluteStrokeWidth:o,className:n="",children:a,iconNode:u,...c},p)=>s.createElement("svg",{ref:p,...h,width:e,height:e,stroke:t,strokeWidth:o?Number(r)*24/Number(e):r,className:l("lucide",n),...!a&&!f(c)&&{"aria-hidden":"true"},...c},[...u.map(([m,d])=>s.createElement(m,d)),...Array.isArray(a)?a:[a]]));/**
|
|
17
|
-
* @license lucide-react v0.542.0 - ISC
|
|
18
|
-
*
|
|
19
|
-
* This source code is licensed under the ISC license.
|
|
20
|
-
* See the LICENSE file in the root directory of this source tree.
|
|
21
|
-
*/const b=(t,e)=>{const r=s.forwardRef(({className:o,...n},a)=>s.createElement(g,{ref:a,iconNode:e,className:l(`lucide-${C(i(t))}`,`lucide-${t}`,o),...n}));return r.displayName=i(t),r};export{g as I,b as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as t,j as R}from"./vendor-react-D37HfzIf.js";import{cL as Ee,cM as Ye,t as _e,w as Xe,bo as ve}from"./index-CpTBp1RG.js";import{Z as Ae,a as je,M as $e,R as Ge}from"./zoom-out-CSTHbJgD.js";import"./vendor-i18n-CV0mwX_-.js";import"./vendor-reactflow-CRZcPCXF.js";import"./vendor-xterm-tcedd2Jt.js";import"./vendor-codemirror-jBKmHyH0.js";import"./createLucideIcon-BYvOGRiO.js";const ye=4,xe=300,We=24;function Le({taskId:r,position:s,scale:o,canDrag:a,onPositionChange:f,onDragStateChange:c,onDragEnd:m,onDoubleTap:b}){const[C,I]=t.useState(!1),k=t.useRef(null),T=t.useRef(s),E=t.useRef(!1),n=t.useRef(null),h=t.useRef(!1);T.current=s,h.current=C;const l=t.useCallback(()=>{n.current=null},[]),M=t.useCallback(u=>{k.current=null,I(!1),h.current=!1,u&&(c?.(!1),m?.(),E.current=!0,l())},[m,c,l]),z=t.useCallback(u=>{if(!u.isPrimary)return;if(u.defaultPrevented){l();return}const P=Date.now();n.current&&P-n.current.timeStamp>xe&&l(),a&&u.stopPropagation();const D=u.currentTarget;a&&typeof D.setPointerCapture=="function"&&D.setPointerCapture(u.pointerId),k.current={pointerId:u.pointerId,pointerType:u.pointerType,startPointer:{x:u.clientX,y:u.clientY},startPosition:T.current,defaultPrevented:u.defaultPrevented,movedBeyondThreshold:!1}},[a,l]),_=t.useCallback(u=>{const P=k.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation();const D=u.clientX-P.startPointer.x,X=u.clientY-P.startPointer.y,ee=Math.hypot(D,X);if(ee>=ye&&(P.movedBeyondThreshold=!0),!a){P.movedBeyondThreshold&&l();return}if(!h.current&&ee>=ye&&(I(!0),h.current=!0,c?.(!0),l()),ee<ye)return;const L=o>0?o:1;f(r,{x:P.startPosition.x+D/L,y:P.startPosition.y+X/L})},[a,c,f,l,o,r]),W=t.useCallback((u,P)=>{if(!b||P.defaultPrevented||P.movedBeyondThreshold)return Date.now()-(n.current?.timeStamp??0)>xe&&l(),!1;if(P.pointerType==="mouse")return l(),!1;const D={timeStamp:Date.now(),point:{x:P.startPointer.x,y:P.startPointer.y}},X=n.current;return!X||D.timeStamp-X.timeStamp>xe||Math.hypot(D.point.x-X.point.x,D.point.y-X.point.y)>We?(n.current=D,!1):(E.current=!0,l(),b(),!0)},[b,l]),$=t.useCallback(u=>{const P=k.current;if(!P||P.pointerId!==u.pointerId)return;a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId);const D=h.current;!D&&W(u,P)&&u.preventDefault(),M(D)},[a,M,W]),G=t.useCallback(u=>{const P=k.current;!P||P.pointerId!==u.pointerId||(a&&u.stopPropagation(),a&&typeof u.currentTarget.hasPointerCapture=="function"&&u.currentTarget.hasPointerCapture(u.pointerId)&&typeof u.currentTarget.releasePointerCapture=="function"&&u.currentTarget.releasePointerCapture(u.pointerId),l(),M(h.current))},[a,M,l]),j=t.useCallback(u=>{E.current&&(E.current=!1,u.preventDefault(),u.stopPropagation())},[]);return t.useMemo(()=>({isDragging:C,onPointerDown:z,onPointerMove:_,onPointerUp:$,onPointerCancel:G,onClickCapture:j}),[C,j,G,z,_,$])}const Ue=new Set(["planning","researching","executing","finalizing","merging","merging-fix"]);function Fe(r){return r?r.charAt(0).toUpperCase()+r.slice(1):"Executing"}function Be({style:r,position:s,scale:o,isSelected:a=!1,isHighlighted:f=!1,isDimmed:c=!1,onMouseEnter:m,onMouseLeave:b,onClick:C,onNodePositionChange:I,onNodeDragStateChange:k,onNodeDragEnd:T,...E}){const{task:n,globalPaused:h,taskStuckTimeoutMs:l,lastFetchTimeMs:M,onOpenDetail:z}=E,_=n.status==="failed",W=n.paused===!0,$=Ee(n,l,M),G=n.column==="triage"&&n.status==="awaiting-approval",j=!h&&!_&&!W&&!$&&!G&&(n.column==="in-progress"||Ue.has(n.status)),u=typeof n.currentStep=="number"&&n.currentStep>=0&&Array.isArray(n.steps)&&n.currentStep<n.steps.length,P=n.column==="in-review",D=Le({taskId:n.id,position:s,scale:o,canDrag:a,onPositionChange:I,onDragStateChange:k,onDragEnd:T,onDoubleTap:()=>z(n)});return R.jsxs("div",{className:`graph-task-node${a?" graph-node--draggable graph-task-node--selected":""}${D.isDragging?" graph-node--dragging":""}${f?" graph-task-node--highlighted graph-node--highlighted":""}${c?" graph-task-node--dimmed graph-node--dimmed":""}${j?" graph-task-node--active":""}${P?" graph-task-node--in-review":""}`,style:r,draggable:!1,"data-testid":`graph-task-node-${n.id}`,"data-current-step":j&&u?String(n.currentStep):void 0,onMouseEnter:m,onMouseLeave:b,onClick:C,onDoubleClick:X=>{X.defaultPrevented||z(n)},onClickCapture:D.onClickCapture,onPointerDown:D.onPointerDown,onPointerMove:D.onPointerMove,onPointerUp:D.onPointerUp,onPointerCancel:D.onPointerCancel,children:[j?R.jsx("div",{className:"graph-task-active-indicator",children:R.jsx("span",{className:"graph-task-active-indicator-text",children:Fe(n.status)})}):null,R.jsx(Ye,{...E,onOpenDetail:()=>{},disableDrag:!0})]})}function Ze({zoom:r,onZoomIn:s,onZoomOut:o,onFitToGraph:a,onResetView:f}){return R.jsxs("div",{className:"graph-toolbar","data-testid":"graph-toolbar",children:[R.jsx("button",{className:"btn btn-icon",title:"Zoom in (Ctrl+=)","aria-label":"Zoom in",onClick:s,children:R.jsx(Ae,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Zoom out (Ctrl+-)","aria-label":"Zoom out",onClick:o,children:R.jsx(je,{size:16})}),R.jsxs("div",{className:"graph-toolbar__zoom-label","aria-live":"polite",children:[Math.round(r*100),"%"]}),R.jsx("button",{className:"btn btn-icon",title:"Fit to graph (Ctrl+Shift+F)","aria-label":"Fit to graph",onClick:a,children:R.jsx($e,{size:16})}),R.jsx("button",{className:"btn btn-icon",title:"Reset view (Ctrl+0)","aria-label":"Reset view",onClick:f,children:R.jsx(Ge,{size:16})})]})}const Ve=280,Ke=100;function qe({edges:r,positions:s,nodeWidth:o=Ve,nodeHeight:a=Ke,nodeHeights:f,highlightedEdgeIds:c}){const m=!!(c&&c.size>0);return R.jsxs("svg",{className:"dependency-graph-edges","aria-hidden":"true",children:[R.jsx("defs",{children:R.jsx("marker",{id:"dependency-graph-arrowhead",markerWidth:"10",markerHeight:"7",refX:"10",refY:"3.5",orient:"auto",markerUnits:"strokeWidth",children:R.jsx("path",{d:"M 0 0 L 10 3.5 L 0 7 z",fill:"var(--border)"})})}),r.map(b=>{const C=s.get(b.source),I=s.get(b.target);if(!C||!I)return null;const k=`${b.source}->${b.target}`,T=m&&(c?.has(k)??!1),E=C.x+o/2,n=C.y+(f?.get(b.source)??a),h=I.x+o/2,l=I.y,M=n+(l-n)/2;return R.jsx("path",{"data-testid":"dependency-edge","data-edge-id":k,className:`dependency-graph-edge${T?" graph-edge--highlighted":""}${m&&!T?" graph-edge--dimmed":""}`,d:`M ${E} ${n} C ${E} ${M}, ${h} ${M}, ${h} ${l}`,fill:"none",stroke:T?"var(--todo)":"var(--border)",strokeWidth:T?"var(--space-xs)":"var(--btn-border-width)",opacity:m&&!T?.15:1,markerEnd:"url(#dependency-graph-arrowhead)",style:{transition:"opacity var(--transition-fast), stroke var(--transition-fast), stroke-width var(--transition-fast)"}},k)})]})}const Je=new Set(["triage","todo","in-progress","in-review"]);function Qe(r){return r.filter(s=>Je.has(s.column))}const et={nodeWidth:280,nodeHeight:100,horizontalGap:40,verticalGap:80,orientation:"vertical"};function we(r,s){const o={...et,...s},a=r.nodes.map(n=>n.task.id);if(a.length===0)return new Map;const f=new Map,c=new Map;for(const n of a)c.set(n,0),f.set(n,[]);for(const n of r.edges)!c.has(n.source)||!c.has(n.target)||(f.get(n.target)?.push(n.source),c.set(n.source,(c.get(n.source)??0)+1));const m=a.filter(n=>(c.get(n)??0)===0),b=[];for(;m.length>0;){const n=m.shift();b.push(n);for(const h of f.get(n)??[]){const l=(c.get(h)??0)-1;c.set(h,l),l===0&&m.push(h)}}for(const n of a)b.includes(n)||b.push(n);const C=new Map;for(const n of b){const h=r.edges.filter(M=>M.source===n).map(M=>M.target);let l=0;for(const M of h)l=Math.max(l,(C.get(M)??0)+1);C.set(n,l)}const I=new Map;for(const n of a){const h=C.get(n)??0,l=I.get(h)??[];l.push(n),I.set(h,l)}const k=new Map,T=Array.from(I.keys()).sort((n,h)=>n-h),E=new Map;if(o.orientation==="vertical"){let n=0;for(const h of T){E.set(h,n);const l=I.get(h)??[],M=Math.max(o.nodeHeight,...l.map(z=>o.measuredHeights?.get(z)??o.nodeHeight));n+=M+o.verticalGap}}for(const n of T){const h=I.get(n)??[];if(h.sort(),o.orientation==="horizontal"){const W=-(h.reduce((j,u)=>j+(o.measuredHeights?.get(u)??o.nodeHeight),0)+Math.max(0,h.length-1)*o.verticalGap)/2,$=n*(o.nodeWidth+o.horizontalGap);let G=W;for(const j of h)k.set(j,{x:$,y:G}),G+=(o.measuredHeights?.get(j)??o.nodeHeight)+o.verticalGap;continue}const z=-(h.length*o.nodeWidth+Math.max(0,h.length-1)*o.horizontalGap)/2;h.forEach((_,W)=>{const $=z+W*(o.nodeWidth+o.horizontalGap),G=E.get(n)??n*(o.nodeHeight+o.verticalGap);k.set(_,{x:$,y:G})})}return k}function tt(r){return t.useMemo(()=>{const s=r.map(f=>({task:f})),o=new Set(r.map(f=>f.id)),a=r.flatMap(f=>(f.dependencies??[]).filter(c=>o.has(c)).map(c=>({source:f.id,target:c})));return{nodes:s,edges:a}},[r])}const ce=.1,ue=3,Se=40,nt=200;function J(r,s,o){return Math.min(o,Math.max(s,r))}function rt(r){if(!(r instanceof HTMLElement))return!1;const s=r.tagName.toLowerCase();return r.isContentEditable||s==="input"||s==="textarea"||s==="select"}function ot(){const[r,s]=t.useState({x:0,y:0}),[o,a]=t.useState(1),[f,c]=t.useState(!1),m=t.useRef(r),b=t.useRef(o),C=t.useRef(null),I=t.useRef(null),k=t.useRef(new Map),T=t.useRef(null),E=t.useRef({minX:0,minY:0,maxX:0,maxY:0});t.useEffect(()=>{m.current=r},[r]),t.useEffect(()=>{b.current=o},[o]),t.useEffect(()=>()=>{C.current!==null&&window.clearTimeout(C.current)},[]);const n=t.useMemo(()=>`translate(${r.x}px, ${r.y}px) scale(${o})`,[r.x,r.y,o]),h=t.useMemo(()=>Math.round(o*100),[o]),l=t.useCallback(i=>{if(!i){C.current!==null&&(window.clearTimeout(C.current),C.current=null),c(!1);return}c(!0),C.current!==null&&window.clearTimeout(C.current),C.current=window.setTimeout(()=>{c(!1),C.current=null},nt)},[]),M=t.useCallback((i,d,g,S=b.current)=>{const x=E.current;if(x.maxX<=x.minX||x.maxY<=x.minY)return{x:J(i.x,-d,d),y:J(i.y,-g,g)};const U=d-x.maxX*S,O=-x.minX*S,v=g-x.maxY*S,B=-x.minY*S,Z=U>O?(U+O)/2:J(i.x,U,O),K=v>B?(v+B)/2:J(i.y,v,B);return{x:Z,y:K}},[]),z=t.useCallback((i,d,g,S)=>{const x=b.current,U=m.current,O=J(i,ce,ue),v=O/x,B=M({x:d.x-(d.x-U.x)*v,y:d.y-(d.y-U.y)*v},g,S,O);a(O),s(B)},[M]),_=t.useCallback((i,d,g,S)=>{l(!1);const x=S??{x:d/2,y:g/2};z(b.current*i,x,d,g)},[l,z]),W=t.useCallback((i,d)=>{if(i&&d){_(1.2,i,d);return}a(g=>J(g+.1,ce,ue))},[_]),$=t.useCallback((i,d)=>{if(i&&d){_(1/1.2,i,d);return}a(g=>J(g-.1,ce,ue))},[_]),G=t.useCallback(()=>{l(!0),s({x:0,y:0}),a(1)},[l]),j=t.useCallback((i,d,g,S)=>{if(l(!0),i.size===0){s({x:0,y:0}),a(1);return}const x=S?.nodeWidth??280,U=S?.nodeHeight??100,O=Array.from(i.entries()),v=Math.min(...O.map(([,q])=>q.x)),B=Math.min(...O.map(([,q])=>q.y)),Z=Math.max(...O.map(([,q])=>q.x+x)),K=Math.max(...O.map(([q,he])=>he.y+(S?.measuredHeights?.get(q)??U))),te=Math.max(1,Z-v),A=Math.max(1,K-B),oe=Math.max(1,d-Se*2),se=Math.max(1,g-Se*2),ne=J(Math.min(oe/te,se/A),ce,ue),pe=(d-te*ne)/2-v*ne,de=(g-A*ne)/2-B*ne;a(ne),s(M({x:pe,y:de},d,g,ne))},[M,l]),u=t.useCallback((i,d)=>{if(k.current.set(i,d),k.current.size===2){const[g,S]=Array.from(k.current.values());T.current={distance:Math.hypot(g.x-S.x,g.y-S.y),zoom:b.current,pan:m.current,midpoint:{x:(g.x+S.x)/2,y:(g.y+S.y)/2}},I.current=null;return}I.current={start:d,panStart:m.current}},[]),P=t.useCallback((i,d,g,S)=>{if(k.current.has(i)&&k.current.set(i,d),k.current.size===2&&T.current){l(!1);const[O,v]=Array.from(k.current.values()),Z=Math.hypot(O.x-v.x,O.y-v.y)/Math.max(1,T.current.distance),K={x:(O.x+v.x)/2,y:(O.y+v.y)/2},te=J(T.current.zoom*Z,ce,ue),A=te/T.current.zoom,oe=M({x:K.x-(T.current.midpoint.x-T.current.pan.x)*A,y:K.y-(T.current.midpoint.y-T.current.pan.y)*A},g,S);a(te),s(oe);return}const x=I.current;if(!x)return;l(!1);const U={x:x.panStart.x+(d.x-x.start.x),y:x.panStart.y+(d.y-x.start.y)};s(M(U,g,S))},[M,l]),D=t.useCallback(i=>{if(k.current.delete(i),k.current.size<2&&(T.current=null),k.current.size===1){const[d]=Array.from(k.current.values());I.current={start:d,panStart:m.current};return}k.current.size===0&&(I.current=null)},[]),X=t.useCallback((i,d,g,S)=>{l(!1);const x={x:m.current.x-i,y:m.current.y-d};s(M(x,g,S))},[M,l]),ee=t.useCallback((i,d,g,S)=>{const x=i<0?1.1:.9;l(!1),z(b.current*x,d,g,S)},[l,z]),L=t.useCallback(i=>{E.current=i},[]),le=t.useCallback((i,d,g,S,x)=>{if(rt(i.target))return;const U=i.metaKey||i.ctrlKey;if(i.key==="Escape"){i.preventDefault(),G();return}if(U){if(i.key==="="||i.key==="+"){i.preventDefault(),_(1.2,d,g);return}if(i.key==="-"){i.preventDefault(),_(1/1.2,d,g);return}if(i.key==="0"){i.preventDefault(),G();return}(i.key==="f"||i.key==="F")&&i.shiftKey&&(i.preventDefault(),j(S,d,g,x))}},[j,G,_]);return{pan:r,zoom:o,zoomPercent:h,transform:n,transitioning:f,zoomIn:W,zoomOut:$,resetView:G,fitToGraph:j,setAnimate:l,onPointerDown:u,onPointerMove:P,onPointerUp:D,onWheelPan:X,onWheelZoom:ee,handleKeyDown:le,setGraphBounds:L}}function st(r){const{upstreamMap:s,downstreamMap:o}=t.useMemo(()=>{const f=new Map,c=new Map;for(const m of r)f.set(m.id,new Set(m.dependencies??[])),c.has(m.id)||c.set(m.id,new Set);for(const m of r)for(const b of m.dependencies??[])c.has(b)||c.set(b,new Set),c.get(b)?.add(m.id);return{upstreamMap:f,downstreamMap:c}},[r]);return{getChain:t.useCallback(f=>{if(!s.has(f)&&!o.has(f))return new Set;const c=new Set([f]),m=(b,C)=>{const I=[b],k=new Set([b]);for(;I.length>0;){const T=I.shift();if(!T)continue;const E=C.get(T);if(E)for(const n of E)k.has(n)||(k.add(n),c.add(n),I.push(n))}};return m(f,s),m(f,o),c},[o,s])}}const ke="fusion-plugin-dependency-graph:positions";function fe(r){if(!r||typeof r!="object")return!1;const s=r;return typeof s.x=="number"&&Number.isFinite(s.x)&&typeof s.y=="number"&&Number.isFinite(s.y)}function it(r){const s=_e(ke,r);if(!s)return{};try{const o=JSON.parse(s);if(!o||typeof o!="object")return{};const a={};for(const[f,c]of Object.entries(o))fe(c)&&(a[f]=c);return a}catch{return{}}}function at(r,s,o){const a={};for(const[f,c]of Object.entries(r))s.has(f)&&fe(c)&&(a[f]=c);Xe(ke,JSON.stringify(a),o)}function ct(r){ve(ke,r)}function ut(r,s,o){const a={};for(const[f,c]of Object.entries(r))o.has(f)&&fe(c)&&(a[f]=c);for(const[f,c]of Object.entries(s))o.has(f)&&fe(c)&&(a[f]=c);return a}function lt(r,s){const o={};for(const[a,f]of Object.entries(r))s.has(a)&&(o[a]=f);return o}function dt({projectId:r,visibleTaskIds:s}){const[o,a]=t.useState(null);t.useEffect(()=>{a(it(r))},[r]);const f=t.useCallback(m=>{at(m,s,r),a(lt(m,s))},[r,s]),c=t.useCallback(()=>{ct(r),a(null)},[r]);return{savedPositions:o,persistPositions:f,clearSavedPositions:c}}const ae=280,Q=100,ft=768,Te=4;function pt({tasks:r,projectId:s,onOpenTaskDetail:o,onOpenDetail:a,addToast:f,globalPaused:c,onUpdateTask:m,onArchiveTask:b,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:k,onOpenDetailWithTab:T,taskStuckTimeoutMs:E,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:M}){const z=t.useRef(null),_=t.useRef(!1),W=t.useRef(null),$=t.useRef(!1),G=t.useRef(new Map),[j,u]=t.useState(null),[P,D]=t.useState(null),[X,ee]=t.useState({width:0,height:0}),[L,le]=t.useState(new Map),i=t.useMemo(()=>Qe(r),[r]),d=tt(i),{getChain:g}=st(i),S=j??P,x=t.useMemo(()=>S?g(S):new Set,[S,g]),U=t.useMemo(()=>{const e=X.width||(typeof window<"u"?window.innerWidth:0);return(X.height||(typeof window<"u"?window.innerHeight:0))>e||e<ft?"horizontal":"vertical"},[X.height,X.width]),O=t.useMemo(()=>({nodeWidth:ae,nodeHeight:Q,horizontalGap:40,verticalGap:80,orientation:U,measuredHeights:L}),[L,U]),v=t.useMemo(()=>we(d,O),[d,O]),B=t.useMemo(()=>new Set(i.map(e=>e.id)),[i]),{savedPositions:Z,persistPositions:K,clearSavedPositions:te}=dt({projectId:s,visibleTaskIds:B}),[A,oe]=t.useState(v),[se,ne]=t.useState(!1);t.useEffect(()=>{const e={};for(const[y,H]of v.entries())e[y]=H;const p=Z?ut(e,Z,B):e;oe(new Map(Object.entries(p)))},[v,Z,B]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=(H,Y)=>{ee(w=>w.width===H&&w.height===Y?w:{width:H,height:Y})};if(typeof ResizeObserver>"u"){p(e.clientWidth||(typeof window<"u"?window.innerWidth:0),e.clientHeight||(typeof window<"u"?window.innerHeight:0));return}p(e.clientWidth,e.clientHeight);const y=new ResizeObserver(H=>{const Y=H[0];Y&&p(Y.contentRect.width,Y.contentRect.height)});return y.observe(e),()=>y.disconnect()},[]),t.useEffect(()=>{const e=z.current;if(!e)return;const p=new Set(d.nodes.map(w=>w.task.id)),y=new Map;for(const w of p){const N=e.querySelector(`[data-testid="graph-task-node-${w}"]`);N&&y.set(w,N)}G.current=y,le(w=>{let N=!1;const F=new Map;for(const[re,ie]of w.entries()){if(!p.has(re)){N=!0;continue}F.set(re,ie)}return N?F:w});const H=(w,N)=>{le(F=>{const re=F.get(w);if(re!==void 0&&Math.abs(re-N)<1)return F;const ie=new Map(F);return ie.set(w,N),ie})};for(const[w,N]of y.entries())H(w,N.offsetHeight||Q);if(typeof ResizeObserver>"u")return;const Y=new ResizeObserver(w=>{for(const N of w){const F=N.target,re=Array.from(y.entries()).find(([,ie])=>ie===F)?.[0];re&&H(re,F.offsetHeight||Q)}});for(const w of y.values())Y.observe(w);return()=>Y.disconnect()},[d.nodes,A,X.height,X.width]);const{transform:pe,zoom:de,transitioning:q,zoomIn:he,zoomOut:Ce,resetView:De,fitToGraph:me,onPointerDown:Re,onPointerMove:Ie,onPointerUp:be,onWheelPan:ze,onWheelZoom:He,handleKeyDown:Ne,setGraphBounds:Me}=ot();t.useEffect(()=>{if(_.current||i.length===0)return;if(!!(Z&&Object.keys(Z).length>0)){_.current=!0;return}const p=z.current;p&&(me(A,p.clientWidth,p.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L}),_.current=!0)},[i.length,me,L,A,Z]);const V=t.useMemo(()=>{const e=Array.from(A.values());if(e.length===0)return{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0};const p=Math.min(...e.map(w=>w.x)),y=Math.min(...e.map(w=>w.y)),H=Math.max(...e.map(w=>w.x+ae)),Y=Math.max(...Array.from(A.entries()).map(([w,N])=>N.y+(L.get(w)??Q)));return{minX:p,minY:y,maxX:H,maxY:Y,width:Math.max(0,H-p),height:Math.max(0,Y-y)}},[L,A]),ge=t.useMemo(()=>{if(A.size===0)return A;const e=new Map;for(const[p,y]of A.entries())e.set(p,{x:y.x-V.minX,y:y.y-V.minY});return e},[V.minX,V.minY,A]);t.useEffect(()=>{Me({minX:0,minY:0,maxX:V.width,maxY:V.height})},[V.height,V.width,Me]);const Pe=t.useCallback(()=>{te();const e=we(d,O);oe(e)},[te,d,O]),Oe=t.useCallback(()=>{const e={};for(const[p,y]of A.entries())e[p]=y;K(e)},[K,A]);return R.jsxs("section",{className:"dependency-graph","data-testid":"dependency-graph",children:[R.jsx("div",{ref:z,className:"dependency-graph__viewport",onPointerDown:e=>{se||(W.current={x:e.clientX,y:e.clientY},$.current=!1,Re(e.pointerId,{x:e.clientX,y:e.clientY}))},onPointerMove:e=>{if(se)return;const p=z.current;if(!p)return;const y=W.current;if(y){const H=Math.abs(e.clientX-y.x),Y=Math.abs(e.clientY-y.y);(H>Te||Y>Te)&&($.current=!0)}Ie(e.pointerId,{x:e.clientX,y:e.clientY},p.clientWidth,p.clientHeight)},onPointerUp:e=>{se||be(e.pointerId),W.current=null},onPointerCancel:e=>{se||be(e.pointerId),W.current=null,$.current=!1},onWheel:e=>{e.preventDefault();const p=z.current;if(p){if(e.ctrlKey||e.metaKey){const y=p.getBoundingClientRect();He(e.deltaY,{x:e.clientX-y.left,y:e.clientY-y.top},p.clientWidth,p.clientHeight);return}ze(e.deltaX,e.deltaY,p.clientWidth,p.clientHeight)}},onKeyDown:e=>{const p=z.current;p&&Ne(e,p.clientWidth,p.clientHeight,ge,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L})},tabIndex:0,onClick:()=>{$.current||se||D(null)},children:i.length===0?R.jsx("div",{className:"dependency-graph__empty",children:"No active tasks to display in graph view."}):R.jsxs("div",{className:`graph-canvas-transform${q?" graph-canvas-transform--animate":""}`,style:{transform:pe,width:`${V.width}px`,height:`${V.height}px`},children:[R.jsx(qe,{edges:d.edges,positions:ge,nodeWidth:ae,nodeHeight:Q,nodeHeights:L,highlightedEdgeIds:x.size>0?new Set(d.edges.filter(e=>x.has(e.source)&&x.has(e.target)).map(e=>`${e.source}->${e.target}`)):void 0}),R.jsx("div",{className:"dependency-graph__nodes-layer",children:d.nodes.map(e=>{const p=ge.get(e.task.id);return p?R.jsx(Be,{task:e.task,projectId:s,isSelected:P===e.task.id,style:{minHeight:`${Q}px`,left:`${p.x}px`,top:`${p.y}px`},position:p,scale:de,onNodePositionChange:(y,H)=>{oe(Y=>{const w={x:H.x+V.minX,y:H.y+V.minY},N=Y.get(y);if(N&&N.x===w.x&&N.y===w.y)return Y;const F=new Map(Y);return F.set(y,w),F})},onNodeDragStateChange:ne,onNodeDragEnd:Oe,isHighlighted:x.size>0&&x.has(e.task.id),isDimmed:x.size>0&&!x.has(e.task.id),onOpenDetail:a??(y=>o?.(y.id)),addToast:f??(()=>{}),globalPaused:c,onUpdateTask:m,onArchiveTask:b,onUnarchiveTask:C,onDeleteTask:I,onRetryTask:k,onOpenDetailWithTab:T,taskStuckTimeoutMs:E,onOpenMission:n,onMoveTask:h,lastFetchTimeMs:l,workflowStepNameLookup:M,onMouseEnter:()=>u(e.task.id),onMouseLeave:()=>u(null),onClick:y=>{y.stopPropagation(),$.current=!1,D(H=>H===e.task.id?null:e.task.id)}},e.task.id):null})})]})}),R.jsx(Ze,{zoom:de,onZoomIn:()=>{const e=z.current;e&&he(e.clientWidth,e.clientHeight)},onZoomOut:()=>{const e=z.current;e&&Ce(e.clientWidth,e.clientHeight)},onFitToGraph:()=>{Pe();const e=z.current;if(!e)return;const p=we(d,O),y=new Map,H=Array.from(p.values()),Y=H.length>0?Math.min(...H.map(N=>N.x)):0,w=H.length>0?Math.min(...H.map(N=>N.y)):0;for(const[N,F]of p.entries())y.set(N,{x:F.x-Y,y:F.y-w});me(y,e.clientWidth,e.clientHeight,{nodeWidth:ae,nodeHeight:Q,measuredHeights:L})},onResetView:()=>{Pe(),De()}})]})}function ht(r){return new Map((r??[]).map(s=>[s.id,s.name]))}function Pt({context:r}){return t.createElement(pt,{tasks:r?.tasks??[],projectId:r?.projectId,workflowStepNameLookup:ht(r?.workflowSteps),onOpenDetail:r?.openTaskDetail})}export{pt as DependencyGraph,Pt as DependencyGraphDashboardView,Pt as default};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.roadmaps-view{display:flex;height:100%;overflow:hidden}.roadmaps-view--loading,.roadmaps-view--error{display:flex;align-items:center;justify-content:center}.roadmaps-view__loading-state,.roadmaps-view__error-state{text-align:center;color:var(--text-muted)}.roadmaps-view__error-msg{font-size:.85rem;margin-top:4px}.roadmaps-view__handoff-intro,.roadmaps-view__handoff-error,.roadmaps-view__handoff-section{margin-bottom:var(--space-lg)}.roadmaps-view__handoff-empty-state,.roadmaps-view__handoff-loading-state{text-align:center;padding:var(--space-xl)}.roadmaps-view__handoff-button-icon{margin-right:var(--space-sm)}.roadmaps-view__handoff-loading-text{margin-top:var(--space-md)}.roadmaps-view__handoff-section-title{margin-bottom:var(--space-sm)}.roadmaps-view__handoff-card{padding:var(--space-md)}.roadmaps-view__handoff-pre{white-space:pre-wrap;font-size:.75rem;overflow:auto}.roadmaps-view__handoff-pre--mission{max-height:200px}.roadmaps-view__handoff-pre--features{max-height:300px}.roadmaps-view__handoff-copy-icon{margin-right:var(--space-xs)}.roadmaps-view__sidebar{width:280px;flex-shrink:0;display:flex;flex-direction:column;border-right:1px solid var(--border);background:var(--surface-elevated)}.roadmaps-view__sidebar-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--border)}.roadmaps-view__sidebar-title{font-size:1rem;font-weight:600;color:var(--text-primary)}.roadmaps-view__add-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;border:none;border-radius:var(--radius-sm);background:var(--accent);color:var(--cta-text);cursor:pointer;transition:opacity var(--transition-fast)}.roadmaps-view__add-btn:hover{opacity:.85}.roadmaps-view__sidebar-list{flex:1;overflow-y:auto;padding:var(--space-sm)}.roadmaps-view__empty-sidebar{padding:var(--space-lg);text-align:center;color:var(--text-muted);font-size:.9rem}.roadmaps-view__sidebar-item{display:flex;align-items:flex-start;justify-content:space-between;padding:var(--space-sm) var(--space-md);border-radius:var(--radius-sm);cursor:pointer;transition:background var(--transition-fast);gap:var(--space-sm)}.roadmaps-view__sidebar-item:hover{background:var(--surface-hover)}.roadmaps-view__sidebar-item--active{background:var(--card-hover)}.roadmaps-view__sidebar-item-content{flex:1;min-width:0}.roadmaps-view__sidebar-item-title{font-weight:500;color:var(--text-primary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__sidebar-item-desc{font-size:.8rem;color:var(--text-muted);margin-top:2px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.roadmaps-view__sidebar-item-actions{display:flex;gap:2px;opacity:0;transition:opacity var(--transition-fast)}.roadmaps-view__sidebar-item:hover .roadmaps-view__sidebar-item-actions{opacity:1}.roadmaps-view__icon-btn{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.roadmaps-view__icon-btn:hover{background:var(--surface-hover, color-mix(in srgb, var(--text) 6%, transparent));color:var(--text)}.roadmaps-view__icon-btn--danger:hover{background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.roadmaps-view__icon-btn--success:hover{background:color-mix(in srgb,var(--color-success) 10%,transparent);color:var(--color-success)}.roadmaps-view__icon-btn:disabled{opacity:.4;cursor:not-allowed}.roadmaps-view__main{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.roadmaps-view__empty-main{display:flex;align-items:center;justify-content:center;flex:1;color:var(--text-muted)}.roadmaps-view__roadmap-header{padding:var(--space-lg);border-bottom:1px solid var(--border)}.roadmaps-view__roadmap-title-row{display:flex;align-items:center;gap:var(--space-md)}.roadmaps-view__roadmap-title{font-size:1.5rem;font-weight:600;color:var(--text-primary);flex:1}.roadmaps-view__roadmap-actions{display:flex;gap:var(--space-xs)}.roadmaps-view__roadmap-desc{margin-top:var(--space-sm);color:var(--text-muted);font-size:.95rem}.roadmaps-view__milestone-lanes{flex:1;display:flex;flex-direction:row;gap:var(--space-md);padding:var(--space-md);overflow-x:auto;overflow-y:hidden}.roadmaps-view__milestone{min-width:300px;width:320px;flex-shrink:0;display:flex;flex-direction:column;background:var(--surface-elevated);border:1px solid var(--border);border-radius:var(--radius-md);box-shadow:var(--shadow-sm);transition:opacity var(--transition-fast),border-color var(--transition-fast),box-shadow var(--transition-fast);cursor:grab}.roadmaps-view__milestone:active{cursor:grabbing}.roadmaps-view__milestone--dragging{opacity:.5}.roadmaps-view__milestone--drop-target{border-color:var(--accent)}.roadmaps-view__milestone--drop-before{border-top:3px solid var(--accent)}.roadmaps-view__milestone--drop-after{border-bottom:3px solid var(--accent)}.roadmaps-view__drag-handle{display:flex;align-items:center;justify-content:center;color:var(--text-muted);cursor:grab;padding:2px;border-radius:var(--radius-sm);transition:color var(--transition-fast),background var(--transition-fast)}.roadmaps-view__drag-handle:hover{color:var(--text-primary);background:var(--surface-hover)}.roadmaps-view__milestone-header{padding:var(--space-md);border-bottom:1px solid var(--border)}.roadmaps-view__milestone-title-row{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--space-sm)}.roadmaps-view__milestone-title{font-size:1rem;font-weight:600;color:var(--text-primary);flex:1}.roadmaps-view__milestone-actions{display:flex;gap:2px}.roadmaps-view__milestone-desc{margin-top:var(--space-xs);font-size:.85rem;color:var(--text-muted)}.roadmaps-view__milestone-actions-bar{padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border)}.roadmaps-view__add-feature-btn{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border:1px dashed var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:.8rem;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.roadmaps-view__add-feature-btn:hover{background:var(--surface-hover);color:var(--text-primary);border-color:var(--text-muted)}.roadmaps-view__suggest-btn{display:flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--accent);color:var(--cta-text);border:1px solid var(--accent);border-radius:var(--radius-md);font-size:.75rem;cursor:pointer;transition:background var(--transition-fast),transform var(--transition-fast)}.roadmaps-view__suggest-btn:hover{background:color-mix(in srgb,var(--accent) 88%,var(--bg) 12%);border-color:color-mix(in srgb,var(--accent) 88%,var(--bg) 12%)}.roadmaps-view__suggest-btn:active{transform:scale(.97)}.roadmaps-view__suggest-btn:disabled{opacity:.5;cursor:not-allowed}.roadmaps-view__feature-list{flex:1;overflow-y:auto;padding:var(--space-sm);transition:background var(--transition-fast)}.roadmaps-view__feature-list--drop-target{background:color-mix(in srgb,var(--color-info) 5%,transparent)}.roadmaps-view__empty-features{padding:var(--space-md);text-align:center;color:var(--text-muted);font-size:.85rem}.roadmaps-view__feature-item{display:flex;align-items:flex-start;justify-content:space-between;padding:var(--space-sm);border-bottom:1px solid var(--border);gap:var(--space-sm);transition:opacity var(--transition-fast),border-color var(--transition-fast);cursor:grab}.roadmaps-view__feature-item:active{cursor:grabbing}.roadmaps-view__feature-item:last-child{border-bottom:none}.roadmaps-view__feature-item--dragging{opacity:.5}.roadmaps-view__feature-item--drop-before{border-top:3px solid var(--accent)}.roadmaps-view__feature-item--drop-after{border-bottom:3px solid var(--accent)}.roadmaps-view__drag-handle--feature{flex-shrink:0}.roadmaps-view__feature-content{flex:1;min-width:0}.roadmaps-view__feature-title{font-weight:500;color:var(--text-primary);font-size:.9rem}.roadmaps-view__feature-desc{font-size:.8rem;color:var(--text-muted);margin-top:2px}.roadmaps-view__feature-actions{display:flex;gap:2px;opacity:0;transition:opacity var(--transition-fast)}.roadmaps-view__feature-item:hover .roadmaps-view__feature-actions{opacity:1}.roadmaps-view__inline-edit{display:flex;flex-direction:column;gap:var(--space-sm)}.roadmaps-view__inline-edit-row{display:flex;align-items:center;gap:var(--space-xs)}.roadmaps-view__inline-input{flex:1;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.9rem;font-family:inherit}.roadmaps-view__inline-input:focus{outline:none;border-color:var(--accent)}.roadmaps-view__inline-input--large{font-size:1.1rem;font-weight:600;padding:var(--space-sm) var(--space-md)}.roadmaps-view__inline-textarea{width:100%;padding:var(--space-sm);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.85rem;font-family:inherit;resize:vertical}.roadmaps-view__inline-textarea:focus{outline:none;border-color:var(--accent)}.roadmaps-view__create-form{padding:var(--space-md);border-bottom:1px solid var(--border);background:var(--surface-elevated)}.roadmaps-view__create-form-actions{display:flex;gap:var(--space-sm);margin-top:var(--space-sm)}.roadmaps-view__btn{padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.85rem;cursor:pointer;transition:background var(--transition-fast)}.roadmaps-view__btn:hover{background:var(--surface-hover)}.roadmaps-view__btn--primary{background:var(--accent);border-color:var(--accent);color:var(--cta-text)}.roadmaps-view__btn--primary:hover{opacity:.9}.roadmaps-view__btn:disabled{opacity:.5;cursor:not-allowed}.roadmaps-view__empty-milestones{display:flex;flex-direction:column;align-items:center;justify-content:center;flex:1;gap:var(--space-md);color:var(--text-muted);padding:var(--space-xl)}.roadmaps-view__add-milestone-btn,.roadmaps-view__add-milestone-fab{display:inline-flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);border:1px dashed var(--border);border-radius:var(--radius-sm);background:transparent;color:var(--text-muted);font-size:.9rem;cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),border-color var(--transition-fast)}.roadmaps-view__add-milestone-fab{align-self:flex-start;min-width:150px}.roadmaps-view__add-milestone-btn:hover,.roadmaps-view__add-milestone-fab:hover{background:var(--surface-hover);color:var(--text-primary);border-color:var(--text-muted)}.roadmaps-view__create-form--inline{border:1px dashed var(--border);border-radius:var(--radius-sm);margin:var(--space-sm);background:var(--surface-elevated)}.roadmaps-view__inline-form{display:flex;flex-direction:column;gap:var(--space-xs)}.roadmaps-view__inline-form-actions{display:flex;justify-content:flex-end;gap:var(--space-xs)}.roadmaps-view__feature-create-overlay{position:fixed;bottom:var(--space-lg);left:50%;transform:translate(-50%);z-index:100}.roadmaps-view__inline-edit--compact .roadmaps-view__inline-input{padding:var(--space-xs) var(--space-sm);font-size:.85rem}.roadmap-suggestion-section{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-lg);margin-bottom:var(--space-lg)}.roadmap-suggestion-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:var(--space-md)}.roadmap-suggestion-title{font-size:1rem;font-weight:600;color:var(--text-primary);margin:0}.roadmap-suggestion-form{display:flex;flex-direction:column;gap:var(--space-sm)}.roadmap-suggestion-input{width:100%;padding:var(--space-sm) var(--space-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface-input);color:var(--text-primary);font-size:.9rem;font-family:inherit;resize:vertical;min-height:60px;transition:border-color var(--transition-fast)}.roadmap-suggestion-input:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.roadmap-suggestion-input:disabled{opacity:.6;cursor:not-allowed}.roadmap-suggestion-input::placeholder{color:var(--text-muted)}.roadmap-suggestion-actions{display:flex;gap:var(--space-sm);align-items:center}.roadmap-suggestion-generate-btn{padding:var(--space-sm) var(--space-lg);background:var(--accent);color:var(--cta-text);border:none;border-radius:var(--radius-sm);font-size:.9rem;font-weight:500;cursor:pointer;transition:opacity var(--transition-fast),transform var(--transition-instant)}.roadmap-suggestion-generate-btn:hover:not(:disabled){opacity:.9}.roadmap-suggestion-generate-btn:active:not(:disabled){transform:scale(.98)}.roadmap-suggestion-generate-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-accept-all-btn{padding:var(--space-sm) var(--space-md);background:var(--color-success);color:var(--cta-text);border:none;border-radius:var(--radius-sm);font-size:.85rem;font-weight:500;cursor:pointer;transition:opacity var(--transition-fast),transform var(--transition-instant)}.roadmap-suggestion-accept-all-btn:hover{opacity:.9}.roadmap-suggestion-accept-all-btn:active{transform:scale(.98)}.roadmap-suggestion-clear-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:transparent;color:var(--text-muted);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:color var(--transition-fast),border-color var(--transition-fast)}.roadmap-suggestion-clear-btn:hover{color:var(--color-error);border-color:var(--color-error)}.roadmap-suggestion-list{display:flex;flex-direction:column;gap:var(--space-sm);margin-top:var(--space-md)}.roadmap-suggestion-card{display:flex;align-items:flex-start;justify-content:space-between;padding:var(--space-md);background:var(--surface-elevated);border:1px solid var(--border);border-radius:var(--radius-sm);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.roadmap-suggestion-card:hover{border-color:var(--accent);box-shadow:var(--shadow-sm)}.roadmap-suggestion-card-content{display:flex;flex-direction:column;gap:var(--space-xs);flex:1;min-width:0}.roadmap-suggestion-card-title{font-size:.9rem;font-weight:500;color:var(--text-primary)}.roadmap-suggestion-card-desc{font-size:.85rem;color:var(--text-muted);line-height:1.4}.roadmap-suggestion-card-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.roadmap-suggestion-accept-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--color-success);color:var(--cta-text);border:none;border-radius:var(--radius-sm);cursor:pointer;transition:opacity var(--transition-fast),transform var(--transition-instant)}.roadmap-suggestion-accept-btn:hover{opacity:.9}.roadmap-suggestion-accept-btn:active{transform:scale(.95)}.roadmap-suggestion-accept-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-edit-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--surface-elevated);color:var(--text-muted);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast)}.roadmap-suggestion-edit-btn:hover{background:var(--surface-hover);color:var(--text-primary)}.roadmap-suggestion-card--editing{background:var(--surface-elevated);border-color:var(--accent)}.roadmap-suggestion-edit-form{display:flex;flex-direction:column;gap:var(--space-sm);flex:1;min-width:0}.roadmap-suggestion-textarea{width:100%;padding:var(--space-sm);background:var(--bg);color:var(--text-primary);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:.9rem;font-family:inherit;resize:vertical;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.roadmap-suggestion-textarea:focus{outline:none;border-color:var(--accent);box-shadow:var(--focus-ring)}.roadmap-suggestion-textarea::placeholder{color:var(--text-dim)}.roadmap-suggestion-edit-actions{display:flex;gap:var(--space-xs)}.roadmap-suggestion-save-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--color-success);color:var(--cta-text);border:none;border-radius:var(--radius-sm);cursor:pointer;transition:opacity var(--transition-fast)}.roadmap-suggestion-save-btn:hover:not(:disabled){opacity:.9}.roadmap-suggestion-save-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-cancel-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;padding:0;background:var(--surface-elevated);color:var(--text-muted);border:1px solid var(--border);border-radius:var(--radius-sm);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast)}.roadmap-suggestion-cancel-btn:hover{background:var(--surface-hover);color:var(--text-primary)}.roadmap-suggestion-expand-btn{width:100%;display:flex;align-items:center;justify-content:center;gap:var(--space-sm);background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:var(--space-md) var(--space-lg);color:var(--text-primary);cursor:pointer;font-size:.9rem;font-weight:600;transition:background var(--transition-fast),color var(--transition-fast)}.roadmap-suggestion-expand-btn:hover:not(:disabled){background:var(--card-hover)}.roadmap-suggestion-expand-btn:active:not(:disabled){transform:scale(.98)}.roadmap-suggestion-expand-btn:disabled{opacity:.5;cursor:not-allowed}.roadmap-suggestion-collapse-btn{display:flex;align-items:center;justify-content:center;background:none;border:none;color:var(--text-muted);cursor:pointer;padding:var(--space-xs);border-radius:var(--radius-sm);transition:color var(--transition-fast)}.roadmap-suggestion-collapse-btn:hover{color:var(--text-primary)}@media(max-width:768px){.roadmaps-view{overflow-y:auto;-webkit-overflow-scrolling:touch}.roadmaps-view__sidebar{display:none}.roadmaps-view__main{overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1;padding-bottom:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0px))}.roadmaps-view__mobile-list{display:flex;flex-direction:column;width:100%;height:100%;background:var(--surface)}.roadmaps-view__mobile-list-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--border);flex-shrink:0}.roadmaps-view__mobile-list-title{margin:0;font-size:1rem;font-weight:600;color:var(--text)}.roadmaps-view__mobile-add-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:var(--radius-md);background:var(--accent);color:var(--cta-text);cursor:pointer;transition:opacity var(--transition-fast)}.roadmaps-view__mobile-add-btn:hover{opacity:.85}.roadmaps-view__mobile-add-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.roadmaps-view__mobile-create-form{padding:var(--space-md);border-bottom:1px solid var(--border);background:var(--bg)}.roadmaps-view__mobile-list-items{flex:1;overflow-y:auto}.roadmaps-view__mobile-item{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--border);min-height:44px;cursor:pointer;transition:background var(--transition-fast)}.roadmaps-view__mobile-item:hover{background:var(--surface-hover)}.roadmaps-view__mobile-item--active{background:color-mix(in srgb,var(--accent) 10%,transparent);border-left:3px solid var(--accent)}.roadmaps-view__mobile-item-content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.roadmaps-view__mobile-item-title{font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__mobile-item-desc{font-size:.8rem;color:var(--text-muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__mobile-item-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.roadmaps-view__mobile-action-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:var(--radius-md);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast)}.roadmaps-view__mobile-action-btn:hover{background:var(--surface-hover);color:var(--text)}.roadmaps-view__mobile-action-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.roadmaps-view__mobile-action-btn--danger:hover{background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.roadmaps-view__mobile-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:var(--space-2xl);color:var(--text-muted);text-align:center}.roadmaps-view__mobile-header{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--border);background:var(--surface);flex-shrink:0;position:sticky;top:0;z-index:10}.roadmaps-view__mobile-back-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;border:none;border-radius:var(--radius-md);background:transparent;color:var(--text-muted);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast);flex-shrink:0}.roadmaps-view__mobile-back-btn:hover{background:var(--surface-hover);color:var(--text)}.roadmaps-view__mobile-back-btn:focus-visible{outline:none;box-shadow:var(--focus-ring-strong)}.roadmaps-view__mobile-header-title{flex:1;margin:0;font-size:1rem;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.roadmaps-view__mobile-header-actions{display:flex;gap:var(--space-xs);flex-shrink:0}.roadmaps-view__milestone-lanes{flex-direction:column;overflow-x:hidden;overflow-y:auto;padding-bottom:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0px))}.roadmaps-view__milestone{width:100%;min-width:unset}.roadmap-suggestion-section{padding:var(--space-md);margin:var(--space-md)}.roadmap-suggestion-actions{flex-wrap:wrap}.roadmap-suggestion-generate-btn,.roadmap-suggestion-accept-all-btn{flex:1}.roadmap-suggestion-card{padding:var(--space-sm)}.roadmaps-view__roadmap-header{padding:var(--space-md) var(--space-lg)}.roadmaps-view__create-form{margin:var(--space-sm)}.roadmaps-view__icon-btn{width:36px;height:36px}.roadmaps-view__feature-create-overlay{bottom:calc(var(--mobile-nav-height) + env(safe-area-inset-bottom,0px) + var(--space-md))}}
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{r as s,j as e}from"./vendor-react-D37HfzIf.js";import{P as Oe,C as ge,X as ie,a as Me,T as Le,b as Rt,S as gt,D as nt,A as It,G as Ye,L as At,c as zt}from"./x-CqNX_9E2.js";import"./createLucideIcon-BYvOGRiO.js";const Ot="/api/plugins/fusion-plugin-roadmap";async function A(a,r){const d=await fetch(`${Ot}${a}`,{headers:{"Content-Type":"application/json",...r?.headers??{}},...r});if(!d.ok){let g=`${d.status} ${d.statusText}`;try{const _=await d.json();_.error&&(g=_.error)}catch{}throw new Error(g)}if(d.status!==204)return await d.json()}function z(a){return a?`?projectId=${encodeURIComponent(a)}`:""}function Tt(a){return A(`/roadmaps${z(a)}`)}function Pt(a,r){return A(`/roadmaps/${a}${z(r)}`)}function Ht(a,r){return A(`/roadmaps${z(r)}`,{method:"POST",body:JSON.stringify({...a,projectId:r})})}function Bt(a,r,d){return A(`/roadmaps/${a}${z(d)}`,{method:"PATCH",body:JSON.stringify({...r,projectId:d})})}function Gt(a,r){return A(`/roadmaps/${a}${z(r)}`,{method:"DELETE"})}function rt(a,r,d){return A(`/roadmaps/${a}/milestones${z(d)}`,{method:"POST",body:JSON.stringify({...r,projectId:d})})}function Lt(a,r,d){return A(`/roadmaps/milestones/${a}${z(d)}`,{method:"PATCH",body:JSON.stringify({...r,projectId:d})})}function Jt(a,r){return A(`/roadmaps/milestones/${a}${z(r)}`,{method:"DELETE"})}function Vt(a,r,d){return A(`/roadmaps/${a}/milestones/reorder${z(d)}`,{method:"POST",body:JSON.stringify({orderedMilestoneIds:r,projectId:d})})}function st(a,r,d){return A(`/roadmaps/milestones/${a}/features${z(d)}`,{method:"POST",body:JSON.stringify({...r,projectId:d})})}function Ut(a,r,d){return A(`/roadmaps/features/${a}${z(d)}`,{method:"PATCH",body:JSON.stringify({...r,projectId:d})})}function Kt(a,r){return A(`/roadmaps/features/${a}${z(r)}`,{method:"DELETE"})}function Wt(a,r,d){return A(`/roadmaps/milestones/${a}/features/reorder${z(d)}`,{method:"POST",body:JSON.stringify({orderedFeatureIds:r,projectId:d})})}function qt(a,r,d,g){return A(`/roadmaps/features/${a}/move${z(g)}`,{method:"POST",body:JSON.stringify({targetMilestoneId:r,targetIndex:d,projectId:g})})}function Yt(a,r,d=5,g){return A(`/roadmaps/${a}/suggestions/milestones${z(g)}`,{method:"POST",body:JSON.stringify({goalPrompt:r,count:d,projectId:g})})}function Xt(a,r,d){return A(`/roadmaps/milestones/${a}/suggestions/features${z(d)}`,{method:"POST",body:JSON.stringify({...r,projectId:d})})}function Qt(a,r){return A(`/roadmaps/${a}/handoff${z(r)}`)}function Zt(a){const r=a?.projectId,[d,g]=s.useState([]),[_,j]=s.useState(null),[y,h]=s.useState(null),[k,D]=s.useState([]),[C,S]=s.useState({}),[O,X]=s.useState(!1),[V,I]=s.useState(null),[oe,fe]=s.useState(null),[Je,he]=s.useState(!1),[be,te]=s.useState(null),[ve,B]=s.useState([]),[P,G]=s.useState(!1),[xe,L]=s.useState({}),[le,ae]=s.useState({}),Q=s.useRef(xe),we=s.useRef(le),de=s.useRef(ve);Q.current=xe,we.current=le,de.current=ve;const _e=s.useRef(r),M=s.useRef(0),ce=s.useRef(0),je=s.useRef(d),x=s.useRef(_),ue=s.useRef(k),Ce=s.useRef(C),$=s.useRef(r),Te=s.useRef(oe);je.current=d,x.current=_,ue.current=k,Ce.current=C,$.current=r,Te.current=oe,s.useEffect(()=>{_e.current!==r&&(_e.current=r,M.current++,j(null),h(null),D([]),S({}),fe(null),te(null),B([]),G(!1),L({}),ae({}))},[r]);const Z=s.useCallback(async()=>{X(!0),I(null);try{const n=await Tt(r);g(n)}catch(n){I(n instanceof Error?n:new Error("Failed to fetch roadmaps"))}finally{X(!1)}},[r]),N=s.useCallback(async n=>{try{const c=await Pt(n,r);h(c),D(c.milestones||[]);const o={};for(const i of c.milestones||[])o[i.id]=i.features||[];S(o)}catch(c){I(c instanceof Error?c:new Error("Failed to fetch roadmap"))}},[r]);s.useEffect(()=>{Z()},[Z]),s.useEffect(()=>{_?N(_):(h(null),D([]),S({}))},[_,N]);const Pe=s.useCallback(async(n,c)=>{try{const o=await Ht(n,$.current);g(i=>[...i,o]),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to create roadmap");throw c?.onError?.(i),i}},[]),Ne=s.useCallback(async(n,c,o)=>{try{const i=await Bt(n,c,$.current);g(u=>u.map(l=>l.id===n?i:l)),x.current===n&&h(u=>u?{...u,...i}:null),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to update roadmap");throw o?.onError?.(u),u}},[]),He=s.useCallback(async(n,c)=>{try{await Gt(n,$.current),g(o=>o.filter(i=>i.id!==n)),x.current===n&&(j(null),h(null),D([]),S({})),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to delete roadmap");throw c?.onError?.(i),i}},[]),Ve=s.useCallback(n=>{j(n)},[]),f=s.useCallback(async(n,c)=>{const o=x.current;if(!o){const i=new Error("No roadmap selected");throw c?.onError?.(i),i}try{const i=await rt(o,n,$.current);D(u=>[...u,i]),S(u=>({...u,[i.id]:[]})),x.current&&N(x.current),c?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to create milestone");throw c?.onError?.(u),u}},[N]),R=s.useCallback(async(n,c,o)=>{try{const i=await Lt(n,c,$.current);D(u=>u.map(l=>l.id===n?i:l)),x.current&&N(x.current),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to update milestone");throw o?.onError?.(u),u}},[N]),re=s.useCallback(async(n,c)=>{try{await Jt(n,$.current),D(o=>o.filter(i=>i.id!==n)),S(o=>{const i={...o};return delete i[n],i}),x.current&&N(x.current),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to delete milestone");throw c?.onError?.(i),i}},[N]),Ue=s.useCallback(async(n,c,o)=>{try{const i=await st(n,c,$.current);S(u=>({...u,[n]:[...u[n]||[],i]})),x.current&&N(x.current),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to create feature");throw o?.onError?.(u),u}},[N]),$e=s.useCallback(async(n,c,o)=>{try{const i=await Ut(n,c,$.current);S(u=>{const l={};for(const[b,p]of Object.entries(u))l[b]=p.map(w=>w.id===n?i:w);return l}),x.current&&N(x.current),o?.onSuccess?.()}catch(i){const u=i instanceof Error?i:new Error("Failed to update feature");throw o?.onError?.(u),u}},[N]),Re=s.useCallback(async(n,c)=>{try{await Kt(n,$.current),S(o=>{const i={};for(const[u,l]of Object.entries(o))i[u]=l.filter(b=>b.id!==n);return i}),x.current&&N(x.current),c?.onSuccess?.()}catch(o){const i=o instanceof Error?o:new Error("Failed to delete feature");throw c?.onError?.(i),i}},[N]),E=s.useCallback(async(n,c,o)=>{const i=ue.current,u=c.map(l=>i.find(b=>b.id===l)).filter(l=>l!==void 0).map((l,b)=>({...l,orderIndex:b}));D(u);try{await Vt(n,c,$.current),x.current&&N(x.current),o?.onSuccess?.()}catch(l){D(i);const b=l instanceof Error?l:new Error("Failed to reorder milestones");throw o?.onError?.(b),b}},[N]),me=s.useCallback(async(n,c,o)=>{const i=Ce.current[n]||[],u=i.map(p=>p.id);if(JSON.stringify(u)===JSON.stringify(c)){o?.onSuccess?.();return}const l=Ce.current,b=c.map(p=>i.find(w=>w.id===p)).filter(p=>p!==void 0).map((p,w)=>({...p,orderIndex:w}));S(p=>({...p,[n]:b}));try{await Wt(n,c,$.current),x.current&&N(x.current),o?.onSuccess?.()}catch(p){S(l);const w=p instanceof Error?p:new Error("Failed to reorder features");throw o?.onError?.(w),w}},[N]),ee=s.useCallback(async(n,c,o,i)=>{const u=Ce.current;let l=null;for(const[F,q]of Object.entries(u))if(q.some(We=>We.id===n)){l=F;break}if(!l){const F=new Error("Feature not found");throw i?.onError?.(F),F}if(l===c){const F=u[l]||[],q=Math.max(0,Math.min(o,F.length-1));if(F.findIndex(qe=>qe.id===n)===q){i?.onSuccess?.();return}}const b=u[l]||[],p=u[c]||[],w=b.find(F=>F.id===n);if(!w){const F=new Error("Feature not found");throw i?.onError?.(F),F}const H=b.filter(F=>F.id!==n).map((F,q)=>({...F,orderIndex:q})),Ee={...w,milestoneId:c,orderIndex:o},ne=[...p];ne.splice(o,0,Ee);const Ke=ne.map((F,q)=>({...F,orderIndex:q}));S(l===c?F=>({...F,[l]:Ke}):F=>({...F,[l]:H,[c]:Ke}));try{await qt(n,c,o,r),x.current&&N(x.current),i?.onSuccess?.()}catch(F){S(u);const q=F instanceof Error?F:new Error("Failed to move feature");throw i?.onError?.(q),q}},[N,r]);function U(){return typeof crypto<"u"&&typeof crypto.randomUUID=="function"?crypto.randomUUID():`draft-${Date.now()}-${Math.random().toString(36).slice(2,11)}`}const se=s.useCallback(async(n,c=5,o)=>{const i=x.current;if(!i){const b=new Error("No roadmap selected");throw o?.onError?.(b),b}const u=M.current,l=$.current;G(!0);try{const b=await Yt(i,n,c,l);if(M.current!==u)return;const p=b.suggestions.map(w=>({id:U(),title:w.title,description:w.description}));B(p),o?.onSuccess?.()}catch(b){if(M.current!==u)return;const p=b instanceof Error?b:new Error("Failed to generate suggestions");throw o?.onError?.(p),p}finally{M.current===u&&G(!1)}},[]),Ie=s.useCallback((n,c)=>{const i=de.current.map(u=>u.id===n?{...u,...c}:u);de.current=i,B(u=>u.map(l=>l.id===n?{...l,...c}:l))},[]),K=s.useCallback(async(n,c)=>{const o=x.current;if(!o){const p=new Error("No roadmap selected");throw c?.onError?.(p),p}const i=M.current,u=de.current,l=u.findIndex(p=>p.id===n);if(l===-1){const p=new Error("Suggestion draft not found");throw c?.onError?.(p),p}const b=u[l];if(!b.title.trim()){const p=new Error("Title cannot be empty");throw c?.onError?.(p),p}B(p=>p.filter(w=>w.id!==n));try{if(await rt(o,{title:b.title,description:b.description},$.current),M.current!==i){B(p=>{const w=[...p];return w.splice(l,0,b),w});return}x.current&&N(x.current),c?.onSuccess?.()}catch(p){B(H=>{const Ee=[...H];return Ee.splice(l,0,b),Ee});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw c?.onError?.(w),w}},[N]),W=s.useCallback(async n=>{const c=x.current;if(!c){const l=new Error("No roadmap selected");throw n?.onError?.(l),l}const o=[...de.current];if(o.length===0)return;const i=o.findIndex(l=>!l.title.trim());if(i!==-1){const l=new Error(`Title cannot be empty at position ${i+1}`);throw n?.onError?.(l),l}B([]);const u=M.current;for(let l=0;l<o.length&&M.current===u;l++){const b=o[l];try{await rt(c,{title:b.title,description:b.description},$.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw n?.onError?.(w),w}}M.current===u&&(x.current&&N(x.current),n?.onSuccess?.())},[N]),Xe=s.useCallback(n=>we.current[n]??!1,[]),Be=s.useCallback(async(n,c,o)=>{const i=M.current,u=$.current;ae(l=>({...l,[n]:!0}));try{const l=await Xt(n,c,u);if(M.current!==i)return;const b=l.suggestions.map(p=>({id:U(),title:p.title,description:p.description}));L(p=>({...p,[n]:b})),o?.onSuccess?.()}catch(l){if(M.current!==i)return;const b=l instanceof Error?l:new Error("Failed to generate feature suggestions");throw o?.onError?.(b),b}finally{M.current===i&&ae(l=>({...l,[n]:!1}))}},[]),ye=s.useCallback((n,c,o)=>{const u=(Q.current[n]||[]).map(l=>l.id===c?{...l,...o}:l);Q.current={...Q.current,[n]:u},L(l=>({...l,[n]:l[n]?.map(b=>b.id===c?{...b,...o}:b)||[]}))},[]),Ge=s.useCallback(async(n,c,o)=>{const i=M.current,u=Q.current[n]||[],l=u.findIndex(p=>p.id===c);if(l===-1){const p=new Error("Suggestion draft not found");throw o?.onError?.(p),p}const b=u[l];if(!b.title.trim()){const p=new Error("Title cannot be empty");throw o?.onError?.(p),p}L(p=>({...p,[n]:p[n]?.filter(w=>w.id!==c)||[]}));try{if(await st(n,{title:b.title,description:b.description},$.current),M.current!==i){L(p=>{const H=[...p[n]||[]];return H.splice(l,0,b),{...p,[n]:H}});return}x.current&&N(x.current),o?.onSuccess?.()}catch(p){L(H=>{const ne=[...H[n]||[]];return ne.splice(l,0,b),{...H,[n]:ne}});const w=p instanceof Error?p:new Error("Failed to accept suggestion");throw o?.onError?.(w),w}},[N]),Qe=s.useCallback(async(n,c)=>{const o=[...Q.current[n]||[]];if(o.length===0)return;const i=o.findIndex(l=>!l.title.trim());if(i!==-1){const l=new Error(`Title cannot be empty at position ${i+1}`);throw c?.onError?.(l),l}L(l=>({...l,[n]:[]}));const u=M.current;for(let l=0;l<o.length&&M.current===u;l++){const b=o[l];try{await st(n,{title:b.title,description:b.description},$.current)}catch(p){const w=p instanceof Error?p:new Error("Failed to accept all suggestions");throw c?.onError?.(w),w}}M.current===u&&(x.current&&N(x.current),c?.onSuccess?.())},[N]),Se=s.useCallback(()=>{B([]),G(!1)},[]),Ze=s.useCallback(n=>{L(c=>{const o={...c};return delete o[n],o}),ae(c=>{const o={...c};return delete o[n],o})},[]),pe=s.useCallback(async(n,c)=>{const o=++ce.current,i=r;he(!0),te(null);try{const u=await Qt(n,i);if(ce.current!==o||r!==i)return;fe(u),c?.onSuccess?.()}catch(u){if(ce.current!==o||r!==i)return;const l=u instanceof Error?u:new Error(String(u));te(l),fe(null),c?.onError?.(l)}finally{ce.current===o&&he(!1)}},[r]),Ae=s.useCallback(()=>{fe(null),te(null),he(!1)},[]),et=s.useCallback(async()=>{await Z(),x.current&&await N(x.current)},[Z,N]);return{roadmaps:d,selectedRoadmapId:_,selectedRoadmap:y,milestones:k,featuresByMilestoneId:C,loading:O,error:V,createRoadmap:Pe,updateRoadmap:Ne,deleteRoadmap:He,selectRoadmap:Ve,createMilestone:f,updateMilestone:R,deleteMilestone:re,reorderMilestones:E,createFeature:Ue,updateFeature:$e,deleteFeature:Re,reorderFeatures:me,moveFeature:ee,milestoneSuggestions:ve,isGeneratingSuggestions:P,generateMilestoneSuggestions:se,updateMilestoneSuggestionDraft:Ie,acceptMilestoneSuggestion:K,acceptAllMilestoneSuggestions:W,clearMilestoneSuggestions:Se,featureSuggestionsByMilestoneId:xe,isGeneratingFeatureSuggestions:Xe,generateFeatureSuggestions:Be,updateFeatureSuggestionDraft:ye,acceptFeatureSuggestion:Ge,acceptAllFeatureSuggestions:Qe,clearFeatureSuggestions:Ze,handoffPayload:oe,isFetchingHandoff:Je,handoffError:be,fetchHandoff:pe,clearHandoff:Ae,refresh:et}}function mt(){return typeof window>"u"?"desktop":window.matchMedia("(max-width: 768px)").matches?"mobile":window.matchMedia("(min-width: 769px) and (max-width: 1024px)").matches?"tablet":"desktop"}function ea(){const[a,r]=s.useState(()=>mt());return s.useEffect(()=>{const d=()=>r(mt());return window.addEventListener("resize",d),()=>window.removeEventListener("resize",d)},[]),a}function ta(){return{confirm:async a=>{const r=typeof a=="string"?a:[a.title,a.message].filter(Boolean).join(`
|
|
2
|
-
|
|
3
|
-
`);return window.confirm(r||"Are you sure?")}}}function aa({isOpen:a,onClose:r,roadmapTitle:d,handoffPayload:g,isLoading:_,error:j,onFetchHandoff:y,onCopyToClipboard:h}){return a?e.jsx("div",{className:"modal-overlay open",onClick:r,role:"presentation",children:e.jsxs("div",{className:"modal modal-lg",onClick:k=>k.stopPropagation(),role:"dialog","aria-modal":"true","aria-labelledby":"handoff-modal-title",children:[e.jsxs("div",{className:"modal-header",children:[e.jsxs("h2",{id:"handoff-modal-title",children:["Export Roadmap: ",d]}),e.jsx("button",{className:"modal-close",onClick:r,"aria-label":"Close modal",children:e.jsx(ie,{size:18})})]}),e.jsxs("div",{className:"modal-body",children:[e.jsx("p",{className:"text-muted roadmaps-view__handoff-intro",children:"Export roadmap data for use in mission and task planning flows. This is a read-only export — no missions or tasks will be created."}),j&&e.jsxs("div",{className:"form-error roadmaps-view__handoff-error",children:["Error loading handoff data: ",j.message]}),!g&&!_&&e.jsx("div",{className:"roadmaps-view__handoff-empty-state",children:e.jsxs("button",{className:"btn btn-primary",onClick:y,children:[e.jsx(nt,{size:16,className:"roadmaps-view__handoff-button-icon"}),"Load Handoff Data"]})}),_&&e.jsxs("div",{className:"roadmaps-view__handoff-loading-state",children:[e.jsx(At,{size:24,className:"spin"}),e.jsx("p",{className:"roadmaps-view__handoff-loading-text",children:"Loading handoff data..."})]}),g&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__handoff-section",children:[e.jsx("h3",{className:"roadmaps-view__handoff-section-title",children:"Mission Planning Handoff"}),e.jsx("div",{className:"card roadmaps-view__handoff-card",children:e.jsx("pre",{className:"roadmaps-view__handoff-pre roadmaps-view__handoff-pre--mission",children:JSON.stringify(g.mission,null,2)})})]}),e.jsxs("div",{className:"roadmaps-view__handoff-section",children:[e.jsxs("h3",{className:"roadmaps-view__handoff-section-title",children:["Feature Task Planning Handoffs (",g.features.length,")"]}),e.jsx("div",{className:"card roadmaps-view__handoff-card",children:e.jsx("pre",{className:"roadmaps-view__handoff-pre roadmaps-view__handoff-pre--features",children:JSON.stringify(g.features,null,2)})})]})]})]}),e.jsxs("div",{className:"modal-actions",children:[e.jsx("div",{className:"modal-actions-left",children:g&&e.jsxs("button",{className:"btn btn-sm",onClick:h,children:[e.jsx(zt,{size:14,className:"roadmaps-view__handoff-copy-icon"}),"Copy to Clipboard"]})}),e.jsx("div",{className:"modal-actions-right",children:e.jsx("button",{className:"btn",onClick:r,children:"Close"})})]})]})}):null}function ra({roadmap:a,isSelected:r,onSelect:d,onEdit:g,onDelete:_,onExport:j}){const y=C=>{C.key==="Enter"&&d()},h=C=>{C.stopPropagation(),g()},k=C=>{C.stopPropagation(),_()},D=C=>{C.stopPropagation(),j()};return e.jsxs("div",{className:`roadmaps-view__sidebar-item${r?" roadmaps-view__sidebar-item--active":""}`,onClick:d,onKeyDown:y,role:"button",tabIndex:0,"aria-selected":r,"data-testid":`roadmap-item-${a.id}`,children:[e.jsxs("div",{className:"roadmaps-view__sidebar-item-content",children:[e.jsx("div",{className:"roadmaps-view__sidebar-item-title",children:a.title}),a.description&&e.jsx("div",{className:"roadmaps-view__sidebar-item-desc",children:a.description})]}),e.jsxs("div",{className:"roadmaps-view__sidebar-item-actions",onClick:h,role:"presentation",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:D,title:"Export roadmap","aria-label":"Export roadmap","data-testid":`roadmap-export-${a.id}`,type:"button",children:e.jsx(nt,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:h,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`roadmap-edit-${a.id}`,type:"button",children:e.jsx(Me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:k,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`roadmap-delete-${a.id}`,type:"button",children:e.jsx(Le,{size:14})})]})]})}function sa({roadmaps:a,selectedRoadmapId:r,onSelect:d,onCreate:g,onEdit:_,onDelete:j,onExport:y,showCreateForm:h,onCancelCreate:k,onSaveCreate:D}){return e.jsxs("div",{className:"roadmaps-view__mobile-list","data-testid":"roadmaps-view__mobile-list",children:[e.jsxs("div",{className:"roadmaps-view__mobile-list-header",children:[e.jsx("h2",{className:"roadmaps-view__mobile-list-title",children:"Roadmaps"}),!h&&e.jsx("button",{className:"roadmaps-view__mobile-add-btn",onClick:g,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-create-roadmap-btn",children:e.jsx(Oe,{size:18})})]}),h&&e.jsx("div",{className:"roadmaps-view__mobile-create-form",children:e.jsx(ft,{onSave:D,onCancel:k})}),a.length===0&&!h?e.jsxs("div",{className:"roadmaps-view__mobile-empty",children:[e.jsx("p",{children:"No roadmaps yet."}),e.jsxs("button",{className:"btn btn-primary btn-sm",onClick:g,children:[e.jsx(Oe,{size:14}),e.jsx("span",{children:"Create Roadmap"})]})]}):e.jsx("div",{className:"roadmaps-view__mobile-list-items",children:a.map(C=>e.jsxs("div",{className:`roadmaps-view__mobile-item${C.id===r?" roadmaps-view__mobile-item--active":""}`,onClick:()=>d(C.id),role:"button",tabIndex:0,onKeyDown:S=>{S.key==="Enter"&&d(C.id)},"data-testid":`mobile-roadmap-item-${C.id}`,children:[e.jsxs("div",{className:"roadmaps-view__mobile-item-content",children:[e.jsx("span",{className:"roadmaps-view__mobile-item-title",children:C.title}),C.description&&e.jsx("span",{className:"roadmaps-view__mobile-item-desc",children:C.description})]}),e.jsxs("div",{className:"roadmaps-view__mobile-item-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:S=>{S.stopPropagation(),y(C)},title:"Export roadmap","aria-label":"Export roadmap","data-testid":`mobile-roadmap-export-${C.id}`,children:e.jsx(nt,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:S=>{S.stopPropagation(),_(C)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":`mobile-roadmap-edit-${C.id}`,children:e.jsx(Me,{size:16})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:S=>{S.stopPropagation(),j(C.id)},title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":`mobile-roadmap-delete-${C.id}`,children:e.jsx(Le,{size:16})})]})]},C.id))})]})}function na({roadmapTitle:a,onBack:r,onEdit:d,onDelete:g,onCreate:_}){return e.jsxs("div",{className:"roadmaps-view__mobile-header","data-testid":"roadmaps-view__mobile-header",children:[e.jsx("button",{className:"roadmaps-view__mobile-back-btn",onClick:r,title:"Back to roadmap list","aria-label":"Back to roadmap list","data-testid":"mobile-back-btn",children:e.jsx(It,{size:20})}),e.jsx("h2",{className:"roadmaps-view__mobile-header-title",children:a}),e.jsxs("div",{className:"roadmaps-view__mobile-header-actions",children:[e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:_,title:"Create roadmap","aria-label":"Create roadmap","data-testid":"mobile-header-create-btn",children:e.jsx(Oe,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn",onClick:d,title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"mobile-header-edit-btn",children:e.jsx(Me,{size:18})}),e.jsx("button",{className:"roadmaps-view__mobile-action-btn roadmaps-view__mobile-action-btn--danger",onClick:g,title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"mobile-header-delete-btn",children:e.jsx(Le,{size:18})})]})]})}function ia({milestone:a,features:r,onEditMilestone:d,onDeleteMilestone:g,onAddFeature:_,onEditFeature:j,onDeleteFeature:y,milestoneEdit:h,onMilestoneEditChange:k,onMilestoneEditFieldChange:D,onCancelMilestoneEdit:C,onSaveMilestoneEdit:S,featureEdit:O,onFeatureEditChange:X,onStartFeatureEdit:V,onCancelFeatureEdit:I,onSaveFeatureEdit:oe,projectId:fe,addToast:Je,isMilestoneDragging:he,isMilestoneDropTarget:be,milestoneDropPosition:te,onMilestoneDragStart:ve,onMilestoneDragEnd:B,onMilestoneDragOver:P,onMilestoneDrop:G,onMilestoneDragLeave:xe,isFeatureDragging:L,isFeatureDropTarget:le,featureDropIndex:ae,onFeatureDragStart:Q,onFeatureDragEnd:we,onFeatureDragOver:de,onFeatureDrop:_e,onFeatureDragLeave:M,onFeatureDropOnMilestone:ce,featureSuggestions:je,isGeneratingFeatureSuggestions:x,onGenerateFeatureSuggestions:ue,onAcceptFeatureSuggestion:Ce,onAcceptAllFeatureSuggestions:$,onUpdateFeatureSuggestionDraft:Te,onClearFeatureSuggestions:Z}){const N=h?.milestoneId===a.id,Pe=f=>{f.key==="Enter"?(f.preventDefault(),h&&S({title:h.value})):f.key==="Escape"&&C()},Ne=f=>{f.key==="Escape"&&C()},He=["roadmaps-view__milestone",he?"roadmaps-view__milestone--dragging":"",be?"roadmaps-view__milestone--drop-target":"",be&&te==="before"?"roadmaps-view__milestone--drop-before":"",be&&te==="after"?"roadmaps-view__milestone--drop-after":""].filter(Boolean).join(" "),Ve=["roadmaps-view__feature-list",le?"roadmaps-view__feature-list--drop-target":""].filter(Boolean).join(" ");return e.jsxs("div",{className:He,draggable:!N,onDragStart:f=>{N||(ve(a.id),f.dataTransfer.setData("text/plain",`milestone:${a.id}`),f.dataTransfer.effectAllowed="move")},onDragEnd:B,onDragOver:f=>{f.dataTransfer.types.includes("text/plain")&&f.dataTransfer.types.includes("text/plain")&&(f.preventDefault(),f.dataTransfer.dropEffect="move",P(a.id))},onDrop:f=>{f.preventDefault(),f.dataTransfer.getData("text/plain")?.startsWith("feature:")||G(a.id)},onDragLeave:xe,"data-testid":`milestone-card-${a.id}`,children:[e.jsx("div",{className:"roadmaps-view__milestone-header",children:N&&h?e.jsxs("div",{className:"roadmaps-view__inline-edit",children:[e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${a.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:h.value,onChange:f=>{D("title"),k(f.target.value)},onKeyDown:Pe,placeholder:"Milestone title",autoFocus:!0,"data-testid":`milestone-title-input-${a.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>S({title:h.value}),"aria-label":"Save milestone title",title:"Save",children:e.jsx(ge,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:C,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ie,{size:14})})]}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:h.field==="description"?h.value:a.description||"",onChange:f=>{D("description"),k(f.target.value)},onKeyDown:Ne,placeholder:"Milestone description (optional)",rows:2,"data-testid":`milestone-desc-input-${a.id}`})]}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__milestone-title-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`milestone-drag-handle-${a.id}`,children:e.jsx(Ye,{size:14})}),e.jsx("h3",{className:"roadmaps-view__milestone-title",children:a.title}),e.jsxs("div",{className:"roadmaps-view__milestone-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:d,title:"Edit milestone","aria-label":"Edit milestone","data-testid":`milestone-edit-${a.id}`,children:e.jsx(Me,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:g,title:"Delete milestone","aria-label":"Delete milestone","data-testid":`milestone-delete-${a.id}`,children:e.jsx(Le,{size:14})})]})]}),a.description&&e.jsx("p",{className:"roadmaps-view__milestone-desc",children:a.description})]})}),e.jsxs("div",{className:"roadmaps-view__milestone-actions-bar",children:[e.jsxs("button",{className:"roadmaps-view__add-feature-btn",onClick:_,title:"Add feature","aria-label":"Add feature","data-testid":`add-feature-${a.id}`,children:[e.jsx(Oe,{size:12}),e.jsx("span",{children:"Add Feature"})]}),e.jsxs("button",{className:"roadmaps-view__suggest-btn",onClick:()=>{ue?.()},disabled:x??!1,title:"Generate feature suggestions with AI","aria-label":"Generate feature suggestions","data-testid":`generate-features-${a.id}`,children:[e.jsx(gt,{size:12}),e.jsx("span",{children:x?"Generating...":"AI Suggestions"})]})]}),e.jsxs("div",{className:Ve,onDragOver:f=>{f.preventDefault(),f.dataTransfer.dropEffect="move",f.dataTransfer.getData("text/plain")?.startsWith("feature:")&&ce()},onDrop:f=>{f.preventDefault();const R=f.dataTransfer.getData("text/plain");R?.startsWith("feature:")&&_e(R.split(":")[1],r.length)},onDragLeave:M,children:[r.length===0?e.jsx("p",{className:"roadmaps-view__empty-features",children:"No features yet."}):r.map((f,R)=>{const re=O?.featureId===f.id,Ue=L(f.id),$e=E=>{E.key==="Enter"?(E.preventDefault(),O&&oe({title:O.value})):E.key==="Escape"&&I()},Re=["roadmaps-view__feature-item",Ue?"roadmaps-view__feature-item--dragging":"",le&&ae===R?"roadmaps-view__feature-item--drop-before":"",le&&ae===R+1?"roadmaps-view__feature-item--drop-after":""].filter(Boolean).join(" ");return e.jsx("div",{className:Re,draggable:!re,onDragStart:E=>{re||(Q(f.id,a.id),E.dataTransfer.setData("text/plain",`feature:${f.id}`),E.dataTransfer.effectAllowed="move")},onDragEnd:we,onDragOver:E=>{if(E.preventDefault(),E.stopPropagation(),E.dataTransfer.dropEffect="move",E.dataTransfer.getData("text/plain")?.startsWith("feature:")){const ee=E.currentTarget.getBoundingClientRect(),U=ee.top+ee.height/2,se=E.clientY<U?"before":"after";de(f.id,se)}},onDrop:E=>{E.preventDefault(),E.stopPropagation();const me=E.dataTransfer.getData("text/plain");if(me?.startsWith("feature:")){const ee=me.split(":")[1],U=E.currentTarget.getBoundingClientRect(),se=U.top+U.height/2,Ie=E.clientY<se?"before":"after";let K=R;Ie==="after"&&(K=R+1),_e(ee,K)}},onDragLeave:M,"data-testid":`feature-item-${f.id}`,children:re&&O?e.jsx("div",{className:"roadmaps-view__inline-edit roadmaps-view__inline-edit--compact",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${f.id}`,children:e.jsx(Ye,{size:12})}),e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:O.value,onChange:E=>X(E.target.value),onKeyDown:$e,placeholder:"Feature title",autoFocus:!0,"data-testid":`feature-title-input-${f.id}`}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>oe({title:O.value}),"aria-label":"Save feature title",title:"Save",children:e.jsx(ge,{size:14})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:I,"aria-label":"Cancel editing",title:"Cancel",children:e.jsx(ie,{size:14})})]})}):e.jsxs(e.Fragment,{children:[e.jsx("span",{className:"roadmaps-view__drag-handle roadmaps-view__drag-handle--feature",title:"Drag to reorder","aria-label":"Drag to reorder","data-testid":`feature-drag-handle-${f.id}`,children:e.jsx(Ye,{size:12})}),e.jsxs("div",{className:"roadmaps-view__feature-content",children:[e.jsx("span",{className:"roadmaps-view__feature-title",children:f.title}),f.description&&e.jsx("p",{className:"roadmaps-view__feature-desc",children:f.description})]}),e.jsxs("div",{className:"roadmaps-view__feature-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>j(f.id),title:"Edit feature","aria-label":"Edit feature","data-testid":`feature-edit-${f.id}`,children:e.jsx(Me,{size:12})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>y(f.id),title:"Delete feature","aria-label":"Delete feature","data-testid":`feature-delete-${f.id}`,children:e.jsx(Le,{size:12})})]})]})},f.id)}),je&&je.length>0&&e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h4",{className:"roadmap-suggestion-title",children:"AI Feature Suggestions"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-accept-all-btn",onClick:()=>$?.(),title:"Accept all suggestions","aria-label":"Accept all","data-testid":`accept-all-features-${a.id}`,children:"Accept All"}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:()=>Z?.(),title:"Clear suggestions","aria-label":"Clear","data-testid":`clear-features-${a.id}`,children:"Clear"})]})]}),e.jsx("div",{className:"roadmap-suggestion-list",children:je.map(f=>e.jsx(oa,{suggestion:f,onUpdateDraft:R=>Te?.(a.id,f.id,R),onAccept:()=>{Ce?.(a.id,f.id)},testIdPrefix:`feature-suggestion-${a.id}`},f.id))})]})]})]})}function oa({suggestion:a,onUpdateDraft:r,onAccept:d,testIdPrefix:g}){const[_,j]=s.useState(!1),[y,h]=s.useState(a.title),[k,D]=s.useState(a.description||""),C=()=>{h(a.title),D(a.description||""),j(!0)},S=()=>{r({title:y.trim(),description:k.trim()||void 0}),j(!1)},O=()=>{h(a.title),D(a.description||""),j(!1)},X=()=>{a.title.trim()&&d()},V=a.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:y,onChange:I=>h(I.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":`${g}-${a.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:k,onChange:I=>D(I.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${g}-${a.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:S,disabled:!y.trim(),title:"Save","data-testid":`${g}-${a.id}-save`,children:e.jsx(ge,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:O,title:"Cancel","data-testid":`${g}-${a.id}-cancel`,children:e.jsx(ie,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${g}-${a.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:a.title}),a.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:a.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${g}-${a.id}-edit`,children:e.jsx(Me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:X,disabled:!V,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${g}-${a.id}-accept`,children:e.jsx(ge,{size:12})})]})]})}function pt({suggestion:a,onUpdateDraft:r,onAccept:d,testIdPrefix:g}){const[_,j]=s.useState(!1),[y,h]=s.useState(a.title),[k,D]=s.useState(a.description||""),C=()=>{h(a.title),D(a.description||""),j(!0)},S=()=>{r({title:y.trim(),description:k.trim()||void 0}),j(!1)},O=()=>{h(a.title),D(a.description||""),j(!1)},X=()=>{a.title.trim()&&d()},V=a.title.trim().length>0;return _?e.jsx("div",{className:"roadmap-suggestion-card roadmap-suggestion-card--editing",children:e.jsxs("div",{className:"roadmap-suggestion-edit-form",children:[e.jsx("input",{type:"text",className:"roadmap-suggestion-input",value:y,onChange:I=>h(I.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":`${g}-${a.id}-title-input`}),e.jsx("textarea",{className:"roadmap-suggestion-textarea",value:k,onChange:I=>D(I.target.value),placeholder:"Description (optional)",rows:2,"data-testid":`${g}-${a.id}-desc-input`}),e.jsxs("div",{className:"roadmap-suggestion-edit-actions",children:[e.jsx("button",{className:"roadmap-suggestion-save-btn",onClick:S,disabled:!y.trim(),title:"Save","data-testid":`${g}-${a.id}-save`,children:e.jsx(ge,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-cancel-btn",onClick:O,title:"Cancel","data-testid":`${g}-${a.id}-cancel`,children:e.jsx(ie,{size:12})})]})]})}):e.jsxs("div",{className:"roadmap-suggestion-card","data-testid":`${g}-${a.id}`,children:[e.jsxs("div",{className:"roadmap-suggestion-content",children:[e.jsx("span",{className:"roadmap-suggestion-card-title",children:a.title}),a.description&&e.jsx("p",{className:"roadmap-suggestion-card-desc",children:a.description})]}),e.jsxs("div",{className:"roadmap-suggestion-card-actions",children:[e.jsx("button",{className:"roadmap-suggestion-edit-btn",onClick:C,title:"Edit suggestion","aria-label":"Edit","data-testid":`${g}-${a.id}-edit`,children:e.jsx(Me,{size:12})}),e.jsx("button",{className:"roadmap-suggestion-accept-btn",onClick:X,disabled:!V,title:"Accept this suggestion","aria-label":"Accept","data-testid":`${g}-${a.id}-accept`,children:e.jsx(ge,{size:12})})]})]})}function ft({onSave:a,onCancel:r}){const[d,g]=s.useState(""),[_,j]=s.useState(""),y=h=>{h.preventDefault(),d.trim()&&a({title:d.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form","data-testid":"create-roadmap-form",children:e.jsxs("form",{onSubmit:y,children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:d,onChange:h=>g(h.target.value),placeholder:"Roadmap title",autoFocus:!0,"data-testid":"create-roadmap-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:h=>j(h.target.value),placeholder:"Roadmap description (optional)",rows:2,"data-testid":"create-roadmap-description"}),e.jsxs("div",{className:"roadmaps-view__create-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__btn roadmaps-view__btn--primary",disabled:!d.trim(),"data-testid":"create-roadmap-submit",children:"Create"}),e.jsx("button",{type:"button",className:"roadmaps-view__btn",onClick:r,"data-testid":"create-roadmap-cancel",children:"Cancel"})]})]})})}function la({onSave:a,onCancel:r}){const[d,g]=s.useState(""),[_,j]=s.useState(""),y=h=>{h.preventDefault(),d.trim()&&a({title:d.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-milestone-form",children:e.jsxs("form",{onSubmit:y,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:d,onChange:h=>g(h.target.value),placeholder:"Milestone title",autoFocus:!0,"data-testid":"create-milestone-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:h=>j(h.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-milestone-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!d.trim(),"aria-label":"Save milestone",title:"Save","data-testid":"create-milestone-submit",children:e.jsx(ge,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:r,"aria-label":"Cancel",title:"Cancel","data-testid":"create-milestone-cancel",children:e.jsx(ie,{size:14})})]})]})})}function da({onSave:a,onCancel:r}){const[d,g]=s.useState(""),[_,j]=s.useState(""),y=h=>{h.preventDefault(),d.trim()&&a({title:d.trim(),description:_.trim()||void 0})};return e.jsx("div",{className:"roadmaps-view__create-form roadmaps-view__create-form--inline","data-testid":"create-feature-form",children:e.jsxs("form",{onSubmit:y,className:"roadmaps-view__inline-form",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input",value:d,onChange:h=>g(h.target.value),placeholder:"Feature title",autoFocus:!0,"data-testid":"create-feature-title"}),e.jsx("textarea",{className:"roadmaps-view__inline-textarea",value:_,onChange:h=>j(h.target.value),placeholder:"Description (optional)",rows:1,"data-testid":"create-feature-description"}),e.jsxs("div",{className:"roadmaps-view__inline-form-actions",children:[e.jsx("button",{type:"submit",className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",disabled:!d.trim(),"aria-label":"Save feature",title:"Save","data-testid":"create-feature-submit",children:e.jsx(ge,{size:14})}),e.jsx("button",{type:"button",className:"roadmaps-view__icon-btn",onClick:r,"aria-label":"Cancel",title:"Cancel","data-testid":"create-feature-cancel",children:e.jsx(ie,{size:14})})]})]})})}function ca({projectId:a,addToast:r}){const{confirm:d}=ta(),g=ea()==="mobile",{roadmaps:_,selectedRoadmapId:j,selectedRoadmap:y,milestones:h,featuresByMilestoneId:k,loading:D,error:C,createRoadmap:S,updateRoadmap:O,deleteRoadmap:X,selectRoadmap:V,createMilestone:I,updateMilestone:oe,deleteMilestone:fe,createFeature:Je,updateFeature:he,deleteFeature:be,reorderMilestones:te,reorderFeatures:ve,moveFeature:B,milestoneSuggestions:P,isGeneratingSuggestions:G,generateMilestoneSuggestions:xe,updateMilestoneSuggestionDraft:L,acceptMilestoneSuggestion:le,acceptAllMilestoneSuggestions:ae,clearMilestoneSuggestions:Q,featureSuggestionsByMilestoneId:we,isGeneratingFeatureSuggestions:de,generateFeatureSuggestions:_e,updateFeatureSuggestionDraft:M,acceptFeatureSuggestion:ce,acceptAllFeatureSuggestions:je,clearFeatureSuggestions:x,handoffPayload:ue,isFetchingHandoff:Ce,handoffError:$,fetchHandoff:Te,clearHandoff:Z}=Zt({projectId:a}),[N,Pe]=s.useState(!1),[Ne,He]=s.useState(null),[Ve,f]=s.useState(""),[R,re]=s.useState(""),[Ue,$e]=s.useState(!1),Re=s.useRef(null);s.useEffect(()=>{Re.current!==null&&Re.current!==j&&$e(!1),Re.current=j},[j]);const[E,me]=s.useState({roadmapId:null,field:null,value:""}),[ee,U]=s.useState({milestoneId:null,field:null,value:""}),[se,Ie]=s.useState({featureId:null,field:null,value:""}),[K,W]=s.useState({type:null,parentId:void 0,title:"",description:""}),[Xe,Be]=s.useState(!1),[ye,Ge]=s.useState({draggingId:null,dropTargetId:null,dropPosition:null}),Qe=s.useCallback(t=>{Ge(m=>({...m,draggingId:t}))},[]),Se=s.useCallback(()=>{Ge({draggingId:null,dropTargetId:null,dropPosition:null})},[]),Ze=s.useCallback(t=>{Ge(m=>m.draggingId===t?m:{...m,dropTargetId:t,dropPosition:null})},[]),[pe,Ae]=s.useState({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}),et=s.useCallback((t,m)=>{Ae(v=>({...v,draggingId:t,draggingMilestoneId:m}))},[]),n=s.useCallback(()=>{Ae({draggingId:null,draggingMilestoneId:null,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null})},[]),c=s.useCallback((t,m)=>{Ae(v=>{if(v.draggingId===t)return v;const J=(k[v.draggingMilestoneId||""]||[]).findIndex(Fe=>Fe.id===t);let Y;return m==="before"?Y=J:Y=J+1,{...v,dropTargetMilestoneId:v.draggingMilestoneId,dropTargetIndex:Y,dropPosition:m}})},[k]),o=s.useCallback(()=>{Ae(t=>({...t,dropTargetMilestoneId:t.draggingMilestoneId,dropTargetIndex:(k[t.draggingMilestoneId||""]||[]).length}))},[k]),i=s.useCallback(async(t,m)=>{const{draggingMilestoneId:v,dropTargetMilestoneId:T}=pe;if(!v){n();return}const J=T||v,Y=k[v]||[],Fe=Y.find(De=>De.id===t);if(!Fe){n();return}if(v!==J){if(v===J){n();return}try{await B(t,J,m,{onError:De=>{r(`Failed to move feature: ${De.message}`,"error")}})}catch{}}else{const De=[...Y],Mt=De.findIndex(ze=>ze.id===t);De.splice(Mt,1),De.splice(m,0,Fe);const ut=De.map(ze=>ze.id),$t=Y.map(ze=>ze.id);if(ut.join(",")===$t.join(",")){n();return}try{await ve(v,ut,{onError:ze=>{r(`Failed to reorder features: ${ze.message}`,"error")}})}catch{}}n()},[pe,k,ve,B,r,n]),u=s.useCallback(t=>{const m=t.currentTarget.getBoundingClientRect(),v=t.clientX,T=t.clientY;(v<m.left||v>m.right||T<m.top||T>m.bottom)&&Ae(J=>({...J,dropTargetMilestoneId:null,dropTargetIndex:null,dropPosition:null}))},[]),l=s.useCallback(t=>pe.draggingId===t,[pe.draggingId]),b=s.useCallback(async t=>{const{draggingId:m}=ye;if(!m||m===t){Se();return}const v=h.map(Fe=>Fe.id),T=v.indexOf(m),J=v.indexOf(t);if(T===-1||J===-1){Se();return}const Y=[...v];if(Y.splice(T,1),Y.splice(J,0,m),Y.join(",")===v.join(",")){Se();return}try{await te(j,Y,{onError:Fe=>{r(`Failed to reorder milestones: ${Fe.message}`,"error")}})}catch{}Se()},[ye,h,j,te,r,Se]),p=s.useCallback(t=>{const m=t.currentTarget.getBoundingClientRect(),v=t.clientX,T=t.clientY;(v<m.left||v>m.right||T<m.top||T>m.bottom)&&Ge(J=>({...J,dropTargetId:null,dropPosition:null}))},[]),w=s.useCallback(t=>{V(t.id),me({roadmapId:t.id,field:"title",value:t.title})},[V]),H=s.useCallback(()=>{me({roadmapId:null,field:null,value:""})},[]),Ee=s.useCallback(async t=>{if(E.roadmapId)try{await O(E.roadmapId,t,{onError:m=>r(m.message,"error")}),H()}catch{}},[E.roadmapId,O,H,r]),ne=s.useCallback(async t=>{if(await d({title:"Delete Roadmap",message:"Delete this roadmap? This cannot be undone.",danger:!0}))try{await X(t,{onError:v=>r(v.message,"error")}),r("Roadmap deleted","success")}catch{}},[X,r,d]),Ke=s.useCallback((t,m)=>{He(t),f(m),Pe(!0),Z()},[Z]),F=s.useCallback(()=>{Pe(!1),He(null),f(""),Z()},[Z]),q=s.useCallback(()=>{Ne&&Te(Ne,{onError:t=>r(`Failed to load handoff: ${t.message}`,"error")})},[Ne,Te,r]),We=s.useCallback(()=>{if(ue){const t=JSON.stringify(ue,null,2);navigator.clipboard.writeText(t).then(()=>{r("Handoff data copied to clipboard","success")}).catch(()=>{r("Failed to copy to clipboard","error")})}},[ue,r]),qe=s.useCallback(async t=>{try{await S(t,{onError:m=>r(m.message,"error")}),W({type:null,parentId:void 0,title:"",description:""}),r("Roadmap created","success")}catch{}},[S,r]),ht=s.useCallback(t=>{U({milestoneId:t.id,field:"title",value:t.title})},[]),bt=s.useCallback(t=>{U(m=>({...m,value:t}))},[]),vt=s.useCallback(t=>{U(m=>({...m,field:t}))},[]),tt=s.useCallback(()=>{U({milestoneId:null,field:null,value:""})},[]),xt=s.useCallback(async t=>{if(ee.milestoneId)try{await oe(ee.milestoneId,t,{onError:m=>r(m.message,"error")}),tt()}catch{}},[ee.milestoneId,oe,tt,r]),wt=s.useCallback(async t=>{if(await d({title:"Delete Milestone",message:"Delete this milestone and all its features?",danger:!0}))try{await fe(t,{onError:v=>r(v.message,"error")}),r("Milestone deleted","success")}catch{}},[fe,r,d]),_t=s.useCallback(async t=>{try{await I(t,{onError:m=>r(m.message,"error")}),W({type:null,parentId:void 0,title:"",description:""}),r("Milestone created","success")}catch{}},[I,r]),it=s.useCallback((t,m,v)=>{Ie({featureId:t,field:"title",value:m})},[]),jt=s.useCallback(t=>{Ie(m=>({...m,value:t}))},[]),at=s.useCallback(()=>{Ie({featureId:null,field:null,value:""})},[]),Ct=s.useCallback(async t=>{if(se.featureId)try{await he(se.featureId,t,{onError:m=>r(m.message,"error")}),at()}catch{}},[se.featureId,he,at,r]),Nt=s.useCallback(async t=>{if(await d({title:"Delete Feature",message:"Delete this feature?",danger:!0}))try{await be(t,{onError:v=>r(v.message,"error")}),r("Feature deleted","success")}catch{}},[be,r,d]),ot=s.useCallback(async()=>{if(R.trim())try{await xe(R,5,{onError:t=>r(t.message,"error")})}catch{}},[R,xe,r]),lt=s.useCallback(async t=>{try{await le(t,{onError:m=>r(m.message,"error")}),r("Milestone added","success")}catch{}},[le,r]),dt=s.useCallback(async()=>{try{await ae({onError:t=>r(t.message,"error")}),r(`${P.length} milestones added`,"success"),re("")}catch{}},[ae,P.length,r]),ct=s.useCallback(()=>{Q(),re("")},[Q]),yt=s.useCallback(async t=>{try{await _e(t,{count:5},{onError:m=>r(m.message,"error")})}catch{}},[_e,r]),St=s.useCallback(async(t,m)=>{try{await ce(t,m,{onError:v=>r(v.message,"error")}),r("Feature added","success")}catch{}},[ce,r]),Et=s.useCallback((t,m,v)=>{M(t,m,v)},[M]),kt=s.useCallback(async t=>{const m=we[t]||[];try{await je(t,{onError:v=>r(v.message,"error")}),r(`${m.length} features added`,"success")}catch{}},[je,we,r]),Ft=s.useCallback(t=>{x(t)},[x]),Dt=s.useCallback(async(t,m)=>{try{await Je(t,m,{onError:v=>r(v.message,"error")}),W({type:null,parentId:void 0,title:"",description:""}),r("Feature created","success")}catch{}},[Je,r]),ke=j;return D&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--loading",children:e.jsx("div",{className:"roadmaps-view__loading-state",children:"Loading roadmaps..."})}):C&&_.length===0?e.jsx("div",{className:"roadmaps-view roadmaps-view--error",children:e.jsxs("div",{className:"roadmaps-view__error-state",children:[e.jsx("p",{children:"Failed to load roadmaps"}),e.jsx("p",{className:"roadmaps-view__error-msg",children:C.message})]})}):e.jsxs("div",{className:"roadmaps-view",children:[g&&!ke&&e.jsx(sa,{roadmaps:_,selectedRoadmapId:ke,onSelect:t=>V(t),onCreate:()=>Be(!0),onEdit:w,onDelete:ne,onExport:t=>Ke(t.id,t.title),showCreateForm:Xe,onCancelCreate:()=>Be(!1),onSaveCreate:async t=>{await qe(t),Be(!1)}}),!g&&e.jsxs("aside",{className:"roadmaps-view__sidebar","aria-label":"Roadmaps",children:[e.jsxs("div",{className:"roadmaps-view__sidebar-header",children:[e.jsx("h2",{className:"roadmaps-view__sidebar-title",children:"Roadmaps"}),e.jsx("button",{className:"roadmaps-view__add-btn",onClick:()=>W({type:"roadmap",title:"",description:""}),title:"Create roadmap","aria-label":"Create roadmap","data-testid":"create-roadmap-btn",children:e.jsx(Oe,{size:16})})]}),K.type==="roadmap"&&e.jsx(ft,{onSave:qe,onCancel:()=>W({type:null,parentId:void 0,title:"",description:""})}),e.jsx("div",{className:"roadmaps-view__sidebar-list",children:_.length===0?e.jsx("p",{className:"roadmaps-view__empty-sidebar",children:"No roadmaps yet. Click + to create one."}):_.map(t=>e.jsx(ra,{roadmap:t,isSelected:t.id===ke,onSelect:()=>V(t.id),onEdit:()=>w(t),onDelete:()=>ne(t.id),onExport:()=>Ke(t.id,t.title)},t.id))})]}),e.jsxs("main",{className:"roadmaps-view__main","aria-label":"Roadmap content",children:[g&&ke&&e.jsx(na,{roadmapTitle:y?.title||"Untitled Roadmap",onBack:()=>V(null),onEdit:()=>{y&&w(y)},onDelete:()=>ne(ke),onCreate:()=>Be(!0)}),ke?e.jsxs(e.Fragment,{children:[e.jsx("div",{className:"roadmaps-view__roadmap-header",children:E.roadmapId===ke?e.jsx("div",{className:"roadmaps-view__inline-edit",children:e.jsxs("div",{className:"roadmaps-view__inline-edit-row",children:[e.jsx("input",{type:"text",className:"roadmaps-view__inline-input roadmaps-view__inline-input--large",value:E.value,onChange:t=>me(m=>({...m,value:t.target.value})),onKeyDown:t=>{t.key==="Enter"?Ee({title:E.value}):t.key==="Escape"&&H()},placeholder:"Roadmap title",autoFocus:!0,"data-testid":"roadmap-title-input"}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--success",onClick:()=>Ee({title:E.value}),"aria-label":"Save",title:"Save",children:e.jsx(ge,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:H,"aria-label":"Cancel",title:"Cancel",children:e.jsx(ie,{size:16})})]})}):e.jsxs(e.Fragment,{children:[e.jsxs("div",{className:"roadmaps-view__roadmap-title-row",children:[e.jsx("h1",{className:"roadmaps-view__roadmap-title",children:y?.title||"Untitled Roadmap"}),e.jsxs("div",{className:"roadmaps-view__roadmap-actions",children:[e.jsx("button",{className:"roadmaps-view__icon-btn",onClick:()=>{y&&w(y)},title:"Edit roadmap","aria-label":"Edit roadmap","data-testid":"edit-roadmap-btn",children:e.jsx(Me,{size:16})}),e.jsx("button",{className:"roadmaps-view__icon-btn roadmaps-view__icon-btn--danger",onClick:()=>ne(ke),title:"Delete roadmap","aria-label":"Delete roadmap","data-testid":"delete-roadmap-btn",children:e.jsx(Le,{size:16})})]})]}),y?.description&&e.jsx("p",{className:"roadmaps-view__roadmap-desc",children:y.description})]})}),g?Ue?e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsxs("div",{className:"roadmap-suggestion-header",children:[e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"}),e.jsx("button",{className:"roadmap-suggestion-collapse-btn",onClick:()=>$e(!1),"aria-label":"Collapse suggestion panel","data-testid":"collapse-suggestion-panel-btn",children:e.jsx(Rt,{size:16})})]}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:R,onChange:t=>re(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:G||!j,"data-testid":"goal-prompt-input",autoFocus:!0}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:ot,disabled:!R.trim()||G||!j,"data-testid":"generate-suggestions-btn",children:G?"Generating...":"Generate Milestones"}),P.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:dt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",P.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ie,{size:14})})]})]})]}),P.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:P.map(t=>e.jsx(pt,{suggestion:t,onUpdateDraft:m=>L(t.id,m),onAccept:()=>lt(t.id),testIdPrefix:"suggestion"},t.id))})]}):e.jsx("div",{className:"roadmap-suggestion-section",children:e.jsxs("button",{className:"roadmap-suggestion-expand-btn",onClick:()=>$e(!0),disabled:!j,"data-testid":"expand-suggestion-panel-btn",children:[e.jsx(gt,{size:16}),"Generate Milestone Ideas"]})}):e.jsxs("div",{className:"roadmap-suggestion-section",children:[e.jsx("div",{className:"roadmap-suggestion-header",children:e.jsx("h3",{className:"roadmap-suggestion-title",children:"Generate Milestone Ideas"})}),e.jsxs("div",{className:"roadmap-suggestion-form",children:[e.jsx("textarea",{className:"roadmap-suggestion-input",value:R,onChange:t=>re(t.target.value),placeholder:"Describe your roadmap goal (e.g., 'Build a user authentication system with OAuth, profiles, and admin dashboard')",rows:2,disabled:G||!j,"data-testid":"goal-prompt-input"}),e.jsxs("div",{className:"roadmap-suggestion-actions",children:[e.jsx("button",{className:"roadmap-suggestion-generate-btn",onClick:ot,disabled:!R.trim()||G||!j,"data-testid":"generate-suggestions-btn",children:G?"Generating...":"Generate Milestones"}),P.length>0&&e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"roadmap-suggestion-accept-all-btn",onClick:dt,"data-testid":"accept-all-suggestions-btn",children:["Accept All (",P.length,")"]}),e.jsx("button",{className:"roadmap-suggestion-clear-btn",onClick:ct,title:"Clear suggestions","aria-label":"Clear suggestions","data-testid":"clear-suggestions-btn",children:e.jsx(ie,{size:14})})]})]})]}),P.length>0&&e.jsx("div",{className:"roadmap-suggestion-list",children:P.map(t=>e.jsx(pt,{suggestion:t,onUpdateDraft:m=>L(t.id,m),onAccept:()=>lt(t.id),testIdPrefix:"suggestion"},t.id))})]}),e.jsxs("div",{className:"roadmaps-view__milestone-lanes",children:[K.type==="milestone"&&e.jsx(la,{onSave:_t,onCancel:()=>W({type:null,parentId:void 0,title:"",description:""})}),h.length===0&&K.type!=="milestone"?e.jsxs("div",{className:"roadmaps-view__empty-milestones",children:[e.jsx("p",{children:"This roadmap has no milestones."}),e.jsxs("button",{className:"roadmaps-view__add-milestone-btn",onClick:()=>W({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn-empty",children:[e.jsx(Oe,{size:14}),e.jsx("span",{children:"Add Milestone"})]})]}):e.jsxs(e.Fragment,{children:[K.type!=="milestone"&&e.jsxs("button",{className:"roadmaps-view__add-milestone-fab",onClick:()=>W({type:"milestone",title:"",description:""}),"data-testid":"add-milestone-btn",children:[e.jsx(Oe,{size:14}),e.jsx("span",{children:"Add Milestone"})]}),h.map(t=>e.jsx(ia,{milestone:t,features:k[t.id]||[],onEditMilestone:()=>ht(t),onDeleteMilestone:()=>wt(t.id),onAddFeature:()=>W({type:"feature",parentId:t.id,title:"",description:""}),onEditFeature:m=>{const v=k[t.id]?.find(T=>T.id===m);v&&it(m,v.title,v.description)},onDeleteFeature:Nt,milestoneEdit:ee,onMilestoneEditChange:bt,onMilestoneEditFieldChange:vt,onCancelMilestoneEdit:tt,onSaveMilestoneEdit:xt,featureEdit:se,onFeatureEditChange:jt,onStartFeatureEdit:it,onCancelFeatureEdit:at,onSaveFeatureEdit:Ct,projectId:a,addToast:r,isMilestoneDragging:ye.draggingId===t.id,isMilestoneDropTarget:ye.dropTargetId===t.id,milestoneDropPosition:ye.dropTargetId===t.id?ye.dropPosition:null,onMilestoneDragStart:Qe,onMilestoneDragEnd:Se,onMilestoneDragOver:Ze,onMilestoneDrop:b,onMilestoneDragLeave:p,isFeatureDragging:l,isFeatureDropTarget:pe.dropTargetMilestoneId===t.id,featureDropIndex:pe.dropTargetMilestoneId===t.id?pe.dropTargetIndex:null,onFeatureDragStart:et,onFeatureDragEnd:n,onFeatureDragOver:c,onFeatureDrop:i,onFeatureDragLeave:u,onFeatureDropOnMilestone:o,featureSuggestions:we[t.id],isGeneratingFeatureSuggestions:de(t.id),onGenerateFeatureSuggestions:()=>yt(t.id),onAcceptFeatureSuggestion:m=>St(t.id,m),onAcceptAllFeatureSuggestions:()=>kt(t.id),onUpdateFeatureSuggestionDraft:(m,v,T)=>Et(m,v,T),onClearFeatureSuggestions:()=>Ft(t.id)},t.id))]})]})]}):e.jsx("div",{className:"roadmaps-view__empty-main",children:e.jsx("p",{children:"Select a roadmap from the sidebar to view its milestones."})})]}),K.type==="feature"&&K.parentId&&e.jsx("div",{className:"roadmaps-view__feature-create-overlay",children:e.jsx(da,{onSave:t=>Dt(K.parentId,t),onCancel:()=>W({type:null,parentId:void 0,title:"",description:""})})}),e.jsx(aa,{isOpen:N,onClose:F,roadmapId:Ne||"",roadmapTitle:Ve,handoffPayload:ue,isLoading:Ce,error:$,onFetchHandoff:q,onCopyToClipboard:We})]})}function fa({context:a}){return e.jsx(ca,{projectId:a?.projectId,addToast:a?.addToast??(()=>{})})}export{fa as RoadmapDashboardView};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
.ce-view{display:flex;color:var(--text);flex:1 1 auto;flex-direction:column;gap:1rem;min-width:0;min-height:0;width:100%;height:100%;padding:1rem 1.25rem;box-sizing:border-box;overflow:auto}.ce-view-header{display:flex;align-items:baseline;justify-content:space-between;gap:1rem}.ce-view-header h2{margin:0}.ce-view-summary{font-size:.8rem;color:var(--text-muted)}.ce-loading,.ce-view-error{padding:.75rem 1rem;font-size:.85rem}.ce-view-error{color:var(--color-error)}.ce-empty{max-width:36rem;padding:1.5rem;display:flex;flex-direction:column;gap:.75rem;align-items:flex-start}.ce-empty h3{margin:0}.ce-empty-hint{color:var(--text-muted);font-size:.85rem}.ce-groups{display:grid;grid-template-columns:repeat(auto-fill,minmax(18rem,1fr));gap:1rem}.ce-group{border:1px solid var(--border);border-radius:8px;padding:.75rem 1rem;display:flex;flex-direction:column;gap:.5rem}.ce-group[data-empty=true]{color:var(--text-muted)}.ce-group-header{display:flex;align-items:center;justify-content:space-between}.ce-group-header h3{margin:0;font-size:.95rem}.ce-group-count{font-size:.75rem;color:var(--text-dim)}.ce-group-empty{margin:0;font-size:.8rem;color:var(--text-dim)}.ce-artifact-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem}.ce-artifact{display:flex;align-items:center;justify-content:space-between;gap:.5rem;font-size:.85rem}.ce-artifact.is-selected{font-weight:600}.ce-artifact-btn{background:none;border:none;text-align:left;cursor:pointer;display:flex;flex-direction:column;color:inherit;padding:.25rem 0;flex:1}.ce-artifact-path{font-size:.7rem;color:var(--text-dim)}.ce-artifact-open{appearance:none;background:none;border:none;color:var(--color-info);cursor:pointer;font:inherit;padding:0;text-decoration:underline}.ce-artifact-open:hover,.ce-artifact-open:focus-visible{color:var(--color-info)}.ce-artifact-error .ce-artifact-error-msg{color:var(--color-error);font-size:.78rem}.ce-artifact-error{flex-direction:column;align-items:flex-start;gap:.15rem}.ce-view[data-mobile=true]{width:100%;padding:var(--space-sm)}.ce-view[data-mobile=true] .ce-groups{grid-template-columns:1fr}@media(max-width:768px){.ce-view{width:100%;padding:var(--space-sm)}.ce-session-row{align-items:center;flex-direction:row}.ce-session-open{flex-wrap:wrap}.ce-session-cancel,.ce-session-discard,.ce-flow-cancel,.ce-flow-close{margin-left:0}}.ce-launcher{margin:.75rem 0}.ce-launcher-list{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(140px,1fr));gap:.5rem}.ce-launcher-tile{width:100%;display:flex;align-items:center;gap:.5rem}.ce-launcher-icon{flex:none}.ce-view-start{margin-left:auto}.ce-flow{margin:.75rem 0;display:flex;flex:1 1 auto;flex-direction:column;gap:.6rem;min-height:0;overflow-y:auto}.ce-flow-header{display:flex;align-items:center;gap:.5rem}.ce-flow-header h3{margin:0;text-transform:capitalize}.ce-flow-status{font-size:.72rem;color:var(--text-muted);text-transform:capitalize}.ce-flow-cancel,.ce-flow-close{margin-left:auto}.ce-flow-cancel+.ce-flow-close{margin-left:0}.ce-flow-transcript{list-style:none;margin:0;padding:0;display:flex;flex:1 1 auto;flex-direction:column;gap:.35rem;min-height:0;overflow-y:auto}.ce-flow-turn{display:flex;flex-direction:column}.ce-flow-turn-role{font-size:.65rem;text-transform:uppercase;color:var(--text-dim)}.ce-flow-turn-agent .ce-flow-turn-text{white-space:pre-wrap}.ce-flow-thinking{font-style:italic;color:var(--text-muted)}.ce-flow-question{display:flex;flex-direction:column;gap:.4rem}.ce-flow-question-text{font-weight:600;margin:0}.ce-flow-question-desc{font-size:.8rem;color:var(--text-muted);margin:0}.ce-flow-text{display:flex;flex-direction:column;gap:.4rem}.ce-flow-text textarea,.ce-flow-guidance-row textarea{background:var(--surface);color:var(--text);border:1px solid var(--border);border-radius:var(--radius-sm);font-family:var(--font-primary);outline:none;transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.ce-flow-text textarea{width:100%;resize:vertical}.ce-flow-text textarea:focus,.ce-flow-guidance-row textarea:focus{border-color:var(--todo);box-shadow:var(--focus-ring)}.ce-flow-text textarea::placeholder,.ce-flow-guidance-row textarea::placeholder{color:var(--text-dim)}.ce-flow-confirm{display:flex;gap:.5rem}.ce-flow-options{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.35rem}.ce-flow-options ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.ce-flow-option{width:100%;text-align:left;display:flex;flex-direction:column}.ce-flow-option-desc{font-size:.72rem;color:var(--text-muted)}.ce-flow-checkbox{display:flex;align-items:center;gap:.4rem;cursor:pointer}.ce-flow-error{color:var(--color-error);font-size:.82rem}.ce-flow-degraded{border:1px dashed var(--color-warning);border-radius:6px;padding:.6rem;background:color-mix(in srgb,var(--color-warning) 8%,transparent)}.ce-flow-degraded-banner{margin:0 0 .4rem;font-size:.78rem;font-weight:600;color:var(--color-warning)}.ce-flow-degraded-options{font-size:.78rem;color:var(--text-muted);margin:0 0 .4rem;padding-left:1.1rem}.ce-sessions{margin-bottom:.8rem}.ce-sessions-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:.3rem}.ce-session-row{display:flex;align-items:center;gap:.5rem}.ce-session-row.is-active .ce-session-open{border-color:var(--todo);background:color-mix(in srgb,var(--todo) 8%,transparent)}.ce-session-open{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:.6rem;text-align:left;padding:.4rem .6rem;border:1px solid var(--border);border-radius:6px;background:transparent;cursor:pointer}.ce-session-open:disabled{cursor:default;opacity:.6}.ce-session-stage{font-weight:600}.ce-session-status{font-size:.74rem;text-transform:capitalize;color:var(--text-muted)}.ce-session-status-awaiting_input{color:var(--color-warning);font-weight:600}.ce-session-status-error,.ce-session-status-interrupted{color:var(--color-error)}.ce-session-status-completed{color:var(--color-success)}.ce-session-updated{margin-left:auto;font-size:.72rem;color:var(--text-dim)}.ce-session-cancel,.ce-session-discard{flex:none}.ce-session-cancel,.ce-flow-cancel{appearance:none;display:inline-flex;align-items:center;justify-content:center;width:calc(var(--space-xl) + var(--space-sm));height:calc(var(--space-xl) + var(--space-sm));padding:var(--space-xs);border:0;border-radius:var(--radius-sm);background:transparent;color:var(--color-error);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast),box-shadow var(--transition-fast),opacity var(--transition-fast)}.ce-session-cancel:hover:not(:disabled),.ce-flow-cancel:hover:not(:disabled){background:color-mix(in srgb,var(--color-error) 10%,transparent);color:var(--color-error)}.ce-session-cancel:focus-visible,.ce-flow-cancel:focus-visible{box-shadow:var(--focus-ring);outline:none}.ce-session-cancel:disabled,.ce-flow-cancel:disabled{cursor:default;opacity:.6}.ce-flow-transcript{list-style:none;margin:0 0 .8rem;padding:0;display:flex;flex:1 1 auto;flex-direction:column;gap:.45rem;min-height:0;overflow-y:auto}.ce-flow-turn{display:flex;flex-direction:column;gap:.15rem;max-width:85%;padding:.45rem .65rem;border-radius:10px;background:color-mix(in srgb,var(--border) 30%,transparent)}.ce-flow-turn-user{align-self:flex-end;background:color-mix(in srgb,var(--todo) 12%,transparent)}.ce-flow-turn-role{font-size:.68rem;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--text-dim)}.ce-flow-turn-text{white-space:pre-wrap;word-break:break-word;font-size:.86rem}.ce-flow-turn-answer.is-steering{border-left:3px solid var(--color-warning)}.ce-flow-turn-comment{font-size:.78rem;font-style:italic;color:var(--text-muted);border-top:1px dashed color-mix(in srgb,var(--border) 60%,transparent);padding-top:.25rem}.ce-flow-turn-done{align-self:center;background:color-mix(in srgb,var(--color-success) 10%,transparent);font-size:.8rem}.ce-flow-artifact-path{color:var(--text-dim)}.ce-flow-turn-activity{background:transparent;padding:0;max-width:100%}.ce-flow-activity-details summary{cursor:pointer;font-size:.78rem;color:var(--text-muted)}.ce-flow-activity{display:flex;flex-direction:column;gap:.25rem;margin:.3rem 0 0;padding:.5rem .6rem;border:1px solid color-mix(in srgb,var(--border) 70%,transparent);border-radius:8px;background:color-mix(in srgb,var(--border) 12%,transparent);max-height:16rem;overflow-y:auto}.ce-activity-block{margin:0;font-size:.76rem;white-space:pre-wrap;word-break:break-word;font-family:var(--font-mono, ui-monospace, monospace)}.ce-activity-thinking{color:var(--text-dim);font-style:italic}.ce-activity-tool{font-size:.76rem;font-family:var(--font-mono, ui-monospace, monospace)}.ce-activity-tool.is-running .ce-activity-tool-marker{color:var(--todo)}.ce-activity-tool.is-done .ce-activity-tool-marker{color:var(--color-success)}.ce-activity-tool.is-error .ce-activity-tool-marker{color:var(--color-error)}.ce-flow-working{margin:.4rem 0}.ce-flow-working-label{display:flex;align-items:center;gap:.45rem;margin:0 0 .3rem;font-size:.82rem;color:var(--text-muted)}.ce-flow-pulse{width:8px;height:8px;border-radius:50%;background:var(--todo);animation:ce-pulse 1.2s ease-in-out infinite}@keyframes ce-pulse{0%,to{opacity:.25;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}.ce-flow-guidance{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed color-mix(in srgb,var(--border) 70%,transparent)}.ce-flow-guidance-label{display:block;font-size:.74rem;color:var(--text-dim);margin-bottom:.3rem}.ce-flow-guidance-row{display:flex;gap:.4rem;align-items:flex-end}.ce-flow-guidance-row textarea{flex:1;resize:vertical}
|