plum-e2e 2.10.0 → 2.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. package/.env +1 -1
  2. package/CLAUDE.md +1 -1
  3. package/README.md +7 -7
  4. package/backend/app.js +1 -1
  5. package/backend/lib/csv.js +21 -0
  6. package/backend/lib/exportResponse.js +37 -0
  7. package/backend/lib/serverBootstrap.js +2 -2
  8. package/backend/lib/serverConfig.js +5 -3
  9. package/backend/mcp/server.js +44 -0
  10. package/backend/middleware/runnerOrAdmin.js +1 -1
  11. package/backend/package.json +1 -1
  12. package/backend/routes/reports.routes.js +19 -0
  13. package/backend/routes/runners.routes.js +1 -1
  14. package/backend/routes/test-cases.routes.js +12 -0
  15. package/backend/routes/test-runs.routes.js +17 -0
  16. package/backend/routes/test-suites.routes.js +34 -0
  17. package/backend/scripts/{manage-runners.mjs → manage-nodes.mjs} +67 -52
  18. package/backend/services/exportService.js +339 -0
  19. package/backend/services/testImportService.js +87 -0
  20. package/bin/plum.js +174 -68
  21. package/docker-compose.yml +1 -1
  22. package/frontend/.svelte-kit/adapter-node/.vite/manifest.json +48 -40
  23. package/frontend/.svelte-kit/{output/server/_app/immutable/assets/Toast.DENwYn3g.css → adapter-node/_app/immutable/assets/Button.C1zsJAUG.css} +1 -1
  24. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/ExportMenu.DsJQ1Qua.css +6 -0
  25. package/frontend/{build/client/_app/immutable/assets/_layout.HkPnpRl9.css → .svelte-kit/adapter-node/_app/immutable/assets/_layout.B4TT3qNx.css} +1 -1
  26. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.4bPj83tb.css +6 -0
  27. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.BwgtEi_a.css +6 -0
  28. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.DOC8fPSI.css +6 -0
  29. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Dm1nSEgE.css +6 -0
  30. package/frontend/.svelte-kit/adapter-node/chunks/{Toast.js → Button.js} +2 -17
  31. package/frontend/.svelte-kit/adapter-node/chunks/ConfirmModal.js +1 -1
  32. package/frontend/.svelte-kit/adapter-node/chunks/EmptyState.js +1 -1
  33. package/frontend/.svelte-kit/adapter-node/chunks/common.js +11 -4
  34. package/frontend/.svelte-kit/adapter-node/chunks/constants.js +1 -1
  35. package/frontend/.svelte-kit/adapter-node/chunks/internal.js +1 -1
  36. package/frontend/.svelte-kit/adapter-node/chunks/repository.js +21 -17
  37. package/frontend/.svelte-kit/adapter-node/entries/pages/_layout.svelte.js +2 -0
  38. package/frontend/.svelte-kit/adapter-node/entries/pages/reports/_id_/_page.svelte.js +11 -2
  39. package/frontend/.svelte-kit/adapter-node/entries/pages/scheduled-tests/_page.svelte.js +2 -5
  40. package/frontend/.svelte-kit/adapter-node/entries/pages/settings/_page.svelte.js +300 -253
  41. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/_page.svelte.js +55 -36
  42. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -6
  43. package/frontend/.svelte-kit/adapter-node/entries/pages/test-repository/suites/_id_/_page.svelte.js +15 -17
  44. package/frontend/.svelte-kit/adapter-node/manifest-full.js +1 -1
  45. package/frontend/.svelte-kit/adapter-node/manifest.js +1 -1
  46. package/frontend/.svelte-kit/adapter-node/nodes/0.js +2 -2
  47. package/frontend/.svelte-kit/adapter-node/nodes/1.js +1 -1
  48. package/frontend/.svelte-kit/adapter-node/nodes/10.js +2 -2
  49. package/frontend/.svelte-kit/adapter-node/nodes/11.js +2 -2
  50. package/frontend/.svelte-kit/adapter-node/nodes/12.js +2 -2
  51. package/frontend/.svelte-kit/adapter-node/nodes/2.js +1 -1
  52. package/frontend/.svelte-kit/adapter-node/nodes/3.js +1 -1
  53. package/frontend/.svelte-kit/adapter-node/nodes/4.js +1 -1
  54. package/frontend/.svelte-kit/adapter-node/nodes/5.js +1 -1
  55. package/frontend/.svelte-kit/adapter-node/nodes/6.js +2 -2
  56. package/frontend/.svelte-kit/adapter-node/nodes/7.js +2 -2
  57. package/frontend/.svelte-kit/adapter-node/nodes/8.js +2 -2
  58. package/frontend/.svelte-kit/adapter-node/nodes/9.js +1 -1
  59. package/frontend/.svelte-kit/generated/server/internal.js +1 -1
  60. package/frontend/.svelte-kit/output/client/.vite/manifest.json +459 -412
  61. package/frontend/.svelte-kit/output/client/_app/immutable/assets/{0.CmJTG5mP.css → 0.BEqlRAtD.css} +1 -1
  62. package/frontend/.svelte-kit/output/client/_app/immutable/assets/10.DC0wD6w_.css +6 -0
  63. package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.Dm1nSEgE.css +6 -0
  64. package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.DdQVxyZK.css +6 -0
  65. package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.DOC8fPSI.css +6 -0
  66. package/frontend/.svelte-kit/{adapter-node/_app/immutable/assets/Toast.DENwYn3g.css → output/client/_app/immutable/assets/Button.C1zsJAUG.css} +1 -1
  67. package/frontend/.svelte-kit/output/client/_app/immutable/assets/ExportMenu.DsJQ1Qua.css +6 -0
  68. package/frontend/.svelte-kit/output/client/_app/immutable/assets/{_layout.HkPnpRl9.css → _layout.B4TT3qNx.css} +1 -1
  69. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.4bPj83tb.css +6 -0
  70. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.BwgtEi_a.css +6 -0
  71. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.DOC8fPSI.css +6 -0
  72. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Dm1nSEgE.css +6 -0
  73. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{C2_rQ4aY.js → 3MBVX4Yb.js} +1 -1
  74. package/frontend/{build/client/_app/immutable/chunks/CfkUW1vA.js → .svelte-kit/output/client/_app/immutable/chunks/6VDMVB5U.js} +1 -1
  75. package/frontend/{build/client/_app/immutable/chunks/B0_HKFXV.js → .svelte-kit/output/client/_app/immutable/chunks/B2lVGNml.js} +1 -1
  76. package/frontend/{build/client/_app/immutable/chunks/CboYYxrf.js → .svelte-kit/output/client/_app/immutable/chunks/BCh31ecr.js} +1 -1
  77. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BDb8hZHu.js +6 -0
  78. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CeH-RgMb.js → BIf7lHIm.js} +1 -1
  79. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BIjh3jiU.js +8 -0
  80. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BTV7EXZb.js +11 -0
  81. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DAmOMhaf.js → BWGoOYU0.js} +1 -1
  82. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BdBJfKUi.js +6 -0
  83. package/frontend/{build/client/_app/immutable/chunks/BAvTKHxT.js → .svelte-kit/output/client/_app/immutable/chunks/BnXsGCy3.js} +1 -1
  84. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BtTNggoY.js +8 -0
  85. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/C4Z3p6jE.js +6 -0
  86. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CNpD-yNH.js +6 -0
  87. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CUPWZLIN.js +6 -0
  88. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{Ck6C3Fl0.js → CXQhSK1T.js} +1 -1
  89. package/frontend/{build/client/_app/immutable/chunks/C00jnSU2.js → .svelte-kit/output/client/_app/immutable/chunks/CtgCYzu5.js} +1 -1
  90. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/D72giPTu.js +6 -0
  91. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{GDjpV3r7.js → DDx3no2z.js} +1 -1
  92. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/D_thT6pZ.js +6 -0
  93. package/frontend/{build/client/_app/immutable/chunks/C8S7qQjQ.js → .svelte-kit/output/client/_app/immutable/chunks/DeiVAbyn.js} +1 -1
  94. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DiexacSB.js +6 -0
  95. package/frontend/{build/client/_app/immutable/chunks/d2K3c8Kx.js → .svelte-kit/output/client/_app/immutable/chunks/Dlymnwnf.js} +1 -1
  96. package/frontend/{build/client/_app/immutable/chunks/Cgw8TOOy.js → .svelte-kit/output/client/_app/immutable/chunks/gCgJ3Cwu.js} +1 -1
  97. package/frontend/{build/client/_app/immutable/chunks/BJ_ypKl3.js → .svelte-kit/output/client/_app/immutable/chunks/htkwR9b-.js} +1 -1
  98. package/frontend/{build/client/_app/immutable/chunks/C7uEQ-LH.js → .svelte-kit/output/client/_app/immutable/chunks/iL4SCrvY.js} +1 -1
  99. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{CoTEzvLa.js → kFFd6Oo5.js} +1 -1
  100. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/pNZogwkM.js +6 -0
  101. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{DWzEJYIF.js → prk8PJfA.js} +1 -1
  102. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/qvxlSGpD.js +6 -0
  103. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/r_d1Iu0W.js +6 -0
  104. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/{B00vxw57.js → tsOANt55.js} +1 -1
  105. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/zXSLr47H.js +6 -0
  106. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.DgdSwPuN.js +7 -0
  107. package/frontend/{build/client/_app/immutable/entry/start.BXOLyf9R.js → .svelte-kit/output/client/_app/immutable/entry/start.D_lhI48n.js} +1 -1
  108. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.D2F-i1I5.js +6 -0
  109. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{1.BI97il3r.js → 1.JIF2GfHq.js} +1 -1
  110. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/10.A0AHLfOt.js +6 -0
  111. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/11.CVSPxlqY.js +6 -0
  112. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.CnAR0AQb.js +6 -0
  113. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{2.Dr6yugXz.js → 2.Bno00fr8.js} +1 -1
  114. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.B6KwaCsM.js +6 -0
  115. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{4.DDADylfF.js → 4.BX70m3v6.js} +1 -1
  116. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.UIFh06yr.js +6 -0
  117. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.DZ1OV24V.js +10 -0
  118. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.B_XntBZ1.js +6 -0
  119. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.CVHgJw-E.js +9 -0
  120. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/{9.BOK0GNF_.js → 9.DDDQPmMj.js} +1 -1
  121. package/frontend/.svelte-kit/output/client/_app/version.json +1 -1
  122. package/frontend/.svelte-kit/output/server/.vite/manifest.json +48 -40
  123. package/frontend/{build/client/_app/immutable/assets/Toast.DENwYn3g.css → .svelte-kit/output/server/_app/immutable/assets/Button.C1zsJAUG.css} +1 -1
  124. package/frontend/.svelte-kit/output/server/_app/immutable/assets/ExportMenu.DsJQ1Qua.css +6 -0
  125. package/frontend/.svelte-kit/{adapter-node/_app/immutable/assets/_layout.HkPnpRl9.css → output/server/_app/immutable/assets/_layout.B4TT3qNx.css} +1 -1
  126. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.4bPj83tb.css +6 -0
  127. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.BwgtEi_a.css +6 -0
  128. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.DOC8fPSI.css +6 -0
  129. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Dm1nSEgE.css +6 -0
  130. package/frontend/.svelte-kit/output/server/chunks/{Toast.js → Button.js} +2 -17
  131. package/frontend/.svelte-kit/output/server/chunks/ConfirmModal.js +1 -1
  132. package/frontend/.svelte-kit/output/server/chunks/EmptyState.js +1 -1
  133. package/frontend/.svelte-kit/output/server/chunks/common.js +11 -4
  134. package/frontend/.svelte-kit/output/server/chunks/constants.js +1 -1
  135. package/frontend/.svelte-kit/output/server/chunks/internal.js +1 -1
  136. package/frontend/.svelte-kit/output/server/chunks/repository.js +21 -17
  137. package/frontend/.svelte-kit/output/server/entries/pages/_layout.svelte.js +2 -0
  138. package/frontend/.svelte-kit/output/server/entries/pages/reports/_id_/_page.svelte.js +11 -2
  139. package/frontend/.svelte-kit/output/server/entries/pages/scheduled-tests/_page.svelte.js +2 -5
  140. package/frontend/.svelte-kit/output/server/entries/pages/settings/_page.svelte.js +300 -253
  141. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/_page.svelte.js +55 -36
  142. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/runs/_id_/_page.svelte.js +3 -6
  143. package/frontend/.svelte-kit/output/server/entries/pages/test-repository/suites/_id_/_page.svelte.js +15 -17
  144. package/frontend/.svelte-kit/output/server/manifest-full.js +1 -1
  145. package/frontend/.svelte-kit/output/server/manifest.js +1 -1
  146. package/frontend/.svelte-kit/output/server/nodes/0.js +2 -2
  147. package/frontend/.svelte-kit/output/server/nodes/1.js +1 -1
  148. package/frontend/.svelte-kit/output/server/nodes/10.js +2 -2
  149. package/frontend/.svelte-kit/output/server/nodes/11.js +2 -2
  150. package/frontend/.svelte-kit/output/server/nodes/12.js +2 -2
  151. package/frontend/.svelte-kit/output/server/nodes/2.js +1 -1
  152. package/frontend/.svelte-kit/output/server/nodes/3.js +1 -1
  153. package/frontend/.svelte-kit/output/server/nodes/4.js +1 -1
  154. package/frontend/.svelte-kit/output/server/nodes/5.js +1 -1
  155. package/frontend/.svelte-kit/output/server/nodes/6.js +2 -2
  156. package/frontend/.svelte-kit/output/server/nodes/7.js +2 -2
  157. package/frontend/.svelte-kit/output/server/nodes/8.js +2 -2
  158. package/frontend/.svelte-kit/output/server/nodes/9.js +1 -1
  159. package/frontend/build/client/_app/immutable/assets/{0.CmJTG5mP.css → 0.BEqlRAtD.css} +1 -1
  160. package/frontend/build/client/_app/immutable/assets/0.BEqlRAtD.css.br +0 -0
  161. package/frontend/build/client/_app/immutable/assets/0.BEqlRAtD.css.gz +0 -0
  162. package/frontend/build/client/_app/immutable/assets/10.DC0wD6w_.css +6 -0
  163. package/frontend/build/client/_app/immutable/assets/10.DC0wD6w_.css.br +0 -0
  164. package/frontend/build/client/_app/immutable/assets/10.DC0wD6w_.css.gz +0 -0
  165. package/frontend/build/client/_app/immutable/assets/12.Dm1nSEgE.css +6 -0
  166. package/frontend/build/client/_app/immutable/assets/12.Dm1nSEgE.css.br +0 -0
  167. package/frontend/build/client/_app/immutable/assets/12.Dm1nSEgE.css.gz +0 -0
  168. package/frontend/build/client/_app/immutable/assets/6.DdQVxyZK.css +6 -0
  169. package/frontend/build/client/_app/immutable/assets/6.DdQVxyZK.css.br +0 -0
  170. package/frontend/build/client/_app/immutable/assets/6.DdQVxyZK.css.gz +0 -0
  171. package/frontend/build/client/_app/immutable/assets/8.DOC8fPSI.css +6 -0
  172. package/frontend/build/client/_app/immutable/assets/8.DOC8fPSI.css.br +0 -0
  173. package/frontend/build/client/_app/immutable/assets/8.DOC8fPSI.css.gz +0 -0
  174. package/frontend/{.svelte-kit/output/client/_app/immutable/assets/Toast.DENwYn3g.css → build/client/_app/immutable/assets/Button.C1zsJAUG.css} +1 -1
  175. package/frontend/build/client/_app/immutable/assets/Button.C1zsJAUG.css.br +0 -0
  176. package/frontend/build/client/_app/immutable/assets/Button.C1zsJAUG.css.gz +0 -0
  177. package/frontend/build/client/_app/immutable/assets/ExportMenu.DsJQ1Qua.css +6 -0
  178. package/frontend/build/client/_app/immutable/assets/ExportMenu.DsJQ1Qua.css.br +0 -0
  179. package/frontend/build/client/_app/immutable/assets/ExportMenu.DsJQ1Qua.css.gz +0 -0
  180. package/frontend/{.svelte-kit/output/server/_app/immutable/assets/_layout.HkPnpRl9.css → build/client/_app/immutable/assets/_layout.B4TT3qNx.css} +1 -1
  181. package/frontend/build/client/_app/immutable/assets/_layout.B4TT3qNx.css.br +0 -0
  182. package/frontend/build/client/_app/immutable/assets/_layout.B4TT3qNx.css.gz +0 -0
  183. package/frontend/build/client/_app/immutable/assets/_page.4bPj83tb.css +6 -0
  184. package/frontend/build/client/_app/immutable/assets/_page.4bPj83tb.css.br +0 -0
  185. package/frontend/build/client/_app/immutable/assets/_page.4bPj83tb.css.gz +0 -0
  186. package/frontend/build/client/_app/immutable/assets/_page.BwgtEi_a.css +6 -0
  187. package/frontend/build/client/_app/immutable/assets/_page.BwgtEi_a.css.br +0 -0
  188. package/frontend/build/client/_app/immutable/assets/_page.BwgtEi_a.css.gz +0 -0
  189. package/frontend/build/client/_app/immutable/assets/_page.DOC8fPSI.css +6 -0
  190. package/frontend/build/client/_app/immutable/assets/_page.DOC8fPSI.css.br +0 -0
  191. package/frontend/build/client/_app/immutable/assets/_page.DOC8fPSI.css.gz +0 -0
  192. package/frontend/build/client/_app/immutable/assets/_page.Dm1nSEgE.css +6 -0
  193. package/frontend/build/client/_app/immutable/assets/_page.Dm1nSEgE.css.br +0 -0
  194. package/frontend/build/client/_app/immutable/assets/_page.Dm1nSEgE.css.gz +0 -0
  195. package/frontend/build/client/_app/immutable/chunks/{C2_rQ4aY.js → 3MBVX4Yb.js} +1 -1
  196. package/frontend/build/client/_app/immutable/chunks/3MBVX4Yb.js.br +0 -0
  197. package/frontend/build/client/_app/immutable/chunks/3MBVX4Yb.js.gz +0 -0
  198. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CfkUW1vA.js → build/client/_app/immutable/chunks/6VDMVB5U.js} +1 -1
  199. package/frontend/build/client/_app/immutable/chunks/6VDMVB5U.js.br +0 -0
  200. package/frontend/build/client/_app/immutable/chunks/6VDMVB5U.js.gz +0 -0
  201. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/B0_HKFXV.js → build/client/_app/immutable/chunks/B2lVGNml.js} +1 -1
  202. package/frontend/build/client/_app/immutable/chunks/B2lVGNml.js.br +0 -0
  203. package/frontend/build/client/_app/immutable/chunks/B2lVGNml.js.gz +0 -0
  204. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/CboYYxrf.js → build/client/_app/immutable/chunks/BCh31ecr.js} +1 -1
  205. package/frontend/build/client/_app/immutable/chunks/BCh31ecr.js.br +6 -0
  206. package/frontend/build/client/_app/immutable/chunks/BCh31ecr.js.gz +0 -0
  207. package/frontend/build/client/_app/immutable/chunks/BDb8hZHu.js +6 -0
  208. package/frontend/build/client/_app/immutable/chunks/BDb8hZHu.js.br +0 -0
  209. package/frontend/build/client/_app/immutable/chunks/BDb8hZHu.js.gz +0 -0
  210. package/frontend/build/client/_app/immutable/chunks/{CeH-RgMb.js → BIf7lHIm.js} +1 -1
  211. package/frontend/build/client/_app/immutable/chunks/BIf7lHIm.js.br +0 -0
  212. package/frontend/build/client/_app/immutable/chunks/{CeH-RgMb.js.gz → BIf7lHIm.js.gz} +0 -0
  213. package/frontend/build/client/_app/immutable/chunks/BIjh3jiU.js +8 -0
  214. package/frontend/build/client/_app/immutable/chunks/BIjh3jiU.js.br +0 -0
  215. package/frontend/build/client/_app/immutable/chunks/BIjh3jiU.js.gz +0 -0
  216. package/frontend/build/client/_app/immutable/chunks/BTV7EXZb.js +11 -0
  217. package/frontend/build/client/_app/immutable/chunks/BTV7EXZb.js.br +0 -0
  218. package/frontend/build/client/_app/immutable/chunks/BTV7EXZb.js.gz +0 -0
  219. package/frontend/build/client/_app/immutable/chunks/{DAmOMhaf.js → BWGoOYU0.js} +1 -1
  220. package/frontend/build/client/_app/immutable/chunks/BWGoOYU0.js.br +0 -0
  221. package/frontend/build/client/_app/immutable/chunks/BWGoOYU0.js.gz +0 -0
  222. package/frontend/build/client/_app/immutable/chunks/BdBJfKUi.js +6 -0
  223. package/frontend/build/client/_app/immutable/chunks/BdBJfKUi.js.br +0 -0
  224. package/frontend/build/client/_app/immutable/chunks/BdBJfKUi.js.gz +0 -0
  225. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/BAvTKHxT.js → build/client/_app/immutable/chunks/BnXsGCy3.js} +1 -1
  226. package/frontend/build/client/_app/immutable/chunks/BnXsGCy3.js.br +0 -0
  227. package/frontend/build/client/_app/immutable/chunks/BnXsGCy3.js.gz +0 -0
  228. package/frontend/build/client/_app/immutable/chunks/BtTNggoY.js +8 -0
  229. package/frontend/build/client/_app/immutable/chunks/BtTNggoY.js.br +0 -0
  230. package/frontend/build/client/_app/immutable/chunks/BtTNggoY.js.gz +0 -0
  231. package/frontend/build/client/_app/immutable/chunks/C4Z3p6jE.js +6 -0
  232. package/frontend/build/client/_app/immutable/chunks/C4Z3p6jE.js.br +0 -0
  233. package/frontend/build/client/_app/immutable/chunks/C4Z3p6jE.js.gz +0 -0
  234. package/frontend/build/client/_app/immutable/chunks/CNpD-yNH.js +6 -0
  235. package/frontend/build/client/_app/immutable/chunks/CNpD-yNH.js.br +0 -0
  236. package/frontend/build/client/_app/immutable/chunks/CNpD-yNH.js.gz +0 -0
  237. package/frontend/build/client/_app/immutable/chunks/CUPWZLIN.js +6 -0
  238. package/frontend/build/client/_app/immutable/chunks/CUPWZLIN.js.br +0 -0
  239. package/frontend/build/client/_app/immutable/chunks/CUPWZLIN.js.gz +0 -0
  240. package/frontend/build/client/_app/immutable/chunks/{Ck6C3Fl0.js → CXQhSK1T.js} +1 -1
  241. package/frontend/build/client/_app/immutable/chunks/CXQhSK1T.js.br +0 -0
  242. package/frontend/build/client/_app/immutable/chunks/CXQhSK1T.js.gz +0 -0
  243. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/C00jnSU2.js → build/client/_app/immutable/chunks/CtgCYzu5.js} +1 -1
  244. package/frontend/build/client/_app/immutable/chunks/CtgCYzu5.js.br +0 -0
  245. package/frontend/build/client/_app/immutable/chunks/CtgCYzu5.js.gz +0 -0
  246. package/frontend/build/client/_app/immutable/chunks/D72giPTu.js +6 -0
  247. package/frontend/build/client/_app/immutable/chunks/D72giPTu.js.br +0 -0
  248. package/frontend/build/client/_app/immutable/chunks/D72giPTu.js.gz +0 -0
  249. package/frontend/build/client/_app/immutable/chunks/{GDjpV3r7.js → DDx3no2z.js} +1 -1
  250. package/frontend/build/client/_app/immutable/chunks/DDx3no2z.js.br +0 -0
  251. package/frontend/build/client/_app/immutable/chunks/DDx3no2z.js.gz +0 -0
  252. package/frontend/build/client/_app/immutable/chunks/D_thT6pZ.js +6 -0
  253. package/frontend/build/client/_app/immutable/chunks/D_thT6pZ.js.br +0 -0
  254. package/frontend/build/client/_app/immutable/chunks/D_thT6pZ.js.gz +0 -0
  255. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/C8S7qQjQ.js → build/client/_app/immutable/chunks/DeiVAbyn.js} +1 -1
  256. package/frontend/build/client/_app/immutable/chunks/DeiVAbyn.js.br +6 -0
  257. package/frontend/build/client/_app/immutable/chunks/DeiVAbyn.js.gz +0 -0
  258. package/frontend/build/client/_app/immutable/chunks/DiexacSB.js +6 -0
  259. package/frontend/build/client/_app/immutable/chunks/DiexacSB.js.br +0 -0
  260. package/frontend/build/client/_app/immutable/chunks/DiexacSB.js.gz +0 -0
  261. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/d2K3c8Kx.js → build/client/_app/immutable/chunks/Dlymnwnf.js} +1 -1
  262. package/frontend/build/client/_app/immutable/chunks/Dlymnwnf.js.br +0 -0
  263. package/frontend/build/client/_app/immutable/chunks/Dlymnwnf.js.gz +0 -0
  264. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/Cgw8TOOy.js → build/client/_app/immutable/chunks/gCgJ3Cwu.js} +1 -1
  265. package/frontend/build/client/_app/immutable/chunks/gCgJ3Cwu.js.br +0 -0
  266. package/frontend/build/client/_app/immutable/chunks/gCgJ3Cwu.js.gz +0 -0
  267. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/BJ_ypKl3.js → build/client/_app/immutable/chunks/htkwR9b-.js} +1 -1
  268. package/frontend/build/client/_app/immutable/chunks/htkwR9b-.js.br +0 -0
  269. package/frontend/build/client/_app/immutable/chunks/htkwR9b-.js.gz +0 -0
  270. package/frontend/{.svelte-kit/output/client/_app/immutable/chunks/C7uEQ-LH.js → build/client/_app/immutable/chunks/iL4SCrvY.js} +1 -1
  271. package/frontend/build/client/_app/immutable/chunks/iL4SCrvY.js.br +0 -0
  272. package/frontend/build/client/_app/immutable/chunks/iL4SCrvY.js.gz +0 -0
  273. package/frontend/build/client/_app/immutable/chunks/{CoTEzvLa.js → kFFd6Oo5.js} +1 -1
  274. package/frontend/build/client/_app/immutable/chunks/kFFd6Oo5.js.br +0 -0
  275. package/frontend/build/client/_app/immutable/chunks/kFFd6Oo5.js.gz +0 -0
  276. package/frontend/build/client/_app/immutable/chunks/pNZogwkM.js +6 -0
  277. package/frontend/build/client/_app/immutable/chunks/pNZogwkM.js.br +0 -0
  278. package/frontend/build/client/_app/immutable/chunks/pNZogwkM.js.gz +0 -0
  279. package/frontend/build/client/_app/immutable/chunks/{DWzEJYIF.js → prk8PJfA.js} +1 -1
  280. package/frontend/build/client/_app/immutable/chunks/prk8PJfA.js.br +0 -0
  281. package/frontend/build/client/_app/immutable/chunks/prk8PJfA.js.gz +0 -0
  282. package/frontend/build/client/_app/immutable/chunks/qvxlSGpD.js +6 -0
  283. package/frontend/build/client/_app/immutable/chunks/qvxlSGpD.js.br +0 -0
  284. package/frontend/build/client/_app/immutable/chunks/qvxlSGpD.js.gz +0 -0
  285. package/frontend/build/client/_app/immutable/chunks/r_d1Iu0W.js +6 -0
  286. package/frontend/build/client/_app/immutable/chunks/r_d1Iu0W.js.br +0 -0
  287. package/frontend/build/client/_app/immutable/chunks/r_d1Iu0W.js.gz +0 -0
  288. package/frontend/build/client/_app/immutable/chunks/{B00vxw57.js → tsOANt55.js} +1 -1
  289. package/frontend/build/client/_app/immutable/chunks/tsOANt55.js.br +0 -0
  290. package/frontend/build/client/_app/immutable/chunks/tsOANt55.js.gz +0 -0
  291. package/frontend/build/client/_app/immutable/chunks/zXSLr47H.js +6 -0
  292. package/frontend/build/client/_app/immutable/chunks/zXSLr47H.js.br +0 -0
  293. package/frontend/build/client/_app/immutable/chunks/zXSLr47H.js.gz +0 -0
  294. package/frontend/build/client/_app/immutable/entry/app.DgdSwPuN.js +7 -0
  295. package/frontend/build/client/_app/immutable/entry/app.DgdSwPuN.js.br +0 -0
  296. package/frontend/build/client/_app/immutable/entry/app.DgdSwPuN.js.gz +0 -0
  297. package/frontend/{.svelte-kit/output/client/_app/immutable/entry/start.BXOLyf9R.js → build/client/_app/immutable/entry/start.D_lhI48n.js} +1 -1
  298. package/frontend/build/client/_app/immutable/entry/{start.BXOLyf9R.js.br → start.D_lhI48n.js.br} +1 -1
  299. package/frontend/build/client/_app/immutable/entry/{start.BXOLyf9R.js.gz → start.D_lhI48n.js.gz} +0 -0
  300. package/frontend/build/client/_app/immutable/nodes/0.D2F-i1I5.js +6 -0
  301. package/frontend/build/client/_app/immutable/nodes/0.D2F-i1I5.js.br +0 -0
  302. package/frontend/build/client/_app/immutable/nodes/0.D2F-i1I5.js.gz +0 -0
  303. package/frontend/build/client/_app/immutable/nodes/{1.BI97il3r.js → 1.JIF2GfHq.js} +1 -1
  304. package/frontend/build/client/_app/immutable/nodes/1.JIF2GfHq.js.br +5 -0
  305. package/frontend/build/client/_app/immutable/nodes/1.JIF2GfHq.js.gz +0 -0
  306. package/frontend/build/client/_app/immutable/nodes/10.A0AHLfOt.js +6 -0
  307. package/frontend/build/client/_app/immutable/nodes/10.A0AHLfOt.js.br +0 -0
  308. package/frontend/build/client/_app/immutable/nodes/10.A0AHLfOt.js.gz +0 -0
  309. package/frontend/build/client/_app/immutable/nodes/11.CVSPxlqY.js +6 -0
  310. package/frontend/build/client/_app/immutable/nodes/11.CVSPxlqY.js.br +0 -0
  311. package/frontend/build/client/_app/immutable/nodes/11.CVSPxlqY.js.gz +0 -0
  312. package/frontend/build/client/_app/immutable/nodes/12.CnAR0AQb.js +6 -0
  313. package/frontend/build/client/_app/immutable/nodes/12.CnAR0AQb.js.br +0 -0
  314. package/frontend/build/client/_app/immutable/nodes/12.CnAR0AQb.js.gz +0 -0
  315. package/frontend/build/client/_app/immutable/nodes/{2.Dr6yugXz.js → 2.Bno00fr8.js} +1 -1
  316. package/frontend/build/client/_app/immutable/nodes/2.Bno00fr8.js.br +0 -0
  317. package/frontend/build/client/_app/immutable/nodes/2.Bno00fr8.js.gz +0 -0
  318. package/frontend/build/client/_app/immutable/nodes/3.B6KwaCsM.js +6 -0
  319. package/frontend/build/client/_app/immutable/nodes/3.B6KwaCsM.js.br +0 -0
  320. package/frontend/build/client/_app/immutable/nodes/3.B6KwaCsM.js.gz +0 -0
  321. package/frontend/build/client/_app/immutable/nodes/{4.DDADylfF.js → 4.BX70m3v6.js} +1 -1
  322. package/frontend/build/client/_app/immutable/nodes/4.BX70m3v6.js.br +0 -0
  323. package/frontend/build/client/_app/immutable/nodes/4.BX70m3v6.js.gz +0 -0
  324. package/frontend/build/client/_app/immutable/nodes/5.UIFh06yr.js +6 -0
  325. package/frontend/build/client/_app/immutable/nodes/5.UIFh06yr.js.br +0 -0
  326. package/frontend/build/client/_app/immutable/nodes/5.UIFh06yr.js.gz +0 -0
  327. package/frontend/build/client/_app/immutable/nodes/6.DZ1OV24V.js +10 -0
  328. package/frontend/build/client/_app/immutable/nodes/6.DZ1OV24V.js.br +0 -0
  329. package/frontend/build/client/_app/immutable/nodes/6.DZ1OV24V.js.gz +0 -0
  330. package/frontend/build/client/_app/immutable/nodes/7.B_XntBZ1.js +6 -0
  331. package/frontend/build/client/_app/immutable/nodes/7.B_XntBZ1.js.br +0 -0
  332. package/frontend/build/client/_app/immutable/nodes/7.B_XntBZ1.js.gz +0 -0
  333. package/frontend/build/client/_app/immutable/nodes/8.CVHgJw-E.js +9 -0
  334. package/frontend/build/client/_app/immutable/nodes/8.CVHgJw-E.js.br +0 -0
  335. package/frontend/build/client/_app/immutable/nodes/8.CVHgJw-E.js.gz +0 -0
  336. package/frontend/build/client/_app/immutable/nodes/{9.BOK0GNF_.js → 9.DDDQPmMj.js} +1 -1
  337. package/frontend/build/client/_app/immutable/nodes/9.DDDQPmMj.js.br +0 -0
  338. package/frontend/build/client/_app/immutable/nodes/9.DDDQPmMj.js.gz +0 -0
  339. package/frontend/build/client/_app/version.json +1 -1
  340. package/frontend/build/client/_app/version.json.br +0 -0
  341. package/frontend/build/client/_app/version.json.gz +0 -0
  342. package/frontend/build/server/chunks/0-38cvTs44.js +22 -0
  343. package/frontend/build/server/chunks/0-38cvTs44.js.map +5 -0
  344. package/frontend/build/server/chunks/{1-B3HpigzL.js → 1-CcYsajvR.js} +2 -2
  345. package/frontend/build/server/chunks/{1-B3HpigzL.js.map → 1-CcYsajvR.js.map} +1 -1
  346. package/frontend/build/server/chunks/10-CFR2MUJt.js +14 -0
  347. package/frontend/build/server/chunks/10-CFR2MUJt.js.map +5 -0
  348. package/frontend/build/server/chunks/11-BmkiRQ9D.js +14 -0
  349. package/frontend/build/server/chunks/11-BmkiRQ9D.js.map +5 -0
  350. package/frontend/build/server/chunks/12-BphJAwnL.js +14 -0
  351. package/frontend/build/server/chunks/12-BphJAwnL.js.map +5 -0
  352. package/frontend/build/server/chunks/2-Dalgd2D4.js +14 -0
  353. package/frontend/build/server/chunks/{2-DioMbKbC.js.map → 2-Dalgd2D4.js.map} +1 -1
  354. package/frontend/build/server/chunks/3-BvsmdXCj.js +14 -0
  355. package/frontend/build/server/chunks/{3-CgiZg_9v.js.map → 3-BvsmdXCj.js.map} +1 -1
  356. package/frontend/build/server/chunks/4-CN18WCEn.js +14 -0
  357. package/frontend/build/server/chunks/{4-BM-49dbE.js.map → 4-CN18WCEn.js.map} +1 -1
  358. package/frontend/build/server/chunks/5-BwLYF3xL.js +14 -0
  359. package/frontend/build/server/chunks/{5-Brx_KOzy.js.map → 5-BwLYF3xL.js.map} +1 -1
  360. package/frontend/build/server/chunks/6-DTM2N_k3.js +14 -0
  361. package/frontend/build/server/chunks/6-DTM2N_k3.js.map +5 -0
  362. package/frontend/build/server/chunks/7-DTNbErSe.js +14 -0
  363. package/frontend/build/server/chunks/7-DTNbErSe.js.map +5 -0
  364. package/frontend/build/server/chunks/8-BfCbb7pl.js +14 -0
  365. package/frontend/build/server/chunks/8-BfCbb7pl.js.map +5 -0
  366. package/frontend/build/server/chunks/9-CQKepnMw.js +14 -0
  367. package/frontend/build/server/chunks/{9-BMAKiAem.js.map → 9-CQKepnMw.js.map} +1 -1
  368. package/frontend/build/server/chunks/{Toast-CHB87F8k.js → Button-B9h9viZX.js} +3 -17
  369. package/frontend/build/server/chunks/Button-B9h9viZX.js.map +5 -0
  370. package/frontend/build/server/chunks/{ConfirmModal-CtGWHl0v.js → ConfirmModal-C6Cz898n.js} +2 -2
  371. package/frontend/build/server/chunks/{ConfirmModal-CtGWHl0v.js.map → ConfirmModal-C6Cz898n.js.map} +1 -1
  372. package/frontend/build/server/chunks/{EmptyState-Zpm9tJe1.js → EmptyState-CRtsJIv6.js} +2 -2
  373. package/frontend/build/server/chunks/{EmptyState-Zpm9tJe1.js.map → EmptyState-CRtsJIv6.js.map} +1 -1
  374. package/frontend/build/server/chunks/{_layout.svelte-C_6nsIpT.js → _layout.svelte-B8vZGefg.js} +6 -7
  375. package/frontend/build/server/chunks/_layout.svelte-B8vZGefg.js.map +5 -0
  376. package/frontend/build/server/chunks/{_page.svelte-CTebwzwy.js → _page.svelte-BrnXHxJ4.js} +14 -7
  377. package/frontend/build/server/chunks/_page.svelte-BrnXHxJ4.js.map +5 -0
  378. package/frontend/build/server/chunks/_page.svelte-C2WqvInJ.js +898 -0
  379. package/frontend/build/server/chunks/_page.svelte-C2WqvInJ.js.map +5 -0
  380. package/frontend/build/server/chunks/{_page.svelte-Bamoq11m.js → _page.svelte-CP6jA1ex.js} +6 -6
  381. package/frontend/build/server/chunks/{_page.svelte-Bamoq11m.js.map → _page.svelte-CP6jA1ex.js.map} +1 -1
  382. package/frontend/build/server/chunks/{_page.svelte-CbTrCeeX.js → _page.svelte-D6b-klLK.js} +9 -9
  383. package/frontend/build/server/chunks/{_page.svelte-CbTrCeeX.js.map → _page.svelte-D6b-klLK.js.map} +1 -1
  384. package/frontend/build/server/chunks/{_page.svelte-CmJKt3-H.js → _page.svelte-DBjTpquQ.js} +18 -21
  385. package/frontend/build/server/chunks/_page.svelte-DBjTpquQ.js.map +5 -0
  386. package/frontend/build/server/chunks/{_page.svelte-DHZhNTPg.js → _page.svelte-DM1_y4Oq.js} +60 -42
  387. package/frontend/build/server/chunks/_page.svelte-DM1_y4Oq.js.map +5 -0
  388. package/frontend/build/server/chunks/{_page.svelte-DObTHQe2.js → _page.svelte-Mo-O3HJ5.js} +7 -7
  389. package/frontend/build/server/chunks/{_page.svelte-DObTHQe2.js.map → _page.svelte-Mo-O3HJ5.js.map} +1 -1
  390. package/frontend/build/server/chunks/{_page.svelte-CAlhaCzS.js → _page.svelte-mZF4NrfU.js} +9 -12
  391. package/frontend/build/server/chunks/_page.svelte-mZF4NrfU.js.map +5 -0
  392. package/frontend/build/server/chunks/{_page.svelte-BNwU9zza.js → _page.svelte-nrlgIFaU.js} +8 -11
  393. package/frontend/build/server/chunks/_page.svelte-nrlgIFaU.js.map +5 -0
  394. package/frontend/build/server/chunks/{common-DYYTVHPw.js → common-DS-Z0UFe.js} +7 -2
  395. package/frontend/build/server/chunks/common-DS-Z0UFe.js.map +5 -0
  396. package/frontend/build/server/chunks/{constants-BYVkTZ-O.js → constants-OmHysD51.js} +2 -2
  397. package/frontend/build/server/chunks/{constants-BYVkTZ-O.js.map → constants-OmHysD51.js.map} +1 -1
  398. package/frontend/build/server/chunks/{format-2pqy61MU.js → format-Bqb0as15.js} +2 -2
  399. package/frontend/build/server/chunks/{format-2pqy61MU.js.map → format-Bqb0as15.js.map} +1 -1
  400. package/frontend/build/server/chunks/{reports-WuXG6tj3.js → reports-chCHCDzB.js} +2 -2
  401. package/frontend/build/server/chunks/{reports-WuXG6tj3.js.map → reports-chCHCDzB.js.map} +1 -1
  402. package/frontend/build/server/chunks/{reports2-CCpI0xkQ.js → reports2-Dr3zu9CD.js} +2 -2
  403. package/frontend/build/server/chunks/{reports2-CCpI0xkQ.js.map → reports2-Dr3zu9CD.js.map} +1 -1
  404. package/frontend/build/server/chunks/{repository-TYWcFuWP.js → repository-DSsWVKEb.js} +5 -3
  405. package/frontend/build/server/chunks/repository-DSsWVKEb.js.map +5 -0
  406. package/frontend/build/server/chunks/{runner-D5yCWOsy.js → runner-aaUtOqck.js} +3 -3
  407. package/frontend/build/server/chunks/{runner-D5yCWOsy.js.map → runner-aaUtOqck.js.map} +1 -1
  408. package/frontend/build/server/index.js +1 -1
  409. package/frontend/build/server/index.js.map +1 -1
  410. package/frontend/build/server/manifest.js +14 -14
  411. package/frontend/build/server/manifest.js.map +1 -1
  412. package/frontend/package-lock.json +14 -0
  413. package/frontend/package.json +2 -0
  414. package/frontend/src/lib/api/reports.js +7 -0
  415. package/frontend/src/lib/api/repository.js +28 -0
  416. package/frontend/src/lib/components/layout/RunnerPanel.svelte +2 -1
  417. package/frontend/src/lib/components/reports/RecordingPlayer.svelte +172 -2
  418. package/frontend/src/lib/components/ui/ExportMenu.svelte +154 -0
  419. package/frontend/src/lib/components/ui/NotificationStack.svelte +177 -0
  420. package/frontend/src/lib/constants.js +1 -1
  421. package/frontend/src/lib/copy/common.js +9 -0
  422. package/frontend/src/lib/copy/reports.js +20 -0
  423. package/frontend/src/lib/copy/repository.js +4 -0
  424. package/frontend/src/lib/copy/settings.js +15 -0
  425. package/frontend/src/lib/stores/notifications.js +23 -0
  426. package/frontend/src/lib/stores/replayVideo.js +51 -0
  427. package/frontend/src/lib/utils/download.js +28 -0
  428. package/frontend/src/lib/utils/replayCapture.js +91 -0
  429. package/frontend/src/lib/utils/replayVideo.js +111 -0
  430. package/frontend/src/routes/+layout.svelte +2 -0
  431. package/frontend/src/routes/reports/[id]/+page.svelte +38 -3
  432. package/frontend/src/routes/scheduled-tests/+page.svelte +9 -17
  433. package/frontend/src/routes/settings/+page.svelte +140 -56
  434. package/frontend/src/routes/test-repository/+page.svelte +44 -16
  435. package/frontend/src/routes/test-repository/runs/[id]/+page.svelte +14 -23
  436. package/frontend/src/routes/test-repository/suites/[id]/+page.svelte +38 -22
  437. package/package.json +1 -1
  438. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.5IJAEAjc.css +0 -6
  439. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.B9H_IpSU.css +0 -6
  440. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.COwSGmmy.css +0 -6
  441. package/frontend/.svelte-kit/adapter-node/_app/immutable/assets/_page.Dp6vaGRc.css +0 -6
  442. package/frontend/.svelte-kit/generated/client/nodes/13.js +0 -6
  443. package/frontend/.svelte-kit/output/client/_app/immutable/assets/10.CdaQUS6U.css +0 -6
  444. package/frontend/.svelte-kit/output/client/_app/immutable/assets/12.B9H_IpSU.css +0 -6
  445. package/frontend/.svelte-kit/output/client/_app/immutable/assets/6.BN5XbLUX.css +0 -6
  446. package/frontend/.svelte-kit/output/client/_app/immutable/assets/8.COwSGmmy.css +0 -6
  447. package/frontend/.svelte-kit/output/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -6
  448. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -6
  449. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.B9H_IpSU.css +0 -6
  450. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.COwSGmmy.css +0 -6
  451. package/frontend/.svelte-kit/output/client/_app/immutable/assets/_page.Dp6vaGRc.css +0 -6
  452. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/2-KCkWZO.js +0 -6
  453. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/BbYY_TzB.js +0 -6
  454. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Beula-TH.js +0 -11
  455. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CZWchtW8.js +0 -6
  456. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/CegSvdD-.js +0 -6
  457. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Cfmt4_tJ.js +0 -6
  458. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DB3YXVFP.js +0 -6
  459. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DgQy0SB2.js +0 -6
  460. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DiVmSEJa.js +0 -8
  461. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/Dl-F6VCo.js +0 -6
  462. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/DuAVKaL3.js +0 -6
  463. package/frontend/.svelte-kit/output/client/_app/immutable/chunks/K1h4wprj.js +0 -6
  464. package/frontend/.svelte-kit/output/client/_app/immutable/entry/app.DRjRA71t.js +0 -7
  465. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/0.CRb8Nyce.js +0 -6
  466. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/10.kyazROhw.js +0 -6
  467. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/11.B3vMgT2v.js +0 -6
  468. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/12.DkPcIrgW.js +0 -6
  469. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/3.DUiL7fb5.js +0 -6
  470. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/5.N4CeDeoD.js +0 -6
  471. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/6.DWd93Bv5.js +0 -10
  472. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/7.c8d1cQQM.js +0 -6
  473. package/frontend/.svelte-kit/output/client/_app/immutable/nodes/8.Cvd3MauU.js +0 -9
  474. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.5IJAEAjc.css +0 -6
  475. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.B9H_IpSU.css +0 -6
  476. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.COwSGmmy.css +0 -6
  477. package/frontend/.svelte-kit/output/server/_app/immutable/assets/_page.Dp6vaGRc.css +0 -6
  478. package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css.br +0 -0
  479. package/frontend/build/client/_app/immutable/assets/0.CmJTG5mP.css.gz +0 -0
  480. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css +0 -6
  481. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.br +0 -0
  482. package/frontend/build/client/_app/immutable/assets/10.CdaQUS6U.css.gz +0 -0
  483. package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css +0 -6
  484. package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css.br +0 -0
  485. package/frontend/build/client/_app/immutable/assets/12.B9H_IpSU.css.gz +0 -0
  486. package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css +0 -6
  487. package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css.br +0 -0
  488. package/frontend/build/client/_app/immutable/assets/6.BN5XbLUX.css.gz +0 -0
  489. package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css +0 -6
  490. package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css.br +0 -0
  491. package/frontend/build/client/_app/immutable/assets/8.COwSGmmy.css.gz +0 -0
  492. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css +0 -6
  493. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.br +0 -0
  494. package/frontend/build/client/_app/immutable/assets/Button.FOWXxvc7.css.gz +0 -0
  495. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.br +0 -0
  496. package/frontend/build/client/_app/immutable/assets/Toast.DENwYn3g.css.gz +0 -0
  497. package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css.br +0 -0
  498. package/frontend/build/client/_app/immutable/assets/_layout.HkPnpRl9.css.gz +0 -0
  499. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css +0 -6
  500. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.br +0 -0
  501. package/frontend/build/client/_app/immutable/assets/_page.5IJAEAjc.css.gz +0 -0
  502. package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css +0 -6
  503. package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css.br +0 -0
  504. package/frontend/build/client/_app/immutable/assets/_page.B9H_IpSU.css.gz +0 -0
  505. package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css +0 -6
  506. package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css.br +0 -0
  507. package/frontend/build/client/_app/immutable/assets/_page.COwSGmmy.css.gz +0 -0
  508. package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css +0 -6
  509. package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css.br +0 -0
  510. package/frontend/build/client/_app/immutable/assets/_page.Dp6vaGRc.css.gz +0 -0
  511. package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js +0 -6
  512. package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js.br +0 -0
  513. package/frontend/build/client/_app/immutable/chunks/2-KCkWZO.js.gz +0 -0
  514. package/frontend/build/client/_app/immutable/chunks/B00vxw57.js.br +0 -0
  515. package/frontend/build/client/_app/immutable/chunks/B00vxw57.js.gz +0 -0
  516. package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js.br +0 -0
  517. package/frontend/build/client/_app/immutable/chunks/B0_HKFXV.js.gz +0 -0
  518. package/frontend/build/client/_app/immutable/chunks/BAvTKHxT.js.br +0 -0
  519. package/frontend/build/client/_app/immutable/chunks/BAvTKHxT.js.gz +0 -0
  520. package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js.br +0 -0
  521. package/frontend/build/client/_app/immutable/chunks/BJ_ypKl3.js.gz +0 -0
  522. package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js +0 -6
  523. package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js.br +0 -0
  524. package/frontend/build/client/_app/immutable/chunks/BbYY_TzB.js.gz +0 -0
  525. package/frontend/build/client/_app/immutable/chunks/Beula-TH.js +0 -11
  526. package/frontend/build/client/_app/immutable/chunks/Beula-TH.js.br +0 -0
  527. package/frontend/build/client/_app/immutable/chunks/Beula-TH.js.gz +0 -0
  528. package/frontend/build/client/_app/immutable/chunks/C00jnSU2.js.br +0 -0
  529. package/frontend/build/client/_app/immutable/chunks/C00jnSU2.js.gz +0 -0
  530. package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js.br +0 -0
  531. package/frontend/build/client/_app/immutable/chunks/C2_rQ4aY.js.gz +0 -0
  532. package/frontend/build/client/_app/immutable/chunks/C7uEQ-LH.js.br +0 -0
  533. package/frontend/build/client/_app/immutable/chunks/C7uEQ-LH.js.gz +0 -0
  534. package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js.br +0 -0
  535. package/frontend/build/client/_app/immutable/chunks/C8S7qQjQ.js.gz +0 -0
  536. package/frontend/build/client/_app/immutable/chunks/CZWchtW8.js +0 -6
  537. package/frontend/build/client/_app/immutable/chunks/CZWchtW8.js.br +0 -0
  538. package/frontend/build/client/_app/immutable/chunks/CZWchtW8.js.gz +0 -0
  539. package/frontend/build/client/_app/immutable/chunks/CboYYxrf.js.br +0 -6
  540. package/frontend/build/client/_app/immutable/chunks/CboYYxrf.js.gz +0 -0
  541. package/frontend/build/client/_app/immutable/chunks/CeH-RgMb.js.br +0 -0
  542. package/frontend/build/client/_app/immutable/chunks/CegSvdD-.js +0 -6
  543. package/frontend/build/client/_app/immutable/chunks/CegSvdD-.js.br +0 -0
  544. package/frontend/build/client/_app/immutable/chunks/CegSvdD-.js.gz +0 -0
  545. package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js.br +0 -0
  546. package/frontend/build/client/_app/immutable/chunks/CfkUW1vA.js.gz +0 -0
  547. package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js +0 -6
  548. package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js.br +0 -0
  549. package/frontend/build/client/_app/immutable/chunks/Cfmt4_tJ.js.gz +0 -0
  550. package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js.br +0 -0
  551. package/frontend/build/client/_app/immutable/chunks/Cgw8TOOy.js.gz +0 -0
  552. package/frontend/build/client/_app/immutable/chunks/Ck6C3Fl0.js.br +0 -0
  553. package/frontend/build/client/_app/immutable/chunks/Ck6C3Fl0.js.gz +0 -0
  554. package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js.br +0 -0
  555. package/frontend/build/client/_app/immutable/chunks/CoTEzvLa.js.gz +0 -0
  556. package/frontend/build/client/_app/immutable/chunks/DAmOMhaf.js.br +0 -0
  557. package/frontend/build/client/_app/immutable/chunks/DAmOMhaf.js.gz +0 -0
  558. package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js +0 -6
  559. package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js.br +0 -0
  560. package/frontend/build/client/_app/immutable/chunks/DB3YXVFP.js.gz +0 -0
  561. package/frontend/build/client/_app/immutable/chunks/DWzEJYIF.js.br +0 -7
  562. package/frontend/build/client/_app/immutable/chunks/DWzEJYIF.js.gz +0 -0
  563. package/frontend/build/client/_app/immutable/chunks/DgQy0SB2.js +0 -6
  564. package/frontend/build/client/_app/immutable/chunks/DgQy0SB2.js.br +0 -0
  565. package/frontend/build/client/_app/immutable/chunks/DgQy0SB2.js.gz +0 -0
  566. package/frontend/build/client/_app/immutable/chunks/DiVmSEJa.js +0 -8
  567. package/frontend/build/client/_app/immutable/chunks/DiVmSEJa.js.br +0 -0
  568. package/frontend/build/client/_app/immutable/chunks/DiVmSEJa.js.gz +0 -0
  569. package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js +0 -6
  570. package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js.br +0 -0
  571. package/frontend/build/client/_app/immutable/chunks/Dl-F6VCo.js.gz +0 -0
  572. package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js +0 -6
  573. package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js.br +0 -0
  574. package/frontend/build/client/_app/immutable/chunks/DuAVKaL3.js.gz +0 -0
  575. package/frontend/build/client/_app/immutable/chunks/GDjpV3r7.js.br +0 -0
  576. package/frontend/build/client/_app/immutable/chunks/GDjpV3r7.js.gz +0 -0
  577. package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js +0 -6
  578. package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js.br +0 -0
  579. package/frontend/build/client/_app/immutable/chunks/K1h4wprj.js.gz +0 -0
  580. package/frontend/build/client/_app/immutable/chunks/d2K3c8Kx.js.br +0 -0
  581. package/frontend/build/client/_app/immutable/chunks/d2K3c8Kx.js.gz +0 -0
  582. package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js +0 -7
  583. package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js.br +0 -0
  584. package/frontend/build/client/_app/immutable/entry/app.DRjRA71t.js.gz +0 -0
  585. package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js +0 -6
  586. package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js.br +0 -0
  587. package/frontend/build/client/_app/immutable/nodes/0.CRb8Nyce.js.gz +0 -0
  588. package/frontend/build/client/_app/immutable/nodes/1.BI97il3r.js.br +0 -0
  589. package/frontend/build/client/_app/immutable/nodes/1.BI97il3r.js.gz +0 -0
  590. package/frontend/build/client/_app/immutable/nodes/10.kyazROhw.js +0 -6
  591. package/frontend/build/client/_app/immutable/nodes/10.kyazROhw.js.br +0 -0
  592. package/frontend/build/client/_app/immutable/nodes/10.kyazROhw.js.gz +0 -0
  593. package/frontend/build/client/_app/immutable/nodes/11.B3vMgT2v.js +0 -6
  594. package/frontend/build/client/_app/immutable/nodes/11.B3vMgT2v.js.br +0 -0
  595. package/frontend/build/client/_app/immutable/nodes/11.B3vMgT2v.js.gz +0 -0
  596. package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js +0 -6
  597. package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js.br +0 -0
  598. package/frontend/build/client/_app/immutable/nodes/12.DkPcIrgW.js.gz +0 -0
  599. package/frontend/build/client/_app/immutable/nodes/2.Dr6yugXz.js.br +0 -0
  600. package/frontend/build/client/_app/immutable/nodes/2.Dr6yugXz.js.gz +0 -0
  601. package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js +0 -6
  602. package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js.br +0 -0
  603. package/frontend/build/client/_app/immutable/nodes/3.DUiL7fb5.js.gz +0 -0
  604. package/frontend/build/client/_app/immutable/nodes/4.DDADylfF.js.br +0 -0
  605. package/frontend/build/client/_app/immutable/nodes/4.DDADylfF.js.gz +0 -0
  606. package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js +0 -6
  607. package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js.br +0 -0
  608. package/frontend/build/client/_app/immutable/nodes/5.N4CeDeoD.js.gz +0 -0
  609. package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js +0 -10
  610. package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js.br +0 -0
  611. package/frontend/build/client/_app/immutable/nodes/6.DWd93Bv5.js.gz +0 -0
  612. package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js +0 -6
  613. package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js.br +0 -0
  614. package/frontend/build/client/_app/immutable/nodes/7.c8d1cQQM.js.gz +0 -0
  615. package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js +0 -9
  616. package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js.br +0 -0
  617. package/frontend/build/client/_app/immutable/nodes/8.Cvd3MauU.js.gz +0 -0
  618. package/frontend/build/client/_app/immutable/nodes/9.BOK0GNF_.js.br +0 -0
  619. package/frontend/build/client/_app/immutable/nodes/9.BOK0GNF_.js.gz +0 -0
  620. package/frontend/build/server/chunks/0-_rljpEay.js +0 -22
  621. package/frontend/build/server/chunks/0-_rljpEay.js.map +0 -5
  622. package/frontend/build/server/chunks/10-BQBBYpxV.js +0 -14
  623. package/frontend/build/server/chunks/10-BQBBYpxV.js.map +0 -5
  624. package/frontend/build/server/chunks/11-10xw0TIP.js +0 -14
  625. package/frontend/build/server/chunks/11-10xw0TIP.js.map +0 -5
  626. package/frontend/build/server/chunks/12-CZ3_Uw3c.js +0 -14
  627. package/frontend/build/server/chunks/12-CZ3_Uw3c.js.map +0 -5
  628. package/frontend/build/server/chunks/2-DioMbKbC.js +0 -14
  629. package/frontend/build/server/chunks/3-CgiZg_9v.js +0 -14
  630. package/frontend/build/server/chunks/4-BM-49dbE.js +0 -14
  631. package/frontend/build/server/chunks/5-Brx_KOzy.js +0 -14
  632. package/frontend/build/server/chunks/6-C5swINND.js +0 -14
  633. package/frontend/build/server/chunks/6-C5swINND.js.map +0 -5
  634. package/frontend/build/server/chunks/7-B8e4y3CB.js +0 -14
  635. package/frontend/build/server/chunks/7-B8e4y3CB.js.map +0 -5
  636. package/frontend/build/server/chunks/8-BZtkZMIZ.js +0 -14
  637. package/frontend/build/server/chunks/8-BZtkZMIZ.js.map +0 -5
  638. package/frontend/build/server/chunks/9-BMAKiAem.js +0 -14
  639. package/frontend/build/server/chunks/Toast-CHB87F8k.js.map +0 -5
  640. package/frontend/build/server/chunks/_layout.svelte-C_6nsIpT.js.map +0 -5
  641. package/frontend/build/server/chunks/_page.svelte-BNwU9zza.js.map +0 -5
  642. package/frontend/build/server/chunks/_page.svelte-CAlhaCzS.js.map +0 -5
  643. package/frontend/build/server/chunks/_page.svelte-CTebwzwy.js.map +0 -5
  644. package/frontend/build/server/chunks/_page.svelte-CmJKt3-H.js.map +0 -5
  645. package/frontend/build/server/chunks/_page.svelte-DHZhNTPg.js.map +0 -5
  646. package/frontend/build/server/chunks/_page.svelte-ywHy9KCh.js +0 -852
  647. package/frontend/build/server/chunks/_page.svelte-ywHy9KCh.js.map +0 -5
  648. package/frontend/build/server/chunks/common-DYYTVHPw.js.map +0 -5
  649. package/frontend/build/server/chunks/repository-TYWcFuWP.js.map +0 -5
  650. package/frontend/src/lib/components/ui/Toast.svelte +0 -24
