@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
|
@@ -2,7 +2,7 @@ import { z } from 'zod';
|
|
|
2
2
|
import { sessionRoot, sessionProjectId } from '../../memory/project/session-root.js';
|
|
3
3
|
import { verdictForSuite } from '../../judgement/outcome/verify-change-verdict.js';
|
|
4
4
|
import { attributedFailures } from '../../judgement/outcome/attributed-failure.js';
|
|
5
|
-
import { Verified } from '@reticlehq/core';
|
|
5
|
+
import { Verified, isAdvisory } from '@reticlehq/core';
|
|
6
6
|
import { ReticleTool } from '@reticlehq/core';
|
|
7
7
|
import { asNumber, asRecord, asString } from '@reticlehq/core';
|
|
8
8
|
import { workerCountSchema } from '../../surface/tools/args/numeric-bounds.js';
|
|
@@ -10,207 +10,217 @@ import { loadNamedFlows, resolveChangedFiles } from '../../command/cli/cli-flow-
|
|
|
10
10
|
import { projectDirFor } from '../../memory/project/session-root.js';
|
|
11
11
|
import { affectedSavedFlows } from './change/flow-sources.js';
|
|
12
12
|
import { FLOW_TOOLS } from './flow-tools.js';
|
|
13
|
+
import { RESULT_FIELD, changeResult } from '../../surface/tools/reticle-result.js';
|
|
13
14
|
import { findContradictions } from '@reticlehq/engine/disagreement/contradictions.js';
|
|
14
15
|
import { parseControls } from '../../surface/tools/coverage-tools.js';
|
|
15
16
|
import { ReticleCommand, SnapshotMode } from '@reticlehq/core';
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
verified: earned ? Verified.NO : Verified.UNKNOWN,
|
|
178
|
-
because: earned
|
|
179
|
-
? `every covering flow passed, but channels disagreed during the replay (${kinds}) — a green suite over a failed write is the false green worth looking at${provenanceNote}`
|
|
180
|
-
: `channels disagreed during the replay (${kinds}), but Reticle cannot tell which sources any of the flows that ran cover (${affected.join(', ')}), so this says nothing about the files you changed. Drive the change directly; the drive is saved as a flow with its sources stamped`,
|
|
181
|
-
changedFiles,
|
|
182
|
-
flowsRun: affected,
|
|
183
|
-
suite,
|
|
184
|
-
unknownProvenance,
|
|
185
|
-
contradictions: extra.contradictions,
|
|
186
|
-
...(extra.untouched === undefined ? {} : { untouched: extra.untouched }),
|
|
187
|
-
measured: extra.measured,
|
|
188
|
-
};
|
|
189
|
-
}
|
|
190
|
-
// The mirror of `earnedNo`: a green from flows that ran only because their sources are unknown
|
|
191
|
-
// says nothing about these files either. At least one attributed flow has to have passed.
|
|
192
|
-
if (0 === attributedFailures(affected, unknownProvenance).length) {
|
|
193
|
-
return {
|
|
194
|
-
verified: Verified.UNKNOWN,
|
|
195
|
-
because: `the flows that ran passed, but Reticle cannot tell which sources any of them cover (${affected.join(', ')}), so this says nothing about the files you changed. Drive the change directly; the drive is saved as a flow with its sources stamped`,
|
|
196
|
-
changedFiles,
|
|
197
|
-
flowsRun: affected,
|
|
198
|
-
suite,
|
|
199
|
-
unknownProvenance,
|
|
200
|
-
measured: extra.measured,
|
|
201
|
-
};
|
|
202
|
-
}
|
|
17
|
+
const VERIFY_CHANGE = {
|
|
18
|
+
name: ReticleTool.VERIFY_CHANGE,
|
|
19
|
+
description: 'Did my change break anything? Give it the files you edited (or `since` for a git ref) and it works out which saved flows cover them, replays exactly those, and answers with one `verified` (yes|no|unknown) plus `because`. `unknown` when NO saved flow covers the change — that is the honest answer, never a green: nothing ran, so nothing was proved. Returns { verified, because, changedFiles, flowsRun, suite, unknownProvenance }.',
|
|
20
|
+
example: { files: ['src/App.tsx'] },
|
|
21
|
+
inputSchema: {
|
|
22
|
+
files: z
|
|
23
|
+
.array(z.string())
|
|
24
|
+
.optional()
|
|
25
|
+
.describe('Changed file paths, repo-relative (e.g. ["src/App.tsx"]).'),
|
|
26
|
+
since: z
|
|
27
|
+
.string()
|
|
28
|
+
.optional()
|
|
29
|
+
.describe('Git ref to diff against (e.g. "HEAD~1", "main"). Unioned with `files`.'),
|
|
30
|
+
parallel: workerCountSchema
|
|
31
|
+
.optional()
|
|
32
|
+
.describe('Replay this many affected flows at once (needs the browser pool).'),
|
|
33
|
+
sessionId: z
|
|
34
|
+
.string()
|
|
35
|
+
.optional()
|
|
36
|
+
.describe('OMIT THIS unless you mean a specific tab — Reticle resolves it.'),
|
|
37
|
+
},
|
|
38
|
+
outputSchema: {
|
|
39
|
+
verified: z
|
|
40
|
+
.string()
|
|
41
|
+
.describe('yes | no | unknown. `unknown` means the evidence could not decide — most often that no saved flow covers these files, which is NOT a pass.'),
|
|
42
|
+
because: z.string(),
|
|
43
|
+
changedFiles: z.array(z.string()),
|
|
44
|
+
flowsRun: z.array(z.string()),
|
|
45
|
+
suite: z.unknown().optional(),
|
|
46
|
+
// Session-EXEMPT: declare the one-shot human feedback ask or a validating profile strips it.
|
|
47
|
+
feedback_prompt: z.unknown().optional(),
|
|
48
|
+
unknownProvenance: z.array(z.string()),
|
|
49
|
+
contradictions: z
|
|
50
|
+
.array(z.unknown())
|
|
51
|
+
.optional()
|
|
52
|
+
.describe('Findings from channels inspected during replay. Advisory entries are reported without changing the verdict; verdict-deciding entries can turn a green suite into no or unknown. OMITTED when clean; see `measured` when it could not be looked for.'),
|
|
53
|
+
untouched: z
|
|
54
|
+
.array(z.unknown())
|
|
55
|
+
.optional()
|
|
56
|
+
.describe('Controls on the page that the covering flows never drove. A green over a small untouched list is stronger evidence than the same green over a large one.'),
|
|
57
|
+
[RESULT_FIELD]: z.string().optional(),
|
|
58
|
+
measured: z
|
|
59
|
+
.array(z.string())
|
|
60
|
+
.describe('What was actually looked for. An absent `contradictions` means "none found" ONLY if "contradictions" appears here — otherwise it was never measured.'),
|
|
61
|
+
},
|
|
62
|
+
handler: async (deps, args) => {
|
|
63
|
+
const files = Array.isArray(args['files'])
|
|
64
|
+
? args['files'].filter((f) => 'string' === typeof f)
|
|
65
|
+
: [];
|
|
66
|
+
const since = asString(args['since']);
|
|
67
|
+
// The tree to diff is the SESSION's project, and it is neither of the two things this line
|
|
68
|
+
// used to say it was: `deps.reticleRoot` is the daemon's `.reticle` SUBDIRECTORY, and the
|
|
69
|
+
// daemon's cwd is wherever the MCP host started it — `/` or `$HOME` for a globally-registered
|
|
70
|
+
// server. Both answer about the wrong repository while reporting a clean "nothing changed",
|
|
71
|
+
// which reads as a pass. `projectDirFor` is the directory holding the resolved root.
|
|
72
|
+
const changed = await resolveChangedFiles(files, since, projectDirFor(deps, asString(args['sessionId'])));
|
|
73
|
+
const changedFiles = changed.files;
|
|
74
|
+
// Same root flow_save wrote to. A read that resolved differently would report "no flows
|
|
75
|
+
// covered this change" over flows that exist, which reads as a clean result rather than
|
|
76
|
+
// an error, so the disagreement would be invisible.
|
|
77
|
+
// Both halves of the address from one place. The root was already resolved from the session;
|
|
78
|
+
// the id used to come from the daemon's cwd, so they named different projects.
|
|
79
|
+
const sid = asString(args['sessionId']);
|
|
80
|
+
const flows = await loadNamedFlows(deps.fs, sessionRoot(deps, sid), sessionProjectId(deps, sid));
|
|
81
|
+
const { affected, unknownProvenance } = affectedSavedFlows(flows, changedFiles);
|
|
82
|
+
if (0 === changedFiles.length) {
|
|
83
|
+
return {
|
|
84
|
+
verified: Verified.UNKNOWN,
|
|
85
|
+
// A git failure and a clean tree both arrive here with no files, and they are opposite
|
|
86
|
+
// answers: one means there was nothing to decide about, the other means the question was
|
|
87
|
+
// never asked. `unknown` is right either way, but the REASON is what the caller acts on.
|
|
88
|
+
because: changed.failed
|
|
89
|
+
? `could not read the diff for \`${String(since)}\`, so nothing was compared: ${changed.reason ?? 'git failed'}`
|
|
90
|
+
: 'no changed files were given, so there was nothing to decide about',
|
|
91
|
+
changedFiles,
|
|
92
|
+
flowsRun: [],
|
|
93
|
+
unknownProvenance,
|
|
94
|
+
// Nothing was looked for, and the schema requires this field to say so. Omitting it made
|
|
95
|
+
// the MCP layer reject the whole response, turning an honest UNKNOWN into a protocol error.
|
|
96
|
+
measured: [],
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// The guard: an uncovered change is UNKNOWN. Reporting `yes` here would mean "your change is
|
|
100
|
+
// fine" on the strength of having run nothing at all.
|
|
101
|
+
if (0 === affected.length) {
|
|
102
|
+
return {
|
|
103
|
+
verified: Verified.UNKNOWN,
|
|
104
|
+
/*
|
|
105
|
+
* The way out named here has to be one the CALLER can take.
|
|
106
|
+
*
|
|
107
|
+
* This used to say "record one with reticle_record { action: start } then
|
|
108
|
+
* reticle_flow_save". Neither is advertised on the default surface, and that surface has
|
|
109
|
+
* no dispatch hatch — so the honest answer to "nothing covers this change" ended in two
|
|
110
|
+
* calls that come back "Tool not found". Driving is reachable from every surface, and a
|
|
111
|
+
* drive is captured as a flow automatically at teardown, so it is also the instruction
|
|
112
|
+
* that makes the NEXT change to these files replay instead of drive.
|
|
113
|
+
*/
|
|
114
|
+
because: `no saved flow covers ${1 === changedFiles.length ? 'this file' : 'these files'} — nothing ran, so nothing is proved. Drive it and prove it directly; the drive is saved as a flow, so the next change here replays instead`,
|
|
115
|
+
changedFiles,
|
|
116
|
+
flowsRun: [],
|
|
117
|
+
unknownProvenance,
|
|
118
|
+
// No flow ran, so nothing was measured — said explicitly rather than left undefined.
|
|
119
|
+
measured: [],
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
const provenanceNote = unknownProvenance.length > 0
|
|
123
|
+
? ` (${String(unknownProvenance.length)} of them re-run only because Reticle cannot tell which sources they cover)`
|
|
124
|
+
: '';
|
|
125
|
+
// Marked BEFORE the replay so the contradiction sweep afterwards reads exactly the window the
|
|
126
|
+
// flows produced, and never events from whatever the agent did before calling this.
|
|
127
|
+
const cursor = cursorBeforeReplay(deps, args);
|
|
128
|
+
const verify = FLOW_TOOLS.find((tool) => tool.name === ReticleTool.FLOW_VERIFY);
|
|
129
|
+
if (verify === undefined)
|
|
130
|
+
throw new Error('the whole-suite replay tool is not registered');
|
|
131
|
+
const suite = asRecord(await verify.handler(deps, {
|
|
132
|
+
names: affected,
|
|
133
|
+
...(asNumber(args['parallel']) === undefined ? {} : { parallel: args['parallel'] }),
|
|
134
|
+
...(asString(args['sessionId']) === undefined ? {} : { sessionId: args['sessionId'] }),
|
|
135
|
+
}));
|
|
136
|
+
const failed = suite.failed ?? 0;
|
|
137
|
+
const passed = suite.passed ?? 0;
|
|
138
|
+
// `unverifiable` is NOT a failure — the suite ran and proved nothing, which is the same fact
|
|
139
|
+
// this tool answers UNKNOWN for an uncovered change. Treating it as a red emitted a bug_found
|
|
140
|
+
// that nothing earned. See verify-change-verdict.
|
|
141
|
+
const verdict = verdictForSuite(String(suite.status), failed);
|
|
142
|
+
// A NO must be EARNED by a failing flow genuinely tied to the changed files. `affectedSavedFlows`
|
|
143
|
+
// re-runs any flow whose sources it cannot determine — over-running beats skipping — and those
|
|
144
|
+
// land in `unknownProvenance`. Judging the change on them produced a negative verdict whose own
|
|
145
|
+
// explanation admitted the evidence was not tied to the file. See attributed-failure.
|
|
146
|
+
const failingNames = Array.isArray(suite.failures)
|
|
147
|
+
? suite.failures
|
|
148
|
+
.map((f) => 'object' === typeof f && f !== null ? asString(asRecord(f)['flow']) : undefined)
|
|
149
|
+
.filter((n) => n !== undefined)
|
|
150
|
+
: // No per-failure detail: the failure is somewhere in the set that ran, so ask the question
|
|
151
|
+
// of all of them rather than guessing which.
|
|
152
|
+
affected;
|
|
153
|
+
const attributed = attributedFailures(failingNames, unknownProvenance);
|
|
154
|
+
const earnedNo = verdict === Verified.NO && attributed.length > 0;
|
|
155
|
+
const reported = verdict === Verified.NO && !earnedNo ? Verified.UNKNOWN : verdict;
|
|
156
|
+
if (reported !== Verified.YES) {
|
|
157
|
+
return {
|
|
158
|
+
verified: reported,
|
|
159
|
+
because: earnedNo
|
|
160
|
+
? `${String(failed)} of ${String(suite.total ?? affected.length)} covering flows failed, including ${attributed.join(', ')}, which cover the changed files${provenanceNote}`
|
|
161
|
+
: verdict === Verified.NO
|
|
162
|
+
? `flows failed, but Reticle cannot tell which sources any of them cover (${failingNames.join(', ')}) — so this says nothing about the files you changed. Re-record them so their sources are stamped, or read the replay yourself`
|
|
163
|
+
: `the covering flows ran but proved nothing (${String(suite.status)}) — they assert no observable consequence, so a green from them would not have meant your change is safe${provenanceNote}`,
|
|
164
|
+
changedFiles,
|
|
165
|
+
flowsRun: affected,
|
|
166
|
+
suite,
|
|
167
|
+
unknownProvenance,
|
|
168
|
+
measured: ['flows'],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// The suite went green. That is exactly when the remaining two channels are worth reading:
|
|
172
|
+
// a replay that passes while a write fails is the false green this whole product is about.
|
|
173
|
+
const extra = await inspectAfterReplay(deps, args, cursor);
|
|
174
|
+
const decidingContradictions = extra.contradictions.filter((c) => !isAdvisory(c.kind));
|
|
175
|
+
if (decidingContradictions.length > 0) {
|
|
176
|
+
const kinds = decidingContradictions.map((c) => c.kind).join(', ');
|
|
177
|
+
const earned = attributedFailures(affected, unknownProvenance).length > 0;
|
|
203
178
|
return {
|
|
204
|
-
verified: Verified.
|
|
205
|
-
because:
|
|
179
|
+
verified: earned ? Verified.NO : Verified.UNKNOWN,
|
|
180
|
+
because: earned
|
|
181
|
+
? `every covering flow passed, but channels disagreed during the replay (${kinds}) — a green suite over a failed write is the false green worth looking at${provenanceNote}`
|
|
182
|
+
: `channels disagreed during the replay (${kinds}), but Reticle cannot tell which sources any of the flows that ran cover (${affected.join(', ')}), so this says nothing about the files you changed. Drive the change directly; the drive is saved as a flow with its sources stamped`,
|
|
206
183
|
changedFiles,
|
|
207
184
|
flowsRun: affected,
|
|
208
185
|
suite,
|
|
209
186
|
unknownProvenance,
|
|
187
|
+
contradictions: extra.contradictions,
|
|
210
188
|
...(extra.untouched === undefined ? {} : { untouched: extra.untouched }),
|
|
211
189
|
measured: extra.measured,
|
|
212
190
|
};
|
|
213
|
-
}
|
|
191
|
+
}
|
|
192
|
+
// The mirror of `earnedNo`: a green from flows that ran only because their sources are unknown
|
|
193
|
+
// says nothing about these files either. At least one attributed flow has to have passed.
|
|
194
|
+
if (0 === attributedFailures(affected, unknownProvenance).length) {
|
|
195
|
+
return {
|
|
196
|
+
verified: Verified.UNKNOWN,
|
|
197
|
+
because: `the flows that ran passed, but Reticle cannot tell which sources any of them cover (${affected.join(', ')}), so this says nothing about the files you changed. Drive the change directly; the drive is saved as a flow with its sources stamped`,
|
|
198
|
+
changedFiles,
|
|
199
|
+
flowsRun: affected,
|
|
200
|
+
suite,
|
|
201
|
+
unknownProvenance,
|
|
202
|
+
...(0 === extra.contradictions.length ? {} : { contradictions: extra.contradictions }),
|
|
203
|
+
measured: extra.measured,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
return {
|
|
207
|
+
verified: Verified.YES,
|
|
208
|
+
because: `all ${String(passed)} flows covering these files passed${provenanceNote}${extra.untouched === undefined ? '' : `, with ${String(extra.untouched.length)} controls left undriven`}`,
|
|
209
|
+
changedFiles,
|
|
210
|
+
flowsRun: affected,
|
|
211
|
+
suite,
|
|
212
|
+
unknownProvenance,
|
|
213
|
+
...(0 === extra.contradictions.length ? {} : { contradictions: extra.contradictions }),
|
|
214
|
+
...(extra.untouched === undefined ? {} : { untouched: extra.untouched }),
|
|
215
|
+
measured: extra.measured,
|
|
216
|
+
};
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
/** Every answer carries the Reticle result block, under the verdict this tool decided. */
|
|
220
|
+
export const VERIFY_CHANGE_TOOLS = [
|
|
221
|
+
{
|
|
222
|
+
...VERIFY_CHANGE,
|
|
223
|
+
handler: async (deps, args, call) => changeResult(sessionRoot(deps, asString(args['sessionId'])), await VERIFY_CHANGE.handler(deps, args, call)),
|
|
214
224
|
},
|
|
215
225
|
];
|
|
216
226
|
/** The event cursor to sweep from, or 0 when there is no readable session (nothing to sweep). */
|
|
@@ -243,6 +253,7 @@ async function inspectAfterReplay(deps, args, cursor) {
|
|
|
243
253
|
currentEditEpoch: session.currentEditEpoch,
|
|
244
254
|
appOrigin: session.url,
|
|
245
255
|
background: session.background,
|
|
256
|
+
namedNetUrls: [],
|
|
246
257
|
// The replay is the action, and the cursor is where it started.
|
|
247
258
|
actionSince: cursor,
|
|
248
259
|
});
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* line there corrupts the client's stream.
|
|
15
15
|
*/
|
|
16
16
|
import { type ChromiumLaunchOptions } from './chromium-launch-options.js';
|
|
17
|
-
import { type ChromiumProbe } from './command/cli/doctor/browser/chromium-hint.js';
|
|
17
|
+
import { type ChromiumPathProblem, type ChromiumProbe } from './command/cli/doctor/browser/chromium-hint.js';
|
|
18
18
|
/** The installed-browser channels Playwright can drive in place of its own build. */
|
|
19
19
|
export declare const ChromiumChannel: {
|
|
20
20
|
readonly CHROME: "chrome";
|
|
@@ -31,6 +31,8 @@ export interface ChromiumTargetDeps {
|
|
|
31
31
|
/** Where the bundled playwright expects its Chromium build. */
|
|
32
32
|
executablePath: () => string;
|
|
33
33
|
exists: (path: string) => boolean;
|
|
34
|
+
/** What stops the executable RETICLE_CHROMIUM_PATH names from launching, if anything. */
|
|
35
|
+
pathProblem: (path: string) => ChromiumPathProblem | undefined;
|
|
34
36
|
platform: NodeJS.Platform;
|
|
35
37
|
env: NodeJS.ProcessEnv;
|
|
36
38
|
/** Run the pinned Chromium install; resolves true when it succeeded. */
|
|
@@ -38,16 +40,29 @@ export interface ChromiumTargetDeps {
|
|
|
38
40
|
/** A progress line for a human — stderr in production. */
|
|
39
41
|
announce: (line: string) => void;
|
|
40
42
|
}
|
|
41
|
-
/**
|
|
43
|
+
/**
|
|
44
|
+
* Which browser to launch: the bundled build (no channel), an installed channel, the executable
|
|
45
|
+
* RETICLE_CHROMIUM_PATH names, or none at all. `unusableConfigured` is a named executable that
|
|
46
|
+
* cannot be launched, and why.
|
|
47
|
+
*/
|
|
42
48
|
export type ChromiumTarget = {
|
|
43
49
|
found: true;
|
|
44
50
|
channel?: ChromiumChannel;
|
|
51
|
+
executablePath?: string;
|
|
45
52
|
} | {
|
|
46
53
|
found: false;
|
|
54
|
+
unusableConfigured?: {
|
|
55
|
+
path: string;
|
|
56
|
+
problem: ChromiumPathProblem;
|
|
57
|
+
};
|
|
47
58
|
};
|
|
48
59
|
/**
|
|
49
60
|
* Decide which browser a launch will use, installing the pinned Chromium only as the last resort.
|
|
50
|
-
* Order: bundled build on disk → installed Chrome → installed Edge →
|
|
61
|
+
* Order: RETICLE_CHROMIUM_PATH → bundled build on disk → installed Chrome → installed Edge →
|
|
62
|
+
* install, then bundled.
|
|
63
|
+
*
|
|
64
|
+
* A named executable ends the search either way. It is set on a machine where the usual places are
|
|
65
|
+
* empty or unusable, so falling back from a typo to a download would only hide the typo.
|
|
51
66
|
*/
|
|
52
67
|
export declare function resolveChromiumTarget(deps: ChromiumTargetDeps): Promise<ChromiumTarget>;
|
|
53
68
|
/** The subset of Playwright's `BrowserType` this file needs, so tests can pass a fake. */
|
|
@@ -67,14 +82,21 @@ export declare function announceOnce(write: (line: string) => void): (line: stri
|
|
|
67
82
|
* turns into the pinned install command, so the user still gets the one line that fixes it.
|
|
68
83
|
*/
|
|
69
84
|
export declare function launchChromium<B>(chromium: LaunchableChromium<B>, headless: boolean, deps?: ChromiumTargetDeps): Promise<B>;
|
|
85
|
+
/** What the probes read off the machine, injected so a test can name a browser that is not there. */
|
|
86
|
+
interface ProbeMachine {
|
|
87
|
+
env: NodeJS.ProcessEnv;
|
|
88
|
+
exists: (path: string) => boolean;
|
|
89
|
+
pathProblem: (path: string) => ChromiumPathProblem | undefined;
|
|
90
|
+
}
|
|
70
91
|
/**
|
|
71
92
|
* The lease preflight's probe: "can a launch succeed?", which now includes the Chrome/Edge fallback
|
|
72
93
|
* and the automatic install. Without this the preflight would refuse a lease on a machine the
|
|
73
94
|
* launcher itself could serve. Falls back to the plain probe so a real refusal keeps its evidence.
|
|
74
95
|
*/
|
|
75
|
-
export declare function probeLaunchableChromium(): Promise<ChromiumProbe>;
|
|
96
|
+
export declare function probeLaunchableChromium(machine?: ProbeMachine): Promise<ChromiumProbe>;
|
|
76
97
|
/**
|
|
77
98
|
* `doctor`'s probe: the plain Chromium probe, plus the installed browser that stands in when the
|
|
78
99
|
* bundled build is missing. Never installs — a diagnostic that downloads 150 MiB is not one.
|
|
79
100
|
*/
|
|
80
|
-
export declare function probeChromiumWithFallback(): Promise<ChromiumProbe>;
|
|
101
|
+
export declare function probeChromiumWithFallback(machine?: ProbeMachine): Promise<ChromiumProbe>;
|
|
102
|
+
export {};
|
package/dist/launch-chromium.js
CHANGED
|
@@ -18,7 +18,7 @@ import { existsSync } from 'node:fs';
|
|
|
18
18
|
import { createRequire } from 'node:module';
|
|
19
19
|
import { dirname, join } from 'node:path';
|
|
20
20
|
import { chromiumLaunchOptions } from './chromium-launch-options.js';
|
|
21
|
-
import { bundledPlaywrightVersion, chromiumInstallCommand, probeChromium, } from './command/cli/doctor/browser/chromium-hint.js';
|
|
21
|
+
import { bundledPlaywrightVersion, chromiumInstallCommand, chromiumPathProblem, configuredChromiumPath, configuredChromiumProbe, configuredChromiumRefusal, probeChromium, } from './command/cli/doctor/browser/chromium-hint.js';
|
|
22
22
|
/** The installed-browser channels Playwright can drive in place of its own build. */
|
|
23
23
|
export const ChromiumChannel = {
|
|
24
24
|
CHROME: 'chrome',
|
|
@@ -72,9 +72,20 @@ const installingLine = (command) => `[reticle] No Chromium, Chrome or Edge found
|
|
|
72
72
|
const INSTALL_FAILED_LINE = '[reticle] The Chromium install did not complete.\n';
|
|
73
73
|
/**
|
|
74
74
|
* Decide which browser a launch will use, installing the pinned Chromium only as the last resort.
|
|
75
|
-
* Order: bundled build on disk → installed Chrome → installed Edge →
|
|
75
|
+
* Order: RETICLE_CHROMIUM_PATH → bundled build on disk → installed Chrome → installed Edge →
|
|
76
|
+
* install, then bundled.
|
|
77
|
+
*
|
|
78
|
+
* A named executable ends the search either way. It is set on a machine where the usual places are
|
|
79
|
+
* empty or unusable, so falling back from a typo to a download would only hide the typo.
|
|
76
80
|
*/
|
|
77
81
|
export async function resolveChromiumTarget(deps) {
|
|
82
|
+
const configured = configuredChromiumPath(deps.env);
|
|
83
|
+
if (configured !== undefined) {
|
|
84
|
+
const problem = deps.pathProblem(configured);
|
|
85
|
+
return problem === undefined
|
|
86
|
+
? { found: true, executablePath: configured }
|
|
87
|
+
: { found: false, unusableConfigured: { path: configured, problem } };
|
|
88
|
+
}
|
|
78
89
|
let bundled;
|
|
79
90
|
try {
|
|
80
91
|
bundled = deps.executablePath();
|
|
@@ -168,6 +179,7 @@ function defaultDeps(chromium) {
|
|
|
168
179
|
return {
|
|
169
180
|
executablePath: () => chromium.executablePath(),
|
|
170
181
|
exists: existsSync,
|
|
182
|
+
pathProblem: (path) => chromiumPathProblem(path, process.platform),
|
|
171
183
|
platform: process.platform,
|
|
172
184
|
env: process.env,
|
|
173
185
|
install: installPinnedChromium,
|
|
@@ -181,15 +193,30 @@ function defaultDeps(chromium) {
|
|
|
181
193
|
*/
|
|
182
194
|
export async function launchChromium(chromium, headless, deps = defaultDeps(chromium)) {
|
|
183
195
|
const target = await resolveChromiumTarget(deps);
|
|
184
|
-
|
|
185
|
-
|
|
196
|
+
// Refused here rather than launched: Playwright's error for a missing executable is the one
|
|
197
|
+
// `chromiumLaunchHint` answers with the install command, which cannot fix a wrong path.
|
|
198
|
+
if (!target.found && target.unusableConfigured !== undefined) {
|
|
199
|
+
const { path, problem } = target.unusableConfigured;
|
|
200
|
+
throw new Error(configuredChromiumRefusal(path, problem));
|
|
201
|
+
}
|
|
202
|
+
return target.found
|
|
203
|
+
? chromium.launch(chromiumLaunchOptions(headless, target.channel, target.executablePath))
|
|
204
|
+
: chromium.launch(chromiumLaunchOptions(headless));
|
|
186
205
|
}
|
|
206
|
+
const THIS_MACHINE = {
|
|
207
|
+
env: process.env,
|
|
208
|
+
exists: existsSync,
|
|
209
|
+
pathProblem: (path) => chromiumPathProblem(path, process.platform),
|
|
210
|
+
};
|
|
187
211
|
/**
|
|
188
212
|
* The lease preflight's probe: "can a launch succeed?", which now includes the Chrome/Edge fallback
|
|
189
213
|
* and the automatic install. Without this the preflight would refuse a lease on a machine the
|
|
190
214
|
* launcher itself could serve. Falls back to the plain probe so a real refusal keeps its evidence.
|
|
191
215
|
*/
|
|
192
|
-
export async function probeLaunchableChromium() {
|
|
216
|
+
export async function probeLaunchableChromium(machine = THIS_MACHINE) {
|
|
217
|
+
const configured = configuredChromiumProbe(machine.env, machine.pathProblem);
|
|
218
|
+
if (configured !== undefined)
|
|
219
|
+
return configured;
|
|
193
220
|
try {
|
|
194
221
|
const { chromium } = await import('playwright');
|
|
195
222
|
const target = await resolveChromiumTarget(defaultDeps(chromium));
|
|
@@ -205,14 +232,17 @@ export async function probeLaunchableChromium() {
|
|
|
205
232
|
* `doctor`'s probe: the plain Chromium probe, plus the installed browser that stands in when the
|
|
206
233
|
* bundled build is missing. Never installs — a diagnostic that downloads 150 MiB is not one.
|
|
207
234
|
*/
|
|
208
|
-
export async function probeChromiumWithFallback() {
|
|
235
|
+
export async function probeChromiumWithFallback(machine = THIS_MACHINE) {
|
|
236
|
+
const configured = configuredChromiumProbe(machine.env, machine.pathProblem);
|
|
237
|
+
if (configured !== undefined)
|
|
238
|
+
return configured;
|
|
209
239
|
const probe = await probeChromium();
|
|
210
240
|
if (probe.exists)
|
|
211
241
|
return probe;
|
|
212
242
|
const channel = findInstalledChannel({
|
|
213
|
-
exists:
|
|
243
|
+
exists: machine.exists,
|
|
214
244
|
platform: process.platform,
|
|
215
|
-
env:
|
|
245
|
+
env: machine.env,
|
|
216
246
|
});
|
|
217
247
|
return channel === undefined ? probe : { ...probe, fallback: CHANNEL_LABEL[channel] };
|
|
218
248
|
}
|