agent-web-interface 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (395) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +226 -0
  3. package/dist/src/browser/ensure-browser.d.ts +39 -0
  4. package/dist/src/browser/ensure-browser.d.ts.map +1 -0
  5. package/dist/src/browser/ensure-browser.js +65 -0
  6. package/dist/src/browser/ensure-browser.js.map +1 -0
  7. package/dist/src/browser/index.d.ts +8 -0
  8. package/dist/src/browser/index.d.ts.map +1 -0
  9. package/dist/src/browser/index.js +8 -0
  10. package/dist/src/browser/index.js.map +1 -0
  11. package/dist/src/browser/page-network-tracker.d.ts +96 -0
  12. package/dist/src/browser/page-network-tracker.d.ts.map +1 -0
  13. package/dist/src/browser/page-network-tracker.js +235 -0
  14. package/dist/src/browser/page-network-tracker.js.map +1 -0
  15. package/dist/src/browser/page-registry.d.ts +137 -0
  16. package/dist/src/browser/page-registry.d.ts.map +1 -0
  17. package/dist/src/browser/page-registry.js +194 -0
  18. package/dist/src/browser/page-registry.js.map +1 -0
  19. package/dist/src/browser/page-stabilization.d.ts +35 -0
  20. package/dist/src/browser/page-stabilization.d.ts.map +1 -0
  21. package/dist/src/browser/page-stabilization.js +42 -0
  22. package/dist/src/browser/page-stabilization.js.map +1 -0
  23. package/dist/src/browser/session-manager.d.ts +336 -0
  24. package/dist/src/browser/session-manager.d.ts.map +1 -0
  25. package/dist/src/browser/session-manager.js +964 -0
  26. package/dist/src/browser/session-manager.js.map +1 -0
  27. package/dist/src/cdp/cdp-client.interface.d.ts +193 -0
  28. package/dist/src/cdp/cdp-client.interface.d.ts.map +1 -0
  29. package/dist/src/cdp/cdp-client.interface.js +9 -0
  30. package/dist/src/cdp/cdp-client.interface.js.map +1 -0
  31. package/dist/src/cdp/index.d.ts +9 -0
  32. package/dist/src/cdp/index.d.ts.map +1 -0
  33. package/dist/src/cdp/index.js +8 -0
  34. package/dist/src/cdp/index.js.map +1 -0
  35. package/dist/src/cdp/puppeteer-cdp-client.d.ts +97 -0
  36. package/dist/src/cdp/puppeteer-cdp-client.d.ts.map +1 -0
  37. package/dist/src/cdp/puppeteer-cdp-client.js +273 -0
  38. package/dist/src/cdp/puppeteer-cdp-client.js.map +1 -0
  39. package/dist/src/cli/args.d.ts +35 -0
  40. package/dist/src/cli/args.d.ts.map +1 -0
  41. package/dist/src/cli/args.js +76 -0
  42. package/dist/src/cli/args.js.map +1 -0
  43. package/dist/src/delta/dom-stabilizer.d.ts +46 -0
  44. package/dist/src/delta/dom-stabilizer.d.ts.map +1 -0
  45. package/dist/src/delta/dom-stabilizer.js +121 -0
  46. package/dist/src/delta/dom-stabilizer.js.map +1 -0
  47. package/dist/src/delta/index.d.ts +8 -0
  48. package/dist/src/delta/index.d.ts.map +1 -0
  49. package/dist/src/delta/index.js +7 -0
  50. package/dist/src/delta/index.js.map +1 -0
  51. package/dist/src/factpack/action-selector.d.ts +36 -0
  52. package/dist/src/factpack/action-selector.d.ts.map +1 -0
  53. package/dist/src/factpack/action-selector.js +367 -0
  54. package/dist/src/factpack/action-selector.js.map +1 -0
  55. package/dist/src/factpack/dialog-detector.d.ts +19 -0
  56. package/dist/src/factpack/dialog-detector.d.ts.map +1 -0
  57. package/dist/src/factpack/dialog-detector.js +354 -0
  58. package/dist/src/factpack/dialog-detector.js.map +1 -0
  59. package/dist/src/factpack/form-detector.d.ts +28 -0
  60. package/dist/src/factpack/form-detector.d.ts.map +1 -0
  61. package/dist/src/factpack/form-detector.js +555 -0
  62. package/dist/src/factpack/form-detector.js.map +1 -0
  63. package/dist/src/factpack/index.d.ts +32 -0
  64. package/dist/src/factpack/index.d.ts.map +1 -0
  65. package/dist/src/factpack/index.js +73 -0
  66. package/dist/src/factpack/index.js.map +1 -0
  67. package/dist/src/factpack/page-classifier.d.ts +22 -0
  68. package/dist/src/factpack/page-classifier.d.ts.map +1 -0
  69. package/dist/src/factpack/page-classifier.js +526 -0
  70. package/dist/src/factpack/page-classifier.js.map +1 -0
  71. package/dist/src/factpack/types.d.ts +307 -0
  72. package/dist/src/factpack/types.d.ts.map +1 -0
  73. package/dist/src/factpack/types.js +12 -0
  74. package/dist/src/factpack/types.js.map +1 -0
  75. package/dist/src/form/dependency-tracker.d.ts +108 -0
  76. package/dist/src/form/dependency-tracker.d.ts.map +1 -0
  77. package/dist/src/form/dependency-tracker.js +298 -0
  78. package/dist/src/form/dependency-tracker.js.map +1 -0
  79. package/dist/src/form/field-extractor.d.ts +32 -0
  80. package/dist/src/form/field-extractor.d.ts.map +1 -0
  81. package/dist/src/form/field-extractor.js +544 -0
  82. package/dist/src/form/field-extractor.js.map +1 -0
  83. package/dist/src/form/form-detector.d.ts +103 -0
  84. package/dist/src/form/form-detector.d.ts.map +1 -0
  85. package/dist/src/form/form-detector.js +704 -0
  86. package/dist/src/form/form-detector.js.map +1 -0
  87. package/dist/src/form/form-state.d.ts +23 -0
  88. package/dist/src/form/form-state.d.ts.map +1 -0
  89. package/dist/src/form/form-state.js +39 -0
  90. package/dist/src/form/form-state.js.map +1 -0
  91. package/dist/src/form/index.d.ts +23 -0
  92. package/dist/src/form/index.d.ts.map +1 -0
  93. package/dist/src/form/index.js +27 -0
  94. package/dist/src/form/index.js.map +1 -0
  95. package/dist/src/form/runtime-value-reader.d.ts +72 -0
  96. package/dist/src/form/runtime-value-reader.d.ts.map +1 -0
  97. package/dist/src/form/runtime-value-reader.js +232 -0
  98. package/dist/src/form/runtime-value-reader.js.map +1 -0
  99. package/dist/src/form/types.d.ts +384 -0
  100. package/dist/src/form/types.d.ts.map +1 -0
  101. package/dist/src/form/types.js +17 -0
  102. package/dist/src/form/types.js.map +1 -0
  103. package/dist/src/index.d.ts +8 -0
  104. package/dist/src/index.d.ts.map +1 -0
  105. package/dist/src/index.js +212 -0
  106. package/dist/src/index.js.map +1 -0
  107. package/dist/src/lib/constants.d.ts +27 -0
  108. package/dist/src/lib/constants.d.ts.map +1 -0
  109. package/dist/src/lib/constants.js +63 -0
  110. package/dist/src/lib/constants.js.map +1 -0
  111. package/dist/src/lib/index.d.ts +12 -0
  112. package/dist/src/lib/index.d.ts.map +1 -0
  113. package/dist/src/lib/index.js +17 -0
  114. package/dist/src/lib/index.js.map +1 -0
  115. package/dist/src/lib/regions.d.ts +29 -0
  116. package/dist/src/lib/regions.d.ts.map +1 -0
  117. package/dist/src/lib/regions.js +93 -0
  118. package/dist/src/lib/regions.js.map +1 -0
  119. package/dist/src/lib/scoring.d.ts +47 -0
  120. package/dist/src/lib/scoring.d.ts.map +1 -0
  121. package/dist/src/lib/scoring.js +79 -0
  122. package/dist/src/lib/scoring.js.map +1 -0
  123. package/dist/src/lib/selectors.d.ts +42 -0
  124. package/dist/src/lib/selectors.d.ts.map +1 -0
  125. package/dist/src/lib/selectors.js +138 -0
  126. package/dist/src/lib/selectors.js.map +1 -0
  127. package/dist/src/lib/text-utils.d.ts +155 -0
  128. package/dist/src/lib/text-utils.d.ts.map +1 -0
  129. package/dist/src/lib/text-utils.js +391 -0
  130. package/dist/src/lib/text-utils.js.map +1 -0
  131. package/dist/src/observation/eid-linker.d.ts +104 -0
  132. package/dist/src/observation/eid-linker.d.ts.map +1 -0
  133. package/dist/src/observation/eid-linker.js +403 -0
  134. package/dist/src/observation/eid-linker.js.map +1 -0
  135. package/dist/src/observation/index.d.ts +12 -0
  136. package/dist/src/observation/index.d.ts.map +1 -0
  137. package/dist/src/observation/index.js +15 -0
  138. package/dist/src/observation/index.js.map +1 -0
  139. package/dist/src/observation/observation-accumulator.d.ts +58 -0
  140. package/dist/src/observation/observation-accumulator.d.ts.map +1 -0
  141. package/dist/src/observation/observation-accumulator.js +213 -0
  142. package/dist/src/observation/observation-accumulator.js.map +1 -0
  143. package/dist/src/observation/observation.types.d.ts +139 -0
  144. package/dist/src/observation/observation.types.d.ts.map +1 -0
  145. package/dist/src/observation/observation.types.js +59 -0
  146. package/dist/src/observation/observation.types.js.map +1 -0
  147. package/dist/src/observation/observer-script.d.ts +19 -0
  148. package/dist/src/observation/observer-script.d.ts.map +1 -0
  149. package/dist/src/observation/observer-script.js +569 -0
  150. package/dist/src/observation/observer-script.js.map +1 -0
  151. package/dist/src/query/index.d.ts +9 -0
  152. package/dist/src/query/index.d.ts.map +1 -0
  153. package/dist/src/query/index.js +10 -0
  154. package/dist/src/query/index.js.map +1 -0
  155. package/dist/src/query/query-engine.d.ts +111 -0
  156. package/dist/src/query/query-engine.d.ts.map +1 -0
  157. package/dist/src/query/query-engine.js +509 -0
  158. package/dist/src/query/query-engine.js.map +1 -0
  159. package/dist/src/query/types/index.d.ts +5 -0
  160. package/dist/src/query/types/index.d.ts.map +1 -0
  161. package/dist/src/query/types/index.js +5 -0
  162. package/dist/src/query/types/index.js.map +1 -0
  163. package/dist/src/query/types/query.types.d.ts +141 -0
  164. package/dist/src/query/types/query.types.d.ts.map +1 -0
  165. package/dist/src/query/types/query.types.js +19 -0
  166. package/dist/src/query/types/query.types.js.map +1 -0
  167. package/dist/src/renderer/budget-manager.d.ts +46 -0
  168. package/dist/src/renderer/budget-manager.d.ts.map +1 -0
  169. package/dist/src/renderer/budget-manager.js +133 -0
  170. package/dist/src/renderer/budget-manager.js.map +1 -0
  171. package/dist/src/renderer/constants.d.ts +38 -0
  172. package/dist/src/renderer/constants.d.ts.map +1 -0
  173. package/dist/src/renderer/constants.js +29 -0
  174. package/dist/src/renderer/constants.js.map +1 -0
  175. package/dist/src/renderer/index.d.ts +12 -0
  176. package/dist/src/renderer/index.d.ts.map +1 -0
  177. package/dist/src/renderer/index.js +16 -0
  178. package/dist/src/renderer/index.js.map +1 -0
  179. package/dist/src/renderer/section-renderers.d.ts +42 -0
  180. package/dist/src/renderer/section-renderers.d.ts.map +1 -0
  181. package/dist/src/renderer/section-renderers.js +252 -0
  182. package/dist/src/renderer/section-renderers.js.map +1 -0
  183. package/dist/src/renderer/token-counter.d.ts +45 -0
  184. package/dist/src/renderer/token-counter.d.ts.map +1 -0
  185. package/dist/src/renderer/token-counter.js +65 -0
  186. package/dist/src/renderer/token-counter.js.map +1 -0
  187. package/dist/src/renderer/types.d.ts +71 -0
  188. package/dist/src/renderer/types.d.ts.map +1 -0
  189. package/dist/src/renderer/types.js +7 -0
  190. package/dist/src/renderer/types.js.map +1 -0
  191. package/dist/src/renderer/xml-renderer.d.ts +42 -0
  192. package/dist/src/renderer/xml-renderer.d.ts.map +1 -0
  193. package/dist/src/renderer/xml-renderer.js +103 -0
  194. package/dist/src/renderer/xml-renderer.js.map +1 -0
  195. package/dist/src/server/index.d.ts +8 -0
  196. package/dist/src/server/index.d.ts.map +1 -0
  197. package/dist/src/server/index.js +8 -0
  198. package/dist/src/server/index.js.map +1 -0
  199. package/dist/src/server/mcp-server.d.ts +59 -0
  200. package/dist/src/server/mcp-server.d.ts.map +1 -0
  201. package/dist/src/server/mcp-server.js +140 -0
  202. package/dist/src/server/mcp-server.js.map +1 -0
  203. package/dist/src/server/server-config.d.ts +41 -0
  204. package/dist/src/server/server-config.d.ts.map +1 -0
  205. package/dist/src/server/server-config.js +80 -0
  206. package/dist/src/server/server-config.js.map +1 -0
  207. package/dist/src/server/session-store.d.ts +148 -0
  208. package/dist/src/server/session-store.d.ts.map +1 -0
  209. package/dist/src/server/session-store.js +224 -0
  210. package/dist/src/server/session-store.js.map +1 -0
  211. package/dist/src/shared/errors/browser-session.error.d.ts +102 -0
  212. package/dist/src/shared/errors/browser-session.error.d.ts.map +1 -0
  213. package/dist/src/shared/errors/browser-session.error.js +153 -0
  214. package/dist/src/shared/errors/browser-session.error.js.map +1 -0
  215. package/dist/src/shared/errors/index.d.ts +5 -0
  216. package/dist/src/shared/errors/index.d.ts.map +1 -0
  217. package/dist/src/shared/errors/index.js +5 -0
  218. package/dist/src/shared/errors/index.js.map +1 -0
  219. package/dist/src/shared/services/dom-transformer.service.d.ts +71 -0
  220. package/dist/src/shared/services/dom-transformer.service.d.ts.map +1 -0
  221. package/dist/src/shared/services/dom-transformer.service.js +190 -0
  222. package/dist/src/shared/services/dom-transformer.service.js.map +1 -0
  223. package/dist/src/shared/services/index.d.ts +7 -0
  224. package/dist/src/shared/services/index.d.ts.map +1 -0
  225. package/dist/src/shared/services/index.js +7 -0
  226. package/dist/src/shared/services/index.js.map +1 -0
  227. package/dist/src/shared/services/logging.service.d.ts +154 -0
  228. package/dist/src/shared/services/logging.service.d.ts.map +1 -0
  229. package/dist/src/shared/services/logging.service.js +267 -0
  230. package/dist/src/shared/services/logging.service.js.map +1 -0
  231. package/dist/src/shared/services/selector-builder.service.d.ts +53 -0
  232. package/dist/src/shared/services/selector-builder.service.d.ts.map +1 -0
  233. package/dist/src/shared/services/selector-builder.service.js +240 -0
  234. package/dist/src/shared/services/selector-builder.service.js.map +1 -0
  235. package/dist/src/shared/types/base.types.d.ts +45 -0
  236. package/dist/src/shared/types/base.types.d.ts.map +1 -0
  237. package/dist/src/shared/types/base.types.js +8 -0
  238. package/dist/src/shared/types/base.types.js.map +1 -0
  239. package/dist/src/shared/types/index.d.ts +5 -0
  240. package/dist/src/shared/types/index.d.ts.map +1 -0
  241. package/dist/src/shared/types/index.js +5 -0
  242. package/dist/src/shared/types/index.js.map +1 -0
  243. package/dist/src/snapshot/element-resolver.d.ts +102 -0
  244. package/dist/src/snapshot/element-resolver.d.ts.map +1 -0
  245. package/dist/src/snapshot/element-resolver.js +379 -0
  246. package/dist/src/snapshot/element-resolver.js.map +1 -0
  247. package/dist/src/snapshot/extractors/attribute-extractor.d.ts +40 -0
  248. package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -0
  249. package/dist/src/snapshot/extractors/attribute-extractor.js +237 -0
  250. package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -0
  251. package/dist/src/snapshot/extractors/ax-extractor.d.ts +36 -0
  252. package/dist/src/snapshot/extractors/ax-extractor.d.ts.map +1 -0
  253. package/dist/src/snapshot/extractors/ax-extractor.js +144 -0
  254. package/dist/src/snapshot/extractors/ax-extractor.js.map +1 -0
  255. package/dist/src/snapshot/extractors/dom-extractor.d.ts +21 -0
  256. package/dist/src/snapshot/extractors/dom-extractor.d.ts.map +1 -0
  257. package/dist/src/snapshot/extractors/dom-extractor.js +137 -0
  258. package/dist/src/snapshot/extractors/dom-extractor.js.map +1 -0
  259. package/dist/src/snapshot/extractors/grouping-resolver.d.ts +39 -0
  260. package/dist/src/snapshot/extractors/grouping-resolver.d.ts.map +1 -0
  261. package/dist/src/snapshot/extractors/grouping-resolver.js +260 -0
  262. package/dist/src/snapshot/extractors/grouping-resolver.js.map +1 -0
  263. package/dist/src/snapshot/extractors/index.d.ts +19 -0
  264. package/dist/src/snapshot/extractors/index.d.ts.map +1 -0
  265. package/dist/src/snapshot/extractors/index.js +27 -0
  266. package/dist/src/snapshot/extractors/index.js.map +1 -0
  267. package/dist/src/snapshot/extractors/label-resolver.d.ts +44 -0
  268. package/dist/src/snapshot/extractors/label-resolver.d.ts.map +1 -0
  269. package/dist/src/snapshot/extractors/label-resolver.js +173 -0
  270. package/dist/src/snapshot/extractors/label-resolver.js.map +1 -0
  271. package/dist/src/snapshot/extractors/layout-extractor.d.ts +52 -0
  272. package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -0
  273. package/dist/src/snapshot/extractors/layout-extractor.js +382 -0
  274. package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -0
  275. package/dist/src/snapshot/extractors/locator-builder.d.ts +27 -0
  276. package/dist/src/snapshot/extractors/locator-builder.d.ts.map +1 -0
  277. package/dist/src/snapshot/extractors/locator-builder.js +223 -0
  278. package/dist/src/snapshot/extractors/locator-builder.js.map +1 -0
  279. package/dist/src/snapshot/extractors/region-resolver.d.ts +31 -0
  280. package/dist/src/snapshot/extractors/region-resolver.d.ts.map +1 -0
  281. package/dist/src/snapshot/extractors/region-resolver.js +168 -0
  282. package/dist/src/snapshot/extractors/region-resolver.js.map +1 -0
  283. package/dist/src/snapshot/extractors/state-extractor.d.ts +30 -0
  284. package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -0
  285. package/dist/src/snapshot/extractors/state-extractor.js +181 -0
  286. package/dist/src/snapshot/extractors/state-extractor.js.map +1 -0
  287. package/dist/src/snapshot/extractors/types.d.ts +213 -0
  288. package/dist/src/snapshot/extractors/types.d.ts.map +1 -0
  289. package/dist/src/snapshot/extractors/types.js +145 -0
  290. package/dist/src/snapshot/extractors/types.js.map +1 -0
  291. package/dist/src/snapshot/index.d.ts +14 -0
  292. package/dist/src/snapshot/index.d.ts.map +1 -0
  293. package/dist/src/snapshot/index.js +18 -0
  294. package/dist/src/snapshot/index.js.map +1 -0
  295. package/dist/src/snapshot/snapshot-compiler.d.ts +73 -0
  296. package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -0
  297. package/dist/src/snapshot/snapshot-compiler.js +763 -0
  298. package/dist/src/snapshot/snapshot-compiler.js.map +1 -0
  299. package/dist/src/snapshot/snapshot-health.d.ts +97 -0
  300. package/dist/src/snapshot/snapshot-health.d.ts.map +1 -0
  301. package/dist/src/snapshot/snapshot-health.js +214 -0
  302. package/dist/src/snapshot/snapshot-health.js.map +1 -0
  303. package/dist/src/snapshot/snapshot-store.d.ts +137 -0
  304. package/dist/src/snapshot/snapshot-store.d.ts.map +1 -0
  305. package/dist/src/snapshot/snapshot-store.js +202 -0
  306. package/dist/src/snapshot/snapshot-store.js.map +1 -0
  307. package/dist/src/snapshot/snapshot.types.d.ts +250 -0
  308. package/dist/src/snapshot/snapshot.types.d.ts.map +1 -0
  309. package/dist/src/snapshot/snapshot.types.js +54 -0
  310. package/dist/src/snapshot/snapshot.types.js.map +1 -0
  311. package/dist/src/state/actionables-filter.d.ts +47 -0
  312. package/dist/src/state/actionables-filter.d.ts.map +1 -0
  313. package/dist/src/state/actionables-filter.js +173 -0
  314. package/dist/src/state/actionables-filter.js.map +1 -0
  315. package/dist/src/state/atoms-extractor.d.ts +23 -0
  316. package/dist/src/state/atoms-extractor.d.ts.map +1 -0
  317. package/dist/src/state/atoms-extractor.js +160 -0
  318. package/dist/src/state/atoms-extractor.js.map +1 -0
  319. package/dist/src/state/constants.d.ts +125 -0
  320. package/dist/src/state/constants.d.ts.map +1 -0
  321. package/dist/src/state/constants.js +131 -0
  322. package/dist/src/state/constants.js.map +1 -0
  323. package/dist/src/state/diff-engine.d.ts +23 -0
  324. package/dist/src/state/diff-engine.d.ts.map +1 -0
  325. package/dist/src/state/diff-engine.js +475 -0
  326. package/dist/src/state/diff-engine.js.map +1 -0
  327. package/dist/src/state/element-identity.d.ts +75 -0
  328. package/dist/src/state/element-identity.d.ts.map +1 -0
  329. package/dist/src/state/element-identity.js +129 -0
  330. package/dist/src/state/element-identity.js.map +1 -0
  331. package/dist/src/state/element-ref.types.d.ts +135 -0
  332. package/dist/src/state/element-ref.types.d.ts.map +1 -0
  333. package/dist/src/state/element-ref.types.js +13 -0
  334. package/dist/src/state/element-ref.types.js.map +1 -0
  335. package/dist/src/state/element-registry.d.ts +118 -0
  336. package/dist/src/state/element-registry.d.ts.map +1 -0
  337. package/dist/src/state/element-registry.js +222 -0
  338. package/dist/src/state/element-registry.js.map +1 -0
  339. package/dist/src/state/health.types.d.ts +93 -0
  340. package/dist/src/state/health.types.d.ts.map +1 -0
  341. package/dist/src/state/health.types.js +56 -0
  342. package/dist/src/state/health.types.js.map +1 -0
  343. package/dist/src/state/layer-detector.d.ts +23 -0
  344. package/dist/src/state/layer-detector.d.ts.map +1 -0
  345. package/dist/src/state/layer-detector.js +368 -0
  346. package/dist/src/state/layer-detector.js.map +1 -0
  347. package/dist/src/state/locator-generator.d.ts +21 -0
  348. package/dist/src/state/locator-generator.d.ts.map +1 -0
  349. package/dist/src/state/locator-generator.js +137 -0
  350. package/dist/src/state/locator-generator.js.map +1 -0
  351. package/dist/src/state/state-manager.d.ts +104 -0
  352. package/dist/src/state/state-manager.d.ts.map +1 -0
  353. package/dist/src/state/state-manager.js +618 -0
  354. package/dist/src/state/state-manager.js.map +1 -0
  355. package/dist/src/state/state-renderer.d.ts +63 -0
  356. package/dist/src/state/state-renderer.d.ts.map +1 -0
  357. package/dist/src/state/state-renderer.js +340 -0
  358. package/dist/src/state/state-renderer.js.map +1 -0
  359. package/dist/src/state/types.d.ts +353 -0
  360. package/dist/src/state/types.d.ts.map +1 -0
  361. package/dist/src/state/types.js +8 -0
  362. package/dist/src/state/types.js.map +1 -0
  363. package/dist/src/tools/browser-tools.d.ts +140 -0
  364. package/dist/src/tools/browser-tools.d.ts.map +1 -0
  365. package/dist/src/tools/browser-tools.js +657 -0
  366. package/dist/src/tools/browser-tools.js.map +1 -0
  367. package/dist/src/tools/errors.d.ts +63 -0
  368. package/dist/src/tools/errors.d.ts.map +1 -0
  369. package/dist/src/tools/errors.js +86 -0
  370. package/dist/src/tools/errors.js.map +1 -0
  371. package/dist/src/tools/execute-action.d.ts +135 -0
  372. package/dist/src/tools/execute-action.d.ts.map +1 -0
  373. package/dist/src/tools/execute-action.js +579 -0
  374. package/dist/src/tools/execute-action.js.map +1 -0
  375. package/dist/src/tools/form-tools.d.ts +109 -0
  376. package/dist/src/tools/form-tools.d.ts.map +1 -0
  377. package/dist/src/tools/form-tools.js +434 -0
  378. package/dist/src/tools/form-tools.js.map +1 -0
  379. package/dist/src/tools/index.d.ts +11 -0
  380. package/dist/src/tools/index.d.ts.map +1 -0
  381. package/dist/src/tools/index.js +49 -0
  382. package/dist/src/tools/index.js.map +1 -0
  383. package/dist/src/tools/response-builder.d.ts +98 -0
  384. package/dist/src/tools/response-builder.d.ts.map +1 -0
  385. package/dist/src/tools/response-builder.js +219 -0
  386. package/dist/src/tools/response-builder.js.map +1 -0
  387. package/dist/src/tools/tool-schemas.d.ts +2482 -0
  388. package/dist/src/tools/tool-schemas.d.ts.map +1 -0
  389. package/dist/src/tools/tool-schemas.js +606 -0
  390. package/dist/src/tools/tool-schemas.js.map +1 -0
  391. package/dist/vitest.config.d.ts +3 -0
  392. package/dist/vitest.config.d.ts.map +1 -0
  393. package/dist/vitest.config.js +16 -0
  394. package/dist/vitest.config.js.map +1 -0
  395. package/package.json +76 -0
