@acutis/cli 0.1.2-dev.21 → 0.1.2-dev.22

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 (133) hide show
  1. package/.output/nitro.json +1 -1
  2. package/.output/public/_nuxt/1DjC7bBa.js +64 -0
  3. package/.output/public/_nuxt/BNJ2GN0A.js +1 -0
  4. package/.output/public/_nuxt/{b5tj-z25.js → BgV7uYhh.js} +1 -1
  5. package/.output/public/_nuxt/C0IyPp1C.js +28 -0
  6. package/.output/public/_nuxt/C5NzO9dO.js +1 -0
  7. package/.output/public/_nuxt/CUTaKHid.js +1 -0
  8. package/.output/public/_nuxt/DHNHaKIX.js +1 -0
  9. package/.output/public/_nuxt/DKFReY2j.js +1 -0
  10. package/.output/public/_nuxt/DXk74b-E.js +1 -0
  11. package/.output/public/_nuxt/Dc6npEU3.js +1 -0
  12. package/.output/public/_nuxt/DyrXGv84.js +1 -0
  13. package/.output/public/_nuxt/WurCawTj.js +3 -0
  14. package/.output/public/_nuxt/builds/latest.json +1 -1
  15. package/.output/public/_nuxt/builds/meta/f4520b8a-9c39-4e41-af7a-b806928ef3ac.json +1 -0
  16. package/.output/public/_nuxt/lH5PYs8w.js +1 -0
  17. package/.output/public/_nuxt/tags.C6gBUbEB.css +1 -0
  18. package/.output/public/_nuxt/zH54s-gB.js +6 -0
  19. package/.output/server/chunks/_/project.service.mjs +1 -1
  20. package/.output/server/chunks/build/{Pagination-D2AcUggP.mjs → Pagination-BuiQpYWD.mjs} +26 -26
  21. package/.output/server/chunks/build/{Pagination-D2AcUggP.mjs.map → Pagination-BuiQpYWD.mjs.map} +1 -1
  22. package/.output/server/chunks/build/{_...scenario_-D8fF8UCa.mjs → _...scenario_-PVjOOR8j.mjs} +606 -211
  23. package/.output/server/chunks/build/_...scenario_-PVjOOR8j.mjs.map +1 -0
  24. package/.output/server/chunks/build/{_slug_-0Xu9aQ3b.mjs → _slug_-COpWNGAB.mjs} +745 -416
  25. package/.output/server/chunks/build/_slug_-COpWNGAB.mjs.map +1 -0
  26. package/.output/server/chunks/build/{origin-_7Gia2Vr.mjs → origin-NWHPNXep.mjs} +594 -20
  27. package/.output/server/chunks/build/origin-NWHPNXep.mjs.map +1 -0
  28. package/.output/server/chunks/build/{pages-C0ubizZ3.mjs → pages-C7-vXRcH.mjs} +22 -25
  29. package/.output/server/chunks/build/{pages-C0ubizZ3.mjs.map → pages-C7-vXRcH.mjs.map} +1 -1
  30. package/.output/server/chunks/build/tags-X7K7nkM2.mjs +2079 -0
  31. package/.output/server/chunks/build/tags-X7K7nkM2.mjs.map +1 -0
  32. package/.output/server/chunks/nitro/nitro.mjs +142 -363
  33. package/.output/server/chunks/routes/renderer.mjs +2 -2
  34. package/.output/server/chunks/virtual/entry.mjs +29334 -29367
  35. package/.output/server/chunks/virtual/entry.mjs.map +1 -1
  36. package/.output/server/chunks/virtual/precomputed.mjs +1 -1
  37. package/.output/server/package.json +1 -1
  38. package/package.json +1 -1
  39. package/.output/public/_nuxt/9eLkUDDj.js +0 -1
  40. package/.output/public/_nuxt/ANcp5QFz.js +0 -1
  41. package/.output/public/_nuxt/BEQgcp5R.js +0 -1
  42. package/.output/public/_nuxt/BEk00u4_.js +0 -1
  43. package/.output/public/_nuxt/BGdmRvCK2.js +0 -8
  44. package/.output/public/_nuxt/BGkBW2ni2.js +0 -1
  45. package/.output/public/_nuxt/BKydt2Wp2.js +0 -4
  46. package/.output/public/_nuxt/BMLYuU_e.js +0 -1
  47. package/.output/public/_nuxt/BWJpSLJL.js +0 -1
  48. package/.output/public/_nuxt/BXpPYfMx.js +0 -1
  49. package/.output/public/_nuxt/BbjTtCyI.js +0 -3
  50. package/.output/public/_nuxt/Bd538XcA2.js +0 -1
  51. package/.output/public/_nuxt/Bp3A7I5W2.js +0 -1
  52. package/.output/public/_nuxt/BuOb9NX0.js +0 -1
  53. package/.output/public/_nuxt/C1tNhfTr.js +0 -1
  54. package/.output/public/_nuxt/C2KIeuhG.js +0 -1
  55. package/.output/public/_nuxt/C5uJN_MU.js +0 -1
  56. package/.output/public/_nuxt/CBVnImq2.js +0 -1
  57. package/.output/public/_nuxt/CDI0GNVb2.js +0 -1
  58. package/.output/public/_nuxt/CIFC2HNk.js +0 -1
  59. package/.output/public/_nuxt/CKps1Vc12.js +0 -3
  60. package/.output/public/_nuxt/CRH0iqnQ.js +0 -1
  61. package/.output/public/_nuxt/CTqLwyQP.js +0 -1
  62. package/.output/public/_nuxt/CU7sPrmY.js +0 -3
  63. package/.output/public/_nuxt/CfOqJVtU.js +0 -1
  64. package/.output/public/_nuxt/Ch1EeKHP.js +0 -1
  65. package/.output/public/_nuxt/Clv7nJ_T2.js +0 -1
  66. package/.output/public/_nuxt/CqZ7dV6a2.js +0 -64
  67. package/.output/public/_nuxt/D-7v7DZs.js +0 -1
  68. package/.output/public/_nuxt/DEJ3sRrh2.js +0 -1
  69. package/.output/public/_nuxt/DPM_BYFz2.js +0 -1
  70. package/.output/public/_nuxt/DQk6DVe-.js +0 -28
  71. package/.output/public/_nuxt/DXLPf3t6.js +0 -1
  72. package/.output/public/_nuxt/DtuQPKVG.js +0 -1
  73. package/.output/public/_nuxt/FvWrDx_z.js +0 -1
  74. package/.output/public/_nuxt/Gcazu-lR.js +0 -1
  75. package/.output/public/_nuxt/QcKfgokC.js +0 -1
  76. package/.output/public/_nuxt/XDsaI4JL.js +0 -1
  77. package/.output/public/_nuxt/builds/meta/b5eccb33-8028-439b-99f5-6377d84bdfed.json +0 -1
  78. package/.output/public/_nuxt/dCqlxK8U2.js +0 -1
  79. package/.output/public/_nuxt/f0o80Gcm.js +0 -1
  80. package/.output/public/_nuxt/k5q7GKnv.js +0 -1
  81. package/.output/public/_nuxt/modal.3A_G7d4A.css +0 -1
  82. package/.output/public/_nuxt/tLr-SJaf.js +0 -1
  83. package/.output/public/_nuxt/tags.B5A43CvD.css +0 -1
  84. package/.output/public/dev/sample-run.webm +0 -0
  85. package/.output/server/chunks/build/Alert-DX-UEOEY.mjs +0 -433
  86. package/.output/server/chunks/build/Alert-DX-UEOEY.mjs.map +0 -1
  87. package/.output/server/chunks/build/Badge-DCotJtd8.mjs +0 -394
  88. package/.output/server/chunks/build/Badge-DCotJtd8.mjs.map +0 -1
  89. package/.output/server/chunks/build/Card-D7QwltkF.mjs +0 -144
  90. package/.output/server/chunks/build/Card-D7QwltkF.mjs.map +0 -1
  91. package/.output/server/chunks/build/Container-Biz72Lxy.mjs +0 -55
  92. package/.output/server/chunks/build/Container-Biz72Lxy.mjs.map +0 -1
  93. package/.output/server/chunks/build/_...scenario_-D8fF8UCa.mjs.map +0 -1
  94. package/.output/server/chunks/build/_slug_-0Xu9aQ3b.mjs.map +0 -1
  95. package/.output/server/chunks/build/auth-status-kUEDoxDI.mjs +0 -53
  96. package/.output/server/chunks/build/auth-status-kUEDoxDI.mjs.map +0 -1
  97. package/.output/server/chunks/build/auth-status-kswM9iTW.mjs +0 -128
  98. package/.output/server/chunks/build/auth-status-kswM9iTW.mjs.map +0 -1
  99. package/.output/server/chunks/build/empty-D8gbt7LG.mjs +0 -44
  100. package/.output/server/chunks/build/empty-D8gbt7LG.mjs.map +0 -1
  101. package/.output/server/chunks/build/generation-warnings-D4Br9kVN.mjs +0 -123
  102. package/.output/server/chunks/build/generation-warnings-D4Br9kVN.mjs.map +0 -1
  103. package/.output/server/chunks/build/history-eVF-ijkS.mjs +0 -163
  104. package/.output/server/chunks/build/history-eVF-ijkS.mjs.map +0 -1
  105. package/.output/server/chunks/build/modal-CELo8GdZ.mjs +0 -342
  106. package/.output/server/chunks/build/modal-CELo8GdZ.mjs.map +0 -1
  107. package/.output/server/chunks/build/modal-CUNv4bFw.mjs +0 -659
  108. package/.output/server/chunks/build/modal-CUNv4bFw.mjs.map +0 -1
  109. package/.output/server/chunks/build/modal-Cl4zRASg.mjs +0 -321
  110. package/.output/server/chunks/build/modal-Cl4zRASg.mjs.map +0 -1
  111. package/.output/server/chunks/build/origin-_7Gia2Vr.mjs.map +0 -1
  112. package/.output/server/chunks/build/phrases-rvaRKDG_.mjs +0 -38
  113. package/.output/server/chunks/build/phrases-rvaRKDG_.mjs.map +0 -1
  114. package/.output/server/chunks/build/project-run-filtered-DFIlti8u.mjs +0 -455
  115. package/.output/server/chunks/build/project-run-filtered-DFIlti8u.mjs.map +0 -1
  116. package/.output/server/chunks/build/run-stream-CNVDpZ_S.mjs +0 -157
  117. package/.output/server/chunks/build/run-stream-CNVDpZ_S.mjs.map +0 -1
  118. package/.output/server/chunks/build/scenario-runs-bilf1StX.mjs +0 -135
  119. package/.output/server/chunks/build/scenario-runs-bilf1StX.mjs.map +0 -1
  120. package/.output/server/chunks/build/scenario-suggestions-CMPsmNXz.mjs +0 -210
  121. package/.output/server/chunks/build/scenario-suggestions-CMPsmNXz.mjs.map +0 -1
  122. package/.output/server/chunks/build/scenario-test-run-DIjyHDe-.mjs +0 -505
  123. package/.output/server/chunks/build/scenario-test-run-DIjyHDe-.mjs.map +0 -1
  124. package/.output/server/chunks/build/steps-DBViokqd.mjs +0 -54
  125. package/.output/server/chunks/build/steps-DBViokqd.mjs.map +0 -1
  126. package/.output/server/chunks/build/tags-BiGRnEfK.mjs +0 -639
  127. package/.output/server/chunks/build/tags-BiGRnEfK.mjs.map +0 -1
  128. package/.output/server/chunks/build/warnings-BjFCNgyv.mjs +0 -76
  129. package/.output/server/chunks/build/warnings-BjFCNgyv.mjs.map +0 -1
  130. package/.output/server/chunks/raw/sample-run.mjs +0 -7
  131. package/.output/server/chunks/raw/sample-run.mjs.map +0 -1
  132. package/dist-ui/dev/sample-run.webm +0 -0
  133. /package/.output/public/_nuxt/{BDNMzG2s2.js → BDNMzG2s.js} +0 -0
