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 @@
1
+ {"version":3,"file":"attribute-extractor.js","sourceRoot":"","sources":["../../../../src/snapshot/extractors/attribute-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * AX Extractor
3
+ *
4
+ * Extracts accessibility tree and correlates with DOM nodes.
5
+ *
6
+ * @module snapshot/extractors/ax-extractor
7
+ *
8
+ * CDP Domains:
9
+ * - Accessibility.getFullAXTree: Full accessibility tree
10
+ * - Accessibility.getPartialAXTree: Targeted extraction (optimization)
11
+ */
12
+ import type { ExtractorContext, AxExtractionResult } from './types.js';
13
+ /**
14
+ * Role classification result
15
+ */
16
+ export type RoleClassification = 'interactive' | 'readable' | 'structural' | 'unknown';
17
+ /**
18
+ * Classify an AX role into category.
19
+ *
20
+ * @param role - AX role string
21
+ * @returns Role classification
22
+ */
23
+ export declare function classifyAxRole(role: string | undefined): RoleClassification;
24
+ /**
25
+ * Extract accessibility tree from page via CDP.
26
+ *
27
+ * Supports multi-frame extraction for pages with iframes (e.g., cookie consent
28
+ * dialogs, embedded widgets). When frameIds are provided, the function extracts
29
+ * AX trees from each frame and merges them into a single result.
30
+ *
31
+ * @param ctx - Extractor context with CDP client and options
32
+ * @param frameIds - Optional array of iframe frame IDs to also extract from
33
+ * @returns AxExtractionResult with nodes map and classification sets
34
+ */
35
+ export declare function extractAx(ctx: ExtractorContext, frameIds?: string[]): Promise<AxExtractionResult>;
36
+ //# sourceMappingURL=ax-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ax-extractor.d.ts","sourceRoot":"","sources":["../../../../src/snapshot/extractors/ax-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAyB,MAAM,YAAY,CAAC;AAuC9F;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,UAAU,GAAG,YAAY,GAAG,SAAS,CAAC;AAEvF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,kBAAkB,CAoB3E;AA0ED;;;;;;;;;;GAUG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,gBAAgB,EACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAyC7B"}
@@ -0,0 +1,144 @@
1
+ /**
2
+ * AX Extractor
3
+ *
4
+ * Extracts accessibility tree and correlates with DOM nodes.
5
+ *
6
+ * @module snapshot/extractors/ax-extractor
7
+ *
8
+ * CDP Domains:
9
+ * - Accessibility.getFullAXTree: Full accessibility tree
10
+ * - Accessibility.getPartialAXTree: Targeted extraction (optimization)
11
+ */
12
+ import { INTERACTIVE_AX_ROLES, READABLE_AX_ROLES, STRUCTURAL_AX_ROLES } from './types.js';
13
+ /**
14
+ * Classify an AX role into category.
15
+ *
16
+ * @param role - AX role string
17
+ * @returns Role classification
18
+ */
19
+ export function classifyAxRole(role) {
20
+ if (!role) {
21
+ return 'unknown';
22
+ }
23
+ const normalized = role.toLowerCase();
24
+ if (INTERACTIVE_AX_ROLES.has(normalized)) {
25
+ return 'interactive';
26
+ }
27
+ if (READABLE_AX_ROLES.has(normalized)) {
28
+ return 'readable';
29
+ }
30
+ if (STRUCTURAL_AX_ROLES.has(normalized)) {
31
+ return 'structural';
32
+ }
33
+ return 'unknown';
34
+ }
35
+ /**
36
+ * Convert CDP AX property to our internal format.
37
+ *
38
+ * @param cdpProp - CDP property structure
39
+ * @returns Internal AxProperty
40
+ */
41
+ function convertProperty(cdpProp) {
42
+ return {
43
+ name: cdpProp.name,
44
+ value: {
45
+ type: cdpProp.value.type ?? 'unknown',
46
+ value: cdpProp.value.value,
47
+ },
48
+ };
49
+ }
50
+ /**
51
+ * Process CDP AX nodes and add them to result collections.
52
+ *
53
+ * @param cdpNodes - Array of CDP AX nodes
54
+ * @param nodes - Map to add processed nodes to
55
+ * @param interactiveIds - Set to add interactive node IDs to
56
+ * @param readableIds - Set to add readable node IDs to
57
+ */
58
+ function processAxNodes(cdpNodes, nodes, interactiveIds, readableIds) {
59
+ for (const cdpNode of cdpNodes) {
60
+ // Skip ignored nodes
61
+ if (cdpNode.ignored) {
62
+ continue;
63
+ }
64
+ // Skip nodes without DOM correlation
65
+ if (cdpNode.backendDOMNodeId === undefined) {
66
+ continue;
67
+ }
68
+ const backendDOMNodeId = cdpNode.backendDOMNodeId;
69
+ const role = cdpNode.role?.value;
70
+ const name = cdpNode.name?.value;
71
+ // Convert properties
72
+ const properties = cdpNode.properties?.map(convertProperty);
73
+ // Create the raw AX node
74
+ const rawNode = {
75
+ nodeId: cdpNode.nodeId,
76
+ backendDOMNodeId,
77
+ role,
78
+ name,
79
+ properties,
80
+ ignored: cdpNode.ignored,
81
+ childIds: cdpNode.childIds,
82
+ };
83
+ nodes.set(backendDOMNodeId, rawNode);
84
+ // Classify the node
85
+ const classification = classifyAxRole(role);
86
+ if (classification === 'interactive') {
87
+ interactiveIds.add(backendDOMNodeId);
88
+ }
89
+ else if (classification === 'readable') {
90
+ readableIds.add(backendDOMNodeId);
91
+ }
92
+ // Structural nodes are tracked implicitly in the nodes map
93
+ }
94
+ }
95
+ /**
96
+ * Extract accessibility tree from page via CDP.
97
+ *
98
+ * Supports multi-frame extraction for pages with iframes (e.g., cookie consent
99
+ * dialogs, embedded widgets). When frameIds are provided, the function extracts
100
+ * AX trees from each frame and merges them into a single result.
101
+ *
102
+ * @param ctx - Extractor context with CDP client and options
103
+ * @param frameIds - Optional array of iframe frame IDs to also extract from
104
+ * @returns AxExtractionResult with nodes map and classification sets
105
+ */
106
+ export async function extractAx(ctx, frameIds) {
107
+ const { cdp } = ctx;
108
+ const nodes = new Map();
109
+ const interactiveIds = new Set();
110
+ const readableIds = new Set();
111
+ // Request full accessibility tree for main frame
112
+ const mainResponse = await cdp.send('Accessibility.getFullAXTree', {
113
+ depth: -1, // Full depth
114
+ });
115
+ processAxNodes(mainResponse.nodes, nodes, interactiveIds, readableIds);
116
+ // Extract AX trees from additional frames (iframes)
117
+ if (frameIds && frameIds.length > 0) {
118
+ // Process frames in parallel for better performance
119
+ const framePromises = frameIds.map(async (frameId) => {
120
+ try {
121
+ const frameResponse = await cdp.send('Accessibility.getFullAXTree', {
122
+ depth: -1,
123
+ frameId, // Scope to specific frame
124
+ });
125
+ return frameResponse.nodes;
126
+ }
127
+ catch {
128
+ // Frame may have been removed, navigated away, or be cross-origin
129
+ // Silently skip failed frames - this is expected for some iframe types
130
+ return [];
131
+ }
132
+ });
133
+ const frameResults = await Promise.all(framePromises);
134
+ for (const frameNodes of frameResults) {
135
+ processAxNodes(frameNodes, nodes, interactiveIds, readableIds);
136
+ }
137
+ }
138
+ return {
139
+ nodes,
140
+ interactiveIds,
141
+ readableIds,
142
+ };
143
+ }
144
+ //# sourceMappingURL=ax-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ax-extractor.js","sourceRoot":"","sources":["../../../../src/snapshot/extractors/ax-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * DOM Extractor
3
+ *
4
+ * Extracts DOM tree structure via CDP, handling shadow DOM and iframes.
5
+ *
6
+ * @module snapshot/extractors/dom-extractor
7
+ *
8
+ * CDP Domains:
9
+ * - DOM.getDocument: Get document root with full tree
10
+ * - DOM.describeNode: Get details for a specific node (if needed)
11
+ * - DOM.requestChildNodes: Expand children (for incremental loading)
12
+ */
13
+ import type { ExtractorContext, DomExtractionResult } from './types.js';
14
+ /**
15
+ * Extract DOM tree from page via CDP.
16
+ *
17
+ * @param ctx - Extractor context with CDP client and options
18
+ * @returns DomExtractionResult with nodes map, root ID, and metadata
19
+ */
20
+ export declare function extractDom(ctx: ExtractorContext): Promise<DomExtractionResult>;
21
+ //# sourceMappingURL=dom-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-extractor.d.ts","sourceRoot":"","sources":["../../../../src/snapshot/extractors/dom-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,mBAAmB,EAAc,MAAM,YAAY,CAAC;AAqJpF;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CA4BpF"}
@@ -0,0 +1,137 @@
1
+ /**
2
+ * DOM Extractor
3
+ *
4
+ * Extracts DOM tree structure via CDP, handling shadow DOM and iframes.
5
+ *
6
+ * @module snapshot/extractors/dom-extractor
7
+ *
8
+ * CDP Domains:
9
+ * - DOM.getDocument: Get document root with full tree
10
+ * - DOM.describeNode: Get details for a specific node (if needed)
11
+ * - DOM.requestChildNodes: Expand children (for incremental loading)
12
+ */
13
+ /**
14
+ * Parse CDP attributes array into key-value object.
15
+ * CDP returns attributes as flat array: [name1, value1, name2, value2, ...]
16
+ *
17
+ * @param attributes - Flat array of attribute name-value pairs
18
+ * @returns Record of attribute names to values
19
+ */
20
+ function parseAttributes(attributes) {
21
+ if (!attributes || attributes.length === 0) {
22
+ return undefined;
23
+ }
24
+ const result = {};
25
+ for (let i = 0; i < attributes.length; i += 2) {
26
+ const name = attributes[i];
27
+ const value = attributes[i + 1] ?? '';
28
+ result[name] = value;
29
+ }
30
+ return result;
31
+ }
32
+ /**
33
+ * Recursively traverse DOM tree and extract nodes.
34
+ *
35
+ * @param cdpNode - CDP DOM node
36
+ * @param parentId - Parent node's backendNodeId (undefined for root)
37
+ * @param nodes - Map to accumulate extracted nodes
38
+ * @param frameIds - Set to accumulate discovered frame IDs
39
+ * @param shadowRoots - Array to accumulate shadow root host backendNodeIds
40
+ * @param ctx - Traversal context tracking frame and shadow paths
41
+ */
42
+ function traverseNode(cdpNode, parentId, nodes, frameIds, shadowRoots, ctx) {
43
+ const backendNodeId = cdpNode.backendNodeId;
44
+ // Determine shadow root type if this node hosts a shadow root
45
+ let shadowRootType;
46
+ if (cdpNode.shadowRoots && cdpNode.shadowRoots.length > 0) {
47
+ // Get the shadow root type from the first shadow root
48
+ const firstShadowRoot = cdpNode.shadowRoots[0];
49
+ shadowRootType = firstShadowRoot.shadowRootType;
50
+ shadowRoots.push(backendNodeId);
51
+ }
52
+ // Track frame ID if this is an iframe
53
+ let frameId;
54
+ if (cdpNode.frameId) {
55
+ frameId = cdpNode.frameId;
56
+ frameIds.add(frameId);
57
+ }
58
+ // Collect child backendNodeIds
59
+ const childNodeIds = [];
60
+ if (cdpNode.children) {
61
+ for (const child of cdpNode.children) {
62
+ childNodeIds.push(child.backendNodeId);
63
+ }
64
+ }
65
+ // Create the raw DOM node with frame/shadow path information
66
+ const rawNode = {
67
+ nodeId: cdpNode.nodeId,
68
+ backendNodeId,
69
+ nodeName: cdpNode.nodeName,
70
+ nodeType: cdpNode.nodeType,
71
+ attributes: parseAttributes(cdpNode.attributes),
72
+ childNodeIds: childNodeIds.length > 0 ? childNodeIds : undefined,
73
+ shadowRootType,
74
+ frameId,
75
+ parentId,
76
+ nodeValue: cdpNode.nodeValue,
77
+ // Include frame/shadow paths if non-empty
78
+ framePath: ctx.framePath.length > 0 ? [...ctx.framePath] : undefined,
79
+ shadowPath: ctx.shadowPath.length > 0 ? [...ctx.shadowPath] : undefined,
80
+ };
81
+ nodes.set(backendNodeId, rawNode);
82
+ // Recursively process children (same context)
83
+ if (cdpNode.children) {
84
+ for (const child of cdpNode.children) {
85
+ traverseNode(child, backendNodeId, nodes, frameIds, shadowRoots, ctx);
86
+ }
87
+ }
88
+ // Process shadow roots (add this host to shadow path)
89
+ if (cdpNode.shadowRoots) {
90
+ const shadowCtx = {
91
+ framePath: ctx.framePath,
92
+ shadowPath: [...ctx.shadowPath, backendNodeId],
93
+ };
94
+ for (const shadowRoot of cdpNode.shadowRoots) {
95
+ traverseNode(shadowRoot, backendNodeId, nodes, frameIds, shadowRoots, shadowCtx);
96
+ }
97
+ }
98
+ // Process content document (add this iframe to frame path, reset shadow path)
99
+ if (cdpNode.contentDocument) {
100
+ const frameCtx = {
101
+ framePath: [...ctx.framePath, backendNodeId],
102
+ shadowPath: [], // Reset shadow path when entering new frame
103
+ };
104
+ traverseNode(cdpNode.contentDocument, backendNodeId, nodes, frameIds, shadowRoots, frameCtx);
105
+ }
106
+ }
107
+ /**
108
+ * Extract DOM tree from page via CDP.
109
+ *
110
+ * @param ctx - Extractor context with CDP client and options
111
+ * @returns DomExtractionResult with nodes map, root ID, and metadata
112
+ */
113
+ export async function extractDom(ctx) {
114
+ const { cdp } = ctx;
115
+ // Request full DOM tree with shadow DOM piercing
116
+ const response = await cdp.send('DOM.getDocument', {
117
+ depth: -1, // Full depth
118
+ pierce: true, // Pierce through iframes and shadow DOM
119
+ });
120
+ const nodes = new Map();
121
+ const frameIds = new Set();
122
+ const shadowRoots = [];
123
+ // Initial traversal context (empty paths for root document)
124
+ const initialCtx = {
125
+ framePath: [],
126
+ shadowPath: [],
127
+ };
128
+ // Traverse the tree starting from root
129
+ traverseNode(response.root, undefined, nodes, frameIds, shadowRoots, initialCtx);
130
+ return {
131
+ nodes,
132
+ rootId: response.root.backendNodeId,
133
+ frameIds: Array.from(frameIds),
134
+ shadowRoots,
135
+ };
136
+ }
137
+ //# sourceMappingURL=dom-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dom-extractor.js","sourceRoot":"","sources":["../../../../src/snapshot/extractors/dom-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Grouping Resolver
3
+ *
4
+ * Computes group hierarchy and heading context.
5
+ *
6
+ * @module snapshot/extractors/grouping-resolver
7
+ *
8
+ * Concepts:
9
+ * - group_id: Unique identifier for containing group (form, menu, card)
10
+ * - group_path: Breadcrumb hierarchy ["Men", "Shoes", "Running"]
11
+ * - heading_context: Nearest preceding heading text
12
+ */
13
+ import type { RawDomNode, RawAxNode, RawNodeData } from './types.js';
14
+ /**
15
+ * Grouping information for a node
16
+ */
17
+ export interface GroupingInfo {
18
+ /** Unique identifier for containing group */
19
+ group_id?: string;
20
+ /** Hierarchy path from nested groups */
21
+ group_path?: string[];
22
+ /** Nearest preceding heading text */
23
+ heading_context?: string;
24
+ }
25
+ /**
26
+ * Resolve grouping information for a node.
27
+ *
28
+ * @param nodeId - Backend node ID
29
+ * @param domTree - Full DOM tree
30
+ * @param axTree - Full AX tree (backendDOMNodeId -> RawAxNode)
31
+ * @param allNodes - All extracted nodes for heading context
32
+ * @returns GroupingInfo
33
+ */
34
+ export interface GroupingOptions {
35
+ /** Include heading context resolution (default: true) */
36
+ includeHeadingContext?: boolean;
37
+ }
38
+ export declare function resolveGrouping(nodeId: number, domTree: Map<number, RawDomNode>, axTree: Map<number, RawAxNode>, allNodes: RawNodeData[], options?: GroupingOptions): GroupingInfo;
39
+ //# sourceMappingURL=grouping-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grouping-resolver.d.ts","sourceRoot":"","sources":["../../../../src/snapshot/extractors/grouping-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAKrE;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,qCAAqC;IACrC,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAoOD;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,EAC9B,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,eAAe,GACxB,YAAY,CAyDd"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * Grouping Resolver
3
+ *
4
+ * Computes group hierarchy and heading context.
5
+ *
6
+ * @module snapshot/extractors/grouping-resolver
7
+ *
8
+ * Concepts:
9
+ * - group_id: Unique identifier for containing group (form, menu, card)
10
+ * - group_path: Breadcrumb hierarchy ["Men", "Shoes", "Running"]
11
+ * - heading_context: Nearest preceding heading text
12
+ */
13
+ /** Maximum length for slugified names in group IDs */
14
+ const MAX_SLUG_LENGTH = 40;
15
+ /**
16
+ * DOM tags that indicate grouping elements
17
+ */
18
+ const GROUPING_TAGS = new Set([
19
+ 'FORM',
20
+ 'FIELDSET',
21
+ 'ARTICLE',
22
+ 'SECTION',
23
+ 'NAV',
24
+ 'UL',
25
+ 'OL',
26
+ 'DL',
27
+ 'TABLE',
28
+ 'TBODY',
29
+ 'THEAD',
30
+ ]);
31
+ /**
32
+ * AX roles that indicate grouping elements
33
+ */
34
+ const GROUPING_ROLES = new Set([
35
+ 'form',
36
+ 'group',
37
+ 'menu',
38
+ 'menubar',
39
+ 'navigation',
40
+ 'list',
41
+ 'listbox',
42
+ 'tree',
43
+ 'treegrid',
44
+ 'grid',
45
+ 'table',
46
+ 'tablist',
47
+ 'radiogroup',
48
+ 'toolbar',
49
+ 'directory',
50
+ ]);
51
+ /**
52
+ * Check if a node is a grouping container.
53
+ *
54
+ * @param domNode - DOM node
55
+ * @param axNode - AX node
56
+ * @returns true if this node is a grouping container
57
+ */
58
+ function isGroupingContainer(domNode, axNode) {
59
+ // Check AX role
60
+ if (axNode?.role && GROUPING_ROLES.has(axNode.role.toLowerCase())) {
61
+ return true;
62
+ }
63
+ // Check DOM tag
64
+ if (domNode?.nodeName && GROUPING_TAGS.has(domNode.nodeName.toUpperCase())) {
65
+ return true;
66
+ }
67
+ // Check DOM role attribute
68
+ const domRole = domNode?.attributes?.role?.toLowerCase();
69
+ if (domRole && GROUPING_ROLES.has(domRole)) {
70
+ return true;
71
+ }
72
+ return false;
73
+ }
74
+ /**
75
+ * Slugify a string for use in group IDs.
76
+ *
77
+ * Converts "Shop and Learn" → "shop-and-learn"
78
+ * Removes special characters, normalizes whitespace.
79
+ *
80
+ * @param text - Input text
81
+ * @returns Slugified string
82
+ */
83
+ function slugify(text) {
84
+ return (text
85
+ .toLowerCase()
86
+ // Replace common separators with hyphens
87
+ .replace(/[\s_]+/g, '-')
88
+ // Remove apostrophes and quotes
89
+ .replace(/[''"`]/g, '')
90
+ // Replace & with "and" word or just remove
91
+ .replace(/&/g, '-')
92
+ // Remove all non-alphanumeric except hyphens
93
+ .replace(/[^a-z0-9-]/g, '')
94
+ // Collapse multiple hyphens
95
+ .replace(/-+/g, '-')
96
+ // Trim leading/trailing hyphens
97
+ .replace(/^-+|-+$/g, '')
98
+ // Truncate to max length
99
+ .slice(0, MAX_SLUG_LENGTH)
100
+ // Remove trailing hyphen if truncated mid-word
101
+ .replace(/-$/, ''));
102
+ }
103
+ /**
104
+ * Generate a group ID from node information.
105
+ *
106
+ * Format: {role}-{slugified-name}
107
+ *
108
+ * @param domNode - DOM node
109
+ * @param axNode - AX node
110
+ * @param headingContext - Optional heading context as fallback name
111
+ * @returns Group ID string
112
+ */
113
+ function generateGroupId(domNode, axNode, headingContext) {
114
+ const role = axNode?.role?.toLowerCase() ??
115
+ domNode?.attributes?.role?.toLowerCase() ??
116
+ domNode?.nodeName?.toLowerCase() ??
117
+ 'group';
118
+ // Use name, aria-label, or id as identifier
119
+ const rawName = axNode?.name ?? domNode?.attributes?.['aria-label'] ?? domNode?.attributes?.id ?? '';
120
+ // Only use name if it's not empty after trimming
121
+ if (rawName?.trim()) {
122
+ const sluggedName = slugify(rawName);
123
+ if (sluggedName) {
124
+ return `${role}-${sluggedName}`;
125
+ }
126
+ }
127
+ // Fallback to heading context if available
128
+ if (headingContext?.trim()) {
129
+ const sluggedHeading = slugify(headingContext);
130
+ if (sluggedHeading) {
131
+ return `${role}-${sluggedHeading}`;
132
+ }
133
+ }
134
+ // Generate a simple ID from backendNodeId
135
+ const nodeId = axNode?.backendDOMNodeId ?? domNode?.backendNodeId;
136
+ if (nodeId) {
137
+ return `${role}-${nodeId}`;
138
+ }
139
+ return role;
140
+ }
141
+ /**
142
+ * Get group name for path building.
143
+ *
144
+ * @param domNode - DOM node
145
+ * @param axNode - AX node
146
+ * @returns Group name or undefined
147
+ */
148
+ function getGroupName(domNode, axNode) {
149
+ return (axNode?.name ?? domNode?.attributes?.['aria-label'] ?? domNode?.attributes?.title ?? undefined);
150
+ }
151
+ /**
152
+ * Check if a node is a heading.
153
+ *
154
+ * @param domNode - DOM node
155
+ * @param axNode - AX node
156
+ * @returns true if this is a heading
157
+ */
158
+ function isHeading(domNode, axNode) {
159
+ if (axNode?.role === 'heading')
160
+ return true;
161
+ if (domNode?.nodeName?.match(/^H[1-6]$/i))
162
+ return true;
163
+ return false;
164
+ }
165
+ /**
166
+ * Find nearest preceding heading in the node list.
167
+ *
168
+ * @param targetNodeId - Backend node ID of target element
169
+ * @param allNodes - All nodes in document order
170
+ * @param domTree - DOM tree for parent lookup
171
+ * @returns Heading text or undefined
172
+ */
173
+ function findHeadingContext(targetNodeId, allNodes, domTree) {
174
+ // Find the target node's position and parent
175
+ const targetNode = domTree.get(targetNodeId);
176
+ if (!targetNode)
177
+ return undefined;
178
+ const parentId = targetNode.parentId;
179
+ if (parentId === undefined)
180
+ return undefined;
181
+ // Find the parent's children to check siblings
182
+ const parent = domTree.get(parentId);
183
+ if (!parent?.childNodeIds)
184
+ return undefined;
185
+ // Get index of target in parent's children
186
+ const targetIndex = parent.childNodeIds.indexOf(targetNodeId);
187
+ if (targetIndex === -1)
188
+ return undefined;
189
+ // Look at preceding siblings for headings
190
+ for (let i = targetIndex - 1; i >= 0; i--) {
191
+ const siblingId = parent.childNodeIds[i];
192
+ const siblingData = allNodes.find((n) => n.backendNodeId === siblingId);
193
+ if (siblingData && isHeading(siblingData.domNode, siblingData.axNode)) {
194
+ return siblingData.axNode?.name;
195
+ }
196
+ }
197
+ // Also check all preceding nodes in document order
198
+ let foundTarget = false;
199
+ for (let i = allNodes.length - 1; i >= 0; i--) {
200
+ const node = allNodes[i];
201
+ if (node.backendNodeId === targetNodeId) {
202
+ foundTarget = true;
203
+ continue;
204
+ }
205
+ if (foundTarget && isHeading(node.domNode, node.axNode) && node.axNode?.name) {
206
+ return node.axNode.name;
207
+ }
208
+ }
209
+ return undefined;
210
+ }
211
+ export function resolveGrouping(nodeId, domTree, axTree, allNodes, options) {
212
+ const result = {};
213
+ const node = domTree.get(nodeId);
214
+ if (!node)
215
+ return result;
216
+ // Traverse ancestors to find grouping containers
217
+ const groupPath = [];
218
+ let groupId;
219
+ let currentId = node.parentId;
220
+ const visited = new Set();
221
+ const maxDepth = 50;
222
+ let depth = 0;
223
+ while (currentId !== undefined && depth < maxDepth) {
224
+ if (visited.has(currentId))
225
+ break;
226
+ visited.add(currentId);
227
+ const parentDom = domTree.get(currentId);
228
+ const parentAx = axTree.get(currentId);
229
+ if (isGroupingContainer(parentDom, parentAx)) {
230
+ // Set group_id to the innermost group
231
+ // Use heading context as fallback for unnamed groups
232
+ if (groupId === undefined) {
233
+ const containerHeadingContext = findHeadingContext(currentId, allNodes, domTree);
234
+ groupId = generateGroupId(parentDom, parentAx, containerHeadingContext);
235
+ }
236
+ // Add to path if named
237
+ const groupName = getGroupName(parentDom, parentAx);
238
+ if (groupName) {
239
+ groupPath.unshift(groupName);
240
+ }
241
+ }
242
+ currentId = parentDom?.parentId;
243
+ depth++;
244
+ }
245
+ if (groupId) {
246
+ result.group_id = groupId;
247
+ }
248
+ if (groupPath.length > 0) {
249
+ result.group_path = groupPath;
250
+ }
251
+ if (options?.includeHeadingContext ?? true) {
252
+ // Find heading context
253
+ const headingContext = findHeadingContext(nodeId, allNodes, domTree);
254
+ if (headingContext) {
255
+ result.heading_context = headingContext;
256
+ }
257
+ }
258
+ return result;
259
+ }
260
+ //# sourceMappingURL=grouping-resolver.js.map