@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/docs/install-manual.mdx
CHANGED
|
@@ -7,7 +7,7 @@ icon: screwdriver-wrench
|
|
|
7
7
|
|
|
8
8
|
**Installing Reticle by hand is two independent halves: register the MCP server so your agent gets the `reticle_*` tools, then add the SDK to your app so there is something for those tools to talk to.** You need both, in that order.
|
|
9
9
|
|
|
10
|
-
Do only the first half and the tools appear but every call reports no session. Do only the second and your app connects to a daemon nobody is asking questions.
|
|
10
|
+
Do only the first half and the tools appear but every call reports no session. Do only the second and your app connects to a daemon nobody is asking questions. Stop after the first half and your agent's first Reticle call wires the app itself when you ask it to verify something, and offers to otherwise.
|
|
11
11
|
|
|
12
12
|
<Warning>
|
|
13
13
|
**You probably do not need this page.** Two commands do all of it:
|
|
@@ -19,7 +19,7 @@ npx @reticlehq/server init # in your project
|
|
|
19
19
|
|
|
20
20
|
The first registers the MCP server with every agent it can reach. The second wires the app. See the [quickstart](/quickstart).
|
|
21
21
|
|
|
22
|
-
This page is for the cases those cannot cover: a machine where piping a script is not allowed, an agent Reticle does not know, or a step the installer reported as needing a hand (Codex CLI is the usual one, because its config is TOML that Reticle will not rewrite).
|
|
22
|
+
This page is for the cases those cannot cover: a machine where piping a script is not allowed, an agent Reticle does not know, or a step the installer reported as needing a hand (Codex CLI is the usual one when the `codex` command is not installed, because its config is TOML that Reticle will not rewrite itself).
|
|
23
23
|
|
|
24
24
|
</Warning>
|
|
25
25
|
|
|
@@ -42,8 +42,8 @@ There is no config file that all agents share. Each harness has its own path and
|
|
|
42
42
|
| Cursor | `~/.cursor/mcp.json` | `mcpServers` | no |
|
|
43
43
|
| VS Code | `.vscode/mcp.json` | `servers` | no |
|
|
44
44
|
| Windsurf | `~/.codeium/windsurf/mcp_config.json` | `mcpServers` | no |
|
|
45
|
-
| OpenCode |
|
|
46
|
-
| Codex CLI |
|
|
45
|
+
| OpenCode | `~/.config/opencode/opencode.jsonc` | `mcp` | `"local"` required |
|
|
46
|
+
| Codex CLI | `~/.codex/config.toml` | `[mcp_servers.reticle]` | no |
|
|
47
47
|
| Zed | `~/.config/zed/settings.json` | `context_servers` | no |
|
|
48
48
|
|
|
49
49
|
### Claude Code
|
|
@@ -86,7 +86,7 @@ Same shape, different file and root key. Cursor and Windsurf use `mcpServers`; V
|
|
|
86
86
|
|
|
87
87
|
### Codex CLI
|
|
88
88
|
|
|
89
|
-
TOML, in
|
|
89
|
+
TOML, in `~/.codex/config.toml`. With the `codex` command installed, `init` runs `codex mcp add reticle -- npx @reticlehq/server mcp` for you, and only when the file has no `reticle` entry yet, because that command replaces one without asking. Without the command, `init` cannot write it for you:
|
|
90
90
|
|
|
91
91
|
```toml
|
|
92
92
|
[mcp_servers.reticle]
|
|
@@ -133,25 +133,33 @@ export default defineConfig({
|
|
|
133
133
|
});
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
That's the whole web install. The plugin stamps source locations onto elements.
|
|
136
|
+
That's the whole web install. The plugin stamps source locations onto elements. That is what turns a DOM node into `src/components/Login.tsx:81`. It also injects `connect()` with the pairing token, so you can't forget either.
|
|
137
137
|
|
|
138
138
|
### Anything without the plugin
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
Run `npx @reticlehq/server init` even here: it wires plain HTML, Angular, Remix, Astro, SvelteKit and the rest, and it is the part that gets the **pairing token** to the page without writing it into anything you ship.
|
|
141
|
+
|
|
142
|
+
If you really are wiring `connect()` by hand, pass the token. The daemon writes it to `~/.reticle/pairing-token` on first start and refuses a page that does not present it, on localhost too. Without it the page console says `bridge refused the connection: authentication failed: no pairing token on the page…`.
|
|
141
143
|
|
|
142
144
|
```ts
|
|
143
|
-
import { reticle } from '@reticlehq/browser';
|
|
145
|
+
import { reticle, SESSION_AUTO } from '@reticlehq/browser';
|
|
144
146
|
|
|
145
|
-
if (import.meta.env.DEV)
|
|
147
|
+
if (import.meta.env.DEV) {
|
|
148
|
+
// The contents of ~/.reticle/pairing-token, supplied at dev time (here as a Vite env var).
|
|
149
|
+
// Never commit it, and never let it reach a production build.
|
|
150
|
+
reticle.connect({ session: SESSION_AUTO, token: import.meta.env.VITE_RETICLE_TOKEN });
|
|
151
|
+
}
|
|
146
152
|
```
|
|
147
153
|
|
|
154
|
+
Start the dev server with `VITE_RETICLE_TOKEN="$(cat ~/.reticle/pairing-token)"`, or pin your own secret with `RETICLE_TOKEN=<secret>` in the MCP server's environment and give the page the same value. Set it on the dev command only, never in a `.env` file: a production build reads `.env` and would embed the token in the JavaScript it ships. Not on Vite? Do the same with your bundler's dev-only flag and its way of passing a value to the browser.
|
|
155
|
+
|
|
148
156
|
<Note>
|
|
149
157
|
`connect()` is dev-only by design. Guard it with whatever your bundler gives you:
|
|
150
158
|
`import.meta.env.DEV`, `process.env.NODE_ENV !== 'production'`, or a build flag. Reticle also
|
|
151
159
|
self-guards, but two locks on a door that leads to your users is a reasonable number.
|
|
152
160
|
</Note>
|
|
153
161
|
|
|
154
|
-
### Tauri
|
|
162
|
+
### Tauri, and the step whose failure is silent
|
|
155
163
|
|
|
156
164
|
The frontend is identical to any web app. The CSP is not optional:
|
|
157
165
|
|
|
@@ -175,7 +183,7 @@ Screenshots and headless mode need the Rust crate, which is versioned independen
|
|
|
175
183
|
|
|
176
184
|
```toml
|
|
177
185
|
[dependencies]
|
|
178
|
-
reticle-tauri = "3.
|
|
186
|
+
reticle-tauri = "3.7"
|
|
179
187
|
```
|
|
180
188
|
|
|
181
189
|
```rust
|
|
@@ -184,6 +192,8 @@ tauri::Builder::default()
|
|
|
184
192
|
.on_page_load(reticle_tauri::on_page_load)
|
|
185
193
|
```
|
|
186
194
|
|
|
195
|
+
**Dev builds only.** In a release build the crate is inert: `reticle_capture` refuses and `on_page_load` does nothing, so the binary you sign and ship carries no Reticle capability. A release build you test with Reticle (a CI fixture) turns it on with `reticle-tauri = { version = "3.7", features = ["in-release"] }`.
|
|
196
|
+
|
|
187
197
|
IPC observation needs nothing on the Rust side. An `invoke('load_todos')` already reaches Reticle as `ipc://load_todos`.
|
|
188
198
|
|
|
189
199
|
<Card title="Electron, and the rest of desktop" icon="display" href="/desktop">
|
|
@@ -196,9 +206,9 @@ IPC observation needs nothing on the Rust side. An `invoke('load_todos')` alread
|
|
|
196
206
|
npx @reticlehq/server status
|
|
197
207
|
```
|
|
198
208
|
|
|
199
|
-
A session
|
|
209
|
+
A session listed means the SDK reached the page. Setup is finished when the first run returns a verdict.
|
|
200
210
|
|
|
201
|
-
If it says nothing connected, the usual
|
|
211
|
+
If it says nothing connected, the usual causes are a port disagreement between your app and the daemon, or a hand-wired `connect()` without the pairing token. The browser console will carry `[Reticle] this page could not open a websocket to …` naming the exact address it tried; set it explicitly with `RETICLE_PORT=4400 pnpm dev` (Vite plugin), `reticle({ port: 4400 })` in `vite.config`, or `reticle.connect({ url: 'ws://localhost:4400/reticle' })` by hand.
|
|
202
212
|
|
|
203
213
|
Still stuck? `npx @reticlehq/server doctor` checks Chromium, the daemon and the port in one command.
|
|
204
214
|
|
package/docs/instrumentation.mdx
CHANGED
|
@@ -27,7 +27,9 @@ Every verdict carries an `honesty.grade`. How strong the evidence actually was.
|
|
|
27
27
|
</Card>
|
|
28
28
|
</CardGroup>
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
The full ladder, strongest first, is `signal`, `net`, `state`, `presence`, `none`: a matched request grades `net`, between a signal and a store change.
|
|
31
|
+
|
|
32
|
+
Here is the same login, verified two ways. First with an element predicate and no instrumentation leaned on:
|
|
31
33
|
|
|
32
34
|
```json
|
|
33
35
|
"honesty": { "grade": "presence", "coverage": { "pct": 100 }, "integrity": { "clean": true } }
|
|
@@ -181,7 +183,7 @@ This is the one that surprises people, so here it is in full. A successful login
|
|
|
181
183
|
"signals": ["auth:granted"]
|
|
182
184
|
},
|
|
183
185
|
"honesty": { "grade": "signal", "integrity": { "clean": true } },
|
|
184
|
-
"feedback_invite": "Reticle could not tell what happened here. If you expected otherwise,
|
|
186
|
+
"feedback_invite": "Reticle could not tell what happened here. If you expected otherwise, reticle_session { action: \"feedback\" }. An unknown verdict is our defect, not yours"
|
|
185
187
|
}
|
|
186
188
|
```
|
|
187
189
|
|
|
@@ -214,7 +216,7 @@ Signals rot the way every convention rots: someone adds a mutation, forgets the
|
|
|
214
216
|
npm i -D @reticlehq/eslint-plugin
|
|
215
217
|
```
|
|
216
218
|
|
|
217
|
-
One rule
|
|
219
|
+
One rule, `require-signal-on-mutation` (state changed, so a signal must fire), makes the signal layer self-enforcing. It is the only mechanism we have found that survives contact with a deadline.
|
|
218
220
|
|
|
219
221
|
## Start with one flow
|
|
220
222
|
|
|
@@ -4,7 +4,7 @@ description: 'The recommended shape for a real codebase: a minimal production fo
|
|
|
4
4
|
icon: shapes
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
The recommended shape for a real codebase is three decisions: put `createReticleEmitter()` in one `app/emit.ts` so components depend on an interface and `@reticlehq/browser`
|
|
7
|
+
The recommended shape for a real codebase is three decisions: put `createReticleEmitter()` in one `app/emit.ts` so components depend on an interface and `@reticlehq/browser` is imported in exactly one place; emit signals from the **store layer** rather than from N call sites; and let each feature self-register its testids and signals with `registerReticleDomain`. Then turn on `reticle/require-signal-on-mutation` so the signal layer cannot silently rot.
|
|
8
8
|
|
|
9
9
|
The basics in [Getting Started](getting-started.md) work with **zero app changes**. This doc is the _recommended_ shape for a real codebase: a minimal production footprint, a signal layer that can't silently drift, and an adoption path that starts paying off on day one, with no rewrite required.
|
|
10
10
|
|
|
@@ -24,7 +24,7 @@ Adoption is **free → cheap → targeted**. You don't instrument everything; yo
|
|
|
24
24
|
|
|
25
25
|
**1. Reuse your existing `data-testid` (free).** If you already test with Playwright or Cypress, your testids work in Reticle unchanged; `reticle_look({ action: "find", by: 'testid', value: 'checkout' })` matches them exactly. No new markup, no new code.
|
|
26
26
|
|
|
27
|
-
**2. Advertise the surface from your existing constants (cheap).** You already keep a `TestIds` constant object for your E2E suite. Pass it straight in. Now `reticle_capabilities
|
|
27
|
+
**2. Advertise the surface from your existing constants (cheap).** You already keep a `TestIds` constant object for your E2E suite. Pass it straight in. Now `reticle_run({ tool: "reticle_capabilities", args: {} })` tells a fresh agent your whole surface without reading source.
|
|
28
28
|
|
|
29
29
|
```ts
|
|
30
30
|
import { registerCapabilities } from '@reticlehq/browser';
|
|
@@ -49,7 +49,7 @@ That's day-one usefulness with no rewrite. The rest of this doc is how to do ste
|
|
|
49
49
|
|
|
50
50
|
## 2. Inject the emitter (zero prod bundle)
|
|
51
51
|
|
|
52
|
-
The #1 objection: _"I don't want a test tool in my production bundle."_ The answer: components never import `@reticlehq/browser`. They depend on a tiny structural interface, `ReticleEmitter` (`{ signal, state }`), and the real emitter is injected once at the top. `createReticleEmitter()` returns an emitter that proxies to the connected `reticle` singleton and is a **safe no-op** until `reticle.connect()` runs, so nothing breaks in production or before connect,
|
|
52
|
+
The #1 objection: _"I don't want a test tool in my production bundle."_ The answer: components never import `@reticlehq/browser`. They depend on a tiny structural interface, `ReticleEmitter` (`{ signal, state }`), and the real emitter is injected once at the top. `createReticleEmitter()` returns an emitter that proxies to the connected `reticle` singleton and is a **safe no-op** until `reticle.connect()` runs, so nothing breaks in production or before connect. With the Vite plugin, a production build replaces `@reticlehq/browser` with an inert stub, so **the SDK stays out of the prod bundle**; with another bundler, `app/emit.ts` is the one import to gate.
|
|
53
53
|
|
|
54
54
|
```ts
|
|
55
55
|
// app/emit.ts: the one place that touches @reticlehq/browser
|
|
@@ -133,7 +133,7 @@ import { registerReticleDomain } from '@reticlehq/browser';
|
|
|
133
133
|
registerReticleDomain({ testids: ['search-input'], signals: ['search:ran'] });
|
|
134
134
|
```
|
|
135
135
|
|
|
136
|
-
Importing both modules in dev makes `reticle_capabilities
|
|
136
|
+
Importing both modules in dev makes `reticle_run({ tool: "reticle_capabilities", args: {} })` return the merged surface (`testids: ['section-list', 'section-add', 'search-input']`, `signals: ['section:reordered', 'search:ran']`, `stores: ['workspace']`). `registerReticleDomain` is a thin convenience over `registerCapabilities`, with the same merge-idempotent, HMR-safe semantics, so it composes with §1's "use your existing constants." (Named flows stay an explicit `registerCapabilities({ flows })` concern: their last-writer-wins semantics don't fit "accumulate from many domains.")
|
|
137
137
|
|
|
138
138
|
## 5. Keep the signal layer from rotting (`@reticlehq/eslint-plugin`)
|
|
139
139
|
|
|
@@ -158,20 +158,20 @@ export default [
|
|
|
158
158
|
];
|
|
159
159
|
```
|
|
160
160
|
|
|
161
|
-
Or turn it on with the shipped preset: `plugin.configs.recommended`, which sets `reticle/require-signal-on-mutation` to `warn` (with empty no-op defaults you then configure) and the plugin's other
|
|
161
|
+
Or turn it on with the shipped preset: `plugin.configs.recommended`, which sets `reticle/require-signal-on-mutation` to `warn` (with empty no-op defaults you then configure) and the plugin's other two rules, `reticle/no-internal-tags` and `reticle/no-runaway-comment`, to `error`. A function that calls a mutator and a signal together passes; a mutator with no signal reports `store mutation without a mapped Reticle signal`. The documented view-level exceptions from §3 simply don't list those view callees as `mutators`, so they never fire.
|
|
162
162
|
|
|
163
163
|
## 6. Limitation: un-scriptable tabs, use `reticle drive`
|
|
164
164
|
|
|
165
165
|
Reticle observes and drives a tab through the in-page SDK plus (optionally) CDP. It **cannot bring to front or recover a browser tab the OS won't let it script**: a backgrounded tab, say, or a non-default browser (Dia, etc.) reporting `hidden:true` / `throttled:true`.
|
|
166
166
|
|
|
167
|
-
When that happens, `reticle_session { action: "list" }` and every act/assert result carry a `session.recommendation` saying so. The escape hatch is **`reticle drive <url
|
|
167
|
+
When that happens, `reticle_session { action: "list" }` and every act/assert result carry a `session.recommendation` saying so. The escape hatch is **`reticle drive <url>`**, which opens in the foreground (`--headless` hides it). Reticle launches and owns a guaranteed-scriptable browser. See [usage §18](usage.md#18-real-input-mode-native-hover--drag) for the full note.
|
|
168
168
|
|
|
169
169
|
## Checklist
|
|
170
170
|
|
|
171
171
|
- [ ] One `app/emit.ts` is the **only** module importing `@reticlehq/browser`; components import the emitter.
|
|
172
172
|
- [ ] `reticle.connect()` is dev-gated; the prod bundle has no `@reticlehq/browser`.
|
|
173
173
|
- [ ] Signals fire from the store layer (middleware or `commitAndSignal`); view-level exceptions are explicit.
|
|
174
|
-
- [ ] Each domain self-registers via `registerReticleDomain`; `reticle_capabilities
|
|
174
|
+
- [ ] Each domain self-registers via `registerReticleDomain`; `reticle_run({ tool: "reticle_capabilities", args: {} })` returns the full surface.
|
|
175
175
|
- [ ] Existing Playwright/Cypress testids are reused, not duplicated.
|
|
176
176
|
- [ ] `reticle/require-signal-on-mutation` is enabled with your `mutators` + `signalCallee`.
|
|
177
177
|
- [ ] The team knows `reticle drive <url>` for un-scriptable tabs.
|
|
@@ -78,7 +78,7 @@ You do not need `NODE_ENV` set, a project, a dev server, or a running app. This
|
|
|
78
78
|
| `missing` | Reticle found no key in its environment. | The variable is not visible to this process. See below. |
|
|
79
79
|
| `expired` | The key was valid and its term has ended. | Contact us to renew. |
|
|
80
80
|
| `invalid` | The key was not accepted. | Usually a copy or paste problem. See below. |
|
|
81
|
-
| `eval` | This build has no
|
|
81
|
+
| `eval` | This build has no issuer key: a source build or a dev checkout. | Install the published `@reticlehq/server` package. |
|
|
82
82
|
|
|
83
83
|
## Over time
|
|
84
84
|
|
|
@@ -4,7 +4,7 @@ description: 'Several apps at once, ports that shift between runs, and many agen
|
|
|
4
4
|
icon: users
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
Many agents can drive the same app at once without a browser each: `reticle_lease {action:"acquire"}` hands each one an **isolated context** (its own cookies, storage and DOM) from a single shared headless Chromium. One daemon per machine, and identity is the **app** (a stable `projectId` stamped by the build plugin), not the port, so an app that boots on `:3001` today is still the same app.
|
|
7
|
+
Many agents can drive the same app at once without a browser each: `reticle_run { tool: "reticle_lease", args: { action: "acquire" } }` hands each one an **isolated context** (its own cookies, storage and DOM) from a single shared headless Chromium. One daemon per machine, and identity is the **app** (a stable `projectId` stamped by the build plugin), not the port, so an app that boots on `:3001` today is still the same app.
|
|
8
8
|
|
|
9
9
|
Reticle is built for the messy real world: several apps running at once, ports that shift between runs, and many agents driving different flows of the same app in parallel, without each one spinning up its own Chromium. This page explains how that works and how to use it.
|
|
10
10
|
|
|
@@ -20,27 +20,45 @@ Reticle is built for the messy real world: several apps running at once, ports t
|
|
|
20
20
|
1. Add the plugin (Vite/Next) or one `reticle.connect()` call. (See [getting-started](./getting-started.md).)
|
|
21
21
|
2. Start your app as you normally do.
|
|
22
22
|
3. Open it in a browser; the in-page panel shows Reticle is connected.
|
|
23
|
-
4. Click around; flag anything that looks wrong with the "Flag a bug" annotator. The agent drains those with `reticle_session {action:"review"}`.
|
|
23
|
+
4. Click around; flag anything that looks wrong with the "Flag a bug" annotator. The agent drains those with `reticle_session { action: "review" }`.
|
|
24
24
|
|
|
25
25
|
## Agent testing: ~2 minutes
|
|
26
26
|
|
|
27
27
|
With the app running and instrumented, an agent drives a flow end to end:
|
|
28
28
|
|
|
29
29
|
```text
|
|
30
|
-
reticle_lease {action:"acquire"
|
|
30
|
+
reticle_run { tool: "reticle_lease", args: { action: "acquire", url: "http://localhost:3000/dashboard" } }
|
|
31
31
|
→ { sessionId: "lease-…", ready: true, leased: 1, queued: 0 }
|
|
32
32
|
reticle_act { sessionId, ... } # drive the flow
|
|
33
33
|
reticle_assert { sessionId, ... } # verify intent
|
|
34
|
-
reticle_lease {action:"release"
|
|
34
|
+
reticle_run { tool: "reticle_lease", args: { action: "release", sessionId } } # free the slot
|
|
35
35
|
```
|
|
36
36
|
|
|
37
|
-
`reticle_lease {action:"acquire"}` opens a fresh isolated headless context against your **already-running** app, stamps the lease identity into the URL so the app's own SDK registers under a sessionId you can target, and waits until that tab has connected (`ready: true`) before returning, so the sessionId is usable immediately. Release when the flow finishes.
|
|
37
|
+
`reticle_run { tool: "reticle_lease", args: { action: "acquire" } }` opens a fresh isolated headless context against your **already-running** app, stamps the lease identity into the URL so the app's own SDK registers under a sessionId you can target, and waits until that tab has connected (`ready: true`) before returning, so the sessionId is usable immediately. Release when the flow finishes.
|
|
38
|
+
|
|
39
|
+
## Permissions
|
|
40
|
+
|
|
41
|
+
A lease starts with every permission undecided. Pass `permissions` to grant some on the app's origin before the first navigation, so the first render already sees them:
|
|
42
|
+
|
|
43
|
+
```text
|
|
44
|
+
reticle_run { tool: "reticle_lease", args: { action: "acquire", url: "http://localhost:3000/map", permissions: ["geolocation"] } }
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Acquiring again on an origin that already has a lease returns that lease, and its grants never change there, because it may be another agent's live tab. The same list is a plain reuse and a different one is refused. To change them, release the lease and acquire again. Names are Playwright's, such as `geolocation`, `clipboard-read`, `clipboard-write` and `notifications`; one the browser does not know is refused with its reason.
|
|
48
|
+
|
|
49
|
+
| What the page reads | Without `permissions` | After a grant |
|
|
50
|
+
| --- | --- | --- |
|
|
51
|
+
| `navigator.permissions.query({ name })` | `prompt` | `granted` |
|
|
52
|
+
| `Notification.permission`, in Playwright's headless shell (the default) | `denied` | still `denied` |
|
|
53
|
+
| `Notification.permission`, in an installed Chrome the pool falls back to | `default` | `granted` |
|
|
54
|
+
|
|
55
|
+
The headless shell has no notification support, so a notifications grant never reaches `Notification.permission` there. When you ask for `notifications`, the lease reads the value back from the page and says so in `hint` whenever the page cannot see the grant.
|
|
38
56
|
|
|
39
57
|
## 10 agents, 10 flows, one dashboard
|
|
40
58
|
|
|
41
59
|
This is the design target, and it needs no special setup:
|
|
42
60
|
|
|
43
|
-
- Each agent calls `reticle_lease {action:"acquire"}` for the same dashboard URL → its own isolated context (own cookies/storage) in the **one** shared Chromium.
|
|
61
|
+
- Each agent calls `reticle_run { tool: "reticle_lease", args: { action: "acquire" } }` for the same dashboard URL → its own isolated context (own cookies/storage) in the **one** shared Chromium.
|
|
44
62
|
- The pool caps simultaneous contexts (`RETICLE_MAX_CONTEXTS`, default scales with CPU under a ceiling); extra acquires queue and proceed as slots free.
|
|
45
63
|
- Flows can't bleed into each other: contexts are isolated and every session is scoped by `projectId`.
|
|
46
64
|
- A single crashed page is reclaimed on its own, and if an agent crashes or hangs its lease stops being touched and the **lease reaper** reclaims the context after a TTL, freeing the slot. One dead agent never starves the others.
|
|
@@ -8,7 +8,7 @@ icon: file-code
|
|
|
8
8
|
|
|
9
9
|
React 19 dropped `_debugSource`, which is what source mapping used to rely on, so without this the tools can tell you the component name but not the file.
|
|
10
10
|
|
|
11
|
-
**Apache 2.0. CommonJS.
|
|
11
|
+
**Apache 2.0. CommonJS. One runtime dependency, `@reticlehq/core` (for the attribute name). Peer dependency: `@babel/core ^7`.**
|
|
12
12
|
|
|
13
13
|
## What it stamps
|
|
14
14
|
|
|
@@ -36,6 +36,8 @@ The path is relative to `process.cwd()`, with backslashes normalized to forward
|
|
|
36
36
|
## What it skips
|
|
37
37
|
|
|
38
38
|
- Component tags. Only lowercase host elements are stamped, because a component's own JSX gets stamped where it is defined.
|
|
39
|
+
- Lowercase tags that are not HTML or SVG elements, such as react-three-fiber's `<mesh>`. Only known DOM tags are stamped, because a custom renderer can crash on the attribute.
|
|
40
|
+
- Files whose first non-empty line is a comment holding exactly `@reticle-ignore`.
|
|
39
41
|
- Elements that already carry the attribute.
|
|
40
42
|
- Nodes with no location information.
|
|
41
43
|
- Anything whose tag name is not a plain `JSXIdentifier`.
|
|
@@ -56,7 +58,7 @@ One export, via `export =`. There are no named exports and no `default` interop
|
|
|
56
58
|
function reticleSourcePlugin({ types }: { types: typeof BabelTypes }): PluginObj<PluginPass>;
|
|
57
59
|
```
|
|
58
60
|
|
|
59
|
-
The Babel plugin name is `reticle-source`. Its visitor handles `
|
|
61
|
+
The Babel plugin name is `reticle-source`. Its visitor handles `Program` (to read the ignore marker) and `JSXOpeningElement`.
|
|
60
62
|
|
|
61
63
|
**It takes no options.** The plugin reads nothing from `state.opts`.
|
|
62
64
|
|
|
@@ -31,16 +31,17 @@ if (import.meta.env.DEV) reticle.connect();
|
|
|
31
31
|
|
|
32
32
|
One instance, memoized on `globalThis` so hot module replacement does not create a second one.
|
|
33
33
|
|
|
34
|
-
| Method
|
|
35
|
-
|
|
|
36
|
-
| `connect`
|
|
37
|
-
| `connected`
|
|
38
|
-
| `signal`
|
|
39
|
-
| `state`
|
|
40
|
-
| `renderCommit`
|
|
41
|
-
| `describe`
|
|
42
|
-
| `endSession`
|
|
43
|
-
| `disconnect`
|
|
34
|
+
| Method | Signature |
|
|
35
|
+
| ------------------- | ---------------------------------------------------------- |
|
|
36
|
+
| `connect` | `(options?: ReticleConnectOptions) => void` |
|
|
37
|
+
| `connected` | `get connected(): boolean` |
|
|
38
|
+
| `signal` | `(name: string, data?: Record<string, unknown>) => void` |
|
|
39
|
+
| `state` | `(name: string, value: unknown) => void` |
|
|
40
|
+
| `renderCommit` | `(commits: number) => void` |
|
|
41
|
+
| `describe` | `(input: CapabilitiesInput) => void` |
|
|
42
|
+
| `endSession` | `() => void` |
|
|
43
|
+
| `disconnect` | `() => void` |
|
|
44
|
+
| `observeHotUpdates` | `(hot: unknown) => void` (called by the build integration) |
|
|
44
45
|
|
|
45
46
|
Everything else on the class is private. `Reticle` itself is exported for typing.
|
|
46
47
|
|
|
@@ -56,8 +57,13 @@ Every field is optional.
|
|
|
56
57
|
| `token` | `string` | Pairing token, required for a non-loopback page |
|
|
57
58
|
| `allowNonLocalhost` | `boolean` | Opt in to connecting from a non-localhost origin |
|
|
58
59
|
| `allowInProduction` | `boolean` | Opt in to connecting from a production build. Desktop apps need this |
|
|
60
|
+
| `testIdAttribute` | `string` | The attribute the app marks controls with, when it is not `data-testid` |
|
|
59
61
|
| `overlay` | `boolean` | The in-page overlay |
|
|
60
62
|
| `captureNetworkBodies` | `boolean` | Record request and response bodies |
|
|
63
|
+
| `networkBodyMaxChars` | `number` | Per-body cap for captured bodies (default 8192) |
|
|
64
|
+
| `captureErrorBodies` | `boolean` | Keep the body of a failed request even with body capture off (default true) |
|
|
65
|
+
| `sourceMapping` | `boolean` | Whether the build stamps source locations. Set by the build plugin |
|
|
66
|
+
| `exposePresenter` | `boolean` | Make Reticle's own presenter visible to tools. For Reticle contributors only |
|
|
61
67
|
| `root` | `string` | Repository root, so source paths come back relative |
|
|
62
68
|
| `sdkVersion` | `string` | Reported on the handshake for skew detection |
|
|
63
69
|
| `present` | `boolean` | Presenter mode |
|
package/docs/packages/core.mdx
CHANGED
|
@@ -27,7 +27,13 @@ npm i @reticlehq/core
|
|
|
27
27
|
| Subpath | What it is |
|
|
28
28
|
| --- | --- |
|
|
29
29
|
| `.` | The ESM barrel. Types at `dist/index.d.ts` |
|
|
30
|
+
| `./telemetry` | The analytics wire, for a Node-side importer that needs only that half |
|
|
31
|
+
| `./artifacts` | The on-disk and registry formats |
|
|
32
|
+
| `./hooks` | What Reticle says happened, for hook consumers |
|
|
33
|
+
| `./hud` | Constants shared by the daemon and the HUD panel |
|
|
34
|
+
| `./tour` | The onboarding tour |
|
|
30
35
|
| `./desktop-contract` | A CommonJS shim, generated at build, for the strings the desktop adapters share |
|
|
36
|
+
| `./source-constants` | A CommonJS shim, generated at build, for the source-stamp constants the build adapters share |
|
|
31
37
|
| `./schema/*.json` | Generated JSON Schema for the wire types |
|
|
32
38
|
| `./package.json` | The manifest |
|
|
33
39
|
|
|
@@ -38,7 +44,7 @@ npm i @reticlehq/core
|
|
|
38
44
|
|
|
39
45
|
## What the barrel exports
|
|
40
46
|
|
|
41
|
-
`src/index.ts` is a pure barrel: a stack of `export *` re-exports plus
|
|
47
|
+
`src/index.ts` is a pure barrel: a stack of `export *` re-exports plus two named-export lines. Grouped by what they are for, and not exhaustive:
|
|
42
48
|
|
|
43
49
|
### Wire constants
|
|
44
50
|
|
|
@@ -83,19 +89,20 @@ Pure, isomorphic, and safe on both sides of the wire:
|
|
|
83
89
|
import { RETICLE_IPC_GLOBAL, RETICLE_CAPTURE_CHANNEL } from '@reticlehq/core/desktop-contract';
|
|
84
90
|
```
|
|
85
91
|
|
|
86
|
-
|
|
92
|
+
Seven strings shared by the Electron preload and the Tauri crate, in CommonJS because a preload script is required before any ESM transform:
|
|
87
93
|
|
|
88
94
|
| Constant | Value |
|
|
89
95
|
| ------------------------------- | ---------------------------------------------------------- |
|
|
90
96
|
| `RETICLE_IPC_GLOBAL` | `__reticleIpc` |
|
|
91
97
|
| `RETICLE_CAPTURE_CHANNEL` | `__reticle:capture` |
|
|
98
|
+
| `RETICLE_WINDOW_CHANNEL` | `__reticle:window` |
|
|
92
99
|
| `RETICLE_CAPTURE_FILE_PREFIX` | `reticle-capture-` |
|
|
93
100
|
| `RETICLE_TAURI_CAPTURE_COMMAND` | `reticle_capture` |
|
|
94
101
|
| `RETICLE_FULL_PAGE_UNSUPPORTED` | `full-page-unsupported`, for a refused full-page capture |
|
|
95
102
|
| `RETICLE_NOT_COMPOSITED` | `window-not-composited`, for a window that had not painted |
|
|
96
103
|
|
|
97
104
|
<Warning>
|
|
98
|
-
The subpath exports those
|
|
105
|
+
The subpath exports those seven constants individually and nothing else. The `DESKTOP_CONTRACT`
|
|
99
106
|
record they are collected into exists on the ESM side only, so importing it here fails with
|
|
100
107
|
`Module '"@reticlehq/core/desktop-contract"' has no exported member 'DESKTOP_CONTRACT'`. Import
|
|
101
108
|
`DESKTOP_CONTRACT` from `@reticlehq/core` instead.
|
|
@@ -103,9 +110,9 @@ Six strings shared by the Electron preload and the Tauri crate, in CommonJS beca
|
|
|
103
110
|
|
|
104
111
|
## The JSON schemas
|
|
105
112
|
|
|
106
|
-
|
|
113
|
+
Nine files, generated at build from the zod definitions:
|
|
107
114
|
|
|
108
|
-
`reticle-message.json`, `reticle-event.json`, `hello-message.json`, `command-message.json`, `command-result.json`, `event-message.json`, `event-type.json`.
|
|
115
|
+
`reticle-message.json`, `reticle-event.json`, `hello-message.json`, `command-message.json`, `command-result.json`, `event-message.json`, `event-type.json`, `command-name.json`, `event-payloads.json`.
|
|
109
116
|
|
|
110
117
|
```ts
|
|
111
118
|
import schema from '@reticlehq/core/schema/reticle-message.json' with { type: 'json' };
|
|
@@ -49,12 +49,13 @@ It patches three methods, and each IPC call then surfaces to Reticle as a networ
|
|
|
49
49
|
| `ipcRenderer.sendSync` | Two-way, with its outcome |
|
|
50
50
|
| `ipcRenderer.send` | One-way, dispatched, with no outcome |
|
|
51
51
|
|
|
52
|
-
It then exposes `window.__reticleIpc` through the context bridge, with
|
|
52
|
+
It then exposes `window.__reticleIpc` through the context bridge, with four members used by the SDK rather than by you:
|
|
53
53
|
|
|
54
54
|
| Member | Signature | Notes |
|
|
55
55
|
| --- | --- | --- |
|
|
56
56
|
| `subscribe` | `(callback) => number` | Returns a token, or `-1` if the argument is not a function |
|
|
57
57
|
| `unsubscribe` | `(token) => void` | Real removal |
|
|
58
|
+
| `windowLabel` | `() => Promise<string \| undefined>` | The label the main process registered for this window, or `undefined` |
|
|
58
59
|
| `capture` | `(fullPage) => Promise<string \| null>` | Resolves to a capture file path, `null` when no main handler is installed, and propagates the explicit full-page refusal |
|
|
59
60
|
|
|
60
61
|
## The main process
|
|
@@ -66,7 +67,7 @@ const win = new BrowserWindow({/* ... */});
|
|
|
66
67
|
installReticleCapture(win);
|
|
67
68
|
```
|
|
68
69
|
|
|
69
|
-
`installReticleCapture(win): void` is a no-op on `null` or `undefined`, tracks the window until it closes, and registers the capture handler once for the whole app.
|
|
70
|
+
`installReticleCapture(win, options?): void` is a no-op on `null` or `undefined`, tracks the window until it closes, and registers the capture handler once for the whole app. `{ label: 'settings' }` names the window in `reticle_session { action: "list" }`; without it the window is listed by url and title.
|
|
70
71
|
|
|
71
72
|
The handler calls `webContents.capturePage()`, writes the PNG into a per-process `0700` captures directory as `reticle-capture-<n>.png`, and **returns the file path rather than the bytes**, because the transport has a 64KB cap. It refuses `fullPage: true` explicitly rather than silently returning a viewport shot, and it throws named reasons rather than one blanket silence: `full-page-unsupported` for that refusal, `window-not-composited` when the window had nothing painted yet, `no usable webContents to capture` when the window is gone. The preload re-throws the full-page refusal and turns everything else into `null`.
|
|
72
73
|
|
package/docs/packages/engine.mdx
CHANGED
|
@@ -6,7 +6,7 @@ icon: gavel
|
|
|
6
6
|
|
|
7
7
|
`@reticlehq/engine` is the part of Reticle that DECIDES. It reads what happened in a running app and says whether the declared consequence held. It has no browser, no daemon and no command line: evidence goes in, a verdict comes out.
|
|
8
8
|
|
|
9
|
-
**Apache 2.0. Depends on [`@reticlehq/core`](/packages/core) and `zod`.**
|
|
9
|
+
**Apache 2.0. Depends on [`@reticlehq/core`](/packages/core), [`open-verification`](/packages/open-verification) and `zod`.**
|
|
10
10
|
|
|
11
11
|
## Why it is a separate package
|
|
12
12
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: '@reticlehq/eslint-plugin'
|
|
3
|
-
description:
|
|
3
|
+
description: Three lint rules that keep Reticle's signal layer and its comment hygiene self-enforcing.
|
|
4
4
|
icon: shield-check
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
`@reticlehq/eslint-plugin` is
|
|
7
|
+
`@reticlehq/eslint-plugin` is three ESLint rules that keep Reticle's signal layer and its comments self-enforcing. It is entirely optional: nothing in Reticle needs it, and you want it only once your app emits signals and you would like the compiler to notice when a new mutation forgets one.
|
|
8
8
|
|
|
9
9
|
It exists because conventions rot. Someone adds a mutation, forgets the signal, and every verdict for that flow quietly drops a grade. Nothing breaks, the tests still pass, the evidence just gets weaker. A lint rule is the only way a convention survives contact with a deadline.
|
|
10
10
|
|
|
@@ -16,12 +16,13 @@ npm i -D @reticlehq/eslint-plugin
|
|
|
16
16
|
|
|
17
17
|
## Exports
|
|
18
18
|
|
|
19
|
-
| Export
|
|
20
|
-
|
|
|
21
|
-
| `default`
|
|
22
|
-
| `rules`
|
|
23
|
-
| `requireSignalOnMutation` | The rule, exported individually
|
|
24
|
-
| `noInternalTags`
|
|
19
|
+
| Export | What it is |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `default` | The plugin object: `{ meta: { name: 'reticle' }, rules, configs }` |
|
|
22
|
+
| `rules` | `{ 'require-signal-on-mutation': ..., 'no-internal-tags': ..., 'no-runaway-comment': ... }` |
|
|
23
|
+
| `requireSignalOnMutation` | The rule, exported individually |
|
|
24
|
+
| `noInternalTags` | The rule, exported individually |
|
|
25
|
+
| `noRunawayComment` | The rule, exported individually |
|
|
25
26
|
|
|
26
27
|
## The rules
|
|
27
28
|
|
|
@@ -49,10 +50,14 @@ The check is scoped per function: a mutation and its signal must live in the sam
|
|
|
49
50
|
|
|
50
51
|
### `reticle/no-internal-tags`
|
|
51
52
|
|
|
52
|
-
Errors on internal design-doc reference codes and internal version strings appearing in comments, file names, directory names or test descriptions. **Message
|
|
53
|
+
Errors on internal design-doc reference codes and internal version strings appearing in comments, file names, directory names or test descriptions. **Message ids:** `internalTag` (in a comment or test description) and `pathTag` (in a file or directory name), each with a `{ tag }` placeholder. No options.
|
|
53
54
|
|
|
54
55
|
This one is mostly for contributors to Reticle itself, but the `recommended` config turns it on for everyone.
|
|
55
56
|
|
|
57
|
+
### `reticle/no-runaway-comment`
|
|
58
|
+
|
|
59
|
+
Errors on a single block comment longer than 60 lines, which is usually pasted output rather than prose. **Message id:** `runawayComment`, with `{ lines }` and `{ max }` placeholders. No options.
|
|
60
|
+
|
|
56
61
|
## The recommended config
|
|
57
62
|
|
|
58
63
|
One config, `recommended`:
|
|
@@ -71,14 +76,15 @@ Which is exactly:
|
|
|
71
76
|
rules: {
|
|
72
77
|
'reticle/require-signal-on-mutation': 'warn',
|
|
73
78
|
'reticle/no-internal-tags': 'error',
|
|
79
|
+
'reticle/no-runaway-comment': 'error',
|
|
74
80
|
},
|
|
75
81
|
}
|
|
76
82
|
```
|
|
77
83
|
|
|
78
84
|
<Warning>
|
|
79
|
-
`recommended` enables **
|
|
80
|
-
documented only the first rule, so the
|
|
81
|
-
individually if you want just the signal check.
|
|
85
|
+
`recommended` enables **all three** rules, and `no-internal-tags` and `no-runaway-comment` at
|
|
86
|
+
`error`. An older README documented only the first rule, so the other two can arrive as a
|
|
87
|
+
surprise. Enable the rules individually if you want just the signal check.
|
|
82
88
|
</Warning>
|
|
83
89
|
|
|
84
90
|
<Card title="Why signals are the strongest evidence" icon="tower-broadcast" href="/instrumentation">
|
package/docs/packages/next.mdx
CHANGED
|
@@ -10,7 +10,7 @@ icon: n
|
|
|
10
10
|
|
|
11
11
|
## Why it exists
|
|
12
12
|
|
|
13
|
-
Next users are on SWC. Telling them to switch to Babel for a dev tool would be a rude trade, and it would slow down every build they run. This adds a dev-only pre-loader for `.jsx` and `.
|
|
13
|
+
Next users are on SWC. Telling them to switch to Babel for a dev tool would be a rude trade, and it would slow down every build they run. This adds a dev-only pre-loader for `.jsx`, `.tsx` and `.js` files that contain JSX, and leaves the rest of the pipeline alone.
|
|
14
14
|
|
|
15
15
|
## Install and use
|
|
16
16
|
|
|
@@ -35,15 +35,16 @@ module.exports = withReticle({/* your config */});
|
|
|
35
35
|
### `.`
|
|
36
36
|
|
|
37
37
|
```ts
|
|
38
|
-
function withReticle<T = unknown>(nextConfig?: T): T;
|
|
38
|
+
function withReticle<T = unknown>(nextConfig?: T, options?: { sourceMapping?: boolean }): T;
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
Returns the config unchanged when `NODE_ENV === 'production'
|
|
41
|
+
Returns the config unchanged when `NODE_ENV === 'production'`, unless `RETICLE_DEV=1` is set (for `NODE_ENV=production next dev`). `sourceMapping: false` skips the loader rules, for an app that renders through a non-DOM React reconciler. Otherwise it merges in:
|
|
42
42
|
|
|
43
43
|
| Addition | What it does |
|
|
44
44
|
| --- | --- |
|
|
45
|
-
| `webpack` | Pushes an `enforce: 'pre'` rule for `/\.(
|
|
46
|
-
| `turbopack` | On Next 15.3 and above only: rules for `*.tsx` and `*.jsx` pointing at `@reticlehq/next/loader` |
|
|
45
|
+
| `webpack` | Pushes an `enforce: 'pre'` rule for `/\.(tsx\|jsx\|js)$/`, excluding `node_modules`, using this package's loader. Your own `webpack` function still runs afterwards |
|
|
46
|
+
| `turbopack` | On Next 15.3 and above only: rules for `*.tsx` and `*.jsx` (and, on Next 16, the project's own `*.js`) pointing at `@reticlehq/next/loader` |
|
|
47
|
+
| `allowedDevOrigins` | Your own list plus the loopback hosts a Reticle-opened tab arrives on, on a Next that accepts the key (15.2.2 and above) |
|
|
47
48
|
| `env.NEXT_PUBLIC_RETICLE_URL` | The bridge URL: a valid `RETICLE_PORT` override, otherwise project daemon discovery and `.reticle.json` |
|
|
48
49
|
| `env.NEXT_PUBLIC_RETICLE_TOKEN` | The pairing token, when one exists on disk |
|
|
49
50
|
| `env.NEXT_PUBLIC_RETICLE_ROOT` | `process.cwd()`, so source paths come back repository-relative |
|
|
@@ -51,7 +52,7 @@ Returns the config unchanged when `NODE_ENV === 'production'`. Otherwise it merg
|
|
|
51
52
|
|
|
52
53
|
Daemon discovery reads `RETICLE_STATE_DIR` (default `~/.reticle`). Pairing tokens use `RETICLE_PAIRING_TOKEN_DIR` independently. The generated `ReticleDev` component reads `NEXT_PUBLIC_RETICLE_URL`; restart the dev server after changing these settings.
|
|
53
54
|
|
|
54
|
-
`readPairingToken()`
|
|
55
|
+
`readPairingToken()`, `discoverDaemonUrl()` and `knowsAllowedDevOrigins()` are also exported at runtime. They are not declared in `index.d.ts`, so TypeScript will not see them.
|
|
55
56
|
|
|
56
57
|
### `./loader`
|
|
57
58
|
|
|
@@ -60,7 +61,7 @@ declare function reticleNextLoader(this: unknown, source: string, inputMap?: unk
|
|
|
60
61
|
export = reticleNextLoader;
|
|
61
62
|
```
|
|
62
63
|
|
|
63
|
-
An async webpack loader. It skips anything that is not `.jsx` or `.
|
|
64
|
+
An async webpack loader. It skips anything that is not `.jsx`, `.tsx` or a `.js` file containing JSX, and anything under `node_modules`. It lazily imports `@reticlehq/babel-plugin` and runs `babel.transformAsync` with `configFile: false`, `babelrc: false`, `retainLines`, and source maps on.
|
|
64
65
|
|
|
65
66
|
<Note>
|
|
66
67
|
The loader never fails the build. Any error falls back to the original source, because a dev-only
|
|
@@ -37,4 +37,4 @@ npm install open-verification
|
|
|
37
37
|
|
|
38
38
|
## Versioning
|
|
39
39
|
|
|
40
|
-
The protocol has its own compatibility rules, stated in `VERSIONING.md` inside the package. It
|
|
40
|
+
The protocol has its own compatibility rules, stated in `VERSIONING.md` inside the package. It carries its own version, separate from the `@reticlehq/*` packages: the protocol does not change whenever Reticle does.
|
package/docs/packages/server.mdx
CHANGED
|
@@ -6,7 +6,7 @@ icon: server
|
|
|
6
6
|
|
|
7
7
|
`@reticlehq/server` is the Reticle bridge, MCP server and CLI in one Node package. It hosts the WebSocket your app dials into, exposes the MCP tools your agent calls, and ships the `reticle` binary. **You do not add it to your project**: your agent runs it with `npx @reticlehq/server mcp`.
|
|
8
8
|
|
|
9
|
-
**Licensed under `
|
|
9
|
+
**Licensed under `FSL-1.1-ALv2` (the Functional Source License, converting to Apache 2.0), not Apache 2.0 like the SDK packages.** This is the package the enterprise terms apply to.
|
|
10
10
|
|
|
11
11
|
## Why it exists
|
|
12
12
|
|
|
@@ -24,9 +24,9 @@ The `bin` entry is `reticle`, so `npx @reticlehq/server <command>` works once it
|
|
|
24
24
|
|
|
25
25
|
## Dependencies
|
|
26
26
|
|
|
27
|
-
**Runtime:** `@modelcontextprotocol/sdk`, `@reticlehq/core`, `ws`, `zod`.
|
|
27
|
+
**Runtime:** `@modelcontextprotocol/sdk`, `@reticlehq/browser`, `@reticlehq/core`, `@reticlehq/engine`, `@reticlehq/init`, `open-verification`, `ws`, `zod`, `zod-to-json-schema`.
|
|
28
28
|
|
|
29
|
-
**Optional:** `playwright
|
|
29
|
+
**Optional:** `playwright` (also a peer dependency, `>=1.50`), `pixelmatch`, `pngjs`. Optional on purpose: Reticle observes the browser you already have. You only need Playwright for the paths that launch or diff one, which is `reticle drive`, `reticle verify`, and visual baselines.
|
|
30
30
|
|
|
31
31
|
## Exports map
|
|
32
32
|
|
|
@@ -50,7 +50,7 @@ await server.close();
|
|
|
50
50
|
|
|
51
51
|
| Option | Type | Default |
|
|
52
52
|
| --- | --- | --- |
|
|
53
|
-
| `port` | `number` | `RETICLE_PORT
|
|
53
|
+
| `port` | `number` | `4400`. The CLI resolves `RETICLE_PORT` before it calls `start` |
|
|
54
54
|
| `host` | `string` | `RETICLE_HOST`, else loopback. A non-loopback host requires a token |
|
|
55
55
|
| `token` | `string` | `RETICLE_TOKEN` |
|
|
56
56
|
| `allowedOrigins` | `string[]` | `RETICLE_ALLOWED_ORIGINS` |
|
|
@@ -71,7 +71,7 @@ await server.close();
|
|
|
71
71
|
|
|
72
72
|
### `RunningServer`
|
|
73
73
|
|
|
74
|
-
`bridge: Bridge`, `close(): Promise<void>`, and the optional `realInput`, `verifyPort`, `isIdle()`, `agentAttached()`, `token`.
|
|
74
|
+
`bridge: Bridge`, `close(): Promise<void>`, and the optional `realInput`, `verifyPort`, `isIdle()`, `agentAttached()`, `token`, `announceShutdown()`.
|
|
75
75
|
|
|
76
76
|
## What else the barrel exports
|
|
77
77
|
|