@runeya/runeya 2.0.137 → 2.0.139
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/agent/index.js +36 -10
- package/agent/index.js.map +1 -1
- package/agent-manager-NAGIMH2T.js +11 -0
- package/chat-Q2UMYXQL.js +21 -0
- package/{chunk-ZFELQG4B.js → chunk-EV3TBM7E.js} +78 -5
- package/chunk-EV3TBM7E.js.map +1 -0
- package/{chunk-FJLMXLMK.js → chunk-GLIU3J47.js} +354 -128
- package/chunk-GLIU3J47.js.map +1 -0
- package/{chunk-BDQOBEZ3.js → chunk-GOMF7NWS.js} +2 -2
- package/{desktop-launcher-3COY6F6H.js → chunk-GWQV5KKU.js} +193 -13
- package/chunk-GWQV5KKU.js.map +1 -0
- package/{chunk-5EMEJNVU.js → chunk-LE6XQ3OV.js} +13 -1
- package/chunk-LE6XQ3OV.js.map +1 -0
- package/{chunk-J4GLFY7G.js → chunk-MSICJEZD.js} +5 -5
- package/{chunk-NURPXHLB.js → chunk-OZBSOSAS.js} +26 -12
- package/chunk-OZBSOSAS.js.map +1 -0
- package/{chunk-P65BO7WZ.js → chunk-WNCXZ6E7.js} +165 -125
- package/chunk-WNCXZ6E7.js.map +1 -0
- package/{chunk-I7JHF5FE.js → chunk-XHGJHYDC.js} +4 -4
- package/chunk-YSYLL57J.js +87 -0
- package/chunk-YSYLL57J.js.map +1 -0
- package/{companion-Q67RAO3N.js → companion-MGX62L4T.js} +9 -7
- package/desktop-installer-page-OJTOKP7V.js +598 -0
- package/desktop-installer-page-OJTOKP7V.js.map +1 -0
- package/desktop-launcher-HKXP4LRI.js +43 -0
- package/desktop-wizard-XIDDAG7L.js +15 -0
- package/index.js +30 -21
- package/index.js.map +1 -1
- package/mcp-server/index.js +49 -1
- package/mcp-server/index.js.map +1 -1
- package/{node-4UUJN2WG.js → node-RN4URNZ5.js} +4 -4
- package/package.json +1 -1
- package/settings-manager-BBNCDDQJ.js +10 -0
- package/settings-manager-BBNCDDQJ.js.map +1 -0
- package/{src-7O3GCEIB.js → src-KWLVQD36.js} +193 -92
- package/src-KWLVQD36.js.map +1 -0
- package/{vault-resolver-57Q2DVOR.js → vault-resolver-B5P2OUI5.js} +20 -2
- package/vault-resolver-B5P2OUI5.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-CqGVVIo8.js +13 -0
- package/web/assets/AgentTerminalPage-mVD1jsWC.js +1 -0
- package/web/assets/AiChatPage-J-JAXhoT.js +1 -0
- package/web/assets/AppLayout-6eKmu_TP.css +1 -0
- package/web/assets/AppLayout-CsUnvWA0.js +1 -0
- package/web/assets/AuditPage-gzMJbY4c.js +1 -0
- package/web/assets/CloudAccountPage-CIUmdyoI.js +1 -0
- package/web/assets/CloudAccountPage-Cm1ibhZY.js +1 -0
- package/web/assets/CloudAccountPage-eoNciq1Q.css +1 -0
- package/web/assets/CloudMessagingPage-EV4MwYrk.js +2 -0
- package/web/assets/DashboardPage-CrMccWRA.js +1 -0
- package/web/assets/DirectoryPickerDialog-Cnr4SkLc.js +1 -0
- package/web/assets/DirectoryPickerDialog-D1lQ83i5.css +1 -0
- package/web/assets/{EditorIcon-DXYoMZnL.js → EditorIcon-Dlr9ami0.js} +2 -2
- package/web/assets/{EnvironmentForm-D3pZuxVn.js → EnvironmentForm-NiG4dzT9.js} +2 -2
- package/web/assets/EnvironmentFormPage-TJzOWwS7.js +1 -0
- package/web/assets/EnvironmentListPage-oR335kl1.js +1 -0
- package/web/assets/KanbanBoardPage-Cta-iCIL.css +1 -0
- package/web/assets/KanbanBoardPage-Dol6K6rI.js +4 -0
- package/web/assets/KanbanListPage-C2yhMB2L.js +1 -0
- package/web/assets/{KanbanListPage-DxJFx6A6.css → KanbanListPage-CEJ9Vluh.css} +1 -1
- package/web/assets/LaunchProjectPage-BGIRMKdM.js +1 -0
- package/web/assets/LaunchProjectPage-CU2iF25_.css +1 -0
- package/web/assets/LaunchServicesPage-9aAno4Gc.css +1 -0
- package/web/assets/LaunchServicesPage-DqIG8ZDk.js +1 -0
- package/web/assets/LaunchShell-C7RrqA4k.js +1 -0
- package/web/assets/LaunchShell-CGtjrl6_.css +1 -0
- package/web/assets/LogViewer-BWtCyqa4.js +3 -0
- package/web/assets/OrgKeyPrompt-B343sYVi.css +1 -0
- package/web/assets/OrgKeyPrompt-IjlZPHOI.js +1 -0
- package/web/assets/OrgLogo-B0TayK5W.js +1 -0
- package/web/assets/ProcessControls-Bw28Duzs.js +1 -0
- package/web/assets/ProcessDetailPage-CVYQJ4aI.js +1 -0
- package/web/assets/{ProcessMetrics-CdQc_8Z0.js → ProcessMetrics-D0HzDnGO.js} +3 -3
- package/web/assets/ProjectCreateDialog-CLFPf8ds.js +1 -0
- package/web/assets/ProjectCreateDialog-UEIYMerY.css +1 -0
- package/web/assets/ProjectLocationGate-D68jdBcV.js +1 -0
- package/web/assets/ProjectPublishDialog-CDpS6xcQ.css +1 -0
- package/web/assets/ProjectPublishDialog-Cvvjeuyq.js +1 -0
- package/web/assets/RandomJobTestPage-CuUJfwwb.js +2 -0
- package/web/assets/ScenarioEditorPage-Ckq6XNl2.js +14 -0
- package/web/assets/SendToChatDialog-4a4_2amD.js +1 -0
- package/web/assets/ServiceControlsBar-OC7cDCM7.js +1 -0
- package/web/assets/ServiceDetailPage-BMlS1q4i.js +2 -0
- package/web/assets/ServiceFormPage-CozmJNy1.js +1 -0
- package/web/assets/{SettingsPage-DA7lVKfg.css → SettingsPage-CF548HPl.css} +1 -1
- package/web/assets/SettingsPage-CkJQwWCW.js +2063 -0
- package/web/assets/UnlockPage-94m6Ap-H.js +1 -0
- package/web/assets/VaultMigrationPage-Bj6KgIUi.js +1 -0
- package/web/assets/VersionBadge-DjTAz-tn.js +1 -0
- package/web/assets/WikiPage-n_vxXevo.js +1 -0
- package/web/assets/WikiView-lxEITfCa.js +1 -0
- package/web/assets/add-scalar-classes-lFkCrmFv.js +387 -0
- package/web/assets/{autocomplete-DobAPPYJ.js → autocomplete-bClqtFV-.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-FbeAPLc-.js → basic-shape-diamond.svg-DFdUK3gN.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-CtwcdpTe.js → basic-shape-hexagon.svg-BKiT9xxU.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DsSs3S2_.js → basic-shape-primary-circle-ellipse-round.svg-tmXcRxRQ.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-CNe1RNx8.js → basic-shape-primary-square-rectangle.svg-C9duFSNc.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-DwZMLfah.js → basic-shape-shield.svg-CLzO94DF.js} +1 -1
- package/web/assets/{browser-Dz1gvldT.js → browser-BEDlGGfe.js} +1 -1
- package/web/assets/{browser-DsZ9HxVm.js → browser-CivlztYP.js} +1 -1
- package/web/assets/card-wcTFC8yG.js +32 -0
- package/web/assets/{checkbox-DPknldTJ.js → checkbox-TtO_mmrY.js} +2 -2
- package/web/assets/{chevronup-D2Lr2GiV.js → chevronup-Cd93cHVj.js} +4 -4
- package/web/assets/{chip-Caiakd-N.js → chip-omKmLLWH.js} +2 -2
- package/web/assets/client-BKIls6aD.js +24 -0
- package/web/assets/cloud-chat.store-Bskr_EXO.js +1 -0
- package/web/assets/cloud-client-rcfqjfUK.js +1 -0
- package/web/assets/cloud-session-CycNU7YV.js +1 -0
- package/web/assets/cloud-session-DiaAeCJI.js +2 -0
- package/web/assets/column-DgtEciO-.js +763 -0
- package/web/assets/composables-Ce8WccBy.js +1 -0
- package/web/assets/{computer-device-desktop-monitor.svg-CwiGN14T.js → computer-device-desktop-monitor.svg-D3YaocxY.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-BC2VdXDZ.js → computer-device-desktop.svg-lnn_cyCx.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-BOp8AKN6.js → computer-device-laptop.svg-9f5_Ipnq.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-CmbpPX1u.js → computer-device-mobile-phone-android-samsung-back.svg-DxHwZI5u.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-_WGKWVtZ.js → computer-device-mobile-phone-android-samsung.svg-CnYqoXt4.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-DmLh97KG.js → computer-device-mobile-phone-iphone-x-back.svg-D8JfsF_0.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-C7-5mdyV.js → computer-device-mobile-phone-iphone-x.svg-CUbRWc7v.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-DiUaSnhU.js → computer-device-mobile-tablet-touch.svg-CBX2kbI1.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-B6nfbYm_.js → computer-device-mobile-tablet.svg-CIn05KEg.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-DwtVKy79.js → computer-device-network-ethernet-cat6.svg-Dj0GRqXd.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-vQKfG3Xz.js → computer-device-network-lan-www.svg-D-G7js6t.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-DhHaOUge.js → computer-device-network-wifi-connection.svg-JnvMwBMA.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-1dQS4k4J.js → computer-device-network-wifi-router.svg--XxSrk_J.js} +1 -1
- package/web/assets/{cssMode-CdQL22W5.js → cssMode-C3gHbz_w.js} +1 -1
- package/web/assets/{divider-DhYR4BAO.js → divider-eMI33mv1.js} +2 -2
- package/web/assets/{docx-preview-D-jP_CCs.js → docx-preview-CTkzTOcl.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-D76wQVA2.js → ecology-science-erlenmeyer-flask.svg-DrHKX7bH.js} +1 -1
- package/web/assets/{fieldset-BtOjs_Hh.js → fieldset-CiIJH8Xe.js} +2 -2
- package/web/assets/{freemarker2-BADW9vhy.js → freemarker2-DWxB7Wcd.js} +1 -1
- package/web/assets/{handlebars-CwWQD_C8.js → handlebars-CWUdFsNH.js} +1 -1
- package/web/assets/{html-y87CEbe3.js → html-DhvF7iHg.js} +1 -1
- package/web/assets/{htmlMode-CVagtvVh.js → htmlMode-CIuDa6YW.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-OvpKi3a3.js → image-flash-lightning.svg-qFK_1eYx.js} +1 -1
- package/web/assets/{image-picture-flower.svg-DLOePozT.js → image-picture-flower.svg-qAmkHnOu.js} +1 -1
- package/web/assets/{index-CcIrffU_.js → index-CzSAFmCu.js} +363 -363
- package/web/assets/index-D0IPNhsg.css +1 -0
- package/web/assets/{interface-alert-exclamation-diamond.svg-4Vk7SoQ1.js → interface-alert-exclamation-diamond.svg-Dugh0ymo.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BLAvc4am.js → interface-alert-exclamation-triangle-warning.svg-8neoRFVP.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-CaAXpDAI.js → interface-alert-information-circle.svg-DM9S7DBv.js} +1 -1
- package/web/assets/{interface-award-crown.svg-CW7XG0wx.js → interface-award-crown.svg--68HCcUG.js} +1 -1
- package/web/assets/{interface-bookmark.svg-BpLEuOv2.js → interface-bookmark-tag.svg-BESGrlZw.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-DPWVVeZU.js → interface-bookmark.svg-CVadIwuA.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-DbBgvI4W.js → interface-calendar-date-one.svg-D9XP9Dv_.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-BbsuvPZM.js → interface-content-book-open-pages.svg-DMI3yFmk.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DbRPz1j8.js → interface-content-book-page.svg-BPxSHq3g.js} +1 -1
- package/web/assets/{interface-content-file.svg-OJPKABxS.js → interface-content-file.svg-D0Mbjb8x.js} +1 -1
- package/web/assets/interface-content-folder.svg-D3wbwhAD.js +1 -0
- package/web/assets/{interface-content-folder.svg-3D_5OE_-.js → interface-content-folder.svg-EUO1l7Mn.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-DqthVh9J.js → interface-copy-clipboard.svg-DI-wp72J.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-BAPCnZ0B.js → interface-edit-attachment.svg-CrWbaWn_.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-BoV39ouF.js → interface-edit-binocular.svg-BzUDq1Il.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-Cz36nKVn.js → interface-edit-magic-wand.svg-DaAdEL5x.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-DZUQotD5.js → interface-edit-tool-paint-roller.svg-C972BXSM.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-DBf1Y9Tj.js → interface-edit-tool-pencil.svg-47QCYH9f.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-B93sRjxf.js → interface-favorite-award.svg-DROP-rzN.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-DKHuT11J.js → interface-favorite-flag.svg-B1gpMdkg.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-Bw5FZQ7d.js → interface-favorite-heart.svg-Dc0MMGJl.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-CgLbct_b.js → interface-favorite-star.svg-D6A5KWft.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-B7cYS4ef.js → interface-favorite-stars-sparkles.svg-CpEr4y41.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-zwuaRdWq.js → interface-hierarchy-flowchart.svg-DjvgRFcZ.js} +1 -1
- package/web/assets/{interface-home-house.svg-B85yMFCe.js → interface-home-house.svg-BMmVKlSc.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-US6b-Svn.js → interface-hyperlink.svg-BewFXeyZ.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-mZWkhb7f.js → interface-lighting-brightness.svg-B74_Fwt9.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-9oHuNwuY.js → interface-lock-closed.svg-B_kTyHSd.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-DBetdJny.js → interface-lock-open-unlock.svg-BpmOnQWL.js} +1 -1
- package/web/assets/{interface-login-key.svg-BZnZTYd1.js → interface-login-key.svg-CjYpI4bh.js} +1 -1
- package/web/assets/{interface-search.svg-CMXAOoam.js → interface-search.svg-FJmFWdB4.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-CKckatt7.js → interface-setting-cog.svg-CfzSne-G.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DH7kVqN-.js → interface-share-megaphone-bullhorn.svg-CIIzDsMB.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-BNXcMugi.js → interface-share-rocket.svg-DqTBI7lO.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-Bb8t607w.js → interface-share-satellite.svg-nJfwIxpE.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-Dk4rbLtF.js → interface-share-space-ship.svg-hSmFC9Bt.js} +1 -1
- package/web/assets/{interface-share.svg-CtX8dq5i.js → interface-share.svg-DW5W5LS6.js} +1 -1
- package/web/assets/{interface-signal-square.svg-DmUIlYTd.js → interface-signal-square.svg-CxjWE1n9.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-D2ZNaXT3.js → interface-time-clock-circle.svg-OliTsm3U.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-Ddo-8hHe.js → interface-time-hour-glass.svg-Cq5G77ft.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-Jh7S0sT4.js → interface-users-multiple.svg-BZxMlLou.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-DbdQFgL2.js → interface-weather-moon.svg-lFXrwEyz.js} +1 -1
- package/web/assets/{javascript-BVGFyXBk.js → javascript-BVZ1omk1.js} +1 -1
- package/web/assets/{jsonMode-vnFlxYl9.js → jsonMode-CiBARvaV.js} +2 -2
- package/web/assets/{liquid-DieKMEvN.js → liquid-CUYREU3G.js} +1 -1
- package/web/assets/{lspLanguageFeatures-DoeI-8Y7.js → lspLanguageFeatures-BCfkeNgB.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-CApdU2ea.js → mail-chat-bubble-square.svg-DbOh-u2f.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-jjZ0KB32.js → mail-send-email-paper-airplane.svg-Ci3654Ap.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-B6Tsoh-8.js → mail-send-envelope.svg-BUCSUoVb.js} +1 -1
- package/web/assets/{mdx-BCkszXid.js → mdx-GNBOgT3C.js} +1 -1
- package/web/assets/{minus-DfLQX3s2.js → minus-qBqqwoxz.js} +2 -2
- package/web/assets/modal-CsKPvO45.js +5 -0
- package/web/assets/modal-E9FRG--u.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-DM-I8Snr.js → money-cashier-receipt.svg-qOZhZZs2.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-CkDRewrV.js → money-currency-dollar-pay.svg-WYlopKIm.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-BT4KLHWz.js → money-graph-arrow-increase.svg-DAcyYWIw.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-EvyIJ3Uu.js → money-graph-bar-chart-increase.svg-Bcjxz1Kd.js} +1 -1
- package/web/assets/multiselect-DiGSzibm.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-uZBwXdg9.js → nature-ecology-leaf.svg-d0AKmyxH.js} +1 -1
- package/web/assets/{password-D1R5w1qL.js → password-BwMjgK0Q.js} +4 -4
- package/web/assets/{phone-telephone.svg-BSvOskIB.js → phone-telephone.svg-BzKK2wbN.js} +1 -1
- package/web/assets/{plus-CNGSRnxy.js → plus-D6Rlmwbp.js} +6 -6
- package/web/assets/process.store-I5VZVT0x.js +1 -0
- package/web/assets/{programming-bug.svg-CLnGs4K-.js → programming-bug.svg-BtSROvd5.js} +1 -1
- package/web/assets/{programming-cloud.svg-CxBovXBR.js → programming-cloud.svg-YDPFJdYt.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-C1JmOyio.js → programming-computer-database-server.svg-C_7cgE9Q.js} +1 -1
- package/web/assets/{programming-computer-database.svg-BRjyOzP4.js → programming-computer-database.svg-CLw76mik.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-Blwzw6Qz.js → programming-module-four-layout.svg-BsoC5ySI.js} +1 -1
- package/web/assets/{programming-module-three.svg-6bkrmWsU.js → programming-module-three.svg-CThoMoAk.js} +1 -1
- package/web/assets/{programming-module.svg-CBS9xKxX.js → programming-module.svg-BQ1YjjAj.js} +1 -1
- package/web/assets/{programming-script-code.svg-BVhyoAD3.js → programming-script-code.svg-BKT_wilO.js} +1 -1
- package/web/assets/project-launch.store-CBnJKGQe.js +1 -0
- package/web/assets/project.store-JIcOcKSg.js +1 -0
- package/web/assets/{python-CiPYtj_d.js → python-BXwGt-Ip.js} +1 -1
- package/web/assets/{radiobutton--KWBHcDP.js → radiobutton-D20sH1UN.js} +3 -3
- package/web/assets/{razor-CSoWGP30.js → razor-RXambmP2.js} +1 -1
- package/web/assets/router-BXj_oCbf.js +1 -0
- package/web/assets/{selectbutton-C0NL5n4w.js → selectbutton-rLcf19Xf.js} +4 -4
- package/web/assets/settings-scope-Cy_9OGE1.js +1 -0
- package/web/assets/settings.store-DrKeFdgW.js +1 -0
- package/web/assets/{shopping-cart.svg-C-8NG_Po.js → shopping-cart.svg-EjTn3XQF.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-Bp6q5VzJ.js → shopping-gift-present.svg-AQNlzazh.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-DeWaEIwm.js → shopping-shipping-box-parcel-package.svg-VB9n6UNi.js} +1 -1
- package/web/assets/src-ByEHJyfr.js +1 -0
- package/web/assets/{src-BHR3l7pa.js → src-CUwD1xPP.js} +35 -35
- package/web/assets/src-C_auNJtg.css +1 -0
- package/web/assets/{tag-new-circle.svg-CTljXsqE.js → tag-new-circle.svg-BllOd5JW.js} +1 -1
- package/web/assets/theme-DuAHBQRP.js +1 -0
- package/web/assets/{toggleswitch-d41l5g27.js → toggleswitch-C-88_GnB.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-BUkcntCp.js → travel-map-earth-globe.svg-ChLDmmU9.js} +1 -1
- package/web/assets/trpc-BoKwANhj.js +1 -0
- package/web/assets/{tsMode-B2c-rCAa.js → tsMode-CIN3QIw8.js} +6 -6
- package/web/assets/{typescript-CmW4u_GQ.js → typescript-wXu_7Eym.js} +1 -1
- package/web/assets/useAiChatDrawer-Bs1Gxhn2.js +1 -0
- package/web/assets/{useCloudOrg-E4l-99WA.js → useCloudOrg-0AZ58M3V.js} +1 -1
- package/web/assets/useEnvVarAutocomplete-BXC_JUF7.js +102 -0
- package/web/assets/{useEnvVarAutocomplete-DsxEF6Ya.css → useEnvVarAutocomplete-dxAmKsn7.css} +1 -1
- package/web/assets/useProjectCloudOrg-UIfVePy9.js +1 -0
- package/web/assets/useServiceUrlHost-BXbIxPaT.js +1 -0
- package/web/assets/{xml-BxMqu3hT.js → xml-FTYGqn2R.js} +1 -1
- package/web/assets/{yaml-Djx7E3R1.js → yaml-DQEEK2dU.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-FUU72VGH.js +0 -11
- package/chat-C26CBAZX.js +0 -21
- package/chunk-5EMEJNVU.js.map +0 -1
- package/chunk-FJLMXLMK.js.map +0 -1
- package/chunk-NURPXHLB.js.map +0 -1
- package/chunk-P65BO7WZ.js.map +0 -1
- package/chunk-ZFELQG4B.js.map +0 -1
- package/desktop-launcher-3COY6F6H.js.map +0 -1
- package/desktop-wizard-4CYANX2O.js +0 -209
- package/desktop-wizard-4CYANX2O.js.map +0 -1
- package/settings-manager-J4QBIU3T.js +0 -10
- package/src-7O3GCEIB.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-BGGkpyp3.js +0 -13
- package/web/assets/AgentTerminalPage-B8gLray2.js +0 -1
- package/web/assets/AiChatPage-BKITsyMx.js +0 -1
- package/web/assets/AppLayout-B72S4nTi.css +0 -1
- package/web/assets/AppLayout-BYw7v2sp.js +0 -1
- package/web/assets/AuditPage-nHTwzyia.js +0 -1
- package/web/assets/CloudAccountPage-DYOvfMjD.css +0 -1
- package/web/assets/CloudAccountPage-DuaZz2j4.js +0 -1
- package/web/assets/CloudAccountPage-XHxI-ixD.js +0 -1
- package/web/assets/CloudMessagingPage-B2N5K-Xs.js +0 -2
- package/web/assets/DashboardPage-VoWJeWh_.js +0 -1
- package/web/assets/DirectoryPickerDialog-B5SuJOhv.js +0 -1
- package/web/assets/DirectoryPickerDialog-Ctp1lYoS.css +0 -1
- package/web/assets/EnvironmentFormPage-BIXbPTN5.js +0 -1
- package/web/assets/EnvironmentListPage-CHa-Ni3w.js +0 -1
- package/web/assets/KanbanBoardPage-B46zbE2H.css +0 -1
- package/web/assets/KanbanBoardPage-BFTNpm8P.js +0 -4
- package/web/assets/KanbanListPage-CYuIrKXH.js +0 -1
- package/web/assets/LaunchProjectPage-9hhGBdOh.css +0 -1
- package/web/assets/LaunchProjectPage-jy-R3Fiw.js +0 -1
- package/web/assets/LaunchServicesPage-BMtm_8yP.css +0 -1
- package/web/assets/LaunchServicesPage-DX7nyo36.js +0 -1
- package/web/assets/LaunchShell-BHfseuPM.js +0 -1
- package/web/assets/LaunchShell-HenrOlHV.css +0 -1
- package/web/assets/LogViewer-C-pHXudR.js +0 -3
- package/web/assets/OrgKeyPrompt-CrHXZdKL.css +0 -1
- package/web/assets/OrgKeyPrompt-OPnK5oPm.js +0 -1
- package/web/assets/OrgLogo-Cxa49Tl3.js +0 -1
- package/web/assets/ProcessControls-DXDyR6XX.js +0 -1
- package/web/assets/ProcessDetailPage-DNKTwgPW.js +0 -1
- package/web/assets/RandomJobTestPage-BE8HkgSb.js +0 -2
- package/web/assets/ScenarioEditorPage-Coo6ExzZ.js +0 -14
- package/web/assets/SendToChatDialog-ClXerpCU.js +0 -1
- package/web/assets/ServiceControlsBar-C7HrPjQI.js +0 -1
- package/web/assets/ServiceDetailPage-Cxuy0Yix.js +0 -2
- package/web/assets/ServiceFormPage-CCOu1h8v.js +0 -1
- package/web/assets/SettingsPage-Dt1ViDQe.js +0 -2063
- package/web/assets/UnlockPage-C5iEOAKH.js +0 -1
- package/web/assets/VaultMigrationPage-CwRWvFY7.js +0 -1
- package/web/assets/VersionBadge-Bqb72GXf.js +0 -1
- package/web/assets/WikiPage-Bl1jDKKp.js +0 -1
- package/web/assets/WikiView-58u6vU3q.js +0 -1
- package/web/assets/add-scalar-classes-CT5KQbzH.js +0 -387
- package/web/assets/card-46tM5yU0.js +0 -32
- package/web/assets/client-KL5c1Dog.js +0 -24
- package/web/assets/cloud-chat.store-Belo5SKd.js +0 -1
- package/web/assets/cloud-client-Cqa2Udt8.js +0 -1
- package/web/assets/cloud-session-56bUtkSL.js +0 -2
- package/web/assets/cloud-session-Dqm0C6H5.js +0 -1
- package/web/assets/column-DQ53_qc6.js +0 -763
- package/web/assets/composables-CHyZa9ag.js +0 -1
- package/web/assets/index-CKOtBNaZ.css +0 -1
- package/web/assets/interface-content-folder.svg-8mYqkDao.js +0 -1
- package/web/assets/modal-CCco27Sn.js +0 -5
- package/web/assets/modal-D4J85_wC.js +0 -1
- package/web/assets/multiselect-BmjidXlj.js +0 -251
- package/web/assets/process.store-p1LqnpY2.js +0 -1
- package/web/assets/project-launch.store-BBYtCcv8.js +0 -1
- package/web/assets/project.store-D_2v7amt.js +0 -1
- package/web/assets/router-CRKT3825.js +0 -1
- package/web/assets/settings-scope-DblmUa3N.js +0 -1
- package/web/assets/settings.store-DKTQyerJ.js +0 -1
- package/web/assets/src-BN5gTC76.css +0 -1
- package/web/assets/src-BRLkogf3.js +0 -1
- package/web/assets/theme-BZzt_Sgl.js +0 -1
- package/web/assets/trpc-Db0Atu8A.js +0 -1
- package/web/assets/useAiChatDrawer-0QJJVXul.js +0 -1
- package/web/assets/useEnvVarAutocomplete-BDqUWoGr.js +0 -102
- package/web/assets/useProjectCatalog-Cxt-hL1H.js +0 -1
- package/web/assets/useProjectCloudOrg-CwLTQLIO.js +0 -1
- package/web/assets/useServiceUrlHost-VIA3uP5-.js +0 -1
- /package/{agent-manager-FUU72VGH.js.map → agent-manager-NAGIMH2T.js.map} +0 -0
- /package/{chat-C26CBAZX.js.map → chat-Q2UMYXQL.js.map} +0 -0
- /package/{chunk-BDQOBEZ3.js.map → chunk-GOMF7NWS.js.map} +0 -0
- /package/{chunk-J4GLFY7G.js.map → chunk-MSICJEZD.js.map} +0 -0
- /package/{chunk-I7JHF5FE.js.map → chunk-XHGJHYDC.js.map} +0 -0
- /package/{companion-Q67RAO3N.js.map → companion-MGX62L4T.js.map} +0 -0
- /package/{node-4UUJN2WG.js.map → desktop-launcher-HKXP4LRI.js.map} +0 -0
- /package/{settings-manager-J4QBIU3T.js.map → desktop-wizard-XIDDAG7L.js.map} +0 -0
- /package/{vault-resolver-57Q2DVOR.js.map → node-RN4URNZ5.js.map} +0 -0
- /package/web/assets/{abap-BwLGULgU.js → abap-CRsXUZTC.js} +0 -0
- /package/web/assets/{apex-BmwhxS2n.js → apex-CN6ZSzwM.js} +0 -0
- /package/web/assets/{azcli-7RvE_Zal.js → azcli-ULFzG1xV.js} +0 -0
- /package/web/assets/{bat-DRPmS6Na.js → bat-BVH8lwB4.js} +0 -0
- /package/web/assets/{bicep-BwfkS7ZV.js → bicep-B8jMqZ8i.js} +0 -0
- /package/web/assets/{browser-D3d3061H.js → browser-xa0YgePN.js} +0 -0
- /package/web/assets/{cameligo-BJ_mdC8E.js → cameligo-DuuRwBiE.js} +0 -0
- /package/web/assets/{clojure-CQKq7DWt.js → clojure-DUpiEmPZ.js} +0 -0
- /package/web/assets/{coffee-DJRj2iwd.js → coffee-BO4ou798.js} +0 -0
- /package/web/assets/{cpp-BC1yJTUW.js → cpp-CHOtY2DW.js} +0 -0
- /package/web/assets/{csharp-D6U2fAAT.js → csharp-D3t5O1XD.js} +0 -0
- /package/web/assets/{csp-B2Ue_UmV.js → csp-CJpJWgPE.js} +0 -0
- /package/web/assets/{css-CEzlcbMY.js → css-CAeYpQS5.js} +0 -0
- /package/web/assets/{cypher-D5Sg38Yj.js → cypher-D9-TC6ep.js} +0 -0
- /package/web/assets/{dart-BhjKRv6v.js → dart-CYoMdUUD.js} +0 -0
- /package/web/assets/{dockerfile-BnivEbtE.js → dockerfile-B2ffS5e2.js} +0 -0
- /package/web/assets/{ecl-TS1StLK1.js → ecl-BL_MLv5o.js} +0 -0
- /package/web/assets/{elixir-BX9ta6DO.js → elixir-DTTK5HpM.js} +0 -0
- /package/web/assets/{flow9-CoOB42ee.js → flow9-CnqIliGA.js} +0 -0
- /package/web/assets/{fsharp-DmQslDFn.js → fsharp-BtsygJkw.js} +0 -0
- /package/web/assets/{go-BbEGGooY.js → go-DksUoC0w.js} +0 -0
- /package/web/assets/{graphql-E24y5sn9.js → graphql-DCtJGb0Q.js} +0 -0
- /package/web/assets/{hcl-pBZphP8G.js → hcl-Vm6MaTNZ.js} +0 -0
- /package/web/assets/{ini-BSbRgr25.js → ini-DdyyiZLB.js} +0 -0
- /package/web/assets/{java-D8KvzsMp.js → java-D9tw0Sq3.js} +0 -0
- /package/web/assets/{julia-BDRytf15.js → julia-DsaDhMSi.js} +0 -0
- /package/web/assets/{kotlin-CNcQo-uP.js → kotlin-eMyqSg05.js} +0 -0
- /package/web/assets/{less-0HRV-2Rz.js → less-BTExquT2.js} +0 -0
- /package/web/assets/{lexon-DdJG3_pW.js → lexon-Btiu1CPR.js} +0 -0
- /package/web/assets/{lua-Blq8Mukj.js → lua-uIHSqSt_.js} +0 -0
- /package/web/assets/{m3-CXbmzr9W.js → m3-DtY-QwwW.js} +0 -0
- /package/web/assets/{markdown-DFIISzT8.js → markdown-DalwAnMR.js} +0 -0
- /package/web/assets/{mips-C2XSYglv.js → mips-BocGRfi2.js} +0 -0
- /package/web/assets/{msdax-D3Jl6oAY.js → msdax-CQFbyz50.js} +0 -0
- /package/web/assets/{mysql-mCqxt_Co.js → mysql-BM8uo0J8.js} +0 -0
- /package/web/assets/{objective-c-CUKLr4E9.js → objective-c-H3c5-SZb.js} +0 -0
- /package/web/assets/{pascal-BpqDI6Ur.js → pascal-BgiV8eY7.js} +0 -0
- /package/web/assets/{pascaligo-BVchPyL4.js → pascaligo-DT9ZcxD2.js} +0 -0
- /package/web/assets/{perl-Dgc9v23P.js → perl-B0U4-W-w.js} +0 -0
- /package/web/assets/{pgsql-Dk9IX1G_.js → pgsql-B6kZRXs9.js} +0 -0
- /package/web/assets/{php-XeFLn3yL.js → php-DG9vCwQM.js} +0 -0
- /package/web/assets/{pla-DQMfrdXZ.js → pla-B4Y4wk5I.js} +0 -0
- /package/web/assets/{postiats-DiKrdL3K.js → postiats-C_eWfeAP.js} +0 -0
- /package/web/assets/{powerquery-Cj9Q91Zv.js → powerquery-DfX2HFDF.js} +0 -0
- /package/web/assets/{powershell-DxLElnzU.js → powershell-Bxsmga8Z.js} +0 -0
- /package/web/assets/{protobuf-7vT2HdZD.js → protobuf-BjgmCR9H.js} +0 -0
- /package/web/assets/{pug-oi96TUbQ.js → pug-ryXuxA3i.js} +0 -0
- /package/web/assets/{qsharp-DNr9IwS2.js → qsharp-91Kv1jwy.js} +0 -0
- /package/web/assets/{r-C-REi_Zk.js → r-j6OkO-Lp.js} +0 -0
- /package/web/assets/{redis-BvOCrLoN.js → redis-B2Usw_gW.js} +0 -0
- /package/web/assets/{redshift-jNEw-REz.js → redshift-Bl5n-UlH.js} +0 -0
- /package/web/assets/{restructuredtext-B9ET-x7N.js → restructuredtext-IIWeXmeu.js} +0 -0
- /package/web/assets/{ruby-BIEBiJDZ.js → ruby-DQH1R4pC.js} +0 -0
- /package/web/assets/{rust-BnoIVewm.js → rust-BJi0001n.js} +0 -0
- /package/web/assets/{sb-Bwvy9clh.js → sb-C34JQX0H.js} +0 -0
- /package/web/assets/{scala-DPv5zS47.js → scala-BqHjuqsC.js} +0 -0
- /package/web/assets/{scheme-BQqNVxf_.js → scheme-DIfjDH23.js} +0 -0
- /package/web/assets/{scss-Ck1AFDEz.js → scss-MxgEDdb7.js} +0 -0
- /package/web/assets/{shell-C4IYs9Z7.js → shell-D_SMEq6l.js} +0 -0
- /package/web/assets/{solidity-D3bS77xq.js → solidity-CyBHDO6p.js} +0 -0
- /package/web/assets/{sophia-BSTVfueD.js → sophia-8_L-7Xrk.js} +0 -0
- /package/web/assets/{sparql-BGcXD7s2.js → sparql-CXxyP-1c.js} +0 -0
- /package/web/assets/{sql-CIsSgyam.js → sql-DNd4NFJw.js} +0 -0
- /package/web/assets/{st-dV1d_AXx.js → st-DPFJcK-4.js} +0 -0
- /package/web/assets/{swift-CK8gXWQn.js → swift-DE_LJ5Ub.js} +0 -0
- /package/web/assets/{systemverilog-B9tHBIJU.js → systemverilog-IgPgwLQ7.js} +0 -0
- /package/web/assets/{tcl-BgRT60RV.js → tcl-Cr-fmmH0.js} +0 -0
- /package/web/assets/{twig-CGkLO4Nl.js → twig-Dd_ODPfV.js} +0 -0
- /package/web/assets/{typespec-DMP9WuzC.js → typespec-CeK8X8vB.js} +0 -0
- /package/web/assets/{uuid-H0yY5A03.js → uuid-6HQMUkhT.js} +0 -0
- /package/web/assets/{vb-DfSbhl3d.js → vb-CyLVxxH6.js} +0 -0
- /package/web/assets/{wgsl-CaJmoLY5.js → wgsl-CmRFGM3r.js} +0 -0
|
@@ -0,0 +1,598 @@
|
|
|
1
|
+
import {
|
|
2
|
+
launcherProblems
|
|
3
|
+
} from "./chunk-GWQV5KKU.js";
|
|
4
|
+
import {
|
|
5
|
+
deriveLauncherIdentity
|
|
6
|
+
} from "./chunk-LE6XQ3OV.js";
|
|
7
|
+
import {
|
|
8
|
+
shellArg,
|
|
9
|
+
whereToFind
|
|
10
|
+
} from "./chunk-YSYLL57J.js";
|
|
11
|
+
import {
|
|
12
|
+
findFreePortPair,
|
|
13
|
+
isPortFree
|
|
14
|
+
} from "./chunk-O2KOX4LU.js";
|
|
15
|
+
|
|
16
|
+
// src/desktop-installer-page.ts
|
|
17
|
+
import { createServer } from "http";
|
|
18
|
+
import { isAbsolute } from "path";
|
|
19
|
+
|
|
20
|
+
// src/desktop-installer-html.ts
|
|
21
|
+
function installerHtml() {
|
|
22
|
+
return `<!doctype html>
|
|
23
|
+
<html lang="fr">
|
|
24
|
+
<head>
|
|
25
|
+
<meta charset="utf-8">
|
|
26
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
27
|
+
<title>Installer Runeya</title>
|
|
28
|
+
<link rel="icon" href="data:image/svg+xml,${encodeURIComponent(MARK)}">
|
|
29
|
+
<style>
|
|
30
|
+
:root {
|
|
31
|
+
--bg: #f6f6f9; --surface: #ffffff; --border: #e3e3ea; --text: #1d1d27;
|
|
32
|
+
--muted: #6b6b7b; --primary: #6366f1; --primary-text: #ffffff;
|
|
33
|
+
--danger: #dc2626; --ok: #16a34a; --warn: #b45309;
|
|
34
|
+
--ease: cubic-bezier(0.23, 1, 0.32, 1);
|
|
35
|
+
color-scheme: light;
|
|
36
|
+
}
|
|
37
|
+
@media (prefers-color-scheme: dark) {
|
|
38
|
+
:root {
|
|
39
|
+
--bg: #111118; --surface: #1a1a24; --border: #2c2c3a; --text: #ececf2;
|
|
40
|
+
--muted: #9a9aab; --primary: #818cf8; --primary-text: #111118;
|
|
41
|
+
--danger: #f87171; --ok: #4ade80; --warn: #fbbf24;
|
|
42
|
+
color-scheme: dark;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
* { box-sizing: border-box; }
|
|
46
|
+
body {
|
|
47
|
+
margin: 0; min-height: 100vh; display: flex; align-items: center; justify-content: center;
|
|
48
|
+
padding: 3rem 1rem; background: var(--bg); color: var(--text);
|
|
49
|
+
font: 15px/1.5 system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
|
|
50
|
+
}
|
|
51
|
+
main { width: 100%; max-width: 1600px; display: flex; flex-direction: column; gap: 1.5rem;
|
|
52
|
+
animation: enter 400ms var(--ease) both; }
|
|
53
|
+
header { display: flex; flex-direction: column; align-items: center; text-align: center; gap: .5rem; }
|
|
54
|
+
header svg { width: 48px; height: 48px; }
|
|
55
|
+
h1 { margin: .25rem 0 0; font-size: 1.375rem; font-weight: 650; letter-spacing: -.01em; }
|
|
56
|
+
.lead { margin: 0; color: var(--muted); font-size: .875rem; }
|
|
57
|
+
.card { background: var(--surface); border: 1px solid var(--border); border-radius: 14px; padding: 1.25rem;
|
|
58
|
+
display: flex; flex-direction: column; gap: 1.25rem; box-shadow: 0 1px 2px rgb(0 0 0 / .04); }
|
|
59
|
+
fieldset { border: 0; margin: 0; padding: 0; display: flex; flex-direction: column; gap: .5rem; }
|
|
60
|
+
legend, label.title { font-size: .75rem; font-weight: 600; letter-spacing: .06em; text-transform: uppercase;
|
|
61
|
+
color: var(--muted); margin-bottom: .5rem; padding: 0; }
|
|
62
|
+
.choice { display: flex; gap: .75rem; align-items: flex-start; padding: .75rem .875rem; border: 1px solid var(--border);
|
|
63
|
+
border-radius: 10px; cursor: pointer; transition: border-color 150ms ease, box-shadow 150ms ease; }
|
|
64
|
+
.choice:has(input:checked) { border-color: var(--primary);
|
|
65
|
+
box-shadow: 0 0 0 3px color-mix(in srgb, var(--primary) 15%, transparent); }
|
|
66
|
+
.choice input { margin: .2rem 0 0; accent-color: var(--primary); }
|
|
67
|
+
.choice strong { display: block; font-weight: 600; font-size: .9375rem; }
|
|
68
|
+
.choice span { display: block; color: var(--muted); font-size: .8125rem; overflow-wrap: anywhere; }
|
|
69
|
+
.choice .warn { color: var(--danger); }
|
|
70
|
+
input[type=text], input[type=number] { width: 100%; padding: .625rem .75rem; border: 1px solid var(--border);
|
|
71
|
+
border-radius: 8px; background: var(--surface); color: var(--text); font: inherit; }
|
|
72
|
+
input:focus-visible, button:focus-visible { outline: 2px solid var(--primary); outline-offset: 2px; }
|
|
73
|
+
.ports { display: grid; grid-template-columns: 1fr 1fr; gap: .75rem; }
|
|
74
|
+
.ports label { font-size: .8125rem; color: var(--muted); display: flex; flex-direction: column; gap: .25rem; }
|
|
75
|
+
[hidden] { display: none !important; }
|
|
76
|
+
.actions { display: flex; gap: .75rem; }
|
|
77
|
+
button { flex: 1; padding: .7rem 1rem; border-radius: 10px; border: 1px solid transparent; font: inherit;
|
|
78
|
+
font-weight: 600; cursor: pointer; transition: transform 160ms var(--ease), opacity 150ms ease; }
|
|
79
|
+
button:active { transform: scale(.97); }
|
|
80
|
+
button:disabled { opacity: .6; cursor: default; }
|
|
81
|
+
.primary { background: var(--primary); color: var(--primary-text); }
|
|
82
|
+
.secondary { flex: 0 0 auto; background: transparent; color: var(--muted); border-color: var(--border); }
|
|
83
|
+
.error { margin: 0; color: var(--danger); font-size: .875rem; }
|
|
84
|
+
.done { text-align: center; align-items: center; width: 100%; max-width: 520px; align-self: center; }
|
|
85
|
+
.done .check { width: 44px; height: 44px; border-radius: 50%; display: grid; place-items: center;
|
|
86
|
+
background: color-mix(in srgb, var(--ok) 15%, var(--surface)); color: var(--ok); font-size: 1.4rem; }
|
|
87
|
+
.done h2 { margin: 0; font-size: 1.125rem; }
|
|
88
|
+
.done dl { width: 100%; margin: 0; text-align: left; display: flex; flex-direction: column; gap: .75rem; }
|
|
89
|
+
.done dt { font-size: .75rem; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
|
|
90
|
+
.done dd { margin: .25rem 0 0; font-size: .875rem; overflow-wrap: anywhere; }
|
|
91
|
+
code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: .8125rem;
|
|
92
|
+
background: color-mix(in srgb, var(--text) 7%, var(--surface)); padding: .15rem .4rem; border-radius: 6px; }
|
|
93
|
+
.close { color: var(--muted); font-size: .8125rem; margin: 0; }
|
|
94
|
+
.hint { margin: .375rem 0 0; color: var(--muted); font-size: .8125rem; }
|
|
95
|
+
.split { display: grid; grid-template-columns: minmax(0, 520px); justify-content: center; gap: 1.5rem; align-items: start; }
|
|
96
|
+
/*
|
|
97
|
+
* Des raccourcis \xE0 g\xE9rer : la cr\xE9ation reste au centre, \xE0 sa largeur ; les
|
|
98
|
+
* existants prennent la colonne de droite, la gauche restant vide pour que le
|
|
99
|
+
* centre ne bouge pas. En dessous de 1200 px, ils passent sous la cr\xE9ation.
|
|
100
|
+
*/
|
|
101
|
+
.split.has-existing { grid-template-columns: minmax(0, 1fr) minmax(0, 520px) minmax(0, 1fr); }
|
|
102
|
+
.split.has-existing #form { grid-column: 2; grid-row: 1; }
|
|
103
|
+
.split.has-existing .existing { grid-column: 3; grid-row: 1; }
|
|
104
|
+
@media (max-width: 1200px) {
|
|
105
|
+
.split.has-existing { grid-template-columns: minmax(0, 520px); }
|
|
106
|
+
.split.has-existing #form, .split.has-existing .existing { grid-column: 1; grid-row: auto; }
|
|
107
|
+
}
|
|
108
|
+
.existing { gap: .75rem; order: 2; }
|
|
109
|
+
.existing h2 { margin: 0; font-size: .75rem; font-weight: 600; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
|
|
110
|
+
.launcher-list { display: flex; flex-direction: column; gap: .5rem; }
|
|
111
|
+
.launcher { display: flex; gap: .75rem; align-items: center; padding: .75rem .875rem; border: 1px solid var(--border); border-radius: 10px; }
|
|
112
|
+
.launcher__body { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .125rem; }
|
|
113
|
+
.launcher__body strong { font-weight: 600; font-size: .9375rem; }
|
|
114
|
+
.launcher__body span { color: var(--muted); font-size: .8125rem; overflow-wrap: anywhere; }
|
|
115
|
+
.launcher__body .problem { color: var(--danger); }
|
|
116
|
+
.launcher__body .stale { color: var(--warn); }
|
|
117
|
+
.launcher__actions { display: flex; gap: .375rem; flex-shrink: 0; }
|
|
118
|
+
.launcher__actions button { flex: 0 0 auto; padding: .4rem .7rem; font-size: .8125rem; background: transparent;
|
|
119
|
+
color: var(--text); border-color: var(--border); }
|
|
120
|
+
.launcher__actions .danger { color: var(--danger); }
|
|
121
|
+
.launcher__actions .confirm { background: var(--danger); border-color: var(--danger); color: var(--primary-text); }
|
|
122
|
+
@media (max-width: 480px) { .launcher { flex-direction: column; align-items: stretch; } }
|
|
123
|
+
@keyframes enter { from { opacity: 0; transform: translateY(8px); } }
|
|
124
|
+
@media (prefers-reduced-motion: reduce) { main { animation: none; } button:active { transform: none; } }
|
|
125
|
+
@media (max-width: 480px) { .ports { grid-template-columns: 1fr; } }
|
|
126
|
+
</style>
|
|
127
|
+
</head>
|
|
128
|
+
<body>
|
|
129
|
+
<main>
|
|
130
|
+
<header>
|
|
131
|
+
${MARK}
|
|
132
|
+
<h1 data-t="title"></h1>
|
|
133
|
+
<p class="lead" data-t="lead"></p>
|
|
134
|
+
</header>
|
|
135
|
+
|
|
136
|
+
<div class="split" id="split">
|
|
137
|
+
<section class="card existing" id="existing" hidden>
|
|
138
|
+
<h2 data-t="existingTitle"></h2>
|
|
139
|
+
<div id="launchers" class="launcher-list"></div>
|
|
140
|
+
<p class="error" id="list-error" role="alert" hidden></p>
|
|
141
|
+
</section>
|
|
142
|
+
|
|
143
|
+
<form id="form" class="card" novalidate>
|
|
144
|
+
|
|
145
|
+
<div>
|
|
146
|
+
<label class="title" for="name" data-t="name"></label>
|
|
147
|
+
<input id="name" type="text" maxlength="120" autocomplete="off" required>
|
|
148
|
+
<p class="hint" data-t="globalHint"></p>
|
|
149
|
+
</div>
|
|
150
|
+
|
|
151
|
+
<fieldset>
|
|
152
|
+
<legend data-t="ports"></legend>
|
|
153
|
+
<label class="choice" id="ports-dedicated-row"><input type="radio" name="ports" value="dedicated">
|
|
154
|
+
<div><strong data-t="portsDedicated"></strong><span id="ports-dedicated"></span></div></label>
|
|
155
|
+
<label class="choice"><input type="radio" name="ports" value="default">
|
|
156
|
+
<div><strong data-t="portsDefault"></strong><span id="ports-default"></span></div></label>
|
|
157
|
+
<label class="choice"><input type="radio" name="ports" value="custom">
|
|
158
|
+
<div><strong data-t="portsCustom"></strong><span data-t="portsCustomHint"></span></div></label>
|
|
159
|
+
<div class="ports" id="custom" hidden>
|
|
160
|
+
<label><span data-t="portRuneya"></span><input id="port" type="number" min="1" max="65535"></label>
|
|
161
|
+
<label><span data-t="portAgent"></span><input id="agent-port" type="number" min="1" max="65535"></label>
|
|
162
|
+
</div>
|
|
163
|
+
</fieldset>
|
|
164
|
+
|
|
165
|
+
<p class="error" id="error" role="alert" hidden></p>
|
|
166
|
+
|
|
167
|
+
<div class="actions">
|
|
168
|
+
<button type="button" class="secondary" id="cancel" data-t="cancel"></button>
|
|
169
|
+
<button type="submit" class="primary" id="submit" data-t="install"></button>
|
|
170
|
+
</div>
|
|
171
|
+
</form>
|
|
172
|
+
</div>
|
|
173
|
+
|
|
174
|
+
<section class="card done" id="done" hidden aria-live="polite">
|
|
175
|
+
<div class="check" aria-hidden="true">\u2713</div>
|
|
176
|
+
<h2 id="done-title"></h2>
|
|
177
|
+
<dl>
|
|
178
|
+
<div><dt data-t="where"></dt><dd id="where"></dd></div>
|
|
179
|
+
<div><dt data-t="files"></dt><dd id="files"></dd></div>
|
|
180
|
+
<div id="warnings-row" hidden><dt data-t="warnings"></dt><dd id="warnings"></dd></div>
|
|
181
|
+
<div><dt data-t="remove"></dt><dd><code id="uninstall"></code></dd></div>
|
|
182
|
+
</dl>
|
|
183
|
+
<p class="close" data-t="closeTab"></p>
|
|
184
|
+
</section>
|
|
185
|
+
|
|
186
|
+
<section class="card done" id="cancelled" hidden>
|
|
187
|
+
<h2 data-t="cancelledTitle"></h2>
|
|
188
|
+
<p class="close" data-t="closeTab"></p>
|
|
189
|
+
</section>
|
|
190
|
+
</main>
|
|
191
|
+
<script>
|
|
192
|
+
const T = {
|
|
193
|
+
fr: {
|
|
194
|
+
title: 'Installer Runeya',
|
|
195
|
+
lead: 'Un lanceur dans le menu de votre bureau, pour d\xE9marrer Runeya sans terminal.',
|
|
196
|
+
globalHint: 'Le raccourci d\xE9marre Runeya dans votre dossier personnel et range les donn\xE9es dans ~/.runeya. Pour un raccourci vers un projet, passez par les r\xE9glages de Runeya.',
|
|
197
|
+
name: 'Nom du raccourci', ports: 'Ports',
|
|
198
|
+
portsDedicated: 'Ports d\xE9di\xE9s (recommand\xE9)', portsDefault: 'Ports par d\xE9faut de Runeya',
|
|
199
|
+
portsCustom: 'Choisir moi-m\xEAme', portsCustomHint: 'Saisir le port de Runeya, puis celui de l\u2019agent',
|
|
200
|
+
portRuneya: 'Runeya', portAgent: 'Agent',
|
|
201
|
+
dedicatedHint: (p) => p + ' et ' + (p + 1) + ', choisis parmi les ports libres',
|
|
202
|
+
defaultFree: (p) => p + ' et ' + (p + 1) + ', libres en ce moment',
|
|
203
|
+
defaultTaken: (p) => p + ' ou ' + (p + 1) + ' est occup\xE9 : le raccourci ne d\xE9marrera pas tant qu\u2019il le reste',
|
|
204
|
+
cancel: 'Fermer', install: 'Cr\xE9er le raccourci', installing: 'Cr\xE9ation\u2026',
|
|
205
|
+
existingTitle: 'Raccourcis existants', global: 'Global (dossier personnel)',
|
|
206
|
+
portsOf: (p, a) => 'Ports ' + p + ' \xB7 ' + a, defaultPorts: 'Ports par d\xE9faut',
|
|
207
|
+
outdated: 'Vise un autre Node ou une autre installation de Runeya',
|
|
208
|
+
recreate: 'Recr\xE9er', removeAction: 'Supprimer', confirmRemove: 'Confirmer',
|
|
209
|
+
working: '\u2026',
|
|
210
|
+
created: (n) => 'Raccourci \xAB ' + n + ' \xBB cr\xE9\xE9',
|
|
211
|
+
where: 'O\xF9 le trouver', files: 'Fichiers \xE9crits', warnings: 'Avertissements', remove: 'Pour le supprimer',
|
|
212
|
+
closeTab: 'Vous pouvez fermer cet onglet.',
|
|
213
|
+
cancelledTitle: 'Installateur ferm\xE9',
|
|
214
|
+
nameRequired: 'Donnez un nom au raccourci.',
|
|
215
|
+
portsInvalid: 'Deux ports diff\xE9rents entre 1 et 65535.',
|
|
216
|
+
unreachable: 'L\u2019installateur ne r\xE9pond plus. Relancez \xAB runeya install-desktop \xBB.',
|
|
217
|
+
},
|
|
218
|
+
en: {
|
|
219
|
+
title: 'Install Runeya',
|
|
220
|
+
lead: 'A launcher in your desktop menu, to start Runeya without a terminal.',
|
|
221
|
+
globalHint: 'The shortcut starts Runeya in your home folder and stores data in ~/.runeya. For a shortcut to a project, use the Runeya settings.',
|
|
222
|
+
name: 'Shortcut name', ports: 'Ports',
|
|
223
|
+
portsDedicated: 'Dedicated ports (recommended)', portsDefault: 'Runeya default ports',
|
|
224
|
+
portsCustom: 'Choose myself', portsCustomHint: 'Enter the Runeya port, then the agent\u2019s',
|
|
225
|
+
portRuneya: 'Runeya', portAgent: 'Agent',
|
|
226
|
+
dedicatedHint: (p) => p + ' and ' + (p + 1) + ', chosen among free ports',
|
|
227
|
+
defaultFree: (p) => p + ' and ' + (p + 1) + ', currently free',
|
|
228
|
+
defaultTaken: (p) => p + ' or ' + (p + 1) + ' is in use: the shortcut will not start until it is free',
|
|
229
|
+
cancel: 'Close', install: 'Create shortcut', installing: 'Creating\u2026',
|
|
230
|
+
existingTitle: 'Existing shortcuts', global: 'Global (home folder)',
|
|
231
|
+
portsOf: (p, a) => 'Ports ' + p + ' \xB7 ' + a, defaultPorts: 'Default ports',
|
|
232
|
+
outdated: 'Points to another Node or another Runeya install',
|
|
233
|
+
recreate: 'Recreate', removeAction: 'Remove', confirmRemove: 'Confirm',
|
|
234
|
+
working: '\u2026',
|
|
235
|
+
created: (n) => 'Shortcut \u201C' + n + '\u201D created',
|
|
236
|
+
where: 'Where to find it', files: 'Files written', warnings: 'Warnings', remove: 'To remove it',
|
|
237
|
+
closeTab: 'You can close this tab.',
|
|
238
|
+
cancelledTitle: 'Installer closed',
|
|
239
|
+
nameRequired: 'Give the shortcut a name.',
|
|
240
|
+
portsInvalid: 'Two different ports between 1 and 65535.',
|
|
241
|
+
unreachable: 'The installer no longer answers. Run \u201Cruneya install-desktop\u201D again.',
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
const lang = (navigator.language || 'fr').toLowerCase().startsWith('fr') ? 'fr' : 'en';
|
|
245
|
+
const t = T[lang];
|
|
246
|
+
document.documentElement.lang = lang;
|
|
247
|
+
document.title = t.title;
|
|
248
|
+
document.querySelectorAll('[data-t]').forEach((el) => { el.textContent = t[el.dataset.t]; });
|
|
249
|
+
|
|
250
|
+
const $ = (id) => document.getElementById(id);
|
|
251
|
+
const form = $('form');
|
|
252
|
+
let state = null;
|
|
253
|
+
|
|
254
|
+
async function post(path, body) {
|
|
255
|
+
const res = await fetch(path, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
|
|
256
|
+
const data = await res.json().catch(() => ({}));
|
|
257
|
+
if (!res.ok) throw new Error(data.error || res.statusText);
|
|
258
|
+
return data;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
function showError(message) {
|
|
262
|
+
$('error').textContent = message;
|
|
263
|
+
$('error').hidden = !message;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
async function load() {
|
|
267
|
+
state = await (await fetch('/api/state')).json();
|
|
268
|
+
if (state.suggestedPort === null) {
|
|
269
|
+
$('ports-dedicated-row').hidden = true;
|
|
270
|
+
form.elements.ports.value = 'default';
|
|
271
|
+
} else {
|
|
272
|
+
$('ports-dedicated').textContent = t.dedicatedHint(state.suggestedPort);
|
|
273
|
+
form.elements.ports.value = 'dedicated';
|
|
274
|
+
}
|
|
275
|
+
$('ports-default').textContent = state.defaultsFree ? t.defaultFree(state.defaultPort) : t.defaultTaken(state.defaultPort);
|
|
276
|
+
if (!state.defaultsFree) $('ports-default').classList.add('warn');
|
|
277
|
+
$('port').value = state.suggestedPort ?? state.defaultPort;
|
|
278
|
+
$('agent-port').value = (state.suggestedPort ?? state.defaultPort) + 1;
|
|
279
|
+
$('name').value = state.name;
|
|
280
|
+
$('name').focus();
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
form.addEventListener('change', (e) => {
|
|
284
|
+
if (e.target.name === 'ports') $('custom').hidden = portsChoice() !== 'custom';
|
|
285
|
+
});
|
|
286
|
+
|
|
287
|
+
form.addEventListener('submit', async (e) => {
|
|
288
|
+
e.preventDefault();
|
|
289
|
+
showError('');
|
|
290
|
+
const name = $('name').value.trim();
|
|
291
|
+
if (!name) { showError(t.nameRequired); $('name').focus(); return; }
|
|
292
|
+
|
|
293
|
+
let port = null, agentPort = null;
|
|
294
|
+
if (portsChoice() === 'dedicated') { port = state.suggestedPort; agentPort = port + 1; }
|
|
295
|
+
if (portsChoice() === 'custom') {
|
|
296
|
+
port = Number($('port').value); agentPort = Number($('agent-port').value);
|
|
297
|
+
const ok = [port, agentPort].every((p) => Number.isInteger(p) && p >= 1 && p <= 65535) && port !== agentPort;
|
|
298
|
+
if (!ok) { showError(t.portsInvalid); return; }
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
const submit = $('submit');
|
|
302
|
+
submit.disabled = true; $('cancel').disabled = true;
|
|
303
|
+
submit.textContent = t.installing;
|
|
304
|
+
try {
|
|
305
|
+
const r = await post('/api/install', { name, workingDir: null, port, agentPort });
|
|
306
|
+
$('done-title').textContent = t.created(r.name);
|
|
307
|
+
$('where').textContent = r.whereToFind;
|
|
308
|
+
$('files').replaceChildren();
|
|
309
|
+
for (const p of r.paths) { const d = document.createElement('div'); d.textContent = p; $('files').append(d); }
|
|
310
|
+
if (r.warnings.length) {
|
|
311
|
+
$('warnings-row').hidden = false;
|
|
312
|
+
$('warnings').textContent = r.warnings.join(' \xB7 ');
|
|
313
|
+
}
|
|
314
|
+
$('uninstall').textContent = r.uninstall;
|
|
315
|
+
$('split').hidden = true; $('done').hidden = false;
|
|
316
|
+
} catch (err) {
|
|
317
|
+
showError(err instanceof TypeError ? t.unreachable : err.message);
|
|
318
|
+
submit.disabled = false; $('cancel').disabled = false;
|
|
319
|
+
submit.textContent = t.install;
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
|
|
323
|
+
$('cancel').addEventListener('click', async () => {
|
|
324
|
+
try { await post('/api/cancel', {}); } catch { /* d\xE9j\xE0 ferm\xE9 */ }
|
|
325
|
+
$('split').hidden = true; $('cancelled').hidden = false;
|
|
326
|
+
});
|
|
327
|
+
|
|
328
|
+
function el(tag, className, text) {
|
|
329
|
+
const node = document.createElement(tag);
|
|
330
|
+
if (className) node.className = className;
|
|
331
|
+
if (text !== undefined) node.textContent = text;
|
|
332
|
+
return node;
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
function listError(message) {
|
|
336
|
+
$('list-error').textContent = message;
|
|
337
|
+
$('list-error').hidden = !message;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/** Une action sur un raccourci existant ; la liste est relue ensuite. */
|
|
341
|
+
async function act(path, launcher, button) {
|
|
342
|
+
listError('');
|
|
343
|
+
const label = button.textContent;
|
|
344
|
+
button.disabled = true; button.textContent = t.working;
|
|
345
|
+
try {
|
|
346
|
+
await post(path, { id: launcher.id });
|
|
347
|
+
await loadLaunchers();
|
|
348
|
+
} catch (err) {
|
|
349
|
+
listError(err instanceof TypeError ? t.unreachable : err.message);
|
|
350
|
+
button.disabled = false; button.textContent = label;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
function renderLauncher(l) {
|
|
355
|
+
const row = el('div', 'launcher');
|
|
356
|
+
const body = el('div', 'launcher__body');
|
|
357
|
+
body.append(el('strong', '', l.name));
|
|
358
|
+
body.append(el('span', '', l.workingDir ?? t.global));
|
|
359
|
+
body.append(el('span', '', l.port === null ? t.defaultPorts : t.portsOf(l.port, l.agentPort)));
|
|
360
|
+
for (const p of l.problems) body.append(el('span', 'problem', p));
|
|
361
|
+
if (l.outdated && !l.problems.length) body.append(el('span', 'stale', t.outdated));
|
|
362
|
+
row.append(body);
|
|
363
|
+
|
|
364
|
+
const actions = el('div', 'launcher__actions');
|
|
365
|
+
// Recr\xE9er n'a de sens que si le raccourci ne vise plus ce Runeya-ci.
|
|
366
|
+
if (l.outdated || l.problems.length) {
|
|
367
|
+
const recreate = el('button', '', t.recreate);
|
|
368
|
+
recreate.type = 'button';
|
|
369
|
+
recreate.addEventListener('click', () => act('/api/reinstall', l, recreate));
|
|
370
|
+
actions.append(recreate);
|
|
371
|
+
}
|
|
372
|
+
// Deux temps, sans bo\xEEte de dialogue : le premier clic arme, le second supprime.
|
|
373
|
+
const remove = el('button', 'danger', t.removeAction);
|
|
374
|
+
remove.type = 'button';
|
|
375
|
+
let armed = false;
|
|
376
|
+
remove.addEventListener('click', () => {
|
|
377
|
+
if (!armed) {
|
|
378
|
+
armed = true; remove.textContent = t.confirmRemove; remove.className = 'confirm';
|
|
379
|
+
setTimeout(() => { if (armed && !remove.disabled) { armed = false; remove.textContent = t.removeAction; remove.className = 'danger'; } }, 3000);
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
act('/api/uninstall', l, remove);
|
|
383
|
+
});
|
|
384
|
+
actions.append(remove);
|
|
385
|
+
row.append(actions);
|
|
386
|
+
return row;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
async function loadLaunchers() {
|
|
390
|
+
const list = await (await fetch('/api/launchers')).json();
|
|
391
|
+
$('launchers').replaceChildren(...list.map(renderLauncher));
|
|
392
|
+
$('existing').hidden = list.length === 0;
|
|
393
|
+
$('split').classList.toggle('has-existing', list.length > 0);
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
load().catch(() => showError(t.unreachable));
|
|
397
|
+
loadLaunchers().catch(() => listError(t.unreachable));
|
|
398
|
+
</script>
|
|
399
|
+
</body>
|
|
400
|
+
</html>`;
|
|
401
|
+
}
|
|
402
|
+
var MARK = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 28 28" aria-hidden="true"><rect width="28" height="28" rx="8" fill="#6366f1"/><path d="M7 20 L14 8 L21 20" stroke="white" stroke-width="2.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/><path d="M10 16 L18 16" stroke="white" stroke-width="2.5" stroke-linecap="round"/></svg>';
|
|
403
|
+
|
|
404
|
+
// src/desktop-installer-page.ts
|
|
405
|
+
var DEFAULT_PORT = 4e3;
|
|
406
|
+
var MAX_BODY_BYTES = 16 * 1024;
|
|
407
|
+
function isPort(value) {
|
|
408
|
+
return typeof value === "number" && Number.isInteger(value) && value >= 1 && value <= 65535;
|
|
409
|
+
}
|
|
410
|
+
function parseInstallRequest(body) {
|
|
411
|
+
if (typeof body !== "object" || body === null) return "Requ\xEAte invalide.";
|
|
412
|
+
const b = body;
|
|
413
|
+
if (typeof b["name"] !== "string") return "Nom manquant.";
|
|
414
|
+
const name = b["name"].trim();
|
|
415
|
+
if (name.length === 0) return "Le nom ne peut pas \xEAtre vide.";
|
|
416
|
+
if (name.length > 120) return "Le nom ne doit pas d\xE9passer 120 caract\xE8res.";
|
|
417
|
+
const workingDir = b["workingDir"];
|
|
418
|
+
if (workingDir !== null && (typeof workingDir !== "string" || workingDir.length > 4096 || !isAbsolute(workingDir))) {
|
|
419
|
+
return "Le dossier de travail doit \xEAtre un chemin absolu.";
|
|
420
|
+
}
|
|
421
|
+
const port = b["port"];
|
|
422
|
+
const agentPort = b["agentPort"];
|
|
423
|
+
if (port !== null && !isPort(port)) return "Port de Runeya invalide.";
|
|
424
|
+
if (agentPort !== null && !isPort(agentPort)) return "Port de l\u2019agent invalide.";
|
|
425
|
+
if (port === null !== (agentPort === null)) return "Les deux ports vont ensemble.";
|
|
426
|
+
if (port !== null && port === agentPort) return "Runeya et l\u2019agent ne peuvent pas partager un port.";
|
|
427
|
+
return { name, workingDir, port, agentPort };
|
|
428
|
+
}
|
|
429
|
+
function isOwnHost(host, port) {
|
|
430
|
+
return host === `127.0.0.1:${port}` || host === `localhost:${port}`;
|
|
431
|
+
}
|
|
432
|
+
async function readJson(req) {
|
|
433
|
+
let size = 0;
|
|
434
|
+
const chunks = [];
|
|
435
|
+
for await (const chunk of req) {
|
|
436
|
+
size += chunk.length;
|
|
437
|
+
if (size > MAX_BODY_BYTES) throw new Error("too-large");
|
|
438
|
+
chunks.push(chunk);
|
|
439
|
+
}
|
|
440
|
+
return JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
441
|
+
}
|
|
442
|
+
function send(res, status, body, type = "application/json; charset=utf-8") {
|
|
443
|
+
res.writeHead(status, {
|
|
444
|
+
"Content-Type": type,
|
|
445
|
+
"Cache-Control": "no-store",
|
|
446
|
+
"X-Content-Type-Options": "nosniff",
|
|
447
|
+
"Referrer-Policy": "no-referrer",
|
|
448
|
+
"Content-Security-Policy": "default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline'; connect-src 'self'; img-src data:"
|
|
449
|
+
});
|
|
450
|
+
res.end(typeof body === "string" ? body : JSON.stringify(body));
|
|
451
|
+
}
|
|
452
|
+
async function toView(l, current) {
|
|
453
|
+
return {
|
|
454
|
+
id: l.id,
|
|
455
|
+
name: l.name,
|
|
456
|
+
workingDir: l.workingDir,
|
|
457
|
+
port: l.port,
|
|
458
|
+
agentPort: l.agentPort,
|
|
459
|
+
paths: l.paths,
|
|
460
|
+
problems: await launcherProblems(l),
|
|
461
|
+
outdated: l.nodePath !== current.nodePath || l.cliEntry !== current.cliEntry
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
function parseLauncherRef(body) {
|
|
465
|
+
const id = body?.id;
|
|
466
|
+
return typeof id === "string" && id.length > 0 && id.length <= 200 ? id : null;
|
|
467
|
+
}
|
|
468
|
+
async function runInstallerPage(opts) {
|
|
469
|
+
const suggestedPort = await findFreePortPair();
|
|
470
|
+
const state = {
|
|
471
|
+
name: deriveLauncherIdentity(void 0, null).name,
|
|
472
|
+
suggestedPort,
|
|
473
|
+
defaultPort: DEFAULT_PORT,
|
|
474
|
+
defaultsFree: await isPortFree(DEFAULT_PORT) && await isPortFree(DEFAULT_PORT + 1)
|
|
475
|
+
};
|
|
476
|
+
return new Promise((resolvePromise) => {
|
|
477
|
+
let settled = false;
|
|
478
|
+
let installing = false;
|
|
479
|
+
const server = createServer((req, res) => {
|
|
480
|
+
void handle(req, res).catch(() => send(res, 500, { error: "Erreur interne." }));
|
|
481
|
+
});
|
|
482
|
+
function finish(outcome) {
|
|
483
|
+
if (settled) return;
|
|
484
|
+
settled = true;
|
|
485
|
+
process.off("SIGINT", onSigint);
|
|
486
|
+
setImmediate(() => {
|
|
487
|
+
server.close();
|
|
488
|
+
server.closeAllConnections();
|
|
489
|
+
resolvePromise(outcome);
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
function onSigint() {
|
|
493
|
+
console.log("\nAnnul\xE9.");
|
|
494
|
+
finish(null);
|
|
495
|
+
}
|
|
496
|
+
async function handle(req, res) {
|
|
497
|
+
const { port } = server.address();
|
|
498
|
+
if (!isOwnHost(req.headers.host, port)) return send(res, 421, { error: "H\xF4te inattendu." });
|
|
499
|
+
const url = new URL(req.url ?? "/", `http://127.0.0.1:${port}`);
|
|
500
|
+
if (req.method === "GET" && url.pathname === "/") {
|
|
501
|
+
return send(res, 200, installerHtml(), "text/html; charset=utf-8");
|
|
502
|
+
}
|
|
503
|
+
if (req.method === "GET" && url.pathname === "/api/state") {
|
|
504
|
+
return send(res, 200, state);
|
|
505
|
+
}
|
|
506
|
+
if (req.method === "GET" && url.pathname === "/api/launchers") {
|
|
507
|
+
const launchers = await opts.list();
|
|
508
|
+
return send(res, 200, await Promise.all(launchers.map((l) => toView(l, opts.current))));
|
|
509
|
+
}
|
|
510
|
+
if (req.method === "POST") {
|
|
511
|
+
const origin = req.headers.origin;
|
|
512
|
+
if (!origin || !isOwnHost(origin.replace(/^http:\/\//, ""), port)) {
|
|
513
|
+
return send(res, 403, { error: "Origine refus\xE9e." });
|
|
514
|
+
}
|
|
515
|
+
if (!req.headers["content-type"]?.startsWith("application/json")) {
|
|
516
|
+
return send(res, 415, { error: "JSON attendu." });
|
|
517
|
+
}
|
|
518
|
+
if (url.pathname === "/api/cancel") {
|
|
519
|
+
send(res, 200, { ok: true });
|
|
520
|
+
console.log("\nAnnul\xE9 depuis la page.");
|
|
521
|
+
return finish(null);
|
|
522
|
+
}
|
|
523
|
+
if (url.pathname === "/api/uninstall" || url.pathname === "/api/reinstall") {
|
|
524
|
+
if (installing || settled) return send(res, 409, { error: "Une op\xE9ration est d\xE9j\xE0 en cours." });
|
|
525
|
+
let body;
|
|
526
|
+
try {
|
|
527
|
+
body = await readJson(req);
|
|
528
|
+
} catch {
|
|
529
|
+
return send(res, 400, { error: "Requ\xEAte invalide." });
|
|
530
|
+
}
|
|
531
|
+
const id = parseLauncherRef(body);
|
|
532
|
+
const launcher = id === null ? void 0 : (await opts.list()).find((l) => l.id === id);
|
|
533
|
+
if (!launcher) return send(res, 404, { error: "Raccourci introuvable." });
|
|
534
|
+
installing = true;
|
|
535
|
+
try {
|
|
536
|
+
const result = url.pathname === "/api/uninstall" ? await opts.uninstall(launcher) : await opts.install({
|
|
537
|
+
name: launcher.name,
|
|
538
|
+
workingDir: launcher.workingDir,
|
|
539
|
+
port: launcher.port,
|
|
540
|
+
agentPort: launcher.agentPort
|
|
541
|
+
});
|
|
542
|
+
return send(res, 200, { paths: result.paths, warnings: result.warnings });
|
|
543
|
+
} catch (err) {
|
|
544
|
+
return send(res, 500, { error: err.message });
|
|
545
|
+
} finally {
|
|
546
|
+
installing = false;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
if (url.pathname === "/api/install") {
|
|
550
|
+
if (installing || settled) return send(res, 409, { error: "Installation d\xE9j\xE0 en cours." });
|
|
551
|
+
let body;
|
|
552
|
+
try {
|
|
553
|
+
body = await readJson(req);
|
|
554
|
+
} catch {
|
|
555
|
+
return send(res, 400, { error: "Requ\xEAte invalide." });
|
|
556
|
+
}
|
|
557
|
+
const parsed = parseInstallRequest(body);
|
|
558
|
+
if (typeof parsed === "string") return send(res, 400, { error: parsed });
|
|
559
|
+
const answers = { ...parsed, workingDir: null };
|
|
560
|
+
installing = true;
|
|
561
|
+
try {
|
|
562
|
+
const result = await opts.install(answers);
|
|
563
|
+
send(res, 200, {
|
|
564
|
+
name: answers.name,
|
|
565
|
+
paths: result.paths,
|
|
566
|
+
warnings: result.warnings,
|
|
567
|
+
whereToFind: whereToFind(),
|
|
568
|
+
uninstall: `runeya uninstall-desktop --name ${shellArg(answers.name)}`
|
|
569
|
+
});
|
|
570
|
+
return finish({ answers, result });
|
|
571
|
+
} catch (err) {
|
|
572
|
+
return send(res, 500, { error: err.message });
|
|
573
|
+
} finally {
|
|
574
|
+
installing = false;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
send(res, 404, { error: "Introuvable." });
|
|
579
|
+
}
|
|
580
|
+
process.on("SIGINT", onSigint);
|
|
581
|
+
server.listen(0, "127.0.0.1", () => {
|
|
582
|
+
const { port } = server.address();
|
|
583
|
+
const url = `http://127.0.0.1:${port}/`;
|
|
584
|
+
console.log(`
|
|
585
|
+
Installateur du raccourci Runeya : ${url}`);
|
|
586
|
+
console.log("Choisissez les r\xE9glages dans la page. Ctrl+C pour annuler.");
|
|
587
|
+
opts.openUrl(url).catch(() => {
|
|
588
|
+
console.log("Impossible d\u2019ouvrir le navigateur \u2014 ouvrez l\u2019adresse ci-dessus.");
|
|
589
|
+
});
|
|
590
|
+
});
|
|
591
|
+
});
|
|
592
|
+
}
|
|
593
|
+
export {
|
|
594
|
+
isOwnHost,
|
|
595
|
+
parseInstallRequest,
|
|
596
|
+
runInstallerPage
|
|
597
|
+
};
|
|
598
|
+
//# sourceMappingURL=desktop-installer-page-OJTOKP7V.js.map
|