pi-agent-browser-native 0.9.3 → 0.9.5
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 +106 -5
- package/README.md +58 -791
- package/dist/extensions/agent-browser/index.js +43101 -2031
- 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 +112 -51
- 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 -82
- 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 +231 -0
- package/dist/extensions/agent-browser/lib/config.js +20 -8
- package/dist/extensions/agent-browser/lib/electron/cdp.js +20 -8
- package/dist/extensions/agent-browser/lib/electron/cleanup.js +128 -83
- 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 +90 -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 +261 -355
- 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/fs-utils.js +1 -9
- package/dist/extensions/agent-browser/lib/input-modes/electron.js +162 -121
- package/dist/extensions/agent-browser/lib/input-modes/job.js +123 -317
- package/dist/extensions/agent-browser/lib/input-modes/lookup-network-evidence.js +116 -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 +58 -412
- package/dist/extensions/agent-browser/lib/input-modes/params.js +86 -40
- 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 +43 -9
- package/dist/extensions/agent-browser/lib/orchestration/batch-stdin.js +106 -59
- 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 +164 -60
- 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 +203 -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 +187 -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 +199 -154
- 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 -205
- 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 +147 -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 -1123
- 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 -968
- 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 +212 -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 +169 -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 -765
- 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 +93 -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 -821
- 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 +68 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-data.js +169 -0
- package/dist/extensions/agent-browser/lib/orchestration/electron-host/probe-presentation.js +182 -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 +167 -0
- package/dist/extensions/agent-browser/lib/orchestration/execution-queue.js +22 -10
- 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 -157
- package/dist/extensions/agent-browser/lib/orchestration/operation-paths.js +124 -58
- package/dist/extensions/agent-browser/lib/orchestration/output-file.js +197 -99
- 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 +55 -246
- package/dist/extensions/agent-browser/lib/parsing.js +13 -4
- package/dist/extensions/agent-browser/lib/pi-tool-rendering.js +133 -68
- package/dist/extensions/agent-browser/lib/playbook.js +16 -12
- package/dist/extensions/agent-browser/lib/process-child.js +284 -0
- package/dist/extensions/agent-browser/lib/process-environment.js +13 -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 +145 -536
- 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 +131 -68
- 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 -13
- 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 +90 -67
- 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 -555
- 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 -1052
- 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 +116 -240
- package/dist/extensions/agent-browser/lib/results/presentation/semantic-action.js +35 -21
- package/dist/extensions/agent-browser/lib/results/presentation/skills.js +109 -73
- package/dist/extensions/agent-browser/lib/results/presentation/source.js +109 -0
- package/dist/extensions/agent-browser/lib/results/presentation.js +17 -261
- 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 +119 -119
- 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 -1041
- 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 +178 -333
- package/dist/extensions/agent-browser/lib/session-page-types.js +1 -0
- package/dist/extensions/agent-browser/lib/temp-artifact-budget.js +81 -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 +211 -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 +193 -0
- package/dist/extensions/agent-browser/lib/web-search-request.js +102 -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 +124 -614
- 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 +19 -6
- package/docs/CODE_QUALITY.md +267 -0
- package/docs/COMMAND_REFERENCE.md +272 -241
- package/docs/ELECTRON.md +77 -46
- package/docs/REFERENCE.md +869 -0
- package/docs/RELEASE.md +25 -22
- package/docs/REQUIREMENTS.md +2 -1
- package/docs/SUPPORT_MATRIX.md +81 -79
- package/docs/TOOL_CONTRACT.md +158 -125
- package/docs/platform-smoke.md +8 -8
- package/package.json +144 -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 +235 -132
- package/scripts/convert-browser-session.mjs +30 -9
- package/scripts/doctor-sources.mjs +195 -0
- package/scripts/doctor.mjs +94 -249
- 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 +132 -0
- package/scripts/platform-smoke/linux-image/Dockerfile +8 -2
- package/scripts/platform-smoke/suite-checks.mjs +98 -0
- package/scripts/platform-smoke/suite-evidence.mjs +281 -0
- package/scripts/platform-smoke/targets.mjs +154 -472
- package/scripts/platform-smoke.mjs +55 -40
- package/scripts/prepare.mjs +16 -7
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { isOpenNavigationCommand } from "../command-taxonomy.js";
|
|
2
|
+
import { buildInspectOverlayStateAction, buildNextToolAction } from "./next-actions.js";
|
|
3
|
+
import { AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS } from "./recovery-actions.js";
|
|
4
|
+
import { buildMissingArtifactNextActions } from "./artifact-recommendations.js";
|
|
5
|
+
function getExplicitDownloadWaitPath(args) {
|
|
6
|
+
const candidate = args.at(args.indexOf("--download") + 1);
|
|
7
|
+
return candidate !== undefined && candidate.length > 0 && !candidate.startsWith("-")
|
|
8
|
+
? candidate
|
|
9
|
+
: undefined;
|
|
10
|
+
}
|
|
11
|
+
function getDownloadRetryPath(args, fallback) {
|
|
12
|
+
if (fallback !== undefined && fallback.length > 0) {
|
|
13
|
+
return fallback;
|
|
14
|
+
}
|
|
15
|
+
if (!args || args.length === 0) {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
if (args.includes("--download")) {
|
|
19
|
+
return getExplicitDownloadWaitPath(args);
|
|
20
|
+
}
|
|
21
|
+
const downloadCommandIndex = args.indexOf("download");
|
|
22
|
+
return downloadCommandIndex >= 0 && args.length > downloadCommandIndex + 2
|
|
23
|
+
? args.at(-1)
|
|
24
|
+
: undefined;
|
|
25
|
+
}
|
|
26
|
+
function buildConfirmationActions(id) {
|
|
27
|
+
if (id === undefined || id.length === 0) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
return [
|
|
31
|
+
buildNextToolAction({
|
|
32
|
+
args: ["confirm", id],
|
|
33
|
+
id: "approve-confirmation",
|
|
34
|
+
reason: "Approve the pending upstream confirmation when the requested action is safe.",
|
|
35
|
+
safety: "Only confirm after reviewing the guarded action shown in the result.",
|
|
36
|
+
}),
|
|
37
|
+
buildNextToolAction({
|
|
38
|
+
args: ["deny", id],
|
|
39
|
+
id: "deny-confirmation",
|
|
40
|
+
reason: "Deny the pending upstream confirmation when the guarded action is unsafe or unintended.",
|
|
41
|
+
}),
|
|
42
|
+
];
|
|
43
|
+
}
|
|
44
|
+
function buildDownloadFailureActions(options) {
|
|
45
|
+
const path = getDownloadRetryPath(options.args, options.savedFilePath);
|
|
46
|
+
return [
|
|
47
|
+
buildNextToolAction({
|
|
48
|
+
args: path !== undefined && path.length > 0
|
|
49
|
+
? ["wait", "--download", path]
|
|
50
|
+
: ["wait", "--download"],
|
|
51
|
+
id: "wait-for-download",
|
|
52
|
+
reason: "Wait for the browser download and let the wrapper verify saved-file metadata.",
|
|
53
|
+
safety: "Use an explicit wait timeout; if you set top-level timeoutMs, keep it above the wait duration plus a small grace window.",
|
|
54
|
+
}),
|
|
55
|
+
];
|
|
56
|
+
}
|
|
57
|
+
function getTimeoutInspectionReason(command, textAssertion) {
|
|
58
|
+
if (textAssertion) {
|
|
59
|
+
return "Inspect the current page after the text assertion failed before concluding the expected text is absent.";
|
|
60
|
+
}
|
|
61
|
+
return command === "wait"
|
|
62
|
+
? "Inspect the current page after the wait condition timed out before retrying with a different selector or timeout."
|
|
63
|
+
: "Inspect the current page after the timed-out browser operation.";
|
|
64
|
+
}
|
|
65
|
+
function buildTimeoutActions(options) {
|
|
66
|
+
if (options.command === "session" && options.subcommand === "info") {
|
|
67
|
+
return [
|
|
68
|
+
buildNextToolAction({
|
|
69
|
+
args: ["session", "info"],
|
|
70
|
+
id: "retry-session-info",
|
|
71
|
+
reason: "Retry the same session status check without opening a browser or inspecting its page.",
|
|
72
|
+
}),
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
const textAssertion = options.command === "wait" && options.args?.includes("--text") === true;
|
|
76
|
+
const urlAssertion = options.command === "wait" && options.args?.includes("--url") === true;
|
|
77
|
+
const actions = [
|
|
78
|
+
buildNextToolAction({
|
|
79
|
+
args: ["snapshot", "-i"],
|
|
80
|
+
id: textAssertion ? "inspect-after-text-assertion-failure" : "inspect-after-timeout",
|
|
81
|
+
reason: getTimeoutInspectionReason(options.command, textAssertion),
|
|
82
|
+
safety: textAssertion
|
|
83
|
+
? "Read-only snapshot; use current refs or visible text from this page before retrying the assertion."
|
|
84
|
+
: "Read-only snapshot; do not assume the timed-out interaction completed.",
|
|
85
|
+
}),
|
|
86
|
+
];
|
|
87
|
+
if (urlAssertion) {
|
|
88
|
+
actions.push(buildNextToolAction({
|
|
89
|
+
args: ["open", "about:blank"],
|
|
90
|
+
id: "fresh-session-after-url-wait-timeout",
|
|
91
|
+
reason: "If a preceding click or form submit reported success but the page never navigated, upstream click dispatch may have silently missed (observed with agent-browser 0.34 after many spaced commands); replace about:blank with the target URL and replay the flow as one batch in a fresh session instead of retrying the wait.",
|
|
92
|
+
safety: "Abandons the current browser session; capture page evidence with the inspect action first, and only abandon when the wait target is not simply wrong or slow.",
|
|
93
|
+
sessionMode: "fresh",
|
|
94
|
+
}));
|
|
95
|
+
}
|
|
96
|
+
return actions;
|
|
97
|
+
}
|
|
98
|
+
function buildUpstreamFailureActions(options) {
|
|
99
|
+
if (options.overlayBlockedClick === true) {
|
|
100
|
+
return [buildInspectOverlayStateAction(options.sessionName)];
|
|
101
|
+
}
|
|
102
|
+
return isOpenNavigationCommand(options.command)
|
|
103
|
+
? [
|
|
104
|
+
buildNextToolAction({
|
|
105
|
+
args: ["get", "url"],
|
|
106
|
+
id: "inspect-page-after-navigation-error",
|
|
107
|
+
reason: "Check which page, if any, remains active after the navigation or network error.",
|
|
108
|
+
safety: "Read-only URL inspection; verify connectivity and the target URL before retrying navigation.",
|
|
109
|
+
}),
|
|
110
|
+
]
|
|
111
|
+
: [];
|
|
112
|
+
}
|
|
113
|
+
function buildTabGoneActions() {
|
|
114
|
+
return [
|
|
115
|
+
buildNextToolAction({
|
|
116
|
+
args: ["tab", "list"],
|
|
117
|
+
id: AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS.tabGoneListTabs,
|
|
118
|
+
reason: "The pinned bound tab is gone; inspect remaining tabs before acting on a neighbor.",
|
|
119
|
+
safety: "Read-only. Prefer a listed tab id, label, or CDP targetId, or open a new tab to rebind.",
|
|
120
|
+
}),
|
|
121
|
+
buildNextToolAction({
|
|
122
|
+
args: ["tab", "new"],
|
|
123
|
+
id: AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS.tabGoneNewTab,
|
|
124
|
+
reason: "Bind a fresh tab after tab_gone instead of continuing on another session's page.",
|
|
125
|
+
safety: "Opens a new tab in this session and rebinds the pin; pass a URL if you know the intended page.",
|
|
126
|
+
}),
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
function buildTabDriftActions(options) {
|
|
130
|
+
if (options.recovery?.kind === "about-blank" || options.recovery?.kind === "tab-drift") {
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
return [
|
|
134
|
+
buildNextToolAction({
|
|
135
|
+
args: ["tab", "list"],
|
|
136
|
+
id: AGENT_BROWSER_RECOVERY_NEXT_ACTION_IDS.genericTabDriftListTabs,
|
|
137
|
+
reason: "Inspect available tabs before selecting the intended target.",
|
|
138
|
+
safety: "Read-only. Retry snapshot only after selecting or confirming the intended stable tab.",
|
|
139
|
+
}),
|
|
140
|
+
];
|
|
141
|
+
}
|
|
142
|
+
export function buildFailureNextActions(options) {
|
|
143
|
+
switch (options.failureCategory) {
|
|
144
|
+
case "artifact-missing":
|
|
145
|
+
return buildMissingArtifactNextActions(options.artifacts);
|
|
146
|
+
case "confirmation-required":
|
|
147
|
+
return buildConfirmationActions(options.confirmationId);
|
|
148
|
+
case "stale-ref":
|
|
149
|
+
case "selector-not-found":
|
|
150
|
+
case "selector-unsupported":
|
|
151
|
+
return [
|
|
152
|
+
buildNextToolAction({
|
|
153
|
+
args: ["snapshot", "-i"],
|
|
154
|
+
id: "refresh-interactive-refs",
|
|
155
|
+
reason: "Get current interactive refs before retrying the element action.",
|
|
156
|
+
safety: "Prefer a current @ref or a stable find locator; do not retry stale refs blindly.",
|
|
157
|
+
}),
|
|
158
|
+
];
|
|
159
|
+
case "download-not-verified":
|
|
160
|
+
return buildDownloadFailureActions(options);
|
|
161
|
+
case "timeout":
|
|
162
|
+
return buildTimeoutActions(options);
|
|
163
|
+
case "upstream-error":
|
|
164
|
+
return buildUpstreamFailureActions(options);
|
|
165
|
+
case "tab-gone":
|
|
166
|
+
return buildTabGoneActions();
|
|
167
|
+
case "tab-drift":
|
|
168
|
+
return buildTabDriftActions(options);
|
|
169
|
+
case "aborted":
|
|
170
|
+
case "cleanup-failed":
|
|
171
|
+
case "missing-binary":
|
|
172
|
+
case "parse-failure":
|
|
173
|
+
case "policy-blocked":
|
|
174
|
+
case "qa-failure":
|
|
175
|
+
case "script-error":
|
|
176
|
+
case "validation-error":
|
|
177
|
+
case undefined:
|
|
178
|
+
return [];
|
|
179
|
+
}
|
|
180
|
+
}
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { isRecord } from "../parsing.js";
|
|
2
|
-
import { redactSensitiveText } from "../runtime.js";
|
|
2
|
+
import { redactSensitiveText } from "../runtime-redaction.js";
|
|
3
3
|
import { getStringRecordField, isApiLikeNetworkRequest } from "./network.js";
|
|
4
4
|
function getArrayField(data, key) {
|
|
5
5
|
const value = data[key];
|
|
6
6
|
return Array.isArray(value) ? value : undefined;
|
|
7
7
|
}
|
|
8
8
|
function networkRoutePatternMatchesUrl(pattern, url) {
|
|
9
|
-
if (pattern === url)
|
|
9
|
+
if (pattern === url) {
|
|
10
10
|
return true;
|
|
11
|
+
}
|
|
11
12
|
if (pattern.includes("*")) {
|
|
12
13
|
const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
|
|
13
14
|
return new RegExp(`^${escaped}$`).test(url);
|
|
@@ -16,77 +17,117 @@ function networkRoutePatternMatchesUrl(pattern, url) {
|
|
|
16
17
|
}
|
|
17
18
|
function getSafeRequestId(item) {
|
|
18
19
|
const requestId = getStringRecordField(item, "requestId") ?? getStringRecordField(item, "id");
|
|
19
|
-
if (
|
|
20
|
+
if (requestId === undefined ||
|
|
21
|
+
requestId.length === 0 ||
|
|
22
|
+
redactSensitiveText(requestId) !== requestId) {
|
|
20
23
|
return undefined;
|
|
24
|
+
}
|
|
21
25
|
return requestId;
|
|
22
26
|
}
|
|
27
|
+
function routedRequestFailed(item, error) {
|
|
28
|
+
return ((typeof item.status === "number" && item.status >= 400) ||
|
|
29
|
+
item.failed === true ||
|
|
30
|
+
error !== undefined);
|
|
31
|
+
}
|
|
23
32
|
function getRouteDiagnosticReason(item, route) {
|
|
24
33
|
const statusMissing = typeof item.status !== "number";
|
|
25
|
-
const error = getStringRecordField(item, "error") ??
|
|
26
|
-
|
|
34
|
+
const error = getStringRecordField(item, "error") ??
|
|
35
|
+
getStringRecordField(item, "failureText") ??
|
|
36
|
+
getStringRecordField(item, "errorText");
|
|
37
|
+
if (error !== undefined &&
|
|
38
|
+
/(?:cors|cross-origin|preflight|access-control-allow-origin)/i.test(error)) {
|
|
27
39
|
return "cors-likely-routed-request";
|
|
28
|
-
|
|
40
|
+
}
|
|
41
|
+
if (statusMissing && isApiLikeNetworkRequest(item)) {
|
|
29
42
|
return "pending-routed-request";
|
|
30
|
-
|
|
43
|
+
}
|
|
44
|
+
if (route.mode !== "abort" && routedRequestFailed(item, error)) {
|
|
31
45
|
return "unfulfilled-routed-request";
|
|
46
|
+
}
|
|
32
47
|
return undefined;
|
|
33
48
|
}
|
|
34
49
|
function getNetworkRouteMode(args) {
|
|
35
|
-
if (args.includes("--abort"))
|
|
50
|
+
if (args.includes("--abort")) {
|
|
36
51
|
return "abort";
|
|
37
|
-
|
|
52
|
+
}
|
|
53
|
+
if (args.includes("--body")) {
|
|
38
54
|
return "body";
|
|
55
|
+
}
|
|
39
56
|
return "handler";
|
|
40
57
|
}
|
|
41
58
|
export function applyNetworkRouteRecords(routes, commandTokens, succeeded) {
|
|
42
|
-
if (!succeeded || commandTokens?.[0] !== "network")
|
|
59
|
+
if (!succeeded || commandTokens?.[0] !== "network") {
|
|
43
60
|
return routes;
|
|
61
|
+
}
|
|
44
62
|
const subcommand = commandTokens[1];
|
|
45
|
-
if (subcommand !== "route" && subcommand !== "unroute")
|
|
63
|
+
if (subcommand !== "route" && subcommand !== "unroute") {
|
|
46
64
|
return routes;
|
|
65
|
+
}
|
|
66
|
+
return updateNetworkRoutes(routes, commandTokens);
|
|
67
|
+
}
|
|
68
|
+
function updateNetworkRoutes(routes, commandTokens) {
|
|
47
69
|
const existing = routes ?? [];
|
|
48
|
-
const pattern = commandTokens
|
|
49
|
-
if (
|
|
50
|
-
return [
|
|
51
|
-
|
|
70
|
+
const pattern = commandTokens.at(2);
|
|
71
|
+
if (commandTokens[1] === "route" && pattern !== undefined && pattern.length > 0) {
|
|
72
|
+
return [
|
|
73
|
+
...existing.filter((route) => route.pattern !== pattern),
|
|
74
|
+
{ mode: getNetworkRouteMode(commandTokens), pattern },
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
if (pattern === undefined || pattern.length === 0) {
|
|
52
78
|
return undefined;
|
|
79
|
+
}
|
|
53
80
|
const next = existing.filter((route) => route.pattern !== pattern);
|
|
54
81
|
return next.length > 0 ? next : undefined;
|
|
55
82
|
}
|
|
83
|
+
function formatNetworkRouteDiagnosticSummary(reason, request, pattern) {
|
|
84
|
+
switch (reason) {
|
|
85
|
+
case "cors-likely-routed-request":
|
|
86
|
+
return `Routed request ${request} looks CORS/preflight-related for route ${pattern}.`;
|
|
87
|
+
case "unfulfilled-routed-request":
|
|
88
|
+
return `Routed request ${request} failed instead of returning the configured route ${pattern}.`;
|
|
89
|
+
case "pending-routed-request":
|
|
90
|
+
return `Routed request ${request} is still pending/no-status for route ${pattern}.`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function buildRoutedRequestDiagnostic(item, routes) {
|
|
94
|
+
if (!isRecord(item)) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const url = getStringRecordField(item, "url");
|
|
98
|
+
if (url === undefined) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
const route = routes.find((candidate) => networkRoutePatternMatchesUrl(candidate.pattern, url));
|
|
102
|
+
if (!route) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
const reason = getRouteDiagnosticReason(item, route);
|
|
106
|
+
if (reason === undefined) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
const requestId = getSafeRequestId(item);
|
|
110
|
+
const requestUrl = redactSensitiveText(url);
|
|
111
|
+
const routePattern = redactSensitiveText(route.pattern);
|
|
112
|
+
return {
|
|
113
|
+
mode: route.mode,
|
|
114
|
+
reason,
|
|
115
|
+
...(requestId !== undefined ? { requestId } : {}),
|
|
116
|
+
requestUrl,
|
|
117
|
+
routePattern,
|
|
118
|
+
summary: formatNetworkRouteDiagnosticSummary(reason, requestId ?? requestUrl, routePattern),
|
|
119
|
+
};
|
|
120
|
+
}
|
|
56
121
|
export function buildNetworkRouteDiagnostics(data, routes) {
|
|
57
|
-
if (!routes || routes.length === 0 || !isRecord(data))
|
|
122
|
+
if (!routes || routes.length === 0 || !isRecord(data)) {
|
|
58
123
|
return undefined;
|
|
124
|
+
}
|
|
59
125
|
const requests = getArrayField(data, "requests");
|
|
60
|
-
if (!requests)
|
|
126
|
+
if (!requests) {
|
|
61
127
|
return undefined;
|
|
62
|
-
const diagnostics = [];
|
|
63
|
-
for (const item of requests) {
|
|
64
|
-
if (!isRecord(item))
|
|
65
|
-
continue;
|
|
66
|
-
const url = getStringRecordField(item, "url");
|
|
67
|
-
if (!url)
|
|
68
|
-
continue;
|
|
69
|
-
const route = routes.find((candidate) => networkRoutePatternMatchesUrl(candidate.pattern, url));
|
|
70
|
-
if (!route)
|
|
71
|
-
continue;
|
|
72
|
-
const reason = getRouteDiagnosticReason(item, route);
|
|
73
|
-
if (!reason)
|
|
74
|
-
continue;
|
|
75
|
-
const requestId = getSafeRequestId(item);
|
|
76
|
-
const requestUrl = redactSensitiveText(url);
|
|
77
|
-
const routePattern = redactSensitiveText(route.pattern);
|
|
78
|
-
diagnostics.push({
|
|
79
|
-
mode: route.mode,
|
|
80
|
-
reason,
|
|
81
|
-
...(requestId ? { requestId } : {}),
|
|
82
|
-
requestUrl,
|
|
83
|
-
routePattern,
|
|
84
|
-
summary: reason === "cors-likely-routed-request"
|
|
85
|
-
? `Routed request ${requestId ?? requestUrl} looks CORS/preflight-related for route ${routePattern}.`
|
|
86
|
-
: reason === "unfulfilled-routed-request"
|
|
87
|
-
? `Routed request ${requestId ?? requestUrl} failed instead of returning the configured route ${routePattern}.`
|
|
88
|
-
: `Routed request ${requestId ?? requestUrl} is still pending/no-status for route ${routePattern}.`,
|
|
89
|
-
});
|
|
90
128
|
}
|
|
129
|
+
const diagnostics = requests
|
|
130
|
+
.map((item) => buildRoutedRequestDiagnostic(item, routes))
|
|
131
|
+
.filter((item) => item !== undefined);
|
|
91
132
|
return diagnostics.length > 0 ? diagnostics.slice(0, 5) : undefined;
|
|
92
133
|
}
|
|
@@ -4,8 +4,9 @@ export function getStringRecordField(value, key) {
|
|
|
4
4
|
return typeof field === "string" && field.trim().length > 0 ? field.trim() : undefined;
|
|
5
5
|
}
|
|
6
6
|
function getNetworkRequestUrlPath(url) {
|
|
7
|
-
if (
|
|
7
|
+
if (url === undefined || url.length === 0) {
|
|
8
8
|
return undefined;
|
|
9
|
+
}
|
|
9
10
|
try {
|
|
10
11
|
return new URL(url).pathname;
|
|
11
12
|
}
|
|
@@ -15,44 +16,66 @@ function getNetworkRequestUrlPath(url) {
|
|
|
15
16
|
}
|
|
16
17
|
}
|
|
17
18
|
function isFailedNetworkRequest(request) {
|
|
18
|
-
return (typeof request.status === "number" && request.status >= 400) ||
|
|
19
|
+
return ((typeof request.status === "number" && request.status >= 400) ||
|
|
20
|
+
request.failed === true ||
|
|
21
|
+
typeof request.error === "string");
|
|
19
22
|
}
|
|
20
23
|
export function isNetworkArtifactNoiseRequest(request) {
|
|
21
24
|
const url = getStringRecordField(request, "url") ?? "";
|
|
22
|
-
const resourceType = (getStringRecordField(request, "resourceType") ??
|
|
25
|
+
const resourceType = (getStringRecordField(request, "resourceType") ??
|
|
26
|
+
getStringRecordField(request, "mimeType") ??
|
|
27
|
+
"").toLowerCase();
|
|
23
28
|
return /^data:image\//i.test(url) || (url.startsWith("data:") && resourceType.includes("image"));
|
|
24
29
|
}
|
|
30
|
+
function isIconResourceType(resourceType) {
|
|
31
|
+
const normalized = resourceType?.toLowerCase() ?? "";
|
|
32
|
+
return (normalized.length === 0 ||
|
|
33
|
+
["image", "img", "other"].includes(normalized) ||
|
|
34
|
+
normalized.startsWith("image/"));
|
|
35
|
+
}
|
|
25
36
|
function isBenignAssetFailure(request, url, resourceType) {
|
|
26
37
|
const path = getNetworkRequestUrlPath(url);
|
|
27
|
-
if (
|
|
38
|
+
if (path === undefined || path.length === 0) {
|
|
28
39
|
return false;
|
|
29
|
-
|
|
30
|
-
return /(?:^|\/)(?:favicon(?:[-.\w]*)?\.(?:ico|png|svg)|apple-touch-icon(?:[-.\w]*)?\.png)$/i.test(path)
|
|
31
|
-
|
|
32
|
-
|
|
40
|
+
}
|
|
41
|
+
return (/(?:^|\/)(?:favicon(?:[-.\w]*)?\.(?:ico|png|svg)|apple-touch-icon(?:[-.\w]*)?\.png)$/i.test(path) &&
|
|
42
|
+
(request.status === 404 || request.failed === true || typeof request.error === "string") &&
|
|
43
|
+
isIconResourceType(resourceType));
|
|
33
44
|
}
|
|
34
45
|
export function isApiLikeNetworkRequest(request) {
|
|
35
46
|
const method = (getStringRecordField(request, "method") ?? "GET").toUpperCase();
|
|
36
47
|
const resourceType = (getStringRecordField(request, "resourceType") ?? "").toLowerCase();
|
|
37
48
|
const mimeType = (getStringRecordField(request, "mimeType") ?? "").toLowerCase();
|
|
38
49
|
const path = getNetworkRequestUrlPath(getStringRecordField(request, "url")) ?? "";
|
|
39
|
-
return resourceType === "fetch" ||
|
|
50
|
+
return (resourceType === "fetch" ||
|
|
51
|
+
resourceType === "xhr" ||
|
|
52
|
+
mimeType.includes("json") ||
|
|
53
|
+
/\/(?:api|graphql|rpc)(?:\/|$)/i.test(path) ||
|
|
54
|
+
!["GET", "HEAD"].includes(method));
|
|
40
55
|
}
|
|
41
56
|
export function classifyNetworkRequestFailure(request) {
|
|
42
|
-
if (!isFailedNetworkRequest(request))
|
|
57
|
+
if (!isFailedNetworkRequest(request)) {
|
|
43
58
|
return undefined;
|
|
59
|
+
}
|
|
44
60
|
const url = getStringRecordField(request, "url");
|
|
45
61
|
const resourceType = getStringRecordField(request, "resourceType") ?? getStringRecordField(request, "mimeType");
|
|
46
62
|
const status = typeof request.status === "number" ? request.status : undefined;
|
|
47
63
|
if (isBenignAssetFailure(request, url, resourceType)) {
|
|
48
64
|
return { impact: "benign", reason: "low-impact browser icon asset", resourceType, status, url };
|
|
49
65
|
}
|
|
50
|
-
return {
|
|
66
|
+
return {
|
|
67
|
+
impact: "actionable",
|
|
68
|
+
reason: "document, script, API, or non-benign request failure",
|
|
69
|
+
resourceType,
|
|
70
|
+
status,
|
|
71
|
+
url,
|
|
72
|
+
};
|
|
51
73
|
}
|
|
52
74
|
export function summarizeNetworkFailures(requests) {
|
|
53
75
|
const failures = requests.flatMap((request) => {
|
|
54
|
-
if (!isRecord(request) || isNetworkArtifactNoiseRequest(request))
|
|
76
|
+
if (!isRecord(request) || isNetworkArtifactNoiseRequest(request)) {
|
|
55
77
|
return [];
|
|
78
|
+
}
|
|
56
79
|
const classification = classifyNetworkRequestFailure(request);
|
|
57
80
|
return classification ? [classification] : [];
|
|
58
81
|
});
|
|
@@ -1,33 +1,54 @@
|
|
|
1
1
|
export function withOptionalNamespaceArgs(namespace, args) {
|
|
2
|
-
return namespace !== undefined && args[0] !== "--namespace"
|
|
2
|
+
return namespace !== undefined && args[0] !== "--namespace"
|
|
3
|
+
? ["--namespace", namespace, ...args]
|
|
4
|
+
: args;
|
|
3
5
|
}
|
|
4
6
|
export function withOptionalSessionArgs(sessionName, args) {
|
|
5
|
-
if (
|
|
7
|
+
if (sessionName === undefined ||
|
|
8
|
+
sessionName.length === 0 ||
|
|
9
|
+
args[0] === "--session" ||
|
|
10
|
+
(args[0] === "--namespace" && args[2] === "--session")) {
|
|
6
11
|
return args;
|
|
7
|
-
|
|
12
|
+
}
|
|
13
|
+
if (args[0] === "--namespace" && args.length >= 2) {
|
|
8
14
|
return [args[0], args[1], "--session", sessionName, ...args.slice(2)];
|
|
15
|
+
}
|
|
9
16
|
return ["--session", sessionName, ...args];
|
|
10
17
|
}
|
|
11
18
|
export function applyNamespaceToNextActions(actions, namespace) {
|
|
12
|
-
if (namespace === undefined || !actions)
|
|
19
|
+
if (namespace === undefined || !actions) {
|
|
13
20
|
return actions;
|
|
21
|
+
}
|
|
14
22
|
return actions.map((action) => {
|
|
15
23
|
const args = action.params?.args;
|
|
16
|
-
if (args)
|
|
17
|
-
return {
|
|
18
|
-
|
|
24
|
+
if (args) {
|
|
25
|
+
return {
|
|
26
|
+
...action,
|
|
27
|
+
params: { ...action.params, args: withOptionalNamespaceArgs(namespace, args) },
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return action.tool === "agent_browser_network_source"
|
|
31
|
+
? { ...action, params: { ...action.params, namespace } }
|
|
32
|
+
: action;
|
|
19
33
|
});
|
|
20
34
|
}
|
|
21
35
|
export function applySessionToNextActions(actions, sessionName) {
|
|
22
|
-
if (
|
|
36
|
+
if (sessionName === undefined || sessionName.length === 0 || !actions) {
|
|
23
37
|
return actions;
|
|
38
|
+
}
|
|
24
39
|
return actions.map((action) => {
|
|
25
40
|
// Fresh-session actions deliberately target a new session; the planner ignores sessionMode when an
|
|
26
41
|
// explicit --session is present, so prefixing one here would silently downgrade them to reuse.
|
|
27
|
-
if (action.params?.sessionMode === "fresh")
|
|
42
|
+
if (action.params?.sessionMode === "fresh") {
|
|
28
43
|
return action;
|
|
44
|
+
}
|
|
29
45
|
const args = action.params?.args;
|
|
30
|
-
return args
|
|
46
|
+
return args
|
|
47
|
+
? {
|
|
48
|
+
...action,
|
|
49
|
+
params: { ...action.params, args: withOptionalSessionArgs(sessionName, args) },
|
|
50
|
+
}
|
|
51
|
+
: action;
|
|
31
52
|
});
|
|
32
53
|
}
|
|
33
54
|
export function buildNextToolAction(options) {
|
|
@@ -35,11 +56,13 @@ export function buildNextToolAction(options) {
|
|
|
35
56
|
id: options.id,
|
|
36
57
|
params: {
|
|
37
58
|
args: options.args,
|
|
38
|
-
...(options.sessionMode ? { sessionMode: options.sessionMode } : {}),
|
|
39
|
-
...(options.stdin ? { stdin: options.stdin } : {}),
|
|
59
|
+
...(options.sessionMode !== undefined ? { sessionMode: options.sessionMode } : {}),
|
|
60
|
+
...(options.stdin !== undefined && options.stdin.length > 0 ? { stdin: options.stdin } : {}),
|
|
40
61
|
},
|
|
41
62
|
reason: options.reason,
|
|
42
|
-
...(options.safety
|
|
63
|
+
...(options.safety !== undefined && options.safety.length > 0
|
|
64
|
+
? { safety: options.safety }
|
|
65
|
+
: {}),
|
|
43
66
|
tool: "agent_browser",
|
|
44
67
|
};
|
|
45
68
|
}
|
|
@@ -52,12 +75,14 @@ export function buildInspectOverlayStateAction(sessionName) {
|
|
|
52
75
|
});
|
|
53
76
|
}
|
|
54
77
|
export function appendUniqueAgentBrowserNextActions(target, additions) {
|
|
55
|
-
if (!additions || additions.length === 0)
|
|
78
|
+
if (!additions || additions.length === 0) {
|
|
56
79
|
return target;
|
|
80
|
+
}
|
|
57
81
|
const existingIds = new Set(target.map((action) => action.id));
|
|
58
82
|
for (const action of additions) {
|
|
59
|
-
if (existingIds.has(action.id))
|
|
83
|
+
if (existingIds.has(action.id)) {
|
|
60
84
|
continue;
|
|
85
|
+
}
|
|
61
86
|
target.push(action);
|
|
62
87
|
existingIds.add(action.id);
|
|
63
88
|
}
|
|
@@ -65,17 +90,22 @@ export function appendUniqueAgentBrowserNextActions(target, additions) {
|
|
|
65
90
|
}
|
|
66
91
|
export function isStandaloneSnapshotNextAction(action) {
|
|
67
92
|
const args = action.params?.args;
|
|
68
|
-
if (!args || action.params
|
|
93
|
+
if (!args || (action.params.stdin !== undefined && action.params.stdin.length > 0)) {
|
|
69
94
|
return false;
|
|
95
|
+
}
|
|
70
96
|
let commandIndex = args[0] === "--namespace" ? 2 : 0;
|
|
71
|
-
if (args[commandIndex] === "--session")
|
|
97
|
+
if (args[commandIndex] === "--session") {
|
|
72
98
|
commandIndex += 2;
|
|
99
|
+
}
|
|
73
100
|
return args[commandIndex] === "snapshot";
|
|
74
101
|
}
|
|
75
102
|
export function alignPageChangeSummaryNextActionIds(summary, nextActions) {
|
|
76
|
-
if (!summary?.nextActionIds || !nextActions)
|
|
103
|
+
if (!summary?.nextActionIds || !nextActions) {
|
|
77
104
|
return summary;
|
|
105
|
+
}
|
|
78
106
|
const nextActionIds = new Set(nextActions.map((action) => action.id));
|
|
79
107
|
const alignedIds = summary.nextActionIds.filter((id) => nextActionIds.has(id));
|
|
80
|
-
return alignedIds.length > 0
|
|
108
|
+
return alignedIds.length > 0
|
|
109
|
+
? { ...summary, nextActionIds: alignedIds }
|
|
110
|
+
: { ...summary, nextActionIds: undefined };
|
|
81
111
|
}
|