@runfusion/fusion 0.52.0 → 0.53.1
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/dist/bin.js +3064 -2337
- package/dist/client/.vite/manifest.json +248 -248
- package/dist/client/assets/{AgentDetailView-C-PM8cwG.js → AgentDetailView-DYiAlisV.js} +3 -3
- package/dist/client/assets/AgentPermissionPolicyEditor-CMtzKP_x.js +6 -0
- package/dist/client/assets/AgentPermissionPolicyEditor-TpdlOWZW.css +1 -0
- package/dist/client/assets/{AgentsView-DJJO0laF.js → AgentsView-YfJlxZoN.js} +3 -3
- package/dist/client/assets/ChatView-Diuc5LOe.js +6 -0
- package/dist/client/assets/{CommandCenter-CKvo0MuO.js → CommandCenter-CIwFDUKg.js} +2 -2
- package/dist/client/assets/{DevServerView-BHLG4Mxg.js → DevServerView-DDRHfATy.js} +1 -1
- package/dist/client/assets/{DirectoryPicker-CRY-rpnj.js → DirectoryPicker-C6HRGnSQ.js} +1 -1
- package/dist/client/assets/{DocumentsView-DhC4dnXD.js → DocumentsView-C5RTxVSE.js} +1 -1
- package/dist/client/assets/{EvalsView-DsnLOVZB.js → EvalsView-B9DCS8sV.js} +1 -1
- package/dist/client/assets/{ExperimentalAgentOnboardingModal-B4iFX60E.js → ExperimentalAgentOnboardingModal-DGmpwghz.js} +1 -1
- package/dist/client/assets/{GoalsView-D5bzq6W9.js → GoalsView-B2hr3p6f.js} +1 -1
- package/dist/client/assets/{InsightsView-Drpu72M4.js → InsightsView-DM3eYN2S.js} +1 -1
- package/dist/client/assets/{MemoryView-auLBP3UW.js → MemoryView-8Yg8r9qS.js} +1 -1
- package/dist/client/assets/{PiExtensionsManager-RlbkXf_t.js → PiExtensionsManager-DbZ5qtAF.js} +1 -1
- package/dist/client/assets/{PluginManager-BJMUacpG.js → PluginManager-C1YuxOWu.js} +1 -1
- package/dist/client/assets/{PullRequestView-344B9WF-.js → PullRequestView-CMVvVGaP.js} +1 -1
- package/dist/client/assets/{ResearchView-BNqt-f53.js → ResearchView-BjvgxMjL.js} +1 -1
- package/dist/client/assets/{SecretsView-Be8Tm8It.js → SecretsView-gChNSW57.js} +1 -1
- package/dist/client/assets/SessionTerminal-BSeQ5i5F.js +2 -0
- package/dist/client/assets/SettingsModal-CQuHnNXu.js +21 -0
- package/dist/client/assets/{SettingsModal-B28DuhaN.js → SettingsModal-_04cEhgW.js} +1 -1
- package/dist/client/assets/{SetupWizardModal-y2j9aZoi.js → SetupWizardModal-Dk9VO68p.js} +2 -2
- package/dist/client/assets/ShadcnColorPicker-3OgfenMo.css +1 -0
- package/dist/client/assets/ShadcnColorPicker-DyPMec2U.js +11 -0
- package/dist/client/assets/{SkillsView-HQp7UTdA.js → SkillsView-BAMinq2_.js} +1 -1
- package/dist/client/assets/{TodoView-DF7_qWGH.js → TodoView-DaXGwdTQ.js} +1 -1
- package/dist/client/assets/WorkflowNodeEditor-DmJI-3Qp.js +8 -0
- package/dist/client/assets/{agentSkills-Cy_HrYHd.js → agentSkills-B_n4hPLc.js} +1 -1
- package/dist/client/assets/app-5S4z84u5.js +13 -0
- package/dist/client/assets/app-B1VYocx2.js +13 -0
- package/dist/client/assets/app-BhtYYxin.js +13 -0
- package/dist/client/assets/app-Cts0__Vx.js +13 -0
- package/dist/client/assets/app-DczBmsP4.js +13 -0
- package/dist/client/assets/app-_GFUqcMK.js +13 -0
- package/dist/client/assets/{architectureDiagram-3BPJPVTR-4ur4sxlr.js → architectureDiagram-3BPJPVTR-DysoZtiI.js} +1 -1
- package/dist/client/assets/{blockDiagram-GPEHLZMM-BgZeqq_q.js → blockDiagram-GPEHLZMM-DpwJlK7i.js} +1 -1
- package/dist/client/assets/{c4Diagram-AAUBKEIU-BQtdOIrm.js → c4Diagram-AAUBKEIU-DV115Z4B.js} +1 -1
- package/dist/client/assets/channel-BgnsK1mp.js +1 -0
- package/dist/client/assets/{chunk-2J33WTMH-C1k1PBy1.js → chunk-2J33WTMH-B5BtZWCx.js} +1 -1
- package/dist/client/assets/{chunk-4BX2VUAB-hNujwvSn.js → chunk-4BX2VUAB-CJvgQM9e.js} +1 -1
- package/dist/client/assets/{chunk-55IACEB6-CnXV9LyI.js → chunk-55IACEB6-ClrKLhVZ.js} +1 -1
- package/dist/client/assets/{chunk-727SXJPM-B-ocMdYN.js → chunk-727SXJPM-DhfUMdP5.js} +1 -1
- package/dist/client/assets/{chunk-AQP2D5EJ-CWNRUL6C.js → chunk-AQP2D5EJ-CGKqiWfs.js} +1 -1
- package/dist/client/assets/{chunk-FMBD7UC4-DerrCiYe.js → chunk-FMBD7UC4-sLs4-jLA.js} +1 -1
- package/dist/client/assets/{chunk-ND2GUHAM-BfcSPlX-.js → chunk-ND2GUHAM-BaptHWZM.js} +1 -1
- package/dist/client/assets/{chunk-QZHKN3VN-BaWScAds.js → chunk-QZHKN3VN-CArEOzHE.js} +1 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-ZkHxi9su.js +1 -0
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-ZkHxi9su.js +1 -0
- package/dist/client/assets/{cose-bilkent-S5V4N54A-n0Oeinz2.js → cose-bilkent-S5V4N54A-DZ4jAfQc.js} +1 -1
- package/dist/client/assets/{dagre-BM42HDAG-CUtehSt2.js → dagre-BM42HDAG-CMhtRslH.js} +1 -1
- package/dist/client/assets/{dashboard-view-BW3GHqgb.js → dashboard-view-Bc5cz2DG.js} +1 -1
- package/dist/client/assets/{dashboard-view-DWKCxtr5.js → dashboard-view-Buq7raMZ.js} +1 -1
- package/dist/client/assets/{diagram-2AECGRRQ-Bz4aOzhR.js → diagram-2AECGRRQ-6uVCJGM-.js} +1 -1
- package/dist/client/assets/{diagram-5GNKFQAL-UoxIMwPf.js → diagram-5GNKFQAL-fRigQDqm.js} +1 -1
- package/dist/client/assets/{diagram-KO2AKTUF-BYR7hloS.js → diagram-KO2AKTUF-DeLeKk1C.js} +1 -1
- package/dist/client/assets/{diagram-LMA3HP47-BR9MaP8U.js → diagram-LMA3HP47-BVRY5C4e.js} +1 -1
- package/dist/client/assets/{diagram-OG6HWLK6-BOfldYHv.js → diagram-OG6HWLK6-DdP1xMRM.js} +1 -1
- package/dist/client/assets/{erDiagram-TEJ5UH35-B8x9mfOs.js → erDiagram-TEJ5UH35-BU5DG9IX.js} +1 -1
- package/dist/client/assets/{flowDiagram-I6XJVG4X-DBnTroCV.js → flowDiagram-I6XJVG4X-CFSihB_T.js} +1 -1
- package/dist/client/assets/{folder-open-CFze34Eq.js → folder-open-CV5ek-IV.js} +1 -1
- package/dist/client/assets/{ganttDiagram-6RSMTGT7-BfzFy7iz.js → ganttDiagram-6RSMTGT7-BFVLXtHC.js} +1 -1
- package/dist/client/assets/{gitGraphDiagram-PVQCEYII-CNTFu6IY.js → gitGraphDiagram-PVQCEYII-TiwSURa4.js} +1 -1
- package/dist/client/assets/index-CEUULqTR.js +1336 -0
- package/dist/client/assets/index-D1IHwGhg.css +1 -0
- package/dist/client/assets/{infoDiagram-5YYISTIA-DJiBRaAl.js → infoDiagram-5YYISTIA-Drkf3o26.js} +1 -1
- package/dist/client/assets/{ishikawaDiagram-YF4QCWOH-CIY9t4cc.js → ishikawaDiagram-YF4QCWOH-a9ZSlbx2.js} +1 -1
- package/dist/client/assets/{journeyDiagram-JHISSGLW-HLMZmcjY.js → journeyDiagram-JHISSGLW-DF_3fPPW.js} +1 -1
- package/dist/client/assets/{kanban-definition-UN3LZRKU-x9nKoxCI.js → kanban-definition-UN3LZRKU-B6dXVyXh.js} +1 -1
- package/dist/client/assets/{mermaid.core-pHkdB6fb.js → mermaid.core-BGFpwAba.js} +4 -4
- package/dist/client/assets/{mindmap-definition-RKZ34NQL-Bs_4Tofu.js → mindmap-definition-RKZ34NQL-D5bZ0zCy.js} +1 -1
- package/dist/client/assets/{pieDiagram-4H26LBE5-BGHz9JGZ.js → pieDiagram-4H26LBE5-Dh6rUd7R.js} +1 -1
- package/dist/client/assets/{quadrantDiagram-W4KKPZXB-xHSR7cAR.js → quadrantDiagram-W4KKPZXB-D9Fy6Nl1.js} +1 -1
- package/dist/client/assets/{requirementDiagram-4Y6WPE33-D7YMNM44.js → requirementDiagram-4Y6WPE33-Bky271Dr.js} +1 -1
- package/dist/client/assets/{sankeyDiagram-5OEKKPKP-OAXuab3Y.js → sankeyDiagram-5OEKKPKP-Cs9Bx7N3.js} +1 -1
- package/dist/client/assets/{sequenceDiagram-3UESZ5HK-BZCjKFVL.js → sequenceDiagram-3UESZ5HK-BV7DAI0_.js} +1 -1
- package/dist/client/assets/{shield-alert-BBK8Risa.js → shield-alert-BEwCrI8k.js} +1 -1
- package/dist/client/assets/{stateDiagram-AJRCARHV-COnJQqA4.js → stateDiagram-AJRCARHV-CTvWoU00.js} +1 -1
- package/dist/client/assets/{stateDiagram-v2-BHNVJYJU-Diml4Nhm.js → stateDiagram-v2-BHNVJYJU-ZSZ46LWU.js} +1 -1
- package/dist/client/assets/{timeline-definition-PNZ67QCA-DHIKvV9L.js → timeline-definition-PNZ67QCA-DSJscSa7.js} +1 -1
- package/dist/client/assets/{upload-CqUJUdZW.js → upload-CNW5goS6.js} +1 -1
- package/dist/client/assets/{users-CAE-FEzI.js → users-BhzdPkLN.js} +1 -1
- package/dist/client/assets/{vennDiagram-CIIHVFJN-o9AxLDoL.js → vennDiagram-CIIHVFJN-CziD-NoU.js} +1 -1
- package/dist/client/assets/{wardley-L42UT6IY-B7MIazje.js → wardley-L42UT6IY-Bt1vdMb3.js} +1 -1
- package/dist/client/assets/{wardleyDiagram-YWT4CUSO-B6qUJx0N.js → wardleyDiagram-YWT4CUSO-B_Dlx683.js} +1 -1
- package/dist/client/assets/{xychartDiagram-2RQKCTM6-13mSXuCA.js → xychartDiagram-2RQKCTM6-cYDRrhyM.js} +1 -1
- package/dist/client/index.html +3 -3
- package/dist/client/theme-data.css +156 -0
- package/dist/client/version.json +1 -1
- package/dist/desktop/client/.vite/manifest.json +1652 -0
- package/dist/desktop/client/assets/AgentDetailView-BzSyldiW.css +1 -0
- package/dist/desktop/client/assets/AgentDetailView-SJpg9JA5.js +18 -0
- package/dist/desktop/client/assets/AgentPermissionPolicyEditor-KMUDm0nu.js +6 -0
- package/dist/desktop/client/assets/AgentPermissionPolicyEditor-TpdlOWZW.css +1 -0
- package/dist/desktop/client/assets/AgentsView-CITigHGD.js +24 -0
- package/dist/desktop/client/assets/AgentsView-CzMa5Olf.css +1 -0
- package/dist/desktop/client/assets/ChatView-D_2wBIIx.css +1 -0
- package/dist/desktop/client/assets/ChatView-EeFLKmZB.js +6 -0
- package/dist/desktop/client/assets/CommandCenter-B9q-zM9p.css +1 -0
- package/dist/desktop/client/assets/CommandCenter-DmqJyMvs.js +71 -0
- package/dist/desktop/client/assets/DevServerView-Ckhpio_x.js +1 -0
- package/dist/desktop/client/assets/DevServerView-iBondC7z.css +1 -0
- package/dist/desktop/client/assets/DirectoryPicker-0rspvcMz.css +1 -0
- package/dist/desktop/client/assets/DirectoryPicker-j-rxo0kC.js +1 -0
- package/dist/desktop/client/assets/DocumentsView-DCS-N7cU.js +1 -0
- package/dist/desktop/client/assets/EvalsView-CTbgPUne.css +1 -0
- package/dist/desktop/client/assets/EvalsView-Dd26ipFU.js +1 -0
- package/dist/desktop/client/assets/ExperimentalAgentOnboardingModal-3ZEFv8sr.css +1 -0
- package/dist/desktop/client/assets/ExperimentalAgentOnboardingModal-BqgWIa9n.js +1 -0
- package/dist/desktop/client/assets/GoalsView-4-eEOeqw.css +1 -0
- package/dist/desktop/client/assets/GoalsView-C5gWzKqI.js +2 -0
- package/dist/desktop/client/assets/InsightsView-2SPZDH3m.js +11 -0
- package/dist/desktop/client/assets/InsightsView-C7yRTMPn.css +1 -0
- package/dist/desktop/client/assets/MemoryView-CBDUr2Jy.css +1 -0
- package/dist/desktop/client/assets/MemoryView-D2OAkbGv.js +2 -0
- package/dist/desktop/client/assets/PiExtensionsManager-DLrKJDwr.js +11 -0
- package/dist/desktop/client/assets/PiExtensionsManager-kgTOHPE9.css +1 -0
- package/dist/desktop/client/assets/PluginManager-B0CMG4RR.js +1 -0
- package/dist/desktop/client/assets/PluginManager-DSiHizRD.css +1 -0
- package/dist/desktop/client/assets/PullRequestView-DhTrKHeu.js +6 -0
- package/dist/desktop/client/assets/PullRequestView-NkeImY1n.css +1 -0
- package/dist/desktop/client/assets/ResearchView-BQwV9L4h.js +1 -0
- package/dist/desktop/client/assets/ResearchView-DIVNQF4_.css +1 -0
- package/dist/desktop/client/assets/SecretsView-Boby9tkU.js +1 -0
- package/dist/desktop/client/assets/SecretsView-CvFioX7R.css +1 -0
- package/dist/desktop/client/assets/SessionTerminal-CPbzm5Oi.css +1 -0
- package/dist/desktop/client/assets/SessionTerminal-CT_DUO7z.js +2 -0
- package/dist/desktop/client/assets/SettingsModal-BzZNPNIh.css +1 -0
- package/dist/desktop/client/assets/SettingsModal-CaE4JYxi.css +1 -0
- package/dist/desktop/client/assets/SettingsModal-CvsRQchW.js +1 -0
- package/dist/desktop/client/assets/SettingsModal-Dijfj3cb.js +21 -0
- package/dist/desktop/client/assets/SetupWizardModal-BIiJIXkh.js +2 -0
- package/dist/desktop/client/assets/ShadcnColorPicker-0ZZqsOqD.js +11 -0
- package/dist/desktop/client/assets/ShadcnColorPicker-3OgfenMo.css +1 -0
- package/dist/desktop/client/assets/SkillsView-Pzo5lSju.js +1 -0
- package/dist/desktop/client/assets/SkillsView-tAW7TTCz.css +1 -0
- package/dist/desktop/client/assets/TodoView--YoVYWvw.css +1 -0
- package/dist/desktop/client/assets/TodoView-ClCgLTmi.js +6 -0
- package/dist/desktop/client/assets/WorkflowNodeEditor-8XHmq-V2.js +8 -0
- package/dist/desktop/client/assets/WorkflowNodeEditor-Df-_206_.css +1 -0
- package/dist/desktop/client/assets/addon-fit-C1WQXRvu.js +1 -0
- package/dist/desktop/client/assets/addon-unicode11-BVmNDUBM.js +1 -0
- package/dist/desktop/client/assets/addon-web-links-CkVew5xs.js +1 -0
- package/dist/desktop/client/assets/addon-webgl-uLc0RKcC.js +58 -0
- package/dist/desktop/client/assets/agentSkills-D5osLOR5.js +1 -0
- package/dist/desktop/client/assets/agentSkills-bQJ4X1gH.css +1 -0
- package/dist/desktop/client/assets/agentsOrgChartLayout-BMvyuaLA.js +1 -0
- package/dist/desktop/client/assets/app-5S4z84u5.js +13 -0
- package/dist/desktop/client/assets/app-B1VYocx2.js +13 -0
- package/dist/desktop/client/assets/app-BhtYYxin.js +13 -0
- package/dist/desktop/client/assets/app-Cts0__Vx.js +13 -0
- package/dist/desktop/client/assets/app-DczBmsP4.js +13 -0
- package/dist/desktop/client/assets/app-_GFUqcMK.js +13 -0
- package/dist/desktop/client/assets/arc-cxkkNsnK.js +1 -0
- package/dist/desktop/client/assets/architectureDiagram-3BPJPVTR-CrjMDhPI.js +36 -0
- package/dist/desktop/client/assets/band-CquvqAHh.js +1 -0
- package/dist/desktop/client/assets/blockDiagram-GPEHLZMM-CTQo88ZR.js +132 -0
- package/dist/desktop/client/assets/c4Diagram-AAUBKEIU-YjMRExC0.js +10 -0
- package/dist/desktop/client/assets/channel-ByWi0lfq.js +1 -0
- package/dist/desktop/client/assets/chunk-2J33WTMH-O2741OpT.js +1 -0
- package/dist/desktop/client/assets/chunk-4BX2VUAB-E8A3umbR.js +1 -0
- package/dist/desktop/client/assets/chunk-55IACEB6-B052cwdC.js +1 -0
- package/dist/desktop/client/assets/chunk-727SXJPM-BKI0HQTP.js +206 -0
- package/dist/desktop/client/assets/chunk-AQP2D5EJ-DegV3EMW.js +231 -0
- package/dist/desktop/client/assets/chunk-FMBD7UC4-B7tLsOki.js +15 -0
- package/dist/desktop/client/assets/chunk-ND2GUHAM-2xF-Tg95.js +1 -0
- package/dist/desktop/client/assets/chunk-QZHKN3VN-DUl8dvkQ.js +1 -0
- package/dist/desktop/client/assets/classDiagram-4FO5ZUOK-C6nL18EV.js +1 -0
- package/dist/desktop/client/assets/classDiagram-v2-Q7XG4LA2-C6nL18EV.js +1 -0
- package/dist/desktop/client/assets/common-BDp2y6CF.js +1 -0
- package/dist/desktop/client/assets/common-BnEo5fLN.js +1 -0
- package/dist/desktop/client/assets/common-Bzr_Y8h4.js +1 -0
- package/dist/desktop/client/assets/common-CvwyFzfv.js +1 -0
- package/dist/desktop/client/assets/common-CztCXRkz.js +1 -0
- package/dist/desktop/client/assets/common-DPe2mbb7.js +1 -0
- package/dist/desktop/client/assets/cose-bilkent-S5V4N54A-DWz6vuMa.js +1 -0
- package/dist/desktop/client/assets/cytoscape.esm-OyMbaexL.js +331 -0
- package/dist/desktop/client/assets/dagre-BM42HDAG-GgO-3j8E.js +4 -0
- package/dist/desktop/client/assets/dashboard-view-CosTtyxo.js +1 -0
- package/dist/desktop/client/assets/dashboard-view-CuUPQZzi.css +1 -0
- package/dist/desktop/client/assets/dashboard-view-Cw1KM3Az.js +8161 -0
- package/dist/desktop/client/assets/dashboard-view-D_zsA-kz.css +1 -0
- package/dist/desktop/client/assets/defaultLocale-DX6XiGOO.js +1 -0
- package/dist/desktop/client/assets/diagram-2AECGRRQ-BZQIXBBG.js +43 -0
- package/dist/desktop/client/assets/diagram-5GNKFQAL-B1pdxoln.js +10 -0
- package/dist/desktop/client/assets/diagram-KO2AKTUF-B2lApC5l.js +3 -0
- package/dist/desktop/client/assets/diagram-LMA3HP47-BRqKMh4D.js +24 -0
- package/dist/desktop/client/assets/diagram-OG6HWLK6-Dl7BJ0tE.js +24 -0
- package/dist/desktop/client/assets/erDiagram-TEJ5UH35-DS6QZa9s.js +85 -0
- package/dist/desktop/client/assets/errors-07IrmOYM.js +1 -0
- package/dist/desktop/client/assets/errors-BPsCufin.js +1 -0
- package/dist/desktop/client/assets/errors-CcVDgqlA.js +1 -0
- package/dist/desktop/client/assets/errors-D-i_Bxc6.js +1 -0
- package/dist/desktop/client/assets/errors-DDdWAK-U.js +1 -0
- package/dist/desktop/client/assets/errors-DOF5Td3F.js +1 -0
- package/dist/desktop/client/assets/flowDiagram-I6XJVG4X-Zk7IzQc2.js +162 -0
- package/dist/desktop/client/assets/folder-open-BhDX2lOd.js +6 -0
- package/dist/desktop/client/assets/ganttDiagram-6RSMTGT7-CJuYCcjE.js +292 -0
- package/dist/desktop/client/assets/gitGraphDiagram-PVQCEYII-BmCm6tvH.js +106 -0
- package/dist/desktop/client/assets/graph--OzhPTMs.js +1 -0
- package/dist/desktop/client/assets/index-BCe5TILt.css +1 -0
- package/dist/desktop/client/assets/index-CoS-MsCg.js +1336 -0
- package/dist/desktop/client/assets/infoDiagram-5YYISTIA-Ds6lrlTh.js +2 -0
- package/dist/desktop/client/assets/init-Dmth1JHB.js +1 -0
- package/dist/desktop/client/assets/ishikawaDiagram-YF4QCWOH-D3deq-vb.js +70 -0
- package/dist/desktop/client/assets/journeyDiagram-JHISSGLW-BuHVkT2m.js +139 -0
- package/dist/desktop/client/assets/kanban-definition-UN3LZRKU-DdoE5oU5.js +89 -0
- package/dist/desktop/client/assets/katex-HP8lGamR.js +257 -0
- package/dist/desktop/client/assets/layout-SsrduOYp.js +1 -0
- package/dist/desktop/client/assets/linear-CwI45w2t.js +1 -0
- package/dist/desktop/client/assets/mermaid.core-_nbzHc5D.js +309 -0
- package/dist/desktop/client/assets/mindmap-definition-RKZ34NQL-Bq-XuCz_.js +96 -0
- package/dist/desktop/client/assets/ordinal-DILIJJjt.js +1 -0
- package/dist/desktop/client/assets/pieDiagram-4H26LBE5-BgcfpW6J.js +30 -0
- package/dist/desktop/client/assets/projectDetection-G3XuxD2X.js +1 -0
- package/dist/desktop/client/assets/quadrantDiagram-W4KKPZXB-Xys80jUW.js +7 -0
- package/dist/desktop/client/assets/requirementDiagram-4Y6WPE33-C8S5lJeA.js +84 -0
- package/dist/desktop/client/assets/sankeyDiagram-5OEKKPKP-B_3GGQyd.js +40 -0
- package/dist/desktop/client/assets/sequenceDiagram-3UESZ5HK-DIu6iwmX.js +162 -0
- package/dist/desktop/client/assets/shield-alert-BHWZI_om.js +6 -0
- package/dist/desktop/client/assets/stateDiagram-AJRCARHV-CnaR2a9t.js +1 -0
- package/dist/desktop/client/assets/stateDiagram-v2-BHNVJYJU-VHc1xbe0.js +1 -0
- package/dist/desktop/client/assets/step-yuy0qJer.js +1 -0
- package/dist/desktop/client/assets/time-Ckmi30gH.js +1 -0
- package/dist/desktop/client/assets/timeline-definition-PNZ67QCA-BrtDAg8s.js +120 -0
- package/dist/desktop/client/assets/upload-DOLP3Bv3.js +6 -0
- package/dist/desktop/client/assets/users-2kEJQeOu.js +6 -0
- package/dist/desktop/client/assets/vendor-codemirror-jBKmHyH0.js +27 -0
- package/dist/desktop/client/assets/vendor-i18n-GF3RlKbq.js +9 -0
- package/dist/desktop/client/assets/vendor-react-SZ_qB27O.js +49 -0
- package/dist/desktop/client/assets/vendor-reactflow-C5ap-Sga.css +1 -0
- package/dist/desktop/client/assets/vendor-reactflow-CnI7NMXG.js +15 -0
- package/dist/desktop/client/assets/vendor-xterm-BNq00GSj.js +9 -0
- package/dist/desktop/client/assets/vendor-xterm-LZoznX6r.css +32 -0
- package/dist/desktop/client/assets/vennDiagram-CIIHVFJN-CVjr2RxJ.js +34 -0
- package/dist/desktop/client/assets/wardley-L42UT6IY-CVstgB5f.js +173 -0
- package/dist/desktop/client/assets/wardleyDiagram-YWT4CUSO-Da3szr-D.js +78 -0
- package/dist/desktop/client/assets/xychartDiagram-2RQKCTM6-B0o0ggVt.js +7 -0
- package/dist/desktop/client/assets/zoom-out-NWbVkreR.js +41 -0
- package/dist/desktop/client/brands/hermes-logo.svg +1 -0
- package/dist/desktop/client/fonts/SymbolsNerdFontMono-Regular.ttf +0 -0
- package/dist/desktop/client/icons/icon-192.png +0 -0
- package/dist/desktop/client/icons/icon-512.png +0 -0
- package/dist/desktop/client/index.html +244 -0
- package/dist/desktop/client/logo.svg +6 -0
- package/dist/desktop/client/manifest.json +23 -0
- package/dist/desktop/client/sw.js +175 -0
- package/dist/desktop/client/theme-data.css +7154 -0
- package/dist/desktop/client/version.json +1 -0
- package/dist/desktop/main.js +1661 -0
- package/dist/desktop/main.js.map +7 -0
- package/dist/desktop/preload.js +110 -0
- package/dist/desktop/preload.js.map +7 -0
- package/dist/droid-cli/package.json +1 -1
- package/dist/extension.js +1692 -1418
- package/dist/pi-claude-cli/index.ts +40 -8
- package/dist/pi-claude-cli/package.json +5 -3
- package/dist/pi-claude-cli/src/__tests__/process-manager.test.ts +2 -2
- package/dist/pi-claude-cli/src/__tests__/provider.test.ts +39 -23
- package/dist/plugin-sdk/index.d.ts +9 -2
- 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 +15 -3
- 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/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/package.json +1 -1
- package/dist/plugins/fusion-plugin-whatsapp-chat/package.json +1 -1
- package/package.json +4 -3
- package/dist/client/assets/AgentPermissionPolicyEditor-CGxjOr6G.css +0 -1
- package/dist/client/assets/AgentPermissionPolicyEditor-DrVW4VPc.js +0 -6
- package/dist/client/assets/ChatView-C7uTm5hO.js +0 -16
- package/dist/client/assets/SessionTerminal-CumHUelZ.js +0 -2
- package/dist/client/assets/SettingsModal-AJfer-ve.js +0 -21
- package/dist/client/assets/ShadcnColorPicker-Cc72uPKJ.js +0 -11
- package/dist/client/assets/ShadcnColorPicker-CyeAnJUU.css +0 -1
- package/dist/client/assets/WorkflowNodeEditor-BjpqTIYE.js +0 -8
- package/dist/client/assets/app-CGubyqAW.js +0 -13
- package/dist/client/assets/app-CrQpHbIs.js +0 -13
- package/dist/client/assets/app-DboK-0Ty.js +0 -13
- package/dist/client/assets/app-DjnYET2y.js +0 -13
- package/dist/client/assets/app-MacS555z.js +0 -13
- package/dist/client/assets/app-nvVayIeU.js +0 -13
- package/dist/client/assets/channel-Dn5XowfJ.js +0 -1
- package/dist/client/assets/classDiagram-4FO5ZUOK-zSOW-KNk.js +0 -1
- package/dist/client/assets/classDiagram-v2-Q7XG4LA2-zSOW-KNk.js +0 -1
- package/dist/client/assets/index-QnHUwSjw.css +0 -1
- package/dist/client/assets/index-Y-vyXPPN.js +0 -1331
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/main.ts", "../src/deep-link.ts", "../src/ipc.ts", "../src/native.ts", "../src/tray.ts", "../src/shell-settings.ts", "../src/menu.ts", "../src/renderer.ts", "../src/local-runtime.ts", "../src/engine-runtime.ts"],
|
|
4
|
+
"sourcesContent": ["import { app, BrowserWindow, nativeImage, screen, Tray } from \"electron\";\nimport { join, resolve } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { setupDeepLinkHandler, registerDeepLinkProtocol } from \"./deep-link.js\";\nimport { registerIpcHandlers } from \"./ipc.js\";\nimport { buildAppMenu } from \"./menu.js\";\nimport {\n DEFAULT_WINDOW_STATE,\n loadDesktopLaunchMode,\n loadWindowState,\n saveDesktopLaunchMode,\n saveWindowState,\n setupAutoUpdater,\n triggerUpdateCheck,\n startUpdateCheckInterval,\n normalizeDesktopRemoteLaunch,\n buildRemoteShellHandoffUrl,\n clampWindowStateToVisibleDisplay,\n type DesktopLaunchMode,\n type NormalizedDesktopRemoteLaunch,\n type WindowState,\n} from \"./native.js\";\nimport { setupTray } from \"./tray.js\";\nimport { getRendererUrl, getRendererFilePath, isUrlRenderer } from \"./renderer.js\";\nimport { LocalRuntimeManager } from \"./local-runtime.js\";\nimport { readShellSettings, writeShellSettings } from \"./shell-settings.js\";\n\n// Re-export for backward compatibility\nexport { IS_DEVELOPMENT } from \"./renderer.js\";\nexport { DASHBOARD_URL } from \"./renderer.js\";\n\ninterface AppWithQuitFlag {\n isQuitting?: boolean;\n}\n\nfunction enableSourceMaps(): void {\n const processWithSourceMaps = process as NodeJS.Process & {\n setSourceMapsEnabled?: (enabled: boolean) => void;\n };\n processWithSourceMaps.setSourceMapsEnabled?.(true);\n}\n\nenableSourceMaps();\n\nlet mainWindow: BrowserWindow | null = null;\nlet tray: Tray | null = null;\nlet localRuntimeManager: LocalRuntimeManager | null = null;\nlet currentDesktopLaunchMode: DesktopLaunchMode = \"choose\";\nlet currentRemoteLaunch: NormalizedDesktopRemoteLaunch | null = null;\nlet localRuntimeStartupAttempted = false;\nlet stopUpdateCheckInterval: (() => void) | null = null;\n\nfunction getAppWithQuitFlag(): Electron.App & AppWithQuitFlag {\n return app as Electron.App & AppWithQuitFlag;\n}\n\nasync function startLocalRuntimeOnce(): Promise<void> {\n if (!localRuntimeManager || localRuntimeStartupAttempted) {\n return;\n }\n\n const status = localRuntimeManager.getStatus();\n if (status.source === \"embedded-local\" && status.state === \"running\") {\n localRuntimeStartupAttempted = true;\n return;\n }\n\n localRuntimeStartupAttempted = true;\n await localRuntimeManager.startLocal();\n}\n\nexport function getCurrentDesktopLaunchMode(): DesktopLaunchMode {\n return currentDesktopLaunchMode;\n}\n\nasync function resetLaunchModeAndReload(window: BrowserWindow): Promise<void> {\n try {\n const settings = await readShellSettings();\n settings.desktopMode = null;\n settings.hasCompletedModeSelection = false;\n await writeShellSettings(settings);\n await saveDesktopLaunchMode(\"choose\");\n } catch (error) {\n console.error(\"[desktop/main] Failed to reset shell settings\", error);\n }\n if (localRuntimeManager) {\n try {\n await localRuntimeManager.stopLocal();\n } catch (error) {\n console.error(\"[desktop/main] Failed to stop local runtime during reset\", error);\n }\n }\n currentDesktopLaunchMode = \"choose\";\n currentRemoteLaunch = null;\n localRuntimeStartupAttempted = false;\n\n // Force a clean reload to the renderer entrypoint without any cached\n // serverBaseUrl / shellMode query params so the gate re-prompts.\n try {\n if (isUrlRenderer()) {\n await window.loadURL(getRendererUrl());\n } else {\n await window.loadFile(getRendererFilePath());\n }\n } catch (error) {\n console.error(\"[desktop/main] reload failed\", error);\n }\n}\n\nexport function createMainWindow(state?: WindowState, launchTargetUrl?: string): BrowserWindow {\n const hasValidPosition = typeof state?.x === \"number\" && typeof state?.y === \"number\";\n\n const window = new BrowserWindow({\n width: state?.width ?? DEFAULT_WINDOW_STATE.width,\n height: state?.height ?? DEFAULT_WINDOW_STATE.height,\n ...(hasValidPosition ? { x: state.x, y: state.y } : {}),\n title: \"Fusion\",\n webPreferences: {\n preload: join(import.meta.dirname, \"preload.js\"),\n contextIsolation: true,\n nodeIntegration: false,\n },\n });\n\n if (launchTargetUrl) {\n void window.loadURL(launchTargetUrl);\n } else if (isUrlRenderer()) {\n void window.loadURL(getRendererUrl());\n } else {\n void window.loadFile(getRendererFilePath());\n }\n\n const showFallbackTimer = setTimeout(() => {\n window.show();\n window.focus();\n }, 2000);\n\n window.once(\"ready-to-show\", () => {\n clearTimeout(showFallbackTimer);\n window.show();\n window.focus();\n });\n\n window.on(\"close\", (event) => {\n saveWindowState(window);\n\n if (getAppWithQuitFlag().isQuitting) {\n return;\n }\n\n event.preventDefault();\n window.hide();\n });\n\n window.on(\"closed\", () => {\n mainWindow = null;\n });\n\n mainWindow = window;\n return window;\n}\n\n/**\n * Resolve the project root for the embedded local runtime.\n *\n * Must NOT be `process.cwd()`: when a packaged build is launched from a desktop\n * launcher or file manager (notably the Linux AppImage), cwd is `/` or the\n * read-only squashfs mount point, so creating `<cwd>/.fusion/fusion.db` fails\n * with EACCES/EROFS and the local runtime never starts (\"Couldn't start local\n * Fusion\"). Anchor to a stable, writable per-user location instead \u2014 the home\n * directory, so data lives in `~/.fusion` (consistent with the CLI). Honor\n * `FUSION_HOME` for power users who want their data elsewhere.\n */\nexport function resolveLocalRuntimeRoot(): string {\n const override = process.env.FUSION_HOME?.trim();\n if (override) {\n return resolve(override);\n }\n return app.getPath(\"home\");\n}\n\nexport async function initializeApp(): Promise<void> {\n const state = await loadWindowState();\n const rememberedLaunchMode = await loadDesktopLaunchMode();\n\n localRuntimeManager = new LocalRuntimeManager({ rootDir: resolveLocalRuntimeRoot() });\n currentDesktopLaunchMode = rememberedLaunchMode;\n currentRemoteLaunch = null;\n localRuntimeStartupAttempted = false;\n\n if (rememberedLaunchMode === \"remote\") {\n const shellSettings = await readShellSettings();\n const normalizedRemoteLaunch = normalizeDesktopRemoteLaunch(shellSettings);\n if (normalizedRemoteLaunch) {\n currentRemoteLaunch = normalizedRemoteLaunch;\n } else {\n currentDesktopLaunchMode = \"choose\";\n await saveDesktopLaunchMode(\"choose\");\n }\n }\n\n if (rememberedLaunchMode === \"local\") {\n try {\n await startLocalRuntimeOnce();\n } catch (error) {\n await localRuntimeManager.stopLocal();\n currentDesktopLaunchMode = \"choose\";\n localRuntimeStartupAttempted = false;\n await saveDesktopLaunchMode(\"choose\");\n console.error(\"[desktop/main] Failed to restore local mode; falling back to chooser\", error);\n }\n }\n\n if (currentDesktopLaunchMode === \"choose\" && process.env.FUSION_DESKTOP_MODE === \"local\") {\n await startLocalRuntimeOnce();\n currentDesktopLaunchMode = \"local\";\n }\n\n const windowState = state\n ? clampWindowStateToVisibleDisplay(\n state,\n typeof screen?.getAllDisplays === \"function\"\n ? screen.getAllDisplays().map((display) => ({ workArea: display.workArea }))\n : [],\n )\n : undefined;\n\n const createdWindow = createMainWindow(\n windowState,\n currentDesktopLaunchMode === \"remote\" && currentRemoteLaunch\n ? buildRemoteShellHandoffUrl(currentRemoteLaunch)\n : undefined,\n );\n\n buildAppMenu({\n mainWindow: createdWindow,\n appName: \"Fusion\",\n onChangeLaunchMode: async () => {\n await resetLaunchModeAndReload(createdWindow);\n },\n /*\n * FNXC:DesktopRuntimeMode 2026-06-21-02:04:\n * Menu-driven local/remote switching must only persist local mode after the embedded runtime starts successfully; shutdown stops the local server without rewriting the launch-mode preference.\n */\n onStartLocalRuntime: async () => {\n if (!localRuntimeManager) return;\n localRuntimeStartupAttempted = false;\n await startLocalRuntimeOnce();\n currentRemoteLaunch = null;\n currentDesktopLaunchMode = \"local\";\n await saveDesktopLaunchMode(\"local\");\n createdWindow.webContents.reload();\n },\n onStopLocalRuntime: async () => {\n await localRuntimeManager?.stopLocal();\n },\n onConnectRemoteServer: async () => {\n await resetLaunchModeAndReload(createdWindow);\n },\n onCheckForUpdates: async () => {\n await triggerUpdateCheck(createdWindow);\n },\n });\n\n tray = new Tray(nativeImage.createEmpty());\n setupTray(createdWindow, tray);\n\n registerIpcHandlers(createdWindow, tray, {\n onDesktopModeChange: async (mode) => {\n if (!localRuntimeManager) {\n return;\n }\n currentDesktopLaunchMode = mode;\n if (mode === \"local\") {\n currentRemoteLaunch = null;\n localRuntimeStartupAttempted = false;\n await startLocalRuntimeOnce();\n } else {\n localRuntimeStartupAttempted = false;\n await localRuntimeManager.stopLocal();\n const shellSettings = await readShellSettings();\n currentRemoteLaunch = normalizeDesktopRemoteLaunch({ ...shellSettings, desktopMode: \"remote\" });\n }\n await saveDesktopLaunchMode(mode);\n },\n onDesktopLaunchModeChange: async (mode) => {\n if (!localRuntimeManager) {\n return;\n }\n currentDesktopLaunchMode = mode;\n localRuntimeStartupAttempted = false;\n if (mode === \"local\") {\n currentRemoteLaunch = null;\n await startLocalRuntimeOnce();\n } else {\n await localRuntimeManager.stopLocal();\n const shellSettings = await readShellSettings();\n currentRemoteLaunch = normalizeDesktopRemoteLaunch({ ...shellSettings, desktopMode: \"remote\" });\n }\n await saveDesktopLaunchMode(mode);\n },\n getRuntimeStatus: () => localRuntimeManager?.getStatus() ?? { source: \"none\", state: \"stopped\" },\n startLocalRuntime: () => localRuntimeManager?.startLocal() ?? Promise.resolve({ source: \"none\", state: \"stopped\" }),\n stopLocalRuntime: () => localRuntimeManager?.stopLocal() ?? Promise.resolve({ source: \"none\", state: \"stopped\" }),\n getServerPort: () => localRuntimeManager?.getServerPort(),\n getDesktopLaunchMode: () => currentDesktopLaunchMode,\n getDesktopLaunchContext: () => currentRemoteLaunch,\n });\n registerDeepLinkProtocol();\n setupDeepLinkHandler(createdWindow);\n setupAutoUpdater(createdWindow);\n stopUpdateCheckInterval = startUpdateCheckInterval(createdWindow);\n\n if (windowState?.isMaximized === true) {\n createdWindow.maximize();\n }\n}\n\nexport function run(): void {\n const appWithQuitFlag = getAppWithQuitFlag();\n appWithQuitFlag.isQuitting = false;\n\n void app.whenReady().then(() => initializeApp());\n\n app.on(\"window-all-closed\", () => {\n if (process.platform !== \"darwin\") {\n app.quit();\n }\n });\n\n app.on(\"before-quit\", () => {\n appWithQuitFlag.isQuitting = true;\n\n if (stopUpdateCheckInterval) {\n stopUpdateCheckInterval();\n stopUpdateCheckInterval = null;\n }\n\n if (tray) {\n tray.destroy();\n tray = null;\n }\n\n if (localRuntimeManager) {\n void localRuntimeManager.stopLocal();\n }\n });\n\n app.on(\"activate\", () => {\n if (mainWindow === null) {\n const window = createMainWindow();\n window.show();\n return;\n }\n // The close handler hides the window instead of destroying it, so a\n // subsequent dock/Finder activate must explicitly show + focus it \u2014\n // otherwise the app appears to do nothing when relaunched.\n if (!mainWindow.isVisible()) {\n mainWindow.show();\n }\n mainWindow.focus();\n });\n}\n\nconst modulePath = fileURLToPath(import.meta.url);\nconst isElectronMain =\n (process as NodeJS.Process & { type?: string }).type === \"browser\";\nconst isDirectInvocation =\n !!process.argv[1] && resolve(process.argv[1]) === modulePath;\nif (isElectronMain || isDirectInvocation) {\n run();\n}\n", "import { app, BrowserWindow } from \"electron\";\n\nexport interface DeepLinkResult {\n type: \"task\" | \"project\" | \"unknown\";\n id: string;\n raw: string;\n}\n\nconst DEEP_LINK_EVENT = \"deep-link\";\nconst FUSION_SCHEME = \"fusion:\";\n\nexport function registerDeepLinkProtocol(): void {\n try {\n const isRegistered = app.setAsDefaultProtocolClient(\"fusion\");\n if (!isRegistered) {\n console.warn(\"[desktop/deep-link] Failed to register fusion:// protocol\");\n return;\n }\n\n console.log(\"[desktop/deep-link] Registered fusion:// protocol handler\");\n } catch (error) {\n console.error(\"[desktop/deep-link] Error while registering fusion:// protocol\", error);\n }\n}\n\nexport function parseDeepLink(rawUrl: string): DeepLinkResult | null {\n if (!rawUrl) {\n return null;\n }\n\n try {\n const parsedUrl = new URL(rawUrl);\n\n if (parsedUrl.protocol !== FUSION_SCHEME) {\n return null;\n }\n\n const type = parsedUrl.hostname;\n if (type !== \"task\" && type !== \"project\") {\n return null;\n }\n\n const pathSegments = parsedUrl.pathname\n .split(\"/\")\n .filter((segment) => segment.length > 0);\n\n const decodedId = pathSegments.length > 0 ? decodeURIComponent(pathSegments[0]) : \"\";\n\n return {\n type,\n id: decodedId,\n raw: rawUrl,\n };\n } catch {\n return null;\n }\n}\n\nexport function handleDeepLink(mainWindow: BrowserWindow, url: string): void {\n const parsed = parseDeepLink(url);\n\n if (!parsed || parsed.type === \"unknown\") {\n console.warn(`[desktop/deep-link] Ignoring unsupported deep link: ${url}`);\n return;\n }\n\n if (!mainWindow.isVisible()) {\n mainWindow.show();\n }\n\n if (mainWindow.isMinimized()) {\n mainWindow.restore();\n }\n\n mainWindow.focus();\n mainWindow.webContents.send(DEEP_LINK_EVENT, parsed);\n}\n\nexport function setupDeepLinkHandler(mainWindow: BrowserWindow): void {\n const hasLock = app.requestSingleInstanceLock();\n if (!hasLock) {\n app.quit();\n return;\n }\n\n app.on(\"open-url\", (event, url) => {\n event.preventDefault();\n handleDeepLink(mainWindow, url);\n });\n\n app.on(\"second-instance\", (_event, argv) => {\n const deepLink = argv.find((arg) => arg.startsWith(\"fusion://\"));\n if (!deepLink) {\n return;\n }\n\n handleDeepLink(mainWindow, deepLink);\n });\n}\n", "import { app, type BrowserWindow, ipcMain, type Tray } from \"electron\";\nimport {\n showExportSettingsDialog,\n showImportSettingsDialog,\n triggerUpdateCheck,\n type NormalizedDesktopRemoteLaunch,\n} from \"./native.js\";\nimport { type EngineStatus, updateTrayStatus } from \"./tray.js\";\nimport {\n applyDeleteProfile,\n applySetActiveProfile,\n buildSavedProfile,\n getDesktopShellModeState,\n readShellSettings,\n writeShellSettings,\n type DesktopShellMode,\n type ShellConnectionProfile,\n} from \"./shell-settings.js\";\nimport type { DesktopRuntimeStatus } from \"./local-runtime.js\";\n\ninterface ShellConnectionProfileInput {\n id?: string;\n name: string;\n serverUrl: string;\n authToken?: string | null;\n}\n\ninterface ShellConnectionState {\n host: \"desktop-shell\";\n desktopModeState: {\n isFirstRun: boolean;\n desktopMode: DesktopShellMode | null;\n };\n desktopMode?: DesktopShellMode;\n activeProfileId: string | null;\n profiles: ShellConnectionProfile[];\n localRuntime?: DesktopRuntimeStatus;\n}\n\ntype DesktopLaunchMode = \"choose\" | \"local\" | \"remote\";\n\ninterface RegisterIpcOptions {\n onDesktopModeChange?: (mode: DesktopShellMode) => Promise<void>;\n onDesktopLaunchModeChange?: (mode: DesktopLaunchMode) => Promise<void>;\n getRuntimeStatus?: () => DesktopRuntimeStatus;\n startLocalRuntime?: () => Promise<DesktopRuntimeStatus>;\n stopLocalRuntime?: () => Promise<DesktopRuntimeStatus>;\n getServerPort?: () => number | undefined;\n getDesktopLaunchMode?: () => DesktopLaunchMode;\n getDesktopLaunchContext?: () => NormalizedDesktopRemoteLaunch | null;\n}\n\nfunction isDesktopLaunchMode(value: unknown): value is DesktopLaunchMode {\n return value === \"choose\" || value === \"local\" || value === \"remote\";\n}\n\nfunction toShellState(\n settings: Awaited<ReturnType<typeof readShellSettings>>,\n runtimeStatus?: DesktopRuntimeStatus,\n): ShellConnectionState {\n return {\n host: \"desktop-shell\",\n desktopModeState: getDesktopShellModeState(settings),\n desktopMode: settings.desktopMode ?? undefined,\n activeProfileId: settings.activeProfileId,\n profiles: settings.profiles,\n localRuntime: runtimeStatus ?? { source: \"none\", state: \"stopped\" },\n };\n}\n\nasync function emitShellState(\n mainWindow: BrowserWindow,\n getRuntimeStatus?: () => DesktopRuntimeStatus,\n): Promise<ShellConnectionState> {\n const state = toShellState(await readShellSettings(), getRuntimeStatus?.());\n mainWindow.webContents.send(\"shell:state\", state);\n return state;\n}\n\nexport function registerIpcHandlers(mainWindow: BrowserWindow, tray: Tray, options: RegisterIpcOptions = {}): void {\n ipcMain.handle(\"window:minimize\", () => mainWindow.minimize());\n ipcMain.handle(\"window:maximize\", () => {\n const isCurrentlyMaximized = mainWindow.isMaximized();\n if (isCurrentlyMaximized) {\n mainWindow.unmaximize();\n return false;\n }\n mainWindow.maximize();\n return true;\n });\n ipcMain.handle(\"window:close\", () => mainWindow.close());\n ipcMain.handle(\"window:isMaximized\", () => mainWindow.isMaximized());\n ipcMain.handle(\"platform:get\", () => process.platform);\n\n ipcMain.handle(\"app:getSystemInfo\", () => ({\n platform: process.platform,\n arch: process.arch,\n electronVersion: process.versions.electron,\n nodeVersion: process.versions.node,\n appVersion: app.getVersion(),\n }));\n\n ipcMain.handle(\"app:checkForUpdates\", async () => {\n try {\n return await triggerUpdateCheck(mainWindow);\n } catch (error) {\n return { status: \"error\" as const, error: error instanceof Error ? error.message : String(error) };\n }\n });\n\n ipcMain.handle(\"tray:updateStatus\", (_event, status: EngineStatus) => updateTrayStatus(tray, status));\n ipcMain.handle(\"native:showExportDialog\", () => showExportSettingsDialog(mainWindow));\n ipcMain.handle(\"native:showImportDialog\", () => showImportSettingsDialog(mainWindow));\n ipcMain.handle(\"app:getServerPort\", () => options.getServerPort?.());\n\n ipcMain.handle(\"desktopRuntime:getStatus\", async () => options.getRuntimeStatus?.() ?? { source: \"none\", state: \"stopped\" });\n ipcMain.handle(\"desktopRuntime:startLocal\", async () => options.startLocalRuntime?.() ?? { source: \"none\", state: \"stopped\" });\n ipcMain.handle(\"desktopRuntime:stopLocal\", async () => options.stopLocalRuntime?.() ?? { source: \"none\", state: \"stopped\" });\n ipcMain.handle(\"desktopLaunchMode:getMode\", async () => options.getDesktopLaunchMode?.() ?? \"choose\");\n ipcMain.handle(\"desktopLaunchMode:getContext\", async () => options.getDesktopLaunchContext?.() ?? null);\n ipcMain.handle(\"desktopLaunchMode:setMode\", async (_event, mode: unknown) => {\n if (!isDesktopLaunchMode(mode)) {\n throw new Error(\"Invalid desktop launch mode\");\n }\n\n if (options.onDesktopLaunchModeChange) {\n await options.onDesktopLaunchModeChange(mode);\n return options.getDesktopLaunchMode?.() ?? mode;\n }\n\n if ((mode === \"local\" || mode === \"remote\") && options.onDesktopModeChange) {\n await options.onDesktopModeChange(mode);\n return options.getDesktopLaunchMode?.() ?? mode;\n }\n\n return options.getDesktopLaunchMode?.() ?? mode;\n });\n\n ipcMain.handle(\"shell:getState\", () => readShellSettings().then((settings) => toShellState(settings, options.getRuntimeStatus?.())));\n ipcMain.handle(\"shell:listProfiles\", async () => (await readShellSettings()).profiles);\n\n ipcMain.handle(\"shell:saveProfile\", async (_event, profile: ShellConnectionProfileInput) => {\n const settings = await readShellSettings();\n const nextProfile = buildSavedProfile(settings, profile);\n const existing = settings.profiles.find((item) => item.id === nextProfile.id);\n\n settings.profiles = existing\n ? settings.profiles.map((item) => (item.id === existing.id ? nextProfile : item))\n : [...settings.profiles, nextProfile];\n await writeShellSettings(settings);\n await emitShellState(mainWindow, options.getRuntimeStatus);\n return nextProfile;\n });\n\n ipcMain.handle(\"shell:deleteProfile\", async (_event, profileId: string) => {\n const settings = applyDeleteProfile(await readShellSettings(), profileId);\n await writeShellSettings(settings);\n await emitShellState(mainWindow, options.getRuntimeStatus);\n });\n\n ipcMain.handle(\"shell:setActiveProfile\", async (_event, profileId: string | null) => {\n const settings = applySetActiveProfile(await readShellSettings(), profileId);\n await writeShellSettings(settings);\n return emitShellState(mainWindow, options.getRuntimeStatus);\n });\n\n ipcMain.handle(\"shell:getDesktopModeState\", async () => {\n const settings = await readShellSettings();\n return getDesktopShellModeState(settings);\n });\n\n ipcMain.handle(\"shell:setDesktopMode\", async (_event, mode: DesktopShellMode) => {\n const settings = await readShellSettings();\n settings.desktopMode = mode;\n settings.hasCompletedModeSelection = true;\n await writeShellSettings(settings);\n await options.onDesktopModeChange?.(mode);\n return emitShellState(mainWindow, options.getRuntimeStatus);\n });\n\n ipcMain.handle(\"shell:resetDesktopMode\", async () => {\n const settings = await readShellSettings();\n settings.desktopMode = null;\n settings.hasCompletedModeSelection = false;\n await writeShellSettings(settings);\n // Stop the embedded runtime so a subsequent local choice spins up fresh.\n await options.stopLocalRuntime?.().catch(() => undefined);\n return emitShellState(mainWindow, options.getRuntimeStatus);\n });\n\n ipcMain.handle(\"shell:startQrScan\", async () => {\n throw new Error(\"QR scanning is not available in desktop shell\");\n });\n\n ipcMain.handle(\"shell:openConnectionManager\", () => {\n mainWindow.webContents.send(\"shell:open-connection-manager\");\n });\n}\n", "import { readFile, rename, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport {\n app,\n BrowserWindow,\n dialog,\n Notification,\n type OpenDialogOptions,\n type SaveDialogOptions,\n} from \"electron\";\n\nexport interface WindowState {\n x?: number;\n y?: number;\n width: number;\n height: number;\n isMaximized: boolean;\n}\n\nexport interface DisplayWorkAreaLike {\n workArea: {\n x: number;\n y: number;\n width: number;\n height: number;\n };\n}\n\nconst MIN_VISIBLE_OVERLAP_PX = 64;\n\nexport function clampWindowStateToVisibleDisplay(\n state: WindowState,\n displays: DisplayWorkAreaLike[],\n): WindowState {\n if (state.x === undefined || state.y === undefined) {\n return state;\n }\n\n const windowLeft = state.x;\n const windowTop = state.y;\n const windowRight = state.x + state.width;\n const windowBottom = state.y + state.height;\n\n const hasSufficientOverlap = displays.some(({ workArea }) => {\n const displayLeft = workArea.x;\n const displayTop = workArea.y;\n const displayRight = workArea.x + workArea.width;\n const displayBottom = workArea.y + workArea.height;\n\n const overlapWidth = Math.max(0, Math.min(windowRight, displayRight) - Math.max(windowLeft, displayLeft));\n const overlapHeight = Math.max(0, Math.min(windowBottom, displayBottom) - Math.max(windowTop, displayTop));\n\n return overlapWidth >= MIN_VISIBLE_OVERLAP_PX && overlapHeight >= MIN_VISIBLE_OVERLAP_PX;\n });\n\n if (hasSufficientOverlap) {\n return state;\n }\n\n return {\n width: state.width,\n height: state.height,\n isMaximized: state.isMaximized,\n };\n}\n\nexport type DesktopLaunchMode = \"choose\" | \"local\" | \"remote\";\n\nexport interface DesktopRemoteProfileLike {\n id: string;\n name: string;\n serverUrl: string;\n authToken?: string | null;\n}\n\nexport interface DesktopShellSettingsLike {\n desktopMode: \"local\" | \"remote\" | null;\n activeProfileId: string | null;\n profiles: DesktopRemoteProfileLike[];\n}\n\nexport interface NormalizedDesktopRemoteLaunch {\n mode: \"remote\";\n profileId: string;\n serverBaseUrl: string;\n serverLabel?: string;\n authToken?: string;\n}\n\nexport const SHELL_HANDOFF_QUERY = {\n shellKind: \"shellKind\",\n shellMode: \"shellMode\",\n profileId: \"profileId\",\n serverBaseUrl: \"serverBaseUrl\",\n serverLabel: \"serverLabel\",\n token: \"token\",\n canOpenConnectionManager: \"shellCanOpenConnectionManager\",\n} as const;\n\nexport const DEFAULT_WINDOW_STATE: WindowState = {\n width: 1280,\n height: 900,\n isMaximized: false,\n};\n\ninterface DesktopNotificationOptions {\n silent?: boolean;\n onClick?: () => void;\n}\n\nfunction generateSettingsExportFilename(date: Date = new Date()): string {\n const year = date.getUTCFullYear();\n const month = String(date.getUTCMonth() + 1).padStart(2, \"0\");\n const day = String(date.getUTCDate()).padStart(2, \"0\");\n const hours = String(date.getUTCHours()).padStart(2, \"0\");\n const minutes = String(date.getUTCMinutes()).padStart(2, \"0\");\n const seconds = String(date.getUTCSeconds()).padStart(2, \"0\");\n\n return `fusion-settings-${year}-${month}-${day}-${hours}${minutes}${seconds}.json`;\n}\n\nfunction getWindowStatePath(): string {\n return join(app.getPath(\"userData\"), \"window-state.json\");\n}\n\nfunction getDesktopLaunchModePath(): string {\n return join(app.getPath(\"userData\"), \"desktop-launch-mode.json\");\n}\n\nfunction isValidWindowState(value: unknown): value is WindowState {\n if (value === null || typeof value !== \"object\") {\n return false;\n }\n\n const candidate = value as Partial<WindowState>;\n const hasValidPosition =\n (candidate.x === undefined || typeof candidate.x === \"number\") &&\n (candidate.y === undefined || typeof candidate.y === \"number\");\n\n return (\n hasValidPosition &&\n typeof candidate.width === \"number\" &&\n Number.isFinite(candidate.width) &&\n typeof candidate.height === \"number\" &&\n Number.isFinite(candidate.height) &&\n typeof candidate.isMaximized === \"boolean\"\n );\n}\n\nexport async function showExportSettingsDialog(parentWindow?: BrowserWindow): Promise<string | null> {\n const filename = generateSettingsExportFilename();\n const defaultPath = join(app.getPath(\"documents\"), filename);\n const dialogOptions: SaveDialogOptions = {\n title: \"Export Fusion Settings\",\n defaultPath,\n filters: [{ name: \"JSON Files\", extensions: [\"json\"] }],\n };\n\n const result = parentWindow\n ? await dialog.showSaveDialog(parentWindow, dialogOptions)\n : await dialog.showSaveDialog(dialogOptions);\n\n if (result.canceled || !result.filePath) {\n return null;\n }\n\n return result.filePath;\n}\n\nexport async function showImportSettingsDialog(parentWindow?: BrowserWindow): Promise<string | null> {\n const dialogOptions: OpenDialogOptions = {\n title: \"Import Fusion Settings\",\n properties: [\"openFile\"],\n filters: [{ name: \"JSON Files\", extensions: [\"json\"] }],\n };\n\n const result = parentWindow\n ? await dialog.showOpenDialog(parentWindow, dialogOptions)\n : await dialog.showOpenDialog(dialogOptions);\n\n if (result.canceled || result.filePaths.length === 0) {\n return null;\n }\n\n return result.filePaths[0] ?? null;\n}\n\nexport function showDesktopNotification(\n title: string,\n body: string,\n options: DesktopNotificationOptions = {},\n): void {\n if (!Notification.isSupported()) {\n console.warn(\"[desktop/native] Notifications are not supported in this environment\");\n return;\n }\n\n try {\n const notification = new Notification({\n title,\n body,\n silent: options.silent,\n });\n\n if (options.onClick) {\n notification.on(\"click\", options.onClick);\n }\n\n notification.show();\n } catch (error) {\n console.error(\"[desktop/native] Failed to display desktop notification\", error);\n }\n}\n\ntype AutoUpdaterLike = {\n autoDownload: boolean;\n autoInstallOnAppQuit: boolean;\n on: (event: string, handler: (...args: unknown[]) => void) => unknown;\n checkForUpdates: () => Promise<unknown>;\n};\n\nlet cachedAutoUpdater: AutoUpdaterLike | null = null;\nlet autoUpdaterLoadPromise: Promise<AutoUpdaterLike | null> | null = null;\nlet listenersBound = false;\nlet hasRunInitialUpdateCheck = false;\nlet autoUpdaterWindow: BrowserWindow | undefined;\nlet updateIntervalTimer: ReturnType<typeof setInterval> | null = null;\nlet updateIntervalDisposer: (() => void) | null = null;\nlet updateIntervalWindow: BrowserWindow | null = null;\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return \"Unknown error\";\n}\n\nasync function resolveAutoUpdater(): Promise<AutoUpdaterLike | null> {\n if (cachedAutoUpdater) {\n return cachedAutoUpdater;\n }\n\n if (!autoUpdaterLoadPromise) {\n autoUpdaterLoadPromise = (async () => {\n try {\n const mod = (await import(\"electron-updater\")) as {\n default?: { autoUpdater?: unknown };\n autoUpdater?: unknown;\n };\n const namedAutoUpdater = \"autoUpdater\" in mod ? (mod as { autoUpdater?: unknown }).autoUpdater : undefined;\n const autoUpdater = (mod.default?.autoUpdater ?? namedAutoUpdater) as AutoUpdaterLike | undefined;\n\n if (!autoUpdater) {\n console.warn(\"[desktop/native] Auto-updater module loaded without autoUpdater export\");\n return null;\n }\n\n cachedAutoUpdater = autoUpdater;\n return autoUpdater;\n } catch (error) {\n console.warn(\"[desktop/native] Auto-updater unavailable\", error);\n return null;\n }\n })();\n }\n\n return autoUpdaterLoadPromise;\n}\n\nfunction bindAutoUpdaterListeners(autoUpdater: AutoUpdaterLike): void {\n if (listenersBound) {\n return;\n }\n\n listenersBound = true;\n autoUpdater.autoDownload = true;\n autoUpdater.autoInstallOnAppQuit = true;\n\n autoUpdater.on(\"update-available\", (info) => {\n showDesktopNotification(\"Fusion Update Available\", \"Update available \u2014 downloading in background\", {\n silent: true,\n });\n autoUpdaterWindow?.webContents.send(\"update-available\", info);\n });\n\n autoUpdater.on(\"update-downloaded\", (info) => {\n showDesktopNotification(\"Fusion Update Ready\", \"Update ready \u2014 will install on quit\", {\n silent: true,\n });\n autoUpdaterWindow?.webContents.send(\"update-downloaded\", info);\n });\n\n autoUpdater.on(\"update-not-available\", (info) => {\n showDesktopNotification(\"Fusion is up to date\", \"You're on the latest version\", {\n silent: true,\n });\n autoUpdaterWindow?.webContents.send(\"update-not-available\", info);\n });\n\n autoUpdater.on(\"error\", (error) => {\n const message = getErrorMessage(error);\n console.error(\"[desktop/native] Auto-updater error\", error);\n autoUpdaterWindow?.webContents.send(\"update-error\", { message });\n });\n}\n\nexport function setupAutoUpdater(mainWindow?: BrowserWindow): void {\n if (mainWindow) {\n autoUpdaterWindow = mainWindow;\n }\n\n void (async () => {\n try {\n const autoUpdater = await resolveAutoUpdater();\n if (!autoUpdater) {\n return;\n }\n\n bindAutoUpdaterListeners(autoUpdater);\n\n if (hasRunInitialUpdateCheck) {\n return;\n }\n\n hasRunInitialUpdateCheck = true;\n await autoUpdater.checkForUpdates().catch((error: unknown) => {\n console.error(\"[desktop/native] Auto-updater check failed\", error);\n });\n } catch (error) {\n console.warn(\"[desktop/native] Auto-updater setup failed\", error);\n }\n })();\n}\n\nexport async function triggerUpdateCheck(\n mainWindow?: BrowserWindow,\n): Promise<{ status: \"checking\" } | { status: \"unavailable\"; reason: string } | { status: \"error\"; error: string }> {\n setupAutoUpdater(mainWindow);\n\n const autoUpdater = await resolveAutoUpdater();\n if (!autoUpdater) {\n return { status: \"unavailable\", reason: \"updater_unavailable\" };\n }\n\n try {\n await autoUpdater.checkForUpdates();\n return { status: \"checking\" };\n } catch (error) {\n return { status: \"error\", error: getErrorMessage(error) };\n }\n}\n\nexport function startUpdateCheckInterval(mainWindow: BrowserWindow, intervalMs = 4 * 60 * 60 * 1000): () => void {\n autoUpdaterWindow = mainWindow;\n\n if (updateIntervalDisposer && updateIntervalWindow === mainWindow) {\n return updateIntervalDisposer;\n }\n\n if (updateIntervalTimer) {\n clearInterval(updateIntervalTimer);\n updateIntervalTimer = null;\n }\n\n updateIntervalWindow = mainWindow;\n updateIntervalTimer = setInterval(() => {\n void triggerUpdateCheck(mainWindow);\n }, intervalMs);\n\n updateIntervalDisposer = () => {\n if (updateIntervalTimer) {\n clearInterval(updateIntervalTimer);\n updateIntervalTimer = null;\n }\n updateIntervalDisposer = null;\n updateIntervalWindow = null;\n };\n\n return updateIntervalDisposer;\n}\n\nfunction normalizeServerBaseUrl(serverUrl: string): string | null {\n try {\n const parsed = new URL(serverUrl);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n return null;\n }\n return parsed.toString().replace(/\\/$/, \"\");\n } catch {\n return null;\n }\n}\n\nexport function normalizeDesktopRemoteLaunch(settings: DesktopShellSettingsLike): NormalizedDesktopRemoteLaunch | null {\n if (settings.desktopMode !== \"remote\" || !settings.activeProfileId) {\n return null;\n }\n\n const activeProfile = settings.profiles.find((profile) => profile.id === settings.activeProfileId);\n if (!activeProfile) {\n return null;\n }\n\n const serverBaseUrl = normalizeServerBaseUrl(activeProfile.serverUrl);\n if (!serverBaseUrl) {\n return null;\n }\n\n return {\n mode: \"remote\",\n profileId: activeProfile.id,\n serverBaseUrl,\n ...(activeProfile.name ? { serverLabel: activeProfile.name } : {}),\n ...(activeProfile.authToken ? { authToken: activeProfile.authToken } : {}),\n };\n}\n\nexport function buildRemoteShellHandoffUrl(launch: NormalizedDesktopRemoteLaunch): string {\n const url = new URL(launch.serverBaseUrl);\n url.searchParams.set(SHELL_HANDOFF_QUERY.shellKind, \"desktop\");\n url.searchParams.set(SHELL_HANDOFF_QUERY.shellMode, \"remote\");\n url.searchParams.set(SHELL_HANDOFF_QUERY.profileId, launch.profileId);\n url.searchParams.set(SHELL_HANDOFF_QUERY.serverBaseUrl, launch.serverBaseUrl);\n if (launch.serverLabel) {\n url.searchParams.set(SHELL_HANDOFF_QUERY.serverLabel, launch.serverLabel);\n }\n if (launch.authToken) {\n url.searchParams.set(SHELL_HANDOFF_QUERY.token, launch.authToken);\n }\n url.searchParams.set(SHELL_HANDOFF_QUERY.canOpenConnectionManager, \"1\");\n return url.toString();\n}\n\nfunction isValidDesktopLaunchMode(value: unknown): value is DesktopLaunchMode {\n return value === \"choose\" || value === \"local\" || value === \"remote\";\n}\n\nexport async function loadDesktopLaunchMode(): Promise<DesktopLaunchMode> {\n const launchModePath = getDesktopLaunchModePath();\n\n try {\n const raw = await readFile(launchModePath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (parsed && typeof parsed === \"object\" && \"mode\" in parsed) {\n const mode = (parsed as { mode?: unknown }).mode;\n if (isValidDesktopLaunchMode(mode)) {\n return mode;\n }\n }\n\n return \"choose\";\n } catch {\n return \"choose\";\n }\n}\n\nexport async function saveDesktopLaunchMode(mode: DesktopLaunchMode): Promise<void> {\n const launchModePath = getDesktopLaunchModePath();\n const tempPath = `${launchModePath}.tmp`;\n\n await writeFile(tempPath, JSON.stringify({ mode }, null, 2), \"utf-8\");\n await rename(tempPath, launchModePath);\n}\n\nexport async function loadWindowState(): Promise<WindowState | null> {\n const statePath = getWindowStatePath();\n\n try {\n const raw = await readFile(statePath, \"utf-8\");\n const parsed: unknown = JSON.parse(raw);\n\n if (!isValidWindowState(parsed)) {\n return null;\n }\n\n return parsed;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return null;\n }\n\n return null;\n }\n}\n\nexport function saveWindowState(mainWindow: BrowserWindow): void {\n if (mainWindow.isDestroyed()) {\n return;\n }\n\n const bounds = mainWindow.getBounds();\n const state: WindowState = {\n x: bounds.x,\n y: bounds.y,\n width: bounds.width,\n height: bounds.height,\n isMaximized: mainWindow.isMaximized(),\n };\n\n const statePath = getWindowStatePath();\n const tempPath = `${statePath}.tmp`;\n\n void writeFile(tempPath, JSON.stringify(state, null, 2), \"utf-8\")\n .then(() => rename(tempPath, statePath))\n .catch((error) => {\n console.error(\"[desktop/native] Failed to save window state\", error);\n });\n}\n", "import path from \"node:path\";\nimport {\n app,\n BrowserWindow,\n Menu,\n nativeImage,\n Tray,\n type MenuItemConstructorOptions,\n type NativeImage,\n} from \"electron\";\n\nexport type EngineStatus = \"running\" | \"paused\" | \"stopped\";\n\nexport interface TrayMenuOptions {\n isWindowVisible: boolean;\n engineStatus: EngineStatus;\n}\n\ninterface TrayState {\n mainWindow: BrowserWindow;\n engineStatus: EngineStatus;\n isQuitting: boolean;\n}\n\nconst trayState = new WeakMap<Tray, TrayState>();\n\nfunction toggleMainWindow(mainWindow: BrowserWindow): void {\n if (mainWindow.isVisible()) {\n mainWindow.hide();\n return;\n }\n\n mainWindow.show();\n mainWindow.focus();\n}\n\nfunction resolveEngineMenuLabel(engineStatus: EngineStatus): string {\n return engineStatus === \"running\" ? \"Pause Engine\" : \"Resume Engine\";\n}\n\nfunction applyTrayMenu(tray: Tray, state: TrayState): void {\n const baseTemplate = buildTrayContextMenu({\n isWindowVisible: state.mainWindow.isVisible(),\n engineStatus: state.engineStatus,\n });\n\n const contextTemplate = baseTemplate.map((item) => {\n if (item.type === \"separator\") {\n return item;\n }\n\n if (item.label === \"Show Window\" || item.label === \"Hide Window\") {\n return {\n ...item,\n click: () => toggleMainWindow(state.mainWindow),\n };\n }\n\n if (item.label === \"Pause Engine\" || item.label === \"Resume Engine\") {\n return {\n ...item,\n click: () => {\n if (state.engineStatus === \"stopped\") {\n return;\n }\n\n state.engineStatus = state.engineStatus === \"running\" ? \"paused\" : \"running\";\n applyTrayMenu(tray, state);\n },\n };\n }\n\n return {\n ...item,\n click: () => {\n state.isQuitting = true;\n app.quit();\n },\n };\n });\n\n tray.setToolTip(getTrayTooltip(state.engineStatus));\n tray.setContextMenu(Menu.buildFromTemplate(contextTemplate));\n}\n\nexport function createTrayIcon(): NativeImage {\n if (process.platform === \"darwin\") {\n const iconPath = path.join(import.meta.dirname, \"icons\", \"tray-32.png\");\n const retinaIcon = nativeImage.createFromPath(iconPath);\n return retinaIcon.resize({ width: 16, height: 16 });\n }\n\n const iconPath = path.join(import.meta.dirname, \"icons\", \"tray-48.png\");\n return nativeImage.createFromPath(iconPath);\n}\n\nexport function buildTrayContextMenu(options: TrayMenuOptions): MenuItemConstructorOptions[] {\n return [\n {\n label: options.isWindowVisible ? \"Hide Window\" : \"Show Window\",\n },\n {\n type: \"separator\",\n },\n {\n label: resolveEngineMenuLabel(options.engineStatus),\n enabled: options.engineStatus !== \"stopped\",\n },\n {\n type: \"separator\",\n },\n {\n label: \"Quit Fusion\",\n },\n ];\n}\n\nexport function getTrayTooltip(status: EngineStatus): string {\n switch (status) {\n case \"paused\":\n return \"Fusion \u2014 Paused\";\n case \"stopped\":\n return \"Fusion \u2014 Stopped\";\n case \"running\":\n default:\n return \"Fusion \u2014 Running\";\n }\n}\n\nexport function setupTray(mainWindow: BrowserWindow, tray: Tray): Tray {\n const state: TrayState = {\n mainWindow,\n engineStatus: \"running\",\n isQuitting: false,\n };\n\n trayState.set(tray, state);\n\n tray.setImage(createTrayIcon());\n applyTrayMenu(tray, state);\n\n tray.on(\"click\", () => {\n toggleMainWindow(mainWindow);\n });\n\n mainWindow.on(\"show\", () => {\n applyTrayMenu(tray, state);\n });\n\n mainWindow.on(\"hide\", () => {\n applyTrayMenu(tray, state);\n });\n\n mainWindow.on(\"close\", (event) => {\n if (state.isQuitting) {\n return;\n }\n\n event.preventDefault();\n mainWindow.hide();\n });\n\n app.on(\"before-quit\", () => {\n state.isQuitting = true;\n });\n\n return tray;\n}\n\nexport function updateTrayStatus(tray: Tray, status: EngineStatus): void {\n const state = trayState.get(tray);\n\n if (!state) {\n tray.setToolTip(getTrayTooltip(status));\n const menu = Menu.buildFromTemplate(\n buildTrayContextMenu({\n isWindowVisible: false,\n engineStatus: status,\n }),\n );\n tray.setContextMenu(menu);\n return;\n }\n\n state.engineStatus = status;\n applyTrayMenu(tray, state);\n}\n", "import { readFile, rename, writeFile } from \"node:fs/promises\";\nimport { createHash } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport { app } from \"electron\";\n\nexport interface ShellConnectionProfile {\n id: string;\n name: string;\n serverUrl: string;\n authToken?: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n}\n\nexport type DesktopShellMode = \"local\" | \"remote\";\n\nexport interface DesktopShellModeState {\n isFirstRun: boolean;\n desktopMode: DesktopShellMode | null;\n}\n\nexport interface DesktopShellSettings {\n desktopMode: DesktopShellMode | null;\n hasCompletedModeSelection: boolean;\n activeProfileId: string | null;\n profiles: ShellConnectionProfile[];\n}\n\nconst DEFAULT_SETTINGS: DesktopShellSettings = {\n desktopMode: null,\n hasCompletedModeSelection: false,\n activeProfileId: null,\n profiles: [],\n};\n\nfunction getSettingsPath(): string {\n return join(app.getPath(\"userData\"), \"shell-connections.json\");\n}\n\nfunction nowIso(): string {\n return new Date().toISOString();\n}\n\nfunction normalizeDesktopMode(value: unknown): DesktopShellMode | null {\n return value === \"local\" || value === \"remote\" ? value : null;\n}\n\nfunction normalizeServerUrl(serverUrl: string): string {\n const normalized = serverUrl.trim().replace(/\\/$/, \"\");\n let parsed: URL;\n try {\n parsed = new URL(normalized);\n } catch {\n throw new Error(\"Server URL must be a valid absolute URL\");\n }\n if (!/^https?:$/.test(parsed.protocol)) {\n throw new Error(\"Server URL must use http or https\");\n }\n return normalized;\n}\n\nfunction normalizeProfileName(name: string): string {\n const normalized = name.trim().replace(/\\s+/g, \" \");\n return normalized.length > 0 ? normalized : \"Remote Server\";\n}\n\nfunction profileBaseId(name: string, serverUrl: string): string {\n const hash = createHash(\"sha1\").update(`${name}|${serverUrl}`).digest(\"hex\").slice(0, 10);\n return `profile_${hash}`;\n}\n\nfunction ensureUniqueProfileName(name: string, profiles: ShellConnectionProfile[], skipId?: string): string {\n const used = new Set(\n profiles.filter((profile) => profile.id !== skipId).map((profile) => profile.name.toLocaleLowerCase()),\n );\n if (!used.has(name.toLocaleLowerCase())) {\n return name;\n }\n let suffix = 2;\n let candidate = `${name} (${suffix})`;\n while (used.has(candidate.toLocaleLowerCase())) {\n suffix += 1;\n candidate = `${name} (${suffix})`;\n }\n return candidate;\n}\n\nfunction createDeterministicProfileId(name: string, serverUrl: string, profiles: ShellConnectionProfile[], skipId?: string): string {\n const used = new Set(profiles.filter((profile) => profile.id !== skipId).map((profile) => profile.id));\n const base = profileBaseId(name, serverUrl);\n if (!used.has(base)) {\n return base;\n }\n let suffix = 2;\n let candidate = `${base}_${suffix}`;\n while (used.has(candidate)) {\n suffix += 1;\n candidate = `${base}_${suffix}`;\n }\n return candidate;\n}\n\nfunction normalizeProfileRecord(input: unknown, fallbackIndex: number): ShellConnectionProfile | null {\n if (!input || typeof input !== \"object\") {\n return null;\n }\n const candidate = input as Partial<ShellConnectionProfile>;\n if (typeof candidate.serverUrl !== \"string\") {\n return null;\n }\n\n let serverUrl: string;\n try {\n serverUrl = normalizeServerUrl(candidate.serverUrl);\n } catch {\n return null;\n }\n\n const name = normalizeProfileName(typeof candidate.name === \"string\" ? candidate.name : \"\");\n const createdAt = typeof candidate.createdAt === \"string\" && candidate.createdAt.length > 0 ? candidate.createdAt : nowIso();\n const updatedAt = typeof candidate.updatedAt === \"string\" && candidate.updatedAt.length > 0 ? candidate.updatedAt : createdAt;\n return {\n id: typeof candidate.id === \"string\" && candidate.id.length > 0 ? candidate.id : `profile_imported_${fallbackIndex}`,\n name,\n serverUrl,\n authToken: typeof candidate.authToken === \"string\" ? candidate.authToken : null,\n createdAt,\n updatedAt,\n lastUsedAt: typeof candidate.lastUsedAt === \"string\" ? candidate.lastUsedAt : null,\n };\n}\n\nfunction normalize(input: unknown): DesktopShellSettings {\n if (!input || typeof input !== \"object\") {\n return { ...DEFAULT_SETTINGS };\n }\n\n const candidate = input as Partial<DesktopShellSettings>;\n const desktopMode = normalizeDesktopMode(candidate.desktopMode);\n const inferredCompleted = desktopMode !== null;\n\n const profiles: ShellConnectionProfile[] = [];\n const profileSource = Array.isArray(candidate.profiles) ? candidate.profiles : [];\n for (const [index, profileValue] of profileSource.entries()) {\n const normalizedProfile = normalizeProfileRecord(profileValue, index);\n if (!normalizedProfile) {\n continue;\n }\n const uniqueName = ensureUniqueProfileName(normalizedProfile.name, profiles);\n const idAlreadyUsed = profiles.some((profile) => profile.id === normalizedProfile.id);\n const id = idAlreadyUsed\n ? createDeterministicProfileId(uniqueName, normalizedProfile.serverUrl, profiles)\n : normalizedProfile.id;\n profiles.push({ ...normalizedProfile, name: uniqueName, id });\n }\n\n const persistedActiveId = typeof candidate.activeProfileId === \"string\" ? candidate.activeProfileId : null;\n const activeProfileId = persistedActiveId && profiles.some((profile) => profile.id === persistedActiveId)\n ? persistedActiveId\n : null;\n\n return {\n desktopMode,\n hasCompletedModeSelection: typeof candidate.hasCompletedModeSelection === \"boolean\" ? candidate.hasCompletedModeSelection : inferredCompleted,\n activeProfileId,\n profiles,\n };\n}\n\nexport function buildSavedProfile(\n settings: DesktopShellSettings,\n input: { id?: string; name: string; serverUrl: string; authToken?: string | null },\n): ShellConnectionProfile {\n const existing = input.id ? settings.profiles.find((item) => item.id === input.id) : undefined;\n const normalizedServerUrl = normalizeServerUrl(input.serverUrl);\n const normalizedName = normalizeProfileName(input.name);\n const name = ensureUniqueProfileName(normalizedName, settings.profiles, existing?.id);\n const timestamp = nowIso();\n\n return {\n id: existing?.id ?? createDeterministicProfileId(name, normalizedServerUrl, settings.profiles, existing?.id),\n name,\n serverUrl: normalizedServerUrl,\n authToken: input.authToken ?? null,\n createdAt: existing?.createdAt ?? timestamp,\n updatedAt: timestamp,\n lastUsedAt: existing?.lastUsedAt ?? null,\n };\n}\n\nexport function applyDeleteProfile(settings: DesktopShellSettings, profileId: string): DesktopShellSettings {\n const profiles = settings.profiles.filter((item) => item.id !== profileId);\n const activeProfileId =\n settings.activeProfileId !== profileId\n ? settings.activeProfileId\n : profiles.length > 0\n ? profiles[0]?.id ?? null\n : null;\n return { ...settings, profiles, activeProfileId };\n}\n\nexport function applySetActiveProfile(settings: DesktopShellSettings, profileId: string | null): DesktopShellSettings {\n const activeProfileId = profileId && settings.profiles.some((item) => item.id === profileId) ? profileId : null;\n const timestamp = nowIso();\n const profiles = settings.profiles.map((item) =>\n item.id === activeProfileId\n ? { ...item, lastUsedAt: timestamp, updatedAt: timestamp }\n : item,\n );\n\n return {\n ...settings,\n activeProfileId,\n profiles,\n };\n}\n\nexport async function readShellSettings(): Promise<DesktopShellSettings> {\n try {\n const raw = await readFile(getSettingsPath(), \"utf-8\");\n return normalize(JSON.parse(raw));\n } catch {\n return { ...DEFAULT_SETTINGS };\n }\n}\n\nexport function getDesktopShellModeState(settings: DesktopShellSettings): DesktopShellModeState {\n if (!settings.hasCompletedModeSelection || settings.desktopMode === null) {\n return {\n isFirstRun: true,\n desktopMode: null,\n };\n }\n\n return {\n isFirstRun: false,\n desktopMode: settings.desktopMode,\n };\n}\n\nexport async function writeShellSettings(settings: DesktopShellSettings): Promise<void> {\n const path = getSettingsPath();\n const temp = `${path}.tmp`;\n await writeFile(temp, JSON.stringify(settings, null, 2), \"utf-8\");\n await rename(temp, path);\n}\n", "import {\n Menu,\n shell,\n type BrowserWindow,\n type MenuItemConstructorOptions,\n} from \"electron\";\n\nexport interface AppMenuOptions {\n mainWindow: BrowserWindow;\n appName: string;\n onChangeLaunchMode?: () => Promise<void> | void;\n onStartLocalRuntime?: () => Promise<void> | void;\n onStopLocalRuntime?: () => Promise<void> | void;\n onConnectRemoteServer?: () => Promise<void> | void;\n onCheckForUpdates?: () => Promise<void> | void;\n}\n\nfunction runMenuAction(label: string, action: (() => Promise<void> | void) | undefined): void {\n if (!action) return;\n void Promise.resolve(action()).catch((error: unknown) => {\n console.error(`[desktop/menu] ${label} failed`, error);\n });\n}\n\nfunction buildConnectionSubmenu(options: AppMenuOptions): MenuItemConstructorOptions {\n /*\n * FNXC:DesktopConnectionMenu 2026-06-21-02:04:\n * Desktop users need menu-level controls to start the embedded local server, shut it down, or connect to a remote server without returning to first-run setup.\n */\n return {\n label: \"Connection\",\n submenu: [\n {\n label: \"Use Local Server\",\n click: () => runMenuAction(\"onStartLocalRuntime\", options.onStartLocalRuntime),\n },\n {\n label: \"Shut Down Local Server\",\n click: () => runMenuAction(\"onStopLocalRuntime\", options.onStopLocalRuntime),\n },\n {\n type: \"separator\",\n },\n {\n label: \"Connect to Remote Server\u2026\",\n click: () => runMenuAction(\"onConnectRemoteServer\", options.onConnectRemoteServer ?? options.onChangeLaunchMode),\n },\n {\n label: \"Change Launch Mode\u2026\",\n click: () => runMenuAction(\"onChangeLaunchMode\", options.onChangeLaunchMode),\n },\n ],\n };\n}\n\nfunction buildAppSubmenu(options: AppMenuOptions): MenuItemConstructorOptions {\n return {\n label: options.appName,\n submenu: [\n {\n label: `About ${options.appName}`,\n },\n {\n label: \"Check for Updates\u2026\",\n click: () => runMenuAction(\"onCheckForUpdates\", options.onCheckForUpdates),\n },\n {\n type: \"separator\",\n },\n {\n label: \"Preferences\",\n accelerator: \"CmdOrCtrl+,\",\n },\n {\n type: \"separator\",\n },\n {\n label: `Hide ${options.appName}`,\n role: \"hide\",\n },\n {\n label: \"Hide Others\",\n role: \"hideOthers\",\n },\n {\n label: \"Show All\",\n role: \"unhide\",\n },\n {\n type: \"separator\",\n },\n {\n label: `Quit ${options.appName}`,\n accelerator: \"CmdOrCtrl+Q\",\n role: \"quit\",\n },\n ],\n };\n}\n\nfunction buildEditSubmenu(): MenuItemConstructorOptions {\n return {\n label: \"Edit\",\n submenu: [\n {\n label: \"Undo\",\n accelerator: \"CmdOrCtrl+Z\",\n role: \"undo\",\n },\n {\n label: \"Redo\",\n accelerator: \"Shift+CmdOrCtrl+Z\",\n role: \"redo\",\n },\n {\n type: \"separator\",\n },\n {\n label: \"Cut\",\n accelerator: \"CmdOrCtrl+X\",\n role: \"cut\",\n },\n {\n label: \"Copy\",\n accelerator: \"CmdOrCtrl+C\",\n role: \"copy\",\n },\n {\n label: \"Paste\",\n accelerator: \"CmdOrCtrl+V\",\n role: \"paste\",\n },\n {\n label: \"Select All\",\n accelerator: \"CmdOrCtrl+A\",\n role: \"selectAll\",\n },\n ],\n };\n}\n\nfunction buildViewSubmenu(options: AppMenuOptions): MenuItemConstructorOptions {\n const { webContents } = options.mainWindow;\n\n return {\n label: \"View\",\n submenu: [\n {\n label: \"Reload\",\n accelerator: \"CmdOrCtrl+R\",\n click: () => webContents.reload(),\n },\n {\n label: \"Force Reload\",\n accelerator: \"CmdOrCtrl+Shift+R\",\n click: () => webContents.reloadIgnoringCache(),\n },\n {\n type: \"separator\",\n },\n {\n label: \"Toggle Dev Tools\",\n accelerator: \"Alt+CmdOrCtrl+I\",\n click: () => webContents.toggleDevTools(),\n },\n {\n type: \"separator\",\n },\n {\n label: \"Zoom In\",\n accelerator: \"CmdOrCtrl+Plus\",\n click: () => {\n const level = webContents.getZoomLevel();\n webContents.setZoomLevel(level + 0.5);\n },\n },\n {\n label: \"Zoom Out\",\n accelerator: \"CmdOrCtrl+-\",\n click: () => {\n const level = webContents.getZoomLevel();\n webContents.setZoomLevel(level - 0.5);\n },\n },\n {\n label: \"Reset Zoom\",\n accelerator: \"CmdOrCtrl+0\",\n click: () => {\n webContents.setZoomLevel(0);\n },\n },\n {\n type: \"separator\",\n },\n {\n label: \"Toggle Full Screen\",\n accelerator: \"F11\",\n role: \"togglefullscreen\",\n },\n ],\n };\n}\n\nfunction buildWindowSubmenu(isMac: boolean): MenuItemConstructorOptions {\n const windowItems: MenuItemConstructorOptions[] = [\n {\n label: \"Minimize\",\n accelerator: \"CmdOrCtrl+M\",\n role: \"minimize\",\n },\n ];\n\n if (isMac) {\n windowItems.push({\n label: \"Zoom\",\n role: \"zoom\",\n });\n }\n\n windowItems.push(\n {\n type: \"separator\",\n },\n {\n label: \"Close\",\n accelerator: \"CmdOrCtrl+W\",\n role: \"close\",\n },\n );\n\n if (isMac) {\n windowItems.push(\n {\n type: \"separator\",\n },\n {\n label: \"Bring All to Front\",\n role: \"front\",\n },\n );\n }\n\n return {\n label: \"Window\",\n submenu: windowItems,\n };\n}\n\nfunction buildHelpSubmenu(options: AppMenuOptions): MenuItemConstructorOptions {\n return {\n label: \"Help\",\n submenu: [\n {\n label: \"Check for Updates\u2026\",\n click: () => runMenuAction(\"onCheckForUpdates\", options.onCheckForUpdates),\n },\n {\n label: \"Fusion Documentation\",\n click: () => {\n void shell.openExternal(\"https://github.com/Runfusion/Fusion#readme\");\n },\n },\n ],\n };\n}\n\nexport function buildMenuTemplate(options: AppMenuOptions): MenuItemConstructorOptions[] {\n const isMac = process.platform === \"darwin\";\n\n const template: MenuItemConstructorOptions[] = [\n buildEditSubmenu(),\n buildViewSubmenu(options),\n buildConnectionSubmenu(options),\n buildWindowSubmenu(isMac),\n buildHelpSubmenu(options),\n ];\n\n if (isMac) {\n template.unshift(buildAppSubmenu(options));\n }\n\n return template;\n}\n\nexport function buildAppMenu(options: AppMenuOptions): Menu {\n const menu = Menu.buildFromTemplate(buildMenuTemplate(options));\n Menu.setApplicationMenu(menu);\n return menu;\n}\n", "/**\n * Renderer entry resolution for Electron desktop shell.\n *\n * Production: loads embedded renderer assets from dist/client/index.html\n * Development: loads from FUSION_DASHBOARD_URL or localhost:5173\n */\n\nimport { pathToFileURL } from \"node:url\";\nimport { join } from \"node:path\";\n\nconst DEFAULT_DEV_DASHBOARD_URL = \"http://localhost:5173\";\n\n/**\n * Determines if the app is running in development mode.\n * Development mode is active when:\n * - NODE_ENV is \"development\", OR\n * - --dev flag is passed in command line arguments\n */\nexport function isDevelopmentMode(): boolean {\n return process.env.NODE_ENV === \"development\" || process.argv.includes(\"--dev\");\n}\n\n/**\n * Gets the renderer URL for loading the dashboard UI.\n *\n * In development mode: uses FUSION_DASHBOARD_URL env var or defaults to localhost:5173\n * In production mode: loads from embedded renderer assets (file:// path to dist/client/index.html)\n */\nexport function getRendererUrl(): string {\n if (isDevelopmentMode()) {\n return process.env.FUSION_DASHBOARD_URL ?? DEFAULT_DEV_DASHBOARD_URL;\n }\n\n // Production: use embedded renderer assets\n // This path is relative to the bundled main.js location\n const rendererIndexPath = join(import.meta.dirname, \"client\", \"index.html\");\n return pathToFileURL(rendererIndexPath).toString();\n}\n\n/**\n * Gets the renderer file path for loadFile() calls.\n * Returns the absolute file path (not a URL).\n */\nexport function getRendererFilePath(): string {\n if (isDevelopmentMode()) {\n // In development, we use loadURL, not loadFile\n return \"\";\n }\n\n // Production: return the absolute file path\n return join(import.meta.dirname, \"client\", \"index.html\");\n}\n\n/**\n * Checks if the renderer should be loaded from a URL (development)\n * vs file path (production).\n */\nexport function isUrlRenderer(): boolean {\n if (isDevelopmentMode()) {\n // In dev, always use URL unless explicitly told to use file path\n const override = process.env.FUSION_USE_FILE_RENDERER;\n return override !== \"true\";\n }\n\n // In production, always use file path\n return false;\n}\n\n// Re-export for backward compatibility\nexport const IS_DEVELOPMENT = isDevelopmentMode();\nexport { getRendererUrl as DASHBOARD_URL };\n", "import { once } from \"node:events\";\nimport type { Server } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\n\nimport { ensureDesktopRuntimeProject } from \"./engine-runtime.js\";\n\nexport type RuntimeSource = \"embedded-local\" | \"external-cli\" | \"none\";\nexport type RuntimeState = \"stopped\" | \"starting\" | \"running\" | \"error\";\n\nexport interface DesktopRuntimeStatus {\n source: RuntimeSource;\n state: RuntimeState;\n port?: number;\n baseUrl?: string;\n error?: string;\n}\n\ntype TaskStoreLike = {\n init(): Promise<void>;\n watch(): Promise<void>;\n close(): void;\n};\n\ntype RuntimeCleanup = () => Promise<void> | void;\n\ntype RuntimeInstance = {\n store: TaskStoreLike;\n server: Server;\n port: number;\n baseUrl: string;\n cleanup?: RuntimeCleanup;\n};\n\nexport interface LocalRuntimeManagerOptions {\n rootDir: string;\n getExternalPort?: () => number | undefined;\n createStore?: (rootDir: string) => Promise<TaskStoreLike>;\n createDashboardServer?: (store: TaskStoreLike, rootDir: string) => Promise<Server | { server: Server; cleanup?: RuntimeCleanup }>;\n}\n\nasync function createStoreDefault(rootDir: string): Promise<TaskStoreLike> {\n const { TaskStore } = await import(\"@fusion/core\");\n return new TaskStore(rootDir) as TaskStoreLike;\n}\n\nasync function createDashboardServerDefault(store: TaskStoreLike, rootDir: string): Promise<{ server: Server; cleanup: RuntimeCleanup }> {\n const { CentralCore } = await import(\"@fusion/core\");\n const { createServer } = await import(\"@fusion/dashboard\");\n const { ProjectEngineManager } = await import(\"@fusion/engine\");\n\n /*\n * FNXC:DesktopRuntime 2026-06-20-23:39:\n * Embedded desktop local mode should be an executable Fusion node, not a dashboard-only shell. Start all registered project engines and pass the manager to the API server so project-scoped routes can start newly accessed engines.\n */\n const centralCore = new CentralCore();\n const engineManager = new ProjectEngineManager(centralCore);\n const cleanup = async () => {\n await engineManager.stopAll();\n await centralCore.close?.();\n };\n\n try {\n await centralCore.init();\n const rootProject = await ensureDesktopRuntimeProject(centralCore, rootDir);\n await engineManager.startAll();\n engineManager.startReconciliation();\n const primaryEngine = await engineManager.ensureEngine(rootProject.id);\n const app = createServer(store as never, {\n engine: primaryEngine,\n engineManager,\n centralCore,\n onProjectFirstAccessed: (projectId: string) => engineManager.onProjectAccessed(projectId),\n });\n\n return {\n server: app.listen(0),\n cleanup,\n };\n } catch (error) {\n await cleanup();\n throw error;\n }\n}\n\nfunction parsePort(raw: string | undefined): number | undefined {\n if (!raw) {\n return undefined;\n }\n\n const value = Number(raw);\n if (!Number.isInteger(value) || value <= 0) {\n return undefined;\n }\n\n return value;\n}\n\nfunction getAddressPort(server: Server): number {\n const address = server.address() as AddressInfo | null;\n const port = address?.port;\n if (!port) {\n throw new Error(\"Failed to resolve local server port\");\n }\n return port;\n}\n\nexport class LocalRuntimeManager {\n private runtime: RuntimeInstance | null = null;\n private startupPromise: Promise<DesktopRuntimeStatus> | null = null;\n private stopPromise: Promise<DesktopRuntimeStatus> | null = null;\n private status: DesktopRuntimeStatus = { source: \"none\", state: \"stopped\" };\n\n private readonly getExternalPort: () => number | undefined;\n private readonly createStore: (rootDir: string) => Promise<TaskStoreLike>;\n private readonly createDashboardServer: (store: TaskStoreLike, rootDir: string) => Promise<Server | { server: Server; cleanup?: RuntimeCleanup }>;\n\n constructor(private readonly options: LocalRuntimeManagerOptions) {\n this.getExternalPort = options.getExternalPort ?? (() => parsePort(process.env.FUSION_SERVER_PORT));\n this.createStore = options.createStore ?? createStoreDefault;\n this.createDashboardServer = options.createDashboardServer ?? createDashboardServerDefault;\n }\n\n getStatus(): DesktopRuntimeStatus {\n if (this.runtime) {\n return {\n source: \"embedded-local\",\n state: \"running\",\n port: this.runtime.port,\n baseUrl: this.runtime.baseUrl,\n };\n }\n\n const externalPort = this.getExternalPort();\n if (externalPort) {\n this.status = {\n source: \"external-cli\",\n state: \"running\",\n port: externalPort,\n baseUrl: `http://127.0.0.1:${externalPort}`,\n };\n }\n\n return this.status;\n }\n\n getServerPort(): number | undefined {\n return this.getStatus().port;\n }\n\n async startLocal(): Promise<DesktopRuntimeStatus> {\n const externalPort = this.getExternalPort();\n if (externalPort) {\n this.status = {\n source: \"external-cli\",\n state: \"running\",\n port: externalPort,\n baseUrl: `http://127.0.0.1:${externalPort}`,\n };\n return this.status;\n }\n\n if (this.runtime) {\n return this.getStatus();\n }\n\n if (this.startupPromise) {\n return this.startupPromise;\n }\n\n this.status = { source: \"embedded-local\", state: \"starting\" };\n this.startupPromise = this.startEmbedded();\n\n try {\n return await this.startupPromise;\n } finally {\n this.startupPromise = null;\n }\n }\n\n private async startEmbedded(): Promise<DesktopRuntimeStatus> {\n let store: TaskStoreLike | null = null;\n let server: Server | null = null;\n let cleanup: RuntimeCleanup | undefined;\n\n try {\n store = await this.createStore(this.options.rootDir);\n await store.init();\n await store.watch();\n\n const dashboardServer = await this.createDashboardServer(store, this.options.rootDir);\n cleanup = \"server\" in dashboardServer ? dashboardServer.cleanup : undefined;\n server = \"server\" in dashboardServer ? dashboardServer.server : dashboardServer;\n await Promise.race([\n once(server, \"listening\"),\n once(server, \"error\").then(([error]) => {\n throw error;\n }),\n ]);\n\n const port = getAddressPort(server);\n const baseUrl = `http://127.0.0.1:${port}`;\n this.runtime = { store, server, port, baseUrl, cleanup };\n this.status = { source: \"embedded-local\", state: \"running\", port, baseUrl };\n return this.status;\n } catch (error) {\n if (server) {\n await new Promise<void>((resolve) => {\n server!.close(() => resolve());\n });\n }\n await cleanup?.();\n if (store) {\n store.close();\n }\n this.runtime = null;\n this.status = {\n source: \"embedded-local\",\n state: \"error\",\n error: error instanceof Error ? error.message : String(error),\n };\n throw error;\n }\n }\n\n async stopLocal(): Promise<DesktopRuntimeStatus> {\n if (this.stopPromise) {\n return this.stopPromise;\n }\n\n this.stopPromise = this.stopInternal();\n try {\n return await this.stopPromise;\n } finally {\n this.stopPromise = null;\n }\n }\n\n private async stopInternal(): Promise<DesktopRuntimeStatus> {\n if (this.runtime) {\n const runtime = this.runtime;\n this.runtime = null;\n await new Promise<void>((resolve) => runtime.server.close(() => resolve()));\n await runtime.cleanup?.();\n runtime.store.close();\n this.status = { source: \"none\", state: \"stopped\" };\n return this.status;\n }\n\n if (this.getStatus().source === \"external-cli\") {\n return this.status;\n }\n\n this.status = { source: \"none\", state: \"stopped\" };\n return this.status;\n }\n}\n", "import { basename } from \"node:path\";\n\nimport type { CentralCore, RegisteredProject } from \"@fusion/core\";\n\n/*\n * FNXC:DesktopRuntime 2026-06-21-02:04:\n * Desktop local mode starts engines by default, so the embedded server should prefer the project represented by the desktop runtime root instead of whichever registered engine happens to be first. The runtime root may be a home directory, so this path must not call helpers that initialize Git repositories as a side effect.\n */\nexport async function ensureDesktopRuntimeProject(centralCore: CentralCore, rootDir: string): Promise<RegisteredProject> {\n const existing = await centralCore.getProjectByPath(rootDir);\n if (existing) {\n return existing;\n }\n\n const projects = await centralCore.listProjects();\n if (projects.length > 0) {\n return projects[0]!;\n }\n\n const registered = await centralCore.registerProject({\n path: rootDir,\n name: basename(rootDir) || \"Fusion Desktop\",\n isolationMode: \"in-process\",\n });\n return centralCore.updateProject(registered.id, { status: \"active\" });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["app", "BrowserWindow", "nativeImage", "Tray", "join", "mainWindow", "app", "app", "mainWindow", "app", "mainWindow", "tray", "iconPath", "readFile", "rename", "writeFile", "join", "app", "path", "mainWindow", "tray", "app", "Menu", "join", "app", "resolve", "app", "BrowserWindow", "join", "Tray", "nativeImage"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/preload.ts
|
|
17
|
+
var preload_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(preload_exports);
|
|
19
|
+
var import_electron = require("electron");
|
|
20
|
+
var electronApi = {
|
|
21
|
+
// Window control
|
|
22
|
+
minimize: () => import_electron.ipcRenderer.invoke("window:minimize"),
|
|
23
|
+
maximize: () => import_electron.ipcRenderer.invoke("window:maximize"),
|
|
24
|
+
close: () => import_electron.ipcRenderer.invoke("window:close"),
|
|
25
|
+
isMaximized: () => import_electron.ipcRenderer.invoke("window:isMaximized"),
|
|
26
|
+
// App info
|
|
27
|
+
getSystemInfo: () => import_electron.ipcRenderer.invoke("app:getSystemInfo"),
|
|
28
|
+
checkForUpdates: () => import_electron.ipcRenderer.invoke("app:checkForUpdates"),
|
|
29
|
+
getServerPort: () => import_electron.ipcRenderer.invoke("app:getServerPort"),
|
|
30
|
+
getDesktopRuntimeStatus: () => import_electron.ipcRenderer.invoke("desktopRuntime:getStatus"),
|
|
31
|
+
startDesktopLocalRuntime: () => import_electron.ipcRenderer.invoke("desktopRuntime:startLocal"),
|
|
32
|
+
stopDesktopLocalRuntime: () => import_electron.ipcRenderer.invoke("desktopRuntime:stopLocal"),
|
|
33
|
+
getDesktopLaunchMode: () => import_electron.ipcRenderer.invoke("desktopLaunchMode:getMode"),
|
|
34
|
+
setDesktopLaunchMode: (mode) => import_electron.ipcRenderer.invoke("desktopLaunchMode:setMode", mode),
|
|
35
|
+
getDesktopLaunchContext: () => import_electron.ipcRenderer.invoke("desktopLaunchMode:getContext"),
|
|
36
|
+
openConnectionManager: () => import_electron.ipcRenderer.invoke("shell:openConnectionManager"),
|
|
37
|
+
// Tray status
|
|
38
|
+
updateTrayStatus: (status) => import_electron.ipcRenderer.invoke("tray:updateStatus", status),
|
|
39
|
+
// Native dialogs
|
|
40
|
+
showExportDialog: () => import_electron.ipcRenderer.invoke("native:showExportDialog"),
|
|
41
|
+
showImportDialog: () => import_electron.ipcRenderer.invoke("native:showImportDialog"),
|
|
42
|
+
// Deep link events (main → renderer)
|
|
43
|
+
onDeepLink: (callback) => {
|
|
44
|
+
const handler = (_event, result) => callback(result);
|
|
45
|
+
import_electron.ipcRenderer.on("deep-link", handler);
|
|
46
|
+
return () => import_electron.ipcRenderer.removeListener("deep-link", handler);
|
|
47
|
+
},
|
|
48
|
+
windowControl: async (action) => {
|
|
49
|
+
switch (action) {
|
|
50
|
+
case "minimize":
|
|
51
|
+
return import_electron.ipcRenderer.invoke("window:minimize");
|
|
52
|
+
case "maximize":
|
|
53
|
+
return import_electron.ipcRenderer.invoke("window:maximize");
|
|
54
|
+
case "close":
|
|
55
|
+
return import_electron.ipcRenderer.invoke("window:close");
|
|
56
|
+
case "isMaximized":
|
|
57
|
+
return import_electron.ipcRenderer.invoke("window:isMaximized");
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
getPlatform: () => import_electron.ipcRenderer.invoke("platform:get"),
|
|
61
|
+
apiRequest: (method, path, body) => import_electron.ipcRenderer.invoke("api-request", { method, path, body }),
|
|
62
|
+
// Auto-updater events (main → renderer)
|
|
63
|
+
onUpdateAvailable: (callback) => {
|
|
64
|
+
const handler = (_event, info) => callback(info);
|
|
65
|
+
import_electron.ipcRenderer.on("update-available", handler);
|
|
66
|
+
return () => import_electron.ipcRenderer.removeListener("update-available", handler);
|
|
67
|
+
},
|
|
68
|
+
onUpdateDownloaded: (callback) => {
|
|
69
|
+
const handler = () => callback();
|
|
70
|
+
import_electron.ipcRenderer.on("update-downloaded", handler);
|
|
71
|
+
return () => import_electron.ipcRenderer.removeListener("update-downloaded", handler);
|
|
72
|
+
},
|
|
73
|
+
onUpdateNotAvailable: (callback) => {
|
|
74
|
+
const handler = (_event, info) => callback(info);
|
|
75
|
+
import_electron.ipcRenderer.on("update-not-available", handler);
|
|
76
|
+
return () => import_electron.ipcRenderer.removeListener("update-not-available", handler);
|
|
77
|
+
},
|
|
78
|
+
onUpdateError: (callback) => {
|
|
79
|
+
const handler = (_event, info) => callback(info);
|
|
80
|
+
import_electron.ipcRenderer.on("update-error", handler);
|
|
81
|
+
return () => import_electron.ipcRenderer.removeListener("update-error", handler);
|
|
82
|
+
},
|
|
83
|
+
invoke: (channel, payload) => import_electron.ipcRenderer.invoke(channel, payload)
|
|
84
|
+
};
|
|
85
|
+
var fusionShell = {
|
|
86
|
+
getState: () => import_electron.ipcRenderer.invoke("shell:getState"),
|
|
87
|
+
listProfiles: () => import_electron.ipcRenderer.invoke("shell:listProfiles"),
|
|
88
|
+
saveProfile: (profile) => import_electron.ipcRenderer.invoke("shell:saveProfile", profile),
|
|
89
|
+
deleteProfile: (profileId) => import_electron.ipcRenderer.invoke("shell:deleteProfile", profileId),
|
|
90
|
+
setActiveProfile: (profileId) => import_electron.ipcRenderer.invoke("shell:setActiveProfile", profileId),
|
|
91
|
+
getDesktopModeState: () => import_electron.ipcRenderer.invoke("shell:getDesktopModeState"),
|
|
92
|
+
setDesktopMode: (mode) => import_electron.ipcRenderer.invoke("shell:setDesktopMode", mode),
|
|
93
|
+
resetDesktopMode: () => import_electron.ipcRenderer.invoke("shell:resetDesktopMode"),
|
|
94
|
+
onResetDesktopModeRequest: (callback) => {
|
|
95
|
+
const handler = () => callback();
|
|
96
|
+
import_electron.ipcRenderer.on("shell:reset-desktop-mode-request", handler);
|
|
97
|
+
return () => import_electron.ipcRenderer.removeListener("shell:reset-desktop-mode-request", handler);
|
|
98
|
+
},
|
|
99
|
+
startQrScan: () => import_electron.ipcRenderer.invoke("shell:startQrScan"),
|
|
100
|
+
openConnectionManager: () => import_electron.ipcRenderer.invoke("shell:openConnectionManager"),
|
|
101
|
+
subscribe: (listener) => {
|
|
102
|
+
const handler = (_event, state) => listener(state);
|
|
103
|
+
import_electron.ipcRenderer.on("shell:state", handler);
|
|
104
|
+
return () => import_electron.ipcRenderer.removeListener("shell:state", handler);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
import_electron.contextBridge.exposeInMainWorld("electronAPI", electronApi);
|
|
108
|
+
import_electron.contextBridge.exposeInMainWorld("fusionAPI", electronApi);
|
|
109
|
+
import_electron.contextBridge.exposeInMainWorld("fusionShell", fusionShell);
|
|
110
|
+
//# sourceMappingURL=preload.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/preload.ts"],
|
|
4
|
+
"sourcesContent": ["import { contextBridge, ipcRenderer } from \"electron\";\nimport type { DeepLinkResult, FusionAPI, SystemInfo, UpdateCheckResult } from \"./types\";\n\ninterface ShellConnectionProfile {\n id: string;\n name: string;\n serverUrl: string;\n authToken?: string | null;\n createdAt: string;\n updatedAt: string;\n lastUsedAt?: string | null;\n}\n\ninterface ShellConnectionProfileInput {\n id?: string;\n name: string;\n serverUrl: string;\n authToken?: string | null;\n}\n\ninterface ShellConnectionState {\n host: \"web\" | \"mobile-shell\" | \"desktop-shell\";\n desktopModeState?: {\n isFirstRun: boolean;\n desktopMode: \"local\" | \"remote\" | null;\n };\n desktopMode?: \"local\" | \"remote\";\n activeProfileId: string | null;\n profiles: ShellConnectionProfile[];\n localRuntime?: {\n source: \"embedded-local\" | \"external-cli\" | \"none\";\n state: \"stopped\" | \"starting\" | \"running\" | \"error\";\n port?: number;\n baseUrl?: string;\n error?: string;\n };\n}\n\nexport type FusionDesktopAPI = FusionAPI;\n\ntype WindowControlAction = \"minimize\" | \"maximize\" | \"close\" | \"isMaximized\";\n\nconst electronApi = {\n // Window control\n minimize: (): Promise<void> => ipcRenderer.invoke(\"window:minimize\"),\n maximize: (): Promise<boolean> => ipcRenderer.invoke(\"window:maximize\"),\n close: (): Promise<void> => ipcRenderer.invoke(\"window:close\"),\n isMaximized: (): Promise<boolean> => ipcRenderer.invoke(\"window:isMaximized\"),\n\n // App info\n getSystemInfo: (): Promise<SystemInfo> => ipcRenderer.invoke(\"app:getSystemInfo\"),\n checkForUpdates: (): Promise<UpdateCheckResult> => ipcRenderer.invoke(\"app:checkForUpdates\"),\n getServerPort: (): Promise<number | undefined> => ipcRenderer.invoke(\"app:getServerPort\"),\n getDesktopRuntimeStatus: (): Promise<ShellConnectionState[\"localRuntime\"]> => ipcRenderer.invoke(\"desktopRuntime:getStatus\"),\n startDesktopLocalRuntime: (): Promise<ShellConnectionState[\"localRuntime\"]> => ipcRenderer.invoke(\"desktopRuntime:startLocal\"),\n stopDesktopLocalRuntime: (): Promise<ShellConnectionState[\"localRuntime\"]> => ipcRenderer.invoke(\"desktopRuntime:stopLocal\"),\n getDesktopLaunchMode: (): Promise<\"choose\" | \"local\" | \"remote\"> => ipcRenderer.invoke(\"desktopLaunchMode:getMode\"),\n setDesktopLaunchMode: (mode: \"choose\" | \"local\" | \"remote\"): Promise<\"choose\" | \"local\" | \"remote\"> =>\n ipcRenderer.invoke(\"desktopLaunchMode:setMode\", mode),\n getDesktopLaunchContext: (): Promise<{ mode: \"remote\"; profileId: string; serverBaseUrl: string; serverLabel?: string; authToken?: string } | null> =>\n ipcRenderer.invoke(\"desktopLaunchMode:getContext\"),\n openConnectionManager: (): Promise<void> => ipcRenderer.invoke(\"shell:openConnectionManager\"),\n\n // Tray status\n updateTrayStatus: (status: string): Promise<void> => ipcRenderer.invoke(\"tray:updateStatus\", status),\n\n // Native dialogs\n showExportDialog: (): Promise<string | null> => ipcRenderer.invoke(\"native:showExportDialog\"),\n showImportDialog: (): Promise<string | null> => ipcRenderer.invoke(\"native:showImportDialog\"),\n\n // Deep link events (main \u2192 renderer)\n onDeepLink: (callback: (result: DeepLinkResult) => void): (() => void) => {\n const handler = (_event: Electron.IpcRendererEvent, result: DeepLinkResult) => callback(result);\n ipcRenderer.on(\"deep-link\", handler);\n return () => ipcRenderer.removeListener(\"deep-link\", handler);\n },\n\n windowControl: async (action: WindowControlAction): Promise<boolean | void> => {\n switch (action) {\n case \"minimize\":\n return ipcRenderer.invoke(\"window:minimize\");\n case \"maximize\":\n return ipcRenderer.invoke(\"window:maximize\");\n case \"close\":\n return ipcRenderer.invoke(\"window:close\");\n case \"isMaximized\":\n return ipcRenderer.invoke(\"window:isMaximized\");\n }\n },\n getPlatform: (): Promise<\"darwin\" | \"win32\" | \"linux\"> => ipcRenderer.invoke(\"platform:get\"),\n apiRequest: (method: string, path: string, body?: unknown): Promise<unknown> =>\n ipcRenderer.invoke(\"api-request\", { method, path, body }),\n\n // Auto-updater events (main \u2192 renderer)\n onUpdateAvailable: (callback: (info: { version: string }) => void): (() => void) => {\n const handler = (_event: Electron.IpcRendererEvent, info: { version: string }) => callback(info);\n ipcRenderer.on(\"update-available\", handler);\n return () => ipcRenderer.removeListener(\"update-available\", handler);\n },\n onUpdateDownloaded: (callback: () => void): (() => void) => {\n const handler = () => callback();\n ipcRenderer.on(\"update-downloaded\", handler);\n return () => ipcRenderer.removeListener(\"update-downloaded\", handler);\n },\n onUpdateNotAvailable: (callback: (info: { version?: string }) => void): (() => void) => {\n const handler = (_event: Electron.IpcRendererEvent, info: { version?: string }) => callback(info);\n ipcRenderer.on(\"update-not-available\", handler);\n return () => ipcRenderer.removeListener(\"update-not-available\", handler);\n },\n onUpdateError: (callback: (info: { message: string }) => void): (() => void) => {\n const handler = (_event: Electron.IpcRendererEvent, info: { message: string }) => callback(info);\n ipcRenderer.on(\"update-error\", handler);\n return () => ipcRenderer.removeListener(\"update-error\", handler);\n },\n invoke: (channel: string, payload?: unknown): Promise<unknown> => ipcRenderer.invoke(channel, payload),\n};\n\nconst fusionShell = {\n getState: (): Promise<ShellConnectionState> => ipcRenderer.invoke(\"shell:getState\"),\n listProfiles: (): Promise<ShellConnectionProfile[]> => ipcRenderer.invoke(\"shell:listProfiles\"),\n saveProfile: (profile: ShellConnectionProfileInput): Promise<ShellConnectionProfile> => ipcRenderer.invoke(\"shell:saveProfile\", profile),\n deleteProfile: (profileId: string): Promise<void> => ipcRenderer.invoke(\"shell:deleteProfile\", profileId),\n setActiveProfile: (profileId: string | null): Promise<ShellConnectionState> => ipcRenderer.invoke(\"shell:setActiveProfile\", profileId),\n getDesktopModeState: (): Promise<{ isFirstRun: boolean; desktopMode: \"local\" | \"remote\" | null }> =>\n ipcRenderer.invoke(\"shell:getDesktopModeState\"),\n setDesktopMode: (mode: \"local\" | \"remote\"): Promise<ShellConnectionState> => ipcRenderer.invoke(\"shell:setDesktopMode\", mode),\n resetDesktopMode: (): Promise<ShellConnectionState> => ipcRenderer.invoke(\"shell:resetDesktopMode\"),\n onResetDesktopModeRequest: (callback: () => void): (() => void) => {\n const handler = () => callback();\n ipcRenderer.on(\"shell:reset-desktop-mode-request\", handler);\n return () => ipcRenderer.removeListener(\"shell:reset-desktop-mode-request\", handler);\n },\n startQrScan: (): Promise<{ serverUrl: string; authToken?: string | null }> => ipcRenderer.invoke(\"shell:startQrScan\"),\n openConnectionManager: (): Promise<void> => ipcRenderer.invoke(\"shell:openConnectionManager\"),\n subscribe: (listener: (state: ShellConnectionState) => void): (() => void) => {\n const handler = (_event: Electron.IpcRendererEvent, state: ShellConnectionState) => listener(state);\n ipcRenderer.on(\"shell:state\", handler);\n return () => ipcRenderer.removeListener(\"shell:state\", handler);\n },\n};\n\ncontextBridge.exposeInMainWorld(\"electronAPI\", electronApi);\ncontextBridge.exposeInMainWorld(\"fusionAPI\", electronApi);\ncontextBridge.exposeInMainWorld(\"fusionShell\", fusionShell);\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|