@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
@@ -26,14 +26,20 @@ __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
27
  ScriptPlayer: ()=>ScriptPlayer
28
28
  });
29
- const external_node_fs_namespaceObject = require("node:fs");
29
+ const promises_namespaceObject = require("node:fs/promises");
30
30
  const external_node_path_namespaceObject = require("node:path");
31
- const utils_namespaceObject = require("@midscene/shared/utils");
32
- const external_zod_namespaceObject = require("zod");
33
- const task_status_js_namespaceObject = require("../dump/task-status.js");
34
31
  const common_namespaceObject = require("@midscene/shared/common");
35
32
  const logger_namespaceObject = require("@midscene/shared/logger");
33
+ const utils_namespaceObject = require("@midscene/shared/utils");
34
+ const execution_failure_js_namespaceObject = require("../test-runner/engine/execution-failure.js");
35
+ const resource_operations_js_namespaceObject = require("../test-runner/engine/resource-operations.js");
36
36
  const external_cleanup_js_namespaceObject = require("./cleanup.js");
37
+ const external_execution_session_js_namespaceObject = require("./execution-session.js");
38
+ const external_legacy_yaml_execution_record_js_namespaceObject = require("./legacy-yaml-execution-record.js");
39
+ const external_legacy_yaml_report_js_namespaceObject = require("./legacy-yaml-report.js");
40
+ const external_legacy_yaml_runtime_js_namespaceObject = require("./legacy-yaml-runtime.js");
41
+ const external_player_state_js_namespaceObject = require("./player-state.js");
42
+ const external_test_runner_compat_js_namespaceObject = require("./test-runner-compat.js");
37
43
  const external_utils_js_namespaceObject = require("./utils.js");
