vaspera 2.10.0 → 2.11.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 (206) hide show
  1. package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts +2 -0
  2. package/dist/__tests__/scanners/ai-code/ai-detector.test.d.ts.map +1 -0
  3. package/dist/__tests__/scanners/ai-code/ai-detector.test.js +188 -0
  4. package/dist/__tests__/scanners/ai-code/ai-detector.test.js.map +1 -0
  5. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts +2 -0
  6. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.d.ts.map +1 -0
  7. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js +363 -0
  8. package/dist/__tests__/scanners/ai-code/confidence-scorer.test.js.map +1 -0
  9. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts +2 -0
  10. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.d.ts.map +1 -0
  11. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js +226 -0
  12. package/dist/__tests__/scanners/ai-code/hallucination-checker.test.js.map +1 -0
  13. package/dist/__tests__/scanners/ai-code/index.test.d.ts +2 -0
  14. package/dist/__tests__/scanners/ai-code/index.test.d.ts.map +1 -0
  15. package/dist/__tests__/scanners/ai-code/index.test.js +214 -0
  16. package/dist/__tests__/scanners/ai-code/index.test.js.map +1 -0
  17. package/dist/__tests__/scanners/deploy/health-checker.test.d.ts +2 -0
  18. package/dist/__tests__/scanners/deploy/health-checker.test.d.ts.map +1 -0
  19. package/dist/__tests__/scanners/deploy/health-checker.test.js +67 -0
  20. package/dist/__tests__/scanners/deploy/health-checker.test.js.map +1 -0
  21. package/dist/__tests__/scanners/deploy/index.test.d.ts +2 -0
  22. package/dist/__tests__/scanners/deploy/index.test.d.ts.map +1 -0
  23. package/dist/__tests__/scanners/deploy/index.test.js +84 -0
  24. package/dist/__tests__/scanners/deploy/index.test.js.map +1 -0
  25. package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts +2 -0
  26. package/dist/__tests__/scanners/deploy/provider-detector.test.d.ts.map +1 -0
  27. package/dist/__tests__/scanners/deploy/provider-detector.test.js +88 -0
  28. package/dist/__tests__/scanners/deploy/provider-detector.test.js.map +1 -0
  29. package/dist/__tests__/scanners/deploy/types.test.d.ts +2 -0
  30. package/dist/__tests__/scanners/deploy/types.test.d.ts.map +1 -0
  31. package/dist/__tests__/scanners/deploy/types.test.js +126 -0
  32. package/dist/__tests__/scanners/deploy/types.test.js.map +1 -0
  33. package/dist/__tests__/scanners/fp-feedback.test.js +1 -1
  34. package/dist/__tests__/scanners/fp-feedback.test.js.map +1 -1
  35. package/dist/__tests__/scanners/fp-tracker.test.js +1 -1
  36. package/dist/__tests__/scanners/fp-tracker.test.js.map +1 -1
  37. package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts +2 -0
  38. package/dist/__tests__/scanners/runtime/app-launcher.test.d.ts.map +1 -0
  39. package/dist/__tests__/scanners/runtime/app-launcher.test.js +94 -0
  40. package/dist/__tests__/scanners/runtime/app-launcher.test.js.map +1 -0
  41. package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts +2 -0
  42. package/dist/__tests__/scanners/runtime/golden-path-runner.test.d.ts.map +1 -0
  43. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +195 -0
  44. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -0
  45. package/dist/__tests__/scanners/runtime/index.test.d.ts +2 -0
  46. package/dist/__tests__/scanners/runtime/index.test.d.ts.map +1 -0
  47. package/dist/__tests__/scanners/runtime/index.test.js +120 -0
  48. package/dist/__tests__/scanners/runtime/index.test.js.map +1 -0
  49. package/dist/__tests__/scanners/runtime/types.test.d.ts +2 -0
  50. package/dist/__tests__/scanners/runtime/types.test.d.ts.map +1 -0
  51. package/dist/__tests__/scanners/runtime/types.test.js +126 -0
  52. package/dist/__tests__/scanners/runtime/types.test.js.map +1 -0
  53. package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts +2 -0
  54. package/dist/__tests__/scanners/scale/bottleneck-detector.test.d.ts.map +1 -0
  55. package/dist/__tests__/scanners/scale/bottleneck-detector.test.js +187 -0
  56. package/dist/__tests__/scanners/scale/bottleneck-detector.test.js.map +1 -0
  57. package/dist/__tests__/scanners/scale/index.test.d.ts +2 -0
  58. package/dist/__tests__/scanners/scale/index.test.d.ts.map +1 -0
  59. package/dist/__tests__/scanners/scale/index.test.js +87 -0
  60. package/dist/__tests__/scanners/scale/index.test.js.map +1 -0
  61. package/dist/__tests__/scanners/scale/load-profiler.test.d.ts +2 -0
  62. package/dist/__tests__/scanners/scale/load-profiler.test.d.ts.map +1 -0
  63. package/dist/__tests__/scanners/scale/load-profiler.test.js +122 -0
  64. package/dist/__tests__/scanners/scale/load-profiler.test.js.map +1 -0
  65. package/dist/__tests__/scanners/scale/types.test.d.ts +2 -0
  66. package/dist/__tests__/scanners/scale/types.test.d.ts.map +1 -0
  67. package/dist/__tests__/scanners/scale/types.test.js +129 -0
  68. package/dist/__tests__/scanners/scale/types.test.js.map +1 -0
  69. package/dist/action/pr-comment.test.js +8 -0
  70. package/dist/action/pr-comment.test.js.map +1 -1
  71. package/dist/action/sarif-upload.test.js +8 -0
  72. package/dist/action/sarif-upload.test.js.map +1 -1
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +874 -0
  75. package/dist/index.js.map +1 -1
  76. package/dist/install-skills.d.ts +11 -0
  77. package/dist/install-skills.d.ts.map +1 -0
  78. package/dist/install-skills.js +81 -0
  79. package/dist/install-skills.js.map +1 -0
  80. package/dist/scanners/ai-code/ai-detector.d.ts +25 -0
  81. package/dist/scanners/ai-code/ai-detector.d.ts.map +1 -0
  82. package/dist/scanners/ai-code/ai-detector.js +192 -0
  83. package/dist/scanners/ai-code/ai-detector.js.map +1 -0
  84. package/dist/scanners/ai-code/confidence-scorer.d.ts +40 -0
  85. package/dist/scanners/ai-code/confidence-scorer.d.ts.map +1 -0
  86. package/dist/scanners/ai-code/confidence-scorer.js +148 -0
  87. package/dist/scanners/ai-code/confidence-scorer.js.map +1 -0
  88. package/dist/scanners/ai-code/hallucination-checker.d.ts +36 -0
  89. package/dist/scanners/ai-code/hallucination-checker.d.ts.map +1 -0
  90. package/dist/scanners/ai-code/hallucination-checker.js +298 -0
  91. package/dist/scanners/ai-code/hallucination-checker.js.map +1 -0
  92. package/dist/scanners/ai-code/index.d.ts +30 -0
  93. package/dist/scanners/ai-code/index.d.ts.map +1 -0
  94. package/dist/scanners/ai-code/index.js +224 -0
  95. package/dist/scanners/ai-code/index.js.map +1 -0
  96. package/dist/scanners/ai-code/types.d.ts +192 -0
  97. package/dist/scanners/ai-code/types.d.ts.map +1 -0
  98. package/dist/scanners/ai-code/types.js +37 -0
  99. package/dist/scanners/ai-code/types.js.map +1 -0
  100. package/dist/scanners/cache.d.ts.map +1 -1
  101. package/dist/scanners/cache.js +8 -0
  102. package/dist/scanners/cache.js.map +1 -1
  103. package/dist/scanners/dast.d.ts +40 -0
  104. package/dist/scanners/dast.d.ts.map +1 -0
  105. package/dist/scanners/dast.js +228 -0
  106. package/dist/scanners/dast.js.map +1 -0
  107. package/dist/scanners/deploy/health-checker.d.ts +38 -0
  108. package/dist/scanners/deploy/health-checker.d.ts.map +1 -0
  109. package/dist/scanners/deploy/health-checker.js +272 -0
  110. package/dist/scanners/deploy/health-checker.js.map +1 -0
  111. package/dist/scanners/deploy/index.d.ts +44 -0
  112. package/dist/scanners/deploy/index.d.ts.map +1 -0
  113. package/dist/scanners/deploy/index.js +208 -0
  114. package/dist/scanners/deploy/index.js.map +1 -0
  115. package/dist/scanners/deploy/provider-detector.d.ts +25 -0
  116. package/dist/scanners/deploy/provider-detector.d.ts.map +1 -0
  117. package/dist/scanners/deploy/provider-detector.js +177 -0
  118. package/dist/scanners/deploy/provider-detector.js.map +1 -0
  119. package/dist/scanners/deploy/types.d.ts +406 -0
  120. package/dist/scanners/deploy/types.d.ts.map +1 -0
  121. package/dist/scanners/deploy/types.js +58 -0
  122. package/dist/scanners/deploy/types.js.map +1 -0
  123. package/dist/scanners/deploy/vercel-integration.d.ts +52 -0
  124. package/dist/scanners/deploy/vercel-integration.d.ts.map +1 -0
  125. package/dist/scanners/deploy/vercel-integration.js +280 -0
  126. package/dist/scanners/deploy/vercel-integration.js.map +1 -0
  127. package/dist/scanners/index.d.ts +4 -4
  128. package/dist/scanners/index.d.ts.map +1 -1
  129. package/dist/scanners/index.js +133 -15
  130. package/dist/scanners/index.js.map +1 -1
  131. package/dist/scanners/index.test.js +6 -6
  132. package/dist/scanners/index.test.js.map +1 -1
  133. package/dist/scanners/openapi.d.ts +20 -0
  134. package/dist/scanners/openapi.d.ts.map +1 -0
  135. package/dist/scanners/openapi.js +226 -0
  136. package/dist/scanners/openapi.js.map +1 -0
  137. package/dist/scanners/runtime/app-launcher.d.ts +33 -0
  138. package/dist/scanners/runtime/app-launcher.d.ts.map +1 -0
  139. package/dist/scanners/runtime/app-launcher.js +419 -0
  140. package/dist/scanners/runtime/app-launcher.js.map +1 -0
  141. package/dist/scanners/runtime/golden-path-runner.d.ts +48 -0
  142. package/dist/scanners/runtime/golden-path-runner.d.ts.map +1 -0
  143. package/dist/scanners/runtime/golden-path-runner.js +373 -0
  144. package/dist/scanners/runtime/golden-path-runner.js.map +1 -0
  145. package/dist/scanners/runtime/index.d.ts +41 -0
  146. package/dist/scanners/runtime/index.d.ts.map +1 -0
  147. package/dist/scanners/runtime/index.js +164 -0
  148. package/dist/scanners/runtime/index.js.map +1 -0
  149. package/dist/scanners/runtime/playwright-executor.d.ts +50 -0
  150. package/dist/scanners/runtime/playwright-executor.d.ts.map +1 -0
  151. package/dist/scanners/runtime/playwright-executor.js +387 -0
  152. package/dist/scanners/runtime/playwright-executor.js.map +1 -0
  153. package/dist/scanners/runtime/types.d.ts +215 -0
  154. package/dist/scanners/runtime/types.d.ts.map +1 -0
  155. package/dist/scanners/runtime/types.js +40 -0
  156. package/dist/scanners/runtime/types.js.map +1 -0
  157. package/dist/scanners/rust.d.ts +22 -0
  158. package/dist/scanners/rust.d.ts.map +1 -0
  159. package/dist/scanners/rust.js +239 -0
  160. package/dist/scanners/rust.js.map +1 -0
  161. package/dist/scanners/scale/bottleneck-detector.d.ts +17 -0
  162. package/dist/scanners/scale/bottleneck-detector.d.ts.map +1 -0
  163. package/dist/scanners/scale/bottleneck-detector.js +250 -0
  164. package/dist/scanners/scale/bottleneck-detector.js.map +1 -0
  165. package/dist/scanners/scale/capacity-estimator.d.ts +17 -0
  166. package/dist/scanners/scale/capacity-estimator.d.ts.map +1 -0
  167. package/dist/scanners/scale/capacity-estimator.js +197 -0
  168. package/dist/scanners/scale/capacity-estimator.js.map +1 -0
  169. package/dist/scanners/scale/index.d.ts +37 -0
  170. package/dist/scanners/scale/index.d.ts.map +1 -0
  171. package/dist/scanners/scale/index.js +101 -0
  172. package/dist/scanners/scale/index.js.map +1 -0
  173. package/dist/scanners/scale/load-profiler.d.ts +48 -0
  174. package/dist/scanners/scale/load-profiler.d.ts.map +1 -0
  175. package/dist/scanners/scale/load-profiler.js +377 -0
  176. package/dist/scanners/scale/load-profiler.js.map +1 -0
  177. package/dist/scanners/scale/types.d.ts +529 -0
  178. package/dist/scanners/scale/types.d.ts.map +1 -0
  179. package/dist/scanners/scale/types.js +57 -0
  180. package/dist/scanners/scale/types.js.map +1 -0
  181. package/dist/scanners/secrets.d.ts.map +1 -1
  182. package/dist/scanners/secrets.js +13 -2
  183. package/dist/scanners/secrets.js.map +1 -1
  184. package/dist/scanners/terraform.d.ts +23 -0
  185. package/dist/scanners/terraform.d.ts.map +1 -0
  186. package/dist/scanners/terraform.js +207 -0
  187. package/dist/scanners/terraform.js.map +1 -0
  188. package/dist/scanners/types.d.ts +1 -1
  189. package/dist/scanners/types.d.ts.map +1 -1
  190. package/dist/scanners/types.js +8 -0
  191. package/dist/scanners/types.js.map +1 -1
  192. package/package.json +4 -2
  193. package/skills/vaspera-add-tests/SKILL.md +102 -0
  194. package/skills/vaspera-ai-verify/SKILL.md +166 -0
  195. package/skills/vaspera-audit/SKILL.md +67 -0
  196. package/skills/vaspera-certify/SKILL.md +130 -0
  197. package/skills/vaspera-deploy/SKILL.md +152 -0
  198. package/skills/vaspera-fix-critical/SKILL.md +52 -0
  199. package/skills/vaspera-fix-high/SKILL.md +81 -0
  200. package/skills/vaspera-fix-medium/SKILL.md +56 -0
  201. package/skills/vaspera-fix-rls/SKILL.md +85 -0
  202. package/skills/vaspera-harden/SKILL.md +102 -0
  203. package/skills/vaspera-help/SKILL.md +61 -0
  204. package/skills/vaspera-load-test/SKILL.md +167 -0
  205. package/skills/vaspera-verify/SKILL.md +70 -0
  206. package/skills/vaspera-verify-e2e/SKILL.md +117 -0
