agent-web-interface 4.3.0 → 4.5.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 (461) hide show
  1. package/dist/src/browser/browser-session-config.d.ts +33 -0
  2. package/dist/src/browser/browser-session-config.d.ts.map +1 -0
  3. package/dist/src/browser/browser-session-config.js +24 -0
  4. package/dist/src/browser/browser-session-config.js.map +1 -0
  5. package/dist/src/browser/connection-utils.d.ts +48 -0
  6. package/dist/src/browser/connection-utils.d.ts.map +1 -0
  7. package/dist/src/browser/connection-utils.js +129 -0
  8. package/dist/src/browser/connection-utils.js.map +1 -0
  9. package/dist/src/browser/ensure-browser.d.ts +12 -27
  10. package/dist/src/browser/ensure-browser.d.ts.map +1 -1
  11. package/dist/src/browser/ensure-browser.js +104 -37
  12. package/dist/src/browser/ensure-browser.js.map +1 -1
  13. package/dist/src/browser/index.d.ts +4 -1
  14. package/dist/src/browser/index.d.ts.map +1 -1
  15. package/dist/src/browser/index.js +3 -1
  16. package/dist/src/browser/index.js.map +1 -1
  17. package/dist/src/browser/session-manager.d.ts +21 -89
  18. package/dist/src/browser/session-manager.d.ts.map +1 -1
  19. package/dist/src/browser/session-manager.js +122 -132
  20. package/dist/src/browser/session-manager.js.map +1 -1
  21. package/dist/src/browser/session-manager.types.d.ts +102 -0
  22. package/dist/src/browser/session-manager.types.d.ts.map +1 -0
  23. package/dist/src/browser/session-manager.types.js +11 -0
  24. package/dist/src/browser/session-manager.types.js.map +1 -0
  25. package/dist/src/cli/args.d.ts +12 -18
  26. package/dist/src/cli/args.d.ts.map +1 -1
  27. package/dist/src/cli/args.js +35 -40
  28. package/dist/src/cli/args.js.map +1 -1
  29. package/dist/src/form/constraint-extraction.d.ts +36 -0
  30. package/dist/src/form/constraint-extraction.d.ts.map +1 -0
  31. package/dist/src/form/constraint-extraction.js +117 -0
  32. package/dist/src/form/constraint-extraction.js.map +1 -0
  33. package/dist/src/form/field-extractor.d.ts.map +1 -1
  34. package/dist/src/form/field-extractor.js +16 -450
  35. package/dist/src/form/field-extractor.js.map +1 -1
  36. package/dist/src/form/field-state-extractor.d.ts +22 -0
  37. package/dist/src/form/field-state-extractor.d.ts.map +1 -0
  38. package/dist/src/form/field-state-extractor.js +55 -0
  39. package/dist/src/form/field-state-extractor.js.map +1 -0
  40. package/dist/src/form/form-actions.d.ts +45 -0
  41. package/dist/src/form/form-actions.d.ts.map +1 -0
  42. package/dist/src/form/form-actions.js +108 -0
  43. package/dist/src/form/form-actions.js.map +1 -0
  44. package/dist/src/form/form-detector.d.ts +0 -36
  45. package/dist/src/form/form-detector.d.ts.map +1 -1
  46. package/dist/src/form/form-detector.js +11 -376
  47. package/dist/src/form/form-detector.js.map +1 -1
  48. package/dist/src/form/form-state.d.ts.map +1 -1
  49. package/dist/src/form/form-state.js +16 -4
  50. package/dist/src/form/form-state.js.map +1 -1
  51. package/dist/src/form/input-clustering.d.ts +15 -0
  52. package/dist/src/form/input-clustering.d.ts.map +1 -0
  53. package/dist/src/form/input-clustering.js +61 -0
  54. package/dist/src/form/input-clustering.js.map +1 -0
  55. package/dist/src/form/intent-inference.d.ts +28 -0
  56. package/dist/src/form/intent-inference.d.ts.map +1 -0
  57. package/dist/src/form/intent-inference.js +137 -0
  58. package/dist/src/form/intent-inference.js.map +1 -0
  59. package/dist/src/form/purpose-inference.d.ts +50 -0
  60. package/dist/src/form/purpose-inference.d.ts.map +1 -0
  61. package/dist/src/form/purpose-inference.js +313 -0
  62. package/dist/src/form/purpose-inference.js.map +1 -0
  63. package/dist/src/form/submit-detection.d.ts +36 -0
  64. package/dist/src/form/submit-detection.d.ts.map +1 -0
  65. package/dist/src/form/submit-detection.js +101 -0
  66. package/dist/src/form/submit-detection.js.map +1 -0
  67. package/dist/src/form/types.d.ts +2 -2
  68. package/dist/src/gateway/http-gateway.d.ts +56 -0
  69. package/dist/src/gateway/http-gateway.d.ts.map +1 -0
  70. package/dist/src/gateway/http-gateway.js +229 -0
  71. package/dist/src/gateway/http-gateway.js.map +1 -0
  72. package/dist/src/gateway/json-rpc-errors.d.ts +6 -0
  73. package/dist/src/gateway/json-rpc-errors.d.ts.map +1 -0
  74. package/dist/src/gateway/json-rpc-errors.js +11 -0
  75. package/dist/src/gateway/json-rpc-errors.js.map +1 -0
  76. package/dist/src/gateway/session-router.d.ts +80 -0
  77. package/dist/src/gateway/session-router.d.ts.map +1 -0
  78. package/dist/src/gateway/session-router.js +177 -0
  79. package/dist/src/gateway/session-router.js.map +1 -0
  80. package/dist/src/http-entry.d.ts +20 -0
  81. package/dist/src/http-entry.d.ts.map +1 -0
  82. package/dist/src/http-entry.js +112 -0
  83. package/dist/src/http-entry.js.map +1 -0
  84. package/dist/src/index.d.ts +1 -10
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js +25 -227
  87. package/dist/src/index.js.map +1 -1
  88. package/dist/src/lib/text-utils.d.ts +0 -24
  89. package/dist/src/lib/text-utils.d.ts.map +1 -1
  90. package/dist/src/lib/text-utils.js +2 -38
  91. package/dist/src/lib/text-utils.js.map +1 -1
  92. package/dist/src/observation/eid-linker.d.ts.map +1 -1
  93. package/dist/src/observation/eid-linker.js +1 -21
  94. package/dist/src/observation/eid-linker.js.map +1 -1
  95. package/dist/src/observation/observation-accumulator.d.ts +1 -1
  96. package/dist/src/observation/observation-accumulator.js +1 -1
  97. package/dist/src/observation/observer-script.d.ts +1 -1
  98. package/dist/src/observation/observer-script.d.ts.map +1 -1
  99. package/dist/src/observation/observer-script.js +129 -7
  100. package/dist/src/observation/observer-script.js.map +1 -1
  101. package/dist/src/query/disambiguation.d.ts +18 -0
  102. package/dist/src/query/disambiguation.d.ts.map +1 -0
  103. package/dist/src/query/disambiguation.js +123 -0
  104. package/dist/src/query/disambiguation.js.map +1 -0
  105. package/dist/src/query/fuzzy-match.d.ts +17 -0
  106. package/dist/src/query/fuzzy-match.d.ts.map +1 -0
  107. package/dist/src/query/fuzzy-match.js +34 -0
  108. package/dist/src/query/fuzzy-match.js.map +1 -0
  109. package/dist/src/query/index.d.ts +3 -0
  110. package/dist/src/query/index.d.ts.map +1 -1
  111. package/dist/src/query/index.js +6 -0
  112. package/dist/src/query/index.js.map +1 -1
  113. package/dist/src/query/query-engine.d.ts +0 -35
  114. package/dist/src/query/query-engine.d.ts.map +1 -1
  115. package/dist/src/query/query-engine.js +9 -309
  116. package/dist/src/query/query-engine.js.map +1 -1
  117. package/dist/src/query/scoring.d.ts +52 -0
  118. package/dist/src/query/scoring.d.ts.map +1 -0
  119. package/dist/src/query/scoring.js +162 -0
  120. package/dist/src/query/scoring.js.map +1 -0
  121. package/dist/src/server/index.d.ts +0 -1
  122. package/dist/src/server/index.d.ts.map +1 -1
  123. package/dist/src/server/index.js +0 -1
  124. package/dist/src/server/index.js.map +1 -1
  125. package/dist/src/server/mcp-server.d.ts +6 -2
  126. package/dist/src/server/mcp-server.d.ts.map +1 -1
  127. package/dist/src/server/mcp-server.js +3 -91
  128. package/dist/src/server/mcp-server.js.map +1 -1
  129. package/dist/src/server/server-config.d.ts +4 -20
  130. package/dist/src/server/server-config.d.ts.map +1 -1
  131. package/dist/src/server/server-config.js +6 -50
  132. package/dist/src/server/server-config.js.map +1 -1
  133. package/dist/src/server/tool-registrar.types.d.ts +25 -0
  134. package/dist/src/server/tool-registrar.types.d.ts.map +1 -0
  135. package/dist/src/server/tool-registrar.types.js +10 -0
  136. package/dist/src/server/tool-registrar.types.js.map +1 -0
  137. package/dist/src/server/tool-result-handler.d.ts +61 -0
  138. package/dist/src/server/tool-result-handler.d.ts.map +1 -0
  139. package/dist/src/server/tool-result-handler.js +137 -0
  140. package/dist/src/server/tool-result-handler.js.map +1 -0
  141. package/dist/src/session/session-controller.d.ts +123 -0
  142. package/dist/src/session/session-controller.d.ts.map +1 -0
  143. package/dist/src/session/session-controller.js +273 -0
  144. package/dist/src/session/session-controller.js.map +1 -0
  145. package/dist/src/shared/services/index.d.ts +0 -2
  146. package/dist/src/shared/services/index.d.ts.map +1 -1
  147. package/dist/src/shared/services/index.js +0 -2
  148. package/dist/src/shared/services/index.js.map +1 -1
  149. package/dist/src/shared/version.d.ts +10 -0
  150. package/dist/src/shared/version.d.ts.map +1 -0
  151. package/dist/src/shared/version.js +32 -0
  152. package/dist/src/shared/version.js.map +1 -0
  153. package/dist/src/snapshot/element-resolver.d.ts +27 -15
  154. package/dist/src/snapshot/element-resolver.d.ts.map +1 -1
  155. package/dist/src/snapshot/element-resolver.js +196 -91
  156. package/dist/src/snapshot/element-resolver.js.map +1 -1
  157. package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -1
  158. package/dist/src/snapshot/extractors/attribute-extractor.js +4 -0
  159. package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -1
  160. package/dist/src/snapshot/extractors/ax-extractor.d.ts +1 -1
  161. package/dist/src/snapshot/extractors/ax-extractor.d.ts.map +1 -1
  162. package/dist/src/snapshot/extractors/ax-extractor.js +4 -1
  163. package/dist/src/snapshot/extractors/ax-extractor.js.map +1 -1
  164. package/dist/src/snapshot/extractors/index.d.ts +1 -1
  165. package/dist/src/snapshot/extractors/index.d.ts.map +1 -1
  166. package/dist/src/snapshot/extractors/index.js +1 -1
  167. package/dist/src/snapshot/extractors/index.js.map +1 -1
  168. package/dist/src/snapshot/extractors/layout-extractor.d.ts +9 -7
  169. package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -1
  170. package/dist/src/snapshot/extractors/layout-extractor.js +34 -19
  171. package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -1
  172. package/dist/src/snapshot/extractors/region-resolver.d.ts.map +1 -1
  173. package/dist/src/snapshot/extractors/region-resolver.js +8 -0
  174. package/dist/src/snapshot/extractors/region-resolver.js.map +1 -1
  175. package/dist/src/snapshot/extractors/state-extractor.d.ts +2 -2
  176. package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -1
  177. package/dist/src/snapshot/extractors/state-extractor.js +22 -2
  178. package/dist/src/snapshot/extractors/state-extractor.js.map +1 -1
  179. package/dist/src/snapshot/extractors/types.d.ts +14 -0
  180. package/dist/src/snapshot/extractors/types.d.ts.map +1 -1
  181. package/dist/src/snapshot/extractors/types.js +16 -0
  182. package/dist/src/snapshot/extractors/types.js.map +1 -1
  183. package/dist/src/snapshot/frame-context.d.ts +68 -0
  184. package/dist/src/snapshot/frame-context.d.ts.map +1 -0
  185. package/dist/src/snapshot/frame-context.js +131 -0
  186. package/dist/src/snapshot/frame-context.js.map +1 -0
  187. package/dist/src/snapshot/heading-index.d.ts +28 -0
  188. package/dist/src/snapshot/heading-index.d.ts.map +1 -0
  189. package/dist/src/snapshot/heading-index.js +108 -0
  190. package/dist/src/snapshot/heading-index.js.map +1 -0
  191. package/dist/src/snapshot/index.d.ts +5 -3
  192. package/dist/src/snapshot/index.d.ts.map +1 -1
  193. package/dist/src/snapshot/index.js +3 -2
  194. package/dist/src/snapshot/index.js.map +1 -1
  195. package/dist/src/snapshot/kind-mapping.d.ts +30 -0
  196. package/dist/src/snapshot/kind-mapping.d.ts.map +1 -0
  197. package/dist/src/snapshot/kind-mapping.js +114 -0
  198. package/dist/src/snapshot/kind-mapping.js.map +1 -0
  199. package/dist/src/snapshot/node-filter.d.ts +31 -0
  200. package/dist/src/snapshot/node-filter.d.ts.map +1 -0
  201. package/dist/src/snapshot/node-filter.js +137 -0
  202. package/dist/src/snapshot/node-filter.js.map +1 -0
  203. package/dist/src/snapshot/node-synthesizer.d.ts +62 -0
  204. package/dist/src/snapshot/node-synthesizer.d.ts.map +1 -0
  205. package/dist/src/snapshot/node-synthesizer.js +185 -0
  206. package/dist/src/snapshot/node-synthesizer.js.map +1 -0
  207. package/dist/src/snapshot/snapshot-compiler.d.ts +2 -36
  208. package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -1
  209. package/dist/src/snapshot/snapshot-compiler.js +40 -549
  210. package/dist/src/snapshot/snapshot-compiler.js.map +1 -1
  211. package/dist/src/snapshot/snapshot.types.d.ts +17 -3
  212. package/dist/src/snapshot/snapshot.types.d.ts.map +1 -1
  213. package/dist/src/snapshot/snapshot.types.js +8 -0
  214. package/dist/src/snapshot/snapshot.types.js.map +1 -1
  215. package/dist/src/state/actionables-filter.d.ts +5 -0
  216. package/dist/src/state/actionables-filter.d.ts.map +1 -1
  217. package/dist/src/state/actionables-filter.js +28 -6
  218. package/dist/src/state/actionables-filter.js.map +1 -1
  219. package/dist/src/state/atoms-extractor.d.ts.map +1 -1
  220. package/dist/src/state/atoms-extractor.js +3 -23
  221. package/dist/src/state/atoms-extractor.js.map +1 -1
  222. package/dist/src/state/diff-engine.d.ts.map +1 -1
  223. package/dist/src/state/diff-engine.js +9 -36
  224. package/dist/src/state/diff-engine.js.map +1 -1
  225. package/dist/src/state/element-identity.d.ts +3 -6
  226. package/dist/src/state/element-identity.d.ts.map +1 -1
  227. package/dist/src/state/element-identity.js +10 -7
  228. package/dist/src/state/element-identity.js.map +1 -1
  229. package/dist/src/state/element-ref.types.d.ts +5 -27
  230. package/dist/src/state/element-ref.types.d.ts.map +1 -1
  231. package/dist/src/state/element-registry.d.ts.map +1 -1
  232. package/dist/src/state/element-registry.js +6 -4
  233. package/dist/src/state/element-registry.js.map +1 -1
  234. package/dist/src/state/hash-utils.d.ts +24 -0
  235. package/dist/src/state/hash-utils.d.ts.map +1 -0
  236. package/dist/src/state/hash-utils.js +41 -0
  237. package/dist/src/state/hash-utils.js.map +1 -0
  238. package/dist/src/state/layer-detector.d.ts.map +1 -1
  239. package/dist/src/state/layer-detector.js +15 -286
  240. package/dist/src/state/layer-detector.js.map +1 -1
  241. package/dist/src/state/layer-detectors/drawer-detector.d.ts +32 -0
  242. package/dist/src/state/layer-detectors/drawer-detector.d.ts.map +1 -0
  243. package/dist/src/state/layer-detectors/drawer-detector.js +96 -0
  244. package/dist/src/state/layer-detectors/drawer-detector.js.map +1 -0
  245. package/dist/src/state/layer-detectors/index.d.ts +10 -0
  246. package/dist/src/state/layer-detectors/index.d.ts.map +1 -0
  247. package/dist/src/state/layer-detectors/index.js +10 -0
  248. package/dist/src/state/layer-detectors/index.js.map +1 -0
  249. package/dist/src/state/layer-detectors/modal-detector.d.ts +30 -0
  250. package/dist/src/state/layer-detectors/modal-detector.d.ts.map +1 -0
  251. package/dist/src/state/layer-detectors/modal-detector.js +127 -0
  252. package/dist/src/state/layer-detectors/modal-detector.js.map +1 -0
  253. package/dist/src/state/layer-detectors/popover-detector.d.ts +20 -0
  254. package/dist/src/state/layer-detectors/popover-detector.d.ts.map +1 -0
  255. package/dist/src/state/layer-detectors/popover-detector.js +76 -0
  256. package/dist/src/state/layer-detectors/popover-detector.js.map +1 -0
  257. package/dist/src/state/layer-detectors/toast-detector.d.ts +24 -0
  258. package/dist/src/state/layer-detectors/toast-detector.d.ts.map +1 -0
  259. package/dist/src/state/layer-detectors/toast-detector.js +48 -0
  260. package/dist/src/state/layer-detectors/toast-detector.js.map +1 -0
  261. package/dist/src/state/region-mapping.d.ts +13 -0
  262. package/dist/src/state/region-mapping.d.ts.map +1 -0
  263. package/dist/src/state/region-mapping.js +25 -0
  264. package/dist/src/state/region-mapping.js.map +1 -0
  265. package/dist/src/state/state-manager.d.ts.map +1 -1
  266. package/dist/src/state/state-manager.js +11 -193
  267. package/dist/src/state/state-manager.js.map +1 -1
  268. package/dist/src/state/state-renderer.d.ts.map +1 -1
  269. package/dist/src/state/state-renderer.js +17 -3
  270. package/dist/src/state/state-renderer.js.map +1 -1
  271. package/dist/src/state/types.d.ts +10 -5
  272. package/dist/src/state/types.d.ts.map +1 -1
  273. package/dist/src/state/url-sanitization.d.ts +22 -0
  274. package/dist/src/state/url-sanitization.d.ts.map +1 -0
  275. package/dist/src/state/url-sanitization.js +76 -0
  276. package/dist/src/state/url-sanitization.js.map +1 -0
  277. package/dist/src/state/value-masking.d.ts +36 -0
  278. package/dist/src/state/value-masking.d.ts.map +1 -0
  279. package/dist/src/state/value-masking.js +86 -0
  280. package/dist/src/state/value-masking.js.map +1 -0
  281. package/dist/src/tools/action-context.d.ts +55 -0
  282. package/dist/src/tools/action-context.d.ts.map +1 -0
  283. package/dist/src/tools/action-context.js +69 -0
  284. package/dist/src/tools/action-context.js.map +1 -0
  285. package/dist/src/tools/action-stabilization.d.ts +48 -0
  286. package/dist/src/tools/action-stabilization.d.ts.map +1 -0
  287. package/dist/src/tools/action-stabilization.js +93 -0
  288. package/dist/src/tools/action-stabilization.js.map +1 -0
  289. package/dist/src/tools/browser-tools.d.ts +9 -167
  290. package/dist/src/tools/browser-tools.d.ts.map +1 -1
  291. package/dist/src/tools/browser-tools.js +15 -651
  292. package/dist/src/tools/browser-tools.js.map +1 -1
  293. package/dist/src/tools/canvas-tools.d.ts +2 -1
  294. package/dist/src/tools/canvas-tools.d.ts.map +1 -1
  295. package/dist/src/tools/canvas-tools.js +5 -7
  296. package/dist/src/tools/canvas-tools.js.map +1 -1
  297. package/dist/src/tools/effect-tracker.d.ts +25 -0
  298. package/dist/src/tools/effect-tracker.d.ts.map +1 -0
  299. package/dist/src/tools/effect-tracker.js +69 -0
  300. package/dist/src/tools/effect-tracker.js.map +1 -0
  301. package/dist/src/tools/errors.d.ts +2 -34
  302. package/dist/src/tools/errors.d.ts.map +1 -1
  303. package/dist/src/tools/errors.js +1 -44
  304. package/dist/src/tools/errors.js.map +1 -1
  305. package/dist/src/tools/execute-action.d.ts +5 -34
  306. package/dist/src/tools/execute-action.d.ts.map +1 -1
  307. package/dist/src/tools/execute-action.js +37 -297
  308. package/dist/src/tools/execute-action.js.map +1 -1
  309. package/dist/src/tools/form-tools.d.ts +5 -10
  310. package/dist/src/tools/form-tools.d.ts.map +1 -1
  311. package/dist/src/tools/form-tools.js +42 -22
  312. package/dist/src/tools/form-tools.js.map +1 -1
  313. package/dist/src/tools/index.d.ts +6 -6
  314. package/dist/src/tools/index.d.ts.map +1 -1
  315. package/dist/src/tools/index.js +16 -17
  316. package/dist/src/tools/index.js.map +1 -1
  317. package/dist/src/tools/interaction-tools.d.ts +47 -0
  318. package/dist/src/tools/interaction-tools.d.ts.map +1 -0
  319. package/dist/src/tools/interaction-tools.js +135 -0
  320. package/dist/src/tools/interaction-tools.js.map +1 -0
  321. package/dist/src/tools/navigation-detection.d.ts +31 -0
  322. package/dist/src/tools/navigation-detection.d.ts.map +1 -0
  323. package/dist/src/tools/navigation-detection.js +46 -0
  324. package/dist/src/tools/navigation-detection.js.map +1 -0
  325. package/dist/src/tools/navigation-tools.d.ts +51 -0
  326. package/dist/src/tools/navigation-tools.d.ts.map +1 -0
  327. package/dist/src/tools/navigation-tools.js +171 -0
  328. package/dist/src/tools/navigation-tools.js.map +1 -0
  329. package/dist/src/tools/observation-tools.d.ts +54 -0
  330. package/dist/src/tools/observation-tools.d.ts.map +1 -0
  331. package/dist/src/tools/observation-tools.js +243 -0
  332. package/dist/src/tools/observation-tools.js.map +1 -0
  333. package/dist/src/tools/readability-tools.d.ts +16 -0
  334. package/dist/src/tools/readability-tools.d.ts.map +1 -0
  335. package/dist/src/tools/readability-tools.js +45 -0
  336. package/dist/src/tools/readability-tools.js.map +1 -0
  337. package/dist/src/tools/response-builder.d.ts +20 -32
  338. package/dist/src/tools/response-builder.d.ts.map +1 -1
  339. package/dist/src/tools/response-builder.js +32 -48
  340. package/dist/src/tools/response-builder.js.map +1 -1
  341. package/dist/src/tools/stale-element-retry.d.ts +37 -0
  342. package/dist/src/tools/stale-element-retry.d.ts.map +1 -0
  343. package/dist/src/tools/stale-element-retry.js +103 -0
  344. package/dist/src/tools/stale-element-retry.js.map +1 -0
  345. package/dist/src/tools/tool-context.d.ts +4 -36
  346. package/dist/src/tools/tool-context.d.ts.map +1 -1
  347. package/dist/src/tools/tool-context.js +6 -75
  348. package/dist/src/tools/tool-context.js.map +1 -1
  349. package/dist/src/tools/tool-context.types.d.ts +141 -0
  350. package/dist/src/tools/tool-context.types.d.ts.map +1 -0
  351. package/dist/src/tools/tool-context.types.js +11 -0
  352. package/dist/src/tools/tool-context.types.js.map +1 -0
  353. package/dist/src/tools/tool-registration.d.ts +25 -0
  354. package/dist/src/tools/tool-registration.d.ts.map +1 -0
  355. package/dist/src/tools/tool-registration.js +180 -0
  356. package/dist/src/tools/tool-registration.js.map +1 -0
  357. package/dist/src/tools/tool-schemas.d.ts +176 -1950
  358. package/dist/src/tools/tool-schemas.d.ts.map +1 -1
  359. package/dist/src/tools/tool-schemas.js +80 -320
  360. package/dist/src/tools/tool-schemas.js.map +1 -1
  361. package/dist/src/tools/viewport-tools.d.ts +37 -0
  362. package/dist/src/tools/viewport-tools.d.ts.map +1 -0
  363. package/dist/src/tools/viewport-tools.js +101 -0
  364. package/dist/src/tools/viewport-tools.js.map +1 -0
  365. package/dist/src/worker/chrome-worker-process.d.ts +4 -0
  366. package/dist/src/worker/chrome-worker-process.d.ts.map +1 -1
  367. package/dist/src/worker/chrome-worker-process.js +1 -1
  368. package/dist/src/worker/chrome-worker-process.js.map +1 -1
  369. package/package.json +7 -3
  370. package/dist/src/factpack/action-selector.d.ts +0 -36
  371. package/dist/src/factpack/action-selector.d.ts.map +0 -1
  372. package/dist/src/factpack/action-selector.js +0 -367
  373. package/dist/src/factpack/action-selector.js.map +0 -1
  374. package/dist/src/factpack/dialog-detector.d.ts +0 -19
  375. package/dist/src/factpack/dialog-detector.d.ts.map +0 -1
  376. package/dist/src/factpack/dialog-detector.js +0 -354
  377. package/dist/src/factpack/dialog-detector.js.map +0 -1
  378. package/dist/src/factpack/form-detector.d.ts +0 -28
  379. package/dist/src/factpack/form-detector.d.ts.map +0 -1
  380. package/dist/src/factpack/form-detector.js +0 -555
  381. package/dist/src/factpack/form-detector.js.map +0 -1
  382. package/dist/src/factpack/index.d.ts +0 -32
  383. package/dist/src/factpack/index.d.ts.map +0 -1
  384. package/dist/src/factpack/index.js +0 -73
  385. package/dist/src/factpack/index.js.map +0 -1
  386. package/dist/src/factpack/page-classifier.d.ts +0 -22
  387. package/dist/src/factpack/page-classifier.d.ts.map +0 -1
  388. package/dist/src/factpack/page-classifier.js +0 -526
  389. package/dist/src/factpack/page-classifier.js.map +0 -1
  390. package/dist/src/factpack/types.d.ts +0 -307
  391. package/dist/src/factpack/types.d.ts.map +0 -1
  392. package/dist/src/factpack/types.js +0 -12
  393. package/dist/src/factpack/types.js.map +0 -1
  394. package/dist/src/lib/constants.d.ts +0 -27
  395. package/dist/src/lib/constants.d.ts.map +0 -1
  396. package/dist/src/lib/constants.js +0 -63
  397. package/dist/src/lib/constants.js.map +0 -1
  398. package/dist/src/lib/index.d.ts +0 -12
  399. package/dist/src/lib/index.d.ts.map +0 -1
  400. package/dist/src/lib/index.js +0 -17
  401. package/dist/src/lib/index.js.map +0 -1
  402. package/dist/src/lib/regions.d.ts +0 -29
  403. package/dist/src/lib/regions.d.ts.map +0 -1
  404. package/dist/src/lib/regions.js +0 -93
  405. package/dist/src/lib/regions.js.map +0 -1
  406. package/dist/src/lib/scoring.d.ts +0 -47
  407. package/dist/src/lib/scoring.d.ts.map +0 -1
  408. package/dist/src/lib/scoring.js +0 -79
  409. package/dist/src/lib/scoring.js.map +0 -1
  410. package/dist/src/lib/selectors.d.ts +0 -42
  411. package/dist/src/lib/selectors.d.ts.map +0 -1
  412. package/dist/src/lib/selectors.js +0 -138
  413. package/dist/src/lib/selectors.js.map +0 -1
  414. package/dist/src/renderer/budget-manager.d.ts +0 -46
  415. package/dist/src/renderer/budget-manager.d.ts.map +0 -1
  416. package/dist/src/renderer/budget-manager.js +0 -133
  417. package/dist/src/renderer/budget-manager.js.map +0 -1
  418. package/dist/src/renderer/constants.d.ts +0 -38
  419. package/dist/src/renderer/constants.d.ts.map +0 -1
  420. package/dist/src/renderer/constants.js +0 -29
  421. package/dist/src/renderer/constants.js.map +0 -1
  422. package/dist/src/renderer/index.d.ts +0 -12
  423. package/dist/src/renderer/index.d.ts.map +0 -1
  424. package/dist/src/renderer/index.js +0 -16
  425. package/dist/src/renderer/index.js.map +0 -1
  426. package/dist/src/renderer/section-renderers.d.ts +0 -42
  427. package/dist/src/renderer/section-renderers.d.ts.map +0 -1
  428. package/dist/src/renderer/section-renderers.js +0 -252
  429. package/dist/src/renderer/section-renderers.js.map +0 -1
  430. package/dist/src/renderer/token-counter.d.ts +0 -45
  431. package/dist/src/renderer/token-counter.d.ts.map +0 -1
  432. package/dist/src/renderer/token-counter.js +0 -65
  433. package/dist/src/renderer/token-counter.js.map +0 -1
  434. package/dist/src/renderer/types.d.ts +0 -71
  435. package/dist/src/renderer/types.d.ts.map +0 -1
  436. package/dist/src/renderer/types.js +0 -7
  437. package/dist/src/renderer/types.js.map +0 -1
  438. package/dist/src/renderer/xml-renderer.d.ts +0 -42
  439. package/dist/src/renderer/xml-renderer.d.ts.map +0 -1
  440. package/dist/src/renderer/xml-renderer.js +0 -103
  441. package/dist/src/renderer/xml-renderer.js.map +0 -1
  442. package/dist/src/server/session-store.d.ts +0 -163
  443. package/dist/src/server/session-store.d.ts.map +0 -1
  444. package/dist/src/server/session-store.js +0 -248
  445. package/dist/src/server/session-store.js.map +0 -1
  446. package/dist/src/session/session-worker-binding.d.ts +0 -57
  447. package/dist/src/session/session-worker-binding.d.ts.map +0 -1
  448. package/dist/src/session/session-worker-binding.js +0 -109
  449. package/dist/src/session/session-worker-binding.js.map +0 -1
  450. package/dist/src/shared/services/dom-transformer.service.d.ts +0 -71
  451. package/dist/src/shared/services/dom-transformer.service.d.ts.map +0 -1
  452. package/dist/src/shared/services/dom-transformer.service.js +0 -190
  453. package/dist/src/shared/services/dom-transformer.service.js.map +0 -1
  454. package/dist/src/shared/services/selector-builder.service.d.ts +0 -53
  455. package/dist/src/shared/services/selector-builder.service.d.ts.map +0 -1
  456. package/dist/src/shared/services/selector-builder.service.js +0 -240
  457. package/dist/src/shared/services/selector-builder.service.js.map +0 -1
  458. package/dist/src/state/constants.d.ts +0 -125
  459. package/dist/src/state/constants.d.ts.map +0 -1
  460. package/dist/src/state/constants.js +0 -131
  461. package/dist/src/state/constants.js.map +0 -1
