@runeya/runeya 2.0.102 → 2.0.104
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-manager-4XJUIZKL.js +9 -0
- package/assets/icon-alert.ico +0 -0
- package/assets/icon-alert.png +0 -0
- package/assets/icon-alert.svg +19 -0
- package/{chat-OXRRBDB3.js → chat-3XDVULFH.js} +8 -7
- package/{chunk-F3HKV5AU.js → chunk-5GYBAMHV.js} +5 -3
- package/{chunk-F3HKV5AU.js.map → chunk-5GYBAMHV.js.map} +1 -1
- package/{chunk-PSTMO7EE.js → chunk-AAK7ACHG.js} +9 -7
- package/{chunk-PSTMO7EE.js.map → chunk-AAK7ACHG.js.map} +1 -1
- package/{chunk-BDVQB5RK.js → chunk-IOAGFK3P.js} +28 -20
- package/{chunk-BDVQB5RK.js.map → chunk-IOAGFK3P.js.map} +1 -1
- package/chunk-LTLOVQJQ.js +291 -0
- package/chunk-LTLOVQJQ.js.map +1 -0
- package/{chunk-BHLCBARP.js → chunk-NPORVPEO.js} +21 -3
- package/chunk-NPORVPEO.js.map +1 -0
- package/chunk-PH4E5WDN.js +137 -0
- package/chunk-PH4E5WDN.js.map +1 -0
- package/{chunk-NDO5VFZY.js → chunk-QRMG6GMX.js} +694 -917
- package/chunk-QRMG6GMX.js.map +1 -0
- package/{companion-JQGNL4U7.js → companion-MUFVXURV.js} +5 -4
- package/{desktop-launcher-FHNURZA7.js → desktop-launcher-N7WRF3LC.js} +11 -17
- package/desktop-launcher-N7WRF3LC.js.map +1 -0
- package/index.js +68 -2
- package/index.js.map +1 -1
- package/instances-command-KZ5UGXOR.js +17 -0
- package/package.json +4 -1
- package/settings-manager-Y4GNAXOH.js +9 -0
- package/settings-manager-Y4GNAXOH.js.map +1 -0
- package/{src-HZ2XO6TV.js → src-TEL7L4K2.js} +707 -249
- package/src-TEL7L4K2.js.map +1 -0
- package/tray-NZOXYN5G.js +307 -0
- package/tray-NZOXYN5G.js.map +1 -0
- package/vault-resolver-JR7TCITD.js +55 -0
- package/vault-resolver-JR7TCITD.js.map +1 -0
- package/web/assets/AgentScalarChatInterface.vue-CveVquKX.js +13 -0
- package/web/assets/AgentTerminalPage-DkNOUzXx.js +1 -0
- package/web/assets/AiChatPage-CTF8FIV4.js +1 -0
- package/web/assets/{AppLayout-DeWqCLuK.css → AppLayout-CYQBjQBU.css} +1 -1
- package/web/assets/AppLayout-agjOv6PY.js +1 -0
- package/web/assets/AuditPage-dgYwbpdR.js +1 -0
- package/web/assets/CloudAccountPage-Bx9gNcJQ.js +1 -0
- package/web/assets/CloudAccountPage-DEnVoeik.js +1 -0
- package/web/assets/CloudMessagingPage-qKrKfB-F.js +2 -0
- package/web/assets/DashboardPage-Bwq2Nhg2.js +1 -0
- package/web/assets/DirectoryPickerDialog-D8XDtgZh.js +1 -0
- package/web/assets/{EditorIcon-C9XKLhc7.js → EditorIcon-CA5ff6aq.js} +2 -2
- package/web/assets/{EnvironmentForm-bS48MK8k.js → EnvironmentForm-CzSZiA51.js} +2 -2
- package/web/assets/EnvironmentFormPage-CuSgaY1_.js +1 -0
- package/web/assets/EnvironmentListPage-Dsw3CJvc.js +1 -0
- package/web/assets/KanbanBoardPage-CUVcQ4YW.js +4 -0
- package/web/assets/KanbanListPage-CGhlz8Pe.js +1 -0
- package/web/assets/LaunchProjectPage-BveJC98q.js +1 -0
- package/web/assets/LaunchServicesPage-B0W02JDF.js +1 -0
- package/web/assets/LogViewer-Rr_WYaUa.js +3 -0
- package/web/assets/OrgKeyPrompt-CG2-L3Lf.js +1 -0
- package/web/assets/ProcessControls-DvSw2AQV.js +1 -0
- package/web/assets/ProcessDetailPage-Decf7LjW.js +1 -0
- package/web/assets/{ProcessMetrics-CBPR5ozp.js → ProcessMetrics-xWpkhjoe.js} +2 -2
- package/web/assets/ProjectDetailPage-xg7x2vFI.js +1 -0
- package/web/assets/ProjectListPage-Bv2fwGla.js +1 -0
- package/web/assets/RandomJobTestPage-BEn1gSo3.js +2 -0
- package/web/assets/ScenarioEditorPage-CLiTQe4B.js +14 -0
- package/web/assets/SendToChatDialog-DdvfNdWg.js +1 -0
- package/web/assets/ServiceControlsBar-DKc2e9Ns.js +1 -0
- package/web/assets/ServiceDetailPage-BfkVlUEh.js +2 -0
- package/web/assets/ServiceFormPage-BTJBk_wB.js +1 -0
- package/web/assets/SettingsPage-BlOHIALT.js +2063 -0
- package/web/assets/SettingsPage-Dw6tbcbw.css +1 -0
- package/web/assets/UnlockPage-u3Zqu1aU.js +1 -0
- package/web/assets/VariablesTable-MFZSG4LV.js +1 -0
- package/web/assets/VaultMigrationPage-CTMCgOtW.js +1 -0
- package/web/assets/VersionBadge-D5zxX_zs.js +1 -0
- package/web/assets/WikiPage-BkQZP60x.js +1 -0
- package/web/assets/WikiView-CFX5gG2s.js +1 -0
- package/web/assets/add-scalar-classes-ClMP-KRl.js +387 -0
- package/web/assets/{autocomplete-CtIxw1IN.js → autocomplete-CBY4HTQR.js} +3 -3
- package/web/assets/{basic-shape-diamond.svg-BErisM9Y.js → basic-shape-diamond.svg-irIu-f9l.js} +1 -1
- package/web/assets/{basic-shape-hexagon.svg-yC7RoYpa.js → basic-shape-hexagon.svg-DasEKbDT.js} +1 -1
- package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DRmanUIO.js → basic-shape-primary-circle-ellipse-round.svg-DFanDXAm.js} +1 -1
- package/web/assets/{basic-shape-primary-square-rectangle.svg-DxuoouSj.js → basic-shape-primary-square-rectangle.svg-Dkyo9dlJ.js} +1 -1
- package/web/assets/{basic-shape-shield.svg-Cy_Frn-W.js → basic-shape-shield.svg-3imE69mJ.js} +1 -1
- package/web/assets/{browser-h0mxWbci.js → browser-Aa5s7rfo.js} +1 -1
- package/web/assets/{browser-Dj3qxJqB.js → browser-DUQZPder.js} +1 -1
- package/web/assets/card-D-ziPwAg.js +32 -0
- package/web/assets/{checkbox-CTw-YDe_.js → checkbox-tdxfIWhT.js} +3 -3
- package/web/assets/{chip-DwSSTlaC.js → chip-DQ2M3lMV.js} +2 -2
- package/web/assets/{client-DYNnTrNm.js → client-w--F512m.js} +2 -2
- package/web/assets/cloud-chat.store-DwSl7oKq.js +1 -0
- package/web/assets/cloud-session-Do-zjE8q.js +1 -0
- package/web/assets/column-Bv9vDejf.js +907 -0
- package/web/assets/{computer-device-desktop-monitor.svg-TLZAKrIM.js → computer-device-desktop-monitor.svg-CYOP3WaB.js} +1 -1
- package/web/assets/{computer-device-desktop.svg-YRcL_Qxn.js → computer-device-desktop.svg-qlrBIvQY.js} +1 -1
- package/web/assets/{computer-device-laptop.svg-CZUEbqra.js → computer-device-laptop.svg-IHPj_lEm.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-CcsmeFGb.js → computer-device-mobile-phone-android-samsung-back.svg-DKPSbT77.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CXjVvTBT.js → computer-device-mobile-phone-android-samsung.svg-s5qvH0rw.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-BQQXUoZZ.js → computer-device-mobile-phone-iphone-x-back.svg-B77oIjAn.js} +1 -1
- package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CG8VbAP-.js → computer-device-mobile-phone-iphone-x.svg-Cnz0nuie.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet-touch.svg-DDMUt0S4.js → computer-device-mobile-tablet-touch.svg-CGw0OJdZ.js} +1 -1
- package/web/assets/{computer-device-mobile-tablet.svg-CBXtF47n.js → computer-device-mobile-tablet.svg-BllNUwYz.js} +1 -1
- package/web/assets/{computer-device-network-ethernet-cat6.svg-ObjUhwds.js → computer-device-network-ethernet-cat6.svg-CDcu8JSm.js} +1 -1
- package/web/assets/{computer-device-network-lan-www.svg-NGYEGuba.js → computer-device-network-lan-www.svg-Cr2Mzrgm.js} +1 -1
- package/web/assets/{computer-device-network-wifi-connection.svg-CSnNdKGm.js → computer-device-network-wifi-connection.svg-BdIGk-iA.js} +1 -1
- package/web/assets/{computer-device-network-wifi-router.svg-CG7iHt_n.js → computer-device-network-wifi-router.svg-ChrqaXoE.js} +1 -1
- package/web/assets/{cssMode-Bclh_xI1.js → cssMode-DQ3QWGDZ.js} +1 -1
- package/web/assets/{divider-Bb31-CFf.js → divider-BnVkpmcn.js} +2 -2
- package/web/assets/{docx-preview-seOy1U3d.js → docx-preview-DOVrOL2W.js} +1 -1
- package/web/assets/{ecology-science-erlenmeyer-flask.svg-B8emvJ_p.js → ecology-science-erlenmeyer-flask.svg-Bz0bzqPi.js} +1 -1
- package/web/assets/{fieldset-Czp1Leik.js → fieldset-CaBT4en1.js} +2 -2
- package/web/assets/{freemarker2-D87vjb6-.js → freemarker2-e7ZK44f9.js} +1 -1
- package/web/assets/{handlebars-CjY4u0vA.js → handlebars-BunSmNEk.js} +1 -1
- package/web/assets/{html-C5pOjLe-.js → html-t6Ga4VcA.js} +1 -1
- package/web/assets/{htmlMode-CunB4Bjm.js → htmlMode-CjsAz81L.js} +1 -1
- package/web/assets/{image-flash-lightning.svg-7dRFt_k5.js → image-flash-lightning.svg-CSanVzgy.js} +1 -1
- package/web/assets/{image-picture-flower.svg-ATG6mf9B.js → image-picture-flower.svg-DUlCxHzi.js} +1 -1
- package/web/assets/{index-BMuqGGPP.js → index-CNqv4qMO.js} +287 -287
- package/web/assets/{interface-alert-exclamation-diamond.svg-DuAtIVtT.js → interface-alert-exclamation-diamond.svg-C-uhPFKN.js} +1 -1
- package/web/assets/{interface-alert-exclamation-triangle-warning.svg-Bg9-FBLP.js → interface-alert-exclamation-triangle-warning.svg-BnSCXw68.js} +1 -1
- package/web/assets/{interface-alert-information-circle.svg-C5etvhA3.js → interface-alert-information-circle.svg-CTGCb0Yf.js} +1 -1
- package/web/assets/{interface-award-crown.svg-zuAFLs7y.js → interface-award-crown.svg-T-Lov9NP.js} +1 -1
- package/web/assets/{interface-bookmark.svg-CfBz0NE3.js → interface-bookmark-tag.svg-DLjS0Lnz.js} +1 -1
- package/web/assets/{interface-bookmark-tag.svg-C3EKMHOq.js → interface-bookmark.svg-CZekkdj9.js} +1 -1
- package/web/assets/{interface-calendar-date-one.svg-DGYz2Prk.js → interface-calendar-date-one.svg-DmD4yfdS.js} +1 -1
- package/web/assets/{interface-content-book-open-pages.svg-DGiJpxy1.js → interface-content-book-open-pages.svg-wHqGX15c.js} +1 -1
- package/web/assets/{interface-content-book-page.svg-DydK46P0.js → interface-content-book-page.svg-MCSanA32.js} +1 -1
- package/web/assets/{interface-content-file.svg-D0pUOvAN.js → interface-content-file.svg-DBpf8dcs.js} +1 -1
- package/web/assets/{interface-content-folder.svg-DiJ3Pfaa.js → interface-content-folder.svg-DZSoYO0L.js} +1 -1
- package/web/assets/interface-content-folder.svg-ZujlG0Az.js +1 -0
- package/web/assets/{interface-copy-clipboard.svg-Dl3aROYy.js → interface-copy-clipboard.svg-C1-sJNwr.js} +1 -1
- package/web/assets/{interface-edit-attachment.svg-UmDFMIt5.js → interface-edit-attachment.svg-CpxThva3.js} +1 -1
- package/web/assets/{interface-edit-binocular.svg-Bp_8Pfer.js → interface-edit-binocular.svg-BHfWW26z.js} +1 -1
- package/web/assets/{interface-edit-magic-wand.svg-B2A8V7mt.js → interface-edit-magic-wand.svg-DcC6CJBy.js} +1 -1
- package/web/assets/{interface-edit-tool-paint-roller.svg-DKjdsVsS.js → interface-edit-tool-paint-roller.svg-BhReRG-a.js} +1 -1
- package/web/assets/{interface-edit-tool-pencil.svg-DuUybI4h.js → interface-edit-tool-pencil.svg-CztZ4Olx.js} +1 -1
- package/web/assets/{interface-favorite-award.svg-DHeTFQv8.js → interface-favorite-award.svg-C0kleqGy.js} +1 -1
- package/web/assets/{interface-favorite-flag.svg-kKzUSQkq.js → interface-favorite-flag.svg-B-VJ_w7p.js} +1 -1
- package/web/assets/{interface-favorite-heart.svg-CqMgA2mm.js → interface-favorite-heart.svg-CuRtXB-S.js} +1 -1
- package/web/assets/{interface-favorite-star.svg-CuLj8HV6.js → interface-favorite-star.svg-DtEkT0h3.js} +1 -1
- package/web/assets/{interface-favorite-stars-sparkles.svg-lFQTnGOR.js → interface-favorite-stars-sparkles.svg-ffOT-I95.js} +1 -1
- package/web/assets/{interface-hierarchy-flowchart.svg-CBbliSZq.js → interface-hierarchy-flowchart.svg-C5eB0vng.js} +1 -1
- package/web/assets/{interface-home-house.svg-BoFlxzre.js → interface-home-house.svg-Djr3DBJk.js} +1 -1
- package/web/assets/{interface-hyperlink.svg-DcKs1Vcm.js → interface-hyperlink.svg-BaesgCsY.js} +1 -1
- package/web/assets/{interface-lighting-brightness.svg-BSNKEyEg.js → interface-lighting-brightness.svg-CiNPNypw.js} +1 -1
- package/web/assets/{interface-lock-closed.svg-DSP-B9Ze.js → interface-lock-closed.svg-Dk3IIjH4.js} +1 -1
- package/web/assets/{interface-lock-open-unlock.svg-Bzg-oBHY.js → interface-lock-open-unlock.svg-DGG8lod0.js} +1 -1
- package/web/assets/{interface-login-key.svg-DG61Q1lR.js → interface-login-key.svg-ZREdsGBv.js} +1 -1
- package/web/assets/{interface-search.svg-CODjdPxd.js → interface-search.svg-AF3hFV8X.js} +1 -1
- package/web/assets/{interface-setting-cog.svg-CgiaBO1E.js → interface-setting-cog.svg-CxjXHOho.js} +1 -1
- package/web/assets/{interface-share-megaphone-bullhorn.svg-DM0PsgtH.js → interface-share-megaphone-bullhorn.svg-C-Ou9l0X.js} +1 -1
- package/web/assets/{interface-share-rocket.svg-B0geTs35.js → interface-share-rocket.svg-CERB2Bts.js} +1 -1
- package/web/assets/{interface-share-satellite.svg-v9Q6QwAp.js → interface-share-satellite.svg-BfHWK0sr.js} +1 -1
- package/web/assets/{interface-share-space-ship.svg-CLdqgzgZ.js → interface-share-space-ship.svg-lWM8H0aF.js} +1 -1
- package/web/assets/{interface-share.svg-Cx3VhLuj.js → interface-share.svg-CFf-5WEt.js} +1 -1
- package/web/assets/{interface-signal-square.svg-By_pQLw8.js → interface-signal-square.svg-BIiI1WkB.js} +1 -1
- package/web/assets/{interface-time-clock-circle.svg-Co3P-TM3.js → interface-time-clock-circle.svg-MloMulBj.js} +1 -1
- package/web/assets/{interface-time-hour-glass.svg-BYSOzVeD.js → interface-time-hour-glass.svg-BOxCCGI2.js} +1 -1
- package/web/assets/{interface-users-multiple.svg-moFZaev3.js → interface-users-multiple.svg-4T9srtFC.js} +1 -1
- package/web/assets/{interface-weather-moon.svg-DhyTNivv.js → interface-weather-moon.svg-CKHzp1q9.js} +1 -1
- package/web/assets/{javascript-B1fZNcy6.js → javascript-D9xsJ3Az.js} +1 -1
- package/web/assets/{jsonMode-BxZ6OjkS.js → jsonMode-DuBcXIAs.js} +2 -2
- package/web/assets/{liquid-B58z0z3s.js → liquid-DEC7GfIV.js} +1 -1
- package/web/assets/{lspLanguageFeatures-VksJLqpV.js → lspLanguageFeatures-BWtjzx_b.js} +3 -3
- package/web/assets/{mail-chat-bubble-square.svg-DU4TDENX.js → mail-chat-bubble-square.svg-Bnr_lHI8.js} +1 -1
- package/web/assets/{mail-send-email-paper-airplane.svg-jk90Puk3.js → mail-send-email-paper-airplane.svg-BX3SaAOF.js} +1 -1
- package/web/assets/{mail-send-envelope.svg-CrEPc3pm.js → mail-send-envelope.svg-ZUoORksb.js} +1 -1
- package/web/assets/{mdx-l-DSKi30.js → mdx-HOoxTDWS.js} +1 -1
- package/web/assets/{minus-CjETE6Jb.js → minus-BBEVgxJH.js} +2 -2
- package/web/assets/modal-DM9X_PVj.js +5 -0
- package/web/assets/modal-lOChu0a6.js +1 -0
- package/web/assets/{money-cashier-receipt.svg-veUsiwvj.js → money-cashier-receipt.svg-DZ3PFTDB.js} +1 -1
- package/web/assets/{money-currency-dollar-pay.svg-C5PNkn4j.js → money-currency-dollar-pay.svg-MP_zZSsR.js} +1 -1
- package/web/assets/{money-graph-arrow-increase.svg-BkCcnTWU.js → money-graph-arrow-increase.svg-zF1qoCJ1.js} +1 -1
- package/web/assets/{money-graph-bar-chart-increase.svg-BDiFSuKt.js → money-graph-bar-chart-increase.svg-BDD2RhNd.js} +1 -1
- package/web/assets/multiselect-BGmyQeLC.js +251 -0
- package/web/assets/{nature-ecology-leaf.svg-CHyv9oDB.js → nature-ecology-leaf.svg-C8ROcT5o.js} +1 -1
- package/web/assets/{password-BYosjMhB.js → password-4B0Jk2Id.js} +4 -4
- package/web/assets/{phone-telephone.svg-Ce1dgyK9.js → phone-telephone.svg-DKK-lUXQ.js} +1 -1
- package/web/assets/{plus-CVoE_j-e.js → plus-CTzNAMSa.js} +6 -6
- package/web/assets/process.store-hTCiNh-E.js +1 -0
- package/web/assets/{programming-bug.svg-D87My2Ok.js → programming-bug.svg-D2E8tMFA.js} +1 -1
- package/web/assets/{programming-cloud.svg-jUe8apKw.js → programming-cloud.svg-BGnh40iK.js} +1 -1
- package/web/assets/{programming-computer-database-server.svg-D4etrIBX.js → programming-computer-database-server.svg-BVAuZnpu.js} +1 -1
- package/web/assets/{programming-computer-database.svg-BtfkmLTx.js → programming-computer-database.svg-Cw61nQGg.js} +1 -1
- package/web/assets/{programming-module-four-layout.svg-BkzsDKDq.js → programming-module-four-layout.svg-DoU0KSeo.js} +1 -1
- package/web/assets/{programming-module-three.svg-CpzTvjGS.js → programming-module-three.svg-DVhh6Qdu.js} +1 -1
- package/web/assets/{programming-module.svg-wyvB3tSR.js → programming-module.svg-DvJfoHtJ.js} +1 -1
- package/web/assets/{programming-script-code.svg-Dek4khNq.js → programming-script-code.svg-C-tp6SrH.js} +1 -1
- package/web/assets/{python-IeHrvMxp.js → python--BJI87h8.js} +1 -1
- package/web/assets/{razor-CMgDmoNn.js → razor-CyKegkVq.js} +1 -1
- package/web/assets/router-CjeDvoXv.js +1 -0
- package/web/assets/settings-scope-78RP25Qh.js +1 -0
- package/web/assets/settings.store-D0Rg-dsM.js +1 -0
- package/web/assets/{shopping-cart.svg-DeBhxyDX.js → shopping-cart.svg-LfGHmiMy.js} +1 -1
- package/web/assets/{shopping-gift-present.svg-Bt0oKBk9.js → shopping-gift-present.svg-DQxn6jVj.js} +1 -1
- package/web/assets/{shopping-shipping-box-parcel-package.svg-BEQNmjMi.js → shopping-shipping-box-parcel-package.svg-0_aBSgUi.js} +1 -1
- package/web/assets/src-BVvRi5bZ.js +1 -0
- package/web/assets/src-COTZAWP1.js +572 -0
- package/web/assets/{src-C3dPv05m.js → src-DmAdua1A.js} +13 -13
- package/web/assets/tabpanel-DHCbTagN.js +150 -0
- package/web/assets/{tag-new-circle.svg-B1i0Y1yt.js → tag-new-circle.svg-83yDHm_4.js} +1 -1
- package/web/assets/theme-CDWRcPhl.js +1 -0
- package/web/assets/{toggleswitch-CcQEgLiT.js → toggleswitch-98WbJy1b.js} +2 -2
- package/web/assets/{travel-map-earth-globe.svg-CB5sqhKh.js → travel-map-earth-globe.svg-Ih5Yi-jq.js} +1 -1
- package/web/assets/trpc-BOcC0r-H.js +1 -0
- package/web/assets/{tsMode-DoUs-yH0.js → tsMode-ocCX3Kwn.js} +6 -6
- package/web/assets/{typescript-fw9OMJ0N.js → typescript-BNLFcH9T.js} +1 -1
- package/web/assets/useAiChatDrawer-DVacYOFX.js +1 -0
- package/web/assets/{useCloudOrg-CRpEZ-iE.js → useCloudOrg-D_o0-v2z.js} +1 -1
- package/web/assets/useProjectCatalog-CSqoTWGy.js +1 -0
- package/web/assets/useProjectCloudOrg-iblWkaw9.js +1 -0
- package/web/assets/{xml-Df6_yGan.js → xml-DcSXqrs-.js} +1 -1
- package/web/assets/{yaml-LMvM57fn.js → yaml-BNINCoLr.js} +1 -1
- package/web/index.html +1 -1
- package/agent-manager-SNVPZNLC.js +0 -8
- package/chunk-BHLCBARP.js.map +0 -1
- package/chunk-NDO5VFZY.js.map +0 -1
- package/desktop-launcher-FHNURZA7.js.map +0 -1
- package/settings-manager-YHQ5YHUH.js +0 -8
- package/src-HZ2XO6TV.js.map +0 -1
- package/web/assets/AgentScalarChatInterface.vue-CxmPaQaj.js +0 -13
- package/web/assets/AgentTerminalPage-Bbx4zyQY.js +0 -1
- package/web/assets/AiChatPage-GPPQggxZ.js +0 -1
- package/web/assets/AppLayout-BuwGeA1p.js +0 -1
- package/web/assets/AuditPage-CDsJsoKA.js +0 -1
- package/web/assets/CloudAccountPage-BCP8icYZ.js +0 -1
- package/web/assets/CloudAccountPage-DzpS3_gc.js +0 -1
- package/web/assets/CloudMessagingPage-01hLQzZ5.js +0 -2
- package/web/assets/DashboardPage-CKo-sf8A.js +0 -1
- package/web/assets/DirectoryPickerDialog-B1tSWoOM.js +0 -1
- package/web/assets/EnvironmentFormPage-9yxN-uI3.js +0 -1
- package/web/assets/EnvironmentListPage-BbfptXAU.js +0 -1
- package/web/assets/KanbanBoardPage-BWkqTc1a.js +0 -4
- package/web/assets/KanbanListPage-GxI1nlON.js +0 -1
- package/web/assets/LaunchProjectPage-DKMoGXIC.js +0 -1
- package/web/assets/LaunchServicesPage-6dfxPQMB.js +0 -1
- package/web/assets/LogViewer-DAzGy_T2.js +0 -3
- package/web/assets/OrgKeyPrompt-CQ087D4g.js +0 -1
- package/web/assets/ProcessControls-D8uc4x7M.js +0 -1
- package/web/assets/ProcessDetailPage-BPxLPGeh.js +0 -1
- package/web/assets/ProjectDetailPage-CnZ_CpVU.js +0 -1
- package/web/assets/ProjectListPage-D8Svc5e3.js +0 -1
- package/web/assets/RandomJobTestPage-BdEiEnSi.js +0 -2
- package/web/assets/ScenarioEditorPage-COrL715B.js +0 -14
- package/web/assets/SendToChatDialog-D8YB5RM6.js +0 -1
- package/web/assets/ServiceControlsBar-BKwvqgHw.js +0 -1
- package/web/assets/ServiceDetailPage-BmPRfQN6.js +0 -2
- package/web/assets/ServiceFormPage-rVvnwWkb.js +0 -1
- package/web/assets/SettingsPage-C-OfBHjn.css +0 -1
- package/web/assets/SettingsPage-DmQB6t1_.js +0 -2063
- package/web/assets/UnlockPage-BgVF3XMO.js +0 -1
- package/web/assets/VariablesTable-D4_sssPN.js +0 -1
- package/web/assets/VaultMigrationPage-BRZJnfVg.js +0 -1
- package/web/assets/VersionBadge-Df7iJWvF.js +0 -1
- package/web/assets/WikiPage-UkaH8BqR.js +0 -1
- package/web/assets/WikiView-BQqP4b9A.js +0 -1
- package/web/assets/add-scalar-classes-B9WxxjAm.js +0 -387
- package/web/assets/card-nJdNoKgd.js +0 -32
- package/web/assets/cloud-chat.store-_qILavCL.js +0 -1
- package/web/assets/cloud-session-Ml5g5J1-.js +0 -1
- package/web/assets/column-Bc4-F_tF.js +0 -907
- package/web/assets/interface-content-folder.svg-bb6GV0G0.js +0 -1
- package/web/assets/modal-D2-cZ2mf.js +0 -5
- package/web/assets/modal-DmgVDXcS.js +0 -1
- package/web/assets/multiselect-CDBfo7-0.js +0 -251
- package/web/assets/process.store-BsCJ-VuI.js +0 -1
- package/web/assets/router-KIdzwvCZ.js +0 -1
- package/web/assets/settings-scope-D8l1sq9K.js +0 -1
- package/web/assets/settings.store-VVqF8QkO.js +0 -1
- package/web/assets/src-CJFQ3yWc.js +0 -1
- package/web/assets/src-Cgn_TWXn.js +0 -572
- package/web/assets/tabpanel-B8oBjoSG.js +0 -150
- package/web/assets/trpc-B1bTQz_t.js +0 -1
- package/web/assets/useAiChatDrawer-BpR9XWop.js +0 -1
- package/web/assets/useProjectCatalog-mk8A95KQ.js +0 -1
- package/web/assets/useProjectCloudOrg-CKgvcUWI.js +0 -1
- /package/{agent-manager-SNVPZNLC.js.map → agent-manager-4XJUIZKL.js.map} +0 -0
- /package/{chat-OXRRBDB3.js.map → chat-3XDVULFH.js.map} +0 -0
- /package/{companion-JQGNL4U7.js.map → companion-MUFVXURV.js.map} +0 -0
- /package/{settings-manager-YHQ5YHUH.js.map → instances-command-KZ5UGXOR.js.map} +0 -0
- /package/web/assets/{abap-BvxTqXT2.js → abap-PT-N0eyj.js} +0 -0
- /package/web/assets/{apex-CIPCCkBr.js → apex-BYovhaVz.js} +0 -0
- /package/web/assets/{azcli-Rs0NIwkA.js → azcli-DOxZ9r2f.js} +0 -0
- /package/web/assets/{bat-BxAhM6gR.js → bat-B29juGG4.js} +0 -0
- /package/web/assets/{bicep-oV_ehPcG.js → bicep-7-ApPSlE.js} +0 -0
- /package/web/assets/{browser-DNbnH79q.js → browser-N7UrAcvB.js} +0 -0
- /package/web/assets/{cameligo-CJLaUyQs.js → cameligo-BipBUQCp.js} +0 -0
- /package/web/assets/{clojure-CjvMureh.js → clojure-DBgUdyK0.js} +0 -0
- /package/web/assets/{coffee-motWC5XQ.js → coffee-DIU_x8Zp.js} +0 -0
- /package/web/assets/{cpp-DiWIfYNM.js → cpp-CAPjLTys.js} +0 -0
- /package/web/assets/{csharp-GBlGBeai.js → csharp-kFCIHjec.js} +0 -0
- /package/web/assets/{csp-tSyK5eO1.js → csp-BFKsjgRE.js} +0 -0
- /package/web/assets/{css-BkFK9HG_.js → css-C3uiAvXV.js} +0 -0
- /package/web/assets/{cypher-Bcp8PXr2.js → cypher-BC8El989.js} +0 -0
- /package/web/assets/{dart-uz9Rxe0M.js → dart-BAClpSRO.js} +0 -0
- /package/web/assets/{dockerfile-iJizx3Zp.js → dockerfile-DVZSJ3rq.js} +0 -0
- /package/web/assets/{ecl-BalaS36Z.js → ecl-Dis7T_5W.js} +0 -0
- /package/web/assets/{elixir-D6CLrLGy.js → elixir-B0xfsmfq.js} +0 -0
- /package/web/assets/{flow9-CFt3-vVY.js → flow9-DbTJxEBz.js} +0 -0
- /package/web/assets/{fsharp-DGa7raxa.js → fsharp-DTOqftZo.js} +0 -0
- /package/web/assets/{go-wlqInk4z.js → go-KWOR5hag.js} +0 -0
- /package/web/assets/{graphql-CP1guigM.js → graphql-DjYFSl6G.js} +0 -0
- /package/web/assets/{hcl-CK0UkKD0.js → hcl-D8RrENjV.js} +0 -0
- /package/web/assets/{ini-Ch56nrUj.js → ini-BOtkgeoY.js} +0 -0
- /package/web/assets/{java-C9_WIayl.js → java-DKd4_eEX.js} +0 -0
- /package/web/assets/{julia-Can2_mhR.js → julia-XpEGblEj.js} +0 -0
- /package/web/assets/{kotlin-DUvGf_BX.js → kotlin-BZv3QweN.js} +0 -0
- /package/web/assets/{less-DoTbG-rc.js → less-H5kV6pUj.js} +0 -0
- /package/web/assets/{lexon-BFMO2_kL.js → lexon-Bg4gEB0s.js} +0 -0
- /package/web/assets/{lua-CC-QtBo7.js → lua-D7eb4Dnq.js} +0 -0
- /package/web/assets/{m3-C51MyH5Q.js → m3-BjDYXZ0c.js} +0 -0
- /package/web/assets/{markdown-CDwLHhgZ.js → markdown-Cl5YxO_y.js} +0 -0
- /package/web/assets/{mips-YuxZtPGU.js → mips-sklxJ87A.js} +0 -0
- /package/web/assets/{msdax-CJjWhmte.js → msdax-C0nZ2Nk3.js} +0 -0
- /package/web/assets/{mysql-B1riwLaD.js → mysql-D6eZPdeQ.js} +0 -0
- /package/web/assets/{objective-c-drXT-gmc.js → objective-c-W10E2fSz.js} +0 -0
- /package/web/assets/{pascal-KUYgrN-Z.js → pascal-Cd0rtL9J.js} +0 -0
- /package/web/assets/{pascaligo-DQmQJP-r.js → pascaligo-BbE09f5f.js} +0 -0
- /package/web/assets/{perl-09XLBmCS.js → perl-bnuvlUCT.js} +0 -0
- /package/web/assets/{pgsql-BFj9IFFu.js → pgsql-BETeeS25.js} +0 -0
- /package/web/assets/{php-UnC5BqwY.js → php-zaSPUC-m.js} +0 -0
- /package/web/assets/{pla-BFuYrPHG.js → pla-ChOKgzpJ.js} +0 -0
- /package/web/assets/{postiats-n4ft3jnO.js → postiats-By_SllB5.js} +0 -0
- /package/web/assets/{powerquery-D-s-oFSc.js → powerquery-CB5gIeJ1.js} +0 -0
- /package/web/assets/{powershell-CTboTf93.js → powershell-CgdaEQwq.js} +0 -0
- /package/web/assets/{protobuf-Dt62GuJP.js → protobuf-P7fNUpCt.js} +0 -0
- /package/web/assets/{pug-CEFWkUzw.js → pug-DZaxV_Nc.js} +0 -0
- /package/web/assets/{qsharp-B0DUmgPZ.js → qsharp-BdkO9QAN.js} +0 -0
- /package/web/assets/{r-BVnF0c4T.js → r-C-pPWc3R.js} +0 -0
- /package/web/assets/{redis-DLl3KQXi.js → redis-BT1HxrEq.js} +0 -0
- /package/web/assets/{redshift-cif1I7h1.js → redshift-CDnJNPnz.js} +0 -0
- /package/web/assets/{restructuredtext-PNfql36m.js → restructuredtext-Bt8v-MuE.js} +0 -0
- /package/web/assets/{ruby-j3jxDjUN.js → ruby-BLxqHkKg.js} +0 -0
- /package/web/assets/{rust-BaIO-mAt.js → rust-CIh7vugr.js} +0 -0
- /package/web/assets/{sb-D8XNVNUQ.js → sb-eE41pfwD.js} +0 -0
- /package/web/assets/{scala-DiK9Ps90.js → scala-COBuWHwn.js} +0 -0
- /package/web/assets/{scheme-DPKqXHmF.js → scheme-BsGc_ajc.js} +0 -0
- /package/web/assets/{scss-DpMwfP2H.js → scss-DLmucKJk.js} +0 -0
- /package/web/assets/{shared-sse-CTMtESqe.js → shared-sse---by8uTc.js} +0 -0
- /package/web/assets/{shell-Dw9mKVg2.js → shell-8IUXMVcg.js} +0 -0
- /package/web/assets/{solidity-DTxo-7fe.js → solidity-DUTott7T.js} +0 -0
- /package/web/assets/{sophia-BjA3Q87y.js → sophia-GqIrTWz8.js} +0 -0
- /package/web/assets/{sparql-q1EpMUqb.js → sparql-BfkJA0CL.js} +0 -0
- /package/web/assets/{sql-CjcQ4wIr.js → sql-BF_o1CCN.js} +0 -0
- /package/web/assets/{st-AuOpxVl7.js → st-B6_wiXyW.js} +0 -0
- /package/web/assets/{swift-BUWnv6f7.js → swift-BHDD2Ajh.js} +0 -0
- /package/web/assets/{systemverilog-FhXn-3OZ.js → systemverilog-BG_Ebh2a.js} +0 -0
- /package/web/assets/{tcl-B0lqcTtS.js → tcl-ocTQVTM_.js} +0 -0
- /package/web/assets/{twig-B0OeGPVa.js → twig-CF5whnDX.js} +0 -0
- /package/web/assets/{typespec-Bmh6VX11.js → typespec-5BWfbhTE.js} +0 -0
- /package/web/assets/{uuid-Q0SWZmaT.js → uuid-FpfcaBnR.js} +0 -0
- /package/web/assets/{vb-bmgX6veu.js → vb-agPNUcOk.js} +0 -0
- /package/web/assets/{w3c-keyname-2TLn3EjF.js → w3c-keyname-2_K_z_q5.js} +0 -0
- /package/web/assets/{wgsl-FflLnFqI.js → wgsl-CufoMn6o.js} +0 -0
|
@@ -37,6 +37,7 @@ import {
|
|
|
37
37
|
logParserStore,
|
|
38
38
|
maskApiKey,
|
|
39
39
|
networkInfo,
|
|
40
|
+
orgCloudUrl,
|
|
40
41
|
protectedProcedure,
|
|
41
42
|
publicProcedure,
|
|
42
43
|
registerHttpServer,
|
|
@@ -57,7 +58,11 @@ import {
|
|
|
57
58
|
shutdownCodexAppServer,
|
|
58
59
|
startCliSession,
|
|
59
60
|
vaultOfProject
|
|
60
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-IOAGFK3P.js";
|
|
62
|
+
import {
|
|
63
|
+
resolveCliInvocation,
|
|
64
|
+
whichCommand
|
|
65
|
+
} from "./chunk-B7MABGQN.js";
|
|
61
66
|
import {
|
|
62
67
|
LocalProjectExistsError,
|
|
63
68
|
activeSessionRegistry,
|
|
@@ -76,12 +81,8 @@ import {
|
|
|
76
81
|
stopClaudeTranscriptWatcher,
|
|
77
82
|
stopCodexTranscriptWatcher,
|
|
78
83
|
verifyJwt
|
|
79
|
-
} from "./chunk-
|
|
84
|
+
} from "./chunk-AAK7ACHG.js";
|
|
80
85
|
import "./chunk-MD3VW4HQ.js";
|
|
81
|
-
import {
|
|
82
|
-
resolveCliInvocation,
|
|
83
|
-
whichCommand
|
|
84
|
-
} from "./chunk-B7MABGQN.js";
|
|
85
86
|
import {
|
|
86
87
|
agentManager,
|
|
87
88
|
agentSpawner,
|
|
@@ -107,6 +108,7 @@ import {
|
|
|
107
108
|
listInstances,
|
|
108
109
|
loadFromEnv,
|
|
109
110
|
markVaultLocked,
|
|
111
|
+
onVaultUnlocked,
|
|
110
112
|
projectKey,
|
|
111
113
|
registerInstance,
|
|
112
114
|
restartInstance,
|
|
@@ -118,10 +120,10 @@ import {
|
|
|
118
120
|
stableEncryptValue,
|
|
119
121
|
traefikManager,
|
|
120
122
|
unregisterInstance
|
|
121
|
-
} from "./chunk-
|
|
123
|
+
} from "./chunk-NPORVPEO.js";
|
|
122
124
|
import {
|
|
123
125
|
settingsManager
|
|
124
|
-
} from "./chunk-
|
|
126
|
+
} from "./chunk-5GYBAMHV.js";
|
|
125
127
|
import {
|
|
126
128
|
AGENT_LONG_FETCH_TIMEOUT,
|
|
127
129
|
AGENT_STOP_FETCH_TIMEOUT,
|
|
@@ -145,9 +147,16 @@ import {
|
|
|
145
147
|
UpdateEnvironmentSchema,
|
|
146
148
|
VariableOverrideSchema,
|
|
147
149
|
VariableSchema,
|
|
150
|
+
deriveLauncherIdentity,
|
|
151
|
+
getCollection,
|
|
152
|
+
nativeParsers,
|
|
153
|
+
primaryServiceLink,
|
|
154
|
+
readEntity,
|
|
155
|
+
writeEntity
|
|
156
|
+
} from "./chunk-QRMG6GMX.js";
|
|
157
|
+
import {
|
|
148
158
|
env,
|
|
149
159
|
forgetOrgLogo,
|
|
150
|
-
getCollection,
|
|
151
160
|
keyRoot,
|
|
152
161
|
legacyMachineFilePath,
|
|
153
162
|
legacyVaultRoot,
|
|
@@ -155,18 +164,16 @@ import {
|
|
|
155
164
|
listOrgVaults,
|
|
156
165
|
machineFilePath,
|
|
157
166
|
machineRoot,
|
|
158
|
-
nativeParsers,
|
|
159
167
|
orgVaultRoot,
|
|
160
168
|
projectVaultRoot,
|
|
161
|
-
readEntity,
|
|
162
169
|
readOrgClouds,
|
|
170
|
+
readOrgLogo,
|
|
163
171
|
readOrgLogos,
|
|
164
172
|
readOrgNames,
|
|
165
173
|
rememberOrgLogo,
|
|
166
174
|
rememberOrgName,
|
|
167
|
-
stampOrgCloud
|
|
168
|
-
|
|
169
|
-
} from "./chunk-NDO5VFZY.js";
|
|
175
|
+
stampOrgCloud
|
|
176
|
+
} from "./chunk-LTLOVQJQ.js";
|
|
170
177
|
|
|
171
178
|
// ../server/src/create-server.ts
|
|
172
179
|
import express from "express";
|
|
@@ -319,8 +326,8 @@ function resolveNpm() {
|
|
|
319
326
|
// Unix : node est dans `bin/`, npm sous `lib/node_modules/`.
|
|
320
327
|
join(nodeDir, "..", "lib", "node_modules", "npm", "bin", "npm-cli.js")
|
|
321
328
|
];
|
|
322
|
-
for (const
|
|
323
|
-
if (existsSync(
|
|
329
|
+
for (const cli2 of candidates) {
|
|
330
|
+
if (existsSync(cli2)) return { command: process.execPath, args: [cli2], shell: false };
|
|
324
331
|
}
|
|
325
332
|
return process.platform === "win32" ? { command: "npm.cmd", args: [], shell: true } : { command: "npm", args: [], shell: false };
|
|
326
333
|
}
|
|
@@ -484,6 +491,27 @@ var changelogRouter = router({
|
|
|
484
491
|
import { z as z4 } from "zod";
|
|
485
492
|
import { TRPCError as TRPCError2 } from "@trpc/server";
|
|
486
493
|
|
|
494
|
+
// ../server/src/services/current-project.ts
|
|
495
|
+
var current = null;
|
|
496
|
+
var listeners = /* @__PURE__ */ new Set();
|
|
497
|
+
function getCurrentProject() {
|
|
498
|
+
return current;
|
|
499
|
+
}
|
|
500
|
+
function setCurrentProject(next) {
|
|
501
|
+
if (current?.id === next?.id && current?.orgId === next?.orgId) return;
|
|
502
|
+
current = next;
|
|
503
|
+
for (const listener of listeners) {
|
|
504
|
+
try {
|
|
505
|
+
listener();
|
|
506
|
+
} catch {
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
function onCurrentProjectChanged(listener) {
|
|
511
|
+
listeners.add(listener);
|
|
512
|
+
return () => listeners.delete(listener);
|
|
513
|
+
}
|
|
514
|
+
|
|
487
515
|
// ../server/src/services/org-keys.ts
|
|
488
516
|
import { mkdir } from "fs/promises";
|
|
489
517
|
|
|
@@ -974,6 +1002,18 @@ var projectRouter = router({
|
|
|
974
1002
|
* machine, and the cloud sync pushes projects wholesale — a path stored on the
|
|
975
1003
|
* project itself would travel with it.
|
|
976
1004
|
*/
|
|
1005
|
+
/**
|
|
1006
|
+
* Le projet que cet onglet regarde.
|
|
1007
|
+
*
|
|
1008
|
+
* Le choix vit dans le navigateur ; le serveur ne le connaîtrait pas sans
|
|
1009
|
+
* cette annonce. Il n'en fait rien de persistant — seule l'icône de barre
|
|
1010
|
+
* système s'en sert, pour montrer les services du projet ouvert plutôt que
|
|
1011
|
+
* ceux de toute la machine.
|
|
1012
|
+
*/
|
|
1013
|
+
setCurrent: protectedProcedure.input(z4.object({ id: z4.string().max(128), orgId: z4.string().max(128).nullable().default(null) }).nullable()).mutation(({ input }) => {
|
|
1014
|
+
setCurrentProject(input ? { id: input.id, orgId: input.orgId } : null);
|
|
1015
|
+
return { ok: true };
|
|
1016
|
+
}),
|
|
977
1017
|
localPaths: protectedProcedure.query(async () => {
|
|
978
1018
|
return projectPathStore.all();
|
|
979
1019
|
}),
|
|
@@ -1180,7 +1220,93 @@ var agentRouter = router({
|
|
|
1180
1220
|
|
|
1181
1221
|
// ../server/src/trpc/routers/process.ts
|
|
1182
1222
|
import { z as z6 } from "zod";
|
|
1223
|
+
import { TRPCError as TRPCError5 } from "@trpc/server";
|
|
1224
|
+
|
|
1225
|
+
// ../server/src/services/process-control.ts
|
|
1183
1226
|
import { TRPCError as TRPCError4 } from "@trpc/server";
|
|
1227
|
+
async function resolveTarget(processId, fallbackAgentId) {
|
|
1228
|
+
const service = await serviceStore.get(processId) ?? null;
|
|
1229
|
+
const agentId = (service ? await resolveEffectiveAgentId(service) : null) ?? fallbackAgentId ?? null;
|
|
1230
|
+
if (!agentId) {
|
|
1231
|
+
throw new TRPCError4({
|
|
1232
|
+
code: "BAD_REQUEST",
|
|
1233
|
+
message: "No agent assigned to this service. Set an agent on the service or on the active environment."
|
|
1234
|
+
});
|
|
1235
|
+
}
|
|
1236
|
+
return { agentId, service };
|
|
1237
|
+
}
|
|
1238
|
+
async function deployBefore(processId, agentId, service, step) {
|
|
1239
|
+
if (service) {
|
|
1240
|
+
try {
|
|
1241
|
+
const resolved = await resolveServiceVariables(service);
|
|
1242
|
+
await agentManager.agentMutation(agentId, "process.deploy", resolved);
|
|
1243
|
+
} catch (err) {
|
|
1244
|
+
console.debug(`[process-control] Failed to deploy before ${step} for`, processId + ":", err.message);
|
|
1245
|
+
}
|
|
1246
|
+
}
|
|
1247
|
+
if (service?.clearLogsOnStart) {
|
|
1248
|
+
try {
|
|
1249
|
+
await agentManager.agentMutation(agentId, "process.clearLogBuffer", { id: processId });
|
|
1250
|
+
agentManager.emit("process:log", { agentId, batch: [{ processId, __clearLogBuffer: true }] });
|
|
1251
|
+
} catch (err) {
|
|
1252
|
+
console.debug(`[process-control] Failed to clear logs before ${step} for`, processId + ":", err.message);
|
|
1253
|
+
}
|
|
1254
|
+
}
|
|
1255
|
+
}
|
|
1256
|
+
async function startProcess(processId, fallbackAgentId) {
|
|
1257
|
+
const { agentId, service } = await resolveTarget(processId, fallbackAgentId);
|
|
1258
|
+
await deployBefore(processId, agentId, service, "start");
|
|
1259
|
+
let result;
|
|
1260
|
+
try {
|
|
1261
|
+
result = await agentManager.agentMutation(agentId, "process.start", { id: processId });
|
|
1262
|
+
} catch (err) {
|
|
1263
|
+
const err_ = err;
|
|
1264
|
+
const isFetchError = err_?.cause?.code === "ECONNREFUSED" || err_?.message === "fetch failed" || err_?.name === "TypeError";
|
|
1265
|
+
throw new TRPCError4({
|
|
1266
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
1267
|
+
message: isFetchError ? `Cannot reach agent \u2014 make sure the agent is running` : err_?.message ?? "Failed to start process"
|
|
1268
|
+
});
|
|
1269
|
+
}
|
|
1270
|
+
await auditService.log({ userId: "local", action: "start", entityType: "process", entityId: processId, metadata: { agentId } });
|
|
1271
|
+
return { ...result, agentId };
|
|
1272
|
+
}
|
|
1273
|
+
async function stopProcess(processId, agentId) {
|
|
1274
|
+
const result = await agentManager.agentMutation(
|
|
1275
|
+
agentId,
|
|
1276
|
+
"process.stop",
|
|
1277
|
+
{ id: processId },
|
|
1278
|
+
AGENT_STOP_FETCH_TIMEOUT
|
|
1279
|
+
);
|
|
1280
|
+
await auditService.log({ userId: "local", action: "stop", entityType: "process", entityId: processId, metadata: { agentId } });
|
|
1281
|
+
return { ...result, agentId };
|
|
1282
|
+
}
|
|
1283
|
+
async function restartProcess(processId, fallbackAgentId) {
|
|
1284
|
+
const { agentId, service } = await resolveTarget(processId, fallbackAgentId);
|
|
1285
|
+
try {
|
|
1286
|
+
await agentManager.agentMutation(agentId, "process.stop", { id: processId }, AGENT_STOP_FETCH_TIMEOUT);
|
|
1287
|
+
} catch (err) {
|
|
1288
|
+
console.debug("[process-control] Stop before restart ignored (process not found on agent?):", err.message);
|
|
1289
|
+
}
|
|
1290
|
+
await deployBefore(processId, agentId, service, "restart");
|
|
1291
|
+
const result = await agentManager.agentMutation(agentId, "process.start", { id: processId });
|
|
1292
|
+
await auditService.log({ userId: "local", action: "restart", entityType: "process", entityId: processId, metadata: { agentId } });
|
|
1293
|
+
return { ...result, agentId };
|
|
1294
|
+
}
|
|
1295
|
+
async function listAllProcesses() {
|
|
1296
|
+
const results = [];
|
|
1297
|
+
await Promise.allSettled(
|
|
1298
|
+
agentManager.listAgents().filter((a) => a.status.connected).map(async (a) => {
|
|
1299
|
+
try {
|
|
1300
|
+
const processes = await agentManager.agentQuery(a.config.id, "process.list");
|
|
1301
|
+
for (const proc of processes) results.push({ ...proc, agentId: a.config.id });
|
|
1302
|
+
} catch {
|
|
1303
|
+
}
|
|
1304
|
+
})
|
|
1305
|
+
);
|
|
1306
|
+
return results;
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
// ../server/src/trpc/routers/process.ts
|
|
1184
1310
|
var SUBSCRIPTION_QUEUE_MAX2 = LOG_BUFFER_SIZE;
|
|
1185
1311
|
async function* forwardEvents(eventName, filter) {
|
|
1186
1312
|
const queue = [];
|
|
@@ -1242,28 +1368,13 @@ async function* forwardLogBatches(agentId, processId) {
|
|
|
1242
1368
|
}
|
|
1243
1369
|
var processRouter = router({
|
|
1244
1370
|
/** List all processes across all connected agents */
|
|
1245
|
-
list: protectedProcedure.meta({ openapi: { method: "GET", path: "/processes", tags: ["processes"], summary: "List all processes", protect: true } }).output(z6.any()).query(
|
|
1246
|
-
const agents = agentManager.listAgents();
|
|
1247
|
-
const results = [];
|
|
1248
|
-
await Promise.allSettled(
|
|
1249
|
-
agents.filter((a) => a.status.connected).map(async (a) => {
|
|
1250
|
-
try {
|
|
1251
|
-
const processes = await agentManager.agentQuery(a.config.id, "process.list");
|
|
1252
|
-
for (const proc of processes) {
|
|
1253
|
-
results.push({ ...proc, agentId: a.config.id });
|
|
1254
|
-
}
|
|
1255
|
-
} catch {
|
|
1256
|
-
}
|
|
1257
|
-
})
|
|
1258
|
-
);
|
|
1259
|
-
return results;
|
|
1260
|
-
}),
|
|
1371
|
+
list: protectedProcedure.meta({ openapi: { method: "GET", path: "/processes", tags: ["processes"], summary: "List all processes", protect: true } }).output(z6.any()).query(() => listAllProcesses()),
|
|
1261
1372
|
/** Get a single process from a specific agent */
|
|
1262
1373
|
get: protectedProcedure.meta({ openapi: { method: "GET", path: "/processes/{agentId}/{id}", tags: ["processes"], summary: "Get a process by agent and ID", protect: true } }).input(z6.object({ agentId: z6.string().max(128), id: z6.string().max(128) })).output(z6.any()).query(async ({ input, ctx }) => {
|
|
1263
1374
|
requireServiceAction(ctx, input.id, "service:read");
|
|
1264
1375
|
const status = agentManager.getStatus(input.agentId);
|
|
1265
1376
|
if (!status) {
|
|
1266
|
-
throw new
|
|
1377
|
+
throw new TRPCError5({ code: "NOT_FOUND", message: `Agent ${input.agentId} not found` });
|
|
1267
1378
|
}
|
|
1268
1379
|
const proc = await agentManager.agentQuery(input.agentId, "process.get", { id: input.id });
|
|
1269
1380
|
return { ...proc, agentId: input.agentId };
|
|
@@ -1275,82 +1386,19 @@ var processRouter = router({
|
|
|
1275
1386
|
* The deploy call is idempotent — creates the process if missing, updates config if it exists. */
|
|
1276
1387
|
start: protectedProcedure.meta({ openapi: { method: "POST", path: "/processes/{agentId}/{processId}/start", tags: ["processes"], summary: "Start a process", protect: true } }).input(z6.object({ agentId: z6.string().max(128).optional(), processId: z6.string().max(128) })).output(z6.any()).mutation(async ({ input, ctx }) => {
|
|
1277
1388
|
requireServiceAction(ctx, input.processId, "service:start");
|
|
1278
|
-
|
|
1279
|
-
const effectiveAgentId = (service ? await resolveEffectiveAgentId(service) : null) ?? input.agentId ?? null;
|
|
1280
|
-
if (!effectiveAgentId) {
|
|
1281
|
-
throw new TRPCError4({ code: "BAD_REQUEST", message: "No agent assigned to this service. Set an agent on the service or on the active environment." });
|
|
1282
|
-
}
|
|
1283
|
-
if (service) {
|
|
1284
|
-
try {
|
|
1285
|
-
const resolved = await resolveServiceVariables(service);
|
|
1286
|
-
await agentManager.agentMutation(effectiveAgentId, "process.deploy", resolved);
|
|
1287
|
-
} catch (err) {
|
|
1288
|
-
console.debug("[process-router] Failed to deploy before start for", input.processId + ":", err.message);
|
|
1289
|
-
}
|
|
1290
|
-
}
|
|
1291
|
-
if (service?.clearLogsOnStart) {
|
|
1292
|
-
try {
|
|
1293
|
-
await agentManager.agentMutation(effectiveAgentId, "process.clearLogBuffer", { id: input.processId });
|
|
1294
|
-
agentManager.emit("process:log", { agentId: effectiveAgentId, batch: [{ processId: input.processId, __clearLogBuffer: true }] });
|
|
1295
|
-
} catch (err) {
|
|
1296
|
-
console.debug("[process-router] Failed to clear logs before start for", input.processId + ":", err.message);
|
|
1297
|
-
}
|
|
1298
|
-
}
|
|
1299
|
-
let result;
|
|
1300
|
-
try {
|
|
1301
|
-
result = await agentManager.agentMutation(effectiveAgentId, "process.start", { id: input.processId });
|
|
1302
|
-
} catch (err) {
|
|
1303
|
-
const err_ = err;
|
|
1304
|
-
const isFetchError = err_?.cause?.code === "ECONNREFUSED" || err_?.message === "fetch failed" || err_?.name === "TypeError";
|
|
1305
|
-
throw new TRPCError4({
|
|
1306
|
-
code: "INTERNAL_SERVER_ERROR",
|
|
1307
|
-
message: isFetchError ? `Cannot reach agent \u2014 make sure the agent is running` : err_?.message ?? "Failed to start process"
|
|
1308
|
-
});
|
|
1309
|
-
}
|
|
1310
|
-
await auditService.log({ userId: "local", action: "start", entityType: "process", entityId: input.processId, metadata: { agentId: effectiveAgentId } });
|
|
1311
|
-
return { ...result, agentId: effectiveAgentId };
|
|
1389
|
+
return startProcess(input.processId, input.agentId);
|
|
1312
1390
|
}),
|
|
1313
1391
|
/** Stop a process on an agent */
|
|
1314
1392
|
stop: protectedProcedure.meta({ openapi: { method: "POST", path: "/processes/{agentId}/{processId}/stop", tags: ["processes"], summary: "Stop a process", protect: true } }).input(z6.object({ agentId: z6.string().max(128), processId: z6.string().max(128) })).output(z6.any()).mutation(async ({ input, ctx }) => {
|
|
1315
1393
|
requireServiceAction(ctx, input.processId, "service:stop");
|
|
1316
|
-
|
|
1317
|
-
await auditService.log({ userId: "local", action: "stop", entityType: "process", entityId: input.processId, metadata: { agentId: input.agentId } });
|
|
1318
|
-
return { ...result, agentId: input.agentId };
|
|
1394
|
+
return stopProcess(input.processId, input.agentId);
|
|
1319
1395
|
}),
|
|
1320
1396
|
/** Restart a process on an agent.
|
|
1321
1397
|
* Sends stop → deploy (latest resolved config) → start so that
|
|
1322
1398
|
* config/variable changes take effect. Same lazy deploy pattern as start. */
|
|
1323
1399
|
restart: protectedProcedure.meta({ openapi: { method: "POST", path: "/processes/{agentId}/{processId}/restart", tags: ["processes"], summary: "Restart a process", protect: true } }).input(z6.object({ agentId: z6.string().max(128).optional(), processId: z6.string().max(128) })).output(z6.any()).mutation(async ({ input, ctx }) => {
|
|
1324
1400
|
requireServiceAction(ctx, input.processId, "service:restart");
|
|
1325
|
-
|
|
1326
|
-
const effectiveAgentId = (service ? await resolveEffectiveAgentId(service) : null) ?? input.agentId ?? null;
|
|
1327
|
-
if (!effectiveAgentId) {
|
|
1328
|
-
throw new TRPCError4({ code: "BAD_REQUEST", message: "No agent assigned to this service. Set an agent on the service or on the active environment." });
|
|
1329
|
-
}
|
|
1330
|
-
try {
|
|
1331
|
-
await agentManager.agentMutation(effectiveAgentId, "process.stop", { id: input.processId }, AGENT_STOP_FETCH_TIMEOUT);
|
|
1332
|
-
} catch (err) {
|
|
1333
|
-
console.debug("[process-router] Stop before restart ignored (process not found on agent?):", err.message);
|
|
1334
|
-
}
|
|
1335
|
-
if (service) {
|
|
1336
|
-
try {
|
|
1337
|
-
const resolved = await resolveServiceVariables(service);
|
|
1338
|
-
await agentManager.agentMutation(effectiveAgentId, "process.deploy", resolved);
|
|
1339
|
-
} catch (err) {
|
|
1340
|
-
console.debug("[process-router] Failed to deploy before restart for", input.processId + ":", err.message);
|
|
1341
|
-
}
|
|
1342
|
-
}
|
|
1343
|
-
if (service?.clearLogsOnStart) {
|
|
1344
|
-
try {
|
|
1345
|
-
await agentManager.agentMutation(effectiveAgentId, "process.clearLogBuffer", { id: input.processId });
|
|
1346
|
-
agentManager.emit("process:log", { agentId: effectiveAgentId, batch: [{ processId: input.processId, __clearLogBuffer: true }] });
|
|
1347
|
-
} catch (err) {
|
|
1348
|
-
console.debug("[process-router] Failed to clear logs before restart for", input.processId + ":", err.message);
|
|
1349
|
-
}
|
|
1350
|
-
}
|
|
1351
|
-
const result = await agentManager.agentMutation(effectiveAgentId, "process.start", { id: input.processId });
|
|
1352
|
-
await auditService.log({ userId: "local", action: "restart", entityType: "process", entityId: input.processId, metadata: { agentId: effectiveAgentId } });
|
|
1353
|
-
return { ...result, agentId: effectiveAgentId };
|
|
1401
|
+
return restartProcess(input.processId, input.agentId);
|
|
1354
1402
|
}),
|
|
1355
1403
|
/** Get buffered logs for a process from an agent */
|
|
1356
1404
|
logs: protectedProcedure.meta({ openapi: { method: "GET", path: "/processes/{agentId}/{processId}/logs", tags: ["processes"], summary: "Get buffered logs for a process", protect: true } }).input(z6.object({ agentId: z6.string().max(128), processId: z6.string().max(128) })).output(z6.any()).query(async ({ input, ctx }) => {
|
|
@@ -1680,7 +1728,7 @@ var setupRouter = router({
|
|
|
1680
1728
|
|
|
1681
1729
|
// ../server/src/trpc/routers/environment.ts
|
|
1682
1730
|
import { z as z9 } from "zod";
|
|
1683
|
-
import { TRPCError as
|
|
1731
|
+
import { TRPCError as TRPCError6 } from "@trpc/server";
|
|
1684
1732
|
var environmentRouter = router({
|
|
1685
1733
|
list: protectedProcedure.input(z9.object({
|
|
1686
1734
|
projectId: z9.string().max(128),
|
|
@@ -1690,7 +1738,7 @@ var environmentRouter = router({
|
|
|
1690
1738
|
}),
|
|
1691
1739
|
get: protectedProcedure.input(z9.object({ id: z9.string().max(128) })).query(async ({ input }) => {
|
|
1692
1740
|
const env2 = await environmentStore.get(input.id);
|
|
1693
|
-
if (!env2) throw new
|
|
1741
|
+
if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
|
|
1694
1742
|
return env2;
|
|
1695
1743
|
}),
|
|
1696
1744
|
listByScope: protectedProcedure.input(z9.object({
|
|
@@ -1740,9 +1788,9 @@ var environmentRouter = router({
|
|
|
1740
1788
|
}),
|
|
1741
1789
|
update: protectedProcedure.input(UpdateEnvironmentSchema).mutation(async ({ input }) => {
|
|
1742
1790
|
const existing = await environmentStore.get(input.id);
|
|
1743
|
-
if (!existing) throw new
|
|
1791
|
+
if (!existing) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
|
|
1744
1792
|
const env2 = await environmentStore.update(input);
|
|
1745
|
-
if (!env2) throw new
|
|
1793
|
+
if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
|
|
1746
1794
|
if (env2.scope === "global" && input.name && input.name !== existing.name) {
|
|
1747
1795
|
const project = await projectStore.get(environmentStore.projectRefOf(env2) ?? env2.projectId);
|
|
1748
1796
|
if (project) {
|
|
@@ -1758,22 +1806,22 @@ var environmentRouter = router({
|
|
|
1758
1806
|
}),
|
|
1759
1807
|
delete: protectedProcedure.input(z9.object({ id: z9.string().max(128) })).mutation(async ({ input }) => {
|
|
1760
1808
|
const env2 = await environmentStore.get(input.id);
|
|
1761
|
-
if (!env2) throw new
|
|
1809
|
+
if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
|
|
1762
1810
|
if (env2.immutable) {
|
|
1763
|
-
throw new
|
|
1811
|
+
throw new TRPCError6({ code: "FORBIDDEN", message: "Cannot delete immutable environment" });
|
|
1764
1812
|
}
|
|
1765
1813
|
if (env2.scope === "global") {
|
|
1766
1814
|
await environmentStore.deleteByActivateOn(input.id);
|
|
1767
1815
|
}
|
|
1768
1816
|
const deleted = await environmentStore.delete(input.id);
|
|
1769
|
-
if (!deleted) throw new
|
|
1817
|
+
if (!deleted) throw new TRPCError6({ code: "INTERNAL_SERVER_ERROR", message: "Failed to delete environment" });
|
|
1770
1818
|
await projectStore.removeEnvironment(environmentStore.projectRefOf(env2) ?? env2.projectId, input.id);
|
|
1771
1819
|
return { success: true };
|
|
1772
1820
|
}),
|
|
1773
1821
|
resolve: protectedProcedure.input(z9.object({ environmentId: z9.string().max(128) })).query(async ({ input, ctx }) => {
|
|
1774
1822
|
const { includeSecrets } = requireEnvAction(ctx, input.environmentId, "env:read");
|
|
1775
1823
|
const env2 = await environmentStore.get(input.environmentId);
|
|
1776
|
-
if (!env2) throw new
|
|
1824
|
+
if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
|
|
1777
1825
|
const resolved = await environmentResolver.resolveEnvironmentWithSources(input.environmentId);
|
|
1778
1826
|
if (!includeSecrets) {
|
|
1779
1827
|
const sanitized = { ...resolved };
|
|
@@ -1792,7 +1840,7 @@ var environmentRouter = router({
|
|
|
1792
1840
|
resolveFlat: protectedProcedure.meta({ openapi: { method: "GET", path: "/environments/{environmentId}/resolve-flat", tags: ["environments"], summary: "Resolve environment variables as a flat key-value map", protect: true } }).input(z9.object({ environmentId: z9.string().max(128) })).output(z9.record(z9.string(), z9.string())).query(async ({ input, ctx }) => {
|
|
1793
1841
|
const { includeSecrets } = requireEnvAction(ctx, input.environmentId, "env:read");
|
|
1794
1842
|
const env2 = await environmentStore.get(input.environmentId);
|
|
1795
|
-
if (!env2) throw new
|
|
1843
|
+
if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
|
|
1796
1844
|
const { env: resolved, envSecrets } = await environmentResolver.resolveEnvironment(input.environmentId);
|
|
1797
1845
|
const result = {};
|
|
1798
1846
|
for (const [key, value] of Object.entries(resolved)) {
|
|
@@ -1830,9 +1878,9 @@ var environmentRouter = router({
|
|
|
1830
1878
|
})).mutation(async ({ input, ctx }) => {
|
|
1831
1879
|
requireEnvAction(ctx, input.environmentId, "env:write");
|
|
1832
1880
|
const env2 = await environmentStore.get(input.environmentId);
|
|
1833
|
-
if (!env2) throw new
|
|
1881
|
+
if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
|
|
1834
1882
|
const result = await environmentStore.upsertVariable(input.environmentId, input.variableId, input.variable);
|
|
1835
|
-
if (!result) throw new
|
|
1883
|
+
if (!result) throw new TRPCError6({ code: "INTERNAL_SERVER_ERROR", message: "Failed to update variable" });
|
|
1836
1884
|
return result;
|
|
1837
1885
|
}),
|
|
1838
1886
|
/**
|
|
@@ -1907,9 +1955,9 @@ var environmentRouter = router({
|
|
|
1907
1955
|
variableId: z9.string().max(128)
|
|
1908
1956
|
})).mutation(async ({ input }) => {
|
|
1909
1957
|
const env2 = await environmentStore.get(input.environmentId);
|
|
1910
|
-
if (!env2) throw new
|
|
1958
|
+
if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
|
|
1911
1959
|
const result = await environmentStore.removeVariable(input.environmentId, input.variableId);
|
|
1912
|
-
if (!result) throw new
|
|
1960
|
+
if (!result) throw new TRPCError6({ code: "INTERNAL_SERVER_ERROR", message: "Failed to remove variable" });
|
|
1913
1961
|
return result;
|
|
1914
1962
|
})
|
|
1915
1963
|
});
|
|
@@ -1917,7 +1965,7 @@ var environmentRouter = router({
|
|
|
1917
1965
|
// ../server/src/trpc/routers/settings.ts
|
|
1918
1966
|
import { promises as dns } from "dns";
|
|
1919
1967
|
import { z as z10 } from "zod";
|
|
1920
|
-
import { TRPCError as
|
|
1968
|
+
import { TRPCError as TRPCError7 } from "@trpc/server";
|
|
1921
1969
|
var NotificationPreferencesPatchSchema = NotificationPreferencesSchema.partial().strict();
|
|
1922
1970
|
function listWithOrigin(parsers, vault) {
|
|
1923
1971
|
return [
|
|
@@ -1973,7 +2021,7 @@ var settingsRouter = router({
|
|
|
1973
2021
|
try {
|
|
1974
2022
|
return await setLanMode(input.enabled);
|
|
1975
2023
|
} catch (err) {
|
|
1976
|
-
throw new
|
|
2024
|
+
throw new TRPCError7({
|
|
1977
2025
|
code: "INTERNAL_SERVER_ERROR",
|
|
1978
2026
|
message: `Impossible de changer l'adresse d'\xE9coute : ${err.message}`
|
|
1979
2027
|
});
|
|
@@ -1983,9 +2031,9 @@ var settingsRouter = router({
|
|
|
1983
2031
|
* Update settings (mode, cloudUrl)
|
|
1984
2032
|
*/
|
|
1985
2033
|
update: protectedProcedure.input(SettingsSchema.pick({ mode: true, cloudUrl: true, globalDocsPath: true }).partial()).mutation(async ({ input }) => {
|
|
1986
|
-
const
|
|
2034
|
+
const current2 = await settingsManager.getSettings();
|
|
1987
2035
|
const updated = {
|
|
1988
|
-
...
|
|
2036
|
+
...current2,
|
|
1989
2037
|
...input
|
|
1990
2038
|
};
|
|
1991
2039
|
await settingsManager.saveSettings(updated);
|
|
@@ -2075,7 +2123,7 @@ var settingsRouter = router({
|
|
|
2075
2123
|
getParser: protectedProcedure.input(z10.object({ id: z10.string().max(128), ...ScopeShape })).query(async ({ input }) => {
|
|
2076
2124
|
const parser = await logParserStore.get(input.id, await scopeOf(input));
|
|
2077
2125
|
if (!parser) {
|
|
2078
|
-
throw new
|
|
2126
|
+
throw new TRPCError7({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
|
|
2079
2127
|
}
|
|
2080
2128
|
return parser;
|
|
2081
2129
|
}),
|
|
@@ -2091,7 +2139,7 @@ var settingsRouter = router({
|
|
|
2091
2139
|
).mutation(async ({ input }) => {
|
|
2092
2140
|
const { orgId, projectId, ...fields } = input;
|
|
2093
2141
|
if (!fields.code.trim()) {
|
|
2094
|
-
throw new
|
|
2142
|
+
throw new TRPCError7({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
|
|
2095
2143
|
}
|
|
2096
2144
|
return logParserStore.create(fields, await scopeOf({ orgId, projectId }));
|
|
2097
2145
|
}),
|
|
@@ -2106,14 +2154,14 @@ var settingsRouter = router({
|
|
|
2106
2154
|
).mutation(async ({ input }) => {
|
|
2107
2155
|
const { id, orgId, projectId, ...patch } = input;
|
|
2108
2156
|
if (id.startsWith("native:")) {
|
|
2109
|
-
throw new
|
|
2157
|
+
throw new TRPCError7({ code: "FORBIDDEN", message: "Cannot modify built-in parsers" });
|
|
2110
2158
|
}
|
|
2111
2159
|
if (patch.code !== void 0 && !patch.code.trim()) {
|
|
2112
|
-
throw new
|
|
2160
|
+
throw new TRPCError7({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
|
|
2113
2161
|
}
|
|
2114
2162
|
const updated = await logParserStore.update(id, patch, await scopeOf({ orgId, projectId }));
|
|
2115
2163
|
if (!updated) {
|
|
2116
|
-
throw new
|
|
2164
|
+
throw new TRPCError7({ code: "NOT_FOUND", message: `Parser not found: ${id}` });
|
|
2117
2165
|
}
|
|
2118
2166
|
return updated;
|
|
2119
2167
|
}),
|
|
@@ -2122,11 +2170,11 @@ var settingsRouter = router({
|
|
|
2122
2170
|
*/
|
|
2123
2171
|
deleteParser: protectedProcedure.input(z10.object({ id: z10.string().max(128), ...ScopeShape })).mutation(async ({ input }) => {
|
|
2124
2172
|
if (input.id.startsWith("native:")) {
|
|
2125
|
-
throw new
|
|
2173
|
+
throw new TRPCError7({ code: "FORBIDDEN", message: "Cannot delete built-in parsers" });
|
|
2126
2174
|
}
|
|
2127
2175
|
const deleted = await logParserStore.delete(input.id, await scopeOf(input));
|
|
2128
2176
|
if (!deleted) {
|
|
2129
|
-
throw new
|
|
2177
|
+
throw new TRPCError7({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
|
|
2130
2178
|
}
|
|
2131
2179
|
return { deleted: true };
|
|
2132
2180
|
}),
|
|
@@ -2165,15 +2213,15 @@ var settingsRouter = router({
|
|
|
2165
2213
|
prompt: z10.string().max(2e4).optional()
|
|
2166
2214
|
})).mutation(async ({ input }) => {
|
|
2167
2215
|
const settings = await settingsManager.getSettings();
|
|
2168
|
-
const
|
|
2216
|
+
const current2 = settings.companion ?? { enabledByDefault: false };
|
|
2169
2217
|
const prompt = input.prompt?.trim();
|
|
2170
2218
|
await settingsManager.saveSettings({
|
|
2171
2219
|
...settings,
|
|
2172
2220
|
companion: {
|
|
2173
|
-
enabledByDefault: input.enabledByDefault ??
|
|
2221
|
+
enabledByDefault: input.enabledByDefault ?? current2.enabledByDefault ?? false,
|
|
2174
2222
|
// Vide = « celles de Runeya » : on efface le réglage plutôt que d'y
|
|
2175
2223
|
// ranger une chaîne vide qui signifierait « aucune consigne ».
|
|
2176
|
-
...input.prompt === void 0 ?
|
|
2224
|
+
...input.prompt === void 0 ? current2.prompt ? { prompt: current2.prompt } : {} : prompt ? { prompt } : {}
|
|
2177
2225
|
}
|
|
2178
2226
|
});
|
|
2179
2227
|
return { ok: true };
|
|
@@ -2208,7 +2256,7 @@ var settingsRouter = router({
|
|
|
2208
2256
|
...ScopeShape
|
|
2209
2257
|
})).mutation(async ({ input }) => {
|
|
2210
2258
|
if (input.provider !== "ollama" && !input.apiKey?.trim()) {
|
|
2211
|
-
throw new
|
|
2259
|
+
throw new TRPCError7({ code: "BAD_REQUEST", message: "Une cl\xE9 API est requise pour ce provider." });
|
|
2212
2260
|
}
|
|
2213
2261
|
const vault = await scopeOf(input);
|
|
2214
2262
|
const priv = await settingsManager.getPrivateSettings(vault);
|
|
@@ -2249,7 +2297,7 @@ var settingsRouter = router({
|
|
|
2249
2297
|
const priv = await settingsManager.getPrivateSettings(vault);
|
|
2250
2298
|
const providers = priv.aiProviders ?? [];
|
|
2251
2299
|
const idx = providers.findIndex((p) => p.id === input.id);
|
|
2252
|
-
if (idx === -1) throw new
|
|
2300
|
+
if (idx === -1) throw new TRPCError7({ code: "NOT_FOUND", message: `AI provider not found: ${input.id}` });
|
|
2253
2301
|
const existing = providers[idx];
|
|
2254
2302
|
const encryptedApiKey = input.apiKey ? stableEncryptValue(input.apiKey, existing.encryptedApiKey, vault) : existing.encryptedApiKey;
|
|
2255
2303
|
const updated = {
|
|
@@ -2280,7 +2328,7 @@ var settingsRouter = router({
|
|
|
2280
2328
|
const priv = await settingsManager.getPrivateSettings(vault);
|
|
2281
2329
|
const providers = priv.aiProviders ?? [];
|
|
2282
2330
|
const filtered = providers.filter((p) => p.id !== input.id);
|
|
2283
|
-
if (filtered.length === providers.length) throw new
|
|
2331
|
+
if (filtered.length === providers.length) throw new TRPCError7({ code: "NOT_FOUND", message: `AI provider not found: ${input.id}` });
|
|
2284
2332
|
const deletedWasActive = providers.find((p) => p.id === input.id)?.active ?? false;
|
|
2285
2333
|
if (deletedWasActive && filtered.length > 0) filtered[0].active = true;
|
|
2286
2334
|
await settingsManager.savePrivateSettings({ ...priv, aiProviders: filtered }, vault);
|
|
@@ -2294,7 +2342,7 @@ var settingsRouter = router({
|
|
|
2294
2342
|
const priv = await settingsManager.getPrivateSettings(vault);
|
|
2295
2343
|
const providers = priv.aiProviders ?? [];
|
|
2296
2344
|
const idx = providers.findIndex((p) => p.id === input.id);
|
|
2297
|
-
if (idx === -1) throw new
|
|
2345
|
+
if (idx === -1) throw new TRPCError7({ code: "NOT_FOUND", message: `AI provider not found: ${input.id}` });
|
|
2298
2346
|
const updated = providers.map((p) => ({ ...p, active: p.id === input.id }));
|
|
2299
2347
|
await settingsManager.savePrivateSettings({ ...priv, aiProviders: updated }, vault);
|
|
2300
2348
|
return { id: input.id, active: true };
|
|
@@ -2416,7 +2464,7 @@ var settingsRouter = router({
|
|
|
2416
2464
|
const raw = agentStore.getTraefikConfig(input.agentId);
|
|
2417
2465
|
const parsed = raw ? TraefikConfigSchema.safeParse(raw) : null;
|
|
2418
2466
|
const config = parsed?.success ? parsed.data : null;
|
|
2419
|
-
if (!config?.enabled) throw new
|
|
2467
|
+
if (!config?.enabled) throw new TRPCError7({ code: "BAD_REQUEST", message: "Traefik non activ\xE9 sur cet agent" });
|
|
2420
2468
|
const decrypted = { ...config, dnsCredentials: traefikManager.decryptDnsCredentials(config.dnsCredentials ?? {}) };
|
|
2421
2469
|
await agentManager.agentMutation(input.agentId, "config.initTraefikConfig", decrypted, 5e3);
|
|
2422
2470
|
await agentManager.agentMutation(input.agentId, "config.restartTraefik", void 0, 3e4);
|
|
@@ -2429,7 +2477,7 @@ var settingsRouter = router({
|
|
|
2429
2477
|
const raw = agentStore.getTraefikConfig(input.agentId);
|
|
2430
2478
|
const parsed = raw ? TraefikConfigSchema.safeParse(raw) : null;
|
|
2431
2479
|
const config = parsed?.success ? parsed.data : null;
|
|
2432
|
-
if (!config?.enabled) throw new
|
|
2480
|
+
if (!config?.enabled) throw new TRPCError7({ code: "BAD_REQUEST", message: "Traefik non activ\xE9 sur cet agent" });
|
|
2433
2481
|
const decrypted = { ...config, dnsCredentials: traefikManager.decryptDnsCredentials(config.dnsCredentials ?? {}) };
|
|
2434
2482
|
await agentManager.agentMutation(input.agentId, "config.initTraefikConfig", decrypted, 5e3);
|
|
2435
2483
|
await agentManager.agentMutation(input.agentId, "config.renewTraefikCert", void 0, 3e4);
|
|
@@ -2561,7 +2609,7 @@ var settingsRouter = router({
|
|
|
2561
2609
|
updatedAt: /* @__PURE__ */ new Date()
|
|
2562
2610
|
}]);
|
|
2563
2611
|
} catch (err) {
|
|
2564
|
-
throw new
|
|
2612
|
+
throw new TRPCError7({
|
|
2565
2613
|
code: "BAD_REQUEST",
|
|
2566
2614
|
message: err instanceof Error ? err.message : String(err)
|
|
2567
2615
|
});
|
|
@@ -2590,7 +2638,7 @@ var settingsRouter = router({
|
|
|
2590
2638
|
|
|
2591
2639
|
// ../server/src/trpc/routers/editor.ts
|
|
2592
2640
|
import { z as z12 } from "zod";
|
|
2593
|
-
import { TRPCError as
|
|
2641
|
+
import { TRPCError as TRPCError8 } from "@trpc/server";
|
|
2594
2642
|
import { execFile as execFile3, spawn as spawn2 } from "child_process";
|
|
2595
2643
|
import { stat as stat2 } from "fs/promises";
|
|
2596
2644
|
import { resolve, join as join4 } from "path";
|
|
@@ -2683,7 +2731,7 @@ async function getServiceCwd(serviceId) {
|
|
|
2683
2731
|
const services = await serviceStore.list();
|
|
2684
2732
|
const service = services.find((s) => s.id === serviceId);
|
|
2685
2733
|
if (!service) {
|
|
2686
|
-
throw new
|
|
2734
|
+
throw new TRPCError8({ code: "NOT_FOUND", message: "Service not found" });
|
|
2687
2735
|
}
|
|
2688
2736
|
return resolveCwd(await resolveWorkspaceCwd({ serviceId }));
|
|
2689
2737
|
}
|
|
@@ -2716,7 +2764,7 @@ var editorRouter = router({
|
|
|
2716
2764
|
editorKey: z12.string().max(64)
|
|
2717
2765
|
})).mutation(async ({ input }) => {
|
|
2718
2766
|
if (!EDITOR_BY_KEY.has(input.editorKey)) {
|
|
2719
|
-
throw new
|
|
2767
|
+
throw new TRPCError8({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
|
|
2720
2768
|
}
|
|
2721
2769
|
await userConfigManager.setEditorPreference(
|
|
2722
2770
|
{ id: input.projectId, orgId: input.orgId },
|
|
@@ -2732,7 +2780,7 @@ var editorRouter = router({
|
|
|
2732
2780
|
editorKey: z12.string().max(64)
|
|
2733
2781
|
})).mutation(async ({ input }) => {
|
|
2734
2782
|
if (!EDITOR_BY_KEY.has(input.editorKey)) {
|
|
2735
|
-
throw new
|
|
2783
|
+
throw new TRPCError8({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
|
|
2736
2784
|
}
|
|
2737
2785
|
await userConfigManager.setEditorPreference(
|
|
2738
2786
|
{ id: input.projectId, orgId: input.orgId },
|
|
@@ -2758,15 +2806,15 @@ var editorRouter = router({
|
|
|
2758
2806
|
})).mutation(async ({ input }) => {
|
|
2759
2807
|
const editor = EDITOR_BY_KEY.get(input.editorKey);
|
|
2760
2808
|
if (!editor) {
|
|
2761
|
-
throw new
|
|
2809
|
+
throw new TRPCError8({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
|
|
2762
2810
|
}
|
|
2763
2811
|
const expanded = input.path.replace(/^~(\/|$)/, `${process.env["HOME"] ?? "/tmp"}$1`).replace(/\$\{(\w+)\}|\$(\w+)/g, (_, a, b) => process.env[a || b] ?? "");
|
|
2764
2812
|
const resolvedPath = resolve(expanded || ".");
|
|
2765
2813
|
try {
|
|
2766
2814
|
await stat2(resolvedPath);
|
|
2767
2815
|
} catch (err) {
|
|
2768
|
-
if (err instanceof
|
|
2769
|
-
throw new
|
|
2816
|
+
if (err instanceof TRPCError8) throw err;
|
|
2817
|
+
throw new TRPCError8({ code: "BAD_REQUEST", message: `Path does not exist: ${resolvedPath}` });
|
|
2770
2818
|
}
|
|
2771
2819
|
const invocation = resolveCliInvocation(editor.command, [resolvedPath]);
|
|
2772
2820
|
const child = spawn2(invocation.command, invocation.args, {
|
|
@@ -2785,17 +2833,17 @@ var editorRouter = router({
|
|
|
2785
2833
|
})).mutation(async ({ input }) => {
|
|
2786
2834
|
const editor = EDITOR_BY_KEY.get(input.editorKey);
|
|
2787
2835
|
if (!editor) {
|
|
2788
|
-
throw new
|
|
2836
|
+
throw new TRPCError8({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
|
|
2789
2837
|
}
|
|
2790
2838
|
const cwd = await getServiceCwd(input.serviceId);
|
|
2791
2839
|
const filePath = join4(cwd, input.relativePath);
|
|
2792
2840
|
if (!filePath.startsWith(cwd)) {
|
|
2793
|
-
throw new
|
|
2841
|
+
throw new TRPCError8({ code: "BAD_REQUEST", message: "Path traversal not allowed" });
|
|
2794
2842
|
}
|
|
2795
2843
|
try {
|
|
2796
2844
|
await stat2(filePath);
|
|
2797
2845
|
} catch {
|
|
2798
|
-
throw new
|
|
2846
|
+
throw new TRPCError8({ code: "BAD_REQUEST", message: `File does not exist: ${filePath}` });
|
|
2799
2847
|
}
|
|
2800
2848
|
const invocation = resolveCliInvocation(editor.command, [filePath]);
|
|
2801
2849
|
const child = spawn2(invocation.command, invocation.args, {
|
|
@@ -2811,7 +2859,7 @@ var editorRouter = router({
|
|
|
2811
2859
|
|
|
2812
2860
|
// ../server/src/trpc/routers/api-keys.ts
|
|
2813
2861
|
import { z as z13 } from "zod";
|
|
2814
|
-
import { TRPCError as
|
|
2862
|
+
import { TRPCError as TRPCError9 } from "@trpc/server";
|
|
2815
2863
|
import { mkdir as mkdir3, writeFile as writeFile3 } from "fs/promises";
|
|
2816
2864
|
import { join as join5, dirname as dirname2 } from "path";
|
|
2817
2865
|
var ALLOWED_SKILL_PATHS = /* @__PURE__ */ new Set([
|
|
@@ -2835,22 +2883,22 @@ var apiKeysRouter = router({
|
|
|
2835
2883
|
*/
|
|
2836
2884
|
reveal: protectedProcedure.input(z13.object({ id: z13.string().max(128) })).query(async ({ input }) => {
|
|
2837
2885
|
const key = await apiKeyStore.reveal(input.id);
|
|
2838
|
-
if (!key) throw new
|
|
2886
|
+
if (!key) throw new TRPCError9({ code: "NOT_FOUND", message: "API key not found" });
|
|
2839
2887
|
return { key };
|
|
2840
2888
|
}),
|
|
2841
2889
|
update: protectedProcedure.input(KeyInputSchema.extend({ id: z13.string().max(128) })).mutation(async ({ input }) => {
|
|
2842
2890
|
const updated = await apiKeyStore.update(input.id, input.name, input.scopes, input.isPublic);
|
|
2843
|
-
if (!updated) throw new
|
|
2891
|
+
if (!updated) throw new TRPCError9({ code: "NOT_FOUND", message: "API key not found" });
|
|
2844
2892
|
return maskApiKey(updated);
|
|
2845
2893
|
}),
|
|
2846
2894
|
remove: protectedProcedure.input(z13.object({ id: z13.string().max(128) })).mutation(async ({ input }) => {
|
|
2847
2895
|
const removed = await apiKeyStore.remove(input.id);
|
|
2848
|
-
if (!removed) throw new
|
|
2896
|
+
if (!removed) throw new TRPCError9({ code: "NOT_FOUND", message: "API key not found" });
|
|
2849
2897
|
return { success: true };
|
|
2850
2898
|
}),
|
|
2851
2899
|
renewKey: protectedProcedure.input(z13.object({ id: z13.string().max(128) })).mutation(async ({ input }) => {
|
|
2852
2900
|
const renewed = await apiKeyStore.renewKey(input.id);
|
|
2853
|
-
if (!renewed) throw new
|
|
2901
|
+
if (!renewed) throw new TRPCError9({ code: "NOT_FOUND", message: "API key not found" });
|
|
2854
2902
|
return renewed;
|
|
2855
2903
|
}),
|
|
2856
2904
|
writeSkillFile: protectedProcedure.input(z13.object({
|
|
@@ -2858,7 +2906,7 @@ var apiKeysRouter = router({
|
|
|
2858
2906
|
content: z13.string().max(32768)
|
|
2859
2907
|
})).mutation(async ({ input }) => {
|
|
2860
2908
|
if (!ALLOWED_SKILL_PATHS.has(input.relativePath)) {
|
|
2861
|
-
throw new
|
|
2909
|
+
throw new TRPCError9({ code: "BAD_REQUEST", message: "Chemin non autoris\xE9" });
|
|
2862
2910
|
}
|
|
2863
2911
|
const abs = join5(await resolveWorkspaceCwd({}), input.relativePath);
|
|
2864
2912
|
await mkdir3(dirname2(abs), { recursive: true });
|
|
@@ -2869,7 +2917,7 @@ var apiKeysRouter = router({
|
|
|
2869
2917
|
|
|
2870
2918
|
// ../server/src/trpc/routers/git.ts
|
|
2871
2919
|
import { z as z14 } from "zod";
|
|
2872
|
-
import { TRPCError as
|
|
2920
|
+
import { TRPCError as TRPCError10 } from "@trpc/server";
|
|
2873
2921
|
import Anthropic from "@anthropic-ai/sdk";
|
|
2874
2922
|
import OpenAI from "openai";
|
|
2875
2923
|
var SERVICE_ID_SCHEMA = z14.string().max(128);
|
|
@@ -2881,11 +2929,11 @@ var BRANCH_SCHEMA = z14.string().min(1).max(256).regex(/^[a-zA-Z0-9._\-/]+$/);
|
|
|
2881
2929
|
async function resolveServiceContext(serviceId) {
|
|
2882
2930
|
const service = await serviceStore.get(serviceId);
|
|
2883
2931
|
if (!service) {
|
|
2884
|
-
throw new
|
|
2932
|
+
throw new TRPCError10({ code: "NOT_FOUND", message: "Service not found" });
|
|
2885
2933
|
}
|
|
2886
2934
|
const agentId = await resolveEffectiveAgentId(service);
|
|
2887
2935
|
if (!agentId) {
|
|
2888
|
-
throw new
|
|
2936
|
+
throw new TRPCError10({ code: "BAD_REQUEST", message: "No agent configured for this service" });
|
|
2889
2937
|
}
|
|
2890
2938
|
return { agentId, cwd: await resolveWorkspaceCwd({ serviceId }) };
|
|
2891
2939
|
}
|
|
@@ -2901,7 +2949,7 @@ async function resolveGitContext(input) {
|
|
|
2901
2949
|
if (input.serviceId) return resolveServiceContext(input.serviceId);
|
|
2902
2950
|
const agentId = input.agentId ?? agentManager.getDefaultAgentId();
|
|
2903
2951
|
if (!agentId) {
|
|
2904
|
-
throw new
|
|
2952
|
+
throw new TRPCError10({ code: "BAD_REQUEST", message: "No agent available" });
|
|
2905
2953
|
}
|
|
2906
2954
|
const cwd = await resolveAgentCwd({ projectId: input.projectId, orgId: input.orgId }) ?? ".";
|
|
2907
2955
|
return { agentId, cwd };
|
|
@@ -2987,14 +3035,14 @@ var gitRouter = router({
|
|
|
2987
3035
|
const { agentId, cwd } = await resolveGitContext(input);
|
|
2988
3036
|
const { diff } = await agentManager.agentQuery(agentId, "git.stagedDiff", { cwd });
|
|
2989
3037
|
if (!diff.trim()) {
|
|
2990
|
-
throw new
|
|
3038
|
+
throw new TRPCError10({ code: "BAD_REQUEST", message: "No staged changes to generate a commit message from" });
|
|
2991
3039
|
}
|
|
2992
3040
|
const active = await getActiveProvider(
|
|
2993
3041
|
input.providerId,
|
|
2994
3042
|
input.orgId ?? await vaultOfProject(input.projectId)
|
|
2995
3043
|
);
|
|
2996
3044
|
if (!active) {
|
|
2997
|
-
throw new
|
|
3045
|
+
throw new TRPCError10({ code: "BAD_REQUEST", message: "No AI provider configured" });
|
|
2998
3046
|
}
|
|
2999
3047
|
const systemPrompt = `You are a git commit message generator. Given a git diff, write a concise and meaningful conventional commit message (e.g. feat:, fix:, refactor:, chore:, docs:, style:, test:).
|
|
3000
3048
|
Rules:
|
|
@@ -3027,7 +3075,7 @@ Rules:
|
|
|
3027
3075
|
});
|
|
3028
3076
|
return { message: res.choices[0]?.message?.content?.trim() ?? "" };
|
|
3029
3077
|
}
|
|
3030
|
-
throw new
|
|
3078
|
+
throw new TRPCError10({ code: "BAD_REQUEST", message: "Unsupported AI provider" });
|
|
3031
3079
|
}),
|
|
3032
3080
|
/** Merge a branch into the current branch */
|
|
3033
3081
|
merge: protectedProcedure.input(z14.object({ ...gitTargetShape, branch: BRANCH_SCHEMA, noFf: z14.boolean().default(false) })).mutation(async ({ input }) => {
|
|
@@ -3092,7 +3140,7 @@ Rules:
|
|
|
3092
3140
|
}
|
|
3093
3141
|
);
|
|
3094
3142
|
} catch (err) {
|
|
3095
|
-
throw new
|
|
3143
|
+
throw new TRPCError10({
|
|
3096
3144
|
code: "BAD_REQUEST",
|
|
3097
3145
|
message: `Cannot subscribe to git status: ${err.message}`
|
|
3098
3146
|
});
|
|
@@ -3120,41 +3168,41 @@ Rules:
|
|
|
3120
3168
|
|
|
3121
3169
|
// ../server/src/trpc/routers/scenario.ts
|
|
3122
3170
|
import { randomUUID as randomUUID2 } from "crypto";
|
|
3123
|
-
import { TRPCError as
|
|
3171
|
+
import { TRPCError as TRPCError13 } from "@trpc/server";
|
|
3124
3172
|
import { z as z15 } from "zod";
|
|
3125
3173
|
|
|
3126
3174
|
// ../server/src/trpc/crud-procedure-utils.ts
|
|
3127
|
-
import { TRPCError as
|
|
3175
|
+
import { TRPCError as TRPCError11 } from "@trpc/server";
|
|
3128
3176
|
async function getOrNotFound(getter, notFoundMessage) {
|
|
3129
3177
|
const entity = await getter();
|
|
3130
|
-
if (!entity) throw new
|
|
3178
|
+
if (!entity) throw new TRPCError11({ code: "NOT_FOUND", message: notFoundMessage });
|
|
3131
3179
|
return entity;
|
|
3132
3180
|
}
|
|
3133
3181
|
async function createOrBadRequest(creator) {
|
|
3134
3182
|
try {
|
|
3135
3183
|
return await creator();
|
|
3136
3184
|
} catch (err) {
|
|
3137
|
-
throw new
|
|
3185
|
+
throw new TRPCError11({ code: "BAD_REQUEST", message: err.message });
|
|
3138
3186
|
}
|
|
3139
3187
|
}
|
|
3140
3188
|
async function updateOrThrow(updater, notFoundMessage) {
|
|
3141
3189
|
try {
|
|
3142
3190
|
const entity = await updater();
|
|
3143
|
-
if (!entity) throw new
|
|
3191
|
+
if (!entity) throw new TRPCError11({ code: "NOT_FOUND", message: notFoundMessage });
|
|
3144
3192
|
return entity;
|
|
3145
3193
|
} catch (err) {
|
|
3146
|
-
if (err instanceof
|
|
3147
|
-
throw new
|
|
3194
|
+
if (err instanceof TRPCError11) throw err;
|
|
3195
|
+
throw new TRPCError11({ code: "BAD_REQUEST", message: err.message });
|
|
3148
3196
|
}
|
|
3149
3197
|
}
|
|
3150
3198
|
async function deleteOrNotFound(deleter, notFoundMessage) {
|
|
3151
3199
|
const deleted = await deleter();
|
|
3152
|
-
if (!deleted) throw new
|
|
3200
|
+
if (!deleted) throw new TRPCError11({ code: "NOT_FOUND", message: notFoundMessage });
|
|
3153
3201
|
return { ok: true };
|
|
3154
3202
|
}
|
|
3155
3203
|
|
|
3156
3204
|
// ../server/src/trpc/ai-generation-procedure-utils.ts
|
|
3157
|
-
import { TRPCError as
|
|
3205
|
+
import { TRPCError as TRPCError12 } from "@trpc/server";
|
|
3158
3206
|
|
|
3159
3207
|
// ../server/src/services/ai-generation.ts
|
|
3160
3208
|
import Anthropic2 from "@anthropic-ai/sdk";
|
|
@@ -3197,9 +3245,9 @@ async function* streamProviderText(input) {
|
|
|
3197
3245
|
stream: true,
|
|
3198
3246
|
max_tokens: maxTokens
|
|
3199
3247
|
}, { signal: signal ?? void 0 });
|
|
3200
|
-
for await (const
|
|
3248
|
+
for await (const chunk2 of stream) {
|
|
3201
3249
|
if (signal?.aborted) return;
|
|
3202
|
-
const text =
|
|
3250
|
+
const text = chunk2.choices[0]?.delta?.content;
|
|
3203
3251
|
if (text) yield text;
|
|
3204
3252
|
}
|
|
3205
3253
|
return;
|
|
@@ -3210,7 +3258,7 @@ async function* streamProviderText(input) {
|
|
|
3210
3258
|
// ../server/src/trpc/ai-generation-procedure-utils.ts
|
|
3211
3259
|
async function* streamWithActiveProvider(opts) {
|
|
3212
3260
|
const active = await getActiveProvider(opts.providerId, opts.vault);
|
|
3213
|
-
if (!active) throw new
|
|
3261
|
+
if (!active) throw new TRPCError12({ code: "BAD_REQUEST", message: "Aucun fournisseur IA configur\xE9" });
|
|
3214
3262
|
const { provider, plaintextKey } = active;
|
|
3215
3263
|
const model = opts.model || provider.model || DEFAULT_MODELS[provider.provider] || "";
|
|
3216
3264
|
try {
|
|
@@ -3228,7 +3276,7 @@ async function* streamWithActiveProvider(opts) {
|
|
|
3228
3276
|
yield { type: "done", text: "" };
|
|
3229
3277
|
} catch (err) {
|
|
3230
3278
|
if (String(err?.message ?? "").startsWith("Unsupported provider:")) {
|
|
3231
|
-
throw new
|
|
3279
|
+
throw new TRPCError12({ code: "BAD_REQUEST", message: `Fournisseur non support\xE9: ${provider.provider}` });
|
|
3232
3280
|
}
|
|
3233
3281
|
throw err;
|
|
3234
3282
|
}
|
|
@@ -4708,10 +4756,10 @@ Rules:
|
|
|
4708
4756
|
- Groups: position spaced 400px apart (e.g. x=0, x=400, x=800). width >= 300, height >= 200.
|
|
4709
4757
|
- Nodes positions are relative to their group: x/y in 30-260 range.
|
|
4710
4758
|
- The "prompt" field must be detailed: role, responsibilities, communication style, expected outputs.`;
|
|
4711
|
-
function buildScenarioUserMessage(userPrompt,
|
|
4712
|
-
if (
|
|
4759
|
+
function buildScenarioUserMessage(userPrompt, current2) {
|
|
4760
|
+
if (current2 && (current2.groups.length > 0 || current2.nodes.length > 0)) {
|
|
4713
4761
|
return `Current scenario:
|
|
4714
|
-
${JSON.stringify(
|
|
4762
|
+
${JSON.stringify(current2, null, 2)}
|
|
4715
4763
|
|
|
4716
4764
|
User request: ${userPrompt}
|
|
4717
4765
|
|
|
@@ -4805,7 +4853,7 @@ var scenarioRouter = router({
|
|
|
4805
4853
|
resume: z15.boolean().optional()
|
|
4806
4854
|
})).subscription(async function* ({ input, signal }) {
|
|
4807
4855
|
const scenario = await scenarioStore.get(input.scenarioId, await scopeOf2(input));
|
|
4808
|
-
if (!scenario) throw new
|
|
4856
|
+
if (!scenario) throw new TRPCError13({ code: "NOT_FOUND", message: "Scenario not found" });
|
|
4809
4857
|
const canStart = input.userRequest.trim().length > 0 || !!input.resume;
|
|
4810
4858
|
if (!isScenarioRunning(input.conversationId) && canStart) {
|
|
4811
4859
|
let userRequest = input.userRequest;
|
|
@@ -4832,7 +4880,7 @@ var scenarioRouter = router({
|
|
|
4832
4880
|
text: z15.string().min(1).max(1e5)
|
|
4833
4881
|
})).mutation(({ input }) => {
|
|
4834
4882
|
const resolved = resolveNodeInput(input.conversationId, input.nodeId, input.text);
|
|
4835
|
-
if (!resolved) throw new
|
|
4883
|
+
if (!resolved) throw new TRPCError13({ code: "NOT_FOUND", message: "No pending input request for this node" });
|
|
4836
4884
|
return { ok: true };
|
|
4837
4885
|
}),
|
|
4838
4886
|
isRunning: protectedProcedure.input(z15.object({ conversationId: ConversationIdSchema })).query(({ input }) => ({ running: isScenarioRunning(input.conversationId) })),
|
|
@@ -4892,14 +4940,14 @@ var scenarioRouter = router({
|
|
|
4892
4940
|
listPresets: protectedProcedure.query(() => listPresets()),
|
|
4893
4941
|
getPreset: protectedProcedure.input(z15.object({ id: Id128Schema })).query(({ input }) => {
|
|
4894
4942
|
const preset = getPreset(input.id);
|
|
4895
|
-
if (!preset) throw new
|
|
4943
|
+
if (!preset) throw new TRPCError13({ code: "NOT_FOUND", message: "Preset not found" });
|
|
4896
4944
|
return preset;
|
|
4897
4945
|
})
|
|
4898
4946
|
});
|
|
4899
4947
|
|
|
4900
4948
|
// ../server/src/trpc/routers/debug.ts
|
|
4901
4949
|
import { randomUUID as randomUUID3 } from "crypto";
|
|
4902
|
-
import { TRPCError as
|
|
4950
|
+
import { TRPCError as TRPCError14 } from "@trpc/server";
|
|
4903
4951
|
import { z as z16 } from "zod";
|
|
4904
4952
|
var MAX_BUFFER2 = 300;
|
|
4905
4953
|
var jobs = /* @__PURE__ */ new Map();
|
|
@@ -4972,17 +5020,17 @@ var debugRouter = router({
|
|
|
4972
5020
|
tick: 0,
|
|
4973
5021
|
done: false,
|
|
4974
5022
|
timer: setInterval(() => {
|
|
4975
|
-
const
|
|
4976
|
-
if (!
|
|
4977
|
-
|
|
4978
|
-
publish(
|
|
5023
|
+
const current2 = jobs.get(jobId);
|
|
5024
|
+
if (!current2 || current2.done) return;
|
|
5025
|
+
current2.tick += 1;
|
|
5026
|
+
publish(current2, {
|
|
4979
5027
|
type: "tick",
|
|
4980
5028
|
jobId,
|
|
4981
|
-
index:
|
|
5029
|
+
index: current2.tick,
|
|
4982
5030
|
value: Math.random(),
|
|
4983
5031
|
at: Date.now()
|
|
4984
5032
|
});
|
|
4985
|
-
if (
|
|
5033
|
+
if (current2.tick >= current2.maxTicks) {
|
|
4986
5034
|
stopJob(jobId, "max_ticks");
|
|
4987
5035
|
}
|
|
4988
5036
|
}, intervalMs),
|
|
@@ -4996,7 +5044,7 @@ var debugRouter = router({
|
|
|
4996
5044
|
streamRandomJob: protectedProcedure.input(z16.object({ jobId: z16.string().max(128) })).subscription(async function* ({ input, signal }) {
|
|
4997
5045
|
const job = jobs.get(input.jobId);
|
|
4998
5046
|
if (!job) {
|
|
4999
|
-
throw new
|
|
5047
|
+
throw new TRPCError14({ code: "NOT_FOUND", message: "Random job not found" });
|
|
5000
5048
|
}
|
|
5001
5049
|
yield* tapJob(job, signal ?? new AbortController().signal);
|
|
5002
5050
|
}),
|
|
@@ -5012,7 +5060,7 @@ var debugRouter = router({
|
|
|
5012
5060
|
|
|
5013
5061
|
// ../server/src/trpc/routers/diagnostics.ts
|
|
5014
5062
|
import { z as z17 } from "zod";
|
|
5015
|
-
import { TRPCError as
|
|
5063
|
+
import { TRPCError as TRPCError15 } from "@trpc/server";
|
|
5016
5064
|
|
|
5017
5065
|
// ../server/src/services/log-buffer.ts
|
|
5018
5066
|
import { EventEmitter } from "events";
|
|
@@ -5056,16 +5104,16 @@ function installLogCapture() {
|
|
|
5056
5104
|
[process.stderr, "stderr"]
|
|
5057
5105
|
]) {
|
|
5058
5106
|
const original = stream.write.bind(stream);
|
|
5059
|
-
stream.write = ((
|
|
5107
|
+
stream.write = ((chunk2, encoding, callback) => {
|
|
5060
5108
|
try {
|
|
5061
|
-
const text = typeof
|
|
5109
|
+
const text = typeof chunk2 === "string" ? chunk2 : Buffer.from(chunk2).toString("utf8");
|
|
5062
5110
|
for (const raw of text.split("\n")) {
|
|
5063
5111
|
const line = raw.endsWith("\r") ? raw.slice(0, -1) : raw;
|
|
5064
5112
|
if (line.trim() !== "") push(line, name);
|
|
5065
5113
|
}
|
|
5066
5114
|
} catch {
|
|
5067
5115
|
}
|
|
5068
|
-
return original(
|
|
5116
|
+
return original(chunk2, encoding, callback);
|
|
5069
5117
|
});
|
|
5070
5118
|
}
|
|
5071
5119
|
}
|
|
@@ -5132,12 +5180,12 @@ var diagnosticsRouter = router({
|
|
|
5132
5180
|
} catch (err) {
|
|
5133
5181
|
const reason = err.message;
|
|
5134
5182
|
if (reason === "instance-not-found") {
|
|
5135
|
-
throw new
|
|
5183
|
+
throw new TRPCError15({ code: "NOT_FOUND", message: "No live Runeya instance with this pid." });
|
|
5136
5184
|
}
|
|
5137
5185
|
if (reason === "instance-is-current") {
|
|
5138
|
-
throw new
|
|
5186
|
+
throw new TRPCError15({ code: "BAD_REQUEST", message: "This instance cannot stop itself." });
|
|
5139
5187
|
}
|
|
5140
|
-
throw new
|
|
5188
|
+
throw new TRPCError15({ code: "INTERNAL_SERVER_ERROR", message: reason });
|
|
5141
5189
|
}
|
|
5142
5190
|
}),
|
|
5143
5191
|
/**
|
|
@@ -5164,15 +5212,15 @@ var diagnosticsRouter = router({
|
|
|
5164
5212
|
} catch (err) {
|
|
5165
5213
|
const reason = err.message;
|
|
5166
5214
|
if (reason === "instance-not-found") {
|
|
5167
|
-
throw new
|
|
5215
|
+
throw new TRPCError15({ code: "NOT_FOUND", message: "No live Runeya instance with this pid." });
|
|
5168
5216
|
}
|
|
5169
5217
|
if (reason.startsWith("instance-not-restartable:")) {
|
|
5170
|
-
throw new
|
|
5218
|
+
throw new TRPCError15({
|
|
5171
5219
|
code: "BAD_REQUEST",
|
|
5172
5220
|
message: `This instance cannot be restarted (${reason.split(":")[1]}).`
|
|
5173
5221
|
});
|
|
5174
5222
|
}
|
|
5175
|
-
throw new
|
|
5223
|
+
throw new TRPCError15({ code: "INTERNAL_SERVER_ERROR", message: reason });
|
|
5176
5224
|
}
|
|
5177
5225
|
})
|
|
5178
5226
|
});
|
|
@@ -5435,7 +5483,7 @@ import { createHash } from "crypto";
|
|
|
5435
5483
|
import { tmpdir } from "os";
|
|
5436
5484
|
import { join as join7 } from "path";
|
|
5437
5485
|
import { z as z19 } from "zod";
|
|
5438
|
-
import { TRPCError as
|
|
5486
|
+
import { TRPCError as TRPCError16 } from "@trpc/server";
|
|
5439
5487
|
function summarizeCard(card, boardId, columnTitle) {
|
|
5440
5488
|
return {
|
|
5441
5489
|
boardId,
|
|
@@ -5506,7 +5554,7 @@ async function storeAttachment(id, name, body, dirs = attachmentCacheDirs()) {
|
|
|
5506
5554
|
refusals.push(`${dir} (${err instanceof Error ? err.message : String(err)})`);
|
|
5507
5555
|
}
|
|
5508
5556
|
}
|
|
5509
|
-
throw new
|
|
5557
|
+
throw new TRPCError16({
|
|
5510
5558
|
code: "INTERNAL_SERVER_ERROR",
|
|
5511
5559
|
message: `Impossible d'\xE9crire la pi\xE8ce jointe sur cette machine. Emplacements essay\xE9s : ${refusals.join(" ; ")}. V\xE9rifiez les droits d'\xE9criture, ou l'espace disque.`
|
|
5512
5560
|
});
|
|
@@ -5657,7 +5705,7 @@ var kanbanRouter = router({
|
|
|
5657
5705
|
input.parentCardId ? { boardId: input.parentBoardId ?? input.boardId, cardId: input.parentCardId } : null
|
|
5658
5706
|
);
|
|
5659
5707
|
if (!ok) {
|
|
5660
|
-
throw new
|
|
5708
|
+
throw new TRPCError16({ code: "BAD_REQUEST", message: "The cloud refused the link (unknown card, or a cycle)." });
|
|
5661
5709
|
}
|
|
5662
5710
|
return { ok: true };
|
|
5663
5711
|
}),
|
|
@@ -5756,25 +5804,25 @@ var kanbanRouter = router({
|
|
|
5756
5804
|
downloadAttachment: protectedProcedure.input(z19.object({ attachmentId: z19.string().max(128) })).mutation(async ({ input }) => {
|
|
5757
5805
|
const id = input.attachmentId;
|
|
5758
5806
|
if (!ATTACHMENT_ID_REGEX.test(id)) {
|
|
5759
|
-
throw new
|
|
5807
|
+
throw new TRPCError16({ code: "BAD_REQUEST", message: "Invalid attachment id" });
|
|
5760
5808
|
}
|
|
5761
5809
|
const res = await cloudFetch2(`/api/kanban/file/${id}`, { timeoutMs: 12e4 });
|
|
5762
5810
|
if (res.status === 404) {
|
|
5763
|
-
throw new
|
|
5811
|
+
throw new TRPCError16({ code: "NOT_FOUND", message: `Attachment ${id} not found` });
|
|
5764
5812
|
}
|
|
5765
5813
|
if (!res.ok) {
|
|
5766
|
-
throw new
|
|
5814
|
+
throw new TRPCError16({
|
|
5767
5815
|
code: res.status === 403 ? "FORBIDDEN" : "INTERNAL_SERVER_ERROR",
|
|
5768
5816
|
message: `Cloud refused the attachment (HTTP ${res.status})`
|
|
5769
5817
|
});
|
|
5770
5818
|
}
|
|
5771
5819
|
const declared = Number(res.headers.get("content-length") ?? 0);
|
|
5772
5820
|
if (declared > MAX_ATTACHMENT_BYTES) {
|
|
5773
|
-
throw new
|
|
5821
|
+
throw new TRPCError16({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
|
|
5774
5822
|
}
|
|
5775
5823
|
const body = Buffer.from(await res.arrayBuffer());
|
|
5776
5824
|
if (body.length > MAX_ATTACHMENT_BYTES) {
|
|
5777
|
-
throw new
|
|
5825
|
+
throw new TRPCError16({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
|
|
5778
5826
|
}
|
|
5779
5827
|
const contentType = res.headers.get("content-type") ?? "application/octet-stream";
|
|
5780
5828
|
const disposition = res.headers.get("content-disposition") ?? "";
|
|
@@ -5787,7 +5835,7 @@ var kanbanRouter = router({
|
|
|
5787
5835
|
|
|
5788
5836
|
// ../server/src/trpc/routers/terminal.ts
|
|
5789
5837
|
import { z as z20 } from "zod";
|
|
5790
|
-
import { TRPCError as
|
|
5838
|
+
import { TRPCError as TRPCError17 } from "@trpc/server";
|
|
5791
5839
|
var terminalRouter = router({
|
|
5792
5840
|
/** Create a PTY shell session on the target agent */
|
|
5793
5841
|
create: protectedProcedure.input(z20.object({
|
|
@@ -5911,7 +5959,7 @@ var terminalRouter = router({
|
|
|
5911
5959
|
}
|
|
5912
5960
|
);
|
|
5913
5961
|
} catch (err) {
|
|
5914
|
-
throw new
|
|
5962
|
+
throw new TRPCError17({
|
|
5915
5963
|
code: "BAD_REQUEST",
|
|
5916
5964
|
message: `Cannot subscribe to terminal: ${err.message}`
|
|
5917
5965
|
});
|
|
@@ -5946,7 +5994,7 @@ var utilityRouter = router({
|
|
|
5946
5994
|
|
|
5947
5995
|
// ../server/src/trpc/routers/wiki.ts
|
|
5948
5996
|
import { z as z22 } from "zod";
|
|
5949
|
-
import { TRPCError as
|
|
5997
|
+
import { TRPCError as TRPCError18 } from "@trpc/server";
|
|
5950
5998
|
import { readFile as readFile3, readdir as readdir2, stat as stat4, realpath, writeFile as writeFile5, mkdir as mkdir6, rename as rename3, rm as rm2 } from "fs/promises";
|
|
5951
5999
|
import { resolve as resolvePath, join as join8, relative, sep, dirname as dirname3 } from "path";
|
|
5952
6000
|
var SCOPE_SCHEMA = z22.union([
|
|
@@ -5982,27 +6030,27 @@ async function resolveScope(scope) {
|
|
|
5982
6030
|
const settings = await settingsManager.getSettings();
|
|
5983
6031
|
const sub = (settings.globalDocsPath?.trim() || "wiki").replace(/^[\\/]+|[\\/]+$/g, "");
|
|
5984
6032
|
if (sub.includes("..") || sub.includes("\0")) {
|
|
5985
|
-
throw new
|
|
6033
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Sous-chemin invalide" });
|
|
5986
6034
|
}
|
|
5987
6035
|
const dataDirAbs = resolvePath(env.DATA_DIR);
|
|
5988
6036
|
await mkdir6(dataDirAbs, { recursive: true });
|
|
5989
6037
|
const base = dirname3(await realpath(dataDirAbs));
|
|
5990
6038
|
const target = resolvePath(base, sub);
|
|
5991
6039
|
if (target !== base && !(target + sep).startsWith(base + sep)) {
|
|
5992
|
-
throw new
|
|
6040
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier de donn\xE9es du serveur" });
|
|
5993
6041
|
}
|
|
5994
6042
|
await mkdir6(target, { recursive: true });
|
|
5995
6043
|
const root = await realpath(target);
|
|
5996
6044
|
if (root !== base && !(root + sep).startsWith(base + sep)) {
|
|
5997
|
-
throw new
|
|
6045
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Le dossier wiki r\xE9sout hors du dossier de donn\xE9es" });
|
|
5998
6046
|
}
|
|
5999
6047
|
return { mode: "local", root };
|
|
6000
6048
|
}
|
|
6001
6049
|
const serviceId = scope.slice("service:".length);
|
|
6002
6050
|
const service = await serviceStore.get(serviceId);
|
|
6003
|
-
if (!service) throw new
|
|
6051
|
+
if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
|
|
6004
6052
|
const agentId = await resolveEffectiveAgentId(service);
|
|
6005
|
-
if (!agentId) throw new
|
|
6053
|
+
if (!agentId) throw new TRPCError18({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9 pour ce service" });
|
|
6006
6054
|
const cwd = await resolveWorkspaceCwd({ serviceId, override: service.docsPath?.trim() || void 0 });
|
|
6007
6055
|
return { mode: "agent", agentId, cwd };
|
|
6008
6056
|
}
|
|
@@ -6037,7 +6085,7 @@ async function walkLocal(root, dir, depth, counter) {
|
|
|
6037
6085
|
}
|
|
6038
6086
|
async function resolveSafeLocal(root, relPath, requireExist) {
|
|
6039
6087
|
if (relPath.includes("..") || relPath.startsWith("/")) {
|
|
6040
|
-
throw new
|
|
6088
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Chemin invalide" });
|
|
6041
6089
|
}
|
|
6042
6090
|
const target = resolvePath(root, relPath);
|
|
6043
6091
|
if (requireExist) {
|
|
@@ -6045,10 +6093,10 @@ async function resolveSafeLocal(root, relPath, requireExist) {
|
|
|
6045
6093
|
try {
|
|
6046
6094
|
real = await realpath(target);
|
|
6047
6095
|
} catch {
|
|
6048
|
-
throw new
|
|
6096
|
+
throw new TRPCError18({ code: "NOT_FOUND", message: "Chemin introuvable" });
|
|
6049
6097
|
}
|
|
6050
6098
|
if (real !== root && !(real + sep).startsWith(root + sep)) {
|
|
6051
|
-
throw new
|
|
6099
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
|
|
6052
6100
|
}
|
|
6053
6101
|
return real;
|
|
6054
6102
|
}
|
|
@@ -6060,7 +6108,7 @@ async function resolveSafeLocal(root, relPath, requireExist) {
|
|
|
6060
6108
|
realParent = parent;
|
|
6061
6109
|
}
|
|
6062
6110
|
if (realParent !== root && !(realParent + sep).startsWith(root + sep)) {
|
|
6063
|
-
throw new
|
|
6111
|
+
throw new TRPCError18({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
|
|
6064
6112
|
}
|
|
6065
6113
|
return resolvePath(realParent, target.slice(parent.length).replace(/^[\\/]+/, ""));
|
|
6066
6114
|
}
|
|
@@ -6076,7 +6124,7 @@ var wikiRouter = router({
|
|
|
6076
6124
|
}),
|
|
6077
6125
|
read: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).output(z22.object({ path: z22.string(), content: z22.string() })).query(async ({ input }) => {
|
|
6078
6126
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
6079
|
-
throw new
|
|
6127
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
6080
6128
|
}
|
|
6081
6129
|
const target = await resolveScope(input.scope);
|
|
6082
6130
|
if (target.mode === "agent") {
|
|
@@ -6084,14 +6132,14 @@ var wikiRouter = router({
|
|
|
6084
6132
|
}
|
|
6085
6133
|
const file = await resolveSafeLocal(target.root, input.path, true);
|
|
6086
6134
|
const s = await stat4(file);
|
|
6087
|
-
if (!s.isFile()) throw new
|
|
6088
|
-
if (s.size > MAX_FILE_BYTES) throw new
|
|
6135
|
+
if (!s.isFile()) throw new TRPCError18({ code: "BAD_REQUEST", message: "Pas un fichier" });
|
|
6136
|
+
if (s.size > MAX_FILE_BYTES) throw new TRPCError18({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
|
|
6089
6137
|
const content = await readFile3(file, "utf-8");
|
|
6090
6138
|
return { path: input.path, content };
|
|
6091
6139
|
}),
|
|
6092
6140
|
write: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA, content: z22.string().max(5e6) })).mutation(async ({ input }) => {
|
|
6093
6141
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
6094
|
-
throw new
|
|
6142
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
6095
6143
|
}
|
|
6096
6144
|
const target = await resolveScope(input.scope);
|
|
6097
6145
|
if (target.mode === "agent") {
|
|
@@ -6104,7 +6152,7 @@ var wikiRouter = router({
|
|
|
6104
6152
|
}),
|
|
6105
6153
|
createFile: protectedProcedure.input(z22.object({ scope: SCOPE_SCHEMA, path: REL_PATH_SCHEMA })).mutation(async ({ input }) => {
|
|
6106
6154
|
if (!/\.(md|markdown)$/i.test(input.path)) {
|
|
6107
|
-
throw new
|
|
6155
|
+
throw new TRPCError18({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
|
|
6108
6156
|
}
|
|
6109
6157
|
const target = await resolveScope(input.scope);
|
|
6110
6158
|
if (target.mode === "agent") {
|
|
@@ -6113,9 +6161,9 @@ var wikiRouter = router({
|
|
|
6113
6161
|
const file = await resolveSafeLocal(target.root, input.path, false);
|
|
6114
6162
|
try {
|
|
6115
6163
|
await stat4(file);
|
|
6116
|
-
throw new
|
|
6164
|
+
throw new TRPCError18({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
|
|
6117
6165
|
} catch (err) {
|
|
6118
|
-
if (err instanceof
|
|
6166
|
+
if (err instanceof TRPCError18) throw err;
|
|
6119
6167
|
}
|
|
6120
6168
|
await mkdir6(dirname3(file), { recursive: true });
|
|
6121
6169
|
await writeFile5(file, "", "utf-8");
|
|
@@ -6139,9 +6187,9 @@ var wikiRouter = router({
|
|
|
6139
6187
|
const to = await resolveSafeLocal(target.root, input.toPath, false);
|
|
6140
6188
|
try {
|
|
6141
6189
|
await stat4(to);
|
|
6142
|
-
throw new
|
|
6190
|
+
throw new TRPCError18({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
|
|
6143
6191
|
} catch (err) {
|
|
6144
|
-
if (err instanceof
|
|
6192
|
+
if (err instanceof TRPCError18) throw err;
|
|
6145
6193
|
}
|
|
6146
6194
|
await mkdir6(dirname3(to), { recursive: true });
|
|
6147
6195
|
await rename3(from, to);
|
|
@@ -6154,9 +6202,9 @@ var wikiRouter = router({
|
|
|
6154
6202
|
}
|
|
6155
6203
|
const serviceId = input.scope.slice("service:".length);
|
|
6156
6204
|
const service = await serviceStore.get(serviceId);
|
|
6157
|
-
if (!service) throw new
|
|
6205
|
+
if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
|
|
6158
6206
|
const agentId = await resolveEffectiveAgentId(service);
|
|
6159
|
-
if (!agentId) throw new
|
|
6207
|
+
if (!agentId) throw new TRPCError18({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9" });
|
|
6160
6208
|
const cwd = await resolveWorkspaceCwd({ serviceId, override: service.docsPath?.trim() || void 0 });
|
|
6161
6209
|
return agentManager.agentMutation(agentId, "wiki.ensureRoot", { cwd });
|
|
6162
6210
|
}),
|
|
@@ -6166,7 +6214,7 @@ var wikiRouter = router({
|
|
|
6166
6214
|
return agentManager.agentMutation(target.agentId, "wiki.deletePath", { cwd: target.cwd, path: input.path });
|
|
6167
6215
|
}
|
|
6168
6216
|
const fp = await resolveSafeLocal(target.root, input.path, true);
|
|
6169
|
-
if (fp === target.root) throw new
|
|
6217
|
+
if (fp === target.root) throw new TRPCError18({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
|
|
6170
6218
|
await rm2(fp, { recursive: true, force: true });
|
|
6171
6219
|
return { path: input.path, ok: true };
|
|
6172
6220
|
})
|
|
@@ -6187,7 +6235,7 @@ var configRouter = router({
|
|
|
6187
6235
|
|
|
6188
6236
|
// ../server/src/trpc/routers/cloud-sync.ts
|
|
6189
6237
|
import { z as z23 } from "zod";
|
|
6190
|
-
import { TRPCError as
|
|
6238
|
+
import { TRPCError as TRPCError19 } from "@trpc/server";
|
|
6191
6239
|
|
|
6192
6240
|
// ../server/src/services/org-sync-scope.ts
|
|
6193
6241
|
import { access } from "fs/promises";
|
|
@@ -7319,7 +7367,7 @@ async function assertOrgReadable(orgId) {
|
|
|
7319
7367
|
await assertOrgVaultReadable(orgId);
|
|
7320
7368
|
} catch (err) {
|
|
7321
7369
|
if (err instanceof OrgVaultUnreadableError) {
|
|
7322
|
-
throw new
|
|
7370
|
+
throw new TRPCError19({ code: "FORBIDDEN", message: err.message });
|
|
7323
7371
|
}
|
|
7324
7372
|
throw err;
|
|
7325
7373
|
}
|
|
@@ -7329,10 +7377,10 @@ async function assertOrgKey(orgId) {
|
|
|
7329
7377
|
await reconcileOrgCanary(orgId);
|
|
7330
7378
|
} catch (err) {
|
|
7331
7379
|
if (err instanceof OrgKeyMismatchError) {
|
|
7332
|
-
throw new
|
|
7380
|
+
throw new TRPCError19({ code: "FORBIDDEN", message: err.message });
|
|
7333
7381
|
}
|
|
7334
7382
|
if (err instanceof CanaryUnavailableError) {
|
|
7335
|
-
throw new
|
|
7383
|
+
throw new TRPCError19({ code: "PRECONDITION_FAILED", message: err.message });
|
|
7336
7384
|
}
|
|
7337
7385
|
throw err;
|
|
7338
7386
|
}
|
|
@@ -7371,7 +7419,7 @@ var cloudSyncRouter = router({
|
|
|
7371
7419
|
return { pulled, state: syncState(input.orgId), heldBy: await syncLockHolder(input.orgId) };
|
|
7372
7420
|
} catch (err) {
|
|
7373
7421
|
if (err instanceof ProjectHeldElsewhereError) {
|
|
7374
|
-
throw new
|
|
7422
|
+
throw new TRPCError19({ code: "CONFLICT", message: err.code, cause: err });
|
|
7375
7423
|
}
|
|
7376
7424
|
throw err;
|
|
7377
7425
|
}
|
|
@@ -7398,10 +7446,10 @@ var cloudSyncRouter = router({
|
|
|
7398
7446
|
).mutation(async ({ input }) => {
|
|
7399
7447
|
const local = await projectStore.get({ id: input.projectId, orgId: null });
|
|
7400
7448
|
if (!local) {
|
|
7401
|
-
throw new
|
|
7449
|
+
throw new TRPCError19({ code: "NOT_FOUND", message: "PROJECT_NOT_LOCAL" });
|
|
7402
7450
|
}
|
|
7403
7451
|
if (await projectStore.get({ id: input.projectId, orgId: input.orgId })) {
|
|
7404
|
-
throw new
|
|
7452
|
+
throw new TRPCError19({ code: "CONFLICT", message: "PROJECT_ALREADY_IN_ORG" });
|
|
7405
7453
|
}
|
|
7406
7454
|
await assertOrgReadable(input.orgId);
|
|
7407
7455
|
const connected = cloudSyncBridge.states().some((s) => s.orgId === input.orgId);
|
|
@@ -7420,7 +7468,7 @@ var cloudSyncRouter = router({
|
|
|
7420
7468
|
await cloudSyncBridge.followProject(input.orgId, input.projectId);
|
|
7421
7469
|
} catch (err) {
|
|
7422
7470
|
if (err instanceof ProjectHeldElsewhereError) {
|
|
7423
|
-
throw new
|
|
7471
|
+
throw new TRPCError19({ code: "CONFLICT", message: err.code, cause: err });
|
|
7424
7472
|
}
|
|
7425
7473
|
throw err;
|
|
7426
7474
|
}
|
|
@@ -7443,7 +7491,7 @@ var cloudSyncRouter = router({
|
|
|
7443
7491
|
{ method: "GET" }
|
|
7444
7492
|
);
|
|
7445
7493
|
if (!res.ok) {
|
|
7446
|
-
throw new
|
|
7494
|
+
throw new TRPCError19({ code: "BAD_GATEWAY", message: await cloudMessage(res) || `CANARY_READ_FAILED (${res.status})` });
|
|
7447
7495
|
}
|
|
7448
7496
|
const { canary } = await res.json();
|
|
7449
7497
|
if (typeof canary !== "string") return { matches: false, published: false };
|
|
@@ -7510,7 +7558,7 @@ var cloudSyncRouter = router({
|
|
|
7510
7558
|
resetOrgKey: protectedProcedure.input(z23.object({ orgId: z23.string().min(1).max(128) })).mutation(async ({ input }) => {
|
|
7511
7559
|
const canary = await readVerifyFile(orgVaultRoot(input.orgId)) ?? await readVerifyFile(await keyRoot());
|
|
7512
7560
|
if (!canary) {
|
|
7513
|
-
throw new
|
|
7561
|
+
throw new TRPCError19({
|
|
7514
7562
|
code: "PRECONDITION_FAILED",
|
|
7515
7563
|
message: "Cette machine n'a pas encore de cl\xE9 de chiffrement."
|
|
7516
7564
|
});
|
|
@@ -7521,7 +7569,7 @@ var cloudSyncRouter = router({
|
|
|
7521
7569
|
});
|
|
7522
7570
|
if (!res.ok) {
|
|
7523
7571
|
const detail = await cloudMessage(res);
|
|
7524
|
-
throw new
|
|
7572
|
+
throw new TRPCError19({
|
|
7525
7573
|
code: res.status === 403 ? "FORBIDDEN" : "BAD_GATEWAY",
|
|
7526
7574
|
message: detail || `ORG_KEY_RESET_FAILED (${res.status})`
|
|
7527
7575
|
});
|
|
@@ -7567,8 +7615,8 @@ var cloudSyncRouter = router({
|
|
|
7567
7615
|
body: { organizationId: input.orgId, projectId: input.projectId }
|
|
7568
7616
|
});
|
|
7569
7617
|
} catch (err) {
|
|
7570
|
-
if (err instanceof
|
|
7571
|
-
throw new
|
|
7618
|
+
if (err instanceof TRPCError19 && err.code === "PRECONDITION_FAILED") {
|
|
7619
|
+
throw new TRPCError19({ code: "PRECONDITION_FAILED", message: "CLOUD_NOT_LINKED" });
|
|
7572
7620
|
}
|
|
7573
7621
|
throw err;
|
|
7574
7622
|
}
|
|
@@ -7576,12 +7624,12 @@ var cloudSyncRouter = router({
|
|
|
7576
7624
|
const detail = await cloudMessage(res);
|
|
7577
7625
|
if (res.status === 403) {
|
|
7578
7626
|
const code = /not a member/i.test(detail) ? "PROJECT_NOT_MEMBER" : "PROJECT_DELETE_FORBIDDEN";
|
|
7579
|
-
throw new
|
|
7627
|
+
throw new TRPCError19({ code: "FORBIDDEN", message: code, cause: new Error(detail) });
|
|
7580
7628
|
}
|
|
7581
7629
|
if (res.status === 404) {
|
|
7582
|
-
throw new
|
|
7630
|
+
throw new TRPCError19({ code: "NOT_FOUND", message: "PROJECT_NOT_IN_ORG", cause: new Error(detail) });
|
|
7583
7631
|
}
|
|
7584
|
-
throw new
|
|
7632
|
+
throw new TRPCError19({
|
|
7585
7633
|
code: "BAD_GATEWAY",
|
|
7586
7634
|
message: detail || `PROJECT_DELETE_FAILED (${res.status})`
|
|
7587
7635
|
});
|
|
@@ -7635,12 +7683,11 @@ var cloudSyncRouter = router({
|
|
|
7635
7683
|
* réseau muet laisse en place ce qui est déjà là : hors ligne, on garde.
|
|
7636
7684
|
*/
|
|
7637
7685
|
cacheOrgLogos: protectedProcedure.input(z23.object({ orgIds: z23.array(z23.string().min(1).max(128)).max(200) })).mutation(async ({ input }) => {
|
|
7638
|
-
const clouds = await readOrgClouds();
|
|
7639
7686
|
let cached = 0;
|
|
7640
7687
|
for (const orgId of input.orgIds) {
|
|
7641
|
-
const base = (
|
|
7688
|
+
const base = await orgCloudUrl(orgId);
|
|
7642
7689
|
try {
|
|
7643
|
-
const res = await fetch(`${base}/api/org-logo/${encodeURIComponent(orgId)}`, {
|
|
7690
|
+
const res = await fetch(`${base}/api/org-logo/${encodeURIComponent(orgId)}?format=png`, {
|
|
7644
7691
|
signal: AbortSignal.timeout(1e4)
|
|
7645
7692
|
});
|
|
7646
7693
|
if (res.status === 404) {
|
|
@@ -7777,6 +7824,133 @@ var filesystemRouter = router({
|
|
|
7777
7824
|
})
|
|
7778
7825
|
});
|
|
7779
7826
|
|
|
7827
|
+
// ../server/src/trpc/routers/desktop.ts
|
|
7828
|
+
import { z as z25 } from "zod";
|
|
7829
|
+
import { isAbsolute as isAbsolute3 } from "path";
|
|
7830
|
+
import { TRPCError as TRPCError20 } from "@trpc/server";
|
|
7831
|
+
|
|
7832
|
+
// ../server/src/services/desktop-launcher.ts
|
|
7833
|
+
import { execFile as execFile4 } from "child_process";
|
|
7834
|
+
import { isAbsolute as isAbsolute2 } from "path";
|
|
7835
|
+
import { promisify as promisify3 } from "util";
|
|
7836
|
+
var exec = promisify3(execFile4);
|
|
7837
|
+
var INSTALL_TIMEOUT_MS2 = 3e4;
|
|
7838
|
+
var cli = null;
|
|
7839
|
+
function registerCli(location) {
|
|
7840
|
+
cli = location;
|
|
7841
|
+
}
|
|
7842
|
+
function suggestLauncher() {
|
|
7843
|
+
const workingDir = process.cwd();
|
|
7844
|
+
return {
|
|
7845
|
+
available: cli !== null,
|
|
7846
|
+
fromDesktop: env.FROM_DESKTOP,
|
|
7847
|
+
workingDir,
|
|
7848
|
+
name: deriveLauncherIdentity(void 0, workingDir).name,
|
|
7849
|
+
port: env.PORT,
|
|
7850
|
+
agentPort: env.RUNEYA_AGENT_PORT
|
|
7851
|
+
};
|
|
7852
|
+
}
|
|
7853
|
+
async function installLauncher(input) {
|
|
7854
|
+
if (!cli) throw new Error("launcher-unavailable");
|
|
7855
|
+
if (input.workingDir !== null && !isAbsolute2(input.workingDir)) {
|
|
7856
|
+
throw new Error("launcher-working-dir-not-absolute");
|
|
7857
|
+
}
|
|
7858
|
+
const args = [
|
|
7859
|
+
cli.cliEntry,
|
|
7860
|
+
"install-desktop",
|
|
7861
|
+
...input.workingDir === null ? ["--no-cwd"] : [input.workingDir],
|
|
7862
|
+
"--name",
|
|
7863
|
+
input.name,
|
|
7864
|
+
"--port",
|
|
7865
|
+
String(input.port),
|
|
7866
|
+
"--agent-port",
|
|
7867
|
+
String(input.agentPort)
|
|
7868
|
+
];
|
|
7869
|
+
const { stdout, stderr } = await exec(cli.execPath, args, {
|
|
7870
|
+
timeout: INSTALL_TIMEOUT_MS2,
|
|
7871
|
+
windowsHide: true,
|
|
7872
|
+
// Le rapport tient en quelques lignes ; au-delà, quelque chose a dérapé.
|
|
7873
|
+
maxBuffer: 1024 * 1024,
|
|
7874
|
+
// Sans terminal, le CLI n'ajoute pas de couleurs : la sortie est lisible telle quelle.
|
|
7875
|
+
env: { ...process.env, NO_COLOR: "1" }
|
|
7876
|
+
});
|
|
7877
|
+
return { name: input.name, output: [stdout, stderr].filter((s) => s.trim()).join("\n").trim() };
|
|
7878
|
+
}
|
|
7879
|
+
|
|
7880
|
+
// ../server/src/services/tray-accent.ts
|
|
7881
|
+
var accent = null;
|
|
7882
|
+
var listeners2 = /* @__PURE__ */ new Set();
|
|
7883
|
+
function getTrayAccent() {
|
|
7884
|
+
return accent;
|
|
7885
|
+
}
|
|
7886
|
+
function setTrayAccent(next) {
|
|
7887
|
+
const normalized = next === null ? null : next.trim().toLowerCase();
|
|
7888
|
+
if (normalized === accent) return;
|
|
7889
|
+
accent = normalized;
|
|
7890
|
+
for (const listener of listeners2) {
|
|
7891
|
+
try {
|
|
7892
|
+
listener();
|
|
7893
|
+
} catch {
|
|
7894
|
+
}
|
|
7895
|
+
}
|
|
7896
|
+
}
|
|
7897
|
+
function onTrayAccentChanged(listener) {
|
|
7898
|
+
listeners2.add(listener);
|
|
7899
|
+
return () => listeners2.delete(listener);
|
|
7900
|
+
}
|
|
7901
|
+
|
|
7902
|
+
// ../server/src/trpc/routers/desktop.ts
|
|
7903
|
+
var desktopRouter = router({
|
|
7904
|
+
/** Ce que le CLI demanderait, prérempli avec l'instance en cours. */
|
|
7905
|
+
suggestLauncher: protectedProcedure.query(() => suggestLauncher()),
|
|
7906
|
+
/**
|
|
7907
|
+
* La couleur du thème de cet onglet.
|
|
7908
|
+
*
|
|
7909
|
+
* Le thème vit dans le navigateur ; l'icône de barre système, elle, est
|
|
7910
|
+
* dessinée par le serveur. Sans cette annonce elle garderait la teinte figée
|
|
7911
|
+
* du fichier livré avec le CLI. Rien n'est persisté — voir `tray-accent.ts`.
|
|
7912
|
+
*/
|
|
7913
|
+
setTrayAccent: protectedProcedure.input(z25.object({
|
|
7914
|
+
// `#rgb` ou `#rrggbb` : la forme est vérifiée ici, pas rabotée plus loin.
|
|
7915
|
+
color: z25.string().regex(/^#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/).nullable()
|
|
7916
|
+
})).mutation(({ input }) => {
|
|
7917
|
+
setTrayAccent(input.color);
|
|
7918
|
+
return { ok: true };
|
|
7919
|
+
}),
|
|
7920
|
+
installLauncher: protectedProcedure.input(z25.object({
|
|
7921
|
+
name: z25.string().trim().min(1).max(120),
|
|
7922
|
+
/**
|
|
7923
|
+
* `null` : raccourci global, sans dossier épinglé. Sinon un chemin
|
|
7924
|
+
* absolu, refusé autrement : le dossier devient un argument positionnel
|
|
7925
|
+
* du CLI, où une valeur commençant par un tiret passerait pour un drapeau.
|
|
7926
|
+
*/
|
|
7927
|
+
workingDir: z25.string().max(4096).refine(isAbsolute3, {
|
|
7928
|
+
message: "Le dossier de travail doit \xEAtre un chemin absolu."
|
|
7929
|
+
}).nullable(),
|
|
7930
|
+
port: z25.number().int().min(1).max(65535),
|
|
7931
|
+
agentPort: z25.number().int().min(1).max(65535)
|
|
7932
|
+
})).mutation(async ({ input }) => {
|
|
7933
|
+
try {
|
|
7934
|
+
return await installLauncher(input);
|
|
7935
|
+
} catch (err) {
|
|
7936
|
+
const message = err.message;
|
|
7937
|
+
if (message === "launcher-working-dir-not-absolute") {
|
|
7938
|
+
throw new TRPCError20({
|
|
7939
|
+
code: "BAD_REQUEST",
|
|
7940
|
+
message: "Le dossier de travail doit \xEAtre un chemin absolu."
|
|
7941
|
+
});
|
|
7942
|
+
}
|
|
7943
|
+
if (message === "launcher-unavailable") {
|
|
7944
|
+
throw new TRPCError20({
|
|
7945
|
+
code: "PRECONDITION_FAILED",
|
|
7946
|
+
message: "Cette Runeya ne sait pas o\xF9 trouver son CLI : cr\xE9ez le raccourci avec `runeya install-desktop`."
|
|
7947
|
+
});
|
|
7948
|
+
}
|
|
7949
|
+
throw new TRPCError20({ code: "INTERNAL_SERVER_ERROR", message });
|
|
7950
|
+
}
|
|
7951
|
+
})
|
|
7952
|
+
});
|
|
7953
|
+
|
|
7780
7954
|
// ../server/src/trpc/router.ts
|
|
7781
7955
|
var appRouter = router({
|
|
7782
7956
|
health: healthRouter,
|
|
@@ -7805,7 +7979,8 @@ var appRouter = router({
|
|
|
7805
7979
|
config: configRouter,
|
|
7806
7980
|
cloudSync: cloudSyncRouter,
|
|
7807
7981
|
cloudAuth: cloudAuthRouter,
|
|
7808
|
-
filesystem: filesystemRouter
|
|
7982
|
+
filesystem: filesystemRouter,
|
|
7983
|
+
desktop: desktopRouter
|
|
7809
7984
|
});
|
|
7810
7985
|
|
|
7811
7986
|
// ../server/src/middleware/error-handler.ts
|
|
@@ -9347,6 +9522,9 @@ async function createLocalServer() {
|
|
|
9347
9522
|
console.warn("[server] Failed to start Claude transcript watcher:", err);
|
|
9348
9523
|
});
|
|
9349
9524
|
startCodexTranscriptWatcher();
|
|
9525
|
+
await serviceStore.list().catch((err) => {
|
|
9526
|
+
console.warn("[server] Failed to preload services:", err);
|
|
9527
|
+
});
|
|
9350
9528
|
cloudSyncBridge.start().catch((err) => {
|
|
9351
9529
|
console.warn("[server] Failed to start cloud sync bridge:", err);
|
|
9352
9530
|
});
|
|
@@ -9939,7 +10117,7 @@ async function createLocalServer() {
|
|
|
9939
10117
|
]);
|
|
9940
10118
|
console.log("[server] Shutdown complete");
|
|
9941
10119
|
};
|
|
9942
|
-
const { initCompanion } = await import("./companion-
|
|
10120
|
+
const { initCompanion } = await import("./companion-MUFVXURV.js");
|
|
9943
10121
|
initCompanion();
|
|
9944
10122
|
return { app, server, wss, shutdown };
|
|
9945
10123
|
}
|
|
@@ -10026,6 +10204,273 @@ async function pullEnv(opts) {
|
|
|
10026
10204
|
return Object.entries(env2).map(([key, value]) => `${key}=${value}`).join("\n");
|
|
10027
10205
|
}
|
|
10028
10206
|
|
|
10207
|
+
// ../server/src/services/tray-services.ts
|
|
10208
|
+
async function listTrayServices() {
|
|
10209
|
+
const [all, processes] = await Promise.all([serviceStore.list(), listAllProcesses()]);
|
|
10210
|
+
const byServiceId = new Map(processes.map((p) => [p.serviceId, p]));
|
|
10211
|
+
const services = all.map((service) => {
|
|
10212
|
+
const status = byServiceId.get(service.id);
|
|
10213
|
+
return {
|
|
10214
|
+
id: service.id,
|
|
10215
|
+
name: service.name,
|
|
10216
|
+
agentId: status?.agentId ?? service.agentId ?? null,
|
|
10217
|
+
running: status?.state === "running" || status?.state === "starting",
|
|
10218
|
+
failed: status?.state === "errored" || status?.healthStatus === "unhealthy",
|
|
10219
|
+
url: primaryServiceLink(service, "localhost")
|
|
10220
|
+
};
|
|
10221
|
+
});
|
|
10222
|
+
const owned = await currentProjectServiceIds();
|
|
10223
|
+
if (owned) return services.filter((service) => owned.has(service.id));
|
|
10224
|
+
return services.filter((service) => service.running || service.failed);
|
|
10225
|
+
}
|
|
10226
|
+
async function currentProjectServiceIds() {
|
|
10227
|
+
const ref = getCurrentProject();
|
|
10228
|
+
if (!ref) return null;
|
|
10229
|
+
const project = await projectStore.get(ref);
|
|
10230
|
+
if (!project) return null;
|
|
10231
|
+
return new Set(project.serviceIds);
|
|
10232
|
+
}
|
|
10233
|
+
function onTrayServicesChanged(listener) {
|
|
10234
|
+
const onStatus = () => listener();
|
|
10235
|
+
agentManager.on("process:status", onStatus);
|
|
10236
|
+
const offServices = serviceStore.onChange(onStatus);
|
|
10237
|
+
const offUnlock = onVaultUnlocked(onStatus);
|
|
10238
|
+
const offProject = onCurrentProjectChanged(onStatus);
|
|
10239
|
+
const offAccent = onTrayAccentChanged(onStatus);
|
|
10240
|
+
return () => {
|
|
10241
|
+
agentManager.off("process:status", onStatus);
|
|
10242
|
+
offServices();
|
|
10243
|
+
offUnlock();
|
|
10244
|
+
offAccent();
|
|
10245
|
+
offProject();
|
|
10246
|
+
};
|
|
10247
|
+
}
|
|
10248
|
+
|
|
10249
|
+
// ../server/src/services/tray-icon.ts
|
|
10250
|
+
import { mkdir as mkdir13, writeFile as writeFile10, rename as rename8 } from "fs/promises";
|
|
10251
|
+
import { join as join17 } from "path";
|
|
10252
|
+
|
|
10253
|
+
// ../server/src/services/png-to-ico.ts
|
|
10254
|
+
function isPng(bytes) {
|
|
10255
|
+
const signature = [137, 80, 78, 71, 13, 10, 26, 10];
|
|
10256
|
+
return bytes.length > signature.length && signature.every((b, i) => bytes[i] === b);
|
|
10257
|
+
}
|
|
10258
|
+
function pngSize(bytes) {
|
|
10259
|
+
if (bytes.length < 24 || !isPng(bytes)) return null;
|
|
10260
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
10261
|
+
if (String.fromCharCode(...bytes.slice(12, 16)) !== "IHDR") return null;
|
|
10262
|
+
const width = view.getUint32(16);
|
|
10263
|
+
const height = view.getUint32(20);
|
|
10264
|
+
if (width === 0 || height === 0) return null;
|
|
10265
|
+
return { width, height };
|
|
10266
|
+
}
|
|
10267
|
+
function pngToIco(png) {
|
|
10268
|
+
const size = pngSize(png);
|
|
10269
|
+
if (!size) return null;
|
|
10270
|
+
if (size.width > 256 || size.height > 256) return null;
|
|
10271
|
+
const header = new Uint8Array(6 + 16);
|
|
10272
|
+
const view = new DataView(header.buffer);
|
|
10273
|
+
view.setUint16(0, 0, true);
|
|
10274
|
+
view.setUint16(2, 1, true);
|
|
10275
|
+
view.setUint16(4, 1, true);
|
|
10276
|
+
header[6] = size.width === 256 ? 0 : size.width;
|
|
10277
|
+
header[7] = size.height === 256 ? 0 : size.height;
|
|
10278
|
+
header[8] = 0;
|
|
10279
|
+
header[9] = 0;
|
|
10280
|
+
view.setUint16(10, 1, true);
|
|
10281
|
+
view.setUint16(12, 32, true);
|
|
10282
|
+
view.setUint32(14, png.length, true);
|
|
10283
|
+
view.setUint32(18, header.length, true);
|
|
10284
|
+
const ico = new Uint8Array(header.length + png.length);
|
|
10285
|
+
ico.set(header, 0);
|
|
10286
|
+
ico.set(png, header.length);
|
|
10287
|
+
return ico;
|
|
10288
|
+
}
|
|
10289
|
+
|
|
10290
|
+
// ../server/src/services/runeya-icon.ts
|
|
10291
|
+
import { deflateSync } from "zlib";
|
|
10292
|
+
var VIEW = 28;
|
|
10293
|
+
var CORNER_RADIUS = 8;
|
|
10294
|
+
var STROKE_WIDTH = 2.5;
|
|
10295
|
+
var STROKES = [
|
|
10296
|
+
[7, 20, 14, 8],
|
|
10297
|
+
[14, 8, 21, 20],
|
|
10298
|
+
[10, 16, 18, 16]
|
|
10299
|
+
];
|
|
10300
|
+
function parseHexColor(hex) {
|
|
10301
|
+
const value = hex.trim().replace(/^#/, "");
|
|
10302
|
+
const full = value.length === 3 ? value.replace(/./g, (c) => c + c) : value;
|
|
10303
|
+
if (!/^[0-9a-fA-F]{6}$/.test(full)) return null;
|
|
10304
|
+
return [
|
|
10305
|
+
parseInt(full.slice(0, 2), 16),
|
|
10306
|
+
parseInt(full.slice(2, 4), 16),
|
|
10307
|
+
parseInt(full.slice(4, 6), 16)
|
|
10308
|
+
];
|
|
10309
|
+
}
|
|
10310
|
+
function distanceToRoundedRect(x, y, half, radius) {
|
|
10311
|
+
const dx = Math.abs(x) - (half - radius);
|
|
10312
|
+
const dy = Math.abs(y) - (half - radius);
|
|
10313
|
+
const outside = Math.hypot(Math.max(dx, 0), Math.max(dy, 0));
|
|
10314
|
+
return outside + Math.min(Math.max(dx, dy), 0) - radius;
|
|
10315
|
+
}
|
|
10316
|
+
function distanceToStroke(x, y, [ax, ay, bx, by], width) {
|
|
10317
|
+
const px = x - ax;
|
|
10318
|
+
const py = y - ay;
|
|
10319
|
+
const vx = bx - ax;
|
|
10320
|
+
const vy = by - ay;
|
|
10321
|
+
const t = Math.min(1, Math.max(0, (px * vx + py * vy) / (vx * vx + vy * vy)));
|
|
10322
|
+
return Math.hypot(px - vx * t, py - vy * t) - width / 2;
|
|
10323
|
+
}
|
|
10324
|
+
function coverage(distance, pixel) {
|
|
10325
|
+
return Math.min(1, Math.max(0, 0.5 - distance / pixel));
|
|
10326
|
+
}
|
|
10327
|
+
function renderRuneyaIcon(color, size = 64) {
|
|
10328
|
+
const rgb = parseHexColor(color);
|
|
10329
|
+
if (!rgb || size < 8 || size > 1024) return null;
|
|
10330
|
+
const scale = size / VIEW;
|
|
10331
|
+
const pixel = 1 / scale;
|
|
10332
|
+
const half = VIEW / 2;
|
|
10333
|
+
const rgba = new Uint8Array(size * size * 4);
|
|
10334
|
+
for (let py = 0; py < size; py += 1) {
|
|
10335
|
+
for (let px = 0; px < size; px += 1) {
|
|
10336
|
+
const x = (px + 0.5) / scale;
|
|
10337
|
+
const y = (py + 0.5) / scale;
|
|
10338
|
+
const background = coverage(distanceToRoundedRect(x - half, y - half, half, CORNER_RADIUS), pixel);
|
|
10339
|
+
if (background <= 0) continue;
|
|
10340
|
+
let stroke = 0;
|
|
10341
|
+
for (const segment of STROKES) {
|
|
10342
|
+
stroke = Math.max(stroke, coverage(distanceToStroke(x, y, segment, STROKE_WIDTH), pixel));
|
|
10343
|
+
}
|
|
10344
|
+
stroke = Math.min(stroke, background);
|
|
10345
|
+
const offset = (py * size + px) * 4;
|
|
10346
|
+
for (let channel = 0; channel < 3; channel += 1) {
|
|
10347
|
+
rgba[offset + channel] = Math.round(rgb[channel] * (1 - stroke) + 255 * stroke);
|
|
10348
|
+
}
|
|
10349
|
+
rgba[offset + 3] = Math.round(background * 255);
|
|
10350
|
+
}
|
|
10351
|
+
}
|
|
10352
|
+
return encodePng(rgba, size, size);
|
|
10353
|
+
}
|
|
10354
|
+
var CRC_TABLE = (() => {
|
|
10355
|
+
const table = new Uint32Array(256);
|
|
10356
|
+
for (let n = 0; n < 256; n += 1) {
|
|
10357
|
+
let c = n;
|
|
10358
|
+
for (let k = 0; k < 8; k += 1) c = c & 1 ? 3988292384 ^ c >>> 1 : c >>> 1;
|
|
10359
|
+
table[n] = c >>> 0;
|
|
10360
|
+
}
|
|
10361
|
+
return table;
|
|
10362
|
+
})();
|
|
10363
|
+
function crc32(bytes) {
|
|
10364
|
+
let crc = 4294967295;
|
|
10365
|
+
for (const byte of bytes) crc = CRC_TABLE[(crc ^ byte) & 255] ^ crc >>> 8;
|
|
10366
|
+
return (crc ^ 4294967295) >>> 0;
|
|
10367
|
+
}
|
|
10368
|
+
function chunk(type, data) {
|
|
10369
|
+
const out = new Uint8Array(data.length + 12);
|
|
10370
|
+
const view = new DataView(out.buffer);
|
|
10371
|
+
view.setUint32(0, data.length);
|
|
10372
|
+
for (let i = 0; i < 4; i += 1) out[4 + i] = type.charCodeAt(i);
|
|
10373
|
+
out.set(data, 8);
|
|
10374
|
+
view.setUint32(data.length + 8, crc32(out.subarray(4, data.length + 8)));
|
|
10375
|
+
return out;
|
|
10376
|
+
}
|
|
10377
|
+
function encodePng(rgba, width, height) {
|
|
10378
|
+
const header = new Uint8Array(13);
|
|
10379
|
+
const view = new DataView(header.buffer);
|
|
10380
|
+
view.setUint32(0, width);
|
|
10381
|
+
view.setUint32(4, height);
|
|
10382
|
+
header[8] = 8;
|
|
10383
|
+
header[9] = 6;
|
|
10384
|
+
const raw = new Uint8Array(height * (width * 4 + 1));
|
|
10385
|
+
for (let y = 0; y < height; y += 1) {
|
|
10386
|
+
raw[y * (width * 4 + 1)] = 0;
|
|
10387
|
+
raw.set(rgba.subarray(y * width * 4, (y + 1) * width * 4), y * (width * 4 + 1) + 1);
|
|
10388
|
+
}
|
|
10389
|
+
const signature = new Uint8Array([137, 80, 78, 71, 13, 10, 26, 10]);
|
|
10390
|
+
const parts = [
|
|
10391
|
+
signature,
|
|
10392
|
+
chunk("IHDR", header),
|
|
10393
|
+
chunk("IDAT", new Uint8Array(deflateSync(raw))),
|
|
10394
|
+
chunk("IEND", new Uint8Array(0))
|
|
10395
|
+
];
|
|
10396
|
+
const png = new Uint8Array(parts.reduce((total, part) => total + part.length, 0));
|
|
10397
|
+
let at = 0;
|
|
10398
|
+
for (const part of parts) {
|
|
10399
|
+
png.set(part, at);
|
|
10400
|
+
at += part.length;
|
|
10401
|
+
}
|
|
10402
|
+
return png;
|
|
10403
|
+
}
|
|
10404
|
+
|
|
10405
|
+
// ../server/src/services/tray-icon.ts
|
|
10406
|
+
var MAX_LOGO_BYTES = 1024 * 1024;
|
|
10407
|
+
var FETCH_TIMEOUT_MS = 3e3;
|
|
10408
|
+
var CACHE_TTL_MS = 10 * 6e4;
|
|
10409
|
+
var cache2 = /* @__PURE__ */ new Map();
|
|
10410
|
+
function trayIconDir() {
|
|
10411
|
+
return join17(machineRoot(), "tray-icons");
|
|
10412
|
+
}
|
|
10413
|
+
async function resolveTrayIcon(platform = process.platform) {
|
|
10414
|
+
const orgId = getCurrentProject()?.orgId;
|
|
10415
|
+
if (orgId) {
|
|
10416
|
+
const cached = cache2.get(orgId);
|
|
10417
|
+
const logo = cached && Date.now() - cached.at < CACHE_TTL_MS ? cached.path : await resolveOrgLogo(orgId, platform);
|
|
10418
|
+
if (!cached || Date.now() - cached.at >= CACHE_TTL_MS) {
|
|
10419
|
+
cache2.set(orgId, { path: logo, at: Date.now() });
|
|
10420
|
+
}
|
|
10421
|
+
if (logo) return logo;
|
|
10422
|
+
}
|
|
10423
|
+
return renderThemedIcon(platform);
|
|
10424
|
+
}
|
|
10425
|
+
async function renderThemedIcon(platform) {
|
|
10426
|
+
const accent2 = getTrayAccent();
|
|
10427
|
+
if (!accent2) return null;
|
|
10428
|
+
try {
|
|
10429
|
+
const png = renderRuneyaIcon(accent2, 64);
|
|
10430
|
+
if (!png) return null;
|
|
10431
|
+
return writeTrayIcon(`theme-${accent2.replace(/[^a-z0-9]/g, "")}`, png, platform);
|
|
10432
|
+
} catch (err) {
|
|
10433
|
+
console.log(`[tray] ic\xF4ne du th\xE8me non \xE9crite : ${err.message}`);
|
|
10434
|
+
return null;
|
|
10435
|
+
}
|
|
10436
|
+
}
|
|
10437
|
+
async function writeTrayIcon(stem, png, platform) {
|
|
10438
|
+
const dir = trayIconDir();
|
|
10439
|
+
await mkdir13(dir, { recursive: true });
|
|
10440
|
+
const path = join17(dir, stem);
|
|
10441
|
+
if (platform === "win32") {
|
|
10442
|
+
const ico = pngToIco(png);
|
|
10443
|
+
return ico ? writeAtomic(`${path}.ico`, ico) : null;
|
|
10444
|
+
}
|
|
10445
|
+
return writeAtomic(`${path}.png`, png);
|
|
10446
|
+
}
|
|
10447
|
+
async function writeAtomic(path, bytes) {
|
|
10448
|
+
const tmp = `${path}.${process.pid}.tmp`;
|
|
10449
|
+
await writeFile10(tmp, bytes);
|
|
10450
|
+
await rename8(tmp, path);
|
|
10451
|
+
return path;
|
|
10452
|
+
}
|
|
10453
|
+
async function resolveOrgLogo(orgId, platform) {
|
|
10454
|
+
try {
|
|
10455
|
+
const bytes = await orgLogoBytes(orgId);
|
|
10456
|
+
if (!bytes) return null;
|
|
10457
|
+
return writeTrayIcon(`org-${orgId.replace(/[^a-zA-Z0-9_-]/g, "")}`, bytes, platform);
|
|
10458
|
+
} catch (err) {
|
|
10459
|
+
console.log(`[tray] logo d'organisation indisponible : ${err.message}`);
|
|
10460
|
+
return null;
|
|
10461
|
+
}
|
|
10462
|
+
}
|
|
10463
|
+
async function orgLogoBytes(orgId) {
|
|
10464
|
+
const stored = await readOrgLogo(orgId);
|
|
10465
|
+
if (stored && isPng(stored.bytes)) return stored.bytes;
|
|
10466
|
+
const url = `${await orgCloudUrl(orgId)}/api/org-logo/${encodeURIComponent(orgId)}?format=png`;
|
|
10467
|
+
const response = await fetch(url, { signal: AbortSignal.timeout(FETCH_TIMEOUT_MS) });
|
|
10468
|
+
if (!response.ok) return null;
|
|
10469
|
+
const bytes = new Uint8Array(await response.arrayBuffer());
|
|
10470
|
+
if (bytes.length === 0 || bytes.length > MAX_LOGO_BYTES) return null;
|
|
10471
|
+
return isPng(bytes) ? bytes : null;
|
|
10472
|
+
}
|
|
10473
|
+
|
|
10029
10474
|
// ../server/src/index.ts
|
|
10030
10475
|
dotenv.config({ quiet: true });
|
|
10031
10476
|
if (process.env["RUNEYA_DATA_DIR"]) {
|
|
@@ -10103,7 +10548,20 @@ if (import.meta.url === `file://${process.argv[1]}`) {
|
|
|
10103
10548
|
export {
|
|
10104
10549
|
PullEnvError,
|
|
10105
10550
|
createLocalServer,
|
|
10551
|
+
killInstance,
|
|
10552
|
+
listInstances,
|
|
10553
|
+
listTrayServices,
|
|
10554
|
+
networkInfo,
|
|
10555
|
+
onTrayServicesChanged,
|
|
10106
10556
|
pullEnv,
|
|
10107
|
-
|
|
10557
|
+
registerCli as registerCliLocation,
|
|
10558
|
+
registerInstance,
|
|
10559
|
+
resolveTrayIcon,
|
|
10560
|
+
restartInstance,
|
|
10561
|
+
restartProcess,
|
|
10562
|
+
scheduleSelfRestart,
|
|
10563
|
+
setLanMode,
|
|
10564
|
+
startProcess,
|
|
10565
|
+
stopProcess
|
|
10108
10566
|
};
|
|
10109
|
-
//# sourceMappingURL=src-
|
|
10567
|
+
//# sourceMappingURL=src-TEL7L4K2.js.map
|