@reticlehq/server 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/SKILL.md +123 -116
- package/dist/chromium-launch-options.d.ts +3 -1
- package/dist/chromium-launch-options.js +2 -1
- package/dist/command/cli/adhoc-suite.d.ts +14 -0
- package/dist/command/cli/adhoc-suite.js +42 -7
- package/dist/command/cli/adhoc-verdict.d.ts +19 -2
- package/dist/command/cli/adhoc-verdict.js +76 -9
- package/dist/command/cli/answers/gate-exit.d.ts +23 -0
- package/dist/command/cli/answers/gate-exit.js +45 -0
- package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
- package/dist/command/cli/answers/gate-hook-message.js +3 -1
- package/dist/command/cli/answers/open-note.d.ts +2 -0
- package/dist/command/cli/answers/open-note.js +22 -0
- package/dist/command/cli/auth/device-flow.d.ts +13 -2
- package/dist/command/cli/auth/device-flow.js +17 -0
- package/dist/command/cli/cli-doctor.js +14 -0
- package/dist/command/cli/cli-flow-commands.d.ts +0 -11
- package/dist/command/cli/cli-flow-commands.js +31 -112
- package/dist/command/cli/cli-kill.js +3 -2
- package/dist/command/cli/cli-parse-grammar.d.ts +24 -0
- package/dist/command/cli/cli-parse-grammar.js +75 -0
- package/dist/command/cli/cli-parse-verify.d.ts +2 -0
- package/dist/command/cli/cli-parse-verify.js +18 -0
- package/dist/command/cli/cli-parse.d.ts +19 -28
- package/dist/command/cli/cli-parse.js +82 -182
- package/dist/command/cli/cli-update-commands.d.ts +1 -1
- package/dist/command/cli/cli-update-commands.js +61 -9
- package/dist/command/cli/cli-usage.d.ts +33 -0
- package/dist/command/cli/cli-usage.js +287 -0
- package/dist/command/cli/cli-verify.d.ts +35 -5
- package/dist/command/cli/cli-verify.js +114 -35
- package/dist/command/cli/cloud-cli.d.ts +13 -0
- package/dist/command/cli/cloud-cli.js +192 -341
- package/dist/command/cli/cloud-kit.d.ts +12 -0
- package/dist/command/cli/cloud-kit.js +41 -2
- package/dist/command/cli/cloud-link.d.ts +57 -0
- package/dist/command/cli/cloud-link.js +308 -0
- package/dist/command/cli/cloud-login.d.ts +22 -0
- package/dist/command/cli/cloud-login.js +96 -8
- package/dist/command/cli/context-command.d.ts +1 -0
- package/dist/command/cli/context-command.js +33 -0
- package/dist/command/cli/daemon-start-options.d.ts +3 -0
- package/dist/command/cli/daemon-start-options.js +24 -3
- package/dist/command/cli/doctor/browser/chromium-hint.d.ts +46 -0
- package/dist/command/cli/doctor/browser/chromium-hint.js +99 -1
- package/dist/command/cli/doctor/doctor-coverage-line.d.ts +2 -0
- package/dist/command/cli/doctor/doctor-coverage-line.js +47 -0
- package/dist/command/cli/doctor/doctor-project-line.d.ts +0 -12
- package/dist/command/cli/doctor/doctor-project-line.js +5 -4
- package/dist/command/cli/doctor/doctor-rows.d.ts +6 -0
- package/dist/command/cli/doctor/doctor-rows.js +6 -0
- package/dist/command/cli/doctor/doctor-signing-line.d.ts +38 -0
- package/dist/command/cli/doctor/doctor-signing-line.js +114 -0
- package/dist/command/cli/drive/drive-attach.d.ts +27 -2
- package/dist/command/cli/drive/drive-attach.js +71 -4
- package/dist/command/cli/drive/drive-command.d.ts +2 -1
- package/dist/command/cli/drive/drive-command.js +13 -7
- package/dist/command/cli/known-regression.d.ts +13 -0
- package/dist/command/cli/known-regression.js +34 -0
- package/dist/command/cli/launch/sdk-version-match.d.ts +12 -0
- package/dist/command/cli/launch/sdk-version-match.js +25 -0
- package/dist/command/cli/lifecycle/daemon-lifecycle.js +15 -3
- package/dist/command/cli/mcp-command.d.ts +6 -0
- package/dist/command/cli/mcp-command.js +13 -5
- package/dist/command/cli/ports/port-holder.d.ts +10 -0
- package/dist/command/cli/ports/port-holder.js +25 -1
- package/dist/command/cli/project-name.d.ts +29 -1
- package/dist/command/cli/project-name.js +107 -2
- package/dist/command/cli/setup-mcp-cli.d.ts +17 -1
- package/dist/command/cli/setup-mcp-cli.js +35 -12
- package/dist/command/cli/status/status-lines.d.ts +1 -0
- package/dist/command/cli/status/status-lines.js +47 -2
- package/dist/command/cli/status/workspace-links.d.ts +10 -0
- package/dist/command/cli/status/workspace-links.js +29 -0
- package/dist/command/cli/try-command.d.ts +96 -0
- package/dist/command/cli/try-command.js +362 -0
- package/dist/command/cli/tutorial.d.ts +0 -100
- package/dist/command/cli/tutorial.js +0 -181
- package/dist/command/cli/verify-results.d.ts +19 -0
- package/dist/command/cli/verify-results.js +29 -0
- package/dist/command/cli-onboarding.d.ts +0 -11
- package/dist/command/cli-onboarding.js +0 -15
- package/dist/command/cli.d.ts +20 -0
- package/dist/command/cli.js +130 -104
- package/dist/command/daemon/binding/daemon-status-probe.d.ts +2 -0
- package/dist/command/daemon/binding/daemon-status-probe.js +1 -0
- package/dist/command/daemon/daemon-resilience.js +4 -4
- package/dist/command/daemon/daemon-resolve.d.ts +23 -1
- package/dist/command/daemon/daemon-resolve.js +79 -9
- package/dist/command/setup/agent-writer.d.ts +1 -1
- package/dist/command/setup/agent-writer.js +3 -2
- package/dist/command/setup/bringup/bridge-port.d.ts +3 -1
- package/dist/command/setup/bringup/bridge-port.js +13 -3
- package/dist/command/setup/bringup/connect-lease.d.ts +1 -0
- package/dist/command/setup/bringup/connect-lease.js +1 -0
- package/dist/command/setup/bringup/dev-server-log-cap.js +2 -0
- package/dist/command/setup/bringup/dev-server-wait.d.ts +8 -0
- package/dist/command/setup/bringup/dev-server-wait.js +19 -0
- package/dist/command/setup/bringup/ensure-daemon.js +9 -2
- package/dist/command/setup/init/agent-restart.d.ts +23 -0
- package/dist/command/setup/init/agent-restart.js +28 -0
- package/dist/command/setup/init/init-port.d.ts +14 -1
- package/dist/command/setup/init/init-port.js +32 -2
- package/dist/command/setup/init/init-runtime.d.ts +22 -2
- package/dist/command/setup/init/init-runtime.js +114 -38
- package/dist/command/setup/node-effects.d.ts +2 -0
- package/dist/command/setup/node-effects.js +38 -9
- package/dist/command/setup/probe/existing-app.d.ts +12 -0
- package/dist/command/setup/probe/existing-app.js +14 -0
- package/dist/command/setup/remaining-steps.js +2 -1
- package/dist/command/setup/run-setup.d.ts +34 -9
- package/dist/command/setup/run-setup.js +65 -51
- package/dist/command/setup/setup-command.d.ts +25 -1
- package/dist/command/setup/setup-command.js +59 -4
- package/dist/command/setup/setup-mcp.js +25 -2
- package/dist/command/setup/tauri-signing.d.ts +19 -0
- package/dist/command/setup/tauri-signing.js +79 -0
- package/dist/command/setup/terminal/listeners.d.ts +10 -1
- package/dist/command/setup/terminal/listeners.js +37 -6
- package/dist/command/update/update-nudge.d.ts +9 -0
- package/dist/command/update/update-nudge.js +1 -1
- package/dist/command/update/updater.js +11 -15
- package/dist/command/version/version-nudge.js +3 -0
- package/dist/command/version/version-skew.d.ts +20 -1
- package/dist/command/version/version-skew.js +49 -4
- package/dist/features/crawl/crawl-tools.js +4 -0
- package/dist/features/crawl/crawl.d.ts +6 -0
- package/dist/features/crawl/crawl.js +23 -2
- package/dist/features/exhaust/ledger.d.ts +21 -14
- package/dist/features/exhaust/ledger.js +35 -9
- package/dist/features/harness/app-findings.d.ts +2 -0
- package/dist/features/harness/app-findings.js +52 -0
- package/dist/features/harness/drive-report.d.ts +61 -1
- package/dist/features/harness/drive-report.js +394 -26
- package/dist/features/harness/drive-runs.d.ts +120 -0
- package/dist/features/harness/drive-runs.js +289 -0
- package/dist/features/harness/drivers.d.ts +10 -14
- package/dist/features/harness/drivers.js +10 -14
- package/dist/features/harness/explore/console-pages.d.ts +15 -0
- package/dist/features/harness/explore/console-pages.js +146 -0
- package/dist/features/harness/explore/disparity.d.ts +19 -0
- package/dist/features/harness/explore/disparity.js +71 -0
- package/dist/features/harness/explore/fake-app.d.ts +16 -0
- package/dist/features/harness/explore/fake-app.js +49 -0
- package/dist/features/harness/explore/goal-search.d.ts +26 -0
- package/dist/features/harness/explore/goal-search.js +144 -0
- package/dist/features/harness/explore/page-tree.d.ts +49 -0
- package/dist/features/harness/explore/page-tree.js +148 -0
- package/dist/features/harness/explore/site-map.d.ts +34 -0
- package/dist/features/harness/explore/site-map.js +150 -0
- package/dist/features/harness/fill-values.d.ts +3 -73
- package/dist/features/harness/fill-values.js +3 -169
- package/dist/features/harness/goals.d.ts +82 -0
- package/dist/features/harness/goals.js +330 -0
- package/dist/features/harness/harness.d.ts +51 -1
- package/dist/features/harness/harness.js +207 -6
- package/dist/features/harness/platform/drive-target.d.ts +30 -0
- package/dist/features/harness/platform/drive-target.js +81 -0
- package/dist/features/harness/platform/local-apps.d.ts +127 -0
- package/dist/features/harness/platform/local-apps.js +280 -0
- package/dist/features/harness/platform/persona-credentials.d.ts +20 -0
- package/dist/features/harness/platform/persona-credentials.js +69 -0
- package/dist/features/harness/platform/platform-drives.d.ts +61 -0
- package/dist/features/harness/platform/platform-drives.js +114 -0
- package/dist/features/harness/platform/refusal.d.ts +52 -0
- package/dist/features/harness/platform/refusal.js +71 -0
- package/dist/features/harness/platform/remote-drive.d.ts +186 -0
- package/dist/features/harness/platform/remote-drive.js +378 -0
- package/dist/features/harness/platform/script.d.ts +94 -0
- package/dist/features/harness/platform/script.js +260 -0
- package/dist/features/harness/platform/server-driver.d.ts +54 -0
- package/dist/features/harness/platform/server-driver.js +182 -0
- package/dist/features/harness/platform-config.d.ts +41 -1
- package/dist/features/harness/platform-config.js +106 -9
- package/dist/features/harness/route-guess.d.ts +13 -0
- package/dist/features/harness/route-guess.js +49 -0
- package/dist/features/harness/script/app-controls.d.ts +5 -0
- package/dist/features/harness/script/app-controls.js +40 -0
- package/dist/features/harness/script/lane-ids.d.ts +14 -0
- package/dist/features/harness/script/lane-ids.js +16 -0
- package/dist/features/harness/script/script-run.d.ts +70 -0
- package/dist/features/harness/script/script-run.js +606 -0
- package/dist/features/license/license.d.ts +2 -2
- package/dist/features/visual/step-shots.d.ts +31 -0
- package/dist/features/visual/step-shots.js +231 -0
- package/dist/features/visual/visual-tools.d.ts +10 -1
- package/dist/features/visual/visual-tools.js +62 -17
- package/dist/hooks/client-directory.d.ts +18 -0
- package/dist/hooks/client-directory.js +57 -0
- package/dist/hooks/coding-agents.d.ts +34 -0
- package/dist/hooks/coding-agents.js +117 -0
- package/dist/hooks/driven-by.d.ts +23 -0
- package/dist/hooks/driven-by.js +56 -0
- package/dist/hooks/hook-bus.d.ts +4 -0
- package/dist/hooks/hook-bus.js +18 -0
- package/dist/hooks/hook-commands.js +15 -4
- package/dist/hooks/tool-log.d.ts +9 -0
- package/dist/hooks/tool-log.js +29 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +80 -243
- package/dist/judgement/capsule/capsule-store.d.ts +2 -2
- package/dist/judgement/capsule/causal-summary.d.ts +15 -1
- package/dist/judgement/capsule/causal-summary.js +33 -0
- package/dist/judgement/runs/artifact/build-verification-run.d.ts +1 -1
- package/dist/judgement/runs/artifact/build-verification-run.js +25 -3
- package/dist/judgement/runs/artifact/gap-summary.d.ts +0 -18
- package/dist/judgement/runs/artifact/gap-summary.js +12 -3
- package/dist/judgement/runs/artifact/replay-mapping.d.ts +1 -1
- package/dist/judgement/runs/artifact/replay-mapping.js +37 -11
- package/dist/judgement/runs/artifact/run-store.d.ts +14 -2
- package/dist/judgement/runs/artifact/run-store.js +195 -3
- package/dist/judgement/runs/context-tools.js +59 -1
- package/dist/judgement/runs/default-run-id.d.ts +3 -0
- package/dist/judgement/runs/default-run-id.js +16 -0
- package/dist/judgement/runs/drive-run.d.ts +71 -1
- package/dist/judgement/runs/drive-run.js +317 -5
- package/dist/judgement/runs/repair-prompt.js +1 -1
- package/dist/judgement/runs/resume.d.ts +44 -0
- package/dist/judgement/runs/resume.js +137 -0
- package/dist/judgement/runs/reticle-runner.js +13 -3
- package/dist/judgement/runs/runner-port.d.ts +5 -1
- package/dist/judgement/runs/runner-port.js +8 -2
- package/dist/judgement/runs/verification-sync.d.ts +5 -2
- package/dist/judgement/runs/verification-sync.js +40 -18
- package/dist/language/flows/change/gate.d.ts +10 -0
- package/dist/language/flows/change/gate.js +22 -0
- package/dist/language/flows/decision.js +36 -1
- package/dist/language/flows/fields/flow-secret-field.d.ts +12 -0
- package/dist/language/flows/fields/flow-secret-field.js +25 -2
- package/dist/language/flows/flow-anchor.d.ts +61 -10
- package/dist/language/flows/flow-anchor.js +98 -6
- package/dist/language/flows/flow-cross-step.d.ts +15 -0
- package/dist/language/flows/flow-cross-step.js +21 -0
- package/dist/language/flows/flow-intent.d.ts +1 -0
- package/dist/language/flows/flow-journey.d.ts +6 -0
- package/dist/language/flows/flow-journey.js +20 -0
- package/dist/language/flows/flow-learning.d.ts +4 -0
- package/dist/language/flows/flow-learning.js +45 -14
- package/dist/language/flows/flow-mutate-tools.js +5 -3
- package/dist/language/flows/flow-replay-run.d.ts +23 -9
- package/dist/language/flows/flow-replay-run.js +115 -110
- package/dist/language/flows/flow-replay-types.d.ts +1 -1
- package/dist/language/flows/flow-replay.d.ts +40 -1
- package/dist/language/flows/flow-replay.js +110 -22
- package/dist/language/flows/flow-result.d.ts +22 -1
- package/dist/language/flows/flow-result.js +47 -2
- package/dist/language/flows/flow-scope.js +5 -1
- package/dist/language/flows/flow-step-runners.d.ts +22 -2
- package/dist/language/flows/flow-step-runners.js +247 -47
- package/dist/language/flows/flow-store-for-session.d.ts +2 -2
- package/dist/language/flows/flow-store-for-session.js +7 -3
- package/dist/language/flows/flow-tools.d.ts +10 -0
- package/dist/language/flows/flow-tools.js +112 -89
- package/dist/language/flows/flows.d.ts +16 -1
- package/dist/language/flows/flows.js +74 -12
- package/dist/language/flows/heal-run.js +6 -4
- package/dist/language/flows/narrow-write.d.ts +7 -0
- package/dist/language/flows/narrow-write.js +36 -1
- package/dist/language/flows/recording/flake.d.ts +2 -2
- package/dist/language/flows/recording/recording-backtrack.js +14 -1
- package/dist/language/flows/recording/tape/recordings.d.ts +58 -4
- package/dist/language/flows/recording/tape/recordings.js +95 -13
- package/dist/language/flows/replay-from-hud.d.ts +20 -0
- package/dist/language/flows/replay-from-hud.js +51 -0
- package/dist/language/flows/replay.d.ts +9 -5
- package/dist/language/flows/replay.js +56 -15
- package/dist/language/flows/single-replay.d.ts +7 -0
- package/dist/language/flows/single-replay.js +26 -0
- package/dist/language/flows/suite/suite-flakes.js +2 -0
- package/dist/language/flows/suite-selection.d.ts +2 -15
- package/dist/language/flows/suite-selection.js +4 -3
- package/dist/language/flows/verify-change-tools.d.ts +1 -0
- package/dist/language/flows/verify-change-tools.js +202 -191
- package/dist/launch-chromium.d.ts +27 -5
- package/dist/launch-chromium.js +38 -8
- package/dist/memory/cloud/cloud-config.d.ts +22 -1
- package/dist/memory/cloud/cloud-config.js +34 -5
- package/dist/memory/cloud/cloud-sync.d.ts +17 -14
- package/dist/memory/cloud/cloud-sync.js +15 -4
- package/dist/memory/cloud/harness-config.d.ts +75 -1
- package/dist/memory/cloud/harness-config.js +115 -24
- package/dist/memory/cloud/hud-notices-source.d.ts +21 -0
- package/dist/memory/cloud/hud-notices-source.js +128 -0
- package/dist/memory/cloud/memory-scope.d.ts +161 -0
- package/dist/memory/cloud/memory-scope.js +227 -0
- package/dist/memory/cloud/sync-cycle.d.ts +44 -7
- package/dist/memory/cloud/sync-cycle.js +129 -15
- package/dist/memory/cloud/sync-daemon.d.ts +11 -0
- package/dist/memory/cloud/sync-daemon.js +121 -9
- package/dist/memory/cloud/sync-disk.d.ts +1 -1
- package/dist/memory/cloud/sync-disk.js +31 -10
- package/dist/memory/cloud/sync-screenshots.d.ts +32 -0
- package/dist/memory/cloud/sync-screenshots.js +105 -0
- package/dist/memory/cloud/unsynced-roots.d.ts +47 -0
- package/dist/memory/cloud/unsynced-roots.js +166 -0
- package/dist/memory/impact/account-watch.d.ts +34 -0
- package/dist/memory/impact/account-watch.js +59 -0
- package/dist/memory/impact/impact-recorder.d.ts +8 -0
- package/dist/memory/impact/impact-recorder.js +12 -2
- package/dist/memory/impact/impact-store.d.ts +17 -4
- package/dist/memory/impact/impact-store.js +169 -63
- package/dist/memory/intent/inline-intent.d.ts +1 -0
- package/dist/memory/intent/intent-shard-store.js +16 -4
- package/dist/memory/intent/intent-shard.d.ts +14 -2
- package/dist/memory/intent/intent-store.d.ts +1 -0
- package/dist/memory/intent/intent-tools.js +122 -4
- package/dist/memory/intent/open-intents.d.ts +6 -0
- package/dist/memory/intent/open-intents.js +10 -1
- package/dist/memory/intent/settled-words.d.ts +24 -0
- package/dist/memory/intent/settled-words.js +130 -0
- package/dist/memory/journal/drive-flow.d.ts +16 -0
- package/dist/memory/journal/drive-flow.js +34 -2
- package/dist/memory/journal/drive-run-flush.d.ts +2 -0
- package/dist/memory/journal/drive-run-flush.js +20 -5
- package/dist/memory/journal/envelope.d.ts +8 -8
- package/dist/memory/journal/journal-recorder.js +52 -3
- package/dist/memory/journal/on-disk/retention.d.ts +8 -0
- package/dist/memory/journal/on-disk/retention.js +32 -2
- package/dist/memory/journal/on-disk/startup-maintenance.js +3 -1
- package/dist/memory/journal/on-disk/workspace-tiers.js +9 -4
- package/dist/memory/journal/session-end.d.ts +15 -1
- package/dist/memory/journal/session-end.js +42 -9
- package/dist/memory/project/artifact-root-resolver.d.ts +26 -1
- package/dist/memory/project/artifact-root-resolver.js +125 -16
- package/dist/memory/project/artifact-root.d.ts +46 -8
- package/dist/memory/project/artifact-root.js +89 -10
- package/dist/memory/project/dir/reticle-dir.d.ts +18 -2
- package/dist/memory/project/dir/reticle-dir.js +26 -3
- package/dist/memory/project/link-directory.d.ts +15 -0
- package/dist/memory/project/link-directory.js +44 -0
- package/dist/memory/project/project-tools.js +22 -3
- package/dist/memory/project/root-claims.d.ts +6 -0
- package/dist/memory/project/root-claims.js +39 -0
- package/dist/memory/project/session-root.d.ts +26 -1
- package/dist/memory/project/session-root.js +49 -5
- package/dist/memory/project/sync-status.d.ts +85 -0
- package/dist/memory/project/sync-status.js +224 -0
- package/dist/memory/recall/memory-tools.js +47 -2
- package/dist/memory/recall/platform-memory.d.ts +34 -0
- package/dist/memory/recall/platform-memory.js +139 -0
- package/dist/memory/recall/project-memory.d.ts +19 -0
- package/dist/memory/recall/project-memory.js +80 -13
- package/dist/portal/bridge/bridge.d.ts +9 -3
- package/dist/portal/bridge/bridge.js +82 -22
- package/dist/portal/bridge/harness-request.d.ts +23 -0
- package/dist/portal/bridge/harness-request.js +27 -0
- package/dist/portal/bridge/pairing-token.d.ts +9 -0
- package/dist/portal/bridge/pairing-token.js +17 -0
- package/dist/portal/bridge/wrong-path.d.ts +17 -0
- package/dist/portal/bridge/wrong-path.js +35 -0
- package/dist/portal/input/network-mock-tools.js +11 -2
- package/dist/portal/input/real-input.d.ts +83 -10
- package/dist/portal/input/real-input.js +218 -30
- package/dist/portal/input/viewport-tools.js +3 -3
- package/dist/portal/pool/browser-pool.d.ts +70 -9
- package/dist/portal/pool/browser-pool.js +190 -37
- package/dist/portal/pool/context-permissions.d.ts +33 -0
- package/dist/portal/pool/context-permissions.js +33 -0
- package/dist/portal/pool/lease-marker-stamp.d.ts +23 -0
- package/dist/portal/pool/lease-marker-stamp.js +49 -0
- package/dist/portal/pool/playwright-launcher.d.ts +35 -0
- package/dist/portal/pool/playwright-launcher.js +64 -3
- package/dist/portal/pool/pool-contract.d.ts +28 -5
- package/dist/portal/session/agent-link.d.ts +8 -0
- package/dist/portal/session/agent-link.js +17 -0
- package/dist/portal/session/command-payload.d.ts +8 -0
- package/dist/portal/session/command-payload.js +24 -0
- package/dist/portal/session/daemon-answers.d.ts +3 -3
- package/dist/portal/session/daemon-answers.js +4 -2
- package/dist/portal/session/dev-server/dev-command.d.ts +21 -0
- package/dist/portal/session/dev-server/dev-command.js +87 -12
- package/dist/portal/session/facts/departure-note.d.ts +22 -0
- package/dist/portal/session/facts/departure-note.js +47 -0
- package/dist/portal/session/facts/observed-state.d.ts +16 -18
- package/dist/portal/session/facts/observed-state.js +46 -3
- package/dist/portal/session/facts/session-replaced.d.ts +5 -0
- package/dist/portal/session/facts/session-replaced.js +5 -0
- package/dist/portal/session/first-run-wiring.d.ts +42 -0
- package/dist/portal/session/first-run-wiring.js +132 -0
- package/dist/portal/session/human/live-control.d.ts +9 -2
- package/dist/portal/session/human/live-control.js +12 -3
- package/dist/portal/session/human/notes-ledger.d.ts +20 -0
- package/dist/portal/session/human/notes-ledger.js +55 -0
- package/dist/portal/session/human/review-store.d.ts +12 -0
- package/dist/portal/session/human/review-store.js +18 -10
- package/dist/portal/session/live-control-tools.d.ts +0 -13
- package/dist/portal/session/live-control-tools.js +107 -13
- package/dist/portal/session/narration-args.d.ts +5 -0
- package/dist/portal/session/narration-args.js +17 -0
- package/dist/portal/session/no-session-diagnosis.d.ts +8 -1
- package/dist/portal/session/no-session-diagnosis.js +46 -9
- package/dist/portal/session/no-session-next-action.d.ts +31 -0
- package/dist/portal/session/no-session-next-action.js +159 -60
- package/dist/portal/session/no-session-watch.d.ts +14 -1
- package/dist/portal/session/no-session-watch.js +227 -17
- package/dist/portal/session/presence/session-lease.js +1 -1
- package/dist/portal/session/presence/session-mirror.js +3 -0
- package/dist/portal/session/recorded-gaps.d.ts +97 -0
- package/dist/portal/session/recorded-gaps.js +251 -0
- package/dist/portal/session/serving-directory.d.ts +27 -0
- package/dist/portal/session/serving-directory.js +45 -0
- package/dist/portal/session/session-health.d.ts +18 -0
- package/dist/portal/session/session-health.js +9 -1
- package/dist/portal/session/session-info.d.ts +8 -1
- package/dist/portal/session/session-info.js +8 -1
- package/dist/portal/session/session-manager.d.ts +39 -0
- package/dist/portal/session/session-manager.js +98 -11
- package/dist/portal/session/session-reaper.js +4 -1
- package/dist/portal/session/session-successor.d.ts +13 -0
- package/dist/portal/session/session-successor.js +1 -1
- package/dist/portal/session/session-tools.js +26 -3
- package/dist/portal/session/session.d.ts +22 -30
- package/dist/portal/session/session.js +81 -79
- package/dist/portal/session/timing/command-timeout.js +25 -1
- package/dist/portal/session/timing/wall-clock.d.ts +1 -1
- package/dist/portal/session/timing/wall-clock.js +1 -1
- package/dist/portal/session/zero-install-first-call.d.ts +31 -0
- package/dist/portal/session/zero-install-first-call.js +88 -0
- package/dist/start-options.d.ts +12 -0
- package/dist/start-wiring.d.ts +63 -0
- package/dist/start-wiring.js +169 -0
- package/dist/status-payload.d.ts +23 -1
- package/dist/status-payload.js +36 -1
- package/dist/surface/http-server.js +18 -2
- package/dist/surface/mcp/attach-memory.d.ts +1 -0
- package/dist/surface/mcp/attach-memory.js +12 -1
- package/dist/surface/mcp/mcp-proxy.d.ts +9 -0
- package/dist/surface/mcp/mcp-proxy.js +65 -13
- package/dist/surface/mcp/mcp.d.ts +34 -6
- package/dist/surface/mcp/mcp.js +61 -17
- package/dist/surface/mcp/proxy/drive-calls.d.ts +10 -0
- package/dist/surface/mcp/proxy/drive-calls.js +27 -0
- package/dist/surface/mcp/proxy/mcp-post-transport.js +5 -0
- package/dist/surface/mcp/server-instructions.d.ts +4 -2
- package/dist/surface/mcp/server-instructions.js +32 -14
- package/dist/surface/mcp/shared-params.js +2 -2
- package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
- package/dist/surface/mcp/surface-vocabulary.js +1 -0
- package/dist/surface/tools/account-tool.d.ts +22 -0
- package/dist/surface/tools/account-tool.js +157 -0
- package/dist/surface/tools/act/act-danger.d.ts +11 -0
- package/dist/surface/tools/act/act-danger.js +38 -1
- package/dist/surface/tools/act/act-observation.d.ts +33 -0
- package/dist/surface/tools/act/act-observation.js +57 -0
- package/dist/surface/tools/act/act-preflight.js +25 -2
- package/dist/surface/tools/act/act-target.js +8 -3
- package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +8 -0
- package/dist/surface/tools/act/navigation/navigate-arrival.js +56 -2
- package/dist/surface/tools/act/resolve-target.d.ts +1 -1
- package/dist/surface/tools/act/resolve-target.js +18 -3
- package/dist/surface/tools/act/screen-request.d.ts +34 -0
- package/dist/surface/tools/act/screen-request.js +113 -0
- package/dist/surface/tools/act/sequence-grade.d.ts +8 -0
- package/dist/surface/tools/act/sequence-grade.js +13 -2
- package/dist/surface/tools/act/settle-in-flight.js +25 -3
- package/dist/surface/tools/act-sequence-tool.js +138 -29
- package/dist/surface/tools/act-tools.d.ts +0 -9
- package/dist/surface/tools/act-tools.js +71 -41
- package/dist/surface/tools/agent/app-notes-learning.d.ts +7 -0
- package/dist/surface/tools/agent/app-notes-learning.js +80 -0
- package/dist/surface/tools/agent/app-notes.d.ts +4 -0
- package/dist/surface/tools/agent/app-notes.js +48 -0
- package/dist/surface/tools/agent/build-staleness.d.ts +7 -0
- package/dist/surface/tools/agent/build-staleness.js +62 -0
- package/dist/surface/tools/agent/compact-envelope.d.ts +80 -0
- package/dist/surface/tools/agent/compact-envelope.js +374 -0
- package/dist/surface/tools/agent/for-the-agent.d.ts +12 -0
- package/dist/surface/tools/agent/for-the-agent.js +44 -0
- package/dist/surface/tools/agent/notices.d.ts +50 -0
- package/dist/surface/tools/agent/notices.js +152 -0
- package/dist/surface/tools/agent/reteach.d.ts +11 -0
- package/dist/surface/tools/agent/reteach.js +50 -0
- package/dist/surface/tools/args/alias-args.d.ts +5 -0
- package/dist/surface/tools/args/alias-args.js +10 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.d.ts +6 -0
- package/dist/surface/tools/args/confirm-dangerous-arg.js +6 -0
- package/dist/surface/tools/assert/assert-source.d.ts +15 -0
- package/dist/surface/tools/assert/assert-source.js +40 -0
- package/dist/surface/tools/assert/assert-verdict.d.ts +1 -1
- package/dist/surface/tools/assert/assert-verdict.js +42 -17
- package/dist/surface/tools/browser-tools.js +51 -2
- package/dist/surface/tools/chat-drives.d.ts +101 -0
- package/dist/surface/tools/chat-drives.js +409 -0
- package/dist/surface/tools/coverage-tools.d.ts +2 -10
- package/dist/surface/tools/coverage-tools.js +2 -53
- package/dist/surface/tools/dynamic-tools.js +29 -1
- package/dist/surface/tools/empty-session-list.d.ts +51 -0
- package/dist/surface/tools/empty-session-list.js +120 -0
- package/dist/surface/tools/error-recovery.d.ts +14 -0
- package/dist/surface/tools/error-recovery.js +105 -8
- package/dist/surface/tools/explore-tools.d.ts +31 -1
- package/dist/surface/tools/explore-tools.js +438 -66
- package/dist/surface/tools/feedback-tools.d.ts +2 -3
- package/dist/surface/tools/feedback-tools.js +18 -3
- package/dist/surface/tools/gap-novelty.d.ts +3 -1
- package/dist/surface/tools/gap-novelty.js +8 -1
- package/dist/surface/tools/harness-explore.d.ts +118 -57
- package/dist/surface/tools/harness-explore.js +344 -292
- package/dist/surface/tools/harness-gate.d.ts +88 -0
- package/dist/surface/tools/harness-gate.js +235 -0
- package/dist/surface/tools/harness-hunt.d.ts +43 -0
- package/dist/surface/tools/harness-hunt.js +215 -0
- package/dist/surface/tools/harness-plan.d.ts +17 -0
- package/dist/surface/tools/harness-plan.js +38 -0
- package/dist/surface/tools/harness-script.d.ts +30 -0
- package/dist/surface/tools/harness-script.js +560 -0
- package/dist/surface/tools/harness-tab-guard.d.ts +5 -0
- package/dist/surface/tools/harness-tab-guard.js +27 -0
- package/dist/surface/tools/harness-toolset.d.ts +22 -1
- package/dist/surface/tools/harness-toolset.js +101 -7
- package/dist/surface/tools/human-notes.d.ts +16 -0
- package/dist/surface/tools/human-notes.js +27 -0
- package/dist/surface/tools/invoke-tool.d.ts +5 -2
- package/dist/surface/tools/invoke-tool.js +263 -85
- package/dist/surface/tools/lease-hint.js +26 -5
- package/dist/surface/tools/lease-permissions.d.ts +33 -0
- package/dist/surface/tools/lease-permissions.js +73 -0
- package/dist/surface/tools/lease-readiness.d.ts +38 -0
- package/dist/surface/tools/lease-readiness.js +57 -0
- package/dist/surface/tools/lease-seed.d.ts +49 -0
- package/dist/surface/tools/lease-seed.js +167 -0
- package/dist/surface/tools/lease-tools.d.ts +13 -24
- package/dist/surface/tools/lease-tools.js +146 -197
- package/dist/surface/tools/live-call-text.js +4 -4
- package/dist/surface/tools/merge-tools.js +42 -2
- package/dist/surface/tools/merged-name-redirect.js +4 -0
- package/dist/surface/tools/next-step.d.ts +29 -0
- package/dist/surface/tools/next-step.js +214 -0
- package/dist/surface/tools/observe-tools.js +45 -9
- package/dist/surface/tools/platform-moment.d.ts +72 -0
- package/dist/surface/tools/platform-moment.js +296 -0
- package/dist/surface/tools/query-hint-schema.d.ts +7 -0
- package/dist/surface/tools/query-hint-schema.js +10 -0
- package/dist/surface/tools/read-tools.js +71 -14
- package/dist/surface/tools/real-input-attempt.js +96 -13
- package/dist/surface/tools/reticle-result.d.ts +120 -0
- package/dist/surface/tools/reticle-result.js +364 -0
- package/dist/surface/tools/tool-kit.d.ts +83 -3
- package/dist/surface/tools/tool-kit.js +77 -7
- package/dist/surface/tools/tools.js +43 -59
- package/dist/telemetry/account-envelope.d.ts +7 -0
- package/dist/telemetry/account-envelope.js +61 -0
- package/dist/telemetry/agent-client.d.ts +15 -0
- package/dist/telemetry/agent-client.js +57 -0
- package/dist/telemetry/app-instrumented.js +9 -2
- package/dist/telemetry/argument-shape.d.ts +7 -0
- package/dist/telemetry/argument-shape.js +86 -1
- package/dist/telemetry/automation-hint.d.ts +2 -3
- package/dist/telemetry/automation-hint.js +33 -8
- package/dist/telemetry/cli-telemetry.js +7 -2
- package/dist/telemetry/daemon-telemetry.js +3 -0
- package/dist/telemetry/error-fingerprint.d.ts +10 -1
- package/dist/telemetry/error-fingerprint.js +61 -5
- package/dist/telemetry/feedback-cli.d.ts +0 -13
- package/dist/telemetry/feedback-cli.js +0 -77
- package/dist/telemetry/feedback.d.ts +13 -0
- package/dist/telemetry/feedback.js +183 -17
- package/dist/telemetry/harness-run.d.ts +18 -0
- package/dist/telemetry/harness-run.js +80 -0
- package/dist/telemetry/hud-events.d.ts +16 -0
- package/dist/telemetry/hud-events.js +27 -0
- package/dist/telemetry/hud-metrics.d.ts +29 -6
- package/dist/telemetry/hud-metrics.js +116 -25
- package/dist/telemetry/init-telemetry.js +2 -2
- package/dist/telemetry/install-source.d.ts +13 -25
- package/dist/telemetry/install-source.js +44 -3
- package/dist/telemetry/mcp-connection.d.ts +0 -14
- package/dist/telemetry/mcp-connection.js +5 -1
- package/dist/telemetry/onboarding-firsts.d.ts +32 -0
- package/dist/telemetry/onboarding-firsts.js +81 -6
- package/dist/telemetry/platform-linked.d.ts +5 -0
- package/dist/telemetry/platform-linked.js +32 -0
- package/dist/telemetry/project-profile.js +5 -3
- package/dist/telemetry/proxy-telemetry.js +4 -1
- package/dist/telemetry/session-metrics.d.ts +15 -4
- package/dist/telemetry/session-metrics.js +88 -52
- package/dist/telemetry/telemetry.d.ts +38 -2
- package/dist/telemetry/telemetry.js +144 -34
- package/dist/telemetry/verification-of.d.ts +3 -1
- package/dist/telemetry/verification-of.js +13 -4
- package/dist/wire-journal.d.ts +2 -2
- package/dist/wire-journal.js +20 -6
- package/docs/README.md +3 -3
- package/docs/actions.mdx +6 -3
- package/docs/adapters.md +1 -1
- package/docs/agent-cheatsheet.md +25 -28
- package/docs/architecture.md +5 -5
- package/docs/autodrive.md +33 -28
- package/docs/benchmarks.md +5 -5
- package/docs/best-practices.mdx +27 -9
- package/docs/capabilities.mdx +14 -16
- package/docs/cli/affected.mdx +1 -1
- package/docs/cli/cloud.mdx +54 -75
- package/docs/cli/doctor.mdx +14 -3
- package/docs/cli/drive.mdx +20 -14
- package/docs/cli/feedback.mdx +3 -3
- package/docs/cli/gate.mdx +7 -2
- package/docs/cli/help.mdx +50 -55
- package/docs/cli/init.mdx +43 -28
- package/docs/cli/license.mdx +12 -8
- package/docs/cli/mcp.mdx +4 -4
- package/docs/cli/open.mdx +3 -3
- package/docs/cli/report.mdx +4 -2
- package/docs/cli/restart.mdx +2 -2
- package/docs/cli/rollback.mdx +14 -8
- package/docs/cli/serve.mdx +4 -4
- package/docs/cli/setup.mdx +23 -0
- package/docs/cli/status.mdx +18 -5
- package/docs/cli/stop.mdx +67 -8
- package/docs/cli/try.mdx +62 -0
- package/docs/cli/update.mdx +4 -3
- package/docs/cli/verify.mdx +17 -6
- package/docs/cli/version.mdx +5 -4
- package/docs/cli.mdx +111 -42
- package/docs/debugging.md +3 -3
- package/docs/deploy-checks.md +1 -1
- package/docs/desktop.mdx +9 -3
- package/docs/enterprise.md +11 -10
- package/docs/environment.mdx +7 -8
- package/docs/faq.mdx +3 -3
- package/docs/first-drive.md +5 -4
- package/docs/flows.md +35 -27
- package/docs/for-agents.md +4 -5
- package/docs/frameworks.mdx +32 -21
- package/docs/getting-started.md +65 -61
- package/docs/human-control.md +16 -16
- package/docs/index.mdx +15 -42
- package/docs/install-agentic.mdx +22 -37
- package/docs/install-manual.mdx +23 -13
- package/docs/instrumentation.mdx +5 -3
- package/docs/integration-patterns.md +7 -7
- package/docs/license-activation.mdx +1 -1
- package/docs/multi-agent-testing.md +24 -6
- package/docs/packages/babel-plugin.mdx +4 -2
- package/docs/packages/browser.mdx +16 -10
- package/docs/packages/core.mdx +12 -5
- package/docs/packages/electron.mdx +3 -2
- package/docs/packages/engine.mdx +1 -1
- package/docs/packages/eslint-plugin.mdx +18 -12
- package/docs/packages/next.mdx +8 -7
- package/docs/packages/open-verification.mdx +1 -1
- package/docs/packages/server.mdx +5 -5
- package/docs/packages/tauri.mdx +9 -9
- package/docs/packages/test.mdx +4 -10
- package/docs/packages/vite-plugin.mdx +32 -4
- package/docs/packages.mdx +11 -15
- package/docs/platform-integration.md +6 -5
- package/docs/predicates.mdx +40 -24
- package/docs/quickstart.mdx +69 -30
- package/docs/required-checks.md +8 -7
- package/docs/reticle-manual.md +15 -5
- package/docs/skill-file.mdx +17 -79
- package/docs/skill-setup.md +9 -9
- package/docs/skill.md +200 -0
- package/docs/system-map.md +7 -7
- package/docs/telemetry.md +23 -25
- package/docs/testing.md +4 -4
- package/docs/token-efficiency.md +12 -12
- package/docs/tools/act-and-wait.mdx +9 -2
- package/docs/tools/act-sequence.mdx +6 -7
- package/docs/tools/act.mdx +2 -2
- package/docs/tools/assert.mdx +18 -17
- package/docs/tools/console.mdx +9 -9
- package/docs/tools/inspect.mdx +16 -7
- package/docs/tools/look.mdx +24 -0
- package/docs/tools/navigate.mdx +5 -3
- package/docs/tools/network.mdx +2 -2
- package/docs/tools/observe.mdx +6 -6
- package/docs/tools/overview.mdx +34 -33
- package/docs/tools/query.mdx +5 -5
- package/docs/tools/session-and-feedback.mdx +22 -13
- package/docs/tools/sessions.mdx +8 -8
- package/docs/tools/snapshot.mdx +6 -5
- package/docs/tools/state.mdx +9 -9
- package/docs/tools/tools-and-run.mdx +26 -24
- package/docs/tools/verify.mdx +28 -0
- package/docs/tools/wait-for.mdx +8 -4
- package/docs/troubleshooting.mdx +21 -6
- package/docs/usage.md +55 -46
- package/docs/use-cases.mdx +3 -3
- package/docs/vs-chrome-devtools-mcp.mdx +9 -6
- package/docs/vs-playwright-mcp.mdx +3 -1
- package/docs/what-is-recorded.md +17 -5
- package/docs/what-is-reticle.mdx +5 -3
- package/docs/why-reticle.mdx +1 -1
- package/package.json +9 -12
- package/dist/command/cli/demo/demo-page.d.ts +0 -78
- package/dist/command/cli/demo/demo-page.js +0 -241
- package/dist/command/cli/demo/demo-run.d.ts +0 -38
- package/dist/command/cli/demo/demo-run.js +0 -138
- package/dist/features/harness/driver.d.ts +0 -50
- package/dist/features/harness/driver.js +0 -236
- package/dist/features/harness/jev-driver.d.ts +0 -188
- package/dist/features/harness/jev-driver.js +0 -678
- package/dist/features/harness/openai-driver.d.ts +0 -58
- package/dist/features/harness/openai-driver.js +0 -206
- package/dist/judgement/hunt/hunt-report.d.ts +0 -49
- package/dist/judgement/hunt/hunt-report.js +0 -84
- package/dist/language/flows/buddy-status.d.ts +0 -25
- package/dist/language/flows/buddy-status.js +0 -32
- package/dist/language/flows/change/watch-batcher.d.ts +0 -18
- package/dist/language/flows/change/watch-batcher.js +0 -19
- package/dist/memory/cloud/harness-offer.d.ts +0 -44
- package/dist/memory/cloud/harness-offer.js +0 -145
- package/dist/memory/project/dir/fill-value-store.d.ts +0 -32
- package/dist/memory/project/dir/fill-value-store.js +0 -88
- package/dist/surface/tools/feature-capture.d.ts +0 -151
- package/dist/surface/tools/feature-capture.js +0 -235
- package/dist/surface/tools/tool-hit-rate.d.ts +0 -87
- package/dist/surface/tools/tool-hit-rate.js +0 -90
- package/dist/telemetry/harness-drive.d.ts +0 -4
- package/dist/telemetry/harness-drive.js +0 -35
- package/dist/telemetry/identify.d.ts +0 -22
- package/dist/telemetry/identify.js +0 -73
- package/docs/cli/capsules.mdx +0 -70
- package/docs/cli/hunt.mdx +0 -73
- package/docs/cli/identify.mdx +0 -76
- package/docs/cli/kill.mdx +0 -91
- package/docs/cli/watch.mdx +0 -62
- package/docs/local-registry.md +0 -143
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Whether this workspace has taken the three months of free harness, read by the thing that would
|
|
3
|
-
* advertise it.
|
|
4
|
-
*
|
|
5
|
-
* The HUD can only advertise honestly if it knows, and only the platform knows. This is the read —
|
|
6
|
-
* filed beside the other reads of the linked account rather than with the harness itself, because
|
|
7
|
-
* nothing that DRIVES needs it; the thing that needs it is the snapshot the HUD paints from. Same
|
|
8
|
-
* shape as the harness's own `platform-config.ts` and for the same reasons: it is INFORMATION, not a
|
|
9
|
-
* credential, so every failure answers `undefined`, which every caller must treat as "say nothing"
|
|
10
|
-
* rather than as "not claimed". An offline laptop must not start advertising something the person
|
|
11
|
-
* already owns.
|
|
12
|
-
*
|
|
13
|
-
* It is also SYNCHRONOUS at the point of use. The impact snapshot is built inline, dozens of times a
|
|
14
|
-
* session, and the answer changes about once per workspace lifetime, so a cache that refreshes in
|
|
15
|
-
* the background is the whole design: readers get what we last heard, and a stale answer is only
|
|
16
|
-
* ever stale in the safe direction — the card the person is looking at is the one they can act on.
|
|
17
|
-
*/
|
|
18
|
-
import { platformCredentialFrom } from '@reticlehq/core';
|
|
19
|
-
const OFFER_PATH = '/v1/harness/offer';
|
|
20
|
-
/** Same budget as the model-config read: a drive must never wait on an advert. */
|
|
21
|
-
const TIMEOUT_MS = 2_000;
|
|
22
|
-
/**
|
|
23
|
-
* How long a cached answer is trusted.
|
|
24
|
-
*
|
|
25
|
-
* A claim happens once. The only transition worth catching quickly is the one the person just made
|
|
26
|
-
* in another tab, and ten minutes is well inside the time it takes them to come back and look.
|
|
27
|
-
*/
|
|
28
|
-
const FRESH_MS = 10 * 60 * 1_000;
|
|
29
|
-
/**
|
|
30
|
-
* Parse the platform's answer.
|
|
31
|
-
*
|
|
32
|
-
* The platform reports `null` for "never claimed" on the fields it has no value for; the wire
|
|
33
|
-
* contract says ABSENT. They are the same fact and the translation belongs here, at the edge,
|
|
34
|
-
* rather than in a HUD that would then need to know about two spellings of nothing.
|
|
35
|
-
*/
|
|
36
|
-
function parse(body, claimUrl) {
|
|
37
|
-
try {
|
|
38
|
-
const parsed = JSON.parse(body);
|
|
39
|
-
if ('object' !== typeof parsed || null === parsed)
|
|
40
|
-
return undefined;
|
|
41
|
-
const record = parsed;
|
|
42
|
-
const claimed = record['claimed'];
|
|
43
|
-
if ('boolean' !== typeof claimed)
|
|
44
|
-
return undefined;
|
|
45
|
-
const offer = { claimed };
|
|
46
|
-
const expiresAt = record['expiresAt'];
|
|
47
|
-
if ('number' === typeof expiresAt)
|
|
48
|
-
offer.expiresAt = expiresAt;
|
|
49
|
-
const days = record['daysRemaining'];
|
|
50
|
-
if ('number' === typeof days)
|
|
51
|
-
offer.daysRemaining = days;
|
|
52
|
-
// The one field that cannot be inferred from the others: a LAPSED claim reports `claimed:false`
|
|
53
|
-
// and `daysRemaining:0`, which is indistinguishable from never having claimed unless the
|
|
54
|
-
// platform's own answer about offerability is carried through.
|
|
55
|
-
const eligible = record['eligible'];
|
|
56
|
-
if ('boolean' === typeof eligible)
|
|
57
|
-
offer.eligible = eligible;
|
|
58
|
-
if (claimUrl !== undefined && 0 < claimUrl.length)
|
|
59
|
-
offer.claimUrl = claimUrl;
|
|
60
|
-
return offer;
|
|
61
|
-
}
|
|
62
|
-
catch {
|
|
63
|
-
return undefined;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
/** Ask the platform where this workspace stands. `undefined` means "no answer", never "not claimed". */
|
|
67
|
-
export async function fetchHarnessOffer(env, claimUrl, doFetch = (url, init) => fetch(url, init), timeoutMs = TIMEOUT_MS) {
|
|
68
|
-
const cloud = platformCredentialFrom(env);
|
|
69
|
-
if (cloud === undefined)
|
|
70
|
-
return undefined;
|
|
71
|
-
const key = cloud.apiKey;
|
|
72
|
-
const host = cloud.url;
|
|
73
|
-
const controller = new AbortController();
|
|
74
|
-
const timer = setTimeout(() => {
|
|
75
|
-
controller.abort();
|
|
76
|
-
}, timeoutMs);
|
|
77
|
-
try {
|
|
78
|
-
const res = await doFetch(`${host.replace(/\/+$/, '')}${OFFER_PATH}`, {
|
|
79
|
-
method: 'GET',
|
|
80
|
-
headers: { authorization: `Bearer ${key}` },
|
|
81
|
-
signal: controller.signal,
|
|
82
|
-
});
|
|
83
|
-
if (!res.ok)
|
|
84
|
-
return undefined;
|
|
85
|
-
return parse(await res.text(), claimUrl);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
finally {
|
|
91
|
-
clearTimeout(timer);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* A self-refreshing cache over the read above.
|
|
96
|
-
*
|
|
97
|
-
* Deliberately NOT a timer. A daemon that lives for days would otherwise hold an interval whose only
|
|
98
|
-
* job is to re-ask a question nobody is asking, and it would have to be torn down in a place that
|
|
99
|
-
* already has nine teardowns. Refreshing on a stale READ means the work only happens while somebody
|
|
100
|
-
* is actually looking, and the first read of a process — which is always stale — starts the fetch
|
|
101
|
-
* that the second read answers from.
|
|
102
|
-
*/
|
|
103
|
-
export function harnessOfferSource(env, claimUrl, now = () => Date.now(), load = (claim) => fetchHarnessOffer(env, claim)) {
|
|
104
|
-
let cached;
|
|
105
|
-
// `undefined` rather than 0: "never asked" is a different state from "asked at the epoch", and
|
|
106
|
-
// conflating them made a source with an injected clock never take its first read.
|
|
107
|
-
let fetchedAt;
|
|
108
|
-
let inFlight = false;
|
|
109
|
-
const refresh = () => {
|
|
110
|
-
if (inFlight)
|
|
111
|
-
return;
|
|
112
|
-
inFlight = true;
|
|
113
|
-
void load(claimUrl())
|
|
114
|
-
.then((offer) => {
|
|
115
|
-
// A failed read keeps the LAST good answer rather than blanking the card mid-session: one
|
|
116
|
-
// dropped request is not evidence that the offer changed.
|
|
117
|
-
if (offer !== undefined)
|
|
118
|
-
cached = offer;
|
|
119
|
-
fetchedAt = now();
|
|
120
|
-
})
|
|
121
|
-
.catch(() => {
|
|
122
|
-
fetchedAt = now();
|
|
123
|
-
})
|
|
124
|
-
.finally(() => {
|
|
125
|
-
inFlight = false;
|
|
126
|
-
});
|
|
127
|
-
};
|
|
128
|
-
/*
|
|
129
|
-
* Asked once at construction, not first read.
|
|
130
|
-
*
|
|
131
|
-
* Measured in a browser: a daemon pushes the impact snapshot the INSTANT a session attaches, and
|
|
132
|
-
* on a page nobody drives that is the only push there will ever be. Refreshing on the first read
|
|
133
|
-
* meant that push always carried "we have not heard", the answer landed a moment later with
|
|
134
|
-
* nobody to tell, and the HUD showed nothing for the whole session. Starting the fetch when the
|
|
135
|
-
* daemon starts puts the answer in place before any page can connect.
|
|
136
|
-
*/
|
|
137
|
-
refresh();
|
|
138
|
-
return {
|
|
139
|
-
read() {
|
|
140
|
-
if (fetchedAt === undefined || FRESH_MS <= now() - fetchedAt)
|
|
141
|
-
refresh();
|
|
142
|
-
return cached;
|
|
143
|
-
},
|
|
144
|
-
};
|
|
145
|
-
}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The values a drive types into this project's fields, kept so they are paid for once.
|
|
3
|
-
*
|
|
4
|
-
* A generated field value is not a model's opinion to be re-asked every run. It is a FIXTURE: the
|
|
5
|
-
* same label on the same app wants the same value tomorrow, a replay must send exactly what the
|
|
6
|
-
* recording sent or it is not a replay, and a human who dislikes "Acme Corp" should be able to open
|
|
7
|
-
* a file and write something else rather than argue with a model about it. So it lives beside the
|
|
8
|
-
* flows it belongs to, in git, in the project's own directory.
|
|
9
|
-
*
|
|
10
|
-
* Read once at the start of a drive and written once at the end: a drive that fills twenty fields
|
|
11
|
-
* must not write the file twenty times, and nothing else in the process is competing for it.
|
|
12
|
-
*
|
|
13
|
-
* Every failure is silent and answers "no values". A drive must never fail over a fixtures file,
|
|
14
|
-
* and the fallback -- the label heuristic -- is what every drive used before this existed.
|
|
15
|
-
*/
|
|
16
|
-
import type { FileSystemPort } from '../fs/fs-port.js';
|
|
17
|
-
/** What a drive holds while it runs: a read-through map plus whatever it learned. */
|
|
18
|
-
export interface FillValueStore {
|
|
19
|
-
get(label: string): string | undefined;
|
|
20
|
-
set(label: string, value: string): void;
|
|
21
|
-
/** Persist, if anything was learned. Silent on failure, like every read here. */
|
|
22
|
-
flush(): Promise<void>;
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* A store that remembers within one drive and writes nothing.
|
|
26
|
-
*
|
|
27
|
-
* Used when there is no project directory to write to. A drive must never fail over its fixtures
|
|
28
|
-
* file, and that includes failing to FIND one: the values still de-duplicate inside the run, they
|
|
29
|
-
* are simply not carried into the next one.
|
|
30
|
-
*/
|
|
31
|
-
export declare function memoryFillValues(): FillValueStore;
|
|
32
|
-
export declare function openFillValues(fs: FileSystemPort, root: string | undefined): Promise<FillValueStore>;
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The values a drive types into this project's fields, kept so they are paid for once.
|
|
3
|
-
*
|
|
4
|
-
* A generated field value is not a model's opinion to be re-asked every run. It is a FIXTURE: the
|
|
5
|
-
* same label on the same app wants the same value tomorrow, a replay must send exactly what the
|
|
6
|
-
* recording sent or it is not a replay, and a human who dislikes "Acme Corp" should be able to open
|
|
7
|
-
* a file and write something else rather than argue with a model about it. So it lives beside the
|
|
8
|
-
* flows it belongs to, in git, in the project's own directory.
|
|
9
|
-
*
|
|
10
|
-
* Read once at the start of a drive and written once at the end: a drive that fills twenty fields
|
|
11
|
-
* must not write the file twenty times, and nothing else in the process is competing for it.
|
|
12
|
-
*
|
|
13
|
-
* Every failure is silent and answers "no values". A drive must never fail over a fixtures file,
|
|
14
|
-
* and the fallback -- the label heuristic -- is what every drive used before this existed.
|
|
15
|
-
*/
|
|
16
|
-
import { ReticleDir } from '@reticlehq/core';
|
|
17
|
-
import { join } from 'node:path';
|
|
18
|
-
/** Stamped so a later format change can tell an old file from a broken one. */
|
|
19
|
-
const VERSION = 1;
|
|
20
|
-
/** A label is a UI string and can be anything; a value that is not a string is not usable. */
|
|
21
|
-
function parse(text) {
|
|
22
|
-
try {
|
|
23
|
-
const raw = JSON.parse(text);
|
|
24
|
-
if ('object' !== typeof raw || null === raw)
|
|
25
|
-
return {};
|
|
26
|
-
const values = raw.values;
|
|
27
|
-
if ('object' !== typeof values || null === values)
|
|
28
|
-
return {};
|
|
29
|
-
const out = {};
|
|
30
|
-
for (const [label, value] of Object.entries(values))
|
|
31
|
-
if ('string' === typeof value && 0 < value.length)
|
|
32
|
-
out[label] = value;
|
|
33
|
-
return out;
|
|
34
|
-
}
|
|
35
|
-
catch {
|
|
36
|
-
return {};
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* A store that remembers within one drive and writes nothing.
|
|
41
|
-
*
|
|
42
|
-
* Used when there is no project directory to write to. A drive must never fail over its fixtures
|
|
43
|
-
* file, and that includes failing to FIND one: the values still de-duplicate inside the run, they
|
|
44
|
-
* are simply not carried into the next one.
|
|
45
|
-
*/
|
|
46
|
-
export function memoryFillValues() {
|
|
47
|
-
const values = new Map();
|
|
48
|
-
return {
|
|
49
|
-
get: (label) => values.get(label),
|
|
50
|
-
set: (label, value) => void values.set(label, value),
|
|
51
|
-
flush: () => Promise.resolve(),
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
export async function openFillValues(fs, root) {
|
|
55
|
-
if (root === undefined || 0 === root.length)
|
|
56
|
-
return memoryFillValues();
|
|
57
|
-
const path = join(root, ReticleDir.FILL_VALUES_FILE);
|
|
58
|
-
let values = {};
|
|
59
|
-
try {
|
|
60
|
-
if (await fs.exists(path))
|
|
61
|
-
values = parse(await fs.readFile(path));
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
/* an unreadable fixtures file is the same as an absent one */
|
|
65
|
-
}
|
|
66
|
-
let learned = false;
|
|
67
|
-
return {
|
|
68
|
-
get: (label) => values[label],
|
|
69
|
-
set: (label, value) => {
|
|
70
|
-
if (values[label] === value)
|
|
71
|
-
return;
|
|
72
|
-
values[label] = value;
|
|
73
|
-
learned = true;
|
|
74
|
-
},
|
|
75
|
-
async flush() {
|
|
76
|
-
if (!learned)
|
|
77
|
-
return;
|
|
78
|
-
try {
|
|
79
|
-
await fs.mkdir(root);
|
|
80
|
-
const file = { version: VERSION, values };
|
|
81
|
-
await fs.writeFile(path, `${JSON.stringify(file, null, 2)}\n`);
|
|
82
|
-
}
|
|
83
|
-
catch {
|
|
84
|
-
/* the drive already happened; losing the cache costs a regeneration, not a result */
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
};
|
|
88
|
-
}
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import { type Intent, type JournalAction } from '@reticlehq/core/artifacts';
|
|
2
|
-
/**
|
|
3
|
-
* Were `reticle_context` and `reticle_intent` used at all — and did using them change anything?
|
|
4
|
-
*
|
|
5
|
-
* Both shipped with the same pre-registered disproof: *if agents never call it, cut it*. Nothing
|
|
6
|
-
* recorded whether they were called, so the disproof could never be run, and a feature whose
|
|
7
|
-
* disproof cannot be run is one nobody can kill. This is the smallest thing that makes the question
|
|
8
|
-
* answerable, per session, locally — an instrument, not a scold. The numbers exist so a FEATURE can
|
|
9
|
-
* be removed, never so an agent can be blamed for how it drove.
|
|
10
|
-
*
|
|
11
|
-
* ## Fold first, record only what nothing records
|
|
12
|
-
*
|
|
13
|
-
* Three of the four questions are already answerable from what is on disk. The intent ledger says
|
|
14
|
-
* what was declared; the journal says what was driven and what verdicts were drawn. Those are folded
|
|
15
|
-
* here and never re-stored, for the reason `run-context.ts` gives at length: two ways to compute one
|
|
16
|
-
* number is worse than one way.
|
|
17
|
-
*
|
|
18
|
-
* The journal does NOT record read-only calls — it holds actions and verdicts only. So "was
|
|
19
|
-
* `reticle_context` called" has no ledger to fold, and that one thing is recorded, in memory, on the
|
|
20
|
-
* session, by `CaptureLedger`. It is the whole of the new state.
|
|
21
|
-
*
|
|
22
|
-
* ## Absent is not zero
|
|
23
|
-
*
|
|
24
|
-
* A session this daemon has recorded nothing for — journaling off, a session adopted after the fact
|
|
25
|
-
* — reports `observed: false` and states no counts at all. It has not established that the features
|
|
26
|
-
* went unused; it has established that it was not watching. This repo has shipped the other bug
|
|
27
|
-
* twice.
|
|
28
|
-
*/
|
|
29
|
-
/**
|
|
30
|
-
* The calls this instrument needs and the journal does not keep.
|
|
31
|
-
*
|
|
32
|
-
* Deliberately a short explicit list rather than "everything that is not an action". Under-inclusion
|
|
33
|
-
* is the safe direction: a read tool missing from here lowers the hit side and the miss side by the
|
|
34
|
-
* same call, so the comparison the disproof turns on stays fair. Over-inclusion is not — a lifecycle
|
|
35
|
-
* or disk-side tool landing in here would be counted as a "read" the agent made of the app, which it
|
|
36
|
-
* was not.
|
|
37
|
-
*/
|
|
38
|
-
export declare const CAPTURED_TOOLS: ReadonlySet<string>;
|
|
39
|
-
/** One recorded call: which tool, what it was about, and how far into the run it happened. */
|
|
40
|
-
export interface CapturedCall {
|
|
41
|
-
tool: string;
|
|
42
|
-
/** The ref or target the call named, when it named one. Absent for a whole-page read. */
|
|
43
|
-
subject?: string;
|
|
44
|
-
/**
|
|
45
|
-
* The session's dispatched-action count at the moment of the call — the same counter that mints
|
|
46
|
-
* journal action ids, so it lines up with `reticle_context`'s own `step` whenever the journal is on.
|
|
47
|
-
*/
|
|
48
|
-
afterActions: number;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* The one thing that is stored rather than folded: the read-only calls the journal never sees.
|
|
52
|
-
*
|
|
53
|
-
* In memory and per session, the same shape as `GapLedger`. It is not durable on purpose — the
|
|
54
|
-
* question is about one run, and a second file on disk would be a second thing to reconcile with the
|
|
55
|
-
* journal.
|
|
56
|
-
*/
|
|
57
|
-
export declare class CaptureLedger {
|
|
58
|
-
#private;
|
|
59
|
-
/**
|
|
60
|
-
* One call, under the name of the tool that RAN — every tool, not just the read set above.
|
|
61
|
-
*
|
|
62
|
-
* Separate from `note` because it answers a different question and is bounded differently: this
|
|
63
|
-
* map cannot outgrow the tool table however long the session runs, so it needs no cap and never
|
|
64
|
-
* has to report a floor. See surface/tools/tool-hit-rate.ts for what it feeds.
|
|
65
|
-
*/
|
|
66
|
-
noteTool(tool: string): void;
|
|
67
|
-
/** How many times each tool was called this session, in first-call order. */
|
|
68
|
-
toolCalls(): ReadonlyMap<string, number>;
|
|
69
|
-
note(call: CapturedCall): void;
|
|
70
|
-
calls(): readonly CapturedCall[];
|
|
71
|
-
/** How many calls fell off the front. Non-zero means the counts below are a floor. */
|
|
72
|
-
get dropped(): number;
|
|
73
|
-
}
|
|
74
|
-
/**
|
|
75
|
-
* Record one captured call against the session that made it.
|
|
76
|
-
*
|
|
77
|
-
* Tolerates a session that carries no ledger, exactly as `noteSessionGaps` does and for the same
|
|
78
|
-
* reason: `Session` is satisfied structurally, and many specs — plus any consumer embedding this
|
|
79
|
-
* engine — build one as an object literal. Such a session is a real caller that simply keeps no
|
|
80
|
-
* ledger, and an instrument must never be the reason a tool call throws. Its calls are then absent
|
|
81
|
-
* rather than counted as zero, which is what `observed: false` exists to say.
|
|
82
|
-
*/
|
|
83
|
-
export declare function noteCapturedCall(session: {
|
|
84
|
-
capture?: CaptureLedger;
|
|
85
|
-
actionCount?: number;
|
|
86
|
-
}, call: Omit<CapturedCall, 'afterActions'>): void;
|
|
87
|
-
/**
|
|
88
|
-
* Count one call against the session that made it, whichever tool it was.
|
|
89
|
-
*
|
|
90
|
-
* Tolerant of a ledger-less session for exactly the reason `noteCapturedCall` is: its calls are then
|
|
91
|
-
* absent rather than counted as zero, which is what `observed: false` exists to say.
|
|
92
|
-
*/
|
|
93
|
-
export declare function noteToolDispatched(session: {
|
|
94
|
-
capture?: CaptureLedger;
|
|
95
|
-
}, tool: string): void;
|
|
96
|
-
/** What one session's use of the two features looks like. Everything but `observed` is omitted when nothing was recorded. */
|
|
97
|
-
interface FeatureCapture {
|
|
98
|
-
/** False when this daemon recorded nothing for the session — "not watched", never "not used". */
|
|
99
|
-
observed: boolean;
|
|
100
|
-
/** The ledger dropped calls, so every count is a floor. Present only when true. */
|
|
101
|
-
truncated?: boolean;
|
|
102
|
-
context?: {
|
|
103
|
-
calls: number;
|
|
104
|
-
/** The dispatched-action count each call was made at, in order. */
|
|
105
|
-
atSteps: number[];
|
|
106
|
-
acted: number;
|
|
107
|
-
refetched: number;
|
|
108
|
-
readOther: number;
|
|
109
|
-
nothingAfter: number;
|
|
110
|
-
};
|
|
111
|
-
intents?: {
|
|
112
|
-
declared: number;
|
|
113
|
-
open: number;
|
|
114
|
-
};
|
|
115
|
-
missed?: {
|
|
116
|
-
verdictsWithNoIntentDeclared: number;
|
|
117
|
-
refetchedEstablished: number;
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Did calling `reticle_context` change what happened next?
|
|
122
|
-
*
|
|
123
|
-
* The mechanical proxy, stated so it can be argued with: look at the very next recorded call. If an
|
|
124
|
-
* action was dispatched before it — the action counter moved — the agent ACTED, and the context
|
|
125
|
-
* plausibly helped. If instead the next call is a read of a subject the context had just supplied,
|
|
126
|
-
* the agent re-fetched what it had been handed, and the context did not help.
|
|
127
|
-
*
|
|
128
|
-
* ## What this proxy CANNOT see
|
|
129
|
-
*
|
|
130
|
-
* - Whether the agent READ the response, reasoned over it, or wrote a better answer from it. There
|
|
131
|
-
* is no signal for that anywhere, and this must not be mistaken for one.
|
|
132
|
-
* - Anything that happens between two Reticle calls: source edits, calls to other MCP servers, a
|
|
133
|
-
* turn ending, a human interrupting. A long gap is invisible and reads as adjacency.
|
|
134
|
-
* - Reads that name no ref or target (a whole-page snapshot). They land in `readOther`, never in
|
|
135
|
-
* `refetched`, so a snapshot that duplicated the context is under-counted, not over-counted.
|
|
136
|
-
* - Causation. `acted` is proximity in a call sequence, nothing more. An agent that would have acted
|
|
137
|
-
* anyway is indistinguishable from one the context unblocked.
|
|
138
|
-
* - `reticle_context` called with no session connected — it answers there by design, and there is no
|
|
139
|
-
* per-session ledger to record it against, so those calls are missing entirely.
|
|
140
|
-
* - Two agents driving one session. Their calls interleave into one sequence and "next call" stops
|
|
141
|
-
* meaning "next thing that agent did".
|
|
142
|
-
*/
|
|
143
|
-
export declare function foldFeatureCapture(input: {
|
|
144
|
-
calls: readonly CapturedCall[];
|
|
145
|
-
dropped: number;
|
|
146
|
-
actions: readonly JournalAction[];
|
|
147
|
-
intents: readonly Intent[];
|
|
148
|
-
/** The session's dispatched-action count now, so a run that ended on an action is not read as idle. */
|
|
149
|
-
finalActions: number;
|
|
150
|
-
}): FeatureCapture;
|
|
151
|
-
export {};
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { IntentState, JournalVerdictEffectSchema, RUN_ESTABLISHED_CAP, } from '@reticlehq/core/artifacts';
|
|
2
|
-
import { subjectOf } from '../../judgement/runs/artifact/run-context.js';
|
|
3
|
-
import { ReticleTool } from '@reticlehq/core';
|
|
4
|
-
/**
|
|
5
|
-
* Were `reticle_context` and `reticle_intent` used at all — and did using them change anything?
|
|
6
|
-
*
|
|
7
|
-
* Both shipped with the same pre-registered disproof: *if agents never call it, cut it*. Nothing
|
|
8
|
-
* recorded whether they were called, so the disproof could never be run, and a feature whose
|
|
9
|
-
* disproof cannot be run is one nobody can kill. This is the smallest thing that makes the question
|
|
10
|
-
* answerable, per session, locally — an instrument, not a scold. The numbers exist so a FEATURE can
|
|
11
|
-
* be removed, never so an agent can be blamed for how it drove.
|
|
12
|
-
*
|
|
13
|
-
* ## Fold first, record only what nothing records
|
|
14
|
-
*
|
|
15
|
-
* Three of the four questions are already answerable from what is on disk. The intent ledger says
|
|
16
|
-
* what was declared; the journal says what was driven and what verdicts were drawn. Those are folded
|
|
17
|
-
* here and never re-stored, for the reason `run-context.ts` gives at length: two ways to compute one
|
|
18
|
-
* number is worse than one way.
|
|
19
|
-
*
|
|
20
|
-
* The journal does NOT record read-only calls — it holds actions and verdicts only. So "was
|
|
21
|
-
* `reticle_context` called" has no ledger to fold, and that one thing is recorded, in memory, on the
|
|
22
|
-
* session, by `CaptureLedger`. It is the whole of the new state.
|
|
23
|
-
*
|
|
24
|
-
* ## Absent is not zero
|
|
25
|
-
*
|
|
26
|
-
* A session this daemon has recorded nothing for — journaling off, a session adopted after the fact
|
|
27
|
-
* — reports `observed: false` and states no counts at all. It has not established that the features
|
|
28
|
-
* went unused; it has established that it was not watching. This repo has shipped the other bug
|
|
29
|
-
* twice.
|
|
30
|
-
*/
|
|
31
|
-
/**
|
|
32
|
-
* The calls this instrument needs and the journal does not keep.
|
|
33
|
-
*
|
|
34
|
-
* Deliberately a short explicit list rather than "everything that is not an action". Under-inclusion
|
|
35
|
-
* is the safe direction: a read tool missing from here lowers the hit side and the miss side by the
|
|
36
|
-
* same call, so the comparison the disproof turns on stays fair. Over-inclusion is not — a lifecycle
|
|
37
|
-
* or disk-side tool landing in here would be counted as a "read" the agent made of the app, which it
|
|
38
|
-
* was not.
|
|
39
|
-
*/
|
|
40
|
-
export const CAPTURED_TOOLS = new Set([
|
|
41
|
-
ReticleTool.CONTEXT,
|
|
42
|
-
ReticleTool.SNAPSHOT,
|
|
43
|
-
ReticleTool.QUERY,
|
|
44
|
-
ReticleTool.INSPECT,
|
|
45
|
-
ReticleTool.STATE,
|
|
46
|
-
// All four of the above, merged, on the `merged` surface. A read is a read under either name.
|
|
47
|
-
ReticleTool.LOOK,
|
|
48
|
-
ReticleTool.STORAGE,
|
|
49
|
-
ReticleTool.NETWORK,
|
|
50
|
-
ReticleTool.CONSOLE,
|
|
51
|
-
ReticleTool.OBSERVE,
|
|
52
|
-
ReticleTool.EXPLORE,
|
|
53
|
-
]);
|
|
54
|
-
/**
|
|
55
|
-
* How many calls the ledger holds before it starts dropping the oldest.
|
|
56
|
-
*
|
|
57
|
-
* A verification loop is 50–200 calls, so this is not reached in normal use; it exists so a runaway
|
|
58
|
-
* session cannot grow a per-session array without bound. When it IS reached the report says
|
|
59
|
-
* `truncated` rather than presenting a short count as a complete one.
|
|
60
|
-
*/
|
|
61
|
-
const CAPTURE_CAP = 2000;
|
|
62
|
-
/**
|
|
63
|
-
* The one thing that is stored rather than folded: the read-only calls the journal never sees.
|
|
64
|
-
*
|
|
65
|
-
* In memory and per session, the same shape as `GapLedger`. It is not durable on purpose — the
|
|
66
|
-
* question is about one run, and a second file on disk would be a second thing to reconcile with the
|
|
67
|
-
* journal.
|
|
68
|
-
*/
|
|
69
|
-
export class CaptureLedger {
|
|
70
|
-
#calls = [];
|
|
71
|
-
#dropped = 0;
|
|
72
|
-
#tools = new Map();
|
|
73
|
-
/**
|
|
74
|
-
* One call, under the name of the tool that RAN — every tool, not just the read set above.
|
|
75
|
-
*
|
|
76
|
-
* Separate from `note` because it answers a different question and is bounded differently: this
|
|
77
|
-
* map cannot outgrow the tool table however long the session runs, so it needs no cap and never
|
|
78
|
-
* has to report a floor. See surface/tools/tool-hit-rate.ts for what it feeds.
|
|
79
|
-
*/
|
|
80
|
-
noteTool(tool) {
|
|
81
|
-
this.#tools.set(tool, (this.#tools.get(tool) ?? 0) + 1);
|
|
82
|
-
}
|
|
83
|
-
/** How many times each tool was called this session, in first-call order. */
|
|
84
|
-
toolCalls() {
|
|
85
|
-
return this.#tools;
|
|
86
|
-
}
|
|
87
|
-
note(call) {
|
|
88
|
-
this.#calls.push(call);
|
|
89
|
-
if (this.#calls.length > CAPTURE_CAP) {
|
|
90
|
-
this.#calls.shift();
|
|
91
|
-
this.#dropped += 1;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
calls() {
|
|
95
|
-
return this.#calls;
|
|
96
|
-
}
|
|
97
|
-
/** How many calls fell off the front. Non-zero means the counts below are a floor. */
|
|
98
|
-
get dropped() {
|
|
99
|
-
return this.#dropped;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Record one captured call against the session that made it.
|
|
104
|
-
*
|
|
105
|
-
* Tolerates a session that carries no ledger, exactly as `noteSessionGaps` does and for the same
|
|
106
|
-
* reason: `Session` is satisfied structurally, and many specs — plus any consumer embedding this
|
|
107
|
-
* engine — build one as an object literal. Such a session is a real caller that simply keeps no
|
|
108
|
-
* ledger, and an instrument must never be the reason a tool call throws. Its calls are then absent
|
|
109
|
-
* rather than counted as zero, which is what `observed: false` exists to say.
|
|
110
|
-
*/
|
|
111
|
-
export function noteCapturedCall(session, call) {
|
|
112
|
-
session.capture?.note({ ...call, afterActions: session.actionCount ?? 0 });
|
|
113
|
-
}
|
|
114
|
-
/**
|
|
115
|
-
* Count one call against the session that made it, whichever tool it was.
|
|
116
|
-
*
|
|
117
|
-
* Tolerant of a ledger-less session for exactly the reason `noteCapturedCall` is: its calls are then
|
|
118
|
-
* absent rather than counted as zero, which is what `observed: false` exists to say.
|
|
119
|
-
*/
|
|
120
|
-
export function noteToolDispatched(session, tool) {
|
|
121
|
-
session.capture?.noteTool(tool);
|
|
122
|
-
}
|
|
123
|
-
/**
|
|
124
|
-
* Every point in the run at which each subject became an established fact.
|
|
125
|
-
*
|
|
126
|
-
* "Established" is not a second definition: it is the rule `establishedFromJournal` folds by — an
|
|
127
|
-
* action with an observed settle outcome, filed under the ref or target it named — and `subjectOf`
|
|
128
|
-
* is imported from there rather than rewritten, so the two cannot drift apart.
|
|
129
|
-
*/
|
|
130
|
-
function establishedIndexes(actions) {
|
|
131
|
-
const out = new Map();
|
|
132
|
-
actions.forEach((action, index) => {
|
|
133
|
-
if (undefined === action.settled)
|
|
134
|
-
return;
|
|
135
|
-
const key = subjectOf(action);
|
|
136
|
-
if (undefined === key)
|
|
137
|
-
return;
|
|
138
|
-
const at = out.get(key);
|
|
139
|
-
if (at === undefined)
|
|
140
|
-
out.set(key, [index]);
|
|
141
|
-
else
|
|
142
|
-
at.push(index);
|
|
143
|
-
});
|
|
144
|
-
return out;
|
|
145
|
-
}
|
|
146
|
-
/** Was this subject already an established fact by the time a call at `afterActions` was made? */
|
|
147
|
-
function wasEstablished(index, subject, afterActions) {
|
|
148
|
-
if (undefined === subject)
|
|
149
|
-
return false;
|
|
150
|
-
const at = index.get(subject);
|
|
151
|
-
if (at === undefined)
|
|
152
|
-
return false;
|
|
153
|
-
// Action `i` has been dispatched once the counter reads `i + 1`, so `i + 1 <= afterActions` is
|
|
154
|
-
// "already true when the call was made" — which is what keeps a FIRST look off this count. The
|
|
155
|
-
// lower bound is the run context's own window: a fact that has scrolled past RUN_ESTABLISHED_CAP
|
|
156
|
-
// is not something `reticle_context` would have handed back, so re-reading it is not a re-fetch.
|
|
157
|
-
return at.some((i) => i + 1 <= afterActions && i + 1 > afterActions - RUN_ESTABLISHED_CAP);
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Did calling `reticle_context` change what happened next?
|
|
161
|
-
*
|
|
162
|
-
* The mechanical proxy, stated so it can be argued with: look at the very next recorded call. If an
|
|
163
|
-
* action was dispatched before it — the action counter moved — the agent ACTED, and the context
|
|
164
|
-
* plausibly helped. If instead the next call is a read of a subject the context had just supplied,
|
|
165
|
-
* the agent re-fetched what it had been handed, and the context did not help.
|
|
166
|
-
*
|
|
167
|
-
* ## What this proxy CANNOT see
|
|
168
|
-
*
|
|
169
|
-
* - Whether the agent READ the response, reasoned over it, or wrote a better answer from it. There
|
|
170
|
-
* is no signal for that anywhere, and this must not be mistaken for one.
|
|
171
|
-
* - Anything that happens between two Reticle calls: source edits, calls to other MCP servers, a
|
|
172
|
-
* turn ending, a human interrupting. A long gap is invisible and reads as adjacency.
|
|
173
|
-
* - Reads that name no ref or target (a whole-page snapshot). They land in `readOther`, never in
|
|
174
|
-
* `refetched`, so a snapshot that duplicated the context is under-counted, not over-counted.
|
|
175
|
-
* - Causation. `acted` is proximity in a call sequence, nothing more. An agent that would have acted
|
|
176
|
-
* anyway is indistinguishable from one the context unblocked.
|
|
177
|
-
* - `reticle_context` called with no session connected — it answers there by design, and there is no
|
|
178
|
-
* per-session ledger to record it against, so those calls are missing entirely.
|
|
179
|
-
* - Two agents driving one session. Their calls interleave into one sequence and "next call" stops
|
|
180
|
-
* meaning "next thing that agent did".
|
|
181
|
-
*/
|
|
182
|
-
export function foldFeatureCapture(input) {
|
|
183
|
-
const { calls, actions, intents } = input;
|
|
184
|
-
if (0 === calls.length && 0 === actions.length)
|
|
185
|
-
return { observed: false };
|
|
186
|
-
const established = establishedIndexes(actions);
|
|
187
|
-
const isRefetch = (call) => ReticleTool.CONTEXT !== call.tool &&
|
|
188
|
-
wasEstablished(established, call.subject, call.afterActions);
|
|
189
|
-
let acted = 0;
|
|
190
|
-
let refetched = 0;
|
|
191
|
-
let readOther = 0;
|
|
192
|
-
let nothingAfter = 0;
|
|
193
|
-
const atSteps = [];
|
|
194
|
-
calls.forEach((call, i) => {
|
|
195
|
-
if (ReticleTool.CONTEXT !== call.tool)
|
|
196
|
-
return;
|
|
197
|
-
atSteps.push(call.afterActions);
|
|
198
|
-
const next = calls[i + 1];
|
|
199
|
-
if (next === undefined) {
|
|
200
|
-
if (input.finalActions > call.afterActions)
|
|
201
|
-
acted += 1;
|
|
202
|
-
else
|
|
203
|
-
nothingAfter += 1;
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
if (next.afterActions > call.afterActions)
|
|
207
|
-
acted += 1;
|
|
208
|
-
else if (isRefetch(next))
|
|
209
|
-
refetched += 1;
|
|
210
|
-
else
|
|
211
|
-
readOther += 1;
|
|
212
|
-
});
|
|
213
|
-
// A verdict is any journal action carrying the bounded verdict effect both verification tools
|
|
214
|
-
// write. Parsed with core's own schema rather than a local shape, for the usual reason.
|
|
215
|
-
const verdicts = actions.filter((a) => JournalVerdictEffectSchema.safeParse(a.effect).success);
|
|
216
|
-
return {
|
|
217
|
-
observed: true,
|
|
218
|
-
...(input.dropped > 0 ? { truncated: true } : {}),
|
|
219
|
-
context: { calls: atSteps.length, atSteps, acted, refetched, readOther, nothingAfter },
|
|
220
|
-
intents: {
|
|
221
|
-
declared: intents.length,
|
|
222
|
-
open: intents.filter((it) => IntentState.PROVED !== it.state).length,
|
|
223
|
-
},
|
|
224
|
-
missed: {
|
|
225
|
-
// The coarse question, asked honestly. Nothing binds a verdict to a specific intent outside
|
|
226
|
-
// flow replay, so "covered" cannot mean "this intent proves this verdict" without inventing a
|
|
227
|
-
// link Reticle cannot observe — the same reason `undeclared-change.ts` asks only whether
|
|
228
|
-
// anything at all was declared. So this counts verdicts drawn against an EMPTY ledger, and
|
|
229
|
-
// stops at zero once anything is declared. That zero is not a claim that every verdict was
|
|
230
|
-
// covered; it is the end of what this can see.
|
|
231
|
-
verdictsWithNoIntentDeclared: 0 === intents.length ? verdicts.length : 0,
|
|
232
|
-
refetchedEstablished: calls.filter(isRefetch).length,
|
|
233
|
-
},
|
|
234
|
-
};
|
|
235
|
-
}
|