@midscene/core 1.12.10-beta-20260920031616.0 → 1.13.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 (319) hide show
  1. package/dist/es/agent/agent.mjs +103 -6
  2. package/dist/es/agent/agent.mjs.map +1 -1
  3. package/dist/es/agent/index.mjs +4 -3
  4. package/dist/es/agent/tasks.mjs +2 -2
  5. package/dist/es/agent/tasks.mjs.map +1 -1
  6. package/dist/es/agent/test-runner-nodes.mjs +291 -40
  7. package/dist/es/agent/test-runner-nodes.mjs.map +1 -1
  8. package/dist/es/agent/utils.mjs +1 -1
  9. package/dist/es/device/index.mjs +15 -2
  10. package/dist/es/device/index.mjs.map +1 -1
  11. package/dist/es/dump/html-utils.mjs +37 -4
  12. package/dist/es/dump/html-utils.mjs.map +1 -1
  13. package/dist/es/dump/screenshot-store.mjs +8 -1
  14. package/dist/es/dump/screenshot-store.mjs.map +1 -1
  15. package/dist/es/report-cli.mjs +9 -4
  16. package/dist/es/report-cli.mjs.map +1 -1
  17. package/dist/es/report-generator.mjs +117 -4
  18. package/dist/es/report-generator.mjs.map +1 -1
  19. package/dist/es/report-html-template.mjs +1 -1
  20. package/dist/es/report.mjs +190 -41
  21. package/dist/es/report.mjs.map +1 -1
  22. package/dist/es/test-run-report.mjs.map +1 -1
  23. package/dist/es/test-runner/engine/case-runner.mjs +52 -0
  24. package/dist/es/test-runner/engine/case-runner.mjs.map +1 -0
  25. package/dist/es/test-runner/engine/document-runtime.mjs +273 -0
  26. package/dist/es/test-runner/engine/document-runtime.mjs.map +1 -0
  27. package/dist/es/test-runner/engine/execute-step.mjs +177 -0
  28. package/dist/es/test-runner/engine/execute-step.mjs.map +1 -0
  29. package/dist/es/test-runner/engine/execution-failure.mjs +39 -0
  30. package/dist/es/test-runner/engine/execution-failure.mjs.map +1 -0
  31. package/dist/es/test-runner/engine/index.mjs +12 -0
  32. package/dist/es/test-runner/engine/project-runtime.mjs +142 -0
  33. package/dist/es/test-runner/engine/project-runtime.mjs.map +1 -0
  34. package/dist/es/test-runner/engine/registry.mjs +61 -0
  35. package/dist/es/test-runner/engine/registry.mjs.map +1 -0
  36. package/dist/es/test-runner/engine/resource-operations.mjs +211 -0
  37. package/dist/es/test-runner/engine/resource-operations.mjs.map +1 -0
  38. package/dist/es/test-runner/engine/run-collected-case.mjs +193 -0
  39. package/dist/es/test-runner/engine/run-collected-case.mjs.map +1 -0
  40. package/dist/es/test-runner/engine/run-workflow-document.mjs +155 -0
  41. package/dist/es/test-runner/engine/run-workflow-document.mjs.map +1 -0
  42. package/dist/es/test-runner/engine/scheduler.mjs +27 -0
  43. package/dist/es/test-runner/engine/scheduler.mjs.map +1 -0
  44. package/dist/es/test-runner/engine/scope-teardown.mjs +16 -0
  45. package/dist/es/test-runner/engine/scope-teardown.mjs.map +1 -0
  46. package/dist/es/test-runner/engine/types.mjs +0 -0
  47. package/dist/es/test-runner/errors.mjs +201 -0
  48. package/dist/es/test-runner/errors.mjs.map +1 -0
  49. package/dist/es/test-runner/execution-record.mjs +83 -0
  50. package/dist/es/test-runner/execution-record.mjs.map +1 -0
  51. package/dist/es/test-runner/index.mjs +12 -0
  52. package/dist/es/test-runner/node/define-node.mjs +44 -0
  53. package/dist/es/test-runner/node/define-node.mjs.map +1 -0
  54. package/dist/es/test-runner/node/index.mjs +2 -0
  55. package/dist/es/test-runner/node/types.mjs +0 -0
  56. package/dist/es/test-runner/parser/document-format.mjs +21 -0
  57. package/dist/es/test-runner/parser/document-format.mjs.map +1 -0
  58. package/dist/es/test-runner/parser/normalize.mjs +87 -0
  59. package/dist/es/test-runner/parser/normalize.mjs.map +1 -0
  60. package/dist/es/test-runner/parser/types.mjs +0 -0
  61. package/dist/es/test-runner/project.mjs +0 -0
  62. package/dist/es/test-runner/reporting/agent-report.mjs +23 -0
  63. package/dist/es/test-runner/reporting/agent-report.mjs.map +1 -0
  64. package/dist/es/test-runner/reporting/execution-record.mjs +73 -0
  65. package/dist/es/test-runner/reporting/execution-record.mjs.map +1 -0
  66. package/dist/es/test-runner/reporting/merge-report.mjs +231 -0
  67. package/dist/es/test-runner/reporting/merge-report.mjs.map +1 -0
  68. package/dist/es/test-runner/reporting/sanitize.mjs +162 -0
  69. package/dist/es/test-runner/reporting/sanitize.mjs.map +1 -0
  70. package/dist/es/test-runner/reporting/test-run-report.mjs +327 -0
  71. package/dist/es/test-runner/reporting/test-run-report.mjs.map +1 -0
  72. package/dist/es/test-runner/reporting/types.mjs +0 -0
  73. package/dist/es/utils.mjs +1 -1
  74. package/dist/es/yaml/execution-context.node.mjs +6 -0
  75. package/dist/es/yaml/execution-context.node.mjs.map +1 -0
  76. package/dist/es/yaml/execution-context.stub.mjs +8 -0
  77. package/dist/es/yaml/execution-context.stub.mjs.map +1 -0
  78. package/dist/es/yaml/execution-session.mjs +90 -0
  79. package/dist/es/yaml/execution-session.mjs.map +1 -0
  80. package/dist/es/yaml/index.mjs +2 -1
  81. package/dist/es/yaml/legacy-yaml-execution-record.mjs +47 -0
  82. package/dist/es/yaml/legacy-yaml-execution-record.mjs.map +1 -0
  83. package/dist/es/yaml/legacy-yaml-report.mjs +52 -0
  84. package/dist/es/yaml/legacy-yaml-report.mjs.map +1 -0
  85. package/dist/es/yaml/legacy-yaml-runtime.mjs +119 -0
  86. package/dist/es/yaml/legacy-yaml-runtime.mjs.map +1 -0
  87. package/dist/es/yaml/player-state.mjs +15 -0
  88. package/dist/es/yaml/player-state.mjs.map +1 -0
  89. package/dist/es/yaml/player.mjs +214 -348
  90. package/dist/es/yaml/player.mjs.map +1 -1
  91. package/dist/es/yaml/report-policy.mjs +7 -0
  92. package/dist/es/yaml/report-policy.mjs.map +1 -0
  93. package/dist/es/yaml/test-runner-compat.mjs +301 -0
  94. package/dist/es/yaml/test-runner-compat.mjs.map +1 -0
  95. package/dist/es/yaml/test-runner-nodes.mjs +147 -0
  96. package/dist/es/yaml/test-runner-nodes.mjs.map +1 -0
  97. package/dist/es/yaml/utils.mjs +12 -1
  98. package/dist/es/yaml/utils.mjs.map +1 -1
  99. package/dist/es/yaml-runtime.mjs +7 -0
  100. package/dist/es/yaml.mjs.map +1 -1
  101. package/dist/lib/agent/agent.js +103 -6
  102. package/dist/lib/agent/agent.js.map +1 -1
  103. package/dist/lib/agent/index.js +37 -3
  104. package/dist/lib/agent/tasks.js +2 -2
  105. package/dist/lib/agent/tasks.js.map +1 -1
  106. package/dist/lib/agent/test-runner-nodes.js +329 -45
  107. package/dist/lib/agent/test-runner-nodes.js.map +1 -1
  108. package/dist/lib/agent/utils.js +1 -1
  109. package/dist/lib/device/index.js +15 -2
  110. package/dist/lib/device/index.js.map +1 -1
  111. package/dist/lib/dump/html-utils.js +43 -4
  112. package/dist/lib/dump/html-utils.js.map +1 -1
  113. package/dist/lib/dump/screenshot-store.js +8 -1
  114. package/dist/lib/dump/screenshot-store.js.map +1 -1
  115. package/dist/lib/report-cli.js +8 -3
  116. package/dist/lib/report-cli.js.map +1 -1
  117. package/dist/lib/report-generator.js +114 -1
  118. package/dist/lib/report-generator.js.map +1 -1
  119. package/dist/lib/report-html-template.js +1 -1
  120. package/dist/lib/report.js +187 -38
  121. package/dist/lib/report.js.map +1 -1
  122. package/dist/lib/test-run-report.js.map +1 -1
  123. package/dist/lib/test-runner/engine/case-runner.js +89 -0
  124. package/dist/lib/test-runner/engine/case-runner.js.map +1 -0
  125. package/dist/lib/test-runner/engine/document-runtime.js +307 -0
  126. package/dist/lib/test-runner/engine/document-runtime.js.map +1 -0
  127. package/dist/lib/test-runner/engine/execute-step.js +211 -0
  128. package/dist/lib/test-runner/engine/execute-step.js.map +1 -0
  129. package/dist/lib/test-runner/engine/execution-failure.js +79 -0
  130. package/dist/lib/test-runner/engine/execution-failure.js.map +1 -0
  131. package/dist/lib/test-runner/engine/index.js +137 -0
  132. package/dist/lib/test-runner/engine/index.js.map +1 -0
  133. package/dist/lib/test-runner/engine/project-runtime.js +176 -0
  134. package/dist/lib/test-runner/engine/project-runtime.js.map +1 -0
  135. package/dist/lib/test-runner/engine/registry.js +95 -0
  136. package/dist/lib/test-runner/engine/registry.js.map +1 -0
  137. package/dist/lib/test-runner/engine/resource-operations.js +272 -0
  138. package/dist/lib/test-runner/engine/resource-operations.js.map +1 -0
  139. package/dist/lib/test-runner/engine/run-collected-case.js +227 -0
  140. package/dist/lib/test-runner/engine/run-collected-case.js.map +1 -0
  141. package/dist/lib/test-runner/engine/run-workflow-document.js +189 -0
  142. package/dist/lib/test-runner/engine/run-workflow-document.js.map +1 -0
  143. package/dist/lib/test-runner/engine/scheduler.js +64 -0
  144. package/dist/lib/test-runner/engine/scheduler.js.map +1 -0
  145. package/dist/lib/test-runner/engine/scope-teardown.js +50 -0
  146. package/dist/lib/test-runner/engine/scope-teardown.js.map +1 -0
  147. package/dist/lib/test-runner/engine/types.js +20 -0
  148. package/dist/lib/test-runner/engine/types.js.map +1 -0
  149. package/dist/lib/test-runner/errors.js +283 -0
  150. package/dist/lib/test-runner/errors.js.map +1 -0
  151. package/dist/lib/test-runner/execution-record.js +123 -0
  152. package/dist/lib/test-runner/execution-record.js.map +1 -0
  153. package/dist/lib/test-runner/index.js +137 -0
  154. package/dist/lib/test-runner/index.js.map +1 -0
  155. package/dist/lib/test-runner/node/define-node.js +78 -0
  156. package/dist/lib/test-runner/node/define-node.js.map +1 -0
  157. package/dist/lib/test-runner/node/index.js +67 -0
  158. package/dist/lib/test-runner/node/index.js.map +1 -0
  159. package/dist/lib/test-runner/node/types.js +20 -0
  160. package/dist/lib/test-runner/node/types.js.map +1 -0
  161. package/dist/lib/test-runner/parser/document-format.js +58 -0
  162. package/dist/lib/test-runner/parser/document-format.js.map +1 -0
  163. package/dist/lib/test-runner/parser/normalize.js +124 -0
  164. package/dist/lib/test-runner/parser/normalize.js.map +1 -0
  165. package/dist/lib/test-runner/parser/types.js +20 -0
  166. package/dist/lib/test-runner/parser/types.js.map +1 -0
  167. package/dist/lib/test-runner/project.js +20 -0
  168. package/dist/lib/test-runner/project.js.map +1 -0
  169. package/dist/lib/test-runner/reporting/agent-report.js +57 -0
  170. package/dist/lib/test-runner/reporting/agent-report.js.map +1 -0
  171. package/dist/lib/test-runner/reporting/execution-record.js +107 -0
  172. package/dist/lib/test-runner/reporting/execution-record.js.map +1 -0
  173. package/dist/lib/test-runner/reporting/merge-report.js +265 -0
  174. package/dist/lib/test-runner/reporting/merge-report.js.map +1 -0
  175. package/dist/lib/test-runner/reporting/sanitize.js +202 -0
  176. package/dist/lib/test-runner/reporting/sanitize.js.map +1 -0
  177. package/dist/lib/test-runner/reporting/test-run-report.js +364 -0
  178. package/dist/lib/test-runner/reporting/test-run-report.js.map +1 -0
  179. package/dist/lib/test-runner/reporting/types.js +20 -0
  180. package/dist/lib/test-runner/reporting/types.js.map +1 -0
  181. package/dist/lib/utils.js +1 -1
  182. package/dist/lib/yaml/execution-context.node.js +43 -0
  183. package/dist/lib/yaml/execution-context.node.js.map +1 -0
  184. package/dist/lib/yaml/execution-context.stub.js +45 -0
  185. package/dist/lib/yaml/execution-context.stub.js.map +1 -0
  186. package/dist/lib/yaml/execution-session.js +136 -0
  187. package/dist/lib/yaml/execution-session.js.map +1 -0
  188. package/dist/lib/yaml/index.js +49 -7
  189. package/dist/lib/yaml/legacy-yaml-execution-record.js +81 -0
  190. package/dist/lib/yaml/legacy-yaml-execution-record.js.map +1 -0
  191. package/dist/lib/yaml/legacy-yaml-report.js +86 -0
  192. package/dist/lib/yaml/legacy-yaml-report.js.map +1 -0
  193. package/dist/lib/yaml/legacy-yaml-runtime.js +156 -0
  194. package/dist/lib/yaml/legacy-yaml-runtime.js.map +1 -0
  195. package/dist/lib/yaml/player-state.js +52 -0
  196. package/dist/lib/yaml/player-state.js.map +1 -0
  197. package/dist/lib/yaml/player.js +213 -347
  198. package/dist/lib/yaml/player.js.map +1 -1
  199. package/dist/lib/yaml/report-policy.js +41 -0
  200. package/dist/lib/yaml/report-policy.js.map +1 -0
  201. package/dist/lib/yaml/test-runner-compat.js +344 -0
  202. package/dist/lib/yaml/test-runner-compat.js.map +1 -0
  203. package/dist/lib/yaml/test-runner-nodes.js +184 -0
  204. package/dist/lib/yaml/test-runner-nodes.js.map +1 -0
  205. package/dist/lib/yaml/utils.js +18 -1
  206. package/dist/lib/yaml/utils.js.map +1 -1
  207. package/dist/lib/yaml-runtime.js +67 -0
  208. package/dist/lib/yaml-runtime.js.map +1 -0
  209. package/dist/lib/yaml.js.map +1 -1
  210. package/dist/types/agent/agent.d.ts +14 -1
  211. package/dist/types/agent/agent.d.ts.map +1 -1
  212. package/dist/types/agent/index.d.ts +4 -3
  213. package/dist/types/agent/index.d.ts.map +1 -1
  214. package/dist/types/agent/tasks.d.ts +1 -1
  215. package/dist/types/agent/tasks.d.ts.map +1 -1
  216. package/dist/types/agent/test-runner-nodes.d.ts +226 -0
  217. package/dist/types/agent/test-runner-nodes.d.ts.map +1 -1
  218. package/dist/types/device/index.d.ts +1 -1
  219. package/dist/types/device/index.d.ts.map +1 -1
  220. package/dist/types/dump/html-utils.d.ts +4 -0
  221. package/dist/types/dump/html-utils.d.ts.map +1 -1
  222. package/dist/types/dump/screenshot-store.d.ts +2 -1
  223. package/dist/types/dump/screenshot-store.d.ts.map +1 -1
  224. package/dist/types/report-cli.d.ts.map +1 -1
  225. package/dist/types/report-generator.d.ts +10 -0
  226. package/dist/types/report-generator.d.ts.map +1 -1
  227. package/dist/types/report.d.ts +3 -1
  228. package/dist/types/report.d.ts.map +1 -1
  229. package/dist/types/test-run-report.d.ts +18 -2
  230. package/dist/types/test-run-report.d.ts.map +1 -1
  231. package/dist/types/test-runner/engine/case-runner.d.ts +13 -0
  232. package/dist/types/test-runner/engine/case-runner.d.ts.map +1 -0
  233. package/dist/types/test-runner/engine/document-runtime.d.ts +4 -0
  234. package/dist/types/test-runner/engine/document-runtime.d.ts.map +1 -0
  235. package/dist/types/test-runner/engine/execute-step.d.ts +17 -0
  236. package/dist/types/test-runner/engine/execute-step.d.ts.map +1 -0
  237. package/dist/types/test-runner/engine/execution-failure.d.ts +13 -0
  238. package/dist/types/test-runner/engine/execution-failure.d.ts.map +1 -0
  239. package/dist/types/test-runner/engine/index.d.ts +13 -0
  240. package/dist/types/test-runner/engine/index.d.ts.map +1 -0
  241. package/dist/types/test-runner/engine/project-runtime.d.ts +3 -0
  242. package/dist/types/test-runner/engine/project-runtime.d.ts.map +1 -0
  243. package/dist/types/test-runner/engine/registry.d.ts +12 -0
  244. package/dist/types/test-runner/engine/registry.d.ts.map +1 -0
  245. package/dist/types/test-runner/engine/resource-operations.d.ts +32 -0
  246. package/dist/types/test-runner/engine/resource-operations.d.ts.map +1 -0
  247. package/dist/types/test-runner/engine/run-collected-case.d.ts +4 -0
  248. package/dist/types/test-runner/engine/run-collected-case.d.ts.map +1 -0
  249. package/dist/types/test-runner/engine/run-workflow-document.d.ts +4 -0
  250. package/dist/types/test-runner/engine/run-workflow-document.d.ts.map +1 -0
  251. package/dist/types/test-runner/engine/scheduler.d.ts +12 -0
  252. package/dist/types/test-runner/engine/scheduler.d.ts.map +1 -0
  253. package/dist/types/test-runner/engine/scope-teardown.d.ts +3 -0
  254. package/dist/types/test-runner/engine/scope-teardown.d.ts.map +1 -0
  255. package/dist/types/test-runner/engine/types.d.ts +226 -0
  256. package/dist/types/test-runner/engine/types.d.ts.map +1 -0
  257. package/dist/types/test-runner/errors.d.ts +79 -0
  258. package/dist/types/test-runner/errors.d.ts.map +1 -0
  259. package/dist/types/test-runner/execution-record.d.ts +43 -0
  260. package/dist/types/test-runner/execution-record.d.ts.map +1 -0
  261. package/dist/types/test-runner/index.d.ts +20 -0
  262. package/dist/types/test-runner/index.d.ts.map +1 -0
  263. package/dist/types/test-runner/node/define-node.d.ts +4 -0
  264. package/dist/types/test-runner/node/define-node.d.ts.map +1 -0
  265. package/dist/types/test-runner/node/index.d.ts +3 -0
  266. package/dist/types/test-runner/node/index.d.ts.map +1 -0
  267. package/dist/types/test-runner/node/types.d.ts +66 -0
  268. package/dist/types/test-runner/node/types.d.ts.map +1 -0
  269. package/dist/types/test-runner/parser/document-format.d.ts +8 -0
  270. package/dist/types/test-runner/parser/document-format.d.ts.map +1 -0
  271. package/dist/types/test-runner/parser/normalize.d.ts +9 -0
  272. package/dist/types/test-runner/parser/normalize.d.ts.map +1 -0
  273. package/dist/types/test-runner/parser/types.d.ts +69 -0
  274. package/dist/types/test-runner/parser/types.d.ts.map +1 -0
  275. package/dist/types/test-runner/project.d.ts +75 -0
  276. package/dist/types/test-runner/project.d.ts.map +1 -0
  277. package/dist/types/test-runner/reporting/agent-report.d.ts +9 -0
  278. package/dist/types/test-runner/reporting/agent-report.d.ts.map +1 -0
  279. package/dist/types/test-runner/reporting/execution-record.d.ts +9 -0
  280. package/dist/types/test-runner/reporting/execution-record.d.ts.map +1 -0
  281. package/dist/types/test-runner/reporting/merge-report.d.ts +15 -0
  282. package/dist/types/test-runner/reporting/merge-report.d.ts.map +1 -0
  283. package/dist/types/test-runner/reporting/sanitize.d.ts +6 -0
  284. package/dist/types/test-runner/reporting/sanitize.d.ts.map +1 -0
  285. package/dist/types/test-runner/reporting/test-run-report.d.ts +5 -0
  286. package/dist/types/test-runner/reporting/test-run-report.d.ts.map +1 -0
  287. package/dist/types/test-runner/reporting/types.d.ts +34 -0
  288. package/dist/types/test-runner/reporting/types.d.ts.map +1 -0
  289. package/dist/types/yaml/execution-context.node.d.ts +4 -0
  290. package/dist/types/yaml/execution-context.node.d.ts.map +1 -0
  291. package/dist/types/yaml/execution-context.stub.d.ts +6 -0
  292. package/dist/types/yaml/execution-context.stub.d.ts.map +1 -0
  293. package/dist/types/yaml/execution-session.d.ts +17 -0
  294. package/dist/types/yaml/execution-session.d.ts.map +1 -0
  295. package/dist/types/yaml/index.d.ts +1 -1
  296. package/dist/types/yaml/index.d.ts.map +1 -1
  297. package/dist/types/yaml/legacy-yaml-execution-record.d.ts +24 -0
  298. package/dist/types/yaml/legacy-yaml-execution-record.d.ts.map +1 -0
  299. package/dist/types/yaml/legacy-yaml-report.d.ts +19 -0
  300. package/dist/types/yaml/legacy-yaml-report.d.ts.map +1 -0
  301. package/dist/types/yaml/legacy-yaml-runtime.d.ts +23 -0
  302. package/dist/types/yaml/legacy-yaml-runtime.d.ts.map +1 -0
  303. package/dist/types/yaml/player-state.d.ts +11 -0
  304. package/dist/types/yaml/player-state.d.ts.map +1 -0
  305. package/dist/types/yaml/player.d.ts +11 -3
  306. package/dist/types/yaml/player.d.ts.map +1 -1
  307. package/dist/types/yaml/report-policy.d.ts +4 -0
  308. package/dist/types/yaml/report-policy.d.ts.map +1 -0
  309. package/dist/types/yaml/test-runner-compat.d.ts +17 -0
  310. package/dist/types/yaml/test-runner-compat.d.ts.map +1 -0
  311. package/dist/types/yaml/test-runner-nodes.d.ts +6 -0
  312. package/dist/types/yaml/test-runner-nodes.d.ts.map +1 -0
  313. package/dist/types/yaml/utils.d.ts +9 -0
  314. package/dist/types/yaml/utils.d.ts.map +1 -1
  315. package/dist/types/yaml-runtime.d.ts +13 -0
  316. package/dist/types/yaml-runtime.d.ts.map +1 -0
  317. package/dist/types/yaml.d.ts +25 -7
  318. package/dist/types/yaml.d.ts.map +1 -1
  319. package/package.json +28 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner/reporting/merge-report.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../src/test-runner/reporting/merge-report.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n TestRunReportDocument,\n TestRunReportDump,\n TestRunReportMetrics,\n TestRunReportStep,\n} from '../../test-run-report';\nimport type { ReportFileAttributes } from '../../types';\n\nexport interface MergeTestRunReportSource {\n reportId: string;\n sourcePath: string;\n attributes: ReportFileAttributes;\n dump?: TestRunReportDump;\n timing?: { startedAt: string; endedAt: string; durationMs: number };\n}\n\nfunction agentReportAsTestRun(\n source: MergeTestRunReportSource,\n): Pick<TestRunReportDump, 'status' | 'summary' | 'projects'> &\n Partial<Pick<TestRunReportDump, 'startedAt' | 'endedAt' | 'diagnostics'>> {\n const { attributes, reportId } = source;\n const status =\n attributes.testStatus === 'skipped'\n ? 'not-run'\n : attributes.testStatus === 'passed'\n ? 'success'\n : 'failed';\n const failed = status === 'failed';\n return {\n status: failed ? 'failed' : 'success',\n ...source.timing,\n summary: {\n total: 1,\n passed: status === 'success' ? 1 : 0,\n failed: failed ? 1 : 0,\n notRun: status === 'not-run' ? 1 : 0,\n filtered: 0,\n collectionErrors: 0,\n documentFailures: 0,\n projectFailures: 0,\n },\n projects: [\n {\n projectId: 'agent-report',\n name: attributes.testTitle,\n platform: 'agent',\n status: failed ? 'failed' : 'success',\n retry: 0,\n collectionErrors: [],\n documents: [\n {\n documentId: 'agent-report',\n sourcePath: source.sourcePath,\n status: failed ? 'failed' : 'success',\n beforeAll: [],\n afterAll: [],\n scopeReportIds: [reportId],\n cases: [\n {\n caseId: attributes.testId,\n name: attributes.testTitle,\n caseIndex: 0,\n status,\n attempts:\n status === 'not-run' || !source.timing\n ? []\n : [\n {\n attemptId: 'agent-report',\n attemptIndex: 0,\n status,\n ...source.timing,\n beforeEach: [],\n steps: [],\n afterEach: [],\n scopeReportIds: [reportId],\n },\n ],\n },\n ],\n },\n ],\n },\n ],\n };\n}\n\nfunction retainHostFailure(\n source: MergeTestRunReportSource,\n): TestRunReportDump | undefined {\n const dump = source.dump;\n if (\n !dump ||\n dump.status === 'failed' ||\n !['failed', 'timedOut', 'interrupted'].includes(\n source.attributes.testStatus,\n )\n )\n return dump;\n\n const message = `Host test \"${source.attributes.testTitle}\" finished with status \"${source.attributes.testStatus}\".`;\n const projectIndex = dump.projects.length - 1;\n const project = dump.projects[projectIndex];\n const documentIndex = (project?.documents.length ?? 0) - 1;\n const document = project?.documents[documentIndex];\n const afterHost = <\n T extends Omit<TestRunReportDocument, 'cases' | 'attempts'>,\n >(\n value: T,\n ): T => ({\n ...value,\n status: 'failed',\n afterAll: [\n ...value.afterAll,\n {\n id: `${value.documentRunId ?? value.documentId}:host-result`,\n phase: 'afterAll',\n stepIndex: value.afterAll.length,\n node: 'runner:host-result',\n status: 'failed',\n continuedAfterError: false,\n startedAt: value.endedAt ?? dump.endedAt,\n endedAt: value.endedAt ?? dump.endedAt,\n durationMs: 0,\n error: { name: 'HostTestError', message },\n },\n ],\n });\n // The enclosing test can fail after YAML succeeds. Record that outcome at\n // the file boundary instead of changing successful actions or Case attempts.\n return {\n ...dump,\n status: 'failed',\n summary: {\n ...dump.summary,\n ...(document\n ? { documentFailures: dump.summary.documentFailures + 1 }\n : { projectFailures: dump.summary.projectFailures + 1 }),\n },\n projects: dump.projects.map((item, index) =>\n index !== projectIndex\n ? item\n : {\n ...item,\n status: 'failed',\n documents: item.documents.map((value, index) =>\n index !== documentIndex\n ? value\n : {\n ...afterHost(value),\n ...(value.attempts\n ? {\n attempts: value.attempts.map((attempt, index) =>\n index === value.attempts!.length - 1\n ? afterHost(attempt)\n : attempt,\n ),\n }\n : {}),\n },\n ),\n },\n ),\n diagnostics: [\n ...(dump.diagnostics ?? []),\n {\n level: 'error',\n code: 'run-infrastructure-error',\n message,\n },\n ],\n };\n}\n\nexport function mergeTestRunReportDumps(\n sources: readonly MergeTestRunReportSource[],\n metrics: TestRunReportMetrics,\n runId: string,\n): TestRunReportDump {\n const dumps = sources.map((source) => {\n if (\n source.dump &&\n (!Number.isFinite(Date.parse(source.dump.startedAt)) ||\n !Number.isFinite(Date.parse(source.dump.endedAt)) ||\n Date.parse(source.dump.endedAt) < Date.parse(source.dump.startedAt))\n )\n throw new Error(\n `Invalid execution timestamps in Midscene Test report: ${source.sourcePath}`,\n );\n const dump = retainHostFailure(source) ?? agentReportAsTestRun(source);\n const id = (value: string) => `${source.reportId}:${value}`;\n const scopeReports = (reportIds: string[] | undefined) =>\n reportIds?.length ? [source.reportId] : reportIds;\n const step = (value: TestRunReportStep): TestRunReportStep => ({\n ...value,\n id: id(value.id),\n ...(value.agentDetails\n ? {\n agentDetails: value.agentDetails.map((detail) => ({\n ...detail,\n reportId: source.reportId,\n })),\n }\n : {}),\n });\n const documentScope = <\n T extends Omit<TestRunReportDocument, 'cases' | 'attempts'>,\n >(\n value: T,\n ): T => ({\n ...value,\n documentId: id(value.documentId),\n ...(value.logicalDocumentId\n ? { logicalDocumentId: id(value.logicalDocumentId) }\n : {}),\n ...(value.documentRunId\n ? { documentRunId: id(value.documentRunId) }\n : {}),\n beforeAll: value.beforeAll.map(step),\n afterAll: value.afterAll.map(step),\n scopeReportIds: scopeReports(value.scopeReportIds),\n });\n // A file can already contain a merged run. Namespace hierarchy IDs while\n // keeping execution IDs stable: the latter also deduplicate shared snapshots.\n return {\n ...dump,\n projects: dump.projects.map((project) => ({\n ...project,\n projectId: id(project.projectId),\n documents: project.documents.map((document) => ({\n ...documentScope(document),\n ...(document.attempts\n ? { attempts: document.attempts.map(documentScope) }\n : {}),\n cases: document.cases.map((testCase) => ({\n ...testCase,\n caseId: id(testCase.caseId),\n attempts: testCase.attempts.map((attempt) => ({\n ...attempt,\n attemptId: id(attempt.attemptId),\n beforeEach: attempt.beforeEach.map(step),\n steps: attempt.steps.map(step),\n afterEach: attempt.afterEach.map(step),\n scopeReportIds: scopeReports(attempt.scopeReportIds),\n })),\n })),\n })),\n })),\n diagnostics: dump.diagnostics?.map((diagnostic) => ({\n ...diagnostic,\n ...(diagnostic.scopeId ? { scopeId: id(diagnostic.scopeId) } : {}),\n })),\n };\n });\n // A report without recorded timestamps contributes outcomes, not the time\n // at which an unrelated merge command happened to run.\n const recordedTimes = dumps.flatMap((dump) =>\n dump.startedAt && dump.endedAt\n ? [{ start: Date.parse(dump.startedAt), end: Date.parse(dump.endedAt) }]\n : [],\n );\n if (!recordedTimes.length)\n throw new Error(\n 'Cannot merge Midscene Test reports without recorded execution timestamps.',\n );\n const startedAt = new Date(\n Math.min(...recordedTimes.map((time) => time.start)),\n ).toISOString();\n const endedAt = new Date(\n Math.max(...recordedTimes.map((time) => time.end)),\n ).toISOString();\n const summary = {\n total: 0,\n passed: 0,\n failed: 0,\n notRun: 0,\n filtered: 0,\n collectionErrors: 0,\n documentFailures: 0,\n projectFailures: 0,\n };\n for (const dump of dumps) {\n for (const key of Object.keys(summary) as (keyof typeof summary)[])\n summary[key] += dump.summary[key];\n }\n const diagnostics = dumps.flatMap((dump) => dump.diagnostics ?? []);\n return {\n schemaVersion: 1,\n kind: 'test-runner',\n runId,\n status: dumps.some((dump) => dump.status === 'failed')\n ? 'failed'\n : 'success',\n startedAt,\n endedAt,\n durationMs: Math.max(0, Date.parse(endedAt) - Date.parse(startedAt)),\n summary,\n metrics,\n projects: dumps.flatMap((dump) => dump.projects),\n ...(diagnostics.length ? { diagnostics } : {}),\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","agentReportAsTestRun","source","attributes","reportId","status","failed","retainHostFailure","dump","message","projectIndex","project","documentIndex","document","afterHost","value","item","index","attempt","mergeTestRunReportDumps","sources","metrics","runId","dumps","Number","Date","Error","id","scopeReports","reportIds","step","detail","documentScope","testCase","diagnostic","recordedTimes","startedAt","Math","time","endedAt","summary","diagnostics"],"mappings":"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"}
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ sanitizeReportError: ()=>sanitizeReportError,
28
+ sanitizeReportText: ()=>sanitizeReportText,
29
+ sanitizeReportValue: ()=>sanitizeReportValue
30
+ });
31
+ const MAX_DEPTH = 6;
32
+ const MAX_STRING_LENGTH = 2000;
33
+ const MAX_ARRAY_ITEMS = 50;
34
+ const MAX_OBJECT_KEYS = 50;
35
+ const MAX_SERIALIZED_BYTES = 65536;
36
+ const TRUNCATED_VALUE = '[Truncated: display value exceeded 64 KiB]';
37
+ const normalizedSecretKeys = [
38
+ 'password',
39
+ 'passwd',
40
+ 'secret',
41
+ 'token',
42
+ 'authorization',
43
+ 'cookie',
44
+ 'apikey'
45
+ ];
46
+ const normalizedKey = (key)=>key.toLowerCase().replace(/[^a-z0-9]/g, '');
47
+ const isSecretKey = (key)=>{
48
+ const normalized = normalizedKey(key);
49
+ return normalizedSecretKeys.some((secret)=>normalized.includes(secret));
50
+ };
51
+ const objectPath = (parent, key)=>/^[A-Za-z_$][\w$]*$/.test(key) ? `${parent}.${key}` : `${parent}[${JSON.stringify(key)}]`;
52
+ const stringByteLength = (value)=>new TextEncoder().encode(value).byteLength;
53
+ function sanitizeReportText(value, maximumLength = MAX_STRING_LENGTH) {
54
+ return value.length <= maximumLength ? value : `${value.slice(0, maximumLength)}… [truncated]`;
55
+ }
56
+ function sanitizeReportValue(value) {
57
+ const truncatedPaths = new Set();
58
+ const redactedPaths = new Set();
59
+ const ancestors = new WeakSet();
60
+ let remainingBytes = MAX_SERIALIZED_BYTES;
61
+ const consume = (path, text)=>{
62
+ remainingBytes -= stringByteLength(text);
63
+ if (remainingBytes >= 0) return true;
64
+ truncatedPaths.add(path);
65
+ return false;
66
+ };
67
+ const visit = (current, path, depth)=>{
68
+ if (remainingBytes <= 0) {
69
+ truncatedPaths.add(path);
70
+ return '[Truncated: size limit]';
71
+ }
72
+ if (null === current || 'boolean' == typeof current) {
73
+ consume(path, String(current));
74
+ return current;
75
+ }
76
+ if ('string' == typeof current) {
77
+ if (current.length > MAX_STRING_LENGTH) {
78
+ truncatedPaths.add(path);
79
+ const shortened = `${current.slice(0, MAX_STRING_LENGTH)}… [truncated]`;
80
+ consume(path, shortened);
81
+ return shortened;
82
+ }
83
+ consume(path, current);
84
+ return current;
85
+ }
86
+ if ('number' == typeof current) {
87
+ if (Number.isFinite(current)) {
88
+ consume(path, String(current));
89
+ return current;
90
+ }
91
+ truncatedPaths.add(path);
92
+ return `[Unsupported number: ${String(current)}]`;
93
+ }
94
+ if ('bigint' == typeof current) {
95
+ truncatedPaths.add(path);
96
+ return `[Unsupported bigint: ${String(current)}]`;
97
+ }
98
+ if (void 0 === current || 'function' == typeof current || 'symbol' == typeof current) {
99
+ truncatedPaths.add(path);
100
+ return `[Unsupported ${typeof current}]`;
101
+ }
102
+ if (depth >= MAX_DEPTH) {
103
+ truncatedPaths.add(path);
104
+ return '[Truncated: maximum depth]';
105
+ }
106
+ if (current instanceof Date) {
107
+ const date = Number.isNaN(current.getTime()) ? '[Invalid Date]' : current.toISOString();
108
+ consume(path, date);
109
+ return date;
110
+ }
111
+ if (ancestors.has(current)) {
112
+ truncatedPaths.add(path);
113
+ return '[Unsupported circular value]';
114
+ }
115
+ if (Array.isArray(current)) {
116
+ ancestors.add(current);
117
+ const output = [];
118
+ const itemCount = Math.min(current.length, MAX_ARRAY_ITEMS);
119
+ for(let index = 0; index < itemCount; index += 1){
120
+ if (remainingBytes <= 0) break;
121
+ output.push(visit(current[index], `${path}[${index}]`, depth + 1));
122
+ }
123
+ if (current.length > output.length) truncatedPaths.add(path);
124
+ ancestors.delete(current);
125
+ return output;
126
+ }
127
+ const prototype = Object.getPrototypeOf(current);
128
+ if (prototype !== Object.prototype && null !== prototype) {
129
+ truncatedPaths.add(path);
130
+ const constructorName = current.constructor?.name ?? 'object';
131
+ return `[Unsupported object: ${constructorName}]`;
132
+ }
133
+ ancestors.add(current);
134
+ const output = {};
135
+ const keys = Object.keys(current);
136
+ for (const key of keys.slice(0, MAX_OBJECT_KEYS)){
137
+ const childPath = objectPath(path, key);
138
+ if (!consume(childPath, key)) break;
139
+ if (isSecretKey(key)) {
140
+ output[key] = '[REDACTED]';
141
+ redactedPaths.add(childPath);
142
+ } else output[key] = visit(current[key], childPath, depth + 1);
143
+ if (remainingBytes <= 0) break;
144
+ }
145
+ if (keys.length > Object.keys(output).length) truncatedPaths.add(path);
146
+ ancestors.delete(current);
147
+ return output;
148
+ };
149
+ const sanitized = visit(value, '$', 0);
150
+ const serialized = JSON.stringify(sanitized);
151
+ if (void 0 === serialized || stringByteLength(serialized) > MAX_SERIALIZED_BYTES) return {
152
+ value: TRUNCATED_VALUE,
153
+ truncatedPaths: [
154
+ '$'
155
+ ]
156
+ };
157
+ return {
158
+ value: sanitized,
159
+ ...truncatedPaths.size > 0 ? {
160
+ truncatedPaths: [
161
+ ...truncatedPaths
162
+ ]
163
+ } : {},
164
+ ...redactedPaths.size > 0 ? {
165
+ redactedPaths: [
166
+ ...redactedPaths
167
+ ]
168
+ } : {}
169
+ };
170
+ }
171
+ function sanitizeReportError(error) {
172
+ if (error instanceof Error || 'object' == typeof error && null !== error && 'string' == typeof error.message) {
173
+ const workflowLike = error;
174
+ return {
175
+ name: sanitizeReportText(workflowLike.name || 'Error', 200),
176
+ message: sanitizeReportText(workflowLike.message || String(error)),
177
+ ...'string' == typeof workflowLike.code ? {
178
+ code: sanitizeReportText(workflowLike.code, 200)
179
+ } : {},
180
+ ...void 0 === workflowLike.details ? {} : {
181
+ details: sanitizeReportValue(workflowLike.details)
182
+ }
183
+ };
184
+ }
185
+ return {
186
+ name: 'Error',
187
+ message: sanitizeReportText(String(error))
188
+ };
189
+ }
190
+ exports.sanitizeReportError = __webpack_exports__.sanitizeReportError;
191
+ exports.sanitizeReportText = __webpack_exports__.sanitizeReportText;
192
+ exports.sanitizeReportValue = __webpack_exports__.sanitizeReportValue;
193
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
194
+ "sanitizeReportError",
195
+ "sanitizeReportText",
196
+ "sanitizeReportValue"
197
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
198
+ Object.defineProperty(exports, '__esModule', {
199
+ value: true
200
+ });
201
+
202
+ //# sourceMappingURL=sanitize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-runner/reporting/sanitize.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../../src/test-runner/reporting/sanitize.ts"],"sourcesContent":["__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import type {\n TestRunReportError,\n TestRunReportValue,\n} from '../../test-run-report';\n\nconst MAX_DEPTH = 6;\nconst MAX_STRING_LENGTH = 2_000;\nconst MAX_ARRAY_ITEMS = 50;\nconst MAX_OBJECT_KEYS = 50;\nconst MAX_SERIALIZED_BYTES = 64 * 1024;\nconst TRUNCATED_VALUE = '[Truncated: display value exceeded 64 KiB]';\n\nconst normalizedSecretKeys = [\n 'password',\n 'passwd',\n 'secret',\n 'token',\n 'authorization',\n 'cookie',\n 'apikey',\n];\n\nconst normalizedKey = (key: string): string =>\n key.toLowerCase().replace(/[^a-z0-9]/g, '');\n\nconst isSecretKey = (key: string): boolean => {\n const normalized = normalizedKey(key);\n return normalizedSecretKeys.some((secret) => normalized.includes(secret));\n};\n\nconst objectPath = (parent: string, key: string): string =>\n /^[A-Za-z_$][\\w$]*$/.test(key)\n ? `${parent}.${key}`\n : `${parent}[${JSON.stringify(key)}]`;\n\nconst stringByteLength = (value: string): number =>\n new TextEncoder().encode(value).byteLength;\n\nexport function sanitizeReportText(\n value: string,\n maximumLength = MAX_STRING_LENGTH,\n): string {\n return value.length <= maximumLength\n ? value\n : `${value.slice(0, maximumLength)}… [truncated]`;\n}\n\n/** Convert arbitrary Node input/output to a bounded, JSON-safe display value. */\nexport function sanitizeReportValue(value: unknown): TestRunReportValue {\n const truncatedPaths = new Set<string>();\n const redactedPaths = new Set<string>();\n const ancestors = new WeakSet<object>();\n let remainingBytes = MAX_SERIALIZED_BYTES;\n\n const consume = (path: string, text: string): boolean => {\n remainingBytes -= stringByteLength(text);\n if (remainingBytes >= 0) return true;\n truncatedPaths.add(path);\n return false;\n };\n\n const visit = (current: unknown, path: string, depth: number): unknown => {\n if (remainingBytes <= 0) {\n truncatedPaths.add(path);\n return '[Truncated: size limit]';\n }\n if (current === null || typeof current === 'boolean') {\n consume(path, String(current));\n return current;\n }\n if (typeof current === 'string') {\n if (current.length > MAX_STRING_LENGTH) {\n truncatedPaths.add(path);\n const shortened = `${current.slice(0, MAX_STRING_LENGTH)}… [truncated]`;\n consume(path, shortened);\n return shortened;\n }\n consume(path, current);\n return current;\n }\n if (typeof current === 'number') {\n if (Number.isFinite(current)) {\n consume(path, String(current));\n return current;\n }\n truncatedPaths.add(path);\n return `[Unsupported number: ${String(current)}]`;\n }\n if (typeof current === 'bigint') {\n truncatedPaths.add(path);\n return `[Unsupported bigint: ${String(current)}]`;\n }\n if (\n current === undefined ||\n typeof current === 'function' ||\n typeof current === 'symbol'\n ) {\n truncatedPaths.add(path);\n return `[Unsupported ${typeof current}]`;\n }\n if (depth >= MAX_DEPTH) {\n truncatedPaths.add(path);\n return '[Truncated: maximum depth]';\n }\n\n if (current instanceof Date) {\n const date = Number.isNaN(current.getTime())\n ? '[Invalid Date]'\n : current.toISOString();\n consume(path, date);\n return date;\n }\n if (ancestors.has(current)) {\n truncatedPaths.add(path);\n return '[Unsupported circular value]';\n }\n\n if (Array.isArray(current)) {\n ancestors.add(current);\n const output: unknown[] = [];\n const itemCount = Math.min(current.length, MAX_ARRAY_ITEMS);\n for (let index = 0; index < itemCount; index += 1) {\n if (remainingBytes <= 0) break;\n output.push(visit(current[index], `${path}[${index}]`, depth + 1));\n }\n if (current.length > output.length) truncatedPaths.add(path);\n ancestors.delete(current);\n return output;\n }\n\n const prototype = Object.getPrototypeOf(current);\n if (prototype !== Object.prototype && prototype !== null) {\n truncatedPaths.add(path);\n const constructorName =\n (current as { constructor?: { name?: string } }).constructor?.name ??\n 'object';\n return `[Unsupported object: ${constructorName}]`;\n }\n\n ancestors.add(current);\n const output: Record<string, unknown> = {};\n const keys = Object.keys(current as Record<string, unknown>);\n for (const key of keys.slice(0, MAX_OBJECT_KEYS)) {\n const childPath = objectPath(path, key);\n if (!consume(childPath, key)) break;\n if (isSecretKey(key)) {\n output[key] = '[REDACTED]';\n redactedPaths.add(childPath);\n } else {\n output[key] = visit(\n (current as Record<string, unknown>)[key],\n childPath,\n depth + 1,\n );\n }\n if (remainingBytes <= 0) break;\n }\n if (keys.length > Object.keys(output).length) truncatedPaths.add(path);\n ancestors.delete(current);\n return output;\n };\n\n const sanitized = visit(value, '$', 0);\n const serialized = JSON.stringify(sanitized);\n if (\n serialized === undefined ||\n stringByteLength(serialized) > MAX_SERIALIZED_BYTES\n ) {\n return { value: TRUNCATED_VALUE, truncatedPaths: ['$'] };\n }\n\n return {\n value: sanitized,\n ...(truncatedPaths.size > 0 ? { truncatedPaths: [...truncatedPaths] } : {}),\n ...(redactedPaths.size > 0 ? { redactedPaths: [...redactedPaths] } : {}),\n };\n}\n\nexport function sanitizeReportError(error: unknown): TestRunReportError {\n if (\n error instanceof Error ||\n (typeof error === 'object' &&\n error !== null &&\n typeof (error as { message?: unknown }).message === 'string')\n ) {\n const workflowLike = error as {\n name?: string;\n message: string;\n code?: unknown;\n details?: unknown;\n };\n return {\n name: sanitizeReportText(workflowLike.name || 'Error', 200),\n message: sanitizeReportText(workflowLike.message || String(error)),\n ...(typeof workflowLike.code === 'string'\n ? { code: sanitizeReportText(workflowLike.code, 200) }\n : {}),\n ...(workflowLike.details === undefined\n ? {}\n : { details: sanitizeReportValue(workflowLike.details) }),\n };\n }\n\n return {\n name: 'Error',\n message: sanitizeReportText(String(error)),\n };\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","MAX_DEPTH","MAX_STRING_LENGTH","MAX_ARRAY_ITEMS","MAX_OBJECT_KEYS","MAX_SERIALIZED_BYTES","TRUNCATED_VALUE","normalizedSecretKeys","normalizedKey","isSecretKey","normalized","secret","objectPath","parent","JSON","stringByteLength","value","TextEncoder","sanitizeReportText","maximumLength","sanitizeReportValue","truncatedPaths","Set","redactedPaths","ancestors","WeakSet","remainingBytes","consume","path","text","visit","current","depth","String","shortened","Number","undefined","Date","date","Array","output","itemCount","Math","index","prototype","constructorName","keys","childPath","sanitized","serialized","sanitizeReportError","error","Error","workflowLike"],"mappings":"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"}
@@ -0,0 +1,364 @@
1
+ "use strict";
2
+ var __webpack_require__ = {};
3
+ (()=>{
4
+ __webpack_require__.d = (exports1, definition)=>{
5
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
6
+ enumerable: true,
7
+ get: definition[key]
8
+ });
9
+ };
10
+ })();
11
+ (()=>{
12
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
13
+ })();
14
+ (()=>{
15
+ __webpack_require__.r = (exports1)=>{
16
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
17
+ value: 'Module'
18
+ });
19
+ Object.defineProperty(exports1, '__esModule', {
20
+ value: true
21
+ });
22
+ };
23
+ })();
24
+ var __webpack_exports__ = {};
25
+ __webpack_require__.r(__webpack_exports__);
26
+ __webpack_require__.d(__webpack_exports__, {
27
+ buildTestRunReportDump: ()=>buildTestRunReportDump,
28
+ collectTestRunReportSources: ()=>collectTestRunReportSources
29
+ });
30
+ const external_sanitize_js_namespaceObject = require("./sanitize.js");
31
+ const exactMidsceneDetailNodes = new Set([
32
+ 'aiAct',
33
+ 'aiAssert',
34
+ 'recordToReport'
35
+ ]);
36
+ const scopedExecutionKey = (scopeId, executionId)=>`${scopeId}\u0000${executionId}`;
37
+ const reportSourcesForScope = (context, scopeId)=>context.sourcesByScope.get(scopeId) ?? [];
38
+ const addDiagnostic = (context, diagnostic)=>{
39
+ context.diagnostics.push(diagnostic);
40
+ };
41
+ const buildStep = (step, scopeId, context, executionId)=>{
42
+ const details = [];
43
+ const unresolvedExecutionIds = [];
44
+ for (const trace of step.report?.traces ?? []){
45
+ const previousScope = context.tracedScopeByExecution.get(trace.executionId);
46
+ if (previousScope && previousScope !== scopeId) throw new Error(`Agent execution ${trace.executionId} was traced by multiple test scopes (${previousScope}, ${scopeId}).`);
47
+ context.tracedScopeByExecution.set(trace.executionId, scopeId);
48
+ const detail = context.detailsByScopeAndExecution.get(scopedExecutionKey(scopeId, trace.executionId));
49
+ if (detail) details.push(detail);
50
+ else unresolvedExecutionIds.push(trace.executionId);
51
+ }
52
+ let agentDetailDiagnostic;
53
+ if (unresolvedExecutionIds.length > 0) {
54
+ agentDetailDiagnostic = `Agent detail could not be resolved for ${unresolvedExecutionIds.join(', ')}.`;
55
+ const sources = reportSourcesForScope(context, scopeId);
56
+ for (const executionId of unresolvedExecutionIds)addDiagnostic(context, {
57
+ level: 'warning',
58
+ code: 'agent-detail-unresolved',
59
+ message: `Agent detail could not be resolved for execution ${executionId} in test scope ${scopeId}.`,
60
+ scopeId,
61
+ executionId,
62
+ ...sources.length > 0 ? {
63
+ sourcePaths: sources.map((source)=>source.sourcePath)
64
+ } : {}
65
+ });
66
+ } else if (0 === details.length && exactMidsceneDetailNodes.has(step.node)) {
67
+ agentDetailDiagnostic = 'This Agent did not expose a stable execution reference for the Step.';
68
+ addDiagnostic(context, {
69
+ level: 'warning',
70
+ code: 'agent-detail-unavailable',
71
+ message: `No stable Agent execution reference was captured for ${step.node} in test scope ${scopeId}.`,
72
+ scopeId,
73
+ ...reportSourcesForScope(context, scopeId).length > 0 ? {
74
+ sourcePaths: reportSourcesForScope(context, scopeId).map((source)=>source.sourcePath)
75
+ } : {}
76
+ });
77
+ }
78
+ const input = step.input;
79
+ const candidateTitle = input?.prompt ?? input?.script ?? input?.scenario ?? input?.title;
80
+ const prompt = 'string' == typeof candidateTitle ? candidateTitle : 'object' == typeof candidateTitle && null !== candidateTitle && 'prompt' in candidateTitle && 'string' == typeof candidateTitle.prompt ? candidateTitle.prompt : void 0;
81
+ return {
82
+ id: `${executionId}:${step.phase}:${step.stepIndex}`,
83
+ phase: step.phase,
84
+ stepIndex: step.stepIndex,
85
+ node: step.node,
86
+ ...prompt ? {
87
+ title: (0, external_sanitize_js_namespaceObject.sanitizeReportText)(prompt, 240)
88
+ } : {},
89
+ status: step.status,
90
+ continuedAfterError: step.continuedAfterError,
91
+ startedAt: step.startedAt,
92
+ endedAt: step.endedAt,
93
+ durationMs: step.durationMs,
94
+ input: (0, external_sanitize_js_namespaceObject.sanitizeReportValue)(step.input),
95
+ ...step.output ? {
96
+ output: {
97
+ ...void 0 === step.output.summary ? {} : {
98
+ summary: (0, external_sanitize_js_namespaceObject.sanitizeReportText)(step.output.summary)
99
+ },
100
+ ...void 0 === step.output.data ? {} : {
101
+ data: (0, external_sanitize_js_namespaceObject.sanitizeReportValue)(step.output.data)
102
+ }
103
+ }
104
+ } : {},
105
+ ...step.error ? {
106
+ error: (0, external_sanitize_js_namespaceObject.sanitizeReportError)(step.error)
107
+ } : {},
108
+ ...details.length > 0 ? {
109
+ agentDetails: details
110
+ } : {},
111
+ ...agentDetailDiagnostic ? {
112
+ agentDetailDiagnostic
113
+ } : {}
114
+ };
115
+ };
116
+ const attemptReportScope = (attempt)=>attempt.reportScopeId ?? attempt.runId;
117
+ const buildAttempt = (attempt, context)=>{
118
+ const scopeId = attemptReportScope(attempt);
119
+ return {
120
+ attemptId: attempt.runId,
121
+ attemptIndex: attempt.attemptIndex,
122
+ status: attempt.status,
123
+ startedAt: attempt.startedAt,
124
+ endedAt: attempt.endedAt,
125
+ durationMs: attempt.durationMs,
126
+ beforeEach: attempt.beforeEach.map((step)=>buildStep(step, scopeId, context, attempt.runId)),
127
+ steps: attempt.steps.map((step)=>buildStep(step, scopeId, context, attempt.runId)),
128
+ afterEach: attempt.afterEach.map((step)=>buildStep(step, scopeId, context, attempt.runId)),
129
+ ...attempt.executionErrors?.length ? {
130
+ hostErrors: attempt.executionErrors.map((error)=>({
131
+ phase: 'execution',
132
+ error: (0, external_sanitize_js_namespaceObject.sanitizeReportError)(error)
133
+ }))
134
+ } : {},
135
+ ...attempt.teardownErrors?.length ? {
136
+ teardownErrors: attempt.teardownErrors.map(external_sanitize_js_namespaceObject.sanitizeReportError)
137
+ } : {},
138
+ ...reportSourcesForScope(context, scopeId).length > 0 ? {
139
+ scopeReportIds: reportSourcesForScope(context, scopeId).map((source)=>source.reportId)
140
+ } : {}
141
+ };
142
+ };
143
+ const buildCase = (outcome, context)=>({
144
+ caseId: outcome.caseId,
145
+ name: outcome.name,
146
+ caseIndex: outcome.caseIndex,
147
+ status: outcome.status,
148
+ ...outcome.notRunReason ? {
149
+ notRunReason: outcome.notRunReason
150
+ } : {},
151
+ attempts: (outcome.attempts ?? (outcome.run ? [
152
+ outcome.run
153
+ ] : [])).map((attempt)=>buildAttempt(attempt, context))
154
+ });
155
+ const documentReportScope = (document)=>document.reportScopeId ?? document.documentRunId;
156
+ const buildDocument = (documentId, document, cases, context)=>{
157
+ const sourcePath = document?.sourcePath ?? cases[0]?.sourcePath ?? '<unknown>';
158
+ const status = document?.status ?? (cases.some((item)=>'success' !== item.status) ? 'failed' : 'success');
159
+ const scopeId = document ? documentReportScope(document) : void 0;
160
+ return {
161
+ documentId,
162
+ ...document ? {
163
+ logicalDocumentId: document.documentId,
164
+ documentRunId: document.documentRunId,
165
+ ...void 0 === document.attemptIndex ? {} : {
166
+ attemptIndex: document.attemptIndex
167
+ }
168
+ } : {},
169
+ sourcePath,
170
+ status,
171
+ ...document ? {
172
+ startedAt: document.startedAt,
173
+ endedAt: document.endedAt,
174
+ durationMs: document.durationMs
175
+ } : {},
176
+ beforeAll: (document?.beforeAll ?? []).map((step)=>buildStep(step, scopeId, context, document.documentRunId)),
177
+ cases: cases.map((outcome)=>buildCase(outcome, context)),
178
+ afterAll: (document?.afterAll ?? []).map((step)=>buildStep(step, scopeId, context, document.documentRunId)),
179
+ ...document?.hostErrors?.length || document?.executionErrors?.length ? {
180
+ hostErrors: [
181
+ ...document?.hostErrors ?? [],
182
+ ...(document?.executionErrors ?? []).map((error)=>({
183
+ phase: 'execution',
184
+ error
185
+ }))
186
+ ].map(({ phase, error })=>({
187
+ phase,
188
+ error: (0, external_sanitize_js_namespaceObject.sanitizeReportError)(error)
189
+ }))
190
+ } : {},
191
+ ...document?.teardownErrors?.length ? {
192
+ teardownErrors: document.teardownErrors.map(external_sanitize_js_namespaceObject.sanitizeReportError)
193
+ } : {},
194
+ ...scopeId && reportSourcesForScope(context, scopeId).length > 0 ? {
195
+ scopeReportIds: reportSourcesForScope(context, scopeId).map((source)=>source.reportId)
196
+ } : {}
197
+ };
198
+ };
199
+ const buildProject = (project, context)=>{
200
+ const documentCount = new Map();
201
+ for (const document of project.documents)documentCount.set(document.documentId, (documentCount.get(document.documentId) ?? 0) + 1);
202
+ for (const outcome of project.cases)if ((documentCount.get(outcome.documentId) ?? 0) > 1 && !outcome.documentRunId) throw new Error(`Case ${outcome.caseId} must identify its documentRunId when a document has multiple attempts.`);
203
+ const groups = [];
204
+ const currentGroup = new Map();
205
+ for (const document of project.documents){
206
+ let group = currentGroup.get(document.documentId);
207
+ if (!group || !document.attemptIndex) {
208
+ group = [];
209
+ groups.push(group);
210
+ currentGroup.set(document.documentId, group);
211
+ }
212
+ group.push(document);
213
+ }
214
+ const documents = groups.map((group)=>{
215
+ const first = group[0];
216
+ const last = group.at(-1);
217
+ const documentId = groups.filter((item)=>item[0].documentId === first.documentId).length > 1 ? `${first.documentId}:${first.documentRunId}` : first.documentId;
218
+ const outcomes = new Map();
219
+ for (const document of group)for (const outcome of project.cases.filter((item)=>item.documentId === document.documentId && (!item.documentRunId || item.documentRunId === document.documentRunId))){
220
+ const previous = outcomes.get(outcome.caseId);
221
+ outcomes.set(outcome.caseId, {
222
+ ...outcome,
223
+ attempts: [
224
+ ...previous?.attempts ?? [],
225
+ ...(outcome.attempts ?? (outcome.run ? [
226
+ outcome.run
227
+ ] : [])).map((attempt)=>({
228
+ ...attempt,
229
+ attemptIndex: document.attemptIndex ?? attempt.attemptIndex
230
+ }))
231
+ ]
232
+ });
233
+ }
234
+ const result = buildDocument(documentId, last, [
235
+ ...outcomes.values()
236
+ ], context);
237
+ if (group.length > 1) {
238
+ result.startedAt = first.startedAt;
239
+ result.durationMs = Math.max(0, Date.parse(last.endedAt) - Date.parse(first.startedAt));
240
+ result.attempts = group.map((document)=>{
241
+ const { cases: _cases, ...attempt } = buildDocument(documentId, document, [], context);
242
+ return attempt;
243
+ });
244
+ }
245
+ return result;
246
+ });
247
+ for (const documentId of new Set(project.cases.map((outcome)=>outcome.documentId)))if (!documentCount.has(documentId)) documents.push(buildDocument(documentId, void 0, project.cases.filter((outcome)=>outcome.documentId === documentId), context));
248
+ return {
249
+ projectId: project.projectId,
250
+ name: project.name,
251
+ platform: project.platform,
252
+ status: project.status,
253
+ retry: project.retry,
254
+ ...project.lifecycle ? {
255
+ lifecycle: {
256
+ status: project.lifecycle.status,
257
+ startedAt: project.lifecycle.startedAt,
258
+ endedAt: project.lifecycle.endedAt,
259
+ durationMs: project.lifecycle.durationMs,
260
+ ...project.lifecycle.setupError ? {
261
+ setupError: (0, external_sanitize_js_namespaceObject.sanitizeReportError)(project.lifecycle.setupError)
262
+ } : {},
263
+ ...project.lifecycle.teardownErrors?.length ? {
264
+ teardownErrors: project.lifecycle.teardownErrors.map(external_sanitize_js_namespaceObject.sanitizeReportError)
265
+ } : {}
266
+ }
267
+ } : {},
268
+ documents,
269
+ collectionErrors: project.collectionErrors.map((collectionError)=>({
270
+ sourcePath: collectionError.sourcePath,
271
+ error: (0, external_sanitize_js_namespaceObject.sanitizeReportError)(collectionError.error)
272
+ }))
273
+ };
274
+ };
275
+ function collectTestRunReportSources(result) {
276
+ const sources = [];
277
+ for (const project of result.projects){
278
+ for (const document of project.documents){
279
+ for (const source of document.reportSources ?? [])sources.push({
280
+ ...source,
281
+ scopeId: documentReportScope(document)
282
+ });
283
+ for (const sourcePath of (document.reportPaths ?? []).filter((path)=>!document.reportSources?.some((source)=>source.sourcePath === path)))sources.push({
284
+ scopeId: documentReportScope(document),
285
+ sourcePath
286
+ });
287
+ }
288
+ for (const outcome of project.cases)for (const attempt of outcome.attempts ?? (outcome.run ? [
289
+ outcome.run
290
+ ] : [])){
291
+ for (const source of attempt.reportSources ?? [])sources.push({
292
+ ...source,
293
+ scopeId: attemptReportScope(attempt)
294
+ });
295
+ for (const sourcePath of (attempt.reportPaths ?? []).filter((path)=>!attempt.reportSources?.some((source)=>source.sourcePath === path)))sources.push({
296
+ scopeId: attemptReportScope(attempt),
297
+ sourcePath
298
+ });
299
+ }
300
+ }
301
+ return sources;
302
+ }
303
+ function buildTestRunReportDump(result, index) {
304
+ const sourcesByScope = new Map();
305
+ const detailsByScopeAndExecution = new Map();
306
+ for (const source of index.sources){
307
+ const scopeSources = sourcesByScope.get(source.scopeId) ?? [];
308
+ scopeSources.push(source);
309
+ sourcesByScope.set(source.scopeId, scopeSources);
310
+ for (const executionId of source.executionIds)detailsByScopeAndExecution.set(scopedExecutionKey(source.scopeId, executionId), {
311
+ reportId: source.reportId,
312
+ executionId
313
+ });
314
+ }
315
+ const context = {
316
+ diagnostics: [],
317
+ sourcesByScope,
318
+ detailsByScopeAndExecution,
319
+ tracedScopeByExecution: new Map()
320
+ };
321
+ for (const error of result.errors ?? [])addDiagnostic(context, {
322
+ level: 'error',
323
+ code: 'run-infrastructure-error',
324
+ message: (0, external_sanitize_js_namespaceObject.sanitizeReportError)(error).message
325
+ });
326
+ for (const source of index.sources)if (0 === source.executionIds.length) addDiagnostic(context, {
327
+ level: 'warning',
328
+ code: 'source-without-executions',
329
+ message: `Agent report contains no executions: ${source.sourcePath}`,
330
+ scopeId: source.scopeId,
331
+ sourcePaths: [
332
+ source.sourcePath
333
+ ]
334
+ });
335
+ const projects = result.projects.map((project)=>buildProject(project, context));
336
+ return {
337
+ schemaVersion: 1,
338
+ kind: 'test-runner',
339
+ runId: result.runId,
340
+ status: result.status,
341
+ startedAt: result.startedAt,
342
+ endedAt: result.endedAt,
343
+ durationMs: result.durationMs,
344
+ summary: {
345
+ ...result.summary
346
+ },
347
+ metrics: index.metrics,
348
+ projects,
349
+ ...context.diagnostics.length > 0 ? {
350
+ diagnostics: context.diagnostics
351
+ } : {}
352
+ };
353
+ }
354
+ exports.buildTestRunReportDump = __webpack_exports__.buildTestRunReportDump;
355
+ exports.collectTestRunReportSources = __webpack_exports__.collectTestRunReportSources;
356
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
357
+ "buildTestRunReportDump",
358
+ "collectTestRunReportSources"
359
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
360
+ Object.defineProperty(exports, '__esModule', {
361
+ value: true
362
+ });
363
+
364
+ //# sourceMappingURL=test-run-report.js.map