@reticlehq/server 3.6.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/SKILL.md +122 -123
- 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 +18 -2
- package/dist/command/cli/adhoc-verdict.js +70 -6
- 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/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 +28 -105
- 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 +34 -4
- package/dist/command/cli/cli-verify.js +81 -12
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +145 -333
- 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 +15 -1
- package/dist/command/cli/cloud-login.js +67 -13
- 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/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/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 +11 -2
- 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.js +1 -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 +29 -8
- 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 -178
- 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 +14 -0
- package/dist/command/cli.js +103 -83
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +9 -1
- package/dist/command/daemon/daemon-resolve.js +49 -10
- 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/dev-server-log-cap.js +2 -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 +10 -1
- package/dist/command/setup/init/init-port.js +22 -2
- package/dist/command/setup/init/init-runtime.d.ts +12 -2
- package/dist/command/setup/init/init-runtime.js +96 -37
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +36 -8
- 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 +1 -1
- package/dist/command/setup/run-setup.d.ts +29 -9
- package/dist/command/setup/run-setup.js +34 -28
- package/dist/command/setup/setup-command.d.ts +23 -0
- package/dist/command/setup/setup-command.js +57 -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 +38 -2
- package/dist/features/crawl/crawl.js +14 -1
- package/dist/features/exhaust/ledger.d.ts +14 -14
- package/dist/features/harness/drive-report.d.ts +39 -5
- package/dist/features/harness/drive-report.js +271 -54
- 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 +1 -1
- package/dist/features/harness/drivers.js +1 -1
- 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/goals.d.ts +68 -7
- package/dist/features/harness/goals.js +289 -36
- package/dist/features/harness/harness.d.ts +30 -1
- package/dist/features/harness/harness.js +141 -7
- package/dist/features/harness/platform/local-apps.d.ts +36 -3
- package/dist/features/harness/platform/local-apps.js +81 -5
- 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 +8 -2
- package/dist/features/harness/platform/remote-drive.js +22 -9
- package/dist/features/harness/platform/script.d.ts +57 -11
- package/dist/features/harness/platform/script.js +144 -12
- package/dist/features/harness/platform/server-driver.d.ts +17 -4
- package/dist/features/harness/platform/server-driver.js +29 -26
- package/dist/features/harness/platform-config.d.ts +38 -5
- package/dist/features/harness/platform-config.js +93 -8
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/script-run.d.ts +30 -1
- package/dist/features/harness/script/script-run.js +355 -48
- 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.js +22 -14
- 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 +21 -2
- package/dist/hooks/driven-by.js +42 -2
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +26 -183
- 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 +20 -4
- 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.js +25 -9
- package/dist/judgement/runs/artifact/run-store.d.ts +13 -1
- package/dist/judgement/runs/artifact/run-store.js +175 -8
- 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 +53 -5
- package/dist/judgement/runs/drive-run.js +234 -20
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +5 -2
- 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 +2 -0
- package/dist/judgement/runs/verification-sync.js +36 -15
- package/dist/language/flows/decision.js +2 -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 +7 -2
- package/dist/language/flows/flow-anchor.js +10 -3
- 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 +37 -3
- package/dist/language/flows/flow-replay-run.js +16 -18
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +18 -1
- package/dist/language/flows/flow-replay.js +22 -7
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-step-runners.d.ts +2 -0
- package/dist/language/flows/flow-step-runners.js +12 -6
- package/dist/language/flows/flow-store-for-session.js +5 -1
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +61 -62
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +69 -10
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +29 -1
- package/dist/language/flows/recording/tape/recordings.js +60 -10
- package/dist/language/flows/replay.js +29 -6
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +200 -193
- package/dist/memory/cloud/cloud-config.d.ts +10 -1
- package/dist/memory/cloud/cloud-config.js +19 -5
- package/dist/memory/cloud/cloud-sync.js +3 -3
- package/dist/memory/cloud/harness-config.d.ts +49 -0
- package/dist/memory/cloud/harness-config.js +16 -20
- package/dist/memory/cloud/memory-scope.d.ts +17 -0
- package/dist/memory/cloud/memory-scope.js +22 -0
- package/dist/memory/cloud/sync-cycle.d.ts +32 -4
- package/dist/memory/cloud/sync-cycle.js +113 -12
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +114 -4
- package/dist/memory/cloud/sync-disk.js +26 -2
- 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 +16 -1
- package/dist/memory/impact/account-watch.js +26 -1
- package/dist/memory/impact/impact-store.d.ts +1 -4
- package/dist/memory/impact/impact-store.js +32 -42
- 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 +12 -0
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +42 -2
- 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/journal-recorder.js +46 -3
- package/dist/memory/journal/on-disk/retention.d.ts +5 -0
- package/dist/memory/journal/on-disk/retention.js +27 -2
- package/dist/memory/journal/on-disk/workspace-tiers.js +2 -0
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +38 -7
- package/dist/memory/project/artifact-root-resolver.js +33 -5
- package/dist/memory/project/artifact-root.d.ts +4 -3
- package/dist/memory/project/artifact-root.js +2 -2
- package/dist/memory/project/dir/reticle-dir.d.ts +14 -0
- package/dist/memory/project/dir/reticle-dir.js +23 -2
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- 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 +2 -0
- package/dist/memory/project/session-root.js +9 -1
- package/dist/memory/project/sync-status.d.ts +46 -0
- package/dist/memory/project/sync-status.js +135 -1
- package/dist/memory/recall/memory-tools.js +46 -3
- 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.js +36 -8
- package/dist/portal/bridge/bridge.d.ts +9 -5
- package/dist/portal/bridge/bridge.js +66 -23
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -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 +2 -0
- package/dist/portal/input/real-input.js +13 -10
- package/dist/portal/pool/browser-pool.d.ts +48 -0
- package/dist/portal/pool/browser-pool.js +120 -2
- 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 +27 -5
- package/dist/portal/pool/playwright-launcher.js +59 -14
- package/dist/portal/pool/pool-contract.d.ts +21 -1
- 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.js +6 -1
- 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 +9 -0
- package/dist/portal/session/dev-server/dev-command.js +27 -1
- 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/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/live-control-tools.js +82 -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 +1 -1
- package/dist/portal/session/no-session-diagnosis.js +31 -9
- package/dist/portal/session/no-session-next-action.d.ts +20 -0
- package/dist/portal/session/no-session-next-action.js +134 -61
- package/dist/portal/session/no-session-watch.js +179 -22
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/session-health.d.ts +11 -0
- package/dist/portal/session/session-health.js +3 -1
- package/dist/portal/session/session-info.js +2 -1
- package/dist/portal/session/session-manager.d.ts +18 -0
- package/dist/portal/session/session-manager.js +54 -3
- package/dist/portal/session/session-successor.d.ts +8 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session.d.ts +15 -28
- package/dist/portal/session/session.js +60 -61
- 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 +7 -1
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +13 -1
- package/dist/status-payload.js +13 -1
- package/dist/surface/http-server.js +7 -1
- 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 +4 -0
- package/dist/surface/mcp/mcp-proxy.js +29 -8
- package/dist/surface/mcp/mcp.d.ts +23 -0
- package/dist/surface/mcp/mcp.js +34 -4
- 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.js +22 -14
- package/dist/surface/mcp/shared-params.js +1 -1
- 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/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-sequence-tool.js +136 -27
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +48 -34
- 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.js +25 -15
- package/dist/surface/tools/browser-tools.js +43 -1
- package/dist/surface/tools/chat-drives.d.ts +75 -0
- package/dist/surface/tools/chat-drives.js +265 -21
- 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 +10 -0
- package/dist/surface/tools/empty-session-list.js +45 -5
- package/dist/surface/tools/error-recovery.d.ts +8 -0
- package/dist/surface/tools/error-recovery.js +69 -5
- package/dist/surface/tools/explore-tools.d.ts +23 -2
- package/dist/surface/tools/explore-tools.js +377 -74
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +4 -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 +52 -73
- package/dist/surface/tools/harness-explore.js +177 -146
- 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 +5 -0
- package/dist/surface/tools/harness-plan.js +7 -0
- package/dist/surface/tools/harness-script.d.ts +22 -0
- package/dist/surface/tools/harness-script.js +256 -38
- 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 +8 -0
- package/dist/surface/tools/harness-toolset.js +27 -4
- 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 +220 -93
- 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 +20 -0
- package/dist/surface/tools/lease-seed.js +45 -1
- package/dist/surface/tools/lease-tools.d.ts +10 -1
- package/dist/surface/tools/lease-tools.js +119 -69
- package/dist/surface/tools/live-call-text.js +2 -2
- 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 +11 -1
- package/dist/surface/tools/next-step.js +73 -18
- package/dist/surface/tools/observe-tools.js +43 -5
- package/dist/surface/tools/platform-moment.d.ts +60 -0
- package/dist/surface/tools/platform-moment.js +132 -4
- package/dist/surface/tools/read-tools.js +65 -14
- 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 +68 -2
- package/dist/surface/tools/tool-kit.js +73 -1
- package/dist/surface/tools/tools.js +25 -13
- 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 +27 -6
- package/dist/telemetry/hud-metrics.js +99 -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 +26 -2
- package/dist/telemetry/telemetry.js +102 -21
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +12 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +16 -5
- package/docs/README.md +2 -2
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +24 -27
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +13 -12
- 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 +8 -3
- package/docs/cli/drive.mdx +12 -12
- 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 +32 -15
- 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 +13 -4
- 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 +3 -2
- package/docs/cli.mdx +110 -41
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +5 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +5 -2
- 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 +66 -64
- package/docs/human-control.md +15 -14
- package/docs/index.mdx +15 -43
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +22 -12
- 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 +8 -8
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +11 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +58 -29
- 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 +22 -24
- 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 +13 -4
- 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 +51 -45
- 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 +7 -5
- package/docs/what-is-reticle.mdx +2 -2
- package/docs/why-reticle.mdx +1 -1
- package/package.json +6 -5
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -249
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- 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/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
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The opt-in screen/request check, wired: after an act_and_wait, compare what the window's write
|
|
3
|
+
* requests carried with the values the page's form controls show (engine: screen-request.ts).
|
|
4
|
+
*
|
|
5
|
+
* OPT-IN (`RETICLE_SCREEN_REQUEST_CHECK=1`) and ADVISORY. It ships behind the flag until its
|
|
6
|
+
* false-alarm rate is measured at zero on the e2e battery, the benchmark and the persona fixtures;
|
|
7
|
+
* until then it must cost nothing for anyone who did not ask. It runs AFTER the verdict is decided
|
|
8
|
+
* and is appended to `contradictions` as an advisory kind, so it can never move a verdict.
|
|
9
|
+
*/
|
|
10
|
+
import { type Contradiction, type ReticleEvent } from '@reticlehq/core';
|
|
11
|
+
import type { Session } from '../../../portal/session/session.js';
|
|
12
|
+
export declare const SCREEN_REQUEST_CHECK_ENV = "RETICLE_SCREEN_REQUEST_CHECK";
|
|
13
|
+
export interface SentBody {
|
|
14
|
+
method: string;
|
|
15
|
+
url: string;
|
|
16
|
+
/** The request body as sent (JSON text). */
|
|
17
|
+
body: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ShownControl {
|
|
20
|
+
/** `name` or `id` attribute — the only link from a control to a field. */
|
|
21
|
+
field: string;
|
|
22
|
+
/** The control's current value (a select's selected option value, an input's text). */
|
|
23
|
+
value: string;
|
|
24
|
+
/** What the user sees, when it differs from the value (a select's option label). */
|
|
25
|
+
label?: string | undefined;
|
|
26
|
+
ref?: string | undefined;
|
|
27
|
+
}
|
|
28
|
+
export declare function screenRequestMismatches(sent: readonly SentBody[], controls: readonly ShownControl[]): Contradiction[];
|
|
29
|
+
/** Advisory findings for this window, or none when the check is off or nothing was written. */
|
|
30
|
+
export declare function screenRequestFindings(session: Session, windowEvents: readonly ReticleEvent[]): Promise<Contradiction[]>;
|
|
31
|
+
/** The `contradictions` field: the verdict's own, then any advisory ones; omitted when both are empty. */
|
|
32
|
+
export declare function withAdvisories(decided: readonly Contradiction[], advisory: readonly Contradiction[]): {
|
|
33
|
+
contradictions?: Contradiction[];
|
|
34
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The opt-in screen/request check, wired: after an act_and_wait, compare what the window's write
|
|
3
|
+
* requests carried with the values the page's form controls show (engine: screen-request.ts).
|
|
4
|
+
*
|
|
5
|
+
* OPT-IN (`RETICLE_SCREEN_REQUEST_CHECK=1`) and ADVISORY. It ships behind the flag until its
|
|
6
|
+
* false-alarm rate is measured at zero on the e2e battery, the benchmark and the persona fixtures;
|
|
7
|
+
* until then it must cost nothing for anyone who did not ask. It runs AFTER the verdict is decided
|
|
8
|
+
* and is appended to `contradictions` as an advisory kind, so it can never move a verdict.
|
|
9
|
+
*/
|
|
10
|
+
import { ContradictionKind, EventType, REDACTED_VALUE, ReticleCommand, } from '@reticlehq/core';
|
|
11
|
+
export const SCREEN_REQUEST_CHECK_ENV = 'RETICLE_SCREEN_REQUEST_CHECK';
|
|
12
|
+
const READ_METHODS = new Set(['GET', 'HEAD', 'OPTIONS']);
|
|
13
|
+
/** The form controls whose value a request can carry. */
|
|
14
|
+
const CONTROL_ROLES = ['combobox', 'listbox', 'textbox', 'spinbutton'];
|
|
15
|
+
function primitiveFields(body) {
|
|
16
|
+
const out = new Map();
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(body);
|
|
19
|
+
if ('object' !== typeof parsed || null === parsed || Array.isArray(parsed))
|
|
20
|
+
return out;
|
|
21
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
22
|
+
if ('string' === typeof value || 'number' === typeof value || 'boolean' === typeof value) {
|
|
23
|
+
out.set(key.toLowerCase(), String(value));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// Not JSON: nothing comparable, so nothing reported.
|
|
29
|
+
}
|
|
30
|
+
return out;
|
|
31
|
+
}
|
|
32
|
+
function pathOf(url) {
|
|
33
|
+
try {
|
|
34
|
+
return new URL(url, 'http://local.invalid').pathname;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return url;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export function screenRequestMismatches(sent, controls) {
|
|
41
|
+
const out = [];
|
|
42
|
+
for (const request of sent) {
|
|
43
|
+
const fields = primitiveFields(request.body);
|
|
44
|
+
if (0 === fields.size)
|
|
45
|
+
continue;
|
|
46
|
+
for (const control of controls) {
|
|
47
|
+
const key = control.field.toLowerCase();
|
|
48
|
+
const carried = fields.get(key);
|
|
49
|
+
if (carried === undefined || carried === control.value)
|
|
50
|
+
continue;
|
|
51
|
+
const shown = control.label !== undefined && control.label !== control.value
|
|
52
|
+
? `"${control.label}" (value "${control.value}")`
|
|
53
|
+
: `"${control.value}"`;
|
|
54
|
+
out.push({
|
|
55
|
+
kind: ContradictionKind.SCREEN_REQUEST_MISMATCH,
|
|
56
|
+
claim: `the screen's "${control.field}" control shows ${shown}`,
|
|
57
|
+
counter: `${request.method.toUpperCase()} ${pathOf(request.url)} sent ${control.field}=${JSON.stringify(carried)}`,
|
|
58
|
+
detail: `${control.ref === undefined ? '' : `${control.ref} `}${control.field}: shown ${shown}, sent ${JSON.stringify(carried)}`,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return out;
|
|
63
|
+
}
|
|
64
|
+
function sentBodies(events) {
|
|
65
|
+
return events.flatMap((event) => {
|
|
66
|
+
if (EventType.NET_REQUEST !== event.type)
|
|
67
|
+
return [];
|
|
68
|
+
const raw = event.data['method'];
|
|
69
|
+
const method = ('string' === typeof raw ? raw : 'GET').toUpperCase();
|
|
70
|
+
const body = event.data['requestBody'];
|
|
71
|
+
const url = event.data['url'];
|
|
72
|
+
if (READ_METHODS.has(method) || 'string' !== typeof body || 'string' !== typeof url)
|
|
73
|
+
return [];
|
|
74
|
+
return [{ method, url, body }];
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async function shownControls(session) {
|
|
78
|
+
const out = [];
|
|
79
|
+
for (const role of CONTROL_ROLES) {
|
|
80
|
+
const res = await session.command(ReticleCommand.MATCH, {
|
|
81
|
+
query: { role, attrs: ['name', 'id'] },
|
|
82
|
+
});
|
|
83
|
+
if (!res.ok)
|
|
84
|
+
continue;
|
|
85
|
+
for (const el of res.result?.elements ?? []) {
|
|
86
|
+
const field = el.attrs?.['name'] ?? el.attrs?.['id'];
|
|
87
|
+
// No value read, or a redacted one: nothing to compare, so nothing is guessed.
|
|
88
|
+
if (field === undefined || el.value === undefined || REDACTED_VALUE === el.value)
|
|
89
|
+
continue;
|
|
90
|
+
out.push({ field, value: el.value, ref: el.ref });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return out;
|
|
94
|
+
}
|
|
95
|
+
/** Advisory findings for this window, or none when the check is off or nothing was written. */
|
|
96
|
+
export async function screenRequestFindings(session, windowEvents) {
|
|
97
|
+
if ('1' !== process.env[SCREEN_REQUEST_CHECK_ENV])
|
|
98
|
+
return [];
|
|
99
|
+
const sent = sentBodies(windowEvents);
|
|
100
|
+
if (0 === sent.length)
|
|
101
|
+
return [];
|
|
102
|
+
try {
|
|
103
|
+
return screenRequestMismatches(sent, await shownControls(session));
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return [];
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
/** The `contradictions` field: the verdict's own, then any advisory ones; omitted when both are empty. */
|
|
110
|
+
export function withAdvisories(decided, advisory) {
|
|
111
|
+
const all = [...decided, ...advisory];
|
|
112
|
+
return 0 === all.length ? {} : { contradictions: all };
|
|
113
|
+
}
|
|
@@ -40,6 +40,12 @@ export interface StepExpectation {
|
|
|
40
40
|
* filter act_and_wait applies. A held step with one is a UI that advanced over a failed write.
|
|
41
41
|
*/
|
|
42
42
|
contradicted?: readonly string[];
|
|
43
|
+
/**
|
|
44
|
+
* Why this step could not be judged at all: its target was missing (nothing was acted on), the
|
|
45
|
+
* page left the app and the observation went with it, or the predicate could not be read. Such a
|
|
46
|
+
* step is undecided, never a miss — `unknown`, as act_and_wait says.
|
|
47
|
+
*/
|
|
48
|
+
undecided?: string;
|
|
43
49
|
}
|
|
44
50
|
export interface SequenceGrade {
|
|
45
51
|
verified: Verified;
|
|
@@ -80,5 +86,7 @@ export declare function gradeSequence(steps: readonly StepExpectation[], plan?:
|
|
|
80
86
|
* two-of-twelve plan as a regression flow is a reasonable thing to do and a bad thing to do without
|
|
81
87
|
* knowing it.
|
|
82
88
|
*/
|
|
89
|
+
/** The stopped recording a proved journey is held under, so the `keep` offer can be taken. */
|
|
90
|
+
export declare const JOURNEY_RECORDING = "last-journey";
|
|
83
91
|
export declare function offerToKeep(grade: SequenceGrade): string | undefined;
|
|
84
92
|
export {};
|
|
@@ -29,7 +29,7 @@ export function gradeSequence(steps, plan = { planned: steps.length, dispatched:
|
|
|
29
29
|
const declared = declaring.length;
|
|
30
30
|
// `held: false` on an undeclared step means it could not be performed at all — the journey broke
|
|
31
31
|
// there whether or not anything was declared about it.
|
|
32
|
-
const missed = steps.find((step) => (step.declared ? true !== step.held : false === step.held));
|
|
32
|
+
const missed = steps.find((step) => step.undecided === undefined && (step.declared ? true !== step.held : false === step.held));
|
|
33
33
|
// A miss decides the grade before coverage does. How much of the plan declared nothing is
|
|
34
34
|
// context on a red, never a softening of it.
|
|
35
35
|
if (missed !== undefined) {
|
|
@@ -52,6 +52,15 @@ export function gradeSequence(steps, plan = { planned: steps.length, dispatched:
|
|
|
52
52
|
because: `step ${String(contradictedAt + 1)}: channels disagree about this action (${kinds}) even though it went on`,
|
|
53
53
|
};
|
|
54
54
|
}
|
|
55
|
+
// Nothing failed that was seen: a step nobody could judge leaves the plan undecided, saying why.
|
|
56
|
+
const unjudged = steps.find((step) => step.undecided !== undefined);
|
|
57
|
+
if (unjudged !== undefined)
|
|
58
|
+
return {
|
|
59
|
+
verified: Verified.UNKNOWN,
|
|
60
|
+
declared,
|
|
61
|
+
total,
|
|
62
|
+
because: `a step could not be judged — ${unjudged.undecided ?? ''}`,
|
|
63
|
+
};
|
|
55
64
|
/*
|
|
56
65
|
* `unknown` rather than `no-fault`, and the distinction is load-bearing.
|
|
57
66
|
*
|
|
@@ -125,11 +134,13 @@ export function gradeSequence(steps, plan = { planned: steps.length, dispatched:
|
|
|
125
134
|
* two-of-twelve plan as a regression flow is a reasonable thing to do and a bad thing to do without
|
|
126
135
|
* knowing it.
|
|
127
136
|
*/
|
|
137
|
+
/** The stopped recording a proved journey is held under, so the `keep` offer can be taken. */
|
|
138
|
+
export const JOURNEY_RECORDING = 'last-journey';
|
|
128
139
|
export function offerToKeep(grade) {
|
|
129
140
|
if (grade.verified !== Verified.YES || 0 === grade.declared)
|
|
130
141
|
return undefined;
|
|
131
142
|
return (`this plan proved something (${String(grade.declared)} of ${String(grade.total)} steps declared a ` +
|
|
132
143
|
'consequence and every one held) — keep it as a regression flow with ' +
|
|
133
|
-
|
|
144
|
+
`reticle_flow_save { flowName: "${JOURNEY_RECORDING}", saveAs: "<name>" }, and the steps that declared nothing will replay ` +
|
|
134
145
|
'without proving anything, exactly as they did here');
|
|
135
146
|
}
|
|
@@ -12,22 +12,28 @@
|
|
|
12
12
|
import { z } from 'zod';
|
|
13
13
|
import { timeoutMsSchema } from './args/numeric-bounds.js';
|
|
14
14
|
import { compileSequenceStep, pathOf } from '../../language/flows/replay.js';
|
|
15
|
+
import { DEFAULT_SEQUENCE_STEP_TIMEOUT_MS } from '../../language/flows/flow-step-runners.js';
|
|
15
16
|
import { sequenceStepArgs } from './act/act-preflight.js';
|
|
16
|
-
import { ReticleTool } from '@reticlehq/core';
|
|
17
|
+
import { REPLAY_PROGRAM_VERSION, ReticleTool, Verified, VerifiedReason, } from '@reticlehq/core';
|
|
17
18
|
import { healthEnvelope } from '../../portal/session/session-health.js';
|
|
18
19
|
import { pausedShortCircuit, pausedOutputShape, withControl, } from '../../portal/session/control-envelope.js';
|
|
19
20
|
import { asRecord, isAbsenceDerived, isAdvisory } from '@reticlehq/core';
|
|
20
21
|
import { sessionIdFromArgs } from './tools-helpers.js';
|
|
21
22
|
import { describeStepResult, runStepWithStaleRetry } from './act/act-sequence-retry.js';
|
|
22
23
|
import { assertSequenceSteps } from './act/act-preflight.js';
|
|
23
|
-
import { sessionIdShape } from './tool-kit.js';
|
|
24
|
+
import { EnvelopeKey, sessionIdShape } from './tool-kit.js';
|
|
25
|
+
import { takeStepShot } from '../../features/visual/step-shots.js';
|
|
24
26
|
import { actCommand } from './act-tools.js';
|
|
25
27
|
import { PredicateSchema, waitForPredicate, } from '@reticlehq/engine/question/predicate/predicate.js';
|
|
26
|
-
import { DeviationMode, gradeSequence, offerToKeep, } from './act/sequence-grade.js';
|
|
28
|
+
import { DeviationMode, gradeSequence, JOURNEY_RECORDING, offerToKeep, } from './act/sequence-grade.js';
|
|
27
29
|
import { stepEffect } from '@reticlehq/engine/evidence/step-effect.js';
|
|
28
30
|
// resolveActTarget moved out of act-tools into its own module on this branch; #706 was written
|
|
29
31
|
// against the older layout where act-tools re-exported it.
|
|
30
32
|
import { resolveActTarget } from './act/act-target.js';
|
|
33
|
+
import { gradeOfPredicate } from './assert/assert-grade.js';
|
|
34
|
+
import { describeWaitTarget } from '@reticlehq/engine/evidence/unsettled.js';
|
|
35
|
+
import { sourceOf } from './tools-helpers.js';
|
|
36
|
+
import { confirmedByDeclaration } from './act/act-danger.js';
|
|
31
37
|
/**
|
|
32
38
|
* The step's effect record, best-effort.
|
|
33
39
|
*
|
|
@@ -45,6 +51,38 @@ function effectOf(session, since) {
|
|
|
45
51
|
return {};
|
|
46
52
|
}
|
|
47
53
|
}
|
|
54
|
+
/** The verdict effect for one step: the same rules act_and_wait applies to one action. */
|
|
55
|
+
function stepVerdictEffect(check) {
|
|
56
|
+
const { verified, reason } = check.held
|
|
57
|
+
? 0 < check.contradicted.length
|
|
58
|
+
? { verified: Verified.NO, reason: VerifiedReason.CONTRADICTED }
|
|
59
|
+
: { verified: Verified.YES, reason: undefined }
|
|
60
|
+
: check.undecided
|
|
61
|
+
? { verified: Verified.UNKNOWN, reason: VerifiedReason.OBSERVATION_LOST }
|
|
62
|
+
: { verified: Verified.NO, reason: VerifiedReason.ASSERTION_FAILED };
|
|
63
|
+
const source = sourceOf(check.source);
|
|
64
|
+
return {
|
|
65
|
+
claim: describeWaitTarget(check.expect),
|
|
66
|
+
verified,
|
|
67
|
+
...(source === undefined ? {} : { source: `${source.file}:${String(source.line)}` }),
|
|
68
|
+
...(check.expected === undefined ? {} : { expected: check.expected }),
|
|
69
|
+
...(check.observed === undefined ? {} : { observed: check.observed }),
|
|
70
|
+
// Named in the step before the step ran — a check, not a rationalisation.
|
|
71
|
+
declaredBeforeActing: true,
|
|
72
|
+
grade: gradeOfPredicate(check.expect),
|
|
73
|
+
kind: check.expect.kind,
|
|
74
|
+
...(reason === undefined ? {} : { reason }),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/** One step's check, journaled best-effort: the record must never fail the drive it records. */
|
|
78
|
+
function journalStep(session, args, effect) {
|
|
79
|
+
try {
|
|
80
|
+
session.recordAction(ReticleTool.ACT_SEQUENCE, args, effect);
|
|
81
|
+
}
|
|
82
|
+
catch {
|
|
83
|
+
// ponytail: a session without a journal (a test double, journaling off) keeps no check.
|
|
84
|
+
}
|
|
85
|
+
}
|
|
48
86
|
/**
|
|
49
87
|
* Ceiling for a burst gap. Past this it is not a burst, it is a paced walk.
|
|
50
88
|
*
|
|
@@ -57,6 +95,8 @@ function effectOf(session, since) {
|
|
|
57
95
|
* number: read its own slow endpoint.
|
|
58
96
|
*/
|
|
59
97
|
const BURST_MAX_GAP_MS = 500;
|
|
98
|
+
/** A step error that means nothing was acted on, or the page went away with the observation. */
|
|
99
|
+
const UNJUDGED_STEP = /matched no element|no longer resolves|session disconnected|session (was )?replaced/i;
|
|
60
100
|
export const ACT_SEQUENCE_TOOL = {
|
|
61
101
|
name: ReticleTool.ACT_SEQUENCE,
|
|
62
102
|
// The example is required for a core tool, and this one carries weight: the loop it replaces is
|
|
@@ -96,6 +136,8 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
96
136
|
since: z.number(),
|
|
97
137
|
dispatched: z.boolean(),
|
|
98
138
|
completed: z.number(),
|
|
139
|
+
/** Number of steps included in the saved recording, when a recording was created. */
|
|
140
|
+
recorded: z.number(),
|
|
99
141
|
stalled_at: z.number().optional(),
|
|
100
142
|
/** Index of the step whose declared consequence did not hold, when one did not. */
|
|
101
143
|
stopped_at: z.number().optional(),
|
|
@@ -137,8 +179,17 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
137
179
|
try {
|
|
138
180
|
const inputSteps = Array.isArray(args['steps']) ? args['steps'] : [];
|
|
139
181
|
assertSequenceSteps(inputSteps);
|
|
140
|
-
const perStepTimeout = 'number' === typeof args['timeout_ms']
|
|
182
|
+
const perStepTimeout = 'number' === typeof args['timeout_ms']
|
|
183
|
+
? args['timeout_ms']
|
|
184
|
+
: DEFAULT_SEQUENCE_STEP_TIMEOUT_MS;
|
|
141
185
|
const stepResults = [];
|
|
186
|
+
// Every step leaves a picture of the page as its outcome was decided — see step-shots.ts.
|
|
187
|
+
const pushStep = async (row) => {
|
|
188
|
+
stepResults.push({
|
|
189
|
+
...row,
|
|
190
|
+
[EnvelopeKey.SCREENSHOT]: await takeStepShot(deps, session.id, ReticleTool.ACT),
|
|
191
|
+
});
|
|
192
|
+
};
|
|
142
193
|
const expectations = [];
|
|
143
194
|
// `true` means the default window; a number means that window exactly. 0 is legal and means
|
|
144
195
|
// "no settle at all" — useful only when the app issues its request synchronously.
|
|
@@ -181,9 +232,9 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
181
232
|
// race rAF and return early anyway — a budget is a CEILING, not a floor, which is
|
|
182
233
|
// why an earlier attempt to pace with `settleMs` alone produced a 12ms step and
|
|
183
234
|
// no race at all.
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
235
|
+
// A step that names its dangerous control and declares its consequence is
|
|
236
|
+
// confirmed by that declaration, as act_and_wait is — see confirmedByDeclaration.
|
|
237
|
+
args: ((stepArgs) => burstGapMs === undefined ? stepArgs : { ...stepArgs, settleMs: 0 })(confirmedByDeclaration(sequenceStepArgs(step), step['target'], step['expect'] !== undefined)),
|
|
187
238
|
}, perStepTimeout);
|
|
188
239
|
}, session, since, perStepTimeout);
|
|
189
240
|
// Hold the gap BEFORE the next dispatch, measured from this step's own start so the
|
|
@@ -197,16 +248,19 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
197
248
|
}
|
|
198
249
|
if (!outcome.ok) {
|
|
199
250
|
stalledAt = i;
|
|
200
|
-
|
|
251
|
+
await pushStep({
|
|
201
252
|
ref: step['ref'],
|
|
202
253
|
action: step['action'],
|
|
203
254
|
dispatched: false,
|
|
204
255
|
error: outcome.error ?? 'step failed',
|
|
205
256
|
});
|
|
257
|
+
const error = outcome.error ?? 'the step could not be performed';
|
|
206
258
|
expectations.push({
|
|
207
259
|
declared: undefined !== step['expect'],
|
|
208
260
|
held: false,
|
|
209
|
-
observed:
|
|
261
|
+
observed: error,
|
|
262
|
+
// Nothing acted on, or the page gone with the observation: undecided, not a miss.
|
|
263
|
+
...(UNJUDGED_STEP.test(error) ? { undecided: error } : {}),
|
|
210
264
|
});
|
|
211
265
|
break;
|
|
212
266
|
}
|
|
@@ -218,10 +272,13 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
218
272
|
* cannot be read. Sharing the builder is what makes that true by construction rather than
|
|
219
273
|
* by two implementations agreeing today.
|
|
220
274
|
*/
|
|
221
|
-
const
|
|
275
|
+
const describe = () => ({
|
|
222
276
|
...describeStepResult(step, asRecord(outcome.result)),
|
|
223
277
|
...effectOf(session, stepSince),
|
|
224
|
-
};
|
|
278
|
+
});
|
|
279
|
+
const deciding = (step) => (step.contradictions ?? [])
|
|
280
|
+
.map((c) => c.kind)
|
|
281
|
+
.filter((kind) => !isAdvisory(kind) && !isAbsenceDerived(kind));
|
|
225
282
|
/*
|
|
226
283
|
* Evaluate what the step SAID it would cause, in the window this step opened.
|
|
227
284
|
*
|
|
@@ -230,29 +287,61 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
230
287
|
* satisfy step four's assertion, which is a false green built out of correct parts.
|
|
231
288
|
*/
|
|
232
289
|
const parsed = PredicateSchema.safeParse(step['expect']);
|
|
233
|
-
const contradicted = (described.contradictions ?? [])
|
|
234
|
-
.map((c) => c.kind)
|
|
235
|
-
.filter((kind) => !isAdvisory(kind) && !isAbsenceDerived(kind));
|
|
236
|
-
const disagreement = 0 === contradicted.length ? {} : { contradicted };
|
|
237
290
|
if (!parsed.success) {
|
|
238
|
-
|
|
239
|
-
|
|
291
|
+
const described = describe();
|
|
292
|
+
const contradicted = deciding(described);
|
|
293
|
+
expectations.push({
|
|
294
|
+
declared: false,
|
|
295
|
+
...(0 === contradicted.length ? {} : { contradicted }),
|
|
296
|
+
});
|
|
297
|
+
await pushStep(described);
|
|
240
298
|
}
|
|
241
299
|
else {
|
|
242
300
|
const verdict = await waitForPredicate(session, parsed.data, perStepTimeout, stepSince);
|
|
301
|
+
// Described over the window the verdict was taken in, not the dispatch window before it:
|
|
302
|
+
// a step that waited 1.5s for its declared 200 reported that request "still in flight"
|
|
303
|
+
// beside `held: true`, a contradiction about a moment the verdict was not taken at.
|
|
304
|
+
const described = describe();
|
|
305
|
+
const contradicted = deciding(described);
|
|
306
|
+
const disagreement = 0 === contradicted.length ? {} : { contradicted };
|
|
243
307
|
const held = true === verdict.pass;
|
|
308
|
+
// A tab that went away (an external checkout page) or a predicate that could not be
|
|
309
|
+
// read decided nothing: unknown, never a miss blamed on the app.
|
|
310
|
+
const undecided = !held && (true === verdict.observationLost || verdict.inconclusive !== undefined);
|
|
311
|
+
// One check per declared step, journaled as act_and_wait journals its own, so the
|
|
312
|
+
// session's result, its run file and the dashboard all count it. See sequence-journal.ts.
|
|
313
|
+
journalStep(session, { step: i, expect: step['expect'] }, stepVerdictEffect({
|
|
314
|
+
expect: parsed.data,
|
|
315
|
+
held,
|
|
316
|
+
undecided,
|
|
317
|
+
contradicted,
|
|
318
|
+
expected: verdict.expected,
|
|
319
|
+
observed: held ? undefined : (verdict.observed ?? verdict.failureReason),
|
|
320
|
+
source: asRecord(outcome.result)['source'],
|
|
321
|
+
}));
|
|
244
322
|
expectations.push({
|
|
245
323
|
declared: true,
|
|
246
324
|
held,
|
|
325
|
+
...(undecided
|
|
326
|
+
? {
|
|
327
|
+
undecided: true === verdict.observationLost
|
|
328
|
+
? `${verdict.failureReason ?? 'the observation was lost'} (the page left)`
|
|
329
|
+
: (verdict.failureReason ?? 'the predicate could not be read'),
|
|
330
|
+
}
|
|
331
|
+
: {}),
|
|
247
332
|
...disagreement,
|
|
248
333
|
...(verdict.observed === undefined ? {} : { observed: verdict.observed }),
|
|
249
334
|
...(verdict.expected === undefined ? {} : { expected: verdict.expected }),
|
|
250
335
|
});
|
|
251
|
-
|
|
336
|
+
await pushStep({
|
|
252
337
|
...described,
|
|
253
338
|
expected: verdict.expected ?? true,
|
|
254
339
|
held,
|
|
255
340
|
...(held ? {} : { observed: verdict.observed ?? verdict.failureReason }),
|
|
341
|
+
// What would have held, on a case-only miss — the verdict stays a miss.
|
|
342
|
+
...(true === verdict.caseOnlyMiss
|
|
343
|
+
? { caseOnlyMiss: true, wouldHold: verdict.wouldHold }
|
|
344
|
+
: {}),
|
|
256
345
|
});
|
|
257
346
|
if (!held) {
|
|
258
347
|
stoppedAt ??= i;
|
|
@@ -263,7 +352,7 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
263
352
|
}
|
|
264
353
|
catch (err) {
|
|
265
354
|
stalledAt = i;
|
|
266
|
-
|
|
355
|
+
await pushStep({
|
|
267
356
|
ref: step['ref'],
|
|
268
357
|
action: step['action'],
|
|
269
358
|
dispatched: null,
|
|
@@ -285,24 +374,30 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
285
374
|
* The halted step counts: it WAS dispatched, and only the consequence it declared failed
|
|
286
375
|
* afterwards. A stalled step never ran, which is why that index stays exclusive.
|
|
287
376
|
*/
|
|
288
|
-
const completed =
|
|
377
|
+
const completed = DeviationMode.CONTINUE === onDeviation
|
|
378
|
+
? (stalledAt ?? inputSteps.length)
|
|
379
|
+
: stoppedAt !== undefined
|
|
380
|
+
? stoppedAt + 1
|
|
381
|
+
: (stalledAt ?? inputSteps.length);
|
|
289
382
|
if (completed > 0) {
|
|
290
383
|
session.lastAct.markActed(since, undefined, undefined);
|
|
291
384
|
}
|
|
292
385
|
// Same as captureAct: no `active()` gate, so a sequence driven with nothing open still lands
|
|
293
|
-
// in the ambient tape. A stalled plan
|
|
294
|
-
|
|
386
|
+
// in the ambient tape. A stalled plan keeps only the prefix whose steps actually ran.
|
|
387
|
+
let journey;
|
|
388
|
+
if (completed > 0) {
|
|
295
389
|
// A sub-step keeps its `expect` only if it held — same rule as act_and_wait, so a flow
|
|
296
390
|
// never replays an expectation that was never once observed to hold.
|
|
297
|
-
const proved = inputSteps.map((raw, i) => {
|
|
391
|
+
const proved = inputSteps.slice(0, completed).map((raw, i) => {
|
|
298
392
|
const step = asRecord(raw);
|
|
299
393
|
const { expect: _expect, ...rest } = step;
|
|
300
394
|
return true === expectations[i]?.held ? step : rest;
|
|
301
395
|
});
|
|
302
396
|
const recorded = compileSequenceStep({ ...args, steps: proved }, {
|
|
303
|
-
count:
|
|
304
|
-
steps: stepResults,
|
|
397
|
+
count: completed,
|
|
398
|
+
steps: stepResults.slice(0, completed),
|
|
305
399
|
});
|
|
400
|
+
journey = recorded;
|
|
306
401
|
deps.recordings.capture(pageBefore === undefined ? recorded : { ...recorded, page: pageBefore }, undefined, session.id);
|
|
307
402
|
deps.recordings.markEnded(pathOf(session.url), session.id);
|
|
308
403
|
}
|
|
@@ -317,12 +412,26 @@ export const ACT_SEQUENCE_TOOL = {
|
|
|
317
412
|
planned: inputSteps.length,
|
|
318
413
|
dispatched: completed > 0,
|
|
319
414
|
});
|
|
320
|
-
|
|
321
|
-
|
|
415
|
+
// The journey a `keep` offer names, held as a stopped recording so `reticle_flow_save
|
|
416
|
+
// { flowName: JOURNEY_RECORDING, saveAs }` saves exactly what was just driven. The offer used
|
|
417
|
+
// to name a save that refused with no recording, a dead end that cost a round trip.
|
|
418
|
+
if (journey !== undefined && offerToKeep(grade) !== undefined) {
|
|
419
|
+
deps.recordings.saveCompiled({
|
|
420
|
+
name: JOURNEY_RECORDING,
|
|
421
|
+
version: REPLAY_PROGRAM_VERSION,
|
|
422
|
+
steps: [journey],
|
|
423
|
+
...(pageBefore === undefined ? {} : { startPath: pageBefore }),
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
const tailStart = DeviationMode.HALT === onDeviation && stoppedAt !== undefined
|
|
427
|
+
? stoppedAt + 1
|
|
428
|
+
: (stalledAt ?? inputSteps.length);
|
|
429
|
+
const tail = inputSteps.slice(tailStart);
|
|
322
430
|
return withControl(session, {
|
|
323
431
|
since,
|
|
324
432
|
dispatched: completed > 0,
|
|
325
433
|
completed,
|
|
434
|
+
recorded: journey === undefined ? 0 : completed,
|
|
326
435
|
...(stalledAt !== undefined ? { stalled_at: stalledAt } : {}),
|
|
327
436
|
...(stoppedAt !== undefined ? { stopped_at: stoppedAt } : {}),
|
|
328
437
|
verified: grade.verified,
|
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Action tools — reticle_act and reticle_act_and_wait. Split out of tools.ts to keep that file under
|
|
3
|
-
* the line cap and assembled back into the tool list there via ...ACT_TOOLS; the native-input attempt
|
|
4
|
-
* itself lives in real-input-attempt.ts for the same reason.
|
|
5
|
-
*
|
|
6
|
-
* `reticle_act_sequence` is a sibling file and is assembled by `tools.ts` directly. It used to be
|
|
7
|
-
* re-exported through this list, which made a cycle out of nothing: that file needs `actCommand` from
|
|
8
|
-
* here, and a registry is the right place to collect a definition from.
|
|
9
|
-
*/
|
|
10
1
|
import type { Session } from '../../portal/session/session.js';
|
|
11
2
|
import { type ToolDef, type ToolDeps } from './tool-kit.js';
|
|
12
3
|
/**
|