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,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Puppeteer CDP Client
|
|
3
|
+
*
|
|
4
|
+
* CdpClient implementation wrapping Puppeteer's CDPSession.
|
|
5
|
+
* Provides a consistent interface for CDP communication regardless
|
|
6
|
+
* of the underlying browser automation framework.
|
|
7
|
+
*/
|
|
8
|
+
import { getLogger } from '../shared/services/logging.service.js';
|
|
9
|
+
/**
|
|
10
|
+
* CdpClient implementation wrapping Puppeteer's CDPSession.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* import puppeteer from 'puppeteer-core';
|
|
15
|
+
*
|
|
16
|
+
* const browser = await puppeteer.launch({ channel: 'chrome' });
|
|
17
|
+
* const [page] = await browser.pages();
|
|
18
|
+
*
|
|
19
|
+
* // Create CDP session from Puppeteer page
|
|
20
|
+
* const cdpSession = await page.createCDPSession();
|
|
21
|
+
* const cdp = new PuppeteerCdpClient(cdpSession);
|
|
22
|
+
*
|
|
23
|
+
* // Use CDP commands
|
|
24
|
+
* const doc = await cdp.send('DOM.getDocument', { depth: -1 });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export class PuppeteerCdpClient {
|
|
28
|
+
session;
|
|
29
|
+
/** Default CDP domains that don't have .enable() methods */
|
|
30
|
+
static DEFAULT_DOMAINS_WITHOUT_ENABLE = new Set([
|
|
31
|
+
'Browser',
|
|
32
|
+
'Target',
|
|
33
|
+
'SystemInfo',
|
|
34
|
+
'Input',
|
|
35
|
+
'IO',
|
|
36
|
+
'DeviceAccess',
|
|
37
|
+
'Tethering',
|
|
38
|
+
'HeapProfiler',
|
|
39
|
+
'Schema',
|
|
40
|
+
]);
|
|
41
|
+
active = true;
|
|
42
|
+
logger = getLogger();
|
|
43
|
+
timeout;
|
|
44
|
+
enabledDomains = new Set();
|
|
45
|
+
eventHandlers = new Map();
|
|
46
|
+
domainsWithoutEnable;
|
|
47
|
+
/** Last error message from CDP operations */
|
|
48
|
+
lastError;
|
|
49
|
+
/** Timestamp of last error */
|
|
50
|
+
lastErrorTime;
|
|
51
|
+
constructor(session, options = {}) {
|
|
52
|
+
this.session = session;
|
|
53
|
+
this.timeout = options.timeout ?? 30000;
|
|
54
|
+
this.domainsWithoutEnable = options.domainsWithoutEnable
|
|
55
|
+
? new Set(options.domainsWithoutEnable)
|
|
56
|
+
: PuppeteerCdpClient.DEFAULT_DOMAINS_WITHOUT_ENABLE;
|
|
57
|
+
// Note: CDPSession doesn't expose lifecycle events.
|
|
58
|
+
// State is tracked via close() and error handling in send().
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Send a CDP command and wait for response.
|
|
62
|
+
* Automatically enables required domains if not already enabled.
|
|
63
|
+
*/
|
|
64
|
+
async send(method, params) {
|
|
65
|
+
if (!this.active) {
|
|
66
|
+
throw new Error('CDP session is closed');
|
|
67
|
+
}
|
|
68
|
+
// Validate method format (must be Domain.method)
|
|
69
|
+
if (!method.includes('.')) {
|
|
70
|
+
throw new Error(`Invalid CDP method format: "${method}". Expected "Domain.method" format.`);
|
|
71
|
+
}
|
|
72
|
+
// Extract domain from method (e.g., 'DOM' from 'DOM.getDocument')
|
|
73
|
+
const domain = method.split('.')[0];
|
|
74
|
+
// Auto-enable domain if needed (except for *.enable and *.disable methods)
|
|
75
|
+
if (!this.enabledDomains.has(domain) &&
|
|
76
|
+
!method.endsWith('.enable') &&
|
|
77
|
+
!method.endsWith('.disable')) {
|
|
78
|
+
await this.enableDomain(domain);
|
|
79
|
+
}
|
|
80
|
+
let timeoutId;
|
|
81
|
+
try {
|
|
82
|
+
// Puppeteer's CDPSession.send() accepts method as string and params as object
|
|
83
|
+
const result = await Promise.race([
|
|
84
|
+
this.session.send(method, params),
|
|
85
|
+
new Promise((_, reject) => {
|
|
86
|
+
timeoutId = setTimeout(() => {
|
|
87
|
+
reject(new Error(`CDP command timed out after ${this.timeout}ms: ${method}`));
|
|
88
|
+
}, this.timeout);
|
|
89
|
+
}),
|
|
90
|
+
]);
|
|
91
|
+
return result;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
// Detect session disconnection from error messages
|
|
95
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
96
|
+
// Track error for health diagnostics
|
|
97
|
+
this.lastError = errorMessage;
|
|
98
|
+
this.lastErrorTime = new Date();
|
|
99
|
+
// Check if this is an expected failure BEFORE evaluating session state
|
|
100
|
+
// Expected failures (like cross-origin frame access) shouldn't affect session health
|
|
101
|
+
const isExpectedFailure = this.isExpectedCdpFailure(method, errorMessage);
|
|
102
|
+
if (isExpectedFailure) {
|
|
103
|
+
this.logger.debug(`CDP command expected failure: ${method} - ${errorMessage}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
// Check for session-level failures that indicate CDP is no longer usable
|
|
107
|
+
// Be specific to avoid false positives from operation-level Protocol errors
|
|
108
|
+
const isSessionDead = errorMessage.includes('Target closed') ||
|
|
109
|
+
errorMessage.includes('Session closed') ||
|
|
110
|
+
errorMessage.includes('Session detached') ||
|
|
111
|
+
errorMessage.includes('Target crashed') ||
|
|
112
|
+
// Specific protocol errors that indicate session death
|
|
113
|
+
(errorMessage.includes('Protocol error') &&
|
|
114
|
+
(errorMessage.includes('Cannot find context') ||
|
|
115
|
+
errorMessage.includes('Inspected target navigated') ||
|
|
116
|
+
errorMessage.includes('No target with given id')));
|
|
117
|
+
if (isSessionDead) {
|
|
118
|
+
this.active = false;
|
|
119
|
+
this.enabledDomains.clear();
|
|
120
|
+
}
|
|
121
|
+
this.logger.error(`CDP command failed: ${method}`, error instanceof Error ? error : undefined);
|
|
122
|
+
}
|
|
123
|
+
throw error;
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
// Clear timeout to prevent memory leak
|
|
127
|
+
if (timeoutId) {
|
|
128
|
+
clearTimeout(timeoutId);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Subscribe to CDP events.
|
|
134
|
+
*/
|
|
135
|
+
on(event, handler) {
|
|
136
|
+
// Track handler for cleanup on close()
|
|
137
|
+
if (!this.eventHandlers.has(event)) {
|
|
138
|
+
this.eventHandlers.set(event, new Set());
|
|
139
|
+
}
|
|
140
|
+
this.eventHandlers.get(event).add(handler);
|
|
141
|
+
// Puppeteer CDPSession uses typed events, but we need to handle any event name
|
|
142
|
+
this.session.on(event, handler);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Unsubscribe from CDP events.
|
|
146
|
+
*/
|
|
147
|
+
off(event, handler) {
|
|
148
|
+
// Remove from tracking and clean up empty Sets
|
|
149
|
+
const handlers = this.eventHandlers.get(event);
|
|
150
|
+
handlers?.delete(handler);
|
|
151
|
+
if (handlers?.size === 0) {
|
|
152
|
+
this.eventHandlers.delete(event);
|
|
153
|
+
}
|
|
154
|
+
this.session.off(event, handler);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Subscribe to a CDP event once (auto-unsubscribes after first fire).
|
|
158
|
+
*/
|
|
159
|
+
once(event, handler) {
|
|
160
|
+
const wrappedHandler = (params) => {
|
|
161
|
+
this.off(event, wrappedHandler);
|
|
162
|
+
handler(params);
|
|
163
|
+
};
|
|
164
|
+
this.on(event, wrappedHandler);
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Close/detach the CDP session.
|
|
168
|
+
*/
|
|
169
|
+
async close() {
|
|
170
|
+
if (this.active) {
|
|
171
|
+
try {
|
|
172
|
+
// Remove all tracked event handlers first
|
|
173
|
+
this.removeAllEventHandlers();
|
|
174
|
+
await this.session.detach();
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
// Session may already be detached
|
|
178
|
+
this.logger.debug('Error detaching CDP session (may already be detached)', {
|
|
179
|
+
error: error instanceof Error ? error.message : String(error),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
this.active = false;
|
|
184
|
+
this.enabledDomains.clear();
|
|
185
|
+
this.eventHandlers.clear();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Check if a CDP failure is expected (not worth logging as error).
|
|
191
|
+
* Some CDP commands fail for valid reasons (e.g., box model for hidden elements).
|
|
192
|
+
*/
|
|
193
|
+
isExpectedCdpFailure(method, errorMessage) {
|
|
194
|
+
// DOM.getBoxModel fails for non-rendered elements
|
|
195
|
+
if (method === 'DOM.getBoxModel' && errorMessage.includes('Could not compute box model')) {
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
// CSS.getComputedStyleForNode may fail for detached nodes
|
|
199
|
+
if (method === 'CSS.getComputedStyleForNode' && errorMessage.includes('not found')) {
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Remove all tracked event handlers from the session.
|
|
206
|
+
*/
|
|
207
|
+
removeAllEventHandlers() {
|
|
208
|
+
for (const [event, handlers] of this.eventHandlers) {
|
|
209
|
+
for (const handler of handlers) {
|
|
210
|
+
try {
|
|
211
|
+
this.session.off(event, handler);
|
|
212
|
+
}
|
|
213
|
+
catch (err) {
|
|
214
|
+
// Handler may already be removed
|
|
215
|
+
this.logger.debug('Failed to remove event handler during cleanup', {
|
|
216
|
+
event,
|
|
217
|
+
error: err instanceof Error ? err.message : String(err),
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Check if session is still active.
|
|
225
|
+
*/
|
|
226
|
+
isActive() {
|
|
227
|
+
return this.active;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Get detailed health diagnostics for this CDP session.
|
|
231
|
+
*
|
|
232
|
+
* Includes:
|
|
233
|
+
* - active: Whether session is operational
|
|
234
|
+
* - lastError: Last error message if any
|
|
235
|
+
* - lastErrorTime: When the last error occurred
|
|
236
|
+
*/
|
|
237
|
+
getHealth() {
|
|
238
|
+
return {
|
|
239
|
+
active: this.active,
|
|
240
|
+
lastError: this.lastError,
|
|
241
|
+
lastErrorTime: this.lastErrorTime,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Get the set of currently enabled CDP domains.
|
|
246
|
+
*/
|
|
247
|
+
getEnabledDomains() {
|
|
248
|
+
return this.enabledDomains;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Enable a CDP domain (e.g., 'DOM', 'Page', 'Accessibility').
|
|
252
|
+
* Automatically called by send() when needed.
|
|
253
|
+
*/
|
|
254
|
+
async enableDomain(domain) {
|
|
255
|
+
// Check if domain doesn't require enable
|
|
256
|
+
if (this.domainsWithoutEnable.has(domain)) {
|
|
257
|
+
this.enabledDomains.add(domain);
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
try {
|
|
261
|
+
await this.session.send(`${domain}.enable`);
|
|
262
|
+
this.enabledDomains.add(domain);
|
|
263
|
+
this.logger.debug(`Enabled CDP domain: ${domain}`);
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// Some domains may not support enable or may already be enabled
|
|
267
|
+
this.logger.debug(`Could not enable domain ${domain} (may not support enable or already enabled)`);
|
|
268
|
+
// Still mark as enabled to avoid repeated attempts
|
|
269
|
+
this.enabledDomains.add(domain);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=puppeteer-cdp-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"puppeteer-cdp-client.js","sourceRoot":"","sources":["../../../src/cdp/puppeteer-cdp-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Argument Parsing
|
|
3
|
+
*
|
|
4
|
+
* Parses command-line arguments for server configuration.
|
|
5
|
+
* All browser initialization is controlled via these arguments.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Server configuration from CLI arguments
|
|
9
|
+
*/
|
|
10
|
+
export interface ServerArgs {
|
|
11
|
+
/** Run browser in headless mode (default: false) */
|
|
12
|
+
headless: boolean;
|
|
13
|
+
/** Use isolated temp profile instead of persistent (default: false) */
|
|
14
|
+
isolated: boolean;
|
|
15
|
+
/** HTTP endpoint URL for connecting to existing browser */
|
|
16
|
+
browserUrl?: string;
|
|
17
|
+
/** WebSocket endpoint URL for connecting to existing browser */
|
|
18
|
+
wsEndpoint?: string;
|
|
19
|
+
/** Auto-connect to Chrome 144+ via DevToolsActivePort */
|
|
20
|
+
autoConnect: boolean;
|
|
21
|
+
/** Chrome user data directory */
|
|
22
|
+
userDataDir?: string;
|
|
23
|
+
/** Chrome channel to use */
|
|
24
|
+
channel?: 'chrome' | 'chrome-canary' | 'chrome-beta' | 'chrome-dev';
|
|
25
|
+
/** Path to Chrome executable */
|
|
26
|
+
executablePath?: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse command-line arguments into ServerArgs.
|
|
30
|
+
*
|
|
31
|
+
* @param argv - Command line arguments (process.argv.slice(2))
|
|
32
|
+
* @returns Parsed server configuration
|
|
33
|
+
*/
|
|
34
|
+
export declare function parseArgs(argv: string[]): ServerArgs;
|
|
35
|
+
//# sourceMappingURL=args.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.d.ts","sourceRoot":"","sources":["../../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,oDAAoD;IACpD,QAAQ,EAAE,OAAO,CAAC;IAElB,uEAAuE;IACvE,QAAQ,EAAE,OAAO,CAAC;IAElB,2DAA2D;IAC3D,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gEAAgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,yDAAyD;IACzD,WAAW,EAAE,OAAO,CAAC;IAErB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,4BAA4B;IAC5B,OAAO,CAAC,EAAE,QAAQ,GAAG,eAAe,GAAG,aAAa,GAAG,YAAY,CAAC;IAEpE,gCAAgC;IAChC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAwBD;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAmCpD"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Argument Parsing
|
|
3
|
+
*
|
|
4
|
+
* Parses command-line arguments for server configuration.
|
|
5
|
+
* All browser initialization is controlled via these arguments.
|
|
6
|
+
*/
|
|
7
|
+
/** Known CLI argument base names for validation */
|
|
8
|
+
const KNOWN_ARG_NAMES = new Set([
|
|
9
|
+
'headless',
|
|
10
|
+
'isolated',
|
|
11
|
+
'autoConnect',
|
|
12
|
+
'browserUrl',
|
|
13
|
+
'wsEndpoint',
|
|
14
|
+
'userDataDir',
|
|
15
|
+
'channel',
|
|
16
|
+
'executablePath',
|
|
17
|
+
]);
|
|
18
|
+
/**
|
|
19
|
+
* Check if an argument is a known CLI flag (handles --arg and --arg=value forms).
|
|
20
|
+
*/
|
|
21
|
+
function isKnownArg(arg) {
|
|
22
|
+
if (!arg.startsWith('--'))
|
|
23
|
+
return true; // Not a flag, skip validation
|
|
24
|
+
const withoutDashes = arg.slice(2);
|
|
25
|
+
const baseName = withoutDashes.split('=')[0];
|
|
26
|
+
return KNOWN_ARG_NAMES.has(baseName);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Parse command-line arguments into ServerArgs.
|
|
30
|
+
*
|
|
31
|
+
* @param argv - Command line arguments (process.argv.slice(2))
|
|
32
|
+
* @returns Parsed server configuration
|
|
33
|
+
*/
|
|
34
|
+
export function parseArgs(argv) {
|
|
35
|
+
const args = {
|
|
36
|
+
headless: false,
|
|
37
|
+
isolated: false,
|
|
38
|
+
autoConnect: false,
|
|
39
|
+
};
|
|
40
|
+
for (let i = 0; i < argv.length; i++) {
|
|
41
|
+
const arg = argv[i];
|
|
42
|
+
if (arg === '--headless=false' || arg === '--headless=0') {
|
|
43
|
+
args.headless = false;
|
|
44
|
+
}
|
|
45
|
+
else if (arg === '--headless=true' || arg === '--headless=1' || arg === '--headless') {
|
|
46
|
+
args.headless = true;
|
|
47
|
+
}
|
|
48
|
+
else if (arg === '--isolated') {
|
|
49
|
+
args.isolated = true;
|
|
50
|
+
}
|
|
51
|
+
else if (arg === '--autoConnect') {
|
|
52
|
+
args.autoConnect = true;
|
|
53
|
+
}
|
|
54
|
+
else if (arg === '--browserUrl' && argv[i + 1]) {
|
|
55
|
+
args.browserUrl = argv[++i];
|
|
56
|
+
}
|
|
57
|
+
else if (arg === '--wsEndpoint' && argv[i + 1]) {
|
|
58
|
+
args.wsEndpoint = argv[++i];
|
|
59
|
+
}
|
|
60
|
+
else if (arg === '--userDataDir' && argv[i + 1]) {
|
|
61
|
+
args.userDataDir = argv[++i];
|
|
62
|
+
}
|
|
63
|
+
else if (arg === '--channel' && argv[i + 1]) {
|
|
64
|
+
args.channel = argv[++i];
|
|
65
|
+
}
|
|
66
|
+
else if (arg === '--executablePath' && argv[i + 1]) {
|
|
67
|
+
args.executablePath = argv[++i];
|
|
68
|
+
}
|
|
69
|
+
else if (!isKnownArg(arg)) {
|
|
70
|
+
// Warn about unknown arguments to catch typos like --hedless
|
|
71
|
+
console.warn(`Warning: Unknown argument "${arg}" - ignored`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return args;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=args.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"args.js","sourceRoot":"","sources":["../../../src/cli/args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AA+BH,mDAAmD;AACnD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;IAC9B,UAAU;IACV,UAAU;IACV,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,SAAS;IACT,gBAAgB;CACjB,CAAC,CAAC;AAEH;;GAEG;AACH,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,CAAC,8BAA8B;IACtE,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,SAAS,CAAC,IAAc;IACtC,MAAM,IAAI,GAAe;QACvB,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,KAAK;QACf,WAAW,EAAE,KAAK;KACnB,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpB,IAAI,GAAG,KAAK,kBAAkB,IAAI,GAAG,KAAK,cAAc,EAAE,CAAC;YACzD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,KAAK,iBAAiB,IAAI,GAAG,KAAK,cAAc,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YACvF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,YAAY,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACvB,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;aAAM,IAAI,GAAG,KAAK,cAAc,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,KAAK,cAAc,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;aAAM,IAAI,GAAG,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAClD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,GAAG,KAAK,WAAW,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE,CAAC,CAA0B,CAAC;QACpD,CAAC;aAAM,IAAI,GAAG,KAAK,kBAAkB,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;YACrD,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;aAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,6DAA6D;YAC7D,OAAO,CAAC,IAAI,CAAC,8BAA8B,GAAG,aAAa,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Stabilizer
|
|
3
|
+
*
|
|
4
|
+
* Waits for DOM to stabilize after an action with guaranteed termination.
|
|
5
|
+
* Uses MutationObserver to detect when mutations settle.
|
|
6
|
+
*/
|
|
7
|
+
import type { Page } from 'puppeteer-core';
|
|
8
|
+
/**
|
|
9
|
+
* Options for DOM stabilization.
|
|
10
|
+
*/
|
|
11
|
+
export interface StabilizationOptions {
|
|
12
|
+
/** Time window of no mutations to consider DOM stable (ms). Default: 100ms */
|
|
13
|
+
quietWindowMs?: number;
|
|
14
|
+
/** Maximum time to wait before timing out (ms). Default: 2000ms */
|
|
15
|
+
maxTimeoutMs?: number;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Result of DOM stabilization.
|
|
19
|
+
*/
|
|
20
|
+
export interface StabilizationResult {
|
|
21
|
+
/** Status of stabilization */
|
|
22
|
+
status: 'stable' | 'timeout' | 'error';
|
|
23
|
+
/** Time waited for stabilization (ms) */
|
|
24
|
+
waitTimeMs: number;
|
|
25
|
+
/** Number of mutations observed during stabilization */
|
|
26
|
+
mutationCount?: number;
|
|
27
|
+
/** Warning message if timeout or error */
|
|
28
|
+
warning?: string;
|
|
29
|
+
}
|
|
30
|
+
/** Type alias for compatibility */
|
|
31
|
+
export type DomStability = StabilizationResult;
|
|
32
|
+
/**
|
|
33
|
+
* Wait for DOM to stabilize with guaranteed termination.
|
|
34
|
+
*
|
|
35
|
+
* Uses MutationObserver in the browser to detect when mutations stop.
|
|
36
|
+
* Returns when either:
|
|
37
|
+
* - No mutations observed for quietWindowMs (stable)
|
|
38
|
+
* - maxTimeoutMs elapsed (timeout)
|
|
39
|
+
* - An error occurred (error)
|
|
40
|
+
*
|
|
41
|
+
* @param page - Puppeteer Page instance
|
|
42
|
+
* @param options - Stabilization options
|
|
43
|
+
* @returns StabilizationResult with status and timing info
|
|
44
|
+
*/
|
|
45
|
+
export declare function stabilizeDom(page: Page, options?: StabilizationOptions): Promise<StabilizationResult>;
|
|
46
|
+
//# sourceMappingURL=dom-stabilizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-stabilizer.d.ts","sourceRoot":"","sources":["../../../src/delta/dom-stabilizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,8EAA8E;IAC9E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,8BAA8B;IAC9B,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACvC,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0CAA0C;IAC1C,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,mCAAmC;AACnC,MAAM,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAmC/C;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CAiH9B"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM Stabilizer
|
|
3
|
+
*
|
|
4
|
+
* Waits for DOM to stabilize after an action with guaranteed termination.
|
|
5
|
+
* Uses MutationObserver to detect when mutations settle.
|
|
6
|
+
*/
|
|
7
|
+
/** Default quiet window in milliseconds */
|
|
8
|
+
const DEFAULT_QUIET_WINDOW_MS = 100;
|
|
9
|
+
/** Default hard timeout in milliseconds */
|
|
10
|
+
const DEFAULT_MAX_TIMEOUT_MS = 2000;
|
|
11
|
+
/**
|
|
12
|
+
* Wait for DOM to stabilize with guaranteed termination.
|
|
13
|
+
*
|
|
14
|
+
* Uses MutationObserver in the browser to detect when mutations stop.
|
|
15
|
+
* Returns when either:
|
|
16
|
+
* - No mutations observed for quietWindowMs (stable)
|
|
17
|
+
* - maxTimeoutMs elapsed (timeout)
|
|
18
|
+
* - An error occurred (error)
|
|
19
|
+
*
|
|
20
|
+
* @param page - Puppeteer Page instance
|
|
21
|
+
* @param options - Stabilization options
|
|
22
|
+
* @returns StabilizationResult with status and timing info
|
|
23
|
+
*/
|
|
24
|
+
export async function stabilizeDom(page, options = {}) {
|
|
25
|
+
const quietWindowMs = options.quietWindowMs ?? DEFAULT_QUIET_WINDOW_MS;
|
|
26
|
+
const maxTimeoutMs = options.maxTimeoutMs ?? DEFAULT_MAX_TIMEOUT_MS;
|
|
27
|
+
const startTime = Date.now();
|
|
28
|
+
try {
|
|
29
|
+
const result = await page.evaluate(({ quietWindowMs, maxTimeoutMs }) => {
|
|
30
|
+
return new Promise((resolve) => {
|
|
31
|
+
// Guard: document.body may not exist during navigation
|
|
32
|
+
if (!document.body) {
|
|
33
|
+
resolve({ stable: false, elapsed: 0, mutationCount: 0 });
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
let quietTimer = null;
|
|
37
|
+
let mutationCount = 0;
|
|
38
|
+
const start = performance.now();
|
|
39
|
+
// Hard timeout - always resolves
|
|
40
|
+
const hardTimeout = window.setTimeout(() => {
|
|
41
|
+
cleanup();
|
|
42
|
+
resolve({
|
|
43
|
+
stable: false,
|
|
44
|
+
elapsed: performance.now() - start,
|
|
45
|
+
mutationCount,
|
|
46
|
+
});
|
|
47
|
+
}, maxTimeoutMs);
|
|
48
|
+
const observer = new MutationObserver(() => {
|
|
49
|
+
mutationCount++;
|
|
50
|
+
// Reset quiet timer on each mutation
|
|
51
|
+
if (quietTimer !== null) {
|
|
52
|
+
clearTimeout(quietTimer);
|
|
53
|
+
}
|
|
54
|
+
quietTimer = window.setTimeout(() => {
|
|
55
|
+
cleanup();
|
|
56
|
+
resolve({
|
|
57
|
+
stable: true,
|
|
58
|
+
elapsed: performance.now() - start,
|
|
59
|
+
mutationCount,
|
|
60
|
+
});
|
|
61
|
+
}, quietWindowMs);
|
|
62
|
+
});
|
|
63
|
+
function cleanup() {
|
|
64
|
+
if (quietTimer !== null)
|
|
65
|
+
clearTimeout(quietTimer);
|
|
66
|
+
clearTimeout(hardTimeout);
|
|
67
|
+
observer.disconnect();
|
|
68
|
+
}
|
|
69
|
+
// Start observing
|
|
70
|
+
try {
|
|
71
|
+
observer.observe(document.body, {
|
|
72
|
+
childList: true,
|
|
73
|
+
subtree: true,
|
|
74
|
+
attributes: true,
|
|
75
|
+
characterData: true,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Observer failed (rare edge case)
|
|
80
|
+
cleanup();
|
|
81
|
+
resolve({ stable: false, elapsed: 0, mutationCount: 0 });
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Initial quiet timer (page may already be stable)
|
|
85
|
+
quietTimer = window.setTimeout(() => {
|
|
86
|
+
cleanup();
|
|
87
|
+
resolve({
|
|
88
|
+
stable: true,
|
|
89
|
+
elapsed: performance.now() - start,
|
|
90
|
+
mutationCount,
|
|
91
|
+
});
|
|
92
|
+
}, quietWindowMs);
|
|
93
|
+
});
|
|
94
|
+
}, { quietWindowMs, maxTimeoutMs });
|
|
95
|
+
const waitTimeMs = Date.now() - startTime;
|
|
96
|
+
if (result.stable) {
|
|
97
|
+
return {
|
|
98
|
+
status: 'stable',
|
|
99
|
+
waitTimeMs,
|
|
100
|
+
mutationCount: result.mutationCount,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
status: 'timeout',
|
|
105
|
+
waitTimeMs,
|
|
106
|
+
mutationCount: result.mutationCount,
|
|
107
|
+
warning: `DOM still mutating after ${maxTimeoutMs}ms (${result.mutationCount} mutations observed). Snapshot may be incomplete.`,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
catch (error) {
|
|
111
|
+
// page.evaluate failed - likely navigation occurred
|
|
112
|
+
const waitTimeMs = Date.now() - startTime;
|
|
113
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
114
|
+
return {
|
|
115
|
+
status: 'error',
|
|
116
|
+
waitTimeMs,
|
|
117
|
+
warning: `Stabilization interrupted: ${message}. Page may have navigated.`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=dom-stabilizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-stabilizer.js","sourceRoot":"","sources":["../../../src/delta/dom-stabilizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/delta/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/delta/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Action Selector
|
|
3
|
+
*
|
|
4
|
+
* Selects and scores key actions from a BaseSnapshot.
|
|
5
|
+
*
|
|
6
|
+
* Design: Generic First, Specific Second
|
|
7
|
+
* 1. Score ALL interactive elements generically (works on any page)
|
|
8
|
+
* 2. Optionally categorize actions (may return 'generic')
|
|
9
|
+
* 3. Select top actions above threshold
|
|
10
|
+
*/
|
|
11
|
+
import type { BaseSnapshot } from '../snapshot/snapshot.types.js';
|
|
12
|
+
import type { ActionSelectionResult, DialogDetectionResult, FormDetectionResult, PageClassification } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Options for action selection.
|
|
15
|
+
*/
|
|
16
|
+
export interface ActionSelectionOptions {
|
|
17
|
+
/** Max actions to return (default: 12) */
|
|
18
|
+
max_actions?: number;
|
|
19
|
+
/** Min score threshold (default: 0.2) */
|
|
20
|
+
min_action_score?: number;
|
|
21
|
+
/** Form detection result for context */
|
|
22
|
+
forms?: FormDetectionResult;
|
|
23
|
+
/** Dialog detection result for context */
|
|
24
|
+
dialogs?: DialogDetectionResult;
|
|
25
|
+
/** Page classification for context */
|
|
26
|
+
pageType?: PageClassification;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Select key actions from a BaseSnapshot.
|
|
30
|
+
*
|
|
31
|
+
* @param snapshot - The snapshot to analyze
|
|
32
|
+
* @param options - Selection options
|
|
33
|
+
* @returns Selection result with top actions and metadata
|
|
34
|
+
*/
|
|
35
|
+
export declare function selectKeyActions(snapshot: BaseSnapshot, options?: ActionSelectionOptions): ActionSelectionResult;
|
|
36
|
+
//# sourceMappingURL=action-selector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-selector.d.ts","sourceRoot":"","sources":["../../../src/factpack/action-selector.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,+BAA+B,CAAC;AAGpG,OAAO,KAAK,EACV,qBAAqB,EAIrB,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAyTpB;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,yCAAyC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,wCAAwC;IACxC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAE5B,0CAA0C;IAC1C,OAAO,CAAC,EAAE,qBAAqB,CAAC;IAEhC,sCAAsC;IACtC,QAAQ,CAAC,EAAE,kBAAkB,CAAC;CAC/B;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,YAAY,EACtB,OAAO,GAAE,sBAA2B,GACnC,qBAAqB,CAyHvB"}
|