@runeya/runeya 2.0.92 → 2.0.94
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 +205 -170
- package/agent/index.js.map +1 -1
- package/agent-manager-3KSS7BHP.js +7 -0
- package/{chunk-PDRWT47K.js → chunk-4PQXBTV6.js} +74 -30
- package/chunk-4PQXBTV6.js.map +1 -0
- package/index.js +2 -2
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/{src-K5L5HTKP.js → src-GGPKDQGD.js} +1002 -936
- package/src-GGPKDQGD.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-CR0iWJNr.js +13 -0
- package/web/assets/AgentTerminalPage-DZj9UulV.js +1 -0
- package/web/assets/AiChatPage-D4h76hus.js +1 -0
- package/web/assets/AppLayout-DusPXiZn.js +1 -0
- package/web/assets/{AppLayout-DiMqQfDk.css → AppLayout-Sk3Qnkr-.css} +1 -1
- package/web/assets/AuditPage-BBEa6MYr.js +1 -0
- package/web/assets/CloudAccountPage-DKgXvPS1.js +1 -0
- package/web/assets/CloudAccountPage-DopITrxL.js +1 -0
- package/web/assets/CloudMessagingPage-BNIbysEO.js +2 -0
- package/web/assets/DashboardPage-CTGAGY7X.js +1 -0
- package/web/assets/DirectoryPickerDialog-BKI9vxkG.js +1 -0
- package/web/assets/{EditorIcon-c_3UtFYp.js → EditorIcon-CdvuLNAP.js} +2 -2
- package/web/assets/EnvironmentForm-BiWvLVax.js +108 -0
- package/web/assets/EnvironmentFormPage-RReX9Ijr.js +1 -0
- package/web/assets/EnvironmentListPage-BW5PlOxl.js +1 -0
- package/web/assets/KanbanBoardPage-BFYgHGl0.js +4 -0
- package/web/assets/KanbanListPage-BAcgRh8Z.js +1 -0
- package/web/assets/LaunchProjectPage-CpiyvCBv.js +1 -0
- package/web/assets/LaunchServicesPage-ChEXnYIi.js +1 -0
- package/web/assets/LogViewer-iTxXl8YQ.js +3 -0
- package/web/assets/OrgKeyPrompt-KRyXRMw7.js +1 -0
- package/web/assets/{ProcessControls-BXu0aujq.js → ProcessControls-DynA7Ock.js} +1 -1
- package/web/assets/ProcessDetailPage-BpgGTkXx.js +1 -0
- package/web/assets/{ProcessMetrics-D-40_Bx4.js → ProcessMetrics-_FGC-0hm.js} +2 -2
- package/web/assets/ProjectDetailPage-B49_-83N.js +1 -0
- package/web/assets/ProjectListPage-CFoEPT2F.js +1 -0
- package/web/assets/RandomJobTestPage-CALSR3WS.js +2 -0
- package/web/assets/ScenarioEditorPage-DxyzCjhy.js +14 -0
- package/web/assets/SendToChatDialog-CeFdMciG.js +1 -0
- package/web/assets/ServiceControlsBar-CI1_piqu.js +1 -0
- package/web/assets/ServiceDetailPage-CVT68kTt.js +2 -0
- package/web/assets/ServiceFormPage-nLRxtrOu.js +1 -0
- package/web/assets/{SettingsPage-BKcxRTQg.css → SettingsPage-CX1EAjNK.css} +1 -1
- package/web/assets/SettingsPage-DDYegVxd.js +2063 -0
- package/web/assets/UnlockPage-D9_ZbMR_.js +1 -0
- package/web/assets/VariablesTable-ClL6KuSo.js +1 -0
- package/web/assets/VaultMigrationPage-rc5OA9Xt.js +1 -0
- package/web/assets/VersionBadge-K5UQnfc6.js +1 -0
- package/web/assets/WikiPage-VeQCqO9Z.js +1 -0
- package/web/assets/WikiView-XCwSa_R7.js +1 -0
- package/web/assets/add-scalar-classes-CvhyJKCs.js +387 -0
- package/web/assets/auth-errors-Cmx-4mn3.js +1 -0
- package/web/assets/{autocomplete-CdduMsds.js → autocomplete-tNXsUW-e.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-J1CPrYKJ.js → basic-shape-diamond.svg-BgNul67K.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-D9pZpKRd.js → basic-shape-hexagon.svg-CILNnZwG.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-GoFZOez-.js → basic-shape-primary-circle-ellipse-round.svg-OXklrBAn.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-5sAWcFH7.js → basic-shape-primary-square-rectangle.svg-DYF4zyUj.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-BBhZF-nU.js → basic-shape-shield.svg-CQbzQswT.js} +1 -1
- package/web/assets/{browser-CGF8J-d2.js → browser-CDtVZzm0.js} +1 -1
- package/web/assets/{browser-D9PR5ryM.js → browser-CdTGBSDI.js} +1 -1
- package/web/assets/{card-wcB3LVu3.js → card-BfEdnBhU.js} +2 -2
- package/web/assets/{checkbox-BGl4zewJ.js → checkbox-CTopTVtp.js} +3 -3
- package/web/assets/{chip-BeU7R8v5.js → chip-Cw38kJ50.js} +2 -2
- package/web/assets/{client-mw7vk2NS.js → client-Bjn9AL4v.js} +2 -2
- package/web/assets/cloud-chat.store-BPoTzBeD.js +1 -0
- package/web/assets/cloud-session-D0ue5Z97.js +1 -0
- package/web/assets/column-BtLe8qbf.js +907 -0
- package/web/assets/{computer-device-desktop-monitor.svg-DvELTXaq.js → computer-device-desktop-monitor.svg-ByBKx1CQ.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-Cy5MNLjy.js → computer-device-desktop.svg-BPvzT4sF.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-CeTHd2Gz.js → computer-device-laptop.svg-saGCSB2c.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-U357QLLy.js → computer-device-mobile-phone-android-samsung-back.svg-Bo-eisU4.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BxWQ3WQu.js → computer-device-mobile-phone-android-samsung.svg-Bavaieis.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-JTaGwsMH.js → computer-device-mobile-phone-iphone-x-back.svg-BQK9BRXi.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CG2NhvNR.js → computer-device-mobile-phone-iphone-x.svg-C24hCDuI.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-0RIIeEQE.js → computer-device-mobile-tablet-touch.svg-CUHV3zSo.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-BpEHWNNy.js → computer-device-mobile-tablet.svg-C8SRYMmI.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-ekymSTiB.js → computer-device-network-ethernet-cat6.svg-Ds4kUid3.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-DQ7DjA-N.js → computer-device-network-lan-www.svg-BwIieS6h.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-Chlu-E0n.js → computer-device-network-wifi-connection.svg-Q7Mxb3eP.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-sXuKxg3H.js → computer-device-network-wifi-router.svg-B0PMuY1x.js} +1 -1
- package/web/assets/{cssMode-CmAJhlK2.js → cssMode-8lAGHoa8.js} +1 -1
- package/web/assets/{divider-CIEeFsQF.js → divider-DRKb8XBY.js} +2 -2
- package/web/assets/{docx-preview-BzWsyqjd.js → docx-preview-K0JOmyAw.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-DBWUyVvG.js → ecology-science-erlenmeyer-flask.svg-D5wbPwU2.js} +1 -1
- package/web/assets/{fieldset-DbVZGmxF.js → fieldset-jU8x6yyO.js} +2 -2
- package/web/assets/{freemarker2-CpZwjOiK.js → freemarker2-BmTZDOK9.js} +1 -1
- package/web/assets/{handlebars-BF01Ro6D.js → handlebars-DM-mBhq3.js} +1 -1
- package/web/assets/{html-y42MG6La.js → html-BohxI4Ke.js} +1 -1
- package/web/assets/{htmlMode-BiFUKM7B.js → htmlMode-vqRVK3v5.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-D8MQjxej.js → image-flash-lightning.svg-s-LoyOp-.js} +1 -1
- package/web/assets/{image-picture-flower.svg-DhtjWeFt.js → image-picture-flower.svg-CofKZT5Q.js} +1 -1
- package/web/assets/{index-K4MHcRkt.js → index-DHr5P6pq.js} +293 -293
- package/web/assets/index-Da38OOd8.css +1 -0
- package/web/assets/{interface-alert-exclamation-diamond.svg-BnuBbqzl.js → interface-alert-exclamation-diamond.svg-C4C4i4oQ.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-CLIWOLdf.js → interface-alert-exclamation-triangle-warning.svg-C-ogsTXk.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg--CM4LBgr.js → interface-alert-information-circle.svg-BFpBDkj5.js} +1 -1
- package/web/assets/{interface-award-crown.svg-CwUcjE17.js → interface-award-crown.svg-DfHdQ8rJ.js} +1 -1
- package/web/assets/{interface-bookmark.svg-C-WYwhpR.js → interface-bookmark-tag.svg-DkfXcRMe.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-BYkbHYcm.js → interface-bookmark.svg-qCQ3v5rM.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-BEV_BtWR.js → interface-calendar-date-one.svg-D2ssTK7X.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-DklVPzGE.js → interface-content-book-open-pages.svg-CH1BmaVm.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DtEixblx.js → interface-content-book-page.svg-BU6m1d9-.js} +1 -1
- package/web/assets/{interface-content-file.svg-CbdR0tUT.js → interface-content-file.svg-DbsUtWTI.js} +1 -1
- package/web/assets/{interface-content-folder.svg-Bb6W8S8_.js → interface-content-folder.svg-8IvlkKzB.js} +1 -1
- package/web/assets/interface-content-folder.svg-nRYFY3NY.js +1 -0
- package/web/assets/{interface-copy-clipboard.svg-cy8mE1ku.js → interface-copy-clipboard.svg-D8ev9OtX.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-ujlWFwop.js → interface-edit-attachment.svg-dl-nfI3P.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-DdndLqEe.js → interface-edit-binocular.svg-Box_OuXH.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-D3PbWjw6.js → interface-edit-magic-wand.svg-DIhMw--x.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-DEJvhvns.js → interface-edit-tool-paint-roller.svg-COUefijc.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-CSwy7Tpt.js → interface-edit-tool-pencil.svg-BNmSspcl.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-Ct3aGvri.js → interface-favorite-award.svg-Cy-XeB8N.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-Dt2tGcDG.js → interface-favorite-flag.svg-BVBisei8.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-BCAdec7C.js → interface-favorite-heart.svg-BkVO2jBo.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-Dcen2Unz.js → interface-favorite-star.svg-Bxe8dqRi.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-BptG3dBN.js → interface-favorite-stars-sparkles.svg-MkrYfhIz.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-CG8rKwV2.js → interface-hierarchy-flowchart.svg-De7TQhr3.js} +1 -1
- package/web/assets/{interface-home-house.svg-EjYsHgjY.js → interface-home-house.svg-D_qOil1N.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-R0Inwsnr.js → interface-hyperlink.svg-5S7ugTcP.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-82wRZ7U5.js → interface-lighting-brightness.svg-vJA95mbx.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-CKCtxTSF.js → interface-lock-closed.svg-DVL32yBG.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-25bZt-jb.js → interface-lock-open-unlock.svg-C7DBYFPn.js} +1 -1
- package/web/assets/{interface-login-key.svg-C1nVpqWu.js → interface-login-key.svg-CEq51fI1.js} +1 -1
- package/web/assets/{interface-search.svg-Db9i4fOU.js → interface-search.svg-CkP-JMXm.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-C2juGx3i.js → interface-setting-cog.svg-CgR9wxJN.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DWKTYrRq.js → interface-share-megaphone-bullhorn.svg-C_VIGsI0.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-D9L6uhiQ.js → interface-share-rocket.svg-aseIyfXq.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-Dt-PZyoP.js → interface-share-satellite.svg-CzkX6PJ2.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-DbJpVjTn.js → interface-share-space-ship.svg-Df1jdZi5.js} +1 -1
- package/web/assets/{interface-share.svg-9Bxtnx5d.js → interface-share.svg-CioS2p8V.js} +1 -1
- package/web/assets/{interface-signal-square.svg-CYGdCItu.js → interface-signal-square.svg-VUtTXd8G.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-0lffJ7tQ.js → interface-time-clock-circle.svg-DWh2OWyC.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-BtZTqD1b.js → interface-time-hour-glass.svg-BCqCfi9r.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-B7F73V4j.js → interface-users-multiple.svg-Edac3LOs.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-Co0IUTf8.js → interface-weather-moon.svg-BrK0lmKX.js} +1 -1
- package/web/assets/{javascript-iLWmo9Qr.js → javascript-ByDc_p54.js} +1 -1
- package/web/assets/{jsonMode-D3SRxnAF.js → jsonMode-Cm2EOOd4.js} +1 -1
- package/web/assets/{liquid-D5C_hJy7.js → liquid-z9Tc1tTM.js} +1 -1
- package/web/assets/{lspLanguageFeatures-DeXbFx7Z.js → lspLanguageFeatures-D6O0oAJj.js} +1 -1
- package/web/assets/{mail-chat-bubble-square.svg-Cnn1sRtD.js → mail-chat-bubble-square.svg-obHuGV3I.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-CqK1oWPg.js → mail-send-email-paper-airplane.svg-I-JVbCkD.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-DIvASWH1.js → mail-send-envelope.svg-CcYcXCe5.js} +1 -1
- package/web/assets/{mdx-wnkKJwKX.js → mdx-B8bePw34.js} +1 -1
- package/web/assets/{minus-BGc58rrM.js → minus-k3R4JOtO.js} +2 -2
- package/web/assets/modal-CVWJd9ZI.js +5 -0
- package/web/assets/modal-Ccn3uciU.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-CzJyKfSy.js → money-cashier-receipt.svg-BIKxMBIH.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-CwjHgCC1.js → money-currency-dollar-pay.svg-B-HfkTCE.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-C2VxjTpX.js → money-graph-arrow-increase.svg-CnXoTtSD.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-CI6bcxy-.js → money-graph-bar-chart-increase.svg-Dt7ly9Tz.js} +1 -1
- package/web/assets/multiselect-BsCXwmy0.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-DlkkijsA.js → nature-ecology-leaf.svg-TjKZfobq.js} +1 -1
- package/web/assets/{password-CknBOa6c.js → password-dyrMCyHO.js} +4 -4
- package/web/assets/{phone-telephone.svg-DB57c0uQ.js → phone-telephone.svg-CCMqAIP_.js} +1 -1
- package/web/assets/{plus-vTZ3EI82.js → plus-Dg2E4ggP.js} +6 -6
- package/web/assets/process.store-CHdSS5Et.js +1 -0
- package/web/assets/{programming-bug.svg-Bpzz6qqz.js → programming-bug.svg-yyshFuq4.js} +1 -1
- package/web/assets/{programming-cloud.svg-Bu_Znc8m.js → programming-cloud.svg-DPyoJVZM.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-BzyehrHn.js → programming-computer-database-server.svg-D7pShcvh.js} +1 -1
- package/web/assets/{programming-computer-database.svg-jGG7yJ-F.js → programming-computer-database.svg-CErKDQrw.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-BUt4Ml7K.js → programming-module-four-layout.svg-B26pG3Bb.js} +1 -1
- package/web/assets/{programming-module-three.svg-DTbRPYAb.js → programming-module-three.svg-CnoN59HX.js} +1 -1
- package/web/assets/{programming-module.svg-z4xhH8Dl.js → programming-module.svg-C02rn1I7.js} +1 -1
- package/web/assets/{programming-script-code.svg-CnJWv1-9.js → programming-script-code.svg-D0sPjoPV.js} +1 -1
- package/web/assets/{python-rG_OzRqj.js → python-1623Ut7s.js} +1 -1
- package/web/assets/{razor-D3sCDiqd.js → razor-CyTiWHYX.js} +1 -1
- package/web/assets/router-DWhykW-F.js +1 -0
- package/web/assets/settings-scope-9i3_Io9Z.js +1 -0
- package/web/assets/{settings.store-Ci_N5bWL.js → settings.store-BPAoJA_7.js} +1 -1
- package/web/assets/{shopping-cart.svg-BKfZC1qE.js → shopping-cart.svg-Cusya5ZE.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-t023rdyN.js → shopping-gift-present.svg-DuhD1jDX.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-BwzwfQ_c.js → shopping-shipping-box-parcel-package.svg-mUJnCOxq.js} +1 -1
- package/web/assets/src-BiD62eGr.js +1 -0
- package/web/assets/src-CGoYw9sv.css +1 -0
- package/web/assets/{src-DPqmktmn.js → src-HsHwQ5rW.js} +14 -14
- package/web/assets/{tabpanel-B40ITuTH.js → tabpanel-D-R0gqbm.js} +3 -3
- package/web/assets/{tag-new-circle.svg-BIfD1F_x.js → tag-new-circle.svg-DFYYOM3s.js} +1 -1
- package/web/assets/{toggleswitch-Dt_ptl6t.js → toggleswitch-Bv2Y60nl.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-CXUdwwcu.js → travel-map-earth-globe.svg-D1KtAG5P.js} +1 -1
- package/web/assets/trpc-4Nls70HO.js +1 -0
- package/web/assets/{tsMode-tZ7zzelW.js → tsMode-DarxEDX3.js} +1 -1
- package/web/assets/{typescript-FIjOqkFs.js → typescript-Bp83QY3R.js} +1 -1
- package/web/assets/useAiChatDrawer-BYR24v6F.js +1 -0
- package/web/assets/useCloudOrg-B1BakNYp.js +572 -0
- package/web/assets/{useCloudOrg-CZ_ZOAVy.css → useCloudOrg-CkiFdVCe.css} +1 -1
- package/web/assets/useProjectCatalog-ClgttEEn.js +1 -0
- package/web/assets/{xml-CdxscNq-.js → xml-CieK61bI.js} +1 -1
- package/web/assets/{yaml-D6DcoEmu.js → yaml-Dd4h-bcV.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-U454MXAX.js +0 -7
- package/chunk-PDRWT47K.js.map +0 -1
- package/src-K5L5HTKP.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-BaIR1ZwL.js +0 -13
- package/web/assets/AgentTerminalPage-Chql5o8h.js +0 -1
- package/web/assets/AiChatPage-DijdhDBJ.js +0 -1
- package/web/assets/AppLayout-DRQiJFAe.js +0 -1
- package/web/assets/AuditPage-DBrGkmq6.js +0 -1
- package/web/assets/CloudAccountPage-Bz5yu3CN.js +0 -1
- package/web/assets/CloudAccountPage-CtaTO5Dr.js +0 -1
- package/web/assets/CloudMessagingPage-D1uKwcxg.js +0 -2
- package/web/assets/DashboardPage-BBFsMFk3.js +0 -1
- package/web/assets/DirectoryPickerDialog-DMUrjQdd.js +0 -1
- package/web/assets/EnvironmentForm-D7Cq-8MZ.js +0 -108
- package/web/assets/EnvironmentFormPage-Dgcm1IXC.js +0 -1
- package/web/assets/EnvironmentListPage-kQY6ZGA3.js +0 -1
- package/web/assets/KanbanBoardPage-B5xNcvmj.js +0 -4
- package/web/assets/KanbanListPage-D-hG5Ag0.js +0 -1
- package/web/assets/LaunchProjectPage-BPbq8Mqg.js +0 -1
- package/web/assets/LaunchServicesPage-CKt_9IHU.js +0 -1
- package/web/assets/LogViewer-BCvltLuS.js +0 -3
- package/web/assets/OrgKeyPrompt-_pg1asnX.js +0 -1
- package/web/assets/ProcessDetailPage-ClzLOqgt.js +0 -1
- package/web/assets/ProjectDetailPage-XVg6xk7_.js +0 -1
- package/web/assets/ProjectListPage-BW4wrm6E.js +0 -1
- package/web/assets/RandomJobTestPage-DZ75Nh-v.js +0 -2
- package/web/assets/ScenarioEditorPage-uH-7yybT.js +0 -14
- package/web/assets/SendToChatDialog-nfy9y-Ji.js +0 -1
- package/web/assets/ServiceControlsBar-hNxsBv7d.js +0 -1
- package/web/assets/ServiceDetailPage-DxSGMGDF.js +0 -2
- package/web/assets/ServiceFormPage-QkfjrWmq.js +0 -1
- package/web/assets/SettingsPage-DJLCo3L_.js +0 -2063
- package/web/assets/UnlockPage-BhHpc9pz.js +0 -1
- package/web/assets/VariablesTable-N_1OjM81.js +0 -1
- package/web/assets/VaultMigrationPage-DVrzZhP0.js +0 -1
- package/web/assets/VersionBadge-C8SWxB0u.js +0 -1
- package/web/assets/WikiPage-rOxWNgKc.js +0 -1
- package/web/assets/WikiView-Bh4Rc1_F.js +0 -1
- package/web/assets/add-scalar-classes-DreMq9eS.js +0 -387
- package/web/assets/auth-errors-BOBaCbd9.js +0 -1
- package/web/assets/cloud-chat.store-DteZIY7A.js +0 -1
- package/web/assets/cloud-session-PX6MlRl9.js +0 -1
- package/web/assets/column-D_CDh4mf.js +0 -907
- package/web/assets/index-Cz0azMVO.css +0 -1
- package/web/assets/interface-content-folder.svg-BiARWOa_.js +0 -1
- package/web/assets/modal-CVEyxr-0.js +0 -5
- package/web/assets/modal-DmCFgP0y.js +0 -1
- package/web/assets/multiselect-DYHLYL35.js +0 -251
- package/web/assets/process.store-CeybR5VK.js +0 -1
- package/web/assets/router-Dx2pV4zI.js +0 -1
- package/web/assets/settings-scope-DVqLTAzI.js +0 -1
- package/web/assets/src-3tEmDkie.js +0 -1
- package/web/assets/src-DIxcn8ra.css +0 -1
- package/web/assets/trpc-BkrN7NiU.js +0 -1
- package/web/assets/useAiChatDrawer-DFAtVCez.js +0 -1
- package/web/assets/useCloudOrg-DnZamx1M.js +0 -572
- package/web/assets/useProjectCatalog-B4PXCnXu.js +0 -1
- /package/{agent-manager-U454MXAX.js.map → agent-manager-3KSS7BHP.js.map} +0 -0
package/agent/index.js
CHANGED
|
@@ -60,7 +60,7 @@ var authMiddleware = t.middleware(({ ctx, next }) => {
|
|
|
60
60
|
var protectedProcedure = t.procedure.use(authMiddleware);
|
|
61
61
|
|
|
62
62
|
// src/trpc/routers/process.ts
|
|
63
|
-
import { z as
|
|
63
|
+
import { z as z24 } from "zod";
|
|
64
64
|
import { TRPCError as TRPCError2 } from "@trpc/server";
|
|
65
65
|
|
|
66
66
|
// src/services/process-manager.ts
|
|
@@ -1148,6 +1148,37 @@ var UpdateCloudApiKeyInput = z20.object({
|
|
|
1148
1148
|
boards: z20.array(z20.string().max(64)).max(200).nullable().optional()
|
|
1149
1149
|
});
|
|
1150
1150
|
|
|
1151
|
+
// ../../packages/shared/src/schemas/changelog.schema.ts
|
|
1152
|
+
import { z as z21 } from "zod";
|
|
1153
|
+
var ChangelogSurfaceSchema = z21.enum(["app", "cloud"]);
|
|
1154
|
+
var ChangelogChangeKindSchema = z21.enum(["feature", "improvement", "fix", "breaking"]);
|
|
1155
|
+
var ChangelogTextSchema = z21.object({
|
|
1156
|
+
fr: z21.string().min(1).max(500),
|
|
1157
|
+
en: z21.string().min(1).max(500)
|
|
1158
|
+
});
|
|
1159
|
+
var ChangelogChangeSchema = z21.object({
|
|
1160
|
+
kind: ChangelogChangeKindSchema,
|
|
1161
|
+
text: ChangelogTextSchema
|
|
1162
|
+
});
|
|
1163
|
+
var ChangelogDraftSchema = ChangelogChangeSchema.extend({
|
|
1164
|
+
date: z21.string().regex(/^\d{4}-\d{2}-\d{2}$/),
|
|
1165
|
+
title: ChangelogTextSchema.optional()
|
|
1166
|
+
});
|
|
1167
|
+
var ChangelogReleaseSchema = z21.object({
|
|
1168
|
+
surface: ChangelogSurfaceSchema,
|
|
1169
|
+
/** `1.4.2` pour l'app (version npm publiée), `2026-09-03` — ou `2026-09-03.2` — pour le cloud. */
|
|
1170
|
+
version: z21.string().min(1).max(32).regex(/^[0-9][0-9.-]*$/),
|
|
1171
|
+
/** Date de publication, `YYYY-MM-DD`. */
|
|
1172
|
+
date: z21.string().regex(/^\d{4}-\d{2}-\d{2}$/),
|
|
1173
|
+
/** Facultatif : une version peut s'annoncer par son seul numéro. */
|
|
1174
|
+
title: ChangelogTextSchema.optional(),
|
|
1175
|
+
/** Une version sans changement n'a rien à annoncer : elle n'a pas sa place ici. */
|
|
1176
|
+
changes: z21.array(ChangelogChangeSchema).min(1).max(50)
|
|
1177
|
+
});
|
|
1178
|
+
var ChangelogIndexItemSchema = ChangelogReleaseSchema.omit({ changes: true }).extend({
|
|
1179
|
+
changeCount: z21.number().int().nonnegative()
|
|
1180
|
+
});
|
|
1181
|
+
|
|
1151
1182
|
// ../../packages/shared/src/utils/crypto.ts
|
|
1152
1183
|
import { createCipheriv, createDecipheriv, randomBytes, pbkdf2Sync } from "crypto";
|
|
1153
1184
|
|
|
@@ -2957,7 +2988,7 @@ async function getDockerStats(containerName) {
|
|
|
2957
2988
|
execFile(
|
|
2958
2989
|
"docker",
|
|
2959
2990
|
["stats", "--no-stream", "--format", "{{json .}}", containerName],
|
|
2960
|
-
{ timeout: 5e3 },
|
|
2991
|
+
{ timeout: 5e3, windowsHide: true },
|
|
2961
2992
|
(err, stdout) => {
|
|
2962
2993
|
if (err || !stdout.trim()) {
|
|
2963
2994
|
resolve2(null);
|
|
@@ -3086,7 +3117,7 @@ import { execa as execa3 } from "execa";
|
|
|
3086
3117
|
import { homedir as homedir4 } from "os";
|
|
3087
3118
|
|
|
3088
3119
|
// src/trpc/routers/config.ts
|
|
3089
|
-
import { z as
|
|
3120
|
+
import { z as z22 } from "zod";
|
|
3090
3121
|
|
|
3091
3122
|
// src/services/traefik-manager.ts
|
|
3092
3123
|
import { spawn, execFile as execFile2 } from "child_process";
|
|
@@ -3283,6 +3314,7 @@ var TraefikManager = class {
|
|
|
3283
3314
|
"traefik:v3"
|
|
3284
3315
|
];
|
|
3285
3316
|
this.process = spawn("docker", args, {
|
|
3317
|
+
windowsHide: true,
|
|
3286
3318
|
shell: false,
|
|
3287
3319
|
detached: false,
|
|
3288
3320
|
stdio: ["ignore", "pipe", "pipe"]
|
|
@@ -3320,7 +3352,7 @@ var TraefikManager = class {
|
|
|
3320
3352
|
this.debounceTimer = null;
|
|
3321
3353
|
}
|
|
3322
3354
|
await new Promise((resolve2) => {
|
|
3323
|
-
execFile2("docker", ["rm", "-f", "runeya-traefik"], { timeout: 1e4 }, () => resolve2());
|
|
3355
|
+
execFile2("docker", ["rm", "-f", "runeya-traefik"], { timeout: 1e4, windowsHide: true }, () => resolve2());
|
|
3324
3356
|
});
|
|
3325
3357
|
await new Promise((resolve2) => setTimeout(resolve2, 500));
|
|
3326
3358
|
}
|
|
@@ -3362,7 +3394,7 @@ var TraefikManager = class {
|
|
|
3362
3394
|
}
|
|
3363
3395
|
async getLogs(lines = 100) {
|
|
3364
3396
|
return new Promise((resolve2) => {
|
|
3365
|
-
execFile2("docker", ["logs", "--tail", String(lines), "runeya-traefik"], { timeout: 1e4 }, (err, stdout, stderr) => {
|
|
3397
|
+
execFile2("docker", ["logs", "--tail", String(lines), "runeya-traefik"], { timeout: 1e4, windowsHide: true }, (err, stdout, stderr) => {
|
|
3366
3398
|
if (err) {
|
|
3367
3399
|
resolve2("");
|
|
3368
3400
|
return;
|
|
@@ -3413,7 +3445,7 @@ var TraefikManager = class {
|
|
|
3413
3445
|
let dockerAvailable = false;
|
|
3414
3446
|
try {
|
|
3415
3447
|
await new Promise((resolve2, reject) => {
|
|
3416
|
-
execFile2("docker", ["info", "--format", "{{.ServerVersion}}"], { timeout: 5e3 }, (err) => {
|
|
3448
|
+
execFile2("docker", ["info", "--format", "{{.ServerVersion}}"], { timeout: 5e3, windowsHide: true }, (err) => {
|
|
3417
3449
|
if (err) reject(err instanceof Error ? err : new Error("docker info failed"));
|
|
3418
3450
|
else resolve2();
|
|
3419
3451
|
});
|
|
@@ -3433,7 +3465,7 @@ var TraefikManager = class {
|
|
|
3433
3465
|
if (dockerAvailable) {
|
|
3434
3466
|
try {
|
|
3435
3467
|
const output = await new Promise((resolve2, reject) => {
|
|
3436
|
-
execFile2("docker", ["inspect", "--format", "{{.State.Running}}", "runeya-traefik"], { timeout: 5e3 }, (err, stdout) => {
|
|
3468
|
+
execFile2("docker", ["inspect", "--format", "{{.State.Running}}", "runeya-traefik"], { timeout: 5e3, windowsHide: true }, (err, stdout) => {
|
|
3437
3469
|
if (err) reject(err instanceof Error ? err : new Error("docker inspect failed"));
|
|
3438
3470
|
else resolve2(stdout.trim());
|
|
3439
3471
|
});
|
|
@@ -3463,13 +3495,13 @@ function resolvePassthroughEnv() {
|
|
|
3463
3495
|
return result;
|
|
3464
3496
|
}
|
|
3465
3497
|
var configRouter = router({
|
|
3466
|
-
setPassthroughEnv: protectedProcedure.input(
|
|
3467
|
-
names:
|
|
3468
|
-
|
|
3498
|
+
setPassthroughEnv: protectedProcedure.input(z22.object({
|
|
3499
|
+
names: z22.array(
|
|
3500
|
+
z22.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).max(256)
|
|
3469
3501
|
).max(100),
|
|
3470
|
-
values:
|
|
3471
|
-
|
|
3472
|
-
|
|
3502
|
+
values: z22.record(
|
|
3503
|
+
z22.string().regex(/^[A-Za-z_][A-Za-z0-9_]*$/).max(256),
|
|
3504
|
+
z22.string().max(32768)
|
|
3473
3505
|
).refine((obj) => Object.keys(obj).length <= 100, "Too many values").optional()
|
|
3474
3506
|
})).mutation(({ input }) => {
|
|
3475
3507
|
passthroughEnvNames = input.names;
|
|
@@ -3506,7 +3538,7 @@ var configRouter = router({
|
|
|
3506
3538
|
getTraefikFileTree: protectedProcedure.query(async () => {
|
|
3507
3539
|
return traefikManager.getFileTree();
|
|
3508
3540
|
}),
|
|
3509
|
-
getTraefikLogs: protectedProcedure.input(
|
|
3541
|
+
getTraefikLogs: protectedProcedure.input(z22.object({ lines: z22.number().int().min(1).max(500).default(100) })).query(async ({ input }) => {
|
|
3510
3542
|
const logs = await traefikManager.getLogs(input.lines);
|
|
3511
3543
|
return { logs };
|
|
3512
3544
|
})
|
|
@@ -3698,17 +3730,17 @@ var healthChecker = new HealthChecker();
|
|
|
3698
3730
|
import killPort from "kill-port";
|
|
3699
3731
|
|
|
3700
3732
|
// src/config/env.ts
|
|
3701
|
-
import { z as
|
|
3702
|
-
var EnvSchema =
|
|
3703
|
-
RUNEYA_AGENT_PORT:
|
|
3704
|
-
RUNEYA_AGENT_HOST:
|
|
3705
|
-
PASSPHRASE_OVERRIDE:
|
|
3706
|
-
AGENT_ID:
|
|
3733
|
+
import { z as z23 } from "zod";
|
|
3734
|
+
var EnvSchema = z23.object({
|
|
3735
|
+
RUNEYA_AGENT_PORT: z23.coerce.number().int().min(1).max(65535).default(4001),
|
|
3736
|
+
RUNEYA_AGENT_HOST: z23.string().default("127.0.0.1"),
|
|
3737
|
+
PASSPHRASE_OVERRIDE: z23.string().regex(/^[0-9a-f]+$/i, "Must be a hex string").optional(),
|
|
3738
|
+
AGENT_ID: z23.string().optional(),
|
|
3707
3739
|
// Set by spawner or manually for remote agents
|
|
3708
|
-
LOG_BUFFER_SIZE:
|
|
3709
|
-
METRICS_INTERVAL:
|
|
3710
|
-
GRACE_PERIOD:
|
|
3711
|
-
HEALTH_WS_INTERVAL:
|
|
3740
|
+
LOG_BUFFER_SIZE: z23.coerce.number().int().positive().default(LOG_BUFFER_SIZE),
|
|
3741
|
+
METRICS_INTERVAL: z23.coerce.number().int().positive().default(METRICS_INTERVAL),
|
|
3742
|
+
GRACE_PERIOD: z23.coerce.number().int().positive().default(GRACE_PERIOD),
|
|
3743
|
+
HEALTH_WS_INTERVAL: z23.coerce.number().int().positive().default(HEALTH_WS_INTERVAL)
|
|
3712
3744
|
});
|
|
3713
3745
|
var env = EnvSchema.parse(process.env);
|
|
3714
3746
|
|
|
@@ -4493,7 +4525,7 @@ var processRouter = router({
|
|
|
4493
4525
|
return processManager.listStatuses();
|
|
4494
4526
|
}),
|
|
4495
4527
|
/** Get a single process */
|
|
4496
|
-
get: protectedProcedure.input(
|
|
4528
|
+
get: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).query(({ input }) => {
|
|
4497
4529
|
const status = processManager.getStatus(input.id);
|
|
4498
4530
|
if (!status) {
|
|
4499
4531
|
throw new TRPCError2({ code: "NOT_FOUND", message: `Process ${input.id} not found` });
|
|
@@ -4506,78 +4538,78 @@ var processRouter = router({
|
|
|
4506
4538
|
return { id };
|
|
4507
4539
|
}),
|
|
4508
4540
|
/** Undeploy: stop + remove */
|
|
4509
|
-
undeploy: protectedProcedure.input(
|
|
4541
|
+
undeploy: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).mutation(async ({ input }) => {
|
|
4510
4542
|
await processManager.undeploy(input.id);
|
|
4511
4543
|
return { success: true };
|
|
4512
4544
|
}),
|
|
4513
4545
|
/** Update the service config for a deployed process */
|
|
4514
|
-
updateConfig: protectedProcedure.input(
|
|
4546
|
+
updateConfig: protectedProcedure.input(z24.object({ serviceId: z24.string().max(128), config: ServiceConfigSchema })).mutation(({ input }) => {
|
|
4515
4547
|
processManager.updateConfig(input.serviceId, input.config);
|
|
4516
4548
|
return { success: true };
|
|
4517
4549
|
}),
|
|
4518
4550
|
/** Start a deployed process */
|
|
4519
|
-
start: protectedProcedure.input(
|
|
4551
|
+
start: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).mutation(async ({ input }) => {
|
|
4520
4552
|
console.log(`[agent] start service=${input.id}`);
|
|
4521
4553
|
await processManager.start(input.id);
|
|
4522
4554
|
return processManager.getStatus(input.id);
|
|
4523
4555
|
}),
|
|
4524
4556
|
/** Stop a running process */
|
|
4525
|
-
stop: protectedProcedure.input(
|
|
4557
|
+
stop: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).mutation(async ({ input }) => {
|
|
4526
4558
|
console.log(`[agent] stop service=${input.id}`);
|
|
4527
4559
|
await processManager.stop(input.id);
|
|
4528
4560
|
return processManager.getStatus(input.id);
|
|
4529
4561
|
}),
|
|
4530
4562
|
/** Restart a process */
|
|
4531
|
-
restart: protectedProcedure.input(
|
|
4563
|
+
restart: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).mutation(async ({ input }) => {
|
|
4532
4564
|
console.log(`[agent] restart service=${input.id}`);
|
|
4533
4565
|
await processManager.restart(input.id);
|
|
4534
4566
|
return processManager.getStatus(input.id);
|
|
4535
4567
|
}),
|
|
4536
4568
|
/** Get buffered logs for a process */
|
|
4537
|
-
logs: protectedProcedure.input(
|
|
4569
|
+
logs: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).query(({ input }) => {
|
|
4538
4570
|
const logs = processManager.getLogs(input.id);
|
|
4539
4571
|
return logs;
|
|
4540
4572
|
}),
|
|
4541
4573
|
/** Clear buffered logs for a process */
|
|
4542
|
-
clearLogBuffer: protectedProcedure.input(
|
|
4574
|
+
clearLogBuffer: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).mutation(({ input }) => {
|
|
4543
4575
|
processManager.clearLogBuffer(input.id);
|
|
4544
4576
|
return { success: true };
|
|
4545
4577
|
}),
|
|
4546
4578
|
/** Execute a shortcut command and stream output into the process log */
|
|
4547
|
-
executeShortcut: protectedProcedure.input(
|
|
4579
|
+
executeShortcut: protectedProcedure.input(z24.object({ id: z24.string().max(128), shortcut: ServiceShortcutSchema })).mutation(async ({ input }) => {
|
|
4548
4580
|
const result = await processManager.executeShortcut(input.id, input.shortcut);
|
|
4549
4581
|
return result;
|
|
4550
4582
|
}),
|
|
4551
4583
|
/** Cancel a running shortcut command */
|
|
4552
|
-
cancelShortcut: protectedProcedure.input(
|
|
4584
|
+
cancelShortcut: protectedProcedure.input(z24.object({ id: z24.string().max(128), shortcutId: z24.string().max(128) })).mutation(({ input }) => {
|
|
4553
4585
|
processManager.cancelShortcut(input.id, input.shortcutId);
|
|
4554
4586
|
return { success: true };
|
|
4555
4587
|
}),
|
|
4556
4588
|
/** Cancel a running ad-hoc command */
|
|
4557
|
-
cancelAdHocCommand: protectedProcedure.input(
|
|
4589
|
+
cancelAdHocCommand: protectedProcedure.input(z24.object({ id: z24.string().max(128), commandId: z24.string().max(128).optional() })).mutation(({ input }) => {
|
|
4558
4590
|
processManager.cancelAdHocCommand(input.id, input.commandId);
|
|
4559
4591
|
return { success: true };
|
|
4560
4592
|
}),
|
|
4561
4593
|
/** Execute an ad-hoc command and stream output into the process log */
|
|
4562
|
-
executeAdHocCommand: protectedProcedure.input(
|
|
4563
|
-
id:
|
|
4564
|
-
command:
|
|
4565
|
-
cwd:
|
|
4566
|
-
commandId:
|
|
4594
|
+
executeAdHocCommand: protectedProcedure.input(z24.object({
|
|
4595
|
+
id: z24.string().max(128),
|
|
4596
|
+
command: z24.string().min(1).max(4096),
|
|
4597
|
+
cwd: z24.string().max(4096).optional(),
|
|
4598
|
+
commandId: z24.string().max(128).optional()
|
|
4567
4599
|
})).mutation(async ({ input }) => {
|
|
4568
4600
|
const result = await processManager.executeAdHocCommand(input.id, input.command, input.cwd, input.commandId);
|
|
4569
4601
|
return result;
|
|
4570
4602
|
}),
|
|
4571
4603
|
/** List active log source types for a process */
|
|
4572
|
-
logSources: protectedProcedure.input(
|
|
4604
|
+
logSources: protectedProcedure.input(z24.object({ processId: z24.string().max(128) })).query(({ input }) => {
|
|
4573
4605
|
return processManager.getLogSourceTypes(input.processId);
|
|
4574
4606
|
}),
|
|
4575
4607
|
/** Get current metrics for a process */
|
|
4576
|
-
metrics: protectedProcedure.input(
|
|
4608
|
+
metrics: protectedProcedure.input(z24.object({ id: z24.string().max(128) })).query(async ({ input }) => {
|
|
4577
4609
|
return processManager.getMetrics(input.id);
|
|
4578
4610
|
}),
|
|
4579
4611
|
/** Subscribe to real-time log stream (yields batches of ParsedLog[]) */
|
|
4580
|
-
onLog: protectedProcedure.input(
|
|
4612
|
+
onLog: protectedProcedure.input(z24.object({ processId: z24.string().max(128).optional() }).optional()).subscription(async function* ({ input }) {
|
|
4581
4613
|
const queue = [];
|
|
4582
4614
|
let resolve2 = null;
|
|
4583
4615
|
const handler = (batch) => {
|
|
@@ -4606,7 +4638,7 @@ var processRouter = router({
|
|
|
4606
4638
|
}
|
|
4607
4639
|
}),
|
|
4608
4640
|
/** Subscribe to real-time status changes */
|
|
4609
|
-
onStatus: protectedProcedure.input(
|
|
4641
|
+
onStatus: protectedProcedure.input(z24.object({ processId: z24.string().max(128).optional() }).optional()).subscription(async function* ({ input }) {
|
|
4610
4642
|
console.debug("[agent] onStatus subscription started", input?.processId ? `for process ${input.processId}` : "(all processes)");
|
|
4611
4643
|
const queue = [];
|
|
4612
4644
|
let resolve2 = null;
|
|
@@ -4638,7 +4670,7 @@ var processRouter = router({
|
|
|
4638
4670
|
}
|
|
4639
4671
|
}),
|
|
4640
4672
|
/** Subscribe to real-time health status changes */
|
|
4641
|
-
onHealth: protectedProcedure.input(
|
|
4673
|
+
onHealth: protectedProcedure.input(z24.object({ processId: z24.string().max(128).optional() }).optional()).subscription(async function* ({ input }) {
|
|
4642
4674
|
const queue = [];
|
|
4643
4675
|
let resolve2 = null;
|
|
4644
4676
|
const handler = (healthData) => {
|
|
@@ -4668,7 +4700,7 @@ var processRouter = router({
|
|
|
4668
4700
|
}
|
|
4669
4701
|
}),
|
|
4670
4702
|
/** Subscribe to real-time metrics */
|
|
4671
|
-
onMetrics: protectedProcedure.input(
|
|
4703
|
+
onMetrics: protectedProcedure.input(z24.object({ processId: z24.string().max(128).optional() }).optional()).subscription(async function* ({ input }) {
|
|
4672
4704
|
const queue = [];
|
|
4673
4705
|
let resolve2 = null;
|
|
4674
4706
|
const handler = (metrics) => {
|
|
@@ -4741,15 +4773,15 @@ var healthRouter = router({
|
|
|
4741
4773
|
/** Check which AI CLIs are available on this agent */
|
|
4742
4774
|
checkCli: protectedProcedure.query(async () => {
|
|
4743
4775
|
const [claudeOk, codexOk] = await Promise.all([
|
|
4744
|
-
execFileAsync("claude", ["--version"], { timeout: 5e3, shell: false }).then(() => true).catch(() => false),
|
|
4745
|
-
execFileAsync("codex", ["--version"], { timeout: 5e3, shell: false }).then(() => true).catch(() => false)
|
|
4776
|
+
execFileAsync("claude", ["--version"], { timeout: 5e3, shell: false, windowsHide: true }).then(() => true).catch(() => false),
|
|
4777
|
+
execFileAsync("codex", ["--version"], { timeout: 5e3, shell: false, windowsHide: true }).then(() => true).catch(() => false)
|
|
4746
4778
|
]);
|
|
4747
4779
|
return { claudeAvailable: claudeOk, codexAvailable: codexOk };
|
|
4748
4780
|
})
|
|
4749
4781
|
});
|
|
4750
4782
|
|
|
4751
4783
|
// src/trpc/routers/terminal.ts
|
|
4752
|
-
import { z as
|
|
4784
|
+
import { z as z25 } from "zod";
|
|
4753
4785
|
import { TRPCError as TRPCError3 } from "@trpc/server";
|
|
4754
4786
|
|
|
4755
4787
|
// src/services/terminal-manager.ts
|
|
@@ -4842,11 +4874,11 @@ var terminalManager = new TerminalManager();
|
|
|
4842
4874
|
// src/trpc/routers/terminal.ts
|
|
4843
4875
|
var terminalRouter = router({
|
|
4844
4876
|
/** Spawn a new PTY shell session, returns a sessionId */
|
|
4845
|
-
create: protectedProcedure.input(
|
|
4846
|
-
cwd:
|
|
4847
|
-
cols:
|
|
4848
|
-
rows:
|
|
4849
|
-
title:
|
|
4877
|
+
create: protectedProcedure.input(z25.object({
|
|
4878
|
+
cwd: z25.string().max(512).optional(),
|
|
4879
|
+
cols: z25.number().int().min(1).max(512).optional(),
|
|
4880
|
+
rows: z25.number().int().min(1).max(256).optional(),
|
|
4881
|
+
title: z25.string().max(128).optional()
|
|
4850
4882
|
})).mutation(({ input }) => {
|
|
4851
4883
|
const sessionId = terminalManager.create(input.cwd, input.cols, input.rows, input.title);
|
|
4852
4884
|
return { sessionId };
|
|
@@ -4854,34 +4886,34 @@ var terminalRouter = router({
|
|
|
4854
4886
|
/** Les sessions encore vivantes : un onglet fermé côté web se retrouve ici */
|
|
4855
4887
|
list: protectedProcedure.query(() => ({ sessions: terminalManager.list() })),
|
|
4856
4888
|
/** Renommer un onglet */
|
|
4857
|
-
rename: protectedProcedure.input(
|
|
4889
|
+
rename: protectedProcedure.input(z25.object({ sessionId: z25.string().max(128), title: z25.string().max(128) })).mutation(({ input }) => {
|
|
4858
4890
|
terminalManager.rename(input.sessionId, input.title);
|
|
4859
4891
|
return { ok: true };
|
|
4860
4892
|
}),
|
|
4861
4893
|
/** Write data (keystrokes) to a PTY session */
|
|
4862
|
-
write: protectedProcedure.input(
|
|
4894
|
+
write: protectedProcedure.input(z25.object({ sessionId: z25.string().max(128), data: z25.string().max(65536) })).mutation(({ input }) => {
|
|
4863
4895
|
terminalManager.write(input.sessionId, input.data);
|
|
4864
4896
|
return { ok: true };
|
|
4865
4897
|
}),
|
|
4866
4898
|
/** Resize a PTY session */
|
|
4867
|
-
resize: protectedProcedure.input(
|
|
4868
|
-
sessionId:
|
|
4869
|
-
cols:
|
|
4870
|
-
rows:
|
|
4899
|
+
resize: protectedProcedure.input(z25.object({
|
|
4900
|
+
sessionId: z25.string().max(128),
|
|
4901
|
+
cols: z25.number().int().min(1).max(512),
|
|
4902
|
+
rows: z25.number().int().min(1).max(256)
|
|
4871
4903
|
})).mutation(({ input }) => {
|
|
4872
4904
|
terminalManager.resize(input.sessionId, input.cols, input.rows);
|
|
4873
4905
|
return { ok: true };
|
|
4874
4906
|
}),
|
|
4875
4907
|
/** Destroy a PTY session */
|
|
4876
|
-
destroy: protectedProcedure.input(
|
|
4908
|
+
destroy: protectedProcedure.input(z25.object({ sessionId: z25.string().max(128) })).mutation(({ input }) => {
|
|
4877
4909
|
terminalManager.destroy(input.sessionId);
|
|
4878
4910
|
return { ok: true };
|
|
4879
4911
|
}),
|
|
4880
4912
|
/** Stream PTY output for a session (async generator subscription) */
|
|
4881
|
-
onData: protectedProcedure.input(
|
|
4882
|
-
sessionId:
|
|
4913
|
+
onData: protectedProcedure.input(z25.object({
|
|
4914
|
+
sessionId: z25.string().max(128),
|
|
4883
4915
|
/** Rejouer l'historique avant le flux : c'est ce qui rend l'onglet persistant. */
|
|
4884
|
-
replay:
|
|
4916
|
+
replay: z25.boolean().optional()
|
|
4885
4917
|
})).subscription(async function* ({ input }) {
|
|
4886
4918
|
const emitter = terminalManager.getEmitter(input.sessionId);
|
|
4887
4919
|
if (!emitter) {
|
|
@@ -4926,7 +4958,7 @@ var terminalRouter = router({
|
|
|
4926
4958
|
});
|
|
4927
4959
|
|
|
4928
4960
|
// src/trpc/routers/git.ts
|
|
4929
|
-
import { z as
|
|
4961
|
+
import { z as z26 } from "zod";
|
|
4930
4962
|
import { TRPCError as TRPCError4 } from "@trpc/server";
|
|
4931
4963
|
import { execFile as execFile5, spawn as spawn3 } from "child_process";
|
|
4932
4964
|
import { promisify as promisify3 } from "util";
|
|
@@ -4966,6 +4998,7 @@ async function resolveSshHost(host) {
|
|
|
4966
4998
|
if (!/^[a-zA-Z0-9._-]+$/.test(host)) return host;
|
|
4967
4999
|
try {
|
|
4968
5000
|
const { stdout } = await execFileAsync2("ssh", ["-G", host], {
|
|
5001
|
+
windowsHide: true,
|
|
4969
5002
|
timeout: 3e3,
|
|
4970
5003
|
env: { PATH: process.env["PATH"] ?? "", HOME: process.env["HOME"] ?? "" }
|
|
4971
5004
|
});
|
|
@@ -4993,12 +5026,12 @@ async function sameGitRemote(a, b, resolveHost = resolveSshHost) {
|
|
|
4993
5026
|
var execFileAsync3 = promisify3(execFile5);
|
|
4994
5027
|
var GIT_TIMEOUT = 15e3;
|
|
4995
5028
|
var DIFF_MAX_BYTES = 512 * 1024;
|
|
4996
|
-
var CWD_SCHEMA =
|
|
4997
|
-
var SAFE_PATH_SCHEMA =
|
|
5029
|
+
var CWD_SCHEMA = z26.string().min(1).max(4096);
|
|
5030
|
+
var SAFE_PATH_SCHEMA = z26.string().min(1).max(4096).refine((p) => !p.startsWith("/") && !p.includes("../"), {
|
|
4998
5031
|
message: "Path must be relative and not traverse up"
|
|
4999
5032
|
});
|
|
5000
|
-
var REMOTE_SCHEMA =
|
|
5001
|
-
var BRANCH_SCHEMA =
|
|
5033
|
+
var REMOTE_SCHEMA = z26.string().min(1).max(128).regex(/^[a-zA-Z0-9_\-.]+$/);
|
|
5034
|
+
var BRANCH_SCHEMA = z26.string().min(1).max(256).regex(/^[a-zA-Z0-9._\-/]+$/);
|
|
5002
5035
|
function gitSafeEnv() {
|
|
5003
5036
|
const env2 = {
|
|
5004
5037
|
GIT_TERMINAL_PROMPT: "0",
|
|
@@ -5032,7 +5065,7 @@ async function git(args, cwd, readOnly = false) {
|
|
|
5032
5065
|
const env2 = gitSafeEnv();
|
|
5033
5066
|
if (readOnly) env2["GIT_OPTIONAL_LOCKS"] = "0";
|
|
5034
5067
|
try {
|
|
5035
|
-
const result = execFileAsync3("git", args, { cwd, signal: ac.signal, env: env2 });
|
|
5068
|
+
const result = execFileAsync3("git", args, { cwd, signal: ac.signal, env: env2, windowsHide: true });
|
|
5036
5069
|
if (result.child) {
|
|
5037
5070
|
activeGitProcesses.add(result.child);
|
|
5038
5071
|
result.child.on("close", () => activeGitProcesses.delete(result.child));
|
|
@@ -5116,10 +5149,10 @@ async function getGitStatus(cwd) {
|
|
|
5116
5149
|
}
|
|
5117
5150
|
var gitRouter = router({
|
|
5118
5151
|
/** Check if a working directory exists and optionally verify its git remote */
|
|
5119
|
-
checkCwd: protectedProcedure.input(
|
|
5152
|
+
checkCwd: protectedProcedure.input(z26.object({
|
|
5120
5153
|
cwd: CWD_SCHEMA,
|
|
5121
|
-
remote:
|
|
5122
|
-
checkReachability:
|
|
5154
|
+
remote: z26.string().max(2048).optional(),
|
|
5155
|
+
checkReachability: z26.boolean().optional()
|
|
5123
5156
|
})).query(async ({ input }) => {
|
|
5124
5157
|
const resolvedCwd = expandEnvVar(input.cwd);
|
|
5125
5158
|
const unresolvedVars = [...resolvedCwd.matchAll(/\$\{?(\w+)\}?/g)].map((m) => m[1]);
|
|
@@ -5141,8 +5174,8 @@ var gitRouter = router({
|
|
|
5141
5174
|
return { exists, actualRemote, remoteMatches, unreachable: false, resolvedCwd: absoluteCwd, unresolvedVars: [] };
|
|
5142
5175
|
}),
|
|
5143
5176
|
/** Clone a git repository into a target directory */
|
|
5144
|
-
clone: protectedProcedure.input(
|
|
5145
|
-
remote:
|
|
5177
|
+
clone: protectedProcedure.input(z26.object({
|
|
5178
|
+
remote: z26.string().min(1).max(2048),
|
|
5146
5179
|
cwd: CWD_SCHEMA
|
|
5147
5180
|
})).mutation(async ({ input }) => {
|
|
5148
5181
|
const absoluteCwd = resolvePath(expandEnvVar(input.cwd));
|
|
@@ -5163,13 +5196,13 @@ var gitRouter = router({
|
|
|
5163
5196
|
return { success: true };
|
|
5164
5197
|
}),
|
|
5165
5198
|
/** Get full git status */
|
|
5166
|
-
status: protectedProcedure.input(
|
|
5199
|
+
status: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).query(async ({ input }) => {
|
|
5167
5200
|
const cwd = assertCwdExists(input.cwd);
|
|
5168
5201
|
await assertGitRepo(cwd);
|
|
5169
5202
|
return getGitStatus(cwd);
|
|
5170
5203
|
}),
|
|
5171
5204
|
/** Watch .git/ for changes and stream updated status */
|
|
5172
|
-
onStatusChange: protectedProcedure.input(
|
|
5205
|
+
onStatusChange: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).subscription(async function* ({ input }) {
|
|
5173
5206
|
const cwd = assertCwdExists(input.cwd);
|
|
5174
5207
|
await assertGitRepo(cwd);
|
|
5175
5208
|
const gitDir = (await git(["rev-parse", "--git-dir"], cwd, true)).trim();
|
|
@@ -5220,7 +5253,7 @@ var gitRouter = router({
|
|
|
5220
5253
|
}
|
|
5221
5254
|
}),
|
|
5222
5255
|
/** Get commit log */
|
|
5223
|
-
log: protectedProcedure.input(
|
|
5256
|
+
log: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, limit: z26.number().int().min(1).max(200).default(50) })).query(async ({ input }) => {
|
|
5224
5257
|
const cwd = assertCwdExists(input.cwd);
|
|
5225
5258
|
await assertGitRepo(cwd);
|
|
5226
5259
|
const format = "%H%h%an%ae%ai%s";
|
|
@@ -5231,7 +5264,7 @@ var gitRouter = router({
|
|
|
5231
5264
|
});
|
|
5232
5265
|
}),
|
|
5233
5266
|
/** List local and remote branches */
|
|
5234
|
-
branches: protectedProcedure.input(
|
|
5267
|
+
branches: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).query(async ({ input }) => {
|
|
5235
5268
|
const cwd = assertCwdExists(input.cwd);
|
|
5236
5269
|
await assertGitRepo(cwd);
|
|
5237
5270
|
const current = (await git(["rev-parse", "--abbrev-ref", "HEAD"], cwd, true)).trim();
|
|
@@ -5243,7 +5276,7 @@ var gitRouter = router({
|
|
|
5243
5276
|
return { current, branches };
|
|
5244
5277
|
}),
|
|
5245
5278
|
/** Checkout a branch */
|
|
5246
|
-
checkout: protectedProcedure.input(
|
|
5279
|
+
checkout: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, branch: BRANCH_SCHEMA, create: z26.boolean().default(false) })).mutation(async ({ input }) => {
|
|
5247
5280
|
const cwd = assertCwdExists(input.cwd);
|
|
5248
5281
|
await assertGitRepo(cwd);
|
|
5249
5282
|
const args = input.create ? ["checkout", "-b", input.branch] : ["checkout", input.branch];
|
|
@@ -5251,42 +5284,42 @@ var gitRouter = router({
|
|
|
5251
5284
|
return { ok: true };
|
|
5252
5285
|
}),
|
|
5253
5286
|
/** Stage files */
|
|
5254
|
-
stage: protectedProcedure.input(
|
|
5287
|
+
stage: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, paths: z26.array(SAFE_PATH_SCHEMA).min(1).max(500) })).mutation(async ({ input }) => {
|
|
5255
5288
|
const cwd = assertCwdExists(input.cwd);
|
|
5256
5289
|
await assertGitRepo(cwd);
|
|
5257
5290
|
await git(["add", "--", ...input.paths], cwd);
|
|
5258
5291
|
return { ok: true };
|
|
5259
5292
|
}),
|
|
5260
5293
|
/** Stage all files */
|
|
5261
|
-
stageAll: protectedProcedure.input(
|
|
5294
|
+
stageAll: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).mutation(async ({ input }) => {
|
|
5262
5295
|
const cwd = assertCwdExists(input.cwd);
|
|
5263
5296
|
await assertGitRepo(cwd);
|
|
5264
5297
|
await git(["add", "-A"], cwd);
|
|
5265
5298
|
return { ok: true };
|
|
5266
5299
|
}),
|
|
5267
5300
|
/** Unstage files */
|
|
5268
|
-
unstage: protectedProcedure.input(
|
|
5301
|
+
unstage: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, paths: z26.array(SAFE_PATH_SCHEMA).min(1).max(500) })).mutation(async ({ input }) => {
|
|
5269
5302
|
const cwd = assertCwdExists(input.cwd);
|
|
5270
5303
|
await assertGitRepo(cwd);
|
|
5271
5304
|
await git(["restore", "--staged", "--", ...input.paths], cwd);
|
|
5272
5305
|
return { ok: true };
|
|
5273
5306
|
}),
|
|
5274
5307
|
/** Unstage all files */
|
|
5275
|
-
unstageAll: protectedProcedure.input(
|
|
5308
|
+
unstageAll: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).mutation(async ({ input }) => {
|
|
5276
5309
|
const cwd = assertCwdExists(input.cwd);
|
|
5277
5310
|
await assertGitRepo(cwd);
|
|
5278
5311
|
await git(["reset", "--"], cwd);
|
|
5279
5312
|
return { ok: true };
|
|
5280
5313
|
}),
|
|
5281
5314
|
/** Commit staged changes */
|
|
5282
|
-
commit: protectedProcedure.input(
|
|
5315
|
+
commit: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, message: z26.string().min(1).max(4096) })).mutation(async ({ input }) => {
|
|
5283
5316
|
const cwd = assertCwdExists(input.cwd);
|
|
5284
5317
|
await assertGitRepo(cwd);
|
|
5285
5318
|
const output = await git(["commit", "-m", input.message], cwd);
|
|
5286
5319
|
return { ok: true, output: output.trim() };
|
|
5287
5320
|
}),
|
|
5288
5321
|
/** Push to remote */
|
|
5289
|
-
push: protectedProcedure.input(
|
|
5322
|
+
push: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, remote: REMOTE_SCHEMA.default("origin"), setUpstream: z26.boolean().default(false) })).mutation(async ({ input }) => {
|
|
5290
5323
|
const cwd = assertCwdExists(input.cwd);
|
|
5291
5324
|
await assertGitRepo(cwd);
|
|
5292
5325
|
const branch = (await git(["rev-parse", "--abbrev-ref", "HEAD"], cwd, true)).trim();
|
|
@@ -5295,25 +5328,25 @@ var gitRouter = router({
|
|
|
5295
5328
|
return { ok: true, output: output.trim() };
|
|
5296
5329
|
}),
|
|
5297
5330
|
/** Pull from remote */
|
|
5298
|
-
pull: protectedProcedure.input(
|
|
5331
|
+
pull: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, remote: REMOTE_SCHEMA.default("origin") })).mutation(async ({ input }) => {
|
|
5299
5332
|
const cwd = assertCwdExists(input.cwd);
|
|
5300
5333
|
await assertGitRepo(cwd);
|
|
5301
5334
|
const output = await git(["pull", input.remote], cwd);
|
|
5302
5335
|
return { ok: true, output: output.trim() };
|
|
5303
5336
|
}),
|
|
5304
5337
|
/** Fetch from remote */
|
|
5305
|
-
fetch: protectedProcedure.input(
|
|
5338
|
+
fetch: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, remote: REMOTE_SCHEMA.default("origin") })).mutation(async ({ input }) => {
|
|
5306
5339
|
const cwd = assertCwdExists(input.cwd);
|
|
5307
5340
|
await assertGitRepo(cwd);
|
|
5308
5341
|
const output = await git(["fetch", input.remote], cwd);
|
|
5309
5342
|
return { ok: true, output: output.trim() };
|
|
5310
5343
|
}),
|
|
5311
5344
|
/** Get diff for a file or the whole index */
|
|
5312
|
-
diff: protectedProcedure.input(
|
|
5345
|
+
diff: protectedProcedure.input(z26.object({
|
|
5313
5346
|
cwd: CWD_SCHEMA,
|
|
5314
|
-
path:
|
|
5315
|
-
staged:
|
|
5316
|
-
untracked:
|
|
5347
|
+
path: z26.string().max(4096).optional(),
|
|
5348
|
+
staged: z26.boolean().default(false),
|
|
5349
|
+
untracked: z26.boolean().default(false)
|
|
5317
5350
|
})).query(async ({ input }) => {
|
|
5318
5351
|
const cwd = assertCwdExists(input.cwd);
|
|
5319
5352
|
await assertGitRepo(cwd);
|
|
@@ -5361,21 +5394,21 @@ var gitRouter = router({
|
|
|
5361
5394
|
};
|
|
5362
5395
|
}),
|
|
5363
5396
|
/** Discard changes to working tree files */
|
|
5364
|
-
discard: protectedProcedure.input(
|
|
5397
|
+
discard: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, paths: z26.array(SAFE_PATH_SCHEMA).min(1).max(500) })).mutation(async ({ input }) => {
|
|
5365
5398
|
const cwd = assertCwdExists(input.cwd);
|
|
5366
5399
|
await assertGitRepo(cwd);
|
|
5367
5400
|
await git(["restore", "--", ...input.paths], cwd);
|
|
5368
5401
|
return { ok: true };
|
|
5369
5402
|
}),
|
|
5370
5403
|
/** Get staged diff (used by server for AI commit message generation) */
|
|
5371
|
-
stagedDiff: protectedProcedure.input(
|
|
5404
|
+
stagedDiff: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).query(async ({ input }) => {
|
|
5372
5405
|
const cwd = assertCwdExists(input.cwd);
|
|
5373
5406
|
await assertGitRepo(cwd);
|
|
5374
5407
|
const diff = await git(["diff", "--staged"], cwd, true);
|
|
5375
5408
|
return { diff: diff.slice(0, 3e4) };
|
|
5376
5409
|
}),
|
|
5377
5410
|
/** Merge a branch into the current branch */
|
|
5378
|
-
merge: protectedProcedure.input(
|
|
5411
|
+
merge: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, branch: BRANCH_SCHEMA, noFf: z26.boolean().default(false) })).mutation(async ({ input }) => {
|
|
5379
5412
|
const cwd = assertCwdExists(input.cwd);
|
|
5380
5413
|
await assertGitRepo(cwd);
|
|
5381
5414
|
const args = input.noFf ? ["merge", "--no-ff", input.branch] : ["merge", input.branch];
|
|
@@ -5383,14 +5416,14 @@ var gitRouter = router({
|
|
|
5383
5416
|
return { ok: true, output: output.trim() };
|
|
5384
5417
|
}),
|
|
5385
5418
|
/** Rebase current branch onto another branch */
|
|
5386
|
-
rebase: protectedProcedure.input(
|
|
5419
|
+
rebase: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, branch: BRANCH_SCHEMA })).mutation(async ({ input }) => {
|
|
5387
5420
|
const cwd = assertCwdExists(input.cwd);
|
|
5388
5421
|
await assertGitRepo(cwd);
|
|
5389
5422
|
const output = await git(["rebase", input.branch], cwd);
|
|
5390
5423
|
return { ok: true, output: output.trim() };
|
|
5391
5424
|
}),
|
|
5392
5425
|
/** List remotes */
|
|
5393
|
-
remotes: protectedProcedure.input(
|
|
5426
|
+
remotes: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).query(async ({ input }) => {
|
|
5394
5427
|
const cwd = assertCwdExists(input.cwd);
|
|
5395
5428
|
await assertGitRepo(cwd);
|
|
5396
5429
|
const output = await git(["remote", "-v"], cwd, true);
|
|
@@ -5408,7 +5441,7 @@ var gitRouter = router({
|
|
|
5408
5441
|
return remotes;
|
|
5409
5442
|
}),
|
|
5410
5443
|
/** List stash entries */
|
|
5411
|
-
stashList: protectedProcedure.input(
|
|
5444
|
+
stashList: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA })).query(async ({ input }) => {
|
|
5412
5445
|
const cwd = assertCwdExists(input.cwd);
|
|
5413
5446
|
await assertGitRepo(cwd);
|
|
5414
5447
|
const output = await git(["stash", "list", "--format=%gd%s"], cwd, true);
|
|
@@ -5421,10 +5454,10 @@ var gitRouter = router({
|
|
|
5421
5454
|
return entries;
|
|
5422
5455
|
}),
|
|
5423
5456
|
/** Stash current changes */
|
|
5424
|
-
stashPush: protectedProcedure.input(
|
|
5457
|
+
stashPush: protectedProcedure.input(z26.object({
|
|
5425
5458
|
cwd: CWD_SCHEMA,
|
|
5426
|
-
message:
|
|
5427
|
-
includeUntracked:
|
|
5459
|
+
message: z26.string().max(4096).optional(),
|
|
5460
|
+
includeUntracked: z26.boolean().default(true)
|
|
5428
5461
|
})).mutation(async ({ input }) => {
|
|
5429
5462
|
const cwd = assertCwdExists(input.cwd);
|
|
5430
5463
|
await assertGitRepo(cwd);
|
|
@@ -5435,21 +5468,21 @@ var gitRouter = router({
|
|
|
5435
5468
|
return { ok: true, output: output.trim() };
|
|
5436
5469
|
}),
|
|
5437
5470
|
/** Apply a stash entry and remove it from the list */
|
|
5438
|
-
stashPop: protectedProcedure.input(
|
|
5471
|
+
stashPop: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, index: z26.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
|
|
5439
5472
|
const cwd = assertCwdExists(input.cwd);
|
|
5440
5473
|
await assertGitRepo(cwd);
|
|
5441
5474
|
const output = await git(["stash", "pop", `stash@{${input.index}}`], cwd);
|
|
5442
5475
|
return { ok: true, output: output.trim() };
|
|
5443
5476
|
}),
|
|
5444
5477
|
/** Apply a stash entry without removing it from the list */
|
|
5445
|
-
stashApply: protectedProcedure.input(
|
|
5478
|
+
stashApply: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, index: z26.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
|
|
5446
5479
|
const cwd = assertCwdExists(input.cwd);
|
|
5447
5480
|
await assertGitRepo(cwd);
|
|
5448
5481
|
const output = await git(["stash", "apply", `stash@{${input.index}}`], cwd);
|
|
5449
5482
|
return { ok: true, output: output.trim() };
|
|
5450
5483
|
}),
|
|
5451
5484
|
/** Drop a stash entry */
|
|
5452
|
-
stashDrop: protectedProcedure.input(
|
|
5485
|
+
stashDrop: protectedProcedure.input(z26.object({ cwd: CWD_SCHEMA, index: z26.number().int().min(0).max(1e3).default(0) })).mutation(async ({ input }) => {
|
|
5453
5486
|
const cwd = assertCwdExists(input.cwd);
|
|
5454
5487
|
await assertGitRepo(cwd);
|
|
5455
5488
|
const output = await git(["stash", "drop", `stash@{${input.index}}`], cwd);
|
|
@@ -5458,7 +5491,7 @@ var gitRouter = router({
|
|
|
5458
5491
|
});
|
|
5459
5492
|
function runGitRaw(args, timeoutMs, extraEnv) {
|
|
5460
5493
|
return new Promise((res) => {
|
|
5461
|
-
const child = spawn3("git", args, { shell: false, stdio: "pipe", env: { ...process.env, ...extraEnv } });
|
|
5494
|
+
const child = spawn3("git", args, { shell: false, stdio: "pipe", env: { ...process.env, ...extraEnv }, windowsHide: true });
|
|
5462
5495
|
let out = "";
|
|
5463
5496
|
child.stdout?.on("data", (d) => {
|
|
5464
5497
|
out += d.toString();
|
|
@@ -5482,7 +5515,7 @@ function runGitRaw(args, timeoutMs, extraEnv) {
|
|
|
5482
5515
|
}
|
|
5483
5516
|
|
|
5484
5517
|
// src/trpc/routers/ai.ts
|
|
5485
|
-
import { z as
|
|
5518
|
+
import { z as z27 } from "zod";
|
|
5486
5519
|
import { TRPCError as TRPCError5 } from "@trpc/server";
|
|
5487
5520
|
|
|
5488
5521
|
// src/services/ai-spawn-manager.ts
|
|
@@ -5629,6 +5662,7 @@ var AiSpawnManager = class {
|
|
|
5629
5662
|
const { env: env2, args } = resolveSpawnEnvAndArgs(opts);
|
|
5630
5663
|
const invocation = resolveCliInvocation(opts.cli, args);
|
|
5631
5664
|
const proc = spawn4(invocation.command, invocation.args, {
|
|
5665
|
+
windowsHide: true,
|
|
5632
5666
|
stdio: ["pipe", "pipe", "pipe"],
|
|
5633
5667
|
shell: false,
|
|
5634
5668
|
env: env2,
|
|
@@ -5949,6 +5983,7 @@ var CodexAppServerManager = class extends EventEmitter10 {
|
|
|
5949
5983
|
async doConnect() {
|
|
5950
5984
|
const env2 = { ...process.env, ...this.extraEnv };
|
|
5951
5985
|
this.proc = spawn6("codex", [...resolveMcpArgs(env2), "app-server"], {
|
|
5986
|
+
windowsHide: true,
|
|
5952
5987
|
stdio: ["pipe", "pipe", "pipe"],
|
|
5953
5988
|
env: env2
|
|
5954
5989
|
});
|
|
@@ -6122,7 +6157,7 @@ function runCmd(cmd, args, stdin, timeoutMs = 5e3) {
|
|
|
6122
6157
|
resolve2({ code, stderr });
|
|
6123
6158
|
};
|
|
6124
6159
|
try {
|
|
6125
|
-
const child = spawn7(cmd, args, { stdio: ["pipe", "ignore", "pipe"] });
|
|
6160
|
+
const child = spawn7(cmd, args, { stdio: ["pipe", "ignore", "pipe"], windowsHide: true });
|
|
6126
6161
|
let stderr = "";
|
|
6127
6162
|
child.stderr.on("data", (c) => {
|
|
6128
6163
|
stderr += c.toString();
|
|
@@ -6197,23 +6232,23 @@ var MAX_CONTEXT_FILE_BYTES = 1e6;
|
|
|
6197
6232
|
var MAX_CONTEXT_TOTAL_BYTES = 5e6;
|
|
6198
6233
|
var aiRouter = router({
|
|
6199
6234
|
/** Spawn an AI CLI process. Returns a spawnId for streaming. */
|
|
6200
|
-
spawn: protectedProcedure.input(
|
|
6201
|
-
cli:
|
|
6202
|
-
args:
|
|
6203
|
-
env:
|
|
6204
|
-
cwd:
|
|
6205
|
-
stdinData:
|
|
6206
|
-
enableMcp:
|
|
6207
|
-
mcpApiBaseUrl:
|
|
6208
|
-
mcpApiToken:
|
|
6235
|
+
spawn: protectedProcedure.input(z27.object({
|
|
6236
|
+
cli: z27.string().max(64),
|
|
6237
|
+
args: z27.array(z27.string().max(5e5)),
|
|
6238
|
+
env: z27.record(z27.string().max(256), z27.string().max(5e5)).optional(),
|
|
6239
|
+
cwd: z27.string().max(4096).optional(),
|
|
6240
|
+
stdinData: z27.string().max(1e7).optional(),
|
|
6241
|
+
enableMcp: z27.boolean().optional(),
|
|
6242
|
+
mcpApiBaseUrl: z27.string().max(512).optional(),
|
|
6243
|
+
mcpApiToken: z27.string().max(8192).optional()
|
|
6209
6244
|
})).mutation(({ input }) => {
|
|
6210
6245
|
const spawnId = aiSpawnManager.spawn(input);
|
|
6211
6246
|
return { spawnId };
|
|
6212
6247
|
}),
|
|
6213
6248
|
/** Stream stdout/stderr/exit chunks from offset. Reconnectable. */
|
|
6214
|
-
stream: protectedProcedure.input(
|
|
6215
|
-
spawnId:
|
|
6216
|
-
fromOffset:
|
|
6249
|
+
stream: protectedProcedure.input(z27.object({
|
|
6250
|
+
spawnId: z27.string().max(128),
|
|
6251
|
+
fromOffset: z27.number().int().min(0).default(0)
|
|
6217
6252
|
})).subscription(async function* ({ input }) {
|
|
6218
6253
|
try {
|
|
6219
6254
|
for await (const item of aiSpawnManager.stream(input.spawnId, input.fromOffset)) {
|
|
@@ -6227,39 +6262,39 @@ var aiRouter = router({
|
|
|
6227
6262
|
}
|
|
6228
6263
|
}),
|
|
6229
6264
|
/** Spawn an AI CLI process in a PTY (interactive mode). Returns spawnId. */
|
|
6230
|
-
spawnPty: protectedProcedure.input(
|
|
6231
|
-
cli:
|
|
6232
|
-
args:
|
|
6233
|
-
env:
|
|
6234
|
-
cwd:
|
|
6235
|
-
cols:
|
|
6236
|
-
rows:
|
|
6237
|
-
sessionId:
|
|
6238
|
-
enableMcp:
|
|
6239
|
-
mcpApiBaseUrl:
|
|
6240
|
-
mcpApiToken:
|
|
6265
|
+
spawnPty: protectedProcedure.input(z27.object({
|
|
6266
|
+
cli: z27.string().max(64),
|
|
6267
|
+
args: z27.array(z27.string().max(5e5)),
|
|
6268
|
+
env: z27.record(z27.string().max(256), z27.string().max(5e5)).optional(),
|
|
6269
|
+
cwd: z27.string().max(4096).optional(),
|
|
6270
|
+
cols: z27.number().int().min(1).max(1e3).optional(),
|
|
6271
|
+
rows: z27.number().int().min(1).max(1e3).optional(),
|
|
6272
|
+
sessionId: z27.string().max(128).optional(),
|
|
6273
|
+
enableMcp: z27.boolean().optional(),
|
|
6274
|
+
mcpApiBaseUrl: z27.string().max(512).optional(),
|
|
6275
|
+
mcpApiToken: z27.string().max(8192).optional()
|
|
6241
6276
|
})).mutation(({ input }) => {
|
|
6242
6277
|
const spawnId = aiSpawnManager.spawnPty(input);
|
|
6243
6278
|
return { spawnId };
|
|
6244
6279
|
}),
|
|
6245
6280
|
/** Find a running PTY spawn by its logical sessionId (for re-attach). */
|
|
6246
|
-
findPtyBySession: protectedProcedure.input(
|
|
6281
|
+
findPtyBySession: protectedProcedure.input(z27.object({ sessionId: z27.string().max(128) })).query(({ input }) => {
|
|
6247
6282
|
return aiSpawnManager.findPtyBySessionId(input.sessionId);
|
|
6248
6283
|
}),
|
|
6249
6284
|
/** Write input to a PTY spawn (user keystrokes). */
|
|
6250
|
-
writePty: protectedProcedure.input(
|
|
6251
|
-
spawnId:
|
|
6252
|
-
data:
|
|
6285
|
+
writePty: protectedProcedure.input(z27.object({
|
|
6286
|
+
spawnId: z27.string().max(128),
|
|
6287
|
+
data: z27.string().max(1e6)
|
|
6253
6288
|
})).mutation(({ input }) => {
|
|
6254
6289
|
const ok = aiSpawnManager.writePty(input.spawnId, input.data);
|
|
6255
6290
|
return { ok };
|
|
6256
6291
|
}),
|
|
6257
6292
|
/** Write attached-context files for an AI session to a temp dir. Returns absolute paths. */
|
|
6258
|
-
writeContextFiles: protectedProcedure.input(
|
|
6259
|
-
sessionId:
|
|
6260
|
-
files:
|
|
6261
|
-
name:
|
|
6262
|
-
content:
|
|
6293
|
+
writeContextFiles: protectedProcedure.input(z27.object({
|
|
6294
|
+
sessionId: z27.string().min(1).max(128),
|
|
6295
|
+
files: z27.array(z27.object({
|
|
6296
|
+
name: z27.string().min(1).max(256),
|
|
6297
|
+
content: z27.string().max(MAX_CONTEXT_FILE_BYTES)
|
|
6263
6298
|
})).min(1).max(MAX_CONTEXT_FILES)
|
|
6264
6299
|
}).refine(
|
|
6265
6300
|
(val) => val.files.reduce((sum, f) => sum + f.content.length, 0) <= MAX_CONTEXT_TOTAL_BYTES,
|
|
@@ -6274,25 +6309,25 @@ var aiRouter = router({
|
|
|
6274
6309
|
* which clipboard method (if any) succeeded — caller decides whether to send
|
|
6275
6310
|
* Ctrl+V (\x16) or inject `@<path>` into the PTY.
|
|
6276
6311
|
*/
|
|
6277
|
-
pasteImage: protectedProcedure.input(
|
|
6278
|
-
sessionId:
|
|
6279
|
-
mimeType:
|
|
6280
|
-
base64:
|
|
6312
|
+
pasteImage: protectedProcedure.input(z27.object({
|
|
6313
|
+
sessionId: z27.string().max(128).optional(),
|
|
6314
|
+
mimeType: z27.string().max(64),
|
|
6315
|
+
base64: z27.string().max(15e6)
|
|
6281
6316
|
})).mutation(async ({ input }) => {
|
|
6282
6317
|
const res = await savePastedImage(input.base64, input.mimeType, input.sessionId);
|
|
6283
6318
|
return res;
|
|
6284
6319
|
}),
|
|
6285
6320
|
/** Resize a PTY spawn. */
|
|
6286
|
-
resizePty: protectedProcedure.input(
|
|
6287
|
-
spawnId:
|
|
6288
|
-
cols:
|
|
6289
|
-
rows:
|
|
6321
|
+
resizePty: protectedProcedure.input(z27.object({
|
|
6322
|
+
spawnId: z27.string().max(128),
|
|
6323
|
+
cols: z27.number().int().min(1).max(1e3),
|
|
6324
|
+
rows: z27.number().int().min(1).max(1e3)
|
|
6290
6325
|
})).mutation(({ input }) => {
|
|
6291
6326
|
const ok = aiSpawnManager.resizePty(input.spawnId, input.cols, input.rows);
|
|
6292
6327
|
return { ok };
|
|
6293
6328
|
}),
|
|
6294
6329
|
/** Kill a running AI spawn. */
|
|
6295
|
-
kill: protectedProcedure.input(
|
|
6330
|
+
kill: protectedProcedure.input(z27.object({ spawnId: z27.string().max(128) })).mutation(({ input }) => {
|
|
6296
6331
|
const killed = aiSpawnManager.kill(input.spawnId);
|
|
6297
6332
|
return { ok: killed };
|
|
6298
6333
|
}),
|
|
@@ -6301,23 +6336,23 @@ var aiRouter = router({
|
|
|
6301
6336
|
return aiSpawnManager.list();
|
|
6302
6337
|
}),
|
|
6303
6338
|
/** Acknowledge receipt of all data — agent can clean up after TTL. */
|
|
6304
|
-
ack: protectedProcedure.input(
|
|
6339
|
+
ack: protectedProcedure.input(z27.object({ spawnId: z27.string().max(128) })).mutation(({ input }) => {
|
|
6305
6340
|
const acked = aiSpawnManager.ack(input.spawnId);
|
|
6306
6341
|
return { ok: acked };
|
|
6307
6342
|
}),
|
|
6308
6343
|
/** Forward a JSON-RPC request to the local codex app-server. */
|
|
6309
|
-
codexRequest: protectedProcedure.input(
|
|
6310
|
-
method:
|
|
6311
|
-
params:
|
|
6312
|
-
env:
|
|
6344
|
+
codexRequest: protectedProcedure.input(z27.object({
|
|
6345
|
+
method: z27.string().max(256),
|
|
6346
|
+
params: z27.record(z27.string(), z27.unknown()).default({}),
|
|
6347
|
+
env: z27.record(z27.string().max(256), z27.string().max(5e5)).optional()
|
|
6313
6348
|
})).mutation(async ({ input }) => {
|
|
6314
6349
|
await codexAppServerManager.ensureConnected(input.env);
|
|
6315
6350
|
const result = await codexAppServerManager.sendRequest(input.method, input.params);
|
|
6316
6351
|
return { result };
|
|
6317
6352
|
}),
|
|
6318
6353
|
/** Stream notifications from the codex app-server. Optionally filter by threadId. */
|
|
6319
|
-
codexNotifications: protectedProcedure.input(
|
|
6320
|
-
threadId:
|
|
6354
|
+
codexNotifications: protectedProcedure.input(z27.object({
|
|
6355
|
+
threadId: z27.string().max(256).optional()
|
|
6321
6356
|
}).default({})).subscription(async function* ({ input, signal }) {
|
|
6322
6357
|
await codexAppServerManager.ensureConnected();
|
|
6323
6358
|
const queue = [];
|
|
@@ -6354,13 +6389,13 @@ var aiRouter = router({
|
|
|
6354
6389
|
});
|
|
6355
6390
|
|
|
6356
6391
|
// src/trpc/routers/wiki.ts
|
|
6357
|
-
import { z as
|
|
6392
|
+
import { z as z28 } from "zod";
|
|
6358
6393
|
import { TRPCError as TRPCError6 } from "@trpc/server";
|
|
6359
6394
|
import { readFile as readFile2, readdir, stat as stat2, realpath, writeFile as writeFile6, mkdir as mkdir6, rename as rename2, rm } from "fs/promises";
|
|
6360
6395
|
import { dirname as dirname2 } from "path";
|
|
6361
6396
|
import { resolve as resolvePath3, join as join5, relative, sep } from "path";
|
|
6362
|
-
var CWD_SCHEMA2 =
|
|
6363
|
-
var REL_PATH_SCHEMA =
|
|
6397
|
+
var CWD_SCHEMA2 = z28.string().min(1).max(4096);
|
|
6398
|
+
var REL_PATH_SCHEMA = z28.string().min(1).max(512).regex(/^[A-Za-z0-9_./-]+$/).refine((p) => !p.includes("..") && !p.startsWith("/"), {
|
|
6364
6399
|
message: "Path must be a relative path without traversal"
|
|
6365
6400
|
});
|
|
6366
6401
|
var MAX_FILES = 500;
|
|
@@ -6380,9 +6415,9 @@ var IGNORED_DIRS = /* @__PURE__ */ new Set([
|
|
|
6380
6415
|
"target",
|
|
6381
6416
|
"out"
|
|
6382
6417
|
]);
|
|
6383
|
-
var RepoEntrySchema =
|
|
6384
|
-
|
|
6385
|
-
|
|
6418
|
+
var RepoEntrySchema = z28.lazy(() => z28.union([
|
|
6419
|
+
z28.object({ type: z28.literal("file"), name: z28.string(), path: z28.string() }),
|
|
6420
|
+
z28.object({ type: z28.literal("dir"), name: z28.string(), path: z28.string(), children: z28.array(RepoEntrySchema) })
|
|
6386
6421
|
]));
|
|
6387
6422
|
async function walkMarkdown(root, dir, depth, counter) {
|
|
6388
6423
|
if (depth > MAX_DEPTH || counter.n >= MAX_FILES) return [];
|
|
@@ -6452,13 +6487,13 @@ async function resolveRoot(cwd) {
|
|
|
6452
6487
|
}
|
|
6453
6488
|
}
|
|
6454
6489
|
var wikiRouter = router({
|
|
6455
|
-
listRepoMarkdown: protectedProcedure.input(
|
|
6490
|
+
listRepoMarkdown: protectedProcedure.input(z28.object({ cwd: CWD_SCHEMA2 })).query(async ({ input }) => {
|
|
6456
6491
|
const root = await resolveRoot(input.cwd);
|
|
6457
6492
|
const counter = { n: 0 };
|
|
6458
6493
|
const entries = await walkMarkdown(root, root, 0, counter);
|
|
6459
6494
|
return { root, entries, truncated: counter.n >= MAX_FILES };
|
|
6460
6495
|
}),
|
|
6461
|
-
readRepoMarkdown: protectedProcedure.input(
|
|
6496
|
+
readRepoMarkdown: protectedProcedure.input(z28.object({ cwd: CWD_SCHEMA2, path: REL_PATH_SCHEMA })).query(async ({ input }) => {
|
|
6462
6497
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
6463
6498
|
throw new TRPCError6({ code: "BAD_REQUEST", message: "Seuls les .md sont autoris\xE9s" });
|
|
6464
6499
|
}
|
|
@@ -6484,10 +6519,10 @@ var wikiRouter = router({
|
|
|
6484
6519
|
const content = await readFile2(realTarget, "utf-8");
|
|
6485
6520
|
return { path: input.path, content };
|
|
6486
6521
|
}),
|
|
6487
|
-
writeMarkdown: protectedProcedure.input(
|
|
6522
|
+
writeMarkdown: protectedProcedure.input(z28.object({
|
|
6488
6523
|
cwd: CWD_SCHEMA2,
|
|
6489
6524
|
path: REL_PATH_SCHEMA,
|
|
6490
|
-
content:
|
|
6525
|
+
content: z28.string().max(5e6)
|
|
6491
6526
|
})).mutation(async ({ input }) => {
|
|
6492
6527
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
6493
6528
|
throw new TRPCError6({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
@@ -6498,7 +6533,7 @@ var wikiRouter = router({
|
|
|
6498
6533
|
await writeFile6(target, input.content, "utf-8");
|
|
6499
6534
|
return { path: input.path, ok: true };
|
|
6500
6535
|
}),
|
|
6501
|
-
createFile: protectedProcedure.input(
|
|
6536
|
+
createFile: protectedProcedure.input(z28.object({ cwd: CWD_SCHEMA2, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
6502
6537
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
6503
6538
|
throw new TRPCError6({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
6504
6539
|
}
|
|
@@ -6514,13 +6549,13 @@ var wikiRouter = router({
|
|
|
6514
6549
|
await writeFile6(target, "", "utf-8");
|
|
6515
6550
|
return { path: input.path, ok: true };
|
|
6516
6551
|
}),
|
|
6517
|
-
createDir: protectedProcedure.input(
|
|
6552
|
+
createDir: protectedProcedure.input(z28.object({ cwd: CWD_SCHEMA2, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
6518
6553
|
const root = await resolveRoot(input.cwd);
|
|
6519
6554
|
const target = await resolveSafePath(root, input.path, false);
|
|
6520
6555
|
await mkdir6(target, { recursive: true });
|
|
6521
6556
|
return { path: input.path, ok: true };
|
|
6522
6557
|
}),
|
|
6523
|
-
renamePath: protectedProcedure.input(
|
|
6558
|
+
renamePath: protectedProcedure.input(z28.object({
|
|
6524
6559
|
cwd: CWD_SCHEMA2,
|
|
6525
6560
|
fromPath: REL_PATH_SCHEMA,
|
|
6526
6561
|
toPath: REL_PATH_SCHEMA
|
|
@@ -6538,14 +6573,14 @@ var wikiRouter = router({
|
|
|
6538
6573
|
await rename2(from, to);
|
|
6539
6574
|
return { fromPath: input.fromPath, toPath: input.toPath, ok: true };
|
|
6540
6575
|
}),
|
|
6541
|
-
ensureRoot: protectedProcedure.input(
|
|
6576
|
+
ensureRoot: protectedProcedure.input(z28.object({ cwd: CWD_SCHEMA2 })).mutation(async ({ input }) => {
|
|
6542
6577
|
const expanded = expandEnvVar(input.cwd);
|
|
6543
6578
|
const abs = resolvePath3(expanded);
|
|
6544
6579
|
await mkdir6(abs, { recursive: true });
|
|
6545
6580
|
const root = await realpath(abs);
|
|
6546
6581
|
return { root, ok: true };
|
|
6547
6582
|
}),
|
|
6548
|
-
deletePath: protectedProcedure.input(
|
|
6583
|
+
deletePath: protectedProcedure.input(z28.object({ cwd: CWD_SCHEMA2, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
6549
6584
|
const root = await resolveRoot(input.cwd);
|
|
6550
6585
|
const target = await resolveSafePath(root, input.path, true);
|
|
6551
6586
|
if (target === root) {
|