@runeya/runeya 2.0.119 → 2.0.121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/index.js +17 -2
- package/agent/index.js.map +1 -1
- package/agent-manager-4HBMLHXU.js +10 -0
- package/{chat-PXMMZIAY.js → chat-VL6BIVO5.js} +7 -6
- package/{chunk-GIHR3BGT.js → chunk-3N55WR7F.js} +32 -3
- package/chunk-3N55WR7F.js.map +1 -0
- package/{chunk-2WXQIUVC.js → chunk-CNTL6NVU.js} +50 -44
- package/chunk-CNTL6NVU.js.map +1 -0
- package/{chunk-22RJM654.js → chunk-HJUFIZ7H.js} +41 -13
- package/chunk-HJUFIZ7H.js.map +1 -0
- package/{chunk-NYKFDU76.js → chunk-OVV52N5F.js} +91 -17
- package/chunk-OVV52N5F.js.map +1 -0
- package/{chunk-H6VIS4OY.js → chunk-T2BV5WZE.js} +18 -3
- package/chunk-T2BV5WZE.js.map +1 -0
- package/chunk-YZU5FNXR.js +43 -0
- package/chunk-YZU5FNXR.js.map +1 -0
- package/{companion-4RQ3AMOL.js → companion-AUMA6RGX.js} +5 -4
- package/{desktop-launcher-ADGRYF4S.js → desktop-launcher-EGGVXXKV.js} +2 -2
- package/index.js +4 -4
- package/package.json +1 -1
- package/settings-manager-ROWQ5GC2.js +10 -0
- package/{src-NRKK27F3.js → src-JIS3X4OU.js} +157 -213
- package/src-JIS3X4OU.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-DrcrJYKe.js +13 -0
- package/web/assets/AgentTerminalPage-BonnuSSS.js +1 -0
- package/web/assets/AiChatPage-DzTc9-iH.js +1 -0
- package/web/assets/AppLayout-DRTTSl7g.js +1 -0
- package/web/assets/{AppLayout-kIdcdJ2n.css → AppLayout-vWoE_P8T.css} +1 -1
- package/web/assets/AuditPage-CBWGaY0D.js +1 -0
- package/web/assets/CloudAccountPage-DTrPLz-p.js +1 -0
- package/web/assets/CloudAccountPage-DYOvfMjD.css +1 -0
- package/web/assets/CloudAccountPage-DvbOBtHJ.js +1 -0
- package/web/assets/CloudMessagingPage-BB-_RdEk.js +2 -0
- package/web/assets/DashboardPage-MdYRjTwv.js +164 -0
- package/web/assets/DirectoryPickerDialog-DROtNZ9T.js +1 -0
- package/web/assets/{EditorIcon-Co787SMb.js → EditorIcon-LCl9V_-a.js} +2 -2
- package/web/assets/{EnvironmentForm-B9EQlz9_.js → EnvironmentForm-BUadxutb.js} +2 -2
- package/web/assets/EnvironmentFormPage-Do3NwXL5.js +1 -0
- package/web/assets/EnvironmentListPage-DiG8nF1p.js +1 -0
- package/web/assets/KanbanBoardPage-_QCZ2A2f.js +4 -0
- package/web/assets/KanbanListPage-Dl-FpuPX.css +1 -0
- package/web/assets/KanbanListPage-nyfKMn50.js +1 -0
- package/web/assets/LaunchProjectPage-VHAUZ-cq.js +1 -0
- package/web/assets/LaunchServicesPage-CRv2zJxH.js +1 -0
- package/web/assets/LogViewer-DcoQF_33.js +3 -0
- package/web/assets/OrgKeyPrompt-X9hHtpi9.js +1 -0
- package/web/assets/{ProcessControls-Bl71hMFi.js → ProcessControls-PKQWukd7.js} +1 -1
- package/web/assets/ProcessDetailPage-DhFoi4DT.js +1 -0
- package/web/assets/{ProcessMetrics-eRNYH_T3.js → ProcessMetrics-CMewzyxA.js} +2 -2
- package/web/assets/RandomJobTestPage-CErdKP1K.js +2 -0
- package/web/assets/ScenarioEditorPage-CpRlfU3g.js +14 -0
- package/web/assets/SendToChatDialog-DIp62wvw.js +1 -0
- package/web/assets/ServiceControlsBar-Bk4M-tKR.js +1 -0
- package/web/assets/ServiceDetailPage-BxAZTqFu.js +2 -0
- package/web/assets/ServiceFormPage-Dr_e9QMM.js +1 -0
- package/web/assets/SettingsPage-Dx1eYZKP.js +2063 -0
- package/web/assets/UnlockPage-CgynzFN3.js +1 -0
- package/web/assets/UnlockPage-DU3hoV78.css +1 -0
- package/web/assets/VaultMigrationPage-Cw--n60U.js +1 -0
- package/web/assets/VersionBadge-Ct-qYNDF.js +1 -0
- package/web/assets/WikiPage-D7N7nA2O.js +1 -0
- package/web/assets/WikiView-Izg2SvGt.js +1 -0
- package/web/assets/add-scalar-classes-BP_OZa5m.js +387 -0
- package/web/assets/{autocomplete-CRDXI2af.js → autocomplete-DMfvn4sK.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-DrxPStJk.js → basic-shape-diamond.svg-B5H1r2bp.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-CvQGeMns.js → basic-shape-hexagon.svg-CYAjKF0z.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-fUTtI4Zn.js → basic-shape-primary-circle-ellipse-round.svg-CgleCAf-.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-AxYjsCMg.js → basic-shape-primary-square-rectangle.svg-1Oa48Hhs.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-DejoQ-qp.js → basic-shape-shield.svg-F6dZwVUJ.js} +1 -1
- package/web/assets/{browser-AcVcyRyj.js → browser-CmPAWcJ7.js} +1 -1
- package/web/assets/{browser-CgHmtA33.js → browser-D3KJ0m2n.js} +1 -1
- package/web/assets/card-Ciw7uU90.js +32 -0
- package/web/assets/{checkbox-BNsS_laY.js → checkbox-BCCx0Nu6.js} +3 -3
- package/web/assets/{chip-CLhx1BN5.js → chip-JRh6DXig.js} +2 -2
- package/web/assets/client-BIlYBe0s.js +24 -0
- package/web/assets/cloud-chat.store-BUYi4kYT.js +1 -0
- package/web/assets/cloud-client-CujRC6FF.js +1 -0
- package/web/assets/cloud-session-CSIV9Uvx.js +1 -0
- package/web/assets/{cloud-session-DVRHDddo.js → cloud-session-CZWto5y3.js} +2 -2
- package/web/assets/column-DSBHw97f.js +763 -0
- package/web/assets/{computer-device-desktop-monitor.svg-BNF_S7yY.js → computer-device-desktop-monitor.svg-D7wu2cQ4.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-Ulf27hxx.js → computer-device-desktop.svg-BtVwjOEG.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-I-skOtmX.js → computer-device-laptop.svg-f3tFeUHj.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-_uk-aAy4.js → computer-device-mobile-phone-android-samsung-back.svg-CmJcGkrL.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-oHv8Jcw4.js → computer-device-mobile-phone-android-samsung.svg-C2ke6Sbg.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-nYNHlByZ.js → computer-device-mobile-phone-iphone-x-back.svg-DxMqUXKE.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-BNV8yMsz.js → computer-device-mobile-phone-iphone-x.svg-DkbKlrh8.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-D6eYCphm.js → computer-device-mobile-tablet-touch.svg-DP0uXMda.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-BrVxasnX.js → computer-device-mobile-tablet.svg-C064ZFQm.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-kBDyvmFe.js → computer-device-network-ethernet-cat6.svg-Dwzl7zBN.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-DxCA3g5k.js → computer-device-network-lan-www.svg-BgErom5w.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-PIA_jdq6.js → computer-device-network-wifi-connection.svg-ByqNsV6y.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-BmIHCgnZ.js → computer-device-network-wifi-router.svg-AySGITbi.js} +1 -1
- package/web/assets/{cssMode-DACHwZVM.js → cssMode-BqrZ4SB-.js} +1 -1
- package/web/assets/{divider-CTmL86NV.js → divider-BswZTb8q.js} +2 -2
- package/web/assets/{docx-preview-8mHccyHq.js → docx-preview-t_oOha_C.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-CPPf1sQr.js → ecology-science-erlenmeyer-flask.svg-Keg4ZY0z.js} +1 -1
- package/web/assets/{fieldset-BU42Vd0z.js → fieldset-DaWy9FsL.js} +2 -2
- package/web/assets/{freemarker2-DqgOX6Fn.js → freemarker2-Br0kiufp.js} +1 -1
- package/web/assets/{handlebars-TTBBMGWH.js → handlebars-BrATzKUL.js} +1 -1
- package/web/assets/{html-DGf_odQm.js → html-LWTJcTM2.js} +1 -1
- package/web/assets/{htmlMode-D-LSVgqS.js → htmlMode-A23pWfMP.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-uW6nZ9pC.js → image-flash-lightning.svg-uQfoT6Ex.js} +1 -1
- package/web/assets/{image-picture-flower.svg-oWXTRzBB.js → image-picture-flower.svg-XxD1bCHC.js} +1 -1
- package/web/assets/{index-BS0htmo7.js → index-e5dmzMc-.js} +362 -362
- package/web/assets/{index-qjiWPMcS.css → index-rUoTy8xc.css} +1 -1
- package/web/assets/{interface-alert-exclamation-diamond.svg-svwX9rGg.js → interface-alert-exclamation-diamond.svg-gQAlkILu.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-1SqtE207.js → interface-alert-exclamation-triangle-warning.svg-Ga2rsl6o.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-DAQzRiWG.js → interface-alert-information-circle.svg-BS0N2R1M.js} +1 -1
- package/web/assets/{interface-award-crown.svg-BLlwNnLN.js → interface-award-crown.svg-CtLbK4Gl.js} +1 -1
- package/web/assets/{interface-bookmark.svg-B0PZfyfo.js → interface-bookmark-tag.svg-Dfd6eXAX.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-DKcxOCPe.js → interface-bookmark.svg-Clt6TTov.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-GFId7gEg.js → interface-calendar-date-one.svg-BmFNLrzR.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-C9mxvbj7.js → interface-content-book-open-pages.svg-u8kJbc3N.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DTVIL4CZ.js → interface-content-book-page.svg-Csk8d0R8.js} +1 -1
- package/web/assets/{interface-content-file.svg-9Hhcuha8.js → interface-content-file.svg-DIoD1UhJ.js} +1 -1
- package/web/assets/interface-content-folder.svg-BPZbNQNK.js +1 -0
- package/web/assets/{interface-content-folder.svg-BRjBwjv5.js → interface-content-folder.svg-ipO7hYM2.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-DHujfKOA.js → interface-copy-clipboard.svg-BaK2fHKS.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-BNtrRzRD.js → interface-edit-attachment.svg-CrpyP6c6.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-C7m9_XJl.js → interface-edit-binocular.svg-Cw-YeqUQ.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-MVh7T2FU.js → interface-edit-magic-wand.svg-BPa49t_4.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-CG3Q3Sfa.js → interface-edit-tool-paint-roller.svg-Cfag7vxY.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-Cjm_wnC_.js → interface-edit-tool-pencil.svg-BNAmX0d_.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-CFCGPZr8.js → interface-favorite-award.svg-CIMvocAv.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-BaANsqND.js → interface-favorite-flag.svg-8C3GXK06.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-B2YfjK1B.js → interface-favorite-heart.svg-CEU_IALn.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-DdIZAOnM.js → interface-favorite-star.svg-Bs0RUtgk.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-DErOt3d0.js → interface-favorite-stars-sparkles.svg-CZYZ5qkH.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-CegEwz_L.js → interface-hierarchy-flowchart.svg-DOgEXHV2.js} +1 -1
- package/web/assets/{interface-home-house.svg-DEnpyywi.js → interface-home-house.svg-lDERGk8q.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-APXQWsOQ.js → interface-hyperlink.svg-CAZrs64U.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-Bt8UdEVE.js → interface-lighting-brightness.svg-CVANBB7i.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-DUhKy22h.js → interface-lock-closed.svg-qDLyceL-.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-D80GZ0WK.js → interface-lock-open-unlock.svg-Bc-cq6eU.js} +1 -1
- package/web/assets/{interface-login-key.svg-BUZuQC4z.js → interface-login-key.svg-D6wZBYEi.js} +1 -1
- package/web/assets/{interface-search.svg-C1SGbWh4.js → interface-search.svg-BVM6kkvA.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-BhT06xOL.js → interface-setting-cog.svg-uJYqlmKx.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DNA0-4pd.js → interface-share-megaphone-bullhorn.svg-CgBVBu7Z.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-DyZYsdtW.js → interface-share-rocket.svg-C1iCXMlX.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-BnHfHXGT.js → interface-share-satellite.svg-uH-Cvq9d.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-q8JaUlaM.js → interface-share-space-ship.svg-81lauyV5.js} +1 -1
- package/web/assets/{interface-share.svg-dfMV_q01.js → interface-share.svg-DO85t-F0.js} +1 -1
- package/web/assets/{interface-signal-square.svg-BZAXvGUW.js → interface-signal-square.svg-CFAni6lY.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-fmTRjz7L.js → interface-time-clock-circle.svg-BUQfluh7.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg--hxc1m2W.js → interface-time-hour-glass.svg-BAZDU-C5.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-CnachJBj.js → interface-users-multiple.svg-Bj0AvF2-.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-AoEOz9T0.js → interface-weather-moon.svg-Cxz-5thD.js} +1 -1
- package/web/assets/{javascript-DYRKHLYc.js → javascript-CuP68vN5.js} +1 -1
- package/web/assets/{jsonMode-CpdzwU9F.js → jsonMode-CdGjze9r.js} +1 -1
- package/web/assets/{liquid-D9vCKfST.js → liquid-fJJZPdJb.js} +1 -1
- package/web/assets/{lspLanguageFeatures-BCeM67u6.js → lspLanguageFeatures-YzzH9q9a.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-CcgRWmuD.js → mail-chat-bubble-square.svg-DY1-sN8v.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-C053lctJ.js → mail-send-email-paper-airplane.svg-6zVEUG2-.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-Dij10Q_i.js → mail-send-envelope.svg-DNpA7Auy.js} +1 -1
- package/web/assets/{mdx-DLUKh9ow.js → mdx-CphM-wvX.js} +1 -1
- package/web/assets/{minus-DZytaOJc.js → minus-DD84SZSh.js} +2 -2
- package/web/assets/modal-CKGM8Wb3.js +5 -0
- package/web/assets/modal-Dd5rzDUd.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-CZ4os1uZ.js → money-cashier-receipt.svg-ChxLUMT0.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-Denbm12e.js → money-currency-dollar-pay.svg-CcPdfv1E.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-CGE6Sbr2.js → money-graph-arrow-increase.svg-BsmXO8yM.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-Smi2NzVH.js → money-graph-bar-chart-increase.svg-QVk3zD8i.js} +1 -1
- package/web/assets/multiselect-3cR58mLz.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-DUos6Bhh.js → nature-ecology-leaf.svg-nzup63P6.js} +1 -1
- package/web/assets/{password-CBJ4yfim.js → password-CCYLOu-C.js} +4 -4
- package/web/assets/{phone-telephone.svg-DqjTWhHK.js → phone-telephone.svg-BLtgdZw-.js} +1 -1
- package/web/assets/{plus-CdM2ZQyx.js → plus-jk73RdzY.js} +5 -5
- package/web/assets/process.store-jsfEBwiA.js +1 -0
- package/web/assets/{programming-bug.svg-zpx99bTR.js → programming-bug.svg-BCN6lOn1.js} +1 -1
- package/web/assets/{programming-cloud.svg-Dw198CLB.js → programming-cloud.svg-DHNBRNkQ.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-BaanLqUL.js → programming-computer-database-server.svg-C4DheEbm.js} +1 -1
- package/web/assets/{programming-computer-database.svg-y5Qcgysz.js → programming-computer-database.svg-cD2w2ZZ6.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-DQ8HcjMz.js → programming-module-four-layout.svg-D6_P2rTG.js} +1 -1
- package/web/assets/{programming-module-three.svg-CbgPevqj.js → programming-module-three.svg-Dc076Z_f.js} +1 -1
- package/web/assets/{programming-module.svg-deAnzVVR.js → programming-module.svg-D0c9akII.js} +1 -1
- package/web/assets/{programming-script-code.svg-D2Qn3_1w.js → programming-script-code.svg-BrT3KZQe.js} +1 -1
- package/web/assets/project-launch.store-Bp7vasUu.js +1 -0
- package/web/assets/project.store-DuZriz9o.js +1 -0
- package/web/assets/{python-UJjSlB62.js → python-DMw-TRDY.js} +1 -1
- package/web/assets/{radiobutton-D8PPlyvM.js → radiobutton-CnoEo0qc.js} +2 -2
- package/web/assets/{razor-CA1xRhq3.js → razor-BTS4Lk96.js} +1 -1
- package/web/assets/router-BU2tqcBm.js +1 -0
- package/web/assets/settings-scope-Bg_X1n_Y.js +1 -0
- package/web/assets/{settings.store-C3_pPTwT.js → settings.store-DeGpnclr.js} +1 -1
- package/web/assets/{shopping-cart.svg-BKmjHX4l.js → shopping-cart.svg-pvFNKXP_.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-HKKyiGmo.js → shopping-gift-present.svg-PYJ4_vdS.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-kTMFl43_.js → shopping-shipping-box-parcel-package.svg-KMRd9Rmg.js} +1 -1
- package/web/assets/src-BsadAol0.js +572 -0
- package/web/assets/src-DU1mBjF-.css +1 -0
- package/web/assets/src-NXursDRf.js +1 -0
- package/web/assets/{tabpanel-BCGYata1.js → tabpanel-CKudNnqo.js} +3 -3
- package/web/assets/{tag-new-circle.svg-D9B5tiv9.js → tag-new-circle.svg-Bf83DYRq.js} +1 -1
- package/web/assets/theme-D6M00FyZ.js +1 -0
- package/web/assets/{toggleswitch-TdY2vwYU.js → toggleswitch-Cv0supU2.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-D4jsI9PN.js → travel-map-earth-globe.svg-WxnFDzEH.js} +1 -1
- package/web/assets/trpc-mWVODCs2.js +1 -0
- package/web/assets/{tsMode-D7Nw-uk2.js → tsMode-CfruLmor.js} +5 -5
- package/web/assets/{typescript-CO_htKpJ.js → typescript-BvsjNfHT.js} +1 -1
- package/web/assets/useAiChatDrawer-vNey6IKe.js +1 -0
- package/web/assets/useCloudOrg-B0o8vN4e.js +1 -0
- package/web/assets/useEnvVarAutocomplete-DJMTIim7.js +1 -0
- package/web/assets/useProjectCatalog-B6GXBDDA.js +1 -0
- package/web/assets/{useProjectCloudOrg-B13niYUp.js → useProjectCloudOrg-BwLsTiz0.js} +1 -1
- package/web/assets/useServiceUrlHost-CE4Qoy-J.js +1 -0
- package/web/assets/{xml-JzyfGwW6.js → xml-BTID20Kj.js} +1 -1
- package/web/assets/{yaml-C9s-8a68.js → yaml-BtOf_8je.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-ACPQWUZ5.js +0 -9
- package/chunk-22RJM654.js.map +0 -1
- package/chunk-2WXQIUVC.js.map +0 -1
- package/chunk-GIHR3BGT.js.map +0 -1
- package/chunk-H6VIS4OY.js.map +0 -1
- package/chunk-NYKFDU76.js.map +0 -1
- package/settings-manager-2C7RY6ZC.js +0 -9
- package/src-NRKK27F3.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-DeDCprCi.js +0 -13
- package/web/assets/AgentTerminalPage-CVM-_xua.js +0 -1
- package/web/assets/AiChatPage-C0XGalM7.js +0 -1
- package/web/assets/AppLayout-DWE2gGEG.js +0 -1
- package/web/assets/AuditPage-CtEaUBZG.js +0 -1
- package/web/assets/CloudAccountPage-CfMY69pk.css +0 -1
- package/web/assets/CloudAccountPage-FtuRCNIq.js +0 -1
- package/web/assets/CloudAccountPage-snaQ5_Jz.js +0 -1
- package/web/assets/CloudMessagingPage-BhU4VarW.js +0 -2
- package/web/assets/DashboardPage-DMek59Ua.js +0 -164
- package/web/assets/DirectoryPickerDialog-DzhKixt4.js +0 -1
- package/web/assets/EnvironmentFormPage-_iZpn0PZ.js +0 -1
- package/web/assets/EnvironmentListPage-lviQTpL1.js +0 -1
- package/web/assets/KanbanBoardPage-jJKcNxVt.js +0 -4
- package/web/assets/KanbanListPage-C5rbZ1eL.css +0 -1
- package/web/assets/KanbanListPage-CjDSP-NZ.js +0 -1
- package/web/assets/LaunchProjectPage-CCg2nziO.js +0 -1
- package/web/assets/LaunchServicesPage-EhKBO0tS.js +0 -1
- package/web/assets/LogViewer-BOcmkQJk.js +0 -3
- package/web/assets/OrgKeyPrompt-FXuwB-qF.js +0 -1
- package/web/assets/ProcessDetailPage-BepAK0mH.js +0 -1
- package/web/assets/RandomJobTestPage-BzhLqqcX.js +0 -2
- package/web/assets/ScenarioEditorPage-RAo2HXny.js +0 -14
- package/web/assets/SendToChatDialog-YAcjNz8G.js +0 -1
- package/web/assets/ServiceControlsBar-C4CLmYs1.js +0 -1
- package/web/assets/ServiceDetailPage-NrtsPPS2.js +0 -2
- package/web/assets/ServiceFormPage-DpzK--N_.js +0 -1
- package/web/assets/SettingsPage-Cov2c6gi.js +0 -2063
- package/web/assets/UnlockPage-CZ4UXjxV.js +0 -1
- package/web/assets/UnlockPage-CpysPhlT.css +0 -1
- package/web/assets/VaultMigrationPage-D7YkLOgt.js +0 -1
- package/web/assets/VersionBadge-DfU2xGOy.js +0 -1
- package/web/assets/WikiPage-AuxO0ZRo.js +0 -1
- package/web/assets/WikiView-YO32SMjf.js +0 -1
- package/web/assets/add-scalar-classes-BSy1Q2x9.js +0 -387
- package/web/assets/card-DYXJ9e_6.js +0 -32
- package/web/assets/client-DWF3UIg2.js +0 -24
- package/web/assets/cloud-chat.store-BrkQ6sdy.js +0 -1
- package/web/assets/cloud-client-BVamD4zV.js +0 -1
- package/web/assets/cloud-session-BsAfbgkv.js +0 -1
- package/web/assets/column-CVMI7gfk.js +0 -763
- package/web/assets/interface-content-folder.svg-fC-vaV4V.js +0 -1
- package/web/assets/modal-DYL3DOz1.js +0 -1
- package/web/assets/modal-idM6wRD1.js +0 -5
- package/web/assets/multiselect-D8chjo1K.js +0 -251
- package/web/assets/process.store-BxdP--c-.js +0 -1
- package/web/assets/project-launch.store-Cjco1dyN.js +0 -1
- package/web/assets/project.store-pEhSKAS1.js +0 -1
- package/web/assets/router-B7qnUbTf.js +0 -1
- package/web/assets/settings-scope-QgZMDCpD.js +0 -1
- package/web/assets/src-CkWablLs.js +0 -1
- package/web/assets/src-D2BeOnZr.css +0 -1
- package/web/assets/src-DfWVY3Sc.js +0 -572
- package/web/assets/theme-Lxx3iG7K.js +0 -1
- package/web/assets/trpc-D86IoEhq.js +0 -1
- package/web/assets/useAiChatDrawer-B6JN2q-b.js +0 -1
- package/web/assets/useCloudOrg-wQX-0p6v.js +0 -1
- package/web/assets/useEnvVarAutocomplete-DfdXSaqd.js +0 -1
- package/web/assets/useProjectCatalog-kHRSO0K2.js +0 -1
- package/web/assets/useServiceUrlHost-DtUQvKz3.js +0 -1
- /package/{agent-manager-ACPQWUZ5.js.map → agent-manager-4HBMLHXU.js.map} +0 -0
- /package/{chat-PXMMZIAY.js.map → chat-VL6BIVO5.js.map} +0 -0
- /package/{companion-4RQ3AMOL.js.map → companion-AUMA6RGX.js.map} +0 -0
- /package/{desktop-launcher-ADGRYF4S.js.map → desktop-launcher-EGGVXXKV.js.map} +0 -0
- /package/{settings-manager-2C7RY6ZC.js.map → settings-manager-ROWQ5GC2.js.map} +0 -0
|
@@ -64,7 +64,7 @@ import {
|
|
|
64
64
|
soleAccountScope,
|
|
65
65
|
startCliSession,
|
|
66
66
|
vaultOfProject
|
|
67
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-HJUFIZ7H.js";
|
|
68
68
|
import {
|
|
69
69
|
resolveCliInvocation,
|
|
70
70
|
whichCommand
|
|
@@ -87,7 +87,7 @@ import {
|
|
|
87
87
|
stopClaudeTranscriptWatcher,
|
|
88
88
|
stopCodexTranscriptWatcher,
|
|
89
89
|
verifyJwt
|
|
90
|
-
} from "./chunk-
|
|
90
|
+
} from "./chunk-OVV52N5F.js";
|
|
91
91
|
import "./chunk-MD3VW4HQ.js";
|
|
92
92
|
import {
|
|
93
93
|
agentManager,
|
|
@@ -98,7 +98,6 @@ import {
|
|
|
98
98
|
clearVaultLock,
|
|
99
99
|
decryptValue,
|
|
100
100
|
decryptValueWith,
|
|
101
|
-
describeInstance,
|
|
102
101
|
encryptValue,
|
|
103
102
|
encryptValueWith,
|
|
104
103
|
ensureEncryptionKey,
|
|
@@ -126,10 +125,11 @@ import {
|
|
|
126
125
|
stableEncryptValue,
|
|
127
126
|
traefikManager,
|
|
128
127
|
unregisterInstance
|
|
129
|
-
} from "./chunk-
|
|
128
|
+
} from "./chunk-CNTL6NVU.js";
|
|
130
129
|
import {
|
|
131
130
|
settingsManager
|
|
132
|
-
} from "./chunk-
|
|
131
|
+
} from "./chunk-3N55WR7F.js";
|
|
132
|
+
import "./chunk-YZU5FNXR.js";
|
|
133
133
|
import {
|
|
134
134
|
AGENT_LONG_FETCH_TIMEOUT,
|
|
135
135
|
AGENT_STOP_FETCH_TIMEOUT,
|
|
@@ -163,7 +163,7 @@ import {
|
|
|
163
163
|
readEntity,
|
|
164
164
|
serviceSlug,
|
|
165
165
|
writeEntity
|
|
166
|
-
} from "./chunk-
|
|
166
|
+
} from "./chunk-T2BV5WZE.js";
|
|
167
167
|
import {
|
|
168
168
|
env,
|
|
169
169
|
forgetOrgLogo,
|
|
@@ -1167,6 +1167,63 @@ var projectRouter = router({
|
|
|
1167
1167
|
await projectPathStore.set(project, input.path);
|
|
1168
1168
|
await auditService.log({ userId: "local", action: "update", entityType: "project", entityId: input.id, metadata: { localPath: input.path } });
|
|
1169
1169
|
return { path: input.path };
|
|
1170
|
+
}),
|
|
1171
|
+
/**
|
|
1172
|
+
* Ce qui a changé dans les stores, à mesure que ça change.
|
|
1173
|
+
*
|
|
1174
|
+
* Un projet, un service ou un environnement n'arrive pas toujours de
|
|
1175
|
+
* l'utilisateur assis devant : il descend du cloud quand un collègue le
|
|
1176
|
+
* pousse, ou d'une autre Runeya de cette machine. Les stores étaient déjà
|
|
1177
|
+
* prévenus — la synchronisation s'appuie sur les mêmes signaux — mais rien ne
|
|
1178
|
+
* portait l'information jusqu'à l'écran, qui gardait donc ce qu'il avait
|
|
1179
|
+
* chargé à l'ouverture de la vue.
|
|
1180
|
+
*
|
|
1181
|
+
* Ce flux annonce les collections touchées, pas leur contenu. Chacune a déjà
|
|
1182
|
+
* sa route, avec ses règles — un service ne sort jamais d'ici sans être
|
|
1183
|
+
* expurgé de ses secrets — et les redire ici en ferait une seconde version à
|
|
1184
|
+
* tenir d'accord avec la première.
|
|
1185
|
+
*
|
|
1186
|
+
* Les réveils sont groupés : une synchronisation qui descend un projet touche
|
|
1187
|
+
* ses trois collections coup sur coup, et trois annonces feraient trois
|
|
1188
|
+
* rechargements là où un seul suffit.
|
|
1189
|
+
*/
|
|
1190
|
+
onDataChanged: protectedProcedure.subscription(async function* ({ signal }) {
|
|
1191
|
+
const touched = /* @__PURE__ */ new Set();
|
|
1192
|
+
let wake = null;
|
|
1193
|
+
const mark = (collection) => () => {
|
|
1194
|
+
touched.add(collection);
|
|
1195
|
+
if (wake) {
|
|
1196
|
+
wake();
|
|
1197
|
+
wake = null;
|
|
1198
|
+
}
|
|
1199
|
+
};
|
|
1200
|
+
const onProjects = mark("projects");
|
|
1201
|
+
projectStore.events.on("saved", onProjects);
|
|
1202
|
+
const offs = [serviceStore.onChange(mark("services")), environmentStore.onChange(mark("environments"))];
|
|
1203
|
+
const onAbort = () => {
|
|
1204
|
+
if (wake) {
|
|
1205
|
+
wake();
|
|
1206
|
+
wake = null;
|
|
1207
|
+
}
|
|
1208
|
+
};
|
|
1209
|
+
signal?.addEventListener("abort", onAbort);
|
|
1210
|
+
try {
|
|
1211
|
+
while (!signal?.aborted) {
|
|
1212
|
+
if (touched.size > 0) {
|
|
1213
|
+
const collections = Array.from(touched);
|
|
1214
|
+
touched.clear();
|
|
1215
|
+
yield { collections };
|
|
1216
|
+
} else {
|
|
1217
|
+
await new Promise((resolve4) => {
|
|
1218
|
+
wake = resolve4;
|
|
1219
|
+
});
|
|
1220
|
+
}
|
|
1221
|
+
}
|
|
1222
|
+
} finally {
|
|
1223
|
+
projectStore.events.off("saved", onProjects);
|
|
1224
|
+
for (const off of offs) off();
|
|
1225
|
+
signal?.removeEventListener("abort", onAbort);
|
|
1226
|
+
}
|
|
1170
1227
|
})
|
|
1171
1228
|
});
|
|
1172
1229
|
|
|
@@ -6523,82 +6580,8 @@ async function reconcileOrgCanary(orgId) {
|
|
|
6523
6580
|
|
|
6524
6581
|
// ../server/src/services/cloud-sync-bridge.ts
|
|
6525
6582
|
import { randomUUID as randomUUID5 } from "crypto";
|
|
6526
|
-
import { mkdir as
|
|
6583
|
+
import { mkdir as mkdir7, rm as rm3 } from "fs/promises";
|
|
6527
6584
|
import * as Y from "yjs";
|
|
6528
|
-
|
|
6529
|
-
// ../server/src/services/org-lock.ts
|
|
6530
|
-
import { open, readFile as readFile4, unlink, mkdir as mkdir7 } from "fs/promises";
|
|
6531
|
-
import { readFileSync, unlinkSync } from "fs";
|
|
6532
|
-
import { join as join10 } from "path";
|
|
6533
|
-
var held = /* @__PURE__ */ new Set();
|
|
6534
|
-
function lockPath(orgId) {
|
|
6535
|
-
return join10(orgVaultRoot(orgId), "org.lock");
|
|
6536
|
-
}
|
|
6537
|
-
function isRunning(pid) {
|
|
6538
|
-
if (!Number.isInteger(pid) || pid <= 0) return false;
|
|
6539
|
-
try {
|
|
6540
|
-
process.kill(pid, 0);
|
|
6541
|
-
return true;
|
|
6542
|
-
} catch (err) {
|
|
6543
|
-
return err.code === "EPERM";
|
|
6544
|
-
}
|
|
6545
|
-
}
|
|
6546
|
-
async function readLock(path) {
|
|
6547
|
-
try {
|
|
6548
|
-
const parsed = JSON.parse(await readFile4(path, "utf-8"));
|
|
6549
|
-
return typeof parsed?.pid === "number" ? parsed : null;
|
|
6550
|
-
} catch {
|
|
6551
|
-
return null;
|
|
6552
|
-
}
|
|
6553
|
-
}
|
|
6554
|
-
async function acquireOrgLock(orgId) {
|
|
6555
|
-
const path = lockPath(orgId);
|
|
6556
|
-
await mkdir7(orgVaultRoot(orgId), { recursive: true });
|
|
6557
|
-
for (let attempt = 0; attempt < 2; attempt++) {
|
|
6558
|
-
try {
|
|
6559
|
-
const handle = await open(path, "wx");
|
|
6560
|
-
try {
|
|
6561
|
-
const contents = { pid: process.pid, startedAt: (/* @__PURE__ */ new Date()).toISOString() };
|
|
6562
|
-
await handle.writeFile(JSON.stringify(contents), "utf-8");
|
|
6563
|
-
} finally {
|
|
6564
|
-
await handle.close();
|
|
6565
|
-
}
|
|
6566
|
-
held.add(orgId);
|
|
6567
|
-
return { acquired: true };
|
|
6568
|
-
} catch (err) {
|
|
6569
|
-
if (err.code !== "EEXIST") throw err;
|
|
6570
|
-
}
|
|
6571
|
-
const holder2 = await readLock(path);
|
|
6572
|
-
if (holder2 && holder2.pid !== process.pid && isRunning(holder2.pid)) {
|
|
6573
|
-
return { acquired: false, heldBy: holder2.pid };
|
|
6574
|
-
}
|
|
6575
|
-
await unlink(path).catch(() => {
|
|
6576
|
-
});
|
|
6577
|
-
}
|
|
6578
|
-
const holder = await readLock(path);
|
|
6579
|
-
return holder ? { acquired: false, heldBy: holder.pid } : { acquired: true };
|
|
6580
|
-
}
|
|
6581
|
-
async function releaseOrgLock(orgId) {
|
|
6582
|
-
held.delete(orgId);
|
|
6583
|
-
const path = lockPath(orgId);
|
|
6584
|
-
const holder = await readLock(path);
|
|
6585
|
-
if (holder && holder.pid !== process.pid) return;
|
|
6586
|
-
await unlink(path).catch(() => {
|
|
6587
|
-
});
|
|
6588
|
-
}
|
|
6589
|
-
function releaseAllOrgLocksSync() {
|
|
6590
|
-
for (const orgId of held) {
|
|
6591
|
-
const path = lockPath(orgId);
|
|
6592
|
-
try {
|
|
6593
|
-
const holder = JSON.parse(readFileSync(path, "utf-8"));
|
|
6594
|
-
if (holder.pid === process.pid) unlinkSync(path);
|
|
6595
|
-
} catch {
|
|
6596
|
-
}
|
|
6597
|
-
}
|
|
6598
|
-
held.clear();
|
|
6599
|
-
}
|
|
6600
|
-
|
|
6601
|
-
// ../server/src/services/cloud-sync-bridge.ts
|
|
6602
6585
|
var LOCAL_ORIGIN = "local-bridge";
|
|
6603
6586
|
var REMOTE_ORIGIN = "remote";
|
|
6604
6587
|
var RECONNECT_DELAY_MS = 3e3;
|
|
@@ -6971,7 +6954,7 @@ var OrgSyncConnection = class {
|
|
|
6971
6954
|
}
|
|
6972
6955
|
const isLocal = existing?.orgId === this.link.orgId;
|
|
6973
6956
|
if (!inDoc && !isLocal) return false;
|
|
6974
|
-
await
|
|
6957
|
+
await mkdir7(projectVaultRoot(this.link.orgId, projectId), { recursive: true });
|
|
6975
6958
|
this.tracked.add(projectId);
|
|
6976
6959
|
if (inDoc) await this.pullFromDoc([projectId]);
|
|
6977
6960
|
else await this.reconcileLocalToDoc();
|
|
@@ -7012,6 +6995,7 @@ var OrgSyncConnection = class {
|
|
|
7012
6995
|
} finally {
|
|
7013
6996
|
this.pulling = false;
|
|
7014
6997
|
}
|
|
6998
|
+
await serviceStore.relocateAll();
|
|
7015
6999
|
await this.reconcileLocalToDoc();
|
|
7016
7000
|
}
|
|
7017
7001
|
// ---- Local ↔ Doc reconciliation --------------------------------------
|
|
@@ -7243,21 +7227,12 @@ var OrgSyncConnection = class {
|
|
|
7243
7227
|
};
|
|
7244
7228
|
var CloudSyncBridge = class {
|
|
7245
7229
|
connections = /* @__PURE__ */ new Map();
|
|
7246
|
-
/**
|
|
7247
|
-
* Orgs another instance holds the lock on — reported, not retried blindly.
|
|
7248
|
-
*
|
|
7249
|
-
* Le pid du détenteur, et non un simple drapeau : « un autre Runeya de cette
|
|
7250
|
-
* machine » ne dit pas lequel fermer, et l'utilisateur en a souvent trois.
|
|
7251
|
-
* Le port se déduit du pid par le registre d'instances, au moment de rendre
|
|
7252
|
-
* l'état — jamais mémorisé ici, où il vieillirait.
|
|
7253
|
-
*/
|
|
7254
|
-
locked = /* @__PURE__ */ new Map();
|
|
7255
7230
|
/**
|
|
7256
7231
|
* Orgs whose key this machine does not have.
|
|
7257
7232
|
*
|
|
7258
|
-
*
|
|
7259
|
-
*
|
|
7260
|
-
*
|
|
7233
|
+
* Tenues à part : la connexion n'est jamais ouverte, donc il n'y a rien à qui
|
|
7234
|
+
* demander son état — et une organisation qui ne peut pas synchroniser tant
|
|
7235
|
+
* qu'un humain n'a pas fourni de clé ne doit pas se lire « arrêtée ».
|
|
7261
7236
|
*/
|
|
7262
7237
|
keyMismatch = /* @__PURE__ */ new Set();
|
|
7263
7238
|
started = false;
|
|
@@ -7341,22 +7316,14 @@ var CloudSyncBridge = class {
|
|
|
7341
7316
|
const live = Array.from(this.connections.entries()).map(([orgId, conn]) => ({
|
|
7342
7317
|
orgId,
|
|
7343
7318
|
state: conn.getState(),
|
|
7344
|
-
lastIncompatibleVersion: conn.getLastIncompatibleVersion()
|
|
7345
|
-
heldByPid: null
|
|
7346
|
-
}));
|
|
7347
|
-
const locked = Array.from(this.locked).filter(([orgId]) => !this.connections.has(orgId)).map(([orgId, pid]) => ({
|
|
7348
|
-
orgId,
|
|
7349
|
-
state: "locked",
|
|
7350
|
-
lastIncompatibleVersion: null,
|
|
7351
|
-
heldByPid: pid
|
|
7319
|
+
lastIncompatibleVersion: conn.getLastIncompatibleVersion()
|
|
7352
7320
|
}));
|
|
7353
7321
|
const mismatched = Array.from(this.keyMismatch).filter((orgId) => !this.connections.has(orgId)).map((orgId) => ({
|
|
7354
7322
|
orgId,
|
|
7355
7323
|
state: "key-mismatch",
|
|
7356
|
-
lastIncompatibleVersion: null
|
|
7357
|
-
heldByPid: null
|
|
7324
|
+
lastIncompatibleVersion: null
|
|
7358
7325
|
}));
|
|
7359
|
-
return [...live, ...
|
|
7326
|
+
return [...live, ...mismatched];
|
|
7360
7327
|
}
|
|
7361
7328
|
/**
|
|
7362
7329
|
* Follow one project of an org on this machine, pulling it now.
|
|
@@ -7402,20 +7369,6 @@ var CloudSyncBridge = class {
|
|
|
7402
7369
|
);
|
|
7403
7370
|
}
|
|
7404
7371
|
this.keyMismatch.delete(link.orgId);
|
|
7405
|
-
const lock = await acquireOrgLock(link.orgId).catch((err) => {
|
|
7406
|
-
console.error("[cloud-sync] could not take the lock for org %s:", link.orgId, err.message);
|
|
7407
|
-
return { acquired: false, heldBy: 0 };
|
|
7408
|
-
});
|
|
7409
|
-
if (!lock.acquired) {
|
|
7410
|
-
console.error(
|
|
7411
|
-
"[cloud-sync] org %s is already being synced by another Runeya (pid %d) \u2014 not syncing it here",
|
|
7412
|
-
link.orgId,
|
|
7413
|
-
lock.heldBy
|
|
7414
|
-
);
|
|
7415
|
-
this.locked.set(link.orgId, lock.heldBy);
|
|
7416
|
-
return;
|
|
7417
|
-
}
|
|
7418
|
-
this.locked.delete(link.orgId);
|
|
7419
7372
|
const conn = new OrgSyncConnection(link);
|
|
7420
7373
|
this.connections.set(link.orgId, conn);
|
|
7421
7374
|
try {
|
|
@@ -7429,22 +7382,19 @@ var CloudSyncBridge = class {
|
|
|
7429
7382
|
if (existing) {
|
|
7430
7383
|
existing.stop();
|
|
7431
7384
|
this.connections.delete(orgId);
|
|
7432
|
-
void releaseOrgLock(orgId);
|
|
7433
7385
|
}
|
|
7434
7386
|
}
|
|
7435
7387
|
stopAll() {
|
|
7436
7388
|
for (const conn of this.connections.values()) conn.stop();
|
|
7437
7389
|
this.connections.clear();
|
|
7438
|
-
this.locked.clear();
|
|
7439
7390
|
this.keyMismatch.clear();
|
|
7440
|
-
releaseAllOrgLocksSync();
|
|
7441
7391
|
}
|
|
7442
7392
|
};
|
|
7443
7393
|
var cloudSyncBridge = new CloudSyncBridge();
|
|
7444
7394
|
|
|
7445
7395
|
// ../server/src/services/key-adoption.ts
|
|
7446
|
-
import { readdir as readdir3, readFile as
|
|
7447
|
-
import { join as
|
|
7396
|
+
import { readdir as readdir3, readFile as readFile4, writeFile as writeFile6, mkdir as mkdir8, copyFile, rename as rename4, stat as stat5 } from "fs/promises";
|
|
7397
|
+
import { join as join10 } from "path";
|
|
7448
7398
|
import { createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2, randomBytes as randomBytes2 } from "crypto";
|
|
7449
7399
|
var ALGORITHM = "aes-256-gcm";
|
|
7450
7400
|
function isAgentTriplet(value) {
|
|
@@ -7524,10 +7474,10 @@ async function adoptOrgKey(orgId, newKey, masterPassword, now) {
|
|
|
7524
7474
|
const touchedRoots = /* @__PURE__ */ new Set();
|
|
7525
7475
|
for (const vaultRoot of await rootsOfOrg(orgId)) {
|
|
7526
7476
|
for (const name of await jsonFilesIn(vaultRoot)) {
|
|
7527
|
-
const path =
|
|
7477
|
+
const path = join10(vaultRoot, name);
|
|
7528
7478
|
let parsed;
|
|
7529
7479
|
try {
|
|
7530
|
-
parsed = JSON.parse(await
|
|
7480
|
+
parsed = JSON.parse(await readFile4(path, "utf-8"));
|
|
7531
7481
|
} catch {
|
|
7532
7482
|
continue;
|
|
7533
7483
|
}
|
|
@@ -7541,14 +7491,14 @@ async function adoptOrgKey(orgId, newKey, masterPassword, now) {
|
|
|
7541
7491
|
const stamp = now.toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
7542
7492
|
const backups = [];
|
|
7543
7493
|
for (const vaultRoot of touchedRoots) {
|
|
7544
|
-
const backupDir =
|
|
7545
|
-
await
|
|
7494
|
+
const backupDir = join10(vaultRoot, `backup-key-${stamp}`);
|
|
7495
|
+
await mkdir8(backupDir, { recursive: true });
|
|
7546
7496
|
for (const name of await jsonFilesIn(vaultRoot)) {
|
|
7547
|
-
await copyFile(
|
|
7497
|
+
await copyFile(join10(vaultRoot, name), join10(backupDir, name));
|
|
7548
7498
|
}
|
|
7549
7499
|
for (const name of [".encryption.key.enc", ".runeya-verify"]) {
|
|
7550
|
-
if (await exists(
|
|
7551
|
-
await copyFile(
|
|
7500
|
+
if (await exists(join10(vaultRoot, name))) {
|
|
7501
|
+
await copyFile(join10(vaultRoot, name), join10(backupDir, name));
|
|
7552
7502
|
}
|
|
7553
7503
|
}
|
|
7554
7504
|
backups.push(backupDir);
|
|
@@ -7612,10 +7562,6 @@ async function assertOrgKey(orgId) {
|
|
|
7612
7562
|
function syncState(orgId) {
|
|
7613
7563
|
return cloudSyncBridge.states().find((s) => s.orgId === orgId)?.state ?? "stopped";
|
|
7614
7564
|
}
|
|
7615
|
-
async function syncLockHolder(orgId) {
|
|
7616
|
-
const pid = cloudSyncBridge.states().find((s) => s.orgId === orgId)?.heldByPid;
|
|
7617
|
-
return pid ? describeInstance(pid) : null;
|
|
7618
|
-
}
|
|
7619
7565
|
var cloudSyncRouter = router({
|
|
7620
7566
|
/**
|
|
7621
7567
|
* Follow one more project of an org, and pull it now.
|
|
@@ -7650,7 +7596,7 @@ var cloudSyncRouter = router({
|
|
|
7650
7596
|
}
|
|
7651
7597
|
try {
|
|
7652
7598
|
const pulled = await cloudSyncBridge.followProject(input.orgId, input.projectId);
|
|
7653
|
-
return { pulled, state: syncState(input.orgId)
|
|
7599
|
+
return { pulled, state: syncState(input.orgId) };
|
|
7654
7600
|
} catch (err) {
|
|
7655
7601
|
if (err instanceof ProjectHeldElsewhereError) {
|
|
7656
7602
|
throw new TRPCError19({ code: "CONFLICT", message: err.code, cause: err });
|
|
@@ -7987,9 +7933,8 @@ var cloudSyncRouter = router({
|
|
|
7987
7933
|
list: protectedProcedure.query(async () => {
|
|
7988
7934
|
const links = await orgsToSync();
|
|
7989
7935
|
const states = new Map(cloudSyncBridge.states().map((s) => [s.orgId, s]));
|
|
7990
|
-
return
|
|
7936
|
+
return links.map((l) => {
|
|
7991
7937
|
const found = states.get(l.orgId);
|
|
7992
|
-
const heldBy = found?.heldByPid ? await describeInstance(found.heldByPid) : null;
|
|
7993
7938
|
return {
|
|
7994
7939
|
orgId: l.orgId,
|
|
7995
7940
|
cloudUrl: l.cloudUrl,
|
|
@@ -7997,10 +7942,9 @@ var cloudSyncRouter = router({
|
|
|
7997
7942
|
// Renseigné seulement quand le cloud a refusé cette app comme trop
|
|
7998
7943
|
// ancienne : c'est lui qui publie le plancher, on ne le devine pas. La
|
|
7999
7944
|
// borne est exclusive — il faut strictement plus récent que ce numéro.
|
|
8000
|
-
lastIncompatibleVersion: found?.lastIncompatibleVersion ?? null
|
|
8001
|
-
heldBy
|
|
7945
|
+
lastIncompatibleVersion: found?.lastIncompatibleVersion ?? null
|
|
8002
7946
|
};
|
|
8003
|
-
})
|
|
7947
|
+
});
|
|
8004
7948
|
}),
|
|
8005
7949
|
/**
|
|
8006
7950
|
* The cloud instance behind every org vault on this machine.
|
|
@@ -8019,13 +7963,13 @@ var cloudSyncRouter = router({
|
|
|
8019
7963
|
// ../server/src/trpc/routers/filesystem.ts
|
|
8020
7964
|
import { readdir as readdir4, stat as stat6 } from "fs/promises";
|
|
8021
7965
|
import { homedir as homedir3 } from "os";
|
|
8022
|
-
import { isAbsolute, join as
|
|
7966
|
+
import { isAbsolute, join as join11, resolve as resolve2, dirname as dirname4, basename } from "path";
|
|
8023
7967
|
import { z as z24 } from "zod";
|
|
8024
7968
|
var MAX_ENTRIES2 = 500;
|
|
8025
7969
|
var PATH_SCHEMA = z24.string().min(1).max(4096);
|
|
8026
7970
|
function safeResolve(input) {
|
|
8027
7971
|
if (input.includes("\0")) throw new Error("Chemin invalide");
|
|
8028
|
-
const expanded = input.startsWith("~") ?
|
|
7972
|
+
const expanded = input.startsWith("~") ? join11(homedir3(), input.slice(1)) : input;
|
|
8029
7973
|
if (!isAbsolute(expanded)) throw new Error("Le chemin doit \xEAtre absolu");
|
|
8030
7974
|
return resolve2(expanded);
|
|
8031
7975
|
}
|
|
@@ -8061,7 +8005,7 @@ var filesystemRouter = router({
|
|
|
8061
8005
|
const truncated = names.length > MAX_ENTRIES2;
|
|
8062
8006
|
const entries2 = [];
|
|
8063
8007
|
for (const name of names.slice(0, MAX_ENTRIES2)) {
|
|
8064
|
-
const path =
|
|
8008
|
+
const path = join11(dir, name);
|
|
8065
8009
|
entries2.push({ name, path, hasRuneyaProject: await holdsRuneyaProject(path) });
|
|
8066
8010
|
}
|
|
8067
8011
|
return {
|
|
@@ -8322,8 +8266,8 @@ async function ensureFilePermissions() {
|
|
|
8322
8266
|
}
|
|
8323
8267
|
|
|
8324
8268
|
// ../server/src/services/vault-migration.ts
|
|
8325
|
-
import { readdir as readdir5, readFile as
|
|
8326
|
-
import { join as
|
|
8269
|
+
import { readdir as readdir5, readFile as readFile5, writeFile as writeFile7, mkdir as mkdir9, copyFile as copyFile2, unlink, rename as rename5, stat as stat8 } from "fs/promises";
|
|
8270
|
+
import { join as join12 } from "path";
|
|
8327
8271
|
var KEY_FILES = [".encryption.key.enc", ".runeya-verify"];
|
|
8328
8272
|
var MACHINE_FILES = [
|
|
8329
8273
|
"agents.json",
|
|
@@ -8353,17 +8297,17 @@ async function openLegacyVault(legacyRoot, masterPassword) {
|
|
|
8353
8297
|
}
|
|
8354
8298
|
async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machineKey, now) {
|
|
8355
8299
|
const stamp = now.toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
8356
|
-
const backupDir =
|
|
8357
|
-
await
|
|
8300
|
+
const backupDir = join12(legacyRoot, `backup-${stamp}`);
|
|
8301
|
+
await mkdir9(backupDir, { recursive: true });
|
|
8358
8302
|
const jsonFiles = await vaultJsonFiles(legacyRoot);
|
|
8359
8303
|
for (const name of [...jsonFiles, ...KEY_FILES]) {
|
|
8360
|
-
if (await exists2(
|
|
8361
|
-
await copyFile2(
|
|
8304
|
+
if (await exists2(join12(legacyRoot, name))) {
|
|
8305
|
+
await copyFile2(join12(legacyRoot, name), join12(backupDir, name));
|
|
8362
8306
|
}
|
|
8363
8307
|
}
|
|
8364
8308
|
const rekeyed = [];
|
|
8365
8309
|
for (const name of jsonFiles) {
|
|
8366
|
-
const raw = await
|
|
8310
|
+
const raw = await readFile5(join12(legacyRoot, name), "utf-8");
|
|
8367
8311
|
let parsed;
|
|
8368
8312
|
try {
|
|
8369
8313
|
parsed = JSON.parse(raw);
|
|
@@ -8373,13 +8317,13 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
|
|
|
8373
8317
|
const counter = { n: 0 };
|
|
8374
8318
|
const converted = rekeyValue(parsed, legacyKey, machineKey, counter);
|
|
8375
8319
|
if (counter.n === 0) continue;
|
|
8376
|
-
const tmp =
|
|
8320
|
+
const tmp = join12(legacyRoot, `${name}.tmp`);
|
|
8377
8321
|
await writeFile7(tmp, JSON.stringify(converted, null, 2), "utf-8");
|
|
8378
|
-
await rename5(tmp,
|
|
8322
|
+
await rename5(tmp, join12(legacyRoot, name));
|
|
8379
8323
|
rekeyed.push({ file: name, values: counter.n });
|
|
8380
8324
|
}
|
|
8381
8325
|
for (const { file, values } of rekeyed) {
|
|
8382
|
-
const parsed = JSON.parse(await
|
|
8326
|
+
const parsed = JSON.parse(await readFile5(join12(legacyRoot, file), "utf-8"));
|
|
8383
8327
|
const check = { n: 0 };
|
|
8384
8328
|
rekeyValue(parsed, machineKey, machineKey, check);
|
|
8385
8329
|
if (check.n !== values) {
|
|
@@ -8388,31 +8332,31 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
|
|
|
8388
8332
|
);
|
|
8389
8333
|
}
|
|
8390
8334
|
}
|
|
8391
|
-
await
|
|
8335
|
+
await mkdir9(machineRootDir, { recursive: true });
|
|
8392
8336
|
const moved = [];
|
|
8393
8337
|
const skipped = [];
|
|
8394
8338
|
for (const name of MACHINE_FILES) {
|
|
8395
|
-
const from =
|
|
8339
|
+
const from = join12(legacyRoot, name);
|
|
8396
8340
|
if (!await exists2(from)) continue;
|
|
8397
|
-
const to =
|
|
8341
|
+
const to = join12(machineRootDir, name);
|
|
8398
8342
|
if (await exists2(to)) {
|
|
8399
8343
|
skipped.push(name);
|
|
8400
8344
|
continue;
|
|
8401
8345
|
}
|
|
8402
8346
|
await copyFile2(from, to);
|
|
8403
|
-
await
|
|
8347
|
+
await unlink(from);
|
|
8404
8348
|
moved.push(name);
|
|
8405
8349
|
}
|
|
8406
8350
|
for (const name of KEY_FILES) {
|
|
8407
|
-
const path =
|
|
8408
|
-
if (await exists2(path)) await
|
|
8351
|
+
const path = join12(legacyRoot, name);
|
|
8352
|
+
if (await exists2(path)) await unlink(path);
|
|
8409
8353
|
}
|
|
8410
8354
|
return { backupDir, rekeyed, moved, skipped };
|
|
8411
8355
|
}
|
|
8412
8356
|
|
|
8413
8357
|
// ../server/src/services/settings-migration.ts
|
|
8414
|
-
import { readFile as
|
|
8415
|
-
import { join as
|
|
8358
|
+
import { readFile as readFile6, writeFile as writeFile8, rename as rename6, unlink as unlink2, mkdir as mkdir10, chmod as chmod4, stat as stat9 } from "fs/promises";
|
|
8359
|
+
import { join as join13 } from "path";
|
|
8416
8360
|
var SETTINGS_FILE = "settings.json";
|
|
8417
8361
|
var SETTINGS_PRIVATE_FILE = "settings.private.json";
|
|
8418
8362
|
async function exists3(path) {
|
|
@@ -8425,14 +8369,14 @@ async function legacySource(filename) {
|
|
|
8425
8369
|
return null;
|
|
8426
8370
|
}
|
|
8427
8371
|
async function moveInto(root, filename, from) {
|
|
8428
|
-
await
|
|
8429
|
-
const to =
|
|
8430
|
-
const contents = await
|
|
8372
|
+
await mkdir10(root, { recursive: true });
|
|
8373
|
+
const to = join13(root, filename);
|
|
8374
|
+
const contents = await readFile6(from, "utf-8");
|
|
8431
8375
|
const tmp = to + ".tmp";
|
|
8432
8376
|
await writeFile8(tmp, contents, "utf-8");
|
|
8433
8377
|
await rename6(tmp, to);
|
|
8434
8378
|
await chmod4(to, 384);
|
|
8435
|
-
await
|
|
8379
|
+
await unlink2(from);
|
|
8436
8380
|
}
|
|
8437
8381
|
async function migrateSettingsIntoVaults() {
|
|
8438
8382
|
const report = { movedTo: null, files: [], ambiguous: [] };
|
|
@@ -8451,7 +8395,7 @@ async function migrateSettingsIntoVaults() {
|
|
|
8451
8395
|
const orgId = orgs[0];
|
|
8452
8396
|
const root = orgVaultRoot(orgId);
|
|
8453
8397
|
for (const { filename, from } of sources) {
|
|
8454
|
-
if (await exists3(
|
|
8398
|
+
if (await exists3(join13(root, filename))) continue;
|
|
8455
8399
|
await moveInto(root, filename, from);
|
|
8456
8400
|
report.files.push(filename);
|
|
8457
8401
|
}
|
|
@@ -8467,14 +8411,14 @@ import { createRequire } from "module";
|
|
|
8467
8411
|
import { randomBytes as randomBytes3, createCipheriv as createCipheriv3, createDecipheriv as createDecipheriv3 } from "crypto";
|
|
8468
8412
|
import { randomUUID as randomUUID6 } from "crypto";
|
|
8469
8413
|
import {
|
|
8470
|
-
readFile as
|
|
8414
|
+
readFile as readFile7,
|
|
8471
8415
|
writeFile as writeFile9,
|
|
8472
8416
|
rename as rename7,
|
|
8473
|
-
mkdir as
|
|
8417
|
+
mkdir as mkdir11,
|
|
8474
8418
|
access as access2,
|
|
8475
8419
|
readdir as readdir6
|
|
8476
8420
|
} from "fs/promises";
|
|
8477
|
-
import { join as
|
|
8421
|
+
import { join as join14, dirname as dirname5 } from "path";
|
|
8478
8422
|
var _require = createRequire(import.meta.url);
|
|
8479
8423
|
var PARSER_ID_MAP = {
|
|
8480
8424
|
"stack-monitor-parser-jsons": "native:json",
|
|
@@ -8591,7 +8535,7 @@ async function getSodium() {
|
|
|
8591
8535
|
return _sodium;
|
|
8592
8536
|
}
|
|
8593
8537
|
async function decryptLegacyFile(filePath, key, sodium) {
|
|
8594
|
-
const raw = (await
|
|
8538
|
+
const raw = (await readFile7(filePath, "utf-8")).trim();
|
|
8595
8539
|
if (!raw || raw === "[]" || raw === "{}") {
|
|
8596
8540
|
try {
|
|
8597
8541
|
return JSON.parse(raw);
|
|
@@ -8616,7 +8560,7 @@ async function atomicWrite(path, data) {
|
|
|
8616
8560
|
}
|
|
8617
8561
|
async function runLegacyMigration(dataDir) {
|
|
8618
8562
|
const legacyRoot = env.DATA_DIR;
|
|
8619
|
-
const legacyKeyPath =
|
|
8563
|
+
const legacyKeyPath = join14(legacyRoot, "dbs", "encryption-key.json");
|
|
8620
8564
|
try {
|
|
8621
8565
|
await access2(legacyKeyPath);
|
|
8622
8566
|
} catch {
|
|
@@ -8626,18 +8570,18 @@ async function runLegacyMigration(dataDir) {
|
|
|
8626
8570
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
8627
8571
|
const legacyTmp = `${legacyRoot}-tmp`;
|
|
8628
8572
|
await rename7(legacyRoot, legacyTmp);
|
|
8629
|
-
await
|
|
8630
|
-
const legacyOld =
|
|
8573
|
+
await mkdir11(dataDir, { recursive: true });
|
|
8574
|
+
const legacyOld = join14(dataDir, `backup-${timestamp}`);
|
|
8631
8575
|
await rename7(legacyTmp, legacyOld);
|
|
8632
8576
|
console.log(`[legacy-migration] Legacy data backed up to ${legacyOld}`);
|
|
8633
|
-
const keyJson = JSON.parse(await
|
|
8577
|
+
const keyJson = JSON.parse(await readFile7(join14(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
|
|
8634
8578
|
const sodium = await getSodium();
|
|
8635
8579
|
const sodiumKey = sodium.from_base64(keyJson.encryptionKey);
|
|
8636
8580
|
const keyBuffer = Buffer.from(sodiumKey);
|
|
8637
8581
|
const runyeaKeyHex = keyBuffer.toString("hex");
|
|
8638
8582
|
await setEncryptionKey(runyeaKeyHex);
|
|
8639
8583
|
console.log("[legacy-migration] Encryption key loaded in memory (temporary)");
|
|
8640
|
-
const dbsDir =
|
|
8584
|
+
const dbsDir = join14(legacyOld, "dbs");
|
|
8641
8585
|
async function readEncrypted(filePath) {
|
|
8642
8586
|
try {
|
|
8643
8587
|
return await decryptLegacyFile(filePath, sodiumKey, sodium);
|
|
@@ -8646,29 +8590,29 @@ async function runLegacyMigration(dataDir) {
|
|
|
8646
8590
|
return null;
|
|
8647
8591
|
}
|
|
8648
8592
|
}
|
|
8649
|
-
const envsDir =
|
|
8593
|
+
const envsDir = join14(dbsDir, "envs");
|
|
8650
8594
|
const envFiles = (await readdir6(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
8651
8595
|
const legacyEnvs = {};
|
|
8652
8596
|
for (const file of envFiles) {
|
|
8653
8597
|
const name = file.replace(".encrypted.json", "");
|
|
8654
|
-
legacyEnvs[name] = await readEncrypted(
|
|
8598
|
+
legacyEnvs[name] = await readEncrypted(join14(envsDir, file));
|
|
8655
8599
|
}
|
|
8656
|
-
const servicesDir =
|
|
8600
|
+
const servicesDir = join14(dbsDir, "services");
|
|
8657
8601
|
const serviceFiles = (await readdir6(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
8658
8602
|
const legacyServices = {};
|
|
8659
8603
|
for (const file of serviceFiles) {
|
|
8660
8604
|
const name = file.replace(".encrypted.json", "");
|
|
8661
8605
|
if (!name) continue;
|
|
8662
|
-
const data = await readEncrypted(
|
|
8606
|
+
const data = await readEncrypted(join14(servicesDir, file));
|
|
8663
8607
|
if (data?.label) legacyServices[name] = data;
|
|
8664
8608
|
}
|
|
8665
|
-
const overridesDir =
|
|
8609
|
+
const overridesDir = join14(dbsDir, "overrides");
|
|
8666
8610
|
const overrideFiles = (await readdir6(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
8667
8611
|
const legacyServiceOverrides = {};
|
|
8668
8612
|
const legacyEnvOverrides = {};
|
|
8669
8613
|
for (const file of overrideFiles) {
|
|
8670
8614
|
const baseName = file.replace(".encrypted.json", "");
|
|
8671
|
-
const data = await readEncrypted(
|
|
8615
|
+
const data = await readEncrypted(join14(overridesDir, file));
|
|
8672
8616
|
if (!data) continue;
|
|
8673
8617
|
if (baseName.endsWith("-envs")) {
|
|
8674
8618
|
legacyServiceOverrides[baseName.slice(0, -5)] = data;
|
|
@@ -8676,11 +8620,11 @@ async function runLegacyMigration(dataDir) {
|
|
|
8676
8620
|
legacyEnvOverrides[baseName.slice(0, -12)] = data;
|
|
8677
8621
|
}
|
|
8678
8622
|
}
|
|
8679
|
-
const parsersDir =
|
|
8623
|
+
const parsersDir = join14(dbsDir, "parsers");
|
|
8680
8624
|
const parserFiles = (await readdir6(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
8681
8625
|
const legacyParsers = [];
|
|
8682
8626
|
for (const file of parserFiles) {
|
|
8683
|
-
const data = await readEncrypted(
|
|
8627
|
+
const data = await readEncrypted(join14(parsersDir, file));
|
|
8684
8628
|
if (data?.id) legacyParsers.push(data);
|
|
8685
8629
|
}
|
|
8686
8630
|
const projectMonoId = randomUUID6();
|
|
@@ -9021,7 +8965,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
9021
8965
|
}
|
|
9022
8966
|
let existingSettings = {};
|
|
9023
8967
|
try {
|
|
9024
|
-
existingSettings = JSON.parse(await
|
|
8968
|
+
existingSettings = JSON.parse(await readFile7(join14(dataDir, "settings.json"), "utf-8"));
|
|
9025
8969
|
} catch {
|
|
9026
8970
|
}
|
|
9027
8971
|
const migratedParsers = legacyParsers.map((p) => ({
|
|
@@ -9042,11 +8986,11 @@ ${p.transform ?? ""}`,
|
|
|
9042
8986
|
...migratedParsers
|
|
9043
8987
|
]
|
|
9044
8988
|
};
|
|
9045
|
-
await atomicWrite(
|
|
9046
|
-
await atomicWrite(
|
|
9047
|
-
await atomicWrite(
|
|
9048
|
-
await atomicWrite(
|
|
9049
|
-
await atomicWrite(
|
|
8989
|
+
await atomicWrite(join14(dataDir, "projects.json"), runeProjects);
|
|
8990
|
+
await atomicWrite(join14(dataDir, "services.json"), runeServices);
|
|
8991
|
+
await atomicWrite(join14(dataDir, "environments.json"), runeEnvs);
|
|
8992
|
+
await atomicWrite(join14(dataDir, "environment-overrides.json"), flatOverrides);
|
|
8993
|
+
await atomicWrite(join14(dataDir, "settings.json"), newSettings);
|
|
9050
8994
|
const svcEnvCount = runeEnvs.filter((e) => e.scope === "service").length;
|
|
9051
8995
|
console.log(`[legacy-migration] Written: ${runeProjects.length} projects, ${runeServices.length} services, ${runeEnvs.length} environments (${svcEnvCount} service-scoped)`);
|
|
9052
8996
|
console.log(`[legacy-migration] Overrides: ${Object.keys(flatOverrides).length}, custom parsers: ${migratedParsers.length} (all disabled \u2014 rewrite required)`);
|
|
@@ -9060,9 +9004,9 @@ async function findLegacyKeyInBackup(dataDir) {
|
|
|
9060
9004
|
const entries2 = await readdir6(dataDir);
|
|
9061
9005
|
const backupDirs = entries2.filter((e) => e.startsWith("backup-")).sort((a, b) => a < b ? -1 : a > b ? 1 : 0).reverse();
|
|
9062
9006
|
for (const dir of backupDirs) {
|
|
9063
|
-
const keyJsonPath =
|
|
9007
|
+
const keyJsonPath = join14(dataDir, dir, "dbs", "encryption-key.json");
|
|
9064
9008
|
try {
|
|
9065
|
-
const raw = await
|
|
9009
|
+
const raw = await readFile7(keyJsonPath, "utf-8");
|
|
9066
9010
|
const parsed = JSON.parse(raw);
|
|
9067
9011
|
if (!parsed.encryptionKey) continue;
|
|
9068
9012
|
const sodium = await getSodium();
|
|
@@ -9083,8 +9027,8 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9083
9027
|
const { resolve: resolve4 } = await import("path");
|
|
9084
9028
|
const abDataDir = resolve4(dataDir);
|
|
9085
9029
|
const candidateDirs = [
|
|
9086
|
-
|
|
9087
|
-
|
|
9030
|
+
join14(dirname5(env.DATA_DIR), ".runeya", "dbs", "overrides"),
|
|
9031
|
+
join14(abDataDir, "dbs", "overrides")
|
|
9088
9032
|
];
|
|
9089
9033
|
let overridesDir = null;
|
|
9090
9034
|
let overrideFiles = [];
|
|
@@ -9100,7 +9044,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9100
9044
|
}
|
|
9101
9045
|
}
|
|
9102
9046
|
if (!overridesDir || overrideFiles.length === 0) return false;
|
|
9103
|
-
const legacyKeyPath =
|
|
9047
|
+
const legacyKeyPath = join14(overridesDir, "..", "encryption-key.json");
|
|
9104
9048
|
try {
|
|
9105
9049
|
await access2(legacyKeyPath);
|
|
9106
9050
|
return false;
|
|
@@ -9118,7 +9062,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9118
9062
|
const envNameToId = {};
|
|
9119
9063
|
let envsRaw;
|
|
9120
9064
|
try {
|
|
9121
|
-
envsRaw = JSON.parse(await
|
|
9065
|
+
envsRaw = JSON.parse(await readFile7(join14(abDataDir, "environments.json"), "utf-8"));
|
|
9122
9066
|
for (const _env of envsRaw) {
|
|
9123
9067
|
const env2 = _env;
|
|
9124
9068
|
if (env2["name"] && env2["id"]) {
|
|
@@ -9137,7 +9081,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9137
9081
|
let servicesRaw = [];
|
|
9138
9082
|
const serviceNameToId = {};
|
|
9139
9083
|
try {
|
|
9140
|
-
servicesRaw = JSON.parse(await
|
|
9084
|
+
servicesRaw = JSON.parse(await readFile7(join14(abDataDir, "services.json"), "utf-8"));
|
|
9141
9085
|
for (const _svc of servicesRaw) {
|
|
9142
9086
|
const svc = _svc;
|
|
9143
9087
|
if (svc["name"] && svc["id"]) serviceNameToId[svc["name"]] = svc["id"];
|
|
@@ -9154,7 +9098,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9154
9098
|
const envName = baseName.slice(0, -"-environment".length);
|
|
9155
9099
|
let data;
|
|
9156
9100
|
try {
|
|
9157
|
-
data = await decryptLegacyFile(
|
|
9101
|
+
data = await decryptLegacyFile(join14(overridesDir, file), sodiumKey, sodium);
|
|
9158
9102
|
} catch (err) {
|
|
9159
9103
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
9160
9104
|
continue;
|
|
@@ -9181,7 +9125,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9181
9125
|
}
|
|
9182
9126
|
}
|
|
9183
9127
|
if (Object.keys(flatOverrides).length > 0) {
|
|
9184
|
-
await atomicWrite(
|
|
9128
|
+
await atomicWrite(join14(abDataDir, "environment-overrides.json"), flatOverrides);
|
|
9185
9129
|
console.log(`[override-migration] Written ${Object.keys(flatOverrides).length} override(s) to environment-overrides.json`);
|
|
9186
9130
|
}
|
|
9187
9131
|
let envsModified = false;
|
|
@@ -9191,7 +9135,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9191
9135
|
const serviceName = baseName.slice(0, -"-envs".length);
|
|
9192
9136
|
let data;
|
|
9193
9137
|
try {
|
|
9194
|
-
data = await decryptLegacyFile(
|
|
9138
|
+
data = await decryptLegacyFile(join14(overridesDir, file), sodiumKey, sodium);
|
|
9195
9139
|
} catch (err) {
|
|
9196
9140
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
9197
9141
|
continue;
|
|
@@ -9250,7 +9194,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9250
9194
|
}
|
|
9251
9195
|
}
|
|
9252
9196
|
if (envsModified) {
|
|
9253
|
-
await atomicWrite(
|
|
9197
|
+
await atomicWrite(join14(abDataDir, "environments.json"), envsRaw);
|
|
9254
9198
|
console.log("[override-migration] Merged service overrides into environments.json");
|
|
9255
9199
|
}
|
|
9256
9200
|
const migratedDir = overridesDir.replace(/overrides$/, "overrides-migrated");
|
|
@@ -9265,7 +9209,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9265
9209
|
}
|
|
9266
9210
|
|
|
9267
9211
|
// ../server/src/services/server-state.ts
|
|
9268
|
-
import { join as
|
|
9212
|
+
import { join as join15 } from "path";
|
|
9269
9213
|
import { stat as stat10 } from "fs/promises";
|
|
9270
9214
|
var ENCRYPTED_KEY_FILENAME2 = ".encryption.key.enc";
|
|
9271
9215
|
var VERIFY_FILENAME2 = ".runeya-verify";
|
|
@@ -9275,22 +9219,22 @@ async function getServerState() {
|
|
|
9275
9219
|
let hasVerify = false;
|
|
9276
9220
|
let hasData = false;
|
|
9277
9221
|
try {
|
|
9278
|
-
await stat10(
|
|
9222
|
+
await stat10(join15(dataDir, ENCRYPTED_KEY_FILENAME2));
|
|
9279
9223
|
hasEncFile = true;
|
|
9280
9224
|
} catch {
|
|
9281
9225
|
}
|
|
9282
9226
|
try {
|
|
9283
|
-
await stat10(
|
|
9227
|
+
await stat10(join15(dataDir, VERIFY_FILENAME2));
|
|
9284
9228
|
hasVerify = true;
|
|
9285
9229
|
} catch {
|
|
9286
9230
|
}
|
|
9287
9231
|
try {
|
|
9288
|
-
await stat10(
|
|
9232
|
+
await stat10(join15(dataDir, "projects.json"));
|
|
9289
9233
|
hasData = true;
|
|
9290
9234
|
} catch {
|
|
9291
9235
|
}
|
|
9292
9236
|
try {
|
|
9293
|
-
await stat10(
|
|
9237
|
+
await stat10(join15(dataDir, "project.json"));
|
|
9294
9238
|
hasData = true;
|
|
9295
9239
|
} catch {
|
|
9296
9240
|
}
|
|
@@ -10442,7 +10386,7 @@ async function createLocalServer() {
|
|
|
10442
10386
|
]);
|
|
10443
10387
|
console.log("[server] Shutdown complete");
|
|
10444
10388
|
};
|
|
10445
|
-
const { initCompanion } = await import("./companion-
|
|
10389
|
+
const { initCompanion } = await import("./companion-AUMA6RGX.js");
|
|
10446
10390
|
initCompanion();
|
|
10447
10391
|
return { app, server, wss, shutdown };
|
|
10448
10392
|
}
|
|
@@ -10572,8 +10516,8 @@ function onTrayServicesChanged(listener) {
|
|
|
10572
10516
|
}
|
|
10573
10517
|
|
|
10574
10518
|
// ../server/src/services/tray-icon.ts
|
|
10575
|
-
import { mkdir as
|
|
10576
|
-
import { join as
|
|
10519
|
+
import { mkdir as mkdir12, writeFile as writeFile10, rename as rename8 } from "fs/promises";
|
|
10520
|
+
import { join as join16 } from "path";
|
|
10577
10521
|
|
|
10578
10522
|
// ../server/src/services/png-to-ico.ts
|
|
10579
10523
|
function isPng(bytes) {
|
|
@@ -10733,7 +10677,7 @@ var FETCH_TIMEOUT_MS = 3e3;
|
|
|
10733
10677
|
var CACHE_TTL_MS = 10 * 6e4;
|
|
10734
10678
|
var cache2 = /* @__PURE__ */ new Map();
|
|
10735
10679
|
function trayIconDir() {
|
|
10736
|
-
return
|
|
10680
|
+
return join16(machineRoot(), "tray-icons");
|
|
10737
10681
|
}
|
|
10738
10682
|
async function resolveTrayIcon(platform = process.platform) {
|
|
10739
10683
|
const orgId = getCurrentProject()?.orgId;
|
|
@@ -10761,8 +10705,8 @@ async function renderThemedIcon(platform) {
|
|
|
10761
10705
|
}
|
|
10762
10706
|
async function writeTrayIcon(stem, png, platform) {
|
|
10763
10707
|
const dir = trayIconDir();
|
|
10764
|
-
await
|
|
10765
|
-
const path =
|
|
10708
|
+
await mkdir12(dir, { recursive: true });
|
|
10709
|
+
const path = join16(dir, stem);
|
|
10766
10710
|
if (platform === "win32") {
|
|
10767
10711
|
const ico = pngToIco(png);
|
|
10768
10712
|
return ico ? writeAtomic(`${path}.ico`, ico) : null;
|
|
@@ -10889,4 +10833,4 @@ export {
|
|
|
10889
10833
|
startProcess,
|
|
10890
10834
|
stopProcess
|
|
10891
10835
|
};
|
|
10892
|
-
//# sourceMappingURL=src-
|
|
10836
|
+
//# sourceMappingURL=src-JIS3X4OU.js.map
|