plum-e2e 2.9.17 → 2.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/backend/constants/socketEvents.js +8 -14
- package/backend/lib/serverBootstrap.js +4 -4
- package/backend/mcp/server.js +3 -3
- package/backend/prisma/migrations/20260829000000_add_run_queue/migration.sql +29 -0
- package/backend/prisma/schema.prisma +30 -0
- package/backend/routes/active-runs.routes.js +10 -6
- package/backend/routes/node.routes.js +7 -0
- package/backend/routes/trigger.routes.js +8 -5
- package/backend/server.js +5 -1
- package/backend/services/cronService.js +15 -443
- package/backend/services/nodeExecutionService.js +13 -1
- package/backend/services/runExecutorService.js +423 -0
- package/backend/services/runQueueService.js +276 -0
- package/backend/services/runnerService.js +22 -4
- package/backend/services/triggerService.js +13 -231
- package/backend/websockets/socketHandler.js +32 -590
- package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +35 -35
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Be5c3USL.css +6 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.COwSGmmy.css +6 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
- package/frontend/.svelte-kit/adapter-node/chunks/BackLink.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/Badge.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/Modal.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/Toast.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/constants.js +6 -4
- package/frontend/.svelte-kit/adapter-node/chunks/format.js +3 -3
- package/frontend/.svelte-kit/adapter-node/chunks/index.js +4 -4
- package/frontend/.svelte-kit/adapter-node/chunks/internal.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/reports.js +1 -1
- package/frontend/.svelte-kit/adapter-node/chunks/reports2.js +38 -40
- package/frontend/.svelte-kit/adapter-node/chunks/repository.js +8 -0
- package/frontend/.svelte-kit/adapter-node/chunks/runner.js +10 -20
- package/frontend/.svelte-kit/adapter-node/entries/pages/live/_id_/_page.svelte.js +254 -0
- package/frontend/.svelte-kit/adapter-node/entries/pages/login/_page.svelte.js +1 -1
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +29 -24
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_page.svelte.js +23 -19
- package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +3 -3
- package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +173 -51
- package/frontend/.svelte-kit/adapter-node/entries/pages/setup/_page.svelte.js +1 -1
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +1 -1
- package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +63 -11
- package/frontend/.svelte-kit/adapter-node/manifest-full.js +10 -10
- package/frontend/.svelte-kit/adapter-node/manifest.js +10 -10
- package/frontend/.svelte-kit/adapter-node/nodes/0.js +2 -2
- package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -1
- package/frontend/.svelte-kit/adapter-node/nodes/10.js +1 -1
- package/frontend/.svelte-kit/adapter-node/nodes/11.js +1 -1
- package/frontend/.svelte-kit/adapter-node/nodes/12.js +2 -2
- package/frontend/.svelte-kit/adapter-node/nodes/2.js +1 -1
- package/frontend/.svelte-kit/adapter-node/nodes/3.js +3 -3
- package/frontend/.svelte-kit/adapter-node/nodes/4.js +3 -3
- package/frontend/.svelte-kit/adapter-node/nodes/5.js +3 -3
- package/frontend/.svelte-kit/adapter-node/nodes/6.js +3 -3
- package/frontend/.svelte-kit/adapter-node/nodes/7.js +1 -1
- package/frontend/.svelte-kit/adapter-node/nodes/8.js +2 -2
- package/frontend/.svelte-kit/adapter-node/nodes/9.js +1 -1
- package/frontend/.svelte-kit/ambient.d.ts +28 -28
- package/frontend/.svelte-kit/generated/client/app.js +4 -4
- package/frontend/.svelte-kit/generated/client/nodes/13.js +6 -0
- package/frontend/.svelte-kit/generated/client/nodes/3.js +1 -1
- package/frontend/.svelte-kit/generated/client/nodes/4.js +1 -1
- package/frontend/.svelte-kit/generated/client/nodes/5.js +1 -1
- package/frontend/.svelte-kit/generated/client/nodes/6.js +1 -1
- package/frontend/.svelte-kit/generated/client-optimized/app.js +4 -4
- package/frontend/.svelte-kit/generated/client-optimized/nodes/3.js +1 -1
- package/frontend/.svelte-kit/generated/client-optimized/nodes/4.js +1 -1
- package/frontend/.svelte-kit/generated/client-optimized/nodes/5.js +1 -1
- package/frontend/.svelte-kit/generated/client-optimized/nodes/6.js +1 -1
- package/frontend/.svelte-kit/generated/server/internal.js +1 -1
- package/frontend/.svelte-kit/output/client/.vite/manifest.json +413 -401
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.CmJTG5mP.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.B9H_IpSU.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/3.Be5c3USL.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.ClS4XkkN.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.BN5XbLUX.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.COwSGmmy.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Be5c3USL.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.COwSGmmy.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/2-KCkWZO.js +6 -0
- package/frontend/{build/client/_app/immutable/chunks/CNdcuGR0.js → .svelte-kit/output/client/_app/immutable/chunks/B00vxw57.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/B0_HKFXV.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{t-La0hgu.js → BAvTKHxT.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BJ_ypKl3.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BbYY_TzB.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Beula-TH.js +11 -0
- package/frontend/{build/client/_app/immutable/chunks/CKDtmZUQ.js → .svelte-kit/output/client/_app/immutable/chunks/C00jnSU2.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C2_rQ4aY.js +175 -0
- package/frontend/{build/client/_app/immutable/chunks/DCgHuuvs.js → .svelte-kit/output/client/_app/immutable/chunks/C7uEQ-LH.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C8S7qQjQ.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CzlPaHY9.js → CZWchtW8.js} +1 -1
- package/frontend/{build/client/_app/immutable/chunks/2zMvi6fR.js → .svelte-kit/output/client/_app/immutable/chunks/CboYYxrf.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CeH-RgMb.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CgnwuKKO.js → CegSvdD-.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CfkUW1vA.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cfmt4_tJ.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cgw8TOOy.js +6 -0
- package/frontend/{build/client/_app/immutable/chunks/C1Vid6wz.js → .svelte-kit/output/client/_app/immutable/chunks/Ck6C3Fl0.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CoTEzvLa.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DMZwI8Cj.js → DAmOMhaf.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DB3YXVFP.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{w0D4Uzlq.js → DWzEJYIF.js} +1 -1
- package/frontend/{build/client/_app/immutable/chunks/CMEtqUfQ.js → .svelte-kit/output/client/_app/immutable/chunks/DgQy0SB2.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{kkA1mrsH.js → DiVmSEJa.js} +2 -2
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Dl-F6VCo.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DuAVKaL3.js +6 -0
- package/frontend/{build/client/_app/immutable/chunks/BmZ9upwL.js → .svelte-kit/output/client/_app/immutable/chunks/GDjpV3r7.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/K1h4wprj.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DDZw0L0T.js → d2K3c8Kx.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.DRjRA71t.js +7 -0
- package/frontend/{build/client/_app/immutable/entry/start.4qxHHAcl.js → .svelte-kit/output/client/_app/immutable/entry/start.BXOLyf9R.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.CRb8Nyce.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{1.Df9sLw8b.js → 1.BI97il3r.js} +1 -1
- package/frontend/{build/client/_app/immutable/nodes/10.DEbnxfND.js → .svelte-kit/output/client/_app/immutable/nodes/10.kyazROhw.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{11.BViaDK2m.js → 11.B3vMgT2v.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.DkPcIrgW.js +6 -0
- package/frontend/{build/client/_app/immutable/nodes/2.BCPSg7H4.js → .svelte-kit/output/client/_app/immutable/nodes/2.Dr6yugXz.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.DUiL7fb5.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{3.8BFAJoHT.js → 4.DDADylfF.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.N4CeDeoD.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.DWd93Bv5.js +10 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.c8d1cQQM.js +6 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.Cvd3MauU.js +9 -0
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{9.CvfGx3Hu.js → 9.BOK0GNF_.js} +1 -1
- package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
- package/frontend/.svelte-kit/output/server/.vite/manifest.json +35 -35
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Be5c3USL.css +6 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.COwSGmmy.css +6 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
- package/frontend/.svelte-kit/output/server/chunks/BackLink.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/Badge.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/Modal.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/Toast.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/constants.js +6 -4
- package/frontend/.svelte-kit/output/server/chunks/format.js +3 -3
- package/frontend/.svelte-kit/output/server/chunks/index.js +4 -4
- package/frontend/.svelte-kit/output/server/chunks/internal.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/reports.js +1 -1
- package/frontend/.svelte-kit/output/server/chunks/reports2.js +38 -40
- package/frontend/.svelte-kit/output/server/chunks/repository.js +8 -0
- package/frontend/.svelte-kit/output/server/chunks/runner.js +10 -20
- package/frontend/.svelte-kit/output/server/entries/pages/live/_id_/_page.svelte.js +254 -0
- package/frontend/.svelte-kit/output/server/entries/pages/login/_page.svelte.js +1 -1
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +29 -24
- package/frontend/.svelte-kit/output/server/entries/pages/reports/_page.svelte.js +23 -19
- package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +3 -3
- package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +173 -51
- package/frontend/.svelte-kit/output/server/entries/pages/setup/_page.svelte.js +1 -1
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +1 -1
- package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +63 -11
- package/frontend/.svelte-kit/output/server/manifest-full.js +10 -10
- package/frontend/.svelte-kit/output/server/manifest.js +10 -10
- package/frontend/.svelte-kit/output/server/nodes/0.js +2 -2
- package/frontend/.svelte-kit/output/server/nodes/1.js +1 -1
- package/frontend/.svelte-kit/output/server/nodes/10.js +1 -1
- package/frontend/.svelte-kit/output/server/nodes/11.js +1 -1
- package/frontend/.svelte-kit/output/server/nodes/12.js +2 -2
- package/frontend/.svelte-kit/output/server/nodes/2.js +1 -1
- package/frontend/.svelte-kit/output/server/nodes/3.js +3 -3
- package/frontend/.svelte-kit/output/server/nodes/4.js +3 -3
- package/frontend/.svelte-kit/output/server/nodes/5.js +3 -3
- package/frontend/.svelte-kit/output/server/nodes/6.js +3 -3
- package/frontend/.svelte-kit/output/server/nodes/7.js +1 -1
- package/frontend/.svelte-kit/output/server/nodes/8.js +2 -2
- package/frontend/.svelte-kit/output/server/nodes/9.js +1 -1
- package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css +6 -0
- package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css +6 -0
- package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/3.Be5c3USL.css +6 -0
- package/frontend/build/client/_app/immutable/assets/3.Be5c3USL.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/3.Be5c3USL.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/5.ClS4XkkN.css +6 -0
- package/frontend/build/client/_app/immutable/assets/5.ClS4XkkN.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/5.ClS4XkkN.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css +6 -0
- package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css +6 -0
- package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.DRrgBGDC.css +6 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.DRrgBGDC.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/BackLink.DRrgBGDC.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css +6 -0
- package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css +6 -0
- package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Be5c3USL.css +6 -0
- package/frontend/build/client/_app/immutable/assets/_page.Be5c3USL.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Be5c3USL.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css +6 -0
- package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.ClS4XkkN.css +6 -0
- package/frontend/build/client/_app/immutable/assets/_page.ClS4XkkN.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.ClS4XkkN.css.gz +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css +6 -0
- package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css.br +0 -0
- package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CNdcuGR0.js → build/client/_app/immutable/chunks/B00vxw57.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/B00vxw57.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/B00vxw57.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{t-La0hgu.js → BAvTKHxT.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/BAvTKHxT.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BAvTKHxT.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Beula-TH.js +11 -0
- package/frontend/build/client/_app/immutable/chunks/Beula-TH.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Beula-TH.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CKDtmZUQ.js → build/client/_app/immutable/chunks/C00jnSU2.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/C00jnSU2.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C00jnSU2.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js +175 -0
- package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/DCgHuuvs.js → build/client/_app/immutable/chunks/C7uEQ-LH.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/C7uEQ-LH.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C7uEQ-LH.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{CzlPaHY9.js → CZWchtW8.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/CZWchtW8.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CZWchtW8.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/2zMvi6fR.js → build/client/_app/immutable/chunks/CboYYxrf.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/CboYYxrf.js.br +6 -0
- package/frontend/build/client/_app/immutable/chunks/CboYYxrf.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CeH-RgMb.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/CeH-RgMb.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CeH-RgMb.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{CgnwuKKO.js → CegSvdD-.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/CegSvdD-.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CegSvdD-.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/C1Vid6wz.js → build/client/_app/immutable/chunks/Ck6C3Fl0.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/Ck6C3Fl0.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Ck6C3Fl0.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{DMZwI8Cj.js → DAmOMhaf.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/DAmOMhaf.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DAmOMhaf.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{w0D4Uzlq.js → DWzEJYIF.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/DWzEJYIF.js.br +7 -0
- package/frontend/build/client/_app/immutable/chunks/DWzEJYIF.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CMEtqUfQ.js → build/client/_app/immutable/chunks/DgQy0SB2.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/DgQy0SB2.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DgQy0SB2.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{kkA1mrsH.js → DiVmSEJa.js} +2 -2
- package/frontend/build/client/_app/immutable/chunks/DiVmSEJa.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DiVmSEJa.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/BmZ9upwL.js → build/client/_app/immutable/chunks/GDjpV3r7.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/GDjpV3r7.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/GDjpV3r7.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js +6 -0
- package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/{DDZw0L0T.js → d2K3c8Kx.js} +1 -1
- package/frontend/build/client/_app/immutable/chunks/d2K3c8Kx.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/d2K3c8Kx.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js +7 -0
- package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/entry/start.4qxHHAcl.js → build/client/_app/immutable/entry/start.BXOLyf9R.js} +1 -1
- package/frontend/build/client/_app/immutable/entry/{start.4qxHHAcl.js.br → start.BXOLyf9R.js.br} +1 -1
- package/frontend/build/client/_app/immutable/entry/{start.4qxHHAcl.js.gz → start.BXOLyf9R.js.gz} +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{1.Df9sLw8b.js → 1.BI97il3r.js} +1 -1
- package/frontend/build/client/_app/immutable/nodes/1.BI97il3r.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.BI97il3r.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/10.DEbnxfND.js → build/client/_app/immutable/nodes/10.kyazROhw.js} +1 -1
- package/frontend/build/client/_app/immutable/nodes/10.kyazROhw.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/10.kyazROhw.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{11.BViaDK2m.js → 11.B3vMgT2v.js} +1 -1
- package/frontend/build/client/_app/immutable/nodes/11.B3vMgT2v.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.B3vMgT2v.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js.gz +0 -0
- package/frontend/{.svelte-kit/output/client/_app/immutable/nodes/2.BCPSg7H4.js → build/client/_app/immutable/nodes/2.Dr6yugXz.js} +1 -1
- package/frontend/build/client/_app/immutable/nodes/2.Dr6yugXz.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.Dr6yugXz.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{3.8BFAJoHT.js → 4.DDADylfF.js} +1 -1
- package/frontend/build/client/_app/immutable/nodes/4.DDADylfF.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.DDADylfF.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js +10 -0
- package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js +6 -0
- package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js +9 -0
- package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/{9.CvfGx3Hu.js → 9.BOK0GNF_.js} +1 -1
- package/frontend/build/client/_app/immutable/nodes/9.BOK0GNF_.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.BOK0GNF_.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/server/chunks/0-_rljpEay.js +22 -0
- package/frontend/build/server/chunks/0-_rljpEay.js.map +5 -0
- package/frontend/build/server/chunks/{1-Kxn9d30Z.js → 1-B3HpigzL.js} +3 -3
- package/frontend/build/server/chunks/{1-Kxn9d30Z.js.map → 1-B3HpigzL.js.map} +1 -1
- package/frontend/build/server/chunks/10-BQBBYpxV.js +14 -0
- package/frontend/build/server/chunks/10-BQBBYpxV.js.map +5 -0
- package/frontend/build/server/chunks/11-10xw0TIP.js +14 -0
- package/frontend/build/server/chunks/11-10xw0TIP.js.map +5 -0
- package/frontend/build/server/chunks/12-CZ3_Uw3c.js +14 -0
- package/frontend/build/server/chunks/{12-De6Ol6pu.js.map → 12-CZ3_Uw3c.js.map} +1 -1
- package/frontend/build/server/chunks/2-DioMbKbC.js +14 -0
- package/frontend/build/server/chunks/{2-Dc_rKWoK.js.map → 2-DioMbKbC.js.map} +1 -1
- package/frontend/build/server/chunks/3-CgiZg_9v.js +14 -0
- package/frontend/build/server/chunks/3-CgiZg_9v.js.map +5 -0
- package/frontend/build/server/chunks/4-BM-49dbE.js +14 -0
- package/frontend/build/server/chunks/4-BM-49dbE.js.map +5 -0
- package/frontend/build/server/chunks/5-Brx_KOzy.js +14 -0
- package/frontend/build/server/chunks/5-Brx_KOzy.js.map +5 -0
- package/frontend/build/server/chunks/6-C5swINND.js +14 -0
- package/frontend/build/server/chunks/6-C5swINND.js.map +5 -0
- package/frontend/build/server/chunks/7-B8e4y3CB.js +14 -0
- package/frontend/build/server/chunks/{7-DiQJZEF_.js.map → 7-B8e4y3CB.js.map} +1 -1
- package/frontend/build/server/chunks/8-BZtkZMIZ.js +14 -0
- package/frontend/build/server/chunks/8-BZtkZMIZ.js.map +5 -0
- package/frontend/build/server/chunks/9-BMAKiAem.js +14 -0
- package/frontend/build/server/chunks/{9-DirZG_Lu.js.map → 9-BMAKiAem.js.map} +1 -1
- package/frontend/build/server/chunks/{BackLink-BJ8NaemM.js → BackLink-CMpNTYqE.js} +2 -2
- package/frontend/build/server/chunks/BackLink-CMpNTYqE.js.map +5 -0
- package/frontend/build/server/chunks/{Badge-44ZTDx0V.js → Badge-BTWnF9pA.js} +2 -2
- package/frontend/build/server/chunks/Badge-BTWnF9pA.js.map +5 -0
- package/frontend/build/server/chunks/{ConfirmModal-C0EAXcq_.js → ConfirmModal-CtGWHl0v.js} +3 -3
- package/frontend/build/server/chunks/ConfirmModal-CtGWHl0v.js.map +5 -0
- package/frontend/build/server/chunks/{EmptyState-BA_eXaeR.js → EmptyState-Zpm9tJe1.js} +2 -2
- package/frontend/build/server/chunks/EmptyState-Zpm9tJe1.js.map +5 -0
- package/frontend/build/server/chunks/{Modal-DChG187n.js → Modal-BJJMnfIg.js} +2 -2
- package/frontend/build/server/chunks/Modal-BJJMnfIg.js.map +5 -0
- package/frontend/build/server/chunks/{Toast-v-q4ZnYq.js → Toast-CHB87F8k.js} +2 -2
- package/frontend/build/server/chunks/Toast-CHB87F8k.js.map +5 -0
- package/frontend/build/server/chunks/{_layout.svelte-CHVI3Prt.js → _layout.svelte-C_6nsIpT.js} +7 -7
- package/frontend/build/server/chunks/{_layout.svelte-CHVI3Prt.js.map → _layout.svelte-C_6nsIpT.js.map} +1 -1
- package/frontend/build/server/chunks/{_page.svelte-1jo8MapI.js → _page.svelte-BNwU9zza.js} +11 -10
- package/frontend/build/server/chunks/_page.svelte-BNwU9zza.js.map +5 -0
- package/frontend/build/server/chunks/{_page.svelte-04WxjOuH.js → _page.svelte-Bamoq11m.js} +8 -8
- package/frontend/build/server/chunks/{_page.svelte-04WxjOuH.js.map → _page.svelte-Bamoq11m.js.map} +1 -1
- package/frontend/build/server/chunks/{_page.svelte-Kg69DDaM.js → _page.svelte-BrYksycU.js} +5 -5
- package/frontend/build/server/chunks/_page.svelte-BrYksycU.js.map +5 -0
- package/frontend/build/server/chunks/{_page.svelte-BuFusRK1.js → _page.svelte-CAlhaCzS.js} +12 -12
- package/frontend/build/server/chunks/_page.svelte-CAlhaCzS.js.map +5 -0
- package/frontend/build/server/chunks/_page.svelte-CTebwzwy.js +62 -0
- package/frontend/build/server/chunks/_page.svelte-CTebwzwy.js.map +5 -0
- package/frontend/build/server/chunks/{_page.svelte-1as75nPc.js → _page.svelte-CbTrCeeX.js} +32 -28
- package/frontend/build/server/chunks/_page.svelte-CbTrCeeX.js.map +5 -0
- package/frontend/build/server/chunks/{_page.svelte-D3E6Eojd.js → _page.svelte-Cf6bI1Y2.js} +5 -5
- package/frontend/build/server/chunks/_page.svelte-Cf6bI1Y2.js.map +5 -0
- package/frontend/build/server/chunks/{_page.svelte-CWWeZuid.js → _page.svelte-CmJKt3-H.js} +71 -19
- package/frontend/build/server/chunks/_page.svelte-CmJKt3-H.js.map +5 -0
- package/frontend/build/server/chunks/{_page.svelte-CB8-QBNg.js → _page.svelte-DHZhNTPg.js} +11 -10
- package/frontend/build/server/chunks/{_page.svelte-CB8-QBNg.js.map → _page.svelte-DHZhNTPg.js.map} +1 -1
- package/frontend/build/server/chunks/_page.svelte-DObTHQe2.js +257 -0
- package/frontend/build/server/chunks/_page.svelte-DObTHQe2.js.map +5 -0
- package/frontend/build/server/chunks/{_page.svelte-8gELc_B1.js → _page.svelte-ywHy9KCh.js} +182 -59
- package/frontend/build/server/chunks/_page.svelte-ywHy9KCh.js.map +5 -0
- package/frontend/build/server/chunks/{auth-Chw-wBpI.js → auth-DDPlushv.js} +2 -2
- package/frontend/build/server/chunks/{auth-Chw-wBpI.js.map → auth-DDPlushv.js.map} +1 -1
- package/frontend/build/server/chunks/{client-DEmxR_a-.js → client-CsTiGNZy.js} +2 -2
- package/frontend/build/server/chunks/{client-DEmxR_a-.js.map → client-CsTiGNZy.js.map} +1 -1
- package/frontend/build/server/chunks/{constants-CXTaQaB6.js → constants-BYVkTZ-O.js} +3 -2
- package/frontend/build/server/chunks/constants-BYVkTZ-O.js.map +5 -0
- package/frontend/build/server/chunks/{error.svelte-BD3xNemk.js → error.svelte-BXr4lXlB.js} +3 -3
- package/frontend/build/server/chunks/{error.svelte-BD3xNemk.js.map → error.svelte-BXr4lXlB.js.map} +1 -1
- package/frontend/build/server/chunks/{format-CiNRMfHu.js → format-2pqy61MU.js} +2 -2
- package/frontend/build/server/chunks/{format-CiNRMfHu.js.map → format-2pqy61MU.js.map} +1 -1
- package/frontend/build/server/chunks/{index-server-B3M9vyh2.js → index-server-53nOZg5X.js} +2 -2
- package/frontend/build/server/chunks/{index-server-B3M9vyh2.js.map → index-server-53nOZg5X.js.map} +1 -1
- package/frontend/build/server/chunks/{index2-5R1tbrep.js → index2-DGcbugKe.js} +2 -2
- package/frontend/build/server/chunks/{index2-5R1tbrep.js.map → index2-DGcbugKe.js.map} +1 -1
- package/frontend/build/server/chunks/{reports-D_ApeeNh.js → reports-WuXG6tj3.js} +2 -2
- package/frontend/build/server/chunks/{reports-D_ApeeNh.js.map → reports-WuXG6tj3.js.map} +1 -1
- package/frontend/build/server/chunks/{reports2-BtElN_53.js → reports2-CCpI0xkQ.js} +7 -8
- package/frontend/build/server/chunks/reports2-CCpI0xkQ.js.map +5 -0
- package/frontend/build/server/chunks/{repository-FYYV_vKE.js → repository-TYWcFuWP.js} +6 -2
- package/frontend/build/server/chunks/repository-TYWcFuWP.js.map +5 -0
- package/frontend/build/server/chunks/runner-D5yCWOsy.js +27 -0
- package/frontend/build/server/chunks/runner-D5yCWOsy.js.map +5 -0
- package/frontend/build/server/chunks/{stores-BLenR3c1.js → stores-C4ZkywTG.js} +3 -3
- package/frontend/build/server/chunks/{stores-BLenR3c1.js.map → stores-C4ZkywTG.js.map} +1 -1
- package/frontend/build/server/chunks/{theme-nAx-GvX_.js → theme-C81wSe5T.js} +2 -2
- package/frontend/build/server/chunks/{theme-nAx-GvX_.js.map → theme-C81wSe5T.js.map} +1 -1
- package/frontend/build/server/index.js +2 -2
- package/frontend/build/server/index.js.map +1 -1
- package/frontend/build/server/manifest.js +23 -23
- package/frontend/build/server/manifest.js.map +1 -1
- package/frontend/src/lib/components/layout/RunnerPanel.svelte +186 -266
- package/frontend/src/lib/copy/reports.js +9 -0
- package/frontend/src/lib/copy/runners.js +9 -6
- package/frontend/src/lib/socketEvents.js +3 -15
- package/frontend/src/lib/stores/runner.js +62 -46
- package/frontend/src/routes/{reports/live → live/[id]}/+page.svelte +112 -183
- package/frontend/src/routes/scheduled-tests/+page.svelte +2 -2
- package/package.json +1 -1
- package/backend/services/activeRunsService.js +0 -55
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -6
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_layout.BuhMvMUj.css +0 -6
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.0Eln51hV.css +0 -6
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BZfe6nWe.css +0 -6
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Bj_a_5lv.css +0 -6
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BwgOqeMo.css +0 -6
- package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.CFnbmY-D.css +0 -6
- package/frontend/.svelte-kit/adapter-node/entries/pages/reports/live/_page.svelte.js +0 -247
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/0.BhSG-jZH.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Bj_a_5lv.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/4.0Eln51hV.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/5.DFV9OgAu.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.CFnbmY-D.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.BwgOqeMo.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_layout.BuhMvMUj.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.0Eln51hV.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BZfe6nWe.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Bj_a_5lv.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BwgOqeMo.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.CFnbmY-D.css +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/3InFPLvE.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAACMRH5.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BAMUGSh7.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BKuh57WU.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BUwxRmHf.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C8OURRSs.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CGeZlCaI.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CMBQQ9RZ.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CUC98kMZ.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Co3xKhEp.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CuqnZUex.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DHM6H-es.js +0 -7
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DSLBMEpr.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DbgD7JLa.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/chunks/TOCyHP97.js +0 -11
- package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.KrtMZ3my.js +0 -7
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.C8DodwXs.js +0 -11
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.BMSCSd88.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/4.D-YT_JJe.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.DVeH2eQP.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.DI7-IJhN.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.C-pKvVZy.js +0 -6
- package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.93Mb3ofT.js +0 -9
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/BackLink.CvWWuO3h.css +0 -6
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_layout.BuhMvMUj.css +0 -6
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.0Eln51hV.css +0 -6
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BZfe6nWe.css +0 -6
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Bj_a_5lv.css +0 -6
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BwgOqeMo.css +0 -6
- package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.CFnbmY-D.css +0 -6
- package/frontend/.svelte-kit/output/server/entries/pages/reports/live/_page.svelte.js +0 -247
- package/frontend/build/client/_app/immutable/assets/0.BhSG-jZH.css +0 -6
- 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/12.Bj_a_5lv.css +0 -6
- 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/4.0Eln51hV.css +0 -6
- 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 -6
- 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 -6
- 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/8.BwgOqeMo.css +0 -6
- 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/BackLink.CvWWuO3h.css +0 -6
- 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/_layout.BuhMvMUj.css +0 -6
- 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 -6
- 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.BZfe6nWe.css +0 -6
- 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 -6
- 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 -6
- 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.CFnbmY-D.css +0 -6
- 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/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/3InFPLvE.js +0 -6
- 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 -6
- 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 +0 -6
- 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 +0 -6
- 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/BUwxRmHf.js +0 -6
- 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/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.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 -6
- 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/build/client/_app/immutable/chunks/CGeZlCaI.js +0 -6
- 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.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 -6
- 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/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.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CNdcuGR0.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/CUC98kMZ.js +0 -6
- 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.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/CgnwuKKO.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/Co3xKhEp.js +0 -6
- 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 -6
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.br +0 -5
- package/frontend/build/client/_app/immutable/chunks/CuqnZUex.js.gz +0 -0
- 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.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DCgHuuvs.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DDZw0L0T.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DDZw0L0T.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DHM6H-es.js +0 -7
- 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/DMZwI8Cj.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/DMZwI8Cj.js.gz +0 -0
- package/frontend/build/client/_app/immutable/chunks/DSLBMEpr.js +0 -6
- 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/build/client/_app/immutable/chunks/DbgD7JLa.js +0 -6
- 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/TOCyHP97.js +0 -11
- 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/kkA1mrsH.js.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/kkA1mrsH.js.gz +0 -0
- 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.br +0 -0
- package/frontend/build/client/_app/immutable/chunks/w0D4Uzlq.js.gz +0 -0
- package/frontend/build/client/_app/immutable/entry/app.KrtMZ3my.js +0 -7
- package/frontend/build/client/_app/immutable/entry/app.KrtMZ3my.js.br +0 -0
- package/frontend/build/client/_app/immutable/entry/app.KrtMZ3my.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.C8DodwXs.js +0 -11
- package/frontend/build/client/_app/immutable/nodes/0.C8DodwXs.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/0.C8DodwXs.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.Df9sLw8b.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/1.Df9sLw8b.js.gz +0 -0
- 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/build/client/_app/immutable/nodes/11.BViaDK2m.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/11.BViaDK2m.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.BMSCSd88.js +0 -6
- package/frontend/build/client/_app/immutable/nodes/12.BMSCSd88.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/12.BMSCSd88.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BCPSg7H4.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/2.BCPSg7H4.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.8BFAJoHT.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/3.8BFAJoHT.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/4.D-YT_JJe.js +0 -6
- 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.DVeH2eQP.js +0 -6
- package/frontend/build/client/_app/immutable/nodes/5.DVeH2eQP.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/5.DVeH2eQP.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.DI7-IJhN.js +0 -6
- package/frontend/build/client/_app/immutable/nodes/6.DI7-IJhN.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/6.DI7-IJhN.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/7.C-pKvVZy.js +0 -6
- 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.93Mb3ofT.js +0 -9
- package/frontend/build/client/_app/immutable/nodes/8.93Mb3ofT.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/8.93Mb3ofT.js.gz +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.CvfGx3Hu.js.br +0 -0
- package/frontend/build/client/_app/immutable/nodes/9.CvfGx3Hu.js.gz +0 -0
- package/frontend/build/server/chunks/0-D5YWFygh.js +0 -22
- package/frontend/build/server/chunks/0-D5YWFygh.js.map +0 -5
- package/frontend/build/server/chunks/10-l6_ikL_D.js +0 -14
- package/frontend/build/server/chunks/10-l6_ikL_D.js.map +0 -5
- package/frontend/build/server/chunks/11-CNLerze_.js +0 -14
- package/frontend/build/server/chunks/11-CNLerze_.js.map +0 -5
- package/frontend/build/server/chunks/12-De6Ol6pu.js +0 -14
- package/frontend/build/server/chunks/2-Dc_rKWoK.js +0 -14
- package/frontend/build/server/chunks/3-DrRqVrcX.js +0 -14
- package/frontend/build/server/chunks/3-DrRqVrcX.js.map +0 -5
- package/frontend/build/server/chunks/4-Bo04DC5Z.js +0 -14
- package/frontend/build/server/chunks/4-Bo04DC5Z.js.map +0 -5
- package/frontend/build/server/chunks/5-CFeE5dPZ.js +0 -14
- package/frontend/build/server/chunks/5-CFeE5dPZ.js.map +0 -5
- package/frontend/build/server/chunks/6-DZk37MZH.js +0 -14
- package/frontend/build/server/chunks/6-DZk37MZH.js.map +0 -5
- package/frontend/build/server/chunks/7-DiQJZEF_.js +0 -14
- package/frontend/build/server/chunks/8-CKPVFOqJ.js +0 -14
- package/frontend/build/server/chunks/8-CKPVFOqJ.js.map +0 -5
- package/frontend/build/server/chunks/9-DirZG_Lu.js +0 -14
- package/frontend/build/server/chunks/BackLink-BJ8NaemM.js.map +0 -5
- package/frontend/build/server/chunks/Badge-44ZTDx0V.js.map +0 -5
- package/frontend/build/server/chunks/ConfirmModal-C0EAXcq_.js.map +0 -5
- package/frontend/build/server/chunks/EmptyState-BA_eXaeR.js.map +0 -5
- package/frontend/build/server/chunks/Modal-DChG187n.js.map +0 -5
- package/frontend/build/server/chunks/Toast-v-q4ZnYq.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-1as75nPc.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-1jo8MapI.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-8gELc_B1.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-BuFusRK1.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-CAVyp70V.js +0 -250
- package/frontend/build/server/chunks/_page.svelte-CAVyp70V.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-CWWeZuid.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-D3E6Eojd.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-Kg69DDaM.js.map +0 -5
- package/frontend/build/server/chunks/_page.svelte-L9fuiN_q.js +0 -57
- package/frontend/build/server/chunks/_page.svelte-L9fuiN_q.js.map +0 -5
- package/frontend/build/server/chunks/constants-CXTaQaB6.js.map +0 -5
- package/frontend/build/server/chunks/reports2-BtElN_53.js.map +0 -5
- package/frontend/build/server/chunks/repository-FYYV_vKE.js.map +0 -5
- package/frontend/build/server/chunks/runner-DC7hXbnY.js +0 -37
- package/frontend/build/server/chunks/runner-DC7hXbnY.js.map +0 -5
- /package/frontend/.svelte-kit/output/client/_app/immutable/assets/{3.BR3wgXcZ.css → 4.BR3wgXcZ.css} +0 -0
- /package/frontend/build/client/_app/immutable/assets/{3.BR3wgXcZ.css → 4.BR3wgXcZ.css} +0 -0
- /package/frontend/build/client/_app/immutable/assets/{3.BR3wgXcZ.css.br → 4.BR3wgXcZ.css.br} +0 -0
- /package/frontend/build/client/_app/immutable/assets/{3.BR3wgXcZ.css.gz → 4.BR3wgXcZ.css.gz} +0 -0
|
@@ -3,608 +3,50 @@
|
|
|
3
3
|
* Licensed under the MIT License. See LICENSE file in the project root for details.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
const { spawn } = require('child_process');
|
|
7
|
-
const fs = require('fs');
|
|
8
|
-
const os = require('os');
|
|
9
|
-
const path = require('path');
|
|
10
6
|
const { randomUUID } = require('crypto');
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const settingsService = require('../services/settingsService');
|
|
14
|
-
const notificationService = require('../services/notificationService');
|
|
15
|
-
const activeRunsService = require('../services/activeRunsService');
|
|
16
|
-
const { startRRwebPoller } = require('../lib/rrwebPoller');
|
|
17
|
-
const { runWithRetries } = require('../lib/retryRunner');
|
|
18
|
-
const { TRIGGER_TYPE, BUILT_IN_RUNNER_ID, TRIGGER_REMOTE } = require('../constants/triggers');
|
|
7
|
+
const runQueueService = require('../services/runQueueService');
|
|
8
|
+
const { TRIGGER_TYPE, BUILT_IN_RUNNER_ID } = require('../constants/triggers');
|
|
19
9
|
const { DEFAULT_BROWSER } = require('../constants/defaults');
|
|
20
|
-
const { PLUM_MODE_NODE } = require('../constants/env');
|
|
21
10
|
const { SOCKET_EVENTS } = require('../constants/socketEvents');
|
|
22
|
-
const { JOB_STATUS, REPORT_STATUS } = require('../constants/jobStatus');
|
|
23
|
-
const { getTestIdsForTag, chunkTests, buildTagExpression } = require('../lib/testChunker');
|
|
24
|
-
const { readCucumberReportFile } = require('../lib/reportFilename');
|
|
25
|
-
const { getTestSuites } = require('../services/testService');
|
|
26
|
-
const prisma = require('../services/prisma');
|
|
27
11
|
|
|
12
|
+
// The socket layer only relays run requests to the queue and back — every run,
|
|
13
|
+
// manual included, is a queued job streamed over the bg-run-* events. The
|
|
14
|
+
// client generates the run id so it can navigate to /live/<id> immediately.
|
|
28
15
|
const socketHandler = (io) => {
|
|
29
16
|
io.on('connection', (socket) => {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
testRunId,
|
|
44
|
-
notifyDiscord,
|
|
45
|
-
notifySlack,
|
|
46
|
-
runTitle,
|
|
47
|
-
startedBy;
|
|
48
|
-
if (typeof payload === 'string') {
|
|
49
|
-
tag = payload;
|
|
50
|
-
workers = Number(legacyWorkers) > 1 ? Number(legacyWorkers) : 1;
|
|
51
|
-
browser = DEFAULT_BROWSER;
|
|
52
|
-
runners = [BUILT_IN_RUNNER_ID];
|
|
53
|
-
testRunId = null;
|
|
54
|
-
notifyDiscord = false;
|
|
55
|
-
notifySlack = false;
|
|
56
|
-
runTitle = null;
|
|
57
|
-
startedBy = null;
|
|
58
|
-
} else {
|
|
59
|
-
tag = payload.tag ?? '';
|
|
60
|
-
workers = Number(payload.workers) > 1 ? Number(payload.workers) : 1;
|
|
61
|
-
browser = payload.browser ?? DEFAULT_BROWSER;
|
|
62
|
-
runners =
|
|
63
|
-
Array.isArray(payload.runners) && payload.runners.length > 0
|
|
64
|
-
? payload.runners
|
|
65
|
-
: [BUILT_IN_RUNNER_ID];
|
|
66
|
-
testRunId = payload.testRunId ?? null;
|
|
67
|
-
notifyDiscord = payload.notifyDiscord === true;
|
|
68
|
-
notifySlack = payload.notifySlack === true;
|
|
69
|
-
runTitle = payload.runTitle ?? null;
|
|
70
|
-
startedBy = payload.startedBy ?? null;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
const runId = randomUUID();
|
|
74
|
-
const label = runTitle || tag || 'Manual run';
|
|
75
|
-
const meta = { tag, workers, browser, startedBy };
|
|
76
|
-
activeRunsService.registerRun(runId, { kind: TRIGGER_TYPE.MANUAL, label, meta });
|
|
77
|
-
currentManualRunId = runId;
|
|
78
|
-
// Broadcast to every OTHER connected client so coworkers see this run live —
|
|
79
|
-
// the initiating tab already has full detail via its own runnerState/socket.emit
|
|
80
|
-
// events below, so it's deliberately excluded to avoid a duplicate bottom-bar entry.
|
|
81
|
-
socket.broadcast.emit(SOCKET_EVENTS.BG_RUN_START, {
|
|
82
|
-
runId,
|
|
83
|
-
kind: TRIGGER_TYPE.MANUAL,
|
|
84
|
-
label,
|
|
85
|
-
meta
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
// Drop runner ids that no longer exist (e.g. a deleted runner still
|
|
89
|
-
// referenced by a stale client selection) so they can't wedge the run.
|
|
90
|
-
const validatedRunners = [];
|
|
91
|
-
for (const id of runners) {
|
|
92
|
-
if (id === BUILT_IN_RUNNER_ID || (await runnerService.getById(id))) {
|
|
93
|
-
validatedRunners.push(id);
|
|
94
|
-
} else {
|
|
95
|
-
socket.emit(SOCKET_EVENTS.LOG, `[WARN] Runner ${id} no longer exists — skipping.\n`);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
runners = validatedRunners.length > 0 ? validatedRunners : [BUILT_IN_RUNNER_ID];
|
|
99
|
-
|
|
100
|
-
const isSingleBuiltIn = runners.length === 1 && runners[0] === BUILT_IN_RUNNER_ID;
|
|
101
|
-
|
|
102
|
-
if (isSingleBuiltIn) {
|
|
103
|
-
runBuiltIn(
|
|
104
|
-
io,
|
|
105
|
-
socket,
|
|
106
|
-
activeProcs,
|
|
107
|
-
tag,
|
|
108
|
-
workers,
|
|
109
|
-
browser,
|
|
110
|
-
testRunId,
|
|
111
|
-
notifyDiscord,
|
|
112
|
-
notifySlack,
|
|
113
|
-
runId
|
|
114
|
-
);
|
|
115
|
-
} else {
|
|
116
|
-
runDistributed(
|
|
117
|
-
io,
|
|
118
|
-
socket,
|
|
119
|
-
activeProcs,
|
|
17
|
+
socket.on(SOCKET_EVENTS.RUN_TEST, async (payload = {}) => {
|
|
18
|
+
const tag = payload.tag ?? '';
|
|
19
|
+
const runTitle = payload.runTitle ?? null;
|
|
20
|
+
const runners =
|
|
21
|
+
Array.isArray(payload.runners) && payload.runners.length > 0
|
|
22
|
+
? payload.runners
|
|
23
|
+
: [BUILT_IN_RUNNER_ID];
|
|
24
|
+
try {
|
|
25
|
+
await runQueueService.enqueue({
|
|
26
|
+
id: payload.runId || randomUUID(),
|
|
27
|
+
kind: TRIGGER_TYPE.MANUAL,
|
|
28
|
+
triggerType: TRIGGER_TYPE.MANUAL,
|
|
29
|
+
label: runTitle || tag || 'Manual run',
|
|
120
30
|
tag,
|
|
121
|
-
workers,
|
|
122
|
-
browser,
|
|
123
|
-
runners,
|
|
124
|
-
testRunId,
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
31
|
+
workers: Number(payload.workers) > 1 ? Number(payload.workers) : 1,
|
|
32
|
+
browser: payload.browser ?? DEFAULT_BROWSER,
|
|
33
|
+
runnerIds: runners,
|
|
34
|
+
testRunId: payload.testRunId ?? null,
|
|
35
|
+
runTitle,
|
|
36
|
+
startedBy: payload.startedBy ?? null,
|
|
37
|
+
notifyDiscord: payload.notifyDiscord === true,
|
|
38
|
+
notifySlack: payload.notifySlack === true
|
|
39
|
+
});
|
|
40
|
+
} catch (e) {
|
|
41
|
+
console.error('[socket] enqueue failed:', e.message);
|
|
129
42
|
}
|
|
130
43
|
});
|
|
131
44
|
|
|
132
|
-
socket.on(SOCKET_EVENTS.CANCEL_TEST, () => {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
try {
|
|
136
|
-
proc.kill('SIGTERM');
|
|
137
|
-
} catch {}
|
|
138
|
-
}
|
|
139
|
-
activeProcs.clear();
|
|
140
|
-
socket.emit(SOCKET_EVENTS.LOG, '\n[CANCELLED] Test run cancelled by user.\n');
|
|
141
|
-
socket.emit(SOCKET_EVENTS.DONE, 130);
|
|
142
|
-
if (currentManualRunId) {
|
|
143
|
-
finishManualRun(socket, currentManualRunId, 130);
|
|
144
|
-
currentManualRunId = null;
|
|
145
|
-
}
|
|
45
|
+
socket.on(SOCKET_EVENTS.CANCEL_TEST, async (payload) => {
|
|
46
|
+
const id = typeof payload === 'string' ? payload : payload?.runId;
|
|
47
|
+
if (id) await runQueueService.cancel(id).catch(() => {});
|
|
146
48
|
});
|
|
147
49
|
});
|
|
148
50
|
};
|
|
149
51
|
|
|
150
|
-
// ---------------------------------------------------------------------------
|
|
151
|
-
// Helpers
|
|
152
|
-
// ---------------------------------------------------------------------------
|
|
153
|
-
|
|
154
|
-
function finishManualRun(socket, runId, code, reportId) {
|
|
155
|
-
// unregisterRun returns false if this runId was already unregistered (e.g. a cancel
|
|
156
|
-
// already fired) — skip the broadcast so a cancelled-then-still-completing run doesn't
|
|
157
|
-
// send two conflicting bg-run-done events to every other connected client.
|
|
158
|
-
if (!activeRunsService.unregisterRun(runId)) return;
|
|
159
|
-
socket.broadcast.emit(SOCKET_EVENTS.BG_RUN_DONE, { runId, code, reportId: reportId ?? null });
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function makeSyntheticFailReport(laneName, testIds, reason) {
|
|
163
|
-
// Build id → scenario title from local feature files so names match the real report.
|
|
164
|
-
const nameMap = {};
|
|
165
|
-
try {
|
|
166
|
-
const { suites } = getTestSuites();
|
|
167
|
-
for (const suite of suites) {
|
|
168
|
-
for (const test of suite.tests) {
|
|
169
|
-
for (const id of Array.isArray(test.id) ? test.id : [test.id]) {
|
|
170
|
-
nameMap[id] = test.testCase;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
} catch {}
|
|
175
|
-
|
|
176
|
-
return JSON.stringify([
|
|
177
|
-
{
|
|
178
|
-
id: 'runner-error',
|
|
179
|
-
uri: 'runner-error',
|
|
180
|
-
name: `Runner: ${laneName}`,
|
|
181
|
-
keyword: 'Feature',
|
|
182
|
-
elements: testIds.map((id) => ({
|
|
183
|
-
id: id.replace(/^@/, '').toLowerCase(),
|
|
184
|
-
// Use real scenario title; fall back to bare ID without @
|
|
185
|
-
name: nameMap[id] || id.replace(/^@/, ''),
|
|
186
|
-
keyword: 'Scenario',
|
|
187
|
-
type: 'scenario',
|
|
188
|
-
// ids from getTestIdsForTag already carry the @ — don't add a second one
|
|
189
|
-
tags: [{ name: id.startsWith('@') ? id : `@${id}` }],
|
|
190
|
-
steps: [
|
|
191
|
-
{
|
|
192
|
-
keyword: 'Given ',
|
|
193
|
-
name: 'the scenario was assigned to this runner',
|
|
194
|
-
result: {
|
|
195
|
-
status: 'failed',
|
|
196
|
-
error_message: `Runner "${laneName}" did not complete: ${reason}`,
|
|
197
|
-
duration: 0
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
]
|
|
201
|
-
}))
|
|
202
|
-
}
|
|
203
|
-
]);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// ---------------------------------------------------------------------------
|
|
207
|
-
// Single built-in runner
|
|
208
|
-
// ---------------------------------------------------------------------------
|
|
209
|
-
|
|
210
|
-
/**
|
|
211
|
-
* Spawns one `npm run test` attempt for the built-in (local) runner and
|
|
212
|
-
* resolves once it exits. When `suppressSave` is set, PLUM_MODE=node is
|
|
213
|
-
* forced so generate-report.js skips its own DB save — used by the retry
|
|
214
|
-
* path, which persists exactly one merged report itself once every attempt
|
|
215
|
-
* is done, instead of one row per attempt.
|
|
216
|
-
*/
|
|
217
|
-
function runBuiltInAttempt({
|
|
218
|
-
activeProcs,
|
|
219
|
-
socket,
|
|
220
|
-
currentTag,
|
|
221
|
-
workers,
|
|
222
|
-
browser,
|
|
223
|
-
testRunId,
|
|
224
|
-
suppressSave,
|
|
225
|
-
onLog
|
|
226
|
-
}) {
|
|
227
|
-
return new Promise((resolve) => {
|
|
228
|
-
const ssDir = path.join(os.tmpdir(), `plum-ss-${Date.now()}`);
|
|
229
|
-
fs.mkdirSync(ssDir, { recursive: true });
|
|
230
|
-
|
|
231
|
-
const env = {
|
|
232
|
-
...process.env,
|
|
233
|
-
TAG: currentTag,
|
|
234
|
-
TRIGGER: TRIGGER_TYPE.MANUAL,
|
|
235
|
-
REPORT_RUNNERS: String(workers),
|
|
236
|
-
BROWSER: browser,
|
|
237
|
-
PLUM_SS_DIR: ssDir
|
|
238
|
-
};
|
|
239
|
-
if (workers > 1) env.PARALLEL = String(workers);
|
|
240
|
-
if (testRunId) env.TEST_RUN_ID = testRunId;
|
|
241
|
-
if (suppressSave) env.PLUM_MODE = PLUM_MODE_NODE;
|
|
242
|
-
|
|
243
|
-
const proc = spawn('npm', ['run', 'test'], { env, shell: true });
|
|
244
|
-
activeProcs.add(proc);
|
|
245
|
-
|
|
246
|
-
const ssPoller = startRRwebPoller(ssDir, (batch) => {
|
|
247
|
-
socket.emit(SOCKET_EVENTS.RUNNER_LANE_RRWEB_BATCH, { id: BUILT_IN_RUNNER_ID, ...batch });
|
|
248
|
-
});
|
|
249
|
-
|
|
250
|
-
proc.stdout.on('data', (d) => onLog(d.toString()));
|
|
251
|
-
proc.stderr.on('data', (d) => onLog(`[ERROR] ${d.toString()}`));
|
|
252
|
-
|
|
253
|
-
proc.on('close', (code) => {
|
|
254
|
-
ssPoller.stop();
|
|
255
|
-
fs.rm(ssDir, { recursive: true, force: true }, () => {});
|
|
256
|
-
activeProcs.delete(proc);
|
|
257
|
-
resolve({ code, raw: suppressSave ? readCucumberReportFile() : null });
|
|
258
|
-
});
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
async function runBuiltIn(
|
|
263
|
-
io,
|
|
264
|
-
socket,
|
|
265
|
-
activeProcs,
|
|
266
|
-
tag,
|
|
267
|
-
workers,
|
|
268
|
-
browser,
|
|
269
|
-
testRunId,
|
|
270
|
-
notifyDiscord,
|
|
271
|
-
notifySlack,
|
|
272
|
-
runId
|
|
273
|
-
) {
|
|
274
|
-
const startedAt = Date.now();
|
|
275
|
-
const { maxRetries } = await settingsService.getProject();
|
|
276
|
-
|
|
277
|
-
let logBuffer = '';
|
|
278
|
-
const onLog = (text) => {
|
|
279
|
-
logBuffer += text;
|
|
280
|
-
socket.emit(SOCKET_EVENTS.LOG, text);
|
|
281
|
-
};
|
|
282
|
-
|
|
283
|
-
if (maxRetries === 0) {
|
|
284
|
-
const { code } = await runBuiltInAttempt({
|
|
285
|
-
activeProcs,
|
|
286
|
-
socket,
|
|
287
|
-
currentTag: tag,
|
|
288
|
-
workers,
|
|
289
|
-
browser,
|
|
290
|
-
testRunId,
|
|
291
|
-
suppressSave: false,
|
|
292
|
-
onLog
|
|
293
|
-
});
|
|
294
|
-
socket.emit(SOCKET_EVENTS.LOG, `\nTest finished with code ${code}`);
|
|
295
|
-
socket.emit(SOCKET_EVENTS.DONE, code);
|
|
296
|
-
io.emit(SOCKET_EVENTS.REPORT_READY);
|
|
297
|
-
finishManualRun(socket, runId, code, null);
|
|
298
|
-
|
|
299
|
-
// Attach accumulated logs to the report generate-report.js just saved
|
|
300
|
-
try {
|
|
301
|
-
const latest = await prisma.report.findFirst({
|
|
302
|
-
where: { triggerType: TRIGGER_TYPE.MANUAL },
|
|
303
|
-
orderBy: { createdAt: 'desc' },
|
|
304
|
-
select: { id: true }
|
|
305
|
-
});
|
|
306
|
-
if (latest) {
|
|
307
|
-
await prisma.report.update({
|
|
308
|
-
where: { id: latest.id },
|
|
309
|
-
data: { logs: logBuffer || null, duration: Date.now() - startedAt }
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
} catch (e) {
|
|
313
|
-
console.error('[socket] Failed to save run logs:', e.message);
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
if (notifyDiscord || notifySlack) {
|
|
317
|
-
prisma.report
|
|
318
|
-
.findFirst({
|
|
319
|
-
where: { triggerType: TRIGGER_TYPE.MANUAL },
|
|
320
|
-
orderBy: { createdAt: 'desc' },
|
|
321
|
-
select: { id: true, status: true, content: true }
|
|
322
|
-
})
|
|
323
|
-
.then((report) => {
|
|
324
|
-
if (!report) return;
|
|
325
|
-
return notificationService.send({
|
|
326
|
-
jobName: 'Manual Run',
|
|
327
|
-
status: report.status,
|
|
328
|
-
content: report.content,
|
|
329
|
-
browser,
|
|
330
|
-
tags: tag,
|
|
331
|
-
reportId: report.id,
|
|
332
|
-
notifyDiscord,
|
|
333
|
-
notifySlack
|
|
334
|
-
});
|
|
335
|
-
})
|
|
336
|
-
.catch((e) => console.error(`[socket] Notification failed: ${e.message}`));
|
|
337
|
-
}
|
|
338
|
-
return;
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
const { code, rawJson, attempts } = await runWithRetries({
|
|
342
|
-
maxRetries,
|
|
343
|
-
spawnAttempt: async (tagOverride) => {
|
|
344
|
-
const { code, raw } = await runBuiltInAttempt({
|
|
345
|
-
activeProcs,
|
|
346
|
-
socket,
|
|
347
|
-
currentTag: tagOverride ?? tag,
|
|
348
|
-
workers,
|
|
349
|
-
browser,
|
|
350
|
-
testRunId,
|
|
351
|
-
suppressSave: true,
|
|
352
|
-
onLog
|
|
353
|
-
});
|
|
354
|
-
return { code, rawJson: raw ? JSON.parse(raw) : [] };
|
|
355
|
-
},
|
|
356
|
-
onLog
|
|
357
|
-
});
|
|
358
|
-
|
|
359
|
-
socket.emit(SOCKET_EVENTS.LOG, `\nTest finished with code ${code}`);
|
|
360
|
-
|
|
361
|
-
const report = await reportService.saveReport({
|
|
362
|
-
rawCucumberJson: rawJson,
|
|
363
|
-
tags: tag,
|
|
364
|
-
triggerType: TRIGGER_TYPE.MANUAL,
|
|
365
|
-
workerCount: workers,
|
|
366
|
-
browser,
|
|
367
|
-
testRunId: testRunId ?? null,
|
|
368
|
-
logs: logBuffer || null,
|
|
369
|
-
duration: Date.now() - startedAt,
|
|
370
|
-
attempts
|
|
371
|
-
});
|
|
372
|
-
|
|
373
|
-
socket.emit(SOCKET_EVENTS.DONE, code);
|
|
374
|
-
io.emit(SOCKET_EVENTS.REPORT_READY);
|
|
375
|
-
finishManualRun(socket, runId, code, report.id);
|
|
376
|
-
|
|
377
|
-
if (notifyDiscord || notifySlack) {
|
|
378
|
-
notificationService
|
|
379
|
-
.send({
|
|
380
|
-
jobName: 'Manual Run',
|
|
381
|
-
status: report.status,
|
|
382
|
-
content: report.content,
|
|
383
|
-
browser,
|
|
384
|
-
tags: tag,
|
|
385
|
-
reportId: report.id,
|
|
386
|
-
notifyDiscord,
|
|
387
|
-
notifySlack
|
|
388
|
-
})
|
|
389
|
-
.catch((e) => console.error(`[socket] Notification failed: ${e.message}`));
|
|
390
|
-
}
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
// ---------------------------------------------------------------------------
|
|
394
|
-
// Distributed (multi-runner) path
|
|
395
|
-
// ---------------------------------------------------------------------------
|
|
396
|
-
|
|
397
|
-
async function runDistributed(
|
|
398
|
-
io,
|
|
399
|
-
socket,
|
|
400
|
-
activeProcs,
|
|
401
|
-
tag,
|
|
402
|
-
workers,
|
|
403
|
-
browser,
|
|
404
|
-
runnerIds,
|
|
405
|
-
testRunId,
|
|
406
|
-
notifyDiscord,
|
|
407
|
-
notifySlack,
|
|
408
|
-
runId
|
|
409
|
-
) {
|
|
410
|
-
const dispatchStartedAt = Date.now();
|
|
411
|
-
const { maxRetries } = await settingsService.getProject();
|
|
412
|
-
const allIds = getTestIdsForTag(tag);
|
|
413
|
-
const chunks = chunkTests(allIds, runnerIds.length);
|
|
414
|
-
|
|
415
|
-
// Surplus runners beyond the number of non-empty chunks would fall back to
|
|
416
|
-
// running the full tag expression, producing duplicate scenarios in the report.
|
|
417
|
-
const activeRunnerIds = runnerIds.slice(0, chunks.length);
|
|
418
|
-
|
|
419
|
-
if (activeRunnerIds.length === 0) {
|
|
420
|
-
socket.emit(SOCKET_EVENTS.LOG, '\nNo tests found matching the selected tag.\n');
|
|
421
|
-
socket.emit(SOCKET_EVENTS.DONE, 0);
|
|
422
|
-
finishManualRun(socket, runId, 0, null);
|
|
423
|
-
return;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
if (activeRunnerIds.length < runnerIds.length) {
|
|
427
|
-
const skipped = runnerIds.length - activeRunnerIds.length;
|
|
428
|
-
socket.emit(
|
|
429
|
-
SOCKET_EVENTS.LOG,
|
|
430
|
-
`[INFO] ${skipped} runner(s) not used — fewer tests than runners selected.\n`
|
|
431
|
-
);
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
const laneInfos = await Promise.all(
|
|
435
|
-
activeRunnerIds.map(async (id) => {
|
|
436
|
-
if (id === BUILT_IN_RUNNER_ID) return { id, name: 'Built-in', dbId: null };
|
|
437
|
-
const r = await runnerService.getById(id);
|
|
438
|
-
return { id, name: r?.name ?? id, dbId: r?.id ?? null };
|
|
439
|
-
})
|
|
440
|
-
);
|
|
441
|
-
|
|
442
|
-
socket.emit(
|
|
443
|
-
SOCKET_EVENTS.RUNNER_LANES_INIT,
|
|
444
|
-
laneInfos.map((l, i) => ({ id: l.id, name: l.name, testCount: chunks[i].length }))
|
|
445
|
-
);
|
|
446
|
-
|
|
447
|
-
const total = activeRunnerIds.length;
|
|
448
|
-
const collectedReports = new Array(total).fill(null);
|
|
449
|
-
const laneAttempts = new Array(total).fill(null);
|
|
450
|
-
const laneLogs = {};
|
|
451
|
-
for (const l of laneInfos) laneLogs[l.id] = '';
|
|
452
|
-
let doneCount = 0;
|
|
453
|
-
let overallCode = 0;
|
|
454
|
-
|
|
455
|
-
function onLaneDone(idx, laneId, code, reportContent, attempts = null) {
|
|
456
|
-
if (code !== 0) overallCode = code;
|
|
457
|
-
collectedReports[idx] = reportContent;
|
|
458
|
-
laneAttempts[idx] = attempts;
|
|
459
|
-
socket.emit(SOCKET_EVENTS.RUNNER_LANE_STATUS, {
|
|
460
|
-
id: laneId,
|
|
461
|
-
status: code === 0 ? JOB_STATUS.DONE : JOB_STATUS.ERROR
|
|
462
|
-
});
|
|
463
|
-
doneCount++;
|
|
464
|
-
|
|
465
|
-
if (doneCount === total) {
|
|
466
|
-
socket.emit(SOCKET_EVENTS.LOG, `\nAll runners finished (exit ${overallCode})`);
|
|
467
|
-
|
|
468
|
-
reportService
|
|
469
|
-
.saveCombinedReport({
|
|
470
|
-
reports: collectedReports,
|
|
471
|
-
runners: laneInfos,
|
|
472
|
-
workers,
|
|
473
|
-
overallCode,
|
|
474
|
-
tag,
|
|
475
|
-
triggerType: TRIGGER_TYPE.MANUAL,
|
|
476
|
-
browser,
|
|
477
|
-
testRunId: testRunId ?? null,
|
|
478
|
-
laneLogs,
|
|
479
|
-
duration: Date.now() - dispatchStartedAt,
|
|
480
|
-
attemptsByLane: laneAttempts
|
|
481
|
-
})
|
|
482
|
-
.then((saved) => {
|
|
483
|
-
// Result is authoritative from the merged report, not the exit code —
|
|
484
|
-
// a node's non-test failure (e.g. a failed report fetch) must not flip
|
|
485
|
-
// a passing run to "fail" in the live UI.
|
|
486
|
-
socket.emit(SOCKET_EVENTS.DONE, {
|
|
487
|
-
code: saved.status === REPORT_STATUS.PASS ? 0 : 1,
|
|
488
|
-
reportId: saved.id
|
|
489
|
-
});
|
|
490
|
-
io.emit(SOCKET_EVENTS.REPORT_READY);
|
|
491
|
-
finishManualRun(socket, runId, saved.status === REPORT_STATUS.PASS ? 0 : 1, saved.id);
|
|
492
|
-
|
|
493
|
-
if (notifyDiscord || notifySlack) {
|
|
494
|
-
notificationService
|
|
495
|
-
.send({
|
|
496
|
-
jobName: 'Manual Run',
|
|
497
|
-
status: saved.status,
|
|
498
|
-
content: saved.content,
|
|
499
|
-
browser,
|
|
500
|
-
tags: tag,
|
|
501
|
-
reportId: saved.id,
|
|
502
|
-
notifyDiscord,
|
|
503
|
-
notifySlack
|
|
504
|
-
})
|
|
505
|
-
.catch((e) => console.error(`[socket] Notification failed: ${e.message}`));
|
|
506
|
-
}
|
|
507
|
-
})
|
|
508
|
-
.catch((e) => {
|
|
509
|
-
console.error('[runner] Failed to save combined report:', e.message);
|
|
510
|
-
socket.emit(SOCKET_EVENTS.DONE, { code: overallCode, reportId: null });
|
|
511
|
-
finishManualRun(socket, runId, overallCode, null);
|
|
512
|
-
});
|
|
513
|
-
}
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
for (let i = 0; i < activeRunnerIds.length; i++) {
|
|
517
|
-
const lane = laneInfos[i];
|
|
518
|
-
const chunkTag = buildTagExpression(chunks[i]);
|
|
519
|
-
const chunkIds = chunks[i];
|
|
520
|
-
|
|
521
|
-
if (lane.id === BUILT_IN_RUNNER_ID) {
|
|
522
|
-
const idx = i;
|
|
523
|
-
const laneId = lane.id;
|
|
524
|
-
const onLog = (text) => {
|
|
525
|
-
laneLogs[laneId] += text;
|
|
526
|
-
socket.emit(SOCKET_EVENTS.RUNNER_LANE_LOG, { id: laneId, log: text });
|
|
527
|
-
};
|
|
528
|
-
|
|
529
|
-
const spawnBuiltInLaneAttempt = (currentTag) =>
|
|
530
|
-
new Promise((resolve) => {
|
|
531
|
-
const ssDir = path.join(os.tmpdir(), `plum-ss-${Date.now()}-${idx}`);
|
|
532
|
-
fs.mkdirSync(ssDir, { recursive: true });
|
|
533
|
-
|
|
534
|
-
const env = {
|
|
535
|
-
...process.env,
|
|
536
|
-
TAG: currentTag,
|
|
537
|
-
TRIGGER: TRIGGER_REMOTE,
|
|
538
|
-
BROWSER: browser,
|
|
539
|
-
REPORT_RUNNERS: String(workers),
|
|
540
|
-
PLUM_MODE: PLUM_MODE_NODE,
|
|
541
|
-
PLUM_SS_DIR: ssDir
|
|
542
|
-
};
|
|
543
|
-
if (workers > 1) env.PARALLEL = String(workers);
|
|
544
|
-
|
|
545
|
-
const proc = spawn('npm', ['run', 'test'], { env, shell: true });
|
|
546
|
-
activeProcs.add(proc);
|
|
547
|
-
|
|
548
|
-
const ssPoller = startRRwebPoller(ssDir, (batch) => {
|
|
549
|
-
socket.emit(SOCKET_EVENTS.RUNNER_LANE_RRWEB_BATCH, { id: laneId, ...batch });
|
|
550
|
-
});
|
|
551
|
-
|
|
552
|
-
proc.stdout.on('data', (d) => onLog(d.toString()));
|
|
553
|
-
proc.stderr.on('data', (d) => onLog(`[ERROR] ${d.toString()}`));
|
|
554
|
-
|
|
555
|
-
proc.on('close', (code) => {
|
|
556
|
-
ssPoller.stop();
|
|
557
|
-
fs.rm(ssDir, { recursive: true, force: true }, () => {});
|
|
558
|
-
activeProcs.delete(proc);
|
|
559
|
-
const content =
|
|
560
|
-
readCucumberReportFile() ??
|
|
561
|
-
makeSyntheticFailReport(lane.name, chunkIds, 'process exited with error');
|
|
562
|
-
resolve({ code, rawJson: JSON.parse(content) });
|
|
563
|
-
});
|
|
564
|
-
});
|
|
565
|
-
|
|
566
|
-
runWithRetries({
|
|
567
|
-
maxRetries,
|
|
568
|
-
spawnAttempt: (t) => spawnBuiltInLaneAttempt(t ?? chunkTag),
|
|
569
|
-
onLog
|
|
570
|
-
}).then(({ code, rawJson, attempts }) =>
|
|
571
|
-
onLaneDone(idx, laneId, code, JSON.stringify(rawJson), attempts)
|
|
572
|
-
);
|
|
573
|
-
} else {
|
|
574
|
-
const idx = i;
|
|
575
|
-
const laneId = lane.id;
|
|
576
|
-
const onLog = (log) => {
|
|
577
|
-
laneLogs[laneId] += log;
|
|
578
|
-
socket.emit(SOCKET_EVENTS.RUNNER_LANE_LOG, { id: laneId, log });
|
|
579
|
-
};
|
|
580
|
-
|
|
581
|
-
const spawnRemoteLaneAttempt = (currentTag) =>
|
|
582
|
-
new Promise((resolve) => {
|
|
583
|
-
runnerService.dispatchAndPoll(
|
|
584
|
-
laneId,
|
|
585
|
-
{ tags: currentTag, browser, workers },
|
|
586
|
-
onLog,
|
|
587
|
-
(code, content) => {
|
|
588
|
-
const raw =
|
|
589
|
-
content ??
|
|
590
|
-
makeSyntheticFailReport(lane.name, chunkIds, 'could not fetch report from runner');
|
|
591
|
-
resolve({ code, rawJson: JSON.parse(raw) });
|
|
592
|
-
},
|
|
593
|
-
(batch) => {
|
|
594
|
-
socket.emit(SOCKET_EVENTS.RUNNER_LANE_RRWEB_BATCH, { id: laneId, ...batch });
|
|
595
|
-
}
|
|
596
|
-
);
|
|
597
|
-
});
|
|
598
|
-
|
|
599
|
-
runWithRetries({
|
|
600
|
-
maxRetries,
|
|
601
|
-
spawnAttempt: (t) => spawnRemoteLaneAttempt(t ?? chunkTag),
|
|
602
|
-
onLog
|
|
603
|
-
}).then(({ code, rawJson, attempts }) =>
|
|
604
|
-
onLaneDone(idx, laneId, code, JSON.stringify(rawJson), attempts)
|
|
605
|
-
);
|
|
606
|
-
}
|
|
607
|
-
}
|
|
608
|
-
}
|
|
609
|
-
|
|
610
52
|
module.exports = socketHandler;
|