@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
package/dist/index.js
CHANGED
|
@@ -1,31 +1,30 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { applyHarnessSwitch, harnessConfigsByRoot } from './memory/cloud/harness-config.js';
|
|
2
|
+
import { coveragePercents } from './features/exhaust/ledger.js';
|
|
3
|
+
import { agentWiring } from './portal/session/zero-install-first-call.js';
|
|
4
|
+
import { pushIfMoved, watchAccountFiles } from './memory/impact/account-watch.js';
|
|
5
|
+
import { SESSION_FILE } from './command/cli/cloud-kit.js';
|
|
4
6
|
import { join } from 'node:path';
|
|
5
|
-
import { existsSync, readFileSync } from 'node:fs';
|
|
6
7
|
import { homedir } from 'node:os';
|
|
7
|
-
import { linkedCloudPort,
|
|
8
|
+
import { linkedCloudPort, sessionCloudPort } from './memory/cloud/cloud-config.js';
|
|
9
|
+
import { sessionRoot } from './memory/project/session-root.js';
|
|
8
10
|
import { attachCloudSync } from './memory/cloud/sync-daemon.js';
|
|
9
11
|
import { wireHooks } from './hooks/hook-commands.js';
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
12
|
+
import { currentDrivenBy } from './hooks/driven-by.js';
|
|
13
|
+
import { artifactRootResolver } from './memory/project/artifact-root-resolver.js';
|
|
14
|
+
import { servingDirectoryOf } from './portal/session/serving-directory.js';
|
|
13
15
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
14
|
-
import { AGENT_STOPPED_NOTICE, RETICLE_DEFAULT_PORT,
|
|
15
|
-
import {
|
|
16
|
-
import { setBrowserMode, BrowserMode } from './telemetry/browser-mode.js';
|
|
17
|
-
import { replayAndLearn } from './language/flows/flow-learning.js';
|
|
16
|
+
import { AGENT_STOPPED_NOTICE, RETICLE_DEFAULT_PORT, ReticleCommand, ReticleDir, ReticleEnv, LOOPBACK_HOST, } from '@reticlehq/core';
|
|
17
|
+
import { replayFromHud } from './language/flows/replay-from-hud.js';
|
|
18
18
|
import { createSharedServer } from './surface/http-server.js';
|
|
19
19
|
import { openLoopbackAlias } from './command/daemon/binding/loopback-alias.js';
|
|
20
20
|
import { reportAppInstrumented } from './telemetry/app-instrumented.js';
|
|
21
21
|
import { resolveBridgeSecurityWithAutoToken } from './portal/bridge/bridge-security.js';
|
|
22
22
|
import { Bridge } from './portal/bridge/bridge.js';
|
|
23
|
-
import { sdkFixForDirectory } from './command/version/sdk-fix.js';
|
|
24
23
|
import { connectionSkew } from './command/version/version-nudge.js';
|
|
25
24
|
import { SERVER_VERSION } from './command/version/identity/server-version.js';
|
|
26
25
|
import { BaselineStore } from './memory/project/baselines.js';
|
|
27
26
|
import { RecordingStore } from './language/flows/recording/tape/recordings.js';
|
|
28
|
-
import { initImpact } from './memory/impact/impact-recorder.js';
|
|
27
|
+
import { initImpact, impactSnapshot } from './memory/impact/impact-recorder.js';
|
|
29
28
|
import { flowAuthor } from './language/flows/flow-author.js';
|
|
30
29
|
import { FlowStore } from './language/flows/flows.js';
|
|
31
30
|
import { buildFlowChips } from './language/flows/flow-scope.js';
|
|
@@ -40,37 +39,25 @@ import { createRunnerPort } from './judgement/runs/runner-port.js';
|
|
|
40
39
|
import { RunStore } from './judgement/runs/artifact/run-store.js';
|
|
41
40
|
import { startVerifyServer } from './judgement/runs/verify-server.js';
|
|
42
41
|
import { createMcpServer } from './surface/mcp/mcp.js';
|
|
42
|
+
import { instructionStateAt } from './surface/mcp/mcp-proxy.js';
|
|
43
43
|
import { LEASE_ACQUIRE_TOOL } from './surface/tools/lease-tools.js';
|
|
44
|
+
import { attachHudHarness, projectLinkOnly, startChatDrives } from './surface/tools/chat-drives.js';
|
|
44
45
|
import { runTool } from './surface/tools/invoke-tool.js';
|
|
45
46
|
import { SessionReaper, endAllSessions, MCP_DISCONNECT_SUMMARY, } from './portal/session/session-reaper.js';
|
|
46
47
|
import { wireSessionScope } from './portal/session/no-session-watch.js';
|
|
47
48
|
import { buildIdlePredicate, noteSetupHold } from './command/daemon/lifetime/daemon-usefulness.js';
|
|
48
49
|
import { resolveToolSurface } from './surface/tools/tool-surface.js';
|
|
49
50
|
import { statusPayload } from './status-payload.js';
|
|
50
|
-
import { CdpRealInputProvider, LaunchedRealInputProvider } from './portal/input/real-input.js';
|
|
51
|
-
import { cpus } from 'node:os';
|
|
52
|
-
import { BrowserPool } from './portal/pool/browser-pool.js';
|
|
53
51
|
import { AGENT_ALREADY_DRIVING_ELSEWHERE, shouldGreetWithLeaseNotice, } from './portal/session/lease-visibility.js';
|
|
54
|
-
import { playwrightLauncher, resolveMaxContexts } from './portal/pool/playwright-launcher.js';
|
|
55
52
|
import { LeaseReaper } from './portal/pool/lease-reaper.js';
|
|
56
|
-
import { findProjectConfig,
|
|
57
|
-
import { hasAnyProjectConnectedBefore } from './memory/recall/prior/connection-memory.js';
|
|
58
|
-
import { reticleStateHome } from './command/daemon/daemon.js';
|
|
53
|
+
import { findProjectConfig, readJournalEnabled, readProjectId, } from './command/cli/ports/resolve/cli-port.js';
|
|
59
54
|
import { probeLaunchableChromium } from './launch-chromium.js';
|
|
60
55
|
import { attachJournal } from './wire-journal.js';
|
|
61
56
|
import { reportOnboardingStep } from './telemetry/onboarding-funnel.js';
|
|
62
|
-
import { AMBIENT_RECORDING } from './language/flows/recording/tape/recordings.js';
|
|
63
57
|
import { readRetainPolicy } from './memory/journal/on-disk/retain-policy.js';
|
|
64
58
|
import { log } from './log.js';
|
|
65
|
-
import {
|
|
66
|
-
|
|
67
|
-
function replayVerdictLine(result) {
|
|
68
|
-
if (result.status === ReplayStatus.OK)
|
|
69
|
-
return `✓ "${result.name}" passed`;
|
|
70
|
-
if (result.status === ReplayStatus.DRIFT)
|
|
71
|
-
return `⚠ "${result.name}" drifted — a step no longer matches`;
|
|
72
|
-
return `✗ "${result.name}" failed — ${result.error?.message ?? 'could not replay'}`;
|
|
73
|
-
}
|
|
59
|
+
import { createBrowserPool, knownProjectRoots, loadHarnessConfig, makeNetworkDetailRouter, platformEnvFor, readerConnect, resolveRealInput, sdkFixForProject, } from './start-wiring.js';
|
|
60
|
+
export { replayVerdictLine } from './language/flows/replay-from-hud.js';
|
|
74
61
|
// Re-exported from the contract, where the names now live: a consumer importing the server should
|
|
75
62
|
// not have to know that the vocabulary moved.
|
|
76
63
|
export { ReticleTool } from '@reticlehq/core';
|
|
@@ -112,181 +99,21 @@ export { findContradictions } from '@reticlehq/engine/disagreement/contradiction
|
|
|
112
99
|
/** Default localhost port for the verify HTTP endpoint (see docs/platform-integration.md). */
|
|
113
100
|
export const RETICLE_VERIFY_DEFAULT_PORT = 7331;
|
|
114
101
|
export { resolveBridgeSecurity } from './portal/bridge/bridge-security.js';
|
|
115
|
-
/**
|
|
116
|
-
* Build the shared browser pool (one headless Chromium, N capped isolated leased contexts). Lazy —
|
|
117
|
-
* no Chromium launches until the first lease — so creating it is free even when never used.
|
|
118
|
-
*/
|
|
119
|
-
/** Where the zero-install reader connects: this daemon's own bridge, with its pairing token. */
|
|
120
|
-
function readerConnect(port, token) {
|
|
121
|
-
return { url: bridgeWsUrl(port), ...(token === undefined ? {} : { token }) };
|
|
122
|
-
}
|
|
123
|
-
function createBrowserPool(headless, reader) {
|
|
124
|
-
const maxContexts = resolveMaxContexts(process.env[ReticleEnv.MAX_CONTEXTS], cpus().length);
|
|
125
|
-
const genSessionId = () => `lease-${'function' === typeof globalThis.crypto?.randomUUID
|
|
126
|
-
? globalThis.crypto.randomUUID()
|
|
127
|
-
: String(Date.now())}`;
|
|
128
|
-
// Built on first use and kept: the page that needs it is one whose app never connected.
|
|
129
|
-
let script;
|
|
130
|
-
const zeroInstallScript = () => {
|
|
131
|
-
if (script === undefined) {
|
|
132
|
-
const bundle = readReaderBundle();
|
|
133
|
-
script = bundle === undefined ? null : zeroInstallScriptFor(bundle, reader);
|
|
134
|
-
}
|
|
135
|
-
return script ?? undefined;
|
|
136
|
-
};
|
|
137
|
-
return new BrowserPool(playwrightLauncher({ headless }), {
|
|
138
|
-
maxContexts,
|
|
139
|
-
genSessionId,
|
|
140
|
-
zeroInstallScript,
|
|
141
|
-
});
|
|
142
|
-
}
|
|
143
|
-
/**
|
|
144
|
-
* Route CDP-authoritative network detail onto the driven session's journal.
|
|
145
|
-
*
|
|
146
|
-
* The page and the SDK session share an origin, so a NET_DETAIL is pushed to the matching connected
|
|
147
|
-
* session. Shared by both entry points: `startDaemon` previously omitted it entirely, so on the path
|
|
148
|
-
* users actually take, CDP network detail was collected and then dropped on the floor.
|
|
149
|
-
*/
|
|
150
|
-
function makeNetworkDetailRouter(bridge, driveUrl) {
|
|
151
|
-
const driveOrigin = originOf(driveUrl ?? '');
|
|
152
|
-
return (detail) => {
|
|
153
|
-
// Route by the DOCUMENT that issued the request, not by the request's own origin.
|
|
154
|
-
//
|
|
155
|
-
// Matching the request's origin only works for same-origin calls. An app on one origin calling an
|
|
156
|
-
// API on another — most API calls — produced a detail matching no session, and it was dropped
|
|
157
|
-
// without a trace. The drive-URL fallback papered over it on the launched path and did nothing on
|
|
158
|
-
// the CDP-attach path, where driveUrl is undefined and the fallback compares against ''.
|
|
159
|
-
const pageOrigin = originOf(detail.pageUrl ?? '');
|
|
160
|
-
const requestOrigin = originOf(detail.url);
|
|
161
|
-
for (const session of bridge.sessions.all()) {
|
|
162
|
-
const origin = originOf(session.url);
|
|
163
|
-
// originOf returns `string | undefined`, NEVER '' — so the old `!== ''` guards were dead, and a
|
|
164
|
-
// bare `origin === requestOrigin` matched `undefined === undefined` when BOTH the session URL and
|
|
165
|
-
// the detail URL were unparseable. That routed a NET_DETAIL (with its response headers, incl.
|
|
166
|
-
// set-cookie) onto an unrelated session. Require a DEFINED origin; undefined operands then simply
|
|
167
|
-
// fail to match any of the three candidates.
|
|
168
|
-
const matches = origin !== undefined &&
|
|
169
|
-
(origin === pageOrigin || origin === requestOrigin || origin === driveOrigin);
|
|
170
|
-
if (matches) {
|
|
171
|
-
session.pushEvent({
|
|
172
|
-
t: 0,
|
|
173
|
-
type: EventType.NET_DETAIL,
|
|
174
|
-
sessionId: session.id,
|
|
175
|
-
data: { ...detail },
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
};
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Resolve the drive/real-input provider from options — shared by start and startDaemon so the
|
|
183
|
-
* precedence (driveUrl launch+own → CDP attach → none) and the storageState/injectConnect plumbing
|
|
184
|
-
* live in ONE place. `onNavigateError` is the entrypoint's own cleanup (close the bridge/shared server)
|
|
185
|
-
* so a failed launch never leaks a WS port. A past divergence between the two paths let daemon mode
|
|
186
|
-
* run with a different setup — this removes that risk.
|
|
187
|
-
*/
|
|
188
|
-
async function resolveRealInput(options, onNavigateError, onNetworkDetail) {
|
|
189
|
-
const driveUrl = options.driveUrl;
|
|
190
|
-
if (driveUrl !== undefined && driveUrl.length > 0) {
|
|
191
|
-
const headless = options.headless ?? true;
|
|
192
|
-
// The one place that knows. Everything downstream reads it rather than re-deriving it, and a
|
|
193
|
-
// daemon that launches nothing keeps the default (ATTACHED) rather than guessing.
|
|
194
|
-
setBrowserMode(headless ? BrowserMode.HEADLESS : BrowserMode.HEADED);
|
|
195
|
-
const injectConnect = options.injectConnect;
|
|
196
|
-
const storageState = options.storageState;
|
|
197
|
-
const factory = options.realInputFactory ??
|
|
198
|
-
((opts) => new LaunchedRealInputProvider({
|
|
199
|
-
driveUrl: opts.driveUrl,
|
|
200
|
-
headless: opts.headless,
|
|
201
|
-
...(injectConnect !== undefined ? { injectConnect } : {}),
|
|
202
|
-
...(storageState !== undefined ? { storageState } : {}),
|
|
203
|
-
...(onNetworkDetail !== undefined ? { onNetworkDetail } : {}),
|
|
204
|
-
}));
|
|
205
|
-
const launched = factory({ driveUrl, headless });
|
|
206
|
-
try {
|
|
207
|
-
await launched.navigate();
|
|
208
|
-
}
|
|
209
|
-
catch (error) {
|
|
210
|
-
await onNavigateError(); // no leaked WS port on a failed start
|
|
211
|
-
throw error;
|
|
212
|
-
}
|
|
213
|
-
return { realInput: launched, owned: launched };
|
|
214
|
-
}
|
|
215
|
-
const cdpUrl = options.cdpUrl ?? process.env[ReticleEnv.CDP_URL];
|
|
216
|
-
if (cdpUrl !== undefined && cdpUrl.length > 0) {
|
|
217
|
-
// Same network sink as the launched path. Whether Reticle opened the browser or attached to one
|
|
218
|
-
// someone else opened has no bearing on whether it can read that browser's network.
|
|
219
|
-
const cdp = new CdpRealInputProvider({
|
|
220
|
-
cdpUrl,
|
|
221
|
-
...(onNetworkDetail !== undefined ? { onNetworkDetail } : {}),
|
|
222
|
-
});
|
|
223
|
-
return { realInput: cdp, owned: cdp };
|
|
224
|
-
}
|
|
225
|
-
return {};
|
|
226
|
-
}
|
|
227
102
|
/** Start the Reticle bridge (browser WS endpoint) and, by default, the MCP stdio server. */
|
|
228
|
-
/**
|
|
229
|
-
* The SDK-upgrade sentence for the package.json of the project the page announced, evaluated at
|
|
230
|
-
* each HELLO so a just-edited manifest is what we name. The daemon's cwd only when that project's
|
|
231
|
-
* directory is unknown, and the framework-neutral sensor when that is not an app either (#1135).
|
|
232
|
-
*/
|
|
233
|
-
function sdkFixForProject(projectId) {
|
|
234
|
-
return sdkFixForDirectory(SERVER_VERSION, projectDirectoryFor(projectId) ?? process.cwd());
|
|
235
|
-
}
|
|
236
|
-
/**
|
|
237
|
-
* Resolve a session's artifact root, from everything this machine knows about where projects live.
|
|
238
|
-
*
|
|
239
|
-
* Built once per daemon and closed over by every tool call. The two sources are read lazily and
|
|
240
|
-
* cheaply on each call rather than snapshotted at startup: `init` can run in another terminal while
|
|
241
|
-
* this daemon is up, and a resolution that used a startup snapshot would keep answering with a map
|
|
242
|
-
* from before the project the agent is now driving existed.
|
|
243
|
-
*/
|
|
244
|
-
/**
|
|
245
|
-
* Every `.reticle` root on this machine that sync should consider, from the same two sources the
|
|
246
|
-
* artifact resolver uses.
|
|
247
|
-
*
|
|
248
|
-
* Read on every call rather than snapshotted, for the same reason: `reticle link` can run in
|
|
249
|
-
* another terminal while this daemon is up, and a startup snapshot would keep that repo silent
|
|
250
|
-
* until somebody restarted a process they have no reason to suspect.
|
|
251
|
-
*
|
|
252
|
-
* Returns directories that MIGHT be linked; the caller resolves each and skips the ones that are
|
|
253
|
-
* not. Deciding that here would mean reading every cloud.json on every tick.
|
|
254
|
-
*/
|
|
255
|
-
function knownProjectRoots() {
|
|
256
|
-
const roots = new Set();
|
|
257
|
-
try {
|
|
258
|
-
const path = join(homedir(), ReticleDir.ROOT, PROJECT_REGISTRY_FILE);
|
|
259
|
-
if (existsSync(path)) {
|
|
260
|
-
const registry = parseProjectRegistry(JSON.parse(readFileSync(path, 'utf8')));
|
|
261
|
-
for (const candidate of projectCandidates(registry))
|
|
262
|
-
roots.add(join(candidate.directory, ReticleDir.ROOT));
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
catch {
|
|
266
|
-
// A registry that cannot be read is an empty one — never a reason to stop syncing.
|
|
267
|
-
}
|
|
268
|
-
try {
|
|
269
|
-
for (const config of discoverProjectConfigs(process.cwd()).found)
|
|
270
|
-
roots.add(join(config.directory, ReticleDir.ROOT));
|
|
271
|
-
}
|
|
272
|
-
catch {
|
|
273
|
-
// Same: a diagnostic walk that throws must not take the sync loop with it.
|
|
274
|
-
}
|
|
275
|
-
return [...roots];
|
|
276
|
-
}
|
|
277
|
-
/** This project's platform credential (stored, else the env key), as the env the platform readers take. */
|
|
278
|
-
const platformEnvFor = (root) => platformEnvPort(createNodeFileSystem(), root ?? join(process.cwd(), ReticleDir.ROOT), homedir(), process.env);
|
|
279
103
|
export async function start(options = {}) {
|
|
280
104
|
const port = options.port ?? RETICLE_DEFAULT_PORT;
|
|
105
|
+
const configForRoot = harnessConfigsByRoot(loadHarnessConfig);
|
|
281
106
|
// Open the user's impact record before anything can connect. Not inside the MCP branch: a daemon
|
|
282
107
|
// serving a browser with no agent attached still has a HUD to answer, and a report that reads
|
|
283
108
|
// "nothing recorded yet" over a month of history on disk is the worst version of this feature.
|
|
284
109
|
initImpact({
|
|
110
|
+
sdkVersion: SERVER_VERSION,
|
|
285
111
|
reticleRoot: options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT),
|
|
286
112
|
// The daemon owns both sides of this seam, so it is the layer that may join them: the cache
|
|
287
113
|
// lives in cloud memory, the platform read lives in the harness feature, and neither is allowed
|
|
288
114
|
// to reach for the other.
|
|
289
|
-
|
|
115
|
+
configForRoot,
|
|
116
|
+
coverageForRoot: (root) => () => coveragePercents(root),
|
|
290
117
|
});
|
|
291
118
|
const uninstallHooks = wireHooks(options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT), readProjectId(process.cwd()));
|
|
292
119
|
const security = await resolveBridgeSecurityWithAutoToken(options);
|
|
@@ -302,7 +129,7 @@ export async function start(options = {}) {
|
|
|
302
129
|
bridge.sessions.setDefaultScope({ projectId: activeProjectId });
|
|
303
130
|
}
|
|
304
131
|
const baselines = new BaselineStore();
|
|
305
|
-
const recordings = new RecordingStore();
|
|
132
|
+
const recordings = new RecordingStore(() => currentDrivenBy() !== undefined);
|
|
306
133
|
// drive precedence: driveUrl (launch+own a browser) → CDP (attach) → none.
|
|
307
134
|
let pool;
|
|
308
135
|
let leaseReaper;
|
|
@@ -310,6 +137,7 @@ export async function start(options = {}) {
|
|
|
310
137
|
// page and the SDK session share an origin, so a NET_DETAIL is pushed to the matching connected session.
|
|
311
138
|
const routeNetworkDetail = makeNetworkDetailRouter(bridge, options.driveUrl);
|
|
312
139
|
const { realInput, owned } = await resolveRealInput(options, () => bridge.close(), routeNetworkDetail);
|
|
140
|
+
let chatDrives;
|
|
313
141
|
if (options.mcp !== false) {
|
|
314
142
|
// cwd/Date.now are confined to start — never inside reticle-dir.ts's pure logic (rule 7).
|
|
315
143
|
const fs = createNodeFileSystem();
|
|
@@ -326,7 +154,7 @@ export async function start(options = {}) {
|
|
|
326
154
|
enabled: journalEnabled,
|
|
327
155
|
retain,
|
|
328
156
|
// Bound HERE, where the recorder is already in hand: teardown gets the tape, not the recorder.
|
|
329
|
-
takeAmbientTape: () => recordings.
|
|
157
|
+
takeAmbientTape: (sessionId) => recordings.takeAmbient(sessionId),
|
|
330
158
|
reportStep: reportOnboardingStep,
|
|
331
159
|
flows,
|
|
332
160
|
author: flowAuthor,
|
|
@@ -367,7 +195,7 @@ export async function start(options = {}) {
|
|
|
367
195
|
fs,
|
|
368
196
|
reticleRoot,
|
|
369
197
|
linkedCloud: linkedCloudPort(fs, reticleRoot, homedir(), process.env),
|
|
370
|
-
artifactRootFor: artifactRootResolver(reticleRoot),
|
|
198
|
+
artifactRootFor: artifactRootResolver(reticleRoot, { servingDirectory: servingDirectoryOf }),
|
|
371
199
|
now,
|
|
372
200
|
bridgePort: port,
|
|
373
201
|
browserProbe: probeLaunchableChromium,
|
|
@@ -376,13 +204,13 @@ export async function start(options = {}) {
|
|
|
376
204
|
...(activeProjectId === undefined ? {} : { projectId: activeProjectId }),
|
|
377
205
|
};
|
|
378
206
|
const profile = resolveToolSurface(options.toolProfile);
|
|
379
|
-
const
|
|
380
|
-
//
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
207
|
+
const toolDeps = realInput !== undefined ? { ...deps, realInput } : deps;
|
|
208
|
+
// The platform chat sees this app too: `reticle drive` in a window runs here, not in a daemon.
|
|
209
|
+
chatDrives = startChatDrives(toolDeps, bridge.sessions, fs, {
|
|
210
|
+
sessionCloud: sessionCloudPort(fs, homedir(), process.env, (id) => sessionRoot(toolDeps, id)),
|
|
211
|
+
version: SERVER_VERSION,
|
|
212
|
+
}, log);
|
|
213
|
+
const server = createMcpServer(toolDeps, profile, instructionStateAt(port, bridge.sessions.count()));
|
|
386
214
|
// When the agent (the MCP client) disconnects cleanly, end every active session at once so the
|
|
387
215
|
// HUD doesn't linger. (If the agent instead KILLS this process, the WS dies and the browser
|
|
388
216
|
// self-ends via SESSION_LIFECYCLE.BRIDGE_LOST_MS — see transport.ts.)
|
|
@@ -401,6 +229,7 @@ export async function start(options = {}) {
|
|
|
401
229
|
uninstallHooks();
|
|
402
230
|
await cleanupCaptureDirectories();
|
|
403
231
|
leaseReaper?.stop();
|
|
232
|
+
chatDrives?.stop();
|
|
404
233
|
await pool?.shutdown();
|
|
405
234
|
await owned?.dispose();
|
|
406
235
|
await bridge.close();
|
|
@@ -415,17 +244,21 @@ export async function start(options = {}) {
|
|
|
415
244
|
*/
|
|
416
245
|
export async function startDaemon(options = {}) {
|
|
417
246
|
const port = options.port ?? RETICLE_DEFAULT_PORT;
|
|
247
|
+
let pushHarnessConfig = () => undefined;
|
|
248
|
+
const configForRoot = harnessConfigsByRoot(loadHarnessConfig, (root) => pushHarnessConfig(root));
|
|
418
249
|
// The SAME line as in `start`, because these are two entry points that each wire their own world
|
|
419
250
|
// and the daemon is the one that actually serves people. Wired only in `start`, the impact record
|
|
420
251
|
// was never opened in the process the HUD talks to: tool calls still recorded (the dispatch
|
|
421
252
|
// chokepoint opens it lazily), but a tab that connected before the first tool call was pushed
|
|
422
253
|
// nothing, so the report read "nothing recorded yet" over a file with history in it.
|
|
423
254
|
initImpact({
|
|
255
|
+
sdkVersion: SERVER_VERSION,
|
|
424
256
|
reticleRoot: options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT),
|
|
425
257
|
// The daemon owns both sides of this seam, so it is the layer that may join them: the cache
|
|
426
258
|
// lives in cloud memory, the platform read lives in the harness feature, and neither is allowed
|
|
427
259
|
// to reach for the other.
|
|
428
|
-
|
|
260
|
+
configForRoot,
|
|
261
|
+
coverageForRoot: (root) => () => coveragePercents(root),
|
|
429
262
|
});
|
|
430
263
|
const security = await resolveBridgeSecurityWithAutoToken(options);
|
|
431
264
|
const shared = createSharedServer(security.token === undefined ? {} : { token: security.token });
|
|
@@ -435,6 +268,14 @@ export async function startDaemon(options = {}) {
|
|
|
435
268
|
sdkFix: sdkFixForProject,
|
|
436
269
|
...security,
|
|
437
270
|
});
|
|
271
|
+
const repaint = (only, ifChanged = false) => {
|
|
272
|
+
for (const session of bridge.sessions.all()) {
|
|
273
|
+
const root = session.artifactRoot ?? options.reticleRoot ?? join(process.cwd(), ReticleDir.ROOT);
|
|
274
|
+
if ((only ?? root) === root)
|
|
275
|
+
pushIfMoved(session, () => impactSnapshot(root), ifChanged);
|
|
276
|
+
}
|
|
277
|
+
};
|
|
278
|
+
pushHarnessConfig = repaint;
|
|
438
279
|
// The daemon owns listen (below), so the real bind error is reported there; absorb bridge.ready's
|
|
439
280
|
// mirror rejection so a port collision can't surface as an unhandled promise rejection.
|
|
440
281
|
void bridge.ready.catch(() => undefined);
|
|
@@ -450,7 +291,7 @@ export async function startDaemon(options = {}) {
|
|
|
450
291
|
// `init` holds the daemon it is waiting on, so the idle rule cannot shut it down mid-wait.
|
|
451
292
|
if (held)
|
|
452
293
|
noteSetupHold(Date.now());
|
|
453
|
-
return statusPayload(bridge.sessions.count(), bridge.sessions.list(), bridge.sessions.noSessionHint(), verifyHttp?.port, bridge.sessions.noSessionLead());
|
|
294
|
+
return statusPayload(bridge.sessions.count(), bridge.sessions.list(), bridge.sessions.noSessionHint(), verifyHttp?.port, bridge.sessions.noSessionLead(), bridge.sessions.all());
|
|
454
295
|
});
|
|
455
296
|
// Agent-independent presence: the daemon outlives any single agent, so when the LAST agent's MCP
|
|
456
297
|
// connection drops (it stopped, or is waiting on the human), end every session and push a clear
|
|
@@ -473,10 +314,11 @@ export async function startDaemon(options = {}) {
|
|
|
473
314
|
const retain = readRetainPolicy(findProjectConfig(process.cwd()));
|
|
474
315
|
// See the sibling path: `retain.sessions: 0` stops the capture too, not only the sweep.
|
|
475
316
|
const journalEnabled = readJournalEnabled(process.cwd(), process.env[ReticleEnv.JOURNAL]) && 0 < retain.sessions;
|
|
476
|
-
|
|
317
|
+
// A saved flow wakes sync like a landed run: see FlowStore's `onWrote`.
|
|
318
|
+
const flows = new FlowStore(fs, reticleRoot, { now }, { onWrote: () => syncNudge.run?.() });
|
|
477
319
|
// Built here rather than inside `deps` below, so teardown can save what a drive recorded. Both
|
|
478
320
|
// paths pass the same pair — `daemon-parity.test.ts` is what keeps them from drifting apart.
|
|
479
|
-
const recordings = new RecordingStore();
|
|
321
|
+
const recordings = new RecordingStore(() => currentDrivenBy() !== undefined);
|
|
480
322
|
/*
|
|
481
323
|
* Bound AFTER the sync daemon exists, read only when a run is actually written.
|
|
482
324
|
*
|
|
@@ -485,12 +327,12 @@ export async function startDaemon(options = {}) {
|
|
|
485
327
|
* setup ahead of session capture for the sake of one callback.
|
|
486
328
|
*/
|
|
487
329
|
const syncNudge = {};
|
|
488
|
-
attachJournal(bridge, {
|
|
330
|
+
const endLiveSessions = attachJournal(bridge, {
|
|
489
331
|
fs,
|
|
490
332
|
reticleRoot,
|
|
491
333
|
enabled: journalEnabled,
|
|
492
334
|
retain,
|
|
493
|
-
takeAmbientTape: () => recordings.
|
|
335
|
+
takeAmbientTape: (sessionId) => recordings.takeAmbient(sessionId),
|
|
494
336
|
reportStep: reportOnboardingStep,
|
|
495
337
|
flows,
|
|
496
338
|
author: flowAuthor,
|
|
@@ -526,14 +368,15 @@ export async function startDaemon(options = {}) {
|
|
|
526
368
|
otherRoots: knownProjectRoots,
|
|
527
369
|
});
|
|
528
370
|
syncNudge.run = () => cloudSync.nudge();
|
|
529
|
-
// `syncNow`, not `nudge
|
|
530
|
-
// wrong for a button somebody is watching. Never awaited.
|
|
371
|
+
// `syncNow`, not `nudge` (a cycle soon): somebody is watching the button. Never awaited.
|
|
531
372
|
bridge.attachSyncRequest(() => void cloudSync.syncNow());
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
//
|
|
535
|
-
|
|
536
|
-
|
|
373
|
+
if (options.hudSignIn !== undefined)
|
|
374
|
+
bridge.attachSigninRequest(options.hudSignIn(repaint, projectLinkOnly(options.hudLink)));
|
|
375
|
+
// Logout and link run in another process: repaint when their files change, the rest on a timer.
|
|
376
|
+
const accountFiles = watchAccountFiles(repaint, undefined, () => repaint(undefined, true));
|
|
377
|
+
accountFiles.watch(join(homedir(), ReticleDir.ROOT, SESSION_FILE));
|
|
378
|
+
bridge.attachSessionReady((s) => accountFiles.watch(join(s.artifactRoot ?? reticleRoot, ReticleDir.CLOUD_LINK_FILE)));
|
|
379
|
+
attachHudHarness(bridge, { deps: () => deps, root: reticleRoot, repaint: () => repaint() }, (r, on) => applyHarnessSwitch(configForRoot, r, on, platformEnvFor(r)), options.hudLink);
|
|
537
380
|
// Scope auto-selection to the active project (from .reticle.json) so a stray tab from another app is
|
|
538
381
|
// never picked when the agent omits a sessionId. Explicit per-call scope/sessionId still overrides.
|
|
539
382
|
// Scope + the no-session diagnosis: "no browser session connected" is the error that ends most
|
|
@@ -542,6 +385,7 @@ export async function startDaemon(options = {}) {
|
|
|
542
385
|
// server for a wired project (see no-session-watch.ts), and it opens it through the pool — the same
|
|
543
386
|
// path reticle_lease takes, in this process, binding nothing.
|
|
544
387
|
wireSessionScope(bridge.sessions, readProjectId(process.cwd()), port, (sessionId) => pool.wasReapedLease(sessionId), (url) => pool.acquire(url));
|
|
388
|
+
const leaseUrl = (url) => runTool(LEASE_ACQUIRE_TOOL, effectiveDeps, { url });
|
|
545
389
|
const deps = {
|
|
546
390
|
sessions: bridge.sessions,
|
|
547
391
|
pool,
|
|
@@ -562,12 +406,14 @@ export async function startDaemon(options = {}) {
|
|
|
562
406
|
// daemon — the common case — so flows were listed, loaded and healed against wherever the
|
|
563
407
|
// daemon happened to be launched. Wired in only one of the two places, a resolver is a resolver
|
|
564
408
|
// that does not run.
|
|
565
|
-
artifactRootFor: artifactRootResolver(reticleRoot),
|
|
409
|
+
artifactRootFor: artifactRootResolver(reticleRoot, { servingDirectory: servingDirectoryOf }),
|
|
566
410
|
now,
|
|
567
411
|
bridgePort: port,
|
|
568
412
|
browserProbe: probeLaunchableChromium,
|
|
413
|
+
...agentWiring(port, bridge.sessions, leaseUrl),
|
|
569
414
|
// A finished verification should not sit behind a one-minute timer — see ToolDeps.onRunPersisted.
|
|
570
415
|
onRunPersisted: () => cloudSync.nudge(),
|
|
416
|
+
syncNow: () => cloudSync.syncNow(),
|
|
571
417
|
};
|
|
572
418
|
const profile = resolveToolSurface(options.toolProfile);
|
|
573
419
|
const effectiveDeps = realInput !== undefined ? { ...deps, realInput } : deps;
|
|
@@ -575,15 +421,14 @@ export async function startDaemon(options = {}) {
|
|
|
575
421
|
// being told to wire itself on the next agent that connects.
|
|
576
422
|
shared.attachMcp((peerSkew) => createMcpServer(peerSkew === undefined
|
|
577
423
|
? effectiveDeps
|
|
578
|
-
: { ...effectiveDeps, peerSkew: connectionSkew(peerSkew) }, profile,
|
|
579
|
-
//
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
shared.attachDrive((url) => runTool(LEASE_ACQUIRE_TOOL, effectiveDeps, { url }));
|
|
424
|
+
: { ...effectiveDeps, peerSkew: connectionSkew(peerSkew) }, profile, instructionStateAt(port, bridge.sessions.count())));
|
|
425
|
+
shared.attachDrive(leaseUrl); // `reticle drive <url>` — see cli/drive/drive-attach.ts.
|
|
426
|
+
// The platform chat's apps and drives, run here. See chat-drives.ts.
|
|
427
|
+
const chatDrives = startChatDrives(effectiveDeps, bridge.sessions, fs, {
|
|
428
|
+
sessionCloud: sessionCloudPort(fs, homedir(), process.env, (id) => sessionRoot(effectiveDeps, id)),
|
|
429
|
+
version: SERVER_VERSION,
|
|
430
|
+
unsynced: () => cloudSync.unsyncedRoots(),
|
|
431
|
+
}, log);
|
|
587
432
|
// Optional OEM/CI verify endpoint: a host platform POSTs to /verify and gets an ReticleVerificationRun,
|
|
588
433
|
// driving the same flow-replay machinery the agent uses — no MCP stdio, no human. Each verdict is
|
|
589
434
|
// persisted via RunStore. Localhost-bound + token-guarded. Off unless `reticle serve --http`.
|
|
@@ -601,16 +446,9 @@ export async function startDaemon(options = {}) {
|
|
|
601
446
|
// verdict into the same activity log they watch the agent in. The page animates via the normal
|
|
602
447
|
// replay path, so they see it re-drive and the ✓/⚠/✗ land.
|
|
603
448
|
bridge.attachReplay((sessionId, flowName) => {
|
|
604
|
-
|
|
605
|
-
if (session === undefined)
|
|
449
|
+
if (bridge.sessions.get(sessionId) === undefined)
|
|
606
450
|
return;
|
|
607
|
-
|
|
608
|
-
replayAndLearn(effectiveDeps, { flowName, sessionId })
|
|
609
|
-
.then((result) => session.pushNarration(replayVerdictLine(result)))
|
|
610
|
-
.catch((error) => {
|
|
611
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
612
|
-
session.pushNarration(`✗ Replay "${flowName}" failed — ${message}`);
|
|
613
|
-
});
|
|
451
|
+
void replayFromHud(effectiveDeps, (id) => bridge.sessions.get(id), sessionId, flowName);
|
|
614
452
|
});
|
|
615
453
|
// On connect, hand the panel the replayable flows so it can render the ▶ list. Scoped to the
|
|
616
454
|
// connecting session's project (a shared daemon serves many apps; each panel shows only its own
|
|
@@ -680,6 +518,9 @@ export async function startDaemon(options = {}) {
|
|
|
680
518
|
if (vh !== undefined)
|
|
681
519
|
await new Promise((resolve) => vh.server.close(() => resolve()));
|
|
682
520
|
leaseReaper.stop();
|
|
521
|
+
chatDrives.stop();
|
|
522
|
+
accountFiles.close();
|
|
523
|
+
await endLiveSessions(); // first: an open tab's teardown writes the flow this flush sends
|
|
683
524
|
await cloudSync.flush(); // not stop(): the last run written is the one nobody has yet
|
|
684
525
|
await loopbackAlias.close?.();
|
|
685
526
|
await pool.shutdown();
|
|
@@ -689,12 +530,8 @@ export async function startDaemon(options = {}) {
|
|
|
689
530
|
},
|
|
690
531
|
};
|
|
691
532
|
}
|
|
692
|
-
// The OpenVerification binding, exported so a conformance run can be driven from outside this
|
|
693
|
-
//
|
|
694
|
-
// It was written and then not reachable: `conformanceClient` takes a `WebRealm`, a `WebRealm`
|
|
695
|
-
// takes a live `Session`, and a `Session` exists only inside a running daemon. A runner that
|
|
696
|
-
// cannot import it cannot score anything, which would have made the whole conformance chain
|
|
697
|
-
// complete and unusable.
|
|
533
|
+
// The OpenVerification binding, exported so a conformance run can be driven from outside this
|
|
534
|
+
// package: a `WebRealm` needs a live `Session`, which exists only inside a running daemon.
|
|
698
535
|
export { WebRealm } from './portal/realm/web-realm.js';
|
|
699
536
|
export { conformanceClient } from './portal/realm/conformance-client.js';
|
|
700
537
|
/**
|
|
@@ -45,9 +45,9 @@ declare const CapsuleSchema: z.ZodObject<{
|
|
|
45
45
|
version: 1;
|
|
46
46
|
id: string;
|
|
47
47
|
origin: string;
|
|
48
|
+
createdAt: number;
|
|
48
49
|
expected: string;
|
|
49
50
|
steps: FlowStep[];
|
|
50
|
-
createdAt: number;
|
|
51
51
|
observed: string;
|
|
52
52
|
flow?: string | undefined;
|
|
53
53
|
seen?: number | undefined;
|
|
@@ -56,9 +56,9 @@ declare const CapsuleSchema: z.ZodObject<{
|
|
|
56
56
|
version: 1;
|
|
57
57
|
id: string;
|
|
58
58
|
origin: string;
|
|
59
|
+
createdAt: number;
|
|
59
60
|
expected: string;
|
|
60
61
|
steps: FlowStep[];
|
|
61
|
-
createdAt: number;
|
|
62
62
|
observed: string;
|
|
63
63
|
flow?: string | undefined;
|
|
64
64
|
seen?: number | undefined;
|
|
@@ -40,10 +40,24 @@ export interface CausalSummary {
|
|
|
40
40
|
headline?: string;
|
|
41
41
|
};
|
|
42
42
|
consoleErrors: number;
|
|
43
|
+
/** The first console error's text, capped — so a count is never the only thing an agent can read. */
|
|
44
|
+
firstConsoleError?: string;
|
|
45
|
+
/**
|
|
46
|
+
* The app's requests in this window as `METHOD /path STATUS` (`pending` when unanswered), capped.
|
|
47
|
+
* Origin and query string are left out: the line is for recognising the call, and the full record is
|
|
48
|
+
* one `reticle_observe { since }` away. Present only when there were any.
|
|
49
|
+
*/
|
|
50
|
+
requests?: string[];
|
|
43
51
|
statePathsChanged: string[];
|
|
44
52
|
storageKeysChanged: string[];
|
|
45
53
|
/** Before→after for each changed store path — the diffs, not just the names. Values capped. */
|
|
46
54
|
stateDiffs: StateDiff[];
|
|
55
|
+
/**
|
|
56
|
+
* How many store diffs were left out of `stateDiffs` because they moved only a cache's own
|
|
57
|
+
* bookkeeping (fetchStatus, isStale, dataUpdatedAt — see engine's state-bookkeeping rule). Present
|
|
58
|
+
* only when there were any: a trim is never silent. Predicates still see every transition.
|
|
59
|
+
*/
|
|
60
|
+
ignoredBookkeeping?: number;
|
|
47
61
|
/**
|
|
48
62
|
* How long the store took to stop moving: last state change − first, in ms. Present only when more
|
|
49
63
|
* than one path changed, because with a single change there is no interval to describe.
|
|
@@ -126,6 +140,6 @@ interface SummaryContext {
|
|
|
126
140
|
*/
|
|
127
141
|
export declare const MAX_SUMMARY_ENTRIES = 20;
|
|
128
142
|
/** The lists that are capped, named so `elided` can say which one lost entries. */
|
|
129
|
-
type CappedList = 'statePathsChanged' | 'storageKeysChanged' | 'stateDiffs' | 'storageDiffs' | 'signals' | 'fieldsChanged';
|
|
143
|
+
type CappedList = 'requests' | 'statePathsChanged' | 'storageKeysChanged' | 'stateDiffs' | 'storageDiffs' | 'signals' | 'fieldsChanged';
|
|
130
144
|
export declare function causalSummary(events: readonly ReticleEvent[], context?: SummaryContext): CausalSummary;
|
|
131
145
|
export {};
|