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