@runeya/runeya 2.0.52 → 2.0.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-manager-RGDHYM64.js +7 -0
- package/{chunk-IHUELGIB.js → chunk-EL75GG7O.js} +125 -44
- package/chunk-EL75GG7O.js.map +1 -0
- package/index.js +1 -1
- package/package.json +1 -1
- package/{src-MHKSKRBK.js → src-4GK5OK3K.js} +6105 -5818
- package/src-4GK5OK3K.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-Cz4cGFw_.js +13 -0
- package/web/assets/AgentTerminalPage-ChRcIGvk.js +1 -0
- package/web/assets/AiChatPage-jeAEz3pL.js +1 -0
- package/web/assets/AppLayout-C8-7N9YJ.js +1 -0
- package/web/assets/AuditPage-DfJlEoaI.js +1 -0
- package/web/assets/CloudAccountPage--6fr9upU.js +1 -0
- package/web/assets/CloudAccountPage-CI6Vvfrv.js +1 -0
- package/web/assets/CloudAccountPage-CVAMkCOF.css +1 -0
- package/web/assets/CloudMessagingPage-CWz2XG-O.js +2 -0
- package/web/assets/DashboardPage-Bkla6ZI9.js +1 -0
- package/web/assets/{EditorIcon-DGhMRlEH.js → EditorIcon-BYTcFJnr.js} +2 -2
- package/web/assets/EnvironmentForm-Tody7LuY.js +108 -0
- package/web/assets/EnvironmentFormPage-r_Hn2SiC.js +1 -0
- package/web/assets/EnvironmentListPage-BPQL4Fdp.js +1 -0
- package/web/assets/EnvironmentSelector-CsXJXDJE.js +1 -0
- package/web/assets/KanbanBoardPage-C2Cj_u1W.js +4 -0
- package/web/assets/KanbanBoardPage-ZIYuV1kG.css +1 -0
- package/web/assets/KanbanListPage-DG04Ci-t.js +1 -0
- package/web/assets/LaunchProjectPage-ZU10tRlq.js +1 -0
- package/web/assets/LaunchServicesPage-rLishQca.js +1 -0
- package/web/assets/LogViewer-DkR3A0v0.js +3 -0
- package/web/assets/{ProcessControls-CQ8xwnrF.js → ProcessControls-Dkf-zJF8.js} +1 -1
- package/web/assets/ProcessDetailPage-vDdHOtno.js +1 -0
- package/web/assets/{ProcessMetrics-Clh3v2iV.js → ProcessMetrics-BxwLdytO.js} +2 -2
- package/web/assets/ProjectDetailPage-Bu2gDzDU.js +1 -0
- package/web/assets/ProjectListPage-zlXxla_K.js +1 -0
- package/web/assets/RandomJobTestPage-DkxLX-Uy.js +2 -0
- package/web/assets/ScenarioEditorPage-Dlgug19y.js +14 -0
- package/web/assets/SendToChatDialog-BbMjL5KU.js +1 -0
- package/web/assets/ServiceControlsBar-D9mA1wIv.js +1 -0
- package/web/assets/ServiceDetailPage-CPtHs7te.js +2 -0
- package/web/assets/ServiceFormPage-D6zoG4d2.js +1 -0
- package/web/assets/SettingsPage-BL1cbj_d.js +2062 -0
- package/web/assets/{SettingsPage-jkWxbWkZ.css → SettingsPage-BY3dG-wn.css} +1 -1
- package/web/assets/UnlockPage-tTNE4QTc.js +1 -0
- package/web/assets/VariablesTable-C8UT5LGj.js +1 -0
- package/web/assets/VaultMigrationPage-ee6mGXkE.js +1 -0
- package/web/assets/VersionBadge-XGdKeJYP.js +1 -0
- package/web/assets/WikiPage-DBxWCk1C.js +1 -0
- package/web/assets/WikiView-CtMG-Mpi.js +1 -0
- package/web/assets/{add-scalar-classes-BSEzJner.js → add-scalar-classes-CjP6yoH9.js} +26 -26
- package/web/assets/auth-errors-C7Lmr_5E.js +1 -0
- package/web/assets/autocomplete-DLtfuYAg.js +422 -0
- package/web/assets/{basic-shape-diamond.svg-YpT_2yGM.js → basic-shape-diamond.svg-Dwn3EJf7.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-ZHh7P2mz.js → basic-shape-hexagon.svg-kpOvfzAi.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-yEGfULrq.js → basic-shape-primary-circle-ellipse-round.svg-CZpeeE8h.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-CV_MBv8E.js → basic-shape-primary-square-rectangle.svg-lIzT-3bQ.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-CLVN0WJX.js → basic-shape-shield.svg-DB-n6Wmn.js} +1 -1
- package/web/assets/{browser-D4w7UetE.js → browser-Dm_lNzZ-.js} +1 -1
- package/web/assets/{browser-C_GxJ_3e.js → browser-wjfUiObI.js} +1 -1
- package/web/assets/card-C3zlSqpG.js +32 -0
- package/web/assets/{checkbox-DeY_k6xP.js → checkbox-lVXx5U1s.js} +3 -3
- package/web/assets/{chip-DrQIKVKn.js → chip-Cc40pDDT.js} +2 -2
- package/web/assets/client-CN9LxBfq.js +24 -0
- package/web/assets/cloud-chat.store-CKtcP8mx.js +1 -0
- package/web/assets/{cloud-session-BuGqIC29.js → cloud-session-luM5H14C.js} +1 -1
- package/web/assets/column-DlQNKY_S.js +907 -0
- package/web/assets/{computer-device-desktop-monitor.svg-FAeSFvzj.js → computer-device-desktop-monitor.svg-B8fVLOqV.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-DA-GQ3hr.js → computer-device-desktop.svg-CKeybOQk.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-D2eE8iPZ.js → computer-device-laptop.svg-C5xV7_Nt.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-B6zevToY.js → computer-device-mobile-phone-android-samsung-back.svg-5CRKvrQx.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BmxrNEhr.js → computer-device-mobile-phone-android-samsung.svg-Da4aZrXd.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-CojBzdim.js → computer-device-mobile-phone-iphone-x-back.svg-D9phyiQZ.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-1BUZ4i95.js → computer-device-mobile-phone-iphone-x.svg-V7yMTZCu.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-CSfNBal6.js → computer-device-mobile-tablet-touch.svg-CGMdXdex.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-twjoIYnU.js → computer-device-mobile-tablet.svg-66hlusLK.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-DeLJr_Bg.js → computer-device-network-ethernet-cat6.svg-BhuzmqfI.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-D4tLpabf.js → computer-device-network-lan-www.svg-BXLNIvQ6.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-DkinP8JJ.js → computer-device-network-wifi-connection.svg-CaVzq_6z.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-CbTYcPoV.js → computer-device-network-wifi-router.svg-DasSXsmT.js} +1 -1
- package/web/assets/{cssMode-B-5qMS9W.js → cssMode-CokQPPhF.js} +1 -1
- package/web/assets/{divider-CMl36DmL.js → divider-3st3S0cz.js} +2 -2
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-h7u0Vs9p.js → ecology-science-erlenmeyer-flask.svg-0xfq6Yyi.js} +1 -1
- package/web/assets/{fieldset-C1yXTDn4.js → fieldset-CvZZBOcz.js} +2 -2
- package/web/assets/{freemarker2-CjLTuk8k.js → freemarker2-1YMoAedE.js} +1 -1
- package/web/assets/{handlebars-DGqtsUFa.js → handlebars-wAW8puhT.js} +1 -1
- package/web/assets/{html-i8MbH284.js → html-DdFlw76f.js} +1 -1
- package/web/assets/{htmlMode-ClDqI0EC.js → htmlMode-Cy1vm8Ag.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-B8iwzLyv.js → image-flash-lightning.svg-COFAE0wR.js} +1 -1
- package/web/assets/{image-picture-flower.svg-Dk0wJr-9.js → image-picture-flower.svg-ezqcE4KS.js} +1 -1
- package/web/assets/{index-D7XqcLhE.css → index-CICxLkjp.css} +1 -1
- package/web/assets/{index-Dp6bkX9T.js → index-Ccntdgfe.js} +290 -290
- package/web/assets/{interface-alert-exclamation-diamond.svg-BsbY85gZ.js → interface-alert-exclamation-diamond.svg-CHGW-cLp.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-DP1wSCt3.js → interface-alert-exclamation-triangle-warning.svg-DvPTCqs0.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-Xh0RC3va.js → interface-alert-information-circle.svg-jX4BkfAJ.js} +1 -1
- package/web/assets/{interface-award-crown.svg-BYXc7LVx.js → interface-award-crown.svg-DtuQ-cID.js} +1 -1
- package/web/assets/{interface-bookmark.svg-DDQ_ylEK.js → interface-bookmark-tag.svg-CAFVyAoV.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-ket4A6Lr.js → interface-bookmark.svg-BneowIGx.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-TCIcZLUR.js → interface-calendar-date-one.svg-CfpOGCx4.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-HpGg1i7p.js → interface-content-book-open-pages.svg-Cl1dxQ4s.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DanHo22R.js → interface-content-book-page.svg-CEhybPQh.js} +1 -1
- package/web/assets/{interface-content-file.svg-D_7M3Gzg.js → interface-content-file.svg-HK08zzYO.js} +1 -1
- package/web/assets/interface-content-folder.svg-BD3Sy4hk.js +1 -0
- package/web/assets/{interface-content-folder.svg-B56JOABU.js → interface-content-folder.svg-DuncK7Kw.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-D6pxFSYk.js → interface-copy-clipboard.svg-CHxj1VUB.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-CgbZkf8y.js → interface-edit-attachment.svg-DQ-TGp2N.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-DlKyYNaD.js → interface-edit-binocular.svg-CIUJcI__.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-3Z3vgwMa.js → interface-edit-magic-wand.svg-Bn7wsTVd.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-B0HQxlm0.js → interface-edit-tool-paint-roller.svg-BLR1HoWs.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-DTBA5aOW.js → interface-edit-tool-pencil.svg-DM3xZUtj.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-D2sdh8hY.js → interface-favorite-award.svg-Bc8_APGD.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-BwolDorS.js → interface-favorite-flag.svg-BBV01eyw.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-C0xoK2eX.js → interface-favorite-heart.svg-DpFl3KSk.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-B3u5n7c2.js → interface-favorite-star.svg-CaFUQ9jK.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-BQ6_nHMc.js → interface-favorite-stars-sparkles.svg-19cy1b4g.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-DpR1KgBm.js → interface-hierarchy-flowchart.svg-Btiu5TuK.js} +1 -1
- package/web/assets/{interface-home-house.svg-Cxdi_eZT.js → interface-home-house.svg-Bp4aVUgs.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-D3Az4MB1.js → interface-hyperlink.svg-Df34T3Eu.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-CFCx0wxJ.js → interface-lighting-brightness.svg-CBJnLIw7.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-4nQ3nAjd.js → interface-lock-closed.svg-C082mEtr.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-DEZb7XRS.js → interface-lock-open-unlock.svg-ktQ_lN_X.js} +1 -1
- package/web/assets/{interface-login-key.svg-BzhBvtOH.js → interface-login-key.svg-1JZV_q3n.js} +1 -1
- package/web/assets/{interface-search.svg-BTVjJsdx.js → interface-search.svg-BWOepCe2.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-BfeZ86e-.js → interface-setting-cog.svg-Ck7-QPf8.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-BuX4jZss.js → interface-share-megaphone-bullhorn.svg-B4XWLcvf.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-QkrdvPm3.js → interface-share-rocket.svg-jsXjbfvo.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-Cdu9Ssss.js → interface-share-satellite.svg-DYc-pAdI.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-DL0JpObS.js → interface-share-space-ship.svg-azKKMF8L.js} +1 -1
- package/web/assets/{interface-share.svg-BIBmVu-Z.js → interface-share.svg-k0lPxn1t.js} +1 -1
- package/web/assets/{interface-signal-square.svg-DBiXDixA.js → interface-signal-square.svg-eCO4ev15.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-Dw8ufcru.js → interface-time-clock-circle.svg-C0Sm0_j9.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-DW-VGZ9S.js → interface-time-hour-glass.svg-hfRVIC1r.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-BINNDDOm.js → interface-users-multiple.svg-Dm9UimfL.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-7AwWEmfi.js → interface-weather-moon.svg-BhxFHPbN.js} +1 -1
- package/web/assets/{javascript-BmwETCoN.js → javascript-_AR6wrF0.js} +1 -1
- package/web/assets/{jsonMode-jhfq8N1j.js → jsonMode-CYWBTJpV.js} +2 -2
- package/web/assets/{liquid-CXHFHq2a.js → liquid-Doe_Qoxn.js} +1 -1
- package/web/assets/{lspLanguageFeatures-DNlDiaf8.js → lspLanguageFeatures-TK5k9ahW.js} +2 -2
- package/web/assets/{mail-chat-bubble-square.svg-Cbw9XSWq.js → mail-chat-bubble-square.svg-CitsmxJ_.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-BsOn0WRk.js → mail-send-email-paper-airplane.svg-CYDMogt4.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-FiCVjNhS.js → mail-send-envelope.svg-s-A4ytfv.js} +1 -1
- package/web/assets/{mdx-BXQ_HHCT.js → mdx-CSf3fjQb.js} +1 -1
- package/web/assets/{message-BhAEg6uM.js → message-5nViABpL.js} +2 -2
- package/web/assets/{minus-DCjXtDL7.js → minus-mDLJQeXY.js} +2 -2
- package/web/assets/modal-DcxJxueq.js +5 -0
- package/web/assets/modal-n2wMDd7F.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-BPAwldjt.js → money-cashier-receipt.svg-B3w4dcvy.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-D_nR6kZg.js → money-currency-dollar-pay.svg-By5pgatC.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-CoZwsioR.js → money-graph-arrow-increase.svg-JJK_oYl6.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-DTaCKAmM.js → money-graph-bar-chart-increase.svg-BMvEIVpy.js} +1 -1
- package/web/assets/multiselect-CqGmdE3J.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-AXZXO7rv.js → nature-ecology-leaf.svg-CGCHa8bD.js} +1 -1
- package/web/assets/{password-DO4Z8eXp.js → password-CSX8oB5M.js} +4 -4
- package/web/assets/{phone-telephone.svg-DsO2IQVY.js → phone-telephone.svg-CA8_wOQH.js} +1 -1
- package/web/assets/{plus-yPEoWB54.js → plus-CGTKvVZ7.js} +6 -6
- package/web/assets/process.store-CTLjlYjT.js +1 -0
- package/web/assets/{programming-bug.svg-DKOd0mcH.js → programming-bug.svg-Cizii8p1.js} +1 -1
- package/web/assets/{programming-cloud.svg-D9jQ_h92.js → programming-cloud.svg-pnwxJHaK.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-DKTyeoSb.js → programming-computer-database-server.svg-CNt3Jbql.js} +1 -1
- package/web/assets/{programming-computer-database.svg-BDqL3cIA.js → programming-computer-database.svg-ESSkZX3t.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-C3VK_bT8.js → programming-module-four-layout.svg-BGbJvE0O.js} +1 -1
- package/web/assets/{programming-module-three.svg-Bq1FzDKb.js → programming-module-three.svg-D3gOTAlw.js} +1 -1
- package/web/assets/{programming-module.svg-Qm6lzSnJ.js → programming-module.svg-CSHFfsFS.js} +1 -1
- package/web/assets/{programming-script-code.svg-C8X07wUI.js → programming-script-code.svg-DjFoDv0c.js} +1 -1
- package/web/assets/{python-By6Mp1Ix.js → python-MEGp0q_z.js} +1 -1
- package/web/assets/{razor-CEUV3zJp.js → razor-CEazjH4x.js} +1 -1
- package/web/assets/router-BmJL8z_u.js +1 -0
- package/web/assets/settings-scope-BGuX4AI9.js +1 -0
- package/web/assets/settings.store-a49Jijfe.js +1 -0
- package/web/assets/{shopping-cart.svg-BRL8Ll51.js → shopping-cart.svg-Cu7M1oni.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-CXQFba5I.js → shopping-gift-present.svg-Cdnu9uAQ.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-Bn2p6-mI.js → shopping-shipping-box-parcel-package.svg-C6BL6pCC.js} +1 -1
- package/web/assets/{src-Fna7vk35.js → src-BKhMPhsU.js} +13 -13
- package/web/assets/src-DQvVUJe0.js +1 -0
- package/web/assets/{tabpanel-DWqdAA9H.js → tabpanel-B9VkBnSU.js} +3 -3
- package/web/assets/{tag-new-circle.svg-1MfDK7Ga.js → tag-new-circle.svg-BpXDXKC4.js} +1 -1
- package/web/assets/{travel-map-earth-globe.svg-825O-f6n.js → travel-map-earth-globe.svg-B_t8kO2f.js} +1 -1
- package/web/assets/trpc-B-qv_zm2.js +1 -0
- package/web/assets/{tsMode-DijbMMhR.js → tsMode-lBRYpyez.js} +6 -6
- package/web/assets/{typescript-46ax_ZH8.js → typescript-DGOxNj9C.js} +1 -1
- package/web/assets/useAiChatDrawer-xv2HAiHA.js +1 -0
- package/web/assets/useCloudOrg-_Z_zfd63.js +1 -0
- package/web/assets/useProjectCatalog-CNbze2zg.js +1 -0
- package/web/assets/{xml-DflJhDfp.js → xml-Cqgx2kWf.js} +1 -1
- package/web/assets/{yaml-BS1mDEyU.js → yaml-CIs4cY7e.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-FD2NGRIW.js +0 -7
- package/chunk-IHUELGIB.js.map +0 -1
- package/src-MHKSKRBK.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-JTgBbqsP.js +0 -13
- package/web/assets/AgentTerminalPage-fXxKDSBp.js +0 -1
- package/web/assets/AiChatPage-Bp7ILsub.js +0 -1
- package/web/assets/AppLayout-BKe5kedw.js +0 -1
- package/web/assets/AuditPage-Ddclku7y.js +0 -1
- package/web/assets/CloudAccountPage-CJvovJKI.js +0 -1
- package/web/assets/CloudAccountPage-CbfN4BNY.js +0 -1
- package/web/assets/CloudAccountPage-CkavjE7H.css +0 -1
- package/web/assets/CloudMessagingPage-DL7yhkIr.js +0 -2
- package/web/assets/DashboardPage-C5_XFyV4.js +0 -1
- package/web/assets/EnvironmentForm-Cukn9qzo.js +0 -108
- package/web/assets/EnvironmentFormPage-BpfgeFpg.js +0 -1
- package/web/assets/EnvironmentListPage-Li3GLLyj.js +0 -1
- package/web/assets/EnvironmentSelector-BWHfZMtZ.js +0 -1
- package/web/assets/KanbanBoardPage-1w2I89mN.js +0 -4
- package/web/assets/KanbanBoardPage-BvMPl2FW.css +0 -1
- package/web/assets/KanbanListPage-DK1fKIHQ.js +0 -1
- package/web/assets/LaunchProjectPage-D_cvL12d.js +0 -1
- package/web/assets/LaunchServicesPage-CXjCCXsD.js +0 -1
- package/web/assets/LogViewer-UxzuKlYv.js +0 -3
- package/web/assets/ProcessDetailPage-Cs2iFdad.js +0 -1
- package/web/assets/ProjectDetailPage-yy_WuImd.js +0 -1
- package/web/assets/ProjectListPage-BLc6N4m9.js +0 -1
- package/web/assets/RandomJobTestPage--f9IHi8X.js +0 -2
- package/web/assets/ScenarioEditorPage-CGGi9d-0.js +0 -14
- package/web/assets/SendToChatDialog-Do2v5Six.js +0 -1
- package/web/assets/ServiceControlsBar-BssqBAbh.js +0 -1
- package/web/assets/ServiceDetailPage-BX5JWwRn.js +0 -2
- package/web/assets/ServiceFormPage-B_rj0cRE.js +0 -1
- package/web/assets/SettingsPage-B992G0HP.js +0 -2062
- package/web/assets/UnlockPage-hsk1oePv.js +0 -1
- package/web/assets/VariablesTable-BcufD-wK.js +0 -1
- package/web/assets/VaultMigrationPage-g7BEHG1W.js +0 -1
- package/web/assets/VersionBadge-al4x1GFB.js +0 -1
- package/web/assets/WikiPage-7B9dOrIk.js +0 -1
- package/web/assets/WikiView-DmKiYIq5.js +0 -1
- package/web/assets/auth-errors-6e5dqdyJ.js +0 -1
- package/web/assets/autocomplete-BKoTlKQ4.js +0 -422
- package/web/assets/card-BuAageiY.js +0 -32
- package/web/assets/client-DE0Y5Nrj.js +0 -24
- package/web/assets/cloud-chat.store-fBYK5Cgw.js +0 -1
- package/web/assets/column-DEHgjs7t.js +0 -907
- package/web/assets/interface-content-folder.svg-bcqnWOK0.js +0 -1
- package/web/assets/modal-D55b155P.js +0 -5
- package/web/assets/modal-cjFJ-Pqb.js +0 -1
- package/web/assets/multiselect-By28VIxd.js +0 -251
- package/web/assets/process.store-Ddlv2x7t.js +0 -1
- package/web/assets/router-CwxQMOvD.js +0 -1
- package/web/assets/settings.store-CdbxGLwM.js +0 -1
- package/web/assets/src-ZKiShuw1.js +0 -1
- package/web/assets/trpc-C9TOnzsl.js +0 -1
- package/web/assets/useAiChatDrawer-Fipk1tL5.js +0 -1
- package/web/assets/useCloudOrg-B3j8giwe.js +0 -1
- package/web/assets/useProjectCatalog-BW2ZvrJl.js +0 -1
- /package/{agent-manager-FD2NGRIW.js.map → agent-manager-RGDHYM64.js.map} +0 -0
- /package/web/assets/{abap-DMmvWZUy.js → abap-DT2sAUGb.js} +0 -0
- /package/web/assets/{apex-D89PiTzU.js → apex-BqR8ejP0.js} +0 -0
- /package/web/assets/{azcli-ChnjTTA5.js → azcli-DK_jNPxf.js} +0 -0
- /package/web/assets/{bat-uLzQ_FhK.js → bat-BLmcleEN.js} +0 -0
- /package/web/assets/{bicep-CMOK7Q1v.js → bicep-DkR6Nnyy.js} +0 -0
- /package/web/assets/{cameligo-D1AyojFH.js → cameligo-DfT1QA_V.js} +0 -0
- /package/web/assets/{clojure-D9JoUgXn.js → clojure-BbsGZ_q_.js} +0 -0
- /package/web/assets/{coffee-D-5sSToL.js → coffee-CZQPrkXM.js} +0 -0
- /package/web/assets/{cpp-BqT_t_y9.js → cpp-CZLFjmrQ.js} +0 -0
- /package/web/assets/{csharp-CuToYI91.js → csharp-CljM85nx.js} +0 -0
- /package/web/assets/{csp-CffcxvlO.js → csp-B7ItwhrE.js} +0 -0
- /package/web/assets/{css-CUD0biQW.js → css-CIuVviKc.js} +0 -0
- /package/web/assets/{cypher-ByyWL_9U.js → cypher-Lk1MiloH.js} +0 -0
- /package/web/assets/{dart-B__ipcUn.js → dart-B83vLjrb.js} +0 -0
- /package/web/assets/{dockerfile-DS-_8bWw.js → dockerfile--LImnfYW.js} +0 -0
- /package/web/assets/{ecl-DWsNCBUj.js → ecl-C1mPHzto.js} +0 -0
- /package/web/assets/{elixir-OfjEy-3g.js → elixir-F7VkySYx.js} +0 -0
- /package/web/assets/{flow9-BPX22hxS.js → flow9-CyDLjcIP.js} +0 -0
- /package/web/assets/{fsharp-CVJcfIUn.js → fsharp-BtAy52j8.js} +0 -0
- /package/web/assets/{go-CfRHZ3yg.js → go-nAky3Nvu.js} +0 -0
- /package/web/assets/{graphql-BZaO3ttK.js → graphql-BFHB5AhE.js} +0 -0
- /package/web/assets/{hcl-BF9-qUku.js → hcl-DiNGWUmy.js} +0 -0
- /package/web/assets/{ini-BUvw6xhr.js → ini-D1Fg5XrG.js} +0 -0
- /package/web/assets/{java-BZ5BNd2x.js → java-C-10mSK7.js} +0 -0
- /package/web/assets/{julia-DN38cgYT.js → julia-Bqx3lIQk.js} +0 -0
- /package/web/assets/{kotlin-CjEJKT8q.js → kotlin-BBx7H7X0.js} +0 -0
- /package/web/assets/{less-DMEH_Nwq.js → less-BFHUOKEO.js} +0 -0
- /package/web/assets/{lexon-CKQUX8Ov.js → lexon-CZNaGS2_.js} +0 -0
- /package/web/assets/{lua-CuWjKLJ0.js → lua-iuAeZ15y.js} +0 -0
- /package/web/assets/{m3-CEp1bVrM.js → m3-Dotjo0U8.js} +0 -0
- /package/web/assets/{markdown-DxtQ_puq.js → markdown-B_31SQ_4.js} +0 -0
- /package/web/assets/{mips-Dx7qydpO.js → mips-Dp4rVQ6A.js} +0 -0
- /package/web/assets/{msdax-DpNCaSiO.js → msdax-DGvgi_My.js} +0 -0
- /package/web/assets/{mysql-C3xsBDPP.js → mysql-jqX2Izgu.js} +0 -0
- /package/web/assets/{objective-c-BbaVHCX1.js → objective-c-KWePe42v.js} +0 -0
- /package/web/assets/{pascal-sDju2faq.js → pascal-k9Augcc6.js} +0 -0
- /package/web/assets/{pascaligo-ChCdOH6b.js → pascaligo-CijZuMoC.js} +0 -0
- /package/web/assets/{perl-BCgLFj01.js → perl-CtKbbdqv.js} +0 -0
- /package/web/assets/{pgsql-DtKby69f.js → pgsql-IYBGBY8p.js} +0 -0
- /package/web/assets/{php-NYvR17Qb.js → php-CZgzKas5.js} +0 -0
- /package/web/assets/{pla-gSg-RBG0.js → pla-DxEUZCU5.js} +0 -0
- /package/web/assets/{postiats-BQxHyDfy.js → postiats-Cf9oispl.js} +0 -0
- /package/web/assets/{powerquery-DzDmbVZN.js → powerquery-Cyri2j7y.js} +0 -0
- /package/web/assets/{powershell-yy4Q5BEQ.js → powershell-CezsOW84.js} +0 -0
- /package/web/assets/{protobuf-B_hIk9q0.js → protobuf-BVSVLozM.js} +0 -0
- /package/web/assets/{pug-CdeEb1ft.js → pug-tdDHxxGI.js} +0 -0
- /package/web/assets/{qsharp-CiSquEgT.js → qsharp-BbxYBU73.js} +0 -0
- /package/web/assets/{r-D1Ocz1x4.js → r-CMiogh24.js} +0 -0
- /package/web/assets/{redis-D42Y12yz.js → redis-Be7YRs2n.js} +0 -0
- /package/web/assets/{redshift-CS62MYfG.js → redshift-BMtedC4Y.js} +0 -0
- /package/web/assets/{restructuredtext-CKFSMEXw.js → restructuredtext-BeqA_Nw7.js} +0 -0
- /package/web/assets/{ruby-C4gTaeU3.js → ruby-DQh1qjXf.js} +0 -0
- /package/web/assets/{rust-C_f2AiHQ.js → rust-Dtb7SJq9.js} +0 -0
- /package/web/assets/{sb-CdNdpP1r.js → sb-YjmuT7ii.js} +0 -0
- /package/web/assets/{scala-N4EWaFTL.js → scala-3ZhdCU1r.js} +0 -0
- /package/web/assets/{scheme-CttIARxx.js → scheme-Ck6PwJVN.js} +0 -0
- /package/web/assets/{scss-v0wtbxaE.js → scss-CdSZkceb.js} +0 -0
- /package/web/assets/{shell-BJdEWXbc.js → shell-D951-SzL.js} +0 -0
- /package/web/assets/{solidity-DKDa59zZ.js → solidity-BtE4jdUZ.js} +0 -0
- /package/web/assets/{sophia--Kw-vDpr.js → sophia-CPgh17t9.js} +0 -0
- /package/web/assets/{sparql-BI8jS9Pc.js → sparql-D5V7fRaF.js} +0 -0
- /package/web/assets/{sql-Dz6z--6O.js → sql-CIe64i2G.js} +0 -0
- /package/web/assets/{st-CT8D05gv.js → st-BUZL4NkZ.js} +0 -0
- /package/web/assets/{swift-Ayb3KzWx.js → swift-BGpAy-yZ.js} +0 -0
- /package/web/assets/{systemverilog-BtWJM9O5.js → systemverilog-CYBqw_20.js} +0 -0
- /package/web/assets/{tcl-BJvUWpbV.js → tcl-CqmcDc3_.js} +0 -0
- /package/web/assets/{twig-c3YaBCU6.js → twig-BWVIPIPE.js} +0 -0
- /package/web/assets/{typespec-gFCWLBoZ.js → typespec-mTM8EdlQ.js} +0 -0
- /package/web/assets/{uuid-B_qWVd9j.js → uuid-aTVnbu2y.js} +0 -0
- /package/web/assets/{vb-CVtfWXV2.js → vb-xvgQ7mYU.js} +0 -0
- /package/web/assets/{w3c-keyname-CEC6uTIQ.js → w3c-keyname-CjzYiphr.js} +0 -0
- /package/web/assets/{wgsl-C_huaGQy.js → wgsl-C8m-CvBD.js} +0 -0
|
@@ -89,6 +89,15 @@ function projectVaultRoot(orgId, projectId) {
|
|
|
89
89
|
assertSafeId("project", projectId);
|
|
90
90
|
return join(orgVaultRoot(orgId), "projects", projectId);
|
|
91
91
|
}
|
|
92
|
+
function orgIdOfRoot(root) {
|
|
93
|
+
const marker = join(machineRoot(), "orgs") + sep;
|
|
94
|
+
if (!root.startsWith(marker)) return null;
|
|
95
|
+
const [orgId] = root.slice(marker.length).split(sep);
|
|
96
|
+
return orgId && SAFE_ID.test(orgId) ? orgId : null;
|
|
97
|
+
}
|
|
98
|
+
function vaultIdOfRoot(root) {
|
|
99
|
+
return orgIdOfRoot(root) ?? void 0;
|
|
100
|
+
}
|
|
92
101
|
function vaultFor(target) {
|
|
93
102
|
if (!target.orgId) return { root: localVaultRoot() };
|
|
94
103
|
return { root: projectVaultRoot(target.orgId, target.id) };
|
|
@@ -195,6 +204,7 @@ import { createHash } from "crypto";
|
|
|
195
204
|
var KEY_SIZE_BYTES = 32;
|
|
196
205
|
var DEFAULT_VAULT = "\0default";
|
|
197
206
|
var keyring = /* @__PURE__ */ new Map();
|
|
207
|
+
var lockedVaults = /* @__PURE__ */ new Set();
|
|
198
208
|
var _ciMode = false;
|
|
199
209
|
var _pendingLegacyKey = null;
|
|
200
210
|
function isCiMode() {
|
|
@@ -231,16 +241,31 @@ function hasPendingLegacyKey() {
|
|
|
231
241
|
function setEncryptionKeyInMemory(key, vault = DEFAULT_VAULT) {
|
|
232
242
|
if (key.length !== KEY_SIZE_BYTES) throw new Error("Taille de cl\xE9 invalide");
|
|
233
243
|
keyring.set(vault, key);
|
|
244
|
+
lockedVaults.delete(vault);
|
|
234
245
|
}
|
|
235
246
|
function clearEncryptionKey(vault) {
|
|
236
|
-
if (vault === void 0)
|
|
237
|
-
|
|
247
|
+
if (vault === void 0) {
|
|
248
|
+
keyring.clear();
|
|
249
|
+
lockedVaults.clear();
|
|
250
|
+
} else {
|
|
251
|
+
keyring.delete(vault);
|
|
252
|
+
}
|
|
238
253
|
}
|
|
239
254
|
function hasEncryptionKey(vault = DEFAULT_VAULT) {
|
|
240
255
|
return keyring.has(vault);
|
|
241
256
|
}
|
|
242
257
|
function getEncryptionKey(vault = DEFAULT_VAULT) {
|
|
243
|
-
|
|
258
|
+
const own = keyring.get(vault);
|
|
259
|
+
if (own) return own;
|
|
260
|
+
if (vault === DEFAULT_VAULT || lockedVaults.has(vault)) return null;
|
|
261
|
+
return keyring.get(DEFAULT_VAULT) ?? null;
|
|
262
|
+
}
|
|
263
|
+
function markVaultLocked(vault) {
|
|
264
|
+
lockedVaults.add(vault);
|
|
265
|
+
keyring.delete(vault);
|
|
266
|
+
}
|
|
267
|
+
function clearVaultLock(vault) {
|
|
268
|
+
lockedVaults.delete(vault);
|
|
244
269
|
}
|
|
245
270
|
function deriveStableSecret(purpose, vault = DEFAULT_VAULT) {
|
|
246
271
|
const key = getEncryptionKey(vault);
|
|
@@ -258,8 +283,8 @@ async function setEncryptionKey(keyHex) {
|
|
|
258
283
|
// ../server/src/services/agent-store.ts
|
|
259
284
|
var FILENAME = "agents.json";
|
|
260
285
|
var ALGORITHM = "aes-256-gcm";
|
|
261
|
-
function encrypt(plaintext) {
|
|
262
|
-
const maybeKey = getEncryptionKey();
|
|
286
|
+
function encrypt(plaintext, vault) {
|
|
287
|
+
const maybeKey = getEncryptionKey(vault);
|
|
263
288
|
if (!maybeKey) {
|
|
264
289
|
throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
|
|
265
290
|
}
|
|
@@ -271,11 +296,11 @@ function encrypt(plaintext) {
|
|
|
271
296
|
const authTag = cipher.getAuthTag().toString("hex");
|
|
272
297
|
return { encrypted: enc, iv: iv.toString("hex"), authTag };
|
|
273
298
|
}
|
|
274
|
-
function decrypt(encrypted, ivHex, authTagHex) {
|
|
299
|
+
function decrypt(encrypted, ivHex, authTagHex, vault) {
|
|
275
300
|
if (!/^[0-9a-f]+$/i.test(encrypted) || !/^[0-9a-f]+$/i.test(ivHex) || !/^[0-9a-f]+$/i.test(authTagHex)) {
|
|
276
301
|
throw new Error("Invalid hex string in encrypted agent data");
|
|
277
302
|
}
|
|
278
|
-
const maybeKey = getEncryptionKey();
|
|
303
|
+
const maybeKey = getEncryptionKey(vault);
|
|
279
304
|
if (!maybeKey) {
|
|
280
305
|
throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
|
|
281
306
|
}
|
|
@@ -310,6 +335,10 @@ var AgentStore = class {
|
|
|
310
335
|
* blanc. Pour une organisation, c'est son coffre — la clé, elle, répond
|
|
311
336
|
* toujours pour toute la machine.
|
|
312
337
|
*/
|
|
338
|
+
/** L'identifiant de clé d'un agent : son organisation, ou la machine. */
|
|
339
|
+
vaultOf(id) {
|
|
340
|
+
return this.owners.get(id) ?? void 0;
|
|
341
|
+
}
|
|
313
342
|
filePathFor(owner) {
|
|
314
343
|
if (owner === null) return keyedFilePath(FILENAME);
|
|
315
344
|
return Promise.resolve(join2(orgVaultRoot(owner), FILENAME));
|
|
@@ -407,7 +436,9 @@ var AgentStore = class {
|
|
|
407
436
|
id: stored.id,
|
|
408
437
|
name: stored.name,
|
|
409
438
|
url: stored.url,
|
|
410
|
-
passphrase
|
|
439
|
+
// La passphrase est chiffrée par la clé du coffre où l'agent est rangé :
|
|
440
|
+
// celle de son organisation, ou celle de la machine.
|
|
441
|
+
passphrase: decrypt(stored.encrypted, stored.iv, stored.authTag, this.vaultOf(stored.id)),
|
|
411
442
|
passthroughEnv: this.passthroughEnv[stored.id] ?? []
|
|
412
443
|
};
|
|
413
444
|
}
|
|
@@ -430,7 +461,8 @@ var AgentStore = class {
|
|
|
430
461
|
async register(name, url, passphrase, owner = null) {
|
|
431
462
|
await this.load();
|
|
432
463
|
const existing = Array.from(this.agents.values()).find((a) => a.url === url);
|
|
433
|
-
const
|
|
464
|
+
const vault = existing ? this.vaultOf(existing.id) : owner ?? void 0;
|
|
465
|
+
const { encrypted, iv, authTag } = encrypt(passphrase, vault);
|
|
434
466
|
if (existing) {
|
|
435
467
|
existing.name = name;
|
|
436
468
|
existing.encrypted = encrypted;
|
|
@@ -480,7 +512,7 @@ var AgentStore = class {
|
|
|
480
512
|
if (fields.name !== void 0) stored.name = fields.name;
|
|
481
513
|
if (fields.url !== void 0) stored.url = fields.url;
|
|
482
514
|
if (fields.passphrase !== void 0) {
|
|
483
|
-
const { encrypted, iv, authTag } = encrypt(fields.passphrase);
|
|
515
|
+
const { encrypted, iv, authTag } = encrypt(fields.passphrase, this.vaultOf(id));
|
|
484
516
|
stored.encrypted = encrypted;
|
|
485
517
|
stored.iv = iv;
|
|
486
518
|
stored.authTag = authTag;
|
|
@@ -642,8 +674,8 @@ function decryptValueWith(key, encrypted) {
|
|
|
642
674
|
dec += decipher.final("utf-8");
|
|
643
675
|
return dec;
|
|
644
676
|
}
|
|
645
|
-
function encryptValue(plaintext) {
|
|
646
|
-
const maybeKey = getEncryptionKey();
|
|
677
|
+
function encryptValue(plaintext, vault) {
|
|
678
|
+
const maybeKey = getEncryptionKey(vault);
|
|
647
679
|
if (!maybeKey) {
|
|
648
680
|
throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
|
|
649
681
|
}
|
|
@@ -655,14 +687,14 @@ function encryptValue(plaintext) {
|
|
|
655
687
|
const authTag = cipher.getAuthTag().toString("hex");
|
|
656
688
|
return `${iv.toString("hex")}:${authTag}:${enc}`;
|
|
657
689
|
}
|
|
658
|
-
function decryptValue(encrypted) {
|
|
690
|
+
function decryptValue(encrypted, vault) {
|
|
659
691
|
const parts = encrypted.split(":");
|
|
660
692
|
if (parts.length !== 3) throw new Error("Invalid encrypted value format \u2014 expected iv:authTag:ciphertext");
|
|
661
693
|
const [ivHex, authTagHex, ciphertext] = parts;
|
|
662
694
|
if (!/^[0-9a-f]+$/i.test(ivHex) || !/^[0-9a-f]+$/i.test(authTagHex) || ciphertext !== "" && !/^[0-9a-f]+$/i.test(ciphertext)) {
|
|
663
695
|
throw new Error("Invalid hex in encrypted value \u2014 possible data corruption");
|
|
664
696
|
}
|
|
665
|
-
const maybeKey = getEncryptionKey();
|
|
697
|
+
const maybeKey = getEncryptionKey(vault);
|
|
666
698
|
if (!maybeKey) {
|
|
667
699
|
throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
|
|
668
700
|
}
|
|
@@ -674,34 +706,34 @@ function decryptValue(encrypted) {
|
|
|
674
706
|
dec += decipher.final("utf-8");
|
|
675
707
|
return dec;
|
|
676
708
|
}
|
|
677
|
-
function stableEncryptValue(plaintext, existingEncrypted) {
|
|
709
|
+
function stableEncryptValue(plaintext, existingEncrypted, vault) {
|
|
678
710
|
if (existingEncrypted) {
|
|
679
711
|
try {
|
|
680
|
-
if (decryptValue(existingEncrypted) === plaintext) return existingEncrypted;
|
|
712
|
+
if (decryptValue(existingEncrypted, vault) === plaintext) return existingEncrypted;
|
|
681
713
|
} catch {
|
|
682
714
|
}
|
|
683
715
|
}
|
|
684
|
-
return encryptValue(plaintext);
|
|
716
|
+
return encryptValue(plaintext, vault);
|
|
685
717
|
}
|
|
686
|
-
function encryptVariableSlots(variables, existingEncrypted) {
|
|
718
|
+
function encryptVariableSlots(variables, existingEncrypted, vault) {
|
|
687
719
|
const result = {};
|
|
688
720
|
for (const [key, variable] of Object.entries(variables)) {
|
|
689
721
|
const slot = variable.value;
|
|
690
722
|
if (slot.isSecret && slot.value) {
|
|
691
|
-
result[key] = { ...variable, value: { ...slot, value: stableEncryptValue(slot.value, existingEncrypted?.[key]) } };
|
|
723
|
+
result[key] = { ...variable, value: { ...slot, value: stableEncryptValue(slot.value, existingEncrypted?.[key], vault) } };
|
|
692
724
|
} else {
|
|
693
725
|
result[key] = { ...variable, value: { ...slot } };
|
|
694
726
|
}
|
|
695
727
|
}
|
|
696
728
|
return result;
|
|
697
729
|
}
|
|
698
|
-
function decryptVariableSlots(variables, contextLabel, onFailure) {
|
|
730
|
+
function decryptVariableSlots(variables, contextLabel, onFailure, vault) {
|
|
699
731
|
const result = {};
|
|
700
732
|
for (const [key, variable] of Object.entries(variables)) {
|
|
701
733
|
const slot = variable.value;
|
|
702
734
|
if (slot.isSecret && slot.value) {
|
|
703
735
|
try {
|
|
704
|
-
result[key] = { ...variable, value: { ...slot, value: decryptValue(slot.value) } };
|
|
736
|
+
result[key] = { ...variable, value: { ...slot, value: decryptValue(slot.value, vault) } };
|
|
705
737
|
} catch (err) {
|
|
706
738
|
console.error(`[crypto-helpers] Failed to decrypt variable "${key}" for ${contextLabel}: ${err.message} \u2014 la valeur chiffr\xE9e est conserv\xE9e telle quelle sur le disque`);
|
|
707
739
|
onFailure?.(key);
|
|
@@ -2010,6 +2042,8 @@ var EnvironmentStore = class {
|
|
|
2010
2042
|
* belongs even before its project has been loaded.
|
|
2011
2043
|
*/
|
|
2012
2044
|
roots = /* @__PURE__ */ new Map();
|
|
2045
|
+
/** L'organisation d'où vient un environnement reçu du cloud — voir `vaultOf`. */
|
|
2046
|
+
remoteOrgs = /* @__PURE__ */ new Map();
|
|
2013
2047
|
getFilePath(root) {
|
|
2014
2048
|
return join3(root, FILENAME2);
|
|
2015
2049
|
}
|
|
@@ -2024,6 +2058,17 @@ var EnvironmentStore = class {
|
|
|
2024
2058
|
* environment whose project is unknown belongs to the launch directory, which
|
|
2025
2059
|
* is where it lived before vaults existed.
|
|
2026
2060
|
*/
|
|
2061
|
+
/**
|
|
2062
|
+
* La clé sous laquelle chiffrer cet environnement.
|
|
2063
|
+
*
|
|
2064
|
+
* La provenance l'emporte sur le coffre tant que le projet n'est pas local :
|
|
2065
|
+
* un environnement reçu du cloud arrive avant lui, et `rootFor` désignerait
|
|
2066
|
+
* alors le répertoire de lancement — donc la clé de la machine plutôt que
|
|
2067
|
+
* celle de l'organisation qui a chiffré ces secrets.
|
|
2068
|
+
*/
|
|
2069
|
+
vaultOf(environment) {
|
|
2070
|
+
return this.remoteOrgs.get(environment.id) ?? vaultIdOfRoot(this.rootFor(environment));
|
|
2071
|
+
}
|
|
2027
2072
|
rootFor(environment) {
|
|
2028
2073
|
const known = this.roots.get(environment.id) ?? null;
|
|
2029
2074
|
const projectRoot = environment.projectId ? rootOfProjectAmong(environment.projectId, known) : null;
|
|
@@ -2060,13 +2105,22 @@ var EnvironmentStore = class {
|
|
|
2060
2105
|
);
|
|
2061
2106
|
return { envSlots };
|
|
2062
2107
|
}
|
|
2063
|
-
|
|
2108
|
+
/**
|
|
2109
|
+
* `vault` est fourni quand l'appelant sait à qui appartient l'environnement
|
|
2110
|
+
* mieux que le disque : à l'arrivée d'une entité distante, son projet n'est
|
|
2111
|
+
* pas encore local, et le coffre déduit serait celui du répertoire de
|
|
2112
|
+
* lancement — donc la mauvaise clé.
|
|
2113
|
+
*/
|
|
2114
|
+
encryptEnvironment(environment, vault) {
|
|
2064
2115
|
const cache = this.diskEncryptedSlots.get(environment.id);
|
|
2065
2116
|
let encryptedVars = environment.variables;
|
|
2066
2117
|
if (environment.variables && Object.keys(environment.variables).length > 0) {
|
|
2067
2118
|
encryptedVars = encryptVariableSlots(
|
|
2068
2119
|
environment.variables,
|
|
2069
|
-
cache?.envSlots
|
|
2120
|
+
cache?.envSlots,
|
|
2121
|
+
// La clé est celle du coffre où l'environnement sera écrit : les
|
|
2122
|
+
// secrets d'une organisation sont chiffrés par la sienne.
|
|
2123
|
+
vault ?? this.vaultOf(environment)
|
|
2070
2124
|
);
|
|
2071
2125
|
}
|
|
2072
2126
|
return { ...environment, variables: this.keepUnreadableSecrets(environment.id, encryptedVars) };
|
|
@@ -2100,14 +2154,15 @@ var EnvironmentStore = class {
|
|
|
2100
2154
|
}
|
|
2101
2155
|
return result;
|
|
2102
2156
|
}
|
|
2103
|
-
decryptEnvironment(environment) {
|
|
2157
|
+
decryptEnvironment(environment, vault) {
|
|
2104
2158
|
let decryptedVars = environment.variables;
|
|
2105
2159
|
if (environment.variables && Object.keys(environment.variables).length > 0) {
|
|
2106
2160
|
const failed = /* @__PURE__ */ new Set();
|
|
2107
2161
|
decryptedVars = decryptVariableSlots(
|
|
2108
2162
|
environment.variables,
|
|
2109
2163
|
`environment ${environment.id}`,
|
|
2110
|
-
(variableId) => failed.add(variableId)
|
|
2164
|
+
(variableId) => failed.add(variableId),
|
|
2165
|
+
vault ?? this.vaultOf(environment)
|
|
2111
2166
|
);
|
|
2112
2167
|
if (failed.size > 0) this.unreadableSecrets.set(environment.id, failed);
|
|
2113
2168
|
else this.unreadableSecrets.delete(environment.id);
|
|
@@ -2220,6 +2275,7 @@ var EnvironmentStore = class {
|
|
|
2220
2275
|
this.diskEncryptedSlots.delete(id);
|
|
2221
2276
|
this.unreadableSecrets.delete(id);
|
|
2222
2277
|
this.roots.delete(id);
|
|
2278
|
+
this.remoteOrgs.delete(id);
|
|
2223
2279
|
}
|
|
2224
2280
|
this.notify();
|
|
2225
2281
|
}
|
|
@@ -2432,8 +2488,9 @@ var EnvironmentStore = class {
|
|
|
2432
2488
|
* Validated rather than trusted, and diff-guarded against the on-disk form so
|
|
2433
2489
|
* re-applying an identical environment neither saves nor notifies (loop-safe).
|
|
2434
2490
|
*/
|
|
2435
|
-
async applyRemoteUpsert(id, fields) {
|
|
2491
|
+
async applyRemoteUpsert(id, fields, vault) {
|
|
2436
2492
|
await this.load();
|
|
2493
|
+
if (vault) this.remoteOrgs.set(id, vault);
|
|
2437
2494
|
const parsed = EnvironmentSchema.safeParse({ ...fields, id });
|
|
2438
2495
|
if (!parsed.success) {
|
|
2439
2496
|
console.error("[environment-store] Rejected remote environment %s:", id, parsed.error.message);
|
|
@@ -2441,11 +2498,11 @@ var EnvironmentStore = class {
|
|
|
2441
2498
|
}
|
|
2442
2499
|
const incoming = parsed.data;
|
|
2443
2500
|
const existing = this.environments.get(id);
|
|
2444
|
-
if (existing && JSON.stringify(this.encryptEnvironment(existing)) === JSON.stringify(incoming)) {
|
|
2501
|
+
if (existing && JSON.stringify(this.encryptEnvironment(existing, vault)) === JSON.stringify(incoming)) {
|
|
2445
2502
|
return { created: false };
|
|
2446
2503
|
}
|
|
2447
2504
|
this.diskEncryptedSlots.set(id, this.extractEncryptedCache(incoming));
|
|
2448
|
-
this.environments.set(id, this.decryptEnvironment(incoming));
|
|
2505
|
+
this.environments.set(id, this.decryptEnvironment(incoming, vault));
|
|
2449
2506
|
await this.save();
|
|
2450
2507
|
return { created: !existing };
|
|
2451
2508
|
}
|
|
@@ -2456,6 +2513,7 @@ var EnvironmentStore = class {
|
|
|
2456
2513
|
this.environments.delete(id);
|
|
2457
2514
|
this.diskEncryptedSlots.delete(id);
|
|
2458
2515
|
this.unreadableSecrets.delete(id);
|
|
2516
|
+
this.remoteOrgs.delete(id);
|
|
2459
2517
|
await this.save();
|
|
2460
2518
|
return true;
|
|
2461
2519
|
}
|
|
@@ -2464,25 +2522,27 @@ var environmentStore = new EnvironmentStore();
|
|
|
2464
2522
|
|
|
2465
2523
|
// ../server/src/services/service-store.ts
|
|
2466
2524
|
var FILENAME3 = "services.json";
|
|
2467
|
-
function encryptLogSources(logSources, previous) {
|
|
2525
|
+
function encryptLogSources(logSources, previous, vault) {
|
|
2468
2526
|
return logSources.map((src, i) => {
|
|
2469
2527
|
const prev = previous?.[i];
|
|
2470
2528
|
if (src.type === "mongo") {
|
|
2529
|
+
if (isEncryptedValue(src.connectionString)) return src;
|
|
2471
2530
|
const was = prev?.type === "mongo" ? prev.connectionString : void 0;
|
|
2472
|
-
return { ...src, connectionString: stableEncryptValue(src.connectionString, was) };
|
|
2531
|
+
return { ...src, connectionString: stableEncryptValue(src.connectionString, was, vault) };
|
|
2473
2532
|
}
|
|
2474
2533
|
if (src.type === "mysql" && src.password) {
|
|
2534
|
+
if (isEncryptedValue(src.password)) return src;
|
|
2475
2535
|
const was = prev?.type === "mysql" ? prev.password : void 0;
|
|
2476
|
-
return { ...src, password: stableEncryptValue(src.password, was) };
|
|
2536
|
+
return { ...src, password: stableEncryptValue(src.password, was, vault) };
|
|
2477
2537
|
}
|
|
2478
2538
|
return src;
|
|
2479
2539
|
});
|
|
2480
2540
|
}
|
|
2481
|
-
function decryptLogSources(logSources) {
|
|
2541
|
+
function decryptLogSources(logSources, vault) {
|
|
2482
2542
|
return logSources.map((src) => {
|
|
2483
2543
|
if (src.type === "mongo" && isEncryptedValue(src.connectionString)) {
|
|
2484
2544
|
try {
|
|
2485
|
-
return { ...src, connectionString: decryptValue(src.connectionString) };
|
|
2545
|
+
return { ...src, connectionString: decryptValue(src.connectionString, vault) };
|
|
2486
2546
|
} catch {
|
|
2487
2547
|
console.error("[service-store] Failed to decrypt mongo connectionString");
|
|
2488
2548
|
return src;
|
|
@@ -2490,7 +2550,7 @@ function decryptLogSources(logSources) {
|
|
|
2490
2550
|
}
|
|
2491
2551
|
if (src.type === "mysql" && src.password && isEncryptedValue(src.password)) {
|
|
2492
2552
|
try {
|
|
2493
|
-
return { ...src, password: decryptValue(src.password) };
|
|
2553
|
+
return { ...src, password: decryptValue(src.password, vault) };
|
|
2494
2554
|
} catch {
|
|
2495
2555
|
console.error("[service-store] Failed to decrypt mysql password");
|
|
2496
2556
|
return src;
|
|
@@ -2499,14 +2559,14 @@ function decryptLogSources(logSources) {
|
|
|
2499
2559
|
return src;
|
|
2500
2560
|
});
|
|
2501
2561
|
}
|
|
2502
|
-
function prepareForDisk(service, previous) {
|
|
2562
|
+
function prepareForDisk(service, previous, vault) {
|
|
2503
2563
|
return {
|
|
2504
2564
|
...service,
|
|
2505
2565
|
env: {},
|
|
2506
2566
|
envSecrets: [],
|
|
2507
2567
|
resolvedLogParsers: void 0,
|
|
2508
2568
|
resolvedCwd: void 0,
|
|
2509
|
-
logSources: encryptLogSources(service.logSources ?? [], previous?.logSources)
|
|
2569
|
+
logSources: encryptLogSources(service.logSources ?? [], previous?.logSources, vault)
|
|
2510
2570
|
};
|
|
2511
2571
|
}
|
|
2512
2572
|
var ServiceStore = class {
|
|
@@ -2527,6 +2587,16 @@ var ServiceStore = class {
|
|
|
2527
2587
|
}
|
|
2528
2588
|
/** Which vault each service was read from, used until its project is known. */
|
|
2529
2589
|
roots = /* @__PURE__ */ new Map();
|
|
2590
|
+
/**
|
|
2591
|
+
* L'organisation d'où vient un service reçu du cloud.
|
|
2592
|
+
*
|
|
2593
|
+
* Le coffre ne peut pas encore répondre : les contenus arrivent avant leur
|
|
2594
|
+
* projet, donc `rootFor` désignerait le répertoire de lancement et
|
|
2595
|
+
* chiffrerait les secrets de l'organisation avec la clé de la machine. Cette
|
|
2596
|
+
* provenance tient le temps que le projet devienne local — après quoi elle
|
|
2597
|
+
* dit la même chose que le coffre.
|
|
2598
|
+
*/
|
|
2599
|
+
remoteOrgs = /* @__PURE__ */ new Map();
|
|
2530
2600
|
getFilePath(root) {
|
|
2531
2601
|
return join4(root, FILENAME3);
|
|
2532
2602
|
}
|
|
@@ -2537,6 +2607,10 @@ var ServiceStore = class {
|
|
|
2537
2607
|
* so the registry answers, falling back to where the service was read and
|
|
2538
2608
|
* finally to the local vault.
|
|
2539
2609
|
*/
|
|
2610
|
+
/** La clé sous laquelle chiffrer ce service : son organisation, ou son coffre. */
|
|
2611
|
+
vaultOf(serviceId) {
|
|
2612
|
+
return this.remoteOrgs.get(serviceId) ?? vaultIdOfRoot(this.rootFor(serviceId));
|
|
2613
|
+
}
|
|
2540
2614
|
rootFor(serviceId) {
|
|
2541
2615
|
return rootOfService(serviceId, this.roots.get(serviceId) ?? null) ?? localVaultRoot();
|
|
2542
2616
|
}
|
|
@@ -2569,7 +2643,7 @@ var ServiceStore = class {
|
|
|
2569
2643
|
this.diskForm.set(s.id, s);
|
|
2570
2644
|
this.services.set(s.id, {
|
|
2571
2645
|
...s,
|
|
2572
|
-
logSources: decryptLogSources(s.logSources ?? [])
|
|
2646
|
+
logSources: decryptLogSources(s.logSources ?? [], vaultIdOfRoot(root))
|
|
2573
2647
|
});
|
|
2574
2648
|
this.roots.set(s.id, root);
|
|
2575
2649
|
}
|
|
@@ -2592,7 +2666,7 @@ var ServiceStore = class {
|
|
|
2592
2666
|
byRoot.set(localVaultRoot(), byRoot.get(localVaultRoot()) ?? []);
|
|
2593
2667
|
for (const service of this.services.values()) {
|
|
2594
2668
|
const root = this.rootFor(service.id);
|
|
2595
|
-
const prepared = prepareForDisk(service, this.diskForm.get(service.id));
|
|
2669
|
+
const prepared = prepareForDisk(service, this.diskForm.get(service.id), this.vaultOf(service.id));
|
|
2596
2670
|
this.diskForm.set(prepared.id, prepared);
|
|
2597
2671
|
this.roots.set(service.id, root);
|
|
2598
2672
|
if (isVaultConflicted(root)) continue;
|
|
@@ -2627,6 +2701,7 @@ var ServiceStore = class {
|
|
|
2627
2701
|
this.services.delete(id);
|
|
2628
2702
|
this.diskForm.delete(id);
|
|
2629
2703
|
this.roots.delete(id);
|
|
2704
|
+
this.remoteOrgs.delete(id);
|
|
2630
2705
|
}
|
|
2631
2706
|
this.notify();
|
|
2632
2707
|
}
|
|
@@ -2675,7 +2750,7 @@ var ServiceStore = class {
|
|
|
2675
2750
|
async getSanitized(id) {
|
|
2676
2751
|
await this.load();
|
|
2677
2752
|
const service = this.services.get(id);
|
|
2678
|
-
return service ? prepareForDisk(service, this.diskForm.get(id)) : null;
|
|
2753
|
+
return service ? prepareForDisk(service, this.diskForm.get(id), this.vaultOf(id)) : null;
|
|
2679
2754
|
}
|
|
2680
2755
|
async create(input) {
|
|
2681
2756
|
await this.load();
|
|
@@ -2763,7 +2838,7 @@ var ServiceStore = class {
|
|
|
2763
2838
|
const out = [];
|
|
2764
2839
|
for (const id of ids) {
|
|
2765
2840
|
const service = this.services.get(id);
|
|
2766
|
-
if (service) out.push(prepareForDisk(service, this.diskForm.get(id)));
|
|
2841
|
+
if (service) out.push(prepareForDisk(service, this.diskForm.get(id), this.vaultOf(id)));
|
|
2767
2842
|
}
|
|
2768
2843
|
return out;
|
|
2769
2844
|
}
|
|
@@ -2775,8 +2850,9 @@ var ServiceStore = class {
|
|
|
2775
2850
|
* `services.json`. Diff-guarded against the on-disk form so re-applying an
|
|
2776
2851
|
* identical service neither saves nor notifies (loop-safe).
|
|
2777
2852
|
*/
|
|
2778
|
-
async applyRemoteUpsert(id, fields) {
|
|
2853
|
+
async applyRemoteUpsert(id, fields, vault) {
|
|
2779
2854
|
await this.load();
|
|
2855
|
+
if (vault) this.remoteOrgs.set(id, vault);
|
|
2780
2856
|
const parsed = ServiceConfigSchema.safeParse({ ...fields, id });
|
|
2781
2857
|
if (!parsed.success) {
|
|
2782
2858
|
console.error("[service-store] Rejected remote service %s:", id, parsed.error.message);
|
|
@@ -2785,7 +2861,7 @@ var ServiceStore = class {
|
|
|
2785
2861
|
const incoming = parsed.data;
|
|
2786
2862
|
const existing = this.services.get(id);
|
|
2787
2863
|
if (existing) {
|
|
2788
|
-
const currentDisk = prepareForDisk(existing, this.diskForm.get(id));
|
|
2864
|
+
const currentDisk = prepareForDisk(existing, this.diskForm.get(id), vault ?? this.vaultOf(id));
|
|
2789
2865
|
if (JSON.stringify(currentDisk) === JSON.stringify(incoming)) return { created: false };
|
|
2790
2866
|
}
|
|
2791
2867
|
this.diskForm.set(id, incoming);
|
|
@@ -2793,7 +2869,7 @@ var ServiceStore = class {
|
|
|
2793
2869
|
...incoming,
|
|
2794
2870
|
// The doc carries the on-disk form, where credentials are ciphertext;
|
|
2795
2871
|
// in memory they are expected in the clear, as `load()` keeps them.
|
|
2796
|
-
logSources: decryptLogSources(incoming.logSources ?? [])
|
|
2872
|
+
logSources: decryptLogSources(incoming.logSources ?? [], vault ?? this.vaultOf(id))
|
|
2797
2873
|
});
|
|
2798
2874
|
await this.save();
|
|
2799
2875
|
this.notify();
|
|
@@ -3810,12 +3886,15 @@ export {
|
|
|
3810
3886
|
clearEncryptionKey,
|
|
3811
3887
|
hasEncryptionKey,
|
|
3812
3888
|
getEncryptionKey,
|
|
3889
|
+
markVaultLocked,
|
|
3890
|
+
clearVaultLock,
|
|
3813
3891
|
ensureEncryptionKey,
|
|
3814
3892
|
setEncryptionKey,
|
|
3815
3893
|
machineRoot,
|
|
3816
3894
|
localVaultRoot,
|
|
3817
3895
|
orgVaultRoot,
|
|
3818
3896
|
projectVaultRoot,
|
|
3897
|
+
vaultIdOfRoot,
|
|
3819
3898
|
vaultFor,
|
|
3820
3899
|
stampOrgCloud,
|
|
3821
3900
|
readOrgClouds,
|
|
@@ -3877,6 +3956,8 @@ export {
|
|
|
3877
3956
|
setProjectVault,
|
|
3878
3957
|
forgetProject,
|
|
3879
3958
|
setProjectServices,
|
|
3959
|
+
rootOfProjectRef,
|
|
3960
|
+
refsOfProjectId,
|
|
3880
3961
|
rootOfProjectAmong,
|
|
3881
3962
|
refOfProjectAmong,
|
|
3882
3963
|
environmentStore,
|
|
@@ -3886,4 +3967,4 @@ export {
|
|
|
3886
3967
|
traefikManager,
|
|
3887
3968
|
agentManager
|
|
3888
3969
|
};
|
|
3889
|
-
//# sourceMappingURL=chunk-
|
|
3970
|
+
//# sourceMappingURL=chunk-EL75GG7O.js.map
|