@@ -5,11 +5,13 @@
5
5
 
6
6
  import { a0 as store_get, a2 as copy_payload, a3 as assign_payload, a1 as unsubscribe_stores, p as pop, a as push, Y as ensure_array_like, X as head, Z as stringify } from "../../../chunks/index.js";
7
7
  import "../../../chunks/client.js";
8
- import { A as API_BASE, M as MAX_TEST_RETRIES, B as BROWSERS, T as TOAST_TIMEOUT_MS } from "../../../chunks/constants.js";
8
+ import { p as page } from "../../../chunks/stores.js";
9
+ import { A as API_BASE, T as TOAST_TIMEOUT_MS, M as MAX_TEST_RETRIES, B as BROWSERS } from "../../../chunks/constants.js";
9
10
  import { a as auth } from "../../../chunks/auth.js";
10
11
  import { a as builtInEnabled } from "../../../chunks/runner.js";
11
12
  import { t as theme } from "../../../chunks/theme.js";
12
- import { T as Toast, B as Button } from "../../../chunks/Toast.js";
13
+ import { B as Button } from "../../../chunks/Button.js";
14
+ import { w as writable } from "../../../chunks/index2.js";
13
15
  import { C as ConfirmModal } from "../../../chunks/ConfirmModal.js";
14
16
  import { B as Badge } from "../../../chunks/Badge.js";
