@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,63 @@
1
+ import { jsonrepair } from "jsonrepair";
2
+ function extractJSONFromCodeBlock(response) {
3
+ try {
4
+ const jsonMatch = response.match(/^\s*(\{[\s\S]*\})\s*$/);
5
+ if (jsonMatch) return jsonMatch[1];
6
+ const codeBlockMatch = response.match(/```(?:json)?\s*(\{[\s\S]*?\})\s*```/);
7
+ if (codeBlockMatch) return codeBlockMatch[1];
8
+ const jsonLikeMatch = response.match(/\{[\s\S]*\}/);
9
+ if (jsonLikeMatch) return jsonLikeMatch[0];
10
+ } catch {}
11
+ return response;
12
+ }
13
+ function trimParsedJsonStrings(obj, context = {}) {
14
+ if (null == obj) return obj;
15
+ if (Array.isArray(obj)) return obj.map((item)=>trimParsedJsonStrings(item, context));
16
+ if ('object' == typeof obj) {
17
+ const normalized = {};
18
+ for (const [key, value] of Object.entries(obj)){
19
+ const trimmedKey = key.trim();
20
+ const preserveStringValue = context.preserveStringValueKeys?.includes(trimmedKey) ?? false;
21
+ const normalizedValue = 'string' == typeof value ? preserveStringValue ? value : value.trim() : trimParsedJsonStrings(value, context);
22
+ normalized[trimmedKey] = normalizedValue;
23
+ }
24
+ return normalized;
25
+ }
26
+ if ('string' == typeof obj) return obj.trim();
27
+ return obj;
28
+ }
29
+ function repairKnownJsonIssues(jsonBlock, _rawResponse) {
30
+ return jsonBlock;
31
+ }
32
+ function assertJsonObject(parsed) {
33
+ if (!parsed || 'object' != typeof parsed || Array.isArray(parsed)) {
34
+ const parsedType = Array.isArray(parsed) ? 'array' : null === parsed ? 'null' : typeof parsed;
35
+ throw new Error(`LLM response is valid JSON but does not match the expected schema. Expected to be a JSON object, got ${parsedType}: ${JSON.stringify(parsed)}.`);
36
+ }
37
+ }
38
+ function parseJsonWithRepair(jsonStr) {
39
+ try {
40
+ return JSON.parse(jsonStr);
41
+ } catch {
42
+ return JSON.parse(jsonrepair(jsonStr));
43
+ }
44
+ }
45
+ function parseModelResponseJson(raw, context) {
46
+ const cleanJsonString = extractJSONFromCodeBlock(raw);
47
+ let parsedObj;
48
+ try {
49
+ parsedObj = parseJsonWithRepair(cleanJsonString);
50
+ } catch (e1) {
51
+ const code = repairKnownJsonIssues(cleanJsonString, raw);
52
+ if (code === cleanJsonString) throw new Error(`failed to parse LLM response into JSON. Error - ${String(e1)}. Response - \n ${raw}`);
53
+ try {
54
+ parsedObj = parseJsonWithRepair(code);
55
+ } catch (e2) {
56
+ throw new Error(`failed to parse LLM response into JSON. First error - ${String(e1)}. Second error - ${String(e2)}. Response - \n ${raw}`);
57
+ }
58
+ }
59
+ return trimParsedJsonStrings(parsedObj, context);
60
+ }
61
+ export { assertJsonObject, extractJSONFromCodeBlock, parseModelResponseJson };
62
+
63
+ //# sourceMappingURL=json.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/json.mjs","sources":["../../../../src/ai-model/shared/json.ts"],"sourcesContent":["import { jsonrepair } from 'jsonrepair';\n\n/**\n * Extract the JSON portion from a model response.\n *\n * This mainly handles fenced JSON like ```json { ... } ``` by removing the\n * fence. If that does not produce a JSON object, it falls back to a greedy regex\n * that extracts from the first \"{\" to the last \"}\". If that still fails, the\n * original response is returned.\n *\n * Expected model responses are JSON objects, possibly wrapped in markdown\n * fences. Natural language mixed with JSON, or arrays like\n * [{\"type\":\"Tap\"}, {\"type\":\"Hover\"}], are outside the supported contract and\n * are not reliably recoverable.\n *\n * This extractor is also used by extraction responses that can be any\n * JSON value. In those cases, arrays/strings/numbers have no object braces and\n * pass through unchanged.\n */\nexport function extractJSONFromCodeBlock(response: string) {\n try {\n // First, try to match a JSON object directly in the response\n const jsonMatch = response.match(/^\\s*(\\{[\\s\\S]*\\})\\s*$/);\n if (jsonMatch) {\n return jsonMatch[1];\n }\n\n // If no direct JSON object is found, try to extract JSON from a code block\n const codeBlockMatch = response.match(\n /```(?:json)?\\s*(\\{[\\s\\S]*?\\})\\s*```/,\n );\n if (codeBlockMatch) {\n return codeBlockMatch[1];\n }\n\n // If no code block is found, try to find a JSON-like structure in the text\n const jsonLikeMatch = response.match(/\\{[\\s\\S]*\\}/);\n if (jsonLikeMatch) {\n return jsonLikeMatch[0];\n }\n } catch {}\n // If no JSON-like structure is found, return the original response\n return response;\n}\n\nexport type JsonParserSource =\n | 'generic-object'\n | 'planning-action-param'\n | 'locate'\n | 'section-locator';\n\nexport interface JsonParserContext {\n source: JsonParserSource;\n preserveStringValueKeys?: string[];\n}\n\nexport type JsonParser = (raw: string, context?: JsonParserContext) => unknown;\n\n/**\n * Trim whitespace in parsed JSON by normalizing:\n * 1. All object keys (e.g., \" prompt \" -> \"prompt\")\n * 2. All string values (e.g., \" Tap \" -> \"Tap\")\n * This handles LLM output that may include leading/trailing spaces.\n */\nfunction trimParsedJsonStrings(\n obj: any,\n context: Pick<JsonParserContext, 'preserveStringValueKeys'> = {},\n): any {\n // Handle null and undefined\n if (obj === null || obj === undefined) {\n return obj;\n }\n\n // Handle arrays - recursively normalize each element\n if (Array.isArray(obj)) {\n return obj.map((item) => trimParsedJsonStrings(item, context));\n }\n\n // Handle objects\n if (typeof obj === 'object') {\n const normalized: any = {};\n\n for (const [key, value] of Object.entries(obj)) {\n // Trim the key to remove leading/trailing spaces\n const trimmedKey = key.trim();\n const preserveStringValue =\n context.preserveStringValueKeys?.includes(trimmedKey) ?? false;\n\n const normalizedValue =\n typeof value === 'string'\n ? preserveStringValue\n ? value\n : value.trim()\n : trimParsedJsonStrings(value, context);\n\n normalized[trimmedKey] = normalizedValue;\n }\n\n return normalized;\n }\n\n // Handle primitive strings\n if (typeof obj === 'string') {\n return obj.trim();\n }\n\n // Return other primitives as-is\n return obj;\n}\n\nfunction repairKnownJsonIssues(\n jsonBlock: string,\n _rawResponse: string,\n): string {\n // TODO: Add project-specific repairs that jsonrepair cannot handle.\n return jsonBlock;\n}\n\nexport function assertJsonObject(\n parsed: unknown,\n): asserts parsed is Record<string, unknown> {\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n const parsedType = Array.isArray(parsed)\n ? 'array'\n : parsed === null\n ? 'null'\n : typeof parsed;\n throw new Error(\n `LLM response is valid JSON but does not match the expected schema. Expected to be a JSON object, got ${parsedType}: ${JSON.stringify(parsed)}.`,\n );\n }\n}\n\nfunction parseJsonWithRepair(jsonStr: string) {\n try {\n return JSON.parse(jsonStr);\n } catch {\n return JSON.parse(jsonrepair(jsonStr));\n }\n}\n\nexport function parseModelResponseJson(\n raw: string,\n context?: JsonParserContext,\n) {\n const cleanJsonString = extractJSONFromCodeBlock(raw);\n\n let parsedObj: unknown;\n\n try {\n parsedObj = parseJsonWithRepair(cleanJsonString);\n } catch (e1) {\n const code = repairKnownJsonIssues(cleanJsonString, raw);\n if (code === cleanJsonString) {\n throw new Error(\n `failed to parse LLM response into JSON. Error - ${String(\n e1,\n )}. Response - \\n ${raw}`,\n );\n }\n\n try {\n parsedObj = parseJsonWithRepair(code);\n } catch (e2) {\n throw new Error(\n `failed to parse LLM response into JSON. First error - ${String(\n e1,\n )}. Second error - ${String(e2)}. Response - \\n ${raw}`,\n );\n }\n }\n\n return trimParsedJsonStrings(parsedObj, context);\n}\n"],"names":["extractJSONFromCodeBlock","response","jsonMatch","codeBlockMatch","jsonLikeMatch","trimParsedJsonStrings","obj","context","Array","item","normalized","key","value","Object","trimmedKey","preserveStringValue","normalizedValue","repairKnownJsonIssues","jsonBlock","_rawResponse","assertJsonObject","parsed","parsedType","Error","JSON","parseJsonWithRepair","jsonStr","jsonrepair","parseModelResponseJson","raw","cleanJsonString","parsedObj","e1","code","String","e2"],"mappings":";AAmBO,SAASA,yBAAyBC,QAAgB;IACvD,IAAI;QAEF,MAAMC,YAAYD,SAAS,KAAK,CAAC;QACjC,IAAIC,WACF,OAAOA,SAAS,CAAC,EAAE;QAIrB,MAAMC,iBAAiBF,SAAS,KAAK,CACnC;QAEF,IAAIE,gBACF,OAAOA,cAAc,CAAC,EAAE;QAI1B,MAAMC,gBAAgBH,SAAS,KAAK,CAAC;QACrC,IAAIG,eACF,OAAOA,aAAa,CAAC,EAAE;IAE3B,EAAE,OAAM,CAAC;IAET,OAAOH;AACT;AAqBA,SAASI,sBACPC,GAAQ,EACRC,UAA8D,CAAC,CAAC;IAGhE,IAAID,QAAAA,KACF,OAAOA;IAIT,IAAIE,MAAM,OAAO,CAACF,MAChB,OAAOA,IAAI,GAAG,CAAC,CAACG,OAASJ,sBAAsBI,MAAMF;IAIvD,IAAI,AAAe,YAAf,OAAOD,KAAkB;QAC3B,MAAMI,aAAkB,CAAC;QAEzB,KAAK,MAAM,CAACC,KAAKC,MAAM,IAAIC,OAAO,OAAO,CAACP,KAAM;YAE9C,MAAMQ,aAAaH,IAAI,IAAI;YAC3B,MAAMI,sBACJR,QAAQ,uBAAuB,EAAE,SAASO,eAAe;YAE3D,MAAME,kBACJ,AAAiB,YAAjB,OAAOJ,QACHG,sBACEH,QACAA,MAAM,IAAI,KACZP,sBAAsBO,OAAOL;YAEnCG,UAAU,CAACI,WAAW,GAAGE;QAC3B;QAEA,OAAON;IACT;IAGA,IAAI,AAAe,YAAf,OAAOJ,KACT,OAAOA,IAAI,IAAI;IAIjB,OAAOA;AACT;AAEA,SAASW,sBACPC,SAAiB,EACjBC,YAAoB;IAGpB,OAAOD;AACT;AAEO,SAASE,iBACdC,MAAe;IAEf,IAAI,CAACA,UAAU,AAAkB,YAAlB,OAAOA,UAAuBb,MAAM,OAAO,CAACa,SAAS;QAClE,MAAMC,aAAad,MAAM,OAAO,CAACa,UAC7B,UACAA,AAAW,SAAXA,SACE,SACA,OAAOA;QACb,MAAM,IAAIE,MACR,CAAC,qGAAqG,EAAED,WAAW,EAAE,EAAEE,KAAK,SAAS,CAACH,QAAQ,CAAC,CAAC;IAEpJ;AACF;AAEA,SAASI,oBAAoBC,OAAe;IAC1C,IAAI;QACF,OAAOF,KAAK,KAAK,CAACE;IACpB,EAAE,OAAM;QACN,OAAOF,KAAK,KAAK,CAACG,WAAWD;IAC/B;AACF;AAEO,SAASE,uBACdC,GAAW,EACXtB,OAA2B;IAE3B,MAAMuB,kBAAkB9B,yBAAyB6B;IAEjD,IAAIE;IAEJ,IAAI;QACFA,YAAYN,oBAAoBK;IAClC,EAAE,OAAOE,IAAI;QACX,MAAMC,OAAOhB,sBAAsBa,iBAAiBD;QACpD,IAAII,SAASH,iBACX,MAAM,IAAIP,MACR,CAAC,gDAAgD,EAAEW,OACjDF,IACA,gBAAgB,EAAEH,KAAK;QAI7B,IAAI;YACFE,YAAYN,oBAAoBQ;QAClC,EAAE,OAAOE,IAAI;YACX,MAAM,IAAIZ,MACR,CAAC,sDAAsD,EAAEW,OACvDF,IACA,iBAAiB,EAAEE,OAAOC,IAAI,gBAAgB,EAAEN,KAAK;QAE3D;IACF;IAEA,OAAOxB,sBAAsB0B,WAAWxB;AAC1C"}
@@ -0,0 +1,60 @@
1
+ function maxPixelIndex(size) {
2
+ return Math.max(size - 1, 0);
3
+ }
4
+ function normalizedCoordinateToPixelIndex(value, normalizedBy, size) {
5
+ return Math.round(value * maxPixelIndex(size) / normalizedBy);
6
+ }
7
+ function mapNormalizedCoordinatesToPixelBbox(coordinates, normalizedBy, width, height) {
8
+ const [left, top, right, bottom] = coordinates;
9
+ return [
10
+ normalizedCoordinateToPixelIndex(left, normalizedBy, width),
11
+ normalizedCoordinateToPixelIndex(top, normalizedBy, height),
12
+ normalizedCoordinateToPixelIndex(right, normalizedBy, width),
13
+ normalizedCoordinateToPixelIndex(bottom, normalizedBy, height)
14
+ ];
15
+ }
16
+ function expandPointToBbox(x, y, maxX, maxY, halfSize) {
17
+ return [
18
+ Math.max(0, x - halfSize),
19
+ Math.max(0, y - halfSize),
20
+ Math.min(maxX, x + halfSize),
21
+ Math.min(maxY, y + halfSize)
22
+ ];
23
+ }
24
+ function clamp(value, min, max) {
25
+ return Math.min(Math.max(value, min), max);
26
+ }
27
+ function assertFinitePixelBbox(pixelBbox, rawResult) {
28
+ if (4 !== pixelBbox.length || !pixelBbox.every((value)=>'number' == typeof value && Number.isFinite(value))) throw new Error(`invalid locate bbox data: ${JSON.stringify(rawResult)} `);
29
+ }
30
+ function assertPixelBboxOrder(pixelBbox, rawResult) {
31
+ const [left, top, right, bottom] = pixelBbox;
32
+ if (right >= left && bottom >= top) return;
33
+ throw new Error(`locate pixel bbox has invalid coordinate order: bbox=${JSON.stringify(rawResult)} pixelBbox=${JSON.stringify(pixelBbox)}`);
34
+ }
35
+ function assertPixelBboxInsideImage(pixelBbox, rawResult, width, height) {
36
+ const [left, top, right, bottom] = pixelBbox;
37
+ const maxRight = maxPixelIndex(width);
38
+ const maxBottom = maxPixelIndex(height);
39
+ const outOfImage = left < 0 || top < 0 || right > maxRight || bottom > maxBottom;
40
+ if (!outOfImage) return;
41
+ throw new Error(`locate pixel bbox is outside the image size: bbox=${JSON.stringify(rawResult)} imageSize=${width}x${height}`);
42
+ }
43
+ function finalizePixelBbox(pixelBbox, rawResult, { preparedSize, contentSize }) {
44
+ const { width, height } = preparedSize;
45
+ assertFinitePixelBbox(pixelBbox, rawResult);
46
+ assertPixelBboxOrder(pixelBbox, rawResult);
47
+ assertPixelBboxInsideImage(pixelBbox, rawResult, width, height);
48
+ const rightLimit = maxPixelIndex(contentSize?.width ?? width);
49
+ const bottomLimit = maxPixelIndex(contentSize?.height ?? height);
50
+ const [left, top, right, bottom] = pixelBbox;
51
+ return [
52
+ clamp(left, 0, rightLimit),
53
+ clamp(top, 0, bottomLimit),
54
+ clamp(right, 0, rightLimit),
55
+ clamp(bottom, 0, bottomLimit)
56
+ ];
57
+ }
58
+ export { expandPointToBbox, finalizePixelBbox, mapNormalizedCoordinatesToPixelBbox, maxPixelIndex, normalizedCoordinateToPixelIndex };
59
+
60
+ //# sourceMappingURL=bbox.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/bbox.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/bbox.ts"],"sourcesContent":["import type { LocateResultBbox, LocateResultContext, PixelBbox } from './types';\n\nexport function maxPixelIndex(size: number) {\n return Math.max(size - 1, 0);\n}\n\nexport function normalizedCoordinateToPixelIndex(\n value: number,\n normalizedBy: number,\n size: number,\n) {\n return Math.round((value * maxPixelIndex(size)) / normalizedBy);\n}\n\nexport function mapNormalizedCoordinatesToPixelBbox(\n coordinates: LocateResultBbox,\n normalizedBy: number,\n width: number,\n height: number,\n): PixelBbox {\n // PixelBbox uses inclusive pixel indexes, so normalized coordinates map to\n // size - 1.\n const [left, top, right, bottom] = coordinates;\n return [\n normalizedCoordinateToPixelIndex(left, normalizedBy, width),\n normalizedCoordinateToPixelIndex(top, normalizedBy, height),\n normalizedCoordinateToPixelIndex(right, normalizedBy, width),\n normalizedCoordinateToPixelIndex(bottom, normalizedBy, height),\n ];\n}\n\nexport function expandPointToBbox(\n x: number,\n y: number,\n maxX: number,\n maxY: number,\n halfSize: number,\n): LocateResultBbox {\n return [\n Math.max(0, x - halfSize),\n Math.max(0, y - halfSize),\n Math.min(maxX, x + halfSize),\n Math.min(maxY, y + halfSize),\n ];\n}\n\nfunction clamp(value: number, min: number, max: number) {\n return Math.min(Math.max(value, min), max);\n}\n\nfunction assertFinitePixelBbox(\n pixelBbox: readonly number[],\n rawResult: unknown,\n): asserts pixelBbox is PixelBbox {\n if (\n pixelBbox.length !== 4 ||\n !pixelBbox.every(\n (value) => typeof value === 'number' && Number.isFinite(value),\n )\n ) {\n throw new Error(`invalid locate bbox data: ${JSON.stringify(rawResult)} `);\n }\n}\n\nfunction assertPixelBboxOrder(pixelBbox: PixelBbox, rawResult: unknown) {\n const [left, top, right, bottom] = pixelBbox;\n if (right >= left && bottom >= top) {\n return;\n }\n\n throw new Error(\n `locate pixel bbox has invalid coordinate order: bbox=${JSON.stringify(\n rawResult,\n )} pixelBbox=${JSON.stringify(pixelBbox)}`,\n );\n}\n\nfunction assertPixelBboxInsideImage(\n pixelBbox: PixelBbox,\n rawResult: unknown,\n width: number,\n height: number,\n) {\n const [left, top, right, bottom] = pixelBbox;\n const maxRight = maxPixelIndex(width);\n const maxBottom = maxPixelIndex(height);\n const outOfImage =\n left < 0 || top < 0 || right > maxRight || bottom > maxBottom;\n\n if (!outOfImage) {\n return;\n }\n\n throw new Error(\n `locate pixel bbox is outside the image size: bbox=${JSON.stringify(\n rawResult,\n )} imageSize=${width}x${height}`,\n );\n}\n\nexport function finalizePixelBbox(\n pixelBbox: PixelBbox,\n rawResult: unknown,\n { preparedSize, contentSize }: LocateResultContext,\n): PixelBbox {\n const { width, height } = preparedSize;\n assertFinitePixelBbox(pixelBbox, rawResult);\n assertPixelBboxOrder(pixelBbox, rawResult);\n assertPixelBboxInsideImage(pixelBbox, rawResult, width, height);\n\n const rightLimit = maxPixelIndex(contentSize?.width ?? width);\n const bottomLimit = maxPixelIndex(contentSize?.height ?? height);\n const [left, top, right, bottom] = pixelBbox;\n\n return [\n clamp(left, 0, rightLimit),\n clamp(top, 0, bottomLimit),\n clamp(right, 0, rightLimit),\n clamp(bottom, 0, bottomLimit),\n ];\n}\n"],"names":["maxPixelIndex","size","Math","normalizedCoordinateToPixelIndex","value","normalizedBy","mapNormalizedCoordinatesToPixelBbox","coordinates","width","height","left","top","right","bottom","expandPointToBbox","x","y","maxX","maxY","halfSize","clamp","min","max","assertFinitePixelBbox","pixelBbox","rawResult","Number","Error","JSON","assertPixelBboxOrder","assertPixelBboxInsideImage","maxRight","maxBottom","outOfImage","finalizePixelBbox","preparedSize","contentSize","rightLimit","bottomLimit"],"mappings":"AAEO,SAASA,cAAcC,IAAY;IACxC,OAAOC,KAAK,GAAG,CAACD,OAAO,GAAG;AAC5B;AAEO,SAASE,iCACdC,KAAa,EACbC,YAAoB,EACpBJ,IAAY;IAEZ,OAAOC,KAAK,KAAK,CAAEE,QAAQJ,cAAcC,QAASI;AACpD;AAEO,SAASC,oCACdC,WAA6B,EAC7BF,YAAoB,EACpBG,KAAa,EACbC,MAAc;IAId,MAAM,CAACC,MAAMC,KAAKC,OAAOC,OAAO,GAAGN;IACnC,OAAO;QACLJ,iCAAiCO,MAAML,cAAcG;QACrDL,iCAAiCQ,KAAKN,cAAcI;QACpDN,iCAAiCS,OAAOP,cAAcG;QACtDL,iCAAiCU,QAAQR,cAAcI;KACxD;AACH;AAEO,SAASK,kBACdC,CAAS,EACTC,CAAS,EACTC,IAAY,EACZC,IAAY,EACZC,QAAgB;IAEhB,OAAO;QACLjB,KAAK,GAAG,CAAC,GAAGa,IAAII;QAChBjB,KAAK,GAAG,CAAC,GAAGc,IAAIG;QAChBjB,KAAK,GAAG,CAACe,MAAMF,IAAII;QACnBjB,KAAK,GAAG,CAACgB,MAAMF,IAAIG;KACpB;AACH;AAEA,SAASC,MAAMhB,KAAa,EAAEiB,GAAW,EAAEC,GAAW;IACpD,OAAOpB,KAAK,GAAG,CAACA,KAAK,GAAG,CAACE,OAAOiB,MAAMC;AACxC;AAEA,SAASC,sBACPC,SAA4B,EAC5BC,SAAkB;IAElB,IACED,AAAqB,MAArBA,UAAU,MAAM,IAChB,CAACA,UAAU,KAAK,CACd,CAACpB,QAAU,AAAiB,YAAjB,OAAOA,SAAsBsB,OAAO,QAAQ,CAACtB,SAG1D,MAAM,IAAIuB,MAAM,CAAC,0BAA0B,EAAEC,KAAK,SAAS,CAACH,WAAW,CAAC,CAAC;AAE7E;AAEA,SAASI,qBAAqBL,SAAoB,EAAEC,SAAkB;IACpE,MAAM,CAACf,MAAMC,KAAKC,OAAOC,OAAO,GAAGW;IACnC,IAAIZ,SAASF,QAAQG,UAAUF,KAC7B;IAGF,MAAM,IAAIgB,MACR,CAAC,qDAAqD,EAAEC,KAAK,SAAS,CACpEH,WACA,WAAW,EAAEG,KAAK,SAAS,CAACJ,YAAY;AAE9C;AAEA,SAASM,2BACPN,SAAoB,EACpBC,SAAkB,EAClBjB,KAAa,EACbC,MAAc;IAEd,MAAM,CAACC,MAAMC,KAAKC,OAAOC,OAAO,GAAGW;IACnC,MAAMO,WAAW/B,cAAcQ;IAC/B,MAAMwB,YAAYhC,cAAcS;IAChC,MAAMwB,aACJvB,OAAO,KAAKC,MAAM,KAAKC,QAAQmB,YAAYlB,SAASmB;IAEtD,IAAI,CAACC,YACH;IAGF,MAAM,IAAIN,MACR,CAAC,kDAAkD,EAAEC,KAAK,SAAS,CACjEH,WACA,WAAW,EAAEjB,MAAM,CAAC,EAAEC,QAAQ;AAEpC;AAEO,SAASyB,kBACdV,SAAoB,EACpBC,SAAkB,EAClB,EAAEU,YAAY,EAAEC,WAAW,EAAuB;IAElD,MAAM,EAAE5B,KAAK,EAAEC,MAAM,EAAE,GAAG0B;IAC1BZ,sBAAsBC,WAAWC;IACjCI,qBAAqBL,WAAWC;IAChCK,2BAA2BN,WAAWC,WAAWjB,OAAOC;IAExD,MAAM4B,aAAarC,cAAcoC,aAAa,SAAS5B;IACvD,MAAM8B,cAActC,cAAcoC,aAAa,UAAU3B;IACzD,MAAM,CAACC,MAAMC,KAAKC,OAAOC,OAAO,GAAGW;IAEnC,OAAO;QACLJ,MAAMV,MAAM,GAAG2B;QACfjB,MAAMT,KAAK,GAAG2B;QACdlB,MAAMR,OAAO,GAAGyB;QAChBjB,MAAMP,QAAQ,GAAGyB;KAClB;AACH"}
@@ -0,0 +1,10 @@
1
+ function createCoordinateDistanceToPixels(size, coordinateSystem) {
2
+ return (delta, axis)=>{
3
+ if (void 0 === coordinateSystem.normalizedBy) return Math.round(Math.abs(delta));
4
+ const length = 'x' === axis ? size.width : size.height;
5
+ return Math.round(Math.abs(delta) * length / coordinateSystem.normalizedBy);
6
+ };
7
+ }
8
+ export { createCoordinateDistanceToPixels };
9
+
10
+ //# sourceMappingURL=coordinate-distance.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/coordinate-distance.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/coordinate-distance.ts"],"sourcesContent":["import type { Size } from '@/types';\nimport type { ResolvedLocateResultCoordinates } from './types';\n\nexport type CoordinateDistanceAxis = 'x' | 'y';\n\nexport function createCoordinateDistanceToPixels(\n size: Size,\n coordinateSystem: ResolvedLocateResultCoordinates,\n) {\n return (delta: number, axis: CoordinateDistanceAxis): number => {\n if (coordinateSystem.normalizedBy === undefined) {\n return Math.round(Math.abs(delta));\n }\n\n const length = axis === 'x' ? size.width : size.height;\n return Math.round(\n (Math.abs(delta) * length) / coordinateSystem.normalizedBy,\n );\n };\n}\n"],"names":["createCoordinateDistanceToPixels","size","coordinateSystem","delta","axis","undefined","Math","length"],"mappings":"AAKO,SAASA,iCACdC,IAAU,EACVC,gBAAiD;IAEjD,OAAO,CAACC,OAAeC;QACrB,IAAIF,AAAkCG,WAAlCH,iBAAiB,YAAY,EAC/B,OAAOI,KAAK,KAAK,CAACA,KAAK,GAAG,CAACH;QAG7B,MAAMI,SAASH,AAAS,QAATA,OAAeH,KAAK,KAAK,GAAGA,KAAK,MAAM;QACtD,OAAOK,KAAK,KAAK,CACdA,KAAK,GAAG,CAACH,SAASI,SAAUL,iBAAiB,YAAY;IAE9D;AACF"}
@@ -0,0 +1,9 @@
1
+ const modelConfigDocUrl = 'https://midscenejs.com/model-config';
2
+ const defaultModelFamilyRequiredForLocateMessage = `Default model family is required for locate. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse locate coordinates correctly. ${modelConfigDocUrl}`;
3
+ function planningModelFamilyRequiredForLocateMessage(slot) {
4
+ if ('planning' === slot) return `Planning model family is required because aiAct is asking the planning model to return locate coordinates. Configure MIDSCENE_PLANNING_MODEL_FAMILY for the planning model, or remove the separate planning model config and configure MIDSCENE_MODEL_FAMILY on the default model. ${modelConfigDocUrl}`;
5
+ return `Default model family is required because aiAct is asking the default model to return locate coordinates during planning. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse planning locate coordinates correctly. ${modelConfigDocUrl}`;
6
+ }
7
+ export { defaultModelFamilyRequiredForLocateMessage, planningModelFamilyRequiredForLocateMessage };
8
+
9
+ //# sourceMappingURL=errors.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/errors.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/errors.ts"],"sourcesContent":["const modelConfigDocUrl = 'https://midscenejs.com/model-config';\n\nexport const defaultModelFamilyRequiredForLocateMessage = `Default model family is required for locate. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse locate coordinates correctly. ${modelConfigDocUrl}`;\n\nexport function planningModelFamilyRequiredForLocateMessage(slot?: string) {\n if (slot === 'planning') {\n return `Planning model family is required because aiAct is asking the planning model to return locate coordinates. Configure MIDSCENE_PLANNING_MODEL_FAMILY for the planning model, or remove the separate planning model config and configure MIDSCENE_MODEL_FAMILY on the default model. ${modelConfigDocUrl}`;\n }\n\n return `Default model family is required because aiAct is asking the default model to return locate coordinates during planning. Configure MIDSCENE_MODEL_FAMILY so Midscene can parse planning locate coordinates correctly. ${modelConfigDocUrl}`;\n}\n"],"names":["modelConfigDocUrl","defaultModelFamilyRequiredForLocateMessage","planningModelFamilyRequiredForLocateMessage","slot"],"mappings":"AAAA,MAAMA,oBAAoB;AAEnB,MAAMC,6CAA6C,CAAC,iIAAiI,EAAED,mBAAmB;AAE1M,SAASE,4CAA4CC,IAAa;IACvE,IAAIA,AAAS,eAATA,MACF,OAAO,CAAC,mRAAmR,EAAEH,mBAAmB;IAGlT,OAAO,CAAC,sNAAsN,EAAEA,mBAAmB;AACrP"}
@@ -0,0 +1,39 @@
1
+ import { finalizePixelBbox } from "./bbox.mjs";
2
+ import { parseNumericLocateResult } from "./parse.mjs";
3
+ import { mapLocateResultToPixelBboxByCoordinates } from "./pixel-bbox-mapper.mjs";
4
+ import { createLocateResultPromptSpec } from "./prompt-spec.mjs";
5
+ function resolveLocateResultCoordinates(coordinates) {
6
+ const order = coordinates.order ?? 'xy';
7
+ if (void 0 !== coordinates.normalizedBy && coordinates.normalizedBy <= 0) throw new Error(`locate result coordinates normalizedBy must be positive: ${coordinates.normalizedBy}`);
8
+ return {
9
+ shape: coordinates.shape,
10
+ order,
11
+ normalizedBy: coordinates.normalizedBy
12
+ };
13
+ }
14
+ function assertValidParsedLocateResult(result) {
15
+ if (!result || 'object' != typeof result) throw new Error(`invalid parsed locate result: expected object, got ${JSON.stringify(result)}`);
16
+ const coordinatesMeta = result.coordinatesMeta;
17
+ const expectedLength = coordinatesMeta?.shape === 'bbox' ? 4 : coordinatesMeta?.shape === 'point' ? 2 : 0;
18
+ if (!expectedLength) throw new Error(`invalid parsed locate result: unsupported coordinatesMeta.shape ${JSON.stringify(coordinatesMeta?.shape)}`);
19
+ const coordinates = result.coordinates;
20
+ if (!Array.isArray(coordinates) || coordinates.length !== expectedLength || !coordinates.every((value)=>'number' == typeof value && Number.isFinite(value))) throw new Error(`invalid parsed locate result: ${coordinatesMeta.shape} coordinates must be ${expectedLength} finite numbers, got ${JSON.stringify(coordinates)}`);
21
+ }
22
+ function createLocateResultCodec(config) {
23
+ const resolvedCoordinates = resolveLocateResultCoordinates(config.coordinates);
24
+ const parseRawLocateValue = config.parseRawLocateValue ?? ((input)=>parseNumericLocateResult(resolvedCoordinates, input));
25
+ const mapLocateResultToPixelBbox = config.mapLocateResultToPixelBbox ?? ((result, ctx)=>mapLocateResultToPixelBboxByCoordinates(result, ctx));
26
+ const toPixelBbox = (rawResult, context)=>{
27
+ const parsedResult = parseRawLocateValue(rawResult);
28
+ assertValidParsedLocateResult(parsedResult);
29
+ const pixelBbox = mapLocateResultToPixelBbox(parsedResult, context);
30
+ return finalizePixelBbox(pixelBbox, rawResult, context);
31
+ };
32
+ return {
33
+ promptSpec: createLocateResultPromptSpec(resolvedCoordinates),
34
+ toPixelBbox
35
+ };
36
+ }
37
+ export { createLocateResultCodec, resolveLocateResultCoordinates };
38
+
39
+ //# sourceMappingURL=factory.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/factory.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/factory.ts"],"sourcesContent":["import { finalizePixelBbox } from './bbox';\nimport { parseNumericLocateResult } from './parse';\nimport { mapLocateResultToPixelBboxByCoordinates } from './pixel-bbox-mapper';\nimport { createLocateResultPromptSpec } from './prompt-spec';\nimport type {\n LocateResultCodec,\n LocateResultContext,\n LocateResultCoordinates,\n LocateResultFormatDefinition,\n LocateResultValue,\n ResolvedLocateResultCoordinates,\n} from './types';\n\nexport function resolveLocateResultCoordinates(\n coordinates: LocateResultCoordinates,\n): ResolvedLocateResultCoordinates {\n const order = coordinates.order ?? 'xy';\n if (coordinates.normalizedBy !== undefined && coordinates.normalizedBy <= 0) {\n throw new Error(\n `locate result coordinates normalizedBy must be positive: ${coordinates.normalizedBy}`,\n );\n }\n return {\n shape: coordinates.shape,\n order,\n normalizedBy: coordinates.normalizedBy,\n };\n}\n\nfunction assertValidParsedLocateResult(result: LocateResultValue): void {\n if (!result || typeof result !== 'object') {\n throw new Error(\n `invalid parsed locate result: expected object, got ${JSON.stringify(\n result,\n )}`,\n );\n }\n\n const coordinatesMeta = result.coordinatesMeta;\n const expectedLength =\n coordinatesMeta?.shape === 'bbox'\n ? 4\n : coordinatesMeta?.shape === 'point'\n ? 2\n : 0;\n if (!expectedLength) {\n throw new Error(\n `invalid parsed locate result: unsupported coordinatesMeta.shape ${JSON.stringify(\n coordinatesMeta?.shape,\n )}`,\n );\n }\n\n const coordinates = result.coordinates;\n if (\n !Array.isArray(coordinates) ||\n coordinates.length !== expectedLength ||\n !coordinates.every(\n (value) => typeof value === 'number' && Number.isFinite(value),\n )\n ) {\n throw new Error(\n `invalid parsed locate result: ${coordinatesMeta.shape} coordinates must be ${expectedLength} finite numbers, got ${JSON.stringify(\n coordinates,\n )}`,\n );\n }\n}\n\nexport function createLocateResultCodec(\n config: LocateResultFormatDefinition,\n): LocateResultCodec {\n const resolvedCoordinates = resolveLocateResultCoordinates(\n config.coordinates,\n );\n const parseRawLocateValue =\n config.parseRawLocateValue ??\n ((input) => parseNumericLocateResult(resolvedCoordinates, input));\n const mapLocateResultToPixelBbox =\n config.mapLocateResultToPixelBbox ??\n ((result, ctx) => mapLocateResultToPixelBboxByCoordinates(result, ctx));\n\n const toPixelBbox = (rawResult: unknown, context: LocateResultContext) => {\n const parsedResult = parseRawLocateValue(rawResult);\n assertValidParsedLocateResult(parsedResult);\n const pixelBbox = mapLocateResultToPixelBbox(parsedResult, context);\n return finalizePixelBbox(pixelBbox, rawResult, context);\n };\n\n return {\n promptSpec: createLocateResultPromptSpec(resolvedCoordinates),\n toPixelBbox,\n };\n}\n"],"names":["resolveLocateResultCoordinates","coordinates","order","undefined","Error","assertValidParsedLocateResult","result","JSON","coordinatesMeta","expectedLength","Array","value","Number","createLocateResultCodec","config","resolvedCoordinates","parseRawLocateValue","input","parseNumericLocateResult","mapLocateResultToPixelBbox","ctx","mapLocateResultToPixelBboxByCoordinates","toPixelBbox","rawResult","context","parsedResult","pixelBbox","finalizePixelBbox","createLocateResultPromptSpec"],"mappings":";;;;AAaO,SAASA,+BACdC,WAAoC;IAEpC,MAAMC,QAAQD,YAAY,KAAK,IAAI;IACnC,IAAIA,AAA6BE,WAA7BF,YAAY,YAAY,IAAkBA,YAAY,YAAY,IAAI,GACxE,MAAM,IAAIG,MACR,CAAC,yDAAyD,EAAEH,YAAY,YAAY,EAAE;IAG1F,OAAO;QACL,OAAOA,YAAY,KAAK;QACxBC;QACA,cAAcD,YAAY,YAAY;IACxC;AACF;AAEA,SAASI,8BAA8BC,MAAyB;IAC9D,IAAI,CAACA,UAAU,AAAkB,YAAlB,OAAOA,QACpB,MAAM,IAAIF,MACR,CAAC,mDAAmD,EAAEG,KAAK,SAAS,CAClED,SACC;IAIP,MAAME,kBAAkBF,OAAO,eAAe;IAC9C,MAAMG,iBACJD,iBAAiB,UAAU,SACvB,IACAA,iBAAiB,UAAU,UACzB,IACA;IACR,IAAI,CAACC,gBACH,MAAM,IAAIL,MACR,CAAC,gEAAgE,EAAEG,KAAK,SAAS,CAC/EC,iBAAiB,QAChB;IAIP,MAAMP,cAAcK,OAAO,WAAW;IACtC,IACE,CAACI,MAAM,OAAO,CAACT,gBACfA,YAAY,MAAM,KAAKQ,kBACvB,CAACR,YAAY,KAAK,CAChB,CAACU,QAAU,AAAiB,YAAjB,OAAOA,SAAsBC,OAAO,QAAQ,CAACD,SAG1D,MAAM,IAAIP,MACR,CAAC,8BAA8B,EAAEI,gBAAgB,KAAK,CAAC,qBAAqB,EAAEC,eAAe,qBAAqB,EAAEF,KAAK,SAAS,CAChIN,cACC;AAGT;AAEO,SAASY,wBACdC,MAAoC;IAEpC,MAAMC,sBAAsBf,+BAC1Bc,OAAO,WAAW;IAEpB,MAAME,sBACJF,OAAO,mBAAmB,IACxB,EAAAG,QAAUC,yBAAyBH,qBAAqBE,MAAK;IACjE,MAAME,6BACJL,OAAO,0BAA0B,IAC/B,EAAAR,QAAQc,MAAQC,wCAAwCf,QAAQc,IAAG;IAEvE,MAAME,cAAc,CAACC,WAAoBC;QACvC,MAAMC,eAAeT,oBAAoBO;QACzClB,8BAA8BoB;QAC9B,MAAMC,YAAYP,2BAA2BM,cAAcD;QAC3D,OAAOG,kBAAkBD,WAAWH,WAAWC;IACjD;IAEA,OAAO;QACL,YAAYI,6BAA6Bb;QACzCO;IACF;AACF"}
@@ -0,0 +1,6 @@
1
+ import { createLocateResultCodec, resolveLocateResultCoordinates } from "./factory.mjs";
2
+ import { formatLocateExampleValue } from "./prompt-spec.mjs";
3
+ import { createCoordinateDistanceToPixels } from "./coordinate-distance.mjs";
4
+ import { isBboxLocateResultValue, isPointLocateResultValue } from "./types.mjs";
5
+ import { createLocateResultValue, parseCoordinateList, unwrapCoordinateListLikeInput } from "./parse.mjs";
6
+ export { createCoordinateDistanceToPixels, createLocateResultCodec, createLocateResultValue, formatLocateExampleValue, isBboxLocateResultValue, isPointLocateResultValue, parseCoordinateList, resolveLocateResultCoordinates, unwrapCoordinateListLikeInput };
@@ -0,0 +1,45 @@
1
+ function unwrapCoordinateListLikeInput(coordinateList) {
2
+ if (Array.isArray(coordinateList)) {
3
+ if (Array.isArray(coordinateList[0])) return coordinateList[0];
4
+ }
5
+ return coordinateList;
6
+ }
7
+ function parseCoordinateList(input, label) {
8
+ const unwrapped = unwrapCoordinateListLikeInput(input);
9
+ const values = 'string' == typeof unwrapped ? unwrapped.trim().split(/[\s,]+/).filter(Boolean) : unwrapped;
10
+ if (!Array.isArray(values)) throw new Error(`invalid ${label} data: ${JSON.stringify(input)} `);
11
+ const numericValues = values.map((value)=>'number' == typeof value ? value : Number(value));
12
+ if (!numericValues.every((value)=>Number.isFinite(value))) throw new Error(`invalid ${label} data: ${JSON.stringify(input)} `);
13
+ return numericValues;
14
+ }
15
+ function createLocateResultValue(coordinatesMeta, coordinates) {
16
+ if ('point' === coordinatesMeta.shape) return {
17
+ coordinates: [
18
+ coordinates[0],
19
+ coordinates[1]
20
+ ],
21
+ coordinatesMeta
22
+ };
23
+ return {
24
+ coordinates: [
25
+ coordinates[0],
26
+ coordinates[1],
27
+ coordinates[2],
28
+ coordinates[3]
29
+ ],
30
+ coordinatesMeta
31
+ };
32
+ }
33
+ function parseNumericLocateResult(resolvedCoordinates, input) {
34
+ if ('point' === resolvedCoordinates.shape) {
35
+ const point = parseCoordinateList(input, 'point');
36
+ if (point.length < 2) throw new Error(`invalid point data: ${JSON.stringify(input)} `);
37
+ return createLocateResultValue(resolvedCoordinates, point);
38
+ }
39
+ const bbox = parseCoordinateList(input, 'bbox');
40
+ if (4 !== bbox.length) throw new Error(`invalid bbox data: ${JSON.stringify(input)} `);
41
+ return createLocateResultValue(resolvedCoordinates, bbox);
42
+ }
43
+ export { createLocateResultValue, parseCoordinateList, parseNumericLocateResult, unwrapCoordinateListLikeInput };
44
+
45
+ //# sourceMappingURL=parse.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/parse.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/parse.ts"],"sourcesContent":["import type {\n BboxLocateResultCoordinates,\n BboxLocateResultValue,\n LocateResultBbox,\n LocateResultPoint,\n LocateResultValue,\n PointLocateResultCoordinates,\n PointLocateResultValue,\n ResolvedLocateResultCoordinates,\n} from './types';\n\ntype CoordinateListLikeInput =\n | number[]\n | string[]\n | string\n | (number[] | string[])[];\n\nexport function unwrapCoordinateListLikeInput(\n coordinateList: CoordinateListLikeInput,\n): number[] | string[] | string {\n if (Array.isArray(coordinateList)) {\n if (Array.isArray(coordinateList[0])) {\n return coordinateList[0] as number[] | string[];\n }\n return coordinateList as number[] | string[];\n }\n return coordinateList as string;\n}\n\nexport function parseCoordinateList(input: unknown, label: string): number[] {\n const unwrapped = unwrapCoordinateListLikeInput(\n input as CoordinateListLikeInput,\n );\n const values =\n typeof unwrapped === 'string'\n ? unwrapped\n .trim()\n .split(/[\\s,]+/)\n .filter(Boolean)\n : unwrapped;\n\n if (!Array.isArray(values)) {\n throw new Error(`invalid ${label} data: ${JSON.stringify(input)} `);\n }\n\n const numericValues = values.map((value) =>\n typeof value === 'number' ? value : Number(value),\n );\n\n if (!numericValues.every((value) => Number.isFinite(value))) {\n throw new Error(`invalid ${label} data: ${JSON.stringify(input)} `);\n }\n\n return numericValues;\n}\n\nexport function createLocateResultValue(\n coordinatesMeta: PointLocateResultCoordinates,\n coordinates: number[],\n): PointLocateResultValue;\nexport function createLocateResultValue(\n coordinatesMeta: BboxLocateResultCoordinates,\n coordinates: number[],\n): BboxLocateResultValue;\nexport function createLocateResultValue(\n coordinatesMeta: ResolvedLocateResultCoordinates,\n coordinates: number[],\n): LocateResultValue {\n if (coordinatesMeta.shape === 'point') {\n return {\n coordinates: [coordinates[0], coordinates[1]] as LocateResultPoint,\n coordinatesMeta,\n };\n }\n\n return {\n coordinates: [\n coordinates[0],\n coordinates[1],\n coordinates[2],\n coordinates[3],\n ] as LocateResultBbox,\n coordinatesMeta,\n };\n}\n\nexport function parseNumericLocateResult(\n resolvedCoordinates: ResolvedLocateResultCoordinates,\n input: unknown,\n): LocateResultValue {\n if (resolvedCoordinates.shape === 'point') {\n const point = parseCoordinateList(input, 'point');\n if (point.length < 2) {\n throw new Error(`invalid point data: ${JSON.stringify(input)} `);\n }\n return createLocateResultValue(resolvedCoordinates, point);\n }\n\n const bbox = parseCoordinateList(input, 'bbox');\n if (bbox.length !== 4) {\n throw new Error(`invalid bbox data: ${JSON.stringify(input)} `);\n }\n\n return createLocateResultValue(resolvedCoordinates, bbox);\n}\n"],"names":["unwrapCoordinateListLikeInput","coordinateList","Array","parseCoordinateList","input","label","unwrapped","values","Boolean","Error","JSON","numericValues","value","Number","createLocateResultValue","coordinatesMeta","coordinates","parseNumericLocateResult","resolvedCoordinates","point","bbox"],"mappings":"AAiBO,SAASA,8BACdC,cAAuC;IAEvC,IAAIC,MAAM,OAAO,CAACD,iBAChB;QAAA,IAAIC,MAAM,OAAO,CAACD,cAAc,CAAC,EAAE,GACjC,OAAOA,cAAc,CAAC,EAAE;IAC1B;IAGF,OAAOA;AACT;AAEO,SAASE,oBAAoBC,KAAc,EAAEC,KAAa;IAC/D,MAAMC,YAAYN,8BAChBI;IAEF,MAAMG,SACJ,AAAqB,YAArB,OAAOD,YACHA,UACG,IAAI,GACJ,KAAK,CAAC,UACN,MAAM,CAACE,WACVF;IAEN,IAAI,CAACJ,MAAM,OAAO,CAACK,SACjB,MAAM,IAAIE,MAAM,CAAC,QAAQ,EAAEJ,MAAM,OAAO,EAAEK,KAAK,SAAS,CAACN,OAAO,CAAC,CAAC;IAGpE,MAAMO,gBAAgBJ,OAAO,GAAG,CAAC,CAACK,QAChC,AAAiB,YAAjB,OAAOA,QAAqBA,QAAQC,OAAOD;IAG7C,IAAI,CAACD,cAAc,KAAK,CAAC,CAACC,QAAUC,OAAO,QAAQ,CAACD,SAClD,MAAM,IAAIH,MAAM,CAAC,QAAQ,EAAEJ,MAAM,OAAO,EAAEK,KAAK,SAAS,CAACN,OAAO,CAAC,CAAC;IAGpE,OAAOO;AACT;AAUO,SAASG,wBACdC,eAAgD,EAChDC,WAAqB;IAErB,IAAID,AAA0B,YAA1BA,gBAAgB,KAAK,EACvB,OAAO;QACL,aAAa;YAACC,WAAW,CAAC,EAAE;YAAEA,WAAW,CAAC,EAAE;SAAC;QAC7CD;IACF;IAGF,OAAO;QACL,aAAa;YACXC,WAAW,CAAC,EAAE;YACdA,WAAW,CAAC,EAAE;YACdA,WAAW,CAAC,EAAE;YACdA,WAAW,CAAC,EAAE;SACf;QACDD;IACF;AACF;AAEO,SAASE,yBACdC,mBAAoD,EACpDd,KAAc;IAEd,IAAIc,AAA8B,YAA9BA,oBAAoB,KAAK,EAAc;QACzC,MAAMC,QAAQhB,oBAAoBC,OAAO;QACzC,IAAIe,MAAM,MAAM,GAAG,GACjB,MAAM,IAAIV,MAAM,CAAC,oBAAoB,EAAEC,KAAK,SAAS,CAACN,OAAO,CAAC,CAAC;QAEjE,OAAOU,wBAAwBI,qBAAqBC;IACtD;IAEA,MAAMC,OAAOjB,oBAAoBC,OAAO;IACxC,IAAIgB,AAAgB,MAAhBA,KAAK,MAAM,EACb,MAAM,IAAIX,MAAM,CAAC,mBAAmB,EAAEC,KAAK,SAAS,CAACN,OAAO,CAAC,CAAC;IAGhE,OAAOU,wBAAwBI,qBAAqBE;AACtD"}
@@ -0,0 +1,67 @@
1
+ import { expandPointToBbox, mapNormalizedCoordinatesToPixelBbox, maxPixelIndex } from "./bbox.mjs";
2
+ const defaultBboxSize = 20;
3
+ function resolveCoordinateLimits(result, width, height) {
4
+ const resolvedCoordinates = result.coordinatesMeta;
5
+ const normalizedBy = resolvedCoordinates.normalizedBy;
6
+ if (void 0 !== normalizedBy) return result.coordinates.map(()=>normalizedBy);
7
+ if ('bbox' === resolvedCoordinates.shape) return 'yx' === resolvedCoordinates.order ? [
8
+ height,
9
+ width,
10
+ height,
11
+ width
12
+ ] : [
13
+ width,
14
+ height,
15
+ width,
16
+ height
17
+ ];
18
+ return 'yx' === resolvedCoordinates.order ? [
19
+ height,
20
+ width
21
+ ] : [
22
+ width,
23
+ height
24
+ ];
25
+ }
26
+ function assertLocateResultCoordinates(result, width, height) {
27
+ const resolvedCoordinates = result.coordinatesMeta;
28
+ const normalizedBy = resolvedCoordinates.normalizedBy;
29
+ const limits = resolveCoordinateLimits(result, width, height);
30
+ const outOfRange = result.coordinates.some((value, index)=>{
31
+ const limit = limits[index];
32
+ return 'number' != typeof value || !Number.isFinite(value) || value < 0 || value > limit;
33
+ });
34
+ if (!outOfRange) return;
35
+ const source = void 0 !== normalizedBy ? `normalized range [0, ${normalizedBy}]` : `image size [0, ${width}]x[0, ${height}]`;
36
+ const normalizedInfo = void 0 !== normalizedBy ? ` normalizedBy=${normalizedBy}` : '';
37
+ throw new Error(`locate result coordinates ${JSON.stringify(result.coordinates)} exceed ${source}. shape=${resolvedCoordinates.shape} order=${resolvedCoordinates.order}${normalizedInfo} limits=${JSON.stringify(limits)}`);
38
+ }
39
+ function reorderCoordinatesToXy(coordinates, order) {
40
+ if ('yx' !== order) return coordinates;
41
+ if (4 === coordinates.length) {
42
+ const [top, left, bottom, right] = coordinates;
43
+ return [
44
+ left,
45
+ top,
46
+ right,
47
+ bottom
48
+ ];
49
+ }
50
+ const [y, x] = coordinates;
51
+ return [
52
+ x,
53
+ y
54
+ ];
55
+ }
56
+ function mapLocateResultToPixelBboxByCoordinates(result, { preparedSize }) {
57
+ const { width, height } = preparedSize;
58
+ const resolvedCoordinates = result.coordinatesMeta;
59
+ const normalizedBy = resolvedCoordinates.normalizedBy;
60
+ assertLocateResultCoordinates(result, width, height);
61
+ const xyCoordinates = reorderCoordinatesToXy(result.coordinates, resolvedCoordinates.order);
62
+ const xyBbox = 4 === xyCoordinates.length ? xyCoordinates : expandPointToBbox(xyCoordinates[0], xyCoordinates[1], normalizedBy ?? maxPixelIndex(width), normalizedBy ?? maxPixelIndex(height), void 0 === normalizedBy ? defaultBboxSize / 2 : normalizedBy / 100);
63
+ return void 0 === normalizedBy ? xyBbox : mapNormalizedCoordinatesToPixelBbox(xyBbox, normalizedBy, width, height);
64
+ }
65
+ export { mapLocateResultToPixelBboxByCoordinates };
66
+
67
+ //# sourceMappingURL=pixel-bbox-mapper.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/pixel-bbox-mapper.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/pixel-bbox-mapper.ts"],"sourcesContent":["import {\n expandPointToBbox,\n mapNormalizedCoordinatesToPixelBbox,\n maxPixelIndex,\n} from './bbox';\nimport type {\n LocateResultBbox,\n LocateResultValue,\n PixelBbox,\n ResolvedLocateResultCoordinates,\n} from './types';\n\ntype Point = [number, number];\n\nconst defaultBboxSize = 20; // must be even number\n\nfunction resolveCoordinateLimits(\n result: LocateResultValue,\n width: number,\n height: number,\n): number[] {\n const resolvedCoordinates = result.coordinatesMeta;\n const normalizedBy = resolvedCoordinates.normalizedBy;\n if (normalizedBy !== undefined) {\n return result.coordinates.map(() => normalizedBy);\n }\n\n if (resolvedCoordinates.shape === 'bbox') {\n return resolvedCoordinates.order === 'yx'\n ? [height, width, height, width]\n : [width, height, width, height];\n }\n\n return resolvedCoordinates.order === 'yx' ? [height, width] : [width, height];\n}\n\nfunction assertLocateResultCoordinates(\n result: LocateResultValue,\n width: number,\n height: number,\n) {\n const resolvedCoordinates = result.coordinatesMeta;\n const normalizedBy = resolvedCoordinates.normalizedBy;\n const limits = resolveCoordinateLimits(result, width, height);\n const outOfRange = result.coordinates.some((value, index) => {\n const limit = limits[index];\n return (\n typeof value !== 'number' ||\n !Number.isFinite(value) ||\n value < 0 ||\n value > limit\n );\n });\n\n if (!outOfRange) {\n return;\n }\n\n const source =\n normalizedBy !== undefined\n ? `normalized range [0, ${normalizedBy}]`\n : `image size [0, ${width}]x[0, ${height}]`;\n const normalizedInfo =\n normalizedBy !== undefined ? ` normalizedBy=${normalizedBy}` : '';\n throw new Error(\n `locate result coordinates ${JSON.stringify(\n result.coordinates,\n )} exceed ${source}. shape=${\n resolvedCoordinates.shape\n } order=${resolvedCoordinates.order}${normalizedInfo} limits=${JSON.stringify(\n limits,\n )}`,\n );\n}\n\nfunction reorderCoordinatesToXy(\n coordinates: LocateResultBbox,\n order: ResolvedLocateResultCoordinates['order'],\n): LocateResultBbox;\nfunction reorderCoordinatesToXy(\n coordinates: Point,\n order: ResolvedLocateResultCoordinates['order'],\n): Point;\nfunction reorderCoordinatesToXy(\n coordinates: LocateResultBbox | Point,\n order: ResolvedLocateResultCoordinates['order'],\n): LocateResultBbox | Point;\nfunction reorderCoordinatesToXy(\n coordinates: LocateResultBbox | Point,\n order: ResolvedLocateResultCoordinates['order'],\n): LocateResultBbox | Point {\n if (order !== 'yx') {\n return coordinates;\n }\n\n if (coordinates.length === 4) {\n const [top, left, bottom, right] = coordinates;\n return [left, top, right, bottom];\n }\n\n const [y, x] = coordinates;\n return [x, y];\n}\n\nexport function mapLocateResultToPixelBboxByCoordinates(\n result: LocateResultValue,\n { preparedSize }: { preparedSize: { width: number; height: number } },\n): PixelBbox {\n // The parsed result metadata decides whether this maps a bbox or expands a\n // point, and how to interpret coordinate order and normalization.\n const { width, height } = preparedSize;\n const resolvedCoordinates = result.coordinatesMeta;\n const normalizedBy = resolvedCoordinates.normalizedBy;\n assertLocateResultCoordinates(result, width, height);\n\n const xyCoordinates = reorderCoordinatesToXy(\n result.coordinates,\n resolvedCoordinates.order,\n );\n\n const xyBbox =\n xyCoordinates.length === 4\n ? xyCoordinates\n : expandPointToBbox(\n xyCoordinates[0],\n xyCoordinates[1],\n normalizedBy ?? maxPixelIndex(width),\n normalizedBy ?? maxPixelIndex(height),\n normalizedBy === undefined ? defaultBboxSize / 2 : normalizedBy / 100,\n );\n\n return normalizedBy === undefined\n ? xyBbox\n : mapNormalizedCoordinatesToPixelBbox(xyBbox, normalizedBy, width, height);\n}\n"],"names":["defaultBboxSize","resolveCoordinateLimits","result","width","height","resolvedCoordinates","normalizedBy","undefined","assertLocateResultCoordinates","limits","outOfRange","value","index","limit","Number","source","normalizedInfo","Error","JSON","reorderCoordinatesToXy","coordinates","order","top","left","bottom","right","y","x","mapLocateResultToPixelBboxByCoordinates","preparedSize","xyCoordinates","xyBbox","expandPointToBbox","maxPixelIndex","mapNormalizedCoordinatesToPixelBbox"],"mappings":";AAcA,MAAMA,kBAAkB;AAExB,SAASC,wBACPC,MAAyB,EACzBC,KAAa,EACbC,MAAc;IAEd,MAAMC,sBAAsBH,OAAO,eAAe;IAClD,MAAMI,eAAeD,oBAAoB,YAAY;IACrD,IAAIC,AAAiBC,WAAjBD,cACF,OAAOJ,OAAO,WAAW,CAAC,GAAG,CAAC,IAAMI;IAGtC,IAAID,AAA8B,WAA9BA,oBAAoB,KAAK,EAC3B,OAAOA,AAA8B,SAA9BA,oBAAoB,KAAK,GAC5B;QAACD;QAAQD;QAAOC;QAAQD;KAAM,GAC9B;QAACA;QAAOC;QAAQD;QAAOC;KAAO;IAGpC,OAAOC,AAA8B,SAA9BA,oBAAoB,KAAK,GAAY;QAACD;QAAQD;KAAM,GAAG;QAACA;QAAOC;KAAO;AAC/E;AAEA,SAASI,8BACPN,MAAyB,EACzBC,KAAa,EACbC,MAAc;IAEd,MAAMC,sBAAsBH,OAAO,eAAe;IAClD,MAAMI,eAAeD,oBAAoB,YAAY;IACrD,MAAMI,SAASR,wBAAwBC,QAAQC,OAAOC;IACtD,MAAMM,aAAaR,OAAO,WAAW,CAAC,IAAI,CAAC,CAACS,OAAOC;QACjD,MAAMC,QAAQJ,MAAM,CAACG,MAAM;QAC3B,OACE,AAAiB,YAAjB,OAAOD,SACP,CAACG,OAAO,QAAQ,CAACH,UACjBA,QAAQ,KACRA,QAAQE;IAEZ;IAEA,IAAI,CAACH,YACH;IAGF,MAAMK,SACJT,AAAiBC,WAAjBD,eACI,CAAC,qBAAqB,EAAEA,aAAa,CAAC,CAAC,GACvC,CAAC,eAAe,EAAEH,MAAM,MAAM,EAAEC,OAAO,CAAC,CAAC;IAC/C,MAAMY,iBACJV,AAAiBC,WAAjBD,eAA6B,CAAC,cAAc,EAAEA,cAAc,GAAG;IACjE,MAAM,IAAIW,MACR,CAAC,0BAA0B,EAAEC,KAAK,SAAS,CACzChB,OAAO,WAAW,EAClB,QAAQ,EAAEa,OAAO,QAAQ,EACzBV,oBAAoB,KAAK,CAC1B,OAAO,EAAEA,oBAAoB,KAAK,GAAGW,eAAe,QAAQ,EAAEE,KAAK,SAAS,CAC3ET,SACC;AAEP;AAcA,SAASU,uBACPC,WAAqC,EACrCC,KAA+C;IAE/C,IAAIA,AAAU,SAAVA,OACF,OAAOD;IAGT,IAAIA,AAAuB,MAAvBA,YAAY,MAAM,EAAQ;QAC5B,MAAM,CAACE,KAAKC,MAAMC,QAAQC,MAAM,GAAGL;QACnC,OAAO;YAACG;YAAMD;YAAKG;YAAOD;SAAO;IACnC;IAEA,MAAM,CAACE,GAAGC,EAAE,GAAGP;IACf,OAAO;QAACO;QAAGD;KAAE;AACf;AAEO,SAASE,wCACd1B,MAAyB,EACzB,EAAE2B,YAAY,EAAuD;IAIrE,MAAM,EAAE1B,KAAK,EAAEC,MAAM,EAAE,GAAGyB;IAC1B,MAAMxB,sBAAsBH,OAAO,eAAe;IAClD,MAAMI,eAAeD,oBAAoB,YAAY;IACrDG,8BAA8BN,QAAQC,OAAOC;IAE7C,MAAM0B,gBAAgBX,uBACpBjB,OAAO,WAAW,EAClBG,oBAAoB,KAAK;IAG3B,MAAM0B,SACJD,AAAyB,MAAzBA,cAAc,MAAM,GAChBA,gBACAE,kBACEF,aAAa,CAAC,EAAE,EAChBA,aAAa,CAAC,EAAE,EAChBxB,gBAAgB2B,cAAc9B,QAC9BG,gBAAgB2B,cAAc7B,SAC9BE,AAAiBC,WAAjBD,eAA6BN,kBAAkB,IAAIM,eAAe;IAG1E,OAAOA,AAAiBC,WAAjBD,eACHyB,SACAG,oCAAoCH,QAAQzB,cAAcH,OAAOC;AACvE"}
@@ -0,0 +1,110 @@
1
+ function formatLocateExampleValue(value) {
2
+ return Array.isArray(value) ? `[${value.join(', ')}]` : JSON.stringify(value);
3
+ }
4
+ function describeLocateResultCoordinates({ shape, order, normalizedBy }) {
5
+ const descriptor = 'point' === shape ? 'point' : '2d bounding box';
6
+ const coordinateDescription = void 0 !== normalizedBy ? `normalized to 0-${normalizedBy} relative to the screenshot. Do NOT use pixel coordinates or screenshot width/height` : 'in actual pixel coordinates relative to the screenshot';
7
+ if ('point' === shape) {
8
+ const orderDescription = 'yx' === order ? '[y, x]' : '[x, y]';
9
+ return `${descriptor}, should be ${orderDescription} ${coordinateDescription}.`;
10
+ }
11
+ const orderDescription = 'yx' === order ? '[ymin, xmin, ymax, xmax]' : '[xmin, ymin, xmax, ymax]';
12
+ return `${descriptor}, should be ${orderDescription} ${coordinateDescription}.`;
13
+ }
14
+ function describeLocateResultValueSchema({ shape }) {
15
+ return 'point' === shape ? '[number, number]' : '[number, number, number, number]';
16
+ }
17
+ function locateResultExampleValue(resolvedCoordinates, region) {
18
+ const [left, top, right, bottom] = region;
19
+ if ('point' === resolvedCoordinates.shape) {
20
+ const x = Math.round((left + right) / 2);
21
+ const y = Math.round((top + bottom) / 2);
22
+ return 'yx' === resolvedCoordinates.order ? [
23
+ y,
24
+ x
25
+ ] : [
26
+ x,
27
+ y
28
+ ];
29
+ }
30
+ return 'yx' === resolvedCoordinates.order ? [
31
+ top,
32
+ left,
33
+ bottom,
34
+ right
35
+ ] : region;
36
+ }
37
+ const locateResultExampleRegions = [
38
+ [
39
+ 100,
40
+ 100,
41
+ 200,
42
+ 200
43
+ ],
44
+ [
45
+ 345,
46
+ 442,
47
+ 458,
48
+ 483
49
+ ],
50
+ [
51
+ 120,
52
+ 180,
53
+ 380,
54
+ 210
55
+ ],
56
+ [
57
+ 120,
58
+ 240,
59
+ 380,
60
+ 270
61
+ ],
62
+ [
63
+ 50,
64
+ 100,
65
+ 200,
66
+ 200
67
+ ],
68
+ [
69
+ 300,
70
+ 400,
71
+ 500,
72
+ 500
73
+ ],
74
+ [
75
+ 600,
76
+ 100,
77
+ 800,
78
+ 250
79
+ ],
80
+ [
81
+ 50,
82
+ 600,
83
+ 250,
84
+ 750
85
+ ]
86
+ ];
87
+ function createExampleValues(resolvedCoordinates) {
88
+ return locateResultExampleRegions.map((region)=>locateResultExampleValue(resolvedCoordinates, region));
89
+ }
90
+ function locateResultKey({ shape }) {
91
+ return 'point' === shape ? 'point' : 'bbox';
92
+ }
93
+ function locateResultName({ shape }, { plural = false } = {}) {
94
+ return 'bbox' === shape ? plural ? 'bounding boxes' : 'bounding box' : plural ? 'points' : 'point';
95
+ }
96
+ function createLocateResultPromptSpec(resolvedCoordinates) {
97
+ return {
98
+ resultKey: locateResultKey(resolvedCoordinates),
99
+ resultValueSchema: describeLocateResultValueSchema(resolvedCoordinates),
100
+ resultValueDescription: describeLocateResultCoordinates(resolvedCoordinates),
101
+ resultNoun: locateResultName(resolvedCoordinates),
102
+ resultNounPlural: locateResultName(resolvedCoordinates, {
103
+ plural: true
104
+ }),
105
+ exampleValues: createExampleValues(resolvedCoordinates)
106
+ };
107
+ }
108
+ export { createLocateResultPromptSpec, describeLocateResultValueSchema, formatLocateExampleValue, locateResultExampleRegions, locateResultExampleValue };
109
+
110
+ //# sourceMappingURL=prompt-spec.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/prompt-spec.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/prompt-spec.ts"],"sourcesContent":["import type {\n LocateResultBbox,\n LocateResultPromptSpec,\n NonEmptyArray,\n ResolvedLocateResultCoordinates,\n} from './types';\n\nexport function formatLocateExampleValue(value: unknown): string {\n return Array.isArray(value) ? `[${value.join(', ')}]` : JSON.stringify(value);\n}\n\nfunction describeLocateResultCoordinates({\n shape,\n order,\n normalizedBy,\n}: ResolvedLocateResultCoordinates): string {\n const descriptor = shape === 'point' ? 'point' : '2d bounding box';\n const coordinateDescription =\n normalizedBy !== undefined\n ? `normalized to 0-${normalizedBy} relative to the screenshot. Do NOT use pixel coordinates or screenshot width/height`\n : 'in actual pixel coordinates relative to the screenshot';\n\n if (shape === 'point') {\n const orderDescription = order === 'yx' ? '[y, x]' : '[x, y]';\n return `${descriptor}, should be ${orderDescription} ${coordinateDescription}.`;\n }\n\n const orderDescription =\n order === 'yx' ? '[ymin, xmin, ymax, xmax]' : '[xmin, ymin, xmax, ymax]';\n return `${descriptor}, should be ${orderDescription} ${coordinateDescription}.`;\n}\n\nexport function describeLocateResultValueSchema({\n shape,\n}: ResolvedLocateResultCoordinates): string {\n return shape === 'point'\n ? '[number, number]'\n : '[number, number, number, number]';\n}\n\nexport function locateResultExampleValue(\n resolvedCoordinates: ResolvedLocateResultCoordinates,\n region: LocateResultBbox,\n): number[] {\n const [left, top, right, bottom] = region;\n if (resolvedCoordinates.shape === 'point') {\n const x = Math.round((left + right) / 2);\n const y = Math.round((top + bottom) / 2);\n return resolvedCoordinates.order === 'yx' ? [y, x] : [x, y];\n }\n return resolvedCoordinates.order === 'yx'\n ? [top, left, bottom, right]\n : region;\n}\n\n// Internal xy regions used only for prompt examples.\n// Each item is [xmin, ymin, xmax, ymax], before model-specific order mapping.\nexport const locateResultExampleRegions: LocateResultBbox[] = [\n [100, 100, 200, 200],\n [345, 442, 458, 483],\n [120, 180, 380, 210],\n [120, 240, 380, 270],\n [50, 100, 200, 200],\n [300, 400, 500, 500],\n [600, 100, 800, 250],\n [50, 600, 250, 750],\n];\n\nfunction createExampleValues(\n resolvedCoordinates: ResolvedLocateResultCoordinates,\n): NonEmptyArray<unknown> {\n return locateResultExampleRegions.map((region) =>\n locateResultExampleValue(resolvedCoordinates, region),\n ) as NonEmptyArray<unknown>;\n}\n\nfunction locateResultKey({ shape }: ResolvedLocateResultCoordinates): string {\n return shape === 'point' ? 'point' : 'bbox';\n}\n\nfunction locateResultName(\n { shape }: ResolvedLocateResultCoordinates,\n { plural = false }: { plural?: boolean } = {},\n): string {\n return shape === 'bbox'\n ? plural\n ? 'bounding boxes'\n : 'bounding box'\n : plural\n ? 'points'\n : 'point';\n}\n\nexport function createLocateResultPromptSpec(\n resolvedCoordinates: ResolvedLocateResultCoordinates,\n): LocateResultPromptSpec {\n return {\n resultKey: locateResultKey(resolvedCoordinates),\n resultValueSchema: describeLocateResultValueSchema(resolvedCoordinates),\n resultValueDescription:\n describeLocateResultCoordinates(resolvedCoordinates),\n resultNoun: locateResultName(resolvedCoordinates),\n resultNounPlural: locateResultName(resolvedCoordinates, { plural: true }),\n exampleValues: createExampleValues(resolvedCoordinates),\n };\n}\n"],"names":["formatLocateExampleValue","value","Array","JSON","describeLocateResultCoordinates","shape","order","normalizedBy","descriptor","coordinateDescription","undefined","orderDescription","describeLocateResultValueSchema","locateResultExampleValue","resolvedCoordinates","region","left","top","right","bottom","x","Math","y","locateResultExampleRegions","createExampleValues","locateResultKey","locateResultName","plural","createLocateResultPromptSpec"],"mappings":"AAOO,SAASA,yBAAyBC,KAAc;IACrD,OAAOC,MAAM,OAAO,CAACD,SAAS,CAAC,CAAC,EAAEA,MAAM,IAAI,CAAC,MAAM,CAAC,CAAC,GAAGE,KAAK,SAAS,CAACF;AACzE;AAEA,SAASG,gCAAgC,EACvCC,KAAK,EACLC,KAAK,EACLC,YAAY,EACoB;IAChC,MAAMC,aAAaH,AAAU,YAAVA,QAAoB,UAAU;IACjD,MAAMI,wBACJF,AAAiBG,WAAjBH,eACI,CAAC,gBAAgB,EAAEA,aAAa,oFAAoF,CAAC,GACrH;IAEN,IAAIF,AAAU,YAAVA,OAAmB;QACrB,MAAMM,mBAAmBL,AAAU,SAAVA,QAAiB,WAAW;QACrD,OAAO,GAAGE,WAAW,YAAY,EAAEG,iBAAiB,CAAC,EAAEF,sBAAsB,CAAC,CAAC;IACjF;IAEA,MAAME,mBACJL,AAAU,SAAVA,QAAiB,6BAA6B;IAChD,OAAO,GAAGE,WAAW,YAAY,EAAEG,iBAAiB,CAAC,EAAEF,sBAAsB,CAAC,CAAC;AACjF;AAEO,SAASG,gCAAgC,EAC9CP,KAAK,EAC2B;IAChC,OAAOA,AAAU,YAAVA,QACH,qBACA;AACN;AAEO,SAASQ,yBACdC,mBAAoD,EACpDC,MAAwB;IAExB,MAAM,CAACC,MAAMC,KAAKC,OAAOC,OAAO,GAAGJ;IACnC,IAAID,AAA8B,YAA9BA,oBAAoB,KAAK,EAAc;QACzC,MAAMM,IAAIC,KAAK,KAAK,CAAEL,AAAAA,CAAAA,OAAOE,KAAI,IAAK;QACtC,MAAMI,IAAID,KAAK,KAAK,CAAEJ,AAAAA,CAAAA,MAAME,MAAK,IAAK;QACtC,OAAOL,AAA8B,SAA9BA,oBAAoB,KAAK,GAAY;YAACQ;YAAGF;SAAE,GAAG;YAACA;YAAGE;SAAE;IAC7D;IACA,OAAOR,AAA8B,SAA9BA,oBAAoB,KAAK,GAC5B;QAACG;QAAKD;QAAMG;QAAQD;KAAM,GAC1BH;AACN;AAIO,MAAMQ,6BAAiD;IAC5D;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAI;QAAK;QAAK;KAAI;IACnB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAK;QAAK;QAAK;KAAI;IACpB;QAAC;QAAI;QAAK;QAAK;KAAI;CACpB;AAED,SAASC,oBACPV,mBAAoD;IAEpD,OAAOS,2BAA2B,GAAG,CAAC,CAACR,SACrCF,yBAAyBC,qBAAqBC;AAElD;AAEA,SAASU,gBAAgB,EAAEpB,KAAK,EAAmC;IACjE,OAAOA,AAAU,YAAVA,QAAoB,UAAU;AACvC;AAEA,SAASqB,iBACP,EAAErB,KAAK,EAAmC,EAC1C,EAAEsB,SAAS,KAAK,EAAwB,GAAG,CAAC,CAAC;IAE7C,OAAOtB,AAAU,WAAVA,QACHsB,SACE,mBACA,iBACFA,SACE,WACA;AACR;AAEO,SAASC,6BACdd,mBAAoD;IAEpD,OAAO;QACL,WAAWW,gBAAgBX;QAC3B,mBAAmBF,gCAAgCE;QACnD,wBACEV,gCAAgCU;QAClC,YAAYY,iBAAiBZ;QAC7B,kBAAkBY,iBAAiBZ,qBAAqB;YAAE,QAAQ;QAAK;QACvE,eAAeU,oBAAoBV;IACrC;AACF"}
@@ -0,0 +1,9 @@
1
+ function isBboxLocateResultValue(result) {
2
+ return 'bbox' === result.coordinatesMeta.shape;
3
+ }
4
+ function isPointLocateResultValue(result) {
5
+ return 'point' === result.coordinatesMeta.shape;
6
+ }
7
+ export { isBboxLocateResultValue, isPointLocateResultValue };
8
+
9
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/model-locate-result/types.mjs","sources":["../../../../../src/ai-model/shared/model-locate-result/types.ts"],"sourcesContent":["import type { Bbox } from '../../../types';\n\nexport type { Bbox };\nexport type LocateResultBbox = Bbox;\nexport type PixelBbox = Bbox;\nexport type NonEmptyArray<T> = [T, ...T[]];\nexport type RawLocateValue = unknown;\n\nexport type LocateResultPoint = [number, number];\nexport type PointLocateResultCoordinates = ResolvedLocateResultCoordinates & {\n shape: 'point';\n};\nexport type BboxLocateResultCoordinates = ResolvedLocateResultCoordinates & {\n shape: 'bbox';\n};\n\nexport type LocateResultValue =\n | {\n coordinates: LocateResultPoint;\n coordinatesMeta: PointLocateResultCoordinates;\n }\n | {\n coordinates: LocateResultBbox;\n coordinatesMeta: BboxLocateResultCoordinates;\n };\n\nexport type PointLocateResultValue = Extract<\n LocateResultValue,\n { coordinatesMeta: { shape: 'point' } }\n>;\nexport type BboxLocateResultValue = Extract<\n LocateResultValue,\n { coordinatesMeta: { shape: 'bbox' } }\n>;\n\nexport function isBboxLocateResultValue(\n result: LocateResultValue,\n): result is BboxLocateResultValue {\n return result.coordinatesMeta.shape === 'bbox';\n}\n\nexport function isPointLocateResultValue(\n result: LocateResultValue,\n): result is PointLocateResultValue {\n return result.coordinatesMeta.shape === 'point';\n}\n\nexport type LocateResultShape = 'bbox' | 'point';\n\nexport interface LocateResultContext {\n preparedSize: {\n width: number;\n height: number;\n };\n contentSize?: {\n width: number;\n height: number;\n };\n}\n\nexport interface LocateResultPromptSpec {\n resultKey: string;\n resultValueSchema: string;\n resultValueDescription: string;\n resultNoun: string;\n resultNounPlural: string;\n exampleValues: NonEmptyArray<unknown>;\n}\n\nexport interface LocateResultCodec {\n promptSpec: LocateResultPromptSpec;\n toPixelBbox(input: RawLocateValue, ctx: LocateResultContext): PixelBbox;\n}\n\nexport interface LocateResultCoordinates {\n shape: LocateResultShape;\n order?: 'xy' | 'yx';\n normalizedBy?: number;\n}\n\nexport type ResolvedLocateResultCoordinates =\n | {\n shape: 'point';\n order: 'xy' | 'yx';\n normalizedBy?: number;\n }\n | {\n shape: 'bbox';\n order: 'xy' | 'yx';\n normalizedBy?: number;\n };\n\nexport type RawLocateValueParser = (input: RawLocateValue) => LocateResultValue;\nexport type LocateResultPixelBboxMapper = (\n result: LocateResultValue,\n ctx: LocateResultContext,\n) => PixelBbox;\n\n/**\n * Declarative config for the standard locate workflow.\n *\n * The standard workflow has three steps:\n * 1. `coordinates` is expanded into prompt wording, a default\n * raw result parser, and a default pixel bbox mapper.\n * 2. `parseRawLocateValue` converts that raw result value into Midscene's\n * internal `LocateResultValue` shape:\n * `{ coordinates, coordinatesMeta }`. Omit it when the model returns a\n * plain numeric bbox/point matching `coordinates`; provide it when the\n * model needs repair, fallback handling, or per-result coordinate metadata.\n * 3. `mapLocateResultToPixelBbox` converts the parsed result into a pixel bbox\n * `[left, top, right, bottom]`. Omit it when `coordinates` is enough to describe\n * the coordinate system and order; provide it only for model-specific\n * conversion rules.\n *\n * This format only describes one raw coordinate value. The operation protocol\n * owns the response envelope and identifies target/reference values before the\n * runtime codec converts each value independently.\n *\n * Example 1: a GLM-like model that directly matches the standard coordinates.\n *\n * ```ts\n * resultFormat: {\n * coordinates: { shape: 'bbox', order: 'xy', normalizedBy: 1000 },\n * }\n * ```\n *\n * Example 2: Qwen 2.5 returns pixel coordinates, but may return a point-like\n * value that needs custom parsing/fallback. The default pixel bbox mapper is\n * bypassed only if custom fallback sizing is required.\n *\n * ```ts\n * resultFormat: {\n * coordinates: { shape: 'bbox', order: 'xy' },\n * parseRawLocateValue: parseQwen25RawLocateValue,\n * mapLocateResultToPixelBbox: normalizeQwen25ResultToPixelBbox,\n * }\n * ```\n *\n * Example 3: a model with a custom raw value shape can keep the standard\n * workflow while replacing parsing and mapping.\n *\n * ```ts\n * resultFormat: {\n * coordinates: { shape: 'bbox', order: 'xy' },\n * parseRawLocateValue: (raw) => ({\n * coordinates: [\n * Number((raw as any).left),\n * Number((raw as any).top),\n * Number((raw as any).right),\n * Number((raw as any).bottom),\n * ],\n * coordinatesMeta: { shape: 'bbox', order: 'xy' },\n * }),\n * mapLocateResultToPixelBbox: (result) => result.coordinates,\n * }\n * ```\n */\nexport type LocateResultFormatDefinition = {\n /**\n * Common locate result coordinates shorthand. This is the preferred config surface\n * for normal models because it keeps result type, coordinate system, and\n * coordinate order in one orthogonal field.\n */\n coordinates: LocateResultCoordinates;\n /**\n * Parses one raw coordinate value into a `LocateResultValue`. This function\n * should handle response repair, bbox-vs-point fallback, and the coordinate\n * metadata that describes the parsed coordinates.\n */\n parseRawLocateValue?: RawLocateValueParser;\n /**\n * Maps the parsed result into a pixel bbox. Most models should omit this\n * and let `coordinates` drive the default conversion. Provide it only when point\n * fallback size, clipping, or coordinate semantics are model-specific.\n */\n mapLocateResultToPixelBbox?: LocateResultPixelBboxMapper;\n};\n"],"names":["isBboxLocateResultValue","result","isPointLocateResultValue"],"mappings":"AAmCO,SAASA,wBACdC,MAAyB;IAEzB,OAAOA,AAAiC,WAAjCA,OAAO,eAAe,CAAC,KAAK;AACrC;AAEO,SAASC,yBACdD,MAAyB;IAEzB,OAAOA,AAAiC,YAAjCA,OAAO,eAAe,CAAC,KAAK;AACrC"}
@@ -0,0 +1,55 @@
1
+ import { userPromptToMultimodalPrompt, userPromptToString } from "../../common.mjs";
2
+ import { preProcessImageUrl } from "@aiscene/shared/img";
3
+ const prepareReferenceImages = async (multimodalPrompt)=>{
4
+ const referenceImages = [];
5
+ for (const image of multimodalPrompt?.images ?? [])referenceImages.push({
6
+ name: image.name,
7
+ url: await preProcessImageUrl(image.url, !!multimodalPrompt?.convertHttpImage2Base64)
8
+ });
9
+ return referenceImages;
10
+ };
11
+ const prepareUserPrompt = async (userPrompt)=>({
12
+ text: userPromptToString(userPrompt),
13
+ referenceImages: await prepareReferenceImages(userPromptToMultimodalPrompt(userPrompt))
14
+ });
15
+ const preparedReferenceImagesToChatMessages = (referenceImages)=>{
16
+ if (0 === referenceImages.length) return [];
17
+ return [
18
+ {
19
+ role: 'user',
20
+ content: [
21
+ {
22
+ type: 'text',
23
+ text: 'Next, I will provide all the reference images. These reference images are supporting context only, not the current screenshot being evaluated, unless the task explicitly asks for comparison or matching.'
24
+ }
25
+ ]
26
+ },
27
+ ...referenceImages.flatMap((image)=>[
28
+ {
29
+ role: 'user',
30
+ content: [
31
+ {
32
+ type: 'text',
33
+ text: `this is the reference image named '${image.name}'. It is a reference image, not the current screenshot:`
34
+ }
35
+ ]
36
+ },
37
+ {
38
+ role: 'user',
39
+ content: [
40
+ {
41
+ type: 'image_url',
42
+ image_url: {
43
+ url: image.url,
44
+ detail: 'high'
45
+ }
46
+ }
47
+ ]
48
+ }
49
+ ])
50
+ ];
51
+ };
52
+ const multimodalPromptToChatMessages = async (multimodalPrompt)=>preparedReferenceImagesToChatMessages(await prepareReferenceImages(multimodalPrompt));
53
+ export { multimodalPromptToChatMessages, prepareUserPrompt, preparedReferenceImagesToChatMessages };
54
+
55
+ //# sourceMappingURL=multimodal-prompt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ai-model/shared/multimodal-prompt.mjs","sources":["../../../../src/ai-model/shared/multimodal-prompt.ts"],"sourcesContent":["import {\n type TMultimodalPrompt,\n type TUserPrompt,\n userPromptToMultimodalPrompt,\n userPromptToString,\n} from '@/common';\nimport { preProcessImageUrl } from '@aiscene/shared/img';\nimport type { ChatCompletionUserMessageParam } from 'openai/resources/index';\n\nexport interface PreparedReferenceImage {\n name: string;\n url: string;\n}\n\nexport interface PreparedUserPrompt {\n text: string;\n referenceImages: PreparedReferenceImage[];\n}\n\nconst prepareReferenceImages = async (\n multimodalPrompt?: TMultimodalPrompt,\n): Promise<PreparedReferenceImage[]> => {\n const referenceImages: PreparedReferenceImage[] = [];\n for (const image of multimodalPrompt?.images ?? []) {\n referenceImages.push({\n name: image.name,\n url: await preProcessImageUrl(\n image.url,\n !!multimodalPrompt?.convertHttpImage2Base64,\n ),\n });\n }\n return referenceImages;\n};\n\nexport const prepareUserPrompt = async (\n userPrompt: TUserPrompt,\n): Promise<PreparedUserPrompt> => ({\n text: userPromptToString(userPrompt),\n referenceImages: await prepareReferenceImages(\n userPromptToMultimodalPrompt(userPrompt),\n ),\n});\n\nexport const preparedReferenceImagesToChatMessages = (\n referenceImages: PreparedReferenceImage[],\n): ChatCompletionUserMessageParam[] => {\n if (referenceImages.length === 0) {\n return [];\n }\n\n return [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Next, I will provide all the reference images. These reference images are supporting context only, not the current screenshot being evaluated, unless the task explicitly asks for comparison or matching.',\n },\n ],\n },\n ...referenceImages.flatMap((image): ChatCompletionUserMessageParam[] => [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `this is the reference image named '${image.name}'. It is a reference image, not the current screenshot:`,\n },\n ],\n },\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: image.url,\n detail: 'high',\n },\n },\n ],\n },\n ]),\n ];\n};\n\nexport const multimodalPromptToChatMessages = async (\n multimodalPrompt?: TMultimodalPrompt,\n): Promise<ChatCompletionUserMessageParam[]> =>\n preparedReferenceImagesToChatMessages(\n await prepareReferenceImages(multimodalPrompt),\n );\n"],"names":["prepareReferenceImages","multimodalPrompt","referenceImages","image","preProcessImageUrl","prepareUserPrompt","userPrompt","userPromptToString","userPromptToMultimodalPrompt","preparedReferenceImagesToChatMessages","multimodalPromptToChatMessages"],"mappings":";;AAmBA,MAAMA,yBAAyB,OAC7BC;IAEA,MAAMC,kBAA4C,EAAE;IACpD,KAAK,MAAMC,SAASF,kBAAkB,UAAU,EAAE,CAChDC,gBAAgB,IAAI,CAAC;QACnB,MAAMC,MAAM,IAAI;QAChB,KAAK,MAAMC,mBACTD,MAAM,GAAG,EACT,CAAC,CAACF,kBAAkB;IAExB;IAEF,OAAOC;AACT;AAEO,MAAMG,oBAAoB,OAC/BC,aACiC;QACjC,MAAMC,mBAAmBD;QACzB,iBAAiB,MAAMN,uBACrBQ,6BAA6BF;IAEjC;AAEO,MAAMG,wCAAwC,CACnDP;IAEA,IAAIA,AAA2B,MAA3BA,gBAAgB,MAAM,EACxB,OAAO,EAAE;IAGX,OAAO;QACL;YACE,MAAM;YACN,SAAS;gBACP;oBACE,MAAM;oBACN,MAAM;gBACR;aACD;QACH;WACGA,gBAAgB,OAAO,CAAC,CAACC,QAA4C;gBACtE;oBACE,MAAM;oBACN,SAAS;wBACP;4BACE,MAAM;4BACN,MAAM,CAAC,mCAAmC,EAAEA,MAAM,IAAI,CAAC,uDAAuD,CAAC;wBACjH;qBACD;gBACH;gBACA;oBACE,MAAM;oBACN,SAAS;wBACP;4BACE,MAAM;4BACN,WAAW;gCACT,KAAKA,MAAM,GAAG;gCACd,QAAQ;4BACV;wBACF;qBACD;gBACH;aACD;KACF;AACH;AAEO,MAAMO,iCAAiC,OAC5CT,mBAEAQ,sCACE,MAAMT,uBAAuBC"}