plum-e2e 2.9.14 → 2.10.0

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 (709) hide show
  1. package/CLAUDE.md +1 -1
  2. package/README.md +23 -20
  3. package/backend/_scaffold/utils/browser.ts +1 -13
  4. package/backend/_scaffold/utils/hooks.ts +1 -13
  5. package/backend/constants/socketEvents.js +8 -14
  6. package/backend/lib/serverBootstrap.js +4 -4
  7. package/backend/mcp/server.js +3 -3
  8. package/backend/prisma/migrations/20260829000000_add_run_queue/migration.sql +29 -0
  9. package/backend/prisma/schema.prisma +33 -13
  10. package/backend/routes/active-runs.routes.js +10 -6
  11. package/backend/routes/node.routes.js +7 -0
  12. package/backend/routes/trigger.routes.js +8 -5
  13. package/backend/server.js +5 -1
  14. package/backend/services/cronService.js +15 -443
  15. package/backend/services/nodeExecutionService.js +13 -1
  16. package/backend/services/runExecutorService.js +423 -0
  17. package/backend/services/runQueueService.js +276 -0
  18. package/backend/services/runnerService.js +22 -4
  19. package/backend/services/triggerService.js +13 -231
  20. package/backend/websockets/socketHandler.js +32 -590
  21. package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +35 -35
  22. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
  23. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
  24. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
  25. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Be5c3USL.css +6 -0
  26. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.COwSGmmy.css +6 -0
  27. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
  28. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
  29. package/frontend/.svelte-kit/adapter-node/chunks/BackLink.js +1 -1
  30. package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +1 -1
  31. package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +1 -1
  32. package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +1 -1
  33. package/frontend/.svelte-kit/adapter-node/chunks/Modal.js +1 -1
  34. package/frontend/.svelte-kit/adapter-node/chunks/Toast.js +1 -1
  35. package/frontend/.svelte-kit/adapter-node/chunks/constants.js +6 -4
  36. package/frontend/.svelte-kit/adapter-node/chunks/format.js +3 -3
  37. package/frontend/.svelte-kit/adapter-node/chunks/index.js +4 -4
  38. package/frontend/.svelte-kit/adapter-node/chunks/internal.js +1 -1
  39. package/frontend/.svelte-kit/adapter-node/chunks/reports.js +1 -1
  40. package/frontend/.svelte-kit/adapter-node/chunks/reports2.js +38 -40
  41. package/frontend/.svelte-kit/adapter-node/chunks/repository.js +8 -0
  42. package/frontend/.svelte-kit/adapter-node/chunks/runner.js +10 -20
  43. package/frontend/.svelte-kit/adapter-node/entries/pages/live/_id_/_page.svelte.js +254 -0
  44. package/frontend/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +1 -1
  45. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +29 -24
  46. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +23 -19
  47. package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +3 -3
  48. package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +173 -51
  49. package/frontend/.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js +1 -1
  50. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +1 -1
  51. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +63 -11
  52. package/frontend/.svelte-kit/adapter-node/manifest-full.js +10 -10
  53. package/frontend/.svelte-kit/adapter-node/manifest.js +10 -10
  54. package/frontend/.svelte-kit/adapter-node/nodes/0.js +2 -2
  55. package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -1
  56. package/frontend/.svelte-kit/adapter-node/nodes/10.js +1 -1
  57. package/frontend/.svelte-kit/adapter-node/nodes/11.js +1 -1
  58. package/frontend/.svelte-kit/adapter-node/nodes/12.js +2 -2
  59. package/frontend/.svelte-kit/adapter-node/nodes/2.js +1 -1
  60. package/frontend/.svelte-kit/adapter-node/nodes/3.js +3 -3
  61. package/frontend/.svelte-kit/adapter-node/nodes/4.js +3 -3
  62. package/frontend/.svelte-kit/adapter-node/nodes/5.js +3 -3
  63. package/frontend/.svelte-kit/adapter-node/nodes/6.js +3 -3
  64. package/frontend/.svelte-kit/adapter-node/nodes/7.js +1 -1
  65. package/frontend/.svelte-kit/adapter-node/nodes/8.js +2 -2
  66. package/frontend/.svelte-kit/adapter-node/nodes/9.js +1 -1
  67. package/frontend/.svelte-kit/ambient.d.ts +28 -28
  68. package/frontend/.svelte-kit/generated/client/app.js +4 -4
  69. package/frontend/.svelte-kit/generated/client/nodes/13.js +6 -0
  70. package/frontend/.svelte-kit/generated/client/nodes/3.js +1 -1
  71. package/frontend/.svelte-kit/generated/client/nodes/4.js +1 -1
  72. package/frontend/.svelte-kit/generated/client/nodes/5.js +1 -1
  73. package/frontend/.svelte-kit/generated/client/nodes/6.js +1 -1
  74. package/frontend/.svelte-kit/generated/client-optimized/app.js +4 -4
  75. package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +1 -1
  76. package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +1 -1
  77. package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +1 -1
  78. package/frontend/.svelte-kit/generated/client-optimized/nodes/6.js +1 -1
  79. package/frontend/.svelte-kit/generated/server/internal.js +1 -1
  80. package/frontend/.svelte-kit/output/client/.vite/manifest.json +413 -401
  81. package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.CmJTG5mP.css +6 -0
  82. package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.B9H_IpSU.css +6 -0
  83. package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.Be5c3USL.css +6 -0
  84. package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.ClS4XkkN.css +6 -0
  85. package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.BN5XbLUX.css +6 -0
  86. package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.COwSGmmy.css +6 -0
  87. package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
  88. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
  89. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
  90. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Be5c3USL.css +6 -0
  91. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.COwSGmmy.css +6 -0
  92. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
  93. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
  94. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/2-KCkWZO.js +6 -0
  95. package/frontend/{build/client/_app/immutable/chunks/CNdcuGR0.js → .svelte-kit/output/client/_app/immutable/chunks/B00vxw57.js} +1 -1
  96. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0_HKFXV.js +6 -0
  97. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{t-La0hgu.js → BAvTKHxT.js} +1 -1
  98. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BJ_ypKl3.js +6 -0
  99. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BbYY_TzB.js +6 -0
  100. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Beula-TH.js +11 -0
  101. package/frontend/{build/client/_app/immutable/chunks/CKDtmZUQ.js → .svelte-kit/output/client/_app/immutable/chunks/C00jnSU2.js} +1 -1
  102. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C2_rQ4aY.js +175 -0
  103. package/frontend/{build/client/_app/immutable/chunks/DCgHuuvs.js → .svelte-kit/output/client/_app/immutable/chunks/C7uEQ-LH.js} +1 -1
  104. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C8S7qQjQ.js +6 -0
  105. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CzlPaHY9.js → CZWchtW8.js} +1 -1
  106. package/frontend/{build/client/_app/immutable/chunks/2zMvi6fR.js → .svelte-kit/output/client/_app/immutable/chunks/CboYYxrf.js} +1 -1
  107. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CeH-RgMb.js +6 -0
  108. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CgnwuKKO.js → CegSvdD-.js} +1 -1
  109. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CfkUW1vA.js +6 -0
  110. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cfmt4_tJ.js +6 -0
  111. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cgw8TOOy.js +6 -0
  112. package/frontend/{build/client/_app/immutable/chunks/C1Vid6wz.js → .svelte-kit/output/client/_app/immutable/chunks/Ck6C3Fl0.js} +1 -1
  113. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CoTEzvLa.js +6 -0
  114. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DMZwI8Cj.js → DAmOMhaf.js} +1 -1
  115. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DB3YXVFP.js +6 -0
  116. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{w0D4Uzlq.js → DWzEJYIF.js} +1 -1
  117. package/frontend/{build/client/_app/immutable/chunks/CMEtqUfQ.js → .svelte-kit/output/client/_app/immutable/chunks/DgQy0SB2.js} +1 -1
  118. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{kkA1mrsH.js → DiVmSEJa.js} +2 -2
  119. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Dl-F6VCo.js +6 -0
  120. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DuAVKaL3.js +6 -0
  121. package/frontend/{build/client/_app/immutable/chunks/BmZ9upwL.js → .svelte-kit/output/client/_app/immutable/chunks/GDjpV3r7.js} +1 -1
  122. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/K1h4wprj.js +6 -0
  123. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DDZw0L0T.js → d2K3c8Kx.js} +1 -1
  124. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.DRjRA71t.js +7 -0
  125. package/frontend/{build/client/_app/immutable/entry/start.4qxHHAcl.js → .svelte-kit/output/client/_app/immutable/entry/start.BXOLyf9R.js} +1 -1
  126. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.CRb8Nyce.js +6 -0
  127. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{1.Df9sLw8b.js → 1.BI97il3r.js} +1 -1
  128. package/frontend/{build/client/_app/immutable/nodes/10.DEbnxfND.js → .svelte-kit/output/client/_app/immutable/nodes/10.kyazROhw.js} +1 -1
  129. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{11.BViaDK2m.js → 11.B3vMgT2v.js} +1 -1
  130. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.DkPcIrgW.js +6 -0
  131. package/frontend/{build/client/_app/immutable/nodes/2.BCPSg7H4.js → .svelte-kit/output/client/_app/immutable/nodes/2.Dr6yugXz.js} +1 -1
  132. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.DUiL7fb5.js +6 -0
  133. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{3.8BFAJoHT.js → 4.DDADylfF.js} +1 -1
  134. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.N4CeDeoD.js +6 -0
  135. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.DWd93Bv5.js +10 -0
  136. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.c8d1cQQM.js +6 -0
  137. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.Cvd3MauU.js +9 -0
  138. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{9.CvfGx3Hu.js → 9.BOK0GNF_.js} +1 -1
  139. package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
  140. package/frontend/.svelte-kit/output/server/.vite/manifest.json +35 -35
  141. package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
  142. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
  143. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
  144. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Be5c3USL.css +6 -0
  145. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.COwSGmmy.css +6 -0
  146. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
  147. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
  148. package/frontend/.svelte-kit/output/server/chunks/BackLink.js +1 -1
  149. package/frontend/.svelte-kit/output/server/chunks/Badge.js +1 -1
  150. package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +1 -1
  151. package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +1 -1
  152. package/frontend/.svelte-kit/output/server/chunks/Modal.js +1 -1
  153. package/frontend/.svelte-kit/output/server/chunks/Toast.js +1 -1
  154. package/frontend/.svelte-kit/output/server/chunks/constants.js +6 -4
  155. package/frontend/.svelte-kit/output/server/chunks/format.js +3 -3
  156. package/frontend/.svelte-kit/output/server/chunks/index.js +4 -4
  157. package/frontend/.svelte-kit/output/server/chunks/internal.js +1 -1
  158. package/frontend/.svelte-kit/output/server/chunks/reports.js +1 -1
  159. package/frontend/.svelte-kit/output/server/chunks/reports2.js +38 -40
  160. package/frontend/.svelte-kit/output/server/chunks/repository.js +8 -0
  161. package/frontend/.svelte-kit/output/server/chunks/runner.js +10 -20
  162. package/frontend/.svelte-kit/output/server/entries/pages/live/_id_/_page.svelte.js +254 -0
  163. package/frontend/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +1 -1
  164. package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +29 -24
  165. package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +23 -19
  166. package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +3 -3
  167. package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +173 -51
  168. package/frontend/.svelte-kit/output/server/entries/pages/setup/_page.svelte.js +1 -1
  169. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +1 -1
  170. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +63 -11
  171. package/frontend/.svelte-kit/output/server/manifest-full.js +10 -10
  172. package/frontend/.svelte-kit/output/server/manifest.js +10 -10
  173. package/frontend/.svelte-kit/output/server/nodes/0.js +2 -2
  174. package/frontend/.svelte-kit/output/server/nodes/1.js +1 -1
  175. package/frontend/.svelte-kit/output/server/nodes/10.js +1 -1
  176. package/frontend/.svelte-kit/output/server/nodes/11.js +1 -1
  177. package/frontend/.svelte-kit/output/server/nodes/12.js +2 -2
  178. package/frontend/.svelte-kit/output/server/nodes/2.js +1 -1
  179. package/frontend/.svelte-kit/output/server/nodes/3.js +3 -3
  180. package/frontend/.svelte-kit/output/server/nodes/4.js +3 -3
  181. package/frontend/.svelte-kit/output/server/nodes/5.js +3 -3
  182. package/frontend/.svelte-kit/output/server/nodes/6.js +3 -3
  183. package/frontend/.svelte-kit/output/server/nodes/7.js +1 -1
  184. package/frontend/.svelte-kit/output/server/nodes/8.js +2 -2
  185. package/frontend/.svelte-kit/output/server/nodes/9.js +1 -1
  186. package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css +6 -0
  187. package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css.br +0 -0
  188. package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css.gz +0 -0
  189. package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css +6 -0
  190. package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css.br +0 -0
  191. package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css.gz +0 -0
  192. package/frontend/build/client/_app/immutable/assets/3.Be5c3USL.css +6 -0
  193. package/frontend/build/client/_app/immutable/assets/3.Be5c3USL.css.br +0 -0
  194. package/frontend/build/client/_app/immutable/assets/3.Be5c3USL.css.gz +0 -0
  195. package/frontend/build/client/_app/immutable/assets/5.ClS4XkkN.css +6 -0
  196. package/frontend/build/client/_app/immutable/assets/5.ClS4XkkN.css.br +0 -0
  197. package/frontend/build/client/_app/immutable/assets/5.ClS4XkkN.css.gz +0 -0
  198. package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css +6 -0
  199. package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css.br +0 -0
  200. package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css.gz +0 -0
  201. package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css +6 -0
  202. package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css.br +0 -0
  203. package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css.gz +0 -0
  204. package/frontend/build/client/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
  205. package/frontend/build/client/_app/immutable/assets/BackLink.DRrgBGDC.css.br +0 -0
  206. package/frontend/build/client/_app/immutable/assets/BackLink.DRrgBGDC.css.gz +0 -0
  207. package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
  208. package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css.br +0 -0
  209. package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css.gz +0 -0
  210. package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
  211. package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css.br +0 -0
  212. package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css.gz +0 -0
  213. package/frontend/build/client/_app/immutable/assets/_page.Be5c3USL.css +6 -0
  214. package/frontend/build/client/_app/immutable/assets/_page.Be5c3USL.css.br +0 -0
  215. package/frontend/build/client/_app/immutable/assets/_page.Be5c3USL.css.gz +0 -0
  216. package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css +6 -0
  217. package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css.br +0 -0
  218. package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css.gz +0 -0
  219. package/frontend/build/client/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
  220. package/frontend/build/client/_app/immutable/assets/_page.ClS4XkkN.css.br +0 -0
  221. package/frontend/build/client/_app/immutable/assets/_page.ClS4XkkN.css.gz +0 -0
  222. package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
  223. package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css.br +0 -0
  224. package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css.gz +0 -0
  225. package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js +6 -0
  226. package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js.br +0 -0
  227. package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js.gz +0 -0
  228. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CNdcuGR0.js → build/client/_app/immutable/chunks/B00vxw57.js} +1 -1
  229. package/frontend/build/client/_app/immutable/chunks/B00vxw57.js.br +0 -0
  230. package/frontend/build/client/_app/immutable/chunks/B00vxw57.js.gz +0 -0
  231. package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js +6 -0
  232. package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js.br +0 -0
  233. package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js.gz +0 -0
  234. package/frontend/build/client/_app/immutable/chunks/{t-La0hgu.js → BAvTKHxT.js} +1 -1
  235. package/frontend/build/client/_app/immutable/chunks/BAvTKHxT.js.br +0 -0
  236. package/frontend/build/client/_app/immutable/chunks/BAvTKHxT.js.gz +0 -0
  237. package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js +6 -0
  238. package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js.br +0 -0
  239. package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js.gz +0 -0
  240. package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js +6 -0
  241. package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js.br +0 -0
  242. package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js.gz +0 -0
  243. package/frontend/build/client/_app/immutable/chunks/Beula-TH.js +11 -0
  244. package/frontend/build/client/_app/immutable/chunks/Beula-TH.js.br +0 -0
  245. package/frontend/build/client/_app/immutable/chunks/Beula-TH.js.gz +0 -0
  246. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CKDtmZUQ.js → build/client/_app/immutable/chunks/C00jnSU2.js} +1 -1
  247. package/frontend/build/client/_app/immutable/chunks/C00jnSU2.js.br +0 -0
  248. package/frontend/build/client/_app/immutable/chunks/C00jnSU2.js.gz +0 -0
  249. package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js +175 -0
  250. package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js.br +0 -0
  251. package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js.gz +0 -0
  252. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/DCgHuuvs.js → build/client/_app/immutable/chunks/C7uEQ-LH.js} +1 -1
  253. package/frontend/build/client/_app/immutable/chunks/C7uEQ-LH.js.br +0 -0
  254. package/frontend/build/client/_app/immutable/chunks/C7uEQ-LH.js.gz +0 -0
  255. package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js +6 -0
  256. package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js.br +0 -0
  257. package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js.gz +0 -0
  258. package/frontend/build/client/_app/immutable/chunks/{CzlPaHY9.js → CZWchtW8.js} +1 -1
  259. package/frontend/build/client/_app/immutable/chunks/CZWchtW8.js.br +0 -0
  260. package/frontend/build/client/_app/immutable/chunks/CZWchtW8.js.gz +0 -0
  261. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/2zMvi6fR.js → build/client/_app/immutable/chunks/CboYYxrf.js} +1 -1
  262. package/frontend/build/client/_app/immutable/chunks/CboYYxrf.js.br +6 -0
  263. package/frontend/build/client/_app/immutable/chunks/CboYYxrf.js.gz +0 -0
  264. package/frontend/build/client/_app/immutable/chunks/CeH-RgMb.js +6 -0
  265. package/frontend/build/client/_app/immutable/chunks/CeH-RgMb.js.br +0 -0
  266. package/frontend/build/client/_app/immutable/chunks/CeH-RgMb.js.gz +0 -0
  267. package/frontend/build/client/_app/immutable/chunks/{CgnwuKKO.js → CegSvdD-.js} +1 -1
  268. package/frontend/build/client/_app/immutable/chunks/CegSvdD-.js.br +0 -0
  269. package/frontend/build/client/_app/immutable/chunks/CegSvdD-.js.gz +0 -0
  270. package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js +6 -0
  271. package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js.br +0 -0
  272. package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js.gz +0 -0
  273. package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js +6 -0
  274. package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js.br +0 -0
  275. package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js.gz +0 -0
  276. package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js +6 -0
  277. package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js.br +0 -0
  278. package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js.gz +0 -0
  279. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/C1Vid6wz.js → build/client/_app/immutable/chunks/Ck6C3Fl0.js} +1 -1
  280. package/frontend/build/client/_app/immutable/chunks/Ck6C3Fl0.js.br +0 -0
  281. package/frontend/build/client/_app/immutable/chunks/Ck6C3Fl0.js.gz +0 -0
  282. package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js +6 -0
  283. package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js.br +0 -0
  284. package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js.gz +0 -0
  285. package/frontend/build/client/_app/immutable/chunks/{DMZwI8Cj.js → DAmOMhaf.js} +1 -1
  286. package/frontend/build/client/_app/immutable/chunks/DAmOMhaf.js.br +0 -0
  287. package/frontend/build/client/_app/immutable/chunks/DAmOMhaf.js.gz +0 -0
  288. package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js +6 -0
  289. package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js.br +0 -0
  290. package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js.gz +0 -0
  291. package/frontend/build/client/_app/immutable/chunks/{w0D4Uzlq.js → DWzEJYIF.js} +1 -1
  292. package/frontend/build/client/_app/immutable/chunks/DWzEJYIF.js.br +7 -0
  293. package/frontend/build/client/_app/immutable/chunks/DWzEJYIF.js.gz +0 -0
  294. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CMEtqUfQ.js → build/client/_app/immutable/chunks/DgQy0SB2.js} +1 -1
  295. package/frontend/build/client/_app/immutable/chunks/DgQy0SB2.js.br +0 -0
  296. package/frontend/build/client/_app/immutable/chunks/DgQy0SB2.js.gz +0 -0
  297. package/frontend/build/client/_app/immutable/chunks/{kkA1mrsH.js → DiVmSEJa.js} +2 -2
  298. package/frontend/build/client/_app/immutable/chunks/DiVmSEJa.js.br +0 -0
  299. package/frontend/build/client/_app/immutable/chunks/DiVmSEJa.js.gz +0 -0
  300. package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js +6 -0
  301. package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js.br +0 -0
  302. package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js.gz +0 -0
  303. package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js +6 -0
  304. package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js.br +0 -0
  305. package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js.gz +0 -0
  306. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/BmZ9upwL.js → build/client/_app/immutable/chunks/GDjpV3r7.js} +1 -1
  307. package/frontend/build/client/_app/immutable/chunks/GDjpV3r7.js.br +0 -0
  308. package/frontend/build/client/_app/immutable/chunks/GDjpV3r7.js.gz +0 -0
  309. package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js +6 -0
  310. package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js.br +0 -0
  311. package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js.gz +0 -0
  312. package/frontend/build/client/_app/immutable/chunks/{DDZw0L0T.js → d2K3c8Kx.js} +1 -1
  313. package/frontend/build/client/_app/immutable/chunks/d2K3c8Kx.js.br +0 -0
  314. package/frontend/build/client/_app/immutable/chunks/d2K3c8Kx.js.gz +0 -0
  315. package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js +7 -0
  316. package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js.br +0 -0
  317. package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js.gz +0 -0
  318. package/frontend/{.svelte-kit/output/client/_app/immutable/entry/start.4qxHHAcl.js → build/client/_app/immutable/entry/start.BXOLyf9R.js} +1 -1
  319. package/frontend/build/client/_app/immutable/entry/{start.4qxHHAcl.js.br → start.BXOLyf9R.js.br} +1 -1
  320. package/frontend/build/client/_app/immutable/entry/{start.4qxHHAcl.js.gz → start.BXOLyf9R.js.gz} +0 -0
  321. package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js +6 -0
  322. package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js.br +0 -0
  323. package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js.gz +0 -0
  324. package/frontend/build/client/_app/immutable/nodes/{1.Df9sLw8b.js → 1.BI97il3r.js} +1 -1
  325. package/frontend/build/client/_app/immutable/nodes/1.BI97il3r.js.br +0 -0
  326. package/frontend/build/client/_app/immutable/nodes/1.BI97il3r.js.gz +0 -0
  327. package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/10.DEbnxfND.js → build/client/_app/immutable/nodes/10.kyazROhw.js} +1 -1
  328. package/frontend/build/client/_app/immutable/nodes/10.kyazROhw.js.br +0 -0
  329. package/frontend/build/client/_app/immutable/nodes/10.kyazROhw.js.gz +0 -0
  330. package/frontend/build/client/_app/immutable/nodes/{11.BViaDK2m.js → 11.B3vMgT2v.js} +1 -1
  331. package/frontend/build/client/_app/immutable/nodes/11.B3vMgT2v.js.br +0 -0
  332. package/frontend/build/client/_app/immutable/nodes/11.B3vMgT2v.js.gz +0 -0
  333. package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js +6 -0
  334. package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js.br +0 -0
  335. package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js.gz +0 -0
  336. package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/2.BCPSg7H4.js → build/client/_app/immutable/nodes/2.Dr6yugXz.js} +1 -1
  337. package/frontend/build/client/_app/immutable/nodes/2.Dr6yugXz.js.br +0 -0
  338. package/frontend/build/client/_app/immutable/nodes/2.Dr6yugXz.js.gz +0 -0
  339. package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js +6 -0
  340. package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js.br +0 -0
  341. package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js.gz +0 -0
  342. package/frontend/build/client/_app/immutable/nodes/{3.8BFAJoHT.js → 4.DDADylfF.js} +1 -1
  343. package/frontend/build/client/_app/immutable/nodes/4.DDADylfF.js.br +0 -0
  344. package/frontend/build/client/_app/immutable/nodes/4.DDADylfF.js.gz +0 -0
  345. package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js +6 -0
  346. package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js.br +0 -0
  347. package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js.gz +0 -0
  348. package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js +10 -0
  349. package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js.br +0 -0
  350. package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js.gz +0 -0
  351. package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js +6 -0
  352. package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js.br +0 -0
  353. package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js.gz +0 -0
  354. package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js +9 -0
  355. package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js.br +0 -0
  356. package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js.gz +0 -0
  357. package/frontend/build/client/_app/immutable/nodes/{9.CvfGx3Hu.js → 9.BOK0GNF_.js} +1 -1
  358. package/frontend/build/client/_app/immutable/nodes/9.BOK0GNF_.js.br +0 -0
  359. package/frontend/build/client/_app/immutable/nodes/9.BOK0GNF_.js.gz +0 -0
  360. package/frontend/build/client/_app/version.json +1 -1
  361. package/frontend/build/client/_app/version.json.br +0 -0
  362. package/frontend/build/client/_app/version.json.gz +0 -0
  363. package/frontend/build/server/chunks/0-_rljpEay.js +22 -0
  364. package/frontend/build/server/chunks/0-_rljpEay.js.map +5 -0
  365. package/frontend/build/server/chunks/{1-Kxn9d30Z.js → 1-B3HpigzL.js} +3 -3
  366. package/frontend/build/server/chunks/{1-Kxn9d30Z.js.map → 1-B3HpigzL.js.map} +1 -1
  367. package/frontend/build/server/chunks/10-BQBBYpxV.js +14 -0
  368. package/frontend/build/server/chunks/10-BQBBYpxV.js.map +5 -0
  369. package/frontend/build/server/chunks/11-10xw0TIP.js +14 -0
  370. package/frontend/build/server/chunks/11-10xw0TIP.js.map +5 -0
  371. package/frontend/build/server/chunks/12-CZ3_Uw3c.js +14 -0
  372. package/frontend/build/server/chunks/{12-De6Ol6pu.js.map → 12-CZ3_Uw3c.js.map} +1 -1
  373. package/frontend/build/server/chunks/2-DioMbKbC.js +14 -0
  374. package/frontend/build/server/chunks/{2-Dc_rKWoK.js.map → 2-DioMbKbC.js.map} +1 -1
  375. package/frontend/build/server/chunks/3-CgiZg_9v.js +14 -0
  376. package/frontend/build/server/chunks/3-CgiZg_9v.js.map +5 -0
  377. package/frontend/build/server/chunks/4-BM-49dbE.js +14 -0
  378. package/frontend/build/server/chunks/4-BM-49dbE.js.map +5 -0
  379. package/frontend/build/server/chunks/5-Brx_KOzy.js +14 -0
  380. package/frontend/build/server/chunks/5-Brx_KOzy.js.map +5 -0
  381. package/frontend/build/server/chunks/6-C5swINND.js +14 -0
  382. package/frontend/build/server/chunks/6-C5swINND.js.map +5 -0
  383. package/frontend/build/server/chunks/7-B8e4y3CB.js +14 -0
  384. package/frontend/build/server/chunks/{7-DiQJZEF_.js.map → 7-B8e4y3CB.js.map} +1 -1
  385. package/frontend/build/server/chunks/8-BZtkZMIZ.js +14 -0
  386. package/frontend/build/server/chunks/8-BZtkZMIZ.js.map +5 -0
  387. package/frontend/build/server/chunks/9-BMAKiAem.js +14 -0
  388. package/frontend/build/server/chunks/{9-DirZG_Lu.js.map → 9-BMAKiAem.js.map} +1 -1
  389. package/frontend/build/server/chunks/{BackLink-BJ8NaemM.js → BackLink-CMpNTYqE.js} +2 -2
  390. package/frontend/build/server/chunks/BackLink-CMpNTYqE.js.map +5 -0
  391. package/frontend/build/server/chunks/{Badge-44ZTDx0V.js → Badge-BTWnF9pA.js} +2 -2
  392. package/frontend/build/server/chunks/Badge-BTWnF9pA.js.map +5 -0
  393. package/frontend/build/server/chunks/{ConfirmModal-C0EAXcq_.js → ConfirmModal-CtGWHl0v.js} +3 -3
  394. package/frontend/build/server/chunks/ConfirmModal-CtGWHl0v.js.map +5 -0
  395. package/frontend/build/server/chunks/{EmptyState-BA_eXaeR.js → EmptyState-Zpm9tJe1.js} +2 -2
  396. package/frontend/build/server/chunks/EmptyState-Zpm9tJe1.js.map +5 -0
  397. package/frontend/build/server/chunks/{Modal-DChG187n.js → Modal-BJJMnfIg.js} +2 -2
  398. package/frontend/build/server/chunks/Modal-BJJMnfIg.js.map +5 -0
  399. package/frontend/build/server/chunks/{Toast-v-q4ZnYq.js → Toast-CHB87F8k.js} +2 -2
  400. package/frontend/build/server/chunks/Toast-CHB87F8k.js.map +5 -0
  401. package/frontend/build/server/chunks/{_layout.svelte-CHVI3Prt.js → _layout.svelte-C_6nsIpT.js} +7 -7
  402. package/frontend/build/server/chunks/{_layout.svelte-CHVI3Prt.js.map → _layout.svelte-C_6nsIpT.js.map} +1 -1
  403. package/frontend/build/server/chunks/{_page.svelte-1jo8MapI.js → _page.svelte-BNwU9zza.js} +11 -10
  404. package/frontend/build/server/chunks/_page.svelte-BNwU9zza.js.map +5 -0
  405. package/frontend/build/server/chunks/{_page.svelte-04WxjOuH.js → _page.svelte-Bamoq11m.js} +8 -8
  406. package/frontend/build/server/chunks/{_page.svelte-04WxjOuH.js.map → _page.svelte-Bamoq11m.js.map} +1 -1
  407. package/frontend/build/server/chunks/{_page.svelte-Kg69DDaM.js → _page.svelte-BrYksycU.js} +5 -5
  408. package/frontend/build/server/chunks/_page.svelte-BrYksycU.js.map +5 -0
  409. package/frontend/build/server/chunks/{_page.svelte-BuFusRK1.js → _page.svelte-CAlhaCzS.js} +12 -12
  410. package/frontend/build/server/chunks/_page.svelte-CAlhaCzS.js.map +5 -0
  411. package/frontend/build/server/chunks/_page.svelte-CTebwzwy.js +62 -0
  412. package/frontend/build/server/chunks/_page.svelte-CTebwzwy.js.map +5 -0
  413. package/frontend/build/server/chunks/{_page.svelte-1as75nPc.js → _page.svelte-CbTrCeeX.js} +32 -28
  414. package/frontend/build/server/chunks/_page.svelte-CbTrCeeX.js.map +5 -0
  415. package/frontend/build/server/chunks/{_page.svelte-D3E6Eojd.js → _page.svelte-Cf6bI1Y2.js} +5 -5
  416. package/frontend/build/server/chunks/_page.svelte-Cf6bI1Y2.js.map +5 -0
  417. package/frontend/build/server/chunks/{_page.svelte-CWWeZuid.js → _page.svelte-CmJKt3-H.js} +71 -19
  418. package/frontend/build/server/chunks/_page.svelte-CmJKt3-H.js.map +5 -0
  419. package/frontend/build/server/chunks/{_page.svelte-CB8-QBNg.js → _page.svelte-DHZhNTPg.js} +11 -10
  420. package/frontend/build/server/chunks/{_page.svelte-CB8-QBNg.js.map → _page.svelte-DHZhNTPg.js.map} +1 -1
  421. package/frontend/build/server/chunks/_page.svelte-DObTHQe2.js +257 -0
  422. package/frontend/build/server/chunks/_page.svelte-DObTHQe2.js.map +5 -0
  423. package/frontend/build/server/chunks/{_page.svelte-8gELc_B1.js → _page.svelte-ywHy9KCh.js} +182 -59
  424. package/frontend/build/server/chunks/_page.svelte-ywHy9KCh.js.map +5 -0
  425. package/frontend/build/server/chunks/{auth-Chw-wBpI.js → auth-DDPlushv.js} +2 -2
  426. package/frontend/build/server/chunks/{auth-Chw-wBpI.js.map → auth-DDPlushv.js.map} +1 -1
  427. package/frontend/build/server/chunks/{client-DEmxR_a-.js → client-CsTiGNZy.js} +2 -2
  428. package/frontend/build/server/chunks/{client-DEmxR_a-.js.map → client-CsTiGNZy.js.map} +1 -1
  429. package/frontend/build/server/chunks/{constants-CXTaQaB6.js → constants-BYVkTZ-O.js} +3 -2
  430. package/frontend/build/server/chunks/constants-BYVkTZ-O.js.map +5 -0
  431. package/frontend/build/server/chunks/{error.svelte-BD3xNemk.js → error.svelte-BXr4lXlB.js} +3 -3
  432. package/frontend/build/server/chunks/{error.svelte-BD3xNemk.js.map → error.svelte-BXr4lXlB.js.map} +1 -1
  433. package/frontend/build/server/chunks/{format-CiNRMfHu.js → format-2pqy61MU.js} +2 -2
  434. package/frontend/build/server/chunks/{format-CiNRMfHu.js.map → format-2pqy61MU.js.map} +1 -1
  435. package/frontend/build/server/chunks/{index-server-B3M9vyh2.js → index-server-53nOZg5X.js} +2 -2
  436. package/frontend/build/server/chunks/{index-server-B3M9vyh2.js.map → index-server-53nOZg5X.js.map} +1 -1
  437. package/frontend/build/server/chunks/{index2-5R1tbrep.js → index2-DGcbugKe.js} +2 -2
  438. package/frontend/build/server/chunks/{index2-5R1tbrep.js.map → index2-DGcbugKe.js.map} +1 -1
  439. package/frontend/build/server/chunks/{reports-D_ApeeNh.js → reports-WuXG6tj3.js} +2 -2
  440. package/frontend/build/server/chunks/{reports-D_ApeeNh.js.map → reports-WuXG6tj3.js.map} +1 -1
  441. package/frontend/build/server/chunks/{reports2-BtElN_53.js → reports2-CCpI0xkQ.js} +7 -8
  442. package/frontend/build/server/chunks/reports2-CCpI0xkQ.js.map +5 -0
  443. package/frontend/build/server/chunks/{repository-FYYV_vKE.js → repository-TYWcFuWP.js} +6 -2
  444. package/frontend/build/server/chunks/repository-TYWcFuWP.js.map +5 -0
  445. package/frontend/build/server/chunks/runner-D5yCWOsy.js +27 -0
  446. package/frontend/build/server/chunks/runner-D5yCWOsy.js.map +5 -0
  447. package/frontend/build/server/chunks/{stores-BLenR3c1.js → stores-C4ZkywTG.js} +3 -3
  448. package/frontend/build/server/chunks/{stores-BLenR3c1.js.map → stores-C4ZkywTG.js.map} +1 -1
  449. package/frontend/build/server/chunks/{theme-nAx-GvX_.js → theme-C81wSe5T.js} +2 -2
  450. package/frontend/build/server/chunks/{theme-nAx-GvX_.js.map → theme-C81wSe5T.js.map} +1 -1
  451. package/frontend/build/server/index.js +2 -2
  452. package/frontend/build/server/index.js.map +1 -1
  453. package/frontend/build/server/manifest.js +23 -23
  454. package/frontend/build/server/manifest.js.map +1 -1
  455. package/frontend/src/lib/components/layout/RunnerPanel.svelte +186 -266
  456. package/frontend/src/lib/copy/reports.js +9 -0
  457. package/frontend/src/lib/copy/runners.js +9 -6
  458. package/frontend/src/lib/socketEvents.js +3 -15
  459. package/frontend/src/lib/stores/runner.js +62 -46
  460. package/frontend/src/routes/{reports/live → live/[id]}/+page.svelte +112 -183
  461. package/frontend/src/routes/scheduled-tests/+page.svelte +2 -2
  462. package/package.json +1 -1
  463. package/backend/services/activeRunsService.js +0 -55
  464. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -6
  465. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.BuhMvMUj.css +0 -6
  466. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.0Eln51hV.css +0 -6
  467. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BZfe6nWe.css +0 -6
  468. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bj_a_5lv.css +0 -6
  469. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BwgOqeMo.css +0 -6
  470. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CFnbmY-D.css +0 -6
  471. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/live/_page.svelte.js +0 -247
  472. package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.BhSG-jZH.css +0 -6
  473. package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -6
  474. package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.0Eln51hV.css +0 -6
  475. package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.DFV9OgAu.css +0 -6
  476. package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.CFnbmY-D.css +0 -6
  477. package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.BwgOqeMo.css +0 -6
  478. package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -6
  479. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -6
  480. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.0Eln51hV.css +0 -6
  481. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -6
  482. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -6
  483. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -6
  484. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -6
  485. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/3InFPLvE.js +0 -6
  486. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAACMRH5.js +0 -6
  487. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAMUGSh7.js +0 -6
  488. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BKuh57WU.js +0 -6
  489. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BUwxRmHf.js +0 -6
  490. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C8OURRSs.js +0 -6
  491. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CGeZlCaI.js +0 -6
  492. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -6
  493. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CUC98kMZ.js +0 -6
  494. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Co3xKhEp.js +0 -6
  495. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CuqnZUex.js +0 -6
  496. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DHM6H-es.js +0 -7
  497. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DSLBMEpr.js +0 -6
  498. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DbgD7JLa.js +0 -6
  499. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/TOCyHP97.js +0 -11
  500. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.KrtMZ3my.js +0 -7
  501. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.C8DodwXs.js +0 -11
  502. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.BMSCSd88.js +0 -6
  503. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.D-YT_JJe.js +0 -6
  504. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.DVeH2eQP.js +0 -6
  505. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.DI7-IJhN.js +0 -6
  506. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.C-pKvVZy.js +0 -6
  507. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.93Mb3ofT.js +0 -9
  508. package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -6
  509. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.BuhMvMUj.css +0 -6
  510. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.0Eln51hV.css +0 -6
  511. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BZfe6nWe.css +0 -6
  512. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bj_a_5lv.css +0 -6
  513. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BwgOqeMo.css +0 -6
  514. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CFnbmY-D.css +0 -6
  515. package/frontend/.svelte-kit/output/server/entries/pages/reports/live/_page.svelte.js +0 -247
  516. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css +0 -6
  517. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.br +0 -0
  518. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.gz +0 -0
  519. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -6
  520. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.br +0 -0
  521. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.gz +0 -0
  522. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css +0 -6
  523. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.br +0 -0
  524. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.gz +0 -0
  525. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css +0 -6
  526. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.br +0 -0
  527. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.gz +0 -0
  528. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css +0 -6
  529. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.br +0 -0
  530. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.gz +0 -0
  531. package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css +0 -6
  532. package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.br +0 -0
  533. package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.gz +0 -0
  534. package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -6
  535. package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.br +0 -0
  536. package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.gz +0 -0
  537. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -6
  538. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.br +0 -0
  539. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.gz +0 -0
  540. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css +0 -6
  541. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.br +0 -0
  542. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.gz +0 -0
  543. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -6
  544. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.br +0 -0
  545. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.gz +0 -0
  546. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -6
  547. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.br +0 -0
  548. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.gz +0 -0
  549. package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -6
  550. package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.br +0 -0
  551. package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.gz +0 -0
  552. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -6
  553. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.br +0 -0
  554. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.gz +0 -0
  555. package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.br +0 -0
  556. package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.gz +0 -0
  557. package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js +0 -6
  558. package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.br +0 -0
  559. package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.gz +0 -0
  560. package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js +0 -6
  561. package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.br +0 -0
  562. package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.gz +0 -0
  563. package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js +0 -6
  564. package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.br +0 -0
  565. package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.gz +0 -0
  566. package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js +0 -6
  567. package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.br +0 -0
  568. package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.gz +0 -0
  569. package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js +0 -6
  570. package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.br +0 -0
  571. package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.gz +0 -0
  572. package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.br +0 -0
  573. package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.gz +0 -0
  574. package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.br +0 -0
  575. package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.gz +0 -0
  576. package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js +0 -6
  577. package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.br +0 -0
  578. package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.gz +0 -0
  579. package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js +0 -6
  580. package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.br +0 -0
  581. package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.gz +0 -0
  582. package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.br +0 -0
  583. package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.gz +0 -0
  584. package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -6
  585. package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.br +0 -0
  586. package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.gz +0 -0
  587. package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.br +0 -0
  588. package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.gz +0 -0
  589. package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.br +0 -0
  590. package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.gz +0 -0
  591. package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js +0 -6
  592. package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.br +0 -0
  593. package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.gz +0 -0
  594. package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.br +0 -0
  595. package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.gz +0 -0
  596. package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js +0 -6
  597. package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.br +0 -0
  598. package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.gz +0 -0
  599. package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js +0 -6
  600. package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.br +0 -5
  601. package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.gz +0 -0
  602. package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.br +0 -0
  603. package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.gz +0 -0
  604. package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.br +0 -0
  605. package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.gz +0 -0
  606. package/frontend/build/client/_app/immutable/chunks/DDZw0L0T.js.br +0 -0
  607. package/frontend/build/client/_app/immutable/chunks/DDZw0L0T.js.gz +0 -0
  608. package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js +0 -7
  609. package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.br +0 -0
  610. package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.gz +0 -0
  611. package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.br +0 -0
  612. package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.gz +0 -0
  613. package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js +0 -6
  614. package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.br +0 -0
  615. package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.gz +0 -0
  616. package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js +0 -6
  617. package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.br +0 -0
  618. package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.gz +0 -0
  619. package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js +0 -11
  620. package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.br +0 -0
  621. package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.gz +0 -0
  622. package/frontend/build/client/_app/immutable/chunks/kkA1mrsH.js.br +0 -0
  623. package/frontend/build/client/_app/immutable/chunks/kkA1mrsH.js.gz +0 -0
  624. package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.br +0 -0
  625. package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.gz +0 -0
  626. package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.br +0 -0
  627. package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.gz +0 -0
  628. package/frontend/build/client/_app/immutable/entry/app.KrtMZ3my.js +0 -7
  629. package/frontend/build/client/_app/immutable/entry/app.KrtMZ3my.js.br +0 -0
  630. package/frontend/build/client/_app/immutable/entry/app.KrtMZ3my.js.gz +0 -0
  631. package/frontend/build/client/_app/immutable/nodes/0.C8DodwXs.js +0 -11
  632. package/frontend/build/client/_app/immutable/nodes/0.C8DodwXs.js.br +0 -0
  633. package/frontend/build/client/_app/immutable/nodes/0.C8DodwXs.js.gz +0 -0
  634. package/frontend/build/client/_app/immutable/nodes/1.Df9sLw8b.js.br +0 -0
  635. package/frontend/build/client/_app/immutable/nodes/1.Df9sLw8b.js.gz +0 -0
  636. package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.br +0 -0
  637. package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.gz +0 -0
  638. package/frontend/build/client/_app/immutable/nodes/11.BViaDK2m.js.br +0 -0
  639. package/frontend/build/client/_app/immutable/nodes/11.BViaDK2m.js.gz +0 -0
  640. package/frontend/build/client/_app/immutable/nodes/12.BMSCSd88.js +0 -6
  641. package/frontend/build/client/_app/immutable/nodes/12.BMSCSd88.js.br +0 -0
  642. package/frontend/build/client/_app/immutable/nodes/12.BMSCSd88.js.gz +0 -0
  643. package/frontend/build/client/_app/immutable/nodes/2.BCPSg7H4.js.br +0 -0
  644. package/frontend/build/client/_app/immutable/nodes/2.BCPSg7H4.js.gz +0 -0
  645. package/frontend/build/client/_app/immutable/nodes/3.8BFAJoHT.js.br +0 -0
  646. package/frontend/build/client/_app/immutable/nodes/3.8BFAJoHT.js.gz +0 -0
  647. package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js +0 -6
  648. package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.br +0 -0
  649. package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.gz +0 -0
  650. package/frontend/build/client/_app/immutable/nodes/5.DVeH2eQP.js +0 -6
  651. package/frontend/build/client/_app/immutable/nodes/5.DVeH2eQP.js.br +0 -0
  652. package/frontend/build/client/_app/immutable/nodes/5.DVeH2eQP.js.gz +0 -0
  653. package/frontend/build/client/_app/immutable/nodes/6.DI7-IJhN.js +0 -6
  654. package/frontend/build/client/_app/immutable/nodes/6.DI7-IJhN.js.br +0 -0
  655. package/frontend/build/client/_app/immutable/nodes/6.DI7-IJhN.js.gz +0 -0
  656. package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js +0 -6
  657. package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.br +0 -0
  658. package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.gz +0 -0
  659. package/frontend/build/client/_app/immutable/nodes/8.93Mb3ofT.js +0 -9
  660. package/frontend/build/client/_app/immutable/nodes/8.93Mb3ofT.js.br +0 -0
  661. package/frontend/build/client/_app/immutable/nodes/8.93Mb3ofT.js.gz +0 -0
  662. package/frontend/build/client/_app/immutable/nodes/9.CvfGx3Hu.js.br +0 -0
  663. package/frontend/build/client/_app/immutable/nodes/9.CvfGx3Hu.js.gz +0 -0
  664. package/frontend/build/server/chunks/0-D5YWFygh.js +0 -22
  665. package/frontend/build/server/chunks/0-D5YWFygh.js.map +0 -5
  666. package/frontend/build/server/chunks/10-l6_ikL_D.js +0 -14
  667. package/frontend/build/server/chunks/10-l6_ikL_D.js.map +0 -5
  668. package/frontend/build/server/chunks/11-CNLerze_.js +0 -14
  669. package/frontend/build/server/chunks/11-CNLerze_.js.map +0 -5
  670. package/frontend/build/server/chunks/12-De6Ol6pu.js +0 -14
  671. package/frontend/build/server/chunks/2-Dc_rKWoK.js +0 -14
  672. package/frontend/build/server/chunks/3-DrRqVrcX.js +0 -14
  673. package/frontend/build/server/chunks/3-DrRqVrcX.js.map +0 -5
  674. package/frontend/build/server/chunks/4-Bo04DC5Z.js +0 -14
  675. package/frontend/build/server/chunks/4-Bo04DC5Z.js.map +0 -5
  676. package/frontend/build/server/chunks/5-CFeE5dPZ.js +0 -14
  677. package/frontend/build/server/chunks/5-CFeE5dPZ.js.map +0 -5
  678. package/frontend/build/server/chunks/6-DZk37MZH.js +0 -14
  679. package/frontend/build/server/chunks/6-DZk37MZH.js.map +0 -5
  680. package/frontend/build/server/chunks/7-DiQJZEF_.js +0 -14
  681. package/frontend/build/server/chunks/8-CKPVFOqJ.js +0 -14
  682. package/frontend/build/server/chunks/8-CKPVFOqJ.js.map +0 -5
  683. package/frontend/build/server/chunks/9-DirZG_Lu.js +0 -14
  684. package/frontend/build/server/chunks/BackLink-BJ8NaemM.js.map +0 -5
  685. package/frontend/build/server/chunks/Badge-44ZTDx0V.js.map +0 -5
  686. package/frontend/build/server/chunks/ConfirmModal-C0EAXcq_.js.map +0 -5
  687. package/frontend/build/server/chunks/EmptyState-BA_eXaeR.js.map +0 -5
  688. package/frontend/build/server/chunks/Modal-DChG187n.js.map +0 -5
  689. package/frontend/build/server/chunks/Toast-v-q4ZnYq.js.map +0 -5
  690. package/frontend/build/server/chunks/_page.svelte-1as75nPc.js.map +0 -5
  691. package/frontend/build/server/chunks/_page.svelte-1jo8MapI.js.map +0 -5
  692. package/frontend/build/server/chunks/_page.svelte-8gELc_B1.js.map +0 -5
  693. package/frontend/build/server/chunks/_page.svelte-BuFusRK1.js.map +0 -5
  694. package/frontend/build/server/chunks/_page.svelte-CAVyp70V.js +0 -250
  695. package/frontend/build/server/chunks/_page.svelte-CAVyp70V.js.map +0 -5
  696. package/frontend/build/server/chunks/_page.svelte-CWWeZuid.js.map +0 -5
  697. package/frontend/build/server/chunks/_page.svelte-D3E6Eojd.js.map +0 -5
  698. package/frontend/build/server/chunks/_page.svelte-Kg69DDaM.js.map +0 -5
  699. package/frontend/build/server/chunks/_page.svelte-L9fuiN_q.js +0 -57
  700. package/frontend/build/server/chunks/_page.svelte-L9fuiN_q.js.map +0 -5
  701. package/frontend/build/server/chunks/constants-CXTaQaB6.js.map +0 -5
  702. package/frontend/build/server/chunks/reports2-BtElN_53.js.map +0 -5
  703. package/frontend/build/server/chunks/repository-FYYV_vKE.js.map +0 -5
  704. package/frontend/build/server/chunks/runner-DC7hXbnY.js +0 -37
  705. package/frontend/build/server/chunks/runner-DC7hXbnY.js.map +0 -5
  706. /package/frontend/.svelte-kit/output/client/_app/immutable/assets/{3.BR3wgXcZ.css → 4.BR3wgXcZ.css} +0 -0
  707. /package/frontend/build/client/_app/immutable/assets/{3.BR3wgXcZ.css → 4.BR3wgXcZ.css} +0 -0
  708. /package/frontend/build/client/_app/immutable/assets/{3.BR3wgXcZ.css.br → 4.BR3wgXcZ.css.br} +0 -0
  709. /package/frontend/build/client/_app/immutable/assets/{3.BR3wgXcZ.css.gz → 4.BR3wgXcZ.css.gz} +0 -0
