@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
|
@@ -10,6 +10,12 @@ import type { ToolDeps } from '../../surface/tools/tool-kit.js';
|
|
|
10
10
|
* is a false accusation rather than an error.
|
|
11
11
|
*/
|
|
12
12
|
export declare function openSessionIntents(deps: ToolDeps, sessionId: string | undefined): Promise<Intent[]>;
|
|
13
|
+
/**
|
|
14
|
+
* A reader of the same ledger, its root resolved NOW. For a verdict drawn after its tab may have
|
|
15
|
+
* left: a checkout click that takes the page to another origin closes the session, and resolving the
|
|
16
|
+
* root then refused the whole call with "names no session" instead of grading what was seen.
|
|
17
|
+
*/
|
|
18
|
+
export declare function ledgerFor(deps: ToolDeps, sessionId: string | undefined): () => Promise<Intent[]>;
|
|
13
19
|
/**
|
|
14
20
|
* EVERY intent in the ledger, proved ones included — the denominator the open list is a subset of.
|
|
15
21
|
*
|
|
@@ -10,7 +10,16 @@ import { sessionRoot } from '../project/session-root.js';
|
|
|
10
10
|
* is a false accusation rather than an error.
|
|
11
11
|
*/
|
|
12
12
|
export async function openSessionIntents(deps, sessionId) {
|
|
13
|
-
return
|
|
13
|
+
return ledgerFor(deps, sessionId)();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A reader of the same ledger, its root resolved NOW. For a verdict drawn after its tab may have
|
|
17
|
+
* left: a checkout click that takes the page to another origin closes the session, and resolving the
|
|
18
|
+
* root then refused the whole call with "names no session" instead of grading what was seen.
|
|
19
|
+
*/
|
|
20
|
+
export function ledgerFor(deps, sessionId) {
|
|
21
|
+
const root = sessionRoot(deps, sessionId);
|
|
22
|
+
return () => new IntentStore(deps.fs, root, { now: deps.now }).open();
|
|
14
23
|
}
|
|
15
24
|
/**
|
|
16
25
|
* EVERY intent in the ledger, proved ones included — the denominator the open list is a subset of.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IntentShardStore } from './intent-shard-store.js';
|
|
2
|
+
import { IntentStatus } from './intent-shard.js';
|
|
3
|
+
/**
|
|
4
|
+
* One settled disagreement: the words kept, the words set aside, and who chose — or, with no words
|
|
5
|
+
* set aside, the status the team settled on the kept words.
|
|
6
|
+
*/
|
|
7
|
+
export interface SettledWords {
|
|
8
|
+
kept: string;
|
|
9
|
+
setAside?: string;
|
|
10
|
+
by?: string;
|
|
11
|
+
status?: IntentStatus;
|
|
12
|
+
/** The file the platform holds for the kept words; a record re-sent without it erased it there. */
|
|
13
|
+
file?: string;
|
|
14
|
+
}
|
|
15
|
+
/** The settled disagreements in the platform's memory entries, read defensively. */
|
|
16
|
+
export declare function settledWordsIn(entries: readonly unknown[]): SettledWords[];
|
|
17
|
+
/** Apply them to the local records; returns how many records changed. */
|
|
18
|
+
export declare function applySettledWords(store: IntentShardStore, settled: readonly SettledWords[]): Promise<number>;
|
|
19
|
+
/**
|
|
20
|
+
* The agent's recorded request, with each statement a decision set aside replaced by the words kept:
|
|
21
|
+
* a run reports it as "What was asked", and the run that proved the kept words showed the rejected
|
|
22
|
+
* ones as its goal. Never throws; no request, nothing to change.
|
|
23
|
+
*/
|
|
24
|
+
export declare function keptWordsInRequest(path: string, settled: readonly SettledWords[]): Promise<void>;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decisions made on the dashboard, brought down to the record of the person whose words were set
|
|
3
|
+
* aside.
|
|
4
|
+
*
|
|
5
|
+
* A maintainer settled a disagreement by keeping the team's words; the author's own record still
|
|
6
|
+
* said hers, agreed, and her daemon re-sent it every minute, so the same decision was made three
|
|
7
|
+
* times. The platform returns each memory entry with the decisions taken on it; a local record
|
|
8
|
+
* whose statement one of them set aside takes the words that were kept, and says who decided.
|
|
9
|
+
*/
|
|
10
|
+
import { readFile, writeFile } from 'node:fs/promises';
|
|
11
|
+
import { asRecord, asString } from '@reticlehq/core';
|
|
12
|
+
import { IntentStatus } from './intent-shard.js';
|
|
13
|
+
/** How settled each status is; a record is only ever raised along it, never lowered. */
|
|
14
|
+
const RANK = {
|
|
15
|
+
[IntentStatus.PROPOSED]: 0,
|
|
16
|
+
[IntentStatus.AGREED]: 1,
|
|
17
|
+
[IntentStatus.PROVED]: 2,
|
|
18
|
+
[IntentStatus.STALE]: 1,
|
|
19
|
+
};
|
|
20
|
+
/** A status the platform settled, read defensively; proposed settles nothing. */
|
|
21
|
+
const settledStatus = (value) => [IntentStatus.AGREED, IntentStatus.PROVED, IntentStatus.STALE].find((s) => s === value);
|
|
22
|
+
const str = (value) => {
|
|
23
|
+
const text = asString(value);
|
|
24
|
+
return text === undefined || 0 === text.length ? undefined : text;
|
|
25
|
+
};
|
|
26
|
+
/** The settled disagreements in the platform's memory entries, read defensively. */
|
|
27
|
+
export function settledWordsIn(entries) {
|
|
28
|
+
return entries.flatMap((raw) => {
|
|
29
|
+
const entry = asRecord(raw);
|
|
30
|
+
const kept = str(entry['statement']);
|
|
31
|
+
const decisions = entry['decisions'];
|
|
32
|
+
const status = settledStatus(entry['status']);
|
|
33
|
+
const file = str(entry['sourceFile']);
|
|
34
|
+
if (kept === undefined)
|
|
35
|
+
return [];
|
|
36
|
+
const settled = status === undefined ? [] : [{ kept, status }];
|
|
37
|
+
if (!Array.isArray(decisions))
|
|
38
|
+
return settled;
|
|
39
|
+
return decisions
|
|
40
|
+
.flatMap((d) => {
|
|
41
|
+
const setAside = str(asRecord(asRecord(d)['setAside'])['statement']);
|
|
42
|
+
const by = str(asRecord(d)['byEmail']);
|
|
43
|
+
return setAside === undefined || setAside === kept
|
|
44
|
+
? []
|
|
45
|
+
: [
|
|
46
|
+
{
|
|
47
|
+
kept,
|
|
48
|
+
setAside,
|
|
49
|
+
...(by === undefined ? {} : { by }),
|
|
50
|
+
...(file === undefined ? {} : { file }),
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
})
|
|
54
|
+
.concat(settled);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/** Where the record's words now come from. */
|
|
58
|
+
const decidedBy = (by) => `decided on the dashboard${by === undefined ? '' : ` by ${by}`}`;
|
|
59
|
+
/** Apply them to the local records; returns how many records changed. */
|
|
60
|
+
export async function applySettledWords(store, settled) {
|
|
61
|
+
if (0 === settled.length)
|
|
62
|
+
return 0;
|
|
63
|
+
let changed = 0;
|
|
64
|
+
for (const record of await store.all()) {
|
|
65
|
+
// The team settled these very words: the record takes that status, so this machine never
|
|
66
|
+
// re-sends them as proposed and undoes the decision. Raised only, never lowered.
|
|
67
|
+
const status = settled.find((s) => s.status !== undefined && s.kept === record.statement)?.status;
|
|
68
|
+
if (status !== undefined && RANK[status] > RANK[record.status]) {
|
|
69
|
+
const raised = await store.upsert(record.id, (existing) => existing, {
|
|
70
|
+
status,
|
|
71
|
+
source: decidedBy(undefined),
|
|
72
|
+
});
|
|
73
|
+
if (raised?.status === status)
|
|
74
|
+
changed += 1;
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
const decision = settled.find((s) => s.setAside === record.statement);
|
|
78
|
+
if (decision === undefined)
|
|
79
|
+
continue;
|
|
80
|
+
const next = await store.upsert(record.id, (existing) =>
|
|
81
|
+
// The check bound to the words set aside proves nothing about the words kept.
|
|
82
|
+
existing === undefined
|
|
83
|
+
? undefined
|
|
84
|
+
: {
|
|
85
|
+
...withoutBinding(existing),
|
|
86
|
+
statement: decision.kept,
|
|
87
|
+
// The files were the set-aside words'; the kept words carry the platform's.
|
|
88
|
+
surface: {
|
|
89
|
+
...existing.surface,
|
|
90
|
+
files: decision.file === undefined ? [] : [decision.file],
|
|
91
|
+
},
|
|
92
|
+
}, { source: decidedBy(decision.by) });
|
|
93
|
+
if (next?.statement === decision.kept)
|
|
94
|
+
changed += 1;
|
|
95
|
+
}
|
|
96
|
+
return changed;
|
|
97
|
+
}
|
|
98
|
+
/** A record with its bound check taken off: the words it was bound to were set aside. */
|
|
99
|
+
function withoutBinding(record) {
|
|
100
|
+
const { binding: _dropped, ...rest } = record;
|
|
101
|
+
return rest;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* The agent's recorded request, with each statement a decision set aside replaced by the words kept:
|
|
105
|
+
* a run reports it as "What was asked", and the run that proved the kept words showed the rejected
|
|
106
|
+
* ones as its goal. Never throws; no request, nothing to change.
|
|
107
|
+
*/
|
|
108
|
+
export async function keptWordsInRequest(path, settled) {
|
|
109
|
+
const decided = settled.filter((s) => s.setAside !== undefined);
|
|
110
|
+
if (0 === decided.length)
|
|
111
|
+
return;
|
|
112
|
+
try {
|
|
113
|
+
const raw = JSON.parse(await readFile(path, 'utf8'));
|
|
114
|
+
const statements = Array.isArray(raw['statements']) ? raw['statements'] : [];
|
|
115
|
+
let changed = false;
|
|
116
|
+
const next = statements.map((s) => {
|
|
117
|
+
const statement = asRecord(s);
|
|
118
|
+
const kept = decided.find((d) => d.setAside === statement['text'])?.kept;
|
|
119
|
+
if (kept === undefined)
|
|
120
|
+
return s;
|
|
121
|
+
changed = true;
|
|
122
|
+
return { ...statement, text: kept };
|
|
123
|
+
});
|
|
124
|
+
if (changed)
|
|
125
|
+
await writeFile(path, `${JSON.stringify({ ...raw, statements: next }, null, 2)}\n`);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
// No request recorded, or one this cannot read: nothing to correct.
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -19,6 +19,8 @@ export interface TapeStep {
|
|
|
19
19
|
endPage?: string;
|
|
20
20
|
/** The intent the agent declared on this action. The first one names the journey. */
|
|
21
21
|
intent?: string;
|
|
22
|
+
/** Recorder-internal: network mocks were active when it ran (#1459). Never written to disk. */
|
|
23
|
+
mocked?: true;
|
|
22
24
|
}
|
|
23
25
|
/** The compiled shape a flow store accepts. Structural, for the same reason as `TapeStep`. */
|
|
24
26
|
export interface DriveProgram {
|
|
@@ -56,6 +58,13 @@ export declare const DRIVE_FLOW_PREFIX = "drive-";
|
|
|
56
58
|
* see FlowStore.saveJourney.
|
|
57
59
|
*/
|
|
58
60
|
export declare function driveFlowName(route?: string, steps?: readonly TapeStep[]): FlowName;
|
|
61
|
+
/** Why session end saved no flow, as reported on the `flow_recorded` step. */
|
|
62
|
+
export declare const DriveFlowSkipReason: {
|
|
63
|
+
/** The drive declared no consequence, so a saved flow could never go red. */
|
|
64
|
+
readonly NO_DECLARED_CONSEQUENCE: "no_declared_consequence";
|
|
65
|
+
/** What it proved rested on network mocks the flow would not carry (#1459). */
|
|
66
|
+
readonly DRIVEN_UNDER_NETWORK_MOCKS: "driven_under_network_mocks";
|
|
67
|
+
};
|
|
59
68
|
export interface DriveFlowOutcome {
|
|
60
69
|
/** The flows that were written — one per journey the session contained. */
|
|
61
70
|
readonly saved?: readonly string[];
|
|
@@ -68,6 +77,13 @@ export interface DriveFlowOutcome {
|
|
|
68
77
|
* "the agent drove and proved nothing" stays visible instead of looking like nothing happened.
|
|
69
78
|
*/
|
|
70
79
|
readonly unprovenSteps?: number;
|
|
80
|
+
/**
|
|
81
|
+
* Steps of journeys that proved something and were NOT saved because they ran while network
|
|
82
|
+
* mocks were active (#1459). Such a journey replays against the real backend, so it either fails
|
|
83
|
+
* for a reason unrelated to the change or passes on data the original check never saw, and the
|
|
84
|
+
* flow file holds no trace of the precondition. Counted, so "not saved" has a reason.
|
|
85
|
+
*/
|
|
86
|
+
readonly mockedSteps?: number;
|
|
71
87
|
}
|
|
72
88
|
/** A flow per journey, so two journeys in one session are two regression tests rather than one. */
|
|
73
89
|
export declare function driveFlowsFrom(tape: {
|
|
@@ -87,6 +87,13 @@ export function driveFlowName(route, steps = []) {
|
|
|
87
87
|
const parts = [lead, ...('' !== why || 0 === leg.length ? [] : [leg])].filter((p) => '' !== p);
|
|
88
88
|
return asFlowName(`${DRIVE_FLOW_PREFIX}${0 === parts.length ? 'journey' : parts.join('-')}`);
|
|
89
89
|
}
|
|
90
|
+
/** Why session end saved no flow, as reported on the `flow_recorded` step. */
|
|
91
|
+
export const DriveFlowSkipReason = {
|
|
92
|
+
/** The drive declared no consequence, so a saved flow could never go red. */
|
|
93
|
+
NO_DECLARED_CONSEQUENCE: 'no_declared_consequence',
|
|
94
|
+
/** What it proved rested on network mocks the flow would not carry (#1459). */
|
|
95
|
+
DRIVEN_UNDER_NETWORK_MOCKS: 'driven_under_network_mocks',
|
|
96
|
+
};
|
|
90
97
|
/**
|
|
91
98
|
* Turn this session's ambient tape into a flow, when it is worth one.
|
|
92
99
|
*
|
|
@@ -143,24 +150,48 @@ function typesASecret(step) {
|
|
|
143
150
|
const field = QueryBy.TESTID === by ? step.args['value'] : step.args['name'];
|
|
144
151
|
return 'string' === typeof field && defaultIsSensitiveKey(field);
|
|
145
152
|
}
|
|
153
|
+
/**
|
|
154
|
+
* The tape without the attempts an agent made again. An action that declared nothing, followed at
|
|
155
|
+
* once by the same action on the same control that did, is a retry: saved, the flow clicked sign-in
|
|
156
|
+
* twice, the second click found no form, and every replay of it failed. A step repeated with the
|
|
157
|
+
* same declaration both times (a double submit on purpose) is two steps, and stays two.
|
|
158
|
+
*/
|
|
159
|
+
function withoutRetries(steps) {
|
|
160
|
+
return steps.filter((step, i) => {
|
|
161
|
+
const next = steps[i + 1];
|
|
162
|
+
if (next === undefined || step.expect !== undefined || next.expect === undefined)
|
|
163
|
+
return true;
|
|
164
|
+
// Tried again where it was tried: a page later it is a step of the journey, not a retry.
|
|
165
|
+
if (step.route !== next.route || step.page !== next.page || step.mocked !== next.mocked)
|
|
166
|
+
return true;
|
|
167
|
+
const { expect: _declared, ...again } = next.args;
|
|
168
|
+
const { expect: _none, ...first } = step.args;
|
|
169
|
+
return step.tool !== next.tool || JSON.stringify(first) !== JSON.stringify(again);
|
|
170
|
+
});
|
|
171
|
+
}
|
|
146
172
|
/** A flow per journey, so two journeys in one session are two regression tests rather than one. */
|
|
147
173
|
export function driveFlowsFrom(tape) {
|
|
148
174
|
if (tape === undefined || 0 === tape.steps.length)
|
|
149
175
|
return { programs: [], outcome: {} };
|
|
150
176
|
const programs = [];
|
|
151
177
|
let unproven = 0;
|
|
152
|
-
|
|
178
|
+
let mocked = 0;
|
|
179
|
+
for (const segment of segmentsByRoute(withoutRetries(tape.steps))) {
|
|
153
180
|
if (!carriesAnAssertion(segment.steps)) {
|
|
154
181
|
unproven += segment.steps.length;
|
|
155
182
|
continue;
|
|
156
183
|
}
|
|
184
|
+
if (segment.steps.some((step) => true === step.mocked)) {
|
|
185
|
+
mocked += segment.steps.length;
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
157
188
|
const startPath = segment.route ?? tape.startPath;
|
|
158
189
|
programs.push({
|
|
159
190
|
name: driveFlowName(startPath, segment.steps),
|
|
160
191
|
version: REPLAY_PROGRAM_VERSION,
|
|
161
192
|
// The route is recorder-internal and has no business on disk — `startPath` is where the
|
|
162
193
|
// on-disk flow says the same thing, in the field replay actually reads.
|
|
163
|
-
steps: segment.steps.map(({ route: _route, ...step }) => step),
|
|
194
|
+
steps: segment.steps.map(({ route: _route, mocked: _mocked, ...step }) => step),
|
|
164
195
|
...(startPath === undefined ? {} : { startPath }),
|
|
165
196
|
});
|
|
166
197
|
}
|
|
@@ -169,6 +200,7 @@ export function driveFlowsFrom(tape) {
|
|
|
169
200
|
outcome: {
|
|
170
201
|
...(0 === programs.length ? {} : { saved: programs.map((p) => p.name) }),
|
|
171
202
|
...(0 === unproven ? {} : { unprovenSteps: unproven }),
|
|
203
|
+
...(0 === mocked ? {} : { mockedSteps: mocked }),
|
|
172
204
|
},
|
|
173
205
|
};
|
|
174
206
|
}
|
|
@@ -26,6 +26,8 @@ export interface FlushableSession {
|
|
|
26
26
|
export interface DriveRunFlushDeps<S extends FlushableSession> {
|
|
27
27
|
/** Find the live session a verdict came from, or undefined when it has already gone. */
|
|
28
28
|
resolve: (sessionId: string) => S | undefined;
|
|
29
|
+
/** Every live session: a Harness note rewrites them all, since it does not say which tab drove. */
|
|
30
|
+
all?: () => readonly S[];
|
|
29
31
|
/** Write this session's run artifact. The same call teardown makes. */
|
|
30
32
|
write: (session: S) => Promise<void>;
|
|
31
33
|
/** Injected so the test does not wait three real seconds. */
|
|
@@ -20,8 +20,9 @@
|
|
|
20
20
|
* the last verdicts of a session are the ones somebody is waiting on.
|
|
21
21
|
*/
|
|
22
22
|
import { HookEvent } from '@reticlehq/core/hooks';
|
|
23
|
-
import { onHook } from '../../hooks/hook-bus.js';
|
|
23
|
+
import { onHook, onPendingWrites } from '../../hooks/hook-bus.js';
|
|
24
24
|
import { log } from '../../log.js';
|
|
25
|
+
import { onHarnessNoted } from '../../judgement/runs/drive-run.js';
|
|
25
26
|
/** Long enough to collapse a burst of verdicts, short enough that a human reads it as "live". */
|
|
26
27
|
const FLUSH_DEBOUNCE_MS = 3_000;
|
|
27
28
|
/**
|
|
@@ -55,10 +56,7 @@ export function attachDriveRunFlush(deps) {
|
|
|
55
56
|
log(`drive run flush failed: ${message}`);
|
|
56
57
|
}
|
|
57
58
|
};
|
|
58
|
-
const
|
|
59
|
-
const sessionId = 'sessionId' in payload ? payload.sessionId : undefined;
|
|
60
|
-
if (sessionId === undefined)
|
|
61
|
-
return;
|
|
59
|
+
const schedule = (sessionId) => {
|
|
62
60
|
const existing = pending.get(sessionId);
|
|
63
61
|
if (existing !== undefined)
|
|
64
62
|
clearTimeout(existing);
|
|
@@ -69,11 +67,28 @@ export function attachDriveRunFlush(deps) {
|
|
|
69
67
|
// obligation, and holding the process open for it would make `reticle` feel broken on exit.
|
|
70
68
|
timer.unref?.();
|
|
71
69
|
pending.set(sessionId, timer);
|
|
70
|
+
};
|
|
71
|
+
const off = onHook(HookEvent.VERDICT, (payload) => {
|
|
72
|
+
const sessionId = 'sessionId' in payload ? payload.sessionId : undefined;
|
|
73
|
+
if (sessionId !== undefined)
|
|
74
|
+
schedule(sessionId);
|
|
72
75
|
});
|
|
76
|
+
// A Harness drive is graded after its last verdict: rewrite the runs so the grade reaches them.
|
|
77
|
+
// ponytail: every live session, since a note names a drive, not a tab; drives end rarely.
|
|
78
|
+
const offNoted = onHarnessNoted(() => {
|
|
79
|
+
for (const session of deps.all?.() ?? [])
|
|
80
|
+
schedule(session.id);
|
|
81
|
+
});
|
|
82
|
+
const flushAll = async () => {
|
|
83
|
+
await Promise.all([...pending.keys()].map(flush));
|
|
84
|
+
};
|
|
85
|
+
const unregister = onPendingWrites(flushAll);
|
|
73
86
|
return {
|
|
74
87
|
flushNow: flush,
|
|
75
88
|
stop: () => {
|
|
76
89
|
off();
|
|
90
|
+
unregister();
|
|
91
|
+
offNoted();
|
|
77
92
|
for (const timer of pending.values())
|
|
78
93
|
clearTimeout(timer);
|
|
79
94
|
pending.clear();
|
|
@@ -113,13 +113,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
113
113
|
m2: number;
|
|
114
114
|
max: number;
|
|
115
115
|
};
|
|
116
|
-
|
|
116
|
+
consoleErrors: {
|
|
117
117
|
count: number;
|
|
118
118
|
mean: number;
|
|
119
119
|
m2: number;
|
|
120
120
|
max: number;
|
|
121
121
|
};
|
|
122
|
-
|
|
122
|
+
netErrors: {
|
|
123
123
|
count: number;
|
|
124
124
|
mean: number;
|
|
125
125
|
m2: number;
|
|
@@ -138,13 +138,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
138
138
|
m2: number;
|
|
139
139
|
max: number;
|
|
140
140
|
};
|
|
141
|
-
|
|
141
|
+
consoleErrors: {
|
|
142
142
|
count: number;
|
|
143
143
|
mean: number;
|
|
144
144
|
m2: number;
|
|
145
145
|
max: number;
|
|
146
146
|
};
|
|
147
|
-
|
|
147
|
+
netErrors: {
|
|
148
148
|
count: number;
|
|
149
149
|
mean: number;
|
|
150
150
|
m2: number;
|
|
@@ -167,13 +167,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
167
167
|
m2: number;
|
|
168
168
|
max: number;
|
|
169
169
|
};
|
|
170
|
-
|
|
170
|
+
consoleErrors: {
|
|
171
171
|
count: number;
|
|
172
172
|
mean: number;
|
|
173
173
|
m2: number;
|
|
174
174
|
max: number;
|
|
175
175
|
};
|
|
176
|
-
|
|
176
|
+
netErrors: {
|
|
177
177
|
count: number;
|
|
178
178
|
mean: number;
|
|
179
179
|
m2: number;
|
|
@@ -196,13 +196,13 @@ export declare const RouteEnvelopeSchema: z.ZodObject<{
|
|
|
196
196
|
m2: number;
|
|
197
197
|
max: number;
|
|
198
198
|
};
|
|
199
|
-
|
|
199
|
+
consoleErrors: {
|
|
200
200
|
count: number;
|
|
201
201
|
mean: number;
|
|
202
202
|
m2: number;
|
|
203
203
|
max: number;
|
|
204
204
|
};
|
|
205
|
-
|
|
205
|
+
netErrors: {
|
|
206
206
|
count: number;
|
|
207
207
|
mean: number;
|
|
208
208
|
m2: number;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { EventAttribution, JOURNAL_FILE_VERSION, } from '@reticlehq/core';
|
|
1
|
+
import { ActionType, EventAttribution, REDACTED_VALUE, JOURNAL_FILE_VERSION, } from '@reticlehq/core';
|
|
2
2
|
import { isSelfObservation } from './self-observation.js';
|
|
3
|
+
import { currentDrivenBy } from '../../hooks/driven-by.js';
|
|
4
|
+
import { callerClientName } from '../../hooks/coding-agents.js';
|
|
3
5
|
import { log } from '../../log.js';
|
|
4
6
|
/**
|
|
5
7
|
* Logged the FIRST time a journal write is lost, and never again for that recorder.
|
|
@@ -12,6 +14,36 @@ import { log } from '../../log.js';
|
|
|
12
14
|
* produce one line per batch.
|
|
13
15
|
*/
|
|
14
16
|
const JOURNAL_WRITE_LOST = 'journal_write_lost';
|
|
17
|
+
/** The actions whose arguments carry what was typed. */
|
|
18
|
+
const TYPING_ACTIONS = new Set([ActionType.FILL, ActionType.TYPE]);
|
|
19
|
+
const TYPED_KEYS = ['value', 'text'];
|
|
20
|
+
/**
|
|
21
|
+
* The arguments as the journal keeps them: every typed value replaced, at any depth (a sequence's
|
|
22
|
+
* steps too). A fill's arguments kept a typed password in clear in `actions.jsonl`; the page cannot
|
|
23
|
+
* tell the daemon which field was secret before the call is written, and nothing reads a typed value
|
|
24
|
+
* back from the journal — the run fold reads the ref, the target and the action — so none is kept.
|
|
25
|
+
*/
|
|
26
|
+
function withoutTypedInput(args) {
|
|
27
|
+
if (Array.isArray(args))
|
|
28
|
+
return args.map(withoutTypedInput);
|
|
29
|
+
if ('object' !== typeof args || null === args)
|
|
30
|
+
return args;
|
|
31
|
+
const record = args;
|
|
32
|
+
const typing = TYPING_ACTIONS.has(String(record['action']));
|
|
33
|
+
const out = {};
|
|
34
|
+
for (const [key, value] of Object.entries(record)) {
|
|
35
|
+
const typed = typing && TYPED_KEYS.includes(key) && 'string' === typeof value;
|
|
36
|
+
out[key] = typed ? REDACTED_VALUE : withoutTypedInput(value);
|
|
37
|
+
}
|
|
38
|
+
if (typing && 'object' === typeof record['args'] && null !== record['args']) {
|
|
39
|
+
const inner = { ...record['args'] };
|
|
40
|
+
for (const key of TYPED_KEYS)
|
|
41
|
+
if ('string' === typeof inner[key])
|
|
42
|
+
inner[key] = REDACTED_VALUE;
|
|
43
|
+
out['args'] = inner;
|
|
44
|
+
}
|
|
45
|
+
return out;
|
|
46
|
+
}
|
|
15
47
|
const DEFAULT_FLUSH_AT = 64;
|
|
16
48
|
/**
|
|
17
49
|
* Owns action-window attribution and batched, order-preserving journaling — the durable half of the
|
|
@@ -65,7 +97,14 @@ export class JournalRecorder {
|
|
|
65
97
|
}
|
|
66
98
|
/** Open an attribution window. One action is active at a time (the agent drives sequentially). */
|
|
67
99
|
beginAction(actionId, tool, args) {
|
|
68
|
-
this.#active = {
|
|
100
|
+
this.#active = {
|
|
101
|
+
actionId,
|
|
102
|
+
tool,
|
|
103
|
+
args: withoutTypedInput(args),
|
|
104
|
+
tStart: this.#now(),
|
|
105
|
+
drivenBy: currentDrivenBy(),
|
|
106
|
+
agent: callerClientName(),
|
|
107
|
+
};
|
|
69
108
|
}
|
|
70
109
|
/** Close the active window: persist its buffered events, then the action record. No-op if none active. */
|
|
71
110
|
finishAction(effect, settled, settledInMs) {
|
|
@@ -86,6 +125,8 @@ export class JournalRecorder {
|
|
|
86
125
|
: { from: active.seqFrom, to: active.seqTo },
|
|
87
126
|
tRange: { from: active.tStart, to: this.#now() },
|
|
88
127
|
at: active.tStart,
|
|
128
|
+
...(active.drivenBy === undefined ? {} : { drivenBy: active.drivenBy }),
|
|
129
|
+
...(active.agent === undefined ? {} : { agent: active.agent }),
|
|
89
130
|
};
|
|
90
131
|
this.#enqueueFlush();
|
|
91
132
|
this.#chain = this.#chain
|
|
@@ -115,7 +156,7 @@ export class JournalRecorder {
|
|
|
115
156
|
v: JOURNAL_FILE_VERSION,
|
|
116
157
|
actionId,
|
|
117
158
|
tool,
|
|
118
|
-
args,
|
|
159
|
+
args: withoutTypedInput(args),
|
|
119
160
|
effect,
|
|
120
161
|
// No window was opened, so no event carries this id: `seqRange` is omitted rather than
|
|
121
162
|
// invented, because any range here would claim an attribution that never happened. `tRange` is
|
|
@@ -123,6 +164,14 @@ export class JournalRecorder {
|
|
|
123
164
|
// of zero, which is exactly how much time this action attributed events over.
|
|
124
165
|
tRange: { from: at, to: at },
|
|
125
166
|
at,
|
|
167
|
+
...(() => {
|
|
168
|
+
const by = currentDrivenBy();
|
|
169
|
+
return by === undefined ? {} : { drivenBy: by };
|
|
170
|
+
})(),
|
|
171
|
+
...(() => {
|
|
172
|
+
const agent = callerClientName();
|
|
173
|
+
return agent === undefined ? {} : { agent };
|
|
174
|
+
})(),
|
|
126
175
|
};
|
|
127
176
|
this.#enqueueFlush();
|
|
128
177
|
this.#chain = this.#chain
|
|
@@ -11,6 +11,13 @@ export declare const DEFAULT_DIFF_RETENTION = 10;
|
|
|
11
11
|
* for the one case where delivery was refused and somebody has to file the report by hand.
|
|
12
12
|
*/
|
|
13
13
|
export declare const DEFAULT_FEEDBACK_RETENTION = 20;
|
|
14
|
+
/** Harness plans kept on disk: the platform keeps every one, this machine the recent ones. */
|
|
15
|
+
export declare const DEFAULT_PLAN_RETENTION = 50;
|
|
16
|
+
/**
|
|
17
|
+
* Keep the step screenshots of at most this many runs. A run's are looked at while it is fresh, or
|
|
18
|
+
* on the platform it was synced to; the byte budget below is what bounds a single long one.
|
|
19
|
+
*/
|
|
20
|
+
export declare const DEFAULT_STEP_SHOT_RUN_RETENTION = 50;
|
|
14
21
|
/**
|
|
15
22
|
* The TOTAL the evidence tier of one `.reticle/` may occupy, across sessions, runs, overlay diffs
|
|
16
23
|
* and feedback copies together.
|
|
@@ -141,5 +148,6 @@ export declare function pruneEvidenceBudget(fs: FileSystemPort, root: string, bu
|
|
|
141
148
|
* Capped from here rather than from the writer, which lives in an area this file does not own. A
|
|
142
149
|
* retention rule is the same rule whether the directory holds journals, diffs or reports.
|
|
143
150
|
*/
|
|
151
|
+
export declare function prunePlans(fs: FileSystemPort, root: string, retention?: number): Promise<void>;
|
|
144
152
|
export declare function pruneFeedback(fs: FileSystemPort, root: string, retention?: number): Promise<void>;
|
|
145
153
|
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { basename, join } from 'node:path';
|
|
2
|
-
import { ReticleDir } from '@reticlehq/core';
|
|
2
|
+
import { ReticleDir, STEP_SCREENSHOT } from '@reticlehq/core';
|
|
3
3
|
import { reticleDirPaths, visualDir } from '../../project/dir/reticle-dir.js';
|
|
4
4
|
import { EVIDENCE_DIRS } from './workspace-tiers.js';
|
|
5
5
|
/** Keep at most this many session journals on disk; older ones are pruned by recency. */
|
|
@@ -14,6 +14,13 @@ export const DEFAULT_DIFF_RETENTION = 10;
|
|
|
14
14
|
* for the one case where delivery was refused and somebody has to file the report by hand.
|
|
15
15
|
*/
|
|
16
16
|
export const DEFAULT_FEEDBACK_RETENTION = 20;
|
|
17
|
+
/** Harness plans kept on disk: the platform keeps every one, this machine the recent ones. */
|
|
18
|
+
export const DEFAULT_PLAN_RETENTION = 50;
|
|
19
|
+
/**
|
|
20
|
+
* Keep the step screenshots of at most this many runs. A run's are looked at while it is fresh, or
|
|
21
|
+
* on the platform it was synced to; the byte budget below is what bounds a single long one.
|
|
22
|
+
*/
|
|
23
|
+
export const DEFAULT_STEP_SHOT_RUN_RETENTION = 50;
|
|
17
24
|
const DIFF_SUFFIX = '.diff.png';
|
|
18
25
|
const PNG_SUFFIX = '.png';
|
|
19
26
|
/**
|
|
@@ -171,7 +178,12 @@ export async function pruneVisualDiffs(fs, root, retention = DEFAULT_DIFF_RETENT
|
|
|
171
178
|
for (const dir of await visualDirs(fs, root)) {
|
|
172
179
|
await pruneByRecency(fs, dir, retention, isDiff);
|
|
173
180
|
}
|
|
181
|
+
// Step screenshots are evidence of one run each, read in the minutes after it or synced with it;
|
|
182
|
+
// the oldest runs' directories go whole.
|
|
183
|
+
await pruneByRecency(fs, stepShotRunsDir(root), DEFAULT_STEP_SHOT_RUN_RETENTION);
|
|
174
184
|
}
|
|
185
|
+
/** `visual/runs/`, the parent of every run's step screenshots. */
|
|
186
|
+
const stepShotRunsDir = (root) => join(root, ReticleDir.VISUAL_SUBDIR, STEP_SCREENSHOT.RUNS_DIR);
|
|
175
187
|
/** `visual/` plus its per-runtime subdirectories. Empty when nothing has been captured yet. */
|
|
176
188
|
async function visualDirs(fs, root) {
|
|
177
189
|
const top = visualDir(root);
|
|
@@ -179,7 +191,8 @@ async function visualDirs(fs, root) {
|
|
|
179
191
|
try {
|
|
180
192
|
// A per-runtime subdirectory is anything here that is not itself a PNG.
|
|
181
193
|
for (const entry of await fs.readdir(top)) {
|
|
182
|
-
|
|
194
|
+
// `runs/` holds step screenshots, not baselines, and is bounded on its own.
|
|
195
|
+
if (!entry.endsWith(PNG_SUFFIX) && STEP_SCREENSHOT.RUNS_DIR !== entry)
|
|
183
196
|
dirs.push(join(top, entry));
|
|
184
197
|
}
|
|
185
198
|
}
|
|
@@ -228,6 +241,20 @@ async function collectEvidence(fs, root) {
|
|
|
228
241
|
for (const under of EVIDENCE_DIRS) {
|
|
229
242
|
const isVisual = ReticleDir.VISUAL_SUBDIR === under;
|
|
230
243
|
const dirs = isVisual ? await visualDirs(fs, root) : [join(root, under)];
|
|
244
|
+
// Each run's step screenshots are one evidence entry, evicted whole, oldest first.
|
|
245
|
+
if (isVisual) {
|
|
246
|
+
const runs = stepShotRunsDir(root);
|
|
247
|
+
for (const name of await fs.readdir(runs).catch(() => [])) {
|
|
248
|
+
const path = join(runs, name);
|
|
249
|
+
try {
|
|
250
|
+
const { mtimeMs } = await fs.stat(path);
|
|
251
|
+
entries.push({ path, under, sizeBytes: await sizeOf(fs, path), mtimeMs });
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
/* unreadable entry — skip */
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
231
258
|
for (const dir of dirs) {
|
|
232
259
|
let names;
|
|
233
260
|
try {
|
|
@@ -287,6 +314,9 @@ export async function pruneEvidenceBudget(fs, root, budgetBytes = DEFAULT_EVIDEN
|
|
|
287
314
|
* Capped from here rather than from the writer, which lives in an area this file does not own. A
|
|
288
315
|
* retention rule is the same rule whether the directory holds journals, diffs or reports.
|
|
289
316
|
*/
|
|
317
|
+
export async function prunePlans(fs, root, retention = DEFAULT_PLAN_RETENTION) {
|
|
318
|
+
await pruneByRecency(fs, join(root, ReticleDir.PLANS_SUBDIR), retention);
|
|
319
|
+
}
|
|
290
320
|
export async function pruneFeedback(fs, root, retention = DEFAULT_FEEDBACK_RETENTION) {
|
|
291
321
|
await pruneByRecency(fs, join(root, ReticleDir.FEEDBACK_SUBDIR), retention);
|
|
292
322
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { pruneEvidenceBudget, pruneFeedback, pruneSessions, pruneVisualDiffs, } from './retention.js';
|
|
1
|
+
import { pruneEvidenceBudget, pruneFeedback, prunePlans, pruneSessions, pruneVisualDiffs, } from './retention.js';
|
|
2
2
|
import { DEFAULT_RETAIN } from './retain-policy.js';
|
|
3
3
|
export async function pruneWorkspace(fs, root, live, options = {}) {
|
|
4
4
|
const retain = { ...DEFAULT_RETAIN, ...options };
|
|
@@ -9,6 +9,8 @@ export async function pruneWorkspace(fs, root, live, options = {}) {
|
|
|
9
9
|
await pruneVisualDiffs(fs, root, retain.visual);
|
|
10
10
|
// Write-only local copies of reports the outbox already carries.
|
|
11
11
|
await pruneFeedback(fs, root, retain.feedback);
|
|
12
|
+
// The recent plans are what somebody reads back; the platform holds every one.
|
|
13
|
+
await prunePlans(fs, root);
|
|
12
14
|
// LAST, and the one that was missing: the only bound that limits SIZE rather than count.
|
|
13
15
|
await pruneEvidenceBudget(fs, root, retain.budgetBytes, live);
|
|
14
16
|
}
|
|
@@ -45,6 +45,8 @@ export const WORKSPACE_TIERS = {
|
|
|
45
45
|
[ReticleDir.VISUAL_SUBDIR]: localDir,
|
|
46
46
|
// Write-only: a local copy of what was already sent. The outbox is the record.
|
|
47
47
|
[ReticleDir.FEEDBACK_SUBDIR]: localDir,
|
|
48
|
+
// What the Harness planned on this machine, and how it went. The platform keeps the team's copy.
|
|
49
|
+
[ReticleDir.PLANS_SUBDIR]: localDir,
|
|
48
50
|
[ReticleDir.PROJECT_FILE]: localFile,
|
|
49
51
|
[ReticleDir.AMBIENT_FILE]: localFile,
|
|
50
52
|
[ReticleDir.ENVELOPES_FILE]: localFile,
|
|
@@ -52,6 +54,13 @@ export const WORKSPACE_TIERS = {
|
|
|
52
54
|
// What THIS machine's drives covered, and the best each level reached — the gate's ratchet.
|
|
53
55
|
[ReticleDir.COVERAGE_FILE]: localFile,
|
|
54
56
|
[ReticleDir.TIERS_FILE]: localFile,
|
|
57
|
+
// The user's request in their own words: it leaves only with `shareRequests`, never by git push.
|
|
58
|
+
[ReticleDir.REQUEST_FILE]: localFile,
|
|
59
|
+
// How to target this app, learned from corrected failures: a teammate's agent needs it too.
|
|
60
|
+
[ReticleDir.APP_NOTES_FILE]: sharedFile,
|
|
61
|
+
[ReticleDir.PLATFORM_MOMENTS_FILE]: localFile,
|
|
62
|
+
// Notes a human pinned in the HUD: free text about the page. The team reads them on the platform.
|
|
63
|
+
[ReticleDir.NOTES_FILE]: localFile,
|
|
55
64
|
// The user's own record of what Reticle did for them, on THIS machine.
|
|
56
65
|
[ReticleDir.IMPACT_FILE]: localFile,
|
|
57
66
|
// This machine's conversation with the server. Its own doc comment says why committing it is
|
|
@@ -72,10 +81,6 @@ export const WORKSPACE_TIERS = {
|
|
|
72
81
|
// credential, so it is safe to commit — the same reasoning that puts `cloud.json` here while its
|
|
73
82
|
// API key stays in ~/.reticle.
|
|
74
83
|
[ReticleDir.HOOKS_FILE]: sharedFile,
|
|
75
|
-
// What a drive types into each labelled field. Committed for two reasons: a replay must send
|
|
76
|
-
// exactly what the recording sent or it is not a replay, and a value a model wrote once should be
|
|
77
|
-
// reviewable and editable by the team rather than regenerated differently on every machine.
|
|
78
|
-
[ReticleDir.FILL_VALUES_FILE]: sharedFile,
|
|
79
84
|
};
|
|
80
85
|
function namesWhere(match) {
|
|
81
86
|
return Object.entries(WORKSPACE_TIERS)
|