@@ -1,19 +1,9 @@
1
- import { v as useRoute, w as useFetch, x as createError$1, s as useAi, $ as $fetch$2, y as extractServerError, z as icon_default, q as _sfc_main$2, A as AI_OFF_HINT, e as _sfc_main$3, _ as _sfc_main$2$1, m as modal_default$1$1, B as navigateTo, C as _sfc_main$8, o as _sfc_main$6 } from '../virtual/entry.mjs';
2
- import { p as projectOrigin, _ as _sfc_main$5 } from './origin-_7Gia2Vr.mjs';
3
- import { _ as _sfc_main } from './Container-Biz72Lxy.mjs';
4
- import { _ as _sfc_main$1 } from './Badge-DCotJtd8.mjs';
5
- import { a as auth_status_default } from './auth-status-kUEDoxDI.mjs';
6
- import { _ as _sfc_main$4 } from './Alert-DX-UEOEY.mjs';
7
- import { w as warnings_default } from './warnings-BjFCNgyv.mjs';
8
- import { p as phrases_default } from './phrases-rvaRKDG_.mjs';
9
- import { u as useRunStream, v as videoUrlFor, f as formatTestedAt } from './run-stream-CNVDpZ_S.mjs';
10
- import { e as empty_default } from './empty-D8gbt7LG.mjs';
11
- import { h as history_default } from './history-eVF-ijkS.mjs';
12
- import { m as modal_default$2 } from './modal-Cl4zRASg.mjs';
13
- import { c as codefield_default, m as modal_default$3 } from './modal-CELo8GdZ.mjs';
14
- import { u as useWebdriver, e as eventsBaseUrl, t as tagColor, s as setup_default, a as timeline_default, c as confirm_default, d as draftFromScenario, b as toRecordedEvents, f as contexts_default } from './tags-BiGRnEfK.mjs';
1
+ import { u as useRoute, a as useFetch, c as createError$1, b as useAi, $ as $fetch$2, e as extractServerError, i as icon_default, _ as _sfc_main$7, A as AI_OFF_HINT, d as _sfc_main$3$1, f as _sfc_main$8, n as navigateTo, g as _sfc_main$4, h as _sfc_main$6, m as modal_default$4, j as _sfc_main$1$1 } from '../virtual/entry.mjs';
2
+ import { p as projectOrigin, _ as _sfc_main$3, a as _sfc_main$2, b as _sfc_main$1, c as _sfc_main$5 } from './origin-NWHPNXep.mjs';
3
+ import { _ as _sfc_main$9 } from './Pagination-BuiQpYWD.mjs';
4
+ import { u as useRunStream, a as useWebdriver, t as tagColor, w as warnings_default, _ as _sfc_main, s as setup_default, e as empty_default, b as timeline_default, c as codefield_default, d as confirm_default, m as modal_default$1$1, f as modal_default$3, v as videoUrlFor, g as formatTestedAt, h as draftFromScenario, i as contexts_default, p as phrases_default } from './tags-X7K7nkM2.mjs';
15
5
  import { defineComponent, computed, ref, withAsyncContext, watch, mergeProps, unref, withCtx, createVNode, isRef, toDisplayString, createTextVNode, openBlock, createBlock, createCommentVNode, Fragment, renderList, useModel, mergeModels, useSSRContext } from 'vue';
16
- import { ssrRenderComponent, ssrInterpolate, ssrRenderList, ssrRenderAttr } from 'vue/server-renderer';
6
+ import { ssrRenderComponent, ssrInterpolate, ssrRenderList, ssrRenderAttr, ssrRenderAttrs } from 'vue/server-renderer';
17
7
  import 'unhead/plugins';
18
8
  import 'unhead/utils';
19
9
  import '../routes/renderer.mjs';
@@ -57,14 +47,211 @@ import 'devalue';
57
47
  import 'fnv1a-64';
58
48
  import 'object-identity';
59
49
  import 'tailwindcss/colors';
60
- import './Pagination-D2AcUggP.mjs';
61
- import './Card-D7QwltkF.mjs';
62
- import './steps-DBViokqd.mjs';
63
50
  import './_plugin-vue_export-helper-BOaGB7Aw.mjs';
64
51
  import 'prismjs';
65
52
 