package/CLAUDE.md CHANGED
@@ -137,7 +137,7 @@ Never write comments that:
137
137
  - Describe the current task or fix ("added for the live page", "handles issue #123")
138
138
  - Are multi-line docblocks explaining parameters
139
139
 
140
- The GPL license header at the top of every file is a legal requirement — do not remove it.
140
+ The MIT license header at the top of every file is a legal requirement — do not remove it. `npm run add-license` (config: `license-config.json`) applies and verifies it and runs in the pre-commit hook. Match the existing style for the file type: `/* … */` for JS/TS/CSS, `<!-- … -->` for Svelte, `# …` for shell/YAML/Dockerfiles/dotfiles, `// …` for `schema.prisma` (Prisma's formatter rewrites `/* */`, so it's kept out of `add-license` and headered by hand). JSON files carry no header.
141
141
 
142
142
  ---
143
143
 
package/README.md CHANGED
@@ -79,25 +79,28 @@ Full documentation is available at:
79
79
 
80
80
  ## Command Reference
81
81
 
82
- | Command | Description |
83
- | ----------------------------- | ----------------------------------------------------------------------------------------------------------------- |
84
- | `plum init` | Initialize a new project in the current folder |
85
- | `plum server start` | Start the full UI stack via Docker |
86
- | `plum server restart` | Rebuild Docker images and restart the server without prompts |
87
- | `plum server stop` | Stop the server (data preserved) |
88
- | `plum server reconfig` | Re-enter server settings without starting |
89
- | `plum update` | Update Plum, then restart each registered server/node on this machine (asks before each, in an interactive shell) |
90
- | `plum node start` | Set up connectivity, start a runner node, and open the runner menu |
91
- | `plum node restart` | Stop, refresh dependencies, and restart the runner node |
92
- | `plum node stop` | Stop the runner node started from this folder |
93
- | `plum node reconfig` | Re-enter node settings and re-register |
94
- | `plum run-test` | Run all tests locally without Docker |
95
- | `plum run-test @tag` | Run tests matching a tag |
96
- | `plum run-test --parallel N` | Run tests across N parallel workers |
97
- | `plum run-test --browser <b>` | Run in `chromium` (default) or `firefox` |
98
- | `plum run-test --help` | Show usage for `run-test` |
99
- | `plum create-step` | Interactively scaffold a new step definition |
100
- | `plum manage-runners` | Open the interactive runner management menu |
82
+ | Command | Description |
83
+ | ----------------------------- | --------------------------------------------------------------------------------------------- |
84
+ | `plum init` | Initialize a new project in the current folder |
85
+ | `plum server start` | Start the full UI stack via Docker |
86
+ | `plum server restart` | Rebuild Docker images and restart the server without prompts |
87
+ | `plum server stop` | Stop the server (data preserved) |
88
+ | `plum server reconfig` | Re-enter server settings without starting |
89
+ | `plum update` | Update Plum, then restart every registered server and node on this machine (asks before each) |
90
+ | `plum node start [name]` | Register a runner node with the server and start it on this machine |
91
+ | `plum node list` | List this machine's nodes and their status |
92
+ | `plum node restart [name]` | Stop, refresh dependencies, and restart a node |
93
+ | `plum node stop [name]` | Stop a node |
94
+ | `plum node delete <name>` | Stop the node, delete its local config, and unregister it from the server |
95
+ | `plum node reconfig [name]` | Re-enter a node's settings and re-register, without starting it |
96
+ | `plum run-test` | Run all tests locally without Docker |
97
+ | `plum run-test @tag` | Run tests matching a tag |
98
+ | `plum run-test --parallel N` | Run tests across N parallel workers |
99
+ | `plum run-test --browser <b>` | Run in `chromium` (default) or `firefox` |
100
+ | `plum run-test --help` | Show usage for `run-test` |
101
+ | `plum create-step` | Interactively scaffold a new step definition |
102
+ | `plum create-test` | Interactively scaffold a full feature (`.feature` + Page + Steps) |
103
+ | `plum manage-runners` | Open the interactive runner management menu |
101
104
 
