@runeya/runeya 2.0.58 → 2.0.60
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-NJMLCIVW.js +7 -0
- package/{chunk-NLVDO4EC.js → chunk-WI4NXXWA.js} +5 -2
- package/chunk-WI4NXXWA.js.map +1 -0
- package/index.js +1 -1
- package/package.json +1 -1
- package/{src-V3J62F6F.js → src-FYMPMNWX.js} +210 -127
- package/src-FYMPMNWX.js.map +1 -0
- package/web/assets/{AgentScalarChatInterface.vue-EIqnE2D0.js → AgentScalarChatInterface.vue-B4N4hGIa.js} +1 -1
- package/web/assets/{AgentTerminalPage-5kH1RTj6.js → AgentTerminalPage-COgNEO3l.js} +1 -1
- package/web/assets/AiChatPage-CBccEBhl.js +1 -0
- package/web/assets/{AppLayout-Dj8YOvMQ.css → AppLayout-B1bXTOmv.css} +1 -1
- package/web/assets/AppLayout-Bk_jDJzn.js +1 -0
- package/web/assets/{AuditPage-BrqreO8a.js → AuditPage-CojdnXun.js} +1 -1
- package/web/assets/{CloudAccountPage-DS3ZfENB.js → CloudAccountPage-CaCXJAIU.js} +1 -1
- package/web/assets/CloudAccountPage-CcIXW0EN.js +1 -0
- package/web/assets/{CloudMessagingPage-D8gBnkFY.js → CloudMessagingPage-BWNVhfSj.js} +1 -1
- package/web/assets/{DashboardPage-BiskmF6R.js → DashboardPage-DXCofSRh.js} +1 -1
- package/web/assets/{DirectoryPickerDialog-CtKWj2hx.js → DirectoryPickerDialog-BzGhidJF.js} +1 -1
- package/web/assets/{EditorIcon-B58cXgvK.js → EditorIcon-BXHgGffi.js} +1 -1
- package/web/assets/{EnvironmentForm-DZXx9r78.js → EnvironmentForm-DFxDqfnF.js} +1 -1
- package/web/assets/{EnvironmentFormPage-Dl7pdkEM.js → EnvironmentFormPage-CY11biI5.js} +1 -1
- package/web/assets/{EnvironmentListPage-B0WX_Hq7.js → EnvironmentListPage-b9CjFQXW.js} +1 -1
- package/web/assets/{KanbanBoardPage-CBJs26gZ.js → KanbanBoardPage-BXrTGXwO.js} +3 -3
- package/web/assets/{KanbanListPage-Cz-tlLWA.js → KanbanListPage-BnvCBJ1m.js} +1 -1
- package/web/assets/{LaunchProjectPage-8SDkFiLE.js → LaunchProjectPage-DHjlOFU3.js} +1 -1
- package/web/assets/{LaunchServicesPage-B-ncX3rd.js → LaunchServicesPage-XjPg8Pys.js} +1 -1
- package/web/assets/{LogViewer-BJNqKt3I.js → LogViewer-BcPdl4iU.js} +1 -1
- package/web/assets/{ProcessControls-NA6_my0q.js → ProcessControls-DorabWJQ.js} +1 -1
- package/web/assets/{ProcessDetailPage-6galJRdd.js → ProcessDetailPage-Ch8Jf9rM.js} +1 -1
- package/web/assets/{ProcessMetrics-CUDjJ4s_.js → ProcessMetrics-COGHKb4a.js} +1 -1
- package/web/assets/{ProjectDetailPage-DKHoFXjW.js → ProjectDetailPage-BmU8DBNe.js} +1 -1
- package/web/assets/{ProjectListPage-C1xSP6Bq.js → ProjectListPage-JD1ekolM.js} +1 -1
- package/web/assets/{RandomJobTestPage-BAuT49yE.js → RandomJobTestPage-Cc-DhTsH.js} +1 -1
- package/web/assets/{ScenarioEditorPage-CROCV83A.js → ScenarioEditorPage-Bny2HqiP.js} +1 -1
- package/web/assets/{SendToChatDialog-BfaLVfzw.js → SendToChatDialog-B4CWWMCy.js} +1 -1
- package/web/assets/{ServiceControlsBar-DE0In-jH.js → ServiceControlsBar-D6mfDvfN.js} +1 -1
- package/web/assets/{ServiceDetailPage-0iIv9RqU.js → ServiceDetailPage-D2WqU25G.js} +1 -1
- package/web/assets/{ServiceFormPage-D-tLX8jE.js → ServiceFormPage-BcA2kArc.js} +1 -1
- package/web/assets/{SettingsPage-ySsQCeYE.css → SettingsPage-AOrh0K7b.css} +1 -1
- package/web/assets/SettingsPage-oAjjAaeD.js +2063 -0
- package/web/assets/{UnlockPage-flNU5Iky.js → UnlockPage-CRYhFCMk.js} +1 -1
- package/web/assets/{VariablesTable-BnCSYLD4.js → VariablesTable-DyWAE6Na.js} +1 -1
- package/web/assets/{VaultMigrationPage-BSv9anTA.js → VaultMigrationPage-Dsu3akRc.js} +1 -1
- package/web/assets/{VersionBadge-zyKx_N_w.js → VersionBadge-CVTn4GGc.js} +1 -1
- package/web/assets/WikiPage-DGMyydUW.js +1 -0
- package/web/assets/{WikiView-BZZ5mybT.js → WikiView-BArE3tFo.js} +1 -1
- package/web/assets/{add-scalar-classes-DZb8OCPH.js → add-scalar-classes-jKlPbn1S.js} +3 -3
- package/web/assets/auth-errors-BfeIh95U.js +1 -0
- package/web/assets/{autocomplete-DGLJp6Xx.js → autocomplete-CI8vAiwp.js} +1 -1
- package/web/assets/{basic-shape-diamond.svg-D7lBpWcu.js → basic-shape-diamond.svg-Cp5z3Mbu.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-BIDPqohs.js → basic-shape-hexagon.svg-RBwhM6k0.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-iWUF3CNK.js → basic-shape-primary-circle-ellipse-round.svg-itOztFgT.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-BQy8tY9i.js → basic-shape-primary-square-rectangle.svg-CwfKFMzE.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-Dcov5U2N.js → basic-shape-shield.svg-BdZgtv30.js} +1 -1
- package/web/assets/{browser-DrMkXWE3.js → browser-BXJrZHue.js} +1 -1
- package/web/assets/{browser-Dc4T6GL2.js → browser-D7pIWkfx.js} +1 -1
- package/web/assets/{card-DADdd2-i.js → card-DR0T843h.js} +1 -1
- package/web/assets/{checkbox-By0TwAz_.js → checkbox-DDIPahTi.js} +1 -1
- package/web/assets/{chip-W5HkUiZA.js → chip-DM8SNVy0.js} +1 -1
- package/web/assets/{client-Be8SiY8s.js → client-BAdezrlT.js} +1 -1
- package/web/assets/{cloud-chat.store-GKWq9kin.js → cloud-chat.store-Xf5_YRwv.js} +1 -1
- package/web/assets/{cloud-session-CJ4n3dbT.js → cloud-session-B1zFsfcb.js} +1 -1
- package/web/assets/{column-P4Yoqttz.js → column-Bo2upVbJ.js} +1 -1
- package/web/assets/{computer-device-desktop-monitor.svg-BjBC4Q_B.js → computer-device-desktop-monitor.svg-DOS9l00c.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-C7H8X0sb.js → computer-device-desktop.svg-C-ttSSSz.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-GDU5987h.js → computer-device-laptop.svg-DDFbbX6c.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-BcWod8vA.js → computer-device-mobile-phone-android-samsung-back.svg-BZ-Gdh6W.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-Cj58lY5g.js → computer-device-mobile-phone-android-samsung.svg-COcp4u1j.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-CtJM7Ul_.js → computer-device-mobile-phone-iphone-x-back.svg-CDmKBZ0s.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-BiSi4riW.js → computer-device-mobile-phone-iphone-x.svg-QBXd3bAz.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-BAMVDwHH.js → computer-device-mobile-tablet-touch.svg-CiqMqHgJ.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-quWU62em.js → computer-device-mobile-tablet.svg-DXWdkli1.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-eoCbNWkF.js → computer-device-network-ethernet-cat6.svg-pd7Pp62E.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-AR5jmH9w.js → computer-device-network-lan-www.svg-hwQtK4mS.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-C3-i1o4I.js → computer-device-network-wifi-connection.svg-BKKSNm-Y.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-D8_62H2U.js → computer-device-network-wifi-router.svg-BJ7429Gw.js} +1 -1
- package/web/assets/{cssMode-CfDickSl.js → cssMode-DvqPjG-s.js} +1 -1
- package/web/assets/{divider-DOwWKUnp.js → divider-DmUVUD7N.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-bmj1315r.js → ecology-science-erlenmeyer-flask.svg-CkvWyk06.js} +1 -1
- package/web/assets/{fieldset-CM6GY5DX.js → fieldset-RNy_epe7.js} +1 -1
- package/web/assets/{freemarker2-B_0Gh4L-.js → freemarker2-B_05mUOO.js} +1 -1
- package/web/assets/{handlebars-D7Oha3sz.js → handlebars-mwqq4hMg.js} +1 -1
- package/web/assets/{html-BDq-ql3l.js → html-DenFU_p3.js} +1 -1
- package/web/assets/{htmlMode-DVuzX8LQ.js → htmlMode-Dd5pT6tW.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-pdHiRywD.js → image-flash-lightning.svg-FRUbJgX5.js} +1 -1
- package/web/assets/{image-picture-flower.svg-BJarIt4k.js → image-picture-flower.svg-BBS3ExSo.js} +1 -1
- package/web/assets/{index-Dk3h9927.js → index-FACKwVg6.js} +5 -5
- package/web/assets/{interface-alert-exclamation-diamond.svg-CZUf0TtR.js → interface-alert-exclamation-diamond.svg-CBN8Pmeh.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-B1qbmOvN.js → interface-alert-exclamation-triangle-warning.svg-siL3-gmT.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-DAH6I2Rk.js → interface-alert-information-circle.svg-CynXrOR8.js} +1 -1
- package/web/assets/{interface-award-crown.svg-Co-un_0E.js → interface-award-crown.svg-BakRoInk.js} +1 -1
- package/web/assets/{interface-bookmark.svg-BoAQ5WAA.js → interface-bookmark-tag.svg-BJnfvdzr.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-DCeSL4gX.js → interface-bookmark.svg-BnQK5mgu.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-KM5TH_vj.js → interface-calendar-date-one.svg-fO1_AoDh.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-2t-0H_Nl.js → interface-content-book-open-pages.svg-DqRdJvqM.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-Dx9U_5uo.js → interface-content-book-page.svg-Byeli3di.js} +1 -1
- package/web/assets/{interface-content-file.svg-CW_9AGDl.js → interface-content-file.svg-ViG_2r3n.js} +1 -1
- package/web/assets/interface-content-folder.svg-VCUetvJn.js +1 -0
- package/web/assets/{interface-content-folder.svg-DgU2KM8d.js → interface-content-folder.svg-tRv9Gs6q.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-BXCY1wtO.js → interface-copy-clipboard.svg-BF2p1SyS.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-lJsBgdnd.js → interface-edit-attachment.svg-CcxMnh8E.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-N_us2_d_.js → interface-edit-binocular.svg-CIzctb_f.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-GlHpAoND.js → interface-edit-magic-wand.svg-LoGhgGEZ.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-B3s6tHLT.js → interface-edit-tool-paint-roller.svg-C6oZCjMJ.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-BhJltLPD.js → interface-edit-tool-pencil.svg-D3lpq_xl.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-CAC4qrCL.js → interface-favorite-award.svg-CrXhhhyj.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-5dLI18uT.js → interface-favorite-flag.svg-ccF9TDui.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-DAWMqUS8.js → interface-favorite-heart.svg-gu7br9DK.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-C9DICFBb.js → interface-favorite-star.svg-B7E60ZEr.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-zD5-a95u.js → interface-favorite-stars-sparkles.svg-DOEwwXiW.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-BzAAQM0v.js → interface-hierarchy-flowchart.svg-tLEmCbmQ.js} +1 -1
- package/web/assets/{interface-home-house.svg-CB_mzszz.js → interface-home-house.svg-Cf1KxixQ.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-BUMVlOAE.js → interface-hyperlink.svg-DAT8qW_c.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-wPXo2pZW.js → interface-lighting-brightness.svg-BX6x0ddS.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-Qj4fLj5D.js → interface-lock-closed.svg-DrFxkZYe.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-PaaFsUiU.js → interface-lock-open-unlock.svg-Dr0jcfmK.js} +1 -1
- package/web/assets/{interface-login-key.svg-By-IZ7EH.js → interface-login-key.svg-CeXnvMKQ.js} +1 -1
- package/web/assets/{interface-search.svg-D1s5Gsyk.js → interface-search.svg-CBYRLqmj.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-BIjZVOwf.js → interface-setting-cog.svg-pIrK77it.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-1oPoDdIL.js → interface-share-megaphone-bullhorn.svg-CXENaufm.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-B07UdOH6.js → interface-share-rocket.svg-BUEDGolV.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-AxSAr1JP.js → interface-share-satellite.svg-CDbsJhFP.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-ghRJYkXG.js → interface-share-space-ship.svg-Byg2lwxp.js} +1 -1
- package/web/assets/{interface-share.svg-jVvV5wf9.js → interface-share.svg-DS5PCA34.js} +1 -1
- package/web/assets/{interface-signal-square.svg-BB8KvxNI.js → interface-signal-square.svg-pcqPb4nM.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-Bt_vXLib.js → interface-time-clock-circle.svg-Cy9A8GRt.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-CqsWXDx3.js → interface-time-hour-glass.svg-GWa1W0Xp.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-DfZzhCkI.js → interface-users-multiple.svg-CBEbE-7A.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-B5X37fBl.js → interface-weather-moon.svg-DeinSoJT.js} +1 -1
- package/web/assets/{javascript-DWxMn_QC.js → javascript-H6N3mcld.js} +1 -1
- package/web/assets/{jsonMode-BWOZzM3d.js → jsonMode-CtZxIxon.js} +1 -1
- package/web/assets/{liquid-B0VtIwJX.js → liquid-DvIoyIx6.js} +1 -1
- package/web/assets/{lspLanguageFeatures-DXFZNqLk.js → lspLanguageFeatures-BEUuqX73.js} +1 -1
- package/web/assets/{mail-chat-bubble-square.svg-DVi8sPM-.js → mail-chat-bubble-square.svg-cxMRc1aj.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-Dlk35rWL.js → mail-send-email-paper-airplane.svg-Dg_l-5Iw.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-DpEE06QS.js → mail-send-envelope.svg-C1zNJdsK.js} +1 -1
- package/web/assets/{mdx-XjdLNHo4.js → mdx-BmQyOder.js} +1 -1
- package/web/assets/{message-TASaHoOx.js → message-B83bhy06.js} +1 -1
- package/web/assets/{minus-BO9HwuhK.js → minus-CBo2o8C-.js} +1 -1
- package/web/assets/modal-CaMkh9Za.js +1 -0
- package/web/assets/{modal-Dadfdblm.js → modal-tQ8Gy3Qc.js} +1 -1
- package/web/assets/{money-cashier-receipt.svg-D3T1gdZO.js → money-cashier-receipt.svg-HRh_0Aog.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-RhoFWz8z.js → money-currency-dollar-pay.svg-Gaqcc4gO.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-BENn1K5R.js → money-graph-arrow-increase.svg-DlfNGxjc.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-COGPwero.js → money-graph-bar-chart-increase.svg-lCsn857J.js} +1 -1
- package/web/assets/{multiselect-QI9V-o7t.js → multiselect-BWxLa59l.js} +1 -1
- package/web/assets/{nature-ecology-leaf.svg-CyQJuX9P.js → nature-ecology-leaf.svg-CqS_HbDW.js} +1 -1
- package/web/assets/{password-68lVUSdj.js → password-cPgUvkOA.js} +1 -1
- package/web/assets/{phone-telephone.svg-Cp49xUlu.js → phone-telephone.svg-BQJVa8xN.js} +1 -1
- package/web/assets/{plus-CtAUJUu2.js → plus-CbJTMelx.js} +1 -1
- package/web/assets/process.store-BIdF5bYJ.js +1 -0
- package/web/assets/{programming-bug.svg-DJCw-G7S.js → programming-bug.svg-DHSOyTDX.js} +1 -1
- package/web/assets/{programming-cloud.svg-Dawch6nl.js → programming-cloud.svg-BN2VfYj9.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-wM3gh9nl.js → programming-computer-database-server.svg-DgLqhsmV.js} +1 -1
- package/web/assets/{programming-computer-database.svg-B-CBQ4FN.js → programming-computer-database.svg-Rv3dMbvo.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-B8K3IYUP.js → programming-module-four-layout.svg-BL9bWIfn.js} +1 -1
- package/web/assets/{programming-module-three.svg-BVHpxetj.js → programming-module-three.svg-Iu-KnX2V.js} +1 -1
- package/web/assets/{programming-module.svg-CXID9wrd.js → programming-module.svg-BcCF6qxu.js} +1 -1
- package/web/assets/{programming-script-code.svg-lSz-9Xfp.js → programming-script-code.svg-XJSdxMcg.js} +1 -1
- package/web/assets/{python-DL0o4ZFa.js → python-cAYLyvNp.js} +1 -1
- package/web/assets/{razor-1T_DtFYV.js → razor-BHgxVMOQ.js} +1 -1
- package/web/assets/router-CK12uURM.js +1 -0
- package/web/assets/settings-scope-f9Gi_Zg9.js +1 -0
- package/web/assets/{settings.store-xvHd8xGI.js → settings.store-CSquriN7.js} +1 -1
- package/web/assets/{shopping-cart.svg-TZA8HEQB.js → shopping-cart.svg-BueYQs5x.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-CRGiXfBk.js → shopping-gift-present.svg-TrpUap-y.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-BuEMZoGf.js → shopping-shipping-box-parcel-package.svg-DAccGtLa.js} +1 -1
- package/web/assets/{src-Be-L2-AH.js → src-DYi4G92i.js} +1 -1
- package/web/assets/{src-Dy-bHT95.js → src-DyMz5bgz.js} +1 -1
- package/web/assets/{tabpanel-BP3edJSv.js → tabpanel-MnA7nEtj.js} +1 -1
- package/web/assets/{tag-new-circle.svg-CsOt9-U5.js → tag-new-circle.svg-D9oUh7ff.js} +1 -1
- package/web/assets/{toggleswitch-B49OhBFD.js → toggleswitch-loQuxYj9.js} +1 -1
- package/web/assets/{travel-map-earth-globe.svg-BTR5ahca.js → travel-map-earth-globe.svg-DqCfEOX7.js} +1 -1
- package/web/assets/trpc-BlNlu2jq.js +1 -0
- package/web/assets/{tsMode-BUrbWgsu.js → tsMode-CP_fyAf1.js} +1 -1
- package/web/assets/{typescript-tKGzqX3Z.js → typescript-dDBinZo_.js} +1 -1
- package/web/assets/useAiChatDrawer-eoSxh6yR.js +1 -0
- package/web/assets/{useCloudOrg-0VY86rgI.js → useCloudOrg-CP0cj8Kq.js} +1 -1
- package/web/assets/{useProjectCatalog-C2BH8Bnr.js → useProjectCatalog-a-o-oRlg.js} +1 -1
- package/web/assets/{xml-4CdtJV3Y.js → xml-DlpU-b_9.js} +1 -1
- package/web/assets/{yaml-Cj7LK0oJ.js → yaml-CKngaf3N.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-EDFP4VXP.js +0 -7
- package/chunk-NLVDO4EC.js.map +0 -1
- package/src-V3J62F6F.js.map +0 -1
- package/web/assets/AiChatPage-DvPM0b-g.js +0 -1
- package/web/assets/AppLayout-CxU9x6en.js +0 -1
- package/web/assets/CloudAccountPage-CzUpIjdc.js +0 -1
- package/web/assets/SettingsPage-ClNw9uEA.js +0 -2063
- package/web/assets/WikiPage-C9Bruew6.js +0 -1
- package/web/assets/auth-errors-CU6pB2jP.js +0 -1
- package/web/assets/interface-content-folder.svg-C9_1n23c.js +0 -1
- package/web/assets/modal-B0K9qtIb.js +0 -1
- package/web/assets/process.store-DkO9CCEs.js +0 -1
- package/web/assets/router-BKOiPGCa.js +0 -1
- package/web/assets/settings-scope-DrVQNSTC.js +0 -1
- package/web/assets/trpc-hOuUVUMw.js +0 -1
- package/web/assets/useAiChatDrawer-CZS0RLp8.js +0 -1
- /package/{agent-manager-EDFP4VXP.js.map → agent-manager-NJMLCIVW.js.map} +0 -0
package/index.js
CHANGED
|
@@ -270,7 +270,7 @@ function listenWithRetry(server, port, host, wss, maxRetries = 20, delay = 500)
|
|
|
270
270
|
});
|
|
271
271
|
}
|
|
272
272
|
async function main() {
|
|
273
|
-
const { createLocalServer, pullEnv, PullEnvError, registerInstance } = await import("./src-
|
|
273
|
+
const { createLocalServer, pullEnv, PullEnvError, registerInstance } = await import("./src-FYMPMNWX.js");
|
|
274
274
|
if (isPullEnv) {
|
|
275
275
|
if (!serviceArg) {
|
|
276
276
|
console.error("Error: --service (-s) is required with --pull-env");
|
package/package.json
CHANGED
|
@@ -70,6 +70,7 @@ import {
|
|
|
70
70
|
machineRoot,
|
|
71
71
|
markVaultLocked,
|
|
72
72
|
nativeParsers,
|
|
73
|
+
orgIdOfRoot,
|
|
73
74
|
orgVaultRoot,
|
|
74
75
|
projectKey,
|
|
75
76
|
projectVaultRoot,
|
|
@@ -95,7 +96,7 @@ import {
|
|
|
95
96
|
vaultFor,
|
|
96
97
|
vaultIdOfRoot,
|
|
97
98
|
writeEntity
|
|
98
|
-
} from "./chunk-
|
|
99
|
+
} from "./chunk-WI4NXXWA.js";
|
|
99
100
|
|
|
100
101
|
// ../server/src/create-server.ts
|
|
101
102
|
import express from "express";
|
|
@@ -231,6 +232,7 @@ var ApiKeyStore = class {
|
|
|
231
232
|
async load() {
|
|
232
233
|
if (this.loaded) return;
|
|
233
234
|
this.loaded = true;
|
|
235
|
+
this.unreadable.clear();
|
|
234
236
|
const owners = [null, ...await listOrgVaults()];
|
|
235
237
|
for (const owner of owners) {
|
|
236
238
|
await this.loadFile(await this.filePath(true, owner), owner);
|
|
@@ -537,8 +539,8 @@ import { TRPCError as TRPCError2 } from "@trpc/server";
|
|
|
537
539
|
// ../server/src/services/project-store.ts
|
|
538
540
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
539
541
|
import { EventEmitter } from "events";
|
|
540
|
-
import { readFile as
|
|
541
|
-
import { join as
|
|
542
|
+
import { readFile as readFile3, writeFile as writeFile4, rename as rename3, mkdir as mkdir3, chmod as chmod3, rm } from "fs/promises";
|
|
543
|
+
import { join as join4 } from "path";
|
|
542
544
|
|
|
543
545
|
// ../server/src/utils/ensure-data-gitignore.ts
|
|
544
546
|
import { writeFile as writeFile2 } from "fs/promises";
|
|
@@ -583,8 +585,108 @@ async function ensureDataGitignore(dataDir) {
|
|
|
583
585
|
await writeFile2(gitignorePath, GITIGNORE_CONTENT, "utf-8");
|
|
584
586
|
}
|
|
585
587
|
|
|
588
|
+
// ../server/src/services/project-path-store.ts
|
|
589
|
+
import { readFile as readFile2, writeFile as writeFile3, rename as rename2, mkdir as mkdir2, chmod as chmod2, stat } from "fs/promises";
|
|
590
|
+
import { isAbsolute, join as join3, resolve } from "path";
|
|
591
|
+
var FILENAME = "project-paths.json";
|
|
592
|
+
var ProjectPathStore = class {
|
|
593
|
+
paths = null;
|
|
594
|
+
async load() {
|
|
595
|
+
if (this.paths) return this.paths;
|
|
596
|
+
try {
|
|
597
|
+
const raw = await readFile2(machineFilePath(FILENAME), "utf-8");
|
|
598
|
+
const parsed = JSON.parse(raw);
|
|
599
|
+
this.paths = isPathMap(parsed) ? parsed : {};
|
|
600
|
+
} catch {
|
|
601
|
+
this.paths = {};
|
|
602
|
+
}
|
|
603
|
+
return this.paths;
|
|
604
|
+
}
|
|
605
|
+
async persist() {
|
|
606
|
+
await mkdir2(machineRoot(), { recursive: true });
|
|
607
|
+
const filePath = machineFilePath(FILENAME);
|
|
608
|
+
const tmpPath = `${filePath}.tmp`;
|
|
609
|
+
await writeFile3(tmpPath, JSON.stringify(this.paths ?? {}, null, 2), "utf-8");
|
|
610
|
+
await rename2(tmpPath, filePath);
|
|
611
|
+
await chmod2(filePath, 384);
|
|
612
|
+
}
|
|
613
|
+
/** The directory chosen for this project, or null while it has none. */
|
|
614
|
+
async get(ref) {
|
|
615
|
+
const paths = await this.load();
|
|
616
|
+
return paths[projectKey(ref)] ?? paths[ref.id] ?? null;
|
|
617
|
+
}
|
|
618
|
+
async all() {
|
|
619
|
+
return { ...await this.load() };
|
|
620
|
+
}
|
|
621
|
+
/**
|
|
622
|
+
* The project already placed in this directory, if any other one is.
|
|
623
|
+
*
|
|
624
|
+
* Answers with the key as stored — the couple, or the bare id for an entry an
|
|
625
|
+
* older version wrote — which is enough to say "taken" and to name it.
|
|
626
|
+
*/
|
|
627
|
+
async projectAt(path, exclude) {
|
|
628
|
+
const target = resolve(path);
|
|
629
|
+
const excluded = exclude ? [projectKey(exclude), exclude.id] : [];
|
|
630
|
+
for (const [key, dir] of Object.entries(await this.load())) {
|
|
631
|
+
if (!excluded.includes(key) && resolve(dir) === target) return key;
|
|
632
|
+
}
|
|
633
|
+
return null;
|
|
634
|
+
}
|
|
635
|
+
async set(ref, path) {
|
|
636
|
+
if (!isAbsolute(path)) throw new Error("Le chemin du projet doit \xEAtre absolu");
|
|
637
|
+
const paths = await this.load();
|
|
638
|
+
delete paths[ref.id];
|
|
639
|
+
paths[projectKey(ref)] = resolve(path);
|
|
640
|
+
await this.persist();
|
|
641
|
+
}
|
|
642
|
+
/**
|
|
643
|
+
* Faire suivre le répertoire quand un projet change d'organisation.
|
|
644
|
+
*
|
|
645
|
+
* La clé est le couple `(organisation, projet)` : publier un projet local le
|
|
646
|
+
* fait passer de `local:<id>` à `<org>:<id>`, et l'entrée d'avant cesse alors
|
|
647
|
+
* de répondre — `get` ne retombe que sur l'identifiant nu, forme héritée, pas
|
|
648
|
+
* sur `local:<id>`. Le projet se retrouvait donc sans emplacement connu juste
|
|
649
|
+
* après avoir été publié, alors que ses sources n'avaient pas bougé d'un
|
|
650
|
+
* octet.
|
|
651
|
+
*/
|
|
652
|
+
async relocate(from, to) {
|
|
653
|
+
const paths = await this.load();
|
|
654
|
+
const previous = paths[projectKey(from)] ?? paths[from.id];
|
|
655
|
+
if (!previous) return;
|
|
656
|
+
delete paths[projectKey(from)];
|
|
657
|
+
delete paths[from.id];
|
|
658
|
+
paths[projectKey(to)] = previous;
|
|
659
|
+
await this.persist();
|
|
660
|
+
}
|
|
661
|
+
async clear(ref) {
|
|
662
|
+
const paths = await this.load();
|
|
663
|
+
const keys = [projectKey(ref), ref.id].filter((k) => k in paths);
|
|
664
|
+
if (keys.length === 0) return;
|
|
665
|
+
for (const key of keys) delete paths[key];
|
|
666
|
+
await this.persist();
|
|
667
|
+
}
|
|
668
|
+
/** Test seam: forget what was read from disk. */
|
|
669
|
+
reset() {
|
|
670
|
+
this.paths = null;
|
|
671
|
+
}
|
|
672
|
+
};
|
|
673
|
+
function isPathMap(value) {
|
|
674
|
+
return !!value && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((v) => typeof v === "string");
|
|
675
|
+
}
|
|
676
|
+
async function holdsRuneyaProject(path) {
|
|
677
|
+
for (const candidate of ["project.json", "projects.json"]) {
|
|
678
|
+
try {
|
|
679
|
+
await stat(join3(path, ".runeya", candidate));
|
|
680
|
+
return true;
|
|
681
|
+
} catch {
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
return false;
|
|
685
|
+
}
|
|
686
|
+
var projectPathStore = new ProjectPathStore();
|
|
687
|
+
|
|
586
688
|
// ../server/src/services/project-store.ts
|
|
587
|
-
var
|
|
689
|
+
var FILENAME2 = "project.json";
|
|
588
690
|
var LEGACY_FILENAME = "projects.json";
|
|
589
691
|
function toDiskForm(project) {
|
|
590
692
|
const { activeEnvironmentId: _runtimeOnly, ...rest } = project;
|
|
@@ -594,14 +696,14 @@ async function readLocalProject() {
|
|
|
594
696
|
const root = localVaultRoot();
|
|
595
697
|
let current = null;
|
|
596
698
|
try {
|
|
597
|
-
const raw = await
|
|
699
|
+
const raw = await readFile3(join4(root, FILENAME2), "utf-8");
|
|
598
700
|
const parsed = ProjectSchema.safeParse(JSON.parse(raw));
|
|
599
701
|
if (parsed.success) current = parsed.data;
|
|
600
702
|
} catch {
|
|
601
703
|
}
|
|
602
704
|
let legacy;
|
|
603
705
|
try {
|
|
604
|
-
legacy = JSON.parse(await
|
|
706
|
+
legacy = JSON.parse(await readFile3(join4(root, LEGACY_FILENAME), "utf-8"));
|
|
605
707
|
} catch {
|
|
606
708
|
return { local: current, strayCloud: [] };
|
|
607
709
|
}
|
|
@@ -611,7 +713,7 @@ async function readLocalProject() {
|
|
|
611
713
|
if (locals.length > 1) {
|
|
612
714
|
const names = locals.map((p) => `"${p.name}" (${p.id})`).join(", ");
|
|
613
715
|
throw new Error(
|
|
614
|
-
`${
|
|
716
|
+
`${join4(root, LEGACY_FILENAME)} holds ${locals.length} local projects: ${names}. A directory now holds a single local project \u2014 move the others to their own directory, or into an organization, then start again.`
|
|
615
717
|
);
|
|
616
718
|
}
|
|
617
719
|
return { local: locals[0] ?? null, strayCloud };
|
|
@@ -620,7 +722,7 @@ async function readCloudProjects() {
|
|
|
620
722
|
const found = [];
|
|
621
723
|
for (const { orgId, projectId, root } of await listCloudVaults()) {
|
|
622
724
|
try {
|
|
623
|
-
const raw = await
|
|
725
|
+
const raw = await readFile3(join4(root, FILENAME2), "utf-8");
|
|
624
726
|
const parsed = ProjectSchema.safeParse({ ...JSON.parse(raw), id: projectId, orgId });
|
|
625
727
|
if (parsed.success) found.push({ project: parsed.data, root });
|
|
626
728
|
} catch {
|
|
@@ -650,13 +752,13 @@ var ProjectStore = class {
|
|
|
650
752
|
/** Emits `'saved'` after every persisted mutation, for the cloud sync bridge. */
|
|
651
753
|
events = new EventEmitter();
|
|
652
754
|
getFilePath(root = localVaultRoot()) {
|
|
653
|
-
return
|
|
755
|
+
return join4(root, FILENAME2);
|
|
654
756
|
}
|
|
655
757
|
async writeAtomic(filePath, data) {
|
|
656
758
|
const tmpPath = filePath + ".tmp";
|
|
657
|
-
await
|
|
658
|
-
await
|
|
659
|
-
await
|
|
759
|
+
await writeFile4(tmpPath, data, "utf-8");
|
|
760
|
+
await rename3(tmpPath, filePath);
|
|
761
|
+
await chmod3(filePath, 384);
|
|
660
762
|
}
|
|
661
763
|
/** Adopt a project read from disk, remembering which vault it came from. */
|
|
662
764
|
async absorb(p, root) {
|
|
@@ -731,10 +833,10 @@ var ProjectStore = class {
|
|
|
731
833
|
await rm(this.getFilePath(), { force: true }).catch(() => {
|
|
732
834
|
});
|
|
733
835
|
}
|
|
734
|
-
await
|
|
836
|
+
await rename3(join4(localVaultRoot(), LEGACY_FILENAME), join4(localVaultRoot(), LEGACY_FILENAME + ".bak")).catch(() => {
|
|
735
837
|
});
|
|
736
838
|
for (const { project, root } of cloud) {
|
|
737
|
-
await
|
|
839
|
+
await mkdir3(root, { recursive: true });
|
|
738
840
|
await this.writeAtomic(this.getFilePath(root), JSON.stringify(toDiskForm(project), null, 2));
|
|
739
841
|
setProjectVault(project, root);
|
|
740
842
|
}
|
|
@@ -862,6 +964,7 @@ var ProjectStore = class {
|
|
|
862
964
|
this.projects.delete(key);
|
|
863
965
|
await this.save();
|
|
864
966
|
await this.discardVault(project);
|
|
967
|
+
await projectPathStore.clear(project);
|
|
865
968
|
return true;
|
|
866
969
|
}
|
|
867
970
|
/**
|
|
@@ -895,6 +998,7 @@ var ProjectStore = class {
|
|
|
895
998
|
forgetProject(project);
|
|
896
999
|
await serviceStore.forgetLocally(project.serviceIds ?? []);
|
|
897
1000
|
await environmentStore.forgetByProject(project.id);
|
|
1001
|
+
await projectPathStore.clear(project);
|
|
898
1002
|
}
|
|
899
1003
|
/** All projects linked to a given organization (for the sync bridge). */
|
|
900
1004
|
async listByOrg(orgId) {
|
|
@@ -1023,9 +1127,9 @@ var projectStore = new ProjectStore();
|
|
|
1023
1127
|
registerProjectLoader(() => projectStore.list().then(() => void 0));
|
|
1024
1128
|
|
|
1025
1129
|
// ../server/src/services/environment-overrides-store.ts
|
|
1026
|
-
import { readFile as
|
|
1027
|
-
import { dirname as dirname2, join as
|
|
1028
|
-
var
|
|
1130
|
+
import { readFile as readFile4, writeFile as writeFile5, rename as rename4, mkdir as mkdir4, chmod as chmod4 } from "fs/promises";
|
|
1131
|
+
import { dirname as dirname2, join as join5 } from "path";
|
|
1132
|
+
var FILENAME3 = "environment-overrides.json";
|
|
1029
1133
|
var EnvironmentOverridesStore = class {
|
|
1030
1134
|
data = {};
|
|
1031
1135
|
loaded = false;
|
|
@@ -1057,11 +1161,11 @@ var EnvironmentOverridesStore = class {
|
|
|
1057
1161
|
async rootFor(variableId) {
|
|
1058
1162
|
const root = await environmentStore.rootOfVariable(variableId);
|
|
1059
1163
|
if (root) return root;
|
|
1060
|
-
return this.roots.get(variableId) ?? dirname2(await keyedFilePath(
|
|
1164
|
+
return this.roots.get(variableId) ?? dirname2(await keyedFilePath(FILENAME3));
|
|
1061
1165
|
}
|
|
1062
1166
|
/** Where earlier versions kept them: read once, rewritten to their vaults. */
|
|
1063
1167
|
getLegacyFilePath() {
|
|
1064
|
-
return legacyMachineFilePath(
|
|
1168
|
+
return legacyMachineFilePath(FILENAME3);
|
|
1065
1169
|
}
|
|
1066
1170
|
/**
|
|
1067
1171
|
* Read every vault, then the places older versions used.
|
|
@@ -1077,13 +1181,13 @@ var EnvironmentOverridesStore = class {
|
|
|
1077
1181
|
const roots = await allVaultRoots();
|
|
1078
1182
|
const sources = [
|
|
1079
1183
|
this.getLegacyFilePath(),
|
|
1080
|
-
await keyedFilePath(
|
|
1081
|
-
...roots.map((root) =>
|
|
1184
|
+
await keyedFilePath(FILENAME3),
|
|
1185
|
+
...roots.map((root) => join5(root, FILENAME3))
|
|
1082
1186
|
];
|
|
1083
1187
|
for (const path of sources) {
|
|
1084
1188
|
let parsed;
|
|
1085
1189
|
try {
|
|
1086
|
-
parsed = JSON.parse(await
|
|
1190
|
+
parsed = JSON.parse(await readFile4(path, "utf-8"));
|
|
1087
1191
|
} catch {
|
|
1088
1192
|
continue;
|
|
1089
1193
|
}
|
|
@@ -1134,12 +1238,12 @@ var EnvironmentOverridesStore = class {
|
|
|
1134
1238
|
this.diskEncryptedSlots,
|
|
1135
1239
|
extractEncryptedVariableSlots(encrypted)
|
|
1136
1240
|
);
|
|
1137
|
-
await
|
|
1138
|
-
const path =
|
|
1241
|
+
await mkdir4(root, { recursive: true });
|
|
1242
|
+
const path = join5(root, FILENAME3);
|
|
1139
1243
|
const tmpPath = path + ".tmp";
|
|
1140
|
-
await
|
|
1141
|
-
await
|
|
1142
|
-
await
|
|
1244
|
+
await writeFile5(tmpPath, JSON.stringify(encrypted, null, 2), "utf-8");
|
|
1245
|
+
await rename4(tmpPath, path);
|
|
1246
|
+
await chmod4(path, 384);
|
|
1143
1247
|
}
|
|
1144
1248
|
}
|
|
1145
1249
|
/**
|
|
@@ -1571,7 +1675,7 @@ var EnvironmentResolver = class {
|
|
|
1571
1675
|
var environmentResolver = new EnvironmentResolver();
|
|
1572
1676
|
|
|
1573
1677
|
// ../server/src/services/audit-service.ts
|
|
1574
|
-
import { appendFile, readFile as
|
|
1678
|
+
import { appendFile, readFile as readFile5, stat as stat2, rename as rename5, unlink, readdir, mkdir as mkdir5 } from "fs/promises";
|
|
1575
1679
|
var AUDIT_FILENAME = "audit.log";
|
|
1576
1680
|
var MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
1577
1681
|
var MAX_AGE_DAYS = 30;
|
|
@@ -1591,7 +1695,7 @@ var AuditService = class {
|
|
|
1591
1695
|
const line = JSON.stringify(record) + "\n";
|
|
1592
1696
|
const filepath = this.getFilePath();
|
|
1593
1697
|
try {
|
|
1594
|
-
await
|
|
1698
|
+
await mkdir5(machineRoot(), { recursive: true });
|
|
1595
1699
|
await appendFile(filepath, line, "utf-8");
|
|
1596
1700
|
await this.rotateIfNeeded();
|
|
1597
1701
|
} catch (err) {
|
|
@@ -1604,7 +1708,7 @@ var AuditService = class {
|
|
|
1604
1708
|
const filepath = this.getFilePath();
|
|
1605
1709
|
let lines;
|
|
1606
1710
|
try {
|
|
1607
|
-
const content = await
|
|
1711
|
+
const content = await readFile5(filepath, "utf-8");
|
|
1608
1712
|
lines = content.trim().split("\n").filter(Boolean);
|
|
1609
1713
|
} catch {
|
|
1610
1714
|
return { entries: [], total: 0 };
|
|
@@ -1635,9 +1739,9 @@ var AuditService = class {
|
|
|
1635
1739
|
async rotateIfNeeded() {
|
|
1636
1740
|
const filepath = this.getFilePath();
|
|
1637
1741
|
try {
|
|
1638
|
-
const stats = await
|
|
1742
|
+
const stats = await stat2(filepath);
|
|
1639
1743
|
if (stats.size > MAX_FILE_SIZE) {
|
|
1640
|
-
await
|
|
1744
|
+
await rename5(filepath, this.getRotatedPath());
|
|
1641
1745
|
}
|
|
1642
1746
|
} catch {
|
|
1643
1747
|
}
|
|
@@ -1662,87 +1766,6 @@ var AuditService = class {
|
|
|
1662
1766
|
};
|
|
1663
1767
|
var auditService = new AuditService();
|
|
1664
1768
|
|
|
1665
|
-
// ../server/src/services/project-path-store.ts
|
|
1666
|
-
import { readFile as readFile5, writeFile as writeFile5, rename as rename5, mkdir as mkdir5, chmod as chmod4, stat as stat2 } from "fs/promises";
|
|
1667
|
-
import { isAbsolute, join as join5, resolve } from "path";
|
|
1668
|
-
var FILENAME3 = "project-paths.json";
|
|
1669
|
-
var ProjectPathStore = class {
|
|
1670
|
-
paths = null;
|
|
1671
|
-
async load() {
|
|
1672
|
-
if (this.paths) return this.paths;
|
|
1673
|
-
try {
|
|
1674
|
-
const raw = await readFile5(machineFilePath(FILENAME3), "utf-8");
|
|
1675
|
-
const parsed = JSON.parse(raw);
|
|
1676
|
-
this.paths = isPathMap(parsed) ? parsed : {};
|
|
1677
|
-
} catch {
|
|
1678
|
-
this.paths = {};
|
|
1679
|
-
}
|
|
1680
|
-
return this.paths;
|
|
1681
|
-
}
|
|
1682
|
-
async persist() {
|
|
1683
|
-
await mkdir5(machineRoot(), { recursive: true });
|
|
1684
|
-
const filePath = machineFilePath(FILENAME3);
|
|
1685
|
-
const tmpPath = `${filePath}.tmp`;
|
|
1686
|
-
await writeFile5(tmpPath, JSON.stringify(this.paths ?? {}, null, 2), "utf-8");
|
|
1687
|
-
await rename5(tmpPath, filePath);
|
|
1688
|
-
await chmod4(filePath, 384);
|
|
1689
|
-
}
|
|
1690
|
-
/** The directory chosen for this project, or null while it has none. */
|
|
1691
|
-
async get(ref) {
|
|
1692
|
-
const paths = await this.load();
|
|
1693
|
-
return paths[projectKey(ref)] ?? paths[ref.id] ?? null;
|
|
1694
|
-
}
|
|
1695
|
-
async all() {
|
|
1696
|
-
return { ...await this.load() };
|
|
1697
|
-
}
|
|
1698
|
-
/**
|
|
1699
|
-
* The project already placed in this directory, if any other one is.
|
|
1700
|
-
*
|
|
1701
|
-
* Answers with the key as stored — the couple, or the bare id for an entry an
|
|
1702
|
-
* older version wrote — which is enough to say "taken" and to name it.
|
|
1703
|
-
*/
|
|
1704
|
-
async projectAt(path, exclude) {
|
|
1705
|
-
const target = resolve(path);
|
|
1706
|
-
const excluded = exclude ? [projectKey(exclude), exclude.id] : [];
|
|
1707
|
-
for (const [key, dir] of Object.entries(await this.load())) {
|
|
1708
|
-
if (!excluded.includes(key) && resolve(dir) === target) return key;
|
|
1709
|
-
}
|
|
1710
|
-
return null;
|
|
1711
|
-
}
|
|
1712
|
-
async set(ref, path) {
|
|
1713
|
-
if (!isAbsolute(path)) throw new Error("Le chemin du projet doit \xEAtre absolu");
|
|
1714
|
-
const paths = await this.load();
|
|
1715
|
-
delete paths[ref.id];
|
|
1716
|
-
paths[projectKey(ref)] = resolve(path);
|
|
1717
|
-
await this.persist();
|
|
1718
|
-
}
|
|
1719
|
-
async clear(ref) {
|
|
1720
|
-
const paths = await this.load();
|
|
1721
|
-
const keys = [projectKey(ref), ref.id].filter((k) => k in paths);
|
|
1722
|
-
if (keys.length === 0) return;
|
|
1723
|
-
for (const key of keys) delete paths[key];
|
|
1724
|
-
await this.persist();
|
|
1725
|
-
}
|
|
1726
|
-
/** Test seam: forget what was read from disk. */
|
|
1727
|
-
reset() {
|
|
1728
|
-
this.paths = null;
|
|
1729
|
-
}
|
|
1730
|
-
};
|
|
1731
|
-
function isPathMap(value) {
|
|
1732
|
-
return !!value && typeof value === "object" && !Array.isArray(value) && Object.values(value).every((v) => typeof v === "string");
|
|
1733
|
-
}
|
|
1734
|
-
async function holdsRuneyaProject(path) {
|
|
1735
|
-
for (const candidate of ["project.json", "projects.json"]) {
|
|
1736
|
-
try {
|
|
1737
|
-
await stat2(join5(path, ".runeya", candidate));
|
|
1738
|
-
return true;
|
|
1739
|
-
} catch {
|
|
1740
|
-
}
|
|
1741
|
-
}
|
|
1742
|
-
return false;
|
|
1743
|
-
}
|
|
1744
|
-
var projectPathStore = new ProjectPathStore();
|
|
1745
|
-
|
|
1746
1769
|
// ../server/src/services/org-keys.ts
|
|
1747
1770
|
import { mkdir as mkdir6 } from "fs/promises";
|
|
1748
1771
|
|
|
@@ -1967,9 +1990,7 @@ async function installOrgKey(orgId, key, masterPassword) {
|
|
|
1967
1990
|
}
|
|
1968
1991
|
var OrgVaultUnreadableError = class extends Error {
|
|
1969
1992
|
constructor(orgId) {
|
|
1970
|
-
super(
|
|
1971
|
-
"Cette organisation est chiffr\xE9e par une cl\xE9 que cette machine n'a pas. Demandez la cl\xE9 \xE0 un membre et adoptez-la avant d'ouvrir ses projets."
|
|
1972
|
-
);
|
|
1993
|
+
super("ORG_VAULT_UNREADABLE");
|
|
1973
1994
|
this.orgId = orgId;
|
|
1974
1995
|
this.name = "OrgVaultUnreadableError";
|
|
1975
1996
|
}
|
|
@@ -3503,6 +3524,30 @@ var ConversationStore = class {
|
|
|
3503
3524
|
const json = decryptValue(encrypted, vault);
|
|
3504
3525
|
return JSON.parse(json);
|
|
3505
3526
|
}
|
|
3527
|
+
/**
|
|
3528
|
+
* Refuser d'écrire dans le coffre d'une organisation sans nommer sa clé.
|
|
3529
|
+
*
|
|
3530
|
+
* `getEncryptionKey(undefined)` rend la clé machine, et c'est le bon défaut
|
|
3531
|
+
* pour le coffre local. Appliqué à un fichier rangé sous `orgs/<org>/`, il
|
|
3532
|
+
* produit un chiffré que ce coffre n'emploie pas — lisible par personne à la
|
|
3533
|
+
* relecture, et impossible à distinguer d'une corruption.
|
|
3534
|
+
*
|
|
3535
|
+
* Le cas a été observé plusieurs fois sans qu'on parvienne à nommer le
|
|
3536
|
+
* chemin fautif : les garde-fous en place traitent le coffre fermé, le
|
|
3537
|
+
* coffre mal résolu et la copie périmée, aucun ne couvrait « coffre non
|
|
3538
|
+
* précisé ». Ces écritures-là n'ont jamais fonctionné — elles échouaient en
|
|
3539
|
+
* silence, ce qui est pire. On les saute désormais en le disant, avec la
|
|
3540
|
+
* pile d'appels qui manquait pour remonter au chemin fautif.
|
|
3541
|
+
*/
|
|
3542
|
+
isVaultNamed(root, vault) {
|
|
3543
|
+
const orgId = orgIdOfRoot(root);
|
|
3544
|
+
if (!orgId || vault) return true;
|
|
3545
|
+
console.error(
|
|
3546
|
+
`[conversation-store] \xC9criture ignor\xE9e dans le coffre de l'organisation ${orgId} (${root}) : aucune cl\xE9 d'organisation nomm\xE9e, le contenu serait chiffr\xE9 par la cl\xE9 machine et illisible \xE0 la relecture.
|
|
3547
|
+
${new Error("trace").stack}`
|
|
3548
|
+
);
|
|
3549
|
+
return false;
|
|
3550
|
+
}
|
|
3506
3551
|
toDisk(conv, vault) {
|
|
3507
3552
|
return {
|
|
3508
3553
|
id: conv.id,
|
|
@@ -3558,6 +3603,7 @@ var ConversationStore = class {
|
|
|
3558
3603
|
return;
|
|
3559
3604
|
}
|
|
3560
3605
|
this.loaded = true;
|
|
3606
|
+
this.unreadable.clear();
|
|
3561
3607
|
await ensureProjectsLoaded();
|
|
3562
3608
|
const vaults = await allVaultRoots();
|
|
3563
3609
|
const legacyPaths = [this.getLegacyFilePath(), await keyedFilePath(FILENAME5)];
|
|
@@ -3633,7 +3679,9 @@ var ConversationStore = class {
|
|
|
3633
3679
|
const root = await this.rootFor(conv);
|
|
3634
3680
|
this.roots.set(conv.id, root);
|
|
3635
3681
|
const bucket = byRoot.get(root) ?? [];
|
|
3636
|
-
|
|
3682
|
+
const vault = vaultIdOfRoot(root);
|
|
3683
|
+
if (!this.isVaultNamed(root, vault)) continue;
|
|
3684
|
+
bucket.push(this.toDisk(conv, vault));
|
|
3637
3685
|
byRoot.set(root, bucket);
|
|
3638
3686
|
}
|
|
3639
3687
|
for (const [root, items] of this.unreadable) {
|
|
@@ -3907,6 +3955,26 @@ var setupRouter = router({
|
|
|
3907
3955
|
}))
|
|
3908
3956
|
};
|
|
3909
3957
|
}),
|
|
3958
|
+
/**
|
|
3959
|
+
* Éprouver une clé contre le canari du coffre, sans passer par le cloud.
|
|
3960
|
+
*
|
|
3961
|
+
* `cloudSync.checkOrgKey` interroge le canari publié par l'organisation :
|
|
3962
|
+
* il prouve « cette clé est celle de l'organisation », mais il exige que le
|
|
3963
|
+
* cloud réponde et que l'organisation y existe encore. Un poste hors ligne —
|
|
3964
|
+
* ou qui reprend un coffre dont l'organisation a disparu côté cloud — n'avait
|
|
3965
|
+
* alors plus aucun moyen de vérifier une clé avant de l'adopter.
|
|
3966
|
+
*
|
|
3967
|
+
* Le coffre porte pourtant son propre canari, écrit en même temps que sa clé.
|
|
3968
|
+
* Il répond à la question qui compte ici : cette clé ouvre-t-elle CE coffre ?
|
|
3969
|
+
*/
|
|
3970
|
+
checkOrgKeyLocal: protectedProcedure.input(z7.object({
|
|
3971
|
+
orgId: z7.string().min(1).max(128),
|
|
3972
|
+
keyHex: z7.string().length(64).regex(/^[0-9a-f]+$/i, "Invalid hex format")
|
|
3973
|
+
})).query(async ({ input }) => {
|
|
3974
|
+
const canary = await readVerifyFile(orgVaultRoot(input.orgId));
|
|
3975
|
+
if (!canary) return { matches: false, hasCanary: false };
|
|
3976
|
+
return { matches: matchesCanary(canary, Buffer.from(input.keyHex, "hex")), hasCanary: true };
|
|
3977
|
+
}),
|
|
3910
3978
|
/**
|
|
3911
3979
|
* Submit and validate encryption key.
|
|
3912
3980
|
* Attempts to decrypt existing data to validate the key.
|
|
@@ -7715,7 +7783,7 @@ function tailTranscript(opts) {
|
|
|
7715
7783
|
|
|
7716
7784
|
// ../server/src/services/ai-runners/claude-pty-runner.ts
|
|
7717
7785
|
async function getAgentManager() {
|
|
7718
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
7786
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-NJMLCIVW.js");
|
|
7719
7787
|
return agentManager2;
|
|
7720
7788
|
}
|
|
7721
7789
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -8368,7 +8436,7 @@ async function shutdownCodexAppServer() {
|
|
|
8368
8436
|
}
|
|
8369
8437
|
}
|
|
8370
8438
|
async function getAgentManager2() {
|
|
8371
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
8439
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-NJMLCIVW.js");
|
|
8372
8440
|
return agentManager2;
|
|
8373
8441
|
}
|
|
8374
8442
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -13536,18 +13604,27 @@ async function orgsToSync() {
|
|
|
13536
13604
|
|
|
13537
13605
|
// ../server/src/services/org-canary.ts
|
|
13538
13606
|
var CanaryUnavailableError = class extends Error {
|
|
13539
|
-
code
|
|
13540
|
-
constructor(
|
|
13541
|
-
super(
|
|
13607
|
+
/** `detail` reste pour les journaux ; le message est le code, pour l'interface. */
|
|
13608
|
+
constructor(detail) {
|
|
13609
|
+
super("CANARY_UNAVAILABLE");
|
|
13610
|
+
this.detail = detail;
|
|
13542
13611
|
this.name = "CanaryUnavailableError";
|
|
13543
13612
|
}
|
|
13613
|
+
code = "CANARY_UNAVAILABLE";
|
|
13544
13614
|
};
|
|
13545
13615
|
var OrgKeyMismatchError = class extends Error {
|
|
13546
13616
|
code = "ORG_KEY_MISMATCH";
|
|
13617
|
+
/**
|
|
13618
|
+
* Le message EST le code, comme partout ailleurs sur ces routes.
|
|
13619
|
+
*
|
|
13620
|
+
* Une phrase écrite ici traverse le serveur telle quelle et s'affiche dans
|
|
13621
|
+
* l'interface sans passer par la traduction : une interface en français
|
|
13622
|
+
* annonçait donc l'échec en anglais, et le texte ne pouvait renvoyer nulle
|
|
13623
|
+
* part puisque le serveur ignore où se trouve l'écran qui répare. Le client
|
|
13624
|
+
* traduit `serverErrors.ORG_KEY_MISMATCH` et nomme le chemin.
|
|
13625
|
+
*/
|
|
13547
13626
|
constructor() {
|
|
13548
|
-
super(
|
|
13549
|
-
"This organization uses a different encryption key. Ask a member for the key already in use, then set it up on this machine before syncing."
|
|
13550
|
-
);
|
|
13627
|
+
super("ORG_KEY_MISMATCH");
|
|
13551
13628
|
this.name = "OrgKeyMismatchError";
|
|
13552
13629
|
}
|
|
13553
13630
|
};
|
|
@@ -14341,8 +14418,10 @@ var CloudSyncBridge = class {
|
|
|
14341
14418
|
}
|
|
14342
14419
|
console.warn(
|
|
14343
14420
|
"[cloud-sync] org %s: could not check the organization key (%s) \u2014 syncing anyway.",
|
|
14421
|
+
// Le message porte désormais le code, destiné à l'interface ; le détail
|
|
14422
|
+
// lisible reste sur l'erreur, et c'est lui qui a sa place dans un log.
|
|
14344
14423
|
link.orgId,
|
|
14345
|
-
err.message
|
|
14424
|
+
err.detail ?? err.message
|
|
14346
14425
|
);
|
|
14347
14426
|
}
|
|
14348
14427
|
this.keyMismatch.delete(link.orgId);
|
|
@@ -14619,6 +14698,10 @@ var cloudSyncRouter = router({
|
|
|
14619
14698
|
await cloudSyncBridge.connect({ orgId: input.orgId, cloudUrl: input.cloudUrl });
|
|
14620
14699
|
}
|
|
14621
14700
|
await projectStore.moveToOrg(input.projectId, input.orgId);
|
|
14701
|
+
await projectPathStore.relocate(
|
|
14702
|
+
{ id: input.projectId, orgId: null },
|
|
14703
|
+
{ id: input.projectId, orgId: input.orgId }
|
|
14704
|
+
);
|
|
14622
14705
|
await conversationStore.relocateAll();
|
|
14623
14706
|
try {
|
|
14624
14707
|
await cloudSyncBridge.followProject(input.orgId, input.projectId);
|
|
@@ -17193,4 +17276,4 @@ export {
|
|
|
17193
17276
|
pullEnv,
|
|
17194
17277
|
registerInstance
|
|
17195
17278
|
};
|
|
17196
|
-
//# sourceMappingURL=src-
|
|
17279
|
+
//# sourceMappingURL=src-FYMPMNWX.js.map
|