@agentrhq/webcmd 0.1.1 → 0.1.2
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/README.md +317 -24
- package/dist/src/adapter-shadow.d.ts +11 -0
- package/dist/src/adapter-shadow.js +72 -0
- package/dist/src/adapter-shadow.test.d.ts +1 -0
- package/dist/src/adapter-shadow.test.js +49 -0
- package/dist/src/adapter-source.d.ts +11 -0
- package/dist/src/adapter-source.js +24 -0
- package/dist/src/adapter-source.test.d.ts +1 -0
- package/dist/src/adapter-source.test.js +29 -0
- package/dist/src/brand.d.ts +9 -0
- package/dist/src/brand.js +9 -0
- package/dist/src/brand.test.d.ts +1 -0
- package/dist/src/brand.test.js +15 -0
- package/dist/src/browser/analyze.d.ts +118 -0
- package/dist/src/browser/analyze.js +405 -0
- package/dist/src/browser/analyze.test.d.ts +1 -0
- package/dist/src/browser/analyze.test.js +209 -0
- package/dist/src/browser/article-extract.d.ts +57 -0
- package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
- package/dist/src/browser/article-extract.e2e.test.js +105 -0
- package/dist/src/browser/article-extract.js +169 -0
- package/dist/src/browser/article-extract.test.d.ts +1 -0
- package/dist/src/browser/article-extract.test.js +94 -0
- package/dist/src/browser/ax-snapshot.d.ts +37 -0
- package/dist/src/browser/ax-snapshot.js +217 -0
- package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
- package/dist/src/browser/ax-snapshot.test.js +91 -0
- package/dist/src/browser/base-page.d.ts +151 -0
- package/dist/src/browser/base-page.js +1060 -0
- package/dist/src/browser/base-page.test.d.ts +1 -0
- package/dist/src/browser/base-page.test.js +803 -0
- package/dist/src/browser/bridge-readiness.d.ts +14 -0
- package/dist/src/browser/bridge-readiness.js +24 -0
- package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
- package/dist/src/browser/bridge-readiness.test.js +58 -0
- package/dist/src/browser/bridge.d.ts +26 -0
- package/dist/src/browser/bridge.js +58 -0
- package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
- package/dist/src/browser/cdp-click-fixture.test.js +87 -0
- package/dist/src/browser/cdp.d.ts +46 -0
- package/dist/src/browser/cdp.js +536 -0
- package/dist/src/browser/cdp.test.d.ts +1 -0
- package/dist/src/browser/cdp.test.js +79 -0
- package/dist/src/browser/compound.d.ts +59 -0
- package/dist/src/browser/compound.js +112 -0
- package/dist/src/browser/compound.test.d.ts +1 -0
- package/dist/src/browser/compound.test.js +175 -0
- package/dist/src/browser/config.d.ts +2 -0
- package/dist/src/browser/config.js +14 -0
- package/dist/src/browser/daemon-client.d.ts +32 -0
- package/dist/src/browser/daemon-client.js +135 -0
- package/dist/src/browser/daemon-client.test.d.ts +1 -0
- package/dist/src/browser/daemon-client.test.js +326 -0
- package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
- package/dist/src/browser/daemon-lifecycle.js +147 -0
- package/dist/src/browser/daemon-transport.d.ts +54 -0
- package/dist/src/browser/daemon-transport.js +68 -0
- package/dist/src/browser/daemon-version.d.ts +4 -0
- package/dist/src/browser/daemon-version.js +12 -0
- package/dist/src/browser/dom-helpers.d.ts +41 -0
- package/dist/src/browser/dom-helpers.js +239 -0
- package/dist/src/browser/dom-helpers.test.d.ts +1 -0
- package/dist/src/browser/dom-helpers.test.js +106 -0
- package/dist/src/browser/dom-snapshot.d.ts +93 -0
- package/dist/src/browser/dom-snapshot.js +894 -0
- package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/src/browser/dom-snapshot.test.js +313 -0
- package/dist/src/browser/errors.d.ts +38 -0
- package/dist/src/browser/errors.js +79 -0
- package/dist/src/browser/errors.test.d.ts +1 -0
- package/dist/src/browser/errors.test.js +60 -0
- package/dist/src/browser/extract.d.ts +69 -0
- package/dist/src/browser/extract.js +132 -0
- package/dist/src/browser/extract.test.d.ts +1 -0
- package/dist/src/browser/extract.test.js +129 -0
- package/dist/src/browser/find.d.ts +84 -0
- package/dist/src/browser/find.js +398 -0
- package/dist/src/browser/find.test.d.ts +1 -0
- package/dist/src/browser/find.test.js +180 -0
- package/dist/src/browser/html-tree.d.ts +75 -0
- package/dist/src/browser/html-tree.js +112 -0
- package/dist/src/browser/html-tree.test.d.ts +1 -0
- package/dist/src/browser/html-tree.test.js +181 -0
- package/dist/src/browser/index.d.ts +14 -0
- package/dist/src/browser/index.js +12 -0
- package/dist/src/browser/network-cache.d.ts +49 -0
- package/dist/src/browser/network-cache.js +78 -0
- package/dist/src/browser/network-cache.test.d.ts +1 -0
- package/dist/src/browser/network-cache.test.js +75 -0
- package/dist/src/browser/network-interceptor.d.ts +11 -0
- package/dist/src/browser/network-interceptor.js +11 -0
- package/dist/src/browser/network-key.d.ts +22 -0
- package/dist/src/browser/network-key.js +66 -0
- package/dist/src/browser/network-key.test.d.ts +1 -0
- package/dist/src/browser/network-key.test.js +49 -0
- package/dist/src/browser/page.d.ts +83 -0
- package/dist/src/browser/page.js +453 -0
- package/dist/src/browser/page.test.d.ts +1 -0
- package/dist/src/browser/page.test.js +406 -0
- package/dist/src/browser/profile.d.ts +14 -0
- package/dist/src/browser/profile.js +86 -0
- package/dist/src/browser/protocol.d.ts +63 -0
- package/dist/src/browser/protocol.js +1 -0
- package/dist/src/browser/runtime/local-cloak/actions.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/actions.js +240 -0
- package/dist/src/browser/runtime/local-cloak/downloads.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/downloads.js +28 -0
- package/dist/src/browser/runtime/local-cloak/network.d.ts +28 -0
- package/dist/src/browser/runtime/local-cloak/network.js +120 -0
- package/dist/src/browser/runtime/local-cloak/network.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/network.test.js +124 -0
- package/dist/src/browser/runtime/local-cloak/profiles.d.ts +6 -0
- package/dist/src/browser/runtime/local-cloak/profiles.js +17 -0
- package/dist/src/browser/runtime/local-cloak/profiles.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/profiles.test.js +19 -0
- package/dist/src/browser/runtime/local-cloak/provider.d.ts +15 -0
- package/dist/src/browser/runtime/local-cloak/provider.js +27 -0
- package/dist/src/browser/runtime/local-cloak/provider.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/provider.test.js +244 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +77 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.js +280 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.js +92 -0
- package/dist/src/browser/runtime/provider.d.ts +9 -0
- package/dist/src/browser/runtime/provider.js +1 -0
- package/dist/src/browser/runtime/provider.test.d.ts +2 -0
- package/dist/src/browser/runtime/provider.test.js +49 -0
- package/dist/src/browser/shape-filter.d.ts +52 -0
- package/dist/src/browser/shape-filter.js +101 -0
- package/dist/src/browser/shape-filter.test.d.ts +1 -0
- package/dist/src/browser/shape-filter.test.js +101 -0
- package/dist/src/browser/shape.d.ts +23 -0
- package/dist/src/browser/shape.js +95 -0
- package/dist/src/browser/shape.test.d.ts +1 -0
- package/dist/src/browser/shape.test.js +82 -0
- package/dist/src/browser/stealth.d.ts +11 -0
- package/dist/src/browser/stealth.js +359 -0
- package/dist/src/browser/stealth.test.d.ts +1 -0
- package/dist/src/browser/stealth.test.js +134 -0
- package/dist/src/browser/tabs.d.ts +13 -0
- package/dist/src/browser/tabs.js +70 -0
- package/dist/src/browser/target-errors.d.ts +39 -0
- package/dist/src/browser/target-errors.js +45 -0
- package/dist/src/browser/target-errors.test.d.ts +1 -0
- package/dist/src/browser/target-errors.test.js +94 -0
- package/dist/src/browser/target-resolver.d.ts +158 -0
- package/dist/src/browser/target-resolver.js +570 -0
- package/dist/src/browser/target-resolver.test.d.ts +1 -0
- package/dist/src/browser/target-resolver.test.js +118 -0
- package/dist/src/browser/utils.d.ts +20 -0
- package/dist/src/browser/utils.js +64 -0
- package/dist/src/browser/utils.test.d.ts +1 -0
- package/dist/src/browser/utils.test.js +29 -0
- package/dist/src/browser/verify-fixture.d.ts +65 -0
- package/dist/src/browser/verify-fixture.js +318 -0
- package/dist/src/browser/verify-fixture.test.d.ts +1 -0
- package/dist/src/browser/verify-fixture.test.js +219 -0
- package/dist/src/browser/visual-refs.d.ts +11 -0
- package/dist/src/browser/visual-refs.js +108 -0
- package/dist/src/browser.test.d.ts +1 -0
- package/dist/src/browser.test.js +297 -0
- package/dist/src/build-manifest.d.ts +103 -0
- package/dist/src/build-manifest.js +363 -0
- package/dist/src/build-manifest.test.d.ts +1 -0
- package/dist/src/build-manifest.test.js +341 -0
- package/dist/src/capabilityRouting.d.ts +19 -0
- package/dist/src/capabilityRouting.js +56 -0
- package/dist/src/capabilityRouting.test.d.ts +1 -0
- package/dist/src/capabilityRouting.test.js +63 -0
- package/dist/src/cli-argv-preprocess.d.ts +63 -0
- package/dist/src/cli-argv-preprocess.js +303 -0
- package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
- package/dist/src/cli-argv-preprocess.test.js +304 -0
- package/dist/src/cli.d.ts +79 -0
- package/dist/src/cli.js +3350 -0
- package/dist/src/cli.test.d.ts +1 -0
- package/dist/src/cli.test.js +3041 -0
- package/dist/src/commanderAdapter.d.ts +21 -0
- package/dist/src/commanderAdapter.js +208 -0
- package/dist/src/commanderAdapter.test.d.ts +1 -0
- package/dist/src/commanderAdapter.test.js +352 -0
- package/dist/src/commands/auth.d.ts +40 -0
- package/dist/src/commands/auth.js +434 -0
- package/dist/src/commands/auth.test.d.ts +1 -0
- package/dist/src/commands/auth.test.js +252 -0
- package/dist/src/commands/daemon.d.ts +9 -0
- package/dist/src/commands/daemon.js +91 -0
- package/dist/src/commands/daemon.test.d.ts +1 -0
- package/dist/src/commands/daemon.test.js +293 -0
- package/dist/src/completion-fast.d.ts +22 -0
- package/dist/src/completion-fast.js +88 -0
- package/dist/src/completion-shared.d.ts +13 -0
- package/dist/src/completion-shared.js +61 -0
- package/dist/src/completion.d.ts +21 -0
- package/dist/src/completion.js +68 -0
- package/dist/src/completion.test.d.ts +1 -0
- package/dist/src/completion.test.js +24 -0
- package/dist/src/constants.d.ts +18 -0
- package/dist/src/constants.js +41 -0
- package/dist/src/convention-audit.d.ts +50 -0
- package/dist/src/convention-audit.js +553 -0
- package/dist/src/convention-audit.test.d.ts +1 -0
- package/dist/src/convention-audit.test.js +255 -0
- package/dist/src/daemon/server.d.ts +13 -0
- package/dist/src/daemon/server.js +185 -0
- package/dist/src/daemon/server.test.d.ts +1 -0
- package/dist/src/daemon/server.test.js +132 -0
- package/dist/src/daemon-utils.d.ts +18 -0
- package/dist/src/daemon-utils.js +37 -0
- package/dist/src/daemon.d.ts +1 -0
- package/dist/src/daemon.js +27 -0
- package/dist/src/daemon.test.d.ts +1 -0
- package/dist/src/daemon.test.js +60 -0
- package/dist/src/discovery.d.ts +46 -0
- package/dist/src/discovery.js +341 -0
- package/dist/src/doctor.d.ts +39 -0
- package/dist/src/doctor.js +168 -0
- package/dist/src/doctor.test.d.ts +1 -0
- package/dist/src/doctor.test.js +302 -0
- package/dist/src/download/article-download.d.ts +72 -0
- package/dist/src/download/article-download.js +305 -0
- package/dist/src/download/article-download.test.d.ts +1 -0
- package/dist/src/download/article-download.test.js +235 -0
- package/dist/src/download/index.d.ts +71 -0
- package/dist/src/download/index.js +363 -0
- package/dist/src/download/index.test.d.ts +1 -0
- package/dist/src/download/index.test.js +174 -0
- package/dist/src/download/media-download.d.ts +49 -0
- package/dist/src/download/media-download.js +127 -0
- package/dist/src/download/media-download.test.d.ts +1 -0
- package/dist/src/download/media-download.test.js +112 -0
- package/dist/src/download/progress.d.ts +36 -0
- package/dist/src/download/progress.js +120 -0
- package/dist/src/download/progress.test.d.ts +1 -0
- package/dist/src/download/progress.test.js +36 -0
- package/dist/src/electron-apps.d.ts +31 -0
- package/dist/src/electron-apps.js +91 -0
- package/dist/src/electron-apps.test.d.ts +1 -0
- package/dist/src/electron-apps.test.js +76 -0
- package/dist/src/engine.test.d.ts +1 -0
- package/dist/src/engine.test.js +312 -0
- package/dist/src/errors.d.ts +114 -0
- package/dist/src/errors.js +174 -0
- package/dist/src/errors.test.d.ts +1 -0
- package/dist/src/errors.test.js +109 -0
- package/dist/src/execution.d.ts +24 -0
- package/dist/src/execution.js +509 -0
- package/dist/src/execution.test.d.ts +1 -0
- package/dist/src/execution.test.js +645 -0
- package/dist/src/external.d.ts +49 -0
- package/dist/src/external.js +211 -0
- package/dist/src/external.test.d.ts +1 -0
- package/dist/src/external.test.js +110 -0
- package/dist/src/help.d.ts +88 -0
- package/dist/src/help.js +556 -0
- package/dist/src/help.test.d.ts +1 -0
- package/dist/src/help.test.js +58 -0
- package/dist/src/hooks.d.ts +46 -0
- package/dist/src/hooks.js +58 -0
- package/dist/src/hooks.test.d.ts +4 -0
- package/dist/src/hooks.test.js +92 -0
- package/dist/src/interceptor.d.ts +44 -0
- package/dist/src/interceptor.js +183 -0
- package/dist/src/interceptor.test.d.ts +4 -0
- package/dist/src/interceptor.test.js +81 -0
- package/dist/src/launcher.d.ts +41 -0
- package/dist/src/launcher.js +226 -0
- package/dist/src/launcher.test.d.ts +1 -0
- package/dist/src/launcher.test.js +153 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.js +49 -0
- package/dist/src/main.d.ts +5 -0
- package/dist/src/main.js +177 -0
- package/dist/src/manifest-types.d.ts +43 -0
- package/dist/src/manifest-types.js +9 -0
- package/dist/src/node-network.d.ts +10 -0
- package/dist/src/node-network.js +174 -0
- package/dist/src/node-network.test.d.ts +1 -0
- package/dist/src/node-network.test.js +55 -0
- package/dist/src/observation/artifact.d.ts +16 -0
- package/dist/src/observation/artifact.js +260 -0
- package/dist/src/observation/artifact.test.d.ts +1 -0
- package/dist/src/observation/artifact.test.js +121 -0
- package/dist/src/observation/events.d.ts +89 -0
- package/dist/src/observation/events.js +1 -0
- package/dist/src/observation/index.d.ts +7 -0
- package/dist/src/observation/index.js +7 -0
- package/dist/src/observation/manager.d.ts +9 -0
- package/dist/src/observation/manager.js +27 -0
- package/dist/src/observation/manager.test.d.ts +1 -0
- package/dist/src/observation/manager.test.js +13 -0
- package/dist/src/observation/redaction.d.ts +11 -0
- package/dist/src/observation/redaction.js +81 -0
- package/dist/src/observation/redaction.test.d.ts +1 -0
- package/dist/src/observation/redaction.test.js +32 -0
- package/dist/src/observation/retention.d.ts +32 -0
- package/dist/src/observation/retention.js +160 -0
- package/dist/src/observation/retention.test.d.ts +1 -0
- package/dist/src/observation/retention.test.js +118 -0
- package/dist/src/observation/ring-buffer.d.ts +22 -0
- package/dist/src/observation/ring-buffer.js +45 -0
- package/dist/src/observation/ring-buffer.test.d.ts +1 -0
- package/dist/src/observation/ring-buffer.test.js +22 -0
- package/dist/src/observation/session.d.ts +25 -0
- package/dist/src/observation/session.js +50 -0
- package/dist/src/output.d.ts +14 -0
- package/dist/src/output.js +152 -0
- package/dist/src/output.test.d.ts +1 -0
- package/dist/src/output.test.js +53 -0
- package/dist/src/package-exports.test.d.ts +1 -0
- package/dist/src/package-exports.test.js +112 -0
- package/dist/src/package-paths.d.ts +8 -0
- package/dist/src/package-paths.js +41 -0
- package/dist/src/pipeline/executor.d.ts +11 -0
- package/dist/src/pipeline/executor.js +93 -0
- package/dist/src/pipeline/executor.test.d.ts +4 -0
- package/dist/src/pipeline/executor.test.js +182 -0
- package/dist/src/pipeline/index.d.ts +5 -0
- package/dist/src/pipeline/index.js +5 -0
- package/dist/src/pipeline/registry.d.ts +28 -0
- package/dist/src/pipeline/registry.js +55 -0
- package/dist/src/pipeline/steps/browser.d.ts +13 -0
- package/dist/src/pipeline/steps/browser.js +86 -0
- package/dist/src/pipeline/steps/download.d.ts +18 -0
- package/dist/src/pipeline/steps/download.js +252 -0
- package/dist/src/pipeline/steps/download.test.d.ts +1 -0
- package/dist/src/pipeline/steps/download.test.js +102 -0
- package/dist/src/pipeline/steps/fetch.d.ts +5 -0
- package/dist/src/pipeline/steps/fetch.js +122 -0
- package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
- package/dist/src/pipeline/steps/fetch.test.js +117 -0
- package/dist/src/pipeline/steps/intercept.d.ts +5 -0
- package/dist/src/pipeline/steps/intercept.js +50 -0
- package/dist/src/pipeline/steps/tap.d.ts +12 -0
- package/dist/src/pipeline/steps/tap.js +93 -0
- package/dist/src/pipeline/steps/transform.d.ts +9 -0
- package/dist/src/pipeline/steps/transform.js +70 -0
- package/dist/src/pipeline/template.d.ts +17 -0
- package/dist/src/pipeline/template.js +344 -0
- package/dist/src/pipeline/template.test.d.ts +4 -0
- package/dist/src/pipeline/template.test.js +197 -0
- package/dist/src/pipeline/transform.test.d.ts +4 -0
- package/dist/src/pipeline/transform.test.js +133 -0
- package/dist/src/plugin-manifest.d.ts +70 -0
- package/dist/src/plugin-manifest.js +160 -0
- package/dist/src/plugin-manifest.test.d.ts +4 -0
- package/dist/src/plugin-manifest.test.js +179 -0
- package/dist/src/plugin-scaffold.d.ts +28 -0
- package/dist/src/plugin-scaffold.js +143 -0
- package/dist/src/plugin-scaffold.test.d.ts +4 -0
- package/dist/src/plugin-scaffold.test.js +83 -0
- package/dist/src/plugin.d.ts +146 -0
- package/dist/src/plugin.js +1303 -0
- package/dist/src/plugin.test.d.ts +4 -0
- package/dist/src/plugin.test.js +1363 -0
- package/dist/src/registry-api.d.ts +13 -0
- package/dist/src/registry-api.js +10 -0
- package/dist/src/registry.d.ts +123 -0
- package/dist/src/registry.js +125 -0
- package/dist/src/registry.test.d.ts +4 -0
- package/dist/src/registry.test.js +209 -0
- package/dist/src/runtime-copy.test.d.ts +1 -0
- package/dist/src/runtime-copy.test.js +29 -0
- package/dist/src/runtime-detect.d.ts +31 -0
- package/dist/src/runtime-detect.js +47 -0
- package/dist/src/runtime-detect.test.d.ts +1 -0
- package/dist/src/runtime-detect.test.js +39 -0
- package/dist/src/runtime-identity.test.d.ts +1 -0
- package/dist/src/runtime-identity.test.js +18 -0
- package/dist/src/runtime.d.ts +47 -0
- package/dist/src/runtime.js +54 -0
- package/dist/src/scripts/framework.d.ts +7 -0
- package/dist/src/scripts/framework.js +25 -0
- package/dist/src/scripts/interact.d.ts +4 -0
- package/dist/src/scripts/interact.js +20 -0
- package/dist/src/scripts/store.d.ts +13 -0
- package/dist/src/scripts/store.js +48 -0
- package/dist/src/serialization.d.ts +42 -0
- package/dist/src/serialization.js +103 -0
- package/dist/src/serialization.test.d.ts +1 -0
- package/dist/src/serialization.test.js +78 -0
- package/dist/src/skills.d.ts +14 -0
- package/dist/src/skills.js +127 -0
- package/dist/src/skills.test.d.ts +1 -0
- package/dist/src/skills.test.js +71 -0
- package/dist/src/snapshotFormatter.d.ts +11 -0
- package/dist/src/snapshotFormatter.js +338 -0
- package/dist/src/snapshotFormatter.test.d.ts +7 -0
- package/dist/src/snapshotFormatter.test.js +521 -0
- package/dist/src/tui.d.ts +28 -0
- package/dist/src/tui.js +179 -0
- package/dist/src/tui.test.d.ts +1 -0
- package/dist/src/tui.test.js +19 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +7 -0
- package/dist/src/update-check.d.ts +66 -0
- package/dist/src/update-check.js +206 -0
- package/dist/src/update-check.test.d.ts +1 -0
- package/dist/src/update-check.test.js +117 -0
- package/dist/src/utils.d.ts +57 -0
- package/dist/src/utils.js +152 -0
- package/dist/src/utils.test.d.ts +1 -0
- package/dist/src/utils.test.js +155 -0
- package/dist/src/validate.d.ts +21 -0
- package/dist/src/validate.js +130 -0
- package/dist/src/validate.test.d.ts +9 -0
- package/dist/src/validate.test.js +90 -0
- package/dist/src/verify.d.ts +26 -0
- package/dist/src/verify.js +67 -0
- package/dist/src/version.d.ts +4 -0
- package/dist/src/version.js +22 -0
- package/dist/src/weixin-download.test.d.ts +1 -0
- package/dist/src/weixin-download.test.js +45 -0
- package/package.json +4 -3
- package/scripts/check-package-bin.mjs +95 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AX-backed browser snapshot prototype.
|
|
3
|
+
*
|
|
4
|
+
* This is intentionally additive to the current DOM snapshot. It learns from
|
|
5
|
+
* agent-browser's accessibility-tree refs without changing default `state`
|
|
6
|
+
* output until the AX path proves itself on fixtures and real SaaS workflows.
|
|
7
|
+
*/
|
|
8
|
+
export interface BrowserRef {
|
|
9
|
+
ref: string;
|
|
10
|
+
backendNodeId?: number;
|
|
11
|
+
role: string;
|
|
12
|
+
name: string;
|
|
13
|
+
nth?: number;
|
|
14
|
+
frame?: {
|
|
15
|
+
frameId?: string;
|
|
16
|
+
sessionId?: string;
|
|
17
|
+
url?: string;
|
|
18
|
+
targetUrl?: string;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface AxSnapshotTree {
|
|
22
|
+
tree: unknown;
|
|
23
|
+
frame?: BrowserRef['frame'];
|
|
24
|
+
}
|
|
25
|
+
export interface AxSnapshotBuildResult {
|
|
26
|
+
text: string;
|
|
27
|
+
refs: Map<string, BrowserRef>;
|
|
28
|
+
}
|
|
29
|
+
export declare function buildAxSnapshot(axTree: unknown, opts?: {
|
|
30
|
+
maxDepth?: number;
|
|
31
|
+
interactiveOnly?: boolean;
|
|
32
|
+
}): AxSnapshotBuildResult;
|
|
33
|
+
export declare function buildAxSnapshotFromTrees(trees: AxSnapshotTree[], opts?: {
|
|
34
|
+
maxDepth?: number;
|
|
35
|
+
interactiveOnly?: boolean;
|
|
36
|
+
}): AxSnapshotBuildResult;
|
|
37
|
+
export declare function findAxRefReplacement(axTree: unknown, ref: BrowserRef): BrowserRef | null;
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AX-backed browser snapshot prototype.
|
|
3
|
+
*
|
|
4
|
+
* This is intentionally additive to the current DOM snapshot. It learns from
|
|
5
|
+
* agent-browser's accessibility-tree refs without changing default `state`
|
|
6
|
+
* output until the AX path proves itself on fixtures and real SaaS workflows.
|
|
7
|
+
*/
|
|
8
|
+
const INTERACTIVE_ROLES = new Set([
|
|
9
|
+
'button',
|
|
10
|
+
'link',
|
|
11
|
+
'textbox',
|
|
12
|
+
'searchbox',
|
|
13
|
+
'checkbox',
|
|
14
|
+
'radio',
|
|
15
|
+
'combobox',
|
|
16
|
+
'listbox',
|
|
17
|
+
'menuitem',
|
|
18
|
+
'menuitemcheckbox',
|
|
19
|
+
'menuitemradio',
|
|
20
|
+
'option',
|
|
21
|
+
'slider',
|
|
22
|
+
'spinbutton',
|
|
23
|
+
'switch',
|
|
24
|
+
'tab',
|
|
25
|
+
'treeitem',
|
|
26
|
+
]);
|
|
27
|
+
const CONTENT_ROLES = new Set([
|
|
28
|
+
'article',
|
|
29
|
+
'cell',
|
|
30
|
+
'columnheader',
|
|
31
|
+
'gridcell',
|
|
32
|
+
'heading',
|
|
33
|
+
'listitem',
|
|
34
|
+
'main',
|
|
35
|
+
'navigation',
|
|
36
|
+
'region',
|
|
37
|
+
'rowheader',
|
|
38
|
+
]);
|
|
39
|
+
const STRUCTURAL_ROLES = new Set([
|
|
40
|
+
'generic',
|
|
41
|
+
'group',
|
|
42
|
+
'list',
|
|
43
|
+
'none',
|
|
44
|
+
'presentation',
|
|
45
|
+
'RootWebArea',
|
|
46
|
+
'WebArea',
|
|
47
|
+
]);
|
|
48
|
+
export function buildAxSnapshot(axTree, opts = {}) {
|
|
49
|
+
return buildAxSnapshotFromTrees([{ tree: axTree }], opts);
|
|
50
|
+
}
|
|
51
|
+
export function buildAxSnapshotFromTrees(trees, opts = {}) {
|
|
52
|
+
const lines = ['source: ax', '---'];
|
|
53
|
+
const refs = new Map();
|
|
54
|
+
let nextRef = 1;
|
|
55
|
+
for (const [index, entry] of trees.entries()) {
|
|
56
|
+
if (index > 0) {
|
|
57
|
+
const label = entry.frame?.url ? JSON.stringify(entry.frame.url) : JSON.stringify(entry.frame?.frameId ?? `frame:${index}`);
|
|
58
|
+
lines.push(`frame ${label}:`);
|
|
59
|
+
}
|
|
60
|
+
nextRef = renderAxTree(entry.tree, lines, refs, nextRef, {
|
|
61
|
+
...opts,
|
|
62
|
+
frame: entry.frame,
|
|
63
|
+
baseDepth: index > 0 ? 1 : 0,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
lines.push('---');
|
|
67
|
+
lines.push(`interactive: ${refs.size}`);
|
|
68
|
+
return { text: lines.join('\n'), refs };
|
|
69
|
+
}
|
|
70
|
+
function renderAxTree(axTree, lines, refs, nextRef, opts) {
|
|
71
|
+
const rawNodes = Array.isArray(axTree?.nodes)
|
|
72
|
+
? axTree.nodes
|
|
73
|
+
: [];
|
|
74
|
+
const nodes = rawNodes.filter((node) => node && !node.ignored);
|
|
75
|
+
const byId = new Map();
|
|
76
|
+
const parentIds = new Set();
|
|
77
|
+
for (const node of nodes) {
|
|
78
|
+
if (typeof node.nodeId === 'string')
|
|
79
|
+
byId.set(node.nodeId, node);
|
|
80
|
+
for (const childId of node.childIds ?? [])
|
|
81
|
+
parentIds.add(childId);
|
|
82
|
+
}
|
|
83
|
+
const roots = nodes.filter((node) => {
|
|
84
|
+
if (!node.nodeId)
|
|
85
|
+
return false;
|
|
86
|
+
const role = axString(node.role);
|
|
87
|
+
return !parentIds.has(node.nodeId) || role === 'RootWebArea' || role === 'WebArea';
|
|
88
|
+
});
|
|
89
|
+
const root = roots[0] ?? nodes[0];
|
|
90
|
+
const maxDepth = Math.max(1, Math.min(Number(opts.maxDepth) || 50, 200));
|
|
91
|
+
const roleNameCounts = countRoleNames(nodes);
|
|
92
|
+
const roleNameSeen = new Map();
|
|
93
|
+
function render(node, depth) {
|
|
94
|
+
if (!node || depth > maxDepth)
|
|
95
|
+
return false;
|
|
96
|
+
const role = axString(node.role) || 'generic';
|
|
97
|
+
const name = cleanText(axString(node.name));
|
|
98
|
+
const value = cleanText(axString(node.value) || propertyValue(node, 'value'));
|
|
99
|
+
const disabled = propertyValue(node, 'disabled');
|
|
100
|
+
const checked = propertyValue(node, 'checked');
|
|
101
|
+
const expanded = propertyValue(node, 'expanded');
|
|
102
|
+
const selected = propertyValue(node, 'selected');
|
|
103
|
+
const refEligible = shouldRef(role, name, node.backendDOMNodeId);
|
|
104
|
+
const shouldShowSelf = refEligible
|
|
105
|
+
|| !!name
|
|
106
|
+
|| !!value
|
|
107
|
+
|| CONTENT_ROLES.has(role)
|
|
108
|
+
|| (!opts.interactiveOnly && !STRUCTURAL_ROLES.has(role));
|
|
109
|
+
const childStart = lines.length;
|
|
110
|
+
let hasVisibleChild = false;
|
|
111
|
+
for (const childId of node.childIds ?? []) {
|
|
112
|
+
if (render(byId.get(childId), depth + 1))
|
|
113
|
+
hasVisibleChild = true;
|
|
114
|
+
}
|
|
115
|
+
if (!shouldShowSelf && !hasVisibleChild) {
|
|
116
|
+
lines.length = childStart;
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
if (shouldShowSelf) {
|
|
120
|
+
const indent = ' '.repeat(depth);
|
|
121
|
+
const parts = [];
|
|
122
|
+
let prefix = '';
|
|
123
|
+
if (refEligible) {
|
|
124
|
+
const ref = String(nextRef++);
|
|
125
|
+
prefix = `[${ref}]`;
|
|
126
|
+
const key = roleNameKey(role, name);
|
|
127
|
+
const seen = roleNameSeen.get(key) ?? 0;
|
|
128
|
+
roleNameSeen.set(key, seen + 1);
|
|
129
|
+
refs.set(ref, {
|
|
130
|
+
ref,
|
|
131
|
+
backendNodeId: node.backendDOMNodeId,
|
|
132
|
+
role,
|
|
133
|
+
name,
|
|
134
|
+
...(roleNameCounts.get(key) > 1 ? { nth: seen } : {}),
|
|
135
|
+
...(opts.frame ? { frame: opts.frame } : {}),
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
if (name)
|
|
139
|
+
parts.push(JSON.stringify(name));
|
|
140
|
+
if (value && value !== name)
|
|
141
|
+
parts.push(`value=${JSON.stringify(value)}`);
|
|
142
|
+
if (checked)
|
|
143
|
+
parts.push(`checked=${checked}`);
|
|
144
|
+
if (expanded)
|
|
145
|
+
parts.push(`expanded=${expanded}`);
|
|
146
|
+
if (selected)
|
|
147
|
+
parts.push(`selected=${selected}`);
|
|
148
|
+
if (disabled === 'true')
|
|
149
|
+
parts.push('disabled');
|
|
150
|
+
lines.splice(childStart, 0, `${indent}${prefix}${role}${parts.length ? ` ${parts.join(' ')}` : ''}`);
|
|
151
|
+
}
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
render(root, opts.baseDepth);
|
|
155
|
+
return nextRef;
|
|
156
|
+
}
|
|
157
|
+
export function findAxRefReplacement(axTree, ref) {
|
|
158
|
+
const nodes = Array.isArray(axTree?.nodes)
|
|
159
|
+
? axTree.nodes
|
|
160
|
+
: [];
|
|
161
|
+
const targetNth = ref.nth ?? 0;
|
|
162
|
+
let seen = 0;
|
|
163
|
+
for (const node of nodes) {
|
|
164
|
+
if (!node || node.ignored)
|
|
165
|
+
continue;
|
|
166
|
+
const role = axString(node.role);
|
|
167
|
+
const name = cleanText(axString(node.name));
|
|
168
|
+
if (role !== ref.role || name !== ref.name)
|
|
169
|
+
continue;
|
|
170
|
+
if (seen === targetNth) {
|
|
171
|
+
if (typeof node.backendDOMNodeId !== 'number')
|
|
172
|
+
return null;
|
|
173
|
+
return { ...ref, backendNodeId: node.backendDOMNodeId };
|
|
174
|
+
}
|
|
175
|
+
seen++;
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
function shouldRef(role, name, backendNodeId) {
|
|
180
|
+
if (typeof backendNodeId !== 'number')
|
|
181
|
+
return false;
|
|
182
|
+
if (INTERACTIVE_ROLES.has(role))
|
|
183
|
+
return true;
|
|
184
|
+
return CONTENT_ROLES.has(role) && !!name;
|
|
185
|
+
}
|
|
186
|
+
function countRoleNames(nodes) {
|
|
187
|
+
const counts = new Map();
|
|
188
|
+
for (const node of nodes) {
|
|
189
|
+
if (!node || node.ignored)
|
|
190
|
+
continue;
|
|
191
|
+
const role = axString(node.role);
|
|
192
|
+
const name = cleanText(axString(node.name));
|
|
193
|
+
if (!shouldRef(role, name, node.backendDOMNodeId))
|
|
194
|
+
continue;
|
|
195
|
+
const key = roleNameKey(role, name);
|
|
196
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
197
|
+
}
|
|
198
|
+
return counts;
|
|
199
|
+
}
|
|
200
|
+
function roleNameKey(role, name) {
|
|
201
|
+
return `${role}\u0000${name}`;
|
|
202
|
+
}
|
|
203
|
+
function axString(value) {
|
|
204
|
+
const raw = value?.value;
|
|
205
|
+
if (typeof raw === 'string')
|
|
206
|
+
return raw;
|
|
207
|
+
if (typeof raw === 'number' || typeof raw === 'boolean')
|
|
208
|
+
return String(raw);
|
|
209
|
+
return '';
|
|
210
|
+
}
|
|
211
|
+
function propertyValue(node, name) {
|
|
212
|
+
const prop = node.properties?.find((candidate) => candidate.name === name);
|
|
213
|
+
return axString(prop?.value);
|
|
214
|
+
}
|
|
215
|
+
function cleanText(value) {
|
|
216
|
+
return value.replace(/\s+/g, ' ').trim().slice(0, 160);
|
|
217
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { buildAxSnapshot, buildAxSnapshotFromTrees, findAxRefReplacement } from './ax-snapshot.js';
|
|
3
|
+
describe('AX snapshot prototype', () => {
|
|
4
|
+
it('builds compact refs from Accessibility.getFullAXTree output', () => {
|
|
5
|
+
const result = buildAxSnapshot({
|
|
6
|
+
nodes: [
|
|
7
|
+
{ nodeId: '1', role: { value: 'RootWebArea' }, name: { value: 'Example' }, childIds: ['2', '3'] },
|
|
8
|
+
{ nodeId: '2', role: { value: 'heading' }, name: { value: 'Expenses' }, backendDOMNodeId: 20 },
|
|
9
|
+
{
|
|
10
|
+
nodeId: '3',
|
|
11
|
+
role: { value: 'combobox' },
|
|
12
|
+
name: { value: 'Category' },
|
|
13
|
+
backendDOMNodeId: 30,
|
|
14
|
+
properties: [{ name: 'expanded', value: { value: false } }],
|
|
15
|
+
},
|
|
16
|
+
],
|
|
17
|
+
});
|
|
18
|
+
expect(result.text).toContain('source: ax');
|
|
19
|
+
expect(result.text).toContain('[1]heading "Expenses"');
|
|
20
|
+
expect(result.text).toContain('[2]combobox "Category" expanded=false');
|
|
21
|
+
expect(result.refs.get('2')).toEqual({
|
|
22
|
+
ref: '2',
|
|
23
|
+
backendNodeId: 30,
|
|
24
|
+
role: 'combobox',
|
|
25
|
+
name: 'Category',
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
it('tracks nth only for duplicate role/name pairs', () => {
|
|
29
|
+
const result = buildAxSnapshot({
|
|
30
|
+
nodes: [
|
|
31
|
+
{ nodeId: '1', role: { value: 'RootWebArea' }, childIds: ['2', '3'] },
|
|
32
|
+
{ nodeId: '2', role: { value: 'button' }, name: { value: 'Save' }, backendDOMNodeId: 10 },
|
|
33
|
+
{ nodeId: '3', role: { value: 'button' }, name: { value: 'Save' }, backendDOMNodeId: 11 },
|
|
34
|
+
],
|
|
35
|
+
});
|
|
36
|
+
expect(result.refs.get('1')).toMatchObject({ role: 'button', name: 'Save', nth: 0 });
|
|
37
|
+
expect(result.refs.get('2')).toMatchObject({ role: 'button', name: 'Save', nth: 1 });
|
|
38
|
+
});
|
|
39
|
+
it('finds stale ref replacements by role/name/nth', () => {
|
|
40
|
+
const replacement = findAxRefReplacement({
|
|
41
|
+
nodes: [
|
|
42
|
+
{ nodeId: '1', role: { value: 'button' }, name: { value: 'Save' }, backendDOMNodeId: 10 },
|
|
43
|
+
{ nodeId: '2', role: { value: 'button' }, name: { value: 'Save' }, backendDOMNodeId: 42 },
|
|
44
|
+
],
|
|
45
|
+
}, {
|
|
46
|
+
ref: '2',
|
|
47
|
+
role: 'button',
|
|
48
|
+
name: 'Save',
|
|
49
|
+
backendNodeId: 11,
|
|
50
|
+
nth: 1,
|
|
51
|
+
});
|
|
52
|
+
expect(replacement).toMatchObject({ ref: '2', backendNodeId: 42, role: 'button', name: 'Save', nth: 1 });
|
|
53
|
+
});
|
|
54
|
+
it('combines frame AX trees while keeping ref metadata frame-scoped', () => {
|
|
55
|
+
const result = buildAxSnapshotFromTrees([
|
|
56
|
+
{
|
|
57
|
+
tree: {
|
|
58
|
+
nodes: [
|
|
59
|
+
{ nodeId: '1', role: { value: 'RootWebArea' }, childIds: ['2'] },
|
|
60
|
+
{ nodeId: '2', role: { value: 'button' }, name: { value: 'Save' }, backendDOMNodeId: 10 },
|
|
61
|
+
],
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
frame: { frameId: 'frame-1', url: 'https://app.example/embed' },
|
|
66
|
+
tree: {
|
|
67
|
+
nodes: [
|
|
68
|
+
{ nodeId: '1', role: { value: 'RootWebArea' }, childIds: ['2'] },
|
|
69
|
+
{ nodeId: '2', role: { value: 'button' }, name: { value: 'Save' }, backendDOMNodeId: 20 },
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
]);
|
|
74
|
+
expect(result.text).toContain('[1]button "Save"');
|
|
75
|
+
expect(result.text).toContain('frame "https://app.example/embed":');
|
|
76
|
+
expect(result.text).toContain(' [2]button "Save"');
|
|
77
|
+
expect(result.refs.get('1')).toEqual({
|
|
78
|
+
ref: '1',
|
|
79
|
+
backendNodeId: 10,
|
|
80
|
+
role: 'button',
|
|
81
|
+
name: 'Save',
|
|
82
|
+
});
|
|
83
|
+
expect(result.refs.get('2')).toEqual({
|
|
84
|
+
ref: '2',
|
|
85
|
+
backendNodeId: 20,
|
|
86
|
+
role: 'button',
|
|
87
|
+
name: 'Save',
|
|
88
|
+
frame: { frameId: 'frame-1', url: 'https://app.example/embed' },
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
});
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BasePage — shared IPage method implementations for DOM helpers.
|
|
3
|
+
*
|
|
4
|
+
* Both Page (daemon-backed) and CDPPage (direct CDP) execute JS the same way
|
|
5
|
+
* for DOM operations. This base class deduplicates ~200 lines of identical
|
|
6
|
+
* click/type/scroll/wait/snapshot/interceptor methods.
|
|
7
|
+
*
|
|
8
|
+
* Subclasses implement the transport-specific methods: goto, evaluate,
|
|
9
|
+
* getCookies, screenshot, tabs, etc.
|
|
10
|
+
*/
|
|
11
|
+
import type { BrowserCookie, BrowserEvaluateFunction, FetchJsonOptions, IPage, ScreenshotOptions, SnapshotOptions, WaitOptions } from '../types.js';
|
|
12
|
+
import { type ResolveOptions, type TargetMatchLevel } from './target-resolver.js';
|
|
13
|
+
export interface ResolveSuccess {
|
|
14
|
+
matches_n: number;
|
|
15
|
+
/**
|
|
16
|
+
* Cascading stale-ref tier the resolver traversed. Callers surface this to
|
|
17
|
+
* agents so `stable` / `reidentified` hits are visibly distinct from a
|
|
18
|
+
* clean `exact` match — the page changed, the action still succeeded.
|
|
19
|
+
*/
|
|
20
|
+
match_level: TargetMatchLevel;
|
|
21
|
+
}
|
|
22
|
+
export interface FillTextResult extends ResolveSuccess {
|
|
23
|
+
filled: boolean;
|
|
24
|
+
verified: boolean;
|
|
25
|
+
expected: string;
|
|
26
|
+
actual: string;
|
|
27
|
+
length: number;
|
|
28
|
+
mode?: 'input' | 'textarea' | 'contenteditable';
|
|
29
|
+
}
|
|
30
|
+
export interface SetCheckedResult extends ResolveSuccess {
|
|
31
|
+
checked: boolean;
|
|
32
|
+
changed: boolean;
|
|
33
|
+
kind?: string;
|
|
34
|
+
}
|
|
35
|
+
export interface UploadFilesResult extends ResolveSuccess {
|
|
36
|
+
uploaded: boolean;
|
|
37
|
+
files: number;
|
|
38
|
+
file_names: string[];
|
|
39
|
+
target: string;
|
|
40
|
+
multiple?: boolean;
|
|
41
|
+
accept?: string;
|
|
42
|
+
}
|
|
43
|
+
export interface DragResult {
|
|
44
|
+
dragged: boolean;
|
|
45
|
+
source: string;
|
|
46
|
+
target: string;
|
|
47
|
+
source_matches_n: number;
|
|
48
|
+
target_matches_n: number;
|
|
49
|
+
source_match_level: TargetMatchLevel;
|
|
50
|
+
target_match_level: TargetMatchLevel;
|
|
51
|
+
}
|
|
52
|
+
export declare abstract class BasePage implements IPage {
|
|
53
|
+
protected _lastUrl: string | null;
|
|
54
|
+
/** Cached previous snapshot hashes for incremental diff marking */
|
|
55
|
+
private _prevSnapshotHashes;
|
|
56
|
+
private _cdpTargetMarkerSeq;
|
|
57
|
+
private _axRefs;
|
|
58
|
+
abstract goto(url: string, options?: {
|
|
59
|
+
waitUntil?: 'load' | 'none';
|
|
60
|
+
settleMs?: number;
|
|
61
|
+
allowBoundNavigation?: boolean;
|
|
62
|
+
}): Promise<void>;
|
|
63
|
+
abstract evaluate<T = unknown>(js: string): Promise<T>;
|
|
64
|
+
abstract evaluate<Args extends unknown[], T>(fn: BrowserEvaluateFunction<Args, T>, ...args: Args): Promise<Awaited<T>>;
|
|
65
|
+
/**
|
|
66
|
+
* Safely evaluate JS with pre-serialized arguments.
|
|
67
|
+
* Each key in `args` becomes a `const` declaration with JSON-serialized value,
|
|
68
|
+
* wrapped in a lexical block to avoid polluting the global execution context.
|
|
69
|
+
*
|
|
70
|
+
* Why a block: Chrome's Runtime.evaluate shares a single global context per page.
|
|
71
|
+
* Top-level `const` declarations persist across calls, so re-declaring the same
|
|
72
|
+
* variable name (e.g. `markerAttr` in both click resolution and file upload)
|
|
73
|
+
* throws "SyntaxError: Identifier has already been declared". A block keeps
|
|
74
|
+
* the args scoped without forcing callers to pass expression-only code.
|
|
75
|
+
*
|
|
76
|
+
* Usage:
|
|
77
|
+
* page.evaluateWithArgs(`(async () => { return sym; })()`, { sym: userInput })
|
|
78
|
+
*/
|
|
79
|
+
evaluateWithArgs(js: string, args: Record<string, unknown>): Promise<unknown>;
|
|
80
|
+
fetchJson(url: string, opts?: FetchJsonOptions): Promise<unknown>;
|
|
81
|
+
abstract getCookies(opts?: {
|
|
82
|
+
domain?: string;
|
|
83
|
+
url?: string;
|
|
84
|
+
}): Promise<BrowserCookie[]>;
|
|
85
|
+
abstract screenshot(options?: ScreenshotOptions): Promise<string>;
|
|
86
|
+
annotatedScreenshot(options?: ScreenshotOptions): Promise<string>;
|
|
87
|
+
abstract tabs(): Promise<unknown[]>;
|
|
88
|
+
abstract selectTab(target: number | string): Promise<void>;
|
|
89
|
+
click(ref: string, opts?: ResolveOptions): Promise<ResolveSuccess>;
|
|
90
|
+
/** Uses native CDP click support when the concrete page exposes it. */
|
|
91
|
+
protected tryNativeClick(x: number, y: number): Promise<boolean>;
|
|
92
|
+
protected tryNativeMouseMove(x: number, y: number): Promise<boolean>;
|
|
93
|
+
protected tryNativeDoubleClick(x: number, y: number): Promise<boolean>;
|
|
94
|
+
protected tryNativeDrag(from: {
|
|
95
|
+
x: number;
|
|
96
|
+
y: number;
|
|
97
|
+
}, to: {
|
|
98
|
+
x: number;
|
|
99
|
+
y: number;
|
|
100
|
+
}): Promise<boolean>;
|
|
101
|
+
protected tryClickAxRef(ref: string): Promise<ResolveSuccess | null>;
|
|
102
|
+
private resolveAxRefPoint;
|
|
103
|
+
private axBoxCenter;
|
|
104
|
+
/** Uses native CDP text insertion when the concrete page exposes it. */
|
|
105
|
+
protected tryNativeType(text: string): Promise<boolean>;
|
|
106
|
+
/** Uses native CDP key events when the concrete page exposes them. */
|
|
107
|
+
protected tryNativeKeyPress(key: string, modifiers: string[]): Promise<boolean>;
|
|
108
|
+
protected isResolvedFocused(): Promise<boolean>;
|
|
109
|
+
/**
|
|
110
|
+
* Run a DOM-domain CDP command against `window.__resolved`.
|
|
111
|
+
*
|
|
112
|
+
* CDP DOM.focus / DOM.scrollIntoViewIfNeeded need a nodeId, while our
|
|
113
|
+
* resolver stores the live Element in page JS. Bridge the two worlds with a
|
|
114
|
+
* short-lived marker attribute, then query it through CDP.
|
|
115
|
+
*/
|
|
116
|
+
protected tryCdpOnResolvedElement(method: 'DOM.focus' | 'DOM.scrollIntoViewIfNeeded'): Promise<boolean>;
|
|
117
|
+
typeText(ref: string, text: string, opts?: ResolveOptions): Promise<ResolveSuccess>;
|
|
118
|
+
hover(ref: string, opts?: ResolveOptions): Promise<ResolveSuccess>;
|
|
119
|
+
focus(ref: string, opts?: ResolveOptions): Promise<ResolveSuccess & {
|
|
120
|
+
focused: boolean;
|
|
121
|
+
}>;
|
|
122
|
+
dblClick(ref: string, opts?: ResolveOptions): Promise<ResolveSuccess>;
|
|
123
|
+
private readCheckableState;
|
|
124
|
+
setChecked(ref: string, checked: boolean, opts?: ResolveOptions): Promise<SetCheckedResult>;
|
|
125
|
+
private setFileInputBySelector;
|
|
126
|
+
uploadFiles(ref: string, files: string[], opts?: ResolveOptions): Promise<UploadFilesResult>;
|
|
127
|
+
drag(source: string, target: string, opts?: {
|
|
128
|
+
from?: ResolveOptions;
|
|
129
|
+
to?: ResolveOptions;
|
|
130
|
+
}): Promise<DragResult>;
|
|
131
|
+
fillText(ref: string, text: string, opts?: ResolveOptions): Promise<FillTextResult>;
|
|
132
|
+
pressKey(key: string): Promise<void>;
|
|
133
|
+
scrollTo(ref: string, opts?: ResolveOptions): Promise<unknown>;
|
|
134
|
+
getFormState(): Promise<Record<string, unknown>>;
|
|
135
|
+
scroll(direction?: string, amount?: number): Promise<void>;
|
|
136
|
+
autoScroll(options?: {
|
|
137
|
+
times?: number;
|
|
138
|
+
delayMs?: number;
|
|
139
|
+
}): Promise<void>;
|
|
140
|
+
networkRequests(includeStatic?: boolean): Promise<unknown[]>;
|
|
141
|
+
consoleMessages(_level?: string): Promise<unknown[]>;
|
|
142
|
+
wait(options: number | WaitOptions): Promise<void>;
|
|
143
|
+
snapshot(opts?: SnapshotOptions): Promise<unknown>;
|
|
144
|
+
private collectAxSnapshotTrees;
|
|
145
|
+
getCurrentUrl(): Promise<string | null>;
|
|
146
|
+
installInterceptor(pattern: string): Promise<void>;
|
|
147
|
+
getInterceptedRequests(): Promise<unknown[]>;
|
|
148
|
+
waitForCapture(timeout?: number): Promise<void>;
|
|
149
|
+
/** Fallback basic snapshot */
|
|
150
|
+
protected _basicSnapshot(opts?: Pick<SnapshotOptions, 'interactive' | 'compact' | 'maxDepth' | 'raw'>): Promise<unknown>;
|
|
151
|
+
}
|