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,32 +1,21 @@
|
|
|
1
1
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
import { spawn as crossSpawn } from "cross-spawn";
|
|
7
|
-
import { parseArgvDescriptor } from "./argv-descriptor.js";
|
|
8
|
-
import { extractExplicitSessionName, resolveAgentBrowserNamespace, scanUpstreamGlobalFlagOccurrences } from "./argv-grammar.js";
|
|
2
|
+
import { env as processEnv } from "node:process";
|
|
3
|
+
import { runBrowserChild } from "./process-child.js";
|
|
4
|
+
export { resolveSpawnedChildExitCode } from "./process-child.js";
|
|
5
|
+
import { scanUpstreamGlobalFlagOccurrences } from "./argv-grammar.js";
|
|
9
6
|
import { commitManagedSessionRestoreSuppression, getManagedSessionRestoreEnv, getManagedSessionRestoreProtectedEnv, getOwnedManagedSessionCompatibilityEnv, getOwnedManagedSessionNamespaceEnv, isOwnedManagedSessionTarget, validateManagedSessionRestoreContextForSpawn, } from "./managed-session-restore.js";
|
|
10
|
-
import { getPageTargetValidationError
|
|
11
|
-
import { getImplicitSessionIdleTimeoutMs } from "./runtime.js";
|
|
12
|
-
import { getAgentBrowserProcessEnvironment } from "./process-environment.js";
|
|
13
|
-
import { openSecureTempFile, writeSecureTempChunk } from "./temp.js";
|
|
7
|
+
import { getPageTargetValidationError } from "./page-target-validation.js";
|
|
8
|
+
import { getImplicitSessionIdleTimeoutMs } from "./runtime-timeouts.js";
|
|
9
|
+
import { getAgentBrowserProcessArgs, getAgentBrowserProcessEnvironment, } from "./process-environment.js";
|
|
14
10
|
import { resolveWindowsStockLauncher } from "./windows-stock-launcher.js";
|
|
15
|
-
const MAX_BUFFERED_STDOUT_BYTES = 512 * 1_024;
|
|
16
|
-
const MAX_BUFFERED_STDERR_CHARS = 32_000;
|
|
17
|
-
const MAX_BUFFERED_STDOUT_TAIL_CHARS = 32_000;
|
|
18
|
-
const PROCESS_STDOUT_SPILL_FILE_PREFIX = "process-stdout";
|
|
19
11
|
const AGENT_BROWSER_SOCKET_DIR_ENV = "AGENT_BROWSER_SOCKET_DIR";
|
|
20
12
|
const AGENT_BROWSER_DEFAULT_TIMEOUT_ENV = "AGENT_BROWSER_DEFAULT_TIMEOUT";
|
|
21
13
|
const AGENT_BROWSER_IDLE_TIMEOUT_ENV = "AGENT_BROWSER_IDLE_TIMEOUT_MS";
|
|
22
14
|
const PI_AGENT_BROWSER_PROCESS_TIMEOUT_ENV = "PI_AGENT_BROWSER_PROCESS_TIMEOUT_MS";
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
const TERMUX_PACKAGE_NAME_PATTERN = /^[A-Za-z0-9_]+(?:\.[A-Za-z0-9_]+)+$/;
|
|
15
|
+
import { getAgentBrowserSocketDirValidationError, getAgentBrowserSocketPathValidationError, resolveAgentBrowserSocketDir, } from "./process-socket-storage.js";
|
|
16
|
+
export { getAgentBrowserSocketDir, getAgentBrowserSocketDirValidationError, getAgentBrowserSocketPathValidationError, isTrustedAndroidAppDataRoot, isTrustedSocketDirAncestor, resolveAgentBrowserSocketDir, } from "./process-socket-storage.js";
|
|
26
17
|
export const SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS = 25_000;
|
|
27
18
|
const DEFAULT_AGENT_BROWSER_PROCESS_TIMEOUT_MS = 35_000;
|
|
28
|
-
/** Grace period after `exit` before resolving when `close` is delayed by inherited stdio handles. */
|
|
29
|
-
const EXIT_STDIO_GRACE_MS = 100;
|
|
30
19
|
const attachedBrowserSessionContext = new AsyncLocalStorage();
|
|
31
20
|
const chromeStartupArgsContext = new AsyncLocalStorage();
|
|
32
21
|
export function withChromeStartupArgs(args, run) {
|
|
@@ -35,102 +24,26 @@ export function withChromeStartupArgs(args, run) {
|
|
|
35
24
|
export function withAttachedBrowserSessionContext(preserve, run) {
|
|
36
25
|
return attachedBrowserSessionContext.run(preserve || attachedBrowserSessionContext.getStore() === true, run);
|
|
37
26
|
}
|
|
38
|
-
function appendTail(text, addition, maxChars) {
|
|
39
|
-
const combined = text + addition;
|
|
40
|
-
return combined.length <= maxChars ? combined : combined.slice(combined.length - maxChars);
|
|
41
|
-
}
|
|
42
27
|
export function prepareAgentBrowserSpawnArgs(args, wrapperCompatibilityUserAgent, preserveAttachedBrowserSession = false, startupArgs) {
|
|
43
|
-
if (preserveAttachedBrowserSession)
|
|
28
|
+
if (preserveAttachedBrowserSession) {
|
|
44
29
|
return args;
|
|
30
|
+
}
|
|
45
31
|
const occurrence = scanUpstreamGlobalFlagOccurrences(args, "--args").at(-1);
|
|
46
|
-
const customArgs = wrapperCompatibilityUserAgent &&
|
|
47
|
-
|
|
48
|
-
|
|
32
|
+
const customArgs = wrapperCompatibilityUserAgent !== undefined &&
|
|
33
|
+
wrapperCompatibilityUserAgent.length > 0 &&
|
|
34
|
+
!occurrence
|
|
35
|
+
? `${startupArgs ?? "--no-startup-window"},--user-agent=${wrapperCompatibilityUserAgent.replaceAll(/[\r\n,]/g, "")}`
|
|
36
|
+
: startupArgs;
|
|
37
|
+
if (customArgs === undefined) {
|
|
49
38
|
return args;
|
|
50
|
-
|
|
39
|
+
}
|
|
40
|
+
if (!occurrence) {
|
|
51
41
|
return ["--args", customArgs, ...args];
|
|
42
|
+
}
|
|
52
43
|
const normalized = [...args];
|
|
53
44
|
normalized[occurrence.index + 1] = customArgs;
|
|
54
45
|
return normalized;
|
|
55
46
|
}
|
|
56
|
-
async function terminateSpawnedChild(child, signal) {
|
|
57
|
-
if (processPlatform === "win32" && child.pid) {
|
|
58
|
-
// Keep the shell alive until taskkill has traversed its descendants, and
|
|
59
|
-
// observe the killer before allowing the browser call to finish.
|
|
60
|
-
const killed = await new Promise((resolve) => {
|
|
61
|
-
const killer = spawn("taskkill.exe", ["/PID", String(child.pid), "/T", "/F"], { stdio: "ignore" });
|
|
62
|
-
killer.once("error", () => resolve(false));
|
|
63
|
-
killer.once("close", (code) => resolve(code === 0));
|
|
64
|
-
});
|
|
65
|
-
if (killed)
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
child.kill(signal);
|
|
69
|
-
}
|
|
70
|
-
/** Exported for unit tests that lock subprocess exit-code precedence. */
|
|
71
|
-
export function resolveSpawnedChildExitCode(input) {
|
|
72
|
-
// Precedence: observed `close` code when present, then wrapper timeout (124), then
|
|
73
|
-
// post-`exit` fallback when inherited stdio delays `close`, then spawn failure (127).
|
|
74
|
-
if (input.closeCode !== null && input.closeCode !== undefined) {
|
|
75
|
-
return input.closeCode;
|
|
76
|
-
}
|
|
77
|
-
if (input.timedOut) {
|
|
78
|
-
return 124;
|
|
79
|
-
}
|
|
80
|
-
if (input.useExitFallback && input.exitCode !== null && input.exitCode !== undefined) {
|
|
81
|
-
return input.exitCode;
|
|
82
|
-
}
|
|
83
|
-
return input.spawnError ? 127 : 0;
|
|
84
|
-
}
|
|
85
|
-
function watchSpawnedChildCompletion(child, options) {
|
|
86
|
-
let exited = false;
|
|
87
|
-
let exitCode = null;
|
|
88
|
-
let postExitTimer;
|
|
89
|
-
// `completed` suppresses duplicate exit/close callbacks; `settled` in `finish` guards async spill cleanup.
|
|
90
|
-
let completed = false;
|
|
91
|
-
const complete = (closeCode) => {
|
|
92
|
-
if (completed)
|
|
93
|
-
return;
|
|
94
|
-
completed = true;
|
|
95
|
-
if (postExitTimer) {
|
|
96
|
-
clearTimeout(postExitTimer);
|
|
97
|
-
postExitTimer = undefined;
|
|
98
|
-
}
|
|
99
|
-
const context = options.getContext();
|
|
100
|
-
options.onComplete(resolveSpawnedChildExitCode({
|
|
101
|
-
closeCode,
|
|
102
|
-
exitCode,
|
|
103
|
-
useExitFallback: exited,
|
|
104
|
-
timedOut: context.timedOut,
|
|
105
|
-
spawnError: context.spawnError,
|
|
106
|
-
}));
|
|
107
|
-
};
|
|
108
|
-
child.once("exit", (code) => {
|
|
109
|
-
exited = true;
|
|
110
|
-
exitCode = code;
|
|
111
|
-
postExitTimer = setTimeout(() => {
|
|
112
|
-
destroySpawnedChildStreams(child);
|
|
113
|
-
complete(undefined);
|
|
114
|
-
}, options.graceMs);
|
|
115
|
-
postExitTimer.unref?.();
|
|
116
|
-
});
|
|
117
|
-
child.once("close", (code) => {
|
|
118
|
-
complete(code);
|
|
119
|
-
});
|
|
120
|
-
return {
|
|
121
|
-
clear: () => {
|
|
122
|
-
if (postExitTimer) {
|
|
123
|
-
clearTimeout(postExitTimer);
|
|
124
|
-
postExitTimer = undefined;
|
|
125
|
-
}
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
function destroySpawnedChildStreams(child) {
|
|
130
|
-
child.stdin?.destroy();
|
|
131
|
-
child.stdout?.destroy();
|
|
132
|
-
child.stderr?.destroy();
|
|
133
|
-
}
|
|
134
47
|
function parsePositiveIntegerEnv(value) {
|
|
135
48
|
if (value === undefined || !/^\d+$/.test(value.trim())) {
|
|
136
49
|
return undefined;
|
|
@@ -138,184 +51,16 @@ function parsePositiveIntegerEnv(value) {
|
|
|
138
51
|
const parsed = Number(value.trim());
|
|
139
52
|
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;
|
|
140
53
|
}
|
|
141
|
-
function clampUpstreamDefaultTimeout(childEnv) {
|
|
142
|
-
const requestedTimeout = parsePositiveIntegerEnv(childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV]);
|
|
143
|
-
if (requestedTimeout === undefined || requestedTimeout > SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS) {
|
|
144
|
-
childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV] = String(SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS);
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
54
|
export function getAgentBrowserProcessTimeoutMs(env = processEnv) {
|
|
148
|
-
return parsePositiveIntegerEnv(env[PI_AGENT_BROWSER_PROCESS_TIMEOUT_ENV]) ??
|
|
55
|
+
return (parsePositiveIntegerEnv(env[PI_AGENT_BROWSER_PROCESS_TIMEOUT_ENV]) ??
|
|
56
|
+
DEFAULT_AGENT_BROWSER_PROCESS_TIMEOUT_MS);
|
|
149
57
|
}
|
|
150
|
-
export function
|
|
151
|
-
if (platform === "win32") {
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
const termuxAppRoot = platform === "android" && termuxPackageName && TERMUX_PACKAGE_NAME_PATTERN.test(termuxPackageName);
|
|
155
|
-
const prefix = platform === "darwin"
|
|
156
|
-
? "/private/tmp/piab"
|
|
157
|
-
: termuxAppRoot
|
|
158
|
-
? `/data/data/${termuxPackageName}/piab`
|
|
159
|
-
: DEFAULT_AGENT_BROWSER_SOCKET_DIR_PREFIX;
|
|
160
|
-
return `${prefix}${!termuxAppRoot && typeof uid === "number" ? `-${uid}` : ""}`;
|
|
161
|
-
}
|
|
162
|
-
export function resolveAgentBrowserSocketDir(options = {}) {
|
|
163
|
-
const parentEnv = options.parentEnv ?? getAgentBrowserProcessEnvironment();
|
|
164
|
-
return options.env?.[AGENT_BROWSER_SOCKET_DIR_ENV] ?? parentEnv[PI_AGENT_BROWSER_SOCKET_DIR_ENV]
|
|
165
|
-
?? (!options.ownedManagedSession ? parentEnv[AGENT_BROWSER_SOCKET_DIR_ENV] : undefined) ?? getAgentBrowserSocketDir();
|
|
166
|
-
}
|
|
167
|
-
export function isTrustedAndroidAppDataRoot(path, metadata, uid, platform = processPlatform) {
|
|
168
|
-
if (platform !== "android" || metadata.uid !== uid || metadata.isSymbolicLink() || !metadata.isDirectory() || (metadata.mode & 0o777) !== 0o700)
|
|
169
|
-
return false;
|
|
170
|
-
const parent = dirname(path);
|
|
171
|
-
return parent === "/data/data" || /^\/data\/user\/\d+$/.test(parent);
|
|
172
|
-
}
|
|
173
|
-
export function isTrustedSocketDirAncestor(metadata, uid, platform = processPlatform) {
|
|
174
|
-
if (metadata.isSymbolicLink())
|
|
175
|
-
return metadata.uid === 0;
|
|
176
|
-
if (!metadata.isDirectory())
|
|
177
|
-
return false;
|
|
178
|
-
const mode = metadata.mode & 0o7777;
|
|
179
|
-
if (platform === "android" && uid !== 0 && metadata.uid === uid && metadata.gid === uid)
|
|
180
|
-
return (mode & 0o002) === 0;
|
|
181
|
-
if (metadata.uid === uid && uid !== 0)
|
|
182
|
-
return (mode & 0o022) === 0;
|
|
183
|
-
return metadata.uid === 0 && ((mode & 0o022) === 0 || (mode & 0o1000) !== 0);
|
|
184
|
-
}
|
|
185
|
-
async function hasTrustedSocketDirAncestry(socketDir, uid, visited = new Set()) {
|
|
186
|
-
for (let current = dirname(socketDir);;) {
|
|
187
|
-
current = current.replace(/\/+$/, "") || "/";
|
|
188
|
-
if (visited.has(current))
|
|
189
|
-
return true;
|
|
190
|
-
visited.add(current);
|
|
191
|
-
const metadata = await lstat(current);
|
|
192
|
-
// The operating environment supplies /; its reported owner may be unmapped in a user namespace.
|
|
193
|
-
if (current === "/" && metadata.isDirectory() && (metadata.mode & 0o022) === 0)
|
|
194
|
-
return true;
|
|
195
|
-
if (isTrustedAndroidAppDataRoot(current, metadata, uid))
|
|
196
|
-
return true;
|
|
197
|
-
if (!isTrustedSocketDirAncestor(metadata, uid))
|
|
198
|
-
return false;
|
|
199
|
-
if (metadata.isSymbolicLink()) {
|
|
200
|
-
// Native stat rejects broken/cyclic links before walking their destination ancestry.
|
|
201
|
-
if (!isTrustedSocketDirAncestor(await stat(current), uid))
|
|
202
|
-
return false;
|
|
203
|
-
const target = await readlink(current);
|
|
204
|
-
const targetPath = isAbsolute(target) ? target : `${dirname(current)}/${target}`;
|
|
205
|
-
// Keep '..' after symlinks intact; '/.' includes the target itself in the parent walk.
|
|
206
|
-
if (!await hasTrustedSocketDirAncestry(`${targetPath}/.`, uid, visited))
|
|
207
|
-
return false;
|
|
208
|
-
}
|
|
209
|
-
const parent = dirname(current);
|
|
210
|
-
if (parent === current)
|
|
211
|
-
return true;
|
|
212
|
-
current = parent;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
async function socketDirEntriesAreOwned(socketDir, uid, visited = { count: 0 }) {
|
|
216
|
-
for (const name of await readdir(socketDir)) {
|
|
217
|
-
if ((visited.count += 1) > 16_384)
|
|
218
|
-
return false;
|
|
219
|
-
try {
|
|
220
|
-
const path = join(socketDir, name);
|
|
221
|
-
const metadata = await lstat(path);
|
|
222
|
-
if (metadata.uid !== uid || metadata.isSymbolicLink())
|
|
223
|
-
return false;
|
|
224
|
-
if (metadata.isDirectory()) {
|
|
225
|
-
if (!await socketDirEntriesAreOwned(path, uid, visited))
|
|
226
|
-
return false;
|
|
227
|
-
}
|
|
228
|
-
else if (!metadata.isFile() && !metadata.isSocket()) {
|
|
229
|
-
return false;
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
catch (error) {
|
|
233
|
-
if (error.code !== "ENOENT")
|
|
234
|
-
return false;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
return true;
|
|
238
|
-
}
|
|
239
|
-
export async function getAgentBrowserSocketDirValidationError(socketDir, uid = typeof process.getuid === "function" ? process.getuid() : undefined, platform = processPlatform) {
|
|
240
|
-
if (!isAbsolute(socketDir))
|
|
241
|
-
return "the path is not absolute";
|
|
242
|
-
// Windows uses native ACLs and named pipes, not POSIX uid/mode metadata.
|
|
243
|
-
// Still require a real directory; never accept a file or a redirected root.
|
|
244
|
-
if (platform === "win32") {
|
|
245
|
-
try {
|
|
246
|
-
try {
|
|
247
|
-
await mkdir(socketDir);
|
|
248
|
-
}
|
|
249
|
-
catch (error) {
|
|
250
|
-
if (error.code !== "EEXIST")
|
|
251
|
-
throw error;
|
|
252
|
-
}
|
|
253
|
-
const metadata = await lstat(socketDir);
|
|
254
|
-
if (metadata.isSymbolicLink())
|
|
255
|
-
return "the directory is a symlink";
|
|
256
|
-
return metadata.isDirectory() ? undefined : "the path is not a directory";
|
|
257
|
-
}
|
|
258
|
-
catch (error) {
|
|
259
|
-
return `the directory could not be inspected (${error.code ?? "unknown error"})`;
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
if (typeof uid !== "number")
|
|
263
|
-
return "POSIX ownership metadata is unavailable";
|
|
264
|
-
try {
|
|
265
|
-
if (!await hasTrustedSocketDirAncestry(socketDir, uid))
|
|
266
|
-
return "an ancestor is writable, foreign-owned, a non-directory, or an untrusted symlink";
|
|
267
|
-
try {
|
|
268
|
-
await mkdir(socketDir, { mode: 0o700 });
|
|
269
|
-
}
|
|
270
|
-
catch (error) {
|
|
271
|
-
if (error.code !== "EEXIST")
|
|
272
|
-
return `the directory could not be created (${error.code ?? "unknown error"})`;
|
|
273
|
-
}
|
|
274
|
-
const metadata = await lstat(socketDir);
|
|
275
|
-
if (!metadata.isDirectory())
|
|
276
|
-
return "the path is not a directory";
|
|
277
|
-
if (metadata.isSymbolicLink())
|
|
278
|
-
return "the directory is a symlink";
|
|
279
|
-
if (metadata.uid !== uid)
|
|
280
|
-
return `the directory is owned by uid ${metadata.uid}, not uid ${uid}`;
|
|
281
|
-
if ((metadata.mode & 0o777) !== 0o700)
|
|
282
|
-
return `the directory mode is ${(metadata.mode & 0o777).toString(8)}, not 700`;
|
|
283
|
-
if (!await hasTrustedSocketDirAncestry(socketDir, uid))
|
|
284
|
-
return "an ancestor became untrusted during validation";
|
|
285
|
-
if (!await socketDirEntriesAreOwned(socketDir, uid))
|
|
286
|
-
return "the directory contains a foreign-owned, symlink, special, or excessively deep entry";
|
|
287
|
-
return undefined;
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
return `the directory could not be inspected (${error.code ?? "unknown error"})`;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
export function getAgentBrowserSocketPathValidationError(options) {
|
|
294
|
-
if ((options.platform ?? processPlatform) === "win32")
|
|
295
|
-
return undefined;
|
|
296
|
-
const descriptor = parseArgvDescriptor(options.args);
|
|
297
|
-
const { command } = descriptor.commandInfo;
|
|
298
|
-
// Preflight commands that can start or navigate a browser. Follow-up reads and
|
|
299
|
-
// cleanup may target a daemon created by an earlier wrapper version, so let
|
|
300
|
-
// upstream inspect those identities instead of rejecting them from path math.
|
|
301
|
-
if (!command || !["batch", "connect", "goto", "navigate", "open", "visit"].includes(command))
|
|
302
|
-
return undefined;
|
|
303
|
-
const sessionName = extractExplicitSessionName(options.args);
|
|
304
|
-
if (!sessionName)
|
|
305
|
-
return undefined;
|
|
306
|
-
const namespace = resolveAgentBrowserNamespace(options.args, options.env?.AGENT_BROWSER_NAMESPACE);
|
|
307
|
-
const socketRoot = namespace ? join(options.socketDir, "namespaces", namespace, "run") : options.socketDir;
|
|
308
|
-
const socketPath = join(socketRoot, `${sessionName}.sock`);
|
|
309
|
-
const pathBytes = Buffer.byteLength(socketPath);
|
|
310
|
-
if (pathBytes <= 103)
|
|
311
|
-
return undefined;
|
|
312
|
-
return `Agent-browser Unix socket path would be ${pathBytes} bytes (max 103) for session ${JSON.stringify(sessionName)} under ${JSON.stringify(options.socketDir)}. Set PI_AGENT_BROWSER_SOCKET_DIR to a shorter absolute private directory such as /tmp/piab-<uid> with mode 0700; retrying sessionMode \"fresh\" cannot shorten this configured root.`;
|
|
313
|
-
}
|
|
314
|
-
export function buildAgentBrowserProcessEnv(baseEnv = processEnv, overrides = undefined) {
|
|
58
|
+
export function buildAgentBrowserProcessEnv(baseEnv = processEnv, overrides) {
|
|
315
59
|
const childEnv = {};
|
|
316
60
|
for (const [name, value] of Object.entries(baseEnv)) {
|
|
317
|
-
if (value !== undefined)
|
|
61
|
+
if (value !== undefined) {
|
|
318
62
|
childEnv[name] = value;
|
|
63
|
+
}
|
|
319
64
|
}
|
|
320
65
|
for (const [name, value] of Object.entries(overrides ?? {})) {
|
|
321
66
|
if (value === undefined) {
|
|
@@ -325,15 +70,20 @@ export function buildAgentBrowserProcessEnv(baseEnv = processEnv, overrides = un
|
|
|
325
70
|
childEnv[name] = value;
|
|
326
71
|
}
|
|
327
72
|
}
|
|
328
|
-
|
|
73
|
+
const requestedTimeout = parsePositiveIntegerEnv(childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV]);
|
|
74
|
+
if (requestedTimeout === undefined ||
|
|
75
|
+
requestedTimeout > SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS) {
|
|
76
|
+
childEnv[AGENT_BROWSER_DEFAULT_TIMEOUT_ENV] = String(SAFE_AGENT_BROWSER_OPERATION_TIMEOUT_MS);
|
|
77
|
+
}
|
|
329
78
|
return childEnv;
|
|
330
79
|
}
|
|
331
|
-
function getManagedPreSpawnPolicyError(options, currentPageUrl, pageUrlUnknown = false,
|
|
80
|
+
function getManagedPreSpawnPolicyError(options, currentPageUrl, pageUrlUnknown = false, nativeConfirmationDecision = false) {
|
|
332
81
|
if (!validateManagedSessionRestoreContextForSpawn(options)) {
|
|
333
82
|
return "Managed session restore policy, storage, or checkout identity changed after planning; refusing to start agent-browser.";
|
|
334
83
|
}
|
|
335
|
-
if (
|
|
84
|
+
if (nativeConfirmationDecision) {
|
|
336
85
|
return undefined;
|
|
86
|
+
}
|
|
337
87
|
return getPageTargetValidationError({
|
|
338
88
|
args: options.args,
|
|
339
89
|
currentPageUrl,
|
|
@@ -341,267 +91,126 @@ function getManagedPreSpawnPolicyError(options, currentPageUrl, pageUrlUnknown =
|
|
|
341
91
|
stdin: options.stdin,
|
|
342
92
|
});
|
|
343
93
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
return cancelledResult();
|
|
354
|
-
const parentEnv = getAgentBrowserProcessEnvironment();
|
|
355
|
-
const managedSessionRestoreOptions = {
|
|
356
|
-
args,
|
|
357
|
-
cwd,
|
|
358
|
-
env,
|
|
359
|
-
ownedManagedSession,
|
|
360
|
-
parentEnv,
|
|
361
|
-
restoreState: managedSessionRestoreState,
|
|
362
|
-
stdin,
|
|
94
|
+
function failureResult(error) {
|
|
95
|
+
return {
|
|
96
|
+
aborted: false,
|
|
97
|
+
agentBrowserStarted: false,
|
|
98
|
+
exitCode: 1,
|
|
99
|
+
spawnError: new Error(error),
|
|
100
|
+
stderr: "",
|
|
101
|
+
stdout: "",
|
|
102
|
+
timedOut: false,
|
|
363
103
|
};
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
const ownedManagedSessionCompatibilityEnv = getOwnedManagedSessionCompatibilityEnv(managedSessionRestoreOptions);
|
|
378
|
-
const processOverrides = {
|
|
379
|
-
...(ownedManagedSession ? { [AGENT_BROWSER_IDLE_TIMEOUT_ENV]: String(getImplicitSessionIdleTimeoutMs()) } : {}),
|
|
380
|
-
...managedSessionRestoreEnv,
|
|
381
|
-
...env,
|
|
382
|
-
...getManagedSessionRestoreProtectedEnv(managedSessionRestoreOptions, managedSessionRestoreEnv),
|
|
383
|
-
...getOwnedManagedSessionNamespaceEnv(managedSessionRestoreOptions),
|
|
384
|
-
...ownedManagedSessionCompatibilityEnv,
|
|
104
|
+
}
|
|
105
|
+
async function prepareProcessEnvironment(options) {
|
|
106
|
+
const restoreEnv = getManagedSessionRestoreEnv(options);
|
|
107
|
+
const compatibilityEnv = getOwnedManagedSessionCompatibilityEnv(options);
|
|
108
|
+
const overrides = {
|
|
109
|
+
...(options.ownedManagedSession === true
|
|
110
|
+
? { [AGENT_BROWSER_IDLE_TIMEOUT_ENV]: String(getImplicitSessionIdleTimeoutMs()) }
|
|
111
|
+
: {}),
|
|
112
|
+
...restoreEnv,
|
|
113
|
+
...options.env,
|
|
114
|
+
...getManagedSessionRestoreProtectedEnv(options, restoreEnv),
|
|
115
|
+
...getOwnedManagedSessionNamespaceEnv(options),
|
|
116
|
+
...compatibilityEnv,
|
|
385
117
|
};
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
118
|
+
let effectiveEnv = overrides[AGENT_BROWSER_SOCKET_DIR_ENV] === undefined
|
|
119
|
+
? { ...overrides, [AGENT_BROWSER_SOCKET_DIR_ENV]: undefined }
|
|
120
|
+
: overrides;
|
|
121
|
+
const socketDir = resolveAgentBrowserSocketDir({
|
|
122
|
+
env: overrides,
|
|
123
|
+
ownedManagedSession: options.ownedManagedSession,
|
|
124
|
+
parentEnv: options.parentEnv,
|
|
125
|
+
});
|
|
126
|
+
if (socketDir !== undefined) {
|
|
127
|
+
const directoryError = socketDir.length > 0
|
|
128
|
+
? await getAgentBrowserSocketDirValidationError(socketDir)
|
|
392
129
|
: "the configured path is empty";
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
130
|
+
const pathError = directoryError === undefined
|
|
131
|
+
? getAgentBrowserSocketPathValidationError({
|
|
132
|
+
args: options.args,
|
|
133
|
+
env: effectiveEnv,
|
|
134
|
+
socketDir,
|
|
135
|
+
})
|
|
136
|
+
: undefined;
|
|
137
|
+
if (directoryError !== undefined || pathError !== undefined) {
|
|
397
138
|
return {
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
spawnError: new Error(socketPathError ?? `Agent-browser socket storage ${JSON.stringify(requestedSocketDir)} is unusable: ${socketDirError}. Use an absolute directory owned by the current uid with mode 0700 and remove foreign, symlink, or special entries.`),
|
|
402
|
-
stderr: "",
|
|
403
|
-
stdout: "",
|
|
404
|
-
timedOut: false,
|
|
139
|
+
env: effectiveEnv,
|
|
140
|
+
error: pathError ??
|
|
141
|
+
`Agent-browser socket storage ${JSON.stringify(socketDir)} is unusable: ${directoryError ?? "unknown error"}. Use an absolute directory owned by the current uid with mode 0700 and remove foreign, symlink, or special entries.`,
|
|
405
142
|
};
|
|
406
143
|
}
|
|
407
|
-
effectiveEnv = { ...effectiveEnv, [AGENT_BROWSER_SOCKET_DIR_ENV]:
|
|
144
|
+
effectiveEnv = { ...effectiveEnv, [AGENT_BROWSER_SOCKET_DIR_ENV]: socketDir };
|
|
408
145
|
}
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
146
|
+
return {
|
|
147
|
+
env: buildAgentBrowserProcessEnv(options.parentEnv, effectiveEnv),
|
|
148
|
+
userAgent: compatibilityEnv.AGENT_BROWSER_USER_AGENT,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
function restoreOptionsForProcess(options) {
|
|
152
|
+
return {
|
|
153
|
+
args: options.args,
|
|
154
|
+
cwd: options.cwd,
|
|
155
|
+
env: options.env,
|
|
156
|
+
ownedManagedSession: options.ownedManagedSession === true || isOwnedManagedSessionTarget(options.args),
|
|
157
|
+
parentEnv: getAgentBrowserProcessEnvironment(),
|
|
158
|
+
restoreState: options.managedSessionRestoreState,
|
|
159
|
+
stdin: options.stdin,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
function effectiveBrowserSpawnArgs(args, userAgent, preserveAttached) {
|
|
163
|
+
return prepareAgentBrowserSpawnArgs(getAgentBrowserProcessArgs(args), userAgent, preserveAttached === true || attachedBrowserSessionContext.getStore() === true, chromeStartupArgsContext.getStore());
|
|
164
|
+
}
|
|
165
|
+
export async function runAgentBrowserProcess(options) {
|
|
166
|
+
const { signal } = options;
|
|
167
|
+
const timeoutMs = options.timeoutMs ?? getAgentBrowserProcessTimeoutMs();
|
|
168
|
+
const deadlineExpired = () => signal?.reason instanceof Error && signal.reason.name === "TimeoutError";
|
|
169
|
+
const cancelledResult = () => ({
|
|
170
|
+
aborted: !deadlineExpired(),
|
|
171
|
+
agentBrowserStarted: false,
|
|
172
|
+
exitCode: deadlineExpired() ? 124 : 1,
|
|
173
|
+
stderr: "",
|
|
174
|
+
stdout: "",
|
|
175
|
+
timedOut: deadlineExpired(),
|
|
176
|
+
timeoutMs: deadlineExpired() ? timeoutMs : undefined,
|
|
177
|
+
});
|
|
178
|
+
if (signal?.aborted === true) {
|
|
412
179
|
return cancelledResult();
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
const tempFile = await openSecureTempFile(PROCESS_STDOUT_SPILL_FILE_PREFIX, ".json");
|
|
449
|
-
stdoutSpillHandle = tempFile.fileHandle;
|
|
450
|
-
stdoutSpillPath = tempFile.path;
|
|
451
|
-
if (stdoutBuffers.length > 0) {
|
|
452
|
-
await writeSecureTempChunk({
|
|
453
|
-
content: Buffer.concat(stdoutBuffers),
|
|
454
|
-
fileHandle: stdoutSpillHandle,
|
|
455
|
-
path: stdoutSpillPath,
|
|
456
|
-
});
|
|
457
|
-
stdoutBuffers = [];
|
|
458
|
-
stdoutBufferedBytes = 0;
|
|
459
|
-
}
|
|
460
|
-
}
|
|
461
|
-
await writeSecureTempChunk({ content: buffer, fileHandle: stdoutSpillHandle, path: stdoutSpillPath });
|
|
462
|
-
})
|
|
463
|
-
.catch((error) => {
|
|
464
|
-
stdoutSpillError = error instanceof Error ? error : new Error(String(error));
|
|
465
|
-
});
|
|
466
|
-
};
|
|
467
|
-
const removeAbortListener = () => {
|
|
468
|
-
if (!signal || !abortListener)
|
|
469
|
-
return;
|
|
470
|
-
signal.removeEventListener("abort", abortListener);
|
|
471
|
-
abortListener = undefined;
|
|
472
|
-
};
|
|
473
|
-
const finish = (exitCode) => {
|
|
474
|
-
if (settled)
|
|
475
|
-
return;
|
|
476
|
-
settled = true;
|
|
477
|
-
removeAbortListener();
|
|
478
|
-
if (killTimer) {
|
|
479
|
-
clearTimeout(killTimer);
|
|
480
|
-
}
|
|
481
|
-
if (timeoutTimer) {
|
|
482
|
-
clearTimeout(timeoutTimer);
|
|
483
|
-
}
|
|
484
|
-
completionWatcher?.clear();
|
|
485
|
-
void pendingStdoutWrite.finally(async () => {
|
|
486
|
-
await pendingTermination;
|
|
487
|
-
if (stdoutSpillHandle) {
|
|
488
|
-
await stdoutSpillHandle.close().catch(() => undefined);
|
|
489
|
-
}
|
|
490
|
-
if (processPlatform === "win32" && !spawnError) {
|
|
491
|
-
agentBrowserStarted = true;
|
|
492
|
-
commitManagedSessionRestoreSuppression(managedSessionRestoreOptions);
|
|
493
|
-
}
|
|
494
|
-
if (!spawnError && stdoutSpillError) {
|
|
495
|
-
spawnError = stdoutSpillError;
|
|
496
|
-
}
|
|
497
|
-
// Idempotent teardown: streams may already be destroyed by the post-`exit` fallback.
|
|
498
|
-
destroySpawnedChildStreams(child);
|
|
499
|
-
resolve({
|
|
500
|
-
aborted,
|
|
501
|
-
agentBrowserStarted,
|
|
502
|
-
exitCode,
|
|
503
|
-
spawnError,
|
|
504
|
-
stderr,
|
|
505
|
-
stdout: stdoutSpillPath ? stdoutTail : Buffer.concat(stdoutBuffers).toString("utf8"),
|
|
506
|
-
stdoutSpillPath,
|
|
507
|
-
timedOut,
|
|
508
|
-
timeoutMs: timedOut ? timeoutMs : undefined,
|
|
509
|
-
});
|
|
510
|
-
});
|
|
511
|
-
};
|
|
512
|
-
const spawnPolicyError = getManagedPreSpawnPolicyError(managedSessionRestoreOptions, managedStateCurrentPageUrl, managedStatePageUrlUnknown, options.browserIndependentReadConfirmation);
|
|
513
|
-
if (spawnPolicyError) {
|
|
514
|
-
resolve({ aborted: false, agentBrowserStarted: false, exitCode: 1, spawnError: new Error(spawnPolicyError), stderr: "", stdout: "", timedOut: false });
|
|
515
|
-
return;
|
|
516
|
-
}
|
|
517
|
-
const spawnBrowser = processPlatform === "win32" && !stockLauncher ? crossSpawn : spawn;
|
|
518
|
-
const child = spawnBrowser(stockLauncher ?? "agent-browser", prepareAgentBrowserSpawnArgs(args, ownedManagedSessionCompatibilityEnv.AGENT_BROWSER_USER_AGENT, preserveAttachedBrowserSession, chromeStartupArgsContext.getStore()), {
|
|
519
|
-
cwd,
|
|
520
|
-
env: childEnv,
|
|
521
|
-
stdio: ["pipe", "pipe", "pipe"],
|
|
522
|
-
});
|
|
523
|
-
if (processPlatform !== "win32") {
|
|
524
|
-
child.once("spawn", () => {
|
|
525
|
-
agentBrowserStarted = true;
|
|
526
|
-
commitManagedSessionRestoreSuppression(managedSessionRestoreOptions);
|
|
527
|
-
});
|
|
528
|
-
}
|
|
529
|
-
const terminateChild = (reason) => {
|
|
530
|
-
if (settled)
|
|
531
|
-
return;
|
|
532
|
-
if (reason === "abort") {
|
|
533
|
-
aborted = true;
|
|
534
|
-
}
|
|
535
|
-
else {
|
|
536
|
-
timedOut = true;
|
|
537
|
-
}
|
|
538
|
-
if (pendingTermination)
|
|
539
|
-
return;
|
|
540
|
-
pendingTermination = terminateSpawnedChild(child, "SIGTERM");
|
|
541
|
-
// Windows taskkill already forces the entire tree. A concurrent direct
|
|
542
|
-
// kill would remove its root before traversal finishes.
|
|
543
|
-
if (processPlatform !== "win32") {
|
|
544
|
-
killTimer = setTimeout(() => {
|
|
545
|
-
pendingTermination = terminateSpawnedChild(child, "SIGKILL");
|
|
546
|
-
}, 2_000);
|
|
547
|
-
}
|
|
548
|
-
};
|
|
549
|
-
const recordStdinError = (error) => {
|
|
550
|
-
const stdinError = error instanceof Error ? error : new Error(String(error));
|
|
551
|
-
const errorCode = stdinError.code;
|
|
552
|
-
if (errorCode === "EPIPE" || errorCode === "EOF" || errorCode === "ERR_STREAM_DESTROYED") {
|
|
553
|
-
return;
|
|
554
|
-
}
|
|
555
|
-
if (!spawnError) {
|
|
556
|
-
spawnError = stdinError;
|
|
557
|
-
}
|
|
558
|
-
};
|
|
559
|
-
const writeChildStdin = () => {
|
|
560
|
-
if (aborted || signal?.aborted) {
|
|
561
|
-
child.stdin.destroy();
|
|
562
|
-
return;
|
|
563
|
-
}
|
|
564
|
-
try {
|
|
565
|
-
if (stdin) {
|
|
566
|
-
child.stdin.write(stdin);
|
|
567
|
-
}
|
|
568
|
-
child.stdin.end();
|
|
569
|
-
}
|
|
570
|
-
catch (error) {
|
|
571
|
-
recordStdinError(error);
|
|
572
|
-
child.stdin.destroy();
|
|
573
|
-
}
|
|
574
|
-
};
|
|
575
|
-
child.stdin.on("error", recordStdinError);
|
|
576
|
-
child.once("error", (error) => {
|
|
577
|
-
spawnError = error instanceof Error ? error : new Error(String(error));
|
|
578
|
-
finish(resolveSpawnedChildExitCode({
|
|
579
|
-
useExitFallback: false,
|
|
580
|
-
timedOut,
|
|
581
|
-
spawnError,
|
|
582
|
-
}));
|
|
583
|
-
});
|
|
584
|
-
completionWatcher = watchSpawnedChildCompletion(child, {
|
|
585
|
-
graceMs: EXIT_STDIO_GRACE_MS,
|
|
586
|
-
onComplete: finish,
|
|
587
|
-
getContext: () => ({ timedOut, spawnError }),
|
|
588
|
-
});
|
|
589
|
-
child.stdout.on("data", (chunk) => {
|
|
590
|
-
queueStdoutChunk(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
591
|
-
});
|
|
592
|
-
child.stderr.on("data", (chunk) => {
|
|
593
|
-
stderr = appendTail(stderr, chunk.toString(), MAX_BUFFERED_STDERR_CHARS);
|
|
594
|
-
});
|
|
595
|
-
if (timeoutMs > 0) {
|
|
596
|
-
timeoutTimer = setTimeout(() => terminateChild("timeout"), timeoutMs);
|
|
597
|
-
timeoutTimer.unref?.();
|
|
598
|
-
}
|
|
599
|
-
if (signal) {
|
|
600
|
-
abortListener = () => terminateChild(deadlineExpired() ? "timeout" : "abort");
|
|
601
|
-
signal.addEventListener("abort", abortListener, { once: true });
|
|
602
|
-
if (signal.aborted)
|
|
603
|
-
abortListener();
|
|
604
|
-
}
|
|
605
|
-
writeChildStdin();
|
|
180
|
+
}
|
|
181
|
+
const restoreOptions = restoreOptionsForProcess(options);
|
|
182
|
+
const policyError = () => getManagedPreSpawnPolicyError(restoreOptions, options.managedStateCurrentPageUrl, options.managedStatePageUrlUnknown, options.nativeConfirmationDecision);
|
|
183
|
+
const planningError = policyError();
|
|
184
|
+
if (planningError !== undefined) {
|
|
185
|
+
return failureResult(planningError);
|
|
186
|
+
}
|
|
187
|
+
const prepared = await prepareProcessEnvironment(restoreOptions);
|
|
188
|
+
// Cancellation can arrive while filesystem validation is suspended.
|
|
189
|
+
// oxlint-disable-next-line typescript/no-unnecessary-condition
|
|
190
|
+
if (signal && signal.aborted) {
|
|
191
|
+
return cancelledResult();
|
|
192
|
+
}
|
|
193
|
+
if (prepared.error !== undefined) {
|
|
194
|
+
return failureResult(prepared.error);
|
|
195
|
+
}
|
|
196
|
+
const stockLauncher = resolveWindowsStockLauncher(options.cwd, prepared.env);
|
|
197
|
+
// A reentrant launch/environment observer can cancel during synchronous launch preparation.
|
|
198
|
+
// oxlint-disable-next-line typescript/no-unnecessary-condition
|
|
199
|
+
if (signal && signal.aborted) {
|
|
200
|
+
return cancelledResult();
|
|
201
|
+
}
|
|
202
|
+
return await runBrowserChild({
|
|
203
|
+
args: effectiveBrowserSpawnArgs(options.args, prepared.userAgent, options.preserveAttachedBrowserSession),
|
|
204
|
+
cwd: options.cwd,
|
|
205
|
+
env: prepared.env,
|
|
206
|
+
stockLauncher,
|
|
207
|
+
signal,
|
|
208
|
+
stdin: options.stdin,
|
|
209
|
+
timeoutMs,
|
|
210
|
+
deadlineExpired,
|
|
211
|
+
policyError,
|
|
212
|
+
onStarted: () => {
|
|
213
|
+
commitManagedSessionRestoreSuppression(restoreOptions);
|
|
214
|
+
},
|
|
606
215
|
});
|
|
607
216
|
}
|