@reticlehq/server 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +123 -116
- package/dist/chromium-launch-options.d.ts +3 -1
- package/dist/chromium-launch-options.js +2 -1
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +19 -2
- package/dist/command/cli/adhoc-verdict.js +76 -9
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/answers/open-note.d.ts +2 -0
- package/dist/command/cli/answers/open-note.js +22 -0
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +31 -112
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +35 -5
- package/dist/command/cli/cli-verify.js +114 -35
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +192 -341
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +22 -0
- package/dist/command/cli/cloud-login.js +96 -8
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
- package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/drive/drive-attach.d.ts +27 -2
- package/dist/command/cli/drive/drive-attach.js +71 -4
- package/dist/command/cli/drive/drive-command.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +13 -7
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.d.ts +10 -0
- package/dist/command/cli/ports/port-holder.js +25 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +35 -12
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -181
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +20 -0
- package/dist/command/cli.js +130 -104
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +23 -1
- package/dist/command/daemon/daemon-resolve.js +79 -9
- package/dist/command/setup/agent-writer.d.ts +1 -1
- package/dist/command/setup/agent-writer.js +3 -2
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
- package/dist/command/setup/bringup/connect-lease.js +1 -0
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
- package/dist/command/setup/bringup/dev-server-wait.js +19 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +14 -1
- package/dist/command/setup/init/init-port.js +32 -2
- package/dist/command/setup/init/init-runtime.d.ts +22 -2
- package/dist/command/setup/init/init-runtime.js +114 -38
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +38 -9
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +2 -1
- package/dist/command/setup/run-setup.d.ts +34 -9
- package/dist/command/setup/run-setup.js +65 -51
- package/dist/command/setup/setup-command.d.ts +25 -1
- package/dist/command/setup/setup-command.js +59 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +49 -4
- package/dist/features/crawl/crawl-tools.js +4 -0
- package/dist/features/crawl/crawl.d.ts +6 -0
- package/dist/features/crawl/crawl.js +23 -2
- package/dist/features/exhaust/ledger.d.ts +21 -14
- package/dist/features/exhaust/ledger.js +35 -9
- package/dist/features/harness/app-findings.d.ts +2 -0
- package/dist/features/harness/app-findings.js +52 -0
- package/dist/features/harness/drive-report.d.ts +61 -1
- package/dist/features/harness/drive-report.js +394 -26
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +10 -14
- package/dist/features/harness/drivers.js +10 -14
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/fill-values.d.ts +3 -73
- package/dist/features/harness/fill-values.js +3 -169
- package/dist/features/harness/goals.d.ts +82 -0
- package/dist/features/harness/goals.js +330 -0
- package/dist/features/harness/harness.d.ts +51 -1
- package/dist/features/harness/harness.js +207 -6
- package/dist/features/harness/platform/drive-target.d.ts +30 -0
- package/dist/features/harness/platform/drive-target.js +81 -0
- package/dist/features/harness/platform/local-apps.d.ts +127 -0
- package/dist/features/harness/platform/local-apps.js +280 -0
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +186 -0
- package/dist/features/harness/platform/remote-drive.js +378 -0
- package/dist/features/harness/platform/script.d.ts +94 -0
- package/dist/features/harness/platform/script.js +260 -0
- package/dist/features/harness/platform/server-driver.d.ts +54 -0
- package/dist/features/harness/platform/server-driver.js +182 -0
- package/dist/features/harness/platform-config.d.ts +41 -1
- package/dist/features/harness/platform-config.js +106 -9
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/app-controls.d.ts +5 -0
- package/dist/features/harness/script/app-controls.js +40 -0
- package/dist/features/harness/script/lane-ids.d.ts +14 -0
- package/dist/features/harness/script/lane-ids.js +16 -0
- package/dist/features/harness/script/script-run.d.ts +70 -0
- package/dist/features/harness/script/script-run.js +606 -0
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.d.ts +10 -1
- package/dist/features/visual/visual-tools.js +62 -17
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +23 -0
- package/dist/hooks/driven-by.js +56 -0
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/hooks/hook-commands.js +15 -4
- package/dist/hooks/tool-log.d.ts +9 -0
- package/dist/hooks/tool-log.js +29 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -243
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
- package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
- package/dist/judgement/runs/artifact/run-store.js +195 -3
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +71 -1
- package/dist/judgement/runs/drive-run.js +317 -5
- package/dist/judgement/runs/repair-prompt.js +1 -1
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +13 -3
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +5 -2
- package/dist/judgement/runs/verification-sync.js +40 -18
- package/dist/language/flows/change/gate.d.ts +10 -0
- package/dist/language/flows/change/gate.js +22 -0
- package/dist/language/flows/decision.js +36 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +61 -10
- package/dist/language/flows/flow-anchor.js +98 -6
- package/dist/language/flows/flow-cross-step.d.ts +15 -0
- package/dist/language/flows/flow-cross-step.js +21 -0
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +45 -14
- package/dist/language/flows/flow-mutate-tools.js +5 -3
- package/dist/language/flows/flow-replay-run.d.ts +23 -9
- package/dist/language/flows/flow-replay-run.js +115 -110
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +40 -1
- package/dist/language/flows/flow-replay.js +110 -22
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-scope.js +5 -1
- package/dist/language/flows/flow-step-runners.d.ts +22 -2
- package/dist/language/flows/flow-step-runners.js +247 -47
- package/dist/language/flows/flow-store-for-session.d.ts +2 -2
- package/dist/language/flows/flow-store-for-session.js +7 -3
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +112 -89
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +74 -12
- package/dist/language/flows/heal-run.js +6 -4
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/flake.d.ts +2 -2
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
- package/dist/language/flows/recording/tape/recordings.js +95 -13
- package/dist/language/flows/replay-from-hud.d.ts +20 -0
- package/dist/language/flows/replay-from-hud.js +51 -0
- package/dist/language/flows/replay.d.ts +9 -5
- package/dist/language/flows/replay.js +56 -15
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/suite/suite-flakes.js +2 -0
- package/dist/language/flows/suite-selection.d.ts +2 -15
- package/dist/language/flows/suite-selection.js +4 -3
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +202 -191
- package/dist/launch-chromium.d.ts +27 -5
- package/dist/launch-chromium.js +38 -8
- package/dist/memory/cloud/cloud-config.d.ts +22 -1
- package/dist/memory/cloud/cloud-config.js +34 -5
- package/dist/memory/cloud/cloud-sync.d.ts +17 -14
- package/dist/memory/cloud/cloud-sync.js +15 -4
- package/dist/memory/cloud/harness-config.d.ts +75 -1
- package/dist/memory/cloud/harness-config.js +115 -24
- package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
- package/dist/memory/cloud/hud-notices-source.js +128 -0
- package/dist/memory/cloud/memory-scope.d.ts +161 -0
- package/dist/memory/cloud/memory-scope.js +227 -0
- package/dist/memory/cloud/sync-cycle.d.ts +44 -7
- package/dist/memory/cloud/sync-cycle.js +129 -15
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +121 -9
- package/dist/memory/cloud/sync-disk.d.ts +1 -1
- package/dist/memory/cloud/sync-disk.js +31 -10
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +34 -0
- package/dist/memory/impact/account-watch.js +59 -0
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +12 -2
- package/dist/memory/impact/impact-store.d.ts +17 -4
- package/dist/memory/impact/impact-store.js +169 -63
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +14 -2
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +122 -4
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/envelope.d.ts +8 -8
- package/dist/memory/journal/journal-recorder.js +52 -3
- package/dist/memory/journal/on-disk/retention.d.ts +8 -0
- package/dist/memory/journal/on-disk/retention.js +32 -2
- package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
- package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +42 -9
- package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
- package/dist/memory/project/artifact-root-resolver.js +125 -16
- package/dist/memory/project/artifact-root.d.ts +46 -8
- package/dist/memory/project/artifact-root.js +89 -10
- package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
- package/dist/memory/project/dir/reticle-dir.js +26 -3
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/project-tools.js +22 -3
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +26 -1
- package/dist/memory/project/session-root.js +49 -5
- package/dist/memory/project/sync-status.d.ts +85 -0
- package/dist/memory/project/sync-status.js +224 -0
- package/dist/memory/recall/memory-tools.js +47 -2
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.d.ts +19 -0
- package/dist/memory/recall/project-memory.js +80 -13
- package/dist/portal/bridge/bridge.d.ts +9 -3
- package/dist/portal/bridge/bridge.js +82 -22
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/pairing-token.d.ts +9 -0
- package/dist/portal/bridge/pairing-token.js +17 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +83 -10
- package/dist/portal/input/real-input.js +218 -30
- package/dist/portal/input/viewport-tools.js +3 -3
- package/dist/portal/pool/browser-pool.d.ts +70 -9
- package/dist/portal/pool/browser-pool.js +190 -37
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +35 -0
- package/dist/portal/pool/playwright-launcher.js +64 -3
- package/dist/portal/pool/pool-contract.d.ts +28 -5
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.d.ts +8 -0
- package/dist/portal/session/command-payload.js +24 -0
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
- package/dist/portal/session/dev-server/dev-command.js +87 -12
- package/dist/portal/session/facts/departure-note.d.ts +22 -0
- package/dist/portal/session/facts/departure-note.js +47 -0
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/facts/session-replaced.d.ts +5 -0
- package/dist/portal/session/facts/session-replaced.js +5 -0
- package/dist/portal/session/first-run-wiring.d.ts +42 -0
- package/dist/portal/session/first-run-wiring.js +132 -0
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/human/notes-ledger.d.ts +20 -0
- package/dist/portal/session/human/notes-ledger.js +55 -0
- package/dist/portal/session/human/review-store.d.ts +12 -0
- package/dist/portal/session/human/review-store.js +18 -10
- package/dist/portal/session/live-control-tools.d.ts +0 -13
- package/dist/portal/session/live-control-tools.js +107 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
- package/dist/portal/session/no-session-diagnosis.js +46 -9
- package/dist/portal/session/no-session-next-action.d.ts +31 -0
- package/dist/portal/session/no-session-next-action.js +159 -60
- package/dist/portal/session/no-session-watch.d.ts +14 -1
- package/dist/portal/session/no-session-watch.js +227 -17
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/presence/session-mirror.js +3 -0
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/serving-directory.d.ts +27 -0
- package/dist/portal/session/serving-directory.js +45 -0
- package/dist/portal/session/session-health.d.ts +18 -0
- package/dist/portal/session/session-health.js +9 -1
- package/dist/portal/session/session-info.d.ts +8 -1
- package/dist/portal/session/session-info.js +8 -1
- package/dist/portal/session/session-manager.d.ts +39 -0
- package/dist/portal/session/session-manager.js +98 -11
- package/dist/portal/session/session-reaper.js +4 -1
- package/dist/portal/session/session-successor.d.ts +13 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session-tools.js +26 -3
- package/dist/portal/session/session.d.ts +22 -30
- package/dist/portal/session/session.js +81 -79
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +12 -0
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +23 -1
- package/dist/status-payload.js +36 -1
- package/dist/surface/http-server.js +18 -2
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
- package/dist/surface/mcp/mcp-proxy.js +65 -13
- package/dist/surface/mcp/mcp.d.ts +34 -6
- package/dist/surface/mcp/mcp.js +61 -17
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.d.ts +4 -2
- package/dist/surface/mcp/server-instructions.js +32 -14
- package/dist/surface/mcp/shared-params.js +2 -2
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act/settle-in-flight.js +25 -3
- package/dist/surface/tools/act-sequence-tool.js +138 -29
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +71 -41
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +42 -17
- package/dist/surface/tools/browser-tools.js +51 -2
- package/dist/surface/tools/chat-drives.d.ts +101 -0
- package/dist/surface/tools/chat-drives.js +409 -0
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +51 -0
- package/dist/surface/tools/empty-session-list.js +120 -0
- package/dist/surface/tools/error-recovery.d.ts +14 -0
- package/dist/surface/tools/error-recovery.js +105 -8
- package/dist/surface/tools/explore-tools.d.ts +31 -1
- package/dist/surface/tools/explore-tools.js +438 -66
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +18 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +118 -57
- package/dist/surface/tools/harness-explore.js +344 -292
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +17 -0
- package/dist/surface/tools/harness-plan.js +38 -0
- package/dist/surface/tools/harness-script.d.ts +30 -0
- package/dist/surface/tools/harness-script.js +560 -0
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +22 -1
- package/dist/surface/tools/harness-toolset.js +101 -7
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +263 -85
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +49 -0
- package/dist/surface/tools/lease-seed.js +167 -0
- package/dist/surface/tools/lease-tools.d.ts +13 -24
- package/dist/surface/tools/lease-tools.js +146 -197
- package/dist/surface/tools/live-call-text.js +4 -4
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +29 -0
- package/dist/surface/tools/next-step.js +214 -0
- package/dist/surface/tools/observe-tools.js +45 -9
- package/dist/surface/tools/platform-moment.d.ts +72 -0
- package/dist/surface/tools/platform-moment.js +296 -0
- package/dist/surface/tools/query-hint-schema.d.ts +7 -0
- package/dist/surface/tools/query-hint-schema.js +10 -0
- package/dist/surface/tools/read-tools.js +71 -14
- package/dist/surface/tools/real-input-attempt.js +96 -13
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +83 -3
- package/dist/surface/tools/tool-kit.js +77 -7
- package/dist/surface/tools/tools.js +43 -59
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +29 -6
- package/dist/telemetry/hud-metrics.js +116 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +38 -2
- package/dist/telemetry/telemetry.js +144 -34
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +13 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +20 -6
- package/docs/README.md +3 -3
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +25 -28
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +33 -28
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +14 -3
- package/docs/cli/drive.mdx +20 -14
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +43 -28
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +18 -5
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +5 -4
- package/docs/cli.mdx +111 -42
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +9 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +7 -8
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +65 -61
- package/docs/human-control.md +16 -16
- package/docs/index.mdx +15 -42
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +23 -13
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +9 -9
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +32 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +69 -30
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +23 -25
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +22 -13
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +55 -46
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +17 -5
- package/docs/what-is-reticle.mdx +5 -3
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -241
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/features/harness/driver.d.ts +0 -50
- package/dist/features/harness/driver.js +0 -236
- package/dist/features/harness/jev-driver.d.ts +0 -188
- package/dist/features/harness/jev-driver.js +0 -678
- package/dist/features/harness/openai-driver.d.ts +0 -58
- package/dist/features/harness/openai-driver.js +0 -206
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
- package/dist/memory/project/dir/fill-value-store.js +0 -88
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
- package/docs/local-registry.md +0 -143
|
@@ -1,19 +1,24 @@
|
|
|
1
|
+
import { CALL_SECRETS_ARG, callSecretsArg } from './fields/flow-secret-field.js';
|
|
1
2
|
import { flowAuthor } from './flow-author.js';
|
|
2
3
|
import { FLOW_MUTATE_TOOL } from './flow-mutate-tools.js';
|
|
3
|
-
import { seedSchema } from '../../surface/tools/args/numeric-bounds.js';
|
|
4
|
+
import { seedSchema, workerCountSchema } from '../../surface/tools/args/numeric-bounds.js';
|
|
5
|
+
import { confirmDangerousArg } from '../../surface/tools/args/confirm-dangerous-arg.js';
|
|
4
6
|
import { z } from 'zod';
|
|
5
7
|
import { emptyFlowRefusal } from './empty-flow.js';
|
|
6
|
-
import { aliasParam } from '../../surface/tools/args/alias-args.js';
|
|
8
|
+
import { aliasParam, aliasUsed } from '../../surface/tools/args/alias-args.js';
|
|
9
|
+
import { stillRecording, stillRecordingMessage } from './flow-result.js';
|
|
10
|
+
import { resolveAnnotateTarget } from './annotate-notes/annotate-target.js';
|
|
7
11
|
import { FlowErrorCode, RecordedSaveError, ReplayStatus, SuiteIsolation, } from '@reticlehq/core';
|
|
8
12
|
import { recordSuiteFlakes } from './suite/suite-flakes.js';
|
|
9
|
-
import { ReticleTool } from '@reticlehq/core';
|
|
10
|
-
import { asNumber, asString
|
|
11
|
-
import { workerCountSchema } from '../../surface/tools/args/numeric-bounds.js';
|
|
13
|
+
import { AppRuntime, ReticleTool } from '@reticlehq/core';
|
|
14
|
+
import { asNumber, asString } from '@reticlehq/core';
|
|
12
15
|
import { log } from '../../log.js';
|
|
13
16
|
import { cloudFetch, syncFlowToCloud, SyncOutcome } from '../../memory/cloud/cloud-sync.js';
|
|
14
17
|
import { mapWithConcurrency, resolveConcurrency } from './suite/parallel-suite.js';
|
|
15
|
-
import { acquireLeasedSession,
|
|
18
|
+
import { acquireLeasedSession, suiteFixtureSeed } from '../../surface/tools/lease-tools.js';
|
|
16
19
|
import { homedir } from 'node:os';
|
|
20
|
+
import { withShotRun } from '../../judgement/runs/default-run-id.js';
|
|
21
|
+
import { defaultRunId } from '../../judgement/runs/default-run-id.js';
|
|
17
22
|
import { resolveProjectCloud } from '../../memory/cloud/cloud-config.js';
|
|
18
23
|
import { buildSuiteVerdict } from './decision.js';
|
|
19
24
|
import { classifyFlowAssertions, flattenSteps } from './flow-classify.js';
|
|
@@ -21,12 +26,15 @@ import { recordingBacktrackWarning } from './recording/recording-backtrack.js';
|
|
|
21
26
|
import { isValidFlowName, flowPath } from '../../memory/project/dir/reticle-dir.js';
|
|
22
27
|
import {} from './flows.js';
|
|
23
28
|
import { flowsForSession } from './flow-store-for-session.js';
|
|
24
|
-
import {
|
|
29
|
+
import { rootForTarget, sessionTarget } from '../../memory/project/session-root.js';
|
|
30
|
+
import { originOf } from '../../portal/session/session-manager.js';
|
|
25
31
|
import { resolveSuiteSelection } from './suite-selection.js';
|
|
26
|
-
import {
|
|
32
|
+
import { flowErrorMessage, latestRecordedFlow, sessionProjectId } from './flow-replay-run.js';
|
|
27
33
|
import { persistAndSyncVerificationRun, } from '../../judgement/runs/verification-sync.js';
|
|
28
34
|
import { runServerVerify } from './suite/server-verify.js';
|
|
29
35
|
import { healFlow } from './heal-run.js';
|
|
36
|
+
import { RESULT_FIELD, resultField, suiteResult } from '../../surface/tools/reticle-result.js';
|
|
37
|
+
import { replayOneFlow } from './single-replay.js';
|
|
30
38
|
export { replayNamedFlow } from './flow-replay-run.js';
|
|
31
39
|
import { replayAndLearn } from './flow-learning.js';
|
|
32
40
|
/**
|
|
@@ -34,19 +42,21 @@ import { replayAndLearn } from './flow-learning.js';
|
|
|
34
42
|
* set). Fire-and-forget: resolves the config, POSTs via the platform fetch, and logs the outcome. Any
|
|
35
43
|
* failure is swallowed so a network hiccup never affects the local save.
|
|
36
44
|
*/
|
|
37
|
-
async function syncSavedFlowToCloud(deps, flow,
|
|
45
|
+
async function syncSavedFlowToCloud(deps, flow, target) {
|
|
38
46
|
// Per-project cloud: sync a saved flow only when cloud is attached AND flow sync is enabled.
|
|
39
47
|
// The link file of the project this flow belongs to — the flow itself was already saved through
|
|
40
48
|
// `flowsForSession`, and reading the credential from a different tree is how one project's work
|
|
41
49
|
// reaches another project's dashboard.
|
|
42
|
-
const cloud = await resolveProjectCloud(deps.fs,
|
|
50
|
+
const cloud = await resolveProjectCloud(deps.fs, rootForTarget(deps, target), homedir(), process.env);
|
|
43
51
|
if (null === cloud.config || !cloud.policy.flows)
|
|
44
52
|
return; // not attached / flows disabled → local only
|
|
45
|
-
const result = await syncFlowToCloud(flow, cloud.config, projectId, cloudFetch);
|
|
53
|
+
const result = await syncFlowToCloud(flow, cloud.config, target.projectId, cloudFetch);
|
|
46
54
|
if (result.outcome !== SyncOutcome.SYNCED) {
|
|
47
55
|
log('cloud-flow-sync-failed', { flow: flow.name, status: result.status, error: result.error });
|
|
48
56
|
}
|
|
49
57
|
}
|
|
58
|
+
/** A step index no recorded flow reaches; bounds `to` and `at`. */
|
|
59
|
+
const MAX_REPLAY_STEP = 10_000;
|
|
50
60
|
/**
|
|
51
61
|
* The URL a leased context should open: the app's ORIGIN, not the live tab's current location.
|
|
52
62
|
*
|
|
@@ -57,7 +67,10 @@ async function syncSavedFlowToCloud(deps, flow, projectId) {
|
|
|
57
67
|
*/
|
|
58
68
|
export function leasableAppUrl(deps, sessionId) {
|
|
59
69
|
try {
|
|
60
|
-
const
|
|
70
|
+
const session = deps.sessions.resolve(sessionId);
|
|
71
|
+
if (AppRuntime.WEB !== (session.runtime ?? AppRuntime.WEB))
|
|
72
|
+
return undefined; // desktop: no IPC in a lease
|
|
73
|
+
const url = session.url;
|
|
61
74
|
if (typeof url !== 'string' || 0 === url.length)
|
|
62
75
|
return undefined;
|
|
63
76
|
return new URL(url).origin;
|
|
@@ -75,7 +88,7 @@ export function leasableAppUrl(deps, sessionId) {
|
|
|
75
88
|
* refusal on that path is deliberately silent — a fixture is an optimisation, and a suite must not
|
|
76
89
|
* die when one is unavailable.
|
|
77
90
|
*/
|
|
78
|
-
function sessionUrlOf(deps, sessionId) {
|
|
91
|
+
export function sessionUrlOf(deps, sessionId) {
|
|
79
92
|
try {
|
|
80
93
|
return deps.sessions.resolve(sessionId).url;
|
|
81
94
|
}
|
|
@@ -112,15 +125,17 @@ export const FLOW_TOOLS = [
|
|
|
112
125
|
FLOW_MUTATE_TOOL,
|
|
113
126
|
{
|
|
114
127
|
name: ReticleTool.FLOW_SAVE,
|
|
115
|
-
description: 'Persist
|
|
128
|
+
description: 'Persist a STOPPED recording (by name) as a git-checked, anchor-resolved flow at .reticle/flows/<name>.json. A recording that is still running is refused: stop it first with reticle_record{action:"stop"}, and the refusal names the exact call. Each step is bound to a SEMANTIC anchor (testid/role/signal), never a volatile ref; steps without a resolvable testid are kept with degraded:true (a "add a data-testid here" marker) rather than dropped. Returns { name, stepCount, degraded, empty, assertions, warning? } — `assertions.grade` is asserted | presence-only | assertion-free: a flow that only acts (or only checks element presence) will pass even if the feature breaks, so when grade is not "asserted" follow assertions.warning and add a consequence assertion via reticle_annotate (assert-signal / assert-net / success-state). `warning` is present when the recording left a page and returned to it: replay has no navigation steps, so the next click will look for a control on a page the tab is no longer on.',
|
|
116
129
|
inputSchema: {
|
|
117
130
|
flow: z
|
|
118
131
|
.string()
|
|
119
132
|
.optional()
|
|
120
133
|
.describe('Alias for `flowName` (the name reticle_annotate uses).'),
|
|
134
|
+
name: z.string().optional().describe('Alias for `flowName`.'),
|
|
121
135
|
flowName: z
|
|
122
136
|
.string()
|
|
123
|
-
.
|
|
137
|
+
.optional()
|
|
138
|
+
.describe('Which RECORDING to save — the name reticle_record{start} was called with ("last-journey" for the reticle_act {steps} just proved). Omit when only one is stopped. This is a lookup key, not the filename: pass `saveAs` to choose that.'),
|
|
124
139
|
saveAs: z
|
|
125
140
|
.string()
|
|
126
141
|
.optional()
|
|
@@ -156,6 +171,7 @@ export const FLOW_TOOLS = [
|
|
|
156
171
|
})
|
|
157
172
|
.optional(),
|
|
158
173
|
intentGap: INTENT_GAP_FIELD,
|
|
174
|
+
normalized: z.array(z.string()).optional(),
|
|
159
175
|
warning: z
|
|
160
176
|
.string()
|
|
161
177
|
.optional()
|
|
@@ -164,7 +180,12 @@ export const FLOW_TOOLS = [
|
|
|
164
180
|
code: z.string().optional(),
|
|
165
181
|
},
|
|
166
182
|
handler: (deps, args) => {
|
|
167
|
-
const
|
|
183
|
+
const aliases = ['flow', 'name', 'recordingName'];
|
|
184
|
+
const normalized = aliasUsed(args, 'flowName', aliases);
|
|
185
|
+
const explicitName = asString(aliasParam(args, 'flowName', aliases)['flowName']);
|
|
186
|
+
// The one stopped recording when the call names none — the same defaulting record{stop} and
|
|
187
|
+
// annotate use. With several, nothing is picked: the refusal below names them.
|
|
188
|
+
const name = resolveAnnotateTarget(explicitName, deps.recordings.compiled());
|
|
168
189
|
const program = deps.recordings.getCompiled(name);
|
|
169
190
|
if (program === undefined) {
|
|
170
191
|
/*
|
|
@@ -177,6 +198,13 @@ export const FLOW_TOOLS = [
|
|
|
177
198
|
* before the names were compared.
|
|
178
199
|
*/
|
|
179
200
|
const held = deps.recordings.compiled();
|
|
201
|
+
const running = stillRecording(deps.recordings.active(), name, explicitName, held);
|
|
202
|
+
if (running !== undefined) {
|
|
203
|
+
return Promise.resolve({
|
|
204
|
+
error: stillRecordingMessage(running),
|
|
205
|
+
code: FlowErrorCode.NO_RECORDING,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
180
208
|
return Promise.resolve({
|
|
181
209
|
error: 0 === held.length
|
|
182
210
|
? flowErrorMessage(FlowErrorCode.NO_RECORDING)
|
|
@@ -211,13 +239,14 @@ export const FLOW_TOOLS = [
|
|
|
211
239
|
...(success !== undefined ? { success } : {}),
|
|
212
240
|
...(intent !== undefined ? { intent } : {}),
|
|
213
241
|
};
|
|
214
|
-
const
|
|
242
|
+
const target = sessionTarget(deps, asString(args['sessionId']));
|
|
243
|
+
const { projectId } = target;
|
|
215
244
|
// A zero-step recording is not a flow. Saving it wrote a file the suite reports "unverifiable"
|
|
216
245
|
// forever while telling the agent it had saved a regression test — see empty-flow.
|
|
217
246
|
const emptyRefusal = emptyFlowRefusal(program.steps.length, name);
|
|
218
247
|
if (emptyRefusal !== undefined)
|
|
219
248
|
return Promise.resolve(emptyRefusal);
|
|
220
|
-
const { flows, root } = flowsForSession(deps,
|
|
249
|
+
const { flows, root } = flowsForSession(deps, target);
|
|
221
250
|
const author = flowAuthor();
|
|
222
251
|
const toSave = {
|
|
223
252
|
...program,
|
|
@@ -244,6 +273,7 @@ export const FLOW_TOOLS = [
|
|
|
244
273
|
const invoked = loaded.ok ? await loadInvoked(flows, loaded.value, projectId) : new Map();
|
|
245
274
|
return loaded.ok
|
|
246
275
|
? {
|
|
276
|
+
...(0 === normalized.length ? {} : { normalized }),
|
|
247
277
|
...res.value,
|
|
248
278
|
...(path === undefined ? {} : { path }),
|
|
249
279
|
assertions: classifyFlowAssertions(loaded.value, invoked),
|
|
@@ -275,10 +305,11 @@ export const FLOW_TOOLS = [
|
|
|
275
305
|
// (the prior bug) made schema-validating MCP clients reject the result ("expected object,
|
|
276
306
|
// received string") — caught driving the live demo.
|
|
277
307
|
handler: (deps, args) => {
|
|
278
|
-
const
|
|
308
|
+
const target = sessionTarget(deps, asString(args['sessionId']));
|
|
309
|
+
const { projectId } = target;
|
|
279
310
|
// The APP's flows, not the daemon's. Listing where the daemon was launched is what showed a
|
|
280
311
|
// React dashboard a HUD full of Electron and Tauri flows from an unrelated checkout.
|
|
281
|
-
const { flows: store, root } = flowsForSession(deps,
|
|
312
|
+
const { flows: store, root } = flowsForSession(deps, target);
|
|
282
313
|
return store.list(projectId).then((names) => ({
|
|
283
314
|
// `list` deliberately returns invalid names so they are reported rather than silently
|
|
284
315
|
// dropped — but the declared outputSchema requires `path` on EVERY entry, and omitting it made
|
|
@@ -366,16 +397,15 @@ export const FLOW_TOOLS = [
|
|
|
366
397
|
{
|
|
367
398
|
name: ReticleTool.FLOW_REPLAY,
|
|
368
399
|
description: "Replay a git-checked flow from .reticle/flows/<name>.json. RE-RESOLVES each step's semantic " +
|
|
369
|
-
'anchor (testid via reticle_query; signal via predicate) against
|
|
370
|
-
'
|
|
371
|
-
'
|
|
372
|
-
'
|
|
373
|
-
'
|
|
374
|
-
'
|
|
375
|
-
'
|
|
376
|
-
'
|
|
377
|
-
'
|
|
378
|
-
'an action that failed to dispatch.',
|
|
400
|
+
'anchor (testid via reticle_query; signal via predicate) against LIVE DOM. On anchor MISS returns ' +
|
|
401
|
+
'DRIFT { step, anchor, drift:{ reasonKind, reason, nearest } } and stops. ' +
|
|
402
|
+
'Returns { name, status: ok|drift|error|unverifiable, steps:[...] }. ' +
|
|
403
|
+
'Action failures are status:error. ' +
|
|
404
|
+
'Status unverifiable means flow could not be graded (missing secrets, unmet preconditions, lost ' +
|
|
405
|
+
'document) — neither pass nor fail, treat as UNKNOWN. ' +
|
|
406
|
+
'An ok replay of a flow asserting no consequence also carries unverifiable:{reason} — do not ' +
|
|
407
|
+
'treat as proof. ' +
|
|
408
|
+
'Early halt carries halted:{atStep, notAttempted}: `steps` is shorter because replay stopped.',
|
|
379
409
|
inputSchema: {
|
|
380
410
|
flow: z
|
|
381
411
|
.string()
|
|
@@ -384,14 +414,26 @@ export const FLOW_TOOLS = [
|
|
|
384
414
|
flowName: z
|
|
385
415
|
.string()
|
|
386
416
|
.describe('Flow file name (without .json extension) from reticle_flow{action:"list"}.'),
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
.optional()
|
|
390
|
-
.describe('Set true to allow destructive controls during this replay only.'),
|
|
417
|
+
[CALL_SECRETS_ARG]: callSecretsArg,
|
|
418
|
+
confirmDangerous: confirmDangerousArg('this replay'),
|
|
391
419
|
from: z
|
|
392
420
|
.union([z.number().int().nonnegative(), z.string().min(1)])
|
|
393
421
|
.optional()
|
|
394
422
|
.describe('Resume at this step (index or step id). Earlier steps re-run as unchecked, unreported setup; a setup step marked effect:"commits" refuses the resume.'),
|
|
423
|
+
to: z
|
|
424
|
+
.number()
|
|
425
|
+
.int()
|
|
426
|
+
.positive()
|
|
427
|
+
.max(MAX_REPLAY_STEP)
|
|
428
|
+
.optional()
|
|
429
|
+
.describe('Stop before this step (drive only to a point journeys branch from).'),
|
|
430
|
+
at: z
|
|
431
|
+
.number()
|
|
432
|
+
.int()
|
|
433
|
+
.nonnegative()
|
|
434
|
+
.max(MAX_REPLAY_STEP)
|
|
435
|
+
.optional()
|
|
436
|
+
.describe('Continue at this step on the page as it is (after another flow ran `to` it); 0 replays the whole flow on the page the flow before it left, with no reload.'),
|
|
395
437
|
sweep: z
|
|
396
438
|
.boolean()
|
|
397
439
|
.optional()
|
|
@@ -409,10 +451,12 @@ export const FLOW_TOOLS = [
|
|
|
409
451
|
.array(z.unknown())
|
|
410
452
|
.optional()
|
|
411
453
|
.describe('Present when `seed` was given: which endpoints were delayed, and by how long.'),
|
|
454
|
+
[RESULT_FIELD]: z.string().optional(),
|
|
412
455
|
// The flow's name — always present in FlowReplayResult (the description promises `{ name, … }`),
|
|
413
456
|
// but omitted here, so a validating profile stripped it and a replay result arrived anonymous.
|
|
414
457
|
name: z.string(),
|
|
415
|
-
status: z.string().describe('ok | drift | error'),
|
|
458
|
+
status: z.string().describe('ok | drift | error | unverifiable'),
|
|
459
|
+
runId: z.string().optional().describe('The run this replay was written down as.'),
|
|
416
460
|
steps: z.array(z.unknown()),
|
|
417
461
|
proposals: z.array(z.unknown()).optional(),
|
|
418
462
|
deviation: z
|
|
@@ -466,41 +510,7 @@ export const FLOW_TOOLS = [
|
|
|
466
510
|
},
|
|
467
511
|
// The decision envelope is attached by replayNamedFlow only on drift/fail (clean pass stays
|
|
468
512
|
// token-flat). Single-flow replay and whole-suite verify share that one implementation.
|
|
469
|
-
handler:
|
|
470
|
-
const seed = asNumber(args['seed']);
|
|
471
|
-
if (seed === undefined)
|
|
472
|
-
return await replayAndLearn(deps, args);
|
|
473
|
-
/*
|
|
474
|
-
* Seeded chaos, and always put the page back.
|
|
475
|
-
*
|
|
476
|
-
* The targets are the endpoints the FLOW declared it depends on, so the perturbation lands on
|
|
477
|
-
* traffic the flow claims to care about rather than on something it never mentioned. No
|
|
478
|
-
* declared endpoints means nothing to slow, and the replay runs clean rather than pretending
|
|
479
|
-
* a seed did something.
|
|
480
|
-
*
|
|
481
|
-
* `finally` is not tidiness: a page left slowed is damage the NEXT run inherits, and it would
|
|
482
|
-
* inherit it as a mystery — the same rule the mutation loop had to earn.
|
|
483
|
-
*/
|
|
484
|
-
const sessionId = asString(args['sessionId']);
|
|
485
|
-
const loaded = await flowsForSession(deps, sessionProjectId(deps, sessionId))
|
|
486
|
-
.flows.load(asString(args['flowName']) ?? asString(args['flow']) ?? '', sessionProjectId(deps, sessionId))
|
|
487
|
-
.catch(() => null);
|
|
488
|
-
const targets = loaded !== null && loaded.ok ? mutationTargetsFor(loaded.value) : [];
|
|
489
|
-
const rules = perturbationFor(seed, targets);
|
|
490
|
-
const port = 0 === rules.length
|
|
491
|
-
? undefined
|
|
492
|
-
: await sessionPerturbationPort(deps.realInput, leasableAppUrl(deps, sessionId));
|
|
493
|
-
if (port === undefined)
|
|
494
|
-
return replayAndLearn(deps, args);
|
|
495
|
-
try {
|
|
496
|
-
await port.slow(rules);
|
|
497
|
-
const replay = await replayNamedFlow(deps, args);
|
|
498
|
-
return { ...replay, perturbed: rules };
|
|
499
|
-
}
|
|
500
|
-
finally {
|
|
501
|
-
await port.clear().catch(() => undefined);
|
|
502
|
-
}
|
|
503
|
-
},
|
|
513
|
+
handler: (deps, args) => replayOneFlow(deps, args, leasableAppUrl(deps, asString(args['sessionId']))),
|
|
504
514
|
},
|
|
505
515
|
{
|
|
506
516
|
name: ReticleTool.FLOW_VERIFY,
|
|
@@ -510,6 +520,7 @@ export const FLOW_TOOLS = [
|
|
|
510
520
|
'whatChanged, whereInSource, nextAction }] } plus `flaky` (flows seen to pass AND fail on unchanged code) — passing flows are counted, only failures carry ' +
|
|
511
521
|
'detail (the actionable fix). One call replaces N hand-driven replays.',
|
|
512
522
|
inputSchema: {
|
|
523
|
+
[CALL_SECRETS_ARG]: callSecretsArg,
|
|
513
524
|
names: z
|
|
514
525
|
.array(z.string())
|
|
515
526
|
.optional()
|
|
@@ -521,6 +532,7 @@ export const FLOW_TOOLS = [
|
|
|
521
532
|
parallel: workerCountSchema
|
|
522
533
|
.optional()
|
|
523
534
|
.describe('Run this many flows at once, each in its own isolated leased browser context (needs the browser pool). Clamped to the pool capacity and the flow count. Omit for the sequential single-tab run.'),
|
|
535
|
+
confirmDangerous: confirmDangerousArg('this run of the suite'),
|
|
524
536
|
sessionId: z
|
|
525
537
|
.string()
|
|
526
538
|
.optional()
|
|
@@ -528,10 +540,12 @@ export const FLOW_TOOLS = [
|
|
|
528
540
|
},
|
|
529
541
|
outputSchema: {
|
|
530
542
|
status: z.string().describe('pass | fail'),
|
|
543
|
+
runId: z.string().optional().describe('The run this suite was written down as.'),
|
|
531
544
|
total: z.number(),
|
|
532
545
|
passed: z.number(),
|
|
533
546
|
failed: z.number(),
|
|
534
547
|
summary: z.string(),
|
|
548
|
+
[RESULT_FIELD]: z.string().optional(),
|
|
535
549
|
failures: z.array(z.unknown()),
|
|
536
550
|
isolation: z
|
|
537
551
|
.string()
|
|
@@ -573,11 +587,14 @@ export const FLOW_TOOLS = [
|
|
|
573
587
|
// feedback ask here or a validating profile strips it off the suite verdict.
|
|
574
588
|
feedback_prompt: z.unknown().optional(),
|
|
575
589
|
},
|
|
576
|
-
|
|
590
|
+
// The run id is minted first, so each replayed step's screenshot is filed under the run.
|
|
591
|
+
handler: (deps, args) => withShotRun(defaultRunId(), async () => {
|
|
577
592
|
const sessionId = asString(args['sessionId']);
|
|
593
|
+
const confirmed = true === args['confirmDangerous'] ? { confirmDangerous: true } : {};
|
|
578
594
|
// "Replay all" means all of THIS app's flows (+ legacy), not every project's on a shared daemon.
|
|
579
|
-
const
|
|
580
|
-
const
|
|
595
|
+
const target = sessionTarget(deps, sessionId);
|
|
596
|
+
const { projectId } = target;
|
|
597
|
+
const selected = await resolveSuiteSelection(deps, target, args);
|
|
581
598
|
const requested = selected.run;
|
|
582
599
|
/** Named rather than subtracted — a suite that returns fewer than were asked for must say so. */
|
|
583
600
|
const heldBack = {
|
|
@@ -587,7 +604,7 @@ export const FLOW_TOOLS = [
|
|
|
587
604
|
...(selected.unsatisfied === undefined ? {} : { unsatisfied: selected.unsatisfied }),
|
|
588
605
|
};
|
|
589
606
|
// verify:server — hand the whole suite to the hosted runner; it records the verification itself.
|
|
590
|
-
const cloud = await resolveProjectCloud(deps.fs,
|
|
607
|
+
const cloud = await resolveProjectCloud(deps.fs, rootForTarget(deps, target), homedir(), process.env);
|
|
591
608
|
const server = await runServerVerify(deps, cloud, sessionId, requested);
|
|
592
609
|
if (server !== null)
|
|
593
610
|
return server;
|
|
@@ -629,7 +646,11 @@ export const FLOW_TOOLS = [
|
|
|
629
646
|
const start = deps.now();
|
|
630
647
|
const lease = await acquireLeasedSession(pool, deps.sessions, appUrl, projectId, seed);
|
|
631
648
|
try {
|
|
632
|
-
const replay = await replayAndLearn(deps, {
|
|
649
|
+
const replay = await replayAndLearn(deps, {
|
|
650
|
+
flowName,
|
|
651
|
+
sessionId: lease.sessionId,
|
|
652
|
+
...confirmed,
|
|
653
|
+
});
|
|
633
654
|
return { replay, durationMs: deps.now() - start };
|
|
634
655
|
}
|
|
635
656
|
finally {
|
|
@@ -639,7 +660,7 @@ export const FLOW_TOOLS = [
|
|
|
639
660
|
const parallelRuns = await Promise.all(outcomes.map(async (o, i) => {
|
|
640
661
|
const name = requested[i] ?? '';
|
|
641
662
|
const replay = o.ok && o.value !== undefined ? o.value.replay : leaseFailureReplay(name, o.error);
|
|
642
|
-
const loaded = await flowsForSession(deps,
|
|
663
|
+
const loaded = await flowsForSession(deps, target)
|
|
643
664
|
.flows.load(name, projectId)
|
|
644
665
|
.catch(() => null);
|
|
645
666
|
const flow = loaded !== null && loaded.ok ? loaded.value : undefined;
|
|
@@ -649,13 +670,15 @@ export const FLOW_TOOLS = [
|
|
|
649
670
|
...(parallelRuns[i] ?? { replay: leaseFailureReplay(requested[i] ?? '', o.error) }),
|
|
650
671
|
durationMs: o.ok && o.value !== undefined ? o.value.durationMs : 0,
|
|
651
672
|
}));
|
|
652
|
-
const flaky = await recordSuiteFlakes(deps.fs,
|
|
653
|
-
await persistAndSyncVerificationRun(deps, timed,
|
|
673
|
+
const flaky = await recordSuiteFlakes(deps.fs, rootForTarget(deps, target), parallelRuns);
|
|
674
|
+
const runId = await persistAndSyncVerificationRun(deps, timed, target);
|
|
654
675
|
const verdict = buildSuiteVerdict(parallelRuns, selected.knownRoutes, SuiteIsolation.PER_FLOW_LEASE);
|
|
655
676
|
return {
|
|
656
677
|
...verdict,
|
|
678
|
+
...(runId === undefined ? {} : { runId }),
|
|
657
679
|
...(flaky.length > 0 ? { flaky: [...flaky] } : {}),
|
|
658
680
|
...heldBack,
|
|
681
|
+
...resultField(() => suiteResult(rootForTarget(deps, target), verdict, timed, runId)),
|
|
659
682
|
};
|
|
660
683
|
}
|
|
661
684
|
// The flow FILE travels with each replay so the verdict can tell a green that verified
|
|
@@ -673,8 +696,8 @@ export const FLOW_TOOLS = [
|
|
|
673
696
|
// (1 of 2 flows). Restoring two thirds of a session is worse than restoring none.
|
|
674
697
|
for (const flowName of requested) {
|
|
675
698
|
const start = deps.now();
|
|
676
|
-
const replay = await replayAndLearn(deps, { flowName, sessionId });
|
|
677
|
-
const loaded = await flowsForSession(deps,
|
|
699
|
+
const replay = await replayAndLearn(deps, { flowName, sessionId, ...confirmed });
|
|
700
|
+
const loaded = await flowsForSession(deps, target)
|
|
678
701
|
.flows.load(flowName, projectId)
|
|
679
702
|
.catch(() => null);
|
|
680
703
|
const flow = loaded !== null && loaded.ok ? loaded.value : undefined;
|
|
@@ -689,19 +712,21 @@ export const FLOW_TOOLS = [
|
|
|
689
712
|
// `reticle flow` on the command line, so an AGENT running this tool a hundred times learned
|
|
690
713
|
// nothing about which flows are intermittent. Same product, same ledger, two surfaces, and the
|
|
691
714
|
// one an agent uses was the blind half.
|
|
692
|
-
const flaky = await recordSuiteFlakes(deps.fs,
|
|
715
|
+
const flaky = await recordSuiteFlakes(deps.fs, rootForTarget(deps, target), runs);
|
|
693
716
|
// Emit the consolidated run artifact (Runs tab) + best-effort cloud push. Never blocks the verdict.
|
|
694
|
-
await persistAndSyncVerificationRun(deps, timed,
|
|
717
|
+
const runId = await persistAndSyncVerificationRun(deps, timed, target);
|
|
695
718
|
const verdict = buildSuiteVerdict(runs, selected.knownRoutes, SuiteIsolation.SHARED_SESSION);
|
|
696
719
|
// A flow that has both passed and failed on UNCHANGED code is a different thing from a
|
|
697
720
|
// regression, and an agent that cannot tell them apart either chases a ghost or ignores a real
|
|
698
721
|
// break. Present only when the ledger has seen enough runs to say so.
|
|
699
722
|
return {
|
|
700
723
|
...verdict,
|
|
724
|
+
...(runId === undefined ? {} : { runId }),
|
|
701
725
|
...(flaky.length > 0 ? { flaky: [...flaky] } : {}),
|
|
702
726
|
...heldBack,
|
|
727
|
+
...resultField(() => suiteResult(rootForTarget(deps, target), verdict, timed, runId)),
|
|
703
728
|
};
|
|
704
|
-
},
|
|
729
|
+
}),
|
|
705
730
|
},
|
|
706
731
|
{
|
|
707
732
|
name: ReticleTool.FLOW_SAVE_RECORDED,
|
|
@@ -766,12 +791,13 @@ export const FLOW_TOOLS = [
|
|
|
766
791
|
// Resolved like every other path now. This save used to go to the daemon's root while the
|
|
767
792
|
// recorded-flow save resolved per session, so where a flow landed depended on which tool wrote
|
|
768
793
|
// it — and the pair that disagreed were the two ways to save the same thing.
|
|
769
|
-
const
|
|
794
|
+
const target = { projectId: session.projectId, origin: originOf(session.url) };
|
|
795
|
+
const res = await flowsForSession(deps, target).flows.saveFlow(flow, session.projectId);
|
|
770
796
|
if (!res.ok)
|
|
771
797
|
return { error: flowErrorMessage(res.code, res.detail), code: res.code };
|
|
772
798
|
// If logged in to Reticle, mirror the saved flow to the team's regression suite. Best-effort
|
|
773
799
|
// and non-blocking: the flow is already on disk, so a sync failure never fails the save.
|
|
774
|
-
void syncSavedFlowToCloud(deps, flow,
|
|
800
|
+
void syncSavedFlowToCloud(deps, flow, target);
|
|
775
801
|
// Return the SaveSummary as-is ({ name, stepCount, degraded, empty }) — the outputSchema
|
|
776
802
|
// declares `name`, so the old `flowName` key was silently stripped by schema-strict clients.
|
|
777
803
|
return res.value;
|
|
@@ -795,10 +821,7 @@ export const FLOW_TOOLS = [
|
|
|
795
821
|
.describe('Alias for `flowName` (the name reticle_annotate uses).'),
|
|
796
822
|
flowName: z.string().describe('Flow file name to heal (from reticle_flow{action:"list"}).'),
|
|
797
823
|
apply: z.boolean().optional(),
|
|
798
|
-
confirmDangerous:
|
|
799
|
-
.boolean()
|
|
800
|
-
.optional()
|
|
801
|
-
.describe('Set true to allow destructive controls during this heal replay only.'),
|
|
824
|
+
confirmDangerous: confirmDangerousArg('this heal replay'),
|
|
802
825
|
sessionId: z
|
|
803
826
|
.string()
|
|
804
827
|
.optional()
|
|
@@ -11,6 +11,14 @@ export declare function anchorForStep(args: Record<string, unknown>): {
|
|
|
11
11
|
anchor: FlowAnchor;
|
|
12
12
|
degraded: boolean;
|
|
13
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* The recorded steps as they may be SHOWN: every credential fill carries the placeholder.
|
|
16
|
+
*
|
|
17
|
+
* The same rule the saved flow is written by, applied to what a tool hands back. `record stop`
|
|
18
|
+
* returned the compiled program verbatim, so the password a saved flow never contained went into
|
|
19
|
+
* the agent's transcript instead. The store keeps the real value — an in-session replay types it.
|
|
20
|
+
*/
|
|
21
|
+
export declare function redactRecordedSteps(steps: readonly RecordedStep[]): RecordedStep[];
|
|
14
22
|
/**
|
|
15
23
|
* What the anchor CALLS the field it points at.
|
|
16
24
|
*
|
|
@@ -58,7 +66,14 @@ export interface FlowAnnotations {
|
|
|
58
66
|
/** Persists anchored flows to .reticle/flows/<name>.json. Filesystem + clock are injected. */
|
|
59
67
|
export declare class FlowStore {
|
|
60
68
|
#private;
|
|
61
|
-
|
|
69
|
+
/**
|
|
70
|
+
* `onWrote` is told after a save lands, so cloud sync cycles on a new flow the way it does on a
|
|
71
|
+
* new run (`RunStore` takes the same callback). Without it a flow saved with no run behind it
|
|
72
|
+
* waited for the timer, and a daemon that exited first never sent it.
|
|
73
|
+
*/
|
|
74
|
+
constructor(fs: FileSystemPort, root: string, clock: Clock, opts?: {
|
|
75
|
+
onWrote?: () => void;
|
|
76
|
+
});
|
|
62
77
|
/**
|
|
63
78
|
* Convert a CompiledProgram (testid-normalized) into an anchored, on-disk flow + write it.
|
|
64
79
|
* Optionally fold structured annotations (per-step expect, dynamic[], success) onto
|