plum-e2e 2.6.9 → 2.7.1

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 (899) hide show
  1. package/CLAUDE.md +17 -2
  2. package/LICENSE +21 -677
  3. package/README.md +1 -1
  4. package/backend/Dockerfile +1 -13
  5. package/backend/app.js +4 -14
  6. package/backend/config/scripts/create-step.mjs +1 -13
  7. package/backend/config/scripts/create-test.mjs +1 -13
  8. package/backend/config/scripts/generate-report.js +5 -15
  9. package/backend/config/scripts/run-tests.js +5 -16
  10. package/backend/constants/defaults.js +8 -0
  11. package/backend/constants/env.js +16 -0
  12. package/backend/constants/jobStatus.js +21 -0
  13. package/backend/constants/socketEvents.js +40 -0
  14. package/backend/constants/triggers.js +6 -14
  15. package/backend/entrypoint.sh +1 -13
  16. package/backend/lib/authHeader.js +16 -0
  17. package/backend/lib/globalRegistry.js +1 -13
  18. package/backend/lib/nodeRegister.js +1 -13
  19. package/backend/lib/reportFilename.js +1 -13
  20. package/backend/lib/retryRunner.js +1 -13
  21. package/backend/lib/runnerProcess.js +5 -16
  22. package/backend/lib/screenshotPoller.js +1 -13
  23. package/backend/lib/serverBootstrap.js +189 -0
  24. package/backend/lib/serverConfig.js +1 -13
  25. package/backend/lib/testChunker.js +1 -13
  26. package/backend/lib/testEnv.js +1 -13
  27. package/backend/mcp/server.js +5 -15
  28. package/backend/middleware/auth.js +4 -14
  29. package/backend/middleware/jwtAuth.js +5 -16
  30. package/backend/middleware/requireAdmin.js +1 -13
  31. package/backend/package.json +3 -3
  32. package/backend/playwright.config.js +1 -13
  33. package/backend/routes/active-runs.routes.js +18 -0
  34. package/backend/routes/auth.routes.js +1 -13
  35. package/backend/routes/backup.routes.js +10 -21
  36. package/backend/routes/cron.routes.js +1 -13
  37. package/backend/routes/node.routes.js +11 -148
  38. package/backend/routes/reports.routes.js +1 -13
  39. package/backend/routes/runners.routes.js +11 -21
  40. package/backend/routes/settings.routes.js +6 -17
  41. package/backend/routes/test-cases.routes.js +1 -13
  42. package/backend/routes/test-runs.routes.js +1 -13
  43. package/backend/routes/test-suites.routes.js +1 -13
  44. package/backend/routes/tests.routes.js +1 -13
  45. package/backend/routes/trigger.routes.js +23 -165
  46. package/backend/routes/users.routes.js +1 -13
  47. package/backend/scripts/manage-runners.mjs +1 -13
  48. package/backend/server.js +34 -151
  49. package/backend/services/activeRunsService.js +55 -0
  50. package/backend/services/backupCronService.js +1 -13
  51. package/backend/services/backupService.js +7 -17
  52. package/backend/services/cronService.js +57 -39
  53. package/backend/services/envService.js +1 -13
  54. package/backend/services/nodeExecutionService.js +140 -0
  55. package/backend/services/notificationService.js +7 -17
  56. package/backend/services/prisma.js +1 -13
  57. package/backend/services/reportService.js +21 -17
  58. package/backend/services/runnerService.js +46 -27
  59. package/backend/services/settingsService.js +19 -19
  60. package/backend/services/testCaseService.js +1 -13
  61. package/backend/services/testRunService.js +1 -13
  62. package/backend/services/testService.js +1 -13
  63. package/backend/services/testSuiteService.js +1 -13
  64. package/backend/services/triggerService.js +246 -0
  65. package/backend/services/userService.js +1 -13
  66. package/backend/websockets/socketHandler.js +99 -48
  67. package/bin/plum.js +1 -13
  68. package/bin/postinstall.js +1 -13
  69. package/bin/scaffold-tests.js +1 -13
  70. package/docker-compose.node.yml +1 -13
  71. package/docker-compose.yml +1 -13
  72. package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +3 -3
  73. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
  74. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
  75. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
  76. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
  77. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
  78. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
  79. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
  80. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
  81. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.0Eln51hV.css +0 -22
  82. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
  83. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
  84. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
  85. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
  86. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
  87. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
  88. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
  89. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
  90. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
  91. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page._h2o67kg.css +0 -22
  92. package/frontend/.svelte-kit/adapter-node/chunks/BackLink.js +0 -22
  93. package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +1 -23
  94. package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +1 -23
  95. package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +2 -24
  96. package/frontend/.svelte-kit/adapter-node/chunks/Modal.js +0 -22
  97. package/frontend/.svelte-kit/adapter-node/chunks/Toast.js +1 -23
  98. package/frontend/.svelte-kit/adapter-node/chunks/attributes.js +0 -22
  99. package/frontend/.svelte-kit/adapter-node/chunks/auth.js +0 -22
  100. package/frontend/.svelte-kit/adapter-node/chunks/auth2.js +0 -22
  101. package/frontend/.svelte-kit/adapter-node/chunks/client.js +0 -22
  102. package/frontend/.svelte-kit/adapter-node/chunks/common.js +9 -29
  103. package/frontend/.svelte-kit/adapter-node/chunks/constants.js +4 -23
  104. package/frontend/.svelte-kit/adapter-node/chunks/escaping.js +0 -22
  105. package/frontend/.svelte-kit/adapter-node/chunks/exports.js +0 -22
  106. package/frontend/.svelte-kit/adapter-node/chunks/format.js +0 -22
  107. package/frontend/.svelte-kit/adapter-node/chunks/index-server.js +0 -22
  108. package/frontend/.svelte-kit/adapter-node/chunks/index.js +4 -26
  109. package/frontend/.svelte-kit/adapter-node/chunks/index2.js +0 -22
  110. package/frontend/.svelte-kit/adapter-node/chunks/internal.js +1 -23
  111. package/frontend/.svelte-kit/adapter-node/chunks/reports.js +0 -22
  112. package/frontend/.svelte-kit/adapter-node/chunks/reports2.js +0 -22
  113. package/frontend/.svelte-kit/adapter-node/chunks/repository.js +10 -34
  114. package/frontend/.svelte-kit/adapter-node/chunks/runner.js +2 -25
  115. package/frontend/.svelte-kit/adapter-node/chunks/stores.js +0 -22
  116. package/frontend/.svelte-kit/adapter-node/chunks/theme.js +0 -22
  117. package/frontend/.svelte-kit/adapter-node/entries/fallbacks/error.svelte.js +0 -22
  118. package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.js +0 -22
  119. package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +0 -22
  120. package/frontend/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +114 -103
  121. package/frontend/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +1 -23
  122. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +1 -23
  123. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +1 -23
  124. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/live/_page.svelte.js +1 -23
  125. package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +1 -23
  126. package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +2 -24
  127. package/frontend/.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js +1 -23
  128. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/_page.svelte.js +3 -25
  129. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -25
  130. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +3 -25
  131. package/frontend/.svelte-kit/adapter-node/index.js +0 -22
  132. package/frontend/.svelte-kit/adapter-node/internal.js +0 -22
  133. package/frontend/.svelte-kit/adapter-node/manifest-full.js +1 -23
  134. package/frontend/.svelte-kit/adapter-node/manifest.js +1 -23
  135. package/frontend/.svelte-kit/adapter-node/nodes/0.js +1 -23
  136. package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -23
  137. package/frontend/.svelte-kit/adapter-node/nodes/10.js +1 -23
  138. package/frontend/.svelte-kit/adapter-node/nodes/11.js +1 -23
  139. package/frontend/.svelte-kit/adapter-node/nodes/12.js +1 -23
  140. package/frontend/.svelte-kit/adapter-node/nodes/2.js +2 -24
  141. package/frontend/.svelte-kit/adapter-node/nodes/3.js +1 -23
  142. package/frontend/.svelte-kit/adapter-node/nodes/4.js +1 -23
  143. package/frontend/.svelte-kit/adapter-node/nodes/5.js +1 -23
  144. package/frontend/.svelte-kit/adapter-node/nodes/6.js +1 -23
  145. package/frontend/.svelte-kit/adapter-node/nodes/7.js +1 -23
  146. package/frontend/.svelte-kit/adapter-node/nodes/8.js +1 -23
  147. package/frontend/.svelte-kit/adapter-node/nodes/9.js +1 -23
  148. package/frontend/.svelte-kit/ambient.d.ts +2 -22
  149. package/frontend/.svelte-kit/generated/client/app.js +0 -22
  150. package/frontend/.svelte-kit/generated/client/matchers.js +0 -22
  151. package/frontend/.svelte-kit/generated/client/nodes/0.js +0 -22
  152. package/frontend/.svelte-kit/generated/client/nodes/1.js +0 -22
  153. package/frontend/.svelte-kit/generated/client/nodes/10.js +0 -22
  154. package/frontend/.svelte-kit/generated/client/nodes/11.js +0 -22
  155. package/frontend/.svelte-kit/generated/client/nodes/12.js +0 -22
  156. package/frontend/.svelte-kit/generated/client/nodes/2.js +0 -22
  157. package/frontend/.svelte-kit/generated/client/nodes/3.js +0 -22
  158. package/frontend/.svelte-kit/generated/client/nodes/4.js +0 -22
  159. package/frontend/.svelte-kit/generated/client/nodes/5.js +0 -22
  160. package/frontend/.svelte-kit/generated/client/nodes/6.js +0 -22
  161. package/frontend/.svelte-kit/generated/client/nodes/7.js +0 -22
  162. package/frontend/.svelte-kit/generated/client/nodes/8.js +0 -22
  163. package/frontend/.svelte-kit/generated/client/nodes/9.js +0 -22
  164. package/frontend/.svelte-kit/generated/client-optimized/app.js +0 -22
  165. package/frontend/.svelte-kit/generated/client-optimized/matchers.js +0 -22
  166. package/frontend/.svelte-kit/generated/client-optimized/nodes/0.js +0 -22
  167. package/frontend/.svelte-kit/generated/client-optimized/nodes/1.js +0 -22
  168. package/frontend/.svelte-kit/generated/client-optimized/nodes/10.js +0 -22
  169. package/frontend/.svelte-kit/generated/client-optimized/nodes/11.js +0 -22
  170. package/frontend/.svelte-kit/generated/client-optimized/nodes/12.js +0 -22
  171. package/frontend/.svelte-kit/generated/client-optimized/nodes/2.js +0 -22
  172. package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +0 -22
  173. package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +0 -22
  174. package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +0 -22
  175. package/frontend/.svelte-kit/generated/client-optimized/nodes/6.js +0 -22
  176. package/frontend/.svelte-kit/generated/client-optimized/nodes/7.js +0 -22
  177. package/frontend/.svelte-kit/generated/client-optimized/nodes/8.js +0 -22
  178. package/frontend/.svelte-kit/generated/client-optimized/nodes/9.js +0 -22
  179. package/frontend/.svelte-kit/generated/root.js +0 -22
  180. package/frontend/.svelte-kit/generated/root.svelte +0 -22
  181. package/frontend/.svelte-kit/generated/server/internal.js +1 -23
  182. package/frontend/.svelte-kit/non-ambient.d.ts +0 -22
  183. package/frontend/.svelte-kit/output/client/.vite/manifest.json +225 -224
  184. package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.BhSG-jZH.css +0 -22
  185. package/frontend/.svelte-kit/output/client/_app/immutable/assets/10.CdaQUS6U.css +0 -22
  186. package/frontend/.svelte-kit/output/client/_app/immutable/assets/11.BWAH0Beh.css +0 -22
  187. package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -22
  188. package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.DvMkmYA-.css +1 -0
  189. package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BR3wgXcZ.css +0 -22
  190. package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.0Eln51hV.css +0 -22
  191. package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.DFV9OgAu.css +0 -22
  192. package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.CFnbmY-D.css +0 -22
  193. package/frontend/.svelte-kit/output/client/_app/immutable/assets/7.CBHi6pzT.css +0 -22
  194. package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.BwgOqeMo.css +0 -22
  195. package/frontend/.svelte-kit/output/client/_app/immutable/assets/9._h2o67kg.css +0 -22
  196. package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
  197. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
  198. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -22
  199. package/frontend/.svelte-kit/output/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
  200. package/frontend/.svelte-kit/output/client/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
  201. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Modal.BZpm0HP8.css +0 -22
  202. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
  203. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
  204. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
  205. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
  206. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.0Eln51hV.css +0 -22
  207. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
  208. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
  209. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
  210. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
  211. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
  212. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
  213. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
  214. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
  215. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
  216. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page._h2o67kg.css +0 -22
  217. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/2zMvi6fR.js +0 -22
  218. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{D2cvzNT9.js → 3InFPLvE.js} +1 -23
  219. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAACMRH5.js +0 -22
  220. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAMUGSh7.js +1 -0
  221. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BKuh57WU.js +1 -0
  222. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DkNBSlo2.js → BUwxRmHf.js} +1 -23
  223. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bfc47y5P.js +0 -22
  224. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DYlaQsvN.js → BmZ9upwL.js} +1 -23
  225. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C1Vid6wz.js +0 -22
  226. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C8OURRSs.js +0 -22
  227. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CGeZlCaI.js +1 -0
  228. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CKDtmZUQ.js +0 -22
  229. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -22
  230. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{BjUpWNbl.js → CMEtqUfQ.js} +1 -23
  231. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CNdcuGR0.js +0 -22
  232. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CUC98kMZ.js +1 -0
  233. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CgnwuKKO.js +0 -22
  234. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{B98sHkeB.js → Co3xKhEp.js} +1 -23
  235. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CuqnZUex.js +0 -22
  236. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DlNYZJ7K.js → CzlPaHY9.js} +1 -23
  237. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DCgHuuvs.js +0 -22
  238. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DHM6H-es.js +2 -0
  239. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{3IV-uqHa.js → DMZwI8Cj.js} +1 -23
  240. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DMyTUV-Y.js +3 -0
  241. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{D2gYTmAA.js → DSLBMEpr.js} +1 -23
  242. package/frontend/{build/client/_app/immutable/chunks/DDblTLLE.js → .svelte-kit/output/client/_app/immutable/chunks/DbgD7JLa.js} +1 -23
  243. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Dlnxgs49.js +0 -22
  244. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/TOCyHP97.js +0 -22
  245. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/nURnIknV.js +1 -0
  246. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/t-La0hgu.js +0 -22
  247. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/w0D4Uzlq.js +0 -22
  248. package/frontend/.svelte-kit/output/client/_app/immutable/entry/{app.BCWbw5zZ.js → app.BkBD0hgA.js} +2 -24
  249. package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.BxeX1Uxs.js +1 -0
  250. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.ChjDHxSJ.js +6 -0
  251. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.DBSWa36f.js +1 -0
  252. package/frontend/{build/client/_app/immutable/nodes/10.Bn4Ma-MU.js → .svelte-kit/output/client/_app/immutable/nodes/10.DEbnxfND.js} +1 -23
  253. package/frontend/{build/client/_app/immutable/nodes/11.BacEu7sW.js → .svelte-kit/output/client/_app/immutable/nodes/11.O4cjXCg4.js} +1 -23
  254. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.BWQdeRdX.js +1 -0
  255. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.BnHalSCi.js +1 -0
  256. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{3.DHx0kho3.js → 3._S1vrLVF.js} +1 -23
  257. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{4.CnaMiirx.js → 4.D-YT_JJe.js} +1 -23
  258. package/frontend/{build/client/_app/immutable/nodes/5.B6m-zTVe.js → .svelte-kit/output/client/_app/immutable/nodes/5.BiFBiWcW.js} +1 -23
  259. package/frontend/{build/client/_app/immutable/nodes/6.BPDag1zv.js → .svelte-kit/output/client/_app/immutable/nodes/6.BNS-W0R_.js} +1 -23
  260. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{7.D7LwxSvT.js → 7.C-pKvVZy.js} +1 -23
  261. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{8.CCkNX20G.js → 8.BEUdazrw.js} +1 -23
  262. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{9.HDerA6JV.js → 9.CrLHYPEJ.js} +1 -23
  263. package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
  264. package/frontend/.svelte-kit/output/server/.vite/manifest.json +3 -3
  265. package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
  266. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
  267. package/frontend/.svelte-kit/output/server/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
  268. package/frontend/.svelte-kit/output/server/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
  269. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
  270. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
  271. package/frontend/.svelte-kit/output/server/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
  272. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
  273. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.0Eln51hV.css +0 -22
  274. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
  275. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
  276. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
  277. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
  278. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
  279. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
  280. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
  281. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
  282. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
  283. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page._h2o67kg.css +0 -22
  284. package/frontend/.svelte-kit/output/server/chunks/BackLink.js +0 -22
  285. package/frontend/.svelte-kit/output/server/chunks/Badge.js +1 -23
  286. package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +1 -23
  287. package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +2 -24
  288. package/frontend/.svelte-kit/output/server/chunks/Modal.js +0 -22
  289. package/frontend/.svelte-kit/output/server/chunks/Toast.js +1 -23
  290. package/frontend/.svelte-kit/output/server/chunks/attributes.js +0 -22
  291. package/frontend/.svelte-kit/output/server/chunks/auth.js +0 -22
  292. package/frontend/.svelte-kit/output/server/chunks/auth2.js +0 -22
  293. package/frontend/.svelte-kit/output/server/chunks/client.js +0 -22
  294. package/frontend/.svelte-kit/output/server/chunks/common.js +9 -29
  295. package/frontend/.svelte-kit/output/server/chunks/constants.js +4 -23
  296. package/frontend/.svelte-kit/output/server/chunks/escaping.js +0 -22
  297. package/frontend/.svelte-kit/output/server/chunks/exports.js +0 -22
  298. package/frontend/.svelte-kit/output/server/chunks/format.js +0 -22
  299. package/frontend/.svelte-kit/output/server/chunks/index-server.js +0 -22
  300. package/frontend/.svelte-kit/output/server/chunks/index.js +4 -26
  301. package/frontend/.svelte-kit/output/server/chunks/index2.js +0 -22
  302. package/frontend/.svelte-kit/output/server/chunks/internal.js +1 -23
  303. package/frontend/.svelte-kit/output/server/chunks/reports.js +0 -22
  304. package/frontend/.svelte-kit/output/server/chunks/reports2.js +0 -22
  305. package/frontend/.svelte-kit/output/server/chunks/repository.js +10 -34
  306. package/frontend/.svelte-kit/output/server/chunks/runner.js +2 -25
  307. package/frontend/.svelte-kit/output/server/chunks/stores.js +0 -22
  308. package/frontend/.svelte-kit/output/server/chunks/theme.js +0 -22
  309. package/frontend/.svelte-kit/output/server/entries/fallbacks/error.svelte.js +0 -22
  310. package/frontend/.svelte-kit/output/server/entries/pages/_layout.js +0 -22
  311. package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +0 -22
  312. package/frontend/.svelte-kit/output/server/entries/pages/_page.svelte.js +114 -103
  313. package/frontend/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +1 -23
  314. package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +1 -23
  315. package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +1 -23
  316. package/frontend/.svelte-kit/output/server/entries/pages/reports/live/_page.svelte.js +1 -23
  317. package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +1 -23
  318. package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +2 -24
  319. package/frontend/.svelte-kit/output/server/entries/pages/setup/_page.svelte.js +1 -23
  320. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/_page.svelte.js +3 -25
  321. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -25
  322. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +3 -25
  323. package/frontend/.svelte-kit/output/server/index.js +0 -22
  324. package/frontend/.svelte-kit/output/server/internal.js +0 -22
  325. package/frontend/.svelte-kit/output/server/manifest-full.js +1 -23
  326. package/frontend/.svelte-kit/output/server/manifest.js +1 -23
  327. package/frontend/.svelte-kit/output/server/nodes/0.js +1 -23
  328. package/frontend/.svelte-kit/output/server/nodes/1.js +1 -23
  329. package/frontend/.svelte-kit/output/server/nodes/10.js +1 -23
  330. package/frontend/.svelte-kit/output/server/nodes/11.js +1 -23
  331. package/frontend/.svelte-kit/output/server/nodes/12.js +1 -23
  332. package/frontend/.svelte-kit/output/server/nodes/2.js +2 -24
  333. package/frontend/.svelte-kit/output/server/nodes/3.js +1 -23
  334. package/frontend/.svelte-kit/output/server/nodes/4.js +1 -23
  335. package/frontend/.svelte-kit/output/server/nodes/5.js +1 -23
  336. package/frontend/.svelte-kit/output/server/nodes/6.js +1 -23
  337. package/frontend/.svelte-kit/output/server/nodes/7.js +1 -23
  338. package/frontend/.svelte-kit/output/server/nodes/8.js +1 -23
  339. package/frontend/.svelte-kit/output/server/nodes/9.js +1 -23
  340. package/frontend/Dockerfile +1 -13
  341. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css +0 -22
  342. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.br +0 -0
  343. package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.gz +0 -0
  344. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css +0 -22
  345. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.br +0 -0
  346. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.gz +0 -0
  347. package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css +0 -22
  348. package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css.br +0 -0
  349. package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css.gz +0 -0
  350. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -22
  351. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.br +0 -0
  352. package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.gz +0 -0
  353. package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css +1 -0
  354. package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css.br +0 -0
  355. package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css.gz +0 -0
  356. package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css +0 -22
  357. package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.br +0 -0
  358. package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.gz +0 -0
  359. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css +0 -22
  360. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.br +0 -0
  361. package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.gz +0 -0
  362. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css +0 -22
  363. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.br +0 -0
  364. package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.gz +0 -0
  365. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css +0 -22
  366. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.br +0 -0
  367. package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.gz +0 -0
  368. package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css +0 -22
  369. package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.br +0 -0
  370. package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.gz +0 -0
  371. package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css +0 -22
  372. package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.br +0 -0
  373. package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.gz +0 -0
  374. package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css +0 -22
  375. package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.br +0 -0
  376. package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.gz +0 -0
  377. package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -22
  378. package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.br +0 -0
  379. package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.gz +0 -0
  380. package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -22
  381. package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.br +0 -0
  382. package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.gz +0 -0
  383. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -22
  384. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.br +0 -0
  385. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.gz +0 -0
  386. package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -22
  387. package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css.br +0 -0
  388. package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css.gz +0 -0
  389. package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -22
  390. package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css.br +0 -0
  391. package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css.gz +0 -0
  392. package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css +0 -22
  393. package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css.br +0 -0
  394. package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css.gz +0 -0
  395. package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css +0 -22
  396. package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css.br +0 -0
  397. package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css.gz +0 -0
  398. package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -22
  399. package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.br +0 -0
  400. package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.gz +0 -0
  401. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css +0 -22
  402. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.br +0 -0
  403. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.gz +0 -0
  404. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -22
  405. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.br +0 -0
  406. package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.gz +0 -0
  407. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css +0 -22
  408. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.br +0 -0
  409. package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.gz +0 -0
  410. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -22
  411. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.br +0 -0
  412. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.gz +0 -0
  413. package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css +0 -22
  414. package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.br +0 -0
  415. package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.gz +0 -0
  416. package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css +0 -22
  417. package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css.br +0 -0
  418. package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css.gz +0 -0
  419. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -22
  420. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.br +0 -0
  421. package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.gz +0 -0
  422. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -22
  423. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.br +0 -0
  424. package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.gz +0 -0
  425. package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -22
  426. package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.br +0 -0
  427. package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.gz +0 -0
  428. package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css +0 -22
  429. package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.br +0 -0
  430. package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.gz +0 -0
  431. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -22
  432. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.br +0 -0
  433. package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.gz +0 -0
  434. package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css +1 -0
  435. package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css.br +0 -0
  436. package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css.gz +0 -0
  437. package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css +0 -22
  438. package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.br +0 -0
  439. package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.gz +0 -0
  440. package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js +0 -22
  441. package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.br +0 -0
  442. package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.gz +0 -0
  443. package/frontend/build/client/_app/immutable/chunks/{D2cvzNT9.js → 3InFPLvE.js} +1 -23
  444. package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.br +0 -0
  445. package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.gz +0 -0
  446. package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js +0 -22
  447. package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.br +0 -0
  448. package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.gz +0 -0
  449. package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js +1 -0
  450. package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.br +0 -0
  451. package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.gz +0 -0
  452. package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js +1 -0
  453. package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.br +0 -0
  454. package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.gz +0 -0
  455. package/frontend/build/client/_app/immutable/chunks/{DkNBSlo2.js → BUwxRmHf.js} +1 -23
  456. package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.br +0 -0
  457. package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.gz +0 -0
  458. package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js +0 -22
  459. package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.br +0 -0
  460. package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.gz +0 -0
  461. package/frontend/build/client/_app/immutable/chunks/{DYlaQsvN.js → BmZ9upwL.js} +1 -23
  462. package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.br +0 -0
  463. package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.gz +0 -0
  464. package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js +0 -22
  465. package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.br +0 -0
  466. package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.gz +0 -0
  467. package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js +0 -22
  468. package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.br +0 -0
  469. package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.gz +0 -0
  470. package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js +1 -0
  471. package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.br +0 -0
  472. package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.gz +0 -0
  473. package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js +0 -22
  474. package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.br +0 -0
  475. package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.gz +0 -0
  476. package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -22
  477. package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.br +0 -0
  478. package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.gz +0 -0
  479. package/frontend/build/client/_app/immutable/chunks/{BjUpWNbl.js → CMEtqUfQ.js} +1 -23
  480. package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.br +0 -0
  481. package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.gz +0 -0
  482. package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js +0 -22
  483. package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.br +0 -0
  484. package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.gz +0 -0
  485. package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js +1 -0
  486. package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.br +0 -0
  487. package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.gz +0 -0
  488. package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js +0 -22
  489. package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.br +0 -0
  490. package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.gz +0 -0
  491. package/frontend/build/client/_app/immutable/chunks/{B98sHkeB.js → Co3xKhEp.js} +1 -23
  492. package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.br +0 -0
  493. package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.gz +0 -0
  494. package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js +0 -22
  495. package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.br +1 -21
  496. package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.gz +0 -0
  497. package/frontend/build/client/_app/immutable/chunks/{DlNYZJ7K.js → CzlPaHY9.js} +1 -23
  498. package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.br +0 -0
  499. package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.gz +0 -0
  500. package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js +0 -22
  501. package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.br +0 -0
  502. package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.gz +0 -0
  503. package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js +2 -0
  504. package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.br +0 -0
  505. package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.gz +0 -0
  506. package/frontend/build/client/_app/immutable/chunks/{3IV-uqHa.js → DMZwI8Cj.js} +1 -23
  507. package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.br +0 -0
  508. package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.gz +0 -0
  509. package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js +3 -0
  510. package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js.br +0 -0
  511. package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js.gz +0 -0
  512. package/frontend/build/client/_app/immutable/chunks/{D2gYTmAA.js → DSLBMEpr.js} +1 -23
  513. package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.br +0 -0
  514. package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.gz +0 -0
  515. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/DDblTLLE.js → build/client/_app/immutable/chunks/DbgD7JLa.js} +1 -23
  516. package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.br +0 -0
  517. package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.gz +0 -0
  518. package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js +0 -22
  519. package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js.br +0 -0
  520. package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js.gz +0 -0
  521. package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js +0 -22
  522. package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.br +0 -0
  523. package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.gz +0 -0
  524. package/frontend/build/client/_app/immutable/chunks/nURnIknV.js +1 -0
  525. package/frontend/build/client/_app/immutable/chunks/nURnIknV.js.br +0 -0
  526. package/frontend/build/client/_app/immutable/chunks/nURnIknV.js.gz +0 -0
  527. package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js +0 -22
  528. package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.br +0 -0
  529. package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.gz +0 -0
  530. package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js +0 -22
  531. package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.br +0 -0
  532. package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.gz +0 -0
  533. package/frontend/build/client/_app/immutable/entry/{app.BCWbw5zZ.js → app.BkBD0hgA.js} +2 -24
  534. package/frontend/build/client/_app/immutable/entry/app.BkBD0hgA.js.br +0 -0
  535. package/frontend/build/client/_app/immutable/entry/app.BkBD0hgA.js.gz +0 -0
  536. package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js +1 -0
  537. package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js.br +2 -0
  538. package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js.gz +0 -0
  539. package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js +6 -0
  540. package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js.br +0 -0
  541. package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js.gz +0 -0
  542. package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js +1 -0
  543. package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js.br +0 -0
  544. package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js.gz +0 -0
  545. package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/10.Bn4Ma-MU.js → build/client/_app/immutable/nodes/10.DEbnxfND.js} +1 -23
  546. package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.br +0 -0
  547. package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.gz +0 -0
  548. package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/11.BacEu7sW.js → build/client/_app/immutable/nodes/11.O4cjXCg4.js} +1 -23
  549. package/frontend/build/client/_app/immutable/nodes/11.O4cjXCg4.js.br +0 -0
  550. package/frontend/build/client/_app/immutable/nodes/11.O4cjXCg4.js.gz +0 -0
  551. package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js +1 -0
  552. package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js.br +0 -0
  553. package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js.gz +0 -0
  554. package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js +1 -0
  555. package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js.br +0 -0
  556. package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js.gz +0 -0
  557. package/frontend/build/client/_app/immutable/nodes/{3.DHx0kho3.js → 3._S1vrLVF.js} +1 -23
  558. package/frontend/build/client/_app/immutable/nodes/3._S1vrLVF.js.br +0 -0
  559. package/frontend/build/client/_app/immutable/nodes/3._S1vrLVF.js.gz +0 -0
  560. package/frontend/build/client/_app/immutable/nodes/{4.CnaMiirx.js → 4.D-YT_JJe.js} +1 -23
  561. package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.br +0 -0
  562. package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.gz +0 -0
  563. package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/5.B6m-zTVe.js → build/client/_app/immutable/nodes/5.BiFBiWcW.js} +1 -23
  564. package/frontend/build/client/_app/immutable/nodes/5.BiFBiWcW.js.br +0 -0
  565. package/frontend/build/client/_app/immutable/nodes/5.BiFBiWcW.js.gz +0 -0
  566. package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/6.BPDag1zv.js → build/client/_app/immutable/nodes/6.BNS-W0R_.js} +1 -23
  567. package/frontend/build/client/_app/immutable/nodes/6.BNS-W0R_.js.br +0 -0
  568. package/frontend/build/client/_app/immutable/nodes/6.BNS-W0R_.js.gz +0 -0
  569. package/frontend/build/client/_app/immutable/nodes/{7.D7LwxSvT.js → 7.C-pKvVZy.js} +1 -23
  570. package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.br +0 -0
  571. package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.gz +0 -0
  572. package/frontend/build/client/_app/immutable/nodes/{8.CCkNX20G.js → 8.BEUdazrw.js} +1 -23
  573. package/frontend/build/client/_app/immutable/nodes/8.BEUdazrw.js.br +0 -0
  574. package/frontend/build/client/_app/immutable/nodes/8.BEUdazrw.js.gz +0 -0
  575. package/frontend/build/client/_app/immutable/nodes/{9.HDerA6JV.js → 9.CrLHYPEJ.js} +1 -23
  576. package/frontend/build/client/_app/immutable/nodes/9.CrLHYPEJ.js.br +0 -0
  577. package/frontend/build/client/_app/immutable/nodes/9.CrLHYPEJ.js.gz +0 -0
  578. package/frontend/build/client/_app/version.json +1 -1
  579. package/frontend/build/client/_app/version.json.br +0 -0
  580. package/frontend/build/client/_app/version.json.gz +0 -0
  581. package/frontend/build/env.js +0 -22
  582. package/frontend/build/handler.js +0 -22
  583. package/frontend/build/index.js +0 -22
  584. package/frontend/build/server/chunks/0-Cn_2hzqk.js +17 -0
  585. package/frontend/build/server/chunks/0-Cn_2hzqk.js.map +1 -0
  586. package/frontend/build/server/chunks/1-BrRGJFSB.js +9 -0
  587. package/frontend/build/server/chunks/1-BrRGJFSB.js.map +1 -0
  588. package/frontend/build/server/chunks/10-l6_ikL_D.js +9 -0
  589. package/frontend/build/server/chunks/10-l6_ikL_D.js.map +1 -0
  590. package/frontend/build/server/chunks/11-BLPbHJqB.js +9 -0
  591. package/frontend/build/server/chunks/11-BLPbHJqB.js.map +1 -0
  592. package/frontend/build/server/chunks/12-S1ujUrHy.js +9 -0
  593. package/frontend/build/server/chunks/12-S1ujUrHy.js.map +1 -0
  594. package/frontend/build/server/chunks/2-Cte30Dgy.js +9 -0
  595. package/frontend/build/server/chunks/2-Cte30Dgy.js.map +1 -0
  596. package/frontend/build/server/chunks/3-BHkXVoNI.js +9 -0
  597. package/frontend/build/server/chunks/3-BHkXVoNI.js.map +1 -0
  598. package/frontend/build/server/chunks/4-Bo04DC5Z.js +9 -0
  599. package/frontend/build/server/chunks/4-Bo04DC5Z.js.map +1 -0
  600. package/frontend/build/server/chunks/5-F1ZsXMt2.js +9 -0
  601. package/frontend/build/server/chunks/5-F1ZsXMt2.js.map +1 -0
  602. package/frontend/build/server/chunks/6-FlZLnYJ6.js +9 -0
  603. package/frontend/build/server/chunks/6-FlZLnYJ6.js.map +1 -0
  604. package/frontend/build/server/chunks/7-DiQJZEF_.js +9 -0
  605. package/frontend/build/server/chunks/{7-DekQfQHu.js.map → 7-DiQJZEF_.js.map} +1 -21
  606. package/frontend/build/server/chunks/8-DXReUGxi.js +9 -0
  607. package/frontend/build/server/chunks/8-DXReUGxi.js.map +1 -0
  608. package/frontend/build/server/chunks/9-Cy_mGmt4.js +9 -0
  609. package/frontend/build/server/chunks/9-Cy_mGmt4.js.map +1 -0
  610. package/frontend/build/server/chunks/BackLink-BJ8NaemM.js +13 -0
  611. package/frontend/build/server/chunks/{BackLink-KxZNqsaq.js.map → BackLink-BJ8NaemM.js.map} +1 -21
  612. package/frontend/build/server/chunks/Badge-44ZTDx0V.js +13 -0
  613. package/frontend/build/server/chunks/{Badge-B5V-z6pI.js.map → Badge-44ZTDx0V.js.map} +1 -21
  614. package/frontend/build/server/chunks/{ConfirmModal-Ckkt99Pn.js → ConfirmModal-C0EAXcq_.js} +4 -26
  615. package/frontend/build/server/chunks/{ConfirmModal-Ckkt99Pn.js.map → ConfirmModal-C0EAXcq_.js.map} +1 -21
  616. package/frontend/build/server/chunks/{EmptyState-BwwbShnX.js → EmptyState-BA_eXaeR.js} +3 -25
  617. package/frontend/build/server/chunks/{EmptyState-BwwbShnX.js.map → EmptyState-BA_eXaeR.js.map} +1 -21
  618. package/frontend/build/server/chunks/{Modal-DG-6c5si.js → Modal-DChG187n.js} +2 -24
  619. package/frontend/build/server/chunks/{Modal-DG-6c5si.js.map → Modal-DChG187n.js.map} +1 -21
  620. package/frontend/build/server/chunks/{Toast-CIG4edEp.js → Toast-v-q4ZnYq.js} +2 -24
  621. package/frontend/build/server/chunks/{Toast-CIG4edEp.js.map → Toast-v-q4ZnYq.js.map} +1 -21
  622. package/frontend/build/server/chunks/_layout.svelte-CHVI3Prt.js +24 -0
  623. package/frontend/build/server/chunks/{_layout.svelte-BjPrZpoG.js.map → _layout.svelte-CHVI3Prt.js.map} +1 -21
  624. package/frontend/build/server/chunks/{_page.svelte-BbZNxvCl.js → _page.svelte-1as75nPc.js} +14 -35
  625. package/frontend/build/server/chunks/{_page.svelte-BbZNxvCl.js.map → _page.svelte-1as75nPc.js.map} +1 -21
  626. package/frontend/build/server/chunks/{_page.svelte-CLFpft5D.js → _page.svelte-1jo8MapI.js} +11 -33
  627. package/frontend/build/server/chunks/{_page.svelte-CLFpft5D.js.map → _page.svelte-1jo8MapI.js.map} +1 -21
  628. package/frontend/build/server/chunks/{_page.svelte-BHw14GPR.js → _page.svelte-BuFusRK1.js} +12 -34
  629. package/frontend/build/server/chunks/{_page.svelte-BHw14GPR.js.map → _page.svelte-BuFusRK1.js.map} +1 -21
  630. package/frontend/build/server/chunks/{_page.svelte-D78qaBDN.js → _page.svelte-CAVyp70V.js} +14 -35
  631. package/frontend/build/server/chunks/{_page.svelte-D78qaBDN.js.map → _page.svelte-CAVyp70V.js.map} +1 -21
  632. package/frontend/build/server/chunks/{_page.svelte-D2oF79cT.js → _page.svelte-CB8-QBNg.js} +11 -33
  633. package/frontend/build/server/chunks/{_page.svelte-D2oF79cT.js.map → _page.svelte-CB8-QBNg.js.map} +1 -21
  634. package/frontend/build/server/chunks/{_page.svelte-DyyuZN_3.js → _page.svelte-CWWeZuid.js} +11 -33
  635. package/frontend/build/server/chunks/{_page.svelte-DyyuZN_3.js.map → _page.svelte-CWWeZuid.js.map} +1 -21
  636. package/frontend/build/server/chunks/_page.svelte-CpB-fgJl.js +219 -0
  637. package/frontend/build/server/chunks/_page.svelte-CpB-fgJl.js.map +1 -0
  638. package/frontend/build/server/chunks/_page.svelte-D3E6Eojd.js +27 -0
  639. package/frontend/build/server/chunks/{_page.svelte-B9rjnZWE.js.map → _page.svelte-D3E6Eojd.js.map} +1 -21
  640. package/frontend/build/server/chunks/_page.svelte-Kg69DDaM.js +27 -0
  641. package/frontend/build/server/chunks/{_page.svelte-D1aYn1PL.js.map → _page.svelte-Kg69DDaM.js.map} +1 -21
  642. package/frontend/build/server/chunks/{_page.svelte-ubW5EUCf.js → _page.svelte-L9fuiN_q.js} +10 -32
  643. package/frontend/build/server/chunks/{_page.svelte-ubW5EUCf.js.map → _page.svelte-L9fuiN_q.js.map} +1 -21
  644. package/frontend/build/server/chunks/{_page.svelte-Cr16HubD.js → _page.svelte-wKyUmA2e.js} +12 -34
  645. package/frontend/build/server/chunks/{_page.svelte-Cr16HubD.js.map → _page.svelte-wKyUmA2e.js.map} +1 -21
  646. package/frontend/build/server/chunks/attributes-BeaNKpgU.js +0 -22
  647. package/frontend/build/server/chunks/attributes-BeaNKpgU.js.map +0 -20
  648. package/frontend/build/server/chunks/{auth-rlH-cIzn.js → auth-Chw-wBpI.js} +2 -24
  649. package/frontend/build/server/chunks/{auth-rlH-cIzn.js.map → auth-Chw-wBpI.js.map} +1 -21
  650. package/frontend/build/server/chunks/auth2-C02yYDpz.js +0 -22
  651. package/frontend/build/server/chunks/auth2-C02yYDpz.js.map +0 -20
  652. package/frontend/build/server/chunks/client-DEmxR_a-.js +40 -0
  653. package/frontend/build/server/chunks/{client-DyII78e0.js.map → client-DEmxR_a-.js.map} +1 -21
  654. package/frontend/build/server/chunks/common-DYYTVHPw.js +21 -0
  655. package/frontend/build/server/chunks/common-DYYTVHPw.js.map +1 -0
  656. package/frontend/build/server/chunks/constants-CXTaQaB6.js +22 -0
  657. package/frontend/build/server/chunks/constants-CXTaQaB6.js.map +1 -0
  658. package/frontend/build/server/chunks/error.svelte-BD3xNemk.js +28 -0
  659. package/frontend/build/server/chunks/{error.svelte-BDW3iP1O.js.map → error.svelte-BD3xNemk.js.map} +1 -21
  660. package/frontend/build/server/chunks/escaping-CqgfEcN3.js +0 -22
  661. package/frontend/build/server/chunks/escaping-CqgfEcN3.js.map +0 -20
  662. package/frontend/build/server/chunks/exports-D0QHgeSL.js +0 -22
  663. package/frontend/build/server/chunks/exports-D0QHgeSL.js.map +0 -20
  664. package/frontend/build/server/chunks/{format-0SSB1oGG.js → format-CiNRMfHu.js} +2 -24
  665. package/frontend/build/server/chunks/{format-0SSB1oGG.js.map → format-CiNRMfHu.js.map} +1 -21
  666. package/frontend/build/server/chunks/index-server-B3M9vyh2.js +14 -0
  667. package/frontend/build/server/chunks/index-server-B3M9vyh2.js.map +1 -0
  668. package/frontend/build/server/chunks/{index2-DG8XHU5D.js → index2-5R1tbrep.js} +2 -24
  669. package/frontend/build/server/chunks/{index2-DG8XHU5D.js.map → index2-5R1tbrep.js.map} +1 -21
  670. package/frontend/build/server/chunks/reports-D_ApeeNh.js +23 -0
  671. package/frontend/build/server/chunks/{reports-DnYbvluH.js.map → reports-D_ApeeNh.js.map} +1 -21
  672. package/frontend/build/server/chunks/{reports2-DR4XlcJg.js → reports2-BtElN_53.js} +2 -24
  673. package/frontend/build/server/chunks/{reports2-DR4XlcJg.js.map → reports2-BtElN_53.js.map} +1 -21
  674. package/frontend/build/server/chunks/{repository-D9Derhnk.js → repository-FYYV_vKE.js} +3 -26
  675. package/frontend/build/server/chunks/repository-FYYV_vKE.js.map +1 -0
  676. package/frontend/build/server/chunks/runner-DC7hXbnY.js +32 -0
  677. package/frontend/build/server/chunks/runner-DC7hXbnY.js.map +1 -0
  678. package/frontend/build/server/chunks/stores-BLenR3c1.js +27 -0
  679. package/frontend/build/server/chunks/{stores-DlkXV308.js.map → stores-BLenR3c1.js.map} +1 -21
  680. package/frontend/build/server/chunks/theme-nAx-GvX_.js +10 -0
  681. package/frontend/build/server/chunks/theme-nAx-GvX_.js.map +1 -0
  682. package/frontend/build/server/index.js +2 -24
  683. package/frontend/build/server/index.js.map +1 -21
  684. package/frontend/build/server/manifest.js +14 -36
  685. package/frontend/build/server/manifest.js.map +1 -21
  686. package/frontend/build/shims.js +0 -22
  687. package/frontend/package.json +1 -0
  688. package/frontend/src/app.css +1 -13
  689. package/frontend/src/app.html +1 -13
  690. package/frontend/src/lib/api/activeRuns.js +18 -0
  691. package/frontend/src/lib/api/auth.js +1 -13
  692. package/frontend/src/lib/api/reports.js +1 -13
  693. package/frontend/src/lib/api/repository.js +1 -13
  694. package/frontend/src/lib/api/runners.js +26 -21
  695. package/frontend/src/lib/api/schedules.js +1 -13
  696. package/frontend/src/lib/api/settings.js +11 -23
  697. package/frontend/src/lib/api/tests.js +1 -13
  698. package/frontend/src/lib/api/users.js +1 -13
  699. package/frontend/src/lib/components/icons/BrowserIcon.svelte +1 -13
  700. package/frontend/src/lib/components/layout/Nav.svelte +1 -13
  701. package/frontend/src/lib/components/layout/PageShell.svelte +1 -13
  702. package/frontend/src/lib/components/layout/RunnerPanel.svelte +146 -105
  703. package/frontend/src/lib/components/ui/AutomatedBadge.svelte +2 -31
  704. package/frontend/src/lib/components/ui/BackLink.svelte +1 -30
  705. package/frontend/src/lib/components/ui/Badge.svelte +1 -13
  706. package/frontend/src/lib/components/ui/Button.svelte +1 -13
  707. package/frontend/src/lib/components/ui/CaseIdChip.svelte +1 -30
  708. package/frontend/src/lib/components/ui/ConfirmModal.svelte +8 -17
  709. package/frontend/src/lib/components/ui/EmptyState.svelte +26 -15
  710. package/frontend/src/lib/components/ui/Modal.svelte +1 -13
  711. package/frontend/src/lib/components/ui/Pagination.svelte +1 -13
  712. package/frontend/src/lib/components/ui/PriorityBadge.svelte +1 -30
  713. package/frontend/src/lib/components/ui/ResultChip.svelte +1 -30
  714. package/frontend/src/lib/components/ui/StatusDot.svelte +1 -30
  715. package/frontend/src/lib/components/ui/StepKeyword.svelte +1 -30
  716. package/frontend/src/lib/components/ui/StepStatusIcon.svelte +1 -30
  717. package/frontend/src/lib/components/ui/TagChip.svelte +1 -30
  718. package/frontend/src/lib/components/ui/Terminal.svelte +1 -13
  719. package/frontend/src/lib/components/ui/Toast.svelte +1 -13
  720. package/frontend/src/lib/constants.js +5 -17
  721. package/frontend/src/lib/copy/auth.js +29 -0
  722. package/frontend/src/lib/copy/common.js +39 -0
  723. package/frontend/src/lib/copy/dashboard.js +28 -0
  724. package/frontend/src/lib/copy/reports.js +83 -0
  725. package/frontend/src/lib/copy/repository.js +153 -0
  726. package/frontend/src/lib/copy/runners.js +59 -0
  727. package/frontend/src/lib/copy/schedules.js +96 -0
  728. package/frontend/src/lib/copy/settings.js +295 -0
  729. package/frontend/src/lib/index.js +1 -13
  730. package/frontend/src/lib/socketEvents.js +36 -0
  731. package/frontend/src/lib/stores/auth.js +1 -13
  732. package/frontend/src/lib/stores/runner.js +10 -18
  733. package/frontend/src/lib/stores/theme.js +1 -13
  734. package/frontend/src/lib/styles/global.css +1 -13
  735. package/frontend/src/lib/styles/reset.css +1 -13
  736. package/frontend/src/lib/styles/tokens.css +1 -13
  737. package/frontend/src/lib/utils/format.js +1 -13
  738. package/frontend/src/routes/+layout.js +1 -13
  739. package/frontend/src/routes/+layout.svelte +1 -13
  740. package/frontend/src/routes/+page.svelte +296 -115
  741. package/frontend/src/routes/login/+page.svelte +22 -23
  742. package/frontend/src/routes/reports/+page.svelte +37 -38
  743. package/frontend/src/routes/reports/[id]/+page.svelte +54 -43
  744. package/frontend/src/routes/reports/live/+page.svelte +57 -42
  745. package/frontend/src/routes/scheduled-tests/+page.svelte +134 -117
  746. package/frontend/src/routes/settings/+page.svelte +490 -267
  747. package/frontend/src/routes/setup/+page.svelte +30 -27
  748. package/frontend/src/routes/test-repository/+page.svelte +120 -91
  749. package/frontend/src/routes/test-repository/runs/[id]/+page.svelte +95 -60
  750. package/frontend/src/routes/test-repository/suites/[id]/+page.svelte +145 -91
  751. package/frontend/svelte.config.js +1 -13
  752. package/frontend/vite.config.js +1 -13
  753. package/package.json +2 -2
  754. package/resources/mit-license.txt +2 -0
  755. package/backend/scripts/create-test.js +0 -149
  756. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
  757. package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CrXpMrqh.css +0 -23
  758. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
  759. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/4N1zIH8t.js +0 -23
  760. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BhvHtTRh.js +0 -23
  761. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C1sukchk.js +0 -23
  762. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DW85KPAh.js +0 -24
  763. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DW_iTTZe.js +0 -23
  764. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DtGXv8RA.js +0 -25
  765. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/oN0Z3NSF.js +0 -23
  766. package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.2_AF42wj.js +0 -23
  767. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.BAqq2UTE.js +0 -28
  768. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.D5VvLtGP.js +0 -23
  769. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.0YGtl1uj.js +0 -23
  770. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.C2jjMA-Z.js +0 -23
  771. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
  772. package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css +0 -23
  773. package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.br +0 -0
  774. package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.gz +0 -0
  775. package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
  776. package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.br +0 -0
  777. package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.gz +0 -0
  778. package/frontend/build/client/_app/immutable/chunks/3IV-uqHa.js.br +0 -0
  779. package/frontend/build/client/_app/immutable/chunks/3IV-uqHa.js.gz +0 -0
  780. package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js +0 -23
  781. package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js.br +0 -0
  782. package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js.gz +0 -0
  783. package/frontend/build/client/_app/immutable/chunks/B98sHkeB.js.br +0 -0
  784. package/frontend/build/client/_app/immutable/chunks/B98sHkeB.js.gz +0 -0
  785. package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js +0 -23
  786. package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js.br +0 -0
  787. package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js.gz +0 -0
  788. package/frontend/build/client/_app/immutable/chunks/BjUpWNbl.js.br +0 -0
  789. package/frontend/build/client/_app/immutable/chunks/BjUpWNbl.js.gz +0 -0
  790. package/frontend/build/client/_app/immutable/chunks/C1sukchk.js +0 -23
  791. package/frontend/build/client/_app/immutable/chunks/C1sukchk.js.br +0 -0
  792. package/frontend/build/client/_app/immutable/chunks/C1sukchk.js.gz +0 -0
  793. package/frontend/build/client/_app/immutable/chunks/D2cvzNT9.js.br +0 -0
  794. package/frontend/build/client/_app/immutable/chunks/D2cvzNT9.js.gz +0 -0
  795. package/frontend/build/client/_app/immutable/chunks/D2gYTmAA.js.br +0 -0
  796. package/frontend/build/client/_app/immutable/chunks/D2gYTmAA.js.gz +0 -0
  797. package/frontend/build/client/_app/immutable/chunks/DDblTLLE.js.br +0 -0
  798. package/frontend/build/client/_app/immutable/chunks/DDblTLLE.js.gz +0 -0
  799. package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js +0 -24
  800. package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js.br +0 -0
  801. package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js.gz +0 -0
  802. package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js +0 -23
  803. package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js.br +0 -0
  804. package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js.gz +0 -0
  805. package/frontend/build/client/_app/immutable/chunks/DYlaQsvN.js.br +0 -0
  806. package/frontend/build/client/_app/immutable/chunks/DYlaQsvN.js.gz +0 -0
  807. package/frontend/build/client/_app/immutable/chunks/DkNBSlo2.js.br +0 -0
  808. package/frontend/build/client/_app/immutable/chunks/DkNBSlo2.js.gz +0 -0
  809. package/frontend/build/client/_app/immutable/chunks/DlNYZJ7K.js.br +0 -0
  810. package/frontend/build/client/_app/immutable/chunks/DlNYZJ7K.js.gz +0 -0
  811. package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js +0 -25
  812. package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js.br +0 -0
  813. package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js.gz +0 -0
  814. package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js +0 -23
  815. package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js.br +0 -0
  816. package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js.gz +0 -0
  817. package/frontend/build/client/_app/immutable/entry/app.BCWbw5zZ.js.br +0 -0
  818. package/frontend/build/client/_app/immutable/entry/app.BCWbw5zZ.js.gz +0 -0
  819. package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js +0 -23
  820. package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js.br +0 -22
  821. package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js.gz +0 -0
  822. package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js +0 -28
  823. package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js.br +0 -0
  824. package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js.gz +0 -0
  825. package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js +0 -23
  826. package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js.br +0 -0
  827. package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js.gz +0 -0
  828. package/frontend/build/client/_app/immutable/nodes/10.Bn4Ma-MU.js.br +0 -0
  829. package/frontend/build/client/_app/immutable/nodes/10.Bn4Ma-MU.js.gz +0 -0
  830. package/frontend/build/client/_app/immutable/nodes/11.BacEu7sW.js.br +0 -0
  831. package/frontend/build/client/_app/immutable/nodes/11.BacEu7sW.js.gz +0 -0
  832. package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js +0 -23
  833. package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js.br +0 -0
  834. package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js.gz +0 -0
  835. package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js +0 -23
  836. package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js.br +0 -0
  837. package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js.gz +0 -0
  838. package/frontend/build/client/_app/immutable/nodes/3.DHx0kho3.js.br +0 -0
  839. package/frontend/build/client/_app/immutable/nodes/3.DHx0kho3.js.gz +0 -0
  840. package/frontend/build/client/_app/immutable/nodes/4.CnaMiirx.js.br +0 -0
  841. package/frontend/build/client/_app/immutable/nodes/4.CnaMiirx.js.gz +0 -0
  842. package/frontend/build/client/_app/immutable/nodes/5.B6m-zTVe.js.br +0 -0
  843. package/frontend/build/client/_app/immutable/nodes/5.B6m-zTVe.js.gz +0 -0
  844. package/frontend/build/client/_app/immutable/nodes/6.BPDag1zv.js.br +0 -0
  845. package/frontend/build/client/_app/immutable/nodes/6.BPDag1zv.js.gz +0 -0
  846. package/frontend/build/client/_app/immutable/nodes/7.D7LwxSvT.js.br +0 -0
  847. package/frontend/build/client/_app/immutable/nodes/7.D7LwxSvT.js.gz +0 -0
  848. package/frontend/build/client/_app/immutable/nodes/8.CCkNX20G.js.br +0 -0
  849. package/frontend/build/client/_app/immutable/nodes/8.CCkNX20G.js.gz +0 -0
  850. package/frontend/build/client/_app/immutable/nodes/9.HDerA6JV.js.br +0 -0
  851. package/frontend/build/client/_app/immutable/nodes/9.HDerA6JV.js.gz +0 -0
  852. package/frontend/build/server/chunks/0-Di4jNU9J.js +0 -39
  853. package/frontend/build/server/chunks/0-Di4jNU9J.js.map +0 -21
  854. package/frontend/build/server/chunks/1-DR5YRUTa.js +0 -31
  855. package/frontend/build/server/chunks/1-DR5YRUTa.js.map +0 -21
  856. package/frontend/build/server/chunks/10-Bhe409bL.js +0 -31
  857. package/frontend/build/server/chunks/10-Bhe409bL.js.map +0 -21
  858. package/frontend/build/server/chunks/11-DqyXW7n1.js +0 -31
  859. package/frontend/build/server/chunks/11-DqyXW7n1.js.map +0 -21
  860. package/frontend/build/server/chunks/12-BCpjMUbs.js +0 -31
  861. package/frontend/build/server/chunks/12-BCpjMUbs.js.map +0 -21
  862. package/frontend/build/server/chunks/2-D-0buH5i.js +0 -31
  863. package/frontend/build/server/chunks/2-D-0buH5i.js.map +0 -21
  864. package/frontend/build/server/chunks/3-y2kzPO2X.js +0 -31
  865. package/frontend/build/server/chunks/3-y2kzPO2X.js.map +0 -21
  866. package/frontend/build/server/chunks/4-CFrK8HST.js +0 -31
  867. package/frontend/build/server/chunks/4-CFrK8HST.js.map +0 -21
  868. package/frontend/build/server/chunks/5-B0lJu5bT.js +0 -31
  869. package/frontend/build/server/chunks/5-B0lJu5bT.js.map +0 -21
  870. package/frontend/build/server/chunks/6-BD4CEJ3Z.js +0 -31
  871. package/frontend/build/server/chunks/6-BD4CEJ3Z.js.map +0 -21
  872. package/frontend/build/server/chunks/7-DekQfQHu.js +0 -31
  873. package/frontend/build/server/chunks/8-BMqmu7WF.js +0 -31
  874. package/frontend/build/server/chunks/8-BMqmu7WF.js.map +0 -21
  875. package/frontend/build/server/chunks/9-C5sKo9aY.js +0 -31
  876. package/frontend/build/server/chunks/9-C5sKo9aY.js.map +0 -21
  877. package/frontend/build/server/chunks/BackLink-KxZNqsaq.js +0 -35
  878. package/frontend/build/server/chunks/Badge-B5V-z6pI.js +0 -35
  879. package/frontend/build/server/chunks/_layout.svelte-BjPrZpoG.js +0 -46
  880. package/frontend/build/server/chunks/_page.svelte-B9rjnZWE.js +0 -49
  881. package/frontend/build/server/chunks/_page.svelte-D1aYn1PL.js +0 -49
  882. package/frontend/build/server/chunks/_page.svelte-sbqebZYx.js +0 -206
  883. package/frontend/build/server/chunks/_page.svelte-sbqebZYx.js.map +0 -21
  884. package/frontend/build/server/chunks/client-DyII78e0.js +0 -62
  885. package/frontend/build/server/chunks/common-Db-bgKYG.js +0 -42
  886. package/frontend/build/server/chunks/common-Db-bgKYG.js.map +0 -21
  887. package/frontend/build/server/chunks/constants-cZ2kUwWa.js +0 -41
  888. package/frontend/build/server/chunks/constants-cZ2kUwWa.js.map +0 -21
  889. package/frontend/build/server/chunks/error.svelte-BDW3iP1O.js +0 -50
  890. package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js +0 -36
  891. package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js.map +0 -21
  892. package/frontend/build/server/chunks/reports-DnYbvluH.js +0 -45
  893. package/frontend/build/server/chunks/repository-D9Derhnk.js.map +0 -21
  894. package/frontend/build/server/chunks/runner-DE5sufZH.js +0 -54
  895. package/frontend/build/server/chunks/runner-DE5sufZH.js.map +0 -21
  896. package/frontend/build/server/chunks/stores-DlkXV308.js +0 -49
  897. package/frontend/build/server/chunks/theme-D_NKm6iI.js +0 -32
  898. package/frontend/build/server/chunks/theme-D_NKm6iI.js.map +0 -21
  899. package/resources/gpl-3.0-license.txt +0 -14
