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.
- package/LICENSE +21 -0
- package/README.md +226 -0
- package/dist/src/browser/ensure-browser.d.ts +39 -0
- package/dist/src/browser/ensure-browser.d.ts.map +1 -0
- package/dist/src/browser/ensure-browser.js +65 -0
- package/dist/src/browser/ensure-browser.js.map +1 -0
- package/dist/src/browser/index.d.ts +8 -0
- package/dist/src/browser/index.d.ts.map +1 -0
- package/dist/src/browser/index.js +8 -0
- package/dist/src/browser/index.js.map +1 -0
- package/dist/src/browser/page-network-tracker.d.ts +96 -0
- package/dist/src/browser/page-network-tracker.d.ts.map +1 -0
- package/dist/src/browser/page-network-tracker.js +235 -0
- package/dist/src/browser/page-network-tracker.js.map +1 -0
- package/dist/src/browser/page-registry.d.ts +137 -0
- package/dist/src/browser/page-registry.d.ts.map +1 -0
- package/dist/src/browser/page-registry.js +194 -0
- package/dist/src/browser/page-registry.js.map +1 -0
- package/dist/src/browser/page-stabilization.d.ts +35 -0
- package/dist/src/browser/page-stabilization.d.ts.map +1 -0
- package/dist/src/browser/page-stabilization.js +42 -0
- package/dist/src/browser/page-stabilization.js.map +1 -0
- package/dist/src/browser/session-manager.d.ts +336 -0
- package/dist/src/browser/session-manager.d.ts.map +1 -0
- package/dist/src/browser/session-manager.js +964 -0
- package/dist/src/browser/session-manager.js.map +1 -0
- package/dist/src/cdp/cdp-client.interface.d.ts +193 -0
- package/dist/src/cdp/cdp-client.interface.d.ts.map +1 -0
- package/dist/src/cdp/cdp-client.interface.js +9 -0
- package/dist/src/cdp/cdp-client.interface.js.map +1 -0
- package/dist/src/cdp/index.d.ts +9 -0
- package/dist/src/cdp/index.d.ts.map +1 -0
- package/dist/src/cdp/index.js +8 -0
- package/dist/src/cdp/index.js.map +1 -0
- package/dist/src/cdp/puppeteer-cdp-client.d.ts +97 -0
- package/dist/src/cdp/puppeteer-cdp-client.d.ts.map +1 -0
- package/dist/src/cdp/puppeteer-cdp-client.js +273 -0
- package/dist/src/cdp/puppeteer-cdp-client.js.map +1 -0
- package/dist/src/cli/args.d.ts +35 -0
- package/dist/src/cli/args.d.ts.map +1 -0
- package/dist/src/cli/args.js +76 -0
- package/dist/src/cli/args.js.map +1 -0
- package/dist/src/delta/dom-stabilizer.d.ts +46 -0
- package/dist/src/delta/dom-stabilizer.d.ts.map +1 -0
- package/dist/src/delta/dom-stabilizer.js +121 -0
- package/dist/src/delta/dom-stabilizer.js.map +1 -0
- package/dist/src/delta/index.d.ts +8 -0
- package/dist/src/delta/index.d.ts.map +1 -0
- package/dist/src/delta/index.js +7 -0
- package/dist/src/delta/index.js.map +1 -0
- package/dist/src/factpack/action-selector.d.ts +36 -0
- package/dist/src/factpack/action-selector.d.ts.map +1 -0
- package/dist/src/factpack/action-selector.js +367 -0
- package/dist/src/factpack/action-selector.js.map +1 -0
- package/dist/src/factpack/dialog-detector.d.ts +19 -0
- package/dist/src/factpack/dialog-detector.d.ts.map +1 -0
- package/dist/src/factpack/dialog-detector.js +354 -0
- package/dist/src/factpack/dialog-detector.js.map +1 -0
- package/dist/src/factpack/form-detector.d.ts +28 -0
- package/dist/src/factpack/form-detector.d.ts.map +1 -0
- package/dist/src/factpack/form-detector.js +555 -0
- package/dist/src/factpack/form-detector.js.map +1 -0
- package/dist/src/factpack/index.d.ts +32 -0
- package/dist/src/factpack/index.d.ts.map +1 -0
- package/dist/src/factpack/index.js +73 -0
- package/dist/src/factpack/index.js.map +1 -0
- package/dist/src/factpack/page-classifier.d.ts +22 -0
- package/dist/src/factpack/page-classifier.d.ts.map +1 -0
- package/dist/src/factpack/page-classifier.js +526 -0
- package/dist/src/factpack/page-classifier.js.map +1 -0
- package/dist/src/factpack/types.d.ts +307 -0
- package/dist/src/factpack/types.d.ts.map +1 -0
- package/dist/src/factpack/types.js +12 -0
- package/dist/src/factpack/types.js.map +1 -0
- package/dist/src/form/dependency-tracker.d.ts +108 -0
- package/dist/src/form/dependency-tracker.d.ts.map +1 -0
- package/dist/src/form/dependency-tracker.js +298 -0
- package/dist/src/form/dependency-tracker.js.map +1 -0
- package/dist/src/form/field-extractor.d.ts +32 -0
- package/dist/src/form/field-extractor.d.ts.map +1 -0
- package/dist/src/form/field-extractor.js +544 -0
- package/dist/src/form/field-extractor.js.map +1 -0
- package/dist/src/form/form-detector.d.ts +103 -0
- package/dist/src/form/form-detector.d.ts.map +1 -0
- package/dist/src/form/form-detector.js +704 -0
- package/dist/src/form/form-detector.js.map +1 -0
- package/dist/src/form/form-state.d.ts +23 -0
- package/dist/src/form/form-state.d.ts.map +1 -0
- package/dist/src/form/form-state.js +39 -0
- package/dist/src/form/form-state.js.map +1 -0
- package/dist/src/form/index.d.ts +23 -0
- package/dist/src/form/index.d.ts.map +1 -0
- package/dist/src/form/index.js +27 -0
- package/dist/src/form/index.js.map +1 -0
- package/dist/src/form/runtime-value-reader.d.ts +72 -0
- package/dist/src/form/runtime-value-reader.d.ts.map +1 -0
- package/dist/src/form/runtime-value-reader.js +232 -0
- package/dist/src/form/runtime-value-reader.js.map +1 -0
- package/dist/src/form/types.d.ts +384 -0
- package/dist/src/form/types.d.ts.map +1 -0
- package/dist/src/form/types.js +17 -0
- package/dist/src/form/types.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +212 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/constants.d.ts +27 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +63 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/index.d.ts +12 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +17 -0
- package/dist/src/lib/index.js.map +1 -0
- package/dist/src/lib/regions.d.ts +29 -0
- package/dist/src/lib/regions.d.ts.map +1 -0
- package/dist/src/lib/regions.js +93 -0
- package/dist/src/lib/regions.js.map +1 -0
- package/dist/src/lib/scoring.d.ts +47 -0
- package/dist/src/lib/scoring.d.ts.map +1 -0
- package/dist/src/lib/scoring.js +79 -0
- package/dist/src/lib/scoring.js.map +1 -0
- package/dist/src/lib/selectors.d.ts +42 -0
- package/dist/src/lib/selectors.d.ts.map +1 -0
- package/dist/src/lib/selectors.js +138 -0
- package/dist/src/lib/selectors.js.map +1 -0
- package/dist/src/lib/text-utils.d.ts +155 -0
- package/dist/src/lib/text-utils.d.ts.map +1 -0
- package/dist/src/lib/text-utils.js +391 -0
- package/dist/src/lib/text-utils.js.map +1 -0
- package/dist/src/observation/eid-linker.d.ts +104 -0
- package/dist/src/observation/eid-linker.d.ts.map +1 -0
- package/dist/src/observation/eid-linker.js +403 -0
- package/dist/src/observation/eid-linker.js.map +1 -0
- package/dist/src/observation/index.d.ts +12 -0
- package/dist/src/observation/index.d.ts.map +1 -0
- package/dist/src/observation/index.js +15 -0
- package/dist/src/observation/index.js.map +1 -0
- package/dist/src/observation/observation-accumulator.d.ts +58 -0
- package/dist/src/observation/observation-accumulator.d.ts.map +1 -0
- package/dist/src/observation/observation-accumulator.js +213 -0
- package/dist/src/observation/observation-accumulator.js.map +1 -0
- package/dist/src/observation/observation.types.d.ts +139 -0
- package/dist/src/observation/observation.types.d.ts.map +1 -0
- package/dist/src/observation/observation.types.js +59 -0
- package/dist/src/observation/observation.types.js.map +1 -0
- package/dist/src/observation/observer-script.d.ts +19 -0
- package/dist/src/observation/observer-script.d.ts.map +1 -0
- package/dist/src/observation/observer-script.js +569 -0
- package/dist/src/observation/observer-script.js.map +1 -0
- package/dist/src/query/index.d.ts +9 -0
- package/dist/src/query/index.d.ts.map +1 -0
- package/dist/src/query/index.js +10 -0
- package/dist/src/query/index.js.map +1 -0
- package/dist/src/query/query-engine.d.ts +111 -0
- package/dist/src/query/query-engine.d.ts.map +1 -0
- package/dist/src/query/query-engine.js +509 -0
- package/dist/src/query/query-engine.js.map +1 -0
- package/dist/src/query/types/index.d.ts +5 -0
- package/dist/src/query/types/index.d.ts.map +1 -0
- package/dist/src/query/types/index.js +5 -0
- package/dist/src/query/types/index.js.map +1 -0
- package/dist/src/query/types/query.types.d.ts +141 -0
- package/dist/src/query/types/query.types.d.ts.map +1 -0
- package/dist/src/query/types/query.types.js +19 -0
- package/dist/src/query/types/query.types.js.map +1 -0
- package/dist/src/renderer/budget-manager.d.ts +46 -0
- package/dist/src/renderer/budget-manager.d.ts.map +1 -0
- package/dist/src/renderer/budget-manager.js +133 -0
- package/dist/src/renderer/budget-manager.js.map +1 -0
- package/dist/src/renderer/constants.d.ts +38 -0
- package/dist/src/renderer/constants.d.ts.map +1 -0
- package/dist/src/renderer/constants.js +29 -0
- package/dist/src/renderer/constants.js.map +1 -0
- package/dist/src/renderer/index.d.ts +12 -0
- package/dist/src/renderer/index.d.ts.map +1 -0
- package/dist/src/renderer/index.js +16 -0
- package/dist/src/renderer/index.js.map +1 -0
- package/dist/src/renderer/section-renderers.d.ts +42 -0
- package/dist/src/renderer/section-renderers.d.ts.map +1 -0
- package/dist/src/renderer/section-renderers.js +252 -0
- package/dist/src/renderer/section-renderers.js.map +1 -0
- package/dist/src/renderer/token-counter.d.ts +45 -0
- package/dist/src/renderer/token-counter.d.ts.map +1 -0
- package/dist/src/renderer/token-counter.js +65 -0
- package/dist/src/renderer/token-counter.js.map +1 -0
- package/dist/src/renderer/types.d.ts +71 -0
- package/dist/src/renderer/types.d.ts.map +1 -0
- package/dist/src/renderer/types.js +7 -0
- package/dist/src/renderer/types.js.map +1 -0
- package/dist/src/renderer/xml-renderer.d.ts +42 -0
- package/dist/src/renderer/xml-renderer.d.ts.map +1 -0
- package/dist/src/renderer/xml-renderer.js +103 -0
- package/dist/src/renderer/xml-renderer.js.map +1 -0
- package/dist/src/server/index.d.ts +8 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +8 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/mcp-server.d.ts +59 -0
- package/dist/src/server/mcp-server.d.ts.map +1 -0
- package/dist/src/server/mcp-server.js +140 -0
- package/dist/src/server/mcp-server.js.map +1 -0
- package/dist/src/server/server-config.d.ts +41 -0
- package/dist/src/server/server-config.d.ts.map +1 -0
- package/dist/src/server/server-config.js +80 -0
- package/dist/src/server/server-config.js.map +1 -0
- package/dist/src/server/session-store.d.ts +148 -0
- package/dist/src/server/session-store.d.ts.map +1 -0
- package/dist/src/server/session-store.js +224 -0
- package/dist/src/server/session-store.js.map +1 -0
- package/dist/src/shared/errors/browser-session.error.d.ts +102 -0
- package/dist/src/shared/errors/browser-session.error.d.ts.map +1 -0
- package/dist/src/shared/errors/browser-session.error.js +153 -0
- package/dist/src/shared/errors/browser-session.error.js.map +1 -0
- package/dist/src/shared/errors/index.d.ts +5 -0
- package/dist/src/shared/errors/index.d.ts.map +1 -0
- package/dist/src/shared/errors/index.js +5 -0
- package/dist/src/shared/errors/index.js.map +1 -0
- package/dist/src/shared/services/dom-transformer.service.d.ts +71 -0
- package/dist/src/shared/services/dom-transformer.service.d.ts.map +1 -0
- package/dist/src/shared/services/dom-transformer.service.js +190 -0
- package/dist/src/shared/services/dom-transformer.service.js.map +1 -0
- package/dist/src/shared/services/index.d.ts +7 -0
- package/dist/src/shared/services/index.d.ts.map +1 -0
- package/dist/src/shared/services/index.js +7 -0
- package/dist/src/shared/services/index.js.map +1 -0
- package/dist/src/shared/services/logging.service.d.ts +154 -0
- package/dist/src/shared/services/logging.service.d.ts.map +1 -0
- package/dist/src/shared/services/logging.service.js +267 -0
- package/dist/src/shared/services/logging.service.js.map +1 -0
- package/dist/src/shared/services/selector-builder.service.d.ts +53 -0
- package/dist/src/shared/services/selector-builder.service.d.ts.map +1 -0
- package/dist/src/shared/services/selector-builder.service.js +240 -0
- package/dist/src/shared/services/selector-builder.service.js.map +1 -0
- package/dist/src/shared/types/base.types.d.ts +45 -0
- package/dist/src/shared/types/base.types.d.ts.map +1 -0
- package/dist/src/shared/types/base.types.js +8 -0
- package/dist/src/shared/types/base.types.js.map +1 -0
- package/dist/src/shared/types/index.d.ts +5 -0
- package/dist/src/shared/types/index.d.ts.map +1 -0
- package/dist/src/shared/types/index.js +5 -0
- package/dist/src/shared/types/index.js.map +1 -0
- package/dist/src/snapshot/element-resolver.d.ts +102 -0
- package/dist/src/snapshot/element-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/element-resolver.js +379 -0
- package/dist/src/snapshot/element-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/attribute-extractor.d.ts +40 -0
- package/dist/src/snapshot/extractors/attribute-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/attribute-extractor.js +237 -0
- package/dist/src/snapshot/extractors/attribute-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/ax-extractor.d.ts +36 -0
- package/dist/src/snapshot/extractors/ax-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/ax-extractor.js +144 -0
- package/dist/src/snapshot/extractors/ax-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/dom-extractor.d.ts +21 -0
- package/dist/src/snapshot/extractors/dom-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/dom-extractor.js +137 -0
- package/dist/src/snapshot/extractors/dom-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/grouping-resolver.d.ts +39 -0
- package/dist/src/snapshot/extractors/grouping-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/grouping-resolver.js +260 -0
- package/dist/src/snapshot/extractors/grouping-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/index.d.ts +19 -0
- package/dist/src/snapshot/extractors/index.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/index.js +27 -0
- package/dist/src/snapshot/extractors/index.js.map +1 -0
- package/dist/src/snapshot/extractors/label-resolver.d.ts +44 -0
- package/dist/src/snapshot/extractors/label-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/label-resolver.js +173 -0
- package/dist/src/snapshot/extractors/label-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/layout-extractor.d.ts +52 -0
- package/dist/src/snapshot/extractors/layout-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/layout-extractor.js +382 -0
- package/dist/src/snapshot/extractors/layout-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/locator-builder.d.ts +27 -0
- package/dist/src/snapshot/extractors/locator-builder.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/locator-builder.js +223 -0
- package/dist/src/snapshot/extractors/locator-builder.js.map +1 -0
- package/dist/src/snapshot/extractors/region-resolver.d.ts +31 -0
- package/dist/src/snapshot/extractors/region-resolver.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/region-resolver.js +168 -0
- package/dist/src/snapshot/extractors/region-resolver.js.map +1 -0
- package/dist/src/snapshot/extractors/state-extractor.d.ts +30 -0
- package/dist/src/snapshot/extractors/state-extractor.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/state-extractor.js +181 -0
- package/dist/src/snapshot/extractors/state-extractor.js.map +1 -0
- package/dist/src/snapshot/extractors/types.d.ts +213 -0
- package/dist/src/snapshot/extractors/types.d.ts.map +1 -0
- package/dist/src/snapshot/extractors/types.js +145 -0
- package/dist/src/snapshot/extractors/types.js.map +1 -0
- package/dist/src/snapshot/index.d.ts +14 -0
- package/dist/src/snapshot/index.d.ts.map +1 -0
- package/dist/src/snapshot/index.js +18 -0
- package/dist/src/snapshot/index.js.map +1 -0
- package/dist/src/snapshot/snapshot-compiler.d.ts +73 -0
- package/dist/src/snapshot/snapshot-compiler.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot-compiler.js +763 -0
- package/dist/src/snapshot/snapshot-compiler.js.map +1 -0
- package/dist/src/snapshot/snapshot-health.d.ts +97 -0
- package/dist/src/snapshot/snapshot-health.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot-health.js +214 -0
- package/dist/src/snapshot/snapshot-health.js.map +1 -0
- package/dist/src/snapshot/snapshot-store.d.ts +137 -0
- package/dist/src/snapshot/snapshot-store.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot-store.js +202 -0
- package/dist/src/snapshot/snapshot-store.js.map +1 -0
- package/dist/src/snapshot/snapshot.types.d.ts +250 -0
- package/dist/src/snapshot/snapshot.types.d.ts.map +1 -0
- package/dist/src/snapshot/snapshot.types.js +54 -0
- package/dist/src/snapshot/snapshot.types.js.map +1 -0
- package/dist/src/state/actionables-filter.d.ts +47 -0
- package/dist/src/state/actionables-filter.d.ts.map +1 -0
- package/dist/src/state/actionables-filter.js +173 -0
- package/dist/src/state/actionables-filter.js.map +1 -0
- package/dist/src/state/atoms-extractor.d.ts +23 -0
- package/dist/src/state/atoms-extractor.d.ts.map +1 -0
- package/dist/src/state/atoms-extractor.js +160 -0
- package/dist/src/state/atoms-extractor.js.map +1 -0
- package/dist/src/state/constants.d.ts +125 -0
- package/dist/src/state/constants.d.ts.map +1 -0
- package/dist/src/state/constants.js +131 -0
- package/dist/src/state/constants.js.map +1 -0
- package/dist/src/state/diff-engine.d.ts +23 -0
- package/dist/src/state/diff-engine.d.ts.map +1 -0
- package/dist/src/state/diff-engine.js +475 -0
- package/dist/src/state/diff-engine.js.map +1 -0
- package/dist/src/state/element-identity.d.ts +75 -0
- package/dist/src/state/element-identity.d.ts.map +1 -0
- package/dist/src/state/element-identity.js +129 -0
- package/dist/src/state/element-identity.js.map +1 -0
- package/dist/src/state/element-ref.types.d.ts +135 -0
- package/dist/src/state/element-ref.types.d.ts.map +1 -0
- package/dist/src/state/element-ref.types.js +13 -0
- package/dist/src/state/element-ref.types.js.map +1 -0
- package/dist/src/state/element-registry.d.ts +118 -0
- package/dist/src/state/element-registry.d.ts.map +1 -0
- package/dist/src/state/element-registry.js +222 -0
- package/dist/src/state/element-registry.js.map +1 -0
- package/dist/src/state/health.types.d.ts +93 -0
- package/dist/src/state/health.types.d.ts.map +1 -0
- package/dist/src/state/health.types.js +56 -0
- package/dist/src/state/health.types.js.map +1 -0
- package/dist/src/state/layer-detector.d.ts +23 -0
- package/dist/src/state/layer-detector.d.ts.map +1 -0
- package/dist/src/state/layer-detector.js +368 -0
- package/dist/src/state/layer-detector.js.map +1 -0
- package/dist/src/state/locator-generator.d.ts +21 -0
- package/dist/src/state/locator-generator.d.ts.map +1 -0
- package/dist/src/state/locator-generator.js +137 -0
- package/dist/src/state/locator-generator.js.map +1 -0
- package/dist/src/state/state-manager.d.ts +104 -0
- package/dist/src/state/state-manager.d.ts.map +1 -0
- package/dist/src/state/state-manager.js +618 -0
- package/dist/src/state/state-manager.js.map +1 -0
- package/dist/src/state/state-renderer.d.ts +63 -0
- package/dist/src/state/state-renderer.d.ts.map +1 -0
- package/dist/src/state/state-renderer.js +340 -0
- package/dist/src/state/state-renderer.js.map +1 -0
- package/dist/src/state/types.d.ts +353 -0
- package/dist/src/state/types.d.ts.map +1 -0
- package/dist/src/state/types.js +8 -0
- package/dist/src/state/types.js.map +1 -0
- package/dist/src/tools/browser-tools.d.ts +140 -0
- package/dist/src/tools/browser-tools.d.ts.map +1 -0
- package/dist/src/tools/browser-tools.js +657 -0
- package/dist/src/tools/browser-tools.js.map +1 -0
- package/dist/src/tools/errors.d.ts +63 -0
- package/dist/src/tools/errors.d.ts.map +1 -0
- package/dist/src/tools/errors.js +86 -0
- package/dist/src/tools/errors.js.map +1 -0
- package/dist/src/tools/execute-action.d.ts +135 -0
- package/dist/src/tools/execute-action.d.ts.map +1 -0
- package/dist/src/tools/execute-action.js +579 -0
- package/dist/src/tools/execute-action.js.map +1 -0
- package/dist/src/tools/form-tools.d.ts +109 -0
- package/dist/src/tools/form-tools.d.ts.map +1 -0
- package/dist/src/tools/form-tools.js +434 -0
- package/dist/src/tools/form-tools.js.map +1 -0
- package/dist/src/tools/index.d.ts +11 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +49 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/response-builder.d.ts +98 -0
- package/dist/src/tools/response-builder.d.ts.map +1 -0
- package/dist/src/tools/response-builder.js +219 -0
- package/dist/src/tools/response-builder.js.map +1 -0
- package/dist/src/tools/tool-schemas.d.ts +2482 -0
- package/dist/src/tools/tool-schemas.d.ts.map +1 -0
- package/dist/src/tools/tool-schemas.js +606 -0
- package/dist/src/tools/tool-schemas.js.map +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +16 -0
- package/dist/vitest.config.js.map +1 -0
- 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, '&')
|
|
359
|
+
.replace(/</g, '<')
|
|
360
|
+
.replace(/>/g, '>')
|
|
361
|
+
.replace(/"/g, '"')
|
|
362
|
+
.replace(/'/g, ''');
|
|
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, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
380
|
+
return `${name}='${escaped}'`;
|
|
381
|
+
}
|
|
382
|
+
// Default: double-quote wrapping with full escaping
|
|
383
|
+
const escaped = value
|
|
384
|
+
.replace(/&/g, '&')
|
|
385
|
+
.replace(/</g, '<')
|
|
386
|
+
.replace(/>/g, '>')
|
|
387
|
+
.replace(/"/g, '"')
|
|
388
|
+
.replace(/'/g, ''');
|
|
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"}
|