@aiscene/core 9.0.6 → 9.0.8

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 (686) hide show
  1. package/dist/es/agent/agent.mjs +24 -11
  2. package/dist/es/agent/agent.mjs.map +1 -1
  3. package/dist/es/agent/cache-config.mjs +19 -0
  4. package/dist/es/agent/cache-config.mjs.map +1 -0
  5. package/dist/es/agent/file-chooser.mjs +82 -0
  6. package/dist/es/agent/file-chooser.mjs.map +1 -0
  7. package/dist/es/agent/insight.mjs +101 -0
  8. package/dist/es/agent/insight.mjs.map +1 -0
  9. package/dist/es/agent/metrics.mjs +81 -0
  10. package/dist/es/agent/metrics.mjs.map +1 -0
  11. package/dist/es/agent/progress/ai-act-progress.mjs +199 -0
  12. package/dist/es/agent/progress/ai-act-progress.mjs.map +1 -0
  13. package/dist/es/agent/progress/index.mjs +2 -0
  14. package/dist/es/agent/progress/progress-bus.mjs +52 -0
  15. package/dist/es/agent/progress/progress-bus.mjs.map +1 -0
  16. package/dist/es/agent/prompt-context.mjs +25 -0
  17. package/dist/es/agent/prompt-context.mjs.map +1 -0
  18. package/dist/es/agent/record-to-report.mjs +14 -0
  19. package/dist/es/agent/record-to-report.mjs.map +1 -0
  20. package/dist/es/agent/run-gherkin-scenario.mjs +114 -0
  21. package/dist/es/agent/run-gherkin-scenario.mjs.map +1 -0
  22. package/dist/es/agent/run-markdown.mjs +62 -0
  23. package/dist/es/agent/run-markdown.mjs.map +1 -0
  24. package/dist/es/agent/screenshot-preparation.mjs +37 -0
  25. package/dist/es/agent/screenshot-preparation.mjs.map +1 -0
  26. package/dist/es/agent/ui-observer.mjs +385 -0
  27. package/dist/es/agent/ui-observer.mjs.map +1 -0
  28. package/dist/es/agent/utils.mjs +42 -4
  29. package/dist/es/agent/utils.mjs.map +1 -1
  30. package/dist/es/ai-model/connectivity/fixture.mjs +8 -0
  31. package/dist/es/ai-model/connectivity/fixture.mjs.map +1 -0
  32. package/dist/es/ai-model/connectivity/index.mjs +2 -0
  33. package/dist/es/ai-model/connectivity/run-connectivity-test.mjs +160 -0
  34. package/dist/es/ai-model/connectivity/run-connectivity-test.mjs.map +1 -0
  35. package/dist/es/ai-model/conversation-history.mjs.map +1 -1
  36. package/dist/es/ai-model/index.mjs +2 -1
  37. package/dist/es/ai-model/inspect.mjs +1 -1
  38. package/dist/es/ai-model/inspect.mjs.map +1 -1
  39. package/dist/es/ai-model/model-adapter/chat-completion.mjs +69 -0
  40. package/dist/es/ai-model/model-adapter/chat-completion.mjs.map +1 -0
  41. package/dist/es/ai-model/model-adapter/custom-planning-action.mjs +6 -0
  42. package/dist/es/ai-model/model-adapter/custom-planning-action.mjs.map +1 -0
  43. package/dist/es/ai-model/model-adapter/custom-planning-types.mjs +0 -0
  44. package/dist/es/ai-model/model-adapter/default-insight-protocol.mjs +28 -0
  45. package/dist/es/ai-model/model-adapter/default-insight-protocol.mjs.map +1 -0
  46. package/dist/es/ai-model/model-adapter/default-locate-protocol.mjs +145 -0
  47. package/dist/es/ai-model/model-adapter/default-locate-protocol.mjs.map +1 -0
  48. package/dist/es/ai-model/model-adapter/default-planning-protocol.mjs +124 -0
  49. package/dist/es/ai-model/model-adapter/default-planning-protocol.mjs.map +1 -0
  50. package/dist/es/ai-model/model-adapter/image-preprocess.mjs +27 -0
  51. package/dist/es/ai-model/model-adapter/image-preprocess.mjs.map +1 -0
  52. package/dist/es/ai-model/model-adapter/index.mjs +2 -0
  53. package/dist/es/ai-model/model-adapter/insight-protocol.mjs +0 -0
  54. package/dist/es/ai-model/model-adapter/insight.mjs +13 -0
  55. package/dist/es/ai-model/model-adapter/insight.mjs.map +1 -0
  56. package/dist/es/ai-model/model-adapter/locate-protocol.mjs +0 -0
  57. package/dist/es/ai-model/model-adapter/locate.mjs +53 -0
  58. package/dist/es/ai-model/model-adapter/locate.mjs.map +1 -0
  59. package/dist/es/ai-model/model-adapter/planning-protocol.mjs +0 -0
  60. package/dist/es/ai-model/model-adapter/planning.mjs +49 -0
  61. package/dist/es/ai-model/model-adapter/planning.mjs.map +1 -0
  62. package/dist/es/ai-model/model-adapter/resolve.mjs +54 -0
  63. package/dist/es/ai-model/model-adapter/resolve.mjs.map +1 -0
  64. package/dist/es/ai-model/model-adapter/types.mjs +0 -0
  65. package/dist/es/ai-model/models/auto-glm/actions.mjs +205 -0
  66. package/dist/es/ai-model/models/auto-glm/actions.mjs.map +1 -0
  67. package/dist/es/ai-model/models/auto-glm/adapter.mjs +45 -0
  68. package/dist/es/ai-model/models/auto-glm/adapter.mjs.map +1 -0
  69. package/dist/es/ai-model/models/auto-glm/locate.mjs +11 -0
  70. package/dist/es/ai-model/models/auto-glm/locate.mjs.map +1 -0
  71. package/dist/es/ai-model/models/auto-glm/parser.mjs +217 -0
  72. package/dist/es/ai-model/models/auto-glm/parser.mjs.map +1 -0
  73. package/dist/es/ai-model/models/auto-glm/planning.mjs +33 -0
  74. package/dist/es/ai-model/models/auto-glm/planning.mjs.map +1 -0
  75. package/dist/es/ai-model/models/auto-glm/prompt.mjs +214 -0
  76. package/dist/es/ai-model/models/auto-glm/prompt.mjs.map +1 -0
  77. package/dist/es/ai-model/models/deepseek/adapter.mjs +79 -0
  78. package/dist/es/ai-model/models/deepseek/adapter.mjs.map +1 -0
  79. package/dist/es/ai-model/models/deepseek/locate-protocol.mjs +89 -0
  80. package/dist/es/ai-model/models/deepseek/locate-protocol.mjs.map +1 -0
  81. package/dist/es/ai-model/models/default.mjs +13 -0
  82. package/dist/es/ai-model/models/default.mjs.map +1 -0
  83. package/dist/es/ai-model/models/doubao.mjs +95 -0
  84. package/dist/es/ai-model/models/doubao.mjs.map +1 -0
  85. package/dist/es/ai-model/models/gemini.mjs +100 -0
  86. package/dist/es/ai-model/models/gemini.mjs.map +1 -0
  87. package/dist/es/ai-model/models/glm.mjs +46 -0
  88. package/dist/es/ai-model/models/glm.mjs.map +1 -0
  89. package/dist/es/ai-model/models/gpt.mjs +43 -0
  90. package/dist/es/ai-model/models/gpt.mjs.map +1 -0
  91. package/dist/es/ai-model/models/index.mjs +2 -0
  92. package/dist/es/ai-model/models/kimi.mjs +102 -0
  93. package/dist/es/ai-model/models/kimi.mjs.map +1 -0
  94. package/dist/es/ai-model/models/mimo.mjs +36 -0
  95. package/dist/es/ai-model/models/mimo.mjs.map +1 -0
  96. package/dist/es/ai-model/models/qwen.mjs +139 -0
  97. package/dist/es/ai-model/models/qwen.mjs.map +1 -0
  98. package/dist/es/ai-model/models/registry.mjs +51 -0
  99. package/dist/es/ai-model/models/registry.mjs.map +1 -0
  100. package/dist/es/ai-model/models/ui-tars/actions.mjs +147 -0
  101. package/dist/es/ai-model/models/ui-tars/actions.mjs.map +1 -0
  102. package/dist/es/ai-model/models/ui-tars/adapter.mjs +102 -0
  103. package/dist/es/ai-model/models/ui-tars/adapter.mjs.map +1 -0
  104. package/dist/es/ai-model/models/ui-tars/parser.mjs +40 -0
  105. package/dist/es/ai-model/models/ui-tars/parser.mjs.map +1 -0
  106. package/dist/es/ai-model/models/ui-tars/planning.mjs +25 -0
  107. package/dist/es/ai-model/models/ui-tars/planning.mjs.map +1 -0
  108. package/dist/es/ai-model/models/ui-tars/prompt.mjs +36 -0
  109. package/dist/es/ai-model/models/ui-tars/prompt.mjs.map +1 -0
  110. package/dist/es/ai-model/models/utils/intent.mjs +6 -0
  111. package/dist/es/ai-model/models/utils/intent.mjs.map +1 -0
  112. package/dist/es/ai-model/prompt/insight/index.mjs +3 -0
  113. package/dist/es/ai-model/prompt/insight/system-prompt.mjs +104 -0
  114. package/dist/es/ai-model/prompt/insight/system-prompt.mjs.map +1 -0
  115. package/dist/es/ai-model/prompt/insight/user-prompt.mjs +23 -0
  116. package/dist/es/ai-model/prompt/insight/user-prompt.mjs.map +1 -0
  117. package/dist/es/ai-model/prompt/locate/element-system-prompt.mjs +12 -0
  118. package/dist/es/ai-model/prompt/locate/element-system-prompt.mjs.map +1 -0
  119. package/dist/es/ai-model/prompt/locate/grounding-rules.mjs +13 -0
  120. package/dist/es/ai-model/prompt/locate/grounding-rules.mjs.map +1 -0
  121. package/dist/es/ai-model/prompt/locate/index.mjs +4 -0
  122. package/dist/es/ai-model/prompt/locate/search-area-system-prompt.mjs +9 -0
  123. package/dist/es/ai-model/prompt/locate/search-area-system-prompt.mjs.map +1 -0
  124. package/dist/es/ai-model/prompt/planning/action-output-example.mjs +52 -0
  125. package/dist/es/ai-model/prompt/planning/action-output-example.mjs.map +1 -0
  126. package/dist/es/ai-model/prompt/planning/action-space-description.mjs +28 -0
  127. package/dist/es/ai-model/prompt/planning/action-space-description.mjs.map +1 -0
  128. package/dist/es/ai-model/prompt/planning/index.mjs +6 -0
  129. package/dist/es/ai-model/prompt/planning/multi-turn-example.mjs +221 -0
  130. package/dist/es/ai-model/prompt/planning/multi-turn-example.mjs.map +1 -0
  131. package/dist/es/ai-model/prompt/planning/planning-response-example.mjs +25 -0
  132. package/dist/es/ai-model/prompt/planning/planning-response-example.mjs.map +1 -0
  133. package/dist/es/ai-model/prompt/planning/sub-goals-text.mjs +17 -0
  134. package/dist/es/ai-model/prompt/planning/sub-goals-text.mjs.map +1 -0
  135. package/dist/es/ai-model/prompt/planning/system-prompt.mjs +293 -0
  136. package/dist/es/ai-model/prompt/planning/system-prompt.mjs.map +1 -0
  137. package/dist/es/ai-model/service-caller/codex-app-server.mjs +1 -0
  138. package/dist/es/ai-model/service-caller/codex-app-server.mjs.map +1 -1
  139. package/dist/es/ai-model/service-caller/index.mjs +35 -16
  140. package/dist/es/ai-model/service-caller/index.mjs.map +1 -1
  141. package/dist/es/ai-model/service-caller/model-call-recorder.mjs +74 -0
  142. package/dist/es/ai-model/service-caller/model-call-recorder.mjs.map +1 -0
  143. package/dist/es/ai-model/service-caller/openai-error.mjs +147 -0
  144. package/dist/es/ai-model/service-caller/openai-error.mjs.map +1 -0
  145. package/dist/es/ai-model/service-caller/proxy-deps.node.mjs +9 -0
  146. package/dist/es/ai-model/service-caller/proxy-deps.node.mjs.map +1 -0
  147. package/dist/es/ai-model/service-caller/proxy-deps.stub.mjs +12 -0
  148. package/dist/es/ai-model/service-caller/proxy-deps.stub.mjs.map +1 -0
  149. package/dist/es/ai-model/service-caller/semantic-retry.mjs +33 -0
  150. package/dist/es/ai-model/service-caller/semantic-retry.mjs.map +1 -0
  151. package/dist/es/ai-model/service-caller/types.mjs +0 -0
  152. package/dist/es/ai-model/shared/action-schema.mjs +15 -0
  153. package/dist/es/ai-model/shared/action-schema.mjs.map +1 -0
  154. package/dist/es/ai-model/shared/json.mjs +63 -0
  155. package/dist/es/ai-model/shared/json.mjs.map +1 -0
  156. package/dist/es/ai-model/shared/model-locate-result/bbox.mjs +60 -0
  157. package/dist/es/ai-model/shared/model-locate-result/bbox.mjs.map +1 -0
  158. package/dist/es/ai-model/shared/model-locate-result/coordinate-distance.mjs +10 -0
  159. package/dist/es/ai-model/shared/model-locate-result/coordinate-distance.mjs.map +1 -0
  160. package/dist/es/ai-model/shared/model-locate-result/errors.mjs +9 -0
  161. package/dist/es/ai-model/shared/model-locate-result/errors.mjs.map +1 -0
  162. package/dist/es/ai-model/shared/model-locate-result/factory.mjs +39 -0
  163. package/dist/es/ai-model/shared/model-locate-result/factory.mjs.map +1 -0
  164. package/dist/es/ai-model/shared/model-locate-result/index.mjs +6 -0
  165. package/dist/es/ai-model/shared/model-locate-result/parse.mjs +45 -0
  166. package/dist/es/ai-model/shared/model-locate-result/parse.mjs.map +1 -0
  167. package/dist/es/ai-model/shared/model-locate-result/pixel-bbox-mapper.mjs +67 -0
  168. package/dist/es/ai-model/shared/model-locate-result/pixel-bbox-mapper.mjs.map +1 -0
  169. package/dist/es/ai-model/shared/model-locate-result/prompt-spec.mjs +110 -0
  170. package/dist/es/ai-model/shared/model-locate-result/prompt-spec.mjs.map +1 -0
  171. package/dist/es/ai-model/shared/model-locate-result/types.mjs +9 -0
  172. package/dist/es/ai-model/shared/model-locate-result/types.mjs.map +1 -0
  173. package/dist/es/ai-model/shared/multimodal-prompt.mjs +55 -0
  174. package/dist/es/ai-model/shared/multimodal-prompt.mjs.map +1 -0
  175. package/dist/es/ai-model/shared/xml.mjs +42 -0
  176. package/dist/es/ai-model/shared/xml.mjs.map +1 -0
  177. package/dist/es/ai-model/workflows/grounding/index.mjs +4 -0
  178. package/dist/es/ai-model/workflows/grounding/locate-result-rect.mjs +23 -0
  179. package/dist/es/ai-model/workflows/grounding/locate-result-rect.mjs.map +1 -0
  180. package/dist/es/ai-model/workflows/grounding/locate.mjs +168 -0
  181. package/dist/es/ai-model/workflows/grounding/locate.mjs.map +1 -0
  182. package/dist/es/ai-model/workflows/grounding/planning-action-locate.mjs +97 -0
  183. package/dist/es/ai-model/workflows/grounding/planning-action-locate.mjs.map +1 -0
  184. package/dist/es/ai-model/workflows/grounding/search-area-mapping.mjs +18 -0
  185. package/dist/es/ai-model/workflows/grounding/search-area-mapping.mjs.map +1 -0
  186. package/dist/es/ai-model/workflows/grounding/search-area.mjs +55 -0
  187. package/dist/es/ai-model/workflows/grounding/search-area.mjs.map +1 -0
  188. package/dist/es/ai-model/workflows/grounding/section-locate.mjs +146 -0
  189. package/dist/es/ai-model/workflows/grounding/section-locate.mjs.map +1 -0
  190. package/dist/es/ai-model/workflows/grounding/types.mjs +0 -0
  191. package/dist/es/ai-model/workflows/grounding/utils.mjs +50 -0
  192. package/dist/es/ai-model/workflows/grounding/utils.mjs.map +1 -0
  193. package/dist/es/ai-model/workflows/insight/extraction.mjs +101 -0
  194. package/dist/es/ai-model/workflows/insight/extraction.mjs.map +1 -0
  195. package/dist/es/ai-model/workflows/insight/index.mjs +3 -0
  196. package/dist/es/ai-model/workflows/insight/insight-response-parser.mjs +26 -0
  197. package/dist/es/ai-model/workflows/insight/insight-response-parser.mjs.map +1 -0
  198. package/dist/es/ai-model/workflows/insight/order-sensitive.mjs +29 -0
  199. package/dist/es/ai-model/workflows/insight/order-sensitive.mjs.map +1 -0
  200. package/dist/es/ai-model/workflows/planning/conversation-history.mjs +185 -0
  201. package/dist/es/ai-model/workflows/planning/conversation-history.mjs.map +1 -0
  202. package/dist/es/ai-model/workflows/planning/custom-planning.mjs +129 -0
  203. package/dist/es/ai-model/workflows/planning/custom-planning.mjs.map +1 -0
  204. package/dist/es/ai-model/workflows/planning/index.mjs +4 -0
  205. package/dist/es/ai-model/workflows/planning/locate-normalization.mjs +41 -0
  206. package/dist/es/ai-model/workflows/planning/locate-normalization.mjs.map +1 -0
  207. package/dist/es/ai-model/workflows/planning/planning-action-log.mjs +22 -0
  208. package/dist/es/ai-model/workflows/planning/planning-action-log.mjs.map +1 -0
  209. package/dist/es/ai-model/workflows/planning/standard-planning-parser.mjs +99 -0
  210. package/dist/es/ai-model/workflows/planning/standard-planning-parser.mjs.map +1 -0
  211. package/dist/es/ai-model/workflows/planning/standard-planning.mjs +219 -0
  212. package/dist/es/ai-model/workflows/planning/standard-planning.mjs.map +1 -0
  213. package/dist/es/ai-model/workflows/planning/types.mjs +0 -0
  214. package/dist/es/ai-model/workflows/recorder-generation/common.mjs +171 -0
  215. package/dist/es/ai-model/workflows/recorder-generation/common.mjs.map +1 -0
  216. package/dist/es/ai-model/workflows/recorder-generation/index.mjs +5 -0
  217. package/dist/es/ai-model/workflows/recorder-generation/markdown.mjs +253 -0
  218. package/dist/es/ai-model/workflows/recorder-generation/markdown.mjs.map +1 -0
  219. package/dist/es/ai-model/workflows/recorder-generation/metadata.mjs +83 -0
  220. package/dist/es/ai-model/workflows/recorder-generation/metadata.mjs.map +1 -0
  221. package/dist/es/ai-model/workflows/recorder-generation/playwright.mjs +123 -0
  222. package/dist/es/ai-model/workflows/recorder-generation/playwright.mjs.map +1 -0
  223. package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs +162 -0
  224. package/dist/es/ai-model/workflows/recorder-generation/yaml.mjs.map +1 -0
  225. package/dist/es/common.mjs +12 -1
  226. package/dist/es/common.mjs.map +1 -1
  227. package/dist/es/constants.mjs +4 -0
  228. package/dist/es/constants.mjs.map +1 -0
  229. package/dist/es/device/index.mjs.map +1 -1
  230. package/dist/es/device/input-strategy.mjs +34 -0
  231. package/dist/es/device/input-strategy.mjs.map +1 -0
  232. package/dist/es/dump/html-utils.mjs +16 -1
  233. package/dist/es/dump/html-utils.mjs.map +1 -1
  234. package/dist/es/dump/image-reference.mjs +63 -0
  235. package/dist/es/dump/image-reference.mjs.map +1 -0
  236. package/dist/es/dump/report-action-dump.mjs +244 -0
  237. package/dist/es/dump/report-action-dump.mjs.map +1 -0
  238. package/dist/es/dump/report-dump-compactor.mjs +200 -0
  239. package/dist/es/dump/report-dump-compactor.mjs.map +1 -0
  240. package/dist/es/dump/screenshot-store.mjs +124 -37
  241. package/dist/es/dump/screenshot-store.mjs.map +1 -1
  242. package/dist/es/dump/task-service-dump.mjs +17 -0
  243. package/dist/es/dump/task-service-dump.mjs.map +1 -0
  244. package/dist/es/dump/task-status.mjs +18 -0
  245. package/dist/es/dump/task-status.mjs.map +1 -0
  246. package/dist/es/element-describer.mjs +198 -0
  247. package/dist/es/element-describer.mjs.map +1 -0
  248. package/dist/es/errors.mjs +20 -0
  249. package/dist/es/errors.mjs.map +1 -0
  250. package/dist/es/report-html-template.mjs +4 -0
  251. package/dist/es/report-html-template.mjs.map +1 -0
  252. package/dist/es/report-stats.mjs +113 -0
  253. package/dist/es/report-stats.mjs.map +1 -0
  254. package/dist/es/screenshot-item.mjs +7 -2
  255. package/dist/es/screenshot-item.mjs.map +1 -1
  256. package/dist/es/service/index.mjs +10 -5
  257. package/dist/es/service/index.mjs.map +1 -1
  258. package/dist/es/task-runner.mjs.map +1 -1
  259. package/dist/es/types.mjs.map +1 -1
  260. package/dist/es/utils.mjs +1 -1
  261. package/dist/es/yaml/cleanup.mjs +13 -0
  262. package/dist/es/yaml/cleanup.mjs.map +1 -0
  263. package/dist/lib/agent/agent.js +24 -11
  264. package/dist/lib/agent/agent.js.map +1 -1
  265. package/dist/lib/agent/cache-config.js +53 -0
  266. package/dist/lib/agent/cache-config.js.map +1 -0
  267. package/dist/lib/agent/file-chooser.js +125 -0
  268. package/dist/lib/agent/file-chooser.js.map +1 -0
  269. package/dist/lib/agent/insight.js +135 -0
  270. package/dist/lib/agent/insight.js.map +1 -0
  271. package/dist/lib/agent/metrics.js +115 -0
  272. package/dist/lib/agent/metrics.js.map +1 -0
  273. package/dist/lib/agent/progress/ai-act-progress.js +239 -0
  274. package/dist/lib/agent/progress/ai-act-progress.js.map +1 -0
  275. package/dist/lib/agent/progress/index.js +67 -0
  276. package/dist/lib/agent/progress/index.js.map +1 -0
  277. package/dist/lib/agent/progress/progress-bus.js +86 -0
  278. package/dist/lib/agent/progress/progress-bus.js.map +1 -0
  279. package/dist/lib/agent/prompt-context.js +62 -0
  280. package/dist/lib/agent/prompt-context.js.map +1 -0
  281. package/dist/lib/agent/record-to-report.js +48 -0
  282. package/dist/lib/agent/record-to-report.js.map +1 -0
  283. package/dist/lib/agent/run-gherkin-scenario.js +151 -0
  284. package/dist/lib/agent/run-gherkin-scenario.js.map +1 -0
  285. package/dist/lib/agent/run-markdown.js +96 -0
  286. package/dist/lib/agent/run-markdown.js.map +1 -0
  287. package/dist/lib/agent/screenshot-preparation.js +74 -0
  288. package/dist/lib/agent/screenshot-preparation.js.map +1 -0
  289. package/dist/lib/agent/ui-observer.js +425 -0
  290. package/dist/lib/agent/ui-observer.js.map +1 -0
  291. package/dist/lib/agent/utils.js +46 -2
  292. package/dist/lib/agent/utils.js.map +1 -1
  293. package/dist/lib/ai-model/connectivity/fixture.js +45 -0
  294. package/dist/lib/ai-model/connectivity/fixture.js.map +1 -0
  295. package/dist/lib/ai-model/connectivity/index.js +38 -0
  296. package/dist/lib/ai-model/connectivity/index.js.map +1 -0
  297. package/dist/lib/ai-model/connectivity/run-connectivity-test.js +204 -0
  298. package/dist/lib/ai-model/connectivity/run-connectivity-test.js.map +1 -0
  299. package/dist/lib/ai-model/conversation-history.js.map +1 -1
  300. package/dist/lib/ai-model/index.js +15 -11
  301. package/dist/lib/ai-model/inspect.js +1 -1
  302. package/dist/lib/ai-model/inspect.js.map +1 -1
  303. package/dist/lib/ai-model/model-adapter/chat-completion.js +103 -0
  304. package/dist/lib/ai-model/model-adapter/chat-completion.js.map +1 -0
  305. package/dist/lib/ai-model/model-adapter/custom-planning-action.js +40 -0
  306. package/dist/lib/ai-model/model-adapter/custom-planning-action.js.map +1 -0
  307. package/dist/lib/ai-model/model-adapter/custom-planning-types.js +20 -0
  308. package/dist/lib/ai-model/model-adapter/custom-planning-types.js.map +1 -0
  309. package/dist/lib/ai-model/model-adapter/default-insight-protocol.js +62 -0
  310. package/dist/lib/ai-model/model-adapter/default-insight-protocol.js.map +1 -0
  311. package/dist/lib/ai-model/model-adapter/default-locate-protocol.js +182 -0
  312. package/dist/lib/ai-model/model-adapter/default-locate-protocol.js.map +1 -0
  313. package/dist/lib/ai-model/model-adapter/default-planning-protocol.js +170 -0
  314. package/dist/lib/ai-model/model-adapter/default-planning-protocol.js.map +1 -0
  315. package/dist/lib/ai-model/model-adapter/image-preprocess.js +61 -0
  316. package/dist/lib/ai-model/model-adapter/image-preprocess.js.map +1 -0
  317. package/dist/lib/ai-model/model-adapter/index.js +38 -0
  318. package/dist/lib/ai-model/model-adapter/index.js.map +1 -0
  319. package/dist/lib/ai-model/model-adapter/insight-protocol.js +20 -0
  320. package/dist/lib/ai-model/model-adapter/insight-protocol.js.map +1 -0
  321. package/dist/lib/ai-model/model-adapter/insight.js +50 -0
  322. package/dist/lib/ai-model/model-adapter/insight.js.map +1 -0
  323. package/dist/lib/ai-model/model-adapter/locate-protocol.js +20 -0
  324. package/dist/lib/ai-model/model-adapter/locate-protocol.js.map +1 -0
  325. package/dist/lib/ai-model/model-adapter/locate.js +87 -0
  326. package/dist/lib/ai-model/model-adapter/locate.js.map +1 -0
  327. package/dist/lib/ai-model/model-adapter/planning-protocol.js +20 -0
  328. package/dist/lib/ai-model/model-adapter/planning-protocol.js.map +1 -0
  329. package/dist/lib/ai-model/model-adapter/planning.js +86 -0
  330. package/dist/lib/ai-model/model-adapter/planning.js.map +1 -0
  331. package/dist/lib/ai-model/model-adapter/resolve.js +88 -0
  332. package/dist/lib/ai-model/model-adapter/resolve.js.map +1 -0
  333. package/dist/lib/ai-model/model-adapter/types.js +20 -0
  334. package/dist/lib/ai-model/model-adapter/types.js.map +1 -0
  335. package/dist/lib/ai-model/models/auto-glm/actions.js +239 -0
  336. package/dist/lib/ai-model/models/auto-glm/actions.js.map +1 -0
  337. package/dist/lib/ai-model/models/auto-glm/adapter.js +79 -0
  338. package/dist/lib/ai-model/models/auto-glm/adapter.js.map +1 -0
  339. package/dist/lib/ai-model/models/auto-glm/locate.js +45 -0
  340. package/dist/lib/ai-model/models/auto-glm/locate.js.map +1 -0
  341. package/dist/lib/ai-model/models/auto-glm/parser.js +260 -0
  342. package/dist/lib/ai-model/models/auto-glm/parser.js.map +1 -0
  343. package/dist/lib/ai-model/models/auto-glm/planning.js +67 -0
  344. package/dist/lib/ai-model/models/auto-glm/planning.js.map +1 -0
  345. package/dist/lib/ai-model/models/auto-glm/prompt.js +257 -0
  346. package/dist/lib/ai-model/models/auto-glm/prompt.js.map +1 -0
  347. package/dist/lib/ai-model/models/deepseek/adapter.js +113 -0
  348. package/dist/lib/ai-model/models/deepseek/adapter.js.map +1 -0
  349. package/dist/lib/ai-model/models/deepseek/locate-protocol.js +132 -0
  350. package/dist/lib/ai-model/models/deepseek/locate-protocol.js.map +1 -0
  351. package/dist/lib/ai-model/models/default.js +47 -0
  352. package/dist/lib/ai-model/models/default.js.map +1 -0
  353. package/dist/lib/ai-model/models/doubao.js +132 -0
  354. package/dist/lib/ai-model/models/doubao.js.map +1 -0
  355. package/dist/lib/ai-model/models/gemini.js +137 -0
  356. package/dist/lib/ai-model/models/gemini.js.map +1 -0
  357. package/dist/lib/ai-model/models/glm.js +80 -0
  358. package/dist/lib/ai-model/models/glm.js.map +1 -0
  359. package/dist/lib/ai-model/models/gpt.js +77 -0
  360. package/dist/lib/ai-model/models/gpt.js.map +1 -0
  361. package/dist/lib/ai-model/models/index.js +41 -0
  362. package/dist/lib/ai-model/models/index.js.map +1 -0
  363. package/dist/lib/ai-model/models/kimi.js +136 -0
  364. package/dist/lib/ai-model/models/kimi.js.map +1 -0
  365. package/dist/lib/ai-model/models/mimo.js +70 -0
  366. package/dist/lib/ai-model/models/mimo.js.map +1 -0
  367. package/dist/lib/ai-model/models/qwen.js +173 -0
  368. package/dist/lib/ai-model/models/qwen.js.map +1 -0
  369. package/dist/lib/ai-model/models/registry.js +91 -0
  370. package/dist/lib/ai-model/models/registry.js.map +1 -0
  371. package/dist/lib/ai-model/models/ui-tars/actions.js +181 -0
  372. package/dist/lib/ai-model/models/ui-tars/actions.js.map +1 -0
  373. package/dist/lib/ai-model/models/ui-tars/adapter.js +136 -0
  374. package/dist/lib/ai-model/models/ui-tars/adapter.js.map +1 -0
  375. package/dist/lib/ai-model/models/ui-tars/parser.js +74 -0
  376. package/dist/lib/ai-model/models/ui-tars/parser.js.map +1 -0
  377. package/dist/lib/ai-model/models/ui-tars/planning.js +59 -0
  378. package/dist/lib/ai-model/models/ui-tars/planning.js.map +1 -0
  379. package/dist/lib/ai-model/models/ui-tars/prompt.js +73 -0
  380. package/dist/lib/ai-model/models/ui-tars/prompt.js.map +1 -0
  381. package/dist/lib/ai-model/models/utils/intent.js +40 -0
  382. package/dist/lib/ai-model/models/utils/intent.js.map +1 -0
  383. package/dist/lib/ai-model/prompt/insight/index.js +45 -0
  384. package/dist/lib/ai-model/prompt/insight/index.js.map +1 -0
  385. package/dist/lib/ai-model/prompt/insight/system-prompt.js +138 -0
  386. package/dist/lib/ai-model/prompt/insight/system-prompt.js.map +1 -0
  387. package/dist/lib/ai-model/prompt/insight/user-prompt.js +60 -0
  388. package/dist/lib/ai-model/prompt/insight/user-prompt.js.map +1 -0
  389. package/dist/lib/ai-model/prompt/locate/element-system-prompt.js +46 -0
  390. package/dist/lib/ai-model/prompt/locate/element-system-prompt.js.map +1 -0
  391. package/dist/lib/ai-model/prompt/locate/grounding-rules.js +47 -0
  392. package/dist/lib/ai-model/prompt/locate/grounding-rules.js.map +1 -0
  393. package/dist/lib/ai-model/prompt/locate/index.js +46 -0
  394. package/dist/lib/ai-model/prompt/locate/index.js.map +1 -0
  395. package/dist/lib/ai-model/prompt/locate/search-area-system-prompt.js +43 -0
  396. package/dist/lib/ai-model/prompt/locate/search-area-system-prompt.js.map +1 -0
  397. package/dist/lib/ai-model/prompt/planning/action-output-example.js +92 -0
  398. package/dist/lib/ai-model/prompt/planning/action-output-example.js.map +1 -0
  399. package/dist/lib/ai-model/prompt/planning/action-space-description.js +75 -0
  400. package/dist/lib/ai-model/prompt/planning/action-space-description.js.map +1 -0
  401. package/dist/lib/ai-model/prompt/planning/index.js +63 -0
  402. package/dist/lib/ai-model/prompt/planning/index.js.map +1 -0
  403. package/dist/lib/ai-model/prompt/planning/multi-turn-example.js +255 -0
  404. package/dist/lib/ai-model/prompt/planning/multi-turn-example.js.map +1 -0
  405. package/dist/lib/ai-model/prompt/planning/planning-response-example.js +59 -0
  406. package/dist/lib/ai-model/prompt/planning/planning-response-example.js.map +1 -0
  407. package/dist/lib/ai-model/prompt/planning/sub-goals-text.js +51 -0
  408. package/dist/lib/ai-model/prompt/planning/sub-goals-text.js.map +1 -0
  409. package/dist/lib/ai-model/prompt/planning/system-prompt.js +327 -0
  410. package/dist/lib/ai-model/prompt/planning/system-prompt.js.map +1 -0
  411. package/dist/lib/ai-model/service-caller/codex-app-server.js +1 -0
  412. package/dist/lib/ai-model/service-caller/codex-app-server.js.map +1 -1
  413. package/dist/lib/ai-model/service-caller/index.js +35 -16
  414. package/dist/lib/ai-model/service-caller/index.js.map +1 -1
  415. package/dist/lib/ai-model/service-caller/model-call-recorder.js +124 -0
  416. package/dist/lib/ai-model/service-caller/model-call-recorder.js.map +1 -0
  417. package/dist/lib/ai-model/service-caller/openai-error.js +184 -0
  418. package/dist/lib/ai-model/service-caller/openai-error.js.map +1 -0
  419. package/dist/lib/ai-model/service-caller/proxy-deps.node.js +46 -0
  420. package/dist/lib/ai-model/service-caller/proxy-deps.node.js.map +1 -0
  421. package/dist/lib/ai-model/service-caller/proxy-deps.stub.js +49 -0
  422. package/dist/lib/ai-model/service-caller/proxy-deps.stub.js.map +1 -0
  423. package/dist/lib/ai-model/service-caller/semantic-retry.js +70 -0
  424. package/dist/lib/ai-model/service-caller/semantic-retry.js.map +1 -0
  425. package/dist/lib/ai-model/service-caller/types.js +20 -0
  426. package/dist/lib/ai-model/service-caller/types.js.map +1 -0
  427. package/dist/lib/ai-model/shared/action-schema.js +49 -0
  428. package/dist/lib/ai-model/shared/action-schema.js.map +1 -0
  429. package/dist/lib/ai-model/shared/json.js +103 -0
  430. package/dist/lib/ai-model/shared/json.js.map +1 -0
  431. package/dist/lib/ai-model/shared/model-locate-result/bbox.js +106 -0
  432. package/dist/lib/ai-model/shared/model-locate-result/bbox.js.map +1 -0
  433. package/dist/lib/ai-model/shared/model-locate-result/coordinate-distance.js +44 -0
  434. package/dist/lib/ai-model/shared/model-locate-result/coordinate-distance.js.map +1 -0
  435. package/dist/lib/ai-model/shared/model-locate-result/errors.js +46 -0
  436. package/dist/lib/ai-model/shared/model-locate-result/errors.js.map +1 -0
  437. package/dist/lib/ai-model/shared/model-locate-result/factory.js +76 -0
  438. package/dist/lib/ai-model/shared/model-locate-result/factory.js.map +1 -0
  439. package/dist/lib/ai-model/shared/model-locate-result/index.js +66 -0
  440. package/dist/lib/ai-model/shared/model-locate-result/index.js.map +1 -0
  441. package/dist/lib/ai-model/shared/model-locate-result/parse.js +88 -0
  442. package/dist/lib/ai-model/shared/model-locate-result/parse.js.map +1 -0
  443. package/dist/lib/ai-model/shared/model-locate-result/pixel-bbox-mapper.js +101 -0
  444. package/dist/lib/ai-model/shared/model-locate-result/pixel-bbox-mapper.js.map +1 -0
  445. package/dist/lib/ai-model/shared/model-locate-result/prompt-spec.js +156 -0
  446. package/dist/lib/ai-model/shared/model-locate-result/prompt-spec.js.map +1 -0
  447. package/dist/lib/ai-model/shared/model-locate-result/types.js +46 -0
  448. package/dist/lib/ai-model/shared/model-locate-result/types.js.map +1 -0
  449. package/dist/lib/ai-model/shared/multimodal-prompt.js +95 -0
  450. package/dist/lib/ai-model/shared/multimodal-prompt.js.map +1 -0
  451. package/dist/lib/ai-model/shared/xml.js +79 -0
  452. package/dist/lib/ai-model/shared/xml.js.map +1 -0
  453. package/dist/lib/ai-model/workflows/grounding/index.js +46 -0
  454. package/dist/lib/ai-model/workflows/grounding/index.js.map +1 -0
  455. package/dist/lib/ai-model/workflows/grounding/locate-result-rect.js +60 -0
  456. package/dist/lib/ai-model/workflows/grounding/locate-result-rect.js.map +1 -0
  457. package/dist/lib/ai-model/workflows/grounding/locate.js +208 -0
  458. package/dist/lib/ai-model/workflows/grounding/locate.js.map +1 -0
  459. package/dist/lib/ai-model/workflows/grounding/planning-action-locate.js +131 -0
  460. package/dist/lib/ai-model/workflows/grounding/planning-action-locate.js.map +1 -0
  461. package/dist/lib/ai-model/workflows/grounding/search-area-mapping.js +52 -0
  462. package/dist/lib/ai-model/workflows/grounding/search-area-mapping.js.map +1 -0
  463. package/dist/lib/ai-model/workflows/grounding/search-area.js +92 -0
  464. package/dist/lib/ai-model/workflows/grounding/search-area.js.map +1 -0
  465. package/dist/lib/ai-model/workflows/grounding/section-locate.js +180 -0
  466. package/dist/lib/ai-model/workflows/grounding/section-locate.js.map +1 -0
  467. package/dist/lib/ai-model/workflows/grounding/types.js +20 -0
  468. package/dist/lib/ai-model/workflows/grounding/types.js.map +1 -0
  469. package/dist/lib/ai-model/workflows/grounding/utils.js +87 -0
  470. package/dist/lib/ai-model/workflows/grounding/utils.js.map +1 -0
  471. package/dist/lib/ai-model/workflows/insight/extraction.js +135 -0
  472. package/dist/lib/ai-model/workflows/insight/extraction.js.map +1 -0
  473. package/dist/lib/ai-model/workflows/insight/index.js +42 -0
  474. package/dist/lib/ai-model/workflows/insight/index.js.map +1 -0
  475. package/dist/lib/ai-model/workflows/insight/insight-response-parser.js +60 -0
  476. package/dist/lib/ai-model/workflows/insight/insight-response-parser.js.map +1 -0
  477. package/dist/lib/ai-model/workflows/insight/order-sensitive.js +63 -0
  478. package/dist/lib/ai-model/workflows/insight/order-sensitive.js.map +1 -0
  479. package/dist/lib/ai-model/workflows/planning/conversation-history.js +219 -0
  480. package/dist/lib/ai-model/workflows/planning/conversation-history.js.map +1 -0
  481. package/dist/lib/ai-model/workflows/planning/custom-planning.js +166 -0
  482. package/dist/lib/ai-model/workflows/planning/custom-planning.js.map +1 -0
  483. package/dist/lib/ai-model/workflows/planning/index.js +49 -0
  484. package/dist/lib/ai-model/workflows/planning/index.js.map +1 -0
  485. package/dist/lib/ai-model/workflows/planning/locate-normalization.js +75 -0
  486. package/dist/lib/ai-model/workflows/planning/locate-normalization.js.map +1 -0
  487. package/dist/lib/ai-model/workflows/planning/planning-action-log.js +56 -0
  488. package/dist/lib/ai-model/workflows/planning/planning-action-log.js.map +1 -0
  489. package/dist/lib/ai-model/workflows/planning/standard-planning-parser.js +142 -0
  490. package/dist/lib/ai-model/workflows/planning/standard-planning-parser.js.map +1 -0
  491. package/dist/lib/ai-model/workflows/planning/standard-planning.js +253 -0
  492. package/dist/lib/ai-model/workflows/planning/standard-planning.js.map +1 -0
  493. package/dist/lib/ai-model/workflows/planning/types.js +20 -0
  494. package/dist/lib/ai-model/workflows/planning/types.js.map +1 -0
  495. package/dist/lib/ai-model/workflows/recorder-generation/common.js +232 -0
  496. package/dist/lib/ai-model/workflows/recorder-generation/common.js.map +1 -0
  497. package/dist/lib/ai-model/workflows/recorder-generation/index.js +68 -0
  498. package/dist/lib/ai-model/workflows/recorder-generation/index.js.map +1 -0
  499. package/dist/lib/ai-model/workflows/recorder-generation/markdown.js +293 -0
  500. package/dist/lib/ai-model/workflows/recorder-generation/markdown.js.map +1 -0
  501. package/dist/lib/ai-model/workflows/recorder-generation/metadata.js +117 -0
  502. package/dist/lib/ai-model/workflows/recorder-generation/metadata.js.map +1 -0
  503. package/dist/lib/ai-model/workflows/recorder-generation/playwright.js +184 -0
  504. package/dist/lib/ai-model/workflows/recorder-generation/playwright.js.map +1 -0
  505. package/dist/lib/ai-model/workflows/recorder-generation/yaml.js +232 -0
  506. package/dist/lib/ai-model/workflows/recorder-generation/yaml.js.map +1 -0
  507. package/dist/lib/common.js +18 -1
  508. package/dist/lib/common.js.map +1 -1
  509. package/dist/lib/constants.js +38 -0
  510. package/dist/lib/constants.js.map +1 -0
  511. package/dist/lib/device/index.js.map +1 -1
  512. package/dist/lib/device/input-strategy.js +80 -0
  513. package/dist/lib/device/input-strategy.js.map +1 -0
  514. package/dist/lib/dump/html-utils.js +18 -0
  515. package/dist/lib/dump/html-utils.js.map +1 -1
  516. package/dist/lib/dump/image-reference.js +115 -0
  517. package/dist/lib/dump/image-reference.js.map +1 -0
  518. package/dist/lib/dump/report-action-dump.js +284 -0
  519. package/dist/lib/dump/report-action-dump.js.map +1 -0
  520. package/dist/lib/dump/report-dump-compactor.js +234 -0
  521. package/dist/lib/dump/report-dump-compactor.js.map +1 -0
  522. package/dist/lib/dump/screenshot-store.js +146 -38
  523. package/dist/lib/dump/screenshot-store.js.map +1 -1
  524. package/dist/lib/dump/task-service-dump.js +54 -0
  525. package/dist/lib/dump/task-service-dump.js.map +1 -0
  526. package/dist/lib/dump/task-status.js +55 -0
  527. package/dist/lib/dump/task-status.js.map +1 -0
  528. package/dist/lib/element-describer.js +238 -0
  529. package/dist/lib/element-describer.js.map +1 -0
  530. package/dist/lib/errors.js +54 -0
  531. package/dist/lib/errors.js.map +1 -0
  532. package/dist/lib/report-html-template.js +38 -0
  533. package/dist/lib/report-html-template.js.map +1 -0
  534. package/dist/lib/report-stats.js +147 -0
  535. package/dist/lib/report-stats.js.map +1 -0
  536. package/dist/lib/screenshot-item.js +7 -2
  537. package/dist/lib/screenshot-item.js.map +1 -1
  538. package/dist/lib/service/index.js +10 -5
  539. package/dist/lib/service/index.js.map +1 -1
  540. package/dist/lib/task-runner.js.map +1 -1
  541. package/dist/lib/types.js +2 -2
  542. package/dist/lib/types.js.map +1 -1
  543. package/dist/lib/utils.js +1 -1
  544. package/dist/lib/yaml/cleanup.js +47 -0
  545. package/dist/lib/yaml/cleanup.js.map +1 -0
  546. package/dist/types/agent/agent.d.ts +5 -9
  547. package/dist/types/agent/cache-config.d.ts +2 -0
  548. package/dist/types/agent/file-chooser.d.ts +19 -0
  549. package/dist/types/agent/insight.d.ts +21 -0
  550. package/dist/types/agent/metrics.d.ts +48 -0
  551. package/dist/types/agent/progress/ai-act-progress.d.ts +21 -0
  552. package/dist/types/agent/progress/index.d.ts +2 -0
  553. package/dist/types/agent/progress/progress-bus.d.ts +33 -0
  554. package/dist/types/agent/prompt-context.d.ts +3 -0
  555. package/dist/types/agent/record-to-report.d.ts +2 -0
  556. package/dist/types/agent/run-gherkin-scenario.d.ts +26 -0
  557. package/dist/types/agent/run-markdown.d.ts +6 -0
  558. package/dist/types/agent/screenshot-preparation.d.ts +20 -0
  559. package/dist/types/agent/ui-observer.d.ts +103 -0
  560. package/dist/types/agent/utils.d.ts +12 -1
  561. package/dist/types/ai-model/connectivity/fixture.d.ts +5 -0
  562. package/dist/types/ai-model/connectivity/index.d.ts +1 -0
  563. package/dist/types/ai-model/connectivity/run-connectivity-test.d.ts +11 -0
  564. package/dist/types/ai-model/index.d.ts +2 -0
  565. package/dist/types/ai-model/model-adapter/chat-completion.d.ts +2 -0
  566. package/dist/types/ai-model/model-adapter/custom-planning-action.d.ts +25 -0
  567. package/dist/types/ai-model/model-adapter/custom-planning-types.d.ts +31 -0
  568. package/dist/types/ai-model/model-adapter/default-insight-protocol.d.ts +2 -0
  569. package/dist/types/ai-model/model-adapter/default-locate-protocol.d.ts +7 -0
  570. package/dist/types/ai-model/model-adapter/default-planning-protocol.d.ts +25 -0
  571. package/dist/types/ai-model/model-adapter/image-preprocess.d.ts +30 -0
  572. package/dist/types/ai-model/model-adapter/index.d.ts +2 -0
  573. package/dist/types/ai-model/model-adapter/insight-protocol.d.ts +24 -0
  574. package/dist/types/ai-model/model-adapter/insight.d.ts +3 -0
  575. package/dist/types/ai-model/model-adapter/locate-protocol.d.ts +23 -0
  576. package/dist/types/ai-model/model-adapter/locate.d.ts +4 -0
  577. package/dist/types/ai-model/model-adapter/planning-protocol.d.ts +53 -0
  578. package/dist/types/ai-model/model-adapter/planning.d.ts +6 -0
  579. package/dist/types/ai-model/model-adapter/resolve.d.ts +12 -0
  580. package/dist/types/ai-model/model-adapter/types.d.ts +218 -0
  581. package/dist/types/ai-model/models/auto-glm/actions.d.ts +81 -0
  582. package/dist/types/ai-model/models/auto-glm/adapter.d.ts +5 -0
  583. package/dist/types/ai-model/models/auto-glm/locate.d.ts +2 -0
  584. package/dist/types/ai-model/models/auto-glm/parser.d.ts +14 -0
  585. package/dist/types/ai-model/models/auto-glm/planning.d.ts +5 -0
  586. package/dist/types/ai-model/models/auto-glm/prompt.d.ts +4 -0
  587. package/dist/types/ai-model/models/deepseek/adapter.d.ts +39 -0
  588. package/dist/types/ai-model/models/deepseek/locate-protocol.d.ts +5 -0
  589. package/dist/types/ai-model/models/default.d.ts +2 -0
  590. package/dist/types/ai-model/models/doubao.d.ts +7 -0
  591. package/dist/types/ai-model/models/gemini.d.ts +37 -0
  592. package/dist/types/ai-model/models/glm.d.ts +21 -0
  593. package/dist/types/ai-model/models/gpt.d.ts +20 -0
  594. package/dist/types/ai-model/models/index.d.ts +2 -0
  595. package/dist/types/ai-model/models/kimi.d.ts +45 -0
  596. package/dist/types/ai-model/models/mimo.d.ts +10 -0
  597. package/dist/types/ai-model/models/qwen.d.ts +33 -0
  598. package/dist/types/ai-model/models/registry.d.ts +187 -0
  599. package/dist/types/ai-model/models/ui-tars/actions.d.ts +3 -0
  600. package/dist/types/ai-model/models/ui-tars/adapter.d.ts +6 -0
  601. package/dist/types/ai-model/models/ui-tars/parser.d.ts +72 -0
  602. package/dist/types/ai-model/models/ui-tars/planning.d.ts +4 -0
  603. package/dist/types/ai-model/models/ui-tars/prompt.d.ts +2 -0
  604. package/dist/types/ai-model/models/utils/intent.d.ts +2 -0
  605. package/dist/types/ai-model/prompt/insight/index.d.ts +2 -0
  606. package/dist/types/ai-model/prompt/insight/system-prompt.d.ts +6 -0
  607. package/dist/types/ai-model/prompt/insight/user-prompt.d.ts +3 -0
  608. package/dist/types/ai-model/prompt/locate/element-system-prompt.d.ts +4 -0
  609. package/dist/types/ai-model/prompt/locate/grounding-rules.d.ts +1 -0
  610. package/dist/types/ai-model/prompt/locate/index.d.ts +3 -0
  611. package/dist/types/ai-model/prompt/locate/search-area-system-prompt.d.ts +4 -0
  612. package/dist/types/ai-model/prompt/planning/action-output-example.d.ts +17 -0
  613. package/dist/types/ai-model/prompt/planning/action-space-description.d.ts +11 -0
  614. package/dist/types/ai-model/prompt/planning/index.d.ts +6 -0
  615. package/dist/types/ai-model/prompt/planning/multi-turn-example.d.ts +10 -0
  616. package/dist/types/ai-model/prompt/planning/planning-response-example.d.ts +28 -0
  617. package/dist/types/ai-model/prompt/planning/sub-goals-text.d.ts +2 -0
  618. package/dist/types/ai-model/prompt/planning/system-prompt.d.ts +18 -0
  619. package/dist/types/ai-model/service-caller/index.d.ts +21 -6
  620. package/dist/types/ai-model/service-caller/model-call-recorder.d.ts +12 -0
  621. package/dist/types/ai-model/service-caller/openai-error.d.ts +26 -0
  622. package/dist/types/ai-model/service-caller/proxy-deps.node.d.ts +2 -0
  623. package/dist/types/ai-model/service-caller/proxy-deps.stub.d.ts +2 -0
  624. package/dist/types/ai-model/service-caller/semantic-retry.d.ts +30 -0
  625. package/dist/types/ai-model/service-caller/types.d.ts +2 -0
  626. package/dist/types/ai-model/shared/action-schema.d.ts +4 -0
  627. package/dist/types/ai-model/shared/json.d.ts +26 -0
  628. package/dist/types/ai-model/shared/model-locate-result/bbox.d.ts +6 -0
  629. package/dist/types/ai-model/shared/model-locate-result/coordinate-distance.d.ts +4 -0
  630. package/dist/types/ai-model/shared/model-locate-result/errors.d.ts +2 -0
  631. package/dist/types/ai-model/shared/model-locate-result/factory.d.ts +3 -0
  632. package/dist/types/ai-model/shared/model-locate-result/index.d.ts +7 -0
  633. package/dist/types/ai-model/shared/model-locate-result/parse.d.ts +8 -0
  634. package/dist/types/ai-model/shared/model-locate-result/pixel-bbox-mapper.d.ts +7 -0
  635. package/dist/types/ai-model/shared/model-locate-result/prompt-spec.d.ts +6 -0
  636. package/dist/types/ai-model/shared/model-locate-result/types.d.ts +150 -0
  637. package/dist/types/ai-model/shared/multimodal-prompt.d.ts +13 -0
  638. package/dist/types/ai-model/shared/xml.d.ts +15 -0
  639. package/dist/types/ai-model/workflows/grounding/index.d.ts +3 -0
  640. package/dist/types/ai-model/workflows/grounding/locate-result-rect.d.ts +5 -0
  641. package/dist/types/ai-model/workflows/grounding/locate.d.ts +7 -0
  642. package/dist/types/ai-model/workflows/grounding/planning-action-locate.d.ts +4 -0
  643. package/dist/types/ai-model/workflows/grounding/search-area-mapping.d.ts +4 -0
  644. package/dist/types/ai-model/workflows/grounding/search-area.d.ts +18 -0
  645. package/dist/types/ai-model/workflows/grounding/section-locate.d.ts +16 -0
  646. package/dist/types/ai-model/workflows/grounding/types.d.ts +56 -0
  647. package/dist/types/ai-model/workflows/grounding/utils.d.ts +25 -0
  648. package/dist/types/ai-model/workflows/insight/extraction.d.ts +18 -0
  649. package/dist/types/ai-model/workflows/insight/index.d.ts +2 -0
  650. package/dist/types/ai-model/workflows/insight/insight-response-parser.d.ts +4 -0
  651. package/dist/types/ai-model/workflows/insight/order-sensitive.d.ts +6 -0
  652. package/dist/types/ai-model/workflows/planning/conversation-history.d.ts +105 -0
  653. package/dist/types/ai-model/workflows/planning/custom-planning.d.ts +7 -0
  654. package/dist/types/ai-model/workflows/planning/index.d.ts +3 -0
  655. package/dist/types/ai-model/workflows/planning/locate-normalization.d.ts +12 -0
  656. package/dist/types/ai-model/workflows/planning/planning-action-log.d.ts +2 -0
  657. package/dist/types/ai-model/workflows/planning/standard-planning-parser.d.ts +31 -0
  658. package/dist/types/ai-model/workflows/planning/standard-planning.d.ts +4 -0
  659. package/dist/types/ai-model/workflows/planning/types.d.ts +16 -0
  660. package/dist/types/ai-model/workflows/recorder-generation/common.d.ts +89 -0
  661. package/dist/types/ai-model/workflows/recorder-generation/index.d.ts +7 -0
  662. package/dist/types/ai-model/workflows/recorder-generation/markdown.d.ts +7 -0
  663. package/dist/types/ai-model/workflows/recorder-generation/metadata.d.ts +13 -0
  664. package/dist/types/ai-model/workflows/recorder-generation/playwright.d.ts +26 -0
  665. package/dist/types/ai-model/workflows/recorder-generation/yaml.d.ts +17 -0
  666. package/dist/types/common.d.ts +2 -0
  667. package/dist/types/constants.d.ts +1 -0
  668. package/dist/types/device/index.d.ts +15 -4
  669. package/dist/types/device/input-strategy.d.ts +44 -0
  670. package/dist/types/dump/html-utils.d.ts +1 -0
  671. package/dist/types/dump/image-reference.d.ts +36 -0
  672. package/dist/types/dump/report-action-dump.d.ts +127 -0
  673. package/dist/types/dump/report-dump-compactor.d.ts +7 -0
  674. package/dist/types/dump/screenshot-store.d.ts +32 -15
  675. package/dist/types/dump/task-service-dump.d.ts +3 -0
  676. package/dist/types/dump/task-status.d.ts +41 -0
  677. package/dist/types/element-describer.d.ts +43 -0
  678. package/dist/types/errors.d.ts +5 -0
  679. package/dist/types/report-html-template.d.ts +1 -0
  680. package/dist/types/report-stats.d.ts +39 -0
  681. package/dist/types/screenshot-item.d.ts +1 -0
  682. package/dist/types/service/index.d.ts +6 -2
  683. package/dist/types/task-runner.d.ts +6 -0
  684. package/dist/types/types.d.ts +98 -5
  685. package/dist/types/yaml/cleanup.d.ts +2 -0
  686. package/package.json +2 -2
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump/report-action-dump.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/dump/report-action-dump.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 {\n existsSync,\n mkdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from 'node:fs';\nimport { join } from 'node:path';\nimport { ScreenshotItem } from '../screenshot-item';\nimport type {\n ExecutionTask,\n IExecutionDump,\n IReportActionDump,\n} from '../types';\nimport { restoreImageReferences } from './screenshot-restoration';\nimport {\n type ImageUrlRef,\n ReportImageStore,\n isBase64ImageDataUrl,\n} from './screenshot-store';\n\n/** A multimodal prompt image descriptor retained by an execution dump. */\ninterface ReportReferenceImageDescriptor {\n name: string;\n url: string;\n}\n\nfunction isReferenceImageDescriptor(\n value: unknown,\n): value is ReportReferenceImageDescriptor {\n if (typeof value !== 'object' || value === null) return false;\n const record = value as Record<string, unknown>;\n return typeof record.name === 'string' && typeof record.url === 'string';\n}\n\nfunction getPageOrBrowserObjectName(value: unknown): 'Page' | 'Browser' | null {\n if (typeof value !== 'object' || value === null) return null;\n const constructorName = value.constructor?.name;\n return constructorName === 'Page' || constructorName === 'Browser'\n ? constructorName\n : null;\n}\n\nfunction isCustomSerializableObject(\n value: unknown,\n): value is { toSerializable(): unknown } {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { toSerializable?: unknown }).toSerializable === 'function'\n );\n}\n\nfunction isPlainRecord(value: object): value is Record<string, unknown> {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\n/**\n * Replacer function for JSON serialization that handles Page, Browser objects and ScreenshotItem\n */\nfunction replacerForDumpSerialization(key: string, value: any): any {\n // screenshotSequence is a transient model input (multi-frame capture). Its\n // frames are not persisted by collectScreenshots, so serializing them would\n // emit dangling screenshot refs. The representative `screenshot` is kept.\n if (key === 'screenshotSequence') {\n return undefined;\n }\n const opaqueObjectName = getPageOrBrowserObjectName(value);\n if (opaqueObjectName) {\n return `[${opaqueObjectName} object]`;\n }\n if (isCustomSerializableObject(value)) {\n return value.toSerializable();\n }\n return value;\n}\n\nfunction stringifyDump(data: unknown, indents?: number): string {\n return JSON.stringify(data, replacerForDumpSerialization, indents);\n}\n\n/**\n * Clone serializable plain data while replacing image descriptors only when\n * they occur inside an `images` array. Cloning per occurrence deliberately\n * avoids object-identity coupling when callers reuse the same descriptor in\n * another, unrelated field.\n */\nfunction replaceReferenceImageUrls(\n value: unknown,\n referenceImageRefsByUrl: ReadonlyMap<string, ImageUrlRef>,\n ancestors: WeakSet<object> = new WeakSet(),\n): unknown {\n if (typeof value !== 'object' || value === null) return value;\n if (\n getPageOrBrowserObjectName(value) ||\n isCustomSerializableObject(value) ||\n (!Array.isArray(value) && !isPlainRecord(value))\n ) {\n return value;\n }\n if (ancestors.has(value)) return value;\n\n ancestors.add(value);\n try {\n if (Array.isArray(value)) {\n return value.map((item) =>\n replaceReferenceImageUrls(item, referenceImageRefsByUrl, ancestors),\n );\n }\n\n const result: Record<string, unknown> = {};\n for (const [key, nestedValue] of Object.entries(value)) {\n if (key === 'images' && Array.isArray(nestedValue)) {\n result[key] = nestedValue.map((image) => {\n const transformedImage = replaceReferenceImageUrls(\n image,\n referenceImageRefsByUrl,\n ancestors,\n );\n if (!isReferenceImageDescriptor(image)) return transformedImage;\n\n const referenceImageRef = referenceImageRefsByUrl.get(image.url);\n if (\n !referenceImageRef ||\n typeof transformedImage !== 'object' ||\n transformedImage === null ||\n !isPlainRecord(transformedImage)\n ) {\n return transformedImage;\n }\n return { ...transformedImage, url: referenceImageRef };\n });\n continue;\n }\n result[key] = replaceReferenceImageUrls(\n nestedValue,\n referenceImageRefsByUrl,\n ancestors,\n );\n }\n return result;\n } finally {\n ancestors.delete(value);\n }\n}\n\n/**\n * Reviver function for JSON deserialization that keeps screenshot references\n * as plain objects. Resolution is handled lazily by restoreImageReferences.\n *\n * @param key - JSON key being processed\n * @param value - JSON value being processed\n * @returns Restored value\n */\nfunction reviverForDumpDeserialization(key: string, value: any): any {\n // Only process screenshot fields\n if (key !== 'screenshot' || typeof value !== 'object' || value === null) {\n return value;\n }\n\n if (ScreenshotItem.isSerialized(value)) {\n return value;\n }\n\n return value;\n}\n\n/**\n * ExecutionDump class for serializing and deserializing execution dumps\n */\nexport class ExecutionDump implements IExecutionDump {\n id?: string;\n logTime: number;\n name: string;\n description?: string;\n tasks: ExecutionTask[];\n aiActContext?: string;\n private readonly referenceImageUrls: readonly string[];\n\n constructor(\n data: IExecutionDump,\n options?: { referenceImageUrls?: readonly string[] },\n ) {\n this.id = data.id;\n this.logTime = data.logTime;\n this.name = data.name;\n this.description = data.description;\n this.tasks = data.tasks;\n this.aiActContext = data.aiActContext;\n this.referenceImageUrls = Array.from(\n new Set((options?.referenceImageUrls ?? []).filter(isBase64ImageDataUrl)),\n );\n }\n\n /**\n * Serialize the ExecutionDump to a JSON string\n */\n serialize(indents?: number): string {\n return stringifyDump(this.toJSON(), indents);\n }\n\n /**\n * Convert to a plain object for JSON serialization\n */\n toJSON(): IExecutionDump {\n return {\n id: this.id,\n logTime: this.logTime,\n name: this.name,\n description: this.description,\n tasks: this.tasks.map((task) => ({\n ...task,\n recorder: task.recorder || [],\n })),\n aiActContext: this.aiActContext,\n };\n }\n\n /**\n * Create an ExecutionDump instance from a serialized JSON string\n */\n static fromSerializedString(serialized: string): ExecutionDump {\n const parsed = JSON.parse(\n serialized,\n reviverForDumpDeserialization,\n ) as IExecutionDump;\n return new ExecutionDump(parsed);\n }\n\n /**\n * Create an ExecutionDump instance from a plain object\n */\n static fromJSON(data: IExecutionDump): ExecutionDump {\n return new ExecutionDump(data);\n }\n\n /**\n * Collect all ScreenshotItem instances from tasks.\n * Scans through uiContext and recorder items to find screenshots.\n *\n * @returns Array of ScreenshotItem instances\n */\n collectScreenshots(): ScreenshotItem[] {\n const screenshots: ScreenshotItem[] = [];\n\n for (const task of this.tasks) {\n // Collect uiContext.screenshot if present\n if (task.uiContext?.screenshot instanceof ScreenshotItem) {\n screenshots.push(task.uiContext.screenshot);\n }\n\n // Collect recorder screenshots\n if (task.recorder) {\n for (const record of task.recorder) {\n if (record.screenshot instanceof ScreenshotItem) {\n screenshots.push(record.screenshot);\n }\n }\n }\n }\n\n return screenshots;\n }\n\n /**\n * Return persistable base64 reference-image URLs explicitly registered while\n * building this execution. This sidecar is excluded from serialized dumps.\n */\n getReferenceImageUrls(): readonly string[] {\n return [...this.referenceImageUrls];\n }\n}\n\n/**\n * ReportActionDump class for serializing and deserializing report action dumps\n */\nexport class ReportActionDump implements IReportActionDump {\n sdkVersion: string;\n groupName: string;\n groupDescription?: string;\n modelBriefs: IReportActionDump['modelBriefs'];\n executions: ExecutionDump[];\n deviceType?: string;\n\n constructor(data: IReportActionDump) {\n this.sdkVersion = data.sdkVersion;\n this.groupName = data.groupName;\n this.groupDescription = data.groupDescription;\n this.modelBriefs = data.modelBriefs;\n this.executions = data.executions.map((exec) =>\n exec instanceof ExecutionDump ? exec : ExecutionDump.fromJSON(exec),\n );\n this.deviceType = data.deviceType;\n }\n\n /**\n * Serialize the ReportActionDump to a JSON string\n * Uses typed report references for persisted screenshots.\n */\n serialize(indents?: number): string {\n return stringifyDump(this.toJSON(), indents);\n }\n\n /**\n * Serialize a report dump while replacing persisted multimodal prompt image\n * URLs with their compact report asset references.\n *\n * @param referenceImageRefsByUrl Maps registered prompt image URLs to assets.\n * @param indents Optional JSON indentation.\n * @returns The serialized report dump.\n */\n serializeWithReferenceImages(\n referenceImageRefsByUrl: ReadonlyMap<string, ImageUrlRef>,\n indents?: number,\n ): string {\n return stringifyDump(\n replaceReferenceImageUrls(this.toJSON(), referenceImageRefsByUrl),\n indents,\n );\n }\n\n /**\n * Serialize the ReportActionDump with inline screenshots to a JSON string.\n * Each ScreenshotItem is replaced with { base64: \"...\", capturedAt }.\n */\n serializeWithInlineScreenshots(indents?: number): string {\n const processValue = (obj: unknown): unknown => {\n if (obj instanceof ScreenshotItem) {\n return { base64: obj.base64, capturedAt: obj.capturedAt };\n }\n if (Array.isArray(obj)) {\n return obj.map(processValue);\n }\n if (obj && typeof obj === 'object') {\n const entries = Object.entries(obj)\n // screenshotSequence is a transient multi-frame model input whose\n // frames are not persisted; skip it to avoid inlining large base64.\n .filter(([key]) => key !== 'screenshotSequence')\n .map(([key, value]) => [key, processValue(value)]);\n return Object.fromEntries(entries);\n }\n return obj;\n };\n\n const data = processValue(this.toJSON());\n return JSON.stringify(data, null, indents);\n }\n\n /**\n * Convert to a plain object for JSON serialization\n */\n toJSON(): IReportActionDump {\n return {\n sdkVersion: this.sdkVersion,\n groupName: this.groupName,\n groupDescription: this.groupDescription,\n modelBriefs: this.modelBriefs,\n executions: this.executions.map((exec) => exec.toJSON()),\n deviceType: this.deviceType,\n };\n }\n\n /**\n * Create a ReportActionDump instance from a serialized JSON string\n */\n static fromSerializedString(serialized: string): ReportActionDump {\n const parsed = JSON.parse(\n serialized,\n reviverForDumpDeserialization,\n ) as IReportActionDump;\n return new ReportActionDump(parsed);\n }\n\n /**\n * Create a ReportActionDump instance from a plain object\n */\n static fromJSON(data: IReportActionDump): ReportActionDump {\n return new ReportActionDump(data);\n }\n\n /**\n * Collect all ScreenshotItem instances from all executions.\n *\n * @returns Array of all ScreenshotItem instances across all executions\n */\n collectAllScreenshots(): ScreenshotItem[] {\n const screenshots: ScreenshotItem[] = [];\n for (const execution of this.executions) {\n screenshots.push(...execution.collectScreenshots());\n }\n return screenshots;\n }\n\n /**\n * Serialize the dump to files with screenshots as separate PNG files.\n * Creates:\n * - {basePath} - dump JSON with { $screenshot: id } references\n * - {basePath}.screenshots/ - PNG files\n *\n * @param basePath - Base path for the dump file\n */\n serializeToFiles(basePath: string): void {\n const screenshotsDir = `${basePath}.screenshots`;\n if (!existsSync(screenshotsDir)) {\n mkdirSync(screenshotsDir, { recursive: true });\n }\n\n const screenshots = this.collectAllScreenshots();\n\n for (const screenshot of screenshots) {\n const imagePath = join(\n screenshotsDir,\n `${screenshot.id}.${screenshot.extension}`,\n );\n if (existsSync(imagePath)) {\n continue;\n }\n\n const rawBase64 = screenshot.rawBase64;\n writeFileSync(imagePath, Buffer.from(rawBase64, 'base64'));\n }\n\n // Write dump JSON with references\n writeFileSync(basePath, this.serialize(), 'utf-8');\n }\n\n /**\n * Read dump from files and return JSON string with inline screenshots.\n * Reads the dump JSON and screenshot files, then inlines the base64 data.\n *\n * @param basePath - Base path for the dump file\n * @returns JSON string with inline screenshots ({ base64: \"...\" } format)\n */\n static fromFilesAsInlineJson(basePath: string): string {\n const dumpString = readFileSync(basePath, 'utf-8');\n const screenshotsDir = `${basePath}.screenshots`;\n\n // Restore image references\n const dumpData = JSON.parse(dumpString);\n const imageStore = new ReportImageStore({\n mode: 'directory',\n reportPath: basePath,\n screenshotsDir,\n });\n const resolveImage = (ref: Parameters<typeof imageStore.loadDataUri>[0]) =>\n imageStore.loadDataUri(ref);\n const processedData = restoreImageReferences(dumpData, resolveImage);\n return JSON.stringify(processedData);\n }\n\n /**\n * Clean up all files associated with a serialized dump.\n *\n * @param basePath - Base path for the dump file\n */\n static cleanupFiles(basePath: string): void {\n const filesToClean = [basePath, `${basePath}.screenshots`];\n\n for (const filePath of filesToClean) {\n try {\n rmSync(filePath, { force: true, recursive: true });\n } catch {\n // Ignore errors - file may already be deleted\n }\n }\n }\n\n /**\n * Get all file paths associated with a serialized dump.\n *\n * @param basePath - Base path for the dump file\n * @returns Array of all associated file paths\n */\n static getFilePaths(basePath: string): string[] {\n return [basePath, `${basePath}.screenshots`];\n }\n}\n\n// Backward-compatible aliases for existing external consumers.\nexport type GroupedActionDump = ReportActionDump;\nexport const GroupedActionDump = ReportActionDump;\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","isReferenceImageDescriptor","value","record","getPageOrBrowserObjectName","constructorName","isCustomSerializableObject","isPlainRecord","prototype","replacerForDumpSerialization","opaqueObjectName","stringifyDump","data","indents","JSON","replaceReferenceImageUrls","referenceImageRefsByUrl","ancestors","WeakSet","Array","item","result","nestedValue","image","transformedImage","referenceImageRef","reviverForDumpDeserialization","ScreenshotItem","ExecutionDump","task","serialized","parsed","screenshots","options","Set","isBase64ImageDataUrl","ReportActionDump","processValue","entries","exec","execution","basePath","screenshotsDir","existsSync","mkdirSync","screenshot","imagePath","join","rawBase64","writeFileSync","Buffer","dumpString","readFileSync","dumpData","imageStore","ReportImageStore","resolveImage","ref","processedData","restoreImageReferences","filesToClean","filePath","rmSync","GroupedActionDump"],"mappings":"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"}
@@ -0,0 +1,234 @@
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
+ compactReportDumps: ()=>compactReportDumps
28
+ });
29
+ const external_node_fs_namespaceObject = require("node:fs");
30
+ const promises_namespaceObject = require("node:fs/promises");
31
+ const external_node_path_namespaceObject = require("node:path");
32
+ const utils_namespaceObject = require("@aiscene/shared/utils");
33
+ const external_types_js_namespaceObject = require("../types.js");
34
+ const SCRIPT_OPEN = Buffer.from("<script");
35
+ const SCRIPT_CLOSE = Buffer.from("<\/script>");
36
+ const READ_CHUNK_SIZE = 33554432;
37
+ const DUMP_TYPE_ATTRIBUTE = 'type="midscene_web_dump"';
38
+ const GROUP_ID_REGEXP = /data-group-id="([^"]+)"/;
39
+ function decodeGroupId(openTag) {
40
+ if (!openTag.includes(DUMP_TYPE_ATTRIBUTE)) return;
41
+ const encodedGroupId = openTag.match(GROUP_ID_REGEXP)?.[1];
42
+ return encodedGroupId ? decodeURIComponent(encodedGroupId) : void 0;
43
+ }
44
+ async function scanScriptTags(reportPath, onScript) {
45
+ let pending = Buffer.alloc(0);
46
+ for await (const chunk of (0, external_node_fs_namespaceObject.createReadStream)(reportPath, {
47
+ highWaterMark: READ_CHUNK_SIZE
48
+ })){
49
+ pending = 0 === pending.length ? chunk : Buffer.concat([
50
+ pending,
51
+ chunk
52
+ ]);
53
+ while(pending.length > 0){
54
+ const scriptStart = pending.indexOf(SCRIPT_OPEN);
55
+ if (-1 === scriptStart) {
56
+ pending = pending.subarray(Math.max(0, pending.length - SCRIPT_OPEN.length + 1));
57
+ break;
58
+ }
59
+ if (scriptStart > 0) pending = pending.subarray(scriptStart);
60
+ const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);
61
+ if (-1 === openTagEnd) break;
62
+ const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);
63
+ if (-1 === closeTagStart) break;
64
+ const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;
65
+ await onScript({
66
+ openTag: pending.subarray(0, openTagEnd + 1).toString('utf-8'),
67
+ content: pending.subarray(openTagEnd + 1, closeTagStart)
68
+ });
69
+ pending = pending.subarray(scriptEnd);
70
+ }
71
+ }
72
+ if (-1 !== pending.indexOf(SCRIPT_OPEN)) throw new Error(`Report contains an unterminated script tag: ${reportPath}`);
73
+ }
74
+ async function analyzeDumpGroups(reportPath) {
75
+ const groups = new Map();
76
+ let tagCount = 0;
77
+ await scanScriptTags(reportPath, ({ openTag, content })=>{
78
+ const groupId = decodeGroupId(openTag);
79
+ if (!groupId) return;
80
+ const dump = external_types_js_namespaceObject.ReportActionDump.fromSerializedString((0, utils_namespaceObject.antiEscapeScriptTag)(content.toString('utf-8').trim()));
81
+ let group = groups.get(groupId);
82
+ if (!group) {
83
+ group = {
84
+ baseDump: dump,
85
+ executionsByKey: new Map(),
86
+ firstOpenTag: openTag,
87
+ noIdExecutionIndex: 0,
88
+ tagCount: 0
89
+ };
90
+ groups.set(groupId, group);
91
+ }
92
+ group.tagCount += 1;
93
+ tagCount += 1;
94
+ for (const execution of dump.executions){
95
+ const executionKey = execution.id ? `id:${execution.id}` : `no-id:${group.noIdExecutionIndex++}`;
96
+ group.executionsByKey.set(executionKey, execution);
97
+ }
98
+ });
99
+ return {
100
+ groups,
101
+ tagCount
102
+ };
103
+ }
104
+ function compactedDumpTag(group) {
105
+ group.baseDump.executions = Array.from(group.executionsByKey.values());
106
+ const serialized = (0, utils_namespaceObject.escapeScriptTag)(group.baseDump.serialize());
107
+ return Buffer.from(`${group.firstOpenTag}${serialized}${SCRIPT_CLOSE.toString('utf-8')}`);
108
+ }
109
+ async function writeAll(handle, data) {
110
+ let offset = 0;
111
+ while(offset < data.length){
112
+ const { bytesWritten } = await handle.write(data, offset, data.length - offset, null);
113
+ if (0 === bytesWritten) throw new Error('Failed to make progress while writing compacted report');
114
+ offset += bytesWritten;
115
+ }
116
+ }
117
+ async function rewriteReport(sourcePath, targetPath, analysis) {
118
+ const compactedTags = new Map(Array.from(analysis.groups, ([groupId, group])=>[
119
+ groupId,
120
+ compactedDumpTag(group)
121
+ ]));
122
+ const seenTagsByGroup = new Map();
123
+ const emittedGroups = new Set();
124
+ const output = await (0, promises_namespaceObject.open)(targetPath, 'wx');
125
+ let pending = Buffer.alloc(0);
126
+ try {
127
+ for await (const chunk of (0, external_node_fs_namespaceObject.createReadStream)(sourcePath, {
128
+ highWaterMark: READ_CHUNK_SIZE
129
+ })){
130
+ pending = 0 === pending.length ? chunk : Buffer.concat([
131
+ pending,
132
+ chunk
133
+ ]);
134
+ while(pending.length > 0){
135
+ const scriptStart = pending.indexOf(SCRIPT_OPEN);
136
+ if (-1 === scriptStart) {
137
+ const writableLength = Math.max(0, pending.length - SCRIPT_OPEN.length + 1);
138
+ await writeAll(output, pending.subarray(0, writableLength));
139
+ pending = pending.subarray(writableLength);
140
+ break;
141
+ }
142
+ await writeAll(output, pending.subarray(0, scriptStart));
143
+ pending = pending.subarray(scriptStart);
144
+ const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);
145
+ if (-1 === openTagEnd) break;
146
+ const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);
147
+ if (-1 === closeTagStart) break;
148
+ const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;
149
+ const openTag = pending.subarray(0, openTagEnd + 1).toString('utf-8');
150
+ const groupId = decodeGroupId(openTag);
151
+ if (groupId && analysis.groups.has(groupId)) {
152
+ const seenCount = (seenTagsByGroup.get(groupId) ?? 0) + 1;
153
+ seenTagsByGroup.set(groupId, seenCount);
154
+ if (seenCount === analysis.groups.get(groupId).tagCount) {
155
+ await writeAll(output, compactedTags.get(groupId));
156
+ emittedGroups.add(groupId);
157
+ }
158
+ } else await writeAll(output, pending.subarray(0, scriptEnd));
159
+ pending = pending.subarray(scriptEnd);
160
+ }
161
+ }
162
+ if (-1 !== pending.indexOf(SCRIPT_OPEN)) throw new Error(`Report contains an unterminated script tag: ${sourcePath}`);
163
+ await writeAll(output, pending);
164
+ for (const [groupId, group] of analysis.groups)if (seenTagsByGroup.get(groupId) !== group.tagCount || !emittedGroups.has(groupId)) throw new Error(`Report compaction did not rewrite every dump in group: ${groupId}`);
165
+ await output.sync();
166
+ } finally{
167
+ await output.close();
168
+ }
169
+ }
170
+ function canRetryRenameOnWindows(error) {
171
+ if ('win32' !== process.platform) return false;
172
+ const code = error.code;
173
+ return 'EACCES' === code || 'EEXIST' === code || 'EPERM' === code;
174
+ }
175
+ async function replaceReportFile(temporaryPath, reportPath) {
176
+ try {
177
+ await (0, promises_namespaceObject.rename)(temporaryPath, reportPath);
178
+ return;
179
+ } catch (error) {
180
+ if (!canRetryRenameOnWindows(error)) throw error;
181
+ }
182
+ const backupPath = (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(reportPath), `.${(0, external_node_path_namespaceObject.basename)(reportPath)}.${(0, utils_namespaceObject.uuid)()}.backup`);
183
+ await (0, promises_namespaceObject.rename)(reportPath, backupPath);
184
+ try {
185
+ await (0, promises_namespaceObject.rename)(temporaryPath, reportPath);
186
+ } catch (replaceError) {
187
+ try {
188
+ await (0, promises_namespaceObject.rename)(backupPath, reportPath);
189
+ } catch (restoreError) {
190
+ throw new Error(`Failed to replace compacted report and restore the original report: ${String(replaceError)}; restore error: ${String(restoreError)}`);
191
+ }
192
+ throw replaceError;
193
+ }
194
+ await (0, promises_namespaceObject.unlink)(backupPath);
195
+ }
196
+ async function compactReportDumps(reportPath) {
197
+ const before = await (0, promises_namespaceObject.stat)(reportPath);
198
+ const analysis = await analyzeDumpGroups(reportPath);
199
+ const afterDumpCount = analysis.groups.size;
200
+ if (analysis.tagCount <= afterDumpCount) return {
201
+ beforeBytes: before.size,
202
+ afterBytes: before.size,
203
+ beforeDumpCount: analysis.tagCount,
204
+ afterDumpCount
205
+ };
206
+ const temporaryPath = (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(reportPath), `.${(0, external_node_path_namespaceObject.basename)(reportPath)}.${(0, utils_namespaceObject.uuid)()}.tmp`);
207
+ try {
208
+ await rewriteReport(reportPath, temporaryPath, analysis);
209
+ const after = await (0, promises_namespaceObject.stat)(temporaryPath);
210
+ await replaceReportFile(temporaryPath, reportPath);
211
+ return {
212
+ beforeBytes: before.size,
213
+ afterBytes: after.size,
214
+ beforeDumpCount: analysis.tagCount,
215
+ afterDumpCount
216
+ };
217
+ } catch (error) {
218
+ try {
219
+ await (0, promises_namespaceObject.unlink)(temporaryPath);
220
+ } catch (cleanupError) {
221
+ if ('ENOENT' !== cleanupError.code) throw new Error(`Report compaction failed and the temporary file could not be removed: ${String(error)}; cleanup error: ${String(cleanupError)}`);
222
+ }
223
+ throw error;
224
+ }
225
+ }
226
+ exports.compactReportDumps = __webpack_exports__.compactReportDumps;
227
+ for(var __rspack_i in __webpack_exports__)if (-1 === [
228
+ "compactReportDumps"
229
+ ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
230
+ Object.defineProperty(exports, '__esModule', {
231
+ value: true
232
+ });
233
+
234
+ //# sourceMappingURL=report-dump-compactor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dump/report-dump-compactor.js","sources":["webpack/runtime/define_property_getters","webpack/runtime/has_own_property","webpack/runtime/make_namespace_object","../../../src/dump/report-dump-compactor.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 { createReadStream } from 'node:fs';\nimport { type FileHandle, open, rename, stat, unlink } from 'node:fs/promises';\nimport { basename, dirname, join } from 'node:path';\nimport {\n antiEscapeScriptTag,\n escapeScriptTag,\n uuid,\n} from '@aiscene/shared/utils';\nimport { type ExecutionDump, ReportActionDump } from '../types';\n\nconst SCRIPT_OPEN = Buffer.from('<script');\nconst SCRIPT_CLOSE = Buffer.from('</script>');\nconst READ_CHUNK_SIZE = 32 * 1024 * 1024;\nconst DUMP_TYPE_ATTRIBUTE = 'type=\"midscene_web_dump\"';\nconst GROUP_ID_REGEXP = /data-group-id=\"([^\"]+)\"/;\n\ninterface ScriptTag {\n openTag: string;\n content: Buffer;\n}\n\ninterface DumpGroup {\n baseDump: ReportActionDump;\n executionsByKey: Map<string, ExecutionDump>;\n firstOpenTag: string;\n noIdExecutionIndex: number;\n tagCount: number;\n}\n\ninterface DumpAnalysis {\n groups: Map<string, DumpGroup>;\n tagCount: number;\n}\n\nexport interface ReportDumpCompactionResult {\n beforeBytes: number;\n afterBytes: number;\n beforeDumpCount: number;\n afterDumpCount: number;\n}\n\nfunction decodeGroupId(openTag: string): string | undefined {\n if (!openTag.includes(DUMP_TYPE_ATTRIBUTE)) return undefined;\n const encodedGroupId = openTag.match(GROUP_ID_REGEXP)?.[1];\n return encodedGroupId ? decodeURIComponent(encodedGroupId) : undefined;\n}\n\nasync function scanScriptTags(\n reportPath: string,\n onScript: (script: ScriptTag) => void | Promise<void>,\n): Promise<void> {\n let pending: Buffer = Buffer.alloc(0);\n\n for await (const chunk of createReadStream(reportPath, {\n highWaterMark: READ_CHUNK_SIZE,\n })) {\n pending =\n pending.length === 0\n ? (chunk as Buffer)\n : Buffer.concat([pending, chunk as Buffer]);\n\n while (pending.length > 0) {\n const scriptStart = pending.indexOf(SCRIPT_OPEN);\n if (scriptStart === -1) {\n pending = pending.subarray(\n Math.max(0, pending.length - SCRIPT_OPEN.length + 1),\n );\n break;\n }\n\n if (scriptStart > 0) {\n pending = pending.subarray(scriptStart);\n }\n\n const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);\n if (openTagEnd === -1) break;\n\n const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);\n if (closeTagStart === -1) break;\n\n const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;\n await onScript({\n openTag: pending.subarray(0, openTagEnd + 1).toString('utf-8'),\n content: pending.subarray(openTagEnd + 1, closeTagStart),\n });\n pending = pending.subarray(scriptEnd);\n }\n }\n\n if (pending.indexOf(SCRIPT_OPEN) !== -1) {\n throw new Error(\n `Report contains an unterminated script tag: ${reportPath}`,\n );\n }\n}\n\nasync function analyzeDumpGroups(reportPath: string): Promise<DumpAnalysis> {\n const groups = new Map<string, DumpGroup>();\n let tagCount = 0;\n\n await scanScriptTags(reportPath, ({ openTag, content }) => {\n const groupId = decodeGroupId(openTag);\n if (!groupId) return;\n\n const dump = ReportActionDump.fromSerializedString(\n antiEscapeScriptTag(content.toString('utf-8').trim()),\n );\n let group = groups.get(groupId);\n if (!group) {\n group = {\n baseDump: dump,\n executionsByKey: new Map(),\n firstOpenTag: openTag,\n noIdExecutionIndex: 0,\n tagCount: 0,\n };\n groups.set(groupId, group);\n }\n\n group.tagCount += 1;\n tagCount += 1;\n for (const execution of dump.executions) {\n const executionKey = execution.id\n ? `id:${execution.id}`\n : `no-id:${group.noIdExecutionIndex++}`;\n group.executionsByKey.set(executionKey, execution);\n }\n });\n\n return { groups, tagCount };\n}\n\nfunction compactedDumpTag(group: DumpGroup): Buffer {\n group.baseDump.executions = Array.from(group.executionsByKey.values());\n const serialized = escapeScriptTag(group.baseDump.serialize());\n return Buffer.from(\n `${group.firstOpenTag}${serialized}${SCRIPT_CLOSE.toString('utf-8')}`,\n );\n}\n\nasync function writeAll(handle: FileHandle, data: Buffer): Promise<void> {\n let offset = 0;\n while (offset < data.length) {\n const { bytesWritten } = await handle.write(\n data,\n offset,\n data.length - offset,\n null,\n );\n if (bytesWritten === 0) {\n throw new Error('Failed to make progress while writing compacted report');\n }\n offset += bytesWritten;\n }\n}\n\nasync function rewriteReport(\n sourcePath: string,\n targetPath: string,\n analysis: DumpAnalysis,\n): Promise<void> {\n const compactedTags = new Map(\n Array.from(analysis.groups, ([groupId, group]) => [\n groupId,\n compactedDumpTag(group),\n ]),\n );\n const seenTagsByGroup = new Map<string, number>();\n const emittedGroups = new Set<string>();\n const output = await open(targetPath, 'wx');\n let pending: Buffer = Buffer.alloc(0);\n\n try {\n for await (const chunk of createReadStream(sourcePath, {\n highWaterMark: READ_CHUNK_SIZE,\n })) {\n pending =\n pending.length === 0\n ? (chunk as Buffer)\n : Buffer.concat([pending, chunk as Buffer]);\n\n while (pending.length > 0) {\n const scriptStart = pending.indexOf(SCRIPT_OPEN);\n if (scriptStart === -1) {\n const writableLength = Math.max(\n 0,\n pending.length - SCRIPT_OPEN.length + 1,\n );\n await writeAll(output, pending.subarray(0, writableLength));\n pending = pending.subarray(writableLength);\n break;\n }\n\n await writeAll(output, pending.subarray(0, scriptStart));\n pending = pending.subarray(scriptStart);\n\n const openTagEnd = pending.indexOf(0x3e, SCRIPT_OPEN.length);\n if (openTagEnd === -1) break;\n\n const closeTagStart = pending.indexOf(SCRIPT_CLOSE, openTagEnd + 1);\n if (closeTagStart === -1) break;\n\n const scriptEnd = closeTagStart + SCRIPT_CLOSE.length;\n const openTag = pending.subarray(0, openTagEnd + 1).toString('utf-8');\n const groupId = decodeGroupId(openTag);\n\n if (!groupId || !analysis.groups.has(groupId)) {\n await writeAll(output, pending.subarray(0, scriptEnd));\n } else {\n const seenCount = (seenTagsByGroup.get(groupId) ?? 0) + 1;\n seenTagsByGroup.set(groupId, seenCount);\n if (seenCount === analysis.groups.get(groupId)!.tagCount) {\n await writeAll(output, compactedTags.get(groupId)!);\n emittedGroups.add(groupId);\n }\n }\n pending = pending.subarray(scriptEnd);\n }\n }\n\n if (pending.indexOf(SCRIPT_OPEN) !== -1) {\n throw new Error(\n `Report contains an unterminated script tag: ${sourcePath}`,\n );\n }\n await writeAll(output, pending);\n\n for (const [groupId, group] of analysis.groups) {\n if (\n seenTagsByGroup.get(groupId) !== group.tagCount ||\n !emittedGroups.has(groupId)\n ) {\n throw new Error(\n `Report compaction did not rewrite every dump in group: ${groupId}`,\n );\n }\n }\n await output.sync();\n } finally {\n await output.close();\n }\n}\n\nfunction canRetryRenameOnWindows(error: unknown): boolean {\n if (process.platform !== 'win32') return false;\n const code = (error as NodeJS.ErrnoException).code;\n return code === 'EACCES' || code === 'EEXIST' || code === 'EPERM';\n}\n\nasync function replaceReportFile(\n temporaryPath: string,\n reportPath: string,\n): Promise<void> {\n try {\n await rename(temporaryPath, reportPath);\n return;\n } catch (error) {\n if (!canRetryRenameOnWindows(error)) throw error;\n }\n\n const backupPath = join(\n dirname(reportPath),\n `.${basename(reportPath)}.${uuid()}.backup`,\n );\n await rename(reportPath, backupPath);\n try {\n await rename(temporaryPath, reportPath);\n } catch (replaceError) {\n try {\n await rename(backupPath, reportPath);\n } catch (restoreError) {\n throw new Error(\n `Failed to replace compacted report and restore the original report: ${String(replaceError)}; restore error: ${String(restoreError)}`,\n );\n }\n throw replaceError;\n }\n await unlink(backupPath);\n}\n\nexport async function compactReportDumps(\n reportPath: string,\n): Promise<ReportDumpCompactionResult> {\n const before = await stat(reportPath);\n const analysis = await analyzeDumpGroups(reportPath);\n const afterDumpCount = analysis.groups.size;\n\n if (analysis.tagCount <= afterDumpCount) {\n return {\n beforeBytes: before.size,\n afterBytes: before.size,\n beforeDumpCount: analysis.tagCount,\n afterDumpCount,\n };\n }\n\n const temporaryPath = join(\n dirname(reportPath),\n `.${basename(reportPath)}.${uuid()}.tmp`,\n );\n\n try {\n await rewriteReport(reportPath, temporaryPath, analysis);\n const after = await stat(temporaryPath);\n await replaceReportFile(temporaryPath, reportPath);\n return {\n beforeBytes: before.size,\n afterBytes: after.size,\n beforeDumpCount: analysis.tagCount,\n afterDumpCount,\n };\n } catch (error) {\n try {\n await unlink(temporaryPath);\n } catch (cleanupError) {\n if ((cleanupError as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw new Error(\n `Report compaction failed and the temporary file could not be removed: ${String(error)}; cleanup error: ${String(cleanupError)}`,\n );\n }\n }\n throw error;\n }\n}\n"],"names":["__webpack_require__","definition","key","Object","obj","prop","Symbol","SCRIPT_OPEN","Buffer","SCRIPT_CLOSE","READ_CHUNK_SIZE","DUMP_TYPE_ATTRIBUTE","GROUP_ID_REGEXP","decodeGroupId","openTag","encodedGroupId","decodeURIComponent","undefined","scanScriptTags","reportPath","onScript","pending","chunk","createReadStream","scriptStart","Math","openTagEnd","closeTagStart","scriptEnd","Error","analyzeDumpGroups","groups","Map","tagCount","content","groupId","dump","ReportActionDump","antiEscapeScriptTag","group","execution","executionKey","compactedDumpTag","Array","serialized","escapeScriptTag","writeAll","handle","data","offset","bytesWritten","rewriteReport","sourcePath","targetPath","analysis","compactedTags","seenTagsByGroup","emittedGroups","Set","output","open","writableLength","seenCount","canRetryRenameOnWindows","error","process","code","replaceReportFile","temporaryPath","rename","backupPath","join","dirname","basename","uuid","replaceError","restoreError","String","unlink","compactReportDumps","before","stat","afterDumpCount","after","cleanupError"],"mappings":"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"}
@@ -24,14 +24,23 @@ var __webpack_require__ = {};
24
24
  var __webpack_exports__ = {};
25
25
  __webpack_require__.r(__webpack_exports__);
26
26
  __webpack_require__.d(__webpack_exports__, {
27
- normalizeScreenshotRef: ()=>normalizeScreenshotRef,
28
- ScreenshotStore: ()=>ScreenshotStore,
29
- resolveScreenshotSource: ()=>resolveScreenshotSource
27
+ resolveScreenshotSource: ()=>resolveScreenshotSource,
28
+ ReportImageStore: ()=>ReportImageStore,
29
+ imageRefFileExtension: ()=>external_image_reference_js_namespaceObject.imageRefFileExtension,
30
+ ScreenshotStore: ()=>ReportImageStore,
31
+ normalizeImageUrlRef: ()=>external_image_reference_js_namespaceObject.normalizeImageUrlRef,
32
+ isBase64ImageDataUrl: ()=>isBase64ImageDataUrl,
33
+ normalizeScreenshotRef: ()=>external_image_reference_js_namespaceObject.normalizeScreenshotRef,
34
+ parseBase64ImageDataUrl: ()=>parseBase64ImageDataUrl,
35
+ resolveImageSource: ()=>resolveImageSource,
36
+ normalizeStoredImageRef: ()=>external_image_reference_js_namespaceObject.normalizeStoredImageRef
30
37
  });
38
+ const external_node_crypto_namespaceObject = require("node:crypto");
31
39
  const external_node_fs_namespaceObject = require("node:fs");
32
40
  const promises_namespaceObject = require("node:fs/promises");
33
41
  const external_node_path_namespaceObject = require("node:path");
34
42
  const external_html_utils_js_namespaceObject = require("./html-utils.js");
43
+ const external_image_reference_js_namespaceObject = require("./image-reference.js");
35
44
  function _define_property(obj, key, value) {
36
45
  if (key in obj) Object.defineProperty(obj, key, {
37
46
  value: value,
@@ -42,26 +51,28 @@ function _define_property(obj, key, value) {
42
51
  else obj[key] = value;
43
52
  return obj;
44
53
  }
45
- function normalizeScreenshotRef(value) {
46
- if ('object' != typeof value || null === value) return null;
47
- const record = value;
48
- if ('midscene_screenshot_ref' === record.type && 'string' == typeof record.id && 'number' == typeof record.capturedAt && ('inline' === record.storage || 'file' === record.storage) && ('image/png' === record.mimeType || 'image/jpeg' === record.mimeType)) {
49
- if ('file' === record.storage && 'string' != typeof record.path) return null;
50
- return record;
51
- }
52
- return null;
54
+ const base64ImageDataUrlPattern = /^data:(image\/[a-z0-9.+-]+)(?:;[^,]*)?;base64,([a-z0-9+/=\s]+)$/i;
55
+ function parseBase64ImageDataUrl(imageUrl) {
56
+ const match = imageUrl.match(base64ImageDataUrlPattern);
57
+ if (!match) throw new Error('ReportImageStore: reference image must be a valid base64 image data URL');
58
+ const mimeType = match[1].toLowerCase();
59
+ return {
60
+ mimeType,
61
+ extension: (0, external_image_reference_js_namespaceObject.imageFileExtensionForMimeType)(mimeType),
62
+ rawBase64: match[2].replace(/\s/g, '')
63
+ };
53
64
  }
54
- function extensionByMimeType(mimeType) {
55
- return 'image/jpeg' === mimeType ? 'jpeg' : 'png';
65
+ function isBase64ImageDataUrl(value) {
66
+ return base64ImageDataUrlPattern.test(value);
56
67
  }
57
- function resolveScreenshotSource(refInput, options) {
58
- const ref = normalizeScreenshotRef(refInput);
68
+ function resolveImageSource(refInput, options) {
69
+ const ref = (0, external_image_reference_js_namespaceObject.normalizeStoredImageRef)(refInput);
59
70
  const id = ref?.id ?? options.fallbackId;
60
71
  const mimeType = ref?.mimeType ?? options.fallbackMimeType;
61
- if (!id || !mimeType) throw new Error('ScreenshotStore: screenshot id and mimeType are required to resolve screenshot');
72
+ if (!id || !mimeType) throw new Error('ReportImageStore: image id and mimeType are required to resolve an image');
62
73
  const resolveReportRelativePath = (filePath)=>(0, external_node_path_namespaceObject.isAbsolute)(filePath) ? filePath : (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(options.reportPath), filePath);
63
74
  if (ref?.storage === 'file') {
64
- if (!ref.path) throw new Error(`ScreenshotStore: screenshot ref "${ref.id}" missing file path`);
75
+ if (!ref.path) throw new Error(`ReportImageStore: image ref "${ref.id}" missing file path`);
65
76
  const explicitFilePath = resolveReportRelativePath(ref.path);
66
77
  if ((0, external_node_fs_namespaceObject.existsSync)(explicitFilePath)) return {
67
78
  type: 'file',
@@ -77,58 +88,137 @@ function resolveScreenshotSource(refInput, options) {
77
88
  mimeType,
78
89
  dataUri: inlineDataUri
79
90
  };
80
- const siblingScreenshotPath = (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(options.reportPath), 'screenshots', `${id}.${extensionByMimeType(mimeType)}`);
81
- if ((0, external_node_fs_namespaceObject.existsSync)(siblingScreenshotPath)) return {
91
+ const extension = ref ? (0, external_image_reference_js_namespaceObject.imageRefFileExtension)(ref) : (0, external_image_reference_js_namespaceObject.imageFileExtensionForMimeType)(options.fallbackMimeType);
92
+ if (options.imageDirectory) {
93
+ const companionImagePath = (0, external_node_path_namespaceObject.join)(options.imageDirectory, `${id}.${extension}`);
94
+ if ((0, external_node_fs_namespaceObject.existsSync)(companionImagePath)) return {
95
+ type: 'file',
96
+ id,
97
+ mimeType,
98
+ filePath: companionImagePath
99
+ };
100
+ }
101
+ const siblingImagePath = (0, external_node_path_namespaceObject.join)((0, external_node_path_namespaceObject.dirname)(options.reportPath), 'screenshots', `${id}.${extension}`);
102
+ if ((0, external_node_fs_namespaceObject.existsSync)(siblingImagePath)) return {
82
103
  type: 'file',
83
104
  id,
84
105
  mimeType,
85
- filePath: siblingScreenshotPath
106
+ filePath: siblingImagePath
86
107
  };
87
- throw new Error(`ScreenshotStore: cannot resolve screenshot "${id}" from ${options.reportPath}`);
108
+ throw new Error(`ReportImageStore: cannot resolve image "${id}" from ${options.reportPath}`);
88
109
  }
89
- class ScreenshotStore {
110
+ function resolveScreenshotSource(refInput, options) {
111
+ const ref = (0, external_image_reference_js_namespaceObject.normalizeScreenshotRef)(refInput);
112
+ return resolveImageSource(ref, options);
113
+ }
114
+ class ReportImageStore {
90
115
  async persist(screenshot) {
116
+ await this.ensureExistingInlineImageIdsLoaded();
91
117
  const shouldWriteFileCopy = 'directory' === this.mode || this.alsoWriteFileCopy;
92
118
  const fileRef = shouldWriteFileCopy ? await this.persistToSharedFileIfNeeded(screenshot, {
93
119
  markAsPersisted: 'directory' === this.mode
94
120
  }) : null;
95
121
  if ('inline' === this.mode) {
96
- if (!this.writeInlineImage) throw new Error('ScreenshotStore: writeInlineImage is required in inline mode');
122
+ if (!this.writeInlineImage) throw new Error('ReportImageStore: writeInlineImage is required in inline mode');
97
123
  if (!this.writtenInlineIds.has(screenshot.id)) {
98
124
  await this.writeInlineImage(screenshot.id, screenshot.base64);
99
125
  this.writtenInlineIds.add(screenshot.id);
100
126
  }
101
127
  return screenshot.markPersistedInline(this.reportPath);
102
128
  }
103
- if (!fileRef) throw new Error('ScreenshotStore: file persistence is required in directory mode');
129
+ if (!fileRef) throw new Error('ReportImageStore: file persistence is required in directory mode');
104
130
  return fileRef;
105
131
  }
132
+ async persistReferenceImage(imageUrl) {
133
+ await this.ensureExistingInlineImageIdsLoaded();
134
+ const { mimeType, extension, rawBase64 } = parseBase64ImageDataUrl(imageUrl);
135
+ const id = `reference-${(0, external_node_crypto_namespaceObject.createHash)('sha256').update(mimeType).update('\0').update(Buffer.from(rawBase64, 'base64')).digest('hex')}`;
136
+ const shouldWriteFileCopy = 'directory' === this.mode || this.alsoWriteFileCopy;
137
+ const fileLocation = shouldWriteFileCopy ? await this.writeImageFileIfNeeded({
138
+ id,
139
+ extension,
140
+ rawBase64
141
+ }) : null;
142
+ if ('inline' === this.mode) {
143
+ if (!this.writeInlineImage) throw new Error('ReportImageStore: writeInlineImage is required in inline mode');
144
+ if (!this.writtenInlineIds.has(id)) {
145
+ await this.writeInlineImage(id, imageUrl);
146
+ this.writtenInlineIds.add(id);
147
+ }
148
+ return {
149
+ type: 'midscene_image_url_ref',
150
+ id,
151
+ mimeType,
152
+ storage: 'inline'
153
+ };
154
+ }
155
+ if (!fileLocation) throw new Error('ReportImageStore: file persistence is required in directory mode');
156
+ return {
157
+ type: 'midscene_image_url_ref',
158
+ id,
159
+ mimeType,
160
+ storage: 'file',
161
+ path: fileLocation.relativePath
162
+ };
163
+ }
164
+ async ensureExistingInlineImageIdsLoaded() {
165
+ if (!this.shouldReuseExistingInlineReport) return;
166
+ if (!this.existingInlineImageIdsPromise) this.existingInlineImageIdsPromise = (async ()=>{
167
+ try {
168
+ const imageIds = await (0, external_html_utils_js_namespaceObject.collectImageScriptIds)(this.reportPath);
169
+ for (const imageId of imageIds)this.writtenInlineIds.add(imageId);
170
+ } catch (error) {
171
+ if ('object' == typeof error && null !== error && 'code' in error && 'ENOENT' === error.code) return;
172
+ throw new Error(`ReportImageStore: failed to index existing inline images from ${this.reportPath}`, {
173
+ cause: error
174
+ });
175
+ }
176
+ })();
177
+ await this.existingInlineImageIdsPromise;
178
+ }
106
179
  async persistToSharedFileIfNeeded(screenshot, options) {
180
+ const { relativePath, absolutePath } = await this.writeImageFileIfNeeded({
181
+ id: screenshot.id,
182
+ extension: screenshot.extension,
183
+ rawBase64: screenshot.rawBase64
184
+ });
185
+ if (options.markAsPersisted) return screenshot.markPersistedToPath(relativePath, absolutePath);
186
+ return screenshot.registerPersistedFileCopy(relativePath, absolutePath);
187
+ }
188
+ async writeImageFileIfNeeded(image) {
107
189
  const screenshotsDir = this.screenshotsDir;
108
- if (!screenshotsDir) throw new Error('ScreenshotStore: screenshotsDir is required when file persistence is enabled');
190
+ if (!screenshotsDir) throw new Error('ReportImageStore: screenshotsDir is required when file persistence is enabled');
109
191
  if (!(0, external_node_fs_namespaceObject.existsSync)(screenshotsDir)) (0, external_node_fs_namespaceObject.mkdirSync)(screenshotsDir, {
110
192
  recursive: true
111
193
  });
112
- const relativePath = `./screenshots/${screenshot.id}.${screenshot.extension}`;
113
- const absolutePath = (0, external_node_path_namespaceObject.join)(screenshotsDir, `${screenshot.id}.${screenshot.extension}`);
114
- if (!this.writtenFileIds.has(screenshot.id)) {
115
- const buffer = Buffer.from(screenshot.rawBase64, 'base64');
116
- await (0, promises_namespaceObject.writeFile)(absolutePath, buffer);
117
- this.writtenFileIds.add(screenshot.id);
194
+ const fileName = `${image.id}.${image.extension}`;
195
+ const relativePath = `./screenshots/${fileName}`;
196
+ const absolutePath = (0, external_node_path_namespaceObject.join)(screenshotsDir, fileName);
197
+ if (!this.writtenFileIds.has(image.id)) {
198
+ await (0, promises_namespaceObject.writeFile)(absolutePath, Buffer.from(image.rawBase64, 'base64'));
199
+ this.writtenFileIds.add(image.id);
118
200
  }
119
- if (options.markAsPersisted) return screenshot.markPersistedToPath(relativePath, absolutePath);
120
- return screenshot.registerPersistedFileCopy(relativePath, absolutePath);
201
+ return {
202
+ relativePath,
203
+ absolutePath
204
+ };
121
205
  }
122
- loadBase64(refInput) {
123
- const ref = normalizeScreenshotRef(refInput);
124
- if (!ref) throw new Error('ScreenshotStore: invalid screenshot reference');
125
- const resolved = resolveScreenshotSource(ref, {
126
- reportPath: this.reportPath
206
+ loadDataUri(refInput) {
207
+ const ref = (0, external_image_reference_js_namespaceObject.normalizeStoredImageRef)(refInput);
208
+ if (!ref) throw new Error('ReportImageStore: invalid image reference');
209
+ const resolved = resolveImageSource(ref, {
210
+ reportPath: this.reportPath,
211
+ imageDirectory: this.screenshotsDir
127
212
  });
128
213
  if ('data-uri' === resolved.type) return resolved.dataUri;
129
214
  const data = (0, external_node_fs_namespaceObject.readFileSync)(resolved.filePath);
130
215
  return `data:${resolved.mimeType};base64,${data.toString('base64')}`;
131
216
  }
217
+ loadBase64(refInput) {
218
+ const screenshotRef = (0, external_image_reference_js_namespaceObject.normalizeScreenshotRef)(refInput);
219
+ if (!screenshotRef) throw new Error('ReportImageStore: invalid screenshot reference');
220
+ return this.loadDataUri(screenshotRef);
221
+ }
132
222
  cleanup() {
133
223
  if ('directory' === this.mode && this.screenshotsDir && (0, external_node_fs_namespaceObject.existsSync)(this.screenshotsDir)) (0, external_node_fs_namespaceObject.rmSync)(this.screenshotsDir, {
134
224
  recursive: true,
@@ -136,6 +226,7 @@ class ScreenshotStore {
136
226
  });
137
227
  this.writtenInlineIds.clear();
138
228
  this.writtenFileIds.clear();
229
+ this.existingInlineImageIdsPromise = void 0;
139
230
  }
140
231
  constructor(options){
141
232
  _define_property(this, "mode", void 0);
@@ -145,19 +236,36 @@ class ScreenshotStore {
145
236
  _define_property(this, "alsoWriteFileCopy", void 0);
146
237
  _define_property(this, "writtenInlineIds", new Set());
147
238
  _define_property(this, "writtenFileIds", new Set());
239
+ _define_property(this, "shouldReuseExistingInlineReport", void 0);
240
+ _define_property(this, "existingInlineImageIdsPromise", void 0);
148
241
  this.mode = options.mode;
149
242
  this.reportPath = options.reportPath;
150
243
  this.screenshotsDir = options.screenshotsDir;
151
244
  this.writeInlineImage = options.writeInlineImage;
152
245
  this.alsoWriteFileCopy = options.alsoWriteFileCopy ?? options.ensureFileCopy ?? false;
246
+ this.shouldReuseExistingInlineReport = Boolean(options.reuseExistingReport && 'inline' === this.mode);
153
247
  }
154
248
  }
249
+ exports.ReportImageStore = __webpack_exports__.ReportImageStore;
155
250
  exports.ScreenshotStore = __webpack_exports__.ScreenshotStore;
251
+ exports.imageRefFileExtension = __webpack_exports__.imageRefFileExtension;
252
+ exports.isBase64ImageDataUrl = __webpack_exports__.isBase64ImageDataUrl;
253
+ exports.normalizeImageUrlRef = __webpack_exports__.normalizeImageUrlRef;
156
254
  exports.normalizeScreenshotRef = __webpack_exports__.normalizeScreenshotRef;
255
+ exports.normalizeStoredImageRef = __webpack_exports__.normalizeStoredImageRef;
256
+ exports.parseBase64ImageDataUrl = __webpack_exports__.parseBase64ImageDataUrl;
257
+ exports.resolveImageSource = __webpack_exports__.resolveImageSource;
157
258
  exports.resolveScreenshotSource = __webpack_exports__.resolveScreenshotSource;
158
259
  for(var __rspack_i in __webpack_exports__)if (-1 === [
260
+ "ReportImageStore",
159
261
  "ScreenshotStore",
262
+ "imageRefFileExtension",
263
+ "isBase64ImageDataUrl",
264
+ "normalizeImageUrlRef",
160
265
  "normalizeScreenshotRef",
266
+ "normalizeStoredImageRef",
267
+ "parseBase64ImageDataUrl",
268
+ "resolveImageSource",
161
269
  "resolveScreenshotSource"
162
270
  ].indexOf(__rspack_i)) exports[__rspack_i] = __webpack_exports__[__rspack_i];
163
271
  Object.defineProperty(exports, '__esModule', {