plum-e2e 2.6.9 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +17 -2
- package/LICENSE +21 -677
- package/README.md +1 -1
- package/backend/Dockerfile +1 -13
- package/backend/app.js +4 -14
- package/backend/config/scripts/create-step.mjs +1 -13
- package/backend/config/scripts/create-test.mjs +1 -13
- package/backend/config/scripts/generate-report.js +5 -15
- package/backend/config/scripts/run-tests.js +5 -16
- package/backend/constants/defaults.js +8 -0
- package/backend/constants/env.js +16 -0
- package/backend/constants/jobStatus.js +21 -0
- package/backend/constants/socketEvents.js +40 -0
- package/backend/constants/triggers.js +6 -14
- package/backend/entrypoint.sh +1 -13
- package/backend/lib/authHeader.js +16 -0
- package/backend/lib/globalRegistry.js +1 -13
- package/backend/lib/nodeRegister.js +11 -15
- package/backend/lib/reportFilename.js +1 -13
- package/backend/lib/retryRunner.js +1 -13
- package/backend/lib/runnerProcess.js +5 -16
- package/backend/lib/screenshotPoller.js +1 -13
- package/backend/lib/serverBootstrap.js +189 -0
- package/backend/lib/serverConfig.js +1 -13
- package/backend/lib/testChunker.js +1 -13
- package/backend/lib/testEnv.js +1 -13
- package/backend/mcp/server.js +5 -15
- package/backend/middleware/auth.js +4 -14
- package/backend/middleware/jwtAuth.js +16 -18
- package/backend/middleware/requireAdmin.js +1 -13
- package/backend/package.json +3 -3
- package/backend/playwright.config.js +1 -13
- package/backend/routes/active-runs.routes.js +18 -0
- package/backend/routes/auth.routes.js +1 -13
- package/backend/routes/backup.routes.js +10 -21
- package/backend/routes/cron.routes.js +1 -13
- package/backend/routes/node.routes.js +11 -148
- package/backend/routes/reports.routes.js +1 -13
- package/backend/routes/runners.routes.js +11 -21
- package/backend/routes/settings.routes.js +6 -17
- package/backend/routes/test-cases.routes.js +1 -13
- package/backend/routes/test-runs.routes.js +1 -13
- package/backend/routes/test-suites.routes.js +1 -13
- package/backend/routes/tests.routes.js +1 -13
- package/backend/routes/trigger.routes.js +23 -165
- package/backend/routes/users.routes.js +1 -13
- package/backend/scripts/manage-runners.mjs +19 -17
- package/backend/server.js +34 -151
- package/backend/services/activeRunsService.js +55 -0
- package/backend/services/backupCronService.js +1 -13
- package/backend/services/backupService.js +7 -17
- package/backend/services/cronService.js +57 -39
- package/backend/services/envService.js +1 -13
- package/backend/services/nodeExecutionService.js +140 -0
- package/backend/services/notificationService.js +7 -17
- package/backend/services/prisma.js +1 -13
- package/backend/services/reportService.js +21 -17
- package/backend/services/runnerService.js +46 -27
- package/backend/services/settingsService.js +19 -19
- package/backend/services/testCaseService.js +1 -13
- package/backend/services/testRunService.js +1 -13
- package/backend/services/testService.js +1 -13
- package/backend/services/testSuiteService.js +1 -13
- package/backend/services/triggerService.js +246 -0
- package/backend/services/userService.js +1 -13
- package/backend/websockets/socketHandler.js +99 -48
- package/bin/plum.js +1 -13
- package/bin/postinstall.js +1 -13
- package/bin/scaffold-tests.js +1 -13
- package/docker-compose.node.yml +1 -13
- package/docker-compose.yml +2 -13
- package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +3 -3
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Modal.BuaCfdLj.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/Toast.DENwYn3g.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.BuhMvMUj.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.0Eln51hV.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.5IJAEAjc.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BR3wgXcZ.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BWAH0Beh.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BZfe6nWe.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bj_a_5lv.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BwgOqeMo.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CBHi6pzT.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CFnbmY-D.css +0 -17
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DvMkmYA-.css +6 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page._h2o67kg.css +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/BackLink.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +1 -18
- package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +1 -18
- package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +2 -19
- package/frontend/.svelte-kit/adapter-node/chunks/Modal.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/Toast.js +1 -18
- package/frontend/.svelte-kit/adapter-node/chunks/attributes.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/auth.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/auth2.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/client.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/common.js +9 -24
- package/frontend/.svelte-kit/adapter-node/chunks/constants.js +4 -18
- package/frontend/.svelte-kit/adapter-node/chunks/escaping.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/exports.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/format.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/index-server.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/index.js +4 -21
- package/frontend/.svelte-kit/adapter-node/chunks/index2.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/internal.js +1 -18
- package/frontend/.svelte-kit/adapter-node/chunks/reports.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/reports2.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/repository.js +10 -29
- package/frontend/.svelte-kit/adapter-node/chunks/runner.js +2 -20
- package/frontend/.svelte-kit/adapter-node/chunks/stores.js +0 -17
- package/frontend/.svelte-kit/adapter-node/chunks/theme.js +0 -17
- package/frontend/.svelte-kit/adapter-node/entries/fallbacks/error.svelte.js +0 -17
- package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.js +0 -17
- package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +0 -17
- package/frontend/.svelte-kit/adapter-node/entries/pages/_page.svelte.js +114 -98
- package/frontend/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/live/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +2 -19
- package/frontend/.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/_page.svelte.js +3 -20
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -20
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +3 -20
- package/frontend/.svelte-kit/adapter-node/index.js +0 -17
- package/frontend/.svelte-kit/adapter-node/internal.js +0 -17
- package/frontend/.svelte-kit/adapter-node/manifest-full.js +1 -18
- package/frontend/.svelte-kit/adapter-node/manifest.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/0.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/10.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/11.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/12.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/2.js +2 -19
- package/frontend/.svelte-kit/adapter-node/nodes/3.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/4.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/5.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/6.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/7.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/8.js +1 -18
- package/frontend/.svelte-kit/adapter-node/nodes/9.js +1 -18
- package/frontend/.svelte-kit/ambient.d.ts +2 -17
- package/frontend/.svelte-kit/generated/client/app.js +0 -17
- package/frontend/.svelte-kit/generated/client/matchers.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/0.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/1.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/10.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/11.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/12.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/2.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/3.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/4.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/5.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/6.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/7.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/8.js +0 -17
- package/frontend/.svelte-kit/generated/client/nodes/9.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/app.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/matchers.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/0.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/1.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/10.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/11.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/12.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/2.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/6.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/7.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/8.js +0 -17
- package/frontend/.svelte-kit/generated/client-optimized/nodes/9.js +0 -17
- package/frontend/.svelte-kit/generated/root.js +0 -17
- package/frontend/.svelte-kit/generated/root.svelte +0 -17
- package/frontend/.svelte-kit/generated/server/internal.js +1 -18
- package/frontend/.svelte-kit/non-ambient.d.ts +0 -17
- package/frontend/.svelte-kit/output/client/.vite/manifest.json +225 -224
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.BhSG-jZH.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/10.CdaQUS6U.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/11.BWAH0Beh.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.DvMkmYA-.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.BR3wgXcZ.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.0Eln51hV.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.DFV9OgAu.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.CFnbmY-D.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/7.CBHi6pzT.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.BwgOqeMo.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/9._h2o67kg.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Modal.BZpm0HP8.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Modal.BuaCfdLj.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/Toast.DENwYn3g.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.0Eln51hV.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BR3wgXcZ.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BWAH0Beh.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CBHi6pzT.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DvMkmYA-.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page._h2o67kg.css +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/2zMvi6fR.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{D2cvzNT9.js → 3InFPLvE.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAACMRH5.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAMUGSh7.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BKuh57WU.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DkNBSlo2.js → BUwxRmHf.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Bfc47y5P.js +0 -17
- package/frontend/{build/client/_app/immutable/chunks/DYlaQsvN.js → .svelte-kit/output/client/_app/immutable/chunks/BmZ9upwL.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C1Vid6wz.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C8OURRSs.js +0 -17
- package/frontend/{build/client/_app/immutable/chunks/oN0Z3NSF.js → .svelte-kit/output/client/_app/immutable/chunks/CGeZlCaI.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CKDtmZUQ.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -17
- package/frontend/{build/client/_app/immutable/chunks/BjUpWNbl.js → .svelte-kit/output/client/_app/immutable/chunks/CMEtqUfQ.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CNdcuGR0.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CUC98kMZ.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CgnwuKKO.js +0 -17
- package/frontend/{build/client/_app/immutable/chunks/B98sHkeB.js → .svelte-kit/output/client/_app/immutable/chunks/Co3xKhEp.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CuqnZUex.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DlNYZJ7K.js → CzlPaHY9.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DCgHuuvs.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DHM6H-es.js +7 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{3IV-uqHa.js → DMZwI8Cj.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DMyTUV-Y.js +8 -0
- package/frontend/{build/client/_app/immutable/chunks/D2gYTmAA.js → .svelte-kit/output/client/_app/immutable/chunks/DSLBMEpr.js} +1 -18
- package/frontend/{build/client/_app/immutable/chunks/DDblTLLE.js → .svelte-kit/output/client/_app/immutable/chunks/DbgD7JLa.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Dlnxgs49.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/TOCyHP97.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/nURnIknV.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/t-La0hgu.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/w0D4Uzlq.js +0 -17
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/{app.BCWbw5zZ.js → app.BkBD0hgA.js} +2 -19
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.BxeX1Uxs.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.ChjDHxSJ.js +11 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.DBSWa36f.js +6 -0
- package/frontend/{build/client/_app/immutable/nodes/10.Bn4Ma-MU.js → .svelte-kit/output/client/_app/immutable/nodes/10.DEbnxfND.js} +1 -18
- package/frontend/{build/client/_app/immutable/nodes/11.BacEu7sW.js → .svelte-kit/output/client/_app/immutable/nodes/11.O4cjXCg4.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.BWQdeRdX.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.BnHalSCi.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{3.DHx0kho3.js → 3._S1vrLVF.js} +1 -18
- package/frontend/{build/client/_app/immutable/nodes/4.CnaMiirx.js → .svelte-kit/output/client/_app/immutable/nodes/4.D-YT_JJe.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{5.B6m-zTVe.js → 5.BiFBiWcW.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{6.BPDag1zv.js → 6.BNS-W0R_.js} +1 -18
- package/frontend/{build/client/_app/immutable/nodes/7.D7LwxSvT.js → .svelte-kit/output/client/_app/immutable/nodes/7.C-pKvVZy.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{8.CCkNX20G.js → 8.BEUdazrw.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{9.HDerA6JV.js → 9.CrLHYPEJ.js} +1 -18
- package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
- package/frontend/.svelte-kit/output/server/.vite/manifest.json +3 -3
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Modal.BuaCfdLj.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/Toast.DENwYn3g.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.BuhMvMUj.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.0Eln51hV.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.5IJAEAjc.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BR3wgXcZ.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BWAH0Beh.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BZfe6nWe.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bj_a_5lv.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BwgOqeMo.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CBHi6pzT.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CFnbmY-D.css +0 -17
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DvMkmYA-.css +6 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page._h2o67kg.css +0 -17
- package/frontend/.svelte-kit/output/server/chunks/BackLink.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/Badge.js +1 -18
- package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +1 -18
- package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +2 -19
- package/frontend/.svelte-kit/output/server/chunks/Modal.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/Toast.js +1 -18
- package/frontend/.svelte-kit/output/server/chunks/attributes.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/auth.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/auth2.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/client.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/common.js +9 -24
- package/frontend/.svelte-kit/output/server/chunks/constants.js +4 -18
- package/frontend/.svelte-kit/output/server/chunks/escaping.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/exports.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/format.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/index-server.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/index.js +4 -21
- package/frontend/.svelte-kit/output/server/chunks/index2.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/internal.js +1 -18
- package/frontend/.svelte-kit/output/server/chunks/reports.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/reports2.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/repository.js +10 -29
- package/frontend/.svelte-kit/output/server/chunks/runner.js +2 -20
- package/frontend/.svelte-kit/output/server/chunks/stores.js +0 -17
- package/frontend/.svelte-kit/output/server/chunks/theme.js +0 -17
- package/frontend/.svelte-kit/output/server/entries/fallbacks/error.svelte.js +0 -17
- package/frontend/.svelte-kit/output/server/entries/pages/_layout.js +0 -17
- package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +0 -17
- package/frontend/.svelte-kit/output/server/entries/pages/_page.svelte.js +114 -98
- package/frontend/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/output/server/entries/pages/reports/live/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +2 -19
- package/frontend/.svelte-kit/output/server/entries/pages/setup/_page.svelte.js +1 -18
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/_page.svelte.js +3 -20
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -20
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +3 -20
- package/frontend/.svelte-kit/output/server/index.js +0 -17
- package/frontend/.svelte-kit/output/server/internal.js +0 -17
- package/frontend/.svelte-kit/output/server/manifest-full.js +1 -18
- package/frontend/.svelte-kit/output/server/manifest.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/0.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/1.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/10.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/11.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/12.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/2.js +2 -19
- package/frontend/.svelte-kit/output/server/nodes/3.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/4.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/5.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/6.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/7.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/8.js +1 -18
- package/frontend/.svelte-kit/output/server/nodes/9.js +1 -18
- package/frontend/Dockerfile +1 -13
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css +0 -17
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css +0 -17
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css +0 -17
- package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/11.BWAH0Beh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -17
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/12.Bj_a_5lv.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css +6 -0
- package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/2.DvMkmYA-.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css +0 -17
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/3.BR3wgXcZ.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css +0 -17
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/4.0Eln51hV.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css +0 -17
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/5.DFV9OgAu.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css +0 -17
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/6.CFnbmY-D.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css +0 -17
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/7.CBHi6pzT.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css +0 -17
- package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/8.BwgOqeMo.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css +0 -17
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/9._h2o67kg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -17
- package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.CvWWuO3h.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css +0 -17
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Badge.D1SV0Gv7.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -17
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css +0 -17
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/ConfirmModal.Dd3uP-Sk.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css +0 -17
- package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/EmptyState.DUDM4P19.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css +0 -17
- package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BZpm0HP8.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css +0 -17
- package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Modal.BuaCfdLj.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css +0 -17
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Pagination.DZmi2Po-.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css +0 -17
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.BuhMvMUj.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.0Eln51hV.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BR3wgXcZ.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BWAH0Beh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BZfe6nWe.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Bj_a_5lv.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.BwgOqeMo.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CBHi6pzT.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CFnbmY-D.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css +6 -0
- package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.DvMkmYA-.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css +0 -17
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page._h2o67kg.css.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/2zMvi6fR.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{D2cvzNT9.js → 3InFPLvE.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/3InFPLvE.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAACMRH5.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAMUGSh7.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BKuh57WU.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{DkNBSlo2.js → BUwxRmHf.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BUwxRmHf.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Bfc47y5P.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/DYlaQsvN.js → build/client/_app/immutable/chunks/BmZ9upwL.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BmZ9upwL.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1Vid6wz.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C8OURRSs.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/oN0Z3NSF.js → build/client/_app/immutable/chunks/CGeZlCaI.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CGeZlCaI.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CKDtmZUQ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CMBQQ9RZ.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/BjUpWNbl.js → build/client/_app/immutable/chunks/CMEtqUfQ.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CMEtqUfQ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/B98sHkeB.js → build/client/_app/immutable/chunks/Co3xKhEp.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.br +0 -16
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{DlNYZJ7K.js → CzlPaHY9.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CzlPaHY9.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js +7 -0
- package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{3IV-uqHa.js → DMZwI8Cj.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js +8 -0
- package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DMyTUV-Y.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/D2gYTmAA.js → build/client/_app/immutable/chunks/DSLBMEpr.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/DDblTLLE.js → build/client/_app/immutable/chunks/DbgD7JLa.js} +1 -18
- package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DbgD7JLa.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Dlnxgs49.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/TOCyHP97.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/nURnIknV.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/nURnIknV.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/nURnIknV.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/t-La0hgu.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js +0 -17
- package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/{app.BCWbw5zZ.js → app.BkBD0hgA.js} +2 -19
- package/frontend/build/client/_app/immutable/entry/app.BkBD0hgA.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.BkBD0hgA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js +6 -0
- package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js.br +6 -0
- package/frontend/build/client/_app/immutable/entry/start.BxeX1Uxs.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js +11 -0
- package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.ChjDHxSJ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.DBSWa36f.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/10.Bn4Ma-MU.js → build/client/_app/immutable/nodes/10.DEbnxfND.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.DEbnxfND.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/11.BacEu7sW.js → build/client/_app/immutable/nodes/11.O4cjXCg4.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/11.O4cjXCg4.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.O4cjXCg4.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.BWQdeRdX.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BnHalSCi.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{3.DHx0kho3.js → 3._S1vrLVF.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/3._S1vrLVF.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3._S1vrLVF.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/4.CnaMiirx.js → build/client/_app/immutable/nodes/4.D-YT_JJe.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{5.B6m-zTVe.js → 5.BiFBiWcW.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/5.BiFBiWcW.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.BiFBiWcW.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{6.BPDag1zv.js → 6.BNS-W0R_.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/6.BNS-W0R_.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.BNS-W0R_.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/7.D7LwxSvT.js → build/client/_app/immutable/nodes/7.C-pKvVZy.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{8.CCkNX20G.js → 8.BEUdazrw.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/8.BEUdazrw.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.BEUdazrw.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{9.HDerA6JV.js → 9.CrLHYPEJ.js} +1 -18
- package/frontend/build/client/_app/immutable/nodes/9.CrLHYPEJ.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.CrLHYPEJ.js.gz +0 -0
- package/frontend/build/client/_app/version.json +1 -1
- package/frontend/build/client/_app/version.json.br +0 -0
- package/frontend/build/client/_app/version.json.gz +0 -0
- package/frontend/build/env.js +0 -17
- package/frontend/build/handler.js +0 -17
- package/frontend/build/index.js +0 -17
- package/frontend/build/server/chunks/0-Cn_2hzqk.js +22 -0
- package/frontend/build/server/chunks/0-Cn_2hzqk.js.map +5 -0
- package/frontend/build/server/chunks/1-BrRGJFSB.js +14 -0
- package/frontend/build/server/chunks/1-BrRGJFSB.js.map +5 -0
- package/frontend/build/server/chunks/10-l6_ikL_D.js +14 -0
- package/frontend/build/server/chunks/{10-Bhe409bL.js.map → 10-l6_ikL_D.js.map} +1 -17
- package/frontend/build/server/chunks/11-BLPbHJqB.js +14 -0
- package/frontend/build/server/chunks/{11-DqyXW7n1.js.map → 11-BLPbHJqB.js.map} +1 -17
- package/frontend/build/server/chunks/12-S1ujUrHy.js +14 -0
- package/frontend/build/server/chunks/{12-BCpjMUbs.js.map → 12-S1ujUrHy.js.map} +1 -17
- package/frontend/build/server/chunks/2-Cte30Dgy.js +14 -0
- package/frontend/build/server/chunks/2-Cte30Dgy.js.map +5 -0
- package/frontend/build/server/chunks/3-BHkXVoNI.js +14 -0
- package/frontend/build/server/chunks/{3-y2kzPO2X.js.map → 3-BHkXVoNI.js.map} +1 -17
- package/frontend/build/server/chunks/4-Bo04DC5Z.js +14 -0
- package/frontend/build/server/chunks/4-Bo04DC5Z.js.map +5 -0
- package/frontend/build/server/chunks/5-F1ZsXMt2.js +14 -0
- package/frontend/build/server/chunks/5-F1ZsXMt2.js.map +5 -0
- package/frontend/build/server/chunks/6-FlZLnYJ6.js +14 -0
- package/frontend/build/server/chunks/6-FlZLnYJ6.js.map +5 -0
- package/frontend/build/server/chunks/7-DiQJZEF_.js +14 -0
- package/frontend/build/server/chunks/{7-DekQfQHu.js.map → 7-DiQJZEF_.js.map} +1 -17
- package/frontend/build/server/chunks/8-DXReUGxi.js +14 -0
- package/frontend/build/server/chunks/8-DXReUGxi.js.map +5 -0
- package/frontend/build/server/chunks/9-Cy_mGmt4.js +14 -0
- package/frontend/build/server/chunks/{9-C5sKo9aY.js.map → 9-Cy_mGmt4.js.map} +1 -17
- package/frontend/build/server/chunks/{BackLink-KxZNqsaq.js → BackLink-BJ8NaemM.js} +2 -19
- package/frontend/build/server/chunks/{BackLink-KxZNqsaq.js.map → BackLink-BJ8NaemM.js.map} +1 -17
- package/frontend/build/server/chunks/Badge-44ZTDx0V.js +18 -0
- package/frontend/build/server/chunks/{Badge-B5V-z6pI.js.map → Badge-44ZTDx0V.js.map} +1 -17
- package/frontend/build/server/chunks/{ConfirmModal-Ckkt99Pn.js → ConfirmModal-C0EAXcq_.js} +4 -21
- package/frontend/build/server/chunks/{ConfirmModal-Ckkt99Pn.js.map → ConfirmModal-C0EAXcq_.js.map} +1 -17
- package/frontend/build/server/chunks/{EmptyState-BwwbShnX.js → EmptyState-BA_eXaeR.js} +3 -20
- package/frontend/build/server/chunks/{EmptyState-BwwbShnX.js.map → EmptyState-BA_eXaeR.js.map} +1 -17
- package/frontend/build/server/chunks/{Modal-DG-6c5si.js → Modal-DChG187n.js} +2 -19
- package/frontend/build/server/chunks/{Modal-DG-6c5si.js.map → Modal-DChG187n.js.map} +1 -17
- package/frontend/build/server/chunks/{Toast-CIG4edEp.js → Toast-v-q4ZnYq.js} +2 -19
- package/frontend/build/server/chunks/{Toast-CIG4edEp.js.map → Toast-v-q4ZnYq.js.map} +1 -17
- package/frontend/build/server/chunks/_layout.svelte-CHVI3Prt.js +29 -0
- package/frontend/build/server/chunks/{_layout.svelte-BjPrZpoG.js.map → _layout.svelte-CHVI3Prt.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-BbZNxvCl.js → _page.svelte-1as75nPc.js} +14 -30
- package/frontend/build/server/chunks/{_page.svelte-BbZNxvCl.js.map → _page.svelte-1as75nPc.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-CLFpft5D.js → _page.svelte-1jo8MapI.js} +11 -28
- package/frontend/build/server/chunks/{_page.svelte-CLFpft5D.js.map → _page.svelte-1jo8MapI.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-BHw14GPR.js → _page.svelte-BuFusRK1.js} +12 -29
- package/frontend/build/server/chunks/{_page.svelte-BHw14GPR.js.map → _page.svelte-BuFusRK1.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-D78qaBDN.js → _page.svelte-CAVyp70V.js} +14 -30
- package/frontend/build/server/chunks/{_page.svelte-D78qaBDN.js.map → _page.svelte-CAVyp70V.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-D2oF79cT.js → _page.svelte-CB8-QBNg.js} +11 -28
- package/frontend/build/server/chunks/{_page.svelte-D2oF79cT.js.map → _page.svelte-CB8-QBNg.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-DyyuZN_3.js → _page.svelte-CWWeZuid.js} +11 -28
- package/frontend/build/server/chunks/{_page.svelte-DyyuZN_3.js.map → _page.svelte-CWWeZuid.js.map} +1 -17
- package/frontend/build/server/chunks/_page.svelte-CpB-fgJl.js +224 -0
- package/frontend/build/server/chunks/_page.svelte-CpB-fgJl.js.map +5 -0
- package/frontend/build/server/chunks/_page.svelte-D3E6Eojd.js +32 -0
- package/frontend/build/server/chunks/{_page.svelte-B9rjnZWE.js.map → _page.svelte-D3E6Eojd.js.map} +1 -17
- package/frontend/build/server/chunks/_page.svelte-Kg69DDaM.js +32 -0
- package/frontend/build/server/chunks/{_page.svelte-D1aYn1PL.js.map → _page.svelte-Kg69DDaM.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-ubW5EUCf.js → _page.svelte-L9fuiN_q.js} +10 -27
- package/frontend/build/server/chunks/{_page.svelte-ubW5EUCf.js.map → _page.svelte-L9fuiN_q.js.map} +1 -17
- package/frontend/build/server/chunks/{_page.svelte-Cr16HubD.js → _page.svelte-wKyUmA2e.js} +12 -29
- package/frontend/build/server/chunks/{_page.svelte-Cr16HubD.js.map → _page.svelte-wKyUmA2e.js.map} +1 -17
- package/frontend/build/server/chunks/attributes-BeaNKpgU.js +0 -17
- package/frontend/build/server/chunks/attributes-BeaNKpgU.js.map +0 -16
- package/frontend/build/server/chunks/{auth-rlH-cIzn.js → auth-Chw-wBpI.js} +2 -19
- package/frontend/build/server/chunks/{auth-rlH-cIzn.js.map → auth-Chw-wBpI.js.map} +1 -17
- package/frontend/build/server/chunks/auth2-C02yYDpz.js +0 -17
- package/frontend/build/server/chunks/auth2-C02yYDpz.js.map +0 -16
- package/frontend/build/server/chunks/{client-DyII78e0.js → client-DEmxR_a-.js} +2 -19
- package/frontend/build/server/chunks/{client-DyII78e0.js.map → client-DEmxR_a-.js.map} +1 -17
- package/frontend/build/server/chunks/common-DYYTVHPw.js +26 -0
- package/frontend/build/server/chunks/common-DYYTVHPw.js.map +5 -0
- package/frontend/build/server/chunks/constants-CXTaQaB6.js +27 -0
- package/frontend/build/server/chunks/constants-CXTaQaB6.js.map +5 -0
- package/frontend/build/server/chunks/error.svelte-BD3xNemk.js +33 -0
- package/frontend/build/server/chunks/{error.svelte-BDW3iP1O.js.map → error.svelte-BD3xNemk.js.map} +1 -17
- package/frontend/build/server/chunks/escaping-CqgfEcN3.js +0 -17
- package/frontend/build/server/chunks/escaping-CqgfEcN3.js.map +0 -16
- package/frontend/build/server/chunks/exports-D0QHgeSL.js +0 -17
- package/frontend/build/server/chunks/exports-D0QHgeSL.js.map +0 -16
- package/frontend/build/server/chunks/{format-0SSB1oGG.js → format-CiNRMfHu.js} +2 -19
- package/frontend/build/server/chunks/{format-0SSB1oGG.js.map → format-CiNRMfHu.js.map} +1 -17
- package/frontend/build/server/chunks/index-server-B3M9vyh2.js +19 -0
- package/frontend/build/server/chunks/index-server-B3M9vyh2.js.map +5 -0
- package/frontend/build/server/chunks/{index2-DG8XHU5D.js → index2-5R1tbrep.js} +2 -19
- package/frontend/build/server/chunks/{index2-DG8XHU5D.js.map → index2-5R1tbrep.js.map} +1 -17
- package/frontend/build/server/chunks/{reports-DnYbvluH.js → reports-D_ApeeNh.js} +2 -19
- package/frontend/build/server/chunks/{reports-DnYbvluH.js.map → reports-D_ApeeNh.js.map} +1 -17
- package/frontend/build/server/chunks/{reports2-DR4XlcJg.js → reports2-BtElN_53.js} +2 -19
- package/frontend/build/server/chunks/{reports2-DR4XlcJg.js.map → reports2-BtElN_53.js.map} +1 -17
- package/frontend/build/server/chunks/{repository-D9Derhnk.js → repository-FYYV_vKE.js} +3 -21
- package/frontend/build/server/chunks/repository-FYYV_vKE.js.map +5 -0
- package/frontend/build/server/chunks/{runner-DE5sufZH.js → runner-DC7hXbnY.js} +5 -22
- package/frontend/build/server/chunks/runner-DC7hXbnY.js.map +5 -0
- package/frontend/build/server/chunks/stores-BLenR3c1.js +32 -0
- package/frontend/build/server/chunks/{stores-DlkXV308.js.map → stores-BLenR3c1.js.map} +1 -17
- package/frontend/build/server/chunks/theme-nAx-GvX_.js +15 -0
- package/frontend/build/server/chunks/theme-nAx-GvX_.js.map +5 -0
- package/frontend/build/server/index.js +2 -19
- package/frontend/build/server/index.js.map +1 -17
- package/frontend/build/server/manifest.js +14 -31
- package/frontend/build/server/manifest.js.map +1 -17
- package/frontend/build/shims.js +0 -17
- package/frontend/package.json +1 -0
- package/frontend/src/app.css +1 -13
- package/frontend/src/app.html +1 -13
- package/frontend/src/lib/api/activeRuns.js +18 -0
- package/frontend/src/lib/api/auth.js +1 -13
- package/frontend/src/lib/api/reports.js +1 -13
- package/frontend/src/lib/api/repository.js +1 -13
- package/frontend/src/lib/api/runners.js +26 -21
- package/frontend/src/lib/api/schedules.js +1 -13
- package/frontend/src/lib/api/settings.js +11 -23
- package/frontend/src/lib/api/tests.js +1 -13
- package/frontend/src/lib/api/users.js +1 -13
- package/frontend/src/lib/components/icons/BrowserIcon.svelte +1 -13
- package/frontend/src/lib/components/layout/Nav.svelte +1 -13
- package/frontend/src/lib/components/layout/PageShell.svelte +1 -13
- package/frontend/src/lib/components/layout/RunnerPanel.svelte +146 -105
- package/frontend/src/lib/components/ui/AutomatedBadge.svelte +2 -31
- package/frontend/src/lib/components/ui/BackLink.svelte +1 -30
- package/frontend/src/lib/components/ui/Badge.svelte +1 -13
- package/frontend/src/lib/components/ui/Button.svelte +1 -13
- package/frontend/src/lib/components/ui/CaseIdChip.svelte +1 -30
- package/frontend/src/lib/components/ui/ConfirmModal.svelte +8 -17
- package/frontend/src/lib/components/ui/EmptyState.svelte +26 -15
- package/frontend/src/lib/components/ui/Modal.svelte +1 -13
- package/frontend/src/lib/components/ui/Pagination.svelte +1 -13
- package/frontend/src/lib/components/ui/PriorityBadge.svelte +1 -30
- package/frontend/src/lib/components/ui/ResultChip.svelte +1 -30
- package/frontend/src/lib/components/ui/StatusDot.svelte +1 -30
- package/frontend/src/lib/components/ui/StepKeyword.svelte +1 -30
- package/frontend/src/lib/components/ui/StepStatusIcon.svelte +1 -30
- package/frontend/src/lib/components/ui/TagChip.svelte +1 -30
- package/frontend/src/lib/components/ui/Terminal.svelte +1 -13
- package/frontend/src/lib/components/ui/Toast.svelte +1 -13
- package/frontend/src/lib/constants.js +5 -17
- package/frontend/src/lib/copy/auth.js +29 -0
- package/frontend/src/lib/copy/common.js +39 -0
- package/frontend/src/lib/copy/dashboard.js +28 -0
- package/frontend/src/lib/copy/reports.js +83 -0
- package/frontend/src/lib/copy/repository.js +153 -0
- package/frontend/src/lib/copy/runners.js +59 -0
- package/frontend/src/lib/copy/schedules.js +96 -0
- package/frontend/src/lib/copy/settings.js +295 -0
- package/frontend/src/lib/index.js +1 -13
- package/frontend/src/lib/socketEvents.js +36 -0
- package/frontend/src/lib/stores/auth.js +1 -13
- package/frontend/src/lib/stores/runner.js +10 -18
- package/frontend/src/lib/stores/theme.js +1 -13
- package/frontend/src/lib/styles/global.css +1 -13
- package/frontend/src/lib/styles/reset.css +1 -13
- package/frontend/src/lib/styles/tokens.css +1 -13
- package/frontend/src/lib/utils/format.js +1 -13
- package/frontend/src/routes/+layout.js +1 -13
- package/frontend/src/routes/+layout.svelte +1 -13
- package/frontend/src/routes/+page.svelte +296 -115
- package/frontend/src/routes/login/+page.svelte +22 -23
- package/frontend/src/routes/reports/+page.svelte +37 -38
- package/frontend/src/routes/reports/[id]/+page.svelte +54 -43
- package/frontend/src/routes/reports/live/+page.svelte +57 -42
- package/frontend/src/routes/scheduled-tests/+page.svelte +134 -117
- package/frontend/src/routes/settings/+page.svelte +490 -267
- package/frontend/src/routes/setup/+page.svelte +30 -27
- package/frontend/src/routes/test-repository/+page.svelte +120 -91
- package/frontend/src/routes/test-repository/runs/[id]/+page.svelte +95 -60
- package/frontend/src/routes/test-repository/suites/[id]/+page.svelte +145 -91
- package/frontend/svelte.config.js +1 -13
- package/frontend/vite.config.js +1 -13
- package/package.json +2 -2
- package/resources/mit-license.txt +2 -0
- package/backend/scripts/create-test.js +0 -149
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/2.CrXpMrqh.css +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/4N1zIH8t.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BhvHtTRh.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C1sukchk.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DW85KPAh.js +0 -24
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DW_iTTZe.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DtGXv8RA.js +0 -25
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/start.2_AF42wj.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.BAqq2UTE.js +0 -28
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/1.D5VvLtGP.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.0YGtl1uj.js +0 -23
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/2.C2jjMA-Z.js +0 -23
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css +0 -23
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/2.CrXpMrqh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css +0 -23
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.CrXpMrqh.css.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/3IV-uqHa.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/3IV-uqHa.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/4N1zIH8t.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/B98sHkeB.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/B98sHkeB.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BhvHtTRh.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BjUpWNbl.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BjUpWNbl.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1sukchk.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/C1sukchk.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C1sukchk.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2cvzNT9.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2cvzNT9.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2gYTmAA.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/D2gYTmAA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DDblTLLE.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DDblTLLE.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js +0 -24
- package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW85KPAh.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js +0 -23
- package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DW_iTTZe.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DYlaQsvN.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DYlaQsvN.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DkNBSlo2.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DkNBSlo2.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DlNYZJ7K.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DlNYZJ7K.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js +0 -25
- package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DtGXv8RA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/oN0Z3NSF.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/app.BCWbw5zZ.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.BCWbw5zZ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js +0 -23
- package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js.br +0 -22
- package/frontend/build/client/_app/immutable/entry/start.2_AF42wj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js +0 -28
- package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.BAqq2UTE.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js +0 -23
- package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.D5VvLtGP.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.Bn4Ma-MU.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.Bn4Ma-MU.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.BacEu7sW.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.BacEu7sW.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js +0 -23
- package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.0YGtl1uj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js +0 -23
- package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.C2jjMA-Z.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.DHx0kho3.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.DHx0kho3.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.CnaMiirx.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.CnaMiirx.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.B6m-zTVe.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.B6m-zTVe.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.BPDag1zv.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.BPDag1zv.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.D7LwxSvT.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.D7LwxSvT.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.CCkNX20G.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.CCkNX20G.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.HDerA6JV.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.HDerA6JV.js.gz +0 -0
- package/frontend/build/server/chunks/0-Di4jNU9J.js +0 -39
- package/frontend/build/server/chunks/0-Di4jNU9J.js.map +0 -21
- package/frontend/build/server/chunks/1-DR5YRUTa.js +0 -31
- package/frontend/build/server/chunks/1-DR5YRUTa.js.map +0 -21
- package/frontend/build/server/chunks/10-Bhe409bL.js +0 -31
- package/frontend/build/server/chunks/11-DqyXW7n1.js +0 -31
- package/frontend/build/server/chunks/12-BCpjMUbs.js +0 -31
- package/frontend/build/server/chunks/2-D-0buH5i.js +0 -31
- package/frontend/build/server/chunks/2-D-0buH5i.js.map +0 -21
- package/frontend/build/server/chunks/3-y2kzPO2X.js +0 -31
- package/frontend/build/server/chunks/4-CFrK8HST.js +0 -31
- package/frontend/build/server/chunks/4-CFrK8HST.js.map +0 -21
- package/frontend/build/server/chunks/5-B0lJu5bT.js +0 -31
- package/frontend/build/server/chunks/5-B0lJu5bT.js.map +0 -21
- package/frontend/build/server/chunks/6-BD4CEJ3Z.js +0 -31
- package/frontend/build/server/chunks/6-BD4CEJ3Z.js.map +0 -21
- package/frontend/build/server/chunks/7-DekQfQHu.js +0 -31
- package/frontend/build/server/chunks/8-BMqmu7WF.js +0 -31
- package/frontend/build/server/chunks/8-BMqmu7WF.js.map +0 -21
- package/frontend/build/server/chunks/9-C5sKo9aY.js +0 -31
- package/frontend/build/server/chunks/Badge-B5V-z6pI.js +0 -35
- package/frontend/build/server/chunks/_layout.svelte-BjPrZpoG.js +0 -46
- package/frontend/build/server/chunks/_page.svelte-B9rjnZWE.js +0 -49
- package/frontend/build/server/chunks/_page.svelte-D1aYn1PL.js +0 -49
- package/frontend/build/server/chunks/_page.svelte-sbqebZYx.js +0 -206
- package/frontend/build/server/chunks/_page.svelte-sbqebZYx.js.map +0 -21
- package/frontend/build/server/chunks/common-Db-bgKYG.js +0 -42
- package/frontend/build/server/chunks/common-Db-bgKYG.js.map +0 -21
- package/frontend/build/server/chunks/constants-cZ2kUwWa.js +0 -41
- package/frontend/build/server/chunks/constants-cZ2kUwWa.js.map +0 -21
- package/frontend/build/server/chunks/error.svelte-BDW3iP1O.js +0 -50
- package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js +0 -36
- package/frontend/build/server/chunks/index-server-Dr2Nvcmu.js.map +0 -21
- package/frontend/build/server/chunks/repository-D9Derhnk.js.map +0 -21
- package/frontend/build/server/chunks/runner-DE5sufZH.js.map +0 -21
- package/frontend/build/server/chunks/stores-DlkXV308.js +0 -49
- package/frontend/build/server/chunks/theme-D_NKm6iI.js +0 -32
- package/frontend/build/server/chunks/theme-D_NKm6iI.js.map +0 -21
- package/resources/gpl-3.0-license.txt +0 -14
|
@@ -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
|
/**
|
|
@@ -49,6 +37,14 @@ const API_URL = process.env.PLUM_API_URL || 'http://localhost:3001';
|
|
|
49
37
|
|
|
50
38
|
const cancelled = (v) => clack.isCancel(v);
|
|
51
39
|
|
|
40
|
+
// The /runners routes require an authenticated admin session, which this
|
|
41
|
+
// headless CLI has no browser/JWT to provide — PLUM_NODE_KEY is the shared
|
|
42
|
+
// secret that stands in for one (see backend/middleware/jwtAuth.js).
|
|
43
|
+
function authHeaders() {
|
|
44
|
+
const nodeKey = process.env.PLUM_NODE_KEY;
|
|
45
|
+
return nodeKey ? { Authorization: `ApiKey ${nodeKey}` } : {};
|
|
46
|
+
}
|
|
47
|
+
|
|
52
48
|
/**
|
|
53
49
|
* When the primary runs in Docker it cannot reach `localhost` on the host —
|
|
54
50
|
* only substitute when the user explicitly enters localhost/127.0.0.1.
|
|
@@ -65,7 +61,7 @@ function resolveNodeUrl(url) {
|
|
|
65
61
|
}
|
|
66
62
|
|
|
67
63
|
async function fetchRunners() {
|
|
68
|
-
const res = await fetch(`${API_URL}/runners
|
|
64
|
+
const res = await fetch(`${API_URL}/runners`, { headers: authHeaders() });
|
|
69
65
|
if (!res.ok) throw new Error(`HTTP ${res.status}`);
|
|
70
66
|
const body = await res.json();
|
|
71
67
|
return body.runners ?? [];
|
|
@@ -73,7 +69,10 @@ async function fetchRunners() {
|
|
|
73
69
|
|
|
74
70
|
async function pingRunner(id) {
|
|
75
71
|
try {
|
|
76
|
-
const res = await fetch(`${API_URL}/runners/${id}/ping`, {
|
|
72
|
+
const res = await fetch(`${API_URL}/runners/${id}/ping`, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: authHeaders()
|
|
75
|
+
});
|
|
77
76
|
const body = await res.json().catch(() => ({}));
|
|
78
77
|
return body.ok === true;
|
|
79
78
|
} catch {
|
|
@@ -82,7 +81,7 @@ async function pingRunner(id) {
|
|
|
82
81
|
}
|
|
83
82
|
|
|
84
83
|
async function deleteRunner(id) {
|
|
85
|
-
const res = await fetch(`${API_URL}/runners/${id}`, { method: 'DELETE' });
|
|
84
|
+
const res = await fetch(`${API_URL}/runners/${id}`, { method: 'DELETE', headers: authHeaders() });
|
|
86
85
|
if (!res.ok) {
|
|
87
86
|
const body = await res.json().catch(() => ({}));
|
|
88
87
|
throw new Error(body.error || `HTTP ${res.status}`);
|
|
@@ -95,7 +94,10 @@ async function deleteRunner(id) {
|
|
|
95
94
|
* reachable runner, not just ones whose process this manager owns by PID.
|
|
96
95
|
*/
|
|
97
96
|
async function controlRunner(id, action) {
|
|
98
|
-
const res = await fetch(`${API_URL}/runners/${id}/${action}`, {
|
|
97
|
+
const res = await fetch(`${API_URL}/runners/${id}/${action}`, {
|
|
98
|
+
method: 'POST',
|
|
99
|
+
headers: authHeaders()
|
|
100
|
+
});
|
|
99
101
|
const body = await res.json().catch(() => ({}));
|
|
100
102
|
if (!res.ok || body.ok === false) throw new Error(body.error || `HTTP ${res.status}`);
|
|
101
103
|
}
|
package/backend/server.js
CHANGED
|
@@ -1,173 +1,56 @@
|
|
|
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 http = require('http');
|
|
7
|
+
const path = require('path');
|
|
19
8
|
const { Server } = require('socket.io');
|
|
20
9
|
const app = require('./app');
|
|
21
|
-
const
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
10
|
+
const { PLUM_MODE_NODE, DEFAULT_PORT } = require('./constants/env');
|
|
11
|
+
const {
|
|
12
|
+
ensureTestsDir,
|
|
13
|
+
attachListenRetry,
|
|
14
|
+
wireRealtimeServices,
|
|
15
|
+
initCronServices,
|
|
16
|
+
bootstrapMcpKey,
|
|
17
|
+
onServerListening
|
|
18
|
+
} = require('./lib/serverBootstrap');
|
|
19
|
+
|
|
20
|
+
// Runner nodes receive their test files from dispatched jobs; the main
|
|
21
|
+
// server expects them to already be mounted on disk.
|
|
27
22
|
const testsDir = path.resolve(process.cwd(), 'tests');
|
|
28
23
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
} else {
|
|
33
|
-
console.error('❌ No tests folder found at /app/tests');
|
|
34
|
-
process.exit(1);
|
|
35
|
-
}
|
|
36
|
-
} else {
|
|
37
|
-
console.log('📂 Loading tests from:', testsDir);
|
|
38
|
-
}
|
|
24
|
+
// Node/runner mode strips out everything that only makes sense on the main
|
|
25
|
+
// server (cron, MCP, socket.io, file watching).
|
|
26
|
+
const isNodeMode = process.env.PLUM_MODE === PLUM_MODE_NODE;
|
|
39
27
|
|
|
40
|
-
const
|
|
41
|
-
const port = parseInt(process.env.PORT || '3001', 10);
|
|
28
|
+
const port = parseInt(process.env.PORT || DEFAULT_PORT, 10);
|
|
42
29
|
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
// EADDRINUSE — retry instead of dying immediately.
|
|
46
|
-
let listenRetriesLeft = 20;
|
|
47
|
-
server.on('error', (err) => {
|
|
48
|
-
if (err.code === 'EADDRINUSE' && listenRetriesLeft > 0) {
|
|
49
|
-
listenRetriesLeft -= 1;
|
|
50
|
-
setTimeout(() => server.listen(port), 250);
|
|
51
|
-
} else {
|
|
52
|
-
console.error(`❌ Failed to bind port ${port}:`, err.message);
|
|
53
|
-
process.exit(1);
|
|
54
|
-
}
|
|
55
|
-
});
|
|
30
|
+
// The underlying HTTP server, shared by Express and Socket.io.
|
|
31
|
+
const server = http.createServer(app);
|
|
56
32
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (!isNodeMode) {
|
|
60
|
-
const socketHandler = require('./websockets/socketHandler.js');
|
|
61
|
-
cronService = require('./services/cronService');
|
|
62
|
-
backupCronService = require('./services/backupCronService');
|
|
63
|
-
socketHandler(io);
|
|
64
|
-
cronService.setSocketIO(io);
|
|
65
|
-
require('./routes/trigger.routes').setSocketIO(io);
|
|
66
|
-
}
|
|
33
|
+
// Real-time transport for live test output, screenshots, and run status.
|
|
34
|
+
const io = new Server(server, { cors: { origin: '*' } });
|
|
67
35
|
|
|
68
36
|
async function start() {
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
if (!isNodeMode && !process.env.PLUM_MCP_KEY) {
|
|
73
|
-
try {
|
|
74
|
-
const settingsService = require('./services/settingsService');
|
|
75
|
-
const { mcpKey } = await settingsService.getMcpConfig();
|
|
76
|
-
if (mcpKey) process.env.PLUM_MCP_KEY = mcpKey;
|
|
77
|
-
} catch {}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
server.listen(port, async () => {
|
|
81
|
-
console.log(`Backend running on port ${port}${isNodeMode ? ' (node/runner mode)' : ''}`);
|
|
82
|
-
if (isNodeMode) {
|
|
83
|
-
// Self-register PID so manage-runners can track and stop this process.
|
|
84
|
-
const runnerId = process.env.RUNNER_ID;
|
|
85
|
-
if (runnerId) {
|
|
86
|
-
const { loadRegistry, saveRegistry } = require('./lib/runnerProcess');
|
|
87
|
-
const registry = loadRegistry();
|
|
88
|
-
registry[runnerId] = { pid: process.pid, port: String(port), startedAt: Date.now() };
|
|
89
|
-
saveRegistry(registry);
|
|
90
|
-
|
|
91
|
-
const cleanup = () => {
|
|
92
|
-
try {
|
|
93
|
-
const reg = loadRegistry();
|
|
94
|
-
// A self-restart already wrote the replacement's pid under this
|
|
95
|
-
// id before this process exits — only touch the entry if it's
|
|
96
|
-
// still ours, so we don't clobber the new process's registration.
|
|
97
|
-
// Keep the entry (with its port) rather than deleting it — that's
|
|
98
|
-
// the only place a later manual Start can find the port this
|
|
99
|
-
// runner was last running on.
|
|
100
|
-
if (reg[runnerId]?.pid === process.pid) {
|
|
101
|
-
reg[runnerId] = { ...reg[runnerId], pid: null };
|
|
102
|
-
saveRegistry(reg);
|
|
103
|
-
}
|
|
104
|
-
} catch {}
|
|
105
|
-
};
|
|
106
|
-
// Adding a SIGTERM/SIGINT listener suppresses Node's default
|
|
107
|
-
// "terminate immediately" behavior — the handler must exit itself,
|
|
108
|
-
// or the process (and the port it's bound to) lives on forever
|
|
109
|
-
// after a plain `kill`/SIGTERM with nothing left to stop it short
|
|
110
|
-
// of SIGKILL.
|
|
111
|
-
process.once('SIGTERM', () => {
|
|
112
|
-
cleanup();
|
|
113
|
-
process.exit(0);
|
|
114
|
-
});
|
|
115
|
-
process.once('SIGINT', () => {
|
|
116
|
-
cleanup();
|
|
117
|
-
process.exit(0);
|
|
118
|
-
});
|
|
119
|
-
process.once('exit', cleanup);
|
|
120
|
-
}
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
37
|
+
// Confirm the tests directory is in place before doing anything else.
|
|
38
|
+
ensureTestsDir(testsDir, isNodeMode);
|
|
123
39
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
.syncAutomatedFromFeatures()
|
|
127
|
-
.catch(() => {});
|
|
40
|
+
// Survive the brief EADDRINUSE window a self-restart can hit.
|
|
41
|
+
attachListenRetry(server, port);
|
|
128
42
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
try {
|
|
132
|
-
chokidar = (await import('chokidar')).default;
|
|
133
|
-
} catch {
|
|
134
|
-
console.warn('⚠️ chokidar unavailable — file watching disabled');
|
|
135
|
-
return;
|
|
136
|
-
}
|
|
43
|
+
// Connect socket.io to the runner/cron services (a no-op in node mode).
|
|
44
|
+
const { cronService, backupCronService } = wireRealtimeServices(io, isNodeMode);
|
|
137
45
|
|
|
138
|
-
|
|
46
|
+
// Start the scheduled test and backup cron jobs.
|
|
47
|
+
await initCronServices(cronService, backupCronService);
|
|
139
48
|
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
if (fs.existsSync(featuresDir)) {
|
|
143
|
-
let debounce = null;
|
|
144
|
-
chokidar.watch(featuresDir, watchOpts).on('all', (event, filePath) => {
|
|
145
|
-
clearTimeout(debounce);
|
|
146
|
-
debounce = setTimeout(() => {
|
|
147
|
-
console.log(
|
|
148
|
-
`📝 Tests changed (${event}: ${path.basename(filePath)}) — notifying clients`
|
|
149
|
-
);
|
|
150
|
-
io.emit('tests-changed');
|
|
151
|
-
require('./services/reportService')
|
|
152
|
-
.syncAutomatedFromFeatures()
|
|
153
|
-
.catch(() => {});
|
|
154
|
-
}, 300);
|
|
155
|
-
});
|
|
156
|
-
console.log('👀 Watching for test file changes...');
|
|
157
|
-
}
|
|
49
|
+
// Load the saved MCP API key into the environment for the MCP server.
|
|
50
|
+
await bootstrapMcpKey(isNodeMode);
|
|
158
51
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
fs.mkdirSync(reportsDir, { recursive: true });
|
|
162
|
-
chokidar.watch(reportsDir, { ...watchOpts, interval: 1200 }).on('add', (filePath) => {
|
|
163
|
-
const name = path.basename(filePath);
|
|
164
|
-
if ((name.startsWith('PASS_') || name.startsWith('FAIL_')) && name.endsWith('.json')) {
|
|
165
|
-
console.log(`📊 New report: ${name} — notifying clients`);
|
|
166
|
-
io.emit('report-ready');
|
|
167
|
-
}
|
|
168
|
-
});
|
|
169
|
-
console.log('👀 Watching for new reports...');
|
|
170
|
-
});
|
|
52
|
+
// Begin accepting connections, then run mode-specific startup work.
|
|
53
|
+
server.listen(port, () => onServerListening({ port, io, testsDir, isNodeMode }));
|
|
171
54
|
}
|
|
172
55
|
|
|
173
56
|
start().catch((err) => {
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
// In-memory registry of every run currently in progress (manual, cron, REST/MCP-triggered),
|
|
7
|
+
// so a client connecting or reconnecting after a run already started — e.g. after a page
|
|
8
|
+
// refresh — can hydrate its "currently running" UI instead of only relying on the live
|
|
9
|
+
// socket events emitted at the moment a run began.
|
|
10
|
+
const activeRuns = new Map();
|
|
11
|
+
|
|
12
|
+
// Same staleness problem trigger.routes.js already solves for its own `jobs` Map
|
|
13
|
+
// (see JOB_TTL_MS/pruneOldJobs there) — a run whose completion callback never runs
|
|
14
|
+
// (an unhandled rejection, a crash mid-chain) must not stay "running" forever.
|
|
15
|
+
const RUN_TTL_MS = 60 * 60 * 1000; // 1 hour
|
|
16
|
+
|
|
17
|
+
function pruneStaleRuns() {
|
|
18
|
+
const cutoff = Date.now() - RUN_TTL_MS;
|
|
19
|
+
for (const [runId, run] of activeRuns) {
|
|
20
|
+
if (run.startedAt < cutoff) activeRuns.delete(runId);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Cron re-triggers (e.g. "Run now" while the schedule is already mid-run) register the
|
|
25
|
+
// same taskName twice concurrently — refCount keeps the entry alive until every
|
|
26
|
+
// concurrent registration for that id has unregistered, instead of the second run's
|
|
27
|
+
// completion prematurely erasing the still-running first one (or vice versa).
|
|
28
|
+
function registerRun(runId, info) {
|
|
29
|
+
pruneStaleRuns();
|
|
30
|
+
const existing = activeRuns.get(runId);
|
|
31
|
+
activeRuns.set(runId, {
|
|
32
|
+
...info,
|
|
33
|
+
startedAt: existing?.startedAt ?? Date.now(),
|
|
34
|
+
refCount: (existing?.refCount ?? 0) + 1
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Returns true once the id has no other concurrent registration left (i.e. it's actually gone). */
|
|
39
|
+
function unregisterRun(runId) {
|
|
40
|
+
const existing = activeRuns.get(runId);
|
|
41
|
+
if (!existing) return false;
|
|
42
|
+
if (existing.refCount > 1) {
|
|
43
|
+
activeRuns.set(runId, { ...existing, refCount: existing.refCount - 1 });
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
activeRuns.delete(runId);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function listActiveRuns() {
|
|
51
|
+
pruneStaleRuns();
|
|
52
|
+
return Array.from(activeRuns, ([runId, run]) => ({ runId, ...run }));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
module.exports = { registerRun, unregisterRun, listActiveRuns };
|
|
@@ -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 cron = require('node-cron');
|
|
@@ -1,21 +1,11 @@
|
|
|
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 prisma = require('./prisma');
|
|
7
|
+
const { BUILT_IN_RUNNER_ID } = require('../constants/triggers');
|
|
8
|
+
const { DEFAULT_BROWSER } = require('../constants/defaults');
|
|
19
9
|
|
|
20
10
|
// ---------------------------------------------------------------------------
|
|
21
11
|
// Export — all data except reports (reports are too large; use pg_dump instead)
|
|
@@ -118,9 +108,9 @@ const importAll = async (
|
|
|
118
108
|
cronExpression: job.cronExpression,
|
|
119
109
|
tags: job.tags,
|
|
120
110
|
workers: job.workers ?? 1,
|
|
121
|
-
browser: job.browser ??
|
|
111
|
+
browser: job.browser ?? DEFAULT_BROWSER,
|
|
122
112
|
enabled: job.enabled ?? true,
|
|
123
|
-
runnerIds: job.runnerIds ??
|
|
113
|
+
runnerIds: job.runnerIds ?? BUILT_IN_RUNNER_ID,
|
|
124
114
|
notifyDiscord: job.notifyDiscord ?? false,
|
|
125
115
|
notifySlack: job.notifySlack ?? false
|
|
126
116
|
},
|
|
@@ -128,8 +118,8 @@ const importAll = async (
|
|
|
128
118
|
cronExpression: job.cronExpression,
|
|
129
119
|
tags: job.tags,
|
|
130
120
|
workers: job.workers ?? 1,
|
|
131
|
-
browser: job.browser ??
|
|
132
|
-
runnerIds: job.runnerIds ??
|
|
121
|
+
browser: job.browser ?? DEFAULT_BROWSER,
|
|
122
|
+
runnerIds: job.runnerIds ?? BUILT_IN_RUNNER_ID,
|
|
133
123
|
notifyDiscord: job.notifyDiscord ?? false,
|
|
134
124
|
notifySlack: job.notifySlack ?? false
|
|
135
125
|
}
|
|
@@ -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 cron = require('node-cron');
|
|
@@ -25,8 +13,13 @@ const runnerService = require('./runnerService');
|
|
|
25
13
|
const reportService = require('./reportService');
|
|
26
14
|
const settingsService = require('./settingsService');
|
|
27
15
|
const notificationService = require('./notificationService');
|
|
16
|
+
const activeRunsService = require('./activeRunsService');
|
|
28
17
|
const { startSsPoller } = require('../lib/screenshotPoller');
|
|
29
|
-
const { BUILT_IN_RUNNER_ID, TRIGGER_REMOTE } = require('../constants/triggers');
|
|
18
|
+
const { BUILT_IN_RUNNER_ID, TRIGGER_REMOTE, TRIGGER_TYPE } = require('../constants/triggers');
|
|
19
|
+
const { DEFAULT_BROWSER } = require('../constants/defaults');
|
|
20
|
+
const { PLUM_MODE_NODE } = require('../constants/env');
|
|
21
|
+
const { SOCKET_EVENTS } = require('../constants/socketEvents');
|
|
22
|
+
const { JOB_STATUS } = require('../constants/jobStatus');
|
|
30
23
|
const { getTestIdsForTag, chunkTests, buildTagExpression } = require('../lib/testChunker');
|
|
31
24
|
const { readCucumberReportFile } = require('../lib/reportFilename');
|
|
32
25
|
const { runWithRetries } = require('../lib/retryRunner');
|
|
@@ -85,12 +78,12 @@ function runSingleBuiltInAttempt({ taskName, currentTag, workers, browser, suppr
|
|
|
85
78
|
PLUM_SS_DIR: ssDir
|
|
86
79
|
};
|
|
87
80
|
if (workers > 1) env.PARALLEL = String(workers);
|
|
88
|
-
if (suppressSave) env.PLUM_MODE =
|
|
81
|
+
if (suppressSave) env.PLUM_MODE = PLUM_MODE_NODE;
|
|
89
82
|
|
|
90
83
|
const task = spawn('npm', ['run', 'test'], { env, shell: true });
|
|
91
84
|
|
|
92
85
|
const ssPoller = startSsPoller(ssDir, ({ stepName, data }) => {
|
|
93
|
-
if (_io) _io.emit(
|
|
86
|
+
if (_io) _io.emit(SOCKET_EVENTS.BG_RUN_SCREENSHOT, { runId: taskName, stepName, data });
|
|
94
87
|
});
|
|
95
88
|
|
|
96
89
|
task.stdout.on('data', (d) => {
|
|
@@ -118,7 +111,7 @@ async function runSingleBuiltIn({ taskName, tags, workers, browser, notifyDiscor
|
|
|
118
111
|
const { maxRetries } = await settingsService.getProject();
|
|
119
112
|
|
|
120
113
|
const onLog = (text) => {
|
|
121
|
-
if (_io) _io.emit(
|
|
114
|
+
if (_io) _io.emit(SOCKET_EVENTS.BG_RUN_LOG, { runId: taskName, log: text });
|
|
122
115
|
};
|
|
123
116
|
|
|
124
117
|
if (maxRetries === 0) {
|
|
@@ -139,7 +132,13 @@ async function runSingleBuiltIn({ taskName, tags, workers, browser, notifyDiscor
|
|
|
139
132
|
select: { id: true, status: true, content: true }
|
|
140
133
|
})
|
|
141
134
|
.then((report) => {
|
|
142
|
-
|
|
135
|
+
activeRunsService.unregisterRun(taskName);
|
|
136
|
+
if (_io)
|
|
137
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_DONE, {
|
|
138
|
+
runId: taskName,
|
|
139
|
+
code,
|
|
140
|
+
reportId: report?.id ?? null
|
|
141
|
+
});
|
|
143
142
|
|
|
144
143
|
if (report) {
|
|
145
144
|
prisma.report
|
|
@@ -162,7 +161,8 @@ async function runSingleBuiltIn({ taskName, tags, workers, browser, notifyDiscor
|
|
|
162
161
|
})
|
|
163
162
|
.catch((e) => {
|
|
164
163
|
console.error(`[cron] Notification failed: ${e.message}`);
|
|
165
|
-
|
|
164
|
+
activeRunsService.unregisterRun(taskName);
|
|
165
|
+
if (_io) _io.emit(SOCKET_EVENTS.BG_RUN_DONE, { runId: taskName, code, reportId: null });
|
|
166
166
|
});
|
|
167
167
|
return;
|
|
168
168
|
}
|
|
@@ -199,7 +199,9 @@ async function runSingleBuiltIn({ taskName, tags, workers, browser, notifyDiscor
|
|
|
199
199
|
console.error(`[cron] Failed to save report: ${e.message}`);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
-
|
|
202
|
+
activeRunsService.unregisterRun(taskName);
|
|
203
|
+
if (_io)
|
|
204
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_DONE, { runId: taskName, code, reportId: report?.id ?? null });
|
|
203
205
|
|
|
204
206
|
if (report && (notifyDiscord || notifySlack)) {
|
|
205
207
|
notificationService
|
|
@@ -241,14 +243,15 @@ async function runDistributed({
|
|
|
241
243
|
|
|
242
244
|
if (activeRunnerIds.length === 0) {
|
|
243
245
|
console.log(`Task "${taskName}" — no tests found, skipping.`);
|
|
244
|
-
|
|
246
|
+
activeRunsService.unregisterRun(taskName);
|
|
247
|
+
if (_io) _io.emit(SOCKET_EVENTS.BG_RUN_DONE, { runId: taskName, code: 0, reportId: null });
|
|
245
248
|
return;
|
|
246
249
|
}
|
|
247
250
|
|
|
248
251
|
const laneInfos = await resolveLaneInfos(activeRunnerIds);
|
|
249
252
|
|
|
250
253
|
if (_io) {
|
|
251
|
-
_io.emit(
|
|
254
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_LANES_INIT, {
|
|
252
255
|
runId: taskName,
|
|
253
256
|
lanes: laneInfos.map((l, i) => ({ id: l.id, name: l.name, testCount: chunks[i].length }))
|
|
254
257
|
});
|
|
@@ -265,10 +268,10 @@ async function runDistributed({
|
|
|
265
268
|
laneAttempts[idx] = attempts;
|
|
266
269
|
doneCount++;
|
|
267
270
|
if (_io) {
|
|
268
|
-
_io.emit(
|
|
271
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_LANE_STATUS, {
|
|
269
272
|
runId: taskName,
|
|
270
273
|
laneId,
|
|
271
|
-
status: code === 0 ?
|
|
274
|
+
status: code === 0 ? JOB_STATUS.DONE : JOB_STATUS.ERROR
|
|
272
275
|
});
|
|
273
276
|
}
|
|
274
277
|
|
|
@@ -287,8 +290,9 @@ async function runDistributed({
|
|
|
287
290
|
attemptsByLane: laneAttempts
|
|
288
291
|
})
|
|
289
292
|
.then((saved) => {
|
|
293
|
+
activeRunsService.unregisterRun(taskName);
|
|
290
294
|
if (_io) {
|
|
291
|
-
_io.emit(
|
|
295
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_DONE, {
|
|
292
296
|
runId: taskName,
|
|
293
297
|
code: overallCode,
|
|
294
298
|
reportId: saved?.id ?? null
|
|
@@ -309,7 +313,13 @@ async function runDistributed({
|
|
|
309
313
|
})
|
|
310
314
|
.catch((e) => {
|
|
311
315
|
console.error(`[cron] Failed to save combined report: ${e.message}`);
|
|
312
|
-
|
|
316
|
+
activeRunsService.unregisterRun(taskName);
|
|
317
|
+
if (_io)
|
|
318
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_DONE, {
|
|
319
|
+
runId: taskName,
|
|
320
|
+
code: overallCode,
|
|
321
|
+
reportId: null
|
|
322
|
+
});
|
|
313
323
|
});
|
|
314
324
|
}
|
|
315
325
|
}
|
|
@@ -322,7 +332,7 @@ async function runDistributed({
|
|
|
322
332
|
if (lane.id === BUILT_IN_RUNNER_ID) {
|
|
323
333
|
const idx = i;
|
|
324
334
|
const onLog = (text) => {
|
|
325
|
-
if (_io) _io.emit(
|
|
335
|
+
if (_io) _io.emit(SOCKET_EVENTS.BG_RUN_LANE_LOG, { runId: taskName, laneId, log: text });
|
|
326
336
|
};
|
|
327
337
|
|
|
328
338
|
const spawnBuiltInLaneAttempt = (currentTag) =>
|
|
@@ -335,7 +345,7 @@ async function runDistributed({
|
|
|
335
345
|
TAG: currentTag,
|
|
336
346
|
TRIGGER: TRIGGER_REMOTE, // node-mode: file naming only, not persisted to DB
|
|
337
347
|
BROWSER: browser,
|
|
338
|
-
PLUM_MODE:
|
|
348
|
+
PLUM_MODE: PLUM_MODE_NODE,
|
|
339
349
|
PLUM_SS_DIR: ssDir
|
|
340
350
|
};
|
|
341
351
|
if (workers > 1) env.PARALLEL = String(workers);
|
|
@@ -344,7 +354,12 @@ async function runDistributed({
|
|
|
344
354
|
|
|
345
355
|
const ssPoller = startSsPoller(ssDir, ({ stepName, data }) => {
|
|
346
356
|
if (_io)
|
|
347
|
-
_io.emit(
|
|
357
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_LANE_SCREENSHOT, {
|
|
358
|
+
runId: taskName,
|
|
359
|
+
laneId,
|
|
360
|
+
stepName,
|
|
361
|
+
data
|
|
362
|
+
});
|
|
348
363
|
});
|
|
349
364
|
|
|
350
365
|
task.stdout.on('data', (d) => {
|
|
@@ -374,7 +389,7 @@ async function runDistributed({
|
|
|
374
389
|
const idx = i;
|
|
375
390
|
const onLog = (log) => {
|
|
376
391
|
process.stdout.write(log);
|
|
377
|
-
if (_io) _io.emit(
|
|
392
|
+
if (_io) _io.emit(SOCKET_EVENTS.BG_RUN_LANE_LOG, { runId: taskName, laneId, log });
|
|
378
393
|
};
|
|
379
394
|
|
|
380
395
|
const spawnRemoteLaneAttempt = (currentTag) =>
|
|
@@ -386,7 +401,12 @@ async function runDistributed({
|
|
|
386
401
|
(code, content) => resolve({ code, rawJson: content ? JSON.parse(content) : [] }),
|
|
387
402
|
({ stepName, data }) => {
|
|
388
403
|
if (_io)
|
|
389
|
-
_io.emit(
|
|
404
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_LANE_SCREENSHOT, {
|
|
405
|
+
runId: taskName,
|
|
406
|
+
laneId,
|
|
407
|
+
stepName,
|
|
408
|
+
data
|
|
409
|
+
});
|
|
390
410
|
}
|
|
391
411
|
);
|
|
392
412
|
});
|
|
@@ -418,13 +438,11 @@ async function runCronJob(job) {
|
|
|
418
438
|
} = job;
|
|
419
439
|
const runnerIds = parseRunnerIds(runnerIdsStr);
|
|
420
440
|
|
|
441
|
+
const label = taskName;
|
|
442
|
+
const meta = { tag: tags, browser, workers };
|
|
443
|
+
activeRunsService.registerRun(taskName, { kind: TRIGGER_TYPE.CRON, label, meta });
|
|
421
444
|
if (_io) {
|
|
422
|
-
_io.emit(
|
|
423
|
-
runId: taskName,
|
|
424
|
-
kind: 'cron',
|
|
425
|
-
label: taskName,
|
|
426
|
-
meta: { tag: tags, browser, workers }
|
|
427
|
-
});
|
|
445
|
+
_io.emit(SOCKET_EVENTS.BG_RUN_START, { runId: taskName, kind: TRIGGER_TYPE.CRON, label, meta });
|
|
428
446
|
}
|
|
429
447
|
console.log(`Running scheduled task: "${taskName}" → runners: ${runnerIds.join(', ')}`);
|
|
430
448
|
|
|
@@ -504,7 +522,7 @@ const addCronJob = async ({
|
|
|
504
522
|
cronExpression,
|
|
505
523
|
tags: tags ?? '',
|
|
506
524
|
workers: workers ?? 1,
|
|
507
|
-
browser: browser ??
|
|
525
|
+
browser: browser ?? DEFAULT_BROWSER,
|
|
508
526
|
runnerIds: runnerIdsStr,
|
|
509
527
|
notifyDiscord: notifyDiscord ?? false,
|
|
510
528
|
notifySlack: notifySlack ?? false,
|
|
@@ -559,7 +577,7 @@ const updateCronJob = async (
|
|
|
559
577
|
cronExpression,
|
|
560
578
|
tags,
|
|
561
579
|
workers: workers ?? 1,
|
|
562
|
-
browser: browser ??
|
|
580
|
+
browser: browser ?? DEFAULT_BROWSER,
|
|
563
581
|
runnerIds: runnerIdsStr,
|
|
564
582
|
notifyDiscord: notifyDiscord ?? false,
|
|
565
583
|
notifySlack: notifySlack ?? false,
|