@@ -1 +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"}
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;AAQpE;;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;AAmBD;;;;;;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"}
@@ -8,6 +8,7 @@
8
8
  * - Role matching
9
9
  * - Label/text fuzzy matching
10
10
  */
11
+ import { isInteractiveKind } from '../state/actionables-filter.js';
11
12
  import { fuzzyTokensMatch, tokenizeForMatching } from '../lib/text-utils.js';
12
13
  // ============================================================================
13
14
  // Scoring Constants
@@ -287,27 +288,6 @@ export function computeMatchScore(observation, node, options = {}) {
287
288
  // ============================================================================
288
289
  /** Maximum number of children to extract per observation */
289
290
  const MAX_OBSERVATION_CHILDREN = 5;
290
- /** Interactive node kinds that qualify as observation children */
291
- const INTERACTIVE_KINDS = [
292
- 'button',
293
- 'link',
294
- 'input',
295
- 'textarea',
296
- 'select',
297
- 'combobox',
298
- 'checkbox',
299
- 'radio',
300
- 'switch',
301
- 'slider',
302
- 'tab',
303
- 'menuitem',
304
- ];
305
- /**
306
- * Check if a node kind is interactive (actionable).
307
- */
308
- function isInteractiveKind(kind) {
309
- return INTERACTIVE_KINDS.includes(kind);
310
- }
311
291
  /**
312
292
  * Check if a node qualifies as an extractable child (interactive or heading with label).
313
293
  */
@@ -1 +1 @@
1
- {"version":3,"file":"eid-linker.js","sourceRoot":"","sources":["../../../src/observation/eid-linker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"eid-linker.js","sourceRoot":"","sources":["../../../src/observation/eid-linker.ts"],"names":[],"mappings":"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"}
@@ -34,7 +34,7 @@ export declare class ObservationAccumulator {
34
34
  getObservations(page: Page, actionStartTime: number): Promise<ObservationGroups>;
35
35
  /**
36
36
  * Get accumulated observations without action context.
37
- * Used by capture_snapshot to report accumulated changes.
37
+ * Used by snapshot tool to report accumulated changes.
38
38
  */
39
39
  getAccumulatedObservations(page: Page): Promise<ObservationGroups>;
40
40
  /**
@@ -102,7 +102,7 @@ export class ObservationAccumulator {
102
102
  }
103
103
  /**
104
104
  * Get accumulated observations without action context.
105
- * Used by capture_snapshot to report accumulated changes.
105
+ * Used by snapshot tool to report accumulated changes.
106
106
  */
107
107
  async getAccumulatedObservations(page) {
108
108
  try {
@@ -15,5 +15,5 @@
15
15
  *
16
16
  * The script is returned as a string for page.evaluate().
17
17
  */
18
- export declare const OBSERVATION_OBSERVER_SCRIPT = "\n(function() {\n // Prevent double-injection\n if (window.__observationAccumulator) return;\n\n const MAX_ENTRIES = 500;\n const MAX_TEXT_LENGTH = 200;\n const MAX_SHADOW_OBSERVERS = 50; // Limit to prevent performance issues\n // IMPORTANT: Must match SIGNIFICANCE_THRESHOLD in observation.types.ts\n const SIGNIFICANCE_THRESHOLD = 4;\n // Node type constant for shadow root parent check\n const DOCUMENT_FRAGMENT_NODE = 11;\n\n // Significance weights (must match server-side observation.types.ts)\n const WEIGHTS = {\n // Semantic signals (strongest)\n hasAlertRole: 3,\n hasAriaLive: 3,\n isDialog: 3,\n\n // Visual signals\n isFixedOrSticky: 2,\n hasHighZIndex: 1,\n coversSignificantViewport: 2,\n\n // Structural signals\n isBodyDirectChild: 1,\n containsInteractiveElements: 1,\n\n // New universal signals - work without ARIA\n isVisibleInViewport: 2, // Element is visible in viewport\n hasNonTrivialText: 1, // Has meaningful text content\n // Temporal signals computed later\n };\n\n // Shadow DOM tracking\n // Map: shadowRoot -> { observer, hostPath }\n const shadowObservers = new Map();\n\n // Track processed elements to avoid duplicate observations\n // WeakSet allows garbage collection of removed elements\n let processedElements = new WeakSet();\n\n /**\n * Generate a stable identifier for an element (for shadow path tracking).\n * Format: TAG#id or TAG.className or TAG[index]\n */\n function getElementIdentifier(el) {\n const tag = el.tagName.toLowerCase();\n if (el.id) {\n return tag + '#' + el.id;\n }\n // For custom elements, use the tag name (usually descriptive like 'my-toast')\n if (tag.includes('-')) {\n return tag;\n }\n // Fallback: use first class or just tag\n const className = el.className && typeof el.className === 'string'\n ? el.className.split(' ')[0]\n : '';\n if (className) {\n return tag + '.' + className;\n }\n return tag;\n }\n\n // Tags whose text content should be excluded from extraction\n const EXCLUDED_TEXT_TAGS = new Set(['STYLE', 'SCRIPT', 'NOSCRIPT', 'TEMPLATE', 'SVG']);\n\n /**\n * Get clean text content from an element, excluding CSS/JS content.\n * Uses TreeWalker to iterate only text nodes, skipping those inside\n * excluded tags (STYLE, SCRIPT, NOSCRIPT, TEMPLATE, SVG).\n *\n * @param {Element} el - The DOM element to extract text from\n * @param {number} maxLength - Maximum text length (truncates result)\n * @returns {string} Clean text content, space-joined, truncated to maxLength\n */\n function getCleanTextContent(el, maxLength) {\n // If element itself is an excluded tag, return empty\n if (EXCLUDED_TEXT_TAGS.has(el.tagName.toUpperCase())) {\n return '';\n }\n\n const walker = document.createTreeWalker(el, 4, { // NodeFilter.SHOW_TEXT = 4\n acceptNode: function(node) {\n let parent = node.parentElement;\n while (parent && parent !== el) {\n if (EXCLUDED_TEXT_TAGS.has(parent.tagName.toUpperCase())) {\n return 2; // FILTER_REJECT\n }\n parent = parent.parentElement;\n }\n return 1; // FILTER_ACCEPT\n }\n });\n\n const textParts = [];\n let totalLength = 0;\n let node;\n\n while ((node = walker.nextNode()) && totalLength < maxLength) {\n const text = node.nodeValue;\n if (text) {\n const trimmed = text.trim();\n if (trimmed) {\n textParts.push(trimmed);\n totalLength += trimmed.length;\n }\n }\n }\n\n return textParts.join(' ').substring(0, maxLength);\n }\n\n /**\n * Compute significance signals from element.\n * Uses universal web standards (ARIA, CSS positioning, DOM structure, visibility).\n */\n function computeSignals(el, shadowPath) {\n const role = el.getAttribute('role');\n const ariaLive = el.getAttribute('aria-live');\n const ariaModal = el.getAttribute('aria-modal');\n const tagName = el.tagName.toLowerCase();\n\n // Get computed style (may fail for detached elements)\n let style = null;\n let rect = null;\n try {\n style = getComputedStyle(el);\n rect = el.getBoundingClientRect();\n } catch (e) {\n // Element may be detached\n }\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Check if element is visible in viewport\n const isVisibleInViewport = rect && style &&\n rect.width > 0 && rect.height > 0 &&\n rect.bottom > 0 && rect.top < vh &&\n rect.right > 0 && rect.left < vw &&\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0';\n\n // Check for non-trivial text (at least 3 chars, not just whitespace)\n // Use short sample for signal check - excludes style/script content\n const text = getCleanTextContent(el, 100);\n const hasNonTrivialText = text.length >= 3;\n\n // For shadow DOM elements, isBodyDirectChild is false but we still want to capture them\n // Check if parent is a shadow root (which indicates top-level in shadow DOM)\n const isTopLevelInShadow = shadowPath && shadowPath.length > 0 &&\n el.parentNode && el.parentNode.nodeType === DOCUMENT_FRAGMENT_NODE;\n\n return {\n // Semantic signals\n hasAlertRole: ['alert', 'status', 'log', 'alertdialog'].includes(role),\n hasAriaLive: ariaLive === 'polite' || ariaLive === 'assertive',\n isDialog: role === 'dialog' || tagName === 'dialog' || ariaModal === 'true',\n\n // Visual signals\n isFixedOrSticky: style && (style.position === 'fixed' || style.position === 'sticky'),\n // Note: parseInt returns NaN for non-numeric values like \"auto\", which correctly fails the > 1000 check\n hasHighZIndex: style && parseInt(style.zIndex, 10) > 1000,\n coversSignificantViewport: rect && ((rect.width > vw * 0.5) || (rect.height > vh * 0.3)),\n\n // Structural signals - consider top-level shadow DOM elements as equivalent to body children\n isBodyDirectChild: el.parentElement === document.body || isTopLevelInShadow,\n containsInteractiveElements: el.querySelector('button, a, input, select, textarea') !== null,\n\n // Universal signals (work without ARIA)\n isVisibleInViewport: !!isVisibleInViewport,\n hasNonTrivialText: hasNonTrivialText,\n\n // Temporal signals (set by accumulator later)\n appearedAfterDelay: false,\n wasShortLived: false,\n };\n }\n\n /**\n * Calculate significance score from signals using weighted sum.\n * @param signals - The computed significance signals for an element\n * @returns The total significance score\n */\n function computeSignificance(signals) {\n let score = 0;\n for (const [key, weight] of Object.entries(WEIGHTS)) {\n if (signals[key]) score += weight;\n }\n return score;\n }\n\n /**\n * Capture a mutation entry from an element.\n * @param node - The DOM node\n * @param type - 'added' or 'removed'\n * @param shadowPath - Optional array of shadow host identifiers\n */\n function captureEntry(node, type, shadowPath) {\n if (node.nodeType !== 1) return null; // Element nodes only\n\n const el = node;\n const signals = computeSignals(el, shadowPath);\n const significance = computeSignificance(signals);\n\n // Only capture if meets threshold\n if (significance < SIGNIFICANCE_THRESHOLD) return null;\n\n // Capture content - excludes style/script content\n const text = getCleanTextContent(el, MAX_TEXT_LENGTH);\n const hasInteractives = signals.containsInteractiveElements;\n\n // Get viewport coverage for later analysis\n let viewportCoverage = { widthPct: 0, heightPct: 0 };\n try {\n const rect = el.getBoundingClientRect();\n viewportCoverage = {\n widthPct: Math.round((rect.width / window.innerWidth) * 100),\n heightPct: Math.round((rect.height / window.innerHeight) * 100),\n };\n } catch (e) {\n // Element may be detached\n }\n\n // Get z-index\n let zIndex = 0;\n try {\n zIndex = parseInt(getComputedStyle(el).zIndex, 10) || 0;\n } catch (e) {\n // Element may be detached\n }\n\n const entry = {\n type: type,\n timestamp: Date.now(),\n tag: el.tagName.toLowerCase(),\n id: el.id || undefined,\n\n // Semantic attributes\n role: el.getAttribute('role') || undefined,\n ariaLive: el.getAttribute('aria-live') || undefined,\n ariaLabel: el.getAttribute('aria-label') || undefined,\n ariaModal: el.getAttribute('aria-modal') || undefined,\n\n // Content\n text: text,\n hasInteractives: hasInteractives,\n\n // Visual signals\n isFixedOrSticky: signals.isFixedOrSticky,\n zIndex: zIndex,\n viewportCoverage: viewportCoverage,\n\n // Structural\n isBodyDirectChild: signals.isBodyDirectChild,\n\n // Universal signals\n isVisibleInViewport: signals.isVisibleInViewport,\n hasNonTrivialText: signals.hasNonTrivialText,\n\n // Shadow DOM context\n shadowPath: shadowPath && shadowPath.length > 0 ? shadowPath : undefined,\n\n // Significance\n significance: significance,\n };\n\n return entry;\n }\n\n const log = [];\n const pageLoadTime = Date.now();\n\n /**\n * Process added nodes - capture entries and check for shadow roots.\n * @param node - The added node\n * @param shadowPath - Current shadow path context\n */\n function processAddedNode(node, shadowPath) {\n // Skip if already processed (prevents duplicates from nested shadow DOM)\n if (node.nodeType === 1 && processedElements.has(node)) {\n return;\n }\n\n const entry = captureEntry(node, 'added', shadowPath);\n if (entry) {\n entry.appearedAfterDelay = (entry.timestamp - pageLoadTime) > 100;\n log.push(entry);\n // Mark as processed\n if (node.nodeType === 1) {\n processedElements.add(node);\n }\n }\n\n // Check significant children - both ARIA-attributed and visible text elements\n if (node.nodeType === 1) {\n // First: ARIA-attributed elements (high confidence)\n const ariaChildren = node.querySelectorAll(\n '[role=\"alert\"], [role=\"status\"], [role=\"dialog\"], [role=\"alertdialog\"], [aria-live], [aria-modal], dialog'\n );\n for (const child of ariaChildren) {\n // Skip if already processed\n if (processedElements.has(child)) continue;\n\n const childEntry = captureEntry(child, 'added', shadowPath);\n if (childEntry) {\n childEntry.appearedAfterDelay = (childEntry.timestamp - pageLoadTime) > 100;\n log.push(childEntry);\n processedElements.add(child);\n }\n }\n\n // Second: Any visible element with text (broader capture for sites without ARIA)\n const textChildren = node.querySelectorAll('span, div, p, small, strong, em, label, li');\n for (const child of textChildren) {\n // Skip if already processed\n if (processedElements.has(child)) continue;\n\n // Skip if already captured via ARIA query\n if (child.hasAttribute('role') || child.hasAttribute('aria-live')) continue;\n\n // Only capture leaf-ish elements (minimal nested structure)\n const hasDeepNesting = child.querySelector('div, p, ul, ol, table');\n if (hasDeepNesting) continue;\n\n const childEntry = captureEntry(child, 'added', shadowPath);\n if (childEntry) {\n childEntry.appearedAfterDelay = (childEntry.timestamp - pageLoadTime) > 100;\n log.push(childEntry);\n processedElements.add(child);\n }\n }\n\n // Check for shadow roots in this element and its descendants\n checkAndObserveShadowRoots(node, shadowPath || []);\n }\n }\n\n /**\n * Process removed nodes - capture entries and cleanup shadow observers.\n * @param node - The removed node\n * @param shadowPath - Current shadow path context\n */\n function processRemovedNode(node, shadowPath) {\n const entry = captureEntry(node, 'removed', shadowPath);\n if (entry) {\n log.push(entry);\n }\n\n // Cleanup shadow observers for removed elements\n if (node.nodeType === 1) {\n cleanupShadowObservers(node);\n }\n }\n\n /**\n * Create a mutation callback for observing a specific context (main DOM or shadow root).\n * @param shadowPath - The shadow path context for this observer\n */\n function createMutationCallback(shadowPath) {\n return function(mutations) {\n for (const m of mutations) {\n // Capture added nodes\n for (const node of m.addedNodes) {\n processAddedNode(node, shadowPath);\n }\n\n // Capture removed nodes\n for (const node of m.removedNodes) {\n processRemovedNode(node, shadowPath);\n }\n }\n\n // Trim if over limit (FIFO)\n if (log.length > MAX_ENTRIES) {\n const excess = log.length - MAX_ENTRIES;\n log.splice(0, excess);\n }\n };\n }\n\n /**\n * Observe a shadow root for mutations.\n * @param shadowRoot - The shadow root to observe\n * @param shadowPath - The path of shadow host identifiers leading to this shadow root\n */\n function observeShadowRoot(shadowRoot, shadowPath) {\n // Already observing this shadow root\n if (shadowObservers.has(shadowRoot)) return;\n\n // Limit number of shadow observers for performance\n if (shadowObservers.size >= MAX_SHADOW_OBSERVERS) {\n console.warn('[ObservationAccumulator] Max shadow observers reached, skipping:', shadowPath);\n return;\n }\n\n const observer = new MutationObserver(createMutationCallback(shadowPath));\n observer.observe(shadowRoot, {\n childList: true,\n subtree: true,\n });\n\n shadowObservers.set(shadowRoot, { observer, hostPath: shadowPath });\n }\n\n /**\n * Recursively check element and descendants for open shadow roots.\n * @param element - The element to check\n * @param currentShadowPath - The current shadow path context\n * @param visited - Set of already-visited elements to prevent infinite recursion\n */\n function checkAndObserveShadowRoots(element, currentShadowPath, visited) {\n if (!element || element.nodeType !== 1) return;\n\n // Initialize visited set on first call\n if (!visited) {\n visited = new Set();\n }\n\n // Prevent infinite recursion from circular references\n if (visited.has(element)) return;\n visited.add(element);\n\n // Check if this element has an open shadow root\n if (element.shadowRoot) {\n const newPath = [...currentShadowPath, getElementIdentifier(element)];\n observeShadowRoot(element.shadowRoot, newPath);\n\n // Check shadow root's children for nested shadow roots\n const shadowChildren = element.shadowRoot.querySelectorAll('*');\n for (const child of shadowChildren) {\n if (child.shadowRoot) {\n checkAndObserveShadowRoots(child, newPath, visited);\n }\n }\n }\n\n // Check light DOM children for shadow roots\n const children = element.querySelectorAll('*');\n for (const child of children) {\n if (child.shadowRoot) {\n checkAndObserveShadowRoots(child, currentShadowPath, visited);\n }\n }\n }\n\n /**\n * Cleanup shadow observers for a removed element and its descendants.\n * @param element - The element being removed\n */\n function cleanupShadowObservers(element) {\n if (!element || element.nodeType !== 1) return;\n\n // If element is a shadow host, cleanup its observer\n if (element.shadowRoot && shadowObservers.has(element.shadowRoot)) {\n const { observer } = shadowObservers.get(element.shadowRoot);\n observer.disconnect();\n shadowObservers.delete(element.shadowRoot);\n }\n\n // Recursively cleanup descendant shadow hosts\n try {\n const descendants = element.querySelectorAll('*');\n for (const child of descendants) {\n if (child.shadowRoot && shadowObservers.has(child.shadowRoot)) {\n const { observer } = shadowObservers.get(child.shadowRoot);\n observer.disconnect();\n shadowObservers.delete(child.shadowRoot);\n }\n }\n } catch (e) {\n // Element may be detached, ignore errors\n }\n }\n\n // Create main observer for document.body\n const observer = new MutationObserver(createMutationCallback(null));\n\n // Start observing\n if (document.body) {\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n });\n\n // Initial scan for existing shadow roots in the DOM\n checkAndObserveShadowRoots(document.body, []);\n }\n\n window.__observationAccumulator = {\n log: log,\n observer: observer,\n shadowObservers: shadowObservers, // Expose for debugging/testing\n observedBody: document.body, // Track which body we're observing for staleness detection\n pageLoadTime: pageLoadTime,\n lastReportedIndex: 0, // Track what's been reported\n\n // Get all entries since timestamp\n getSince: function(timestamp) {\n return this.log.filter(e => e.timestamp >= timestamp);\n },\n\n // Get significant entries since timestamp\n getSignificant: function(timestamp, threshold) {\n threshold = threshold || SIGNIFICANCE_THRESHOLD;\n return this.log.filter(e => e.timestamp >= timestamp && e.significance >= threshold);\n },\n\n // Get unreported entries (for accumulation between tool calls)\n getUnreported: function() {\n const unreported = this.log.slice(this.lastReportedIndex);\n return unreported.filter(e => e.significance >= SIGNIFICANCE_THRESHOLD);\n },\n\n // Mark entries as reported\n markReported: function() {\n this.lastReportedIndex = this.log.length;\n },\n\n // Reset on navigation\n reset: function() {\n this.log.length = 0;\n this.lastReportedIndex = 0;\n this.pageLoadTime = Date.now();\n // Cleanup all shadow observers\n for (const [shadowRoot, { observer }] of this.shadowObservers) {\n observer.disconnect();\n }\n this.shadowObservers.clear();\n // Clear processed elements tracking (create fresh WeakSet)\n processedElements = new WeakSet();\n },\n\n // Re-scan for shadow roots (useful after dynamic content load)\n rescanShadowRoots: function() {\n if (document.body) {\n checkAndObserveShadowRoots(document.body, []);\n }\n },\n\n // Get shadow observer count (for debugging)\n getShadowObserverCount: function() {\n return this.shadowObservers.size;\n },\n };\n})();\n";
18
+ export declare const OBSERVATION_OBSERVER_SCRIPT = "\n(function() {\n // Prevent double-injection\n if (window.__observationAccumulator) return;\n\n const MAX_ENTRIES = 500;\n const MAX_TEXT_LENGTH = 200;\n const MAX_SHADOW_OBSERVERS = 50; // Limit to prevent performance issues\n // IMPORTANT: Must match SIGNIFICANCE_THRESHOLD in observation.types.ts\n const SIGNIFICANCE_THRESHOLD = 4;\n // Node type constant for shadow root parent check\n const DOCUMENT_FRAGMENT_NODE = 11;\n // ARIA roles that indicate live regions (text mutations are significant)\n const LIVE_REGION_ROLES = new Set(['alert', 'status', 'log', 'marquee', 'timer']);\n // Attributes whose changes can reveal hidden elements (visibility tracking)\n const VISIBILITY_ATTRS = ['style', 'class', 'hidden', 'aria-hidden'];\n\n // Known toast library selectors (unsemantic \u2014 no ARIA roles).\n // Keep in sync with TOAST_DATA_ATTRS / TOAST_CLASS_PATTERNS in snapshot-compiler.ts.\n const TOAST_LIBRARY_PARTS = [\n '[data-sonner-toaster]',\n '[data-sonner-toast]',\n '[data-hot-toast]',\n '.Toastify__toast-container',\n '.Toastify__toast',\n '.ant-message',\n '.ant-message-notice',\n ];\n const TOAST_LIBRARY_SELECTOR = TOAST_LIBRARY_PARTS.join(', ');\n\n // Significance weights (must match server-side observation.types.ts)\n const WEIGHTS = {\n // Semantic signals (strongest)\n hasAlertRole: 3,\n hasAriaLive: 3,\n isDialog: 3,\n\n // Visual signals\n isFixedOrSticky: 2,\n hasHighZIndex: 1,\n coversSignificantViewport: 2,\n\n // Structural signals\n isBodyDirectChild: 1,\n containsInteractiveElements: 1,\n\n // Known toast library patterns (unsemantic but significant)\n isKnownToastLibrary: 3, // Equivalent to hasAlertRole\n\n // New universal signals - work without ARIA\n isVisibleInViewport: 2, // Element is visible in viewport\n hasNonTrivialText: 1, // Has meaningful text content\n // Temporal signals computed later\n };\n\n // Shadow DOM tracking\n // Map: shadowRoot -> { observer, hostPath }\n const shadowObservers = new Map();\n\n // Track processed elements to avoid duplicate observations\n // WeakSet allows garbage collection of removed elements\n let processedElements = new WeakSet();\n\n /**\n * Generate a stable identifier for an element (for shadow path tracking).\n * Format: TAG#id or TAG.className or TAG[index]\n */\n function getElementIdentifier(el) {\n const tag = el.tagName.toLowerCase();\n if (el.id) {\n return tag + '#' + el.id;\n }\n // For custom elements, use the tag name (usually descriptive like 'my-toast')\n if (tag.includes('-')) {\n return tag;\n }\n // Fallback: use first class or just tag\n const className = el.className && typeof el.className === 'string'\n ? el.className.split(' ')[0]\n : '';\n if (className) {\n return tag + '.' + className;\n }\n return tag;\n }\n\n // Tags whose text content should be excluded from extraction\n const EXCLUDED_TEXT_TAGS = new Set(['STYLE', 'SCRIPT', 'NOSCRIPT', 'TEMPLATE', 'SVG']);\n\n /**\n * Get clean text content from an element, excluding CSS/JS content.\n * Uses TreeWalker to iterate only text nodes, skipping those inside\n * excluded tags (STYLE, SCRIPT, NOSCRIPT, TEMPLATE, SVG).\n *\n * @param {Element} el - The DOM element to extract text from\n * @param {number} maxLength - Maximum text length (truncates result)\n * @returns {string} Clean text content, space-joined, truncated to maxLength\n */\n function getCleanTextContent(el, maxLength) {\n // If element itself is an excluded tag, return empty\n if (EXCLUDED_TEXT_TAGS.has(el.tagName.toUpperCase())) {\n return '';\n }\n\n const walker = document.createTreeWalker(el, 4, { // NodeFilter.SHOW_TEXT = 4\n acceptNode: function(node) {\n let parent = node.parentElement;\n while (parent && parent !== el) {\n if (EXCLUDED_TEXT_TAGS.has(parent.tagName.toUpperCase())) {\n return 2; // FILTER_REJECT\n }\n parent = parent.parentElement;\n }\n return 1; // FILTER_ACCEPT\n }\n });\n\n const textParts = [];\n let totalLength = 0;\n let node;\n\n while ((node = walker.nextNode()) && totalLength < maxLength) {\n const text = node.nodeValue;\n if (text) {\n const trimmed = text.trim();\n if (trimmed) {\n textParts.push(trimmed);\n totalLength += trimmed.length;\n }\n }\n }\n\n return textParts.join(' ').substring(0, maxLength);\n }\n\n /**\n * Compute significance signals from element.\n * Uses universal web standards (ARIA, CSS positioning, DOM structure, visibility).\n */\n function computeSignals(el, shadowPath) {\n const role = el.getAttribute('role');\n const ariaLive = el.getAttribute('aria-live');\n const ariaModal = el.getAttribute('aria-modal');\n const tagName = el.tagName.toLowerCase();\n\n // Get computed style (may fail for detached elements)\n let style = null;\n let rect = null;\n try {\n style = getComputedStyle(el);\n rect = el.getBoundingClientRect();\n } catch (e) {\n // Element may be detached\n }\n\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n // Check if element is visible in viewport\n const isVisibleInViewport = rect && style &&\n rect.width > 0 && rect.height > 0 &&\n rect.bottom > 0 && rect.top < vh &&\n rect.right > 0 && rect.left < vw &&\n style.display !== 'none' &&\n style.visibility !== 'hidden' &&\n style.opacity !== '0';\n\n // Check for non-trivial text (at least 3 chars, not just whitespace)\n // Use short sample for signal check - excludes style/script content\n const text = getCleanTextContent(el, 100);\n const hasNonTrivialText = text.length >= 3;\n\n // For shadow DOM elements, isBodyDirectChild is false but we still want to capture them\n // Check if parent is a shadow root (which indicates top-level in shadow DOM)\n const isTopLevelInShadow = shadowPath && shadowPath.length > 0 &&\n el.parentNode && el.parentNode.nodeType === DOCUMENT_FRAGMENT_NODE;\n\n return {\n // Semantic signals\n hasAlertRole: ['alert', 'status', 'log', 'alertdialog'].includes(role),\n hasAriaLive: ariaLive === 'polite' || ariaLive === 'assertive',\n isDialog: role === 'dialog' || tagName === 'dialog' || ariaModal === 'true',\n\n // Visual signals\n isFixedOrSticky: style && (style.position === 'fixed' || style.position === 'sticky'),\n // Note: parseInt returns NaN for non-numeric values like \"auto\", which correctly fails the > 1000 check\n hasHighZIndex: style && parseInt(style.zIndex, 10) > 1000,\n coversSignificantViewport: rect && ((rect.width > vw * 0.5) || (rect.height > vh * 0.3)),\n\n // Structural signals - consider top-level shadow DOM elements as equivalent to body children\n isBodyDirectChild: el.parentElement === document.body || isTopLevelInShadow,\n containsInteractiveElements: el.querySelector('button, a, input, select, textarea') !== null,\n\n // Known toast library detection (unsemantic but significant)\n isKnownToastLibrary: el.matches(TOAST_LIBRARY_SELECTOR) || (typeof el.className === 'string' && el.className.includes('chakra-toast')),\n\n // Universal signals (work without ARIA)\n isVisibleInViewport: !!isVisibleInViewport,\n hasNonTrivialText: hasNonTrivialText,\n\n // Temporal signals (set by accumulator later)\n appearedAfterDelay: false,\n wasShortLived: false,\n };\n }\n\n /**\n * Calculate significance score from signals using weighted sum.\n * @param signals - The computed significance signals for an element\n * @returns The total significance score\n */\n function computeSignificance(signals) {\n let score = 0;\n for (const [key, weight] of Object.entries(WEIGHTS)) {\n if (signals[key]) score += weight;\n }\n return score;\n }\n\n /**\n * Capture a mutation entry from an element.\n * @param node - The DOM node\n * @param type - 'added' or 'removed'\n * @param shadowPath - Optional array of shadow host identifiers\n */\n function captureEntry(node, type, shadowPath) {\n if (node.nodeType !== 1) return null; // Element nodes only\n\n const el = node;\n const signals = computeSignals(el, shadowPath);\n const significance = computeSignificance(signals);\n\n // Only capture if meets threshold\n if (significance < SIGNIFICANCE_THRESHOLD) return null;\n\n // Capture content - excludes style/script content\n const text = getCleanTextContent(el, MAX_TEXT_LENGTH);\n const hasInteractives = signals.containsInteractiveElements;\n\n // Get viewport coverage for later analysis\n let viewportCoverage = { widthPct: 0, heightPct: 0 };\n try {\n const rect = el.getBoundingClientRect();\n viewportCoverage = {\n widthPct: Math.round((rect.width / window.innerWidth) * 100),\n heightPct: Math.round((rect.height / window.innerHeight) * 100),\n };\n } catch (e) {\n // Element may be detached\n }\n\n // Get z-index\n let zIndex = 0;\n try {\n zIndex = parseInt(getComputedStyle(el).zIndex, 10) || 0;\n } catch (e) {\n // Element may be detached\n }\n\n const entry = {\n type: type,\n timestamp: Date.now(),\n tag: el.tagName.toLowerCase(),\n id: el.id || undefined,\n\n // Semantic attributes\n role: el.getAttribute('role') || undefined,\n ariaLive: el.getAttribute('aria-live') || undefined,\n ariaLabel: el.getAttribute('aria-label') || undefined,\n ariaModal: el.getAttribute('aria-modal') || undefined,\n\n // Content\n text: text,\n hasInteractives: hasInteractives,\n\n // Visual signals\n isFixedOrSticky: signals.isFixedOrSticky,\n zIndex: zIndex,\n viewportCoverage: viewportCoverage,\n\n // Structural\n isBodyDirectChild: signals.isBodyDirectChild,\n\n // Universal signals\n isVisibleInViewport: signals.isVisibleInViewport,\n hasNonTrivialText: signals.hasNonTrivialText,\n\n // Shadow DOM context\n shadowPath: shadowPath && shadowPath.length > 0 ? shadowPath : undefined,\n\n // Significance\n significance: significance,\n };\n\n return entry;\n }\n\n const log = [];\n const pageLoadTime = Date.now();\n\n /**\n * Process added nodes - capture entries and check for shadow roots.\n * @param node - The added node\n * @param shadowPath - Current shadow path context\n */\n function processAddedNode(node, shadowPath) {\n // Skip if already processed (prevents duplicates from nested shadow DOM)\n if (node.nodeType === 1 && processedElements.has(node)) {\n return;\n }\n\n const entry = captureEntry(node, 'added', shadowPath);\n if (entry) {\n entry.appearedAfterDelay = (entry.timestamp - pageLoadTime) > 100;\n log.push(entry);\n // Mark as processed\n if (node.nodeType === 1) {\n processedElements.add(node);\n }\n }\n\n // Check significant children - both ARIA-attributed and visible text elements\n if (node.nodeType === 1) {\n // First: ARIA-attributed elements (high confidence)\n const ariaChildren = node.querySelectorAll(\n '[role=\"alert\"], [role=\"status\"], [role=\"dialog\"], [role=\"alertdialog\"], [aria-live], [aria-modal], dialog'\n );\n for (const child of ariaChildren) {\n // Skip if already processed\n if (processedElements.has(child)) continue;\n\n const childEntry = captureEntry(child, 'added', shadowPath);\n if (childEntry) {\n childEntry.appearedAfterDelay = (childEntry.timestamp - pageLoadTime) > 100;\n log.push(childEntry);\n processedElements.add(child);\n }\n }\n\n // Second: Any visible element with text (broader capture for sites without ARIA)\n const textChildren = node.querySelectorAll('span, div, p, small, strong, em, label, li');\n for (const child of textChildren) {\n // Skip if already processed\n if (processedElements.has(child)) continue;\n\n // Skip if already captured via ARIA query\n if (child.hasAttribute('role') || child.hasAttribute('aria-live')) continue;\n\n // Only capture leaf-ish elements (minimal nested structure)\n const hasDeepNesting = child.querySelector('div, p, ul, ol, table');\n if (hasDeepNesting) continue;\n\n const childEntry = captureEntry(child, 'added', shadowPath);\n if (childEntry) {\n childEntry.appearedAfterDelay = (childEntry.timestamp - pageLoadTime) > 100;\n log.push(childEntry);\n processedElements.add(child);\n }\n }\n\n // Check for shadow roots in this element and its descendants\n checkAndObserveShadowRoots(node, shadowPath || []);\n }\n }\n\n /**\n * Process removed nodes - capture entries and cleanup shadow observers.\n * @param node - The removed node\n * @param shadowPath - Current shadow path context\n */\n function processRemovedNode(node, shadowPath) {\n const entry = captureEntry(node, 'removed', shadowPath);\n if (entry) {\n log.push(entry);\n }\n\n // Cleanup shadow observers for removed elements\n if (node.nodeType === 1) {\n cleanupShadowObservers(node);\n }\n }\n\n /**\n * Find the nearest ancestor (or self) with a live region role.\n * Returns the element if found, null otherwise.\n */\n function findLiveRegionAncestor(node) {\n let el = node.nodeType === 1 ? node : node.parentElement;\n while (el && el !== document.body) {\n const role = el.getAttribute && el.getAttribute('role');\n if (role && LIVE_REGION_ROLES.has(role)) return el;\n const ariaLive = el.getAttribute && el.getAttribute('aria-live');\n if (ariaLive === 'polite' || ariaLive === 'assertive') return el;\n el = el.parentElement;\n }\n return null;\n }\n\n /**\n * Handle characterData mutations (text-only changes in existing elements).\n * Captures the live region container when its text content changes.\n */\n function processCharacterDataMutation(mutation, shadowPath) {\n const textNode = mutation.target;\n const liveRegion = findLiveRegionAncestor(textNode);\n if (!liveRegion) return;\n\n // Avoid re-capturing the same live region for rapid successive text changes\n // Use a short debounce window (same element within 100ms)\n const now = Date.now();\n if (liveRegion.__lastTextCapture && (now - liveRegion.__lastTextCapture) < 100) return;\n liveRegion.__lastTextCapture = now;\n\n const entry = captureEntry(liveRegion, 'added', shadowPath);\n if (entry) {\n entry.appearedAfterDelay = (entry.timestamp - pageLoadTime) > 100;\n log.push(entry);\n }\n }\n\n /**\n * Handle attribute mutations that may reveal hidden elements.\n * Detects visibility changes (display:none \u2192 block, hidden removal, etc.)\n */\n function processAttributeMutation(mutation, shadowPath) {\n const el = mutation.target;\n if (el.nodeType !== 1) return;\n\n // Skip if already processed in this cycle\n if (processedElements.has(el)) return;\n\n // Check if this attribute change made the element visible\n const attrName = mutation.attributeName;\n\n // For 'hidden' attribute: element becomes visible when hidden is removed\n if (attrName === 'hidden' && el.hasAttribute('hidden')) return; // Still hidden\n\n // For 'aria-hidden': element becomes visible when set to false or removed\n if (attrName === 'aria-hidden') {\n const val = el.getAttribute('aria-hidden');\n if (val === 'true') return; // Still hidden\n }\n\n // For 'style' or 'class': check computed visibility\n if (attrName === 'style' || attrName === 'class') {\n try {\n const style = getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {\n return; // Still hidden\n }\n } catch (e) {\n return; // Detached element\n }\n }\n\n // Check if this element (or a live region ancestor) is significant\n // Only capture if the element has meaningful content and meets threshold\n const entry = captureEntry(el, 'added', shadowPath);\n if (entry) {\n entry.appearedAfterDelay = (entry.timestamp - pageLoadTime) > 100;\n log.push(entry);\n processedElements.add(el);\n }\n }\n\n /**\n * Create a mutation callback for observing a specific context (main DOM or shadow root).\n * @param shadowPath - The shadow path context for this observer\n */\n function createMutationCallback(shadowPath) {\n return function(mutations) {\n for (const m of mutations) {\n if (m.type === 'childList') {\n // Capture added nodes\n for (const node of m.addedNodes) {\n processAddedNode(node, shadowPath);\n }\n\n // Capture removed nodes\n for (const node of m.removedNodes) {\n processRemovedNode(node, shadowPath);\n }\n } else if (m.type === 'characterData') {\n // Text content changed in an existing node (live region updates)\n processCharacterDataMutation(m, shadowPath);\n } else if (m.type === 'attributes') {\n // Attribute changed \u2014 may reveal hidden elements (visibility tracking)\n processAttributeMutation(m, shadowPath);\n }\n }\n\n // Trim if over limit (FIFO)\n if (log.length > MAX_ENTRIES) {\n const excess = log.length - MAX_ENTRIES;\n log.splice(0, excess);\n }\n };\n }\n\n /**\n * Observe a shadow root for mutations.\n * @param shadowRoot - The shadow root to observe\n * @param shadowPath - The path of shadow host identifiers leading to this shadow root\n */\n function observeShadowRoot(shadowRoot, shadowPath) {\n // Already observing this shadow root\n if (shadowObservers.has(shadowRoot)) return;\n\n // Limit number of shadow observers for performance\n if (shadowObservers.size >= MAX_SHADOW_OBSERVERS) {\n console.warn('[ObservationAccumulator] Max shadow observers reached, skipping:', shadowPath);\n return;\n }\n\n const observer = new MutationObserver(createMutationCallback(shadowPath));\n observer.observe(shadowRoot, {\n childList: true,\n subtree: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeFilter: VISIBILITY_ATTRS,\n });\n\n shadowObservers.set(shadowRoot, { observer, hostPath: shadowPath });\n }\n\n /**\n * Recursively check element and descendants for open shadow roots.\n * @param element - The element to check\n * @param currentShadowPath - The current shadow path context\n * @param visited - Set of already-visited elements to prevent infinite recursion\n */\n function checkAndObserveShadowRoots(element, currentShadowPath, visited) {\n if (!element || element.nodeType !== 1) return;\n\n // Initialize visited set on first call\n if (!visited) {\n visited = new Set();\n }\n\n // Prevent infinite recursion from circular references\n if (visited.has(element)) return;\n visited.add(element);\n\n // Check if this element has an open shadow root\n if (element.shadowRoot) {\n const newPath = [...currentShadowPath, getElementIdentifier(element)];\n observeShadowRoot(element.shadowRoot, newPath);\n\n // Check shadow root's children for nested shadow roots\n const shadowChildren = element.shadowRoot.querySelectorAll('*');\n for (const child of shadowChildren) {\n if (child.shadowRoot) {\n checkAndObserveShadowRoots(child, newPath, visited);\n }\n }\n }\n\n // Check light DOM children for shadow roots\n const children = element.querySelectorAll('*');\n for (const child of children) {\n if (child.shadowRoot) {\n checkAndObserveShadowRoots(child, currentShadowPath, visited);\n }\n }\n }\n\n /**\n * Cleanup shadow observers for a removed element and its descendants.\n * @param element - The element being removed\n */\n function cleanupShadowObservers(element) {\n if (!element || element.nodeType !== 1) return;\n\n // If element is a shadow host, cleanup its observer\n if (element.shadowRoot && shadowObservers.has(element.shadowRoot)) {\n const { observer } = shadowObservers.get(element.shadowRoot);\n observer.disconnect();\n shadowObservers.delete(element.shadowRoot);\n }\n\n // Recursively cleanup descendant shadow hosts\n try {\n const descendants = element.querySelectorAll('*');\n for (const child of descendants) {\n if (child.shadowRoot && shadowObservers.has(child.shadowRoot)) {\n const { observer } = shadowObservers.get(child.shadowRoot);\n observer.disconnect();\n shadowObservers.delete(child.shadowRoot);\n }\n }\n } catch (e) {\n // Element may be detached, ignore errors\n }\n }\n\n // Create main observer for document.body\n const observer = new MutationObserver(createMutationCallback(null));\n\n // Start observing\n if (document.body) {\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n characterData: true,\n characterDataOldValue: true,\n attributes: true,\n attributeFilter: VISIBILITY_ATTRS,\n });\n\n // Initial scan for existing shadow roots in the DOM\n checkAndObserveShadowRoots(document.body, []);\n }\n\n window.__observationAccumulator = {\n log: log,\n observer: observer,\n shadowObservers: shadowObservers, // Expose for debugging/testing\n observedBody: document.body, // Track which body we're observing for staleness detection\n pageLoadTime: pageLoadTime,\n lastReportedIndex: 0, // Track what's been reported\n\n // Get all entries since timestamp\n getSince: function(timestamp) {\n return this.log.filter(e => e.timestamp >= timestamp);\n },\n\n // Get significant entries since timestamp\n getSignificant: function(timestamp, threshold) {\n threshold = threshold || SIGNIFICANCE_THRESHOLD;\n return this.log.filter(e => e.timestamp >= timestamp && e.significance >= threshold);\n },\n\n // Get unreported entries (for accumulation between tool calls)\n getUnreported: function() {\n const unreported = this.log.slice(this.lastReportedIndex);\n return unreported.filter(e => e.significance >= SIGNIFICANCE_THRESHOLD);\n },\n\n // Mark entries as reported\n markReported: function() {\n this.lastReportedIndex = this.log.length;\n },\n\n // Reset on navigation\n reset: function() {\n this.log.length = 0;\n this.lastReportedIndex = 0;\n this.pageLoadTime = Date.now();\n // Cleanup all shadow observers\n for (const [shadowRoot, { observer }] of this.shadowObservers) {\n observer.disconnect();\n }\n this.shadowObservers.clear();\n // Clear processed elements tracking (create fresh WeakSet)\n processedElements = new WeakSet();\n },\n\n // Re-scan for shadow roots (useful after dynamic content load)\n rescanShadowRoots: function() {\n if (document.body) {\n checkAndObserveShadowRoots(document.body, []);\n }\n },\n\n // Get shadow observer count (for debugging)\n getShadowObserverCount: function() {\n return this.shadowObservers.size;\n },\n };\n})();\n";
19
19
  //# sourceMappingURL=observer-script.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"observer-script.d.ts","sourceRoot":"","sources":["../../../src/observation/observer-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,2BAA2B,s4kBAsiBvC,CAAC"}
1
+ {"version":3,"file":"observer-script.d.ts","sourceRoot":"","sources":["../../../src/observation/observer-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,eAAO,MAAM,2BAA2B,wuuBAgqBvC,CAAC"}
@@ -27,6 +27,23 @@ export const OBSERVATION_OBSERVER_SCRIPT = `
27
27
  const SIGNIFICANCE_THRESHOLD = 4;
28
28
  // Node type constant for shadow root parent check
29
29
  const DOCUMENT_FRAGMENT_NODE = 11;
30
+ // ARIA roles that indicate live regions (text mutations are significant)
31
+ const LIVE_REGION_ROLES = new Set(['alert', 'status', 'log', 'marquee', 'timer']);
32
+ // Attributes whose changes can reveal hidden elements (visibility tracking)
33
+ const VISIBILITY_ATTRS = ['style', 'class', 'hidden', 'aria-hidden'];
34
+
35
+ // Known toast library selectors (unsemantic — no ARIA roles).
36
+ // Keep in sync with TOAST_DATA_ATTRS / TOAST_CLASS_PATTERNS in snapshot-compiler.ts.
37
+ const TOAST_LIBRARY_PARTS = [
38
+ '[data-sonner-toaster]',
39
+ '[data-sonner-toast]',
40
+ '[data-hot-toast]',
41
+ '.Toastify__toast-container',
42
+ '.Toastify__toast',
43
+ '.ant-message',
44
+ '.ant-message-notice',
45
+ ];
46
+ const TOAST_LIBRARY_SELECTOR = TOAST_LIBRARY_PARTS.join(', ');
30
47
 
31
48
  // Significance weights (must match server-side observation.types.ts)
32
49
  const WEIGHTS = {
@@ -44,6 +61,9 @@ export const OBSERVATION_OBSERVER_SCRIPT = `
44
61
  isBodyDirectChild: 1,
45
62
  containsInteractiveElements: 1,
46
63
 
64
+ // Known toast library patterns (unsemantic but significant)
65
+ isKnownToastLibrary: 3, // Equivalent to hasAlertRole
66
+
47
67
  // New universal signals - work without ARIA
48
68
  isVisibleInViewport: 2, // Element is visible in viewport
49
69
  hasNonTrivialText: 1, // Has meaningful text content
@@ -188,6 +208,9 @@ export const OBSERVATION_OBSERVER_SCRIPT = `
188
208
  isBodyDirectChild: el.parentElement === document.body || isTopLevelInShadow,
189
209
  containsInteractiveElements: el.querySelector('button, a, input, select, textarea') !== null,
190
210
 
211
+ // Known toast library detection (unsemantic but significant)
212
+ isKnownToastLibrary: el.matches(TOAST_LIBRARY_SELECTOR) || (typeof el.className === 'string' && el.className.includes('chakra-toast')),
213
+
191
214
  // Universal signals (work without ARIA)
192
215
  isVisibleInViewport: !!isVisibleInViewport,
193
216
  hasNonTrivialText: hasNonTrivialText,
@@ -374,6 +397,89 @@ export const OBSERVATION_OBSERVER_SCRIPT = `
374
397
  }
375
398
  }
376
399
 
400
+ /**
401
+ * Find the nearest ancestor (or self) with a live region role.
402
+ * Returns the element if found, null otherwise.
403
+ */
404
+ function findLiveRegionAncestor(node) {
405
+ let el = node.nodeType === 1 ? node : node.parentElement;
406
+ while (el && el !== document.body) {
407
+ const role = el.getAttribute && el.getAttribute('role');
408
+ if (role && LIVE_REGION_ROLES.has(role)) return el;
409
+ const ariaLive = el.getAttribute && el.getAttribute('aria-live');
410
+ if (ariaLive === 'polite' || ariaLive === 'assertive') return el;
411
+ el = el.parentElement;
412
+ }
413
+ return null;
414
+ }
415
+
416
+ /**
417
+ * Handle characterData mutations (text-only changes in existing elements).
418
+ * Captures the live region container when its text content changes.
419
+ */
420
+ function processCharacterDataMutation(mutation, shadowPath) {
421
+ const textNode = mutation.target;
422
+ const liveRegion = findLiveRegionAncestor(textNode);
423
+ if (!liveRegion) return;
424
+
425
+ // Avoid re-capturing the same live region for rapid successive text changes
426
+ // Use a short debounce window (same element within 100ms)
427
+ const now = Date.now();
428
+ if (liveRegion.__lastTextCapture && (now - liveRegion.__lastTextCapture) < 100) return;
429
+ liveRegion.__lastTextCapture = now;
430
+
431
+ const entry = captureEntry(liveRegion, 'added', shadowPath);
432
+ if (entry) {
433
+ entry.appearedAfterDelay = (entry.timestamp - pageLoadTime) > 100;
434
+ log.push(entry);
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Handle attribute mutations that may reveal hidden elements.
440
+ * Detects visibility changes (display:none → block, hidden removal, etc.)
441
+ */
442
+ function processAttributeMutation(mutation, shadowPath) {
443
+ const el = mutation.target;
444
+ if (el.nodeType !== 1) return;
445
+
446
+ // Skip if already processed in this cycle
447
+ if (processedElements.has(el)) return;
448
+
449
+ // Check if this attribute change made the element visible
450
+ const attrName = mutation.attributeName;
451
+
452
+ // For 'hidden' attribute: element becomes visible when hidden is removed
453
+ if (attrName === 'hidden' && el.hasAttribute('hidden')) return; // Still hidden
454
+
455
+ // For 'aria-hidden': element becomes visible when set to false or removed
456
+ if (attrName === 'aria-hidden') {
457
+ const val = el.getAttribute('aria-hidden');
458
+ if (val === 'true') return; // Still hidden
459
+ }
460
+
461
+ // For 'style' or 'class': check computed visibility
462
+ if (attrName === 'style' || attrName === 'class') {
463
+ try {
464
+ const style = getComputedStyle(el);
465
+ if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') {
466
+ return; // Still hidden
467
+ }
468
+ } catch (e) {
469
+ return; // Detached element
470
+ }
471
+ }
472
+
473
+ // Check if this element (or a live region ancestor) is significant
474
+ // Only capture if the element has meaningful content and meets threshold
475
+ const entry = captureEntry(el, 'added', shadowPath);
476
+ if (entry) {
477
+ entry.appearedAfterDelay = (entry.timestamp - pageLoadTime) > 100;
478
+ log.push(entry);
479
+ processedElements.add(el);
480
+ }
481
+ }
482
+
377
483
  /**
378
484
  * Create a mutation callback for observing a specific context (main DOM or shadow root).
379
485
  * @param shadowPath - The shadow path context for this observer
@@ -381,14 +487,22 @@ export const OBSERVATION_OBSERVER_SCRIPT = `
381
487
  function createMutationCallback(shadowPath) {
382
488
  return function(mutations) {
383
489
  for (const m of mutations) {
384
- // Capture added nodes
385
- for (const node of m.addedNodes) {
386
- processAddedNode(node, shadowPath);
387
- }
490
+ if (m.type === 'childList') {
491
+ // Capture added nodes
492
+ for (const node of m.addedNodes) {
493
+ processAddedNode(node, shadowPath);
494
+ }
388
495
 
389
- // Capture removed nodes
390
- for (const node of m.removedNodes) {
391
- processRemovedNode(node, shadowPath);
496
+ // Capture removed nodes
497
+ for (const node of m.removedNodes) {
498
+ processRemovedNode(node, shadowPath);
499
+ }
500
+ } else if (m.type === 'characterData') {
501
+ // Text content changed in an existing node (live region updates)
502
+ processCharacterDataMutation(m, shadowPath);
503
+ } else if (m.type === 'attributes') {
504
+ // Attribute changed — may reveal hidden elements (visibility tracking)
505
+ processAttributeMutation(m, shadowPath);
392
506
  }
393
507
  }
394
508
 
@@ -419,6 +533,10 @@ export const OBSERVATION_OBSERVER_SCRIPT = `
419
533
  observer.observe(shadowRoot, {
420
534
  childList: true,
421
535
  subtree: true,
536
+ characterData: true,
537
+ characterDataOldValue: true,
538
+ attributes: true,
539
+ attributeFilter: VISIBILITY_ATTRS,
422
540
  });
423
541
 
424
542
  shadowObservers.set(shadowRoot, { observer, hostPath: shadowPath });
@@ -502,6 +620,10 @@ export const OBSERVATION_OBSERVER_SCRIPT = `
502
620
  observer.observe(document.body, {
503
621
  childList: true,
504
622
  subtree: true,
623
+ characterData: true,
624
+ characterDataOldValue: true,
625
+ attributes: true,
626
+ attributeFilter: VISIBILITY_ATTRS,
505
627
  });
506
628
 
507
629
  // Initial scan for existing shadow roots in the DOM
@@ -1 +1 @@
1
- {"version":3,"file":"observer-script.js","sourceRoot":"","sources":["../../../src/observation/observer-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsiB1C,CAAC"}
1
+ {"version":3,"file":"observer-script.js","sourceRoot":"","sources":["../../../src/observation/observer-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgqB1C,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Disambiguation
3
+ *
4
+ * Generate suggestions to narrow ambiguous query results.
5
+ * Analyzes matched nodes and suggests refinements.
6
+ */
7
+ import type { ReadableNode } from '../snapshot/snapshot.types.js';
8
+ import type { FindElementsRequest, MatchedNode, DisambiguationSuggestion } from './types/query.types.js';
9
+ /**
10
+ * Generate disambiguation suggestions when query matches multiple elements.
11
+ * Suggests refinements that would narrow down the results.
12
+ */
13
+ export declare function generateSuggestions(matches: MatchedNode[], request: FindElementsRequest): DisambiguationSuggestion[];
14
+ /**
15
+ * Count nodes by a given attribute.
16
+ */
17
+ export declare function countByAttribute<T>(nodes: ReadableNode[], getter: (node: ReadableNode) => T): Map<T, number>;
18
+ //# sourceMappingURL=disambiguation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguation.d.ts","sourceRoot":"","sources":["../../../src/query/disambiguation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EACV,mBAAmB,EACnB,WAAW,EACX,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAIhC;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,EAAE,mBAAmB,GAC3B,wBAAwB,EAAE,CA2G5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAChC,KAAK,EAAE,YAAY,EAAE,EACrB,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,CAAC,GAChC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAOhB"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Disambiguation
3
+ *
4
+ * Generate suggestions to narrow ambiguous query results.
5
+ * Analyzes matched nodes and suggests refinements.
6
+ */
7
+ import { normalizeText } from '../lib/text-utils.js';
8
+ import { normalizeLabelFilter } from './scoring.js';
9
+ /**
10
+ * Generate disambiguation suggestions when query matches multiple elements.
11
+ * Suggests refinements that would narrow down the results.
12
+ */
13
+ export function generateSuggestions(matches, request) {
14
+ const suggestions = [];
15
+ const nodes = matches.map((m) => m.node);
16
+ // Only generate suggestions if we have multiple matches
17
+ if (matches.length < 2)
18
+ return suggestions;
19
+ // 1. Suggest refining by kind if matches have different kinds
20
+ if (request.kind === undefined) {
21
+ const kindCounts = countByAttribute(nodes, (n) => n.kind);
22
+ if (kindCounts.size > 1) {
23
+ for (const [kind, count] of kindCounts) {
24
+ if (count < matches.length) {
25
+ suggestions.push({
26
+ type: 'refine_kind',
27
+ message: `Add kind: "${kind}" to narrow to ${count} result(s)`,
28
+ refinement: { kind },
29
+ expected_matches: count,
30
+ });
31
+ }
32
+ }
33
+ }
34
+ }
35
+ // 2. Suggest refining by region if matches span multiple regions
36
+ if (request.region === undefined) {
37
+ const regionCounts = countByAttribute(nodes, (n) => n.where.region);
38
+ if (regionCounts.size > 1) {
39
+ for (const [region, count] of regionCounts) {
40
+ if (count < matches.length && region !== 'unknown') {
41
+ suggestions.push({
42
+ type: 'refine_region',
43
+ message: `Add region: "${region}" to narrow to ${count} result(s)`,
44
+ refinement: { region },
45
+ expected_matches: count,
46
+ });
47
+ }
48
+ }
49
+ }
50
+ }
51
+ // 3. Suggest refining by group_id if matches have different groups
52
+ if (request.group_id === undefined) {
53
+ const groupCounts = countByAttribute(nodes, (n) => n.where.group_id);
54
+ groupCounts.delete(undefined); // Remove nodes without groups
55
+ if (groupCounts.size >= 1) {
56
+ for (const [groupId, count] of groupCounts) {
57
+ if (groupId !== undefined) {
58
+ suggestions.push({
59
+ type: 'refine_group',
60
+ message: `Add group_id: "${groupId}" to narrow to ${count} result(s)`,
61
+ refinement: { group_id: groupId },
62
+ expected_matches: count,
63
+ });
64
+ }
65
+ }
66
+ }
67
+ }
68
+ // 4. Suggest adding state filters
69
+ if (request.state === undefined) {
70
+ const enabledCount = nodes.filter((n) => n.state?.enabled).length;
71
+ if (enabledCount > 0 && enabledCount < matches.length) {
72
+ suggestions.push({
73
+ type: 'add_state',
74
+ message: `Add state: { enabled: true } to narrow to ${enabledCount} result(s)`,
75
+ refinement: { state: { enabled: true } },
76
+ expected_matches: enabledCount,
77
+ });
78
+ }
79
+ const visibleCount = nodes.filter((n) => n.state?.visible).length;
80
+ if (visibleCount > 0 && visibleCount < matches.length) {
81
+ suggestions.push({
82
+ type: 'add_state',
83
+ message: `Add state: { visible: true } to narrow to ${visibleCount} result(s)`,
84
+ refinement: { state: { visible: true } },
85
+ expected_matches: visibleCount,
86
+ });
87
+ }
88
+ }
89
+ // 5. Suggest refining label to exact match if using contains/fuzzy
90
+ if (request.label !== undefined) {
91
+ const { mode, text } = normalizeLabelFilter(request.label);
92
+ if (mode !== 'exact') {
93
+ const normalizedText = normalizeText(text.toLowerCase());
94
+ const exactCount = nodes.filter((n) => normalizeText(n.label.toLowerCase()) === normalizedText).length;
95
+ if (exactCount > 0 && exactCount < matches.length) {
96
+ suggestions.push({
97
+ type: 'refine_label',
98
+ message: `Use exact label match to narrow to ${exactCount} result(s)`,
99
+ refinement: { label: { text, mode: 'exact' } },
100
+ expected_matches: exactCount,
101
+ });
102
+ }
103
+ }
104
+ }
105
+ // Sort by expected_matches (prefer suggestions that narrow most effectively)
106
+ // and limit to top 5
107
+ return suggestions
108
+ .filter((s) => s.expected_matches > 0 && s.expected_matches < matches.length)
109
+ .sort((a, b) => a.expected_matches - b.expected_matches)
110
+ .slice(0, 5);
111
+ }
112
+ /**
113
+ * Count nodes by a given attribute.
114
+ */
115
+ export function countByAttribute(nodes, getter) {
116
+ const counts = new Map();
117
+ for (const node of nodes) {
118
+ const value = getter(node);
119
+ counts.set(value, (counts.get(value) ?? 0) + 1);
120
+ }
121
+ return counts;
122
+ }
123
+ //# sourceMappingURL=disambiguation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"disambiguation.js","sourceRoot":"","sources":["../../../src/query/disambiguation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Fuzzy Match
3
+ *
4
+ * Fuzzy label matching for query engine.
5
+ * Uses token-based matching with configurable thresholds.
6
+ */
7
+ import type { ReadableNode } from '../snapshot/snapshot.types.js';
8
+ import type { FuzzyMatchOptions } from './types/query.types.js';
9
+ /**
10
+ * Filter nodes by fuzzy label matching.
11
+ * Returns matched nodes and a map of node_id -> match score for relevance calculation.
12
+ */
13
+ export declare function filterByLabelFuzzy(nodes: ReadableNode[], text: string, caseSensitive: boolean, options?: FuzzyMatchOptions): {
14
+ nodes: ReadableNode[];
15
+ scores: Map<string, number>;
16
+ };
17
+ //# sourceMappingURL=fuzzy-match.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fuzzy-match.d.ts","sourceRoot":"","sources":["../../../src/query/fuzzy-match.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAGhE;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,EAAE,EACrB,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,OAAO,EACtB,OAAO,GAAE,iBAAsB,GAC9B;IAAE,KAAK,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CA0BxD"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * Fuzzy Match
3
+ *
4
+ * Fuzzy label matching for query engine.
5
+ * Uses token-based matching with configurable thresholds.
6
+ */
7
+ import { normalizeText, tokenizeForMatching, fuzzyTokensMatch } from '../lib/text-utils.js';
8
+ /**
9
+ * Filter nodes by fuzzy label matching.
10
+ * Returns matched nodes and a map of node_id -> match score for relevance calculation.
11
+ */
12
+ export function filterByLabelFuzzy(nodes, text, caseSensitive, options = {}) {
13
+ const scores = new Map();
14
+ const normalizedQuery = normalizeText(caseSensitive ? text : text.toLowerCase());
15
+ const queryTokens = tokenizeForMatching(normalizedQuery, 10, 2);
16
+ if (queryTokens.length === 0) {
17
+ return { nodes: [], scores };
18
+ }
19
+ const matched = nodes.filter((n) => {
20
+ const normalizedLabel = normalizeText(caseSensitive ? n.label : n.label.toLowerCase());
21
+ const labelTokens = tokenizeForMatching(normalizedLabel, 10, 2);
22
+ const result = fuzzyTokensMatch(labelTokens, queryTokens, {
23
+ minTokenOverlap: options.minTokenOverlap ?? 0.5,
24
+ prefixMatch: options.prefixMatch ?? true,
25
+ minSimilarity: options.minSimilarity ?? 0.8,
26
+ });
27
+ if (result.isMatch) {
28
+ scores.set(n.node_id, result.score);
29
+ }
30
+ return result.isMatch;
31
+ });
32
+ return { nodes: matched, scores };
33
+ }
34
+ //# sourceMappingURL=fuzzy-match.js.map