@runeya/runeya 2.0.21 → 2.0.23

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 (321) hide show
  1. package/agent/index.js +103 -9
  2. package/agent/index.js.map +1 -1
  3. package/agent-manager-2P4THUVA.js +7 -0
  4. package/{chunk-PUNE7P6S.js → chunk-Y2R42AXQ.js} +848 -561
  5. package/chunk-Y2R42AXQ.js.map +1 -0
  6. package/index.js +92 -43
  7. package/index.js.map +1 -1
  8. package/package.json +1 -1
  9. package/{src-K32WI425.js → src-3TOPUVAK.js} +1354 -1083
  10. package/src-3TOPUVAK.js.map +1 -0
  11. package/web/assets/AgentScalarChatInterface.vue-Bk_cXx74.js +13 -0
  12. package/web/assets/AgentTerminalPage-DqXrABlh.js +1 -0
  13. package/web/assets/AiChatPage-B3P7qefE.js +1 -0
  14. package/web/assets/AppLayout-B2e7K0cZ.js +1 -0
  15. package/web/assets/{AuditPage-CUdrFc3C.js → AuditPage-B55qp9MV.js} +1 -1
  16. package/web/assets/{CloudAccountPage-am6AxJRB.js → CloudAccountPage-CGyW79m_.js} +1 -1
  17. package/web/assets/CloudAccountPage-DTity1N0.js +1 -0
  18. package/web/assets/CloudMessagingPage-7RQRbAOB.js +2 -0
  19. package/web/assets/CloudMessagingPage-BUnfNsBz.css +1 -0
  20. package/web/assets/{DashboardPage-pA2caWR9.js → DashboardPage-CwmCbP3t.js} +1 -1
  21. package/web/assets/{EditorIcon-C9E8hRyM.js → EditorIcon-BaldhaS8.js} +1 -1
  22. package/web/assets/{EnvironmentForm-XKpxQ-45.js → EnvironmentForm-Da52SUx4.js} +2 -2
  23. package/web/assets/EnvironmentFormPage-Bab5iOWS.js +1 -0
  24. package/web/assets/EnvironmentListPage-O1fIWq-g.js +1 -0
  25. package/web/assets/EnvironmentSelector-BWzLYssP.js +1 -0
  26. package/web/assets/KanbanBoardPage-BOMHKLHX.css +1 -0
  27. package/web/assets/KanbanBoardPage-BvtIaHqG.js +4 -0
  28. package/web/assets/KanbanListPage-BoNcgR3h.css +1 -0
  29. package/web/assets/KanbanListPage-Cv_QJF00.js +1 -0
  30. package/web/assets/LaunchProjectPage-uB7iIMG1.js +1 -0
  31. package/web/assets/{LaunchServicesPage-CViec72c.js → LaunchServicesPage-1ZN1JYqH.js} +1 -1
  32. package/web/assets/LogViewer-BJxpIK11.js +3 -0
  33. package/web/assets/{ProcessControls-D97-A3dI.js → ProcessControls-C2EYsD-P.js} +1 -1
  34. package/web/assets/ProcessDetailPage-DdOfegjU.js +1 -0
  35. package/web/assets/{ProcessMetrics-CNJ30_ef.js → ProcessMetrics-DpDxpUpO.js} +2 -2
  36. package/web/assets/ProjectDetailPage-DtwRjTew.js +1 -0
  37. package/web/assets/ProjectListPage-D9SUNEFu.js +1 -0
  38. package/web/assets/{RandomJobTestPage-CnY2f-qz.js → RandomJobTestPage-OoAk9WAJ.js} +1 -1
  39. package/web/assets/{ScenarioEditorPage-CBZp7Q34.css → ScenarioEditorPage-GmFIXPDj.css} +1 -1
  40. package/web/assets/ScenarioEditorPage-LhEs4hjS.js +14 -0
  41. package/web/assets/SendToChatDialog-CZWy1K4A.js +1 -0
  42. package/web/assets/ServiceControlsBar-CU6b2KBJ.js +1 -0
  43. package/web/assets/{ServiceDetailPage-DhE1LYrn.css → ServiceDetailPage-BvoD3SB6.css} +1 -1
  44. package/web/assets/ServiceDetailPage-CSaPyV_v.js +2 -0
  45. package/web/assets/ServiceFormPage-D9NFCmmW.js +1 -0
  46. package/web/assets/SettingsPage-BMclTDLy.css +1 -0
  47. package/web/assets/SettingsPage-DXlBFfBq.js +2062 -0
  48. package/web/assets/{SetupPage-CzabsTON.js → SetupPage-dqqf_M_p.js} +1 -1
  49. package/web/assets/UnlockPage-ClEawxOC.css +1 -0
  50. package/web/assets/UnlockPage-DjjpY02d.js +1 -0
  51. package/web/assets/VariablesTable-B4h9eNC_.css +1 -0
  52. package/web/assets/VariablesTable-BFgRnjza.js +1 -0
  53. package/web/assets/{VersionBadge-DUE17MrD.js → VersionBadge-ToW3NGSQ.js} +1 -1
  54. package/web/assets/WikiPage-Djisdsae.js +1 -0
  55. package/web/assets/{WikiView-CUBKfTT-.css → WikiView-CaUVD3f1.css} +1 -1
  56. package/web/assets/WikiView-CiATkY8l.js +1 -0
  57. package/web/assets/{add-scalar-classes-Cfh7_IWy.js → add-scalar-classes-DGwycuRW.js} +3 -3
  58. package/web/assets/auth-errors-DEObS1lG.js +1 -0
  59. package/web/assets/{autocomplete-CrWQ5zMj.js → autocomplete-DP0sGong.js} +1 -1
  60. package/web/assets/{basic-shape-diamond.svg-pjhwN4JT.js → basic-shape-diamond.svg-B0FzUXGN.js} +1 -1
  61. package/web/assets/{basic-shape-hexagon.svg-D0yEDOCC.js → basic-shape-hexagon.svg-BuI9rv44.js} +1 -1
  62. package/web/assets/{basic-shape-primary-circle-ellipse-round.svg-DvZ7CdgE.js → basic-shape-primary-circle-ellipse-round.svg-C0WlStV7.js} +1 -1
  63. package/web/assets/{basic-shape-primary-square-rectangle.svg-ChB1hiGR.js → basic-shape-primary-square-rectangle.svg-ByMGtNMn.js} +1 -1
  64. package/web/assets/{basic-shape-shield.svg-Bxrmr3jg.js → basic-shape-shield.svg-h6znjRmZ.js} +1 -1
  65. package/web/assets/{browser-C2YmKQw8.js → browser-DJeF2lho.js} +1 -1
  66. package/web/assets/{browser-CvQ_J2u9.js → browser-oekISqUb.js} +1 -1
  67. package/web/assets/{card-CpyeL2dI.js → card-B7-be48x.js} +1 -1
  68. package/web/assets/{checkbox-DWNV_RaS.js → checkbox-DDSZK_Pi.js} +1 -1
  69. package/web/assets/{chip-8cRcc2L3.js → chip-BVSQ-56q.js} +1 -1
  70. package/web/assets/{client-DNj6VDDb.js → client-DWfGqqLr.js} +1 -1
  71. package/web/assets/cloud-chat.store-BLFChRpl.js +1 -0
  72. package/web/assets/cloud-client-GmxBhiFl.js +1 -0
  73. package/web/assets/{column-DtLr_xcq.js → column-BHRqZfnh.js} +7 -7
  74. package/web/assets/{computer-device-desktop-monitor.svg-CLGySxTI.js → computer-device-desktop-monitor.svg-CL9XulYR.js} +1 -1
  75. package/web/assets/{computer-device-desktop.svg-DJ9n7_Sq.js → computer-device-desktop.svg-CKWeVTzO.js} +1 -1
  76. package/web/assets/{computer-device-laptop.svg-k6zcRWN4.js → computer-device-laptop.svg-wAkdRlEi.js} +1 -1
  77. package/web/assets/{computer-device-mobile-phone-android-samsung-back.svg-pwKHMzIK.js → computer-device-mobile-phone-android-samsung-back.svg-DOahzxu1.js} +1 -1
  78. package/web/assets/{computer-device-mobile-phone-android-samsung.svg-CR796QT_.js → computer-device-mobile-phone-android-samsung.svg-FBZO3WLS.js} +1 -1
  79. package/web/assets/{computer-device-mobile-phone-iphone-x-back.svg-CY2r7WXK.js → computer-device-mobile-phone-iphone-x-back.svg-CCLknBWv.js} +1 -1
  80. package/web/assets/{computer-device-mobile-phone-iphone-x.svg-BHISnTWX.js → computer-device-mobile-phone-iphone-x.svg-CWdT8wN4.js} +1 -1
  81. package/web/assets/{computer-device-mobile-tablet-touch.svg-DQqDUvnk.js → computer-device-mobile-tablet-touch.svg-Bx1A6qUQ.js} +1 -1
  82. package/web/assets/{computer-device-mobile-tablet.svg-4Ab5vdIo.js → computer-device-mobile-tablet.svg-JpmP6yqf.js} +1 -1
  83. package/web/assets/{computer-device-network-ethernet-cat6.svg-DJf04S68.js → computer-device-network-ethernet-cat6.svg-D6WFbLbI.js} +1 -1
  84. package/web/assets/{computer-device-network-lan-www.svg-CaETgcOJ.js → computer-device-network-lan-www.svg-U8NMAi5b.js} +1 -1
  85. package/web/assets/{computer-device-network-wifi-connection.svg-PndfmFuy.js → computer-device-network-wifi-connection.svg-FuRBLyH4.js} +1 -1
  86. package/web/assets/{computer-device-network-wifi-router.svg-CBLwEbOV.js → computer-device-network-wifi-router.svg-BMzCP2Aw.js} +1 -1
  87. package/web/assets/{cssMode-RVPpAuHz.js → cssMode--4DE_809.js} +1 -1
  88. package/web/assets/{divider-CYFRNVal.js → divider-hPOrl1Iy.js} +1 -1
  89. package/web/assets/{ecology-science-erlenmeyer-flask.svg-BYXK2uKa.js → ecology-science-erlenmeyer-flask.svg-Bnte5Nm-.js} +1 -1
  90. package/web/assets/{fieldset-BCXBPIiB.js → fieldset-BSwilV-Y.js} +1 -1
  91. package/web/assets/{freemarker2-B6guP0jO.js → freemarker2-DUNAk_0P.js} +1 -1
  92. package/web/assets/{handlebars-BxlL79LN.js → handlebars-CoM2DS_1.js} +1 -1
  93. package/web/assets/{html-Dr0M60O0.js → html-CgEDNZ_R.js} +1 -1
  94. package/web/assets/{htmlMode-B63yAhXq.js → htmlMode-QDDBWVzd.js} +1 -1
  95. package/web/assets/{image-flash-lightning.svg-DVtJFd09.js → image-flash-lightning.svg-ZIxta1IB.js} +1 -1
  96. package/web/assets/{image-picture-flower.svg-BaBdyWt-.js → image-picture-flower.svg-BXxhgW1Q.js} +1 -1
  97. package/web/assets/{index-BTYNCNK0.js → index-Dl-HyfHx.js} +244 -244
  98. package/web/assets/{index-DS4VL_1S.css → index-gKo3WNkm.css} +1 -1
  99. package/web/assets/{interface-alert-exclamation-diamond.svg-BQYncN9j.js → interface-alert-exclamation-diamond.svg-bVfL6jBy.js} +1 -1
  100. package/web/assets/{interface-alert-exclamation-triangle-warning.svg-BvQxARpD.js → interface-alert-exclamation-triangle-warning.svg-BrapXyrc.js} +1 -1
  101. package/web/assets/{interface-alert-information-circle.svg-BbiwUtTt.js → interface-alert-information-circle.svg--W3bUw5n.js} +1 -1
  102. package/web/assets/{interface-award-crown.svg-BJs2BJ9S.js → interface-award-crown.svg-CBbbHFIN.js} +1 -1
  103. package/web/assets/{interface-bookmark.svg-WUL572zM.js → interface-bookmark-tag.svg-C4_v-zTY.js} +1 -1
  104. package/web/assets/{interface-bookmark-tag.svg-huwK9o4X.js → interface-bookmark.svg-CIY69-iu.js} +1 -1
  105. package/web/assets/{interface-calendar-date-one.svg-CEkOALKM.js → interface-calendar-date-one.svg-CD7WxblA.js} +1 -1
  106. package/web/assets/{interface-content-book-open-pages.svg-CDxvdidz.js → interface-content-book-open-pages.svg-BamW-eNv.js} +1 -1
  107. package/web/assets/{interface-content-book-page.svg-ROxK9a-V.js → interface-content-book-page.svg-CpHhLWQE.js} +1 -1
  108. package/web/assets/{interface-content-file.svg-69XGQGxu.js → interface-content-file.svg-BmqLN3iR.js} +1 -1
  109. package/web/assets/interface-content-folder.svg-B2phMZXd.js +1 -0
  110. package/web/assets/{interface-content-folder.svg-BjXgivIz.js → interface-content-folder.svg-ffbcORbT.js} +1 -1
  111. package/web/assets/{interface-copy-clipboard.svg-BAAZ1QLS.js → interface-copy-clipboard.svg-MdbbmqXS.js} +1 -1
  112. package/web/assets/{interface-edit-attachment.svg-BCmyBBsd.js → interface-edit-attachment.svg-DtAVj6tp.js} +1 -1
  113. package/web/assets/{interface-edit-binocular.svg-BI3JPE3j.js → interface-edit-binocular.svg-DfT11Y7N.js} +1 -1
  114. package/web/assets/{interface-edit-magic-wand.svg-DhECH5yw.js → interface-edit-magic-wand.svg-D4mLRHJs.js} +1 -1
  115. package/web/assets/{interface-edit-tool-paint-roller.svg-0-Os9Flg.js → interface-edit-tool-paint-roller.svg-Cxa7Ct4C.js} +1 -1
  116. package/web/assets/{interface-edit-tool-pencil.svg-CM5UI5Rv.js → interface-edit-tool-pencil.svg-IRM3BHKY.js} +1 -1
  117. package/web/assets/{interface-favorite-award.svg-BZNkuFiE.js → interface-favorite-award.svg-CLGZ65SX.js} +1 -1
  118. package/web/assets/{interface-favorite-flag.svg-CeHd37SC.js → interface-favorite-flag.svg-ju-VMCAF.js} +1 -1
  119. package/web/assets/{interface-favorite-heart.svg-D5dJ4sOz.js → interface-favorite-heart.svg-DsWpztN8.js} +1 -1
  120. package/web/assets/{interface-favorite-star.svg-B7YeWzmv.js → interface-favorite-star.svg-CCPUYvBO.js} +1 -1
  121. package/web/assets/{interface-favorite-stars-sparkles.svg-BwqCtLSB.js → interface-favorite-stars-sparkles.svg-nf2ra-Mg.js} +1 -1
  122. package/web/assets/{interface-hierarchy-flowchart.svg-q70-KJ80.js → interface-hierarchy-flowchart.svg-CPrjsUHp.js} +1 -1
  123. package/web/assets/{interface-home-house.svg-CUco1zSk.js → interface-home-house.svg-DyWL4dgs.js} +1 -1
  124. package/web/assets/{interface-hyperlink.svg-D6Z-QbxJ.js → interface-hyperlink.svg-DgjI4lGJ.js} +1 -1
  125. package/web/assets/{interface-lighting-brightness.svg-DDJ8wIbt.js → interface-lighting-brightness.svg-BhomgGV0.js} +1 -1
  126. package/web/assets/{interface-lock-closed.svg-1GuN2t9d.js → interface-lock-closed.svg-CDDGuaUG.js} +1 -1
  127. package/web/assets/{interface-lock-open-unlock.svg-CmSL9GCo.js → interface-lock-open-unlock.svg-DxOzefwC.js} +1 -1
  128. package/web/assets/{interface-login-key.svg-Cnur4uLY.js → interface-login-key.svg-CLs728UT.js} +1 -1
  129. package/web/assets/{interface-search.svg-3TqtroIY.js → interface-search.svg-CSE2bUM-.js} +1 -1
  130. package/web/assets/{interface-setting-cog.svg-B7nRfZ1y.js → interface-setting-cog.svg-SfBQ-E_y.js} +1 -1
  131. package/web/assets/{interface-share-megaphone-bullhorn.svg-DraAk4oI.js → interface-share-megaphone-bullhorn.svg-Cg9QEbsW.js} +1 -1
  132. package/web/assets/{interface-share-rocket.svg-CGRtk6J4.js → interface-share-rocket.svg-V9fWt6R5.js} +1 -1
  133. package/web/assets/{interface-share-satellite.svg-COo3kZqu.js → interface-share-satellite.svg-BoAJlAy3.js} +1 -1
  134. package/web/assets/{interface-share-space-ship.svg-iYhfpKY2.js → interface-share-space-ship.svg-CWoqBiZI.js} +1 -1
  135. package/web/assets/{interface-share.svg-BqVe3lWw.js → interface-share.svg-DW6AG6rC.js} +1 -1
  136. package/web/assets/{interface-signal-square.svg-DmGT2kio.js → interface-signal-square.svg-DktTeL2e.js} +1 -1
  137. package/web/assets/{interface-time-clock-circle.svg-Djt_VZVX.js → interface-time-clock-circle.svg-BBnimglQ.js} +1 -1
  138. package/web/assets/{interface-time-hour-glass.svg-DxZVLqJ6.js → interface-time-hour-glass.svg-WNSRow4o.js} +1 -1
  139. package/web/assets/{interface-users-multiple.svg-n8dIXu9r.js → interface-users-multiple.svg-DoeSSDNX.js} +1 -1
  140. package/web/assets/{interface-weather-moon.svg-CExHl6HQ.js → interface-weather-moon.svg-BzUq31T3.js} +1 -1
  141. package/web/assets/{javascript-6lVkE6gP.js → javascript-CDsgZK6E.js} +1 -1
  142. package/web/assets/{jsonMode-CySg6s8T.js → jsonMode-BOQojnkz.js} +1 -1
  143. package/web/assets/{liquid-DSLZY9bf.js → liquid-CT8_Ig_a.js} +1 -1
  144. package/web/assets/{lspLanguageFeatures-C6Gb5-pg.js → lspLanguageFeatures-BW3wbtds.js} +1 -1
  145. package/web/assets/{mail-chat-bubble-square.svg-BqpIkvR_.js → mail-chat-bubble-square.svg-BB3D-jS5.js} +1 -1
  146. package/web/assets/{mail-send-email-paper-airplane.svg-DUkiRZ1x.js → mail-send-email-paper-airplane.svg-BGUFNdDy.js} +1 -1
  147. package/web/assets/{mail-send-envelope.svg-DjjLaPUo.js → mail-send-envelope.svg-CiEf_X3v.js} +1 -1
  148. package/web/assets/{mdx-DuCKQZ3-.js → mdx-BzJqzXG7.js} +1 -1
  149. package/web/assets/{message-CJ-X_z47.js → message-DQfiz3F1.js} +1 -1
  150. package/web/assets/{minus-RXlNS6-g.js → minus-Bh-ngAnz.js} +1 -1
  151. package/web/assets/modal-B6tgGww3.js +1 -0
  152. package/web/assets/{modal-DfNn2ioJ.js → modal-BH8tCrqE.js} +1 -1
  153. package/web/assets/{money-cashier-receipt.svg-CUzOL6J5.js → money-cashier-receipt.svg-nbLywLCi.js} +1 -1
  154. package/web/assets/{money-currency-dollar-pay.svg-CQY_KC9b.js → money-currency-dollar-pay.svg-HtpV_93j.js} +1 -1
  155. package/web/assets/{money-graph-arrow-increase.svg-BDu5i5aF.js → money-graph-arrow-increase.svg-BG4s2n8-.js} +1 -1
  156. package/web/assets/{money-graph-bar-chart-increase.svg-xBlBZYiv.js → money-graph-bar-chart-increase.svg-7ivMfz5M.js} +1 -1
  157. package/web/assets/{multiselect-BbY8SFyO.js → multiselect-CE72JxFr.js} +1 -1
  158. package/web/assets/{nature-ecology-leaf.svg-C_T6wTIZ.js → nature-ecology-leaf.svg-D60IfAE-.js} +1 -1
  159. package/web/assets/{password-B_pKmF_I.js → password-CZ-A_ePM.js} +1 -1
  160. package/web/assets/{phone-telephone.svg-DzUP7zCx.js → phone-telephone.svg-B0OCaSQr.js} +1 -1
  161. package/web/assets/{plus-DfsTcd_H.js → plus-DZy8IO4Z.js} +1 -1
  162. package/web/assets/process.store-XR7BoPqt.js +1 -0
  163. package/web/assets/{programming-bug.svg-C1NvPH7_.js → programming-bug.svg-DDZ7-1a6.js} +1 -1
  164. package/web/assets/{programming-cloud.svg-hVwd5xzu.js → programming-cloud.svg-BZHqbFE1.js} +1 -1
  165. package/web/assets/{programming-computer-database-server.svg-DXvcm62E.js → programming-computer-database-server.svg-CPK0axOF.js} +1 -1
  166. package/web/assets/{programming-computer-database.svg-w2w_GH3u.js → programming-computer-database.svg-Dat_iKWZ.js} +1 -1
  167. package/web/assets/{programming-module-four-layout.svg-DLcwogv0.js → programming-module-four-layout.svg-DYTRTKmF.js} +1 -1
  168. package/web/assets/{programming-module-three.svg-Cfjjs8tf.js → programming-module-three.svg-CU563xPB.js} +1 -1
  169. package/web/assets/{programming-module.svg-ChyMdD4E.js → programming-module.svg-DdRe2d3E.js} +1 -1
  170. package/web/assets/{programming-script-code.svg-D8N99_E3.js → programming-script-code.svg-D5dDzg1B.js} +1 -1
  171. package/web/assets/{python-BT-UPVMQ.js → python-C0tzbgs4.js} +1 -1
  172. package/web/assets/{radiobutton-C9iiy1zq.js → radiobutton-BYEniO96.js} +1 -1
  173. package/web/assets/{razor-DKUraACi.js → razor-BNCtUdbo.js} +1 -1
  174. package/web/assets/router-BpJBXGio.js +1 -0
  175. package/web/assets/{settings.store-PSHvWAzl.js → settings.store-hW2r6ht2.js} +1 -1
  176. package/web/assets/{shopping-cart.svg-C_kTBKvf.js → shopping-cart.svg-yNDOoxiE.js} +1 -1
  177. package/web/assets/{shopping-gift-present.svg-DIfbUecw.js → shopping-gift-present.svg-ZAFtf911.js} +1 -1
  178. package/web/assets/{shopping-shipping-box-parcel-package.svg-DgeqoYij.js → shopping-shipping-box-parcel-package.svg-C_128hOx.js} +1 -1
  179. package/web/assets/{TiptapEditor-CI1pNNDH.js → src-BTZHXzoT.js} +78 -78
  180. package/web/assets/src-CmzYYWZd.css +1 -0
  181. package/web/assets/src-DtlOQm4K.js +1 -0
  182. package/web/assets/src-ZfecJkW9.css +1 -0
  183. package/web/assets/{tabpanel-tgozju6m.js → tabpanel-BiifLLS6.js} +2 -2
  184. package/web/assets/{tag-new-circle.svg-yzrCIErB.js → tag-new-circle.svg-0OOws8vC.js} +1 -1
  185. package/web/assets/{travel-map-earth-globe.svg-C9CMICQQ.js → travel-map-earth-globe.svg-CvwB8JlN.js} +1 -1
  186. package/web/assets/trpc-D0HTyuMG.js +1 -0
  187. package/web/assets/{tsMode-gblCXC3w.js → tsMode-CadFFP73.js} +1 -1
  188. package/web/assets/{typescript-DeVzlCKf.js → typescript-TsqAe_2a.js} +1 -1
  189. package/web/assets/useAiChatDrawer-2ELNp1KU.js +1 -0
  190. package/web/assets/useCloudOrg-BAtUa48Z.css +1 -0
  191. package/web/assets/useCloudOrg-DuypVndp.js +1 -0
  192. package/web/assets/{xml-UwUjH4rq.js → xml-bgdRCuvM.js} +1 -1
  193. package/web/assets/{yaml-DSs0npSB.js → yaml-BRUv0H85.js} +1 -1
  194. package/web/index.html +2 -2
  195. package/agent-manager-QPZUYLJA.js +0 -8
  196. package/chunk-LZWBXYUE.js +0 -354
  197. package/chunk-LZWBXYUE.js.map +0 -1
  198. package/chunk-PUNE7P6S.js.map +0 -1
  199. package/chunk-Q4N37KNN.js +0 -202
  200. package/chunk-Q4N37KNN.js.map +0 -1
  201. package/kanban-commands-53WWMCHQ.js +0 -14
  202. package/kanban-commands-53WWMCHQ.js.map +0 -1
  203. package/src-K32WI425.js.map +0 -1
  204. package/web/assets/AgentScalarChatInterface.vue-S7bbKRqw.js +0 -13
  205. package/web/assets/AgentTerminalPage-c0fCTCzP.js +0 -1
  206. package/web/assets/AiChatPage-B-kfiUI-.js +0 -1
  207. package/web/assets/AppLayout-COTo6zQf.js +0 -1
  208. package/web/assets/CloudAccountPage-H1QGj9tJ.js +0 -1
  209. package/web/assets/CloudMessagingPage-BEtd8B8B.js +0 -2
  210. package/web/assets/CloudMessagingPage-sgMxCh6j.css +0 -1
  211. package/web/assets/EnvironmentFormPage-DMpiq3Zx.js +0 -1
  212. package/web/assets/EnvironmentListPage-C21qJ3iw.js +0 -1
  213. package/web/assets/EnvironmentSelector-Be9yMkjY.js +0 -1
  214. package/web/assets/KanbanBoardPage-CyUTDl_W.css +0 -1
  215. package/web/assets/KanbanBoardPage-SNCSxTz7.js +0 -4
  216. package/web/assets/KanbanListPage-B3JpbFlv.css +0 -1
  217. package/web/assets/KanbanListPage-D-kgPmxI.js +0 -1
  218. package/web/assets/LaunchProjectPage-BbNDYePE.js +0 -1
  219. package/web/assets/LogViewer-CHyPfODD.js +0 -3
  220. package/web/assets/ProcessDetailPage-BlQJDM-W.js +0 -1
  221. package/web/assets/ProjectDetailPage-DdRYMfcl.js +0 -1
  222. package/web/assets/ProjectListPage-BDLXGuEj.js +0 -1
  223. package/web/assets/ScenarioEditorPage-CFNTrVlY.js +0 -14
  224. package/web/assets/SendToChatDialog-BJjY1MAh.css +0 -1
  225. package/web/assets/SendToChatDialog-CtGhyaOw.js +0 -1
  226. package/web/assets/ServiceControlsBar-m_AQmRiR.js +0 -1
  227. package/web/assets/ServiceDetailPage-RCl6IsBs.js +0 -2
  228. package/web/assets/ServiceFormPage-CIJ-tFub.js +0 -1
  229. package/web/assets/SettingsPage-CPF7w35a.css +0 -1
  230. package/web/assets/SettingsPage-tK-RiJrj.js +0 -2062
  231. package/web/assets/SetupKeyPage-CzB_AMfr.js +0 -1
  232. package/web/assets/SetupKeyPage-DoY1Ua1s.css +0 -1
  233. package/web/assets/TiptapEditor-bdEPMd-W.css +0 -1
  234. package/web/assets/UnlockPage-DWM5symg.js +0 -1
  235. package/web/assets/UnlockPage-EZOi-H7d.css +0 -1
  236. package/web/assets/VariablesTable-Bkv0MOKi.css +0 -1
  237. package/web/assets/VariablesTable-DoNJ4OIn.js +0 -1
  238. package/web/assets/WikiPage-COdO-49s.js +0 -1
  239. package/web/assets/WikiView-BS9HHroX.js +0 -1
  240. package/web/assets/auth-errors-D-uOLmKt.js +0 -1
  241. package/web/assets/cloud-chat.store-DHiYOkkN.js +0 -1
  242. package/web/assets/cloud-client-COpvz58o.js +0 -1
  243. package/web/assets/interface-content-folder.svg-Bijbx45w.js +0 -1
  244. package/web/assets/modal-BvVbc_6u.js +0 -1
  245. package/web/assets/process.store-BLMSPw2l.js +0 -1
  246. package/web/assets/router-DBNATEGs.js +0 -1
  247. package/web/assets/trpc-3qbDCsqO.js +0 -1
  248. package/web/assets/useAiChatDrawer-BtC-0qN-.js +0 -1
  249. /package/{agent-manager-QPZUYLJA.js.map → agent-manager-2P4THUVA.js.map} +0 -0
  250. /package/web/assets/{abap-lJFTLuI6.js → abap-DMmvWZUy.js} +0 -0
  251. /package/web/assets/{apex-Bp0KWav8.js → apex-D89PiTzU.js} +0 -0
  252. /package/web/assets/{azcli-DBOe7Uvy.js → azcli-ChnjTTA5.js} +0 -0
  253. /package/web/assets/{bat-Dk_NT_by.js → bat-uLzQ_FhK.js} +0 -0
  254. /package/web/assets/{bicep-B07Mrlc7.js → bicep-CMOK7Q1v.js} +0 -0
  255. /package/web/assets/{cameligo-DL5eNXGn.js → cameligo-D1AyojFH.js} +0 -0
  256. /package/web/assets/{clojure-BzV2Yqu_.js → clojure-D9JoUgXn.js} +0 -0
  257. /package/web/assets/{coffee-Bjlj5hmf.js → coffee-D-5sSToL.js} +0 -0
  258. /package/web/assets/{cpp-C9oth5qz.js → cpp-BqT_t_y9.js} +0 -0
  259. /package/web/assets/{csharp-HyGd049S.js → csharp-CuToYI91.js} +0 -0
  260. /package/web/assets/{csp-DjCDOBuX.js → csp-CffcxvlO.js} +0 -0
  261. /package/web/assets/{css-DIL8RTJ3.js → css-CUD0biQW.js} +0 -0
  262. /package/web/assets/{cypher-DX1zPXL5.js → cypher-ByyWL_9U.js} +0 -0
  263. /package/web/assets/{dart-BBQZd_ZZ.js → dart-B__ipcUn.js} +0 -0
  264. /package/web/assets/{dockerfile-Cj0CaWYx.js → dockerfile-DS-_8bWw.js} +0 -0
  265. /package/web/assets/{ecl-BjmWCTJg.js → ecl-DWsNCBUj.js} +0 -0
  266. /package/web/assets/{elixir-3uWoEjXX.js → elixir-OfjEy-3g.js} +0 -0
  267. /package/web/assets/{flow9-D4r739e9.js → flow9-BPX22hxS.js} +0 -0
  268. /package/web/assets/{fsharp-B3ycAx5T.js → fsharp-CVJcfIUn.js} +0 -0
  269. /package/web/assets/{go-DFHBjfCl.js → go-CfRHZ3yg.js} +0 -0
  270. /package/web/assets/{graphql-DBjIbM_e.js → graphql-BZaO3ttK.js} +0 -0
  271. /package/web/assets/{hcl-Buu_1Hsp.js → hcl-BF9-qUku.js} +0 -0
  272. /package/web/assets/{ini-CgzZhgz_.js → ini-BUvw6xhr.js} +0 -0
  273. /package/web/assets/{java-BczDO0q5.js → java-BZ5BNd2x.js} +0 -0
  274. /package/web/assets/{julia-B142kn-7.js → julia-DN38cgYT.js} +0 -0
  275. /package/web/assets/{kotlin-42XMP7p1.js → kotlin-CjEJKT8q.js} +0 -0
  276. /package/web/assets/{less-BCIsKRqU.js → less-DMEH_Nwq.js} +0 -0
  277. /package/web/assets/{lexon-DTDOH1dQ.js → lexon-CKQUX8Ov.js} +0 -0
  278. /package/web/assets/{lua-BrH-CeNs.js → lua-CuWjKLJ0.js} +0 -0
  279. /package/web/assets/{m3-D-eUeHOI.js → m3-CEp1bVrM.js} +0 -0
  280. /package/web/assets/{markdown-DwpSjZTn.js → markdown-DxtQ_puq.js} +0 -0
  281. /package/web/assets/{mips-DoGTrjVk.js → mips-Dx7qydpO.js} +0 -0
  282. /package/web/assets/{msdax-CQ8McnjQ.js → msdax-DpNCaSiO.js} +0 -0
  283. /package/web/assets/{mysql-Cj3do0ZO.js → mysql-C3xsBDPP.js} +0 -0
  284. /package/web/assets/{objective-c-BZbR8TG8.js → objective-c-BbaVHCX1.js} +0 -0
  285. /package/web/assets/{pascal-23PRDHRq.js → pascal-sDju2faq.js} +0 -0
  286. /package/web/assets/{pascaligo-CxasKTLJ.js → pascaligo-ChCdOH6b.js} +0 -0
  287. /package/web/assets/{perl-Dhxz2Lhx.js → perl-BCgLFj01.js} +0 -0
  288. /package/web/assets/{pgsql-BIbUy7yD.js → pgsql-DtKby69f.js} +0 -0
  289. /package/web/assets/{php-B5qS9qgM.js → php-NYvR17Qb.js} +0 -0
  290. /package/web/assets/{pla-Bolz9fha.js → pla-gSg-RBG0.js} +0 -0
  291. /package/web/assets/{postiats-Ba6dE5lj.js → postiats-BQxHyDfy.js} +0 -0
  292. /package/web/assets/{powerquery-2jW3ONgo.js → powerquery-DzDmbVZN.js} +0 -0
  293. /package/web/assets/{powershell-CMfBIiJp.js → powershell-yy4Q5BEQ.js} +0 -0
  294. /package/web/assets/{protobuf-BpaquOUj.js → protobuf-B_hIk9q0.js} +0 -0
  295. /package/web/assets/{pug-cBG82Ydz.js → pug-CdeEb1ft.js} +0 -0
  296. /package/web/assets/{qsharp-DtqL8Lmt.js → qsharp-CiSquEgT.js} +0 -0
  297. /package/web/assets/{r-CKLew4sj.js → r-D1Ocz1x4.js} +0 -0
  298. /package/web/assets/{redis-BdDxRU-N.js → redis-D42Y12yz.js} +0 -0
  299. /package/web/assets/{redshift-X4a4MlqW.js → redshift-CS62MYfG.js} +0 -0
  300. /package/web/assets/{restructuredtext-LA4Fv05h.js → restructuredtext-CKFSMEXw.js} +0 -0
  301. /package/web/assets/{ruby-CibE_WVM.js → ruby-C4gTaeU3.js} +0 -0
  302. /package/web/assets/{rust-BK6RsiL0.js → rust-C_f2AiHQ.js} +0 -0
  303. /package/web/assets/{sb-BnCCt0Qj.js → sb-CdNdpP1r.js} +0 -0
  304. /package/web/assets/{scala-oaBDrVqj.js → scala-N4EWaFTL.js} +0 -0
  305. /package/web/assets/{scheme-C-wkLC01.js → scheme-CttIARxx.js} +0 -0
  306. /package/web/assets/{scss-BceVGOJY.js → scss-v0wtbxaE.js} +0 -0
  307. /package/web/assets/{shell-CxhBAFA5.js → shell-BJdEWXbc.js} +0 -0
  308. /package/web/assets/{solidity-D9sXgTfx.js → solidity-DKDa59zZ.js} +0 -0
  309. /package/web/assets/{sophia-C4VBhIEM.js → sophia--Kw-vDpr.js} +0 -0
  310. /package/web/assets/{sparql-DbsK2s9y.js → sparql-BI8jS9Pc.js} +0 -0
  311. /package/web/assets/{sql-CuGfE0wH.js → sql-Dz6z--6O.js} +0 -0
  312. /package/web/assets/{st-rB6Bqb2h.js → st-CT8D05gv.js} +0 -0
  313. /package/web/assets/{swift-BtHGe_4T.js → swift-Ayb3KzWx.js} +0 -0
  314. /package/web/assets/{systemverilog-CgKnzwU4.js → systemverilog-BtWJM9O5.js} +0 -0
  315. /package/web/assets/{tcl-DyqQWf87.js → tcl-BJvUWpbV.js} +0 -0
  316. /package/web/assets/{twig-C980XO5P.js → twig-c3YaBCU6.js} +0 -0
  317. /package/web/assets/{typespec-CVmA80px.js → typespec-gFCWLBoZ.js} +0 -0
  318. /package/web/assets/{uuid-2Kb5PDpq.js → uuid-B3B8HIK9.js} +0 -0
  319. /package/web/assets/{vb-rdNQv5VQ.js → vb-CVtfWXV2.js} +0 -0
  320. /package/web/assets/{w3c-keyname-B2B-WOb1.js → w3c-keyname-nn0G3QC2.js} +0 -0
  321. /package/web/assets/{wgsl-64oVbimL.js → wgsl-C_huaGQy.js} +0 -0
