@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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as http from 'node:http';
|
|
2
2
|
import { Session } from '../session/session.js';
|
|
3
3
|
import { SessionManager } from '../session/session-manager.js';
|
|
4
|
+
import { type HarnessRequest } from './harness-request.js';
|
|
4
5
|
import { pairingTokenSource } from './pairing-token.js';
|
|
5
6
|
/** A human clicked ▶ on a saved flow in the panel — replay it with no agent. Wired by the daemon. */
|
|
6
7
|
type ReplayRequestHandler = (sessionId: string, flowName: string) => void;
|
|
@@ -107,10 +108,15 @@ export declare class Bridge {
|
|
|
107
108
|
*/
|
|
108
109
|
attachSyncRequest(handler: () => void): void;
|
|
109
110
|
/**
|
|
110
|
-
* Register a handler for the panel's
|
|
111
|
-
* bridge built without one ignores the request rather than refusing it.
|
|
111
|
+
* Register a handler for the panel's Harness controls (switch, Run, Stop). Optional for the same
|
|
112
|
+
* reason as the above: a bridge built without one ignores the request rather than refusing it.
|
|
112
113
|
*/
|
|
113
|
-
attachHarnessRequest(handler: (
|
|
114
|
+
attachHarnessRequest(handler: (request: HarnessRequest, session: Session) => void): void;
|
|
115
|
+
/**
|
|
116
|
+
* Register a handler for the panel's Sign in, told which tab asked (its project is linked once the
|
|
117
|
+
* sign-in lands). Optional, like the above: without one it is ignored.
|
|
118
|
+
*/
|
|
119
|
+
attachSigninRequest(handler: (from: Session) => void): void;
|
|
114
120
|
/** Register a handler to run when a session connects. Additive — every handler runs. */
|
|
115
121
|
attachSessionCreate(handler: (session: Session) => void): void;
|
|
116
122
|
close(): Promise<void>;
|
|
@@ -8,11 +8,13 @@ import { EventType, HumanControlKind, RETICLE_WS_PATH, ReticleMessageSchema, LOO
|
|
|
8
8
|
import { Session } from '../session/session.js';
|
|
9
9
|
import { SessionManager } from '../session/session-manager.js';
|
|
10
10
|
import { tokensMatch } from './token-auth.js';
|
|
11
|
+
import { noteWrongPathUpgrades, wrongPathReason } from './wrong-path.js';
|
|
12
|
+
import { harnessRequest } from './harness-request.js';
|
|
11
13
|
import { pairingTokenSource } from './pairing-token.js';
|
|
12
14
|
import { log } from '../../log.js';
|
|
13
15
|
import { getSessionMetrics } from '../../telemetry/session-metrics.js';
|
|
14
|
-
import { sessionReplacedReason } from '../session/facts/session-replaced.js';
|
|
15
|
-
import { describeSkew, sdkFix, SkewPair } from '../../command/version/version-skew.js';
|
|
16
|
+
import { SESSION_PARKED_REASON, sessionReplacedReason, } from '../session/facts/session-replaced.js';
|
|
17
|
+
import { describeSdkBehind, describeSkew, sdkFix, SDK_BEHIND_NARRATION, SkewPair, } from '../../command/version/version-skew.js';
|
|
16
18
|
import { noteVersionSkew } from '../../command/version/version-nudge.js';
|
|
17
19
|
import { protocolSkewReason } from './protocol-skew.js';
|
|
18
20
|
import { SERVER_VERSION } from '../../command/version/identity/server-version.js';
|
|
@@ -129,23 +131,9 @@ function replayRequest(event) {
|
|
|
129
131
|
const name = event.data['text'];
|
|
130
132
|
return 'string' === typeof name && name.length > 0 ? name : undefined;
|
|
131
133
|
}
|
|
132
|
-
/**
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
* Carries `on`/`off` rather than meaning "toggle": a double-click on a flaky connection sends two,
|
|
136
|
-
* and two toggles land back where they started while two `on`s are the same as one.
|
|
137
|
-
*/
|
|
138
|
-
function harnessRequest(event) {
|
|
139
|
-
if (event.type !== EventType.HUMAN_CONTROL)
|
|
140
|
-
return undefined;
|
|
141
|
-
if (event.data['kind'] !== HumanControlKind.HARNESS)
|
|
142
|
-
return undefined;
|
|
143
|
-
const want = event.data['text'];
|
|
144
|
-
if ('on' === want)
|
|
145
|
-
return true;
|
|
146
|
-
if ('off' === want)
|
|
147
|
-
return false;
|
|
148
|
-
return undefined;
|
|
134
|
+
/** True when this event is the panel's Sign in. Pure boundary narrowing, like the above. */
|
|
135
|
+
function isSigninRequest(event) {
|
|
136
|
+
return event.type === EventType.HUMAN_CONTROL && event.data['kind'] === HumanControlKind.SIGNIN;
|
|
149
137
|
}
|
|
150
138
|
/** True when this event is the panel's "sync now" button. Pure boundary narrowing, like the above. */
|
|
151
139
|
function isSyncRequest(event) {
|
|
@@ -273,6 +261,7 @@ export class Bridge {
|
|
|
273
261
|
/** Wired by the daemon: push to the dashboard now, because somebody asked in the panel. */
|
|
274
262
|
#onSyncRequest;
|
|
275
263
|
#onHarnessRequest;
|
|
264
|
+
#onSigninRequest;
|
|
276
265
|
constructor(options) {
|
|
277
266
|
const host = options.host ?? LOOPBACK_HOST;
|
|
278
267
|
if ((options.token?.length ?? 0) > TRANSPORT_LIMITS.MAX_TOKEN_LENGTH) {
|
|
@@ -396,6 +385,15 @@ export class Bridge {
|
|
|
396
385
|
this.#wss.on('error', (err) => {
|
|
397
386
|
log('bridge_ws_error', { error: err.message });
|
|
398
387
|
});
|
|
388
|
+
// A dial on any other path got a bare 400 from `ws` and left no trace for a diagnosis (#1242).
|
|
389
|
+
// Only a dial the origin check would have let in is the app's: a socket with no Origin is any
|
|
390
|
+
// local process, and recording it would tell the agent the app is running when it may not be.
|
|
391
|
+
noteWrongPathUpgrades(this.#wss, (path, origin) => {
|
|
392
|
+
log('bridge_wrong_path', { path, origin: origin ?? 'missing' });
|
|
393
|
+
if (origin !== undefined && this.#originAllowed(origin)) {
|
|
394
|
+
this.sessions.noteClosure(wrongPathReason(path, origin), this.#clock());
|
|
395
|
+
}
|
|
396
|
+
});
|
|
399
397
|
this.#wss.on('connection', (socket) => {
|
|
400
398
|
this.#onConnection(socket);
|
|
401
399
|
});
|
|
@@ -478,6 +476,22 @@ export class Bridge {
|
|
|
478
476
|
log('hello_invalid', { ...refused });
|
|
479
477
|
this.sessions.noteClosure(WS_CLOSE_REASON.INVALID_HELLO, this.#clock(), refused);
|
|
480
478
|
}
|
|
479
|
+
// On a LIVE session a frame that fails the schema is dropped, not answered with a close.
|
|
480
|
+
// The SDK reads every 1008 as permanent and stops reconnecting, so one event kind from a
|
|
481
|
+
// newer SDK ended the session for good, mid-drive, until a manual reload (#1413). What was
|
|
482
|
+
// thrown away is evidence, so it is recorded as a transport gap in this window: a verdict
|
|
483
|
+
// over it is downgraded rather than graded over an event nobody read. Only before hello is
|
|
484
|
+
// a bad frame still a terminal refusal.
|
|
485
|
+
if (undefined !== session) {
|
|
486
|
+
log('invalid_frame_dropped', { sessionId: session.id, ...peekFrameKind(text) });
|
|
487
|
+
session.pushEvent({
|
|
488
|
+
t: session.elapsed(),
|
|
489
|
+
type: EventType.TRANSPORT_OVERFLOW,
|
|
490
|
+
sessionId: session.id,
|
|
491
|
+
data: { dropped: 1 },
|
|
492
|
+
});
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
481
495
|
socket.close(...WS_CLOSE.INVALID_MESSAGE);
|
|
482
496
|
return;
|
|
483
497
|
}
|
|
@@ -543,6 +557,11 @@ export class Bridge {
|
|
|
543
557
|
socket.close(WS_CLOSE.AUTH_FAILED[0], reason);
|
|
544
558
|
return;
|
|
545
559
|
}
|
|
560
|
+
// A window the agent detached stays detached across its own reloads. See SessionManager.park.
|
|
561
|
+
if (this.sessions.isParked(parsed.sessionId)) {
|
|
562
|
+
socket.close(1008, SESSION_PARKED_REASON);
|
|
563
|
+
return;
|
|
564
|
+
}
|
|
546
565
|
const existing = this.sessions.get(parsed.sessionId);
|
|
547
566
|
if (existing === undefined && this.sessions.count() >= this.#maxSessions) {
|
|
548
567
|
socket.close(...WS_CLOSE.SESSION_LIMIT);
|
|
@@ -654,6 +673,16 @@ export class Bridge {
|
|
|
654
673
|
session.versionSkew = skew;
|
|
655
674
|
noteVersionSkew(SkewPair.SDK, skew);
|
|
656
675
|
}
|
|
676
|
+
else {
|
|
677
|
+
// Wire-compatible but a minor or more behind: the agent hears it on its next tool call
|
|
678
|
+
// and the person on the overlay. Not `versionSkew`, which marks the pair as broken.
|
|
679
|
+
const behind = describeSdkBehind(parsed.sdkVersion, SERVER_VERSION, fixForThisProject);
|
|
680
|
+
if (behind !== undefined && parsed.sdkVersion !== undefined) {
|
|
681
|
+
log('sdk_behind', { sessionId: session.id, sdk: parsed.sdkVersion });
|
|
682
|
+
noteVersionSkew(SkewPair.SDK_BEHIND, behind);
|
|
683
|
+
session.pushNarration(SDK_BEHIND_NARRATION(parsed.sdkVersion, SERVER_VERSION), false);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
657
686
|
log('session_connected', { sessionId: session.id, url: session.url });
|
|
658
687
|
// The one fact that separates a broken install from an unused one. Best-effort and wrapped:
|
|
659
688
|
// a metric must never affect whether an app can connect. See SessionSummary.appConnects.
|
|
@@ -695,7 +724,10 @@ export class Bridge {
|
|
|
695
724
|
// The switch is written through to the platform by the daemon, for the same reason: the
|
|
696
725
|
// Session has no cloud credential and should not grow one.
|
|
697
726
|
else if (harness !== undefined)
|
|
698
|
-
this.#onHarnessRequest?.(harness);
|
|
727
|
+
this.#onHarnessRequest?.(harness, session);
|
|
728
|
+
// Signing in writes `~/.reticle`, which only the daemon may do; the panel only asks.
|
|
729
|
+
else if (isSigninRequest(parsed.event))
|
|
730
|
+
this.#onSigninRequest?.(session);
|
|
699
731
|
// Pass the raw frame's byte length so the buffer doesn't re-serialize every event for accounting.
|
|
700
732
|
else
|
|
701
733
|
session.pushEvent(parsed.event, Buffer.byteLength(text, 'utf8'));
|
|
@@ -832,12 +864,19 @@ export class Bridge {
|
|
|
832
864
|
this.#onSyncRequest = handler;
|
|
833
865
|
}
|
|
834
866
|
/**
|
|
835
|
-
* Register a handler for the panel's
|
|
836
|
-
* bridge built without one ignores the request rather than refusing it.
|
|
867
|
+
* Register a handler for the panel's Harness controls (switch, Run, Stop). Optional for the same
|
|
868
|
+
* reason as the above: a bridge built without one ignores the request rather than refusing it.
|
|
837
869
|
*/
|
|
838
870
|
attachHarnessRequest(handler) {
|
|
839
871
|
this.#onHarnessRequest = handler;
|
|
840
872
|
}
|
|
873
|
+
/**
|
|
874
|
+
* Register a handler for the panel's Sign in, told which tab asked (its project is linked once the
|
|
875
|
+
* sign-in lands). Optional, like the above: without one it is ignored.
|
|
876
|
+
*/
|
|
877
|
+
attachSigninRequest(handler) {
|
|
878
|
+
this.#onSigninRequest = handler;
|
|
879
|
+
}
|
|
841
880
|
/** Register a handler to run when a session connects. Additive — every handler runs. */
|
|
842
881
|
attachSessionCreate(handler) {
|
|
843
882
|
this.#onSessionCreate.push(handler);
|
|
@@ -852,3 +891,24 @@ export class Bridge {
|
|
|
852
891
|
});
|
|
853
892
|
}
|
|
854
893
|
}
|
|
894
|
+
/**
|
|
895
|
+
* The `kind` and event `type` of a frame that failed the schema, for the log: never its payload,
|
|
896
|
+
* which can carry anything the page sent. Each is a bounded string or absent.
|
|
897
|
+
*/
|
|
898
|
+
function peekFrameKind(text) {
|
|
899
|
+
const short = (v) => 'string' === typeof v ? v.slice(0, MAX_LOGGED_FRAME_FIELD) : undefined;
|
|
900
|
+
try {
|
|
901
|
+
const json = JSON.parse(text);
|
|
902
|
+
const kind = short(json?.kind);
|
|
903
|
+
const eventType = short(json?.event?.type);
|
|
904
|
+
return {
|
|
905
|
+
...(kind === undefined ? {} : { kind }),
|
|
906
|
+
...(eventType === undefined ? {} : { eventType }),
|
|
907
|
+
};
|
|
908
|
+
}
|
|
909
|
+
catch {
|
|
910
|
+
return {};
|
|
911
|
+
}
|
|
912
|
+
}
|
|
913
|
+
/** How much of a frame's `kind` or event `type` the drop log keeps. */
|
|
914
|
+
const MAX_LOGGED_FRAME_FIELD = 64;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the panel's Harness controls asked for, narrowed at the boundary: the autonomous switch,
|
|
3
|
+
* Run Harness (with an optional persona), or Stop. Keyed by the control's own wire kind.
|
|
4
|
+
*
|
|
5
|
+
* The switch carries `on`/`off` rather than meaning "toggle": a double-click on a flaky connection
|
|
6
|
+
* sends two, and two toggles land back where they started while two `on`s are the same as one.
|
|
7
|
+
*/
|
|
8
|
+
import { HumanControlKind } from '@reticlehq/core';
|
|
9
|
+
export type HarnessRequest = {
|
|
10
|
+
kind: typeof HumanControlKind.HARNESS;
|
|
11
|
+
enabled: boolean;
|
|
12
|
+
} | {
|
|
13
|
+
kind: typeof HumanControlKind.HARNESS_RUN;
|
|
14
|
+
persona?: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: typeof HumanControlKind.HARNESS_STOP;
|
|
17
|
+
} | {
|
|
18
|
+
kind: typeof HumanControlKind.HARNESS_LINK;
|
|
19
|
+
};
|
|
20
|
+
export declare function harnessRequest(event: {
|
|
21
|
+
type: string;
|
|
22
|
+
data: Record<string, unknown>;
|
|
23
|
+
}): HarnessRequest | undefined;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the panel's Harness controls asked for, narrowed at the boundary: the autonomous switch,
|
|
3
|
+
* Run Harness (with an optional persona), or Stop. Keyed by the control's own wire kind.
|
|
4
|
+
*
|
|
5
|
+
* The switch carries `on`/`off` rather than meaning "toggle": a double-click on a flaky connection
|
|
6
|
+
* sends two, and two toggles land back where they started while two `on`s are the same as one.
|
|
7
|
+
*/
|
|
8
|
+
import { EventType, HumanControlKind } from '@reticlehq/core';
|
|
9
|
+
export function harnessRequest(event) {
|
|
10
|
+
if (event.type !== EventType.HUMAN_CONTROL)
|
|
11
|
+
return undefined;
|
|
12
|
+
const kind = event.data['kind'];
|
|
13
|
+
const text = event.data['text'];
|
|
14
|
+
if (HumanControlKind.HARNESS_STOP === kind || HumanControlKind.HARNESS_LINK === kind)
|
|
15
|
+
return { kind };
|
|
16
|
+
if (HumanControlKind.HARNESS_RUN === kind) {
|
|
17
|
+
const persona = 'string' === typeof text ? text.trim() : '';
|
|
18
|
+
return 0 < persona.length ? { kind, persona } : { kind };
|
|
19
|
+
}
|
|
20
|
+
if (HumanControlKind.HARNESS !== kind)
|
|
21
|
+
return undefined;
|
|
22
|
+
if ('on' === text)
|
|
23
|
+
return { kind, enabled: true };
|
|
24
|
+
if ('off' === text)
|
|
25
|
+
return { kind, enabled: false };
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
@@ -33,6 +33,15 @@ export declare function pairingTokenSource(input: {
|
|
|
33
33
|
explicit: boolean;
|
|
34
34
|
env: NodeJS.ProcessEnv;
|
|
35
35
|
}): 'explicit' | 'env:RETICLE_TOKEN' | 'env:RETICLE_PAIRING_TOKEN_DIR' | 'default';
|
|
36
|
+
/**
|
|
37
|
+
* The pairing token this machine was told to use, or undefined when it was told nothing.
|
|
38
|
+
*
|
|
39
|
+
* `RETICLE_TOKEN` first, then the token file in `RETICLE_PAIRING_TOKEN_DIR`, the precedence
|
|
40
|
+
* `pairingTokenSource` names. A command that mints its own one-shot token for a hosted preview asks
|
|
41
|
+
* this first: in a container the app's plugin bakes the directory token in, and a fresh token made
|
|
42
|
+
* the daemon refuse the only app it was started to verify (#1251).
|
|
43
|
+
*/
|
|
44
|
+
export declare function configuredPairingToken(env: NodeJS.ProcessEnv, deps: PairingTokenDeps): Promise<string | undefined>;
|
|
36
45
|
export declare function pairingTokenPath(dir: string): string;
|
|
37
46
|
/** Production IO adapter: 0600 file + 0700 dir so only the owner can read the secret. */
|
|
38
47
|
export declare function nodePairingTokenDeps(): PairingTokenDeps;
|
|
@@ -41,6 +41,23 @@ export function pairingTokenSource(input) {
|
|
|
41
41
|
return `env:${PAIRING_TOKEN_DIR_ENV}`;
|
|
42
42
|
return 'default';
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* The pairing token this machine was told to use, or undefined when it was told nothing.
|
|
46
|
+
*
|
|
47
|
+
* `RETICLE_TOKEN` first, then the token file in `RETICLE_PAIRING_TOKEN_DIR`, the precedence
|
|
48
|
+
* `pairingTokenSource` names. A command that mints its own one-shot token for a hosted preview asks
|
|
49
|
+
* this first: in a container the app's plugin bakes the directory token in, and a fresh token made
|
|
50
|
+
* the daemon refuse the only app it was started to verify (#1251).
|
|
51
|
+
*/
|
|
52
|
+
export async function configuredPairingToken(env, deps) {
|
|
53
|
+
const token = env[ReticleEnv.TOKEN]?.trim();
|
|
54
|
+
if (token !== undefined && 0 < token.length)
|
|
55
|
+
return token;
|
|
56
|
+
const dir = env[PAIRING_TOKEN_DIR_ENV];
|
|
57
|
+
if (dir === undefined || 0 === dir.length)
|
|
58
|
+
return undefined;
|
|
59
|
+
return readOrCreatePairingToken(dir, deps);
|
|
60
|
+
}
|
|
44
61
|
export function pairingTokenPath(dir) {
|
|
45
62
|
return join(dir, ReticleDir.PAIRING_TOKEN_FILE);
|
|
46
63
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { WebSocketServer } from 'ws';
|
|
2
|
+
/** The path an upgrade asked for: the pathname only, because a query can carry a pairing token. */
|
|
3
|
+
export declare function requestedPath(url: string | undefined): string;
|
|
4
|
+
/**
|
|
5
|
+
* What the no-session diagnosis says about it. The path is in it because the path is the fix. It
|
|
6
|
+
* says only what the record shows: a wrong-path upgrade is answered before any origin check, so
|
|
7
|
+
* the client could be anything, and a sentence promising the app is running would send the agent
|
|
8
|
+
* away from a dev server that really is stopped. The bridge records one only from an Origin its
|
|
9
|
+
* handshake would have accepted.
|
|
10
|
+
*/
|
|
11
|
+
export declare function wrongPathReason(path: string, origin: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Report each upgrade `ws` turns away for its path. Wraps `shouldHandle`, which `ws` documents as
|
|
14
|
+
* the method to override and calls for every upgrade before it answers 400, so the decision itself
|
|
15
|
+
* is left to `ws` and only observed here.
|
|
16
|
+
*/
|
|
17
|
+
export declare function noteWrongPathUpgrades(wss: WebSocketServer, note: (path: string, origin: string | undefined) => void): void;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { RETICLE_WS_PATH } from '@reticlehq/core';
|
|
2
|
+
/** Long enough for any real path, short enough that a junk request cannot fill the log line. */
|
|
3
|
+
const MAX_PATH_SHOWN = 80;
|
|
4
|
+
/** The path an upgrade asked for: the pathname only, because a query can carry a pairing token. */
|
|
5
|
+
export function requestedPath(url) {
|
|
6
|
+
const path = (url ?? '').split('?', 1)[0] ?? '';
|
|
7
|
+
const shown = 0 === path.length ? '/' : path;
|
|
8
|
+
return shown.length > MAX_PATH_SHOWN ? `${shown.slice(0, MAX_PATH_SHOWN)}…` : shown;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* What the no-session diagnosis says about it. The path is in it because the path is the fix. It
|
|
12
|
+
* says only what the record shows: a wrong-path upgrade is answered before any origin check, so
|
|
13
|
+
* the client could be anything, and a sentence promising the app is running would send the agent
|
|
14
|
+
* away from a dev server that really is stopped. The bridge records one only from an Origin its
|
|
15
|
+
* handshake would have accepted.
|
|
16
|
+
*/
|
|
17
|
+
export function wrongPathReason(path, origin) {
|
|
18
|
+
return (`a WebSocket upgrade from ${origin} asked for ${path} and got a 400: the bridge listens on ` +
|
|
19
|
+
`${RETICLE_WS_PATH} only. If that was your app, point the URL given to connect({ url }) at ` +
|
|
20
|
+
`the bridge path, for example ws://localhost:<port>${RETICLE_WS_PATH}.`);
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Report each upgrade `ws` turns away for its path. Wraps `shouldHandle`, which `ws` documents as
|
|
24
|
+
* the method to override and calls for every upgrade before it answers 400, so the decision itself
|
|
25
|
+
* is left to `ws` and only observed here.
|
|
26
|
+
*/
|
|
27
|
+
export function noteWrongPathUpgrades(wss, note) {
|
|
28
|
+
const handles = wss.shouldHandle.bind(wss);
|
|
29
|
+
wss.shouldHandle = (req) => {
|
|
30
|
+
const handled = handles(req);
|
|
31
|
+
if (false === handled)
|
|
32
|
+
note(requestedPath(req.url), req.headers.origin);
|
|
33
|
+
return handled;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
@@ -70,6 +70,15 @@ export function toRules(value) {
|
|
|
70
70
|
return rule;
|
|
71
71
|
});
|
|
72
72
|
}
|
|
73
|
+
/**
|
|
74
|
+
* The applied result, after telling the recorder. Steps driven while a mock is active are marked
|
|
75
|
+
* on the ambient tape, so a journey proved against mocked responses is not auto-saved as a flow
|
|
76
|
+
* that would replay against the real backend (#1459).
|
|
77
|
+
*/
|
|
78
|
+
function mocksApplied(deps, sessionId, count) {
|
|
79
|
+
deps.recordings.markMocked(sessionId, 0 < count);
|
|
80
|
+
return { applied: true, count };
|
|
81
|
+
}
|
|
73
82
|
export const NETWORK_MOCK_TOOLS = [
|
|
74
83
|
{
|
|
75
84
|
name: ReticleTool.NETWORK_MOCK,
|
|
@@ -104,14 +113,14 @@ export const NETWORK_MOCK_TOOLS = [
|
|
|
104
113
|
if (provider !== undefined) {
|
|
105
114
|
const applied = await provider.setMocks(session.url, rules);
|
|
106
115
|
if (applied)
|
|
107
|
-
return
|
|
116
|
+
return mocksApplied(deps, session.id, rules.length);
|
|
108
117
|
}
|
|
109
118
|
// A lease is a Playwright-owned page — CDP intercept was always there, this tool just had no
|
|
110
119
|
// route to it. Tried after the driven provider: when both exist, drive is the page the caller
|
|
111
120
|
// means, and a lease is the fallback rather than a competitor.
|
|
112
121
|
const leased = await deps.pool?.setMocksLease(session.id, rules);
|
|
113
122
|
if (true === leased)
|
|
114
|
-
return
|
|
123
|
+
return mocksApplied(deps, session.id, rules.length);
|
|
115
124
|
return {
|
|
116
125
|
applied: false,
|
|
117
126
|
count: 0,
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { type ScriptCoverage } from './js-coverage.js';
|
|
13
13
|
import type { Browser, Page } from 'playwright';
|
|
14
|
-
import { ActionType, DriveErrorCode } from '@reticlehq/core';
|
|
14
|
+
import { ActionType, DriveErrorCode, InputMode, InputModeReason } from '@reticlehq/core';
|
|
15
15
|
import { type MockRule } from './network-mock.js';
|
|
16
16
|
import { type NetworkDetail } from './network-detail.js';
|
|
17
17
|
/** Viewport CSS-px box as returned by the INSPECT command (getBoundingClientRect). */
|
|
@@ -21,28 +21,74 @@ export interface ElementBox {
|
|
|
21
21
|
width: number;
|
|
22
22
|
height: number;
|
|
23
23
|
}
|
|
24
|
-
/**
|
|
25
|
-
|
|
24
|
+
/**
|
|
25
|
+
* Args forwarded from reticle_act (fill value, type text, press key, drag drop-target box).
|
|
26
|
+
*
|
|
27
|
+
* A `type`, not an `interface`: only the alias form gets an implicit index signature, so the core
|
|
28
|
+
* arg readers take it as a plain record without a cast at every call site.
|
|
29
|
+
*/
|
|
30
|
+
export type RealInputArgs = {
|
|
26
31
|
value?: string;
|
|
27
32
|
text?: string;
|
|
33
|
+
/** For press: the key name, e.g. Escape or Tab. `text` also carries it; `key` is the fallback. */
|
|
34
|
+
key?: string;
|
|
35
|
+
/** For press: modifier names (Meta/Control/Shift/Alt; aliases like `cmd` accepted). */
|
|
36
|
+
modifiers?: string[];
|
|
37
|
+
/**
|
|
38
|
+
* For press: several keys held down TOGETHER, pressed in order and released in reverse. Read but
|
|
39
|
+
* never forwarded — a chord with a non-modifier key has no `page.keyboard.press` spelling, so the
|
|
40
|
+
* caller routes such a press to the synthetic dispatcher before it reaches here.
|
|
41
|
+
*/
|
|
42
|
+
keys?: string[];
|
|
43
|
+
/**
|
|
44
|
+
* For press: how long to keep the key down between keydown and keyup. The same argument the
|
|
45
|
+
* synthetic path has always honoured, so a hold-to-confirm key driven through the driver holds
|
|
46
|
+
* for exactly as long as one driven in the page.
|
|
47
|
+
*/
|
|
48
|
+
holdMs?: number;
|
|
28
49
|
/** For drag: the resolved box of the drop-target ref (toRef). */
|
|
29
50
|
toBox?: ElementBox;
|
|
30
51
|
steps?: number;
|
|
31
|
-
}
|
|
32
|
-
|
|
52
|
+
};
|
|
53
|
+
/** What a provider reports for one driven gesture. Exported so a fake can build it by name. */
|
|
54
|
+
export interface RealInputResult {
|
|
33
55
|
/** True if a native gesture was actually driven. */
|
|
34
56
|
performed: boolean;
|
|
35
|
-
/** Center used, for diagnostics/tests. */
|
|
36
|
-
center
|
|
57
|
+
/** Center used, for diagnostics/tests. ABSENT for a key press: see `undriven`. */
|
|
58
|
+
center?: {
|
|
37
59
|
cx: number;
|
|
38
60
|
cy: number;
|
|
39
61
|
};
|
|
62
|
+
/**
|
|
63
|
+
* Which path this result came from. `real` whenever a gesture was actually driven, so a caller
|
|
64
|
+
* reading it on a `performed: true` result learns nothing it did not already know — it is here
|
|
65
|
+
* for the `performed: false` case, where the caller is about to take the synthetic path and
|
|
66
|
+
* saying `real` would describe a gesture that never ran.
|
|
67
|
+
*/
|
|
68
|
+
inputMode: InputMode;
|
|
69
|
+
/**
|
|
70
|
+
* How long the key was ACTUALLY held, for a real press that was asked to hold. Absent for every
|
|
71
|
+
* other gesture, and for a press with no `holdMs` — the same rule the synthetic path uses, where
|
|
72
|
+
* an absent `heldMs` means "this action does not hold" rather than "it held for no time".
|
|
73
|
+
*
|
|
74
|
+
* Measured rather than echoed back: `holdMs: 1200` against a 1200ms animation is a race by
|
|
75
|
+
* construction, and a throttled tab stretches the wait. A caller needs to tell "held 1200" from
|
|
76
|
+
* "held 1204", and can only do that with the achieved number.
|
|
77
|
+
*/
|
|
78
|
+
heldMs?: number;
|
|
40
79
|
}
|
|
41
80
|
/** Options for a page screenshot — full-page scroll capture and/or a clip box. */
|
|
42
81
|
export interface ScreenshotOpts {
|
|
43
82
|
fullPage?: boolean;
|
|
44
83
|
/** Restrict the capture to one element/region (viewport CSS px). */
|
|
45
84
|
clip?: ElementBox;
|
|
85
|
+
/**
|
|
86
|
+
* A live picture, as a JPEG at this quality: what a person is watching, taken as it is. The
|
|
87
|
+
* baseline tweaks (hiding the HUD, stopping animations) would make their window flicker each second.
|
|
88
|
+
*/
|
|
89
|
+
jpegQuality?: number;
|
|
90
|
+
/** One image pixel per CSS pixel, so a high-density display does not double a step screenshot. */
|
|
91
|
+
cssScale?: boolean;
|
|
46
92
|
}
|
|
47
93
|
/** The capability surface reticle_act depends on. A FAKE implementing this is injected in tests. */
|
|
48
94
|
export interface RealInputProvider {
|
|
@@ -117,17 +163,40 @@ export declare function boxCenter(box: ElementBox): {
|
|
|
117
163
|
cy: number;
|
|
118
164
|
};
|
|
119
165
|
/**
|
|
120
|
-
* Which actions are driven by native pointer
|
|
121
|
-
*
|
|
166
|
+
* Which actions are driven by a native pointer. `press` is excluded on purpose — a key has no
|
|
167
|
+
* pointer, and widening this would change what every existing caller of it means.
|
|
122
168
|
*/
|
|
123
169
|
export declare function isPointerAction(action: ActionType): boolean;
|
|
170
|
+
/**
|
|
171
|
+
* The routing question `tryRealInput` asks: does this action have a real-input path at all? Wider
|
|
172
|
+
* than `isPointerAction` by `press`, which needs no coordinates.
|
|
173
|
+
*/
|
|
174
|
+
export declare function isRealInputAction(action: ActionType): boolean;
|
|
124
175
|
type SleepFn = (ms: number) => Promise<void>;
|
|
125
176
|
type ConnectFn = (url: string) => Promise<Browser>;
|
|
177
|
+
/**
|
|
178
|
+
* The `press`es this module will NOT drive: a chord that only the in-page dispatcher can express.
|
|
179
|
+
*
|
|
180
|
+
* `args.keys` asks for several keys held down TOGETHER, pressed in order and released in reverse.
|
|
181
|
+
* That is not a `page.keyboard.press` chord — a non-modifier key cannot appear before the last `+`
|
|
182
|
+
* — and a real keyboard cannot aim a key at a named element. `args.code` is the third: the driver
|
|
183
|
+
* presses by KEY name and offers no way to send a physical `code` that disagrees with it, so
|
|
184
|
+
* `{ text: 'z', code: 'KeyY' }` would strike a different key than the one asked for. All three are
|
|
185
|
+
* routed to the synthetic path by the caller, which reports the reason rather than pretending a
|
|
186
|
+
* different gesture happened.
|
|
187
|
+
*
|
|
188
|
+
* Ordered by how specifically the caller asked: `keys` then `code` name the KEY, `ref` names only
|
|
189
|
+
* the target. Two can apply at once, and the earlier one is the more unusual request — the reason
|
|
190
|
+
* should name that, not the generic "you passed a ref".
|
|
191
|
+
*/
|
|
192
|
+
export declare function unspellablePressReason(ref: string, args: Record<string, unknown>): InputModeReason | undefined;
|
|
126
193
|
/**
|
|
127
194
|
* Shared gesture executor: drive a native gesture on an already-resolved Page. Used by both the
|
|
128
195
|
* CDP-attached and the launched (drive) providers so the pointer logic lives in one place.
|
|
129
196
|
*/
|
|
130
|
-
export declare function performGesture(page: Page, action: ActionType, box: ElementBox, args: RealInputArgs, sleep: SleepFn
|
|
197
|
+
export declare function performGesture(page: Page, action: ActionType, box: ElementBox, args: RealInputArgs, sleep: SleepFn,
|
|
198
|
+
/** Injected so a test can assert the achieved hold deterministically; defaults to the real clock. */
|
|
199
|
+
now?: () => number): Promise<RealInputResult>;
|
|
131
200
|
/**
|
|
132
201
|
* Capture a PNG from a Playwright page. Shared by the CDP + launched providers so the
|
|
133
202
|
* screenshot path lives in one place (mirrors performGesture). Returns the raw PNG bytes.
|
|
@@ -137,6 +206,8 @@ interface CdpProviderOptions {
|
|
|
137
206
|
cdpUrl: string;
|
|
138
207
|
/** Injected so the settle delay is deterministic in tests; defaults to a real Node timer. */
|
|
139
208
|
sleep?: SleepFn;
|
|
209
|
+
/** Injected so a measured hold is deterministic in tests; defaults to the real clock. */
|
|
210
|
+
now?: () => number;
|
|
140
211
|
/** Injected connector so unit tests can stub Playwright without import. */
|
|
141
212
|
connect?: ConnectFn;
|
|
142
213
|
/**
|
|
@@ -193,6 +264,8 @@ export interface LaunchedProviderOptions {
|
|
|
193
264
|
headless: boolean;
|
|
194
265
|
/** Injected so the settle delay is deterministic in tests; defaults to a real Node timer. */
|
|
195
266
|
sleep?: SleepFn;
|
|
267
|
+
/** Injected so a measured hold is deterministic in tests; defaults to the real clock. */
|
|
268
|
+
now?: () => number;
|
|
196
269
|
/** Injected launcher so unit tests can stub Playwright; defaults to dynamic import('playwright'). */
|
|
197
270
|
launch?: LaunchFn;
|
|
198
271
|
/** When set, re-invoke the page's reticle.connect with these after load (drive-a-hosted-preview). */
|