@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
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which project a shared-memory read is about, on the wire and in the response.
|
|
3
|
+
*
|
|
4
|
+
* `GET /v1/memory` used to be asked with the API key and `?subject`, and nothing else. The key covers
|
|
5
|
+
* a whole workspace, and a workspace can hold more than one repo: a `cloud.json` naming project B was
|
|
6
|
+
* read with a key that also reaches project A, so B's agent could be handed A's "established
|
|
7
|
+
* knowledge" and never know it. Two repos, one key, and the wrong one's facts arrive looking exactly
|
|
8
|
+
* like the right one's.
|
|
9
|
+
*
|
|
10
|
+
* The link file has always known the answer — `resolveProjectCloud` returns it as `projectId`, and
|
|
11
|
+
* every reader simply did not pass it on.
|
|
12
|
+
*
|
|
13
|
+
* ## Why the envelope, and not the entries
|
|
14
|
+
*
|
|
15
|
+
* Sending `projectId` is the fix, and it only works once the platform filters on it. Against a server
|
|
16
|
+
* that does not know the parameter yet, the client would go on being handed the whole workspace and
|
|
17
|
+
* would report it as this project's knowledge — the same lie, now with a parameter in the URL that
|
|
18
|
+
* makes it look handled. So the response is checked here too, and WHERE it is checked is the lesson:
|
|
19
|
+
* the platform puts the project id on the response ENVELOPE — `{ projectId, entries }` — and not on
|
|
20
|
+
* each entry. An entry-level filter therefore matched nothing, kept everything, and read as a fix
|
|
21
|
+
* while being none. `scopeOfMemoryResponse` reads the envelope and refuses the whole response when
|
|
22
|
+
* it names another project, or names none.
|
|
23
|
+
*
|
|
24
|
+
* The entry-level filter stays as a second pass. It is redundant against the platform's real shape,
|
|
25
|
+
* and it is the right answer against a server that labels entries instead — cheap to keep, and
|
|
26
|
+
* nothing here rests on it.
|
|
27
|
+
*
|
|
28
|
+
* ## Every reader, and that word is load-bearing
|
|
29
|
+
*
|
|
30
|
+
* Three callers read this endpoint: the `reticle_memory` tool, flow replay's automatic consultation,
|
|
31
|
+
* and `reticle memory` at a terminal. The first cut gave the first two an entry-level filter and the
|
|
32
|
+
* third the parameter alone, while a comment claimed all three were covered — and none of the three
|
|
33
|
+
* was, because the project id arrives on the envelope. They now share `scopedMemoryEntries`, so a
|
|
34
|
+
* fourth reader cannot get a different answer than the other three.
|
|
35
|
+
*
|
|
36
|
+
* Lives beside `cloud-sync.ts` rather than in `recall/` because that is where the other platform path
|
|
37
|
+
* constants live, and because both readers already reach this directory: a home under `recall/` would
|
|
38
|
+
* make `flows` reach a directory it never needed.
|
|
39
|
+
*/
|
|
40
|
+
/**
|
|
41
|
+
* The wire names, spelled once.
|
|
42
|
+
*
|
|
43
|
+
* `PROJECT_ID` is a request parameter AND a response field. They are the same word on purpose — the
|
|
44
|
+
* server echoes back what it was asked about — and one constant keeps a rename from moving only one
|
|
45
|
+
* of the two, which would silently restore the unfiltered read. `SUBJECT` is a request parameter only
|
|
46
|
+
* and is named for the same reason: it is a spelling the platform owns, not ours.
|
|
47
|
+
*/
|
|
48
|
+
export declare const MemoryScopeField: {
|
|
49
|
+
readonly PROJECT_ID: "projectId";
|
|
50
|
+
readonly SUBJECT: "subject";
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* What a read is asked about: the linked project, and optionally one subject within it.
|
|
54
|
+
*
|
|
55
|
+
* `projectId` takes `null` as well as `undefined`, because that is the shape `resolveProjectCloud`
|
|
56
|
+
* already answers with — "the link declared none" is one fact, and making every caller spell the
|
|
57
|
+
* conversion is how a reader starts wondering whether the two spellings mean different things.
|
|
58
|
+
*/
|
|
59
|
+
export interface MemoryReadScope {
|
|
60
|
+
/** The cloud project the link file names. Absent, `null` and empty all mean "no project to name". */
|
|
61
|
+
projectId: string | null | undefined;
|
|
62
|
+
subject?: string | undefined;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Who a memory read is for. An agent's read names the agent and the platform counts it as a
|
|
66
|
+
* consultation; the daemon's sync names its purpose and is never counted as one.
|
|
67
|
+
*/
|
|
68
|
+
export declare const MemoryReadHeader: {
|
|
69
|
+
readonly AGENT: "x-reticle-agent";
|
|
70
|
+
readonly PURPOSE: "x-reticle-read-purpose";
|
|
71
|
+
};
|
|
72
|
+
export declare const MemoryReadPurpose: {
|
|
73
|
+
readonly SYNC: "sync";
|
|
74
|
+
};
|
|
75
|
+
/**
|
|
76
|
+
* The headers of an agent's memory read: the key, and the agent whose call made the read. A replay's
|
|
77
|
+
* read went without the agent, and the platform credited it to "an agent that did not name itself".
|
|
78
|
+
* No agent is named when no single agent made the call: a guess would credit the wrong one.
|
|
79
|
+
*/
|
|
80
|
+
export declare function memoryReadHeaders(apiKey: string): Record<string, string>;
|
|
81
|
+
/**
|
|
82
|
+
* The URL for one memory read.
|
|
83
|
+
*
|
|
84
|
+
* Encoded with `encodeURIComponent` rather than `URLSearchParams`, which spells a space `+`. Both are
|
|
85
|
+
* valid in a query string and the server may accept either — but this is a URL a test asserts against
|
|
86
|
+
* and a person reads in a log, and one spelling is easier to reason about than two.
|
|
87
|
+
*/
|
|
88
|
+
export declare function memoryReadUrl(baseUrl: string, scope: MemoryReadScope): string;
|
|
89
|
+
/**
|
|
90
|
+
* Drop the entries that state they belong to another project.
|
|
91
|
+
*
|
|
92
|
+
* The field is read defensively because the wire is somebody else's server: a number, an object or an
|
|
93
|
+
* absent key all mean "this entry does not say", and only a non-empty string that disagrees is enough
|
|
94
|
+
* to refuse one. See the note above for why silence is kept rather than dropped.
|
|
95
|
+
*/
|
|
96
|
+
export declare function keepOwnProject(entries: readonly unknown[], projectId: string | null | undefined): unknown[];
|
|
97
|
+
/**
|
|
98
|
+
* Whether a memory response can be read as THIS project's knowledge.
|
|
99
|
+
*
|
|
100
|
+
* The platform puts the project id on the response ENVELOPE, not on each entry (see the module note).
|
|
101
|
+
* Reading it there is the only check that works against the real shape: an entry-level filter sees no
|
|
102
|
+
* project field at all and keeps everything, so a server that ignores the request parameter — or
|
|
103
|
+
* resolves the key to a different project — hands back a whole workspace under this project's
|
|
104
|
+
* heading with nothing to distinguish it.
|
|
105
|
+
*/
|
|
106
|
+
export declare const MemoryResponseScope: {
|
|
107
|
+
/** The envelope names the project this read asked about. Its entries may be read. */
|
|
108
|
+
readonly OWN: "own";
|
|
109
|
+
/** The envelope names a DIFFERENT project. Nothing in it belongs to this one. */
|
|
110
|
+
readonly OTHER: "other";
|
|
111
|
+
/**
|
|
112
|
+
* The envelope does not say which project it is about — an older server, or a shape we do not
|
|
113
|
+
* know. Unverifiable, which is NOT the same as empty and must not be shown as though it were.
|
|
114
|
+
*/
|
|
115
|
+
readonly UNSCOPED: "unscoped";
|
|
116
|
+
/**
|
|
117
|
+
* This read named no project to begin with, so there is nothing for the envelope to contradict.
|
|
118
|
+
* The env-credential path with no `cloud.json`: CI, and a single-project setup that never linked.
|
|
119
|
+
*/
|
|
120
|
+
readonly NOT_ASKED: "not-asked";
|
|
121
|
+
};
|
|
122
|
+
export type MemoryResponseScope = (typeof MemoryResponseScope)[keyof typeof MemoryResponseScope];
|
|
123
|
+
/** The two verdicts that permit reading the entries. Named so no caller re-derives the pair. */
|
|
124
|
+
export declare const isReadableMemoryScope: (scope: MemoryResponseScope) => boolean;
|
|
125
|
+
/**
|
|
126
|
+
* What the envelope says about which project this response is about.
|
|
127
|
+
*
|
|
128
|
+
* A missing or non-string field is `UNSCOPED` rather than a mismatch: the wire is somebody else's
|
|
129
|
+
* server, and "this response never said" is a different fact from "this response named a rival".
|
|
130
|
+
* Both refuse; only the message a reader shows differs.
|
|
131
|
+
*/
|
|
132
|
+
export declare function scopeOfMemoryResponse(body: unknown, projectId: string | null | undefined): MemoryResponseScope;
|
|
133
|
+
/**
|
|
134
|
+
* The entries a reader may treat as this project's, or `undefined` when the response cannot be read
|
|
135
|
+
* that way at all.
|
|
136
|
+
*
|
|
137
|
+
* `undefined` is the point of the return type. Three callers need three different sentences and none
|
|
138
|
+
* of them is a list: the tool reports `UNVERIFIED`, the CLI refuses out loud, and replay attaches
|
|
139
|
+
* nothing. "This project knows nothing" and "the server answered about something else" are different
|
|
140
|
+
* facts, and only the first is safe to act on.
|
|
141
|
+
*/
|
|
142
|
+
export declare function scopedMemoryEntries(body: unknown, projectId: string | null | undefined): unknown[] | undefined;
|
|
143
|
+
/**
|
|
144
|
+
* The same filter, for a caller that prints the server's envelope rather than reading a list.
|
|
145
|
+
*
|
|
146
|
+
* `reticle memory` writes the response to stdout as JSON, so filtering has to preserve every other
|
|
147
|
+
* field the server sent and replace only `entries`. A body whose `entries` is not an array is handed
|
|
148
|
+
* back as it arrived: at that point the envelope has already been accepted, and guessing further is
|
|
149
|
+
* how a diagnostic command starts dropping the thing it was asked to print.
|
|
150
|
+
*
|
|
151
|
+
* It REFUSES on its own, answering `undefined` for a body it cannot show to be this project's. It
|
|
152
|
+
* used to hand the body back and leave the check to a JSDoc line telling callers to run
|
|
153
|
+
* `scopeOfMemoryResponse` first — which is the exact failure this module documents, written one
|
|
154
|
+
* function below the lesson. A reader that hands a body back cannot refuse it: the day somebody
|
|
155
|
+
* calls this first, a sibling project's knowledge goes to stdout with nothing to stop it. The
|
|
156
|
+
* `undefined` is what makes the unsafe call unexpressible rather than merely discouraged — a caller
|
|
157
|
+
* cannot print what it was not handed.
|
|
158
|
+
*
|
|
159
|
+
* The caller therefore checks for `undefined` and refuses out loud, instead of asking twice.
|
|
160
|
+
*/
|
|
161
|
+
export declare function scopeMemoryResponse(body: unknown, projectId: string | null | undefined): unknown;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Which project a shared-memory read is about, on the wire and in the response.
|
|
3
|
+
*
|
|
4
|
+
* `GET /v1/memory` used to be asked with the API key and `?subject`, and nothing else. The key covers
|
|
5
|
+
* a whole workspace, and a workspace can hold more than one repo: a `cloud.json` naming project B was
|
|
6
|
+
* read with a key that also reaches project A, so B's agent could be handed A's "established
|
|
7
|
+
* knowledge" and never know it. Two repos, one key, and the wrong one's facts arrive looking exactly
|
|
8
|
+
* like the right one's.
|
|
9
|
+
*
|
|
10
|
+
* The link file has always known the answer — `resolveProjectCloud` returns it as `projectId`, and
|
|
11
|
+
* every reader simply did not pass it on.
|
|
12
|
+
*
|
|
13
|
+
* ## Why the envelope, and not the entries
|
|
14
|
+
*
|
|
15
|
+
* Sending `projectId` is the fix, and it only works once the platform filters on it. Against a server
|
|
16
|
+
* that does not know the parameter yet, the client would go on being handed the whole workspace and
|
|
17
|
+
* would report it as this project's knowledge — the same lie, now with a parameter in the URL that
|
|
18
|
+
* makes it look handled. So the response is checked here too, and WHERE it is checked is the lesson:
|
|
19
|
+
* the platform puts the project id on the response ENVELOPE — `{ projectId, entries }` — and not on
|
|
20
|
+
* each entry. An entry-level filter therefore matched nothing, kept everything, and read as a fix
|
|
21
|
+
* while being none. `scopeOfMemoryResponse` reads the envelope and refuses the whole response when
|
|
22
|
+
* it names another project, or names none.
|
|
23
|
+
*
|
|
24
|
+
* The entry-level filter stays as a second pass. It is redundant against the platform's real shape,
|
|
25
|
+
* and it is the right answer against a server that labels entries instead — cheap to keep, and
|
|
26
|
+
* nothing here rests on it.
|
|
27
|
+
*
|
|
28
|
+
* ## Every reader, and that word is load-bearing
|
|
29
|
+
*
|
|
30
|
+
* Three callers read this endpoint: the `reticle_memory` tool, flow replay's automatic consultation,
|
|
31
|
+
* and `reticle memory` at a terminal. The first cut gave the first two an entry-level filter and the
|
|
32
|
+
* third the parameter alone, while a comment claimed all three were covered — and none of the three
|
|
33
|
+
* was, because the project id arrives on the envelope. They now share `scopedMemoryEntries`, so a
|
|
34
|
+
* fourth reader cannot get a different answer than the other three.
|
|
35
|
+
*
|
|
36
|
+
* Lives beside `cloud-sync.ts` rather than in `recall/` because that is where the other platform path
|
|
37
|
+
* constants live, and because both readers already reach this directory: a home under `recall/` would
|
|
38
|
+
* make `flows` reach a directory it never needed.
|
|
39
|
+
*/
|
|
40
|
+
import { callingClientName } from '../../hooks/coding-agents.js';
|
|
41
|
+
/**
|
|
42
|
+
* The path this module builds, spelled once, for the same reason as the names below.
|
|
43
|
+
*
|
|
44
|
+
* Here rather than in `cloud-sync.ts`'s group of `CLOUD_*_PATH` constants: that group describes the
|
|
45
|
+
* calls THAT file makes, and cloud-sync has no memory reader at all. Adding this one there would make
|
|
46
|
+
* the group a registry of every endpoint in the package rather than a description of one file's calls.
|
|
47
|
+
*/
|
|
48
|
+
const CLOUD_MEMORY_PATH = '/v1/memory';
|
|
49
|
+
/**
|
|
50
|
+
* The wire names, spelled once.
|
|
51
|
+
*
|
|
52
|
+
* `PROJECT_ID` is a request parameter AND a response field. They are the same word on purpose — the
|
|
53
|
+
* server echoes back what it was asked about — and one constant keeps a rename from moving only one
|
|
54
|
+
* of the two, which would silently restore the unfiltered read. `SUBJECT` is a request parameter only
|
|
55
|
+
* and is named for the same reason: it is a spelling the platform owns, not ours.
|
|
56
|
+
*/
|
|
57
|
+
export const MemoryScopeField = {
|
|
58
|
+
PROJECT_ID: 'projectId',
|
|
59
|
+
SUBJECT: 'subject',
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* The project id to name, or `undefined` when there is none.
|
|
63
|
+
*
|
|
64
|
+
* `null`, `undefined` and `''` all say the same thing and all arrive in practice: `resolveProjectCloud`
|
|
65
|
+
* answers `null` when the link declares nothing, an absent argument is `undefined`, and a truncated
|
|
66
|
+
* config gives `''`. One helper, so the URL builder and the response filter cannot disagree about
|
|
67
|
+
* which of them counts as unscoped — a disagreement that would send `?projectId=` and come back
|
|
68
|
+
* empty, which reads as "this project knows nothing" rather than as a bug.
|
|
69
|
+
*
|
|
70
|
+
* Returns the id rather than a boolean so callers get the narrowing with it. A `boolean` predicate
|
|
71
|
+
* would leave `string | null | undefined` as-is and force a `String(...)` at the call site, which is
|
|
72
|
+
* a cast dressed up as a conversion.
|
|
73
|
+
*/
|
|
74
|
+
const projectToName = (projectId) => 'string' === typeof projectId && projectId.length > 0 ? projectId : undefined;
|
|
75
|
+
/**
|
|
76
|
+
* Who a memory read is for. An agent's read names the agent and the platform counts it as a
|
|
77
|
+
* consultation; the daemon's sync names its purpose and is never counted as one.
|
|
78
|
+
*/
|
|
79
|
+
export const MemoryReadHeader = {
|
|
80
|
+
AGENT: 'x-reticle-agent',
|
|
81
|
+
PURPOSE: 'x-reticle-read-purpose',
|
|
82
|
+
};
|
|
83
|
+
export const MemoryReadPurpose = { SYNC: 'sync' };
|
|
84
|
+
/**
|
|
85
|
+
* The headers of an agent's memory read: the key, and the agent whose call made the read. A replay's
|
|
86
|
+
* read went without the agent, and the platform credited it to "an agent that did not name itself".
|
|
87
|
+
* No agent is named when no single agent made the call: a guess would credit the wrong one.
|
|
88
|
+
*/
|
|
89
|
+
export function memoryReadHeaders(apiKey) {
|
|
90
|
+
const agent = callingClientName();
|
|
91
|
+
return {
|
|
92
|
+
authorization: `Bearer ${apiKey}`,
|
|
93
|
+
...(agent === undefined ? {} : { [MemoryReadHeader.AGENT]: agent }),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* The URL for one memory read.
|
|
98
|
+
*
|
|
99
|
+
* Encoded with `encodeURIComponent` rather than `URLSearchParams`, which spells a space `+`. Both are
|
|
100
|
+
* valid in a query string and the server may accept either — but this is a URL a test asserts against
|
|
101
|
+
* and a person reads in a log, and one spelling is easier to reason about than two.
|
|
102
|
+
*/
|
|
103
|
+
export function memoryReadUrl(baseUrl, scope) {
|
|
104
|
+
const parts = [];
|
|
105
|
+
if (scope.subject !== undefined) {
|
|
106
|
+
parts.push(`${MemoryScopeField.SUBJECT}=${encodeURIComponent(scope.subject)}`);
|
|
107
|
+
}
|
|
108
|
+
const projectId = projectToName(scope.projectId);
|
|
109
|
+
if (projectId !== undefined) {
|
|
110
|
+
parts.push(`${MemoryScopeField.PROJECT_ID}=${encodeURIComponent(projectId)}`);
|
|
111
|
+
}
|
|
112
|
+
const url = `${baseUrl}${CLOUD_MEMORY_PATH}`;
|
|
113
|
+
return 0 === parts.length ? url : `${url}?${parts.join('&')}`;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Drop the entries that state they belong to another project.
|
|
117
|
+
*
|
|
118
|
+
* The field is read defensively because the wire is somebody else's server: a number, an object or an
|
|
119
|
+
* absent key all mean "this entry does not say", and only a non-empty string that disagrees is enough
|
|
120
|
+
* to refuse one. See the note above for why silence is kept rather than dropped.
|
|
121
|
+
*/
|
|
122
|
+
export function keepOwnProject(entries, projectId) {
|
|
123
|
+
const mine = projectToName(projectId);
|
|
124
|
+
if (mine === undefined)
|
|
125
|
+
return [...entries];
|
|
126
|
+
return entries.filter((entry) => {
|
|
127
|
+
if (null === entry || 'object' !== typeof entry)
|
|
128
|
+
return true;
|
|
129
|
+
const stated = entry[MemoryScopeField.PROJECT_ID];
|
|
130
|
+
if ('string' !== typeof stated || 0 === stated.length)
|
|
131
|
+
return true;
|
|
132
|
+
return stated === mine;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Whether a memory response can be read as THIS project's knowledge.
|
|
137
|
+
*
|
|
138
|
+
* The platform puts the project id on the response ENVELOPE, not on each entry (see the module note).
|
|
139
|
+
* Reading it there is the only check that works against the real shape: an entry-level filter sees no
|
|
140
|
+
* project field at all and keeps everything, so a server that ignores the request parameter — or
|
|
141
|
+
* resolves the key to a different project — hands back a whole workspace under this project's
|
|
142
|
+
* heading with nothing to distinguish it.
|
|
143
|
+
*/
|
|
144
|
+
export const MemoryResponseScope = {
|
|
145
|
+
/** The envelope names the project this read asked about. Its entries may be read. */
|
|
146
|
+
OWN: 'own',
|
|
147
|
+
/** The envelope names a DIFFERENT project. Nothing in it belongs to this one. */
|
|
148
|
+
OTHER: 'other',
|
|
149
|
+
/**
|
|
150
|
+
* The envelope does not say which project it is about — an older server, or a shape we do not
|
|
151
|
+
* know. Unverifiable, which is NOT the same as empty and must not be shown as though it were.
|
|
152
|
+
*/
|
|
153
|
+
UNSCOPED: 'unscoped',
|
|
154
|
+
/**
|
|
155
|
+
* This read named no project to begin with, so there is nothing for the envelope to contradict.
|
|
156
|
+
* The env-credential path with no `cloud.json`: CI, and a single-project setup that never linked.
|
|
157
|
+
*/
|
|
158
|
+
NOT_ASKED: 'not-asked',
|
|
159
|
+
};
|
|
160
|
+
/** The two verdicts that permit reading the entries. Named so no caller re-derives the pair. */
|
|
161
|
+
export const isReadableMemoryScope = (scope) => MemoryResponseScope.OWN === scope || MemoryResponseScope.NOT_ASKED === scope;
|
|
162
|
+
/**
|
|
163
|
+
* What the envelope says about which project this response is about.
|
|
164
|
+
*
|
|
165
|
+
* A missing or non-string field is `UNSCOPED` rather than a mismatch: the wire is somebody else's
|
|
166
|
+
* server, and "this response never said" is a different fact from "this response named a rival".
|
|
167
|
+
* Both refuse; only the message a reader shows differs.
|
|
168
|
+
*/
|
|
169
|
+
export function scopeOfMemoryResponse(body, projectId) {
|
|
170
|
+
const mine = projectToName(projectId);
|
|
171
|
+
if (mine === undefined)
|
|
172
|
+
return MemoryResponseScope.NOT_ASKED;
|
|
173
|
+
if (null === body || 'object' !== typeof body)
|
|
174
|
+
return MemoryResponseScope.UNSCOPED;
|
|
175
|
+
const stated = body[MemoryScopeField.PROJECT_ID];
|
|
176
|
+
if ('string' !== typeof stated || 0 === stated.length)
|
|
177
|
+
return MemoryResponseScope.UNSCOPED;
|
|
178
|
+
return stated === mine ? MemoryResponseScope.OWN : MemoryResponseScope.OTHER;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* The entries a reader may treat as this project's, or `undefined` when the response cannot be read
|
|
182
|
+
* that way at all.
|
|
183
|
+
*
|
|
184
|
+
* `undefined` is the point of the return type. Three callers need three different sentences and none
|
|
185
|
+
* of them is a list: the tool reports `UNVERIFIED`, the CLI refuses out loud, and replay attaches
|
|
186
|
+
* nothing. "This project knows nothing" and "the server answered about something else" are different
|
|
187
|
+
* facts, and only the first is safe to act on.
|
|
188
|
+
*/
|
|
189
|
+
export function scopedMemoryEntries(body, projectId) {
|
|
190
|
+
if (!isReadableMemoryScope(scopeOfMemoryResponse(body, projectId)))
|
|
191
|
+
return undefined;
|
|
192
|
+
if (null === body || 'object' !== typeof body)
|
|
193
|
+
return undefined;
|
|
194
|
+
const entries = body['entries'];
|
|
195
|
+
if (!Array.isArray(entries))
|
|
196
|
+
return undefined;
|
|
197
|
+
return keepOwnProject(entries, projectId);
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* The same filter, for a caller that prints the server's envelope rather than reading a list.
|
|
201
|
+
*
|
|
202
|
+
* `reticle memory` writes the response to stdout as JSON, so filtering has to preserve every other
|
|
203
|
+
* field the server sent and replace only `entries`. A body whose `entries` is not an array is handed
|
|
204
|
+
* back as it arrived: at that point the envelope has already been accepted, and guessing further is
|
|
205
|
+
* how a diagnostic command starts dropping the thing it was asked to print.
|
|
206
|
+
*
|
|
207
|
+
* It REFUSES on its own, answering `undefined` for a body it cannot show to be this project's. It
|
|
208
|
+
* used to hand the body back and leave the check to a JSDoc line telling callers to run
|
|
209
|
+
* `scopeOfMemoryResponse` first — which is the exact failure this module documents, written one
|
|
210
|
+
* function below the lesson. A reader that hands a body back cannot refuse it: the day somebody
|
|
211
|
+
* calls this first, a sibling project's knowledge goes to stdout with nothing to stop it. The
|
|
212
|
+
* `undefined` is what makes the unsafe call unexpressible rather than merely discouraged — a caller
|
|
213
|
+
* cannot print what it was not handed.
|
|
214
|
+
*
|
|
215
|
+
* The caller therefore checks for `undefined` and refuses out loud, instead of asking twice.
|
|
216
|
+
*/
|
|
217
|
+
export function scopeMemoryResponse(body, projectId) {
|
|
218
|
+
if (!isReadableMemoryScope(scopeOfMemoryResponse(body, projectId)))
|
|
219
|
+
return undefined;
|
|
220
|
+
if (null === body || 'object' !== typeof body)
|
|
221
|
+
return undefined;
|
|
222
|
+
const envelope = body;
|
|
223
|
+
const entries = envelope['entries'];
|
|
224
|
+
if (!Array.isArray(entries))
|
|
225
|
+
return body;
|
|
226
|
+
return { ...envelope, entries: keepOwnProject(entries, projectId) };
|
|
227
|
+
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
+
import { type ScreenshotSyncState } from './sync-screenshots.js';
|
|
1
2
|
/**
|
|
2
3
|
* The derived records that ride along with runs, and the file each one lives in.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
5
|
+
* One list, so adding a record is one line and cannot be half-done: the bundle, the hashing, the
|
|
6
|
+
* reporting and the disk source (`sync-disk.ts`) all read it.
|
|
6
7
|
*/
|
|
7
|
-
declare const DERIVED_RECORDS: readonly [{
|
|
8
|
+
export declare const DERIVED_RECORDS: readonly [{
|
|
8
9
|
readonly kind: "impact";
|
|
9
10
|
readonly file: "impact.json";
|
|
10
11
|
}, {
|
|
@@ -19,6 +20,12 @@ declare const DERIVED_RECORDS: readonly [{
|
|
|
19
20
|
}, {
|
|
20
21
|
readonly kind: "assertion-tiers";
|
|
21
22
|
readonly file: "assertion-tiers.json";
|
|
23
|
+
}, {
|
|
24
|
+
readonly kind: "coverage";
|
|
25
|
+
readonly file: "coverage.json";
|
|
26
|
+
}, {
|
|
27
|
+
readonly kind: "notes";
|
|
28
|
+
readonly file: "notes.json";
|
|
22
29
|
}];
|
|
23
30
|
type DerivedKind = (typeof DERIVED_RECORDS)[number]['kind'];
|
|
24
31
|
/** What the machine reads from disk. Injected so a cycle is testable with no filesystem at all. */
|
|
@@ -28,18 +35,20 @@ export interface SyncSource {
|
|
|
28
35
|
runId: string;
|
|
29
36
|
payload: unknown;
|
|
30
37
|
}>;
|
|
31
|
-
/** Every saved flow.
|
|
38
|
+
/** Every saved flow. Upserted by name, so the set is sent only when it changed. */
|
|
32
39
|
flows: () => readonly unknown[];
|
|
33
40
|
/**
|
|
34
41
|
* Every bug capsule on disk — the minimal failing flow that reproduces a defect, plus its evidence.
|
|
35
42
|
*
|
|
36
|
-
*
|
|
43
|
+
* Sent like flows, only when the set changed: upserted by id, and worth nothing on the
|
|
37
44
|
* machine that found the bug. A verdict count tells a dashboard THAT something broke; the capsule
|
|
38
45
|
* is the only artifact that lets somebody else make it break again.
|
|
39
46
|
*/
|
|
40
47
|
capsules: () => readonly unknown[];
|
|
41
48
|
/** One derived record, or undefined when the file is absent. */
|
|
42
49
|
derived: (kind: DerivedKind) => unknown;
|
|
50
|
+
/** One step screenshot of a run. Absent when this project keeps its screenshots local. */
|
|
51
|
+
screenshot?: (runId: string, file: string) => Uint8Array | undefined;
|
|
43
52
|
}
|
|
44
53
|
/** What the machine writes back. Separated from reads so a dry run is a source with no sink. */
|
|
45
54
|
export interface SyncSink {
|
|
@@ -60,7 +69,7 @@ export interface PulledIssues {
|
|
|
60
69
|
triage: Record<string, PulledIssue>;
|
|
61
70
|
}
|
|
62
71
|
/** `.reticle/cloud-state.json`. This machine's side of the conversation, never git-checked. */
|
|
63
|
-
export interface CloudSyncState {
|
|
72
|
+
export interface CloudSyncState extends ScreenshotSyncState {
|
|
64
73
|
/** Opaque. Handed back to the server verbatim; the machine must never parse or invent one. */
|
|
65
74
|
cursor?: string;
|
|
66
75
|
lastPushAt?: number;
|
|
@@ -98,6 +107,21 @@ export interface CloudSyncState {
|
|
|
98
107
|
*/
|
|
99
108
|
sentFlowsHash?: string;
|
|
100
109
|
sentCapsulesHash?: string;
|
|
110
|
+
/**
|
|
111
|
+
* The hash of each derived record the platform last ACCEPTED from here. A platform that reports
|
|
112
|
+
* a hash of its own form of a record never matches ours, so the same record went every cycle.
|
|
113
|
+
*/
|
|
114
|
+
sentDerivedHashes?: Record<string, string>;
|
|
115
|
+
/** The names of the flows the platform last took from here: one gone from disk is deleted there. */
|
|
116
|
+
sentFlowNames?: string[];
|
|
117
|
+
/**
|
|
118
|
+
* The link everything above was kept for: cloud, workspace and project (`credentialSlot`). A
|
|
119
|
+
* folder re-linked elsewhere starts a fresh record, so the new link gets the flows the old one
|
|
120
|
+
* already had, and none of the old link's runs.
|
|
121
|
+
*/
|
|
122
|
+
link?: string;
|
|
123
|
+
/** When this folder was re-linked: runs made before it stay here unless the person moves them. */
|
|
124
|
+
linkedAt?: number;
|
|
101
125
|
/**
|
|
102
126
|
* A flow or capsule set the platform refused, kept so the refusal stays visible on the cycles that
|
|
103
127
|
* do not resend it, and so the set is offered again once it changes or the platform reads more.
|
|
@@ -125,6 +149,8 @@ export interface SyncReport {
|
|
|
125
149
|
ok: boolean;
|
|
126
150
|
/** Runs the server accepted this cycle. */
|
|
127
151
|
runsSent: number;
|
|
152
|
+
/** Step screenshots the server took this cycle, for runs it holds. */
|
|
153
|
+
screenshotsSent?: number;
|
|
128
154
|
/** Runs it refused, with the reason, so a bad artifact is visible rather than silently stuck. */
|
|
129
155
|
runsRejected: Array<{
|
|
130
156
|
index: number;
|
|
@@ -183,6 +209,12 @@ interface SyncDeps {
|
|
|
183
209
|
url: string;
|
|
184
210
|
apiKey: string;
|
|
185
211
|
};
|
|
212
|
+
/** The link this cycle sends for (`credentialSlot`); absent for an env-only key (CI). */
|
|
213
|
+
link?: string;
|
|
214
|
+
/** Send runs made under a previous link too: only ever because the person asked. */
|
|
215
|
+
moveHistory?: boolean;
|
|
216
|
+
/** The project flows are synced for. Absent when this cycle does not send flows: none is deleted. */
|
|
217
|
+
projectId?: string;
|
|
186
218
|
source: SyncSource;
|
|
187
219
|
sink: SyncSink;
|
|
188
220
|
state: CloudSyncState;
|
|
@@ -197,11 +229,16 @@ interface SyncDeps {
|
|
|
197
229
|
text: string;
|
|
198
230
|
}>;
|
|
199
231
|
}
|
|
232
|
+
/** The server's per-part answer: accepted count and rejection list, each read defensively. */
|
|
233
|
+
/** A 200 that never confirmed the runs it was sent. Kept queued, and said, rather than dropped. */
|
|
234
|
+
export declare const MSG_RUNS_UNCONFIRMED = "sync 200 without a runs result: the server did not confirm the runs it was sent, so they stay queued";
|
|
200
235
|
/**
|
|
201
236
|
* Run one cycle. Never throws: the local record is already safe on disk, and a sync that can take
|
|
202
237
|
* down the thing it is backing up is worse than no sync.
|
|
203
238
|
*/
|
|
204
|
-
|
|
239
|
+
/** The command that moves a folder's earlier runs to the link it has now. */
|
|
240
|
+
export declare const MOVE_HISTORY_COMMAND = "reticle sync --move-history";
|
|
241
|
+
export declare function runSyncCycle(given: SyncDeps): Promise<SyncReport>;
|
|
205
242
|
/** One line a human can read, for the CLI and the daemon log. */
|
|
206
243
|
export declare function describeSync(report: SyncReport): string;
|
|
207
244
|
export {};
|