53
+ //#region app/components/scenario/auth-status.vue?vue&type=script&setup=true&lang.ts
54
+ var auth_status_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
55
+ __name: "auth-status",
56
+ __ssrInlineRender: true,
57
+ props: { status: {} },
58
+ setup(__props) {
59
+ /** Null em `unset`: aí quem conta o estado é o convite a gravar, e o badge só repetiria. */
60
+ const badge = computed(() => ({
61
+ configured: {
62
+ label: "Configurada",
63
+ icon: "i-ic-round-lock",
64
+ color: "success"
65
+ },
66
+ failing: {
67
+ label: "Falhando",
68
+ icon: "i-ic-round-error",
69
+ color: "error"
70
+ },
71
+ skipped: {
72
+ label: "Dispensada",
73
+ icon: "i-ic-round-lock-open",
74
+ color: "neutral"
75
+ }
76
+ })[__props.status] ?? null);
77
+ return (_ctx, _push, _parent, _attrs) => {
78
+ const _component_UBadge = _sfc_main$2;
79
+ if (unref(badge)) _push(ssrRenderComponent(_component_UBadge, mergeProps({
80
+ variant: "soft",
81
+ icon: unref(badge).icon,
82
+ color: unref(badge).color,
83
+ label: unref(badge).label,
84
+ "data-testid": "cenario-auth-status"
85
+ }, _attrs), null, _parent));
86
+ else _push(`<!---->`);
87
+ };
88
+ }
89
+ });
90
+ //#endregion
91
+ //#region app/components/scenario/auth-status.vue
92
+ var _sfc_setup$7 = auth_status_vue_vue_type_script_setup_true_lang_default.setup;
93
+ auth_status_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
94
+ const ssrContext = useSSRContext();
95
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/scenario/auth-status.vue");
96
+ return _sfc_setup$7 ? _sfc_setup$7(props, ctx) : void 0;
97
+ };
98
+ var auth_status_default = Object.assign(auth_status_vue_vue_type_script_setup_true_lang_default, { __name: "ScenarioAuthStatus" });
99
+ //#endregion
100
+ //#region app/components/scenario/test-run/history.vue?vue&type=script&setup=true&lang.ts
101
+ var PAGE_SIZE = 6;
102
+ var history_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
103
+ __name: "history",
104
+ __ssrInlineRender: true,
105
+ props: { runs: { default: () => [] } },
106
+ emits: ["open"],
107
+ setup(__props, { emit: __emit }) {
108
+ const emit = __emit;
109
+ const statusItems = [
110
+ {
111
+ label: "Todos",
112
+ value: "todos"
113
+ },
114
+ {
115
+ label: "Sucesso",
116
+ value: "sucesso"
117
+ },
118
+ {
119
+ label: "Falha",
120
+ value: "falha"
121
+ }
122
+ ];
123
+ const search = ref("");
124
+ const status = ref("todos");
125
+ const page = ref(1);
126
+ function testedAt(run) {
127
+ return new Date(run.started_at).toLocaleString("pt-BR", {
128
+ dateStyle: "short",
129
+ timeStyle: "short"
130
+ });
131
+ }
132
+ function took(run) {
133
+ return `${(run.duration_ms / 1e3).toLocaleString("pt-BR", { maximumFractionDigits: 1 })}s`;
134
+ }
135
+ /** O que a busca varre numa execução: data, branch, autor e o título do step que falhou. */
136
+ function searchable(run) {
137
+ return [
138
+ testedAt(run),
139
+ run.branch,
140
+ run.author,
141
+ ...run.steps.filter((step) => step.status === "failed").map((step) => step.title)
142
+ ].join(" ").toLowerCase();
143
+ }
144
+ const filtered = computed(() => __props.runs.filter((run) => {
145
+ return (status.value === "todos" || status.value === "sucesso" === run.passed) && searchable(run).includes(search.value.trim().toLowerCase());
146
+ }));
147
+ const paginated = computed(() => filtered.value.slice((page.value - 1) * PAGE_SIZE, page.value * PAGE_SIZE));
148
+ watch([search, status], () => {
149
+ page.value = 1;
150
+ });
151
+ return (_ctx, _push, _parent, _attrs) => {
152
+ const _component_BaseEmpty = empty_default;
153
+ const _component_UInput = _sfc_main$4;
154
+ const _component_USelect = _sfc_main$6;
155
+ const _component_UCard = _sfc_main$5;
156
+ const _component_UBadge = _sfc_main$2;
157
+ const _component_UPagination = _sfc_main$9;
158
+ _push(`<section${ssrRenderAttrs(_attrs)}>`);
159
+ if (__props.runs.length === 0) _push(ssrRenderComponent(_component_BaseEmpty, {
160
+ icon: "i-ic-round-play-circle-outline",
161
+ title: "Nenhum teste executado ainda",
162
+ description: "Rode o cenário em Testar. Cada execução fica registrada aqui com o resultado e o código que rodou.",
163
+ testid: "cenario-execucoes-vazio"
164
+ }, null, _parent));
165
+ else {
166
+ _push(`<!--[--><div class="mb-3 flex flex-col gap-2 sm:flex-row">`);
167
+ _push(ssrRenderComponent(_component_UInput, {
168
+ modelValue: unref(search),
169
+ "onUpdate:modelValue": ($event) => isRef(search) ? search.value = $event : null,
170
+ icon: "i-ic-round-search",
171
+ placeholder: "Buscar por data, branch, autor ou step que falhou",
172
+ class: "flex-1",
173
+ "data-testid": "execucoes-busca"
174
+ }, null, _parent));
175
+ _push(ssrRenderComponent(_component_USelect, {
176
+ modelValue: unref(status),
177
+ "onUpdate:modelValue": ($event) => isRef(status) ? status.value = $event : null,
178
+ items: statusItems,
179
+ class: "sm:w-40",
180
+ "data-testid": "execucoes-status"
181
+ }, null, _parent));
182
+ _push(`</div>`);
183
+ if (unref(filtered).length === 0) _push(ssrRenderComponent(_component_BaseEmpty, {
184
+ icon: "i-ic-round-search-off",
185
+ title: "Nenhuma execução encontrada",
186
+ description: "Nada no histórico casa com a busca e o status escolhidos. Limpe os filtros para ver as execuções de novo.",
187
+ testid: "cenario-execucoes-sem-resultado"
188
+ }, null, _parent));
189
+ else {
190
+ _push(`<div class="grid gap-3 sm:grid-cols-2"><!--[-->`);
191
+ ssrRenderList(unref(paginated), (run) => {
192
+ _push(ssrRenderComponent(_component_UCard, {
193
+ key: run.started_at,
194
+ class: "cursor-pointer transition-colors hover:bg-accented/75",
195
+ "data-testid": "cenario-execucao",
196
+ "data-status": run.passed ? "success" : "failed",
197
+ onClick: ($event) => emit("open", run)
198
+ }, {
199
+ default: withCtx((_, _push, _parent, _scopeId) => {
200
+ if (_push) {
201
+ _push(`<div class="flex items-center justify-between gap-4"${_scopeId}><div class="min-w-0"${_scopeId}><p class="text-sm text-muted"${_scopeId}> Testado em </p><p class="truncate"${_scopeId}>${ssrInterpolate(testedAt(run))} <span class="text-muted"${_scopeId}>em ${ssrInterpolate(took(run))}</span></p></div>`);
202
+ _push(ssrRenderComponent(_component_UBadge, {
203
+ variant: "soft",
204
+ color: run.passed ? "success" : "error",
205
+ icon: run.passed ? "i-ic-round-check-circle" : "i-ic-round-error",
206
+ label: run.passed ? "Sucesso" : "Falha"
207
+ }, null, _parent, _scopeId));
208
+ _push(`</div>`);
209
+ } else return [createVNode("div", { class: "flex items-center justify-between gap-4" }, [createVNode("div", { class: "min-w-0" }, [createVNode("p", { class: "text-sm text-muted" }, " Testado em "), createVNode("p", { class: "truncate" }, [createTextVNode(toDisplayString(testedAt(run)) + " ", 1), createVNode("span", { class: "text-muted" }, "em " + toDisplayString(took(run)), 1)])]), createVNode(_component_UBadge, {
210
+ variant: "soft",
211
+ color: run.passed ? "success" : "error",
212
+ icon: run.passed ? "i-ic-round-check-circle" : "i-ic-round-error",
213
+ label: run.passed ? "Sucesso" : "Falha"
214
+ }, null, 8, [
215
+ "color",
216
+ "icon",
217
+ "label"
218
+ ])])];
219
+ }),
220
+ _: 2
221
+ }, _parent));
222
+ });
223
+ _push(`<!--]--></div>`);
224
+ }
225
+ if (unref(filtered).length > PAGE_SIZE) {
226
+ _push(`<div class="mt-4 flex justify-center">`);
227
+ _push(ssrRenderComponent(_component_UPagination, {
228
+ page: unref(page),
229
+ "onUpdate:page": ($event) => isRef(page) ? page.value = $event : null,
230
+ variant: "soft",
231
+ total: unref(filtered).length,
232
+ "items-per-page": PAGE_SIZE,
233
+ "data-testid": "execucoes-paginacao"
234
+ }, null, _parent));
235
+ _push(`</div>`);
236
+ } else _push(`<!---->`);
237
+ _push(`<!--]-->`);
238
+ }
239
+ _push(`</section>`);
240
+ };
241
+ }
242
+ });
243
+ //#endregion
244
+ //#region app/components/scenario/test-run/history.vue
245
+ var _sfc_setup$6 = history_vue_vue_type_script_setup_true_lang_default.setup;
246
+ history_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
247
+ const ssrContext = useSSRContext();
248
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/scenario/test-run/history.vue");
249
+ return _sfc_setup$6 ? _sfc_setup$6(props, ctx) : void 0;
250
+ };
251
+ var history_default = Object.assign(history_vue_vue_type_script_setup_true_lang_default, { __name: "ScenarioTestRunHistory" });
252
+ //#endregion
66
253
  //#region app/components/scenario/edit/modal.vue?vue&type=script&setup=true&lang.ts
