@reticlehq/server 3.5.0 → 3.7.0
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/README.md +1 -1
- package/SKILL.md +123 -116
- package/dist/chromium-launch-options.d.ts +3 -1
- package/dist/chromium-launch-options.js +2 -1
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +19 -2
- package/dist/command/cli/adhoc-verdict.js +76 -9
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/answers/open-note.d.ts +2 -0
- package/dist/command/cli/answers/open-note.js +22 -0
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +31 -112
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +35 -5
- package/dist/command/cli/cli-verify.js +114 -35
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +192 -341
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +22 -0
- package/dist/command/cli/cloud-login.js +96 -8
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
- package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/drive/drive-attach.d.ts +27 -2
- package/dist/command/cli/drive/drive-attach.js +71 -4
- package/dist/command/cli/drive/drive-command.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +13 -7
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.d.ts +10 -0
- package/dist/command/cli/ports/port-holder.js +25 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +35 -12
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -181
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +20 -0
- package/dist/command/cli.js +130 -104
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +23 -1
- package/dist/command/daemon/daemon-resolve.js +79 -9
- package/dist/command/setup/agent-writer.d.ts +1 -1
- package/dist/command/setup/agent-writer.js +3 -2
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
- package/dist/command/setup/bringup/connect-lease.js +1 -0
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
- package/dist/command/setup/bringup/dev-server-wait.js +19 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +14 -1
- package/dist/command/setup/init/init-port.js +32 -2
- package/dist/command/setup/init/init-runtime.d.ts +22 -2
- package/dist/command/setup/init/init-runtime.js +114 -38
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +38 -9
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +2 -1
- package/dist/command/setup/run-setup.d.ts +34 -9
- package/dist/command/setup/run-setup.js +65 -51
- package/dist/command/setup/setup-command.d.ts +25 -1
- package/dist/command/setup/setup-command.js +59 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +49 -4
- package/dist/features/crawl/crawl-tools.js +4 -0
- package/dist/features/crawl/crawl.d.ts +6 -0
- package/dist/features/crawl/crawl.js +23 -2
- package/dist/features/exhaust/ledger.d.ts +21 -14
- package/dist/features/exhaust/ledger.js +35 -9
- package/dist/features/harness/app-findings.d.ts +2 -0
- package/dist/features/harness/app-findings.js +52 -0
- package/dist/features/harness/drive-report.d.ts +61 -1
- package/dist/features/harness/drive-report.js +394 -26
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +10 -14
- package/dist/features/harness/drivers.js +10 -14
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/fill-values.d.ts +3 -73
- package/dist/features/harness/fill-values.js +3 -169
- package/dist/features/harness/goals.d.ts +82 -0
- package/dist/features/harness/goals.js +330 -0
- package/dist/features/harness/harness.d.ts +51 -1
- package/dist/features/harness/harness.js +207 -6
- package/dist/features/harness/platform/drive-target.d.ts +30 -0
- package/dist/features/harness/platform/drive-target.js +81 -0
- package/dist/features/harness/platform/local-apps.d.ts +127 -0
- package/dist/features/harness/platform/local-apps.js +280 -0
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +186 -0
- package/dist/features/harness/platform/remote-drive.js +378 -0
- package/dist/features/harness/platform/script.d.ts +94 -0
- package/dist/features/harness/platform/script.js +260 -0
- package/dist/features/harness/platform/server-driver.d.ts +54 -0
- package/dist/features/harness/platform/server-driver.js +182 -0
- package/dist/features/harness/platform-config.d.ts +41 -1
- package/dist/features/harness/platform-config.js +106 -9
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/app-controls.d.ts +5 -0
- package/dist/features/harness/script/app-controls.js +40 -0
- package/dist/features/harness/script/lane-ids.d.ts +14 -0
- package/dist/features/harness/script/lane-ids.js +16 -0
- package/dist/features/harness/script/script-run.d.ts +70 -0
- package/dist/features/harness/script/script-run.js +606 -0
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.d.ts +10 -1
- package/dist/features/visual/visual-tools.js +62 -17
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +23 -0
- package/dist/hooks/driven-by.js +56 -0
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/hooks/hook-commands.js +15 -4
- package/dist/hooks/tool-log.d.ts +9 -0
- package/dist/hooks/tool-log.js +29 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -243
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
- package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
- package/dist/judgement/runs/artifact/run-store.js +195 -3
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +71 -1
- package/dist/judgement/runs/drive-run.js +317 -5
- package/dist/judgement/runs/repair-prompt.js +1 -1
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +13 -3
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +5 -2
- package/dist/judgement/runs/verification-sync.js +40 -18
- package/dist/language/flows/change/gate.d.ts +10 -0
- package/dist/language/flows/change/gate.js +22 -0
- package/dist/language/flows/decision.js +36 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +61 -10
- package/dist/language/flows/flow-anchor.js +98 -6
- package/dist/language/flows/flow-cross-step.d.ts +15 -0
- package/dist/language/flows/flow-cross-step.js +21 -0
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +45 -14
- package/dist/language/flows/flow-mutate-tools.js +5 -3
- package/dist/language/flows/flow-replay-run.d.ts +23 -9
- package/dist/language/flows/flow-replay-run.js +115 -110
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +40 -1
- package/dist/language/flows/flow-replay.js +110 -22
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-scope.js +5 -1
- package/dist/language/flows/flow-step-runners.d.ts +22 -2
- package/dist/language/flows/flow-step-runners.js +247 -47
- package/dist/language/flows/flow-store-for-session.d.ts +2 -2
- package/dist/language/flows/flow-store-for-session.js +7 -3
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +112 -89
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +74 -12
- package/dist/language/flows/heal-run.js +6 -4
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/flake.d.ts +2 -2
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
- package/dist/language/flows/recording/tape/recordings.js +95 -13
- package/dist/language/flows/replay-from-hud.d.ts +20 -0
- package/dist/language/flows/replay-from-hud.js +51 -0
- package/dist/language/flows/replay.d.ts +9 -5
- package/dist/language/flows/replay.js +56 -15
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/suite/suite-flakes.js +2 -0
- package/dist/language/flows/suite-selection.d.ts +2 -15
- package/dist/language/flows/suite-selection.js +4 -3
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +202 -191
- package/dist/launch-chromium.d.ts +27 -5
- package/dist/launch-chromium.js +38 -8
- package/dist/memory/cloud/cloud-config.d.ts +22 -1
- package/dist/memory/cloud/cloud-config.js +34 -5
- package/dist/memory/cloud/cloud-sync.d.ts +17 -14
- package/dist/memory/cloud/cloud-sync.js +15 -4
- package/dist/memory/cloud/harness-config.d.ts +75 -1
- package/dist/memory/cloud/harness-config.js +115 -24
- package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
- package/dist/memory/cloud/hud-notices-source.js +128 -0
- package/dist/memory/cloud/memory-scope.d.ts +161 -0
- package/dist/memory/cloud/memory-scope.js +227 -0
- package/dist/memory/cloud/sync-cycle.d.ts +44 -7
- package/dist/memory/cloud/sync-cycle.js +129 -15
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +121 -9
- package/dist/memory/cloud/sync-disk.d.ts +1 -1
- package/dist/memory/cloud/sync-disk.js +31 -10
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +34 -0
- package/dist/memory/impact/account-watch.js +59 -0
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +12 -2
- package/dist/memory/impact/impact-store.d.ts +17 -4
- package/dist/memory/impact/impact-store.js +169 -63
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +14 -2
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +122 -4
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/envelope.d.ts +8 -8
- package/dist/memory/journal/journal-recorder.js +52 -3
- package/dist/memory/journal/on-disk/retention.d.ts +8 -0
- package/dist/memory/journal/on-disk/retention.js +32 -2
- package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
- package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +42 -9
- package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
- package/dist/memory/project/artifact-root-resolver.js +125 -16
- package/dist/memory/project/artifact-root.d.ts +46 -8
- package/dist/memory/project/artifact-root.js +89 -10
- package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
- package/dist/memory/project/dir/reticle-dir.js +26 -3
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/project-tools.js +22 -3
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +26 -1
- package/dist/memory/project/session-root.js +49 -5
- package/dist/memory/project/sync-status.d.ts +85 -0
- package/dist/memory/project/sync-status.js +224 -0
- package/dist/memory/recall/memory-tools.js +47 -2
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.d.ts +19 -0
- package/dist/memory/recall/project-memory.js +80 -13
- package/dist/portal/bridge/bridge.d.ts +9 -3
- package/dist/portal/bridge/bridge.js +82 -22
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/pairing-token.d.ts +9 -0
- package/dist/portal/bridge/pairing-token.js +17 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +83 -10
- package/dist/portal/input/real-input.js +218 -30
- package/dist/portal/input/viewport-tools.js +3 -3
- package/dist/portal/pool/browser-pool.d.ts +70 -9
- package/dist/portal/pool/browser-pool.js +190 -37
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +35 -0
- package/dist/portal/pool/playwright-launcher.js +64 -3
- package/dist/portal/pool/pool-contract.d.ts +28 -5
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.d.ts +8 -0
- package/dist/portal/session/command-payload.js +24 -0
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
- package/dist/portal/session/dev-server/dev-command.js +87 -12
- package/dist/portal/session/facts/departure-note.d.ts +22 -0
- package/dist/portal/session/facts/departure-note.js +47 -0
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/facts/session-replaced.d.ts +5 -0
- package/dist/portal/session/facts/session-replaced.js +5 -0
- package/dist/portal/session/first-run-wiring.d.ts +42 -0
- package/dist/portal/session/first-run-wiring.js +132 -0
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/human/notes-ledger.d.ts +20 -0
- package/dist/portal/session/human/notes-ledger.js +55 -0
- package/dist/portal/session/human/review-store.d.ts +12 -0
- package/dist/portal/session/human/review-store.js +18 -10
- package/dist/portal/session/live-control-tools.d.ts +0 -13
- package/dist/portal/session/live-control-tools.js +107 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
- package/dist/portal/session/no-session-diagnosis.js +46 -9
- package/dist/portal/session/no-session-next-action.d.ts +31 -0
- package/dist/portal/session/no-session-next-action.js +159 -60
- package/dist/portal/session/no-session-watch.d.ts +14 -1
- package/dist/portal/session/no-session-watch.js +227 -17
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/presence/session-mirror.js +3 -0
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/serving-directory.d.ts +27 -0
- package/dist/portal/session/serving-directory.js +45 -0
- package/dist/portal/session/session-health.d.ts +18 -0
- package/dist/portal/session/session-health.js +9 -1
- package/dist/portal/session/session-info.d.ts +8 -1
- package/dist/portal/session/session-info.js +8 -1
- package/dist/portal/session/session-manager.d.ts +39 -0
- package/dist/portal/session/session-manager.js +98 -11
- package/dist/portal/session/session-reaper.js +4 -1
- package/dist/portal/session/session-successor.d.ts +13 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session-tools.js +26 -3
- package/dist/portal/session/session.d.ts +22 -30
- package/dist/portal/session/session.js +81 -79
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +12 -0
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +23 -1
- package/dist/status-payload.js +36 -1
- package/dist/surface/http-server.js +18 -2
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
- package/dist/surface/mcp/mcp-proxy.js +65 -13
- package/dist/surface/mcp/mcp.d.ts +34 -6
- package/dist/surface/mcp/mcp.js +61 -17
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.d.ts +4 -2
- package/dist/surface/mcp/server-instructions.js +32 -14
- package/dist/surface/mcp/shared-params.js +2 -2
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act/settle-in-flight.js +25 -3
- package/dist/surface/tools/act-sequence-tool.js +138 -29
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +71 -41
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +42 -17
- package/dist/surface/tools/browser-tools.js +51 -2
- package/dist/surface/tools/chat-drives.d.ts +101 -0
- package/dist/surface/tools/chat-drives.js +409 -0
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +51 -0
- package/dist/surface/tools/empty-session-list.js +120 -0
- package/dist/surface/tools/error-recovery.d.ts +14 -0
- package/dist/surface/tools/error-recovery.js +105 -8
- package/dist/surface/tools/explore-tools.d.ts +31 -1
- package/dist/surface/tools/explore-tools.js +438 -66
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +18 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +118 -57
- package/dist/surface/tools/harness-explore.js +344 -292
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +17 -0
- package/dist/surface/tools/harness-plan.js +38 -0
- package/dist/surface/tools/harness-script.d.ts +30 -0
- package/dist/surface/tools/harness-script.js +560 -0
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +22 -1
- package/dist/surface/tools/harness-toolset.js +101 -7
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +263 -85
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +49 -0
- package/dist/surface/tools/lease-seed.js +167 -0
- package/dist/surface/tools/lease-tools.d.ts +13 -24
- package/dist/surface/tools/lease-tools.js +146 -197
- package/dist/surface/tools/live-call-text.js +4 -4
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +29 -0
- package/dist/surface/tools/next-step.js +214 -0
- package/dist/surface/tools/observe-tools.js +45 -9
- package/dist/surface/tools/platform-moment.d.ts +72 -0
- package/dist/surface/tools/platform-moment.js +296 -0
- package/dist/surface/tools/query-hint-schema.d.ts +7 -0
- package/dist/surface/tools/query-hint-schema.js +10 -0
- package/dist/surface/tools/read-tools.js +71 -14
- package/dist/surface/tools/real-input-attempt.js +96 -13
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +83 -3
- package/dist/surface/tools/tool-kit.js +77 -7
- package/dist/surface/tools/tools.js +43 -59
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +29 -6
- package/dist/telemetry/hud-metrics.js +116 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +38 -2
- package/dist/telemetry/telemetry.js +144 -34
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +13 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +20 -6
- package/docs/README.md +3 -3
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +25 -28
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +33 -28
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +14 -3
- package/docs/cli/drive.mdx +20 -14
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +43 -28
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +18 -5
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +5 -4
- package/docs/cli.mdx +111 -42
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +9 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +7 -8
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +65 -61
- package/docs/human-control.md +16 -16
- package/docs/index.mdx +15 -42
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +23 -13
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +9 -9
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +32 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +69 -30
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +23 -25
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +22 -13
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +55 -46
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +17 -5
- package/docs/what-is-reticle.mdx +5 -3
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -241
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/features/harness/driver.d.ts +0 -50
- package/dist/features/harness/driver.js +0 -236
- package/dist/features/harness/jev-driver.d.ts +0 -188
- package/dist/features/harness/jev-driver.js +0 -678
- package/dist/features/harness/openai-driver.d.ts +0 -58
- package/dist/features/harness/openai-driver.js +0 -206
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
- package/dist/memory/project/dir/fill-value-store.js +0 -88
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
- package/docs/local-registry.md +0 -143
|
@@ -12,11 +12,11 @@
|
|
|
12
12
|
import { takeJsCoverage } from './js-coverage.js';
|
|
13
13
|
import { stampedDriveUrl } from './drive-url-stamp.js';
|
|
14
14
|
import { launchChromium } from '../../launch-chromium.js';
|
|
15
|
-
import { chromiumLaunchHint, gotoOptions } from '../pool/playwright-launcher.js';
|
|
15
|
+
import { chromiumLaunchHint, gotoOptions, SCREENSHOT_DETERMINISM, captureWithChromeHidden, } from '../pool/playwright-launcher.js';
|
|
16
16
|
import { BrowserLaunchKind } from '@reticlehq/core/telemetry';
|
|
17
17
|
import { getSessionMetrics } from '../../telemetry/session-metrics.js';
|
|
18
18
|
import { classifyConnectFailure } from '../../telemetry/connect-failure.js';
|
|
19
|
-
import { ActionType, DriveErrorCode, DRIVE_PLAYWRIGHT_MISSING_MSG } from '@reticlehq/core';
|
|
19
|
+
import { ActionType, clampHoldMs, DriveErrorCode, DRIVE_PLAYWRIGHT_MISSING_MSG, explicitCodeFromArgs, InputMode, InputModeReason, pressKeyFromArgs, pressKeysFromArgs, pressModifiersFromArgs, } from '@reticlehq/core';
|
|
20
20
|
import { installNetworkMocks } from './network-mock.js';
|
|
21
21
|
import { attachNetworkDetail } from './network-detail.js';
|
|
22
22
|
import { injectedConnectArgs } from '../pool/zero-install.js';
|
|
@@ -34,8 +34,8 @@ export function boxCenter(box) {
|
|
|
34
34
|
return { cx: box.x + box.width / 2, cy: box.y + box.height / 2 };
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Which actions are driven by native pointer
|
|
38
|
-
*
|
|
37
|
+
* Which actions are driven by a native pointer. `press` is excluded on purpose — a key has no
|
|
38
|
+
* pointer, and widening this would change what every existing caller of it means.
|
|
39
39
|
*/
|
|
40
40
|
export function isPointerAction(action) {
|
|
41
41
|
return (action === ActionType.HOVER ||
|
|
@@ -43,37 +43,217 @@ export function isPointerAction(action) {
|
|
|
43
43
|
action === ActionType.DBLCLICK ||
|
|
44
44
|
action === ActionType.DRAG);
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* The routing question `tryRealInput` asks: does this action have a real-input path at all? Wider
|
|
48
|
+
* than `isPointerAction` by `press`, which needs no coordinates.
|
|
49
|
+
*/
|
|
50
|
+
export function isRealInputAction(action) {
|
|
51
|
+
return isPointerAction(action) || action === ActionType.PRESS;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* A gesture that was NOT driven. No center for a key press — a zero would read as a real point.
|
|
55
|
+
*
|
|
56
|
+
* `inputMode` is SYNTHETIC: no real gesture ran, so this is the path the caller is about to take.
|
|
57
|
+
*/
|
|
58
|
+
function undriven(action, box) {
|
|
59
|
+
const base = { performed: false, inputMode: InputMode.SYNTHETIC };
|
|
60
|
+
return action === ActionType.PRESS ? base : { ...base, center: boxCenter(box) };
|
|
61
|
+
}
|
|
46
62
|
/** Settle delay after a native gesture so the reaction can begin to flush (named, not free). */
|
|
47
63
|
const REAL_INPUT_SETTLE_MS = 16;
|
|
48
64
|
/** Default number of interpolation steps for a native drag. */
|
|
49
65
|
const DEFAULT_DRAG_STEPS = 8;
|
|
66
|
+
/**
|
|
67
|
+
* Drive a `press` with a real keyboard — coordinate-free; the key goes to whatever holds focus.
|
|
68
|
+
* Key and modifiers come from the same core helpers the synthetic dispatcher uses, so the two paths
|
|
69
|
+
* cannot read the same args differently.
|
|
70
|
+
*
|
|
71
|
+
* A `holdMs` splits the chord into down / wait / up, the same shape the page uses for a held key.
|
|
72
|
+
* `keyboard.press` would send it instantly instead, reporting a hold-to-confirm that never held.
|
|
73
|
+
* The one thing this cannot reproduce is the auto-repeat a held key emits: the driver sends a single
|
|
74
|
+
* keydown, where the in-page path sends the repeats a browser would. Named rather than papered over
|
|
75
|
+
* — an app that counts repeats needs the synthetic path, and a caller that sees a held key do
|
|
76
|
+
* nothing now has a reason to try it.
|
|
77
|
+
*/
|
|
78
|
+
async function pressViaKeyboard(page, args, sleep, now) {
|
|
79
|
+
const key = pressKeyFromArgs(args);
|
|
80
|
+
const modifiers = pressModifiersFromArgs(args);
|
|
81
|
+
const chord = 0 < modifiers.length ? `${modifiers.join('+')}+${key}` : key;
|
|
82
|
+
const holdMs = clampHoldMs(args.holdMs);
|
|
83
|
+
if (0 === holdMs) {
|
|
84
|
+
// `press` DOES take a chord string ("Control+k"), so the tap path needs no splitting.
|
|
85
|
+
await page.keyboard.press(chord);
|
|
86
|
+
return 0;
|
|
87
|
+
}
|
|
88
|
+
/*
|
|
89
|
+
* `down`/`up` take ONE key each, unlike `press`: `down('Control+k')` throws
|
|
90
|
+
* `Unknown key: "Control+k"` — measured on a real Chromium, not assumed. The chord string the
|
|
91
|
+
* tap path uses therefore cannot express a hold, so the chord is split here: modifiers down in
|
|
92
|
+
* chord order, the key last, and released in reverse (key first, modifiers reversed), which is
|
|
93
|
+
* what a hand does and what an app's keyup bookkeeping expects.
|
|
94
|
+
*
|
|
95
|
+
* Without the split a held shortcut threw before a single key moved, the caller fell back to
|
|
96
|
+
* the synthetic path, and a real hold was impossible for any press with modifiers — the exact
|
|
97
|
+
* gesture `holdMs` exists for.
|
|
98
|
+
*
|
|
99
|
+
* ## Why every key that went down is tracked, and every exit path cleans up
|
|
100
|
+
*
|
|
101
|
+
* The down calls are the ones that MOVE the keyboard, and they can fail partway: `Control` goes
|
|
102
|
+
* down, the key after it rejects, and the driver's copy of `Control` is still held. That path
|
|
103
|
+
* used to fall straight to the caller's synthetic replay — which presses the same chord again on
|
|
104
|
+
* a keyboard that is already holding a modifier. Tracking what actually went down is what makes
|
|
105
|
+
* the cleanup below able to release the right keys, and only those: releasing a key that never
|
|
106
|
+
* went down is its own lie, and it would turn a clean failure into an unnecessary refusal.
|
|
107
|
+
*/
|
|
108
|
+
const pressed = [];
|
|
109
|
+
const pressDown = async (k) => {
|
|
110
|
+
await page.keyboard.down(k);
|
|
111
|
+
pressed.push(k);
|
|
112
|
+
};
|
|
113
|
+
try {
|
|
114
|
+
for (const modifier of modifiers)
|
|
115
|
+
await pressDown(modifier);
|
|
116
|
+
await pressDown(key);
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
// The chord is PARTIALLY down. Release what is held before reporting the failure; if that
|
|
120
|
+
// cannot be proved, `releaseKeys` throws RELEASE_FAILED and the caller refuses the replay —
|
|
121
|
+
// the same rule as a failed release on the ordinary path, for the same reason. Only when the
|
|
122
|
+
// cleanup DOES succeed is the original error safe to hand back.
|
|
123
|
+
await releaseKeys(page, pressed);
|
|
124
|
+
throw error;
|
|
125
|
+
}
|
|
126
|
+
const startedAt = now();
|
|
127
|
+
try {
|
|
128
|
+
await sleep(holdMs);
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
// The wait failed, and the caller is about to run the synthetic path — which presses this SAME
|
|
132
|
+
// key a second time. If the driver's copy stays down, a held modifier then colours every later
|
|
133
|
+
// action for the rest of the run. Best-effort on purpose: whatever went wrong with the wait is
|
|
134
|
+
// the error worth reporting. A cleanup that cannot be proved is the exception — that one is a
|
|
135
|
+
// stuck key, and it must reach the caller as a refusal rather than be swallowed.
|
|
136
|
+
try {
|
|
137
|
+
await releaseKeys(page, pressed);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
throw new DriveError(DriveErrorCode.RELEASE_FAILED, 'the wait failed and the keys it pressed could not be released, so they may still be held');
|
|
141
|
+
}
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
// NOT best-effort: on the ordinary path a failed release is a real failure the caller must hear
|
|
145
|
+
// about, and swallowing it would report a press whose key is still down.
|
|
146
|
+
await releaseKeys(page, pressed);
|
|
147
|
+
return now() - startedAt;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Release the given keys, in reverse press order, and report a failure as one that leaves the
|
|
151
|
+
* keyboard UNKNOWN rather than as an ordinary provider error.
|
|
152
|
+
*
|
|
153
|
+
* Every release is attempted even after one fails: a stuck `Control` is worse than a stuck letter,
|
|
154
|
+
* so a failure on one key must not skip the rest. The first failure is what is thrown, since it is
|
|
155
|
+
* the one that happened first, and it is wrapped in `DriveError` so the caller can tell "this
|
|
156
|
+
* gesture failed" from "this gesture may have left a key down" — the difference between a safe
|
|
157
|
+
* synthetic replay and an unsafe one.
|
|
158
|
+
*/
|
|
159
|
+
async function releaseKeys(page, pressed) {
|
|
160
|
+
let failure;
|
|
161
|
+
for (const k of [...pressed].reverse()) {
|
|
162
|
+
try {
|
|
163
|
+
await page.keyboard.up(k);
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
failure ??= error;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
if (failure !== undefined) {
|
|
170
|
+
throw new DriveError(DriveErrorCode.RELEASE_FAILED, `the key was pressed but could not be released, so it may still be held: ${describeFailure(failure)}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* A thrown value as a line a reader can act on.
|
|
175
|
+
*
|
|
176
|
+
* Not `String(error)`: a non-Error thrown value (a rejected plain object, an SDK that throws a
|
|
177
|
+
* record) stringifies to `[object Object]`, which names nothing and hides the one fact the message
|
|
178
|
+
* exists to carry. Anything that is neither an Error nor a string says so rather than pretending.
|
|
179
|
+
*/
|
|
180
|
+
function describeFailure(error) {
|
|
181
|
+
if (error instanceof Error)
|
|
182
|
+
return error.message;
|
|
183
|
+
return 'string' === typeof error ? error : 'an unknown error';
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* The `press`es this module will NOT drive: a chord that only the in-page dispatcher can express.
|
|
187
|
+
*
|
|
188
|
+
* `args.keys` asks for several keys held down TOGETHER, pressed in order and released in reverse.
|
|
189
|
+
* That is not a `page.keyboard.press` chord — a non-modifier key cannot appear before the last `+`
|
|
190
|
+
* — and a real keyboard cannot aim a key at a named element. `args.code` is the third: the driver
|
|
191
|
+
* presses by KEY name and offers no way to send a physical `code` that disagrees with it, so
|
|
192
|
+
* `{ text: 'z', code: 'KeyY' }` would strike a different key than the one asked for. All three are
|
|
193
|
+
* routed to the synthetic path by the caller, which reports the reason rather than pretending a
|
|
194
|
+
* different gesture happened.
|
|
195
|
+
*
|
|
196
|
+
* Ordered by how specifically the caller asked: `keys` then `code` name the KEY, `ref` names only
|
|
197
|
+
* the target. Two can apply at once, and the earlier one is the more unusual request — the reason
|
|
198
|
+
* should name that, not the generic "you passed a ref".
|
|
199
|
+
*/
|
|
200
|
+
export function unspellablePressReason(ref, args) {
|
|
201
|
+
if (0 < pressKeysFromArgs(args).length) {
|
|
202
|
+
return InputModeReason.SYNTHETIC_MULTI_KEY_PRESS_PREFERRED;
|
|
203
|
+
}
|
|
204
|
+
if (explicitCodeFromArgs(args) !== undefined) {
|
|
205
|
+
return InputModeReason.SYNTHETIC_KEY_CODE_PRESS_PREFERRED;
|
|
206
|
+
}
|
|
207
|
+
if (0 < ref.length)
|
|
208
|
+
return InputModeReason.SYNTHETIC_ELEMENT_PRESS_PREFERRED;
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
50
211
|
/**
|
|
51
212
|
* Shared gesture executor: drive a native gesture on an already-resolved Page. Used by both the
|
|
52
213
|
* CDP-attached and the launched (drive) providers so the pointer logic lives in one place.
|
|
53
214
|
*/
|
|
54
|
-
export async function performGesture(page, action, box, args, sleep
|
|
215
|
+
export async function performGesture(page, action, box, args, sleep,
|
|
216
|
+
/** Injected so a test can assert the achieved hold deterministically; defaults to the real clock. */
|
|
217
|
+
now = Date.now) {
|
|
218
|
+
// Ahead of the box, not after it: a press addresses focus rather than a point, and the
|
|
219
|
+
// placeholder box its caller passes would otherwise be turned into a (0,0) that reads like a real
|
|
220
|
+
// location. The result reports NO `center` for the same reason.
|
|
221
|
+
if (action === ActionType.PRESS) {
|
|
222
|
+
const heldMs = await pressViaKeyboard(page, args, sleep, now);
|
|
223
|
+
return {
|
|
224
|
+
performed: true,
|
|
225
|
+
inputMode: InputMode.REAL,
|
|
226
|
+
// Omitted rather than 0 when there was no hold — see `RealInputResult.heldMs`.
|
|
227
|
+
...(heldMs > 0 ? { heldMs } : {}),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
55
230
|
const center = boxCenter(box);
|
|
56
231
|
const { cx, cy } = center;
|
|
232
|
+
const real = (performed) => ({
|
|
233
|
+
performed,
|
|
234
|
+
center,
|
|
235
|
+
inputMode: InputMode.REAL,
|
|
236
|
+
});
|
|
57
237
|
if (action === ActionType.HOVER) {
|
|
58
238
|
await page.mouse.move(cx, cy);
|
|
59
239
|
await page.mouse.move(cx + 1, cy);
|
|
60
240
|
await page.mouse.move(cx, cy);
|
|
61
241
|
await sleep(REAL_INPUT_SETTLE_MS);
|
|
62
|
-
return
|
|
242
|
+
return real(true);
|
|
63
243
|
}
|
|
64
244
|
if (action === ActionType.CLICK) {
|
|
65
245
|
await page.mouse.move(cx, cy);
|
|
66
246
|
await page.mouse.click(cx, cy);
|
|
67
|
-
return
|
|
247
|
+
return real(true);
|
|
68
248
|
}
|
|
69
249
|
if (action === ActionType.DBLCLICK) {
|
|
70
250
|
await page.mouse.move(cx, cy);
|
|
71
251
|
await page.mouse.dblclick(cx, cy);
|
|
72
|
-
return
|
|
252
|
+
return real(true);
|
|
73
253
|
}
|
|
74
254
|
if (action === ActionType.DRAG) {
|
|
75
255
|
if (args.toBox === undefined)
|
|
76
|
-
return
|
|
256
|
+
return real(false);
|
|
77
257
|
const dst = boxCenter(args.toBox);
|
|
78
258
|
const steps = args.steps ?? DEFAULT_DRAG_STEPS;
|
|
79
259
|
await page.mouse.move(cx, cy);
|
|
@@ -84,34 +264,38 @@ export async function performGesture(page, action, box, args, sleep) {
|
|
|
84
264
|
await page.mouse.move(px, py, { steps: 1 });
|
|
85
265
|
}
|
|
86
266
|
await page.mouse.up();
|
|
87
|
-
return
|
|
267
|
+
return real(true);
|
|
88
268
|
}
|
|
89
269
|
if (action === ActionType.FILL || action === ActionType.TYPE) {
|
|
90
270
|
await page.mouse.click(cx, cy);
|
|
91
271
|
await page.keyboard.type(args.value ?? args.text ?? '');
|
|
92
|
-
return
|
|
272
|
+
return real(true);
|
|
93
273
|
}
|
|
94
|
-
return
|
|
274
|
+
return real(false);
|
|
95
275
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Reticle paints its own dev overlay (presenter HUD + border glow) into the page. That chrome is
|
|
98
|
-
* time-varying — the activity log and border state change with every command — so capturing it
|
|
99
|
-
* makes a fresh screenshot of an unchanged page differ from its baseline. Hide it during capture
|
|
100
|
-
* (Playwright applies this stylesheet only for the shot, then reverts) so visual baselines reflect
|
|
101
|
-
* the app, not Reticle. Disabling animations settles any remaining transitions for determinism.
|
|
102
|
-
*/
|
|
103
|
-
const HIDE_RETICLE_CHROME_CSS = '[data-reticle-overlay]{display:none !important}';
|
|
104
|
-
const SCREENSHOT_DETERMINISM = { style: HIDE_RETICLE_CHROME_CSS, animations: 'disabled' };
|
|
105
276
|
/**
|
|
106
277
|
* Capture a PNG from a Playwright page. Shared by the CDP + launched providers so the
|
|
107
278
|
* screenshot path lives in one place (mirrors performGesture). Returns the raw PNG bytes.
|
|
108
279
|
*/
|
|
109
280
|
export async function capturePage(page, opts) {
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
:
|
|
113
|
-
|
|
114
|
-
|
|
281
|
+
// A step capture injects nothing into the page, so Reticle's own hosts are hidden another way.
|
|
282
|
+
if (true === opts.cssScale) {
|
|
283
|
+
return captureWithChromeHidden({ evaluate: (script) => page.evaluate(script) }, () => shoot(page, opts));
|
|
284
|
+
}
|
|
285
|
+
return shoot(page, opts);
|
|
286
|
+
}
|
|
287
|
+
async function shoot(page, opts) {
|
|
288
|
+
const buf = await page.screenshot(opts.jpegQuality !== undefined
|
|
289
|
+
? {
|
|
290
|
+
type: 'jpeg',
|
|
291
|
+
quality: opts.jpegQuality,
|
|
292
|
+
...(true === opts.cssScale ? { scale: 'css' } : {}),
|
|
293
|
+
}
|
|
294
|
+
: opts.clip !== undefined
|
|
295
|
+
? { ...SCREENSHOT_DETERMINISM, clip: opts.clip }
|
|
296
|
+
: true === opts.fullPage
|
|
297
|
+
? { ...SCREENSHOT_DETERMINISM, fullPage: true }
|
|
298
|
+
: { ...SCREENSHOT_DETERMINISM });
|
|
115
299
|
return new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);
|
|
116
300
|
}
|
|
117
301
|
const nodeSleep = (ms) => new Promise((resolve) => {
|
|
@@ -138,6 +322,7 @@ const cdpConnect = async (url) => {
|
|
|
138
322
|
export class CdpRealInputProvider {
|
|
139
323
|
#cdpUrl;
|
|
140
324
|
#sleep;
|
|
325
|
+
#now;
|
|
141
326
|
#connect;
|
|
142
327
|
#onNetworkDetail;
|
|
143
328
|
/** Pages already listening. #pageFor resolves on EVERY call, so without this each action would add
|
|
@@ -149,6 +334,7 @@ export class CdpRealInputProvider {
|
|
|
149
334
|
constructor(options) {
|
|
150
335
|
this.#cdpUrl = options.cdpUrl;
|
|
151
336
|
this.#sleep = options.sleep ?? nodeSleep;
|
|
337
|
+
this.#now = options.now ?? Date.now;
|
|
152
338
|
this.#connect = options.connect ?? cdpConnect;
|
|
153
339
|
this.#onNetworkDetail = options.onNetworkDetail;
|
|
154
340
|
}
|
|
@@ -205,8 +391,8 @@ export class CdpRealInputProvider {
|
|
|
205
391
|
async perform(sessionUrl, action, box, args) {
|
|
206
392
|
const page = await this.#pageFor(sessionUrl);
|
|
207
393
|
if (page === undefined)
|
|
208
|
-
return
|
|
209
|
-
return performGesture(page, action, box, args, this.#sleep);
|
|
394
|
+
return undriven(action, box);
|
|
395
|
+
return performGesture(page, action, box, args, this.#sleep, this.#now);
|
|
210
396
|
}
|
|
211
397
|
/** PNG of the correlated page, or undefined if none matches. */
|
|
212
398
|
async screenshot(sessionUrl, opts) {
|
|
@@ -309,6 +495,7 @@ export class LaunchedRealInputProvider {
|
|
|
309
495
|
#driveUrl;
|
|
310
496
|
#headless;
|
|
311
497
|
#sleep;
|
|
498
|
+
#now;
|
|
312
499
|
#launch;
|
|
313
500
|
#injectConnect;
|
|
314
501
|
#storageState;
|
|
@@ -321,6 +508,7 @@ export class LaunchedRealInputProvider {
|
|
|
321
508
|
this.#driveUrl = options.driveUrl;
|
|
322
509
|
this.#headless = options.headless;
|
|
323
510
|
this.#sleep = options.sleep ?? nodeSleep;
|
|
511
|
+
this.#now = options.now ?? Date.now;
|
|
324
512
|
this.#launch = options.launch ?? launchedChromium;
|
|
325
513
|
this.#injectConnect = options.injectConnect;
|
|
326
514
|
this.#storageState = options.storageState;
|
|
@@ -438,8 +626,8 @@ export class LaunchedRealInputProvider {
|
|
|
438
626
|
perform(_sessionUrl, action, box, args) {
|
|
439
627
|
const page = this.#livePage();
|
|
440
628
|
if (page === undefined)
|
|
441
|
-
return Promise.resolve(
|
|
442
|
-
return performGesture(page, action, box, args, this.#sleep);
|
|
629
|
+
return Promise.resolve(undriven(action, box));
|
|
630
|
+
return performGesture(page, action, box, args, this.#sleep, this.#now);
|
|
443
631
|
}
|
|
444
632
|
/** PNG of the owned page, or undefined before navigate / after dispose. */
|
|
445
633
|
screenshot(_sessionUrl, opts) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { CDP_NO_PROVIDER_REASON,
|
|
2
|
+
import { CDP_NO_PROVIDER_REASON, VIEWPORT_NO_PROVIDER_RECOMMENDATION } from '@reticlehq/core';
|
|
3
3
|
import { ReticleTool } from '@reticlehq/core';
|
|
4
4
|
import { sessionIdShape } from '../../surface/tools/tool-kit.js';
|
|
5
5
|
import { MAX_VIEWPORT_PX, MIN_VIEWPORT_PX, viewportPxSchema, } from '../../surface/tools/args/numeric-bounds.js';
|
|
@@ -16,7 +16,7 @@ function viewportProvider(deps) {
|
|
|
16
16
|
export const VIEWPORT_TOOLS = [
|
|
17
17
|
{
|
|
18
18
|
name: ReticleTool.VIEWPORT,
|
|
19
|
-
description: 'Pin the DRIVEN page (needs `reticle drive`) to a fixed viewport size so a screenshot baseline is ' +
|
|
19
|
+
description: 'Pin the DRIVEN or LEASED page (needs `reticle drive`, or `reticle_lease` acquire when there is no CDP provider) to a fixed viewport size so a screenshot baseline is ' +
|
|
20
20
|
'reproducible across machines — the missing piece of CI-stable visual regression, alongside ' +
|
|
21
21
|
'reticle_visual_diff `masks` and a frozen clock (reticle_clock). Set it once before reticle_screenshot / ' +
|
|
22
22
|
'reticle_visual_diff. Returns { applied, width, height } or the no-provider recommendation.',
|
|
@@ -60,7 +60,7 @@ export const VIEWPORT_TOOLS = [
|
|
|
60
60
|
height: 0,
|
|
61
61
|
ok: false,
|
|
62
62
|
reason: CDP_NO_PROVIDER_REASON,
|
|
63
|
-
recommendation:
|
|
63
|
+
recommendation: VIEWPORT_NO_PROVIDER_RECOMMENDATION,
|
|
64
64
|
};
|
|
65
65
|
},
|
|
66
66
|
},
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* the thin Playwright adapter that satisfies these interfaces lives separately.
|
|
11
11
|
*/
|
|
12
12
|
import { type SeedStorage } from '@reticlehq/core';
|
|
13
|
-
import type { Launcher, PooledMockRule } from './pool-contract.js';
|
|
13
|
+
import type { Launcher, PooledMockRule, ScreenshotOptions } from './pool-contract.js';
|
|
14
14
|
export type { InitScriptHandle, Launcher, PooledBrowser, PooledContext, PooledCookie, PooledDialog, PooledMockRule, PooledPage, } from './pool-contract.js';
|
|
15
15
|
/** A leased context+page for one flow. `release` frees the slot and closes the context. */
|
|
16
16
|
export interface Lease {
|
|
@@ -42,9 +42,17 @@ interface BrowserPoolOptions {
|
|
|
42
42
|
* the ~450KB build is only read if some page ever needs it; undefined when there is none to give.
|
|
43
43
|
*/
|
|
44
44
|
zeroInstallScript?: () => string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Launches a browser with a window, for a lease somebody wants to watch. Launched only when the
|
|
47
|
+
* first headed lease is asked for. Absent: a headed lease is refused.
|
|
48
|
+
*/
|
|
49
|
+
launchHeaded?: Launcher;
|
|
45
50
|
}
|
|
51
|
+
/** What a headed lease is refused with where no window can be opened. */
|
|
52
|
+
export declare const NO_HEADED_BROWSER = "no headed browser can be opened here";
|
|
46
53
|
/**
|
|
47
|
-
* Owns a
|
|
54
|
+
* Owns a headless browser (and, when asked, a headed one) and leases isolated contexts out of them,
|
|
55
|
+
* capped at `maxContexts` across both.
|
|
48
56
|
* Not exported as a singleton — the daemon owns one instance.
|
|
49
57
|
*/
|
|
50
58
|
export declare class BrowserPool {
|
|
@@ -60,15 +68,17 @@ export declare class BrowserPool {
|
|
|
60
68
|
/** The sessionIds of every currently leased context — used to report/group leased sessions. */
|
|
61
69
|
leasedSessionIds(): string[];
|
|
62
70
|
/**
|
|
63
|
-
* The public session id of an active lease on this origin, if
|
|
71
|
+
* The public session id of an active lease on this origin that `owner` took, if there is one.
|
|
64
72
|
*
|
|
65
73
|
* The lease TOOL reuses that id instead of minting a second context: a second acquire on the same
|
|
66
|
-
* origin used to leave both tabs connected and poison default session resolution (#600).
|
|
67
|
-
*
|
|
74
|
+
* origin used to leave both tabs connected and poison default session resolution (#600). Only the
|
|
75
|
+
* caller that took the lease gets it back: handing it to whoever asked put two agents in one tab,
|
|
76
|
+
* each one's verdicts resting on the other's actions (#1226). A caller with no owner cannot be told
|
|
77
|
+
* apart from another, so it always gets its own. The pool's own `acquire` still mints.
|
|
68
78
|
*
|
|
69
79
|
* Prefers the alias the agent was given, when the app registered under its own name.
|
|
70
80
|
*/
|
|
71
|
-
leaseIdOnOrigin(origin: string): string | undefined;
|
|
81
|
+
leaseIdOnOrigin(origin: string, owner: string | undefined): string | undefined;
|
|
72
82
|
/**
|
|
73
83
|
* Release a lease by its sessionId (closes the context, frees the slot). No-op if unknown.
|
|
74
84
|
*
|
|
@@ -90,6 +100,12 @@ export declare class BrowserPool {
|
|
|
90
100
|
* that would have read a computed value.
|
|
91
101
|
*/
|
|
92
102
|
alias(registeredId: string, leaseId: string): void;
|
|
103
|
+
/**
|
|
104
|
+
* Whether `sessionId` is a live lease that `owner` may let go of: one it took, or one taken by a
|
|
105
|
+
* caller with no id, which cannot be told apart from it. Another agent's lease is never this
|
|
106
|
+
* caller's to close (#1226).
|
|
107
|
+
*/
|
|
108
|
+
heldBy(sessionId: string, owner: string | undefined): boolean;
|
|
93
109
|
/** Mark a lease as still in use (called on agent activity) so the reaper doesn't reclaim it. */
|
|
94
110
|
touch(sessionId: string): void;
|
|
95
111
|
/**
|
|
@@ -106,9 +122,15 @@ export declare class BrowserPool {
|
|
|
106
122
|
* Touches the lease like any other tool call, so capturing keeps it alive rather than letting the
|
|
107
123
|
* reaper take it out from under a diff.
|
|
108
124
|
*/
|
|
109
|
-
screenshotLease(sessionId: string, opts?:
|
|
110
|
-
|
|
111
|
-
|
|
125
|
+
screenshotLease(sessionId: string, opts?: ScreenshotOptions): Promise<Uint8Array | undefined>;
|
|
126
|
+
/** The URL a lease was opened on — the one that carries its Reticle identity. */
|
|
127
|
+
leaseUrl(sessionId: string): string | undefined;
|
|
128
|
+
/**
|
|
129
|
+
* Navigate a leased page through the browser. For a lease whose page has no SDK to take the
|
|
130
|
+
* command — a navigate to an image left the lease unreachable, and the next navigate answered "no
|
|
131
|
+
* connected session". False when this is not a lease or the page would not go.
|
|
132
|
+
*/
|
|
133
|
+
gotoLease(sessionId: string, url: string, timeoutMs?: number): Promise<boolean>;
|
|
112
134
|
/**
|
|
113
135
|
* Move the real pointer on a leased page, or false when this session is not a lease or cannot
|
|
114
136
|
* hover. Same optional-capability contract as screenshotLease: absence must read as "could not
|
|
@@ -136,6 +158,28 @@ export declare class BrowserPool {
|
|
|
136
158
|
height: number;
|
|
137
159
|
}): Promise<boolean>;
|
|
138
160
|
setMocksLease(sessionId: string, rules: readonly PooledMockRule[]): Promise<boolean>;
|
|
161
|
+
/** What a lease was granted when it opened, or undefined for a session that is not a lease. */
|
|
162
|
+
permissionsOf(sessionId: string): readonly string[] | undefined;
|
|
163
|
+
/**
|
|
164
|
+
* Whether this lease's page runs a caller-supplied init script — a stub of the bindings a desktop
|
|
165
|
+
* shell injects. Alias-resolved like every agent-facing lookup, and false for any session that is
|
|
166
|
+
* not a lease with a stub, so a verdict can say when it was measured against a fake shell.
|
|
167
|
+
*/
|
|
168
|
+
stubInstalled(sessionId: string): boolean;
|
|
169
|
+
/**
|
|
170
|
+
* The init script this lease installed, or undefined when it runs none. Alias-resolved like
|
|
171
|
+
* `stubInstalled`. The lease tool compares it to the script a caller asks for: the same text means
|
|
172
|
+
* the held tab already is what was asked for, so it is reused rather than released and remade.
|
|
173
|
+
*/
|
|
174
|
+
hostStubScript(sessionId: string): string | undefined;
|
|
175
|
+
/**
|
|
176
|
+
* What the leased page's `Notification.permission` says, or undefined when it cannot be asked.
|
|
177
|
+
*
|
|
178
|
+
* Read back rather than inferred from the grant, because the headless shell answers `denied`
|
|
179
|
+
* after a notifications grant — see context-permissions.ts. Bounded, so a page that never answers
|
|
180
|
+
* reads as "could not ask" instead of holding the caller.
|
|
181
|
+
*/
|
|
182
|
+
notificationPermission(sessionId: string): Promise<string | undefined>;
|
|
139
183
|
sweepExpired(): Promise<string[]>;
|
|
140
184
|
/**
|
|
141
185
|
* How many leases this pool has reclaimed for going stale.
|
|
@@ -167,6 +211,19 @@ export declare class BrowserPool {
|
|
|
167
211
|
signal?: AbortSignal;
|
|
168
212
|
sessionId?: string;
|
|
169
213
|
seedStorage?: SeedStorage;
|
|
214
|
+
owner?: string;
|
|
215
|
+
/** In a browser with a window the person can watch. */
|
|
216
|
+
headed?: boolean;
|
|
217
|
+
/**
|
|
218
|
+
* JavaScript installed before any page script runs, for this lease only. A view built for a
|
|
219
|
+
* desktop shell calls bindings the shell injects (`window.go`, `window.runtime`, a preload
|
|
220
|
+
* object) on mount; a stub here is what lets it reach its data path in a leased tab.
|
|
221
|
+
*/
|
|
222
|
+
initScript?: string;
|
|
223
|
+
/** Granted on the lease's origin before the first navigation, so the first render sees them. */
|
|
224
|
+
permissions?: readonly string[];
|
|
225
|
+
/** Accept a self-signed or local-CA dev certificate for this lease's context only (#1255). */
|
|
226
|
+
ignoreHTTPSErrors?: boolean;
|
|
170
227
|
}): Promise<Lease>;
|
|
171
228
|
/**
|
|
172
229
|
* The websocket address this lease's page reported it could not reach, if it reported one.
|
|
@@ -181,4 +238,8 @@ export declare class BrowserPool {
|
|
|
181
238
|
lastDialogMessage(sessionId: string): string | undefined;
|
|
182
239
|
/** Close every context and the browser. Pending waiters are rejected (the pool is terminal now). */
|
|
183
240
|
shutdown(): Promise<void>;
|
|
241
|
+
/** Whether this lease's context skips certificate checks. A context cannot change it later. */
|
|
242
|
+
ignoresHTTPSErrors(sessionId: string): boolean;
|
|
243
|
+
/** Whether this lease lives in the headed browser. */
|
|
244
|
+
isHeaded(sessionId: string): boolean;
|
|
184
245
|
}
|