@@ -0,0 +1,387 @@
1
+ /**
2
+ * Playwright Executor
3
+ *
4
+ * Executes golden path steps using Playwright for full browser automation.
5
+ * This module is optional - falls back to HTTP-based execution when Playwright
6
+ * is not available.
7
+ *
8
+ * @module scanners/runtime/playwright-executor
9
+ */
10
+ import { logger } from "../../logger.js";
11
+ let playwrightAvailable = false;
12
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
13
+ let chromium;
14
+ /**
15
+ * Check if Playwright is available
16
+ */
17
+ export async function isPlaywrightAvailable() {
18
+ if (playwrightAvailable)
19
+ return true;
20
+ try {
21
+ // Dynamic import to avoid requiring playwright as a dependency
22
+ // @ts-expect-error - playwright is optional peer dependency
23
+ const playwright = await import("playwright");
24
+ chromium = playwright.chromium;
25
+ playwrightAvailable = true;
26
+ logger.debug("runtime.playwright_available");
27
+ return true;
28
+ }
29
+ catch {
30
+ logger.debug("runtime.playwright_not_available");
31
+ return false;
32
+ }
33
+ }
34
+ /**
35
+ * Playwright browser instance management
36
+ */
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ let browserInstance;
39
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
40
+ let pageInstance;
41
+ /**
42
+ * Launch browser for testing
43
+ */
44
+ export async function launchBrowser(options = {}) {
45
+ if (!await isPlaywrightAvailable()) {
46
+ return false;
47
+ }
48
+ try {
49
+ browserInstance = await chromium.launch({
50
+ headless: options.headless ?? true,
51
+ slowMo: options.slowMo,
52
+ });
53
+ pageInstance = await browserInstance.newPage();
54
+ logger.info("runtime.browser_launched", { headless: options.headless ?? true });
55
+ return true;
56
+ }
57
+ catch (error) {
58
+ logger.error("runtime.browser_launch_failed", {
59
+ error: error.message,
60
+ });
61
+ return false;
62
+ }
63
+ }
64
+ /**
65
+ * Close browser
66
+ */
67
+ export async function closeBrowser() {
68
+ if (pageInstance) {
69
+ await pageInstance.close().catch(() => { });
70
+ pageInstance = undefined;
71
+ }
72
+ if (browserInstance) {
73
+ await browserInstance.close().catch(() => { });
74
+ browserInstance = undefined;
75
+ }
76
+ logger.debug("runtime.browser_closed");
77
+ }
78
+ /**
79
+ * Execute a step using Playwright
80
+ */
81
+ export async function executeStepWithPlaywright(step, stepIndex, baseUrl, context) {
82
+ if (!pageInstance) {
83
+ return {
84
+ step: stepIndex,
85
+ action: step.action,
86
+ success: false,
87
+ duration: 0,
88
+ error: "Browser not launched",
89
+ };
90
+ }
91
+ const startTime = Date.now();
92
+ const page = pageInstance;
93
+ try {
94
+ switch (step.action) {
95
+ case "navigate": {
96
+ const url = step.url?.startsWith("http")
97
+ ? step.url
98
+ : `${baseUrl}${step.url}`;
99
+ await page.goto(url, {
100
+ timeout: step.timeout || 30000,
101
+ waitUntil: "networkidle",
102
+ });
103
+ context.currentUrl = page.url();
104
+ return {
105
+ step: stepIndex,
106
+ action: step.action,
107
+ success: true,
108
+ duration: Date.now() - startTime,
109
+ };
110
+ }
111
+ case "click": {
112
+ if (!step.selector) {
113
+ return {
114
+ step: stepIndex,
115
+ action: step.action,
116
+ success: false,
117
+ duration: Date.now() - startTime,
118
+ error: "No selector provided for click action",
119
+ };
120
+ }
121
+ await page.click(step.selector, {
122
+ timeout: step.timeout || 10000,
123
+ });
124
+ return {
125
+ step: stepIndex,
126
+ action: step.action,
127
+ success: true,
128
+ duration: Date.now() - startTime,
129
+ };
130
+ }
131
+ case "fill": {
132
+ if (!step.selector || step.value === undefined) {
133
+ return {
134
+ step: stepIndex,
135
+ action: step.action,
136
+ success: false,
137
+ duration: Date.now() - startTime,
138
+ error: "Selector and value required for fill action",
139
+ };
140
+ }
141
+ await page.fill(step.selector, step.value, {
142
+ timeout: step.timeout || 10000,
143
+ });
144
+ return {
145
+ step: stepIndex,
146
+ action: step.action,
147
+ success: true,
148
+ duration: Date.now() - startTime,
149
+ };
150
+ }
151
+ case "select": {
152
+ if (!step.selector || step.value === undefined) {
153
+ return {
154
+ step: stepIndex,
155
+ action: step.action,
156
+ success: false,
157
+ duration: Date.now() - startTime,
158
+ error: "Selector and value required for select action",
159
+ };
160
+ }
161
+ await page.selectOption(step.selector, step.value, {
162
+ timeout: step.timeout || 10000,
163
+ });
164
+ return {
165
+ step: stepIndex,
166
+ action: step.action,
167
+ success: true,
168
+ duration: Date.now() - startTime,
169
+ };
170
+ }
171
+ case "assert": {
172
+ if (step.url) {
173
+ const currentUrl = page.url();
174
+ const passed = currentUrl.includes(step.url);
175
+ return {
176
+ step: stepIndex,
177
+ action: step.action,
178
+ success: passed,
179
+ duration: Date.now() - startTime,
180
+ assertion: {
181
+ expected: step.url,
182
+ actual: currentUrl,
183
+ passed,
184
+ },
185
+ };
186
+ }
187
+ if (step.selector) {
188
+ const element = await page.$(step.selector);
189
+ const exists = element !== null;
190
+ if (step.value !== undefined && element) {
191
+ const text = await element.textContent();
192
+ const passed = text?.includes(step.value) ?? false;
193
+ return {
194
+ step: stepIndex,
195
+ action: step.action,
196
+ success: passed,
197
+ duration: Date.now() - startTime,
198
+ assertion: {
199
+ expected: step.value,
200
+ actual: text || "",
201
+ passed,
202
+ },
203
+ };
204
+ }
205
+ return {
206
+ step: stepIndex,
207
+ action: step.action,
208
+ success: exists,
209
+ duration: Date.now() - startTime,
210
+ assertion: {
211
+ expected: "element exists",
212
+ actual: exists ? "found" : "not found",
213
+ passed: exists,
214
+ },
215
+ };
216
+ }
217
+ return {
218
+ step: stepIndex,
219
+ action: step.action,
220
+ success: true,
221
+ duration: Date.now() - startTime,
222
+ error: "No assertion criteria provided",
223
+ };
224
+ }
225
+ case "wait": {
226
+ const waitTime = step.timeout || 1000;
227
+ await page.waitForTimeout(waitTime);
228
+ return {
229
+ step: stepIndex,
230
+ action: step.action,
231
+ success: true,
232
+ duration: Date.now() - startTime,
233
+ };
234
+ }
235
+ case "screenshot": {
236
+ const screenshotPath = context.screenshotsDir
237
+ ? `${context.screenshotsDir}/step-${stepIndex}.png`
238
+ : `/tmp/vaspera-screenshot-${Date.now()}.png`;
239
+ await page.screenshot({
240
+ path: screenshotPath,
241
+ fullPage: true,
242
+ });
243
+ return {
244
+ step: stepIndex,
245
+ action: step.action,
246
+ success: true,
247
+ duration: Date.now() - startTime,
248
+ screenshot: screenshotPath,
249
+ };
250
+ }
251
+ case "api": {
252
+ const url = step.url?.startsWith("http")
253
+ ? step.url
254
+ : `${baseUrl}${step.url}`;
255
+ const response = await page.request.fetch(url, {
256
+ method: step.method || "GET",
257
+ headers: step.headers,
258
+ data: step.body,
259
+ timeout: step.timeout || 10000,
260
+ });
261
+ return {
262
+ step: stepIndex,
263
+ action: step.action,
264
+ success: response.ok(),
265
+ duration: Date.now() - startTime,
266
+ error: response.ok() ? undefined : `HTTP ${response.status()}`,
267
+ };
268
+ }
269
+ default:
270
+ return {
271
+ step: stepIndex,
272
+ action: step.action,
273
+ success: false,
274
+ duration: Date.now() - startTime,
275
+ error: `Unknown action: ${step.action}`,
276
+ };
277
+ }
278
+ }
279
+ catch (error) {
280
+ return {
281
+ step: stepIndex,
282
+ action: step.action,
283
+ success: false,
284
+ duration: Date.now() - startTime,
285
+ error: error.message,
286
+ };
287
+ }
288
+ }
289
+ /**
290
+ * Run a complete flow with Playwright
291
+ */
292
+ export async function runFlowWithPlaywright(flow, baseUrl, options = {}) {
293
+ const startTime = Date.now();
294
+ const stepResults = [];
295
+ const screenshots = [];
296
+ let failed = false;
297
+ // Launch browser
298
+ const launched = await launchBrowser({
299
+ headless: options.headless,
300
+ slowMo: options.slowMo,
301
+ });
302
+ if (!launched) {
303
+ return {
304
+ flowName: flow.name,
305
+ success: false,
306
+ totalSteps: flow.steps.length,
307
+ passedSteps: 0,
308
+ failedSteps: flow.steps.length,
309
+ duration: Date.now() - startTime,
310
+ steps: flow.steps.map((step, i) => ({
311
+ step: i,
312
+ action: step.action,
313
+ success: false,
314
+ duration: 0,
315
+ error: "Failed to launch browser",
316
+ })),
317
+ screenshots: [],
318
+ };
319
+ }
320
+ const context = {
321
+ currentUrl: baseUrl,
322
+ screenshotsDir: options.screenshotsDir,
323
+ };
324
+ logger.info("runtime.playwright_flow_started", {
325
+ name: flow.name,
326
+ steps: flow.steps.length,
327
+ });
328
+ try {
329
+ for (let i = 0; i < flow.steps.length; i++) {
330
+ const step = flow.steps[i];
331
+ if (failed) {
332
+ stepResults.push({
333
+ step: i,
334
+ action: step.action,
335
+ success: false,
336
+ duration: 0,
337
+ error: "Skipped due to previous failure",
338
+ });
339
+ continue;
340
+ }
341
+ const result = await executeStepWithPlaywright(step, i, baseUrl, context);
342
+ stepResults.push(result);
343
+ if (result.screenshot) {
344
+ screenshots.push(result.screenshot);
345
+ }
346
+ if (!result.success) {
347
+ failed = true;
348
+ logger.warn("runtime.playwright_step_failed", {
349
+ flow: flow.name,
350
+ step: i,
351
+ action: step.action,
352
+ error: result.error,
353
+ });
354
+ }
355
+ else {
356
+ logger.debug("runtime.playwright_step_passed", {
357
+ flow: flow.name,
358
+ step: i,
359
+ action: step.action,
360
+ duration: result.duration,
361
+ });
362
+ }
363
+ }
364
+ }
365
+ finally {
366
+ await closeBrowser();
367
+ }
368
+ const passedSteps = stepResults.filter((r) => r.success).length;
369
+ const failedSteps = stepResults.filter((r) => !r.success && !r.error?.includes("Skipped")).length;
370
+ logger.info("runtime.playwright_flow_completed", {
371
+ name: flow.name,
372
+ passed: passedSteps,
373
+ failed: failedSteps,
374
+ duration: Date.now() - startTime,
375
+ });
376
+ return {
377
+ flowName: flow.name,
378
+ success: !failed,
379
+ totalSteps: flow.steps.length,
380
+ passedSteps,
381
+ failedSteps,
382
+ duration: Date.now() - startTime,
383
+ steps: stepResults,
384
+ screenshots,
385
+ };
386
+ }
387
+ //# sourceMappingURL=playwright-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"playwright-executor.js","sourceRoot":"","sources":["../../../src/scanners/runtime/playwright-executor.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAGzC,IAAI,mBAAmB,GAAG,KAAK,CAAC;AAChC,8DAA8D;AAC9D,IAAI,QAAa,CAAC;AAElB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,mBAAmB;QAAE,OAAO,IAAI,CAAC;IAErC,IAAI,CAAC;QACH,+DAA+D;QAC/D,4DAA4D;QAC5D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,YAAY,CAAC,CAAC;QAC9C,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC;QAC/B,mBAAmB,GAAG,IAAI,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACjD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,8DAA8D;AAC9D,IAAI,eAAoB,CAAC;AACzB,8DAA8D;AAC9D,IAAI,YAAiB,CAAC;AAEtB;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAGhC,EAAE;IACJ,IAAI,CAAC,MAAM,qBAAqB,EAAE,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,eAAe,GAAG,MAAM,QAAS,CAAC,MAAM,CAAC;YACvC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI;YAClC,MAAM,EAAE,OAAO,CAAC,MAAM;SACvB,CAAC,CAAC;QACH,YAAY,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,CAAC;QAC/C,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,+BAA+B,EAAE;YAC5C,KAAK,EAAG,KAAe,CAAC,OAAO;SAChC,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC3C,YAAY,GAAG,SAAS,CAAC;IAC3B,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9C,eAAe,GAAG,SAAS,CAAC;IAC9B,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;AACzC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC7C,IAAgC,EAChC,SAAiB,EACjB,OAAe,EACf,OAGC;IAED,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,sBAAsB;SAC9B,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,YAAY,CAAC;IAE1B,IAAI,CAAC;QACH,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,UAAU,CAAC,CAAC,CAAC;gBAChB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC;oBACtC,CAAC,CAAC,IAAI,CAAC,GAAG;oBACV,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE5B,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;oBACnB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;oBAC9B,SAAS,EAAE,aAAa;iBACzB,CAAC,CAAC;gBAEH,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAEhC,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACjC,CAAC;YACJ,CAAC;YAED,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACnB,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;wBAChC,KAAK,EAAE,uCAAuC;qBAC/C,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAC9B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;iBAC/B,CAAC,CAAC;gBAEH,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACjC,CAAC;YACJ,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC/C,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;wBAChC,KAAK,EAAE,6CAA6C;qBACrD,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE;oBACzC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;iBAC/B,CAAC,CAAC;gBAEH,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACjC,CAAC;YACJ,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;oBAC/C,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;wBAChC,KAAK,EAAE,+CAA+C;qBACvD,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE;oBACjD,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;iBAC/B,CAAC,CAAC;gBAEH,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACjC,CAAC;YACJ,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBACb,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;oBAC7C,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,OAAO,EAAE,MAAM;wBACf,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;wBAChC,SAAS,EAAE;4BACT,QAAQ,EAAE,IAAI,CAAC,GAAG;4BAClB,MAAM,EAAE,UAAU;4BAClB,MAAM;yBACP;qBACF,CAAC;gBACJ,CAAC;gBAED,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC5C,MAAM,MAAM,GAAG,OAAO,KAAK,IAAI,CAAC;oBAEhC,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC;wBACxC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAC;wBACzC,MAAM,MAAM,GAAG,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;wBACnD,OAAO;4BACL,IAAI,EAAE,SAAS;4BACf,MAAM,EAAE,IAAI,CAAC,MAAM;4BACnB,OAAO,EAAE,MAAM;4BACf,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;4BAChC,SAAS,EAAE;gCACT,QAAQ,EAAE,IAAI,CAAC,KAAK;gCACpB,MAAM,EAAE,IAAI,IAAI,EAAE;gCAClB,MAAM;6BACP;yBACF,CAAC;oBACJ,CAAC;oBAED,OAAO;wBACL,IAAI,EAAE,SAAS;wBACf,MAAM,EAAE,IAAI,CAAC,MAAM;wBACnB,OAAO,EAAE,MAAM;wBACf,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;wBAChC,SAAS,EAAE;4BACT,QAAQ,EAAE,gBAAgB;4BAC1B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW;4BACtC,MAAM,EAAE,MAAM;yBACf;qBACF,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAChC,KAAK,EAAE,gCAAgC;iBACxC,CAAC;YACJ,CAAC;YAED,KAAK,MAAM,CAAC,CAAC,CAAC;gBACZ,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;gBACtC,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAEpC,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;iBACjC,CAAC;YACJ,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,MAAM,cAAc,GAAG,OAAO,CAAC,cAAc;oBAC3C,CAAC,CAAC,GAAG,OAAO,CAAC,cAAc,SAAS,SAAS,MAAM;oBACnD,CAAC,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;gBAEhD,MAAM,IAAI,CAAC,UAAU,CAAC;oBACpB,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,IAAI;iBACf,CAAC,CAAC;gBAEH,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAChC,UAAU,EAAE,cAAc;iBAC3B,CAAC;YACJ,CAAC;YAED,KAAK,KAAK,CAAC,CAAC,CAAC;gBACX,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,UAAU,CAAC,MAAM,CAAC;oBACtC,CAAC,CAAC,IAAI,CAAC,GAAG;oBACV,CAAC,CAAC,GAAG,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE;oBAC7C,MAAM,EAAG,IAAI,CAAC,MAAsD,IAAI,KAAK;oBAC7E,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;iBAC/B,CAAC,CAAC;gBAEH,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,QAAQ,CAAC,EAAE,EAAE;oBACtB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAChC,KAAK,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE;iBAC/D,CAAC;YACJ,CAAC;YAED;gBACE,OAAO;oBACL,IAAI,EAAE,SAAS;oBACf,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;oBAChC,KAAK,EAAE,mBAAmB,IAAI,CAAC,MAAM,EAAE;iBACxC,CAAC;QACN,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO;YACL,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,KAAK,EAAG,KAAe,CAAC,OAAO;SAChC,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAoB,EACpB,OAAe,EACf,UAII,EAAE;IAWN,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,iBAAiB;IACjB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC;QACnC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,IAAI;YACnB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC7B,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YAC9B,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAChC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAClC,IAAI,EAAE,CAAC;gBACP,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE,KAAK;gBACd,QAAQ,EAAE,CAAC;gBACX,KAAK,EAAE,0BAA0B;aAClC,CAAC,CAAC;YACH,WAAW,EAAE,EAAE;SAChB,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG;QACd,UAAU,EAAE,OAAO;QACnB,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,iCAAiC,EAAE;QAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAE3B,IAAI,MAAM,EAAE,CAAC;gBACX,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,CAAC;oBACP,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,OAAO,EAAE,KAAK;oBACd,QAAQ,EAAE,CAAC;oBACX,KAAK,EAAE,iCAAiC;iBACzC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;YAC1E,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAEzB,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gBACtB,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,MAAM,GAAG,IAAI,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,gCAAgC,EAAE;oBAC5C,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,CAAC;oBACP,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,KAAK,EAAE,MAAM,CAAC,KAAK;iBACpB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;oBAC7C,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,CAAC;oBACP,MAAM,EAAE,IAAI,CAAC,MAAM;oBACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;iBAC1B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,YAAY,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAChE,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IAElG,MAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,WAAW;QACnB,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;KACjC,CAAC,CAAC;IAEH,OAAO;QACL,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,OAAO,EAAE,CAAC,MAAM;QAChB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;QAC7B,WAAW;QACX,WAAW;QACX,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QAChC,KAAK,EAAE,WAAW;QAClB,WAAW;KACZ,CAAC;AACJ,CAAC"}
@@ -0,0 +1,215 @@
1
+ /**
2
+ * Runtime Verification Types
3
+ *
4
+ * Types for app launching, golden path testing, and runtime verification.
5
+ *
6
+ * @module scanners/runtime/types
7
+ */
8
+ import { z } from "zod";
9
+ /**
10
+ * Supported frameworks for automatic detection and launching
11
+ */
12
+ export type Framework = "nextjs" | "vite" | "create-react-app" | "express" | "fastapi" | "flask" | "django" | "rails" | "unknown";
13
+ /**
14
+ * Framework detection result
15
+ */
16
+ export interface FrameworkDetection {
17
+ framework: Framework;
18
+ version?: string;
19
+ confidence: number;
20
+ devCommand: string;
21
+ buildCommand?: string;
22
+ port: number;
23
+ healthEndpoint: string;
24
+ indicators: string[];
25
+ }
26
+ /**
27
+ * App launch configuration
28
+ */
29
+ export interface AppLaunchConfig {
30
+ projectPath: string;
31
+ framework?: Framework;
32
+ port?: number;
33
+ command?: string;
34
+ env?: Record<string, string>;
35
+ timeout?: number;
36
+ healthEndpoint?: string;
37
+ }
38
+ /**
39
+ * App launch result
40
+ */
41
+ export interface AppLaunchResult {
42
+ success: boolean;
43
+ framework: Framework;
44
+ port: number;
45
+ pid?: number;
46
+ url: string;
47
+ healthStatus: "healthy" | "unhealthy" | "timeout";
48
+ startupTime: number;
49
+ error?: string;
50
+ }
51
+ /**
52
+ * Golden path action types
53
+ */
54
+ export type GoldenPathAction = "navigate" | "click" | "fill" | "select" | "assert" | "wait" | "screenshot" | "api";
55
+ /**
56
+ * Golden path step definition
57
+ */
58
+ export interface GoldenPathStep {
59
+ action: GoldenPathAction;
60
+ url?: string;
61
+ selector?: string;
62
+ value?: string;
63
+ timeout?: number;
64
+ screenshot?: boolean;
65
+ description?: string;
66
+ }
67
+ /**
68
+ * Golden path flow definition (YAML schema)
69
+ */
70
+ export declare const GoldenPathFlowSchema: z.ZodObject<{
71
+ name: z.ZodString;
72
+ description: z.ZodOptional<z.ZodString>;
73
+ priority: z.ZodDefault<z.ZodEnum<["critical", "high", "medium", "low"]>>;
74
+ tags: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
75
+ baseUrl: z.ZodOptional<z.ZodString>;
76
+ steps: z.ZodArray<z.ZodObject<{
77
+ action: z.ZodEnum<["navigate", "click", "fill", "select", "assert", "wait", "screenshot", "api"]>;
78
+ url: z.ZodOptional<z.ZodString>;
79
+ selector: z.ZodOptional<z.ZodString>;
80
+ value: z.ZodOptional<z.ZodString>;
81
+ method: z.ZodOptional<z.ZodEnum<["GET", "POST", "PUT", "DELETE", "PATCH"]>>;
82
+ body: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
83
+ headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
84
+ timeout: z.ZodOptional<z.ZodNumber>;
85
+ screenshot: z.ZodOptional<z.ZodBoolean>;
86
+ description: z.ZodOptional<z.ZodString>;
87
+ }, "strip", z.ZodTypeAny, {
88
+ action: "fill" | "api" | "navigate" | "click" | "select" | "assert" | "wait" | "screenshot";
89
+ value?: string | undefined;
90
+ description?: string | undefined;
91
+ timeout?: number | undefined;
92
+ url?: string | undefined;
93
+ headers?: Record<string, string> | undefined;
94
+ body?: Record<string, unknown> | undefined;
95
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
96
+ screenshot?: boolean | undefined;
97
+ selector?: string | undefined;
98
+ }, {
99
+ action: "fill" | "api" | "navigate" | "click" | "select" | "assert" | "wait" | "screenshot";
100
+ value?: string | undefined;
101
+ description?: string | undefined;
102
+ timeout?: number | undefined;
103
+ url?: string | undefined;
104
+ headers?: Record<string, string> | undefined;
105
+ body?: Record<string, unknown> | undefined;
106
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
107
+ screenshot?: boolean | undefined;
108
+ selector?: string | undefined;
109
+ }>, "many">;
110
+ }, "strip", z.ZodTypeAny, {
111
+ name: string;
112
+ priority: "critical" | "high" | "medium" | "low";
113
+ steps: {
114
+ action: "fill" | "api" | "navigate" | "click" | "select" | "assert" | "wait" | "screenshot";
115
+ value?: string | undefined;
116
+ description?: string | undefined;
117
+ timeout?: number | undefined;
118
+ url?: string | undefined;
119
+ headers?: Record<string, string> | undefined;
120
+ body?: Record<string, unknown> | undefined;
121
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
122
+ screenshot?: boolean | undefined;
123
+ selector?: string | undefined;
124
+ }[];
125
+ description?: string | undefined;
126
+ tags?: string[] | undefined;
127
+ baseUrl?: string | undefined;
128
+ }, {
129
+ name: string;
130
+ steps: {
131
+ action: "fill" | "api" | "navigate" | "click" | "select" | "assert" | "wait" | "screenshot";
132
+ value?: string | undefined;
133
+ description?: string | undefined;
134
+ timeout?: number | undefined;
135
+ url?: string | undefined;
136
+ headers?: Record<string, string> | undefined;
137
+ body?: Record<string, unknown> | undefined;
138
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | undefined;
139
+ screenshot?: boolean | undefined;
140
+ selector?: string | undefined;
141
+ }[];
142
+ description?: string | undefined;
143
+ tags?: string[] | undefined;
144
+ priority?: "critical" | "high" | "medium" | "low" | undefined;
145
+ baseUrl?: string | undefined;
146
+ }>;
147
+ export type GoldenPathFlow = z.infer<typeof GoldenPathFlowSchema>;
148
+ /**
149
+ * Step execution result
150
+ */
151
+ export interface StepResult {
152
+ step: number;
153
+ action: GoldenPathAction;
154
+ success: boolean;
155
+ duration: number;
156
+ error?: string;
157
+ screenshot?: string;
158
+ assertion?: {
159
+ expected: string;
160
+ actual: string;
161
+ passed: boolean;
162
+ };
163
+ }
164
+ /**
165
+ * Golden path execution result
166
+ */
167
+ export interface GoldenPathResult {
168
+ flowName: string;
169
+ success: boolean;
170
+ totalSteps: number;
171
+ passedSteps: number;
172
+ failedSteps: number;
173
+ duration: number;
174
+ steps: StepResult[];
175
+ screenshots: string[];
176
+ error?: string;
177
+ }
178
+ /**
179
+ * Visual regression result
180
+ */
181
+ export interface VisualRegressionResult {
182
+ baseline: string;
183
+ current: string;
184
+ diff?: string;
185
+ pixelDifference: number;
186
+ percentDifference: number;
187
+ passed: boolean;
188
+ threshold: number;
189
+ }
190
+ /**
191
+ * Runtime verification score components
192
+ */
193
+ export interface RuntimeScore {
194
+ goldenPathsPassed: number;
195
+ goldenPathsTotal: number;
196
+ visualRegressionsPassed: number;
197
+ visualRegressionsTotal: number;
198
+ apiTestsPassed: number;
199
+ apiTestsTotal: number;
200
+ overallScore: number;
201
+ }
202
+ /**
203
+ * Full runtime verification result
204
+ */
205
+ export interface RuntimeVerificationResult {
206
+ success: boolean;
207
+ framework: Framework;
208
+ appUrl: string;
209
+ duration: number;
210
+ goldenPaths: GoldenPathResult[];
211
+ visualRegressions: VisualRegressionResult[];
212
+ score: RuntimeScore;
213
+ error?: string;
214
+ }
215
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/scanners/runtime/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Runtime Verification Types
3
+ *
4
+ * Types for app launching, golden path testing, and runtime verification.
5
+ *
6
+ * @module scanners/runtime/types
7
+ */
8
+ import { z } from "zod";
9
+ /**
10
+ * Golden path flow definition (YAML schema)
11
+ */
12
+ export const GoldenPathFlowSchema = z.object({
13
+ name: z.string().describe("Human-readable flow name"),
14
+ description: z.string().optional(),
15
+ priority: z.enum(["critical", "high", "medium", "low"]).default("medium"),
16
+ tags: z.array(z.string()).optional(),
17
+ baseUrl: z.string().optional().describe("Override base URL"),
18
+ steps: z.array(z.object({
19
+ action: z.enum([
20
+ "navigate",
21
+ "click",
22
+ "fill",
23
+ "select",
24
+ "assert",
25
+ "wait",
26
+ "screenshot",
27
+ "api",
28
+ ]),
29
+ url: z.string().optional(),
30
+ selector: z.string().optional(),
31
+ value: z.string().optional(),
32
+ method: z.enum(["GET", "POST", "PUT", "DELETE", "PATCH"]).optional(),
33
+ body: z.record(z.unknown()).optional(),
34
+ headers: z.record(z.string()).optional(),
35
+ timeout: z.number().optional(),
36
+ screenshot: z.boolean().optional(),
37
+ description: z.string().optional(),
38
+ })),
39
+ });
40
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/scanners/runtime/types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAmFxB;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;IACrD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACpC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC;IAC5D,KAAK,EAAE,CAAC,CAAC,KAAK,CACZ,CAAC,CAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;YACb,UAAU;YACV,OAAO;YACP,MAAM;YACN,QAAQ;YACR,QAAQ;YACR,MAAM;YACN,YAAY;YACZ,KAAK;SACN,CAAC;QACF,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC1B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC/B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC5B,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE;QACpE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;QACtC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;QACxC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;QAC9B,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC,CACH;CACF,CAAC,CAAC"}