@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,41 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
export function findPackageRoot(startFile, fileExists = fs.existsSync) {
|
|
4
|
+
let dir = path.dirname(startFile);
|
|
5
|
+
while (true) {
|
|
6
|
+
if (fileExists(path.join(dir, 'package.json')))
|
|
7
|
+
return dir;
|
|
8
|
+
const parent = path.dirname(dir);
|
|
9
|
+
if (parent === dir) {
|
|
10
|
+
throw new Error(`Could not find package.json above ${startFile}`);
|
|
11
|
+
}
|
|
12
|
+
dir = parent;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export function getBuiltEntryCandidates(packageRoot, readFile = (filePath) => fs.readFileSync(filePath, 'utf-8')) {
|
|
16
|
+
const candidates = [];
|
|
17
|
+
try {
|
|
18
|
+
const pkg = JSON.parse(readFile(path.join(packageRoot, 'package.json')));
|
|
19
|
+
if (typeof pkg.bin === 'string') {
|
|
20
|
+
candidates.push(path.join(packageRoot, pkg.bin));
|
|
21
|
+
}
|
|
22
|
+
else if (pkg.bin && typeof pkg.bin === 'object' && typeof pkg.bin.webcmd === 'string') {
|
|
23
|
+
candidates.push(path.join(packageRoot, pkg.bin.webcmd));
|
|
24
|
+
}
|
|
25
|
+
if (typeof pkg.main === 'string') {
|
|
26
|
+
candidates.push(path.join(packageRoot, pkg.main));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Fall through to compatibility candidates below.
|
|
31
|
+
}
|
|
32
|
+
// Compatibility fallback for partially-built trees or older layouts.
|
|
33
|
+
candidates.push(path.join(packageRoot, 'dist', 'src', 'main.js'), path.join(packageRoot, 'dist', 'main.js'));
|
|
34
|
+
return [...new Set(candidates)];
|
|
35
|
+
}
|
|
36
|
+
export function getCliManifestPath(clisDir) {
|
|
37
|
+
return path.resolve(clisDir, '..', 'cli-manifest.json');
|
|
38
|
+
}
|
|
39
|
+
export function getFetchAdaptersScriptPath(packageRoot) {
|
|
40
|
+
return path.join(packageRoot, 'scripts', 'fetch-adapters.js');
|
|
41
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline executor: runs YAML pipeline steps sequentially.
|
|
3
|
+
*/
|
|
4
|
+
import type { IPage } from '../types.js';
|
|
5
|
+
export interface PipelineContext {
|
|
6
|
+
args?: Record<string, unknown>;
|
|
7
|
+
debug?: boolean;
|
|
8
|
+
/** Max retry attempts per step (default: 2 for browser steps, 0 for others) */
|
|
9
|
+
stepRetries?: number;
|
|
10
|
+
}
|
|
11
|
+
export declare function executePipeline(page: IPage | null, pipeline: unknown[], ctx?: PipelineContext): Promise<unknown>;
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline executor: runs YAML pipeline steps sequentially.
|
|
3
|
+
*/
|
|
4
|
+
import { getStep } from './registry.js';
|
|
5
|
+
import { log } from '../logger.js';
|
|
6
|
+
import { ConfigError } from '../errors.js';
|
|
7
|
+
import { BROWSER_ONLY_STEPS } from '../capabilityRouting.js';
|
|
8
|
+
import { isTransientBrowserError } from '../browser/errors.js';
|
|
9
|
+
export async function executePipeline(page, pipeline, ctx = {}) {
|
|
10
|
+
const args = ctx.args ?? {};
|
|
11
|
+
const debug = ctx.debug ?? false;
|
|
12
|
+
let data = null;
|
|
13
|
+
const total = pipeline.length;
|
|
14
|
+
try {
|
|
15
|
+
for (let i = 0; i < pipeline.length; i++) {
|
|
16
|
+
const step = pipeline[i];
|
|
17
|
+
if (!step || typeof step !== 'object')
|
|
18
|
+
continue;
|
|
19
|
+
for (const [op, params] of Object.entries(step)) {
|
|
20
|
+
if (debug)
|
|
21
|
+
debugStepStart(i + 1, total, op, params);
|
|
22
|
+
const handler = getStep(op);
|
|
23
|
+
if (handler) {
|
|
24
|
+
data = await executeStepWithRetry(handler, page, params, data, args, op, ctx.stepRetries);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
throw new ConfigError(`Unknown pipeline step "${op}" at index ${i}.`, 'Check the YAML pipeline step name or register the custom step before execution.');
|
|
28
|
+
}
|
|
29
|
+
if (debug)
|
|
30
|
+
debugStepResult(op, data);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
// Attempt cleanup: release automation tab lease on pipeline failure.
|
|
36
|
+
if (page?.closeWindow) {
|
|
37
|
+
try {
|
|
38
|
+
await page.closeWindow();
|
|
39
|
+
}
|
|
40
|
+
catch { /* ignore */ }
|
|
41
|
+
}
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
async function executeStepWithRetry(handler, page, params, data, args, op, configRetries) {
|
|
47
|
+
const maxRetries = configRetries ?? (BROWSER_ONLY_STEPS.has(op) ? 2 : 0);
|
|
48
|
+
for (let attempt = 0; attempt <= maxRetries; attempt++) {
|
|
49
|
+
try {
|
|
50
|
+
return await handler(page, params, data, args);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (attempt >= maxRetries)
|
|
54
|
+
throw err;
|
|
55
|
+
// Only retry on transient browser errors
|
|
56
|
+
if (!isTransientBrowserError(err))
|
|
57
|
+
throw err;
|
|
58
|
+
// Brief delay before retry
|
|
59
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Unreachable
|
|
63
|
+
throw new Error(`Step "${op}" failed after ${maxRetries} retries`);
|
|
64
|
+
}
|
|
65
|
+
function debugStepStart(stepNum, total, op, params) {
|
|
66
|
+
let preview = '';
|
|
67
|
+
if (typeof params === 'string') {
|
|
68
|
+
preview = params.length <= 80 ? ` → ${params}` : ` → ${params.slice(0, 77)}...`;
|
|
69
|
+
}
|
|
70
|
+
else if (params && typeof params === 'object' && !Array.isArray(params)) {
|
|
71
|
+
preview = ` (${Object.keys(params).join(', ')})`;
|
|
72
|
+
}
|
|
73
|
+
log.step(stepNum, total, op, preview);
|
|
74
|
+
}
|
|
75
|
+
function debugStepResult(op, data) {
|
|
76
|
+
if (data === null || data === undefined) {
|
|
77
|
+
log.stepResult('(no data)');
|
|
78
|
+
}
|
|
79
|
+
else if (Array.isArray(data)) {
|
|
80
|
+
log.stepResult(`${data.length} items`);
|
|
81
|
+
}
|
|
82
|
+
else if (typeof data === 'object') {
|
|
83
|
+
const keys = Object.keys(data).slice(0, 5);
|
|
84
|
+
log.stepResult(`dict (${keys.join(', ')}${Object.keys(data).length > 5 ? '...' : ''})`);
|
|
85
|
+
}
|
|
86
|
+
else if (typeof data === 'string') {
|
|
87
|
+
const p = data.slice(0, 60).replace(/\n/g, '\\n');
|
|
88
|
+
log.stepResult(`"${p}${data.length > 60 ? '...' : ''}"`);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
log.stepResult(`${typeof data}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tests for pipeline/executor.ts: pipeline execution with mock page.
|
|
3
|
+
*/
|
|
4
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
5
|
+
import { executePipeline } from './index.js';
|
|
6
|
+
import { ConfigError } from '../errors.js';
|
|
7
|
+
/** Create a minimal mock page for testing */
|
|
8
|
+
function createMockPage(overrides = {}) {
|
|
9
|
+
return {
|
|
10
|
+
goto: vi.fn(),
|
|
11
|
+
evaluate: vi.fn().mockResolvedValue(null),
|
|
12
|
+
fetchJson: vi.fn().mockResolvedValue(null),
|
|
13
|
+
getCookies: vi.fn().mockResolvedValue([]),
|
|
14
|
+
snapshot: vi.fn().mockResolvedValue(''),
|
|
15
|
+
click: vi.fn(),
|
|
16
|
+
typeText: vi.fn(),
|
|
17
|
+
fillText: vi.fn(),
|
|
18
|
+
pressKey: vi.fn(),
|
|
19
|
+
getFormState: vi.fn().mockResolvedValue({}),
|
|
20
|
+
wait: vi.fn(),
|
|
21
|
+
tabs: vi.fn().mockResolvedValue([]),
|
|
22
|
+
selectTab: vi.fn(),
|
|
23
|
+
networkRequests: vi.fn().mockResolvedValue([]),
|
|
24
|
+
consoleMessages: vi.fn().mockResolvedValue(''),
|
|
25
|
+
scroll: vi.fn(),
|
|
26
|
+
scrollTo: vi.fn(),
|
|
27
|
+
autoScroll: vi.fn(),
|
|
28
|
+
installInterceptor: vi.fn(),
|
|
29
|
+
getInterceptedRequests: vi.fn().mockResolvedValue([]),
|
|
30
|
+
screenshot: vi.fn().mockResolvedValue(''),
|
|
31
|
+
waitForCapture: vi.fn().mockResolvedValue(undefined),
|
|
32
|
+
...overrides,
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
describe('executePipeline', () => {
|
|
36
|
+
it('returns null for empty pipeline', async () => {
|
|
37
|
+
const result = await executePipeline(null, []);
|
|
38
|
+
expect(result).toBeNull();
|
|
39
|
+
});
|
|
40
|
+
it('skips null/invalid steps', async () => {
|
|
41
|
+
const result = await executePipeline(null, [null, undefined, 42]);
|
|
42
|
+
expect(result).toBeNull();
|
|
43
|
+
});
|
|
44
|
+
it('executes navigate step', async () => {
|
|
45
|
+
const page = createMockPage();
|
|
46
|
+
await executePipeline(page, [
|
|
47
|
+
{ navigate: 'https://example.com' },
|
|
48
|
+
]);
|
|
49
|
+
expect(page.goto).toHaveBeenCalledWith('https://example.com');
|
|
50
|
+
});
|
|
51
|
+
it('executes evaluate + select pipeline', async () => {
|
|
52
|
+
const page = createMockPage({
|
|
53
|
+
evaluate: vi.fn().mockResolvedValue({ data: { list: [{ name: 'a' }, { name: 'b' }] } }),
|
|
54
|
+
});
|
|
55
|
+
const result = await executePipeline(page, [
|
|
56
|
+
{ evaluate: '() => ({ data: { list: [{name: "a"}, {name: "b"}] } })' },
|
|
57
|
+
{ select: 'data.list' },
|
|
58
|
+
]);
|
|
59
|
+
expect(result).toEqual([{ name: 'a' }, { name: 'b' }]);
|
|
60
|
+
});
|
|
61
|
+
it('executes map step to transform items', async () => {
|
|
62
|
+
const page = createMockPage({
|
|
63
|
+
evaluate: vi.fn().mockResolvedValue([
|
|
64
|
+
{ title: 'Hello', count: 10 },
|
|
65
|
+
{ title: 'World', count: 20 },
|
|
66
|
+
]),
|
|
67
|
+
});
|
|
68
|
+
const result = await executePipeline(page, [
|
|
69
|
+
{ evaluate: 'test' },
|
|
70
|
+
{ map: { name: '${{ item.title }}', score: '${{ item.count }}' } },
|
|
71
|
+
]);
|
|
72
|
+
expect(result).toEqual([
|
|
73
|
+
{ name: 'Hello', score: 10 },
|
|
74
|
+
{ name: 'World', score: 20 },
|
|
75
|
+
]);
|
|
76
|
+
});
|
|
77
|
+
it('runs inline select inside map step', async () => {
|
|
78
|
+
const page = createMockPage({
|
|
79
|
+
evaluate: vi.fn().mockResolvedValue({
|
|
80
|
+
posts: [
|
|
81
|
+
{ title: 'First', rank: 1 },
|
|
82
|
+
{ title: 'Second', rank: 2 },
|
|
83
|
+
],
|
|
84
|
+
}),
|
|
85
|
+
});
|
|
86
|
+
const result = await executePipeline(page, [
|
|
87
|
+
{ evaluate: 'test' },
|
|
88
|
+
{
|
|
89
|
+
map: {
|
|
90
|
+
select: 'posts',
|
|
91
|
+
title: '${{ item.title }}',
|
|
92
|
+
rank: '${{ item.rank }}',
|
|
93
|
+
},
|
|
94
|
+
},
|
|
95
|
+
]);
|
|
96
|
+
expect(result).toEqual([
|
|
97
|
+
{ title: 'First', rank: 1 },
|
|
98
|
+
{ title: 'Second', rank: 2 },
|
|
99
|
+
]);
|
|
100
|
+
});
|
|
101
|
+
it('executes limit step', async () => {
|
|
102
|
+
const page = createMockPage({
|
|
103
|
+
evaluate: vi.fn().mockResolvedValue([1, 2, 3, 4, 5]),
|
|
104
|
+
});
|
|
105
|
+
const result = await executePipeline(page, [
|
|
106
|
+
{ evaluate: 'test' },
|
|
107
|
+
{ limit: '3' },
|
|
108
|
+
]);
|
|
109
|
+
expect(result).toEqual([1, 2, 3]);
|
|
110
|
+
});
|
|
111
|
+
it('executes sort step', async () => {
|
|
112
|
+
const page = createMockPage({
|
|
113
|
+
evaluate: vi.fn().mockResolvedValue([{ n: 3 }, { n: 1 }, { n: 2 }]),
|
|
114
|
+
});
|
|
115
|
+
const result = await executePipeline(page, [
|
|
116
|
+
{ evaluate: 'test' },
|
|
117
|
+
{ sort: { by: 'n', order: 'asc' } },
|
|
118
|
+
]);
|
|
119
|
+
expect(result).toEqual([{ n: 1 }, { n: 2 }, { n: 3 }]);
|
|
120
|
+
});
|
|
121
|
+
it('executes sort step with desc order', async () => {
|
|
122
|
+
const page = createMockPage({
|
|
123
|
+
evaluate: vi.fn().mockResolvedValue([{ n: 1 }, { n: 3 }, { n: 2 }]),
|
|
124
|
+
});
|
|
125
|
+
const result = await executePipeline(page, [
|
|
126
|
+
{ evaluate: 'test' },
|
|
127
|
+
{ sort: { by: 'n', order: 'desc' } },
|
|
128
|
+
]);
|
|
129
|
+
expect(result).toEqual([{ n: 3 }, { n: 2 }, { n: 1 }]);
|
|
130
|
+
});
|
|
131
|
+
it('executes wait step with number', async () => {
|
|
132
|
+
const page = createMockPage();
|
|
133
|
+
await executePipeline(page, [
|
|
134
|
+
{ wait: 2 },
|
|
135
|
+
]);
|
|
136
|
+
expect(page.wait).toHaveBeenCalledWith(2);
|
|
137
|
+
});
|
|
138
|
+
it('fails fast on unknown steps', async () => {
|
|
139
|
+
await expect(executePipeline(null, [
|
|
140
|
+
{ unknownStep: 'test' },
|
|
141
|
+
], { debug: true })).rejects.toBeInstanceOf(ConfigError);
|
|
142
|
+
await expect(executePipeline(null, [
|
|
143
|
+
{ unknownStep: 'test' },
|
|
144
|
+
], { debug: true })).rejects.toThrow('Unknown pipeline step "unknownStep"');
|
|
145
|
+
});
|
|
146
|
+
it('passes args through template rendering', async () => {
|
|
147
|
+
const page = createMockPage({
|
|
148
|
+
evaluate: vi.fn().mockResolvedValue([1, 2, 3, 4, 5]),
|
|
149
|
+
});
|
|
150
|
+
const result = await executePipeline(page, [
|
|
151
|
+
{ evaluate: 'test' },
|
|
152
|
+
{ limit: '${{ args.count }}' },
|
|
153
|
+
], { args: { count: 2 } });
|
|
154
|
+
expect(result).toEqual([1, 2]);
|
|
155
|
+
});
|
|
156
|
+
it('click step calls page.click', async () => {
|
|
157
|
+
const page = createMockPage();
|
|
158
|
+
await executePipeline(page, [
|
|
159
|
+
{ click: '@5' },
|
|
160
|
+
]);
|
|
161
|
+
expect(page.click).toHaveBeenCalledWith('5');
|
|
162
|
+
});
|
|
163
|
+
it('fill step calls page.fillText with raw rendered text', async () => {
|
|
164
|
+
const page = createMockPage();
|
|
165
|
+
await executePipeline(page, [
|
|
166
|
+
{ fill: { ref: '@5', text: 'line1\\n/ / ${{ args.tail }}' } },
|
|
167
|
+
], { args: { tail: 'raw' } });
|
|
168
|
+
expect(page.fillText).toHaveBeenCalledWith('5', 'line1\\n/ / raw');
|
|
169
|
+
});
|
|
170
|
+
it('navigate preserves existing data through pipeline', async () => {
|
|
171
|
+
const page = createMockPage({
|
|
172
|
+
evaluate: vi.fn().mockResolvedValue([{ a: 1 }]),
|
|
173
|
+
});
|
|
174
|
+
const result = await executePipeline(page, [
|
|
175
|
+
{ evaluate: 'test' },
|
|
176
|
+
{ navigate: 'https://example.com' },
|
|
177
|
+
]);
|
|
178
|
+
// navigate should preserve existing data
|
|
179
|
+
expect(result).toEqual([{ a: 1 }]);
|
|
180
|
+
expect(page.goto).toHaveBeenCalledWith('https://example.com');
|
|
181
|
+
});
|
|
182
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic registry for pipeline steps.
|
|
3
|
+
* Allows core and third-party plugins to register custom YAML operations.
|
|
4
|
+
*/
|
|
5
|
+
import type { IPage } from '../types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Step handler: all pipeline steps conform to this generic interface.
|
|
8
|
+
* TData is the type of the `data` state flowing into the step.
|
|
9
|
+
* TResult is the expected return type.
|
|
10
|
+
*/
|
|
11
|
+
export type StepHandler<TData = unknown, TResult = unknown, TParams = unknown> = (page: IPage | null, params: TParams, data: TData, args: Record<string, unknown>) => Promise<TResult>;
|
|
12
|
+
/**
|
|
13
|
+
* Get a registered step handler by name.
|
|
14
|
+
*/
|
|
15
|
+
export declare function getStep(name: string): StepHandler | undefined;
|
|
16
|
+
/**
|
|
17
|
+
* List all currently registered step names. Used by `validate.ts` to allowlist
|
|
18
|
+
* step names without maintaining a parallel hand-coded list.
|
|
19
|
+
*
|
|
20
|
+
* Note: this depends on registerStep() side effects below already having run.
|
|
21
|
+
* Importing this module triggers all core registrations at the bottom of the
|
|
22
|
+
* file, so the returned array reflects every core + plugin step at call time.
|
|
23
|
+
*/
|
|
24
|
+
export declare function getRegisteredStepNames(): string[];
|
|
25
|
+
/**
|
|
26
|
+
* Register a new custom step handler for the YAML pipeline.
|
|
27
|
+
*/
|
|
28
|
+
export declare function registerStep(name: string, handler: StepHandler): void;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dynamic registry for pipeline steps.
|
|
3
|
+
* Allows core and third-party plugins to register custom YAML operations.
|
|
4
|
+
*/
|
|
5
|
+
// Import core steps
|
|
6
|
+
import { stepNavigate, stepClick, stepType, stepFill, stepWait, stepPress, stepSnapshot, stepEvaluate } from './steps/browser.js';
|
|
7
|
+
import { stepFetch } from './steps/fetch.js';
|
|
8
|
+
import { stepSelect, stepMap, stepFilter, stepSort, stepLimit } from './steps/transform.js';
|
|
9
|
+
import { stepIntercept } from './steps/intercept.js';
|
|
10
|
+
import { stepTap } from './steps/tap.js';
|
|
11
|
+
import { stepDownload } from './steps/download.js';
|
|
12
|
+
const _stepRegistry = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Get a registered step handler by name.
|
|
15
|
+
*/
|
|
16
|
+
export function getStep(name) {
|
|
17
|
+
return _stepRegistry.get(name);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* List all currently registered step names. Used by `validate.ts` to allowlist
|
|
21
|
+
* step names without maintaining a parallel hand-coded list.
|
|
22
|
+
*
|
|
23
|
+
* Note: this depends on registerStep() side effects below already having run.
|
|
24
|
+
* Importing this module triggers all core registrations at the bottom of the
|
|
25
|
+
* file, so the returned array reflects every core + plugin step at call time.
|
|
26
|
+
*/
|
|
27
|
+
export function getRegisteredStepNames() {
|
|
28
|
+
return [..._stepRegistry.keys()];
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Register a new custom step handler for the YAML pipeline.
|
|
32
|
+
*/
|
|
33
|
+
export function registerStep(name, handler) {
|
|
34
|
+
_stepRegistry.set(name, handler);
|
|
35
|
+
}
|
|
36
|
+
// -------------------------------------------------------------
|
|
37
|
+
// Auto-Register Core Steps
|
|
38
|
+
// -------------------------------------------------------------
|
|
39
|
+
registerStep('navigate', stepNavigate);
|
|
40
|
+
registerStep('fetch', stepFetch);
|
|
41
|
+
registerStep('select', stepSelect);
|
|
42
|
+
registerStep('evaluate', stepEvaluate);
|
|
43
|
+
registerStep('snapshot', stepSnapshot);
|
|
44
|
+
registerStep('click', stepClick);
|
|
45
|
+
registerStep('type', stepType);
|
|
46
|
+
registerStep('fill', stepFill);
|
|
47
|
+
registerStep('wait', stepWait);
|
|
48
|
+
registerStep('press', stepPress);
|
|
49
|
+
registerStep('map', stepMap);
|
|
50
|
+
registerStep('filter', stepFilter);
|
|
51
|
+
registerStep('sort', stepSort);
|
|
52
|
+
registerStep('limit', stepLimit);
|
|
53
|
+
registerStep('intercept', stepIntercept);
|
|
54
|
+
registerStep('tap', stepTap);
|
|
55
|
+
registerStep('download', stepDownload);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline step: navigate, click, type, wait, press, snapshot.
|
|
3
|
+
* Browser interaction primitives.
|
|
4
|
+
*/
|
|
5
|
+
import type { IPage } from '../../types.js';
|
|
6
|
+
export declare function stepNavigate(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|
|
7
|
+
export declare function stepClick(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|
|
8
|
+
export declare function stepType(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|
|
9
|
+
export declare function stepFill(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|
|
10
|
+
export declare function stepWait(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|
|
11
|
+
export declare function stepPress(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|
|
12
|
+
export declare function stepSnapshot(page: IPage | null, params: unknown, _data: unknown, _args: Record<string, unknown>): Promise<unknown>;
|
|
13
|
+
export declare function stepEvaluate(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline step: navigate, click, type, wait, press, snapshot.
|
|
3
|
+
* Browser interaction primitives.
|
|
4
|
+
*/
|
|
5
|
+
import { render } from '../template.js';
|
|
6
|
+
import { isRecord } from '../../utils.js';
|
|
7
|
+
export async function stepNavigate(page, params, data, args) {
|
|
8
|
+
if (isRecord(params) && 'url' in params) {
|
|
9
|
+
const url = String(render(params.url, { args, data }));
|
|
10
|
+
await page.goto(url, { waitUntil: params.waitUntil, settleMs: typeof params.settleMs === 'number' ? params.settleMs : undefined });
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
const url = render(params, { args, data });
|
|
14
|
+
await page.goto(String(url));
|
|
15
|
+
}
|
|
16
|
+
return data;
|
|
17
|
+
}
|
|
18
|
+
export async function stepClick(page, params, data, args) {
|
|
19
|
+
await page.click(String(render(params, { args, data })).replace(/^@/, ''));
|
|
20
|
+
return data;
|
|
21
|
+
}
|
|
22
|
+
export async function stepType(page, params, data, args) {
|
|
23
|
+
if (isRecord(params)) {
|
|
24
|
+
const ref = String(render(params.ref ?? '', { args, data })).replace(/^@/, '');
|
|
25
|
+
const text = String(render(params.text ?? '', { args, data }));
|
|
26
|
+
await page.typeText(ref, text);
|
|
27
|
+
if (params.submit)
|
|
28
|
+
await page.pressKey('Enter');
|
|
29
|
+
}
|
|
30
|
+
return data;
|
|
31
|
+
}
|
|
32
|
+
export async function stepFill(page, params, data, args) {
|
|
33
|
+
if (isRecord(params)) {
|
|
34
|
+
const ref = String(render(params.ref ?? '', { args, data })).replace(/^@/, '');
|
|
35
|
+
const text = String(render(params.text ?? '', { args, data }));
|
|
36
|
+
await page.fillText(ref, text);
|
|
37
|
+
if (params.submit)
|
|
38
|
+
await page.pressKey('Enter');
|
|
39
|
+
}
|
|
40
|
+
return data;
|
|
41
|
+
}
|
|
42
|
+
export async function stepWait(page, params, data, args) {
|
|
43
|
+
if (typeof params === 'number')
|
|
44
|
+
await page.wait(params);
|
|
45
|
+
else if (isRecord(params)) {
|
|
46
|
+
if ('text' in params) {
|
|
47
|
+
await page.wait({
|
|
48
|
+
text: String(render(params.text, { args, data })),
|
|
49
|
+
timeout: typeof params.timeout === 'number' ? params.timeout : undefined,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
else if ('time' in params)
|
|
53
|
+
await page.wait(Number(params.time));
|
|
54
|
+
}
|
|
55
|
+
else if (typeof params === 'string')
|
|
56
|
+
await page.wait(Number(render(params, { args, data })));
|
|
57
|
+
return data;
|
|
58
|
+
}
|
|
59
|
+
export async function stepPress(page, params, data, args) {
|
|
60
|
+
await page.pressKey(String(render(params, { args, data })));
|
|
61
|
+
return data;
|
|
62
|
+
}
|
|
63
|
+
export async function stepSnapshot(page, params, _data, _args) {
|
|
64
|
+
const opts = isRecord(params) ? params : {};
|
|
65
|
+
return page.snapshot({
|
|
66
|
+
interactive: typeof opts.interactive === 'boolean' ? opts.interactive : false,
|
|
67
|
+
compact: typeof opts.compact === 'boolean' ? opts.compact : false,
|
|
68
|
+
maxDepth: typeof opts.max_depth === 'number' ? opts.max_depth : undefined,
|
|
69
|
+
raw: typeof opts.raw === 'boolean' ? opts.raw : false,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
export async function stepEvaluate(page, params, data, args) {
|
|
73
|
+
const js = String(render(params, { args, data }));
|
|
74
|
+
let result = await page.evaluate(js);
|
|
75
|
+
// Browser may return JSON as a string — auto-parse it
|
|
76
|
+
if (typeof result === 'string') {
|
|
77
|
+
const trimmed = result.trim();
|
|
78
|
+
if ((trimmed.startsWith('[') && trimmed.endsWith(']')) || (trimmed.startsWith('{') && trimmed.endsWith('}'))) {
|
|
79
|
+
try {
|
|
80
|
+
result = JSON.parse(trimmed);
|
|
81
|
+
}
|
|
82
|
+
catch { }
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return result;
|
|
86
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pipeline step: download — file download with concurrency and progress.
|
|
3
|
+
*
|
|
4
|
+
* Supports:
|
|
5
|
+
* - Direct HTTP downloads (images, documents)
|
|
6
|
+
* - yt-dlp integration for video platforms
|
|
7
|
+
* - Browser cookie forwarding for authenticated downloads
|
|
8
|
+
* - Filename templating and deduplication
|
|
9
|
+
*/
|
|
10
|
+
import type { IPage } from '../../types.js';
|
|
11
|
+
export interface DownloadResult {
|
|
12
|
+
status: 'success' | 'skipped' | 'failed';
|
|
13
|
+
path?: string;
|
|
14
|
+
size?: number;
|
|
15
|
+
error?: string;
|
|
16
|
+
duration?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function stepDownload(page: IPage | null, params: unknown, data: unknown, args: Record<string, unknown>): Promise<unknown>;
|