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,544 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts rich metadata for form fields from a BaseSnapshot.
|
|
5
|
+
* Handles purpose inference, constraint extraction, and state tracking.
|
|
6
|
+
*
|
|
7
|
+
* Purpose inference priority:
|
|
8
|
+
* 1. input type attribute
|
|
9
|
+
* 2. autocomplete attribute
|
|
10
|
+
* 3. aria-label
|
|
11
|
+
* 4. label text
|
|
12
|
+
* 5. placeholder
|
|
13
|
+
* 6. name attribute
|
|
14
|
+
*
|
|
15
|
+
* @module form/field-extractor
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* Mapping from input type to semantic type
|
|
19
|
+
*/
|
|
20
|
+
const INPUT_TYPE_TO_SEMANTIC = {
|
|
21
|
+
email: 'email',
|
|
22
|
+
tel: 'phone',
|
|
23
|
+
password: 'password',
|
|
24
|
+
url: 'url',
|
|
25
|
+
search: 'search',
|
|
26
|
+
date: 'date',
|
|
27
|
+
'datetime-local': 'date',
|
|
28
|
+
time: 'date',
|
|
29
|
+
month: 'date',
|
|
30
|
+
week: 'date',
|
|
31
|
+
number: 'quantity',
|
|
32
|
+
file: 'file',
|
|
33
|
+
color: 'color',
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Mapping from autocomplete attribute to semantic type
|
|
37
|
+
*/
|
|
38
|
+
const AUTOCOMPLETE_TO_SEMANTIC = {
|
|
39
|
+
email: 'email',
|
|
40
|
+
tel: 'phone',
|
|
41
|
+
'tel-national': 'phone',
|
|
42
|
+
'tel-local': 'phone',
|
|
43
|
+
password: 'password',
|
|
44
|
+
'new-password': 'password',
|
|
45
|
+
'current-password': 'password',
|
|
46
|
+
username: 'username',
|
|
47
|
+
name: 'full_name',
|
|
48
|
+
'given-name': 'first_name',
|
|
49
|
+
'family-name': 'last_name',
|
|
50
|
+
'additional-name': 'name',
|
|
51
|
+
nickname: 'username',
|
|
52
|
+
'street-address': 'street',
|
|
53
|
+
'address-line1': 'street',
|
|
54
|
+
'address-line2': 'address',
|
|
55
|
+
'address-level1': 'state',
|
|
56
|
+
'address-level2': 'city',
|
|
57
|
+
'postal-code': 'zip',
|
|
58
|
+
country: 'country',
|
|
59
|
+
'country-name': 'country',
|
|
60
|
+
'cc-number': 'card_number',
|
|
61
|
+
'cc-exp': 'card_expiry',
|
|
62
|
+
'cc-exp-month': 'card_expiry',
|
|
63
|
+
'cc-exp-year': 'card_expiry',
|
|
64
|
+
'cc-csc': 'card_cvv',
|
|
65
|
+
bday: 'date_of_birth',
|
|
66
|
+
'bday-day': 'date_of_birth',
|
|
67
|
+
'bday-month': 'date_of_birth',
|
|
68
|
+
'bday-year': 'date_of_birth',
|
|
69
|
+
url: 'url',
|
|
70
|
+
photo: 'file',
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Keywords for semantic type inference from labels
|
|
74
|
+
*/
|
|
75
|
+
const LABEL_KEYWORDS = {
|
|
76
|
+
email: ['email', 'e-mail', 'mail address'],
|
|
77
|
+
phone: ['phone', 'telephone', 'mobile', 'cell', 'contact number'],
|
|
78
|
+
password: ['password', 'passcode', 'pin'],
|
|
79
|
+
password_confirm: ['confirm password', 'repeat password', 'retype password', 're-enter password'],
|
|
80
|
+
name: ['name', 'full name'],
|
|
81
|
+
first_name: ['first name', 'given name', 'forename'],
|
|
82
|
+
last_name: ['last name', 'surname', 'family name'],
|
|
83
|
+
full_name: ['full name', 'your name', 'customer name'],
|
|
84
|
+
username: ['username', 'user name', 'user id', 'login', 'account name'],
|
|
85
|
+
address: ['address', 'location'],
|
|
86
|
+
street: ['street', 'address line', 'street address'],
|
|
87
|
+
city: ['city', 'town', 'locality'],
|
|
88
|
+
state: ['state', 'province', 'region'],
|
|
89
|
+
zip: ['zip', 'postal code', 'postcode', 'zip code'],
|
|
90
|
+
country: ['country', 'nation'],
|
|
91
|
+
card_number: ['card number', 'credit card', 'debit card', 'card #'],
|
|
92
|
+
card_expiry: ['expiry', 'expiration', 'exp date', 'valid thru'],
|
|
93
|
+
card_cvv: ['cvv', 'cvc', 'security code', 'card verification'],
|
|
94
|
+
date: ['date', 'when'],
|
|
95
|
+
date_of_birth: ['birth', 'dob', 'birthday', 'date of birth'],
|
|
96
|
+
quantity: ['quantity', 'qty', 'amount', 'count', 'number of'],
|
|
97
|
+
price: ['price', 'cost', 'amount', 'total'],
|
|
98
|
+
search: ['search', 'find', 'lookup', 'query'],
|
|
99
|
+
comment: ['comment', 'note', 'remarks', 'feedback'],
|
|
100
|
+
message: ['message', 'text', 'content', 'body'],
|
|
101
|
+
url: ['url', 'website', 'link', 'web address'],
|
|
102
|
+
file: ['file', 'upload', 'attachment', 'document'],
|
|
103
|
+
color: ['color', 'colour'],
|
|
104
|
+
selection: ['select', 'choose', 'option'],
|
|
105
|
+
toggle: ['enable', 'disable', 'turn on', 'turn off'],
|
|
106
|
+
consent: ['agree', 'consent', 'accept', 'terms', 'privacy', 'subscribe'],
|
|
107
|
+
unknown: [],
|
|
108
|
+
};
|
|
109
|
+
/**
|
|
110
|
+
* Name patterns for semantic type inference.
|
|
111
|
+
* Maps common naming patterns (camelCase, snake_case, kebab-case) to semantic types.
|
|
112
|
+
*/
|
|
113
|
+
const NAME_PATTERNS = {
|
|
114
|
+
// Email patterns
|
|
115
|
+
email: 'email',
|
|
116
|
+
emailaddress: 'email',
|
|
117
|
+
email_address: 'email',
|
|
118
|
+
'email-address': 'email',
|
|
119
|
+
useremail: 'email',
|
|
120
|
+
user_email: 'email',
|
|
121
|
+
// Phone patterns
|
|
122
|
+
phone: 'phone',
|
|
123
|
+
phonenumber: 'phone',
|
|
124
|
+
phone_number: 'phone',
|
|
125
|
+
'phone-number': 'phone',
|
|
126
|
+
tel: 'phone',
|
|
127
|
+
telephone: 'phone',
|
|
128
|
+
mobile: 'phone',
|
|
129
|
+
// Password patterns
|
|
130
|
+
password: 'password',
|
|
131
|
+
passwd: 'password',
|
|
132
|
+
pass: 'password',
|
|
133
|
+
confirmpassword: 'password_confirm',
|
|
134
|
+
confirm_password: 'password_confirm',
|
|
135
|
+
passwordconfirm: 'password_confirm',
|
|
136
|
+
// Name patterns
|
|
137
|
+
firstname: 'first_name',
|
|
138
|
+
first_name: 'first_name',
|
|
139
|
+
'first-name': 'first_name',
|
|
140
|
+
givenname: 'first_name',
|
|
141
|
+
lastname: 'last_name',
|
|
142
|
+
last_name: 'last_name',
|
|
143
|
+
'last-name': 'last_name',
|
|
144
|
+
familyname: 'last_name',
|
|
145
|
+
fullname: 'full_name',
|
|
146
|
+
full_name: 'full_name',
|
|
147
|
+
// Username
|
|
148
|
+
username: 'username',
|
|
149
|
+
user_name: 'username',
|
|
150
|
+
userid: 'username',
|
|
151
|
+
user_id: 'username',
|
|
152
|
+
// Address
|
|
153
|
+
streetaddress: 'street',
|
|
154
|
+
street_address: 'street',
|
|
155
|
+
addressline: 'street',
|
|
156
|
+
address_line: 'street',
|
|
157
|
+
city: 'city',
|
|
158
|
+
state: 'state',
|
|
159
|
+
province: 'state',
|
|
160
|
+
zip: 'zip',
|
|
161
|
+
zipcode: 'zip',
|
|
162
|
+
zip_code: 'zip',
|
|
163
|
+
postalcode: 'zip',
|
|
164
|
+
postal_code: 'zip',
|
|
165
|
+
country: 'country',
|
|
166
|
+
// Payment
|
|
167
|
+
cardnumber: 'card_number',
|
|
168
|
+
card_number: 'card_number',
|
|
169
|
+
ccnumber: 'card_number',
|
|
170
|
+
cc_number: 'card_number',
|
|
171
|
+
cvv: 'card_cvv',
|
|
172
|
+
cvc: 'card_cvv',
|
|
173
|
+
expiry: 'card_expiry',
|
|
174
|
+
expiration: 'card_expiry',
|
|
175
|
+
// Dates
|
|
176
|
+
dateofbirth: 'date_of_birth',
|
|
177
|
+
date_of_birth: 'date_of_birth',
|
|
178
|
+
dob: 'date_of_birth',
|
|
179
|
+
birthday: 'date_of_birth',
|
|
180
|
+
birthdate: 'date_of_birth',
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Extract semantic type from naming patterns.
|
|
184
|
+
*
|
|
185
|
+
* @param label - The accessible label
|
|
186
|
+
* @param testId - Optional test ID attribute
|
|
187
|
+
* @returns Object with inferred type and signal description
|
|
188
|
+
*/
|
|
189
|
+
function extractNamePatterns(label, testId) {
|
|
190
|
+
// Normalize label to check against patterns
|
|
191
|
+
const normalizedLabel = label.toLowerCase().replace(/[^a-z0-9_-]/g, '');
|
|
192
|
+
// Check label against patterns
|
|
193
|
+
for (const [pattern, type] of Object.entries(NAME_PATTERNS)) {
|
|
194
|
+
if (normalizedLabel.includes(pattern)) {
|
|
195
|
+
return { type, signal: `label matches pattern "${pattern}"` };
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Check test_id against patterns
|
|
199
|
+
if (testId) {
|
|
200
|
+
const normalizedTestId = testId.toLowerCase().replace(/[^a-z0-9_-]/g, '');
|
|
201
|
+
for (const [pattern, type] of Object.entries(NAME_PATTERNS)) {
|
|
202
|
+
if (normalizedTestId.includes(pattern)) {
|
|
203
|
+
return { type, signal: `test_id matches pattern "${pattern}"` };
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return { type: 'unknown', signal: '' };
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Sensitive field types that should have values masked
|
|
211
|
+
*/
|
|
212
|
+
const SENSITIVE_TYPES = new Set([
|
|
213
|
+
'password',
|
|
214
|
+
'password_confirm',
|
|
215
|
+
'card_number',
|
|
216
|
+
'card_cvv',
|
|
217
|
+
]);
|
|
218
|
+
/**
|
|
219
|
+
* Extract form fields from a snapshot for given field EIDs.
|
|
220
|
+
*
|
|
221
|
+
* @param snapshot - BaseSnapshot containing the nodes
|
|
222
|
+
* @param fieldEids - Array of node IDs to extract as fields
|
|
223
|
+
* @param config - Form detection configuration
|
|
224
|
+
* @returns Array of FormField objects
|
|
225
|
+
*/
|
|
226
|
+
export function extractFields(snapshot, fieldEids, config) {
|
|
227
|
+
const fields = [];
|
|
228
|
+
for (let sequence = 0; sequence < fieldEids.length; sequence++) {
|
|
229
|
+
const eid = fieldEids[sequence];
|
|
230
|
+
const node = snapshot.nodes.find((n) => n.node_id === eid);
|
|
231
|
+
if (!node)
|
|
232
|
+
continue;
|
|
233
|
+
const field = extractField(node, sequence, snapshot, config);
|
|
234
|
+
if (field) {
|
|
235
|
+
fields.push(field);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
// Detect radio groups and link them
|
|
239
|
+
linkRadioGroups(fields, snapshot);
|
|
240
|
+
return fields;
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Extract a single form field from a node.
|
|
244
|
+
*/
|
|
245
|
+
function extractField(node, sequence, snapshot, config) {
|
|
246
|
+
// Infer purpose
|
|
247
|
+
const purpose = inferPurpose(node);
|
|
248
|
+
// Extract constraints
|
|
249
|
+
const constraints = extractConstraints(node, snapshot);
|
|
250
|
+
// Extract state
|
|
251
|
+
const state = extractFieldState(node, config, purpose.semantic_type);
|
|
252
|
+
return {
|
|
253
|
+
eid: node.node_id,
|
|
254
|
+
backend_node_id: node.backend_node_id,
|
|
255
|
+
frame_id: node.frame_id,
|
|
256
|
+
label: node.label,
|
|
257
|
+
kind: node.kind,
|
|
258
|
+
purpose,
|
|
259
|
+
constraints,
|
|
260
|
+
state,
|
|
261
|
+
sequence,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Infer the semantic purpose of a field.
|
|
266
|
+
*/
|
|
267
|
+
function inferPurpose(node) {
|
|
268
|
+
const inferredFrom = [];
|
|
269
|
+
let semanticType = 'unknown';
|
|
270
|
+
let confidence = 0;
|
|
271
|
+
// Priority 1: Input type attribute (high confidence)
|
|
272
|
+
const inputType = node.attributes?.input_type;
|
|
273
|
+
if (inputType && INPUT_TYPE_TO_SEMANTIC[inputType]) {
|
|
274
|
+
semanticType = INPUT_TYPE_TO_SEMANTIC[inputType];
|
|
275
|
+
confidence = 0.95;
|
|
276
|
+
inferredFrom.push(`input_type="${inputType}"`);
|
|
277
|
+
}
|
|
278
|
+
// Priority 2: Autocomplete attribute (high confidence)
|
|
279
|
+
const autocomplete = node.attributes?.autocomplete;
|
|
280
|
+
if (autocomplete && AUTOCOMPLETE_TO_SEMANTIC[autocomplete]) {
|
|
281
|
+
const autoType = AUTOCOMPLETE_TO_SEMANTIC[autocomplete];
|
|
282
|
+
if (semanticType === 'unknown' || confidence < 0.9) {
|
|
283
|
+
semanticType = autoType;
|
|
284
|
+
confidence = Math.max(confidence, 0.9);
|
|
285
|
+
inferredFrom.push(`autocomplete="${autocomplete}"`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
// Priority 3-5: Label, placeholder, aria-label (medium confidence)
|
|
289
|
+
// Note: node.label is the computed accessible name which includes aria-label,
|
|
290
|
+
// aria-labelledby, and other ARIA labeling mechanisms
|
|
291
|
+
if (semanticType === 'unknown' || confidence < 0.8) {
|
|
292
|
+
const textSources = [
|
|
293
|
+
{ text: node.label, source: 'label', confidence: 0.7 },
|
|
294
|
+
{ text: node.attributes?.placeholder, source: 'placeholder', confidence: 0.65 },
|
|
295
|
+
];
|
|
296
|
+
for (const { text, source, confidence: sourceConfidence } of textSources) {
|
|
297
|
+
if (!text)
|
|
298
|
+
continue;
|
|
299
|
+
const lowerText = text.toLowerCase();
|
|
300
|
+
for (const [type, keywords] of Object.entries(LABEL_KEYWORDS)) {
|
|
301
|
+
if (type === 'unknown')
|
|
302
|
+
continue;
|
|
303
|
+
for (const keyword of keywords) {
|
|
304
|
+
if (lowerText.includes(keyword)) {
|
|
305
|
+
if (semanticType === 'unknown' || confidence < sourceConfidence) {
|
|
306
|
+
semanticType = type;
|
|
307
|
+
confidence = Math.max(confidence, sourceConfidence);
|
|
308
|
+
inferredFrom.push(`${source} contains "${keyword}"`);
|
|
309
|
+
}
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
if (semanticType !== 'unknown' && confidence >= 0.7)
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
if (semanticType !== 'unknown' && confidence >= 0.7)
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// Priority 6: Name attribute patterns (low confidence: 0.5)
|
|
321
|
+
// Detect naming conventions like camelCase (firstName), snake_case (first_name),
|
|
322
|
+
// or kebab-case (first-name) that may indicate field purpose
|
|
323
|
+
if (semanticType === 'unknown' || confidence < 0.5) {
|
|
324
|
+
const testId = node.attributes?.test_id ?? '';
|
|
325
|
+
const namePatterns = extractNamePatterns(node.label, testId);
|
|
326
|
+
if (namePatterns.type !== 'unknown') {
|
|
327
|
+
semanticType = namePatterns.type;
|
|
328
|
+
confidence = Math.max(confidence, 0.5);
|
|
329
|
+
inferredFrom.push(namePatterns.signal);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
// Fallback based on node kind
|
|
333
|
+
if (semanticType === 'unknown') {
|
|
334
|
+
switch (node.kind) {
|
|
335
|
+
case 'checkbox':
|
|
336
|
+
semanticType = 'toggle';
|
|
337
|
+
confidence = 0.5;
|
|
338
|
+
inferredFrom.push('node kind is checkbox');
|
|
339
|
+
break;
|
|
340
|
+
case 'radio':
|
|
341
|
+
semanticType = 'selection';
|
|
342
|
+
confidence = 0.5;
|
|
343
|
+
inferredFrom.push('node kind is radio');
|
|
344
|
+
break;
|
|
345
|
+
case 'select':
|
|
346
|
+
case 'combobox':
|
|
347
|
+
semanticType = 'selection';
|
|
348
|
+
confidence = 0.5;
|
|
349
|
+
inferredFrom.push(`node kind is ${node.kind}`);
|
|
350
|
+
break;
|
|
351
|
+
case 'textarea':
|
|
352
|
+
semanticType = 'message';
|
|
353
|
+
confidence = 0.4;
|
|
354
|
+
inferredFrom.push('node kind is textarea');
|
|
355
|
+
break;
|
|
356
|
+
case 'slider':
|
|
357
|
+
semanticType = 'quantity';
|
|
358
|
+
confidence = 0.4;
|
|
359
|
+
inferredFrom.push('node kind is slider');
|
|
360
|
+
break;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return {
|
|
364
|
+
semantic_type: semanticType,
|
|
365
|
+
confidence,
|
|
366
|
+
inferred_from: inferredFrom.length > 0 ? inferredFrom : ['no signals found'],
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Extract constraints for a field.
|
|
371
|
+
*/
|
|
372
|
+
function extractConstraints(node, snapshot) {
|
|
373
|
+
const constraints = {
|
|
374
|
+
required: false,
|
|
375
|
+
required_confidence: 0,
|
|
376
|
+
};
|
|
377
|
+
// Check required state
|
|
378
|
+
if (node.state?.required) {
|
|
379
|
+
constraints.required = true;
|
|
380
|
+
constraints.required_confidence = 1.0;
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
// Check label for required indicators
|
|
384
|
+
const label = node.label.toLowerCase();
|
|
385
|
+
if (label.includes('*') || label.includes('required')) {
|
|
386
|
+
constraints.required = true;
|
|
387
|
+
constraints.required_confidence = 0.8;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
// Extract options for select/radio/combobox
|
|
391
|
+
if (node.kind === 'radio') {
|
|
392
|
+
// Find related radio buttons with same name pattern
|
|
393
|
+
constraints.options = extractRadioOptions(node, snapshot);
|
|
394
|
+
}
|
|
395
|
+
else if (node.kind === 'combobox' || node.kind === 'select') {
|
|
396
|
+
// Extract options for select/combobox elements
|
|
397
|
+
constraints.options = extractSelectOptions(node, snapshot);
|
|
398
|
+
}
|
|
399
|
+
// TODO: Extract more constraints from DOM attributes
|
|
400
|
+
// - minlength, maxlength
|
|
401
|
+
// - min, max, step
|
|
402
|
+
// - pattern
|
|
403
|
+
return constraints;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Extract options for radio button groups.
|
|
407
|
+
*/
|
|
408
|
+
function extractRadioOptions(node, snapshot) {
|
|
409
|
+
const options = [];
|
|
410
|
+
// Find all radio buttons in the same region/group
|
|
411
|
+
const radioButtons = snapshot.nodes.filter((n) => n.kind === 'radio' &&
|
|
412
|
+
n.where.region === node.where.region &&
|
|
413
|
+
(n.where.heading_context === node.where.heading_context ||
|
|
414
|
+
n.where.group_id === node.where.group_id));
|
|
415
|
+
for (const radio of radioButtons) {
|
|
416
|
+
options.push({
|
|
417
|
+
value: radio.label,
|
|
418
|
+
label: radio.label,
|
|
419
|
+
selected: radio.state?.checked ?? false,
|
|
420
|
+
disabled: !(radio.state?.enabled ?? true),
|
|
421
|
+
eid: radio.node_id,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
return options;
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Extract options for select/combobox elements.
|
|
428
|
+
*
|
|
429
|
+
* Attempts to find option elements by looking for:
|
|
430
|
+
* 1. Nodes in the same group with 'listitem' kind
|
|
431
|
+
* 2. Nodes with 'menuitem' kind that share the same region/group
|
|
432
|
+
* 3. If value is set, creates a single option representing current selection
|
|
433
|
+
*
|
|
434
|
+
* Note: Full option extraction may require additional CDP calls.
|
|
435
|
+
* This provides a best-effort extraction from available snapshot data.
|
|
436
|
+
*/
|
|
437
|
+
function extractSelectOptions(node, snapshot) {
|
|
438
|
+
const options = [];
|
|
439
|
+
// Look for listitem or menuitem nodes in the same group_id
|
|
440
|
+
if (node.where.group_id) {
|
|
441
|
+
const potentialOptions = snapshot.nodes.filter((n) => (n.kind === 'listitem' || n.kind === 'menuitem') &&
|
|
442
|
+
n.where.group_id === node.where.group_id &&
|
|
443
|
+
n.node_id !== node.node_id);
|
|
444
|
+
for (const opt of potentialOptions) {
|
|
445
|
+
const isSelected = opt.state?.selected ?? false;
|
|
446
|
+
options.push({
|
|
447
|
+
value: opt.label,
|
|
448
|
+
label: opt.label,
|
|
449
|
+
selected: isSelected,
|
|
450
|
+
disabled: !(opt.state?.enabled ?? true),
|
|
451
|
+
eid: opt.node_id,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
// If we found options, return them
|
|
456
|
+
if (options.length > 0) {
|
|
457
|
+
return options;
|
|
458
|
+
}
|
|
459
|
+
// Fallback: if node has a value, create a single option for the current selection
|
|
460
|
+
// This at least lets us know what's currently selected even if we can't see all options
|
|
461
|
+
if (node.attributes?.value) {
|
|
462
|
+
options.push({
|
|
463
|
+
value: node.attributes.value,
|
|
464
|
+
label: node.attributes.value,
|
|
465
|
+
selected: true,
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
return options;
|
|
469
|
+
}
|
|
470
|
+
/**
|
|
471
|
+
* Extract state for a field.
|
|
472
|
+
*
|
|
473
|
+
* Note: This extracts initial state from the snapshot (HTML attributes).
|
|
474
|
+
* Runtime values may be overlaid later via readRuntimeValues().
|
|
475
|
+
*/
|
|
476
|
+
function extractFieldState(node, config, semanticType) {
|
|
477
|
+
// Get value from HTML attribute, potentially masked
|
|
478
|
+
let currentValue = node.attributes?.value;
|
|
479
|
+
const isSensitive = SENSITIVE_TYPES.has(semanticType);
|
|
480
|
+
if (currentValue && isSensitive && config.mask_sensitive) {
|
|
481
|
+
currentValue = '••••••••';
|
|
482
|
+
}
|
|
483
|
+
// Determine if field has a value (from attribute)
|
|
484
|
+
// Note: Using || here intentionally because we want falsy values (empty string) to fall through
|
|
485
|
+
/* eslint-disable @typescript-eslint/prefer-nullish-coalescing */
|
|
486
|
+
const hasValue = Boolean(currentValue ||
|
|
487
|
+
node.state?.checked ||
|
|
488
|
+
(node.kind === 'checkbox' && node.state?.checked) ||
|
|
489
|
+
(node.kind === 'radio' && node.state?.checked));
|
|
490
|
+
/* eslint-enable @typescript-eslint/prefer-nullish-coalescing */
|
|
491
|
+
// Filled is initially same as hasValue (may be updated after runtime read)
|
|
492
|
+
const filled = hasValue;
|
|
493
|
+
// Determine validity
|
|
494
|
+
const valid = !(node.state?.invalid ?? false);
|
|
495
|
+
return {
|
|
496
|
+
current_value: currentValue,
|
|
497
|
+
value_source: currentValue !== undefined ? 'attribute' : undefined,
|
|
498
|
+
has_value: hasValue,
|
|
499
|
+
filled,
|
|
500
|
+
valid,
|
|
501
|
+
enabled: node.state?.enabled ?? true,
|
|
502
|
+
touched: false, // We can't know this without observing interactions
|
|
503
|
+
focused: node.state?.focused ?? false,
|
|
504
|
+
visible: node.state?.visible ?? true,
|
|
505
|
+
};
|
|
506
|
+
}
|
|
507
|
+
/**
|
|
508
|
+
* Link radio buttons into groups.
|
|
509
|
+
*/
|
|
510
|
+
function linkRadioGroups(fields, snapshot) {
|
|
511
|
+
const radioFields = fields.filter((f) => f.kind === 'radio');
|
|
512
|
+
// Group by heading context + region
|
|
513
|
+
const groups = new Map();
|
|
514
|
+
for (const field of radioFields) {
|
|
515
|
+
const node = snapshot.nodes.find((n) => n.node_id === field.eid);
|
|
516
|
+
if (!node)
|
|
517
|
+
continue;
|
|
518
|
+
const key = `${node.where.region}:${node.where.heading_context ?? ''}:${node.where.group_id ?? ''}`;
|
|
519
|
+
const group = groups.get(key) ?? [];
|
|
520
|
+
group.push(field);
|
|
521
|
+
groups.set(key, group);
|
|
522
|
+
}
|
|
523
|
+
// Link fields within each group
|
|
524
|
+
let groupIndex = 0;
|
|
525
|
+
for (const group of groups.values()) {
|
|
526
|
+
if (group.length > 1) {
|
|
527
|
+
const groupId = `radio-group-${groupIndex++}`;
|
|
528
|
+
for (const field of group) {
|
|
529
|
+
field.group_id = groupId;
|
|
530
|
+
field.dependents = group.filter((f) => f.eid !== field.eid).map((f) => f.eid);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
/**
|
|
536
|
+
* Extract a single field by EID.
|
|
537
|
+
*/
|
|
538
|
+
export function extractFieldByEid(snapshot, eid, config) {
|
|
539
|
+
const node = snapshot.nodes.find((n) => n.node_id === eid);
|
|
540
|
+
if (!node)
|
|
541
|
+
return null;
|
|
542
|
+
return extractField(node, 0, snapshot, config);
|
|
543
|
+
}
|
|
544
|
+
//# sourceMappingURL=field-extractor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-extractor.js","sourceRoot":"","sources":["../../../src/form/field-extractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Form Detector
|
|
3
|
+
*
|
|
4
|
+
* Detects logical form boundaries in a BaseSnapshot, regardless of
|
|
5
|
+
* HTML <form> tag presence. Uses signal scoring to identify form
|
|
6
|
+
* regions with confidence scores.
|
|
7
|
+
*
|
|
8
|
+
* Detection approaches:
|
|
9
|
+
* 1. Semantic: <form> tags, role="form", role="search", <fieldset>
|
|
10
|
+
* 2. Structural: Input clusters, label-input pairs, submit buttons
|
|
11
|
+
* 3. Naming: Form keywords in labels, field name patterns
|
|
12
|
+
*
|
|
13
|
+
* @module form/form-detector
|
|
14
|
+
*/
|
|
15
|
+
import type { BaseSnapshot } from '../snapshot/snapshot.types.js';
|
|
16
|
+
import type { FormRegion, FormDetectionConfig } from './types.js';
|
|
17
|
+
/**
|
|
18
|
+
* Form Detector class
|
|
19
|
+
*/
|
|
20
|
+
export declare class FormDetector {
|
|
21
|
+
private readonly config;
|
|
22
|
+
constructor(config?: Partial<FormDetectionConfig>);
|
|
23
|
+
/**
|
|
24
|
+
* Detect all form regions in a snapshot.
|
|
25
|
+
*
|
|
26
|
+
* @param snapshot - BaseSnapshot to analyze
|
|
27
|
+
* @returns Array of detected FormRegions
|
|
28
|
+
*/
|
|
29
|
+
detect(snapshot: BaseSnapshot): FormRegion[];
|
|
30
|
+
/**
|
|
31
|
+
* Detect explicit form elements (form tags, role=form, etc.)
|
|
32
|
+
*/
|
|
33
|
+
private detectExplicitForms;
|
|
34
|
+
/**
|
|
35
|
+
* Detect implicit forms (input clusters without form tag)
|
|
36
|
+
*/
|
|
37
|
+
private detectImplicitForms;
|
|
38
|
+
/**
|
|
39
|
+
* Cluster input nodes by proximity and structural context.
|
|
40
|
+
*/
|
|
41
|
+
private clusterInputs;
|
|
42
|
+
/**
|
|
43
|
+
* Check if a node is likely within a form's scope.
|
|
44
|
+
*/
|
|
45
|
+
private isNodeWithinForm;
|
|
46
|
+
/**
|
|
47
|
+
* Find a submit button associated with a form.
|
|
48
|
+
*/
|
|
49
|
+
private findSubmitButton;
|
|
50
|
+
/**
|
|
51
|
+
* Find a submit button near a cluster of inputs.
|
|
52
|
+
*/
|
|
53
|
+
private findSubmitButtonNearCluster;
|
|
54
|
+
/**
|
|
55
|
+
* Check if a button looks like a submit button.
|
|
56
|
+
*/
|
|
57
|
+
private isSubmitButton;
|
|
58
|
+
/**
|
|
59
|
+
* Compute confidence score from signals.
|
|
60
|
+
*/
|
|
61
|
+
private computeConfidence;
|
|
62
|
+
/**
|
|
63
|
+
* Infer the intent of a form.
|
|
64
|
+
*/
|
|
65
|
+
private inferIntent;
|
|
66
|
+
/**
|
|
67
|
+
* Check if text contains any of the given keywords.
|
|
68
|
+
*/
|
|
69
|
+
private hasIntentKeywords;
|
|
70
|
+
/**
|
|
71
|
+
* Compute bounding box for a cluster of nodes.
|
|
72
|
+
*/
|
|
73
|
+
private computeClusterBbox;
|
|
74
|
+
/**
|
|
75
|
+
* Build a FormRegion from a candidate.
|
|
76
|
+
*/
|
|
77
|
+
private buildFormRegion;
|
|
78
|
+
/**
|
|
79
|
+
* Generate a unique form ID.
|
|
80
|
+
*/
|
|
81
|
+
private generateFormId;
|
|
82
|
+
/**
|
|
83
|
+
* Extract form action buttons.
|
|
84
|
+
*/
|
|
85
|
+
private extractFormActions;
|
|
86
|
+
/**
|
|
87
|
+
* Check if a button is near a bounding box.
|
|
88
|
+
*/
|
|
89
|
+
private isButtonNearBbox;
|
|
90
|
+
/**
|
|
91
|
+
* Check if a button is near a set of fields.
|
|
92
|
+
*/
|
|
93
|
+
private isButtonNearFields;
|
|
94
|
+
/**
|
|
95
|
+
* Infer form pattern (single page, multi-step, etc.)
|
|
96
|
+
*/
|
|
97
|
+
private inferPattern;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Convenience function for detecting forms in a snapshot.
|
|
101
|
+
*/
|
|
102
|
+
export declare function detectForms(snapshot: BaseSnapshot, config?: Partial<FormDetectionConfig>): FormRegion[];
|
|
103
|
+
//# sourceMappingURL=form-detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-detector.d.ts","sourceRoot":"","sources":["../../../src/form/form-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAA0B,MAAM,+BAA+B,CAAC;AAC1F,OAAO,KAAK,EACV,UAAU,EAKV,mBAAmB,EACpB,MAAM,YAAY,CAAC;AA6IpB;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;gBAEjC,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC;IAIjD;;;;;OAKG;IACH,MAAM,CAAC,QAAQ,EAAE,YAAY,GAAG,UAAU,EAAE;IA8B5C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAyF3B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAkF3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAyDrB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAyCxB;;OAEG;IACH,OAAO,CAAC,gBAAgB;IA+BxB;;OAEG;IACH,OAAO,CAAC,2BAA2B;IAmCnC;;OAEG;IACH,OAAO,CAAC,cAAc;IAkBtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAYzB;;OAEG;IACH,OAAO,CAAC,WAAW;IAsDnB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAKzB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA6B1B;;OAEG;IACH,OAAO,CAAC,eAAe;IAuCvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAUtB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8C1B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAaxB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAe1B;;OAEG;IACH,OAAO,CAAC,YAAY;CAKrB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,MAAM,CAAC,EAAE,OAAO,CAAC,mBAAmB,CAAC,GACpC,UAAU,EAAE,CAGd"}
|