pi-agent-browser-native 0.9.2 → 0.9.4
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/CHANGELOG.md +91 -5
- package/README.md +120 -86
- package/dist/extensions/agent-browser/index.js +43065 -2016
- package/dist/extensions/agent-browser/lib/argv-descriptor.js +49 -26
- package/dist/extensions/agent-browser/lib/argv-grammar.js +82 -93
- package/dist/extensions/agent-browser/lib/bash-guard.js +129 -126
- package/dist/extensions/agent-browser/lib/batch-lifecycle.js +113 -49
- package/dist/extensions/agent-browser/lib/browser-execution-claim-codec.js +61 -0
- package/dist/extensions/agent-browser/lib/browser-execution-claim-storage.js +232 -0
- package/dist/extensions/agent-browser/lib/browser-execution-claims.js +202 -0
- package/dist/extensions/agent-browser/lib/browser-execution-identity.js +77 -0
- package/dist/extensions/agent-browser/lib/browser-journal-branch.js +98 -0
- package/dist/extensions/agent-browser/lib/browser-journal-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/browser-journal-projection.js +221 -0
- package/dist/extensions/agent-browser/lib/browser-journal-reader.js +89 -0
- package/dist/extensions/agent-browser/lib/browser-journal-replay.js +246 -0
- package/dist/extensions/agent-browser/lib/browser-journal.js +103 -394
- package/dist/extensions/agent-browser/lib/browser-legacy-pages.js +220 -0
- package/dist/extensions/agent-browser/lib/browser-legacy-projection.js +282 -0
- package/dist/extensions/agent-browser/lib/browser-legacy-types.js +1 -0
- package/dist/extensions/agent-browser/lib/browser-session-conversion-stream.js +217 -0
- package/dist/extensions/agent-browser/lib/browser-session-conversion.js +80 -335
- package/dist/extensions/agent-browser/lib/browser-transcript-contracts.js +35 -0
- package/dist/extensions/agent-browser/lib/browser-transcript-validation.js +166 -0
- package/dist/extensions/agent-browser/lib/browser-transcript.js +137 -81
- package/dist/extensions/agent-browser/lib/browser-value-parsing.js +15 -0
- package/dist/extensions/agent-browser/lib/command-capabilities.js +340 -0
- package/dist/extensions/agent-browser/lib/command-policy.js +107 -88
- package/dist/extensions/agent-browser/lib/command-taxonomy.js +49 -322
- package/dist/extensions/agent-browser/lib/config-policy.js +138 -343
- package/dist/extensions/agent-browser/lib/config-providers.js +71 -0
- package/dist/extensions/agent-browser/lib/config-validation.js +218 -0
- package/dist/extensions/agent-browser/lib/config.js +19 -7
- package/dist/extensions/agent-browser/lib/electron/cdp.js +15 -7
- package/dist/extensions/agent-browser/lib/electron/cleanup.js +134 -55
- package/dist/extensions/agent-browser/lib/electron/discovery-darwin.js +109 -0
- package/dist/extensions/agent-browser/lib/electron/discovery-desktop.js +136 -0
- package/dist/extensions/agent-browser/lib/electron/discovery-evidence.js +89 -0
- package/dist/extensions/agent-browser/lib/electron/discovery-linux.js +93 -0
- package/dist/extensions/agent-browser/lib/electron/discovery-packages.js +162 -0
- package/dist/extensions/agent-browser/lib/electron/discovery-types.js +2 -0
- package/dist/extensions/agent-browser/lib/electron/discovery.js +140 -549
- package/dist/extensions/agent-browser/lib/electron/launch-monitor.js +102 -0
- package/dist/extensions/agent-browser/lib/electron/launch-process.js +209 -0
- package/dist/extensions/agent-browser/lib/electron/launch-types.js +2 -0
- package/dist/extensions/agent-browser/lib/electron/launch.js +249 -354
- package/dist/extensions/agent-browser/lib/executable-path.js +21 -12
- package/dist/extensions/agent-browser/lib/execution-cwd.js +35 -18
- package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
- package/dist/extensions/agent-browser/lib/input-modes/job.js +116 -313
- package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +104 -0
- package/dist/extensions/agent-browser/lib/input-modes/lookup-plan.js +132 -0
- package/dist/extensions/agent-browser/lib/input-modes/lookup-redaction.js +57 -0
- package/dist/extensions/agent-browser/lib/input-modes/lookup-source-evidence.js +151 -0
- package/dist/extensions/agent-browser/lib/input-modes/lookup-workspace.js +142 -0
- package/dist/extensions/agent-browser/lib/input-modes/lookups.js +57 -412
- package/dist/extensions/agent-browser/lib/input-modes/params.js +63 -17
- package/dist/extensions/agent-browser/lib/input-modes/qa-analysis.js +268 -0
- package/dist/extensions/agent-browser/lib/input-modes/qa-presentation.js +117 -0
- package/dist/extensions/agent-browser/lib/input-modes/script-child.js +396 -0
- package/dist/extensions/agent-browser/lib/input-modes/script-protocol.js +86 -0
- package/dist/extensions/agent-browser/lib/input-modes/script-types.js +1 -0
- package/dist/extensions/agent-browser/lib/input-modes/script-validation.js +60 -0
- package/dist/extensions/agent-browser/lib/input-modes/script.js +60 -409
- package/dist/extensions/agent-browser/lib/input-modes/semantic-action.js +218 -128
- package/dist/extensions/agent-browser/lib/input-modes/shared.js +15 -4
- package/dist/extensions/agent-browser/lib/input-modes/types.js +56 -7
- package/dist/extensions/agent-browser/lib/json-schema.js +22 -10
- package/dist/extensions/agent-browser/lib/launch-scoped-flags.js +17 -5
- package/dist/extensions/agent-browser/lib/managed-session-policy-lock.js +92 -425
- package/dist/extensions/agent-browser/lib/managed-session-posix-storage.js +58 -0
- package/dist/extensions/agent-browser/lib/managed-session-project-identity.js +244 -0
- package/dist/extensions/agent-browser/lib/managed-session-restore-context.js +84 -0
- package/dist/extensions/agent-browser/lib/managed-session-restore-policy.js +119 -0
- package/dist/extensions/agent-browser/lib/managed-session-restore-state.js +83 -0
- package/dist/extensions/agent-browser/lib/managed-session-restore.js +168 -300
- package/dist/extensions/agent-browser/lib/managed-session-snapshot-records.js +277 -0
- package/dist/extensions/agent-browser/lib/managed-session-snapshots.js +128 -305
- package/dist/extensions/agent-browser/lib/managed-session-storage.js +56 -253
- package/dist/extensions/agent-browser/lib/native-confirmation.js +140 -0
- package/dist/extensions/agent-browser/lib/native-output.js +44 -9
- package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +107 -66
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-merge.js +14 -6
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/artifact-paths.js +109 -57
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/browser-observation-result.js +82 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/click-dispatch.js +171 -57
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostic-values.js +31 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/diagnostics.js +152 -781
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-observation.js +202 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/electron-text-diagnostics.js +109 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/fill-diagnostics.js +119 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-action-recovery.js +147 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-actions.js +144 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-content.js +123 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-details.js +156 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-electron.js +179 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-evidence.js +39 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-missing-binary.js +89 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-recovery.js +97 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-redaction.js +106 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result-timeout.js +110 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/final-result.js +41 -538
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/index.js +204 -108
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/interaction-diagnostics.js +290 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-close.js +167 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-inspection.js +108 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/managed-session-daemon-policy.js +127 -199
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/native-helper-observation.js +65 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/observation-types.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/overlay-diagnostics.js +120 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/network-page-filter.js +113 -30
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/scroll-shims.js +109 -28
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter-data.js +150 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-filter.js +138 -253
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/snapshot-rendered-text.js +147 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare/wait-timeouts.js +59 -24
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-artifacts.js +159 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-command.js +131 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-daemon.js +93 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-failure.js +42 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-guards.js +242 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-input.js +75 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-observations.js +92 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-selection.js +254 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-page-state.js +121 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-refs.js +130 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-resources.js +114 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-semantic.js +121 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-session-plan.js +222 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare-timeouts.js +68 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prepare.js +176 -1114
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-analysis.js +191 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-confirmation.js +152 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-diagnostics.js +182 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-electron.js +150 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle-phase.js +115 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-lifecycle.js +256 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-managed.js +256 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native-phase.js +93 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-native.js +113 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-navigation.js +316 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-ownership.js +28 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-page-phase.js +142 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-presentation.js +333 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication-phase.js +71 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-publication.js +201 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-receipts.js +183 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-refs.js +200 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output-tabs.js +142 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/process-output.js +18 -910
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/prompt-guards.js +23 -13
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-receipt-reconciliation.js +198 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery-presentation.js +154 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/recording-recovery.js +68 -151
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-capture.js +14 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/screenshot-observation.js +169 -46
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-commands.js +130 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-electron.js +210 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-observations.js +61 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-outcomes.js +187 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-refs.js +171 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state-tabs.js +228 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/session-state.js +77 -753
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/text-visibility-diagnostics.js +182 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-diagnostics.js +256 -0
- package/dist/extensions/agent-browser/lib/orchestration/browser-run/timeout-progress.js +108 -0
- package/dist/extensions/agent-browser/lib/orchestration/code-artifact-observation.js +39 -0
- package/dist/extensions/agent-browser/lib/orchestration/code-image-observation.js +119 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/branch.js +92 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup-result.js +58 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/cleanup.js +78 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/discovery.js +106 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/index.js +48 -816
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/policy.js +86 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-collection.js +69 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +167 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +164 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe.js +161 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/status.js +165 -0
- package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +21 -9
- package/dist/extensions/agent-browser/lib/orchestration/extension-artifact-preflight.js +211 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-artifacts.js +23 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-attachment-replay.js +99 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-branch-restore.js +275 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-code.js +280 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-command-admission.js +303 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-command-output.js +36 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-command-result.js +335 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-command-run.js +227 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-command-state.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-electron-ownership.js +204 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-execution-locks.js +139 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-execution-queue.js +24 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-host-coordination.js +98 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-host-run.js +295 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-intent-replay.js +41 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-invocation.js +7 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-lifecycle.js +102 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-managed-ownership.js +133 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-observation.js +120 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-prompt.js +180 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-recording.js +290 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-resource-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-resource-replay.js +269 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-result-state.js +113 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-runtime.js +146 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-script-leases.js +58 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-tool-boundary.js +62 -0
- package/dist/extensions/agent-browser/lib/orchestration/extension-version-check.js +54 -0
- package/dist/extensions/agent-browser/lib/orchestration/input-plan-types.js +1 -0
- package/dist/extensions/agent-browser/lib/orchestration/input-plan.js +261 -185
- package/dist/extensions/agent-browser/lib/orchestration/input-redaction.js +62 -0
- package/dist/extensions/agent-browser/lib/orchestration/native-config.js +144 -0
- package/dist/extensions/agent-browser/lib/orchestration/native-root-launch.js +77 -0
- package/dist/extensions/agent-browser/lib/orchestration/native-session-defaults.js +210 -139
- package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
- package/dist/extensions/agent-browser/lib/orchestration/output-file.js +198 -98
- package/dist/extensions/agent-browser/lib/orchestration/script-mode.js +199 -96
- package/dist/extensions/agent-browser/lib/owned-managed-session-context.js +55 -0
- package/dist/extensions/agent-browser/lib/page-target-batch.js +118 -0
- package/dist/extensions/agent-browser/lib/page-target-guards.js +50 -0
- package/dist/extensions/agent-browser/lib/page-target-navigation.js +104 -0
- package/dist/extensions/agent-browser/lib/page-target-validation.js +59 -243
- package/dist/extensions/agent-browser/lib/parsing.js +13 -4
- package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +134 -68
- package/dist/extensions/agent-browser/lib/playbook.js +18 -14
- package/dist/extensions/agent-browser/lib/process-child.js +284 -0
- package/dist/extensions/agent-browser/lib/process-environment.js +22 -6
- package/dist/extensions/agent-browser/lib/process-errors.js +23 -0
- package/dist/extensions/agent-browser/lib/process-identity.js +47 -15
- package/dist/extensions/agent-browser/lib/process-socket-storage.js +256 -0
- package/dist/extensions/agent-browser/lib/process-stdout.js +74 -0
- package/dist/extensions/agent-browser/lib/process.js +146 -537
- package/dist/extensions/agent-browser/lib/prompt-artifacts.js +287 -0
- package/dist/extensions/agent-browser/lib/prompt-policy.js +15 -194
- package/dist/extensions/agent-browser/lib/read-command.js +41 -0
- package/dist/extensions/agent-browser/lib/read-confirmation.js +138 -35
- package/dist/extensions/agent-browser/lib/recording-reservations.js +118 -45
- package/dist/extensions/agent-browser/lib/redaction-fields.js +75 -0
- package/dist/extensions/agent-browser/lib/redaction-json.js +149 -0
- package/dist/extensions/agent-browser/lib/redaction-url.js +88 -0
- package/dist/extensions/agent-browser/lib/results/action-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/results/action-recommendations.js +28 -271
- package/dist/extensions/agent-browser/lib/results/artifact-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/results/artifact-manifest-validation.js +133 -0
- package/dist/extensions/agent-browser/lib/results/artifact-manifest.js +96 -94
- package/dist/extensions/agent-browser/lib/results/artifact-recommendations.js +73 -0
- package/dist/extensions/agent-browser/lib/results/categories.js +111 -54
- package/dist/extensions/agent-browser/lib/results/confirmation.js +29 -10
- package/dist/extensions/agent-browser/lib/results/editable-ref-evidence.js +62 -27
- package/dist/extensions/agent-browser/lib/results/electron-recommendations.js +83 -0
- package/dist/extensions/agent-browser/lib/results/envelope-decoding.js +48 -0
- package/dist/extensions/agent-browser/lib/results/envelope.js +93 -66
- package/dist/extensions/agent-browser/lib/results/evidence-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/results/failure-recommendations.js +180 -0
- package/dist/extensions/agent-browser/lib/results/network-routes.js +86 -45
- package/dist/extensions/agent-browser/lib/results/network.js +35 -12
- package/dist/extensions/agent-browser/lib/results/next-actions.js +49 -19
- package/dist/extensions/agent-browser/lib/results/presentation/artifact-files.js +320 -0
- package/dist/extensions/agent-browser/lib/results/presentation/artifact-format.js +138 -0
- package/dist/extensions/agent-browser/lib/results/presentation/artifact-images.js +113 -0
- package/dist/extensions/agent-browser/lib/results/presentation/artifact-verification.js +145 -0
- package/dist/extensions/agent-browser/lib/results/presentation/artifacts.js +99 -552
- package/dist/extensions/agent-browser/lib/results/presentation/batch-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/results/presentation/batch-recording.js +118 -0
- package/dist/extensions/agent-browser/lib/results/presentation/batch-redaction.js +68 -0
- package/dist/extensions/agent-browser/lib/results/presentation/batch-rendering.js +135 -0
- package/dist/extensions/agent-browser/lib/results/presentation/batch-step.js +227 -0
- package/dist/extensions/agent-browser/lib/results/presentation/batch-summary.js +91 -0
- package/dist/extensions/agent-browser/lib/results/presentation/batch.js +91 -460
- package/dist/extensions/agent-browser/lib/results/presentation/browser-profile-recovery.js +9 -5
- package/dist/extensions/agent-browser/lib/results/presentation/command-presenters.js +216 -0
- package/dist/extensions/agent-browser/lib/results/presentation/common.js +26 -9
- package/dist/extensions/agent-browser/lib/results/presentation/content.js +86 -29
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-a11y.js +67 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-health.js +79 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-identity.js +199 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-logs.js +75 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network-actions.js +216 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-network.js +124 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-redaction.js +64 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-storage.js +209 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-stream.js +69 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostic-summary.js +222 -0
- package/dist/extensions/agent-browser/lib/results/presentation/diagnostics.js +103 -1019
- package/dist/extensions/agent-browser/lib/results/presentation/early-result.js +70 -0
- package/dist/extensions/agent-browser/lib/results/presentation/errors.js +130 -60
- package/dist/extensions/agent-browser/lib/results/presentation/input-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/results/presentation/large-output.js +60 -145
- package/dist/extensions/agent-browser/lib/results/presentation/navigation.js +147 -88
- package/dist/extensions/agent-browser/lib/results/presentation/notices.js +75 -0
- package/dist/extensions/agent-browser/lib/results/presentation/observation-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/results/presentation/observation-rendering.js +127 -0
- package/dist/extensions/agent-browser/lib/results/presentation/outcomes.js +120 -0
- package/dist/extensions/agent-browser/lib/results/presentation/output-completion.js +77 -0
- package/dist/extensions/agent-browser/lib/results/presentation/output-spill.js +51 -0
- package/dist/extensions/agent-browser/lib/results/presentation/registry.js +117 -237
- package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
- package/dist/extensions/agent-browser/lib/results/presentation/skills.js +104 -73
- package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
- package/dist/extensions/agent-browser/lib/results/presentation.js +17 -248
- package/dist/extensions/agent-browser/lib/results/recommendation-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/results/recording.js +52 -14
- package/dist/extensions/agent-browser/lib/results/recovery-actions.js +14 -5
- package/dist/extensions/agent-browser/lib/results/recovery-next-actions.js +30 -22
- package/dist/extensions/agent-browser/lib/results/selector-recovery-target.js +83 -0
- package/dist/extensions/agent-browser/lib/results/selector-recovery.js +123 -123
- package/dist/extensions/agent-browser/lib/results/snapshot-compact.js +266 -0
- package/dist/extensions/agent-browser/lib/results/snapshot-content.js +32 -0
- package/dist/extensions/agent-browser/lib/results/snapshot-high-value-controls.js +104 -71
- package/dist/extensions/agent-browser/lib/results/snapshot-refs.js +31 -11
- package/dist/extensions/agent-browser/lib/results/snapshot-segments.js +125 -66
- package/dist/extensions/agent-browser/lib/results/snapshot-spill.js +26 -7
- package/dist/extensions/agent-browser/lib/results/snapshot.js +28 -248
- package/dist/extensions/agent-browser/lib/results/text.js +16 -5
- package/dist/extensions/agent-browser/lib/runtime-args-validation.js +133 -0
- package/dist/extensions/agent-browser/lib/runtime-compatibility.js +81 -0
- package/dist/extensions/agent-browser/lib/runtime-contracts.js +1 -0
- package/dist/extensions/agent-browser/lib/runtime-redaction.js +118 -0
- package/dist/extensions/agent-browser/lib/runtime-replay-events.js +144 -0
- package/dist/extensions/agent-browser/lib/runtime-session-identity.js +76 -0
- package/dist/extensions/agent-browser/lib/runtime-session-plan.js +114 -0
- package/dist/extensions/agent-browser/lib/runtime-session-replay.js +123 -0
- package/dist/extensions/agent-browser/lib/runtime-tab-correction.js +65 -0
- package/dist/extensions/agent-browser/lib/runtime-timeouts.js +28 -0
- package/dist/extensions/agent-browser/lib/runtime.js +137 -1037
- package/dist/extensions/agent-browser/lib/session-identity.js +51 -0
- package/dist/extensions/agent-browser/lib/session-page-observation.js +357 -0
- package/dist/extensions/agent-browser/lib/session-page-state.js +188 -324
- package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
- package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +78 -0
- package/dist/extensions/agent-browser/lib/temp-mutation-queue.js +7 -0
- package/dist/extensions/agent-browser/lib/temp-root-ownership.js +234 -0
- package/dist/extensions/agent-browser/lib/temp-root.js +207 -0
- package/dist/extensions/agent-browser/lib/temp.js +33 -446
- package/dist/extensions/agent-browser/lib/tool-surface.js +94 -24
- package/dist/extensions/agent-browser/lib/upstream-version.js +3 -2
- package/dist/extensions/agent-browser/lib/web-search-providers.js +229 -0
- package/dist/extensions/agent-browser/lib/web-search-request.js +108 -0
- package/dist/extensions/agent-browser/lib/web-search-results.js +281 -0
- package/dist/extensions/agent-browser/lib/web-search-schema.js +82 -0
- package/dist/extensions/agent-browser/lib/web-search.js +109 -617
- package/dist/extensions/agent-browser/lib/webmcp-observation.js +13 -6
- package/dist/extensions/agent-browser/lib/windows-stock-launcher.js +63 -37
- package/dist/extensions/agent-browser/script-worker.js +80 -43
- package/dist/scripts/agent-browser-target.mjs +4 -2
- package/docs/ARCHITECTURE.md +22 -10
- package/docs/CODE_QUALITY.md +242 -0
- package/docs/COMMAND_REFERENCE.md +264 -229
- package/docs/ELECTRON.md +53 -44
- package/docs/RELEASE.md +21 -17
- package/docs/REQUIREMENTS.md +2 -0
- package/docs/SESSION_STORAGE.md +1 -1
- package/docs/SUPPORT_MATRIX.md +84 -77
- package/docs/TOOL_CONTRACT.md +165 -130
- package/docs/platform-smoke.md +5 -5
- package/package.json +143 -120
- package/scripts/agent-browser-capability-baseline.mjs +361 -957
- package/scripts/agent-browser-target.mjs +6 -2
- package/scripts/build.mjs +37 -8
- package/scripts/capability-core-commands.mjs +193 -0
- package/scripts/capability-options.mjs +283 -0
- package/scripts/capability-samples.mjs +133 -0
- package/scripts/capability-section.mjs +11 -0
- package/scripts/config.mjs +213 -114
- package/scripts/convert-browser-session.mjs +30 -9
- package/scripts/doctor-sources.mjs +195 -0
- package/scripts/doctor.mjs +92 -247
- package/scripts/platform-smoke/artifacts.mjs +38 -11
- package/scripts/platform-smoke/commands.mjs +104 -0
- package/scripts/platform-smoke/crabbox-runner.mjs +167 -80
- package/scripts/platform-smoke/doctor-support.mjs +157 -0
- package/scripts/platform-smoke/doctor-windows.mjs +230 -0
- package/scripts/platform-smoke/doctor.mjs +212 -320
- package/scripts/platform-smoke/lease-evidence.mjs +134 -0
- package/scripts/platform-smoke/suite-checks.mjs +98 -0
- package/scripts/platform-smoke/suite-evidence.mjs +281 -0
- package/scripts/platform-smoke/targets.mjs +158 -472
- package/scripts/platform-smoke.mjs +55 -40
- package/scripts/prepare.mjs +16 -7
|
@@ -1,264 +1,44 @@
|
|
|
1
1
|
import { isRecord } from "../parsing.js";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
const SNAPSHOT_INLINE_MAX_LINES = 80;
|
|
9
|
-
const SNAPSHOT_INLINE_MAX_REFS = 60;
|
|
10
|
-
const SNAPSHOT_PRIMARY_PREVIEW_LINES = 8;
|
|
11
|
-
const SNAPSHOT_SECTION_PREVIEW_LINES = 2;
|
|
12
|
-
const SNAPSHOT_KEY_REF_MAX_LINES = 8;
|
|
13
|
-
const SNAPSHOT_OTHER_REF_MAX_LINES = 4;
|
|
14
|
-
const SNAPSHOT_HIGH_VALUE_REF_MAX_LINES = 10;
|
|
15
|
-
const SNAPSHOT_ROLE_COUNT_MAX_ENTRIES = 4;
|
|
16
|
-
const SNAPSHOT_NAME_MAX_CHARS = 96;
|
|
17
|
-
function getSnapshotText(data) {
|
|
18
|
-
const full = getFullSnapshotData(data);
|
|
19
|
-
return typeof full?.snapshot === "string" ? full.snapshot : isRecord(data.snapshot) ? JSON.stringify(data.snapshot) : undefined;
|
|
20
|
-
}
|
|
21
|
-
function getSnapshotOrigin(data) {
|
|
22
|
-
return typeof data.origin === "string" ? data.origin : "(unknown origin)";
|
|
23
|
-
}
|
|
24
|
-
function getSnapshotRoleCounts(refEntries) {
|
|
25
|
-
const counts = {};
|
|
26
|
-
for (const entry of refEntries) {
|
|
27
|
-
counts[entry.role] = (counts[entry.role] ?? 0) + 1;
|
|
28
|
-
}
|
|
29
|
-
return counts;
|
|
30
|
-
}
|
|
31
|
-
function formatRoleCounts(roleCounts) {
|
|
32
|
-
const entries = Object.entries(roleCounts);
|
|
33
|
-
if (entries.length === 0)
|
|
34
|
-
return undefined;
|
|
35
|
-
const ordered = entries.sort((left, right) => {
|
|
36
|
-
if (right[1] !== left[1])
|
|
37
|
-
return right[1] - left[1];
|
|
38
|
-
return getSnapshotRolePriority(left[0]) - getSnapshotRolePriority(right[0]);
|
|
39
|
-
});
|
|
40
|
-
const visibleEntries = ordered.slice(0, SNAPSHOT_ROLE_COUNT_MAX_ENTRIES).map(([role, count]) => `${role} ${count}`);
|
|
41
|
-
const omittedEntries = Math.max(0, ordered.length - visibleEntries.length);
|
|
42
|
-
if (omittedEntries > 0) {
|
|
43
|
-
visibleEntries.push(`+${omittedEntries} more`);
|
|
44
|
-
}
|
|
45
|
-
return visibleEntries.join(", ");
|
|
46
|
-
}
|
|
47
|
-
function rankRefEntries(refEntries, previewRefIds, focusRefIds, lineOrderByRef) {
|
|
48
|
-
return [...refEntries].sort((left, right) => {
|
|
49
|
-
const leftBucket = previewRefIds.has(left.id) ? 0 : focusRefIds.has(left.id) ? 1 : 2;
|
|
50
|
-
const rightBucket = previewRefIds.has(right.id) ? 0 : focusRefIds.has(right.id) ? 1 : 2;
|
|
51
|
-
if (leftBucket !== rightBucket)
|
|
52
|
-
return leftBucket - rightBucket;
|
|
53
|
-
const rolePriority = getSnapshotRolePriority(left.role) - getSnapshotRolePriority(right.role);
|
|
54
|
-
if (rolePriority !== 0)
|
|
55
|
-
return rolePriority;
|
|
56
|
-
const leftHasName = left.name.length > 0 ? 0 : 1;
|
|
57
|
-
const rightHasName = right.name.length > 0 ? 0 : 1;
|
|
58
|
-
if (leftHasName !== rightHasName)
|
|
59
|
-
return leftHasName - rightHasName;
|
|
60
|
-
const leftLineOrder = lineOrderByRef.get(left.id) ?? Number.MAX_SAFE_INTEGER;
|
|
61
|
-
const rightLineOrder = lineOrderByRef.get(right.id) ?? Number.MAX_SAFE_INTEGER;
|
|
62
|
-
if (leftLineOrder !== rightLineOrder)
|
|
63
|
-
return leftLineOrder - rightLineOrder;
|
|
64
|
-
return compareRefIds(left.id, right.id);
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
function formatCompactRef(entry) {
|
|
68
|
-
const suffix = entry.name.length > 0 ? ` "${truncateText(entry.name, SNAPSHOT_NAME_MAX_CHARS)}"` : "";
|
|
69
|
-
return `- ${entry.id} ${entry.role}${suffix}`;
|
|
70
|
-
}
|
|
2
|
+
import { buildCompactSnapshotView } from "./snapshot-compact.js";
|
|
3
|
+
import { formatRawSnapshotText, formatSnapshotSummary, getSnapshotText, } from "./snapshot-content.js";
|
|
4
|
+
import { getSnapshotRefEntries } from "./snapshot-refs.js";
|
|
5
|
+
import { applySnapshotArtifactManifest, writeSnapshotSpillFile, } from "./snapshot-spill.js";
|
|
6
|
+
import { countLines, stringifyUnknown } from "./text.js";
|
|
7
|
+
export { formatRawSnapshotText, formatSnapshotSummary } from "./snapshot-content.js";
|
|
71
8
|
function shouldCompactSnapshot(rawText, data) {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
countLines(snapshot) > SNAPSHOT_INLINE_MAX_LINES ||
|
|
76
|
-
refEntries.length > SNAPSHOT_INLINE_MAX_REFS);
|
|
77
|
-
}
|
|
78
|
-
export function formatSnapshotSummary(data) {
|
|
79
|
-
const origin = typeof data.origin === "string" ? data.origin : "page";
|
|
80
|
-
if (isRecord(data.snapshot) && data.snapshot.kind !== "full")
|
|
81
|
-
return `Snapshot ${data.snapshot.kind}: revision ${data.snapshot.revision} on ${origin}`;
|
|
82
|
-
const refs = getSnapshotRefEntries(data).length;
|
|
83
|
-
return `Snapshot: ${refs} refs on ${origin}`;
|
|
84
|
-
}
|
|
85
|
-
export function formatRawSnapshotText(data) {
|
|
86
|
-
const origin = getSnapshotOrigin(data);
|
|
87
|
-
const refs = getSnapshotRefEntries(data).length;
|
|
88
|
-
const snapshot = getSnapshotText(data);
|
|
89
|
-
if (isRecord(data.snapshot) && data.snapshot.kind !== "full")
|
|
90
|
-
return `Origin: ${origin}\n${formatSnapshotSummary(data)}\n\n${snapshot}`;
|
|
91
|
-
if (!snapshot) {
|
|
92
|
-
return `Origin: ${origin}\nRefs: ${refs}\n\n(no interactive elements)`;
|
|
93
|
-
}
|
|
94
|
-
return `Origin: ${origin}\nRefs: ${refs}\n\n${snapshot}`;
|
|
9
|
+
return (rawText.length > 6_000 ||
|
|
10
|
+
countLines(getSnapshotText(data) ?? "") > 80 ||
|
|
11
|
+
getSnapshotRefEntries(data).length > 60);
|
|
95
12
|
}
|
|
96
|
-
|
|
97
|
-
const summary = formatSnapshotSummary(data);
|
|
98
|
-
const rawText = formatRawSnapshotText(data);
|
|
99
|
-
// Native partials are already compact patches, not accessibility trees.
|
|
100
|
-
// The ordinary large-output presenter handles truly oversized patches.
|
|
101
|
-
if ((isRecord(data.snapshot) && data.snapshot.kind !== "full") || !shouldCompactSnapshot(rawText, data)) {
|
|
102
|
-
return {
|
|
103
|
-
content: [{ type: "text", text: rawText }],
|
|
104
|
-
data,
|
|
105
|
-
summary,
|
|
106
|
-
};
|
|
107
|
-
}
|
|
108
|
-
let fullOutputPath;
|
|
109
|
-
let spill;
|
|
110
|
-
let spillErrorText;
|
|
13
|
+
async function getSnapshotSpill(data, store) {
|
|
111
14
|
try {
|
|
112
|
-
spill = await writeSnapshotSpillFile(data,
|
|
113
|
-
|
|
15
|
+
const spill = await writeSnapshotSpillFile(data, store);
|
|
16
|
+
return { spill, fullOutputPath: spill.path };
|
|
114
17
|
}
|
|
115
18
|
catch (error) {
|
|
116
|
-
spillErrorText
|
|
117
|
-
}
|
|
118
|
-
const snapshot = getSnapshotText(data) ?? "(no interactive elements)";
|
|
119
|
-
const snapshotLines = parseSnapshotLines(snapshot);
|
|
120
|
-
const refEntries = enrichSnapshotRefEntries(getSnapshotRefEntries(data), snapshotLines);
|
|
121
|
-
const roleCounts = getSnapshotRoleCounts(refEntries);
|
|
122
|
-
const roleCountsText = formatRoleCounts(roleCounts);
|
|
123
|
-
const useStructuredPreview = canUseStructuredSnapshotPreview(snapshotLines, refEntries);
|
|
124
|
-
const snapshotSegments = useStructuredPreview ? buildSnapshotSegments(snapshotLines) : [];
|
|
125
|
-
const primarySegment = useStructuredPreview ? choosePrimarySegment(snapshotSegments) : undefined;
|
|
126
|
-
const additionalSegments = useStructuredPreview ? chooseAdditionalSegments(snapshotSegments, primarySegment) : [];
|
|
127
|
-
const additionalSegmentCount = useStructuredPreview && primarySegment ? Math.max(0, snapshotSegments.length - 1) : 0;
|
|
128
|
-
const omittedAdditionalSectionCount = Math.max(0, additionalSegmentCount - additionalSegments.length);
|
|
129
|
-
const primaryPreview = primarySegment ? buildSegmentPreview(primarySegment, SNAPSHOT_PRIMARY_PREVIEW_LINES) : undefined;
|
|
130
|
-
const additionalPreviews = additionalSegments
|
|
131
|
-
.map((segment) => ({
|
|
132
|
-
preview: buildSegmentPreview(segment, SNAPSHOT_SECTION_PREVIEW_LINES),
|
|
133
|
-
segment,
|
|
134
|
-
}))
|
|
135
|
-
.filter(({ preview }) => preview.lines.length > 0);
|
|
136
|
-
const fallbackPreview = !useStructuredPreview || !primaryPreview || primaryPreview.lines.length === 0 ? buildFallbackSnapshotOutline(snapshotLines) : undefined;
|
|
137
|
-
const previewRefIds = new Set([
|
|
138
|
-
...(primaryPreview?.refIds ?? []),
|
|
139
|
-
...additionalPreviews.flatMap(({ preview }) => preview.refIds),
|
|
140
|
-
...(fallbackPreview?.refIds ?? []),
|
|
141
|
-
]);
|
|
142
|
-
const focusRefIds = new Set([
|
|
143
|
-
...(useStructuredPreview && primarySegment
|
|
144
|
-
? getMeaningfulSegmentLines(primarySegment).flatMap((line) => (line.ref ? [line.ref] : []))
|
|
145
|
-
: []),
|
|
146
|
-
...(useStructuredPreview
|
|
147
|
-
? additionalSegments.flatMap((segment) => getMeaningfulSegmentLines(segment).flatMap((line) => (line.ref ? [line.ref] : [])))
|
|
148
|
-
: []),
|
|
149
|
-
...(fallbackPreview?.refIds ?? []),
|
|
150
|
-
]);
|
|
151
|
-
const lineOrderByRef = useStructuredPreview ? buildRefLineOrderMap(snapshotLines) : new Map();
|
|
152
|
-
const rankedRefEntries = rankRefEntries(refEntries, previewRefIds, focusRefIds, lineOrderByRef);
|
|
153
|
-
const visibleRankedRefEntries = rankedRefEntries.filter((entry) => !isNoiseName(entry.name) && !isChromeSectionName(entry.name) && !(entry.role === "heading" && entry.name.length <= 2));
|
|
154
|
-
const keyRefEntries = visibleRankedRefEntries.slice(0, SNAPSHOT_KEY_REF_MAX_LINES);
|
|
155
|
-
const keyRefIdSet = new Set(keyRefEntries.map((entry) => entry.id));
|
|
156
|
-
const otherRefEntries = visibleRankedRefEntries
|
|
157
|
-
.filter((entry) => !keyRefIdSet.has(entry.id))
|
|
158
|
-
.slice(0, SNAPSHOT_OTHER_REF_MAX_LINES);
|
|
159
|
-
const displayedRefIdSet = new Set([...keyRefEntries, ...otherRefEntries].map((entry) => entry.id));
|
|
160
|
-
const omittedRefEntries = visibleRankedRefEntries.filter((entry) => !displayedRefIdSet.has(entry.id));
|
|
161
|
-
const highValueControlEntries = omittedRefEntries.filter((entry) => isHighValueControlEntry(entry) && !isNoiseName(entry.name) && !isChromeSectionName(entry.name));
|
|
162
|
-
const visibleHighValueControlEntries = selectHighValueControlEntries(highValueControlEntries, SNAPSHOT_HIGH_VALUE_REF_MAX_LINES);
|
|
163
|
-
const omittedHighValueControls = Math.max(0, highValueControlEntries.length - visibleHighValueControlEntries.length);
|
|
164
|
-
const omittedNonHighlightedRefs = Math.max(0, omittedRefEntries.length - highValueControlEntries.length);
|
|
165
|
-
const origin = getSnapshotOrigin(data);
|
|
166
|
-
const lines = [
|
|
167
|
-
`Origin: ${origin}`,
|
|
168
|
-
`Refs: ${refEntries.length}`,
|
|
169
|
-
...(roleCountsText ? [`Top roles: ${roleCountsText}`] : []),
|
|
170
|
-
"",
|
|
171
|
-
"Compact snapshot view.",
|
|
172
|
-
"Viewport note: compact snapshots are DOM/signal-prioritized, not guaranteed to start with the currently scrolled viewport; use the full redacted snapshot, a screenshot, or listed high-value refs when viewport context matters.",
|
|
173
|
-
];
|
|
174
|
-
if (fallbackPreview) {
|
|
175
|
-
lines.push("", "Compact outline:", ...(fallbackPreview.lines.length > 0 ? fallbackPreview.lines : ["(no interactive elements)"]));
|
|
176
|
-
if (fallbackPreview.omittedCount > 0) {
|
|
177
|
-
lines.push(`- ... (${fallbackPreview.omittedCount} additional snapshot lines omitted; ${fullOutputPath ? `full output path: ${fullOutputPath}` : "the full redacted snapshot was omitted"})`);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
else {
|
|
181
|
-
lines.push("", "Primary content:", ...(primaryPreview?.lines ?? ["(no interactive elements)"]));
|
|
182
|
-
if ((primaryPreview?.omittedCount ?? 0) > 0) {
|
|
183
|
-
lines.push(`- ... (${primaryPreview?.omittedCount} more lines in this section)`);
|
|
184
|
-
}
|
|
185
|
-
if (additionalPreviews.length > 0) {
|
|
186
|
-
lines.push("", "Additional sections:");
|
|
187
|
-
additionalPreviews.forEach(({ preview }, index) => {
|
|
188
|
-
if (index > 0)
|
|
189
|
-
lines.push("");
|
|
190
|
-
lines.push(...preview.lines);
|
|
191
|
-
if (preview.omittedCount > 0) {
|
|
192
|
-
lines.push(`- ... (${preview.omittedCount} more lines in this section)`);
|
|
193
|
-
}
|
|
194
|
-
});
|
|
195
|
-
if (omittedAdditionalSectionCount > 0) {
|
|
196
|
-
lines.push(`- ... (${omittedAdditionalSectionCount} more sections omitted)`);
|
|
197
|
-
}
|
|
198
|
-
}
|
|
19
|
+
return { spillErrorText: error instanceof Error ? error.message : stringifyUnknown(error) };
|
|
199
20
|
}
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
lines.push("", "Omitted high-value controls:", ...visibleHighValueControlEntries.map(formatCompactRef));
|
|
209
|
-
if (omittedHighValueControls > 0) {
|
|
210
|
-
lines.push(`- ... (${omittedHighValueControls} additional high-value controls omitted)`);
|
|
211
|
-
}
|
|
21
|
+
}
|
|
22
|
+
export async function buildSnapshotPresentation(data, persistentArtifactStore, artifactManifest) {
|
|
23
|
+
const summary = formatSnapshotSummary(data);
|
|
24
|
+
const rawText = formatRawSnapshotText(data);
|
|
25
|
+
// Native partials are patches, not accessibility trees; large-output owns oversized patches.
|
|
26
|
+
if ((isRecord(data.snapshot) && data.snapshot.kind !== "full") ||
|
|
27
|
+
!shouldCompactSnapshot(rawText, data)) {
|
|
28
|
+
return { content: [{ type: "text", text: rawText }], data, summary };
|
|
212
29
|
}
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
: `Full redacted snapshot unavailable: ${spillErrorText ?? "temp spill file could not be created."}`);
|
|
30
|
+
const { spill, fullOutputPath, spillErrorText } = await getSnapshotSpill(data, persistentArtifactStore);
|
|
31
|
+
const compact = buildCompactSnapshotView(data, fullOutputPath, spillErrorText);
|
|
216
32
|
const manifestFields = applySnapshotArtifactManifest({
|
|
217
33
|
baseManifest: artifactManifest,
|
|
218
34
|
command: "snapshot",
|
|
219
35
|
fullOutputPath,
|
|
220
36
|
spill,
|
|
221
37
|
});
|
|
222
|
-
|
|
223
|
-
|
|
38
|
+
const notice = manifestFields.artifactRetentionSummary;
|
|
39
|
+
const text = compact.content.at(0);
|
|
40
|
+
if (notice !== undefined && notice.length > 0 && text?.type === "text") {
|
|
41
|
+
compact.content[0] = { type: "text", text: `${text.text}\n\n${notice}` };
|
|
224
42
|
}
|
|
225
|
-
return {
|
|
226
|
-
...manifestFields,
|
|
227
|
-
content: [{ type: "text", text: lines.join("\n") }],
|
|
228
|
-
data: {
|
|
229
|
-
compacted: true,
|
|
230
|
-
fullOutputPath,
|
|
231
|
-
origin,
|
|
232
|
-
previewMode: fallbackPreview ? "outline" : "structured",
|
|
233
|
-
viewportOrdering: "dom-signal-prioritized",
|
|
234
|
-
spillError: spillErrorText,
|
|
235
|
-
previewRefIds: [...previewRefIds],
|
|
236
|
-
highValueControlRefIds: visibleHighValueControlEntries.map((entry) => entry.id),
|
|
237
|
-
additionalSectionsOmitted: omittedAdditionalSectionCount,
|
|
238
|
-
previewSections: [
|
|
239
|
-
...(primarySegment
|
|
240
|
-
? [
|
|
241
|
-
{
|
|
242
|
-
linesShown: primaryPreview?.lines.length ?? 0,
|
|
243
|
-
omittedLines: primaryPreview?.omittedCount ?? 0,
|
|
244
|
-
role: primarySegment.root.role,
|
|
245
|
-
title: primarySegment.root.name,
|
|
246
|
-
},
|
|
247
|
-
]
|
|
248
|
-
: []),
|
|
249
|
-
...additionalPreviews.map(({ preview, segment }) => ({
|
|
250
|
-
linesShown: preview.lines.length,
|
|
251
|
-
omittedLines: preview.omittedCount,
|
|
252
|
-
role: segment.root.role,
|
|
253
|
-
title: segment.root.name,
|
|
254
|
-
})),
|
|
255
|
-
],
|
|
256
|
-
refCount: refEntries.length,
|
|
257
|
-
roleCounts,
|
|
258
|
-
snapshotLineCount: countLines(snapshot),
|
|
259
|
-
structuredPreviewUsed: !fallbackPreview,
|
|
260
|
-
},
|
|
261
|
-
fullOutputPath,
|
|
262
|
-
summary: `${summary} (compact)`,
|
|
263
|
-
};
|
|
43
|
+
return { ...manifestFields, ...compact, fullOutputPath, summary: `${summary} (compact)` };
|
|
264
44
|
}
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
export function stringifyUnknown(value) {
|
|
2
|
-
if (typeof value === "string")
|
|
2
|
+
if (typeof value === "string") {
|
|
3
3
|
return value;
|
|
4
|
-
|
|
4
|
+
}
|
|
5
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
5
6
|
return String(value);
|
|
6
|
-
|
|
7
|
+
}
|
|
8
|
+
if (value === null || value === undefined) {
|
|
7
9
|
return "";
|
|
10
|
+
}
|
|
8
11
|
try {
|
|
9
|
-
|
|
12
|
+
const serialized = JSON.stringify(value, null, 2);
|
|
13
|
+
return typeof serialized === "string" ? serialized : "";
|
|
10
14
|
}
|
|
11
15
|
catch {
|
|
16
|
+
return stringifyFallback(value);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function stringifyFallback(value) {
|
|
20
|
+
if (typeof value === "bigint" || typeof value === "symbol" || typeof value === "function") {
|
|
12
21
|
return String(value);
|
|
13
22
|
}
|
|
23
|
+
return Object.prototype.toString.call(value);
|
|
14
24
|
}
|
|
15
25
|
export function countLines(text) {
|
|
16
26
|
return text.length === 0 ? 0 : text.split("\n").length;
|
|
@@ -19,8 +29,9 @@ export function normalizeWhitespace(text) {
|
|
|
19
29
|
return text.replace(/\s+/g, " ").trim();
|
|
20
30
|
}
|
|
21
31
|
export function truncateText(text, maxChars) {
|
|
22
|
-
if (text.length <= maxChars)
|
|
32
|
+
if (text.length <= maxChars) {
|
|
23
33
|
return text;
|
|
34
|
+
}
|
|
24
35
|
return `${text.slice(0, Math.max(1, maxChars - 1))}…`;
|
|
25
36
|
}
|
|
26
37
|
export function compareRefIds(left, right) {
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { parseArgvDescriptor } from "./argv-descriptor.js";
|
|
2
|
+
import { GLOBAL_BOOLEAN_FLAGS_WITH_OPTIONAL_VALUES, GLOBAL_VALUE_FLAGS_ALLOWING_DASH_VALUE, PREVALIDATED_VALUE_FLAGS, stripUpstreamGlobalFlags, } from "./argv-grammar.js";
|
|
3
|
+
import { isOpenNavigationCommand } from "./command-taxonomy.js";
|
|
4
|
+
import { TARGET_AGENT_BROWSER_VERSION } from "./upstream-version.js";
|
|
5
|
+
const INSPECTION_FLAGS = new Set(["--help", "-h", "--version", "-V"]);
|
|
6
|
+
const SHELL_OPERATOR_TOKENS = new Set(["&&", "||", "|", ";", ">", ">>", "<"]);
|
|
7
|
+
export function isPlainTextInspectionArgs(args) {
|
|
8
|
+
return args.some((token) => INSPECTION_FLAGS.has(token));
|
|
9
|
+
}
|
|
10
|
+
function getSingleKeyCommandValidationError(args) {
|
|
11
|
+
const { commandInfo, upstreamCommandTokens: tokens } = parseArgvDescriptor(args);
|
|
12
|
+
const command = commandInfo.command;
|
|
13
|
+
if (!["press", "key", "keydown", "keyup"].includes(command ?? "") || tokens.length === 2) {
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const label = command === "key" ? "key/press" : command;
|
|
17
|
+
return `agent-browser ${label ?? ""} accepts exactly one key argument. Do not pass a selector or ref to ${label ?? ""}; focus or click the target first, then run ${command ?? ""} <key> (for example: focus @e1, then press Enter).`;
|
|
18
|
+
}
|
|
19
|
+
function getBareMcpValidationError(args) {
|
|
20
|
+
const { commandInfo, upstreamCommandTokens: tokens } = parseArgvDescriptor(args);
|
|
21
|
+
if (commandInfo.command !== "mcp" || tokens.includes("--help") || tokens.includes("-h")) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
return "agent-browser mcp starts a stdio MCP server for external MCP clients, not a one-shot native agent_browser tool workflow. Use the native agent_browser tool modes directly, or configure an MCP client to launch `agent-browser mcp`. Use `mcp --help` for help.";
|
|
25
|
+
}
|
|
26
|
+
function getUnsupportedInlineWaitDownloadError(args) {
|
|
27
|
+
const descriptor = parseArgvDescriptor(args);
|
|
28
|
+
if (descriptor.commandInfo.command !== "wait" ||
|
|
29
|
+
!descriptor.upstreamCommandTokens.some((token) => token.startsWith("--download="))) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
return `agent-browser ${TARGET_AGENT_BROWSER_VERSION} does not support \`wait --download=<path>\`. Pass the optional path as a separate argument: \`wait --download <path>\` (or \`wait -d <path>\`).`;
|
|
33
|
+
}
|
|
34
|
+
function getBareNoSandboxValidationError(args, batchStep) {
|
|
35
|
+
// Native batch rows skip global parsing; --args is effective only on the outer CLI call.
|
|
36
|
+
const tokens = batchStep ? args : stripUpstreamGlobalFlags(args);
|
|
37
|
+
const command = tokens[0];
|
|
38
|
+
const leading = command === "--no-sandbox";
|
|
39
|
+
if (!leading &&
|
|
40
|
+
(!isOpenNavigationCommand(command) || !tokens.slice(1).includes("--no-sandbox"))) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
const explanation = leading
|
|
44
|
+
? "`--no-sandbox` is not an agent-browser command."
|
|
45
|
+
: `\`--no-sandbox\` is ignored as an option by \`${command}\`.`;
|
|
46
|
+
return `${explanation} It is a Chromium launch argument. Put it in top-level \`--args\` and start a fresh session: { args: ["--args", "--no-sandbox", "open", "https://example.com"], sessionMode: "fresh" }. For batch, put --args before batch, not inside a step.`;
|
|
47
|
+
}
|
|
48
|
+
function getForbiddenToolTokenError(args) {
|
|
49
|
+
const shellOperator = args.find((token) => SHELL_OPERATOR_TOKENS.has(token));
|
|
50
|
+
if (shellOperator !== undefined) {
|
|
51
|
+
return `Do not pass shell operators like \`${shellOperator}\`. Pass exact agent-browser CLI arguments only.`;
|
|
52
|
+
}
|
|
53
|
+
if (args.some((token) => token === "--session-mode" || token.startsWith("--session-mode="))) {
|
|
54
|
+
return 'Do not pass `--session-mode` in args. Use the top-level agent_browser `sessionMode` field instead, for example { args: ["--profile", "Default", "open", "https://example.com"], sessionMode: "fresh" }.';
|
|
55
|
+
}
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
export function validateToolArgs(args, options = {}) {
|
|
59
|
+
if (args.length === 0) {
|
|
60
|
+
return "`args` must contain at least one agent-browser command token.";
|
|
61
|
+
}
|
|
62
|
+
const forbidden = getForbiddenToolTokenError(args);
|
|
63
|
+
if (forbidden !== undefined) {
|
|
64
|
+
return forbidden;
|
|
65
|
+
}
|
|
66
|
+
return getNativeCommandShapeError(args, options.batchStep === true);
|
|
67
|
+
}
|
|
68
|
+
function getNativeCommandShapeError(args, batchStep) {
|
|
69
|
+
const inspection = !batchStep && isPlainTextInspectionArgs(args);
|
|
70
|
+
const invalidValueFlag = inspection ? undefined : getInvalidValueFlagDetails(args, !batchStep);
|
|
71
|
+
if (invalidValueFlag?.reason === "unsupported-assignment") {
|
|
72
|
+
return formatInvalidValueFlagError(invalidValueFlag, batchStep);
|
|
73
|
+
}
|
|
74
|
+
return ((inspection ? undefined : getBareNoSandboxValidationError(args, batchStep)) ??
|
|
75
|
+
getBareMcpValidationError(args) ??
|
|
76
|
+
getSingleKeyCommandValidationError(args) ??
|
|
77
|
+
getUnsupportedInlineWaitDownloadError(args));
|
|
78
|
+
}
|
|
79
|
+
function unsupportedAssignment(token, flag, allowRestoreAssignment) {
|
|
80
|
+
return (token.includes("=") &&
|
|
81
|
+
(PREVALIDATED_VALUE_FLAGS.has(flag) ||
|
|
82
|
+
GLOBAL_BOOLEAN_FLAGS_WITH_OPTIONAL_VALUES.has(flag) ||
|
|
83
|
+
(!allowRestoreAssignment && flag === "--restore")));
|
|
84
|
+
}
|
|
85
|
+
function valueFlagProblem(flag, receivedToken) {
|
|
86
|
+
if (receivedToken === undefined || (flag === "--args" && receivedToken.length === 0)) {
|
|
87
|
+
return "missing-value";
|
|
88
|
+
}
|
|
89
|
+
if (receivedToken.startsWith("-") && !GLOBAL_VALUE_FLAGS_ALLOWING_DASH_VALUE.has(flag)) {
|
|
90
|
+
return "unexpected-flag";
|
|
91
|
+
}
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
export function getInvalidValueFlagDetails(args, allowRestoreAssignment = true) {
|
|
95
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
96
|
+
const token = args[index];
|
|
97
|
+
if (!token.startsWith("-")) {
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
const flag = token.split("=", 1)[0] ?? token;
|
|
101
|
+
if (unsupportedAssignment(token, flag, allowRestoreAssignment)) {
|
|
102
|
+
return { flag, index, reason: "unsupported-assignment" };
|
|
103
|
+
}
|
|
104
|
+
if (!PREVALIDATED_VALUE_FLAGS.has(flag)) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const receivedToken = args.at(index + 1);
|
|
108
|
+
const reason = valueFlagProblem(flag, receivedToken);
|
|
109
|
+
if (reason !== undefined) {
|
|
110
|
+
return reason === "unexpected-flag"
|
|
111
|
+
? { flag, index, reason, receivedToken }
|
|
112
|
+
: { flag, index, reason };
|
|
113
|
+
}
|
|
114
|
+
index += 1;
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
export function formatInvalidValueFlagError(details, batchStep = false) {
|
|
119
|
+
if (details.reason === "unsupported-assignment") {
|
|
120
|
+
if (batchStep) {
|
|
121
|
+
return details.flag === "--restore"
|
|
122
|
+
? "Global `--restore=<key>` belongs before `batch` in top-level args, not inside a batch step."
|
|
123
|
+
: `Global \`${details.flag}=<value>\` is not supported inside a batch step. Move \`${details.flag}\` and its value before \`batch\` as separate top-level args.`;
|
|
124
|
+
}
|
|
125
|
+
return `agent-browser ${TARGET_AGENT_BROWSER_VERSION} does not support \`${details.flag}=<value>\`. Pass \`${details.flag}\` and its value as separate arguments.`;
|
|
126
|
+
}
|
|
127
|
+
if (details.reason === "unexpected-flag" &&
|
|
128
|
+
details.receivedToken !== undefined &&
|
|
129
|
+
details.receivedToken.length > 0) {
|
|
130
|
+
return `Flag \`${details.flag}\` requires a value, but received \`${details.receivedToken}\` instead. Pass a non-flag value immediately after \`${details.flag}\`.`;
|
|
131
|
+
}
|
|
132
|
+
return `Flag \`${details.flag}\` requires a value immediately after it. Pass a non-flag token like \`${details.flag} demo\`.`;
|
|
133
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { getBooleanFlagValue, isUpstreamEnvFlagEnabled, scanUpstreamGlobalFlagOccurrences, } from "./argv-grammar.js";
|
|
2
|
+
import { isOpenNavigationCommand } from "./command-taxonomy.js";
|
|
3
|
+
import { getAgentBrowserProcessEnvironment } from "./process-environment.js";
|
|
4
|
+
const OPENAI_HOSTS = new Set(["chat.com", "chat.openai.com", "chatgpt.com"]);
|
|
5
|
+
const DEFAULT_USER_AGENT_BY_PLATFORM = {
|
|
6
|
+
darwin: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
|
|
7
|
+
linux: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
|
|
8
|
+
win32: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36",
|
|
9
|
+
};
|
|
10
|
+
const FALLBACK_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/146.0.0.0 Safari/537.36";
|
|
11
|
+
export function getDefaultHeadlessCompatUserAgent(platform = process.platform) {
|
|
12
|
+
return DEFAULT_USER_AGENT_BY_PLATFORM[platform] ?? FALLBACK_USER_AGENT;
|
|
13
|
+
}
|
|
14
|
+
function hasLaunchOverride(args, env) {
|
|
15
|
+
const flags = ["--user-agent", "--args", "--cdp", "--provider", "-p"];
|
|
16
|
+
return (flags.some((flag) => args.some((token) => token === flag || token.startsWith(`${flag}=`))) ||
|
|
17
|
+
[
|
|
18
|
+
env.AGENT_BROWSER_SESSION,
|
|
19
|
+
env.AGENT_BROWSER_USER_AGENT,
|
|
20
|
+
env.AGENT_BROWSER_ARGS,
|
|
21
|
+
env.AGENT_BROWSER_CDP,
|
|
22
|
+
env.AGENT_BROWSER_PROVIDER,
|
|
23
|
+
].some((value) => value !== undefined));
|
|
24
|
+
}
|
|
25
|
+
function hasInteractiveLaunchMode(args, env) {
|
|
26
|
+
const modes = [
|
|
27
|
+
["--headed", env.AGENT_BROWSER_HEADED],
|
|
28
|
+
["--auto-connect", env.AGENT_BROWSER_AUTO_CONNECT],
|
|
29
|
+
];
|
|
30
|
+
return modes.some(([flag, value]) => getBooleanFlagValue(args, flag) ?? isUpstreamEnvFlagEnabled(value));
|
|
31
|
+
}
|
|
32
|
+
export function canUseHeadlessCompatibilityUserAgent(args, env = getAgentBrowserProcessEnvironment()) {
|
|
33
|
+
if (hasLaunchOverride(args, env)) {
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
if (hasInteractiveLaunchMode(args, env)) {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
const engine = scanUpstreamGlobalFlagOccurrences(args, "--engine").at(-1)?.value ?? env.AGENT_BROWSER_ENGINE;
|
|
40
|
+
return (engine ?? "chrome") === "chrome" || engine === "";
|
|
41
|
+
}
|
|
42
|
+
function parseNavigationUrl(url) {
|
|
43
|
+
if (url === undefined || url.length === 0) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
return new URL(url);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
try {
|
|
51
|
+
return new URL(`https://${url}`);
|
|
52
|
+
}
|
|
53
|
+
catch {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
export function getCompatibilityWorkaround(args, commandInfo) {
|
|
59
|
+
if (!isOpenNavigationCommand(commandInfo.command) ||
|
|
60
|
+
!canUseHeadlessCompatibilityUserAgent(args)) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const target = parseNavigationUrl(commandInfo.subcommand);
|
|
64
|
+
if (!target || !["http:", "https:"].includes(target.protocol)) {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const hostname = target.hostname.toLowerCase();
|
|
68
|
+
if (hostname === "dash.cloudflare.com") {
|
|
69
|
+
return {
|
|
70
|
+
id: "cloudflare-headless-user-agent",
|
|
71
|
+
reason: "Cloudflare Dashboard challenges the default headless Chrome user agent; inject a normal Chrome user agent so authenticated headless browsing reaches the dashboard instead of Turnstile.",
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (!OPENAI_HOSTS.has(hostname)) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
id: "chatgpt-headless-user-agent",
|
|
79
|
+
reason: "OpenAI web properties currently challenge the default headless Chrome user agent; inject a normal Chrome user agent to preserve the default headless workflow without requiring headed mode or auto-connect.",
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|