@@ -0,0 +1,189 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ * Licensed under the MIT License. See LICENSE file in the project root for details.
4
+ */
5
+
6
+ const fs = require('fs');
7
+ const path = require('path');
8
+ const { loadRegistry, saveRegistry } = require('./runnerProcess');
9
+ const { SOCKET_EVENTS } = require('../constants/socketEvents');
10
+
11
+ const WATCH_OPTS = { usePolling: true, interval: 800, ignoreInitial: true };
12
+
13
+ function ensureTestsDir(testsDir, isNodeMode) {
14
+ if (fs.existsSync(testsDir)) {
15
+ console.log('📂 Loading tests from:', testsDir);
16
+ return;
17
+ }
18
+ if (isNodeMode) {
19
+ console.warn('⚠️ No tests folder found — will be populated when a job is received');
20
+ return;
21
+ }
22
+ console.error('❌ No tests folder found at /app/tests');
23
+ process.exit(1);
24
+ }
25
+
26
+ // A self-restart (POST /api/restart) spawns the replacement before this
27
+ // process has released the port, so the first bind attempt can briefly hit
28
+ // EADDRINUSE — retry instead of dying immediately.
29
+ function attachListenRetry(server, port) {
30
+ let retriesLeft = 20;
31
+ server.on('error', (err) => {
32
+ if (err.code === 'EADDRINUSE' && retriesLeft > 0) {
33
+ retriesLeft -= 1;
34
+ setTimeout(() => server.listen(port), 250);
35
+ } else {
36
+ console.error(`❌ Failed to bind port ${port}:`, err.message);
37
+ process.exit(1);
38
+ }
39
+ });
40
+ }
41
+
42
+ function wireRealtimeServices(io, isNodeMode) {
43
+ if (isNodeMode) return { cronService: null, backupCronService: null };
44
+
45
+ const socketHandler = require('../websockets/socketHandler.js');
46
+ const cronService = require('../services/cronService');
47
+ const backupCronService = require('../services/backupCronService');
48
+
49
+ socketHandler(io);
50
+ cronService.setSocketIO(io);
51
+ require('../routes/trigger.routes').setSocketIO(io);
52
+
53
+ return { cronService, backupCronService };
54
+ }
55
+
56
+ async function initCronServices(cronService, backupCronService) {
57
+ if (cronService) await cronService.init();
58
+ if (backupCronService) await backupCronService.init();
59
+ }
60
+
61
+ async function bootstrapMcpKey(isNodeMode) {
62
+ if (isNodeMode || process.env.PLUM_MCP_KEY) return;
63
+ try {
64
+ const settingsService = require('../services/settingsService');
65
+ const { mcpKey } = await settingsService.getMcpConfig();
66
+ if (mcpKey) process.env.PLUM_MCP_KEY = mcpKey;
67
+ } catch {}
68
+ }
69
+
70
+ function logServerReady(port, isNodeMode) {
71
+ console.log(`Backend running on port ${port}${isNodeMode ? ' (node/runner mode)' : ''}`);
72
+ }
73
+
74
+ // Dispatches to the node-runner startup path or the full-server startup path
75
+ // once the HTTP server is actually listening.
76
+ async function onServerListening({ port, io, testsDir, isNodeMode }) {
77
+ logServerReady(port, isNodeMode);
78
+ if (isNodeMode) {
79
+ handleNodeModeStartup(port);
80
+ return;
81
+ }
82
+ await handleFullModeStartup(io, testsDir);
83
+ }
84
+
85
+ function handleNodeModeStartup(port) {
86
+ // Self-register PID so manage-runners can track and stop this process.
87
+ const runnerId = process.env.RUNNER_ID;
88
+ if (!runnerId) return;
89
+
90
+ const registry = loadRegistry();
91
+ registry[runnerId] = { pid: process.pid, port: String(port), startedAt: Date.now() };
92
+ saveRegistry(registry);
93
+
94
+ const cleanup = () => {
95
+ try {
96
+ const reg = loadRegistry();
97
+ // A self-restart already wrote the replacement's pid under this
98
+ // id before this process exits — only touch the entry if it's
99
+ // still ours, so we don't clobber the new process's registration.
100
+ // Keep the entry (with its port) rather than deleting it — that's
101
+ // the only place a later manual Start can find the port this
102
+ // runner was last running on.
103
+ if (reg[runnerId]?.pid === process.pid) {
104
+ reg[runnerId] = { ...reg[runnerId], pid: null };
105
+ saveRegistry(reg);
106
+ }
107
+ } catch {}
108
+ };
109
+
110
+ // Adding a SIGTERM/SIGINT listener suppresses Node's default
111
+ // "terminate immediately" behavior — the handler must exit itself,
112
+ // or the process (and the port it's bound to) lives on forever
113
+ // after a plain `kill`/SIGTERM with nothing left to stop it short
114
+ // of SIGKILL.
115
+ process.once('SIGTERM', () => {
116
+ cleanup();
117
+ process.exit(0);
118
+ });
119
+ process.once('SIGINT', () => {
120
+ cleanup();
121
+ process.exit(0);
122
+ });
123
+ process.once('exit', cleanup);
124
+ }
125
+
126
+ async function handleFullModeStartup(io, testsDir) {
127
+ syncAutomatedFlags();
128
+
129
+ const chokidar = await loadChokidar();
130
+ if (!chokidar) return;
131
+
132
+ watchTestFiles(chokidar, testsDir);
133
+ watchReports(chokidar, io);
134
+ }
135
+
136
+ function syncAutomatedFlags() {
137
+ // Sync automated flags from feature files on every startup
138
+ require('../services/reportService')
139
+ .syncAutomatedFromFeatures()
140
+ .catch(() => {});
141
+ }
142
+
143
+ async function loadChokidar() {
144
+ // chokidar v5+ is ESM-only — use dynamic import to stay compatible with CJS
145
+ try {
146
+ return (await import('chokidar')).default;
147
+ } catch {
148
+ console.warn('⚠️ chokidar unavailable — file watching disabled');
149
+ return null;
150
+ }
151
+ }
152
+
153
+ function watchTestFiles(chokidar, testsDir) {
154
+ const featuresDir = path.join(testsDir, 'features');
155
+ if (!fs.existsSync(featuresDir)) return;
156
+
157
+ let debounce = null;
158
+ chokidar.watch(featuresDir, WATCH_OPTS).on('all', (event, filePath) => {
159
+ clearTimeout(debounce);
160
+ debounce = setTimeout(() => {
161
+ console.log(`📝 Tests changed (${event}: ${path.basename(filePath)})`);
162
+ syncAutomatedFlags();
163
+ }, 300);
164
+ });
165
+ console.log('👀 Watching for test file changes...');
166
+ }
167
+
168
+ function watchReports(chokidar, io) {
169
+ const reportsDir = path.resolve(process.cwd(), 'reports');
170
+ fs.mkdirSync(reportsDir, { recursive: true });
171
+
172
+ chokidar.watch(reportsDir, { ...WATCH_OPTS, interval: 1200 }).on('add', (filePath) => {
173
+ const name = path.basename(filePath);
174
+ if ((name.startsWith('PASS_') || name.startsWith('FAIL_')) && name.endsWith('.json')) {
175
+ console.log(`📊 New report: ${name} — notifying clients`);
176
+ io.emit(SOCKET_EVENTS.REPORT_READY);
177
+ }
178
+ });
179
+ console.log('👀 Watching for new reports...');
180
+ }
181
+
182
+ module.exports = {
183
+ ensureTestsDir,
184
+ attachListenRetry,
185
+ wireRealtimeServices,
186
+ initCronServices,
187
+ bootstrapMcpKey,
188
+ onServerListening
189
+ };
@@ -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
  /**
@@ -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
  const { getTestSuites } = require('../services/testService');
@@ -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
  const fs = require('fs');
@@ -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
  /**
@@ -40,6 +28,8 @@ const sdkCjs = path.resolve(
40
28
  const { McpServer } = require(path.join(sdkCjs, 'server', 'mcp.js'));
41
29
  const { StdioServerTransport } = require(path.join(sdkCjs, 'server', 'stdio.js'));
42
30
  const { z } = require('zod');
31
+ const { AUTH_SCHEME } = require('../lib/authHeader');
32
+ const { JOB_STATUS } = require('../constants/jobStatus');
43
33
 
44
34
  const API_URL = (process.env.PLUM_API_URL || 'http://localhost:3001').replace(/\/$/, '');
45
35
  const API_KEY = process.env.PLUM_API_KEY || '';
@@ -53,7 +43,7 @@ async function api(method, path, body) {
53
43
  method,
54
44
  headers: {
55
45
  'Content-Type': 'application/json',
56
- Authorization: `ApiKey ${API_KEY}`
46
+ Authorization: `${AUTH_SCHEME.API_KEY} ${API_KEY}`
57
47
  },
58
48
  body: body !== undefined ? JSON.stringify(body) : undefined
59
49
  });
@@ -78,7 +68,7 @@ async function pollJob(jobId, { maxMs = 600_000, intervalMs = 5_000 } = {}) {
78
68
  while (Date.now() < deadline) {
79
69
  await new Promise((r) => setTimeout(r, intervalMs));
80
70
  const job = await get(`/trigger/${jobId}`);
81
- if (job.status !== 'running') return job;
71
+ if (job.status !== JOB_STATUS.RUNNING) return job;
82
72
  }
83
73
  return { status: 'timeout', jobId };
84
74
  }
@@ -1,20 +1,10 @@
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
 
6
+ const { AUTH_SCHEME } = require('../lib/authHeader');
7
+
18
8
  /**
19
9
  * Bearer-token auth guard for node-mode API routes.
20
10
  * Passes through when NODE_TOKEN is not configured (open/dev environments).
@@ -23,7 +13,7 @@ function authGuard(req, res, next) {
23
13
  const nodeToken = process.env.NODE_TOKEN;
24
14
  if (!nodeToken) return next();
25
15
  const auth = req.headers.authorization;
26
- if (!auth || auth !== `Bearer ${nodeToken}`) {
16
+ if (!auth || auth !== `${AUTH_SCHEME.BEARER} ${nodeToken}`) {
27
17
  return res.status(401).json({ error: 'Unauthorized' });
28
18
  }
29
19
  next();
@@ -1,29 +1,18 @@
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
  const { verifyToken } = require('../services/userService');
19
7
  const prisma = require('../services/prisma');
8
+ const { AUTH_SCHEME } = require('../lib/authHeader');
20
9
 
21
10
  function jwtAuth(req, res, next) {
22
11
  const auth = req.headers.authorization;
23
12
 
24
13
  // MCP API key — resolves to the first admin user so createdById is always valid
25
14
  const mcpKey = process.env.PLUM_MCP_KEY;
26
- if (mcpKey && auth === `ApiKey ${mcpKey}`) {
15
+ if (mcpKey && auth === `${AUTH_SCHEME.API_KEY} ${mcpKey}`) {
27
16
  prisma.user
28
17
  .findFirst({ where: { role: 'admin' }, select: { id: true } })
29
18
  .then((admin) => {
@@ -37,12 +26,12 @@ function jwtAuth(req, res, next) {
37
26
  return;
38
27
  }
39
28
 
40
- if (!auth || !auth.startsWith('Bearer ')) {
29
+ if (!auth || !auth.startsWith(`${AUTH_SCHEME.BEARER} `)) {
41
30
  return res.status(401).json({ error: 'Unauthorized' });
42
31
  }
43
32
  let payload;
44
33
  try {
45
- payload = verifyToken(auth.slice(7));
34
+ payload = verifyToken(auth.slice(AUTH_SCHEME.BEARER.length + 1));
46
35
  } catch {
47
36
  return res.status(401).json({ error: 'Invalid or expired token' });
48
37
  }
@@ -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
  function requireAdmin(req, res, next) {
@@ -8,12 +8,12 @@
8
8
  "create-env": "node services/envService.js",
9
9
  "test": "node config/scripts/run-tests.js",
10
10
  "manage-runners": "node scripts/manage-runners.mjs",
11
- "create-test": "node scripts/create-test.js",
11
+ "create-test": "node config/scripts/create-test.mjs",
12
12
  "mcp": "node mcp/server.js"
13
13
  },
14
14
  "keywords": [],
15
- "author": "",
16
- "license": "ISC",
15
+ "author": "silverlunah",
16
+ "license": "MIT",
17
17
  "devDependencies": {
18
18
  "@playwright/test": "^1.50.1",
19
19
  "@types/node": "^22.17.0",
@@ -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
  // @ts-check
@@ -0,0 +1,18 @@
1
+ /*
2
+ * This file is part of Plum.
3
+ * Licensed under the MIT License. See LICENSE file in the project root for details.
4
+ */
5
+
6
+ const express = require('express');
7
+ const router = express.Router();
8
+ const activeRunsService = require('../services/activeRunsService');
9
+ const { jwtAuth } = require('../middleware/jwtAuth');
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() });
16
+ });
17
+
18
+ module.exports = router;
@@ -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
  const express = require('express');
