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,155 @@
1
+ /**
2
+ * Text Normalization and Processing Utilities
3
+ *
4
+ * Pure utility functions for text processing, normalization,
5
+ * and string matching used in element discovery.
6
+ */
7
+ /**
8
+ * Normalize text for matching:
9
+ * - Unicode NFKC normalization
10
+ * - Remove zero-width/invisible characters
11
+ * - Collapse whitespace
12
+ */
13
+ export declare function normalizeText(text: string): string;
14
+ /**
15
+ * Sanitize accessible name/label hint for selector building
16
+ * Returns undefined if the result is empty or too short
17
+ */
18
+ export declare function sanitizeAccessibleHint(value: string, maxLength?: number): string | undefined;
19
+ /**
20
+ * Truncate string with ellipsis
21
+ */
22
+ export declare function truncate(value: string, max?: number): string;
23
+ /**
24
+ * Escape string for CSS attribute selector (for display labels).
25
+ * Normalizes and truncates the value.
26
+ */
27
+ export declare function escapeAttributeValue(value: string, maxLength?: number): string;
28
+ /**
29
+ * Escape a value for use inside CSS attribute selector quotes.
30
+ * Follows CSS string serialization spec:
31
+ * - Null (U+0000) -> U+FFFD replacement character
32
+ * - Control chars (U+0001-U+001F, U+007F) -> hex escape with trailing space
33
+ * - Quotes and backslashes -> backslash escape
34
+ *
35
+ * Does NOT truncate or normalize. Use for exact-match selectors like [attr="value"].
36
+ *
37
+ * @param value - Raw attribute value
38
+ * @returns String safe for use in [attr="value"] selectors
39
+ */
40
+ export declare function escapeAttrSelectorValue(value: string): string;
41
+ /**
42
+ * Escape a name for use in Playwright-style role locators: role=button[name="..."]
43
+ * Only escapes quotes and backslashes - keeps control characters raw.
44
+ * Playwright's role engine matches against actual accessible names, not CSS.
45
+ *
46
+ * @param value - Raw accessible name
47
+ * @returns String safe for use in role=[name="value"] locators
48
+ */
49
+ export declare function escapeRoleLocatorName(value: string): string;
50
+ /**
51
+ * Escape a string for use in CSS selectors (CSS.escape() semantics).
52
+ * Does NOT truncate or normalize - uses raw value.
53
+ * Safe for ID selectors (#id), class selectors (.class), etc.
54
+ *
55
+ * Follows CSS.escape() specification:
56
+ * https://drafts.csswg.org/cssom/#the-css.escape()-method
57
+ *
58
+ * @param value - Raw string to escape
59
+ * @returns CSS-escaped string safe for use in selectors
60
+ */
61
+ export declare function cssEscape(value: string): string;
62
+ /**
63
+ * Escape string for XPath string literal
64
+ * XPath doesn't have a standard escape mechanism, so we handle quotes carefully
65
+ */
66
+ export declare function escapeXPathValue(value: string): string;
67
+ /**
68
+ * Tokenize text for XPath matching
69
+ * Takes first few significant words to avoid overly specific selectors
70
+ */
71
+ export declare function tokenizeForMatching(text: string, maxTokens?: number, minLength?: number): string[];
72
+ /**
73
+ * Check if two strings match using fuzzy token-based comparison
74
+ */
75
+ export declare function fuzzyTokenMatch(text: string, query: string, minMatchTokens?: number): boolean;
76
+ /**
77
+ * Calculate Levenshtein (edit) distance between two strings.
78
+ * Uses optimized single-row algorithm with O(min(m,n)) space.
79
+ */
80
+ export declare function levenshteinDistance(a: string, b: string): number;
81
+ /**
82
+ * Calculate similarity ratio (0-1) between two strings based on Levenshtein distance.
83
+ * Returns 1 for identical strings, 0 for completely different strings.
84
+ */
85
+ export declare function stringSimilarity(a: string, b: string): number;
86
+ /**
87
+ * Options for fuzzy token matching
88
+ */
89
+ export interface FuzzyTokenMatchOptions {
90
+ /** Minimum token overlap ratio (0-1) for a match. Default: 0.5 */
91
+ minTokenOverlap?: number;
92
+ /** Enable prefix matching for tokens. Default: true */
93
+ prefixMatch?: boolean;
94
+ /** Minimum edit distance similarity (0-1) for similar tokens. Default: 0.8 */
95
+ minSimilarity?: number;
96
+ }
97
+ /**
98
+ * Result from fuzzy token matching
99
+ */
100
+ export interface FuzzyTokenMatchResult {
101
+ /** Whether the tokens match based on options */
102
+ isMatch: boolean;
103
+ /** Match score (0-1) based on token overlap quality */
104
+ score: number;
105
+ }
106
+ /**
107
+ * Enhanced fuzzy token matching with similarity scoring.
108
+ * Supports exact matching, prefix matching, and edit distance similarity.
109
+ *
110
+ * @param textTokens - Tokens from the text being searched
111
+ * @param queryTokens - Tokens from the search query
112
+ * @param options - Matching options
113
+ * @returns Match result with score
114
+ */
115
+ export declare function fuzzyTokensMatch(textTokens: string[], queryTokens: string[], options?: FuzzyTokenMatchOptions): FuzzyTokenMatchResult;
116
+ /**
117
+ * Minimal DOM node interface for text content extraction.
118
+ * Compatible with RawDomNode from extractors.
119
+ */
120
+ export interface TextContentNode {
121
+ /** Node type (3 = TEXT_NODE) */
122
+ nodeType: number;
123
+ /** Text content for text nodes */
124
+ nodeValue?: string;
125
+ /** Child node IDs (backendNodeIds) */
126
+ childNodeIds?: number[];
127
+ }
128
+ /**
129
+ * Extract text content from a DOM node by concatenating text-node children.
130
+ * Uses depth-limited traversal to avoid performance issues.
131
+ *
132
+ * @param nodeId - Backend node ID of the element
133
+ * @param domNodes - Map of backendNodeId -> node with nodeType, nodeValue, childNodeIds
134
+ * @param maxDepth - Maximum depth to traverse (default: 2)
135
+ * @returns Normalized text content or undefined if none found
136
+ */
137
+ export declare function getTextContent(nodeId: number, domNodes: Map<number, TextContentNode>, maxDepth?: number): string | undefined;
138
+ /**
139
+ * Escape special XML characters in a string.
140
+ * Used for XML element content and attribute values.
141
+ *
142
+ * @param str - String to escape
143
+ * @returns XML-safe string
144
+ */
145
+ export declare function escapeXml(str: string): string;
146
+ /**
147
+ * Build an XML attribute string, choosing quote style to minimize escaping.
148
+ * Uses single quotes when value contains double quotes (common in selectors).
149
+ *
150
+ * @param name - Attribute name
151
+ * @param value - Attribute value
152
+ * @returns Formatted attribute string like `name="value"` or `name='value'`
153
+ */
154
+ export declare function xmlAttr(name: string, value: string): string;
155
+ //# sourceMappingURL=text-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.d.ts","sourceRoot":"","sources":["../../../src/lib/text-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,MAAM,GAAG,SAAS,CAQzF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,MAAM,CAKzD;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG,MAAM,CAE3E;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA+B7D;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAG3D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CA8D/C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAYtD;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAI,EAAE,SAAS,SAAI,GAAG,MAAM,EAAE,CAIxF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,SAAI,GAAG,OAAO,CAcxF;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAwChE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAI7D;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,uDAAuD;IACvD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,gDAAgD;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAAE,EACpB,WAAW,EAAE,MAAM,EAAE,EACrB,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CA+CvB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,gCAAgC;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,kCAAkC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sCAAsC;IACtC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAKD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,eAAe,CAAC,EACtC,QAAQ,SAAI,GACX,MAAM,GAAG,SAAS,CA+BpB;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7C;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAoB3D"}
@@ -0,0 +1,391 @@
1
+ /**
2
+ * Text Normalization and Processing Utilities
3
+ *
4
+ * Pure utility functions for text processing, normalization,
5
+ * and string matching used in element discovery.
6
+ */
7
+ /**
8
+ * Normalize text for matching:
9
+ * - Unicode NFKC normalization
10
+ * - Remove zero-width/invisible characters
11
+ * - Collapse whitespace
12
+ */
13
+ export function normalizeText(text) {
14
+ return (text
15
+ .normalize('NFKC')
16
+ // Remove zero-width/invisible characters
17
+ // eslint-disable-next-line no-misleading-character-class
18
+ .replace(/[\u200B-\u200D\uFEFF\u034F\u2060\u180E]/g, '')
19
+ .replace(/\s+/g, ' ')
20
+ .trim());
21
+ }
22
+ /**
23
+ * Sanitize accessible name/label hint for selector building
24
+ * Returns undefined if the result is empty or too short
25
+ */
26
+ export function sanitizeAccessibleHint(value, maxLength = 160) {
27
+ const normalized = normalizeText(value);
28
+ if (!normalized)
29
+ return undefined;
30
+ const tokens = normalized.split(' ').filter(Boolean).slice(0, 12);
31
+ if (tokens.length === 0)
32
+ return undefined;
33
+ return truncate(tokens.join(' '), maxLength);
34
+ }
35
+ /**
36
+ * Truncate string with ellipsis
37
+ */
38
+ export function truncate(value, max = 120) {
39
+ if (value.length <= max) {
40
+ return value;
41
+ }
42
+ return `${value.slice(0, max - 1)}…`;
43
+ }
44
+ /**
45
+ * Escape string for CSS attribute selector (for display labels).
46
+ * Normalizes and truncates the value.
47
+ */
48
+ export function escapeAttributeValue(value, maxLength = 120) {
49
+ return truncate(normalizeText(value), maxLength).replace(/["\\]/g, '\\$&');
50
+ }
51
+ /**
52
+ * Escape a value for use inside CSS attribute selector quotes.
53
+ * Follows CSS string serialization spec:
54
+ * - Null (U+0000) -> U+FFFD replacement character
55
+ * - Control chars (U+0001-U+001F, U+007F) -> hex escape with trailing space
56
+ * - Quotes and backslashes -> backslash escape
57
+ *
58
+ * Does NOT truncate or normalize. Use for exact-match selectors like [attr="value"].
59
+ *
60
+ * @param value - Raw attribute value
61
+ * @returns String safe for use in [attr="value"] selectors
62
+ */
63
+ export function escapeAttrSelectorValue(value) {
64
+ if (!value)
65
+ return '';
66
+ const result = [];
67
+ for (let i = 0; i < value.length; i++) {
68
+ const char = value.charAt(i);
69
+ const codeUnit = value.charCodeAt(i);
70
+ // Null character -> replacement character
71
+ if (codeUnit === 0) {
72
+ result.push('\uFFFD');
73
+ continue;
74
+ }
75
+ // Control characters (U+0001 to U+001F, U+007F) -> hex escape with trailing space
76
+ if ((codeUnit >= 0x0001 && codeUnit <= 0x001f) || codeUnit === 0x007f) {
77
+ result.push('\\' + codeUnit.toString(16) + ' ');
78
+ continue;
79
+ }
80
+ // Quotes and backslashes -> backslash escape
81
+ if (char === '"' || char === '\\') {
82
+ result.push('\\' + char);
83
+ continue;
84
+ }
85
+ result.push(char);
86
+ }
87
+ return result.join('');
88
+ }
89
+ /**
90
+ * Escape a name for use in Playwright-style role locators: role=button[name="..."]
91
+ * Only escapes quotes and backslashes - keeps control characters raw.
92
+ * Playwright's role engine matches against actual accessible names, not CSS.
93
+ *
94
+ * @param value - Raw accessible name
95
+ * @returns String safe for use in role=[name="value"] locators
96
+ */
97
+ export function escapeRoleLocatorName(value) {
98
+ if (!value)
99
+ return '';
100
+ return value.replace(/["\\]/g, '\\$&');
101
+ }
102
+ /**
103
+ * Escape a string for use in CSS selectors (CSS.escape() semantics).
104
+ * Does NOT truncate or normalize - uses raw value.
105
+ * Safe for ID selectors (#id), class selectors (.class), etc.
106
+ *
107
+ * Follows CSS.escape() specification:
108
+ * https://drafts.csswg.org/cssom/#the-css.escape()-method
109
+ *
110
+ * @param value - Raw string to escape
111
+ * @returns CSS-escaped string safe for use in selectors
112
+ */
113
+ export function cssEscape(value) {
114
+ if (!value)
115
+ return '';
116
+ const result = [];
117
+ const length = value.length;
118
+ for (let i = 0; i < length; i++) {
119
+ const char = value.charAt(i);
120
+ const codeUnit = value.charCodeAt(i);
121
+ // Null character -> U+FFFD replacement character
122
+ if (codeUnit === 0) {
123
+ result.push('\uFFFD');
124
+ continue;
125
+ }
126
+ // Control characters (U+0001 to U+001F, U+007F) -> unicode escape
127
+ if ((codeUnit >= 0x0001 && codeUnit <= 0x001f) || codeUnit === 0x007f) {
128
+ result.push('\\' + codeUnit.toString(16) + ' ');
129
+ continue;
130
+ }
131
+ // First character special rules
132
+ if (i === 0) {
133
+ // Digit as first character -> unicode escape
134
+ if (codeUnit >= 0x0030 && codeUnit <= 0x0039) {
135
+ result.push('\\' + codeUnit.toString(16) + ' ');
136
+ continue;
137
+ }
138
+ // Single hyphen -> escape
139
+ if (char === '-' && length === 1) {
140
+ result.push('\\-');
141
+ continue;
142
+ }
143
+ // Hyphen followed by digit -> escape the hyphen
144
+ if (char === '-' && length > 1) {
145
+ const nextCodeUnit = value.charCodeAt(1);
146
+ if (nextCodeUnit >= 0x0030 && nextCodeUnit <= 0x0039) {
147
+ result.push('\\-');
148
+ continue;
149
+ }
150
+ }
151
+ }
152
+ // Safe characters: letters, digits (not first), hyphen, underscore, non-ASCII
153
+ if (codeUnit >= 0x0080 || // Non-ASCII
154
+ char === '-' ||
155
+ char === '_' ||
156
+ (codeUnit >= 0x0030 && codeUnit <= 0x0039) || // 0-9
157
+ (codeUnit >= 0x0041 && codeUnit <= 0x005a) || // A-Z
158
+ (codeUnit >= 0x0061 && codeUnit <= 0x007a) // a-z
159
+ ) {
160
+ result.push(char);
161
+ continue;
162
+ }
163
+ // Everything else gets escaped with backslash
164
+ result.push('\\' + char);
165
+ }
166
+ return result.join('');
167
+ }
168
+ /**
169
+ * Escape string for XPath string literal
170
+ * XPath doesn't have a standard escape mechanism, so we handle quotes carefully
171
+ */
172
+ export function escapeXPathValue(value) {
173
+ if (value.includes("'")) {
174
+ if (value.includes('"')) {
175
+ // Contains both - use concat() to build the string
176
+ const parts = value.split("'");
177
+ return 'concat(' + parts.map((part) => `'${part}'`).join(', "\'", ') + ')';
178
+ }
179
+ // Contains only single quotes - wrap in double quotes
180
+ return `"${value}"`;
181
+ }
182
+ // No single quotes - use as-is (caller wraps in single quotes)
183
+ return value;
184
+ }
185
+ /**
186
+ * Tokenize text for XPath matching
187
+ * Takes first few significant words to avoid overly specific selectors
188
+ */
189
+ export function tokenizeForMatching(text, maxTokens = 3, minLength = 2) {
190
+ const normalized = normalizeText(text);
191
+ const words = normalized.split(' ').filter((word) => word.length > minLength);
192
+ return words.slice(0, maxTokens);
193
+ }
194
+ /**
195
+ * Check if two strings match using fuzzy token-based comparison
196
+ */
197
+ export function fuzzyTokenMatch(text, query, minMatchTokens = 2) {
198
+ const textTokens = new Set(tokenizeForMatching(text.toLowerCase(), 10, 2));
199
+ const queryTokens = tokenizeForMatching(query.toLowerCase(), 5, 2);
200
+ if (queryTokens.length === 0)
201
+ return false;
202
+ let matchCount = 0;
203
+ for (const token of queryTokens) {
204
+ if (textTokens.has(token)) {
205
+ matchCount++;
206
+ }
207
+ }
208
+ return matchCount >= Math.min(minMatchTokens, queryTokens.length);
209
+ }
210
+ // ============================================================================
211
+ // Fuzzy Matching Utilities
212
+ // ============================================================================
213
+ /**
214
+ * Calculate Levenshtein (edit) distance between two strings.
215
+ * Uses optimized single-row algorithm with O(min(m,n)) space.
216
+ */
217
+ export function levenshteinDistance(a, b) {
218
+ // Ensure a is the shorter string for space optimization
219
+ if (a.length > b.length) {
220
+ [a, b] = [b, a];
221
+ }
222
+ const m = a.length;
223
+ const n = b.length;
224
+ // Early exit for empty strings
225
+ if (m === 0)
226
+ return n;
227
+ if (n === 0)
228
+ return m;
229
+ // Single row of previous distances
230
+ let prevRow = new Array(m + 1);
231
+ let currRow = new Array(m + 1);
232
+ // Initialize first row
233
+ for (let i = 0; i <= m; i++) {
234
+ prevRow[i] = i;
235
+ }
236
+ // Fill in the rest
237
+ for (let j = 1; j <= n; j++) {
238
+ currRow[0] = j;
239
+ for (let i = 1; i <= m; i++) {
240
+ const cost = a[i - 1] === b[j - 1] ? 0 : 1;
241
+ currRow[i] = Math.min(prevRow[i] + 1, // deletion
242
+ currRow[i - 1] + 1, // insertion
243
+ prevRow[i - 1] + cost // substitution
244
+ );
245
+ }
246
+ // Swap rows
247
+ [prevRow, currRow] = [currRow, prevRow];
248
+ }
249
+ return prevRow[m];
250
+ }
251
+ /**
252
+ * Calculate similarity ratio (0-1) between two strings based on Levenshtein distance.
253
+ * Returns 1 for identical strings, 0 for completely different strings.
254
+ */
255
+ export function stringSimilarity(a, b) {
256
+ const maxLen = Math.max(a.length, b.length);
257
+ if (maxLen === 0)
258
+ return 1; // Both empty strings are identical
259
+ return 1 - levenshteinDistance(a, b) / maxLen;
260
+ }
261
+ /**
262
+ * Enhanced fuzzy token matching with similarity scoring.
263
+ * Supports exact matching, prefix matching, and edit distance similarity.
264
+ *
265
+ * @param textTokens - Tokens from the text being searched
266
+ * @param queryTokens - Tokens from the search query
267
+ * @param options - Matching options
268
+ * @returns Match result with score
269
+ */
270
+ export function fuzzyTokensMatch(textTokens, queryTokens, options = {}) {
271
+ const { minTokenOverlap = 0.5, prefixMatch = true, minSimilarity = 0.8 } = options;
272
+ if (queryTokens.length === 0) {
273
+ return { isMatch: false, score: 0 };
274
+ }
275
+ let totalScore = 0;
276
+ for (const queryToken of queryTokens) {
277
+ let bestMatch = 0;
278
+ for (const textToken of textTokens) {
279
+ // Exact match - perfect score
280
+ if (textToken === queryToken) {
281
+ bestMatch = 1;
282
+ break;
283
+ }
284
+ // Prefix match - high score (query token is prefix of text token)
285
+ if (prefixMatch && textToken.startsWith(queryToken)) {
286
+ bestMatch = Math.max(bestMatch, 0.9);
287
+ continue;
288
+ }
289
+ // Prefix match - query token contains text token (slightly lower)
290
+ if (prefixMatch && queryToken.startsWith(textToken)) {
291
+ bestMatch = Math.max(bestMatch, 0.85);
292
+ continue;
293
+ }
294
+ // Edit distance similarity - typo tolerance
295
+ const similarity = stringSimilarity(textToken, queryToken);
296
+ if (similarity >= minSimilarity) {
297
+ bestMatch = Math.max(bestMatch, similarity);
298
+ }
299
+ }
300
+ totalScore += bestMatch;
301
+ }
302
+ const overlapRatio = totalScore / queryTokens.length;
303
+ return {
304
+ isMatch: overlapRatio >= minTokenOverlap,
305
+ score: overlapRatio,
306
+ };
307
+ }
308
+ /** DOM node type constant for text nodes */
309
+ const TEXT_NODE_TYPE = 3;
310
+ /**
311
+ * Extract text content from a DOM node by concatenating text-node children.
312
+ * Uses depth-limited traversal to avoid performance issues.
313
+ *
314
+ * @param nodeId - Backend node ID of the element
315
+ * @param domNodes - Map of backendNodeId -> node with nodeType, nodeValue, childNodeIds
316
+ * @param maxDepth - Maximum depth to traverse (default: 2)
317
+ * @returns Normalized text content or undefined if none found
318
+ */
319
+ export function getTextContent(nodeId, domNodes, maxDepth = 2) {
320
+ const parts = [];
321
+ function traverse(currentNodeId, depth) {
322
+ if (depth > maxDepth)
323
+ return;
324
+ const node = domNodes.get(currentNodeId);
325
+ if (!node)
326
+ return;
327
+ // Collect text from text nodes
328
+ if (node.nodeType === TEXT_NODE_TYPE && node.nodeValue) {
329
+ const trimmed = node.nodeValue.trim();
330
+ if (trimmed) {
331
+ parts.push(trimmed);
332
+ }
333
+ }
334
+ // Traverse children
335
+ if (node.childNodeIds) {
336
+ for (const childId of node.childNodeIds) {
337
+ traverse(childId, depth + 1);
338
+ }
339
+ }
340
+ }
341
+ traverse(nodeId, 0);
342
+ if (parts.length === 0)
343
+ return undefined;
344
+ const result = normalizeText(parts.join(' '));
345
+ return result || undefined;
346
+ }
347
+ /**
348
+ * Escape special XML characters in a string.
349
+ * Used for XML element content and attribute values.
350
+ *
351
+ * @param str - String to escape
352
+ * @returns XML-safe string
353
+ */
354
+ export function escapeXml(str) {
355
+ if (!str)
356
+ return '';
357
+ return str
358
+ .replace(/&/g, '&amp;')
359
+ .replace(/</g, '&lt;')
360
+ .replace(/>/g, '&gt;')
361
+ .replace(/"/g, '&quot;')
362
+ .replace(/'/g, '&apos;');
363
+ }
364
+ /**
365
+ * Build an XML attribute string, choosing quote style to minimize escaping.
366
+ * Uses single quotes when value contains double quotes (common in selectors).
367
+ *
368
+ * @param name - Attribute name
369
+ * @param value - Attribute value
370
+ * @returns Formatted attribute string like `name="value"` or `name='value'`
371
+ */
372
+ export function xmlAttr(name, value) {
373
+ if (!value)
374
+ return `${name}=""`;
375
+ const hasDoubleQuote = value.includes('"');
376
+ const hasSingleQuote = value.includes("'");
377
+ // Prefer single quotes when value contains double quotes (common in selectors)
378
+ if (hasDoubleQuote && !hasSingleQuote) {
379
+ const escaped = value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');
380
+ return `${name}='${escaped}'`;
381
+ }
382
+ // Default: double-quote wrapping with full escaping
383
+ const escaped = value
384
+ .replace(/&/g, '&amp;')
385
+ .replace(/</g, '&lt;')
386
+ .replace(/>/g, '&gt;')
387
+ .replace(/"/g, '&quot;')
388
+ .replace(/'/g, '&apos;');
389
+ return `${name}="${escaped}"`;
390
+ }
391
+ //# sourceMappingURL=text-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-utils.js","sourceRoot":"","sources":["../../../src/lib/text-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /**
2
+ * EID Linker
3
+ *
4
+ * Links DOM observations to snapshot nodes by semantic matching.
5
+ * Since observations are captured in browser context (no access to CDP backend_node_id),
6
+ * we perform post-hoc matching after snapshot capture using semantic signals:
7
+ * - Tag → Kind mapping
8
+ * - Role matching
9
+ * - Label/text fuzzy matching
10
+ */
11
+ import type { DOMObservation, ObservationGroups, ObservationChild } from './observation.types.js';
12
+ import type { BaseSnapshot, ReadableNode, NodeKind } from '../snapshot/snapshot.types.js';
13
+ import type { ElementRegistry } from '../state/element-registry.js';
14
+ /**
15
+ * Configuration for observation-to-node matching.
16
+ */
17
+ export interface EidLinkerOptions {
18
+ /** Minimum score threshold for a valid match (0-1). Default: 0.5 */
19
+ minMatchScore?: number;
20
+ /** Enable fuzzy text matching. Default: true */
21
+ fuzzyTextMatch?: boolean;
22
+ /** Minimum token overlap for fuzzy matching. Default: 0.5 */
23
+ minTokenOverlap?: number;
24
+ }
25
+ /**
26
+ * Result of eid linking operation.
27
+ */
28
+ export interface EidLinkingResult {
29
+ /** Number of observations that were linked */
30
+ linked: number;
31
+ /** Number of observations that could not be linked */
32
+ unlinked: number;
33
+ /** Total observations processed */
34
+ total: number;
35
+ }
36
+ /**
37
+ * Link observations to snapshot nodes by computing eids.
38
+ *
39
+ * Mutates observations in-place, setting the `eid` field for matched observations.
40
+ * Only processes 'appeared' observations (disappeared elements don't exist in snapshot).
41
+ *
42
+ * @param observations - Observation groups to link
43
+ * @param snapshot - Current snapshot to match against
44
+ * @param registry - Element registry for eid lookup
45
+ * @param options - Matching configuration
46
+ * @returns Statistics about linking operation
47
+ */
48
+ export declare function linkObservationsToSnapshot(observations: ObservationGroups, snapshot: BaseSnapshot, registry: ElementRegistry, options?: EidLinkerOptions): EidLinkingResult;
49
+ /**
50
+ * Build an index of snapshot nodes by kind for efficient lookup.
51
+ *
52
+ * @param snapshot - Snapshot to index
53
+ * @returns Map from NodeKind to array of nodes
54
+ */
55
+ export declare function buildNodeIndex(snapshot: BaseSnapshot): Map<NodeKind, ReadableNode[]>;
56
+ /**
57
+ * Find the best matching node for an observation.
58
+ *
59
+ * @param observation - The observation to match
60
+ * @param nodeIndex - Pre-built index of nodes by kind
61
+ * @param options - Matching options
62
+ * @returns Best matching node or undefined if no match meets threshold
63
+ */
64
+ export declare function findBestMatch(observation: DOMObservation, nodeIndex: Map<NodeKind, ReadableNode[]>, options?: EidLinkerOptions): ReadableNode | undefined;
65
+ /**
66
+ * Get candidate NodeKind values for an observation based on tag and role.
67
+ */
68
+ export declare function getCandidateKinds(observation: DOMObservation): NodeKind[];
69
+ /**
70
+ * Compute match score between an observation and a snapshot node.
71
+ *
72
+ * Scoring breakdown:
73
+ * - Tag/Kind match: 0.3 (required - if no match, return 0)
74
+ * - Role match: 0.25
75
+ * - Label fuzzy match: 0.3
76
+ * - Dialog context match: 0.15
77
+ *
78
+ * @param observation - DOM observation
79
+ * @param node - Snapshot node
80
+ * @param options - Matching options
81
+ * @returns Score from 0-1 (0 = no match, 1 = perfect match)
82
+ */
83
+ export declare function computeMatchScore(observation: DOMObservation, node: ReadableNode, options?: EidLinkerOptions): number;
84
+ /**
85
+ * Build a pre-filtered list of interactive nodes for child extraction.
86
+ * This is O(n) and done once per snapshot, avoiding O(m*n) when processing m observations.
87
+ *
88
+ * @param snapshot - Snapshot to filter
89
+ * @returns Array of nodes that qualify as observation children
90
+ */
91
+ export declare function buildInteractiveNodeList(snapshot: BaseSnapshot): ReadableNode[];
92
+ /**
93
+ * Extract notable children from an observation's matched node.
94
+ *
95
+ * Finds interactive elements and headings that are visually contained within
96
+ * the observation container, up to MAX_OBSERVATION_CHILDREN limit.
97
+ *
98
+ * @param matchedNode - The snapshot node that matched the observation
99
+ * @param interactiveNodes - Pre-filtered list of interactive nodes (from buildInteractiveNodeList)
100
+ * @param registry - Element registry for eid lookup
101
+ * @returns Array of observation children (interactive elements and headings)
102
+ */
103
+ export declare function extractObservationChildren(matchedNode: ReadableNode, interactiveNodes: ReadableNode[], registry: ElementRegistry): ObservationChild[];
104
+ //# sourceMappingURL=eid-linker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eid-linker.d.ts","sourceRoot":"","sources":["../../../src/observation/eid-linker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAClG,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAOpE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oEAAoE;IACpE,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,gDAAgD;IAChD,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,6DAA6D;IAC7D,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,8CAA8C;IAC9C,MAAM,EAAE,MAAM,CAAC;IAEf,sDAAsD;IACtD,QAAQ,EAAE,MAAM,CAAC;IAEjB,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;CACf;AA2GD;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,YAAY,EAAE,iBAAiB,EAC/B,QAAQ,EAAE,YAAY,EACtB,QAAQ,EAAE,eAAe,EACzB,OAAO,GAAE,gBAAqB,GAC7B,gBAAgB,CAkDlB;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,GAAG,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,CAWpF;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,cAAc,EAC3B,SAAS,EAAE,GAAG,CAAC,QAAQ,EAAE,YAAY,EAAE,CAAC,EACxC,OAAO,GAAE,gBAAqB,GAC7B,YAAY,GAAG,SAAS,CAgC1B;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,cAAc,GAAG,QAAQ,EAAE,CAyBzE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,cAAc,EAC3B,IAAI,EAAE,YAAY,EAClB,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAkDR;AA0CD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,YAAY,GAAG,YAAY,EAAE,CAE/E;AAgDD;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,YAAY,EACzB,gBAAgB,EAAE,YAAY,EAAE,EAChC,QAAQ,EAAE,eAAe,GACxB,gBAAgB,EAAE,CAuBpB"}