@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
|
@@ -41,24 +41,40 @@ function recordingOf(flow) {
|
|
|
41
41
|
? { recordingOmitted: true }
|
|
42
42
|
: { recording };
|
|
43
43
|
}
|
|
44
|
+
/** The first contradiction a replay recorded, on a step or across them. */
|
|
45
|
+
function firstContradiction(replay) {
|
|
46
|
+
for (const step of replay.steps) {
|
|
47
|
+
const found = step.contradictions?.[0];
|
|
48
|
+
if (found !== undefined)
|
|
49
|
+
return found;
|
|
50
|
+
}
|
|
51
|
+
return replay.crossStep?.[0];
|
|
52
|
+
}
|
|
44
53
|
/** Map one replay (plus its measured duration) into a RunFlowResult for the artifact's flows[]. */
|
|
45
54
|
export function mapReplayToFlowResult(replay, durationMs, flow) {
|
|
46
55
|
// A replay that could not start or complete returns UNVERIFIABLE (or carries an unverifiable caveat).
|
|
47
56
|
// Nothing was verified, so it is SKIPPED — which every reader of a run (the verdict, the gate)
|
|
48
57
|
// refuses to count as a pass.
|
|
49
|
-
|
|
58
|
+
// A pass whose channels disagreed is the suite's `unverifiable`, and the run says the same: the
|
|
59
|
+
// CLI printed "unverifiable" and exited 1 while the dashboard listed the run as Passed.
|
|
60
|
+
const disagreed = replay.status === ReplayStatus.OK ? firstContradiction(replay) : undefined;
|
|
61
|
+
const status = replay.status === ReplayStatus.UNVERIFIABLE ||
|
|
62
|
+
replay.unverifiable !== undefined ||
|
|
63
|
+
disagreed !== undefined
|
|
50
64
|
? RunFlowStatus.SKIPPED
|
|
51
65
|
: runFlowStatusOf(replay.status);
|
|
52
66
|
const failureReason = replay.unverifiable !== undefined
|
|
53
67
|
? replay.unverifiable.reason
|
|
54
|
-
:
|
|
55
|
-
? (
|
|
56
|
-
|
|
57
|
-
replay.
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
:
|
|
68
|
+
: disagreed !== undefined
|
|
69
|
+
? clip(`a channel disagreed (${disagreed.kind}): ${disagreed.counter} — ${disagreed.detail}`)
|
|
70
|
+
: status === RunFlowStatus.FAIL
|
|
71
|
+
? (replay.decision?.whatChanged ??
|
|
72
|
+
replay.decision?.summary ??
|
|
73
|
+
replay.error?.message ??
|
|
74
|
+
'flow failed')
|
|
75
|
+
: status === RunFlowStatus.SKIPPED
|
|
76
|
+
? 'flow could not be graded'
|
|
77
|
+
: undefined;
|
|
62
78
|
// A flow with a success oracle gets a synthetic 'success' step appended by replay; surface its label
|
|
63
79
|
// as the run's `oracle` so the verdict counts this flow as consequence-backed (→ HIGH confidence),
|
|
64
80
|
// not a bare smoke click. Without this, an oracle-backed pass reads as MEDIUM and undersells itself.
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* individual run to a deploy. The run is already clock-stamped by buildVerificationRun, so the store
|
|
6
6
|
* needs no clock.
|
|
7
7
|
*/
|
|
8
|
-
import { RunReadError, type ReticleVerificationRun, type RunId } from '@reticlehq/core';
|
|
8
|
+
import { RunReadError, type ReticleVerificationRun, type RunId, type RunScreenshot } from '@reticlehq/core';
|
|
9
9
|
import type { FileSystemPort } from '../../../memory/project/fs/fs-port.js';
|
|
10
10
|
/** Never-throws read result (mirrors ReadProjectResult). */
|
|
11
11
|
export type ReadRunResult = {
|
|
@@ -51,4 +51,16 @@ export declare class RunStore {
|
|
|
51
51
|
*/
|
|
52
52
|
latestTwo(): Promise<[ReticleVerificationRun, ReticleVerificationRun] | undefined>;
|
|
53
53
|
}
|
|
54
|
+
/** Remember a capture that has not landed yet, so a run written now can wait for it. */
|
|
55
|
+
export declare function noteLanding(dir: string, land: Promise<void>): void;
|
|
56
|
+
/** Wait for this run's screenshots still landing, so a run written now can list them. Bounded. */
|
|
57
|
+
export declare function shotsLanded(root: string, runId: string): Promise<void>;
|
|
58
|
+
/** Every screenshot a run has landed, in the order they were taken (by seq). Never throws. */
|
|
59
|
+
export declare function readStepShots(fs: FileSystemPort, root: string, runId: string): Promise<RunScreenshot[]>;
|
|
60
|
+
/**
|
|
61
|
+
* The run with its screenshots: every one in `screenshots`, each replayed step's pinned to that
|
|
62
|
+
* step (matched as `<flow>#<step>`), and each verdict's to its check. Pure. A run with none comes
|
|
63
|
+
* back unchanged.
|
|
64
|
+
*/
|
|
65
|
+
export declare function withScreenshots(run: ReticleVerificationRun, taken: readonly RunScreenshot[]): ReticleVerificationRun;
|
|
54
66
|
export {};
|
|
@@ -5,14 +5,17 @@
|
|
|
5
5
|
* individual run to a deploy. The run is already clock-stamped by buildVerificationRun, so the store
|
|
6
6
|
* needs no clock.
|
|
7
7
|
*/
|
|
8
|
-
import { asRunId, ReticleVerificationRunSchema, RUN_RETENTION, RUN_RETENTION_SLACK, RunReadError, } from '@reticlehq/core';
|
|
8
|
+
import { asRunId, ReticleVerificationRunSchema, RUN_RETENTION, RUN_RETENTION_SLACK, RunReadError, RunScreenshotSchema, STEP_SCREENSHOT, } from '@reticlehq/core';
|
|
9
9
|
import { PromptContextSchema } from '@reticlehq/core/artifacts';
|
|
10
|
-
import { reticleDirPaths, isValidRunId, runPath } from '../../../memory/project/dir/reticle-dir.js';
|
|
10
|
+
import { reticleDirPaths, isValidRunId, runPath, stepShotDir, } from '../../../memory/project/dir/reticle-dir.js';
|
|
11
|
+
import { join } from 'node:path';
|
|
11
12
|
const JSON_INDENT = 2;
|
|
12
13
|
const JSON_EXT = '.json';
|
|
13
14
|
const TMP_EXT = '.tmp';
|
|
14
15
|
/** A request older than this is about some other task, not the run being written now. */
|
|
15
16
|
const REQUEST_RELEVANT_MS = 6 * 60 * 60 * 1000;
|
|
17
|
+
/** Which run a recorded request was attached to, written into the request file. */
|
|
18
|
+
const REQUEST_RUN_KEY = 'answeredByRun';
|
|
16
19
|
export class RunStore {
|
|
17
20
|
#fs;
|
|
18
21
|
#root;
|
|
@@ -37,9 +40,12 @@ export class RunStore {
|
|
|
37
40
|
throw new Error(`refusing to write run with unsafe runId: ${JSON.stringify(run.runId)}`);
|
|
38
41
|
}
|
|
39
42
|
await this.#fs.mkdir(reticleDirPaths(this.#root).runs);
|
|
40
|
-
const context = run.context ?? (await this.#recentRequest(run.createdAt));
|
|
43
|
+
const context = run.context ?? (await this.#recentRequest(run.createdAt, run.runId));
|
|
41
44
|
if (context !== undefined)
|
|
42
45
|
run = { ...run, context };
|
|
46
|
+
// The step screenshots taken for this run, the last of which may still be landing.
|
|
47
|
+
await shotsLanded(this.#root, run.runId);
|
|
48
|
+
run = withScreenshots(run, await readStepShots(this.#fs, this.#root, run.runId));
|
|
43
49
|
// Atomic publish: write a temp file then rename, so a crash mid-write never leaves a half-written
|
|
44
50
|
// artifact (a partial.json would otherwise read back as MALFORMED).
|
|
45
51
|
const path = runPath(this.#root, run.runId);
|
|
@@ -60,15 +66,23 @@ export class RunStore {
|
|
|
60
66
|
* The user's request this run answers, when the agent relayed one recently enough to be about it.
|
|
61
67
|
* Read from .reticle/intent/request.json (written by `reticle_intent { declare, request }`).
|
|
62
68
|
*/
|
|
63
|
-
async #recentRequest(at) {
|
|
69
|
+
async #recentRequest(at, runId) {
|
|
64
70
|
try {
|
|
65
|
-
const
|
|
71
|
+
const path = reticleDirPaths(this.#root).request;
|
|
72
|
+
const raw = JSON.parse(await this.#fs.readFile(path));
|
|
73
|
+
const parsed = PromptContextSchema.safeParse(raw);
|
|
66
74
|
if (!parsed.success)
|
|
67
75
|
return undefined;
|
|
68
76
|
const given = parsed.data.at;
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
77
|
+
if (given === undefined || at - given < 0 || REQUEST_RELEVANT_MS < at - given)
|
|
78
|
+
return undefined;
|
|
79
|
+
// The first run written for a request answers it; a later run (the next agent session in the
|
|
80
|
+
// same tab) inherited it and showed a goal it never had. Its own rewrite keeps it.
|
|
81
|
+
const answeredBy = raw[REQUEST_RUN_KEY];
|
|
82
|
+
if ('string' === typeof answeredBy)
|
|
83
|
+
return answeredBy === runId ? parsed.data : undefined;
|
|
84
|
+
await this.#fs.writeFile(path, `${JSON.stringify({ ...raw, [REQUEST_RUN_KEY]: runId }, null, JSON_INDENT)}\n`);
|
|
85
|
+
return parsed.data;
|
|
72
86
|
}
|
|
73
87
|
catch {
|
|
74
88
|
return undefined; // no request recorded: the common case
|
|
@@ -173,3 +187,156 @@ export class RunStore {
|
|
|
173
187
|
return [previous, current];
|
|
174
188
|
}
|
|
175
189
|
}
|
|
190
|
+
/*
|
|
191
|
+
* A run's step screenshots, as its artifact records them. The images are written beside the run
|
|
192
|
+
* (`.reticle/visual/runs/<runId>/`) with one record line each in `shots.jsonl` by
|
|
193
|
+
* `features/visual/step-shots.ts`; this is the reading half.
|
|
194
|
+
*/
|
|
195
|
+
/** How long a run write waits for screenshots still landing. A capture is never worth a stuck run. */
|
|
196
|
+
const LANDING_WAIT_MS = 10_000;
|
|
197
|
+
/** Captures still landing, per run directory. */
|
|
198
|
+
const landing = new Map();
|
|
199
|
+
/** Remember a capture that has not landed yet, so a run written now can wait for it. */
|
|
200
|
+
export function noteLanding(dir, land) {
|
|
201
|
+
const pending = landing.get(dir) ?? new Set();
|
|
202
|
+
landing.set(dir, pending);
|
|
203
|
+
pending.add(land);
|
|
204
|
+
void land.finally(() => pending.delete(land));
|
|
205
|
+
}
|
|
206
|
+
/** Wait for this run's screenshots still landing, so a run written now can list them. Bounded. */
|
|
207
|
+
export async function shotsLanded(root, runId) {
|
|
208
|
+
if (!isValidRunId(runId))
|
|
209
|
+
return;
|
|
210
|
+
const pending = landing.get(stepShotDir(root, runId));
|
|
211
|
+
if (pending === undefined || 0 === pending.size)
|
|
212
|
+
return;
|
|
213
|
+
let timer;
|
|
214
|
+
await Promise.race([
|
|
215
|
+
Promise.allSettled([...pending]),
|
|
216
|
+
new Promise((resolve) => {
|
|
217
|
+
timer = setTimeout(resolve, LANDING_WAIT_MS);
|
|
218
|
+
}),
|
|
219
|
+
]);
|
|
220
|
+
if (timer !== undefined)
|
|
221
|
+
clearTimeout(timer);
|
|
222
|
+
}
|
|
223
|
+
/** One line of a run's record, read back; anything malformed is skipped. */
|
|
224
|
+
function parseLine(line) {
|
|
225
|
+
try {
|
|
226
|
+
const parsed = RunScreenshotSchema.safeParse(JSON.parse(line));
|
|
227
|
+
return parsed.success ? parsed.data : undefined;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
/** Every screenshot a run has landed, in the order they were taken (by seq). Never throws. */
|
|
234
|
+
export async function readStepShots(fs, root, runId) {
|
|
235
|
+
if (!isValidRunId(runId))
|
|
236
|
+
return [];
|
|
237
|
+
try {
|
|
238
|
+
const text = await fs.readFile(join(stepShotDir(root, runId), STEP_SCREENSHOT.MANIFEST_FILE));
|
|
239
|
+
return (text
|
|
240
|
+
.split('\n')
|
|
241
|
+
.filter((line) => line.length > 0)
|
|
242
|
+
.map(parseLine)
|
|
243
|
+
.filter((shot) => shot !== undefined)
|
|
244
|
+
// In the order they were TAKEN: captures land in whatever order they finish.
|
|
245
|
+
.sort((a, b) => a.seq - b.seq));
|
|
246
|
+
}
|
|
247
|
+
catch {
|
|
248
|
+
return [];
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/** The four facts a step records about its picture, out of the run-wide entry. */
|
|
252
|
+
function stepShotOf(shot) {
|
|
253
|
+
const { file, source, width, height, sha256 } = shot;
|
|
254
|
+
return { file, source, width, height, sha256 };
|
|
255
|
+
}
|
|
256
|
+
/** An id that occurs once in the list; a repeated one (a reload restarts the count) pairs nothing. */
|
|
257
|
+
function uniqueIds(ids) {
|
|
258
|
+
const seen = new Map();
|
|
259
|
+
for (const id of ids)
|
|
260
|
+
if (id !== undefined)
|
|
261
|
+
seen.set(id, (seen.get(id) ?? 0) + 1);
|
|
262
|
+
return new Set([...seen].filter(([, n]) => 1 === n).map(([id]) => id));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Pair by the journal action each was taken for, when both sides name it. A check that took no
|
|
266
|
+
* picture (a `steps` call, an answer refused as an error) then costs only its own picture, where the
|
|
267
|
+
* ordinal pairing below lost every picture in the run.
|
|
268
|
+
*/
|
|
269
|
+
function pairByAction(run, shots) {
|
|
270
|
+
const verdictShots = shots.filter((shot) => true === shot.verdict && shot.actionId !== undefined);
|
|
271
|
+
if (0 === verdictShots.length || run.checks.every((check) => check.actionId === undefined))
|
|
272
|
+
return undefined;
|
|
273
|
+
const okChecks = uniqueIds(run.checks.map((check) => check.actionId));
|
|
274
|
+
const okShots = uniqueIds(verdictShots.map((shot) => shot.actionId));
|
|
275
|
+
const shotOf = new Map(verdictShots.flatMap((shot) => shot.actionId !== undefined && okShots.has(shot.actionId) && okChecks.has(shot.actionId)
|
|
276
|
+
? [[shot.actionId, shot]]
|
|
277
|
+
: []));
|
|
278
|
+
const checkIdOf = new Map();
|
|
279
|
+
const checks = run.checks.map((check) => {
|
|
280
|
+
const shot = check.actionId === undefined ? undefined : shotOf.get(check.actionId);
|
|
281
|
+
if (shot === undefined)
|
|
282
|
+
return check;
|
|
283
|
+
if (check.checkId !== undefined)
|
|
284
|
+
checkIdOf.set(shot, check.checkId);
|
|
285
|
+
return { ...check, screenshot: stepShotOf(shot) };
|
|
286
|
+
});
|
|
287
|
+
return {
|
|
288
|
+
checks,
|
|
289
|
+
shots: shots.map((shot) => {
|
|
290
|
+
const checkId = checkIdOf.get(shot);
|
|
291
|
+
return checkId === undefined ? shot : { ...shot, checkId };
|
|
292
|
+
}),
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Pair each verdict's picture with the check it produced: the n-th verdict picture is the n-th check,
|
|
297
|
+
* because both are written in the order the verdicts were given. Only when the counts agree — a
|
|
298
|
+
* verdict this run did not fold, or one taken while the capture failed, would shift every pairing
|
|
299
|
+
* after it, and an unpaired picture is better than one shown beside the wrong check.
|
|
300
|
+
*/
|
|
301
|
+
function pairWithChecks(run, shots) {
|
|
302
|
+
const byAction = pairByAction(run, shots);
|
|
303
|
+
if (byAction !== undefined)
|
|
304
|
+
return byAction;
|
|
305
|
+
const verdictShots = shots.filter((shot) => true === shot.verdict);
|
|
306
|
+
if (0 === verdictShots.length ||
|
|
307
|
+
verdictShots.length !== run.checks.length ||
|
|
308
|
+
run.checks.some((check) => check.checkId === undefined))
|
|
309
|
+
return { checks: run.checks, shots: [...shots] };
|
|
310
|
+
const checkIdOf = new Map(verdictShots.map((shot, i) => [shot, run.checks[i]?.checkId]));
|
|
311
|
+
return {
|
|
312
|
+
checks: run.checks.map((check, i) => {
|
|
313
|
+
const shot = verdictShots[i];
|
|
314
|
+
return shot === undefined ? check : { ...check, screenshot: stepShotOf(shot) };
|
|
315
|
+
}),
|
|
316
|
+
shots: shots.map((shot) => {
|
|
317
|
+
const checkId = checkIdOf.get(shot);
|
|
318
|
+
return checkId === undefined ? shot : { ...shot, checkId };
|
|
319
|
+
}),
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* The run with its screenshots: every one in `screenshots`, each replayed step's pinned to that
|
|
324
|
+
* step (matched as `<flow>#<step>`), and each verdict's to its check. Pure. A run with none comes
|
|
325
|
+
* back unchanged.
|
|
326
|
+
*/
|
|
327
|
+
export function withScreenshots(run, taken) {
|
|
328
|
+
if (0 === taken.length)
|
|
329
|
+
return run;
|
|
330
|
+
const { checks, shots } = pairWithChecks(run, taken);
|
|
331
|
+
const byStep = new Map(shots.flatMap((shot) => (shot.step === undefined ? [] : [[shot.step, shot]])));
|
|
332
|
+
const flows = run.flows.map((flow) => flow.stepResults === undefined
|
|
333
|
+
? flow
|
|
334
|
+
: {
|
|
335
|
+
...flow,
|
|
336
|
+
stepResults: flow.stepResults.map((result) => {
|
|
337
|
+
const shot = byStep.get(`${flow.name}#${String(result.step)}`);
|
|
338
|
+
return shot === undefined ? result : { ...result, screenshot: stepShotOf(shot) };
|
|
339
|
+
}),
|
|
340
|
+
});
|
|
341
|
+
return { ...run, checks, flows, screenshots: shots };
|
|
342
|
+
}
|
|
@@ -6,6 +6,8 @@ import { openSessionIntents } from '../../memory/intent/open-intents.js';
|
|
|
6
6
|
import { ReticleTool } from '@reticlehq/core';
|
|
7
7
|
import { sessionIdShape } from '../../surface/tools/tool-kit.js';
|
|
8
8
|
import { asString } from '@reticlehq/core';
|
|
9
|
+
import { resumeFromDisk, resumeLines } from './resume.js';
|
|
10
|
+
import { sessionRoot } from '../../memory/project/session-root.js';
|
|
9
11
|
/**
|
|
10
12
|
* What this run has established, asked for by the one party that knows when it is needed.
|
|
11
13
|
*
|
|
@@ -19,21 +21,30 @@ import { asString } from '@reticlehq/core';
|
|
|
19
21
|
*/
|
|
20
22
|
/** What the run has established, and where each part of it came from. */
|
|
21
23
|
const CONTEXT_OUTPUT_SCHEMA = {
|
|
24
|
+
resume: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Only with `compact: true`: the whole answer in under ~1k tokens — the tab and route, the request, every claim that FAILED or is NOT PROVED (by its latest verdict), what held, open intents, app notes and the rules. Read it after a compaction instead of trusting your summary.'),
|
|
22
28
|
step: z
|
|
23
29
|
.number()
|
|
30
|
+
.optional()
|
|
24
31
|
.describe('How many actions this run has dispatched. Counted off the journal, not a counter of its own.'),
|
|
25
32
|
established: z
|
|
26
33
|
.array(z.unknown())
|
|
34
|
+
.optional()
|
|
27
35
|
.describe('What Reticle OBSERVED, folded and capped, each `{ key, fact, source?, doc?, epoch? }`. `key` is the subject, so re-observing it supersedes rather than appends. Anything seen under a replaced document or a pre-edit epoch is already gone from this list.'),
|
|
28
36
|
proven: z
|
|
29
37
|
.array(z.unknown())
|
|
38
|
+
.optional()
|
|
30
39
|
.describe('Claims a verdict already settled, each `{ claim, verified, source?, doc?, epoch? }`. Read this before re-driving something: re-proving it is slow, and assuming it is a false green.'),
|
|
31
40
|
gap: z
|
|
32
41
|
.object({})
|
|
33
42
|
.passthrough()
|
|
43
|
+
.optional()
|
|
34
44
|
.describe('The distance between what was claimed and what held, over THIS session: `{ claims, held, failed, undecided, nothingToProve, undecidedBy, falseGreensCaught, failures }`. `undecidedBy` says WHO can act on each unknown — environment (wait), code (fix the app), harness (fix Reticle or the call), could-not-see (look again). Folded from the same journal as everything else here, so it cannot disagree with it.'),
|
|
35
45
|
remaining: z
|
|
36
46
|
.array(z.string())
|
|
47
|
+
.optional()
|
|
37
48
|
.describe('The intents from .reticle/intent/ that no verdict has discharged. Derived from the ledger, never a guess at what you meant to do next.'),
|
|
38
49
|
};
|
|
39
50
|
/** The ledger and the live page state this run is folded out of. `[]`/undefined when nothing is connected. */
|
|
@@ -59,16 +70,63 @@ async function evidenceFor(deps, sessionId) {
|
|
|
59
70
|
};
|
|
60
71
|
}
|
|
61
72
|
}
|
|
73
|
+
/** The resume block for the live session, or the newest one on disk when none is connected. */
|
|
74
|
+
async function resumeFor(deps, sessionId, actions) {
|
|
75
|
+
let live;
|
|
76
|
+
try {
|
|
77
|
+
const session = deps.sessions.resolve(sessionId);
|
|
78
|
+
live = { id: session.id, url: session.url, cursor: session.elapsed() };
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
live = undefined;
|
|
82
|
+
}
|
|
83
|
+
let root;
|
|
84
|
+
try {
|
|
85
|
+
root = sessionRoot(deps, live?.id);
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
// No project can be named for this call: the live journal is all there is to fold.
|
|
89
|
+
return resumeLines({ actions, openIntents: [], notes: [] });
|
|
90
|
+
}
|
|
91
|
+
return resumeFromDisk({
|
|
92
|
+
root,
|
|
93
|
+
now: deps.now(),
|
|
94
|
+
fs: deps.fs,
|
|
95
|
+
// The live journal; with nothing connected there is no live one to fold, and the CLI's
|
|
96
|
+
// `reticle context --compact` is the reader for a session that has gone.
|
|
97
|
+
readActions: () => Promise.resolve(actions),
|
|
98
|
+
...(live === undefined
|
|
99
|
+
? {}
|
|
100
|
+
: { sessionId: live.id, route: routeOf(live.url), cursor: live.cursor }),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/** The path of a page URL, or the URL as given. */
|
|
104
|
+
function routeOf(url) {
|
|
105
|
+
try {
|
|
106
|
+
return new URL(url).pathname;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
return url;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
62
112
|
export const CONTEXT_TOOLS = [
|
|
63
113
|
{
|
|
64
114
|
name: ReticleTool.CONTEXT,
|
|
65
115
|
description: 'What THIS run has already established, so you do not rediscover it. Call it when your own copy is gone: right after a compaction, at the top of a fresh sub-agent, or at the start of a turn you did not begin. Returns `established` (what Reticle OBSERVED, with the source file:line where one was reported), `proven` (claims a verdict already settled, so you neither re-prove them nor assume them) and `remaining` (the intents from .reticle/intent/ that nothing has discharged). It is a FOLD over the journal, never a second store, so it cannot disagree with the ledger. Bounded and superseding rather than accumulating, and anything observed under a replaced document or before your last source edit is already dropped rather than presented as current. Only what Reticle observed goes in: it never reports what you intended or believed.',
|
|
66
116
|
example: {},
|
|
67
|
-
inputSchema: {
|
|
117
|
+
inputSchema: {
|
|
118
|
+
compact: z
|
|
119
|
+
.boolean()
|
|
120
|
+
.optional()
|
|
121
|
+
.describe('After a compaction: one bounded `resume` text instead of the structured fold.'),
|
|
122
|
+
...sessionIdShape,
|
|
123
|
+
},
|
|
68
124
|
outputSchema: CONTEXT_OUTPUT_SCHEMA,
|
|
69
125
|
handler: async (deps, args) => {
|
|
70
126
|
const sessionId = asString(args['sessionId']);
|
|
71
127
|
const evidence = await evidenceFor(deps, sessionId);
|
|
128
|
+
if (true === args['compact'])
|
|
129
|
+
return { resume: (await resumeFor(deps, sessionId, evidence.actions)).join('\n') };
|
|
72
130
|
const context = runContextFor({
|
|
73
131
|
...evidence,
|
|
74
132
|
intents: await openSessionIntents(deps, sessionId),
|
|
@@ -6,3 +6,6 @@ import { type RunId } from '@reticlehq/core';
|
|
|
6
6
|
* flow-replay stack would be a cycle.
|
|
7
7
|
*/
|
|
8
8
|
export declare function defaultRunId(): RunId;
|
|
9
|
+
export declare function withShotRun<T>(runId: string, fn: () => Promise<T>): Promise<T>;
|
|
10
|
+
/** The run being replayed now, or undefined outside a verify. */
|
|
11
|
+
export declare function currentShotRun(): string | undefined;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
1
2
|
import { randomUUID } from 'node:crypto';
|
|
2
3
|
import { asRunId } from '@reticlehq/core';
|
|
3
4
|
/**
|
|
@@ -9,3 +10,18 @@ import { asRunId } from '@reticlehq/core';
|
|
|
9
10
|
export function defaultRunId() {
|
|
10
11
|
return asRunId(randomUUID());
|
|
11
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* The run a replay's step screenshots belong to, carried across every await under it.
|
|
15
|
+
*
|
|
16
|
+
* A suite's run id used to be minted after its flows had replayed, so a screenshot taken during a
|
|
17
|
+
* step had no run to be filed under. The verify paths now mint the id first and run the replays
|
|
18
|
+
* inside it; a capture outside any of them belongs to the session's own drive run.
|
|
19
|
+
*/
|
|
20
|
+
const current = new AsyncLocalStorage();
|
|
21
|
+
export function withShotRun(runId, fn) {
|
|
22
|
+
return current.run(runId, fn);
|
|
23
|
+
}
|
|
24
|
+
/** The run being replayed now, or undefined outside a verify. */
|
|
25
|
+
export function currentShotRun() {
|
|
26
|
+
return current.getStore();
|
|
27
|
+
}
|
|
@@ -22,9 +22,11 @@
|
|
|
22
22
|
* outcome is four-valued now, so all four are recorded, and the run verdict counts an undetermined
|
|
23
23
|
* check as neither a pass nor a failure -- which is what those words already meant everywhere else.
|
|
24
24
|
*/
|
|
25
|
-
import { RunFramework, type JournalAction } from '@reticlehq/core';
|
|
25
|
+
import { RunFramework, type VerdictStatus, type JournalAction, type RunDisparity } from '@reticlehq/core';
|
|
26
26
|
import type { VerificationRunInput } from './artifact/build-verification-run.js';
|
|
27
27
|
export interface DriveRunDeps {
|
|
28
|
+
/** The project's folder name, for a tab that reported no project id. */
|
|
29
|
+
projectName?: string | undefined;
|
|
28
30
|
runId: string;
|
|
29
31
|
/** The project this session belonged to, for the dashboard's row. */
|
|
30
32
|
projectId?: string | undefined;
|
|
@@ -38,7 +40,24 @@ export interface DriveRunDeps {
|
|
|
38
40
|
* Absent when nobody was counting edits, which must not be reported as "the first round".
|
|
39
41
|
*/
|
|
40
42
|
editEpoch?: number | undefined;
|
|
43
|
+
/** Where each agent session in the tab ended (`agentEndCounts`): each is folded on its own. */
|
|
44
|
+
agentEnds?: readonly number[];
|
|
45
|
+
/** What the agent claimed at each of those ends (`agentEndClaims`), by the same index. */
|
|
46
|
+
agentClaims?: readonly (VerdictStatus | undefined)[];
|
|
47
|
+
/** The agent's own claim for this run, carried beside the graded verdict. */
|
|
48
|
+
agentClaim?: VerdictStatus | undefined;
|
|
41
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* What a verdict required and what it saw, as the journal keeps them for its check. One place, so
|
|
52
|
+
* the act and assert paths cannot keep different halves.
|
|
53
|
+
*/
|
|
54
|
+
export declare function checkWords(verdict: {
|
|
55
|
+
expected?: string;
|
|
56
|
+
observed?: string;
|
|
57
|
+
}): {
|
|
58
|
+
expected?: string;
|
|
59
|
+
observed?: string;
|
|
60
|
+
};
|
|
42
61
|
/**
|
|
43
62
|
* The run id for a session's drive: stable, so the session rewrites its own row.
|
|
44
63
|
*
|
|
@@ -52,6 +71,26 @@ export interface DriveRunDeps {
|
|
|
52
71
|
* for that session rather than refusing to record it.
|
|
53
72
|
*/
|
|
54
73
|
export declare function driveRunId(sessionId: string): string;
|
|
74
|
+
/** The run the agent's session now open in this tab is kept under. */
|
|
75
|
+
export declare function agentRunId(sessionId: string): string;
|
|
76
|
+
/**
|
|
77
|
+
* The run the current call lands in: the flow being replayed, else the Harness drive, else the
|
|
78
|
+
* agent session open in the tab. One answer for a call's screenshot and an intent its check proves.
|
|
79
|
+
*/
|
|
80
|
+
export declare function runIdOfCall(sessionId: string): string;
|
|
81
|
+
/** The ends recorded for a tab, as counts of the agent's own actions, for the fold. */
|
|
82
|
+
export declare function agentEndCounts(sessionId: string): number[];
|
|
83
|
+
/** What the agent claimed at each end of a tab, by the index `agentEndCounts` uses. */
|
|
84
|
+
export declare function agentEndClaims(sessionId: string): (VerdictStatus | undefined)[];
|
|
85
|
+
/**
|
|
86
|
+
* An agent session ends: its own actions since the previous end, the run they are kept under, and
|
|
87
|
+
* how long it ran. Recorded, so what the agent drives next is the next session's.
|
|
88
|
+
*/
|
|
89
|
+
export declare function endAgentSession(sessionId: string, actions: readonly JournalAction[], at: number | undefined, claim?: VerdictStatus): {
|
|
90
|
+
actions: JournalAction[];
|
|
91
|
+
runId: string;
|
|
92
|
+
wallMs?: number;
|
|
93
|
+
};
|
|
55
94
|
/**
|
|
56
95
|
* Fold a session's journal into a run, or return undefined when there is nothing honest to report.
|
|
57
96
|
*
|
|
@@ -67,12 +106,21 @@ export declare function harnessAgentId(driver: string): string;
|
|
|
67
106
|
*/
|
|
68
107
|
export declare function harnessRunId(harness: string): string | undefined;
|
|
69
108
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
|
|
73
|
-
|
|
109
|
+
* Hear about every Harness note. A drive is graded after its last verdict, and the run that verdict
|
|
110
|
+
* flushed never carried the grade: live, the platform filed a failed check instead of "Hard to find".
|
|
111
|
+
*/
|
|
112
|
+
export declare function onHarnessNoted(listener: () => void): () => void;
|
|
113
|
+
/**
|
|
114
|
+
* The drive's own measure of how long it ran. The span of one tab's journal is not it: a lane in a
|
|
115
|
+
* leased browser left only the grade's assert in the tab, and its run read "Took 0 ms".
|
|
74
116
|
*/
|
|
117
|
+
export declare function noteHarnessSpan(harness: string, ms: number): void;
|
|
75
118
|
export declare function noteHarnessGoal(harness: string, met: boolean | undefined): void;
|
|
119
|
+
/**
|
|
120
|
+
* Noted when a drive is graded, like its goal: its run artifact carries the comparison, so the
|
|
121
|
+
* platform can file a goal the agent proved and the Harness could not find.
|
|
122
|
+
*/
|
|
123
|
+
export declare function noteHarnessDisparity(harness: string, found: readonly RunDisparity[]): void;
|
|
76
124
|
/**
|
|
77
125
|
* Every run a session's journal holds: the connected agent's drive, and one per Harness drive.
|
|
78
126
|
*
|