@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
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import {
|
|
2
|
+
machineRoot
|
|
3
|
+
} from "./chunk-ZFELQG4B.js";
|
|
4
|
+
|
|
5
|
+
// ../server/src/services/disk-freshness.ts
|
|
6
|
+
import { stat } from "fs/promises";
|
|
7
|
+
var seen = /* @__PURE__ */ new Map();
|
|
8
|
+
async function rememberFile(path) {
|
|
9
|
+
try {
|
|
10
|
+
const s = await stat(path);
|
|
11
|
+
seen.set(path, { mtimeMs: s.mtimeMs, size: s.size, ino: s.ino });
|
|
12
|
+
} catch {
|
|
13
|
+
seen.delete(path);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async function hasChangedSinceRead(path) {
|
|
17
|
+
const known = seen.get(path);
|
|
18
|
+
if (!known) return true;
|
|
19
|
+
try {
|
|
20
|
+
const s = await stat(path);
|
|
21
|
+
return s.mtimeMs !== known.mtimeMs || s.size !== known.size || s.ino !== known.ino;
|
|
22
|
+
} catch {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function wasRead(path) {
|
|
27
|
+
return seen.has(path);
|
|
28
|
+
}
|
|
29
|
+
async function fingerprintFiles(paths) {
|
|
30
|
+
const stamps = await Promise.all(paths.map(async (path) => {
|
|
31
|
+
try {
|
|
32
|
+
const s = await stat(path);
|
|
33
|
+
return `${path}:${s.mtimeMs}:${s.size}:${s.ino}`;
|
|
34
|
+
} catch {
|
|
35
|
+
return `${path}:-`;
|
|
36
|
+
}
|
|
37
|
+
}));
|
|
38
|
+
return stamps.sort().join("|");
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// ../server/src/services/run-store-utils.ts
|
|
42
|
+
import { randomUUID } from "crypto";
|
|
43
|
+
import { chmod, mkdir, rename, rm, writeFile, readFile } from "fs/promises";
|
|
44
|
+
import { dirname, resolve, sep } from "path";
|
|
45
|
+
var SAFE_PATH_SEGMENT_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/;
|
|
46
|
+
function resolveConversationRunDir(rootDirName, conversationId) {
|
|
47
|
+
if (!SAFE_PATH_SEGMENT_RE.test(conversationId)) {
|
|
48
|
+
throw new Error("Invalid conversationId");
|
|
49
|
+
}
|
|
50
|
+
const base = resolve(machineRoot(), rootDirName);
|
|
51
|
+
const dir = resolve(base, conversationId);
|
|
52
|
+
if (!dir.startsWith(base + sep)) {
|
|
53
|
+
throw new Error("Invalid conversationId");
|
|
54
|
+
}
|
|
55
|
+
return dir;
|
|
56
|
+
}
|
|
57
|
+
async function atomicWriteSecure(filePath, content) {
|
|
58
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
59
|
+
const tmpPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
|
|
60
|
+
try {
|
|
61
|
+
await writeFile(tmpPath, content, typeof content === "string" ? "utf-8" : void 0);
|
|
62
|
+
await rename(tmpPath, filePath);
|
|
63
|
+
} catch (err) {
|
|
64
|
+
await rm(tmpPath, { force: true }).catch(() => {
|
|
65
|
+
});
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
await chmod(filePath, 384);
|
|
69
|
+
}
|
|
70
|
+
async function atomicWriteJsonSecure(filePath, data, pretty = false) {
|
|
71
|
+
await atomicWriteSecure(filePath, JSON.stringify(data, null, pretty ? 2 : 0));
|
|
72
|
+
}
|
|
73
|
+
async function readJsonFileSafe(filePath) {
|
|
74
|
+
try {
|
|
75
|
+
const raw = await readFile(filePath, "utf-8");
|
|
76
|
+
return JSON.parse(raw);
|
|
77
|
+
} catch {
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export {
|
|
83
|
+
rememberFile,
|
|
84
|
+
hasChangedSinceRead,
|
|
85
|
+
wasRead,
|
|
86
|
+
fingerprintFiles,
|
|
87
|
+
resolveConversationRunDir,
|
|
88
|
+
atomicWriteSecure,
|
|
89
|
+
atomicWriteJsonSecure,
|
|
90
|
+
readJsonFileSafe
|
|
91
|
+
};
|
|
92
|
+
//# sourceMappingURL=chunk-GL7WA5K3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../server/src/services/disk-freshness.ts","../../server/src/services/run-store-utils.ts"],"sourcesContent":["import { stat } from 'node:fs/promises';\n\n/**\n * Le fichier a-t-il changé depuis qu'on l'a lu ?\n *\n * Les stores gardent de côté ce qu'ils n'ont pas su déchiffrer, pour le\n * réécrire tel quel plutôt que de l'effacer. Cette copie est la bonne réponse\n * tant que personne d'autre ne touche au fichier — et la mauvaise dès que\n * quelqu'un le répare par-dessous : la copie, elle, ne se périme jamais, et la\n * sauvegarde suivante réinstalle l'état d'avant la réparation.\n *\n * C'est arrivé deux fois de suite sur le même coffre : une conversion de clé\n * menée sur le disque, défaite quelques minutes plus tard par un store qui\n * tenait encore l'ancien chiffré en mémoire.\n *\n * D'où ce repère : l'empreinte du fichier au moment de la lecture. Si elle a\n * bougé, la copie mémoire ne fait plus foi et doit être abandonnée.\n */\n\ninterface Fingerprint {\n mtimeMs: number;\n size: number;\n /**\n * L'inode du chemin, qui change à chaque `rename` par-dessus.\n *\n * La date et la taille laissent passer le motif d'écriture de tout le dépôt :\n * les stores réécrivent le fichier entier, donc une modification rend souvent\n * le même nombre d'octets, et deux instances qui réagissent au même événement\n * écrivent dans la même milliseconde. Le fichier temporaire renommé\n * par-dessus, lui, installe toujours un autre inode.\n *\n * Là où le système n'en expose pas (il rend alors 0), le repère retombe sur\n * la date et la taille — ce qu'il valait avant.\n */\n ino: number;\n}\n\nconst seen = new Map<string, Fingerprint>();\n\n/** Retenir l'état d'un fichier au moment où on vient de le lire. */\nexport async function rememberFile(path: string): Promise<void> {\n try {\n const s = await stat(path);\n seen.set(path, { mtimeMs: s.mtimeMs, size: s.size, ino: s.ino });\n } catch {\n // Pas encore de fichier : rien à retenir, et rien à réémettre non plus.\n seen.delete(path);\n }\n}\n\n/**\n * Vrai si le fichier a changé — ou si l'on ne sait pas.\n *\n * L'ignorance compte comme un changement : réécrire une copie dont on ne peut\n * plus prouver qu'elle correspond au disque est précisément le geste à éviter.\n */\nexport async function hasChangedSinceRead(path: string): Promise<boolean> {\n const known = seen.get(path);\n if (!known) return true;\n try {\n const s = await stat(path);\n return s.mtimeMs !== known.mtimeMs || s.size !== known.size || s.ino !== known.ino;\n } catch {\n return true;\n }\n}\n\n/**\n * A-t-on lu ce fichier ?\n *\n * `hasChangedSinceRead` tient l'ignorance pour un changement : c'est juste\n * quand il s'agit de décider si une copie mémoire fait encore foi. Ça ne l'est\n * pas pour décider d'écrire — un fichier jamais lu est le cas d'un coffre neuf,\n * et le traiter comme « modifié sous nos pieds » revenait à ne jamais écrire la\n * première fois. Les appelants qui protègent une écriture demandent donc les\n * deux : connu, et inchangé.\n */\nexport function wasRead(path: string): boolean {\n return seen.has(path);\n}\n\n/** Oublier un fichier — après un rechargement complet, par exemple. */\nexport function forgetFile(path: string): void {\n seen.delete(path);\n}\n\n/**\n * L'empreinte d'un ensemble de fichiers : lesquels, et dans quel état.\n *\n * Le repère ci-dessus répond pour un fichier qu'on a lu soi-même ; celui-ci\n * répond pour un store dont le contenu vient de plusieurs fichiers à la fois —\n * un par coffre — et dont la question est « le disque a-t-il bougé depuis mon\n * dernier chargement ? ». Comparer deux empreintes coûte quelques `stat` ;\n * recharger coûte autant de lectures, d'analyses et de déchiffrements.\n *\n * L'absence d'un fichier en fait partie : un coffre disparu change l'empreinte\n * autant qu'un coffre modifié.\n */\nexport async function fingerprintFiles(paths: string[]): Promise<string> {\n const stamps = await Promise.all(paths.map(async (path) => {\n try {\n const s = await stat(path);\n // L'inode en fait partie pour la raison décrite sur `Fingerprint` : un\n // fichier renommé par-dessus la cible peut n'avoir bougé ni en taille ni\n // en date, et reste pourtant un autre contenu.\n return `${path}:${s.mtimeMs}:${s.size}:${s.ino}`;\n } catch {\n return `${path}:-`;\n }\n }));\n return stamps.sort().join('|');\n}\n","import { randomUUID } from 'node:crypto';\nimport { chmod, mkdir, rename, rm, writeFile, readFile } from 'node:fs/promises';\nimport { dirname, resolve, sep } from 'node:path';\nimport { machineRoot } from './vault-resolver.js';\n\nconst SAFE_PATH_SEGMENT_RE = /^[a-zA-Z0-9][a-zA-Z0-9._-]{0,127}$/;\n\nexport function resolveConversationRunDir(rootDirName: string, conversationId: string): string {\n if (!SAFE_PATH_SEGMENT_RE.test(conversationId)) {\n throw new Error('Invalid conversationId');\n }\n // Machine-wide, like the conversations these runs belong to: using the launch\n // directory would put a `.runeya` in a repository just for asking the AI a\n // question about a cloud project.\n const base = resolve(machineRoot(), rootDirName);\n const dir = resolve(base, conversationId);\n if (!dir.startsWith(base + sep)) {\n throw new Error('Invalid conversationId');\n }\n return dir;\n}\n\nexport async function atomicWriteSecure(filePath: string, content: string | Uint8Array): Promise<void> {\n await mkdir(dirname(filePath), { recursive: true });\n // Un nom par écriture : deux Runeya d'un même poste écrivent les mêmes\n // fichiers, et un `.tmp` commun se fait renommer sous le nez de l'autre.\n const tmpPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await writeFile(tmpPath, content, typeof content === 'string' ? 'utf-8' : undefined);\n await rename(tmpPath, filePath);\n } catch (err) {\n // Un nom unique ne se réécrit jamais : laissé là, chaque échec en ajouterait un.\n await rm(tmpPath, { force: true }).catch(() => {});\n throw err;\n }\n await chmod(filePath, 0o600);\n}\n\nexport async function atomicWriteJsonSecure(filePath: string, data: unknown, pretty = false): Promise<void> {\n await atomicWriteSecure(filePath, JSON.stringify(data, null, pretty ? 2 : 0));\n}\n\nexport async function readJsonFileSafe<T>(filePath: string): Promise<T | null> {\n try {\n const raw = await readFile(filePath, 'utf-8');\n return JSON.parse(raw) as T;\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;;AAAA,SAAS,YAAY;AAqCrB,IAAM,OAAO,oBAAI,IAAyB;AAG1C,eAAsB,aAAa,MAA6B;AAC9D,MAAI;AACF,UAAM,IAAI,MAAM,KAAK,IAAI;AACzB,SAAK,IAAI,MAAM,EAAE,SAAS,EAAE,SAAS,MAAM,EAAE,MAAM,KAAK,EAAE,IAAI,CAAC;AAAA,EACjE,QAAQ;AAEN,SAAK,OAAO,IAAI;AAAA,EAClB;AACF;AAQA,eAAsB,oBAAoB,MAAgC;AACxE,QAAM,QAAQ,KAAK,IAAI,IAAI;AAC3B,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI;AACF,UAAM,IAAI,MAAM,KAAK,IAAI;AACzB,WAAO,EAAE,YAAY,MAAM,WAAW,EAAE,SAAS,MAAM,QAAQ,EAAE,QAAQ,MAAM;AAAA,EACjF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYO,SAAS,QAAQ,MAAuB;AAC7C,SAAO,KAAK,IAAI,IAAI;AACtB;AAmBA,eAAsB,iBAAiB,OAAkC;AACvE,QAAM,SAAS,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,SAAS;AACzD,QAAI;AACF,YAAM,IAAI,MAAM,KAAK,IAAI;AAIzB,aAAO,GAAG,IAAI,IAAI,EAAE,OAAO,IAAI,EAAE,IAAI,IAAI,EAAE,GAAG;AAAA,IAChD,QAAQ;AACN,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF,CAAC,CAAC;AACF,SAAO,OAAO,KAAK,EAAE,KAAK,GAAG;AAC/B;;;AC/GA,SAAS,kBAAkB;AAC3B,SAAS,OAAO,OAAO,QAAQ,IAAI,WAAW,gBAAgB;AAC9D,SAAS,SAAS,SAAS,WAAW;AAGtC,IAAM,uBAAuB;AAEtB,SAAS,0BAA0B,aAAqB,gBAAgC;AAC7F,MAAI,CAAC,qBAAqB,KAAK,cAAc,GAAG;AAC9C,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AAIA,QAAM,OAAO,QAAQ,YAAY,GAAG,WAAW;AAC/C,QAAM,MAAM,QAAQ,MAAM,cAAc;AACxC,MAAI,CAAC,IAAI,WAAW,OAAO,GAAG,GAAG;AAC/B,UAAM,IAAI,MAAM,wBAAwB;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,eAAsB,kBAAkB,UAAkB,SAA6C;AACrG,QAAM,MAAM,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAGlD,QAAM,UAAU,GAAG,QAAQ,IAAI,QAAQ,GAAG,IAAI,WAAW,CAAC;AAC1D,MAAI;AACF,UAAM,UAAU,SAAS,SAAS,OAAO,YAAY,WAAW,UAAU,MAAS;AACnF,UAAM,OAAO,SAAS,QAAQ;AAAA,EAChC,SAAS,KAAK;AAEZ,UAAM,GAAG,SAAS,EAAE,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjD,UAAM;AAAA,EACR;AACA,QAAM,MAAM,UAAU,GAAK;AAC7B;AAEA,eAAsB,sBAAsB,UAAkB,MAAe,SAAS,OAAsB;AAC1G,QAAM,kBAAkB,UAAU,KAAK,UAAU,MAAM,MAAM,SAAS,IAAI,CAAC,CAAC;AAC9E;AAEA,eAAsB,iBAAoB,UAAqC;AAC7E,MAAI;AACF,UAAM,MAAM,MAAM,SAAS,UAAU,OAAO;AAC5C,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;","names":[]}
|
|
@@ -1,8 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
atomicWriteSecure,
|
|
3
|
+
hasChangedSinceRead,
|
|
4
|
+
rememberFile,
|
|
5
|
+
wasRead
|
|
6
|
+
} from "./chunk-GL7WA5K3.js";
|
|
1
7
|
import {
|
|
2
8
|
SchemaVersionSchema,
|
|
3
9
|
SettingsPrivateSchema,
|
|
4
10
|
SettingsSchema
|
|
5
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-T2BV5WZE.js";
|
|
6
12
|
import {
|
|
7
13
|
env,
|
|
8
14
|
legacyMachineFilePath,
|
|
@@ -12,7 +18,7 @@ import {
|
|
|
12
18
|
} from "./chunk-ZFELQG4B.js";
|
|
13
19
|
|
|
14
20
|
// ../server/src/services/settings-manager.ts
|
|
15
|
-
import { readFile
|
|
21
|
+
import { readFile } from "fs/promises";
|
|
16
22
|
import { join } from "path";
|
|
17
23
|
var SETTINGS_FILE = "settings.json";
|
|
18
24
|
var SETTINGS_PRIVATE_FILE = "settings.private.json";
|
|
@@ -37,13 +43,27 @@ var SettingsManager = class {
|
|
|
37
43
|
return vault ?? "";
|
|
38
44
|
}
|
|
39
45
|
async atomicWrite(filename, data, vault) {
|
|
40
|
-
const
|
|
41
|
-
await
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
46
|
+
const filePath = join(this.rootOf(vault), filename);
|
|
47
|
+
await atomicWriteSecure(filePath, JSON.stringify(data, null, 2));
|
|
48
|
+
await rememberFile(filePath);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Le cache de ce coffre fait-il encore foi ?
|
|
52
|
+
*
|
|
53
|
+
* Plusieurs Runeya partagent la racine machine — l'application installée et
|
|
54
|
+
* celle qu'on développe, couramment — et écrivent donc le même fichier. Un
|
|
55
|
+
* cache peuplé une fois et jamais revu rend l'état du démarrage pour
|
|
56
|
+
* toujours, et la sauvegarde suivante le réinstalle sur le disque : ce que
|
|
57
|
+
* l'autre instance avait écrit entre-temps disparaît. Les réglages sont
|
|
58
|
+
* l'endroit où cela coûte le plus cher, parce qu'un coffre n'a qu'un fichier
|
|
59
|
+
* pour toute l'organisation — un projet, lui, a le sien.
|
|
60
|
+
*
|
|
61
|
+
* Un fichier jamais lu n'est pas périmé : c'est un coffre neuf, dont les
|
|
62
|
+
* défauts viennent d'être écrits.
|
|
63
|
+
*/
|
|
64
|
+
async isStale(filename, vault) {
|
|
65
|
+
const path = join(this.rootOf(vault), filename);
|
|
66
|
+
return wasRead(path) && await hasChangedSinceRead(path);
|
|
47
67
|
}
|
|
48
68
|
/**
|
|
49
69
|
* Lire le fichier de CE coffre, et rien d'autre.
|
|
@@ -55,8 +75,11 @@ var SettingsManager = class {
|
|
|
55
75
|
* `migrateSettingsIntoVaults`, pas relu indéfiniment.
|
|
56
76
|
*/
|
|
57
77
|
async readJson(filename, vault) {
|
|
78
|
+
const path = join(this.rootOf(vault), filename);
|
|
58
79
|
try {
|
|
59
|
-
|
|
80
|
+
const parsed = JSON.parse(await readFile(path, "utf-8"));
|
|
81
|
+
await rememberFile(path);
|
|
82
|
+
return parsed;
|
|
60
83
|
} catch {
|
|
61
84
|
return null;
|
|
62
85
|
}
|
|
@@ -79,6 +102,7 @@ var SettingsManager = class {
|
|
|
79
102
|
async getSettings(vault) {
|
|
80
103
|
const key = this.cacheKey(vault);
|
|
81
104
|
let current = this.settings.get(key);
|
|
105
|
+
if (current && await this.isStale(SETTINGS_FILE, vault)) current = void 0;
|
|
82
106
|
if (!current) {
|
|
83
107
|
const raw = await this.readJson(SETTINGS_FILE, vault);
|
|
84
108
|
const parsed = raw ? SettingsSchema.safeParse(raw) : null;
|
|
@@ -99,6 +123,7 @@ var SettingsManager = class {
|
|
|
99
123
|
async getPrivateSettings(vault) {
|
|
100
124
|
const key = this.cacheKey(vault);
|
|
101
125
|
let current = this.settingsPrivate.get(key);
|
|
126
|
+
if (current && await this.isStale(SETTINGS_PRIVATE_FILE, vault)) current = void 0;
|
|
102
127
|
if (!current) {
|
|
103
128
|
const raw = await this.readJson(SETTINGS_PRIVATE_FILE, vault);
|
|
104
129
|
const parsed = raw ? SettingsPrivateSchema.safeParse(raw) : null;
|
|
@@ -135,12 +160,7 @@ var SettingsManager = class {
|
|
|
135
160
|
}
|
|
136
161
|
async saveSchemaVersion(sv) {
|
|
137
162
|
this.schemaVersion = sv;
|
|
138
|
-
await
|
|
139
|
-
const filePath = machineFilePath(SCHEMA_VERSION_FILE);
|
|
140
|
-
const tmpPath = filePath + ".tmp";
|
|
141
|
-
await writeFile(tmpPath, JSON.stringify(sv, null, 2), "utf-8");
|
|
142
|
-
await rename(tmpPath, filePath);
|
|
143
|
-
await chmod(filePath, 384);
|
|
163
|
+
await atomicWriteSecure(machineFilePath(SCHEMA_VERSION_FILE), JSON.stringify(sv, null, 2));
|
|
144
164
|
}
|
|
145
165
|
getCurrentSchemaVersion() {
|
|
146
166
|
return CURRENT_SCHEMA_VERSION;
|
|
@@ -151,4 +171,4 @@ var settingsManager = new SettingsManager();
|
|
|
151
171
|
export {
|
|
152
172
|
settingsManager
|
|
153
173
|
};
|
|
154
|
-
//# sourceMappingURL=chunk-
|
|
174
|
+
//# sourceMappingURL=chunk-NIU3CN5A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../server/src/services/settings-manager.ts"],"sourcesContent":["import { readFile } from 'node:fs/promises';\nimport { env } from '../config/env.js';\nimport { join } from 'node:path';\nimport { machineFilePath, legacyMachineFilePath, machineRoot, orgVaultRoot } from './vault-resolver.js';\nimport { SettingsSchema, SchemaVersionSchema, SettingsPrivateSchema } from '@runeya/packages-shared';\nimport type { Settings, SchemaVersion, SettingsPrivate } from '@runeya/packages-shared';\nimport { rememberFile, hasChangedSinceRead, wasRead } from './disk-freshness.js';\nimport { atomicWriteSecure } from './run-store-utils.js';\n\nconst SETTINGS_FILE = 'settings.json';\nconst SETTINGS_PRIVATE_FILE = 'settings.private.json';\nconst SCHEMA_VERSION_FILE = 'schema-version.json';\nconst CURRENT_SCHEMA_VERSION = 4;\n\n/**\n * Les réglages vivent dans le coffre de ce qu'ils configurent.\n *\n * Ils étaient au niveau machine — un fichier pour tout le poste — alors qu'ils\n * décrivent des choses qui appartiennent à des organisations différentes : les\n * fournisseurs d'IA qui paient le travail d'une équipe, les scénarios qui\n * décrivent ses services. Un réglage global obligeait donc à partager la clé\n * machine pour partager un secret d'organisation.\n *\n * `vault` désigne le coffre : l'identifiant d'une organisation, ou l'absence\n * pour le répertoire de lancement — celui d'un projet local, qui n'appartient à\n * personne d'autre. Rien ne reste au niveau machine sinon la session cloud,\n * irréductible puisque c'est elle qui donne accès aux organisations.\n */\nclass SettingsManager {\n private settings = new Map<string, Settings>();\n private settingsPrivate = new Map<string, SettingsPrivate>();\n private schemaVersion: SchemaVersion | null = null;\n\n /**\n * Le coffre visé, sous forme de racine sur le disque.\n *\n * Sans organisation, la racine machine — pas le répertoire de lancement. Ce\n * n'est pas un reste de l'ancien monde : y écrire forcerait un `.runeya` à\n * exister chez quelqu'un qui ne travaille que sur des projets cloud, ce que\n * les coffres ont justement supprimé (et ce qu'un test garde).\n */\n private rootOf(vault?: string): string {\n return vault ? orgVaultRoot(vault) : machineRoot();\n }\n\n private cacheKey(vault?: string): string {\n return vault ?? '';\n }\n\n private async atomicWrite(filename: string, data: unknown, vault?: string): Promise<void> {\n const filePath = join(this.rootOf(vault), filename);\n await atomicWriteSecure(filePath, JSON.stringify(data, null, 2));\n // Notre propre écriture devient la référence : sans elle, la lecture\n // suivante prendrait ce fichier pour l'œuvre d'une autre instance et\n // relirait pour rien.\n await rememberFile(filePath);\n }\n\n /**\n * Le cache de ce coffre fait-il encore foi ?\n *\n * Plusieurs Runeya partagent la racine machine — l'application installée et\n * celle qu'on développe, couramment — et écrivent donc le même fichier. Un\n * cache peuplé une fois et jamais revu rend l'état du démarrage pour\n * toujours, et la sauvegarde suivante le réinstalle sur le disque : ce que\n * l'autre instance avait écrit entre-temps disparaît. Les réglages sont\n * l'endroit où cela coûte le plus cher, parce qu'un coffre n'a qu'un fichier\n * pour toute l'organisation — un projet, lui, a le sien.\n *\n * Un fichier jamais lu n'est pas périmé : c'est un coffre neuf, dont les\n * défauts viennent d'être écrits.\n */\n private async isStale(filename: string, vault?: string): Promise<boolean> {\n const path = join(this.rootOf(vault), filename);\n return wasRead(path) && await hasChangedSinceRead(path);\n }\n\n /**\n * Lire le fichier de CE coffre, et rien d'autre.\n *\n * Pas de repli sur un autre emplacement : un réglage lu ailleurs que là où il\n * est écrit fait deux vérités pour un même fait, et l'accord entre les deux\n * devient une chose de plus à tenir. Ce que les versions précédentes ont\n * écrit ailleurs est déplacé une fois pour toutes par\n * `migrateSettingsIntoVaults`, pas relu indéfiniment.\n */\n private async readJson<T>(filename: string, vault?: string): Promise<T | null> {\n const path = join(this.rootOf(vault), filename);\n try {\n const parsed = JSON.parse(await readFile(path, 'utf-8')) as T;\n // Repère pris après coup : c'est cette lecture-là que le cache reflète.\n await rememberFile(path);\n return parsed;\n } catch {\n return null;\n }\n }\n\n /** Vide les caches — après un déplacement de fichiers sous nos pieds. */\n forget(): void {\n this.settings.clear();\n this.settingsPrivate.clear();\n }\n\n /** Un fichier qui appartient au poste, pas à un coffre. */\n private async readMachineJson<T>(filename: string): Promise<T | null> {\n for (const path of [machineFilePath(filename), legacyMachineFilePath(filename)]) {\n try {\n return JSON.parse(await readFile(path, 'utf-8')) as T;\n } catch {\n // Try the next location.\n }\n }\n return null;\n }\n\n async getSettings(vault?: string): Promise<Settings> {\n const key = this.cacheKey(vault);\n let current = this.settings.get(key);\n if (current && await this.isStale(SETTINGS_FILE, vault)) current = undefined;\n if (!current) {\n const raw = await this.readJson<unknown>(SETTINGS_FILE, vault);\n const parsed = raw ? SettingsSchema.safeParse(raw) : null;\n if (parsed?.success) {\n current = parsed.data;\n this.settings.set(key, current);\n } else {\n current = SettingsSchema.parse({ mode: env.MODE, cloudUrl: env.CLOUD_URL ?? null });\n await this.saveSettings(current, vault);\n }\n }\n return current;\n }\n\n async saveSettings(settings: Settings, vault?: string): Promise<void> {\n this.settings.set(this.cacheKey(vault), settings);\n await this.atomicWrite(SETTINGS_FILE, settings, vault);\n }\n\n async getPrivateSettings(vault?: string): Promise<SettingsPrivate> {\n const key = this.cacheKey(vault);\n let current = this.settingsPrivate.get(key);\n if (current && await this.isStale(SETTINGS_PRIVATE_FILE, vault)) current = undefined;\n if (!current) {\n const raw = await this.readJson<unknown>(SETTINGS_PRIVATE_FILE, vault);\n const parsed = raw ? SettingsPrivateSchema.safeParse(raw) : null;\n if (parsed?.success) {\n current = parsed.data;\n this.settingsPrivate.set(key, current);\n } else {\n current = SettingsPrivateSchema.parse({});\n await this.savePrivateSettings(current, vault);\n }\n }\n return current;\n }\n\n async savePrivateSettings(settings: SettingsPrivate, vault?: string): Promise<void> {\n this.settingsPrivate.set(this.cacheKey(vault), settings);\n await this.atomicWrite(SETTINGS_PRIVATE_FILE, settings, vault);\n }\n\n /**\n * La version de schéma reste au niveau machine, et ce n'est pas un oubli :\n * elle ne configure rien, elle date les migrations des données de ce poste.\n */\n async getSchemaVersion(): Promise<SchemaVersion> {\n if (!this.schemaVersion) {\n const raw = await this.readMachineJson<unknown>(SCHEMA_VERSION_FILE);\n const parsed = raw ? SchemaVersionSchema.safeParse(raw) : null;\n if (parsed?.success) {\n this.schemaVersion = parsed.data;\n } else {\n this.schemaVersion = { version: CURRENT_SCHEMA_VERSION, migratedAt: new Date() };\n await this.saveSchemaVersion(this.schemaVersion);\n }\n }\n return this.schemaVersion;\n }\n\n async saveSchemaVersion(sv: SchemaVersion): Promise<void> {\n this.schemaVersion = sv;\n await atomicWriteSecure(machineFilePath(SCHEMA_VERSION_FILE), JSON.stringify(sv, null, 2));\n }\n\n getCurrentSchemaVersion(): number {\n return CURRENT_SCHEMA_VERSION;\n }\n}\n\nexport const settingsManager = new SettingsManager();\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB;AAEzB,SAAS,YAAY;AAOrB,IAAM,gBAAgB;AACtB,IAAM,wBAAwB;AAC9B,IAAM,sBAAsB;AAC5B,IAAM,yBAAyB;AAgB/B,IAAM,kBAAN,MAAsB;AAAA,EACZ,WAAW,oBAAI,IAAsB;AAAA,EACrC,kBAAkB,oBAAI,IAA6B;AAAA,EACnD,gBAAsC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUtC,OAAO,OAAwB;AACrC,WAAO,QAAQ,aAAa,KAAK,IAAI,YAAY;AAAA,EACnD;AAAA,EAEQ,SAAS,OAAwB;AACvC,WAAO,SAAS;AAAA,EAClB;AAAA,EAEA,MAAc,YAAY,UAAkB,MAAe,OAA+B;AACxF,UAAM,WAAW,KAAK,KAAK,OAAO,KAAK,GAAG,QAAQ;AAClD,UAAM,kBAAkB,UAAU,KAAK,UAAU,MAAM,MAAM,CAAC,CAAC;AAI/D,UAAM,aAAa,QAAQ;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,MAAc,QAAQ,UAAkB,OAAkC;AACxE,UAAM,OAAO,KAAK,KAAK,OAAO,KAAK,GAAG,QAAQ;AAC9C,WAAO,QAAQ,IAAI,KAAK,MAAM,oBAAoB,IAAI;AAAA,EACxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAc,SAAY,UAAkB,OAAmC;AAC7E,UAAM,OAAO,KAAK,KAAK,OAAO,KAAK,GAAG,QAAQ;AAC9C,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,MAAM,SAAS,MAAM,OAAO,CAAC;AAEvD,YAAM,aAAa,IAAI;AACvB,aAAO;AAAA,IACT,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA,EAGA,SAAe;AACb,SAAK,SAAS,MAAM;AACpB,SAAK,gBAAgB,MAAM;AAAA,EAC7B;AAAA;AAAA,EAGA,MAAc,gBAAmB,UAAqC;AACpE,eAAW,QAAQ,CAAC,gBAAgB,QAAQ,GAAG,sBAAsB,QAAQ,CAAC,GAAG;AAC/E,UAAI;AACF,eAAO,KAAK,MAAM,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,MACjD,QAAQ;AAAA,MAER;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAAY,OAAmC;AACnD,UAAM,MAAM,KAAK,SAAS,KAAK;AAC/B,QAAI,UAAU,KAAK,SAAS,IAAI,GAAG;AACnC,QAAI,WAAW,MAAM,KAAK,QAAQ,eAAe,KAAK,EAAG,WAAU;AACnE,QAAI,CAAC,SAAS;AACZ,YAAM,MAAM,MAAM,KAAK,SAAkB,eAAe,KAAK;AAC7D,YAAM,SAAS,MAAM,eAAe,UAAU,GAAG,IAAI;AACrD,UAAI,QAAQ,SAAS;AACnB,kBAAU,OAAO;AACjB,aAAK,SAAS,IAAI,KAAK,OAAO;AAAA,MAChC,OAAO;AACL,kBAAU,eAAe,MAAM,EAAE,MAAM,IAAI,MAAM,UAAU,IAAI,aAAa,KAAK,CAAC;AAClF,cAAM,KAAK,aAAa,SAAS,KAAK;AAAA,MACxC;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,aAAa,UAAoB,OAA+B;AACpE,SAAK,SAAS,IAAI,KAAK,SAAS,KAAK,GAAG,QAAQ;AAChD,UAAM,KAAK,YAAY,eAAe,UAAU,KAAK;AAAA,EACvD;AAAA,EAEA,MAAM,mBAAmB,OAA0C;AACjE,UAAM,MAAM,KAAK,SAAS,KAAK;AAC/B,QAAI,UAAU,KAAK,gBAAgB,IAAI,GAAG;AAC1C,QAAI,WAAW,MAAM,KAAK,QAAQ,uBAAuB,KAAK,EAAG,WAAU;AAC3E,QAAI,CAAC,SAAS;AACZ,YAAM,MAAM,MAAM,KAAK,SAAkB,uBAAuB,KAAK;AACrE,YAAM,SAAS,MAAM,sBAAsB,UAAU,GAAG,IAAI;AAC5D,UAAI,QAAQ,SAAS;AACnB,kBAAU,OAAO;AACjB,aAAK,gBAAgB,IAAI,KAAK,OAAO;AAAA,MACvC,OAAO;AACL,kBAAU,sBAAsB,MAAM,CAAC,CAAC;AACxC,cAAM,KAAK,oBAAoB,SAAS,KAAK;AAAA,MAC/C;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,oBAAoB,UAA2B,OAA+B;AAClF,SAAK,gBAAgB,IAAI,KAAK,SAAS,KAAK,GAAG,QAAQ;AACvD,UAAM,KAAK,YAAY,uBAAuB,UAAU,KAAK;AAAA,EAC/D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,mBAA2C;AAC/C,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,MAAM,MAAM,KAAK,gBAAyB,mBAAmB;AACnE,YAAM,SAAS,MAAM,oBAAoB,UAAU,GAAG,IAAI;AAC1D,UAAI,QAAQ,SAAS;AACnB,aAAK,gBAAgB,OAAO;AAAA,MAC9B,OAAO;AACL,aAAK,gBAAgB,EAAE,SAAS,wBAAwB,YAAY,oBAAI,KAAK,EAAE;AAC/E,cAAM,KAAK,kBAAkB,KAAK,aAAa;AAAA,MACjD;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,kBAAkB,IAAkC;AACxD,SAAK,gBAAgB;AACrB,UAAM,kBAAkB,gBAAgB,mBAAmB,GAAG,KAAK,UAAU,IAAI,MAAM,CAAC,CAAC;AAAA,EAC3F;AAAA,EAEA,0BAAkC;AAChC,WAAO;AAAA,EACT;AACF;AAEO,IAAM,kBAAkB,IAAI,gBAAgB;","names":[]}
|
|
@@ -1097,6 +1097,19 @@ var KanbanBoardSchema = z19.object({
|
|
|
1097
1097
|
columns: z19.array(KanbanColumnSchema).default([]),
|
|
1098
1098
|
/** Les regroupements de colonnes — vide sur un tableau qui n'en a jamais eu. */
|
|
1099
1099
|
columnGroups: z19.array(KanbanColumnGroupSchema).default([]),
|
|
1100
|
+
/**
|
|
1101
|
+
* Les projets auxquels le tableau est rattaché, par leur identifiant.
|
|
1102
|
+
*
|
|
1103
|
+
* Un rattachement, pas une possession : il ne sert qu'à filtrer la liste des
|
|
1104
|
+
* tableaux, et un tableau sans projet (`[]`, le cas par défaut) reste visible
|
|
1105
|
+
* partout. Plusieurs projets sont permis parce qu'une équipe partage souvent
|
|
1106
|
+
* un même tableau entre deux projets — obliger à choisir l'un des deux
|
|
1107
|
+
* ferait disparaître le tableau de la liste de l'autre.
|
|
1108
|
+
*
|
|
1109
|
+
* Les identifiants sont ceux des projets de l'organisation ; le serveur
|
|
1110
|
+
* refuse ceux qu'il ne connaît pas plutôt que de garder un lien mort.
|
|
1111
|
+
*/
|
|
1112
|
+
projectIds: z19.array(z19.string().min(1).max(128)).max(20).default([]),
|
|
1100
1113
|
archived: z19.boolean().default(false),
|
|
1101
1114
|
/** Supprimé, mais conservé avec ses cartes — voir `deletedAt` sur la carte. */
|
|
1102
1115
|
deletedAt: z19.string().optional(),
|
|
@@ -1106,7 +1119,8 @@ var KanbanBoardSchema = z19.object({
|
|
|
1106
1119
|
var CreateKanbanBoardInput = z19.object({
|
|
1107
1120
|
name: z19.string().min(1).max(200),
|
|
1108
1121
|
description: z19.string().max(1e4).optional(),
|
|
1109
|
-
instructions: z19.string().max(2e4).optional()
|
|
1122
|
+
instructions: z19.string().max(2e4).optional(),
|
|
1123
|
+
projectIds: z19.array(z19.string().min(1).max(128)).max(20).optional()
|
|
1110
1124
|
});
|
|
1111
1125
|
var UpdateKanbanBoardInput = z19.object({
|
|
1112
1126
|
id: z19.string(),
|
|
@@ -1114,7 +1128,8 @@ var UpdateKanbanBoardInput = z19.object({
|
|
|
1114
1128
|
description: z19.string().max(1e4).optional(),
|
|
1115
1129
|
instructions: z19.string().max(2e4).optional(),
|
|
1116
1130
|
columns: z19.array(KanbanColumnSchema).optional(),
|
|
1117
|
-
archived: z19.boolean().optional()
|
|
1131
|
+
archived: z19.boolean().optional(),
|
|
1132
|
+
projectIds: z19.array(z19.string().min(1).max(128)).max(20).optional()
|
|
1118
1133
|
});
|
|
1119
1134
|
var KanbanCardLinkSchema = z19.object({
|
|
1120
1135
|
id: z19.string().max(128),
|
|
@@ -1790,4 +1805,4 @@ export {
|
|
|
1790
1805
|
writeEntity,
|
|
1791
1806
|
primaryServiceLink
|
|
1792
1807
|
};
|
|
1793
|
-
//# sourceMappingURL=chunk-
|
|
1808
|
+
//# sourceMappingURL=chunk-T2BV5WZE.js.map
|