@@ -0,0 +1,657 @@
1
+ /**
2
+ * Browser Tools
3
+ *
4
+ * MCP tool handlers for browser automation.
5
+ */
6
+ import { SnapshotStore, clickByBackendNodeId, typeByBackendNodeId, pressKey, selectOption, hoverByBackendNodeId, scrollIntoView, scrollPage as scrollPageByAmount, } from '../snapshot/index.js';
7
+ import { observationAccumulator } from '../observation/index.js';
8
+ import { ATTACHMENT_SIGNIFICANCE_THRESHOLD } from '../observation/observation.types.js';
9
+ import { ClosePageInputSchema, CloseSessionInputSchema, NavigateInputSchema, GoBackInputSchema, GoForwardInputSchema, ReloadInputSchema, CaptureSnapshotInputSchema, FindElementsInputSchema, GetNodeDetailsInputSchema, ScrollElementIntoViewInputSchema, ScrollPageInputSchema, ClickInputSchema, TypeInputSchema, PressInputSchema, SelectInputSchema, HoverInputSchema, } from './tool-schemas.js';
10
+ import { QueryEngine } from '../query/query-engine.js';
11
+ import { isReadableNode, isStructuralNode } from '../snapshot/snapshot.types.js';
12
+ import { computeEid } from '../state/element-identity.js';
13
+ import { captureWithStabilization, determineHealthCode, } from '../snapshot/snapshot-health.js';
14
+ import { executeAction, executeActionWithRetry, executeActionWithOutcome, stabilizeAfterNavigation, getStateManager, removeStateManager, clearAllStateManagers, } from './execute-action.js';
15
+ import { createHealthyRuntime, createRecoveredCdpRuntime } from '../state/health.types.js';
16
+ import { buildClosePageResponse, buildCloseSessionResponse, buildListPagesResponse, buildFindElementsResponse, buildGetElementDetailsResponse, } from './response-builder.js';
17
+ import { ElementNotFoundError, StaleElementError, SnapshotRequiredError } from './errors.js';
18
+ import { getDependencyTracker } from '../form/index.js';
19
+ // Module-level state
20
+ let sessionManager = null;
21
+ const snapshotStore = new SnapshotStore();
22
+ /**
23
+ * Initialize tools with a session manager instance.
24
+ * Must be called before using any tool handlers.
25
+ *
26
+ * @param manager - SessionManager instance
27
+ */
28
+ export function initializeTools(manager) {
29
+ sessionManager = manager;
30
+ }
31
+ /**
32
+ * Get the session manager, throwing if not initialized.
33
+ */
34
+ function getSessionManager() {
35
+ if (!sessionManager) {
36
+ throw new Error('Tools not initialized. Call initializeTools() first.');
37
+ }
38
+ return sessionManager;
39
+ }
40
+ /**
41
+ * Get the snapshot store.
42
+ */
43
+ export function getSnapshotStore() {
44
+ return snapshotStore;
45
+ }
46
+ /**
47
+ * Resolve page_id to a PageHandle, throwing if not found.
48
+ * Also touches the page to mark it as MRU.
49
+ *
50
+ * @param session - SessionManager instance
51
+ * @param page_id - Optional page identifier
52
+ * @returns PageHandle for the resolved page
53
+ * @throws Error if no page available
54
+ */
55
+ function resolveExistingPage(session, page_id) {
56
+ const handle = session.resolvePage(page_id);
57
+ if (!handle) {
58
+ if (page_id) {
59
+ throw new Error(`Page not found: ${page_id}`);
60
+ }
61
+ else {
62
+ throw new Error('No page available. Navigate to a URL first.');
63
+ }
64
+ }
65
+ session.touchPage(handle.page_id);
66
+ return handle;
67
+ }
68
+ /**
69
+ * Ensure CDP session is healthy, attempting repair if needed.
70
+ *
71
+ * Call this before any CDP operation to auto-repair dead sessions.
72
+ *
73
+ * @param session - SessionManager instance
74
+ * @param handle - Current page handle
75
+ * @returns Updated handle (may be same or new if recovered) and recovery status
76
+ */
77
+ async function ensureCdpSession(session, handle) {
78
+ // Fast path: CDP is active and responds to a lightweight probe
79
+ if (handle.cdp.isActive()) {
80
+ try {
81
+ await handle.cdp.send('Page.getFrameTree', undefined);
82
+ return { handle, recovered: false, runtime_health: createHealthyRuntime() };
83
+ }
84
+ catch (err) {
85
+ const message = err instanceof Error ? err.message : String(err);
86
+ console.warn(`[RECOVERY] CDP probe failed for ${handle.page_id}: ${message}. Attempting rebind`);
87
+ }
88
+ }
89
+ // Slow path: CDP needs repair
90
+ console.warn(`[RECOVERY] CDP session dead for ${handle.page_id}, attempting rebind`);
91
+ const newHandle = await session.rebindCdpSession(handle.page_id);
92
+ return {
93
+ handle: newHandle,
94
+ recovered: true,
95
+ runtime_health: createRecoveredCdpRuntime('HEALTHY'),
96
+ };
97
+ }
98
+ /**
99
+ * Build runtime health details from a capture attempt.
100
+ */
101
+ function buildRuntimeHealth(cdpHealth, result) {
102
+ const code = determineHealthCode(result);
103
+ return {
104
+ cdp: cdpHealth,
105
+ snapshot: {
106
+ ok: code === 'HEALTHY',
107
+ code,
108
+ attempts: result.attempts,
109
+ message: result.health.message,
110
+ },
111
+ };
112
+ }
113
+ /**
114
+ * Capture a snapshot with stabilization and CDP recovery when empty.
115
+ */
116
+ async function captureSnapshotWithRecovery(session, handle, pageId) {
117
+ const ensureResult = await ensureCdpSession(session, handle);
118
+ handle = ensureResult.handle;
119
+ let result = await captureWithStabilization(handle.cdp, handle.page, pageId);
120
+ let runtime_health = buildRuntimeHealth(ensureResult.runtime_health.cdp, result);
121
+ if (!result.health.valid) {
122
+ const healthCode = determineHealthCode(result);
123
+ console.warn(`[RECOVERY] Empty snapshot for ${pageId} (${healthCode}); rebinding CDP session`);
124
+ handle = await session.rebindCdpSession(pageId);
125
+ result = await captureWithStabilization(handle.cdp, handle.page, pageId, { maxRetries: 1 });
126
+ runtime_health = buildRuntimeHealth({ ok: true, recovered: true, recovery_method: 'rebind' }, result);
127
+ }
128
+ return { snapshot: result.snapshot, handle, runtime_health };
129
+ }
130
+ /**
131
+ * Create a capture function that keeps the handle updated after recovery.
132
+ */
133
+ function createActionCapture(session, handleRef, pageId) {
134
+ return async () => {
135
+ const captureResult = await captureSnapshotWithRecovery(session, handleRef.current, pageId);
136
+ handleRef.current = captureResult.handle;
137
+ return {
138
+ snapshot: captureResult.snapshot,
139
+ runtime_health: captureResult.runtime_health,
140
+ };
141
+ };
142
+ }
143
+ /**
144
+ * Prepare context for action execution.
145
+ * Resolves page, ensures CDP session health, and creates capture function.
146
+ *
147
+ * @param pageId - Optional page ID to resolve
148
+ * @returns Action context with handle, capture function, and session
149
+ */
150
+ async function prepareActionContext(pageId) {
151
+ const session = getSessionManager();
152
+ const handleRef = { current: resolveExistingPage(session, pageId) };
153
+ const resolvedPageId = handleRef.current.page_id;
154
+ handleRef.current = (await ensureCdpSession(session, handleRef.current)).handle;
155
+ const captureSnapshot = createActionCapture(session, handleRef, resolvedPageId);
156
+ return { handleRef, pageId: resolvedPageId, captureSnapshot, session };
157
+ }
158
+ /**
159
+ * Resolve element by eid for action tools.
160
+ * Looks up element in registry and finds corresponding node in snapshot.
161
+ * Includes proactive staleness detection before CDP interaction.
162
+ *
163
+ * @param pageId - Page ID for registry lookup
164
+ * @param eid - Element ID to resolve
165
+ * @param snapshot - Current snapshot to search
166
+ * @returns Resolved node from snapshot
167
+ * @throws {ElementNotFoundError} If eid not found in registry
168
+ * @throws {StaleElementError} If eid reference is stale or element not in current snapshot
169
+ */
170
+ function resolveElementByEid(pageId, eid, snapshot) {
171
+ const stateManager = getStateManager(pageId);
172
+ const registry = stateManager.getElementRegistry();
173
+ const elementRef = registry.getByEid(eid);
174
+ if (!elementRef) {
175
+ throw new ElementNotFoundError(eid);
176
+ }
177
+ // Proactive staleness check - detect stale elements before CDP interaction
178
+ // This catches elements that haven't been seen in recent snapshots
179
+ if (registry.isStale(eid)) {
180
+ throw new StaleElementError(eid);
181
+ }
182
+ const node = snapshot.nodes.find((n) => n.backend_node_id === elementRef.ref.backend_node_id);
183
+ if (!node) {
184
+ throw new StaleElementError(eid);
185
+ }
186
+ return node;
187
+ }
188
+ /**
189
+ * Require snapshot for action, throwing consistent error if missing.
190
+ *
191
+ * @param pageId - Page ID to look up snapshot
192
+ * @returns Snapshot for the page
193
+ * @throws {SnapshotRequiredError} If no snapshot exists
194
+ */
195
+ function requireSnapshot(pageId) {
196
+ const snap = snapshotStore.getByPageId(pageId);
197
+ if (!snap) {
198
+ throw new SnapshotRequiredError(pageId);
199
+ }
200
+ return snap;
201
+ }
202
+ /**
203
+ * Execute a navigation action with snapshot capture.
204
+ * Consolidates goBack, goForward, and reload handlers.
205
+ *
206
+ * Waits for both DOM stabilization and network idle after navigation
207
+ * to ensure the page is fully loaded before capturing snapshot.
208
+ *
209
+ * @param pageId - Optional page ID
210
+ * @param action - Navigation action to execute
211
+ * @returns State response after navigation
212
+ */
213
+ async function executeNavigationAction(pageId, action) {
214
+ const session = getSessionManager();
215
+ let handle = await session.resolvePageOrCreate(pageId);
216
+ const page_id = handle.page_id;
217
+ session.touchPage(page_id);
218
+ // Clear dependency tracker before navigation (old dependencies no longer valid)
219
+ getDependencyTracker().clearPage(page_id);
220
+ // Execute navigation
221
+ switch (action) {
222
+ case 'back':
223
+ await handle.page.goBack();
224
+ break;
225
+ case 'forward':
226
+ await handle.page.goForward();
227
+ break;
228
+ case 'reload':
229
+ await handle.page.reload();
230
+ break;
231
+ }
232
+ // Wait for page to stabilize (DOM + network idle)
233
+ await stabilizeAfterNavigation(handle.page);
234
+ // Re-inject observation accumulator (new document context after navigation)
235
+ await observationAccumulator.inject(handle.page);
236
+ // Auto-capture snapshot after navigation
237
+ const captureResult = await captureSnapshotWithRecovery(session, handle, page_id);
238
+ handle = captureResult.handle;
239
+ const snapshot = captureResult.snapshot;
240
+ snapshotStore.store(page_id, snapshot);
241
+ // Return XML state response (trimmed for navigation snapshots)
242
+ const stateManager = getStateManager(page_id);
243
+ return stateManager.generateResponse(snapshot, { trimRegions: true });
244
+ }
245
+ // ============================================================================
246
+ // SIMPLIFIED API - Tool handlers with clearer contracts
247
+ // ============================================================================
248
+ /**
249
+ * List all open browser pages with their metadata.
250
+ *
251
+ * Syncs with browser context to ensure all tabs are registered,
252
+ * including tabs opened externally or after reconnection.
253
+ *
254
+ * @returns XML result with page list
255
+ */
256
+ export async function listPages() {
257
+ const session = getSessionManager();
258
+ // Sync to pick up any unregistered browser tabs
259
+ const pages = await session.syncPages();
260
+ const pageInfos = pages.map((h) => ({
261
+ page_id: h.page_id,
262
+ url: h.url ?? '',
263
+ title: h.title ?? '',
264
+ }));
265
+ return buildListPagesResponse(pageInfos);
266
+ }
267
+ /**
268
+ * Close a specific page.
269
+ *
270
+ * @param rawInput - Close options (will be validated)
271
+ * @returns Close result
272
+ */
273
+ export async function closePage(rawInput) {
274
+ const input = ClosePageInputSchema.parse(rawInput);
275
+ const session = getSessionManager();
276
+ await session.closePage(input.page_id);
277
+ snapshotStore.removeByPageId(input.page_id);
278
+ removeStateManager(input.page_id); // Clean up state manager
279
+ getDependencyTracker().clearPage(input.page_id); // Clean up dependencies
280
+ return buildClosePageResponse(input.page_id);
281
+ }
282
+ /**
283
+ * Close the entire browser session.
284
+ *
285
+ * @param rawInput - Close options (will be validated)
286
+ * @returns Close result
287
+ */
288
+ export async function closeSession(rawInput) {
289
+ CloseSessionInputSchema.parse(rawInput);
290
+ const session = getSessionManager();
291
+ await session.shutdown();
292
+ snapshotStore.clear();
293
+ clearAllStateManagers(); // Clean up all state managers
294
+ getDependencyTracker().clearAll(); // Clean up all dependencies
295
+ return buildCloseSessionResponse();
296
+ }
297
+ /**
298
+ * Navigate to a URL.
299
+ *
300
+ * @param rawInput - Navigation options (will be validated)
301
+ * @returns Navigation result with snapshot data
302
+ */
303
+ export async function navigate(rawInput) {
304
+ const input = NavigateInputSchema.parse(rawInput);
305
+ const session = getSessionManager();
306
+ let handle = await session.resolvePageOrCreate(input.page_id);
307
+ const page_id = handle.page_id;
308
+ session.touchPage(page_id);
309
+ // Clear dependency tracker before navigation (old dependencies no longer valid)
310
+ getDependencyTracker().clearPage(page_id);
311
+ await session.navigateTo(page_id, input.url);
312
+ // Auto-capture snapshot after navigation
313
+ const captureResult = await captureSnapshotWithRecovery(session, handle, page_id);
314
+ handle = captureResult.handle;
315
+ const snapshot = captureResult.snapshot;
316
+ snapshotStore.store(page_id, snapshot);
317
+ // Return XML state response directly (trimmed for navigation snapshots)
318
+ const stateManager = getStateManager(page_id);
319
+ return stateManager.generateResponse(snapshot, { trimRegions: true });
320
+ }
321
+ /**
322
+ * Go back in browser history.
323
+ *
324
+ * @param rawInput - Navigation options (will be validated)
325
+ * @returns Navigation result with snapshot data
326
+ */
327
+ export async function goBack(rawInput) {
328
+ const input = GoBackInputSchema.parse(rawInput);
329
+ return executeNavigationAction(input.page_id, 'back');
330
+ }
331
+ /**
332
+ * Go forward in browser history.
333
+ *
334
+ * @param rawInput - Navigation options (will be validated)
335
+ * @returns Navigation result with snapshot data
336
+ */
337
+ export async function goForward(rawInput) {
338
+ const input = GoForwardInputSchema.parse(rawInput);
339
+ return executeNavigationAction(input.page_id, 'forward');
340
+ }
341
+ /**
342
+ * Reload the current page.
343
+ *
344
+ * @param rawInput - Navigation options (will be validated)
345
+ * @returns Navigation result with snapshot data
346
+ */
347
+ export async function reload(rawInput) {
348
+ const input = ReloadInputSchema.parse(rawInput);
349
+ return executeNavigationAction(input.page_id, 'reload');
350
+ }
351
+ /**
352
+ * Capture a fresh snapshot of the current page.
353
+ *
354
+ * @param rawInput - Capture options (will be validated)
355
+ * @returns Snapshot data for the current page
356
+ */
357
+ export async function captureSnapshot(rawInput) {
358
+ const input = CaptureSnapshotInputSchema.parse(rawInput);
359
+ const session = getSessionManager();
360
+ let handle = resolveExistingPage(session, input.page_id);
361
+ const page_id = handle.page_id;
362
+ // Capture any accumulated observations (no action window)
363
+ const observations = await observationAccumulator.getAccumulatedObservations(handle.page);
364
+ const captureResult = await captureSnapshotWithRecovery(session, handle, page_id);
365
+ handle = captureResult.handle;
366
+ const snapshot = captureResult.snapshot;
367
+ // Filter observations to reduce noise (threshold 5 requires semantic signals)
368
+ const filteredObservations = observationAccumulator.filterBySignificance(observations, ATTACHMENT_SIGNIFICANCE_THRESHOLD);
369
+ // Attach accumulated observations to snapshot if any
370
+ if (filteredObservations.sincePrevious.length > 0) {
371
+ snapshot.observations = filteredObservations;
372
+ }
373
+ snapshotStore.store(page_id, snapshot);
374
+ // Return XML state response directly (trimmed for observation snapshots)
375
+ const stateManager = getStateManager(page_id);
376
+ return stateManager.generateResponse(snapshot, { trimRegions: true });
377
+ }
378
+ /**
379
+ * Find elements by semantic criteria.
380
+ *
381
+ * @param rawInput - Query filters (will be validated)
382
+ * @returns Matched nodes
383
+ */
384
+ export function findElements(rawInput) {
385
+ const input = FindElementsInputSchema.parse(rawInput);
386
+ const session = getSessionManager();
387
+ const handle = resolveExistingPage(session, input.page_id);
388
+ const page_id = handle.page_id;
389
+ const snap = snapshotStore.getByPageId(page_id);
390
+ if (!snap) {
391
+ throw new Error(`No snapshot for page ${page_id} - capture a snapshot first`);
392
+ }
393
+ // Build query request from input
394
+ const request = {
395
+ limit: input.limit,
396
+ };
397
+ if (input.kind) {
398
+ request.kind = input.kind;
399
+ }
400
+ if (input.label) {
401
+ request.label = { text: input.label, mode: 'contains', caseSensitive: false };
402
+ }
403
+ if (input.region) {
404
+ request.region = input.region;
405
+ }
406
+ const engine = new QueryEngine(snap);
407
+ const response = engine.find(request);
408
+ // Get registry and state manager for EID lookup
409
+ const stateManager = getStateManager(page_id);
410
+ const registry = stateManager.getElementRegistry();
411
+ const activeLayer = stateManager.getActiveLayer();
412
+ const matches = response.matches.map((m) => {
413
+ // Check if this is a readable/structural (non-interactive) node
414
+ const isNonInteractive = isReadableNode(m.node) || isStructuralNode(m.node);
415
+ // Look up EID from registry (for interactive nodes)
416
+ const registryEid = registry.getEidBySnapshotAndBackendNodeId(snap.snapshot_id, m.node.backend_node_id);
417
+ // Determine EID:
418
+ // - Interactive nodes: use registry EID
419
+ // - Non-interactive nodes with include_readable: compute rd-* ID on-demand
420
+ // - Non-interactive nodes without include_readable: use unknown-* fallback
421
+ let eid;
422
+ if (registryEid) {
423
+ eid = registryEid;
424
+ }
425
+ else if (isNonInteractive && input.include_readable) {
426
+ // Compute on-demand semantic ID for readable content with rd- prefix
427
+ eid = `rd-${computeEid(m.node, activeLayer).substring(0, 10)}`;
428
+ }
429
+ else {
430
+ eid = `unknown-${m.node.backend_node_id}`;
431
+ }
432
+ const match = {
433
+ eid,
434
+ kind: m.node.kind,
435
+ label: m.node.label,
436
+ selector: m.node.find?.primary ?? '',
437
+ region: m.node.where.region,
438
+ };
439
+ // Include state if present (type-safe assignment via NodeState interface)
440
+ if (m.node.state) {
441
+ match.state = m.node.state;
442
+ }
443
+ // Include attributes if present (filter to common ones)
444
+ if (m.node.attributes) {
445
+ const attrs = {};
446
+ if (m.node.attributes.input_type)
447
+ attrs.input_type = m.node.attributes.input_type;
448
+ if (m.node.attributes.placeholder)
449
+ attrs.placeholder = m.node.attributes.placeholder;
450
+ if (m.node.attributes.value)
451
+ attrs.value = m.node.attributes.value;
452
+ if (m.node.attributes.href)
453
+ attrs.href = m.node.attributes.href;
454
+ if (m.node.attributes.alt)
455
+ attrs.alt = m.node.attributes.alt;
456
+ if (m.node.attributes.src)
457
+ attrs.src = m.node.attributes.src;
458
+ if (Object.keys(attrs).length > 0) {
459
+ match.attributes = attrs;
460
+ }
461
+ }
462
+ return match;
463
+ });
464
+ return buildFindElementsResponse(page_id, snap.snapshot_id, matches);
465
+ }
466
+ /**
467
+ * Get full details for a specific node.
468
+ *
469
+ * @param rawInput - Node details request (will be validated)
470
+ * @returns Full node details
471
+ */
472
+ export function getNodeDetails(rawInput) {
473
+ const input = GetNodeDetailsInputSchema.parse(rawInput);
474
+ const session = getSessionManager();
475
+ const handle = resolveExistingPage(session, input.page_id);
476
+ const page_id = handle.page_id;
477
+ const snap = snapshotStore.getByPageId(page_id);
478
+ if (!snap) {
479
+ throw new Error(`No snapshot for page ${page_id} - capture a snapshot first`);
480
+ }
481
+ // Look up element by EID from registry
482
+ const stateManager = getStateManager(page_id);
483
+ const elementRef = stateManager.getElementRegistry().getByEid(input.eid);
484
+ if (!elementRef) {
485
+ throw new Error(`Element with eid ${input.eid} not found in registry`);
486
+ }
487
+ // Find the node by backend_node_id
488
+ const node = snap.nodes.find((n) => n.backend_node_id === elementRef.ref.backend_node_id);
489
+ if (!node) {
490
+ throw new Error(`Element with eid ${input.eid} has stale reference`);
491
+ }
492
+ const details = {
493
+ eid: input.eid,
494
+ kind: node.kind,
495
+ label: node.label,
496
+ where: {
497
+ region: node.where.region,
498
+ group_id: node.where.group_id,
499
+ group_path: node.where.group_path,
500
+ heading_context: node.where.heading_context,
501
+ },
502
+ layout: {
503
+ bbox: node.layout.bbox,
504
+ display: node.layout.display,
505
+ screen_zone: node.layout.screen_zone,
506
+ },
507
+ };
508
+ if (node.state) {
509
+ details.state = { ...node.state };
510
+ }
511
+ if (node.find) {
512
+ details.find = { primary: node.find.primary, alternates: node.find.alternates };
513
+ }
514
+ if (node.attributes) {
515
+ details.attributes = { ...node.attributes };
516
+ }
517
+ return buildGetElementDetailsResponse(page_id, snap.snapshot_id, details);
518
+ }
519
+ /**
520
+ * Scroll an element into view.
521
+ *
522
+ * @param rawInput - Scroll options (will be validated)
523
+ * @returns Scroll result with delta
524
+ */
525
+ export async function scrollElementIntoView(rawInput) {
526
+ const input = ScrollElementIntoViewInputSchema.parse(rawInput);
527
+ const { handleRef, pageId, captureSnapshot } = await prepareActionContext(input.page_id);
528
+ const snap = requireSnapshot(pageId);
529
+ const node = resolveElementByEid(pageId, input.eid, snap);
530
+ // Execute action with automatic retry on stale elements
531
+ const result = await executeActionWithRetry(handleRef.current, node, async (backendNodeId) => {
532
+ await scrollIntoView(handleRef.current.cdp, backendNodeId);
533
+ }, snapshotStore, captureSnapshot);
534
+ // Store snapshot for future queries
535
+ snapshotStore.store(pageId, result.snapshot);
536
+ // Return XML state response directly
537
+ return result.state_response;
538
+ }
539
+ /**
540
+ * Scroll the page up or down.
541
+ *
542
+ * @param rawInput - Scroll options (will be validated)
543
+ * @returns Scroll result with delta
544
+ */
545
+ export async function scrollPage(rawInput) {
546
+ const input = ScrollPageInputSchema.parse(rawInput);
547
+ const { handleRef, pageId, captureSnapshot } = await prepareActionContext(input.page_id);
548
+ // Execute action with new simplified wrapper
549
+ const result = await executeAction(handleRef.current, async () => {
550
+ await scrollPageByAmount(handleRef.current.cdp, input.direction, input.amount);
551
+ }, captureSnapshot);
552
+ // Store snapshot for future queries
553
+ snapshotStore.store(pageId, result.snapshot);
554
+ // Return XML state response directly
555
+ return result.state_response;
556
+ }
557
+ /**
558
+ * Click an element.
559
+ *
560
+ * @param rawInput - Click options (will be validated)
561
+ * @returns Click result with navigation-aware outcome
562
+ */
563
+ export async function click(rawInput) {
564
+ const input = ClickInputSchema.parse(rawInput);
565
+ const { handleRef, pageId, captureSnapshot } = await prepareActionContext(input.page_id);
566
+ const snap = requireSnapshot(pageId);
567
+ const node = resolveElementByEid(pageId, input.eid, snap);
568
+ // Execute action with navigation-aware outcome detection
569
+ const result = await executeActionWithOutcome(handleRef.current, node, async (backendNodeId) => {
570
+ await clickByBackendNodeId(handleRef.current.cdp, backendNodeId);
571
+ }, snapshotStore, captureSnapshot);
572
+ // Store snapshot for future queries
573
+ snapshotStore.store(pageId, result.snapshot);
574
+ // Return XML state response directly
575
+ return result.state_response;
576
+ }
577
+ /**
578
+ * Type text into an element.
579
+ *
580
+ * @param rawInput - Type options (will be validated)
581
+ * @returns Type result with delta
582
+ */
583
+ export async function type(rawInput) {
584
+ const input = TypeInputSchema.parse(rawInput);
585
+ const { handleRef, pageId, captureSnapshot } = await prepareActionContext(input.page_id);
586
+ const snap = requireSnapshot(pageId);
587
+ const node = resolveElementByEid(pageId, input.eid, snap);
588
+ // Execute action with automatic retry on stale elements
589
+ const result = await executeActionWithRetry(handleRef.current, node, async (backendNodeId) => {
590
+ await typeByBackendNodeId(handleRef.current.cdp, backendNodeId, input.text, {
591
+ clear: input.clear,
592
+ });
593
+ }, snapshotStore, captureSnapshot);
594
+ // Store snapshot for future queries
595
+ snapshotStore.store(pageId, result.snapshot);
596
+ // Return XML state response directly
597
+ return result.state_response;
598
+ }
599
+ /**
600
+ * Press a keyboard key (no agent_version).
601
+ *
602
+ * @param rawInput - Press options (will be validated)
603
+ * @returns Press result with delta
604
+ */
605
+ export async function press(rawInput) {
606
+ const input = PressInputSchema.parse(rawInput);
607
+ const { handleRef, pageId, captureSnapshot } = await prepareActionContext(input.page_id);
608
+ // Execute action with new simplified wrapper
609
+ const result = await executeAction(handleRef.current, async () => {
610
+ await pressKey(handleRef.current.cdp, input.key, input.modifiers);
611
+ }, captureSnapshot);
612
+ // Store snapshot for future queries
613
+ snapshotStore.store(pageId, result.snapshot);
614
+ // Return XML state response directly
615
+ return result.state_response;
616
+ }
617
+ /**
618
+ * Select a dropdown option.
619
+ *
620
+ * @param rawInput - Select options (will be validated)
621
+ * @returns Select result with delta
622
+ */
623
+ export async function select(rawInput) {
624
+ const input = SelectInputSchema.parse(rawInput);
625
+ const { handleRef, pageId, captureSnapshot } = await prepareActionContext(input.page_id);
626
+ const snap = requireSnapshot(pageId);
627
+ const node = resolveElementByEid(pageId, input.eid, snap);
628
+ // Execute action with automatic retry on stale elements
629
+ const result = await executeActionWithRetry(handleRef.current, node, async (backendNodeId) => {
630
+ await selectOption(handleRef.current.cdp, backendNodeId, input.value);
631
+ }, snapshotStore, captureSnapshot);
632
+ // Store snapshot for future queries
633
+ snapshotStore.store(pageId, result.snapshot);
634
+ // Return XML state response directly
635
+ return result.state_response;
636
+ }
637
+ /**
638
+ * Hover over an element.
639
+ *
640
+ * @param rawInput - Hover options (will be validated)
641
+ * @returns Hover result with delta
642
+ */
643
+ export async function hover(rawInput) {
644
+ const input = HoverInputSchema.parse(rawInput);
645
+ const { handleRef, pageId, captureSnapshot } = await prepareActionContext(input.page_id);
646
+ const snap = requireSnapshot(pageId);
647
+ const node = resolveElementByEid(pageId, input.eid, snap);
648
+ // Execute action with automatic retry on stale elements
649
+ const result = await executeActionWithRetry(handleRef.current, node, async (backendNodeId) => {
650
+ await hoverByBackendNodeId(handleRef.current.cdp, backendNodeId);
651
+ }, snapshotStore, captureSnapshot);
652
+ // Store snapshot for future queries
653
+ snapshotStore.store(pageId, result.snapshot);
654
+ // Return XML state response directly
655
+ return result.state_response;
656
+ }
657
+ //# sourceMappingURL=browser-tools.js.map