@@ -1,24 +1,109 @@
1
- import {
2
- decryptValue,
3
- decryptVariableSlots,
4
- deriveStableSecret,
5
- encryptVariableSlots,
6
- env,
7
- extractEncryptedVariableSlots,
8
- getEncryptionKey,
9
- isEncryptedValue,
10
- stableEncryptValue
11
- } from "./chunk-Q4N37KNN.js";
12
-
13
1
  // ../server/src/services/agent-manager.ts
14
2
  import { EventEmitter as EventEmitter2 } from "events";
15
3
  import WebSocket2 from "ws";
16
- import { z as z20 } from "zod";
4
+ import { z as z21 } from "zod";
17
5
 
18
6
  // ../server/src/services/agent-store.ts
19
7
  import { randomUUID, randomBytes, createCipheriv, createDecipheriv } from "crypto";
20
8
  import { readFile, writeFile, rename, mkdir, chmod } from "fs/promises";
21
9
  import { join } from "path";
10
+
11
+ // ../server/src/config/env.ts
12
+ import { z } from "zod";
13
+ var serverPort = z.coerce.number().int().min(1).max(65535).default(4e3).parse(process.env.RUNEYA_HTTP_PORT);
14
+ var defaultAgentPort = process.env.RUNEYA_AGENT_PORT ? z.coerce.number().int().min(1).max(65535).parse(process.env.RUNEYA_AGENT_PORT) : serverPort + 1;
15
+ var EnvSchema = z.object({
16
+ RUNEYA_HTTP_PORT: z.coerce.number().int().min(1).max(65535).default(4e3),
17
+ RUNEYA_HOST: z.string().default("127.0.0.1"),
18
+ RUNEYA_AGENT_PORT: z.coerce.number().int().min(1).max(65535).default(defaultAgentPort),
19
+ RUNEYA_AGENT_HOST: z.string().default("127.0.0.1"),
20
+ RUNEYA_AGENT_BINARY_PATH: z.string().nullable().default(null),
21
+ RUNEYA_DATA_DIR: z.preprocess((v) => typeof v === "string" && v.length > 0 ? v : void 0, z.string().default(".runeya")),
22
+ RUNEYA_CLOUD_URL: z.string().url().nullable().default(null),
23
+ // Cloud front-end (landing) URL — used by the web app for the registration /
24
+ // onboarding flow. Configured on the server at launch; the web fetches it.
25
+ RUNEYA_CLOUD_APP_URL: z.string().url().nullable().default(null),
26
+ RUNEYA_MODE: z.enum(["local-simple", "cloud"]).default("local-simple"),
27
+ RUNEYA_CORS_ORIGIN: z.string().nullable().default(null),
28
+ RUNEYA_LAN_PROXY: z.preprocess((v) => v === "true" || v === "1", z.boolean()).default(false)
29
+ }).transform((data) => ({
30
+ ...data,
31
+ // Short aliases used throughout the server code
32
+ PORT: data.RUNEYA_HTTP_PORT,
33
+ HOST: data.RUNEYA_HOST,
34
+ MODE: data.RUNEYA_MODE,
35
+ DATA_DIR: data.RUNEYA_DATA_DIR,
36
+ CLOUD_URL: data.RUNEYA_CLOUD_URL,
37
+ CLOUD_APP_URL: data.RUNEYA_CLOUD_APP_URL,
38
+ CORS_ORIGIN: data.RUNEYA_CORS_ORIGIN,
39
+ AGENT_BINARY_PATH: data.RUNEYA_AGENT_BINARY_PATH
40
+ }));
41
+ var env = EnvSchema.parse(process.env);
42
+
43
+ // ../server/src/utils/encryption-key.ts
44
+ import { createHash } from "crypto";
45
+ var KEY_SIZE_BYTES = 32;
46
+ var cachedKey = null;
47
+ var _ciMode = false;
48
+ var _pendingLegacyKey = null;
49
+ function isCiMode() {
50
+ return _ciMode;
51
+ }
52
+ async function loadFromEnv() {
53
+ const keyHex = process.env["RUNEYA_ENCRYPTION_KEY"];
54
+ if (!keyHex) return false;
55
+ if (!/^[0-9a-f]{64}$/i.test(keyHex)) {
56
+ throw new Error("RUNEYA_ENCRYPTION_KEY invalide : attendu 64 caract\xE8res hex");
57
+ }
58
+ console.log("");
59
+ console.log("\u26A0 ATTENTION : RUNEYA_ENCRYPTION_KEY est d\xE9fini \u2014 l'authentification par master password est d\xE9sactiv\xE9e.");
60
+ console.log(" Cette variable d'environnement est r\xE9serv\xE9e aux environnements CI/CD.");
61
+ console.log(" Ne la d\xE9finissez jamais sur une machine de d\xE9veloppement.");
62
+ console.log("");
63
+ cachedKey = Buffer.from(keyHex, "hex");
64
+ _ciMode = true;
65
+ return true;
66
+ }
67
+ function setPendingLegacyKey(key) {
68
+ if (key.length !== KEY_SIZE_BYTES) throw new Error("Taille de cl\xE9 invalide");
69
+ _pendingLegacyKey = key;
70
+ }
71
+ function getPendingLegacyKey() {
72
+ return _pendingLegacyKey;
73
+ }
74
+ function clearPendingLegacyKey() {
75
+ _pendingLegacyKey = null;
76
+ }
77
+ function hasPendingLegacyKey() {
78
+ return _pendingLegacyKey !== null;
79
+ }
80
+ function setEncryptionKeyInMemory(key) {
81
+ if (key.length !== KEY_SIZE_BYTES) throw new Error("Taille de cl\xE9 invalide");
82
+ cachedKey = key;
83
+ }
84
+ function clearEncryptionKey() {
85
+ cachedKey = null;
86
+ }
87
+ function hasEncryptionKey() {
88
+ return cachedKey !== null;
89
+ }
90
+ function getEncryptionKey() {
91
+ return cachedKey;
92
+ }
93
+ function deriveStableSecret(purpose) {
94
+ const key = getEncryptionKey();
95
+ if (!key) return null;
96
+ return createHash("sha256").update(key).update(purpose).digest("hex");
97
+ }
98
+ async function ensureEncryptionKey() {
99
+ return cachedKey;
100
+ }
101
+ async function setEncryptionKey(keyHex) {
102
+ if (!/^[0-9a-f]{64}$/i.test(keyHex)) throw new Error("Invalid key format");
103
+ cachedKey = Buffer.from(keyHex, "hex");
104
+ }
105
+
106
+ // ../server/src/services/agent-store.ts
22
107
  var FILENAME = "agents.json";
