@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
|
@@ -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
|
*
|
|
@@ -59,3 +98,34 @@ export declare function driveRunId(sessionId: string): string;
|
|
|
59
98
|
* artifact are the caller's job, which is what keeps the verdict rules testable without a disk.
|
|
60
99
|
*/
|
|
61
100
|
export declare function driveRunFrom(actions: readonly JournalAction[], deps: DriveRunDeps): VerificationRunInput | undefined;
|
|
101
|
+
/** What a Harness run says drove it, in the dashboard's "Driven by" line. */
|
|
102
|
+
export declare function harnessAgentId(driver: string): string;
|
|
103
|
+
/**
|
|
104
|
+
* The id of the run a Harness drive syncs as, so whoever started the drive can find it again (the
|
|
105
|
+
* platform's chat folds the run into the check it asked for). Undefined for an id no run can carry.
|
|
106
|
+
*/
|
|
107
|
+
export declare function harnessRunId(harness: string): string | undefined;
|
|
108
|
+
/**
|
|
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".
|
|
116
|
+
*/
|
|
117
|
+
export declare function noteHarnessSpan(harness: string, ms: number): void;
|
|
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;
|
|
124
|
+
/**
|
|
125
|
+
* Every run a session's journal holds: the connected agent's drive, and one per Harness drive.
|
|
126
|
+
*
|
|
127
|
+
* They used to be one. A Harness drive dispatches through the same tools in the same tab, so its
|
|
128
|
+
* verdicts folded into the agent's run, and the dashboard showed one blended row that credited the
|
|
129
|
+
* agent with what the Harness proved and named neither.
|
|
130
|
+
*/
|
|
131
|
+
export declare function driveRunsFrom(actions: readonly JournalAction[], deps: DriveRunDeps): VerificationRunInput[];
|
|
@@ -22,19 +22,40 @@
|
|
|
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 { supersededChecks } from '@reticlehq/engine/evidence/superseded-checks.js';
|
|
25
26
|
import { isValidRunId } from '../../memory/project/dir/reticle-dir.js';
|
|
26
27
|
import { defaultRunId } from './runner-port.js';
|
|
27
|
-
import {
|
|
28
|
+
import { currentShotRun } from './default-run-id.js';
|
|
29
|
+
import { currentDrivenBy } from '../../hooks/driven-by.js';
|
|
30
|
+
import { JournalVerdictEffectSchema, RunAgentKind, asRecord, asString, RunFramework, RunProfile, RunTrigger, PredicateKind, Verified, VerifiedReason, driveFlowStatus, } from '@reticlehq/core';
|
|
28
31
|
import { withCorrections } from './late-answer.js';
|
|
29
32
|
/** The author of record when no MCP peer introduced itself. Mirrors verification-sync's default. */
|
|
30
33
|
const UNNAMED_AGENT = 'reticle-mcp';
|
|
34
|
+
/**
|
|
35
|
+
* The one MCP client every stamped action came from. Two clients in one tab is undefined, never a
|
|
36
|
+
* pick: crediting either would put the other's verdicts under its name.
|
|
37
|
+
*/
|
|
38
|
+
function soleAgent(actions) {
|
|
39
|
+
const named = new Set(actions.flatMap((action) => (action.agent === undefined ? [] : [action.agent])));
|
|
40
|
+
return 1 === named.size ? [...named][0] : undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* What a verdict required and what it saw, as the journal keeps them for its check. One place, so
|
|
44
|
+
* the act and assert paths cannot keep different halves.
|
|
45
|
+
*/
|
|
46
|
+
export function checkWords(verdict) {
|
|
47
|
+
return {
|
|
48
|
+
...(verdict.expected === undefined ? {} : { expected: verdict.expected }),
|
|
49
|
+
...(verdict.observed === undefined ? {} : { observed: verdict.observed }),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
31
52
|
/** Every verdict a verification tool recorded on this session's actions, in order. */
|
|
32
53
|
function verdicts(actions) {
|
|
33
54
|
const out = [];
|
|
34
55
|
for (const action of actions) {
|
|
35
56
|
const parsed = JournalVerdictEffectSchema.safeParse(action.effect);
|
|
36
57
|
if (parsed.success)
|
|
37
|
-
out.push(parsed.data);
|
|
58
|
+
out.push({ ...parsed.data, actionId: action.actionId });
|
|
38
59
|
}
|
|
39
60
|
return out;
|
|
40
61
|
}
|
|
@@ -66,6 +87,87 @@ export function driveRunId(sessionId) {
|
|
|
66
87
|
const candidate = `${DRIVE_RUN_PREFIX}${sessionId}`;
|
|
67
88
|
return isValidRunId(candidate) ? candidate : defaultRunId();
|
|
68
89
|
}
|
|
90
|
+
/** The run of the `segment`th agent session in a tab: the tab's id first, then `-2`, `-3`… */
|
|
91
|
+
function segmentRunId(base, segment) {
|
|
92
|
+
if (0 === segment)
|
|
93
|
+
return base;
|
|
94
|
+
const id = `${base}-${String(segment + 1)}`;
|
|
95
|
+
return isValidRunId(id) ? id : base;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Where each agent session in a tab ended: how many of the agent's own actions the tab held then,
|
|
99
|
+
* and the tab's clock. Every agent session in a tab wrote one run id, so a later end overwrote the
|
|
100
|
+
* earlier run on the dashboard.
|
|
101
|
+
* ponytail: daemon memory; a restart forgets the ends and the next fold is one run, as before.
|
|
102
|
+
*/
|
|
103
|
+
const agentEnds = new Map();
|
|
104
|
+
/** The agent's own actions: the Harness drives in the same tab are runs of their own. */
|
|
105
|
+
const agentsOwn = (actions) => actions.filter((action) => action.drivenBy === undefined);
|
|
106
|
+
/** The run the agent's session now open in this tab is kept under. */
|
|
107
|
+
export function agentRunId(sessionId) {
|
|
108
|
+
return segmentRunId(driveRunId(sessionId), agentEnds.get(sessionId)?.length ?? 0);
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* The run the current call lands in: the flow being replayed, else the Harness drive, else the
|
|
112
|
+
* agent session open in the tab. One answer for a call's screenshot and an intent its check proves.
|
|
113
|
+
*/
|
|
114
|
+
export function runIdOfCall(sessionId) {
|
|
115
|
+
const scoped = currentShotRun();
|
|
116
|
+
if (scoped !== undefined)
|
|
117
|
+
return scoped;
|
|
118
|
+
const by = currentDrivenBy();
|
|
119
|
+
const harness = by === undefined ? undefined : harnessRunId(by.harness);
|
|
120
|
+
return harness ?? agentRunId(sessionId);
|
|
121
|
+
}
|
|
122
|
+
/** The ends recorded for a tab, as counts of the agent's own actions, for the fold. */
|
|
123
|
+
export function agentEndCounts(sessionId) {
|
|
124
|
+
return (agentEnds.get(sessionId) ?? []).map((end) => end.count);
|
|
125
|
+
}
|
|
126
|
+
/** What the agent claimed at each end of a tab, by the index `agentEndCounts` uses. */
|
|
127
|
+
export function agentEndClaims(sessionId) {
|
|
128
|
+
return (agentEnds.get(sessionId) ?? []).map((end) => end.claim);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* An agent session ends: its own actions since the previous end, the run they are kept under, and
|
|
132
|
+
* how long it ran. Recorded, so what the agent drives next is the next session's.
|
|
133
|
+
*/
|
|
134
|
+
export function endAgentSession(sessionId, actions, at, claim) {
|
|
135
|
+
const own = agentsOwn(actions);
|
|
136
|
+
const ends = agentEnds.get(sessionId) ?? [];
|
|
137
|
+
const last = ends.at(-1);
|
|
138
|
+
const runId = agentRunId(sessionId);
|
|
139
|
+
ends.push({
|
|
140
|
+
count: own.length,
|
|
141
|
+
at: at ?? last?.at ?? 0,
|
|
142
|
+
...(claim === undefined ? {} : { claim }),
|
|
143
|
+
});
|
|
144
|
+
agentEnds.set(sessionId, ends);
|
|
145
|
+
// The end splits the tab's runs: written again now, not when the tab disconnects, so the run this
|
|
146
|
+
// end names is on disk (and the dashboard) while the tab stays open.
|
|
147
|
+
tellNoted();
|
|
148
|
+
const mine = own.slice(Math.min(last?.count ?? 0, own.length));
|
|
149
|
+
const wallMs = at === undefined ? undefined : wallOf(mine, last?.at, at);
|
|
150
|
+
return { actions: mine, runId, ...(wallMs === undefined ? {} : { wallMs }) };
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* How long a session ran, `since` the previous end (else its first action) to `end`, on the tab's
|
|
154
|
+
* clock, which restarts at every page load: an action stamped before the one ahead of it starts a
|
|
155
|
+
* new stretch, and the stretches add up. Measured from the last load alone, a ten-second session
|
|
156
|
+
* that navigated read "1.2s". ponytail: the gap between a reload and the next action is not counted.
|
|
157
|
+
*/
|
|
158
|
+
function wallOf(actions, since, end) {
|
|
159
|
+
let start = since ?? actions[0]?.tRange.from ?? end;
|
|
160
|
+
let prev = start;
|
|
161
|
+
let total = 0;
|
|
162
|
+
for (const action of actions) {
|
|
163
|
+
if (action.at < prev) {
|
|
164
|
+
total += prev - start;
|
|
165
|
+
start = action.tRange.from;
|
|
166
|
+
}
|
|
167
|
+
prev = action.at;
|
|
168
|
+
}
|
|
169
|
+
return total + (prev <= end ? end - start : prev - start + end);
|
|
170
|
+
}
|
|
69
171
|
/**
|
|
70
172
|
* Fold a session's journal into a run, or return undefined when there is nothing honest to report.
|
|
71
173
|
*
|
|
@@ -74,12 +176,27 @@ export function driveRunId(sessionId) {
|
|
|
74
176
|
*/
|
|
75
177
|
export function driveRunFrom(actions, deps) {
|
|
76
178
|
const found = verdicts(actions);
|
|
179
|
+
const intentOf = new Map(actions.map((a) => [a.actionId, asString(asRecord(a.args)['intent'])]));
|
|
77
180
|
const checks = [];
|
|
78
181
|
for (const verdict of found) {
|
|
182
|
+
const intent = intentOf.get(verdict.actionId);
|
|
79
183
|
checks.push({
|
|
80
184
|
predicate: verdict.claim,
|
|
81
185
|
status: verdict.verified,
|
|
82
|
-
|
|
186
|
+
actionId: verdict.actionId,
|
|
187
|
+
...(intent === undefined || 0 === intent.length ? {} : { intent }),
|
|
188
|
+
// Where it was written, and on a miss the calls of its window: what an issue page shows.
|
|
189
|
+
...(verdict.source === undefined && verdict.net === undefined
|
|
190
|
+
? {}
|
|
191
|
+
: {
|
|
192
|
+
evidence: {
|
|
193
|
+
...(verdict.source === undefined ? {} : { source: verdict.source }),
|
|
194
|
+
...(verdict.net === undefined ? {} : { net: verdict.net }),
|
|
195
|
+
},
|
|
196
|
+
}),
|
|
197
|
+
// What it required and what it saw, so a failed check can say both on the platform.
|
|
198
|
+
...(verdict.expected === undefined ? {} : { expected: verdict.expected }),
|
|
199
|
+
...(verdict.observed === undefined ? {} : { observed: verdict.observed }),
|
|
83
200
|
// Carried through rather than recomputed. These were established at the moment the verdict
|
|
84
201
|
// was made and written down then; a run built later cannot know any of them, and inferring
|
|
85
202
|
// them here would be inventing evidence about evidence.
|
|
@@ -114,10 +231,14 @@ export function driveRunFrom(actions, deps) {
|
|
|
114
231
|
durationMs: spanOf(actions),
|
|
115
232
|
profile: RunProfile.DEV,
|
|
116
233
|
project: {
|
|
117
|
-
name:
|
|
234
|
+
// Never the daemon's own name: a tab that reported no project is named by its folder.
|
|
235
|
+
name: deps.projectId ?? deps.projectName ?? UNNAMED_AGENT,
|
|
118
236
|
framework: deps.framework ?? RunFramework.OTHER,
|
|
119
237
|
},
|
|
120
|
-
agent: {
|
|
238
|
+
agent: {
|
|
239
|
+
id: deps.agentId ?? soleAgent(actions) ?? UNNAMED_AGENT,
|
|
240
|
+
kind: RunAgentKind.CODING_AGENT,
|
|
241
|
+
},
|
|
121
242
|
trigger: {
|
|
122
243
|
kind: RunTrigger.EDIT,
|
|
123
244
|
note: 'driven live through the Reticle tools',
|
|
@@ -131,5 +252,196 @@ export function driveRunFrom(actions, deps) {
|
|
|
131
252
|
// about what was WRONG, and a fold that guessed at anomalies would be inventing findings — the
|
|
132
253
|
// failure this artifact is supposed to make impossible. Checks are the evidence here.
|
|
133
254
|
evidence: { consoleErrors: [], networkAnomalies: [], stateAssertions: [], timeline: [] },
|
|
255
|
+
...(deps.agentClaim === undefined ? {} : { agentClaim: deps.agentClaim }),
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/** Marks a run as one Harness drive, so it never collides with the session's own `drive-` run. */
|
|
259
|
+
const HARNESS_RUN_PREFIX = 'harness-';
|
|
260
|
+
/** What a Harness run says drove it, in the dashboard's "Driven by" line. */
|
|
261
|
+
export function harnessAgentId(driver) {
|
|
262
|
+
return 'server' === driver ? 'Reticle Harness (platform)' : `Reticle Harness (${driver})`;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* The id of the run a Harness drive syncs as, so whoever started the drive can find it again (the
|
|
266
|
+
* platform's chat folds the run into the check it asked for). Undefined for an id no run can carry.
|
|
267
|
+
*/
|
|
268
|
+
export function harnessRunId(harness) {
|
|
269
|
+
const candidate = `${HARNESS_RUN_PREFIX}${harness}`;
|
|
270
|
+
return isValidRunId(candidate) ? candidate : undefined;
|
|
271
|
+
}
|
|
272
|
+
/** The journey a Harness drive was named for, or what it did when nobody named one. */
|
|
273
|
+
// Never "Harness drive": that read as the title of every unnamed drive's flow and finding.
|
|
274
|
+
const UNNAMED_JOURNEY = 'Exploring the app';
|
|
275
|
+
/** Goal verdicts kept for the drives a session has not yet been graded on. */
|
|
276
|
+
const MAX_GOALS_HELD = 200;
|
|
277
|
+
const goalsMissed = new Map();
|
|
278
|
+
/**
|
|
279
|
+
* What the Harness judged of a drive's goal, noted the moment the drive finishes, before its
|
|
280
|
+
* session ends and is graded. A drive whose checks held but whose goal was not reached synced as
|
|
281
|
+
* "Proved"; it is not proved. Unmet once is unmet: a later journey of the same drive reaching its
|
|
282
|
+
* goal does not undo it.
|
|
283
|
+
*/
|
|
284
|
+
/** Told when a Harness drive's goal or comparison is noted, or an agent session ends, so its run is written again. */
|
|
285
|
+
const noted = new Set();
|
|
286
|
+
/**
|
|
287
|
+
* Hear about every Harness note. A drive is graded after its last verdict, and the run that verdict
|
|
288
|
+
* flushed never carried the grade: live, the platform filed a failed check instead of "Hard to find".
|
|
289
|
+
*/
|
|
290
|
+
export function onHarnessNoted(listener) {
|
|
291
|
+
noted.add(listener);
|
|
292
|
+
return () => noted.delete(listener);
|
|
293
|
+
}
|
|
294
|
+
const tellNoted = () => {
|
|
295
|
+
for (const listener of noted)
|
|
296
|
+
listener();
|
|
297
|
+
};
|
|
298
|
+
/** How long each Harness drive took, timed by the drive on the injected clock. */
|
|
299
|
+
const spans = new Map();
|
|
300
|
+
/**
|
|
301
|
+
* The drive's own measure of how long it ran. The span of one tab's journal is not it: a lane in a
|
|
302
|
+
* leased browser left only the grade's assert in the tab, and its run read "Took 0 ms".
|
|
303
|
+
*/
|
|
304
|
+
export function noteHarnessSpan(harness, ms) {
|
|
305
|
+
if (MAX_GOALS_HELD <= spans.size && !spans.has(harness)) {
|
|
306
|
+
const oldest = spans.keys().next().value;
|
|
307
|
+
if (oldest !== undefined)
|
|
308
|
+
spans.delete(oldest);
|
|
309
|
+
}
|
|
310
|
+
spans.set(harness, Math.max(0, ms));
|
|
311
|
+
tellNoted();
|
|
312
|
+
}
|
|
313
|
+
export function noteHarnessGoal(harness, met) {
|
|
314
|
+
if (met === undefined)
|
|
315
|
+
return;
|
|
316
|
+
const before = goalsMissed.get(harness);
|
|
317
|
+
if (false === before)
|
|
318
|
+
return;
|
|
319
|
+
if (MAX_GOALS_HELD <= goalsMissed.size && !goalsMissed.has(harness)) {
|
|
320
|
+
const oldest = goalsMissed.keys().next().value;
|
|
321
|
+
if (oldest !== undefined)
|
|
322
|
+
goalsMissed.delete(oldest);
|
|
323
|
+
}
|
|
324
|
+
goalsMissed.set(harness, met);
|
|
325
|
+
tellNoted();
|
|
326
|
+
}
|
|
327
|
+
/** How each Harness drive's goals compared with the agent's verdicts, until its run is folded. */
|
|
328
|
+
const disparities = new Map();
|
|
329
|
+
/**
|
|
330
|
+
* Noted when a drive is graded, like its goal: its run artifact carries the comparison, so the
|
|
331
|
+
* platform can file a goal the agent proved and the Harness could not find.
|
|
332
|
+
*/
|
|
333
|
+
export function noteHarnessDisparity(harness, found) {
|
|
334
|
+
if (0 === found.length)
|
|
335
|
+
return;
|
|
336
|
+
if (MAX_GOALS_HELD <= disparities.size && !disparities.has(harness)) {
|
|
337
|
+
const oldest = disparities.keys().next().value;
|
|
338
|
+
if (oldest !== undefined)
|
|
339
|
+
disparities.delete(oldest);
|
|
340
|
+
}
|
|
341
|
+
disparities.set(harness, found);
|
|
342
|
+
tellNoted();
|
|
343
|
+
}
|
|
344
|
+
/** The phrase `describeWaitTarget` opens a route claim with, as the journal records it. */
|
|
345
|
+
const ROUTE_CLAIM = 'a route change';
|
|
346
|
+
const ABSENCE_OF = 'the absence of ';
|
|
347
|
+
/**
|
|
348
|
+
* Whether a recorded check claimed nothing but a route (or leaving one): the Harness driver's guess
|
|
349
|
+
* about where a click goes, which `harness/route-guess.ts` explains. Kept here because a run fold
|
|
350
|
+
* reads the journal's words, not the predicate.
|
|
351
|
+
*/
|
|
352
|
+
function claimsOnlyRoute(claim, kind) {
|
|
353
|
+
if (PredicateKind.ROUTE === kind)
|
|
354
|
+
return true;
|
|
355
|
+
return PredicateKind.NOT === kind && claim.startsWith(`${ABSENCE_OF}${ROUTE_CLAIM}`);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* One Harness drive, as its own run: named for the journey it was asked to complete, and credited to
|
|
359
|
+
* the Harness rather than to the agent whose tab it shared. The journey reads as one flow, graded by
|
|
360
|
+
* `driveFlowStatus`: failed only on a check that came back no.
|
|
361
|
+
*/
|
|
362
|
+
function harnessRunFrom(by, actions, deps) {
|
|
363
|
+
const input = driveRunFrom(actions, {
|
|
364
|
+
...deps,
|
|
365
|
+
runId: harnessRunId(by.harness) ?? defaultRunId(),
|
|
366
|
+
});
|
|
367
|
+
if (input === undefined)
|
|
368
|
+
return undefined;
|
|
369
|
+
// The driver's own wrong guess about where a click goes is not a failed check of the app; nor is
|
|
370
|
+
// its second press of a control whose claim already held (Save again on a field the app emptied).
|
|
371
|
+
const refOf = new Map(actions.map((a) => [a.actionId, asString(asRecord(a.args)['ref'])]));
|
|
372
|
+
const heldBefore = new Set();
|
|
373
|
+
const checks = input.checks.map((check) => {
|
|
374
|
+
const ref = check.actionId === undefined ? undefined : refOf.get(check.actionId);
|
|
375
|
+
const key = ref === undefined ? undefined : `${ref}|${check.predicate}`;
|
|
376
|
+
const repress = Verified.NO === check.status && key !== undefined && heldBefore.has(key);
|
|
377
|
+
if (Verified.YES === check.status && key !== undefined)
|
|
378
|
+
heldBefore.add(key);
|
|
379
|
+
return Verified.NO === check.status && (repress || claimsOnlyRoute(check.predicate, check.kind))
|
|
380
|
+
? { ...check, status: Verified.UNKNOWN, reason: VerifiedReason.INCONCLUSIVE }
|
|
381
|
+
: check;
|
|
382
|
+
});
|
|
383
|
+
// A passive check that read too early is not counted: the one rule (superseded-checks.ts).
|
|
384
|
+
const superseded = supersededChecks(input.checks.map((c) => ({
|
|
385
|
+
key: c.predicate,
|
|
386
|
+
passive: false === c.declaredBeforeActing,
|
|
387
|
+
held: Verified.YES === c.status,
|
|
388
|
+
failed: Verified.NO === c.status,
|
|
389
|
+
})));
|
|
390
|
+
const count = (verified) => checks.filter((check, at) => verified === check.status && !superseded.has(at)).length;
|
|
391
|
+
const status = driveFlowStatus({
|
|
392
|
+
held: count(Verified.YES),
|
|
393
|
+
failed: count(Verified.NO),
|
|
394
|
+
goalMet: goalsMissed.get(by.harness),
|
|
395
|
+
});
|
|
396
|
+
const first = actions.reduce((min, action) => Math.min(min, action.at), Number.MAX_SAFE_INTEGER);
|
|
397
|
+
const durationMs = spans.get(by.harness) ?? Math.max(0, input.durationMs - first);
|
|
398
|
+
return {
|
|
399
|
+
...input,
|
|
400
|
+
checks,
|
|
401
|
+
...(disparities.has(by.harness) ? { disparity: [...(disparities.get(by.harness) ?? [])] } : {}),
|
|
402
|
+
durationMs,
|
|
403
|
+
agent: { id: harnessAgentId(by.driver), kind: RunAgentKind.CODING_AGENT },
|
|
404
|
+
trigger: {
|
|
405
|
+
kind: RunTrigger.EDIT,
|
|
406
|
+
note: `driven by the Harness${by.persona === undefined ? '' : `: ${by.persona}`}`,
|
|
407
|
+
},
|
|
408
|
+
flows: [
|
|
409
|
+
{
|
|
410
|
+
name: by.persona ?? UNNAMED_JOURNEY,
|
|
411
|
+
status,
|
|
412
|
+
steps: actions.length,
|
|
413
|
+
durationMs,
|
|
414
|
+
},
|
|
415
|
+
],
|
|
134
416
|
};
|
|
135
417
|
}
|
|
418
|
+
/**
|
|
419
|
+
* Every run a session's journal holds: the connected agent's drive, and one per Harness drive.
|
|
420
|
+
*
|
|
421
|
+
* They used to be one. A Harness drive dispatches through the same tools in the same tab, so its
|
|
422
|
+
* verdicts folded into the agent's run, and the dashboard showed one blended row that credited the
|
|
423
|
+
* agent with what the Harness proved and named neither.
|
|
424
|
+
*/
|
|
425
|
+
export function driveRunsFrom(actions, deps) {
|
|
426
|
+
const own = agentsOwn(actions);
|
|
427
|
+
// Each agent session in the tab is its own run: cut at the ends `reticle_session {end}` recorded.
|
|
428
|
+
const cuts = [0, ...(deps.agentEnds ?? []).map((n) => Math.min(n, own.length)), own.length];
|
|
429
|
+
const sessions = cuts.slice(1).map((to, i) => driveRunFrom(own.slice(cuts[i] ?? 0, to), {
|
|
430
|
+
...deps,
|
|
431
|
+
runId: segmentRunId(deps.runId, i),
|
|
432
|
+
agentClaim: deps.agentClaims?.[i],
|
|
433
|
+
}));
|
|
434
|
+
const drives = new Map();
|
|
435
|
+
for (const action of actions) {
|
|
436
|
+
const by = action.drivenBy;
|
|
437
|
+
if (by === undefined)
|
|
438
|
+
continue;
|
|
439
|
+
const held = drives.get(by.harness) ?? { by, actions: [] };
|
|
440
|
+
held.actions.push(action);
|
|
441
|
+
drives.set(by.harness, held);
|
|
442
|
+
}
|
|
443
|
+
return [
|
|
444
|
+
...sessions,
|
|
445
|
+
...[...drives.values()].map((drive) => harnessRunFrom(drive.by, drive.actions, deps)),
|
|
446
|
+
].filter((run) => run !== undefined);
|
|
447
|
+
}
|
|
@@ -46,7 +46,7 @@ function deviationHeadline(deviation) {
|
|
|
46
46
|
return undefined;
|
|
47
47
|
}
|
|
48
48
|
export function buildRepairPacket(replay) {
|
|
49
|
-
if (replay.status === ReplayStatus.OK)
|
|
49
|
+
if (replay.status === ReplayStatus.OK || replay.status === ReplayStatus.UNVERIFIABLE)
|
|
50
50
|
return undefined;
|
|
51
51
|
const decision = replay.decision;
|
|
52
52
|
const baseActual = decision?.whatChanged ?? replay.error?.message ?? 'the flow failed';
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type JournalAction } from '@reticlehq/core';
|
|
2
|
+
import type { ToolDeps } from '../../surface/tools/tool-kit.js';
|
|
3
|
+
/** The primer, short form. The full one lives in the agent's rules file (CLAUDE.md / AGENTS.md). */
|
|
4
|
+
export declare const RESUME_PRIMER: readonly string[];
|
|
5
|
+
export interface ResumeFacts {
|
|
6
|
+
actions: readonly JournalAction[];
|
|
7
|
+
/** Intents the ledger still owes (statements). */
|
|
8
|
+
openIntents: readonly string[];
|
|
9
|
+
/** The user's request as declared with reticle_intent, if one is current. */
|
|
10
|
+
request?: string | undefined;
|
|
11
|
+
/** The tab this was about, and where it is now. */
|
|
12
|
+
sessionId?: string | undefined;
|
|
13
|
+
route?: string | undefined;
|
|
14
|
+
/** The cursor to observe from. */
|
|
15
|
+
cursor?: number | undefined;
|
|
16
|
+
/** What this app's notes say (hints for targeting; never evidence). */
|
|
17
|
+
notes: readonly string[];
|
|
18
|
+
}
|
|
19
|
+
/** Each claim's LATEST verdict, in the order the claims were first made. */
|
|
20
|
+
export declare function latestVerdicts(actions: readonly JournalAction[]): {
|
|
21
|
+
claim: string;
|
|
22
|
+
verified: string;
|
|
23
|
+
observed?: string;
|
|
24
|
+
}[];
|
|
25
|
+
/** The resume block, as lines. */
|
|
26
|
+
export declare function resumeLines(facts: ResumeFacts): string[];
|
|
27
|
+
/** The session whose action ledger was written most recently, if any. */
|
|
28
|
+
export declare function newestSessionId(root: string): string | undefined;
|
|
29
|
+
/** The user's request, when one was declared recently enough to be this session's. */
|
|
30
|
+
export declare function recentRequest(root: string, now: number): string | undefined;
|
|
31
|
+
/**
|
|
32
|
+
* Everything the resume block needs, read from disk — no daemon, which is what a SessionStart hook
|
|
33
|
+
* has the moment after a compaction. The caller supplies the journal reader: the MCP tool holds the
|
|
34
|
+
* live journal, the CLI reads the newest session's ledger.
|
|
35
|
+
*/
|
|
36
|
+
export declare function resumeFromDisk(input: {
|
|
37
|
+
root: string;
|
|
38
|
+
now: number;
|
|
39
|
+
fs: ToolDeps['fs'];
|
|
40
|
+
readActions: (sessionId: string) => Promise<readonly JournalAction[]>;
|
|
41
|
+
sessionId?: string | undefined;
|
|
42
|
+
route?: string | undefined;
|
|
43
|
+
cursor?: number | undefined;
|
|
44
|
+
}): Promise<string[]>;
|