@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
package/README.md
CHANGED
|
@@ -27,4 +27,4 @@ See the [main README](https://github.com/reticlehq/reticle).
|
|
|
27
27
|
|
|
28
28
|
## License
|
|
29
29
|
|
|
30
|
-
[FSL-1.1-ALv2](./LICENSE) (source-available: free for any use except reselling Reticle itself; converts to Apache-2.0 after two years). Files under `dist/ee/` are enterprise features covered by the [Reticle Enterprise License](./LICENSE-ENTERPRISE) — free for development, testing, and evaluation; a license key activates them in production.
|
|
30
|
+
[FSL-1.1-ALv2](./LICENSE) (source-available: free for any use except reselling Reticle itself; converts to Apache-2.0 after two years). Files under `dist/features/ee/` are enterprise features covered by the [Reticle Enterprise License](./LICENSE-ENTERPRISE) — free for development, testing, and evaluation; a license key activates them in production.
|
package/SKILL.md
CHANGED
|
@@ -1,183 +1,190 @@
|
|
|
1
1
|
# Reticle
|
|
2
2
|
|
|
3
|
-
Reticle
|
|
3
|
+
Reticle is the proof layer for AI coding agents. A dev-only SDK inside the user's running app exposes the DOM, network, routing, console and framework state to you as `reticle_*` MCP tools. You act on the real app and get a verdict: `yes`, `no`, or `unknown` (could not tell), with evidence and the `file:line` to open. No screenshots and no vision model: it drives the tab the user already has open.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Why it matters: an agent that reads its own diff cannot tell a working change from a silent `500`, a double submit, or a store that never committed. Reticle reads what the app actually DID. This file is everything you need; each section links the page with the detail.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
**How it fits together.** The SDK in the page (`@reticlehq/browser`, wired by `reticle init`, absent from production builds) dials a local daemon on `localhost:4400` with a pairing token. Your client reaches that daemon through `npx @reticlehq/server mcp`. Verdicts are computed by the daemon from what the page reported, never from your reasoning. Journeys you drive are saved under `.reticle/flows/` and replay later with no model. The optional platform (`app.reticle.sh`) adds a dashboard, run history and the Harness. Nothing from the app leaves the machine unless you link it; there is no tool that evaluates arbitrary JavaScript, and passwords, tokens and card numbers are `[REDACTED]` before you see them. Detail: `https://docs.reticle.sh/what-is-recorded.md`.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
## Your first action
|
|
10
10
|
|
|
11
|
-
**`reticle_*` tools visible?**
|
|
11
|
+
**`reticle_*` tools visible?** In the project, call `reticle_session { action: "list" }` and do its `next_action`. On a never-connected project that call runs `init` itself and lists what it changed under `wired`; tell the user. If it answers `run_init`, run this in the app's folder:
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
14
|
RETICLE_INSTALL_SOURCE=skill_file npx @reticlehq/server@latest init
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
**Not visible?** Hand the user one line
|
|
17
|
+
**Not visible?** Hand the user one line for a terminal, outside this client, and stop:
|
|
18
18
|
|
|
19
19
|
```bash
|
|
20
20
|
curl -fsSL https://raw.githubusercontent.com/reticlehq/reticle/main/install/install.sh | sh
|
|
21
21
|
irm https://raw.githubusercontent.com/reticlehq/reticle/main/install/install.ps1 | iex # Windows
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
It registers
|
|
24
|
+
It registers Reticle with every coding agent it finds and prints the next steps: restart the agent (a client loads MCP servers only at start, so a prompt cannot replace this command), then paste the prompt it printed. Do not register the server yourself and work around your client not having reloaded. If your client did register mid-session, `npx @reticlehq/server init --relaunch` prints the command that resumes this conversation with the tools.
|
|
25
25
|
|
|
26
|
-
`init`
|
|
26
|
+
**Done means a verdict.** `init` exiting 0, the tools appearing, a session listed: each proves wiring, not that anything works. Do not tell the user Reticle is set up until one real flow in their app returned a verdict.
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
2. **Confirm rather than assume:** `reticle_session { action: "list" }`. One session listed is the proof the SDK reached the page. An empty list carries a `why` that names which cause this is; read it before changing anything.
|
|
28
|
+
## The rules, every call
|
|
30
29
|
|
|
31
|
-
|
|
30
|
+
1. Only `verified: "yes"` passes. `"unknown"` (could not tell) and `"no-fault"` (nothing was declared) are not proved, never "failed" and never "working". `"no"` names what it found instead.
|
|
31
|
+
2. Name the consequence BEFORE acting: `reticle_act_and_wait { target, action, until }`. `durable: true` re-checks it after a reload.
|
|
32
|
+
3. Verdicts come only from `reticle_act_and_wait`, `reticle_assert`, `reticle_act { steps }` with an `expect`, and `reticle_verify` (`change`/`flows`). `look`, `navigate`, `observe` and a bare `act` prove nothing.
|
|
33
|
+
4. **Never weaken a check to make it pass.** On a `no`, read `expected` / `observed` / the nearest candidates, then fix the app or the target.
|
|
34
|
+
5. Target by `{ testid }`, `{ role, name }`, `{ label }` or `{ text }`; an ambiguous target is refused, a missing one says what is there.
|
|
35
|
+
6. Diagnosing a bug? Read the source first. Reticle proves what the app does, not why; drive to confirm a fix.
|
|
36
|
+
7. Write the text that you save (flow names, notes, feedback, plans) in ASD-STE100 Simplified Technical English: short sentences, active voice, one meaning for each word, no idioms.
|
|
32
37
|
|
|
33
|
-
|
|
34
|
-
reticle_verify { action: "explore", persona: "<the journey worth proving>" }
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Name the journey: Reticle can list the buttons, not which one matters. `explore` SAVES what it drove, so later runs replay with no model.
|
|
38
|
-
|
|
39
|
-
Everything between here and there is a rule the steps assume. Read it as you go, not before you act.
|
|
40
|
-
|
|
41
|
-
## Installed means a verdict was produced
|
|
42
|
-
|
|
43
|
-
**Setup is not complete until you have driven one real flow in the user's app and produced a verdict.** Writing config files is not installed. Every earlier point looks like success and is not:
|
|
44
|
-
|
|
45
|
-
- `init` exited 0. Wired, and connected. Nothing is PROVED: that is the first run.
|
|
46
|
-
- The `reticle_*` tools appeared. Your client can reach a daemon. The app is very likely still uninstrumented.
|
|
47
|
-
- A session is listed. The app dialled in. The user has still seen nothing happen.
|
|
48
|
-
|
|
49
|
-
**Do not tell the user Reticle is set up until a verdict exists.** The common failure is an agent that writes the config, reports success, and leaves an uninstrumented page. The command then exits non-zero: believe the exit code.
|
|
50
|
-
|
|
51
|
-
## Finish the setup steps
|
|
52
|
-
|
|
53
|
-
**Finish the setup steps; ask the user only when a step needs their decision.** Running `init`, fixing wiring it could not, starting the dev server and opening the browser are setup steps, not decisions.
|
|
54
|
-
|
|
55
|
-
The repo already answers which framework, package manager, port, editor or MCP client, so work those out rather than asking. Say what you did in one line.
|
|
56
|
-
|
|
57
|
-
Two places always need the user:
|
|
38
|
+
## The tools you have
|
|
58
39
|
|
|
59
|
-
1.
|
|
60
|
-
2. **Your host asks the human to approve a command.** That prompt belongs to the host. Never bypass or suppress it, and take a refusal as the answer. `init` writing a pre-approval rule for the `reticle` server is not that: it is a scoped, announced config change the human asked for by running the command, and it covers only Reticle's own tools.
|
|
40
|
+
The advertised surface is deliberately small (`default` 10, `all` 30 behind `RETICLE_ADVERTISE_ALL_TOOLS=1`). `reticle_tools` lists every registered tool, `reticle_tools { names: [...] }` loads its full arguments, and `reticle_run { tool, args }` calls any of them.
|
|
61
41
|
|
|
62
|
-
|
|
42
|
+
| Tool | Use it to | Key arguments |
|
|
43
|
+
| --- | --- | --- |
|
|
44
|
+
| `reticle_session` | list tabs, end, hand back, tune the HUD, report feedback | `action`: `list` `yield` `end` `tune` `feedback` `account` |
|
|
45
|
+
| `reticle_navigate` | go to a URL or reload | `url`, `reload`, `hard` |
|
|
46
|
+
| `reticle_look` | see the page, find refs, inspect one, read a store | `action`: `page` (`mode: "interactive"`) `find` `element` `state` |
|
|
47
|
+
| `reticle_act_and_wait` | act and prove the consequence in one call | `ref`/`target`, `action`, `args`, `until`, `durable`, `intent` |
|
|
48
|
+
| `reticle_act` | act without a verdict, or a whole journey as `steps` | `steps: [{ target, action, args, expect }]` |
|
|
49
|
+
| `reticle_assert` | prove a predicate `now`, or `wait` for one | `predicate`, `timeout_ms`, `since` |
|
|
50
|
+
| `reticle_observe` | what the app did since a cursor | `action`: `events` `network` `console`; `since` |
|
|
51
|
+
| `reticle_verify` | replay, coverage, Harness | `action`: `change` `flows` `affected` `coverage` `crawl` `explore` `mutate` `heal` |
|
|
52
|
+
| `reticle_tools` / `reticle_run` | everything else (below) | `names`; `tool`, `args` |
|
|
53
|
+
|
|
54
|
+
Actions: `click` `dblclick` `hover` `focus` `blur` `fill` `type` `clear` `select` `check` `uncheck` `submit` `press` `upload` `scrollIntoView` `scroll` `drag` `tap` `zoom`. `args`: `{ value }` for fill/select, `{ text: "Enter" }` for press, `{ toRef }` for drag, `{ path }` for upload, `{ native: true }` for a trusted click. A control whose label reads as destructive is refused until you pass `args.confirmDangerous: true`, and only do that when the user asked for it. Full reference: `https://docs.reticle.sh/actions.md`, `https://docs.reticle.sh/tools/overview.md`.
|
|
55
|
+
|
|
56
|
+
Beyond the advertised set, one hop each:
|
|
57
|
+
|
|
58
|
+
- `reticle_run({ tool: "reticle_screenshot" })`: pixels, when the look itself matters
|
|
59
|
+
- `reticle_run({ tool: "reticle_network_mock", args: { mocks } })`: stub or fail a request
|
|
60
|
+
- `reticle_run({ tool: "reticle_clock", args: { freeze: true } })`: freeze, then `advanceMs`, timers
|
|
61
|
+
- `reticle_run({ tool: "reticle_storage" })`: localStorage, sessionStorage, readable cookies
|
|
62
|
+
- `reticle_run({ tool: "reticle_viewport", args: { width, height } })`: a fixed size
|
|
63
|
+
- `reticle_run({ tool: "reticle_lease", args: { action: "acquire" } })`: an isolated headless tab
|
|
64
|
+
- `reticle_run({ tool: "reticle_context" })`: what this run already established, after a compaction
|
|
65
|
+
|
|
66
|
+
## Predicates
|
|
67
|
+
|
|
68
|
+
Every `until`, `predicate` and `expect` is `{ kind, ...fields }`; unknown fields are refused, so nothing silently passes.
|
|
69
|
+
|
|
70
|
+
| kind | fields |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `element` | `query: { testid \| role+name \| text \| label \| placeholder \| alt \| component, scope? }`, `state?`: `visible` `hidden` `enabled` `disabled` `checked` `expanded` `pressed` `focused` `present` `inViewport`, `absent?` |
|
|
73
|
+
| `text` | `contains`, `scope?`, `visible?`, `absent?`, `ignoreCase?`, `satisfies?` |
|
|
74
|
+
| `net` | `method`, `urlContains`, `status`, `ok`, `count` (exact: catches a double submit), `bodyContains`, `bodyMatches`, `requestBodyMatches`, `repeatable` |
|
|
75
|
+
| `route` | `pathname` or `contains` |
|
|
76
|
+
| `signal` | `name`, `dataMatches?`, `count?` |
|
|
77
|
+
| `state` | `store`, `path`, `equals` or `satisfies` |
|
|
78
|
+
| `console` | `level`, `contains?`, `absent?` |
|
|
79
|
+
| `settled` / `animation` / `compare` | `quietMs` / `name`, `completed` / `left`, `right`, `as` |
|
|
80
|
+
| `allOf` / `anyOf` / `not` | `predicates: [...]` / `predicates: [...]` / `predicate` |
|
|
81
|
+
|
|
82
|
+
`satisfies` asserts a property when the exact value varies: `nonEmpty`, `oneOf`, `withinTolerance`, `matchesPattern`, `type`, `changed`, `unchanged`, `increased`, `decreased`. Composites hold only predicates: `absent` belongs inside a child, and an `element` takes a `query`, never a `ref`. A bare `route` or `state` is already true before the action and proves nothing; pair it with what the action causes. Grammar: `https://docs.reticle.sh/predicates.md`.
|
|
63
83
|
|
|
64
84
|
## Feedback is first-class
|
|
65
85
|
|
|
66
|
-
Reticle is built for agents
|
|
67
|
-
|
|
68
|
-
The moment Reticle breaks, lies, cannot see something you needed, costs too many calls, or gives you trouble during setup:
|
|
86
|
+
Reticle is built for agents, so your experience decides what gets fixed, and it is lost when your context is. The moment Reticle broke, lied, could not see something, cost too many calls, or setup gave you trouble, file it and carry on:
|
|
69
87
|
|
|
70
88
|
```
|
|
71
89
|
reticle_session { action: "feedback", kind, text }
|
|
72
90
|
```
|
|
73
91
|
|
|
74
|
-
`kind
|
|
75
|
-
|
|
76
|
-
```bash
|
|
77
|
-
npx @reticlehq/server feedback --agent --kind <kind> "what happened"
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
Nothing is too minor. Report defects in **Reticle**; a bug in the app under test is Reticle working, and belongs in your answer. Never put app source, secrets, or user data in a report.
|
|
81
|
-
|
|
82
|
-
## Do not re-read this file to look something up
|
|
83
|
-
|
|
84
|
-
Fetch the one page that answers the question instead. **Appending `.md` to any docs URL returns its source with no site chrome.**
|
|
85
|
-
|
|
86
|
-
```bash
|
|
87
|
-
curl https://docs.reticle.sh/llms.txt # every page title and URL; read this first
|
|
88
|
-
curl https://docs.reticle.sh/frameworks.md # per-framework SDK wiring
|
|
89
|
-
curl https://docs.reticle.sh/troubleshooting.md # nothing connected, click did nothing, verdict unknown
|
|
90
|
-
curl https://docs.reticle.sh/agent-cheatsheet.md # the verify loop on one screen
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
Every page arrives with the rules that matter prepended, so one fetch orients you.
|
|
94
|
-
|
|
95
|
-
## Which path am I on
|
|
96
|
-
|
|
97
|
-
You do not have to decide. `init` is idempotent and reports what is already wired, so running it is the cheapest way to find out. It never drives; the first run is yours to start.
|
|
98
|
-
|
|
99
|
-
Read **VERIFY** below when the question is "does this still work?" rather than "is this set up?". If `reticle_session` returns an empty list on a project that is already wired, read `docs/troubleshooting.mdx` beside this file (no network call, which matters when something is already not working), or fetch `https://docs.reticle.sh/troubleshooting.md`; do not restart setup.
|
|
92
|
+
`kind`: `bug`, `gap`, `ambiguity`, `feature_request`, `improvement`, `experience`. Tools unreachable? `npx @reticlehq/server feedback --agent --kind <kind> "what happened"`. A bug in the app under test is Reticle working: it belongs in your answer. Never put app source, secrets or user data in a report.
|
|
100
93
|
|
|
101
94
|
---
|
|
102
95
|
|
|
103
96
|
# SETUP
|
|
104
97
|
|
|
105
|
-
|
|
98
|
+
Two places always need the user:
|
|
106
99
|
|
|
107
|
-
|
|
100
|
+
1. **No recognisable dev script in `package.json`.** Say so; do not invent one.
|
|
101
|
+
2. **Your host asks the human to approve a command.** That prompt belongs to the host. Never bypass or suppress it, and take a refusal as the answer. `init` writing a pre-approval rule for the `reticle` server is not that: it is a scoped, announced config change the human asked for by running the command, and it covers only Reticle's own tools.
|
|
108
102
|
|
|
109
|
-
|
|
103
|
+
Everything else (running `init`, starting the dev server, opening the browser) is a setup step, not a decision. A dev server that was running when `init` ran must be restarted once. When `init` cannot finish alone, read `docs/skill-setup.md`, which ships beside this file (`https://docs.reticle.sh/skill-setup.md`).
|
|
110
104
|
|
|
111
105
|
# VERIFY
|
|
112
106
|
|
|
113
|
-
**Verdicts come from `reticle_act_and_wait`, `reticle_assert`, and `reticle_act { steps }` when a step declares `expect`** (plus `reticle_verify` replays). Everything else (a bare `act`, `look`, `navigate`, `observe`) moves or reads the app and proves nothing. A drive that ends without a verdict has no result, however many tools it used.
|
|
114
|
-
|
|
115
|
-
A verdict of `verified: "unknown"` is not a pass. It means Reticle drove the app and could not tell what happened. Report it as unknown. `verified: "no-fault"` is not a pass either. It means the page settled and no channel reported a problem, but nothing was declared to prove, so assert a consequence the action CHANGES. **Never weaken a check to make it pass.**
|
|
116
|
-
|
|
117
107
|
## Take the cheapest path that answers the question
|
|
118
108
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
| The question | The call | Calls |
|
|
122
|
-
| --- | --- | --- |
|
|
123
|
-
| "Did my edit break anything?" | `reticle_verify({ action: "change", files: ["src/App.tsx"] })` | 1 |
|
|
124
|
-
| "Does every saved journey still work?" | `reticle_verify({ action: "flows" })` | 1 |
|
|
125
|
-
| "Does this new behaviour work?" | `reticle_act_and_wait` on the step that ENDS the journey | 1+ |
|
|
126
|
-
| No MCP available at all | `npx @reticlehq/server verify <url>`, then `gate --since HEAD~1` (below); `verify` has no `--since` | 2, no MCP |
|
|
127
|
-
|
|
128
|
-
Replay before you drive: a covered journey re-verifies for a few hundred tokens, and driving it costs tens of thousands.
|
|
109
|
+
Stop at the first row that fits. Replaying a saved journey costs a few hundred tokens; driving it again costs tens of thousands.
|
|
129
110
|
|
|
130
|
-
|
|
111
|
+
| The question | The call |
|
|
112
|
+
| --- | --- |
|
|
113
|
+
| "Did my edit break anything?" | `reticle_verify { action: "change", files: ["src/App.tsx"] }` |
|
|
114
|
+
| "Does every saved journey still work?" | `reticle_verify { action: "flows" }` |
|
|
115
|
+
| "Does this new behaviour work?" | `reticle_act_and_wait` on the step that ENDS the journey |
|
|
116
|
+
| No MCP at all | `npx @reticlehq/server verify <url> --expect '<predicate JSON>'` |
|
|
131
117
|
|
|
132
|
-
|
|
118
|
+
`change` answers `unknown` when no saved flow covers your files: nothing ran, so drive it yourself and never read it as a pass. A locator that was renamed rather than broken: `{ action: "heal" }` rebinds it, re-proving the saved consequence first.
|
|
133
119
|
|
|
134
|
-
|
|
120
|
+
## Drive it by hand
|
|
135
121
|
|
|
136
122
|
```
|
|
137
|
-
|
|
123
|
+
reticle_session() // connected? empty: read `why`, it names the fix
|
|
124
|
+
reticle_look({ action: "page", mode: "interactive" }) // the controls, with refs
|
|
125
|
+
reticle_act_and_wait({ target: { testid: "pay" }, action: "click", until: { kind: "allOf", predicates: [
|
|
126
|
+
{ kind: "net", method: "POST", urlContains: "/api/order", status: 200, count: 1 },
|
|
127
|
+
{ kind: "element", query: { role: "dialog", name: "Order confirmed" }, state: "visible" },
|
|
128
|
+
{ kind: "console", level: "error", absent: true },
|
|
129
|
+
]}}) // the verdict
|
|
138
130
|
```
|
|
139
131
|
|
|
140
|
-
|
|
132
|
+
A journey in one call: `reticle_act { steps: [{ target, action, args?, expect? }] }`; the last `expect` is the end state. Refs (`e42`) die when their element re-renders: re-find by `target` rather than retrying a ref. Declare what a change is meant to make true with `intent` on the verdict call, so it is checked against more than itself.
|
|
141
133
|
|
|
142
|
-
|
|
143
|
-
reticle_act_and_wait({ ref: "e42", action: "click", until: { kind: "signal", name: "checkin:sent" }, intent: "clicking Send check-in makes the badge read 'checked in'" })
|
|
144
|
-
```
|
|
134
|
+
**Saved automatically.** When the session ends, what you drove is saved as a flow if at least one step declared a consequence; a bare `act` replays as a click that passes even when the feature is broken. Name it yourself: `reticle_run({ tool: "reticle_record", args: { action: "start", name } })`, drive, then `reticle_run({ tool: "reticle_flow_save", args: { name } })`. Flows: `https://docs.reticle.sh/flows.md`.
|
|
145
135
|
|
|
146
|
-
The
|
|
136
|
+
## The Harness: let Reticle drive
|
|
147
137
|
|
|
148
|
-
|
|
138
|
+
The Harness drives the app for you through the same tools, decides on the Reticle platform, records what it drove as flows, and answers in a few lines instead of a context full of snapshots. It spends credits (`reticle connect` signs in and grants free ones) and unlocks at 80% instrumentation:
|
|
149
139
|
|
|
150
|
-
|
|
140
|
+
```
|
|
141
|
+
reticle_verify { action: "explore", persona: "a returning customer checking out" }
|
|
142
|
+
```
|
|
151
143
|
|
|
152
|
-
|
|
144
|
+
It answers within `wait` seconds, or `{ status: "running", runId }`: poll `reticle_verify { action: "explore", runId }`, never start a second. Without the Harness you drive with the calls above; everything else works the same.
|
|
153
145
|
|
|
154
|
-
|
|
146
|
+
**Instrumentation**, which `reticle doctor` and the HUD score with a fix per gap: the page connected, DOM actions, network, console (all from `init`); `file:line` source mapping (keep the build plugin `init` added); `data-testid` on every control a flow uses; app state via `registerStore(name, store)` from `@reticlehq/browser`, passing the store rather than a getter; and `reticle.signal("order:placed", { id })` once each user-visible outcome commits. List them in `registerCapabilities` in the `reticle-dev` file `init` wrote. Detail: `https://docs.reticle.sh/instrumentation.md`.
|
|
155
147
|
|
|
156
|
-
|
|
148
|
+
## When it goes wrong
|
|
157
149
|
|
|
158
|
-
|
|
150
|
+
| You see | Do |
|
|
151
|
+
| --- | --- |
|
|
152
|
+
| no session | `reticle_session { action: "list" }` and its `next_action`; restart a dev server that predates `init` |
|
|
153
|
+
| target matched no element | `reticle_look { action: "page" }`, then target what is really there |
|
|
154
|
+
| ref no longer resolves | the DOM re-rendered: target by `testid` or `role`+`name` |
|
|
155
|
+
| predicate did not parse | it names the field: fix the shape against the table above |
|
|
156
|
+
| destructive action blocked | `args.confirmDangerous: true`, only if the user wants that press |
|
|
157
|
+
| version skew | `npx @reticlehq/server stop`, then retry |
|
|
158
|
+
| port held by a non-Reticle process | stop that process, or run Reticle on another `--port` |
|
|
159
159
|
|
|
160
|
-
|
|
160
|
+
More: `https://docs.reticle.sh/troubleshooting.md`.
|
|
161
161
|
|
|
162
|
-
|
|
163
|
-
reticle_session() // connected? if empty, read `why` — it names the fix
|
|
164
|
-
reticle_look({ sessionId, action: "page" }) // just the controls, with refs
|
|
165
|
-
reticle_act_and_wait({ sessionId, ref, action: "click", until: { kind: "allOf", predicates: [
|
|
166
|
-
{ kind: "net", urlContains: "/api/...", status: 200 },
|
|
167
|
-
{ kind: "element", query: { testid: "..." } },
|
|
168
|
-
{ kind: "console", level: "error", absent: true },
|
|
169
|
-
]}}) // ← the verdict
|
|
170
|
-
```
|
|
162
|
+
## The CLI, for humans and CI
|
|
171
163
|
|
|
172
|
-
|
|
164
|
+
Every command works as `npx @reticlehq/server <command>`; once installed, `reticle <command>`. Never npx the bare name `reticle`: that is somebody else's package.
|
|
173
165
|
|
|
174
|
-
|
|
166
|
+
| Command | Does |
|
|
167
|
+
| --- | --- |
|
|
168
|
+
| `init` | wire this app, boot it, prove a page connected (`--dry-run`, `--app <dir>`, `--relaunch`) |
|
|
169
|
+
| `status` / `doctor` | is it running and connected / what is wrong and what coverage is missing |
|
|
170
|
+
| `verify <url>` | replay saved flows; `--expect '<json>'` for one verdict; `--results-json <file>` for CI |
|
|
171
|
+
| `gate --since HEAD~1` | fail unless passing runs cover every saved flow your edit affects |
|
|
172
|
+
| `connect` | sign in and link this project to the dashboard; runs sync from then on |
|
|
173
|
+
| `try <url>` | watch the Harness drive a URL once (signed in) |
|
|
174
|
+
| `stop` / `restart` | stop or restart the daemon |
|
|
175
175
|
|
|
176
|
-
|
|
177
|
-
- The complete tool surface: `https://docs.reticle.sh/usage.md`
|
|
176
|
+
Reference: `https://docs.reticle.sh/cli.md`, `https://docs.reticle.sh/cli/cloud.md`.
|
|
178
177
|
|
|
179
178
|
## When the verdict lands
|
|
180
179
|
|
|
181
|
-
|
|
180
|
+
Paste the `reticleResult` block from `reticle_verify` or `reticle_session { action: "end" }` verbatim, last line included, and never reword its verdict into a pass. Add the `file:line` for anything broken. If Reticle caught what reading the code missed, say Reticle found it. Before you stop driving, `reticle_session { action: "yield" }` hands the tab back to the human.
|
|
181
|
+
|
|
182
|
+
## Find the rest
|
|
183
|
+
|
|
184
|
+
Append `.md` to any docs URL for the source without site chrome; `https://docs.reticle.sh/llms.txt` lists every page.
|
|
182
185
|
|
|
183
|
-
|
|
186
|
+
- Learn: `quickstart.md`, `what-is-reticle.md`, `use-cases.md` (security, accessibility, performance, SEO, personas), `vs-playwright-mcp.md`, `benchmarks.md`
|
|
187
|
+
- Wire: `frameworks.md`, `install-manual.md`, `state-management.md`, `desktop.md` (Electron, Tauri)
|
|
188
|
+
- Verify: `agent-cheatsheet.md`, `testing.md`, `deploy-checks.md`, `capabilities.md`
|
|
189
|
+
- Teams and agents: `multi-agent-testing.md`, `human-control.md`, `http-transport.md`, `platform-integration.md`
|
|
190
|
+
- Trust: `what-is-recorded.md`, `telemetry.md`
|
|
@@ -22,9 +22,11 @@ export interface ChromiumLaunchOptions {
|
|
|
22
22
|
args: string[];
|
|
23
23
|
/** An installed Chrome/Edge to drive instead of Playwright's own build; absent = the bundled one. */
|
|
24
24
|
channel?: string;
|
|
25
|
+
/** A Chromium executable to launch directly, from RETICLE_CHROMIUM_PATH. */
|
|
26
|
+
executablePath?: string;
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Build the launch options for a headless or headed Chromium. Pure; returns a fresh mutable array
|
|
28
30
|
* each call so no caller can mutate the constant behind everyone else's back.
|
|
29
31
|
*/
|
|
30
|
-
export declare function chromiumLaunchOptions(headless: boolean, channel?: string): ChromiumLaunchOptions;
|
|
32
|
+
export declare function chromiumLaunchOptions(headless: boolean, channel?: string, executablePath?: string): ChromiumLaunchOptions;
|
|
@@ -24,10 +24,11 @@ export const CHROMIUM_ANTI_THROTTLING_ARGS = [
|
|
|
24
24
|
* Build the launch options for a headless or headed Chromium. Pure; returns a fresh mutable array
|
|
25
25
|
* each call so no caller can mutate the constant behind everyone else's back.
|
|
26
26
|
*/
|
|
27
|
-
export function chromiumLaunchOptions(headless, channel) {
|
|
27
|
+
export function chromiumLaunchOptions(headless, channel, executablePath) {
|
|
28
28
|
return {
|
|
29
29
|
headless,
|
|
30
30
|
args: [...CHROMIUM_ANTI_THROTTLING_ARGS],
|
|
31
31
|
...(channel === undefined ? {} : { channel }),
|
|
32
|
+
...(executablePath === undefined ? {} : { executablePath }),
|
|
32
33
|
};
|
|
33
34
|
}
|
|
@@ -5,9 +5,21 @@ export interface AdhocSuiteOptions {
|
|
|
5
5
|
select?: string[];
|
|
6
6
|
/** Which connected tab to drive. Omitted means "whatever is connected". */
|
|
7
7
|
sessionId?: string;
|
|
8
|
+
/** Acknowledge the replay guard's destructive steps for this run only. */
|
|
9
|
+
confirmDangerous?: boolean;
|
|
8
10
|
token?: string;
|
|
9
11
|
/** Injected so a test does not need a live daemon. */
|
|
10
12
|
connect?: (endpoint: URL) => Promise<ToolCaller>;
|
|
13
|
+
/**
|
|
14
|
+
* The url `reticle verify` was given, and the tabs the daemon has: with no tab on its origin, the
|
|
15
|
+
* suite runs in a Reticle browser opened at it. It answered "no browser session connected" instead.
|
|
16
|
+
*/
|
|
17
|
+
url?: string;
|
|
18
|
+
sessions?: () => Promise<readonly {
|
|
19
|
+
url: string;
|
|
20
|
+
}[]>;
|
|
21
|
+
/** The caller's project `.reticle`: a lease opened here writes its runs there. */
|
|
22
|
+
root?: string;
|
|
11
23
|
}
|
|
12
24
|
/**
|
|
13
25
|
* Run the saved suite through the daemon on this port.
|
|
@@ -29,6 +41,8 @@ export interface AdhocExploreOptions {
|
|
|
29
41
|
sessions: () => Promise<readonly {
|
|
30
42
|
url: string;
|
|
31
43
|
}[]>;
|
|
44
|
+
/** The caller's project `.reticle`: a lease opened here writes its runs there. */
|
|
45
|
+
root?: string;
|
|
32
46
|
}
|
|
33
47
|
/**
|
|
34
48
|
* `verify <url> --explore` against the daemon that already owns the port: open the url, let the
|
|
@@ -14,12 +14,14 @@
|
|
|
14
14
|
* ask it, over the transport `start()` already attaches unconditionally. Nothing is bound, nothing
|
|
15
15
|
* is stopped, the agent keeps its link.
|
|
16
16
|
*/
|
|
17
|
+
import { CALL_SECRETS_ARG } from '../../surface/tools/tool-kit.js';
|
|
17
18
|
import { ReticleTool } from '@reticlehq/core';
|
|
18
|
-
import {
|
|
19
|
+
import { cutOffReason } from '../../surface/tools/harness-explore.js';
|
|
20
|
+
import { KEY_REFUSED_HEAD, RESULT_FIELD } from '../../surface/tools/reticle-result.js';
|
|
21
|
+
import { connectOverSse, endpointFor, exploreToEnd, leaseIfNoTab, releaseLease, refusalText, verdictOf, } from './adhoc-verdict.js';
|
|
19
22
|
/** The only status that is a pass. `unverifiable` means nothing was checked, which is not one. */
|
|
20
23
|
const PASSED = 'pass';
|
|
21
24
|
/** The `reticle_verify` actions this file asks for. */
|
|
22
|
-
const EXPLORE_ACTION = 'explore';
|
|
23
25
|
/**
|
|
24
26
|
* How long a SUITE may take, against the SDK's 60s default for one request.
|
|
25
27
|
*
|
|
@@ -53,8 +55,19 @@ export async function runAdhocSuite(options) {
|
|
|
53
55
|
],
|
|
54
56
|
};
|
|
55
57
|
}
|
|
58
|
+
let leased;
|
|
56
59
|
try {
|
|
57
|
-
|
|
60
|
+
const url = options.url !== undefined && 0 < options.url.length ? options.url : undefined;
|
|
61
|
+
if (url !== undefined && options.sessionId === undefined && options.sessions !== undefined) {
|
|
62
|
+
const opened = await leaseIfNoTab(caller, url, options.sessions, options.root);
|
|
63
|
+
if ('failed' in opened)
|
|
64
|
+
return { code: 1, lines: ['status: unverifiable', ...opened.failed] };
|
|
65
|
+
leased = opened.leased;
|
|
66
|
+
}
|
|
67
|
+
return await replaySuite(caller, {
|
|
68
|
+
...options,
|
|
69
|
+
...(leased === undefined ? {} : { sessionId: leased }),
|
|
70
|
+
});
|
|
58
71
|
}
|
|
59
72
|
catch (error) {
|
|
60
73
|
return {
|
|
@@ -65,9 +78,20 @@ export async function runAdhocSuite(options) {
|
|
|
65
78
|
};
|
|
66
79
|
}
|
|
67
80
|
finally {
|
|
81
|
+
if (leased !== undefined)
|
|
82
|
+
await releaseLease(caller, leased);
|
|
68
83
|
await caller.close().catch(() => undefined);
|
|
69
84
|
}
|
|
70
85
|
}
|
|
86
|
+
/** This command's `RETICLE_SECRET_*` values, as the per-call `secrets` argument; none, no field. */
|
|
87
|
+
function secretsArg(env) {
|
|
88
|
+
const secrets = Object.fromEntries(Object.entries(env).filter((entry) => entry[0].startsWith(SECRET_ENV_PREFIX) &&
|
|
89
|
+
'string' === typeof entry[1] &&
|
|
90
|
+
0 < entry[1].length));
|
|
91
|
+
return 0 === Object.keys(secrets).length ? {} : { [CALL_SECRETS_ARG]: secrets };
|
|
92
|
+
}
|
|
93
|
+
/** The prefix of a variable holding one redacted field's value. */
|
|
94
|
+
const SECRET_ENV_PREFIX = 'RETICLE_SECRET_';
|
|
71
95
|
/** The saved suite through an open connection, as a verdict. Shared by the suite and explore paths. */
|
|
72
96
|
async function replaySuite(caller, options) {
|
|
73
97
|
// Spread rather than set: an explicit `undefined` is a key the tools reject as an unknown
|
|
@@ -76,6 +100,10 @@ async function replaySuite(caller, options) {
|
|
|
76
100
|
action: 'flows',
|
|
77
101
|
...(options.select === undefined ? {} : { select: options.select }),
|
|
78
102
|
...(options.sessionId === undefined ? {} : { sessionId: options.sessionId }),
|
|
103
|
+
...(true === options.confirmDangerous ? { confirmDangerous: true } : {}),
|
|
104
|
+
// The running daemon's environment is not this command's: the secrets a CI step set for
|
|
105
|
+
// `reticle verify` go with the call, for this call only.
|
|
106
|
+
...secretsArg(process.env),
|
|
79
107
|
}, SUITE_TIMEOUT_MS);
|
|
80
108
|
const refusal = refusalText(result);
|
|
81
109
|
if (refusal !== undefined)
|
|
@@ -83,11 +111,16 @@ async function replaySuite(caller, options) {
|
|
|
83
111
|
const report = verdictOf(result, 'status');
|
|
84
112
|
const status = 'string' === typeof report?.['status'] ? report['status'] : 'unverifiable';
|
|
85
113
|
const summary = 'string' === typeof report?.['summary'] ? report['summary'] : undefined;
|
|
114
|
+
// Its last line says where the run lives (dashboard link, or kept on this machine only).
|
|
115
|
+
const block = 'string' === typeof report?.[RESULT_FIELD] ? report[RESULT_FIELD] : undefined;
|
|
116
|
+
// A pass the platform will never see is not a green CI step: its key was refused.
|
|
117
|
+
const refusedKey = true === block?.includes(`- ${KEY_REFUSED_HEAD}`);
|
|
86
118
|
return {
|
|
87
|
-
code: PASSED === status ? 0 : 1,
|
|
119
|
+
code: PASSED === status && !refusedKey ? 0 : 1,
|
|
88
120
|
lines: [
|
|
89
121
|
`status: ${status}`,
|
|
90
122
|
...(summary === undefined ? [] : [summary]),
|
|
123
|
+
...(block === undefined ? [] : [block]),
|
|
91
124
|
JSON.stringify(report ?? result, null, 2),
|
|
92
125
|
],
|
|
93
126
|
};
|
|
@@ -116,13 +149,12 @@ export async function runAdhocExplore(options) {
|
|
|
116
149
|
}
|
|
117
150
|
let leased;
|
|
118
151
|
try {
|
|
119
|
-
const opened = await leaseIfNoTab(caller, options.url, options.sessions);
|
|
152
|
+
const opened = await leaseIfNoTab(caller, options.url, options.sessions, options.root);
|
|
120
153
|
if ('failed' in opened)
|
|
121
154
|
return { code: 1, lines: ['status: unverifiable', ...opened.failed] };
|
|
122
155
|
leased = opened.leased;
|
|
123
156
|
const pin = leased === undefined ? {} : { sessionId: leased };
|
|
124
|
-
const drove = await caller
|
|
125
|
-
action: EXPLORE_ACTION,
|
|
157
|
+
const drove = await exploreToEnd(caller, {
|
|
126
158
|
...(options.persona === undefined ? {} : { persona: options.persona }),
|
|
127
159
|
...pin,
|
|
128
160
|
}, SUITE_TIMEOUT_MS);
|
|
@@ -137,6 +169,9 @@ export async function runAdhocExplore(options) {
|
|
|
137
169
|
...(summary === undefined ? [] : [summary]),
|
|
138
170
|
...(note === undefined ? [] : [note]),
|
|
139
171
|
];
|
|
172
|
+
const cut = cutOffReason(report ?? {});
|
|
173
|
+
if (cut !== undefined)
|
|
174
|
+
return { code: 1, lines: ['status: unverifiable', ...drive, cut] };
|
|
140
175
|
// A drive that left nothing to replay proved nothing, however long it ran.
|
|
141
176
|
if (0 === recorded.length)
|
|
142
177
|
return { code: 1, lines: ['status: unverifiable', ...drive] };
|
|
@@ -46,6 +46,8 @@ interface AdhocVerdictOptions {
|
|
|
46
46
|
*/
|
|
47
47
|
sessionId?: string;
|
|
48
48
|
token?: string;
|
|
49
|
+
/** The caller's project `.reticle`: a lease opened here writes its runs there. */
|
|
50
|
+
root?: string;
|
|
49
51
|
/** Injected so a test does not need a live daemon. */
|
|
50
52
|
connect?: (endpoint: URL) => Promise<ToolCaller>;
|
|
51
53
|
/**
|
|
@@ -55,6 +57,7 @@ interface AdhocVerdictOptions {
|
|
|
55
57
|
*/
|
|
56
58
|
sessions?: () => Promise<readonly {
|
|
57
59
|
url: string;
|
|
60
|
+
sessionId?: string;
|
|
58
61
|
}[]>;
|
|
59
62
|
}
|
|
60
63
|
/**
|
|
@@ -66,7 +69,9 @@ interface AdhocVerdictOptions {
|
|
|
66
69
|
*/
|
|
67
70
|
export declare function leaseIfNoTab(caller: ToolCaller, url: string, sessions: () => Promise<readonly {
|
|
68
71
|
url: string;
|
|
69
|
-
}[]
|
|
72
|
+
}[]>,
|
|
73
|
+
/** The caller's project `.reticle`, so the lease's runs land where this command looks. */
|
|
74
|
+
root?: string): Promise<{
|
|
70
75
|
leased?: string;
|
|
71
76
|
alreadyAt?: boolean;
|
|
72
77
|
} | {
|
|
@@ -77,8 +82,13 @@ export declare function leaseIfNoTab(caller: ToolCaller, url: string, sessions:
|
|
|
77
82
|
* caller hands to `releaseLease`; `{ failed }` is the lease's own refusal, as lines to print.
|
|
78
83
|
* `init`'s connect proof on a machine with no system browser takes this path directly.
|
|
79
84
|
*/
|
|
80
|
-
export declare function acquireLease(caller: ToolCaller, url: string
|
|
85
|
+
export declare function acquireLease(caller: ToolCaller, url: string,
|
|
86
|
+
/** Open it in a window somebody can watch, whatever the daemon was started as. */
|
|
87
|
+
headed?: boolean,
|
|
88
|
+
/** The `.reticle` the lease's runs belong in: the caller's project, not wherever the page resolves. */
|
|
89
|
+
root?: string): Promise<{
|
|
81
90
|
leased: string;
|
|
91
|
+
zeroInstall: boolean;
|
|
82
92
|
} | {
|
|
83
93
|
failed: string[];
|
|
84
94
|
}>;
|
|
@@ -117,4 +127,11 @@ export declare function refusalText(result: unknown): string | undefined;
|
|
|
117
127
|
* this whole product exists to prevent.
|
|
118
128
|
*/
|
|
119
129
|
export declare function runAdhocVerdict(options: AdhocVerdictOptions): Promise<AdhocVerdict>;
|
|
130
|
+
/**
|
|
131
|
+
* One Harness drive through the daemon, polled to its end or until `budgetMs` runs out.
|
|
132
|
+
*
|
|
133
|
+
* An explore answers `{ status: "running", runId }` when its drive outlasts the call's wait, so a
|
|
134
|
+
* caller that wants the finished report asks again by `runId` rather than starting a second drive.
|
|
135
|
+
*/
|
|
136
|
+
export declare function exploreToEnd(caller: ToolCaller, args: Record<string, unknown>, budgetMs: number, now?: () => number): Promise<unknown>;
|
|
120
137
|
export {};
|