@runeya/runeya 2.0.117 → 2.0.119

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