102
105
  ---
103
106
 
@@ -126,7 +129,7 @@ npm run dev # available at http://localhost:5173
126
129
  ```bash
127
130
  cd backend
128
131
  npm test # run all tests
129
- npm test -- @test-1 # run a specific scenario
132
+ npm test -- @TC-001 # run a specific scenario
130
133
  npm test -- --parallel 4 # run in parallel
131
134
  npm run create-step # scaffold a step definition
132
135
  npm run create-test # scaffold a full test from template
@@ -1,18 +1,6 @@
1
1
  /*
2
2
  * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
3
+ * Licensed under the MIT License. See LICENSE file in the project root for details.
16
4
  */
17
5
 
18
6
  // Wires up Plum's session recording — removing or reordering code here can silently break report replay.
@@ -1,18 +1,6 @@
1
1
  /*
2
2
  * This file is part of Plum.
3
- *
4
- * Plum is free software: you can redistribute it and/or modify
5
- * it under the terms of the GNU General Public License as published by
6
- * the Free Software Foundation, either version 3 of the License, or
7
- * (at your option) any later version.
8
- *
9
- * Plum is distributed in the hope that it will be useful,
10
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
11
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
- * GNU General Public License for more details.
13
- *
14
- * You should have received a copy of the GNU General Public License
15
- * along with Plum. If not, see https://www.gnu.org/licenses/.
3
+ * Licensed under the MIT License. See LICENSE file in the project root for details.
16
4
  */
17
5
 
18
6
  // Wires up Plum's session recording — removing or reordering code here can silently break report replay.
@@ -10,18 +10,14 @@
10
10
  * in sync when adding or renaming an event.
11
11
  */
12
12
  const SOCKET_EVENTS = Object.freeze({
13
- // Interactive single-run (built-in runner, one browser tab watching)
13
+ // Client → server: request a run / cancel a run by id
14
14
  RUN_TEST: 'run-test',
15
15
  CANCEL_TEST: 'cancel-test',
16
- LOG: 'log',
17
- DONE: 'done',
18
16
 
19
- // Multi-lane distributed run (single interactive run, several runners)
20
- RUNNER_LANES_INIT: 'runner-lanes-init',
21
- RUNNER_LANE_LOG: 'runner-lane-log',
22
- RUNNER_LANE_STATUS: 'runner-lane-status',
23
-
24
- // Background runs (cron / REST / MCP triggered, no single owning socket)
17
+ // Server every client: one run's lifecycle, keyed by runId. Every run
18
+ // (manual, cron, REST, MCP) flows through the queue and streams over these —
19
+ // there is no separate "interactive" socket path.
20
+ BG_RUN_QUEUED: 'bg-run-queued',
25
21
  BG_RUN_START: 'bg-run-start',
26
22
  BG_RUN_LOG: 'bg-run-log',
27
23
  BG_RUN_DONE: 'bg-run-done',
@@ -29,11 +25,9 @@ const SOCKET_EVENTS = Object.freeze({
29
25
  BG_RUN_LANE_LOG: 'bg-run-lane-log',
30
26
  BG_RUN_LANE_STATUS: 'bg-run-lane-status',
31
27
 
32
- // Live rrweb streaming — one shape for every run type, always
33
- // carrying a lane id (BUILT_IN_RUNNER_ID for the plain single-run case) and
34
- // a workerId, so a single built-in run with --parallel workers is finally
35
- // attributable per worker instead of one flat interleaved stream.
36
- RUNNER_LANE_RRWEB_BATCH: 'runner-lane-rrweb-batch',
28
+ // Live rrweb streaming — always carries a lane id (BUILT_IN_RUNNER_ID for the
29
+ // plain single-runner case) and a workerId, so a run with --parallel workers
30
+ // is attributable per worker instead of one flat interleaved stream.
37
31
  BG_RUN_LANE_RRWEB_BATCH: 'bg-run-lane-rrweb-batch',
38
32
 
39
33
  // Global notifications (any client, not tied to a specific run)
@@ -40,17 +40,17 @@ function attachListenRetry(server, port) {
40
40
  }
41
41
 
42
42
  function wireRealtimeServices(io, isNodeMode) {
43
- if (isNodeMode) return { cronService: null, backupCronService: null };
43
+ if (isNodeMode) return { cronService: null, backupCronService: null, runQueueService: null };
44
44
 
45
45
  const socketHandler = require('../websockets/socketHandler.js');
46
46
  const cronService = require('../services/cronService');
47
47
  const backupCronService = require('../services/backupCronService');
48
+ const runQueueService = require('../services/runQueueService');
48
49
 
49
50
  socketHandler(io);
50
- cronService.setSocketIO(io);
51
- require('../routes/trigger.routes').setSocketIO(io);
51
+ runQueueService.setSocketIO(io);
52
52
 
53
- return { cronService, backupCronService };
53
+ return { cronService, backupCronService, runQueueService };
54
54
  }
55
55
 
56
56
  async function initCronServices(cronService, backupCronService) {
@@ -41,8 +41,8 @@ async function pollJob(jobId, { maxMs = 600_000, intervalMs = 5_000 } = {}) {
41
41
  const deadline = Date.now() + maxMs;
42
42
  while (Date.now() < deadline) {
43
43
  await new Promise((r) => setTimeout(r, intervalMs));
44
- const job = triggerService.getJob(jobId);
45
- if (job.status !== JOB_STATUS.RUNNING) return job;
44
+ const job = await triggerService.getJob(jobId);
45
+ if (job && job.status !== JOB_STATUS.RUNNING) return job;
46
46
  }
47
47
  return { status: 'timeout', jobId };
48
48
  }
@@ -379,7 +379,7 @@ function createMcpServer({ userId }) {
379
379
  jobId: z.string().uuid().describe('Job ID returned by run_tests')
380
380
  },
381
381
  async ({ jobId }) => {
382
- const job = triggerService.getJob(jobId);
382
+ const job = await triggerService.getJob(jobId);
383
383
  if (!job) throw new Error('Job not found');
384
384
  return { content: [{ type: 'text', text: JSON.stringify(job, null, 2) }] };
385
385
  }
@@ -0,0 +1,29 @@
1
+ -- CreateTable
2
+ CREATE TABLE "RunQueue" (
3
+ "id" TEXT NOT NULL,
4
+ "kind" TEXT NOT NULL,
5
+ "triggerType" TEXT NOT NULL DEFAULT 'manual-trigger',
6
+ "label" TEXT NOT NULL DEFAULT '',
7
+ "status" TEXT NOT NULL DEFAULT 'queued',
8
+ "tag" TEXT NOT NULL DEFAULT '',
9
+ "workers" INTEGER NOT NULL DEFAULT 1,
10
+ "browser" TEXT NOT NULL DEFAULT 'chromium',
11
+ "runnerIds" TEXT NOT NULL DEFAULT 'built-in',
12
+ "testRunId" TEXT,
13
+ "baseUrl" TEXT,
14
+ "runTitle" TEXT,
15
+ "startedBy" TEXT,
16
+ "notifyDiscord" BOOLEAN NOT NULL DEFAULT false,
17
+ "notifySlack" BOOLEAN NOT NULL DEFAULT false,
18
+ "reportId" INTEGER,
19
+ "exitCode" INTEGER,
20
+ "note" TEXT,
21
+ "queuedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
22
+ "startedAt" TIMESTAMP(3),
23
+ "finishedAt" TIMESTAMP(3),
24
+
25
+ CONSTRAINT "RunQueue_pkey" PRIMARY KEY ("id")
26
+ );
27
+
28
+ -- CreateIndex
29
+ CREATE INDEX "RunQueue_status_queuedAt_idx" ON "RunQueue"("status", "queuedAt");
@@ -1,16 +1,6 @@
1
- /**
2
- * This file is part of Plum.
3
- * Plum is free software: you can redistribute it and/or modify
4
- * it under the terms of the GNU General Public License as published by
5
- * the Free Software Foundation, either version 3 of the License, or
6
- * (at your option) any later version.
7
- * Plum is distributed in the hope that it will be useful,
8
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
9
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
- * GNU General Public License for more details.
11
- * You should have received a copy of the GNU General Public License
12
- * along with Plum. If not, see https://www.gnu.org/licenses/.
13
- */
1
+ // This file is part of Plum.
2
+ // Licensed under the MIT License. See LICENSE file in the project root for details.
3
+
14
4
  generator client {
15
5
  provider = "prisma-client-js"
16
6
  }
@@ -229,6 +219,36 @@ model TestRunEntry {
229
219
  @@index([caseId])
230
220
  }
231
221
 
222
+ // One row per run request (manual, cron, external, mcp). A run stays `queued`
223
+ // until every runner it targets is free, then flips to `running`, then `done`.
224
+ // DB-backed so the queue survives a restart — stale `running` rows are
225
+ // reconciled to `done` on boot and queued rows resume.
226
+ model RunQueue {
227
+ id String @id
228
+ kind String
229
+ triggerType String @default("manual-trigger")
230
+ label String @default("")
231
+ status String @default("queued")
232
+ tag String @default("")
233
+ workers Int @default(1)
234
+ browser String @default("chromium")
235
+ runnerIds String @default("built-in")
236
+ testRunId String?
237
+ baseUrl String?
238
+ runTitle String?
239
+ startedBy String?
240
+ notifyDiscord Boolean @default(false)
241
+ notifySlack Boolean @default(false)
242
+ reportId Int?
243
+ exitCode Int?
244
+ note String?
245
+ queuedAt DateTime @default(now())
246
+ startedAt DateTime?
247
+ finishedAt DateTime?
248
+
249
+ @@index([status, queuedAt])
250
+ }
251
+
232
252
  model TestCaseHistory {
233
253
  id String @id @default(cuid())
234
254
  caseId String
@@ -5,14 +5,18 @@
5
5
 
6
6
  const express = require('express');
7
7
  const router = express.Router();
8
- const activeRunsService = require('../services/activeRunsService');
8
+ const runQueueService = require('../services/runQueueService');
9
9
  const { jwtAuth } = require('../middleware/jwtAuth');
10
10
 
11
- // Runs carry a real user's display name (`startedBy`) — gate this the same way as
12
- // other identity-bearing routes (test-suites, test-runs, users), not left open like
13
- // the purely operational GET routes (reports, tests) that never touch user identity.
14
- router.get('/', jwtAuth, (req, res) => {
15
- res.json({ runs: activeRunsService.listActiveRuns() });
11
+ // Queued + running rows carry a real user's display name (`startedBy`) — gate
12
+ // this the same way as other identity-bearing routes, not left open like the
13
+ // purely operational GET routes.
14
+ router.get('/', jwtAuth, async (req, res, next) => {
15
+ try {
16
+ res.json({ runs: await runQueueService.listActive() });
17
+ } catch (e) {
18
+ next(e);
19
+ }
16
20
  });
17
21
 
18
22
  module.exports = router;
@@ -49,6 +49,13 @@ router.post('/execute', authGuard, (req, res) => {
49
49
  res.json({ jobId, status: 'started' });
50
50
  });
51
51
 
52
+ // Stop a running job (primary server relays a user's cancel)
53
+ router.post('/cancel/:jobId', authGuard, (req, res) => {
54
+ const ok = nodeExecutionService.cancelJob(req.params.jobId);
55
+ if (!ok) return res.status(404).json({ error: 'Job not found' });
56
+ res.json({ ok: true });
57
+ });
58
+
52
59
  // Fetch the final report content after a job completes
53
60
  router.get('/report/:jobId', authGuard, (req, res) => {
54
61
  const job = nodeExecutionService.getJob(req.params.jobId);
@@ -37,11 +37,14 @@ router.post('/', jwtAuth, async (req, res, next) => {
37
37
  }
38
38
  });
39
39
 
40
- router.get('/:jobId', jwtAuth, (req, res) => {
41
- const job = triggerService.getJob(req.params.jobId);
42
- if (!job) return res.status(404).json({ error: 'Job not found' });
43
- res.json(job);
40
+ router.get('/:jobId', jwtAuth, async (req, res, next) => {
41
+ try {
42
+ const job = await triggerService.getJob(req.params.jobId);
43
+ if (!job) return res.status(404).json({ error: 'Job not found' });
44
+ res.json(job);
45
+ } catch (e) {
46
+ next(e);
47
+ }
44
48
  });
45
49
 
46
50
  module.exports = router;
47
- router.setSocketIO = triggerService.setSocketIO;
package/backend/server.js CHANGED
@@ -41,11 +41,15 @@ async function start() {
41
41
  attachListenRetry(server, port);
42
42
 
43
43
  // Connect socket.io to the runner/cron services (a no-op in node mode).
44
- const { cronService, backupCronService } = wireRealtimeServices(io, isNodeMode);
44
+ const { cronService, backupCronService, runQueueService } = wireRealtimeServices(io, isNodeMode);
45
45
 
46
46
  // Start the scheduled test and backup cron jobs.
47
47
  await initCronServices(cronService, backupCronService);
48
48
 
49
+ // Reconcile the persisted run queue: clear rows left "running" by a crash,
50
+ // then resume anything still queued.
51
+ if (runQueueService) await runQueueService.init(io);
52
+
49
53
  // Load the saved MCP API key into the environment for the MCP server.
50
54
  await bootstrapMcpKey(isNodeMode);
51
55