@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.
Files changed (352) hide show
  1. package/agent-manager-4XJUIZKL.js +9 -0
  2. package/assets/icon-alert.ico +0 -0
  3. package/assets/icon-alert.png +0 -0
  4. package/assets/icon-alert.svg +19 -0
  5. package/{chat-OXRRBDB3.js → chat-3XDVULFH.js} +8 -7
  6. package/{chunk-F3HKV5AU.js → chunk-5GYBAMHV.js} +5 -3
  7. package/{chunk-F3HKV5AU.js.map → chunk-5GYBAMHV.js.map} +1 -1
  8. package/{chunk-PSTMO7EE.js → chunk-AAK7ACHG.js} +9 -7
  9. package/{chunk-PSTMO7EE.js.map → chunk-AAK7ACHG.js.map} +1 -1
  10. package/{chunk-BDVQB5RK.js → chunk-IOAGFK3P.js} +28 -20
  11. package/{chunk-BDVQB5RK.js.map → chunk-IOAGFK3P.js.map} +1 -1
  12. package/chunk-LTLOVQJQ.js +291 -0
  13. package/chunk-LTLOVQJQ.js.map +1 -0
  14. package/{chunk-BHLCBARP.js → chunk-NPORVPEO.js} +21 -3
  15. package/chunk-NPORVPEO.js.map +1 -0
  16. package/chunk-PH4E5WDN.js +137 -0
  17. package/chunk-PH4E5WDN.js.map +1 -0
  18. package/{chunk-NDO5VFZY.js → chunk-QRMG6GMX.js} +694 -917
  19. package/chunk-QRMG6GMX.js.map +1 -0
  20. package/{companion-JQGNL4U7.js → companion-MUFVXURV.js} +5 -4
  21. package/{desktop-launcher-FHNURZA7.js → desktop-launcher-N7WRF3LC.js} +11 -17
  22. package/desktop-launcher-N7WRF3LC.js.map +1 -0
  23. package/index.js +68 -2
  24. package/index.js.map +1 -1
  25. package/instances-command-KZ5UGXOR.js +17 -0
  26. package/package.json +4 -1
  27. package/settings-manager-Y4GNAXOH.js +9 -0
  28. package/settings-manager-Y4GNAXOH.js.map +1 -0
  29. package/{src-HZ2XO6TV.js → src-TEL7L4K2.js} +707 -249
  30. package/src-TEL7L4K2.js.map +1 -0
  31. package/tray-NZOXYN5G.js +307 -0
  32. package/tray-NZOXYN5G.js.map +1 -0
  33. package/vault-resolver-JR7TCITD.js +55 -0
  34. package/vault-resolver-JR7TCITD.js.map +1 -0
  35. package/web/assets/AgentScalarChatInterface.vue-CveVquKX.js +13 -0
  36. package/web/assets/AgentTerminalPage-DkNOUzXx.js +1 -0
  37. package/web/assets/AiChatPage-CTF8FIV4.js +1 -0
  38. package/web/assets/{AppLayout-DeWqCLuK.css → AppLayout-CYQBjQBU.css} +1 -1
  39. package/web/assets/AppLayout-agjOv6PY.js +1 -0
  40. package/web/assets/AuditPage-dgYwbpdR.js +1 -0
  41. package/web/assets/CloudAccountPage-Bx9gNcJQ.js +1 -0
  42. package/web/assets/CloudAccountPage-DEnVoeik.js +1 -0
  43. package/web/assets/CloudMessagingPage-qKrKfB-F.js +2 -0
  44. package/web/assets/DashboardPage-Bwq2Nhg2.js +1 -0
  45. package/web/assets/DirectoryPickerDialog-D8XDtgZh.js +1 -0
  46. package/web/assets/{EditorIcon-C9XKLhc7.js → EditorIcon-CA5ff6aq.js} +2 -2
  47. package/web/assets/{EnvironmentForm-bS48MK8k.js → EnvironmentForm-CzSZiA51.js} +2 -2
  48. package/web/assets/EnvironmentFormPage-CuSgaY1_.js +1 -0
  49. package/web/assets/EnvironmentListPage-Dsw3CJvc.js +1 -0
  50. package/web/assets/KanbanBoardPage-CUVcQ4YW.js +4 -0
  51. package/web/assets/KanbanListPage-CGhlz8Pe.js +1 -0
  52. package/web/assets/LaunchProjectPage-BveJC98q.js +1 -0
  53. package/web/assets/LaunchServicesPage-B0W02JDF.js +1 -0
  54. package/web/assets/LogViewer-Rr_WYaUa.js +3 -0
  55. package/web/assets/OrgKeyPrompt-CG2-L3Lf.js +1 -0
  56. package/web/assets/ProcessControls-DvSw2AQV.js +1 -0
  57. package/web/assets/ProcessDetailPage-Decf7LjW.js +1 -0
  58. package/web/assets/{ProcessMetrics-CBPR5ozp.js → ProcessMetrics-xWpkhjoe.js} +2 -2
  59. package/web/assets/ProjectDetailPage-xg7x2vFI.js +1 -0
  60. package/web/assets/ProjectListPage-Bv2fwGla.js +1 -0
  61. package/web/assets/RandomJobTestPage-BEn1gSo3.js +2 -0
  62. package/web/assets/ScenarioEditorPage-CLiTQe4B.js +14 -0
  63. package/web/assets/SendToChatDialog-DdvfNdWg.js +1 -0
  64. package/web/assets/ServiceControlsBar-DKc2e9Ns.js +1 -0
  65. package/web/assets/ServiceDetailPage-BfkVlUEh.js +2 -0
  66. package/web/assets/ServiceFormPage-BTJBk_wB.js +1 -0
  67. package/web/assets/SettingsPage-BlOHIALT.js +2063 -0
  68. package/web/assets/SettingsPage-Dw6tbcbw.css +1 -0
  69. package/web/assets/UnlockPage-u3Zqu1aU.js +1 -0
  70. package/web/assets/VariablesTable-MFZSG4LV.js +1 -0
  71. package/web/assets/VaultMigrationPage-CTMCgOtW.js +1 -0
  72. package/web/assets/VersionBadge-D5zxX_zs.js +1 -0
  73. package/web/assets/WikiPage-BkQZP60x.js +1 -0
  74. package/web/assets/WikiView-CFX5gG2s.js +1 -0
  75. package/web/assets/add-scalar-classes-ClMP-KRl.js +387 -0
  76. package/web/assets/{autocomplete-CtIxw1IN.js → autocomplete-CBY4HTQR.js} +3 -3
  77. package/web/assets/{basic-shape-diamond.svg-BErisM9Y.js → basic-shape-diamond.svg-irIu-f9l.js} +1 -1
  78. package/web/assets/{basic-shape-hexagon.svg-yC7RoYpa.js → basic-shape-hexagon.svg-DasEKbDT.js} +1 -1
  79. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DRmanUIO.js → basic-shape-primary-circle-ellipse-round.svg-DFanDXAm.js} +1 -1
  80. package/web/assets/{basic-shape-primary-square-rectangle.svg-DxuoouSj.js → basic-shape-primary-square-rectangle.svg-Dkyo9dlJ.js} +1 -1
  81. package/web/assets/{basic-shape-shield.svg-Cy_Frn-W.js → basic-shape-shield.svg-3imE69mJ.js} +1 -1
  82. package/web/assets/{browser-h0mxWbci.js → browser-Aa5s7rfo.js} +1 -1
  83. package/web/assets/{browser-Dj3qxJqB.js → browser-DUQZPder.js} +1 -1
  84. package/web/assets/card-D-ziPwAg.js +32 -0
  85. package/web/assets/{checkbox-CTw-YDe_.js → checkbox-tdxfIWhT.js} +3 -3
  86. package/web/assets/{chip-DwSSTlaC.js → chip-DQ2M3lMV.js} +2 -2
  87. package/web/assets/{client-DYNnTrNm.js → client-w--F512m.js} +2 -2
  88. package/web/assets/cloud-chat.store-DwSl7oKq.js +1 -0
  89. package/web/assets/cloud-session-Do-zjE8q.js +1 -0
  90. package/web/assets/column-Bv9vDejf.js +907 -0
  91. package/web/assets/{computer-device-desktop-monitor.svg-TLZAKrIM.js → computer-device-desktop-monitor.svg-CYOP3WaB.js} +1 -1
  92. package/web/assets/{computer-device-desktop.svg-YRcL_Qxn.js → computer-device-desktop.svg-qlrBIvQY.js} +1 -1
  93. package/web/assets/{computer-device-laptop.svg-CZUEbqra.js → computer-device-laptop.svg-IHPj_lEm.js} +1 -1
  94. 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
  95. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CXjVvTBT.js → computer-device-mobile-phone-android-samsung.svg-s5qvH0rw.js} +1 -1
  96. 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
  97. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-CG8VbAP-.js → computer-device-mobile-phone-iphone-x.svg-Cnz0nuie.js} +1 -1
  98. package/web/assets/{computer-device-mobile-tablet-touch.svg-DDMUt0S4.js → computer-device-mobile-tablet-touch.svg-CGw0OJdZ.js} +1 -1
  99. package/web/assets/{computer-device-mobile-tablet.svg-CBXtF47n.js → computer-device-mobile-tablet.svg-BllNUwYz.js} +1 -1
  100. package/web/assets/{computer-device-network-ethernet-cat6.svg-ObjUhwds.js → computer-device-network-ethernet-cat6.svg-CDcu8JSm.js} +1 -1
  101. package/web/assets/{computer-device-network-lan-www.svg-NGYEGuba.js → computer-device-network-lan-www.svg-Cr2Mzrgm.js} +1 -1
  102. package/web/assets/{computer-device-network-wifi-connection.svg-CSnNdKGm.js → computer-device-network-wifi-connection.svg-BdIGk-iA.js} +1 -1
  103. package/web/assets/{computer-device-network-wifi-router.svg-CG7iHt_n.js → computer-device-network-wifi-router.svg-ChrqaXoE.js} +1 -1
  104. package/web/assets/{cssMode-Bclh_xI1.js → cssMode-DQ3QWGDZ.js} +1 -1
  105. package/web/assets/{divider-Bb31-CFf.js → divider-BnVkpmcn.js} +2 -2
  106. package/web/assets/{docx-preview-seOy1U3d.js → docx-preview-DOVrOL2W.js} +1 -1
  107. package/web/assets/{ecology-science-erlenmeyer-flask.svg-B8emvJ_p.js → ecology-science-erlenmeyer-flask.svg-Bz0bzqPi.js} +1 -1
  108. package/web/assets/{fieldset-Czp1Leik.js → fieldset-CaBT4en1.js} +2 -2
  109. package/web/assets/{freemarker2-D87vjb6-.js → freemarker2-e7ZK44f9.js} +1 -1
  110. package/web/assets/{handlebars-CjY4u0vA.js → handlebars-BunSmNEk.js} +1 -1
  111. package/web/assets/{html-C5pOjLe-.js → html-t6Ga4VcA.js} +1 -1
  112. package/web/assets/{htmlMode-CunB4Bjm.js → htmlMode-CjsAz81L.js} +1 -1
  113. package/web/assets/{image-flash-lightning.svg-7dRFt_k5.js → image-flash-lightning.svg-CSanVzgy.js} +1 -1
  114. package/web/assets/{image-picture-flower.svg-ATG6mf9B.js → image-picture-flower.svg-DUlCxHzi.js} +1 -1
  115. package/web/assets/{index-BMuqGGPP.js → index-CNqv4qMO.js} +287 -287
  116. package/web/assets/{interface-alert-exclamation-diamond.svg-DuAtIVtT.js → interface-alert-exclamation-diamond.svg-C-uhPFKN.js} +1 -1
  117. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-Bg9-FBLP.js → interface-alert-exclamation-triangle-warning.svg-BnSCXw68.js} +1 -1
  118. package/web/assets/{interface-alert-information-circle.svg-C5etvhA3.js → interface-alert-information-circle.svg-CTGCb0Yf.js} +1 -1
  119. package/web/assets/{interface-award-crown.svg-zuAFLs7y.js → interface-award-crown.svg-T-Lov9NP.js} +1 -1
  120. package/web/assets/{interface-bookmark.svg-CfBz0NE3.js → interface-bookmark-tag.svg-DLjS0Lnz.js} +1 -1
  121. package/web/assets/{interface-bookmark-tag.svg-C3EKMHOq.js → interface-bookmark.svg-CZekkdj9.js} +1 -1
  122. package/web/assets/{interface-calendar-date-one.svg-DGYz2Prk.js → interface-calendar-date-one.svg-DmD4yfdS.js} +1 -1
  123. package/web/assets/{interface-content-book-open-pages.svg-DGiJpxy1.js → interface-content-book-open-pages.svg-wHqGX15c.js} +1 -1
  124. package/web/assets/{interface-content-book-page.svg-DydK46P0.js → interface-content-book-page.svg-MCSanA32.js} +1 -1
  125. package/web/assets/{interface-content-file.svg-D0pUOvAN.js → interface-content-file.svg-DBpf8dcs.js} +1 -1
  126. package/web/assets/{interface-content-folder.svg-DiJ3Pfaa.js → interface-content-folder.svg-DZSoYO0L.js} +1 -1
  127. package/web/assets/interface-content-folder.svg-ZujlG0Az.js +1 -0
  128. package/web/assets/{interface-copy-clipboard.svg-Dl3aROYy.js → interface-copy-clipboard.svg-C1-sJNwr.js} +1 -1
  129. package/web/assets/{interface-edit-attachment.svg-UmDFMIt5.js → interface-edit-attachment.svg-CpxThva3.js} +1 -1
  130. package/web/assets/{interface-edit-binocular.svg-Bp_8Pfer.js → interface-edit-binocular.svg-BHfWW26z.js} +1 -1
  131. package/web/assets/{interface-edit-magic-wand.svg-B2A8V7mt.js → interface-edit-magic-wand.svg-DcC6CJBy.js} +1 -1
  132. package/web/assets/{interface-edit-tool-paint-roller.svg-DKjdsVsS.js → interface-edit-tool-paint-roller.svg-BhReRG-a.js} +1 -1
  133. package/web/assets/{interface-edit-tool-pencil.svg-DuUybI4h.js → interface-edit-tool-pencil.svg-CztZ4Olx.js} +1 -1
  134. package/web/assets/{interface-favorite-award.svg-DHeTFQv8.js → interface-favorite-award.svg-C0kleqGy.js} +1 -1
  135. package/web/assets/{interface-favorite-flag.svg-kKzUSQkq.js → interface-favorite-flag.svg-B-VJ_w7p.js} +1 -1
  136. package/web/assets/{interface-favorite-heart.svg-CqMgA2mm.js → interface-favorite-heart.svg-CuRtXB-S.js} +1 -1
  137. package/web/assets/{interface-favorite-star.svg-CuLj8HV6.js → interface-favorite-star.svg-DtEkT0h3.js} +1 -1
  138. package/web/assets/{interface-favorite-stars-sparkles.svg-lFQTnGOR.js → interface-favorite-stars-sparkles.svg-ffOT-I95.js} +1 -1
  139. package/web/assets/{interface-hierarchy-flowchart.svg-CBbliSZq.js → interface-hierarchy-flowchart.svg-C5eB0vng.js} +1 -1
  140. package/web/assets/{interface-home-house.svg-BoFlxzre.js → interface-home-house.svg-Djr3DBJk.js} +1 -1
  141. package/web/assets/{interface-hyperlink.svg-DcKs1Vcm.js → interface-hyperlink.svg-BaesgCsY.js} +1 -1
  142. package/web/assets/{interface-lighting-brightness.svg-BSNKEyEg.js → interface-lighting-brightness.svg-CiNPNypw.js} +1 -1
  143. package/web/assets/{interface-lock-closed.svg-DSP-B9Ze.js → interface-lock-closed.svg-Dk3IIjH4.js} +1 -1
  144. package/web/assets/{interface-lock-open-unlock.svg-Bzg-oBHY.js → interface-lock-open-unlock.svg-DGG8lod0.js} +1 -1
  145. package/web/assets/{interface-login-key.svg-DG61Q1lR.js → interface-login-key.svg-ZREdsGBv.js} +1 -1
  146. package/web/assets/{interface-search.svg-CODjdPxd.js → interface-search.svg-AF3hFV8X.js} +1 -1
  147. package/web/assets/{interface-setting-cog.svg-CgiaBO1E.js → interface-setting-cog.svg-CxjXHOho.js} +1 -1
  148. package/web/assets/{interface-share-megaphone-bullhorn.svg-DM0PsgtH.js → interface-share-megaphone-bullhorn.svg-C-Ou9l0X.js} +1 -1
  149. package/web/assets/{interface-share-rocket.svg-B0geTs35.js → interface-share-rocket.svg-CERB2Bts.js} +1 -1
  150. package/web/assets/{interface-share-satellite.svg-v9Q6QwAp.js → interface-share-satellite.svg-BfHWK0sr.js} +1 -1
  151. package/web/assets/{interface-share-space-ship.svg-CLdqgzgZ.js → interface-share-space-ship.svg-lWM8H0aF.js} +1 -1
  152. package/web/assets/{interface-share.svg-Cx3VhLuj.js → interface-share.svg-CFf-5WEt.js} +1 -1
  153. package/web/assets/{interface-signal-square.svg-By_pQLw8.js → interface-signal-square.svg-BIiI1WkB.js} +1 -1
  154. package/web/assets/{interface-time-clock-circle.svg-Co3P-TM3.js → interface-time-clock-circle.svg-MloMulBj.js} +1 -1
  155. package/web/assets/{interface-time-hour-glass.svg-BYSOzVeD.js → interface-time-hour-glass.svg-BOxCCGI2.js} +1 -1
  156. package/web/assets/{interface-users-multiple.svg-moFZaev3.js → interface-users-multiple.svg-4T9srtFC.js} +1 -1
  157. package/web/assets/{interface-weather-moon.svg-DhyTNivv.js → interface-weather-moon.svg-CKHzp1q9.js} +1 -1
  158. package/web/assets/{javascript-B1fZNcy6.js → javascript-D9xsJ3Az.js} +1 -1
  159. package/web/assets/{jsonMode-BxZ6OjkS.js → jsonMode-DuBcXIAs.js} +2 -2
  160. package/web/assets/{liquid-B58z0z3s.js → liquid-DEC7GfIV.js} +1 -1
  161. package/web/assets/{lspLanguageFeatures-VksJLqpV.js → lspLanguageFeatures-BWtjzx_b.js} +3 -3
  162. package/web/assets/{mail-chat-bubble-square.svg-DU4TDENX.js → mail-chat-bubble-square.svg-Bnr_lHI8.js} +1 -1
  163. package/web/assets/{mail-send-email-paper-airplane.svg-jk90Puk3.js → mail-send-email-paper-airplane.svg-BX3SaAOF.js} +1 -1
  164. package/web/assets/{mail-send-envelope.svg-CrEPc3pm.js → mail-send-envelope.svg-ZUoORksb.js} +1 -1
  165. package/web/assets/{mdx-l-DSKi30.js → mdx-HOoxTDWS.js} +1 -1
  166. package/web/assets/{minus-CjETE6Jb.js → minus-BBEVgxJH.js} +2 -2
  167. package/web/assets/modal-DM9X_PVj.js +5 -0
  168. package/web/assets/modal-lOChu0a6.js +1 -0
  169. package/web/assets/{money-cashier-receipt.svg-veUsiwvj.js → money-cashier-receipt.svg-DZ3PFTDB.js} +1 -1
  170. package/web/assets/{money-currency-dollar-pay.svg-C5PNkn4j.js → money-currency-dollar-pay.svg-MP_zZSsR.js} +1 -1
  171. package/web/assets/{money-graph-arrow-increase.svg-BkCcnTWU.js → money-graph-arrow-increase.svg-zF1qoCJ1.js} +1 -1
  172. package/web/assets/{money-graph-bar-chart-increase.svg-BDiFSuKt.js → money-graph-bar-chart-increase.svg-BDD2RhNd.js} +1 -1
  173. package/web/assets/multiselect-BGmyQeLC.js +251 -0
  174. package/web/assets/{nature-ecology-leaf.svg-CHyv9oDB.js → nature-ecology-leaf.svg-C8ROcT5o.js} +1 -1
  175. package/web/assets/{password-BYosjMhB.js → password-4B0Jk2Id.js} +4 -4
  176. package/web/assets/{phone-telephone.svg-Ce1dgyK9.js → phone-telephone.svg-DKK-lUXQ.js} +1 -1
  177. package/web/assets/{plus-CVoE_j-e.js → plus-CTzNAMSa.js} +6 -6
  178. package/web/assets/process.store-hTCiNh-E.js +1 -0
  179. package/web/assets/{programming-bug.svg-D87My2Ok.js → programming-bug.svg-D2E8tMFA.js} +1 -1
  180. package/web/assets/{programming-cloud.svg-jUe8apKw.js → programming-cloud.svg-BGnh40iK.js} +1 -1
  181. package/web/assets/{programming-computer-database-server.svg-D4etrIBX.js → programming-computer-database-server.svg-BVAuZnpu.js} +1 -1
  182. package/web/assets/{programming-computer-database.svg-BtfkmLTx.js → programming-computer-database.svg-Cw61nQGg.js} +1 -1
  183. package/web/assets/{programming-module-four-layout.svg-BkzsDKDq.js → programming-module-four-layout.svg-DoU0KSeo.js} +1 -1
  184. package/web/assets/{programming-module-three.svg-CpzTvjGS.js → programming-module-three.svg-DVhh6Qdu.js} +1 -1
  185. package/web/assets/{programming-module.svg-wyvB3tSR.js → programming-module.svg-DvJfoHtJ.js} +1 -1
  186. package/web/assets/{programming-script-code.svg-Dek4khNq.js → programming-script-code.svg-C-tp6SrH.js} +1 -1
  187. package/web/assets/{python-IeHrvMxp.js → python--BJI87h8.js} +1 -1
  188. package/web/assets/{razor-CMgDmoNn.js → razor-CyKegkVq.js} +1 -1
  189. package/web/assets/router-CjeDvoXv.js +1 -0
  190. package/web/assets/settings-scope-78RP25Qh.js +1 -0
  191. package/web/assets/settings.store-D0Rg-dsM.js +1 -0
  192. package/web/assets/{shopping-cart.svg-DeBhxyDX.js → shopping-cart.svg-LfGHmiMy.js} +1 -1
  193. package/web/assets/{shopping-gift-present.svg-Bt0oKBk9.js → shopping-gift-present.svg-DQxn6jVj.js} +1 -1
  194. package/web/assets/{shopping-shipping-box-parcel-package.svg-BEQNmjMi.js → shopping-shipping-box-parcel-package.svg-0_aBSgUi.js} +1 -1
  195. package/web/assets/src-BVvRi5bZ.js +1 -0
  196. package/web/assets/src-COTZAWP1.js +572 -0
  197. package/web/assets/{src-C3dPv05m.js → src-DmAdua1A.js} +13 -13
  198. package/web/assets/tabpanel-DHCbTagN.js +150 -0
  199. package/web/assets/{tag-new-circle.svg-B1i0Y1yt.js → tag-new-circle.svg-83yDHm_4.js} +1 -1
  200. package/web/assets/theme-CDWRcPhl.js +1 -0
  201. package/web/assets/{toggleswitch-CcQEgLiT.js → toggleswitch-98WbJy1b.js} +2 -2
  202. package/web/assets/{travel-map-earth-globe.svg-CB5sqhKh.js → travel-map-earth-globe.svg-Ih5Yi-jq.js} +1 -1
  203. package/web/assets/trpc-BOcC0r-H.js +1 -0
  204. package/web/assets/{tsMode-DoUs-yH0.js → tsMode-ocCX3Kwn.js} +6 -6
  205. package/web/assets/{typescript-fw9OMJ0N.js → typescript-BNLFcH9T.js} +1 -1
  206. package/web/assets/useAiChatDrawer-DVacYOFX.js +1 -0
  207. package/web/assets/{useCloudOrg-CRpEZ-iE.js → useCloudOrg-D_o0-v2z.js} +1 -1
  208. package/web/assets/useProjectCatalog-CSqoTWGy.js +1 -0
  209. package/web/assets/useProjectCloudOrg-iblWkaw9.js +1 -0
  210. package/web/assets/{xml-Df6_yGan.js → xml-DcSXqrs-.js} +1 -1
  211. package/web/assets/{yaml-LMvM57fn.js → yaml-BNINCoLr.js} +1 -1
  212. package/web/index.html +1 -1
  213. package/agent-manager-SNVPZNLC.js +0 -8
  214. package/chunk-BHLCBARP.js.map +0 -1
  215. package/chunk-NDO5VFZY.js.map +0 -1
  216. package/desktop-launcher-FHNURZA7.js.map +0 -1
  217. package/settings-manager-YHQ5YHUH.js +0 -8
  218. package/src-HZ2XO6TV.js.map +0 -1
  219. package/web/assets/AgentScalarChatInterface.vue-CxmPaQaj.js +0 -13
  220. package/web/assets/AgentTerminalPage-Bbx4zyQY.js +0 -1
  221. package/web/assets/AiChatPage-GPPQggxZ.js +0 -1
  222. package/web/assets/AppLayout-BuwGeA1p.js +0 -1
  223. package/web/assets/AuditPage-CDsJsoKA.js +0 -1
  224. package/web/assets/CloudAccountPage-BCP8icYZ.js +0 -1
  225. package/web/assets/CloudAccountPage-DzpS3_gc.js +0 -1
  226. package/web/assets/CloudMessagingPage-01hLQzZ5.js +0 -2
  227. package/web/assets/DashboardPage-CKo-sf8A.js +0 -1
  228. package/web/assets/DirectoryPickerDialog-B1tSWoOM.js +0 -1
  229. package/web/assets/EnvironmentFormPage-9yxN-uI3.js +0 -1
  230. package/web/assets/EnvironmentListPage-BbfptXAU.js +0 -1
  231. package/web/assets/KanbanBoardPage-BWkqTc1a.js +0 -4
  232. package/web/assets/KanbanListPage-GxI1nlON.js +0 -1
  233. package/web/assets/LaunchProjectPage-DKMoGXIC.js +0 -1
  234. package/web/assets/LaunchServicesPage-6dfxPQMB.js +0 -1
  235. package/web/assets/LogViewer-DAzGy_T2.js +0 -3
  236. package/web/assets/OrgKeyPrompt-CQ087D4g.js +0 -1
  237. package/web/assets/ProcessControls-D8uc4x7M.js +0 -1
  238. package/web/assets/ProcessDetailPage-BPxLPGeh.js +0 -1
  239. package/web/assets/ProjectDetailPage-CnZ_CpVU.js +0 -1
  240. package/web/assets/ProjectListPage-D8Svc5e3.js +0 -1
  241. package/web/assets/RandomJobTestPage-BdEiEnSi.js +0 -2
  242. package/web/assets/ScenarioEditorPage-COrL715B.js +0 -14
  243. package/web/assets/SendToChatDialog-D8YB5RM6.js +0 -1
  244. package/web/assets/ServiceControlsBar-BKwvqgHw.js +0 -1
  245. package/web/assets/ServiceDetailPage-BmPRfQN6.js +0 -2
  246. package/web/assets/ServiceFormPage-rVvnwWkb.js +0 -1
  247. package/web/assets/SettingsPage-C-OfBHjn.css +0 -1
  248. package/web/assets/SettingsPage-DmQB6t1_.js +0 -2063
  249. package/web/assets/UnlockPage-BgVF3XMO.js +0 -1
  250. package/web/assets/VariablesTable-D4_sssPN.js +0 -1
  251. package/web/assets/VaultMigrationPage-BRZJnfVg.js +0 -1
  252. package/web/assets/VersionBadge-Df7iJWvF.js +0 -1
  253. package/web/assets/WikiPage-UkaH8BqR.js +0 -1
  254. package/web/assets/WikiView-BQqP4b9A.js +0 -1
  255. package/web/assets/add-scalar-classes-B9WxxjAm.js +0 -387
  256. package/web/assets/card-nJdNoKgd.js +0 -32
  257. package/web/assets/cloud-chat.store-_qILavCL.js +0 -1
  258. package/web/assets/cloud-session-Ml5g5J1-.js +0 -1
  259. package/web/assets/column-Bc4-F_tF.js +0 -907
  260. package/web/assets/interface-content-folder.svg-bb6GV0G0.js +0 -1
  261. package/web/assets/modal-D2-cZ2mf.js +0 -5
  262. package/web/assets/modal-DmgVDXcS.js +0 -1
  263. package/web/assets/multiselect-CDBfo7-0.js +0 -251
  264. package/web/assets/process.store-BsCJ-VuI.js +0 -1
  265. package/web/assets/router-KIdzwvCZ.js +0 -1
  266. package/web/assets/settings-scope-D8l1sq9K.js +0 -1
  267. package/web/assets/settings.store-VVqF8QkO.js +0 -1
  268. package/web/assets/src-CJFQ3yWc.js +0 -1
  269. package/web/assets/src-Cgn_TWXn.js +0 -572
  270. package/web/assets/tabpanel-B8oBjoSG.js +0 -150
  271. package/web/assets/trpc-B1bTQz_t.js +0 -1
  272. package/web/assets/useAiChatDrawer-BpR9XWop.js +0 -1
  273. package/web/assets/useProjectCatalog-mk8A95KQ.js +0 -1
  274. package/web/assets/useProjectCloudOrg-CKgvcUWI.js +0 -1
  275. /package/{agent-manager-SNVPZNLC.js.map → agent-manager-4XJUIZKL.js.map} +0 -0
  276. /package/{chat-OXRRBDB3.js.map → chat-3XDVULFH.js.map} +0 -0
  277. /package/{companion-JQGNL4U7.js.map → companion-MUFVXURV.js.map} +0 -0
  278. /package/{settings-manager-YHQ5YHUH.js.map → instances-command-KZ5UGXOR.js.map} +0 -0
  279. /package/web/assets/{abap-BvxTqXT2.js → abap-PT-N0eyj.js} +0 -0
  280. /package/web/assets/{apex-CIPCCkBr.js → apex-BYovhaVz.js} +0 -0
  281. /package/web/assets/{azcli-Rs0NIwkA.js → azcli-DOxZ9r2f.js} +0 -0
  282. /package/web/assets/{bat-BxAhM6gR.js → bat-B29juGG4.js} +0 -0
  283. /package/web/assets/{bicep-oV_ehPcG.js → bicep-7-ApPSlE.js} +0 -0
  284. /package/web/assets/{browser-DNbnH79q.js → browser-N7UrAcvB.js} +0 -0
  285. /package/web/assets/{cameligo-CJLaUyQs.js → cameligo-BipBUQCp.js} +0 -0
  286. /package/web/assets/{clojure-CjvMureh.js → clojure-DBgUdyK0.js} +0 -0
  287. /package/web/assets/{coffee-motWC5XQ.js → coffee-DIU_x8Zp.js} +0 -0
  288. /package/web/assets/{cpp-DiWIfYNM.js → cpp-CAPjLTys.js} +0 -0
  289. /package/web/assets/{csharp-GBlGBeai.js → csharp-kFCIHjec.js} +0 -0
  290. /package/web/assets/{csp-tSyK5eO1.js → csp-BFKsjgRE.js} +0 -0
  291. /package/web/assets/{css-BkFK9HG_.js → css-C3uiAvXV.js} +0 -0
  292. /package/web/assets/{cypher-Bcp8PXr2.js → cypher-BC8El989.js} +0 -0
  293. /package/web/assets/{dart-uz9Rxe0M.js → dart-BAClpSRO.js} +0 -0
  294. /package/web/assets/{dockerfile-iJizx3Zp.js → dockerfile-DVZSJ3rq.js} +0 -0
  295. /package/web/assets/{ecl-BalaS36Z.js → ecl-Dis7T_5W.js} +0 -0
  296. /package/web/assets/{elixir-D6CLrLGy.js → elixir-B0xfsmfq.js} +0 -0
  297. /package/web/assets/{flow9-CFt3-vVY.js → flow9-DbTJxEBz.js} +0 -0
  298. /package/web/assets/{fsharp-DGa7raxa.js → fsharp-DTOqftZo.js} +0 -0
  299. /package/web/assets/{go-wlqInk4z.js → go-KWOR5hag.js} +0 -0
  300. /package/web/assets/{graphql-CP1guigM.js → graphql-DjYFSl6G.js} +0 -0
  301. /package/web/assets/{hcl-CK0UkKD0.js → hcl-D8RrENjV.js} +0 -0
  302. /package/web/assets/{ini-Ch56nrUj.js → ini-BOtkgeoY.js} +0 -0
  303. /package/web/assets/{java-C9_WIayl.js → java-DKd4_eEX.js} +0 -0
  304. /package/web/assets/{julia-Can2_mhR.js → julia-XpEGblEj.js} +0 -0
  305. /package/web/assets/{kotlin-DUvGf_BX.js → kotlin-BZv3QweN.js} +0 -0
  306. /package/web/assets/{less-DoTbG-rc.js → less-H5kV6pUj.js} +0 -0
  307. /package/web/assets/{lexon-BFMO2_kL.js → lexon-Bg4gEB0s.js} +0 -0
  308. /package/web/assets/{lua-CC-QtBo7.js → lua-D7eb4Dnq.js} +0 -0
  309. /package/web/assets/{m3-C51MyH5Q.js → m3-BjDYXZ0c.js} +0 -0
  310. /package/web/assets/{markdown-CDwLHhgZ.js → markdown-Cl5YxO_y.js} +0 -0
  311. /package/web/assets/{mips-YuxZtPGU.js → mips-sklxJ87A.js} +0 -0
  312. /package/web/assets/{msdax-CJjWhmte.js → msdax-C0nZ2Nk3.js} +0 -0
  313. /package/web/assets/{mysql-B1riwLaD.js → mysql-D6eZPdeQ.js} +0 -0
  314. /package/web/assets/{objective-c-drXT-gmc.js → objective-c-W10E2fSz.js} +0 -0
  315. /package/web/assets/{pascal-KUYgrN-Z.js → pascal-Cd0rtL9J.js} +0 -0
  316. /package/web/assets/{pascaligo-DQmQJP-r.js → pascaligo-BbE09f5f.js} +0 -0
  317. /package/web/assets/{perl-09XLBmCS.js → perl-bnuvlUCT.js} +0 -0
  318. /package/web/assets/{pgsql-BFj9IFFu.js → pgsql-BETeeS25.js} +0 -0
  319. /package/web/assets/{php-UnC5BqwY.js → php-zaSPUC-m.js} +0 -0
  320. /package/web/assets/{pla-BFuYrPHG.js → pla-ChOKgzpJ.js} +0 -0
  321. /package/web/assets/{postiats-n4ft3jnO.js → postiats-By_SllB5.js} +0 -0
  322. /package/web/assets/{powerquery-D-s-oFSc.js → powerquery-CB5gIeJ1.js} +0 -0
  323. /package/web/assets/{powershell-CTboTf93.js → powershell-CgdaEQwq.js} +0 -0
  324. /package/web/assets/{protobuf-Dt62GuJP.js → protobuf-P7fNUpCt.js} +0 -0
  325. /package/web/assets/{pug-CEFWkUzw.js → pug-DZaxV_Nc.js} +0 -0
  326. /package/web/assets/{qsharp-B0DUmgPZ.js → qsharp-BdkO9QAN.js} +0 -0
  327. /package/web/assets/{r-BVnF0c4T.js → r-C-pPWc3R.js} +0 -0
  328. /package/web/assets/{redis-DLl3KQXi.js → redis-BT1HxrEq.js} +0 -0
  329. /package/web/assets/{redshift-cif1I7h1.js → redshift-CDnJNPnz.js} +0 -0
  330. /package/web/assets/{restructuredtext-PNfql36m.js → restructuredtext-Bt8v-MuE.js} +0 -0
  331. /package/web/assets/{ruby-j3jxDjUN.js → ruby-BLxqHkKg.js} +0 -0
  332. /package/web/assets/{rust-BaIO-mAt.js → rust-CIh7vugr.js} +0 -0
  333. /package/web/assets/{sb-D8XNVNUQ.js → sb-eE41pfwD.js} +0 -0
  334. /package/web/assets/{scala-DiK9Ps90.js → scala-COBuWHwn.js} +0 -0
  335. /package/web/assets/{scheme-DPKqXHmF.js → scheme-BsGc_ajc.js} +0 -0
  336. /package/web/assets/{scss-DpMwfP2H.js → scss-DLmucKJk.js} +0 -0
  337. /package/web/assets/{shared-sse-CTMtESqe.js → shared-sse---by8uTc.js} +0 -0
  338. /package/web/assets/{shell-Dw9mKVg2.js → shell-8IUXMVcg.js} +0 -0
  339. /package/web/assets/{solidity-DTxo-7fe.js → solidity-DUTott7T.js} +0 -0
  340. /package/web/assets/{sophia-BjA3Q87y.js → sophia-GqIrTWz8.js} +0 -0
  341. /package/web/assets/{sparql-q1EpMUqb.js → sparql-BfkJA0CL.js} +0 -0
  342. /package/web/assets/{sql-CjcQ4wIr.js → sql-BF_o1CCN.js} +0 -0
  343. /package/web/assets/{st-AuOpxVl7.js → st-B6_wiXyW.js} +0 -0
  344. /package/web/assets/{swift-BUWnv6f7.js → swift-BHDD2Ajh.js} +0 -0
  345. /package/web/assets/{systemverilog-FhXn-3OZ.js → systemverilog-BG_Ebh2a.js} +0 -0
  346. /package/web/assets/{tcl-B0lqcTtS.js → tcl-ocTQVTM_.js} +0 -0
  347. /package/web/assets/{twig-B0OeGPVa.js → twig-CF5whnDX.js} +0 -0
  348. /package/web/assets/{typespec-Bmh6VX11.js → typespec-5BWfbhTE.js} +0 -0
  349. /package/web/assets/{uuid-Q0SWZmaT.js → uuid-FpfcaBnR.js} +0 -0
  350. /package/web/assets/{vb-bmgX6veu.js → vb-agPNUcOk.js} +0 -0
  351. /package/web/assets/{w3c-keyname-2TLn3EjF.js → w3c-keyname-2_K_z_q5.js} +0 -0
  352. /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-BDVQB5RK.js";
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-PSTMO7EE.js";
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-BHLCBARP.js";
123
+ } from "./chunk-NPORVPEO.js";
122
124
  import {
123
125
  settingsManager
124
- } from "./chunk-F3HKV5AU.js";
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
- writeEntity
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 cli of candidates) {
323
- if (existsSync(cli)) return { command: process.execPath, args: [cli], shell: false };
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(async () => {
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 TRPCError4({ code: "NOT_FOUND", message: `Agent ${input.agentId} not found` });
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
- const service = await serviceStore.get(input.processId);
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
- const result = await agentManager.agentMutation(input.agentId, "process.stop", { id: input.processId }, AGENT_STOP_FETCH_TIMEOUT);
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
- const service = await serviceStore.get(input.processId);
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 TRPCError5 } from "@trpc/server";
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
1809
+ if (!env2) throw new TRPCError6({ code: "NOT_FOUND", message: `Environment ${input.id} not found` });
1762
1810
  if (env2.immutable) {
1763
- throw new TRPCError5({ code: "FORBIDDEN", message: "Cannot delete immutable environment" });
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 TRPCError5({ code: "INTERNAL_SERVER_ERROR", message: "Failed to delete environment" });
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
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 TRPCError5({ code: "INTERNAL_SERVER_ERROR", message: "Failed to update variable" });
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 TRPCError5({ code: "NOT_FOUND", message: `Environment ${input.environmentId} not found` });
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 TRPCError5({ code: "INTERNAL_SERVER_ERROR", message: "Failed to remove variable" });
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 TRPCError6 } from "@trpc/server";
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 TRPCError6({
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 current = await settingsManager.getSettings();
2034
+ const current2 = await settingsManager.getSettings();
1987
2035
  const updated = {
1988
- ...current,
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 TRPCError6({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
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 TRPCError6({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
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 TRPCError6({ code: "FORBIDDEN", message: "Cannot modify built-in parsers" });
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 TRPCError6({ code: "BAD_REQUEST", message: "Parser code cannot be empty" });
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 TRPCError6({ code: "NOT_FOUND", message: `Parser not found: ${id}` });
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 TRPCError6({ code: "FORBIDDEN", message: "Cannot delete built-in parsers" });
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 TRPCError6({ code: "NOT_FOUND", message: `Parser not found: ${input.id}` });
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 current = settings.companion ?? { enabledByDefault: false };
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 ?? current.enabledByDefault ?? false,
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 ? current.prompt ? { prompt: current.prompt } : {} : prompt ? { prompt } : {}
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 TRPCError6({ code: "BAD_REQUEST", message: "Une cl\xE9 API est requise pour ce provider." });
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 TRPCError6({ code: "NOT_FOUND", message: `AI provider not found: ${input.id}` });
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 TRPCError6({ code: "NOT_FOUND", message: `AI provider not found: ${input.id}` });
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 TRPCError6({ code: "NOT_FOUND", message: `AI provider not found: ${input.id}` });
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 TRPCError6({ code: "BAD_REQUEST", message: "Traefik non activ\xE9 sur cet agent" });
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 TRPCError6({ code: "BAD_REQUEST", message: "Traefik non activ\xE9 sur cet agent" });
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 TRPCError6({
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 TRPCError7 } from "@trpc/server";
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 TRPCError7({ code: "NOT_FOUND", message: "Service not found" });
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 TRPCError7({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
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 TRPCError7({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
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 TRPCError7({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
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 TRPCError7) throw err;
2769
- throw new TRPCError7({ code: "BAD_REQUEST", message: `Path does not exist: ${resolvedPath}` });
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 TRPCError7({ code: "BAD_REQUEST", message: `Unknown editor: ${input.editorKey}` });
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 TRPCError7({ code: "BAD_REQUEST", message: "Path traversal not allowed" });
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 TRPCError7({ code: "BAD_REQUEST", message: `File does not exist: ${filePath}` });
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 TRPCError8 } from "@trpc/server";
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 TRPCError8({ code: "NOT_FOUND", message: "API key not found" });
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 TRPCError8({ code: "NOT_FOUND", message: "API key not found" });
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 TRPCError8({ code: "NOT_FOUND", message: "API key not found" });
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 TRPCError8({ code: "NOT_FOUND", message: "API key not found" });
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 TRPCError8({ code: "BAD_REQUEST", message: "Chemin non autoris\xE9" });
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 TRPCError9 } from "@trpc/server";
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 TRPCError9({ code: "NOT_FOUND", message: "Service not found" });
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 TRPCError9({ code: "BAD_REQUEST", message: "No agent configured for this service" });
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 TRPCError9({ code: "BAD_REQUEST", message: "No agent available" });
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 TRPCError9({ code: "BAD_REQUEST", message: "No staged changes to generate a commit message from" });
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 TRPCError9({ code: "BAD_REQUEST", message: "No AI provider configured" });
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 TRPCError9({ code: "BAD_REQUEST", message: "Unsupported AI provider" });
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 TRPCError9({
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 TRPCError12 } from "@trpc/server";
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 TRPCError10 } from "@trpc/server";
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 TRPCError10({ code: "NOT_FOUND", message: notFoundMessage });
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 TRPCError10({ code: "BAD_REQUEST", message: err.message });
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 TRPCError10({ code: "NOT_FOUND", message: notFoundMessage });
3191
+ if (!entity) throw new TRPCError11({ code: "NOT_FOUND", message: notFoundMessage });
3144
3192
  return entity;
3145
3193
  } catch (err) {
3146
- if (err instanceof TRPCError10) throw err;
3147
- throw new TRPCError10({ code: "BAD_REQUEST", message: err.message });
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 TRPCError10({ code: "NOT_FOUND", message: notFoundMessage });
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 TRPCError11 } from "@trpc/server";
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 chunk of stream) {
3248
+ for await (const chunk2 of stream) {
3201
3249
  if (signal?.aborted) return;
3202
- const text = chunk.choices[0]?.delta?.content;
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 TRPCError11({ code: "BAD_REQUEST", message: "Aucun fournisseur IA configur\xE9" });
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 TRPCError11({ code: "BAD_REQUEST", message: `Fournisseur non support\xE9: ${provider.provider}` });
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, current) {
4712
- if (current && (current.groups.length > 0 || current.nodes.length > 0)) {
4759
+ function buildScenarioUserMessage(userPrompt, current2) {
4760
+ if (current2 && (current2.groups.length > 0 || current2.nodes.length > 0)) {
4713
4761
  return `Current scenario:
4714
- ${JSON.stringify(current, null, 2)}
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 TRPCError12({ code: "NOT_FOUND", message: "Scenario not found" });
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 TRPCError12({ code: "NOT_FOUND", message: "No pending input request for this node" });
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 TRPCError12({ code: "NOT_FOUND", message: "Preset not found" });
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 TRPCError13 } from "@trpc/server";
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 current = jobs.get(jobId);
4976
- if (!current || current.done) return;
4977
- current.tick += 1;
4978
- publish(current, {
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: current.tick,
5029
+ index: current2.tick,
4982
5030
  value: Math.random(),
4983
5031
  at: Date.now()
4984
5032
  });
4985
- if (current.tick >= current.maxTicks) {
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 TRPCError13({ code: "NOT_FOUND", message: "Random job not found" });
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 TRPCError14 } from "@trpc/server";
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 = ((chunk, encoding, callback) => {
5107
+ stream.write = ((chunk2, encoding, callback) => {
5060
5108
  try {
5061
- const text = typeof chunk === "string" ? chunk : Buffer.from(chunk).toString("utf8");
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(chunk, encoding, callback);
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 TRPCError14({ code: "NOT_FOUND", message: "No live Runeya instance with this pid." });
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 TRPCError14({ code: "BAD_REQUEST", message: "This instance cannot stop itself." });
5186
+ throw new TRPCError15({ code: "BAD_REQUEST", message: "This instance cannot stop itself." });
5139
5187
  }
5140
- throw new TRPCError14({ code: "INTERNAL_SERVER_ERROR", message: reason });
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 TRPCError14({ code: "NOT_FOUND", message: "No live Runeya instance with this pid." });
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 TRPCError14({
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 TRPCError14({ code: "INTERNAL_SERVER_ERROR", message: reason });
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 TRPCError15 } from "@trpc/server";
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 TRPCError15({
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 TRPCError15({ code: "BAD_REQUEST", message: "The cloud refused the link (unknown card, or a cycle)." });
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 TRPCError15({ code: "BAD_REQUEST", message: "Invalid attachment id" });
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 TRPCError15({ code: "NOT_FOUND", message: `Attachment ${id} not found` });
5811
+ throw new TRPCError16({ code: "NOT_FOUND", message: `Attachment ${id} not found` });
5764
5812
  }
5765
5813
  if (!res.ok) {
5766
- throw new TRPCError15({
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 TRPCError15({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
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 TRPCError15({ code: "PAYLOAD_TOO_LARGE", message: "Attachment too large to download" });
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 TRPCError16 } from "@trpc/server";
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 TRPCError16({
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 TRPCError17 } from "@trpc/server";
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 TRPCError17({ code: "BAD_REQUEST", message: "Sous-chemin invalide" });
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 TRPCError17({ code: "FORBIDDEN", message: "Hors du dossier de donn\xE9es du serveur" });
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 TRPCError17({ code: "FORBIDDEN", message: "Le dossier wiki r\xE9sout hors du dossier de donn\xE9es" });
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 TRPCError17({ code: "NOT_FOUND", message: "Service introuvable" });
6051
+ if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
6004
6052
  const agentId = await resolveEffectiveAgentId(service);
6005
- if (!agentId) throw new TRPCError17({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9 pour ce service" });
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 TRPCError17({ code: "BAD_REQUEST", message: "Chemin invalide" });
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 TRPCError17({ code: "NOT_FOUND", message: "Chemin introuvable" });
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 TRPCError17({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
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 TRPCError17({ code: "FORBIDDEN", message: "Hors du dossier autoris\xE9" });
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 TRPCError17({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
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 TRPCError17({ code: "BAD_REQUEST", message: "Pas un fichier" });
6088
- if (s.size > MAX_FILE_BYTES) throw new TRPCError17({ code: "PAYLOAD_TOO_LARGE", message: "Fichier trop volumineux" });
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 TRPCError17({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
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 TRPCError17({ code: "BAD_REQUEST", message: "Seuls les .md/.markdown sont autoris\xE9s" });
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 TRPCError17({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
6164
+ throw new TRPCError18({ code: "CONFLICT", message: "Fichier d\xE9j\xE0 existant" });
6117
6165
  } catch (err) {
6118
- if (err instanceof TRPCError17) throw err;
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 TRPCError17({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
6190
+ throw new TRPCError18({ code: "CONFLICT", message: "La cible existe d\xE9j\xE0" });
6143
6191
  } catch (err) {
6144
- if (err instanceof TRPCError17) throw err;
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 TRPCError17({ code: "NOT_FOUND", message: "Service introuvable" });
6205
+ if (!service) throw new TRPCError18({ code: "NOT_FOUND", message: "Service introuvable" });
6158
6206
  const agentId = await resolveEffectiveAgentId(service);
6159
- if (!agentId) throw new TRPCError17({ code: "BAD_REQUEST", message: "Aucun agent configur\xE9" });
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 TRPCError17({ code: "FORBIDDEN", message: "Impossible de supprimer la racine" });
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 TRPCError18 } from "@trpc/server";
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 TRPCError18({ code: "FORBIDDEN", message: err.message });
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 TRPCError18({ code: "FORBIDDEN", message: err.message });
7380
+ throw new TRPCError19({ code: "FORBIDDEN", message: err.message });
7333
7381
  }
7334
7382
  if (err instanceof CanaryUnavailableError) {
7335
- throw new TRPCError18({ code: "PRECONDITION_FAILED", message: err.message });
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 TRPCError18({ code: "CONFLICT", message: err.code, cause: err });
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 TRPCError18({ code: "NOT_FOUND", message: "PROJECT_NOT_LOCAL" });
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 TRPCError18({ code: "CONFLICT", message: "PROJECT_ALREADY_IN_ORG" });
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 TRPCError18({ code: "CONFLICT", message: err.code, cause: err });
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 TRPCError18({ code: "BAD_GATEWAY", message: await cloudMessage(res) || `CANARY_READ_FAILED (${res.status})` });
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 TRPCError18({
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 TRPCError18({
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 TRPCError18 && err.code === "PRECONDITION_FAILED") {
7571
- throw new TRPCError18({ code: "PRECONDITION_FAILED", message: "CLOUD_NOT_LINKED" });
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 TRPCError18({ code: "FORBIDDEN", message: code, cause: new Error(detail) });
7627
+ throw new TRPCError19({ code: "FORBIDDEN", message: code, cause: new Error(detail) });
7580
7628
  }
7581
7629
  if (res.status === 404) {
7582
- throw new TRPCError18({ code: "NOT_FOUND", message: "PROJECT_NOT_IN_ORG", cause: new Error(detail) });
7630
+ throw new TRPCError19({ code: "NOT_FOUND", message: "PROJECT_NOT_IN_ORG", cause: new Error(detail) });
7583
7631
  }
7584
- throw new TRPCError18({
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 = (clouds[orgId] ?? getCloudApiUrl()).replace(/\/+$/, "");
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-JQGNL4U7.js");
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
- registerInstance
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-HZ2XO6TV.js.map
10567
+ //# sourceMappingURL=src-TEL7L4K2.js.map