@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/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reticlehq/server",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.7.0",
|
|
4
|
+
"mcpName": "io.github.reticlehq/reticle",
|
|
4
5
|
"description": "Reticle CLI, bridge and MCP server: a coding agent drives your running web app from the inside and gets a verdict with evidence, for change verification, access control, accessibility, performance and SEO checks.",
|
|
5
6
|
"type": "module",
|
|
6
7
|
"main": "./dist/index.js",
|
|
@@ -19,15 +20,15 @@
|
|
|
19
20
|
}
|
|
20
21
|
},
|
|
21
22
|
"dependencies": {
|
|
22
|
-
"@modelcontextprotocol/sdk": "^1.
|
|
23
|
+
"@modelcontextprotocol/sdk": "^1.31.0",
|
|
23
24
|
"ws": "^8.21.3",
|
|
24
25
|
"zod": "^3.24.1",
|
|
25
26
|
"zod-to-json-schema": "^3.24.0",
|
|
26
|
-
"@reticlehq/browser": "3.
|
|
27
|
-
"@reticlehq/engine": "3.
|
|
28
|
-
"@reticlehq/core": "3.5.0",
|
|
27
|
+
"@reticlehq/browser": "3.7.0",
|
|
28
|
+
"@reticlehq/engine": "3.7.0",
|
|
29
29
|
"open-verification": "1.0.0",
|
|
30
|
-
"@reticlehq/
|
|
30
|
+
"@reticlehq/core": "3.7.0",
|
|
31
|
+
"@reticlehq/init": "3.7.0"
|
|
31
32
|
},
|
|
32
33
|
"devDependencies": {
|
|
33
34
|
"@types/pngjs": "^6.0.5",
|
|
@@ -64,13 +65,9 @@
|
|
|
64
65
|
"cli"
|
|
65
66
|
],
|
|
66
67
|
"reticle": {
|
|
67
|
-
"changelog": "
|
|
68
|
+
"changelog": "Drive your localhost app from the Reticle platform's chat: the daemon of a linked project drives it on your machine, the chat shows it live and keeps it as a check with a replay. The Harness now runs only on the platform, on every plan, and plans, replays and learns each app. A page on SDK 3.1-3.4 is no longer version-skewed, a pressed key sends its keyCode, and a screenshot never carries another tab's pixels. Upgrading from 3.5: see MIGRATION.md.",
|
|
68
69
|
"breakingChanges": [
|
|
69
|
-
"
|
|
70
|
-
"Twelve tools are unreachable on the default surface and have NO redirect: reticle_capabilities, reticle_clock, reticle_context, reticle_flow_replay, reticle_flow_save, reticle_intent, reticle_network_mock, reticle_record, reticle_run, reticle_screenshot, reticle_storage, reticle_visual_diff. The default surface ships no reticle_run hatch. Start the daemon with RETICLE_ADVERTISE_ALL_TOOLS=1 (read once at startup) and call them by name. Saved flows still replay via reticle_verify { action: \"flows\" }.",
|
|
71
|
-
"`reticle init` no longer drives: it ends at a connected session. --flow, --no-drive and --drive-model now exit non-zero, each naming its replacement. Prove a flow with reticle_verify { action: \"explore\", persona: \"<who does what>\" }, or npx @reticlehq/server verify <url> --explore --persona \"...\". init's exit code now means \"nothing connected\" rather than \"no verdict\". --files-only is unchanged.",
|
|
72
|
-
"@reticlehq/server now requires Node >=20.11 (was >=20.0.0).",
|
|
73
|
-
"@reticlehq/server, @reticlehq/init and @reticlehq/test declare license FSL-1.1-ALv2 instead of \"SEE LICENSE IN LICENSE\". The terms are identical; add the SPDX id to a licence allowlist."
|
|
70
|
+
"reticle_verify { action: \"explore\" } and reticle verify --explore no longer drive on a model key of your own. The Harness decides on the Reticle platform and needs a linked project (npx @reticlehq/server connect); every plan includes Harness credits. ANTHROPIC_API_KEY, OPENAI_API_KEY and JEV_API_KEY are no longer read for driving, RETICLE_HARNESS_DRIVER and RETICLE_HARNESS_MODEL are ignored, and the explore tool's `driver` argument is removed. A secret field's value comes from RETICLE_SECRET_<FIELD> on your machine."
|
|
74
71
|
]
|
|
75
72
|
},
|
|
76
73
|
"publishConfig": {
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The page the tutorial drives when the user has no app of their own yet.
|
|
3
|
-
*
|
|
4
|
-
* `reticle tutorial` used to print four steps and stop. Printing is not teaching: the reader is told
|
|
5
|
-
* that a verdict is the point, and then watches nothing produce one. So the tour now RUNS — against a
|
|
6
|
-
* page served from here, because the alternative (drive whatever is in front of the user) is how a
|
|
7
|
-
* first run ends on a login wall, and a tutorial that fails on step one teaches that Reticle does not
|
|
8
|
-
* work.
|
|
9
|
-
*
|
|
10
|
-
* It carries the real SDK, not a stub. A demo instrumented by something other than the thing being
|
|
11
|
-
* demonstrated proves nothing about the thing being demonstrated.
|
|
12
|
-
*
|
|
13
|
-
* WHY THERE IS NO IMPORT MAP WRITTEN DOWN HERE. The SDK is ESM with bare specifiers, the shipped
|
|
14
|
-
* server has no bundler, and the obvious fix — a hand-written map of specifier to path — is the exact
|
|
15
|
-
* defect this repository keeps paying for: two lists that must agree, where the one nobody updated is
|
|
16
|
-
* the one that breaks. A dependency added to the SDK would leave this map short by one, the page
|
|
17
|
-
* would fail to load a module, and the tour would report that the user's setup is broken.
|
|
18
|
-
*
|
|
19
|
-
* So the map is DISCOVERED. Start at the SDK entry, scan the files beside it for bare specifiers,
|
|
20
|
-
* resolve each one, and repeat. It cannot be short by one, because nothing here knows the names.
|
|
21
|
-
*
|
|
22
|
-
* The walk follows imports out of OUR packages only; a third-party one is mounted whole and not
|
|
23
|
-
* read. That is a deliberate line, not an oversight. Reading zod means walking several thousand
|
|
24
|
-
* files to learn something that has not changed in this repository's lifetime, and it measurably
|
|
25
|
-
* cost about a minute — on the one command whose whole job is a good first impression. The drift
|
|
26
|
-
* this guards against is our own SDK gaining a dependency, which is the thing that actually moves;
|
|
27
|
-
* a third-party leaf that grows a bare runtime import would fail loudly on the page instead, which
|
|
28
|
-
* is a worse message but not a silent one.
|
|
29
|
-
*/
|
|
30
|
-
/** The signal the demo app fires when it saves — the consequence the tour declares in advance. */
|
|
31
|
-
export declare const DEMO_SIGNAL = "demo:saved";
|
|
32
|
-
/** Controls the tour points at. Named here so the page and the run cannot disagree about them. */
|
|
33
|
-
export declare const DemoTestId: {
|
|
34
|
-
readonly SAVE: "demo-save";
|
|
35
|
-
readonly NAME: "demo-name";
|
|
36
|
-
readonly STATUS: "demo-status";
|
|
37
|
-
};
|
|
38
|
-
export interface SdkMount {
|
|
39
|
-
/** URL prefix the page fetches under. */
|
|
40
|
-
prefix: string;
|
|
41
|
-
/** Directory on disk it serves from. */
|
|
42
|
-
dir: string;
|
|
43
|
-
}
|
|
44
|
-
export interface SdkGraph {
|
|
45
|
-
/** Bare specifier to the URL the page should load it from. */
|
|
46
|
-
imports: Record<string, string>;
|
|
47
|
-
mounts: SdkMount[];
|
|
48
|
-
/** URL of the SDK entry module itself. */
|
|
49
|
-
entry: string;
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Resolve the SDK and everything it reaches, as URLs a page can fetch.
|
|
53
|
-
*
|
|
54
|
-
* `resolve` is injected so a test can describe a dependency graph without one existing on disk —
|
|
55
|
-
* and because the real one is `import.meta.resolve`, which answers against THIS module's location
|
|
56
|
-
* and so cannot be pointed at a fixture.
|
|
57
|
-
*/
|
|
58
|
-
export declare function sdkGraph(resolve?: (spec: string) => string): SdkGraph;
|
|
59
|
-
/**
|
|
60
|
-
* The demo app, and the one line that makes it verifiable.
|
|
61
|
-
*
|
|
62
|
-
* Saving fires a SIGNAL as well as changing the text. Both are here on purpose: the text is what a
|
|
63
|
-
* person sees, the signal is what the app itself says happened, and the tour waits on the signal
|
|
64
|
-
* because that is the difference it exists to teach — a rendered word can be a coincidence, and an
|
|
65
|
-
* app declaring its own state cannot.
|
|
66
|
-
*/
|
|
67
|
-
export declare function demoPageHtml(graph: SdkGraph, token: string, bridgeUrl: string): string;
|
|
68
|
-
/**
|
|
69
|
-
* Serve the demo on a port the OS picks.
|
|
70
|
-
*
|
|
71
|
-
* Port 0 rather than a chosen number: this starts while a daemon, a dev server and possibly another
|
|
72
|
-
* copy of this tour are already running, and a tutorial whose first act is a port collision has
|
|
73
|
-
* taught the wrong lesson about the product.
|
|
74
|
-
*/
|
|
75
|
-
export declare function serveDemoPage(html: string, graph: SdkGraph): Promise<{
|
|
76
|
-
url: string;
|
|
77
|
-
close: () => Promise<void>;
|
|
78
|
-
}>;
|
|
@@ -1,241 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The page the tutorial drives when the user has no app of their own yet.
|
|
3
|
-
*
|
|
4
|
-
* `reticle tutorial` used to print four steps and stop. Printing is not teaching: the reader is told
|
|
5
|
-
* that a verdict is the point, and then watches nothing produce one. So the tour now RUNS — against a
|
|
6
|
-
* page served from here, because the alternative (drive whatever is in front of the user) is how a
|
|
7
|
-
* first run ends on a login wall, and a tutorial that fails on step one teaches that Reticle does not
|
|
8
|
-
* work.
|
|
9
|
-
*
|
|
10
|
-
* It carries the real SDK, not a stub. A demo instrumented by something other than the thing being
|
|
11
|
-
* demonstrated proves nothing about the thing being demonstrated.
|
|
12
|
-
*
|
|
13
|
-
* WHY THERE IS NO IMPORT MAP WRITTEN DOWN HERE. The SDK is ESM with bare specifiers, the shipped
|
|
14
|
-
* server has no bundler, and the obvious fix — a hand-written map of specifier to path — is the exact
|
|
15
|
-
* defect this repository keeps paying for: two lists that must agree, where the one nobody updated is
|
|
16
|
-
* the one that breaks. A dependency added to the SDK would leave this map short by one, the page
|
|
17
|
-
* would fail to load a module, and the tour would report that the user's setup is broken.
|
|
18
|
-
*
|
|
19
|
-
* So the map is DISCOVERED. Start at the SDK entry, scan the files beside it for bare specifiers,
|
|
20
|
-
* resolve each one, and repeat. It cannot be short by one, because nothing here knows the names.
|
|
21
|
-
*
|
|
22
|
-
* The walk follows imports out of OUR packages only; a third-party one is mounted whole and not
|
|
23
|
-
* read. That is a deliberate line, not an oversight. Reading zod means walking several thousand
|
|
24
|
-
* files to learn something that has not changed in this repository's lifetime, and it measurably
|
|
25
|
-
* cost about a minute — on the one command whose whole job is a good first impression. The drift
|
|
26
|
-
* this guards against is our own SDK gaining a dependency, which is the thing that actually moves;
|
|
27
|
-
* a third-party leaf that grows a bare runtime import would fail loudly on the page instead, which
|
|
28
|
-
* is a worse message but not a silent one.
|
|
29
|
-
*/
|
|
30
|
-
import { fileURLToPath } from 'node:url';
|
|
31
|
-
import { createServer } from 'node:http';
|
|
32
|
-
import { dirname, join, relative, extname, sep } from 'node:path';
|
|
33
|
-
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
34
|
-
/** Where the tour starts. Everything else on the page is reached from here. */
|
|
35
|
-
const SDK_ENTRY = '@reticlehq/browser';
|
|
36
|
-
/** The signal the demo app fires when it saves — the consequence the tour declares in advance. */
|
|
37
|
-
export const DEMO_SIGNAL = 'demo:saved';
|
|
38
|
-
/** Controls the tour points at. Named here so the page and the run cannot disagree about them. */
|
|
39
|
-
export const DemoTestId = {
|
|
40
|
-
SAVE: 'demo-save',
|
|
41
|
-
NAME: 'demo-name',
|
|
42
|
-
STATUS: 'demo-status',
|
|
43
|
-
};
|
|
44
|
-
/** What the status line says before anything has been proved. */
|
|
45
|
-
const STATUS_BEFORE = 'nothing saved yet';
|
|
46
|
-
/** Bare specifiers this cannot serve and must not try to: the page is a browser. */
|
|
47
|
-
const NOT_SERVABLE = /^node:/;
|
|
48
|
-
/**
|
|
49
|
-
* The packages whose imports are followed. See the note at the top for why the walk stops here.
|
|
50
|
-
*
|
|
51
|
-
* `open-verification` is listed by NAME because it is ours without being in the scope: it left the
|
|
52
|
-
* org to stand on its own as the specification, and matching on `@reticlehq/` alone would silently
|
|
53
|
-
* demote it to an unscanned third-party leaf. Today its only dependency is zod, which core already
|
|
54
|
-
* pulls in, so nothing would have broken yet — which is exactly the kind of gap that is cheap now
|
|
55
|
-
* and expensive on the day the spec grows a second dependency.
|
|
56
|
-
*/
|
|
57
|
-
const OURS = /^(@reticlehq\/|open-verification$)/;
|
|
58
|
-
const JS_CONTENT_TYPE = 'text/javascript; charset=utf-8';
|
|
59
|
-
const HTML_CONTENT_TYPE = 'text/html; charset=utf-8';
|
|
60
|
-
/**
|
|
61
|
-
* A compiled package's own imports, read off disk.
|
|
62
|
-
*
|
|
63
|
-
* Test files are skipped: `dist` carries compiled specs, and those import `vitest` and `node:fs`,
|
|
64
|
-
* which are not part of what a page loads and would send the walk looking for packages that only
|
|
65
|
-
* exist in this repository.
|
|
66
|
-
*/
|
|
67
|
-
function bareSpecifiersIn(dir) {
|
|
68
|
-
const found = new Set();
|
|
69
|
-
const walk = (at) => {
|
|
70
|
-
for (const entry of readdirSync(at, { withFileTypes: true })) {
|
|
71
|
-
const name = entry.name;
|
|
72
|
-
const path = join(at, name);
|
|
73
|
-
if (entry.isDirectory()) {
|
|
74
|
-
if ('node_modules' !== name)
|
|
75
|
-
walk(path);
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
if (!name.endsWith('.js') || name.endsWith('.test.js'))
|
|
79
|
-
continue;
|
|
80
|
-
// `from` as a keyword, not the tail of a string: core's `z.discriminatedUnion('from', [...])`
|
|
81
|
-
// read as an import of everything up to the next quote. A specifier never holds whitespace.
|
|
82
|
-
for (const match of readFileSync(path, 'utf8').matchAll(/(?<![\w$.'"])from\s*'([^.'\s][^'\s]*)'/g)) {
|
|
83
|
-
const spec = match[1];
|
|
84
|
-
if (spec !== undefined && !NOT_SERVABLE.test(spec))
|
|
85
|
-
found.add(spec);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
walk(dir);
|
|
90
|
-
return found;
|
|
91
|
-
}
|
|
92
|
-
/** The directory holding a resolved entry's `package.json` — what has to be mounted whole. */
|
|
93
|
-
function packageRootOf(entryPath) {
|
|
94
|
-
let at = dirname(entryPath);
|
|
95
|
-
for (;;) {
|
|
96
|
-
if (existsSync(join(at, 'package.json')))
|
|
97
|
-
return at;
|
|
98
|
-
const up = dirname(at);
|
|
99
|
-
if (up === at)
|
|
100
|
-
return undefined;
|
|
101
|
-
at = up;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
/**
|
|
105
|
-
* Resolve the SDK and everything it reaches, as URLs a page can fetch.
|
|
106
|
-
*
|
|
107
|
-
* `resolve` is injected so a test can describe a dependency graph without one existing on disk —
|
|
108
|
-
* and because the real one is `import.meta.resolve`, which answers against THIS module's location
|
|
109
|
-
* and so cannot be pointed at a fixture.
|
|
110
|
-
*/
|
|
111
|
-
export function sdkGraph(resolve = defaultResolve) {
|
|
112
|
-
const imports = {};
|
|
113
|
-
const mounts = [];
|
|
114
|
-
const roots = new Map();
|
|
115
|
-
const queue = [SDK_ENTRY];
|
|
116
|
-
const seen = new Set();
|
|
117
|
-
let entry = '';
|
|
118
|
-
while (queue.length > 0) {
|
|
119
|
-
const spec = queue.shift();
|
|
120
|
-
if (spec === undefined || seen.has(spec))
|
|
121
|
-
continue;
|
|
122
|
-
seen.add(spec);
|
|
123
|
-
const entryPath = resolve(spec);
|
|
124
|
-
const root = packageRootOf(entryPath);
|
|
125
|
-
if (root === undefined) {
|
|
126
|
-
throw new Error(`the demo page cannot serve ${spec}: it resolves outside any package`);
|
|
127
|
-
}
|
|
128
|
-
let prefix = roots.get(root);
|
|
129
|
-
if (prefix === undefined) {
|
|
130
|
-
prefix = `/sdk/${String(mounts.length)}/`;
|
|
131
|
-
roots.set(root, prefix);
|
|
132
|
-
mounts.push({ prefix, dir: root });
|
|
133
|
-
}
|
|
134
|
-
const url = prefix + relative(root, entryPath).split(sep).join('/');
|
|
135
|
-
if (SDK_ENTRY === spec)
|
|
136
|
-
entry = url;
|
|
137
|
-
else
|
|
138
|
-
imports[spec] = url;
|
|
139
|
-
if (OURS.test(spec)) {
|
|
140
|
-
for (const next of bareSpecifiersIn(dirname(entryPath)))
|
|
141
|
-
queue.push(next);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
return { imports, mounts, entry };
|
|
145
|
-
}
|
|
146
|
-
function defaultResolve(spec) {
|
|
147
|
-
return fileURLToPath(import.meta.resolve(spec));
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* The demo app, and the one line that makes it verifiable.
|
|
151
|
-
*
|
|
152
|
-
* Saving fires a SIGNAL as well as changing the text. Both are here on purpose: the text is what a
|
|
153
|
-
* person sees, the signal is what the app itself says happened, and the tour waits on the signal
|
|
154
|
-
* because that is the difference it exists to teach — a rendered word can be a coincidence, and an
|
|
155
|
-
* app declaring its own state cannot.
|
|
156
|
-
*/
|
|
157
|
-
export function demoPageHtml(graph, token, bridgeUrl) {
|
|
158
|
-
const importMap = JSON.stringify({ imports: graph.imports });
|
|
159
|
-
const connect = JSON.stringify({ session: 'demo', url: bridgeUrl, token });
|
|
160
|
-
return `<!doctype html>
|
|
161
|
-
<html lang="en"><head><meta charset="utf-8"><title>Reticle demo</title>
|
|
162
|
-
<script type="importmap">${importMap}</script>
|
|
163
|
-
<style>
|
|
164
|
-
body{font:16px/1.5 system-ui,sans-serif;margin:0;padding:2.5rem 1.5rem;max-width:34rem}
|
|
165
|
-
h1{font-size:1.3rem;margin:0 0 .25rem}
|
|
166
|
-
p.lede{color:#555;margin:0 0 2rem}
|
|
167
|
-
label{display:block;font-weight:600;margin:0 0 .4rem}
|
|
168
|
-
input{font:inherit;padding:.5rem .6rem;width:100%;box-sizing:border-box;border:1px solid #bbb;border-radius:6px}
|
|
169
|
-
button{font:inherit;margin-top:1rem;padding:.55rem 1.1rem;border:0;border-radius:6px;background:#111;color:#fff;cursor:pointer}
|
|
170
|
-
p.status{margin-top:1.5rem;padding:.75rem;background:#f4f4f5;border-radius:6px}
|
|
171
|
-
</style></head>
|
|
172
|
-
<body>
|
|
173
|
-
<h1>Reticle demo</h1>
|
|
174
|
-
<p class="lede">A tiny app, instrumented with the real SDK. The tutorial is about to drive it.</p>
|
|
175
|
-
<label for="${DemoTestId.NAME}">Display name</label>
|
|
176
|
-
<input id="${DemoTestId.NAME}" data-testid="${DemoTestId.NAME}" value="Ada">
|
|
177
|
-
<button data-testid="${DemoTestId.SAVE}">Save</button>
|
|
178
|
-
<p class="status" data-testid="${DemoTestId.STATUS}">${STATUS_BEFORE}</p>
|
|
179
|
-
<script type="module">
|
|
180
|
-
import { reticle } from ${JSON.stringify(graph.entry)};
|
|
181
|
-
reticle.connect(${connect});
|
|
182
|
-
const status = document.querySelector('[data-testid="${DemoTestId.STATUS}"]');
|
|
183
|
-
document.querySelector('[data-testid="${DemoTestId.SAVE}"]').addEventListener('click', () => {
|
|
184
|
-
const name = document.querySelector('[data-testid="${DemoTestId.NAME}"]').value;
|
|
185
|
-
status.textContent = 'saved ' + name;
|
|
186
|
-
reticle.signal(${JSON.stringify(DEMO_SIGNAL)}, { name });
|
|
187
|
-
});
|
|
188
|
-
</script>
|
|
189
|
-
</body></html>`;
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Serve the demo on a port the OS picks.
|
|
193
|
-
*
|
|
194
|
-
* Port 0 rather than a chosen number: this starts while a daemon, a dev server and possibly another
|
|
195
|
-
* copy of this tour are already running, and a tutorial whose first act is a port collision has
|
|
196
|
-
* taught the wrong lesson about the product.
|
|
197
|
-
*/
|
|
198
|
-
export function serveDemoPage(html, graph) {
|
|
199
|
-
const server = createServer((req, res) => {
|
|
200
|
-
const path = (req.url ?? '/').split('?')[0] ?? '/';
|
|
201
|
-
if ('/' === path) {
|
|
202
|
-
res.writeHead(200, { 'content-type': HTML_CONTENT_TYPE });
|
|
203
|
-
res.end(html);
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
for (const mount of graph.mounts) {
|
|
207
|
-
if (!path.startsWith(mount.prefix))
|
|
208
|
-
continue;
|
|
209
|
-
const file = join(mount.dir, path.slice(mount.prefix.length));
|
|
210
|
-
// A request that climbed out of the mount is not served, whatever it points at.
|
|
211
|
-
if (!file.startsWith(mount.dir + sep) || !existsSync(file) || statSync(file).isDirectory()) {
|
|
212
|
-
break;
|
|
213
|
-
}
|
|
214
|
-
res.writeHead(200, {
|
|
215
|
-
'content-type': '.js' === extname(file) ? JS_CONTENT_TYPE : 'application/octet-stream',
|
|
216
|
-
});
|
|
217
|
-
res.end(readFileSync(file));
|
|
218
|
-
return;
|
|
219
|
-
}
|
|
220
|
-
res.writeHead(404);
|
|
221
|
-
res.end('not found');
|
|
222
|
-
});
|
|
223
|
-
return new Promise((resolve, reject) => {
|
|
224
|
-
server.once('error', reject);
|
|
225
|
-
server.listen(0, '127.0.0.1', () => {
|
|
226
|
-
const address = server.address();
|
|
227
|
-
if (null === address || 'string' === typeof address) {
|
|
228
|
-
reject(new Error('the demo page could not be served: no port was assigned'));
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
resolve({
|
|
232
|
-
url: `http://127.0.0.1:${String(address.port)}/`,
|
|
233
|
-
close: () => new Promise((done) => {
|
|
234
|
-
server.close(() => {
|
|
235
|
-
done();
|
|
236
|
-
});
|
|
237
|
-
}),
|
|
238
|
-
});
|
|
239
|
-
});
|
|
240
|
-
});
|
|
241
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The tutorial, run rather than printed.
|
|
3
|
-
*
|
|
4
|
-
* `reticle tutorial` described four steps and produced nothing. The last of those steps says that a
|
|
5
|
-
* drive without a verdict has no result — and the tour itself ended without one, which is the lesson
|
|
6
|
-
* taught by counter-example. So the same four steps now execute, against the demo page, and every
|
|
7
|
-
* line the reader sees is a thing that actually happened.
|
|
8
|
-
*
|
|
9
|
-
* The steps are NOT re-listed here. They come from `tutorialScript`, the same source the printed tour
|
|
10
|
-
* reads, because two descriptions of one sequence drift and the one nobody updated is the one
|
|
11
|
-
* somebody follows.
|
|
12
|
-
*
|
|
13
|
-
* Tools are called in-process rather than over the daemon's MCP transport. This command starts the
|
|
14
|
-
* daemon it drives, so it already holds the session; going back out over a socket to reach a server
|
|
15
|
-
* inside this process would add a transport that can fail to a tour whose job is to not fail. The
|
|
16
|
-
* funnel telemetry is unaffected either way — `runTool` is the chokepoint that reports it, and both
|
|
17
|
-
* routes pass through it.
|
|
18
|
-
*/
|
|
19
|
-
export interface DemoTourOptions {
|
|
20
|
-
port: number;
|
|
21
|
-
headless: boolean;
|
|
22
|
-
/** Every line the reader sees, in order. Injected so a test reads the tour instead of a terminal. */
|
|
23
|
-
say: (line: string) => void;
|
|
24
|
-
now?: () => number;
|
|
25
|
-
}
|
|
26
|
-
/** A tour either reached a verdict or it did not; the exit code says which. */
|
|
27
|
-
export interface DemoTourResult {
|
|
28
|
-
code: number;
|
|
29
|
-
verified: string | undefined;
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Run the tour, and report whether it ended at a proof.
|
|
33
|
-
*
|
|
34
|
-
* A step that cannot be taken stops the tour and says which one. Carrying on past a failed step
|
|
35
|
-
* would end at a verdict taken against a page the earlier steps never reached — which is precisely
|
|
36
|
-
* the false green the fourth step is there to warn about.
|
|
37
|
-
*/
|
|
38
|
-
export declare function runDemoTour(options: DemoTourOptions): Promise<DemoTourResult>;
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The tutorial, run rather than printed.
|
|
3
|
-
*
|
|
4
|
-
* `reticle tutorial` described four steps and produced nothing. The last of those steps says that a
|
|
5
|
-
* drive without a verdict has no result — and the tour itself ended without one, which is the lesson
|
|
6
|
-
* taught by counter-example. So the same four steps now execute, against the demo page, and every
|
|
7
|
-
* line the reader sees is a thing that actually happened.
|
|
8
|
-
*
|
|
9
|
-
* The steps are NOT re-listed here. They come from `tutorialScript`, the same source the printed tour
|
|
10
|
-
* reads, because two descriptions of one sequence drift and the one nobody updated is the one
|
|
11
|
-
* somebody follows.
|
|
12
|
-
*
|
|
13
|
-
* Tools are called in-process rather than over the daemon's MCP transport. This command starts the
|
|
14
|
-
* daemon it drives, so it already holds the session; going back out over a socket to reach a server
|
|
15
|
-
* inside this process would add a transport that can fail to a tour whose job is to not fail. The
|
|
16
|
-
* funnel telemetry is unaffected either way — `runTool` is the chokepoint that reports it, and both
|
|
17
|
-
* routes pass through it.
|
|
18
|
-
*/
|
|
19
|
-
import { ReticleTool } from '@reticlehq/core';
|
|
20
|
-
// TOOLS comes through the package barrel rather than from `surface/tools/tools.js` directly. That
|
|
21
|
-
// aggregator composes the tool arrays out of five directories, and anything importing it back is how
|
|
22
|
-
// this package accumulated cycles; the barrel sits above both it and this file, which is the
|
|
23
|
-
// direction that does not close a loop.
|
|
24
|
-
import { start, TOOLS } from '../../../index.js';
|
|
25
|
-
import { runTool } from '../../../surface/tools/invoke-tool.js';
|
|
26
|
-
import { buildVerifyDeps } from '../cli-verify.js';
|
|
27
|
-
import { readOrCreatePairingTokenSync, defaultPairingTokenDir, } from '../../../portal/bridge/pairing-token.js';
|
|
28
|
-
import { tutorialScript, TutorialAudience, demoPlan } from '../tutorial.js';
|
|
29
|
-
import { sdkGraph, demoPageHtml, serveDemoPage, DEMO_SIGNAL } from './demo-page.js';
|
|
30
|
-
/** How long to wait for the demo page to dial the bridge before giving up on it. */
|
|
31
|
-
const SESSION_TIMEOUT_MS = 30_000;
|
|
32
|
-
const SESSION_POLL_MS = 250;
|
|
33
|
-
/** Only `verified: "yes"` is a pass — see the contract every verdict tool here is held to. */
|
|
34
|
-
const PROVED = 'yes';
|
|
35
|
-
function toolNamed(name) {
|
|
36
|
-
const found = TOOLS.find((t) => t.name === name);
|
|
37
|
-
if (found === undefined) {
|
|
38
|
-
throw new Error(`the tutorial cannot run: ${name} is not in the tool registry`);
|
|
39
|
-
}
|
|
40
|
-
return found;
|
|
41
|
-
}
|
|
42
|
-
function asRecord(value) {
|
|
43
|
-
return 'object' === typeof value && null !== value ? value : {};
|
|
44
|
-
}
|
|
45
|
-
function asText(value) {
|
|
46
|
-
return 'string' === typeof value ? value : undefined;
|
|
47
|
-
}
|
|
48
|
-
/** The controls `reticle_query` found, in the shape the safety rule reads them. */
|
|
49
|
-
function controlsIn(result) {
|
|
50
|
-
const raw = asRecord(result)['elements'];
|
|
51
|
-
if (!Array.isArray(raw))
|
|
52
|
-
return [];
|
|
53
|
-
const out = [];
|
|
54
|
-
for (const item of raw) {
|
|
55
|
-
const el = asRecord(item);
|
|
56
|
-
const ref = asText(el['ref']);
|
|
57
|
-
const name = asText(el['name']);
|
|
58
|
-
if (ref === undefined || name === undefined)
|
|
59
|
-
continue;
|
|
60
|
-
const role = asText(el['role']);
|
|
61
|
-
out.push(role === undefined ? { ref, name } : { ref, name, role });
|
|
62
|
-
}
|
|
63
|
-
return out;
|
|
64
|
-
}
|
|
65
|
-
async function waitForSession(running, now) {
|
|
66
|
-
const deadline = now() + SESSION_TIMEOUT_MS;
|
|
67
|
-
while (now() < deadline) {
|
|
68
|
-
if (running.bridge.sessions.count() > 0)
|
|
69
|
-
return true;
|
|
70
|
-
await new Promise((resolve) => setTimeout(resolve, SESSION_POLL_MS));
|
|
71
|
-
}
|
|
72
|
-
return running.bridge.sessions.count() > 0;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Run the tour, and report whether it ended at a proof.
|
|
76
|
-
*
|
|
77
|
-
* A step that cannot be taken stops the tour and says which one. Carrying on past a failed step
|
|
78
|
-
* would end at a verdict taken against a page the earlier steps never reached — which is precisely
|
|
79
|
-
* the false green the fourth step is there to warn about.
|
|
80
|
-
*/
|
|
81
|
-
export async function runDemoTour(options) {
|
|
82
|
-
const now = options.now ?? (() => Date.now());
|
|
83
|
-
const steps = new Map(tutorialScript(TutorialAudience.HUMAN).map((s) => [s.id, s]));
|
|
84
|
-
const announce = (id) => {
|
|
85
|
-
const step = steps.get(id);
|
|
86
|
-
if (step === undefined)
|
|
87
|
-
return;
|
|
88
|
-
options.say('');
|
|
89
|
-
options.say(step.say);
|
|
90
|
-
options.say(` why: ${step.why}`);
|
|
91
|
-
};
|
|
92
|
-
const graph = sdkGraph();
|
|
93
|
-
const token = readOrCreatePairingTokenSync(defaultPairingTokenDir()) ?? '';
|
|
94
|
-
const bridgeUrl = `ws://localhost:${String(options.port)}/reticle`;
|
|
95
|
-
const page = await serveDemoPage(demoPageHtml(graph, token, bridgeUrl), graph);
|
|
96
|
-
let running;
|
|
97
|
-
try {
|
|
98
|
-
running = await start({ port: options.port, driveUrl: page.url, headless: options.headless });
|
|
99
|
-
const deps = buildVerifyDeps(running, process.cwd(), now);
|
|
100
|
-
const call = async (name, args) => await runTool(toolNamed(name), deps, args);
|
|
101
|
-
announce('connect');
|
|
102
|
-
if (!(await waitForSession(running, now))) {
|
|
103
|
-
options.say(' the demo page never dialled the bridge, so there is nothing to show.');
|
|
104
|
-
return { code: 1, verified: undefined };
|
|
105
|
-
}
|
|
106
|
-
options.say(` one session connected: the demo app at ${page.url}`);
|
|
107
|
-
announce('look');
|
|
108
|
-
const snapshot = asRecord(await call(ReticleTool.SNAPSHOT, { mode: 'interactive' }));
|
|
109
|
-
for (const line of (asText(snapshot['tree']) ?? '').split('\n'))
|
|
110
|
-
options.say(` ${line}`);
|
|
111
|
-
announce('declare');
|
|
112
|
-
const found = controlsIn(await call(ReticleTool.QUERY, { role: 'button' }));
|
|
113
|
-
const plan = demoPlan(found);
|
|
114
|
-
if (!plan.ok) {
|
|
115
|
-
options.say(` ${plan.because}`);
|
|
116
|
-
return { code: 1, verified: undefined };
|
|
117
|
-
}
|
|
118
|
-
options.say(` "${plan.name}" is safe to press. Saving should make the app say so itself:`);
|
|
119
|
-
options.say(` reticle_act_and_wait { ref: "${plan.ref}", action: "click", until: {`);
|
|
120
|
-
options.say(` kind: "signal", name: "${DEMO_SIGNAL}" } }`);
|
|
121
|
-
announce('verdict');
|
|
122
|
-
const verdict = asRecord(await call(ReticleTool.ACT_AND_WAIT, {
|
|
123
|
-
ref: plan.ref,
|
|
124
|
-
action: 'click',
|
|
125
|
-
until: { kind: 'signal', name: DEMO_SIGNAL },
|
|
126
|
-
}));
|
|
127
|
-
const verified = asText(verdict['verified']);
|
|
128
|
-
const because = asText(verdict['verifiedReason']) ?? asText(verdict['failureReason']);
|
|
129
|
-
options.say(` verified: ${verified ?? 'unknown'}`);
|
|
130
|
-
if (because !== undefined)
|
|
131
|
-
options.say(` because: ${because}`);
|
|
132
|
-
return { code: PROVED === verified ? 0 : 1, verified };
|
|
133
|
-
}
|
|
134
|
-
finally {
|
|
135
|
-
await page.close();
|
|
136
|
-
await running?.close?.();
|
|
137
|
-
}
|
|
138
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The model binding: the one file in the harness that knows there is a network.
|
|
3
|
-
*
|
|
4
|
-
* Everything about the loop lives in harness.ts against the `ModelDriver` interface, so this file is
|
|
5
|
-
* a translation layer and nothing else. That split is not tidiness — it is what lets the loop be
|
|
6
|
-
* tested against a scripted model with no API key, on every run of the unit gate.
|
|
7
|
-
*
|
|
8
|
-
* It speaks the Messages API over `fetch` rather than through a vendor SDK. The loop is ours (the
|
|
9
|
-
* harness owns the step budget and has to record every call even when a run is cut short), so an SDK
|
|
10
|
-
* would contribute one HTTP POST and a dependency — and this package's dependency list is short on
|
|
11
|
-
* purpose.
|
|
12
|
-
*/
|
|
13
|
-
import type { ModelDriver } from './harness.js';
|
|
14
|
-
/**
|
|
15
|
-
* The default driver model.
|
|
16
|
-
*
|
|
17
|
-
* Deliberately not the largest model available. The harness is not reasoning about business logic; it
|
|
18
|
-
* is exploring an interface and stating consequences, and the verdict is produced by the engine
|
|
19
|
-
* reading what it drove. If finding defects required a frontier model HERE, the engine would not be
|
|
20
|
-
* doing its job — so the model tier is also a standing test of the design.
|
|
21
|
-
*/
|
|
22
|
-
export declare const DEFAULT_HARNESS_MODEL = "claude-sonnet-5";
|
|
23
|
-
export declare const DEFAULT_HARNESS_BASE_URL = "https://api.anthropic.com";
|
|
24
|
-
/** The one call this file makes. Injected so a test can drive the translation with no network. */
|
|
25
|
-
export type HarnessFetch = (url: string, init: {
|
|
26
|
-
method: string;
|
|
27
|
-
headers: Record<string, string>;
|
|
28
|
-
body: string;
|
|
29
|
-
}) => Promise<{
|
|
30
|
-
ok: boolean;
|
|
31
|
-
status: number;
|
|
32
|
-
text(): Promise<string>;
|
|
33
|
-
}>;
|
|
34
|
-
export interface HarnessDriverOptions {
|
|
35
|
-
apiKey: string;
|
|
36
|
-
model?: string;
|
|
37
|
-
baseUrl?: string;
|
|
38
|
-
/** Injected for tests. Defaults to the platform `fetch`. */
|
|
39
|
-
fetch?: HarnessFetch;
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* Read the harness's configuration out of the environment.
|
|
43
|
-
*
|
|
44
|
-
* Returns `undefined` when there is no key, which is the ONLY thing that decides whether the harness
|
|
45
|
-
* is available. Stated as a read rather than a throw because "you have not configured this" is a
|
|
46
|
-
* routine answer a caller offers a way out of, not a failure.
|
|
47
|
-
*/
|
|
48
|
-
export declare function harnessOptionsFromEnv(env: Record<string, string | undefined>): HarnessDriverOptions | undefined;
|
|
49
|
-
/** Build a driver backed by the Messages API. */
|
|
50
|
-
export declare function harnessDriver(options: HarnessDriverOptions): ModelDriver;
|