@runeya/runeya 2.0.120 → 2.0.122
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-BSPEFZKZ.js +10 -0
- package/{chat-PXMMZIAY.js → chat-SE5GIT4B.js} +7 -6
- package/{chunk-22RJM654.js → chunk-BVBK2WII.js} +155 -157
- package/chunk-BVBK2WII.js.map +1 -0
- package/chunk-GL7WA5K3.js +92 -0
- package/chunk-GL7WA5K3.js.map +1 -0
- package/{chunk-GIHR3BGT.js → chunk-NIU3CN5A.js} +37 -17
- package/chunk-NIU3CN5A.js.map +1 -0
- package/{chunk-H6VIS4OY.js → chunk-T2BV5WZE.js} +18 -3
- package/chunk-T2BV5WZE.js.map +1 -0
- package/{chunk-NYKFDU76.js → chunk-VNLIA5PV.js} +137 -59
- package/chunk-VNLIA5PV.js.map +1 -0
- package/{chunk-2WXQIUVC.js → chunk-XTLQOYLT.js} +147 -81
- package/chunk-XTLQOYLT.js.map +1 -0
- package/{companion-4RQ3AMOL.js → companion-HEJHC3UR.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-4GAINSJO.js +10 -0
- package/{src-NRKK27F3.js → src-YUVA6WCM.js} +259 -172
- package/src-YUVA6WCM.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-CdapdMgo.js → EditorIcon-LCl9V_-a.js} +2 -2
- package/web/assets/{EnvironmentForm-Dgrt5I5N.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-DRyD5bQg.js → ProcessControls-PKQWukd7.js} +1 -1
- package/web/assets/ProcessDetailPage-DhFoi4DT.js +1 -0
- package/web/assets/{ProcessMetrics-D5SgFgFU.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-ByrzVX5h.js → autocomplete-DMfvn4sK.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-h2koobo1.js → basic-shape-diamond.svg-B5H1r2bp.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg--IMj5O6H.js → basic-shape-hexagon.svg-CYAjKF0z.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-B0JqtIPK.js → basic-shape-primary-circle-ellipse-round.svg-CgleCAf-.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-nMUFcz3q.js → basic-shape-primary-square-rectangle.svg-1Oa48Hhs.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-B01_o2Y1.js → basic-shape-shield.svg-F6dZwVUJ.js} +1 -1
- package/web/assets/{browser-OPkfGEHD.js → browser-CmPAWcJ7.js} +1 -1
- package/web/assets/{browser-DcLBGCAS.js → browser-D3KJ0m2n.js} +1 -1
- package/web/assets/card-Ciw7uU90.js +32 -0
- package/web/assets/{checkbox-DGCPu95-.js → checkbox-BCCx0Nu6.js} +3 -3
- package/web/assets/{chip-Chk5tAnb.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-CnTOFA6T.js → cloud-session-CZWto5y3.js} +2 -2
- package/web/assets/column-DSBHw97f.js +763 -0
- package/web/assets/{computer-device-desktop-monitor.svg-CfTbcAFd.js → computer-device-desktop-monitor.svg-D7wu2cQ4.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-Cl-xv361.js → computer-device-desktop.svg-BtVwjOEG.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-ukRjIyMq.js → computer-device-laptop.svg-f3tFeUHj.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-CoDvI0SU.js → computer-device-mobile-phone-android-samsung-back.svg-CmJcGkrL.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BQWjk4Zt.js → computer-device-mobile-phone-android-samsung.svg-C2ke6Sbg.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-DAoSG317.js → computer-device-mobile-phone-iphone-x-back.svg-DxMqUXKE.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-BPjvW-EA.js → computer-device-mobile-phone-iphone-x.svg-DkbKlrh8.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-BYEFFDGJ.js → computer-device-mobile-tablet-touch.svg-DP0uXMda.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-DNLPmtgI.js → computer-device-mobile-tablet.svg-C064ZFQm.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-BLWV1j_N.js → computer-device-network-ethernet-cat6.svg-Dwzl7zBN.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-BOoU0zpo.js → computer-device-network-lan-www.svg-BgErom5w.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-DGwn0IjA.js → computer-device-network-wifi-connection.svg-ByqNsV6y.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-C5g_K48A.js → computer-device-network-wifi-router.svg-AySGITbi.js} +1 -1
- package/web/assets/{cssMode-Cx5qrxXy.js → cssMode-BqrZ4SB-.js} +1 -1
- package/web/assets/{divider-BrS14lDG.js → divider-BswZTb8q.js} +2 -2
- package/web/assets/{docx-preview-DAPpQjxw.js → docx-preview-t_oOha_C.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-DomVqm74.js → ecology-science-erlenmeyer-flask.svg-Keg4ZY0z.js} +1 -1
- package/web/assets/{fieldset-C0CmkHzJ.js → fieldset-DaWy9FsL.js} +2 -2
- package/web/assets/{freemarker2-183f16_T.js → freemarker2-Br0kiufp.js} +1 -1
- package/web/assets/{handlebars-Ck2u5MRS.js → handlebars-BrATzKUL.js} +1 -1
- package/web/assets/{html-RFHCet7g.js → html-LWTJcTM2.js} +1 -1
- package/web/assets/{htmlMode-MLvTePcj.js → htmlMode-A23pWfMP.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-C_9EqK2Z.js → image-flash-lightning.svg-uQfoT6Ex.js} +1 -1
- package/web/assets/{image-picture-flower.svg-Cw0p4SDa.js → image-picture-flower.svg-XxD1bCHC.js} +1 -1
- package/web/assets/{index-De7vzwYE.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-D_7jQp52.js → interface-alert-exclamation-diamond.svg-gQAlkILu.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-slrQHD7Z.js → interface-alert-exclamation-triangle-warning.svg-Ga2rsl6o.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-D6HZsCxj.js → interface-alert-information-circle.svg-BS0N2R1M.js} +1 -1
- package/web/assets/{interface-award-crown.svg-C8KlpCo8.js → interface-award-crown.svg-CtLbK4Gl.js} +1 -1
- package/web/assets/{interface-bookmark.svg-CcHEFyZI.js → interface-bookmark-tag.svg-Dfd6eXAX.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-4m7iWpFd.js → interface-bookmark.svg-Clt6TTov.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-B-NpBZQW.js → interface-calendar-date-one.svg-BmFNLrzR.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-D6JSr0DE.js → interface-content-book-open-pages.svg-u8kJbc3N.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-4JwHKP99.js → interface-content-book-page.svg-Csk8d0R8.js} +1 -1
- package/web/assets/{interface-content-file.svg-dDsVtuW0.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-VlaIOWsg.js → interface-content-folder.svg-ipO7hYM2.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-C8NaVJTP.js → interface-copy-clipboard.svg-BaK2fHKS.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-DLv3r8Ta.js → interface-edit-attachment.svg-CrpyP6c6.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-Dn_isC0z.js → interface-edit-binocular.svg-Cw-YeqUQ.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-D7nDtfWR.js → interface-edit-magic-wand.svg-BPa49t_4.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-pvqfHBhq.js → interface-edit-tool-paint-roller.svg-Cfag7vxY.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-65sH97q4.js → interface-edit-tool-pencil.svg-BNAmX0d_.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-ByKr9sn6.js → interface-favorite-award.svg-CIMvocAv.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-Dw-AP2Bq.js → interface-favorite-flag.svg-8C3GXK06.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-B_rIv8ZF.js → interface-favorite-heart.svg-CEU_IALn.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-DdSC1aGg.js → interface-favorite-star.svg-Bs0RUtgk.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-B2P_fEQm.js → interface-favorite-stars-sparkles.svg-CZYZ5qkH.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-Dn7xVcha.js → interface-hierarchy-flowchart.svg-DOgEXHV2.js} +1 -1
- package/web/assets/{interface-home-house.svg-CPV7dtoL.js → interface-home-house.svg-lDERGk8q.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-BxEpW0yS.js → interface-hyperlink.svg-CAZrs64U.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-CHwx5muE.js → interface-lighting-brightness.svg-CVANBB7i.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-Ct9YyvGT.js → interface-lock-closed.svg-qDLyceL-.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-DuuZ9seB.js → interface-lock-open-unlock.svg-Bc-cq6eU.js} +1 -1
- package/web/assets/{interface-login-key.svg-DwQq_1hs.js → interface-login-key.svg-D6wZBYEi.js} +1 -1
- package/web/assets/{interface-search.svg-Cd9FPHXP.js → interface-search.svg-BVM6kkvA.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-C2oUvcZk.js → interface-setting-cog.svg-uJYqlmKx.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-D_sqPbcr.js → interface-share-megaphone-bullhorn.svg-CgBVBu7Z.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-DHw9o1DN.js → interface-share-rocket.svg-C1iCXMlX.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-CYuWbhdH.js → interface-share-satellite.svg-uH-Cvq9d.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-CsQbvDGw.js → interface-share-space-ship.svg-81lauyV5.js} +1 -1
- package/web/assets/{interface-share.svg-CxR58P36.js → interface-share.svg-DO85t-F0.js} +1 -1
- package/web/assets/{interface-signal-square.svg-BFCAMIlM.js → interface-signal-square.svg-CFAni6lY.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-BMtmcI_Z.js → interface-time-clock-circle.svg-BUQfluh7.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-F_74mbfe.js → interface-time-hour-glass.svg-BAZDU-C5.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-GqG3hBlb.js → interface-users-multiple.svg-Bj0AvF2-.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-By26aJ-s.js → interface-weather-moon.svg-Cxz-5thD.js} +1 -1
- package/web/assets/{javascript-DWG-shUz.js → javascript-CuP68vN5.js} +1 -1
- package/web/assets/{jsonMode-c7o5Rqeq.js → jsonMode-CdGjze9r.js} +1 -1
- package/web/assets/{liquid-DqJ-7gUQ.js → liquid-fJJZPdJb.js} +1 -1
- package/web/assets/{lspLanguageFeatures-C_r6rVue.js → lspLanguageFeatures-YzzH9q9a.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-1OECQtwZ.js → mail-chat-bubble-square.svg-DY1-sN8v.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-DGa9kXqg.js → mail-send-email-paper-airplane.svg-6zVEUG2-.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-DOnW83Qn.js → mail-send-envelope.svg-DNpA7Auy.js} +1 -1
- package/web/assets/{mdx-BmXiyjsf.js → mdx-CphM-wvX.js} +1 -1
- package/web/assets/{minus-Bva6o6mu.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-C9S8E9Gs.js → money-cashier-receipt.svg-ChxLUMT0.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-CXNYqgJd.js → money-currency-dollar-pay.svg-CcPdfv1E.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-DVTCnF_9.js → money-graph-arrow-increase.svg-BsmXO8yM.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-CIlyGCUY.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-xc6FzauK.js → nature-ecology-leaf.svg-nzup63P6.js} +1 -1
- package/web/assets/{password-B_HLITFe.js → password-CCYLOu-C.js} +4 -4
- package/web/assets/{phone-telephone.svg-D6y6im-g.js → phone-telephone.svg-BLtgdZw-.js} +1 -1
- package/web/assets/{plus-DJr2QEgS.js → plus-jk73RdzY.js} +5 -5
- package/web/assets/process.store-jsfEBwiA.js +1 -0
- package/web/assets/{programming-bug.svg-jKhqPvQ0.js → programming-bug.svg-BCN6lOn1.js} +1 -1
- package/web/assets/{programming-cloud.svg-C1_us4-8.js → programming-cloud.svg-DHNBRNkQ.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-C_8mq7k2.js → programming-computer-database-server.svg-C4DheEbm.js} +1 -1
- package/web/assets/{programming-computer-database.svg-Cc445gb5.js → programming-computer-database.svg-cD2w2ZZ6.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-B5fbcAO3.js → programming-module-four-layout.svg-D6_P2rTG.js} +1 -1
- package/web/assets/{programming-module-three.svg-J7fncT0c.js → programming-module-three.svg-Dc076Z_f.js} +1 -1
- package/web/assets/{programming-module.svg-BVjzZRgZ.js → programming-module.svg-D0c9akII.js} +1 -1
- package/web/assets/{programming-script-code.svg-By609kb5.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-jVn8dPRY.js → python-DMw-TRDY.js} +1 -1
- package/web/assets/{radiobutton-erK19fCL.js → radiobutton-CnoEo0qc.js} +2 -2
- package/web/assets/{razor-BJoJ2H1P.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-CcYfFedF.js → settings.store-DeGpnclr.js} +1 -1
- package/web/assets/{shopping-cart.svg-a8Rjk8rK.js → shopping-cart.svg-pvFNKXP_.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-BIN9jnEb.js → shopping-gift-present.svg-PYJ4_vdS.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-05MVPg3v.js → shopping-shipping-box-parcel-package.svg-KMRd9Rmg.js} +1 -1
- package/web/assets/src-BsadAol0.js +572 -0
- package/web/assets/{src-DCcw9sU3.css → src-DU1mBjF-.css} +1 -1
- package/web/assets/src-NXursDRf.js +1 -0
- package/web/assets/{tabpanel-BIAV4aKH.js → tabpanel-CKudNnqo.js} +3 -3
- package/web/assets/{tag-new-circle.svg-ehKpryNe.js → tag-new-circle.svg-Bf83DYRq.js} +1 -1
- package/web/assets/theme-D6M00FyZ.js +1 -0
- package/web/assets/{toggleswitch-qhHjeH7s.js → toggleswitch-Cv0supU2.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-D0Dk72so.js → travel-map-earth-globe.svg-WxnFDzEH.js} +1 -1
- package/web/assets/trpc-mWVODCs2.js +1 -0
- package/web/assets/{tsMode-B-s4JVyR.js → tsMode-CfruLmor.js} +5 -5
- package/web/assets/{typescript-CToySho3.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-DOTcwa9I.js → useProjectCloudOrg-BwLsTiz0.js} +1 -1
- package/web/assets/useServiceUrlHost-CE4Qoy-J.js +1 -0
- package/web/assets/{xml-BMt9wg3H.js → xml-BTID20Kj.js} +1 -1
- package/web/assets/{yaml-RmzWffCM.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-Lgml1vhh.js +0 -13
- package/web/assets/AgentTerminalPage-CwxbyQxm.js +0 -1
- package/web/assets/AiChatPage-CknE-NOo.js +0 -1
- package/web/assets/AppLayout-DT6bb__K.js +0 -1
- package/web/assets/AuditPage-DzK5Tp3Z.js +0 -1
- package/web/assets/CloudAccountPage-BDQpVEAX.js +0 -1
- package/web/assets/CloudAccountPage-CWdxZvAC.js +0 -1
- package/web/assets/CloudAccountPage-CfMY69pk.css +0 -1
- package/web/assets/CloudMessagingPage-BX0QPzkR.js +0 -2
- package/web/assets/DashboardPage-BNBzT2zb.js +0 -164
- package/web/assets/DirectoryPickerDialog-ZT-tL_4A.js +0 -1
- package/web/assets/EnvironmentFormPage-B7uerFJ0.js +0 -1
- package/web/assets/EnvironmentListPage-tTe_1yh-.js +0 -1
- package/web/assets/KanbanBoardPage-DTZVqxd6.js +0 -4
- package/web/assets/KanbanListPage-C5rbZ1eL.css +0 -1
- package/web/assets/KanbanListPage-D82HSRy7.js +0 -1
- package/web/assets/LaunchProjectPage-DgaslasQ.js +0 -1
- package/web/assets/LaunchServicesPage-I2HCqujc.js +0 -1
- package/web/assets/LogViewer-CYuoSJAN.js +0 -3
- package/web/assets/OrgKeyPrompt-Asz6FlrN.js +0 -1
- package/web/assets/ProcessDetailPage-DHmTCgj8.js +0 -1
- package/web/assets/RandomJobTestPage-COLLiJzt.js +0 -2
- package/web/assets/ScenarioEditorPage-rDIB08Ap.js +0 -14
- package/web/assets/SendToChatDialog-BvUmZhUU.js +0 -1
- package/web/assets/ServiceControlsBar-DGTsbA5Q.js +0 -1
- package/web/assets/ServiceDetailPage-Ddko3DNN.js +0 -2
- package/web/assets/ServiceFormPage-oVVmtWjt.js +0 -1
- package/web/assets/SettingsPage-BcQruhk1.js +0 -2063
- package/web/assets/UnlockPage-CpysPhlT.css +0 -1
- package/web/assets/UnlockPage-OH7UV01L.js +0 -1
- package/web/assets/VaultMigrationPage-B4a0WihW.js +0 -1
- package/web/assets/VersionBadge-URtOAd5L.js +0 -1
- package/web/assets/WikiPage-BotpKBAY.js +0 -1
- package/web/assets/WikiView-DQCs79lu.js +0 -1
- package/web/assets/add-scalar-classes-CnAomA8D.js +0 -387
- package/web/assets/card-C3Xots9M.js +0 -32
- package/web/assets/client-CbBJUuyt.js +0 -24
- package/web/assets/cloud-chat.store-COR3nnYR.js +0 -1
- package/web/assets/cloud-client-DZFY1sze.js +0 -1
- package/web/assets/cloud-session-CCJUvzk1.js +0 -1
- package/web/assets/column-ROcesBUs.js +0 -763
- package/web/assets/interface-content-folder.svg-CagI3wg0.js +0 -1
- package/web/assets/modal-AUS2ksVq.js +0 -5
- package/web/assets/modal-BR3MAJDn.js +0 -1
- package/web/assets/multiselect-aPow7kzy.js +0 -251
- package/web/assets/process.store-CVrBwiRB.js +0 -1
- package/web/assets/project-launch.store-DCuERm8z.js +0 -1
- package/web/assets/project.store-D0oo8kyl.js +0 -1
- package/web/assets/router-0UcfydXq.js +0 -1
- package/web/assets/settings-scope-DdLe151G.js +0 -1
- package/web/assets/src-BiwZaAz3.js +0 -1
- package/web/assets/src-OmBj_GBQ.js +0 -572
- package/web/assets/theme-DiK_jXoN.js +0 -1
- package/web/assets/trpc-DOYpfRgV.js +0 -1
- package/web/assets/useAiChatDrawer-BSlDU8P0.js +0 -1
- package/web/assets/useCloudOrg-_EGQ6eUY.js +0 -1
- package/web/assets/useEnvVarAutocomplete-B4h_6ylX.js +0 -1
- package/web/assets/useProjectCatalog-B3GacZkf.js +0 -1
- package/web/assets/useServiceUrlHost-B-38dOxY.js +0 -1
- /package/{agent-manager-ACPQWUZ5.js.map → agent-manager-BSPEFZKZ.js.map} +0 -0
- /package/{chat-PXMMZIAY.js.map → chat-SE5GIT4B.js.map} +0 -0
- /package/{companion-4RQ3AMOL.js.map → companion-HEJHC3UR.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-4GAINSJO.js.map} +0 -0
|
@@ -17,7 +17,6 @@ import {
|
|
|
17
17
|
apiKeyStore,
|
|
18
18
|
appVersion,
|
|
19
19
|
applyPersistedLanMode,
|
|
20
|
-
atomicWriteSecure,
|
|
21
20
|
auditService,
|
|
22
21
|
canEnvAction,
|
|
23
22
|
chatRouter,
|
|
@@ -51,7 +50,6 @@ import {
|
|
|
51
50
|
requireServiceAction,
|
|
52
51
|
resolveAgentCwd,
|
|
53
52
|
resolveConversationCwd,
|
|
54
|
-
resolveConversationRunDir,
|
|
55
53
|
resolveEffectiveAgentId,
|
|
56
54
|
resolveServiceVariables,
|
|
57
55
|
resolveWorkspaceCwd,
|
|
@@ -64,7 +62,7 @@ import {
|
|
|
64
62
|
soleAccountScope,
|
|
65
63
|
startCliSession,
|
|
66
64
|
vaultOfProject
|
|
67
|
-
} from "./chunk-
|
|
65
|
+
} from "./chunk-BVBK2WII.js";
|
|
68
66
|
import {
|
|
69
67
|
resolveCliInvocation,
|
|
70
68
|
whichCommand
|
|
@@ -87,7 +85,7 @@ import {
|
|
|
87
85
|
stopClaudeTranscriptWatcher,
|
|
88
86
|
stopCodexTranscriptWatcher,
|
|
89
87
|
verifyJwt
|
|
90
|
-
} from "./chunk-
|
|
88
|
+
} from "./chunk-VNLIA5PV.js";
|
|
91
89
|
import "./chunk-MD3VW4HQ.js";
|
|
92
90
|
import {
|
|
93
91
|
agentManager,
|
|
@@ -98,7 +96,6 @@ import {
|
|
|
98
96
|
clearVaultLock,
|
|
99
97
|
decryptValue,
|
|
100
98
|
decryptValueWith,
|
|
101
|
-
describeInstance,
|
|
102
99
|
encryptValue,
|
|
103
100
|
encryptValueWith,
|
|
104
101
|
ensureEncryptionKey,
|
|
@@ -126,10 +123,14 @@ import {
|
|
|
126
123
|
stableEncryptValue,
|
|
127
124
|
traefikManager,
|
|
128
125
|
unregisterInstance
|
|
129
|
-
} from "./chunk-
|
|
126
|
+
} from "./chunk-XTLQOYLT.js";
|
|
130
127
|
import {
|
|
131
128
|
settingsManager
|
|
132
|
-
} from "./chunk-
|
|
129
|
+
} from "./chunk-NIU3CN5A.js";
|
|
130
|
+
import {
|
|
131
|
+
atomicWriteSecure,
|
|
132
|
+
resolveConversationRunDir
|
|
133
|
+
} from "./chunk-GL7WA5K3.js";
|
|
133
134
|
import {
|
|
134
135
|
AGENT_LONG_FETCH_TIMEOUT,
|
|
135
136
|
AGENT_STOP_FETCH_TIMEOUT,
|
|
@@ -163,7 +164,7 @@ import {
|
|
|
163
164
|
readEntity,
|
|
164
165
|
serviceSlug,
|
|
165
166
|
writeEntity
|
|
166
|
-
} from "./chunk-
|
|
167
|
+
} from "./chunk-T2BV5WZE.js";
|
|
167
168
|
import {
|
|
168
169
|
env,
|
|
169
170
|
forgetOrgLogo,
|
|
@@ -1167,6 +1168,63 @@ var projectRouter = router({
|
|
|
1167
1168
|
await projectPathStore.set(project, input.path);
|
|
1168
1169
|
await auditService.log({ userId: "local", action: "update", entityType: "project", entityId: input.id, metadata: { localPath: input.path } });
|
|
1169
1170
|
return { path: input.path };
|
|
1171
|
+
}),
|
|
1172
|
+
/**
|
|
1173
|
+
* Ce qui a changé dans les stores, à mesure que ça change.
|
|
1174
|
+
*
|
|
1175
|
+
* Un projet, un service ou un environnement n'arrive pas toujours de
|
|
1176
|
+
* l'utilisateur assis devant : il descend du cloud quand un collègue le
|
|
1177
|
+
* pousse, ou d'une autre Runeya de cette machine. Les stores étaient déjà
|
|
1178
|
+
* prévenus — la synchronisation s'appuie sur les mêmes signaux — mais rien ne
|
|
1179
|
+
* portait l'information jusqu'à l'écran, qui gardait donc ce qu'il avait
|
|
1180
|
+
* chargé à l'ouverture de la vue.
|
|
1181
|
+
*
|
|
1182
|
+
* Ce flux annonce les collections touchées, pas leur contenu. Chacune a déjà
|
|
1183
|
+
* sa route, avec ses règles — un service ne sort jamais d'ici sans être
|
|
1184
|
+
* expurgé de ses secrets — et les redire ici en ferait une seconde version à
|
|
1185
|
+
* tenir d'accord avec la première.
|
|
1186
|
+
*
|
|
1187
|
+
* Les réveils sont groupés : une synchronisation qui descend un projet touche
|
|
1188
|
+
* ses trois collections coup sur coup, et trois annonces feraient trois
|
|
1189
|
+
* rechargements là où un seul suffit.
|
|
1190
|
+
*/
|
|
1191
|
+
onDataChanged: protectedProcedure.subscription(async function* ({ signal }) {
|
|
1192
|
+
const touched = /* @__PURE__ */ new Set();
|
|
1193
|
+
let wake = null;
|
|
1194
|
+
const mark = (collection) => () => {
|
|
1195
|
+
touched.add(collection);
|
|
1196
|
+
if (wake) {
|
|
1197
|
+
wake();
|
|
1198
|
+
wake = null;
|
|
1199
|
+
}
|
|
1200
|
+
};
|
|
1201
|
+
const onProjects = mark("projects");
|
|
1202
|
+
projectStore.events.on("saved", onProjects);
|
|
1203
|
+
const offs = [serviceStore.onChange(mark("services")), environmentStore.onChange(mark("environments"))];
|
|
1204
|
+
const onAbort = () => {
|
|
1205
|
+
if (wake) {
|
|
1206
|
+
wake();
|
|
1207
|
+
wake = null;
|
|
1208
|
+
}
|
|
1209
|
+
};
|
|
1210
|
+
signal?.addEventListener("abort", onAbort);
|
|
1211
|
+
try {
|
|
1212
|
+
while (!signal?.aborted) {
|
|
1213
|
+
if (touched.size > 0) {
|
|
1214
|
+
const collections = Array.from(touched);
|
|
1215
|
+
touched.clear();
|
|
1216
|
+
yield { collections };
|
|
1217
|
+
} else {
|
|
1218
|
+
await new Promise((resolve4) => {
|
|
1219
|
+
wake = resolve4;
|
|
1220
|
+
});
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
} finally {
|
|
1224
|
+
projectStore.events.off("saved", onProjects);
|
|
1225
|
+
for (const off of offs) off();
|
|
1226
|
+
signal?.removeEventListener("abort", onAbort);
|
|
1227
|
+
}
|
|
1170
1228
|
})
|
|
1171
1229
|
});
|
|
1172
1230
|
|
|
@@ -6522,85 +6580,61 @@ async function reconcileOrgCanary(orgId) {
|
|
|
6522
6580
|
}
|
|
6523
6581
|
|
|
6524
6582
|
// ../server/src/services/cloud-sync-bridge.ts
|
|
6583
|
+
import { randomUUID as randomUUID6 } from "crypto";
|
|
6584
|
+
import { mkdir as mkdir7, rm as rm3 } from "fs/promises";
|
|
6585
|
+
import * as Y2 from "yjs";
|
|
6586
|
+
|
|
6587
|
+
// ../server/src/services/sync-doc-cache.ts
|
|
6588
|
+
import { readFileSync, renameSync, rmSync, writeFileSync, mkdirSync } from "fs";
|
|
6589
|
+
import { readFile as readFile4 } from "fs/promises";
|
|
6590
|
+
import { dirname as dirname4, join as join10 } from "path";
|
|
6525
6591
|
import { randomUUID as randomUUID5 } from "crypto";
|
|
6526
|
-
import { mkdir as mkdir8, rm as rm3 } from "fs/promises";
|
|
6527
6592
|
import * as Y from "yjs";
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
|
|
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
|
-
}
|
|
6593
|
+
var FILE = "sync-doc.bin";
|
|
6594
|
+
function cachePath(orgId) {
|
|
6595
|
+
return join10(orgVaultRoot(orgId), FILE);
|
|
6545
6596
|
}
|
|
6546
|
-
async function
|
|
6597
|
+
async function readSyncDoc(orgId) {
|
|
6547
6598
|
try {
|
|
6548
|
-
|
|
6549
|
-
return typeof parsed?.pid === "number" ? parsed : null;
|
|
6599
|
+
return new Uint8Array(await readFile4(cachePath(orgId)));
|
|
6550
6600
|
} catch {
|
|
6551
6601
|
return null;
|
|
6552
6602
|
}
|
|
6553
6603
|
}
|
|
6554
|
-
|
|
6555
|
-
|
|
6556
|
-
|
|
6557
|
-
|
|
6558
|
-
|
|
6559
|
-
|
|
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
|
-
});
|
|
6604
|
+
function mergeWith(existing, state) {
|
|
6605
|
+
if (!existing) return state;
|
|
6606
|
+
try {
|
|
6607
|
+
return Y.mergeUpdates([existing, state]);
|
|
6608
|
+
} catch {
|
|
6609
|
+
return state;
|
|
6577
6610
|
}
|
|
6578
|
-
const holder = await readLock(path);
|
|
6579
|
-
return holder ? { acquired: false, heldBy: holder.pid } : { acquired: true };
|
|
6580
6611
|
}
|
|
6581
|
-
async function
|
|
6582
|
-
|
|
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
|
-
});
|
|
6612
|
+
async function writeSyncDoc(orgId, state) {
|
|
6613
|
+
await atomicWriteSecure(cachePath(orgId), mergeWith(await readSyncDoc(orgId), state));
|
|
6588
6614
|
}
|
|
6589
|
-
function
|
|
6590
|
-
|
|
6591
|
-
|
|
6592
|
-
|
|
6593
|
-
|
|
6594
|
-
|
|
6595
|
-
|
|
6596
|
-
|
|
6615
|
+
function writeSyncDocSync(orgId, state) {
|
|
6616
|
+
const path = cachePath(orgId);
|
|
6617
|
+
let existing = null;
|
|
6618
|
+
try {
|
|
6619
|
+
existing = new Uint8Array(readFileSync(path));
|
|
6620
|
+
} catch {
|
|
6621
|
+
}
|
|
6622
|
+
mkdirSync(dirname4(path), { recursive: true });
|
|
6623
|
+
const tmp = `${path}.${process.pid}.${randomUUID5()}.tmp`;
|
|
6624
|
+
try {
|
|
6625
|
+
writeFileSync(tmp, mergeWith(existing, state), { mode: 384 });
|
|
6626
|
+
renameSync(tmp, path);
|
|
6627
|
+
} catch (err) {
|
|
6628
|
+
rmSync(tmp, { force: true });
|
|
6629
|
+
throw err;
|
|
6597
6630
|
}
|
|
6598
|
-
held.clear();
|
|
6599
6631
|
}
|
|
6600
6632
|
|
|
6601
6633
|
// ../server/src/services/cloud-sync-bridge.ts
|
|
6602
6634
|
var LOCAL_ORIGIN = "local-bridge";
|
|
6603
6635
|
var REMOTE_ORIGIN = "remote";
|
|
6636
|
+
var CACHE_ORIGIN = "cache";
|
|
6637
|
+
var PERSIST_DEBOUNCE_MS = 1e3;
|
|
6604
6638
|
var RECONNECT_DELAY_MS = 3e3;
|
|
6605
6639
|
var UNAUTHENTICATED_RETRY_MS = 5 * 6e4;
|
|
6606
6640
|
var OUTDATED_RETRY_MS = 30 * 6e4;
|
|
@@ -6633,12 +6667,12 @@ var ProjectHeldElsewhereError = class extends Error {
|
|
|
6633
6667
|
code = "PROJECT_HELD_ELSEWHERE";
|
|
6634
6668
|
};
|
|
6635
6669
|
var OrgSyncConnection = class {
|
|
6636
|
-
doc = new
|
|
6670
|
+
doc = new Y2.Doc();
|
|
6637
6671
|
projects = getCollection(this.doc, "projects");
|
|
6638
6672
|
services = getCollection(this.doc, "services");
|
|
6639
6673
|
environments = getCollection(this.doc, "environments");
|
|
6640
6674
|
logParsers = getCollection(this.doc, PARSERS);
|
|
6641
|
-
conn =
|
|
6675
|
+
conn = randomUUID6();
|
|
6642
6676
|
link;
|
|
6643
6677
|
stopped = false;
|
|
6644
6678
|
initializing = true;
|
|
@@ -6674,6 +6708,31 @@ var OrgSyncConnection = class {
|
|
|
6674
6708
|
* creating a project sees it appear on their teammates' machines.
|
|
6675
6709
|
*/
|
|
6676
6710
|
initialDocApplied = false;
|
|
6711
|
+
/**
|
|
6712
|
+
* Whether local state has been written into the doc.
|
|
6713
|
+
*
|
|
6714
|
+
* Never before the doc holds the known history — reloaded from disk, or
|
|
6715
|
+
* received from the cloud. Written into an empty doc, local state is
|
|
6716
|
+
* concurrent with every past write and loses to some of them at random: an
|
|
6717
|
+
* offline edit reverted, a service on disk erased by an older deletion.
|
|
6718
|
+
*/
|
|
6719
|
+
seeded = false;
|
|
6720
|
+
/** Store applications started by remote events and not finished yet. */
|
|
6721
|
+
applying = /* @__PURE__ */ new Set();
|
|
6722
|
+
/**
|
|
6723
|
+
* When each entity was last changed by a remote update (`collection:id` → tick).
|
|
6724
|
+
*
|
|
6725
|
+
* Reconciliation reads the stores, waits, then writes what it read. A remote
|
|
6726
|
+
* change landing in between makes that read stale, and writing it would erase
|
|
6727
|
+
* the value that just arrived — for every member. Entities touched since the
|
|
6728
|
+
* read began are left alone: their application brings the disk up to date,
|
|
6729
|
+
* and the reconciliation it triggers starts from there.
|
|
6730
|
+
*/
|
|
6731
|
+
remoteTouch = /* @__PURE__ */ new Map();
|
|
6732
|
+
remoteClock = 0;
|
|
6733
|
+
persistTimer = null;
|
|
6734
|
+
/** The cache write under way, so stopping can wait for it to land. */
|
|
6735
|
+
persisting = Promise.resolve();
|
|
6677
6736
|
unsubscribes = [];
|
|
6678
6737
|
onSaved = () => void this.reconcileLocalToDoc();
|
|
6679
6738
|
constructor(link) {
|
|
@@ -6703,29 +6762,79 @@ var OrgSyncConnection = class {
|
|
|
6703
6762
|
if (txn.origin !== REMOTE_ORIGIN) return;
|
|
6704
6763
|
const isInitial = !this.initialDocApplied;
|
|
6705
6764
|
if (name === "projects") this.initialDocApplied = true;
|
|
6706
|
-
|
|
6765
|
+
this.track(this.applyDocEventsToStore(name, events, isInitial));
|
|
6707
6766
|
});
|
|
6708
6767
|
}
|
|
6709
6768
|
this.logParsers.observeDeep((events, txn) => {
|
|
6710
6769
|
if (txn.origin !== REMOTE_ORIGIN) return;
|
|
6711
|
-
|
|
6770
|
+
this.track(this.applyParserEventsToStore(events));
|
|
6712
6771
|
});
|
|
6713
6772
|
projectStore.events.on("saved", this.onSaved);
|
|
6714
6773
|
this.unsubscribes.push(serviceStore.onChange(this.onSaved));
|
|
6715
6774
|
this.unsubscribes.push(environmentStore.onChange(this.onSaved));
|
|
6716
6775
|
this.unsubscribes.push(logParserStore.onLocalChange(this.onSaved));
|
|
6776
|
+
const cached = await readSyncDoc(this.link.orgId);
|
|
6777
|
+
if (cached) {
|
|
6778
|
+
try {
|
|
6779
|
+
Y2.applyUpdate(this.doc, cached, CACHE_ORIGIN);
|
|
6780
|
+
this.initialDocApplied = true;
|
|
6781
|
+
} catch (err) {
|
|
6782
|
+
console.error("[cloud-sync] unreadable sync cache for org %s, ignored:", this.link.orgId, err.message);
|
|
6783
|
+
}
|
|
6784
|
+
}
|
|
6785
|
+
this.doc.on("update", () => this.schedulePersist());
|
|
6786
|
+
if (cached && this.initialDocApplied) await this.seed();
|
|
6787
|
+
void this.streamLoop();
|
|
6788
|
+
}
|
|
6789
|
+
/** Write local state on top of the known history, then owe it to the cloud. */
|
|
6790
|
+
async seed() {
|
|
6791
|
+
this.seeded = true;
|
|
6717
6792
|
await this.reconcileLocalToDoc();
|
|
6718
6793
|
this.initializing = false;
|
|
6719
6794
|
this.needsPush = true;
|
|
6720
|
-
void this.streamLoop();
|
|
6721
6795
|
}
|
|
6796
|
+
track(work) {
|
|
6797
|
+
this.applying.add(work);
|
|
6798
|
+
void work.finally(() => this.applying.delete(work));
|
|
6799
|
+
}
|
|
6800
|
+
async settleApplying() {
|
|
6801
|
+
while (this.applying.size > 0) await Promise.allSettled(this.applying);
|
|
6802
|
+
}
|
|
6803
|
+
schedulePersist() {
|
|
6804
|
+
if (this.stopped || this.persistTimer) return;
|
|
6805
|
+
this.persistTimer = setTimeout(() => {
|
|
6806
|
+
this.persistTimer = null;
|
|
6807
|
+
this.persisting = this.persisting.then(() => this.persist());
|
|
6808
|
+
}, PERSIST_DEBOUNCE_MS);
|
|
6809
|
+
}
|
|
6810
|
+
async persist() {
|
|
6811
|
+
if (this.stopped) return;
|
|
6812
|
+
try {
|
|
6813
|
+
await writeSyncDoc(this.link.orgId, Y2.encodeStateAsUpdate(this.doc));
|
|
6814
|
+
} catch (err) {
|
|
6815
|
+
console.error("[cloud-sync] could not save sync cache for org %s:", this.link.orgId, err.message);
|
|
6816
|
+
}
|
|
6817
|
+
}
|
|
6818
|
+
/** Resolves once any cache write already under way has landed. */
|
|
6722
6819
|
stop() {
|
|
6723
6820
|
this.stopped = true;
|
|
6724
6821
|
this.state = "stopped";
|
|
6725
6822
|
projectStore.events.off("saved", this.onSaved);
|
|
6726
6823
|
for (const off of this.unsubscribes.splice(0)) off();
|
|
6727
6824
|
this.abort?.abort();
|
|
6825
|
+
if (this.persistTimer) {
|
|
6826
|
+
clearTimeout(this.persistTimer);
|
|
6827
|
+
this.persistTimer = null;
|
|
6828
|
+
}
|
|
6829
|
+
if (this.seeded) {
|
|
6830
|
+
try {
|
|
6831
|
+
writeSyncDocSync(this.link.orgId, Y2.encodeStateAsUpdate(this.doc));
|
|
6832
|
+
} catch (err) {
|
|
6833
|
+
console.error("[cloud-sync] could not save sync cache for org %s:", this.link.orgId, err.message);
|
|
6834
|
+
}
|
|
6835
|
+
}
|
|
6728
6836
|
this.doc.destroy();
|
|
6837
|
+
return this.persisting;
|
|
6729
6838
|
}
|
|
6730
6839
|
// ---- Transport -------------------------------------------------------
|
|
6731
6840
|
/**
|
|
@@ -6803,7 +6912,7 @@ var OrgSyncConnection = class {
|
|
|
6803
6912
|
if (!svRes.ok) return;
|
|
6804
6913
|
const { sv } = await svRes.json();
|
|
6805
6914
|
const cloudSv = new Uint8Array(Buffer.from(sv, "base64"));
|
|
6806
|
-
const diff =
|
|
6915
|
+
const diff = Y2.encodeStateAsUpdate(this.doc, cloudSv);
|
|
6807
6916
|
await this.pushUpdate(diff);
|
|
6808
6917
|
} catch (err) {
|
|
6809
6918
|
if (err instanceof SyncAuthError || err instanceof SyncOutdatedError) throw err;
|
|
@@ -6865,7 +6974,7 @@ var OrgSyncConnection = class {
|
|
|
6865
6974
|
}
|
|
6866
6975
|
async streamOnce() {
|
|
6867
6976
|
this.abort = new AbortController();
|
|
6868
|
-
const since = Buffer.from(
|
|
6977
|
+
const since = Buffer.from(Y2.encodeStateVector(this.doc)).toString("base64");
|
|
6869
6978
|
const res = await fetch(this.url(`/stream?conn=${this.conn}&since=${encodeURIComponent(since)}`), {
|
|
6870
6979
|
headers: { Authorization: await this.authHeader(), [APP_VERSION_HEADER]: appVersion },
|
|
6871
6980
|
signal: this.abort.signal
|
|
@@ -6889,8 +6998,17 @@ var OrgSyncConnection = class {
|
|
|
6889
6998
|
try {
|
|
6890
6999
|
const payload = JSON.parse(line.slice(6));
|
|
6891
7000
|
const update = new Uint8Array(Buffer.from(payload.update, "base64"));
|
|
6892
|
-
|
|
7001
|
+
Y2.applyUpdate(this.doc, update, REMOTE_ORIGIN);
|
|
6893
7002
|
} catch {
|
|
7003
|
+
continue;
|
|
7004
|
+
}
|
|
7005
|
+
if (!this.seeded) {
|
|
7006
|
+
this.initialDocApplied = true;
|
|
7007
|
+
await this.settleApplying();
|
|
7008
|
+
if (this.stopped) return;
|
|
7009
|
+
await this.seed();
|
|
7010
|
+
await this.initialPush();
|
|
7011
|
+
this.needsPush = false;
|
|
6894
7012
|
}
|
|
6895
7013
|
}
|
|
6896
7014
|
}
|
|
@@ -6971,7 +7089,7 @@ var OrgSyncConnection = class {
|
|
|
6971
7089
|
}
|
|
6972
7090
|
const isLocal = existing?.orgId === this.link.orgId;
|
|
6973
7091
|
if (!inDoc && !isLocal) return false;
|
|
6974
|
-
await
|
|
7092
|
+
await mkdir7(projectVaultRoot(this.link.orgId, projectId), { recursive: true });
|
|
6975
7093
|
this.tracked.add(projectId);
|
|
6976
7094
|
if (inDoc) await this.pullFromDoc([projectId]);
|
|
6977
7095
|
else await this.reconcileLocalToDoc();
|
|
@@ -7012,6 +7130,7 @@ var OrgSyncConnection = class {
|
|
|
7012
7130
|
} finally {
|
|
7013
7131
|
this.pulling = false;
|
|
7014
7132
|
}
|
|
7133
|
+
await serviceStore.relocateAll();
|
|
7015
7134
|
await this.reconcileLocalToDoc();
|
|
7016
7135
|
}
|
|
7017
7136
|
// ---- Local ↔ Doc reconciliation --------------------------------------
|
|
@@ -7034,6 +7153,7 @@ var OrgSyncConnection = class {
|
|
|
7034
7153
|
if (typeof topKey === "string") affected.add(topKey);
|
|
7035
7154
|
}
|
|
7036
7155
|
}
|
|
7156
|
+
for (const id of [...deleted, ...affected]) this.remoteTouch.set(`${name}:${id}`, ++this.remoteClock);
|
|
7037
7157
|
for (const id of deleted) {
|
|
7038
7158
|
if (!this.isTrackedForDeletion(name, id)) continue;
|
|
7039
7159
|
await this.deleteLocally(name, id);
|
|
@@ -7186,7 +7306,9 @@ var OrgSyncConnection = class {
|
|
|
7186
7306
|
* propagate — otherwise a service could never be removed.
|
|
7187
7307
|
*/
|
|
7188
7308
|
async reconcileLocalToDoc() {
|
|
7189
|
-
if (this.stopped || this.pulling) return;
|
|
7309
|
+
if (this.stopped || this.pulling || !this.seeded) return;
|
|
7310
|
+
const readAt = this.remoteClock;
|
|
7311
|
+
const touchedSinceRead = (name, id) => (this.remoteTouch.get(`${name}:${id}`) ?? 0) > readAt;
|
|
7190
7312
|
const projects = (await projectStore.listDiskFormByOrg(this.link.orgId)).filter((p) => !this.refusalFor(p.id));
|
|
7191
7313
|
const projectIds = projects.map((p) => p.id);
|
|
7192
7314
|
const serviceIds = [...new Set(projects.flatMap((p) => p.serviceIds ?? []))];
|
|
@@ -7204,10 +7326,12 @@ var OrgSyncConnection = class {
|
|
|
7204
7326
|
const collection = this.collection(name);
|
|
7205
7327
|
const entities = local[name];
|
|
7206
7328
|
const ids = new Set(entities.map((e) => e.id));
|
|
7207
|
-
for (const entity of entities)
|
|
7329
|
+
for (const entity of entities) {
|
|
7330
|
+
if (!touchedSinceRead(name, entity.id)) writeEntity(collection, entity.id, entity);
|
|
7331
|
+
}
|
|
7208
7332
|
if (name === "projects") continue;
|
|
7209
7333
|
for (const id of Array.from(collection.keys())) {
|
|
7210
|
-
if (ids.has(id)) continue;
|
|
7334
|
+
if (ids.has(id) || touchedSinceRead(name, id)) continue;
|
|
7211
7335
|
if (this.belongsToOwnedProject(name, id, ownedProjectIds)) collection.delete(id);
|
|
7212
7336
|
}
|
|
7213
7337
|
}
|
|
@@ -7243,21 +7367,12 @@ var OrgSyncConnection = class {
|
|
|
7243
7367
|
};
|
|
7244
7368
|
var CloudSyncBridge = class {
|
|
7245
7369
|
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
7370
|
/**
|
|
7256
7371
|
* Orgs whose key this machine does not have.
|
|
7257
7372
|
*
|
|
7258
|
-
*
|
|
7259
|
-
*
|
|
7260
|
-
*
|
|
7373
|
+
* Tenues à part : la connexion n'est jamais ouverte, donc il n'y a rien à qui
|
|
7374
|
+
* demander son état — et une organisation qui ne peut pas synchroniser tant
|
|
7375
|
+
* qu'un humain n'a pas fourni de clé ne doit pas se lire « arrêtée ».
|
|
7261
7376
|
*/
|
|
7262
7377
|
keyMismatch = /* @__PURE__ */ new Set();
|
|
7263
7378
|
started = false;
|
|
@@ -7341,22 +7456,14 @@ var CloudSyncBridge = class {
|
|
|
7341
7456
|
const live = Array.from(this.connections.entries()).map(([orgId, conn]) => ({
|
|
7342
7457
|
orgId,
|
|
7343
7458
|
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
|
|
7459
|
+
lastIncompatibleVersion: conn.getLastIncompatibleVersion()
|
|
7352
7460
|
}));
|
|
7353
7461
|
const mismatched = Array.from(this.keyMismatch).filter((orgId) => !this.connections.has(orgId)).map((orgId) => ({
|
|
7354
7462
|
orgId,
|
|
7355
7463
|
state: "key-mismatch",
|
|
7356
|
-
lastIncompatibleVersion: null
|
|
7357
|
-
heldByPid: null
|
|
7464
|
+
lastIncompatibleVersion: null
|
|
7358
7465
|
}));
|
|
7359
|
-
return [...live, ...
|
|
7466
|
+
return [...live, ...mismatched];
|
|
7360
7467
|
}
|
|
7361
7468
|
/**
|
|
7362
7469
|
* Follow one project of an org on this machine, pulling it now.
|
|
@@ -7402,20 +7509,6 @@ var CloudSyncBridge = class {
|
|
|
7402
7509
|
);
|
|
7403
7510
|
}
|
|
7404
7511
|
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
7512
|
const conn = new OrgSyncConnection(link);
|
|
7420
7513
|
this.connections.set(link.orgId, conn);
|
|
7421
7514
|
try {
|
|
@@ -7427,23 +7520,23 @@ var CloudSyncBridge = class {
|
|
|
7427
7520
|
disconnect(orgId) {
|
|
7428
7521
|
const existing = this.connections.get(orgId);
|
|
7429
7522
|
if (existing) {
|
|
7430
|
-
existing.stop();
|
|
7523
|
+
void existing.stop();
|
|
7431
7524
|
this.connections.delete(orgId);
|
|
7432
|
-
void releaseOrgLock(orgId);
|
|
7433
7525
|
}
|
|
7434
7526
|
}
|
|
7527
|
+
/** Stops at once; the promise only says when pending cache writes have landed. */
|
|
7435
7528
|
stopAll() {
|
|
7436
|
-
|
|
7529
|
+
const stopping = [...this.connections.values()].map((conn) => conn.stop());
|
|
7437
7530
|
this.connections.clear();
|
|
7438
|
-
this.locked.clear();
|
|
7439
7531
|
this.keyMismatch.clear();
|
|
7440
|
-
|
|
7532
|
+
return Promise.all(stopping).then(() => {
|
|
7533
|
+
});
|
|
7441
7534
|
}
|
|
7442
7535
|
};
|
|
7443
7536
|
var cloudSyncBridge = new CloudSyncBridge();
|
|
7444
7537
|
|
|
7445
7538
|
// ../server/src/services/key-adoption.ts
|
|
7446
|
-
import { readdir as readdir3, readFile as readFile5, writeFile as writeFile6, mkdir as
|
|
7539
|
+
import { readdir as readdir3, readFile as readFile5, writeFile as writeFile6, mkdir as mkdir8, copyFile, rename as rename4, stat as stat5 } from "fs/promises";
|
|
7447
7540
|
import { join as join11 } from "path";
|
|
7448
7541
|
import { createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2, randomBytes as randomBytes2 } from "crypto";
|
|
7449
7542
|
var ALGORITHM = "aes-256-gcm";
|
|
@@ -7542,7 +7635,7 @@ async function adoptOrgKey(orgId, newKey, masterPassword, now) {
|
|
|
7542
7635
|
const backups = [];
|
|
7543
7636
|
for (const vaultRoot of touchedRoots) {
|
|
7544
7637
|
const backupDir = join11(vaultRoot, `backup-key-${stamp}`);
|
|
7545
|
-
await
|
|
7638
|
+
await mkdir8(backupDir, { recursive: true });
|
|
7546
7639
|
for (const name of await jsonFilesIn(vaultRoot)) {
|
|
7547
7640
|
await copyFile(join11(vaultRoot, name), join11(backupDir, name));
|
|
7548
7641
|
}
|
|
@@ -7612,10 +7705,6 @@ async function assertOrgKey(orgId) {
|
|
|
7612
7705
|
function syncState(orgId) {
|
|
7613
7706
|
return cloudSyncBridge.states().find((s) => s.orgId === orgId)?.state ?? "stopped";
|
|
7614
7707
|
}
|
|
7615
|
-
async function syncLockHolder(orgId) {
|
|
7616
|
-
const pid = cloudSyncBridge.states().find((s) => s.orgId === orgId)?.heldByPid;
|
|
7617
|
-
return pid ? describeInstance(pid) : null;
|
|
7618
|
-
}
|
|
7619
7708
|
var cloudSyncRouter = router({
|
|
7620
7709
|
/**
|
|
7621
7710
|
* Follow one more project of an org, and pull it now.
|
|
@@ -7650,7 +7739,7 @@ var cloudSyncRouter = router({
|
|
|
7650
7739
|
}
|
|
7651
7740
|
try {
|
|
7652
7741
|
const pulled = await cloudSyncBridge.followProject(input.orgId, input.projectId);
|
|
7653
|
-
return { pulled, state: syncState(input.orgId)
|
|
7742
|
+
return { pulled, state: syncState(input.orgId) };
|
|
7654
7743
|
} catch (err) {
|
|
7655
7744
|
if (err instanceof ProjectHeldElsewhereError) {
|
|
7656
7745
|
throw new TRPCError19({ code: "CONFLICT", message: err.code, cause: err });
|
|
@@ -7987,9 +8076,8 @@ var cloudSyncRouter = router({
|
|
|
7987
8076
|
list: protectedProcedure.query(async () => {
|
|
7988
8077
|
const links = await orgsToSync();
|
|
7989
8078
|
const states = new Map(cloudSyncBridge.states().map((s) => [s.orgId, s]));
|
|
7990
|
-
return
|
|
8079
|
+
return links.map((l) => {
|
|
7991
8080
|
const found = states.get(l.orgId);
|
|
7992
|
-
const heldBy = found?.heldByPid ? await describeInstance(found.heldByPid) : null;
|
|
7993
8081
|
return {
|
|
7994
8082
|
orgId: l.orgId,
|
|
7995
8083
|
cloudUrl: l.cloudUrl,
|
|
@@ -7997,10 +8085,9 @@ var cloudSyncRouter = router({
|
|
|
7997
8085
|
// Renseigné seulement quand le cloud a refusé cette app comme trop
|
|
7998
8086
|
// ancienne : c'est lui qui publie le plancher, on ne le devine pas. La
|
|
7999
8087
|
// borne est exclusive — il faut strictement plus récent que ce numéro.
|
|
8000
|
-
lastIncompatibleVersion: found?.lastIncompatibleVersion ?? null
|
|
8001
|
-
heldBy
|
|
8088
|
+
lastIncompatibleVersion: found?.lastIncompatibleVersion ?? null
|
|
8002
8089
|
};
|
|
8003
|
-
})
|
|
8090
|
+
});
|
|
8004
8091
|
}),
|
|
8005
8092
|
/**
|
|
8006
8093
|
* The cloud instance behind every org vault on this machine.
|
|
@@ -8019,7 +8106,7 @@ var cloudSyncRouter = router({
|
|
|
8019
8106
|
// ../server/src/trpc/routers/filesystem.ts
|
|
8020
8107
|
import { readdir as readdir4, stat as stat6 } from "fs/promises";
|
|
8021
8108
|
import { homedir as homedir3 } from "os";
|
|
8022
|
-
import { isAbsolute, join as join12, resolve as resolve2, dirname as
|
|
8109
|
+
import { isAbsolute, join as join12, resolve as resolve2, dirname as dirname5, basename } from "path";
|
|
8023
8110
|
import { z as z24 } from "zod";
|
|
8024
8111
|
var MAX_ENTRIES2 = 500;
|
|
8025
8112
|
var PATH_SCHEMA = z24.string().min(1).max(4096);
|
|
@@ -8067,7 +8154,7 @@ var filesystemRouter = router({
|
|
|
8067
8154
|
return {
|
|
8068
8155
|
path: dir,
|
|
8069
8156
|
// Null at the filesystem root, which is what stops "up" from looping.
|
|
8070
|
-
parent:
|
|
8157
|
+
parent: dirname5(dir) === dir ? null : dirname5(dir),
|
|
8071
8158
|
name: basename(dir) || dir,
|
|
8072
8159
|
entries: entries2,
|
|
8073
8160
|
truncated,
|
|
@@ -8322,7 +8409,7 @@ async function ensureFilePermissions() {
|
|
|
8322
8409
|
}
|
|
8323
8410
|
|
|
8324
8411
|
// ../server/src/services/vault-migration.ts
|
|
8325
|
-
import { readdir as readdir5, readFile as readFile6, writeFile as writeFile7, mkdir as
|
|
8412
|
+
import { readdir as readdir5, readFile as readFile6, writeFile as writeFile7, mkdir as mkdir9, copyFile as copyFile2, unlink, rename as rename5, stat as stat8 } from "fs/promises";
|
|
8326
8413
|
import { join as join13 } from "path";
|
|
8327
8414
|
var KEY_FILES = [".encryption.key.enc", ".runeya-verify"];
|
|
8328
8415
|
var MACHINE_FILES = [
|
|
@@ -8354,7 +8441,7 @@ async function openLegacyVault(legacyRoot, masterPassword) {
|
|
|
8354
8441
|
async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machineKey, now) {
|
|
8355
8442
|
const stamp = now.toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
8356
8443
|
const backupDir = join13(legacyRoot, `backup-${stamp}`);
|
|
8357
|
-
await
|
|
8444
|
+
await mkdir9(backupDir, { recursive: true });
|
|
8358
8445
|
const jsonFiles = await vaultJsonFiles(legacyRoot);
|
|
8359
8446
|
for (const name of [...jsonFiles, ...KEY_FILES]) {
|
|
8360
8447
|
if (await exists2(join13(legacyRoot, name))) {
|
|
@@ -8388,7 +8475,7 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
|
|
|
8388
8475
|
);
|
|
8389
8476
|
}
|
|
8390
8477
|
}
|
|
8391
|
-
await
|
|
8478
|
+
await mkdir9(machineRootDir, { recursive: true });
|
|
8392
8479
|
const moved = [];
|
|
8393
8480
|
const skipped = [];
|
|
8394
8481
|
for (const name of MACHINE_FILES) {
|
|
@@ -8400,18 +8487,18 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
|
|
|
8400
8487
|
continue;
|
|
8401
8488
|
}
|
|
8402
8489
|
await copyFile2(from, to);
|
|
8403
|
-
await
|
|
8490
|
+
await unlink(from);
|
|
8404
8491
|
moved.push(name);
|
|
8405
8492
|
}
|
|
8406
8493
|
for (const name of KEY_FILES) {
|
|
8407
8494
|
const path = join13(legacyRoot, name);
|
|
8408
|
-
if (await exists2(path)) await
|
|
8495
|
+
if (await exists2(path)) await unlink(path);
|
|
8409
8496
|
}
|
|
8410
8497
|
return { backupDir, rekeyed, moved, skipped };
|
|
8411
8498
|
}
|
|
8412
8499
|
|
|
8413
8500
|
// ../server/src/services/settings-migration.ts
|
|
8414
|
-
import { readFile as readFile7, writeFile as writeFile8, rename as rename6, unlink as
|
|
8501
|
+
import { readFile as readFile7, writeFile as writeFile8, rename as rename6, unlink as unlink2, mkdir as mkdir10, chmod as chmod4, stat as stat9 } from "fs/promises";
|
|
8415
8502
|
import { join as join14 } from "path";
|
|
8416
8503
|
var SETTINGS_FILE = "settings.json";
|
|
8417
8504
|
var SETTINGS_PRIVATE_FILE = "settings.private.json";
|
|
@@ -8425,14 +8512,14 @@ async function legacySource(filename) {
|
|
|
8425
8512
|
return null;
|
|
8426
8513
|
}
|
|
8427
8514
|
async function moveInto(root, filename, from) {
|
|
8428
|
-
await
|
|
8515
|
+
await mkdir10(root, { recursive: true });
|
|
8429
8516
|
const to = join14(root, filename);
|
|
8430
8517
|
const contents = await readFile7(from, "utf-8");
|
|
8431
8518
|
const tmp = to + ".tmp";
|
|
8432
8519
|
await writeFile8(tmp, contents, "utf-8");
|
|
8433
8520
|
await rename6(tmp, to);
|
|
8434
8521
|
await chmod4(to, 384);
|
|
8435
|
-
await
|
|
8522
|
+
await unlink2(from);
|
|
8436
8523
|
}
|
|
8437
8524
|
async function migrateSettingsIntoVaults() {
|
|
8438
8525
|
const report = { movedTo: null, files: [], ambiguous: [] };
|
|
@@ -8465,16 +8552,16 @@ async function migrateSettingsIntoVaults() {
|
|
|
8465
8552
|
// ../server/src/migrations/migrate-from-legacy.ts
|
|
8466
8553
|
import { createRequire } from "module";
|
|
8467
8554
|
import { randomBytes as randomBytes3, createCipheriv as createCipheriv3, createDecipheriv as createDecipheriv3 } from "crypto";
|
|
8468
|
-
import { randomUUID as
|
|
8555
|
+
import { randomUUID as randomUUID7 } from "crypto";
|
|
8469
8556
|
import {
|
|
8470
8557
|
readFile as readFile8,
|
|
8471
8558
|
writeFile as writeFile9,
|
|
8472
8559
|
rename as rename7,
|
|
8473
|
-
mkdir as
|
|
8560
|
+
mkdir as mkdir11,
|
|
8474
8561
|
access as access2,
|
|
8475
8562
|
readdir as readdir6
|
|
8476
8563
|
} from "fs/promises";
|
|
8477
|
-
import { join as join15, dirname as
|
|
8564
|
+
import { join as join15, dirname as dirname6 } from "path";
|
|
8478
8565
|
var _require = createRequire(import.meta.url);
|
|
8479
8566
|
var PARSER_ID_MAP = {
|
|
8480
8567
|
"stack-monitor-parser-jsons": "native:json",
|
|
@@ -8626,7 +8713,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8626
8713
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
8627
8714
|
const legacyTmp = `${legacyRoot}-tmp`;
|
|
8628
8715
|
await rename7(legacyRoot, legacyTmp);
|
|
8629
|
-
await
|
|
8716
|
+
await mkdir11(dataDir, { recursive: true });
|
|
8630
8717
|
const legacyOld = join15(dataDir, `backup-${timestamp}`);
|
|
8631
8718
|
await rename7(legacyTmp, legacyOld);
|
|
8632
8719
|
console.log(`[legacy-migration] Legacy data backed up to ${legacyOld}`);
|
|
@@ -8683,11 +8770,11 @@ async function runLegacyMigration(dataDir) {
|
|
|
8683
8770
|
const data = await readEncrypted(join15(parsersDir, file));
|
|
8684
8771
|
if (data?.id) legacyParsers.push(data);
|
|
8685
8772
|
}
|
|
8686
|
-
const projectMonoId =
|
|
8773
|
+
const projectMonoId = randomUUID7();
|
|
8687
8774
|
const envIdMap = {};
|
|
8688
8775
|
const labelToKey = {};
|
|
8689
8776
|
for (const [name, legacyEnv] of Object.entries(legacyEnvs)) {
|
|
8690
|
-
envIdMap[name] =
|
|
8777
|
+
envIdMap[name] = randomUUID7();
|
|
8691
8778
|
if (legacyEnv?.label) labelToKey[legacyEnv.label] = name;
|
|
8692
8779
|
}
|
|
8693
8780
|
const runeEnvs = [];
|
|
@@ -8712,7 +8799,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8712
8799
|
if (hasInvalidInterpolation(value)) continue;
|
|
8713
8800
|
const cleaned = cleanVarKey(key);
|
|
8714
8801
|
if (inheritedVars[cleaned] === value) continue;
|
|
8715
|
-
const varId =
|
|
8802
|
+
const varId = randomUUID7();
|
|
8716
8803
|
variables[varId] = makeVariable(cleaned, value);
|
|
8717
8804
|
varIdLookup.set(`${envIdMap[name]}:${cleaned}`, varId);
|
|
8718
8805
|
}
|
|
@@ -8733,7 +8820,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8733
8820
|
const serviceIdMap = {};
|
|
8734
8821
|
const runeServices = [];
|
|
8735
8822
|
for (const [name, legacy] of Object.entries(legacyServices)) {
|
|
8736
|
-
const id =
|
|
8823
|
+
const id = randomUUID7();
|
|
8737
8824
|
serviceIdMap[name] = id;
|
|
8738
8825
|
const rootPath = legacy.rootPath || "";
|
|
8739
8826
|
const rootPathCwd = rootPath && rootPath !== "." ? rootPath : "";
|
|
@@ -8742,7 +8829,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8742
8829
|
const parts = [cmd.spawnCmd, ...cmd.spawnArgs || []].filter(Boolean);
|
|
8743
8830
|
if (!parts.length) continue;
|
|
8744
8831
|
commands.push({
|
|
8745
|
-
id: cmd.id ||
|
|
8832
|
+
id: cmd.id || randomUUID7(),
|
|
8746
8833
|
label: "Launch",
|
|
8747
8834
|
command: parts.join(" "),
|
|
8748
8835
|
cwd: cmd.spawnOptions?.cwd || "",
|
|
@@ -8803,7 +8890,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8803
8890
|
const legacyBootstrapCmds = container.bootstrap?.commands || [];
|
|
8804
8891
|
if (legacyBootstrapCmds.length > 0) {
|
|
8805
8892
|
dockerConfig.bootstrapCommands = legacyBootstrapCmds.filter((bs) => bs.cmd || bs.entrypoint).map((bs, idx) => ({
|
|
8806
|
-
id: bs.id ||
|
|
8893
|
+
id: bs.id || randomUUID7(),
|
|
8807
8894
|
label: bs.label || `Bootstrap ${idx + 1}`,
|
|
8808
8895
|
command: bs.cmd || "",
|
|
8809
8896
|
...bs.entrypoint ? { entrypoint: bs.entrypoint } : {},
|
|
@@ -8851,7 +8938,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8851
8938
|
cwd: serviceCwd,
|
|
8852
8939
|
runner: dockerConfig ? "docker" : "native",
|
|
8853
8940
|
shortcuts: (legacy.shortcuts || []).filter((s) => s.spawnCmd || s.label).map((s) => ({
|
|
8854
|
-
id: s.id ||
|
|
8941
|
+
id: s.id || randomUUID7(),
|
|
8855
8942
|
label: s.label || s.spawnCmd || "",
|
|
8856
8943
|
command: [s.spawnCmd, ...s.spawnArgs || []].filter(Boolean).join(" "),
|
|
8857
8944
|
...s.spawnOptions?.cwd ? { cwd: s.spawnOptions.cwd } : {}
|
|
@@ -8891,7 +8978,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8891
8978
|
);
|
|
8892
8979
|
if (!svcScopedEnv) {
|
|
8893
8980
|
svcScopedEnv = {
|
|
8894
|
-
id:
|
|
8981
|
+
id: randomUUID7(),
|
|
8895
8982
|
projectId: projectMonoId,
|
|
8896
8983
|
name: `${service?.name || name} (${globalEnv.name})`,
|
|
8897
8984
|
scope: "service",
|
|
@@ -8915,7 +9002,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8915
9002
|
const varPost = typeof varData === "object" ? String(varData.suffix ?? "") : "";
|
|
8916
9003
|
if (!varKey || existingKeys.has(cleanVarKey(varKey))) continue;
|
|
8917
9004
|
const cleaned = cleanVarKey(varKey);
|
|
8918
|
-
const varId =
|
|
9005
|
+
const varId = randomUUID7();
|
|
8919
9006
|
svcScopedEnv.variables[varId] = makeVariable(cleaned, varValue, varPre, varPost);
|
|
8920
9007
|
existingKeys.add(cleaned);
|
|
8921
9008
|
}
|
|
@@ -8935,7 +9022,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8935
9022
|
);
|
|
8936
9023
|
if (!svcScopedEnv) {
|
|
8937
9024
|
svcScopedEnv = {
|
|
8938
|
-
id:
|
|
9025
|
+
id: randomUUID7(),
|
|
8939
9026
|
projectId: projectMonoId,
|
|
8940
9027
|
name: `${service?.name || serviceName} (${globalEnv.name})`,
|
|
8941
9028
|
scope: "service",
|
|
@@ -8956,7 +9043,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
8956
9043
|
const baseEntry = Object.entries(svcScopedEnv.variables).find(([, v]) => v.key === cleaned);
|
|
8957
9044
|
let varId = baseEntry?.[0];
|
|
8958
9045
|
if (!varId) {
|
|
8959
|
-
varId =
|
|
9046
|
+
varId = randomUUID7();
|
|
8960
9047
|
svcScopedEnv.variables[varId] = {
|
|
8961
9048
|
key: cleaned,
|
|
8962
9049
|
value: { value: "", pre: "", post: "", isSecret: false, shareWithAi: false, injectIntoAi: false, required: false, overrideOnly: false, description: "" }
|
|
@@ -8986,13 +9073,13 @@ async function runLegacyMigration(dataDir) {
|
|
|
8986
9073
|
flatOverrides[varId] = makeVariable(cleaned, value);
|
|
8987
9074
|
}
|
|
8988
9075
|
} else {
|
|
8989
|
-
flatOverrides[
|
|
9076
|
+
flatOverrides[randomUUID7()] = makeVariable(cleaned, value);
|
|
8990
9077
|
}
|
|
8991
9078
|
} else {
|
|
8992
9079
|
const cleaned = cleanVarKey(key);
|
|
8993
9080
|
const existingVarId = Object.entries(env2.variables).find(([, v]) => v.key === cleaned)?.[0];
|
|
8994
9081
|
if (!existingVarId) {
|
|
8995
|
-
const varId =
|
|
9082
|
+
const varId = randomUUID7();
|
|
8996
9083
|
env2.variables[varId] = makeVariable(cleaned, value);
|
|
8997
9084
|
varIdLookup.set(`${envId}:${cleaned}`, varId);
|
|
8998
9085
|
}
|
|
@@ -9083,7 +9170,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9083
9170
|
const { resolve: resolve4 } = await import("path");
|
|
9084
9171
|
const abDataDir = resolve4(dataDir);
|
|
9085
9172
|
const candidateDirs = [
|
|
9086
|
-
join15(
|
|
9173
|
+
join15(dirname6(env.DATA_DIR), ".runeya", "dbs", "overrides"),
|
|
9087
9174
|
join15(abDataDir, "dbs", "overrides")
|
|
9088
9175
|
];
|
|
9089
9176
|
let overridesDir = null;
|
|
@@ -9176,7 +9263,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9176
9263
|
if (isSameAsBase(value, baseVar)) continue;
|
|
9177
9264
|
flatOverrides[varId] = makeVariable(cleaned, value);
|
|
9178
9265
|
} else {
|
|
9179
|
-
flatOverrides[
|
|
9266
|
+
flatOverrides[randomUUID7()] = makeVariable(cleaned, value);
|
|
9180
9267
|
}
|
|
9181
9268
|
}
|
|
9182
9269
|
}
|
|
@@ -9213,7 +9300,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9213
9300
|
);
|
|
9214
9301
|
if (!svcScopedEnv) {
|
|
9215
9302
|
svcScopedEnv = {
|
|
9216
|
-
id:
|
|
9303
|
+
id: randomUUID7(),
|
|
9217
9304
|
projectId: globalEnv["projectId"],
|
|
9218
9305
|
name: `${service?.["name"] || serviceName} (${globalEnv["name"]})`,
|
|
9219
9306
|
scope: "service",
|
|
@@ -9235,7 +9322,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
9235
9322
|
const baseEntry = Object.entries(svcScopedEnv["variables"]).find(([, v]) => v.key === cleaned);
|
|
9236
9323
|
let varId = baseEntry?.[0];
|
|
9237
9324
|
if (!varId) {
|
|
9238
|
-
varId =
|
|
9325
|
+
varId = randomUUID7();
|
|
9239
9326
|
svcScopedEnv["variables"][varId] = {
|
|
9240
9327
|
key: cleaned,
|
|
9241
9328
|
value: { value: "", pre: "", post: "", isSecret: false, shareWithAi: false, injectIntoAi: false, required: false, overrideOnly: false, description: "" }
|
|
@@ -10425,7 +10512,7 @@ async function createLocalServer() {
|
|
|
10425
10512
|
stopClaudeTranscriptWatcher();
|
|
10426
10513
|
stopCodexTranscriptWatcher();
|
|
10427
10514
|
imageCleanupService.stop();
|
|
10428
|
-
cloudSyncBridge.stopAll();
|
|
10515
|
+
void cloudSyncBridge.stopAll();
|
|
10429
10516
|
await Promise.all([
|
|
10430
10517
|
unregisterInstance(),
|
|
10431
10518
|
agentSpawner.shutdown(),
|
|
@@ -10442,7 +10529,7 @@ async function createLocalServer() {
|
|
|
10442
10529
|
]);
|
|
10443
10530
|
console.log("[server] Shutdown complete");
|
|
10444
10531
|
};
|
|
10445
|
-
const { initCompanion } = await import("./companion-
|
|
10532
|
+
const { initCompanion } = await import("./companion-HEJHC3UR.js");
|
|
10446
10533
|
initCompanion();
|
|
10447
10534
|
return { app, server, wss, shutdown };
|
|
10448
10535
|
}
|
|
@@ -10572,7 +10659,7 @@ function onTrayServicesChanged(listener) {
|
|
|
10572
10659
|
}
|
|
10573
10660
|
|
|
10574
10661
|
// ../server/src/services/tray-icon.ts
|
|
10575
|
-
import { mkdir as
|
|
10662
|
+
import { mkdir as mkdir12, writeFile as writeFile10, rename as rename8 } from "fs/promises";
|
|
10576
10663
|
import { join as join17 } from "path";
|
|
10577
10664
|
|
|
10578
10665
|
// ../server/src/services/png-to-ico.ts
|
|
@@ -10761,7 +10848,7 @@ async function renderThemedIcon(platform) {
|
|
|
10761
10848
|
}
|
|
10762
10849
|
async function writeTrayIcon(stem, png, platform) {
|
|
10763
10850
|
const dir = trayIconDir();
|
|
10764
|
-
await
|
|
10851
|
+
await mkdir12(dir, { recursive: true });
|
|
10765
10852
|
const path = join17(dir, stem);
|
|
10766
10853
|
if (platform === "win32") {
|
|
10767
10854
|
const ico = pngToIco(png);
|
|
@@ -10889,4 +10976,4 @@ export {
|
|
|
10889
10976
|
startProcess,
|
|
10890
10977
|
stopProcess
|
|
10891
10978
|
};
|
|
10892
|
-
//# sourceMappingURL=src-
|
|
10979
|
+
//# sourceMappingURL=src-YUVA6WCM.js.map
|