67
- var modal_vue_vue_type_script_setup_true_lang_default$1 = /*@__PURE__*/ defineComponent({
254
+ var modal_vue_vue_type_script_setup_true_lang_default$2 = /*@__PURE__*/ defineComponent({
68
255
  __name: "modal",
69
256
  __ssrInlineRender: true,
70
257
  props: /*@__PURE__*/ mergeModels({
@@ -112,10 +299,10 @@ var modal_vue_vue_type_script_setup_true_lang_default$1 = /*@__PURE__*/ defineCo
112
299
  }
113
300
  }
114
301
  return (_ctx, _push, _parent, _attrs) => {
115
- const _component_BaseModal = modal_default$1$1;
302
+ const _component_BaseModal = modal_default$4;
116
303
  const _component_ScenarioReviewContexts = contexts_default;
117
- const _component_UAlert = _sfc_main$4;
118
- const _component_UButton = _sfc_main$3;
304
+ const _component_UAlert = _sfc_main;
305
+ const _component_UButton = _sfc_main$3$1;
119
306
  _push(ssrRenderComponent(_component_BaseModal, mergeProps({
120
307
  open: open.value,
121
308
  "onUpdate:open": ($event) => open.value = $event,
@@ -187,13 +374,324 @@ var modal_vue_vue_type_script_setup_true_lang_default$1 = /*@__PURE__*/ defineCo
187
374
  });
188
375
  //#endregion
189
376
  //#region app/components/scenario/edit/modal.vue
377
+ var _sfc_setup$5 = modal_vue_vue_type_script_setup_true_lang_default$2.setup;
378
+ modal_vue_vue_type_script_setup_true_lang_default$2.setup = (props, ctx) => {
379
+ const ssrContext = useSSRContext();
380
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/scenario/edit/modal.vue");
381
+ return _sfc_setup$5 ? _sfc_setup$5(props, ctx) : void 0;
382
+ };
383
+ var modal_default$2 = Object.assign(modal_vue_vue_type_script_setup_true_lang_default$2, { __name: "ScenarioEditModal" });
384
+ //#endregion
385
+ //#region app/components/scenario/suggestions/loading.vue?vue&type=script&setup=true&lang.ts
386
+ var loading_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
387
+ __name: "loading",
388
+ __ssrInlineRender: true,
389
+ setup(__props) {
390
+ const phrases = [
391
+ "Analisando os eventos gravados",
392
+ "Procurando seletores frágeis",
393
+ "Pensando em nomes de data-testid",
394
+ "Preparando as sugestões"
395
+ ];
396
+ return (_ctx, _push, _parent, _attrs) => {
397
+ _push(ssrRenderComponent(phrases_default, mergeProps({
398
+ phrases,
399
+ "data-testid": "sugestoes-carregando"
400
+ }, _attrs), null, _parent));
401
+ };
402
+ }
403
+ });
404
+ //#endregion
405
+ //#region app/components/scenario/suggestions/loading.vue
406
+ var _sfc_setup$4 = loading_vue_vue_type_script_setup_true_lang_default.setup;
407
+ loading_vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) => {
408
+ const ssrContext = useSSRContext();
409
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/scenario/suggestions/loading.vue");
410
+ return _sfc_setup$4 ? _sfc_setup$4(props, ctx) : void 0;
411
+ };
412
+ var loading_default = Object.assign(loading_vue_vue_type_script_setup_true_lang_default, { __name: "ScenarioSuggestionsLoading" });
413
+ //#endregion
414
+ //#region app/components/scenario/suggestions/modal.vue?vue&type=script&setup=true&lang.ts
415
+ var modal_vue_vue_type_script_setup_true_lang_default$1 = /*@__PURE__*/ defineComponent({
416
+ __name: "modal",
417
+ __ssrInlineRender: true,
418
+ props: /*@__PURE__*/ mergeModels({
419
+ loading: {
420
+ type: Boolean,
421
+ default: false
422
+ },
423
+ suggestions: { default: () => [] },
424
+ error: { default: null }
425
+ }, {
426
+ "open": {
427
+ type: Boolean,
428
+ default: false
429
+ },
430
+ "openModifiers": {}
431
+ }),
432
+ emits: ["update:open"],
433
+ setup(__props) {
434
+ const open = useModel(__props, "open");
435
+ const copied = ref(null);
436
+ function copy(testId, index) {
437
+ (void 0).clipboard?.writeText(testId);
438
+ copied.value = index;
439
+ setTimeout(() => {
440
+ if (copied.value === index) copied.value = null;
441
+ }, 1500);
442
+ }
443
+ return (_ctx, _push, _parent, _attrs) => {
444
+ const _component_BaseModal = modal_default$4;
445
+ const _component_ScenarioSuggestionsLoading = loading_default;
446
+ const _component_UAlert = _sfc_main;
447
+ const _component_UCard = _sfc_main$5;
448
+ const _component_UIcon = _sfc_main$8;
449
+ const _component_UBadge = _sfc_main$2;
450
+ const _component_UTooltip = _sfc_main$7;
451
+ const _component_UButton = _sfc_main$3$1;
452
+ _push(ssrRenderComponent(_component_BaseModal, mergeProps({
453
+ open: open.value,
454
+ "onUpdate:open": ($event) => open.value = $event,
455
+ title: "Sugestões de seletores",
456
+ loading: __props.loading,
457
+ wide: ""
458
+ }, _attrs), {
459
+ body: withCtx((_, _push, _parent, _scopeId) => {
460
+ if (_push) {
461
+ if (__props.loading) _push(ssrRenderComponent(_component_ScenarioSuggestionsLoading, null, null, _parent, _scopeId));
462
+ else if (__props.error) _push(ssrRenderComponent(_component_UAlert, {
463
+ color: "error",
464
+ variant: "soft",
465
+ icon: "i-ic-round-error-outline",
466
+ title: "Não foi possível gerar sugestões",
467
+ description: __props.error
468
+ }, null, _parent, _scopeId));
469
+ else if (__props.suggestions.length === 0) _push(ssrRenderComponent(_component_UAlert, {
470
+ color: "success",
471
+ variant: "soft",
472
+ icon: "i-ic-round-check-circle",
473
+ title: "Nenhuma sugestão necessária",
474
+ description: "Todos os eventos já têm um data-testid.",
475
+ "data-testid": "sugestoes-vazio"
476
+ }, null, _parent, _scopeId));
477
+ else {
478
+ _push(`<div class="flex flex-col gap-3"${_scopeId}><!--[-->`);
479
+ ssrRenderList(__props.suggestions, (suggestion, i) => {
480
+ _push(ssrRenderComponent(_component_UCard, {
481
+ key: i,
482
+ "data-testid": "sugestao-card"
483
+ }, {
484
+ default: withCtx((_, _push, _parent, _scopeId) => {
485
+ if (_push) {
486
+ _push(`<div class="flex gap-3"${_scopeId}><div class="flex size-9 shrink-0 items-center justify-center rounded-md bg-primary/10"${_scopeId}>`);
487
+ _push(ssrRenderComponent(_component_UIcon, {
488
+ name: "i-ic-round-select-all",
489
+ class: "size-5 text-primary"
490
+ }, null, _parent, _scopeId));
491
+ _push(`</div><div class="min-w-0 flex-1"${_scopeId}><p class="text-sm font-semibold"${_scopeId}>${ssrInterpolate(suggestion.event)}</p><p class="text-xs text-dimmed mt-0.5"${_scopeId}>${ssrInterpolate(suggestion.reason)}</p><div class="flex flex-wrap items-center gap-2 mt-3"${_scopeId}>`);
492
+ _push(ssrRenderComponent(_component_UBadge, {
493
+ color: "error",
494
+ class: "font-mono line-through decoration-error/50",
495
+ size: "xl"
496
+ }, {
497
+ default: withCtx((_, _push, _parent, _scopeId) => {
498
+ if (_push) _push(`${ssrInterpolate(suggestion.currentSelector)}`);
499
+ else return [createTextVNode(toDisplayString(suggestion.currentSelector), 1)];
500
+ }),
501
+ _: 2
502
+ }, _parent, _scopeId));
503
+ _push(ssrRenderComponent(_component_UIcon, {
504
+ name: "i-ic-round-keyboard-arrow-right",
505
+ class: "size-8 shrink-0 text-dimmed"
506
+ }, null, _parent, _scopeId));
507
+ _push(ssrRenderComponent(_component_UTooltip, {
508
+ text: unref(copied) === i ? "Copiado!" : "Clique para copiar",
509
+ "delay-duration": 0,
510
+ arrow: ""
511
+ }, {
512
+ default: withCtx((_, _push, _parent, _scopeId) => {
513
+ if (_push) _push(ssrRenderComponent(_component_UButton, {
514
+ color: unref(copied) === i ? "success" : "primary",
515
+ variant: "soft",
516
+ "trailing-icon": unref(copied) === i ? "i-ic-round-check" : "i-ic-round-content-copy",
517
+ "data-testid": "sugestao-testid",
518
+ size: "lg",
519
+ onClick: ($event) => copy(suggestion.suggestedTestId, i)
520
+ }, {
521
+ default: withCtx((_, _push, _parent, _scopeId) => {
522
+ if (_push) _push(`<code class="font-mono"${_scopeId}>data-testid=&quot;${ssrInterpolate(suggestion.suggestedTestId)}&quot;</code>`);
523
+ else return [createVNode("code", { class: "font-mono" }, "data-testid=\"" + toDisplayString(suggestion.suggestedTestId) + "\"", 1)];
524
+ }),
525
+ _: 2
526
+ }, _parent, _scopeId));
527
+ else return [createVNode(_component_UButton, {
528
+ color: unref(copied) === i ? "success" : "primary",
529
+ variant: "soft",
530
+ "trailing-icon": unref(copied) === i ? "i-ic-round-check" : "i-ic-round-content-copy",
531
+ "data-testid": "sugestao-testid",
532
+ size: "lg",
533
+ onClick: ($event) => copy(suggestion.suggestedTestId, i)
534
+ }, {
535
+ default: withCtx(() => [createVNode("code", { class: "font-mono" }, "data-testid=\"" + toDisplayString(suggestion.suggestedTestId) + "\"", 1)]),
536
+ _: 2
537
+ }, 1032, [
538
+ "color",
539
+ "trailing-icon",
540
+ "onClick"
541
+ ])];
542
+ }),
543
+ _: 2
544
+ }, _parent, _scopeId));
545
+ _push(`</div></div></div>`);
546
+ } else return [createVNode("div", { class: "flex gap-3" }, [createVNode("div", { class: "flex size-9 shrink-0 items-center justify-center rounded-md bg-primary/10" }, [createVNode(_component_UIcon, {
547
+ name: "i-ic-round-select-all",
548
+ class: "size-5 text-primary"
549
+ })]), createVNode("div", { class: "min-w-0 flex-1" }, [
550
+ createVNode("p", { class: "text-sm font-semibold" }, toDisplayString(suggestion.event), 1),
551
+ createVNode("p", { class: "text-xs text-dimmed mt-0.5" }, toDisplayString(suggestion.reason), 1),
552
+ createVNode("div", { class: "flex flex-wrap items-center gap-2 mt-3" }, [
553
+ createVNode(_component_UBadge, {
554
+ color: "error",
555
+ class: "font-mono line-through decoration-error/50",
556
+ size: "xl"
557
+ }, {
558
+ default: withCtx(() => [createTextVNode(toDisplayString(suggestion.currentSelector), 1)]),
559
+ _: 2
560
+ }, 1024),
561
+ createVNode(_component_UIcon, {
562
+ name: "i-ic-round-keyboard-arrow-right",
563
+ class: "size-8 shrink-0 text-dimmed"
564
+ }),
565
+ createVNode(_component_UTooltip, {
566
+ text: unref(copied) === i ? "Copiado!" : "Clique para copiar",
567
+ "delay-duration": 0,
568
+ arrow: ""
569
+ }, {
570
+ default: withCtx(() => [createVNode(_component_UButton, {
571
+ color: unref(copied) === i ? "success" : "primary",
572
+ variant: "soft",
573
+ "trailing-icon": unref(copied) === i ? "i-ic-round-check" : "i-ic-round-content-copy",
574
+ "data-testid": "sugestao-testid",
575
+ size: "lg",
576
+ onClick: ($event) => copy(suggestion.suggestedTestId, i)
577
+ }, {
578
+ default: withCtx(() => [createVNode("code", { class: "font-mono" }, "data-testid=\"" + toDisplayString(suggestion.suggestedTestId) + "\"", 1)]),
579
+ _: 2
580
+ }, 1032, [
581
+ "color",
582
+ "trailing-icon",
583
+ "onClick"
584
+ ])]),
585
+ _: 2
586
+ }, 1032, ["text"])
587
+ ])
588
+ ])])];
589
+ }),
590
+ _: 2
591
+ }, _parent, _scopeId));
592
+ });
593
+ _push(`<!--]--></div>`);
594
+ }
595
+ } else return [__props.loading ? (openBlock(), createBlock(_component_ScenarioSuggestionsLoading, { key: 0 })) : __props.error ? (openBlock(), createBlock(_component_UAlert, {
596
+ key: 1,
597
+ color: "error",
598
+ variant: "soft",
599
+ icon: "i-ic-round-error-outline",
600
+ title: "Não foi possível gerar sugestões",
601
+ description: __props.error
602
+ }, null, 8, ["description"])) : __props.suggestions.length === 0 ? (openBlock(), createBlock(_component_UAlert, {
603
+ key: 2,
604
+ color: "success",
605
+ variant: "soft",
606
+ icon: "i-ic-round-check-circle",
607
+ title: "Nenhuma sugestão necessária",
608
+ description: "Todos os eventos já têm um data-testid.",
609
+ "data-testid": "sugestoes-vazio"
610
+ })) : (openBlock(), createBlock("div", {
611
+ key: 3,
612
+ class: "flex flex-col gap-3"
613
+ }, [(openBlock(true), createBlock(Fragment, null, renderList(__props.suggestions, (suggestion, i) => {
614
+ return openBlock(), createBlock(_component_UCard, {
615
+ key: i,
616
+ "data-testid": "sugestao-card"
617
+ }, {
618
+ default: withCtx(() => [createVNode("div", { class: "flex gap-3" }, [createVNode("div", { class: "flex size-9 shrink-0 items-center justify-center rounded-md bg-primary/10" }, [createVNode(_component_UIcon, {
619
+ name: "i-ic-round-select-all",
620
+ class: "size-5 text-primary"
621
+ })]), createVNode("div", { class: "min-w-0 flex-1" }, [
622
+ createVNode("p", { class: "text-sm font-semibold" }, toDisplayString(suggestion.event), 1),
623
+ createVNode("p", { class: "text-xs text-dimmed mt-0.5" }, toDisplayString(suggestion.reason), 1),
624
+ createVNode("div", { class: "flex flex-wrap items-center gap-2 mt-3" }, [
625
+ createVNode(_component_UBadge, {
626
+ color: "error",
627
+ class: "font-mono line-through decoration-error/50",
628
+ size: "xl"
629
+ }, {
630
+ default: withCtx(() => [createTextVNode(toDisplayString(suggestion.currentSelector), 1)]),
631
+ _: 2
632
+ }, 1024),
633
+ createVNode(_component_UIcon, {
634
+ name: "i-ic-round-keyboard-arrow-right",
635
+ class: "size-8 shrink-0 text-dimmed"
636
+ }),
637
+ createVNode(_component_UTooltip, {
638
+ text: unref(copied) === i ? "Copiado!" : "Clique para copiar",
639
+ "delay-duration": 0,
640
+ arrow: ""
641
+ }, {
642
+ default: withCtx(() => [createVNode(_component_UButton, {
643
+ color: unref(copied) === i ? "success" : "primary",
644
+ variant: "soft",
645
+ "trailing-icon": unref(copied) === i ? "i-ic-round-check" : "i-ic-round-content-copy",
646
+ "data-testid": "sugestao-testid",
647
+ size: "lg",
648
+ onClick: ($event) => copy(suggestion.suggestedTestId, i)
649
+ }, {
650
+ default: withCtx(() => [createVNode("code", { class: "font-mono" }, "data-testid=\"" + toDisplayString(suggestion.suggestedTestId) + "\"", 1)]),
651
+ _: 2
652
+ }, 1032, [
653
+ "color",
654
+ "trailing-icon",
655
+ "onClick"
656
+ ])]),
657
+ _: 2
658
+ }, 1032, ["text"])
659
+ ])
660
+ ])])]),
661
+ _: 2
662
+ }, 1024);
663
+ }), 128))]))];
664
+ }),
665
+ footer: withCtx((_, _push, _parent, _scopeId) => {
666
+ if (_push) _push(ssrRenderComponent(_component_UButton, {
667
+ label: "Fechar",
668
+ color: "neutral",
669
+ variant: "ghost",
670
+ "data-testid": "sugestoes-fechar",
671
+ onClick: ($event) => open.value = false
672
+ }, null, _parent, _scopeId));
673
+ else return [createVNode(_component_UButton, {
674
+ label: "Fechar",
675
+ color: "neutral",
676
+ variant: "ghost",
677
+ "data-testid": "sugestoes-fechar",
678
+ onClick: ($event) => open.value = false
679
+ }, null, 8, ["onClick"])];
680
+ }),
681
+ _: 1
682
+ }, _parent));
683
+ };
684
+ }
685
+ });
686
+ //#endregion
687
+ //#region app/components/scenario/suggestions/modal.vue
190
688
  var _sfc_setup$3 = modal_vue_vue_type_script_setup_true_lang_default$1.setup;
191
689
  modal_vue_vue_type_script_setup_true_lang_default$1.setup = (props, ctx) => {
192
690
  const ssrContext = useSSRContext();
193
- (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/scenario/edit/modal.vue");
691
+ (ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("components/scenario/suggestions/modal.vue");
194
692
  return _sfc_setup$3 ? _sfc_setup$3(props, ctx) : void 0;
195
693
  };
196
- var modal_default$1 = Object.assign(modal_vue_vue_type_script_setup_true_lang_default$1, { __name: "ScenarioEditModal" });
694
+ var modal_default$1 = Object.assign(modal_vue_vue_type_script_setup_true_lang_default$1, { __name: "ScenarioSuggestionsModal" });
197
695
  //#endregion
198
696
  //#region app/components/project/auth/credentials.vue?vue&type=script&setup=true&lang.ts
199
697
  var credentials_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
@@ -240,11 +738,11 @@ var credentials_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defi
240
738
  }
241
739
  }
242
740
  return (_ctx, _push, _parent, _attrs) => {
243
- const _component_BaseModal = modal_default$1$1;
244
- const _component_UAlert = _sfc_main$4;
245
- const _component_UFormField = _sfc_main$8;
246
- const _component_UInput = _sfc_main$6;
247
- const _component_UButton = _sfc_main$3;
741
+ const _component_BaseModal = modal_default$4;
742
+ const _component_UAlert = _sfc_main;
743
+ const _component_UFormField = _sfc_main$1$1;
744
+ const _component_UInput = _sfc_main$4;
745
+ const _component_UButton = _sfc_main$3$1;
248
746
  _push(ssrRenderComponent(_component_BaseModal, mergeProps({
249
747
  open: open.value,
250
748
  "onUpdate:open": ($event) => open.value = $event,
@@ -422,11 +920,11 @@ var modal_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComp
422
920
  const emit = __emit;
423
921
  const open = useModel(__props, "open");
424
922
  return (_ctx, _push, _parent, _attrs) => {
425
- const _component_BaseModal = modal_default$1$1;
923
+ const _component_BaseModal = modal_default$4;
426
924
  const _component_BaseLoadingPhrases = phrases_default;
427
- const _component_UAlert = _sfc_main$4;
925
+ const _component_UAlert = _sfc_main;
428
926
  const _component_BaseCodefield = codefield_default;
429
- const _component_UButton = _sfc_main$3;
927
+ const _component_UButton = _sfc_main$3$1;
430
928
  _push(ssrRenderComponent(_component_BaseModal, mergeProps({
431
929
  open: open.value,
432
930
  "onUpdate:open": ($event) => open.value = $event,
@@ -734,8 +1232,7 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
734
1232
  const written = computed(() => !isAuth.value || scenario.value.playwright.trim().length > 0);
735
1233
  const { state: webdriver, startRecording, stopRecording } = useWebdriver();
736
1234
  const credentialsOpen = ref(false);
737
- const writingAuth = ref(false);
738
- const authError = ref(null);
1235
+ const reviewOpen = ref(false);
739
1236
  const authWarnings = ref([]);
740
1237
  const dismissingAuth = ref(false);
741
1238
  async function dismissAuth() {
@@ -747,143 +1244,80 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
747
1244
  dismissingAuth.value = false;
748
1245
  }
749
1246
  }
750
- const AUTH_PHRASES = [
751
- "Analisando os eventos gravados",
752
- "Identificando os campos de usuário e senha",
753
- "Escrevendo o fluxo de autenticação"
754
- ];
1247
+ /** a tela que pediu a gravação revisa o resultado; o gravador é um estado compartilhado. */
1248
+ const recordStarted = ref(false);
755
1249
  /** Gravar o login abre no sistema sem sessão, porque é justamente o login que vamos capturar. */
756
1250
  function recordLogin() {
757
- authError.value = null;
758
1251
  authWarnings.value = [];
1252
+ recordStarted.value = true;
759
1253
  startRecording("auth", { url: project.value.base_url ?? void 0 });
760
1254
  }
761
- const RESUME_PHRASES = [
762
- "Lendo os eventos da gravação retomada",
763
- "Reescrevendo os passos do cenário",
764
- "Montando o teste Playwright"
765
- ];
766
- const resuming = ref(false);
767
- /** Só a tela que pediu a retomada reescreve o cenário; o gravador é um estado compartilhado. */
768
- const resumeStarted = ref(false);
769
- const resumed = ref(null);
770
- const resumeError = ref(null);
771
1255
  /** Retomar do passo escolhido: o navegador refaz os anteriores e a gravação continua dali. */
772
1256
  const isPublic = computed(() => scenario.value.tags.includes("@publico"));
773
- function resumeFrom(index) {
774
- resumeError.value = null;
775
- resumed.value = null;
776
- resuming.value = false;
777
- resumeStarted.value = true;
1257
+ function resumeWith(events) {
1258
+ recordStarted.value = true;
778
1259
  startRecording(isAuth.value ? "auth" : "scenario", {
779
1260
  url: project.value.base_url ?? void 0,
780
1261
  storageState: isAuth.value ? void 0 : sessionFor(project.value, isPublic.value),
781
- replay: scenario.value.events.slice(0, index)
1262
+ replay: events
782
1263
  });
783
1264
  }
1265
+ function resumeFrom(index) {
1266
+ resumeWith(scenario.value.events.slice(0, index));
1267
+ }
1268
+ /** Gravar de novo do zero mantém o tipo do cenário, só descarta os passos que já existiam. */
1269
+ function rerecord() {
1270
+ return isAuth.value ? recordLogin() : resumeWith([]);
1271
+ }
784
1272
  /** Enquanto a ferramenta refaz os passos, quem manda é a cortina na janela gravada. */
785
1273
  const recordingLabel = computed(() => {
786
1274
  if (webdriver.value.replayFailedStep) return "Aguardando você na janela";
787
1275
  if (webdriver.value.replaying) return "Refazendo os passos";
788
1276
  return "Parar gravação";
789
1277
  });
790
- /** A edição comum revisa o que está em disco, e não o rascunho de uma retomada anterior. */
791
1278
  function openEdit() {
792
- resumed.value = null;
793
1279
  editOpen.value = true;
794
1280
  }
795
- function recordedEvents() {
796
- return toRecordedEvents(webdriver.value.events);
797
- }
798
- /** A gravação retomada vira rascunho e abre a edição, que é quem grava por cima do cenário. */
799
- async function draftResumed() {
800
- const events = recordedEvents();
801
- const baseUrl = eventsBaseUrl(webdriver.value.events);
802
- if (!baseUrl) {
803
- resumeError.value = "A gravação retomada não registrou nenhuma página. Tente de novo.";
1281
+ /** Toda gravação que sai desta tela passa pela revisão antes de virar cenário ou autenticação. */
1282
+ watch(() => webdriver.value.videoSessionId, (sessionId) => {
1283
+ if (!sessionId || !recordStarted.value) return;
1284
+ recordStarted.value = false;
1285
+ reviewOpen.value = true;
1286
+ });
1287
+ /** O que a revisão gerou: a autenticação segue para as credenciais ou para o teste. */
1288
+ async function onReviewed(result) {
1289
+ if (!result) return;
1290
+ if (!isAuth.value) return onUpdated(result);
1291
+ const generated = result;
1292
+ authWarnings.value = generated.warnings ?? [];
1293
+ await refreshScenario();
1294
+ if (generated.credentialsNeeded) {
1295
+ credentialsOpen.value = true;
804
1296
  return;
805
1297
  }
806
- resuming.value = true;
807
- try {
808
- const draft = await $fetch$2(`/api/projects/${slug.value}/tests/draft`, {
809
- method: "POST",
810
- body: {
811
- baseUrl,
812
- events,
813
- isPublic: isPublic.value
814
- }
815
- });
816
- const atual = draftFromScenario(scenario.value);
817
- resumed.value = {
818
- draft: {
819
- ...draft,
820
- title: atual.title,
821
- path: atual.path,
822
- domain: atual.domain
823
- },
824
- events
825
- };
826
- editOpen.value = true;
827
- } catch (error) {
828
- resumeError.value = extractServerError(error, "Não foi possível reescrever o cenário a partir da gravação.");
829
- } finally {
830
- resuming.value = false;
831
- resumeStarted.value = false;
832
- }
1298
+ runTest();
833
1299
  }
834
- watch(() => webdriver.value.videoSessionId, async (sessionId) => {
835
- if (!sessionId) return;
836
- if (!isAuth.value) return resumeStarted.value ? draftResumed() : void 0;
837
- const baseUrl = eventsBaseUrl(webdriver.value.events);
838
- if (!baseUrl) {
839
- authError.value = "A gravação não registrou nenhuma página. Tente gravar novamente.";
840
- return;
841
- }
842
- writingAuth.value = true;
843
- try {
844
- const response = await $fetch$2(`/api/projects/${slug.value}/auth/record`, {
845
- method: "POST",
846
- body: {
847
- baseUrl,
848
- events: recordedEvents()
849
- }
850
- });
851
- authWarnings.value = response.warnings ?? [];
852
- await refreshScenario();
853
- if (response.credentialsNeeded) {
854
- credentialsOpen.value = true;
855
- return;
856
- }
857
- runTest();
858
- } catch (error) {
859
- console.error("Falha ao gravar a autenticação:", error);
860
- authError.value = "Não foi possível gerar a autenticação a partir da gravação. Tente novamente.";
861
- } finally {
862
- writingAuth.value = false;
863
- }
864
- });
865
1300
  return (_ctx, _push, _parent, _attrs) => {
866
- const _component_UContainer = _sfc_main;
1301
+ const _component_UContainer = _sfc_main$3;
867
1302
  const _component_BaseButtonIcon = icon_default;
868
- const _component_UBadge = _sfc_main$1;
1303
+ const _component_UBadge = _sfc_main$2;
869
1304
  const _component_ScenarioAuthStatus = auth_status_default;
870
- const _component_UTooltip = _sfc_main$2;
871
- const _component_UButton = _sfc_main$3;
1305
+ const _component_UTooltip = _sfc_main$7;
1306
+ const _component_UButton = _sfc_main$3$1;
872
1307
  const _component_ScenarioWarnings = warnings_default;
873
- const _component_UAlert = _sfc_main$4;
1308
+ const _component_UAlert = _sfc_main;
874
1309
  const _component_WebdriverSetup = setup_default;
875
- const _component_UIcon = _sfc_main$2$1;
876
- const _component_UTabs = _sfc_main$5;
1310
+ const _component_UIcon = _sfc_main$8;
1311
+ const _component_UTabs = _sfc_main$1;
877
1312
  const _component_BaseEmpty = empty_default;
878
1313
  const _component_ScenarioReviewTimeline = timeline_default;
879
1314
  const _component_BaseCodefield = codefield_default;
880
1315
  const _component_ScenarioTestRunHistory = history_default;
881
1316
  const _component_BaseConfirm = confirm_default;
882
- const _component_ScenarioEditModal = modal_default$1;
883
- const _component_ScenarioSuggestionsModal = modal_default$2;
1317
+ const _component_ScenarioEditModal = modal_default$2;
1318
+ const _component_ScenarioReviewModal = modal_default$1$1;
1319
+ const _component_ScenarioSuggestionsModal = modal_default$1;
884
1320
  const _component_ScenarioTestRunModal = modal_default$3;
885
- const _component_BaseModal = modal_default$1$1;
886
- const _component_BaseLoadingPhrases = phrases_default;
887
1321
  const _component_ProjectAuthCredentials = credentials_default;
888
1322
  const _component_ScenarioFixModal = modal_default;
889
1323
  _push(ssrRenderComponent(_component_UContainer, mergeProps({
@@ -980,7 +1414,6 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
980
1414
  color: "neutral",
981
1415
  variant: "soft",
982
1416
  disabled: !unref(webdriver).connected,
983
- loading: unref(writingAuth),
984
1417
  "data-testid": "auth-gravar",
985
1418
  onClick: recordLogin
986
1419
  }, null, _parent, _scopeId));
@@ -1012,13 +1445,13 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1012
1445
  slug: unref(slug),
1013
1446
  class: "mt-6"
1014
1447
  }, null, _parent, _scopeId));
1015
- if (unref(authError) || unref(webdriver).error) {
1448
+ if (unref(webdriver).error) {
1016
1449
  _push(`<div class="mt-6 flex flex-col gap-3"${_scopeId}>`);
1017
1450
  _push(ssrRenderComponent(_component_UAlert, {
1018
1451
  color: "error",
1019
1452
  variant: "soft",
1020
1453
  "data-testid": "webdriver-erro",
1021
- description: unref(authError) ?? unref(webdriver).error
1454
+ description: unref(webdriver).error
1022
1455
  }, null, _parent, _scopeId));
1023
1456
  if (unref(webdriver).error?.includes("Chrome")) _push(ssrRenderComponent(_component_WebdriverSetup, null, null, _parent, _scopeId));
1024
1457
  else _push(`<!---->`);
@@ -1080,10 +1513,10 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1080
1513
  "data-testid": "cenario-eventos",
1081
1514
  onResume: resumeFrom
1082
1515
  }, null, _parent, _scopeId));
1083
- if (unref(resumeError) ?? unref(webdriver).error) _push(ssrRenderComponent(_component_UAlert, {
1516
+ if (unref(webdriver).error) _push(ssrRenderComponent(_component_UAlert, {
1084
1517
  color: "error",
1085
1518
  variant: "soft",
1086
- description: unref(resumeError) ?? unref(webdriver).error,
1519
+ description: unref(webdriver).error,
1087
1520
  class: "mt-4",
1088
1521
  "data-testid": "cenario-retomar-erro"
1089
1522
  }, null, _parent, _scopeId));
@@ -1141,9 +1574,18 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1141
1574
  "onUpdate:open": ($event) => isRef(editOpen) ? editOpen.value = $event : null,
1142
1575
  slug: unref(slug),
1143
1576
  scenario: unref(scenario),
1144
- resumed: unref(resumed),
1145
1577
  onUpdated
1146
1578
  }, null, _parent, _scopeId));
1579
+ _push(ssrRenderComponent(_component_ScenarioReviewModal, {
1580
+ open: unref(reviewOpen),
1581
+ "onUpdate:open": ($event) => isRef(reviewOpen) ? reviewOpen.value = $event : null,
1582
+ slug: unref(slug),
1583
+ scenario: unref(scenario),
1584
+ "is-public": unref(isPublic),
1585
+ onGenerated: onReviewed,
1586
+ onRerecord: rerecord,
1587
+ onResume: resumeWith
1588
+ }, null, _parent, _scopeId));
1147
1589
  _push(ssrRenderComponent(_component_ScenarioSuggestionsModal, {
1148
1590
  open: unref(suggestionsOpen),
1149
1591
  "onUpdate:open": ($event) => isRef(suggestionsOpen) ? suggestionsOpen.value = $event : null,
@@ -1167,42 +1609,6 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1167
1609
  output: unref(runOutput),
1168
1610
  onFix: requestFix
1169
1611
  }, null, _parent, _scopeId));
1170
- _push(ssrRenderComponent(_component_BaseModal, {
1171
- open: unref(writingAuth),
1172
- "onUpdate:open": ($event) => isRef(writingAuth) ? writingAuth.value = $event : null,
1173
- dismissable: false,
1174
- loading: ""
1175
- }, {
1176
- body: withCtx((_, _push, _parent, _scopeId) => {
1177
- if (_push) _push(ssrRenderComponent(_component_BaseLoadingPhrases, {
1178
- phrases: AUTH_PHRASES,
1179
- "data-testid": "auth-carregando"
1180
- }, null, _parent, _scopeId));
1181
- else return [createVNode(_component_BaseLoadingPhrases, {
1182
- phrases: AUTH_PHRASES,
1183
- "data-testid": "auth-carregando"
1184
- })];
1185
- }),
1186
- _: 1
1187
- }, _parent, _scopeId));
1188
- _push(ssrRenderComponent(_component_BaseModal, {
1189
- open: unref(resuming),
1190
- "onUpdate:open": ($event) => isRef(resuming) ? resuming.value = $event : null,
1191
- dismissable: false,
1192
- loading: ""
1193
- }, {
1194
- body: withCtx((_, _push, _parent, _scopeId) => {
1195
- if (_push) _push(ssrRenderComponent(_component_BaseLoadingPhrases, {
1196
- phrases: RESUME_PHRASES,
1197
- "data-testid": "cenario-retomar-carregando"
1198
- }, null, _parent, _scopeId));
1199
- else return [createVNode(_component_BaseLoadingPhrases, {
1200
- phrases: RESUME_PHRASES,
1201
- "data-testid": "cenario-retomar-carregando"
1202
- })];
1203
- }),
1204
- _: 1
1205
- }, _parent, _scopeId));
1206
1612
  _push(ssrRenderComponent(_component_ProjectAuthCredentials, {
1207
1613
  open: unref(credentialsOpen),
1208
1614
  "onUpdate:open": ($event) => isRef(credentialsOpen) ? credentialsOpen.value = $event : null,
@@ -1311,10 +1717,9 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1311
1717
  color: "neutral",
1312
1718
  variant: "soft",
1313
1719
  disabled: !unref(webdriver).connected,
1314
- loading: unref(writingAuth),
1315
1720
  "data-testid": "auth-gravar",
1316
1721
  onClick: recordLogin
1317
- }, null, 8, ["disabled", "loading"])) : createCommentVNode("", true),
1722
+ }, null, 8, ["disabled"])) : createCommentVNode("", true),
1318
1723
  unref(written) ? (openBlock(), createBlock(_component_UButton, {
1319
1724
  key: 5,
1320
1725
  label: "Testar",
@@ -1344,14 +1749,14 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1344
1749
  slug: unref(slug),
1345
1750
  class: "mt-6"
1346
1751
  }, null, 8, ["warnings", "slug"]),
1347
- unref(authError) || unref(webdriver).error ? (openBlock(), createBlock("div", {
1752
+ unref(webdriver).error ? (openBlock(), createBlock("div", {
1348
1753
  key: 2,
1349
1754
  class: "mt-6 flex flex-col gap-3"
1350
1755
  }, [createVNode(_component_UAlert, {
1351
1756
  color: "error",
1352
1757
  variant: "soft",
1353
1758
  "data-testid": "webdriver-erro",
1354
- description: unref(authError) ?? unref(webdriver).error
1759
+ description: unref(webdriver).error
1355
1760
  }, null, 8, ["description"]), unref(webdriver).error?.includes("Chrome") ? (openBlock(), createBlock(_component_WebdriverSetup, { key: 0 })) : createCommentVNode("", true)])) : createCommentVNode("", true),
1356
1761
  !unref(written) ? (openBlock(), createBlock("div", {
1357
1762
  key: 3,
@@ -1417,11 +1822,11 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1417
1822
  resumable: unref(webdriver).connected && !unref(webdriver).recording,
1418
1823
  "data-testid": "cenario-eventos",
1419
1824
  onResume: resumeFrom
1420
- }, null, 8, ["events", "resumable"])), unref(resumeError) ?? unref(webdriver).error ? (openBlock(), createBlock(_component_UAlert, {
1825
+ }, null, 8, ["events", "resumable"])), unref(webdriver).error ? (openBlock(), createBlock(_component_UAlert, {
1421
1826
  key: 2,
1422
1827
  color: "error",
1423
1828
  variant: "soft",
1424
- description: unref(resumeError) ?? unref(webdriver).error,
1829
+ description: unref(webdriver).error,
1425
1830
  class: "mt-4",
1426
1831
  "data-testid": "cenario-retomar-erro"
1427
1832
  }, null, 8, ["description"])) : createCommentVNode("", true)], 64)) : unref(tab) === "gherkin" ? (openBlock(), createBlock(_component_BaseCodefield, {
@@ -1473,14 +1878,28 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1473
1878
  "onUpdate:open": ($event) => isRef(editOpen) ? editOpen.value = $event : null,
1474
1879
  slug: unref(slug),
1475
1880
  scenario: unref(scenario),
1476
- resumed: unref(resumed),
1477
1881
  onUpdated
1882
+ }, null, 8, [
1883
+ "open",
1884
+ "onUpdate:open",
1885
+ "slug",
1886
+ "scenario"
1887
+ ]),
1888
+ createVNode(_component_ScenarioReviewModal, {
1889
+ open: unref(reviewOpen),
1890
+ "onUpdate:open": ($event) => isRef(reviewOpen) ? reviewOpen.value = $event : null,
1891
+ slug: unref(slug),
1892
+ scenario: unref(scenario),
1893
+ "is-public": unref(isPublic),
1894
+ onGenerated: onReviewed,
1895
+ onRerecord: rerecord,
1896
+ onResume: resumeWith
1478
1897
  }, null, 8, [
1479
1898
  "open",
1480
1899
  "onUpdate:open",
1481
1900
  "slug",
1482
1901
  "scenario",
1483
- "resumed"
1902
+ "is-public"
1484
1903
  ]),
1485
1904
  createVNode(_component_ScenarioSuggestionsModal, {
1486
1905
  open: unref(suggestionsOpen),
@@ -1525,30 +1944,6 @@ var ____scenario__vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ de
1525
1944
  "playwright",
1526
1945
  "output"
1527
1946
  ]),
1528
- createVNode(_component_BaseModal, {
1529
- open: unref(writingAuth),
1530
- "onUpdate:open": ($event) => isRef(writingAuth) ? writingAuth.value = $event : null,
1531
- dismissable: false,
1532
- loading: ""
1533
- }, {
1534
- body: withCtx(() => [createVNode(_component_BaseLoadingPhrases, {
1535
- phrases: AUTH_PHRASES,
1536
- "data-testid": "auth-carregando"
1537
- })]),
1538
- _: 1
1539
- }, 8, ["open", "onUpdate:open"]),
1540
- createVNode(_component_BaseModal, {
1541
- open: unref(resuming),
1542
- "onUpdate:open": ($event) => isRef(resuming) ? resuming.value = $event : null,
1543
- dismissable: false,
1544
- loading: ""
1545
- }, {
1546
- body: withCtx(() => [createVNode(_component_BaseLoadingPhrases, {
1547
- phrases: RESUME_PHRASES,
1548
- "data-testid": "cenario-retomar-carregando"
1549
- })]),
1550
- _: 1
1551
- }, 8, ["open", "onUpdate:open"]),
1552
1947
  createVNode(_component_ProjectAuthCredentials, {
1553
1948
  open: unref(credentialsOpen),
1554
1949
  "onUpdate:open": ($event) => isRef(credentialsOpen) ? credentialsOpen.value = $event : null,
@@ -1594,4 +1989,4 @@ ____scenario__vue_vue_type_script_setup_true_lang_default.setup = (props, ctx) =
1594
1989
  var ____scenario__default = ____scenario__vue_vue_type_script_setup_true_lang_default;
1595
1990
 
1596
1991
  export { ____scenario__default as default };
1597
- //# sourceMappingURL=_...scenario_-D8fF8UCa.mjs.map
1992
+ //# sourceMappingURL=_...scenario_-PVjOOR8j.mjs.map