@runeya/runeya 2.0.117 → 2.0.119
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 +47 -4
- package/agent/index.js.map +1 -1
- package/agent-manager-ACPQWUZ5.js +9 -0
- package/{chat-QLIFNGA2.js → chat-PXMMZIAY.js} +6 -6
- package/{chunk-K3H5WJRQ.js → chunk-22RJM654.js} +502 -223
- package/chunk-22RJM654.js.map +1 -0
- package/{chunk-OGCEFBSS.js → chunk-2WXQIUVC.js} +7 -2
- package/chunk-2WXQIUVC.js.map +1 -0
- package/{chunk-77UQ2UKW.js → chunk-GIHR3BGT.js} +2 -2
- package/{chunk-6T7R2JZR.js → chunk-H6VIS4OY.js} +54 -5
- package/chunk-H6VIS4OY.js.map +1 -0
- package/{chunk-F7A7XH3N.js → chunk-NYKFDU76.js} +18 -6
- package/{chunk-F7A7XH3N.js.map → chunk-NYKFDU76.js.map} +1 -1
- package/{companion-RLSRXTNO.js → companion-4RQ3AMOL.js} +4 -4
- package/{desktop-launcher-Q6J2LSVP.js → desktop-launcher-ADGRYF4S.js} +2 -2
- package/index.js +4 -4
- package/mcp-server/index.js +16 -0
- package/mcp-server/index.js.map +1 -1
- package/package.json +1 -1
- package/settings-manager-2C7RY6ZC.js +9 -0
- package/{src-Q2AWI57U.js → src-NRKK27F3.js} +94 -11
- package/src-NRKK27F3.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-DeDCprCi.js +13 -0
- package/web/assets/AgentTerminalPage-CVM-_xua.js +1 -0
- package/web/assets/AiChatPage-C0XGalM7.js +1 -0
- package/web/assets/AppLayout-DWE2gGEG.js +1 -0
- package/web/assets/AuditPage-CtEaUBZG.js +1 -0
- package/web/assets/CloudAccountPage-FtuRCNIq.js +1 -0
- package/web/assets/CloudAccountPage-snaQ5_Jz.js +1 -0
- package/web/assets/CloudMessagingPage-BhU4VarW.js +2 -0
- package/web/assets/DashboardPage-DMek59Ua.js +164 -0
- package/web/assets/DirectoryPickerDialog-DzhKixt4.js +1 -0
- package/web/assets/{EditorIcon-DoAjQCrb.js → EditorIcon-Co787SMb.js} +2 -2
- package/web/assets/{EnvironmentForm-CgsN_8EO.js → EnvironmentForm-B9EQlz9_.js} +2 -2
- package/web/assets/EnvironmentFormPage-_iZpn0PZ.js +1 -0
- package/web/assets/EnvironmentListPage-lviQTpL1.js +1 -0
- package/web/assets/KanbanBoardPage-jJKcNxVt.js +4 -0
- package/web/assets/KanbanListPage-CjDSP-NZ.js +1 -0
- package/web/assets/LaunchProjectPage-CCg2nziO.js +1 -0
- package/web/assets/LaunchServicesPage-EhKBO0tS.js +1 -0
- package/web/assets/LogViewer-BOcmkQJk.js +3 -0
- package/web/assets/OrgKeyPrompt-FXuwB-qF.js +1 -0
- package/web/assets/{ProcessControls-BAThUaVo.js → ProcessControls-Bl71hMFi.js} +1 -1
- package/web/assets/ProcessDetailPage-BepAK0mH.js +1 -0
- package/web/assets/{ProcessMetrics-BnfF7Esx.js → ProcessMetrics-eRNYH_T3.js} +2 -2
- package/web/assets/RandomJobTestPage-BzhLqqcX.js +2 -0
- package/web/assets/ScenarioEditorPage-RAo2HXny.js +14 -0
- package/web/assets/SendToChatDialog-YAcjNz8G.js +1 -0
- package/web/assets/ServiceControlsBar-C4CLmYs1.js +1 -0
- package/web/assets/ServiceDetailPage-NrtsPPS2.js +2 -0
- package/web/assets/ServiceFormPage-DpzK--N_.js +1 -0
- package/web/assets/SettingsPage-Cov2c6gi.js +2063 -0
- package/web/assets/UnlockPage-CZ4UXjxV.js +1 -0
- package/web/assets/VaultMigrationPage-D7YkLOgt.js +1 -0
- package/web/assets/VersionBadge-DfU2xGOy.js +1 -0
- package/web/assets/WikiPage-AuxO0ZRo.js +1 -0
- package/web/assets/WikiView-YO32SMjf.js +1 -0
- package/web/assets/add-scalar-classes-BSy1Q2x9.js +387 -0
- package/web/assets/{autocomplete-DVfF8-mq.js → autocomplete-CRDXI2af.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-D8aU5xwY.js → basic-shape-diamond.svg-DrxPStJk.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-C48LyQUE.js → basic-shape-hexagon.svg-CvQGeMns.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-Cn4csfd0.js → basic-shape-primary-circle-ellipse-round.svg-fUTtI4Zn.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-C9Hhhoy0.js → basic-shape-primary-square-rectangle.svg-AxYjsCMg.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-BtyWy6Hb.js → basic-shape-shield.svg-DejoQ-qp.js} +1 -1
- package/web/assets/{browser-D-xywlrw.js → browser-AcVcyRyj.js} +1 -1
- package/web/assets/{browser-SQJu0kqP.js → browser-CgHmtA33.js} +1 -1
- package/web/assets/card-DYXJ9e_6.js +32 -0
- package/web/assets/{checkbox-bUKoFar-.js → checkbox-BNsS_laY.js} +3 -3
- package/web/assets/{chip-FS8CF7nQ.js → chip-CLhx1BN5.js} +2 -2
- package/web/assets/client-DWF3UIg2.js +24 -0
- package/web/assets/cloud-chat.store-BrkQ6sdy.js +1 -0
- package/web/assets/cloud-client-BVamD4zV.js +1 -0
- package/web/assets/cloud-session-BsAfbgkv.js +1 -0
- package/web/assets/{cloud-session-D9RcOxiL.js → cloud-session-DVRHDddo.js} +2 -2
- package/web/assets/column-CVMI7gfk.js +763 -0
- package/web/assets/{computer-device-desktop-monitor.svg-MSBAl_IT.js → computer-device-desktop-monitor.svg-BNF_S7yY.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-CEWAl-1r.js → computer-device-desktop.svg-Ulf27hxx.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-DQ1d2ADo.js → computer-device-laptop.svg-I-skOtmX.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-Dzz2XEW6.js → computer-device-mobile-phone-android-samsung-back.svg-_uk-aAy4.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-BfiSZRYt.js → computer-device-mobile-phone-android-samsung.svg-oHv8Jcw4.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-BKDNa4ua.js → computer-device-mobile-phone-iphone-x-back.svg-nYNHlByZ.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CxwOtpMv.js → computer-device-mobile-phone-iphone-x.svg-BNV8yMsz.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-D-d6m_kv.js → computer-device-mobile-tablet-touch.svg-D6eYCphm.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-D8b5on89.js → computer-device-mobile-tablet.svg-BrVxasnX.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-c-FuyKH3.js → computer-device-network-ethernet-cat6.svg-kBDyvmFe.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-DVIwP-3w.js → computer-device-network-lan-www.svg-DxCA3g5k.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-BXtM5IP8.js → computer-device-network-wifi-connection.svg-PIA_jdq6.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-D0MA5S5K.js → computer-device-network-wifi-router.svg-BmIHCgnZ.js} +1 -1
- package/web/assets/{cssMode-C1ocy9fG.js → cssMode-DACHwZVM.js} +1 -1
- package/web/assets/{divider-DaQ67Uqu.js → divider-CTmL86NV.js} +2 -2
- package/web/assets/{docx-preview-D2pXpGJL.js → docx-preview-8mHccyHq.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-BC5h7SBw.js → ecology-science-erlenmeyer-flask.svg-CPPf1sQr.js} +1 -1
- package/web/assets/{fieldset-DASecQzo.js → fieldset-BU42Vd0z.js} +2 -2
- package/web/assets/{freemarker2-Co24PBKb.js → freemarker2-DqgOX6Fn.js} +1 -1
- package/web/assets/{handlebars-BiGhhRTT.js → handlebars-TTBBMGWH.js} +1 -1
- package/web/assets/{html-jVmuH_kg.js → html-DGf_odQm.js} +1 -1
- package/web/assets/{htmlMode-DfGryePh.js → htmlMode-D-LSVgqS.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-pmP3Tybf.js → image-flash-lightning.svg-uW6nZ9pC.js} +1 -1
- package/web/assets/{image-picture-flower.svg-D5oOhzzg.js → image-picture-flower.svg-oWXTRzBB.js} +1 -1
- package/web/assets/index-BS0htmo7.js +5021 -0
- package/web/assets/index-qjiWPMcS.css +1 -0
- package/web/assets/{interface-alert-exclamation-diamond.svg-H0YNQW-M.js → interface-alert-exclamation-diamond.svg-svwX9rGg.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-MmLyfLsu.js → interface-alert-exclamation-triangle-warning.svg-1SqtE207.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-DPtcCWUk.js → interface-alert-information-circle.svg-DAQzRiWG.js} +1 -1
- package/web/assets/{interface-award-crown.svg-D4TDd5uG.js → interface-award-crown.svg-BLlwNnLN.js} +1 -1
- package/web/assets/{interface-bookmark.svg-BOJKIiPZ.js → interface-bookmark-tag.svg-DKcxOCPe.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-DY2HHX7j.js → interface-bookmark.svg-B0PZfyfo.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-Ml9gQeRQ.js → interface-calendar-date-one.svg-GFId7gEg.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-DjrtXzto.js → interface-content-book-open-pages.svg-C9mxvbj7.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-C7WDuE63.js → interface-content-book-page.svg-DTVIL4CZ.js} +1 -1
- package/web/assets/{interface-content-file.svg-Bj1fDi8J.js → interface-content-file.svg-9Hhcuha8.js} +1 -1
- package/web/assets/{interface-content-folder.svg-CtoSNYlE.js → interface-content-folder.svg-BRjBwjv5.js} +1 -1
- package/web/assets/interface-content-folder.svg-fC-vaV4V.js +1 -0
- package/web/assets/{interface-copy-clipboard.svg-CndmGYGb.js → interface-copy-clipboard.svg-DHujfKOA.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-C8GKdk_Y.js → interface-edit-attachment.svg-BNtrRzRD.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-JwEBvvNd.js → interface-edit-binocular.svg-C7m9_XJl.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-dhVstxFv.js → interface-edit-magic-wand.svg-MVh7T2FU.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-BOT-wlXa.js → interface-edit-tool-paint-roller.svg-CG3Q3Sfa.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-Bkzz_y5T.js → interface-edit-tool-pencil.svg-Cjm_wnC_.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-CUsXllHu.js → interface-favorite-award.svg-CFCGPZr8.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-D4tuSHHG.js → interface-favorite-flag.svg-BaANsqND.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-D-HpTcun.js → interface-favorite-heart.svg-B2YfjK1B.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-Cud3tgeY.js → interface-favorite-star.svg-DdIZAOnM.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-CSCGE6jh.js → interface-favorite-stars-sparkles.svg-DErOt3d0.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-qBM4FMpY.js → interface-hierarchy-flowchart.svg-CegEwz_L.js} +1 -1
- package/web/assets/{interface-home-house.svg-YhTW7PqZ.js → interface-home-house.svg-DEnpyywi.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-SzbaajGz.js → interface-hyperlink.svg-APXQWsOQ.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-C2-5tyeD.js → interface-lighting-brightness.svg-Bt8UdEVE.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-gcAhT36X.js → interface-lock-closed.svg-DUhKy22h.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-BC3s82xO.js → interface-lock-open-unlock.svg-D80GZ0WK.js} +1 -1
- package/web/assets/{interface-login-key.svg-C-2XbaU2.js → interface-login-key.svg-BUZuQC4z.js} +1 -1
- package/web/assets/{interface-search.svg-B0QE3jtv.js → interface-search.svg-C1SGbWh4.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-D3xvk8YU.js → interface-setting-cog.svg-BhT06xOL.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-CRa9esm0.js → interface-share-megaphone-bullhorn.svg-DNA0-4pd.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-TdCeEZOl.js → interface-share-rocket.svg-DyZYsdtW.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-DZTk90vq.js → interface-share-satellite.svg-BnHfHXGT.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-C_8R9-Nb.js → interface-share-space-ship.svg-q8JaUlaM.js} +1 -1
- package/web/assets/{interface-share.svg-CUenxjcS.js → interface-share.svg-dfMV_q01.js} +1 -1
- package/web/assets/{interface-signal-square.svg-CM6pbneT.js → interface-signal-square.svg-BZAXvGUW.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-DaKkRSPs.js → interface-time-clock-circle.svg-fmTRjz7L.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-BupwUgts.js → interface-time-hour-glass.svg--hxc1m2W.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-C3UEzidB.js → interface-users-multiple.svg-CnachJBj.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-DuiN-Lpe.js → interface-weather-moon.svg-AoEOz9T0.js} +1 -1
- package/web/assets/{javascript-cyCZQpCs.js → javascript-DYRKHLYc.js} +1 -1
- package/web/assets/{jsonMode-C7bOJkxl.js → jsonMode-CpdzwU9F.js} +2 -2
- package/web/assets/{liquid-wNd-_zNC.js → liquid-D9vCKfST.js} +1 -1
- package/web/assets/{lspLanguageFeatures-BLqGpyw3.js → lspLanguageFeatures-BCeM67u6.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-DYRNn-F8.js → mail-chat-bubble-square.svg-CcgRWmuD.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-C52yHOX7.js → mail-send-email-paper-airplane.svg-C053lctJ.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-0-Xc7oiy.js → mail-send-envelope.svg-Dij10Q_i.js} +1 -1
- package/web/assets/{mdx-Q8jGyneU.js → mdx-DLUKh9ow.js} +1 -1
- package/web/assets/{minus-DytRiHhn.js → minus-DZytaOJc.js} +2 -2
- package/web/assets/modal-DYL3DOz1.js +1 -0
- package/web/assets/modal-idM6wRD1.js +5 -0
- package/web/assets/{money-cashier-receipt.svg-vbdCrl5f.js → money-cashier-receipt.svg-CZ4os1uZ.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-B0WPo5zD.js → money-currency-dollar-pay.svg-Denbm12e.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-u1MYvAWb.js → money-graph-arrow-increase.svg-CGE6Sbr2.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg--vnvg38g.js → money-graph-bar-chart-increase.svg-Smi2NzVH.js} +1 -1
- package/web/assets/multiselect-D8chjo1K.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-Bm86NNsZ.js → nature-ecology-leaf.svg-DUos6Bhh.js} +1 -1
- package/web/assets/{password-D4dFyeDf.js → password-CBJ4yfim.js} +4 -4
- package/web/assets/{phone-telephone.svg-CDu0gfrF.js → phone-telephone.svg-DqjTWhHK.js} +1 -1
- package/web/assets/{plus-DyqgWY-p.js → plus-CdM2ZQyx.js} +6 -6
- package/web/assets/process.store-BxdP--c-.js +1 -0
- package/web/assets/{programming-bug.svg-GOtIFzyq.js → programming-bug.svg-zpx99bTR.js} +1 -1
- package/web/assets/{programming-cloud.svg-Dob7Yyhx.js → programming-cloud.svg-Dw198CLB.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-BL9a2tMm.js → programming-computer-database-server.svg-BaanLqUL.js} +1 -1
- package/web/assets/{programming-computer-database.svg-CvSRjqHa.js → programming-computer-database.svg-y5Qcgysz.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-HWf5upwd.js → programming-module-four-layout.svg-DQ8HcjMz.js} +1 -1
- package/web/assets/{programming-module-three.svg-v9W9DdQq.js → programming-module-three.svg-CbgPevqj.js} +1 -1
- package/web/assets/{programming-module.svg-BHJLgt2p.js → programming-module.svg-deAnzVVR.js} +1 -1
- package/web/assets/{programming-script-code.svg-BDIXsnT6.js → programming-script-code.svg-D2Qn3_1w.js} +1 -1
- package/web/assets/project-launch.store-Cjco1dyN.js +1 -0
- package/web/assets/project.store-pEhSKAS1.js +1 -0
- package/web/assets/{python-C_Cyv2aj.js → python-UJjSlB62.js} +1 -1
- package/web/assets/{radiobutton-F_E8D321.js → radiobutton-D8PPlyvM.js} +2 -2
- package/web/assets/{razor-DustIlxk.js → razor-CA1xRhq3.js} +1 -1
- package/web/assets/router-B7qnUbTf.js +1 -0
- package/web/assets/settings-scope-QgZMDCpD.js +1 -0
- package/web/assets/{settings.store-CaQ6QeSL.js → settings.store-C3_pPTwT.js} +1 -1
- package/web/assets/{shopping-cart.svg-DyoeDwG3.js → shopping-cart.svg-BKmjHX4l.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-BKPtii5v.js → shopping-gift-present.svg-HKKyiGmo.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-BvBFvRrd.js → shopping-shipping-box-parcel-package.svg-kTMFl43_.js} +1 -1
- package/web/assets/src-CkWablLs.js +1 -0
- package/web/assets/src-DfWVY3Sc.js +572 -0
- package/web/assets/{tabpanel-BbQfLmF1.js → tabpanel-BCGYata1.js} +3 -3
- package/web/assets/{tag-new-circle.svg-hTnv3ssK.js → tag-new-circle.svg-D9B5tiv9.js} +1 -1
- package/web/assets/theme-Lxx3iG7K.js +1 -0
- package/web/assets/{toggleswitch-Ct_pe9Y7.js → toggleswitch-TdY2vwYU.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-CpkewKvu.js → travel-map-earth-globe.svg-D4jsI9PN.js} +1 -1
- package/web/assets/trpc-D86IoEhq.js +1 -0
- package/web/assets/{tsMode-WejVCjTD.js → tsMode-D7Nw-uk2.js} +5 -5
- package/web/assets/{typescript-Bhy-yTki.js → typescript-CO_htKpJ.js} +1 -1
- package/web/assets/useAiChatDrawer-B6JN2q-b.js +1 -0
- package/web/assets/{useCloudOrg-DyonGJWX.js → useCloudOrg-wQX-0p6v.js} +1 -1
- package/web/assets/useEnvVarAutocomplete-DfdXSaqd.js +1 -0
- package/web/assets/useEnvVarAutocomplete-DsxEF6Ya.css +1 -0
- package/web/assets/useProjectCatalog-kHRSO0K2.js +1 -0
- package/web/assets/{useProjectCloudOrg-hi8bDROZ.js → useProjectCloudOrg-B13niYUp.js} +1 -1
- package/web/assets/useServiceUrlHost-DtUQvKz3.js +1 -0
- package/web/assets/{xml-DhE3CKSm.js → xml-JzyfGwW6.js} +1 -1
- package/web/assets/{yaml-BnNl--CF.js → yaml-C9s-8a68.js} +1 -1
- package/web/index.html +2 -2
- package/agent-manager-APY7SZ75.js +0 -9
- package/chunk-6T7R2JZR.js.map +0 -1
- package/chunk-K3H5WJRQ.js.map +0 -1
- package/chunk-OGCEFBSS.js.map +0 -1
- package/settings-manager-MQBUCUIO.js +0 -9
- package/src-Q2AWI57U.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-DVTbGHHm.js +0 -13
- package/web/assets/AgentTerminalPage-BK1JBjF7.js +0 -1
- package/web/assets/AiChatPage-CzLTf0Dh.js +0 -1
- package/web/assets/AppLayout-DIpd73gZ.js +0 -1
- package/web/assets/AuditPage-DDemuQXR.js +0 -1
- package/web/assets/CloudAccountPage-BW4UfXnM.js +0 -1
- package/web/assets/CloudAccountPage-f9nRZeNR.js +0 -1
- package/web/assets/CloudMessagingPage-2gjGcJwo.js +0 -2
- package/web/assets/DashboardPage-2qCxx4Sm.js +0 -164
- package/web/assets/DirectoryPickerDialog-DxxSRtWi.js +0 -1
- package/web/assets/EnvironmentFormPage-Cg6oojrW.js +0 -1
- package/web/assets/EnvironmentListPage-DgQaxPct.js +0 -1
- package/web/assets/KanbanBoardPage-C2zkv8-3.js +0 -4
- package/web/assets/KanbanListPage-nH2wjGBV.js +0 -1
- package/web/assets/LaunchProjectPage-CGr9lWsC.js +0 -1
- package/web/assets/LaunchServicesPage-CLGbYznW.js +0 -1
- package/web/assets/LogViewer-CxPBFVR1.js +0 -3
- package/web/assets/OrgKeyPrompt-bIIIdk_5.js +0 -1
- package/web/assets/ProcessDetailPage-Uh2TiAAJ.js +0 -1
- package/web/assets/RandomJobTestPage-D7j9GCJM.js +0 -2
- package/web/assets/ScenarioEditorPage-Ct8pvptW.js +0 -14
- package/web/assets/SendToChatDialog-Byzw5hfV.js +0 -1
- package/web/assets/ServiceControlsBar-Dht6GO3P.js +0 -1
- package/web/assets/ServiceDetailPage-CbeFd4R4.js +0 -2
- package/web/assets/ServiceFormPage-BNbDJB1o.js +0 -1
- package/web/assets/SettingsPage-Dxhmpet-.js +0 -2063
- package/web/assets/UnlockPage-DJfS33Iu.js +0 -1
- package/web/assets/VaultMigrationPage-2bVNCDJk.js +0 -1
- package/web/assets/VersionBadge-1RvUznxK.js +0 -1
- package/web/assets/WikiPage-Ck-HfGMo.js +0 -1
- package/web/assets/WikiView-DnZi2CXf.js +0 -1
- package/web/assets/add-scalar-classes-DZeMJUzs.js +0 -387
- package/web/assets/card-C0WVIEBg.js +0 -32
- package/web/assets/client-DKfN77U3.js +0 -24
- package/web/assets/cloud-chat.store-C0O-wJT9.js +0 -1
- package/web/assets/cloud-client-D4Mr6l0A.js +0 -1
- package/web/assets/cloud-session-kXf1tl4W.js +0 -1
- package/web/assets/column-BGKAKQS9.js +0 -763
- package/web/assets/index-DBUGVNfV.js +0 -4825
- package/web/assets/index-nUGeXteT.css +0 -1
- package/web/assets/interface-content-folder.svg-DGDMeUjj.js +0 -1
- package/web/assets/modal-DIpZHaX_.js +0 -1
- package/web/assets/modal-Dx2t6N7O.js +0 -5
- package/web/assets/multiselect-0FlwwPJ2.js +0 -251
- package/web/assets/process.store-Dy_a775l.js +0 -1
- package/web/assets/project-launch.store-BFSsFFjl.js +0 -1
- package/web/assets/project.store-CbypuRJa.js +0 -1
- package/web/assets/router-BujVDJWr.js +0 -1
- package/web/assets/settings-scope-hbAQWfja.js +0 -1
- package/web/assets/src-40AEWC6e.js +0 -1
- package/web/assets/src-BsM0Obsp.css +0 -1
- package/web/assets/src-CagkHqfs.js +0 -197
- package/web/assets/src-XBWUvtlx.js +0 -572
- package/web/assets/theme-CXVscC2X.js +0 -1
- package/web/assets/trpc-C5MKhb-3.js +0 -1
- package/web/assets/useAiChatDrawer-tRwj5DTE.js +0 -1
- package/web/assets/useEnvVarAutocomplete-DFNddwqp.css +0 -1
- package/web/assets/useEnvVarAutocomplete-wZvdJ--F.js +0 -1
- package/web/assets/useProjectCatalog-tOf78QC4.js +0 -1
- package/web/assets/useServiceUrlHost-B9WSS4Mi.js +0 -1
- package/web/assets/w3c-keyname-tfhvQ9CV.js +0 -1
- /package/{agent-manager-APY7SZ75.js.map → agent-manager-ACPQWUZ5.js.map} +0 -0
- /package/{chat-QLIFNGA2.js.map → chat-PXMMZIAY.js.map} +0 -0
- /package/{chunk-77UQ2UKW.js.map → chunk-GIHR3BGT.js.map} +0 -0
- /package/{companion-RLSRXTNO.js.map → companion-4RQ3AMOL.js.map} +0 -0
- /package/{desktop-launcher-Q6J2LSVP.js.map → desktop-launcher-ADGRYF4S.js.map} +0 -0
- /package/{settings-manager-MQBUCUIO.js.map → settings-manager-2C7RY6ZC.js.map} +0 -0
- /package/web/assets/{abap-DblxFMgX.js → abap-cDlgWO6H.js} +0 -0
- /package/web/assets/{apex-C_fmPlQy.js → apex-DxzSGotK.js} +0 -0
- /package/web/assets/{azcli-D73HZyav.js → azcli-CUNfZLtQ.js} +0 -0
- /package/web/assets/{bat-Br4Biw6V.js → bat-C-oKGifY.js} +0 -0
- /package/web/assets/{bicep-Cwg6_V-m.js → bicep-C4xTl9QV.js} +0 -0
- /package/web/assets/{browser-D6yPejPt.js → browser-CE5P0iHW.js} +0 -0
- /package/web/assets/{cameligo-Dq6Izwzi.js → cameligo-COpO1ZvP.js} +0 -0
- /package/web/assets/{clojure-U0exYVUx.js → clojure-D8gp5eAN.js} +0 -0
- /package/web/assets/{coffee-mPGPozSE.js → coffee-De9HMN-q.js} +0 -0
- /package/web/assets/{cpp-lpr_PQMA.js → cpp-C4pJyeKy.js} +0 -0
- /package/web/assets/{csharp-saQQwY3s.js → csharp-B4wLqqiU.js} +0 -0
- /package/web/assets/{csp-CcDpUBZN.js → csp-Do0Gg4qE.js} +0 -0
- /package/web/assets/{css-D6QFYBbL.js → css-BLq1nXK0.js} +0 -0
- /package/web/assets/{cypher-B_4KCq-w.js → cypher-CDQzi0TV.js} +0 -0
- /package/web/assets/{dart-CgLuovz1.js → dart-bTPYn7bY.js} +0 -0
- /package/web/assets/{dockerfile-DObNIc52.js → dockerfile-yM7ZnQpo.js} +0 -0
- /package/web/assets/{ecl-BpCwjSsH.js → ecl-BgTpp_c4.js} +0 -0
- /package/web/assets/{elixir-CebZWKus.js → elixir-DO7wJ1ib.js} +0 -0
- /package/web/assets/{flow9-DhoDs9JD.js → flow9-B2Ko_py3.js} +0 -0
- /package/web/assets/{fsharp-YDWqgr0W.js → fsharp-DNdx3wKW.js} +0 -0
- /package/web/assets/{go-CaPX4mu5.js → go-D7LajbkE.js} +0 -0
- /package/web/assets/{graphql-DOSo46Ed.js → graphql-BCQSwUPo.js} +0 -0
- /package/web/assets/{hcl-nSYpx4qj.js → hcl-DR3uNUXT.js} +0 -0
- /package/web/assets/{ini-Ca22qQIM.js → ini-zkzQPitL.js} +0 -0
- /package/web/assets/{java-KrQduvTo.js → java-YFwuCa4S.js} +0 -0
- /package/web/assets/{julia-Bb2MDsY_.js → julia-WWwv4jLR.js} +0 -0
- /package/web/assets/{kotlin-DB7e82Vg.js → kotlin-FwlJkapy.js} +0 -0
- /package/web/assets/{less-K5fiQqgY.js → less-CyhHW1nH.js} +0 -0
- /package/web/assets/{lexon-Do9EcqkA.js → lexon-BScN_v1c.js} +0 -0
- /package/web/assets/{lua-DU9Dpzvs.js → lua-eWb9GpZJ.js} +0 -0
- /package/web/assets/{m3-pF6PmPkL.js → m3-C4NDU793.js} +0 -0
- /package/web/assets/{markdown-BNRSTD3D.js → markdown-DWWpXAtL.js} +0 -0
- /package/web/assets/{mips-OIXxWbNl.js → mips-BpJKGw00.js} +0 -0
- /package/web/assets/{msdax-Blzk7oHr.js → msdax-BiuvyZwP.js} +0 -0
- /package/web/assets/{mysql-CISO3r5e.js → mysql-DJW9Aa9q.js} +0 -0
- /package/web/assets/{objective-c-CfnC_OAj.js → objective-c-YouNnWOW.js} +0 -0
- /package/web/assets/{pascal-BUF-IB2S.js → pascal-jQsRnBre.js} +0 -0
- /package/web/assets/{pascaligo-BKce2a7P.js → pascaligo-DZI84_dt.js} +0 -0
- /package/web/assets/{perl-BSNQJqG3.js → perl-D9TKt-s6.js} +0 -0
- /package/web/assets/{pgsql-B6gnZ9Pz.js → pgsql-DXgI6ehC.js} +0 -0
- /package/web/assets/{php-D3DRjlE-.js → php-Cgqd4wfW.js} +0 -0
- /package/web/assets/{pla-DMkpEwWz.js → pla-DRDkvVUU.js} +0 -0
- /package/web/assets/{postiats-CS9vJAK8.js → postiats-BOLeCCau.js} +0 -0
- /package/web/assets/{powerquery-5wdkUpGP.js → powerquery-DCDtPNBU.js} +0 -0
- /package/web/assets/{powershell-CFy-OLZK.js → powershell-WnZ4e5ia.js} +0 -0
- /package/web/assets/{protobuf-BexdMU0z.js → protobuf-C9Dg-C9o.js} +0 -0
- /package/web/assets/{pug-D7XxQLO5.js → pug-Dr8RhWun.js} +0 -0
- /package/web/assets/{qsharp-Cbf2FpNP.js → qsharp-DukGWvWZ.js} +0 -0
- /package/web/assets/{r-DF7k9FbU.js → r-BC41pTgC.js} +0 -0
- /package/web/assets/{redis-CsS7YEaP.js → redis-D-gYIUku.js} +0 -0
- /package/web/assets/{redshift-ELXdujA0.js → redshift-r0XbF8XS.js} +0 -0
- /package/web/assets/{restructuredtext-xoFIa5lj.js → restructuredtext-DsJDS7Eu.js} +0 -0
- /package/web/assets/{ruby-BqZs-MXO.js → ruby-JPrm3ODz.js} +0 -0
- /package/web/assets/{rust-Bg6ZO_et.js → rust-C8IjEXni.js} +0 -0
- /package/web/assets/{sb-DiB12F6v.js → sb-D8vNiFl9.js} +0 -0
- /package/web/assets/{scala-DElpnKpP.js → scala-DThahuqf.js} +0 -0
- /package/web/assets/{scheme-1ahRBKOq.js → scheme-CvEQUYYf.js} +0 -0
- /package/web/assets/{scss-DEMPy3QV.js → scss-C6obpl8K.js} +0 -0
- /package/web/assets/{shell-DPy86lBu.js → shell-BnVmd31t.js} +0 -0
- /package/web/assets/{solidity-BJ26fCkf.js → solidity-Bo6zEybc.js} +0 -0
- /package/web/assets/{sophia-BisqpnJK.js → sophia-DuB3Px8n.js} +0 -0
- /package/web/assets/{sparql-C7Lhhim4.js → sparql-CW9HqMW2.js} +0 -0
- /package/web/assets/{sql-BXVElqbr.js → sql-CPCPCQON.js} +0 -0
- /package/web/assets/{st-C3Kk-cML.js → st-AxC3n-1-.js} +0 -0
- /package/web/assets/{swift-D8IWJydR.js → swift-CgZOS_MZ.js} +0 -0
- /package/web/assets/{systemverilog-524SrI2Q.js → systemverilog-DYR-yx39.js} +0 -0
- /package/web/assets/{tcl-MYNTx-d-.js → tcl-4hAvWv0d.js} +0 -0
- /package/web/assets/{twig-BAVZN0tW.js → twig-Cf_07aFW.js} +0 -0
- /package/web/assets/{typespec-BhgMHLJQ.js → typespec-2tXj8s11.js} +0 -0
- /package/web/assets/{vb-BLauMmY8.js → vb-DLpM4f4s.js} +0 -0
- /package/web/assets/{wgsl-ybvhdvmz.js → wgsl-BcECae_z.js} +0 -0
|
@@ -31,7 +31,7 @@ import {
|
|
|
31
31
|
runCompanionNow,
|
|
32
32
|
syncConversationFromClaudeTranscript,
|
|
33
33
|
verifyJwt
|
|
34
|
-
} from "./chunk-
|
|
34
|
+
} from "./chunk-NYKFDU76.js";
|
|
35
35
|
import {
|
|
36
36
|
agentManager,
|
|
37
37
|
agentStore,
|
|
@@ -51,10 +51,10 @@ import {
|
|
|
51
51
|
rememberFile,
|
|
52
52
|
serviceStore,
|
|
53
53
|
wasRead
|
|
54
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-2WXQIUVC.js";
|
|
55
55
|
import {
|
|
56
56
|
settingsManager
|
|
57
|
-
} from "./chunk-
|
|
57
|
+
} from "./chunk-GIHR3BGT.js";
|
|
58
58
|
import {
|
|
59
59
|
AGENT_STOP_FETCH_TIMEOUT,
|
|
60
60
|
ApiKeysFileSchema,
|
|
@@ -62,6 +62,7 @@ import {
|
|
|
62
62
|
HealthCheckSchema,
|
|
63
63
|
JSLogParserSchema,
|
|
64
64
|
LogSourceConfigSchema,
|
|
65
|
+
MissingVariableSchema,
|
|
65
66
|
RestartStrategySchema,
|
|
66
67
|
ScenarioSchema,
|
|
67
68
|
ServiceCommandSchema,
|
|
@@ -69,13 +70,14 @@ import {
|
|
|
69
70
|
ambiguousServiceSlugs,
|
|
70
71
|
crossServiceValues,
|
|
71
72
|
interpolateBuiltinsInEnv,
|
|
73
|
+
isSharedWithAi,
|
|
72
74
|
nativeParsers,
|
|
73
75
|
servicePortValues,
|
|
74
76
|
serviceSlug,
|
|
75
77
|
serviceUrlValues,
|
|
76
78
|
urlHostFor,
|
|
77
79
|
withDeprecatedAliases
|
|
78
|
-
} from "./chunk-
|
|
80
|
+
} from "./chunk-H6VIS4OY.js";
|
|
79
81
|
import {
|
|
80
82
|
allVaultRoots,
|
|
81
83
|
env,
|
|
@@ -90,7 +92,7 @@ import {
|
|
|
90
92
|
} from "./chunk-ZFELQG4B.js";
|
|
91
93
|
|
|
92
94
|
// ../server/src/trpc/routers/chat.ts
|
|
93
|
-
import { z as
|
|
95
|
+
import { z as z6 } from "zod";
|
|
94
96
|
import Anthropic2 from "@anthropic-ai/sdk";
|
|
95
97
|
import OpenAI2 from "openai";
|
|
96
98
|
import { fileURLToPath as fileURLToPath2 } from "url";
|
|
@@ -407,6 +409,7 @@ var ApiKeyStore = class {
|
|
|
407
409
|
var apiKeyStore = new ApiKeyStore();
|
|
408
410
|
|
|
409
411
|
// ../server/src/trpc/trpc.ts
|
|
412
|
+
import { z } from "zod";
|
|
410
413
|
function createContext({ req }) {
|
|
411
414
|
return {
|
|
412
415
|
authorization: req.headers.authorization ?? null,
|
|
@@ -415,13 +418,27 @@ function createContext({ req }) {
|
|
|
415
418
|
remoteAddress: req.socket.remoteAddress ?? null
|
|
416
419
|
};
|
|
417
420
|
}
|
|
421
|
+
function extractMissingVariables(cause) {
|
|
422
|
+
if (!cause || typeof cause !== "object") return {};
|
|
423
|
+
const parsed = z.object({
|
|
424
|
+
missingVariables: z.array(MissingVariableSchema).max(500),
|
|
425
|
+
environmentId: z.string().max(128)
|
|
426
|
+
}).safeParse(cause);
|
|
427
|
+
return parsed.success ? parsed.data : {};
|
|
428
|
+
}
|
|
418
429
|
var t = initTRPC.context().meta().create({
|
|
419
430
|
errorFormatter({ shape, error }) {
|
|
420
431
|
return {
|
|
421
432
|
...shape,
|
|
422
433
|
data: {
|
|
423
434
|
...shape.data,
|
|
424
|
-
message: error.message
|
|
435
|
+
message: error.message,
|
|
436
|
+
// La cause d'une erreur n'est PAS transportée par défaut, et c'est
|
|
437
|
+
// voulu : elle porte souvent la pile ou l'objet interne qui a échoué.
|
|
438
|
+
// Un seul champ traverse, nommé et validé — la liste des variables à
|
|
439
|
+
// remplir, dont le client a besoin pour ouvrir l'assistant sur ce qui
|
|
440
|
+
// vient exactement d'être refusé.
|
|
441
|
+
...extractMissingVariables(error.cause)
|
|
425
442
|
}
|
|
426
443
|
};
|
|
427
444
|
}
|
|
@@ -489,7 +506,7 @@ function getAllowedServiceIds(ctx) {
|
|
|
489
506
|
if (ctx.callerType !== "api") return null;
|
|
490
507
|
return new Set(ctx.apiKey.scopes.services.map((p) => p.serviceId));
|
|
491
508
|
}
|
|
492
|
-
function
|
|
509
|
+
function findEnvPermission(ctx, environmentId, action, serviceId) {
|
|
493
510
|
if (ctx.callerType !== "api") return { includeSecrets: true };
|
|
494
511
|
const permsToCheck = serviceId ? ctx.apiKey.scopes.services.filter((p) => p.serviceId === serviceId) : ctx.apiKey.scopes.services;
|
|
495
512
|
for (const svcPerm of permsToCheck) {
|
|
@@ -498,19 +515,27 @@ function requireEnvAction(ctx, environmentId, action, serviceId) {
|
|
|
498
515
|
return { includeSecrets: envPerm.includeSecrets };
|
|
499
516
|
}
|
|
500
517
|
}
|
|
518
|
+
return null;
|
|
519
|
+
}
|
|
520
|
+
function requireEnvAction(ctx, environmentId, action, serviceId) {
|
|
521
|
+
const permission = findEnvPermission(ctx, environmentId, action, serviceId);
|
|
522
|
+
if (permission) return permission;
|
|
501
523
|
throw new TRPCError({
|
|
502
524
|
code: "FORBIDDEN",
|
|
503
525
|
message: `API key lacks '${action}' permission on environment ${environmentId}`
|
|
504
526
|
});
|
|
505
527
|
}
|
|
528
|
+
function canEnvAction(ctx, environmentId, action) {
|
|
529
|
+
return findEnvPermission(ctx, environmentId, action) !== null;
|
|
530
|
+
}
|
|
506
531
|
|
|
507
532
|
// ../server/src/trpc/shared-schemas.ts
|
|
508
|
-
import { z } from "zod";
|
|
509
|
-
var Id128Schema =
|
|
510
|
-
var ConversationIdSchema =
|
|
511
|
-
var NameSchema =
|
|
512
|
-
var ShortString200Schema =
|
|
513
|
-
var DescriptionSchema =
|
|
533
|
+
import { z as z2 } from "zod";
|
|
534
|
+
var Id128Schema = z2.string().max(128);
|
|
535
|
+
var ConversationIdSchema = z2.string().max(128);
|
|
536
|
+
var NameSchema = z2.string().min(1).max(200);
|
|
537
|
+
var ShortString200Schema = z2.string().max(200);
|
|
538
|
+
var DescriptionSchema = z2.string().max(2e3);
|
|
514
539
|
var OptionalProviderIdSchema = Id128Schema.optional();
|
|
515
540
|
|
|
516
541
|
// ../server/src/services/workspace-cwd.ts
|
|
@@ -762,25 +787,91 @@ function slotReferenceText(variable) {
|
|
|
762
787
|
${slot.value}
|
|
763
788
|
${slot.post}`;
|
|
764
789
|
}
|
|
790
|
+
var MASKED_VALUE = "***";
|
|
791
|
+
var HIDDEN_VALUES_NOTICE = `Values shown as ${MASKED_VALUE} are secrets their author did not share with AI. The service does receive them: never treat such a key as missing, and never pass ${MASKED_VALUE} as its value.`;
|
|
792
|
+
function filterEnvForAi(resolved, sharedKeys) {
|
|
793
|
+
const secret = new Set(resolved.envSecrets);
|
|
794
|
+
const shared = new Set(sharedKeys);
|
|
795
|
+
const env2 = {};
|
|
796
|
+
const envSecrets = [];
|
|
797
|
+
const hiddenKeys = [];
|
|
798
|
+
for (const [key, value] of Object.entries(resolved.env)) {
|
|
799
|
+
const hidden = secret.has(key) && !shared.has(key);
|
|
800
|
+
env2[key] = hidden ? MASKED_VALUE : value;
|
|
801
|
+
if (secret.has(key)) envSecrets.push(key);
|
|
802
|
+
if (hidden) hiddenKeys.push(key);
|
|
803
|
+
}
|
|
804
|
+
return {
|
|
805
|
+
env: env2,
|
|
806
|
+
envSecrets,
|
|
807
|
+
hiddenKeys,
|
|
808
|
+
...hiddenKeys.length > 0 ? { hiddenNotice: HIDDEN_VALUES_NOTICE } : {}
|
|
809
|
+
};
|
|
810
|
+
}
|
|
811
|
+
function describeVariables(environments, ctx) {
|
|
812
|
+
const details = [];
|
|
813
|
+
for (const environment of environments) {
|
|
814
|
+
for (const [variableId, variable] of Object.entries(environment.variables ?? {})) {
|
|
815
|
+
const slot = variable.value;
|
|
816
|
+
const isOverridden = ctx.overriddenVariableIds.has(variableId);
|
|
817
|
+
const isSecret = slot.isSecret || ctx.resolvedSecretKeys.has(variable.key);
|
|
818
|
+
const readableByAi = ctx.maskedKeys.has(variable.key) ? false : !isSecret || isSharedWithAi(slot);
|
|
819
|
+
details.push({
|
|
820
|
+
key: variable.key,
|
|
821
|
+
inService: ctx.serviceKeys.has(variable.key),
|
|
822
|
+
environmentId: environment.id,
|
|
823
|
+
environmentName: environment.name,
|
|
824
|
+
scope: environment.scope,
|
|
825
|
+
...environment.scope === "service" && environment.reference ? { environmentServiceId: environment.reference } : {},
|
|
826
|
+
...slot.description ? { description: slot.description } : {},
|
|
827
|
+
secret: isSecret,
|
|
828
|
+
readableByAi,
|
|
829
|
+
injectedIntoAi: slot.injectIntoAi,
|
|
830
|
+
required: slot.required,
|
|
831
|
+
overrideOnly: slot.overrideOnly,
|
|
832
|
+
overridden: isOverridden,
|
|
833
|
+
...isOverridden && ctx.sharedValues[variable.key] !== void 0 ? { sharedValue: ctx.sharedValues[variable.key] } : {}
|
|
834
|
+
});
|
|
835
|
+
}
|
|
836
|
+
}
|
|
837
|
+
return details.sort((a, b) => a.key.localeCompare(b.key) || a.environmentName.localeCompare(b.environmentName));
|
|
838
|
+
}
|
|
839
|
+
function withOverriddenValue(variable, override) {
|
|
840
|
+
return {
|
|
841
|
+
...variable,
|
|
842
|
+
value: {
|
|
843
|
+
...variable.value,
|
|
844
|
+
value: override.value,
|
|
845
|
+
pre: override.pre,
|
|
846
|
+
post: override.post
|
|
847
|
+
}
|
|
848
|
+
};
|
|
849
|
+
}
|
|
765
850
|
var EnvironmentResolver = class {
|
|
766
|
-
async resolveForService(ctx) {
|
|
851
|
+
async resolveForService(ctx, opts) {
|
|
767
852
|
if (!ctx.activeEnvironmentId) {
|
|
768
853
|
return { env: {}, envSecrets: [] };
|
|
769
854
|
}
|
|
770
855
|
const serviceEnv = await environmentStore.findServiceEnvironment(ctx.serviceId, ctx.activeEnvironmentId);
|
|
771
856
|
if (!serviceEnv) {
|
|
772
|
-
return this.resolveEnvironment(ctx.activeEnvironmentId);
|
|
857
|
+
return this.resolveEnvironment(ctx.activeEnvironmentId, opts);
|
|
773
858
|
}
|
|
774
|
-
return this.resolveEnvironment(serviceEnv.id);
|
|
859
|
+
return this.resolveEnvironment(serviceEnv.id, opts);
|
|
775
860
|
}
|
|
776
|
-
|
|
861
|
+
/**
|
|
862
|
+
* `applyOverrides: false` rend ce que l'équipe partage, sans ce que ce poste
|
|
863
|
+
* a mis par-dessus : c'est la réponse à « qu'est-ce que ma surcharge
|
|
864
|
+
* remplace ». Le défaut reste `true` — tout le reste du produit veut la
|
|
865
|
+
* valeur avec laquelle le service tourne réellement.
|
|
866
|
+
*/
|
|
867
|
+
async resolveEnvironment(environmentId, opts) {
|
|
777
868
|
const visited = /* @__PURE__ */ new Set();
|
|
778
869
|
const result = await this.resolveDag(environmentId, visited);
|
|
779
|
-
const overridesByKey = await this.resolveOverridesByKey(environmentId);
|
|
870
|
+
const overridesByKey = opts?.applyOverrides === false ? {} : await this.resolveOverridesByKey(environmentId);
|
|
780
871
|
for (const [varId, variable] of Object.entries(result.variables)) {
|
|
781
872
|
const override = overridesByKey[variable.key];
|
|
782
873
|
if (override) {
|
|
783
|
-
result.variables[varId] =
|
|
874
|
+
result.variables[varId] = withOverriddenValue(variable, override.variable.value);
|
|
784
875
|
}
|
|
785
876
|
}
|
|
786
877
|
const rawEnv = {};
|
|
@@ -814,7 +905,7 @@ var EnvironmentResolver = class {
|
|
|
814
905
|
for (const [varId, variable] of Object.entries(result.variables)) {
|
|
815
906
|
const override = overridesByKey[variable.key];
|
|
816
907
|
if (override) {
|
|
817
|
-
result.variables[varId] =
|
|
908
|
+
result.variables[varId] = withOverriddenValue(variable, override.variable.value);
|
|
818
909
|
}
|
|
819
910
|
}
|
|
820
911
|
const rawEnv = {};
|
|
@@ -837,6 +928,126 @@ var EnvironmentResolver = class {
|
|
|
837
928
|
}
|
|
838
929
|
return injected;
|
|
839
930
|
}
|
|
931
|
+
/**
|
|
932
|
+
* Les variables qu'il faut remplir avant qu'un service de cet environnement
|
|
933
|
+
* puisse démarrer.
|
|
934
|
+
*
|
|
935
|
+
* Deux motifs, et ils ne se mesurent pas au même endroit :
|
|
936
|
+
*
|
|
937
|
+
* - `required` porte sur la valeur **finale**, interpolation et surcharge
|
|
938
|
+
* comprises : une variable obligatoire dont la valeur ne tient qu'à une
|
|
939
|
+
* référence morte est aussi vide qu'une case blanche.
|
|
940
|
+
* - `overrideOnly` porte sur l'**existence d'une surcharge machine**. Elle
|
|
941
|
+
* n'a par construction pas de valeur partagée ; ce qui manque n'est pas un
|
|
942
|
+
* contenu, c'est la réponse de ce poste-ci.
|
|
943
|
+
*
|
|
944
|
+
* Les drapeaux se lisent sur la définition, jamais sur le slot résolu : une
|
|
945
|
+
* surcharge remplace le slot entier et ne porte aucun drapeau — les y lire
|
|
946
|
+
* rendrait toute variable surchargée silencieusement facultative.
|
|
947
|
+
*/
|
|
948
|
+
async findMissingVariables(environmentId) {
|
|
949
|
+
if (!environmentId) return [];
|
|
950
|
+
const [{ env: env2 }, definitions, overridesByKey] = await Promise.all([
|
|
951
|
+
this.resolveEnvironment(environmentId),
|
|
952
|
+
this.resolveDag(environmentId, /* @__PURE__ */ new Set()),
|
|
953
|
+
this.resolveOverridesByKey(environmentId)
|
|
954
|
+
]);
|
|
955
|
+
const missing = [];
|
|
956
|
+
for (const [variableId, variable] of Object.entries(definitions.variables)) {
|
|
957
|
+
const slot = variable.value;
|
|
958
|
+
const source = definitions.sources[variableId];
|
|
959
|
+
const base = {
|
|
960
|
+
variableId,
|
|
961
|
+
key: variable.key,
|
|
962
|
+
description: slot.description,
|
|
963
|
+
isSecret: slot.isSecret,
|
|
964
|
+
environmentId: source?.environmentId ?? environmentId,
|
|
965
|
+
environmentName: source?.environmentName ?? ""
|
|
966
|
+
};
|
|
967
|
+
if (slot.overrideOnly && !overridesByKey[variable.key]) {
|
|
968
|
+
missing.push({ ...base, reason: "overrideOnly" });
|
|
969
|
+
continue;
|
|
970
|
+
}
|
|
971
|
+
if (slot.required && (env2[variable.key] ?? "") === "") {
|
|
972
|
+
missing.push({ ...base, reason: "required" });
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
return missing;
|
|
976
|
+
}
|
|
977
|
+
/**
|
|
978
|
+
* Tout ce qu'il reste à remplir sous l'environnement courant.
|
|
979
|
+
*
|
|
980
|
+
* Deux périmètres, et il faut les deux :
|
|
981
|
+
*
|
|
982
|
+
* 1. **L'environnement courant lui-même**, héritage compris —
|
|
983
|
+
* `findMissingVariables` remonte ses `parentIds`. C'est là que vivent les
|
|
984
|
+
* variables globales du projet, et c'est la première branche balayée.
|
|
985
|
+
* 2. **Les environnements de service qui s'activent avec lui**
|
|
986
|
+
* (`activateOn`). Ceux-là ne sont pas des ancêtres du global : ils en
|
|
987
|
+
* héritent, dans l'autre sens. Ne pas y descendre revenait à ne rien
|
|
988
|
+
* réclamer d'un service jusqu'à ce qu'on essaie de le démarrer.
|
|
989
|
+
*
|
|
990
|
+
* Dédoublonné par identifiant de variable : une variable du global remonte
|
|
991
|
+
* dans chaque branche de service qui en hérite, et l'assistant ne doit pas
|
|
992
|
+
* demander deux fois la même chose.
|
|
993
|
+
*/
|
|
994
|
+
async findMissingForActiveEnvironment(globalEnvId) {
|
|
995
|
+
if (!globalEnvId) return [];
|
|
996
|
+
const serviceEnvs = await environmentStore.listByActivateOn(globalEnvId);
|
|
997
|
+
const branches = await Promise.all([
|
|
998
|
+
this.findMissingVariables(globalEnvId),
|
|
999
|
+
...serviceEnvs.map((env2) => this.findMissingVariables(env2.id))
|
|
1000
|
+
]);
|
|
1001
|
+
const seen = /* @__PURE__ */ new Set();
|
|
1002
|
+
const missing = [];
|
|
1003
|
+
for (const branch of branches) {
|
|
1004
|
+
for (const item of branch) {
|
|
1005
|
+
if (seen.has(item.variableId)) continue;
|
|
1006
|
+
seen.add(item.variableId);
|
|
1007
|
+
missing.push(item);
|
|
1008
|
+
}
|
|
1009
|
+
}
|
|
1010
|
+
return missing;
|
|
1011
|
+
}
|
|
1012
|
+
/**
|
|
1013
|
+
* Les clés que leur auteur a partagées avec les IA, héritage compris.
|
|
1014
|
+
*
|
|
1015
|
+
* Le partage se lit sur la **définition**, et seulement là : une surcharge
|
|
1016
|
+
* machine ne dit que la valeur de ce poste (`withOverriddenValue`). Il n'y a
|
|
1017
|
+
* donc qu'un endroit où ce drapeau existe, et rien à réconcilier.
|
|
1018
|
+
*
|
|
1019
|
+
* Des clés, pas des valeurs : la valeur rendue reste celle que le service
|
|
1020
|
+
* reçoit, surcharges et interpolation comprises.
|
|
1021
|
+
*/
|
|
1022
|
+
async resolveAiSharedKeys(environmentId) {
|
|
1023
|
+
if (!environmentId) return /* @__PURE__ */ new Set();
|
|
1024
|
+
const result = await this.resolveDag(environmentId, /* @__PURE__ */ new Set());
|
|
1025
|
+
const keys = /* @__PURE__ */ new Set();
|
|
1026
|
+
for (const variable of Object.values(result.variables)) {
|
|
1027
|
+
if (isSharedWithAi(variable.value)) keys.add(variable.key);
|
|
1028
|
+
}
|
|
1029
|
+
return keys;
|
|
1030
|
+
}
|
|
1031
|
+
/**
|
|
1032
|
+
* Idem, pour ce qu'un service verra réellement : son environnement dédié
|
|
1033
|
+
* quand il en a un, l'environnement global sinon — la règle de sélection de
|
|
1034
|
+
* `resolveForService`.
|
|
1035
|
+
*/
|
|
1036
|
+
async resolveAiSharedKeysForService(ctx) {
|
|
1037
|
+
if (!ctx.activeEnvironmentId) return /* @__PURE__ */ new Set();
|
|
1038
|
+
const serviceEnv = await environmentStore.findServiceEnvironment(ctx.serviceId, ctx.activeEnvironmentId);
|
|
1039
|
+
return this.resolveAiSharedKeys(serviceEnv ? serviceEnv.id : ctx.activeEnvironmentId);
|
|
1040
|
+
}
|
|
1041
|
+
/**
|
|
1042
|
+
* Idem, pour ce qu'un service verra réellement : son environnement dédié
|
|
1043
|
+
* quand il en a un, l'environnement global sinon. Miroir de
|
|
1044
|
+
* `resolveForService`, dont il partage la règle de sélection.
|
|
1045
|
+
*/
|
|
1046
|
+
async findMissingForService(ctx) {
|
|
1047
|
+
if (!ctx.activeEnvironmentId) return [];
|
|
1048
|
+
const serviceEnv = await environmentStore.findServiceEnvironment(ctx.serviceId, ctx.activeEnvironmentId);
|
|
1049
|
+
return this.findMissingVariables(serviceEnv ? serviceEnv.id : ctx.activeEnvironmentId);
|
|
1050
|
+
}
|
|
840
1051
|
async resolveEnvironmentWithSources(environmentId) {
|
|
841
1052
|
const visited = /* @__PURE__ */ new Set();
|
|
842
1053
|
const result = await this.resolveDag(environmentId, visited);
|
|
@@ -844,7 +1055,7 @@ var EnvironmentResolver = class {
|
|
|
844
1055
|
for (const [varId, variable] of Object.entries(result.variables)) {
|
|
845
1056
|
const override = overridesByKey[variable.key];
|
|
846
1057
|
if (override) {
|
|
847
|
-
result.variables[varId] =
|
|
1058
|
+
result.variables[varId] = withOverriddenValue(variable, override.variable.value);
|
|
848
1059
|
result.sources[varId] = {
|
|
849
1060
|
...result.sources[varId],
|
|
850
1061
|
overridden: true,
|
|
@@ -1452,6 +1663,12 @@ var RUNEYA_CAPABILITIES = [
|
|
|
1452
1663
|
// rendent que des chemins et une adresse, d'où leur présence ci-dessous),
|
|
1453
1664
|
// `cloudAuth.session`, `agent.getPassthroughEnv`. Un agent n'a pas besoin de
|
|
1454
1665
|
// ces valeurs pour travailler, et ce qu'il lit finit dans une transcription.
|
|
1666
|
+
//
|
|
1667
|
+
// La seule exception est `service.getEnv` (`get_service_env` ci-dessous),
|
|
1668
|
+
// et elle n'en est une que parce qu'elle filtre : les variables publiques, et
|
|
1669
|
+
// les seuls secrets que leur auteur a partagés avec les IA (`isSharedWithAi`
|
|
1670
|
+
// — « Lisible par l'IA », ou l'injection, qui vaut la lecture). Un secret non
|
|
1671
|
+
// partagé n'y apparaît pas, pas même par son nom.
|
|
1455
1672
|
{
|
|
1456
1673
|
name: "list_processes",
|
|
1457
1674
|
description: "List every process across all agents with its current state (running, stopped, exit code, uptime). Use this to see the whole machine at once, rather than calling get_service_status service by service. An agent only learns about a service when it is first started, so this lists what is deployed, not what is configured: an empty list means nothing has been started, not that you cannot see them \u2014 list_services shows what exists.",
|
|
@@ -1470,6 +1687,16 @@ var RUNEYA_CAPABILITIES = [
|
|
|
1470
1687
|
],
|
|
1471
1688
|
buildInput: (p) => ({ id: p.serviceId })
|
|
1472
1689
|
},
|
|
1690
|
+
{
|
|
1691
|
+
name: "get_service_env",
|
|
1692
|
+
description: 'Read the environment variables a service runs with, and the project\'s variable inventory. `env` lists every key the service receives; a value reads "***" when it is a secret whose author did not share it with AI (sharing = ticking "AI read", or injecting it into the agents\' environment, which grants reading too). `envSecrets` says which keys are secret, `hiddenKeys` which ones are masked. A masked key is set on the service: never treat it as missing, never suggest adding it, and never pass "***" as a value \u2014 ask the user for it. `variables` describes every variable of the project \u2014 which environment defines it and its scope, its description, its flags, whether this machine overrides it, and `inService: false` for the ones this service does not receive. Use it to say where a variable must be changed instead of guessing. On an overridden variable, `sharedValue` is what the machine-local override replaces (the team\'s value, masked as "***" when unreadable); no other value appears there.',
|
|
1693
|
+
route: "service.getEnv",
|
|
1694
|
+
method: "GET",
|
|
1695
|
+
params: [
|
|
1696
|
+
{ name: "serviceId", description: "The service ID", required: true }
|
|
1697
|
+
],
|
|
1698
|
+
buildInput: (p) => ({ id: p.serviceId })
|
|
1699
|
+
},
|
|
1473
1700
|
{
|
|
1474
1701
|
name: "get_service_metrics",
|
|
1475
1702
|
description: "Read the CPU and memory currently used by a running service.",
|
|
@@ -1980,7 +2207,7 @@ async function executeTool(rawName, input, apiKey, authToken) {
|
|
|
1980
2207
|
}
|
|
1981
2208
|
|
|
1982
2209
|
// ../server/src/trpc/routers/service.ts
|
|
1983
|
-
import { z as
|
|
2210
|
+
import { z as z3 } from "zod";
|
|
1984
2211
|
import { TRPCError as TRPCError2 } from "@trpc/server";
|
|
1985
2212
|
|
|
1986
2213
|
// ../server/src/services/audit-service.ts
|
|
@@ -2355,10 +2582,10 @@ var serviceRouter = router({
|
|
|
2355
2582
|
* silencieux ferait croire au filtrage tout en rendant les services des
|
|
2356
2583
|
* autres organisations.
|
|
2357
2584
|
*/
|
|
2358
|
-
list: protectedProcedure.meta({ openapi: { method: "GET", path: "/services", tags: ["services"], summary: "List services (every project of the machine unless narrowed by project or organization)", protect: true } }).input(
|
|
2359
|
-
projectId:
|
|
2360
|
-
orgId:
|
|
2361
|
-
}).optional()).output(
|
|
2585
|
+
list: protectedProcedure.meta({ openapi: { method: "GET", path: "/services", tags: ["services"], summary: "List services (every project of the machine unless narrowed by project or organization)", protect: true } }).input(z3.object({
|
|
2586
|
+
projectId: z3.string().max(128).optional(),
|
|
2587
|
+
orgId: z3.string().max(128).nullable().optional()
|
|
2588
|
+
}).optional()).output(z3.any()).query(async ({ input, ctx }) => {
|
|
2362
2589
|
const all = await serviceStore.list();
|
|
2363
2590
|
const allowedIds = getAllowedServiceIds(ctx);
|
|
2364
2591
|
let filtered = allowedIds ? all.filter((s) => allowedIds.has(s.id)) : all;
|
|
@@ -2378,7 +2605,7 @@ var serviceRouter = router({
|
|
|
2378
2605
|
effectiveAgentId: await resolveEffectiveAgentId(s)
|
|
2379
2606
|
})));
|
|
2380
2607
|
}),
|
|
2381
|
-
get: protectedProcedure.meta({ openapi: { method: "GET", path: "/services/{id}", tags: ["services"], summary: "Get a service by ID", protect: true } }).input(
|
|
2608
|
+
get: protectedProcedure.meta({ openapi: { method: "GET", path: "/services/{id}", tags: ["services"], summary: "Get a service by ID", protect: true } }).input(z3.object({ id: z3.string().max(128) })).output(z3.any()).query(async ({ input, ctx }) => {
|
|
2382
2609
|
requireServiceAction(ctx, input.id, "service:read");
|
|
2383
2610
|
const service = await serviceStore.get(input.id);
|
|
2384
2611
|
if (!service) {
|
|
@@ -2386,34 +2613,85 @@ var serviceRouter = router({
|
|
|
2386
2613
|
}
|
|
2387
2614
|
return { ...service, effectiveAgentId: await resolveEffectiveAgentId(service) };
|
|
2388
2615
|
}),
|
|
2389
|
-
|
|
2390
|
-
|
|
2391
|
-
|
|
2392
|
-
|
|
2393
|
-
|
|
2394
|
-
|
|
2395
|
-
|
|
2396
|
-
|
|
2397
|
-
|
|
2398
|
-
|
|
2399
|
-
|
|
2400
|
-
|
|
2401
|
-
|
|
2402
|
-
|
|
2616
|
+
/**
|
|
2617
|
+
* Les variables d'environnement d'un service, telles qu'un agent IA a le
|
|
2618
|
+
* droit de les lire : tout ce qui est public, et les seuls secrets que leur
|
|
2619
|
+
* auteur a partagés avec les IA (« Lisible par l'IA », ou l'injection dans
|
|
2620
|
+
* l'environnement des agents, qui la vaut).
|
|
2621
|
+
*
|
|
2622
|
+
* Route à part, et non un champ de `get` : `get` est appelé par chaque écran
|
|
2623
|
+
* qui affiche un service, et résoudre un environnement complet à chacun de
|
|
2624
|
+
* ces appels se paierait partout. C'est aussi ce qui rend la lecture des
|
|
2625
|
+
* valeurs explicite du côté appelant.
|
|
2626
|
+
*
|
|
2627
|
+
* L'env part de `resolveServiceVariables`, donc exactement de ce que le
|
|
2628
|
+
* service reçoit au déploiement — builtins serveur interpolés compris.
|
|
2629
|
+
*
|
|
2630
|
+
* S'y ajoute `variables` : l'inventaire des variables du projet, **sans
|
|
2631
|
+
* valeurs** — où chacune est définie, ce que ses cases disent, et si ce
|
|
2632
|
+
* service la reçoit. Sans lui, un agent lisait l'effet sans la cause.
|
|
2633
|
+
*/
|
|
2634
|
+
getEnv: protectedProcedure.meta({ openapi: { method: "GET", path: "/services/{id}/env", tags: ["services"], summary: "Get a service's environment variables (unshared secrets masked) plus the project's value-free variable inventory", protect: true } }).input(z3.object({ id: z3.string().max(128) })).output(z3.any()).query(async ({ input, ctx }) => {
|
|
2635
|
+
requireServiceAction(ctx, input.id, "service:read");
|
|
2636
|
+
const service = await serviceStore.get(input.id);
|
|
2637
|
+
if (!service) {
|
|
2638
|
+
throw new TRPCError2({ code: "NOT_FOUND", message: `Service ${input.id} not found` });
|
|
2639
|
+
}
|
|
2640
|
+
const resolved = await resolveServiceVariables(service);
|
|
2641
|
+
const project = await projectStore.ofService(service.id);
|
|
2642
|
+
const shared = project?.activeEnvironmentId ? await environmentResolver.resolveAiSharedKeysForService({
|
|
2643
|
+
serviceId: service.id,
|
|
2644
|
+
activeEnvironmentId: project.activeEnvironmentId
|
|
2645
|
+
}) : /* @__PURE__ */ new Set();
|
|
2646
|
+
const filtered = filterEnvForAi(
|
|
2647
|
+
{ env: resolved.env ?? {}, envSecrets: resolved.envSecrets ?? [] },
|
|
2648
|
+
shared
|
|
2649
|
+
);
|
|
2650
|
+
const [environments, overrides, sharedResolved] = project ? await Promise.all([
|
|
2651
|
+
environmentStore.getByProjectId(project.id, project.orgId ?? null),
|
|
2652
|
+
environmentOverridesStore.getAll(),
|
|
2653
|
+
project.activeEnvironmentId ? environmentResolver.resolveForService(
|
|
2654
|
+
{ serviceId: service.id, activeEnvironmentId: project.activeEnvironmentId },
|
|
2655
|
+
{ applyOverrides: false }
|
|
2656
|
+
) : Promise.resolve({ env: {}, envSecrets: [] })
|
|
2657
|
+
]) : [[], {}, { env: {}, envSecrets: [] }];
|
|
2658
|
+
const variables = describeVariables(environments, {
|
|
2659
|
+
serviceKeys: new Set(Object.keys(filtered.env)),
|
|
2660
|
+
overriddenVariableIds: new Set(Object.keys(overrides)),
|
|
2661
|
+
sharedValues: filterEnvForAi(sharedResolved, shared).env,
|
|
2662
|
+
resolvedSecretKeys: new Set(resolved.envSecrets ?? []),
|
|
2663
|
+
maskedKeys: new Set(filtered.hiddenKeys)
|
|
2664
|
+
});
|
|
2665
|
+
return { ...filtered, variables };
|
|
2666
|
+
}),
|
|
2667
|
+
create: protectedProcedure.meta({ openapi: { method: "POST", path: "/services", tags: ["services"], summary: "Create a new service", protect: true } }).output(z3.any()).input(
|
|
2668
|
+
z3.object({
|
|
2669
|
+
agentId: z3.string().max(128).optional(),
|
|
2670
|
+
name: z3.string().min(1).max(200),
|
|
2671
|
+
commands: z3.array(ServiceCommandSchema).max(50).optional(),
|
|
2672
|
+
cwd: z3.string().max(4096).optional(),
|
|
2673
|
+
ports: z3.array(z3.number().int().min(1).max(65535)).max(20).optional(),
|
|
2674
|
+
groups: z3.array(z3.string().max(200)).max(20).optional(),
|
|
2675
|
+
description: z3.string().max(2e3).optional(),
|
|
2676
|
+
docsPath: z3.string().max(4096).optional(),
|
|
2677
|
+
url: z3.string().max(2048).optional(),
|
|
2678
|
+
localUrls: z3.array(z3.object({
|
|
2679
|
+
url: z3.string().max(253),
|
|
2680
|
+
port: z3.number().int().min(1).max(65535)
|
|
2403
2681
|
})).max(20).optional(),
|
|
2404
|
-
openapiUrl:
|
|
2405
|
-
git:
|
|
2406
|
-
meta:
|
|
2407
|
-
runner:
|
|
2682
|
+
openapiUrl: z3.string().max(2048).optional(),
|
|
2683
|
+
git: z3.object({ remote: z3.string().max(2048).optional(), home: z3.string().max(2048).optional() }).optional(),
|
|
2684
|
+
meta: z3.record(z3.string().max(256), z3.string().max(2e3)).optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
|
|
2685
|
+
runner: z3.enum(["native", "docker"]).optional().default("native"),
|
|
2408
2686
|
dockerConfig: DockerConfigInput.optional(),
|
|
2409
2687
|
healthCheck: HealthCheckSchema.optional(),
|
|
2410
|
-
autoRestart:
|
|
2688
|
+
autoRestart: z3.boolean().optional().default(false),
|
|
2411
2689
|
restartStrategy: RestartStrategySchema.optional(),
|
|
2412
|
-
maxRestarts:
|
|
2413
|
-
restartBackoffMs:
|
|
2414
|
-
orgId:
|
|
2415
|
-
shortcuts:
|
|
2416
|
-
parserIds:
|
|
2690
|
+
maxRestarts: z3.number().int().nonnegative().optional(),
|
|
2691
|
+
restartBackoffMs: z3.number().int().positive().optional().default(1e3),
|
|
2692
|
+
orgId: z3.string().max(128).nullable().optional(),
|
|
2693
|
+
shortcuts: z3.array(ServiceShortcutSchema).max(50).optional(),
|
|
2694
|
+
parserIds: z3.array(z3.string().max(128)).max(50).optional()
|
|
2417
2695
|
})
|
|
2418
2696
|
).mutation(async ({ input }) => {
|
|
2419
2697
|
if (input.agentId) {
|
|
@@ -2435,38 +2713,38 @@ var serviceRouter = router({
|
|
|
2435
2713
|
await auditService.log({ userId: "local", action: "create", entityType: "service", entityId: service.id, metadata: { name: input.name } });
|
|
2436
2714
|
return service;
|
|
2437
2715
|
}),
|
|
2438
|
-
update: protectedProcedure.meta({ openapi: { method: "PATCH", path: "/services/{id}", tags: ["services"], summary: "Update a service", protect: true } }).output(
|
|
2439
|
-
|
|
2440
|
-
id:
|
|
2441
|
-
agentId:
|
|
2716
|
+
update: protectedProcedure.meta({ openapi: { method: "PATCH", path: "/services/{id}", tags: ["services"], summary: "Update a service", protect: true } }).output(z3.any()).input(
|
|
2717
|
+
z3.object({
|
|
2718
|
+
id: z3.string().max(128),
|
|
2719
|
+
agentId: z3.string().max(128).nullable().optional(),
|
|
2442
2720
|
// null = clear (inherit from env)
|
|
2443
|
-
name:
|
|
2444
|
-
commands:
|
|
2445
|
-
cwd:
|
|
2446
|
-
ports:
|
|
2447
|
-
groups:
|
|
2448
|
-
description:
|
|
2449
|
-
docsPath:
|
|
2450
|
-
url:
|
|
2451
|
-
localUrls:
|
|
2452
|
-
url:
|
|
2453
|
-
port:
|
|
2721
|
+
name: z3.string().min(1).max(200).optional(),
|
|
2722
|
+
commands: z3.array(ServiceCommandSchema).max(50).optional(),
|
|
2723
|
+
cwd: z3.string().max(4096).nullable().optional(),
|
|
2724
|
+
ports: z3.array(z3.number().int().min(1).max(65535)).max(20).optional(),
|
|
2725
|
+
groups: z3.array(z3.string().max(200)).max(20).optional(),
|
|
2726
|
+
description: z3.string().max(2e3).optional(),
|
|
2727
|
+
docsPath: z3.string().max(4096).optional(),
|
|
2728
|
+
url: z3.string().max(2048).optional(),
|
|
2729
|
+
localUrls: z3.array(z3.object({
|
|
2730
|
+
url: z3.string().max(253),
|
|
2731
|
+
port: z3.number().int().min(1).max(65535)
|
|
2454
2732
|
})).max(20).optional(),
|
|
2455
|
-
openapiUrl:
|
|
2456
|
-
git:
|
|
2457
|
-
meta:
|
|
2458
|
-
runner:
|
|
2733
|
+
openapiUrl: z3.string().max(2048).optional(),
|
|
2734
|
+
git: z3.object({ remote: z3.string().max(2048).optional(), home: z3.string().max(2048).optional() }).nullable().optional(),
|
|
2735
|
+
meta: z3.record(z3.string().max(256), z3.string().max(2e3)).nullable().optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
|
|
2736
|
+
runner: z3.enum(["native", "docker"]).optional(),
|
|
2459
2737
|
dockerConfig: DockerConfigInput.optional(),
|
|
2460
2738
|
healthCheck: HealthCheckSchema.nullable().optional(),
|
|
2461
|
-
autoRestart:
|
|
2462
|
-
clearLogsOnStart:
|
|
2739
|
+
autoRestart: z3.boolean().optional(),
|
|
2740
|
+
clearLogsOnStart: z3.boolean().optional(),
|
|
2463
2741
|
restartStrategy: RestartStrategySchema.optional(),
|
|
2464
|
-
maxRestarts:
|
|
2465
|
-
restartBackoffMs:
|
|
2466
|
-
orgId:
|
|
2467
|
-
shortcuts:
|
|
2468
|
-
parserIds:
|
|
2469
|
-
logSources:
|
|
2742
|
+
maxRestarts: z3.number().int().nonnegative().optional(),
|
|
2743
|
+
restartBackoffMs: z3.number().int().positive().optional(),
|
|
2744
|
+
orgId: z3.string().max(128).nullable().optional(),
|
|
2745
|
+
shortcuts: z3.array(ServiceShortcutSchema).max(50).optional(),
|
|
2746
|
+
parserIds: z3.array(z3.string().max(128)).max(50).optional(),
|
|
2747
|
+
logSources: z3.array(LogSourceConfigSchema).max(20).optional()
|
|
2470
2748
|
})
|
|
2471
2749
|
).mutation(async ({ input }) => {
|
|
2472
2750
|
const existing = await serviceStore.get(input.id);
|
|
@@ -2521,7 +2799,7 @@ var serviceRouter = router({
|
|
|
2521
2799
|
await auditService.log({ userId: "local", action: "update", entityType: "service", entityId: input.id });
|
|
2522
2800
|
return { ...service, effectiveAgentId: await resolveEffectiveAgentId(service), stoppedForAgentChange };
|
|
2523
2801
|
}),
|
|
2524
|
-
delete: protectedProcedure.meta({ openapi: { method: "DELETE", path: "/services/{id}", tags: ["services"], summary: "Delete a service", protect: true } }).input(
|
|
2802
|
+
delete: protectedProcedure.meta({ openapi: { method: "DELETE", path: "/services/{id}", tags: ["services"], summary: "Delete a service", protect: true } }).input(z3.object({ id: z3.string().max(128) })).output(z3.object({ success: z3.literal(true) })).mutation(async ({ input }) => {
|
|
2525
2803
|
const deleted = await serviceStore.delete(input.id);
|
|
2526
2804
|
if (!deleted) {
|
|
2527
2805
|
throw new TRPCError2({ code: "NOT_FOUND", message: `Service ${input.id} not found` });
|
|
@@ -2529,7 +2807,7 @@ var serviceRouter = router({
|
|
|
2529
2807
|
await auditService.log({ userId: "local", action: "delete", entityType: "service", entityId: input.id });
|
|
2530
2808
|
return { success: true };
|
|
2531
2809
|
}),
|
|
2532
|
-
checkCwd: protectedProcedure.input(
|
|
2810
|
+
checkCwd: protectedProcedure.input(z3.object({ id: z3.string().max(128), checkReachability: z3.boolean().optional() })).query(async ({ input }) => {
|
|
2533
2811
|
const service = await serviceStore.get(input.id);
|
|
2534
2812
|
if (!service) {
|
|
2535
2813
|
throw new TRPCError2({ code: "NOT_FOUND", message: `Service ${input.id} not found` });
|
|
@@ -2562,7 +2840,7 @@ var serviceRouter = router({
|
|
|
2562
2840
|
}
|
|
2563
2841
|
return { exists, canClone, unresolvedVars: [], resolvedCwd, gitMismatch };
|
|
2564
2842
|
}),
|
|
2565
|
-
cloneRepository: protectedProcedure.input(
|
|
2843
|
+
cloneRepository: protectedProcedure.input(z3.object({ id: z3.string().max(128) })).mutation(async ({ input }) => {
|
|
2566
2844
|
const service = await serviceStore.get(input.id);
|
|
2567
2845
|
if (!service) {
|
|
2568
2846
|
throw new TRPCError2({ code: "NOT_FOUND", message: `Service ${input.id} not found` });
|
|
@@ -3547,7 +3825,7 @@ async function resolveImagesToBase64(images, contextId) {
|
|
|
3547
3825
|
}
|
|
3548
3826
|
|
|
3549
3827
|
// ../server/src/trpc/routers/cloud-auth.ts
|
|
3550
|
-
import { z as
|
|
3828
|
+
import { z as z5 } from "zod";
|
|
3551
3829
|
import { hostname } from "os";
|
|
3552
3830
|
import { basename } from "path";
|
|
3553
3831
|
import { TRPCError as TRPCError3 } from "@trpc/server";
|
|
@@ -3804,12 +4082,12 @@ var cloudSessionStore = new CloudSessionStore();
|
|
|
3804
4082
|
import { networkInterfaces } from "os";
|
|
3805
4083
|
import { readFile as readFile8, writeFile as writeFile6, rename as rename6, mkdir as mkdir8 } from "fs/promises";
|
|
3806
4084
|
import { join as join7 } from "path";
|
|
3807
|
-
import { z as
|
|
4085
|
+
import { z as z4 } from "zod";
|
|
3808
4086
|
var LOOPBACK2 = "127.0.0.1";
|
|
3809
4087
|
var ANY = "0.0.0.0";
|
|
3810
4088
|
var NETWORK_FILE = "network.json";
|
|
3811
|
-
var NetworkFileSchema =
|
|
3812
|
-
instances:
|
|
4089
|
+
var NetworkFileSchema = z4.object({
|
|
4090
|
+
instances: z4.record(z4.string(), z4.object({ lanEnabled: z4.boolean().default(false) })).default({})
|
|
3813
4091
|
});
|
|
3814
4092
|
var httpServer = null;
|
|
3815
4093
|
function instanceKey() {
|
|
@@ -4077,15 +4355,15 @@ function isAllowedProxyPath(path) {
|
|
|
4077
4355
|
const [pathname] = path.split("?");
|
|
4078
4356
|
return PROXY_PREFIXES.some((p) => pathname === p || pathname.startsWith(p));
|
|
4079
4357
|
}
|
|
4080
|
-
var ScopeSchema =
|
|
4081
|
-
accountId:
|
|
4358
|
+
var ScopeSchema = z5.object({
|
|
4359
|
+
accountId: z5.string().min(1).max(64)
|
|
4082
4360
|
});
|
|
4083
4361
|
function scopeOf(input) {
|
|
4084
4362
|
return { accountId: input.accountId };
|
|
4085
4363
|
}
|
|
4086
4364
|
var cloudAuthRouter = router({
|
|
4087
4365
|
/** Build the cloud authorization URL to open in the browser. */
|
|
4088
|
-
startLogin: protectedProcedure.input(
|
|
4366
|
+
startLogin: protectedProcedure.input(z5.object({ returnTo: z5.string().url().max(2048) })).mutation(async ({ input }) => {
|
|
4089
4367
|
const callback = callbackForReturnTo(input.returnTo);
|
|
4090
4368
|
if (!callback) {
|
|
4091
4369
|
throw new TRPCError3({
|
|
@@ -4123,7 +4401,7 @@ var cloudAuthRouter = router({
|
|
|
4123
4401
|
* `null` quand rien ne rattache cette organisation à un compte de ce poste :
|
|
4124
4402
|
* l'interface l'affiche comme déconnectée, ce qu'elle est.
|
|
4125
4403
|
*/
|
|
4126
|
-
accountForOrg: protectedProcedure.input(
|
|
4404
|
+
accountForOrg: protectedProcedure.input(z5.object({ orgId: z5.string().min(1).max(128) })).query(async ({ input }) => ({ accountId: await accountForOrg(input.orgId) })),
|
|
4127
4405
|
/**
|
|
4128
4406
|
* Les comptes liés à ce poste, et l'organisation dont chacun répond.
|
|
4129
4407
|
*
|
|
@@ -4179,7 +4457,7 @@ var cloudAuthRouter = router({
|
|
|
4179
4457
|
* drops the session, and the local token is dropped here too, so nothing is
|
|
4180
4458
|
* left holding a dead credential.
|
|
4181
4459
|
*/
|
|
4182
|
-
revokeDevice: protectedProcedure.input(ScopeSchema.extend({ id:
|
|
4460
|
+
revokeDevice: protectedProcedure.input(ScopeSchema.extend({ id: z5.string().min(1).max(128) })).mutation(async ({ input }) => {
|
|
4183
4461
|
const { accountId } = input;
|
|
4184
4462
|
if (!accountId) throw new TRPCError3({ code: "PRECONDITION_FAILED", message: "No cloud account for this scope." });
|
|
4185
4463
|
const res = await cloudFetch2("/api/auth/device/revoke", {
|
|
@@ -4202,17 +4480,17 @@ var cloudAuthRouter = router({
|
|
|
4202
4480
|
* the cloud: the web UI asks its own server, which holds the credential.
|
|
4203
4481
|
*/
|
|
4204
4482
|
proxy: protectedProcedure.input(
|
|
4205
|
-
|
|
4206
|
-
path:
|
|
4207
|
-
method:
|
|
4208
|
-
query:
|
|
4209
|
-
body:
|
|
4483
|
+
z5.object({
|
|
4484
|
+
path: z5.string().min(1).max(512),
|
|
4485
|
+
method: z5.enum(["GET", "POST"]).default("GET"),
|
|
4486
|
+
query: z5.record(z5.string().max(128), z5.string().max(2048)).optional(),
|
|
4487
|
+
body: z5.unknown().optional(),
|
|
4210
4488
|
// Obligatoire, et seul : c'est la porte par laquelle passent tous les
|
|
4211
4489
|
// appels cloud de l'interface. La laisser optionnelle est ce qui a
|
|
4212
4490
|
// permis aux composables partagées de n'envoyer aucune portée pendant
|
|
4213
4491
|
// trente routes, et au serveur de retomber sur « le compte unique du
|
|
4214
4492
|
// poste » — muet dès qu'il y en a eu deux.
|
|
4215
|
-
accountId:
|
|
4493
|
+
accountId: z5.string().min(1).max(64)
|
|
4216
4494
|
})
|
|
4217
4495
|
).mutation(async ({ input }) => {
|
|
4218
4496
|
if (!isAllowedProxyPath(input.path)) {
|
|
@@ -4994,7 +5272,7 @@ function tailTranscript(opts) {
|
|
|
4994
5272
|
|
|
4995
5273
|
// ../server/src/services/ai-runners/claude-pty-runner.ts
|
|
4996
5274
|
async function getAgentManager() {
|
|
4997
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
5275
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-ACPQWUZ5.js");
|
|
4998
5276
|
return agentManager2;
|
|
4999
5277
|
}
|
|
5000
5278
|
function buildPtyArgs(params, sessionId, opts) {
|
|
@@ -5686,7 +5964,7 @@ async function shutdownCodexAppServer() {
|
|
|
5686
5964
|
}
|
|
5687
5965
|
}
|
|
5688
5966
|
async function getAgentManager2() {
|
|
5689
|
-
const { agentManager: agentManager2 } = await import("./agent-manager-
|
|
5967
|
+
const { agentManager: agentManager2 } = await import("./agent-manager-ACPQWUZ5.js");
|
|
5690
5968
|
return agentManager2;
|
|
5691
5969
|
}
|
|
5692
5970
|
function parseRuneyaCurlCommand(command) {
|
|
@@ -6124,18 +6402,18 @@ ${prompt}`;
|
|
|
6124
6402
|
};
|
|
6125
6403
|
|
|
6126
6404
|
// ../server/src/trpc/routers/chat.ts
|
|
6127
|
-
var MessageSchema =
|
|
6128
|
-
role:
|
|
6129
|
-
content:
|
|
6405
|
+
var MessageSchema = z6.object({
|
|
6406
|
+
role: z6.enum(["user", "assistant"]),
|
|
6407
|
+
content: z6.string().max(1e5)
|
|
6130
6408
|
});
|
|
6131
|
-
var ImagePartSchema =
|
|
6132
|
-
type:
|
|
6133
|
-
imageId:
|
|
6134
|
-
url:
|
|
6135
|
-
mimeType:
|
|
6136
|
-
altText:
|
|
6409
|
+
var ImagePartSchema = z6.object({
|
|
6410
|
+
type: z6.literal("image"),
|
|
6411
|
+
imageId: z6.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i),
|
|
6412
|
+
url: z6.string().max(500),
|
|
6413
|
+
mimeType: z6.string().max(100),
|
|
6414
|
+
altText: z6.string().max(500).optional()
|
|
6137
6415
|
});
|
|
6138
|
-
var ImagePartsSchema =
|
|
6416
|
+
var ImagePartsSchema = z6.array(ImagePartSchema).max(5).optional();
|
|
6139
6417
|
var LANGUAGE_INSTRUCTION = "Always respond in the same language the user writes in.";
|
|
6140
6418
|
async function buildSystemPrompt(apiKey) {
|
|
6141
6419
|
const allServices = await serviceStore.list();
|
|
@@ -6523,24 +6801,24 @@ async function startCodexSession(convId, prompt, opts = {}) {
|
|
|
6523
6801
|
});
|
|
6524
6802
|
return { session, done };
|
|
6525
6803
|
}
|
|
6526
|
-
var MessagePartSchema =
|
|
6527
|
-
|
|
6528
|
-
|
|
6529
|
-
|
|
6530
|
-
type:
|
|
6804
|
+
var MessagePartSchema = z6.discriminatedUnion("type", [
|
|
6805
|
+
z6.object({ type: z6.literal("thinking"), text: z6.string().max(1e5) }),
|
|
6806
|
+
z6.object({ type: z6.literal("text"), text: z6.string().max(1e5) }),
|
|
6807
|
+
z6.object({
|
|
6808
|
+
type: z6.literal("tool"),
|
|
6531
6809
|
id: Id128Schema,
|
|
6532
6810
|
name: Id128Schema,
|
|
6533
|
-
input:
|
|
6534
|
-
rawInput:
|
|
6535
|
-
result:
|
|
6536
|
-
isError:
|
|
6537
|
-
pending:
|
|
6811
|
+
input: z6.record(z6.string(), z6.unknown()).optional(),
|
|
6812
|
+
rawInput: z6.string().max(1e4).optional(),
|
|
6813
|
+
result: z6.unknown().optional(),
|
|
6814
|
+
isError: z6.boolean().optional(),
|
|
6815
|
+
pending: z6.boolean()
|
|
6538
6816
|
})
|
|
6539
6817
|
]);
|
|
6540
|
-
var StoredMessageSchema =
|
|
6541
|
-
role:
|
|
6542
|
-
content:
|
|
6543
|
-
parts:
|
|
6818
|
+
var StoredMessageSchema = z6.object({
|
|
6819
|
+
role: z6.enum(["user", "assistant"]),
|
|
6820
|
+
content: z6.string().max(1e5),
|
|
6821
|
+
parts: z6.array(MessagePartSchema).max(200).optional()
|
|
6544
6822
|
});
|
|
6545
6823
|
async function conversationCwd(conv) {
|
|
6546
6824
|
return resolveConversationCwd(conv.id);
|
|
@@ -6557,7 +6835,7 @@ var chatRouter = router({
|
|
|
6557
6835
|
* et sans le même filtre il y reversait toutes les conversations de la
|
|
6558
6836
|
* machine, une seconde après un chargement pourtant filtré.
|
|
6559
6837
|
*/
|
|
6560
|
-
onChanged: protectedProcedure.input(
|
|
6838
|
+
onChanged: protectedProcedure.input(z6.object({
|
|
6561
6839
|
projectId: Id128Schema.optional(),
|
|
6562
6840
|
orgId: Id128Schema.nullable().optional()
|
|
6563
6841
|
}).optional()).subscription(async function* ({ input }) {
|
|
@@ -6605,7 +6883,7 @@ var chatRouter = router({
|
|
|
6605
6883
|
* reachable where they were written, without leaking into every other
|
|
6606
6884
|
* organization's projects.
|
|
6607
6885
|
*/
|
|
6608
|
-
list: protectedProcedure.input(
|
|
6886
|
+
list: protectedProcedure.input(z6.object({
|
|
6609
6887
|
projectId: Id128Schema.optional(),
|
|
6610
6888
|
orgId: Id128Schema.nullable().optional()
|
|
6611
6889
|
}).optional()).query(async ({ input }) => {
|
|
@@ -6613,24 +6891,24 @@ var chatRouter = router({
|
|
|
6613
6891
|
if (!projectId) return conversationStore.list();
|
|
6614
6892
|
return conversationStore.listForProject({ id: projectId, orgId: input?.orgId });
|
|
6615
6893
|
}),
|
|
6616
|
-
get: protectedProcedure.input(
|
|
6894
|
+
get: protectedProcedure.input(z6.object({ id: Id128Schema })).query(async ({ input }) => {
|
|
6617
6895
|
const conv = await conversationStore.get(input.id);
|
|
6618
6896
|
if (!conv) throw new TRPCError4({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
6619
6897
|
return conv;
|
|
6620
6898
|
}),
|
|
6621
|
-
create: protectedProcedure.input(
|
|
6899
|
+
create: protectedProcedure.input(z6.object({
|
|
6622
6900
|
title: ShortString200Schema.optional(),
|
|
6623
|
-
isCli:
|
|
6624
|
-
runner:
|
|
6901
|
+
isCli: z6.boolean().optional(),
|
|
6902
|
+
runner: z6.enum(["claude-code", "codex"]).optional(),
|
|
6625
6903
|
providerId: Id128Schema.optional(),
|
|
6626
6904
|
scenarioId: Id128Schema.optional(),
|
|
6627
|
-
scenarioInput:
|
|
6905
|
+
scenarioInput: z6.string().max(1e5).optional(),
|
|
6628
6906
|
kanbanBoardId: Id128Schema.optional(),
|
|
6629
6907
|
kanbanCardId: Id128Schema.optional(),
|
|
6630
6908
|
// The project the conversation is about: only the caller knows which
|
|
6631
6909
|
// one it is looking at.
|
|
6632
6910
|
projectId: Id128Schema.optional(),
|
|
6633
|
-
orgId:
|
|
6911
|
+
orgId: z6.string().max(128).nullable().optional()
|
|
6634
6912
|
})).mutation(async ({ input }) => {
|
|
6635
6913
|
let scenario = null;
|
|
6636
6914
|
if (input.scenarioId) {
|
|
@@ -6664,13 +6942,13 @@ var chatRouter = router({
|
|
|
6664
6942
|
}
|
|
6665
6943
|
return conv;
|
|
6666
6944
|
}),
|
|
6667
|
-
update: protectedProcedure.input(
|
|
6945
|
+
update: protectedProcedure.input(z6.object({
|
|
6668
6946
|
id: Id128Schema,
|
|
6669
6947
|
title: ShortString200Schema.optional(),
|
|
6670
|
-
messages:
|
|
6671
|
-
contextUsage:
|
|
6672
|
-
inputTokens:
|
|
6673
|
-
contextWindow:
|
|
6948
|
+
messages: z6.array(StoredMessageSchema).max(500).optional(),
|
|
6949
|
+
contextUsage: z6.object({
|
|
6950
|
+
inputTokens: z6.number().int().nonnegative(),
|
|
6951
|
+
contextWindow: z6.number().int().positive()
|
|
6674
6952
|
}).optional()
|
|
6675
6953
|
})).mutation(async ({ input }) => {
|
|
6676
6954
|
const conv = await conversationStore.update(input.id, { title: input.title, messages: input.messages, contextUsage: input.contextUsage });
|
|
@@ -6684,10 +6962,10 @@ var chatRouter = router({
|
|
|
6684
6962
|
* messages, et un réglage qui voyage avec 500 messages se perdrait dans un
|
|
6685
6963
|
* patch dont ce n'est pas le sujet.
|
|
6686
6964
|
*/
|
|
6687
|
-
setCompanion: protectedProcedure.input(
|
|
6965
|
+
setCompanion: protectedProcedure.input(z6.object({
|
|
6688
6966
|
id: Id128Schema,
|
|
6689
|
-
enabled:
|
|
6690
|
-
runner:
|
|
6967
|
+
enabled: z6.boolean(),
|
|
6968
|
+
runner: z6.enum(["claude-code", "codex"]).optional()
|
|
6691
6969
|
})).mutation(async ({ input }) => {
|
|
6692
6970
|
const existing = await conversationStore.get(input.id);
|
|
6693
6971
|
if (!existing) throw new TRPCError4({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
@@ -6710,7 +6988,7 @@ var chatRouter = router({
|
|
|
6710
6988
|
* compagnon silencieux parce qu'il n'avait rien à dire et un message qui
|
|
6711
6989
|
* n'a pas pu être transmis se ressemblent parfaitement sans cette trace.
|
|
6712
6990
|
*/
|
|
6713
|
-
companionDelivery: protectedProcedure.input(
|
|
6991
|
+
companionDelivery: protectedProcedure.input(z6.object({ id: Id128Schema })).query(async ({ input }) => {
|
|
6714
6992
|
const conv = await conversationStore.get(input.id);
|
|
6715
6993
|
const companionId = conv?.companionConversationId;
|
|
6716
6994
|
const running = isCompanionThinking(input.id) || (companionId ? activeSessionRegistry.get(companionId)?.status === "running" : false);
|
|
@@ -6760,7 +7038,7 @@ var chatRouter = router({
|
|
|
6760
7038
|
* route emprunte exactement le chemin de livraison, sans le jugement, et
|
|
6761
7039
|
* rend PAR OÙ le message est passé.
|
|
6762
7040
|
*/
|
|
6763
|
-
testCompanionBridge: protectedProcedure.input(
|
|
7041
|
+
testCompanionBridge: protectedProcedure.input(z6.object({ id: Id128Schema })).mutation(async ({ input }) => {
|
|
6764
7042
|
const conv = await conversationStore.get(input.id);
|
|
6765
7043
|
if (!conv) throw new TRPCError4({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
6766
7044
|
const route = await deliverToMainConversation(
|
|
@@ -6781,7 +7059,7 @@ var chatRouter = router({
|
|
|
6781
7059
|
* entier, bien plus qu'une requête ne doit rester ouverte. L'interface suit
|
|
6782
7060
|
* l'avancement par l'état poussé « il relit », déjà en place.
|
|
6783
7061
|
*/
|
|
6784
|
-
runCompanionNow: protectedProcedure.input(
|
|
7062
|
+
runCompanionNow: protectedProcedure.input(z6.object({ id: Id128Schema })).mutation(async ({ input }) => {
|
|
6785
7063
|
const conv = await conversationStore.get(input.id);
|
|
6786
7064
|
if (!conv) throw new TRPCError4({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
6787
7065
|
if (conv.isCompanion) {
|
|
@@ -6798,7 +7076,7 @@ var chatRouter = router({
|
|
|
6798
7076
|
});
|
|
6799
7077
|
return { started: true };
|
|
6800
7078
|
}),
|
|
6801
|
-
delete: protectedProcedure.input(
|
|
7079
|
+
delete: protectedProcedure.input(z6.object({ id: Id128Schema })).mutation(async ({ input }) => {
|
|
6802
7080
|
const existing = await conversationStore.get(input.id);
|
|
6803
7081
|
if (!existing) throw new TRPCError4({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
6804
7082
|
resetRelaunches(input.id);
|
|
@@ -6826,12 +7104,12 @@ var chatRouter = router({
|
|
|
6826
7104
|
(err) => console.error("[chat.delete] Image cleanup error:", err)
|
|
6827
7105
|
);
|
|
6828
7106
|
}),
|
|
6829
|
-
archive: protectedProcedure.input(
|
|
7107
|
+
archive: protectedProcedure.input(z6.object({ id: Id128Schema, archived: z6.boolean() })).mutation(async ({ input }) => {
|
|
6830
7108
|
const conv = await conversationStore.update(input.id, { archived: input.archived });
|
|
6831
7109
|
if (!conv) throw new TRPCError4({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
6832
7110
|
return conv;
|
|
6833
7111
|
}),
|
|
6834
|
-
pin: protectedProcedure.input(
|
|
7112
|
+
pin: protectedProcedure.input(z6.object({ id: Id128Schema, pinned: z6.boolean() })).mutation(async ({ input }) => {
|
|
6835
7113
|
const conv = await conversationStore.setPinned(input.id, input.pinned);
|
|
6836
7114
|
if (!conv) throw new TRPCError4({ code: "NOT_FOUND", message: "Conversation not found" });
|
|
6837
7115
|
return conv;
|
|
@@ -6839,16 +7117,16 @@ var chatRouter = router({
|
|
|
6839
7117
|
// L'ordre ne vaut que pour les ids donnés : l'écran ne connaît que les
|
|
6840
7118
|
// conversations du projet courant, et les épinglées des autres projets
|
|
6841
7119
|
// n'ont pas à bouger parce qu'on a rangé celles-ci.
|
|
6842
|
-
reorderPinned: protectedProcedure.input(
|
|
7120
|
+
reorderPinned: protectedProcedure.input(z6.object({ ids: z6.array(Id128Schema).max(500) })).mutation(async ({ input }) => {
|
|
6843
7121
|
await conversationStore.reorderPinned(input.ids);
|
|
6844
7122
|
})
|
|
6845
7123
|
}),
|
|
6846
|
-
listModels: protectedProcedure.input(
|
|
7124
|
+
listModels: protectedProcedure.input(z6.object({
|
|
6847
7125
|
providerId: Id128Schema.optional(),
|
|
6848
7126
|
// Le projet dit de quelle organisation lire les fournisseurs ; absent,
|
|
6849
7127
|
// ce sont ceux du poste.
|
|
6850
7128
|
projectId: Id128Schema.optional(),
|
|
6851
|
-
orgId:
|
|
7129
|
+
orgId: z6.string().max(128).nullable().optional()
|
|
6852
7130
|
}).optional()).query(async ({ input }) => {
|
|
6853
7131
|
const active = await getActiveProvider(
|
|
6854
7132
|
input?.providerId,
|
|
@@ -6861,7 +7139,7 @@ var chatRouter = router({
|
|
|
6861
7139
|
return [];
|
|
6862
7140
|
}
|
|
6863
7141
|
}),
|
|
6864
|
-
checkCliAvailability: protectedProcedure.input(
|
|
7142
|
+
checkCliAvailability: protectedProcedure.input(z6.object({ agentId: Id128Schema.optional() }).optional()).query(async ({ input }) => {
|
|
6865
7143
|
if (input?.agentId) {
|
|
6866
7144
|
try {
|
|
6867
7145
|
const res = await agentManager.agentQuery(
|
|
@@ -6879,12 +7157,12 @@ var chatRouter = router({
|
|
|
6879
7157
|
]);
|
|
6880
7158
|
return { available: claudeOk, codexAvailable: codexOk };
|
|
6881
7159
|
}),
|
|
6882
|
-
enhanceScenarioPrompt: protectedProcedure.input(
|
|
6883
|
-
text:
|
|
7160
|
+
enhanceScenarioPrompt: protectedProcedure.input(z6.object({
|
|
7161
|
+
text: z6.string().max(1e4),
|
|
6884
7162
|
providerId: Id128Schema.optional(),
|
|
6885
|
-
model:
|
|
7163
|
+
model: z6.string().max(200).optional(),
|
|
6886
7164
|
projectId: Id128Schema.optional(),
|
|
6887
|
-
orgId:
|
|
7165
|
+
orgId: z6.string().max(128).nullable().optional()
|
|
6888
7166
|
})).mutation(async ({ input }) => {
|
|
6889
7167
|
const active = await getActiveProvider(
|
|
6890
7168
|
input.providerId,
|
|
@@ -6941,22 +7219,22 @@ Return ONLY the improved text, no explanation, no preamble.`;
|
|
|
6941
7219
|
}
|
|
6942
7220
|
}),
|
|
6943
7221
|
getStreamingStatus: protectedProcedure.query(() => activeSessionRegistry.listActive()),
|
|
6944
|
-
stopSession: protectedProcedure.input(
|
|
7222
|
+
stopSession: protectedProcedure.input(z6.object({ conversationId: ConversationIdSchema })).mutation(({ input }) => {
|
|
6945
7223
|
if (process.env.RUNEYA_DEBUG) console.log("[chat]: stopSession");
|
|
6946
7224
|
const killed = activeSessionRegistry.kill(input.conversationId);
|
|
6947
7225
|
if (!killed) throw new TRPCError4({ code: "NOT_FOUND", message: "No active session for this conversation" });
|
|
6948
7226
|
return { ok: true };
|
|
6949
7227
|
}),
|
|
6950
|
-
streamViaClaudeCode: protectedProcedure.input(
|
|
7228
|
+
streamViaClaudeCode: protectedProcedure.input(z6.object({
|
|
6951
7229
|
conversationId: ConversationIdSchema,
|
|
6952
|
-
prompt:
|
|
6953
|
-
contextNote:
|
|
7230
|
+
prompt: z6.string().max(1e5),
|
|
7231
|
+
contextNote: z6.string().max(2e5).optional(),
|
|
6954
7232
|
model: ShortString200Schema.optional(),
|
|
6955
|
-
effort:
|
|
6956
|
-
reconnect:
|
|
7233
|
+
effort: z6.enum(["low", "medium", "high"]).optional(),
|
|
7234
|
+
reconnect: z6.boolean().optional(),
|
|
6957
7235
|
agentId: Id128Schema.optional(),
|
|
6958
|
-
environmentId:
|
|
6959
|
-
imageIds:
|
|
7236
|
+
environmentId: z6.string().max(128).optional(),
|
|
7237
|
+
imageIds: z6.array(z6.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)).max(5).optional(),
|
|
6960
7238
|
imageParts: ImagePartsSchema
|
|
6961
7239
|
})).subscription(async function* ({ input, ctx, signal }) {
|
|
6962
7240
|
if (process.env.RUNEYA_DEBUG) console.log("[chat]: Reconnect");
|
|
@@ -7058,15 +7336,15 @@ ${imagePaths.map((p) => `Image: ${p}`).join("\n")}` : cliPrompt;
|
|
|
7058
7336
|
if (process.env.RUNEYA_DEBUG) console.log("[chat]: drainSession...");
|
|
7059
7337
|
yield* drainSession(session, signal, false);
|
|
7060
7338
|
}),
|
|
7061
|
-
streamViaCodex: protectedProcedure.input(
|
|
7339
|
+
streamViaCodex: protectedProcedure.input(z6.object({
|
|
7062
7340
|
conversationId: ConversationIdSchema,
|
|
7063
|
-
prompt:
|
|
7064
|
-
contextNote:
|
|
7341
|
+
prompt: z6.string().max(1e5),
|
|
7342
|
+
contextNote: z6.string().max(2e5).optional(),
|
|
7065
7343
|
model: ShortString200Schema.optional(),
|
|
7066
|
-
reconnect:
|
|
7344
|
+
reconnect: z6.boolean().optional(),
|
|
7067
7345
|
agentId: Id128Schema.optional(),
|
|
7068
|
-
environmentId:
|
|
7069
|
-
imageIds:
|
|
7346
|
+
environmentId: z6.string().max(128).optional(),
|
|
7347
|
+
imageIds: z6.array(z6.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)).max(5).optional(),
|
|
7070
7348
|
imageParts: ImagePartsSchema
|
|
7071
7349
|
})).subscription(async function* ({ input, ctx, signal }) {
|
|
7072
7350
|
const existingSession = activeSessionRegistry.get(input.conversationId);
|
|
@@ -7136,13 +7414,13 @@ ${input.prompt}` : input.prompt;
|
|
|
7136
7414
|
});
|
|
7137
7415
|
yield* drainSession(session, signal, false);
|
|
7138
7416
|
}),
|
|
7139
|
-
send: protectedProcedure.input(
|
|
7417
|
+
send: protectedProcedure.input(z6.object({
|
|
7140
7418
|
conversationId: ConversationIdSchema,
|
|
7141
|
-
messages:
|
|
7419
|
+
messages: z6.array(MessageSchema).min(0).max(100),
|
|
7142
7420
|
model: ShortString200Schema.optional(),
|
|
7143
|
-
contextNote:
|
|
7144
|
-
reconnect:
|
|
7145
|
-
imageIds:
|
|
7421
|
+
contextNote: z6.string().max(2e5).optional(),
|
|
7422
|
+
reconnect: z6.boolean().optional(),
|
|
7423
|
+
imageIds: z6.array(z6.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i)).max(5).optional(),
|
|
7146
7424
|
imageParts: ImagePartsSchema
|
|
7147
7425
|
})).subscription(async function* ({ input, ctx, signal }) {
|
|
7148
7426
|
const existingSession = activeSessionRegistry.get(input.conversationId);
|
|
@@ -7255,25 +7533,25 @@ ${input.prompt}` : input.prompt;
|
|
|
7255
7533
|
// ── PTY passthrough (interactive Claude Code session) ────────────────────
|
|
7256
7534
|
pty: router({
|
|
7257
7535
|
/** Start a PTY session running `claude --resume <sessionId>` (or fresh). */
|
|
7258
|
-
start: protectedProcedure.input(
|
|
7259
|
-
agentId:
|
|
7260
|
-
sessionId:
|
|
7261
|
-
runner:
|
|
7262
|
-
resume:
|
|
7263
|
-
model:
|
|
7264
|
-
cwd:
|
|
7536
|
+
start: protectedProcedure.input(z6.object({
|
|
7537
|
+
agentId: z6.string().max(128).optional(),
|
|
7538
|
+
sessionId: z6.string().max(128).optional(),
|
|
7539
|
+
runner: z6.enum(["claude-code", "codex"]).default("claude-code"),
|
|
7540
|
+
resume: z6.boolean().default(false),
|
|
7541
|
+
model: z6.string().max(128).optional(),
|
|
7542
|
+
cwd: z6.string().max(4096).optional(),
|
|
7265
7543
|
/** Anchors the session when no explicit cwd is given. */
|
|
7266
|
-
serviceId:
|
|
7544
|
+
serviceId: z6.string().max(128).optional(),
|
|
7267
7545
|
projectId: Id128Schema.optional(),
|
|
7268
|
-
orgId:
|
|
7269
|
-
cols:
|
|
7270
|
-
rows:
|
|
7271
|
-
enableMcp:
|
|
7272
|
-
apiBaseUrl:
|
|
7273
|
-
environmentId:
|
|
7274
|
-
attachedContexts:
|
|
7275
|
-
label:
|
|
7276
|
-
text:
|
|
7546
|
+
orgId: z6.string().max(128).nullable().optional(),
|
|
7547
|
+
cols: z6.number().int().min(1).max(1e3).default(120),
|
|
7548
|
+
rows: z6.number().int().min(1).max(1e3).default(30),
|
|
7549
|
+
enableMcp: z6.boolean().default(false),
|
|
7550
|
+
apiBaseUrl: z6.string().max(512).optional(),
|
|
7551
|
+
environmentId: z6.string().max(128).optional(),
|
|
7552
|
+
attachedContexts: z6.array(z6.object({
|
|
7553
|
+
label: z6.string().max(200),
|
|
7554
|
+
text: z6.string().max(1e6)
|
|
7277
7555
|
})).max(20).optional()
|
|
7278
7556
|
})).mutation(async ({ input, ctx }) => {
|
|
7279
7557
|
const t0 = Date.now();
|
|
@@ -7431,10 +7709,10 @@ Context:
|
|
|
7431
7709
|
return { spawnId: res.spawnId, agentId, reattached: false };
|
|
7432
7710
|
}),
|
|
7433
7711
|
/** Subscribe to PTY output stream (raw text with ANSI). */
|
|
7434
|
-
stream: protectedProcedure.input(
|
|
7435
|
-
agentId:
|
|
7436
|
-
spawnId:
|
|
7437
|
-
fromOffset:
|
|
7712
|
+
stream: protectedProcedure.input(z6.object({
|
|
7713
|
+
agentId: z6.string().max(128).optional(),
|
|
7714
|
+
spawnId: z6.string().max(128),
|
|
7715
|
+
fromOffset: z6.number().int().min(0).default(0)
|
|
7438
7716
|
})).subscription(async function* ({ input, signal }) {
|
|
7439
7717
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
7440
7718
|
if (!agentId) throw new TRPCError4({ code: "PRECONDITION_FAILED", message: "No agent available" });
|
|
@@ -7489,10 +7767,10 @@ Context:
|
|
|
7489
7767
|
}
|
|
7490
7768
|
}),
|
|
7491
7769
|
/** Write input to a PTY session (keystrokes from xterm). */
|
|
7492
|
-
write: protectedProcedure.input(
|
|
7493
|
-
agentId:
|
|
7494
|
-
spawnId:
|
|
7495
|
-
data:
|
|
7770
|
+
write: protectedProcedure.input(z6.object({
|
|
7771
|
+
agentId: z6.string().max(128).optional(),
|
|
7772
|
+
spawnId: z6.string().max(128),
|
|
7773
|
+
data: z6.string().max(1e6)
|
|
7496
7774
|
})).mutation(async ({ input }) => {
|
|
7497
7775
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
7498
7776
|
if (!agentId) throw new TRPCError4({ code: "PRECONDITION_FAILED", message: "No agent available" });
|
|
@@ -7502,11 +7780,11 @@ Context:
|
|
|
7502
7780
|
});
|
|
7503
7781
|
}),
|
|
7504
7782
|
/** Resize a PTY session. */
|
|
7505
|
-
resize: protectedProcedure.input(
|
|
7506
|
-
agentId:
|
|
7507
|
-
spawnId:
|
|
7508
|
-
cols:
|
|
7509
|
-
rows:
|
|
7783
|
+
resize: protectedProcedure.input(z6.object({
|
|
7784
|
+
agentId: z6.string().max(128).optional(),
|
|
7785
|
+
spawnId: z6.string().max(128),
|
|
7786
|
+
cols: z6.number().int().min(1).max(1e3),
|
|
7787
|
+
rows: z6.number().int().min(1).max(1e3)
|
|
7510
7788
|
})).mutation(async ({ input }) => {
|
|
7511
7789
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
7512
7790
|
if (!agentId) throw new TRPCError4({ code: "PRECONDITION_FAILED", message: "No agent available" });
|
|
@@ -7522,11 +7800,11 @@ Context:
|
|
|
7522
7800
|
* picks it up. Returns the tmp path and which clipboard method succeeded
|
|
7523
7801
|
* (null if none — caller should inject `@<path>` instead of Ctrl+V).
|
|
7524
7802
|
*/
|
|
7525
|
-
pasteImage: protectedProcedure.input(
|
|
7526
|
-
agentId:
|
|
7527
|
-
sessionId:
|
|
7528
|
-
mimeType:
|
|
7529
|
-
base64:
|
|
7803
|
+
pasteImage: protectedProcedure.input(z6.object({
|
|
7804
|
+
agentId: z6.string().max(128).optional(),
|
|
7805
|
+
sessionId: z6.string().max(128).optional(),
|
|
7806
|
+
mimeType: z6.string().max(64),
|
|
7807
|
+
base64: z6.string().max(15e6)
|
|
7530
7808
|
})).mutation(async ({ input }) => {
|
|
7531
7809
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
7532
7810
|
if (!agentId) throw new TRPCError4({ code: "PRECONDITION_FAILED", message: "No agent available" });
|
|
@@ -7544,7 +7822,7 @@ Context:
|
|
|
7544
7822
|
* Read the transcript Claude Code stores on disk for a given session.
|
|
7545
7823
|
* Returns parsed JSONL entries (user / assistant messages, tool uses, etc.).
|
|
7546
7824
|
*/
|
|
7547
|
-
transcript: protectedProcedure.input(
|
|
7825
|
+
transcript: protectedProcedure.input(z6.object({ sessionId: z6.string().max(128) })).query(async ({ input }) => {
|
|
7548
7826
|
return readClaudeTranscript(input.sessionId);
|
|
7549
7827
|
}),
|
|
7550
7828
|
/**
|
|
@@ -7552,9 +7830,9 @@ Context:
|
|
|
7552
7830
|
* when was the transcript JSONL last touched? Used by the non-PTY view
|
|
7553
7831
|
* to show a "Claude is thinking…" indicator while output streams.
|
|
7554
7832
|
*/
|
|
7555
|
-
activity: protectedProcedure.input(
|
|
7556
|
-
agentId:
|
|
7557
|
-
sessionId:
|
|
7833
|
+
activity: protectedProcedure.input(z6.object({
|
|
7834
|
+
agentId: z6.string().max(128).optional(),
|
|
7835
|
+
sessionId: z6.string().max(128)
|
|
7558
7836
|
})).query(async ({ input }) => {
|
|
7559
7837
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
7560
7838
|
let running = false;
|
|
@@ -7580,7 +7858,7 @@ Context:
|
|
|
7580
7858
|
* them on the conversation, so the non-PTY chat view stays in sync.
|
|
7581
7859
|
* Uses the conversation id as session id (PTY sessions are spawned that way).
|
|
7582
7860
|
*/
|
|
7583
|
-
syncTranscript: protectedProcedure.input(
|
|
7861
|
+
syncTranscript: protectedProcedure.input(z6.object({ conversationId: ConversationIdSchema })).mutation(async ({ input }) => {
|
|
7584
7862
|
const conv = await conversationStore.get(input.conversationId);
|
|
7585
7863
|
if (!conv) {
|
|
7586
7864
|
throw new TRPCError4({ code: "NOT_FOUND", message: `Conversation ${input.conversationId} not found` });
|
|
@@ -7594,14 +7872,14 @@ Context:
|
|
|
7594
7872
|
* with the given sessionId. Used to benchmark the PTY → tRPC → xterm.js
|
|
7595
7873
|
* pipeline. Open the conversation in PTY mode to attach to it.
|
|
7596
7874
|
*/
|
|
7597
|
-
debugStress: protectedProcedure.input(
|
|
7598
|
-
sessionId:
|
|
7599
|
-
agentId:
|
|
7600
|
-
bytesPerSec:
|
|
7601
|
-
chunkSize:
|
|
7602
|
-
durationMs:
|
|
7603
|
-
cols:
|
|
7604
|
-
rows:
|
|
7875
|
+
debugStress: protectedProcedure.input(z6.object({
|
|
7876
|
+
sessionId: z6.string().max(128),
|
|
7877
|
+
agentId: z6.string().max(128).optional(),
|
|
7878
|
+
bytesPerSec: z6.number().int().min(100).max(1e7).default(5e4),
|
|
7879
|
+
chunkSize: z6.number().int().min(1).max(65536).default(256),
|
|
7880
|
+
durationMs: z6.number().int().min(0).max(36e5).default(0),
|
|
7881
|
+
cols: z6.number().int().min(1).max(1e3).default(120),
|
|
7882
|
+
rows: z6.number().int().min(1).max(1e3).default(30)
|
|
7605
7883
|
})).mutation(async ({ input }) => {
|
|
7606
7884
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
7607
7885
|
if (!agentId) throw new TRPCError4({ code: "PRECONDITION_FAILED", message: "No agent available" });
|
|
@@ -7648,9 +7926,9 @@ Context:
|
|
|
7648
7926
|
return { spawnId: res.spawnId, agentId, stressSessionId };
|
|
7649
7927
|
}),
|
|
7650
7928
|
/** Kill a PTY session. */
|
|
7651
|
-
kill: protectedProcedure.input(
|
|
7652
|
-
agentId:
|
|
7653
|
-
spawnId:
|
|
7929
|
+
kill: protectedProcedure.input(z6.object({
|
|
7930
|
+
agentId: z6.string().max(128).optional(),
|
|
7931
|
+
spawnId: z6.string().max(128)
|
|
7654
7932
|
})).mutation(async ({ input }) => {
|
|
7655
7933
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
7656
7934
|
if (!agentId) throw new TRPCError4({ code: "PRECONDITION_FAILED", message: "No agent available" });
|
|
@@ -7672,6 +7950,7 @@ export {
|
|
|
7672
7950
|
requireServiceAction,
|
|
7673
7951
|
getAllowedServiceIds,
|
|
7674
7952
|
requireEnvAction,
|
|
7953
|
+
canEnvAction,
|
|
7675
7954
|
appVersion,
|
|
7676
7955
|
APP_VERSION_HEADER,
|
|
7677
7956
|
cloudSessionStore,
|
|
@@ -7729,4 +8008,4 @@ export {
|
|
|
7729
8008
|
startCliSession,
|
|
7730
8009
|
chatRouter
|
|
7731
8010
|
};
|
|
7732
|
-
//# sourceMappingURL=chunk-
|
|
8011
|
+
//# sourceMappingURL=chunk-22RJM654.js.map
|