@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
|
@@ -25,7 +25,14 @@ export interface NarrowWritePort {
|
|
|
25
25
|
resolvePath: (name: string, projectId?: ProjectId) => Promise<string | null>;
|
|
26
26
|
write: (path: string, contents: string) => Promise<void>;
|
|
27
27
|
serialize: (flow: FlowFile) => string;
|
|
28
|
+
/** The file as it is on disk, so a change lands in it and nothing else moves. */
|
|
29
|
+
readRaw?: (path: string) => Promise<string>;
|
|
28
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* `raw` with only what changed between `before` and `after` applied, everything else as written:
|
|
33
|
+
* its key order, its fields the reader fills in by default, its own spelling. Pure.
|
|
34
|
+
*/
|
|
35
|
+
export declare function withChangesOnly(raw: unknown, before: unknown, after: unknown): unknown;
|
|
29
36
|
export declare function changeInPlace<T>(port: NarrowWritePort, name: string, projectId: ProjectId | undefined, change: (flow: FlowFile) => {
|
|
30
37
|
next: FlowFile;
|
|
31
38
|
value: T;
|
|
@@ -2,6 +2,28 @@ import { FlowErrorCode, FlowFileSchema } from '@reticlehq/core';
|
|
|
2
2
|
import { describeFlowZodFailure } from './flow-expect-grammar.js';
|
|
3
3
|
import { isValidFlowName } from '../../memory/project/dir/reticle-dir.js';
|
|
4
4
|
import { safeProjectId } from './flow-result.js';
|
|
5
|
+
const isPlain = (v) => 'object' === typeof v && null !== v && !Array.isArray(v);
|
|
6
|
+
const same = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
|
7
|
+
/**
|
|
8
|
+
* `raw` with only what changed between `before` and `after` applied, everything else as written:
|
|
9
|
+
* its key order, its fields the reader fills in by default, its own spelling. Pure.
|
|
10
|
+
*/
|
|
11
|
+
export function withChangesOnly(raw, before, after) {
|
|
12
|
+
if (Array.isArray(raw) && Array.isArray(before) && Array.isArray(after))
|
|
13
|
+
return raw.length === before.length && before.length === after.length
|
|
14
|
+
? raw.map((item, i) => withChangesOnly(item, before[i], after[i]))
|
|
15
|
+
: after;
|
|
16
|
+
if (!isPlain(raw) || !isPlain(before) || !isPlain(after))
|
|
17
|
+
return after;
|
|
18
|
+
const out = { ...raw };
|
|
19
|
+
for (const key of Object.keys(after))
|
|
20
|
+
if (!same(after[key], before[key]))
|
|
21
|
+
out[key] = key in raw ? withChangesOnly(raw[key], before[key], after[key]) : after[key];
|
|
22
|
+
for (const key of Object.keys(before))
|
|
23
|
+
if (!(key in after))
|
|
24
|
+
delete out[key];
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
5
27
|
export async function changeInPlace(port, name, projectId, change) {
|
|
6
28
|
if (!isValidFlowName(name))
|
|
7
29
|
return { ok: false, code: FlowErrorCode.INVALID_NAME };
|
|
@@ -21,6 +43,19 @@ export async function changeInPlace(port, name, projectId, change) {
|
|
|
21
43
|
detail: describeFlowZodFailure(parsed.error),
|
|
22
44
|
};
|
|
23
45
|
}
|
|
24
|
-
|
|
46
|
+
// A replay that learned nothing new leaves a committed file alone: every replay used to rewrite
|
|
47
|
+
// it (keys reordered, defaults written in), and `git status` called it modified.
|
|
48
|
+
if (port.serialize(parsed.data) === port.serialize(loaded.value))
|
|
49
|
+
return { ok: true, value };
|
|
50
|
+
let raw;
|
|
51
|
+
try {
|
|
52
|
+
raw = JSON.parse((await port.readRaw?.(path)) ?? 'null');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
raw = null;
|
|
56
|
+
}
|
|
57
|
+
await port.write(path, isPlain(raw)
|
|
58
|
+
? `${JSON.stringify(withChangesOnly(raw, loaded.value, parsed.data), null, 2)}\n`
|
|
59
|
+
: port.serialize(parsed.data));
|
|
25
60
|
return { ok: true, value };
|
|
26
61
|
}
|
|
@@ -27,6 +27,19 @@ function recordingRouteOf(pathname, hash = '') {
|
|
|
27
27
|
return routePathOf(0 === pathname.length ? '/' : pathname, fragment);
|
|
28
28
|
return pathname;
|
|
29
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* A startPath as a page key: its query dropped, hash kept. A startPath keeps the app's query so
|
|
32
|
+
* replay starts on the filtered page (#1411), but a ROUTE_CHANGE contributes only pathname and
|
|
33
|
+
* hash, so `/products?scope=X` then `/checkout` then `/products` must compare the first and last
|
|
34
|
+
* as one page or the backtrack goes unseen.
|
|
35
|
+
*/
|
|
36
|
+
function pageKeyOf(startPath) {
|
|
37
|
+
const hashAt = startPath.indexOf('#');
|
|
38
|
+
const queryAt = startPath.indexOf('?');
|
|
39
|
+
if (queryAt < 0 || (hashAt >= 0 && queryAt > hashAt))
|
|
40
|
+
return startPath;
|
|
41
|
+
return startPath.slice(0, queryAt) + (hashAt >= 0 ? startPath.slice(hashAt) : '');
|
|
42
|
+
}
|
|
30
43
|
function collapseConsecutive(routes) {
|
|
31
44
|
const out = [];
|
|
32
45
|
for (const route of routes) {
|
|
@@ -60,7 +73,7 @@ export function recordingBacktrackWarning(routes) {
|
|
|
60
73
|
export function routesFromRecording(startPath, events) {
|
|
61
74
|
const raw = [];
|
|
62
75
|
if (undefined !== startPath)
|
|
63
|
-
raw.push(recordingRouteOf(startPath));
|
|
76
|
+
raw.push(recordingRouteOf(pageKeyOf(startPath)));
|
|
64
77
|
for (const event of events) {
|
|
65
78
|
if (EventType.ROUTE_CHANGE !== event.type)
|
|
66
79
|
continue;
|
|
@@ -7,6 +7,8 @@ export interface RecordedStep {
|
|
|
7
7
|
args: Record<string, unknown>;
|
|
8
8
|
/** false if any ref could not be normalized to a testid (replay only valid in-session). */
|
|
9
9
|
stable: boolean;
|
|
10
|
+
/** The caller's per-step wait budget, when one was explicitly provided. */
|
|
11
|
+
timeoutMs?: number;
|
|
10
12
|
/** Optional post-condition annotation carried into the on-disk flow's expect. */
|
|
11
13
|
expect?: Predicate;
|
|
12
14
|
/**
|
|
@@ -27,6 +29,12 @@ export interface RecordedStep {
|
|
|
27
29
|
* `invoke` first and treats the step as a call.
|
|
28
30
|
*/
|
|
29
31
|
invoke?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Network mocks were active on this step's tab when it ran. RECORDER-INTERNAL, ambient tape only,
|
|
34
|
+
* like `route`: a journey that ran against mocked responses replays against the real backend,
|
|
35
|
+
* so it is not auto-saved (#1459).
|
|
36
|
+
*/
|
|
37
|
+
mocked?: true;
|
|
30
38
|
/** The page this step ran on. Written to the saved step (unlike `route`, which cuts journeys). */
|
|
31
39
|
page?: string;
|
|
32
40
|
/** The page it ended on once it settled — see `markEnded`. */
|
|
@@ -51,6 +59,11 @@ interface ActiveRecording {
|
|
|
51
59
|
steps: RecordedStep[];
|
|
52
60
|
/** The route the journey began on. See CompiledProgram.startPath. */
|
|
53
61
|
startPath?: string;
|
|
62
|
+
/**
|
|
63
|
+
* The document the tab was on at start. A full-page load makes a new one even when the SDK keeps
|
|
64
|
+
* its session id, and its clock is from a different connection, so this is how stop tells (#1411).
|
|
65
|
+
*/
|
|
66
|
+
document?: string;
|
|
54
67
|
/**
|
|
55
68
|
* For each recording that was ALREADY in flight when this one started, how many steps it had.
|
|
56
69
|
*
|
|
@@ -101,12 +114,20 @@ export declare const INVOKE_TOOL: string;
|
|
|
101
114
|
* buffer.
|
|
102
115
|
*/
|
|
103
116
|
export declare const AMBIENT_RECORDING = "__ambient__";
|
|
117
|
+
/**
|
|
118
|
+
* One ambient tape per tab. It was one for the whole daemon, so a drive in ANOTHER app (the console
|
|
119
|
+
* beside the repo's own app) was cut into a flow and saved into this repo's committed `flows/`, and
|
|
120
|
+
* synced to its project. A tape now holds one tab's steps, and that tab's end takes only its own.
|
|
121
|
+
*/
|
|
122
|
+
export declare const ambientRecordingOf: (session: string | undefined) => string;
|
|
123
|
+
/** Whether a recording is an ambient tape: the daemon's own, never one somebody opened. */
|
|
124
|
+
export declare const isAmbient: (name: string) => boolean;
|
|
104
125
|
export declare class RecordingStore {
|
|
105
126
|
#private;
|
|
106
127
|
private readonly byHarness;
|
|
107
128
|
/** `byHarness`: whether the step being captured was driven by the Harness, which tapes its own. */
|
|
108
129
|
constructor(byHarness?: () => boolean);
|
|
109
|
-
start(name: string, cursor: number, startPath?: string, session?: string): void;
|
|
130
|
+
start(name: string, cursor: number, startPath?: string, session?: string, document?: string): void;
|
|
110
131
|
isRecording(name: string): boolean;
|
|
111
132
|
/**
|
|
112
133
|
* Number of steps captured so far in the named ACTIVE recording (0 if it
|
|
@@ -127,6 +148,11 @@ export declare class RecordingStore {
|
|
|
127
148
|
* Opened lazily on the first step rather than in the constructor: a store that never records
|
|
128
149
|
* anything should not carry an empty tape, and "did anything happen at all" stays answerable.
|
|
129
150
|
*/
|
|
151
|
+
/**
|
|
152
|
+
* Whether a tab has network mocks installed from now on. Each ambient step on it is marked while
|
|
153
|
+
* they are, so the journey it belongs to is not auto-saved as a flow (#1459).
|
|
154
|
+
*/
|
|
155
|
+
markMocked(session: string | undefined, active: boolean): void;
|
|
130
156
|
capture(step: RecordedStep, route?: string, session?: string): void;
|
|
131
157
|
/**
|
|
132
158
|
* Add a consequence to the last captured step of every active recording.
|
|
@@ -176,6 +202,8 @@ export declare class RecordingStore {
|
|
|
176
202
|
saveCompiled(program: CompiledProgram): void;
|
|
177
203
|
getCompiled(name: string): CompiledProgram | undefined;
|
|
178
204
|
active(): string[];
|
|
205
|
+
/** The ambient tape of one tab (or of steps no tab named), taken: what its session end saves. */
|
|
206
|
+
takeAmbient(session: string | undefined): ActiveRecording | undefined;
|
|
179
207
|
/**
|
|
180
208
|
* Names of recordings that have been STOPPED and compiled.
|
|
181
209
|
*
|
|
@@ -20,6 +20,14 @@ export const INVOKE_TOOL = FlowStepTool.INVOKE;
|
|
|
20
20
|
* buffer.
|
|
21
21
|
*/
|
|
22
22
|
export const AMBIENT_RECORDING = '__ambient__';
|
|
23
|
+
/**
|
|
24
|
+
* One ambient tape per tab. It was one for the whole daemon, so a drive in ANOTHER app (the console
|
|
25
|
+
* beside the repo's own app) was cut into a flow and saved into this repo's committed `flows/`, and
|
|
26
|
+
* synced to its project. A tape now holds one tab's steps, and that tab's end takes only its own.
|
|
27
|
+
*/
|
|
28
|
+
export const ambientRecordingOf = (session) => session === undefined ? AMBIENT_RECORDING : `${AMBIENT_RECORDING}:${session}`;
|
|
29
|
+
/** Whether a recording is an ambient tape: the daemon's own, never one somebody opened. */
|
|
30
|
+
export const isAmbient = (name) => AMBIENT_RECORDING === name || name.startsWith(`${AMBIENT_RECORDING}:`);
|
|
23
31
|
/**
|
|
24
32
|
* How long a journey the ambient tape will hold.
|
|
25
33
|
*
|
|
@@ -32,13 +40,17 @@ export class RecordingStore {
|
|
|
32
40
|
byHarness;
|
|
33
41
|
#active = new Map();
|
|
34
42
|
#compiled = new Map();
|
|
43
|
+
/** The ambient tape the last step went on: the one a refuted claim is taken off. */
|
|
44
|
+
#lastAmbient;
|
|
35
45
|
/** A navigation came after the last captured step — see markNavigated. */
|
|
36
46
|
#navigatedSinceStep = false;
|
|
47
|
+
/** Tabs with network mocks installed now, keyed by session ('' for none named). See markMocked. */
|
|
48
|
+
#mocked = new Set();
|
|
37
49
|
/** `byHarness`: whether the step being captured was driven by the Harness, which tapes its own. */
|
|
38
50
|
constructor(byHarness = () => false) {
|
|
39
51
|
this.byHarness = byHarness;
|
|
40
52
|
}
|
|
41
|
-
start(name, cursor, startPath, session) {
|
|
53
|
+
start(name, cursor, startPath, session, document) {
|
|
42
54
|
const openedOver = new Map();
|
|
43
55
|
for (const [outer, rec] of this.#targets(session))
|
|
44
56
|
openedOver.set(outer, rec.steps.length);
|
|
@@ -48,6 +60,7 @@ export class RecordingStore {
|
|
|
48
60
|
openedOver,
|
|
49
61
|
...(startPath === undefined ? {} : { startPath }),
|
|
50
62
|
...(session === undefined ? {} : { session }),
|
|
63
|
+
...(document === undefined ? {} : { document }),
|
|
51
64
|
});
|
|
52
65
|
}
|
|
53
66
|
/** The open recordings a step from `session` belongs to. See ActiveRecording.session. */
|
|
@@ -78,27 +91,44 @@ export class RecordingStore {
|
|
|
78
91
|
* Opened lazily on the first step rather than in the constructor: a store that never records
|
|
79
92
|
* anything should not carry an empty tape, and "did anything happen at all" stays answerable.
|
|
80
93
|
*/
|
|
94
|
+
/**
|
|
95
|
+
* Whether a tab has network mocks installed from now on. Each ambient step on it is marked while
|
|
96
|
+
* they are, so the journey it belongs to is not auto-saved as a flow (#1459).
|
|
97
|
+
*/
|
|
98
|
+
markMocked(session, active) {
|
|
99
|
+
if (active)
|
|
100
|
+
this.#mocked.add(session ?? '');
|
|
101
|
+
else
|
|
102
|
+
this.#mocked.delete(session ?? '');
|
|
103
|
+
}
|
|
81
104
|
capture(step, route, session) {
|
|
82
105
|
this.#navigatedSinceStep = false;
|
|
83
|
-
|
|
84
|
-
|
|
106
|
+
const mocked = this.#mocked.has(session ?? '');
|
|
107
|
+
const ambient = ambientRecordingOf(session);
|
|
108
|
+
if (!this.#active.has(ambient)) {
|
|
109
|
+
this.#active.set(ambient, {
|
|
85
110
|
cursor: 0,
|
|
86
111
|
steps: [],
|
|
87
112
|
openedOver: new Map(),
|
|
113
|
+
...(session === undefined ? {} : { session }),
|
|
88
114
|
});
|
|
89
115
|
}
|
|
116
|
+
this.#lastAmbient = ambient;
|
|
90
117
|
for (const [name, rec] of this.#targets(session)) {
|
|
118
|
+
// Another tab's tape is that tab's journey, whatever else this step belongs to.
|
|
119
|
+
if (isAmbient(name) && name !== ambient)
|
|
120
|
+
continue;
|
|
91
121
|
// The ambient tape is opened by the system and closed by nobody, so it is the one recording
|
|
92
122
|
// with no human deciding when it has seen enough. Bounded here rather than left to grow for
|
|
93
123
|
// the length of a daemon's life. Appending STOPS at the cap instead of dropping the oldest: a
|
|
94
124
|
// flow replays from its FIRST step, so a tape missing its beginning is not a shorter journey,
|
|
95
125
|
// it is a different one that starts in a state nothing established. A recording somebody
|
|
96
126
|
// opened on purpose is not capped — they said when it starts and they say when it stops.
|
|
97
|
-
if (
|
|
127
|
+
if (isAmbient(name) && rec.steps.length >= AMBIENT_STEP_CAP)
|
|
98
128
|
continue;
|
|
99
129
|
// The Harness saves its own recordings. Taping its steps too saved every drive twice: once as
|
|
100
130
|
// the Harness's flow and again, at session end, as a `drive-*` copy with a guessed name.
|
|
101
|
-
if (
|
|
131
|
+
if (isAmbient(name) && this.byHarness())
|
|
102
132
|
continue;
|
|
103
133
|
// A step nobody marked ended where the next one began.
|
|
104
134
|
const previous = rec.steps.at(-1);
|
|
@@ -108,7 +138,13 @@ export class RecordingStore {
|
|
|
108
138
|
// The route rides on the AMBIENT tape only: a recording somebody opened deliberately is
|
|
109
139
|
// already one journey by construction, and stamping a route on its steps would change what a
|
|
110
140
|
// deliberate recording contains.
|
|
111
|
-
rec.steps.push(
|
|
141
|
+
rec.steps.push(isAmbient(name) && (route !== undefined || mocked)
|
|
142
|
+
? {
|
|
143
|
+
...step,
|
|
144
|
+
...(route === undefined ? {} : { route }),
|
|
145
|
+
...(mocked ? { mocked: true } : {}),
|
|
146
|
+
}
|
|
147
|
+
: step);
|
|
112
148
|
}
|
|
113
149
|
}
|
|
114
150
|
/**
|
|
@@ -121,10 +157,17 @@ export class RecordingStore {
|
|
|
121
157
|
attachExpect(expect, session) {
|
|
122
158
|
if (this.#navigatedSinceStep)
|
|
123
159
|
return;
|
|
124
|
-
|
|
160
|
+
const mocked = this.#mocked.has(session ?? '');
|
|
161
|
+
for (const [name, rec] of this.#targets(session)) {
|
|
162
|
+
if (isAmbient(name) && name !== ambientRecordingOf(session))
|
|
163
|
+
continue;
|
|
125
164
|
const last = rec.steps.at(-1);
|
|
126
165
|
if (last === undefined)
|
|
127
166
|
continue;
|
|
167
|
+
// A proof read while mocks are active rests on mocked responses even when the act before it
|
|
168
|
+
// ran unmocked, so the ambient step it joins is marked too (#1459).
|
|
169
|
+
if (mocked && isAmbient(name))
|
|
170
|
+
last.mocked = true;
|
|
128
171
|
const held = last.expect;
|
|
129
172
|
last.expect =
|
|
130
173
|
held === undefined
|
|
@@ -153,7 +196,7 @@ export class RecordingStore {
|
|
|
153
196
|
* is left as they drove it.
|
|
154
197
|
*/
|
|
155
198
|
unassertLast() {
|
|
156
|
-
const tape = this.#active.get(
|
|
199
|
+
const tape = this.#lastAmbient === undefined ? undefined : this.#active.get(this.#lastAmbient);
|
|
157
200
|
const last = tape?.steps.at(-1);
|
|
158
201
|
if (tape === undefined || last === undefined || last.expect === undefined)
|
|
159
202
|
return;
|
|
@@ -169,7 +212,9 @@ export class RecordingStore {
|
|
|
169
212
|
markEnded(page, session) {
|
|
170
213
|
if (page === undefined)
|
|
171
214
|
return;
|
|
172
|
-
for (const [, rec] of this.#targets(session)) {
|
|
215
|
+
for (const [name, rec] of this.#targets(session)) {
|
|
216
|
+
if (isAmbient(name) && name !== ambientRecordingOf(session))
|
|
217
|
+
continue;
|
|
173
218
|
const last = rec.steps.at(-1);
|
|
174
219
|
if (last !== undefined && last.endPage === undefined)
|
|
175
220
|
last.endPage = page;
|
|
@@ -214,7 +259,12 @@ export class RecordingStore {
|
|
|
214
259
|
return this.#compiled.get(name);
|
|
215
260
|
}
|
|
216
261
|
active() {
|
|
217
|
-
|
|
262
|
+
// One tab's tape is that tab's: the list names what somebody opened, and the plain tape as before.
|
|
263
|
+
return [...this.#active.keys()].filter((name) => !name.startsWith(`${AMBIENT_RECORDING}:`));
|
|
264
|
+
}
|
|
265
|
+
/** The ambient tape of one tab (or of steps no tab named), taken: what its session end saves. */
|
|
266
|
+
takeAmbient(session) {
|
|
267
|
+
return this.stop(ambientRecordingOf(session));
|
|
218
268
|
}
|
|
219
269
|
/**
|
|
220
270
|
* Names of recordings that have been STOPPED and compiled.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { REDACTED_FILL, secretEnvKey } from './fields/flow-secret-field.js';
|
|
1
|
+
import { REDACTED_FILL, SECRET_NAME_ARG, secretEnvKey, secretValue, } from './fields/flow-secret-field.js';
|
|
2
2
|
import { FlowPredicateSchema, Verified } from '@reticlehq/core';
|
|
3
3
|
import { DANGEROUS_ACTION_CONFIRM_ARG, ReticleCommand, QueryBy, } from '@reticlehq/core';
|
|
4
|
-
import { ReticleTool } from '@reticlehq/core';
|
|
4
|
+
import { ReticleTool, invokedFlowMissing } from '@reticlehq/core';
|
|
5
5
|
import { formatStepAddress } from 'open-verification';
|
|
6
6
|
import { refFor } from './flow-anchor.js';
|
|
7
7
|
import { asRecord, asString } from '@reticlehq/core';
|
|
@@ -44,10 +44,11 @@ export function queryRefs(result) {
|
|
|
44
44
|
export function replayActionArgs(value, confirmDangerous = false, field) {
|
|
45
45
|
const args = { ...asRecord(value) };
|
|
46
46
|
delete args[DANGEROUS_ACTION_CONFIRM_ARG];
|
|
47
|
+
delete args[SECRET_NAME_ARG];
|
|
47
48
|
if (confirmDangerous)
|
|
48
49
|
args[DANGEROUS_ACTION_CONFIRM_ARG] = true;
|
|
49
50
|
if (REDACTED_FILL === args['value'] && field !== undefined) {
|
|
50
|
-
const supplied =
|
|
51
|
+
const supplied = secretValue(secretEnvKey(field), process.env);
|
|
51
52
|
if (supplied !== undefined && supplied.length > 0)
|
|
52
53
|
args['value'] = supplied;
|
|
53
54
|
}
|
|
@@ -176,7 +177,23 @@ function enforceableExpect(raw) {
|
|
|
176
177
|
*/
|
|
177
178
|
export function compileActStep(args, res) {
|
|
178
179
|
const { args: compiled, stable } = compileAnchorArgs(asRecord(res), asString(args['ref']) ?? '', asString(args['action']) ?? '', replayActionArgs(args['args']));
|
|
179
|
-
|
|
180
|
+
const timeoutMs = explicitTimeoutMs(args);
|
|
181
|
+
return {
|
|
182
|
+
tool: ReticleTool.ACT,
|
|
183
|
+
stable,
|
|
184
|
+
args: compiled,
|
|
185
|
+
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
/** Keep only the timeout shape accepted by the public tool, including an intentional zero. */
|
|
189
|
+
function explicitTimeoutMs(args) {
|
|
190
|
+
const timeoutMs = args['timeout_ms'];
|
|
191
|
+
return 'number' === typeof timeoutMs &&
|
|
192
|
+
Number.isFinite(timeoutMs) &&
|
|
193
|
+
Number.isInteger(timeoutMs) &&
|
|
194
|
+
0 <= timeoutMs
|
|
195
|
+
? timeoutMs
|
|
196
|
+
: undefined;
|
|
180
197
|
}
|
|
181
198
|
/**
|
|
182
199
|
* The ONE anchor chooser: testid (gold) > role+name (identifies an instance) > component/source
|
|
@@ -258,7 +275,13 @@ export function compileSequenceStep(args, res) {
|
|
|
258
275
|
const expect = enforceableExpect(step['expect']);
|
|
259
276
|
return expect === undefined ? compiled.args : { ...compiled.args, expect };
|
|
260
277
|
});
|
|
261
|
-
|
|
278
|
+
const timeoutMs = explicitTimeoutMs(args);
|
|
279
|
+
return {
|
|
280
|
+
tool: ReticleTool.ACT_SEQUENCE,
|
|
281
|
+
stable,
|
|
282
|
+
args: { steps: subSteps },
|
|
283
|
+
...(timeoutMs === undefined ? {} : { timeoutMs }),
|
|
284
|
+
};
|
|
262
285
|
}
|
|
263
286
|
/**
|
|
264
287
|
* Resolve a recorded step's element to a live ref, by whichever anchor the compiler chose.
|
|
@@ -368,7 +391,7 @@ via = []) {
|
|
|
368
391
|
tool: step.tool,
|
|
369
392
|
ok: false,
|
|
370
393
|
at: address,
|
|
371
|
-
error:
|
|
394
|
+
error: invokedFlowMissing(step.invoke),
|
|
372
395
|
});
|
|
373
396
|
break;
|
|
374
397
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `reticle_flow_replay`'s answer: one flow replayed, written down as a run, ending with the Reticle
|
|
3
|
+
* result block. The run id is minted first, so each replayed step's screenshot is filed under it.
|
|
4
|
+
*/
|
|
5
|
+
import { type FlowReplayResult } from '@reticlehq/core';
|
|
6
|
+
import type { ToolDeps } from '../../surface/tools/tool-kit.js';
|
|
7
|
+
export declare function replayOneFlow(deps: ToolDeps, args: Record<string, unknown>, appUrl: string | undefined): Promise<FlowReplayResult>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `reticle_flow_replay`'s answer: one flow replayed, written down as a run, ending with the Reticle
|
|
3
|
+
* result block. The run id is minted first, so each replayed step's screenshot is filed under it.
|
|
4
|
+
*/
|
|
5
|
+
import { asString } from '@reticlehq/core';
|
|
6
|
+
import { defaultRunId, withShotRun } from '../../judgement/runs/default-run-id.js';
|
|
7
|
+
import { persistAndSyncVerificationRun } from '../../judgement/runs/verification-sync.js';
|
|
8
|
+
import { rootForTarget, safeSessionTarget } from '../../memory/project/session-root.js';
|
|
9
|
+
import { replayResult, resultField } from '../../surface/tools/reticle-result.js';
|
|
10
|
+
import { replaySeededOrNot } from './flow-learning.js';
|
|
11
|
+
export function replayOneFlow(deps, args, appUrl) {
|
|
12
|
+
return withShotRun(defaultRunId(), async () => {
|
|
13
|
+
const start = deps.now();
|
|
14
|
+
const replay = await replaySeededOrNot(deps, args, appUrl);
|
|
15
|
+
const durationMs = deps.now() - start;
|
|
16
|
+
const target = safeSessionTarget(deps, asString(args['sessionId']));
|
|
17
|
+
// Written down as a run, and named in the answer: the platform's Re-verify ties its check to
|
|
18
|
+
// it, and a check with no run could never resolve the issue it was for.
|
|
19
|
+
const runId = await persistAndSyncVerificationRun(deps, [{ replay, durationMs }], target);
|
|
20
|
+
return {
|
|
21
|
+
...replay,
|
|
22
|
+
...(runId === undefined ? {} : { runId }),
|
|
23
|
+
...resultField(() => replayResult(rootForTarget(deps, target), replay, durationMs, runId)),
|
|
24
|
+
};
|
|
25
|
+
});
|
|
26
|
+
}
|