@runeya/runeya 2.0.102 → 2.0.103
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-manager-OWHTBG46.js +9 -0
- package/assets/icon-alert.ico +0 -0
- package/assets/icon-alert.png +0 -0
- package/assets/icon-alert.svg +19 -0
- package/{chat-OXRRBDB3.js → chat-JZ4UQDWV.js} +8 -7
- package/chunk-KY6KYSOU.js +279 -0
- package/chunk-KY6KYSOU.js.map +1 -0
- package/{chunk-PSTMO7EE.js → chunk-NZNIWJDT.js} +18 -16
- package/{chunk-PSTMO7EE.js.map → chunk-NZNIWJDT.js.map} +1 -1
- package/chunk-PH4E5WDN.js +137 -0
- package/chunk-PH4E5WDN.js.map +1 -0
- package/{chunk-BHLCBARP.js → chunk-QIBUMYR6.js} +29 -11
- package/chunk-QIBUMYR6.js.map +1 -0
- package/{chunk-NDO5VFZY.js → chunk-QRMG6GMX.js} +694 -917
- package/chunk-QRMG6GMX.js.map +1 -0
- package/{chunk-BDVQB5RK.js → chunk-UYOWIH4R.js} +23 -21
- package/{chunk-BDVQB5RK.js.map → chunk-UYOWIH4R.js.map} +1 -1
- package/{chunk-F3HKV5AU.js → chunk-Z67WBWKD.js} +7 -5
- package/{chunk-F3HKV5AU.js.map → chunk-Z67WBWKD.js.map} +1 -1
- package/{companion-JQGNL4U7.js → companion-6J6NK7H7.js} +5 -4
- package/{desktop-launcher-FHNURZA7.js → desktop-launcher-N7WRF3LC.js} +11 -17
- package/desktop-launcher-N7WRF3LC.js.map +1 -0
- package/index.js +64 -2
- package/index.js.map +1 -1
- package/instances-command-KZ5UGXOR.js +17 -0
- package/package.json +4 -1
- package/settings-manager-NZV26BC3.js +9 -0
- package/settings-manager-NZV26BC3.js.map +1 -0
- package/{src-HZ2XO6TV.js → src-V7DPPFCF.js} +447 -254
- package/src-V7DPPFCF.js.map +1 -0
- package/tray-TRWZNOUD.js +291 -0
- package/tray-TRWZNOUD.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-CvG5ha3R.js +13 -0
- package/web/assets/AgentTerminalPage-DcGppuzO.js +1 -0
- package/web/assets/AiChatPage-BDr5tG0A.js +1 -0
- package/web/assets/{AppLayout-DeWqCLuK.css → AppLayout-CYQBjQBU.css} +1 -1
- package/web/assets/AppLayout-Dv3ViAk2.js +1 -0
- package/web/assets/AuditPage-Bc2jlgZJ.js +1 -0
- package/web/assets/CloudAccountPage-4BLXSOix.js +1 -0
- package/web/assets/CloudAccountPage-B3MX6DNn.js +1 -0
- package/web/assets/CloudMessagingPage-CVzUalxx.js +2 -0
- package/web/assets/DashboardPage-Bo51pbzt.js +1 -0
- package/web/assets/DirectoryPickerDialog-CIVjWKUm.js +1 -0
- package/web/assets/{EditorIcon-C9XKLhc7.js → EditorIcon-BguaWtZg.js} +2 -2
- package/web/assets/{EnvironmentForm-bS48MK8k.js → EnvironmentForm-D8dq0ffR.js} +2 -2
- package/web/assets/EnvironmentFormPage-d8p3q8Yt.js +1 -0
- package/web/assets/EnvironmentListPage-DWo2lWjE.js +1 -0
- package/web/assets/KanbanBoardPage-DkwIz3J1.js +4 -0
- package/web/assets/KanbanListPage-xIQRLcrS.js +1 -0
- package/web/assets/LaunchProjectPage-CXWixUmf.js +1 -0
- package/web/assets/LaunchServicesPage-nv-chYgX.js +1 -0
- package/web/assets/LogViewer-DLupfjjf.js +3 -0
- package/web/assets/OrgKeyPrompt-DePcB-8f.js +1 -0
- package/web/assets/ProcessControls-D3zTnHb2.js +1 -0
- package/web/assets/ProcessDetailPage-CgVGzRoJ.js +1 -0
- package/web/assets/{ProcessMetrics-CBPR5ozp.js → ProcessMetrics-Dwd5lzqY.js} +2 -2
- package/web/assets/ProjectDetailPage-HR20KyJ3.js +1 -0
- package/web/assets/ProjectListPage-DcH4uTTX.js +1 -0
- package/web/assets/RandomJobTestPage-BYTkVcdE.js +2 -0
- package/web/assets/ScenarioEditorPage-zRxR03Ud.js +14 -0
- package/web/assets/SendToChatDialog-Cm5eKBOb.js +1 -0
- package/web/assets/ServiceControlsBar-oBpAP9yX.js +1 -0
- package/web/assets/ServiceDetailPage-CahBi-or.js +2 -0
- package/web/assets/ServiceFormPage-DfmPM_mI.js +1 -0
- package/web/assets/SettingsPage-CDMXFJ4k.js +2063 -0
- package/web/assets/SettingsPage-Dw6tbcbw.css +1 -0
- package/web/assets/UnlockPage-BUyBEPzQ.js +1 -0
- package/web/assets/VariablesTable-Dc6CyVQW.js +1 -0
- package/web/assets/VaultMigrationPage-BUmzyDXN.js +1 -0
- package/web/assets/VersionBadge-Dx_67FtC.js +1 -0
- package/web/assets/WikiPage-DEMJLDpD.js +1 -0
- package/web/assets/WikiView-CcrQ2ySx.js +1 -0
- package/web/assets/add-scalar-classes-M_EBdf4f.js +387 -0
- package/web/assets/{autocomplete-CtIxw1IN.js → autocomplete-QtPLLzzV.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-BErisM9Y.js → basic-shape-diamond.svg-Dyx8FJkS.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-yC7RoYpa.js → basic-shape-hexagon.svg-1RKdVP3_.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DRmanUIO.js → basic-shape-primary-circle-ellipse-round.svg-CSa69hok.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-DxuoouSj.js → basic-shape-primary-square-rectangle.svg-B9TXktd4.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-Cy_Frn-W.js → basic-shape-shield.svg-BZvKXoiw.js} +1 -1
- package/web/assets/{browser-h0mxWbci.js → browser-CYeKc8Uo.js} +1 -1
- package/web/assets/{browser-Dj3qxJqB.js → browser-VlhbsseI.js} +1 -1
- package/web/assets/card-tEWfv-Op.js +32 -0
- package/web/assets/{checkbox-CTw-YDe_.js → checkbox-CyPqKR6H.js} +3 -3
- package/web/assets/{chip-DwSSTlaC.js → chip-wM0gJ_FI.js} +2 -2
- package/web/assets/client-B919VgbS.js +24 -0
- package/web/assets/cloud-chat.store-C-A9nIqG.js +1 -0
- package/web/assets/cloud-session-g6ewm0UI.js +1 -0
- package/web/assets/column-DihIO4Zd.js +907 -0
- package/web/assets/{computer-device-desktop-monitor.svg-TLZAKrIM.js → computer-device-desktop-monitor.svg-ClbIVuot.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-YRcL_Qxn.js → computer-device-desktop.svg-CXpOovTP.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-CZUEbqra.js → computer-device-laptop.svg-C9sY1wZv.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-CcsmeFGb.js → computer-device-mobile-phone-android-samsung-back.svg-CPWC2QHX.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CXjVvTBT.js → computer-device-mobile-phone-android-samsung.svg-B0H-mnfh.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-BQQXUoZZ.js → computer-device-mobile-phone-iphone-x-back.svg-BbIunxoN.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CG8VbAP-.js → computer-device-mobile-phone-iphone-x.svg-qLGK_oVA.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-DDMUt0S4.js → computer-device-mobile-tablet-touch.svg-BDpuB6SD.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-CBXtF47n.js → computer-device-mobile-tablet.svg-44THWP9E.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-ObjUhwds.js → computer-device-network-ethernet-cat6.svg-tlgWltl_.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-NGYEGuba.js → computer-device-network-lan-www.svg-Bd7Ch4QN.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-CSnNdKGm.js → computer-device-network-wifi-connection.svg-D_XjoY-a.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-CG7iHt_n.js → computer-device-network-wifi-router.svg-BRpuwgUx.js} +1 -1
- package/web/assets/{cssMode-Bclh_xI1.js → cssMode-D0M5mbRd.js} +1 -1
- package/web/assets/{divider-Bb31-CFf.js → divider-gPnMjjpJ.js} +2 -2
- package/web/assets/{docx-preview-seOy1U3d.js → docx-preview-CBPtwrA0.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-B8emvJ_p.js → ecology-science-erlenmeyer-flask.svg-CZ3uUeBT.js} +1 -1
- package/web/assets/{fieldset-Czp1Leik.js → fieldset-BSGgRmpr.js} +2 -2
- package/web/assets/{freemarker2-D87vjb6-.js → freemarker2-BWsK2SIi.js} +1 -1
- package/web/assets/{handlebars-CjY4u0vA.js → handlebars-CHNB1gG0.js} +1 -1
- package/web/assets/{html-C5pOjLe-.js → html-COwA9Dtl.js} +1 -1
- package/web/assets/{htmlMode-CunB4Bjm.js → htmlMode-gZ2_PUDA.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-7dRFt_k5.js → image-flash-lightning.svg-Iiwm_7-K.js} +1 -1
- package/web/assets/{image-picture-flower.svg-ATG6mf9B.js → image-picture-flower.svg-BP9U6YP8.js} +1 -1
- package/web/assets/{index-BMuqGGPP.js → index-mBPGEldp.js} +285 -285
- package/web/assets/{interface-alert-exclamation-diamond.svg-DuAtIVtT.js → interface-alert-exclamation-diamond.svg-BYWgnbUp.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-Bg9-FBLP.js → interface-alert-exclamation-triangle-warning.svg-CWGfXHx_.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-C5etvhA3.js → interface-alert-information-circle.svg-88Bga8qr.js} +1 -1
- package/web/assets/{interface-award-crown.svg-zuAFLs7y.js → interface-award-crown.svg-3hO77oiy.js} +1 -1
- package/web/assets/{interface-bookmark.svg-CfBz0NE3.js → interface-bookmark-tag.svg-DcHwQsr0.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-C3EKMHOq.js → interface-bookmark.svg-SfHcE95h.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-DGYz2Prk.js → interface-calendar-date-one.svg-DdXOM9VZ.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-DGiJpxy1.js → interface-content-book-open-pages.svg-DD7QTDn_.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DydK46P0.js → interface-content-book-page.svg-Dd45mFzB.js} +1 -1
- package/web/assets/{interface-content-file.svg-D0pUOvAN.js → interface-content-file.svg-slPoMF5K.js} +1 -1
- package/web/assets/interface-content-folder.svg-D90zbTLh.js +1 -0
- package/web/assets/{interface-content-folder.svg-DiJ3Pfaa.js → interface-content-folder.svg-cSgXwhRh.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-Dl3aROYy.js → interface-copy-clipboard.svg-DNy0VeWx.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-UmDFMIt5.js → interface-edit-attachment.svg-VyCAm1jc.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-Bp_8Pfer.js → interface-edit-binocular.svg-DA6QB2sn.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-B2A8V7mt.js → interface-edit-magic-wand.svg-D0uagBk7.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-DKjdsVsS.js → interface-edit-tool-paint-roller.svg-ConlubSG.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-DuUybI4h.js → interface-edit-tool-pencil.svg-BgNzCwXf.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-DHeTFQv8.js → interface-favorite-award.svg-MLL88pIy.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-kKzUSQkq.js → interface-favorite-flag.svg-ZhM_9XJZ.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-CqMgA2mm.js → interface-favorite-heart.svg-Cqq1PV9O.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-CuLj8HV6.js → interface-favorite-star.svg-YumblcRD.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-lFQTnGOR.js → interface-favorite-stars-sparkles.svg-BH5BXXOe.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-CBbliSZq.js → interface-hierarchy-flowchart.svg-CEfCPIyC.js} +1 -1
- package/web/assets/{interface-home-house.svg-BoFlxzre.js → interface-home-house.svg-DJE_g94c.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-DcKs1Vcm.js → interface-hyperlink.svg-BFhnDXDD.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-BSNKEyEg.js → interface-lighting-brightness.svg-NwOV0KEv.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-DSP-B9Ze.js → interface-lock-closed.svg-qVkplX0W.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-Bzg-oBHY.js → interface-lock-open-unlock.svg-D18OlPEP.js} +1 -1
- package/web/assets/{interface-login-key.svg-DG61Q1lR.js → interface-login-key.svg-CccXX7_b.js} +1 -1
- package/web/assets/{interface-search.svg-CODjdPxd.js → interface-search.svg-C6ncELaU.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-CgiaBO1E.js → interface-setting-cog.svg-5LrIeBav.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DM0PsgtH.js → interface-share-megaphone-bullhorn.svg-C-qB4VYi.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-B0geTs35.js → interface-share-rocket.svg-Citzuyng.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-v9Q6QwAp.js → interface-share-satellite.svg-BldpdKdo.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-CLdqgzgZ.js → interface-share-space-ship.svg-B_Ni34rB.js} +1 -1
- package/web/assets/{interface-share.svg-Cx3VhLuj.js → interface-share.svg-FAt7Kgad.js} +1 -1
- package/web/assets/{interface-signal-square.svg-By_pQLw8.js → interface-signal-square.svg-DeBP6Pim.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-Co3P-TM3.js → interface-time-clock-circle.svg-dQfNY8BC.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-BYSOzVeD.js → interface-time-hour-glass.svg-ylbFnlwY.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-moFZaev3.js → interface-users-multiple.svg-DXts3WMC.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-DhyTNivv.js → interface-weather-moon.svg-BG6mjCih.js} +1 -1
- package/web/assets/{javascript-B1fZNcy6.js → javascript-C_ENjImO.js} +1 -1
- package/web/assets/{jsonMode-BxZ6OjkS.js → jsonMode-Bt-LEknD.js} +2 -2
- package/web/assets/{liquid-B58z0z3s.js → liquid-CVshgHmY.js} +1 -1
- package/web/assets/{lspLanguageFeatures-VksJLqpV.js → lspLanguageFeatures-D1e-RcOs.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-DU4TDENX.js → mail-chat-bubble-square.svg-RUMLqiUI.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-jk90Puk3.js → mail-send-email-paper-airplane.svg-JDe3yqOH.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-CrEPc3pm.js → mail-send-envelope.svg-CCzWaeO-.js} +1 -1
- package/web/assets/{mdx-l-DSKi30.js → mdx-D9G2-Bj8.js} +1 -1
- package/web/assets/{minus-CjETE6Jb.js → minus-BMxEQL_C.js} +2 -2
- package/web/assets/modal-CZ7zYg5t.js +1 -0
- package/web/assets/modal-CmpFIC5N.js +5 -0
- package/web/assets/{money-cashier-receipt.svg-veUsiwvj.js → money-cashier-receipt.svg-DfbOr89U.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-C5PNkn4j.js → money-currency-dollar-pay.svg-DY7fQ7jz.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-BkCcnTWU.js → money-graph-arrow-increase.svg-jewlEZEL.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-BDiFSuKt.js → money-graph-bar-chart-increase.svg-BChD8dZv.js} +1 -1
- package/web/assets/multiselect-CoRzeHvy.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-CHyv9oDB.js → nature-ecology-leaf.svg-AQimnw3F.js} +1 -1
- package/web/assets/{password-BYosjMhB.js → password-4Ykb_Ejn.js} +4 -4
- package/web/assets/{phone-telephone.svg-Ce1dgyK9.js → phone-telephone.svg-BdkwIhmo.js} +1 -1
- package/web/assets/{plus-CVoE_j-e.js → plus-CYVYZlQL.js} +6 -6
- package/web/assets/process.store-CtXpHndZ.js +1 -0
- package/web/assets/{programming-bug.svg-D87My2Ok.js → programming-bug.svg-DzT817WD.js} +1 -1
- package/web/assets/{programming-cloud.svg-jUe8apKw.js → programming-cloud.svg-eKZD46YP.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-D4etrIBX.js → programming-computer-database-server.svg-BXOhjcQy.js} +1 -1
- package/web/assets/{programming-computer-database.svg-BtfkmLTx.js → programming-computer-database.svg-DUzhimFY.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-BkzsDKDq.js → programming-module-four-layout.svg-CYGX7Rlj.js} +1 -1
- package/web/assets/{programming-module-three.svg-CpzTvjGS.js → programming-module-three.svg-BhQr1m-R.js} +1 -1
- package/web/assets/{programming-module.svg-wyvB3tSR.js → programming-module.svg-Bik697Ne.js} +1 -1
- package/web/assets/{programming-script-code.svg-Dek4khNq.js → programming-script-code.svg-BaTanEvH.js} +1 -1
- package/web/assets/{python-IeHrvMxp.js → python-wDvaXe-V.js} +1 -1
- package/web/assets/{razor-CMgDmoNn.js → razor-C-cEFJP1.js} +1 -1
- package/web/assets/router-CqYmBKhe.js +1 -0
- package/web/assets/settings-scope-DD7SbjFz.js +1 -0
- package/web/assets/settings.store-DcQmvBBv.js +1 -0
- package/web/assets/{shopping-cart.svg-DeBhxyDX.js → shopping-cart.svg-BwUFrGEq.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-Bt0oKBk9.js → shopping-gift-present.svg-Bs4b94QF.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-BEQNmjMi.js → shopping-shipping-box-parcel-package.svg-DhVaYapE.js} +1 -1
- package/web/assets/{src-C3dPv05m.js → src-CpoqK21I.js} +13 -13
- package/web/assets/src-De5rZb3_.js +1 -0
- package/web/assets/src-NB2ZR0ON.js +572 -0
- package/web/assets/tabpanel-DMt8G5AA.js +150 -0
- package/web/assets/{tag-new-circle.svg-B1i0Y1yt.js → tag-new-circle.svg-B4Z8uL1_.js} +1 -1
- package/web/assets/{toggleswitch-CcQEgLiT.js → toggleswitch-CawhRFb7.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-CB5sqhKh.js → travel-map-earth-globe.svg-D0s5cc-W.js} +1 -1
- package/web/assets/trpc-B17uPEkC.js +1 -0
- package/web/assets/{tsMode-DoUs-yH0.js → tsMode-NHDuTjcd.js} +5 -5
- package/web/assets/{typescript-fw9OMJ0N.js → typescript-DGkgFTtn.js} +1 -1
- package/web/assets/useAiChatDrawer-BxE6EYFc.js +1 -0
- package/web/assets/{useCloudOrg-CRpEZ-iE.js → useCloudOrg-BJTjZPZ9.js} +1 -1
- package/web/assets/useProjectCatalog-DifZyVY5.js +1 -0
- package/web/assets/useProjectCloudOrg-EvyyjH6E.js +1 -0
- package/web/assets/{xml-Df6_yGan.js → xml-CJaXEqLW.js} +1 -1
- package/web/assets/{yaml-LMvM57fn.js → yaml-bl8i8xOf.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-SNVPZNLC.js +0 -8
- package/chunk-BHLCBARP.js.map +0 -1
- package/chunk-NDO5VFZY.js.map +0 -1
- package/desktop-launcher-FHNURZA7.js.map +0 -1
- package/settings-manager-YHQ5YHUH.js +0 -8
- package/src-HZ2XO6TV.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-CxmPaQaj.js +0 -13
- package/web/assets/AgentTerminalPage-Bbx4zyQY.js +0 -1
- package/web/assets/AiChatPage-GPPQggxZ.js +0 -1
- package/web/assets/AppLayout-BuwGeA1p.js +0 -1
- package/web/assets/AuditPage-CDsJsoKA.js +0 -1
- package/web/assets/CloudAccountPage-BCP8icYZ.js +0 -1
- package/web/assets/CloudAccountPage-DzpS3_gc.js +0 -1
- package/web/assets/CloudMessagingPage-01hLQzZ5.js +0 -2
- package/web/assets/DashboardPage-CKo-sf8A.js +0 -1
- package/web/assets/DirectoryPickerDialog-B1tSWoOM.js +0 -1
- package/web/assets/EnvironmentFormPage-9yxN-uI3.js +0 -1
- package/web/assets/EnvironmentListPage-BbfptXAU.js +0 -1
- package/web/assets/KanbanBoardPage-BWkqTc1a.js +0 -4
- package/web/assets/KanbanListPage-GxI1nlON.js +0 -1
- package/web/assets/LaunchProjectPage-DKMoGXIC.js +0 -1
- package/web/assets/LaunchServicesPage-6dfxPQMB.js +0 -1
- package/web/assets/LogViewer-DAzGy_T2.js +0 -3
- package/web/assets/OrgKeyPrompt-CQ087D4g.js +0 -1
- package/web/assets/ProcessControls-D8uc4x7M.js +0 -1
- package/web/assets/ProcessDetailPage-BPxLPGeh.js +0 -1
- package/web/assets/ProjectDetailPage-CnZ_CpVU.js +0 -1
- package/web/assets/ProjectListPage-D8Svc5e3.js +0 -1
- package/web/assets/RandomJobTestPage-BdEiEnSi.js +0 -2
- package/web/assets/ScenarioEditorPage-COrL715B.js +0 -14
- package/web/assets/SendToChatDialog-D8YB5RM6.js +0 -1
- package/web/assets/ServiceControlsBar-BKwvqgHw.js +0 -1
- package/web/assets/ServiceDetailPage-BmPRfQN6.js +0 -2
- package/web/assets/ServiceFormPage-rVvnwWkb.js +0 -1
- package/web/assets/SettingsPage-C-OfBHjn.css +0 -1
- package/web/assets/SettingsPage-DmQB6t1_.js +0 -2063
- package/web/assets/UnlockPage-BgVF3XMO.js +0 -1
- package/web/assets/VariablesTable-D4_sssPN.js +0 -1
- package/web/assets/VaultMigrationPage-BRZJnfVg.js +0 -1
- package/web/assets/VersionBadge-Df7iJWvF.js +0 -1
- package/web/assets/WikiPage-UkaH8BqR.js +0 -1
- package/web/assets/WikiView-BQqP4b9A.js +0 -1
- package/web/assets/add-scalar-classes-B9WxxjAm.js +0 -387
- package/web/assets/card-nJdNoKgd.js +0 -32
- package/web/assets/client-DYNnTrNm.js +0 -24
- package/web/assets/cloud-chat.store-_qILavCL.js +0 -1
- package/web/assets/cloud-session-Ml5g5J1-.js +0 -1
- package/web/assets/column-Bc4-F_tF.js +0 -907
- package/web/assets/interface-content-folder.svg-bb6GV0G0.js +0 -1
- package/web/assets/modal-D2-cZ2mf.js +0 -5
- package/web/assets/modal-DmgVDXcS.js +0 -1
- package/web/assets/multiselect-CDBfo7-0.js +0 -251
- package/web/assets/process.store-BsCJ-VuI.js +0 -1
- package/web/assets/router-KIdzwvCZ.js +0 -1
- package/web/assets/settings-scope-D8l1sq9K.js +0 -1
- package/web/assets/settings.store-VVqF8QkO.js +0 -1
- package/web/assets/src-CJFQ3yWc.js +0 -1
- package/web/assets/src-Cgn_TWXn.js +0 -572
- package/web/assets/tabpanel-B8oBjoSG.js +0 -150
- package/web/assets/trpc-B1bTQz_t.js +0 -1
- package/web/assets/useAiChatDrawer-BpR9XWop.js +0 -1
- package/web/assets/useProjectCatalog-mk8A95KQ.js +0 -1
- package/web/assets/useProjectCloudOrg-CKgvcUWI.js +0 -1
- /package/{agent-manager-SNVPZNLC.js.map → agent-manager-OWHTBG46.js.map} +0 -0
- /package/{chat-OXRRBDB3.js.map → chat-JZ4UQDWV.js.map} +0 -0
- /package/{companion-JQGNL4U7.js.map → companion-6J6NK7H7.js.map} +0 -0
- /package/{settings-manager-YHQ5YHUH.js.map → instances-command-KZ5UGXOR.js.map} +0 -0
package/tray-TRWZNOUD.js
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import {
|
|
2
|
+
shortenPath
|
|
3
|
+
} from "./chunk-PH4E5WDN.js";
|
|
4
|
+
|
|
5
|
+
// src/tray.ts
|
|
6
|
+
import { createRequire } from "module";
|
|
7
|
+
import { chmod, stat } from "fs/promises";
|
|
8
|
+
import { dirname, join } from "path";
|
|
9
|
+
function instanceLabel(info) {
|
|
10
|
+
return `${shortenPath(info.cwd)} \u2014 port ${info.port}`;
|
|
11
|
+
}
|
|
12
|
+
function serviceBullet(service) {
|
|
13
|
+
if (service.failed) return "\u26A0";
|
|
14
|
+
return service.running ? "\u25CF" : "\u25CB";
|
|
15
|
+
}
|
|
16
|
+
var SEPARATOR = { title: "<SEPARATOR>", tooltip: "", enabled: false };
|
|
17
|
+
function serviceNode(service) {
|
|
18
|
+
const state = service.failed ? "en \xE9chec" : service.running ? "en cours" : "arr\xEAt\xE9";
|
|
19
|
+
return {
|
|
20
|
+
title: `${serviceBullet(service)} ${service.name}`,
|
|
21
|
+
tooltip: `${service.name} \u2014 ${state}`,
|
|
22
|
+
enabled: true,
|
|
23
|
+
children: [
|
|
24
|
+
{
|
|
25
|
+
title: "Ouvrir",
|
|
26
|
+
tooltip: service.url ?? "Ce service n\u2019expose aucune adresse",
|
|
27
|
+
// Ouvrir un service arrêté mènerait à une page d'erreur : le lien
|
|
28
|
+
// n'existe vraiment que lorsqu'il écoute.
|
|
29
|
+
enabled: service.running && service.url !== null,
|
|
30
|
+
action: { kind: "service-open", id: service.id }
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
title: "D\xE9marrer",
|
|
34
|
+
tooltip: `D\xE9marrer ${service.name}`,
|
|
35
|
+
enabled: !service.running,
|
|
36
|
+
action: { kind: "service-start", id: service.id }
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
title: "Red\xE9marrer",
|
|
40
|
+
tooltip: `Red\xE9marrer ${service.name} avec sa configuration \xE0 jour`,
|
|
41
|
+
enabled: true,
|
|
42
|
+
action: { kind: "service-restart", id: service.id }
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
title: "Arr\xEAter",
|
|
46
|
+
tooltip: `Arr\xEAter ${service.name}`,
|
|
47
|
+
enabled: service.running,
|
|
48
|
+
action: { kind: "service-stop", id: service.id }
|
|
49
|
+
}
|
|
50
|
+
]
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
function buildInstanceMenu(info, services = [], lan) {
|
|
54
|
+
const nodes = [
|
|
55
|
+
{ title: instanceLabel(info), tooltip: `Runeya ${info.version} \u2014 ${info.cwd}`, enabled: false },
|
|
56
|
+
{ title: "Ouvrir", tooltip: info.url, enabled: true, action: { kind: "instance-open" } },
|
|
57
|
+
{ title: "Red\xE9marrer", tooltip: "Relancer cette Runeya avec les m\xEAmes arguments", enabled: true, action: { kind: "instance-restart" } },
|
|
58
|
+
{ title: "Arr\xEAter", tooltip: "Arr\xEAter cette Runeya et ses services", enabled: true, action: { kind: "instance-stop" } }
|
|
59
|
+
];
|
|
60
|
+
nodes.push(SEPARATOR);
|
|
61
|
+
if (services.length === 0) {
|
|
62
|
+
nodes.push({ title: "Aucun service en cours", tooltip: "Rien ne tourne pour cette Runeya", enabled: false });
|
|
63
|
+
} else {
|
|
64
|
+
for (const service of services) nodes.push(serviceNode(service));
|
|
65
|
+
}
|
|
66
|
+
if (lan) {
|
|
67
|
+
nodes.push(SEPARATOR);
|
|
68
|
+
nodes.push({
|
|
69
|
+
title: "R\xE9seau local",
|
|
70
|
+
// Les adresses au survol : c'est ce qu'on cherche juste après avoir
|
|
71
|
+
// activé le mode, et le menu n'a pas la place de les afficher.
|
|
72
|
+
tooltip: lan.enabled ? `Joignable sur ${lan.addresses.join(", ") || "ce r\xE9seau"}` : "Rendre cette Runeya joignable depuis le r\xE9seau local",
|
|
73
|
+
enabled: true,
|
|
74
|
+
checked: lan.enabled,
|
|
75
|
+
action: { kind: "lan-toggle" }
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return nodes;
|
|
79
|
+
}
|
|
80
|
+
function toSystrayItems(nodes) {
|
|
81
|
+
return nodes.map((node) => ({
|
|
82
|
+
title: node.title,
|
|
83
|
+
tooltip: node.tooltip,
|
|
84
|
+
enabled: node.enabled,
|
|
85
|
+
...node.checked === void 0 ? {} : { checked: node.checked },
|
|
86
|
+
...node.action ? { action: node.action } : {},
|
|
87
|
+
...node.children ? { items: toSystrayItems(node.children) } : {}
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
function trayIconFile(platform = process.platform, alert = false) {
|
|
91
|
+
const base = alert ? "icon-alert" : "icon";
|
|
92
|
+
return platform === "win32" ? `${base}.ico` : `${base}.png`;
|
|
93
|
+
}
|
|
94
|
+
function trayUnavailableReason(arch = process.arch, platform = process.platform) {
|
|
95
|
+
if (!["linux", "darwin", "win32"].includes(platform)) {
|
|
96
|
+
return `barre syst\xE8me non prise en charge sur ${platform}`;
|
|
97
|
+
}
|
|
98
|
+
if (arch !== "x64") {
|
|
99
|
+
return `barre syst\xE8me indisponible en ${arch} (ses binaires sont x86_64)`;
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
function trayBinaryName(platform = process.platform) {
|
|
104
|
+
if (platform === "win32") return "tray_windows_release.exe";
|
|
105
|
+
if (platform === "darwin") return "tray_darwin_release";
|
|
106
|
+
return "tray_linux_release";
|
|
107
|
+
}
|
|
108
|
+
async function ensureTrayBinaryExecutable(resolveModule, platform = process.platform) {
|
|
109
|
+
if (platform === "win32") return;
|
|
110
|
+
try {
|
|
111
|
+
const entry = resolveModule("systray2");
|
|
112
|
+
const binary = join(dirname(entry), "traybin", trayBinaryName(platform));
|
|
113
|
+
const { mode } = await stat(binary);
|
|
114
|
+
if ((mode & 73) === 73) return;
|
|
115
|
+
await chmod(binary, mode | 493);
|
|
116
|
+
} catch {
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
function resolveSysTrayCtor(loaded) {
|
|
120
|
+
let candidate = loaded;
|
|
121
|
+
for (let depth = 0; depth < 3; depth += 1) {
|
|
122
|
+
if (typeof candidate === "function") return candidate;
|
|
123
|
+
if (candidate && typeof candidate === "object" && "default" in candidate) {
|
|
124
|
+
candidate = candidate.default;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
throw new Error("systray2 n\u2019expose pas de constructeur exploitable");
|
|
130
|
+
}
|
|
131
|
+
var TRAY_COALESCE_MS = 150;
|
|
132
|
+
async function applyTrayAction(action, deps) {
|
|
133
|
+
try {
|
|
134
|
+
switch (action.kind) {
|
|
135
|
+
case "instance-open":
|
|
136
|
+
await deps.openUrl(deps.info.url);
|
|
137
|
+
return false;
|
|
138
|
+
case "instance-restart":
|
|
139
|
+
await deps.restart();
|
|
140
|
+
return false;
|
|
141
|
+
case "instance-stop":
|
|
142
|
+
deps.stop();
|
|
143
|
+
return false;
|
|
144
|
+
case "service-open": {
|
|
145
|
+
const service = (await deps.listServices()).find((s) => s.id === action.id);
|
|
146
|
+
if (!service?.url) {
|
|
147
|
+
deps.warn(`[tray] ${action.id} n\u2019expose aucune adresse`);
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
await deps.openUrl(service.url);
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
case "service-start":
|
|
154
|
+
await deps.startService(action.id);
|
|
155
|
+
return false;
|
|
156
|
+
case "service-stop":
|
|
157
|
+
await deps.stopService(action.id);
|
|
158
|
+
return false;
|
|
159
|
+
case "service-restart":
|
|
160
|
+
await deps.restartService(action.id);
|
|
161
|
+
return false;
|
|
162
|
+
case "lan-toggle": {
|
|
163
|
+
if (!deps.lan) return false;
|
|
164
|
+
await deps.lan.toggle(!deps.lan.read().enabled);
|
|
165
|
+
return true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
} catch (err) {
|
|
169
|
+
deps.warn(`[tray] ${err.message}`);
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
async function startInstanceTray(deps) {
|
|
174
|
+
const reason = trayUnavailableReason();
|
|
175
|
+
if (reason) {
|
|
176
|
+
deps.warn(`[tray] ${reason}`);
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
let SysTray;
|
|
180
|
+
try {
|
|
181
|
+
SysTray = resolveSysTrayCtor(await (deps.loadSysTray ?? (() => import("systray2")))());
|
|
182
|
+
} catch {
|
|
183
|
+
deps.warn("[tray] d\xE9pendance optionnelle \xAB systray2 \xBB absente \u2014 pas d\u2019ic\xF4ne (\xAB runeya instances \xBB liste vos Runeya)");
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
await ensureTrayBinaryExecutable(deps.resolveModule ?? createRequire(import.meta.url).resolve);
|
|
187
|
+
const traceMenu = (menu) => {
|
|
188
|
+
if (process.env["RUNEYA_DEBUG"] !== "1") return;
|
|
189
|
+
const items = menu["items"];
|
|
190
|
+
deps.warn(`[tray] menu : ${items.map((i) => i.title).join(" | ")}`);
|
|
191
|
+
};
|
|
192
|
+
const menuFor = async () => {
|
|
193
|
+
let services = [];
|
|
194
|
+
try {
|
|
195
|
+
services = await deps.listServices();
|
|
196
|
+
} catch (err) {
|
|
197
|
+
deps.warn(`[tray] services illisibles : ${err.message}`);
|
|
198
|
+
}
|
|
199
|
+
const alert = services.some((s) => s.failed);
|
|
200
|
+
const menu = {
|
|
201
|
+
icon: join(deps.assetsDir, trayIconFile(process.platform, alert)),
|
|
202
|
+
isTemplateIcon: process.platform === "darwin",
|
|
203
|
+
title: "",
|
|
204
|
+
tooltip: `Runeya \u2014 ${instanceLabel(deps.info)}`,
|
|
205
|
+
items: toSystrayItems(buildInstanceMenu(deps.info, services, deps.lan?.read()))
|
|
206
|
+
};
|
|
207
|
+
traceMenu(menu);
|
|
208
|
+
return menu;
|
|
209
|
+
};
|
|
210
|
+
let current = null;
|
|
211
|
+
let stopped = false;
|
|
212
|
+
let drawing = false;
|
|
213
|
+
let pending = null;
|
|
214
|
+
const retire = async (tray) => {
|
|
215
|
+
try {
|
|
216
|
+
await tray.kill(false);
|
|
217
|
+
} catch {
|
|
218
|
+
}
|
|
219
|
+
};
|
|
220
|
+
const draw = async () => {
|
|
221
|
+
if (stopped || drawing) return false;
|
|
222
|
+
drawing = true;
|
|
223
|
+
try {
|
|
224
|
+
let next;
|
|
225
|
+
try {
|
|
226
|
+
next = new SysTray({ menu: await menuFor(), debug: false, copyDir: false });
|
|
227
|
+
await next.ready();
|
|
228
|
+
} catch (err) {
|
|
229
|
+
deps.warn(`[tray] ic\xF4ne non affich\xE9e : ${err.message}`);
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
next.onError((err) => deps.warn(`[tray] ${err.message}`));
|
|
233
|
+
next.onClick((event) => {
|
|
234
|
+
const action = event.item?.action;
|
|
235
|
+
if (!action) return;
|
|
236
|
+
void applyTrayAction(action, deps).then((redrawNow) => {
|
|
237
|
+
if (redrawNow) scheduleDraw();
|
|
238
|
+
});
|
|
239
|
+
});
|
|
240
|
+
const previous = current;
|
|
241
|
+
current = next;
|
|
242
|
+
if (previous) await retire(previous);
|
|
243
|
+
if (stopped) {
|
|
244
|
+
current = null;
|
|
245
|
+
await retire(next);
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
return true;
|
|
249
|
+
} finally {
|
|
250
|
+
drawing = false;
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
const scheduleDraw = () => {
|
|
254
|
+
if (stopped) return;
|
|
255
|
+
if (pending) clearTimeout(pending);
|
|
256
|
+
pending = setTimeout(() => {
|
|
257
|
+
pending = null;
|
|
258
|
+
void draw();
|
|
259
|
+
}, TRAY_COALESCE_MS);
|
|
260
|
+
pending.unref?.();
|
|
261
|
+
};
|
|
262
|
+
const unsubscribe = deps.onServicesChanged(scheduleDraw);
|
|
263
|
+
if (!await draw()) {
|
|
264
|
+
unsubscribe();
|
|
265
|
+
return null;
|
|
266
|
+
}
|
|
267
|
+
return {
|
|
268
|
+
stop: async () => {
|
|
269
|
+
stopped = true;
|
|
270
|
+
if (pending) clearTimeout(pending);
|
|
271
|
+
unsubscribe();
|
|
272
|
+
const last = current;
|
|
273
|
+
current = null;
|
|
274
|
+
if (last) await retire(last);
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
export {
|
|
279
|
+
applyTrayAction,
|
|
280
|
+
buildInstanceMenu,
|
|
281
|
+
ensureTrayBinaryExecutable,
|
|
282
|
+
instanceLabel,
|
|
283
|
+
resolveSysTrayCtor,
|
|
284
|
+
serviceBullet,
|
|
285
|
+
startInstanceTray,
|
|
286
|
+
toSystrayItems,
|
|
287
|
+
trayBinaryName,
|
|
288
|
+
trayIconFile,
|
|
289
|
+
trayUnavailableReason
|
|
290
|
+
};
|
|
291
|
+
//# sourceMappingURL=tray-TRWZNOUD.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tray.ts"],"sourcesContent":["/**\n * La barre système d'une instance.\n *\n * Une Runeya qui démarre pose son icône, et la retire en s'arrêtant : une\n * icône par Runeya en cours, chacune pilotant la sienne. C'est le pendant\n * visuel du registre — `runeya instances` liste la même chose dans un\n * terminal, y compris là où la barre système n'existe pas.\n *\n * Elle ne lit pas le registre : elle décrit l'instance qui l'héberge — sa\n * propre présence est la preuve que celle-ci tourne — ainsi que les services\n * de la pile, leur état et leurs adresses.\n *\n * Rien n'est sondé. L'état des services arrive par les événements que le pont\n * de l'agent relaie déjà (`process:status`) et par ceux du magasin de services;\n * le menu se redessine sur ces signaux, et l'icône passe en alerte dès qu'un\n * service tombe.\n *\n * ── Pourquoi une dépendance optionnelle ────────────────────────────────────\n * Node n'a pas de barre système, et il n'existe pas d'implémentation pure-JS.\n * `systray2` embarque des binaires précompilés (aucun script d'install, ce que\n * la contrainte npm 12 du dépôt impose), mais ils sont **x86_64 uniquement** :\n * ni Apple Silicon sans Rosetta, ni Linux/Windows arm64. Elle est donc en\n * `optionalDependencies` et chargée en `import()` gardé.\n *\n * **Rien ici ne doit empêcher une Runeya de démarrer ni de s'arrêter.** Une\n * machine sans bureau, une architecture sans binaire, un paquet non installé :\n * l'icône manque, et c'est tout. Aucune erreur ne remonte à l'appelant.\n */\nimport { createRequire } from 'node:module';\nimport { chmod, stat } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport { shortenPath } from './instances-command.js';\n\n/** Ce qu'un clic déclenche. L'instance visée est toujours celle qui héberge. */\nexport type TrayAction =\n | { kind: 'instance-open' | 'instance-restart' | 'instance-stop' }\n | { kind: 'service-open' | 'service-start' | 'service-stop' | 'service-restart'; id: string }\n | { kind: 'lan-toggle' };\n\n/**\n * Le menu, indépendant de la bibliothèque qui le dessine.\n *\n * Ce modèle existe pour que la forme du menu soit vérifiable sans binaire ni\n * barre système — et pour qu'un remplacement de `systray2` (par des binaires\n * maison couvrant arm64, par exemple) n'ait à réécrire que `toSystrayItems`.\n */\nexport type TrayNode = {\n title: string;\n tooltip: string;\n enabled: boolean;\n /** Absente sur une ligne d'état ou un séparateur : cliquer ne fait rien. */\n action?: TrayAction;\n children?: TrayNode[];\n /** Coche à gauche du libellé — pour un réglage qui a deux positions. */\n checked?: boolean;\n};\n\n/** L'instance décrite par l'icône. */\nexport type InstanceTrayInfo = {\n /** Le dossier de la pile, tel qu'il s'affiche. */\n cwd: string;\n port: number;\n version: string;\n /** L'adresse à ouvrir — calculée par le CLI, qui seul sait sur quoi il écoute. */\n url: string;\n};\n\n/** Un service de la pile, tel que le menu a besoin de le connaître. */\nexport type TrayService = {\n id: string;\n name: string;\n running: boolean;\n failed: boolean;\n url: string | null;\n};\n\n/** Ce que l'icône affiche : de quoi reconnaître SA Runeya parmi les autres. */\nexport function instanceLabel(info: InstanceTrayInfo): string {\n return `${shortenPath(info.cwd)} — port ${info.port}`;\n}\n\n/**\n * L'état d'un service, en un caractère.\n *\n * Un menu n'a pas de couleur : la pastille est le seul moyen de distinguer\n * d'un coup d'œil ce qui tourne de ce qui est tombé.\n */\nexport function serviceBullet(service: Pick<TrayService, 'running' | 'failed'>): string {\n if (service.failed) return '⚠';\n return service.running ? '●' : '○';\n}\n\n/** `systray2` reconnaît ce titre comme une ligne de séparation. */\nconst SEPARATOR: TrayNode = { title: '<SEPARATOR>', tooltip: '', enabled: false };\n\n/**\n * Le sous-menu d'un service.\n *\n * Les quatre gestes sont toujours présents, activés ou non selon l'état : un\n * menu dont les lignes apparaissent et disparaissent se relit à chaque\n * ouverture, alors qu'un menu stable se parcourt de mémoire.\n */\nfunction serviceNode(service: TrayService): TrayNode {\n const state = service.failed ? 'en échec' : service.running ? 'en cours' : 'arrêté';\n return {\n title: `${serviceBullet(service)} ${service.name}`,\n tooltip: `${service.name} — ${state}`,\n enabled: true,\n children: [\n {\n title: 'Ouvrir',\n tooltip: service.url ?? 'Ce service n’expose aucune adresse',\n // Ouvrir un service arrêté mènerait à une page d'erreur : le lien\n // n'existe vraiment que lorsqu'il écoute.\n enabled: service.running && service.url !== null,\n action: { kind: 'service-open', id: service.id },\n },\n {\n title: 'Démarrer',\n tooltip: `Démarrer ${service.name}`,\n enabled: !service.running,\n action: { kind: 'service-start', id: service.id },\n },\n {\n title: 'Redémarrer',\n tooltip: `Redémarrer ${service.name} avec sa configuration à jour`,\n enabled: true,\n action: { kind: 'service-restart', id: service.id },\n },\n {\n title: 'Arrêter',\n tooltip: `Arrêter ${service.name}`,\n enabled: service.running,\n action: { kind: 'service-stop', id: service.id },\n },\n ],\n };\n}\n\n/** Ce que le menu montre de l'état du réseau local. */\nexport type TrayLanState = { enabled: boolean; addresses: string[] };\n\n/**\n * Le menu complet : l'instance, ses services, le réseau local.\n *\n * L'instance vient en premier parce que c'est ce que l'icône représente ; les\n * services suivent, parce que c'est ce qu'on vient y chercher le plus souvent.\n */\nexport function buildInstanceMenu(\n info: InstanceTrayInfo,\n services: TrayService[] = [],\n lan?: TrayLanState,\n): TrayNode[] {\n const nodes: TrayNode[] = [\n { title: instanceLabel(info), tooltip: `Runeya ${info.version} — ${info.cwd}`, enabled: false },\n { title: 'Ouvrir', tooltip: info.url, enabled: true, action: { kind: 'instance-open' } },\n { title: 'Redémarrer', tooltip: 'Relancer cette Runeya avec les mêmes arguments', enabled: true, action: { kind: 'instance-restart' } },\n { title: 'Arrêter', tooltip: 'Arrêter cette Runeya et ses services', enabled: true, action: { kind: 'instance-stop' } },\n ];\n\n nodes.push(SEPARATOR);\n if (services.length === 0) {\n // « en cours » plutôt que « aucun » : sans projet ouvert, le menu ne\n // montre que ce qui tourne, et la machine peut très bien en avoir cent\n // configurés à côté. Vrai dans les deux cas, trompeur dans aucun.\n nodes.push({ title: 'Aucun service en cours', tooltip: 'Rien ne tourne pour cette Runeya', enabled: false });\n } else {\n for (const service of services) nodes.push(serviceNode(service));\n }\n\n if (lan) {\n nodes.push(SEPARATOR);\n nodes.push({\n title: 'Réseau local',\n // Les adresses au survol : c'est ce qu'on cherche juste après avoir\n // activé le mode, et le menu n'a pas la place de les afficher.\n tooltip: lan.enabled\n ? `Joignable sur ${lan.addresses.join(', ') || 'ce réseau'}`\n : 'Rendre cette Runeya joignable depuis le réseau local',\n enabled: true,\n checked: lan.enabled,\n action: { kind: 'lan-toggle' },\n });\n }\n\n return nodes;\n}\n\n/**\n * Traduit le menu pour `systray2`.\n *\n * L'action est posée sur l'objet lui-même : la bibliothèque garde une table de\n * ses propres identifiants vers les objets reçus et rend l'objet d'origine au\n * clic, champs personnalisés compris. Rien à retrouver, donc, et aucun indice\n * à faire correspondre.\n */\nexport type SystrayItem = {\n title: string;\n tooltip: string;\n enabled: boolean;\n checked?: boolean;\n items?: SystrayItem[];\n action?: TrayAction;\n};\n\nexport function toSystrayItems(nodes: TrayNode[]): SystrayItem[] {\n return nodes.map((node) => ({\n title: node.title,\n tooltip: node.tooltip,\n enabled: node.enabled,\n ...(node.checked === undefined ? {} : { checked: node.checked }),\n ...(node.action ? { action: node.action } : {}),\n ...(node.children ? { items: toSystrayItems(node.children) } : {}),\n }));\n}\n\n/** Le nom d'icône que la plateforme attend : ICO sous Windows, PNG ailleurs. */\nexport function trayIconFile(platform: NodeJS.Platform = process.platform, alert = false): string {\n const base = alert ? 'icon-alert' : 'icon';\n return platform === 'win32' ? `${base}.ico` : `${base}.png`;\n}\n\n/**\n * Pourquoi la barre système ne peut pas exister ici, ou `null` si rien ne s'y\n * oppose.\n *\n * Vérifié avant de charger quoi que ce soit : les binaires de `systray2` sont\n * x86_64, et les lancer ailleurs échoue par un « Exec format error » que\n * personne ne relie à son architecture.\n */\nexport function trayUnavailableReason(\n arch: string = process.arch,\n platform: NodeJS.Platform = process.platform,\n): string | null {\n if (!['linux', 'darwin', 'win32'].includes(platform)) {\n return `barre système non prise en charge sur ${platform}`;\n }\n // Rosetta traduit x64 pour macOS, et se signale par `process.arch === 'x64'`\n // dans le process traduit : un arm64 vu ici est un arm64 non traduit.\n if (arch !== 'x64') {\n return `barre système indisponible en ${arch} (ses binaires sont x86_64)`;\n }\n return null;\n}\n\n/** Le binaire que `systray2` lance pour cette plateforme. */\nexport function trayBinaryName(platform: NodeJS.Platform = process.platform): string {\n if (platform === 'win32') return 'tray_windows_release.exe';\n if (platform === 'darwin') return 'tray_darwin_release';\n return 'tray_linux_release';\n}\n\n/**\n * Rend exécutable le binaire de `systray2`, que le paquet ne livre pas ainsi.\n *\n * Contournement d'un défaut amont : le tarball npm stocke ses binaires en\n * `rw-r--r--`, et le `fs.chmod(bin, '+x')` de la bibliothèque ne corrige rien —\n * `chmod` attend un mode octal, pas une notation symbolique, si bien que\n * `'+x'` s'évalue en NaN. Le lancement échoue alors sur un EACCES qui n'a\n * aucun rapport apparent avec les permissions d'un fichier livré par npm.\n *\n * Au mieux : une permission qu'on ne peut pas poser (installation en lecture\n * seule) laisse `systray2` échouer comme avant, et ce n'est pas à cette\n * fonction de le rapporter.\n */\nexport async function ensureTrayBinaryExecutable(\n resolveModule: (specifier: string) => string,\n platform: NodeJS.Platform = process.platform,\n): Promise<void> {\n if (platform === 'win32') return;\n try {\n // Le point d'entrée du paquet, dont `traybin/` est voisin.\n const entry = resolveModule('systray2');\n const binary = join(dirname(entry), 'traybin', trayBinaryName(platform));\n const { mode } = await stat(binary);\n // Ne réécrit que si le bit manque : sur une installation partagée, un\n // chmod inutile peut échouer là où la lecture réussissait.\n if ((mode & 0o111) === 0o111) return;\n await chmod(binary, mode | 0o755);\n } catch {\n // Best effort, délibérément : l'échec réel se dira au démarrage du tray.\n }\n}\n\n/**\n * La part de `systray2` dont ce module se sert.\n *\n * Décrite ici plutôt qu'importée : le paquet est optionnel, et un `import type`\n * depuis un module absent à la compilation ferait échouer le typecheck sur une\n * machine où il n'a pas pu s'installer.\n *\n * `sendAction` en est délibérément absent — voir `startInstanceTray` : sa mise\n * à jour de menu ne peut pas être utilisée sans casser les clics.\n */\ntype SysTrayLike = {\n ready(): Promise<void>;\n onClick(listener: (event: { item?: { action?: TrayAction } }) => void): unknown;\n onError(listener: (err: Error) => void): void;\n kill(exitNode?: boolean): Promise<void>;\n};\ntype SysTrayCtor = new (conf: Record<string, unknown>) => SysTrayLike;\n\n/**\n * Déniche le constructeur dans ce que rend `import('systray2')`.\n *\n * `systray2` est du CommonJS transpilé depuis TypeScript : il pose son\n * constructeur sur `exports.default`, et l'interop ESM de Node emballe le tout\n * une fois de plus. Le constructeur se trouve donc sous `.default.default`, et\n * un `mod.default` naïf rend un objet — d'où un « SysTray is not a\n * constructor » que ni le typage ni la compilation ne voient venir, seulement\n * l'exécution. On descend donc les `default` jusqu'à trouver une fonction.\n */\nexport function resolveSysTrayCtor(loaded: unknown): SysTrayCtor {\n let candidate: unknown = loaded;\n for (let depth = 0; depth < 3; depth += 1) {\n if (typeof candidate === 'function') return candidate as SysTrayCtor;\n if (candidate && typeof candidate === 'object' && 'default' in candidate) {\n candidate = (candidate as { default: unknown }).default;\n continue;\n }\n break;\n }\n throw new Error('systray2 n’expose pas de constructeur exploitable');\n}\n\nexport type InstanceTrayDeps = {\n info: InstanceTrayInfo;\n /** Dossier des icônes livrées avec le CLI. */\n assetsDir: string;\n openUrl: (url: string) => Promise<unknown>;\n /** Redémarrer cette instance — le CLI sait comment se relancer lui-même. */\n restart: () => Promise<unknown>;\n /** Arrêter cette instance, par le même chemin que Ctrl+C. */\n stop: () => void;\n /** Les services de la pile et leur état. */\n listServices: () => Promise<TrayService[]>;\n startService: (id: string) => Promise<unknown>;\n stopService: (id: string) => Promise<unknown>;\n restartService: (id: string) => Promise<unknown>;\n /** Prévient quand la liste a pu changer ; rend de quoi se désabonner. */\n onServicesChanged: (listener: () => void) => () => void;\n /** L'état du réseau local, et sa bascule. Absent : la ligne n'apparaît pas. */\n lan?: {\n read: () => TrayLanState;\n toggle: (enabled: boolean) => Promise<unknown>;\n };\n /** Pour les traces : jamais fatal, jamais bloquant. */\n warn: (message: string) => void;\n /** Injectés pour les tests ; par défaut, la dépendance optionnelle. */\n loadSysTray?: () => Promise<unknown>;\n resolveModule?: (specifier: string) => string;\n};\n\n/** De quoi retirer l'icône quand l'instance s'arrête. */\nexport type InstanceTrayHandle = { stop: () => Promise<void> };\n\n/**\n * Le temps laissé aux événements de se calmer avant de redessiner.\n *\n * Démarrer une pile fait changer dix services en rafale ; sans ce délai, le\n * menu serait reconstruit dix fois pour un seul résultat visible. Ce n'est pas\n * un sondage : rien ne se déclenche tant que rien ne bouge.\n */\nconst TRAY_COALESCE_MS = 150;\n\n/**\n * Applique un clic. Extrait du runtime pour être vérifiable sans barre système.\n *\n * Rend `true` quand le menu doit être redessiné tout de suite. Les gestes sur\n * les services n'en ont pas besoin : ils provoquent un événement d'état, qui\n * redessine de lui-même.\n */\nexport async function applyTrayAction(action: TrayAction, deps: InstanceTrayDeps): Promise<boolean> {\n try {\n switch (action.kind) {\n case 'instance-open':\n await deps.openUrl(deps.info.url);\n return false;\n case 'instance-restart':\n await deps.restart();\n return false;\n case 'instance-stop':\n deps.stop();\n return false;\n case 'service-open': {\n const service = (await deps.listServices()).find((s) => s.id === action.id);\n if (!service?.url) {\n deps.warn(`[tray] ${action.id} n’expose aucune adresse`);\n return false;\n }\n await deps.openUrl(service.url);\n return false;\n }\n case 'service-start':\n await deps.startService(action.id);\n return false;\n case 'service-stop':\n await deps.stopService(action.id);\n return false;\n case 'service-restart':\n await deps.restartService(action.id);\n return false;\n case 'lan-toggle': {\n if (!deps.lan) return false;\n await deps.lan.toggle(!deps.lan.read().enabled);\n // Aucun événement ne suit une bascule de réseau : c'est le seul geste\n // qui doit redessiner lui-même, sinon la coche resterait en arrière.\n return true;\n }\n }\n } catch (err) {\n deps.warn(`[tray] ${(err as Error).message}`);\n // Un geste qui échoue laisse l'état inchangé côté serveur, mais le menu a\n // pu être dessiné sur une hypothèse : on le redessine pour en sortir.\n return true;\n }\n}\n\n/**\n * Pose l'icône de cette instance, ou rend `null` si c'est impossible.\n *\n * `null` n'est pas un échec à rapporter bruyamment : sur un serveur sans\n * bureau, la barre système n'a simplement pas lieu d'être, et Runeya n'a aucune\n * raison de s'en plaindre à chaque démarrage. La raison est tracée, pas criée.\n *\n * ── Pourquoi l'icône est REFAITE à chaque changement ───────────────────────\n * `systray2` sait mettre un menu à jour (`sendAction('update-menu')`), mais\n * n'attribue ses identifiants internes qu'au constructeur. Les items envoyés\n * ensuite n'en portent aucun, et son `onClick` fait\n * `Object.assign(internalIdMap.get(action.__id), action.item)` : au mieux il\n * retrouve un objet du menu PRÉCÉDENT — cliquer « Arrêter » sur un service\n * exécuterait le geste d'un autre —, au pire `undefined`, et l'assignation\n * lève dans un écouteur d'événements. Recréer coûte un processus de plus le\n * temps d'un changement d'état ; se tromper de service coûte un service arrêté\n * à la place d'un autre.\n */\nexport async function startInstanceTray(deps: InstanceTrayDeps): Promise<InstanceTrayHandle | null> {\n const reason = trayUnavailableReason();\n if (reason) {\n deps.warn(`[tray] ${reason}`);\n return null;\n }\n\n let SysTray: SysTrayCtor;\n try {\n SysTray = resolveSysTrayCtor(await (deps.loadSysTray ?? (() => import('systray2')))());\n } catch {\n deps.warn('[tray] dépendance optionnelle « systray2 » absente — pas d’icône (« runeya instances » liste vos Runeya)');\n return null;\n }\n\n // Avant toute construction : sans le bit d'exécution, `new SysTray()` échoue\n // sur un EACCES opaque. Voir `ensureTrayBinaryExecutable`.\n await ensureTrayBinaryExecutable(deps.resolveModule ?? createRequire(import.meta.url).resolve);\n\n /**\n * Ce que la barre système a réellement reçu, sous `runeya --debug`.\n *\n * Un menu ne se relit pas de l'extérieur : sans cette trace, un menu vide ou\n * périmé ne se diagnostique qu'en devinant. Le mode debug de `systray2` ne\n * peut pas servir à ça — il fait chercher un binaire « tray_linux » que le\n * paquet npm ne contient pas, et l'icône disparaît sur un ENOENT.\n */\n const traceMenu = (menu: Record<string, unknown>): void => {\n if (process.env['RUNEYA_DEBUG'] !== '1') return;\n const items = menu['items'] as { title: string }[];\n deps.warn(`[tray] menu : ${items.map((i) => i.title).join(' | ')}`);\n };\n\n /**\n * Les services sont lus une fois par dessin, jamais en boucle.\n *\n * L'icône bascule en alerte dès qu'un service est en échec : c'est ce qui se\n * voit sans ouvrir quoi que ce soit, et la seule raison pour laquelle un\n * tray vaut mieux qu'un onglet.\n */\n const menuFor = async (): Promise<Record<string, unknown>> => {\n let services: TrayService[] = [];\n try {\n services = await deps.listServices();\n } catch (err) {\n // Un store illisible ne doit pas faire disparaître l'icône : le menu\n // garde au moins l'instance et ses gestes.\n deps.warn(`[tray] services illisibles : ${(err as Error).message}`);\n }\n const alert = services.some((s) => s.failed);\n const menu = {\n icon: join(deps.assetsDir, trayIconFile(process.platform, alert)),\n isTemplateIcon: process.platform === 'darwin',\n title: '',\n tooltip: `Runeya — ${instanceLabel(deps.info)}`,\n items: toSystrayItems(buildInstanceMenu(deps.info, services, deps.lan?.read())),\n };\n traceMenu(menu);\n return menu;\n };\n\n let current: SysTrayLike | null = null;\n let stopped = false;\n let drawing = false;\n let pending: ReturnType<typeof setTimeout> | null = null;\n\n /** Retire une icône sans jamais faire échouer l'appelant. */\n const retire = async (tray: SysTrayLike): Promise<void> => {\n try {\n // false : l'arrêt du process appartient à l'appelant, pas à la\n // bibliothèque — sinon l'extinction propre de Runeya serait coupée.\n await tray.kill(false);\n } catch {\n // L'icône part avec le process de toute façon.\n }\n };\n\n const draw = async (): Promise<boolean> => {\n // Deux dessins concurrents laisseraient une icône orpheline : celle que le\n // second remplace sans que le premier ait fini de la publier.\n if (stopped || drawing) return false;\n drawing = true;\n try {\n let next: SysTrayLike;\n try {\n next = new SysTray({ menu: await menuFor(), debug: false, copyDir: false });\n await next.ready();\n } catch (err) {\n // Un bureau sans zone de notification (GNOME sans extension) tombe ici.\n deps.warn(`[tray] icône non affichée : ${(err as Error).message}`);\n return false;\n }\n\n next.onError((err) => deps.warn(`[tray] ${err.message}`));\n next.onClick((event) => {\n const action = event.item?.action;\n if (!action) return;\n void applyTrayAction(action, deps).then((redrawNow) => {\n if (redrawNow) scheduleDraw();\n });\n });\n\n // La nouvelle est en place avant que l'ancienne parte : l'utilisateur ne\n // voit jamais la barre sans son icône.\n const previous = current;\n current = next;\n if (previous) await retire(previous);\n\n // Un arrêt demandé pendant le dessin ne doit pas laisser d'icône\n // derrière lui : `stop()` a déjà retiré ce qu'il connaissait.\n if (stopped) {\n current = null;\n await retire(next);\n return false;\n }\n return true;\n } finally {\n drawing = false;\n }\n };\n\n const scheduleDraw = (): void => {\n if (stopped) return;\n if (pending) clearTimeout(pending);\n pending = setTimeout(() => {\n pending = null;\n void draw();\n }, TRAY_COALESCE_MS);\n // Ce délai ne doit pas retenir le processus au moment de sortir.\n pending.unref?.();\n };\n\n /**\n * S'abonner AVANT le premier dessin, et non après.\n *\n * Le tray démarre à la toute fin du boot, et la clé de chiffrement, elle,\n * est posée pendant : un menu dessiné juste avant elle ne voit aucun service\n * (les magasins rendent des listes vides tant qu'elle manque), et le signal\n * de déverrouillage partait vers un abonné qui n'existait pas encore. Le\n * menu restait alors vide pour toujours. Mesuré : dessin à +0,20 s, clé à\n * +0,23 s, abonnement à +0,27 s.\n */\n const unsubscribe = deps.onServicesChanged(scheduleDraw);\n\n if (!(await draw())) {\n // Rien à écouter si l'icône n'a pas pu se poser.\n unsubscribe();\n return null;\n }\n\n return {\n stop: async () => {\n stopped = true;\n if (pending) clearTimeout(pending);\n unsubscribe();\n const last = current;\n current = null;\n if (last) await retire(last);\n },\n };\n}\n"],"mappings":"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","names":[]}
|