@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
|
@@ -35,8 +35,13 @@ export function editDistance(a, b) {
|
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
37
|
* The closest present testid to a missing one, by case-insensitive edit distance, ties broken
|
|
38
|
-
* by shortest length then lexically
|
|
39
|
-
*
|
|
38
|
+
* by shortest length then lexically — when it is close enough to be a rename. Null when nothing
|
|
39
|
+
* present is, so a drift record names a fix only when one plausibly exists.
|
|
40
|
+
*
|
|
41
|
+
* It used to name the closest survivor however far away it was. A replay that started signed out
|
|
42
|
+
* missed `compose-prompt` on the login screen and advised rebinding it to `login-submit`: eleven
|
|
43
|
+
* edits away, a different control on a different page, offered as the fix. Half the longer name is
|
|
44
|
+
* the ceiling — `chat-send` → `chat-submit` and `checkout-btn` → `checkout-button` stay in.
|
|
40
45
|
*/
|
|
41
46
|
export function nearestTestid(missing, present) {
|
|
42
47
|
let best = null;
|
|
@@ -53,7 +58,9 @@ export function nearestTestid(missing, present) {
|
|
|
53
58
|
bestDistance = distance;
|
|
54
59
|
}
|
|
55
60
|
}
|
|
56
|
-
|
|
61
|
+
if (null === best)
|
|
62
|
+
return null;
|
|
63
|
+
return bestDistance <= Math.max(missing.length, best.length) / 2 ? best : null;
|
|
57
64
|
}
|
|
58
65
|
/**
|
|
59
66
|
* Bounded settle for anchor re-resolution. A testid step queries the live DOM for the anchor; if a
|
|
@@ -139,6 +146,34 @@ export function testidDrift(value, hint) {
|
|
|
139
146
|
drift.ambiguous = true;
|
|
140
147
|
return drift;
|
|
141
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* How an anchor is ADDRESSED — the sentence that names it, and the label a result row carries.
|
|
151
|
+
*
|
|
152
|
+
* Two different strings, and neither can be derived from the other: `value` is a raw testid for one
|
|
153
|
+
* anchor kind and a human-readable label for the others, so one sentence cannot name both. Calling a
|
|
154
|
+
* role anchor `testid "button "View result""` sends the reader to edit a locator that does not exist
|
|
155
|
+
* on that step, which is the same misdirection the drift reason exists to remove.
|
|
156
|
+
*
|
|
157
|
+
* Derived from the anchor rather than passed in by the caller. The first version of the role fix took
|
|
158
|
+
* a `described` argument and wrote `ambiguousAnchorDrift(label, n, \`role anchor ${label}\`)` — the
|
|
159
|
+
* same string twice, so the `anchor` field and the sentence could drift apart with nothing to catch
|
|
160
|
+
* it, and the next anchor kind would have had to remember the convention on its own.
|
|
161
|
+
*/
|
|
162
|
+
function anchorAddress(anchor) {
|
|
163
|
+
if (anchor.kind === AnchorKind.TESTID) {
|
|
164
|
+
return { described: `testid "${anchor.value}"`, label: anchor.value };
|
|
165
|
+
}
|
|
166
|
+
if (anchor.kind === AnchorKind.ROLE) {
|
|
167
|
+
// Kind named explicitly: `button "View result"` alone reads as a testid that happens to contain
|
|
168
|
+
// a space, and the reader would go looking for a locator nothing on the step declares.
|
|
169
|
+
const label = `${anchor.role} "${String(anchor.name)}"`;
|
|
170
|
+
return { described: `role anchor ${label}`, label };
|
|
171
|
+
}
|
|
172
|
+
// A component needs no such qualifier: `componentLabel` already answers
|
|
173
|
+
// `NewDeployButton@Deployments.tsx:107`, which no reader mistakes for a testid.
|
|
174
|
+
const label = anchor.kind === AnchorKind.COMPONENT ? componentLabel(anchor) : anchorLabel(anchor);
|
|
175
|
+
return { described: `anchor ${label}`, label };
|
|
176
|
+
}
|
|
142
177
|
/**
|
|
143
178
|
* Build the drift for a step whose anchor matched MORE THAN ONE live element.
|
|
144
179
|
*
|
|
@@ -149,16 +184,73 @@ export function testidDrift(value, hint) {
|
|
|
149
184
|
* `nearest` is null on purpose. There is no nearest: the anchor was found, several times over, and
|
|
150
185
|
* proposing one of the matches as "the" match would re-make the guess this reason exists to stop.
|
|
151
186
|
* The fix is a NARROWER anchor, and only a human or an agent looking at the page can choose it.
|
|
187
|
+
*
|
|
188
|
+
* Private: callers reach it through `ambiguityDrift`, which is the RULE rather than the record.
|
|
189
|
+
* Exported, it had three call sites and a fourth anchor kind that never called it at all.
|
|
152
190
|
*/
|
|
153
|
-
|
|
191
|
+
function ambiguousAnchorDrift(anchor, matches) {
|
|
192
|
+
const { described, label } = anchorAddress(anchor);
|
|
154
193
|
return {
|
|
155
194
|
reasonKind: DriftReason.ANCHOR_AMBIGUOUS,
|
|
156
|
-
reason:
|
|
157
|
-
anchor:
|
|
195
|
+
reason: `${described} matched ${String(matches)} live elements — which one the recording meant is not decidable; anchor this step to something unique`,
|
|
196
|
+
anchor: label,
|
|
158
197
|
nearest: null,
|
|
159
198
|
ambiguous: true,
|
|
160
199
|
};
|
|
161
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* The ambiguity rule itself: an anchor that matched several live elements is DRIFT, never a guess.
|
|
203
|
+
*
|
|
204
|
+
* Returns null when the locator named zero or one element, so a runner reads it as
|
|
205
|
+
* `const drift = ambiguityDrift(anchor, refs); if (drift !== null) return { …, ok: false, drift };`
|
|
206
|
+
* and never has to reconstruct the record itself.
|
|
207
|
+
*
|
|
208
|
+
* ONE function, because three anchor kinds ask the same question and each used to answer for itself.
|
|
209
|
+
* testid was fixed first and role second, and role's fix was written as a copy of testid's — so "is
|
|
210
|
+
* this ambiguous" had two answers and COMPONENT had none at all. `runComponentStep` took `refs[0]`,
|
|
211
|
+
* dispatched and returned `ok: true` whenever `by:'component'` matched several elements, which is the
|
|
212
|
+
* ordinary case for a component rendered once per row (a table row's action button). The verdict
|
|
213
|
+
* reads `drift` and `ok` and nothing else, so that green was indistinguishable from a replay that did
|
|
214
|
+
* what it did before — the #1227 defect, one anchor kind over.
|
|
215
|
+
*
|
|
216
|
+
* The caller must not dispatch before checking. Acting and then reporting drift would leave the app
|
|
217
|
+
* changed by a click nobody can attribute, which is worse than the ambiguity it reports.
|
|
218
|
+
*/
|
|
219
|
+
export function ambiguityDrift(anchor, refs) {
|
|
220
|
+
return refs.length > 1 && refFor(anchor, refs) === undefined
|
|
221
|
+
? ambiguousAnchorDrift(anchor, refs.length)
|
|
222
|
+
: null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* The one ref a step means: the only match, or the recorded position among same-named controls
|
|
226
|
+
* while the page still has exactly as many of them as when it was recorded. Otherwise undefined.
|
|
227
|
+
*/
|
|
228
|
+
export function refFor(anchor, refs) {
|
|
229
|
+
if (1 === refs.length)
|
|
230
|
+
return refs[0];
|
|
231
|
+
const { nth, of } = { ...anchor };
|
|
232
|
+
return 'number' === typeof nth && of === refs.length ? refs[nth] : undefined;
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* The anchor as the stale-ref RETRY found it: one ref to dispatch at, an ambiguity to report, or
|
|
236
|
+
* neither.
|
|
237
|
+
*
|
|
238
|
+
* The same rule as `ambiguityDrift`, one layer deeper, and shared for the same reason: a re-render
|
|
239
|
+
* can turn an unambiguous anchor into an ambiguous one between the two dispatches, and dispatching
|
|
240
|
+
* at the first of the new matches would re-make the guess the caller's own check exists to refuse —
|
|
241
|
+
* in a place the caller cannot see. Written once so the three runners cannot answer it differently,
|
|
242
|
+
* which is how the component runner came to have no answer at all.
|
|
243
|
+
*
|
|
244
|
+
* `refs[0]` is read only after `ambiguityDrift` has cleared the several-match case, so the only way
|
|
245
|
+
* it is undefined here is zero matches.
|
|
246
|
+
*/
|
|
247
|
+
export function reresolved(anchor, refs) {
|
|
248
|
+
const drift = ambiguityDrift(anchor, refs);
|
|
249
|
+
if (drift !== null)
|
|
250
|
+
return { drift };
|
|
251
|
+
const ref = refFor(anchor, refs);
|
|
252
|
+
return ref === undefined ? undefined : { ref };
|
|
253
|
+
}
|
|
162
254
|
/**
|
|
163
255
|
* Build the drift for a step whose `expect.element` testid was absent after the action ran.
|
|
164
256
|
*
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Contradiction, FlowStepResult } from '@reticlehq/core';
|
|
2
|
+
/** Cross-step findings belong to no single step; -1 is the address the suite verdict already uses. */
|
|
3
|
+
export declare const CROSS_STEP_INDEX = -1;
|
|
4
|
+
/**
|
|
5
|
+
* The contradictions the whole-span pass found that no individual step could.
|
|
6
|
+
*
|
|
7
|
+
* A step's window closes when the step ends, so a request fired at step 2 and still unanswered at
|
|
8
|
+
* step 5 is invisible to every per-step window: step 2's closed before the answer came and step 5
|
|
9
|
+
* never saw it start. Re-running the detectors over the whole replay span finds those — and re-finds
|
|
10
|
+
* everything the steps already reported, which is what the subtraction is for. Reporting a finding
|
|
11
|
+
* twice teaches a reader that the count is noise.
|
|
12
|
+
*
|
|
13
|
+
* Exported for its own test: the subtraction is the whole rule, and it is pure.
|
|
14
|
+
*/
|
|
15
|
+
export declare function crossStepOnly(whole: readonly Contradiction[], steps: readonly FlowStepResult[]): Contradiction[];
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** A contradiction's identity for de-duplication: the rule that fired, and the evidence it fired on. */
|
|
2
|
+
function contradictionId(found) {
|
|
3
|
+
return `${found.kind}|${found.detail}`;
|
|
4
|
+
}
|
|
5
|
+
/** Cross-step findings belong to no single step; -1 is the address the suite verdict already uses. */
|
|
6
|
+
export const CROSS_STEP_INDEX = -1;
|
|
7
|
+
/**
|
|
8
|
+
* The contradictions the whole-span pass found that no individual step could.
|
|
9
|
+
*
|
|
10
|
+
* A step's window closes when the step ends, so a request fired at step 2 and still unanswered at
|
|
11
|
+
* step 5 is invisible to every per-step window: step 2's closed before the answer came and step 5
|
|
12
|
+
* never saw it start. Re-running the detectors over the whole replay span finds those — and re-finds
|
|
13
|
+
* everything the steps already reported, which is what the subtraction is for. Reporting a finding
|
|
14
|
+
* twice teaches a reader that the count is noise.
|
|
15
|
+
*
|
|
16
|
+
* Exported for its own test: the subtraction is the whole rule, and it is pure.
|
|
17
|
+
*/
|
|
18
|
+
export function crossStepOnly(whole, steps) {
|
|
19
|
+
const seen = new Set(steps.flatMap((step) => (step.contradictions ?? []).map(contradictionId)));
|
|
20
|
+
return whole.filter((found) => !seen.has(contradictionId(found)));
|
|
21
|
+
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { type FlowFile, type FlowStep, type Predicate } from '@reticlehq/core';
|
|
2
2
|
/** A short, stable identity for a journey's shape: its start page and its steps. */
|
|
3
3
|
export declare function journeyFingerprint(flow: Pick<FlowFile, 'startPath' | 'steps'>): string;
|
|
4
|
+
/**
|
|
5
|
+
* Whether `shorter` is `longer` driven with steps left out: same start, and its steps appear in
|
|
6
|
+
* `longer` in the same order. A re-drive that retried a step, or stopped one short, is the same
|
|
7
|
+
* journey; two flows that share only a name and a page are not.
|
|
8
|
+
*/
|
|
9
|
+
export declare function withinJourney(longer: Pick<FlowFile, 'startPath' | 'steps'>, shorter: Pick<FlowFile, 'startPath' | 'steps'>): boolean;
|
|
4
10
|
/**
|
|
5
11
|
* Fold two copies of one journey into one file.
|
|
6
12
|
*
|
|
@@ -31,6 +31,26 @@ export function journeyFingerprint(flow) {
|
|
|
31
31
|
.digest('hex')
|
|
32
32
|
.slice(0, FINGERPRINT_LENGTH);
|
|
33
33
|
}
|
|
34
|
+
/**
|
|
35
|
+
* Whether `shorter` is `longer` driven with steps left out: same start, and its steps appear in
|
|
36
|
+
* `longer` in the same order. A re-drive that retried a step, or stopped one short, is the same
|
|
37
|
+
* journey; two flows that share only a name and a page are not.
|
|
38
|
+
*/
|
|
39
|
+
export function withinJourney(longer, shorter) {
|
|
40
|
+
if ((longer.startPath ?? null) !== (shorter.startPath ?? null))
|
|
41
|
+
return false;
|
|
42
|
+
const shapes = longer.steps.map((step) => JSON.stringify(stepShape(step)));
|
|
43
|
+
let at = 0;
|
|
44
|
+
for (const step of shorter.steps) {
|
|
45
|
+
const wanted = JSON.stringify(stepShape(step));
|
|
46
|
+
while (at < shapes.length && shapes[at] !== wanted)
|
|
47
|
+
at += 1;
|
|
48
|
+
if (at === shapes.length)
|
|
49
|
+
return false;
|
|
50
|
+
at += 1;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
34
54
|
/** `kept` wins wherever it says something; `other` fills only what `kept` left unsaid. */
|
|
35
55
|
function fillStep(kept, other) {
|
|
36
56
|
if (other === undefined)
|
|
@@ -53,3 +53,7 @@ export declare function replayAndLearn(deps: ToolDeps,
|
|
|
53
53
|
args: Record<string, unknown>): Promise<FlowReplayResult>;
|
|
54
54
|
/** Write back the files a clean replay's anchors resolved to. Best-effort, as `persistLearning` is. */
|
|
55
55
|
export declare function persistSources(deps: ToolDeps, args: Record<string, unknown>, sources: Parameters<typeof withLearnedSources>[1]): Promise<void>;
|
|
56
|
+
/** A replay, under seeded perturbation when `seed` asks for one; the page is always put back. */
|
|
57
|
+
export declare function replaySeededOrNot(deps: ToolDeps, args: Record<string, unknown>,
|
|
58
|
+
/** Where the perturbation port finds the page: the app's origin. */
|
|
59
|
+
appUrl: string | undefined): Promise<FlowReplayResult>;
|
|
@@ -1,15 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { runSavedFlow } from '../../hooks/driven-by.js';
|
|
2
|
+
import { asNumber, asString, mutationTargetsFor, perturbationFor } from '@reticlehq/core';
|
|
3
|
+
import { sessionPerturbationPort } from '../../surface/tools/lease-tools.js';
|
|
2
4
|
import { flowsForSession } from './flow-store-for-session.js';
|
|
5
|
+
import { safeSessionTarget } from '../../memory/project/session-root.js';
|
|
3
6
|
import { replayNamedFlow } from './flow-replay-run.js';
|
|
4
7
|
import { recordingSources, withLearnedSources } from './learned-sources.js';
|
|
5
8
|
import { ReplayStatus } from '@reticlehq/core';
|
|
6
|
-
function
|
|
7
|
-
|
|
8
|
-
return deps.sessions.resolve(asString(args['sessionId'])).projectId;
|
|
9
|
-
}
|
|
10
|
-
catch {
|
|
11
|
-
return undefined;
|
|
12
|
-
}
|
|
9
|
+
function targetOf(deps, args) {
|
|
10
|
+
return safeSessionTarget(deps, asString(args['sessionId']));
|
|
13
11
|
}
|
|
14
12
|
/**
|
|
15
13
|
* Write back what a replay taught the flow, once the replay has finished writing its own.
|
|
@@ -36,8 +34,8 @@ export async function persistLearning(deps, args, result) {
|
|
|
36
34
|
if (0 === name.length)
|
|
37
35
|
return result;
|
|
38
36
|
try {
|
|
39
|
-
const
|
|
40
|
-
await flowsForSession(deps,
|
|
37
|
+
const target = targetOf(deps, args);
|
|
38
|
+
await flowsForSession(deps, target).flows.recordLearned(name, learned, target.projectId);
|
|
41
39
|
}
|
|
42
40
|
catch {
|
|
43
41
|
// Bookkeeping only.
|
|
@@ -77,10 +75,11 @@ export async function replayAndLearn(deps,
|
|
|
77
75
|
*/
|
|
78
76
|
args) {
|
|
79
77
|
let recorded;
|
|
80
|
-
|
|
78
|
+
// A saved flow's steps were asked for by whoever recorded it: no outward gate on them.
|
|
79
|
+
const result = await runSavedFlow(() => replayNamedFlow(deps, args, (session) => {
|
|
81
80
|
recorded = recordingSources(session);
|
|
82
81
|
return recorded.session;
|
|
83
|
-
});
|
|
82
|
+
}));
|
|
84
83
|
// Only a clean run teaches a file: a drifted step may have resolved to the wrong element.
|
|
85
84
|
if (result.status === ReplayStatus.OK && recorded !== undefined && recorded.sources.size > 0) {
|
|
86
85
|
await persistSources(deps, args, recorded.sources);
|
|
@@ -93,8 +92,9 @@ export async function persistSources(deps, args, sources) {
|
|
|
93
92
|
if (0 === name.length)
|
|
94
93
|
return;
|
|
95
94
|
try {
|
|
96
|
-
const
|
|
97
|
-
const
|
|
95
|
+
const target = targetOf(deps, args);
|
|
96
|
+
const { projectId } = target;
|
|
97
|
+
const store = flowsForSession(deps, target).flows;
|
|
98
98
|
const current = await store.load(name, projectId);
|
|
99
99
|
// Read first so a flow that already names every file is never rewritten.
|
|
100
100
|
if (!current.ok || withLearnedSources(current.value, sources) === undefined)
|
|
@@ -105,3 +105,34 @@ export async function persistSources(deps, args, sources) {
|
|
|
105
105
|
// Bookkeeping only.
|
|
106
106
|
}
|
|
107
107
|
}
|
|
108
|
+
/** A replay, under seeded perturbation when `seed` asks for one; the page is always put back. */
|
|
109
|
+
export async function replaySeededOrNot(deps, args,
|
|
110
|
+
/** Where the perturbation port finds the page: the app's origin. */
|
|
111
|
+
appUrl) {
|
|
112
|
+
const seed = asNumber(args['seed']);
|
|
113
|
+
if (seed === undefined)
|
|
114
|
+
return await replayAndLearn(deps, args);
|
|
115
|
+
/*
|
|
116
|
+
* The targets are the endpoints the FLOW declared it depends on, so the perturbation lands on
|
|
117
|
+
* traffic the flow claims to care about. No declared endpoints means nothing to slow, and the
|
|
118
|
+
* replay runs clean rather than pretending a seed did something. `finally` is not tidiness: a
|
|
119
|
+
* page left slowed is damage the NEXT run inherits, as a mystery.
|
|
120
|
+
*/
|
|
121
|
+
const target = targetOf(deps, args);
|
|
122
|
+
const loaded = await flowsForSession(deps, target)
|
|
123
|
+
.flows.load(asString(args['flowName']) ?? asString(args['flow']) ?? '', target.projectId)
|
|
124
|
+
.catch(() => null);
|
|
125
|
+
const targets = loaded !== null && loaded.ok ? mutationTargetsFor(loaded.value) : [];
|
|
126
|
+
const rules = perturbationFor(seed, targets);
|
|
127
|
+
const port = 0 === rules.length ? undefined : await sessionPerturbationPort(deps.realInput, appUrl);
|
|
128
|
+
if (port === undefined)
|
|
129
|
+
return replayAndLearn(deps, args);
|
|
130
|
+
try {
|
|
131
|
+
await port.slow(rules);
|
|
132
|
+
const replay = await runSavedFlow(() => replayNamedFlow(deps, args));
|
|
133
|
+
return { ...replay, perturbed: rules };
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
await port.clear().catch(() => undefined);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -15,7 +15,8 @@ import { MutationOutcome } from 'open-verification';
|
|
|
15
15
|
import { z } from 'zod';
|
|
16
16
|
import { sessionMutationPort } from '../../surface/tools/lease-tools.js';
|
|
17
17
|
import { mutationTest } from './mutation-run.js';
|
|
18
|
-
import { replayNamedFlow
|
|
18
|
+
import { replayNamedFlow } from './flow-replay-run.js';
|
|
19
|
+
import { sessionTarget } from '../../memory/project/session-root.js';
|
|
19
20
|
import { flowsForSession } from './flow-store-for-session.js';
|
|
20
21
|
import { ReplayStatus } from '@reticlehq/core';
|
|
21
22
|
const NOTHING_DECLARED = 'this flow declares no network consequence, so it has named nothing whose breakage it could be ' +
|
|
@@ -48,8 +49,9 @@ export const FLOW_MUTATE_TOOL = {
|
|
|
48
49
|
handler: async (deps, args) => {
|
|
49
50
|
const name = asString(args['flowName']) ?? asString(args['flow']) ?? '';
|
|
50
51
|
const sessionId = asString(args['sessionId']);
|
|
51
|
-
const
|
|
52
|
-
const
|
|
52
|
+
const project = sessionTarget(deps, sessionId);
|
|
53
|
+
const { projectId } = project;
|
|
54
|
+
const loaded = await flowsForSession(deps, project).flows.load(name, projectId);
|
|
53
55
|
if (!loaded.ok) {
|
|
54
56
|
return { flow: name, because: `could not load "${name}": ${String(loaded.code)}` };
|
|
55
57
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type CommandResult, type FlowFile, type FlowReplayResult, type
|
|
1
|
+
import { type CommandResult, type FlowFile, type FlowReplayResult, type ReticleEvent } from '@reticlehq/core';
|
|
2
2
|
import type { ArrivalClock } from '../../surface/tools/act/navigation/navigate-arrival.js';
|
|
3
3
|
import type { SessionManager } from '../../portal/session/session-manager.js';
|
|
4
4
|
import type { Session } from '../../portal/session/session.js';
|
|
@@ -20,8 +20,8 @@ interface StartPathSession {
|
|
|
20
20
|
* anchor simply isn't on this page yet. Detect that so the decision says "navigate there first"
|
|
21
21
|
* instead of a mystifying "a step no longer matches". Returns undefined when the routes agree or the
|
|
22
22
|
* current route is unobservable — never a false alarm. Replay normally never gets here on a
|
|
23
|
-
* wrong page (arriveAtStartPath navigates before step 1); this is the fallback
|
|
24
|
-
*
|
|
23
|
+
* wrong page (arriveAtStartPath navigates before step 1); this is the fallback when navigation
|
|
24
|
+
* was refused. A page that never reconnected is reported as unverifiable before step 1.
|
|
25
25
|
*/
|
|
26
26
|
export declare function startPathMismatchHint(flow: FlowFile, session: StartPathSession): string | undefined;
|
|
27
27
|
/** What replay learned on its way to step 0. Both fields absent = the tab was left exactly as it was. */
|
|
@@ -30,6 +30,10 @@ export interface StartPathArrival {
|
|
|
30
30
|
session?: Session;
|
|
31
31
|
/** Set when the RESET itself is why step 1 cannot start — the reason a step-1 red is not drift. */
|
|
32
32
|
resetCost?: string;
|
|
33
|
+
/** Set when the tab was sent away and nothing reconnected: the old handle will never answer (#1129). */
|
|
34
|
+
lost?: string;
|
|
35
|
+
/** A live successor arrived on a different route, so replay must not use the dead old handle. */
|
|
36
|
+
redirected?: string;
|
|
33
37
|
}
|
|
34
38
|
/**
|
|
35
39
|
* Replay's half of the FlowFile contract: put the tab on the flow's `startPath` before step 1, and
|
|
@@ -48,10 +52,9 @@ export interface StartPathArrival {
|
|
|
48
52
|
* A full-page load tears down the session socket, so the navigation must happen here — before any
|
|
49
53
|
* step runs — and the replay continues on the session the SDK reconnects as (found via the same
|
|
50
54
|
* tombstone rebind that lets `resolve(oldId)` answer after any navigation). Best-effort by design:
|
|
51
|
-
* when the flow carries no startPath, the current route is unobservable,
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* mystifying one.
|
|
55
|
+
* when the flow carries no startPath, the current route is unobservable, or navigation is refused,
|
|
56
|
+
* replay proceeds on the connected session. A missing successor stops before step 1; a redirect
|
|
57
|
+
* continues on the live successor with a route-specific hint.
|
|
55
58
|
*/
|
|
56
59
|
export declare function arriveAtStartPath(sessions: SessionManager, session: StartPathSession & {
|
|
57
60
|
id: string;
|
|
@@ -69,6 +72,18 @@ export declare function arriveAtStartPath(sessions: SessionManager, session: Sta
|
|
|
69
72
|
* to move and this decides how, which is also why the deliberate short-circuits live up there and
|
|
70
73
|
* not in here: a caller that has already decided it must move should not have to argue with them.
|
|
71
74
|
*/
|
|
75
|
+
/** How a navigate ended: target, redirect, refusal (untouched tab), or no successor. */
|
|
76
|
+
export type NavigateOutcome = {
|
|
77
|
+
kind: 'arrived';
|
|
78
|
+
session: Session;
|
|
79
|
+
} | {
|
|
80
|
+
kind: 'redirected';
|
|
81
|
+
session: Session;
|
|
82
|
+
} | {
|
|
83
|
+
kind: 'refused';
|
|
84
|
+
} | {
|
|
85
|
+
kind: 'lost';
|
|
86
|
+
};
|
|
72
87
|
export declare function navigateAndAwait(sessions: SessionManager, session: {
|
|
73
88
|
id: string;
|
|
74
89
|
/** Optional because a session's URL is, and `carryReticleIdentity` already handles its absence. */
|
|
@@ -76,7 +91,7 @@ export declare function navigateAndAwait(sessions: SessionManager, session: {
|
|
|
76
91
|
command(name: string, args?: Record<string, unknown>): Promise<CommandResult>;
|
|
77
92
|
}, destination: string, expectedPath: string, timeoutMs?: number, clock?: ArrivalClock,
|
|
78
93
|
/** True when the destination is the page we are already on — see `arrivedSuccessor`. */
|
|
79
|
-
isReload?: boolean): Promise<
|
|
94
|
+
isReload?: boolean): Promise<NavigateOutcome>;
|
|
80
95
|
/**
|
|
81
96
|
* The honest answer when the document replay was driving went away mid-run.
|
|
82
97
|
*
|
|
@@ -97,7 +112,6 @@ export declare function lostDocumentResult(name: string, lost: DocumentLostDurin
|
|
|
97
112
|
export declare function replayNamedFlow(deps: ToolDeps, args: Record<string, unknown>,
|
|
98
113
|
/** Wraps the session the steps run on, so a caller can watch what they resolved. */
|
|
99
114
|
observe?: (session: FlowReplaySession) => FlowReplaySession): Promise<FlowReplayResult>;
|
|
100
|
-
export declare function crossStepOnly(whole: readonly Contradiction[], steps: readonly FlowStepResult[]): Contradiction[];
|
|
101
115
|
/**
|
|
102
116
|
* The connecting session's project, or undefined when no browser is attached. Flow tools use it to
|
|
103
117
|
* scope storage to the current app on a shared daemon; resolving must NOT throw here (list/load are
|