15
17
  import { a as SAVE_LABEL, b as CANCEL_LABEL, E as EDIT_LABEL, c as EMAIL_LABEL } from "../../../chunks/common.js";
@@ -22,6 +24,17 @@ async function fetchS3Backups() {
22
24
  const res = await fetch(`${API_BASE}/backup/s3-backups`, { headers: authHeaders() });
23
25
  return res.json();
24
26
  }
27
+ const notifications = writable([]);
28
+ let seq = 0;
29
+ function notify(type, message, { sticky = false, timeout = TOAST_TIMEOUT_MS } = {}) {
30
+ const id = ++seq;
31
+ notifications.update((list) => [...list, { id, type, message, sticky }]);
32
+ if (!sticky) setTimeout(() => dismissNotification(id), timeout);
33
+ return id;
34
+ }
35
+ function dismissNotification(id) {
36
+ notifications.update((list) => list.filter((n) => n.id !== id));
37
+ }
25
38
  const PAGE_TITLE = "Settings — Plum";
26
39
  const HEADING = "Settings";
27
40
  const NAME_LABEL = "Name";
@@ -29,6 +42,13 @@ const PROJECT_LABEL = "Project";
29
42
  const RUNNERS_LABEL = "Runners";
30
43
  const REPOSITORY_NAV_LABEL = "Repository";
