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
|
@@ -1,833 +1,60 @@
|
|
|
1
|
-
import { cleanupElectronLaunchResources, inspectElectronLaunchStatus } from "../../electron/cleanup.js";
|
|
2
|
-
import { discoverElectronApps } from "../../electron/discovery.js";
|
|
3
|
-
import { boundElectronProbeString } from "../../electron/cdp.js";
|
|
4
|
-
import { buildOwnedManagedSessionRestoreContext, withOwnedManagedSessionContext, } from "../../managed-session-restore.js";
|
|
5
|
-
import { getPageTargetValidationError } from "../../page-target-validation.js";
|
|
6
|
-
import { isRecord } from "../../parsing.js";
|
|
7
|
-
import { getBrowserResultMessage } from "../../browser-transcript.js";
|
|
8
1
|
import { withAttachedBrowserSessionContext } from "../../process.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
import { buildElectronIdentifiers, buildElectronMismatchNextActions, buildElectronSessionMismatch, extractStringResultField, findElectronLaunchRecordForSession, formatElectronSessionMismatchText, getActiveElectronRecords, getLiveElectronRendererTargets, runSessionCommandData, } from "../browser-run/session-state.js";
|
|
19
|
-
const ELECTRON_PROFILE_ISOLATION_NOTE = "Profile note: electron.launch starts an isolated temporary profile; it does not reuse the app's normal signed-in profile or attach to an already-running authenticated app.";
|
|
20
|
-
const ELECTRON_EXISTING_AUTH_GUIDANCE = "For already-authenticated desktop app content, do not stop here: if host tools are allowed and the app is not running, launch the normal app with --remote-debugging-port=<port>, verify the port, then run agent_browser connect <port>; if it is already running without a debug port, ask before relaunching it.";
|
|
21
|
-
export const ELECTRON_PROFILE_ISOLATION_DETAILS = {
|
|
22
|
-
attachesToAlreadyRunningApp: false,
|
|
23
|
-
existingAuthenticatedAppGuidance: ELECTRON_EXISTING_AUTH_GUIDANCE,
|
|
24
|
-
hostDebugLaunchExample: "macOS: open -a <App Name> --args --remote-debugging-port=9222 --remote-allow-origins='*'; then agent_browser connect 9222 with sessionMode=fresh",
|
|
25
|
-
isolatedLaunch: true,
|
|
26
|
-
note: ELECTRON_PROFILE_ISOLATION_NOTE,
|
|
27
|
-
reusesExistingSignedInProfile: false,
|
|
28
|
-
};
|
|
2
|
+
import { getSessionPageStateKey } from "../../session-page-state.js";
|
|
3
|
+
import { buildElectronHostFailureResult } from "../browser-run/final-result-electron.js";
|
|
4
|
+
import { selectElectronRecords } from "./branch.js";
|
|
5
|
+
import { cleanupTrackedElectronHostLaunches } from "./cleanup.js";
|
|
6
|
+
import { buildElectronCleanupResult } from "./cleanup-result.js";
|
|
7
|
+
import { discoverElectronHostApps } from "./discovery.js";
|
|
8
|
+
export { ELECTRON_PROFILE_ISOLATION_DETAILS } from "./discovery.js";
|
|
9
|
+
export { restoreElectronLaunchRecordsFromBranch } from "./branch.js";
|
|
10
|
+
export { cleanupActiveElectronHostLaunches, cleanupTrackedElectronHostLaunches, } from "./cleanup.js";
|
|
29
11
|
export const ELECTRON_POST_COMMAND_STATUS_SETTLE_MS = 250;
|
|
30
|
-
|
|
31
|
-
const
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
for (const app of visibleApps) {
|
|
46
|
-
const identifier = app.bundleId ?? app.desktopId;
|
|
47
|
-
const path = app.appPath ?? app.executablePath;
|
|
48
|
-
const sensitivity = app.sensitivity ? ` [likely sensitive: ${app.sensitivity.categories.join(", ")}]` : "";
|
|
49
|
-
lines.push(`- ${app.name}${identifier ? ` (${identifier})` : ""}${sensitivity} — ${path}`);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
if (visibleOmittedCount > 0) {
|
|
53
|
-
lines.push(`${visibleOmittedCount} additional app(s) omitted from visible output; see details.electron.apps.`);
|
|
54
|
-
}
|
|
55
|
-
if (result.omittedCount > 0) {
|
|
56
|
-
lines.push(`${result.omittedCount} app(s) omitted by maxResults=${result.maxResults}.`);
|
|
57
|
-
}
|
|
58
|
-
if (result.apps.some((app) => app.sensitivity?.level === "likely-sensitive")) {
|
|
59
|
-
lines.push("Review likely-sensitive apps and use caller-owned allow/deny policy before launch.");
|
|
60
|
-
lines.push(ELECTRON_PROFILE_ISOLATION_NOTE);
|
|
61
|
-
lines.push(ELECTRON_EXISTING_AUTH_GUIDANCE);
|
|
62
|
-
}
|
|
63
|
-
return lines.join("\n");
|
|
64
|
-
}
|
|
65
|
-
function buildElectronListSuccessResult(compiledElectron, discovery) {
|
|
66
|
-
const text = redactSensitiveText(formatElectronListVisibleText(discovery));
|
|
67
|
-
const sensitiveAppCount = discovery.apps.filter((app) => app.sensitivity?.level === "likely-sensitive").length;
|
|
68
|
-
const details = {
|
|
69
|
-
args: [],
|
|
70
|
-
compiledElectron,
|
|
71
|
-
electron: {
|
|
72
|
-
action: "list",
|
|
73
|
-
apps: discovery.apps,
|
|
74
|
-
maxResults: discovery.maxResults,
|
|
75
|
-
omittedCount: discovery.omittedCount || undefined,
|
|
76
|
-
platform: discovery.platform,
|
|
77
|
-
profileIsolation: ELECTRON_PROFILE_ISOLATION_DETAILS,
|
|
78
|
-
query: discovery.query,
|
|
79
|
-
sensitiveAppCount: sensitiveAppCount || undefined,
|
|
80
|
-
skippedCount: discovery.skippedCount,
|
|
81
|
-
status: "succeeded",
|
|
82
|
-
},
|
|
83
|
-
...buildAgentBrowserResultCategoryDetails({ args: [], succeeded: true }),
|
|
84
|
-
summary: discovery.omittedCount > 0
|
|
85
|
-
? `Electron app discovery found ${discovery.apps.length} app(s) and omitted ${discovery.omittedCount}.`
|
|
86
|
-
: `Electron app discovery found ${discovery.apps.length} app(s).`,
|
|
87
|
-
};
|
|
88
|
-
return {
|
|
89
|
-
content: [{ type: "text", text }],
|
|
90
|
-
details: redactToolDetails(details, []),
|
|
91
|
-
isError: false,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
function buildElectronListFailureResult(compiledElectron, error) {
|
|
95
|
-
const errorText = error instanceof Error ? error.message : String(error);
|
|
96
|
-
const text = redactSensitiveText(`Electron app discovery failed: ${errorText}`);
|
|
97
|
-
const details = {
|
|
98
|
-
args: [],
|
|
99
|
-
compiledElectron,
|
|
100
|
-
electron: {
|
|
101
|
-
action: "list",
|
|
102
|
-
error: errorText,
|
|
103
|
-
status: "failed",
|
|
104
|
-
},
|
|
105
|
-
...buildAgentBrowserResultCategoryDetails({ args: [], errorText, succeeded: false }),
|
|
106
|
-
summary: "Electron app discovery failed.",
|
|
107
|
-
};
|
|
108
|
-
return {
|
|
109
|
-
content: [{ type: "text", text }],
|
|
110
|
-
details: redactToolDetails(details, []),
|
|
111
|
-
isError: true,
|
|
112
|
-
};
|
|
113
|
-
}
|
|
114
|
-
function isElectronLaunchRecord(value) {
|
|
115
|
-
if (!isRecord(value))
|
|
116
|
-
return false;
|
|
117
|
-
return value.version === 1 &&
|
|
118
|
-
value.launchedByWrapper === true &&
|
|
119
|
-
(value.namespace === undefined || typeof value.namespace === "string") &&
|
|
120
|
-
typeof value.launchId === "string" &&
|
|
121
|
-
typeof value.appName === "string" &&
|
|
122
|
-
typeof value.executablePath === "string" &&
|
|
123
|
-
typeof value.userDataDir === "string" &&
|
|
124
|
-
typeof value.port === "number" &&
|
|
125
|
-
typeof value.createdAtMs === "number";
|
|
126
|
-
}
|
|
127
|
-
export function restoreElectronLaunchRecordsFromBranch(branch) {
|
|
128
|
-
const records = new Map();
|
|
129
|
-
for (const entry of branch) {
|
|
130
|
-
const message = getBrowserResultMessage(entry);
|
|
131
|
-
if (!message)
|
|
132
|
-
continue;
|
|
133
|
-
const details = isRecord(message.details) ? message.details : undefined;
|
|
134
|
-
const electron = isRecord(details?.electron) ? details.electron : undefined;
|
|
135
|
-
if (!electron)
|
|
136
|
-
continue;
|
|
137
|
-
const namespace = typeof details?.namespace === "string" ? details.namespace : undefined;
|
|
138
|
-
const launch = isElectronLaunchRecord(electron.launch) ? electron.launch : undefined;
|
|
139
|
-
if (launch)
|
|
140
|
-
records.set(launch.launchId, { ...launch, namespace: launch.namespace ?? namespace });
|
|
141
|
-
const cleanupRecords = isRecord(electron.cleanup) && Array.isArray(electron.cleanup.records) ? electron.cleanup.records : [];
|
|
142
|
-
for (const cleanupRecord of cleanupRecords) {
|
|
143
|
-
if (isElectronLaunchRecord(cleanupRecord))
|
|
144
|
-
records.set(cleanupRecord.launchId, { ...cleanupRecord, namespace: cleanupRecord.namespace ?? namespace });
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
return records;
|
|
148
|
-
}
|
|
149
|
-
function selectElectronRecords(compiledElectron, records) {
|
|
150
|
-
if (compiledElectron.launchId) {
|
|
151
|
-
const record = records.get(compiledElectron.launchId);
|
|
152
|
-
return record ? { records: [record] } : { error: `No wrapper-tracked Electron launch found for launchId ${compiledElectron.launchId}.` };
|
|
153
|
-
}
|
|
154
|
-
if (compiledElectron.all)
|
|
155
|
-
return { records: getActiveElectronRecords(records) };
|
|
156
|
-
const activeRecords = getActiveElectronRecords(records);
|
|
157
|
-
if (activeRecords.length === 0)
|
|
158
|
-
return { records: [] };
|
|
159
|
-
if (activeRecords.length > 1)
|
|
160
|
-
return { error: "Multiple wrapper-tracked Electron launches are active; pass electron.launchId or electron.all." };
|
|
161
|
-
return { records: activeRecords };
|
|
162
|
-
}
|
|
163
|
-
function extractTargetsFromStatus(statuses) {
|
|
164
|
-
return statuses.flatMap((status) => status.targets);
|
|
165
|
-
}
|
|
166
|
-
function formatElectronStatusVisibleText(statuses, records, mismatches = [], managedSessions = []) {
|
|
167
|
-
if (statuses.length === 0)
|
|
168
|
-
return "Electron status: no active wrapper-tracked launches.";
|
|
169
|
-
const recordsByLaunchId = new Map(records.map((record) => [record.launchId, record]));
|
|
170
|
-
const managedSessionsByName = new Map(managedSessions.map((managedSession) => [managedSession.sessionName, managedSession]));
|
|
171
|
-
const lines = [`Electron status: ${statuses.length} wrapper-tracked launch(es).`];
|
|
172
|
-
for (const status of statuses) {
|
|
173
|
-
const record = recordsByLaunchId.get(status.launchId);
|
|
174
|
-
const sessionName = record?.sessionName;
|
|
175
|
-
const appName = record?.appName ?? "Electron launch";
|
|
176
|
-
const sessionText = sessionName ? `, sessionName ${sessionName}` : "";
|
|
177
|
-
const historyText = status.cleanupState === "cleaned" ? "; historical cleaned launch record" : "";
|
|
178
|
-
lines.push(`- ${status.launchId}: ${appName}${sessionText}${historyText}; ${status.portAlive ? "debug port alive" : "debug port dead"}${status.pidAlive === undefined ? "" : status.pidAlive ? ", pid alive" : ", pid dead"} (port ${status.port})`);
|
|
179
|
-
lines.push(` Tracked profile path: ${status.userDataDirState}.`);
|
|
180
|
-
lines.push(` Identifiers: launchId ${status.launchId}; sessionName ${sessionName ?? "not attached"}.`);
|
|
181
|
-
for (const targetLine of formatElectronTargetLines(status.targets, 4))
|
|
182
|
-
lines.push(` ${targetLine}`);
|
|
183
|
-
const managedSession = sessionName ? managedSessionsByName.get(sessionName) : undefined;
|
|
184
|
-
if (managedSession?.error)
|
|
185
|
-
lines.push(` Managed session warning: ${managedSession.error}`);
|
|
12
|
+
function preservesAttachedSession(options) {
|
|
13
|
+
const currentKey = getSessionPageStateKey(options.managedSessionName, options.managedSessionNamespace) ??
|
|
14
|
+
options.managedSessionName;
|
|
15
|
+
return (options.attachedSessionKeys.has(currentKey) ||
|
|
16
|
+
[...options.electronLaunchRecords.values()].some((record) => record.sessionName !== undefined &&
|
|
17
|
+
options.attachedSessionKeys.has(getSessionPageStateKey(record.sessionName, record.namespace) ?? record.sessionName)));
|
|
18
|
+
}
|
|
19
|
+
async function cleanupElectronHostInput(options, input, visibleInput) {
|
|
20
|
+
const selection = selectElectronRecords(input, options.electronLaunchRecords);
|
|
21
|
+
if (selection.error !== undefined && selection.error.length > 0) {
|
|
22
|
+
return buildElectronHostFailureResult({
|
|
23
|
+
compiledElectron: visibleInput,
|
|
24
|
+
errorText: selection.error,
|
|
25
|
+
failureCategory: "validation-error",
|
|
26
|
+
});
|
|
186
27
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
function buildElectronStatusResult(options) {
|
|
192
|
-
const baseNextActions = options.records.flatMap((record) => buildAgentBrowserNextActions({
|
|
193
|
-
electron: { launchId: record.launchId, sessionName: record.sessionName, status: record.cleanupState },
|
|
194
|
-
resultCategory: "success",
|
|
195
|
-
successCategory: "completed",
|
|
196
|
-
}) ?? []);
|
|
197
|
-
const mismatchNextActions = (options.mismatches ?? []).flatMap((mismatch) => {
|
|
198
|
-
const record = options.records.find((candidate) => candidate.launchId === mismatch.launchId);
|
|
199
|
-
return record ? buildElectronMismatchNextActions(record, mismatch.liveTarget) : [];
|
|
28
|
+
const results = await cleanupTrackedElectronHostLaunches({
|
|
29
|
+
...options,
|
|
30
|
+
records: selection.records ?? [],
|
|
31
|
+
timeoutMs: input.timeoutMs ?? options.implicitSessionCloseTimeoutMs,
|
|
200
32
|
});
|
|
201
|
-
|
|
202
|
-
? appendUniqueAgentBrowserNextActions([...mismatchNextActions], baseNextActions)
|
|
203
|
-
: appendUniqueAgentBrowserNextActions([...baseNextActions], mismatchNextActions);
|
|
204
|
-
const details = {
|
|
205
|
-
args: [],
|
|
206
|
-
compiledElectron: options.compiledElectron,
|
|
207
|
-
electron: {
|
|
208
|
-
action: "status",
|
|
209
|
-
identifierList: options.records.length > 1 ? options.records.map(buildElectronIdentifiers) : undefined,
|
|
210
|
-
identifiers: options.records.length === 1 && options.records[0] ? buildElectronIdentifiers(options.records[0]) : undefined,
|
|
211
|
-
launches: options.records,
|
|
212
|
-
managedSession: options.managedSessions?.length === 1 ? options.managedSessions[0] : undefined,
|
|
213
|
-
managedSessions: options.managedSessions && options.managedSessions.length > 0 ? options.managedSessions : undefined,
|
|
214
|
-
sessionMismatch: options.mismatches?.length === 1 ? options.mismatches[0] : undefined,
|
|
215
|
-
sessionMismatches: options.mismatches && options.mismatches.length > 1 ? options.mismatches : undefined,
|
|
216
|
-
status: "succeeded",
|
|
217
|
-
statuses: options.statuses,
|
|
218
|
-
targets: extractTargetsFromStatus(options.statuses),
|
|
219
|
-
},
|
|
220
|
-
nextActions: nextActions.length > 0 ? nextActions : undefined,
|
|
221
|
-
...buildAgentBrowserResultCategoryDetails({ args: [], succeeded: true }),
|
|
222
|
-
summary: options.statuses.length === 0 ? "Electron status found no active wrapper-tracked launches." : `Electron status inspected ${options.statuses.length} launch(es).`,
|
|
223
|
-
};
|
|
224
|
-
return { content: [{ type: "text", text: redactSensitiveText(formatElectronStatusVisibleText(options.statuses, options.records, options.mismatches, options.managedSessions)) }], details: redactToolDetails(details, []), isError: false };
|
|
33
|
+
return buildElectronCleanupResult(visibleInput, results);
|
|
225
34
|
}
|
|
226
|
-
function
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
for (const result of results) {
|
|
231
|
-
lines.push(`- ${result.summary}`);
|
|
232
|
-
for (const step of result.steps)
|
|
233
|
-
lines.push(` - ${step.resource}: ${step.state}${step.error ? ` (${step.error})` : ""}`);
|
|
234
|
-
}
|
|
235
|
-
return lines.join("\n");
|
|
236
|
-
}
|
|
237
|
-
function buildElectronCleanupResult(compiledElectron, cleanupResults) {
|
|
238
|
-
const partial = cleanupResults.some((result) => result.partial);
|
|
239
|
-
const records = cleanupResults.map((result) => result.record);
|
|
240
|
-
const nextActions = cleanupResults.flatMap((result) => buildAgentBrowserNextActions({
|
|
241
|
-
electron: { launchId: result.launchId, sessionName: result.record.sessionName, status: result.record.cleanupState },
|
|
242
|
-
failureCategory: partial ? "cleanup-failed" : undefined,
|
|
243
|
-
resultCategory: partial ? "failure" : "success",
|
|
244
|
-
successCategory: partial ? undefined : "completed",
|
|
245
|
-
}) ?? []);
|
|
246
|
-
const errorText = partial ? cleanupResults.map((result) => result.summary).join("\n") : undefined;
|
|
247
|
-
const details = {
|
|
248
|
-
args: [],
|
|
249
|
-
compiledElectron,
|
|
250
|
-
electron: {
|
|
251
|
-
action: "cleanup",
|
|
252
|
-
cleanup: { partial, records, results: cleanupResults },
|
|
253
|
-
status: partial ? "partial" : "succeeded",
|
|
254
|
-
},
|
|
255
|
-
nextActions: nextActions.length > 0 ? nextActions : undefined,
|
|
256
|
-
...buildAgentBrowserResultCategoryDetails({ args: [], errorText, failureCategory: partial ? "cleanup-failed" : undefined, succeeded: !partial }),
|
|
257
|
-
summary: partial ? "Electron cleanup was partial." : "Electron cleanup completed.",
|
|
258
|
-
};
|
|
259
|
-
return { content: [{ type: "text", text: redactSensitiveText(formatElectronCleanupVisibleText(cleanupResults)) }], details: redactToolDetails(details, []), isError: partial };
|
|
260
|
-
}
|
|
261
|
-
const ELECTRON_FOCUSED_ELEMENT_EVAL = `(() => {
|
|
262
|
-
const clean = (value, max = 80) => {
|
|
263
|
-
if (typeof value !== "string") return undefined;
|
|
264
|
-
const normalized = value.replace(/\\s+/g, " ").trim();
|
|
265
|
-
if (!normalized) return undefined;
|
|
266
|
-
return normalized.length > max ? normalized.slice(0, max - 3) + "..." : normalized;
|
|
267
|
-
};
|
|
268
|
-
const describeElement = (element) => {
|
|
269
|
-
if (!element || !(element instanceof Element)) return undefined;
|
|
270
|
-
const tagName = element.tagName.toLowerCase();
|
|
271
|
-
const inputLike = element instanceof HTMLInputElement || element instanceof HTMLTextAreaElement || element instanceof HTMLSelectElement;
|
|
272
|
-
const contentEditable = element instanceof HTMLElement && element.isContentEditable;
|
|
273
|
-
const containerLike = tagName === "body" || tagName === "html";
|
|
274
|
-
const rawText = element.textContent || "";
|
|
275
|
-
const exposeText = !inputLike && !contentEditable && !containerLike;
|
|
276
|
-
const text = exposeText ? clean(rawText) : undefined;
|
|
277
|
-
return {
|
|
278
|
-
tagName: clean(tagName, 40),
|
|
279
|
-
role: clean(element.getAttribute("role") || "", 60),
|
|
280
|
-
name: clean(element.getAttribute("aria-label") || element.getAttribute("title") || text || "", 80),
|
|
281
|
-
id: clean(element.id || "", 80),
|
|
282
|
-
type: clean(element.getAttribute("type") || "", 40),
|
|
283
|
-
placeholder: clean(element.getAttribute("placeholder") || "", 80),
|
|
284
|
-
ariaLabel: clean(element.getAttribute("aria-label") || "", 80),
|
|
285
|
-
title: clean(element.getAttribute("title") || "", 80),
|
|
286
|
-
textLength: !exposeText && rawText ? rawText.length : undefined,
|
|
287
|
-
textPreview: text,
|
|
288
|
-
valueLength: inputLike && typeof element.value === "string" ? element.value.length : undefined,
|
|
289
|
-
isContentEditable: contentEditable || undefined,
|
|
290
|
-
};
|
|
291
|
-
};
|
|
292
|
-
return { focusedElement: describeElement(document.activeElement) };
|
|
293
|
-
})()`;
|
|
294
|
-
function getTrimmedString(value) {
|
|
295
|
-
return typeof value === "string" ? boundElectronProbeString(value) : undefined;
|
|
296
|
-
}
|
|
297
|
-
function getOptionalBoolean(value) {
|
|
298
|
-
return typeof value === "boolean" ? value : undefined;
|
|
299
|
-
}
|
|
300
|
-
function getOptionalNumber(value) {
|
|
301
|
-
return typeof value === "number" && Number.isFinite(value) ? value : undefined;
|
|
302
|
-
}
|
|
303
|
-
function extractElectronFocusedElement(data) {
|
|
304
|
-
const payload = isRecord(data) && isRecord(data.result) ? data.result : data;
|
|
305
|
-
const rawFocusedElement = isRecord(payload) && isRecord(payload.focusedElement) ? payload.focusedElement : isRecord(payload) ? payload : undefined;
|
|
306
|
-
if (!rawFocusedElement)
|
|
307
|
-
return undefined;
|
|
308
|
-
const focusedElement = {
|
|
309
|
-
ariaLabel: getTrimmedString(rawFocusedElement.ariaLabel),
|
|
310
|
-
id: getTrimmedString(rawFocusedElement.id),
|
|
311
|
-
isContentEditable: getOptionalBoolean(rawFocusedElement.isContentEditable),
|
|
312
|
-
name: getTrimmedString(rawFocusedElement.name),
|
|
313
|
-
placeholder: getTrimmedString(rawFocusedElement.placeholder),
|
|
314
|
-
role: getTrimmedString(rawFocusedElement.role),
|
|
315
|
-
tagName: getTrimmedString(rawFocusedElement.tagName),
|
|
316
|
-
textLength: getOptionalNumber(rawFocusedElement.textLength),
|
|
317
|
-
textPreview: getTrimmedString(rawFocusedElement.textPreview),
|
|
318
|
-
title: getTrimmedString(rawFocusedElement.title),
|
|
319
|
-
type: getTrimmedString(rawFocusedElement.type),
|
|
320
|
-
valueLength: getOptionalNumber(rawFocusedElement.valueLength),
|
|
321
|
-
};
|
|
322
|
-
return Object.values(focusedElement).some((value) => value !== undefined) ? focusedElement : undefined;
|
|
323
|
-
}
|
|
324
|
-
function extractElectronProbeTabs(data) {
|
|
325
|
-
const rawTabs = isRecord(data) && Array.isArray(data.tabs) ? data.tabs : Array.isArray(data) ? data : [];
|
|
326
|
-
const allTabs = rawTabs.filter(isRecord).map((tab, index) => ({
|
|
327
|
-
active: getOptionalBoolean(tab.active),
|
|
328
|
-
index: typeof tab.index === "number" && Number.isInteger(tab.index) ? tab.index : index,
|
|
329
|
-
tabId: getTrimmedString(tab.tabId) ?? getTrimmedString(tab.id),
|
|
330
|
-
title: getTrimmedString(tab.title) ?? getTrimmedString(tab.label),
|
|
331
|
-
type: getTrimmedString(tab.type),
|
|
332
|
-
url: getTrimmedString(tab.url),
|
|
333
|
-
}));
|
|
334
|
-
if (allTabs.length === 0)
|
|
335
|
-
return {};
|
|
336
|
-
const shown = allTabs.slice(0, ELECTRON_PROBE_MAX_TABS);
|
|
337
|
-
return {
|
|
338
|
-
activeTab: allTabs.find((tab) => tab.active) ?? allTabs[0],
|
|
339
|
-
tabs: {
|
|
340
|
-
omittedCount: allTabs.length > shown.length ? allTabs.length - shown.length : undefined,
|
|
341
|
-
shown,
|
|
342
|
-
total: allTabs.length,
|
|
343
|
-
},
|
|
344
|
-
};
|
|
345
|
-
}
|
|
346
|
-
function truncateElectronProbeSnapshotText(snapshotText) {
|
|
347
|
-
if (!snapshotText)
|
|
348
|
-
return { lineCount: 0 };
|
|
349
|
-
const lines = snapshotText.split(/\r?\n/);
|
|
350
|
-
const shownLines = [];
|
|
351
|
-
let usedChars = 0;
|
|
352
|
-
for (const line of lines) {
|
|
353
|
-
if (shownLines.length >= ELECTRON_PROBE_MAX_SNAPSHOT_LINES)
|
|
354
|
-
break;
|
|
355
|
-
const nextLength = usedChars + line.length + (shownLines.length > 0 ? 1 : 0);
|
|
356
|
-
if (nextLength > ELECTRON_PROBE_MAX_SNAPSHOT_CHARS) {
|
|
357
|
-
if (shownLines.length === 0)
|
|
358
|
-
shownLines.push(`${line.slice(0, ELECTRON_PROBE_MAX_SNAPSHOT_CHARS - 3)}...`);
|
|
359
|
-
break;
|
|
360
|
-
}
|
|
361
|
-
shownLines.push(line);
|
|
362
|
-
usedChars = nextLength;
|
|
35
|
+
async function handleElectronHostInputInContext(options) {
|
|
36
|
+
const input = options.compiledElectron;
|
|
37
|
+
if (!input) {
|
|
38
|
+
return;
|
|
363
39
|
}
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
const refSnapshot = extractRefSnapshotFromData(data);
|
|
372
|
-
const rawSnapshotText = isRecord(data) ? getTrimmedString(data.snapshot) : undefined;
|
|
373
|
-
const truncatedText = truncateElectronProbeSnapshotText(rawSnapshotText);
|
|
374
|
-
const refIds = refSnapshot?.refIds ?? [];
|
|
375
|
-
const shownRefIds = refIds.slice(0, ELECTRON_PROBE_MAX_REF_IDS);
|
|
376
|
-
const snapshot = refSnapshot || truncatedText.text
|
|
377
|
-
? {
|
|
378
|
-
lineCount: truncatedText.lineCount,
|
|
379
|
-
omittedLineCount: truncatedText.omittedLineCount,
|
|
380
|
-
omittedRefCount: refIds.length > shownRefIds.length ? refIds.length - shownRefIds.length : undefined,
|
|
381
|
-
refCount: refIds.length,
|
|
382
|
-
refIds: shownRefIds,
|
|
383
|
-
text: truncatedText.text,
|
|
40
|
+
const visibleInput = options.redactedCompiledElectron ?? input;
|
|
41
|
+
switch (input.action) {
|
|
42
|
+
case "list":
|
|
43
|
+
return discoverElectronHostApps(input, visibleInput);
|
|
44
|
+
case "status": {
|
|
45
|
+
const { inspectElectronHostLaunches } = await import("./status.js");
|
|
46
|
+
return inspectElectronHostLaunches(options, input, visibleInput);
|
|
384
47
|
}
|
|
385
|
-
:
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
function getElectronProbeSummary(probe) {
|
|
389
|
-
const parts = [
|
|
390
|
-
probe.title ? `title "${probe.title}"` : undefined,
|
|
391
|
-
probe.url ? `url ${probe.url}` : undefined,
|
|
392
|
-
probe.focusedElement ? "focused element" : undefined,
|
|
393
|
-
probe.tabs ? `${probe.tabs.total} tab(s)` : undefined,
|
|
394
|
-
probe.snapshot ? `${probe.snapshot.refCount} ref(s)` : undefined,
|
|
395
|
-
].filter((item) => item !== undefined);
|
|
396
|
-
return parts.length > 0 ? `Electron probe collected ${parts.join(", ")}.` : "Electron probe did not return current session state.";
|
|
397
|
-
}
|
|
398
|
-
class ElectronManagedSessionPolicyError extends Error {
|
|
399
|
-
}
|
|
400
|
-
async function withOwnedElectronManagedSessionPolicy(options, run) {
|
|
401
|
-
return withAgentBrowserProcessEnvironment({ AGENT_BROWSER_CONFIRM_ACTIONS: options.confirmActions }, async () => {
|
|
402
|
-
const autosavePolicyChangeError = getRunningHeadedAutosavePolicyChangeError(options.headedManagedAutosaveInterval);
|
|
403
|
-
if (autosavePolicyChangeError)
|
|
404
|
-
throw new ElectronManagedSessionPolicyError(autosavePolicyChangeError);
|
|
405
|
-
const context = buildOwnedManagedSessionRestoreContext({
|
|
406
|
-
args: ["--namespace", options.namespace ?? "", "--session", options.sessionName, ...options.args],
|
|
407
|
-
cwd: options.cwd,
|
|
408
|
-
headedManagedAutosaveDisabled: options.headedManagedAutosaveDisabled,
|
|
409
|
-
headedManagedAutosaveInterval: options.headedManagedAutosaveInterval,
|
|
410
|
-
managedSessionName: options.sessionName,
|
|
411
|
-
namespace: options.namespace,
|
|
412
|
-
restoreState: options.restoreState,
|
|
413
|
-
});
|
|
414
|
-
if (!context)
|
|
415
|
-
throw new ElectronManagedSessionPolicyError("Electron helper could not establish wrapper ownership for its managed session.");
|
|
416
|
-
let policy;
|
|
417
|
-
try {
|
|
418
|
-
policy = await acquireOwnedManagedSessionDaemonPolicy({ context, electronLaunchRecord: options.electronLaunchRecord, electronVerificationTimeoutMs: options.timeoutMs, signal: options.signal });
|
|
48
|
+
case "probe": {
|
|
49
|
+
const { probeElectronHost } = await import("./probe.js");
|
|
50
|
+
return probeElectronHost(options, input, visibleInput);
|
|
419
51
|
}
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
if (policy.error)
|
|
425
|
-
throw new ElectronManagedSessionPolicyError(policy.error);
|
|
426
|
-
if (!policy.lock)
|
|
427
|
-
throw new ElectronManagedSessionPolicyError(options.signal?.aborted ? "Electron helper was aborted." : "Electron helper could not acquire managed-session policy coordination.");
|
|
428
|
-
return await withOwnedManagedSessionContext(context, run);
|
|
429
|
-
}
|
|
430
|
-
finally {
|
|
431
|
-
await policy.lock?.release();
|
|
432
|
-
}
|
|
433
|
-
});
|
|
434
|
-
}
|
|
435
|
-
async function collectOwnedElectronManagedSessionTarget(options) {
|
|
436
|
-
try {
|
|
437
|
-
const target = await withOwnedElectronManagedSessionPolicy({ ...options, args: ["get", "url"] }, async () => await collectElectronManagedSessionTarget({
|
|
438
|
-
cwd: options.cwd,
|
|
439
|
-
namespace: options.namespace,
|
|
440
|
-
sessionName: options.sessionName,
|
|
441
|
-
signal: options.signal,
|
|
442
|
-
timeoutMs: options.timeoutMs,
|
|
443
|
-
})) ?? { sessionName: options.sessionName };
|
|
444
|
-
return { ...target, namespace: options.namespace };
|
|
445
|
-
}
|
|
446
|
-
catch (error) {
|
|
447
|
-
return { error: error instanceof Error ? error.message : String(error), namespace: options.namespace, sessionName: options.sessionName };
|
|
448
|
-
}
|
|
449
|
-
}
|
|
450
|
-
async function runElectronProbeCommandData(options) {
|
|
451
|
-
try {
|
|
452
|
-
return { data: await runSessionCommandData({ ...options, pinNamespace: true, throwOnFailure: true }) };
|
|
453
|
-
}
|
|
454
|
-
catch (error) {
|
|
455
|
-
return { error: error instanceof Error ? error.message : String(error) };
|
|
52
|
+
case "cleanup":
|
|
53
|
+
return cleanupElectronHostInput(options, input, visibleInput);
|
|
54
|
+
case "launch":
|
|
55
|
+
return;
|
|
456
56
|
}
|
|
457
57
|
}
|
|
458
|
-
async function collectElectronProbe(options) {
|
|
459
|
-
const commandContext = { cwd: options.cwd, namespace: options.namespace, sessionName: options.sessionName, signal: options.signal, timeoutMs: options.timeoutMs };
|
|
460
|
-
const urlResult = await runElectronProbeCommandData({ ...commandContext, args: ["get", "url"] });
|
|
461
|
-
if (urlResult.error)
|
|
462
|
-
throw new Error(`get url: ${urlResult.error}`);
|
|
463
|
-
const url = boundElectronProbeString(extractStringResultField(urlResult.data, "result") ?? extractStringResultField(urlResult.data, "url"), 300);
|
|
464
|
-
if (!url)
|
|
465
|
-
throw new Error("get url returned no active page URL.");
|
|
466
|
-
const titleResult = await runElectronProbeCommandData({ ...commandContext, args: ["get", "title"] });
|
|
467
|
-
const focusedResult = await runElectronProbeCommandData({ ...commandContext, args: ["eval", "--stdin"], stdin: ELECTRON_FOCUSED_ELEMENT_EVAL });
|
|
468
|
-
const tabsResult = await runElectronProbeCommandData({ ...commandContext, args: ["tab", "list"] });
|
|
469
|
-
const snapshotResult = await runElectronProbeCommandData({ ...commandContext, args: ["snapshot", "-i"] });
|
|
470
|
-
const errors = [
|
|
471
|
-
titleResult.error ? `get title: ${titleResult.error}` : undefined,
|
|
472
|
-
focusedResult.error ? `focused element: ${focusedResult.error}` : undefined,
|
|
473
|
-
tabsResult.error ? `tab list: ${tabsResult.error}` : undefined,
|
|
474
|
-
snapshotResult.error ? `snapshot: ${snapshotResult.error}` : undefined,
|
|
475
|
-
].filter((item) => item !== undefined).map((error) => boundElectronProbeString(error, 240) ?? "probe command failed");
|
|
476
|
-
const title = boundElectronProbeString(extractStringResultField(titleResult.data, "result") ?? extractStringResultField(titleResult.data, "title"), 160);
|
|
477
|
-
const focusedElement = extractElectronFocusedElement(focusedResult.data);
|
|
478
|
-
const { activeTab, tabs } = extractElectronProbeTabs(tabsResult.data);
|
|
479
|
-
const { refSnapshot, snapshot } = summarizeElectronProbeSnapshot(snapshotResult.data);
|
|
480
|
-
if (errors.length > 0 && !(title || url || focusedElement || tabs || snapshot)) {
|
|
481
|
-
throw new Error(errors.join("; "));
|
|
482
|
-
}
|
|
483
|
-
const probeWithoutSummary = {
|
|
484
|
-
activeTab,
|
|
485
|
-
focusedElement,
|
|
486
|
-
errors: errors.length > 0 ? errors : undefined,
|
|
487
|
-
refSnapshot,
|
|
488
|
-
sessionName: options.sessionName,
|
|
489
|
-
snapshot,
|
|
490
|
-
status: errors.length === 0 && (title || url || focusedElement || tabs || snapshot) ? "succeeded" : "partial",
|
|
491
|
-
tabs,
|
|
492
|
-
title,
|
|
493
|
-
url,
|
|
494
|
-
};
|
|
495
|
-
return { ...probeWithoutSummary, summary: getElectronProbeSummary(probeWithoutSummary) };
|
|
496
|
-
}
|
|
497
|
-
function formatElectronProbeFocusedElement(focusedElement) {
|
|
498
|
-
if (!focusedElement)
|
|
499
|
-
return undefined;
|
|
500
|
-
const label = focusedElement.name ?? focusedElement.textPreview ?? focusedElement.placeholder ?? focusedElement.ariaLabel ?? focusedElement.title;
|
|
501
|
-
const descriptor = [focusedElement.role, focusedElement.tagName].filter(Boolean).join("/") || "element";
|
|
502
|
-
const suffix = [
|
|
503
|
-
focusedElement.id ? `#${focusedElement.id}` : undefined,
|
|
504
|
-
focusedElement.type ? `type=${focusedElement.type}` : undefined,
|
|
505
|
-
focusedElement.valueLength !== undefined ? `valueLength=${focusedElement.valueLength}` : undefined,
|
|
506
|
-
focusedElement.textLength !== undefined ? `textLength=${focusedElement.textLength}` : undefined,
|
|
507
|
-
].filter((item) => item !== undefined).join(", ");
|
|
508
|
-
return `Focused: ${descriptor}${label ? ` "${label}"` : ""}${suffix ? ` (${suffix})` : ""}`;
|
|
509
|
-
}
|
|
510
|
-
function formatElectronProbeContextText(context) {
|
|
511
|
-
if (context.mode === "launchId") {
|
|
512
|
-
return `Probe context: wrapper launch ${context.launchId} session ${context.sessionName}.`;
|
|
513
|
-
}
|
|
514
|
-
if (context.note) {
|
|
515
|
-
return `Probe context: current managed session ${context.sessionName}; ${context.note}`;
|
|
516
|
-
}
|
|
517
|
-
if (context.launchId) {
|
|
518
|
-
return `Probe context: current managed session ${context.sessionName} maps to Electron launch ${context.launchId}.`;
|
|
519
|
-
}
|
|
520
|
-
return `Probe context: current managed session ${context.sessionName} only; pass electron.probe.launchId to compare wrapper-tracked launch status.`;
|
|
521
|
-
}
|
|
522
|
-
function formatElectronProbeLaunchStatusText(status, probe) {
|
|
523
|
-
if (!status)
|
|
524
|
-
return undefined;
|
|
525
|
-
const lines = [`Launch status: ${status.portAlive ? "debug port alive" : "debug port dead"}${status.pidAlive === undefined ? "" : status.pidAlive ? ", pid alive" : ", pid dead"}; ${status.targets.length} CDP target(s).`];
|
|
526
|
-
if (isAboutBlankUrl(probe.url) && (!status.portAlive || status.pidAlive === false || getLiveElectronRendererTargets(status.targets).length === 0)) {
|
|
527
|
-
lines.push("Electron lifecycle warning: the browser session is on about:blank and the wrapper launch has no live renderer target to reattach. Run electron.status, cleanup if dead, or relaunch the app.");
|
|
528
|
-
}
|
|
529
|
-
return lines.join("\n");
|
|
530
|
-
}
|
|
531
|
-
function formatElectronProbeVisibleText(options) {
|
|
532
|
-
const { context, mismatch, probe, status } = options;
|
|
533
|
-
const page = [probe.title, probe.url].filter(Boolean).join(" — ");
|
|
534
|
-
const lines = [`Electron probe: ${page || probe.sessionName}`];
|
|
535
|
-
if (context)
|
|
536
|
-
lines.push(formatElectronProbeContextText(context));
|
|
537
|
-
const launchStatusText = formatElectronProbeLaunchStatusText(status, probe);
|
|
538
|
-
if (launchStatusText)
|
|
539
|
-
lines.push(launchStatusText);
|
|
540
|
-
if (mismatch)
|
|
541
|
-
lines.push(formatElectronSessionMismatchText(mismatch));
|
|
542
|
-
const focusedLine = formatElectronProbeFocusedElement(probe.focusedElement);
|
|
543
|
-
if (focusedLine)
|
|
544
|
-
lines.push(focusedLine);
|
|
545
|
-
if (probe.tabs) {
|
|
546
|
-
const active = probe.activeTab;
|
|
547
|
-
lines.push(`Tabs: ${probe.tabs.total} total${probe.tabs.omittedCount ? ` (${probe.tabs.omittedCount} omitted)` : ""}${active ? `; active ${active.index ?? "?"}: ${[active.title, active.url].filter(Boolean).join(" — ") || active.tabId || "tab"}` : ""}`);
|
|
548
|
-
}
|
|
549
|
-
if (probe.snapshot) {
|
|
550
|
-
lines.push(`Snapshot: ${probe.snapshot.refCount} interactive ref(s)${probe.snapshot.omittedRefCount ? ` (${probe.snapshot.omittedRefCount} ref id(s) omitted)` : ""}.`);
|
|
551
|
-
if (probe.snapshot.text)
|
|
552
|
-
lines.push(probe.snapshot.text);
|
|
553
|
-
if (probe.snapshot.omittedLineCount)
|
|
554
|
-
lines.push(`... ${probe.snapshot.omittedLineCount} snapshot line(s) omitted`);
|
|
555
|
-
}
|
|
556
|
-
if (probe.status === "partial")
|
|
557
|
-
lines.push("Some probe commands did not return data; use raw agent_browser commands for deeper diagnostics.");
|
|
558
|
-
if (probe.errors && probe.errors.length > 0)
|
|
559
|
-
lines.push(`Probe warning: ${probe.errors.slice(0, 2).join("; ")}${probe.errors.length > 2 ? "; ..." : ""}`);
|
|
560
|
-
return lines.join("\n");
|
|
561
|
-
}
|
|
562
|
-
function buildElectronProbeResult(options) {
|
|
563
|
-
const { refSnapshot: _refSnapshot, ...boundedProbe } = options.probe;
|
|
564
|
-
const baseNextActions = options.record ? buildAgentBrowserNextActions({
|
|
565
|
-
electron: { launchId: options.record.launchId, sessionName: options.record.sessionName, status: options.record.cleanupState },
|
|
566
|
-
resultCategory: "success",
|
|
567
|
-
successCategory: "completed",
|
|
568
|
-
}) ?? [] : [];
|
|
569
|
-
const mismatchNextActions = options.mismatch && options.record ? buildElectronMismatchNextActions(options.record, options.mismatch.liveTarget) : [];
|
|
570
|
-
const nextActions = options.mismatch
|
|
571
|
-
? appendUniqueAgentBrowserNextActions([...mismatchNextActions], baseNextActions)
|
|
572
|
-
: appendUniqueAgentBrowserNextActions([...baseNextActions], mismatchNextActions);
|
|
573
|
-
const details = {
|
|
574
|
-
args: [],
|
|
575
|
-
compiledElectron: options.compiledElectron,
|
|
576
|
-
electron: {
|
|
577
|
-
action: "probe",
|
|
578
|
-
identifiers: options.record ? buildElectronIdentifiers(options.record) : undefined,
|
|
579
|
-
probe: boundedProbe,
|
|
580
|
-
probeContext: options.probeContext,
|
|
581
|
-
sessionMismatch: options.mismatch,
|
|
582
|
-
status: options.probe.status,
|
|
583
|
-
statusTargets: options.status?.targets,
|
|
584
|
-
launchStatus: options.status,
|
|
585
|
-
},
|
|
586
|
-
nextActions: nextActions.length > 0 ? nextActions : undefined,
|
|
587
|
-
...buildAgentBrowserResultCategoryDetails({ args: [], succeeded: true }),
|
|
588
|
-
managedSessionHeadedAutosaveDisabled: options.headedManagedAutosaveDisabled === true ? true : undefined,
|
|
589
|
-
managedSessionHeadedAutosaveInterval: options.headedManagedAutosaveInterval,
|
|
590
|
-
namespace: options.namespace,
|
|
591
|
-
refSnapshot: options.probe.refSnapshot,
|
|
592
|
-
sessionName: options.probe.sessionName,
|
|
593
|
-
sessionTabTarget: options.sessionTabTarget,
|
|
594
|
-
summary: options.mismatch?.summary ?? options.probe.summary,
|
|
595
|
-
usedImplicitSession: options.probeContext.mode === "current-managed-session",
|
|
596
|
-
};
|
|
597
|
-
return {
|
|
598
|
-
content: [{ type: "text", text: redactSensitiveText(formatElectronProbeVisibleText({ context: options.probeContext, mismatch: options.mismatch, probe: options.probe, status: options.status })) }],
|
|
599
|
-
details: redactToolDetails(details, []),
|
|
600
|
-
isError: false,
|
|
601
|
-
};
|
|
602
|
-
}
|
|
603
|
-
export async function cleanupTrackedElectronHostLaunches(options) {
|
|
604
|
-
const results = [];
|
|
605
|
-
for (const record of options.records) {
|
|
606
|
-
const sessionKey = getSessionPageStateKey(record.sessionName, record.namespace) ?? record.sessionName;
|
|
607
|
-
const managedSessionOwner = sessionKey ? options.ownedManagedSessions.get(sessionKey) : undefined;
|
|
608
|
-
const managedSessionCloseError = record.sessionName
|
|
609
|
-
? await closeManagedSession({ confirmActions: options.sessionPageState.get(sessionKey ?? record.sessionName).confirmActions ?? process.env.AGENT_BROWSER_CONFIRM_ACTIONS, cwd: options.cwd, headedManagedAutosaveInterval: managedSessionOwner?.headedManagedAutosaveInterval, namespace: record.namespace, preserveAttachedBrowserSession: options.attachedSessionKeys.has(sessionKey ?? record.sessionName), restoreState: options.managedSessionRestoreState, sessionName: record.sessionName, socketDir: managedSessionOwner?.socketDir, timeoutMs: options.timeoutMs })
|
|
610
|
-
: undefined;
|
|
611
|
-
const managedSessionStep = record.sessionName
|
|
612
|
-
? managedSessionCloseError
|
|
613
|
-
? { error: managedSessionCloseError, resource: "managed-session", sessionName: record.sessionName, state: "failed" }
|
|
614
|
-
: { resource: "managed-session", sessionName: record.sessionName, state: "removed" }
|
|
615
|
-
: undefined;
|
|
616
|
-
const cleanupResult = await cleanupElectronLaunchResources({
|
|
617
|
-
child: options.electronChildProcesses.get(record.launchId),
|
|
618
|
-
record,
|
|
619
|
-
timeoutMs: options.timeoutMs,
|
|
620
|
-
});
|
|
621
|
-
const cleanupRecord = record.sessionName && !managedSessionCloseError
|
|
622
|
-
? { ...cleanupResult.record, sessionName: undefined }
|
|
623
|
-
: cleanupResult.record;
|
|
624
|
-
const result = managedSessionCloseError
|
|
625
|
-
? {
|
|
626
|
-
...cleanupResult,
|
|
627
|
-
partial: true,
|
|
628
|
-
record: { ...cleanupResult.record, cleanupState: "partial" },
|
|
629
|
-
remainingResources: [...new Set(["managed-session", ...cleanupResult.remainingResources])],
|
|
630
|
-
steps: [managedSessionStep, ...cleanupResult.steps].filter((step) => step !== undefined),
|
|
631
|
-
summary: `Electron cleanup for ${record.launchId} is partial; managed session close failed.`,
|
|
632
|
-
}
|
|
633
|
-
: {
|
|
634
|
-
...cleanupResult,
|
|
635
|
-
record: cleanupRecord,
|
|
636
|
-
steps: [managedSessionStep, ...cleanupResult.steps].filter((step) => step !== undefined),
|
|
637
|
-
};
|
|
638
|
-
results.push(result);
|
|
639
|
-
options.electronLaunchRecords.set(record.launchId, result.record);
|
|
640
|
-
if (!result.partial)
|
|
641
|
-
options.electronChildProcesses.delete(record.launchId);
|
|
642
|
-
}
|
|
643
|
-
return results;
|
|
644
|
-
}
|
|
645
|
-
export async function cleanupActiveElectronHostLaunches(options) {
|
|
646
|
-
const activeRecords = getActiveElectronRecords(options.electronLaunchRecords);
|
|
647
|
-
return activeRecords.length > 0
|
|
648
|
-
? cleanupTrackedElectronHostLaunches({ ...options, records: activeRecords })
|
|
649
|
-
: [];
|
|
650
|
-
}
|
|
651
58
|
export async function handleElectronHostInput(options) {
|
|
652
|
-
|
|
653
|
-
const preserveAttachedBrowserSession = options.attachedSessionKeys.has(currentSessionKey)
|
|
654
|
-
|| [...options.electronLaunchRecords.values()].some((record) => record.sessionName !== undefined && options.attachedSessionKeys.has(getSessionPageStateKey(record.sessionName, record.namespace) ?? record.sessionName));
|
|
655
|
-
return await withAttachedBrowserSessionContext(preserveAttachedBrowserSession, () => handleElectronHostInputInContext(options));
|
|
656
|
-
}
|
|
657
|
-
async function handleElectronHostInputInContext(options) {
|
|
658
|
-
const { attachedSessionKeys, compiledElectron, cwd, electronChildProcesses, electronLaunchRecords, implicitSessionCloseTimeoutMs, managedSessionActive, managedSessionName, managedSessionNamespace, managedSessionRestoreState, ownedManagedSessions, redactedCompiledElectron, sessionPageState, signal, } = options;
|
|
659
|
-
if (compiledElectron?.action === "list") {
|
|
660
|
-
try {
|
|
661
|
-
const discovery = await discoverElectronApps({ maxResults: compiledElectron.maxResults, query: compiledElectron.query });
|
|
662
|
-
return buildElectronListSuccessResult(redactedCompiledElectron ?? compiledElectron, discovery);
|
|
663
|
-
}
|
|
664
|
-
catch (error) {
|
|
665
|
-
return buildElectronListFailureResult(redactedCompiledElectron ?? compiledElectron, error);
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
if (compiledElectron?.action === "status") {
|
|
669
|
-
const selection = selectElectronRecords(compiledElectron, electronLaunchRecords);
|
|
670
|
-
if (selection.error)
|
|
671
|
-
return buildElectronHostFailureResult({ compiledElectron: redactedCompiledElectron ?? compiledElectron, errorText: selection.error, failureCategory: "validation-error" });
|
|
672
|
-
const records = selection.records ?? [];
|
|
673
|
-
const statuses = await Promise.all(records.map((record) => inspectElectronLaunchStatus(record)));
|
|
674
|
-
const managedSessions = await Promise.all(records
|
|
675
|
-
.filter((record) => typeof record.sessionName === "string")
|
|
676
|
-
.map((record) => {
|
|
677
|
-
const sessionKey = getSessionPageStateKey(record.sessionName, record.namespace) ?? record.sessionName;
|
|
678
|
-
return collectOwnedElectronManagedSessionTarget({
|
|
679
|
-
confirmActions: sessionPageState.get(sessionKey).confirmActions ?? getAgentBrowserProcessEnvironment().AGENT_BROWSER_CONFIRM_ACTIONS,
|
|
680
|
-
cwd,
|
|
681
|
-
electronLaunchRecord: record,
|
|
682
|
-
headedManagedAutosaveDisabled: ownedManagedSessions.get(sessionKey)?.headedManagedAutosaveDisabled,
|
|
683
|
-
headedManagedAutosaveInterval: ownedManagedSessions.get(sessionKey)?.headedManagedAutosaveInterval,
|
|
684
|
-
namespace: record.namespace,
|
|
685
|
-
restoreState: managedSessionRestoreState,
|
|
686
|
-
sessionName: record.sessionName,
|
|
687
|
-
signal,
|
|
688
|
-
timeoutMs: compiledElectron.timeoutMs,
|
|
689
|
-
});
|
|
690
|
-
}));
|
|
691
|
-
const mismatches = managedSessions
|
|
692
|
-
.map((managedSession) => {
|
|
693
|
-
const record = records.find((candidate) => candidate.sessionName === managedSession.sessionName && candidate.namespace === managedSession.namespace);
|
|
694
|
-
const status = record ? statuses.find((candidate) => candidate.launchId === record.launchId) : undefined;
|
|
695
|
-
return record && status ? buildElectronSessionMismatch({ managedSession, record, statusTargets: status.targets }) : undefined;
|
|
696
|
-
})
|
|
697
|
-
.filter((mismatch) => mismatch !== undefined);
|
|
698
|
-
return buildElectronStatusResult({
|
|
699
|
-
compiledElectron: redactedCompiledElectron ?? compiledElectron,
|
|
700
|
-
managedSessions,
|
|
701
|
-
mismatches,
|
|
702
|
-
records,
|
|
703
|
-
statuses,
|
|
704
|
-
});
|
|
705
|
-
}
|
|
706
|
-
if (compiledElectron?.action === "probe") {
|
|
707
|
-
const launchRecord = compiledElectron.launchId
|
|
708
|
-
? electronLaunchRecords.get(compiledElectron.launchId)
|
|
709
|
-
: findElectronLaunchRecordForSession(managedSessionName, electronLaunchRecords, managedSessionNamespace);
|
|
710
|
-
if (compiledElectron.launchId && !launchRecord) {
|
|
711
|
-
return buildElectronHostFailureResult({
|
|
712
|
-
compiledElectron: redactedCompiledElectron ?? compiledElectron,
|
|
713
|
-
errorText: `No wrapper-tracked Electron launch found for launchId ${compiledElectron.launchId}.`,
|
|
714
|
-
failureCategory: "validation-error",
|
|
715
|
-
});
|
|
716
|
-
}
|
|
717
|
-
if (compiledElectron.launchId && !launchRecord?.sessionName) {
|
|
718
|
-
return buildElectronHostFailureResult({
|
|
719
|
-
compiledElectron: redactedCompiledElectron ?? compiledElectron,
|
|
720
|
-
errorText: `electron.probe launchId ${compiledElectron.launchId} has no attached managed sessionName; reattach with connect or run electron.launch again.`,
|
|
721
|
-
failureCategory: "validation-error",
|
|
722
|
-
});
|
|
723
|
-
}
|
|
724
|
-
if (!compiledElectron.launchId && !managedSessionActive) {
|
|
725
|
-
return buildElectronHostFailureResult({
|
|
726
|
-
compiledElectron: redactedCompiledElectron ?? compiledElectron,
|
|
727
|
-
errorText: "electron.probe requires an active attached session. Run electron.launch or connect to an Electron debug port first.",
|
|
728
|
-
failureCategory: "validation-error",
|
|
729
|
-
});
|
|
730
|
-
}
|
|
731
|
-
const probeSessionName = compiledElectron.launchId ? launchRecord?.sessionName : managedSessionName;
|
|
732
|
-
if (!probeSessionName) {
|
|
733
|
-
return buildElectronHostFailureResult({
|
|
734
|
-
compiledElectron: redactedCompiledElectron ?? compiledElectron,
|
|
735
|
-
errorText: "electron.probe could not resolve a managed session to inspect.",
|
|
736
|
-
failureCategory: "validation-error",
|
|
737
|
-
});
|
|
738
|
-
}
|
|
739
|
-
try {
|
|
740
|
-
const status = launchRecord ? await inspectElectronLaunchStatus(launchRecord) : undefined;
|
|
741
|
-
const probeNamespace = compiledElectron.launchId ? launchRecord?.namespace : managedSessionNamespace;
|
|
742
|
-
const pageStateKey = getSessionPageStateKey(probeSessionName, probeNamespace) ?? probeSessionName;
|
|
743
|
-
const currentPageState = sessionPageState.get(pageStateKey);
|
|
744
|
-
const pageTargetError = getPageTargetValidationError({
|
|
745
|
-
args: ["snapshot", "-i"],
|
|
746
|
-
currentPageUrl: currentPageState.tabTarget?.url,
|
|
747
|
-
pageUrlUnknown: currentPageState.tabTargetUnknown === true,
|
|
748
|
-
});
|
|
749
|
-
if (pageTargetError)
|
|
750
|
-
throw new ElectronManagedSessionPolicyError(pageTargetError);
|
|
751
|
-
const managedSessionOwner = ownedManagedSessions.get(pageStateKey);
|
|
752
|
-
const headedManagedAutosaveDisabled = managedSessionOwner?.headedManagedAutosaveDisabled === true;
|
|
753
|
-
const headedManagedAutosaveInterval = managedSessionOwner?.headedManagedAutosaveInterval;
|
|
754
|
-
const probe = await withOwnedElectronManagedSessionPolicy({
|
|
755
|
-
args: ["snapshot", "-i"],
|
|
756
|
-
confirmActions: currentPageState.confirmActions ?? getAgentBrowserProcessEnvironment().AGENT_BROWSER_CONFIRM_ACTIONS,
|
|
757
|
-
cwd,
|
|
758
|
-
electronLaunchRecord: launchRecord,
|
|
759
|
-
headedManagedAutosaveDisabled,
|
|
760
|
-
headedManagedAutosaveInterval,
|
|
761
|
-
namespace: probeNamespace,
|
|
762
|
-
restoreState: managedSessionRestoreState,
|
|
763
|
-
sessionName: probeSessionName,
|
|
764
|
-
signal,
|
|
765
|
-
timeoutMs: compiledElectron.timeoutMs,
|
|
766
|
-
}, async () => await collectElectronProbe({ cwd, namespace: probeNamespace, sessionName: probeSessionName, signal, timeoutMs: compiledElectron.timeoutMs }));
|
|
767
|
-
const managedSession = {
|
|
768
|
-
sessionName: probe.sessionName,
|
|
769
|
-
title: probe.title ?? probe.activeTab?.title,
|
|
770
|
-
url: probe.url ?? probe.activeTab?.url,
|
|
771
|
-
};
|
|
772
|
-
const sessionMismatch = launchRecord && status
|
|
773
|
-
? buildElectronSessionMismatch({ managedSession, record: launchRecord, statusTargets: status.targets })
|
|
774
|
-
: undefined;
|
|
775
|
-
const probeContextNote = !launchRecord
|
|
776
|
-
? "No wrapper-tracked Electron launch matched this current managed session."
|
|
777
|
-
: !compiledElectron.launchId && launchRecord.sessionName && launchRecord.sessionName !== probe.sessionName
|
|
778
|
-
? `single active Electron launch ${launchRecord.launchId} uses wrapper session ${launchRecord.sessionName}; pass electron.probe.launchId to inspect that launch session directly.`
|
|
779
|
-
: undefined;
|
|
780
|
-
const probeContext = {
|
|
781
|
-
launchId: launchRecord?.launchId,
|
|
782
|
-
mode: compiledElectron.launchId ? "launchId" : "current-managed-session",
|
|
783
|
-
note: probeContextNote,
|
|
784
|
-
sessionName: probe.sessionName,
|
|
785
|
-
};
|
|
786
|
-
const sessionTabTarget = normalizeSessionTabTarget({
|
|
787
|
-
title: probe.title ?? probe.activeTab?.title ?? probe.refSnapshot?.target?.title,
|
|
788
|
-
url: probe.url ?? probe.activeTab?.url ?? probe.refSnapshot?.target?.url,
|
|
789
|
-
});
|
|
790
|
-
const pageStateUpdate = sessionPageState.beginUpdate();
|
|
791
|
-
const probePageStateKey = getSessionPageStateKey(probe.sessionName, probeNamespace) ?? probe.sessionName;
|
|
792
|
-
if (sessionTabTarget) {
|
|
793
|
-
sessionPageState.applyTabTarget({ sessionName: probePageStateKey, target: sessionTabTarget, update: pageStateUpdate });
|
|
794
|
-
}
|
|
795
|
-
if (probe.refSnapshot) {
|
|
796
|
-
sessionPageState.applyRefSnapshot({
|
|
797
|
-
fallbackTarget: sessionTabTarget,
|
|
798
|
-
sessionName: probePageStateKey,
|
|
799
|
-
snapshot: probe.refSnapshot,
|
|
800
|
-
update: pageStateUpdate,
|
|
801
|
-
});
|
|
802
|
-
}
|
|
803
|
-
return buildElectronProbeResult({
|
|
804
|
-
compiledElectron: redactedCompiledElectron ?? compiledElectron,
|
|
805
|
-
headedManagedAutosaveDisabled,
|
|
806
|
-
headedManagedAutosaveInterval,
|
|
807
|
-
mismatch: sessionMismatch,
|
|
808
|
-
namespace: probeNamespace,
|
|
809
|
-
probe,
|
|
810
|
-
probeContext,
|
|
811
|
-
record: launchRecord,
|
|
812
|
-
sessionTabTarget,
|
|
813
|
-
status,
|
|
814
|
-
});
|
|
815
|
-
}
|
|
816
|
-
catch (error) {
|
|
817
|
-
const errorText = error instanceof Error ? error.message : String(error);
|
|
818
|
-
return buildElectronHostFailureResult({
|
|
819
|
-
compiledElectron: redactedCompiledElectron ?? compiledElectron,
|
|
820
|
-
errorText: `Electron probe failed: ${errorText}`,
|
|
821
|
-
failureCategory: error instanceof ElectronManagedSessionPolicyError ? "validation-error" : "upstream-error",
|
|
822
|
-
});
|
|
823
|
-
}
|
|
824
|
-
}
|
|
825
|
-
if (compiledElectron?.action === "cleanup") {
|
|
826
|
-
const selection = selectElectronRecords(compiledElectron, electronLaunchRecords);
|
|
827
|
-
if (selection.error)
|
|
828
|
-
return buildElectronHostFailureResult({ compiledElectron: redactedCompiledElectron ?? compiledElectron, errorText: selection.error, failureCategory: "validation-error" });
|
|
829
|
-
const cleanupResults = await cleanupTrackedElectronHostLaunches({ attachedSessionKeys, cwd, electronChildProcesses, electronLaunchRecords, managedSessionRestoreState, ownedManagedSessions, sessionPageState, records: selection.records ?? [], timeoutMs: compiledElectron.timeoutMs ?? implicitSessionCloseTimeoutMs });
|
|
830
|
-
return buildElectronCleanupResult(redactedCompiledElectron ?? compiledElectron, cleanupResults);
|
|
831
|
-
}
|
|
832
|
-
return undefined;
|
|
59
|
+
return await withAttachedBrowserSessionContext(preservesAttachedSession(options), () => handleElectronHostInputInContext(options));
|
|
833
60
|
}
|