38
44
  function _define_property(obj, key, value) {
39
45
  if (key in obj) Object.defineProperty(obj, key, {
@@ -46,57 +52,12 @@ function _define_property(obj, key, value) {
46
52
  return obj;
47
53
  }
48
54
  const debug = (0, logger_namespaceObject.getDebug)('yaml-player');
49
- const aiTaskHandlerMap = {
50
- aiQuery: 'aiQuery',
51
- aiNumber: 'aiNumber',
52
- aiString: 'aiString',
53
- aiBoolean: 'aiBoolean',
54
- aiAsk: 'aiAsk',
55
- aiLocate: 'aiLocate'
56
- };
57
- const isStringParamSchema = (schema)=>{
58
- if (!schema) return false;
59
- const schemaDef = schema?._def;
60
- if (!schemaDef?.typeName) return false;
61
- switch(schemaDef.typeName){
62
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodString:
63
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodEnum:
64
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodNativeEnum:
65
- return true;
66
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodLiteral:
67
- return 'string' == typeof schemaDef.value;
68
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodOptional:
69
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodNullable:
70
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodDefault:
71
- return isStringParamSchema(schemaDef.innerType);
72
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodEffects:
73
- return isStringParamSchema(schemaDef.schema);
74
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodPipeline:
75
- return isStringParamSchema(schemaDef.out);
76
- case external_zod_namespaceObject.z.ZodFirstPartyTypeKind.ZodUnion:
77
- {
78
- const options = schemaDef.options;
79
- return Array.isArray(options) ? options.every((option)=>isStringParamSchema(option)) : false;
80
- }
81
- default:
82
- return false;
83
- }
84
- };
85
- const buildShortcutActionParam = (actionName, interfaceAlias, value)=>{
86
- if ('Launch' === actionName || 'launch' === interfaceAlias) return {
87
- uri: value
88
- };
89
- if ('Terminate' === actionName || 'terminate' === interfaceAlias) return {
90
- uri: value
91
- };
92
- if ('RunAdbShell' === actionName || 'runAdbShell' === interfaceAlias || 'RunHdcShell' === actionName || 'runHdcShell' === interfaceAlias) return {
93
- command: value
94
- };
95
- };
96
55
  class ScriptPlayer {
97
56
  setResult(key, value) {
98
57
  const keyToUse = key || this.unnamedResultIndex++;
99
- if (this.result[keyToUse]) console.warn(`result key ${keyToUse} already exists, will overwrite`);
58
+ if (this.result[keyToUse]) (0, logger_namespaceObject.getDebug)('yaml-player', {
59
+ console: true
60
+ })(`result key ${keyToUse} already exists, will overwrite`);
100
61
  this.result[keyToUse] = value;
101
62
  return this.flushResult();
102
63
  }
@@ -108,7 +69,7 @@ class ScriptPlayer {
108
69
  const taskIndexToNotify = 'number' == typeof taskIndex ? taskIndex : this.currentTaskIndex;
109
70
  if ('number' != typeof taskIndexToNotify) return;
110
71
  const taskStatus = this.taskStatusList[taskIndexToNotify];
111
- if (this.onTaskStatusChange) this.onTaskStatusChange(taskStatus);
72
+ this.onTaskStatusChange?.(taskStatus);
112
73
  }
113
74
  async setTaskStatus(index, statusValue, error) {
114
75
  this.taskStatusList[index].status = statusValue;
@@ -118,266 +79,78 @@ class ScriptPlayer {
118
79
  setTaskIndex(taskIndex) {
119
80
  this.currentTaskIndex = taskIndex;
120
81
  }
121
- flushResult() {
82
+ async flushResult() {
122
83
  if (this.output) {
123
84
  const output = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.output);
124
- const outputDir = (0, external_node_path_namespaceObject.dirname)(output);
125
- if (!(0, external_node_fs_namespaceObject.existsSync)(outputDir)) (0, external_node_fs_namespaceObject.mkdirSync)(outputDir, {
126
- recursive: true
85
+ await this.publish(output, async ()=>{
86
+ const outputDir = (0, external_node_path_namespaceObject.dirname)(output);
87
+ await (0, promises_namespaceObject.mkdir)(outputDir, {
88
+ recursive: true
89
+ });
90
+ await (0, promises_namespaceObject.writeFile)(output, JSON.stringify(this.result || {}, void 0, 2));
127
91
  });
128
- (0, external_node_fs_namespaceObject.writeFileSync)(output, JSON.stringify(this.result || {}, void 0, 2));
129
92
  }
130
93
  }
131
- flushUnstableLogContent() {
94
+ async flushUnstableLogContent() {
132
95
  if (this.unstableLogContent) {
133
96
  const content = this.interfaceAgent?._unstableLogContent();
134
97
  const filePath = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.unstableLogContent);
135
- const outputDir = (0, external_node_path_namespaceObject.dirname)(filePath);
136
- if (!(0, external_node_fs_namespaceObject.existsSync)(outputDir)) (0, external_node_fs_namespaceObject.mkdirSync)(outputDir, {
137
- recursive: true
98
+ await this.publish(filePath, async ()=>{
99
+ const outputDir = (0, external_node_path_namespaceObject.dirname)(filePath);
100
+ await (0, promises_namespaceObject.mkdir)(outputDir, {
101
+ recursive: true
102
+ });
103
+ await (0, promises_namespaceObject.writeFile)(filePath, JSON.stringify(content, null, 2));
138
104
  });
139
- (0, external_node_fs_namespaceObject.writeFileSync)(filePath, JSON.stringify(content, null, 2));
140
105
  }
141
106
  }
107
+ async publish(path, write) {
108
+ try {
109
+ await write();
110
+ } catch (cause) {
111
+ const error = new execution_failure_js_namespaceObject.WorkflowPublicationError('write-result', path, cause);
112
+ this.publicationErrors.push(error);
113
+ throw error;
114
+ }
115
+ }
116
+ createRuntime(agent) {
117
+ return (0, external_legacy_yaml_runtime_js_namespaceObject.createLegacyYamlRuntime)({
118
+ agent,
119
+ actionSpace: this.actionSpace,
120
+ sourcePath: this.scriptPath,
121
+ setResult: (key, value)=>this.setResult(key, value)
122
+ });
123
+ }
142
124
  async playTask(taskStatus, agent) {
143
125
  const { flow } = taskStatus;
144
126
  (0, utils_namespaceObject.assert)(flow, 'missing flow in task');
145
- for(const flowItemIndex in flow){
146
- const currentStep = Number.parseInt(flowItemIndex, 10);
147
- taskStatus.currentStep = currentStep;
148
- const flowItem = flow[flowItemIndex];
149
- const flowItemRecord = flowItem;
150
- const executionCountBeforeStep = agent.dump?.executions?.length ?? 0;
151
- this.failedReportExecutionInCurrentStep = false;
152
- try {
153
- await this.playFlowItem(agent, flowItem, flowItemRecord, flowItemIndex);
154
- } catch (error) {
155
- this.failedReportExecutionInCurrentStep = this.hasFailedReportExecutionSince(agent, executionCountBeforeStep);
156
- throw error;
127
+ const statusIndex = this.taskStatusList.indexOf(taskStatus);
128
+ const declaredIndex = taskStatus.index;
129
+ const taskIndex = statusIndex >= 0 ? statusIndex : 'number' == typeof declaredIndex && Number.isInteger(declaredIndex) ? declaredIndex : 0;
130
+ const state = (0, external_player_state_js_namespaceObject.getLegacyYamlPlayerState)(this);
131
+ state.executionResult = await this.createRuntime(agent).runTask(taskStatus, taskIndex, {
132
+ onStepStart: (info)=>{
133
+ if ('case' === info.scope && 'steps' === info.case.phase) taskStatus.currentStep = info.case.stepIndex;
157
134
  }
158
- }
135
+ });
136
+ const outcome = state.executionResult.cases[0];
137
+ if (!outcome || 'not-run' === outcome.status) throw new Error(`Task "${taskStatus.name}" did not run.`);
138
+ if ('failed' === outcome.status) throw (0, external_legacy_yaml_runtime_js_namespaceObject.legacyYamlOutcomeError)(outcome);
159
139
  this.reportFile = agent.reportFile;
160
140
  await this.flushUnstableLogContent();
161
141
  }
162
- hasFailedReportExecutionSince(agent, executionCountBefore) {
163
- const executions = (agent.dump?.executions ?? []).slice(executionCountBefore);
164
- return 'failed' === (0, task_status_js_namespaceObject.deriveCaseStatus)(executions);
165
- }
166
- async playFlowItem(agent, flowItem, flowItemRecord, flowItemIndex) {
167
- if ('Finalize' in flowItemRecord) return;
168
- debug(`playing step ${flowItemIndex}, flowItem=${JSON.stringify(flowItem)}`);
169
- const simpleAIKey = Object.keys(aiTaskHandlerMap).find((key)=>Object.prototype.hasOwnProperty.call(flowItemRecord, key));
170
- if ('aiAct' in flowItem || 'aiAction' in flowItem || 'ai' in flowItem) {
171
- const actionTask = flowItem;
172
- const { aiAct, aiAction, ai, instruction, ...actionOptions } = actionTask;
173
- const actionPrompt = aiAct ?? aiAction ?? ai;
174
- let promptForAI;
175
- if ('string' == typeof instruction && instruction) promptForAI = instruction;
176
- else if (instruction && 'object' == typeof instruction && 'string' == typeof instruction.prompt && instruction.prompt) promptForAI = instruction;
177
- else if (actionPrompt && 'object' == typeof actionPrompt && 'string' == typeof actionPrompt.prompt && actionPrompt.prompt) promptForAI = actionPrompt;
178
- else if ('string' == typeof actionPrompt && actionPrompt) promptForAI = actionPrompt;
179
- (0, utils_namespaceObject.assert)(promptForAI, 'missing prompt for ai (aiAct)');
180
- await agent.aiAct(promptForAI, actionOptions);
181
- } else if ('runGherkinScenario' in flowItem) {
182
- const gherkinScenarioTask = flowItem;
183
- const { runGherkinScenario } = gherkinScenarioTask;
184
- (0, utils_namespaceObject.assert)(runGherkinScenario, 'missing scenario for runGherkinScenario');
185
- await agent.runGherkinScenario(runGherkinScenario, {
186
- cacheable: false
187
- });
188
- } else if ('aiAssert' in flowItem) {
189
- const assertTask = flowItem;
190
- const { aiAssert: prompt, errorMessage: msg, name, ...restOpts } = assertTask;
191
- (0, utils_namespaceObject.assert)(prompt, 'missing prompt for aiAssert');
192
- (0, utils_namespaceObject.assert)(!Object.prototype.hasOwnProperty.call(assertTask, 'observe'), '`observe` is not supported in YAML aiAssert. Use agent.startObserving() from code instead.');
193
- const result = await agent.aiAssert(prompt, msg, {
194
- ...restOpts,
195
- keepRawResponse: true
196
- });
197
- const pass = result?.pass;
198
- const thought = result?.thought;
199
- const message = result?.message;
200
- this.setResult(name, {
201
- pass,
202
- thought,
203
- message
204
- });
205
- if (!pass) throw new Error(message);
206
- } else if (simpleAIKey) {
207
- const { [simpleAIKey]: prompt, name, ...options } = flowItem;
208
- (0, utils_namespaceObject.assert)(prompt, `missing prompt for ${simpleAIKey}`);
209
- (0, utils_namespaceObject.assert)(!Object.prototype.hasOwnProperty.call(flowItem, 'observe'), '`observe` is not supported in YAML flow items. Use agent.startObserving() from code instead.');
210
- const agentMethod = agent[aiTaskHandlerMap[simpleAIKey]];
211
- (0, utils_namespaceObject.assert)('function' == typeof agentMethod, `missing agent method for ${simpleAIKey}`);
212
- const aiResult = await agentMethod.call(agent, prompt, options);
213
- this.setResult(name, aiResult);
214
- } else if ('aiWaitFor' in flowItem) {
215
- const waitForTask = flowItem;
216
- const { aiWaitFor, timeout, ...restWaitForOpts } = waitForTask;
217
- const prompt = aiWaitFor;
218
- (0, utils_namespaceObject.assert)(prompt, 'missing prompt for aiWaitFor');
219
- const waitForOptions = {
220
- ...restWaitForOpts,
221
- ...void 0 !== timeout ? {
222
- timeout,
223
- timeoutMs: timeout
224
- } : {}
225
- };
226
- await agent.aiWaitFor(prompt, waitForOptions);
227
- } else if ('sleep' in flowItem) {
228
- const sleepTask = flowItem;
229
- const ms = sleepTask.sleep;
230
- let msNumber = ms;
231
- if ('string' == typeof ms) msNumber = Number.parseInt(ms, 10);
232
- (0, utils_namespaceObject.assert)(Number.isFinite(msNumber) && msNumber > 0, `ms for sleep must be greater than 0, but got ${ms}`);
233
- await agent.sleep(msNumber);
234
- } else if ("javascript" in flowItem) {
235
- const evaluateJavaScriptTask = flowItem;
236
- const result = await agent.evaluateJavaScript(evaluateJavaScriptTask.javascript);
237
- this.setResult(evaluateJavaScriptTask.name, result);
238
- } else if ('logScreenshot' in flowItem || 'recordToReport' in flowItem) {
239
- const recordTask = flowItem;
240
- const title = recordTask.recordToReport ?? recordTask.logScreenshot ?? 'untitled';
241
- const content = recordTask.content || '';
242
- await agent.recordToReport(title, {
243
- content
244
- });
245
- } else if ('aiInput' in flowItem) {
246
- const { aiInput, value: rawValue, ...inputTask } = flowItem;
247
- let locatePrompt;
248
- let value;
249
- if (inputTask.locate) {
250
- value = aiInput || rawValue;
251
- locatePrompt = inputTask.locate;
252
- } else {
253
- locatePrompt = aiInput || '';
254
- value = rawValue;
255
- }
256
- await agent.callActionInActionSpace('Input', {
257
- ...inputTask,
258
- ...void 0 !== value ? {
259
- value: String(value)
260
- } : {},
261
- ...locatePrompt ? {
262
- locate: (0, external_utils_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, inputTask)
263
- } : {}
264
- });
265
- } else if ('aiKeyboardPress' in flowItem) {
266
- const { aiKeyboardPress, ...keyboardPressTask } = flowItem;
267
- let locatePrompt;
268
- let keyName;
269
- if (keyboardPressTask.locate) {
270
- keyName = aiKeyboardPress;
271
- locatePrompt = keyboardPressTask.locate;
272
- } else if (keyboardPressTask.keyName) {
273
- keyName = keyboardPressTask.keyName;
274
- locatePrompt = aiKeyboardPress;
275
- } else keyName = aiKeyboardPress;
276
- await agent.callActionInActionSpace('KeyboardPress', {
277
- ...keyboardPressTask,
278
- ...keyName ? {
279
- keyName
280
- } : {},
281
- ...locatePrompt ? {
282
- locate: (0, external_utils_js_namespaceObject.buildDetailedLocateParam)(locatePrompt, keyboardPressTask)
283
- } : {}
284
- });
285
- } else if ('aiScroll' in flowItem) {
286
- const { aiScroll, ...scrollTask } = flowItem;
287
- const { locate, ...scrollOptions } = scrollTask;
288
- const locatePrompt = locate ?? aiScroll ?? void 0;
289
- await agent.aiScroll(locatePrompt, scrollOptions);
290
- } else if ('aiTap' in flowItem) {
291
- const { aiTap, prompt, locate, ...tapOptions } = flowItem;
292
- let locatePrompt;
293
- let opts = tapOptions;
294
- const locateObj = locate ?? ('object' == typeof aiTap && null !== aiTap ? aiTap.locate : void 0);
295
- if ('string' == typeof aiTap && aiTap) locatePrompt = aiTap;
296
- else if ('object' == typeof locateObj && locateObj?.prompt) {
297
- const { prompt: lp, ...locateOpts } = locateObj;
298
- locatePrompt = lp;
299
- opts = {
300
- ...locateOpts,
301
- ...tapOptions
302
- };
303
- } else locatePrompt = aiTap?.prompt || prompt || locateObj;
304
- (0, utils_namespaceObject.assert)(locatePrompt, 'missing prompt for aiTap');
305
- await agent.aiTap(locatePrompt, opts);
306
- } else {
307
- const actionSpace = this.actionSpace;
308
- let locatePromptShortcut;
309
- let actionParamForMatchedAction;
310
- const matchedAction = actionSpace.find((action)=>{
311
- const actionInterfaceAlias = action.interfaceAlias;
312
- if (actionInterfaceAlias && Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)) {
313
- actionParamForMatchedAction = flowItem[actionInterfaceAlias];
314
- if ('string' == typeof actionParamForMatchedAction) locatePromptShortcut = actionParamForMatchedAction;
315
- return true;
316
- }
317
- const keyOfActionInActionSpace = action.name;
318
- if (Object.prototype.hasOwnProperty.call(flowItem, keyOfActionInActionSpace)) {
319
- actionParamForMatchedAction = flowItem[keyOfActionInActionSpace];
320
- if ('string' == typeof actionParamForMatchedAction) locatePromptShortcut = actionParamForMatchedAction;
321
- return true;
322
- }
323
- return false;
324
- });
325
- (0, utils_namespaceObject.assert)(matchedAction, `unknown flowItem in yaml: ${JSON.stringify(flowItem)}`);
326
- const schemaIsStringParam = isStringParamSchema(matchedAction.paramSchema);
327
- let stringParamToCall;
328
- const resultName = flowItem.name;
329
- const timeout = flowItem.timeout;
330
- const hasRunAdbShellAlias = Object.prototype.hasOwnProperty.call(flowItem, 'runAdbShell');
331
- if (hasRunAdbShellAlias && 'string' == typeof actionParamForMatchedAction && 'number' == typeof timeout && 'function' == typeof agent.runAdbShell) {
332
- const result = await agent.runAdbShell(actionParamForMatchedAction, {
333
- timeout
334
- });
335
- if (void 0 !== result) this.setResult(resultName, result);
336
- return;
337
- }
338
- const specialActionParamToCall = 'string' == typeof actionParamForMatchedAction ? buildShortcutActionParam(matchedAction.name, matchedAction.interfaceAlias, actionParamForMatchedAction) : void 0;
339
- if (specialActionParamToCall) {
340
- debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(specialActionParamToCall)}`);
341
- const result = await agent.callActionInActionSpace(matchedAction.name, specialActionParamToCall);
342
- if (void 0 !== result) this.setResult(resultName, result);
343
- } else if ('string' == typeof actionParamForMatchedAction && schemaIsStringParam) {
344
- if (matchedAction.paramSchema) {
345
- const parseResult = matchedAction.paramSchema.safeParse(actionParamForMatchedAction);
346
- if (parseResult.success && 'string' == typeof parseResult.data) stringParamToCall = parseResult.data;
347
- else if (!parseResult.success) {
348
- debug(`parse failed for action ${matchedAction.name} with string param`, parseResult.error);
349
- stringParamToCall = actionParamForMatchedAction;
350
- }
351
- } else stringParamToCall = actionParamForMatchedAction;
352
- if (void 0 !== stringParamToCall) {
353
- debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(stringParamToCall)}`);
354
- const result = await agent.callActionInActionSpace(matchedAction.name, stringParamToCall);
355
- const resultName = flowItem.name;
356
- if (void 0 !== result) this.setResult(resultName, result);
357
- }
358
- } else {
359
- const sourceForParams = locatePromptShortcut && 'string' == typeof actionParamForMatchedAction ? {
360
- ...flowItem,
361
- prompt: locatePromptShortcut
362
- } : 'object' == typeof actionParamForMatchedAction && null !== actionParamForMatchedAction ? actionParamForMatchedAction : flowItem;
363
- const { locateParam, restParams } = (0, external_utils_js_namespaceObject.buildDetailedLocateParamAndRestParams)(locatePromptShortcut || '', sourceForParams, [
364
- matchedAction.name,
365
- matchedAction.interfaceAlias || '_never_mind_'
366
- ]);
367
- const flowParams = {
368
- ...restParams,
369
- locate: locateParam
370
- };
371
- debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(flowParams, null, 2)}`);
372
- const result = await agent.callActionInActionSpace(matchedAction.name, flowParams);
373
- const resultName = flowItem.name;
374
- if (void 0 !== result) this.setResult(resultName, result);
375
- }
376
- }
377
- }
378
142
  async run() {
379
- const { target, web, android, ios, harmony, computer, tasks } = this.script;
380
- const webEnv = web || target;
143
+ return (0, external_execution_session_js_namespaceObject.runInYamlExecutionContext)(()=>this.runInContext());
144
+ }
145
+ async runInContext() {
146
+ const startedAt = new Date();
147
+ const runId = (0, utils_namespaceObject.uuid)();
148
+ const state = (0, external_player_state_js_namespaceObject.getLegacyYamlPlayerState)(this);
149
+ state.executionResult = void 0;
150
+ state.executionRecord = void 0;
151
+ this.publicationErrors = [];
152
+ const { android, ios, harmony, computer } = this.script;
153
+ const webEnv = (0, external_utils_js_namespaceObject.resolveWebTarget)(this.script)?.target;
381
154
  const androidEnv = android;
382
155
  const iosEnv = ios;
383
156
  const harmonyEnv = harmony;
@@ -386,65 +159,155 @@ class ScriptPlayer {
386
159
  this.setPlayerStatus('running');
387
160
  let agent = null;
388
161
  let freeFn = [];
162
+ let setupError;
163
+ let executionError;
164
+ let cleanupError;
165
+ let signal;
166
+ let session;
389
167
  try {
390
168
  const { agent: newAgent, freeFn: newFreeFn } = await this.setupAgent(platform);
391
- this.actionSpace = await newAgent.getActionSpace();
392
169
  agent = newAgent;
170
+ agent._prepareForTestRunner?.();
171
+ freeFn = [
172
+ ...newFreeFn || []
173
+ ];
174
+ session = (0, external_execution_session_js_namespaceObject.enterYamlExecution)(agent);
175
+ signal = (0, external_execution_session_js_namespaceObject.currentYamlSignal)(agent);
176
+ signal?.throwIfAborted();
177
+ this.actionSpace = await agent.getActionSpace();
393
178
  const originalOnTaskStartTip = agent.onTaskStartTip;
394
179
  agent.onTaskStartTip = (tip)=>{
395
180
  if ('running' === this.status) this.agentStatusTip = tip;
396
181
  originalOnTaskStartTip?.(tip);
397
182
  };
398
- freeFn = [
399
- ...newFreeFn || [],
400
- {
401
- name: 'restore-agent-onTaskStartTip',
402
- fn: ()=>{
403
- if (agent) agent.onTaskStartTip = originalOnTaskStartTip;
404
- }
183
+ freeFn.push({
184
+ name: 'restore-agent-onTaskStartTip',
185
+ fn: ()=>{
186
+ if (agent) agent.onTaskStartTip = originalOnTaskStartTip;
405
187
  }
406
- ];
407
- } catch (e) {
408
- this.setPlayerStatus('error', e);
409
- return;
188
+ });
189
+ } catch (error) {
190
+ if (error instanceof external_execution_session_js_namespaceObject.YamlExecutionOwnershipError) throw error;
191
+ setupError = error;
192
+ this.setPlayerStatus('error', error);
410
193
  }
411
194
  this.interfaceAgent = agent;
412
- let taskIndex = 0;
413
- this.setPlayerStatus('running');
414
- let errorFlag = false;
415
- while(taskIndex < tasks.length){
416
- const taskStatus = this.taskStatusList[taskIndex];
417
- this.setTaskStatus(taskIndex, 'running');
418
- this.setTaskIndex(taskIndex);
419
- this.failedReportExecutionInCurrentStep = false;
420
- try {
421
- await this.playTask(taskStatus, this.interfaceAgent);
422
- this.setTaskStatus(taskIndex, 'done');
423
- } catch (e) {
424
- this.setTaskStatus(taskIndex, 'error', e);
425
- const recordErrorToReport = agent.recordErrorToReport;
426
- if (!this.failedReportExecutionInCurrentStep && 'function' == typeof recordErrorToReport) try {
427
- await recordErrorToReport.call(agent, `YAML task failed - ${taskStatus.name}`, {
428
- error: e,
429
- content: `Step ${taskStatus.currentStep ?? 0} failed while running YAML task "${taskStatus.name}".`
430
- });
431
- } catch (reportError) {
432
- debug('failed to record yaml error to report', reportError);
433
- }
434
- if (taskStatus.continueOnError) ;
435
- else {
436
- this.reportFile = agent.reportFile;
437
- errorFlag = true;
438
- break;
439
- }
195
+ const document = (0, external_test_runner_compat_js_namespaceObject.collectLegacyYamlDocument)(this.script, this.scriptPath ?? '<inline-yaml>', this.actionSpace);
196
+ const runtime = agent && !setupError ? this.createRuntime(agent) : void 0;
197
+ try {
198
+ if (runtime && agent) {
199
+ state.executionResult = await runtime.runScript(this.script, {
200
+ document,
201
+ signal,
202
+ createDocumentRunId: ()=>runId,
203
+ onCaseStart: (collectedCase)=>{
204
+ const taskIndex = collectedCase.caseIndex;
205
+ this.setTaskIndex(taskIndex);
206
+ return this.setTaskStatus(taskIndex, 'running');
207
+ },
208
+ onStepStart: (info)=>{
209
+ if ('case' !== info.scope || 'steps' !== info.case.phase) return;
210
+ const taskStatus = this.taskStatusList[info.case.caseIndex];
211
+ if (taskStatus) taskStatus.currentStep = info.case.stepIndex;
212
+ },
213
+ onCaseOutcome: async (outcome)=>{
214
+ if ('not-run' === outcome.status) return;
215
+ const taskIndex = outcome.caseIndex;
216
+ const taskStatus = this.taskStatusList[taskIndex];
217
+ (0, utils_namespaceObject.assert)(taskStatus, `missing YAML task at index ${taskIndex}`);
218
+ this.reportFile = agent?.reportFile;
219
+ if ('success' === outcome.status) {
220
+ await this.setTaskStatus(taskIndex, 'done');
221
+ await this.flushUnstableLogContent();
222
+ return;
223
+ }
224
+ const error = (0, external_legacy_yaml_runtime_js_namespaceObject.legacyYamlOutcomeError)(outcome);
225
+ await this.setTaskStatus(taskIndex, 'error', error);
226
+ }
227
+ });
228
+ const stoppedOnFailure = state.executionResult.cases.some((outcome)=>'failed' === outcome.status && !this.taskStatusList[outcome.caseIndex]?.continueOnError);
229
+ this.setPlayerStatus(stoppedOnFailure || signal?.aborted ? 'error' : 'done');
440
230
  }
441
- this.reportFile = agent?.reportFile;
442
- taskIndex++;
231
+ } catch (error) {
232
+ executionError = error;
233
+ if (error instanceof execution_failure_js_namespaceObject.WorkflowExecutionFailure) state.executionResult = error.result;
234
+ this.setPlayerStatus('error', error);
443
235
  }
444
- if (errorFlag) this.setPlayerStatus('error');
445
- else this.setPlayerStatus('done');
236
+ this.reportFile = agent?.reportFile;
446
237
  this.agentStatusTip = '';
447
- await (0, external_cleanup_js_namespaceObject.runFreeFnCleanup)(freeFn);
238
+ try {
239
+ if (session?.isRoot && agent) await (0, resource_operations_js_namespaceObject.cleanupResources)([
240
+ agent
241
+ ], ()=>(0, external_cleanup_js_namespaceObject.runFreeFnCleanup)(freeFn), {
242
+ owner: this,
243
+ signal,
244
+ onDeferredError: (error)=>(0, logger_namespaceObject.getDebug)('yaml-player', {
245
+ console: true
246
+ })(`Deferred YAML cleanup failed: ${String(error)}`)
247
+ });
248
+ else await (0, external_cleanup_js_namespaceObject.runFreeFnCleanup)(freeFn);
249
+ } catch (error) {
250
+ cleanupError = error;
251
+ this.setPlayerStatus('error', setupError ?? executionError ?? error);
252
+ }
253
+ const endedAt = new Date();
254
+ const cleanupErrors = cleanupError instanceof AggregateError ? cleanupError.errors : void 0 === cleanupError ? [] : [
255
+ cleanupError
256
+ ];
257
+ state.executionRecord = (0, external_legacy_yaml_execution_record_js_namespaceObject.createLegacyYamlExecutionRecord)({
258
+ runId,
259
+ attemptIndex: 0,
260
+ script: this.script,
261
+ document,
262
+ startedAt,
263
+ endedAt,
264
+ execution: state.executionResult,
265
+ setupError,
266
+ executionError,
267
+ cleanupErrors,
268
+ aborted: signal?.aborted ?? false,
269
+ publicationErrors: this.publicationErrors,
270
+ outputs: this.result,
271
+ reportFile: agent?.reportFile,
272
+ children: session?.children
273
+ });
274
+ let reportError;
275
+ if (!session || session.isRoot) try {
276
+ const published = await (0, external_legacy_yaml_report_js_namespaceObject.publishLegacyYamlReport)({
277
+ agent,
278
+ record: state.executionRecord,
279
+ runId,
280
+ script: this.script,
281
+ scriptPath: this.scriptPath,
282
+ fallbackReportFileName: state.fallbackReportFileName
283
+ });
284
+ this.reportFile = published.reportFile;
285
+ state.executionRecord = published.record;
286
+ } catch (error) {
287
+ reportError = error;
288
+ this.setPlayerStatus('error', setupError ?? executionError ?? cleanupError ?? error);
289
+ state.executionRecord = Object.freeze({
290
+ ...state.executionRecord,
291
+ status: 'failed',
292
+ reportError: error
293
+ });
294
+ }
295
+ session?.finish(state.executionRecord);
296
+ if (reportError) {
297
+ const errors = [
298
+ setupError,
299
+ executionError,
300
+ ...cleanupErrors,
301
+ reportError
302
+ ].filter((error)=>void 0 !== error);
303
+ throw 1 === errors.length ? reportError : new AggregateError(errors, 'YAML execution/report finalization failed');
304
+ }
305
+ if (executionError && cleanupError) throw new AggregateError([
306
+ executionError,
307
+ ...cleanupErrors
308
+ ], 'YAML execution and cleanup failed');
309
+ if (executionError) throw executionError;
310
+ if (cleanupError) throw cleanupError;
448
311
  }
449
312
  constructor(script, setupAgent, onTaskStatusChange, scriptPath){
450
313
  _define_property(this, "script", void 0);
@@ -456,6 +319,7 @@ class ScriptPlayer {
456
319
  _define_property(this, "reportFile", void 0);
457
320
  _define_property(this, "result", void 0);
458
321
  _define_property(this, "unnamedResultIndex", void 0);
322
+ _define_property(this, "publicationErrors", void 0);
459
323
  _define_property(this, "output", void 0);
460
324
  _define_property(this, "unstableLogContent", void 0);
461
325
  _define_property(this, "errorInSetup", void 0);
@@ -464,33 +328,35 @@ class ScriptPlayer {
464
328
  _define_property(this, "target", void 0);
465
329
  _define_property(this, "actionSpace", void 0);
466
330
  _define_property(this, "scriptPath", void 0);
467
- _define_property(this, "failedReportExecutionInCurrentStep", void 0);
468
331
  this.script = script;
469
332
  this.setupAgent = setupAgent;
470
333
  this.onTaskStatusChange = onTaskStatusChange;
471
334
  this.taskStatusList = [];
472
335
  this.status = 'init';
473
336
  this.unnamedResultIndex = 0;
337
+ this.publicationErrors = [];
474
338
  this.interfaceAgent = null;
475
339
  this.actionSpace = [];
476
- this.failedReportExecutionInCurrentStep = false;
477
340
  this.scriptPath = scriptPath;
341
+ (0, external_test_runner_compat_js_namespaceObject.collectLegacyYamlDocument)(script, scriptPath);
342
+ (0, external_player_state_js_namespaceObject.initializeLegacyYamlPlayerState)(this);
478
343
  this.result = {};
479
- this.target = script.target || script.web || script.android || script.ios || script.computer || script.config;
344
+ this.target = (0, external_utils_js_namespaceObject.resolveWebTarget)(script)?.target || script.android || script.ios || script.harmony || script.computer || script.config;
345
+ const outputConfig = (0, external_utils_js_namespaceObject.resolveYamlOutputConfig)(script);
480
346
  if (utils_namespaceObject.ifInBrowser || utils_namespaceObject.ifInWorker) {
481
347
  this.output = void 0;
482
348
  debug('output is undefined in browser or worker');
483
- } else if (this.target?.output) {
484
- this.output = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.target.output);
349
+ } else if (outputConfig.output) {
350
+ this.output = (0, external_node_path_namespaceObject.resolve)(process.cwd(), outputConfig.output);
485
351
  debug('setting output by config.output', this.output);
486
352
  } else {
487
353
  const scriptName = this.scriptPath ? (0, external_node_path_namespaceObject.basename)(this.scriptPath, '.yaml').replace(/\.(ya?ml)$/i, '') : "script";
488
- this.output = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), `${scriptName}-${Date.now()}.json`);
354
+ this.output = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), `${scriptName}-${(0, utils_namespaceObject.uuid)()}.json`);
489
355
  debug("setting output by script path", this.output);
490
356
  }
491
357
  if (utils_namespaceObject.ifInBrowser || utils_namespaceObject.ifInWorker) this.unstableLogContent = void 0;
492
- else if ('string' == typeof this.target?.unstableLogContent) this.unstableLogContent = (0, external_node_path_namespaceObject.resolve)(process.cwd(), this.target.unstableLogContent);
493
- else if (this.target?.unstableLogContent === true) this.unstableLogContent = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), 'unstableLogContent.json');
358
+ else if ('string' == typeof outputConfig.unstableLogContent) this.unstableLogContent = (0, external_node_path_namespaceObject.resolve)(process.cwd(), outputConfig.unstableLogContent);
359
+ else if (true === outputConfig.unstableLogContent) this.unstableLogContent = (0, external_node_path_namespaceObject.join)((0, common_namespaceObject.getMidsceneRunSubDir)('output'), 'unstableLogContent.json');
494
360
  this.taskStatusList = (script.tasks || []).map((task, taskIndex)=>({
495
361
  ...task,
496
362
  index: taskIndex,