@@ -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
  const express = require('express');
@@ -21,9 +9,10 @@ const backupService = require('../services/backupService');
21
9
  const settingsService = require('../services/settingsService');
22
10
  const cronService = require('../services/cronService');
23
11
  const backupCronService = require('../services/backupCronService');
24
- const prisma = require('../services/prisma');
12
+ const { jwtAuth } = require('../middleware/jwtAuth');
13
+ const { requireAdmin } = require('../middleware/requireAdmin');
25
14
 
26
- router.get('/export', async (req, res) => {
15
+ router.get('/export', jwtAuth, requireAdmin, async (req, res) => {
27
16
  try {
28
17
  const data = await backupService.exportAll();
29
18
  const fileName = `plum-backup-${new Date().toISOString().slice(0, 10)}.json`;
@@ -36,7 +25,7 @@ router.get('/export', async (req, res) => {
36
25
  }
37
26
  });
38
27
 
39
- router.post('/import', async (req, res) => {
28
+ router.post('/import', jwtAuth, requireAdmin, async (req, res) => {
40
29
  try {
41
30
  const { cronJobs, project, users, runners, testSuites, testRuns } = req.body;
42
31
  const hasData = [cronJobs, project, users, runners, testSuites, testRuns].some(
@@ -54,7 +43,7 @@ router.post('/import', async (req, res) => {
54
43
  }
55
44
  });
56
45
 
57
- router.get('/config', async (req, res) => {
46
+ router.get('/config', jwtAuth, requireAdmin, async (req, res) => {
58
47
  try {
59
48
  const config = await settingsService.getBackupConfig();
60
49
  res.json(config);
@@ -64,7 +53,7 @@ router.get('/config', async (req, res) => {
64
53
  }
65
54
  });
66
55
 
67
- router.post('/config', async (req, res) => {
56
+ router.post('/config', jwtAuth, requireAdmin, async (req, res) => {
68
57
  try {
69
58
  await settingsService.updateBackupConfig(req.body);
70
59
  await backupCronService.reload();
@@ -76,12 +65,12 @@ router.post('/config', async (req, res) => {
76
65
  }
77
66
  });
78
67
 
79
- router.post('/test-s3', async (req, res) => {
68
+ router.post('/test-s3', jwtAuth, requireAdmin, async (req, res) => {
80
69
  try {
81
70
  // If no secret key provided in the request, fall back to the stored one
82
71
  let config = { ...req.body };
83
72
  if (!config.backupS3SecretKey) {
84
- const stored = await prisma.project.findUnique({ where: { id: 1 } });
73
+ const stored = await settingsService.getProjectRaw();
85
74
  config.backupS3SecretKey = stored?.backupS3SecretKey ?? '';
86
75
  }
87
76
 
@@ -98,7 +87,7 @@ router.post('/test-s3', async (req, res) => {
98
87
  }
99
88
  });
100
89
 
101
- router.post('/run-now', async (req, res) => {
90
+ router.post('/run-now', jwtAuth, requireAdmin, async (req, res) => {
102
91
  try {
103
92
  await backupCronService.runBackup();
104
93
  const config = await settingsService.getBackupConfig();
@@ -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
  const express = require('express');