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,569 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser-side script for DOM observation.
|
|
3
|
+
*
|
|
4
|
+
* This script is injected into the browser context and runs continuously to capture
|
|
5
|
+
* significant DOM mutations. It uses universal web standards for significance detection -
|
|
6
|
+
* NO hardcoded text/class patterns.
|
|
7
|
+
*
|
|
8
|
+
* Shadow DOM Support:
|
|
9
|
+
* - Detects shadow hosts when elements are added
|
|
10
|
+
* - Attaches MutationObservers to open shadow roots
|
|
11
|
+
* - Tracks shadow path context for observations
|
|
12
|
+
* - Cleans up observers when shadow hosts are removed
|
|
13
|
+
*
|
|
14
|
+
* Note: Closed shadow roots cannot be observed (browser security).
|
|
15
|
+
*
|
|
16
|
+
* The script is returned as a string for page.evaluate().
|
|
17
|
+
*/
|
|
18
|
+
export const OBSERVATION_OBSERVER_SCRIPT = `
|
|
19
|
+
(function() {
|
|
20
|
+
// Prevent double-injection
|
|
21
|
+
if (window.__observationAccumulator) return;
|
|
22
|
+
|
|
23
|
+
const MAX_ENTRIES = 500;
|
|
24
|
+
const MAX_TEXT_LENGTH = 200;
|
|
25
|
+
const MAX_SHADOW_OBSERVERS = 50; // Limit to prevent performance issues
|
|
26
|
+
// IMPORTANT: Must match SIGNIFICANCE_THRESHOLD in observation.types.ts
|
|
27
|
+
const SIGNIFICANCE_THRESHOLD = 4;
|
|
28
|
+
// Node type constant for shadow root parent check
|
|
29
|
+
const DOCUMENT_FRAGMENT_NODE = 11;
|
|
30
|
+
|
|
31
|
+
// Significance weights (must match server-side observation.types.ts)
|
|
32
|
+
const WEIGHTS = {
|
|
33
|
+
// Semantic signals (strongest)
|
|
34
|
+
hasAlertRole: 3,
|
|
35
|
+
hasAriaLive: 3,
|
|
36
|
+
isDialog: 3,
|
|
37
|
+
|
|
38
|
+
// Visual signals
|
|
39
|
+
isFixedOrSticky: 2,
|
|
40
|
+
hasHighZIndex: 1,
|
|
41
|
+
coversSignificantViewport: 2,
|
|
42
|
+
|
|
43
|
+
// Structural signals
|
|
44
|
+
isBodyDirectChild: 1,
|
|
45
|
+
containsInteractiveElements: 1,
|
|
46
|
+
|
|
47
|
+
// New universal signals - work without ARIA
|
|
48
|
+
isVisibleInViewport: 2, // Element is visible in viewport
|
|
49
|
+
hasNonTrivialText: 1, // Has meaningful text content
|
|
50
|
+
// Temporal signals computed later
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
// Shadow DOM tracking
|
|
54
|
+
// Map: shadowRoot -> { observer, hostPath }
|
|
55
|
+
const shadowObservers = new Map();
|
|
56
|
+
|
|
57
|
+
// Track processed elements to avoid duplicate observations
|
|
58
|
+
// WeakSet allows garbage collection of removed elements
|
|
59
|
+
let processedElements = new WeakSet();
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Generate a stable identifier for an element (for shadow path tracking).
|
|
63
|
+
* Format: TAG#id or TAG.className or TAG[index]
|
|
64
|
+
*/
|
|
65
|
+
function getElementIdentifier(el) {
|
|
66
|
+
const tag = el.tagName.toLowerCase();
|
|
67
|
+
if (el.id) {
|
|
68
|
+
return tag + '#' + el.id;
|
|
69
|
+
}
|
|
70
|
+
// For custom elements, use the tag name (usually descriptive like 'my-toast')
|
|
71
|
+
if (tag.includes('-')) {
|
|
72
|
+
return tag;
|
|
73
|
+
}
|
|
74
|
+
// Fallback: use first class or just tag
|
|
75
|
+
const className = el.className && typeof el.className === 'string'
|
|
76
|
+
? el.className.split(' ')[0]
|
|
77
|
+
: '';
|
|
78
|
+
if (className) {
|
|
79
|
+
return tag + '.' + className;
|
|
80
|
+
}
|
|
81
|
+
return tag;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Tags whose text content should be excluded from extraction
|
|
85
|
+
const EXCLUDED_TEXT_TAGS = new Set(['STYLE', 'SCRIPT', 'NOSCRIPT', 'TEMPLATE', 'SVG']);
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get clean text content from an element, excluding CSS/JS content.
|
|
89
|
+
* Uses TreeWalker to iterate only text nodes, skipping those inside
|
|
90
|
+
* excluded tags (STYLE, SCRIPT, NOSCRIPT, TEMPLATE, SVG).
|
|
91
|
+
*
|
|
92
|
+
* @param {Element} el - The DOM element to extract text from
|
|
93
|
+
* @param {number} maxLength - Maximum text length (truncates result)
|
|
94
|
+
* @returns {string} Clean text content, space-joined, truncated to maxLength
|
|
95
|
+
*/
|
|
96
|
+
function getCleanTextContent(el, maxLength) {
|
|
97
|
+
// If element itself is an excluded tag, return empty
|
|
98
|
+
if (EXCLUDED_TEXT_TAGS.has(el.tagName.toUpperCase())) {
|
|
99
|
+
return '';
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const walker = document.createTreeWalker(el, 4, { // NodeFilter.SHOW_TEXT = 4
|
|
103
|
+
acceptNode: function(node) {
|
|
104
|
+
let parent = node.parentElement;
|
|
105
|
+
while (parent && parent !== el) {
|
|
106
|
+
if (EXCLUDED_TEXT_TAGS.has(parent.tagName.toUpperCase())) {
|
|
107
|
+
return 2; // FILTER_REJECT
|
|
108
|
+
}
|
|
109
|
+
parent = parent.parentElement;
|
|
110
|
+
}
|
|
111
|
+
return 1; // FILTER_ACCEPT
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
const textParts = [];
|
|
116
|
+
let totalLength = 0;
|
|
117
|
+
let node;
|
|
118
|
+
|
|
119
|
+
while ((node = walker.nextNode()) && totalLength < maxLength) {
|
|
120
|
+
const text = node.nodeValue;
|
|
121
|
+
if (text) {
|
|
122
|
+
const trimmed = text.trim();
|
|
123
|
+
if (trimmed) {
|
|
124
|
+
textParts.push(trimmed);
|
|
125
|
+
totalLength += trimmed.length;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return textParts.join(' ').substring(0, maxLength);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Compute significance signals from element.
|
|
135
|
+
* Uses universal web standards (ARIA, CSS positioning, DOM structure, visibility).
|
|
136
|
+
*/
|
|
137
|
+
function computeSignals(el, shadowPath) {
|
|
138
|
+
const role = el.getAttribute('role');
|
|
139
|
+
const ariaLive = el.getAttribute('aria-live');
|
|
140
|
+
const ariaModal = el.getAttribute('aria-modal');
|
|
141
|
+
const tagName = el.tagName.toLowerCase();
|
|
142
|
+
|
|
143
|
+
// Get computed style (may fail for detached elements)
|
|
144
|
+
let style = null;
|
|
145
|
+
let rect = null;
|
|
146
|
+
try {
|
|
147
|
+
style = getComputedStyle(el);
|
|
148
|
+
rect = el.getBoundingClientRect();
|
|
149
|
+
} catch (e) {
|
|
150
|
+
// Element may be detached
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const vw = window.innerWidth;
|
|
154
|
+
const vh = window.innerHeight;
|
|
155
|
+
|
|
156
|
+
// Check if element is visible in viewport
|
|
157
|
+
const isVisibleInViewport = rect && style &&
|
|
158
|
+
rect.width > 0 && rect.height > 0 &&
|
|
159
|
+
rect.bottom > 0 && rect.top < vh &&
|
|
160
|
+
rect.right > 0 && rect.left < vw &&
|
|
161
|
+
style.display !== 'none' &&
|
|
162
|
+
style.visibility !== 'hidden' &&
|
|
163
|
+
style.opacity !== '0';
|
|
164
|
+
|
|
165
|
+
// Check for non-trivial text (at least 3 chars, not just whitespace)
|
|
166
|
+
// Use short sample for signal check - excludes style/script content
|
|
167
|
+
const text = getCleanTextContent(el, 100);
|
|
168
|
+
const hasNonTrivialText = text.length >= 3;
|
|
169
|
+
|
|
170
|
+
// For shadow DOM elements, isBodyDirectChild is false but we still want to capture them
|
|
171
|
+
// Check if parent is a shadow root (which indicates top-level in shadow DOM)
|
|
172
|
+
const isTopLevelInShadow = shadowPath && shadowPath.length > 0 &&
|
|
173
|
+
el.parentNode && el.parentNode.nodeType === DOCUMENT_FRAGMENT_NODE;
|
|
174
|
+
|
|
175
|
+
return {
|
|
176
|
+
// Semantic signals
|
|
177
|
+
hasAlertRole: ['alert', 'status', 'log', 'alertdialog'].includes(role),
|
|
178
|
+
hasAriaLive: ariaLive === 'polite' || ariaLive === 'assertive',
|
|
179
|
+
isDialog: role === 'dialog' || tagName === 'dialog' || ariaModal === 'true',
|
|
180
|
+
|
|
181
|
+
// Visual signals
|
|
182
|
+
isFixedOrSticky: style && (style.position === 'fixed' || style.position === 'sticky'),
|
|
183
|
+
// Note: parseInt returns NaN for non-numeric values like "auto", which correctly fails the > 1000 check
|
|
184
|
+
hasHighZIndex: style && parseInt(style.zIndex, 10) > 1000,
|
|
185
|
+
coversSignificantViewport: rect && ((rect.width > vw * 0.5) || (rect.height > vh * 0.3)),
|
|
186
|
+
|
|
187
|
+
// Structural signals - consider top-level shadow DOM elements as equivalent to body children
|
|
188
|
+
isBodyDirectChild: el.parentElement === document.body || isTopLevelInShadow,
|
|
189
|
+
containsInteractiveElements: el.querySelector('button, a, input, select, textarea') !== null,
|
|
190
|
+
|
|
191
|
+
// Universal signals (work without ARIA)
|
|
192
|
+
isVisibleInViewport: !!isVisibleInViewport,
|
|
193
|
+
hasNonTrivialText: hasNonTrivialText,
|
|
194
|
+
|
|
195
|
+
// Temporal signals (set by accumulator later)
|
|
196
|
+
appearedAfterDelay: false,
|
|
197
|
+
wasShortLived: false,
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Calculate significance score from signals using weighted sum.
|
|
203
|
+
* @param signals - The computed significance signals for an element
|
|
204
|
+
* @returns The total significance score
|
|
205
|
+
*/
|
|
206
|
+
function computeSignificance(signals) {
|
|
207
|
+
let score = 0;
|
|
208
|
+
for (const [key, weight] of Object.entries(WEIGHTS)) {
|
|
209
|
+
if (signals[key]) score += weight;
|
|
210
|
+
}
|
|
211
|
+
return score;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Capture a mutation entry from an element.
|
|
216
|
+
* @param node - The DOM node
|
|
217
|
+
* @param type - 'added' or 'removed'
|
|
218
|
+
* @param shadowPath - Optional array of shadow host identifiers
|
|
219
|
+
*/
|
|
220
|
+
function captureEntry(node, type, shadowPath) {
|
|
221
|
+
if (node.nodeType !== 1) return null; // Element nodes only
|
|
222
|
+
|
|
223
|
+
const el = node;
|
|
224
|
+
const signals = computeSignals(el, shadowPath);
|
|
225
|
+
const significance = computeSignificance(signals);
|
|
226
|
+
|
|
227
|
+
// Only capture if meets threshold
|
|
228
|
+
if (significance < SIGNIFICANCE_THRESHOLD) return null;
|
|
229
|
+
|
|
230
|
+
// Capture content - excludes style/script content
|
|
231
|
+
const text = getCleanTextContent(el, MAX_TEXT_LENGTH);
|
|
232
|
+
const hasInteractives = signals.containsInteractiveElements;
|
|
233
|
+
|
|
234
|
+
// Get viewport coverage for later analysis
|
|
235
|
+
let viewportCoverage = { widthPct: 0, heightPct: 0 };
|
|
236
|
+
try {
|
|
237
|
+
const rect = el.getBoundingClientRect();
|
|
238
|
+
viewportCoverage = {
|
|
239
|
+
widthPct: Math.round((rect.width / window.innerWidth) * 100),
|
|
240
|
+
heightPct: Math.round((rect.height / window.innerHeight) * 100),
|
|
241
|
+
};
|
|
242
|
+
} catch (e) {
|
|
243
|
+
// Element may be detached
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// Get z-index
|
|
247
|
+
let zIndex = 0;
|
|
248
|
+
try {
|
|
249
|
+
zIndex = parseInt(getComputedStyle(el).zIndex, 10) || 0;
|
|
250
|
+
} catch (e) {
|
|
251
|
+
// Element may be detached
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const entry = {
|
|
255
|
+
type: type,
|
|
256
|
+
timestamp: Date.now(),
|
|
257
|
+
tag: el.tagName.toLowerCase(),
|
|
258
|
+
id: el.id || undefined,
|
|
259
|
+
|
|
260
|
+
// Semantic attributes
|
|
261
|
+
role: el.getAttribute('role') || undefined,
|
|
262
|
+
ariaLive: el.getAttribute('aria-live') || undefined,
|
|
263
|
+
ariaLabel: el.getAttribute('aria-label') || undefined,
|
|
264
|
+
ariaModal: el.getAttribute('aria-modal') || undefined,
|
|
265
|
+
|
|
266
|
+
// Content
|
|
267
|
+
text: text,
|
|
268
|
+
hasInteractives: hasInteractives,
|
|
269
|
+
|
|
270
|
+
// Visual signals
|
|
271
|
+
isFixedOrSticky: signals.isFixedOrSticky,
|
|
272
|
+
zIndex: zIndex,
|
|
273
|
+
viewportCoverage: viewportCoverage,
|
|
274
|
+
|
|
275
|
+
// Structural
|
|
276
|
+
isBodyDirectChild: signals.isBodyDirectChild,
|
|
277
|
+
|
|
278
|
+
// Universal signals
|
|
279
|
+
isVisibleInViewport: signals.isVisibleInViewport,
|
|
280
|
+
hasNonTrivialText: signals.hasNonTrivialText,
|
|
281
|
+
|
|
282
|
+
// Shadow DOM context
|
|
283
|
+
shadowPath: shadowPath && shadowPath.length > 0 ? shadowPath : undefined,
|
|
284
|
+
|
|
285
|
+
// Significance
|
|
286
|
+
significance: significance,
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
return entry;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
const log = [];
|
|
293
|
+
const pageLoadTime = Date.now();
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Process added nodes - capture entries and check for shadow roots.
|
|
297
|
+
* @param node - The added node
|
|
298
|
+
* @param shadowPath - Current shadow path context
|
|
299
|
+
*/
|
|
300
|
+
function processAddedNode(node, shadowPath) {
|
|
301
|
+
// Skip if already processed (prevents duplicates from nested shadow DOM)
|
|
302
|
+
if (node.nodeType === 1 && processedElements.has(node)) {
|
|
303
|
+
return;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
const entry = captureEntry(node, 'added', shadowPath);
|
|
307
|
+
if (entry) {
|
|
308
|
+
entry.appearedAfterDelay = (entry.timestamp - pageLoadTime) > 100;
|
|
309
|
+
log.push(entry);
|
|
310
|
+
// Mark as processed
|
|
311
|
+
if (node.nodeType === 1) {
|
|
312
|
+
processedElements.add(node);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// Check significant children - both ARIA-attributed and visible text elements
|
|
317
|
+
if (node.nodeType === 1) {
|
|
318
|
+
// First: ARIA-attributed elements (high confidence)
|
|
319
|
+
const ariaChildren = node.querySelectorAll(
|
|
320
|
+
'[role="alert"], [role="status"], [role="dialog"], [role="alertdialog"], [aria-live], [aria-modal], dialog'
|
|
321
|
+
);
|
|
322
|
+
for (const child of ariaChildren) {
|
|
323
|
+
// Skip if already processed
|
|
324
|
+
if (processedElements.has(child)) continue;
|
|
325
|
+
|
|
326
|
+
const childEntry = captureEntry(child, 'added', shadowPath);
|
|
327
|
+
if (childEntry) {
|
|
328
|
+
childEntry.appearedAfterDelay = (childEntry.timestamp - pageLoadTime) > 100;
|
|
329
|
+
log.push(childEntry);
|
|
330
|
+
processedElements.add(child);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Second: Any visible element with text (broader capture for sites without ARIA)
|
|
335
|
+
const textChildren = node.querySelectorAll('span, div, p, small, strong, em, label, li');
|
|
336
|
+
for (const child of textChildren) {
|
|
337
|
+
// Skip if already processed
|
|
338
|
+
if (processedElements.has(child)) continue;
|
|
339
|
+
|
|
340
|
+
// Skip if already captured via ARIA query
|
|
341
|
+
if (child.hasAttribute('role') || child.hasAttribute('aria-live')) continue;
|
|
342
|
+
|
|
343
|
+
// Only capture leaf-ish elements (minimal nested structure)
|
|
344
|
+
const hasDeepNesting = child.querySelector('div, p, ul, ol, table');
|
|
345
|
+
if (hasDeepNesting) continue;
|
|
346
|
+
|
|
347
|
+
const childEntry = captureEntry(child, 'added', shadowPath);
|
|
348
|
+
if (childEntry) {
|
|
349
|
+
childEntry.appearedAfterDelay = (childEntry.timestamp - pageLoadTime) > 100;
|
|
350
|
+
log.push(childEntry);
|
|
351
|
+
processedElements.add(child);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
// Check for shadow roots in this element and its descendants
|
|
356
|
+
checkAndObserveShadowRoots(node, shadowPath || []);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
/**
|
|
361
|
+
* Process removed nodes - capture entries and cleanup shadow observers.
|
|
362
|
+
* @param node - The removed node
|
|
363
|
+
* @param shadowPath - Current shadow path context
|
|
364
|
+
*/
|
|
365
|
+
function processRemovedNode(node, shadowPath) {
|
|
366
|
+
const entry = captureEntry(node, 'removed', shadowPath);
|
|
367
|
+
if (entry) {
|
|
368
|
+
log.push(entry);
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// Cleanup shadow observers for removed elements
|
|
372
|
+
if (node.nodeType === 1) {
|
|
373
|
+
cleanupShadowObservers(node);
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Create a mutation callback for observing a specific context (main DOM or shadow root).
|
|
379
|
+
* @param shadowPath - The shadow path context for this observer
|
|
380
|
+
*/
|
|
381
|
+
function createMutationCallback(shadowPath) {
|
|
382
|
+
return function(mutations) {
|
|
383
|
+
for (const m of mutations) {
|
|
384
|
+
// Capture added nodes
|
|
385
|
+
for (const node of m.addedNodes) {
|
|
386
|
+
processAddedNode(node, shadowPath);
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
// Capture removed nodes
|
|
390
|
+
for (const node of m.removedNodes) {
|
|
391
|
+
processRemovedNode(node, shadowPath);
|
|
392
|
+
}
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
// Trim if over limit (FIFO)
|
|
396
|
+
if (log.length > MAX_ENTRIES) {
|
|
397
|
+
const excess = log.length - MAX_ENTRIES;
|
|
398
|
+
log.splice(0, excess);
|
|
399
|
+
}
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
/**
|
|
404
|
+
* Observe a shadow root for mutations.
|
|
405
|
+
* @param shadowRoot - The shadow root to observe
|
|
406
|
+
* @param shadowPath - The path of shadow host identifiers leading to this shadow root
|
|
407
|
+
*/
|
|
408
|
+
function observeShadowRoot(shadowRoot, shadowPath) {
|
|
409
|
+
// Already observing this shadow root
|
|
410
|
+
if (shadowObservers.has(shadowRoot)) return;
|
|
411
|
+
|
|
412
|
+
// Limit number of shadow observers for performance
|
|
413
|
+
if (shadowObservers.size >= MAX_SHADOW_OBSERVERS) {
|
|
414
|
+
console.warn('[ObservationAccumulator] Max shadow observers reached, skipping:', shadowPath);
|
|
415
|
+
return;
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
const observer = new MutationObserver(createMutationCallback(shadowPath));
|
|
419
|
+
observer.observe(shadowRoot, {
|
|
420
|
+
childList: true,
|
|
421
|
+
subtree: true,
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
shadowObservers.set(shadowRoot, { observer, hostPath: shadowPath });
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Recursively check element and descendants for open shadow roots.
|
|
429
|
+
* @param element - The element to check
|
|
430
|
+
* @param currentShadowPath - The current shadow path context
|
|
431
|
+
* @param visited - Set of already-visited elements to prevent infinite recursion
|
|
432
|
+
*/
|
|
433
|
+
function checkAndObserveShadowRoots(element, currentShadowPath, visited) {
|
|
434
|
+
if (!element || element.nodeType !== 1) return;
|
|
435
|
+
|
|
436
|
+
// Initialize visited set on first call
|
|
437
|
+
if (!visited) {
|
|
438
|
+
visited = new Set();
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
// Prevent infinite recursion from circular references
|
|
442
|
+
if (visited.has(element)) return;
|
|
443
|
+
visited.add(element);
|
|
444
|
+
|
|
445
|
+
// Check if this element has an open shadow root
|
|
446
|
+
if (element.shadowRoot) {
|
|
447
|
+
const newPath = [...currentShadowPath, getElementIdentifier(element)];
|
|
448
|
+
observeShadowRoot(element.shadowRoot, newPath);
|
|
449
|
+
|
|
450
|
+
// Check shadow root's children for nested shadow roots
|
|
451
|
+
const shadowChildren = element.shadowRoot.querySelectorAll('*');
|
|
452
|
+
for (const child of shadowChildren) {
|
|
453
|
+
if (child.shadowRoot) {
|
|
454
|
+
checkAndObserveShadowRoots(child, newPath, visited);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
// Check light DOM children for shadow roots
|
|
460
|
+
const children = element.querySelectorAll('*');
|
|
461
|
+
for (const child of children) {
|
|
462
|
+
if (child.shadowRoot) {
|
|
463
|
+
checkAndObserveShadowRoots(child, currentShadowPath, visited);
|
|
464
|
+
}
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Cleanup shadow observers for a removed element and its descendants.
|
|
470
|
+
* @param element - The element being removed
|
|
471
|
+
*/
|
|
472
|
+
function cleanupShadowObservers(element) {
|
|
473
|
+
if (!element || element.nodeType !== 1) return;
|
|
474
|
+
|
|
475
|
+
// If element is a shadow host, cleanup its observer
|
|
476
|
+
if (element.shadowRoot && shadowObservers.has(element.shadowRoot)) {
|
|
477
|
+
const { observer } = shadowObservers.get(element.shadowRoot);
|
|
478
|
+
observer.disconnect();
|
|
479
|
+
shadowObservers.delete(element.shadowRoot);
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
// Recursively cleanup descendant shadow hosts
|
|
483
|
+
try {
|
|
484
|
+
const descendants = element.querySelectorAll('*');
|
|
485
|
+
for (const child of descendants) {
|
|
486
|
+
if (child.shadowRoot && shadowObservers.has(child.shadowRoot)) {
|
|
487
|
+
const { observer } = shadowObservers.get(child.shadowRoot);
|
|
488
|
+
observer.disconnect();
|
|
489
|
+
shadowObservers.delete(child.shadowRoot);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
} catch (e) {
|
|
493
|
+
// Element may be detached, ignore errors
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
// Create main observer for document.body
|
|
498
|
+
const observer = new MutationObserver(createMutationCallback(null));
|
|
499
|
+
|
|
500
|
+
// Start observing
|
|
501
|
+
if (document.body) {
|
|
502
|
+
observer.observe(document.body, {
|
|
503
|
+
childList: true,
|
|
504
|
+
subtree: true,
|
|
505
|
+
});
|
|
506
|
+
|
|
507
|
+
// Initial scan for existing shadow roots in the DOM
|
|
508
|
+
checkAndObserveShadowRoots(document.body, []);
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
window.__observationAccumulator = {
|
|
512
|
+
log: log,
|
|
513
|
+
observer: observer,
|
|
514
|
+
shadowObservers: shadowObservers, // Expose for debugging/testing
|
|
515
|
+
observedBody: document.body, // Track which body we're observing for staleness detection
|
|
516
|
+
pageLoadTime: pageLoadTime,
|
|
517
|
+
lastReportedIndex: 0, // Track what's been reported
|
|
518
|
+
|
|
519
|
+
// Get all entries since timestamp
|
|
520
|
+
getSince: function(timestamp) {
|
|
521
|
+
return this.log.filter(e => e.timestamp >= timestamp);
|
|
522
|
+
},
|
|
523
|
+
|
|
524
|
+
// Get significant entries since timestamp
|
|
525
|
+
getSignificant: function(timestamp, threshold) {
|
|
526
|
+
threshold = threshold || SIGNIFICANCE_THRESHOLD;
|
|
527
|
+
return this.log.filter(e => e.timestamp >= timestamp && e.significance >= threshold);
|
|
528
|
+
},
|
|
529
|
+
|
|
530
|
+
// Get unreported entries (for accumulation between tool calls)
|
|
531
|
+
getUnreported: function() {
|
|
532
|
+
const unreported = this.log.slice(this.lastReportedIndex);
|
|
533
|
+
return unreported.filter(e => e.significance >= SIGNIFICANCE_THRESHOLD);
|
|
534
|
+
},
|
|
535
|
+
|
|
536
|
+
// Mark entries as reported
|
|
537
|
+
markReported: function() {
|
|
538
|
+
this.lastReportedIndex = this.log.length;
|
|
539
|
+
},
|
|
540
|
+
|
|
541
|
+
// Reset on navigation
|
|
542
|
+
reset: function() {
|
|
543
|
+
this.log.length = 0;
|
|
544
|
+
this.lastReportedIndex = 0;
|
|
545
|
+
this.pageLoadTime = Date.now();
|
|
546
|
+
// Cleanup all shadow observers
|
|
547
|
+
for (const [shadowRoot, { observer }] of this.shadowObservers) {
|
|
548
|
+
observer.disconnect();
|
|
549
|
+
}
|
|
550
|
+
this.shadowObservers.clear();
|
|
551
|
+
// Clear processed elements tracking (create fresh WeakSet)
|
|
552
|
+
processedElements = new WeakSet();
|
|
553
|
+
},
|
|
554
|
+
|
|
555
|
+
// Re-scan for shadow roots (useful after dynamic content load)
|
|
556
|
+
rescanShadowRoots: function() {
|
|
557
|
+
if (document.body) {
|
|
558
|
+
checkAndObserveShadowRoots(document.body, []);
|
|
559
|
+
}
|
|
560
|
+
},
|
|
561
|
+
|
|
562
|
+
// Get shadow observer count (for debugging)
|
|
563
|
+
getShadowObserverCount: function() {
|
|
564
|
+
return this.shadowObservers.size;
|
|
565
|
+
},
|
|
566
|
+
};
|
|
567
|
+
})();
|
|
568
|
+
`;
|
|
569
|
+
//# sourceMappingURL=observer-script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"observer-script.js","sourceRoot":"","sources":["../../../src/observation/observer-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,CAAC,MAAM,2BAA2B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsiB1C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Engine Module
|
|
3
|
+
*
|
|
4
|
+
* Provides semantic querying of BaseSnapshot data.
|
|
5
|
+
*/
|
|
6
|
+
export * from './types/query.types.js';
|
|
7
|
+
export { QueryEngine } from './query-engine.js';
|
|
8
|
+
export type { QueryEngineOptions } from './query-engine.js';
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,cAAc,wBAAwB,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/query/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,QAAQ;AACR,cAAc,wBAAwB,CAAC;AAEvC,eAAe;AACf,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
|