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,24 +1,40 @@
|
|
|
1
1
|
import { Text } from "@earendil-works/pi-tui";
|
|
2
2
|
import { formatAgentBrowserRenderCall } from "./pi-tool-rendering.js";
|
|
3
3
|
import { JsonSchema } from "./json-schema.js";
|
|
4
|
-
import { AGENT_BROWSER_NAMESPACE, AGENT_BROWSER_OUTPUT_SCHEMA, finalizeAgentBrowserNativeResult } from "./native-output.js";
|
|
4
|
+
import { AGENT_BROWSER_NAMESPACE, AGENT_BROWSER_OUTPUT_SCHEMA, finalizeAgentBrowserNativeResult, } from "./native-output.js";
|
|
5
5
|
import { AGENT_BROWSER_PARAMS, AGENT_BROWSER_CODE_PARAMS, AGENT_BROWSER_ACTION_PARAMS, AGENT_BROWSER_QA_PARAMS, AGENT_BROWSER_ELECTRON_PARAMS, AGENT_BROWSER_SOURCE_PARAMS, AGENT_BROWSER_NETWORK_SOURCE_PARAMS, AGENT_BROWSER_TOOLS_PARAMS, } from "./input-modes/params.js";
|
|
6
6
|
export const AGENT_BROWSER_TOOL_INVENTORY = {
|
|
7
|
-
action: {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
7
|
+
action: {
|
|
8
|
+
name: "agent_browser_action",
|
|
9
|
+
description: "Click, check, fill, or select a unique accessible target using stable locators or current refs.",
|
|
10
|
+
},
|
|
11
|
+
qa: {
|
|
12
|
+
name: "agent_browser_qa",
|
|
13
|
+
description: "Check a URL or attached page with visible assertions and a diagnostic pass/fail verdict.",
|
|
14
|
+
},
|
|
15
|
+
electron: {
|
|
16
|
+
name: "agent_browser_electron",
|
|
17
|
+
description: "Discover, launch, probe, and clean up owned Electron desktop applications.",
|
|
18
|
+
},
|
|
19
|
+
source: {
|
|
20
|
+
name: "agent_browser_source",
|
|
21
|
+
description: "Find experimental DOM/React/local-source candidates with a bounded workspace scan.",
|
|
22
|
+
},
|
|
23
|
+
network: {
|
|
24
|
+
name: "agent_browser_network_source",
|
|
25
|
+
description: "Correlate failed requests with initiator and local-source candidates.",
|
|
26
|
+
},
|
|
12
27
|
};
|
|
13
28
|
export const AGENT_BROWSER_INSTRUCTION_GROUP = {
|
|
14
29
|
name: "browser",
|
|
15
30
|
description: "Search the web, browse and interact with pages, verify browser UI, and inspect Electron apps.",
|
|
16
31
|
};
|
|
17
32
|
const advancedNames = new Set(Object.values(AGENT_BROWSER_TOOL_INVENTORY).map(({ name }) => name));
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
33
|
+
const nativeOutput = {
|
|
34
|
+
namespace: AGENT_BROWSER_NAMESPACE,
|
|
35
|
+
outputSchema: AGENT_BROWSER_OUTPUT_SCHEMA,
|
|
36
|
+
};
|
|
37
|
+
function registerCoreTools(pi, options, execute) {
|
|
22
38
|
pi.registerTool({
|
|
23
39
|
name: "agent_browser",
|
|
24
40
|
...nativeOutput,
|
|
@@ -47,6 +63,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
|
|
|
47
63
|
},
|
|
48
64
|
renderResult: options.renderResult,
|
|
49
65
|
});
|
|
66
|
+
}
|
|
67
|
+
function registerActionTool(pi, options, execute) {
|
|
50
68
|
pi.registerTool({
|
|
51
69
|
...AGENT_BROWSER_TOOL_INVENTORY.action,
|
|
52
70
|
...nativeOutput,
|
|
@@ -59,6 +77,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
|
|
|
59
77
|
return execute(id, { semanticAction, outputPath, timeoutMs }, signal, onUpdate, ctx);
|
|
60
78
|
},
|
|
61
79
|
});
|
|
80
|
+
}
|
|
81
|
+
function registerQaTool(pi, options, execute) {
|
|
62
82
|
pi.registerTool({
|
|
63
83
|
...AGENT_BROWSER_TOOL_INVENTORY.qa,
|
|
64
84
|
...nativeOutput,
|
|
@@ -71,6 +91,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
|
|
|
71
91
|
return execute(id, { qa, outputPath, timeoutMs, sessionMode }, signal, onUpdate, ctx);
|
|
72
92
|
},
|
|
73
93
|
});
|
|
94
|
+
}
|
|
95
|
+
function registerElectronTool(pi, options, execute) {
|
|
74
96
|
pi.registerTool({
|
|
75
97
|
...AGENT_BROWSER_TOOL_INVENTORY.electron,
|
|
76
98
|
...nativeOutput,
|
|
@@ -83,6 +105,8 @@ export function registerAgentBrowserToolSurface(pi, options) {
|
|
|
83
105
|
return execute(id, { electron, outputPath }, signal, onUpdate, ctx);
|
|
84
106
|
},
|
|
85
107
|
});
|
|
108
|
+
}
|
|
109
|
+
function registerSourceTools(pi, options, execute) {
|
|
86
110
|
pi.registerTool({
|
|
87
111
|
...AGENT_BROWSER_TOOL_INVENTORY.source,
|
|
88
112
|
...nativeOutput,
|
|
@@ -107,13 +131,24 @@ export function registerAgentBrowserToolSurface(pi, options) {
|
|
|
107
131
|
return execute(id, { networkSourceLookup, outputPath, timeoutMs, sessionMode }, signal, onUpdate, ctx);
|
|
108
132
|
},
|
|
109
133
|
});
|
|
134
|
+
}
|
|
135
|
+
function toolStatus(available, active) {
|
|
136
|
+
if (!available) {
|
|
137
|
+
return "unavailable in this Pi tool selection";
|
|
138
|
+
}
|
|
139
|
+
return active ? "active" : "inactive";
|
|
140
|
+
}
|
|
141
|
+
function registerToolLoader(pi) {
|
|
110
142
|
pi.registerTool({
|
|
111
143
|
name: "agent_browser_tools",
|
|
112
144
|
namespace: AGENT_BROWSER_NAMESPACE,
|
|
113
145
|
outputSchema: JsonSchema.Object({
|
|
114
146
|
inventory: JsonSchema.Array(JsonSchema.Object({
|
|
115
|
-
key: JsonSchema.String(),
|
|
116
|
-
|
|
147
|
+
key: JsonSchema.String(),
|
|
148
|
+
name: JsonSchema.String(),
|
|
149
|
+
description: JsonSchema.String(),
|
|
150
|
+
available: JsonSchema.Boolean(),
|
|
151
|
+
active: JsonSchema.Boolean(),
|
|
117
152
|
})),
|
|
118
153
|
added: JsonSchema.Array(JsonSchema.String()),
|
|
119
154
|
}),
|
|
@@ -124,46 +159,81 @@ export function registerAgentBrowserToolSurface(pi, options) {
|
|
|
124
159
|
async execute(_id, params) {
|
|
125
160
|
const available = new Set(pi.getAllTools().map(({ name }) => name));
|
|
126
161
|
const active = new Set(pi.getActiveTools());
|
|
127
|
-
const added = (params.enable ?? [])
|
|
162
|
+
const added = (params.enable ?? [])
|
|
163
|
+
.map((key) => AGENT_BROWSER_TOOL_INVENTORY[key].name)
|
|
128
164
|
.filter((name) => available.has(name) && !active.has(name));
|
|
129
|
-
if (added.length > 0)
|
|
165
|
+
if (added.length > 0) {
|
|
130
166
|
pi.setActiveTools([...new Set([...active, ...added])]);
|
|
167
|
+
}
|
|
131
168
|
const current = new Set(pi.getActiveTools());
|
|
132
169
|
const inventory = Object.entries(AGENT_BROWSER_TOOL_INVENTORY).map(([key, tool]) => ({
|
|
133
|
-
key,
|
|
170
|
+
key,
|
|
171
|
+
name: tool.name,
|
|
172
|
+
description: tool.description,
|
|
173
|
+
available: available.has(tool.name),
|
|
174
|
+
active: current.has(tool.name),
|
|
134
175
|
}));
|
|
135
176
|
return {
|
|
136
|
-
content: [
|
|
177
|
+
content: [
|
|
178
|
+
{
|
|
179
|
+
type: "text",
|
|
180
|
+
text: inventory
|
|
181
|
+
.map((tool) => `${tool.key}: ${tool.name} (${toolStatus(tool.available, tool.active)}) — ${tool.description}`)
|
|
182
|
+
.join("\n"),
|
|
183
|
+
},
|
|
184
|
+
],
|
|
137
185
|
details: { inventory, added: [...new Set(added)] },
|
|
138
186
|
structuredContent: { inventory, added: [...new Set(added)] },
|
|
139
187
|
};
|
|
140
188
|
},
|
|
141
189
|
});
|
|
190
|
+
}
|
|
191
|
+
function hasExplicitToolSelection() {
|
|
192
|
+
const argv = process.argv.slice(2);
|
|
193
|
+
const delimiter = argv.indexOf("--");
|
|
194
|
+
return (delimiter < 0 ? argv : argv.slice(0, delimiter)).some((arg) => arg === "--tools" || arg === "-t");
|
|
195
|
+
}
|
|
196
|
+
function registerAdvancedToolReplay(pi) {
|
|
142
197
|
pi.on("session_start", async (_event, ctx) => {
|
|
143
198
|
// ponytail: official 1.0 SDK supplies initialActiveToolNames on resume, bypassing
|
|
144
199
|
// native transcript restoration. Remove this additive fallback once the supported SDK restores it.
|
|
145
|
-
|
|
146
|
-
const delimiter = argv.indexOf("--");
|
|
147
|
-
if ((delimiter < 0 ? argv : argv.slice(0, delimiter)).some((arg) => arg === "--tools" || arg === "-t"))
|
|
200
|
+
if (hasExplicitToolSelection()) {
|
|
148
201
|
return;
|
|
202
|
+
}
|
|
149
203
|
// A host-filtered catalog is an explicit selection, not our default surface.
|
|
150
204
|
const available = new Set(pi.getAllTools().map(({ name }) => name));
|
|
151
|
-
if (!["agent_browser", "agent_browser_code", "agent_browser_tools", ...advancedNames].every(name => available.has(name)))
|
|
205
|
+
if (!["agent_browser", "agent_browser_code", "agent_browser_tools", ...advancedNames].every((name) => available.has(name))) {
|
|
152
206
|
return;
|
|
207
|
+
}
|
|
153
208
|
// Native dynamic imports bypass Pi's host-package aliases in consumer installs.
|
|
154
209
|
// Only tool names are needed; replay native deltas without requiring the optional pi-ai peer.
|
|
155
210
|
const restored = new Set();
|
|
156
211
|
for (const message of ctx.sessionManager.buildSessionProjection().messages) {
|
|
157
|
-
if (message.role !== "system")
|
|
212
|
+
if (message.role !== "system") {
|
|
158
213
|
continue;
|
|
159
|
-
|
|
214
|
+
}
|
|
215
|
+
for (const removed of message.toolsRemoved ?? []) {
|
|
160
216
|
restored.delete(removed.name);
|
|
161
|
-
|
|
217
|
+
}
|
|
218
|
+
for (const added of message.toolsAdded ?? []) {
|
|
162
219
|
restored.add(added.name);
|
|
220
|
+
}
|
|
163
221
|
}
|
|
164
222
|
const active = new Set(pi.getActiveTools());
|
|
165
223
|
const added = [...restored].filter((name) => advancedNames.has(name) && available.has(name) && !active.has(name));
|
|
166
|
-
if (added.length > 0)
|
|
224
|
+
if (added.length > 0) {
|
|
167
225
|
pi.setActiveTools([...active, ...added]);
|
|
226
|
+
}
|
|
168
227
|
});
|
|
169
228
|
}
|
|
229
|
+
/** Register once; adapters retain native execution, output, activation, and replay contracts. */
|
|
230
|
+
export function registerAgentBrowserToolSurface(pi, options) {
|
|
231
|
+
const execute = async (id, params, signal, onUpdate, ctx) => finalizeAgentBrowserNativeResult(await options.execute(id, params, signal, onUpdate, ctx), params);
|
|
232
|
+
registerCoreTools(pi, options, execute);
|
|
233
|
+
registerActionTool(pi, options, execute);
|
|
234
|
+
registerQaTool(pi, options, execute);
|
|
235
|
+
registerElectronTool(pi, options, execute);
|
|
236
|
+
registerSourceTools(pi, options, execute);
|
|
237
|
+
registerToolLoader(pi);
|
|
238
|
+
registerAdvancedToolReplay(pi);
|
|
239
|
+
}
|
|
@@ -6,9 +6,10 @@ export function parseAgentBrowserVersionOutput(stdout) {
|
|
|
6
6
|
}
|
|
7
7
|
export function getAgentBrowserVersionValidationError(stdout) {
|
|
8
8
|
const observed = parseAgentBrowserVersionOutput(stdout);
|
|
9
|
-
if (observed && isSupportedAgentBrowserVersion(observed))
|
|
9
|
+
if (observed !== undefined && isSupportedAgentBrowserVersion(observed)) {
|
|
10
10
|
return undefined;
|
|
11
|
-
|
|
11
|
+
}
|
|
12
|
+
return observed !== undefined
|
|
12
13
|
? `Installed agent-browser ${observed} is unsupported; stable versions must be at least ${MINIMUM_AGENT_BROWSER_VERSION_LABEL}. Install ${TARGET_AGENT_BROWSER_VERSION_LABEL} (recommended), run pi-agent-browser-doctor, then reload Pi.`
|
|
13
14
|
: `agent-browser --version returned an unrecognized value; expected ${SUPPORTED_AGENT_BROWSER_VERSION_LABEL}. Run pi-agent-browser-doctor and install a supported upstream version.`;
|
|
14
15
|
}
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { isRecord } from "./parsing.js";
|
|
2
|
+
import { fetchSearchJson, SEARCH_REQUEST_TIMEOUT_MS } from "./web-search-request.js";
|
|
3
|
+
import { cleanSearchText, normalizeBraveSearchResult, normalizeExaSearchResult, parseBraveSearchResponse, parseExaSearchResponse, } from "./web-search-results.js";
|
|
4
|
+
const BRAVE_SEARCH_ENDPOINT = "https://api.search.brave.com/res/v1/web/search";
|
|
5
|
+
const EXA_SEARCH_ENDPOINT = "https://api.exa.ai/search";
|
|
6
|
+
const EXA_DYNAMIC_HIGHLIGHTS_BETA = "dynamic-highlights-2026-08-28";
|
|
7
|
+
export const EXA_SEARCH_SYSTEM_PROMPT = "Prefer primary, official sources. Respect any requested version or date. Avoid duplicate or equivalent results.";
|
|
8
|
+
/** Local validation/config failures, not provider outages; reported as `validation-error`. */
|
|
9
|
+
export class WebSearchLocalError extends Error {
|
|
10
|
+
}
|
|
11
|
+
export function buildBraveSearchUrl(params) {
|
|
12
|
+
const url = new URL(BRAVE_SEARCH_ENDPOINT);
|
|
13
|
+
url.searchParams.set("q", params.query);
|
|
14
|
+
url.searchParams.set("count", String(params.count));
|
|
15
|
+
url.searchParams.set("offset", String(params.offset));
|
|
16
|
+
if (params.country !== undefined && params.country.length > 0) {
|
|
17
|
+
url.searchParams.set("country", params.country.toUpperCase());
|
|
18
|
+
}
|
|
19
|
+
if (params.searchLang !== undefined && params.searchLang.length > 0) {
|
|
20
|
+
url.searchParams.set("search_lang", params.searchLang);
|
|
21
|
+
}
|
|
22
|
+
if (params.safesearch !== undefined) {
|
|
23
|
+
url.searchParams.set("safesearch", params.safesearch);
|
|
24
|
+
}
|
|
25
|
+
if (params.freshness !== undefined) {
|
|
26
|
+
url.searchParams.set("freshness", params.freshness);
|
|
27
|
+
}
|
|
28
|
+
return url;
|
|
29
|
+
}
|
|
30
|
+
const FRESHNESS_DAYS = { pd: 1, pw: 7, pm: 31, py: 365 };
|
|
31
|
+
function getStartPublishedDate(freshness, now) {
|
|
32
|
+
if (freshness === undefined) {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
return new Date(now().getTime() - FRESHNESS_DAYS[freshness] * 24 * 60 * 60 * 1000).toISOString();
|
|
36
|
+
}
|
|
37
|
+
function hasEntries(values) {
|
|
38
|
+
return values !== undefined && values.length > 0;
|
|
39
|
+
}
|
|
40
|
+
function validateExaFilters(params, searchType) {
|
|
41
|
+
if (hasEntries(params.additionalQueries) && !searchType.startsWith("deep")) {
|
|
42
|
+
throw new WebSearchLocalError(`additionalQueries requires deep-lite, deep, or deep-reasoning; received ${searchType}.`);
|
|
43
|
+
}
|
|
44
|
+
if ((params.category === "company" || params.category === "people") &&
|
|
45
|
+
(params.freshness !== undefined || hasEntries(params.excludeDomains))) {
|
|
46
|
+
throw new WebSearchLocalError(`category ${params.category} cannot be combined with freshness or excludeDomains.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function exaContentFilters(params) {
|
|
50
|
+
return {
|
|
51
|
+
...(hasEntries(params.includeDomains) ? { includeDomains: params.includeDomains } : {}),
|
|
52
|
+
...(hasEntries(params.excludeDomains) ? { excludeDomains: params.excludeDomains } : {}),
|
|
53
|
+
...(hasEntries(params.additionalQueries)
|
|
54
|
+
? { additionalQueries: params.additionalQueries }
|
|
55
|
+
: {}),
|
|
56
|
+
...(params.safesearch !== undefined && params.safesearch !== "off" ? { moderation: true } : {}),
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function buildExaSearchRequestBody(params, now = () => new Date()) {
|
|
60
|
+
const searchType = params.searchType ?? "auto";
|
|
61
|
+
validateExaFilters(params, searchType);
|
|
62
|
+
const startPublishedDate = getStartPublishedDate(params.freshness, now);
|
|
63
|
+
return {
|
|
64
|
+
query: params.query,
|
|
65
|
+
type: searchType,
|
|
66
|
+
numResults: Math.min(params.count + params.offset, 100),
|
|
67
|
+
contents: { highlights: params.highlightsDynamic === true ? { dynamic: true } : true },
|
|
68
|
+
systemPrompt: EXA_SEARCH_SYSTEM_PROMPT,
|
|
69
|
+
...(params.category !== undefined ? { category: params.category } : {}),
|
|
70
|
+
...(params.country !== undefined && params.country.length > 0
|
|
71
|
+
? { userLocation: params.country.toUpperCase() }
|
|
72
|
+
: {}),
|
|
73
|
+
...exaContentFilters(params),
|
|
74
|
+
...(startPublishedDate !== undefined ? { startPublishedDate } : {}),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
export async function fetchBraveSearchJson(url, apiKey, signal) {
|
|
78
|
+
const data = await fetchSearchJson({
|
|
79
|
+
cancelMessage: "Brave search cancelled",
|
|
80
|
+
init: { headers: { Accept: "application/json", "X-Subscription-Token": apiKey } },
|
|
81
|
+
invalidJsonMessage: "Brave search returned invalid JSON",
|
|
82
|
+
provider: "brave",
|
|
83
|
+
request: url,
|
|
84
|
+
signal,
|
|
85
|
+
timeoutMessage: "Brave search timed out",
|
|
86
|
+
timeoutMs: SEARCH_REQUEST_TIMEOUT_MS,
|
|
87
|
+
});
|
|
88
|
+
return parseBraveSearchResponse(data);
|
|
89
|
+
}
|
|
90
|
+
function getExaRequestTimeoutMs(searchType) {
|
|
91
|
+
switch (searchType) {
|
|
92
|
+
case "deep-lite":
|
|
93
|
+
return 45_000;
|
|
94
|
+
case "deep":
|
|
95
|
+
return 60_000;
|
|
96
|
+
case "deep-reasoning":
|
|
97
|
+
return 90_000;
|
|
98
|
+
case "auto":
|
|
99
|
+
case "fast":
|
|
100
|
+
case "instant":
|
|
101
|
+
case undefined:
|
|
102
|
+
return SEARCH_REQUEST_TIMEOUT_MS;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
function usesDynamicHighlights(body) {
|
|
106
|
+
const contents = body.contents;
|
|
107
|
+
return (isRecord(contents) &&
|
|
108
|
+
!Array.isArray(contents) &&
|
|
109
|
+
isRecord(contents.highlights) &&
|
|
110
|
+
!Array.isArray(contents.highlights) &&
|
|
111
|
+
contents.highlights.dynamic === true);
|
|
112
|
+
}
|
|
113
|
+
export async function fetchExaSearchJson(body, apiKey, signal, timeoutMs = SEARCH_REQUEST_TIMEOUT_MS) {
|
|
114
|
+
const data = await fetchSearchJson({
|
|
115
|
+
cancelMessage: "Exa search cancelled",
|
|
116
|
+
init: {
|
|
117
|
+
body: JSON.stringify(body),
|
|
118
|
+
headers: {
|
|
119
|
+
Accept: "application/json",
|
|
120
|
+
"Content-Type": "application/json",
|
|
121
|
+
"x-api-key": apiKey,
|
|
122
|
+
...(usesDynamicHighlights(body) ? { "Exa-Beta": EXA_DYNAMIC_HIGHLIGHTS_BETA } : {}),
|
|
123
|
+
},
|
|
124
|
+
method: "POST",
|
|
125
|
+
},
|
|
126
|
+
invalidJsonMessage: "Exa search returned invalid JSON",
|
|
127
|
+
provider: "exa",
|
|
128
|
+
request: EXA_SEARCH_ENDPOINT,
|
|
129
|
+
signal,
|
|
130
|
+
timeoutMessage: "Exa search timed out",
|
|
131
|
+
timeoutMs,
|
|
132
|
+
});
|
|
133
|
+
return parseExaSearchResponse(data);
|
|
134
|
+
}
|
|
135
|
+
const BRAVE_WEB_SEARCH_ADAPTER = {
|
|
136
|
+
provider: "brave",
|
|
137
|
+
buildRequest(params) {
|
|
138
|
+
// Brave offsets count pages; fetch the prefix and slice by result like Exa.
|
|
139
|
+
return buildBraveSearchUrl({ ...params, count: params.count + params.offset, offset: 0 });
|
|
140
|
+
},
|
|
141
|
+
fetchJson: fetchBraveSearchJson,
|
|
142
|
+
normalizeResponse(response, params) {
|
|
143
|
+
return {
|
|
144
|
+
results: (response.web?.results ?? [])
|
|
145
|
+
.map(normalizeBraveSearchResult)
|
|
146
|
+
.filter((result) => result !== undefined)
|
|
147
|
+
.slice(params.offset, params.offset + params.count),
|
|
148
|
+
returnedQuery: cleanSearchText(response.query?.altered, 300) ??
|
|
149
|
+
cleanSearchText(response.query?.original, 300) ??
|
|
150
|
+
params.query,
|
|
151
|
+
};
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
const EXA_WEB_SEARCH_ADAPTER = {
|
|
155
|
+
provider: "exa",
|
|
156
|
+
buildRequest(params) {
|
|
157
|
+
return {
|
|
158
|
+
body: buildExaSearchRequestBody(params),
|
|
159
|
+
timeoutMs: getExaRequestTimeoutMs(params.searchType ?? "auto"),
|
|
160
|
+
};
|
|
161
|
+
},
|
|
162
|
+
fetchJson(request, apiKey, signal) {
|
|
163
|
+
return fetchExaSearchJson(request.body, apiKey, signal, request.timeoutMs);
|
|
164
|
+
},
|
|
165
|
+
normalizeResponse(response, params) {
|
|
166
|
+
return {
|
|
167
|
+
extraDetails: {
|
|
168
|
+
requestId: cleanSearchText(response.requestId, 120),
|
|
169
|
+
searchType: params.searchType ?? "auto",
|
|
170
|
+
},
|
|
171
|
+
results: (response.results ?? [])
|
|
172
|
+
.map(normalizeExaSearchResult)
|
|
173
|
+
.filter((result) => result !== undefined)
|
|
174
|
+
.slice(params.offset, params.offset + params.count),
|
|
175
|
+
returnedQuery: params.query,
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
/** Build before queueing so local validation fails without consuming a request slot. */
|
|
180
|
+
export function prepareWebSearchRequest(provider, params, apiKey, signal) {
|
|
181
|
+
if (provider === "exa") {
|
|
182
|
+
const request = EXA_WEB_SEARCH_ADAPTER.buildRequest(params);
|
|
183
|
+
return async () => {
|
|
184
|
+
const response = await EXA_WEB_SEARCH_ADAPTER.fetchJson(request, apiKey, signal);
|
|
185
|
+
return EXA_WEB_SEARCH_ADAPTER.normalizeResponse(response, params);
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
const request = BRAVE_WEB_SEARCH_ADAPTER.buildRequest(params);
|
|
189
|
+
return async () => {
|
|
190
|
+
const response = await BRAVE_WEB_SEARCH_ADAPTER.fetchJson(request, apiKey, signal);
|
|
191
|
+
return BRAVE_WEB_SEARCH_ADAPTER.normalizeResponse(response, params);
|
|
192
|
+
};
|
|
193
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import { getProviderLabel } from "./web-search-results.js";
|
|
2
|
+
export const SEARCH_REQUEST_TIMEOUT_MS = 15_000;
|
|
3
|
+
export const WEB_SEARCH_MIN_REQUEST_INTERVAL_MS = 1_100;
|
|
4
|
+
function sleepWithAbort(ms, signal) {
|
|
5
|
+
if (ms <= 0) {
|
|
6
|
+
return Promise.resolve();
|
|
7
|
+
}
|
|
8
|
+
if (signal?.aborted === true) {
|
|
9
|
+
const reason = signal.reason;
|
|
10
|
+
// A caller-owned abort reason may be non-Error; preserve the original reason.
|
|
11
|
+
// oxlint-disable-next-line typescript/prefer-promise-reject-errors
|
|
12
|
+
return Promise.reject(reason ?? new Error("Web search cancelled"));
|
|
13
|
+
}
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
const cleanup = () => signal?.removeEventListener("abort", abort);
|
|
16
|
+
const timeout = setTimeout(() => {
|
|
17
|
+
cleanup();
|
|
18
|
+
resolve();
|
|
19
|
+
}, ms);
|
|
20
|
+
const abort = () => {
|
|
21
|
+
clearTimeout(timeout);
|
|
22
|
+
cleanup();
|
|
23
|
+
const reason = signal?.reason;
|
|
24
|
+
// A caller-owned abort reason may be non-Error; preserve the original reason.
|
|
25
|
+
// oxlint-disable-next-line typescript/prefer-promise-reject-errors
|
|
26
|
+
reject(reason ?? new Error("Web search cancelled"));
|
|
27
|
+
};
|
|
28
|
+
signal?.addEventListener("abort", abort, { once: true });
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
export class WebSearchRequestGate {
|
|
32
|
+
lastRequestStartedAt = 0;
|
|
33
|
+
tail = Promise.resolve();
|
|
34
|
+
run(signal, task) {
|
|
35
|
+
const runTask = async () => {
|
|
36
|
+
const elapsedMs = this.lastRequestStartedAt === 0
|
|
37
|
+
? WEB_SEARCH_MIN_REQUEST_INTERVAL_MS
|
|
38
|
+
: Date.now() - this.lastRequestStartedAt;
|
|
39
|
+
const waitMs = Math.max(0, WEB_SEARCH_MIN_REQUEST_INTERVAL_MS - elapsedMs);
|
|
40
|
+
if (waitMs > 0) {
|
|
41
|
+
await sleepWithAbort(waitMs, signal);
|
|
42
|
+
}
|
|
43
|
+
if (signal?.aborted === true) {
|
|
44
|
+
signal.throwIfAborted();
|
|
45
|
+
}
|
|
46
|
+
this.lastRequestStartedAt = Date.now();
|
|
47
|
+
return task();
|
|
48
|
+
};
|
|
49
|
+
const result = this.tail.then(runTask, runTask);
|
|
50
|
+
this.tail = result.catch(() => {
|
|
51
|
+
/* Failed requests release the queue; callers retain the original rejection. */
|
|
52
|
+
});
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function formatSearchHttpError(options) {
|
|
57
|
+
const { provider, status } = options;
|
|
58
|
+
const providerLabel = getProviderLabel(provider);
|
|
59
|
+
if (status === 429) {
|
|
60
|
+
return `${providerLabel} search rate limit exceeded (HTTP 429). Do not issue parallel or repeated agent_browser_web_search calls; use one high-signal query, inspect those results, then wait before retrying or ask the user to adjust their ${providerLabel} API plan/limits.`;
|
|
61
|
+
}
|
|
62
|
+
if (status === 401 || status === 403) {
|
|
63
|
+
return `${providerLabel} search failed with HTTP ${status}: Check your API credential and permissions.`;
|
|
64
|
+
}
|
|
65
|
+
if (status >= 500) {
|
|
66
|
+
return `${providerLabel} search failed with HTTP ${status}: Provider unavailable; retry later.`;
|
|
67
|
+
}
|
|
68
|
+
return `${providerLabel} search failed with HTTP ${status}: Request rejected; check the search parameters.`;
|
|
69
|
+
}
|
|
70
|
+
export async function fetchSearchJson(options) {
|
|
71
|
+
if (options.signal?.aborted === true) {
|
|
72
|
+
options.signal.throwIfAborted();
|
|
73
|
+
}
|
|
74
|
+
const controller = new AbortController();
|
|
75
|
+
const timeout = setTimeout(() => controller.abort(new Error(options.timeoutMessage)), options.timeoutMs);
|
|
76
|
+
const abort = () => controller.abort(options.signal?.reason ?? new Error(options.cancelMessage));
|
|
77
|
+
options.signal?.addEventListener("abort", abort, { once: true });
|
|
78
|
+
try {
|
|
79
|
+
const response = await fetch(options.request, { ...options.init, signal: controller.signal });
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
await response.body?.cancel().catch(() => {
|
|
82
|
+
// Disposal errors must not replace the source-free HTTP diagnostic.
|
|
83
|
+
});
|
|
84
|
+
throw new Error(formatSearchHttpError({
|
|
85
|
+
provider: options.provider,
|
|
86
|
+
status: response.status,
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
const text = await response.text();
|
|
90
|
+
try {
|
|
91
|
+
return JSON.parse(text);
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
// Parser messages and causes can include partial credentials from the response body.
|
|
95
|
+
throw new Error(options.invalidJsonMessage);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
finally {
|
|
99
|
+
clearTimeout(timeout);
|
|
100
|
+
options.signal?.removeEventListener("abort", abort);
|
|
101
|
+
}
|
|
102
|
+
}
|