@reticlehq/server 3.7.0 → 3.8.1
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/SKILL.md +59 -68
- package/bin/reticle.js +9 -2
- package/dist/command/cli/adhoc-suite.js +1 -1
- package/dist/command/cli/adhoc-verdict.d.ts +12 -0
- package/dist/command/cli/adhoc-verdict.js +62 -4
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +5 -1
- package/dist/command/cli/auth/cloud-session.d.ts +11 -19
- package/dist/command/cli/auth/cloud-session.js +23 -0
- package/dist/command/cli/auth/device-flow.d.ts +3 -37
- package/dist/command/cli/cli-doctor.js +66 -21
- package/dist/command/cli/cli-flow-commands.js +53 -11
- package/dist/command/cli/cli-kill.d.ts +8 -0
- package/dist/command/cli/cli-kill.js +43 -3
- package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
- package/dist/command/cli/cli-parse-feedback.js +13 -1
- package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
- package/dist/command/cli/cli-parse-grammar.js +1 -6
- package/dist/command/cli/cli-parse-serve.d.ts +24 -0
- package/dist/command/cli/cli-parse-serve.js +124 -0
- package/dist/command/cli/cli-parse.d.ts +12 -11
- package/dist/command/cli/cli-parse.js +100 -123
- package/dist/command/cli/cli-usage.d.ts +0 -11
- package/dist/command/cli/cli-usage.js +43 -16
- package/dist/command/cli/cli-verify.d.ts +1 -1
- package/dist/command/cli/cli-verify.js +29 -14
- package/dist/command/cli/cloud-cli.js +27 -9
- package/dist/command/cli/cloud-kit.js +3 -3
- package/dist/command/cli/cloud-link.d.ts +1 -20
- package/dist/command/cli/cloud-link.js +2 -0
- package/dist/command/cli/cloud-login.d.ts +6 -2
- package/dist/command/cli/cloud-login.js +13 -41
- package/dist/command/cli/config/checkout.d.ts +10 -0
- package/dist/command/cli/config/checkout.js +78 -0
- package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
- package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
- package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
- package/dist/command/cli/doctor/doctor-rows.js +4 -0
- package/dist/command/cli/drive/drive-attach.d.ts +5 -0
- package/dist/command/cli/drive/drive-attach.js +21 -1
- package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
- package/dist/command/cli/hook/codex-transcript.js +224 -0
- package/dist/command/cli/hook/episode-structure.d.ts +24 -0
- package/dist/command/cli/hook/episode-structure.js +138 -0
- package/dist/command/cli/hook/hook-command.d.ts +9 -0
- package/dist/command/cli/hook/hook-command.js +211 -0
- package/dist/command/cli/hook/hook-fast.d.ts +31 -0
- package/dist/command/cli/hook/hook-fast.js +136 -0
- package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
- package/dist/command/cli/hook/prompt-hook.js +199 -0
- package/dist/command/cli/hook/tool-hook.d.ts +21 -0
- package/dist/command/cli/hook/tool-hook.js +259 -0
- package/dist/command/cli/launch/cli-launch.d.ts +2 -0
- package/dist/command/cli/launch/cli-launch.js +22 -2
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
- package/dist/command/cli/mcp-command.d.ts +9 -0
- package/dist/command/cli/mcp-command.js +127 -41
- package/dist/command/cli/open-navigate.d.ts +43 -0
- package/dist/command/cli/open-navigate.js +85 -0
- package/dist/command/cli/ports/port-holder.d.ts +16 -4
- package/dist/command/cli/ports/port-holder.js +58 -12
- package/dist/command/cli/ports/resolve/cli-port.js +18 -2
- package/dist/command/cli/project-name.d.ts +1 -7
- package/dist/command/cli/project-name.js +1 -0
- package/dist/command/cli/report-command.d.ts +8 -2
- package/dist/command/cli/report-command.js +95 -18
- package/dist/command/cli/status-fields.d.ts +9 -2
- package/dist/command/cli/status-fields.js +148 -4
- package/dist/command/cli/try-command.d.ts +3 -4
- package/dist/command/cli/try-command.js +6 -11
- package/dist/command/cli/verify-results.d.ts +4 -1
- package/dist/command/cli/verify-results.js +3 -1
- package/dist/command/cli.d.ts +1 -7
- package/dist/command/cli.js +79 -160
- package/dist/command/daemon/daemon-resilience.d.ts +6 -1
- package/dist/command/daemon/daemon-resilience.js +31 -18
- package/dist/command/daemon/daemon.d.ts +11 -0
- package/dist/command/daemon/daemon.js +70 -2
- package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
- package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
- package/dist/command/daemon/wake-decision.js +4 -2
- package/dist/command/daemon/win32-escape.d.ts +32 -0
- package/dist/command/daemon/win32-escape.js +119 -0
- package/dist/command/setup/agent-configs.d.ts +9 -0
- package/dist/command/setup/agent-configs.js +9 -0
- package/dist/command/setup/auto-approve.d.ts +10 -3
- package/dist/command/setup/auto-approve.js +51 -3
- package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
- package/dist/command/setup/bringup/dev-server-wait.js +5 -1
- package/dist/command/setup/bringup/ensure-daemon.js +4 -7
- package/dist/command/setup/init/init-host.js +6 -0
- package/dist/command/setup/init/init-port.js +5 -4
- package/dist/command/setup/init/init-runtime.js +7 -1
- package/dist/command/setup/node-effects.d.ts +8 -0
- package/dist/command/setup/node-effects.js +36 -4
- package/dist/command/setup/probe/dev-port.d.ts +26 -0
- package/dist/command/setup/probe/dev-port.js +117 -0
- package/dist/command/setup/probe/page-probe.d.ts +1 -1
- package/dist/command/setup/probe/page-probe.js +11 -3
- package/dist/command/setup/remaining-steps.d.ts +0 -7
- package/dist/command/setup/remaining-steps.js +3 -2
- package/dist/command/setup/run-setup.d.ts +11 -0
- package/dist/command/setup/run-setup.js +33 -5
- package/dist/command/setup/setup-command.d.ts +2 -0
- package/dist/command/setup/setup-command.js +22 -4
- package/dist/command/update/updater.d.ts +1 -6
- package/dist/command/update/updater.js +4 -5
- package/dist/command/update/version-seen.d.ts +24 -0
- package/dist/command/update/version-seen.js +65 -0
- package/dist/command/version/peer-announce.d.ts +9 -1
- package/dist/command/version/peer-announce.js +25 -2
- package/dist/command/version/sdk-fix.d.ts +5 -6
- package/dist/command/version/sdk-fix.js +17 -32
- package/dist/command/version/version-skew.d.ts +16 -1
- package/dist/command/version/version-skew.js +84 -10
- package/dist/features/crawl/crawl-tools.js +2 -2
- package/dist/features/crawl/crawl.js +2 -0
- package/dist/features/exhaust/ledger.d.ts +15 -96
- package/dist/features/exhaust/ledger.js +3 -3
- package/dist/features/harness/drive-runs.d.ts +28 -4
- package/dist/features/harness/drive-runs.js +99 -7
- package/dist/features/harness/drivers.d.ts +1 -1
- package/dist/features/harness/drivers.js +1 -1
- package/dist/features/harness/harness.d.ts +5 -0
- package/dist/features/harness/harness.js +24 -12
- package/dist/features/harness/platform/platform-drives.d.ts +7 -1
- package/dist/features/harness/platform/platform-drives.js +12 -7
- package/dist/features/harness/platform/refusal.d.ts +1 -1
- package/dist/features/harness/platform/refusal.js +4 -4
- package/dist/features/harness/platform/remote-drive.js +70 -28
- package/dist/features/harness/platform/server-driver.js +22 -1
- package/dist/features/harness/platform-config.d.ts +1 -10
- package/dist/features/harness/platform-config.js +0 -20
- package/dist/features/license/license.d.ts +2 -14
- package/dist/features/visual/step-shots.d.ts +33 -1
- package/dist/features/visual/step-shots.js +155 -1
- package/dist/features/visual/visual-tools.js +12 -4
- package/dist/hooks/coding-agents.d.ts +6 -0
- package/dist/hooks/coding-agents.js +24 -3
- package/dist/hooks/episode-stamp.d.ts +32 -0
- package/dist/hooks/episode-stamp.js +61 -0
- package/dist/hooks/hook-commands.js +19 -9
- package/dist/index.d.ts +5 -1
- package/dist/index.js +66 -24
- package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
- package/dist/judgement/app-graph/journal-steps.js +92 -0
- package/dist/judgement/capsule/capsule-store.d.ts +2 -39
- package/dist/judgement/domain/domain-model.js +1 -10
- package/dist/judgement/domain/domain-tools.js +4 -2
- package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
- package/dist/judgement/runs/artifact/run-store.js +153 -28
- package/dist/judgement/runs/default-run-id.d.ts +3 -1
- package/dist/judgement/runs/default-run-id.js +15 -3
- package/dist/judgement/runs/drive-run.d.ts +3 -3
- package/dist/judgement/runs/drive-run.js +11 -7
- package/dist/judgement/runs/run-ledger.d.ts +21 -0
- package/dist/judgement/runs/run-ledger.js +143 -0
- package/dist/judgement/runs/runner-port.d.ts +1 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +4 -3
- package/dist/judgement/runs/verification-sync.js +27 -5
- package/dist/language/flows/affected-tools.js +2 -1
- package/dist/language/flows/annotate-notes/annotate.js +8 -3
- package/dist/language/flows/annotate-tools.js +1 -1
- package/dist/language/flows/change/affected.d.ts +8 -0
- package/dist/language/flows/change/affected.js +20 -7
- package/dist/language/flows/decision.js +19 -4
- package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
- package/dist/language/flows/fields/flow-secret-field.js +67 -5
- package/dist/language/flows/flow-anchor.d.ts +5 -0
- package/dist/language/flows/flow-anchor.js +4 -0
- package/dist/language/flows/flow-cross-step.d.ts +7 -1
- package/dist/language/flows/flow-cross-step.js +9 -0
- package/dist/language/flows/flow-expect-grammar.js +15 -10
- package/dist/language/flows/flow-intent.js +6 -1
- package/dist/language/flows/flow-journey.d.ts +8 -0
- package/dist/language/flows/flow-journey.js +13 -0
- package/dist/language/flows/flow-lease.d.ts +27 -0
- package/dist/language/flows/flow-lease.js +59 -0
- package/dist/language/flows/flow-replay-run.d.ts +1 -87
- package/dist/language/flows/flow-replay-run.js +111 -310
- package/dist/language/flows/flow-replay.js +21 -19
- package/dist/language/flows/flow-replayable.d.ts +38 -0
- package/dist/language/flows/flow-replayable.js +179 -0
- package/dist/language/flows/flow-start-path.d.ts +108 -0
- package/dist/language/flows/flow-start-path.js +313 -0
- package/dist/language/flows/flow-step-runners.d.ts +23 -2
- package/dist/language/flows/flow-step-runners.js +191 -32
- package/dist/language/flows/flow-store-for-session.d.ts +8 -1
- package/dist/language/flows/flow-store-for-session.js +6 -0
- package/dist/language/flows/flow-tools.d.ts +2 -23
- package/dist/language/flows/flow-tools.js +63 -113
- package/dist/language/flows/flows.d.ts +4 -6
- package/dist/language/flows/flows.js +90 -15
- package/dist/language/flows/heal-run.d.ts +10 -4
- package/dist/language/flows/heal-run.js +26 -9
- package/dist/language/flows/recording/flake.d.ts +3 -27
- package/dist/language/flows/recording/flake.js +1 -1
- package/dist/language/flows/recording/recording-backtrack.js +1 -4
- package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
- package/dist/language/flows/recording/tape/recordings.js +9 -3
- package/dist/language/flows/replay.d.ts +25 -5
- package/dist/language/flows/replay.js +83 -16
- package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
- package/dist/language/flows/suite/coverage.d.ts +9 -0
- package/dist/language/flows/suite/coverage.js +12 -1
- package/dist/language/flows/suite-selection.d.ts +25 -0
- package/dist/language/flows/suite-selection.js +41 -9
- package/dist/machine/git-tracks.d.ts +6 -0
- package/dist/machine/git-tracks.js +36 -0
- package/dist/memory/cloud/background-sync.d.ts +25 -0
- package/dist/memory/cloud/background-sync.js +79 -0
- package/dist/memory/cloud/cloud-config.d.ts +12 -1
- package/dist/memory/cloud/cloud-config.js +39 -13
- package/dist/memory/cloud/cloud-sync.d.ts +3 -24
- package/dist/memory/cloud/cloud-sync.js +5 -2
- package/dist/memory/cloud/harness-config.d.ts +0 -7
- package/dist/memory/cloud/memory-scope.d.ts +19 -0
- package/dist/memory/cloud/memory-scope.js +48 -0
- package/dist/memory/cloud/sync-answer.d.ts +43 -0
- package/dist/memory/cloud/sync-answer.js +42 -0
- package/dist/memory/cloud/sync-cycle.d.ts +40 -10
- package/dist/memory/cloud/sync-cycle.js +97 -144
- package/dist/memory/cloud/sync-daemon.d.ts +50 -3
- package/dist/memory/cloud/sync-daemon.js +473 -83
- package/dist/memory/cloud/sync-describe.d.ts +28 -0
- package/dist/memory/cloud/sync-describe.js +92 -0
- package/dist/memory/cloud/sync-disk.d.ts +9 -1
- package/dist/memory/cloud/sync-disk.js +137 -33
- package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
- package/dist/memory/cloud/sync-flow-versions.js +42 -0
- package/dist/memory/impact/impact-store.js +32 -15
- package/dist/memory/intent/intent-shard.d.ts +41 -266
- package/dist/memory/intent/intent-tools.js +20 -61
- package/dist/memory/intent/record-request.d.ts +27 -0
- package/dist/memory/intent/record-request.js +88 -0
- package/dist/memory/intent/settled-words.js +9 -1
- package/dist/memory/journal/drive-flow.d.ts +3 -0
- package/dist/memory/journal/drive-flow.js +11 -41
- package/dist/memory/journal/envelope-store.js +1 -1
- package/dist/memory/journal/envelope.d.ts +6 -154
- package/dist/memory/journal/episode-log.d.ts +107 -0
- package/dist/memory/journal/episode-log.js +302 -0
- package/dist/memory/journal/journal-recorder.d.ts +7 -0
- package/dist/memory/journal/journal-recorder.js +22 -9
- package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
- package/dist/memory/journal/on-disk/ambient-file.js +1 -1
- package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
- package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
- package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
- package/dist/memory/journal/self-observation.js +3 -1
- package/dist/memory/journal/session-end.js +23 -9
- package/dist/memory/journal/session-journal.js +39 -20
- package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
- package/dist/memory/project/artifact-root-resolver.js +68 -23
- package/dist/memory/project/artifact-root.d.ts +17 -3
- package/dist/memory/project/artifact-root.js +47 -9
- package/dist/memory/project/fs/fs-port.d.ts +5 -0
- package/dist/memory/project/fs/fs-port.js +13 -0
- package/dist/memory/project/learned-routes.d.ts +3 -4
- package/dist/memory/project/learned-routes.js +3 -11
- package/dist/memory/project/link-directory.js +5 -2
- package/dist/memory/project/root-claims.d.ts +3 -1
- package/dist/memory/project/root-claims.js +41 -7
- package/dist/memory/project/session-root.d.ts +1 -1
- package/dist/memory/project/session-root.js +1 -15
- package/dist/memory/project/sync-status.js +5 -6
- package/dist/memory/recall/memory-tools.js +2 -2
- package/dist/memory/recall/platform-memory.d.ts +3 -1
- package/dist/memory/recall/platform-memory.js +9 -1
- package/dist/memory/recall/project-memory.js +15 -19
- package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
- package/dist/portal/bridge/auth-failure-reason.js +19 -0
- package/dist/portal/bridge/bridge.d.ts +19 -4
- package/dist/portal/bridge/bridge.js +150 -177
- package/dist/portal/bridge/harness-request.d.ts +15 -0
- package/dist/portal/bridge/harness-request.js +19 -0
- package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
- package/dist/portal/bridge/origin/origin-follow.js +110 -0
- package/dist/portal/bridge/pairing-token.d.ts +6 -0
- package/dist/portal/bridge/pairing-token.js +47 -16
- package/dist/portal/bridge/protocol-skew.d.ts +27 -2
- package/dist/portal/bridge/protocol-skew.js +66 -2
- package/dist/portal/bridge/session-nonces.d.ts +46 -0
- package/dist/portal/bridge/session-nonces.js +72 -0
- package/dist/portal/input/viewport-tools.d.ts +31 -0
- package/dist/portal/input/viewport-tools.js +106 -15
- package/dist/portal/pool/bounded-close.d.ts +23 -0
- package/dist/portal/pool/bounded-close.js +38 -0
- package/dist/portal/pool/browser-pool.d.ts +44 -39
- package/dist/portal/pool/browser-pool.js +247 -95
- package/dist/portal/pool/context-permissions.d.ts +9 -1
- package/dist/portal/pool/context-permissions.js +26 -0
- package/dist/portal/pool/lease-emulation.d.ts +37 -0
- package/dist/portal/pool/lease-emulation.js +29 -0
- package/dist/portal/pool/playwright-launcher.d.ts +6 -0
- package/dist/portal/pool/playwright-launcher.js +74 -7
- package/dist/portal/pool/pool-contract.d.ts +23 -1
- package/dist/portal/pool/pool-lease.d.ts +128 -0
- package/dist/portal/pool/pool-lease.js +49 -0
- package/dist/portal/pool/zero-install.d.ts +8 -1
- package/dist/portal/pool/zero-install.js +24 -2
- package/dist/portal/production/production-activation.d.ts +136 -0
- package/dist/portal/production/production-activation.js +173 -0
- package/dist/portal/production/production-drive.d.ts +52 -0
- package/dist/portal/production/production-drive.js +301 -0
- package/dist/portal/production/production-hello.d.ts +23 -0
- package/dist/portal/production/production-hello.js +23 -0
- package/dist/portal/realm/web-realm.js +42 -15
- package/dist/portal/session/control-envelope.d.ts +1 -1
- package/dist/portal/session/dev-server/served-document.d.ts +0 -5
- package/dist/portal/session/dev-server/served-document.js +6 -8
- package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
- package/dist/portal/session/first-run-wiring.d.ts +3 -36
- package/dist/portal/session/first-run-wiring.js +10 -103
- package/dist/portal/session/live-control-tools.js +61 -19
- package/dist/portal/session/no-session-next-action.d.ts +11 -0
- package/dist/portal/session/no-session-next-action.js +40 -15
- package/dist/portal/session/no-session-watch.d.ts +7 -0
- package/dist/portal/session/no-session-watch.js +67 -23
- package/dist/portal/session/output-budget.d.ts +10 -0
- package/dist/portal/session/output-budget.js +16 -0
- package/dist/portal/session/presence/session-lease.d.ts +2 -0
- package/dist/portal/session/presence/session-lease.js +8 -0
- package/dist/portal/session/recorded-gaps.d.ts +15 -11
- package/dist/portal/session/recorded-gaps.js +39 -18
- package/dist/portal/session/serving-directory.d.ts +24 -2
- package/dist/portal/session/serving-directory.js +93 -5
- package/dist/portal/session/session-info.d.ts +26 -0
- package/dist/portal/session/session-info.js +20 -0
- package/dist/portal/session/session-manager.d.ts +35 -3
- package/dist/portal/session/session-manager.js +69 -14
- package/dist/portal/session/session-successor.js +1 -9
- package/dist/portal/session/session-tools.js +22 -4
- package/dist/portal/session/session.d.ts +10 -10
- package/dist/portal/session/session.js +37 -29
- package/dist/portal/session/zero-install-first-call.d.ts +7 -2
- package/dist/portal/session/zero-install-first-call.js +43 -20
- package/dist/start-wiring.d.ts +2 -2
- package/dist/start-wiring.js +17 -3
- package/dist/status-payload.d.ts +11 -1
- package/dist/status-payload.js +7 -1
- package/dist/surface/agent-presence-grace.d.ts +11 -0
- package/dist/surface/agent-presence-grace.js +34 -0
- package/dist/surface/http-server.d.ts +12 -1
- package/dist/surface/http-server.js +64 -15
- package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
- package/dist/surface/mcp/faults/mcp-outage.js +19 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
- package/dist/surface/mcp/mcp-proxy.js +194 -267
- package/dist/surface/mcp/mcp.d.ts +20 -3
- package/dist/surface/mcp/mcp.js +88 -25
- package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
- package/dist/surface/mcp/proxy/drive-calls.js +114 -5
- package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
- package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
- package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
- package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
- package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
- package/dist/surface/mcp/server-instructions.js +35 -16
- package/dist/surface/mcp/shared-params.d.ts +8 -0
- package/dist/surface/mcp/shared-params.js +15 -1
- package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
- package/dist/surface/mcp/sse-frame-parser.js +18 -0
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +13 -0
- package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
- package/dist/surface/mcp/tool-catalog-cache.js +14 -4
- package/dist/surface/tools/account-tool.d.ts +4 -3
- package/dist/surface/tools/account-tool.js +20 -31
- package/dist/surface/tools/act/act-danger.d.ts +2 -0
- package/dist/surface/tools/act/act-danger.js +41 -14
- package/dist/surface/tools/act/act-observation.d.ts +11 -0
- package/dist/surface/tools/act/act-observation.js +33 -0
- package/dist/surface/tools/act/act-preflight.js +10 -3
- package/dist/surface/tools/act/act-sequence-retry.js +2 -1
- package/dist/surface/tools/act/act-target.js +19 -5
- package/dist/surface/tools/act/durable.js +1 -1
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
- package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
- package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
- package/dist/surface/tools/act/unsettled-find.js +71 -0
- package/dist/surface/tools/act-sequence-tool.js +53 -24
- package/dist/surface/tools/act-tools.d.ts +2 -3
- package/dist/surface/tools/act-tools.js +49 -47
- package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
- package/dist/surface/tools/agent/for-the-agent.js +41 -3
- package/dist/surface/tools/assert/assert-grade.js +8 -3
- package/dist/surface/tools/assert/assert-verdict.js +4 -2
- package/dist/surface/tools/browser-tools.js +7 -4
- package/dist/surface/tools/chat-drives.js +50 -25
- package/dist/surface/tools/coverage-tools.js +1 -1
- package/dist/surface/tools/dynamic-tools.d.ts +8 -0
- package/dist/surface/tools/dynamic-tools.js +89 -34
- package/dist/surface/tools/empty-session-list.d.ts +18 -25
- package/dist/surface/tools/empty-session-list.js +67 -38
- package/dist/surface/tools/error-recovery.d.ts +17 -7
- package/dist/surface/tools/error-recovery.js +53 -20
- package/dist/surface/tools/explore-tools.d.ts +10 -0
- package/dist/surface/tools/explore-tools.js +72 -19
- package/dist/surface/tools/feedback-tools.js +23 -2
- package/dist/surface/tools/gap-novelty.d.ts +6 -0
- package/dist/surface/tools/gap-novelty.js +9 -0
- package/dist/surface/tools/gaps/capability-absences.js +4 -3
- package/dist/surface/tools/harness-explore.d.ts +1 -1
- package/dist/surface/tools/harness-explore.js +6 -4
- package/dist/surface/tools/harness-gate.d.ts +43 -21
- package/dist/surface/tools/harness-gate.js +55 -81
- package/dist/surface/tools/harness-script.d.ts +2 -0
- package/dist/surface/tools/harness-script.js +11 -6
- package/dist/surface/tools/harness-toolset.js +3 -4
- package/dist/surface/tools/invoke-tool.d.ts +0 -8
- package/dist/surface/tools/invoke-tool.js +164 -178
- package/dist/surface/tools/lease-hint.d.ts +9 -0
- package/dist/surface/tools/lease-hint.js +22 -3
- package/dist/surface/tools/lease-permissions.d.ts +1 -1
- package/dist/surface/tools/lease-readiness.d.ts +55 -0
- package/dist/surface/tools/lease-readiness.js +150 -2
- package/dist/surface/tools/lease-tools.d.ts +3 -75
- package/dist/surface/tools/lease-tools.js +124 -188
- package/dist/surface/tools/map-tools.d.ts +20 -0
- package/dist/surface/tools/map-tools.js +145 -0
- package/dist/surface/tools/merge-tools.js +11 -7
- package/dist/surface/tools/next-step.js +6 -3
- package/dist/surface/tools/observe-tools.js +46 -35
- package/dist/surface/tools/platform-moment.d.ts +3 -12
- package/dist/surface/tools/platform-moment.js +12 -24
- package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
- package/dist/surface/tools/read/complete-snapshot.js +13 -2
- package/dist/surface/tools/read/query-paginate.js +6 -0
- package/dist/surface/tools/read/query-shape.d.ts +9 -0
- package/dist/surface/tools/read/query-shape.js +15 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
- package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
- package/dist/surface/tools/read-tools.js +5 -5
- package/dist/surface/tools/real-input-attempt.d.ts +11 -0
- package/dist/surface/tools/real-input-attempt.js +206 -38
- package/dist/surface/tools/reconcile-tools.js +21 -8
- package/dist/surface/tools/reticle-result.d.ts +3 -0
- package/dist/surface/tools/reticle-result.js +8 -1
- package/dist/surface/tools/run-report.d.ts +22 -0
- package/dist/surface/tools/run-report.js +141 -0
- package/dist/surface/tools/session-ports.d.ts +57 -0
- package/dist/surface/tools/session-ports.js +102 -0
- package/dist/surface/tools/tool-kit.d.ts +58 -4
- package/dist/surface/tools/tool-kit.js +140 -6
- package/dist/surface/tools/tool-surface.d.ts +2 -0
- package/dist/surface/tools/tool-surface.js +45 -0
- package/dist/surface/tools/tools.js +49 -87
- package/dist/telemetry/automation-hint.d.ts +5 -0
- package/dist/telemetry/automation-hint.js +7 -0
- package/dist/telemetry/cli-telemetry.d.ts +22 -0
- package/dist/telemetry/cli-telemetry.js +80 -11
- package/dist/telemetry/daemon-telemetry.d.ts +3 -1
- package/dist/telemetry/daemon-telemetry.js +9 -2
- package/dist/telemetry/feedback-cli.d.ts +1 -1
- package/dist/telemetry/feedback-cli.js +8 -3
- package/dist/telemetry/feedback.d.ts +1 -1
- package/dist/telemetry/feedback.js +51 -4
- package/dist/telemetry/harness-run.d.ts +3 -3
- package/dist/telemetry/harness-run.js +18 -7
- package/dist/telemetry/hud-events.d.ts +1 -1
- package/dist/telemetry/hud-metrics.d.ts +6 -3
- package/dist/telemetry/hud-metrics.js +20 -8
- package/dist/telemetry/install-source.js +1 -1
- package/dist/telemetry/mcp-connection.d.ts +1 -1
- package/dist/telemetry/mcp-connection.js +21 -2
- package/dist/telemetry/onboarding-firsts.d.ts +6 -1
- package/dist/telemetry/onboarding-firsts.js +41 -1
- package/dist/telemetry/proxy-telemetry.d.ts +42 -0
- package/dist/telemetry/proxy-telemetry.js +70 -1
- package/dist/telemetry/session-metrics.d.ts +1 -3
- package/dist/telemetry/session-metrics.js +16 -12
- package/dist/telemetry/telemetry.d.ts +9 -1
- package/dist/telemetry/telemetry.js +16 -1
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +7 -1
- package/dist/wire-journal.js +12 -2
- package/docs/README.md +4 -2
- package/docs/actions.mdx +7 -6
- package/docs/adapters.md +2 -1
- package/docs/agent-cheatsheet.md +19 -5
- package/docs/architecture.md +13 -10
- package/docs/autodrive.md +6 -5
- package/docs/benchmarks.md +2 -2
- package/docs/capabilities.mdx +1 -1
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +6 -6
- package/docs/cli/doctor.mdx +3 -1
- package/docs/cli/feedback.mdx +11 -7
- package/docs/cli/gate.mdx +1 -1
- package/docs/cli/help.mdx +1 -1
- package/docs/cli/init.mdx +20 -16
- package/docs/cli/mcp.mdx +5 -2
- package/docs/cli/open.mdx +5 -2
- package/docs/cli/report.mdx +1 -1
- package/docs/cli/restart.mdx +1 -1
- package/docs/cli/rollback.mdx +4 -4
- package/docs/cli/serve.mdx +7 -5
- package/docs/cli/setup.mdx +1 -1
- package/docs/cli/status.mdx +6 -2
- package/docs/cli/stop.mdx +3 -3
- package/docs/cli/telemetry.mdx +5 -1
- package/docs/cli/try.mdx +8 -8
- package/docs/cli/update.mdx +8 -5
- package/docs/cli/verify.mdx +12 -5
- package/docs/cli/version.mdx +1 -1
- package/docs/cli.mdx +10 -6
- package/docs/debugging.md +1 -1
- package/docs/deploy-checks.md +8 -6
- package/docs/desktop.mdx +14 -18
- package/docs/enterprise.md +6 -6
- package/docs/environment.mdx +5 -3
- package/docs/faq.mdx +9 -6
- package/docs/first-drive.md +19 -9
- package/docs/flows.md +3 -4
- package/docs/for-agents.md +1 -1
- package/docs/frameworks.mdx +34 -11
- package/docs/getting-started.md +46 -29
- package/docs/http-transport.md +2 -2
- package/docs/human-control.md +8 -8
- package/docs/index.mdx +2 -2
- package/docs/install-agentic.mdx +18 -19
- package/docs/install-manual.mdx +8 -4
- package/docs/integration-patterns.md +5 -5
- package/docs/multi-agent-testing.md +7 -5
- package/docs/packages/browser.mdx +34 -2
- package/docs/packages/core.mdx +2 -1
- package/docs/packages/electron.mdx +15 -3
- package/docs/packages/eslint-plugin.mdx +1 -1
- package/docs/packages/next.mdx +17 -5
- package/docs/packages/react.mdx +8 -1
- package/docs/packages/server.mdx +3 -3
- package/docs/packages/tauri.mdx +3 -3
- package/docs/packages/vite-plugin.mdx +1 -1
- package/docs/packages.mdx +19 -6
- package/docs/platform-integration.md +12 -4
- package/docs/predicates.mdx +18 -7
- package/docs/production-mode.md +108 -0
- package/docs/prompt-capture.md +99 -0
- package/docs/quickstart.mdx +14 -12
- package/docs/recipes.mdx +9 -8
- package/docs/required-checks.md +3 -2
- package/docs/skill-file.mdx +4 -3
- package/docs/skill-setup.md +2 -2
- package/docs/skill.md +62 -70
- package/docs/state-files.md +1 -0
- package/docs/state-management.mdx +11 -9
- package/docs/system-map.md +14 -13
- package/docs/telemetry.md +32 -24
- package/docs/testing.md +9 -5
- package/docs/tools/act-and-wait.mdx +17 -13
- package/docs/tools/act-sequence.mdx +40 -66
- package/docs/tools/act.mdx +7 -5
- package/docs/tools/assert.mdx +1 -1
- package/docs/tools/look.mdx +1 -1
- package/docs/tools/navigate.mdx +1 -1
- package/docs/tools/network.mdx +13 -11
- package/docs/tools/overview.mdx +3 -3
- package/docs/tools/query.mdx +3 -3
- package/docs/tools/session-and-feedback.mdx +9 -6
- package/docs/tools/sessions.mdx +7 -0
- package/docs/tools/snapshot.mdx +9 -7
- package/docs/tools/tools-and-run.mdx +11 -10
- package/docs/tools/verify.mdx +1 -1
- package/docs/troubleshooting.mdx +21 -9
- package/docs/usage.md +58 -43
- package/docs/use-cases.mdx +2 -2
- package/docs/vs-chrome-devtools-mcp.mdx +5 -5
- package/docs/vs-playwright-mcp.mdx +5 -4
- package/docs/what-is-recorded.md +12 -7
- package/docs/what-is-reticle.mdx +2 -2
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/dev/stale-issue-guard.d.ts +0 -34
- package/dist/command/dev/stale-issue-guard.js +0 -69
|
@@ -4,6 +4,59 @@ 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';
|
|
6
6
|
import { asString } from '@reticlehq/core';
|
|
7
|
+
import { ColorScheme, ReducedMotion, } from '../pool/lease-emulation.js';
|
|
8
|
+
// ── Media and width, as a tool call names them (reticle_viewport here, reticle_lease acquire) ──
|
|
9
|
+
/** Playwright's own default page size, used for the side a caller did not name. */
|
|
10
|
+
const DEFAULT_WIDTH = 1280;
|
|
11
|
+
const DEFAULT_HEIGHT = 720;
|
|
12
|
+
export const COLOR_SCHEME_ARG = z
|
|
13
|
+
.enum([ColorScheme.LIGHT, ColorScheme.DARK, ColorScheme.NO_PREFERENCE])
|
|
14
|
+
.optional()
|
|
15
|
+
.describe('prefers-color-scheme for this page: light, dark or no-preference.');
|
|
16
|
+
export const REDUCED_MOTION_ARG = z
|
|
17
|
+
.enum([ReducedMotion.REDUCE, ReducedMotion.NO_PREFERENCE])
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('prefers-reduced-motion for this page: reduce or no-preference.');
|
|
20
|
+
const EmulateSchema = z
|
|
21
|
+
.object({
|
|
22
|
+
colorScheme: COLOR_SCHEME_ARG,
|
|
23
|
+
reducedMotion: REDUCED_MOTION_ARG,
|
|
24
|
+
width: viewportPxSchema.optional(),
|
|
25
|
+
height: viewportPxSchema.optional(),
|
|
26
|
+
})
|
|
27
|
+
.strict();
|
|
28
|
+
export const LEASE_EMULATE_ARG = EmulateSchema.optional().describe('Open the lease with these set before the first paint: { colorScheme, reducedMotion, width, height }. ' +
|
|
29
|
+
'A side you leave out keeps its default (1280 by 720). Change them later with reticle_viewport.');
|
|
30
|
+
/** The media part of what a caller asked for, or undefined when it asked for none. */
|
|
31
|
+
export function mediaOf(raw) {
|
|
32
|
+
const parsed = EmulateSchema.pick({ colorScheme: true, reducedMotion: true }).parse({
|
|
33
|
+
colorScheme: raw.colorScheme,
|
|
34
|
+
reducedMotion: raw.reducedMotion,
|
|
35
|
+
});
|
|
36
|
+
const media = {
|
|
37
|
+
...(parsed.colorScheme === undefined ? {} : { colorScheme: parsed.colorScheme }),
|
|
38
|
+
...(parsed.reducedMotion === undefined ? {} : { reducedMotion: parsed.reducedMotion }),
|
|
39
|
+
};
|
|
40
|
+
return 0 === Object.keys(media).length ? undefined : media;
|
|
41
|
+
}
|
|
42
|
+
/** A lease's `emulate` argument, read; a value it does not know is refused by name. */
|
|
43
|
+
export function leaseEmulationOf(raw) {
|
|
44
|
+
if (raw === undefined)
|
|
45
|
+
return undefined;
|
|
46
|
+
const parsed = EmulateSchema.safeParse(raw);
|
|
47
|
+
if (!parsed.success) {
|
|
48
|
+
const field = parsed.error.issues[0]?.path.join('.') ?? 'emulate';
|
|
49
|
+
throw new Error(`emulate.${field}: ${parsed.error.issues[0]?.message ?? 'not valid'}`);
|
|
50
|
+
}
|
|
51
|
+
const { width, height } = parsed.data;
|
|
52
|
+
const media = mediaOf(parsed.data);
|
|
53
|
+
const viewport = width === undefined && height === undefined
|
|
54
|
+
? undefined
|
|
55
|
+
: { width: width ?? DEFAULT_WIDTH, height: height ?? DEFAULT_HEIGHT };
|
|
56
|
+
if (media === undefined && viewport === undefined)
|
|
57
|
+
return undefined;
|
|
58
|
+
return { ...media, ...(viewport === undefined ? {} : { viewport }) };
|
|
59
|
+
}
|
|
7
60
|
/** Bounds so a viewport request stays sane (and a typo can't ask for a 1px or 100k-px window). */
|
|
8
61
|
const MIN_DIM = MIN_VIEWPORT_PX;
|
|
9
62
|
const MAX_DIM = MAX_VIEWPORT_PX;
|
|
@@ -19,29 +72,49 @@ export const VIEWPORT_TOOLS = [
|
|
|
19
72
|
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
73
|
'reproducible across machines — the missing piece of CI-stable visual regression, alongside ' +
|
|
21
74
|
'reticle_visual_diff `masks` and a frozen clock (reticle_clock). Set it once before reticle_screenshot / ' +
|
|
22
|
-
'reticle_visual_diff.
|
|
75
|
+
'reticle_visual_diff. On a lease it also sets prefers-color-scheme and prefers-reduced-motion; ' +
|
|
76
|
+
'give only those to change the media and keep the size. Returns { applied, width, height, observed } or the no-provider recommendation; `observed` is the size the leased page reports after the resize.',
|
|
23
77
|
inputSchema: {
|
|
24
|
-
width: viewportPxSchema.describe('Viewport width in CSS px (e.g. 1280).'),
|
|
25
|
-
height: viewportPxSchema.describe('Viewport height in CSS px (e.g. 800).'),
|
|
78
|
+
width: viewportPxSchema.optional().describe('Viewport width in CSS px (e.g. 1280).'),
|
|
79
|
+
height: viewportPxSchema.optional().describe('Viewport height in CSS px (e.g. 800).'),
|
|
80
|
+
colorScheme: COLOR_SCHEME_ARG,
|
|
81
|
+
reducedMotion: REDUCED_MOTION_ARG,
|
|
26
82
|
...sessionIdShape,
|
|
27
83
|
},
|
|
28
84
|
outputSchema: {
|
|
29
85
|
applied: z.boolean(),
|
|
30
86
|
width: z.number(),
|
|
31
87
|
height: z.number(),
|
|
88
|
+
observed: z.object({ width: z.number(), height: z.number() }).optional(),
|
|
89
|
+
colorScheme: z.string().optional(),
|
|
90
|
+
reducedMotion: z.string().optional(),
|
|
32
91
|
ok: z.boolean().optional(),
|
|
33
92
|
reason: z.string().optional(),
|
|
34
93
|
recommendation: z.string().optional(),
|
|
35
94
|
},
|
|
36
95
|
handler: async (deps, args) => {
|
|
96
|
+
const media = mediaOf(args);
|
|
97
|
+
if (media !== undefined && args['width'] === undefined && args['height'] === undefined) {
|
|
98
|
+
const session = deps.sessions.resolve(asString(args['sessionId']));
|
|
99
|
+
if (true === (await deps.pool?.emulateLease(session.id, media))) {
|
|
100
|
+
return { applied: true, width: 0, height: 0, ...media };
|
|
101
|
+
}
|
|
102
|
+
return { ...refused(), recommendation: MEDIA_NEEDS_A_LEASE };
|
|
103
|
+
}
|
|
37
104
|
const width = clampDim('width', args['width']);
|
|
38
105
|
const height = clampDim('height', args['height']);
|
|
39
106
|
const session = deps.sessions.resolve(asString(args['sessionId']));
|
|
40
|
-
|
|
107
|
+
// A lease is resized as the lease. The driven provider resizes its own page, whatever
|
|
108
|
+
// session was named, so taking it first resized the wrong tab and said `applied: true`.
|
|
109
|
+
const driven = viewportProvider(deps);
|
|
110
|
+
const provider = driven !== undefined && deps.pool?.leaseUrl(session.id) === undefined ? driven : undefined;
|
|
41
111
|
if (provider !== undefined) {
|
|
42
112
|
const applied = await provider.setViewport(session.url, { width, height });
|
|
43
|
-
|
|
113
|
+
// The driven page takes the size; its media stay as the person's browser has them.
|
|
114
|
+
if (applied && media === undefined)
|
|
44
115
|
return { applied: true, width, height };
|
|
116
|
+
if (applied)
|
|
117
|
+
return { applied: true, width, height, recommendation: MEDIA_NEEDS_A_LEASE };
|
|
45
118
|
}
|
|
46
119
|
// A lease is a Playwright-owned page, so the resize was always possible — this tool just had
|
|
47
120
|
// no route to it. Tried after the driven provider, on the same rule reticle_network_mock
|
|
@@ -52,19 +125,37 @@ export const VIEWPORT_TOOLS = [
|
|
|
52
125
|
// only mounts under a breakpoint — could not be driven at a desktop viewport at all, and the
|
|
53
126
|
// recommendation printed alongside the refusal asked the reader to install a second browser.
|
|
54
127
|
const leased = await deps.pool?.setViewportLease(session.id, { width, height });
|
|
55
|
-
if (true
|
|
56
|
-
return
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
height:
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
128
|
+
if (true !== leased)
|
|
129
|
+
return refused();
|
|
130
|
+
// What the page reports after the resize, so `applied` is a reading and not a hope.
|
|
131
|
+
const observed = await deps.pool?.viewportOfLease(session.id);
|
|
132
|
+
if (observed !== undefined && (observed.width !== width || observed.height !== height)) {
|
|
133
|
+
return { applied: false, width, height, observed, ok: false, reason: VIEWPORT_NOT_TAKEN };
|
|
134
|
+
}
|
|
135
|
+
const seen = observed === undefined ? {} : { observed };
|
|
136
|
+
if (media === undefined)
|
|
137
|
+
return { applied: true, width, height, ...seen };
|
|
138
|
+
if (true === (await deps.pool?.emulateLease(session.id, media))) {
|
|
139
|
+
return { applied: true, width, height, ...seen, ...media };
|
|
140
|
+
}
|
|
141
|
+
return { ...refused(), width, height, recommendation: MEDIA_NEEDS_A_LEASE };
|
|
65
142
|
},
|
|
66
143
|
},
|
|
67
144
|
];
|
|
145
|
+
/** The resize went through, but the page still reports another size. */
|
|
146
|
+
const VIEWPORT_NOT_TAKEN = 'the page still reports the size in `observed` after the resize, so the size was not applied';
|
|
147
|
+
/** prefers-color-scheme and prefers-reduced-motion are set on a leased page only. */
|
|
148
|
+
const MEDIA_NEEDS_A_LEASE = 'Media features are set on a leased tab: open one with reticle_lease { action: "acquire", emulate }, then call this again with its sessionId.';
|
|
149
|
+
function refused() {
|
|
150
|
+
return {
|
|
151
|
+
applied: false,
|
|
152
|
+
width: 0,
|
|
153
|
+
height: 0,
|
|
154
|
+
ok: false,
|
|
155
|
+
reason: CDP_NO_PROVIDER_REASON,
|
|
156
|
+
recommendation: VIEWPORT_NO_PROVIDER_RECOMMENDATION,
|
|
157
|
+
};
|
|
158
|
+
}
|
|
68
159
|
/**
|
|
69
160
|
* Clamp a requested dimension into [MIN_DIM, MAX_DIM]; a missing value falls back to MIN_DIM.
|
|
70
161
|
*
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A close that has a time limit.
|
|
3
|
+
*
|
|
4
|
+
* Playwright's `context.close()` and `browser.close()` can wait forever on a browser that stopped
|
|
5
|
+
* answering. The pool awaited them with no limit, so one such close held a lease slot and kept the
|
|
6
|
+
* tab open after the agent was gone.
|
|
7
|
+
*/
|
|
8
|
+
/** Logged when a leased tab did not close within LEASE_CLOSE_TIMEOUT_MS. */
|
|
9
|
+
export declare const LEASE_CLOSE_TIMED_OUT = "lease_close_timed_out";
|
|
10
|
+
/**
|
|
11
|
+
* Dispose the lease's init script, then close its context. False when that took longer than `ms`.
|
|
12
|
+
* The disposal is best-effort: a context that is already gone (a crash) makes it moot.
|
|
13
|
+
*/
|
|
14
|
+
export declare function closeLeaseTab(tab: {
|
|
15
|
+
hostStub?: {
|
|
16
|
+
dispose(): Promise<void>;
|
|
17
|
+
};
|
|
18
|
+
context: {
|
|
19
|
+
close(): Promise<void>;
|
|
20
|
+
};
|
|
21
|
+
}, ms: number): Promise<boolean>;
|
|
22
|
+
/** Whether `work` settled within `ms`. A rejection counts as settled: the close is over. */
|
|
23
|
+
export declare function settledWithin(work: Promise<unknown>, ms: number): Promise<boolean>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A close that has a time limit.
|
|
3
|
+
*
|
|
4
|
+
* Playwright's `context.close()` and `browser.close()` can wait forever on a browser that stopped
|
|
5
|
+
* answering. The pool awaited them with no limit, so one such close held a lease slot and kept the
|
|
6
|
+
* tab open after the agent was gone.
|
|
7
|
+
*/
|
|
8
|
+
/** Logged when a leased tab did not close within LEASE_CLOSE_TIMEOUT_MS. */
|
|
9
|
+
export const LEASE_CLOSE_TIMED_OUT = 'lease_close_timed_out';
|
|
10
|
+
/**
|
|
11
|
+
* Dispose the lease's init script, then close its context. False when that took longer than `ms`.
|
|
12
|
+
* The disposal is best-effort: a context that is already gone (a crash) makes it moot.
|
|
13
|
+
*/
|
|
14
|
+
export function closeLeaseTab(tab, ms) {
|
|
15
|
+
const closing = (async () => {
|
|
16
|
+
await tab.hostStub?.dispose().catch(() => undefined);
|
|
17
|
+
await tab.context.close();
|
|
18
|
+
})();
|
|
19
|
+
return settledWithin(closing, ms);
|
|
20
|
+
}
|
|
21
|
+
/** Whether `work` settled within `ms`. A rejection counts as settled: the close is over. */
|
|
22
|
+
export async function settledWithin(work, ms) {
|
|
23
|
+
let timer;
|
|
24
|
+
const late = new Promise((resolve) => {
|
|
25
|
+
timer = setTimeout(() => resolve(false), ms);
|
|
26
|
+
});
|
|
27
|
+
try {
|
|
28
|
+
return await Promise.race([
|
|
29
|
+
work.then(() => true, () => true),
|
|
30
|
+
late,
|
|
31
|
+
]);
|
|
32
|
+
}
|
|
33
|
+
finally {
|
|
34
|
+
if (timer !== undefined) {
|
|
35
|
+
clearTimeout(timer);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -11,45 +11,12 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { type SeedStorage } from '@reticlehq/core';
|
|
13
13
|
import type { Launcher, PooledMockRule, ScreenshotOptions } from './pool-contract.js';
|
|
14
|
+
import type { RealInputArgs, RealInputResult } from '../input/real-input.js';
|
|
15
|
+
import { type LeaseEmulation, type LeaseMedia } from './lease-emulation.js';
|
|
14
16
|
export type { InitScriptHandle, Launcher, PooledBrowser, PooledContext, PooledCookie, PooledDialog, PooledMockRule, PooledPage, } from './pool-contract.js';
|
|
15
|
-
|
|
16
|
-
export
|
|
17
|
-
|
|
18
|
-
readonly url: string;
|
|
19
|
-
readonly navStatus?: number;
|
|
20
|
-
release(): Promise<void>;
|
|
21
|
-
/**
|
|
22
|
-
* Hand the page the zero-install reader: evaluated in the live document, and added ahead of every
|
|
23
|
-
* document this lease loads next. False when there is no reader, or the page cannot run one.
|
|
24
|
-
*/
|
|
25
|
-
injectReader?(): Promise<boolean>;
|
|
26
|
-
}
|
|
27
|
-
/** Default lease time-to-live: a lease untouched for this long is presumed orphaned and reclaimed. */
|
|
28
|
-
export declare const DEFAULT_LEASE_TTL_MS: number;
|
|
29
|
-
interface BrowserPoolOptions {
|
|
30
|
-
/** Max simultaneous leased contexts. Over-cap acquires queue. */
|
|
31
|
-
maxContexts: number;
|
|
32
|
-
/** Stable id generator for lease sessionIds (injected to stay clock-/random-free in logic). */
|
|
33
|
-
genSessionId: () => string;
|
|
34
|
-
/** Injected clock (ms). Defaults to Date.now; tests pass a controllable one. */
|
|
35
|
-
now?: () => number;
|
|
36
|
-
/** A lease untouched for longer than this is reclaimed by sweepExpired. */
|
|
37
|
-
leaseTtlMs?: number;
|
|
38
|
-
/** Per-lease navigation timeout — a page that won't load fails its own lease, never blocks a slot. */
|
|
39
|
-
navTimeoutMs?: number;
|
|
40
|
-
/**
|
|
41
|
-
* The zero-install reader, built where the daemon knows its own port and pairing token. A thunk so
|
|
42
|
-
* the ~450KB build is only read if some page ever needs it; undefined when there is none to give.
|
|
43
|
-
*/
|
|
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;
|
|
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";
|
|
17
|
+
import { type BrowserPoolOptions, type Lease } from './pool-lease.js';
|
|
18
|
+
export { DEFAULT_LEASE_TTL_MS, NO_HEADED_BROWSER, ORPHANED_LEASE_GRACE_MS, PoolAtCapacityError, } from './pool-lease.js';
|
|
19
|
+
export type { Lease } from './pool-lease.js';
|
|
53
20
|
/**
|
|
54
21
|
* Owns a headless browser (and, when asked, a headed one) and leases isolated contexts out of them,
|
|
55
22
|
* capped at `maxContexts` across both.
|
|
@@ -108,6 +75,17 @@ export declare class BrowserPool {
|
|
|
108
75
|
heldBy(sessionId: string, owner: string | undefined): boolean;
|
|
109
76
|
/** Mark a lease as still in use (called on agent activity) so the reaper doesn't reclaim it. */
|
|
110
77
|
touch(sessionId: string): void;
|
|
78
|
+
/**
|
|
79
|
+
* The MCP connection `owner` closed. Its leases go after {@link ORPHANED_LEASE_GRACE_MS} unless it
|
|
80
|
+
* touches them again: a reconnect is a new owner, so nothing else would ever hand them back, and
|
|
81
|
+
* each one held a browser window open for the full TTL.
|
|
82
|
+
*/
|
|
83
|
+
detachOwner(owner: string): void;
|
|
84
|
+
/**
|
|
85
|
+
* The MCP connection `owner` came back: a proxy that reconnects keeps its id. Its leases stop
|
|
86
|
+
* their grace, because the owner they wait for is here again.
|
|
87
|
+
*/
|
|
88
|
+
reattachOwner(owner: string): void;
|
|
111
89
|
/**
|
|
112
90
|
* Reclaim leases untouched for longer than the TTL — a hung/crashed agent never holds a slot
|
|
113
91
|
* forever. Returns the released sessionIds. This is the fault-tolerance backstop for the pool.
|
|
@@ -139,6 +117,18 @@ export declare class BrowserPool {
|
|
|
139
117
|
* Touches the lease like any other tool call, so hovering keeps it alive.
|
|
140
118
|
*/
|
|
141
119
|
hoverLease(sessionId: string, x: number, y: number): Promise<boolean>;
|
|
120
|
+
/** Set a live lease's media features, or false when this is not a lease or its page cannot. */
|
|
121
|
+
emulateLease(sessionId: string, media: LeaseMedia): Promise<boolean>;
|
|
122
|
+
/** Whether this lease's page is still loading. False for a non-lease, or a page that cannot say. */
|
|
123
|
+
leaseLoading(sessionId: string): Promise<boolean>;
|
|
124
|
+
/** Whether this session is a lease whose page has a real keyboard. */
|
|
125
|
+
hasKeyboard(sessionId: string): boolean;
|
|
126
|
+
/**
|
|
127
|
+
* Press a key with the leased page's real keyboard, or undefined when this session is not a lease
|
|
128
|
+
* or its page has no keyboard. A throw is the caller's to read: a key that went down and did not
|
|
129
|
+
* come up must not be answered with a second, synthetic press.
|
|
130
|
+
*/
|
|
131
|
+
pressLease(sessionId: string, args: RealInputArgs): Promise<RealInputResult | undefined>;
|
|
142
132
|
/**
|
|
143
133
|
* Install network mocks on a leased page, or false when this session is not a lease or cannot
|
|
144
134
|
* intercept. Same optional-capability contract as screenshotLease: absence must read as "could not
|
|
@@ -157,7 +147,14 @@ export declare class BrowserPool {
|
|
|
157
147
|
width: number;
|
|
158
148
|
height: number;
|
|
159
149
|
}): Promise<boolean>;
|
|
150
|
+
/** The size a leased page reports for itself, or undefined when it cannot be read. */
|
|
151
|
+
viewportOfLease(sessionId: string): Promise<{
|
|
152
|
+
width: number;
|
|
153
|
+
height: number;
|
|
154
|
+
} | undefined>;
|
|
160
155
|
setMocksLease(sessionId: string, rules: readonly PooledMockRule[]): Promise<boolean>;
|
|
156
|
+
/** Guard a leased page's requests, or false when this is not a lease or its page cannot. */
|
|
157
|
+
guardLease(sessionId: string, decide: (method: string, url: string) => string | undefined): Promise<boolean>;
|
|
161
158
|
/** What a lease was granted when it opened, or undefined for a session that is not a lease. */
|
|
162
159
|
permissionsOf(sessionId: string): readonly string[] | undefined;
|
|
163
160
|
/**
|
|
@@ -205,10 +202,16 @@ export declare class BrowserPool {
|
|
|
205
202
|
wasReapedLease(sessionId: string): boolean;
|
|
206
203
|
/**
|
|
207
204
|
* Lease an isolated context, navigate it to `url`, and return a handle. If the pool is at capacity,
|
|
208
|
-
* waits FIFO until a slot frees (or until `signal` aborts, if provided)
|
|
205
|
+
* waits FIFO until a slot frees (or until `signal` aborts, if provided), unless `whenFull` is
|
|
206
|
+
* `'refuse'`: then it throws {@link PoolAtCapacityError} at once and claims nothing.
|
|
209
207
|
*/
|
|
210
208
|
acquire(url: string, opts?: {
|
|
211
209
|
signal?: AbortSignal;
|
|
210
|
+
/**
|
|
211
|
+
* `'wait'` (the default) queues behind the cap. `'refuse'` is for a caller that has a person
|
|
212
|
+
* or an agent waiting on the answer and no way to see a queue: it is told the pool is full.
|
|
213
|
+
*/
|
|
214
|
+
whenFull?: 'wait' | 'refuse';
|
|
212
215
|
sessionId?: string;
|
|
213
216
|
seedStorage?: SeedStorage;
|
|
214
217
|
owner?: string;
|
|
@@ -224,6 +227,8 @@ export declare class BrowserPool {
|
|
|
224
227
|
permissions?: readonly string[];
|
|
225
228
|
/** Accept a self-signed or local-CA dev certificate for this lease's context only (#1255). */
|
|
226
229
|
ignoreHTTPSErrors?: boolean;
|
|
230
|
+
/** Media and viewport set on the context, so the first paint already has them. */
|
|
231
|
+
emulate?: LeaseEmulation;
|
|
227
232
|
}): Promise<Lease>;
|
|
228
233
|
/**
|
|
229
234
|
* The websocket address this lease's page reported it could not reach, if it reported one.
|