@runeya/runeya 2.0.70 → 2.0.71
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/index.js +63 -10
- package/agent/index.js.map +1 -1
- package/agent-manager-UUSQK6S2.js +7 -0
- package/{chunk-YSJ6OJGN.js → chunk-Z3KAXI7V.js} +197 -12
- package/chunk-Z3KAXI7V.js.map +1 -0
- package/index.js +1 -1
- package/package.json +1 -1
- package/{src-6WVQ2FQV.js → src-Q3PSCMS7.js} +364 -435
- package/src-Q3PSCMS7.js.map +1 -0
- package/web/assets/{AgentScalarChatInterface.vue-vU3z8Etw.js → AgentScalarChatInterface.vue-Cin_Rbay.js} +1 -1
- package/web/assets/AgentTerminalPage-BD2w4XRc.css +1 -0
- package/web/assets/AgentTerminalPage-YgCQj_Mj.js +1 -0
- package/web/assets/AiChatPage-cIE_ZdF6.js +1 -0
- package/web/assets/{AppLayout-CvkK_Pp3.js → AppLayout-dYfSESzv.js} +1 -1
- package/web/assets/{AuditPage-BZuVgUf1.js → AuditPage-Bw3-G8ZM.js} +1 -1
- package/web/assets/CloudAccountPage-CA4dMsIm.js +1 -0
- package/web/assets/{CloudAccountPage-B__2SGAw.js → CloudAccountPage-DjljrEI_.js} +1 -1
- package/web/assets/{CloudMessagingPage-C5pD6Qsd.js → CloudMessagingPage-CbfH2vPo.js} +1 -1
- package/web/assets/{DashboardPage-66q5K841.js → DashboardPage-Cn3bUyhR.js} +1 -1
- package/web/assets/{DirectoryPickerDialog-wZYtGEZ9.js → DirectoryPickerDialog-BmsAi5gR.js} +1 -1
- package/web/assets/{EditorIcon-DUDLTmUd.js → EditorIcon-JRryeySJ.js} +1 -1
- package/web/assets/{EnvironmentForm-C0Q1pRdW.js → EnvironmentForm-BfF9IFRB.js} +1 -1
- package/web/assets/{EnvironmentFormPage-LO-mwupn.js → EnvironmentFormPage-CebWv3I_.js} +1 -1
- package/web/assets/{EnvironmentListPage-CvknyN3O.js → EnvironmentListPage-DDJGOHvR.js} +1 -1
- package/web/assets/{KanbanBoardPage-DUsAyowy.js → KanbanBoardPage-BMXyvHOl.js} +3 -3
- package/web/assets/{KanbanListPage-9RBCauSd.js → KanbanListPage-YMm_7vzg.js} +1 -1
- package/web/assets/{LaunchProjectPage-obaNCuEY.js → LaunchProjectPage-Da21oFjw.js} +1 -1
- package/web/assets/{LaunchServicesPage-CiWzQIyC.js → LaunchServicesPage-8YJT1stQ.js} +1 -1
- package/web/assets/{LogViewer-BiSD_TNt.js → LogViewer-BYNRWqlP.js} +1 -1
- package/web/assets/{OrgKeyPrompt-zhMl_nTd.js → OrgKeyPrompt-De8D0zzy.js} +1 -1
- package/web/assets/{ProcessControls-DMxvJmDe.js → ProcessControls-BPQXGKib.js} +1 -1
- package/web/assets/{ProcessDetailPage-CsCqQh2V.js → ProcessDetailPage-CVwMbU6x.js} +1 -1
- package/web/assets/{ProcessMetrics-DK4Dgdb0.js → ProcessMetrics-D7L708Em.js} +1 -1
- package/web/assets/{ProjectDetailPage-B0vJySvH.js → ProjectDetailPage-BjBN3hnN.js} +1 -1
- package/web/assets/{ProjectListPage-srxBmrbO.js → ProjectListPage-BRXKT6op.js} +1 -1
- package/web/assets/{RandomJobTestPage-jGfX-6W9.js → RandomJobTestPage-dhDNam5v.js} +1 -1
- package/web/assets/{ScenarioEditorPage-CxLy6gs7.js → ScenarioEditorPage-yOp4ZF14.js} +1 -1
- package/web/assets/{SendToChatDialog-AHkuFQjt.js → SendToChatDialog-o4y1Q-OD.js} +1 -1
- package/web/assets/{ServiceControlsBar-C8P9_qWK.js → ServiceControlsBar-BH1ZEFkK.js} +1 -1
- package/web/assets/{ServiceDetailPage-DTBpQegV.js → ServiceDetailPage-CFb0blqq.js} +1 -1
- package/web/assets/{ServiceFormPage-CsPSMWdD.js → ServiceFormPage-DzFQ_M1-.js} +1 -1
- package/web/assets/SettingsPage-Bcs3tnUy.js +2063 -0
- package/web/assets/{SettingsPage-uCS5lY2z.css → SettingsPage-CScovMi5.css} +1 -1
- package/web/assets/{UnlockPage-Bkp_hR-F.js → UnlockPage-BAxKs_K9.js} +1 -1
- package/web/assets/{VariablesTable-jo61MhbL.js → VariablesTable-CSuAPeF-.js} +1 -1
- package/web/assets/{VaultMigrationPage-D-Dxg5xH.js → VaultMigrationPage-BJX9kunL.js} +1 -1
- package/web/assets/{VersionBadge-CwNZLgqN.js → VersionBadge-B9Wvyvf6.js} +1 -1
- package/web/assets/WikiPage-CBZFOPL_.js +1 -0
- package/web/assets/{WikiView-BpJECJ2Y.js → WikiView-DxPrGyFy.js} +1 -1
- package/web/assets/{add-scalar-classes-CqLAxAGv.js → add-scalar-classes-vtTXFTZ6.js} +3 -3
- package/web/assets/auth-errors-DpUvxKid.js +1 -0
- package/web/assets/{autocomplete-CrMQ2sCk.js → autocomplete-BakcEoGP.js} +1 -1
- package/web/assets/{basic-shape-diamond.svg-CacrbinE.js → basic-shape-diamond.svg-C8K6YjGj.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-GGJ54oyX.js → basic-shape-hexagon.svg-C9PeXR6S.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-CuWfwdJM.js → basic-shape-primary-circle-ellipse-round.svg-CfBLN6Yj.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-C2Bewjip.js → basic-shape-primary-square-rectangle.svg-D2QPBP5_.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-DNtg0KuJ.js → basic-shape-shield.svg-ClsEFdja.js} +1 -1
- package/web/assets/{browser-XO2fm4BX.js → browser-CF5_9QqR.js} +1 -1
- package/web/assets/{browser-5NN8ieli.js → browser-D7ZckEFz.js} +1 -1
- package/web/assets/browser-DNbnH79q.js +6 -0
- package/web/assets/{card-CjcU4SfX.js → card-DcpoBJHQ.js} +1 -1
- package/web/assets/{checkbox-iq9mU5eP.js → checkbox-CfwNXlF_.js} +1 -1
- package/web/assets/{chip-BsccUnHb.js → chip-3tOoBrD7.js} +1 -1
- package/web/assets/{client-B9UJRQa-.js → client-CKBKBNVm.js} +1 -1
- package/web/assets/{cloud-chat.store-Dw2lzuBY.js → cloud-chat.store-Ci1DBP5j.js} +1 -1
- package/web/assets/{cloud-session-DIhbWyP5.js → cloud-session-CzYQ65k8.js} +1 -1
- package/web/assets/{column-BGKYk6b6.js → column-CVuKYYbZ.js} +1 -1
- package/web/assets/{computer-device-desktop-monitor.svg-DSwpF_ss.js → computer-device-desktop-monitor.svg-9f4DSNLj.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-Caj_PZBV.js → computer-device-desktop.svg-BYoXiEOE.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-Bv3ienI_.js → computer-device-laptop.svg-DR1sEMdL.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-IWlhEKx_.js → computer-device-mobile-phone-android-samsung-back.svg-B-AOaBuq.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CglQAFq2.js → computer-device-mobile-phone-android-samsung.svg-Dw4z_H5H.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-CgjNnTTw.js → computer-device-mobile-phone-iphone-x-back.svg-BtqMb2Wo.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CotZ-4M5.js → computer-device-mobile-phone-iphone-x.svg-eYEM_VXA.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-B2cemd61.js → computer-device-mobile-tablet-touch.svg-jLD41nvm.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-8nPVs4u_.js → computer-device-mobile-tablet.svg-D_7_M1GK.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-Bl56Qw4v.js → computer-device-network-ethernet-cat6.svg-B_527QGY.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-C_x6Rf8N.js → computer-device-network-lan-www.svg-ClZIaUOH.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-oz6dsDQB.js → computer-device-network-wifi-connection.svg-DC4OCJY0.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-BciHU6Nj.js → computer-device-network-wifi-router.svg-BWPpobCc.js} +1 -1
- package/web/assets/{cssMode-DSX5tYcm.js → cssMode-CXUrkdrQ.js} +1 -1
- package/web/assets/{divider-DnPOdDs3.js → divider-BrO5nkpd.js} +1 -1
- package/web/assets/docx-preview-tE714WSD.js +21 -0
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-BzQP6y9L.js → ecology-science-erlenmeyer-flask.svg-o8D0ASmr.js} +1 -1
- package/web/assets/{fieldset-D9lkV70l.js → fieldset-LX5cdTvN.js} +1 -1
- package/web/assets/{freemarker2-D9yXX9Vw.js → freemarker2-DJ82s0fP.js} +1 -1
- package/web/assets/{handlebars-BmcjEksL.js → handlebars-BXFlY2Lu.js} +1 -1
- package/web/assets/{html-BQF9vZLL.js → html-CqDVypOC.js} +1 -1
- package/web/assets/{htmlMode-DxSRpgHE.js → htmlMode-DrHxdTQP.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-DQX09uxo.js → image-flash-lightning.svg-BDPMOynq.js} +1 -1
- package/web/assets/{image-picture-flower.svg-CUBdrnoc.js → image-picture-flower.svg-D-AJaery.js} +1 -1
- package/web/assets/{index-enuBsJBa.js → index-a6DAapTb.js} +299 -299
- package/web/assets/{interface-alert-exclamation-diamond.svg-DXQdQSvN.js → interface-alert-exclamation-diamond.svg-CV7M0IVQ.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BoCeNIlU.js → interface-alert-exclamation-triangle-warning.svg-B8NapiB7.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-BCA57JL2.js → interface-alert-information-circle.svg-eQIFULjG.js} +1 -1
- package/web/assets/{interface-award-crown.svg-B1hTlsb0.js → interface-award-crown.svg-D-4fclUD.js} +1 -1
- package/web/assets/{interface-bookmark.svg-zf3cIGKM.js → interface-bookmark-tag.svg-Jy6EOdau.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-AosfQ0Ip.js → interface-bookmark.svg-XdbYDqqk.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-D58WqPie.js → interface-calendar-date-one.svg-BIoXVZrz.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-B74HWMlw.js → interface-content-book-open-pages.svg-DHwJbBvQ.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-C2QWk62-.js → interface-content-book-page.svg-47msUBN_.js} +1 -1
- package/web/assets/{interface-content-file.svg-xKu0qAOQ.js → interface-content-file.svg-DXw9W8QM.js} +1 -1
- package/web/assets/interface-content-folder.svg-BikaY449.js +1 -0
- package/web/assets/{interface-content-folder.svg-ZkrY9WkQ.js → interface-content-folder.svg-BmK_IJv8.js} +1 -1
- package/web/assets/{interface-copy-clipboard.svg-BEkNG3vO.js → interface-copy-clipboard.svg-CQ1rQN0L.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-5ztQ3WTq.js → interface-edit-attachment.svg-C3aTaTh_.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-CC9U1Gnc.js → interface-edit-binocular.svg-B2Ue_tgs.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-CPl6ZoE9.js → interface-edit-magic-wand.svg-DDKse-Wy.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-B85t7jG2.js → interface-edit-tool-paint-roller.svg-C2ABby1f.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-BSTdqWUg.js → interface-edit-tool-pencil.svg-CNjYbknQ.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-DbPr_WKt.js → interface-favorite-award.svg-DWqSHfIa.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-CgKYXc7k.js → interface-favorite-flag.svg-CNUsr98g.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-DfnXyJMg.js → interface-favorite-heart.svg-3Eb366FO.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-0sT7jJMK.js → interface-favorite-star.svg-CVJ3aq1n.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-BcM2EXgn.js → interface-favorite-stars-sparkles.svg-BfXhPBbs.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-BM62WcKt.js → interface-hierarchy-flowchart.svg-DzsqKrYq.js} +1 -1
- package/web/assets/{interface-home-house.svg-KqP7iMC4.js → interface-home-house.svg-BnXbuyZn.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-DBKFbihR.js → interface-hyperlink.svg-BsmSmyP5.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-DTkCS7PY.js → interface-lighting-brightness.svg-BywVQRo9.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-Div5xlvI.js → interface-lock-closed.svg-BLPORc_h.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-Du5L_iMV.js → interface-lock-open-unlock.svg-CaYlbVmU.js} +1 -1
- package/web/assets/{interface-login-key.svg-28TYVVzH.js → interface-login-key.svg-D5F_9MJ0.js} +1 -1
- package/web/assets/{interface-search.svg-BS_owhIG.js → interface-search.svg-CF1D8GIV.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-afYc0TQv.js → interface-setting-cog.svg-D4AOKG2g.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-BnW8HhjG.js → interface-share-megaphone-bullhorn.svg-BIfr2_va.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-DvX_9178.js → interface-share-rocket.svg-NDd3dv1t.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-B4nQqv6w.js → interface-share-satellite.svg-CVDJbmT-.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-Ciol-6JO.js → interface-share-space-ship.svg-D0ZLJNO2.js} +1 -1
- package/web/assets/{interface-share.svg-COm1OVr8.js → interface-share.svg-WpwbpOes.js} +1 -1
- package/web/assets/{interface-signal-square.svg-DXuF6sqG.js → interface-signal-square.svg-DnfzUw_B.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-CWLe4mcs.js → interface-time-clock-circle.svg-BhxciNvX.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-DXz9wBiv.js → interface-time-hour-glass.svg-DBzSaSHQ.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-CXOw1J5l.js → interface-users-multiple.svg-BULh1giq.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-B9H9xib3.js → interface-weather-moon.svg-D377V2os.js} +1 -1
- package/web/assets/{javascript-BY1URXQK.js → javascript-BTXoJ3Qy.js} +1 -1
- package/web/assets/{jsonMode-CxipJdzJ.js → jsonMode-D4a3Khim.js} +1 -1
- package/web/assets/{liquid-BbqI_ezD.js → liquid-DfO0R4Mk.js} +1 -1
- package/web/assets/{lspLanguageFeatures-BrbDxmfl.js → lspLanguageFeatures-BvPWuQFt.js} +1 -1
- package/web/assets/{mail-chat-bubble-square.svg-CAlBGAlW.js → mail-chat-bubble-square.svg-SK3IJ6QN.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-BoNc-FEY.js → mail-send-email-paper-airplane.svg-CJFA7B2E.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-CnMOSib5.js → mail-send-envelope.svg-eO_-QNyE.js} +1 -1
- package/web/assets/{mdx-C4PcQ_oe.js → mdx-G_vwFSSe.js} +1 -1
- package/web/assets/{message-BWsbEnoG.js → message-CxPw04rG.js} +1 -1
- package/web/assets/{minus-BpDIA3FO.js → minus-Dp5ez1-1.js} +1 -1
- package/web/assets/{modal-DZYAJM4x.js → modal-CGT4d1lM.js} +1 -1
- package/web/assets/modal-D_N6NaGL.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-DZQ9mrBZ.js → money-cashier-receipt.svg-EutWthy8.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-BCaw-GeJ.js → money-currency-dollar-pay.svg-MnLj-orw.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-DZXh-i2p.js → money-graph-arrow-increase.svg-CVCZ3TyJ.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-j_1tUlGM.js → money-graph-bar-chart-increase.svg-DiUmCuhj.js} +1 -1
- package/web/assets/{multiselect-CmjxW2sW.js → multiselect-C6uayHqj.js} +1 -1
- package/web/assets/{nature-ecology-leaf.svg-bajA57tM.js → nature-ecology-leaf.svg-ByaLs72Y.js} +1 -1
- package/web/assets/{password-W9W3PSE2.js → password-CxtOqagM.js} +1 -1
- package/web/assets/{phone-telephone.svg-DD5MGHqV.js → phone-telephone.svg-BKz6Jkwn.js} +1 -1
- package/web/assets/{plus-RuIcofM_.js → plus-BPT_7GGk.js} +1 -1
- package/web/assets/process.store-CMxuFjFg.js +1 -0
- package/web/assets/{programming-bug.svg-CjtqBc8Z.js → programming-bug.svg-BwSc8f0s.js} +1 -1
- package/web/assets/{programming-cloud.svg-BXQ_h3dK.js → programming-cloud.svg-CEIulNEp.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-D6TzOHsK.js → programming-computer-database-server.svg-Bc_F3NH0.js} +1 -1
- package/web/assets/{programming-computer-database.svg-Dmdh0lIx.js → programming-computer-database.svg-AYLkzJJE.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-CtGhpLhO.js → programming-module-four-layout.svg-DLpzPxNB.js} +1 -1
- package/web/assets/{programming-module-three.svg-hz_w8W7I.js → programming-module-three.svg-CcuZn8dz.js} +1 -1
- package/web/assets/{programming-module.svg-oDT_fQLn.js → programming-module.svg-BjbGpQeu.js} +1 -1
- package/web/assets/{programming-script-code.svg-CxHHTsaU.js → programming-script-code.svg-poyfodgC.js} +1 -1
- package/web/assets/{python-DH-AyaLR.js → python-DpMMlrWM.js} +1 -1
- package/web/assets/{razor-BUpT1gRX.js → razor-Ba_mg6U5.js} +1 -1
- package/web/assets/router-QZ5Z8Lh7.js +1 -0
- package/web/assets/settings-scope-D7umae8c.js +1 -0
- package/web/assets/{settings.store-Dj2nbYYG.js → settings.store-Dte8TdJb.js} +1 -1
- package/web/assets/{shopping-cart.svg-D1eK38-E.js → shopping-cart.svg-BX2KYVCw.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-CxSfFNAS.js → shopping-gift-present.svg-BOl2vYLg.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-M5Njo2qJ.js → shopping-shipping-box-parcel-package.svg-gxfbOgnM.js} +1 -1
- package/web/assets/{src-CEK4EPEJ.js → src-D0LXRijj.js} +8 -8
- package/web/assets/{src-BTWvqafq.js → src-DWvNj-EG.js} +1 -1
- package/web/assets/{tabpanel-CWwOXePg.js → tabpanel-Bkt-f7d6.js} +1 -1
- package/web/assets/{tag-new-circle.svg-v_Go3fcT.js → tag-new-circle.svg-CTRMBJyc.js} +1 -1
- package/web/assets/{toggleswitch-C4A0_850.js → toggleswitch-DcDrXRKn.js} +1 -1
- package/web/assets/{travel-map-earth-globe.svg-Db2uRb3M.js → travel-map-earth-globe.svg-BPp4IapC.js} +1 -1
- package/web/assets/trpc-Dtgb4BMw.js +1 -0
- package/web/assets/{tsMode-CXB5XugS.js → tsMode-HfLOT-e5.js} +1 -1
- package/web/assets/{typescript-CHJkC9r6.js → typescript-DJAEsDnw.js} +1 -1
- package/web/assets/useAiChatDrawer-fzyQ-fyM.js +1 -0
- package/web/assets/useCloudOrg-BdpqnN19.css +1 -0
- package/web/assets/useCloudOrg-Bg7-icbW.js +97 -0
- package/web/assets/{useProjectCatalog-DDm0I6sX.js → useProjectCatalog-C95cDPIr.js} +1 -1
- package/web/assets/{xml-DB4EKWC9.js → xml-1frg7aol.js} +1 -1
- package/web/assets/{yaml-CqvLyuow.js → yaml-DXzDcMOS.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-74WZPMVQ.js +0 -7
- package/chunk-YSJ6OJGN.js.map +0 -1
- package/src-6WVQ2FQV.js.map +0 -1
- package/web/assets/AgentTerminalPage-A8GIX6dZ.css +0 -1
- package/web/assets/AgentTerminalPage-DE3GUoXn.js +0 -1
- package/web/assets/AiChatPage-BIJczUeS.js +0 -1
- package/web/assets/CloudAccountPage-MSWkg9Ke.js +0 -1
- package/web/assets/SettingsPage-CmtRn6VJ.js +0 -2063
- package/web/assets/WikiPage-DZLKTPi3.js +0 -1
- package/web/assets/auth-errors-BOjTx5eo.js +0 -1
- package/web/assets/interface-content-folder.svg-DjEfXjEF.js +0 -1
- package/web/assets/modal-Fe2dzlxp.js +0 -1
- package/web/assets/process.store-COWqXNUm.js +0 -1
- package/web/assets/router-BIJ4goD-.js +0 -1
- package/web/assets/settings-scope-DGzA7Be-.js +0 -1
- package/web/assets/trpc-DfyQNjZd.js +0 -1
- package/web/assets/useAiChatDrawer-Cuhlc2BI.js +0 -1
- package/web/assets/useCloudOrg-DYOv1Oak.js +0 -93
- package/web/assets/useCloudOrg-Dc6yRgro.css +0 -1
- /package/{agent-manager-74WZPMVQ.js.map → agent-manager-UUSQK6S2.js.map} +0 -0
- /package/web/assets/{abap-Q7FyqTce.js → abap-BvxTqXT2.js} +0 -0
- /package/web/assets/{apex-DBNDq2a_.js → apex-CIPCCkBr.js} +0 -0
- /package/web/assets/{azcli-BHW8ozYN.js → azcli-Rs0NIwkA.js} +0 -0
- /package/web/assets/{bat-BL-_3Nfo.js → bat-BxAhM6gR.js} +0 -0
- /package/web/assets/{bicep-DR2vgumW.js → bicep-oV_ehPcG.js} +0 -0
- /package/web/assets/{cameligo-BCjoEAZU.js → cameligo-CJLaUyQs.js} +0 -0
- /package/web/assets/{clojure-zw1Irdul.js → clojure-CjvMureh.js} +0 -0
- /package/web/assets/{coffee-BdEjkiiW.js → coffee-motWC5XQ.js} +0 -0
- /package/web/assets/{cpp-DKUlBIAG.js → cpp-DiWIfYNM.js} +0 -0
- /package/web/assets/{csharp-BsNC4zVq.js → csharp-GBlGBeai.js} +0 -0
- /package/web/assets/{csp-X4Chv5_9.js → csp-tSyK5eO1.js} +0 -0
- /package/web/assets/{css-Dh0Dlycs.js → css-BkFK9HG_.js} +0 -0
- /package/web/assets/{cypher-BL_DRjGX.js → cypher-Bcp8PXr2.js} +0 -0
- /package/web/assets/{dart-DaM4j487.js → dart-uz9Rxe0M.js} +0 -0
- /package/web/assets/{dockerfile-Df5WJXAt.js → dockerfile-iJizx3Zp.js} +0 -0
- /package/web/assets/{ecl-BjUo3uTs.js → ecl-BalaS36Z.js} +0 -0
- /package/web/assets/{elixir-DrLHYSxt.js → elixir-D6CLrLGy.js} +0 -0
- /package/web/assets/{flow9-DKiuX7rg.js → flow9-CFt3-vVY.js} +0 -0
- /package/web/assets/{fsharp-CAN78557.js → fsharp-DGa7raxa.js} +0 -0
- /package/web/assets/{go-DGjr9vA5.js → go-wlqInk4z.js} +0 -0
- /package/web/assets/{graphql-CcoU3Cj2.js → graphql-CP1guigM.js} +0 -0
- /package/web/assets/{hcl-udfyCcTm.js → hcl-CK0UkKD0.js} +0 -0
- /package/web/assets/{ini-BVbXatjh.js → ini-Ch56nrUj.js} +0 -0
- /package/web/assets/{java-Drpmh61g.js → java-C9_WIayl.js} +0 -0
- /package/web/assets/{julia-asFGk-ZV.js → julia-Can2_mhR.js} +0 -0
- /package/web/assets/{kotlin-HmkKz1TT.js → kotlin-DUvGf_BX.js} +0 -0
- /package/web/assets/{less-C5i2m2Dn.js → less-DoTbG-rc.js} +0 -0
- /package/web/assets/{lexon-B3Xh2kL6.js → lexon-BFMO2_kL.js} +0 -0
- /package/web/assets/{lua-DnOtgOOu.js → lua-CC-QtBo7.js} +0 -0
- /package/web/assets/{m3-Brj4HNKq.js → m3-C51MyH5Q.js} +0 -0
- /package/web/assets/{markdown-C3-4Ntpz.js → markdown-CDwLHhgZ.js} +0 -0
- /package/web/assets/{mips-vFQKPHzn.js → mips-YuxZtPGU.js} +0 -0
- /package/web/assets/{msdax-D5MYLS2R.js → msdax-CJjWhmte.js} +0 -0
- /package/web/assets/{mysql-CRQHhUON.js → mysql-B1riwLaD.js} +0 -0
- /package/web/assets/{objective-c-8cZEp0HR.js → objective-c-drXT-gmc.js} +0 -0
- /package/web/assets/{pascal-BPn_2jro.js → pascal-KUYgrN-Z.js} +0 -0
- /package/web/assets/{pascaligo-L7QnU_8B.js → pascaligo-DQmQJP-r.js} +0 -0
- /package/web/assets/{perl-B9zSPnp3.js → perl-09XLBmCS.js} +0 -0
- /package/web/assets/{pgsql-DiRJukCJ.js → pgsql-BFj9IFFu.js} +0 -0
- /package/web/assets/{php-Dv4g8Lhr.js → php-UnC5BqwY.js} +0 -0
- /package/web/assets/{pla-CKAoz6vp.js → pla-BFuYrPHG.js} +0 -0
- /package/web/assets/{postiats-B_PYgUTS.js → postiats-n4ft3jnO.js} +0 -0
- /package/web/assets/{powerquery-CAagSyo-.js → powerquery-D-s-oFSc.js} +0 -0
- /package/web/assets/{powershell-Cj9BzLhS.js → powershell-CTboTf93.js} +0 -0
- /package/web/assets/{protobuf-DTRY4FFo.js → protobuf-Dt62GuJP.js} +0 -0
- /package/web/assets/{pug-qADGmCS8.js → pug-CEFWkUzw.js} +0 -0
- /package/web/assets/{qsharp-xkZT0ZOm.js → qsharp-B0DUmgPZ.js} +0 -0
- /package/web/assets/{r-C7wfNC2Z.js → r-BVnF0c4T.js} +0 -0
- /package/web/assets/{redis-BoccK80D.js → redis-DLl3KQXi.js} +0 -0
- /package/web/assets/{redshift-EL8PjTts.js → redshift-cif1I7h1.js} +0 -0
- /package/web/assets/{restructuredtext-CA6rgR7C.js → restructuredtext-PNfql36m.js} +0 -0
- /package/web/assets/{ruby-BymrInur.js → ruby-j3jxDjUN.js} +0 -0
- /package/web/assets/{rust-BTbPL-fg.js → rust-BaIO-mAt.js} +0 -0
- /package/web/assets/{sb-BTkOICcb.js → sb-D8XNVNUQ.js} +0 -0
- /package/web/assets/{scala-CzaUHeQF.js → scala-DiK9Ps90.js} +0 -0
- /package/web/assets/{scheme-DZe2DRuY.js → scheme-DPKqXHmF.js} +0 -0
- /package/web/assets/{scss-D5oFt9cg.js → scss-DpMwfP2H.js} +0 -0
- /package/web/assets/{shell-DCkIF5jZ.js → shell-Dw9mKVg2.js} +0 -0
- /package/web/assets/{solidity-CfOO4gXi.js → solidity-DTxo-7fe.js} +0 -0
- /package/web/assets/{sophia-0-sROOHR.js → sophia-BjA3Q87y.js} +0 -0
- /package/web/assets/{sparql-Dzzr9hol.js → sparql-q1EpMUqb.js} +0 -0
- /package/web/assets/{sql-DbXHiHh_.js → sql-CjcQ4wIr.js} +0 -0
- /package/web/assets/{st-DEaYV8xH.js → st-AuOpxVl7.js} +0 -0
- /package/web/assets/{swift-BQItveav.js → swift-BUWnv6f7.js} +0 -0
- /package/web/assets/{systemverilog-nE6YfGlx.js → systemverilog-FhXn-3OZ.js} +0 -0
- /package/web/assets/{tcl-Do7Q0SM0.js → tcl-B0lqcTtS.js} +0 -0
- /package/web/assets/{twig-B2CLZN2j.js → twig-B0OeGPVa.js} +0 -0
- /package/web/assets/{typespec-r9R1AgVi.js → typespec-Bmh6VX11.js} +0 -0
- /package/web/assets/{vb-DGnD02qr.js → vb-bmgX6veu.js} +0 -0
- /package/web/assets/{wgsl-C2fD4koY.js → wgsl-FflLnFqI.js} +0 -0
|
@@ -60,9 +60,11 @@ import {
|
|
|
60
60
|
isVaultLocked,
|
|
61
61
|
keyRoot,
|
|
62
62
|
keyedFilePath,
|
|
63
|
+
killInstance,
|
|
63
64
|
legacyMachineFilePath,
|
|
64
65
|
legacyVaultRoot,
|
|
65
66
|
listCloudVaults,
|
|
67
|
+
listInstances,
|
|
66
68
|
listOrgVaults,
|
|
67
69
|
loadFromEnv,
|
|
68
70
|
localVaultRoot,
|
|
@@ -79,6 +81,7 @@ import {
|
|
|
79
81
|
readOrgNames,
|
|
80
82
|
refOfProjectAmong,
|
|
81
83
|
refsOfProjectId,
|
|
84
|
+
registerInstance,
|
|
82
85
|
registerProjectLoader,
|
|
83
86
|
rememberFile,
|
|
84
87
|
rememberOrgName,
|
|
@@ -93,11 +96,12 @@ import {
|
|
|
93
96
|
stableEncryptValue,
|
|
94
97
|
stampOrgCloud,
|
|
95
98
|
traefikManager,
|
|
99
|
+
unregisterInstance,
|
|
96
100
|
vaultFor,
|
|
97
101
|
vaultIdOfRoot,
|
|
98
102
|
wasRead,
|
|
99
103
|
writeEntity
|
|
100
|
-
} from "./chunk-
|
|
104
|
+
} from "./chunk-Z3KAXI7V.js";
|
|
101
105
|
|
|
102
106
|
// ../server/src/create-server.ts
|
|
103
107
|
import express from "express";
|
|
@@ -4852,20 +4856,20 @@ var settingsRouter = router({
|
|
|
4852
4856
|
});
|
|
4853
4857
|
if (config?.wildcardDomain?.trim()) {
|
|
4854
4858
|
const sanitisedDomain = config.wildcardDomain.replace(/^\*\./, "").replace(/[^a-z0-9.-]/gi, "");
|
|
4855
|
-
const
|
|
4859
|
+
const probe = `probe.${sanitisedDomain}`;
|
|
4856
4860
|
try {
|
|
4857
|
-
const addresses = await dns.resolve4(
|
|
4861
|
+
const addresses = await dns.resolve4(probe);
|
|
4858
4862
|
const pointsToLocalhost = addresses.some((a) => a === "127.0.0.1");
|
|
4859
4863
|
checks.push({
|
|
4860
4864
|
id: "dns_resolution",
|
|
4861
4865
|
ok: pointsToLocalhost,
|
|
4862
|
-
message: pointsToLocalhost ? `${
|
|
4866
|
+
message: pointsToLocalhost ? `${probe} \u2192 127.0.0.1 \u2713` : `${probe} r\xE9sout vers ${addresses.join(", ")} (attendu : 127.0.0.1)`
|
|
4863
4867
|
});
|
|
4864
4868
|
} catch {
|
|
4865
4869
|
checks.push({
|
|
4866
4870
|
id: "dns_resolution",
|
|
4867
4871
|
ok: false,
|
|
4868
|
-
message: `${
|
|
4872
|
+
message: `${probe} ne r\xE9sout pas \u2014 v\xE9rifiez le DNS wildcard`
|
|
4869
4873
|
});
|
|
4870
4874
|
}
|
|
4871
4875
|
}
|
|
@@ -7959,7 +7963,7 @@ function tailTranscript(opts) {
|
|
|
7959
7963
|
|
|
7960
7964
|
// ../server/src/services/ai-runners/claude-pty-runner.ts
|
|
7961
7965
|
async function getAgentManager() {
|
|
7962
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
7966
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-UUSQK6S2.js");
|
|
7963
7967
|
return agentManager2;
|
|
7964
7968
|
}
|
|
7965
7969
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -8700,7 +8704,7 @@ async function shutdownCodexAppServer() {
|
|
|
8700
8704
|
}
|
|
8701
8705
|
}
|
|
8702
8706
|
async function getAgentManager2() {
|
|
8703
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
8707
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-UUSQK6S2.js");
|
|
8704
8708
|
return agentManager2;
|
|
8705
8709
|
}
|
|
8706
8710
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -12697,7 +12701,8 @@ var debugRouter = router({
|
|
|
12697
12701
|
});
|
|
12698
12702
|
|
|
12699
12703
|
// ../server/src/trpc/routers/diagnostics.ts
|
|
12700
|
-
import { z as
|
|
12704
|
+
import { z as z20 } from "zod";
|
|
12705
|
+
import { TRPCError as TRPCError18 } from "@trpc/server";
|
|
12701
12706
|
|
|
12702
12707
|
// ../server/src/services/log-buffer.ts
|
|
12703
12708
|
import { EventEmitter as EventEmitter4 } from "events";
|
|
@@ -12765,132 +12770,10 @@ function onEntry(listener) {
|
|
|
12765
12770
|
return () => emitter.off("entry", listener);
|
|
12766
12771
|
}
|
|
12767
12772
|
|
|
12768
|
-
// ../server/src/services/instance-registry.ts
|
|
12769
|
-
import { mkdir as mkdir16, readdir as readdir5, readFile as readFile15, writeFile as writeFile14, rm as rm3 } from "fs/promises";
|
|
12770
|
-
import { join as join19 } from "path";
|
|
12771
|
-
import { z as z20 } from "zod";
|
|
12772
|
-
var InstanceFileSchema = z20.object({
|
|
12773
|
-
pid: z20.number().int().positive(),
|
|
12774
|
-
port: z20.number().int().min(1).max(65535),
|
|
12775
|
-
agentPort: z20.number().int().min(1).max(65535),
|
|
12776
|
-
cwd: z20.string().max(4096),
|
|
12777
|
-
dataDir: z20.string().max(4096),
|
|
12778
|
-
version: z20.string().max(64),
|
|
12779
|
-
fromDesktop: z20.boolean(),
|
|
12780
|
-
startedAt: z20.number().int().nonnegative()
|
|
12781
|
-
});
|
|
12782
|
-
function registryDir() {
|
|
12783
|
-
return join19(machineRoot(), "instances");
|
|
12784
|
-
}
|
|
12785
|
-
function fileFor(pid) {
|
|
12786
|
-
return join19(registryDir(), `${pid}.json`);
|
|
12787
|
-
}
|
|
12788
|
-
function selfRecord() {
|
|
12789
|
-
return {
|
|
12790
|
-
pid: process.pid,
|
|
12791
|
-
port: env.PORT,
|
|
12792
|
-
agentPort: env.RUNEYA_AGENT_PORT,
|
|
12793
|
-
cwd: process.cwd(),
|
|
12794
|
-
dataDir: env.DATA_DIR,
|
|
12795
|
-
version: process.env["RUNEYA_VERSION"] ?? "unknown",
|
|
12796
|
-
fromDesktop: env.FROM_DESKTOP,
|
|
12797
|
-
startedAt: Date.now()
|
|
12798
|
-
};
|
|
12799
|
-
}
|
|
12800
|
-
async function registerInstance() {
|
|
12801
|
-
try {
|
|
12802
|
-
await mkdir16(registryDir(), { recursive: true });
|
|
12803
|
-
await writeFile14(fileFor(process.pid), JSON.stringify(selfRecord(), null, 2));
|
|
12804
|
-
} catch (err) {
|
|
12805
|
-
console.log("[instances] Could not register this instance:", err.message);
|
|
12806
|
-
}
|
|
12807
|
-
}
|
|
12808
|
-
async function unregisterInstance() {
|
|
12809
|
-
await rm3(fileFor(process.pid), { force: true }).catch(() => {
|
|
12810
|
-
});
|
|
12811
|
-
}
|
|
12812
|
-
function isProcessAlive(pid) {
|
|
12813
|
-
try {
|
|
12814
|
-
process.kill(pid, 0);
|
|
12815
|
-
return true;
|
|
12816
|
-
} catch (err) {
|
|
12817
|
-
return err.code === "EPERM";
|
|
12818
|
-
}
|
|
12819
|
-
}
|
|
12820
|
-
async function probe(port) {
|
|
12821
|
-
try {
|
|
12822
|
-
const res = await fetch(`http://127.0.0.1:${port}/api/trpc/health.check`, {
|
|
12823
|
-
signal: AbortSignal.timeout(1500)
|
|
12824
|
-
});
|
|
12825
|
-
if (!res.ok) return { ok: false, uptimeMs: null, version: null };
|
|
12826
|
-
const body = await res.json();
|
|
12827
|
-
const data = body.result?.data;
|
|
12828
|
-
return { ok: true, uptimeMs: data?.uptime ?? null, version: data?.version ?? null };
|
|
12829
|
-
} catch {
|
|
12830
|
-
return { ok: false, uptimeMs: null, version: null };
|
|
12831
|
-
}
|
|
12832
|
-
}
|
|
12833
|
-
async function listInstances() {
|
|
12834
|
-
let files;
|
|
12835
|
-
try {
|
|
12836
|
-
files = await readdir5(registryDir());
|
|
12837
|
-
} catch {
|
|
12838
|
-
return [];
|
|
12839
|
-
}
|
|
12840
|
-
const found = await Promise.all(
|
|
12841
|
-
files.filter((f) => f.endsWith(".json")).map(async (name) => {
|
|
12842
|
-
const path = join19(registryDir(), name);
|
|
12843
|
-
let record;
|
|
12844
|
-
try {
|
|
12845
|
-
const parsed = InstanceFileSchema.safeParse(JSON.parse(await readFile15(path, "utf8")));
|
|
12846
|
-
if (!parsed.success) {
|
|
12847
|
-
await rm3(path, { force: true }).catch(() => {
|
|
12848
|
-
});
|
|
12849
|
-
return null;
|
|
12850
|
-
}
|
|
12851
|
-
record = parsed.data;
|
|
12852
|
-
} catch {
|
|
12853
|
-
return null;
|
|
12854
|
-
}
|
|
12855
|
-
if (!isProcessAlive(record.pid)) {
|
|
12856
|
-
await rm3(path, { force: true }).catch(() => {
|
|
12857
|
-
});
|
|
12858
|
-
return null;
|
|
12859
|
-
}
|
|
12860
|
-
const { ok, uptimeMs, version } = await probe(record.port);
|
|
12861
|
-
if (!ok) {
|
|
12862
|
-
await rm3(path, { force: true }).catch(() => {
|
|
12863
|
-
});
|
|
12864
|
-
return null;
|
|
12865
|
-
}
|
|
12866
|
-
return {
|
|
12867
|
-
...record,
|
|
12868
|
-
// Trust the live answer over the file: the file was written at boot
|
|
12869
|
-
// and an upgraded instance would keep claiming its old version.
|
|
12870
|
-
version: version ?? record.version,
|
|
12871
|
-
reachable: true,
|
|
12872
|
-
current: record.pid === process.pid,
|
|
12873
|
-
uptimeMs
|
|
12874
|
-
};
|
|
12875
|
-
})
|
|
12876
|
-
);
|
|
12877
|
-
return dedupeByPort(found.filter((i) => i !== null)).sort((a, b) => Number(b.current) - Number(a.current) || a.port - b.port);
|
|
12878
|
-
}
|
|
12879
|
-
function dedupeByPort(instances) {
|
|
12880
|
-
const byPort = /* @__PURE__ */ new Map();
|
|
12881
|
-
for (const instance of instances) {
|
|
12882
|
-
const kept = byPort.get(instance.port);
|
|
12883
|
-
if (!kept || instance.current || !kept.current && instance.startedAt > kept.startedAt) {
|
|
12884
|
-
byPort.set(instance.port, instance);
|
|
12885
|
-
}
|
|
12886
|
-
}
|
|
12887
|
-
return [...byPort.values()];
|
|
12888
|
-
}
|
|
12889
|
-
|
|
12890
12773
|
// ../server/src/trpc/routers/diagnostics.ts
|
|
12891
12774
|
var diagnosticsRouter = router({
|
|
12892
12775
|
/** Backlog for a client that just opened the panel. */
|
|
12893
|
-
recentLogs: protectedProcedure.input(
|
|
12776
|
+
recentLogs: protectedProcedure.input(z20.object({ limit: z20.number().int().min(1).max(2e3).default(500) }).optional()).query(({ input }) => recentEntries(input?.limit ?? 500)),
|
|
12894
12777
|
/**
|
|
12895
12778
|
* Live log stream.
|
|
12896
12779
|
*
|
|
@@ -12899,7 +12782,7 @@ var diagnosticsRouter = router({
|
|
|
12899
12782
|
* silently loses lines, which is precisely what someone watching a boot
|
|
12900
12783
|
* failure cannot afford.
|
|
12901
12784
|
*/
|
|
12902
|
-
streamLogs: protectedProcedure.input(
|
|
12785
|
+
streamLogs: protectedProcedure.input(z20.object({ afterSeq: z20.number().int().nonnegative().default(0) }).optional()).subscription(async function* ({ input, signal }) {
|
|
12903
12786
|
for (const entry of entriesSince(input?.afterSeq ?? 0)) yield entry;
|
|
12904
12787
|
const queue = [];
|
|
12905
12788
|
let wake = null;
|
|
@@ -12924,11 +12807,33 @@ var diagnosticsRouter = router({
|
|
|
12924
12807
|
}
|
|
12925
12808
|
}),
|
|
12926
12809
|
/** Every Runeya answering on this machine, this one included. */
|
|
12927
|
-
instances: protectedProcedure.query(() => listInstances())
|
|
12810
|
+
instances: protectedProcedure.query(() => listInstances()),
|
|
12811
|
+
/**
|
|
12812
|
+
* Stop another Runeya on this machine — its agent first, then its server.
|
|
12813
|
+
*
|
|
12814
|
+
* The pid is a *selector*, not an instruction: it is looked up in the list
|
|
12815
|
+
* `listInstances()` has just vouched for, and anything absent from it is
|
|
12816
|
+
* refused. That is what keeps this from being a way to signal arbitrary
|
|
12817
|
+
* processes with the server's privileges.
|
|
12818
|
+
*/
|
|
12819
|
+
killInstance: protectedProcedure.input(z20.object({ pid: z20.number().int().positive() })).mutation(async ({ input }) => {
|
|
12820
|
+
try {
|
|
12821
|
+
return await killInstance(input.pid);
|
|
12822
|
+
} catch (err) {
|
|
12823
|
+
const reason = err.message;
|
|
12824
|
+
if (reason === "instance-not-found") {
|
|
12825
|
+
throw new TRPCError18({ code: "NOT_FOUND", message: "No live Runeya instance with this pid." });
|
|
12826
|
+
}
|
|
12827
|
+
if (reason === "instance-is-current") {
|
|
12828
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "This instance cannot stop itself." });
|
|
12829
|
+
}
|
|
12830
|
+
throw new TRPCError18({ code: "INTERNAL_SERVER_ERROR", message: reason });
|
|
12831
|
+
}
|
|
12832
|
+
})
|
|
12928
12833
|
});
|
|
12929
12834
|
|
|
12930
12835
|
// ../server/src/trpc/routers/kanban-queue.ts
|
|
12931
|
-
import { z as
|
|
12836
|
+
import { z as z21 } from "zod";
|
|
12932
12837
|
|
|
12933
12838
|
// ../server/src/services/kanban-queue.ts
|
|
12934
12839
|
import { randomUUID as randomUUID10 } from "crypto";
|
|
@@ -13116,36 +13021,36 @@ var kanbanQueue = new KanbanQueueService();
|
|
|
13116
13021
|
// ../server/src/trpc/routers/kanban-queue.ts
|
|
13117
13022
|
var kanbanQueueRouter = router({
|
|
13118
13023
|
getState: protectedProcedure.query(() => kanbanQueue.getState()),
|
|
13119
|
-
add: protectedProcedure.input(
|
|
13120
|
-
boardId:
|
|
13121
|
-
cardId:
|
|
13122
|
-
runner:
|
|
13123
|
-
model:
|
|
13124
|
-
scenarioId:
|
|
13024
|
+
add: protectedProcedure.input(z21.object({
|
|
13025
|
+
boardId: z21.string().max(128),
|
|
13026
|
+
cardId: z21.string().max(128),
|
|
13027
|
+
runner: z21.enum(["claude-code", "codex"]).optional(),
|
|
13028
|
+
model: z21.string().max(128).optional(),
|
|
13029
|
+
scenarioId: z21.string().max(128).optional(),
|
|
13125
13030
|
// Le projet ouvert quand la carte a été mise en file : la conversation
|
|
13126
13031
|
// qui en naîtra lui appartient, plutôt que de rester orpheline et de
|
|
13127
13032
|
// s'afficher dans tous les projets.
|
|
13128
|
-
projectId:
|
|
13129
|
-
orgId:
|
|
13033
|
+
projectId: z21.string().max(128).optional(),
|
|
13034
|
+
orgId: z21.string().max(128).nullable().optional()
|
|
13130
13035
|
})).mutation(({ input }) => kanbanQueue.add(input)),
|
|
13131
|
-
addColumn: protectedProcedure.input(
|
|
13132
|
-
boardId:
|
|
13133
|
-
columnId:
|
|
13134
|
-
runner:
|
|
13135
|
-
model:
|
|
13136
|
-
scenarioId:
|
|
13137
|
-
projectId:
|
|
13138
|
-
orgId:
|
|
13036
|
+
addColumn: protectedProcedure.input(z21.object({
|
|
13037
|
+
boardId: z21.string().max(128),
|
|
13038
|
+
columnId: z21.string().max(128),
|
|
13039
|
+
runner: z21.enum(["claude-code", "codex"]).optional(),
|
|
13040
|
+
model: z21.string().max(128).optional(),
|
|
13041
|
+
scenarioId: z21.string().max(128).optional(),
|
|
13042
|
+
projectId: z21.string().max(128).optional(),
|
|
13043
|
+
orgId: z21.string().max(128).nullable().optional()
|
|
13139
13044
|
})).mutation(async ({ input }) => {
|
|
13140
13045
|
const { boardId, columnId, ...options } = input;
|
|
13141
13046
|
return kanbanQueue.addColumn(boardId, columnId, options);
|
|
13142
13047
|
}),
|
|
13143
|
-
remove: protectedProcedure.input(
|
|
13048
|
+
remove: protectedProcedure.input(z21.object({ itemId: z21.string().max(128) })).mutation(({ input }) => ({ removed: kanbanQueue.remove(input.itemId) })),
|
|
13144
13049
|
stopAll: protectedProcedure.mutation(() => {
|
|
13145
13050
|
kanbanQueue.stopAll();
|
|
13146
13051
|
return { ok: true };
|
|
13147
13052
|
}),
|
|
13148
|
-
setMaxConcurrent: protectedProcedure.input(
|
|
13053
|
+
setMaxConcurrent: protectedProcedure.input(z21.object({ max: z21.number().int().min(1).max(20) })).mutation(({ input }) => {
|
|
13149
13054
|
kanbanQueue.setMaxConcurrent(input.max);
|
|
13150
13055
|
return kanbanQueue.getState();
|
|
13151
13056
|
}),
|
|
@@ -13179,12 +13084,12 @@ var kanbanQueueRouter = router({
|
|
|
13179
13084
|
});
|
|
13180
13085
|
|
|
13181
13086
|
// ../server/src/trpc/routers/kanban.ts
|
|
13182
|
-
import { mkdir as
|
|
13087
|
+
import { mkdir as mkdir16, readdir as readdir5, rm as rm3, stat as stat5, writeFile as writeFile14 } from "fs/promises";
|
|
13183
13088
|
import { createHash } from "crypto";
|
|
13184
13089
|
import { tmpdir } from "os";
|
|
13185
|
-
import { join as
|
|
13186
|
-
import { z as
|
|
13187
|
-
import { TRPCError as
|
|
13090
|
+
import { join as join19 } from "path";
|
|
13091
|
+
import { z as z22 } from "zod";
|
|
13092
|
+
import { TRPCError as TRPCError19 } from "@trpc/server";
|
|
13188
13093
|
function summarizeCard(card, boardId, columnTitle) {
|
|
13189
13094
|
return {
|
|
13190
13095
|
boardId,
|
|
@@ -13233,37 +13138,37 @@ function safeDecode(value) {
|
|
|
13233
13138
|
}
|
|
13234
13139
|
var MAX_ATTACHMENT_BYTES = 55 * 1024 * 1024;
|
|
13235
13140
|
function attachmentCacheDir() {
|
|
13236
|
-
return
|
|
13141
|
+
return join19(tmpdir(), "runeya-kanban-attachments");
|
|
13237
13142
|
}
|
|
13238
13143
|
var ATTACHMENT_CACHE_TTL_MS = 24 * 60 * 60 * 1e3;
|
|
13239
13144
|
async function purgeStaleAttachments(dir, ttlMs = ATTACHMENT_CACHE_TTL_MS) {
|
|
13240
13145
|
try {
|
|
13241
13146
|
const cutoff = Date.now() - ttlMs;
|
|
13242
|
-
for (const name of await
|
|
13243
|
-
const path =
|
|
13147
|
+
for (const name of await readdir5(dir)) {
|
|
13148
|
+
const path = join19(dir, name);
|
|
13244
13149
|
const info = await stat5(path).catch(() => null);
|
|
13245
|
-
if (info && info.mtimeMs < cutoff) await
|
|
13150
|
+
if (info && info.mtimeMs < cutoff) await rm3(path, { force: true });
|
|
13246
13151
|
}
|
|
13247
13152
|
} catch {
|
|
13248
13153
|
}
|
|
13249
13154
|
}
|
|
13250
13155
|
function attachmentCacheDirs() {
|
|
13251
|
-
return [attachmentCacheDir(),
|
|
13156
|
+
return [attachmentCacheDir(), join19(machineRoot(), "kanban-attachments")];
|
|
13252
13157
|
}
|
|
13253
13158
|
async function storeAttachment(id, name, body, dirs = attachmentCacheDirs()) {
|
|
13254
13159
|
const refusals = [];
|
|
13255
13160
|
for (const dir of dirs) {
|
|
13256
13161
|
try {
|
|
13257
|
-
await
|
|
13258
|
-
const path =
|
|
13259
|
-
await
|
|
13162
|
+
await mkdir16(dir, { recursive: true });
|
|
13163
|
+
const path = join19(dir, safeLocalName(id, name));
|
|
13164
|
+
await writeFile14(path, body);
|
|
13260
13165
|
void purgeStaleAttachments(dir);
|
|
13261
13166
|
return path;
|
|
13262
13167
|
} catch (err) {
|
|
13263
13168
|
refusals.push(`${dir} (${err instanceof Error ? err.message : String(err)})`);
|
|
13264
13169
|
}
|
|
13265
13170
|
}
|
|
13266
|
-
throw new
|
|
13171
|
+
throw new TRPCError19({
|
|
13267
13172
|
code: "INTERNAL_SERVER_ERROR",
|
|
13268
13173
|
message: `Impossible d'\xE9crire la pi\xE8ce jointe sur cette machine. Emplacements essay\xE9s : ${refusals.join(" ; ")}. V\xE9rifiez les droits d'\xE9criture, ou l'espace disque.`
|
|
13269
13174
|
});
|
|
@@ -13279,9 +13184,9 @@ var kanbanRouter = router({
|
|
|
13279
13184
|
* card graph, so listing them in full would be megabytes to answer "which
|
|
13280
13185
|
* boards exist?". Use `getBoard` for the cards of one.
|
|
13281
13186
|
*/
|
|
13282
|
-
listBoards: protectedProcedure.input(
|
|
13283
|
-
includeArchived:
|
|
13284
|
-
organizationId:
|
|
13187
|
+
listBoards: protectedProcedure.input(z22.object({
|
|
13188
|
+
includeArchived: z22.boolean().optional(),
|
|
13189
|
+
organizationId: z22.string().max(128).optional()
|
|
13285
13190
|
}).optional()).query(async ({ input }) => {
|
|
13286
13191
|
const { organizationId, boards } = await kanbanStore.list(
|
|
13287
13192
|
input?.includeArchived ?? false,
|
|
@@ -13307,7 +13212,7 @@ var kanbanRouter = router({
|
|
|
13307
13212
|
};
|
|
13308
13213
|
}),
|
|
13309
13214
|
/** One board: its columns, and the cards in each. */
|
|
13310
|
-
getBoard: protectedProcedure.input(
|
|
13215
|
+
getBoard: protectedProcedure.input(z22.object({ boardId: z22.string().max(128) })).query(async ({ input }) => {
|
|
13311
13216
|
const board = await kanbanStore.get(input.boardId);
|
|
13312
13217
|
if (!board) return { board: null };
|
|
13313
13218
|
const { links } = await kanbanStore.cardLinks(input.boardId);
|
|
@@ -13346,11 +13251,11 @@ var kanbanRouter = router({
|
|
|
13346
13251
|
* organization — or one board when `boardId` is given. Archived boards are
|
|
13347
13252
|
* left out: they are what the team decided to stop looking at.
|
|
13348
13253
|
*/
|
|
13349
|
-
searchCards: protectedProcedure.input(
|
|
13350
|
-
query:
|
|
13351
|
-
boardId:
|
|
13352
|
-
limit:
|
|
13353
|
-
organizationId:
|
|
13254
|
+
searchCards: protectedProcedure.input(z22.object({
|
|
13255
|
+
query: z22.string().min(1).max(256),
|
|
13256
|
+
boardId: z22.string().max(128).optional(),
|
|
13257
|
+
limit: z22.number().int().min(1).max(100).optional(),
|
|
13258
|
+
organizationId: z22.string().max(128).optional()
|
|
13354
13259
|
})).query(async ({ input }) => {
|
|
13355
13260
|
const needle = normalize(input.query);
|
|
13356
13261
|
const ids = input.boardId ? [input.boardId] : (await kanbanStore.list(false, input.organizationId)).boards.map((b) => b.id);
|
|
@@ -13369,10 +13274,10 @@ var kanbanRouter = router({
|
|
|
13369
13274
|
* qu'un `commentCount`, et rien n'en donnait le texte. Cette route est la
|
|
13370
13275
|
* relecture, pour une seule carte : c'est le journal qui pèse, pas le reste.
|
|
13371
13276
|
*/
|
|
13372
|
-
getCardComments: protectedProcedure.input(
|
|
13373
|
-
boardId:
|
|
13374
|
-
cardId:
|
|
13375
|
-
limit:
|
|
13277
|
+
getCardComments: protectedProcedure.input(z22.object({
|
|
13278
|
+
boardId: z22.string().max(128),
|
|
13279
|
+
cardId: z22.string().max(128),
|
|
13280
|
+
limit: z22.number().int().min(1).max(200).optional()
|
|
13376
13281
|
})).query(async ({ input }) => {
|
|
13377
13282
|
const history = await kanbanStore.cardHistory(input.boardId, input.cardId);
|
|
13378
13283
|
const comments = history.filter((e) => e.type === "comment");
|
|
@@ -13401,18 +13306,18 @@ var kanbanRouter = router({
|
|
|
13401
13306
|
* `getBoard` en donne déjà l'essentiel carte par carte ; cette route sert
|
|
13402
13307
|
* quand c'est l'arbre lui-même qu'on veut, dates et auteurs compris.
|
|
13403
13308
|
*/
|
|
13404
|
-
getCardLinks: protectedProcedure.input(
|
|
13309
|
+
getCardLinks: protectedProcedure.input(z22.object({ boardId: z22.string().max(128) })).query(async ({ input }) => kanbanStore.cardLinks(input.boardId)),
|
|
13405
13310
|
/**
|
|
13406
13311
|
* Rattacher une carte à une carte parente, ou l'en détacher.
|
|
13407
13312
|
*
|
|
13408
13313
|
* Sans `parentCardId`, le lien est retiré. Le parent peut vivre sur un autre
|
|
13409
13314
|
* tableau : `parentBoardId` le désigne alors, sinon c'est celui de la carte.
|
|
13410
13315
|
*/
|
|
13411
|
-
setCardParent: protectedProcedure.input(
|
|
13412
|
-
boardId:
|
|
13413
|
-
cardId:
|
|
13414
|
-
parentCardId:
|
|
13415
|
-
parentBoardId:
|
|
13316
|
+
setCardParent: protectedProcedure.input(z22.object({
|
|
13317
|
+
boardId: z22.string().max(128),
|
|
13318
|
+
cardId: z22.string().max(128),
|
|
13319
|
+
parentCardId: z22.string().max(128).optional(),
|
|
13320
|
+
parentBoardId: z22.string().max(128).optional()
|
|
13416
13321
|
})).mutation(async ({ input }) => {
|
|
13417
13322
|
const ok = await kanbanStore.setCardParent(
|
|
13418
13323
|
input.boardId,
|
|
@@ -13420,35 +13325,35 @@ var kanbanRouter = router({
|
|
|
13420
13325
|
input.parentCardId ? { boardId: input.parentBoardId ?? input.boardId, cardId: input.parentCardId } : null
|
|
13421
13326
|
);
|
|
13422
13327
|
if (!ok) {
|
|
13423
|
-
throw new
|
|
13328
|
+
throw new TRPCError19({ code: "BAD_REQUEST", message: "The cloud refused the link (unknown card, or a cycle)." });
|
|
13424
13329
|
}
|
|
13425
13330
|
return { ok: true };
|
|
13426
13331
|
}),
|
|
13427
|
-
moveCard: protectedProcedure.input(
|
|
13428
|
-
boardId:
|
|
13429
|
-
cardId:
|
|
13430
|
-
targetColumn:
|
|
13332
|
+
moveCard: protectedProcedure.input(z22.object({
|
|
13333
|
+
boardId: z22.string().max(128),
|
|
13334
|
+
cardId: z22.string().max(128),
|
|
13335
|
+
targetColumn: z22.string().max(256)
|
|
13431
13336
|
})).mutation(async ({ input }) => {
|
|
13432
13337
|
await executeKanbanCommands(input.boardId, input.cardId, [
|
|
13433
13338
|
{ type: "move_card", columnTitle: input.targetColumn }
|
|
13434
13339
|
]);
|
|
13435
13340
|
return { ok: true };
|
|
13436
13341
|
}),
|
|
13437
|
-
addComment: protectedProcedure.input(
|
|
13438
|
-
boardId:
|
|
13439
|
-
cardId:
|
|
13440
|
-
comment:
|
|
13342
|
+
addComment: protectedProcedure.input(z22.object({
|
|
13343
|
+
boardId: z22.string().max(128),
|
|
13344
|
+
cardId: z22.string().max(128),
|
|
13345
|
+
comment: z22.string().max(2e4)
|
|
13441
13346
|
})).mutation(async ({ input }) => {
|
|
13442
13347
|
await executeKanbanCommands(input.boardId, input.cardId, [
|
|
13443
13348
|
{ type: "add_comment", comment: input.comment }
|
|
13444
13349
|
]);
|
|
13445
13350
|
return { ok: true };
|
|
13446
13351
|
}),
|
|
13447
|
-
addCard: protectedProcedure.input(
|
|
13448
|
-
boardId:
|
|
13449
|
-
column:
|
|
13450
|
-
title:
|
|
13451
|
-
content:
|
|
13352
|
+
addCard: protectedProcedure.input(z22.object({
|
|
13353
|
+
boardId: z22.string().max(128),
|
|
13354
|
+
column: z22.string().max(256),
|
|
13355
|
+
title: z22.string().max(512),
|
|
13356
|
+
content: z22.string().max(2e4).optional()
|
|
13452
13357
|
})).mutation(async ({ input }) => {
|
|
13453
13358
|
await executeKanbanBoardCommands(input.boardId, [
|
|
13454
13359
|
{ type: "add_card", columnTitle: input.column, cardTitle: input.title, cardContent: input.content }
|
|
@@ -13460,28 +13365,28 @@ var kanbanRouter = router({
|
|
|
13460
13365
|
* agent can open it with its own file tools. The bytes never go through the
|
|
13461
13366
|
* prompt: the card context lists the attachments, this returns a path.
|
|
13462
13367
|
*/
|
|
13463
|
-
downloadAttachment: protectedProcedure.input(
|
|
13368
|
+
downloadAttachment: protectedProcedure.input(z22.object({ attachmentId: z22.string().max(128) })).mutation(async ({ input }) => {
|
|
13464
13369
|
const id = input.attachmentId;
|
|
13465
13370
|
if (!ATTACHMENT_ID_REGEX.test(id)) {
|
|
13466
|
-
throw new
|
|
13371
|
+
throw new TRPCError19({ code: "BAD_REQUEST", message: "Invalid attachment id" });
|
|
13467
13372
|
}
|
|
13468
13373
|
const res = await cloudFetch2(`/api/kanban/file/${id}`, { timeoutMs: 12e4 });
|
|
13469
13374
|
if (res.status === 404) {
|
|
13470
|
-
throw new
|
|
13375
|
+
throw new TRPCError19({ code: "NOT_FOUND", message: `Attachment ${id} not found` });
|
|
13471
13376
|
}
|
|
13472
13377
|
if (!res.ok) {
|
|
13473
|
-
throw new
|
|
13378
|
+
throw new TRPCError19({
|
|
13474
13379
|
code: res.status === 403 ? "FORBIDDEN" : "INTERNAL_SERVER_ERROR",
|
|
13475
13380
|
message: `Cloud refused the attachment (HTTP ${res.status})`
|
|
13476
13381
|
});
|
|
13477
13382
|
}
|
|
13478
13383
|
const declared = Number(res.headers.get("content-length") ?? 0);
|
|
13479
13384
|
if (declared > MAX_ATTACHMENT_BYTES) {
|
|
13480
|
-
throw new
|
|
13385
|
+
throw new TRPCError19({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
|
|
13481
13386
|
}
|
|
13482
13387
|
const body = Buffer.from(await res.arrayBuffer());
|
|
13483
13388
|
if (body.length > MAX_ATTACHMENT_BYTES) {
|
|
13484
|
-
throw new
|
|
13389
|
+
throw new TRPCError19({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
|
|
13485
13390
|
}
|
|
13486
13391
|
const contentType = res.headers.get("content-type") ?? "application/octet-stream";
|
|
13487
13392
|
const disposition = res.headers.get("content-disposition") ?? "";
|
|
@@ -13493,20 +13398,21 @@ var kanbanRouter = router({
|
|
|
13493
13398
|
});
|
|
13494
13399
|
|
|
13495
13400
|
// ../server/src/trpc/routers/terminal.ts
|
|
13496
|
-
import { z as
|
|
13497
|
-
import { TRPCError as
|
|
13401
|
+
import { z as z23 } from "zod";
|
|
13402
|
+
import { TRPCError as TRPCError20 } from "@trpc/server";
|
|
13498
13403
|
var terminalRouter = router({
|
|
13499
13404
|
/** Create a PTY shell session on the target agent */
|
|
13500
|
-
create: protectedProcedure.input(
|
|
13501
|
-
agentId:
|
|
13502
|
-
cwd:
|
|
13405
|
+
create: protectedProcedure.input(z23.object({
|
|
13406
|
+
agentId: z23.string().max(128),
|
|
13407
|
+
cwd: z23.string().max(512).optional(),
|
|
13503
13408
|
/** Anchors the terminal when no explicit cwd is given. */
|
|
13504
|
-
serviceId:
|
|
13505
|
-
projectId:
|
|
13409
|
+
serviceId: z23.string().max(128).optional(),
|
|
13410
|
+
projectId: z23.string().max(128).optional(),
|
|
13506
13411
|
/** L'organisation du projet : un id seul peut en nommer un par organisation. */
|
|
13507
|
-
orgId:
|
|
13508
|
-
cols:
|
|
13509
|
-
rows:
|
|
13412
|
+
orgId: z23.string().max(128).nullable().optional(),
|
|
13413
|
+
cols: z23.number().int().min(1).max(512).optional(),
|
|
13414
|
+
rows: z23.number().int().min(1).max(256).optional(),
|
|
13415
|
+
title: z23.string().max(128).optional()
|
|
13510
13416
|
})).mutation(async ({ input }) => {
|
|
13511
13417
|
const result = await agentManager.agentMutation(
|
|
13512
13418
|
input.agentId,
|
|
@@ -13520,16 +13426,37 @@ var terminalRouter = router({
|
|
|
13520
13426
|
orgId: input.orgId
|
|
13521
13427
|
}),
|
|
13522
13428
|
cols: input.cols,
|
|
13523
|
-
rows: input.rows
|
|
13429
|
+
rows: input.rows,
|
|
13430
|
+
title: input.title
|
|
13524
13431
|
}
|
|
13525
13432
|
);
|
|
13526
13433
|
return result;
|
|
13527
13434
|
}),
|
|
13435
|
+
/** Les sessions PTY encore vivantes sur l'agent (onglets à retrouver) */
|
|
13436
|
+
list: protectedProcedure.input(z23.object({ agentId: z23.string().max(128) })).query(async ({ input }) => {
|
|
13437
|
+
return agentManager.agentQuery(
|
|
13438
|
+
input.agentId,
|
|
13439
|
+
"terminal.list"
|
|
13440
|
+
);
|
|
13441
|
+
}),
|
|
13442
|
+
/** Renommer un onglet */
|
|
13443
|
+
rename: protectedProcedure.input(z23.object({
|
|
13444
|
+
agentId: z23.string().max(128),
|
|
13445
|
+
sessionId: z23.string().max(128),
|
|
13446
|
+
title: z23.string().max(128)
|
|
13447
|
+
})).mutation(async ({ input }) => {
|
|
13448
|
+
await agentManager.agentMutation(
|
|
13449
|
+
input.agentId,
|
|
13450
|
+
"terminal.rename",
|
|
13451
|
+
{ sessionId: input.sessionId, title: input.title }
|
|
13452
|
+
);
|
|
13453
|
+
return { ok: true };
|
|
13454
|
+
}),
|
|
13528
13455
|
/** Send keystrokes / data to a PTY session */
|
|
13529
|
-
write: protectedProcedure.input(
|
|
13530
|
-
agentId:
|
|
13531
|
-
sessionId:
|
|
13532
|
-
data:
|
|
13456
|
+
write: protectedProcedure.input(z23.object({
|
|
13457
|
+
agentId: z23.string().max(128),
|
|
13458
|
+
sessionId: z23.string().max(128),
|
|
13459
|
+
data: z23.string().max(65536)
|
|
13533
13460
|
})).mutation(async ({ input }) => {
|
|
13534
13461
|
await agentManager.agentMutation(
|
|
13535
13462
|
input.agentId,
|
|
@@ -13539,11 +13466,11 @@ var terminalRouter = router({
|
|
|
13539
13466
|
return { ok: true };
|
|
13540
13467
|
}),
|
|
13541
13468
|
/** Resize the PTY */
|
|
13542
|
-
resize: protectedProcedure.input(
|
|
13543
|
-
agentId:
|
|
13544
|
-
sessionId:
|
|
13545
|
-
cols:
|
|
13546
|
-
rows:
|
|
13469
|
+
resize: protectedProcedure.input(z23.object({
|
|
13470
|
+
agentId: z23.string().max(128),
|
|
13471
|
+
sessionId: z23.string().max(128),
|
|
13472
|
+
cols: z23.number().int().min(1).max(512),
|
|
13473
|
+
rows: z23.number().int().min(1).max(256)
|
|
13547
13474
|
})).mutation(async ({ input }) => {
|
|
13548
13475
|
await agentManager.agentMutation(
|
|
13549
13476
|
input.agentId,
|
|
@@ -13553,9 +13480,9 @@ var terminalRouter = router({
|
|
|
13553
13480
|
return { ok: true };
|
|
13554
13481
|
}),
|
|
13555
13482
|
/** Destroy a PTY session */
|
|
13556
|
-
destroy: protectedProcedure.input(
|
|
13557
|
-
agentId:
|
|
13558
|
-
sessionId:
|
|
13483
|
+
destroy: protectedProcedure.input(z23.object({
|
|
13484
|
+
agentId: z23.string().max(128),
|
|
13485
|
+
sessionId: z23.string().max(128)
|
|
13559
13486
|
})).mutation(async ({ input }) => {
|
|
13560
13487
|
await agentManager.agentMutation(
|
|
13561
13488
|
input.agentId,
|
|
@@ -13565,9 +13492,11 @@ var terminalRouter = router({
|
|
|
13565
13492
|
return { ok: true };
|
|
13566
13493
|
}),
|
|
13567
13494
|
/** Stream PTY output — proxied via AgentWSBridge dynamic subscription */
|
|
13568
|
-
onData: protectedProcedure.input(
|
|
13569
|
-
agentId:
|
|
13570
|
-
sessionId:
|
|
13495
|
+
onData: protectedProcedure.input(z23.object({
|
|
13496
|
+
agentId: z23.string().max(128),
|
|
13497
|
+
sessionId: z23.string().max(128),
|
|
13498
|
+
/** Rejouer l'historique de la session avant le flux temps réel. */
|
|
13499
|
+
replay: z23.boolean().optional()
|
|
13571
13500
|
})).subscription(async function* ({ input }) {
|
|
13572
13501
|
const queue = [];
|
|
13573
13502
|
let resolve7 = null;
|
|
@@ -13577,7 +13506,7 @@ var terminalRouter = router({
|
|
|
13577
13506
|
unsubscribe = agentManager.agentSubscribe(
|
|
13578
13507
|
input.agentId,
|
|
13579
13508
|
"terminal.onData",
|
|
13580
|
-
{ sessionId: input.sessionId },
|
|
13509
|
+
{ sessionId: input.sessionId, replay: input.replay },
|
|
13581
13510
|
(data) => {
|
|
13582
13511
|
if (typeof data === "string") queue.push(data);
|
|
13583
13512
|
if (resolve7) {
|
|
@@ -13594,7 +13523,7 @@ var terminalRouter = router({
|
|
|
13594
13523
|
}
|
|
13595
13524
|
);
|
|
13596
13525
|
} catch (err) {
|
|
13597
|
-
throw new
|
|
13526
|
+
throw new TRPCError20({
|
|
13598
13527
|
code: "BAD_REQUEST",
|
|
13599
13528
|
message: `Cannot subscribe to terminal: ${err.message}`
|
|
13600
13529
|
});
|
|
@@ -13616,11 +13545,11 @@ var terminalRouter = router({
|
|
|
13616
13545
|
});
|
|
13617
13546
|
|
|
13618
13547
|
// ../server/src/trpc/routers/utility.ts
|
|
13619
|
-
import { z as
|
|
13548
|
+
import { z as z24 } from "zod";
|
|
13620
13549
|
var MAX_WAIT_MS = 5 * 60 * 1e3;
|
|
13621
13550
|
var utilityRouter = router({
|
|
13622
|
-
wait: protectedProcedure.input(
|
|
13623
|
-
ms:
|
|
13551
|
+
wait: protectedProcedure.input(z24.object({
|
|
13552
|
+
ms: z24.number().int().min(0).max(MAX_WAIT_MS)
|
|
13624
13553
|
})).mutation(async ({ input }) => {
|
|
13625
13554
|
await new Promise((resolve7) => setTimeout(resolve7, input.ms));
|
|
13626
13555
|
return { waited: input.ms };
|
|
@@ -13628,15 +13557,15 @@ var utilityRouter = router({
|
|
|
13628
13557
|
});
|
|
13629
13558
|
|
|
13630
13559
|
// ../server/src/trpc/routers/wiki.ts
|
|
13631
|
-
import { z as
|
|
13632
|
-
import { TRPCError as
|
|
13633
|
-
import { readFile as
|
|
13634
|
-
import { resolve as resolvePath, join as
|
|
13635
|
-
var SCOPE_SCHEMA =
|
|
13636
|
-
|
|
13637
|
-
|
|
13560
|
+
import { z as z25 } from "zod";
|
|
13561
|
+
import { TRPCError as TRPCError21 } from "@trpc/server";
|
|
13562
|
+
import { readFile as readFile15, readdir as readdir6, stat as stat6, realpath, writeFile as writeFile15, mkdir as mkdir17, rename as rename12, rm as rm4 } from "fs/promises";
|
|
13563
|
+
import { resolve as resolvePath, join as join20, relative, sep as sep3, dirname as dirname9 } from "path";
|
|
13564
|
+
var SCOPE_SCHEMA = z25.union([
|
|
13565
|
+
z25.literal("global"),
|
|
13566
|
+
z25.string().regex(/^service:[A-Za-z0-9_-]{1,128}$/, "Invalid service scope")
|
|
13638
13567
|
]);
|
|
13639
|
-
var REL_PATH_SCHEMA =
|
|
13568
|
+
var REL_PATH_SCHEMA = z25.string().min(1).max(512).regex(/^[A-Za-z0-9_./-]+$/).refine((p) => !p.includes("..") && !p.startsWith("/"), {
|
|
13640
13569
|
message: "Path must be a relative path without traversal"
|
|
13641
13570
|
});
|
|
13642
13571
|
var MAX_FILES = 500;
|
|
@@ -13656,36 +13585,36 @@ var IGNORED_DIRS = /* @__PURE__ */ new Set([
|
|
|
13656
13585
|
"target",
|
|
13657
13586
|
"out"
|
|
13658
13587
|
]);
|
|
13659
|
-
var DocsEntrySchema =
|
|
13660
|
-
|
|
13661
|
-
|
|
13588
|
+
var DocsEntrySchema = z25.lazy(() => z25.union([
|
|
13589
|
+
z25.object({ type: z25.literal("file"), name: z25.string(), path: z25.string() }),
|
|
13590
|
+
z25.object({ type: z25.literal("dir"), name: z25.string(), path: z25.string(), children: z25.array(DocsEntrySchema) })
|
|
13662
13591
|
]));
|
|
13663
13592
|
async function resolveScope(scope) {
|
|
13664
13593
|
if (scope === "global") {
|
|
13665
13594
|
const settings = await settingsManager.getSettings();
|
|
13666
13595
|
const sub = (settings.globalDocsPath?.trim() || "wiki").replace(/^[\\/]+|[\\/]+$/g, "");
|
|
13667
13596
|
if (sub.includes("..") || sub.includes("\0")) {
|
|
13668
|
-
throw new
|
|
13597
|
+
throw new TRPCError21({ code: "BAD_REQUEST", message: "Sous-chemin invalide" });
|
|
13669
13598
|
}
|
|
13670
13599
|
const dataDirAbs = resolvePath(env.DATA_DIR);
|
|
13671
|
-
await
|
|
13600
|
+
await mkdir17(dataDirAbs, { recursive: true });
|
|
13672
13601
|
const base = dirname9(await realpath(dataDirAbs));
|
|
13673
13602
|
const target = resolvePath(base, sub);
|
|
13674
13603
|
if (target !== base && !(target + sep3).startsWith(base + sep3)) {
|
|
13675
|
-
throw new
|
|
13604
|
+
throw new TRPCError21({ code: "FORBIDDEN", message: "Hors du dossier de donn\xE9es du serveur" });
|
|
13676
13605
|
}
|
|
13677
|
-
await
|
|
13606
|
+
await mkdir17(target, { recursive: true });
|
|
13678
13607
|
const root = await realpath(target);
|
|
13679
13608
|
if (root !== base && !(root + sep3).startsWith(base + sep3)) {
|
|
13680
|
-
throw new
|
|
13609
|
+
throw new TRPCError21({ code: "FORBIDDEN", message: "Le dossier wiki r\xE9sout hors du dossier de donn\xE9es" });
|
|
13681
13610
|
}
|
|
13682
13611
|
return { mode: "local", root };
|
|
13683
13612
|
}
|
|
13684
13613
|
const serviceId = scope.slice("service:".length);
|
|
13685
13614
|
const service = await serviceStore.get(serviceId);
|
|
13686
|
-
if (!service) throw new
|
|
13615
|
+
if (!service) throw new TRPCError21({ code: "NOT_FOUND", message: "Service introuvable" });
|
|
13687
13616
|
const agentId = await resolveEffectiveAgentId(service);
|
|
13688
|
-
if (!agentId) throw new
|
|
13617
|
+
if (!agentId) throw new TRPCError21({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9 pour ce service" });
|
|
13689
13618
|
const cwd = await resolveWorkspaceCwd({ serviceId, override: service.docsPath?.trim() || void 0 });
|
|
13690
13619
|
return { mode: "agent", agentId, cwd };
|
|
13691
13620
|
}
|
|
@@ -13693,7 +13622,7 @@ async function walkLocal(root, dir, depth, counter) {
|
|
|
13693
13622
|
if (depth > MAX_DEPTH || counter.n >= MAX_FILES) return [];
|
|
13694
13623
|
let entries2;
|
|
13695
13624
|
try {
|
|
13696
|
-
entries2 = await
|
|
13625
|
+
entries2 = await readdir6(dir, { withFileTypes: true });
|
|
13697
13626
|
} catch {
|
|
13698
13627
|
return [];
|
|
13699
13628
|
}
|
|
@@ -13701,7 +13630,7 @@ async function walkLocal(root, dir, depth, counter) {
|
|
|
13701
13630
|
for (const e of entries2) {
|
|
13702
13631
|
if (counter.n >= MAX_FILES) break;
|
|
13703
13632
|
if (e.name.startsWith(".") && e.name !== ".") continue;
|
|
13704
|
-
const abs =
|
|
13633
|
+
const abs = join20(dir, e.name);
|
|
13705
13634
|
const rel = relative(root, abs).split(sep3).join("/");
|
|
13706
13635
|
if (e.isDirectory()) {
|
|
13707
13636
|
if (IGNORED_DIRS.has(e.name)) continue;
|
|
@@ -13720,7 +13649,7 @@ async function walkLocal(root, dir, depth, counter) {
|
|
|
13720
13649
|
}
|
|
13721
13650
|
async function resolveSafeLocal(root, relPath, requireExist) {
|
|
13722
13651
|
if (relPath.includes("..") || relPath.startsWith("/")) {
|
|
13723
|
-
throw new
|
|
13652
|
+
throw new TRPCError21({ code: "BAD_REQUEST", message: "Chemin invalide" });
|
|
13724
13653
|
}
|
|
13725
13654
|
const target = resolvePath(root, relPath);
|
|
13726
13655
|
if (requireExist) {
|
|
@@ -13728,10 +13657,10 @@ async function resolveSafeLocal(root, relPath, requireExist) {
|
|
|
13728
13657
|
try {
|
|
13729
13658
|
real = await realpath(target);
|
|
13730
13659
|
} catch {
|
|
13731
|
-
throw new
|
|
13660
|
+
throw new TRPCError21({ code: "NOT_FOUND", message: "Chemin introuvable" });
|
|
13732
13661
|
}
|
|
13733
13662
|
if (real !== root && !(real + sep3).startsWith(root + sep3)) {
|
|
13734
|
-
throw new
|
|
13663
|
+
throw new TRPCError21({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
|
|
13735
13664
|
}
|
|
13736
13665
|
return real;
|
|
13737
13666
|
}
|
|
@@ -13743,12 +13672,12 @@ async function resolveSafeLocal(root, relPath, requireExist) {
|
|
|
13743
13672
|
realParent = parent;
|
|
13744
13673
|
}
|
|
13745
13674
|
if (realParent !== root && !(realParent + sep3).startsWith(root + sep3)) {
|
|
13746
|
-
throw new
|
|
13675
|
+
throw new TRPCError21({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
|
|
13747
13676
|
}
|
|
13748
13677
|
return resolvePath(realParent, target.slice(parent.length).replace(/^[\\/]+/, ""));
|
|
13749
13678
|
}
|
|
13750
13679
|
var wikiRouter = router({
|
|
13751
|
-
list: protectedProcedure.input(
|
|
13680
|
+
list: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA })).output(z25.object({ root: z25.string(), entries: z25.array(DocsEntrySchema), truncated: z25.boolean() })).query(async ({ input }) => {
|
|
13752
13681
|
const target = await resolveScope(input.scope);
|
|
13753
13682
|
if (target.mode === "agent") {
|
|
13754
13683
|
return agentManager.agentQuery(target.agentId, "wiki.listRepoMarkdown", { cwd: target.cwd });
|
|
@@ -13757,9 +13686,9 @@ var wikiRouter = router({
|
|
|
13757
13686
|
const entries2 = await walkLocal(target.root, target.root, 0, counter);
|
|
13758
13687
|
return { root: target.root, entries: entries2, truncated: counter.n >= MAX_FILES };
|
|
13759
13688
|
}),
|
|
13760
|
-
read: protectedProcedure.input(
|
|
13689
|
+
read: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).output(z25.object({ path: z25.string(), content: z25.string() })).query(async ({ input }) => {
|
|
13761
13690
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
13762
|
-
throw new
|
|
13691
|
+
throw new TRPCError21({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
13763
13692
|
}
|
|
13764
13693
|
const target = await resolveScope(input.scope);
|
|
13765
13694
|
if (target.mode === "agent") {
|
|
@@ -13767,27 +13696,27 @@ var wikiRouter = router({
|
|
|
13767
13696
|
}
|
|
13768
13697
|
const file = await resolveSafeLocal(target.root, input.path, true);
|
|
13769
13698
|
const s = await stat6(file);
|
|
13770
|
-
if (!s.isFile()) throw new
|
|
13771
|
-
if (s.size > MAX_FILE_BYTES) throw new
|
|
13772
|
-
const content = await
|
|
13699
|
+
if (!s.isFile()) throw new TRPCError21({ code: "BAD_REQUEST", message: "Pas un fichier" });
|
|
13700
|
+
if (s.size > MAX_FILE_BYTES) throw new TRPCError21({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
|
|
13701
|
+
const content = await readFile15(file, "utf-8");
|
|
13773
13702
|
return { path: input.path, content };
|
|
13774
13703
|
}),
|
|
13775
|
-
write: protectedProcedure.input(
|
|
13704
|
+
write: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA, content: z25.string().max(5e6) })).mutation(async ({ input }) => {
|
|
13776
13705
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
13777
|
-
throw new
|
|
13706
|
+
throw new TRPCError21({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
13778
13707
|
}
|
|
13779
13708
|
const target = await resolveScope(input.scope);
|
|
13780
13709
|
if (target.mode === "agent") {
|
|
13781
13710
|
return agentManager.agentMutation(target.agentId, "wiki.writeMarkdown", { cwd: target.cwd, path: input.path, content: input.content });
|
|
13782
13711
|
}
|
|
13783
13712
|
const file = await resolveSafeLocal(target.root, input.path, false);
|
|
13784
|
-
await
|
|
13785
|
-
await
|
|
13713
|
+
await mkdir17(dirname9(file), { recursive: true });
|
|
13714
|
+
await writeFile15(file, input.content, "utf-8");
|
|
13786
13715
|
return { path: input.path, ok: true };
|
|
13787
13716
|
}),
|
|
13788
|
-
createFile: protectedProcedure.input(
|
|
13717
|
+
createFile: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
13789
13718
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
13790
|
-
throw new
|
|
13719
|
+
throw new TRPCError21({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
13791
13720
|
}
|
|
13792
13721
|
const target = await resolveScope(input.scope);
|
|
13793
13722
|
if (target.mode === "agent") {
|
|
@@ -13796,24 +13725,24 @@ var wikiRouter = router({
|
|
|
13796
13725
|
const file = await resolveSafeLocal(target.root, input.path, false);
|
|
13797
13726
|
try {
|
|
13798
13727
|
await stat6(file);
|
|
13799
|
-
throw new
|
|
13728
|
+
throw new TRPCError21({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
|
|
13800
13729
|
} catch (err) {
|
|
13801
|
-
if (err instanceof
|
|
13730
|
+
if (err instanceof TRPCError21) throw err;
|
|
13802
13731
|
}
|
|
13803
|
-
await
|
|
13804
|
-
await
|
|
13732
|
+
await mkdir17(dirname9(file), { recursive: true });
|
|
13733
|
+
await writeFile15(file, "", "utf-8");
|
|
13805
13734
|
return { path: input.path, ok: true };
|
|
13806
13735
|
}),
|
|
13807
|
-
createDir: protectedProcedure.input(
|
|
13736
|
+
createDir: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
13808
13737
|
const target = await resolveScope(input.scope);
|
|
13809
13738
|
if (target.mode === "agent") {
|
|
13810
13739
|
return agentManager.agentMutation(target.agentId, "wiki.createDir", { cwd: target.cwd, path: input.path });
|
|
13811
13740
|
}
|
|
13812
13741
|
const dir = await resolveSafeLocal(target.root, input.path, false);
|
|
13813
|
-
await
|
|
13742
|
+
await mkdir17(dir, { recursive: true });
|
|
13814
13743
|
return { path: input.path, ok: true };
|
|
13815
13744
|
}),
|
|
13816
|
-
rename: protectedProcedure.input(
|
|
13745
|
+
rename: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, fromPath: REL_PATH_SCHEMA, toPath: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
13817
13746
|
const target = await resolveScope(input.scope);
|
|
13818
13747
|
if (target.mode === "agent") {
|
|
13819
13748
|
return agentManager.agentMutation(target.agentId, "wiki.renamePath", { cwd: target.cwd, fromPath: input.fromPath, toPath: input.toPath });
|
|
@@ -13822,35 +13751,35 @@ var wikiRouter = router({
|
|
|
13822
13751
|
const to = await resolveSafeLocal(target.root, input.toPath, false);
|
|
13823
13752
|
try {
|
|
13824
13753
|
await stat6(to);
|
|
13825
|
-
throw new
|
|
13754
|
+
throw new TRPCError21({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
|
|
13826
13755
|
} catch (err) {
|
|
13827
|
-
if (err instanceof
|
|
13756
|
+
if (err instanceof TRPCError21) throw err;
|
|
13828
13757
|
}
|
|
13829
|
-
await
|
|
13758
|
+
await mkdir17(dirname9(to), { recursive: true });
|
|
13830
13759
|
await rename12(from, to);
|
|
13831
13760
|
return { fromPath: input.fromPath, toPath: input.toPath, ok: true };
|
|
13832
13761
|
}),
|
|
13833
|
-
ensureRoot: protectedProcedure.input(
|
|
13762
|
+
ensureRoot: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA })).mutation(async ({ input }) => {
|
|
13834
13763
|
if (input.scope === "global") {
|
|
13835
13764
|
await resolveScope("global");
|
|
13836
13765
|
return { ok: true };
|
|
13837
13766
|
}
|
|
13838
13767
|
const serviceId = input.scope.slice("service:".length);
|
|
13839
13768
|
const service = await serviceStore.get(serviceId);
|
|
13840
|
-
if (!service) throw new
|
|
13769
|
+
if (!service) throw new TRPCError21({ code: "NOT_FOUND", message: "Service introuvable" });
|
|
13841
13770
|
const agentId = await resolveEffectiveAgentId(service);
|
|
13842
|
-
if (!agentId) throw new
|
|
13771
|
+
if (!agentId) throw new TRPCError21({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9" });
|
|
13843
13772
|
const cwd = await resolveWorkspaceCwd({ serviceId, override: service.docsPath?.trim() || void 0 });
|
|
13844
13773
|
return agentManager.agentMutation(agentId, "wiki.ensureRoot", { cwd });
|
|
13845
13774
|
}),
|
|
13846
|
-
delete: protectedProcedure.input(
|
|
13775
|
+
delete: protectedProcedure.input(z25.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
13847
13776
|
const target = await resolveScope(input.scope);
|
|
13848
13777
|
if (target.mode === "agent") {
|
|
13849
13778
|
return agentManager.agentMutation(target.agentId, "wiki.deletePath", { cwd: target.cwd, path: input.path });
|
|
13850
13779
|
}
|
|
13851
13780
|
const fp = await resolveSafeLocal(target.root, input.path, true);
|
|
13852
|
-
if (fp === target.root) throw new
|
|
13853
|
-
await
|
|
13781
|
+
if (fp === target.root) throw new TRPCError21({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
|
|
13782
|
+
await rm4(fp, { recursive: true, force: true });
|
|
13854
13783
|
return { path: input.path, ok: true };
|
|
13855
13784
|
})
|
|
13856
13785
|
});
|
|
@@ -13869,14 +13798,14 @@ var configRouter = router({
|
|
|
13869
13798
|
});
|
|
13870
13799
|
|
|
13871
13800
|
// ../server/src/trpc/routers/cloud-sync.ts
|
|
13872
|
-
import { z as
|
|
13873
|
-
import { TRPCError as
|
|
13801
|
+
import { z as z26 } from "zod";
|
|
13802
|
+
import { TRPCError as TRPCError22 } from "@trpc/server";
|
|
13874
13803
|
|
|
13875
13804
|
// ../server/src/services/org-sync-scope.ts
|
|
13876
13805
|
import { access as access2 } from "fs/promises";
|
|
13877
|
-
import { join as
|
|
13806
|
+
import { join as join21 } from "path";
|
|
13878
13807
|
async function isMaterialized(root) {
|
|
13879
|
-
return access2(
|
|
13808
|
+
return access2(join21(root, "project.json")).then(() => true, () => false);
|
|
13880
13809
|
}
|
|
13881
13810
|
async function orgsToSync() {
|
|
13882
13811
|
const cloudUrl = getCloudApiUrl();
|
|
@@ -13938,16 +13867,16 @@ async function reconcileOrgCanary(orgId) {
|
|
|
13938
13867
|
|
|
13939
13868
|
// ../server/src/services/cloud-sync-bridge.ts
|
|
13940
13869
|
import { randomUUID as randomUUID11 } from "crypto";
|
|
13941
|
-
import { mkdir as
|
|
13870
|
+
import { mkdir as mkdir19, rm as rm5 } from "fs/promises";
|
|
13942
13871
|
import * as Y from "yjs";
|
|
13943
13872
|
|
|
13944
13873
|
// ../server/src/services/org-lock.ts
|
|
13945
|
-
import { open as open2, readFile as
|
|
13874
|
+
import { open as open2, readFile as readFile16, unlink as unlink4, mkdir as mkdir18 } from "fs/promises";
|
|
13946
13875
|
import { readFileSync, unlinkSync } from "fs";
|
|
13947
|
-
import { join as
|
|
13876
|
+
import { join as join22 } from "path";
|
|
13948
13877
|
var held = /* @__PURE__ */ new Set();
|
|
13949
13878
|
function lockPath(orgId) {
|
|
13950
|
-
return
|
|
13879
|
+
return join22(orgVaultRoot(orgId), "org.lock");
|
|
13951
13880
|
}
|
|
13952
13881
|
function isRunning(pid) {
|
|
13953
13882
|
if (!Number.isInteger(pid) || pid <= 0) return false;
|
|
@@ -13960,7 +13889,7 @@ function isRunning(pid) {
|
|
|
13960
13889
|
}
|
|
13961
13890
|
async function readLock(path) {
|
|
13962
13891
|
try {
|
|
13963
|
-
const parsed = JSON.parse(await
|
|
13892
|
+
const parsed = JSON.parse(await readFile16(path, "utf-8"));
|
|
13964
13893
|
return typeof parsed?.pid === "number" ? parsed : null;
|
|
13965
13894
|
} catch {
|
|
13966
13895
|
return null;
|
|
@@ -13968,7 +13897,7 @@ async function readLock(path) {
|
|
|
13968
13897
|
}
|
|
13969
13898
|
async function acquireOrgLock(orgId) {
|
|
13970
13899
|
const path = lockPath(orgId);
|
|
13971
|
-
await
|
|
13900
|
+
await mkdir18(orgVaultRoot(orgId), { recursive: true });
|
|
13972
13901
|
for (let attempt = 0; attempt < 2; attempt++) {
|
|
13973
13902
|
try {
|
|
13974
13903
|
const handle = await open2(path, "wx");
|
|
@@ -14379,7 +14308,7 @@ var OrgSyncConnection = class {
|
|
|
14379
14308
|
}
|
|
14380
14309
|
const isLocal = existing?.orgId === this.link.orgId;
|
|
14381
14310
|
if (!inDoc && !isLocal) return false;
|
|
14382
|
-
await
|
|
14311
|
+
await mkdir19(projectVaultRoot(this.link.orgId, projectId), { recursive: true });
|
|
14383
14312
|
this.tracked.add(projectId);
|
|
14384
14313
|
if (inDoc) await this.pullFromDoc([projectId]);
|
|
14385
14314
|
else await this.reconcileLocalToDoc();
|
|
@@ -14395,7 +14324,7 @@ var OrgSyncConnection = class {
|
|
|
14395
14324
|
async unfollowProject(projectId) {
|
|
14396
14325
|
this.tracked.delete(projectId);
|
|
14397
14326
|
await projectStore.forgetLocally({ id: projectId, orgId: this.link.orgId });
|
|
14398
|
-
await
|
|
14327
|
+
await rm5(projectVaultRoot(this.link.orgId, projectId), { recursive: true, force: true }).catch(() => {
|
|
14399
14328
|
});
|
|
14400
14329
|
}
|
|
14401
14330
|
/**
|
|
@@ -14755,8 +14684,8 @@ var CloudSyncBridge = class {
|
|
|
14755
14684
|
var cloudSyncBridge = new CloudSyncBridge();
|
|
14756
14685
|
|
|
14757
14686
|
// ../server/src/services/key-adoption.ts
|
|
14758
|
-
import { readdir as
|
|
14759
|
-
import { join as
|
|
14687
|
+
import { readdir as readdir7, readFile as readFile17, writeFile as writeFile16, mkdir as mkdir20, copyFile, rename as rename13, stat as stat7 } from "fs/promises";
|
|
14688
|
+
import { join as join23 } from "path";
|
|
14760
14689
|
import { createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2, randomBytes as randomBytes5 } from "crypto";
|
|
14761
14690
|
var ALGORITHM = "aes-256-gcm";
|
|
14762
14691
|
function isAgentTriplet(value) {
|
|
@@ -14813,7 +14742,7 @@ async function rootsOfOrg(orgId) {
|
|
|
14813
14742
|
}
|
|
14814
14743
|
async function jsonFilesIn(root) {
|
|
14815
14744
|
try {
|
|
14816
|
-
const entries2 = await
|
|
14745
|
+
const entries2 = await readdir7(root, { withFileTypes: true });
|
|
14817
14746
|
return entries2.filter((e) => e.isFile() && e.name.endsWith(".json")).map((e) => e.name);
|
|
14818
14747
|
} catch {
|
|
14819
14748
|
return [];
|
|
@@ -14836,10 +14765,10 @@ async function adoptOrgKey(orgId, newKey, masterPassword, now) {
|
|
|
14836
14765
|
const touchedRoots = /* @__PURE__ */ new Set();
|
|
14837
14766
|
for (const vaultRoot of await rootsOfOrg(orgId)) {
|
|
14838
14767
|
for (const name of await jsonFilesIn(vaultRoot)) {
|
|
14839
|
-
const path =
|
|
14768
|
+
const path = join23(vaultRoot, name);
|
|
14840
14769
|
let parsed;
|
|
14841
14770
|
try {
|
|
14842
|
-
parsed = JSON.parse(await
|
|
14771
|
+
parsed = JSON.parse(await readFile17(path, "utf-8"));
|
|
14843
14772
|
} catch {
|
|
14844
14773
|
continue;
|
|
14845
14774
|
}
|
|
@@ -14853,21 +14782,21 @@ async function adoptOrgKey(orgId, newKey, masterPassword, now) {
|
|
|
14853
14782
|
const stamp = now.toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
14854
14783
|
const backups = [];
|
|
14855
14784
|
for (const vaultRoot of touchedRoots) {
|
|
14856
|
-
const backupDir =
|
|
14857
|
-
await
|
|
14785
|
+
const backupDir = join23(vaultRoot, `backup-key-${stamp}`);
|
|
14786
|
+
await mkdir20(backupDir, { recursive: true });
|
|
14858
14787
|
for (const name of await jsonFilesIn(vaultRoot)) {
|
|
14859
|
-
await copyFile(
|
|
14788
|
+
await copyFile(join23(vaultRoot, name), join23(backupDir, name));
|
|
14860
14789
|
}
|
|
14861
14790
|
for (const name of [".encryption.key.enc", ".runeya-verify"]) {
|
|
14862
|
-
if (await exists(
|
|
14863
|
-
await copyFile(
|
|
14791
|
+
if (await exists(join23(vaultRoot, name))) {
|
|
14792
|
+
await copyFile(join23(vaultRoot, name), join23(backupDir, name));
|
|
14864
14793
|
}
|
|
14865
14794
|
}
|
|
14866
14795
|
backups.push(backupDir);
|
|
14867
14796
|
}
|
|
14868
14797
|
for (const item of pending) {
|
|
14869
14798
|
const tmp = item.path + ".tmp";
|
|
14870
|
-
await
|
|
14799
|
+
await writeFile16(tmp, item.content, "utf-8");
|
|
14871
14800
|
await rename13(tmp, item.path);
|
|
14872
14801
|
}
|
|
14873
14802
|
await installOrgKey(orgId, newKey, masterPassword);
|
|
@@ -14899,7 +14828,7 @@ async function assertOrgReadable(orgId) {
|
|
|
14899
14828
|
await assertOrgVaultReadable(orgId);
|
|
14900
14829
|
} catch (err) {
|
|
14901
14830
|
if (err instanceof OrgVaultUnreadableError) {
|
|
14902
|
-
throw new
|
|
14831
|
+
throw new TRPCError22({ code: "FORBIDDEN", message: err.message });
|
|
14903
14832
|
}
|
|
14904
14833
|
throw err;
|
|
14905
14834
|
}
|
|
@@ -14909,10 +14838,10 @@ async function assertOrgKey(orgId) {
|
|
|
14909
14838
|
await reconcileOrgCanary(orgId);
|
|
14910
14839
|
} catch (err) {
|
|
14911
14840
|
if (err instanceof OrgKeyMismatchError) {
|
|
14912
|
-
throw new
|
|
14841
|
+
throw new TRPCError22({ code: "FORBIDDEN", message: err.message });
|
|
14913
14842
|
}
|
|
14914
14843
|
if (err instanceof CanaryUnavailableError) {
|
|
14915
|
-
throw new
|
|
14844
|
+
throw new TRPCError22({ code: "PRECONDITION_FAILED", message: err.message });
|
|
14916
14845
|
}
|
|
14917
14846
|
throw err;
|
|
14918
14847
|
}
|
|
@@ -14929,10 +14858,10 @@ var cloudSyncRouter = router({
|
|
|
14929
14858
|
* "open this project" is the whole gesture.
|
|
14930
14859
|
*/
|
|
14931
14860
|
trackProject: protectedProcedure.input(
|
|
14932
|
-
|
|
14933
|
-
orgId:
|
|
14934
|
-
cloudUrl:
|
|
14935
|
-
projectId:
|
|
14861
|
+
z26.object({
|
|
14862
|
+
orgId: z26.string().min(1).max(128),
|
|
14863
|
+
cloudUrl: z26.string().url().max(2048),
|
|
14864
|
+
projectId: z26.string().min(1).max(128)
|
|
14936
14865
|
})
|
|
14937
14866
|
).mutation(async ({ input }) => {
|
|
14938
14867
|
await assertOrgReadable(input.orgId);
|
|
@@ -14947,7 +14876,7 @@ var cloudSyncRouter = router({
|
|
|
14947
14876
|
return { pulled, state: syncState(input.orgId) };
|
|
14948
14877
|
} catch (err) {
|
|
14949
14878
|
if (err instanceof ProjectHeldElsewhereError) {
|
|
14950
|
-
throw new
|
|
14879
|
+
throw new TRPCError22({ code: "CONFLICT", message: err.code, cause: err });
|
|
14951
14880
|
}
|
|
14952
14881
|
throw err;
|
|
14953
14882
|
}
|
|
@@ -14966,18 +14895,18 @@ var cloudSyncRouter = router({
|
|
|
14966
14895
|
* fusionné.
|
|
14967
14896
|
*/
|
|
14968
14897
|
publishProject: protectedProcedure.input(
|
|
14969
|
-
|
|
14970
|
-
orgId:
|
|
14971
|
-
cloudUrl:
|
|
14972
|
-
projectId:
|
|
14898
|
+
z26.object({
|
|
14899
|
+
orgId: z26.string().min(1).max(128),
|
|
14900
|
+
cloudUrl: z26.string().url().max(2048),
|
|
14901
|
+
projectId: z26.string().min(1).max(128)
|
|
14973
14902
|
})
|
|
14974
14903
|
).mutation(async ({ input }) => {
|
|
14975
14904
|
const local = await projectStore.get({ id: input.projectId, orgId: null });
|
|
14976
14905
|
if (!local) {
|
|
14977
|
-
throw new
|
|
14906
|
+
throw new TRPCError22({ code: "NOT_FOUND", message: "PROJECT_NOT_LOCAL" });
|
|
14978
14907
|
}
|
|
14979
14908
|
if (await projectStore.get({ id: input.projectId, orgId: input.orgId })) {
|
|
14980
|
-
throw new
|
|
14909
|
+
throw new TRPCError22({ code: "CONFLICT", message: "PROJECT_ALREADY_IN_ORG" });
|
|
14981
14910
|
}
|
|
14982
14911
|
await assertOrgReadable(input.orgId);
|
|
14983
14912
|
const connected = cloudSyncBridge.states().some((s) => s.orgId === input.orgId);
|
|
@@ -14996,7 +14925,7 @@ var cloudSyncRouter = router({
|
|
|
14996
14925
|
await cloudSyncBridge.followProject(input.orgId, input.projectId);
|
|
14997
14926
|
} catch (err) {
|
|
14998
14927
|
if (err instanceof ProjectHeldElsewhereError) {
|
|
14999
|
-
throw new
|
|
14928
|
+
throw new TRPCError22({ code: "CONFLICT", message: err.code, cause: err });
|
|
15000
14929
|
}
|
|
15001
14930
|
throw err;
|
|
15002
14931
|
}
|
|
@@ -15010,16 +14939,16 @@ var cloudSyncRouter = router({
|
|
|
15010
14939
|
* publié. Le cloud, lui, ne peut pas répondre — il n'a que du chiffré sous
|
|
15011
14940
|
* les yeux — donc le canari est rapatrié et jugé ici.
|
|
15012
14941
|
*/
|
|
15013
|
-
checkOrgKey: protectedProcedure.input(
|
|
15014
|
-
orgId:
|
|
15015
|
-
keyHex:
|
|
14942
|
+
checkOrgKey: protectedProcedure.input(z26.object({
|
|
14943
|
+
orgId: z26.string().min(1).max(128),
|
|
14944
|
+
keyHex: z26.string().length(64).regex(/^[0-9a-f]+$/i)
|
|
15016
14945
|
})).query(async ({ input }) => {
|
|
15017
14946
|
const res = await cloudFetch2(
|
|
15018
14947
|
`/api/auth/organization/canary?organizationId=${encodeURIComponent(input.orgId)}`,
|
|
15019
14948
|
{ method: "GET" }
|
|
15020
14949
|
);
|
|
15021
14950
|
if (!res.ok) {
|
|
15022
|
-
throw new
|
|
14951
|
+
throw new TRPCError22({ code: "BAD_GATEWAY", message: await cloudMessage(res) || `CANARY_READ_FAILED (${res.status})` });
|
|
15023
14952
|
}
|
|
15024
14953
|
const { canary } = await res.json();
|
|
15025
14954
|
if (typeof canary !== "string") return { matches: false, published: false };
|
|
@@ -15035,10 +14964,10 @@ var cloudSyncRouter = router({
|
|
|
15035
14964
|
* Bornée au coffre de l'organisation et à ceux de ses projets : les autres
|
|
15036
14965
|
* organisations et la machine gardent leur clé.
|
|
15037
14966
|
*/
|
|
15038
|
-
adoptOrgKey: protectedProcedure.input(
|
|
15039
|
-
orgId:
|
|
15040
|
-
keyHex:
|
|
15041
|
-
masterPassword:
|
|
14967
|
+
adoptOrgKey: protectedProcedure.input(z26.object({
|
|
14968
|
+
orgId: z26.string().min(1).max(128),
|
|
14969
|
+
keyHex: z26.string().length(64).regex(/^[0-9a-f]+$/i),
|
|
14970
|
+
masterPassword: z26.string().min(1).max(1024)
|
|
15042
14971
|
})).mutation(async ({ input }) => {
|
|
15043
14972
|
const report = await adoptOrgKey(
|
|
15044
14973
|
input.orgId,
|
|
@@ -15062,10 +14991,10 @@ var cloudSyncRouter = router({
|
|
|
15062
14991
|
* Elle ne re-chiffre rien : ce qui a déjà été synchronisé sous l'ancienne clé
|
|
15063
14992
|
* reste illisible. L'interface le dit avant de la déclencher.
|
|
15064
14993
|
*/
|
|
15065
|
-
resetOrgKey: protectedProcedure.input(
|
|
14994
|
+
resetOrgKey: protectedProcedure.input(z26.object({ orgId: z26.string().min(1).max(128) })).mutation(async ({ input }) => {
|
|
15066
14995
|
const canary = await readVerifyFile(await keyRoot());
|
|
15067
14996
|
if (!canary) {
|
|
15068
|
-
throw new
|
|
14997
|
+
throw new TRPCError22({
|
|
15069
14998
|
code: "PRECONDITION_FAILED",
|
|
15070
14999
|
message: "Cette machine n'a pas encore de cl\xE9 de chiffrement."
|
|
15071
15000
|
});
|
|
@@ -15076,7 +15005,7 @@ var cloudSyncRouter = router({
|
|
|
15076
15005
|
});
|
|
15077
15006
|
if (!res.ok) {
|
|
15078
15007
|
const detail = await cloudMessage(res);
|
|
15079
|
-
throw new
|
|
15008
|
+
throw new TRPCError22({
|
|
15080
15009
|
code: res.status === 403 ? "FORBIDDEN" : "BAD_GATEWAY",
|
|
15081
15010
|
message: detail || `ORG_KEY_RESET_FAILED (${res.status})`
|
|
15082
15011
|
});
|
|
@@ -15092,9 +15021,9 @@ var cloudSyncRouter = router({
|
|
|
15092
15021
|
* every other member and for this one on another machine.
|
|
15093
15022
|
*/
|
|
15094
15023
|
untrackProject: protectedProcedure.input(
|
|
15095
|
-
|
|
15096
|
-
orgId:
|
|
15097
|
-
projectId:
|
|
15024
|
+
z26.object({
|
|
15025
|
+
orgId: z26.string().min(1).max(128),
|
|
15026
|
+
projectId: z26.string().min(1).max(128)
|
|
15098
15027
|
})
|
|
15099
15028
|
).mutation(async ({ input }) => {
|
|
15100
15029
|
await cloudSyncBridge.unfollowProject(input.orgId, input.projectId);
|
|
@@ -15110,9 +15039,9 @@ var cloudSyncRouter = router({
|
|
|
15110
15039
|
* membre, ce qui évite d'effacer les fichiers si le cloud a refusé l'ordre.
|
|
15111
15040
|
*/
|
|
15112
15041
|
deleteProjectFromOrg: protectedProcedure.input(
|
|
15113
|
-
|
|
15114
|
-
orgId:
|
|
15115
|
-
projectId:
|
|
15042
|
+
z26.object({
|
|
15043
|
+
orgId: z26.string().min(1).max(128),
|
|
15044
|
+
projectId: z26.string().min(1).max(128)
|
|
15116
15045
|
})
|
|
15117
15046
|
).mutation(async ({ input }) => {
|
|
15118
15047
|
let res;
|
|
@@ -15122,8 +15051,8 @@ var cloudSyncRouter = router({
|
|
|
15122
15051
|
body: { organizationId: input.orgId, projectId: input.projectId }
|
|
15123
15052
|
});
|
|
15124
15053
|
} catch (err) {
|
|
15125
|
-
if (err instanceof
|
|
15126
|
-
throw new
|
|
15054
|
+
if (err instanceof TRPCError22 && err.code === "PRECONDITION_FAILED") {
|
|
15055
|
+
throw new TRPCError22({ code: "PRECONDITION_FAILED", message: "CLOUD_NOT_LINKED" });
|
|
15127
15056
|
}
|
|
15128
15057
|
throw err;
|
|
15129
15058
|
}
|
|
@@ -15131,12 +15060,12 @@ var cloudSyncRouter = router({
|
|
|
15131
15060
|
const detail = await cloudMessage(res);
|
|
15132
15061
|
if (res.status === 403) {
|
|
15133
15062
|
const code = /not a member/i.test(detail) ? "PROJECT_NOT_MEMBER" : "PROJECT_DELETE_FORBIDDEN";
|
|
15134
|
-
throw new
|
|
15063
|
+
throw new TRPCError22({ code: "FORBIDDEN", message: code, cause: new Error(detail) });
|
|
15135
15064
|
}
|
|
15136
15065
|
if (res.status === 404) {
|
|
15137
|
-
throw new
|
|
15066
|
+
throw new TRPCError22({ code: "NOT_FOUND", message: "PROJECT_NOT_IN_ORG", cause: new Error(detail) });
|
|
15138
15067
|
}
|
|
15139
|
-
throw new
|
|
15068
|
+
throw new TRPCError22({
|
|
15140
15069
|
code: "BAD_GATEWAY",
|
|
15141
15070
|
message: detail || `PROJECT_DELETE_FAILED (${res.status})`
|
|
15142
15071
|
});
|
|
@@ -15156,10 +15085,10 @@ var cloudSyncRouter = router({
|
|
|
15156
15085
|
* afficher. Le nom est donc recopié dans le tampon du coffre au passage, là
|
|
15157
15086
|
* où il est déjà lu au démarrage suivant.
|
|
15158
15087
|
*/
|
|
15159
|
-
rememberOrgNames: protectedProcedure.input(
|
|
15160
|
-
orgs:
|
|
15161
|
-
orgId:
|
|
15162
|
-
name:
|
|
15088
|
+
rememberOrgNames: protectedProcedure.input(z26.object({
|
|
15089
|
+
orgs: z26.array(z26.object({
|
|
15090
|
+
orgId: z26.string().min(1).max(128),
|
|
15091
|
+
name: z26.string().min(1).max(100)
|
|
15163
15092
|
})).max(200)
|
|
15164
15093
|
})).mutation(async ({ input }) => {
|
|
15165
15094
|
for (const { orgId, name } of input.orgs) await rememberOrgName(orgId, name);
|
|
@@ -15193,15 +15122,15 @@ var cloudSyncRouter = router({
|
|
|
15193
15122
|
});
|
|
15194
15123
|
|
|
15195
15124
|
// ../server/src/trpc/routers/filesystem.ts
|
|
15196
|
-
import { readdir as
|
|
15125
|
+
import { readdir as readdir8, stat as stat8 } from "fs/promises";
|
|
15197
15126
|
import { homedir as homedir5 } from "os";
|
|
15198
|
-
import { isAbsolute as isAbsolute4, join as
|
|
15199
|
-
import { z as
|
|
15127
|
+
import { isAbsolute as isAbsolute4, join as join24, resolve as resolve5, dirname as dirname10, basename as basename2 } from "path";
|
|
15128
|
+
import { z as z27 } from "zod";
|
|
15200
15129
|
var MAX_ENTRIES2 = 500;
|
|
15201
|
-
var PATH_SCHEMA =
|
|
15130
|
+
var PATH_SCHEMA = z27.string().min(1).max(4096);
|
|
15202
15131
|
function safeResolve(input) {
|
|
15203
15132
|
if (input.includes("\0")) throw new Error("Chemin invalide");
|
|
15204
|
-
const expanded = input.startsWith("~") ?
|
|
15133
|
+
const expanded = input.startsWith("~") ? join24(homedir5(), input.slice(1)) : input;
|
|
15205
15134
|
if (!isAbsolute4(expanded)) throw new Error("Le chemin doit \xEAtre absolu");
|
|
15206
15135
|
return resolve5(expanded);
|
|
15207
15136
|
}
|
|
@@ -15222,7 +15151,7 @@ var filesystemRouter = router({
|
|
|
15222
15151
|
* Hidden entries are skipped: they are noise for choosing a workspace, and
|
|
15223
15152
|
* `.runeya` itself would invite placing a project inside another's data.
|
|
15224
15153
|
*/
|
|
15225
|
-
listDirectories: protectedProcedure.input(
|
|
15154
|
+
listDirectories: protectedProcedure.input(z27.object({ path: PATH_SCHEMA })).query(async ({ input }) => {
|
|
15226
15155
|
const dir = safeResolve(input.path);
|
|
15227
15156
|
const info = await stat8(dir).catch(() => null);
|
|
15228
15157
|
if (!info?.isDirectory()) {
|
|
@@ -15230,14 +15159,14 @@ var filesystemRouter = router({
|
|
|
15230
15159
|
}
|
|
15231
15160
|
let names;
|
|
15232
15161
|
try {
|
|
15233
|
-
names = (await
|
|
15162
|
+
names = (await readdir8(dir, { withFileTypes: true })).filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name).sort((a, b) => a.localeCompare(b));
|
|
15234
15163
|
} catch {
|
|
15235
15164
|
throw new Error(`R\xE9pertoire illisible : ${dir}`);
|
|
15236
15165
|
}
|
|
15237
15166
|
const truncated = names.length > MAX_ENTRIES2;
|
|
15238
15167
|
const entries2 = [];
|
|
15239
15168
|
for (const name of names.slice(0, MAX_ENTRIES2)) {
|
|
15240
|
-
const path =
|
|
15169
|
+
const path = join24(dir, name);
|
|
15241
15170
|
entries2.push({ name, path, hasRuneyaProject: await holdsRuneyaProject(path) });
|
|
15242
15171
|
}
|
|
15243
15172
|
return {
|
|
@@ -15256,10 +15185,10 @@ var filesystemRouter = router({
|
|
|
15256
15185
|
* Two projects in one directory is what makes services run against the wrong
|
|
15257
15186
|
* code, so a directory that already holds one is refused outright.
|
|
15258
15187
|
*/
|
|
15259
|
-
checkProjectTarget: protectedProcedure.input(
|
|
15188
|
+
checkProjectTarget: protectedProcedure.input(z27.object({
|
|
15260
15189
|
path: PATH_SCHEMA,
|
|
15261
|
-
projectId:
|
|
15262
|
-
orgId:
|
|
15190
|
+
projectId: z27.string().min(1).max(128),
|
|
15191
|
+
orgId: z27.string().max(128).nullable().optional()
|
|
15263
15192
|
})).query(async ({ input }) => {
|
|
15264
15193
|
const dir = safeResolve(input.path);
|
|
15265
15194
|
const info = await stat8(dir).catch(() => null);
|
|
@@ -15369,8 +15298,8 @@ async function ensureFilePermissions() {
|
|
|
15369
15298
|
}
|
|
15370
15299
|
|
|
15371
15300
|
// ../server/src/services/vault-migration.ts
|
|
15372
|
-
import { readdir as
|
|
15373
|
-
import { join as
|
|
15301
|
+
import { readdir as readdir9, readFile as readFile18, writeFile as writeFile17, mkdir as mkdir21, copyFile as copyFile2, unlink as unlink5, rename as rename14, stat as stat10 } from "fs/promises";
|
|
15302
|
+
import { join as join25 } from "path";
|
|
15374
15303
|
var KEY_FILES = [".encryption.key.enc", ".runeya-verify"];
|
|
15375
15304
|
var MACHINE_FILES = [
|
|
15376
15305
|
"agents.json",
|
|
@@ -15382,7 +15311,7 @@ var MACHINE_FILES = [
|
|
|
15382
15311
|
];
|
|
15383
15312
|
var rekeyValue = rekeyJsonValue;
|
|
15384
15313
|
async function vaultJsonFiles(root) {
|
|
15385
|
-
const entries2 = await
|
|
15314
|
+
const entries2 = await readdir9(root, { withFileTypes: true });
|
|
15386
15315
|
return entries2.filter((e) => e.isFile() && e.name.endsWith(".json")).map((e) => e.name);
|
|
15387
15316
|
}
|
|
15388
15317
|
async function exists2(path) {
|
|
@@ -15400,17 +15329,17 @@ async function openLegacyVault(legacyRoot, masterPassword) {
|
|
|
15400
15329
|
}
|
|
15401
15330
|
async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machineKey, now) {
|
|
15402
15331
|
const stamp = now.toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
15403
|
-
const backupDir =
|
|
15404
|
-
await
|
|
15332
|
+
const backupDir = join25(legacyRoot, `backup-${stamp}`);
|
|
15333
|
+
await mkdir21(backupDir, { recursive: true });
|
|
15405
15334
|
const jsonFiles = await vaultJsonFiles(legacyRoot);
|
|
15406
15335
|
for (const name of [...jsonFiles, ...KEY_FILES]) {
|
|
15407
|
-
if (await exists2(
|
|
15408
|
-
await copyFile2(
|
|
15336
|
+
if (await exists2(join25(legacyRoot, name))) {
|
|
15337
|
+
await copyFile2(join25(legacyRoot, name), join25(backupDir, name));
|
|
15409
15338
|
}
|
|
15410
15339
|
}
|
|
15411
15340
|
const rekeyed = [];
|
|
15412
15341
|
for (const name of jsonFiles) {
|
|
15413
|
-
const raw = await
|
|
15342
|
+
const raw = await readFile18(join25(legacyRoot, name), "utf-8");
|
|
15414
15343
|
let parsed;
|
|
15415
15344
|
try {
|
|
15416
15345
|
parsed = JSON.parse(raw);
|
|
@@ -15420,13 +15349,13 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
|
|
|
15420
15349
|
const counter = { n: 0 };
|
|
15421
15350
|
const converted = rekeyValue(parsed, legacyKey, machineKey, counter);
|
|
15422
15351
|
if (counter.n === 0) continue;
|
|
15423
|
-
const tmp =
|
|
15424
|
-
await
|
|
15425
|
-
await rename14(tmp,
|
|
15352
|
+
const tmp = join25(legacyRoot, `${name}.tmp`);
|
|
15353
|
+
await writeFile17(tmp, JSON.stringify(converted, null, 2), "utf-8");
|
|
15354
|
+
await rename14(tmp, join25(legacyRoot, name));
|
|
15426
15355
|
rekeyed.push({ file: name, values: counter.n });
|
|
15427
15356
|
}
|
|
15428
15357
|
for (const { file, values } of rekeyed) {
|
|
15429
|
-
const parsed = JSON.parse(await
|
|
15358
|
+
const parsed = JSON.parse(await readFile18(join25(legacyRoot, file), "utf-8"));
|
|
15430
15359
|
const check = { n: 0 };
|
|
15431
15360
|
rekeyValue(parsed, machineKey, machineKey, check);
|
|
15432
15361
|
if (check.n !== values) {
|
|
@@ -15435,13 +15364,13 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
|
|
|
15435
15364
|
);
|
|
15436
15365
|
}
|
|
15437
15366
|
}
|
|
15438
|
-
await
|
|
15367
|
+
await mkdir21(machineRootDir, { recursive: true });
|
|
15439
15368
|
const moved = [];
|
|
15440
15369
|
const skipped = [];
|
|
15441
15370
|
for (const name of MACHINE_FILES) {
|
|
15442
|
-
const from =
|
|
15371
|
+
const from = join25(legacyRoot, name);
|
|
15443
15372
|
if (!await exists2(from)) continue;
|
|
15444
|
-
const to =
|
|
15373
|
+
const to = join25(machineRootDir, name);
|
|
15445
15374
|
if (await exists2(to)) {
|
|
15446
15375
|
skipped.push(name);
|
|
15447
15376
|
continue;
|
|
@@ -15451,15 +15380,15 @@ async function migrateLegacyVault(legacyRoot, machineRootDir, legacyKey, machine
|
|
|
15451
15380
|
moved.push(name);
|
|
15452
15381
|
}
|
|
15453
15382
|
for (const name of KEY_FILES) {
|
|
15454
|
-
const path =
|
|
15383
|
+
const path = join25(legacyRoot, name);
|
|
15455
15384
|
if (await exists2(path)) await unlink5(path);
|
|
15456
15385
|
}
|
|
15457
15386
|
return { backupDir, rekeyed, moved, skipped };
|
|
15458
15387
|
}
|
|
15459
15388
|
|
|
15460
15389
|
// ../server/src/services/settings-migration.ts
|
|
15461
|
-
import { readFile as
|
|
15462
|
-
import { join as
|
|
15390
|
+
import { readFile as readFile19, writeFile as writeFile18, rename as rename15, unlink as unlink6, mkdir as mkdir22, chmod as chmod12, stat as stat11 } from "fs/promises";
|
|
15391
|
+
import { join as join26 } from "path";
|
|
15463
15392
|
var SETTINGS_FILE2 = "settings.json";
|
|
15464
15393
|
var SETTINGS_PRIVATE_FILE2 = "settings.private.json";
|
|
15465
15394
|
async function exists3(path) {
|
|
@@ -15472,11 +15401,11 @@ async function legacySource(filename) {
|
|
|
15472
15401
|
return null;
|
|
15473
15402
|
}
|
|
15474
15403
|
async function moveInto(root, filename, from) {
|
|
15475
|
-
await
|
|
15476
|
-
const to =
|
|
15477
|
-
const contents = await
|
|
15404
|
+
await mkdir22(root, { recursive: true });
|
|
15405
|
+
const to = join26(root, filename);
|
|
15406
|
+
const contents = await readFile19(from, "utf-8");
|
|
15478
15407
|
const tmp = to + ".tmp";
|
|
15479
|
-
await
|
|
15408
|
+
await writeFile18(tmp, contents, "utf-8");
|
|
15480
15409
|
await rename15(tmp, to);
|
|
15481
15410
|
await chmod12(to, 384);
|
|
15482
15411
|
await unlink6(from);
|
|
@@ -15498,7 +15427,7 @@ async function migrateSettingsIntoVaults() {
|
|
|
15498
15427
|
const orgId = orgs[0];
|
|
15499
15428
|
const root = orgVaultRoot(orgId);
|
|
15500
15429
|
for (const { filename, from } of sources) {
|
|
15501
|
-
if (await exists3(
|
|
15430
|
+
if (await exists3(join26(root, filename))) continue;
|
|
15502
15431
|
await moveInto(root, filename, from);
|
|
15503
15432
|
report.files.push(filename);
|
|
15504
15433
|
}
|
|
@@ -15514,14 +15443,14 @@ import { createRequire as createRequire2 } from "module";
|
|
|
15514
15443
|
import { randomBytes as randomBytes6, createCipheriv as createCipheriv3, createDecipheriv as createDecipheriv3 } from "crypto";
|
|
15515
15444
|
import { randomUUID as randomUUID12 } from "crypto";
|
|
15516
15445
|
import {
|
|
15517
|
-
readFile as
|
|
15518
|
-
writeFile as
|
|
15446
|
+
readFile as readFile20,
|
|
15447
|
+
writeFile as writeFile19,
|
|
15519
15448
|
rename as rename16,
|
|
15520
|
-
mkdir as
|
|
15449
|
+
mkdir as mkdir23,
|
|
15521
15450
|
access as access3,
|
|
15522
|
-
readdir as
|
|
15451
|
+
readdir as readdir10
|
|
15523
15452
|
} from "fs/promises";
|
|
15524
|
-
import { join as
|
|
15453
|
+
import { join as join27, dirname as dirname11 } from "path";
|
|
15525
15454
|
var _require = createRequire2(import.meta.url);
|
|
15526
15455
|
var PARSER_ID_MAP = {
|
|
15527
15456
|
"stack-monitor-parser-jsons": "native:json",
|
|
@@ -15630,7 +15559,7 @@ async function getSodium() {
|
|
|
15630
15559
|
return _sodium;
|
|
15631
15560
|
}
|
|
15632
15561
|
async function decryptLegacyFile(filePath, key, sodium) {
|
|
15633
|
-
const raw = (await
|
|
15562
|
+
const raw = (await readFile20(filePath, "utf-8")).trim();
|
|
15634
15563
|
if (!raw || raw === "[]" || raw === "{}") {
|
|
15635
15564
|
try {
|
|
15636
15565
|
return JSON.parse(raw);
|
|
@@ -15650,12 +15579,12 @@ async function decryptLegacyFile(filePath, key, sodium) {
|
|
|
15650
15579
|
}
|
|
15651
15580
|
async function atomicWrite(path, data) {
|
|
15652
15581
|
const tmp = path + ".tmp";
|
|
15653
|
-
await
|
|
15582
|
+
await writeFile19(tmp, JSON.stringify(data, null, 2), "utf-8");
|
|
15654
15583
|
await rename16(tmp, path);
|
|
15655
15584
|
}
|
|
15656
15585
|
async function runLegacyMigration(dataDir) {
|
|
15657
15586
|
const legacyRoot = env.DATA_DIR;
|
|
15658
|
-
const legacyKeyPath =
|
|
15587
|
+
const legacyKeyPath = join27(legacyRoot, "dbs", "encryption-key.json");
|
|
15659
15588
|
try {
|
|
15660
15589
|
await access3(legacyKeyPath);
|
|
15661
15590
|
} catch {
|
|
@@ -15663,20 +15592,20 @@ async function runLegacyMigration(dataDir) {
|
|
|
15663
15592
|
}
|
|
15664
15593
|
console.log("[legacy-migration] Legacy Runeya data detected, starting migration\u2026");
|
|
15665
15594
|
const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-").substring(0, 19);
|
|
15666
|
-
const legacyTmp =
|
|
15595
|
+
const legacyTmp = join27(abCwd, ".runeya-tmp");
|
|
15667
15596
|
await rename16(legacyRoot, legacyTmp);
|
|
15668
|
-
await
|
|
15669
|
-
const legacyOld =
|
|
15597
|
+
await mkdir23(dataDir, { recursive: true });
|
|
15598
|
+
const legacyOld = join27(dataDir, `backup-${timestamp}`);
|
|
15670
15599
|
await rename16(legacyTmp, legacyOld);
|
|
15671
15600
|
console.log(`[legacy-migration] Legacy data backed up to ${legacyOld}`);
|
|
15672
|
-
const keyJson = JSON.parse(await
|
|
15601
|
+
const keyJson = JSON.parse(await readFile20(join27(legacyOld, "dbs", "encryption-key.json"), "utf-8"));
|
|
15673
15602
|
const sodium = await getSodium();
|
|
15674
15603
|
const sodiumKey = sodium.from_base64(keyJson.encryptionKey);
|
|
15675
15604
|
const keyBuffer = Buffer.from(sodiumKey);
|
|
15676
15605
|
const runyeaKeyHex = keyBuffer.toString("hex");
|
|
15677
15606
|
await setEncryptionKey(runyeaKeyHex);
|
|
15678
15607
|
console.log("[legacy-migration] Encryption key loaded in memory (temporary)");
|
|
15679
|
-
const dbsDir =
|
|
15608
|
+
const dbsDir = join27(legacyOld, "dbs");
|
|
15680
15609
|
async function readEncrypted(filePath) {
|
|
15681
15610
|
try {
|
|
15682
15611
|
return await decryptLegacyFile(filePath, sodiumKey, sodium);
|
|
@@ -15685,29 +15614,29 @@ async function runLegacyMigration(dataDir) {
|
|
|
15685
15614
|
return null;
|
|
15686
15615
|
}
|
|
15687
15616
|
}
|
|
15688
|
-
const envsDir =
|
|
15689
|
-
const envFiles = (await
|
|
15617
|
+
const envsDir = join27(dbsDir, "envs");
|
|
15618
|
+
const envFiles = (await readdir10(envsDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
15690
15619
|
const legacyEnvs = {};
|
|
15691
15620
|
for (const file of envFiles) {
|
|
15692
15621
|
const name = file.replace(".encrypted.json", "");
|
|
15693
|
-
legacyEnvs[name] = await readEncrypted(
|
|
15622
|
+
legacyEnvs[name] = await readEncrypted(join27(envsDir, file));
|
|
15694
15623
|
}
|
|
15695
|
-
const servicesDir =
|
|
15696
|
-
const serviceFiles = (await
|
|
15624
|
+
const servicesDir = join27(dbsDir, "services");
|
|
15625
|
+
const serviceFiles = (await readdir10(servicesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
15697
15626
|
const legacyServices = {};
|
|
15698
15627
|
for (const file of serviceFiles) {
|
|
15699
15628
|
const name = file.replace(".encrypted.json", "");
|
|
15700
15629
|
if (!name) continue;
|
|
15701
|
-
const data = await readEncrypted(
|
|
15630
|
+
const data = await readEncrypted(join27(servicesDir, file));
|
|
15702
15631
|
if (data?.label) legacyServices[name] = data;
|
|
15703
15632
|
}
|
|
15704
|
-
const overridesDir =
|
|
15705
|
-
const overrideFiles = (await
|
|
15633
|
+
const overridesDir = join27(dbsDir, "overrides");
|
|
15634
|
+
const overrideFiles = (await readdir10(overridesDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
15706
15635
|
const legacyServiceOverrides = {};
|
|
15707
15636
|
const legacyEnvOverrides = {};
|
|
15708
15637
|
for (const file of overrideFiles) {
|
|
15709
15638
|
const baseName = file.replace(".encrypted.json", "");
|
|
15710
|
-
const data = await readEncrypted(
|
|
15639
|
+
const data = await readEncrypted(join27(overridesDir, file));
|
|
15711
15640
|
if (!data) continue;
|
|
15712
15641
|
if (baseName.endsWith("-envs")) {
|
|
15713
15642
|
legacyServiceOverrides[baseName.slice(0, -5)] = data;
|
|
@@ -15715,11 +15644,11 @@ async function runLegacyMigration(dataDir) {
|
|
|
15715
15644
|
legacyEnvOverrides[baseName.slice(0, -12)] = data;
|
|
15716
15645
|
}
|
|
15717
15646
|
}
|
|
15718
|
-
const parsersDir =
|
|
15719
|
-
const parserFiles = (await
|
|
15647
|
+
const parsersDir = join27(dbsDir, "parsers");
|
|
15648
|
+
const parserFiles = (await readdir10(parsersDir).catch(() => [])).filter((f) => f.endsWith(".encrypted.json"));
|
|
15720
15649
|
const legacyParsers = [];
|
|
15721
15650
|
for (const file of parserFiles) {
|
|
15722
|
-
const data = await readEncrypted(
|
|
15651
|
+
const data = await readEncrypted(join27(parsersDir, file));
|
|
15723
15652
|
if (data?.id) legacyParsers.push(data);
|
|
15724
15653
|
}
|
|
15725
15654
|
const projectMonoId = randomUUID12();
|
|
@@ -16060,7 +15989,7 @@ async function runLegacyMigration(dataDir) {
|
|
|
16060
15989
|
}
|
|
16061
15990
|
let existingSettings = {};
|
|
16062
15991
|
try {
|
|
16063
|
-
existingSettings = JSON.parse(await
|
|
15992
|
+
existingSettings = JSON.parse(await readFile20(join27(dataDir, "settings.json"), "utf-8"));
|
|
16064
15993
|
} catch {
|
|
16065
15994
|
}
|
|
16066
15995
|
const migratedParsers = legacyParsers.map((p) => ({
|
|
@@ -16081,11 +16010,11 @@ ${p.transform ?? ""}`,
|
|
|
16081
16010
|
...migratedParsers
|
|
16082
16011
|
]
|
|
16083
16012
|
};
|
|
16084
|
-
await atomicWrite(
|
|
16085
|
-
await atomicWrite(
|
|
16086
|
-
await atomicWrite(
|
|
16087
|
-
await atomicWrite(
|
|
16088
|
-
await atomicWrite(
|
|
16013
|
+
await atomicWrite(join27(dataDir, "projects.json"), runeProjects);
|
|
16014
|
+
await atomicWrite(join27(dataDir, "services.json"), runeServices);
|
|
16015
|
+
await atomicWrite(join27(dataDir, "environments.json"), runeEnvs);
|
|
16016
|
+
await atomicWrite(join27(dataDir, "environment-overrides.json"), flatOverrides);
|
|
16017
|
+
await atomicWrite(join27(dataDir, "settings.json"), newSettings);
|
|
16089
16018
|
const svcEnvCount = runeEnvs.filter((e) => e.scope === "service").length;
|
|
16090
16019
|
console.log(`[legacy-migration] Written: ${runeProjects.length} projects, ${runeServices.length} services, ${runeEnvs.length} environments (${svcEnvCount} service-scoped)`);
|
|
16091
16020
|
console.log(`[legacy-migration] Overrides: ${Object.keys(flatOverrides).length}, custom parsers: ${migratedParsers.length} (all disabled \u2014 rewrite required)`);
|
|
@@ -16096,12 +16025,12 @@ ${p.transform ?? ""}`,
|
|
|
16096
16025
|
}
|
|
16097
16026
|
async function findLegacyKeyInBackup(dataDir) {
|
|
16098
16027
|
try {
|
|
16099
|
-
const entries2 = await
|
|
16028
|
+
const entries2 = await readdir10(dataDir);
|
|
16100
16029
|
const backupDirs = entries2.filter((e) => e.startsWith("backup-")).sort((a, b) => a < b ? -1 : a > b ? 1 : 0).reverse();
|
|
16101
16030
|
for (const dir of backupDirs) {
|
|
16102
|
-
const keyJsonPath =
|
|
16031
|
+
const keyJsonPath = join27(dataDir, dir, "dbs", "encryption-key.json");
|
|
16103
16032
|
try {
|
|
16104
|
-
const raw = await
|
|
16033
|
+
const raw = await readFile20(keyJsonPath, "utf-8");
|
|
16105
16034
|
const parsed = JSON.parse(raw);
|
|
16106
16035
|
if (!parsed.encryptionKey) continue;
|
|
16107
16036
|
const sodium = await getSodium();
|
|
@@ -16122,14 +16051,14 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16122
16051
|
const { resolve: resolve7 } = await import("path");
|
|
16123
16052
|
const abDataDir = resolve7(dataDir);
|
|
16124
16053
|
const candidateDirs = [
|
|
16125
|
-
|
|
16126
|
-
|
|
16054
|
+
join27(dirname11(env.DATA_DIR), ".runeya", "dbs", "overrides"),
|
|
16055
|
+
join27(abDataDir, "dbs", "overrides")
|
|
16127
16056
|
];
|
|
16128
16057
|
let overridesDir = null;
|
|
16129
16058
|
let overrideFiles = [];
|
|
16130
16059
|
for (const dir of candidateDirs) {
|
|
16131
16060
|
try {
|
|
16132
|
-
const files = (await
|
|
16061
|
+
const files = (await readdir10(dir)).filter((f) => f.endsWith(".encrypted.json"));
|
|
16133
16062
|
if (files.length > 0) {
|
|
16134
16063
|
overridesDir = dir;
|
|
16135
16064
|
overrideFiles = files;
|
|
@@ -16139,7 +16068,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16139
16068
|
}
|
|
16140
16069
|
}
|
|
16141
16070
|
if (!overridesDir || overrideFiles.length === 0) return false;
|
|
16142
|
-
const legacyKeyPath =
|
|
16071
|
+
const legacyKeyPath = join27(overridesDir, "..", "encryption-key.json");
|
|
16143
16072
|
try {
|
|
16144
16073
|
await access3(legacyKeyPath);
|
|
16145
16074
|
return false;
|
|
@@ -16157,7 +16086,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16157
16086
|
const envNameToId = {};
|
|
16158
16087
|
let envsRaw;
|
|
16159
16088
|
try {
|
|
16160
|
-
envsRaw = JSON.parse(await
|
|
16089
|
+
envsRaw = JSON.parse(await readFile20(join27(abDataDir, "environments.json"), "utf-8"));
|
|
16161
16090
|
for (const _env of envsRaw) {
|
|
16162
16091
|
const env2 = _env;
|
|
16163
16092
|
if (env2["name"] && env2["id"]) {
|
|
@@ -16176,7 +16105,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16176
16105
|
let servicesRaw = [];
|
|
16177
16106
|
const serviceNameToId = {};
|
|
16178
16107
|
try {
|
|
16179
|
-
servicesRaw = JSON.parse(await
|
|
16108
|
+
servicesRaw = JSON.parse(await readFile20(join27(abDataDir, "services.json"), "utf-8"));
|
|
16180
16109
|
for (const _svc of servicesRaw) {
|
|
16181
16110
|
const svc = _svc;
|
|
16182
16111
|
if (svc["name"] && svc["id"]) serviceNameToId[svc["name"]] = svc["id"];
|
|
@@ -16193,7 +16122,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16193
16122
|
const envName = baseName.slice(0, -"-environment".length);
|
|
16194
16123
|
let data;
|
|
16195
16124
|
try {
|
|
16196
|
-
data = await decryptLegacyFile(
|
|
16125
|
+
data = await decryptLegacyFile(join27(overridesDir, file), sodiumKey, sodium);
|
|
16197
16126
|
} catch (err) {
|
|
16198
16127
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
16199
16128
|
continue;
|
|
@@ -16220,7 +16149,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16220
16149
|
}
|
|
16221
16150
|
}
|
|
16222
16151
|
if (Object.keys(flatOverrides).length > 0) {
|
|
16223
|
-
await atomicWrite(
|
|
16152
|
+
await atomicWrite(join27(abDataDir, "environment-overrides.json"), flatOverrides);
|
|
16224
16153
|
console.log(`[override-migration] Written ${Object.keys(flatOverrides).length} override(s) to environment-overrides.json`);
|
|
16225
16154
|
}
|
|
16226
16155
|
let envsModified = false;
|
|
@@ -16230,7 +16159,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16230
16159
|
const serviceName = baseName.slice(0, -"-envs".length);
|
|
16231
16160
|
let data;
|
|
16232
16161
|
try {
|
|
16233
|
-
data = await decryptLegacyFile(
|
|
16162
|
+
data = await decryptLegacyFile(join27(overridesDir, file), sodiumKey, sodium);
|
|
16234
16163
|
} catch (err) {
|
|
16235
16164
|
console.warn(`[override-migration] Failed to decrypt ${file}: ${err.message}`);
|
|
16236
16165
|
continue;
|
|
@@ -16289,7 +16218,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16289
16218
|
}
|
|
16290
16219
|
}
|
|
16291
16220
|
if (envsModified) {
|
|
16292
|
-
await atomicWrite(
|
|
16221
|
+
await atomicWrite(join27(abDataDir, "environments.json"), envsRaw);
|
|
16293
16222
|
console.log("[override-migration] Merged service overrides into environments.json");
|
|
16294
16223
|
}
|
|
16295
16224
|
const migratedDir = overridesDir.replace(/overrides$/, "overrides-migrated");
|
|
@@ -16304,7 +16233,7 @@ async function runOverrideOnlyMigration(dataDir) {
|
|
|
16304
16233
|
}
|
|
16305
16234
|
|
|
16306
16235
|
// ../server/src/services/server-state.ts
|
|
16307
|
-
import { join as
|
|
16236
|
+
import { join as join28 } from "path";
|
|
16308
16237
|
import { stat as stat12 } from "fs/promises";
|
|
16309
16238
|
var ENCRYPTED_KEY_FILENAME2 = ".encryption.key.enc";
|
|
16310
16239
|
var VERIFY_FILENAME2 = ".runeya-verify";
|
|
@@ -16314,22 +16243,22 @@ async function getServerState() {
|
|
|
16314
16243
|
let hasVerify = false;
|
|
16315
16244
|
let hasData = false;
|
|
16316
16245
|
try {
|
|
16317
|
-
await stat12(
|
|
16246
|
+
await stat12(join28(dataDir, ENCRYPTED_KEY_FILENAME2));
|
|
16318
16247
|
hasEncFile = true;
|
|
16319
16248
|
} catch {
|
|
16320
16249
|
}
|
|
16321
16250
|
try {
|
|
16322
|
-
await stat12(
|
|
16251
|
+
await stat12(join28(dataDir, VERIFY_FILENAME2));
|
|
16323
16252
|
hasVerify = true;
|
|
16324
16253
|
} catch {
|
|
16325
16254
|
}
|
|
16326
16255
|
try {
|
|
16327
|
-
await stat12(
|
|
16256
|
+
await stat12(join28(dataDir, "projects.json"));
|
|
16328
16257
|
hasData = true;
|
|
16329
16258
|
} catch {
|
|
16330
16259
|
}
|
|
16331
16260
|
try {
|
|
16332
|
-
await stat12(
|
|
16261
|
+
await stat12(join28(dataDir, "project.json"));
|
|
16333
16262
|
hasData = true;
|
|
16334
16263
|
} catch {
|
|
16335
16264
|
}
|
|
@@ -17589,4 +17518,4 @@ export {
|
|
|
17589
17518
|
pullEnv,
|
|
17590
17519
|
registerInstance
|
|
17591
17520
|
};
|
|
17592
|
-
//# sourceMappingURL=src-
|
|
17521
|
+
//# sourceMappingURL=src-Q3PSCMS7.js.map
|