31
44
  const REPOSITORY_HEADING = "Test Repository";
45
+ const TEST_CASES_NAV_LABEL = "Test Cases";
46
+ const TEST_CASES_HEADING = "Test Cases";
47
+ const TEST_CASES_DESC = "Bring test cases in from a Plum export file.";
48
+ const TC_IMPORT_CARD_TITLE = "Import";
49
+ const TC_IMPORT_DESC = "Upload a JSON file exported from Test Repository. Suites and cases are added as new records.";
50
+ const TC_IMPORT_HINT = "A case is skipped when its ID already exists here. Cases with a different prefix or no ID are imported with a fresh ID.";
51
+ const tcImportLabel = (importing) => "Import";
32
52
  const INTEGRATIONS_LABEL = "Integrations";
33
53
  const MCP_NAV_LABEL = "MCP";
34
54
  const MCP_HEADING = "MCP Integration";
@@ -198,14 +218,25 @@ function _page($$payload, $$props) {
198
218
  push();
199
219
  var $$store_subs;
200
220
  let s3Configured, ciWorkflowSnippet, navItems;
201
- let section = typeof sessionStorage !== "undefined" && sessionStorage.getItem("plum:settings:section") || "project";
221
+ const VALID_SECTIONS = /* @__PURE__ */ new Set([
222
+ "project",
223
+ "runners",
224
+ "repository",
225
+ "testcases",
226
+ "integrations",
227
+ "mcp",
228
+ "account",
229
+ "users",
230
+ "backup"
231
+ ]);
232
+ const querySection = store_get($$store_subs ??= {}, "$page", page).url.searchParams.get("section");
233
+ let section = VALID_SECTIONS.has(querySection) && querySection || typeof sessionStorage !== "undefined" && sessionStorage.getItem("plum:settings:section") || "project";
202
234
  let project = {
203
235
  name: "",
204
236
  logoUrl: "",
205
237
  maxRetries: 0
206
238
  };
207
239
  let projectSaving = false;
208
- let toast = null;
209
240
  const TIMEZONES = (() => {
210
241
  try {
211
242
  return Intl.supportedValuesOf("timeZone");
@@ -272,10 +303,6 @@ function _page($$payload, $$props) {
272
303
  token: ""
273
304
  };
274
305
  let editFormSaving = false;
275
- function showToast(type, message) {
276
- toast = { type, message };
277
- setTimeout(() => toast = null, TOAST_TIMEOUT_MS);
278
- }
279
306
  async function loadS3Backups() {
280
307
  loadingS3Backups = true;
281
308
  try {
@@ -283,7 +310,7 @@ function _page($$payload, $$props) {
283
310
  if (result.error) throw new Error(result.error);
284
311
  s3Backups = result.backups ?? [];
285
312
  } catch (e) {
286
- showToast("error", e.message || LIST_S3_BACKUPS_FAILED);
313
+ notify("error", e.message || LIST_S3_BACKUPS_FAILED);
287
314
  } finally {
288
315
  loadingS3Backups = false;
289
316
  }
@@ -292,6 +319,7 @@ function _page($$payload, $$props) {
292
319
  "project",
293
320
  "runners",
294
321
  "repository",
322
+ "testcases",
295
323
  "integrations",
296
324
  "mcp",
297
325
  "users",
@@ -330,6 +358,7 @@ function _page($$payload, $$props) {
330
358
  { id: "project", label: PROJECT_LABEL },
331
359
  { id: "runners", label: RUNNERS_LABEL },
332
360
  { id: "repository", label: REPOSITORY_NAV_LABEL },
361
+ { id: "testcases", label: TEST_CASES_NAV_LABEL },
333
362
  { id: "integrations", label: INTEGRATIONS_LABEL },
334
363
  { id: "mcp", label: MCP_NAV_LABEL },
335
364
  { id: "account", label: ACCOUNT_LABEL },
@@ -343,28 +372,27 @@ function _page($$payload, $$props) {
343
372
  head($$payload2, ($$payload3) => {
344
373
  $$payload3.title = `<title>${escape_html(PAGE_TITLE)}</title>`;
345
374
  });
346
- Toast($$payload2, { toast });
347
- $$payload2.out += `<!----> <div class="page-header svelte-1b139ls"><h1 class="svelte-1b139ls">${escape_html(HEADING)}</h1></div> <div class="settings-layout svelte-1b139ls"><aside class="settings-sidebar svelte-1b139ls"><nav class="svelte-1b139ls"><!--[-->`;
375
+ $$payload2.out += `<div class="page-header svelte-m3ck68"><h1 class="svelte-m3ck68">${escape_html(HEADING)}</h1></div> <div class="settings-layout svelte-m3ck68"><aside class="settings-sidebar svelte-m3ck68"><nav class="svelte-m3ck68"><!--[-->`;
348
376
  for (let $$index = 0, $$length = each_array.length; $$index < $$length; $$index++) {
349
377
  let item = each_array[$$index];
350
- $$payload2.out += `<button${attr("class", `sidebar-item svelte-1b139ls ${stringify([section === item.id ? "active" : ""].filter(Boolean).join(" "))}`)}>${escape_html(item.label)}</button>`;
378
+ $$payload2.out += `<button${attr("class", `sidebar-item svelte-m3ck68 ${stringify([section === item.id ? "active" : ""].filter(Boolean).join(" "))}`)}>${escape_html(item.label)}</button>`;
351
379
  }
352
- $$payload2.out += `<!--]--></nav></aside> <div class="settings-content svelte-1b139ls">`;
380
+ $$payload2.out += `<!--]--></nav></aside> <div class="settings-content svelte-m3ck68">`;
353
381
  if (section === "project") {
354
382
  $$payload2.out += "<!--[-->";
355
383
  const each_array_1 = ensure_array_like(TIMEZONES);
356
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(PROJECT_LABEL)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(PROJECT_DESC)}</p></div> <div class="card settings-card svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="project-name">${escape_html(PROJECT_NAME_LABEL)}</label> <input id="project-name" type="text" class="field-input"${attr("value", project.name)}${attr("placeholder", PROJECT_NAME_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls" for="project-logo"><span>${escape_html(LOGO_URL_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(LOGO_URL_HINT)}</span></label> <input id="project-logo" type="url" class="field-input"${attr("value", project.logoUrl)}${attr("placeholder", LOGO_URL_PLACEHOLDER)}></div> `;
384
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(PROJECT_LABEL)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(PROJECT_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="project-name">${escape_html(PROJECT_NAME_LABEL)}</label> <input id="project-name" type="text" class="field-input"${attr("value", project.name)}${attr("placeholder", PROJECT_NAME_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68" for="project-logo"><span>${escape_html(LOGO_URL_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(LOGO_URL_HINT)}</span></label> <input id="project-logo" type="url" class="field-input"${attr("value", project.logoUrl)}${attr("placeholder", LOGO_URL_PLACEHOLDER)}></div> `;
357
385
  {
358
386
  $$payload2.out += "<!--[!-->";
359
387
  }
360
- $$payload2.out += `<!--]--> <div class="field"><label class="field-label svelte-1b139ls" for="project-timezone"><span>${escape_html(TIMEZONE_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(TIMEZONE_HINT)}</span></label> <select id="project-timezone" class="field-input"><!--[-->`;
388
+ $$payload2.out += `<!--]--> <div class="field"><label class="field-label svelte-m3ck68" for="project-timezone"><span>${escape_html(TIMEZONE_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(TIMEZONE_HINT)}</span></label> <select id="project-timezone" class="field-input"><!--[-->`;
361
389
  for (let $$index_1 = 0, $$length = each_array_1.length; $$index_1 < $$length; $$index_1++) {
362
390
  let tz = each_array_1[$$index_1];
363
391
  $$payload2.out += `<option${attr("value", tz)}>${escape_html(tz)}</option>`;
364
392
  }
365
- $$payload2.out += `<!--]--></select></div> <div class="field"><label class="field-label svelte-1b139ls" for="project-max-retries"><span>${escape_html(RETRY_FAILED_TESTS_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(RETRY_FAILED_TESTS_HINT)}</span></label> <input id="project-max-retries" type="number" class="field-input" min="0"${attr("max", MAX_TEST_RETRIES)}${attr("value", project.maxRetries)}></div> <div class="toggle-row svelte-1b139ls"><div class="toggle-info svelte-1b139ls"><span class="toggle-label svelte-1b139ls">${escape_html(DARK_MODE_LABEL)}</span> <span class="toggle-desc svelte-1b139ls">${escape_html(DARK_MODE_DESC)}</span></div> <button${attr("class", `toggle-switch svelte-1b139ls ${stringify([
393
+ $$payload2.out += `<!--]--></select></div> <div class="field"><label class="field-label svelte-m3ck68" for="project-max-retries"><span>${escape_html(RETRY_FAILED_TESTS_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(RETRY_FAILED_TESTS_HINT)}</span></label> <input id="project-max-retries" type="number" class="field-input" min="0"${attr("max", MAX_TEST_RETRIES)}${attr("value", project.maxRetries)}></div> <div class="toggle-row svelte-m3ck68"><div class="toggle-info svelte-m3ck68"><span class="toggle-label svelte-m3ck68">${escape_html(DARK_MODE_LABEL)}</span> <span class="toggle-desc svelte-m3ck68">${escape_html(DARK_MODE_DESC)}</span></div> <button${attr("class", `toggle-switch svelte-m3ck68 ${stringify([
366
394
  store_get($$store_subs ??= {}, "$theme", theme) === "dark" ? "on" : ""
367
- ].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", store_get($$store_subs ??= {}, "$theme", theme) === "dark")}><span class="toggle-thumb svelte-1b139ls"></span></button></div> <div class="card-footer svelte-1b139ls">`;
395
+ ].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", store_get($$store_subs ??= {}, "$theme", theme) === "dark")}><span class="toggle-thumb svelte-m3ck68"></span></button></div> <div class="card-footer svelte-m3ck68">`;
368
396
  Button($$payload2, {
369
397
  disabled: projectSaving,
370
398
  children: ($$payload3) => {
@@ -377,20 +405,20 @@ function _page($$payload, $$props) {
377
405
  $$payload2.out += "<!--[!-->";
378
406
  if (section === "runners") {
379
407
  $$payload2.out += "<!--[-->";
380
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(RUNNERS_LABEL)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(RUNNERS_DESC)}</p></div> <div class="card settings-card svelte-1b139ls"><div class="toggle-row svelte-1b139ls"><div class="toggle-info svelte-1b139ls"><span class="toggle-label svelte-1b139ls">${escape_html(BUILTIN_RUNNER_TOGGLE_LABEL)}</span> <span class="toggle-desc svelte-1b139ls">${escape_html(BUILTIN_RUNNER_TOGGLE_DESC)}</span></div> <button${attr("class", `toggle-switch svelte-1b139ls ${stringify([
408
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(RUNNERS_LABEL)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(RUNNERS_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><div class="toggle-row svelte-m3ck68"><div class="toggle-info svelte-m3ck68"><span class="toggle-label svelte-m3ck68">${escape_html(BUILTIN_RUNNER_TOGGLE_LABEL)}</span> <span class="toggle-desc svelte-m3ck68">${escape_html(BUILTIN_RUNNER_TOGGLE_DESC)}</span></div> <button${attr("class", `toggle-switch svelte-m3ck68 ${stringify([
381
409
  store_get($$store_subs ??= {}, "$builtInEnabled", builtInEnabled) ? "on" : ""
382
- ].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", store_get($$store_subs ??= {}, "$builtInEnabled", builtInEnabled))}><span class="toggle-thumb svelte-1b139ls"></span></button></div> `;
410
+ ].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", store_get($$store_subs ??= {}, "$builtInEnabled", builtInEnabled))}><span class="toggle-thumb svelte-m3ck68"></span></button></div> `;
383
411
  if (runners.length > 0) {
384
412
  $$payload2.out += "<!--[-->";
385
413
  const each_array_2 = ensure_array_like(runners);
386
- $$payload2.out += `<div class="runner-cards svelte-1b139ls"><!--[-->`;
414
+ $$payload2.out += `<div class="runner-cards svelte-m3ck68"><!--[-->`;
387
415
  for (let $$index_3 = 0, $$length = each_array_2.length; $$index_3 < $$length; $$index_3++) {
388
416
  let r = each_array_2[$$index_3];
389
417
  const ping = pingResults[r.id];
390
418
  if (editingId === r.id) {
391
419
  $$payload2.out += "<!--[-->";
392
420
  const each_array_3 = ensure_array_like(BROWSERS);
393
- $$payload2.out += `<div class="runner-card editing svelte-1b139ls"><div class="runner-form-fields svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls"${attr("for", `edit-name-${stringify(r.id)}`)}>${escape_html(NAME_LABEL)}</label> <input${attr("id", `edit-name-${stringify(r.id)}`)} type="text" class="field-input"${attr("value", editForm.name)}${attr("placeholder", RUNNER_NAME_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls"${attr("for", `edit-url-${stringify(r.id)}`)}>${escape_html(RUNNER_URL_LABEL)} <span class="field-hint svelte-1b139ls">${escape_html(RUNNER_URL_HINT_PREFIX)} <code>host.docker.internal</code> ${escape_html(RUNNER_URL_HINT_SUFFIX)}</span></label> <input${attr("id", `edit-url-${stringify(r.id)}`)} type="url" class="field-input"${attr("value", editForm.url)}${attr("placeholder", RUNNER_URL_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls"${attr("for", `edit-token-${stringify(r.id)}`)}>${escape_html(TOKEN_LABEL)}</label> <input${attr("id", `edit-token-${stringify(r.id)}`)} type="text" class="field-input"${attr("value", editForm.token)}${attr("placeholder", KEEP_TOKEN_PLACEHOLDER)} spellcheck="false" autocomplete="off"></div> <div class="field"><label class="field-label svelte-1b139ls"${attr("for", `edit-browser-${stringify(r.id)}`)}>${escape_html(BROWSER_LABEL)}</label> <select${attr("id", `edit-browser-${stringify(r.id)}`)} class="field-input"><!--[-->`;
421
+ $$payload2.out += `<div class="runner-card editing svelte-m3ck68"><div class="runner-form-fields svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68"${attr("for", `edit-name-${stringify(r.id)}`)}>${escape_html(NAME_LABEL)}</label> <input${attr("id", `edit-name-${stringify(r.id)}`)} type="text" class="field-input"${attr("value", editForm.name)}${attr("placeholder", RUNNER_NAME_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68"${attr("for", `edit-url-${stringify(r.id)}`)}>${escape_html(RUNNER_URL_LABEL)} <span class="field-hint svelte-m3ck68">${escape_html(RUNNER_URL_HINT_PREFIX)} <code>host.docker.internal</code> ${escape_html(RUNNER_URL_HINT_SUFFIX)}</span></label> <input${attr("id", `edit-url-${stringify(r.id)}`)} type="url" class="field-input"${attr("value", editForm.url)}${attr("placeholder", RUNNER_URL_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68"${attr("for", `edit-token-${stringify(r.id)}`)}>${escape_html(TOKEN_LABEL)}</label> <input${attr("id", `edit-token-${stringify(r.id)}`)} type="text" class="field-input"${attr("value", editForm.token)}${attr("placeholder", KEEP_TOKEN_PLACEHOLDER)} spellcheck="false" autocomplete="off"></div> <div class="field"><label class="field-label svelte-m3ck68"${attr("for", `edit-browser-${stringify(r.id)}`)}>${escape_html(BROWSER_LABEL)}</label> <select${attr("id", `edit-browser-${stringify(r.id)}`)} class="field-input"><!--[-->`;
394
422
  for (let $$index_2 = 0, $$length2 = each_array_3.length; $$index_2 < $$length2; $$index_2++) {
395
423
  let b = each_array_3[$$index_2];
396
424
  $$payload2.out += `<option${attr("value", b.id)}>${escape_html(b.label)}</option>`;
@@ -399,7 +427,7 @@ function _page($$payload, $$props) {
399
427
  {
400
428
  $$payload2.out += "<!--[!-->";
401
429
  }
402
- $$payload2.out += `<!--]--> <div class="runner-form-actions svelte-1b139ls">`;
430
+ $$payload2.out += `<!--]--> <div class="runner-form-actions svelte-m3ck68">`;
403
431
  Button($$payload2, {
404
432
  disabled: editFormSaving,
405
433
  children: ($$payload3) => {
@@ -419,28 +447,28 @@ function _page($$payload, $$props) {
419
447
  $$payload2.out += `<!----></div></div>`;
420
448
  } else {
421
449
  $$payload2.out += "<!--[!-->";
422
- $$payload2.out += `<div class="runner-card svelte-1b139ls"><div class="runner-card-header svelte-1b139ls"><svg class="runner-card-icon svelte-1b139ls" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><rect x="2" y="3" width="20" height="14" rx="2"></rect><path d="M8 21h8M12 17v4"></path></svg> <span class="runner-card-name svelte-1b139ls">${escape_html(r.name)}</span> <span class="runner-browser-pill svelte-1b139ls">${escape_html(r.browser)}</span> `;
450
+ $$payload2.out += `<div class="runner-card svelte-m3ck68"><div class="runner-card-header svelte-m3ck68"><svg class="runner-card-icon svelte-m3ck68" width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round"><rect x="2" y="3" width="20" height="14" rx="2"></rect><path d="M8 21h8M12 17v4"></path></svg> <span class="runner-card-name svelte-m3ck68">${escape_html(r.name)}</span> <span class="runner-browser-pill svelte-m3ck68">${escape_html(r.browser)}</span> `;
423
451
  if (ping && !ping.loading) {
424
452
  $$payload2.out += "<!--[-->";
425
453
  if (ping.ok) {
426
454
  $$payload2.out += "<!--[-->";
427
- $$payload2.out += `<span class="ping-badge ok svelte-1b139ls">${escape_html(ping.latency)}ms</span>`;
455
+ $$payload2.out += `<span class="ping-badge ok svelte-m3ck68">${escape_html(ping.latency)}ms</span>`;
428
456
  } else {
429
457
  $$payload2.out += "<!--[!-->";
430
- $$payload2.out += `<span class="ping-badge fail svelte-1b139ls"${attr("title", ping.error)}>${escape_html(RUNNER_UNREACHABLE_LABEL)}</span>`;
458
+ $$payload2.out += `<span class="ping-badge fail svelte-m3ck68"${attr("title", ping.error)}>${escape_html(RUNNER_UNREACHABLE_LABEL)}</span>`;
431
459
  }
432
460
  $$payload2.out += `<!--]-->`;
433
461
  } else {
434
462
  $$payload2.out += "<!--[!-->";
435
463
  if (ping?.loading) {
436
464
  $$payload2.out += "<!--[-->";
437
- $$payload2.out += `<span class="ping-badge pinging svelte-1b139ls">${escape_html(RUNNER_PINGING_LABEL)}</span>`;
465
+ $$payload2.out += `<span class="ping-badge pinging svelte-m3ck68">${escape_html(RUNNER_PINGING_LABEL)}</span>`;
438
466
  } else {
439
467
  $$payload2.out += "<!--[!-->";
440
468
  }
441
469
  $$payload2.out += `<!--]-->`;
442
470
  }
443
- $$payload2.out += `<!--]--></div> <p class="runner-card-url svelte-1b139ls">${escape_html(r.url)}</p> <div class="runner-card-actions svelte-1b139ls">`;
471
+ $$payload2.out += `<!--]--></div> <p class="runner-card-url svelte-m3ck68">${escape_html(r.url)}</p> <div class="runner-card-actions svelte-m3ck68">`;
444
472
  Button($$payload2, {
445
473
  variant: "ghost",
446
474
  size: "sm",
@@ -489,7 +517,7 @@ function _page($$payload, $$props) {
489
517
  $$payload2.out += `<!--]--> `;
490
518
  {
491
519
  $$payload2.out += "<!--[!-->";
492
- $$payload2.out += `<div class="card-footer svelte-1b139ls">`;
520
+ $$payload2.out += `<div class="card-footer svelte-m3ck68">`;
493
521
  Button($$payload2, {
494
522
  variant: "ghost",
495
523
  children: ($$payload3) => {
@@ -504,7 +532,7 @@ function _page($$payload, $$props) {
504
532
  $$payload2.out += "<!--[!-->";
505
533
  if (section === "repository") {
506
534
  $$payload2.out += "<!--[-->";
507
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(REPOSITORY_HEADING)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(REPOSITORY_DESC)}</p></div> <div class="card settings-card svelte-1b139ls"><div class="field-row svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="tc-prefix">${escape_html(CASE_PREFIX_LABEL)}</label> <input id="tc-prefix" type="text" class="field-input mono svelte-1b139ls"${attr("value", prefixes.testCasePrefix)}${attr("placeholder", CASE_PREFIX_PLACEHOLDER)} maxlength="10"></div> <div class="field"><label class="field-label svelte-1b139ls" for="ts-prefix">${escape_html(SUITE_PREFIX_LABEL)}</label> <input id="ts-prefix" type="text" class="field-input mono svelte-1b139ls"${attr("value", prefixes.testSuitePrefix)}${attr("placeholder", SUITE_PREFIX_PLACEHOLDER)} maxlength="10"></div></div> <p class="content-desc svelte-1b139ls">${escape_html(EXAMPLES_LABEL)} <code class="code-sample svelte-1b139ls">${escape_html(prefixes.testCasePrefix)}-001</code>, <code class="code-sample svelte-1b139ls">${escape_html(prefixes.testSuitePrefix)}-001</code></p> <div class="card-footer svelte-1b139ls">`;
535
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(REPOSITORY_HEADING)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(REPOSITORY_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><div class="field-row svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="tc-prefix">${escape_html(CASE_PREFIX_LABEL)}</label> <input id="tc-prefix" type="text" class="field-input mono svelte-m3ck68"${attr("value", prefixes.testCasePrefix)}${attr("placeholder", CASE_PREFIX_PLACEHOLDER)} maxlength="10"></div> <div class="field"><label class="field-label svelte-m3ck68" for="ts-prefix">${escape_html(SUITE_PREFIX_LABEL)}</label> <input id="ts-prefix" type="text" class="field-input mono svelte-m3ck68"${attr("value", prefixes.testSuitePrefix)}${attr("placeholder", SUITE_PREFIX_PLACEHOLDER)} maxlength="10"></div></div> <p class="content-desc svelte-m3ck68">${escape_html(EXAMPLES_LABEL)} <code class="code-sample svelte-m3ck68">${escape_html(prefixes.testCasePrefix)}-001</code>, <code class="code-sample svelte-m3ck68">${escape_html(prefixes.testSuitePrefix)}-001</code></p> <div class="card-footer svelte-m3ck68">`;
508
536
  Button($$payload2, {
509
537
  disabled: prefixesSaving,
510
538
  children: ($$payload3) => {
@@ -512,7 +540,7 @@ function _page($$payload, $$props) {
512
540
  },
513
541
  $$slots: { default: true }
514
542
  });
515
- $$payload2.out += `<!----></div></div> <div class="content-header svelte-1b139ls" style="margin-top: 1rem"><h2 class="svelte-1b139ls">${escape_html(MIGRATE_IDS_HEADING)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(MIGRATE_DESC_PREFIX)} <strong>${escape_html(MIGRATE_DESC_STRONG)}</strong> ${escape_html(MIGRATE_DESC_SUFFIX)}</p></div> <div class="card settings-card svelte-1b139ls"><div class="field-row svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="mig-tc">${escape_html(NEW_CASE_PREFIX_LABEL)}</label> <input id="mig-tc" type="text" class="field-input mono svelte-1b139ls"${attr("value", migrateForm.testCasePrefix)}${attr("placeholder", prefixes.testCasePrefix)} maxlength="10"></div> <div class="field"><label class="field-label svelte-1b139ls" for="mig-ts">${escape_html(NEW_SUITE_PREFIX_LABEL)}</label> <input id="mig-ts" type="text" class="field-input mono svelte-1b139ls"${attr("value", migrateForm.testSuitePrefix)}${attr("placeholder", prefixes.testSuitePrefix)} maxlength="10"></div></div> <div class="card-footer svelte-1b139ls">`;
543
+ $$payload2.out += `<!----></div></div> <div class="content-header svelte-m3ck68" style="margin-top: 1rem"><h2 class="svelte-m3ck68">${escape_html(MIGRATE_IDS_HEADING)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(MIGRATE_DESC_PREFIX)} <strong>${escape_html(MIGRATE_DESC_STRONG)}</strong> ${escape_html(MIGRATE_DESC_SUFFIX)}</p></div> <div class="card settings-card svelte-m3ck68"><div class="field-row svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="mig-tc">${escape_html(NEW_CASE_PREFIX_LABEL)}</label> <input id="mig-tc" type="text" class="field-input mono svelte-m3ck68"${attr("value", migrateForm.testCasePrefix)}${attr("placeholder", prefixes.testCasePrefix)} maxlength="10"></div> <div class="field"><label class="field-label svelte-m3ck68" for="mig-ts">${escape_html(NEW_SUITE_PREFIX_LABEL)}</label> <input id="mig-ts" type="text" class="field-input mono svelte-m3ck68"${attr("value", migrateForm.testSuitePrefix)}${attr("placeholder", prefixes.testSuitePrefix)} maxlength="10"></div></div> <div class="card-footer svelte-m3ck68">`;
516
544
  Button($$payload2, {
517
545
  variant: "ghost",
518
546
  disabled: migrating,
@@ -524,212 +552,123 @@ function _page($$payload, $$props) {
524
552
  $$payload2.out += `<!----></div></div></div>`;
525
553
  } else {
526
554
  $$payload2.out += "<!--[!-->";
527
- if (section === "integrations") {
555
+ if (section === "testcases") {
528
556
  $$payload2.out += "<!--[-->";
529
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(INTEGRATIONS_LABEL)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(INTEGRATIONS_DESC)}</p></div> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(WEBHOOKS_CARD_TITLE)}</p> <div class="field"><label class="field-label svelte-1b139ls" for="discord-url"><span>${escape_html(DISCORD_WEBHOOK_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(DISCORD_WEBHOOK_HINT)}</span></label> <input id="discord-url" type="url" class="field-input"${attr("value", integrations.discordWebhookUrl)}${attr("placeholder", DISCORD_WEBHOOK_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls" for="slack-url"><span>${escape_html(SLACK_WEBHOOK_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(SLACK_WEBHOOK_HINT)}</span></label> <input id="slack-url" type="url" class="field-input"${attr("value", integrations.slackWebhookUrl)}${attr("placeholder", SLACK_WEBHOOK_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls" for="public-url"><span>${escape_html(PUBLIC_URL_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(PUBLIC_URL_HINT)}</span></label> <input id="public-url" type="url" class="field-input"${attr("value", integrations.notifyPublicUrl)}${attr("placeholder", PUBLIC_URL_PLACEHOLDER)}></div> `;
557
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(TEST_CASES_HEADING)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(TEST_CASES_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(TC_IMPORT_CARD_TITLE)}</p> <div class="backup-block svelte-m3ck68"><p class="backup-block-desc svelte-m3ck68">${escape_html(TC_IMPORT_DESC)}</p> <div class="import-row svelte-m3ck68"><label class="file-label svelte-m3ck68"><input type="file" accept=".json,application/json" class="file-input-hidden svelte-m3ck68"> <span class="file-btn svelte-m3ck68">${escape_html(CHOOSE_FILE_LABEL)}</span></label> `;
530
558
  Button($$payload2, {
531
- disabled: integrationsSaving,
559
+ disabled: true,
532
560
  children: ($$payload3) => {
533
- $$payload3.out += `<!---->${escape_html(saveIntegrationsLabel())}`;
561
+ $$payload3.out += `<!---->${escape_html(tcImportLabel())}`;
534
562
  },
535
563
  $$slots: { default: true }
536
564
  });
537
- $$payload2.out += `<!----></div> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(CI_TRIGGERS_CARD_TITLE)}</p> <p class="content-desc svelte-1b139ls">${escape_html(CI_DESC_PART1)} <code class="code-sample svelte-1b139ls">POST ${escape_html(API_BASE)}/trigger</code> ${escape_html(CI_DESC_PART2)} <code class="code-sample svelte-1b139ls">Authorization: ApiKey …</code> ${escape_html(CI_DESC_PART3)} <button class="link-btn svelte-1b139ls">${escape_html(MCP_TAB_LINK_LABEL)}</button> ${escape_html(CI_DESC_PART4)} `;
538
- Badge($$payload2, {
539
- variant: "external",
540
- children: ($$payload3) => {
541
- $$payload3.out += `<!---->${escape_html(EXTERNAL_BADGE_LABEL)}`;
542
- },
543
- $$slots: { default: true }
544
- });
545
- $$payload2.out += `<!---->.</p> <pre class="mcp-snippet svelte-1b139ls">${escape_html(ciWorkflowSnippet)}</pre> <div class="card-footer svelte-1b139ls">`;
546
- Button($$payload2, {
547
- variant: "ghost",
548
- children: ($$payload3) => {
549
- $$payload3.out += `<!---->${escape_html(copyCiSnippetLabel())}`;
550
- },
551
- $$slots: { default: true }
552
- });
553
- $$payload2.out += `<!----></div></div></div>`;
565
+ $$payload2.out += `<!----></div> `;
566
+ {
567
+ $$payload2.out += "<!--[!-->";
568
+ }
569
+ $$payload2.out += `<!--]--> <p class="backup-block-desc svelte-m3ck68">${escape_html(TC_IMPORT_HINT)}</p></div></div></div>`;
554
570
  } else {
555
571
  $$payload2.out += "<!--[!-->";
556
- if (section === "mcp") {
572
+ if (section === "integrations") {
557
573
  $$payload2.out += "<!--[-->";
558
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(MCP_HEADING)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(MCP_DESC)}</p></div> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(API_KEY_CARD_TITLE)}</p> `;
559
- {
560
- $$payload2.out += "<!--[-->";
561
- $$payload2.out += `<p class="content-desc svelte-1b139ls">${escape_html(NO_KEY_GENERATED_MESSAGE)}</p> <div class="card-footer svelte-1b139ls">`;
562
- Button($$payload2, {
563
- disabled: mcpGenerating,
564
- children: ($$payload3) => {
565
- $$payload3.out += `<!---->${escape_html(generateKeyLabel())}`;
566
- },
567
- $$slots: { default: true }
568
- });
569
- $$payload2.out += `<!----></div>`;
570
- }
571
- $$payload2.out += `<!--]--></div> `;
572
- {
573
- $$payload2.out += "<!--[!-->";
574
- }
575
- $$payload2.out += `<!--]--></div>`;
574
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(INTEGRATIONS_LABEL)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(INTEGRATIONS_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(WEBHOOKS_CARD_TITLE)}</p> <div class="field"><label class="field-label svelte-m3ck68" for="discord-url"><span>${escape_html(DISCORD_WEBHOOK_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(DISCORD_WEBHOOK_HINT)}</span></label> <input id="discord-url" type="url" class="field-input"${attr("value", integrations.discordWebhookUrl)}${attr("placeholder", DISCORD_WEBHOOK_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68" for="slack-url"><span>${escape_html(SLACK_WEBHOOK_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(SLACK_WEBHOOK_HINT)}</span></label> <input id="slack-url" type="url" class="field-input"${attr("value", integrations.slackWebhookUrl)}${attr("placeholder", SLACK_WEBHOOK_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68" for="public-url"><span>${escape_html(PUBLIC_URL_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(PUBLIC_URL_HINT)}</span></label> <input id="public-url" type="url" class="field-input"${attr("value", integrations.notifyPublicUrl)}${attr("placeholder", PUBLIC_URL_PLACEHOLDER)}></div> `;
575
+ Button($$payload2, {
576
+ disabled: integrationsSaving,
577
+ children: ($$payload3) => {
578
+ $$payload3.out += `<!---->${escape_html(saveIntegrationsLabel())}`;
579
+ },
580
+ $$slots: { default: true }
581
+ });
582
+ $$payload2.out += `<!----></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(CI_TRIGGERS_CARD_TITLE)}</p> <p class="content-desc svelte-m3ck68">${escape_html(CI_DESC_PART1)} <code class="code-sample svelte-m3ck68">POST ${escape_html(API_BASE)}/trigger</code> ${escape_html(CI_DESC_PART2)} <code class="code-sample svelte-m3ck68">Authorization: ApiKey …</code> ${escape_html(CI_DESC_PART3)} <button class="link-btn svelte-m3ck68">${escape_html(MCP_TAB_LINK_LABEL)}</button> ${escape_html(CI_DESC_PART4)} `;
583
+ Badge($$payload2, {
584
+ variant: "external",
585
+ children: ($$payload3) => {
586
+ $$payload3.out += `<!---->${escape_html(EXTERNAL_BADGE_LABEL)}`;
587
+ },
588
+ $$slots: { default: true }
589
+ });
590
+ $$payload2.out += `<!---->.</p> <pre class="mcp-snippet svelte-m3ck68">${escape_html(ciWorkflowSnippet)}</pre> <div class="card-footer svelte-m3ck68">`;
591
+ Button($$payload2, {
592
+ variant: "ghost",
593
+ children: ($$payload3) => {
594
+ $$payload3.out += `<!---->${escape_html(copyCiSnippetLabel())}`;
595
+ },
596
+ $$slots: { default: true }
597
+ });
598
+ $$payload2.out += `<!----></div></div></div>`;
576
599
  } else {
577
600
  $$payload2.out += "<!--[!-->";
578
- if (section === "account") {
601
+ if (section === "mcp") {
579
602
  $$payload2.out += "<!--[-->";
580
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(ACCOUNT_LABEL)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(ACCOUNT_DESC)}</p></div> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(PROFILE_CARD_TITLE)}</p> <div class="field"><label class="field-label svelte-1b139ls" for="profile-name">${escape_html(NAME_LABEL)}</label> <input id="profile-name" type="text" class="field-input"${attr("value", profileForm.name)}></div> <div class="field"><label class="field-label svelte-1b139ls" for="profile-email">${escape_html(EMAIL_LABEL)}</label> <input id="profile-email" type="email" class="field-input"${attr("value", profileForm.email)}></div> `;
603
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(MCP_HEADING)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(MCP_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(API_KEY_CARD_TITLE)}</p> `;
581
604
  {
582
- $$payload2.out += "<!--[!-->";
605
+ $$payload2.out += "<!--[-->";
606
+ $$payload2.out += `<p class="content-desc svelte-m3ck68">${escape_html(NO_KEY_GENERATED_MESSAGE)}</p> <div class="card-footer svelte-m3ck68">`;
607
+ Button($$payload2, {
608
+ disabled: mcpGenerating,
609
+ children: ($$payload3) => {
610
+ $$payload3.out += `<!---->${escape_html(generateKeyLabel())}`;
611
+ },
612
+ $$slots: { default: true }
613
+ });
614
+ $$payload2.out += `<!----></div>`;
583
615
  }
584
- $$payload2.out += `<!--]--> <div class="card-footer svelte-1b139ls">`;
585
- Button($$payload2, {
586
- disabled: true,
587
- children: ($$payload3) => {
588
- $$payload3.out += `<!---->${escape_html(saveProfileLabel())}`;
589
- },
590
- $$slots: { default: true }
591
- });
592
- $$payload2.out += `<!----></div></div> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(CHANGE_PASSWORD_CARD_TITLE)}</p> <div class="field"><label class="field-label svelte-1b139ls" for="pw-current">${escape_html(CURRENT_PASSWORD_LABEL)}</label> <input id="pw-current" type="password" class="field-input"${attr("value", pwForm.currentPassword)} autocomplete="current-password"></div> <div class="field"><label class="field-label svelte-1b139ls" for="pw-new">${escape_html(NEW_PASSWORD_LABEL)}</label> <input id="pw-new" type="password" class="field-input"${attr("value", pwForm.newPassword)} autocomplete="new-password"></div> <div class="field"><label class="field-label svelte-1b139ls" for="pw-confirm">${escape_html(CONFIRM_NEW_PASSWORD_LABEL)}</label> <input id="pw-confirm" type="password" class="field-input"${attr("value", pwForm.confirmPassword)} autocomplete="new-password"></div> `;
616
+ $$payload2.out += `<!--]--></div> `;
593
617
  {
594
618
  $$payload2.out += "<!--[!-->";
595
619
  }
596
- $$payload2.out += `<!--]--> <div class="card-footer svelte-1b139ls">`;
597
- Button($$payload2, {
598
- disabled: true,
599
- children: ($$payload3) => {
600
- $$payload3.out += `<!---->${escape_html(changePasswordLabel())}`;
601
- },
602
- $$slots: { default: true }
603
- });
604
- $$payload2.out += `<!----></div></div> <div class="card settings-card svelte-1b139ls"><div class="card-footer svelte-1b139ls">`;
605
- Button($$payload2, {
606
- variant: "danger",
607
- size: "sm",
608
- children: ($$payload3) => {
609
- $$payload3.out += `<!---->${escape_html(SIGN_OUT_LABEL)}`;
610
- },
611
- $$slots: { default: true }
612
- });
613
- $$payload2.out += `<!----></div></div></div>`;
620
+ $$payload2.out += `<!--]--></div>`;
614
621
  } else {
615
622
  $$payload2.out += "<!--[!-->";
616
- if (section === "users") {
623
+ if (section === "account") {
617
624
  $$payload2.out += "<!--[-->";
618
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(USERS_LABEL)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(USERS_DESC)}</p></div> `;
619
- ConfirmModal($$payload2, {
620
- title: REMOVE_USER_MODAL_TITLE,
621
- confirmLabel: REMOVE_USER_LABEL,
622
- get open() {
623
- return confirmDeleteUserOpen;
624
- },
625
- set open($$value) {
626
- confirmDeleteUserOpen = $$value;
627
- $$settled = false;
628
- },
625
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(ACCOUNT_LABEL)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(ACCOUNT_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(PROFILE_CARD_TITLE)}</p> <div class="field"><label class="field-label svelte-m3ck68" for="profile-name">${escape_html(NAME_LABEL)}</label> <input id="profile-name" type="text" class="field-input"${attr("value", profileForm.name)}></div> <div class="field"><label class="field-label svelte-m3ck68" for="profile-email">${escape_html(EMAIL_LABEL)}</label> <input id="profile-email" type="email" class="field-input"${attr("value", profileForm.email)}></div> `;
626
+ {
627
+ $$payload2.out += "<!--[!-->";
628
+ }
629
+ $$payload2.out += `<!--]--> <div class="card-footer svelte-m3ck68">`;
630
+ Button($$payload2, {
631
+ disabled: true,
629
632
  children: ($$payload3) => {
630
- {
631
- $$payload3.out += "<!--[!-->";
632
- }
633
- $$payload3.out += `<!--]-->`;
633
+ $$payload3.out += `<!---->${escape_html(saveProfileLabel())}`;
634
634
  },
635
635
  $$slots: { default: true }
636
636
  });
637
- $$payload2.out += `<!----> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(ADD_USER_CARD_TITLE)}</p> <div class="field-row svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="u-name">${escape_html(NAME_LABEL)}</label> <input id="u-name" type="text" class="field-input"${attr("value", userForm.name)}${attr("placeholder", USER_NAME_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls" for="u-email">${escape_html(EMAIL_LABEL)}</label> <input id="u-email" type="email" class="field-input"${attr("value", userForm.email)}${attr("placeholder", USER_EMAIL_PLACEHOLDER)}></div></div> <div class="field-row svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="u-pw">${escape_html(PASSWORD_LABEL)}</label> <input id="u-pw" type="password" class="field-input"${attr("value", userForm.password)} autocomplete="new-password"></div> <div class="field"><label class="field-label svelte-1b139ls" for="u-role">${escape_html(ROLE_LABEL)}</label> <select id="u-role" class="field-input"><option value="user">${escape_html(USER_ROLE_OPTION)}</option><option value="admin">${escape_html(ADMIN_ROLE_OPTION)}</option></select></div></div> `;
637
+ $$payload2.out += `<!----></div></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(CHANGE_PASSWORD_CARD_TITLE)}</p> <div class="field"><label class="field-label svelte-m3ck68" for="pw-current">${escape_html(CURRENT_PASSWORD_LABEL)}</label> <input id="pw-current" type="password" class="field-input"${attr("value", pwForm.currentPassword)} autocomplete="current-password"></div> <div class="field"><label class="field-label svelte-m3ck68" for="pw-new">${escape_html(NEW_PASSWORD_LABEL)}</label> <input id="pw-new" type="password" class="field-input"${attr("value", pwForm.newPassword)} autocomplete="new-password"></div> <div class="field"><label class="field-label svelte-m3ck68" for="pw-confirm">${escape_html(CONFIRM_NEW_PASSWORD_LABEL)}</label> <input id="pw-confirm" type="password" class="field-input"${attr("value", pwForm.confirmPassword)} autocomplete="new-password"></div> `;
638
638
  {
639
639
  $$payload2.out += "<!--[!-->";
640
640
  }
641
- $$payload2.out += `<!--]--> <div class="card-footer svelte-1b139ls">`;
641
+ $$payload2.out += `<!--]--> <div class="card-footer svelte-m3ck68">`;
642
642
  Button($$payload2, {
643
- disabled: userFormSaving,
643
+ disabled: true,
644
644
  children: ($$payload3) => {
645
- $$payload3.out += `<!---->${escape_html(addUserLabel())}`;
645
+ $$payload3.out += `<!---->${escape_html(changePasswordLabel())}`;
646
646
  },
647
647
  $$slots: { default: true }
648
648
  });
649
- $$payload2.out += `<!----></div></div> `;
650
- if (allUsers.length > 0) {
651
- $$payload2.out += "<!--[-->";
652
- const each_array_5 = ensure_array_like(allUsers);
653
- $$payload2.out += `<div class="users-table svelte-1b139ls"><!--[-->`;
654
- for (let $$index_5 = 0, $$length = each_array_5.length; $$index_5 < $$length; $$index_5++) {
655
- let u = each_array_5[$$index_5];
656
- $$payload2.out += `<div class="user-row svelte-1b139ls"><div class="user-info svelte-1b139ls"><span class="user-name svelte-1b139ls">${escape_html(u.name)}</span> <span class="user-email svelte-1b139ls">${escape_html(u.email)}</span></div> <span${attr("class", `role-chip ${stringify(u.role)} svelte-1b139ls`)}>${escape_html(u.role)}</span> `;
657
- if (u.id !== store_get($$store_subs ??= {}, "$auth", auth).user?.id) {
658
- $$payload2.out += "<!--[-->";
659
- $$payload2.out += `<button class="icon-btn danger svelte-1b139ls"${attr("title", REMOVE_USER_ICON_TITLE)}><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"></path><path d="M10 11v6M14 11v6"></path><path d="M9 6V4h6v2"></path></svg></button>`;
660
- } else {
661
- $$payload2.out += "<!--[!-->";
662
- $$payload2.out += `<span class="you-chip svelte-1b139ls">${escape_html(YOU_CHIP_LABEL)}</span>`;
663
- }
664
- $$payload2.out += `<!--]--></div>`;
665
- }
666
- $$payload2.out += `<!--]--></div>`;
667
- } else {
668
- $$payload2.out += "<!--[!-->";
669
- }
670
- $$payload2.out += `<!--]--></div>`;
649
+ $$payload2.out += `<!----></div></div> <div class="card settings-card svelte-m3ck68"><div class="card-footer svelte-m3ck68">`;
650
+ Button($$payload2, {
651
+ variant: "danger",
652
+ size: "sm",
653
+ children: ($$payload3) => {
654
+ $$payload3.out += `<!---->${escape_html(SIGN_OUT_LABEL)}`;
655
+ },
656
+ $$slots: { default: true }
657
+ });
658
+ $$payload2.out += `<!----></div></div></div>`;
671
659
  } else {
672
660
  $$payload2.out += "<!--[!-->";
673
- if (section === "backup") {
661
+ if (section === "users") {
674
662
  $$payload2.out += "<!--[-->";
675
- $$payload2.out += `<div class="content-section svelte-1b139ls"><div class="content-header svelte-1b139ls"><h2 class="svelte-1b139ls">${escape_html(BACKUP_LABEL)}</h2> <p class="content-desc svelte-1b139ls">${escape_html(BACKUP_DESC)}</p></div> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(MANUAL_BACKUP_CARD_TITLE)}</p> <div class="backup-row svelte-1b139ls"><div class="backup-block svelte-1b139ls"><p class="backup-block-title svelte-1b139ls">${escape_html(EXPORT_BLOCK_TITLE)}</p> <p class="backup-block-desc svelte-1b139ls">${escape_html(EXPORT_BLOCK_DESC_PREFIX)} <code class="svelte-1b139ls">.json</code> ${escape_html(EXPORT_BLOCK_DESC_SUFFIX)}</p> `;
676
- Button($$payload2, {
677
- disabled: exporting,
678
- children: ($$payload3) => {
679
- $$payload3.out += `<!---->${escape_html(exportLabel())}`;
680
- },
681
- $$slots: { default: true }
682
- });
683
- $$payload2.out += `<!----></div> <div class="backup-divider svelte-1b139ls"></div> <div class="backup-block svelte-1b139ls"><p class="backup-block-title svelte-1b139ls">${escape_html(IMPORT_BLOCK_TITLE)}</p> <p class="backup-block-desc svelte-1b139ls">${escape_html(IMPORT_BLOCK_DESC)}</p> <div class="import-row svelte-1b139ls"><label class="file-label svelte-1b139ls"><input type="file" accept=".json" class="file-input-hidden svelte-1b139ls"> <span class="file-btn svelte-1b139ls">${escape_html(CHOOSE_FILE_LABEL)}</span></label> `;
684
- Button($$payload2, {
685
- disabled: true,
686
- children: ($$payload3) => {
687
- $$payload3.out += `<!---->${escape_html(importLabel())}`;
688
- },
689
- $$slots: { default: true }
690
- });
691
- $$payload2.out += `<!----></div></div></div> <div class="include-reports-row svelte-1b139ls"><label class="field-label backup-toggle-label svelte-1b139ls" for="include-reports"><span class="svelte-1b139ls">${escape_html(INCLUDE_REPORTS_LABEL)} <span class="field-hint svelte-1b139ls">${escape_html(INCLUDE_REPORTS_HINT)}</span></span> <button id="include-reports"${attr("class", `toggle-btn svelte-1b139ls ${stringify([
692
- ""
693
- ].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", backupConfig.backupIncludeReports)}><span class="toggle-thumb svelte-1b139ls"></span></button></label> `;
694
- Button($$payload2, {
695
- variant: "ghost",
696
- disabled: includeReportsSaving,
697
- children: ($$payload3) => {
698
- $$payload3.out += `<!---->${escape_html(saveIncludeReportsLabel())}`;
699
- },
700
- $$slots: { default: true }
701
- });
702
- $$payload2.out += `<!----></div> <p class="backup-disclaimer svelte-1b139ls">${escape_html(includeReportsDisclaimer())}</p></div> <div class="card settings-card svelte-1b139ls"><p class="card-title">${escape_html(S3_STORAGE_CARD_TITLE)}</p> <p class="backup-block-desc svelte-1b139ls" style="margin-bottom: 1.25rem;">${escape_html(S3_STORAGE_DESC_PREFIX)} <strong>${escape_html(ENDPOINT_URL_LABEL)}</strong> ${escape_html(S3_STORAGE_DESC_SUFFIX)}</p> <div class="field-row svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="s3-endpoint"><span>${escape_html(ENDPOINT_URL_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(ENDPOINT_URL_HINT)}</span></label> <input id="s3-endpoint" type="url" class="field-input"${attr("value", backupConfig.backupS3Endpoint)}${attr("placeholder", ENDPOINT_URL_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls" for="s3-region"><span>${escape_html(REGION_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(REGION_HINT_PREFIX)} <code>auto</code> ${escape_html(REGION_HINT_SUFFIX)}</span></label> <input id="s3-region" type="text" class="field-input"${attr("value", backupConfig.backupS3Region)}${attr("placeholder", REGION_PLACEHOLDER)}></div></div> <div class="field-row svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="s3-bucket"><span>${escape_html(BUCKET_LABEL)}</span></label> <input id="s3-bucket" type="text" class="field-input"${attr("value", backupConfig.backupS3Bucket)}${attr("placeholder", BUCKET_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-1b139ls" for="s3-prefix"><span>${escape_html(PATH_PREFIX_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(PATH_PREFIX_HINT)}</span></label> <input id="s3-prefix" type="text" class="field-input"${attr("value", backupConfig.backupS3Prefix)}${attr("placeholder", PATH_PREFIX_PLACEHOLDER)}></div></div> <div class="field-row svelte-1b139ls"><div class="field"><label class="field-label svelte-1b139ls" for="s3-access-key"><span>${escape_html(ACCESS_KEY_LABEL)}</span></label> <input id="s3-access-key" type="text" class="field-input"${attr("value", backupConfig.backupS3AccessKey)}${attr("placeholder", ACCESS_KEY_PLACEHOLDER)} autocomplete="off"></div> <div class="field"><label class="field-label svelte-1b139ls" for="s3-secret-key"><span>${escape_html(SECRET_KEY_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(secretKeyHint())}</span></label> <input id="s3-secret-key" type="password" class="field-input"${attr("value", backupConfig.backupS3SecretKey)}${attr("placeholder", secretKeyPlaceholder(backupS3SecretKeySet))} autocomplete="new-password"></div></div> <div class="backup-actions svelte-1b139ls">`;
703
- Button($$payload2, {
704
- variant: "ghost",
705
- disabled: backupTestingS3,
706
- children: ($$payload3) => {
707
- $$payload3.out += `<!---->${escape_html(testConnectionLabel())}`;
708
- },
709
- $$slots: { default: true }
710
- });
711
- $$payload2.out += `<!----> `;
712
- Button($$payload2, {
713
- disabled: backupConfigSaving,
714
- children: ($$payload3) => {
715
- $$payload3.out += `<!---->${escape_html(saveS3ConfigLabel())}`;
716
- },
717
- $$slots: { default: true }
718
- });
719
- $$payload2.out += `<!----></div> `;
720
- {
721
- $$payload2.out += "<!--[!-->";
722
- }
723
- $$payload2.out += `<!--]--></div> `;
663
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(USERS_LABEL)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(USERS_DESC)}</p></div> `;
724
664
  ConfirmModal($$payload2, {
725
- title: RESTORE_CONFIRM_TITLE,
726
- confirmLabel: restoreLabel(false),
727
- loading: false,
665
+ title: REMOVE_USER_MODAL_TITLE,
666
+ confirmLabel: REMOVE_USER_LABEL,
728
667
  get open() {
729
- return restoreConfirmOpen;
668
+ return confirmDeleteUserOpen;
730
669
  },
731
670
  set open($$value) {
732
- restoreConfirmOpen = $$value;
671
+ confirmDeleteUserOpen = $$value;
733
672
  $$settled = false;
734
673
  },
735
674
  children: ($$payload3) => {
@@ -740,67 +679,77 @@ function _page($$payload, $$props) {
740
679
  },
741
680
  $$slots: { default: true }
742
681
  });
743
- $$payload2.out += `<!----> <div${attr("class", `card settings-card svelte-1b139ls ${stringify([!s3Configured ? "card-disabled" : ""].filter(Boolean).join(" "))}`)}><div class="card-title-row svelte-1b139ls"><p class="card-title svelte-1b139ls">${escape_html(RESTORE_FROM_S3_CARD_TITLE)}</p> `;
744
- if (s3Configured) {
745
- $$payload2.out += "<!--[-->";
746
- Button($$payload2, {
747
- variant: "ghost",
748
- disabled: loadingS3Backups,
749
- children: ($$payload3) => {
750
- $$payload3.out += `<!---->${escape_html(refreshingLabel(loadingS3Backups))}`;
751
- },
752
- $$slots: { default: true }
753
- });
754
- } else {
682
+ $$payload2.out += `<!----> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(ADD_USER_CARD_TITLE)}</p> <div class="field-row svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="u-name">${escape_html(NAME_LABEL)}</label> <input id="u-name" type="text" class="field-input"${attr("value", userForm.name)}${attr("placeholder", USER_NAME_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68" for="u-email">${escape_html(EMAIL_LABEL)}</label> <input id="u-email" type="email" class="field-input"${attr("value", userForm.email)}${attr("placeholder", USER_EMAIL_PLACEHOLDER)}></div></div> <div class="field-row svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="u-pw">${escape_html(PASSWORD_LABEL)}</label> <input id="u-pw" type="password" class="field-input"${attr("value", userForm.password)} autocomplete="new-password"></div> <div class="field"><label class="field-label svelte-m3ck68" for="u-role">${escape_html(ROLE_LABEL)}</label> <select id="u-role" class="field-input"><option value="user">${escape_html(USER_ROLE_OPTION)}</option><option value="admin">${escape_html(ADMIN_ROLE_OPTION)}</option></select></div></div> `;
683
+ {
755
684
  $$payload2.out += "<!--[!-->";
756
685
  }
757
- $$payload2.out += `<!--]--></div> `;
758
- if (!s3Configured) {
686
+ $$payload2.out += `<!--]--> <div class="card-footer svelte-m3ck68">`;
687
+ Button($$payload2, {
688
+ disabled: userFormSaving,
689
+ children: ($$payload3) => {
690
+ $$payload3.out += `<!---->${escape_html(addUserLabel())}`;
691
+ },
692
+ $$slots: { default: true }
693
+ });
694
+ $$payload2.out += `<!----></div></div> `;
695
+ if (allUsers.length > 0) {
759
696
  $$payload2.out += "<!--[-->";
760
- $$payload2.out += `<p class="backup-block-desc svelte-1b139ls">${escape_html(CONFIGURE_S3_FIRST_RESTORE_MESSAGE)}</p>`;
761
- } else {
762
- $$payload2.out += "<!--[!-->";
763
- $$payload2.out += `<p class="backup-block-desc svelte-1b139ls" style="margin-bottom: 1rem;">${escape_html(RESTORE_FROM_S3_DESC)}</p> `;
764
- if (s3Backups.length === 0) {
765
- $$payload2.out += "<!--[-->";
766
- $$payload2.out += `<p class="backup-block-desc svelte-1b139ls">${escape_html(loadingS3Backups ? refreshingLabel(true) : NO_S3_BACKUPS_MESSAGE)}</p>`;
767
- } else {
768
- $$payload2.out += "<!--[!-->";
769
- const each_array_6 = ensure_array_like(s3Backups);
770
- $$payload2.out += `<ul class="s3-backup-list svelte-1b139ls"><!--[-->`;
771
- for (let $$index_6 = 0, $$length = each_array_6.length; $$index_6 < $$length; $$index_6++) {
772
- let backup = each_array_6[$$index_6];
773
- $$payload2.out += `<li class="s3-backup-row svelte-1b139ls"><div class="s3-backup-info svelte-1b139ls"><span class="s3-backup-key svelte-1b139ls">${escape_html(backup.key)}</span> <span class="s3-backup-meta svelte-1b139ls">${escape_html(new Date(backup.lastModified).toLocaleString())} · ${escape_html(backupSizeLabel(backup.size))}</span></div> `;
774
- Button($$payload2, {
775
- variant: "ghost",
776
- disabled: restoringKey === backup.key,
777
- children: ($$payload3) => {
778
- $$payload3.out += `<!---->${escape_html(restoreLabel(restoringKey === backup.key))}`;
779
- },
780
- $$slots: { default: true }
781
- });
782
- $$payload2.out += `<!----></li>`;
697
+ const each_array_5 = ensure_array_like(allUsers);
698
+ $$payload2.out += `<div class="users-table svelte-m3ck68"><!--[-->`;
699
+ for (let $$index_5 = 0, $$length = each_array_5.length; $$index_5 < $$length; $$index_5++) {
700
+ let u = each_array_5[$$index_5];
701
+ $$payload2.out += `<div class="user-row svelte-m3ck68"><div class="user-info svelte-m3ck68"><span class="user-name svelte-m3ck68">${escape_html(u.name)}</span> <span class="user-email svelte-m3ck68">${escape_html(u.email)}</span></div> <span${attr("class", `role-chip ${stringify(u.role)} svelte-m3ck68`)}>${escape_html(u.role)}</span> `;
702
+ if (u.id !== store_get($$store_subs ??= {}, "$auth", auth).user?.id) {
703
+ $$payload2.out += "<!--[-->";
704
+ $$payload2.out += `<button class="icon-btn danger svelte-m3ck68"${attr("title", REMOVE_USER_ICON_TITLE)}><svg width="13" height="13" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><polyline points="3 6 5 6 21 6"></polyline><path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6"></path><path d="M10 11v6M14 11v6"></path><path d="M9 6V4h6v2"></path></svg></button>`;
705
+ } else {
706
+ $$payload2.out += "<!--[!-->";
707
+ $$payload2.out += `<span class="you-chip svelte-m3ck68">${escape_html(YOU_CHIP_LABEL)}</span>`;
783
708
  }
784
- $$payload2.out += `<!--]--></ul>`;
709
+ $$payload2.out += `<!--]--></div>`;
785
710
  }
786
- $$payload2.out += `<!--]-->`;
787
- }
788
- $$payload2.out += `<!--]--></div> <div${attr("class", `card settings-card svelte-1b139ls ${stringify([!s3Configured ? "card-disabled" : ""].filter(Boolean).join(" "))}`)}><p class="card-title">${escape_html(SCHEDULED_BACKUP_CARD_TITLE)}</p> `;
789
- if (!s3Configured) {
790
- $$payload2.out += "<!--[-->";
791
- $$payload2.out += `<p class="backup-block-desc svelte-1b139ls">${escape_html(CONFIGURE_S3_FIRST_MESSAGE)}</p>`;
711
+ $$payload2.out += `<!--]--></div>`;
792
712
  } else {
793
713
  $$payload2.out += "<!--[!-->";
794
- $$payload2.out += `<div class="field"><label class="field-label backup-toggle-label svelte-1b139ls" for="backup-enabled"><span>${escape_html(ENABLE_SCHEDULED_BACKUP_LABEL)}</span> <button id="backup-enabled"${attr("class", `toggle-btn svelte-1b139ls ${stringify([""].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", backupConfig.backupEnabled)}><span class="toggle-thumb svelte-1b139ls"></span></button></label></div> <div class="field"><label class="field-label svelte-1b139ls" for="backup-cron"><span>${escape_html(CRON_EXPRESSION_LABEL)}</span> <span class="field-hint svelte-1b139ls">${escape_html(CRON_HINT_PREFIX)} <code>0 2 * * *</code> ${escape_html(CRON_HINT_SUFFIX)} <a href="https://crontab.guru" target="_blank" rel="noopener noreferrer">${escape_html(CRONTAB_LINK_LABEL)}</a></span></label> <input id="backup-cron" type="text" class="field-input field-input-mono svelte-1b139ls"${attr("value", backupConfig.backupCron)}${attr("placeholder", CRON_PLACEHOLDER)}></div> `;
795
- {
796
- $$payload2.out += "<!--[!-->";
797
- }
798
- $$payload2.out += `<!--]--> <div class="backup-actions svelte-1b139ls">`;
714
+ }
715
+ $$payload2.out += `<!--]--></div>`;
716
+ } else {
717
+ $$payload2.out += "<!--[!-->";
718
+ if (section === "backup") {
719
+ $$payload2.out += "<!--[-->";
720
+ $$payload2.out += `<div class="content-section svelte-m3ck68"><div class="content-header svelte-m3ck68"><h2 class="svelte-m3ck68">${escape_html(BACKUP_LABEL)}</h2> <p class="content-desc svelte-m3ck68">${escape_html(BACKUP_DESC)}</p></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(MANUAL_BACKUP_CARD_TITLE)}</p> <div class="backup-row svelte-m3ck68"><div class="backup-block svelte-m3ck68"><p class="backup-block-title svelte-m3ck68">${escape_html(EXPORT_BLOCK_TITLE)}</p> <p class="backup-block-desc svelte-m3ck68">${escape_html(EXPORT_BLOCK_DESC_PREFIX)} <code class="svelte-m3ck68">.json</code> ${escape_html(EXPORT_BLOCK_DESC_SUFFIX)}</p> `;
721
+ Button($$payload2, {
722
+ disabled: exporting,
723
+ children: ($$payload3) => {
724
+ $$payload3.out += `<!---->${escape_html(exportLabel())}`;
725
+ },
726
+ $$slots: { default: true }
727
+ });
728
+ $$payload2.out += `<!----></div> <div class="backup-divider svelte-m3ck68"></div> <div class="backup-block svelte-m3ck68"><p class="backup-block-title svelte-m3ck68">${escape_html(IMPORT_BLOCK_TITLE)}</p> <p class="backup-block-desc svelte-m3ck68">${escape_html(IMPORT_BLOCK_DESC)}</p> <div class="import-row svelte-m3ck68"><label class="file-label svelte-m3ck68"><input type="file" accept=".json" class="file-input-hidden svelte-m3ck68"> <span class="file-btn svelte-m3ck68">${escape_html(CHOOSE_FILE_LABEL)}</span></label> `;
729
+ Button($$payload2, {
730
+ disabled: true,
731
+ children: ($$payload3) => {
732
+ $$payload3.out += `<!---->${escape_html(importLabel())}`;
733
+ },
734
+ $$slots: { default: true }
735
+ });
736
+ $$payload2.out += `<!----></div></div></div> <div class="include-reports-row svelte-m3ck68"><label class="field-label backup-toggle-label svelte-m3ck68" for="include-reports"><span class="svelte-m3ck68">${escape_html(INCLUDE_REPORTS_LABEL)} <span class="field-hint svelte-m3ck68">${escape_html(INCLUDE_REPORTS_HINT)}</span></span> <button id="include-reports"${attr("class", `toggle-btn svelte-m3ck68 ${stringify([
737
+ ""
738
+ ].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", backupConfig.backupIncludeReports)}><span class="toggle-thumb svelte-m3ck68"></span></button></label> `;
739
+ Button($$payload2, {
740
+ variant: "ghost",
741
+ disabled: includeReportsSaving,
742
+ children: ($$payload3) => {
743
+ $$payload3.out += `<!---->${escape_html(saveIncludeReportsLabel())}`;
744
+ },
745
+ $$slots: { default: true }
746
+ });
747
+ $$payload2.out += `<!----></div> <p class="backup-disclaimer svelte-m3ck68">${escape_html(includeReportsDisclaimer())}</p></div> <div class="card settings-card svelte-m3ck68"><p class="card-title">${escape_html(S3_STORAGE_CARD_TITLE)}</p> <p class="backup-block-desc svelte-m3ck68" style="margin-bottom: 1.25rem;">${escape_html(S3_STORAGE_DESC_PREFIX)} <strong>${escape_html(ENDPOINT_URL_LABEL)}</strong> ${escape_html(S3_STORAGE_DESC_SUFFIX)}</p> <div class="field-row svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="s3-endpoint"><span>${escape_html(ENDPOINT_URL_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(ENDPOINT_URL_HINT)}</span></label> <input id="s3-endpoint" type="url" class="field-input"${attr("value", backupConfig.backupS3Endpoint)}${attr("placeholder", ENDPOINT_URL_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68" for="s3-region"><span>${escape_html(REGION_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(REGION_HINT_PREFIX)} <code>auto</code> ${escape_html(REGION_HINT_SUFFIX)}</span></label> <input id="s3-region" type="text" class="field-input"${attr("value", backupConfig.backupS3Region)}${attr("placeholder", REGION_PLACEHOLDER)}></div></div> <div class="field-row svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="s3-bucket"><span>${escape_html(BUCKET_LABEL)}</span></label> <input id="s3-bucket" type="text" class="field-input"${attr("value", backupConfig.backupS3Bucket)}${attr("placeholder", BUCKET_PLACEHOLDER)}></div> <div class="field"><label class="field-label svelte-m3ck68" for="s3-prefix"><span>${escape_html(PATH_PREFIX_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(PATH_PREFIX_HINT)}</span></label> <input id="s3-prefix" type="text" class="field-input"${attr("value", backupConfig.backupS3Prefix)}${attr("placeholder", PATH_PREFIX_PLACEHOLDER)}></div></div> <div class="field-row svelte-m3ck68"><div class="field"><label class="field-label svelte-m3ck68" for="s3-access-key"><span>${escape_html(ACCESS_KEY_LABEL)}</span></label> <input id="s3-access-key" type="text" class="field-input"${attr("value", backupConfig.backupS3AccessKey)}${attr("placeholder", ACCESS_KEY_PLACEHOLDER)} autocomplete="off"></div> <div class="field"><label class="field-label svelte-m3ck68" for="s3-secret-key"><span>${escape_html(SECRET_KEY_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(secretKeyHint())}</span></label> <input id="s3-secret-key" type="password" class="field-input"${attr("value", backupConfig.backupS3SecretKey)}${attr("placeholder", secretKeyPlaceholder(backupS3SecretKeySet))} autocomplete="new-password"></div></div> <div class="backup-actions svelte-m3ck68">`;
799
748
  Button($$payload2, {
800
749
  variant: "ghost",
801
- disabled: backupRunningNow,
750
+ disabled: backupTestingS3,
802
751
  children: ($$payload3) => {
803
- $$payload3.out += `<!---->${escape_html(uploadS3NowLabel())}`;
752
+ $$payload3.out += `<!---->${escape_html(testConnectionLabel())}`;
804
753
  },
805
754
  $$slots: { default: true }
806
755
  });
@@ -808,15 +757,113 @@ function _page($$payload, $$props) {
808
757
  Button($$payload2, {
809
758
  disabled: backupConfigSaving,
810
759
  children: ($$payload3) => {
811
- $$payload3.out += `<!---->${escape_html(saveScheduleLabel())}`;
760
+ $$payload3.out += `<!---->${escape_html(saveS3ConfigLabel())}`;
761
+ },
762
+ $$slots: { default: true }
763
+ });
764
+ $$payload2.out += `<!----></div> `;
765
+ {
766
+ $$payload2.out += "<!--[!-->";
767
+ }
768
+ $$payload2.out += `<!--]--></div> `;
769
+ ConfirmModal($$payload2, {
770
+ title: RESTORE_CONFIRM_TITLE,
771
+ confirmLabel: restoreLabel(false),
772
+ loading: false,
773
+ get open() {
774
+ return restoreConfirmOpen;
775
+ },
776
+ set open($$value) {
777
+ restoreConfirmOpen = $$value;
778
+ $$settled = false;
779
+ },
780
+ children: ($$payload3) => {
781
+ {
782
+ $$payload3.out += "<!--[!-->";
783
+ }
784
+ $$payload3.out += `<!--]-->`;
812
785
  },
813
786
  $$slots: { default: true }
814
787
  });
815
- $$payload2.out += `<!----></div>`;
788
+ $$payload2.out += `<!----> <div${attr("class", `card settings-card svelte-m3ck68 ${stringify([!s3Configured ? "card-disabled" : ""].filter(Boolean).join(" "))}`)}><div class="card-title-row svelte-m3ck68"><p class="card-title svelte-m3ck68">${escape_html(RESTORE_FROM_S3_CARD_TITLE)}</p> `;
789
+ if (s3Configured) {
790
+ $$payload2.out += "<!--[-->";
791
+ Button($$payload2, {
792
+ variant: "ghost",
793
+ disabled: loadingS3Backups,
794
+ children: ($$payload3) => {
795
+ $$payload3.out += `<!---->${escape_html(refreshingLabel(loadingS3Backups))}`;
796
+ },
797
+ $$slots: { default: true }
798
+ });
799
+ } else {
800
+ $$payload2.out += "<!--[!-->";
801
+ }
802
+ $$payload2.out += `<!--]--></div> `;
803
+ if (!s3Configured) {
804
+ $$payload2.out += "<!--[-->";
805
+ $$payload2.out += `<p class="backup-block-desc svelte-m3ck68">${escape_html(CONFIGURE_S3_FIRST_RESTORE_MESSAGE)}</p>`;
806
+ } else {
807
+ $$payload2.out += "<!--[!-->";
808
+ $$payload2.out += `<p class="backup-block-desc svelte-m3ck68" style="margin-bottom: 1rem;">${escape_html(RESTORE_FROM_S3_DESC)}</p> `;
809
+ if (s3Backups.length === 0) {
810
+ $$payload2.out += "<!--[-->";
811
+ $$payload2.out += `<p class="backup-block-desc svelte-m3ck68">${escape_html(loadingS3Backups ? refreshingLabel(true) : NO_S3_BACKUPS_MESSAGE)}</p>`;
812
+ } else {
813
+ $$payload2.out += "<!--[!-->";
814
+ const each_array_6 = ensure_array_like(s3Backups);
815
+ $$payload2.out += `<ul class="s3-backup-list svelte-m3ck68"><!--[-->`;
816
+ for (let $$index_6 = 0, $$length = each_array_6.length; $$index_6 < $$length; $$index_6++) {
817
+ let backup = each_array_6[$$index_6];
818
+ $$payload2.out += `<li class="s3-backup-row svelte-m3ck68"><div class="s3-backup-info svelte-m3ck68"><span class="s3-backup-key svelte-m3ck68">${escape_html(backup.key)}</span> <span class="s3-backup-meta svelte-m3ck68">${escape_html(new Date(backup.lastModified).toLocaleString())} · ${escape_html(backupSizeLabel(backup.size))}</span></div> `;
819
+ Button($$payload2, {
820
+ variant: "ghost",
821
+ disabled: restoringKey === backup.key,
822
+ children: ($$payload3) => {
823
+ $$payload3.out += `<!---->${escape_html(restoreLabel(restoringKey === backup.key))}`;
824
+ },
825
+ $$slots: { default: true }
826
+ });
827
+ $$payload2.out += `<!----></li>`;
828
+ }
829
+ $$payload2.out += `<!--]--></ul>`;
830
+ }
831
+ $$payload2.out += `<!--]-->`;
832
+ }
833
+ $$payload2.out += `<!--]--></div> <div${attr("class", `card settings-card svelte-m3ck68 ${stringify([!s3Configured ? "card-disabled" : ""].filter(Boolean).join(" "))}`)}><p class="card-title">${escape_html(SCHEDULED_BACKUP_CARD_TITLE)}</p> `;
834
+ if (!s3Configured) {
835
+ $$payload2.out += "<!--[-->";
836
+ $$payload2.out += `<p class="backup-block-desc svelte-m3ck68">${escape_html(CONFIGURE_S3_FIRST_MESSAGE)}</p>`;
837
+ } else {
838
+ $$payload2.out += "<!--[!-->";
839
+ $$payload2.out += `<div class="field"><label class="field-label backup-toggle-label svelte-m3ck68" for="backup-enabled"><span>${escape_html(ENABLE_SCHEDULED_BACKUP_LABEL)}</span> <button id="backup-enabled"${attr("class", `toggle-btn svelte-m3ck68 ${stringify([""].filter(Boolean).join(" "))}`)} role="switch"${attr("aria-checked", backupConfig.backupEnabled)}><span class="toggle-thumb svelte-m3ck68"></span></button></label></div> <div class="field"><label class="field-label svelte-m3ck68" for="backup-cron"><span>${escape_html(CRON_EXPRESSION_LABEL)}</span> <span class="field-hint svelte-m3ck68">${escape_html(CRON_HINT_PREFIX)} <code>0 2 * * *</code> ${escape_html(CRON_HINT_SUFFIX)} <a href="https://crontab.guru" target="_blank" rel="noopener noreferrer">${escape_html(CRONTAB_LINK_LABEL)}</a></span></label> <input id="backup-cron" type="text" class="field-input field-input-mono svelte-m3ck68"${attr("value", backupConfig.backupCron)}${attr("placeholder", CRON_PLACEHOLDER)}></div> `;
840
+ {
841
+ $$payload2.out += "<!--[!-->";
842
+ }
843
+ $$payload2.out += `<!--]--> <div class="backup-actions svelte-m3ck68">`;
844
+ Button($$payload2, {
845
+ variant: "ghost",
846
+ disabled: backupRunningNow,
847
+ children: ($$payload3) => {
848
+ $$payload3.out += `<!---->${escape_html(uploadS3NowLabel())}`;
849
+ },
850
+ $$slots: { default: true }
851
+ });
852
+ $$payload2.out += `<!----> `;
853
+ Button($$payload2, {
854
+ disabled: backupConfigSaving,
855
+ children: ($$payload3) => {
856
+ $$payload3.out += `<!---->${escape_html(saveScheduleLabel())}`;
857
+ },
858
+ $$slots: { default: true }
859
+ });
860
+ $$payload2.out += `<!----></div>`;
861
+ }
862
+ $$payload2.out += `<!--]--></div></div>`;
863
+ } else {
864
+ $$payload2.out += "<!--[!-->";
816
865
  }
817
- $$payload2.out += `<!--]--></div></div>`;
818
- } else {
819
- $$payload2.out += "<!--[!-->";
866
+ $$payload2.out += `<!--]-->`;
820
867
  }
821
868
  $$payload2.out += `<!--]-->`;
822
869
  }