pi-agent-browser-native 0.9.3 → 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 +77 -5
- package/README.md +103 -81
- package/dist/extensions/agent-browser/index.js +43057 -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 +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 +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 +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 +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 +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 -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 +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 -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 +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 -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 +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 -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 +104 -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 +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 +17 -5
- package/docs/CODE_QUALITY.md +242 -0
- package/docs/COMMAND_REFERENCE.md +251 -220
- package/docs/ELECTRON.md +53 -44
- package/docs/RELEASE.md +18 -15
- package/docs/REQUIREMENTS.md +1 -0
- package/docs/SUPPORT_MATRIX.md +76 -75
- package/docs/TOOL_CONTRACT.md +145 -116
- 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
|
@@ -2,97 +2,46 @@
|
|
|
2
2
|
import { existsSync, readFileSync } from "node:fs";
|
|
3
3
|
import { homedir } from "node:os";
|
|
4
4
|
import { join, resolve } from "node:path";
|
|
5
|
-
|
|
5
|
+
import { DEFAULT_WEB_SEARCH_PROVIDER, WEB_SEARCH_PROVIDERS, getWebSearchProviderDescriptor, getWebSearchProviderEnvVar, } from "./config-providers.js";
|
|
6
|
+
import { parseAgentBrowserConfigLayer, describeUnknownError } from "./config-validation.js";
|
|
7
|
+
export * from "./config-providers.js";
|
|
8
|
+
export { parseAgentBrowserConfigLayer, validateAgentBrowserConfig, validateWebSearchProvider, } from "./config-validation.js";
|
|
9
|
+
/** @typedef {import("./config-providers.js").WebSearchProvider} WebSearchProvider */
|
|
10
|
+
/** @typedef {import("./config-providers.js").ExaSearchType} ExaSearchType */
|
|
11
|
+
/** @typedef {import("./config-providers.js").WebSearchProviderConfigKey} WebSearchProviderConfigKey */
|
|
12
|
+
/** @typedef {import("./config-providers.js").WebSearchProviderDescriptor} WebSearchProviderDescriptor */
|
|
13
|
+
/** @typedef {import("./config-validation.js").BrowserDefaultProfilePolicy} BrowserDefaultProfilePolicy */
|
|
14
|
+
/** @typedef {import("./config-validation.js").BrowserDefaultProfileConfig} BrowserDefaultProfileConfig */
|
|
15
|
+
/** @typedef {import("./config-validation.js").BrowserConfig} BrowserConfig */
|
|
16
|
+
/** @typedef {import("./config-validation.js").WebSearchConfig} WebSearchConfig */
|
|
17
|
+
/** @typedef {import("./config-validation.js").ConfigLayerScope} ConfigLayerScope */
|
|
18
|
+
/** @typedef {import("./config-validation.js").AgentBrowserConfig} AgentBrowserConfig */
|
|
19
|
+
/** @typedef {import("./config-validation.js").ConfigLayer} ConfigLayer */
|
|
6
20
|
/** @typedef {"global" | "project" | "override" | "env-fallback"} AgentBrowserConfigScope */
|
|
7
|
-
/** @typedef {"global" | "project" | "override"} ConfigLayerScope */
|
|
8
21
|
/** @typedef {"literal" | "env" | "command"} CredentialSourceKind */
|
|
9
|
-
/** @typedef {
|
|
10
|
-
/** @typedef {
|
|
11
|
-
/** @typedef {
|
|
12
|
-
/** @typedef {{
|
|
13
|
-
/** @typedef {{
|
|
14
|
-
/** @typedef {{ enabled?: boolean; preferredProvider?: WebSearchProvider; defaultSearchType?: ExaSearchType; braveApiKey?: string; exaApiKey?: string }} WebSearchConfig */
|
|
15
|
-
/** @typedef {{ defaultProfile?: BrowserDefaultProfileConfig; executablePath?: string }} BrowserConfig */
|
|
16
|
-
/** @typedef {{ version?: 1; webSearch?: WebSearchConfig; browser?: BrowserConfig }} AgentBrowserConfig */
|
|
17
|
-
/** @typedef {{ config: AgentBrowserConfig; path: string; scope: ConfigLayerScope }} ConfigLayer */
|
|
18
|
-
/** @typedef {{ kind: CredentialSourceKind; provider?: WebSearchProvider; rawValue: string; scope: AgentBrowserConfigScope }} CredentialSource */
|
|
19
|
-
/** @typedef {{ global: string; project: string; override?: string }} AgentBrowserConfigPaths */
|
|
20
|
-
/** @typedef {{ cwd?: string; env?: NodeJS.ProcessEnv; includeProjectConfig?: boolean }} AgentBrowserConfigLoadOptions */
|
|
21
|
-
/** @typedef {{ browserDefaultProfile?: Required<BrowserDefaultProfileConfig>; browserDefaultProfileScope?: ConfigLayerScope; browserExecutablePath?: string; browserExecutablePathScope?: ConfigLayerScope; trustedBrowserDefaultProfile?: Required<BrowserDefaultProfileConfig>; trustedBrowserDefaultProfileScope?: ConfigLayerScope; trustedBrowserExecutablePath?: string; trustedBrowserExecutablePathScope?: ConfigLayerScope; config: AgentBrowserConfig; webSearchCredentialSources: Partial<Record<WebSearchProvider, CredentialSource>>; webSearchEnabled: boolean; webSearchPreferredProvider: WebSearchProvider; errors: string[]; layers: ConfigLayer[]; paths: AgentBrowserConfigPaths; projectConfigIncluded: boolean; warnings: string[] }} AgentBrowserConfigState */
|
|
22
|
-
/** @typedef {{ scope: string; path: string; exists: boolean }} ConfigFileSummary */
|
|
22
|
+
/** @typedef {{ readonly kind: CredentialSourceKind; readonly provider?: WebSearchProvider; readonly rawValue: string; readonly scope: AgentBrowserConfigScope }} CredentialSource */
|
|
23
|
+
/** @typedef {{ readonly global: string; readonly project: string; readonly override?: string }} AgentBrowserConfigPaths */
|
|
24
|
+
/** @typedef {{ readonly cwd?: string; readonly env?: NodeJS.ProcessEnv; readonly includeProjectConfig?: boolean }} AgentBrowserConfigLoadOptions */
|
|
25
|
+
/** @typedef {{ readonly browserDefaultProfile?: Required<BrowserDefaultProfileConfig>; readonly browserDefaultProfileScope?: ConfigLayerScope; readonly browserExecutablePath?: string; readonly browserExecutablePathScope?: ConfigLayerScope; readonly trustedBrowserDefaultProfile?: Required<BrowserDefaultProfileConfig>; readonly trustedBrowserDefaultProfileScope?: ConfigLayerScope; readonly trustedBrowserExecutablePath?: string; readonly trustedBrowserExecutablePathScope?: ConfigLayerScope; readonly config: AgentBrowserConfig; readonly webSearchCredentialSources: Readonly<Partial<Record<WebSearchProvider, CredentialSource>>>; readonly webSearchEnabled: boolean; readonly webSearchPreferredProvider: WebSearchProvider; readonly errors: readonly string[]; readonly layers: readonly ConfigLayer[]; readonly paths: AgentBrowserConfigPaths; readonly projectConfigIncluded: boolean; readonly warnings: readonly string[] }} AgentBrowserConfigState */
|
|
26
|
+
/** @typedef {{ readonly scope: string; readonly path: string; readonly exists: boolean }} ConfigFileSummary */
|
|
23
27
|
const CONFIG_DIR_NAME = ".pi";
|
|
24
28
|
export const AGENT_BROWSER_CONFIG_ENV = "PI_AGENT_BROWSER_CONFIG";
|
|
25
|
-
export const
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
export const CONFIG_RELATIVE_PATH = /** @type {const} */ ([
|
|
30
|
+
CONFIG_DIR_NAME,
|
|
31
|
+
"config",
|
|
32
|
+
"pi-agent-browser-native",
|
|
33
|
+
"config.json",
|
|
34
|
+
]);
|
|
35
|
+
export const GLOBAL_CONFIG_RELATIVE_PATH = /** @type {const} */ ([
|
|
36
|
+
CONFIG_DIR_NAME,
|
|
37
|
+
"config",
|
|
38
|
+
"pi-agent-browser-native",
|
|
39
|
+
"config.json",
|
|
40
|
+
]);
|
|
29
41
|
export const SECRET_COMMAND_TIMEOUT_MS = 15_000;
|
|
30
|
-
/** @type {Readonly<Record<WebSearchProvider, WebSearchProviderDescriptor>>} */
|
|
31
|
-
export const WEB_SEARCH_PROVIDER_DESCRIPTORS = Object.freeze({
|
|
32
|
-
exa: Object.freeze({
|
|
33
|
-
provider: "exa",
|
|
34
|
-
apiKeyEnv: EXA_API_KEY_ENV,
|
|
35
|
-
configKey: "exaApiKey",
|
|
36
|
-
label: "Exa",
|
|
37
|
-
}),
|
|
38
|
-
brave: Object.freeze({
|
|
39
|
-
provider: "brave",
|
|
40
|
-
apiKeyEnv: BRAVE_API_KEY_ENV,
|
|
41
|
-
configKey: "braveApiKey",
|
|
42
|
-
label: "Brave Search",
|
|
43
|
-
}),
|
|
44
|
-
});
|
|
45
|
-
/** @type {readonly WebSearchProvider[]} */
|
|
46
|
-
export const WEB_SEARCH_PROVIDERS = Object.freeze(["exa", "brave"]);
|
|
47
|
-
/** @type {WebSearchProvider} */
|
|
48
|
-
export const DEFAULT_WEB_SEARCH_PROVIDER = "exa";
|
|
49
|
-
/** @type {readonly ExaSearchType[]} */
|
|
50
|
-
export const EXA_SEARCH_TYPES = Object.freeze(["auto", "fast", "instant", "deep-lite", "deep", "deep-reasoning"]);
|
|
51
|
-
/** @type {Readonly<Record<WebSearchProvider, WebSearchProviderConfigKey>>} */
|
|
52
|
-
export const WEB_SEARCH_PROVIDER_CONFIG_KEYS = Object.freeze({
|
|
53
|
-
exa: WEB_SEARCH_PROVIDER_DESCRIPTORS.exa.configKey,
|
|
54
|
-
brave: WEB_SEARCH_PROVIDER_DESCRIPTORS.brave.configKey,
|
|
55
|
-
});
|
|
56
|
-
/** @type {Readonly<Record<WebSearchProvider, string>>} */
|
|
57
|
-
export const WEB_SEARCH_PROVIDER_ENV_VARS = Object.freeze({
|
|
58
|
-
exa: WEB_SEARCH_PROVIDER_DESCRIPTORS.exa.apiKeyEnv,
|
|
59
|
-
brave: WEB_SEARCH_PROVIDER_DESCRIPTORS.brave.apiKeyEnv,
|
|
60
|
-
});
|
|
61
|
-
/**
|
|
62
|
-
* @param {unknown} value
|
|
63
|
-
* @returns {value is WebSearchProvider}
|
|
64
|
-
*/
|
|
65
|
-
export function isWebSearchProvider(value) {
|
|
66
|
-
return typeof value === "string" && WEB_SEARCH_PROVIDERS.includes(/** @type {WebSearchProvider} */ (value));
|
|
67
|
-
}
|
|
68
|
-
/**
|
|
69
|
-
* @param {WebSearchProvider} provider
|
|
70
|
-
* @returns {WebSearchProviderDescriptor}
|
|
71
|
-
*/
|
|
72
|
-
export function getWebSearchProviderDescriptor(provider) {
|
|
73
|
-
const descriptor = WEB_SEARCH_PROVIDER_DESCRIPTORS[provider];
|
|
74
|
-
if (!descriptor)
|
|
75
|
-
throw new Error(`Unknown web-search provider: ${String(provider)}`);
|
|
76
|
-
return descriptor;
|
|
77
|
-
}
|
|
78
|
-
/** @param {WebSearchProvider} provider */
|
|
79
|
-
export function getWebSearchProviderLabel(provider) {
|
|
80
|
-
return getWebSearchProviderDescriptor(provider).label;
|
|
81
|
-
}
|
|
82
|
-
/** @param {WebSearchProvider} provider */
|
|
83
|
-
export function getWebSearchProviderEnvVar(provider) {
|
|
84
|
-
return getWebSearchProviderDescriptor(provider).apiKeyEnv;
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* @param {WebSearchProvider} provider
|
|
88
|
-
* @returns {WebSearchProviderConfigKey}
|
|
89
|
-
*/
|
|
90
|
-
export function getWebSearchProviderConfigKey(provider) {
|
|
91
|
-
return getWebSearchProviderDescriptor(provider).configKey;
|
|
92
|
-
}
|
|
93
42
|
/** @param {NodeJS.ProcessEnv} [env] */
|
|
94
43
|
export function getGlobalAgentBrowserConfigPath(env = process.env) {
|
|
95
|
-
const home = env.HOME?.trim()
|
|
44
|
+
const home = [env.HOME?.trim(), env.USERPROFILE?.trim()].find((value) => value !== undefined && value.length > 0) ?? homedir();
|
|
96
45
|
return join(home, ...GLOBAL_CONFIG_RELATIVE_PATH);
|
|
97
46
|
}
|
|
98
47
|
/** @param {string} [cwd] */
|
|
@@ -100,7 +49,7 @@ export function getProjectAgentBrowserConfigPath(cwd = process.cwd()) {
|
|
|
100
49
|
return resolve(cwd, ...CONFIG_RELATIVE_PATH);
|
|
101
50
|
}
|
|
102
51
|
/**
|
|
103
|
-
* @param {{ cwd?: string; env?: NodeJS.ProcessEnv }} [options]
|
|
52
|
+
* @param {{ readonly cwd?: string; readonly env?: NodeJS.ProcessEnv }} [options]
|
|
104
53
|
* @returns {AgentBrowserConfigPaths}
|
|
105
54
|
*/
|
|
106
55
|
export function getAgentBrowserConfigPaths(options = {}) {
|
|
@@ -109,7 +58,7 @@ export function getAgentBrowserConfigPaths(options = {}) {
|
|
|
109
58
|
return {
|
|
110
59
|
global: getGlobalAgentBrowserConfigPath(env),
|
|
111
60
|
project: getProjectAgentBrowserConfigPath(options.cwd),
|
|
112
|
-
...(override ? { override: resolve(override) } : {}),
|
|
61
|
+
...(override !== undefined && override.length > 0 ? { override: resolve(override) } : {}),
|
|
113
62
|
};
|
|
114
63
|
}
|
|
115
64
|
/**
|
|
@@ -122,200 +71,16 @@ export function mergeAgentBrowserConfig(base, override) {
|
|
|
122
71
|
...base,
|
|
123
72
|
...override,
|
|
124
73
|
browser: {
|
|
125
|
-
...
|
|
126
|
-
...
|
|
74
|
+
...base.browser,
|
|
75
|
+
...override.browser,
|
|
127
76
|
defaultProfile: override.browser?.defaultProfile ?? base.browser?.defaultProfile,
|
|
128
77
|
},
|
|
129
78
|
webSearch: {
|
|
130
|
-
...
|
|
131
|
-
...
|
|
79
|
+
...base.webSearch,
|
|
80
|
+
...override.webSearch,
|
|
132
81
|
},
|
|
133
82
|
};
|
|
134
83
|
}
|
|
135
|
-
/**
|
|
136
|
-
* @param {unknown} value
|
|
137
|
-
* @returns {value is Record<string, unknown>}
|
|
138
|
-
*/
|
|
139
|
-
function isRecord(value) {
|
|
140
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
141
|
-
}
|
|
142
|
-
/**
|
|
143
|
-
* @param {unknown} value
|
|
144
|
-
* @param {string} path
|
|
145
|
-
* @param {string[]} errors
|
|
146
|
-
*/
|
|
147
|
-
function validateString(value, path, errors) {
|
|
148
|
-
if (value === undefined)
|
|
149
|
-
return undefined;
|
|
150
|
-
if (typeof value !== "string") {
|
|
151
|
-
errors.push(`${path} must be a string.`);
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
return value;
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* @param {unknown} value
|
|
158
|
-
* @param {string} path
|
|
159
|
-
* @param {string[]} errors
|
|
160
|
-
*/
|
|
161
|
-
function validateBoolean(value, path, errors) {
|
|
162
|
-
if (value === undefined)
|
|
163
|
-
return undefined;
|
|
164
|
-
if (typeof value !== "boolean") {
|
|
165
|
-
errors.push(`${path} must be a boolean.`);
|
|
166
|
-
return undefined;
|
|
167
|
-
}
|
|
168
|
-
return value;
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* @param {unknown} value
|
|
172
|
-
* @param {string} path
|
|
173
|
-
* @param {string[]} errors
|
|
174
|
-
* @returns {WebSearchProvider | undefined}
|
|
175
|
-
*/
|
|
176
|
-
export function validateWebSearchProvider(value, path, errors) {
|
|
177
|
-
if (value === undefined)
|
|
178
|
-
return undefined;
|
|
179
|
-
const provider = validateString(value, path, errors)?.trim();
|
|
180
|
-
if (provider === undefined)
|
|
181
|
-
return undefined;
|
|
182
|
-
if (!isWebSearchProvider(provider)) {
|
|
183
|
-
errors.push(`${path} must be one of ${WEB_SEARCH_PROVIDERS.join(", ")}.`);
|
|
184
|
-
return undefined;
|
|
185
|
-
}
|
|
186
|
-
return provider;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* @param {unknown} value
|
|
190
|
-
* @param {string} path
|
|
191
|
-
* @param {string[]} errors
|
|
192
|
-
* @returns {ExaSearchType | undefined}
|
|
193
|
-
*/
|
|
194
|
-
function validateExaSearchType(value, path, errors) {
|
|
195
|
-
if (value === undefined)
|
|
196
|
-
return undefined;
|
|
197
|
-
const searchType = validateString(value, path, errors)?.trim();
|
|
198
|
-
if (searchType === undefined)
|
|
199
|
-
return undefined;
|
|
200
|
-
if (!EXA_SEARCH_TYPES.includes(/** @type {ExaSearchType} */ (searchType))) {
|
|
201
|
-
errors.push(`${path} must be one of ${EXA_SEARCH_TYPES.join(", ")}.`);
|
|
202
|
-
return undefined;
|
|
203
|
-
}
|
|
204
|
-
return /** @type {ExaSearchType} */ (searchType);
|
|
205
|
-
}
|
|
206
|
-
/**
|
|
207
|
-
* @param {unknown} value
|
|
208
|
-
* @param {string} path
|
|
209
|
-
* @param {string[]} errors
|
|
210
|
-
* @returns {BrowserDefaultProfileConfig | undefined}
|
|
211
|
-
*/
|
|
212
|
-
function validateBrowserDefaultProfile(value, path, errors) {
|
|
213
|
-
if (value === undefined)
|
|
214
|
-
return undefined;
|
|
215
|
-
if (!isRecord(value)) {
|
|
216
|
-
errors.push(`${path} must be an object.`);
|
|
217
|
-
return undefined;
|
|
218
|
-
}
|
|
219
|
-
const name = validateString(value.name, `${path}.name`, errors)?.trim();
|
|
220
|
-
if (!name) {
|
|
221
|
-
errors.push(`${path}.name must not be blank.`);
|
|
222
|
-
return undefined;
|
|
223
|
-
}
|
|
224
|
-
const rawPolicy = validateString(value.policy, `${path}.policy`, errors);
|
|
225
|
-
const policy = rawPolicy ?? "authenticated-only";
|
|
226
|
-
if (!["explicit-only", "authenticated-only", "always"].includes(policy)) {
|
|
227
|
-
errors.push(`${path}.policy must be one of explicit-only, authenticated-only, always.`);
|
|
228
|
-
return undefined;
|
|
229
|
-
}
|
|
230
|
-
return { name, policy: /** @type {BrowserDefaultProfilePolicy} */ (policy) };
|
|
231
|
-
}
|
|
232
|
-
/**
|
|
233
|
-
* @param {unknown} value
|
|
234
|
-
* @param {string} path
|
|
235
|
-
* @param {string[]} errors
|
|
236
|
-
* @param {string[]} warnings
|
|
237
|
-
* @returns {AgentBrowserConfig | undefined}
|
|
238
|
-
*/
|
|
239
|
-
export function validateAgentBrowserConfig(value, path, errors, warnings) {
|
|
240
|
-
if (!isRecord(value)) {
|
|
241
|
-
errors.push(`${path} must contain a JSON object.`);
|
|
242
|
-
return undefined;
|
|
243
|
-
}
|
|
244
|
-
if (value.version !== undefined && value.version !== 1) {
|
|
245
|
-
errors.push(`${path}.version must be 1 when present.`);
|
|
246
|
-
}
|
|
247
|
-
/** @type {AgentBrowserConfig} */
|
|
248
|
-
const config = value.version === 1 ? { version: 1 } : {};
|
|
249
|
-
if (value.webSearch !== undefined) {
|
|
250
|
-
if (!isRecord(value.webSearch)) {
|
|
251
|
-
errors.push(`${path}.webSearch must be an object.`);
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
/** @type {NonNullable<AgentBrowserConfig["webSearch"]>} */
|
|
255
|
-
const webSearch = {};
|
|
256
|
-
const enabled = validateBoolean(value.webSearch.enabled, `${path}.webSearch.enabled`, errors);
|
|
257
|
-
if (enabled !== undefined)
|
|
258
|
-
webSearch.enabled = enabled;
|
|
259
|
-
const preferredProvider = validateWebSearchProvider(value.webSearch.preferredProvider, `${path}.webSearch.preferredProvider`, errors);
|
|
260
|
-
if (preferredProvider)
|
|
261
|
-
webSearch.preferredProvider = preferredProvider;
|
|
262
|
-
const defaultSearchType = validateExaSearchType(value.webSearch.defaultSearchType, `${path}.webSearch.defaultSearchType`, errors);
|
|
263
|
-
if (defaultSearchType)
|
|
264
|
-
webSearch.defaultSearchType = defaultSearchType;
|
|
265
|
-
for (const provider of WEB_SEARCH_PROVIDERS) {
|
|
266
|
-
const descriptor = getWebSearchProviderDescriptor(provider);
|
|
267
|
-
const apiKey = validateString(value.webSearch[descriptor.configKey], `${path}.webSearch.${descriptor.configKey}`, errors);
|
|
268
|
-
if (apiKey !== undefined) {
|
|
269
|
-
webSearch[descriptor.configKey] = apiKey;
|
|
270
|
-
}
|
|
271
|
-
}
|
|
272
|
-
if (Object.keys(webSearch).length > 0)
|
|
273
|
-
config.webSearch = webSearch;
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
if (value.browser !== undefined) {
|
|
277
|
-
if (!isRecord(value.browser)) {
|
|
278
|
-
errors.push(`${path}.browser must be an object.`);
|
|
279
|
-
}
|
|
280
|
-
else {
|
|
281
|
-
config.browser = {};
|
|
282
|
-
const defaultProfile = validateBrowserDefaultProfile(value.browser.defaultProfile, `${path}.browser.defaultProfile`, errors);
|
|
283
|
-
if (defaultProfile) {
|
|
284
|
-
config.browser.defaultProfile = defaultProfile;
|
|
285
|
-
}
|
|
286
|
-
const executablePath = validateString(value.browser.executablePath, `${path}.browser.executablePath`, errors)?.trim();
|
|
287
|
-
if (executablePath) {
|
|
288
|
-
config.browser.executablePath = executablePath;
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
for (const key of Object.keys(value)) {
|
|
293
|
-
if (!["version", "webSearch", "browser"].includes(key)) {
|
|
294
|
-
warnings.push(`${path}.${key} is not a recognized pi-agent-browser-native config field and was ignored.`);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
return config;
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* @param {string} raw
|
|
301
|
-
* @param {string} path
|
|
302
|
-
* @param {ConfigLayerScope} scope
|
|
303
|
-
* @param {string[]} errors
|
|
304
|
-
* @param {string[]} warnings
|
|
305
|
-
* @returns {ConfigLayer | undefined}
|
|
306
|
-
*/
|
|
307
|
-
export function parseAgentBrowserConfigLayer(raw, path, scope, errors, warnings) {
|
|
308
|
-
let parsed;
|
|
309
|
-
try {
|
|
310
|
-
parsed = JSON.parse(raw);
|
|
311
|
-
}
|
|
312
|
-
catch (error) {
|
|
313
|
-
errors.push(`Could not parse ${scope} config ${path}: ${error instanceof Error ? error.message : String(error)}`);
|
|
314
|
-
return undefined;
|
|
315
|
-
}
|
|
316
|
-
const config = validateAgentBrowserConfig(parsed, path, errors, warnings);
|
|
317
|
-
return config ? { config, path, scope } : undefined;
|
|
318
|
-
}
|
|
319
84
|
/**
|
|
320
85
|
* @param {string} rawValue
|
|
321
86
|
* @param {AgentBrowserConfigScope} scope
|
|
@@ -324,12 +89,15 @@ export function parseAgentBrowserConfigLayer(raw, path, scope, errors, warnings)
|
|
|
324
89
|
*/
|
|
325
90
|
export function classifyCredentialSource(rawValue, scope, provider) {
|
|
326
91
|
const trimmed = rawValue.trim();
|
|
327
|
-
if (
|
|
328
|
-
return
|
|
329
|
-
|
|
92
|
+
if (trimmed.length === 0) {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (trimmed.startsWith("!")) {
|
|
330
96
|
return { kind: "command", provider, rawValue: trimmed, scope };
|
|
331
|
-
|
|
97
|
+
}
|
|
98
|
+
if (trimmed.includes("$")) {
|
|
332
99
|
return { kind: "env", provider, rawValue: trimmed, scope };
|
|
100
|
+
}
|
|
333
101
|
return { kind: "literal", provider, rawValue: trimmed, scope };
|
|
334
102
|
}
|
|
335
103
|
/**
|
|
@@ -338,84 +106,92 @@ export function classifyCredentialSource(rawValue, scope, provider) {
|
|
|
338
106
|
*/
|
|
339
107
|
function getBrowserDefaultProfile(config) {
|
|
340
108
|
const profile = config.browser?.defaultProfile;
|
|
341
|
-
if (!profile
|
|
342
|
-
return
|
|
109
|
+
if (!profile || profile.name.trim().length === 0) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
343
112
|
return { name: profile.name.trim(), policy: profile.policy ?? "authenticated-only" };
|
|
344
113
|
}
|
|
345
114
|
/** @param {AgentBrowserConfig} config */
|
|
346
115
|
function getBrowserExecutablePath(config) {
|
|
347
116
|
const executablePath = config.browser?.executablePath?.trim();
|
|
348
|
-
return executablePath
|
|
117
|
+
return executablePath !== undefined && executablePath.length > 0 ? executablePath : undefined;
|
|
349
118
|
}
|
|
350
119
|
/**
|
|
351
|
-
* @param {ConfigLayer[]} layers
|
|
120
|
+
* @param {readonly ConfigLayer[]} layers
|
|
352
121
|
* @returns {ConfigLayerScope | undefined}
|
|
353
122
|
*/
|
|
354
123
|
function getBrowserDefaultProfileScope(layers) {
|
|
355
124
|
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
356
|
-
const layer = layers
|
|
357
|
-
if (layer?.config.browser?.defaultProfile !== undefined)
|
|
125
|
+
const layer = layers.at(index);
|
|
126
|
+
if (layer?.config.browser?.defaultProfile !== undefined) {
|
|
358
127
|
return layer.scope;
|
|
128
|
+
}
|
|
359
129
|
}
|
|
360
|
-
return
|
|
130
|
+
return;
|
|
361
131
|
}
|
|
362
132
|
/**
|
|
363
|
-
* @param {ConfigLayer[]} layers
|
|
133
|
+
* @param {readonly ConfigLayer[]} layers
|
|
364
134
|
* @returns {ConfigLayerScope | undefined}
|
|
365
135
|
*/
|
|
366
136
|
function getBrowserExecutablePathScope(layers) {
|
|
367
137
|
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
368
|
-
const layer = layers
|
|
369
|
-
if (layer?.config.browser?.executablePath !== undefined)
|
|
138
|
+
const layer = layers.at(index);
|
|
139
|
+
if (layer?.config.browser?.executablePath !== undefined) {
|
|
370
140
|
return layer.scope;
|
|
141
|
+
}
|
|
371
142
|
}
|
|
372
|
-
return
|
|
143
|
+
return;
|
|
373
144
|
}
|
|
374
145
|
/**
|
|
375
|
-
* @param {ConfigLayer[]} layers
|
|
146
|
+
* @param {readonly ConfigLayer[]} layers
|
|
376
147
|
* @returns {{ profile: Required<BrowserDefaultProfileConfig>; scope: ConfigLayerScope } | undefined}
|
|
377
148
|
*/
|
|
378
149
|
function getTrustedBrowserDefaultProfile(layers) {
|
|
379
150
|
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
380
|
-
const layer = layers
|
|
381
|
-
if (!layer)
|
|
151
|
+
const layer = layers.at(index);
|
|
152
|
+
if (!layer) {
|
|
382
153
|
continue;
|
|
154
|
+
}
|
|
383
155
|
const profile = getBrowserDefaultProfile(layer.config);
|
|
384
|
-
if (profile)
|
|
156
|
+
if (profile) {
|
|
385
157
|
return { profile, scope: layer.scope };
|
|
158
|
+
}
|
|
386
159
|
}
|
|
387
|
-
return
|
|
160
|
+
return;
|
|
388
161
|
}
|
|
389
162
|
/**
|
|
390
|
-
* @param {ConfigLayer[]} layers
|
|
163
|
+
* @param {readonly ConfigLayer[]} layers
|
|
391
164
|
* @returns {{ executablePath: string; scope: ConfigLayerScope } | undefined}
|
|
392
165
|
*/
|
|
393
166
|
function getTrustedBrowserExecutablePath(layers) {
|
|
394
167
|
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
395
|
-
const layer = layers
|
|
396
|
-
if (!layer)
|
|
168
|
+
const layer = layers.at(index);
|
|
169
|
+
if (!layer) {
|
|
397
170
|
continue;
|
|
171
|
+
}
|
|
398
172
|
const executablePath = getBrowserExecutablePath(layer.config);
|
|
399
|
-
if (executablePath)
|
|
173
|
+
if (executablePath !== undefined && executablePath.length > 0) {
|
|
400
174
|
return { executablePath, scope: layer.scope };
|
|
175
|
+
}
|
|
401
176
|
}
|
|
402
|
-
return
|
|
177
|
+
return;
|
|
403
178
|
}
|
|
404
179
|
/**
|
|
405
|
-
* @param {ConfigLayer[]} layers
|
|
180
|
+
* @param {readonly ConfigLayer[]} layers
|
|
406
181
|
* @param {WebSearchProviderConfigKey} key
|
|
407
182
|
* @returns {AgentBrowserConfigScope}
|
|
408
183
|
*/
|
|
409
184
|
function getWebSearchCredentialScope(layers, key) {
|
|
410
185
|
for (let index = layers.length - 1; index >= 0; index -= 1) {
|
|
411
|
-
const layer = layers
|
|
412
|
-
if (layer?.config.webSearch?.[key] !== undefined)
|
|
186
|
+
const layer = layers.at(index);
|
|
187
|
+
if (layer?.config.webSearch?.[key] !== undefined) {
|
|
413
188
|
return layer.scope;
|
|
189
|
+
}
|
|
414
190
|
}
|
|
415
191
|
return "global";
|
|
416
192
|
}
|
|
417
193
|
/**
|
|
418
|
-
* @param {{ env: NodeJS.ProcessEnv; layers: ConfigLayer[]; mergedConfig: AgentBrowserConfig }} options
|
|
194
|
+
* @param {{ readonly env: NodeJS.ProcessEnv; readonly layers: readonly ConfigLayer[]; readonly mergedConfig: AgentBrowserConfig }} options
|
|
419
195
|
* @returns {Partial<Record<WebSearchProvider, CredentialSource>>}
|
|
420
196
|
*/
|
|
421
197
|
export function buildWebSearchCredentialSources(options) {
|
|
@@ -427,14 +203,19 @@ export function buildWebSearchCredentialSources(options) {
|
|
|
427
203
|
if (apiKey !== undefined) {
|
|
428
204
|
sources[provider] = classifyCredentialSource(apiKey, getWebSearchCredentialScope(options.layers, descriptor.configKey), provider);
|
|
429
205
|
}
|
|
430
|
-
if (!sources[provider] && options.env[descriptor.apiKeyEnv]?.trim()) {
|
|
431
|
-
sources[provider] = {
|
|
206
|
+
if (!sources[provider] && (options.env[descriptor.apiKeyEnv]?.trim().length ?? 0) > 0) {
|
|
207
|
+
sources[provider] = {
|
|
208
|
+
kind: "literal",
|
|
209
|
+
provider,
|
|
210
|
+
rawValue: options.env[descriptor.apiKeyEnv] ?? "",
|
|
211
|
+
scope: "env-fallback",
|
|
212
|
+
};
|
|
432
213
|
}
|
|
433
214
|
}
|
|
434
215
|
return sources;
|
|
435
216
|
}
|
|
436
217
|
/**
|
|
437
|
-
* @param {{ env: NodeJS.ProcessEnv; layers: ConfigLayer[]; mergedConfig: AgentBrowserConfig; paths: AgentBrowserConfigPaths; errors: string[]; warnings: string[]; projectConfigIncluded?: boolean }} options
|
|
218
|
+
* @param {{ readonly env: NodeJS.ProcessEnv; readonly layers: readonly ConfigLayer[]; readonly mergedConfig: AgentBrowserConfig; readonly paths: AgentBrowserConfigPaths; readonly errors: readonly string[]; readonly warnings: readonly string[]; readonly projectConfigIncluded?: boolean }} options
|
|
438
219
|
* @returns {AgentBrowserConfigState}
|
|
439
220
|
*/
|
|
440
221
|
export function buildAgentBrowserConfigState(options) {
|
|
@@ -464,8 +245,8 @@ export function buildAgentBrowserConfigState(options) {
|
|
|
464
245
|
/**
|
|
465
246
|
* @param {string} path
|
|
466
247
|
* @param {ConfigLayerScope} scope
|
|
467
|
-
* @param {
|
|
468
|
-
* @param {
|
|
248
|
+
* @param {import("./config-validation.js").ConfigDiagnostics} errors
|
|
249
|
+
* @param {import("./config-validation.js").ConfigDiagnostics} warnings
|
|
469
250
|
* @returns {ConfigLayer | undefined}
|
|
470
251
|
*/
|
|
471
252
|
function readConfigLayerSync(path, scope, errors, warnings) {
|
|
@@ -474,10 +255,11 @@ function readConfigLayerSync(path, scope, errors, warnings) {
|
|
|
474
255
|
raw = readFileSync(path, "utf8");
|
|
475
256
|
}
|
|
476
257
|
catch (error) {
|
|
477
|
-
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT")
|
|
478
|
-
return
|
|
479
|
-
|
|
480
|
-
|
|
258
|
+
if (error !== null && typeof error === "object" && "code" in error && error.code === "ENOENT") {
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
errors.push(`Could not read ${scope} config ${path}: ${error instanceof Error ? error.message : describeUnknownError(error)}`);
|
|
262
|
+
return;
|
|
481
263
|
}
|
|
482
264
|
return parseAgentBrowserConfigLayer(raw, path, scope, errors, warnings);
|
|
483
265
|
}
|
|
@@ -494,19 +276,22 @@ export function loadAgentBrowserConfigStateSync(options = {}) {
|
|
|
494
276
|
/** @type {string[]} */
|
|
495
277
|
const warnings = [];
|
|
496
278
|
/** @type {Array<{ path: string; scope: ConfigLayerScope }>} */
|
|
497
|
-
const layerCandidates = [
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
279
|
+
const layerCandidates = [{ path: paths.global, scope: "global" }];
|
|
280
|
+
if (includeProjectConfig) {
|
|
281
|
+
layerCandidates.push({ path: paths.project, scope: "project" });
|
|
282
|
+
}
|
|
283
|
+
if (paths.override !== undefined && paths.override.length > 0) {
|
|
284
|
+
layerCandidates.push({ path: paths.override, scope: "override" });
|
|
285
|
+
}
|
|
502
286
|
/** @type {ConfigLayer[]} */
|
|
503
287
|
const layers = [];
|
|
504
288
|
/** @type {AgentBrowserConfig} */
|
|
505
289
|
let mergedConfig = {};
|
|
506
290
|
for (const candidate of layerCandidates) {
|
|
507
291
|
const layer = readConfigLayerSync(candidate.path, candidate.scope, errors, warnings);
|
|
508
|
-
if (!layer)
|
|
292
|
+
if (!layer) {
|
|
509
293
|
continue;
|
|
294
|
+
}
|
|
510
295
|
layers.push(layer);
|
|
511
296
|
mergedConfig = mergeAgentBrowserConfig(mergedConfig, layer.config);
|
|
512
297
|
}
|
|
@@ -533,21 +318,17 @@ export function resolveEnvInterpolations(rawValue, env) {
|
|
|
533
318
|
continue;
|
|
534
319
|
}
|
|
535
320
|
const next = rawValue[index + 1];
|
|
536
|
-
if (next === "$") {
|
|
537
|
-
output +=
|
|
538
|
-
index += 1;
|
|
539
|
-
continue;
|
|
540
|
-
}
|
|
541
|
-
if (next === "!") {
|
|
542
|
-
output += "!";
|
|
321
|
+
if (next === "$" || next === "!") {
|
|
322
|
+
output += next;
|
|
543
323
|
index += 1;
|
|
544
324
|
continue;
|
|
545
325
|
}
|
|
546
326
|
let name = "";
|
|
547
327
|
if (next === "{") {
|
|
548
328
|
const end = rawValue.indexOf("}", index + 2);
|
|
549
|
-
if (end === -1)
|
|
550
|
-
return
|
|
329
|
+
if (end === -1) {
|
|
330
|
+
return;
|
|
331
|
+
}
|
|
551
332
|
name = rawValue.slice(index + 2, end);
|
|
552
333
|
index = end;
|
|
553
334
|
}
|
|
@@ -557,14 +338,16 @@ export function resolveEnvInterpolations(rawValue, env) {
|
|
|
557
338
|
output += "$";
|
|
558
339
|
continue;
|
|
559
340
|
}
|
|
560
|
-
name = match[1]
|
|
341
|
+
name = match[1];
|
|
561
342
|
index += name.length;
|
|
562
343
|
}
|
|
563
|
-
if (
|
|
564
|
-
return
|
|
344
|
+
if (name.length === 0) {
|
|
345
|
+
return;
|
|
346
|
+
}
|
|
565
347
|
const value = env[name];
|
|
566
|
-
if (value === undefined)
|
|
567
|
-
return
|
|
348
|
+
if (value === undefined) {
|
|
349
|
+
return;
|
|
350
|
+
}
|
|
568
351
|
output += value;
|
|
569
352
|
}
|
|
570
353
|
return output;
|
|
@@ -575,8 +358,9 @@ export function resolveEnvInterpolations(rawValue, env) {
|
|
|
575
358
|
* @returns {WebSearchProvider[]}
|
|
576
359
|
*/
|
|
577
360
|
export function getWebSearchProviderOrder(state, requestedProvider) {
|
|
578
|
-
if (requestedProvider && requestedProvider !== "auto")
|
|
361
|
+
if (requestedProvider !== undefined && requestedProvider !== "auto") {
|
|
579
362
|
return [requestedProvider];
|
|
363
|
+
}
|
|
580
364
|
const preferred = state.webSearchPreferredProvider;
|
|
581
365
|
return [preferred, ...WEB_SEARCH_PROVIDERS.filter((provider) => provider !== preferred)];
|
|
582
366
|
}
|
|
@@ -592,12 +376,15 @@ export function getWebSearchCredentialSource(state, provider) {
|
|
|
592
376
|
* @param {NodeJS.ProcessEnv} env
|
|
593
377
|
*/
|
|
594
378
|
export function hasPotentialCredentialSource(source, env) {
|
|
595
|
-
if (!source)
|
|
379
|
+
if (!source) {
|
|
596
380
|
return false;
|
|
597
|
-
|
|
381
|
+
}
|
|
382
|
+
if (source.kind === "command") {
|
|
598
383
|
return true;
|
|
599
|
-
|
|
384
|
+
}
|
|
385
|
+
if (source.kind === "env") {
|
|
600
386
|
return Boolean(resolveEnvInterpolations(source.rawValue, env)?.trim());
|
|
387
|
+
}
|
|
601
388
|
return Boolean(source.rawValue.trim());
|
|
602
389
|
}
|
|
603
390
|
/**
|
|
@@ -605,8 +392,9 @@ export function hasPotentialCredentialSource(source, env) {
|
|
|
605
392
|
* @param {NodeJS.ProcessEnv} [env]
|
|
606
393
|
*/
|
|
607
394
|
export function canRegisterWebSearchTool(state, env = process.env) {
|
|
608
|
-
if (!state.webSearchEnabled || state.errors.length > 0)
|
|
395
|
+
if (!state.webSearchEnabled || state.errors.length > 0) {
|
|
609
396
|
return false;
|
|
397
|
+
}
|
|
610
398
|
return WEB_SEARCH_PROVIDERS.some((provider) => hasPotentialCredentialSource(state.webSearchCredentialSources[provider], env));
|
|
611
399
|
}
|
|
612
400
|
/**
|
|
@@ -614,12 +402,15 @@ export function canRegisterWebSearchTool(state, env = process.env) {
|
|
|
614
402
|
* @param {WebSearchProvider} [provider]
|
|
615
403
|
*/
|
|
616
404
|
export function getCredentialSourceSummary(source, provider) {
|
|
617
|
-
if (!source)
|
|
405
|
+
if (!source) {
|
|
618
406
|
return "not configured";
|
|
619
|
-
|
|
407
|
+
}
|
|
408
|
+
if (source.kind === "command") {
|
|
620
409
|
return `configured via command (${source.scope})`;
|
|
621
|
-
|
|
410
|
+
}
|
|
411
|
+
if (source.kind === "env") {
|
|
622
412
|
return `configured via environment interpolation (${source.scope})`;
|
|
413
|
+
}
|
|
623
414
|
if (source.scope === "env-fallback") {
|
|
624
415
|
return `configured via ${getWebSearchProviderEnvVar(provider ?? source.provider ?? DEFAULT_WEB_SEARCH_PROVIDER)} environment fallback`;
|
|
625
416
|
}
|
|
@@ -628,16 +419,18 @@ export function getCredentialSourceSummary(source, provider) {
|
|
|
628
419
|
/** @param {AgentBrowserConfigState} state */
|
|
629
420
|
export function formatBrowserProfileStatus(state) {
|
|
630
421
|
const profile = state.browserDefaultProfile;
|
|
631
|
-
if (!profile)
|
|
422
|
+
if (!profile) {
|
|
632
423
|
return "not configured";
|
|
424
|
+
}
|
|
633
425
|
const scope = state.browserDefaultProfileScope ?? "unknown";
|
|
634
426
|
return `${profile.name} (policy: ${profile.policy}; ${scope})`;
|
|
635
427
|
}
|
|
636
428
|
/** @param {AgentBrowserConfigState} state */
|
|
637
429
|
export function formatBrowserExecutableStatus(state) {
|
|
638
430
|
const executablePath = state.browserExecutablePath;
|
|
639
|
-
if (
|
|
431
|
+
if (executablePath === undefined || executablePath.length === 0) {
|
|
640
432
|
return "not configured";
|
|
433
|
+
}
|
|
641
434
|
const scope = state.browserExecutablePathScope ?? "unknown";
|
|
642
435
|
return `${executablePath} (${scope})`;
|
|
643
436
|
}
|
|
@@ -650,6 +443,8 @@ export function summarizeConfigFiles(state, exists = existsSync) {
|
|
|
650
443
|
return [
|
|
651
444
|
["global", state.paths.global],
|
|
652
445
|
["project", state.paths.project],
|
|
653
|
-
...(state.paths.override
|
|
446
|
+
...(state.paths.override !== undefined && state.paths.override.length > 0
|
|
447
|
+
? [["override", state.paths.override]]
|
|
448
|
+
: []),
|
|
654
449
|
].map(([scope, path]) => ({ scope, path, exists: exists(path) }));
|
|
655
450
|
}
|