@runeya/runeya 2.0.138 → 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.
Files changed (397) hide show
  1. package/agent/index.js +12 -0
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-NAGIMH2T.js +11 -0
  4. package/chat-Q2UMYXQL.js +21 -0
  5. package/{chunk-ZFELQG4B.js → chunk-EV3TBM7E.js} +78 -5
  6. package/chunk-EV3TBM7E.js.map +1 -0
  7. package/{chunk-C6LIGJFX.js → chunk-GLIU3J47.js} +354 -128
  8. package/chunk-GLIU3J47.js.map +1 -0
  9. package/{chunk-BDQOBEZ3.js → chunk-GOMF7NWS.js} +2 -2
  10. package/{desktop-launcher-3COY6F6H.js → chunk-GWQV5KKU.js} +193 -13
  11. package/chunk-GWQV5KKU.js.map +1 -0
  12. package/{chunk-5EMEJNVU.js → chunk-LE6XQ3OV.js} +13 -1
  13. package/chunk-LE6XQ3OV.js.map +1 -0
  14. package/{chunk-ALWA4K5L.js → chunk-MSICJEZD.js} +4 -4
  15. package/{chunk-GUIONCNA.js → chunk-WNCXZ6E7.js} +164 -124
  16. package/chunk-WNCXZ6E7.js.map +1 -0
  17. package/{chunk-I7JHF5FE.js → chunk-XHGJHYDC.js} +4 -4
  18. package/chunk-YSYLL57J.js +87 -0
  19. package/chunk-YSYLL57J.js.map +1 -0
  20. package/{companion-JYLQKSFO.js → companion-MGX62L4T.js} +8 -6
  21. package/desktop-installer-page-OJTOKP7V.js +598 -0
  22. package/desktop-installer-page-OJTOKP7V.js.map +1 -0
  23. package/desktop-launcher-HKXP4LRI.js +43 -0
  24. package/desktop-wizard-XIDDAG7L.js +15 -0
  25. package/index.js +29 -20
  26. package/index.js.map +1 -1
  27. package/mcp-server/index.js +49 -1
  28. package/mcp-server/index.js.map +1 -1
  29. package/package.json +1 -1
  30. package/settings-manager-BBNCDDQJ.js +10 -0
  31. package/settings-manager-BBNCDDQJ.js.map +1 -0
  32. package/{src-42DMJB3D.js → src-KWLVQD36.js} +191 -90
  33. package/src-KWLVQD36.js.map +1 -0
  34. package/{vault-resolver-57Q2DVOR.js → vault-resolver-B5P2OUI5.js} +20 -2
  35. package/vault-resolver-B5P2OUI5.js.map +1 -0
  36. package/web/assets/AgentScalarChatInterface.vue-CqGVVIo8.js +13 -0
  37. package/web/assets/AgentTerminalPage-mVD1jsWC.js +1 -0
  38. package/web/assets/AiChatPage-J-JAXhoT.js +1 -0
  39. package/web/assets/AppLayout-6eKmu_TP.css +1 -0
  40. package/web/assets/AppLayout-CsUnvWA0.js +1 -0
  41. package/web/assets/AuditPage-gzMJbY4c.js +1 -0
  42. package/web/assets/CloudAccountPage-CIUmdyoI.js +1 -0
  43. package/web/assets/CloudAccountPage-Cm1ibhZY.js +1 -0
  44. package/web/assets/CloudAccountPage-eoNciq1Q.css +1 -0
  45. package/web/assets/CloudMessagingPage-EV4MwYrk.js +2 -0
  46. package/web/assets/DashboardPage-CrMccWRA.js +1 -0
  47. package/web/assets/DirectoryPickerDialog-Cnr4SkLc.js +1 -0
  48. package/web/assets/DirectoryPickerDialog-D1lQ83i5.css +1 -0
  49. package/web/assets/{EditorIcon-DXYoMZnL.js → EditorIcon-Dlr9ami0.js} +2 -2
  50. package/web/assets/{EnvironmentForm-D3pZuxVn.js → EnvironmentForm-NiG4dzT9.js} +2 -2
  51. package/web/assets/EnvironmentFormPage-TJzOWwS7.js +1 -0
  52. package/web/assets/EnvironmentListPage-oR335kl1.js +1 -0
  53. package/web/assets/KanbanBoardPage-Cta-iCIL.css +1 -0
  54. package/web/assets/KanbanBoardPage-Dol6K6rI.js +4 -0
  55. package/web/assets/KanbanListPage-C2yhMB2L.js +1 -0
  56. package/web/assets/{KanbanListPage-DxJFx6A6.css → KanbanListPage-CEJ9Vluh.css} +1 -1
  57. package/web/assets/LaunchProjectPage-BGIRMKdM.js +1 -0
  58. package/web/assets/LaunchProjectPage-CU2iF25_.css +1 -0
  59. package/web/assets/LaunchServicesPage-9aAno4Gc.css +1 -0
  60. package/web/assets/LaunchServicesPage-DqIG8ZDk.js +1 -0
  61. package/web/assets/LaunchShell-C7RrqA4k.js +1 -0
  62. package/web/assets/LaunchShell-CGtjrl6_.css +1 -0
  63. package/web/assets/LogViewer-BWtCyqa4.js +3 -0
  64. package/web/assets/OrgKeyPrompt-B343sYVi.css +1 -0
  65. package/web/assets/OrgKeyPrompt-IjlZPHOI.js +1 -0
  66. package/web/assets/OrgLogo-B0TayK5W.js +1 -0
  67. package/web/assets/ProcessControls-Bw28Duzs.js +1 -0
  68. package/web/assets/ProcessDetailPage-CVYQJ4aI.js +1 -0
  69. package/web/assets/{ProcessMetrics-CdQc_8Z0.js → ProcessMetrics-D0HzDnGO.js} +3 -3
  70. package/web/assets/ProjectCreateDialog-CLFPf8ds.js +1 -0
  71. package/web/assets/ProjectCreateDialog-UEIYMerY.css +1 -0
  72. package/web/assets/ProjectLocationGate-D68jdBcV.js +1 -0
  73. package/web/assets/ProjectPublishDialog-CDpS6xcQ.css +1 -0
  74. package/web/assets/ProjectPublishDialog-Cvvjeuyq.js +1 -0
  75. package/web/assets/RandomJobTestPage-CuUJfwwb.js +2 -0
  76. package/web/assets/ScenarioEditorPage-Ckq6XNl2.js +14 -0
  77. package/web/assets/SendToChatDialog-4a4_2amD.js +1 -0
  78. package/web/assets/ServiceControlsBar-OC7cDCM7.js +1 -0
  79. package/web/assets/ServiceDetailPage-BMlS1q4i.js +2 -0
  80. package/web/assets/ServiceFormPage-CozmJNy1.js +1 -0
  81. package/web/assets/{SettingsPage-DA7lVKfg.css → SettingsPage-CF548HPl.css} +1 -1
  82. package/web/assets/SettingsPage-CkJQwWCW.js +2063 -0
  83. package/web/assets/UnlockPage-94m6Ap-H.js +1 -0
  84. package/web/assets/VaultMigrationPage-Bj6KgIUi.js +1 -0
  85. package/web/assets/VersionBadge-DjTAz-tn.js +1 -0
  86. package/web/assets/WikiPage-n_vxXevo.js +1 -0
  87. package/web/assets/WikiView-lxEITfCa.js +1 -0
  88. package/web/assets/add-scalar-classes-lFkCrmFv.js +387 -0
  89. package/web/assets/{autocomplete-DobAPPYJ.js → autocomplete-bClqtFV-.js} +3 -3
  90. package/web/assets/{basic-shape-diamond.svg-FbeAPLc-.js → basic-shape-diamond.svg-DFdUK3gN.js} +1 -1
  91. package/web/assets/{basic-shape-hexagon.svg-CtwcdpTe.js → basic-shape-hexagon.svg-BKiT9xxU.js} +1 -1
  92. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DsSs3S2_.js → basic-shape-primary-circle-ellipse-round.svg-tmXcRxRQ.js} +1 -1
  93. package/web/assets/{basic-shape-primary-square-rectangle.svg-CNe1RNx8.js → basic-shape-primary-square-rectangle.svg-C9duFSNc.js} +1 -1
  94. package/web/assets/{basic-shape-shield.svg-DwZMLfah.js → basic-shape-shield.svg-CLzO94DF.js} +1 -1
  95. package/web/assets/{browser-Dz1gvldT.js → browser-BEDlGGfe.js} +1 -1
  96. package/web/assets/{browser-DsZ9HxVm.js → browser-CivlztYP.js} +1 -1
  97. package/web/assets/card-wcTFC8yG.js +32 -0
  98. package/web/assets/{checkbox-DPknldTJ.js → checkbox-TtO_mmrY.js} +2 -2
  99. package/web/assets/{chevronup-D2Lr2GiV.js → chevronup-Cd93cHVj.js} +4 -4
  100. package/web/assets/{chip-Caiakd-N.js → chip-omKmLLWH.js} +2 -2
  101. package/web/assets/client-BKIls6aD.js +24 -0
  102. package/web/assets/cloud-chat.store-Bskr_EXO.js +1 -0
  103. package/web/assets/cloud-client-rcfqjfUK.js +1 -0
  104. package/web/assets/cloud-session-CycNU7YV.js +1 -0
  105. package/web/assets/cloud-session-DiaAeCJI.js +2 -0
  106. package/web/assets/column-DgtEciO-.js +763 -0
  107. package/web/assets/composables-Ce8WccBy.js +1 -0
  108. package/web/assets/{computer-device-desktop-monitor.svg-CwiGN14T.js → computer-device-desktop-monitor.svg-D3YaocxY.js} +1 -1
  109. package/web/assets/{computer-device-desktop.svg-BC2VdXDZ.js → computer-device-desktop.svg-lnn_cyCx.js} +1 -1
  110. package/web/assets/{computer-device-laptop.svg-BOp8AKN6.js → computer-device-laptop.svg-9f5_Ipnq.js} +1 -1
  111. 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
  112. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-_WGKWVtZ.js → computer-device-mobile-phone-android-samsung.svg-CnYqoXt4.js} +1 -1
  113. 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
  114. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-C7-5mdyV.js → computer-device-mobile-phone-iphone-x.svg-CUbRWc7v.js} +1 -1
  115. package/web/assets/{computer-device-mobile-tablet-touch.svg-DiUaSnhU.js → computer-device-mobile-tablet-touch.svg-CBX2kbI1.js} +1 -1
  116. package/web/assets/{computer-device-mobile-tablet.svg-B6nfbYm_.js → computer-device-mobile-tablet.svg-CIn05KEg.js} +1 -1
  117. package/web/assets/{computer-device-network-ethernet-cat6.svg-DwtVKy79.js → computer-device-network-ethernet-cat6.svg-Dj0GRqXd.js} +1 -1
  118. package/web/assets/{computer-device-network-lan-www.svg-vQKfG3Xz.js → computer-device-network-lan-www.svg-D-G7js6t.js} +1 -1
  119. package/web/assets/{computer-device-network-wifi-connection.svg-DhHaOUge.js → computer-device-network-wifi-connection.svg-JnvMwBMA.js} +1 -1
  120. package/web/assets/{computer-device-network-wifi-router.svg-1dQS4k4J.js → computer-device-network-wifi-router.svg--XxSrk_J.js} +1 -1
  121. package/web/assets/{cssMode-CdQL22W5.js → cssMode-C3gHbz_w.js} +1 -1
  122. package/web/assets/{divider-DhYR4BAO.js → divider-eMI33mv1.js} +2 -2
  123. package/web/assets/{docx-preview-D-jP_CCs.js → docx-preview-CTkzTOcl.js} +1 -1
  124. package/web/assets/{ecology-science-erlenmeyer-flask.svg-D76wQVA2.js → ecology-science-erlenmeyer-flask.svg-DrHKX7bH.js} +1 -1
  125. package/web/assets/{fieldset-BtOjs_Hh.js → fieldset-CiIJH8Xe.js} +2 -2
  126. package/web/assets/{freemarker2-BADW9vhy.js → freemarker2-DWxB7Wcd.js} +1 -1
  127. package/web/assets/{handlebars-CwWQD_C8.js → handlebars-CWUdFsNH.js} +1 -1
  128. package/web/assets/{html-y87CEbe3.js → html-DhvF7iHg.js} +1 -1
  129. package/web/assets/{htmlMode-CVagtvVh.js → htmlMode-CIuDa6YW.js} +1 -1
  130. package/web/assets/{image-flash-lightning.svg-OvpKi3a3.js → image-flash-lightning.svg-qFK_1eYx.js} +1 -1
  131. package/web/assets/{image-picture-flower.svg-DLOePozT.js → image-picture-flower.svg-qAmkHnOu.js} +1 -1
  132. package/web/assets/{index-CcIrffU_.js → index-CzSAFmCu.js} +363 -363
  133. package/web/assets/index-D0IPNhsg.css +1 -0
  134. package/web/assets/{interface-alert-exclamation-diamond.svg-4Vk7SoQ1.js → interface-alert-exclamation-diamond.svg-Dugh0ymo.js} +1 -1
  135. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BLAvc4am.js → interface-alert-exclamation-triangle-warning.svg-8neoRFVP.js} +1 -1
  136. package/web/assets/{interface-alert-information-circle.svg-CaAXpDAI.js → interface-alert-information-circle.svg-DM9S7DBv.js} +1 -1
  137. package/web/assets/{interface-award-crown.svg-CW7XG0wx.js → interface-award-crown.svg--68HCcUG.js} +1 -1
  138. package/web/assets/{interface-bookmark.svg-BpLEuOv2.js → interface-bookmark-tag.svg-BESGrlZw.js} +1 -1
  139. package/web/assets/{interface-bookmark-tag.svg-DPWVVeZU.js → interface-bookmark.svg-CVadIwuA.js} +1 -1
  140. package/web/assets/{interface-calendar-date-one.svg-DbBgvI4W.js → interface-calendar-date-one.svg-D9XP9Dv_.js} +1 -1
  141. package/web/assets/{interface-content-book-open-pages.svg-BbsuvPZM.js → interface-content-book-open-pages.svg-DMI3yFmk.js} +1 -1
  142. package/web/assets/{interface-content-book-page.svg-DbRPz1j8.js → interface-content-book-page.svg-BPxSHq3g.js} +1 -1
  143. package/web/assets/{interface-content-file.svg-OJPKABxS.js → interface-content-file.svg-D0Mbjb8x.js} +1 -1
  144. package/web/assets/interface-content-folder.svg-D3wbwhAD.js +1 -0
  145. package/web/assets/{interface-content-folder.svg-3D_5OE_-.js → interface-content-folder.svg-EUO1l7Mn.js} +1 -1
  146. package/web/assets/{interface-copy-clipboard.svg-DqthVh9J.js → interface-copy-clipboard.svg-DI-wp72J.js} +1 -1
  147. package/web/assets/{interface-edit-attachment.svg-BAPCnZ0B.js → interface-edit-attachment.svg-CrWbaWn_.js} +1 -1
  148. package/web/assets/{interface-edit-binocular.svg-BoV39ouF.js → interface-edit-binocular.svg-BzUDq1Il.js} +1 -1
  149. package/web/assets/{interface-edit-magic-wand.svg-Cz36nKVn.js → interface-edit-magic-wand.svg-DaAdEL5x.js} +1 -1
  150. package/web/assets/{interface-edit-tool-paint-roller.svg-DZUQotD5.js → interface-edit-tool-paint-roller.svg-C972BXSM.js} +1 -1
  151. package/web/assets/{interface-edit-tool-pencil.svg-DBf1Y9Tj.js → interface-edit-tool-pencil.svg-47QCYH9f.js} +1 -1
  152. package/web/assets/{interface-favorite-award.svg-B93sRjxf.js → interface-favorite-award.svg-DROP-rzN.js} +1 -1
  153. package/web/assets/{interface-favorite-flag.svg-DKHuT11J.js → interface-favorite-flag.svg-B1gpMdkg.js} +1 -1
  154. package/web/assets/{interface-favorite-heart.svg-Bw5FZQ7d.js → interface-favorite-heart.svg-Dc0MMGJl.js} +1 -1
  155. package/web/assets/{interface-favorite-star.svg-CgLbct_b.js → interface-favorite-star.svg-D6A5KWft.js} +1 -1
  156. package/web/assets/{interface-favorite-stars-sparkles.svg-B7cYS4ef.js → interface-favorite-stars-sparkles.svg-CpEr4y41.js} +1 -1
  157. package/web/assets/{interface-hierarchy-flowchart.svg-zwuaRdWq.js → interface-hierarchy-flowchart.svg-DjvgRFcZ.js} +1 -1
  158. package/web/assets/{interface-home-house.svg-B85yMFCe.js → interface-home-house.svg-BMmVKlSc.js} +1 -1
  159. package/web/assets/{interface-hyperlink.svg-US6b-Svn.js → interface-hyperlink.svg-BewFXeyZ.js} +1 -1
  160. package/web/assets/{interface-lighting-brightness.svg-mZWkhb7f.js → interface-lighting-brightness.svg-B74_Fwt9.js} +1 -1
  161. package/web/assets/{interface-lock-closed.svg-9oHuNwuY.js → interface-lock-closed.svg-B_kTyHSd.js} +1 -1
  162. package/web/assets/{interface-lock-open-unlock.svg-DBetdJny.js → interface-lock-open-unlock.svg-BpmOnQWL.js} +1 -1
  163. package/web/assets/{interface-login-key.svg-BZnZTYd1.js → interface-login-key.svg-CjYpI4bh.js} +1 -1
  164. package/web/assets/{interface-search.svg-CMXAOoam.js → interface-search.svg-FJmFWdB4.js} +1 -1
  165. package/web/assets/{interface-setting-cog.svg-CKckatt7.js → interface-setting-cog.svg-CfzSne-G.js} +1 -1
  166. package/web/assets/{interface-share-megaphone-bullhorn.svg-DH7kVqN-.js → interface-share-megaphone-bullhorn.svg-CIIzDsMB.js} +1 -1
  167. package/web/assets/{interface-share-rocket.svg-BNXcMugi.js → interface-share-rocket.svg-DqTBI7lO.js} +1 -1
  168. package/web/assets/{interface-share-satellite.svg-Bb8t607w.js → interface-share-satellite.svg-nJfwIxpE.js} +1 -1
  169. package/web/assets/{interface-share-space-ship.svg-Dk4rbLtF.js → interface-share-space-ship.svg-hSmFC9Bt.js} +1 -1
  170. package/web/assets/{interface-share.svg-CtX8dq5i.js → interface-share.svg-DW5W5LS6.js} +1 -1
  171. package/web/assets/{interface-signal-square.svg-DmUIlYTd.js → interface-signal-square.svg-CxjWE1n9.js} +1 -1
  172. package/web/assets/{interface-time-clock-circle.svg-D2ZNaXT3.js → interface-time-clock-circle.svg-OliTsm3U.js} +1 -1
  173. package/web/assets/{interface-time-hour-glass.svg-Ddo-8hHe.js → interface-time-hour-glass.svg-Cq5G77ft.js} +1 -1
  174. package/web/assets/{interface-users-multiple.svg-Jh7S0sT4.js → interface-users-multiple.svg-BZxMlLou.js} +1 -1
  175. package/web/assets/{interface-weather-moon.svg-DbdQFgL2.js → interface-weather-moon.svg-lFXrwEyz.js} +1 -1
  176. package/web/assets/{javascript-BVGFyXBk.js → javascript-BVZ1omk1.js} +1 -1
  177. package/web/assets/{jsonMode-vnFlxYl9.js → jsonMode-CiBARvaV.js} +2 -2
  178. package/web/assets/{liquid-DieKMEvN.js → liquid-CUYREU3G.js} +1 -1
  179. package/web/assets/{lspLanguageFeatures-DoeI-8Y7.js → lspLanguageFeatures-BCfkeNgB.js} +3 -3
  180. package/web/assets/{mail-chat-bubble-square.svg-CApdU2ea.js → mail-chat-bubble-square.svg-DbOh-u2f.js} +1 -1
  181. package/web/assets/{mail-send-email-paper-airplane.svg-jjZ0KB32.js → mail-send-email-paper-airplane.svg-Ci3654Ap.js} +1 -1
  182. package/web/assets/{mail-send-envelope.svg-B6Tsoh-8.js → mail-send-envelope.svg-BUCSUoVb.js} +1 -1
  183. package/web/assets/{mdx-BCkszXid.js → mdx-GNBOgT3C.js} +1 -1
  184. package/web/assets/{minus-DfLQX3s2.js → minus-qBqqwoxz.js} +2 -2
  185. package/web/assets/modal-CsKPvO45.js +5 -0
  186. package/web/assets/modal-E9FRG--u.js +1 -0
  187. package/web/assets/{money-cashier-receipt.svg-DM-I8Snr.js → money-cashier-receipt.svg-qOZhZZs2.js} +1 -1
  188. package/web/assets/{money-currency-dollar-pay.svg-CkDRewrV.js → money-currency-dollar-pay.svg-WYlopKIm.js} +1 -1
  189. package/web/assets/{money-graph-arrow-increase.svg-BT4KLHWz.js → money-graph-arrow-increase.svg-DAcyYWIw.js} +1 -1
  190. package/web/assets/{money-graph-bar-chart-increase.svg-EvyIJ3Uu.js → money-graph-bar-chart-increase.svg-Bcjxz1Kd.js} +1 -1
  191. package/web/assets/multiselect-DiGSzibm.js +251 -0
  192. package/web/assets/{nature-ecology-leaf.svg-uZBwXdg9.js → nature-ecology-leaf.svg-d0AKmyxH.js} +1 -1
  193. package/web/assets/{password-D1R5w1qL.js → password-BwMjgK0Q.js} +4 -4
  194. package/web/assets/{phone-telephone.svg-BSvOskIB.js → phone-telephone.svg-BzKK2wbN.js} +1 -1
  195. package/web/assets/{plus-CNGSRnxy.js → plus-D6Rlmwbp.js} +6 -6
  196. package/web/assets/process.store-I5VZVT0x.js +1 -0
  197. package/web/assets/{programming-bug.svg-CLnGs4K-.js → programming-bug.svg-BtSROvd5.js} +1 -1
  198. package/web/assets/{programming-cloud.svg-CxBovXBR.js → programming-cloud.svg-YDPFJdYt.js} +1 -1
  199. package/web/assets/{programming-computer-database-server.svg-C1JmOyio.js → programming-computer-database-server.svg-C_7cgE9Q.js} +1 -1
  200. package/web/assets/{programming-computer-database.svg-BRjyOzP4.js → programming-computer-database.svg-CLw76mik.js} +1 -1
  201. package/web/assets/{programming-module-four-layout.svg-Blwzw6Qz.js → programming-module-four-layout.svg-BsoC5ySI.js} +1 -1
  202. package/web/assets/{programming-module-three.svg-6bkrmWsU.js → programming-module-three.svg-CThoMoAk.js} +1 -1
  203. package/web/assets/{programming-module.svg-CBS9xKxX.js → programming-module.svg-BQ1YjjAj.js} +1 -1
  204. package/web/assets/{programming-script-code.svg-BVhyoAD3.js → programming-script-code.svg-BKT_wilO.js} +1 -1
  205. package/web/assets/project-launch.store-CBnJKGQe.js +1 -0
  206. package/web/assets/project.store-JIcOcKSg.js +1 -0
  207. package/web/assets/{python-CiPYtj_d.js → python-BXwGt-Ip.js} +1 -1
  208. package/web/assets/{radiobutton--KWBHcDP.js → radiobutton-D20sH1UN.js} +3 -3
  209. package/web/assets/{razor-CSoWGP30.js → razor-RXambmP2.js} +1 -1
  210. package/web/assets/router-BXj_oCbf.js +1 -0
  211. package/web/assets/{selectbutton-C0NL5n4w.js → selectbutton-rLcf19Xf.js} +4 -4
  212. package/web/assets/settings-scope-Cy_9OGE1.js +1 -0
  213. package/web/assets/settings.store-DrKeFdgW.js +1 -0
  214. package/web/assets/{shopping-cart.svg-C-8NG_Po.js → shopping-cart.svg-EjTn3XQF.js} +1 -1
  215. package/web/assets/{shopping-gift-present.svg-Bp6q5VzJ.js → shopping-gift-present.svg-AQNlzazh.js} +1 -1
  216. package/web/assets/{shopping-shipping-box-parcel-package.svg-DeWaEIwm.js → shopping-shipping-box-parcel-package.svg-VB9n6UNi.js} +1 -1
  217. package/web/assets/src-ByEHJyfr.js +1 -0
  218. package/web/assets/{src-BHR3l7pa.js → src-CUwD1xPP.js} +35 -35
  219. package/web/assets/src-C_auNJtg.css +1 -0
  220. package/web/assets/{tag-new-circle.svg-CTljXsqE.js → tag-new-circle.svg-BllOd5JW.js} +1 -1
  221. package/web/assets/theme-DuAHBQRP.js +1 -0
  222. package/web/assets/{toggleswitch-d41l5g27.js → toggleswitch-C-88_GnB.js} +2 -2
  223. package/web/assets/{travel-map-earth-globe.svg-BUkcntCp.js → travel-map-earth-globe.svg-ChLDmmU9.js} +1 -1
  224. package/web/assets/trpc-BoKwANhj.js +1 -0
  225. package/web/assets/{tsMode-B2c-rCAa.js → tsMode-CIN3QIw8.js} +6 -6
  226. package/web/assets/{typescript-CmW4u_GQ.js → typescript-wXu_7Eym.js} +1 -1
  227. package/web/assets/useAiChatDrawer-Bs1Gxhn2.js +1 -0
  228. package/web/assets/{useCloudOrg-E4l-99WA.js → useCloudOrg-0AZ58M3V.js} +1 -1
  229. package/web/assets/useEnvVarAutocomplete-BXC_JUF7.js +102 -0
  230. package/web/assets/{useEnvVarAutocomplete-DsxEF6Ya.css → useEnvVarAutocomplete-dxAmKsn7.css} +1 -1
  231. package/web/assets/useProjectCloudOrg-UIfVePy9.js +1 -0
  232. package/web/assets/useServiceUrlHost-BXbIxPaT.js +1 -0
  233. package/web/assets/{xml-BxMqu3hT.js → xml-FTYGqn2R.js} +1 -1
  234. package/web/assets/{yaml-Djx7E3R1.js → yaml-DQEEK2dU.js} +1 -1
  235. package/web/index.html +2 -2
  236. package/agent-manager-2AZVCQRI.js +0 -11
  237. package/chat-SWYI4ENT.js +0 -21
  238. package/chunk-5EMEJNVU.js.map +0 -1
  239. package/chunk-C6LIGJFX.js.map +0 -1
  240. package/chunk-GUIONCNA.js.map +0 -1
  241. package/chunk-ZFELQG4B.js.map +0 -1
  242. package/desktop-launcher-3COY6F6H.js.map +0 -1
  243. package/desktop-wizard-4CYANX2O.js +0 -209
  244. package/desktop-wizard-4CYANX2O.js.map +0 -1
  245. package/settings-manager-J4QBIU3T.js +0 -10
  246. package/src-42DMJB3D.js.map +0 -1
  247. package/web/assets/AgentScalarChatInterface.vue-BGGkpyp3.js +0 -13
  248. package/web/assets/AgentTerminalPage-B8gLray2.js +0 -1
  249. package/web/assets/AiChatPage-BKITsyMx.js +0 -1
  250. package/web/assets/AppLayout-B72S4nTi.css +0 -1
  251. package/web/assets/AppLayout-BYw7v2sp.js +0 -1
  252. package/web/assets/AuditPage-nHTwzyia.js +0 -1
  253. package/web/assets/CloudAccountPage-DYOvfMjD.css +0 -1
  254. package/web/assets/CloudAccountPage-DuaZz2j4.js +0 -1
  255. package/web/assets/CloudAccountPage-XHxI-ixD.js +0 -1
  256. package/web/assets/CloudMessagingPage-B2N5K-Xs.js +0 -2
  257. package/web/assets/DashboardPage-VoWJeWh_.js +0 -1
  258. package/web/assets/DirectoryPickerDialog-B5SuJOhv.js +0 -1
  259. package/web/assets/DirectoryPickerDialog-Ctp1lYoS.css +0 -1
  260. package/web/assets/EnvironmentFormPage-BIXbPTN5.js +0 -1
  261. package/web/assets/EnvironmentListPage-CHa-Ni3w.js +0 -1
  262. package/web/assets/KanbanBoardPage-B46zbE2H.css +0 -1
  263. package/web/assets/KanbanBoardPage-BFTNpm8P.js +0 -4
  264. package/web/assets/KanbanListPage-CYuIrKXH.js +0 -1
  265. package/web/assets/LaunchProjectPage-9hhGBdOh.css +0 -1
  266. package/web/assets/LaunchProjectPage-jy-R3Fiw.js +0 -1
  267. package/web/assets/LaunchServicesPage-BMtm_8yP.css +0 -1
  268. package/web/assets/LaunchServicesPage-DX7nyo36.js +0 -1
  269. package/web/assets/LaunchShell-BHfseuPM.js +0 -1
  270. package/web/assets/LaunchShell-HenrOlHV.css +0 -1
  271. package/web/assets/LogViewer-C-pHXudR.js +0 -3
  272. package/web/assets/OrgKeyPrompt-CrHXZdKL.css +0 -1
  273. package/web/assets/OrgKeyPrompt-OPnK5oPm.js +0 -1
  274. package/web/assets/OrgLogo-Cxa49Tl3.js +0 -1
  275. package/web/assets/ProcessControls-DXDyR6XX.js +0 -1
  276. package/web/assets/ProcessDetailPage-DNKTwgPW.js +0 -1
  277. package/web/assets/RandomJobTestPage-BE8HkgSb.js +0 -2
  278. package/web/assets/ScenarioEditorPage-Coo6ExzZ.js +0 -14
  279. package/web/assets/SendToChatDialog-ClXerpCU.js +0 -1
  280. package/web/assets/ServiceControlsBar-C7HrPjQI.js +0 -1
  281. package/web/assets/ServiceDetailPage-Cxuy0Yix.js +0 -2
  282. package/web/assets/ServiceFormPage-CCOu1h8v.js +0 -1
  283. package/web/assets/SettingsPage-Dt1ViDQe.js +0 -2063
  284. package/web/assets/UnlockPage-C5iEOAKH.js +0 -1
  285. package/web/assets/VaultMigrationPage-CwRWvFY7.js +0 -1
  286. package/web/assets/VersionBadge-Bqb72GXf.js +0 -1
  287. package/web/assets/WikiPage-Bl1jDKKp.js +0 -1
  288. package/web/assets/WikiView-58u6vU3q.js +0 -1
  289. package/web/assets/add-scalar-classes-CT5KQbzH.js +0 -387
  290. package/web/assets/card-46tM5yU0.js +0 -32
  291. package/web/assets/client-KL5c1Dog.js +0 -24
  292. package/web/assets/cloud-chat.store-Belo5SKd.js +0 -1
  293. package/web/assets/cloud-client-Cqa2Udt8.js +0 -1
  294. package/web/assets/cloud-session-56bUtkSL.js +0 -2
  295. package/web/assets/cloud-session-Dqm0C6H5.js +0 -1
  296. package/web/assets/column-DQ53_qc6.js +0 -763
  297. package/web/assets/composables-CHyZa9ag.js +0 -1
  298. package/web/assets/index-CKOtBNaZ.css +0 -1
  299. package/web/assets/interface-content-folder.svg-8mYqkDao.js +0 -1
  300. package/web/assets/modal-CCco27Sn.js +0 -5
  301. package/web/assets/modal-D4J85_wC.js +0 -1
  302. package/web/assets/multiselect-BmjidXlj.js +0 -251
  303. package/web/assets/process.store-p1LqnpY2.js +0 -1
  304. package/web/assets/project-launch.store-BBYtCcv8.js +0 -1
  305. package/web/assets/project.store-D_2v7amt.js +0 -1
  306. package/web/assets/router-CRKT3825.js +0 -1
  307. package/web/assets/settings-scope-DblmUa3N.js +0 -1
  308. package/web/assets/settings.store-DKTQyerJ.js +0 -1
  309. package/web/assets/src-BN5gTC76.css +0 -1
  310. package/web/assets/src-BRLkogf3.js +0 -1
  311. package/web/assets/theme-BZzt_Sgl.js +0 -1
  312. package/web/assets/trpc-Db0Atu8A.js +0 -1
  313. package/web/assets/useAiChatDrawer-0QJJVXul.js +0 -1
  314. package/web/assets/useEnvVarAutocomplete-BDqUWoGr.js +0 -102
  315. package/web/assets/useProjectCatalog-Cxt-hL1H.js +0 -1
  316. package/web/assets/useProjectCloudOrg-CwLTQLIO.js +0 -1
  317. package/web/assets/useServiceUrlHost-VIA3uP5-.js +0 -1
  318. /package/{agent-manager-2AZVCQRI.js.map → agent-manager-NAGIMH2T.js.map} +0 -0
  319. /package/{chat-SWYI4ENT.js.map → chat-Q2UMYXQL.js.map} +0 -0
  320. /package/{chunk-BDQOBEZ3.js.map → chunk-GOMF7NWS.js.map} +0 -0
  321. /package/{chunk-ALWA4K5L.js.map → chunk-MSICJEZD.js.map} +0 -0
  322. /package/{chunk-I7JHF5FE.js.map → chunk-XHGJHYDC.js.map} +0 -0
  323. /package/{companion-JYLQKSFO.js.map → companion-MGX62L4T.js.map} +0 -0
  324. /package/{settings-manager-J4QBIU3T.js.map → desktop-launcher-HKXP4LRI.js.map} +0 -0
  325. /package/{vault-resolver-57Q2DVOR.js.map → desktop-wizard-XIDDAG7L.js.map} +0 -0
  326. /package/web/assets/{abap-BwLGULgU.js → abap-CRsXUZTC.js} +0 -0
  327. /package/web/assets/{apex-BmwhxS2n.js → apex-CN6ZSzwM.js} +0 -0
  328. /package/web/assets/{azcli-7RvE_Zal.js → azcli-ULFzG1xV.js} +0 -0
  329. /package/web/assets/{bat-DRPmS6Na.js → bat-BVH8lwB4.js} +0 -0
  330. /package/web/assets/{bicep-BwfkS7ZV.js → bicep-B8jMqZ8i.js} +0 -0
  331. /package/web/assets/{browser-D3d3061H.js → browser-xa0YgePN.js} +0 -0
  332. /package/web/assets/{cameligo-BJ_mdC8E.js → cameligo-DuuRwBiE.js} +0 -0
  333. /package/web/assets/{clojure-CQKq7DWt.js → clojure-DUpiEmPZ.js} +0 -0
  334. /package/web/assets/{coffee-DJRj2iwd.js → coffee-BO4ou798.js} +0 -0
  335. /package/web/assets/{cpp-BC1yJTUW.js → cpp-CHOtY2DW.js} +0 -0
  336. /package/web/assets/{csharp-D6U2fAAT.js → csharp-D3t5O1XD.js} +0 -0
  337. /package/web/assets/{csp-B2Ue_UmV.js → csp-CJpJWgPE.js} +0 -0
  338. /package/web/assets/{css-CEzlcbMY.js → css-CAeYpQS5.js} +0 -0
  339. /package/web/assets/{cypher-D5Sg38Yj.js → cypher-D9-TC6ep.js} +0 -0
  340. /package/web/assets/{dart-BhjKRv6v.js → dart-CYoMdUUD.js} +0 -0
  341. /package/web/assets/{dockerfile-BnivEbtE.js → dockerfile-B2ffS5e2.js} +0 -0
  342. /package/web/assets/{ecl-TS1StLK1.js → ecl-BL_MLv5o.js} +0 -0
  343. /package/web/assets/{elixir-BX9ta6DO.js → elixir-DTTK5HpM.js} +0 -0
  344. /package/web/assets/{flow9-CoOB42ee.js → flow9-CnqIliGA.js} +0 -0
  345. /package/web/assets/{fsharp-DmQslDFn.js → fsharp-BtsygJkw.js} +0 -0
  346. /package/web/assets/{go-BbEGGooY.js → go-DksUoC0w.js} +0 -0
  347. /package/web/assets/{graphql-E24y5sn9.js → graphql-DCtJGb0Q.js} +0 -0
  348. /package/web/assets/{hcl-pBZphP8G.js → hcl-Vm6MaTNZ.js} +0 -0
  349. /package/web/assets/{ini-BSbRgr25.js → ini-DdyyiZLB.js} +0 -0
  350. /package/web/assets/{java-D8KvzsMp.js → java-D9tw0Sq3.js} +0 -0
  351. /package/web/assets/{julia-BDRytf15.js → julia-DsaDhMSi.js} +0 -0
  352. /package/web/assets/{kotlin-CNcQo-uP.js → kotlin-eMyqSg05.js} +0 -0
  353. /package/web/assets/{less-0HRV-2Rz.js → less-BTExquT2.js} +0 -0
  354. /package/web/assets/{lexon-DdJG3_pW.js → lexon-Btiu1CPR.js} +0 -0
  355. /package/web/assets/{lua-Blq8Mukj.js → lua-uIHSqSt_.js} +0 -0
  356. /package/web/assets/{m3-CXbmzr9W.js → m3-DtY-QwwW.js} +0 -0
  357. /package/web/assets/{markdown-DFIISzT8.js → markdown-DalwAnMR.js} +0 -0
  358. /package/web/assets/{mips-C2XSYglv.js → mips-BocGRfi2.js} +0 -0
  359. /package/web/assets/{msdax-D3Jl6oAY.js → msdax-CQFbyz50.js} +0 -0
  360. /package/web/assets/{mysql-mCqxt_Co.js → mysql-BM8uo0J8.js} +0 -0
  361. /package/web/assets/{objective-c-CUKLr4E9.js → objective-c-H3c5-SZb.js} +0 -0
  362. /package/web/assets/{pascal-BpqDI6Ur.js → pascal-BgiV8eY7.js} +0 -0
  363. /package/web/assets/{pascaligo-BVchPyL4.js → pascaligo-DT9ZcxD2.js} +0 -0
  364. /package/web/assets/{perl-Dgc9v23P.js → perl-B0U4-W-w.js} +0 -0
  365. /package/web/assets/{pgsql-Dk9IX1G_.js → pgsql-B6kZRXs9.js} +0 -0
  366. /package/web/assets/{php-XeFLn3yL.js → php-DG9vCwQM.js} +0 -0
  367. /package/web/assets/{pla-DQMfrdXZ.js → pla-B4Y4wk5I.js} +0 -0
  368. /package/web/assets/{postiats-DiKrdL3K.js → postiats-C_eWfeAP.js} +0 -0
  369. /package/web/assets/{powerquery-Cj9Q91Zv.js → powerquery-DfX2HFDF.js} +0 -0
  370. /package/web/assets/{powershell-DxLElnzU.js → powershell-Bxsmga8Z.js} +0 -0
  371. /package/web/assets/{protobuf-7vT2HdZD.js → protobuf-BjgmCR9H.js} +0 -0
  372. /package/web/assets/{pug-oi96TUbQ.js → pug-ryXuxA3i.js} +0 -0
  373. /package/web/assets/{qsharp-DNr9IwS2.js → qsharp-91Kv1jwy.js} +0 -0
  374. /package/web/assets/{r-C-REi_Zk.js → r-j6OkO-Lp.js} +0 -0
  375. /package/web/assets/{redis-BvOCrLoN.js → redis-B2Usw_gW.js} +0 -0
  376. /package/web/assets/{redshift-jNEw-REz.js → redshift-Bl5n-UlH.js} +0 -0
  377. /package/web/assets/{restructuredtext-B9ET-x7N.js → restructuredtext-IIWeXmeu.js} +0 -0
  378. /package/web/assets/{ruby-BIEBiJDZ.js → ruby-DQH1R4pC.js} +0 -0
  379. /package/web/assets/{rust-BnoIVewm.js → rust-BJi0001n.js} +0 -0
  380. /package/web/assets/{sb-Bwvy9clh.js → sb-C34JQX0H.js} +0 -0
  381. /package/web/assets/{scala-DPv5zS47.js → scala-BqHjuqsC.js} +0 -0
  382. /package/web/assets/{scheme-BQqNVxf_.js → scheme-DIfjDH23.js} +0 -0
  383. /package/web/assets/{scss-Ck1AFDEz.js → scss-MxgEDdb7.js} +0 -0
  384. /package/web/assets/{shell-C4IYs9Z7.js → shell-D_SMEq6l.js} +0 -0
  385. /package/web/assets/{solidity-D3bS77xq.js → solidity-CyBHDO6p.js} +0 -0
  386. /package/web/assets/{sophia-BSTVfueD.js → sophia-8_L-7Xrk.js} +0 -0
  387. /package/web/assets/{sparql-BGcXD7s2.js → sparql-CXxyP-1c.js} +0 -0
  388. /package/web/assets/{sql-CIsSgyam.js → sql-DNd4NFJw.js} +0 -0
  389. /package/web/assets/{st-dV1d_AXx.js → st-DPFJcK-4.js} +0 -0
  390. /package/web/assets/{swift-CK8gXWQn.js → swift-DE_LJ5Ub.js} +0 -0
  391. /package/web/assets/{systemverilog-B9tHBIJU.js → systemverilog-IgPgwLQ7.js} +0 -0
  392. /package/web/assets/{tcl-BgRT60RV.js → tcl-Cr-fmmH0.js} +0 -0
  393. /package/web/assets/{twig-CGkLO4Nl.js → twig-Dd_ODPfV.js} +0 -0
  394. /package/web/assets/{typespec-DMP9WuzC.js → typespec-CeK8X8vB.js} +0 -0
  395. /package/web/assets/{uuid-H0yY5A03.js → uuid-6HQMUkhT.js} +0 -0
  396. /package/web/assets/{vb-DfSbhl3d.js → vb-CyLVxxH6.js} +0 -0
  397. /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