@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
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Map first: before the Harness pursues a goal, it surveys the app, cheaply and with no model.
|
|
3
|
+
*
|
|
4
|
+
* Persona drives missed goals that sat one page away: the drive committed to a route, a prediction
|
|
5
|
+
* missed, and it graded where it stood. A person new to an app looks around first. The survey reads
|
|
6
|
+
* the start page, presses each nav link and each toggle once (never a field, never a name on the
|
|
7
|
+
* never-pressed list), reads where that leads, and goes back. The map is kept per app and refreshed
|
|
8
|
+
* by every drive's own reads, so the survey runs again only when the map is old.
|
|
9
|
+
*/
|
|
10
|
+
import { PredicateKind, ReticleTool, SnapshotMode, asRecord } from '@reticlehq/core';
|
|
11
|
+
import { HarnessMapLimit, HarnessMapSchema, } from '@reticlehq/core/artifacts';
|
|
12
|
+
import { navLinks, overlayOpen, parseTree, readPage, routeOf, textsOf, toggles, } from './page-tree.js';
|
|
13
|
+
/** Presses the survey may spend: a dashboard's navigation and its toggles, not its rows. */
|
|
14
|
+
export const SURVEY_PRESSES = 12;
|
|
15
|
+
/** A map older than this is surveyed again; a younger one is reused and refreshed from drives. */
|
|
16
|
+
export const MAP_FRESH_MS = 24 * 60 * 60 * 1000;
|
|
17
|
+
/** How long a page gets to settle after a press before it is read. */
|
|
18
|
+
const SETTLE_MS = 3000;
|
|
19
|
+
/**
|
|
20
|
+
* Whether the app was surveyed for the run that started at `since` (or there is no map at all): a
|
|
21
|
+
* run that reused a fresh map does not sweep the whole app again.
|
|
22
|
+
*/
|
|
23
|
+
export function surveyedSince(map, since) {
|
|
24
|
+
return map === undefined || since <= map.surveyedAt;
|
|
25
|
+
}
|
|
26
|
+
/** One page read, as the map keeps it. */
|
|
27
|
+
export function pageFrom(read, at, reachedBy) {
|
|
28
|
+
const lines = parseTree(read.tree);
|
|
29
|
+
const heading = lines.find((l) => 'heading' === l.role && 0 < l.name.length)?.name;
|
|
30
|
+
const clip = (t) => t.slice(0, HarnessMapLimit.TEXT);
|
|
31
|
+
return {
|
|
32
|
+
route: clip(read.route),
|
|
33
|
+
...(heading === undefined ? {} : { heading: clip(heading) }),
|
|
34
|
+
texts: textsOf(lines, HarnessMapLimit.TEXTS).map(clip),
|
|
35
|
+
controls: lines
|
|
36
|
+
.filter((l) => l.ref !== undefined && 0 < l.name.length)
|
|
37
|
+
.slice(0, HarnessMapLimit.CONTROLS)
|
|
38
|
+
.map((l) => clip(`${l.role} "${l.name}"`)),
|
|
39
|
+
...(reachedBy === undefined ? {} : { reachedBy: clip(reachedBy) }),
|
|
40
|
+
at,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** Pages merged by route, the newest read winning, newest first, within the map's bound. */
|
|
44
|
+
export function mergePages(map, pages, surveyedAt = map.surveyedAt) {
|
|
45
|
+
const byRoute = new Map(map.pages.map((p) => [p.route, p]));
|
|
46
|
+
for (const page of pages) {
|
|
47
|
+
const was = byRoute.get(page.route);
|
|
48
|
+
if (was === undefined || was.at <= page.at) {
|
|
49
|
+
const reachedBy = page.reachedBy ?? was?.reachedBy;
|
|
50
|
+
byRoute.set(page.route, { ...page, ...(reachedBy === undefined ? {} : { reachedBy }) });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const pagesOut = [...byRoute.values()]
|
|
54
|
+
.sort((a, b) => b.at - a.at)
|
|
55
|
+
.slice(0, HarnessMapLimit.PAGES);
|
|
56
|
+
return { surveyedAt, pages: pagesOut };
|
|
57
|
+
}
|
|
58
|
+
/** The pages a drive read in full, for refreshing the map from what it saw. */
|
|
59
|
+
export function pagesReadIn(calls, at) {
|
|
60
|
+
return calls.flatMap((call) => {
|
|
61
|
+
// Only a full read of an unobstructed page: a quick read has no text, and a page behind an open
|
|
62
|
+
// menu reads as the menu. Either one once replaced the survey's page and emptied the map.
|
|
63
|
+
if (ReticleTool.SNAPSHOT !== call.name || call.isError)
|
|
64
|
+
return [];
|
|
65
|
+
if (SnapshotMode.FULL !== asRecord(call.args)['mode'])
|
|
66
|
+
return [];
|
|
67
|
+
const result = asRecord(call.result);
|
|
68
|
+
const tree = result['tree'];
|
|
69
|
+
const route = asRecord(result['status'])['route'];
|
|
70
|
+
if ('string' !== typeof tree || 'string' !== typeof route)
|
|
71
|
+
return [];
|
|
72
|
+
if (overlayOpen(parseTree(tree)))
|
|
73
|
+
return [];
|
|
74
|
+
return [pageFrom({ tree, route: routeOf(route) }, at)];
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
const label = (line) => `${line.role} "${line.name}"`;
|
|
78
|
+
async function settle(invoke) {
|
|
79
|
+
try {
|
|
80
|
+
await invoke(ReticleTool.WAIT_FOR, {
|
|
81
|
+
predicate: { kind: PredicateKind.SETTLED },
|
|
82
|
+
timeout_ms: SETTLE_MS,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
/* a page that never settles is read as it stands */
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Survey the app from where the tab stands, and leave the tab where it started. Every press is
|
|
91
|
+
* found again by its name on a fresh read of the start page, since a ref does not survive a reload.
|
|
92
|
+
*/
|
|
93
|
+
export async function surveyApp(invoke, now, presses = SURVEY_PRESSES) {
|
|
94
|
+
let start = await readPage(invoke);
|
|
95
|
+
if (start === undefined)
|
|
96
|
+
return undefined;
|
|
97
|
+
// A menu left open hides the page behind it: reload it once before reading what it offers.
|
|
98
|
+
if (overlayOpen(parseTree(start.tree))) {
|
|
99
|
+
await invoke(ReticleTool.NAVIGATE, { url: start.route }).catch(() => undefined);
|
|
100
|
+
start = (await readPage(invoke)) ?? start;
|
|
101
|
+
}
|
|
102
|
+
const pages = [pageFrom(start, now())];
|
|
103
|
+
const startLines = parseTree(start.tree);
|
|
104
|
+
const targets = [...navLinks(startLines), ...toggles(startLines)]
|
|
105
|
+
.map(label)
|
|
106
|
+
.filter((name, i, all) => all.indexOf(name) === i)
|
|
107
|
+
.slice(0, presses);
|
|
108
|
+
for (const target of targets) {
|
|
109
|
+
try {
|
|
110
|
+
const here = await readPage(invoke);
|
|
111
|
+
const line = parseTree(here?.tree ?? '').find((l) => l.ref !== undefined && label(l) === target);
|
|
112
|
+
if (line?.ref === undefined)
|
|
113
|
+
continue;
|
|
114
|
+
await invoke(ReticleTool.ACT, { ref: line.ref, action: 'click' });
|
|
115
|
+
await settle(invoke);
|
|
116
|
+
const read = await readPage(invoke);
|
|
117
|
+
if (read !== undefined)
|
|
118
|
+
pages.push(pageFrom(read, now(), target));
|
|
119
|
+
if (read !== undefined && read.route !== start.route)
|
|
120
|
+
await invoke(ReticleTool.NAVIGATE, { url: start.route });
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
/* a press that fails is a page the map does not have */
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return mergePages({ surveyedAt: now(), pages: [] }, pages, now());
|
|
127
|
+
}
|
|
128
|
+
/** The map from its file's text, or undefined when there is none or it does not parse. */
|
|
129
|
+
export function parseMap(text) {
|
|
130
|
+
if (text === undefined)
|
|
131
|
+
return undefined;
|
|
132
|
+
try {
|
|
133
|
+
const parsed = HarnessMapSchema.safeParse(JSON.parse(text));
|
|
134
|
+
return parsed.success ? parsed.data : undefined;
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return undefined;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/** The map as the platform takes it: pages only, the fields its engine reads. */
|
|
141
|
+
export function mapForPlatform(map) {
|
|
142
|
+
return {
|
|
143
|
+
pages: map.pages.map((p) => ({
|
|
144
|
+
route: p.route,
|
|
145
|
+
...(p.heading === undefined ? {} : { heading: p.heading }),
|
|
146
|
+
texts: p.texts,
|
|
147
|
+
controls: p.controls,
|
|
148
|
+
})),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
@@ -1,77 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* What to type into a field,
|
|
2
|
+
* What to type into a text field, from its label alone.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* and every decision it makes (which tool, which element, what should follow) is a decision, not a
|
|
7
|
-
* composition. But a text field is a composition. "A card number", "a search term that returns
|
|
8
|
-
* results", "a description a human would write" cannot be enumerated from the page, and a label-keyed
|
|
9
|
-
* table of guesses is what stands in for them today.
|
|
10
|
-
*
|
|
11
|
-
* ## Why this is escalation rather than partnership
|
|
12
|
-
*
|
|
13
|
-
* Put a generating model in the per-turn loop and you pay its per-turn tax on every step, which is
|
|
14
|
-
* the cost the cheap driver exists to avoid. Typing is a small minority of what a drive does —
|
|
15
|
-
* clicks and navigations are the overwhelming majority — so the model is called for the few steps
|
|
16
|
-
* that compose text, never for the many that select, and a drive with no text fields never calls it
|
|
17
|
-
* at all.
|
|
18
|
-
*
|
|
19
|
-
* ## Why it is cached, and cached where it is
|
|
20
|
-
*
|
|
21
|
-
* A generated value is paid for ONCE and then belongs to the project: the same field on the same
|
|
22
|
-
* app wants the same value tomorrow, and a replay must send exactly what the recording sent or it
|
|
23
|
-
* is not a replay. Writing them to `.reticle` makes the second drive free, makes the values
|
|
24
|
-
* reviewable by a human who can correct a bad one by hand, and keeps them out of the model's way
|
|
25
|
-
* entirely. It is the same economics as the flows themselves: pay once, replay forever.
|
|
26
|
-
*
|
|
27
|
-
* ## What it must never do
|
|
28
|
-
*
|
|
29
|
-
* Fill a slot, never propose a call. The driver decides what to click and what to claim; this
|
|
30
|
-
* answers one question — "what text goes in this box" — and a wrong answer costs one act, not a
|
|
31
|
-
* wrong verdict. Nothing here touches what is judged.
|
|
32
|
-
*/
|
|
33
|
-
import { type HarnessDriverOptions } from './driver.js';
|
|
34
|
-
import { type OpenAiDriverOptions } from './openai-driver.js';
|
|
35
|
-
/** What the caller must be able to do for values to survive past this drive. */
|
|
36
|
-
export interface FillCache {
|
|
37
|
-
get(label: string): string | undefined;
|
|
38
|
-
set(label: string, value: string): void;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* The fallback, and still the answer for most fields.
|
|
42
|
-
*
|
|
43
|
-
* An exploration drive needs PLAUSIBLE input, not creative input: the engine is judging what the app
|
|
44
|
-
* did with the value, not the value. A field that rejects everything here is itself worth finding,
|
|
45
|
-
* and shows up as an act that did not settle.
|
|
4
|
+
* Used by the crawl, which fills a field to see what the app does with it and never needs the value
|
|
5
|
+
* to be clever. The Harness fills fields on the platform, where its engine decides them.
|
|
46
6
|
*/
|
|
47
7
|
export declare function heuristicFillValue(label: string): string;
|
|
48
|
-
/**
|
|
49
|
-
* Whether a label is worth spending a model call on.
|
|
50
|
-
*
|
|
51
|
-
* The heuristic is RIGHT about an email box and an amount box, and a generated "john@example.com"
|
|
52
|
-
* is not an improvement on `harness@reticle.dev`. What it cannot do is a field whose label it does
|
|
53
|
-
* not recognise at all, where it falls back to typing the words "reticle harness" into whatever the
|
|
54
|
-
* app asked for. That fallback is the whole of what generation is for.
|
|
55
|
-
*/
|
|
56
|
-
export declare function needsGeneration(label: string): boolean;
|
|
57
|
-
/**
|
|
58
|
-
* The seam the driver calls: a label in, a value out, always.
|
|
59
|
-
*
|
|
60
|
-
* Three layers, cheapest first, and the expensive one is skipped entirely unless the two above it
|
|
61
|
-
* have nothing better than "type the words reticle harness into this box".
|
|
62
|
-
*/
|
|
63
|
-
export declare function fillValues(deps: {
|
|
64
|
-
cache?: FillCache;
|
|
65
|
-
/** GPT, the generator a Jev drive pairs with. Asked ahead of `generator` when both are set. */
|
|
66
|
-
openai?: OpenAiDriverOptions;
|
|
67
|
-
/** Anthropic, for a machine that holds only that key. */
|
|
68
|
-
generator?: HarnessDriverOptions;
|
|
69
|
-
/** One line about where the drive is, so a value suits the page it is typed on. */
|
|
70
|
-
context?: () => string;
|
|
71
|
-
/**
|
|
72
|
-
* A value the user SUPPLIED for this field — the same `RETICLE_SECRET_<FIELD>` replay reads for
|
|
73
|
-
* a redacted one. Checked first so a drive gets past a login, and never cached: the cache is a
|
|
74
|
-
* file on disk.
|
|
75
|
-
*/
|
|
76
|
-
secret?: (label: string) => string | undefined;
|
|
77
|
-
}): (label: string) => Promise<string>;
|
|
@@ -1,55 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* What to type into a field,
|
|
2
|
+
* What to type into a text field, from its label alone.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* and every decision it makes (which tool, which element, what should follow) is a decision, not a
|
|
7
|
-
* composition. But a text field is a composition. "A card number", "a search term that returns
|
|
8
|
-
* results", "a description a human would write" cannot be enumerated from the page, and a label-keyed
|
|
9
|
-
* table of guesses is what stands in for them today.
|
|
10
|
-
*
|
|
11
|
-
* ## Why this is escalation rather than partnership
|
|
12
|
-
*
|
|
13
|
-
* Put a generating model in the per-turn loop and you pay its per-turn tax on every step, which is
|
|
14
|
-
* the cost the cheap driver exists to avoid. Typing is a small minority of what a drive does —
|
|
15
|
-
* clicks and navigations are the overwhelming majority — so the model is called for the few steps
|
|
16
|
-
* that compose text, never for the many that select, and a drive with no text fields never calls it
|
|
17
|
-
* at all.
|
|
18
|
-
*
|
|
19
|
-
* ## Why it is cached, and cached where it is
|
|
20
|
-
*
|
|
21
|
-
* A generated value is paid for ONCE and then belongs to the project: the same field on the same
|
|
22
|
-
* app wants the same value tomorrow, and a replay must send exactly what the recording sent or it
|
|
23
|
-
* is not a replay. Writing them to `.reticle` makes the second drive free, makes the values
|
|
24
|
-
* reviewable by a human who can correct a bad one by hand, and keeps them out of the model's way
|
|
25
|
-
* entirely. It is the same economics as the flows themselves: pay once, replay forever.
|
|
26
|
-
*
|
|
27
|
-
* ## What it must never do
|
|
28
|
-
*
|
|
29
|
-
* Fill a slot, never propose a call. The driver decides what to click and what to claim; this
|
|
30
|
-
* answers one question — "what text goes in this box" — and a wrong answer costs one act, not a
|
|
31
|
-
* wrong verdict. Nothing here touches what is judged.
|
|
32
|
-
*/
|
|
33
|
-
import { DEFAULT_HARNESS_BASE_URL, } from './driver.js';
|
|
34
|
-
import { DEFAULT_OPENAI_MODEL, OPENAI_REASONING_EFFORT, openAiCompletionsUrl, } from './openai-driver.js';
|
|
35
|
-
/** Deliberately small. A field value is a phrase; anything longer is the model misunderstanding. */
|
|
36
|
-
const MAX_TOKENS = 64;
|
|
37
|
-
const ANTHROPIC_VERSION = '2023-06-01';
|
|
38
|
-
const MESSAGES_PATH = '/v1/messages';
|
|
39
|
-
/**
|
|
40
|
-
* How many values one drive will generate.
|
|
41
|
-
*
|
|
42
|
-
* The cache makes the steady state nearly free, but the FIRST drive on a form-heavy app is the one
|
|
43
|
-
* that pays, and an uncapped loop on a page with forty inputs is a bill nobody agreed to. Past the
|
|
44
|
-
* cap the heuristic answers, which is what every drive used before this existed.
|
|
45
|
-
*/
|
|
46
|
-
const MAX_PER_DRIVE = 12;
|
|
47
|
-
/**
|
|
48
|
-
* The fallback, and still the answer for most fields.
|
|
49
|
-
*
|
|
50
|
-
* An exploration drive needs PLAUSIBLE input, not creative input: the engine is judging what the app
|
|
51
|
-
* did with the value, not the value. A field that rejects everything here is itself worth finding,
|
|
52
|
-
* and shows up as an act that did not settle.
|
|
4
|
+
* Used by the crawl, which fills a field to see what the app does with it and never needs the value
|
|
5
|
+
* to be clever. The Harness fills fields on the platform, where its engine decides them.
|
|
53
6
|
*/
|
|
54
7
|
export function heuristicFillValue(label) {
|
|
55
8
|
const l = label.toLowerCase();
|
|
@@ -71,122 +24,3 @@ export function heuristicFillValue(label) {
|
|
|
71
24
|
return '42';
|
|
72
25
|
return 'reticle harness';
|
|
73
26
|
}
|
|
74
|
-
/**
|
|
75
|
-
* Whether a label is worth spending a model call on.
|
|
76
|
-
*
|
|
77
|
-
* The heuristic is RIGHT about an email box and an amount box, and a generated "john@example.com"
|
|
78
|
-
* is not an improvement on `harness@reticle.dev`. What it cannot do is a field whose label it does
|
|
79
|
-
* not recognise at all, where it falls back to typing the words "reticle harness" into whatever the
|
|
80
|
-
* app asked for. That fallback is the whole of what generation is for.
|
|
81
|
-
*/
|
|
82
|
-
export function needsGeneration(label) {
|
|
83
|
-
return heuristicFillValue(label) === heuristicFillValue('');
|
|
84
|
-
}
|
|
85
|
-
const PROMPT = (label, context) => `A test harness is filling in a form field on a web application so it can check what the app does with the input.\n\n` +
|
|
86
|
-
`The field is labelled: "${label}"\n` +
|
|
87
|
-
`${context}\n\n` +
|
|
88
|
-
`Reply with ONLY the value to type. No quotes, no explanation, no markdown. It must be something a ` +
|
|
89
|
-
`real user would plausibly enter, and short. If the field wants an identifier or a code, invent a ` +
|
|
90
|
-
`well-formed one.`;
|
|
91
|
-
/**
|
|
92
|
-
* A model's one-line answer as a field value, or nothing. A model asked for one value occasionally
|
|
93
|
-
* answers with a sentence about the value; anything long enough to be prose is not a field value,
|
|
94
|
-
* and typing prose proves nothing about the app.
|
|
95
|
-
*/
|
|
96
|
-
function asValue(raw) {
|
|
97
|
-
const text = raw?.trim().split('\n')[0];
|
|
98
|
-
if (text === undefined || 0 === text.length)
|
|
99
|
-
return undefined;
|
|
100
|
-
return 80 < text.length ? undefined : text.replace(/^["']|["']$/g, '');
|
|
101
|
-
}
|
|
102
|
-
/** One string from GPT over Chat Completions — directly, or through the platform with its key. */
|
|
103
|
-
async function generateWithOpenAi(options, label, context) {
|
|
104
|
-
const call = options.fetch ?? ((url, init) => fetch(url, init));
|
|
105
|
-
try {
|
|
106
|
-
const res = await call(openAiCompletionsUrl(options), {
|
|
107
|
-
method: 'POST',
|
|
108
|
-
headers: { 'content-type': 'application/json', authorization: `Bearer ${options.apiKey}` },
|
|
109
|
-
body: JSON.stringify({
|
|
110
|
-
model: options.model ?? DEFAULT_OPENAI_MODEL,
|
|
111
|
-
max_completion_tokens: MAX_TOKENS,
|
|
112
|
-
reasoning_effort: OPENAI_REASONING_EFFORT,
|
|
113
|
-
messages: [{ role: 'user', content: PROMPT(label, context) }],
|
|
114
|
-
}),
|
|
115
|
-
});
|
|
116
|
-
if (!res.ok)
|
|
117
|
-
return undefined;
|
|
118
|
-
const parsed = JSON.parse(await res.text());
|
|
119
|
-
return asValue(parsed.choices?.[0]?.message?.content ?? undefined);
|
|
120
|
-
}
|
|
121
|
-
catch {
|
|
122
|
-
return undefined;
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
/** One string from a generating model, or nothing. Never throws: a drive must not fail over a field. */
|
|
126
|
-
async function generateOne(options, label, context) {
|
|
127
|
-
const call = options.fetch ?? ((url, init) => fetch(url, init));
|
|
128
|
-
const baseUrl = options.baseUrl ?? DEFAULT_HARNESS_BASE_URL;
|
|
129
|
-
try {
|
|
130
|
-
const res = await call(`${baseUrl}${MESSAGES_PATH}`, {
|
|
131
|
-
method: 'POST',
|
|
132
|
-
headers: {
|
|
133
|
-
'content-type': 'application/json',
|
|
134
|
-
'x-api-key': options.apiKey,
|
|
135
|
-
'anthropic-version': ANTHROPIC_VERSION,
|
|
136
|
-
},
|
|
137
|
-
body: JSON.stringify({
|
|
138
|
-
model: options.model ?? 'claude-sonnet-5',
|
|
139
|
-
max_tokens: MAX_TOKENS,
|
|
140
|
-
messages: [{ role: 'user', content: PROMPT(label, context) }],
|
|
141
|
-
}),
|
|
142
|
-
});
|
|
143
|
-
if (!res.ok)
|
|
144
|
-
return undefined;
|
|
145
|
-
const parsed = JSON.parse(await res.text());
|
|
146
|
-
const content = parsed.content ?? [];
|
|
147
|
-
return asValue(content
|
|
148
|
-
.filter((block) => 'text' === block.type)
|
|
149
|
-
.map((block) => block.text ?? '')
|
|
150
|
-
.join(''));
|
|
151
|
-
}
|
|
152
|
-
catch {
|
|
153
|
-
// Offline, refused, rate-limited, malformed. All the same answer: use the heuristic.
|
|
154
|
-
return undefined;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
/**
|
|
158
|
-
* The seam the driver calls: a label in, a value out, always.
|
|
159
|
-
*
|
|
160
|
-
* Three layers, cheapest first, and the expensive one is skipped entirely unless the two above it
|
|
161
|
-
* have nothing better than "type the words reticle harness into this box".
|
|
162
|
-
*/
|
|
163
|
-
export function fillValues(deps) {
|
|
164
|
-
let spent = 0;
|
|
165
|
-
return async (label) => {
|
|
166
|
-
const supplied = deps.secret?.(label);
|
|
167
|
-
if (supplied !== undefined && supplied.length > 0)
|
|
168
|
-
return supplied;
|
|
169
|
-
const cached = deps.cache?.get(label);
|
|
170
|
-
if (cached !== undefined)
|
|
171
|
-
return cached;
|
|
172
|
-
const fallback = heuristicFillValue(label);
|
|
173
|
-
const { openai, generator } = deps;
|
|
174
|
-
if ((openai === undefined && generator === undefined) ||
|
|
175
|
-
!needsGeneration(label) ||
|
|
176
|
-
MAX_PER_DRIVE <= spent)
|
|
177
|
-
return fallback;
|
|
178
|
-
spent += 1;
|
|
179
|
-
const context = deps.context?.() ?? '';
|
|
180
|
-
const generated = openai !== undefined
|
|
181
|
-
? await generateWithOpenAi(openai, label, context)
|
|
182
|
-
: generator !== undefined
|
|
183
|
-
? await generateOne(generator, label, context)
|
|
184
|
-
: undefined;
|
|
185
|
-
if (generated === undefined)
|
|
186
|
-
return fallback;
|
|
187
|
-
// Cached under the LABEL, not the ref: refs expire with the page, labels are what the next drive
|
|
188
|
-
// and every replay will meet again.
|
|
189
|
-
deps.cache?.set(label, generated);
|
|
190
|
-
return generated;
|
|
191
|
-
};
|
|
192
|
-
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/** One goal: text the page must show, or — when the persona negated it — must not. */
|
|
2
|
+
export interface Goal {
|
|
3
|
+
text: string;
|
|
4
|
+
/** The persona said the page must NOT show it: an absence goal, graded by asserting it is not there. */
|
|
5
|
+
absent?: true;
|
|
6
|
+
}
|
|
7
|
+
export interface GoalCheck {
|
|
8
|
+
/** The text that had to be on the page (or, for an absence goal, not on it). */
|
|
9
|
+
text: string;
|
|
10
|
+
/** Set for an absence goal. */
|
|
11
|
+
absent?: true;
|
|
12
|
+
/** The engine's verdict on it: only `yes` is proved. */
|
|
13
|
+
verified: string;
|
|
14
|
+
/** Why it was not checked, when it was not. */
|
|
15
|
+
reason?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Whether `shown` — one element's text, maybe cut short with "…" — is text the Harness wrote itself
|
|
19
|
+
* rather than the app: one of `own` (its journey, the names of the plan and the flows it saved), in
|
|
20
|
+
* full or cut short, holding `goal`. A Harness asked to rename a plan stopped on the /plans list and
|
|
21
|
+
* was graded PROVED on every quote: the plan it had just saved was named after the journey, and the
|
|
22
|
+
* journey quoted them all. An element showing exactly the goal is the app's, whoever else wrote it.
|
|
23
|
+
*/
|
|
24
|
+
export declare function writtenByHarness(shown: string, goal: string, own: readonly string[]): boolean;
|
|
25
|
+
/** The end state a goal quotes: its last quoted text that it does not negate. */
|
|
26
|
+
export declare function endOf(goal: string): string | undefined;
|
|
27
|
+
/** The observable goals in a persona: whatever it quoted, each marked absent when it was negated. */
|
|
28
|
+
export declare function parseGoals(persona: string | undefined): Goal[];
|
|
29
|
+
/** The texts a persona says must be on the page: the quoted goals it did not negate. */
|
|
30
|
+
export declare function goalsIn(persona: string | undefined): string[];
|
|
31
|
+
/**
|
|
32
|
+
* Check each goal on the page the drive ended on, recording ONE assert for the drive.
|
|
33
|
+
*
|
|
34
|
+
* Each quote used to be its own assert, and every assert is a check in the drive's run, so a goal
|
|
35
|
+
* that quotes where it starts ("from "Count is 0" to "Count is 1"") recorded a "no" for the start
|
|
36
|
+
* text a working app had rightly replaced, and the run synced as a failing flow. The page is let
|
|
37
|
+
* settle, read once, and each goal is scrolled to by its text — one below the fold read `unknown`
|
|
38
|
+
* on a drive that never scrolled. The one recorded assert covers the goals found. A goal not found
|
|
39
|
+
* is undecided, not failed: nothing here knows the drive reached the page that would show it. A
|
|
40
|
+
* check that cannot run is `unknown`, never skipped.
|
|
41
|
+
*/
|
|
42
|
+
export declare function checkGoals(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>, goals: readonly (string | Goal)[],
|
|
43
|
+
/** The page as it read before the drive: a goal it already showed proves nothing at the end. */
|
|
44
|
+
opening?: string,
|
|
45
|
+
/** Text the Harness wrote itself (its journey, its plan's and flows' names): never evidence. */
|
|
46
|
+
own?: readonly string[]): Promise<GoalCheck[]>;
|
|
47
|
+
/**
|
|
48
|
+
* Whether the page shows `text` once it has settled, scrolled to if need be — how a person looks
|
|
49
|
+
* for something before saying it is not there. Records no check.
|
|
50
|
+
*/
|
|
51
|
+
export declare function lookFor(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>, text: string,
|
|
52
|
+
/** Text the Harness wrote itself: a match inside it is not the page showing the goal. */
|
|
53
|
+
own?: readonly string[]): Promise<boolean>;
|
|
54
|
+
/** The page as it reads now, or undefined when it cannot be read. Taken before a drive starts. */
|
|
55
|
+
export declare function readOpening(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>): Promise<string | undefined>;
|
|
56
|
+
/**
|
|
57
|
+
* The end state the caller declared, checked like any assert.
|
|
58
|
+
*
|
|
59
|
+
* Quoted text only proves some words are on the last page, which is how a drive that never used the
|
|
60
|
+
* app could pass: from the field, "it only checks that I have certain titles on my page". An `expect`
|
|
61
|
+
* names an OUTCOME — a route reached, a request made, state changed — in the same predicate grammar
|
|
62
|
+
* as reticle_assert, and is graded the same way. A check that cannot run is `unknown`.
|
|
63
|
+
*/
|
|
64
|
+
export declare function checkExpect(invoke: (name: string, args: Record<string, unknown>) => Promise<unknown>, predicate: Record<string, unknown>): Promise<GoalCheck>;
|
|
65
|
+
/** Whether the drive met the goals it was given: undefined when it was given none. */
|
|
66
|
+
export declare function goalsMet(checks: readonly GoalCheck[]): boolean | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Whether the drive met its goal, as the answer and the run report it. The driver's own `goalMet`
|
|
69
|
+
* is its word, never evidence: a run answered `goalMet: true` after zero actions on a tab that
|
|
70
|
+
* already showed the end state, and another with both its goals `unknown`. With goals, met exactly
|
|
71
|
+
* when every one was proved; with none, the driver's word stands, and only after an action ran.
|
|
72
|
+
* Undefined when nothing judged it.
|
|
73
|
+
*/
|
|
74
|
+
export declare function goalOfDrive(claimed: boolean | undefined, checks: readonly GoalCheck[], acted: boolean): boolean | undefined;
|
|
75
|
+
/** One line naming the goals the drive did not prove, or undefined when it proved them all. */
|
|
76
|
+
export declare function unprovedGoals(checks: readonly GoalCheck[]): string | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* The goals a drive is graded on: every quote, less a value the drive typed — an input, never
|
|
79
|
+
* evidence — except the journey's end (its last text to show), which stays even when typed: saving
|
|
80
|
+
* "Order 7" and then seeing it listed is the journey. Absence goals always stay.
|
|
81
|
+
*/
|
|
82
|
+
export declare function endGoalsOf(goals: readonly Goal[], typed: readonly string[]): Goal[];
|