23
108
  var ALGORITHM = "aes-256-gcm";
24
109
  function encrypt(plaintext) {
@@ -197,217 +282,304 @@ import { randomUUID as randomUUID2 } from "crypto";
197
282
  import { readFile as readFile2, writeFile as writeFile2, rename as rename2, mkdir as mkdir2, chmod as chmod2 } from "fs/promises";
198
283
  import { join as join2 } from "path";
199
284
 
285
+ // ../server/src/services/crypto-helpers.ts
286
+ import { randomBytes as randomBytes2, createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2 } from "crypto";
287
+ var ALGORITHM2 = "aes-256-gcm";
288
+ function encryptValue(plaintext) {
289
+ const maybeKey = getEncryptionKey();
290
+ if (!maybeKey) {
291
+ throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
292
+ }
293
+ const key = maybeKey;
294
+ const iv = randomBytes2(16);
295
+ const cipher = createCipheriv2(ALGORITHM2, key, iv);
296
+ let enc = cipher.update(plaintext, "utf-8", "hex");
297
+ enc += cipher.final("hex");
298
+ const authTag = cipher.getAuthTag().toString("hex");
299
+ return `${iv.toString("hex")}:${authTag}:${enc}`;
300
+ }
301
+ function decryptValue(encrypted) {
302
+ const parts = encrypted.split(":");
303
+ if (parts.length !== 3) throw new Error("Invalid encrypted value format \u2014 expected iv:authTag:ciphertext");
304
+ const [ivHex, authTagHex, ciphertext] = parts;
305
+ if (!/^[0-9a-f]+$/i.test(ivHex) || !/^[0-9a-f]+$/i.test(authTagHex) || ciphertext !== "" && !/^[0-9a-f]+$/i.test(ciphertext)) {
306
+ throw new Error("Invalid hex in encrypted value \u2014 possible data corruption");
307
+ }
308
+ const maybeKey = getEncryptionKey();
309
+ if (!maybeKey) {
310
+ throw new Error("Encryption key not loaded \u2014 please provide the key via setup UI");
311
+ }
312
+ const key = maybeKey;
313
+ const iv = Buffer.from(ivHex, "hex");
314
+ const decipher = createDecipheriv2(ALGORITHM2, key, iv, { authTagLength: 16 });
315
+ decipher.setAuthTag(Buffer.from(authTagHex, "hex"));
316
+ let dec = decipher.update(ciphertext, "hex", "utf-8");
317
+ dec += decipher.final("utf-8");
318
+ return dec;
319
+ }
320
+ function stableEncryptValue(plaintext, existingEncrypted) {
321
+ if (existingEncrypted) {
322
+ try {
323
+ if (decryptValue(existingEncrypted) === plaintext) return existingEncrypted;
324
+ } catch {
325
+ }
326
+ }
327
+ return encryptValue(plaintext);
328
+ }
329
+ function encryptVariableSlots(variables, existingEncrypted) {
330
+ const result = {};
331
+ for (const [key, variable] of Object.entries(variables)) {
332
+ const slot = variable.value;
333
+ if (slot.isSecret && slot.value) {
334
+ result[key] = { ...variable, value: { ...slot, value: stableEncryptValue(slot.value, existingEncrypted?.[key]) } };
335
+ } else {
336
+ result[key] = { ...variable, value: { ...slot } };
337
+ }
338
+ }
339
+ return result;
340
+ }
341
+ function decryptVariableSlots(variables, contextLabel) {
342
+ const result = {};
343
+ for (const [key, variable] of Object.entries(variables)) {
344
+ const slot = variable.value;
345
+ if (slot.isSecret && slot.value) {
346
+ try {
347
+ result[key] = { ...variable, value: { ...slot, value: decryptValue(slot.value) } };
348
+ } catch (err) {
349
+ console.error(`[crypto-helpers] Failed to decrypt variable "${key}" for ${contextLabel}: ${err.message}`);
350
+ result[key] = { ...variable, value: { ...slot, value: "" } };
351
+ }
352
+ } else {
353
+ result[key] = { ...variable, value: { ...slot } };
354
+ }
355
+ }
356
+ return result;
357
+ }
358
+ function extractEncryptedVariableSlots(variables) {
359
+ const slots = {};
360
+ for (const [key, variable] of Object.entries(variables)) {
361
+ if (variable.value?.isSecret && variable.value?.value) {
362
+ slots[key] = variable.value.value;
363
+ }
364
+ }
365
+ return slots;
366
+ }
367
+ function isEncryptedValue(s) {
368
+ const parts = s.split(":");
369
+ return parts.length === 3 && /^[0-9a-f]{32}$/i.test(parts[0]) && /^[0-9a-f]{32}$/i.test(parts[1]);
370
+ }
371
+
200
372
  // ../../packages/shared/src/schemas/user.schema.ts
201
- import { z } from "zod";
202
- var UserSchema = z.object({
203
- id: z.string().max(128),
204
- email: z.string().email().max(320),
205
- name: z.string().min(1).max(500),
206
- avatar: z.string().url().max(2048).nullable().optional()
373
+ import { z as z2 } from "zod";
374
+ var UserSchema = z2.object({
375
+ id: z2.string().max(128),
376
+ email: z2.string().email().max(320),
377
+ name: z2.string().min(1).max(500),
378
+ avatar: z2.string().url().max(2048).nullable().optional()
207
379
  });
208
380
 
209
381
  // ../../packages/shared/src/schemas/org.schema.ts
210
- import { z as z2 } from "zod";
211
- var OrgSchema = z2.object({
212
- id: z2.string().max(128),
213
- name: z2.string().min(1).max(100),
214
- slug: z2.string().min(1).max(100).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/),
215
- ownerId: z2.string().max(128)
382
+ import { z as z3 } from "zod";
383
+ var OrgSchema = z3.object({
384
+ id: z3.string().max(128),
385
+ name: z3.string().min(1).max(100),
386
+ slug: z3.string().min(1).max(100).regex(/^[a-z0-9]([a-z0-9-]*[a-z0-9])?$/),
387
+ ownerId: z3.string().max(128)
216
388
  });
217
- var OrgMemberSchema = z2.object({
218
- id: z2.string().max(128),
219
- orgId: z2.string().max(128),
220
- userId: z2.string().max(128),
221
- globalRole: z2.enum(["owner", "admin", "member"]),
222
- invitedAt: z2.coerce.date(),
223
- joinedAt: z2.coerce.date().nullable().optional()
389
+ var OrgMemberSchema = z3.object({
390
+ id: z3.string().max(128),
391
+ orgId: z3.string().max(128),
392
+ userId: z3.string().max(128),
393
+ globalRole: z3.enum(["owner", "admin", "member"]),
394
+ invitedAt: z3.coerce.date(),
395
+ joinedAt: z3.coerce.date().nullable().optional()
224
396
  });
225
397
 
226
398
  // ../../packages/shared/src/schemas/project.schema.ts
227
- import { z as z3 } from "zod";
228
- var ProjectSchema = z3.object({
229
- id: z3.string().max(128),
230
- orgId: z3.string().max(128).nullable().optional(),
231
- name: z3.string().min(1).max(200),
232
- description: z3.string().max(1e4).optional().default(""),
233
- serviceIds: z3.array(z3.string().max(128)).max(1e4).default([]),
399
+ import { z as z4 } from "zod";
400
+ var ProjectSchema = z4.object({
401
+ id: z4.string().max(128),
402
+ orgId: z4.string().max(128).nullable().optional(),
403
+ name: z4.string().min(1).max(200),
404
+ description: z4.string().max(1e4).optional().default(""),
405
+ serviceIds: z4.array(z4.string().max(128)).max(1e4).default([]),
234
406
  // Environment support
235
407
  // NOTE: activeEnvironmentId is runtime-only (not persisted to JSON)
236
408
  // It's initialized to 'local' by default at load time
237
- activeEnvironmentId: z3.string().max(128).optional(),
238
- environmentIds: z3.array(z3.string().max(128)).max(100).default([]),
409
+ activeEnvironmentId: z4.string().max(128).optional(),
410
+ environmentIds: z4.array(z4.string().max(128)).max(100).default([]),
239
411
  // Ordre d'affichage des groupes de services dans la sidebar (noms de groupes).
240
412
  // Les groupes absents de cette liste sont affichés après, par ordre alphabétique.
241
- groupOrder: z3.array(z3.string().max(200)).max(100).default([])
413
+ groupOrder: z4.array(z4.string().max(200)).max(100).default([])
242
414
  });
243
415
  var CreateProjectSchema = ProjectSchema.omit({ id: true }).partial().required({ name: true });
244
416
  var UpdateProjectSchema = ProjectSchema.partial().required({ id: true });
245
417
 
246
418
  // ../../packages/shared/src/schemas/service.schema.ts
247
- import { z as z7 } from "zod";
419
+ import { z as z8 } from "zod";
248
420
 
249
421
  // ../../packages/shared/src/schemas/settings.schema.ts
250
- import { z as z5 } from "zod";
422
+ import { z as z6 } from "zod";
251
423
 
252
424
  // ../../packages/shared/src/schemas/scenario.schema.ts
253
- import { z as z4 } from "zod";
254
- var PositionSchema = z4.object({
255
- x: z4.number(),
256
- y: z4.number()
425
+ import { z as z5 } from "zod";
426
+ var PositionSchema = z5.object({
427
+ x: z5.number(),
428
+ y: z5.number()
257
429
  });
258
- var ScenarioGroupSchema = z4.object({
259
- id: z4.string().min(1).max(128),
260
- name: z4.string().min(1).max(200),
261
- description: z4.string().max(1e3).optional(),
262
- color: z4.string().max(32).optional(),
430
+ var ScenarioGroupSchema = z5.object({
431
+ id: z5.string().min(1).max(128),
432
+ name: z5.string().min(1).max(200),
433
+ description: z5.string().max(1e3).optional(),
434
+ color: z5.string().max(32).optional(),
263
435
  position: PositionSchema.default({ x: 0, y: 0 }),
264
- width: z4.number().default(300),
265
- height: z4.number().default(200)
436
+ width: z5.number().default(300),
437
+ height: z5.number().default(200)
266
438
  });
267
- var ScenarioPresetRoleSchema = z4.object({
268
- id: z4.string().min(1).max(64),
269
- name: z4.string().min(1).max(200),
270
- systemPrompt: z4.string().max(1e4).default(""),
271
- prompt: z4.string().max(1e4).default("")
272
- });
273
- var ScenarioPresetInitialDataSchema = z4.object({
274
- leaderId: z4.string().min(1).max(128),
275
- groups: z4.array(z4.object({
276
- id: z4.string().min(1).max(128),
277
- name: z4.string().min(1).max(200),
278
- description: z4.string().max(1e3).optional(),
279
- color: z4.string().max(32).optional(),
280
- position: z4.object({ x: z4.number(), y: z4.number() }).default({ x: 0, y: 0 }),
281
- width: z4.number().default(300),
282
- height: z4.number().default(200)
439
+ var ScenarioPresetRoleSchema = z5.object({
440
+ id: z5.string().min(1).max(64),
441
+ name: z5.string().min(1).max(200),
442
+ systemPrompt: z5.string().max(1e4).default(""),
443
+ prompt: z5.string().max(1e4).default("")
444
+ });
445
+ var ScenarioPresetInitialDataSchema = z5.object({
446
+ leaderId: z5.string().min(1).max(128),
447
+ groups: z5.array(z5.object({
448
+ id: z5.string().min(1).max(128),
449
+ name: z5.string().min(1).max(200),
450
+ description: z5.string().max(1e3).optional(),
451
+ color: z5.string().max(32).optional(),
452
+ position: z5.object({ x: z5.number(), y: z5.number() }).default({ x: 0, y: 0 }),
453
+ width: z5.number().default(300),
454
+ height: z5.number().default(200)
283
455
  })).max(100).default([]),
284
- nodes: z4.array(z4.object({
285
- id: z4.string().min(1).max(128),
286
- type: z4.enum(["ai", "ask"]).default("ai"),
287
- parentIds: z4.array(z4.string().max(128)).default([]),
288
- groupId: z4.string().max(128).nullable().default(null),
289
- label: z4.string().max(240).default(""),
290
- role: z4.string().max(64).default("other"),
291
- prompt: z4.string().max(5e4).default(""),
292
- question: z4.string().max(2e3).default(""),
293
- autoGenerated: z4.boolean().default(true),
294
- canAddNode: z4.boolean().default(false),
295
- aiCli: z4.enum(["claude-code", "codex"]).default("claude-code"),
296
- model: z4.string().max(128).default("sonnet"),
297
- position: z4.object({ x: z4.number(), y: z4.number() }).default({ x: 0, y: 0 })
456
+ nodes: z5.array(z5.object({
457
+ id: z5.string().min(1).max(128),
458
+ type: z5.enum(["ai", "ask"]).default("ai"),
459
+ parentIds: z5.array(z5.string().max(128)).default([]),
460
+ groupId: z5.string().max(128).nullable().default(null),
461
+ label: z5.string().max(240).default(""),
462
+ role: z5.string().max(64).default("other"),
463
+ prompt: z5.string().max(5e4).default(""),
464
+ question: z5.string().max(2e3).default(""),
465
+ autoGenerated: z5.boolean().default(true),
466
+ canAddNode: z5.boolean().default(false),
467
+ aiCli: z5.enum(["claude-code", "codex"]).default("claude-code"),
468
+ model: z5.string().max(128).default("sonnet"),
469
+ position: z5.object({ x: z5.number(), y: z5.number() }).default({ x: 0, y: 0 })
298
470
  })).min(1).max(500)
299
471
  });
300
- var LocalizedStringSchema = z4.record(z4.string(), z4.string().max(100));
301
- var ScenarioPresetLabelsSchema = z4.object({
472
+ var LocalizedStringSchema = z5.record(z5.string(), z5.string().max(100));
473
+ var ScenarioPresetLabelsSchema = z5.object({
302
474
  group: LocalizedStringSchema.optional(),
303
475
  node: LocalizedStringSchema.optional(),
304
476
  role: LocalizedStringSchema.optional(),
305
477
  leader: LocalizedStringSchema.optional()
306
478
  });
307
- var ScenarioPresetSchema = z4.object({
308
- id: z4.string().min(1).max(128),
309
- name: z4.string().min(1).max(200),
310
- icon: z4.string().max(64).optional(),
311
- defaultTraversalMode: z4.enum(["hierarchical", "topological"]).optional(),
312
- canChangeTraversalMode: z4.boolean().default(true),
313
- roles: z4.array(ScenarioPresetRoleSchema).min(1).max(100),
479
+ var ScenarioPresetSchema = z5.object({
480
+ id: z5.string().min(1).max(128),
481
+ name: z5.string().min(1).max(200),
482
+ icon: z5.string().max(64).optional(),
483
+ defaultTraversalMode: z5.enum(["hierarchical", "topological"]).optional(),
484
+ canChangeTraversalMode: z5.boolean().default(true),
485
+ roles: z5.array(ScenarioPresetRoleSchema).min(1).max(100),
314
486
  initialData: ScenarioPresetInitialDataSchema.optional(),
315
487
  labels: ScenarioPresetLabelsSchema.optional()
316
488
  });
317
- var ScenarioNodeSchema = z4.object({
318
- id: z4.string().min(1).max(128),
319
- type: z4.enum(["ai", "ask"]).default("ai"),
320
- parentIds: z4.array(z4.string().max(128)).default([]),
321
- groupId: z4.string().max(128).nullable().default(null),
322
- label: z4.string().max(240).default(""),
323
- role: z4.string().max(64).default("other"),
324
- prompt: z4.string().max(5e4).default(""),
325
- question: z4.string().max(2e3).default(""),
326
- autoGenerated: z4.boolean().default(true),
327
- canAddNode: z4.boolean().default(false),
328
- aiCli: z4.enum(["claude-code", "codex"]).default("claude-code"),
329
- model: z4.string().max(128).default("sonnet"),
489
+ var ScenarioNodeSchema = z5.object({
490
+ id: z5.string().min(1).max(128),
491
+ type: z5.enum(["ai", "ask"]).default("ai"),
492
+ parentIds: z5.array(z5.string().max(128)).default([]),
493
+ groupId: z5.string().max(128).nullable().default(null),
494
+ label: z5.string().max(240).default(""),
495
+ role: z5.string().max(64).default("other"),
496
+ prompt: z5.string().max(5e4).default(""),
497
+ question: z5.string().max(2e3).default(""),
498
+ autoGenerated: z5.boolean().default(true),
499
+ canAddNode: z5.boolean().default(false),
500
+ aiCli: z5.enum(["claude-code", "codex"]).default("claude-code"),
501
+ model: z5.string().max(128).default("sonnet"),
330
502
  position: PositionSchema.default({ x: 0, y: 0 }),
331
- injectParentOutputs: z4.boolean().default(false),
332
- injectedAncestorIds: z4.array(z4.string().max(128)).default([])
503
+ injectParentOutputs: z5.boolean().default(false),
504
+ injectedAncestorIds: z5.array(z5.string().max(128)).default([])
333
505
  });
334
- var ScenarioSchema = z4.object({
335
- id: z4.string().min(1).max(128),
336
- name: z4.string().min(1).max(200),
337
- icon: z4.string().max(64).optional(),
338
- description: z4.string().max(2e3).optional(),
339
- leaderId: z4.string().min(1).max(128),
340
- groups: z4.array(ScenarioGroupSchema).max(100).default([]),
341
- nodes: z4.array(ScenarioNodeSchema).min(1).max(500),
342
- traversalMode: z4.enum(["hierarchical", "topological"]).default("hierarchical"),
343
- presetId: z4.string().max(128).optional(),
344
- isPublished: z4.boolean().default(false),
345
- createdAt: z4.number(),
346
- updatedAt: z4.number()
506
+ var ScenarioSchema = z5.object({
507
+ id: z5.string().min(1).max(128),
508
+ name: z5.string().min(1).max(200),
509
+ icon: z5.string().max(64).optional(),
510
+ description: z5.string().max(2e3).optional(),
511
+ leaderId: z5.string().min(1).max(128),
512
+ groups: z5.array(ScenarioGroupSchema).max(100).default([]),
513
+ nodes: z5.array(ScenarioNodeSchema).min(1).max(500),
514
+ traversalMode: z5.enum(["hierarchical", "topological"]).default("hierarchical"),
515
+ presetId: z5.string().max(128).optional(),
516
+ isPublished: z5.boolean().default(false),
517
+ createdAt: z5.number(),
518
+ updatedAt: z5.number()
347
519
  });
348
520
 
349
521
  // ../../packages/shared/src/schemas/settings.schema.ts
350
522
  var AI_PROVIDERS = ["anthropic", "openai", "mistral", "groq", "ollama"];
351
- var AIProviderSchema = z5.object({
352
- id: z5.string().min(1).max(128),
353
- name: z5.string().min(1).max(200),
354
- provider: z5.enum(AI_PROVIDERS),
355
- encryptedApiKey: z5.string().max(2e3).default(""),
356
- model: z5.string().max(200).optional(),
357
- active: z5.boolean().default(false),
358
- createdAt: z5.coerce.date(),
359
- updatedAt: z5.coerce.date()
360
- });
361
- var JSLogParserSchema = z5.object({
362
- id: z5.string().min(1).max(128),
363
- name: z5.string().min(1).max(200),
364
- description: z5.string().max(2e3).optional(),
365
- code: z5.string().min(1).max(5e4).refine(
523
+ var AIProviderSchema = z6.object({
524
+ id: z6.string().min(1).max(128),
525
+ name: z6.string().min(1).max(200),
526
+ provider: z6.enum(AI_PROVIDERS),
527
+ encryptedApiKey: z6.string().max(2e3).default(""),
528
+ model: z6.string().max(200).optional(),
529
+ active: z6.boolean().default(false),
530
+ createdAt: z6.coerce.date(),
531
+ updatedAt: z6.coerce.date()
532
+ });
533
+ var JSLogParserSchema = z6.object({
534
+ id: z6.string().min(1).max(128),
535
+ name: z6.string().min(1).max(200),
536
+ description: z6.string().max(2e3).optional(),
537
+ code: z6.string().min(1).max(5e4).refine(
366
538
  (s) => !s.includes("require(") && !s.includes("import ") && !s.includes("eval("),
367
539
  { message: "Code must not contain require, import, or eval patterns" }
368
540
  ),
369
- enabled: z5.boolean().default(true),
370
- builtin: z5.boolean().optional(),
371
- createdAt: z5.coerce.date(),
372
- updatedAt: z5.coerce.date()
373
- });
374
- var NotificationPreferencesSchema = z5.object({
375
- scenario_waiting_input: z5.boolean().default(true),
376
- ai_conversation_complete: z5.boolean().default(true),
377
- ai_conversation_error: z5.boolean().default(true),
378
- service_error_log: z5.boolean().default(true),
379
- service_status_changed: z5.boolean().default(true),
380
- service_health_changed: z5.boolean().default(true),
541
+ enabled: z6.boolean().default(true),
542
+ builtin: z6.boolean().optional(),
543
+ createdAt: z6.coerce.date(),
544
+ updatedAt: z6.coerce.date()
545
+ });
546
+ var NotificationPreferencesSchema = z6.object({
547
+ scenario_waiting_input: z6.boolean().default(true),
548
+ ai_conversation_complete: z6.boolean().default(true),
549
+ ai_conversation_error: z6.boolean().default(true),
550
+ service_error_log: z6.boolean().default(true),
551
+ service_status_changed: z6.boolean().default(true),
552
+ service_health_changed: z6.boolean().default(true),
381
553
  /** Service IDs excluded from error-log notifications */
382
- service_error_log_excluded: z5.array(z5.string().max(100)).max(500).default([]),
554
+ service_error_log_excluded: z6.array(z6.string().max(100)).max(500).default([]),
383
555
  /** Service IDs excluded from status-change notifications */
384
- service_status_changed_excluded: z5.array(z5.string().max(100)).max(500).default([]),
556
+ service_status_changed_excluded: z6.array(z6.string().max(100)).max(500).default([]),
385
557
  /** Service IDs excluded from health-change notifications */
386
- service_health_changed_excluded: z5.array(z5.string().max(100)).max(500).default([])
558
+ service_health_changed_excluded: z6.array(z6.string().max(100)).max(500).default([])
387
559
  });
388
- var SettingsSchema = z5.object({
389
- mode: z5.enum(["local-simple", "cloud"]),
390
- cloudUrl: z5.string().url().max(2048).nullable().optional(),
391
- logParsers: z5.array(JSLogParserSchema).max(100).default([]),
392
- scenarios: z5.array(ScenarioSchema).max(100).default([]),
560
+ var SettingsSchema = z6.object({
561
+ mode: z6.enum(["local-simple", "cloud"]),
562
+ cloudUrl: z6.string().url().max(2048).nullable().optional(),
563
+ logParsers: z6.array(JSLogParserSchema).max(100).default([]),
564
+ scenarios: z6.array(ScenarioSchema).max(100).default([]),
393
565
  /** Absolute path to the folder where the global wiki/docs markdown files live. Optional. */
394
- globalDocsPath: z5.string().max(4096).optional()
395
- });
396
- var TraefikConfigSchema = z5.object({
397
- enabled: z5.boolean().default(false),
398
- acmeEmail: z5.string().email().max(256).optional(),
399
- wildcardDomain: z5.string().max(253).optional(),
400
- httpPort: z5.number().int().min(1).max(65535).default(80),
401
- httpsPort: z5.number().int().min(1).max(65535).default(443),
402
- dnsProvider: z5.string().max(64).optional(),
403
- dnsCredentials: z5.record(z5.string().max(64), z5.string().max(2048)).default({}),
404
- acmeStaging: z5.boolean().default(false),
405
- encryptedCert: z5.string().max(65536).optional(),
406
- encryptedCertKey: z5.string().max(65536).optional()
407
- });
408
- var SettingsPrivateSchema = z5.object({
409
- aiProviders: z5.array(AIProviderSchema).max(50).default([]),
410
- scenarios: z5.array(ScenarioSchema).max(100).default([]),
566
+ globalDocsPath: z6.string().max(4096).optional()
567
+ });
568
+ var TraefikConfigSchema = z6.object({
569
+ enabled: z6.boolean().default(false),
570
+ acmeEmail: z6.string().email().max(256).optional(),
571
+ wildcardDomain: z6.string().max(253).optional(),
572
+ httpPort: z6.number().int().min(1).max(65535).default(80),
573
+ httpsPort: z6.number().int().min(1).max(65535).default(443),
574
+ dnsProvider: z6.string().max(64).optional(),
575
+ dnsCredentials: z6.record(z6.string().max(64), z6.string().max(2048)).default({}),
576
+ acmeStaging: z6.boolean().default(false),
577
+ encryptedCert: z6.string().max(65536).optional(),
578
+ encryptedCertKey: z6.string().max(65536).optional()
579
+ });
580
+ var SettingsPrivateSchema = z6.object({
581
+ aiProviders: z6.array(AIProviderSchema).max(50).default([]),
582
+ scenarios: z6.array(ScenarioSchema).max(100).default([]),
411
583
  notifications: NotificationPreferencesSchema.default(() => ({
412
584
  scenario_waiting_input: true,
413
585
  ai_conversation_complete: true,
@@ -421,57 +593,57 @@ var SettingsPrivateSchema = z5.object({
421
593
  })),
422
594
  traefikConfig: TraefikConfigSchema.optional()
423
595
  });
424
- var SchemaVersionSchema = z5.object({
425
- version: z5.number().int().positive(),
426
- migratedAt: z5.coerce.date()
596
+ var SchemaVersionSchema = z6.object({
597
+ version: z6.number().int().positive(),
598
+ migratedAt: z6.coerce.date()
427
599
  });
428
600
 
429
601
  // ../../packages/shared/src/schemas/log-source.schema.ts
430
- import { z as z6 } from "zod";
431
- var safePath = z6.string().min(1).max(4096).refine(
602
+ import { z as z7 } from "zod";
603
+ var safePath = z7.string().min(1).max(4096).refine(
432
604
  (p) => !p.includes("\0"),
433
605
  { message: "path must not contain null bytes" }
434
606
  ).refine(
435
607
  (p) => !/(^|[/\\])\.\.([/\\]|$)/.test(p),
436
608
  { message: "path must not contain path-traversal sequences (..)" }
437
609
  );
438
- var ConsoleLogSourceSchema = z6.object({
439
- type: z6.literal("console")
610
+ var ConsoleLogSourceSchema = z7.object({
611
+ type: z7.literal("console")
440
612
  });
441
- var FileLogSourceSchema = z6.object({
442
- type: z6.literal("file"),
613
+ var FileLogSourceSchema = z7.object({
614
+ type: z7.literal("file"),
443
615
  path: safePath,
444
- encoding: z6.string().max(32).default("utf-8"),
445
- startFromEnd: z6.boolean().default(true),
446
- createIfNotExists: z6.boolean().default(false)
616
+ encoding: z7.string().max(32).default("utf-8"),
617
+ startFromEnd: z7.boolean().default(true),
618
+ createIfNotExists: z7.boolean().default(false)
447
619
  });
448
- var MongoLogSourceSchema = z6.object({
449
- type: z6.literal("mongo"),
620
+ var MongoLogSourceSchema = z7.object({
621
+ type: z7.literal("mongo"),
450
622
  /** @sensitive — stored encrypted (AES-256-GCM) on disk */
451
- connectionString: z6.string().min(1).max(2048),
452
- database: z6.string().min(1).max(256),
453
- collection: z6.string().min(1).max(256),
454
- filter: z6.record(z6.string(), z6.unknown()).optional(),
455
- timestampField: z6.string().max(128).default("timestamp"),
456
- messageField: z6.string().max(128).default("message"),
457
- levelField: z6.string().max(128).optional()
458
- });
459
- var MySQLLogSourceSchema = z6.object({
460
- type: z6.literal("mysql"),
461
- host: z6.string().min(1).max(253),
462
- port: z6.number().int().min(1).max(65535).default(3306),
463
- user: z6.string().min(1).max(256),
623
+ connectionString: z7.string().min(1).max(2048),
624
+ database: z7.string().min(1).max(256),
625
+ collection: z7.string().min(1).max(256),
626
+ filter: z7.record(z7.string(), z7.unknown()).optional(),
627
+ timestampField: z7.string().max(128).default("timestamp"),
628
+ messageField: z7.string().max(128).default("message"),
629
+ levelField: z7.string().max(128).optional()
630
+ });
631
+ var MySQLLogSourceSchema = z7.object({
632
+ type: z7.literal("mysql"),
633
+ host: z7.string().min(1).max(253),
634
+ port: z7.number().int().min(1).max(65535).default(3306),
635
+ user: z7.string().min(1).max(256),
464
636
  /** @sensitive — stored encrypted (AES-256-GCM) on disk */
465
- password: z6.string().max(2048),
466
- database: z6.string().min(1).max(256),
467
- table: z6.string().min(1).max(256),
468
- query: z6.string().max(8192).optional(),
469
- timestampColumn: z6.string().max(128).default("created_at"),
470
- messageColumn: z6.string().max(128).default("message"),
471
- levelColumn: z6.string().max(128).optional(),
472
- pollIntervalMs: z6.number().int().min(500).max(6e4).default(2e3)
473
- });
474
- var LogSourceConfigSchema = z6.discriminatedUnion("type", [
637
+ password: z7.string().max(2048),
638
+ database: z7.string().min(1).max(256),
639
+ table: z7.string().min(1).max(256),
640
+ query: z7.string().max(8192).optional(),
641
+ timestampColumn: z7.string().max(128).default("created_at"),
642
+ messageColumn: z7.string().max(128).default("message"),
643
+ levelColumn: z7.string().max(128).optional(),
644
+ pollIntervalMs: z7.number().int().min(500).max(6e4).default(2e3)
645
+ });
646
+ var LogSourceConfigSchema = z7.discriminatedUnion("type", [
475
647
  ConsoleLogSourceSchema,
476
648
  FileLogSourceSchema,
477
649
  MongoLogSourceSchema,
@@ -479,293 +651,293 @@ var LogSourceConfigSchema = z6.discriminatedUnion("type", [
479
651
  ]);
480
652
 
481
653
  // ../../packages/shared/src/schemas/service.schema.ts
482
- var HealthCheckSchema = z7.object({
483
- type: z7.enum(["http", "command"]).default("http"),
654
+ var HealthCheckSchema = z8.object({
655
+ type: z8.enum(["http", "command"]).default("http"),
484
656
  // HTTP-specific (required when type=http)
485
- path: z7.string().min(1).max(500).startsWith("/").optional(),
486
- method: z7.enum(["GET", "HEAD", "POST", "PUT"]).optional().default("GET"),
487
- expectedStatus: z7.number().int().min(100).max(599).optional().default(200),
657
+ path: z8.string().min(1).max(500).startsWith("/").optional(),
658
+ method: z8.enum(["GET", "HEAD", "POST", "PUT"]).optional().default("GET"),
659
+ expectedStatus: z8.number().int().min(100).max(599).optional().default(200),
488
660
  // Command-specific (required when type=command)
489
- command: z7.string().min(1).max(4096).optional(),
661
+ command: z8.string().min(1).max(4096).optional(),
490
662
  // Shared
491
- interval: z7.number().int().positive().default(1e3),
492
- timeout: z7.number().int().positive().default(1e3),
493
- retries: z7.number().int().nonnegative().default(3),
494
- initialDelay: z7.number().int().nonnegative().optional().default(0)
663
+ interval: z8.number().int().positive().default(1e3),
664
+ timeout: z8.number().int().positive().default(1e3),
665
+ retries: z8.number().int().nonnegative().default(3),
666
+ initialDelay: z8.number().int().nonnegative().optional().default(0)
495
667
  }).refine(
496
668
  (data) => data.type === "http" ? !!data.path : !!data.command,
497
669
  { message: "HTTP type requires path; command type requires command" }
498
670
  );
499
- var BootstrapCommandSchema = z7.object({
500
- id: z7.string().min(1).max(64),
501
- label: z7.string().max(200).default(""),
502
- entrypoint: z7.string().max(4096).optional(),
503
- command: z7.string().max(4096).default(""),
504
- user: z7.string().max(256).optional()
505
- });
506
- var DockerConfigSchema = z7.object({
671
+ var BootstrapCommandSchema = z8.object({
672
+ id: z8.string().min(1).max(64),
673
+ label: z8.string().max(200).default(""),
674
+ entrypoint: z8.string().max(4096).optional(),
675
+ command: z8.string().max(4096).default(""),
676
+ user: z8.string().max(256).optional()
677
+ });
678
+ var DockerConfigSchema = z8.object({
507
679
  // Image mode (pull from registry) — mutually exclusive with build mode in UI
508
- image: z7.string().min(1).max(1024).optional(),
680
+ image: z8.string().min(1).max(1024).optional(),
509
681
  // Build mode — Dockerfile stored inline in services.json
510
- dockerfile: z7.string().max(65536).optional(),
511
- buildContext: z7.string().max(4096).optional(),
512
- buildArgs: z7.record(z7.string().max(256), z7.string().max(4096)).default({}).refine(
682
+ dockerfile: z8.string().max(65536).optional(),
683
+ buildContext: z8.string().max(4096).optional(),
684
+ buildArgs: z8.record(z8.string().max(256), z8.string().max(4096)).default({}).refine(
513
685
  (obj) => Object.keys(obj).length <= 50,
514
686
  { message: "Max 50 build args" }
515
687
  ),
516
- targetStage: z7.string().max(256).optional(),
688
+ targetStage: z8.string().max(256).optional(),
517
689
  // Runtime config
518
- networkMode: z7.enum(["host", "bridge"]).default("host"),
519
- ports: z7.array(z7.string().max(64)).max(100).default([]),
520
- volumes: z7.array(z7.string().max(1024)).max(100).default([]),
521
- mountRootpath: z7.boolean().default(false),
522
- entrypoint: z7.string().max(4096).optional(),
523
- command: z7.string().max(4096).optional(),
524
- user: z7.string().max(256).optional(),
525
- useNativeCommand: z7.boolean().default(false),
526
- nativeCommandMode: z7.enum(["shared", "isolated"]).default("isolated"),
527
- nativeShell: z7.string().max(256).default("sh"),
528
- bootstrapCommands: z7.array(BootstrapCommandSchema).max(20).default([])
529
- });
530
- var RestartStrategySchema = z7.enum(["none", "on-failure", "always", "unless-stopped"]).default("none");
531
- var ServiceShortcutSchema = z7.object({
532
- id: z7.string().min(1).max(64),
533
- label: z7.string().max(200).default(""),
534
- command: z7.string().max(4096).default(""),
535
- cwd: z7.string().max(4096).optional()
536
- });
537
- var ServiceCommandSchema = z7.object({
538
- id: z7.string().min(1).max(64),
539
- label: z7.string().max(200).default(""),
540
- command: z7.string().max(4096).default(""),
541
- cwd: z7.string().max(4096).optional(),
542
- shell: z7.boolean().optional().default(true)
543
- });
544
- var VariableSlotSchema = z7.object({
545
- value: z7.string().max(8192).default(""),
546
- pre: z7.string().max(8192).default(""),
547
- post: z7.string().max(8192).default(""),
548
- isSecret: z7.boolean().default(false),
690
+ networkMode: z8.enum(["host", "bridge"]).default("host"),
691
+ ports: z8.array(z8.string().max(64)).max(100).default([]),
692
+ volumes: z8.array(z8.string().max(1024)).max(100).default([]),
693
+ mountRootpath: z8.boolean().default(false),
694
+ entrypoint: z8.string().max(4096).optional(),
695
+ command: z8.string().max(4096).optional(),
696
+ user: z8.string().max(256).optional(),
697
+ useNativeCommand: z8.boolean().default(false),
698
+ nativeCommandMode: z8.enum(["shared", "isolated"]).default("isolated"),
699
+ nativeShell: z8.string().max(256).default("sh"),
700
+ bootstrapCommands: z8.array(BootstrapCommandSchema).max(20).default([])
701
+ });
702
+ var RestartStrategySchema = z8.enum(["none", "on-failure", "always", "unless-stopped"]).default("none");
703
+ var ServiceShortcutSchema = z8.object({
704
+ id: z8.string().min(1).max(64),
705
+ label: z8.string().max(200).default(""),
706
+ command: z8.string().max(4096).default(""),
707
+ cwd: z8.string().max(4096).optional()
708
+ });
709
+ var ServiceCommandSchema = z8.object({
710
+ id: z8.string().min(1).max(64),
711
+ label: z8.string().max(200).default(""),
712
+ command: z8.string().max(4096).default(""),
713
+ cwd: z8.string().max(4096).optional(),
714
+ shell: z8.boolean().optional().default(true)
715
+ });
716
+ var VariableSlotSchema = z8.object({
717
+ value: z8.string().max(8192).default(""),
718
+ pre: z8.string().max(8192).default(""),
719
+ post: z8.string().max(8192).default(""),
720
+ isSecret: z8.boolean().default(false),
549
721
  // When true, this variable is injected into the process environment of AI
550
722
  // agents (Claude Code, Codex, …) spawned while this environment is active.
551
723
  // Opt-in: defaults to false so secrets are never leaked to AI agents by default.
552
- injectIntoAi: z7.boolean().default(false)
724
+ injectIntoAi: z8.boolean().default(false)
553
725
  });
554
- var VariableSchema = z7.object({
555
- key: z7.string().min(1).max(256),
726
+ var VariableSchema = z8.object({
727
+ key: z8.string().min(1).max(256),
556
728
  value: VariableSlotSchema
557
729
  });
558
- var VariablesRecordSchema = z7.record(
559
- z7.string().max(128),
730
+ var VariablesRecordSchema = z8.record(
731
+ z8.string().max(128),
560
732
  VariableSchema
561
733
  ).refine(
562
734
  (obj) => Object.keys(obj).length <= 200,
563
735
  { message: "Max 200 variables" }
564
736
  );
565
- var VariableSlotsRecordSchema = z7.record(
566
- z7.string().max(256),
737
+ var VariableSlotsRecordSchema = z8.record(
738
+ z8.string().max(256),
567
739
  VariableSlotSchema
568
740
  ).refine(
569
741
  (obj) => Object.keys(obj).length <= 200,
570
742
  { message: "Max 200 variable slots" }
571
743
  );
572
- var ServiceConfigSchema = z7.object({
573
- id: z7.string().max(128),
574
- orgId: z7.string().max(128).nullable().optional(),
575
- agentId: z7.string().max(128).optional(),
744
+ var ServiceConfigSchema = z8.object({
745
+ id: z8.string().max(128),
746
+ orgId: z8.string().max(128).nullable().optional(),
747
+ agentId: z8.string().max(128).optional(),
576
748
  // Optional: if absent, inherited from active environment's agentId
577
- name: z7.string().min(1).max(200),
578
- commands: z7.array(ServiceCommandSchema).max(50).optional().default([]),
579
- cwd: z7.string().max(4096).optional(),
580
- ports: z7.array(z7.number().int().positive().max(65535)).max(20).optional().default([]),
749
+ name: z8.string().min(1).max(200),
750
+ commands: z8.array(ServiceCommandSchema).max(50).optional().default([]),
751
+ cwd: z8.string().max(4096).optional(),
752
+ ports: z8.array(z8.number().int().positive().max(65535)).max(20).optional().default([]),
581
753
  // Metadata fields (migration from old Runeya)
582
- groups: z7.array(z7.string().max(200)).max(20).optional().default([]),
583
- description: z7.string().max(2e3).optional(),
754
+ groups: z8.array(z8.string().max(200)).max(20).optional().default([]),
755
+ description: z8.string().max(2e3).optional(),
584
756
  /** Path (relative to service.cwd or absolute) where the service's docs/wiki markdown files live. Optional — defaults to service.cwd. */
585
- docsPath: z7.string().max(4096).optional(),
586
- url: z7.string().max(2048).optional(),
587
- localUrls: z7.array(z7.object({
588
- url: z7.string().max(253).regex(/^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/),
589
- port: z7.number().int().min(1).max(65535)
757
+ docsPath: z8.string().max(4096).optional(),
758
+ url: z8.string().max(2048).optional(),
759
+ localUrls: z8.array(z8.object({
760
+ url: z8.string().max(253).regex(/^([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$/),
761
+ port: z8.number().int().min(1).max(65535)
590
762
  })).max(20).optional().default([]),
591
- openapiUrl: z7.string().max(2048).optional(),
592
- git: z7.object({
593
- remote: z7.string().max(2048).optional(),
594
- home: z7.string().max(2048).optional()
763
+ openapiUrl: z8.string().max(2048).optional(),
764
+ git: z8.object({
765
+ remote: z8.string().max(2048).optional(),
766
+ home: z8.string().max(2048).optional()
595
767
  }).optional(),
596
- meta: z7.record(z7.string().max(256), z7.string().max(2e3)).optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
768
+ meta: z8.record(z8.string().max(256), z8.string().max(2e3)).optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
597
769
  // Transient env dict (resolved by server before deployment, used directly by agent runner — NOT persisted)
598
- env: z7.record(z7.string().max(256), z7.string().max(8192)).default({}).refine(
770
+ env: z8.record(z8.string().max(256), z8.string().max(8192)).default({}).refine(
599
771
  (obj) => Object.keys(obj).length <= 200,
600
772
  { message: "Too many env vars (max 200)" }
601
773
  ),
602
- envSecrets: z7.array(z7.string().max(256)).max(200).default([]),
774
+ envSecrets: z8.array(z8.string().max(256)).max(200).default([]),
603
775
  // Transient: resolved JS log parsers (from parserIds, resolved by server before deployment — NOT persisted)
604
- resolvedLogParsers: z7.array(JSLogParserSchema).default([]).optional(),
776
+ resolvedLogParsers: z8.array(JSLogParserSchema).default([]).optional(),
605
777
  // Transient: resolved working directory (cwd with env vars expanded — NOT persisted)
606
- resolvedCwd: z7.string().optional(),
607
- runner: z7.enum(["native", "docker"]).optional().default("native"),
778
+ resolvedCwd: z8.string().optional(),
779
+ runner: z8.enum(["native", "docker"]).optional().default("native"),
608
780
  dockerConfig: DockerConfigSchema.optional(),
609
781
  healthCheck: HealthCheckSchema.optional(),
610
- parserIds: z7.array(z7.string().max(128)).max(50).default([]),
611
- shortcuts: z7.array(ServiceShortcutSchema).max(50).optional().default([]),
612
- autoRestart: z7.boolean().optional().default(false),
613
- clearLogsOnStart: z7.boolean().optional().default(false),
782
+ parserIds: z8.array(z8.string().max(128)).max(50).default([]),
783
+ shortcuts: z8.array(ServiceShortcutSchema).max(50).optional().default([]),
784
+ autoRestart: z8.boolean().optional().default(false),
785
+ clearLogsOnStart: z8.boolean().optional().default(false),
614
786
  restartStrategy: RestartStrategySchema.optional(),
615
- maxRestarts: z7.number().int().nonnegative().optional(),
616
- restartBackoffMs: z7.number().int().positive().optional().default(1e3),
787
+ maxRestarts: z8.number().int().nonnegative().optional(),
788
+ restartBackoffMs: z8.number().int().positive().optional().default(1e3),
617
789
  // Log sources additionnelles (au-delà du stdout/stderr console par défaut)
618
- logSources: z7.array(LogSourceConfigSchema).max(20).optional().default([])
790
+ logSources: z8.array(LogSourceConfigSchema).max(20).optional().default([])
619
791
  });
620
792
  var CreateServiceSchema = ServiceConfigSchema.omit({ id: true }).partial().required({ name: true });
621
793
  var UpdateServiceSchema = ServiceConfigSchema.partial().required({ id: true }).extend({
622
- agentId: z7.string().max(128).nullable().optional(),
794
+ agentId: z8.string().max(128).nullable().optional(),
623
795
  // null = clear (inherit from env), undefined = no change
624
- cwd: z7.string().max(4096).nullable().optional(),
625
- git: z7.object({ remote: z7.string().max(2048).optional(), home: z7.string().max(2048).optional() }).nullable().optional(),
626
- meta: z7.record(z7.string().max(256), z7.string().max(2e3)).nullable().optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
796
+ cwd: z8.string().max(4096).nullable().optional(),
797
+ git: z8.object({ remote: z8.string().max(2048).optional(), home: z8.string().max(2048).optional() }).nullable().optional(),
798
+ meta: z8.record(z8.string().max(256), z8.string().max(2e3)).nullable().optional().refine((obj) => !obj || Object.keys(obj).length <= 100, { message: "Too many meta keys (max 100)" }),
627
799
  healthCheck: HealthCheckSchema.nullable().optional()
628
800
  });
629
801
 
630
802
  // ../../packages/shared/src/schemas/process.schema.ts
631
- import { z as z8 } from "zod";
632
- var ProcessStateSchema = z8.enum(["starting", "running", "stopped", "errored"]);
633
- var HealthStatusSchema = z8.enum(["healthy", "unhealthy", "unknown"]);
634
- var ProcessStatusSchema = z8.object({
635
- id: z8.string().max(128),
636
- serviceId: z8.string().max(128),
637
- agentId: z8.string().max(128),
803
+ import { z as z9 } from "zod";
804
+ var ProcessStateSchema = z9.enum(["starting", "running", "stopped", "errored"]);
805
+ var HealthStatusSchema = z9.enum(["healthy", "unhealthy", "unknown"]);
806
+ var ProcessStatusSchema = z9.object({
807
+ id: z9.string().max(128),
808
+ serviceId: z9.string().max(128),
809
+ agentId: z9.string().max(128),
638
810
  state: ProcessStateSchema,
639
- pid: z8.number().int().nullable().optional(),
640
- pids: z8.array(z8.number().int()).optional().default([]),
641
- exitCode: z8.number().int().nullable().optional(),
642
- startedAt: z8.coerce.date().nullable().optional(),
643
- restartCount: z8.number().int().nonnegative().default(0),
644
- uptime: z8.number().nonnegative().default(0),
811
+ pid: z9.number().int().nullable().optional(),
812
+ pids: z9.array(z9.number().int()).optional().default([]),
813
+ exitCode: z9.number().int().nullable().optional(),
814
+ startedAt: z9.coerce.date().nullable().optional(),
815
+ restartCount: z9.number().int().nonnegative().default(0),
816
+ uptime: z9.number().nonnegative().default(0),
645
817
  healthStatus: HealthStatusSchema.default("unknown")
646
818
  });
647
819
 
648
820
  // ../../packages/shared/src/schemas/log.schema.ts
649
- import { z as z9 } from "zod";
650
- var LogLevelSchema = z9.enum(["debug", "info", "warn", "error", "fatal"]);
651
- var LogLineSchema = z9.object({
821
+ import { z as z10 } from "zod";
822
+ var LogLevelSchema = z10.enum(["debug", "info", "warn", "error", "fatal"]);
823
+ var LogLineSchema = z10.object({
652
824
  /** Raw log line as received from the process (immutable context) */
653
- raw: z9.string(),
825
+ raw: z10.string(),
654
826
  /** Source stream (immutable context) */
655
- stream: z9.enum(["stdout", "stderr"]),
827
+ stream: z10.enum(["stdout", "stderr"]),
656
828
  /** Severity level */
657
829
  level: LogLevelSchema,
658
830
  /** Parsed/enriched message to display */
659
- message: z9.string(),
831
+ message: z10.string(),
660
832
  /** When true, the line is hidden from the log view */
661
- hidden: z9.boolean(),
833
+ hidden: z10.boolean(),
662
834
  /** Arbitrary key/value pairs shown in the detail panel */
663
- metadata: z9.record(z9.string().max(256), z9.unknown()).refine(
835
+ metadata: z10.record(z10.string().max(256), z10.unknown()).refine(
664
836
  (obj) => Object.keys(obj).length <= 100,
665
837
  { message: "Too many metadata keys (max 100)" }
666
838
  ),
667
839
  /** Full parsed JSON object when the line is JSON */
668
- json: z9.record(z9.string(), z9.unknown()).optional(),
840
+ json: z10.record(z10.string(), z10.unknown()).optional(),
669
841
  /** Custom header for the JSON log card (supports HTML, sanitized before display) */
670
- jsonHeader: z9.string().max(256).optional()
842
+ jsonHeader: z10.string().max(256).optional()
671
843
  });
672
- var LogCardDirectiveSchema = z9.object({
673
- id: z9.string().max(128),
674
- type: z9.string().max(64),
675
- header: z9.string().max(256),
676
- collapsable: z9.boolean().optional(),
677
- collapsed: z9.boolean().optional(),
678
- state: z9.enum(["open", "append", "close", "self"])
844
+ var LogCardDirectiveSchema = z10.object({
845
+ id: z10.string().max(128),
846
+ type: z10.string().max(64),
847
+ header: z10.string().max(256),
848
+ collapsable: z10.boolean().optional(),
849
+ collapsed: z10.boolean().optional(),
850
+ state: z10.enum(["open", "append", "close", "self"])
679
851
  });
680
- var ParsedLogSchema = z9.object({
681
- id: z9.string().max(128),
682
- processId: z9.string().max(128),
683
- pid: z9.number().int().nullable().optional(),
684
- timestamp: z9.coerce.date(),
852
+ var ParsedLogSchema = z10.object({
853
+ id: z10.string().max(128),
854
+ processId: z10.string().max(128),
855
+ pid: z10.number().int().nullable().optional(),
856
+ timestamp: z10.coerce.date(),
685
857
  level: LogLevelSchema.default("info"),
686
- message: z9.string().max(16384),
687
- raw: z9.string().max(16384),
688
- stream: z9.enum(["stdout", "stderr"]).default("stdout"),
689
- hidden: z9.boolean().optional().default(false),
690
- metadata: z9.record(z9.string().max(256), z9.unknown()).optional().refine(
858
+ message: z10.string().max(16384),
859
+ raw: z10.string().max(16384),
860
+ stream: z10.enum(["stdout", "stderr"]).default("stdout"),
861
+ hidden: z10.boolean().optional().default(false),
862
+ metadata: z10.record(z10.string().max(256), z10.unknown()).optional().refine(
691
863
  (obj) => !obj || Object.keys(obj).length <= 100,
692
864
  { message: "Too many metadata keys (max 100)" }
693
865
  ),
694
- json: z9.record(z9.string(), z9.unknown()).optional(),
866
+ json: z10.record(z10.string(), z10.unknown()).optional(),
695
867
  logCard: LogCardDirectiveSchema.optional(),
696
- sourceType: z9.enum(["console", "file", "mongo", "mysql"]).optional(),
697
- sourcePath: z9.string().max(4096).optional()
868
+ sourceType: z10.enum(["console", "file", "mongo", "mysql"]).optional(),
869
+ sourcePath: z10.string().max(4096).optional()
698
870
  });
699
871
 
700
872
  // ../../packages/shared/src/schemas/agent.schema.ts
701
- import { z as z10 } from "zod";
873
+ import { z as z11 } from "zod";
702
874
  var ENV_VAR_NAME_REGEX = /^[A-Za-z_][A-Za-z0-9_]*$/;
703
- var AgentConfigSchema = z10.object({
704
- id: z10.string().max(128),
705
- name: z10.string().min(1).max(100),
706
- url: z10.string().url().max(2048),
707
- passphrase: z10.string().min(1).max(1024),
708
- passthroughEnv: z10.array(
709
- z10.string().regex(ENV_VAR_NAME_REGEX).max(256)
875
+ var AgentConfigSchema = z11.object({
876
+ id: z11.string().max(128),
877
+ name: z11.string().min(1).max(100),
878
+ url: z11.string().url().max(2048),
879
+ passphrase: z11.string().min(1).max(1024),
880
+ passthroughEnv: z11.array(
881
+ z11.string().regex(ENV_VAR_NAME_REGEX).max(256)
710
882
  ).max(100).default([])
711
883
  });
712
- var AgentStatusSchema = z10.object({
713
- connected: z10.boolean(),
714
- lastSeen: z10.string().nullable().optional(),
715
- uptime: z10.number().nonnegative().default(0),
716
- runnersAvailable: z10.array(z10.enum(["native", "docker"])).default(["native"]),
717
- lanIp: z10.string().optional()
884
+ var AgentStatusSchema = z11.object({
885
+ connected: z11.boolean(),
886
+ lastSeen: z11.string().nullable().optional(),
887
+ uptime: z11.number().nonnegative().default(0),
888
+ runnersAvailable: z11.array(z11.enum(["native", "docker"])).default(["native"]),
889
+ lanIp: z11.string().optional()
718
890
  });
719
891
 
720
892
  // ../../packages/shared/src/schemas/permission.schema.ts
721
- import { z as z11 } from "zod";
722
- var GlobalRoleSchema = z11.enum(["owner", "admin", "member"]);
723
- var ProjectRoleSchema = z11.enum(["admin", "editor", "viewer"]);
724
- var ProjectMemberRoleSchema = z11.object({
725
- id: z11.string().max(128),
726
- projectId: z11.string().max(128),
727
- userId: z11.string().max(128),
893
+ import { z as z12 } from "zod";
894
+ var GlobalRoleSchema = z12.enum(["owner", "admin", "member"]);
895
+ var ProjectRoleSchema = z12.enum(["admin", "editor", "viewer"]);
896
+ var ProjectMemberRoleSchema = z12.object({
897
+ id: z12.string().max(128),
898
+ projectId: z12.string().max(128),
899
+ userId: z12.string().max(128),
728
900
  role: ProjectRoleSchema
729
901
  });
730
902
 
731
903
  // ../../packages/shared/src/schemas/sync.schema.ts
732
- import { z as z12 } from "zod";
733
- var ConfigVersionSchema = z12.object({
734
- id: z12.string().max(128),
735
- entityType: z12.enum(["project", "service"]),
736
- entityId: z12.string().max(128),
737
- version: z12.string().max(128),
738
- parentVersion: z12.string().max(128),
739
- data: z12.record(z12.string(), z12.unknown()).refine(
904
+ import { z as z13 } from "zod";
905
+ var ConfigVersionSchema = z13.object({
906
+ id: z13.string().max(128),
907
+ entityType: z13.enum(["project", "service"]),
908
+ entityId: z13.string().max(128),
909
+ version: z13.string().max(128),
910
+ parentVersion: z13.string().max(128),
911
+ data: z13.record(z13.string(), z13.unknown()).refine(
740
912
  (obj) => Object.keys(obj).length <= 1e3,
741
913
  "Too many data keys (max 1000)"
742
914
  ),
743
- patch: z12.array(z12.record(z12.string(), z12.unknown())).max(1e3),
744
- userId: z12.string().max(128),
745
- timestamp: z12.coerce.date(),
746
- resolved: z12.boolean().default(false)
747
- });
748
- var ConfigChangeSchema = z12.object({
749
- entityType: z12.enum(["project", "service"]),
750
- entityId: z12.string().max(128),
751
- version: z12.string().max(128),
752
- parentVersion: z12.string().max(128),
753
- data: z12.record(z12.string(), z12.unknown()).refine(
915
+ patch: z13.array(z13.record(z13.string(), z13.unknown())).max(1e3),
916
+ userId: z13.string().max(128),
917
+ timestamp: z13.coerce.date(),
918
+ resolved: z13.boolean().default(false)
919
+ });
920
+ var ConfigChangeSchema = z13.object({
921
+ entityType: z13.enum(["project", "service"]),
922
+ entityId: z13.string().max(128),
923
+ version: z13.string().max(128),
924
+ parentVersion: z13.string().max(128),
925
+ data: z13.record(z13.string(), z13.unknown()).refine(
754
926
  (obj) => Object.keys(obj).length <= 1e3,
755
927
  "Too many data keys (max 1000)"
756
928
  ),
757
- patch: z12.array(z12.record(z12.string(), z12.unknown())).max(1e3)
929
+ patch: z13.array(z13.record(z13.string(), z13.unknown())).max(1e3)
758
930
  });
759
- var SyncStatusSchema = z12.object({
760
- connected: z12.boolean(),
761
- lastSync: z12.coerce.date().nullable().optional(),
762
- pendingChanges: z12.number().int().nonnegative().default(0),
763
- conflicts: z12.number().int().nonnegative().default(0)
931
+ var SyncStatusSchema = z13.object({
932
+ connected: z13.boolean(),
933
+ lastSync: z13.coerce.date().nullable().optional(),
934
+ pendingChanges: z13.number().int().nonnegative().default(0),
935
+ conflicts: z13.number().int().nonnegative().default(0)
764
936
  });
765
937
 
766
938
  // ../../packages/shared/src/schemas/audit.schema.ts
767
- import { z as z13 } from "zod";
768
- var AuditActionSchema = z13.enum([
939
+ import { z as z14 } from "zod";
940
+ var AuditActionSchema = z14.enum([
769
941
  "create",
770
942
  "update",
771
943
  "delete",
@@ -776,112 +948,122 @@ var AuditActionSchema = z13.enum([
776
948
  "stop",
777
949
  "roleChange"
778
950
  ]);
779
- var AuditEntityTypeSchema = z13.enum([
951
+ var AuditEntityTypeSchema = z14.enum([
780
952
  "org",
781
953
  "project",
782
954
  "service",
783
955
  "member",
784
956
  "permission"
785
957
  ]);
786
- var AuditLogSchema = z13.object({
787
- id: z13.string().max(128),
788
- orgId: z13.string().max(128),
789
- userId: z13.string().max(128),
958
+ var AuditLogSchema = z14.object({
959
+ id: z14.string().max(128),
960
+ orgId: z14.string().max(128),
961
+ userId: z14.string().max(128),
790
962
  action: AuditActionSchema,
791
963
  entityType: AuditEntityTypeSchema,
792
- entityId: z13.string().max(128),
793
- metadata: z13.record(z13.string().max(256), z13.unknown()).default({}).refine(
964
+ entityId: z14.string().max(128),
965
+ metadata: z14.record(z14.string().max(256), z14.unknown()).default({}).refine(
794
966
  (obj) => Object.keys(obj).length <= 100,
795
967
  { message: "Too many metadata keys (max 100)" }
796
968
  ),
797
- timestamp: z13.coerce.date()
969
+ timestamp: z14.coerce.date()
798
970
  });
799
971
 
800
972
  // ../../packages/shared/src/schemas/metrics.schema.ts
801
- import { z as z14 } from "zod";
802
- var ProcessMetricsSchema = z14.object({
803
- processId: z14.string().max(128),
804
- cpu: z14.number().nonnegative(),
805
- memory: z14.number().int().nonnegative(),
806
- timestamp: z14.string()
973
+ import { z as z15 } from "zod";
974
+ var ProcessMetricsSchema = z15.object({
975
+ processId: z15.string().max(128),
976
+ cpu: z15.number().nonnegative(),
977
+ memory: z15.number().int().nonnegative(),
978
+ timestamp: z15.string()
807
979
  });
808
980
 
809
981
  // ../../packages/shared/src/schemas/environment.schema.ts
810
- import { z as z15 } from "zod";
811
- var EnvironmentVariablesSchema = z15.record(
812
- z15.string().max(256),
982
+ import { z as z16 } from "zod";
983
+ var EnvironmentVariablesSchema = z16.record(
984
+ z16.string().max(256),
813
985
  VariableSchema
814
986
  ).refine(
815
987
  (obj) => Object.keys(obj).length <= 200,
816
988
  { message: "Max 200 variables" }
817
989
  );
818
- var EnvironmentSchema = z15.object({
819
- id: z15.string().max(128),
820
- projectId: z15.string().max(128),
821
- name: z15.string().min(1).max(200),
822
- description: z15.string().max(2e3).optional().default(""),
823
- parentIds: z15.array(z15.string().max(128)).max(10).default([]),
990
+ var EnvironmentSchema = z16.object({
991
+ id: z16.string().max(128),
992
+ projectId: z16.string().max(128),
993
+ name: z16.string().min(1).max(200),
994
+ description: z16.string().max(2e3).optional().default(""),
995
+ parentIds: z16.array(z16.string().max(128)).max(10).default([]),
824
996
  variables: EnvironmentVariablesSchema.default({}),
825
997
  // Scope: 'global' = project-level env, 'service' = per-service env
826
- scope: z15.enum(["global", "service"]).default("global"),
998
+ scope: z16.enum(["global", "service"]).default("global"),
827
999
  // When scope='service': the serviceId this env belongs to
828
- reference: z15.string().max(128).optional(),
1000
+ reference: z16.string().max(128).optional(),
829
1001
  // When scope='service': the globalEnvId this env activates on
830
- activateOn: z15.string().max(128).optional(),
831
- immutable: z15.boolean().default(false),
832
- default: z15.boolean().optional().default(false),
833
- color: z15.string().max(20).optional(),
834
- bgColor: z15.string().max(20).optional(),
1002
+ activateOn: z16.string().max(128).optional(),
1003
+ immutable: z16.boolean().default(false),
1004
+ default: z16.boolean().optional().default(false),
1005
+ color: z16.string().max(20).optional(),
1006
+ bgColor: z16.string().max(20).optional(),
835
1007
  // When scope='global': the default agent used by services that don't have an explicit agentId
836
- agentId: z15.string().max(128).optional()
837
- });
838
- var ResolvedEnvironmentSchema = z15.object({
839
- variables: z15.record(z15.string().max(256), VariableSchema).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 resolved variables" }),
840
- env: z15.record(z15.string().max(256), z15.string().max(8192)).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 resolved env vars" }),
841
- envSecrets: z15.array(z15.string().max(256)).max(500),
842
- sources: z15.record(z15.string().max(256), z15.object({
843
- environmentId: z15.string().max(128),
844
- environmentName: z15.string().max(200),
845
- overridden: z15.boolean(),
846
- resolvedFrom: z15.object({
847
- environmentId: z15.string().max(128),
848
- environmentName: z15.string().max(200)
1008
+ agentId: z16.string().max(128).optional()
1009
+ });
1010
+ var ResolvedEnvironmentSchema = z16.object({
1011
+ variables: z16.record(z16.string().max(256), VariableSchema).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 resolved variables" }),
1012
+ env: z16.record(z16.string().max(256), z16.string().max(8192)).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 resolved env vars" }),
1013
+ envSecrets: z16.array(z16.string().max(256)).max(500),
1014
+ sources: z16.record(z16.string().max(256), z16.object({
1015
+ environmentId: z16.string().max(128),
1016
+ environmentName: z16.string().max(200),
1017
+ overridden: z16.boolean(),
1018
+ resolvedFrom: z16.object({
1019
+ environmentId: z16.string().max(128),
1020
+ environmentName: z16.string().max(200)
1021
+ }).optional(),
1022
+ // Set when a machine-local override was applied to this variable, pointing
1023
+ // at the environment that carries the winning override. Distinct from
1024
+ // `overridden`, which also covers "shadows an inherited variable".
1025
+ overriddenBy: z16.object({
1026
+ environmentId: z16.string().max(128),
1027
+ environmentName: z16.string().max(200)
849
1028
  }).optional()
850
1029
  })).refine((obj) => Object.keys(obj).length <= 500, { message: "Max 500 source entries" })
851
1030
  });
852
1031
  var CreateEnvironmentSchema = EnvironmentSchema.omit({ id: true }).extend({
853
- description: z15.string().max(2e3).optional().default(""),
854
- parentIds: z15.array(z15.string().max(128)).max(10).optional().default([]),
1032
+ description: z16.string().max(2e3).optional().default(""),
1033
+ parentIds: z16.array(z16.string().max(128)).max(10).optional().default([]),
855
1034
  variables: EnvironmentVariablesSchema.optional().default({}),
856
- scope: z15.enum(["global", "service"]).optional().default("global"),
857
- reference: z15.string().max(128).optional(),
858
- activateOn: z15.string().max(128).optional(),
859
- immutable: z15.boolean().optional().default(false)
1035
+ scope: z16.enum(["global", "service"]).optional().default("global"),
1036
+ reference: z16.string().max(128).optional(),
1037
+ activateOn: z16.string().max(128).optional(),
1038
+ immutable: z16.boolean().optional().default(false)
860
1039
  });
861
1040
  var UpdateEnvironmentSchema = EnvironmentSchema.partial().required({ id: true }).extend({
862
- description: z15.string().max(2e3).optional(),
863
- parentIds: z15.array(z15.string().max(128)).max(10).optional(),
1041
+ description: z16.string().max(2e3).optional(),
1042
+ parentIds: z16.array(z16.string().max(128)).max(10).optional(),
864
1043
  variables: EnvironmentVariablesSchema.optional(),
865
- scope: z15.enum(["global", "service"]).optional(),
866
- immutable: z15.boolean().optional(),
867
- default: z15.boolean().optional(),
868
- agentId: z15.string().max(128).nullable().optional()
1044
+ scope: z16.enum(["global", "service"]).optional(),
1045
+ immutable: z16.boolean().optional(),
1046
+ default: z16.boolean().optional(),
1047
+ agentId: z16.string().max(128).nullable().optional()
869
1048
  // null = clear (no default agent)
870
1049
  });
871
1050
 
872
1051
  // ../../packages/shared/src/schemas/environment-overrides.schema.ts
873
- import { z as z16 } from "zod";
874
- var EnvironmentOverridesSchema = z16.record(
875
- z16.string().max(128),
876
- VariableSchema
1052
+ import { z as z17 } from "zod";
1053
+ var VariableOverrideSchema = z17.object({
1054
+ value: VariableSlotSchema
1055
+ });
1056
+ var EnvironmentOverridesSchema = z17.record(
1057
+ z17.string().max(128),
1058
+ VariableOverrideSchema
877
1059
  ).refine(
878
1060
  (obj) => Object.keys(obj).length <= 5e3,
879
1061
  { message: "Max 5000 overrides" }
880
1062
  );
881
1063
 
882
1064
  // ../../packages/shared/src/schemas/api-key.schema.ts
883
- import { z as z17 } from "zod";
884
- var ApiServiceActionSchema = z17.enum([
1065
+ import { z as z18 } from "zod";
1066
+ var ApiServiceActionSchema = z18.enum([
885
1067
  "service:read",
886
1068
  "service:start",
887
1069
  "service:stop",
@@ -890,109 +1072,155 @@ var ApiServiceActionSchema = z17.enum([
890
1072
  "service:status",
891
1073
  "logs:read"
892
1074
  ]);
893
- var ApiEnvActionSchema = z17.enum(["env:read", "env:write"]);
894
- var ApiEnvPermSchema = z17.object({
895
- environmentId: z17.string().max(128),
896
- actions: z17.array(ApiEnvActionSchema).max(10).default(["env:read"]),
897
- includeSecrets: z17.boolean().default(false)
898
- });
899
- var ApiServicePermSchema = z17.object({
900
- serviceId: z17.string().max(128),
901
- actions: z17.array(ApiServiceActionSchema).max(10).default(["service:read"]),
902
- environments: z17.array(ApiEnvPermSchema).max(100).default([])
903
- });
904
- var ApiKeyScopeSchema = z17.object({
905
- services: z17.array(ApiServicePermSchema).max(500).default([])
906
- });
907
- var ApiKeySchema = z17.object({
908
- id: z17.string().max(128),
909
- name: z17.string().min(1).max(200),
910
- key: z17.string().regex(/^[0-9a-f]{64}$/i),
1075
+ var ApiEnvActionSchema = z18.enum(["env:read", "env:write"]);
1076
+ var ApiEnvPermSchema = z18.object({
1077
+ environmentId: z18.string().max(128),
1078
+ actions: z18.array(ApiEnvActionSchema).max(10).default(["env:read"]),
1079
+ includeSecrets: z18.boolean().default(false)
1080
+ });
1081
+ var ApiServicePermSchema = z18.object({
1082
+ serviceId: z18.string().max(128),
1083
+ actions: z18.array(ApiServiceActionSchema).max(10).default(["service:read"]),
1084
+ environments: z18.array(ApiEnvPermSchema).max(100).default([])
1085
+ });
1086
+ var ApiKeyScopeSchema = z18.object({
1087
+ services: z18.array(ApiServicePermSchema).max(500).default([])
1088
+ });
1089
+ var ApiKeySchema = z18.object({
1090
+ id: z18.string().max(128),
1091
+ name: z18.string().min(1).max(200),
1092
+ key: z18.string().regex(/^[0-9a-f]{64}$/i),
911
1093
  scopes: ApiKeyScopeSchema,
912
- createdAt: z17.string().max(64),
913
- isPublic: z17.boolean().default(false)
1094
+ createdAt: z18.string().max(64),
1095
+ isPublic: z18.boolean().default(false)
1096
+ });
1097
+ var PersistedApiKeySchema = ApiKeySchema.extend({
1098
+ key: z18.string().min(1).max(4096)
914
1099
  });
915
- var ApiKeysFileSchema = z17.object({
916
- keys: z17.array(ApiKeySchema).max(100)
1100
+ var ApiKeysFileSchema = z18.object({
1101
+ keys: z18.array(PersistedApiKeySchema).max(100)
1102
+ });
1103
+ var MaskedApiKeySchema = ApiKeySchema.omit({ key: true }).extend({
1104
+ /** Last 4 characters of the secret, for recognising a key in a list. */
1105
+ keyPreview: z18.string().max(8)
917
1106
  });
918
1107
 
919
1108
  // ../../packages/shared/src/schemas/image.schema.ts
920
- import { z as z18 } from "zod";
1109
+ import { z as z19 } from "zod";
921
1110
  var ALLOWED_IMAGE_MIME_TYPES = ["image/png", "image/jpeg", "image/webp", "image/gif"];
922
- var ImagePartSchema = z18.object({
923
- type: z18.literal("image"),
924
- imageId: z18.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
925
- url: z18.string().min(1),
926
- mimeType: z18.enum(ALLOWED_IMAGE_MIME_TYPES),
927
- altText: z18.string().max(500).optional()
928
- });
929
- var ImageUploadResponseSchema = z18.object({
930
- imageId: z18.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
931
- url: z18.string().min(1),
932
- mimeType: z18.enum(ALLOWED_IMAGE_MIME_TYPES),
933
- originalName: z18.string()
934
- });
935
- var ImageMetaSchema = z18.object({
936
- imageId: z18.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
937
- filePath: z18.string().min(1),
938
- mimeType: z18.enum(ALLOWED_IMAGE_MIME_TYPES),
939
- originalName: z18.string().min(1),
940
- createdAt: z18.number().positive(),
941
- size: z18.number().positive().optional()
1111
+ var ImagePartSchema = z19.object({
1112
+ type: z19.literal("image"),
1113
+ imageId: z19.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
1114
+ url: z19.string().min(1),
1115
+ mimeType: z19.enum(ALLOWED_IMAGE_MIME_TYPES),
1116
+ altText: z19.string().max(500).optional()
1117
+ });
1118
+ var ImageUploadResponseSchema = z19.object({
1119
+ imageId: z19.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
1120
+ url: z19.string().min(1),
1121
+ mimeType: z19.enum(ALLOWED_IMAGE_MIME_TYPES),
1122
+ originalName: z19.string()
1123
+ });
1124
+ var ImageMetaSchema = z19.object({
1125
+ imageId: z19.string().regex(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i, "Must be a valid UUID"),
1126
+ filePath: z19.string().min(1),
1127
+ mimeType: z19.enum(ALLOWED_IMAGE_MIME_TYPES),
1128
+ originalName: z19.string().min(1),
1129
+ createdAt: z19.number().positive(),
1130
+ size: z19.number().positive().optional()
942
1131
  });
943
1132
 
944
1133
  // ../../packages/shared/src/schemas/kanban.schema.ts
945
- import { z as z19 } from "zod";
946
- var KanbanCardEventSchema = z19.object({
947
- type: z19.enum(["created", "edited", "moved", "image_added", "image_removed", "title_changed", "conversation_started", "scenario_started", "comment"]),
948
- timestamp: z19.string(),
1134
+ import { z as z20 } from "zod";
1135
+ var KanbanAttachmentSchema = z20.object({
1136
+ /** Server-issued id, also the storage key. */
1137
+ id: z20.string().max(128),
1138
+ name: z20.string().max(255),
1139
+ size: z20.number().int().nonnegative(),
1140
+ contentType: z20.string().max(128)
1141
+ });
1142
+ var KanbanCardEventSchema = z20.object({
1143
+ type: z20.enum(["created", "edited", "moved", "image_added", "image_removed", "title_changed", "conversation_started", "scenario_started", "comment"]),
1144
+ timestamp: z20.string(),
949
1145
  /** Extra context: old/new column name, old/new title, comment text, etc. */
950
- detail: z19.string().max(5e3).optional(),
1146
+ detail: z20.string().max(5e3).optional(),
1147
+ /**
1148
+ * Stable identity of the event, used to tell an edit from an insertion when a
1149
+ * whole history is written back. Absent on events recorded before the field
1150
+ * existed; those fall back to (type, timestamp).
1151
+ */
1152
+ id: z20.string().max(128).optional(),
951
1153
  /** Who authored this event — 'ai' or 'user'. Only set for comment events. */
952
- author: z19.enum(["ai", "user"]).optional(),
1154
+ author: z20.enum(["ai", "user"]).optional(),
1155
+ /**
1156
+ * The human behind a comment, stamped by the server. This is what makes
1157
+ * "my own comment" answerable; `author` only separates AI from human.
1158
+ */
1159
+ authorUser: z20.object({ id: z20.string().max(128), name: z20.string().max(200) }).optional(),
1160
+ /** Set when the author amended their comment, so the UI can say so. */
1161
+ editedAt: z20.string().optional(),
1162
+ /** Files attached to a comment — same storage as a card's own attachments. */
1163
+ attachments: z20.array(KanbanAttachmentSchema).max(20).optional(),
953
1164
  /** Conversation that produced this event (comments only). Used to navigate back to the conversation. */
954
- conversationId: z19.string().optional()
955
- });
956
- var KanbanCardSchema = z19.object({
957
- id: z19.string(),
958
- title: z19.string().min(1).max(500),
959
- markdown: z19.string().max(1e5).default(""),
960
- /** Base64-encoded image data URIs attached to the card */
961
- images: z19.array(z19.string()).default([]),
962
- order: z19.number().int(),
963
- history: z19.array(KanbanCardEventSchema).default([]),
964
- createdAt: z19.string(),
965
- updatedAt: z19.string()
966
- });
967
- var KanbanColumnSchema = z19.object({
968
- id: z19.string(),
969
- title: z19.string().min(1).max(200),
970
- order: z19.number().int(),
971
- cards: z19.array(KanbanCardSchema).default([])
972
- });
973
- var KanbanBoardSchema = z19.object({
974
- id: z19.string(),
975
- name: z19.string().min(1).max(200),
976
- description: z19.string().max(1e4).default(""),
977
- columns: z19.array(KanbanColumnSchema).default([]),
978
- archived: z19.boolean().default(false),
979
- createdAt: z19.string(),
980
- updatedAt: z19.string()
981
- });
982
- var CreateKanbanBoardInput = z19.object({
983
- name: z19.string().min(1).max(200),
984
- description: z19.string().max(1e4).optional()
985
- });
986
- var UpdateKanbanBoardInput = z19.object({
987
- id: z19.string(),
988
- name: z19.string().min(1).max(200).optional(),
989
- description: z19.string().max(1e4).optional(),
990
- columns: z19.array(KanbanColumnSchema).optional(),
991
- archived: z19.boolean().optional()
1165
+ conversationId: z20.string().optional()
1166
+ });
1167
+ var KanbanCardSchema = z20.object({
1168
+ id: z20.string(),
1169
+ title: z20.string().min(1).max(500),
1170
+ markdown: z20.string().max(1e5).default(""),
1171
+ /**
1172
+ * Legacy inline images, kept so boards written before object storage still
1173
+ * render. New uploads go to `attachments` instead.
1174
+ */
1175
+ images: z20.array(z20.string()).default([]),
1176
+ /** Files attached to the card — stored out of band, referenced here. */
1177
+ attachments: z20.array(KanbanAttachmentSchema).max(50).default([]),
1178
+ order: z20.number().int(),
1179
+ history: z20.array(KanbanCardEventSchema).default([]),
1180
+ createdAt: z20.string(),
1181
+ updatedAt: z20.string(),
1182
+ /**
1183
+ * People assigned to the card. Names are denormalized for display; the server
1184
+ * keeps only members of the owning organization, and notifies newcomers.
1185
+ */
1186
+ assignees: z20.array(z20.object({ id: z20.string().max(128), name: z20.string().max(200) })).max(20).default([]),
1187
+ /**
1188
+ * Who first created the card. Stamped by the server the first time a card id
1189
+ * appears in a board write, never taken from the client — a member could
1190
+ * otherwise claim any authorship. Absent on cards created before this field
1191
+ * existed, so readers must treat it as unknown rather than assume.
1192
+ */
1193
+ createdBy: z20.object({ id: z20.string().max(128), name: z20.string().max(200) }).optional()
1194
+ });
1195
+ var KanbanColumnSchema = z20.object({
1196
+ id: z20.string(),
1197
+ title: z20.string().min(1).max(200),
1198
+ order: z20.number().int(),
1199
+ cards: z20.array(KanbanCardSchema).default([])
1200
+ });
1201
+ var KanbanBoardSchema = z20.object({
1202
+ id: z20.string(),
1203
+ name: z20.string().min(1).max(200),
1204
+ description: z20.string().max(1e4).default(""),
1205
+ columns: z20.array(KanbanColumnSchema).default([]),
1206
+ archived: z20.boolean().default(false),
1207
+ createdAt: z20.string(),
1208
+ updatedAt: z20.string()
1209
+ });
1210
+ var CreateKanbanBoardInput = z20.object({
1211
+ name: z20.string().min(1).max(200),
1212
+ description: z20.string().max(1e4).optional()
1213
+ });
1214
+ var UpdateKanbanBoardInput = z20.object({
1215
+ id: z20.string(),
1216
+ name: z20.string().min(1).max(200).optional(),
1217
+ description: z20.string().max(1e4).optional(),
1218
+ columns: z20.array(KanbanColumnSchema).optional(),
1219
+ archived: z20.boolean().optional()
992
1220
  });
993
1221
 
994
1222
  // ../../packages/shared/src/utils/crypto.ts
995
- import { createCipheriv as createCipheriv2, createDecipheriv as createDecipheriv2, randomBytes as randomBytes2, pbkdf2Sync } from "crypto";
1223
+ import { createCipheriv as createCipheriv3, createDecipheriv as createDecipheriv3, randomBytes as randomBytes3, pbkdf2Sync } from "crypto";
996
1224
 
997
1225
  // ../../packages/shared/src/native-parsers.ts
998
1226
  var epoch = /* @__PURE__ */ new Date("2025-01-01T00:00:00Z");
@@ -1072,6 +1300,8 @@ var nativeParsers = [
1072
1300
  // ../../packages/shared/src/js-log-parser.ts
1073
1301
  import vm from "vm";
1074
1302
  var VALID_LEVELS = /* @__PURE__ */ new Set(["debug", "info", "warn", "error", "fatal"]);
1303
+ var PARSE_TIMEOUT_MS = 50;
1304
+ var MAX_CONSECUTIVE_TIMEOUTS = 10;
1075
1305
  var JSLogParser = class {
1076
1306
  parsers = [];
1077
1307
  constructor(definitions = []) {
@@ -1109,6 +1339,16 @@ var JSLogParser = class {
1109
1339
  }
1110
1340
  return this.sanitize(current);
1111
1341
  }
1342
+ /**
1343
+ * Compile le code utilisateur en une fonction bornée en temps.
1344
+ *
1345
+ * Le `timeout` de `runInNewContext` ne couvre que l'évaluation de la factory :
1346
+ * la closure retournée s'exécutait ensuite ligne par ligne directement sur
1347
+ * l'event loop, sans aucune borne. Une regex à backtracking exponentiel
1348
+ * fournie par l'utilisateur figeait donc l'agent entier — logs, statuts et
1349
+ * métriques de *tous* les services. Chaque invocation repasse maintenant par
1350
+ * la vm, avec son propre budget.
1351
+ */
1112
1352
  compileParser(def) {
1113
1353
  const forbidden = ["require(", "import ", "eval("];
1114
1354
  for (const pat of forbidden) {
@@ -1133,17 +1373,44 @@ var JSLogParser = class {
1133
1373
  } catch (err) {
1134
1374
  throw new Error(`Compilation failed: ${err instanceof Error ? err.message : String(err)}`);
1135
1375
  }
1376
+ const context = vm.createContext({ ...sandbox, __line: null, __result: null });
1136
1377
  let parserFn;
1137
1378
  try {
1138
- parserFn = script.runInNewContext(sandbox, { timeout: 100 });
1379
+ parserFn = script.runInContext(context, { timeout: 100 });
1139
1380
  } catch (err) {
1140
1381
  throw new Error(`Execution failed: ${err instanceof Error ? err.message : String(err)}`);
1141
1382
  }
1142
1383
  if (typeof parserFn !== "function") {
1143
1384
  throw new Error("Parser code must export a function");
1144
1385
  }
1386
+ context["__parserFn"] = parserFn;
1387
+ const callScript = new vm.Script("__result = __parserFn(__line);", {
1388
+ filename: `parser-${def.id}-call.js`
1389
+ });
1390
+ let consecutiveTimeouts = 0;
1391
+ let disabled = false;
1145
1392
  return (line) => {
1146
- const result = parserFn(line);
1393
+ if (disabled) return line;
1394
+ const ctx = context;
1395
+ ctx["__line"] = line;
1396
+ ctx["__result"] = null;
1397
+ try {
1398
+ callScript.runInContext(context, { timeout: PARSE_TIMEOUT_MS });
1399
+ consecutiveTimeouts = 0;
1400
+ } catch (err) {
1401
+ const e = err;
1402
+ const timedOut = !!e && (e.code === "ERR_SCRIPT_EXECUTION_TIMEOUT" || typeof e.message === "string" && /execution timed out/i.test(e.message));
1403
+ if (!timedOut) throw err;
1404
+ consecutiveTimeouts += 1;
1405
+ if (consecutiveTimeouts >= MAX_CONSECUTIVE_TIMEOUTS) {
1406
+ disabled = true;
1407
+ console.warn(
1408
+ `[js-log-parser] Parser "${def.name}" (${def.id}) disabled after ${MAX_CONSECUTIVE_TIMEOUTS} consecutive timeouts`
1409
+ );
1410
+ }
1411
+ return line;
1412
+ }
1413
+ const result = ctx["__result"];
1147
1414
  if (result === null || result === void 0 || typeof result !== "object") {
1148
1415
  return line;
1149
1416
  }
@@ -1593,7 +1860,7 @@ var EnvironmentStore = class {
1593
1860
  await this.load();
1594
1861
  const parsed = EnvironmentSchema.safeParse({ ...fields, id });
1595
1862
  if (!parsed.success) {
1596
- console.error(`[environment-store] Rejected remote environment ${id}:`, parsed.error.message);
1863
+ console.error("[environment-store] Rejected remote environment %s:", id, parsed.error.message);
1597
1864
  return { created: false };
1598
1865
  }
1599
1866
  const incoming = parsed.data;
@@ -1842,7 +2109,7 @@ var ServiceStore = class {
1842
2109
  await this.load();
1843
2110
  const parsed = ServiceConfigSchema.safeParse({ ...fields, id });
1844
2111
  if (!parsed.success) {
1845
- console.error(`[service-store] Rejected remote service ${id}:`, parsed.error.message);
2112
+ console.error("[service-store] Rejected remote service %s:", id, parsed.error.message);
1846
2113
  return { created: false };
1847
2114
  }
1848
2115
  const incoming = parsed.data;
@@ -2343,13 +2610,13 @@ var AgentWSBridge = class extends EventEmitter {
2343
2610
  };
2344
2611
 
2345
2612
  // ../server/src/services/agent-manager.ts
2346
- var HealthMessageSchema = z20.object({
2347
- status: z20.string(),
2348
- uptime: z20.number(),
2349
- runnersAvailable: z20.array(z20.enum(["native", "docker"])),
2350
- processCount: z20.number(),
2351
- runningCount: z20.number(),
2352
- lanIp: z20.string().optional()
2613
+ var HealthMessageSchema = z21.object({
2614
+ status: z21.string(),
2615
+ uptime: z21.number(),
2616
+ runnersAvailable: z21.array(z21.enum(["native", "docker"])),
2617
+ processCount: z21.number(),
2618
+ runningCount: z21.number(),
2619
+ lanIp: z21.string().optional()
2353
2620
  });
2354
2621
  var MIN_RECONNECT_DELAY = WS_RECONNECT_MIN;
2355
2622
  var MAX_RECONNECT_DELAY = WS_RECONNECT_MAX;
@@ -2773,6 +3040,19 @@ var AgentManager = class extends EventEmitter2 {
2773
3040
  var agentManager = new AgentManager();
2774
3041
 
2775
3042
  export {
3043
+ env,
3044
+ isCiMode,
3045
+ loadFromEnv,
3046
+ setPendingLegacyKey,
3047
+ getPendingLegacyKey,
3048
+ clearPendingLegacyKey,
3049
+ hasPendingLegacyKey,
3050
+ setEncryptionKeyInMemory,
3051
+ clearEncryptionKey,
3052
+ hasEncryptionKey,
3053
+ getEncryptionKey,
3054
+ ensureEncryptionKey,
3055
+ setEncryptionKey,
2776
3056
  ProjectSchema,
2777
3057
  ScenarioGroupSchema,
2778
3058
  ScenarioNodeSchema,
@@ -2793,9 +3073,9 @@ export {
2793
3073
  VariableSchema,
2794
3074
  CreateEnvironmentSchema,
2795
3075
  UpdateEnvironmentSchema,
3076
+ VariableOverrideSchema,
2796
3077
  ApiKeyScopeSchema,
2797
3078
  ApiKeysFileSchema,
2798
- KanbanColumnSchema,
2799
3079
  nativeParsers,
2800
3080
  JSLogParser,
2801
3081
  LOG_BUFFER_SIZE,
@@ -2806,6 +3086,13 @@ export {
2806
3086
  getCollection,
2807
3087
  readEntity,
2808
3088
  writeEntity,
3089
+ encryptValue,
3090
+ decryptValue,
3091
+ stableEncryptValue,
3092
+ encryptVariableSlots,
3093
+ decryptVariableSlots,
3094
+ extractEncryptedVariableSlots,
3095
+ isEncryptedValue,
2809
3096
  environmentStore,
2810
3097
  serviceStore,
2811
3098
  agentStore,
@@ -2813,4 +3100,4 @@ export {
2813
3100
  traefikManager,
2814
3101
  agentManager
2815
3102
  };
2816
- //# sourceMappingURL=chunk-PUNE7P6S.js.map
3103
+ //# sourceMappingURL=chunk-Y2R42AXQ.js.map